[gle-graphics] 01/02: Imported Upstream version 4.2.5
Christian T. Steigies
cts at moszumanska.debian.org
Sun Mar 20 16:03:42 UTC 2016
This is an automated email from the git hooks/post-receive script.
cts pushed a commit to branch master
in repository gle-graphics.
commit d7a5b307fc5bc00731f30b0226a13589be87fad0
Author: Christian T. Steigies <cts at debian.org>
Date: Sun Mar 20 17:03:14 2016 +0100
Imported Upstream version 4.2.5
---
ChangeLog.txt | 1174 ++++
LICENSE.txt | 1831 +++++
Makefile.gcc | 163 +
Makefile.in | 536 ++
Makefile.os2 | 118 +
Makefile.vc | 132 +
README.txt | 261 +
config.aconf | 55 +
config.gcc | 113 +
config.i | 72 +
config.nocygwin | 67 +
config.os2 | 96 +
config.vc | 101 +
configure | 7246 ++++++++++++++++++++
configure.ac | 1025 +++
contrib/editors/highlighting/gle-emacs.el | 194 +
contrib/editors/highlighting/gle.nedit | 64 +
contrib/editors/highlighting/gle.stx | 353 +
contrib/editors/highlighting/vim/ftplugin/gle.vim | 6 +
contrib/editors/highlighting/vim/indent/gle.vim | 35 +
contrib/editors/highlighting/vim/syntax/gle.vim | 46 +
contrib/packagers/nsis/AddToPath.nsi | 446 ++
contrib/packagers/nsis/banner_image.bmp | Bin 0 -> 25818 bytes
contrib/packagers/nsis/gle.nsi | 247 +
contrib/packagers/nsis/welcome_image.bmp | Bin 0 -> 177714 bytes
contrib/packagers/nsis/www.ico | Bin 0 -> 3774 bytes
gle-refman/Makefile.gcc | 86 +
gle-refman/Makefile.os2 | 71 +
gle-refman/advanced/advanced.tex | 482 ++
gle-refman/advanced/fig/Makefile.gcc | 56 +
gle-refman/advanced/fig/Makefile.os2 | 47 +
gle-refman/advanced/fig/gc_clip.gle | 51 +
gle-refman/advanced/fig/gc_join.gle | 70 +
gle-refman/advanced/fig/house.gle | 109 +
gle-refman/advanced/fig/join.gle | 89 +
gle-refman/advanced/fig/texgraph.gle | 70 +
gle-refman/advanced/fig/texgraph.tex | 61 +
gle-refman/appendix/appendix.tex | 189 +
gle-refman/appendix/fig/Makefile.gcc | 58 +
gle-refman/appendix/fig/Makefile.os2 | 48 +
gle-refman/appendix/fig/ap_fonts.gle | 158 +
gle-refman/appendix/fig/ap_marker.gle | 95 +
gle-refman/appendix/fig/clip.gle | 79 +
gle-refman/appendix/fig/color_list_svg.gle | 219 +
gle-refman/appendix/fig/color_sample.gle | 218 +
gle-refman/appendix/fig/fonttes2.gle | 84 +
gle-refman/appendix/fig/fonttest.gle | 83 +
gle-refman/appendix/fig/join.gle | 104 +
gle-refman/appendix/fig/loop.gle | 78 +
gle-refman/appendix/fig/nzmap.gle | 485 ++
gle-refman/appendix/fig/showfont.gle | 103 +
gle-refman/appendix/fig/single.dat | 43 +
gle-refman/appendix/fig/single.gle | 46 +
gle-refman/appendix/fig/stack1.gle | 61 +
gle-refman/appendix/fig/stack2.gle | 102 +
gle-refman/appendix/fig/stack4b.gle | 92 +
gle-refman/appendix/fig/symbols.csv | 190 +
gle-refman/appendix/fig/symbols.gle | 32 +
gle-refman/appendix/fig/t.gle | 115 +
gle-refman/appendix/fig/test.dat | 44 +
gle-refman/appendix/fig/test4.dat | 44 +
gle-refman/appendix/fig/title.gle | 88 +
gle-refman/appendix/fig/title32.gle | 116 +
gle-refman/appendix/fig/tut_slide.gle | 51 +
gle-refman/appendix/fig/wall.gle | 238 +
gle-refman/appendix/fig/xend.gle | 45 +
gle-refman/appendix/fig/ziptext.gle | 49 +
gle-refman/appendix/sm_clip.tex | 92 +
gle-refman/appendix/sm_fonttables.tex | 188 +
gle-refman/appendix/sm_join.tex | 117 +
gle-refman/appendix/sm_loop.tex | 113 +
gle-refman/appendix/sm_single.tex | 71 +
gle-refman/appendix/sm_stack1.tex | 78 +
gle-refman/appendix/sm_stack2.tex | 135 +
gle-refman/appendix/sm_stack4b.tex | 107 +
gle-refman/appendix/sym.tex | 86 +
gle-refman/cmd.sty | 41 +
gle-refman/fonttest/Makefile.gcc | 75 +
gle-refman/fonttest/font-table.gle | 109 +
gle-refman/fonttest/fonts.csv | 112 +
gle-refman/fonttest/fonttab.tex | 158 +
gle-refman/fonttest/ncleanfonts.pl | 47 +
gle-refman/fonttest/ndofonts.pl | 60 +
gle-refman/gle-manual.tex | 92 +
gle-refman/graph/fig/Makefile.gcc | 64 +
gle-refman/graph/fig/Makefile.os2 | 49 +
gle-refman/graph/fig/age.csv | 42 +
gle-refman/graph/fig/age.gle | 56 +
gle-refman/graph/fig/cos2t.gle | 57 +
gle-refman/graph/fig/discontinuity.gle | 133 +
gle-refman/graph/fig/fitlin.dat | 46 +
gle-refman/graph/fig/gc_axes.gle | 55 +
gle-refman/graph/fig/gc_axisall.gle | 60 +
gle-refman/graph/fig/gc_bargraph1.gle | 55 +
gle-refman/graph/fig/gc_bargraph2.gle | 54 +
gle-refman/graph/fig/gc_bargraph_3d.gle | 54 +
gle-refman/graph/fig/gc_bean.dat | 42 +
gle-refman/graph/fig/gc_err.gle | 53 +
gle-refman/graph/fig/gc_fill.dat | 42 +
gle-refman/graph/fig/gc_fillgraph.gle | 56 +
gle-refman/graph/fig/gc_fit.gle | 66 +
gle-refman/graph/fig/gc_fitfct.csv | 9 +
gle-refman/graph/fig/gc_fitfct.gle | 35 +
gle-refman/graph/fig/gc_graphscale.gle | 92 +
gle-refman/graph/fig/gc_horizbar.csv | 44 +
gle-refman/graph/fig/gc_horizbar.gle | 59 +
gle-refman/graph/fig/gc_let.gle | 59 +
gle-refman/graph/fig/gc_loglabels.gle | 95 +
gle-refman/graph/fig/gc_logsubticks.gle | 156 +
gle-refman/graph/fig/gc_mathmode.gle | 69 +
gle-refman/graph/fig/gc_names.gle | 53 +
gle-refman/graph/fig/gc_nomiss.gle | 55 +
gle-refman/graph/fig/gridmode.gle | 150 +
gle-refman/graph/fig/linemode.gle | 68 +
gle-refman/graph/fig/noisysine.gle | 89 +
gle-refman/graph/fig/normal.csv | 537 ++
gle-refman/graph/fig/normal.gle | 54 +
gle-refman/graph/fig/semitrans.gle | 69 +
gle-refman/graph/fig/shadow.gle | 67 +
gle-refman/graph/fig/sqroot.gle | 61 +
gle-refman/graph/fig/test.dat | 44 +
gle-refman/graph/fig/y2axis-scale.gle | 61 +
gle-refman/graph/graph.tex | 1531 +++++
gle-refman/key/fig/Makefile.gcc | 53 +
gle-refman/key/fig/Makefile.os2 | 47 +
gle-refman/key/fig/grkey.gle | 55 +
gle-refman/key/fig/k_key.gle | 54 +
gle-refman/key/fig/keypos.gle | 80 +
gle-refman/key/fig/multicolkey.gle | 53 +
gle-refman/key/key.tex | 280 +
gle-refman/obsolete/fonts.tex | 135 +
gle-refman/obsolete/gle32.tex | 326 +
gle-refman/obsolete/obsolete.tex | 553 ++
gle-refman/obsolete/sm_gle32_prog.tex | 117 +
gle-refman/obsolete/sm_gle32_tut.tex | 110 +
gle-refman/obsolete/symbols.tex | 187 +
gle-refman/primitives/cmds.tex | 1178 ++++
gle-refman/primitives/fig/Makefile.gcc | 60 +
gle-refman/primitives/fig/Makefile.os2 | 50 +
gle-refman/primitives/fig/curve.gle | 177 +
gle-refman/primitives/fig/curve_length.gle | 63 +
gle-refman/primitives/fig/fullpage.gle | 170 +
gle-refman/primitives/fig/gc_arc.gle | 48 +
gle-refman/primitives/fig/gc_arcto.gle | 49 +
gle-refman/primitives/fig/gc_arrstyle.gle | 82 +
gle-refman/primitives/fig/gc_beginbox.gle | 50 +
gle-refman/primitives/fig/gc_bezier.gle | 57 +
gle-refman/primitives/fig/gc_cap.gle | 59 +
gle-refman/primitives/fig/gc_color.gle | 53 +
gle-refman/primitives/fig/gc_curve.gle | 62 +
gle-refman/primitives/fig/gc_fontlwidth.gle | 52 +
gle-refman/primitives/fig/gc_for.gle | 48 +
gle-refman/primitives/fig/gc_justify.gle | 82 +
gle-refman/primitives/fig/gc_ljoin.gle | 61 +
gle-refman/primitives/fig/gc_lstyle.gle | 67 +
gle-refman/primitives/fig/gc_marker.gle | 103 +
gle-refman/primitives/fig/gc_nonzero.gle | 133 +
gle-refman/primitives/fig/gc_rot1.gle | 49 +
gle-refman/primitives/fig/gc_rot2.gle | 51 +
gle-refman/primitives/fig/gc_table.gle | 54 +
gle-refman/primitives/fig/gc_text.gle | 59 +
gle-refman/primitives/fig/gc_write.gle | 50 +
gle-refman/primitives/fig/gc_xend.gle | 50 +
gle-refman/primitives/fig/grids.gle | 73 +
gle-refman/primitives/fig/setcolor.gle | 67 +
gle-refman/prog/fig/Makefile.gcc | 56 +
gle-refman/prog/fig/axisformat.gle | 73 +
gle-refman/prog/prog.tex | 608 ++
gle-refman/qgle/qgle.tex | 67 +
gle-refman/qgle/screenshot/qgle-windows1.png | Bin 0 -> 154227 bytes
gle-refman/script/manual.gle | 54 +
gle-refman/title/Makefile.gcc | 53 +
gle-refman/title/Makefile.os2 | 47 +
gle-refman/title/glelogo.gle | 104 +
gle-refman/title/sm_special.tex | 137 +
gle-refman/title/title.tex | 127 +
gle-refman/tutorial/fig/Makefile.gcc | 53 +
gle-refman/tutorial/fig/Makefile.os2 | 47 +
gle-refman/tutorial/fig/tut.dat | 42 +
gle-refman/tutorial/fig/tut3.dat | 42 +
gle-refman/tutorial/fig/tut_graph.gle | 53 +
gle-refman/tutorial/fig/tut_graph2.gle | 53 +
gle-refman/tutorial/fig/tut_graph3.gle | 57 +
gle-refman/tutorial/fig/tut_simple.gle | 43 +
gle-refman/tutorial/fig/year-2000.csv | 43 +
gle-refman/tutorial/fig/year-2001.csv | 43 +
gle-refman/tutorial/tutorial.tex | 351 +
gle-refman/utilities/contour.tex | 160 +
gle-refman/utilities/fig/Makefile.gcc | 58 +
gle-refman/utilities/fig/Makefile.os2 | 48 +
gle-refman/utilities/fig/fitls.dat | 46 +
gle-refman/utilities/fig/fitls.gle | 47 +
gle-refman/utilities/fig/fitz.dat | 45 +
gle-refman/utilities/fig/fitz1.gle | 63 +
gle-refman/utilities/fig/fitz1/fitz1.big | 797 +++
gle-refman/utilities/fig/fitz1/fitz1.dat | 45 +
gle-refman/utilities/fig/fitz1/fitz1.sur | 50 +
gle-refman/utilities/fig/fitz1/fitz1.z | 53 +
gle-refman/utilities/fig/gaussian.gle | 62 +
gle-refman/utilities/fig/jack.gle | 43 +
gle-refman/utilities/fig/jack/jack.big | 833 +++
gle-refman/utilities/fig/jack/jack.let | 41 +
gle-refman/utilities/fig/jack/jack.sur | 49 +
gle-refman/utilities/fig/jack/jack.z | 59 +
gle-refman/utilities/fig/saddle-contour.gle | 70 +
gle-refman/utilities/fig/saddle.gle | 62 +
gle-refman/utilities/fig/saddle/saddle.big | 2069 ++++++
gle-refman/utilities/fig/saddle/saddle.let | 41 +
gle-refman/utilities/fig/saddle/saddle.sur | 47 +
gle-refman/utilities/fig/saddle/saddle.z | 59 +
gle-refman/utilities/fig/surf/surf1.big | 317 +
gle-refman/utilities/fig/surf/surf1.sur | 44 +
gle-refman/utilities/fig/surf/surf1.z | 42 +
gle-refman/utilities/fig/surf/surf2.big | 439 ++
gle-refman/utilities/fig/surf/surf2.sur | 50 +
gle-refman/utilities/fig/surf/surf3.big | 333 +
gle-refman/utilities/fig/surf/surf3.dat | 39 +
gle-refman/utilities/fig/surf/surf3.sur | 51 +
gle-refman/utilities/fig/surf/surf4.big | 281 +
gle-refman/utilities/fig/surf/surf4.sur | 45 +
gle-refman/utilities/fig/surf/surf5.big | 2307 +++++++
gle-refman/utilities/fig/surf/surf5.sur | 46 +
gle-refman/utilities/fig/surf/surf5b.big | 2625 +++++++
gle-refman/utilities/fig/surf/surf5b.sur | 46 +
gle-refman/utilities/fig/surf1.gle | 55 +
gle-refman/utilities/fig/surf2.gle | 57 +
gle-refman/utilities/fig/surf3.gle | 64 +
gle-refman/utilities/fig/surf4.gle | 68 +
gle-refman/utilities/fig/surf5.gle | 56 +
gle-refman/utilities/fig/surf5b.gle | 40 +
gle-refman/utilities/fig/volcano.gle | 57 +
gle-refman/utilities/fig/volcano.z | 125 +
gle-refman/utilities/fig/xyz.gle | 62 +
gle-refman/utilities/fig/xyz/xyz.big | 413 ++
gle-refman/utilities/fig/xyz/xyz.dat | 102 +
gle-refman/utilities/fig/xyz/xyz.key | 133 +
gle-refman/utilities/fig/xyz/xyz.lab | 99 +
gle-refman/utilities/fig/xyz/xyz.sur | 48 +
gle-refman/utilities/fig/xyz/xyz.z | 41 +
gle-refman/utilities/fitls.tex | 100 +
gle-refman/utilities/fitz.tex | 82 +
gle-refman/utilities/letz.tex | 53 +
gle-refman/utilities/manip.tex | 470 ++
gle-refman/utilities/surface.tex | 383 ++
platform/autoconf/config.guess | 1502 ++++
platform/autoconf/config.sub | 1731 +++++
platform/autoconf/gle-graphics.pc.in | 9 +
platform/autoconf/install-sh | 519 ++
platform/autopackage/gle.desktop | 10 +
platform/autopackage/gle.gle | 88 +
platform/autopackage/gle.png | Bin 0 -> 1827 bytes
platform/autopackage/gle.xml | 7 +
platform/autopackage/gle4.apspec.in | 88 +
platform/autopackage/qt-replace.pl | 64 +
platform/mac/build-path.sh | 25 +
platform/mac/conf-static.src | 9 +
platform/script/checkdos | 41 +
platform/script/checklicense.pl | 181 +
platform/script/collectsrcfiles.pl | 159 +
platform/script/correctfilemodes.pl | 133 +
platform/script/dosperc | 61 +
platform/script/install_qgle_mac | 56 +
platform/script/killspace | 42 +
platform/script/killtrailspace.pl | 65 +
platform/script/licenses.csv | 58 +
platform/script/makesnapshot.pl | 80 +
platform/script/srcfiles.csv | 60 +
src/TeX/Makefile.gcc | 53 +
src/TeX/Makefile.in | 58 +
src/TeX/Makefile.os2 | 50 +
src/TeX/Makefile.vc | 49 +
src/TeX/init.tex | 692 ++
src/TeX/makeinittex.cmd | 46 +
src/config.h.in | 87 +
src/config.h.os2 | 51 +
src/config_noauto.h | 48 +
src/doc/gle.1.in | 129 +
src/fbuild/Makefile.gcc | 57 +
src/fbuild/Makefile.in | 75 +
src/fbuild/Makefile.os2 | 58 +
src/fbuild/Makefile.vc | 56 +
src/fbuild/basicconf.h | 99 +
src/fbuild/fbuild.cpp | 250 +
src/fbuild/files.txt | 55 +
src/fbuild/token.cpp | 242 +
src/fbuild/token.h | 71 +
src/fonts/Adobe-Core35_AFMs-314/Courier-Bold.afm | 340 +
.../Adobe-Core35_AFMs-314/Courier-BoldOblique.afm | 340 +
.../Adobe-Core35_AFMs-314/Courier-Oblique.afm | 340 +
src/fonts/Adobe-Core35_AFMs-314/Courier.afm | 340 +
src/fonts/Adobe-Core35_AFMs-314/Helvetica-Bold.afm | 2825 ++++++++
.../Helvetica-BoldOblique.afm | 2825 ++++++++
.../Adobe-Core35_AFMs-314/Helvetica-Narrow.afm | 3049 ++++++++
.../Adobe-Core35_AFMs-314/Helvetica-NarrowBold.afm | 2825 ++++++++
.../Helvetica-NarrowBoldOblique.afm | 2825 ++++++++
.../Helvetica-NarrowOblique.afm | 3049 ++++++++
.../Adobe-Core35_AFMs-314/Helvetica-Oblique.afm | 3049 ++++++++
src/fonts/Adobe-Core35_AFMs-314/Helvetica.afm | 3049 ++++++++
.../Adobe-Core35_AFMs-314/ITCAvantGarde-Book.afm | 1266 ++++
.../ITCAvantGarde-BookOblique.afm | 1266 ++++
.../Adobe-Core35_AFMs-314/ITCAvantGarde-Demi.afm | 1277 ++++
.../ITCAvantGarde-DemiOblique.afm | 1277 ++++
.../Adobe-Core35_AFMs-314/ITCBookman-Demi.afm | 1256 ++++
.../ITCBookman-DemiItalic.afm | 1275 ++++
.../Adobe-Core35_AFMs-314/ITCBookman-Light.afm | 1226 ++++
.../ITCBookman-LightItalic.afm | 1172 ++++
.../ITCZapfChancery-MediumItalic.afm | 1551 +++++
src/fonts/Adobe-Core35_AFMs-314/MustRead.html | 28 +
.../NewCenturySchlbk-Bold.afm | 1549 +++++
.../NewCenturySchlbk-BoldItalic.afm | 2997 ++++++++
.../NewCenturySchlbk-Italic.afm | 2040 ++++++
.../NewCenturySchlbk-Roman.afm | 1824 +++++
src/fonts/Adobe-Core35_AFMs-314/Palatino-Bold.afm | 1172 ++++
.../Adobe-Core35_AFMs-314/Palatino-BoldItalic.afm | 1316 ++++
.../Adobe-Core35_AFMs-314/Palatino-Italic.afm | 1306 ++++
src/fonts/Adobe-Core35_AFMs-314/Palatino-Roman.afm | 1375 ++++
src/fonts/Adobe-Core35_AFMs-314/Symbol.afm | 212 +
src/fonts/Adobe-Core35_AFMs-314/Times-Bold.afm | 2586 +++++++
.../Adobe-Core35_AFMs-314/Times-BoldItalic.afm | 2382 +++++++
src/fonts/Adobe-Core35_AFMs-314/Times-Italic.afm | 2665 +++++++
src/fonts/Adobe-Core35_AFMs-314/Times-Roman.afm | 2417 +++++++
src/fonts/Adobe-Core35_AFMs-314/ZapfDingbats.afm | 224 +
src/fonts/LICENSE-FONTS.txt | 74 +
src/fonts/Makefile.gcc | 253 +
src/fonts/Makefile.os2 | 91 +
src/fonts/Makefile.vc | 204 +
src/fonts/adobestd.enc | 356 +
src/fonts/checkfonts.pl | 83 +
src/fonts/cyrillic/arial8.afm | 244 +
src/fonts/cyrillic/arialbd8.afm | 244 +
src/fonts/cyrillic/arialbi8.afm | 244 +
src/fonts/cyrillic/ariali8.afm | 244 +
src/fonts/cyrillic/cokoi8b.afm | 244 +
src/fonts/cyrillic/cokoi8bi.afm | 244 +
src/fonts/cyrillic/cokoi8i.afm | 244 +
src/fonts/cyrillic/cokoi8n.afm | 244 +
src/fonts/cyrillic/times8.afm | 244 +
src/fonts/cyrillic/timesbd8.afm | 244 +
src/fonts/cyrillic/timesbi8.afm | 244 +
src/fonts/cyrillic/timesi8.afm | 244 +
src/fonts/font.dat | 99 +
src/fonts/glemark.afm | 34 +
src/fonts/glemark.gle | 204 +
src/fonts/koi8r.enc | 261 +
src/fonts/mkencoding.pl | 58 +
src/fonts/plba.afm | 116 +
src/fonts/plba.gle | 1646 +++++
src/fonts/plcc.afm | 115 +
src/fonts/plcc.gle | 2257 ++++++
src/fonts/plcg.afm | 115 +
src/fonts/plcg.gle | 1954 ++++++
src/fonts/plci.afm | 115 +
src/fonts/plci.gle | 2012 ++++++
src/fonts/plcr.afm | 115 +
src/fonts/plcr.gle | 1882 +++++
src/fonts/plcs.afm | 115 +
src/fonts/plcs.gle | 2702 ++++++++
src/fonts/pldr.afm | 115 +
src/fonts/pldr.gle | 2254 ++++++
src/fonts/plge.afm | 115 +
src/fonts/plge.gle | 3798 ++++++++++
src/fonts/plgg.afm | 115 +
src/fonts/plgg.gle | 4055 +++++++++++
src/fonts/plgi.afm | 115 +
src/fonts/plgi.gle | 3252 +++++++++
src/fonts/plsa.afm | 116 +
src/fonts/plsa.gle | 1025 +++
src/fonts/plsg.afm | 115 +
src/fonts/plsg.gle | 1492 ++++
src/fonts/plsr.afm | 115 +
src/fonts/plsr.gle | 1304 ++++
src/fonts/plss.afm | 115 +
src/fonts/plss.gle | 2068 ++++++
src/fonts/plsym1.afm | 174 +
src/fonts/plsym1.gle | 2868 ++++++++
src/fonts/plsym2.afm | 162 +
src/fonts/plsym2.gle | 3802 ++++++++++
src/fonts/plti.afm | 115 +
src/fonts/plti.gle | 2636 +++++++
src/fonts/pltr.afm | 115 +
src/fonts/pltr.gle | 3368 +++++++++
src/fonts/psfont.dat | 20 +
src/fonts/pshc.afm | 446 ++
src/fonts/pshcb.afm | 446 ++
src/fonts/pshcbo.afm | 446 ++
src/fonts/pshcdo.afm | 446 ++
src/fonts/texcmb.afm | 332 +
src/fonts/texcmb.gle | 6832 ++++++++++++++++++
src/fonts/texcmex.afm | 151 +
src/fonts/texcmex.gle | 5630 +++++++++++++++
src/fonts/texcmitt.afm | 151 +
src/fonts/texcmitt.gle | 5209 ++++++++++++++
src/fonts/texcmmi.afm | 232 +
src/fonts/texcmmi.gle | 6870 +++++++++++++++++++
src/fonts/texcmr.afm | 332 +
src/fonts/texcmr.gle | 6359 +++++++++++++++++
src/fonts/texcmsl.afm | 332 +
src/fonts/texcmss.afm | 294 +
src/fonts/texcmss.gle | 4347 ++++++++++++
src/fonts/texcmssb.afm | 294 +
src/fonts/texcmssb.gle | 7078 +++++++++++++++++++
src/fonts/texcmssi.afm | 294 +
src/fonts/texcmssi.gle | 5340 +++++++++++++++
src/fonts/texcmsy.afm | 177 +
src/fonts/texcmsy.gle | 5780 ++++++++++++++++
src/fonts/texcmti.afm | 331 +
src/fonts/texcmti.gle | 7243 +++++++++++++++++++
src/fonts/texcmtt.afm | 151 +
src/fonts/texcmtt.gle | 5655 +++++++++++++++
src/fonts/texstd.enc | 87 +
src/gle/Makefile.gcc | 101 +
src/gle/Makefile.in | 196 +
src/gle/Makefile.os2 | 93 +
src/gle/Makefile.vc | 74 +
src/gle/all.h | 75 +
src/gle/axis.cpp | 1466 ++++
src/gle/axis.h | 224 +
src/gle/b_tab.cpp | 166 +
src/gle/b_text.cpp | 62 +
src/gle/basicconf.h | 101 +
src/gle/begin.cpp | 186 +
src/gle/begin.h | 78 +
src/gle/bitmap/Makefile.gcc | 55 +
src/gle/bitmap/Makefile.in | 63 +
src/gle/bitmap/Makefile.os2 | 55 +
src/gle/bitmap/Makefile.vc | 53 +
src/gle/bitmap/ascii85.cpp | 123 +
src/gle/bitmap/files.txt | 55 +
src/gle/bitmap/glegif.cpp | 342 +
src/gle/bitmap/glegif.h | 127 +
src/gle/bitmap/glejpeg.cpp | 188 +
src/gle/bitmap/glepng.cpp | 152 +
src/gle/bitmap/gletiff.cpp | 213 +
src/gle/bitmap/img2ps.cpp | 690 ++
src/gle/bitmap/img2ps.h | 435 ++
src/gle/bitmap/lzwencode.cpp | 406 ++
src/gle/bitmap/lzwencode.h | 47 +
src/gle/builtin-double.cpp | 25 +
src/gle/builtin-double.h | 19 +
src/gle/cmdline.cpp | 905 +++
src/gle/cmdline.h | 316 +
src/gle/color.cpp | 447 ++
src/gle/color.h | 220 +
src/gle/config.cpp | 723 ++
src/gle/config.h | 146 +
src/gle/core.cpp | 4080 +++++++++++
src/gle/core.h | 458 ++
src/gle/curve.cpp | 101 +
src/gle/cutils.cpp | 794 +++
src/gle/cutils.h | 187 +
src/gle/d_cairo.cpp | 1108 +++
src/gle/d_dummy.cpp | 214 +
src/gle/d_interface.h | 545 ++
src/gle/d_ps.cpp | 1119 +++
src/gle/d_svg.cpp | 39 +
src/gle/d_x.cpp | 1215 ++++
src/gle/drawit.cpp | 405 ++
src/gle/drawit.h | 40 +
src/gle/eval.cpp | 1139 +++
src/gle/f2c.h | 248 +
src/gle/file_io.cpp | 1668 +++++
src/gle/file_io.h | 197 +
src/gle/files.txt | 152 +
src/gle/fitbez.cpp | 82 +
src/gle/fitcf.cpp | 589 ++
src/gle/fitcf.h | 265 +
src/gle/fn.cpp | 201 +
src/gle/fn.h | 66 +
src/gle/font.cpp | 461 ++
src/gle/font.h | 114 +
src/gle/general.cpp | 153 +
src/gle/gle-base.cpp | 48 +
src/gle/gle-block.cpp | 125 +
src/gle/gle-block.h | 75 +
src/gle/gle-datatype.cpp | 1034 +++
src/gle/gle-interface.cpp | 2432 +++++++
src/gle/gle-interface/gle-base.h | 178 +
src/gle/gle-interface/gle-const.h | 67 +
src/gle/gle-interface/gle-datatype.h | 355 +
src/gle/gle-interface/gle-interface.h | 1324 ++++
src/gle/gle-interface/gle-shapemath.h | 173 +
src/gle/gle-interface/gle-sourcefile.h | 140 +
src/gle/gle-poppler.cpp | 393 ++
src/gle/gle-poppler.h | 78 +
src/gle/gle-sourcefile.cpp | 398 ++
src/gle/gle.cpp | 1304 ++++
src/gle/glearray.cpp | 780 +++
src/gle/glearray.h | 204 +
src/gle/glebtool.cpp | 203 +
src/gle/glec.cpp | 171 +
src/gle/glepro.h | 156 +
src/gle/gprint.cpp | 167 +
src/gle/gprint.h | 52 +
src/gle/graph.cpp | 2194 ++++++
src/gle/graph.h | 669 ++
src/gle/graph2.cpp | 4534 ++++++++++++
src/gle/justify.h | 78 +
src/gle/key.cpp | 867 +++
src/gle/key.h | 188 +
src/gle/keyword.cpp | 250 +
src/gle/keyword.h | 134 +
src/gle/leastsq.cpp | 360 +
src/gle/leastsq.h | 58 +
src/gle/letzfitz/Makefile.gcc | 56 +
src/gle/letzfitz/Makefile.in | 63 +
src/gle/letzfitz/Makefile.os2 | 55 +
src/gle/letzfitz/Makefile.vc | 53 +
src/gle/letzfitz/f2c.h | 244 +
src/gle/letzfitz/ffit.cpp | 2737 ++++++++
src/gle/letzfitz/files.txt | 48 +
src/gle/letzfitz/fit.cpp | 360 +
src/gle/letzfitz/let.cpp | 174 +
src/gle/mem_limits.h | 98 +
src/gle/memory.cpp | 111 +
src/gle/mychar.cpp | 311 +
src/gle/numberformat.cpp | 824 +++
src/gle/numberformat.h | 113 +
src/gle/op_def.cpp | 364 +
src/gle/op_def.h | 109 +
src/gle/pass.cpp | 2438 +++++++
src/gle/pass.h | 254 +
src/gle/polish.cpp | 674 ++
src/gle/polish.h | 184 +
src/gle/run.cpp | 2541 +++++++
src/gle/run.h | 129 +
src/gle/savgol.cpp | 161 +
src/gle/sub.cpp | 466 ++
src/gle/sub.h | 219 +
src/gle/surface/Makefile.gcc | 55 +
src/gle/surface/Makefile.in | 63 +
src/gle/surface/Makefile.os2 | 55 +
src/gle/surface/Makefile.vc | 53 +
src/gle/surface/f2c.h | 244 +
src/gle/surface/fcontour.cpp | 970 +++
src/gle/surface/ffitcontour.cpp | 556 ++
src/gle/surface/files.txt | 52 +
src/gle/surface/gcontour.cpp | 427 ++
src/gle/surface/gsurface.cpp | 683 ++
src/gle/surface/gsurface.h | 117 +
src/gle/surface/hide.cpp | 1207 ++++
src/gle/tex.cpp | 2134 ++++++
src/gle/tex.h | 51 +
src/gle/texinterface.cpp | 1569 +++++
src/gle/texinterface.h | 287 +
src/gle/token.cpp | 236 +
src/gle/token.h | 61 +
src/gle/tokens/BinIO.cpp | 269 +
src/gle/tokens/BinIO.h | 144 +
src/gle/tokens/CharBitMap.h | 100 +
src/gle/tokens/Makefile.gcc | 56 +
src/gle/tokens/Makefile.in | 63 +
src/gle/tokens/Makefile.os2 | 55 +
src/gle/tokens/Makefile.vc | 53 +
src/gle/tokens/RefCount.h | 133 +
src/gle/tokens/StringKeyHash.cpp | 108 +
src/gle/tokens/StringKeyHash.h | 316 +
src/gle/tokens/Tokenizer.cpp | 1533 +++++
src/gle/tokens/Tokenizer.h | 527 ++
src/gle/tokens/Tokenizer.i | 58 +
src/gle/tokens/files.txt | 53 +
src/gle/tokens/stokenizer.h | 259 +
src/gle/unit-tests/part1.cpp | 234 +
src/gle/var.cpp | 769 +++
src/gle/var.h | 229 +
src/gui/3dviewer.cpp | 330 +
src/gui/3dviewer.h | 91 +
src/gui/MakefileAC.in | 118 +
src/gui/about.cpp | 170 +
src/gui/about.h | 55 +
src/gui/about.html | 24 +
src/gui/amove.cpp | 178 +
src/gui/amove.h | 74 +
src/gui/arc.cpp | 865 +++
src/gui/arc.h | 109 +
src/gui/circle.cpp | 441 ++
src/gui/circle.h | 82 +
src/gui/colourbutton.cpp | 89 +
src/gui/colourbutton.h | 55 +
src/gui/colourpicker.cpp | 151 +
src/gui/colourpicker.h | 65 +
src/gui/component.cpp | 148 +
src/gui/component.h | 136 +
src/gui/consolewindow.cpp | 115 +
src/gui/consolewindow.h | 72 +
src/gui/dialogues.cpp | 717 ++
src/gui/dialogues.h | 177 +
src/gui/downloader.cpp | 384 ++
src/gui/downloader.h | 154 +
src/gui/doxyfile | 1258 ++++
src/gui/drawingobject.cpp | 529 ++
src/gui/drawingobject.h | 246 +
src/gui/ellipse.cpp | 768 +++
src/gui/ellipse.h | 90 +
src/gui/fileinfo.cpp | 143 +
src/gui/fileinfo.h | 97 +
src/gui/gledrawing.cpp | 2869 ++++++++
src/gui/gledrawing.h | 393 ++
src/gui/glegs.cpp | 242 +
src/gui/gpl.txt | 340 +
src/gui/grid.cpp | 145 +
src/gui/grid.h | 68 +
src/gui/gsinc/LICENSE | 28 +
src/gui/gsinc/gdevdsp.h | 266 +
src/gui/gsinc/gscdefs.h | 86 +
src/gui/gsinc/iapi.h | 300 +
src/gui/gsinc/ierrors.h | 165 +
src/gui/images/amove.png | Bin 0 -> 975 bytes
src/gui/images/arc_3p.png | Bin 0 -> 1295 bytes
src/gui/images/circle.png | Bin 0 -> 1375 bytes
src/gui/images/edit_mode.png | Bin 0 -> 1245 bytes
src/gui/images/editor.png | Bin 0 -> 491 bytes
src/gui/images/ellipse.png | Bin 0 -> 1384 bytes
src/gui/images/ellipsis.png | Bin 0 -> 301 bytes
src/gui/images/gle.icns | Bin 0 -> 55616 bytes
src/gui/images/gle.ico | Bin 0 -> 16958 bytes
src/gui/images/gle.png | Bin 0 -> 5975 bytes
src/gui/images/gle_icon.png | Bin 0 -> 2207 bytes
src/gui/images/gle_shadow.png | Bin 0 -> 17246 bytes
src/gui/images/grid.png | Bin 0 -> 368 bytes
src/gui/images/grid_snap.png | Bin 0 -> 460 bytes
src/gui/images/line.png | Bin 0 -> 688 bytes
src/gui/images/new.png | Bin 0 -> 639 bytes
src/gui/images/open.png | Bin 0 -> 662 bytes
src/gui/images/orthosnap.png | Bin 0 -> 1077 bytes
src/gui/images/osnap.png | Bin 0 -> 1482 bytes
src/gui/images/perp_line.png | Bin 0 -> 1446 bytes
src/gui/images/pointer.png | Bin 0 -> 941 bytes
src/gui/images/polarsnap.png | Bin 0 -> 1420 bytes
src/gui/images/polartrack.png | Bin 0 -> 2452 bytes
src/gui/images/preview_mode.png | Bin 0 -> 1599 bytes
src/gui/images/reload.png | Bin 0 -> 1436 bytes
src/gui/images/reload_red.png | Bin 0 -> 1540 bytes
src/gui/images/save.png | Bin 0 -> 531 bytes
src/gui/images/tan_line.png | Bin 0 -> 1504 bytes
src/gui/images/text.png | Bin 0 -> 1174 bytes
src/gui/images/varyingcolours.png | Bin 0 -> 338 bytes
src/gui/images/zoom_in.png | Bin 0 -> 1620 bytes
src/gui/images/zoom_out.png | Bin 0 -> 1600 bytes
src/gui/line.cpp | 449 ++
src/gui/line.h | 78 +
src/gui/macspecific.cpp | 52 +
src/gui/main.cpp | 285 +
src/gui/mainwindow.cpp | 2658 +++++++
src/gui/mainwindow.h | 550 ++
src/gui/newfile.cpp | 84 +
src/gui/newfile.h | 63 +
src/gui/objectblocks.cpp | 551 ++
src/gui/objectblocks.h | 126 +
src/gui/polararray.cpp | 186 +
src/gui/polararray.h | 78 +
src/gui/propertyeditor.cpp | 179 +
src/gui/propertyeditor.h | 54 +
src/gui/propertymodel.cpp | 107 +
src/gui/propertymodel.h | 59 +
src/gui/qgle.pro.in | 187 +
src/gui/qgle.qrc | 57 +
src/gui/qgle.rc | 1 +
src/gui/qgle_definitions.h | 86 +
src/gui/qgle_statics.cpp | 862 +++
src/gui/qgle_statics.h | 278 +
src/gui/qgs.cpp | 676 ++
src/gui/qgs.h | 367 +
src/gui/qgslibloader.cpp | 393 ++
src/gui/readme.txt | 118 +
src/gui/serverthread.cpp | 564 ++
src/gui/serverthread.h | 159 +
src/gui/settings.cpp | 131 +
src/gui/settings.h | 250 +
src/gui/settings_dialogue.cpp | 746 ++
src/gui/settings_dialogue.h | 257 +
src/gui/snapline.cpp | 495 ++
src/gui/snapline.h | 83 +
src/gui/start-qgle.sh | 28 +
src/gui/text.cpp | 407 ++
src/gui/text.h | 89 +
src/gui/variantdelegate.cpp | 413 ++
src/gui/variantdelegate.h | 50 +
src/lib/Makefile.gcc | 50 +
src/lib/Makefile.os2 | 48 +
src/lib/barcode.gle | 173 +
src/lib/barstyles.gle | 73 +
src/lib/color.gle | 145 +
src/lib/compat/colors-gle-4.0.12.gle | 164 +
src/lib/compatibility.gle | 39 +
src/lib/contour.gle | 59 +
src/lib/electronics.gle | 1340 ++++
src/lib/ellipse.gle | 117 +
src/lib/feyn.gle | 1774 +++++
src/lib/graphutil.gle | 421 ++
src/lib/include_en.gle | 121 +
src/lib/matrix_3D.gle | 454 ++
src/lib/piesub.gle | 82 +
src/lib/polarplot.gle | 124 +
src/lib/shape.gle | 707 ++
src/lib/simpletree.gle | 185 +
src/lib/stm.gle | 303 +
src/lib/tree.gle | 263 +
src/lib/ziptext.gle | 51 +
src/makefmt/Makefile.gcc | 56 +
src/makefmt/Makefile.in | 75 +
src/makefmt/Makefile.os2 | 54 +
src/makefmt/Makefile.vc | 56 +
src/makefmt/basicconf.h | 99 +
src/makefmt/files.txt | 53 +
src/makefmt/makefmt.cpp | 411 ++
src/makefmt/parseAFM.cpp | 1268 ++++
src/makefmt/parseAFM.h | 328 +
src/manip/Makefile.dj | 75 +
src/manip/Makefile.gcc | 59 +
src/manip/Makefile.in | 76 +
src/manip/Makefile.os2 | 60 +
src/manip/all.h | 218 +
src/manip/cell.cpp | 357 +
src/manip/cell.h | 58 +
src/manip/cmd.cpp | 1277 ++++
src/manip/cmd.h | 87 +
src/manip/color.h | 51 +
src/manip/cursesscr.cpp | 239 +
src/manip/edt.h | 48 +
src/manip/eval.cpp | 445 ++
src/manip/eval.h | 55 +
src/manip/ffblk_def.h | 51 +
src/manip/filemenu.cpp | 690 ++
src/manip/filemenu.h | 47 +
src/manip/files.txt | 72 +
src/manip/fn.cpp | 117 +
src/manip/general.cpp | 119 +
src/manip/keyword.cpp | 148 +
src/manip/keyword.h | 43 +
src/manip/manip.cpp | 620 ++
src/manip/manip.h | 71 +
src/manip/manip.hlp | 383 ++
src/manip/mjl.cpp | 91 +
src/manip/mjl.h | 45 +
src/manip/mscreen.h | 79 +
src/manip/mygraph.h | 130 +
src/manip/nofnkeys.h | 47 +
src/manip/polish.cpp | 414 ++
src/manip/sub.cpp | 159 +
src/manip/test.dat | 43 +
src/manip/token.cpp | 184 +
src/manip/unix_extra.cpp | 123 +
src/manip/unix_extra.h | 47 +
src/manip/unixinkey.cpp | 366 +
src/manip/unixscr.cpp | 325 +
src/manip/var.cpp | 235 +
src/manip/varargs.cpp | 72 +
src/manip/vaxconio.h | 63 +
src/manip/vaxinkey.cpp | 248 +
src/samples/Makefile.gcc | 53 +
src/samples/Makefile.os2 | 53 +
src/samples/Makefile.vc | 57 +
src/samples/qgle_keyboard.gle | 131 +
src/samples/sample.gle | 60 +
src/samples/sample_compare.eps | 106 +
755 files changed, 349464 insertions(+)
diff --git a/ChangeLog.txt b/ChangeLog.txt
new file mode 100644
index 0000000..744df38
--- /dev/null
+++ b/ChangeLog.txt
@@ -0,0 +1,1174 @@
+4.2.5 (August 2015)
+
+Bug Fixes
+ Force locale to "C" in QGLE
+ Apply patch by Chris Ward to make GLE build with GCC5
+ Fixed #53 Segfault when non-ASCII characters and Tex labels enabled
+ Take key (outside graph) into account when doing "scale auto"
+ Fixed "end if" not allowed before size command
+ Fixed rounding error in colormap command
+ Fixed bug in zmin/zmax arguments for colormap with a function
+ Fixed bug #50: GLE axis auto scaling does not take error bars into account
+ Fixed bug #52: Error bars should be clipped to the graph window
+ Fixed filling problem (-nomaxpath no longer needed for fills)
+ Fixed bug #54: GLE overwrites .tex file
+ Fixed Rotated y2labels does not work (reported by Viachara Amirdayl)
+ Fixed 'shade' fill option does not work (reported by Ben Lobo)
+ Fixed "xnames from di": don't show labels twice
+ Bug 3494736: QGLE terminates trying to create new file
+ Implemented patch to use RTLD_DEEPBIND for dlopen
+ Fixed all compiler warnings (gcc 4.7.0)
+ Corrected formatting of 3D axis labels (bug reported by Nick Pomponio)
+ Strip should use --strip-unneeded for library (Reported by Christian T. Steigies)
+ Attempt to fix: Bug 669161: gle-graphics: FTBFS on sparc
+
+New Features
+ Dynamic typing and type checking in the expression evaluator
+ Allow d[i] in let expression
+ Added ndatasets() function
+ Support for .gz data files in colormap command
+ Added colormap option "interpolate nearest" (based on patch by Brandon Aubie)
+ Made colormap take into account x/yaxis options such as log and negate
+ Added barcode.gle (by Jan Soubusta)
+ Added autocolor function to graphutil.gle
+ Added polar_segment to polar.gle
+ Improvements to the device$() function (suggested by Elrond)
+ Bitmap caching in the Cairo device (suggested by Alexis Letessier)
+ Added "-inverse" option to inverse black / white colors (based on patch by Brandon Aubie)
+ Adds "percent" number formatting option (patch by Brandon Aubie)
+ Adds "textcolor" to the key block (patch by Brandon Aubie)
+ QGLE monitors include and data files and updates preview if these change
+
+4.2.4c (March, 2012)
+
+Bug Fixes
+
+ Added checks on number of data sets, bar definitions, and fill definitions (QGLE crash reports 02/07/2012 and 02/16/2012)
+ Save .glerc in user's AppData on Windows
+ Added manifest to prevent AUC Virtualization on Windows Vista and above
+ Search "C:\Program Files (x86)" on 64 bit Windows for installed software
+ Fixed type in manual: logfit -> logefit
+ Fixed bug in tokenizer
+ Fixed crash when parsing "let d1 = x.x" (QGLE crash report 02/28/2012)
+ Fix for message "QWidget::setWindowModified: The window title does not contain a '[*]' placeholder"
+ Fixed bug in centering of .inc output (reported by Antonio DiCesare)
+ Bug 3485409: GLE should check for Cairo version >= 1.10.0
+ Added Python script to generate GLE palette functions (contributed by Brandon Aubie)
+ Fixed "too many open files" when including bitmaps in filled boxes (reported by Alexis Letessier)
+ Fixed issue with filled boxes (reported by Alexis Letessier)
+ Make GLE compile with GCC 4.7.x (issue raised by Terje R�sten)
+ Support other 64bit systems besides x86
+ Fixed more GLU problems introduced in Qt4.8
+
+4.2.4b (January, 2012)
+
+Bug Fixes
+
+ Added GLU dependency to make GLE compile with Qt4.8
+ Fixed bug in fallback to "texcmr" when using -cairo
+ Fixed crash due to subroutine argument type mismatch
+
+4.2.4 (January, 2012)
+
+New Features
+
+ "Marker only" 3D plots (patch by Laurence Abbott)
+ Added "discontinuity threshold" option to graph block
+ Added "draw" command to graph block
+ Added "msize" option to box plots (request by Nicolas Lerme)
+ Added GLE-TeX symbols \uparrow, \downarrow, \updownarrow, \Uparrow, \Downarrow, \Updownarrow, and \backslash
+ Added changes by Pascal Buescher to feyn.gle
+ Added functions rgba() and rgba255()
+ Added functions xg3d() and yg3d()
+ Always embed all fonts in PDFs
+ Cairo (www.cairographics.org) rendering now available in QGLE
+ Control constructs (e.g., if-then-else and for-next) can be used in graph and key blocks
+ Feature #3174151: Variable justification
+ GNU/Hurd now officially supported
+ Multiple layers in graph blocks
+ New "begin length" block to compute curve length
+ New CSV file reader with better error handling and wider CSV format support (including Microsoft Excel)
+ Option "-cairo" can now be combined with LaTeX expressions
+ Semi-transparent colors (also known as alpha blending)
+ Support for "key separator" in graph blocks
+ Use Poppler PDF library for rendering in QGLE and for image exports
+ Support GZIP compressed CSV data in graph blocks
+ QGLE export dialog remembers resolution and other settings
+ Better definition of circle style markers (including "dot")
+ Added support for arc arrow heads in QGLE edit mode
+
+Bug Fixes
+
+ Fix for "QGLE does not support bold / italic fonts" (aka "set font rm" insertion problem)
+ Bug #3101026: Fixes for possible buffer overflows
+ Bug #3344819: Marker line width is different in legend
+ Fix for bug in number formatting (part before 10^x missing)
+ Fix for compiler error on std::min/max (suggested by Laurence Abbott)
+ Fixed \leftarrow kerning problem
+ Patch by Michal Vyskocil: Use QMAKE_LIBS_DYNLOAD
+ Subticks are now generated over the entire axis range
+ g_bitmap now also works with "-cairo"
+ Bug #3434175: Turning on sublabels produces wrong width of some subticks
+ Fixed bug in when QGLE edits scripts with filled boxes
+
+4.2.3 (September, 2010)
+
+ #3058793: y1axis dominates the plot (lin/log) bound to y2axis
+ #2782744: Automatic tick labels with latex
+ Fixed compilation on Mac OS/X
+ The graph block's "data" command now understands column c0, which contains the data set's line numbers
+ #2996854: Missing a few multiple bars
+ Fixed: xend()/yend() do not work in QGLE's edit mode
+ QGLE's about box has been improved and shows license and contributors in separate tabs
+ Graph command 'xsubticks length' now overrides 'xaxis grid'
+ Fixed: key block with 'fill' incorrectly changes the 'set fill' value
+ #2995351: Unwanted vertical space generated in graph module
+ Added "background" command to graph block to set the background color
+ #2949503: Fixed a number of errors in the GLE 4.2.2 manual
+ #2950381: Allow "marker m$" with m$ a string variable in the graph block
+ #2949642: Log axis sub tick font size should be based on the "alabelscale" setting
+ #2949495: Access to environment variables: added getenv() command and allow $ENVVAR in file names
+ Added support for single quoted strings
+ Escaping single and double quote characters in strings now works by doubling them
+ Experimental support for EMF output (the vector format on Windows).
+ New QGLE menu entry "Edit | Copy as EMF" to copy the diagram to the clipboard on Windows.
+
+4.2.2 (January, 2010)
+
+New Features
+
+ Windows installer can now copy settings from a previous GLE install thereby avoiding the long 'find dependencies' process.
+ Support \'' style umlauts in LaTeX expressions (bug #2858424).
+ Additional command line options for GhostScript/PDFLaTeX/LaTeX/DVIPS can now be specified in the "glerc" settings file
+ GLE now expands environment variables in the tool paths specified in the "glerc" settings file.
+
+Bug Fixes
+
+ QGLE now no longer modifies the string argument of "write" if a text string is moved or one of its properties is changed.
+ GLE now compiles with "-Wl,--no-add-needed" and hopefully also with binutils-gold.
+ Fixed GLE crash on illegal font name.
+ Fixed GLE crash on certain scripts with error bars.
+ Fixed regression in key block in 3.5 compatibility mode.
+ Diamond markers are now also centered in 3.5 emulation mode.
+ QGLE now sets the locale such that the decimal point indicator is "." (workaround "export LC_ALL=C").
+ Fixed crash in certain bar graphs (reported by Massimo Canonico).
+
+4.2.1 (August, 2009)
+
+New Features
+
+ Added "from/to/step" options to "values" command of "contour" block.
+ Number of available datasets increased from 100 to 1000 (patch by Laurence Abbott).
+ Added "reload" button to QGLE.
+ Added "key off" to turn off the key of a graph block (Feature #2781887).
+ Added "ylabels align left" to align all labels left (right is the default).
+ Added support for FreeBSD (Bug #2786222).
+ Added support for --docdir configure option.
+ Changed package name to "gle-graphics" and distribute GLE's source code as .tar.gz.
+ Moved plotter fonts to a separate package (./configure --with-extrafonts=yes to enable these).
+ Added license information to all files where this can be done easily.
+ Replaced font metrics files for core PostScript fonts with a set that is freely available from Adobe.
+ Manual can now be compressed and installed as "gle-manual.pdf.gz".
+ Configure script checks for "qmake-qt4" before checking for "qmake".
+
+Bug Fixes
+
+ Arrowhead not drawn correctly when using dashed line (#2838971).
+ Fixed problem in TeX macro substitution (#2838978).
+ Curve with zero distance control points should be straight line #2838965).
+ Added support for operations on arbitrary length strings.
+ More commands are now allowed to come before the "size" command (e.g., bitmap_info).
+ Improved routine for determining axis tick labels.
+ Fixed QGLE crash on key block error (e.g., entry with no text).
+ QGLE no longer crashes when "Save As" is selected while an EPS (not GLE) file is loaded.
+ QGLE fix for the case that a "recent file" is opened that no longer exists.
+ Fixed crash in "postscript" include command if bounding box is at the end of the EPS.
+ The "clean" target now removes all files generated by "make".
+ A "distclean" target has been added to also remove all files generated by "./configure".
+ Replaced calls to "make" with "$(MAKE)" to handle the case that GNU make is "gmake".
+ Added range checks for "from" "to" and "step" for the "letz" and "fitz" blocks.
+
+4.2.0 (April, 2009)
+
+New Features
+
+ Added "range" and "nsteps" options to the graph block's let command.
+ Added functions file$() and path$() to retrieve the script's name and path (suggested by J�rg Baumgartner).
+ Added function isname() that tests if its argument is a named point or object.
+ Added "set background" to set background color of shade / grid filling patterns.
+ Added "background" to bar command and key block.
+ Added "set fillmethod", which can be "GLE" (more accurate) or "PostScript" (faster).
+ Source distribution now includes syntax highlighting patterns (in contrib/editors/).
+ Source distribution now includes the GLE manual (compile with "make doc").
+ Adds "ylabels log n1" to enable subticks without labels on a log scale axis (patch by Luca Donetti).
+ Adds option "adist" to "x/ytitle" to set the distance between the title and axis (useful for aligning axis titles of multiple graphs).
+ Support for multi-dimensional let (#2008719).
+ (See: let-multi-dim.gle.)
+ Support for stdin/stdout (#2009125).
+ E.g., cat file.gle | gle -d pdf - > file.pdf
+ E.g., cat file.gle | gle -o file.pdf -
+ Experimental support for objects with named points.
+ (See: transistor.gle, shapes.gle.)
+ Scalable Vector Graphics (SVG) output device (-d svg).
+ Engineering format "eng" for the format$ function and axis format option.
+ (See: axisformat.gle.)
+ Quantile based axis auto-scaling (by Florian Wisser).
+ New axis command: "roundrange on/off" to disable rounding the axis range to the next tick.
+ New key block mode: "compact", which combines "marker" and "line" in one column.
+ New key block setting: "background", which sets the background color.
+ Key box is now transparent (only for keys defined within the graph block).
+ Adds function "atan2" (#1881021).
+ QGLE is now available on MacOS/X (installation instructions).
+ "File | Edit" menu added to QGLE for easy access to files included in GLE script.
+ "Edit | Copy as Bitmap" menu added to copy the diagram to the clipboard.
+ Adds entries to QGLE's help menu to display the GLE manual and website.
+ GUI for detecting GLE's software dependencies (GhostScript and LaTeX).
+ Automatically infer device from extension of "-o" option, which specifies the output name.
+ DSC comments for title and creator added to PostScript/EPS/PDF output.
+ Includes HiResBoundingBox in PostScript output.
+ Better support for UTF8 accents in LaTeX expressions (use \usepackage[utf8]{inputenc}).
+ Command line option "-noligatures" to disable the use of ligatures for "fl" and "fi".
+
+Bug Fixes
+
+ Fix for stack corruption in PSGLEDevice::read_psfont() (bug #2543164).
+ GLE now creates .inc file if -inc is given and script does not contain TeX expressions (bug #2165591).
+ Fix for smooth crash in case of too few data and missing values (reported by Cilliers Kruger).
+ Fix for 3D plot bounding box (reported by Brandon Aubie).
+ Fix for QGLE compilation on MacOS/X: add "-spec macx-g++" to qmake (suggested by Mol Lukas).
+ Fix for "xsubticks lwidth" also affecting the line width of the main ticks.
+ Fix for the "strip" target in Makefile.in (by Michal Vyskocil).
+ Auto-ranging now also works for x2axis/y2axis (#1933925).
+ GLE can't handle filenames with a dot (#2015073).
+ Fix for auto-range function with data sets with no spread (suggested by Florian Wisser).
+ Fix for "nox" option of "data" command of graph block.
+ Fixes for incorrect code points in GLE's Unicode table (o.a., for "�").
+ Combining "clip" + "fill" in "begin path/end path" does not perform the requested fill.
+ Command line option "-noctrl-d" and some others are not documented in GLE's man page and "-help" output.
+ Landscape detection PS mode is now more robust.
+ Fixes for all warnings new in GCC 4.3.0.
+
+4.1.2 (March, 2008)
+
+ GLE fails to read certain JPG files (bitmap command).
+ Colormap command does not work for non-square .z files.
+ Bug "rotate + tex = misplacement of text" (#1881020).
+ Patch to make GLE compile with gcc 4.3 (include limits.h) (by Terje R�sten).
+ QGLE's export fails if path contains a space or '.' character.
+
+4.1.1 (January, 2008)
+
+ Smooth option of "dn line" fixed for log-scale graphs (Bug #1860761).
+ Patches to make GLE compile with gcc 4.3 (by Michal Vyskocil).
+ Patches to make GLE work on 64 bit machines with "lib64" dir (by Michal Vyskocil).
+ Fix for GhostScript problem in QGLE on 64 bit machines.
+
+4.1.0 (December, 2007)
+
+Detailed Changes
+
+ Added man page (now "man gle" should work on Linux).
+ Added option "-verbosity" to set the amount of console output produced by GLE.
+ Grid is now by default under the bars (use "grid ontop" to get the old behavior).
+ Added "boxcolor" command to key block to set the color of the box indicating the fill.
+ Added "append" and "prepend" commands to format$ strings.
+ Added command "abound x y" to update the current bounding box.
+ Added "scale auto" "hscale auto" "vscale auto" to fit the graph to the page size.
+ Added auto-key based on header in data set.
+ Added auto-xnames based on names in first data set column.
+ Added "let d2 = hist d1 from 0 to 10 bins 10" for computing histograms (step 1 can be used instead of bins).
+ Added "bar" option to "dn line" command for drawing histograms.
+ Data sets can now be just one column. If "nox" is given, the x-values are set to 1...N.
+ Added "compatibility" command (e.g., compatibility "3.5").
+ Added compatibility range option to include command.
+ Added support for standard SVG/X11 color names (by color, alphabetical).
+ Added HTML notation for color names (e.g., #FF0000 = red).
+ Added "defcolor name color".
+ Added "set fill xxx" and "set pattern xxx".
+ Made "include filename.gle" itempotent.
+ Added "declare sub name args", to allow forward declarations of subroutines.
+ Added "default" to set default values for subroutine arguments.
+ Output of LaTeX is now hidden, only errors are shown if they occur.
+ Option "dticks" now works for log scales + improved log autoscaling.
+ Improved Windows installer: added bitmaps and license screen (by Vincent P LaBella).
+ Added "mdist d" option to "dn marker" to draw a marker every d cm along the given curve.
+ Added "deresolve n" option to "dn line" to subsample the points before drawing (by Laurence Abbott).
+ Added option "average" to "dereslove" to average the points instead of just skipping them.
+ Added functions dataxvalue(di,i), datayvalue(di,i), ndata(di) (by Laurence Abbott).
+ Added options "xmin" "xmax" "ymin" "ymax" to fitting routines of "let" command.
+ Added "-safemode" command line option that prevents GLE scripts from accessing the file system.
+ Added "-allowread" and "-allowwrite" to allow I/O in given paths if "-safemode" is given.
+ Added "comment" option to "data" in graph block (by Vincent P LaBella).
+ Example: "data filename.dat d1=c1,c2 comment //" will make GLE ignore lines starting with "//" in the data file.
+ Better formatting of error messages if script contains long lines.
+ Added support for curved arrows on arcs, elliptical arcs, and bezier curves (experimental).
+ Added "palette" option to colormap command.
+ Added fitting of arbitrary functions (based on fitls code from GLE 3.x).
+ Example: "let d2 = fit d1 with a*sin(b*x)+c*x^2+d".
+ Example: "let d2 = fit d1 with a*sin(b*x)+c*x^2+d eqstr e$ rsq r".
+ These two examples fit dataset d1 with a function of the form "a*sin(b*x)+c*x^2+d" and put this function in d2.
+ The second example in addition stores the resulting equation as a string in variable "e$" and the correlaction coefficient in "r".
+
+4.0.12 (September, 2006)
+
+ Includes a GUI called QGLE (written by A. S. Budden)
+ - displays the output of GLE and updates automatically after the source file is modified (run "gle -p myfile.gle")
+ - has basic editing tools (add amove/line/circle/...)
+ - QGLE is based on the QT and Ghostscript library
+ Added GNU autoconf support (in addition to the regular makefile.os system)
+ (on Linux, one can now compile with ./configure; make; make install)
+ Added autopackage support
+ UTF8 support (limited to latin characters with accents)
+ LaTeX expressions are scaled to the current font height
+ (set texscale none/fixed/scale)
+ LaTeX expressions are used in key and graph blocks (set texlabels 1)
+ The "begin box / end box" block now fills underneath its contents
+ Added keyword "local" to define local variables
+ (see e.g., Examples | Fractals | Sierpinski on the website)
+ Added "colormap" command (regular and graph block)
+ (see e.g., Examples | 3D plots | Information Gain on the website)
+ Colormap works for functions and for .z files
+ Added option "-v" to run another version of GLE
+ (if more than one version is installed, use "gle -help v" to list installed versions)
+ Added "begin object name" and "end object" to define objects
+ Added "draw name.pos" to draw objects
+ More sensible defaults for graph font sizes
+ (use gle -cmode 3.0 to get the old defaults)
+ Font size in graph now depends on the "hei" setting
+ Added new set subcommands: titlescale, atitlescale, ticksscale, atitledist, alabeldist
+ (to set font sizes and distances relative to the value of the "hei" setting)
+ Distance between axis labels and title are better calculated
+ Added "margins", "dist", "coldist" and "row" options to key block
+ Added "scale h v" command to graph block, which is equivalent to a hscale/vscale pair
+ Added colored fill patterns for the "bar" command and key block
+
+ bar d1,d2,d3,d4 fill blue,red,blue,purple pattern none,shade,grid,shade2
+
+ Added "xnames from di" to retrieve the axis labels from a data set
+ Added "xnoticks p1 p2 ..." to disable ticks at specified positions
+ Added "ftick x0" to "axis" to manually set the position of the first tick
+ Added "offset y0" to "axis" to move the origin of the axis
+ Added "angle a" to "axis" to rotate the axis labels
+ Added "x0axis" and "y0axis" (these are disabled by default)
+ Added option "center" to center a graph block
+ Added option "math" to create a "math mode" graph with the axis crossing at the origin
+ (see e.g., Examples | 2D Simple | Sin on the website)
+ Added option "horiz" to bar command allowing "horizontal" bar plots
+ Added option "style" to bar command allowing user defined bar styles
+ (see e.g., Examples | 2D Complex | Color Bar on the website)
+ Added arrow styles "filled", "empty" and "simple"
+ Added support for user defined arrow styles
+ (see e.g., Examples | Other | Arrow Styles on the website)
+ Added function xbar(xp,i) retrieving the x-coordinate of bar i in a bar plot
+ Added function xy2angle(dx,dy) that computes the angle (polar coords) given dx and dy
+ Added function sdiv(x,y) implementing y == 0.0 ? 0.0 : x / y
+ Added formatting modes "pi" and "frac" to format$
+ (see e.g., Examples | 2D Simple | Sin on the website)
+ Subroutine definitions and assignments can come before the size command
+ Checks for correct nesting of all block commands
+ While loops are now also supported (besides until ... next loops)
+ Support for single line then/else blocks allowing code such as
+
+ if a < 1 then print a "is smaller than 1"
+ else if a < 2 then print a "is smaller than 2 but larger than 1"
+ else if a < 3 then print a "is smaller than 3 but larger than 2"
+ else print a "is larger than 3"
+
+ LaTeX expressions can now also be used in combination with .ps output
+ Axis scales are now computed based on the datasets that are actually used
+ Graph block can include function calls, of which the output is clipped to the graph window
+ (see e.g., Examples | 2D Complex | Labeled Scatter on the website)
+ The manip utility has been integrated back into the GLE distribution
+ (see e.g., this screenshot of manip).
+
+4.0.11 (December, 2005)
+
+ Adds the contour utility for generating contour plots.
+ Adds the fitz utility for generating 3d plots based on given data.
+ Adds support for command line arguments using nargs() arg(i) and arg$(i).
+ Adds the command line option -o to specify the name of the output file.
+ Fixes a bug with accents (\^, \i, and \j are supported now).
+ The \tex{} escape sequence can now also be used in tables.
+ From and to specifications are now optional for let command.
+
+4.0.10 (November, 2005)
+
+ Adds landscape support to the full page mode (orientation landscape).
+ Improves the Windows installer (it now shows the readme, etc.).
+ Fixes a bug in the parsing of some floating point numbers (e.g., 1.e5).
+ Fixes a bug in user defined markers.
+
+4.0.9 (August, 2005)
+
+ Parser has been significantly improved and gives more informative error messages.
+
+ >> test.gle (22) |x = 64; y = log2(x)|
+ >> ^
+ >> Error: call to undefined function 'log2'
+
+ TeX expressions are now included in output by default, use -inc for the "inc way".
+ Added option -fullpage.
+ Added pagesize and margins commands and corresponding config section.
+ Added function eval(expr$) that evaluates expr$ and returns the result.
+ Added option "curve angle1 angle2 d1 d2" to commands rline, aline and join.
+ Fixed grid in log plots.
+ Added escape sequence \expr{some_exp} that can be used in block commands and inserts the result of evaluating some_exp.
+ EOF is stripped from .eps if included with postscript command.
+ Special variables xgmin, xgmax, ygmin, ygmax, xg2min, xg2max, yg2min, yg2max that indicate the graph axis bounds.
+ Fixed bug in return value of user defined functions.
+ Fixed bug in loading of certain .tiff files that include alpha data (EXTRASAMPLE_UNASSALPHA).
+ Angstrom symbol \AA added.
+ Rewrote fopen/fread/fclose code based on new tokenizer.
+ Added "fgetline chan line$" to read an entire line from a line.
+ Added "ftokenizer chan commentchar spacetokens singletokens" to set up the tokenizer.
+ Added command line option -c that turns GLE into a calculator.
+ Added option -gs for fast GhostView previewing (by Axel Rohde) (only on Unix).
+ Added rgb255() and rgb() functions.
+ Added set arrowsize 0.5 arrowangle 30 to control shape of arrows.
+ Local variables can now be used in graph blocks.
+ Slope, Offset and R squared values of regression plots can be stored in global variables.
+ Removed dependency on BOOST library.
+
+4.0.8 (March, 2005)
+
+ One executable "gle" instead of one for each driver "gle_ps" and "gle_svg".
+ Output to .pdf/.png/.jpeg by linking to GhostScript.
+ Support for LaTeX expressions in GLE scripts using the command "tex" or the macro "\tex{}". (Examples can be found here.)
+ Support for bitmap import (.jpeg/.png/.tiff/.gif) using the commands "bitmap" and "bitmap_info". (An example can be found here.)
+ Options "impulses", "steps", "fsteps", and "hist" for the graph command "dn line".
+ Option "round" for the commands "box" and "begin box" to simplify drawing boxes with rounded corners.
+ Command "separator" in keys to construct keys with multiple columns.
+ Option "absolute" to the offset command to position the key, e.g., at the bottom-center of the output.
+ Function "format$" for formatting numbers (e.g., format$(1/3,"fix 3") = 0.333).
+ Option "format" to the axis graph command to format the labels in a similar way.
+ Functions "pagewidth()", "pageheight()", "width(name)", "height(name)", "pointx(name)", "pointy(name)".
+ Command "print" for writing to the command prompt.
+ Support for config file $GLE_TOP/glerc and $HOME/.glerc (on Unix).
+
+4.0.7 (December, 2003)
+
+ No more segmentation fault when encountering some types of errors.
+ Unix version can now handle dos text mode files, gle, makefmt and fbuild.
+
+4.0.6 (December, 2003)
+
+ Includes makefiles for OS/2.
+ Fix for slow rendering of long complex paths in postscript file. Speed now equivalent to 3.3h.
+ Tweak to exe and src release filenames i.e gle_version_[src,exe]_[platform]....
+ Exits gracefully when it cant open a file such as a data file in graph, image file, include file or using fopen.
+
+4.0.5 (November, 2003)
+
+ Fix unix/linux compile issues with afm files. They now have the proper line endings for Unix.
+ Fix compatability issue with 3.3h: ATN and ATAN now work equivalently. In 3.3h only ATN worked for arctangent?
+
+4.0.4 (November, 2003)
+
+ Fix unix/linux compile issues.
+ Will search c:\program files\gle (WINDOWS) or \usr\local\bin (UNIX) directories if GLE_TOP environment variable is not set.
+ Proper wildcard/globbing handling on UNIX (assumes shell does the expansion).
+ Minor improvement on file finding and error reporting.
+ Cleanup of unused functions and varibles in gle.cpp.
+ Windows binary now compressed with upx.
+
+4.0.3 (November, 2003)
+
+ Accepts filenames with wildcards/globbing i.e. "gle_ps *.gle" will compile all gle files in current directory.
+
+4.0.2
+
+ Fixed problem with program crashing when it couldn't open the gle file or include file.
+ New zip files of source code and win32 executables.
+
+4.0.1
+
+ Fixed problem with PATH and GLE_TOP not being set properly in installer. Fixed problem with loading include files from GLE_USRLIB.
+
+4.0.0
+
+ Code cleanup from 3.5.
+ Compiles with latest C++ compilers.
+ Has better error reporting where it prints out the line number and text associated with the line (even if the error was detected in an include file).
+ Removed ncurses dependancy.
+
+GLE 3.3g (14-May-1994)
+
+ Ported to ALPHA OSF/1, some bugs still exist though.
+ Merged changes made for gle32 and solaris and linux.
+
+GLE 3.3f (16-April-1993)
+
+ fixed bug on sun's with axis labelling.
+ dviprint -dsx Sixel graphics driver added to GLE DVIPRINT,
+ thanks to: Evan Wilson, N Z Dairy Group
+
+ Fixed RETURN statement so that it takes an optional parameter.
+ (It always did, but why it used to work I don't know as the
+ parameter wasn't optional)
+
+ Added a yaxis option
+ yaxis negate
+ This is reversed the numbering on the y axis. For use with
+ measurements below ground, where you want zero at the top and
+ positive numbers below the zero.
+
+GLE 3.3e (1-Jan-1993)
+
+ Fixed clipping of lines through a log axis.
+ Fixed help display which was loosing two lines on multi page
+ displays.
+
+GLE 3.3d
+
+ Problem with SMOOTH on SUN machines fixed.
+ fixed bug with named objects on postscript driver.
+ added -nops qalifier to dviprint.
+
+GLE 3.3c (1-Apr-1992)
+
+ Fixed problems with large datasets in surface and contour
+ Fixed problem with /kern/lower/movexy and other def's
+ Fixed bug with dviprint -depson -hires -nosquash
+ Fixed bug with smoothing contours which made lines dissappear.
+ (20-Sep-1992)
+ Fixed bug with UNTIL looping.
+ Removed limit of number of 'saved' points.
+ (1-Dec-1992)
+ Fixed tokenizer so "ab\"cdef" would accent the 'c' as expected.
+
+GLE 3.3b (25-Mar-1992)
+
+ Bigfile now accepts variables in place of the file name, e.g.
+ xxx$ = "test.dat,2,3"
+ d1 bigfile xxx$
+ Added AUTOSCALE option to bigfile e.g.:
+ d1 bifile a.dat line autoscale
+ This pre-reads the file to scale the axis, which is slow but
+ sometimes required.
+ Updated version of inittex.ini which was causing problems with
+ /char /def /movexy
+ UNIX: install.com now copies graph.idx into system area.
+ VMS: dviprint symbol added to CGLE_LOGIN.COM
+
+GLE 3.3a (27-Jan-1992)
+
+ Bug: lowercase xnames labels being mis-aligned is fixed.
+
+ Gle now writes out gletmp.t1 .t2 .t3 .t4 instead of .bak
+ so you have four backup versions if something crashes.
+
+ Fixed axis rounding errors for labels, e.g. .1 to .9 step .1
+ might occasionally stop at .8
+
+ Fixed filled boxes on DVIGLE driver, the filled region wasn't
+ being translated if a scale or rotate was being used.
+
+ Added commands:
+ fopen, fclose, fread, freadln, fwrite, fwriteln
+ E.G.:
+
+ fopen "file.dat" inchan read
+ fopen "file.out" outchan write
+ until feof(inchan)
+ fread inchan x y z
+ aline x y
+ rline x z
+ fwriteln outchan x*2 "y =" y
+ next
+ fclose inchan
+ fclose outchan
+
+ The following accents now work.
+ \` \' \v \u \= \^ \. \H \~ \"
+ e.g.
+ text P\'e ter
+
+GLE 3.2i (1-Jan-1992)
+
+ Improvements made to lstyle for dot matrix and laserjet drivers.
+ It now works!, patterns which don't divide into 32 bits and
+ dashlen are both supported. (Thanks to Frank Evans)
+
+ HPGL driver modified, now supports sizes greater than a3.
+ New symbols HPGL_ADDX, HPGL_ADDY add a margin to the plot.
+ These default to .9cm and 1.5cm
+
+ Bug in 'E' format numbers, 5e+7 was interpreted as 5+7 = 12
+ instead of 50,000,000 (5e7 was always interpreted correctly)
+
+GLE 3.2g (1-Nov-1991)
+
+ All bitmap dot matrix drivers have been re-written:
+
+ dvigle
+ dvilj, dvilj300, dviepson, dviep24
+
+ They now perform clipping and filling correctly, funny
+ glitches in filled characters (texcmr) have been fixed.
+
+ They also support a much wider range of fill styles
+
+ Print the file DVIFILL.GLE to see the supported fill
+ options.
+
+ The command syntax has changed, the commands:
+ dvilj, dvilj300, dviepson, dviep24
+
+ Have been replaced by:
+ dviprint -dlj
+ dviprint -dlj -hires (was dvilj300)
+ dviprint -depson
+ dviprint -depson -hires (was dviep24)
+
+ Support for HP-PaintJet printers
+ has been added:
+ dviprint -dpj
+
+ Usage: dviprint [-depson | -dlj] [-old] [-hires] [-debug] [-output xx.prt]
+ -depson To produce output for epson printers
+ -dwp To add tiff image to wp .eps file
+ -dlj To produce output for HP LaserJet printers
+ -dpj To produce output for HP PaintJet printers
+ -dover Overhead transparency mode for PaintJet
+ -old For old HP Laser Jet printers (no compression)
+ -hires Uses high resolution for that printer (slower)
+ -wide If your printer has a wide carriage
+ -noflip Disable's auto flipping
+ -nosquash Tries to print it full size
+ -compress Force internal bitmap compression (slow,saves memory)
+ -noff No form feed
+ -debug Prints debug messages
+ -out x.x Prints output to file instead of printer port
+
+ ...
+ 3d Bar graphs are now supported, the commands are:
+
+ bar d1,d2 3d .5 .3 side red,green notop
+ bar d3,d4 3d .5 .3 side red,green top black,white
+
+ Take note of comma's.
+
+ 3d (xoffset yoffset)
+ Specifies the x and y vector used to draw the receding
+ lines, they are defined as fractions of the width of the
+ bar.
+ A negative xoffset will draw the 3d bar on the left side
+ of the bar instead of the right hand side.
+
+ side (color list)
+ The color of the side of each of the bars in the group.
+
+ top (color list)
+ The color of the top part of the bar
+ notop
+ Turns off the top part of the bar, use this if you have
+ a stacked bar graph so you only need sides on the lower parts
+ of each stack.
+
+ Note: You won't see the color of the side or top on the pc screen.
+
+GLE 3.2 (6-Mar-1991)
+
+ File type changed from STREAM_LF to normal vax format.
+
+ SMOOTHM option added which is identical to SMOOTH but
+ will allow multi-valued functions. (e.g. circles etc)
+
+ TWIDTH("") and THEIGHT("") functions fixed again.
+
+V3.2b
+
+ DEFINE MARKER myname subnamex
+ MARKER myname
+ Allows you to define a new marker as any subroutine.
+
+ e.g. to define a character from the postscript ZapDingbats font
+ as a marker you would use.
+
+ sub subnamex size mdata
+ gsave ! save font and x,y
+ set just left font pszd hei size
+ t$ = "\char{102}"
+ rmove -twidth(t$)/2 -theight(t$)/2 ! Centers marker
+ write t$
+ grestore ! restores font and x,y
+ end sub
+
+ The second parameter can be supplied using the MDATA command
+ when drawing a graph, this gives the marker subroutine a
+ value from another dataset to use to draw the marker. For
+ example the marker could vary in size, or angle, with every
+ one plotted.
+ d3 MARKER myname MDATA d4
+
+ Encapsulated Postscript option modified so that WordPerfect
+ won't clip the edge of the drawing.
+
+ On a PC the /EPS qualifier will now create a file using
+ an extension of .EPS instead of .PS
+
+ DEFMARKER mname fontname char_num scale dx dy
+ This command defines a new marker, from any font, it is
+ automatically centered but can be adjusted using dx,dy.
+ e.g.
+ defmarker hand pszd 43 1 0 0
+
+ Bug in set color in PS devices which caused the
+ color to affect a previous line is fixed.
+
+ Added built in function which returns a string describing
+ the device. e.g. DEVICE$() = "HARDCOPY, PS,"
+ on the postscript driver.
+
+ This can be used to use particular fonts etc on appropriate
+ devices. E.g.:
+ if pos(device$(),"PS,",1)>0 then
+ set font psncsb
+ end if
+
+ POS(src$,search$,start) string function fixed (surprise surprise)
+
+ The editor now tolerates lines > 80 characters.
+
+ Fixed bug which caused incorrect characters to be drawn
+ on pc screen occasionally.
+
+V3.2c
+
+
+ Pressing ESC repeatedly will now abort a redraw operation. (on PC)
+
+ Load and Saveas will now default to .GLE
+
+ Bug with tex macro replacement fixed.
+
+ Bug with mouse cursor not appearing on HERC screens is fixed.
+
+ WPGLE.EXE added, this command will produce a special output
+ file which contains EPS for PostScript printers and a
+ crude bitmap for WordPerfect to display on the screen.
+
+V3.2e
+
+ Fixed some colour mapping and added, purple, orange, pink, brown.
+
+V3.2f
+
+ Modified maximum size of dvilj,dvilj300,dviepson,dviep24 so that
+ all can take graphs up to 19cm x 27cm
+
+ Added command line switches
+
+ /nod (add ^D to ps file)
+ /addd (Don't add ^D to ps file)
+ /nomaxpath (Don't choke on complex fill paths)
+ /fill (For dvibit, makes bar's filled instead of shaded)
+
+ Added symbol for PC.
+
+ GLE_NOCONTROLD TRUE
+ (Stops ^D being added to ps files)
+
+ (this is the default for unix)
+
+ The DCL symbol GLE_NOCONTROLD should be set to "TRUE" to kill the
+ ^D on vms systems.
+
+ If you set the DCL symbol GLE_EDITOR to TPU then you will get
+ TPU instead of EDT when you press ^E
+
+ You can now tell gle about postscript fonts that you have
+ downloaded into your own printer.
+
+ Lets pretend we are adding a font called Greek-Bold
+
+ 1) Download the font into you laser printer
+ 2) Add a line to FONT.DAT
+ psgb 86 psgb.fmt plsr.fve psgb.fmt
+ a b c d
+ a = GLE's name for the font
+ b = The next unused number in font.dat
+ c = The font metric file, this can be created using
+ makefmt from and adobe font metric file
+ (.afm) which you should have been supplied
+ with your font.
+ d = The font vector file, this is just a font that
+ that gle can use to draw your font on non
+ postscript devices.
+ 3) Add a line to psfont.dat
+ psgb Greek-Bold
+
+ This tells the postscript driver that this is a
+ font that the printer knows how to deal with.
+
+GLE 3.1e (1-Mar-1990)
+
+ Errbars will now work with the bigfile option.
+
+ x2ticks now come back on again if you turn the xaxis off and x2axis on
+ (The error bars distances cannot also be a bigfile)
+
+ if you use a let d1 = exp from 1 to 10000 step 1
+ with a log xaxis it doesn't produce a smooth line. GLE now
+ checks and if the xaxis is a LOG scale then it uses the
+ step option as an approximate required number of intervals which
+ it spreads along the xaxis in increasing steps.
+
+ In the graph module, if you use '0' as a column for the x data
+ of a bigfile GLE will generate xdata of 1,2,3,4 ...
+ e.g. d1 bigfile a.dat,0,2
+
+ Data separated with commas and no spaces was being read incorrectly
+ The data reading routine has been re-written. (introducing new
+ and more interesting bugs in the process)
+
+GLE 3.1d (19-Feb-1990)
+
+ In the past "TEXT a\delta b" would have produced a space
+ between the delta character and the letter b, this action
+ was incorrect and had been fixed.
+ Use "TEXT a\delta\ b" to get a space.
+
+ "TEXT a(\delta)b" also works now.
+
+GLE 3.1c
+
+ Built in functions twidth("") and theight("") now work.
+
+ Their is now a BIGFILE command for executing large gle files
+ that won't fit into memory using INCLUDE. (note this should
+ not be confused with the BIGFILE graph command).
+ e.g. BIGFILE NZMAP.GLE
+
+ As bigfile compiles and executes the gle file one line at a
+ time you cannot use multi line structures (subs, if then else etc)
+ but you can call subroutines if they are defined before the bigfile
+ statement.
+
+ Lines in bitmap drivers are now the right length (text looks better)
+
+ There is currently a limitation on the size of text or tables that
+ can be printed (this may be fixed at a later date)
+
+ The xg() and yg() functions now work if the graph has log axes
+
+ A bug which stopped the last line of a data file being
+ read had been fixed.
+
+ Correction to expression passing allows IF A$="ABC" THEN ... to work.
+
+ Added shading styles RSHADE, RSHADE1, RSHADE2 ...(Lines at right angles)
+
+GLE 3.1b
+
+ Fixed the circle fill command so it uses the right colour.
+
+ Modified PostScript arrows with wide lines so they look nice.
+ They are now filled triangles rather than two short lines.
+
+ There is now an example in BOXR.GLE which shows you how to
+ define a subroutine to draw boxes with rounded corners.
+
+ Horizontal error bars have been added, the commands are
+ HERR, HERRLEFT, HERRRIGHT, HERRWIDTH
+
+ If you had the same subroutine defined twice in a gle
+ file it would skip the intervening gle commands, this is fixed.
+
+ Arcto fixed for line devices (hpgl)
+
+ Stacked bargraphs should not contain missing values, replace
+ missing values with the value from the column on the left. e.g.
+ 1 22 * 45 becomes 1 22 22 45
+
+GLE 3.1a
+
+ Bug with reading exponential format numbers fixed.
+
+ Bigfile option added, so that you can extract particular
+ columns of data from a data file, e.g.
+ D1 LINE BIGFILE TEST.DAT,3,2
+ Will use column 3 for x values and column 2 for y values.
+
+ e.g.
+' data x.dat
+ d3 line
+ becomes
+ d3 line bigfile x.dat,1,4
+ As dataset three is made from columns 1 and 4.
+
+ The space codes (\: \; \,) are now proportional to the
+ current font size.
+
+ text \rule{2}{3} will draw a box, and \glass can be used
+ to offset text.
+
+GLE 3.1
+
+ Modified default DPOINTS setting so that if DTICKS is not a
+ whole number it will display one decimal point.
+ e.g. (1.0, 1.5, 2.0) instead of (1 1.5 2)
+
+ the "graph data d2=c3,c1" option now requires no spaces
+ within the "d1=c1,c2"
+
+ Begin path wasn't issuing a newpath, so multiple paths
+ got added together.
+
+ Gle files can now begin with a numeric character.
+
+ Bug with bitmap drivers fixed (dviepson, dvilj300 etc) which
+ resulted in a stray horizontal line on the page.
+
+ The editor doesn't display long lines correctly, it does
+ store them though.
+
+ On the PC the PSGLE driver now writes output files
+ to INPUTFILE.PS instead of out.ps e.g. bar.gle --> bar.ps
+
+ Added \linegap{-1} tex primitive to stop odd spaces lines
+ when using super/subscripts.
+ vscale and hscale were not being reset after each graph.
+
+
+ Some of the characters which were missing from the PLOTTER fonts
+ have now been installed (e.g. []{}<>% )
+
+ You can no add lines and text to a drawing using the mouse or arrow
+ keys on the PC version of gle.
+
+ There is now a graph command, FULLSIZE which sets
+ vscale,hscale to 1, and turns the border off.
+
+GLE 3.0h
+
+ Fixed bug with LSTYLE in PSGLE (on the pc only)
+
+ You can change the size of the default key by setting the
+ hei of text used to draw the key. e.g.
+ begin graph
+ ...
+ key hei 1.2
+ end graph
+
+ If the value of an error bar length is a missing value then that
+ particular bar won't be drawn.
+
+ If you escape out of the idiot graph creation menu it will now
+ correctly put an END GRAPH in your file.
+
+ Line and Grid shading has been added to the postscript
+ device driver, the following colour names are now accepted.
+
+ shade,shade1,shade2,shade3,shade4,shade5
+ grid,grid1,grid2,grid3,grid4,grid5
+
+ e.g. BAR 2 3 FILL GRID3
+
+ Print the example file SHADE.GLE on a postscript printer
+ and stick it on the wall for reference. ($ cgle shade /print)
+
+ Bug with changing diskdrives on a PC is fixed.
+
+ The fonts SSBI and SSI were reversed on the laser printer.
+
+ There is now an axis qualifier SHIFT for shifting the labelling
+ horizontally (when the label refers to the data between the
+ two ticks) e.g.
+ xaxis shift .4
+
+ In order to put a large space between two words you must
+ use these control sequences e.g. TEXT Hello \; world
+ \, = .1cm
+ \: = .2cm
+ \; = .4cm
+
+ Use \_ to get an underscore character inside text
+ ("_" normally means subscript)
+
+ Fixed X2AXIS SIDE ON
+
+ HPGL Plotter pens 1=black, 2=red, 3=green, 4=blue, 5=magenta, 6=white
+
+ Bug fixed in linestyles caused by the cap being set to ROUND which
+ merges the dashes together for wide lines on the laser printer.
+
+GLE 3.0g
+
+ Fixed bug with smoothing more that 200 points
+ Fixed bug with joining between saved objects.
+
+ When using the plotter fonts you may find some characters are missing,
+ e.g. %,[ and ] (These have now been put into these fonts V3.1)
+ The following command will replace these characters with latex equivalents.
+ size 24 18
+ text \chardef{%}{{\setfont{texcmr}\char{37}}}
+ text \chardef{[}{{\setfont{texcmr}\char{91}}}
+ text \chardef{]}{{\setfont{texcmr}\char{93}}}
+ ... rest of gle file
+
+GLE 3.0e (17-Sep-1990)
+
+ Missing values are not used to calculate new dataset values during
+ a let command (e.g. "let d3 = sin(d2)")
+
+ Fixed bug in LOG data display. (If you have used LOG axis prior to
+ this release you SHOULD replot your graphs)
+
+ The bigfile option now works with markers as well as lines.
+ (e.g. "d3 bigfile "year.dat" lstyle 1 marker dot ")
+
+ GLE 3.0d (5-Sep-1990)
+
+ The default labelling of axes is sometimes not ideal, for example
+ 0 0.333333 0.6666667 1.0
+ you can now adjust this with the command "XAXIS DPOINTS 3" which sets
+ the decimal places for an axis. e.g.
+ 0.000 0.3330.666 1.000
+
+ The MSCALE option now works.
+
+ Markers have been reduced in size, this will affect existing gle
+ files, they are now approx 60% of there original size.
+
+ The bigfile option now works on postscript printers, there was a bug
+ caused by sending an entire 10,000 point curve to the printer as one path
+ which it choked on if it was short of memory.
+
+ You will occasionally get an error message "PATH TOO COMPLEX" this means
+ that GLE decided to split up a line into shorter segments. Normally
+ this WARNING can be ignored.
+
+ The default axis labelling of 1, 1.5, 2 has been changed to 1.0, 1.5, 2.0
+ Exponent axis labelling has been fixed 2.00000e4 becomes 2.0e4
+
+ *** NEW DEVICE DRIVERS ***
+
+ GLE now supports the EPSON 8PIN and 24Pin printers, and the
+ HP deskjet/laserjet printers. To support bitmap devices which require
+ a large amount of memory GLE first writes a device independent file
+ OUT.DVI, you then run the bitmap driver for your printer and that prints
+ directly to LPT1: e.g.
+ C:\GLE> dvigle myfile (produces OUT.DVI)
+ C:\GLE> dviepson (creates bitmap and prints to lpt1)
+
+ The output options are:
+ C:\GLE> DVIEPSON Standard epson printer
+ C:\GLE> DVIEP24 24 Pin epson printers (180 dpi)
+ C:\GLE> DVILJ HP Laser jet, Desk jet (150 dpi)
+ C:\GLE> DVILJ300 HP Laser jet, Desk jet (300 dpi)
+ The hi resolution drivers are significantly slower (2-3 times) than the
+ low resolution drivers so would only be used for final copies.
+
+ By default the fonts (RM, RMB, SS, TT etc) will all map to PLSR (plotter
+ simplex roman) on both bitmap drivers and the HPGL driver.
+ If you want this to happen on other drivers then put the
+ command "PLOTTER FONTS" right after your SIZE command in your gle file.
+
+ An lwidth of .00001 on a laser printer will give you 1 pixel width lines.
+ (and won't occasionally round to two pixels)
+
+ Using Postscript and HP drivers on the PC:
+ C:\GLE\> PSGLE MYFILE.GLE (Writes myfile.ps)
+ C:\GLE\> HPGLE myfile.gle (Writes out.hp)
+
+ Making a 360K distribution diskette from the 1.2M diskette.
+ (if a: = 1.2Meg disk, b: = 360K disk)
+ a:> copy a:install.exe b:
+ a:> copy a:pkunzip.exe b:
+ a:> copy a:gle1.zip b:
+ a:> copy a:gle2.zip b:
+ a:> copy a:gle3.zip b:
+ a:> copy a:gle4.zip b:
+
+ To install GLE on a pc type:
+ C:\> a:install
+
+GLE 3.0c
+
+ Bug with LaTeX symbols in graph titles fixed.
+
+ Extra graph dataset qualifiers "BIGFILE and NOMISS"
+ NOMISS removes missing values from a dataset. (so disjointed lines
+ are re-connected) (e.g. "d3 colour red nomiss")
+ BIGFILE allows a very large dataset to be drawn on a PC, it doesn't
+ read the dataset into memory as usual. (but must be in a file
+ with only one dataset, and no BARS or markers can be drawn.
+ And axis ranges must be specified by hand.
+ (e.g. "d3 bigfile "year.dat" lstyle 1")
+
+ Fonts: The LaTeX greek font is missing from the small distribution disk.
+ It is now possible to copy on any missing font directly into the
+ c:\gle\font\ directory. Copy both the FMT and FVE files.
+ e.g. "texcmmi.fmt, texcmmi.fve"
+
+ set join mitre | round | bevel
+ set cap but | round | square
+
+ Fixed:
+ Superscript, Subscript
+ Symbols on Laser Printer after white fill.
+ Individual dataset scaling fixed.
+
+ Notes on new Drivers: HPGL, TEK4010, P79.
+ HPGL: With this driver you can define the symbols
+ hpgl_open, hpgl_close to be the escape
+ sequences required for strange hp printers.
+ also HPGL_WIDTH, and HPGL_HEIGHT for non A3 plotters
+
+ TEK: TEK_OPEN and TEK_CLOSE can be defined to allow
+ non dec tektronix terminals, e.g. TEK_OPEN = "^[?38h"
+
+ (this is normally done in CGLECMD.COM so that when you specify
+ /DEV=V550, OR /DEV=HPA4 it defines the symbols for you.
+
+ On the vax the following cgle dev qualifiers are valid:
+
+ cgle myfile.gle /dev=vdisk,v550,hpgl,tek
+ Plus any P79 supported device, your output file will be MYFILE.HPGL
+
+GLE 3.0b
+
+ 2) Currently supported devices:
+ PC version:
+ HERC, EGA, CGA, etc (any BGI supported display)
+ PostScript
+ VAX version:
+ REGIS(VT125,VT240,VT340 etc)
+ UIS (Workstations running VWS software)
+ PostScript
+ (additions to this list lower down)
+ 3) Fonts:
+ The PC version comes on one 360K floppy, on this disk is a
+ subset of fonts, if you use a font that isn't on this disk
+ it will use a replacement font, and replacement metrics so
+ the size of the text may be misleading.
+ If you have enough disk space (another 1Meg) then you can
+ install the complete font set.
+
+ 4) PostScript:
+ The PSGLE driver is not on the 360K Floppy, you must install
+ it separately if you have enough disk space (another 400K)
+ (or copy gle and data files to a VAX and use the vax
+ PS driver)
+
+ 5) Using GLE on a VT100/VT240
+ If your keyboard doesn't have function keys (f9-f14) then you
+ can use GOLD 1-4 (for 11-14) and GOLD 0 (for f10) and
+ GOLD 9 (for F9) GOLD 5 (show errors)
+
+ If you run GLE on a vt100 it will work OK but not actually DRAW
+ anything on the screen (as it thinks it's a vt240)
+
+ 6) Other keyboard features:
+ ^F will toggle between fast and slow (but nicer text) on some devices
+ ^E will call VAX/EDT
+ ^Z Exits from all menu's etc (like ESC on a PC)
+ ALT-X Exits on a PC without asking you for confirmation.
+
+ 7) There are currently no drivers for Plotters or DotMatrix Printers,
+ these are planned for the next month or two (see update notices below)
+
+ 8) Additions:
+ The command "SET FONTLWIDTH value" has been added, this allows
+ the line width of stroked fonts to be changed.
diff --git a/LICENSE.txt b/LICENSE.txt
new file mode 100644
index 0000000..c43a0cc
--- /dev/null
+++ b/LICENSE.txt
@@ -0,0 +1,1831 @@
+GLE License
+-----------
+
+GLE is licensed under the Modified BSD license.
+
+GLE comes with a user interface QGLE. QGLE is licensed under the GNU General
+Public License (GPL) as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+Some files distributed with GLE/QGLE are available under a different license.
+Detailed license information for each file can be found at the bottom of this
+document.
+
+License for GLE (Modified BSD)
+------------------------------
+
+Copyright (C) 2009 GLE.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+
+ 3. The name of the author may not be used to endorse or promote products
+derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+
+License for QGLE (GPL v2 or later)
+----------------------------------
+
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
+
+License for QGS (LGPL v2.1)
+---------------------------
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
+
+=====================================================================================
+== License information for each file
+=====================================================================================
+
+*** Modified BSD License ***
+
+LICENSE.txt
+Makefile.gcc
+Makefile.in
+Makefile.os2
+Makefile.vc
+README.txt
+config.aconf
+config.gcc
+config.i
+config.os2
+config.vc
+configure
+configure.ac
+contrib/editors/highlighting/gle.nedit
+contrib/editors/highlighting/gle.stx
+contrib/editors/highlighting/vim/ftplugin/gle.vim
+contrib/editors/highlighting/vim/indent/gle.vim
+contrib/editors/highlighting/vim/syntax/gle.vim
+contrib/packagers/nsis/banner_image.bmp
+contrib/packagers/nsis/gle.nsi
+contrib/packagers/nsis/welcome_image.bmp
+contrib/packagers/nsis/www.ico
+gle-refman/Makefile.gcc
+gle-refman/Makefile.os2
+gle-refman/advanced/advanced.tex
+gle-refman/advanced/fig/Makefile.gcc
+gle-refman/advanced/fig/Makefile.os2
+gle-refman/advanced/fig/gc_clip.gle
+gle-refman/advanced/fig/gc_join.gle
+gle-refman/advanced/fig/house.gle
+gle-refman/advanced/fig/join.gle
+gle-refman/advanced/fig/texgraph.gle
+gle-refman/advanced/fig/texgraph.tex
+gle-refman/appendix/appendix.tex
+gle-refman/appendix/fig/Makefile.gcc
+gle-refman/appendix/fig/Makefile.os2
+gle-refman/appendix/fig/ap_fonts.gle
+gle-refman/appendix/fig/ap_marker.gle
+gle-refman/appendix/fig/clip.gle
+gle-refman/appendix/fig/color_list_svg.gle
+gle-refman/appendix/fig/color_sample.gle
+gle-refman/appendix/fig/fonttes2.gle
+gle-refman/appendix/fig/fonttest.gle
+gle-refman/appendix/fig/join.gle
+gle-refman/appendix/fig/loop.gle
+gle-refman/appendix/fig/nzmap.gle
+gle-refman/appendix/fig/showfont.gle
+gle-refman/appendix/fig/single.dat
+gle-refman/appendix/fig/single.gle
+gle-refman/appendix/fig/stack1.gle
+gle-refman/appendix/fig/stack2.gle
+gle-refman/appendix/fig/stack4b.gle
+gle-refman/appendix/fig/t.gle
+gle-refman/appendix/fig/test.dat
+gle-refman/appendix/fig/test4.dat
+gle-refman/appendix/fig/title.gle
+gle-refman/appendix/fig/title32.gle
+gle-refman/appendix/fig/tut_slide.gle
+gle-refman/appendix/fig/wall.gle
+gle-refman/appendix/fig/xend.gle
+gle-refman/appendix/fig/ziptext.gle
+gle-refman/appendix/sm_clip.tex
+gle-refman/appendix/sm_fonttables.tex
+gle-refman/appendix/sm_join.tex
+gle-refman/appendix/sm_loop.tex
+gle-refman/appendix/sm_single.tex
+gle-refman/appendix/sm_stack1.tex
+gle-refman/appendix/sm_stack2.tex
+gle-refman/appendix/sm_stack4b.tex
+gle-refman/appendix/sym.tex
+gle-refman/cmd.sty
+gle-refman/fonttest/Makefile.gcc
+gle-refman/fonttest/font-table.gle
+gle-refman/fonttest/fonts.csv
+gle-refman/fonttest/fonttab.tex
+gle-refman/fonttest/ncleanfonts.pl
+gle-refman/fonttest/ndofonts.pl
+gle-refman/gle-manual.tex
+gle-refman/graph/fig/Makefile.gcc
+gle-refman/graph/fig/Makefile.os2
+gle-refman/graph/fig/age.csv
+gle-refman/graph/fig/age.gle
+gle-refman/graph/fig/fitlin.dat
+gle-refman/graph/fig/gc_axes.gle
+gle-refman/graph/fig/gc_axisall.gle
+gle-refman/graph/fig/gc_bargraph1.gle
+gle-refman/graph/fig/gc_bargraph2.gle
+gle-refman/graph/fig/gc_bargraph_3d.gle
+gle-refman/graph/fig/gc_bean.dat
+gle-refman/graph/fig/gc_err.gle
+gle-refman/graph/fig/gc_fill.dat
+gle-refman/graph/fig/gc_fillgraph.gle
+gle-refman/graph/fig/gc_fit.gle
+gle-refman/graph/fig/gc_graphscale.gle
+gle-refman/graph/fig/gc_horizbar.csv
+gle-refman/graph/fig/gc_horizbar.gle
+gle-refman/graph/fig/gc_let.gle
+gle-refman/graph/fig/gc_loglabels.gle
+gle-refman/graph/fig/gc_logsubticks.gle
+gle-refman/graph/fig/gc_mathmode.gle
+gle-refman/graph/fig/gc_names.gle
+gle-refman/graph/fig/gc_nomiss.gle
+gle-refman/graph/fig/linemode.gle
+gle-refman/graph/fig/noisysine.gle
+gle-refman/graph/fig/normal.csv
+gle-refman/graph/fig/normal.gle
+gle-refman/graph/fig/test.dat
+gle-refman/graph/graph.tex
+gle-refman/key/fig/Makefile.gcc
+gle-refman/key/fig/Makefile.os2
+gle-refman/key/fig/grkey.gle
+gle-refman/key/fig/k_key.gle
+gle-refman/key/fig/keypos.gle
+gle-refman/key/fig/multicolkey.gle
+gle-refman/key/key.tex
+gle-refman/obsolete/fonts.tex
+gle-refman/obsolete/gle32.tex
+gle-refman/obsolete/obsolete.tex
+gle-refman/obsolete/sm_gle32_prog.tex
+gle-refman/obsolete/sm_gle32_tut.tex
+gle-refman/obsolete/symbols.tex
+gle-refman/primitives/cmds.tex
+gle-refman/primitives/fig/Makefile.gcc
+gle-refman/primitives/fig/Makefile.os2
+gle-refman/primitives/fig/curve.gle
+gle-refman/primitives/fig/fullpage.gle
+gle-refman/primitives/fig/gc_arc.gle
+gle-refman/primitives/fig/gc_arcto.gle
+gle-refman/primitives/fig/gc_arrstyle.gle
+gle-refman/primitives/fig/gc_beginbox.gle
+gle-refman/primitives/fig/gc_bezier.gle
+gle-refman/primitives/fig/gc_cap.gle
+gle-refman/primitives/fig/gc_color.gle
+gle-refman/primitives/fig/gc_curve.gle
+gle-refman/primitives/fig/gc_fontlwidth.gle
+gle-refman/primitives/fig/gc_for.gle
+gle-refman/primitives/fig/gc_justify.gle
+gle-refman/primitives/fig/gc_ljoin.gle
+gle-refman/primitives/fig/gc_lstyle.gle
+gle-refman/primitives/fig/gc_marker.gle
+gle-refman/primitives/fig/gc_nonzero.gle
+gle-refman/primitives/fig/gc_rot1.gle
+gle-refman/primitives/fig/gc_rot2.gle
+gle-refman/primitives/fig/gc_table.gle
+gle-refman/primitives/fig/gc_text.gle
+gle-refman/primitives/fig/gc_write.gle
+gle-refman/primitives/fig/gc_xend.gle
+gle-refman/primitives/fig/grids.gle
+gle-refman/primitives/fig/setcolor.gle
+gle-refman/prog/fig/Makefile.gcc
+gle-refman/prog/fig/axisformat.gle
+gle-refman/prog/prog.tex
+gle-refman/script/manual.gle
+gle-refman/title/Makefile.gcc
+gle-refman/title/Makefile.os2
+gle-refman/title/glelogo.gle
+gle-refman/title/sm_special.tex
+gle-refman/title/title.tex
+gle-refman/tutorial/fig/Makefile.gcc
+gle-refman/tutorial/fig/Makefile.os2
+gle-refman/tutorial/fig/tut.dat
+gle-refman/tutorial/fig/tut3.dat
+gle-refman/tutorial/fig/tut_graph.gle
+gle-refman/tutorial/fig/tut_graph2.gle
+gle-refman/tutorial/fig/tut_graph3.gle
+gle-refman/tutorial/fig/tut_simple.gle
+gle-refman/tutorial/fig/year-2000.csv
+gle-refman/tutorial/fig/year-2001.csv
+gle-refman/tutorial/tutorial.tex
+gle-refman/utilities/contour.tex
+gle-refman/utilities/fig/Makefile.gcc
+gle-refman/utilities/fig/Makefile.os2
+gle-refman/utilities/fig/fitls.dat
+gle-refman/utilities/fig/fitls.gle
+gle-refman/utilities/fig/fitz.dat
+gle-refman/utilities/fig/fitz1.gle
+gle-refman/utilities/fig/fitz1/fitz1.big
+gle-refman/utilities/fig/fitz1/fitz1.dat
+gle-refman/utilities/fig/fitz1/fitz1.sur
+gle-refman/utilities/fig/fitz1/fitz1.z
+gle-refman/utilities/fig/gaussian.gle
+gle-refman/utilities/fig/jack.gle
+gle-refman/utilities/fig/jack/jack.big
+gle-refman/utilities/fig/jack/jack.let
+gle-refman/utilities/fig/jack/jack.sur
+gle-refman/utilities/fig/jack/jack.z
+gle-refman/utilities/fig/saddle-contour.gle
+gle-refman/utilities/fig/saddle.gle
+gle-refman/utilities/fig/saddle/saddle.big
+gle-refman/utilities/fig/saddle/saddle.let
+gle-refman/utilities/fig/saddle/saddle.sur
+gle-refman/utilities/fig/saddle/saddle.z
+gle-refman/utilities/fig/surf/surf1.big
+gle-refman/utilities/fig/surf/surf1.sur
+gle-refman/utilities/fig/surf/surf1.z
+gle-refman/utilities/fig/surf/surf2.big
+gle-refman/utilities/fig/surf/surf2.sur
+gle-refman/utilities/fig/surf/surf3.big
+gle-refman/utilities/fig/surf/surf3.dat
+gle-refman/utilities/fig/surf/surf3.sur
+gle-refman/utilities/fig/surf/surf4.big
+gle-refman/utilities/fig/surf/surf4.sur
+gle-refman/utilities/fig/surf/surf5.big
+gle-refman/utilities/fig/surf/surf5.sur
+gle-refman/utilities/fig/surf/surf5b.big
+gle-refman/utilities/fig/surf/surf5b.sur
+gle-refman/utilities/fig/surf1.gle
+gle-refman/utilities/fig/surf2.gle
+gle-refman/utilities/fig/surf3.gle
+gle-refman/utilities/fig/surf4.gle
+gle-refman/utilities/fig/surf5.gle
+gle-refman/utilities/fig/surf5b.gle
+gle-refman/utilities/fig/volcano.gle
+gle-refman/utilities/fig/volcano.z
+gle-refman/utilities/fig/xyz.gle
+gle-refman/utilities/fig/xyz/xyz.big
+gle-refman/utilities/fig/xyz/xyz.dat
+gle-refman/utilities/fig/xyz/xyz.key
+gle-refman/utilities/fig/xyz/xyz.lab
+gle-refman/utilities/fig/xyz/xyz.sur
+gle-refman/utilities/fig/xyz/xyz.z
+gle-refman/utilities/fitls.tex
+gle-refman/utilities/fitz.tex
+gle-refman/utilities/letz.tex
+gle-refman/utilities/manip.tex
+gle-refman/utilities/surface.tex
+platform/autoconf/gle-graphics.pc.in
+platform/autopackage/gle.desktop
+platform/autopackage/gle.gle
+platform/autopackage/gle.png
+platform/autopackage/gle.xml
+platform/autopackage/gle4.apspec.in
+platform/autopackage/qt-replace.pl
+platform/script/checkdos
+platform/script/checklicense.pl
+platform/script/collectsrcfiles.pl
+platform/script/correctfilemodes.pl
+platform/script/dosperc
+platform/script/install_qgle_mac
+platform/script/killspace
+platform/script/killtrailspace.pl
+platform/script/licenses.csv
+platform/script/makesnapshot.pl
+platform/script/srcfiles.csv
+src/TeX/Makefile.gcc
+src/TeX/Makefile.in
+src/TeX/Makefile.os2
+src/TeX/Makefile.vc
+src/TeX/init.tex
+src/TeX/makeinittex.cmd
+src/config.h.in
+src/config.h.os2
+src/config_noauto.h
+src/doc/gle.1.in
+src/fbuild/Makefile.gcc
+src/fbuild/Makefile.in
+src/fbuild/Makefile.os2
+src/fbuild/Makefile.vc
+src/fbuild/basicconf.h
+src/fbuild/fbuild.cpp
+src/fbuild/files.txt
+src/fbuild/token.cpp
+src/fbuild/token.h
+src/fonts/LICENSE-FONTS.txt
+src/fonts/Makefile.gcc
+src/fonts/Makefile.os2
+src/fonts/Makefile.vc
+src/fonts/adobestd.enc
+src/fonts/checkfonts.pl
+src/fonts/font.dat
+src/fonts/glemark.afm
+src/fonts/glemark.gle
+src/fonts/psfont.dat
+src/fonts/texstd.enc
+src/gle/Makefile.gcc
+src/gle/Makefile.in
+src/gle/Makefile.os2
+src/gle/Makefile.vc
+src/gle/all.h
+src/gle/axis.cpp
+src/gle/axis.h
+src/gle/b_tab.cpp
+src/gle/b_text.cpp
+src/gle/basicconf.h
+src/gle/begin.cpp
+src/gle/begin.h
+src/gle/bitmap/Makefile.gcc
+src/gle/bitmap/Makefile.in
+src/gle/bitmap/Makefile.os2
+src/gle/bitmap/Makefile.vc
+src/gle/bitmap/ascii85.cpp
+src/gle/bitmap/files.txt
+src/gle/bitmap/glegif.cpp
+src/gle/bitmap/glegif.h
+src/gle/bitmap/glejpeg.cpp
+src/gle/bitmap/glepng.cpp
+src/gle/bitmap/gletiff.cpp
+src/gle/bitmap/img2ps.cpp
+src/gle/bitmap/img2ps.h
+src/gle/bitmap/lzwencode.h
+src/gle/cmdline.cpp
+src/gle/cmdline.h
+src/gle/color.cpp
+src/gle/color.h
+src/gle/config.cpp
+src/gle/config.h
+src/gle/core.cpp
+src/gle/core.h
+src/gle/curve.cpp
+src/gle/cutils.cpp
+src/gle/cutils.h
+src/gle/d_cairo.cpp
+src/gle/d_dummy.cpp
+src/gle/d_interface.h
+src/gle/d_ps.cpp
+src/gle/d_svg.cpp
+src/gle/d_x.cpp
+src/gle/drawit.cpp
+src/gle/drawit.h
+src/gle/eval.cpp
+src/gle/f2c.h
+src/gle/file_io.cpp
+src/gle/file_io.h
+src/gle/files.txt
+src/gle/fitbez.cpp
+src/gle/fitcf.cpp
+src/gle/fitcf.h
+src/gle/fn.cpp
+src/gle/fn.h
+src/gle/font.cpp
+src/gle/font.h
+src/gle/general.cpp
+src/gle/gle-base.cpp
+src/gle/gle-datatype.cpp
+src/gle/gle-interface.cpp
+src/gle/gle-interface/gle-base.h
+src/gle/gle-interface/gle-const.h
+src/gle/gle-interface/gle-datatype.h
+src/gle/gle-interface/gle-interface.h
+src/gle/gle-interface/gle-sourcefile.h
+src/gle/gle-sourcefile.cpp
+src/gle/gle.cpp
+src/gle/glearray.cpp
+src/gle/glearray.h
+src/gle/glec.cpp
+src/gle/glepro.h
+src/gle/gprint.cpp
+src/gle/gprint.h
+src/gle/graph.cpp
+src/gle/graph.h
+src/gle/graph2.cpp
+src/gle/justify.h
+src/gle/key.cpp
+src/gle/key.h
+src/gle/keyword.cpp
+src/gle/keyword.h
+src/gle/leastsq.cpp
+src/gle/leastsq.h
+src/gle/letzfitz/Makefile.gcc
+src/gle/letzfitz/Makefile.in
+src/gle/letzfitz/Makefile.os2
+src/gle/letzfitz/Makefile.vc
+src/gle/letzfitz/f2c.h
+src/gle/letzfitz/ffit.cpp
+src/gle/letzfitz/files.txt
+src/gle/letzfitz/fit.cpp
+src/gle/letzfitz/let.cpp
+src/gle/mem_limits.h
+src/gle/memory.cpp
+src/gle/mychar.cpp
+src/gle/numberformat.cpp
+src/gle/numberformat.h
+src/gle/op_def.cpp
+src/gle/op_def.h
+src/gle/pass.cpp
+src/gle/pass.h
+src/gle/polish.cpp
+src/gle/polish.h
+src/gle/run.cpp
+src/gle/run.h
+src/gle/savgol.cpp
+src/gle/glebtool.cpp
+src/gle/sub.cpp
+src/gle/sub.h
+src/gle/surface/Makefile.gcc
+src/gle/surface/Makefile.in
+src/gle/surface/Makefile.os2
+src/gle/surface/Makefile.vc
+src/gle/surface/f2c.h
+src/gle/surface/fcontour.cpp
+src/gle/surface/ffitcontour.cpp
+src/gle/surface/files.txt
+src/gle/surface/gcontour.cpp
+src/gle/surface/gsurface.cpp
+src/gle/surface/gsurface.h
+src/gle/surface/hide.cpp
+src/gle/surface/vdevice.cpp
+src/gle/surface/vdevice.h
+src/gle/tex.cpp
+src/gle/tex.h
+src/gle/texinterface.cpp
+src/gle/texinterface.h
+src/gle/token.cpp
+src/gle/token.h
+src/gle/tokens/BinIO.cpp
+src/gle/tokens/BinIO.h
+src/gle/tokens/CharBitMap.h
+src/gle/tokens/Makefile.gcc
+src/gle/tokens/Makefile.in
+src/gle/tokens/Makefile.os2
+src/gle/tokens/Makefile.vc
+src/gle/tokens/RefCount.h
+src/gle/tokens/StringKeyHash.cpp
+src/gle/tokens/StringKeyHash.h
+src/gle/tokens/Tokenizer.cpp
+src/gle/tokens/Tokenizer.h
+src/gle/tokens/Tokenizer.i
+src/gle/tokens/files.txt
+src/gle/tokens/stokenizer.h
+src/gle/var.cpp
+src/gle/var.h
+src/lib/Makefile.gcc
+src/lib/Makefile.os2
+src/lib/barstyles.gle
+src/lib/color.gle
+src/lib/compat/colors-gle-4.0.12.gle
+src/lib/compatibility.gle
+src/lib/contour.gle
+src/lib/ellipse.gle
+src/lib/feyn.gle
+src/lib/graphutil.gle
+src/lib/piesub.gle
+src/lib/polarplot.gle
+src/lib/shape.gle
+src/lib/simpletree.gle
+src/lib/stm.gle
+src/lib/tree.gle
+src/lib/ziptext.gle
+src/makefmt/Makefile.gcc
+src/makefmt/Makefile.in
+src/makefmt/Makefile.os2
+src/makefmt/Makefile.vc
+src/makefmt/basicconf.h
+src/makefmt/files.txt
+src/makefmt/makefmt.cpp
+src/makefmt/parseAFM.diff
+src/manip/Makefile.dj
+src/manip/Makefile.gcc
+src/manip/Makefile.in
+src/manip/Makefile.os2
+src/manip/all.h
+src/manip/cell.cpp
+src/manip/cell.h
+src/manip/cmd.cpp
+src/manip/cmd.h
+src/manip/color.h
+src/manip/cursesscr.cpp
+src/manip/edt.h
+src/manip/eval.cpp
+src/manip/eval.h
+src/manip/ffblk_def.h
+src/manip/filemenu.cpp
+src/manip/filemenu.h
+src/manip/files.txt
+src/manip/fn.cpp
+src/manip/general.cpp
+src/manip/keyword.cpp
+src/manip/keyword.h
+src/manip/manip.cpp
+src/manip/manip.h
+src/manip/manip.hlp
+src/manip/mjl.cpp
+src/manip/mjl.h
+src/manip/mscreen.h
+src/manip/mygraph.h
+src/manip/nofnkeys.h
+src/manip/polish.cpp
+src/manip/sub.cpp
+src/manip/test.dat
+src/manip/token.cpp
+src/manip/unix_extra.cpp
+src/manip/unix_extra.h
+src/manip/unixinkey.cpp
+src/manip/unixscr.cpp
+src/manip/var.cpp
+src/manip/varargs.cpp
+src/manip/vaxconio.h
+src/manip/vaxinkey.cpp
+src/samples/Makefile.gcc
+src/samples/Makefile.os2
+src/samples/Makefile.vc
+src/samples/qgle_keyboard.gle
+src/samples/sample.gle
+src/samples/sample_compare.eps
+
+=====================================================================================
+
+*** LGPL v2.1 or later ***
+
+src/gui/qgs.cpp
+src/gui/qgs.h
+
+=====================================================================================
+
+*** GPL v2 or later ***
+
+contrib/editors/highlighting/gle-emacs.el
+platform/autoconf/config.guess
+platform/autoconf/config.sub
+src/gui/MakefileAC.in
+src/gui/about.cpp
+src/gui/about.h
+src/gui/about.html
+src/gui/amove.cpp
+src/gui/amove.h
+src/gui/arc.cpp
+src/gui/arc.h
+src/gui/circle.cpp
+src/gui/circle.h
+src/gui/colourbutton.cpp
+src/gui/colourbutton.h
+src/gui/colourpicker.cpp
+src/gui/colourpicker.h
+src/gui/component.cpp
+src/gui/component.h
+src/gui/consolewindow.cpp
+src/gui/consolewindow.h
+src/gui/dialogues.cpp
+src/gui/dialogues.h
+src/gui/downloader.cpp
+src/gui/downloader.h
+src/gui/doxyfile
+src/gui/drawingobject.cpp
+src/gui/drawingobject.h
+src/gui/ellipse.cpp
+src/gui/ellipse.h
+src/gui/fileinfo.cpp
+src/gui/fileinfo.h
+src/gui/gledrawing.cpp
+src/gui/gledrawing.h
+src/gui/glegs.cpp
+src/gui/gpl.txt
+src/gui/grid.cpp
+src/gui/grid.h
+src/gui/images/amove.png
+src/gui/images/arc_3p.png
+src/gui/images/circle.png
+src/gui/images/edit_mode.png
+src/gui/images/editor.png
+src/gui/images/ellipse.png
+src/gui/images/ellipsis.png
+src/gui/images/gle.icns
+src/gui/images/gle.ico
+src/gui/images/gle.png
+src/gui/images/gle_shadow.png
+src/gui/images/gle_icon.png
+src/gui/images/grid.png
+src/gui/images/grid_snap.png
+src/gui/images/line.png
+src/gui/images/new.png
+src/gui/images/open.png
+src/gui/images/orthosnap.png
+src/gui/images/osnap.png
+src/gui/images/perp_line.png
+src/gui/images/pointer.png
+src/gui/images/polarsnap.png
+src/gui/images/polartrack.png
+src/gui/images/preview_mode.png
+src/gui/images/reload.png
+src/gui/images/reload_red.png
+src/gui/images/save.png
+src/gui/images/tan_line.png
+src/gui/images/text.png
+src/gui/images/varyingcolours.png
+src/gui/images/zoom_in.png
+src/gui/images/zoom_out.png
+src/gui/line.cpp
+src/gui/line.h
+src/gui/macspecific.cpp
+src/gui/main.cpp
+src/gui/mainwindow.cpp
+src/gui/mainwindow.h
+src/gui/newfile.cpp
+src/gui/newfile.h
+src/gui/objectblocks.cpp
+src/gui/objectblocks.h
+src/gui/polararray.cpp
+src/gui/polararray.h
+src/gui/propertyeditor.cpp
+src/gui/propertyeditor.h
+src/gui/propertymodel.cpp
+src/gui/propertymodel.h
+src/gui/qgle.pro.in
+src/gui/qgle.qrc
+src/gui/qgle.rc
+src/gui/qgle_definitions.h
+src/gui/qgle_statics.cpp
+src/gui/qgle_statics.h
+src/gui/qgslibloader.cpp
+src/gui/readme.txt
+src/gui/serverthread.cpp
+src/gui/serverthread.h
+src/gui/settings.cpp
+src/gui/settings.h
+src/gui/settings_dialogue.cpp
+src/gui/settings_dialogue.h
+src/gui/snapline.cpp
+src/gui/snapline.h
+src/gui/start-qgle.sh
+src/gui/text.cpp
+src/gui/text.h
+src/gui/variantdelegate.cpp
+src/gui/variantdelegate.h
+
+=====================================================================================
+
+*** GPL v2 ***
+
+# The files in this directory were taken from GPL GhostScript 8.54
+# This is the relevant license information:
+#
+# The files in the src, lib, toolbin, examples, doc and man
+# directories (folders) and any subdirectories (sub-folders)
+# thereof are part of GPL Ghostscript.
+#
+# The files in the Resource directory and any subdirectories thereof
+# are also part of GPL Ghostscript, with the explicit exception of
+# the files in the CMap subdirectory. The CMap files are copyright
+# Adobe Systems Incorporated and covered by a separate license
+# which permits only verbatim distribution.
+#
+# GPL Ghostscript is free software; you can redistribute it and/or
+# modify it under the terms of version 2 of the GNU General Public
+# License as published by the Free Software Foundation.
+#
+# GPL Ghostscript is distributed in the hope that it will be
+# useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+# of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program so you can know your rights and responsibilities.
+# It should be in a file named doc/COPYING. If not, write to the
+# Free Software Foundation, Inc., 59 Temple Place Suite 330, Boston, MA
+# 02111-1307, USA.
+
+src/gui/gsinc/LICENSE
+src/gui/gsinc/gdevdsp.h
+src/gui/gsinc/gscdefs.h
+src/gui/gsinc/iapi.h
+src/gui/gsinc/ierrors.h
+
+=====================================================================================
+
+*** ZLIB/LIBPNG License ***
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; ;;
+;; * All NSIS source code, plug-ins, documentation, examples, header files and graphics, ;;
+;; with the exception of the compression modules and where otherwise noted, are licensed ;;
+;; under the zlib/libpng license. ;;
+;; ;;
+;; ZLIB/LIBPNG LICENSE ;;
+;; ------------------- ;;
+;; ;;
+;; This software is provided 'as-is', without any express or implied warranty. In no ;;
+;; event will the authors be held liable for any damages arising from the use of this ;;
+;; software. ;;
+;; ;;
+;; Permission is granted to anyone to use this software for any purpose, including ;;
+;; commercial applications, and to alter it and redistribute it freely, subject to the ;;
+;; following restrictions: ;;
+;; ;;
+;; 1. The origin of this software must not be misrepresented; you must not claim that you ;;
+;; wrote the original software. If you use this software in a product, an acknowledgment ;;
+;; in the product documentation would be appreciated but is not required. ;;
+;; ;;
+;; 2. Altered source versions must be plainly marked as such, and must not be ;;
+;; misrepresented as being the original software. ;;
+;; ;;
+;; 3. This notice may not be removed or altered from any source distribution. ;;
+;; ;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+contrib/packagers/nsis/AddToPath.nsi
+
+=====================================================================================
+
+*** X11 License ***
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+# FSF changes to this file are in the public domain.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.
+
+platform/autoconf/install-sh
+
+=====================================================================================
+
+*** Adobe Core 35 AFM Files ***
+
+# Adobe Core 35 AFM Files with 314 Glyph Entries - ReadMe
+#
+# This file and the 35 PostScript(R) AFM files it
+# accompanies may be used, copied, and distributed for any purpose and
+# without charge, with or without modification, provided that all
+# copyright notices are retained; that the AFM files are not
+# distributed without this file; that all modifications to this file
+# or any of the AFM files are prominently noted in the modified
+# file(s); and that this paragraph is not modified. Adobe Systems has
+# no responsibility or obligation to support the use of the AFM
+# files.
+
+src/fonts/Adobe-Core35_AFMs-314/Courier-Bold.afm
+src/fonts/Adobe-Core35_AFMs-314/Courier-BoldOblique.afm
+src/fonts/Adobe-Core35_AFMs-314/Courier-Oblique.afm
+src/fonts/Adobe-Core35_AFMs-314/Courier.afm
+src/fonts/Adobe-Core35_AFMs-314/Helvetica-Bold.afm
+src/fonts/Adobe-Core35_AFMs-314/Helvetica-BoldOblique.afm
+src/fonts/Adobe-Core35_AFMs-314/Helvetica-Narrow.afm
+src/fonts/Adobe-Core35_AFMs-314/Helvetica-NarrowBold.afm
+src/fonts/Adobe-Core35_AFMs-314/Helvetica-NarrowBoldOblique.afm
+src/fonts/Adobe-Core35_AFMs-314/Helvetica-NarrowOblique.afm
+src/fonts/Adobe-Core35_AFMs-314/Helvetica-Oblique.afm
+src/fonts/Adobe-Core35_AFMs-314/Helvetica.afm
+src/fonts/Adobe-Core35_AFMs-314/ITCAvantGarde-Book.afm
+src/fonts/Adobe-Core35_AFMs-314/ITCAvantGarde-BookOblique.afm
+src/fonts/Adobe-Core35_AFMs-314/ITCAvantGarde-Demi.afm
+src/fonts/Adobe-Core35_AFMs-314/ITCAvantGarde-DemiOblique.afm
+src/fonts/Adobe-Core35_AFMs-314/ITCBookman-Demi.afm
+src/fonts/Adobe-Core35_AFMs-314/ITCBookman-DemiItalic.afm
+src/fonts/Adobe-Core35_AFMs-314/ITCBookman-Light.afm
+src/fonts/Adobe-Core35_AFMs-314/ITCBookman-LightItalic.afm
+src/fonts/Adobe-Core35_AFMs-314/ITCZapfChancery-MediumItalic.afm
+src/fonts/Adobe-Core35_AFMs-314/MustRead.html
+src/fonts/Adobe-Core35_AFMs-314/NewCenturySchlbk-Bold.afm
+src/fonts/Adobe-Core35_AFMs-314/NewCenturySchlbk-BoldItalic.afm
+src/fonts/Adobe-Core35_AFMs-314/NewCenturySchlbk-Italic.afm
+src/fonts/Adobe-Core35_AFMs-314/NewCenturySchlbk-Roman.afm
+src/fonts/Adobe-Core35_AFMs-314/Palatino-Bold.afm
+src/fonts/Adobe-Core35_AFMs-314/Palatino-BoldItalic.afm
+src/fonts/Adobe-Core35_AFMs-314/Palatino-Italic.afm
+src/fonts/Adobe-Core35_AFMs-314/Palatino-Roman.afm
+src/fonts/Adobe-Core35_AFMs-314/Symbol.afm
+src/fonts/Adobe-Core35_AFMs-314/Times-Bold.afm
+src/fonts/Adobe-Core35_AFMs-314/Times-BoldItalic.afm
+src/fonts/Adobe-Core35_AFMs-314/Times-Italic.afm
+src/fonts/Adobe-Core35_AFMs-314/Times-Roman.afm
+src/fonts/Adobe-Core35_AFMs-314/ZapfDingbats.afm
+
+=====================================================================================
+
+*** Adobe License for parseAFM.{c,h} ***
+
+* (C) 1988, 1989, 1990 by Adobe Systems Incorporated. All rights reserved.
+*
+* This file may be freely copied and redistributed as long as:
+* 1) This entire notice continues to be included in the file,
+* 2) If the file has been modified in any way, a notice of such
+* modification is conspicuously indicated.
+*
+* PostScript, Display PostScript, and Adobe are registered trademarks of
+* Adobe Systems Incorporated.
+*
+* ************************************************************************
+* THE INFORMATION BELOW IS FURNISHED AS IS, IS SUBJECT TO CHANGE WITHOUT
+* NOTICE, AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY ADOBE SYSTEMS
+* INCORPORATED. ADOBE SYSTEMS INCORPORATED ASSUMES NO RESPONSIBILITY OR
+* LIABILITY FOR ANY ERRORS OR INACCURACIES, MAKES NO WARRANTY OF ANY
+* KIND (EXPRESS, IMPLIED OR STATUTORY) WITH RESPECT TO THIS INFORMATION,
+* AND EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES OF MERCHANTABILITY,
+* FITNESS FOR PARTICULAR PURPOSES AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
+* ************************************************************************
+
+src/makefmt/parseAFM.cpp
+src/makefmt/parseAFM.h
+
+=====================================================================================
+
+*** MIT ***
+
+* Copyright (c) 2006-2009 Remko Tronçon
+*
+* Permission is hereby granted, free of charge, to any person
+* obtaining a copy of this software and associated documentation
+* files (the "Software"), to deal in the Software without
+* restriction, including without limitation the rights to use,
+* copy, modify, merge, publish, distribute, sublicense, and/or sell
+* copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following
+* conditions:
+*
+* The above copyright notice and this permission notice shall be
+* included in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+* OTHER DEALINGS IN THE SOFTWARE.
+
+Makefile.in
+
+The part indicated with (only relevant for Mac OS):
+
+#####################
+# Begin build DMG #
+#####################
+
+#####################
+# End build DMG #
+#####################
+
+=====================================================================================
+
+*** BSD ***
+
+* Rev 5.0 Lempel-Ziv & Welch Compression Support
+* Based on the LZW compression code from libtiff <www.libtiff.org>
+*
+* Copyright (c) 1985, 1986 The Regents of the University of California.
+* All rights reserved.
+*
+* This code is derived from software contributed to Berkeley by
+* James A. Woods, derived from original work by Spencer Thomas
+* and Joseph Orost.
+*
+* Redistribution and use in source and binary forms are permitted
+* provided that the above copyright notice and this paragraph are
+* duplicated in all such forms and that any documentation,
+* advertising materials, and other materials related to such
+* distribution and use acknowledge that the software was developed
+* by the University of California, Berkeley. The name of the
+* University may not be used to endorse or promote products derived
+* from this software without specific prior written permission.
+* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+
+src/gle/bitmap/lzwencode.cpp
+
+=====================================================================================
+
+*** A. S. Budden ***
+
+! Electronic Circuit diagrams with GLE
+! Author: A. S. Budden <abudden at NOSPAMgataki.co.uk>
+!
+! Date: 17th August 2007
+! Version: 1.3
+!
+! Copyright: Copyright (C) 2005 A. S. Budden
+! Permission is hereby granted to use and distribute this code,
+! with or without modifications, provided that this copyright
+! notice is copied with it. Like anything else that's free,
+! electronics.gle is provided *as is* and comes with no warranty
+! of any kind, either expressed or implied. By using this
+! plugin, you agree that in no event will the copyright
+! holder be liable for any damages resulting from the use
+! of this software.
+
+src/lib/electronics.gle
+
+=====================================================================================
+
+*** TeX Computer Modern Font AFM and GLE files ***
+
+The following files were automatically generated based on the TeX Computer
+Modern Font files, which were released by Prof. Donald E. Knuth into
+the public domain.
+
+These files are available under the Modified BSD license.
+
+src/fonts/texcmb.afm
+src/fonts/texcmb.gle
+src/fonts/texcmex.afm
+src/fonts/texcmex.gle
+src/fonts/texcmitt.afm
+src/fonts/texcmitt.gle
+src/fonts/texcmmi.afm
+src/fonts/texcmmi.gle
+src/fonts/texcmr.afm
+src/fonts/texcmr.gle
+src/fonts/texcmsl.afm
+src/fonts/texcmss.afm
+src/fonts/texcmss.gle
+src/fonts/texcmssb.afm
+src/fonts/texcmssb.gle
+src/fonts/texcmssi.afm
+src/fonts/texcmssi.gle
+src/fonts/texcmsy.afm
+src/fonts/texcmsy.gle
+src/fonts/texcmti.afm
+src/fonts/texcmti.gle
+src/fonts/texcmtt.afm
+src/fonts/texcmtt.gle
+
+=====================================================================================
+
diff --git a/Makefile.gcc b/Makefile.gcc
new file mode 100644
index 0000000..a73499e
--- /dev/null
+++ b/Makefile.gcc
@@ -0,0 +1,163 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+#
+# global makefile for gle
+# for gcc
+#
+include config.i
+include config.gcc
+
+ZIP_SRC_NAME = $(BASE_NAME)-$(VERSION_NUMBER).$(BUILD_NUMBER)$(GLE_SNAPSHOT)-src.zip
+TAR_SRC_NAME = gle-graphics-$(VERSION_NUMBER).$(BUILD_NUMBER)$(GLE_SNAPSHOT)-src.tar.gz
+TAR_SRCF_NAME = gle-graphics-$(VERSION_NUMBER).$(BUILD_NUMBER)f$(GLE_SNAPSHOT)-src.tar.gz
+TAR_BASE_DIR = gle-graphics-$(VERSION_NUMBER).$(BUILD_NUMBER)
+
+FILTER_CVS := grep -P -v "(\.svn|CVS|\.cvsignore)"
+FILTER_SRC := $(FILTER_CVS) | grep -P -v "\.($(OBJ_SUFF)|e*ps)$$" | grep -v "moc_"
+FILTER_FNTS := $(FILTER_CVS) | grep -P -v "\.(fve|fmt)$$"
+
+all:
+ -mkdir -p build
+ -mkdir -p build/bin
+ -mkdir -p build/lib
+ -mkdir -p build/gleinc
+ $(MAKE) -C src/gle/bitmap -f Makefile.gcc
+ $(MAKE) -C src/gle/surface -f Makefile.gcc
+ $(MAKE) -C src/gle/letzfitz -f Makefile.gcc
+ $(MAKE) -C src/gle/tokens -f Makefile.gcc
+ $(MAKE) -C src/gle -f Makefile.gcc
+ $(MAKE) -C src/fbuild -f Makefile.gcc
+ $(MAKE) -C src/makefmt -f Makefile.gcc
+ $(MAKE) -C src/fonts -f Makefile.gcc
+ $(MAKE) -C src/lib -f Makefile.gcc
+ $(MAKE) -C src/TeX -f Makefile.gcc
+ @echo ""
+ @echo "**********************************************************"
+ @echo "Type \"make install\" to install GLE $(VERSION_NUMBER).$(BUILD_NUMBER)"
+ @echo "Install data into: $(INSTALL_DIR)"
+ @echo "Install binary into: $(INSTALL_BIN)"
+ @echo "**********************************************************"
+ @echo ""
+
+clean:
+ $(MAKE) -C src/gle/bitmap -f Makefile.gcc clean
+ $(MAKE) -C src/gle/surface -f Makefile.gcc clean
+ $(MAKE) -C src/gle/letzfitz -f Makefile.gcc clean
+ $(MAKE) -C src/gle/tokens -f Makefile.gcc clean
+ $(MAKE) -C src/gle -f Makefile.gcc clean
+ $(MAKE) -C src/fbuild -f Makefile.gcc clean
+ $(MAKE) -C src/makefmt -f Makefile.gcc clean
+ $(MAKE) -C src/fonts -f Makefile.gcc clean
+ $(MAKE) -C src/TeX -f Makefile.gcc clean
+ $(MAKE) -C src/manip -f Makefile.gcc clean
+ -$(RMDIR) build
+
+manip:
+ $(MAKE) -C src/manip -f Makefile.gcc
+
+install: clean_install
+ -mkdir -p $(INSTALL_DIR)
+ -mkdir -p $(INSTALL_BIN)
+ -cp -r build/* $(INSTALL_DIR)
+ -strip $(INSTALL_DIR)/bin/gle*
+ -strip $(INSTALL_DIR)/bin/fbuild*
+ -strip $(INSTALL_DIR)/bin/makefmt*
+ -strip $(INSTALL_DIR)/bin/manip*
+ -echo "#!/bin/sh" > $(INSTALL_BIN)/gle
+ -echo "export GLE_TOP=$(INSTALL_DIR)" >> $(INSTALL_BIN)/gle
+ -echo "$(INSTALL_DIR)/bin/gle \$$@" >> $(INSTALL_BIN)/gle
+ -chmod 755 $(INSTALL_BIN)/gle
+ -echo "#!/bin/sh" > $(INSTALL_BIN)/manip
+ -echo "export GLE_TOP=$(INSTALL_DIR)" >> $(INSTALL_BIN)/manip
+ -echo "$(INSTALL_DIR)/bin/manip \$$@" >> $(INSTALL_BIN)/manip
+ -chmod 755 $(INSTALL_BIN)/manip
+ @echo ""
+ @echo "****************************************************************"
+ @echo "GLE $(VERSION_NUMBER).$(BUILD_NUMBER) has been installed"
+ @echo "You can use GLE now by entering the command \"gle\""
+ @echo "(Provided that $(INSTALL_BIN) is in your PATH.)"
+ @echo "****************************************************************"
+ @echo ""
+
+linklib:
+ rm -rf $(INSTALL_DIR)/gleinc
+ ln -s `pwd`/src/lib $(INSTALL_DIR)/gleinc
+
+clean_install:
+ -$(RM) $(INSTALL_BIN)/gle
+ -$(RM) $(INSTALL_DIR)/bin/*
+ -$(RMDIR) $(INSTALL_DIR)/bin
+ -$(RM) $(INSTALL_DIR)/font/*
+ -$(RMDIR) $(INSTALL_DIR)/font
+ -$(RM) $(INSTALL_DIR)/*.ini
+
+full: clean all
+
+coll:
+ perl platform/script/collectsrcfiles.pl platform/script/srcfiles.csv
+
+zipsrc:
+ perl platform/script/correctfilemodes.pl
+ -rm -f $(ZIP_SRC_NAME)
+ perl platform/script/collectsrcfiles.pl platform/script/srcfiles.csv > srcfiles.txt
+ (cd ..; cat gle4/srcfiles.txt | sed -e s/^/gle4\\// | xargs zip gle4/$(ZIP_SRC_NAME))
+ - at echo "$(ZIP_SRC_NAME) has been created!"
+
+tarsrc:
+ perl platform/script/correctfilemodes.pl
+ -rm -f $(TAR_SRC_NAME)
+ perl platform/script/collectsrcfiles.pl platform/script/srcfiles.csv > srcfiles.txt
+ tar czfv $(TAR_SRC_NAME) --files-from srcfiles.txt --transform 's|^|$(TAR_BASE_DIR)/|' --group 0 --owner 0
+ - at echo "$(TAR_SRC_NAME) has been created!"
+
+tarsrcf:
+ perl platform/script/correctfilemodes.pl
+ -rm -f $(TAR_SRCF_NAME)
+ -touch src/fonts/extrafonts.inf
+ perl platform/script/collectsrcfiles.pl -all platform/script/srcfiles.csv > srcfiles.txt
+ tar czfv $(TAR_SRCF_NAME) --files-from srcfiles.txt --transform 's|^|$(TAR_BASE_DIR)/|' --group 0 --owner 0
+ - at rm src/fonts/extrafonts.inf
+ - at echo "$(TAR_SRCF_NAME) has been created!"
+
+commit:
+ cvs commit -m "commit via nmake working on version $(TAG)"
+
+tagall:
+ cvs rtag $(TAG) $(MODULE_NAME) $(DEPENDANT_MODULES)
+
diff --git a/Makefile.in b/Makefile.in
new file mode 100644
index 0000000..f295b9d
--- /dev/null
+++ b/Makefile.in
@@ -0,0 +1,536 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+# global makefile for gle
+# @configure_input@
+
+.PHONY : all
+.PHONY : clean
+.PHONY : distclean
+.PHONY : cleansrc
+.PHONY : cleandoc
+.PHONY : cleanfonts
+.PHONY : install
+.PHONY : uninstall
+.PHONY : bundle
+.PHONY : glegs
+.PHONY : qmake
+.PHONY : gui
+.PHONY : strip
+.PHONY : finddeps
+.PHONY : doc
+.PHONY : license
+.PHONY : qgle
+
+.PHONY : make_all
+.PHONY : pre_install
+.PHONY : post_install
+.PHONY : install_script
+.PHONY : install_noscript
+.PHONY : nsis
+.PHONY : snapshot
+.PHONY : nosnapshot
+
+.PHONY : zipsrc
+.PHONY : zipexe
+.PHONY : tarsrc
+.PHONY : tarsrcf
+
+include config.i
+include config.aconf
+
+export RUNBUILD=1
+export GLE_SNAPSHOT=@GLE_SNAPSHOT@
+export HAVE_EXTRA_FONTS=@HAVE_EXTRA_FONTS@
+export HAVE_CAIRO=@HAVE_CAIRO@
+
+CXX=@CXX@
+CXXFLAGS=@CXXFLAGS@
+CPPFLAGS=@CPPFLAGS@
+
+LDFLAGS=@LDFLAGS@
+LIBS=@LIBS@
+
+PACKAGE_TARNAME=@PACKAGE_TARNAME@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+datarootdir=@datarootdir@
+docdir=@docdir@
+
+INSTALL_LIB=@libdir@
+INSTALL_BIN=@GLE_INSTALL_BIN@
+INSTALL_DIR=@GLE_INSTALL_DATA@
+
+INSTALL=@INSTALL@
+INSTALL_PROGRAM=@INSTALL_PROGRAM@
+INSTALL_DATA=@INSTALL_DATA@
+MKDIR_P=@MKDIR_P@
+
+PKGCONFIGDIR=$(INSTALL_LIB)/pkgconfig
+MANDIR=@mandir@
+
+GLE_VERSION=@GLE_VERSION@
+
+INSTALL_METHOD=install_script
+ifeq (@HAVE_NOSCRIPTS@,1)
+ INSTALL_METHOD=install_noscript
+endif
+
+ifeq (@HAVE_QT@,1)
+ifeq (@HAVE_MAC@,1)
+ INSTALL_METHOD:=$(INSTALL_METHOD) install_qgle_mac_default
+ RUN_QGLE:=./build/bin/QGLE.app/Contents/MacOS/QGLE
+else
+ INSTALL_METHOD:=$(INSTALL_METHOD) install_qgle
+ RUN_QGLE:=./build/bin/qgle
+endif
+endif
+
+ifeq (@HAVE_AUTOPACKAGE@,1)
+ INSTALL_METHOD:=$(INSTALL_METHOD) install_ap
+endif
+
+ifeq (@HAVE_LIBGLE@,1)
+ INSTALL_METHOD:=install_libgle $(INSTALL_METHOD)
+else
+ ifeq (@HAVE_LIBGLE_STATIC@,1)
+ INSTALL_METHOD:=install_libgle $(INSTALL_METHOD)
+ endif
+endif
+
+GLE_SRC_LIB_DIR:=build/lib
+ifeq (@HAVE_WIN32@,1)
+ GLE_SRC_LIB_DIR:=build/bin
+endif
+
+DO_ALL=make_all
+ifeq (@MAKE_AUTOPACKAGE@,1)
+ DO_ALL=autopackage
+endif
+
+WIN32_INSTALL_NAME = gle-graphics-$(GLE_VERSION)$(GLE_SNAPSHOT)-exe-win32.exe
+RELEASE_DIR = ./release
+NSIS_SCRIPT_DIR = ./contrib\packagers\nsis
+
+all: $(DO_ALL)
+
+make_all: configure
+ -$(MKDIR_P) build
+ -$(MKDIR_P) build/bin
+ -$(MKDIR_P) build/lib
+ -$(MKDIR_P) build/doc
+ -$(MKDIR_P) build/gleinc
+ $(MAKE) -C src/gle make_glebtool
+ $(MAKE) -C src/gle/bitmap
+ $(MAKE) -C src/gle/surface
+ $(MAKE) -C src/gle/letzfitz
+ $(MAKE) -C src/gle/tokens
+ $(MAKE) -C src/gle
+ $(MAKE) -C src/fbuild
+ $(MAKE) -C src/makefmt
+ $(MAKE) -C src/manip
+ $(MAKE) -C src/gui -f MakefileAC
+ $(MAKE) -C src/fonts -f Makefile.gcc
+ $(MAKE) -C src/lib -f Makefile.gcc
+ $(MAKE) -C src/TeX
+ @echo ""
+ @echo "********************************************************************"
+ @echo "Type \"make doc\" to build the GLE reference manual (requires LaTeX)"
+ @echo "Type \"make install\" to install GLE $(GLE_VERSION)$(GLE_SNAPSHOT)"
+ @echo "Install data into: $(INSTALL_DIR)"
+ @echo "Install library into: $(INSTALL_LIB)"
+ @echo "Install binary into: $(INSTALL_BIN)"
+ @echo "********************************************************************"
+ @echo ""
+
+cleansrc:
+ $(MAKE) -C src/gle/bitmap clean
+ $(MAKE) -C src/gle/surface clean
+ $(MAKE) -C src/gle/letzfitz clean
+ $(MAKE) -C src/gle/tokens clean
+ $(MAKE) -C src/gle clean
+ $(MAKE) -C src/fbuild clean
+ $(MAKE) -C src/makefmt clean
+ $(MAKE) -C src/manip clean
+ $(MAKE) -C src/gui -f MakefileAC clean
+ $(MAKE) -C src/fonts -f Makefile.gcc clean
+ $(MAKE) -C src/TeX clean
+ -@$(RM) config.status
+ -@$(RM) config.log
+ -@$(RMDIR) build/bin
+ -@$(RMDIR) build/lib
+ -@$(RMDIR) build/font
+ -@$(RMDIR) build/gleinc
+ -@$(RM) build/glerc
+ -@$(RM) build/init.tex
+ -@$(RM) build/inittex.ini
+ -@$(RM) build/manip.hlp
+
+clean: cleansrc cleandoc cleanfonts clean_dmg
+ -@$(RMDIR) build
+
+distclean: clean
+ -@$(RM) platform/autoconf/gle-graphics.pc
+ -@$(RM) platform/autopackage/gle4.apspec
+ -@$(RM) src/config.h
+ -@$(RM) src/doc/gle.1
+ -@$(RM) src/fbuild/Makefile
+ -@$(RM) src/gle/bitmap/Makefile
+ -@$(RM) src/gle/letzfitz/Makefile
+ -@$(RM) src/gle/Makefile
+ -@$(RM) src/gle/surface/Makefile
+ -@$(RM) src/gle/tokens/Makefile
+ -@$(RM) src/gui/MakefileAC
+ -@$(RM) src/gui/qgle.pro
+ -@$(RM) src/makefmt/Makefile
+ -@$(RM) src/manip/Makefile
+ -@$(RM) src/TeX/Makefile
+ -@$(RM) Makefile
+
+install: clean_install pre_install $(INSTALL_METHOD) post_install
+
+pre_install:
+ -$(MKDIR_P) $(DESTDIR)$(INSTALL_DIR)
+ -$(MKDIR_P) $(DESTDIR)$(INSTALL_BIN)
+ -$(MKDIR_P) $(DESTDIR)$(MANDIR)/man1
+ -$(MKDIR_P) $(DESTDIR)$(docdir)
+ -$(MKDIR_P) $(DESTDIR)$(PKGCONFIGDIR)
+ -$(INSTALL_DATA) build/glerc $(DESTDIR)$(INSTALL_DIR)
+ -$(INSTALL_DATA) build/inittex.ini $(DESTDIR)$(INSTALL_DIR)
+ -$(INSTALL_DATA) build/init.tex $(DESTDIR)$(INSTALL_DIR)
+ -$(INSTALL_DATA) build/manip.hlp $(DESTDIR)$(INSTALL_DIR)
+ -$(INSTALL_DATA) src/doc/gle.1 $(DESTDIR)$(MANDIR)/man1/
+ -$(INSTALL_DATA) platform/autoconf/gle-graphics.pc $(DESTDIR)$(PKGCONFIGDIR)/
+ -cp -p -r build/font $(DESTDIR)$(INSTALL_DIR)
+ -cp -p -r build/doc/* $(DESTDIR)$(docdir)
+ -cp -p -r build/gleinc $(DESTDIR)$(INSTALL_DIR)
+ -chmod -R a+rX $(DESTDIR)$(INSTALL_DIR)/font
+ -chmod -R a+rX $(DESTDIR)$(INSTALL_DIR)/gleinc
+ -chmod -R a+rX $(DESTDIR)$(docdir)
+
+post_install:
+ @echo ""
+ @echo "****************************************************************"
+ @echo "GLE $(GLE_VERSION)$(GLE_SNAPSHOT) has been installed"
+ @echo "You can use GLE now by entering the command \"gle\""
+ @echo "(Provided that $(DESTDIR)$(INSTALL_BIN) is in your PATH.)"
+ @echo "****************************************************************"
+ @echo ""
+
+# noscript version: do not put scripts in bin directory that set up GLE_TOP
+# gle does not need GLE_TOP anymore on most operating systems
+
+install_noscript:
+ -$(INSTALL_PROGRAM) -m 755 build/bin/gle* $(DESTDIR)$(INSTALL_BIN)/
+ -$(INSTALL_PROGRAM) -m 755 build/bin/manip* $(DESTDIR)$(INSTALL_BIN)/
+
+# script version: put scripts in bin directory that set up GLE_TOP
+
+install_script:
+ -$(MKDIR_P) $(DESTDIR)$(INSTALL_DIR)/bin
+ -cp -p build/bin/gle* $(DESTDIR)$(INSTALL_DIR)/bin/
+ -cp -p build/bin/manip* $(DESTDIR)$(INSTALL_DIR)/bin/
+ -echo "#!/bin/sh" > $(DESTDIR)$(INSTALL_BIN)/gle
+ -echo "GLE_TOP=$(INSTALL_DIR)" >> $(DESTDIR)$(INSTALL_BIN)/gle
+ -echo "export GLE_TOP" >> $(DESTDIR)$(INSTALL_BIN)/gle
+ -echo "$(INSTALL_DIR)/bin/gle \$$@" >> $(DESTDIR)$(INSTALL_BIN)/gle
+ -chmod 755 $(DESTDIR)$(INSTALL_BIN)/gle
+ -echo "#!/bin/sh" > $(DESTDIR)$(INSTALL_BIN)/manip
+ -echo "GLE_TOP=$(INSTALL_DIR)" >> $(DESTDIR)$(INSTALL_BIN)/manip
+ -echo "export GLE_TOP" >> $(DESTDIR)$(INSTALL_BIN)/manip
+ -echo "$(INSTALL_DIR)/bin/manip \$$@" >> $(DESTDIR)$(INSTALL_BIN)/manip
+ -chmod 755 $(DESTDIR)$(INSTALL_BIN)/manip
+
+install_qgle:
+ -$(INSTALL_PROGRAM) -m 755 build/bin/qgle $(DESTDIR)$(INSTALL_BIN)/
+ - at echo ""
+ - at echo "****************************************************************"
+ - at echo "QGLE has been installed in: $(DESTDIR)$(INSTALL_BIN)"
+ - at echo "****************************************************************"
+
+install_libgle:
+ -$(MKDIR_P) $(DESTDIR)$(INSTALL_LIB)/
+ -$(INSTALL_PROGRAM) -m 755 build/lib/libgle* $(DESTDIR)$(INSTALL_LIB)/
+
+#####################
+# Code for Mac OS/X #
+#####################
+
+install_qgle_mac_default:
+ bash platform/script/install_qgle_mac
+
+GLE_BUNDLE_TOP:=build/bin/QGLE.app/Contents/share/gle-graphics/$(GLE_VERSION)
+
+bundle:
+ -$(MKDIR_P) build/bin/QGLE.app/Contents/bin
+ -cp -p build/bin/gle build/bin/QGLE.app/Contents/bin/
+ -cp -p build/bin/glegs build/bin/QGLE.app/Contents/bin/glegs
+ -cp -p -r build/lib build/bin/QGLE.app/Contents/
+ -$(MKDIR_P) $(GLE_BUNDLE_TOP)/
+ -cp -p build/glerc $(GLE_BUNDLE_TOP)/
+ -echo "begin config gle" > $(GLE_BUNDLE_TOP)/glerc
+ -echo " current = $(VERSION_NUMBER).$(BUILD_NUMBER)" >> $(GLE_BUNDLE_TOP)/glerc
+ -echo "end config" >> $(GLE_BUNDLE_TOP)/glerc
+ -echo "begin config tools" >> $(GLE_BUNDLE_TOP)/glerc
+ -echo " ghostscript = \"\$$EXELOC/../bin/glegs\"">> $(GLE_BUNDLE_TOP)/glerc
+ -echo " libgs = \"/Library/Frameworks/Ghostscript.framework\"">> $(GLE_BUNDLE_TOP)/glerc
+ -echo "end config" >> $(GLE_BUNDLE_TOP)/glerc
+ -cp -p build/inittex.ini $(GLE_BUNDLE_TOP)/
+ -cp -p build/init.tex $(GLE_BUNDLE_TOP)/
+ -cp -p -r build/font $(GLE_BUNDLE_TOP)/
+ -cp -p -r build/doc $(GLE_BUNDLE_TOP)/
+ -cp -p -r build/gleinc $(GLE_BUNDLE_TOP)/
+ install_name_tool -change $(DESTDIR)$(INSTALL_LIB)/libgle-graphics- at GLE_VERSION@.dylib @executable_path/../lib/libgle-graphics- at GLE_VERSION@.dylib build/bin/QGLE.app/Contents/MacOS/QGLE
+
+LIBPNG_PATH=$(HOME)/staticlibs/lib/libpng14.14.dylib
+
+bundle_libpng:
+ -cp -p $(LIBPNG_PATH) build/bin/QGLE.app/Contents/lib/libpng.dylib
+ install_name_tool -id @executable_path/../lib/libpng.dylib build/bin/QGLE.app/Contents/lib/libpng.dylib
+ install_name_tool -change $(LIBPNG_PATH) @executable_path/../lib/libpng.dylib build/bin/QGLE.app/Contents/MacOS/QGLE
+ install_name_tool -change $(LIBPNG_PATH) @executable_path/../lib/libpng.dylib build/bin/QGLE.app/Contents/lib/libgle-graphics- at GLE_VERSION@.dylib
+
+otool:
+ @echo "GLE"
+ otool -L build/bin/QGLE.app/Contents/bin/gle
+ @echo "GLEGS"
+ otool -L build/bin/QGLE.app/Contents/bin/glegs
+ @echo "MANIP"
+ otool -L build/bin/manip
+ @echo "LIBGLE-GRPAPHICS"
+ otool -L build/bin/QGLE.app/Contents/lib/libgle-graphics- at GLE_VERSION@.dylib
+ @echo "QGLE"
+ otool -L build/bin/QGLE.app/Contents/MacOS/QGLE
+
+#####################
+# Begin build DMG #
+#####################
+#
+# Build file for creating DMG files.
+#
+# The DMG packager looks for a template.dmg.bz2 for using as its
+# DMG template. If it doesn't find one, it generates a clean one.
+#
+# If you create a DMG template, you should make one containing all
+# the files listed in $(SOURCE_FILES) below, and arrange everything to suit
+# your style. The contents of the files themselves does not matter, so
+# they can be empty (they will be overwritten later).
+#
+# Remko Tronçon
+# http://el-tramo.be/about
+# Licensed under the MIT License. See LICENSE.txt for details.
+
+################################################################################
+# Customizable variables
+################################################################################
+
+SOURCE_DIR ?= build/bin
+SOURCE_FILES ?= QGLE.app
+TEMPLATE_DMG ?= template.dmg
+
+################################################################################
+# DMG building. No editing should be needed beyond this point.
+################################################################################
+
+MASTER_DMG=gle-graphics-$(VERSION_NUMBER).$(BUILD_NUMBER)$(GLE_SNAPSHOT)-exe-mac.dmg
+WC_DMG=wc.dmg
+WC_DIR=wc
+
+.PHONY: dmg
+dmg: $(MASTER_DMG)
+
+$(TEMPLATE_DMG): $(TEMPLATE_DMG).bz2
+ bunzip2 -k $<
+
+$(TEMPLATE_DMG).bz2:
+ @echo
+ @echo --------------------- Generating empty template --------------------
+ mkdir template
+ hdiutil create -fs HFSX -layout SPUD -size 60m "$(TEMPLATE_DMG)" -srcfolder template -format UDRW -volname "gle-graphics-$(VERSION_NUMBER).$(BUILD_NUMBER)$(GLE_SNAPSHOT)" -quiet
+ rmdir template
+ bzip2 "$(TEMPLATE_DMG)"
+ @echo
+
+$(WC_DMG): $(TEMPLATE_DMG)
+ cp $< $@
+
+$(MASTER_DMG): $(WC_DMG) $(addprefix $(SOURCE_DIR)/,$(SOURCE_FILES))
+ @echo
+ @echo --------------------- Creating Disk Image --------------------
+ mkdir -p $(WC_DIR)
+ hdiutil attach "$(WC_DMG)" -noautoopen -quiet -mountpoint "$(WC_DIR)"
+ for i in $(SOURCE_FILES); do \
+ rm -rf "$(WC_DIR)/$$i"; \
+ ditto -rsrc "$(SOURCE_DIR)/$$i" "$(WC_DIR)/$$i"; \
+ done
+ #rm -f "$@"
+ #hdiutil create -srcfolder "$(WC_DIR)" -format UDZO -imagekey zlib-level=9 "$@" -volname "gle-graphics-$(VERSION_NUMBER).$(BUILD_NUMBER)$(GLE_SNAPSHOT)" -scrub -quiet
+ WC_DEV=`hdiutil info | grep "$(WC_DIR)" | grep "Apple_HFS" | awk '{print $$1}'` && \
+ hdiutil detach $$WC_DEV -quiet -force
+ rm -f "$(MASTER_DMG)"
+ hdiutil convert "$(WC_DMG)" -quiet -format UDZO -imagekey zlib-level=9 -o "$@"
+ rm -rf $(WC_DIR)
+ @echo
+
+.PHONY: clean_dmg
+clean_dmg:
+ -rm -rf $(TEMPLATE_DMG) $(MASTER_DMG) $(WC_DMG)
+
+#####################
+# End build DMG #
+#####################
+
+#####################
+# Make glegs #
+#####################
+
+glegs:
+ $(MAKE) -C src/gui -f MakefileAC $(PROJECT_BINDIR)/bin/glegs
+
+#####################
+# Rerun qmake #
+#####################
+
+qmake:
+ $(MAKE) -C src/gui -f MakefileAC qmake
+
+qgle:
+ $(RUN_QGLE)
+
+# Code for Autopackage
+
+install_ap:
+ -$(INSTALL_DATA) platform/autopackage/gle.desktop $(DESTDIR)$(INSTALL_DIR)
+ -$(INSTALL_DATA) platform/autopackage/gle.xml $(DESTDIR)$(INSTALL_DIR)
+ -$(INSTALL_DATA) platform/autopackage/gle.png $(DESTDIR)$(INSTALL_DIR)
+
+uninstall: clean_install
+
+clean_install:
+ -@$(RM) $(DESTDIR)$(INSTALL_BIN)/gle*
+ -@$(RM) $(DESTDIR)$(INSTALL_BIN)/manip*
+ -@$(RM) $(DESTDIR)$(INSTALL_BIN)/qgle*
+ -@$(RM) $(DESTDIR)$(INSTALL_DIR)/bin/*
+ -@$(RMDIR) $(DESTDIR)$(INSTALL_DIR)/bin
+ -@$(RM) $(DESTDIR)$(INSTALL_DIR)/font/*
+ -@$(RMDIR) $(DESTDIR)$(INSTALL_DIR)/font
+ -@$(RM) $(DESTDIR)$(INSTALL_DIR)/doc/*
+ -@$(RMDIR) $(DESTDIR)$(INSTALL_DIR)/doc
+ -@$(RM) $(DESTDIR)$(INSTALL_DIR)/gleinc/*
+ -@$(RMDIR) $(DESTDIR)$(INSTALL_DIR)/gleinc
+ -@$(RM) $(DESTDIR)$(INSTALL_DIR)/*
+
+configure: configure.ac
+ aclocal
+ autoconf
+ - at echo ""
+ - at echo "****************************************************************"
+ - at echo "Error: configure.ac changed, please reconfigure with ./configure"
+ - at echo "****************************************************************"
+ false
+
+gui:
+ $(MAKE) -C src/gui -f MakefileAC
+
+zipsrc:
+ $(MAKE) -f Makefile.gcc zipsrc
+
+tarsrc:
+ $(MAKE) -f Makefile.gcc tarsrc
+
+tarsrcf:
+ $(MAKE) -f Makefile.gcc tarsrcf
+
+zipexe:
+ zip -r $(BASE_NAME)-$(VERSION_NUMBER).$(BUILD_NUMBER)$(GLE_SNAPSHOT)-exe.zip build
+ echo "Created: $(BASE_NAME)-$(VERSION_NUMBER).$(BUILD_NUMBER)$(GLE_SNAPSHOT)-exe.zip"
+
+license:
+ cat srcfiles.txt | xargs perl platform/script/checklicense.pl
+
+# *** WARNING ***
+# Don't add "strip" to the default install target:
+# This breaks creating "debug" packages on openSUSE and Fedora.
+strip:
+ - at STRIP@ @STRIPALL@ build/bin/gle*
+ - at STRIP@ @STRIPALL@ build/bin/fbuild*
+ - at STRIP@ @STRIPALL@ build/bin/makefmt*
+ - at STRIP@ @STRIPALL@ build/bin/glegs*
+ - at STRIP@ @STRIPUNNEEDED@ $(GLE_SRC_LIB_DIR)/libgle*
+ - at STRIP@ @STRIPALL@ build/bin/qgle*
+ - at STRIP@ @STRIPALL@ build/bin/manip*
+
+finddeps:
+ ./build/bin/gle -finddeps
+
+cleandoc:
+ $(MAKE) -C gle-refman -f Makefile.gcc clean
+
+cleanfonts:
+ $(MAKE) -C gle-refman -f Makefile.gcc cfonts
+
+doc:
+ -$(MKDIR_P) build/doc
+ $(MAKE) -C gle-refman -f Makefile.gcc fig
+ $(MAKE) -C gle-refman -f Makefile.gcc fonts
+ $(MAKE) -C gle-refman -f Makefile.gcc pdf
+ $(MAKE) -C gle-refman -f Makefile.gcc pdf
+ $(MAKE) -C gle-refman -f Makefile.gcc index
+ $(MAKE) -C gle-refman -f Makefile.gcc pdf
+ cp gle-refman/gle-manual.pdf build/doc/
+ cp README.txt build/doc/
+ cp LICENSE.txt build/doc/
+
+autopackage:
+ (export APBUILD_STATIC_LIBGCC=1; export APBUILD_STATIC="tiff png12 png jpeg z"; makepackage platform/autopackage/gle4.apspec)
+ mv gle- at GLE_VERSION@.x86.package GLE- at GLE_VERSION@-x86-linux.package
+
+nsis: strip
+ -$(MKDIR_P) $(RELEASE_DIR)
+ -@$(RM) $(RELEASE_DIR)/$(WIN32_INSTALL_NAME)
+ -makensis /V1 /DGLE_VERSION=@GLE_VERSION@ /DOUTPUT_FILENAME=$(WIN32_INSTALL_NAME) contrib\\packagers\\nsis\\gle.nsi
+ -mv contrib/packagers/nsis/$(WIN32_INSTALL_NAME) $(RELEASE_DIR)
+
+snapshot:
+ perl platform/script/makesnapshot.pl 1
+
+nosnapshot:
+ perl platform/script/makesnapshot.pl 0
+
+unit-test:
+ make -C src/gle $(PROJECT_BINDIR)/bin/gle-unit-test
diff --git a/Makefile.os2 b/Makefile.os2
new file mode 100644
index 0000000..5db82b5
--- /dev/null
+++ b/Makefile.os2
@@ -0,0 +1,118 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+#
+# global makefile for gle
+# for gcc
+#
+include config.i
+include config.os2
+
+all:
+ -$(MKDIR) build
+ -$(MKDIR) build/bin
+ -$(MKDIR) build/lib
+ -$(CP) src/config.h.os2 src/config.h
+ make -C src/gle/bitmap -f Makefile.os2
+ make -C src/gle/surface -f Makefile.os2
+ make -C src/gle/letzfitz -f Makefile.os2
+ make -C src/gle/tokens -f Makefile.os2
+ make -C src/gle -f Makefile.os2
+ make -C src/fbuild -f Makefile.os2
+ make -C src/makefmt -f Makefile.os2
+ make -C src/fonts -f Makefile.os2
+ make -C src/lib -f Makefile.os2
+ make -C src/TeX -f Makefile.os2
+
+clean:
+ make -C src/gle/bitmap -f Makefile.os2 clean
+ make -C src/gle/surface -f Makefile.os2 clean
+ make -C src/gle/letzfitz -f Makefile.os2 clean
+ make -C src/gle/tokens -f Makefile.os2 clean
+ make -C src/gle -f Makefile.os2 clean
+ make -C src/fbuild -f Makefile.os2 clean
+ make -C src/makefmt -f Makefile.os2 clean
+ make -C src/fonts -f Makefile.os2 clean
+ make -C src/TeX -f Makefile.os2 clean
+ make -C src/manip -f Makefile.os2 clean
+ -$(RM) src/config.h
+ -$(RMDIR) include
+ -$(RMDIR) lib
+ -$(RMDIR) build
+
+manip:
+ -$(CP) src/config.h.os2 src/config.h
+ make -C src/manip -f Makefile.os2
+
+install: clean_install
+ -$(MKDIR) $(INSTALL_DIR)
+ -$(CP) -R build/* $(INSTALL_DIR)/
+ -$(CP) $(INSTALL_DIR)/gle.exe $(INSTALL_BIN)/gle.exe
+ @echo Please add "SET GLE_TOP=$(INSTALL_DIR)" to your CONFIG.SYS
+
+
+clean_install:
+ -$(RM) $(INSTALL_BIN)/bin/gle.exe
+ -$(RMDIR) $(INSTALL_DIR)/font
+ -$(RM) $(INSTALL_DIR)/bin/gle.exe
+ -$(RM) $(INSTALL_DIR)/bin/fbuild.exe
+ -$(RM) $(INSTALL_DIR)/bin/makefmt.exe
+ -$(RM) $(INSTALL_DIR)/inittex.ini
+
+full: clean all
+
+distrib:
+ -$(RM) $(BASE_NAME)-os2-$(VERSION_NUMBER).$(BUILD_NUMBER).zip
+ -$(MKDIR) gle
+ -$(MKDIR) gle/doc
+ -$(CP) -R bin/* gle/.
+ -$(CP) $(ADD_DLLS) gle/.
+ -$(CP) $(ADD_DOCS) gle/doc/.
+ -$(CP) contrib/samplecfg/*.os2 gle/.
+ -$(ZIP) -r $(BASE_NAME)-os2-$(VERSION_NUMBER).$(BUILD_NUMBER).zip gle/*
+ -$(RMDIR) gle
+
+lxlite:
+ lxlite bin/*.exe
+
+commit:
+ cvs commit -m "commit via make working on version $(TAG)"
+
+tagall:
+ cvs rtag $(TAG) $(MODULE_NAME) $(DEPENDANT_MODULES)
+
diff --git a/Makefile.vc b/Makefile.vc
new file mode 100644
index 0000000..a84c4ac
--- /dev/null
+++ b/Makefile.vc
@@ -0,0 +1,132 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+#
+# global makefile for gle
+# for microsoft visual C++
+#
+!include "config.vc"
+
+ZIP_SRC_NAME = $(BASE_NAME)_$(VERSION_NUMBER).$(BUILD_NUMBER)_src.zip
+TAR_SRC_NAME = $(BASE_NAME)_$(VERSION_NUMBER).$(BUILD_NUMBER)_src.tar
+ZIP_EXE_NAME = $(BASE_NAME)_$(VERSION_NUMBER).$(BUILD_NUMBER)_exe_win32.zip
+INSTALL_NAME = GLE-$(VERSION_NUMBER).$(BUILD_NUMBER)-exe-win32.exe
+RELEASE_DIR = .\release
+NSIS_SCRIPT_DIR = .\contrib\packagers\nsis
+
+SRC_FILES = gle4/Makefile* gle4/config* gle4/README gle4/src/gle/* gle4/src/fonts/* gle4/src/makefmt/* gle4/src/fbuild/* gle4/src/samples/* gle4/src/TeX/*
+EXE_FILES = gle4/README gle4/bin/*.exe gle4/bin/font.dat gle4/bin/inittex.ini gle4/bin/font/*
+
+all:
+ -mkdir build
+ -mkdir build\bin
+ cd src\gle\bitmap & nmake -f makefile.vc /nologo
+ cd src\gle\surface & nmake -f makefile.vc /nologo
+ cd src\gle\letzfitz & nmake -f makefile.vc /nologo
+ cd src\gle\tokens & nmake -f makefile.vc /nologo
+ cd src\gle & nmake -f makefile.vc /nologo
+ cd src\fbuild & nmake -f makefile.vc /nologo
+ cd src\makefmt & nmake -f makefile.vc /nologo
+ cd src\fonts & nmake -f makefile.vc /nologo
+ cd src\tex & nmake -f makefile.vc /nologo
+ cd src\samples & nmake -f makefile.vc /nologo
+
+clean:
+ cd src\gle\bitmap & nmake -f makefile.vc /nologo clean
+ cd src\gle\surface & nmake -f makefile.vc /nologo clean
+ cd src\gle\letzfitz & nmake -f makefile.vc /nologo clean
+ cd src\gle\tokens & nmake -f makefile.vc /nologo clean
+ cd src\gle & nmake -f makefile.vc /nologo clean
+ cd src\fbuild & nmake -f makefile.vc /nologo clean
+ cd src\makefmt & nmake -f makefile.vc /nologo clean
+ cd src\fonts & nmake -f makefile.vc /nologo clean
+ cd src\tex & nmake -f makefile.vc /nologo clean
+ cd src\samples & nmake -f makefile.vc /nologo clean
+ -rmdir /S /Q build
+ -rmdir /S /Q build\bin
+
+full: clean all zipsrc tarsrc zipexe
+
+commit:
+ cvs commit -m "commit via nmake working on version $(TAG)"
+#
+# to tag a release
+#
+tagall:
+ cvs rtag $(TAG) $(MODULE_NAME) $(DEPENDANT_MODULES)
+
+#
+# for testing not a true install
+#
+install:
+ copy bin\gle_ps.exe "c:\program files\gle"
+
+#
+# for building distributions
+#
+zipsrc:
+ cd .. & zip $(ZIP_SRC_NAME) -9 $(SRC_FILES) -x *.obj *.cvsignore *.eps */CVS/ *.fve *.fmt */gle4.4D/
+ move ..\$(ZIP_SRC_NAME) .
+
+tarsrc:
+ cd .. & tar -cvf $(TAR_SRC_NAME) $(SRC_FILES) --exclude=*.obj --exclude=*.zip --exclude=*.cvsignore --exclude=*.eps --exclude=*CVS* --exclude=*.fve --exclude=*.fmt --exclude=*gle4.4D*
+ move ..\$(TAR_SRC_NAME) .
+ bzip2 -9k $(TAR_SRC_NAME)
+ gzip -9 $(TAR_SRC_NAME)
+
+zipexe:
+ cd .. & zip $(ZIP_EXE_NAME) -9 $(EXE_FILES)
+ move ..\$(ZIP_EXE_NAME) .
+
+#compress the executables
+upx:
+ upx -9 --force build\bin\*.exe
+
+
+NSIS_VERSIONS = /DGLE_VERSION=$(MAJOR_VERSION_NUMBER).$(MINOR_VERSION_NUMBER).$(BUILD_NUMBER)
+
+installer:
+ -mkdir $(RELEASE_DIR)
+ -del $(RELEASE_DIR)\$(INSTALL_NAME)
+ -makensis /V1 $(NSIS_VERSIONS) /DOUTPUT_FILENAME=$(INSTALL_NAME) $(NSIS_SCRIPT_DIR)\gle.nsi
+ -move $(NSIS_SCRIPT_DIR)\$(INSTALL_NAME) $(RELEASE_DIR)
+
+
+
+
+
diff --git a/README.txt b/README.txt
new file mode 100644
index 0000000..96783be
--- /dev/null
+++ b/README.txt
@@ -0,0 +1,261 @@
+GLE Readme
+==========
+
+This document contains instructions on how to compile, install, and run GLE4.
+
+Supported platforms: Windows, Linux, Mac OS/X, Unix, OS/2.
+
+Contents
+--------
+
+1. What is GLE?
+2. Installing a GLE binary
+2.1 Installing GLE on Windows
+2.2 Installing GLE on OS/2
+3. Running GLE
+4. Compiling GLE from the source code
+4.1 Compiling with GCC (Windows, Linux, Mac OS/X, ...)
+4.2 Compiling on Windows (with Microsoft Visual C++)
+4.3 Compiling on OS/2 (with GCC 3.2.1)
+4.4 Notes for all platforms
+5. Source code organization
+6. License (BSD)
+
+1. What is GLE?
+---------------
+
+GLE (Graphics Layout Engine) is a graphics scripting language designed for creating publication quality graphs, plots, diagrams, figures and slides. GLE supports various graph types (function plots, histograms, bar graphs, scatter plots, contour lines, color maps, surface plots, ...) through a simple but flexible set of graphing commands. More complex output can be created by relying on GLE's scripting language, which is full featured with subroutines, variables, and logic control. GLE r [...]
+
+More information is available at <http://www.gle-graphics.org/>.
+
+2. Installing a GLE Binary
+--------------------------
+
+GLE is available as binary installation packages (one for each supported platform) or as source code. The source code must be compiled before it can be installed. To compile GLE from its source code on different platforms, see Section 4. This section describes how a GLE binary can be installed.
+
+2.1 Installing GLE on Windows
+-----------------------------
+
+The easiest way to install GLE on Windows is to download the self installing executable. The self installing executable is named GLE-<version>-exe-win32.exe. By double-clicking this file in Windows Explorer, it will guide you through the installation process.
+
+An installation guide illustrating this process (with screenshots) is available here:
+<http://www.gle-graphics.org/tut/windows.html>
+
+During installation, GLE will search for installed programs, such as GhostScript and LaTeX. GLE does not require these for its most basic operation, but it does so for more advanced features, such as producing PDF output and processing scripts including LaTeX commands. This search process runs in a black window (Command Prompt) and the output should be similar to the following:
+
+Running GLE -finddeps "C:\Program Files" (locate GLE fonts and optionally GhostScript/LaTeX): ................................................................................
+................................................................................
+................................................................................
+Found: GLE 4.1.0 in C:\Program Files\Gle4\4.1.0\bin\gle.exe
+Found: GLE 4.0.12 in C:\Program Files\Gle4\4.0.12\bin\gle.exe (*)
+Found: latex.exe in '?'
+Found: pdflatex.exe in '?'
+Found: dvips.exe in '?'
+Found: gswin32c.exe in 'C:\Program Files\Tools\gs8.53\gs8.53\bin\gswin32c.exe'
+Press enter to continue ...
+
+In this example, GLE has detected that GhostScript is installed on my computer, but it did not detect LaTeX. More information on using GLE with LaTeX is given below. For now, just focus the window saying "Press enter to contunue..." and press enter. Next click Finish on the installer screen.
+
+GLE should now have added a new entry titled GLE to your start menu. Clicking it pops up a menu showing the options "Command Prompt", "Readme", "Uninstall", and "Website". Click on "Command Prompt" to open a command prompt. Now type the command "gle" and press enter.
+
+C:\Program Files\Gle4\4.1.0\samples> gle
+GLE version 4.1.0
+Usage: gle [options] filename.gle
+More information: gle /help
+
+GLE should respond as in the example above. If you instead get the message "'gle' is not recognized as an internal or external command, operable program or batch file", then the folder containing "gle.exe" was not correctly added to your system's search path during installation.
+
+If the version number printed by GLE is not correct, then a previous version of GLE may be installed on your computer. Either uninstall that version or remove it from your system's search path (you will still be able to run it through the -v option, as discussed in the reference manual).
+
+I will now show you how to change the search path. This is a list of folders that Windows searches for executable programs when you try to run a particular program from the command prompt. Note that normally the GLE installer should have done this for you. Only perform the next step if you saw an error message or incorrect GLE version in the previous step.
+
+Select "Control Panel" from the start menu and click "System". Navigate to the "Advanced" tab and click the "Environment Variables" button. Select the variable "PATH" and click the "Edit" button. Add to the "Value" field the location of the GLE executable "gle.exe". This location is the installation folder you specified during installation with "\bin" added at the end, for example, C:\Program Files\Gle4\4.1.0\bin. Note that different folders in the PATH are separated with the symbol ";". [...]
+
+If you have LaTeX installed on your computer, you also need to perform the next step. LaTeX may not be installed in "C:\Program Files", and then GLE does not detect it automatically during installation. Open the command prompt and run "gle -finddeps LATEXPATH", with LATEXPATH the location of your LaTeX installation. The following example assumes that the MiKTeX distribution is installed (http://www.miktex.org/).
+
+C:>gle -finddeps "C:\MiKTeX"
+Finding dependencies in: C:\MiKTeX: ...........................
+Found: gle.exe in 'C:\Program Files\gle4\bin'
+Found: gswin32c.exe in 'C:\Program Files\Tools\gs\gs\gs8.00\bin'
+Found: latex.exe in 'C:\MiKTeX\Main\miktex\bin'
+Found: dvips.exe in 'C:\MiKTeX\Main\miktex\bin'
+
+Note that both GhostView and LaTeX are optional. For creating simple EPS graphs, they are not required, i.e., GLE will still work if you see question marks for gswin32c.exe, latex.exe and dvips.exe.
+
+You are all set. Information on how to run GLE is available in Section 3 and in the manual.
+
+2.2 Installing GLE on OS/2
+--------------------------
+
+Since you are reading this you downloaded the do it yourself .tar.gz package for GLE installation. To install this package:
+
+1) Unzipping gle-graphics-x.y.z-src.tar.gz will create the following files.
+
+gle\
+gle\doc\readme (you are reading this)
+gle\doc\gle-manual.pdf
+gle\gle.exe
+gle\gcc321m.dll
+gle\fbuild.exe
+gle\makefmt.exe
+gle\inittex.ini
+gle\glerc
+gle\font\*
+
+2) Put gle.exe somewhere into your PATH and *.dll into your LIBPATH.
+
+3) Add "SET GLE_TOP=x:/path/gle" to your config.sys.
+
+3. Running GLE
+--------------
+
+Running GLE is similar on all supported platforms.
+
+Note that GLE is a command line application. It takes as input a GLE script file and outputs an EPS, PS, PDF, JPG, or PNG file. GLE cannot be run from inside a file manager such as Windows Explorer. Instead it should be started from a terminal: an X-terminal or console application in Linux or the command prompt in Windows.
+
+To start GLE, open a terminal/command prompt and issue the command:
+
+gle -d outputtype yourfile.gle
+
+where outputtype is one of: eps, teps, ps, pdf, jpg, png
+
+and yourfile.gle is the file containing the your GLE script.
+
+E.g. (Windows):
+
+---------------------------------------------------------
+
+C:\Program Files\Gle4\samples>gle -d eps sample.gle
+GLE 4.1.0 [sample.gle]-C-R-[sample.eps]
+
+---------------------------------------------------------
+
+Preview the output file sample.eps with GhostView (e.g., by browsing with your favorite file manager to in this case C:\Program Files\Gle4\samples and clicking sample.eps).
+
+See the GLE manual for more information.
+<http://glx.sourceforge.net/>
+
+Or contact the GLE mailing list (glx-general) if you have any questions.
+<https://lists.sourceforge.net/lists/listinfo/glx-general>
+
+There is also an installation guide / introductory tutorial available for Windows here:
+<http://www.gle-graphics.org/tut/windows.html>
+
+and for Linux here:
+<http://www.gle-graphics.org/tut/linux.html>
+
+4. Compiling GLE from the source code
+-------------------------------------
+
+The GLE source code is distributed as gle-graphics-x.y.z-src.tar.gz.
+
+4.1 Compiling with GCC (Windows, Linux, Mac OS/X, ...)
+------------------------------------------------------
+
+To install GLE system-wide:
+
+ ./configure
+ make
+ make doc
+ su
+ make install
+
+To install GLE in your home directory:
+
+ ./configure --prefix=$HOME/apps
+ make
+ make doc
+ make install
+
+A detailed description of the above process can be found here:
+<http://www.gle-graphics.org/tut/gcc.html>
+
+The "make doc" builds the GLE manual in PDF format. This step is optional and requires that you have "pdflatex" installed.
+
+4.1.1 Installing the additional fonts from "gle-graphics-extrafonts-1.0.tar.gz"
+-------------------------------------------------------------------------------
+
+GLE has a set of additional fonts that are distributed separately. To include these in your GLE installation, you have to download them and extract them in the gle-graphics-x.y.z directory before compiling GLE. You also have to include the option "--with-extrafonts=yes" while configuring. For example,
+
+$ cd gle-graphics-x.y.z
+$ tar -xvzf $HOME/gle-graphics-extrafonts-1.0.tar.gz
+$ ./configure --with-extrafonts=yes
+$ make clean
+$ make
+$ make doc
+$ make install
+
+These instructions assume that you downloaded gle-graphics-extrafonts-1.0.tar.gz and saved it into your home directory.
+
+4.2 Compiling on Windows (with Microsoft Visual C++)
+----------------------------------------------------
+
+The compilation process uses "Makefiles". Visual Studio project files are not supported. Makefiles and config files ending in .vc are for the Microsoft Visual C++ compiler.
+
+To compile GLE with support for including bitmap files
+ libtiff <www.libtiff.org> and
+ libpng <www.libpng.org>
+
+are required, and
+ HAVE_LIBTIFF = 1
+ HAVE_LIBPNG = 1
+
+must be enabled in config.i (to disable bitmap support, comment these out with '#')
+
+ you must have the environment variable GLE_TOP point to the location
+ of C:\Path\To\gle4\bin
+
+ you must have the environment variable LIBTIFFDIR point to the location
+ of the libtiff.h and .lib files
+
+ you must have the environment variable LIBPNGDIR point to the location
+ of the png.h and .lib files
+
+ nmake -f Makefile.vc
+
+4.3 Compiling on OS/2 (with gcc 3.2.1)
+--------------------------------------
+
+ change the values of
+ INSTALL_DIR (D:/UTILS/gle)
+ INSTALL_BIN (D:/UTILS/bin)
+ ADD_DLLS (D:/GCC.321/dll/gcc321m.dll)
+ ADD_DOCS (readme ../gle-refman/gle-manual.pdf)
+ PROJECT_DIR (E:/Works/Projects/CGLE/current/gle4)
+ in config.os2
+
+ make -f Makefile.os2
+
+4.4 Notes for all platforms
+---------------------------
+
+Note: If you get the following error:
+ StringKeyHash.h:8: ext/hash_map: No such file or directory
+ Then add -DGCC2 to EXTRA_DEFS in config.{gcc,os2,nocygwin}
+
+ (Or upgrade to a newer version of gcc.)
+
+The compilation process will built:
+
+gle(.exe) : GLE main executable
+fbuild(.exe) : makes *.fve fron *.gle using fbuild in the src\font directory
+makefmt(.exe) : makes font files *.fmt from *.afm in the src\font directory
+
+It will also run the fbuild and makefmt commands and put the
+font files in the build/font directory along with the font.dat file.
+
+It will also run your newly built gle on the files
+in the src\samples subdirectory.
+
+The clean target is also defined on all makefiles.
+
+5. Source code organization
+---------------------------
+
+The source code is contained in the src sub directory, where each module has its
+own directory (and makefiles). Binaries are put in the build/bin sub directory.
+
+6. License
+----------
+
+See LICENSE.txt.
diff --git a/config.aconf b/config.aconf
new file mode 100644
index 0000000..4cea9da
--- /dev/null
+++ b/config.aconf
@@ -0,0 +1,55 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+#
+# config file for gcc and make
+#
+
+OBJ_SUFF = o
+EXE_SUFF =
+AR = ar
+RM = rm -rf
+RMDIR = rm -rf
+MKDIR = mkdir
+PATH_SEP = /
+
+#
+# other global defines
+#
+PROJECT_BINDIR = ../../build
+PROJECT_LIBDIR = ../../lib
+PROJECT_INCDIR = ../../include
diff --git a/config.gcc b/config.gcc
new file mode 100644
index 0000000..9883d24
--- /dev/null
+++ b/config.gcc
@@ -0,0 +1,113 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+#
+# config file for gcc and make
+#
+
+HAVE_LIBX11 = 1
+# enabling the above will include the X11 driver in gle
+
+# -Wunused-variable
+
+EXTRA_DEFS := -D __UNIX__ -Wreturn-type
+OBJ_SUFF =o
+CC =g++
+EXE_SUFF =
+AR =ar
+RM =rm -rf
+RMDIR =rm -rf
+MKDIR =mkdir
+PATH_SEP =/
+
+INSTALL_DIR =/usr/share/gle/$(VERSION_NUMBER).$(BUILD_NUMBER)
+INSTALL_BIN =$(GLE_RPM_ROOT)/usr/bin
+
+ROOT_INSTALL_DIR =$(GLE_RPM_ROOT)$(INSTALL_DIR)
+
+-include extraconfig.gcc
+
+#
+# other global defines
+#
+PROJECT_BINDIR = ../../build
+PROJECT_LIBDIR = ../../lib
+PROJECT_INCDIR = ../../include
+
+#
+# GLE_TOP does not need to be defined anymore during compile
+#
+GLE_TOP = ../../build
+
+EXTRA_INCLUDE_PATHS =
+EXTRA_LIB_PATHS =
+
+# On Solaris, add these to LIBS:
+# -lsocket -lnsl
+
+LIBS =
+
+ifeq (HAVE_LIBTIFF,1)
+ EXTRA_DEFS := $(EXTRA_DEFS) -D HAVE_LIBTIFF
+ ifdef LIBTIFFDIR
+ EXTRA_INCLUDE_PATHS := $(EXTRA_INCLUDE_PATHS) -I$(LIBTIFFDIR)
+ EXTRA_LIB_PATHS := $(EXTRA_LIB_PATHS) -L$(LIBTIFFDIR)
+ endif
+ LIBS := $(LIBS) -ltiff
+endif
+
+ifeq (HAVE_LIBPNG,1)
+ EXTRA_DEFS := $(EXTRA_DEFS) -D HAVE_LIBPNG
+ ifdef LIBPNGDIR
+ EXTRA_INCLUDE_PATHS := $(EXTRA_INCLUDE_PATHS) -I$(LIBPNGDIR) -I$(ZLIBDIR)
+ EXTRA_LIB_PATHS := $(EXTRA_LIB_PATHS) -L$(LIBPNGDIR)
+ endif
+ ifdef ZLIBDIR
+ EXTRA_INCLUDE_PATHS := $(EXTRA_INCLUDE_PATHS) -I$(ZLIBDIR)
+ EXTRA_LIB_PATHS := $(EXTRA_LIB_PATHS) -L$(ZLIBDIR)
+ endif
+ LIBS := $(LIBS) -lpng
+endif
+
+ifeq (HAVE_LIBX11,1)
+ EXTRA_DEFS := $(EXTRA_DEFS) -D HAVE_X11
+ EXTRA_LIB_PATHS := $(EXTRA_LIB_PATHS) -L/usr/X11/lib
+ LIBS := $(LIBS) -lX11
+endif
+
+CXXFLAGS =$(VERSION_INFO) $(EXTRA_DEFS) $(EXTRA_INCLUDE_PATHS)
+LINKFLAGS =$(EXTRA_LIB_PATHS) $(LIBS)
diff --git a/config.i b/config.i
new file mode 100644
index 0000000..ff6b9e2
--- /dev/null
+++ b/config.i
@@ -0,0 +1,72 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+#
+# global makefile include config.i for gle
+# this sets options common to all compilers
+#
+# this sets the global version number for all programs
+#
+MODULE_NAME =gle40
+BASE_NAME =GLE
+MAJOR_VERSION_NUMBER =4
+MINOR_VERSION_NUMBER =2
+BUILD_NUMBER =5
+VERSION_NUMBER =$(MAJOR_VERSION_NUMBER).$(MINOR_VERSION_NUMBER)
+VERSION_INFO =-DGLEVN="\"$(VERSION_NUMBER).$(BUILD_NUMBER)\""
+TAG =$(MODULE_NAME)_R_$(MAJOR_VERSION_NUMBER)_$(MINOR_VERSION_NUMBER)_$(BUILD_NUMBER)
+GLE_SRC_DIRS =src/gle src/makefmt src/fbuild src/manip src/gui
+
+#
+# -- optional packages (ignored if one uses ./configure)
+#
+
+HAVE_LIBTIFF = 0
+# libtiff at www.libtiff.org is needed for inclusion of
+# tiff files. if you dont have it comment out the line above
+# if you have it you must set the environment variable
+# LIBTIFFDIR to point to the location of libtiff
+
+HAVE_LIBPNG = 0
+# libpng at www.libpng.org is needed for inclusion of
+# PNG files. if you dont have it comment out the line above
+# you will also need zlib
+# if you have it you must set the environment variable
+# LIBPNGDIR to point to the location of libpng
+# ZLIBDIR to point to the location of zlib
+
+# For JPEG and GIF images, no extra libs are required!
diff --git a/config.nocygwin b/config.nocygwin
new file mode 100644
index 0000000..45656cd
--- /dev/null
+++ b/config.nocygwin
@@ -0,0 +1,67 @@
+#
+# config file for gcc and make
+#
+
+EXTRA_DEFS =-D __WIN32__ -D __NOCYGWIN__ -Wreturn-type
+OBJ_SUFF =o
+CC =gcc
+CXX =gcc
+EXE_SUFF =.exe
+AR =ar
+RM =rm -rf
+RMDIR =rm -rf
+MKDIR =mkdir
+
+INSTALL_DIR =C:\Program Files\gle4
+INSTALL_DIR2 =C:\\\\Program Files\\\\gle4
+PATH_SEP =/
+
+ROOT_INSTALL_DIR =$(GLE_RPM_ROOT)$(INSTALL_DIR)
+
+#
+# other global defines
+#
+PROJECT_BINDIR = ../../build
+PROJECT_LIBDIR = ../../lib
+PROJECT_INCDIR = ../../include
+
+#
+# GLE_TOP does not need to be defined anymore during compile
+#
+GLE_TOP = ../../build
+
+EXTRA_INCLUDE_PATHS =
+EXTRA_LIB_PATHS =
+LIBS =-lstdc++
+
+ifdef GNUWIN32DIR
+ EXTRA_INCLUDE_PATHS := $(EXTRA_INCLUDE_PATHS) -I"$(GNUWIN32DIR)/include"
+ EXTRA_LIB_PATHS := $(EXTRA_LIB_PATHS) -L"$(GNUWIN32DIR)/lib"
+endif
+
+ifdef HAVE_LIBTIFF
+ EXTRA_DEFS := $(EXTRA_DEFS) -D HAVE_LIBTIFF
+ ifdef LIBTIFFDIR
+ EXTRA_INCLUDE_PATHS := $(EXTRA_INCLUDE_PATHS) -I$(LIBTIFFDIR)
+ EXTRA_LIB_PATHS := $(EXTRA_LIB_PATHS) -L$(LIBTIFFDIR)
+ endif
+ LIBS := $(LIBS) -ltiff
+endif
+
+ifdef HAVE_LIBPNG
+ EXTRA_DEFS := $(EXTRA_DEFS) -D HAVE_LIBPNG
+ ifdef LIBPNGDIR
+ EXTRA_INCLUDE_PATHS := $(EXTRA_INCLUDE_PATHS) -I$(LIBPNGDIR) -I$(ZLIBDIR)
+ EXTRA_LIB_PATHS := $(EXTRA_LIB_PATHS) -L$(LIBPNGDIR)
+ endif
+ ifdef ZLIBDIR
+ EXTRA_LIB_PATHS := $(EXTRA_LIB_PATHS) -L$(ZLIBDIR)
+ endif
+ LIBS := $(LIBS) -lpng -lz -ljpeg
+endif
+
+-include extraconfig.nocygwin
+
+LINK_OPTS =-mno-cygwin
+CXXFLAGS =-O2 -I/home/jan/libs/install/include $(VERSION_INFO) $(EXTRA_INCLUDE_PATHS) $(EXTRA_DEFS) -mno-cygwin
+LINKFLAGS =-L/home/jan/libs/install/lib $(EXTRA_LIB_PATHS) -static $(LIBS)
diff --git a/config.os2 b/config.os2
new file mode 100644
index 0000000..db4f9c3
--- /dev/null
+++ b/config.os2
@@ -0,0 +1,96 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+#
+# config file for gcc and make
+# tested with gcc 3.2.1
+#
+
+INSTALL_DIR = D:/TOOLS/gle
+INSTALL_BIN = D:/TOOLS/bin
+
+PATH_SEP = /
+
+# additional files for the distribution
+ADD_DLLS = D:/GCC/3.2.1/usr/lib/gcc321m.dll
+ADD_DOCS = readme ../gle-refman/gle-manual.pdf
+
+ZIP = zip.exe
+
+# used by default; disable them
+CFLAGS =
+CPPFLAGS =
+LDFLAGS =
+
+#
+# OS/2 didn't like something like "\"..\""
+#
+VERSION_INFO =-DGLEVN=\"$(VERSION_NUMBER).$(BUILD_NUMBER)\"
+
+#
+# latest version of GCC 3.3.5 has its own isnumber() function
+#
+HAS_ISNUMBER =-D_EMXGCC_HAS_ISNUMBER_
+
+EXTRA_DEFS =-DHAVE_CONFIG_H -D__OS2__ -D__EMX__ -DOS2 -D__ST_MT_ERRNO__ $(WHICH_TEX) $(HAS_ISNUMBER)
+EXTRA_LIBS =-lpng -ltiff -lsocket
+EXTRA_INCS =-IX:/usr/include/ncurses
+OBJ_SUFF =o
+CC =g++
+EXE_SUFF =.exe
+AR =ar.exe
+RM =rm.exe -f
+RMDIR =rm.exe -rf
+MKDIR =mkdir.exe
+CP =cp.exe -f
+MV =mv.exe
+CXXFLAGS =-s -O2 -Zmtd -Zcrtdll -Zexe -Zbin-files $(EXTRA_INCS) $(VERSION_INFO) $(EXTRA_DEFS) -DINSTALL_DIR=\"$(INSTALL_DIR)\"
+LINK_OPTS =-s -O2 -Zmtd -Zcrtdll -Zexe -Zbin-files -D__ST_MT_ERRNO__
+
+#
+# other global defines
+#
+PROJECT_DIR = E:/Work/Projects/GLE/gle4
+PROJECT_BINDIR = $(PROJECT_DIR)/build
+PROJECT_LIBDIR = $(PROJECT_BINDIR)/lib
+PROJECT_INCDIR = $(PROJECT_BINDIR)/include
+
+#
+# GLE_TOP does not need to be defined anymore during compile
+#
+GLE_TOP = $(PROJECT_BINDIR)
+
diff --git a/config.vc b/config.vc
new file mode 100644
index 0000000..826592f
--- /dev/null
+++ b/config.vc
@@ -0,0 +1,101 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+#
+# config.vc for windows machines using vs.net and nmake
+#
+# include the global config file
+#
+!include config.i
+
+#
+# other global defines
+#
+PROJECT_BINDIR = ..\..\build
+PROJECT_LIBDIR = ..\..\lib
+PROJECT_INCDIR = ..\..\include
+INSTALL_DIR =c:\\program files\\gle
+EXE_SUFF =.exe
+OBJ_SUFF =obj
+CC =cl
+AR =link
+RM =erase
+RMDIR =rmdir
+MKDIR =mkdir
+PATH_SEP =^\
+
+EXTRA_DEFS =-D __WIN32__
+EXTRA_INCLUDE_PATHS =-I$(BOOSTDIR)
+EXTRA_LIB_PATHS =
+LIBS =
+
+WINLIBS = advapi32.lib comctl32.lib comdlg32.lib gdi32.lib kernel32.lib odbc32.lib oldnames.lib ole32.lib oleaut32.lib rpcrt4.lib shell32.lib user32.lib uuid.lib winmm.lib winspool.lib wsock32.lib
+
+!ifdef HAVE_LIBTIFF
+EXTRA_INCLUDE_PATHS = $(EXTRA_INCLUDE_PATHS) -I$(LIBTIFFDIR)
+EXTRA_DEFS = $(EXTRA_DEFS) -D HAVE_LIBTIFF
+EXTRA_LIB_PATHS = $(EXTRA_LIB_PATHS) -LIBPATH:$(LIBTIFFDIR)
+LIBS = $(LIBS) libtiff.lib
+!endif
+
+!ifdef HAVE_LIBPNG
+EXTRA_DEFS = $(EXTRA_DEFS) -D HAVE_LIBPNG
+EXTRA_INCLUDE_PATHS = $(EXTRA_INCLUDE_PATHS) -I$(LIBPNGDIR) -I$(ZLIBDIR)
+EXTRA_LIB_PATHS = $(EXTRA_LIB_PATHS) -LIBPATH:$(LIBPNGDIR) -LIBPATH:$(ZLIBDIR)
+LIBS = $(LIBS) libpng.lib zlib.lib
+!endif
+
+!ifdef HAVE_LIBJPEG
+EXTRA_DEFS = $(EXTRA_DEFS) -D __JPEG__
+EXTRA_INCLUDE_PATHS = $(EXTRA_INCLUDE_PATHS) -I$(LIBJPEGDIR)
+EXTRA_LIB_PATHS = $(EXTRA_LIB_PATHS) -LIBPATH:$(LIBJPEGDIR)
+LIBS = $(LIBS) jpeg.lib
+!endif
+
+
+# multithreaded dll link to msvcrt.dll
+# this is the default on all the libs such as zlib, libtiff and lpng
+#
+#
+
+CPPFLAGS =/nologo /MD /EHsc /Ox -I$(GLOBAL_INCDIR) -I$(PROJECT_INCDIR) $(EXTRA_INCLUDE_PATHS) $(VERSION_INFO) $(EXTRA_DEFS) -DINSTALL_DIR="\"$(INSTALL_DIR)\""
+LINKFLAGS =/nologo -LIBPATH:$(GLOBAL_LIBDIR) $(EXTRA_LIB_PATHS)
+
+# for win32
+LIBS= $(LIBS) $(WINLIBS)
+
+
diff --git a/configure b/configure
new file mode 100755
index 0000000..79ce64e
--- /dev/null
+++ b/configure
@@ -0,0 +1,7246 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.69 for gle-graphics 4.2.5.
+#
+# Report bugs to <glx-general at lists.sourceforge.net>.
+#
+#
+# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
+#
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='print -r --'
+ as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='printf %s\n'
+ as_echo_n='printf %s'
+else
+ if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+ as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+ as_echo_n='/usr/ucb/echo -n'
+ else
+ as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+ as_echo_n_body='eval
+ arg=$1;
+ case $arg in #(
+ *"$as_nl"*)
+ expr "X$arg" : "X\\(.*\\)$as_nl";
+ arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+ esac;
+ expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+ '
+ export as_echo_n_body
+ as_echo_n='sh -c $as_echo_n_body as_echo'
+ fi
+ export as_echo_body
+ as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order. Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" "" $as_nl"
+
+# Find who we are. Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there. '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+# Use a proper internal environment variable to ensure we don't fall
+ # into an infinite loop, continuously re-executing ourselves.
+ if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then
+ _as_can_reexec=no; export _as_can_reexec;
+ # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+ *v*x* | *x*v* ) as_opts=-vx ;;
+ *v* ) as_opts=-v ;;
+ *x* ) as_opts=-x ;;
+ * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+as_fn_exit 255
+ fi
+ # We don't want this to propagate to other subprocesses.
+ { _as_can_reexec=; unset _as_can_reexec;}
+if test "x$CONFIG_SHELL" = x; then
+ as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '\${1+\"\$@\"}'='\"\$@\"'
+ setopt NO_GLOB_SUBST
+else
+ case \`(set -o) 2>/dev/null\` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+"
+ as_required="as_fn_return () { (exit \$1); }
+as_fn_success () { as_fn_return 0; }
+as_fn_failure () { as_fn_return 1; }
+as_fn_ret_success () { return 0; }
+as_fn_ret_failure () { return 1; }
+
+exitcode=0
+as_fn_success || { exitcode=1; echo as_fn_success failed.; }
+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
+if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+
+else
+ exitcode=1; echo positional parameters were not saved.
+fi
+test x\$exitcode = x0 || exit 1
+test -x / || exit 1"
+ as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
+ as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
+ eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
+ test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
+test \$(( 1 + 1 )) = 2 || exit 1"
+ if (eval "$as_required") 2>/dev/null; then :
+ as_have_required=yes
+else
+ as_have_required=no
+fi
+ if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
+
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ as_found=:
+ case $as_dir in #(
+ /*)
+ for as_base in sh bash ksh sh5; do
+ # Try only shells that exist, to save several forks.
+ as_shell=$as_dir/$as_base
+ if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+ { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+ CONFIG_SHELL=$as_shell as_have_required=yes
+ if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+ break 2
+fi
+fi
+ done;;
+ esac
+ as_found=false
+done
+$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+ { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
+ CONFIG_SHELL=$SHELL as_have_required=yes
+fi; }
+IFS=$as_save_IFS
+
+
+ if test "x$CONFIG_SHELL" != x; then :
+ export CONFIG_SHELL
+ # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+ *v*x* | *x*v* ) as_opts=-vx ;;
+ *v* ) as_opts=-v ;;
+ *x* ) as_opts=-x ;;
+ * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
+fi
+
+ if test x$as_have_required = xno; then :
+ $as_echo "$0: This script requires a shell more modern than all"
+ $as_echo "$0: the shells that I found on your system."
+ if test x${ZSH_VERSION+set} = xset ; then
+ $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+ $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+ else
+ $as_echo "$0: Please tell bug-autoconf at gnu.org and
+$0: glx-general at lists.sourceforge.net about your system,
+$0: including any error possibly output before this
+$0: message. Then install a modern shell, or manually run
+$0: the script under such a shell if you do have one."
+ fi
+ exit 1
+fi
+fi
+fi
+SHELL=${CONFIG_SHELL-/bin/sh}
+export SHELL
+# Unset more variables known to interfere with behavior of common tools.
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+
+## --------------------- ##
+## M4sh Shell Functions. ##
+## --------------------- ##
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+ { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+ return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+ set +e
+ as_fn_set_status $1
+ exit $1
+} # as_fn_exit
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || eval $as_mkdir_p || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+ eval 'as_fn_append ()
+ {
+ eval $1+=\$2
+ }'
+else
+ as_fn_append ()
+ {
+ eval $1=\$$1\$2
+ }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+ eval 'as_fn_arith ()
+ {
+ as_val=$(( $* ))
+ }'
+else
+ as_fn_arith ()
+ {
+ as_val=`expr "$@" || test $? -eq 1`
+ }
+fi # as_fn_arith
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+ as_status=$1; test $as_status -eq 0 && as_status=1
+ if test "$4"; then
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ fi
+ $as_echo "$as_me: error: $2" >&2
+ as_fn_exit $as_status
+} # as_fn_error
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+ as_lineno_1=$LINENO as_lineno_1a=$LINENO
+ as_lineno_2=$LINENO as_lineno_2a=$LINENO
+ eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
+ test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
+ # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-)
+ sed -n '
+ p
+ /[$]LINENO/=
+ ' <$as_myself |
+ sed '
+ s/[$]LINENO.*/&-/
+ t lineno
+ b
+ :lineno
+ N
+ :loop
+ s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+ t loop
+ s/-\n.*//
+ ' >$as_me.lineno &&
+ chmod +x "$as_me.lineno" ||
+ { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+
+ # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
+ # already done that, so ensure we don't try to do so again and fall
+ # in an infinite loop. This has already happened in practice.
+ _as_can_reexec=no; export _as_can_reexec
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensitive to this).
+ . "./$as_me.lineno"
+ # Exit status is that of the last command.
+ exit
+}
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+ case `echo 'xy\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ xy) ECHO_C='\c';;
+ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
+ ECHO_T=' ';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -pR'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -pR'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -pR'
+ fi
+else
+ as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p='mkdir -p "$as_dir"'
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+test -n "$DJDIR" || exec 7<&0 </dev/null
+exec 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+
+# Identity of this package.
+PACKAGE_NAME='gle-graphics'
+PACKAGE_TARNAME='gle-graphics'
+PACKAGE_VERSION='4.2.5'
+PACKAGE_STRING='gle-graphics 4.2.5'
+PACKAGE_BUGREPORT='glx-general at lists.sourceforge.net'
+PACKAGE_URL=''
+
+ac_unique_file="src/gle/gle.cpp"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# ifdef HAVE_STDLIB_H
+# include <stdlib.h>
+# endif
+#endif
+#ifdef HAVE_STRING_H
+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
+# include <memory.h>
+# endif
+# include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_subst_vars='LTLIBOBJS
+LIBOBJS
+HAVE_EXTRA_FONTS
+QT_LDFLAGS
+QT_CPPFLAGS
+QT_LIBGLU_LIB
+QT_RPATH
+QT_CONFIG
+MAKE_AUTOPACKAGE
+GLE_VERSION
+GLE_INSTALL_BIN
+GLE_INSTALL_DATA
+LIBGLE_LDFLAGS
+LIBGLE_CPPFLAGS
+MANIP_LDFLAGS
+MANIP_LIBS
+SIMPLE_LDFLAGS
+SIMPLE_LIBS_DL
+SIMPLE_LIBS
+GLE_SNAPSHOT
+AP_CONFIG_ARGS
+MAKE_MANIP
+HAVE_RPATH
+HAVE_MINGW
+HAVE_CYGWIN
+HAVE_NOCYGWIN
+HAVE_WIN32
+HAVE_FREEBSD
+HAVE_MAC
+HAVE_AUTOPACKAGE
+HAVE_LIBGLE_STATIC
+HAVE_LIBGLE_CPPFLAGS
+HAVE_LIBGLE
+HAVE_QT
+HAVE_NOSCRIPTS
+HAVE_CAIRO
+HAVE_LIBJPEG
+HAVE_LIBPNG
+HAVE_LIBTIFF
+HAVE_SOCKETS
+STRIPUNNEEDED
+STRIPALL
+ac_ct_STRIP
+STRIP
+QMAKE_PROG
+POPPLER_LIBS
+POPPLER_CFLAGS
+cairo_LIBS
+cairo_CFLAGS
+LIBPNG_CONFIG
+libpng_LIBS
+libpng_CFLAGS
+XMKMF
+PKG_CONFIG_LIBDIR
+PKG_CONFIG_PATH
+PKG_CONFIG
+EGREP
+GREP
+CXXCPP
+host_os
+host_vendor
+host_cpu
+host
+build_os
+build_vendor
+build_cpu
+build
+MKDIR_P
+INSTALL_DATA
+INSTALL_SCRIPT
+INSTALL_PROGRAM
+OBJEXT
+EXEEXT
+ac_ct_CXX
+CPPFLAGS
+LDFLAGS
+CXXFLAGS
+CXX
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_URL
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+with_qt
+with_jpeg
+with_png
+with_tiff
+with_z
+with_cairo
+with_poppler
+with_manip
+with_debug
+with_warn
+with_win32
+with_arch
+with_scripts
+with_libgle
+with_rpath
+with_extrafonts
+with_gnuwin32
+with_staticlink
+with_autopackage
+with_apintern
+with_x
+'
+ ac_precious_vars='build_alias
+host_alias
+target_alias
+CXX
+CXXFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CCC
+CXXCPP
+PKG_CONFIG
+PKG_CONFIG_PATH
+PKG_CONFIG_LIBDIR
+XMKMF
+libpng_CFLAGS
+libpng_LIBS
+cairo_CFLAGS
+cairo_LIBS
+POPPLER_CFLAGS
+POPPLER_LIBS'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval $ac_prev=\$ac_option
+ ac_prev=
+ continue
+ fi
+
+ case $ac_option in
+ *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+ *=) ac_optarg= ;;
+ *) ac_optarg=yes ;;
+ esac
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case $ac_dashdash$ac_option in
+ --)
+ ac_dashdash=yes ;;
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir=$ac_optarg ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build_alias ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build_alias=$ac_optarg ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file=$ac_optarg ;;
+
+ --config-cache | -C)
+ cache_file=config.cache ;;
+
+ -datadir | --datadir | --datadi | --datad)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=*)
+ datadir=$ac_optarg ;;
+
+ -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+ | --dataroo | --dataro | --datar)
+ ac_prev=datarootdir ;;
+ -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+ datarootdir=$ac_optarg ;;
+
+ -disable-* | --disable-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid feature name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"enable_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval enable_$ac_useropt=no ;;
+
+ -docdir | --docdir | --docdi | --doc | --do)
+ ac_prev=docdir ;;
+ -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+ docdir=$ac_optarg ;;
+
+ -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+ ac_prev=dvidir ;;
+ -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+ dvidir=$ac_optarg ;;
+
+ -enable-* | --enable-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid feature name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"enable_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval enable_$ac_useropt=\$ac_optarg ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix=$ac_optarg ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he | -h)
+ ac_init_help=long ;;
+ -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+ ac_init_help=recursive ;;
+ -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+ ac_init_help=short ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host_alias ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host_alias=$ac_optarg ;;
+
+ -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+ ac_prev=htmldir ;;
+ -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+ | --ht=*)
+ htmldir=$ac_optarg ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir=$ac_optarg ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir=$ac_optarg ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir=$ac_optarg ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir=$ac_optarg ;;
+
+ -localedir | --localedir | --localedi | --localed | --locale)
+ ac_prev=localedir ;;
+ -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+ localedir=$ac_optarg ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst | --locals)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+ localstatedir=$ac_optarg ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir=$ac_optarg ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c | -n)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir=$ac_optarg ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix=$ac_optarg ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix=$ac_optarg ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix=$ac_optarg ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name=$ac_optarg ;;
+
+ -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+ ac_prev=pdfdir ;;
+ -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+ pdfdir=$ac_optarg ;;
+
+ -psdir | --psdir | --psdi | --psd | --ps)
+ ac_prev=psdir ;;
+ -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+ psdir=$ac_optarg ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir=$ac_optarg ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir=$ac_optarg ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site=$ac_optarg ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir=$ac_optarg ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir=$ac_optarg ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target_alias ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target_alias=$ac_optarg ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers | -V)
+ ac_init_version=: ;;
+
+ -with-* | --with-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid package name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"with_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval with_$ac_useropt=\$ac_optarg ;;
+
+ -without-* | --without-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid package name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"with_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval with_$ac_useropt=no ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes=$ac_optarg ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries=$ac_optarg ;;
+
+ -*) as_fn_error $? "unrecognized option: \`$ac_option'
+Try \`$0 --help' for more information"
+ ;;
+
+ *=*)
+ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+ # Reject names that are not valid shell variable names.
+ case $ac_envvar in #(
+ '' | [0-9]* | *[!_$as_cr_alnum]* )
+ as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
+ esac
+ eval $ac_envvar=\$ac_optarg
+ export $ac_envvar ;;
+
+ *)
+ # FIXME: should be removed in autoconf 3.0.
+ $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+ : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+ as_fn_error $? "missing argument to $ac_option"
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+ case $enable_option_checking in
+ no) ;;
+ fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
+ *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+ esac
+fi
+
+# Check all directory arguments for consistency.
+for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
+ datadir sysconfdir sharedstatedir localstatedir includedir \
+ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+ libdir localedir mandir
+do
+ eval ac_val=\$$ac_var
+ # Remove trailing slashes.
+ case $ac_val in
+ */ )
+ ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+ eval $ac_var=\$ac_val;;
+ esac
+ # Be sure to have absolute directory names.
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* ) continue;;
+ NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+ esac
+ as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+ if test "x$build_alias" = x; then
+ cross_compiling=maybe
+ elif test "x$build_alias" != "x$host_alias"; then
+ cross_compiling=yes
+ fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+ as_fn_error $? "working directory cannot be determined"
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+ as_fn_error $? "pwd does not report name of working directory"
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then the parent directory.
+ ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_myself" : 'X\(//\)[^/]' \| \
+ X"$as_myself" : 'X\(//\)$' \| \
+ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_myself" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ srcdir=$ac_confdir
+ if test ! -r "$srcdir/$ac_unique_file"; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+ test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+ as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+ cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
+ pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+ srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+ eval ac_env_${ac_var}_set=\${${ac_var}+set}
+ eval ac_env_${ac_var}_value=\$${ac_var}
+ eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+ eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat <<_ACEOF
+\`configure' configures gle-graphics 4.2.5 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE. See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+ -h, --help display this help and exit
+ --help=short display options specific to this package
+ --help=recursive display the short help of all the included packages
+ -V, --version display version information and exit
+ -q, --quiet, --silent do not print \`checking ...' messages
+ --cache-file=FILE cache test results in FILE [disabled]
+ -C, --config-cache alias for \`--cache-file=config.cache'
+ -n, --no-create do not create output files
+ --srcdir=DIR find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+ --bindir=DIR user executables [EPREFIX/bin]
+ --sbindir=DIR system admin executables [EPREFIX/sbin]
+ --libexecdir=DIR program executables [EPREFIX/libexec]
+ --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data [PREFIX/var]
+ --libdir=DIR object code libraries [EPREFIX/lib]
+ --includedir=DIR C header files [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc [/usr/include]
+ --datarootdir=DIR read-only arch.-independent data root [PREFIX/share]
+ --datadir=DIR read-only architecture-independent data [DATAROOTDIR]
+ --infodir=DIR info documentation [DATAROOTDIR/info]
+ --localedir=DIR locale-dependent data [DATAROOTDIR/locale]
+ --mandir=DIR man documentation [DATAROOTDIR/man]
+ --docdir=DIR documentation root [DATAROOTDIR/doc/gle-graphics]
+ --htmldir=DIR html documentation [DOCDIR]
+ --dvidir=DIR dvi documentation [DOCDIR]
+ --pdfdir=DIR pdf documentation [DOCDIR]
+ --psdir=DIR ps documentation [DOCDIR]
+_ACEOF
+
+ cat <<\_ACEOF
+
+X features:
+ --x-includes=DIR X include files are in DIR
+ --x-libraries=DIR X library files are in DIR
+
+System types:
+ --build=BUILD configure for building on BUILD [guessed]
+ --host=HOST cross-compile to build programs to run on HOST [BUILD]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+ case $ac_init_help in
+ short | recursive ) echo "Configuration of gle-graphics 4.2.5:";;
+ esac
+ cat <<\_ACEOF
+
+Optional Packages:
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --with-qt=DIR where to find the Qt-4.1.x library (or yes/no)
+ --with-jpeg=DIR where to find the jpeg library (or yes/no)
+ --with-png=DIR where to find the png library (or yes/no)
+ --with-tiff=DIR where to find the tiff library (or yes/no)
+ --with-z=DIR where to find the z library (or yes/no)
+ --with-cairo use the Cairo graphics library (yes/no)
+ --with-poppler use the Poppler PDF library (yes/no)
+ --with-manip build manip utility (yes/no)
+ --with-debug compile in debug information (yes/no)
+ --with-warn compile with all warnings enabled (yes/no)
+ --with-win32 compile Windows binary (yes/no)
+ --with-arch compile for a specific Mac OS architecture (or default/no)
+ --with-scripts install scripts instead of executables (yes/no)
+ --with-libgle build libgle (yes/no/static/both)
+ --with-rpath build with rpath (or yes/no)
+ --with-extrafonts include additional fonts (or yes/no)
+ --with-gnuwin32 build with GnuWin32 libs (yes/no)
+ --with-staticlink statically link bitmap libs (yes/no)
+ --with-autopackage create autopackage package (yes/no)
+ --with-apintern autopackage (internal use) (yes/no)
+ --with-x use the X Window System
+
+Some influential environment variables:
+ CXX C++ compiler command
+ CXXFLAGS C++ compiler flags
+ LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
+ nonstandard directory <lib dir>
+ LIBS libraries to pass to the linker, e.g. -l<library>
+ CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
+ you have headers in a nonstandard directory <include dir>
+ CXXCPP C++ preprocessor
+ PKG_CONFIG path to pkg-config utility
+ PKG_CONFIG_PATH
+ directories to add to pkg-config's search path
+ PKG_CONFIG_LIBDIR
+ path overriding pkg-config's built-in search path
+ XMKMF Path to xmkmf, Makefile generator for X Window System
+ libpng_CFLAGS
+ C compiler flags for libpng, overriding pkg-config
+ libpng_LIBS linker flags for libpng, overriding pkg-config
+ cairo_CFLAGS
+ C compiler flags for cairo, overriding pkg-config
+ cairo_LIBS linker flags for cairo, overriding pkg-config
+ POPPLER_CFLAGS
+ C compiler flags for POPPLER, overriding pkg-config
+ POPPLER_LIBS
+ linker flags for POPPLER, overriding pkg-config
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to <glx-general at lists.sourceforge.net>.
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+ # If there are subdirs, report their specific --help.
+ for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+ test -d "$ac_dir" ||
+ { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+ continue
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+ cd "$ac_dir" || { ac_status=$?; continue; }
+ # Check for guested configure.
+ if test -f "$ac_srcdir/configure.gnu"; then
+ echo &&
+ $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+ elif test -f "$ac_srcdir/configure"; then
+ echo &&
+ $SHELL "$ac_srcdir/configure" --help=recursive
+ else
+ $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+ fi || ac_status=$?
+ cd "$ac_pwd" || { ac_status=$?; break; }
+ done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+ cat <<\_ACEOF
+gle-graphics configure 4.2.5
+generated by GNU Autoconf 2.69
+
+Copyright (C) 2012 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+ exit
+fi
+
+## ------------------------ ##
+## Autoconf initialization. ##
+## ------------------------ ##
+
+# ac_fn_cxx_try_compile LINENO
+# ----------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext
+ if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_cxx_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_compile
+
+# ac_fn_cxx_try_cpp LINENO
+# ------------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_cpp ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } > conftest.i && {
+ test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+ test ! -s conftest.err
+ }; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_cpp
+
+# ac_fn_cxx_check_header_mongrel LINENO HEADER VAR INCLUDES
+# ---------------------------------------------------------
+# Tests whether HEADER exists, giving a warning if it cannot be compiled using
+# the include files in INCLUDES and setting the cache variable VAR
+# accordingly.
+ac_fn_cxx_check_header_mongrel ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if eval \${$3+:} false; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+else
+ # Is the header compilable?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
+$as_echo_n "checking $2 usability... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ ac_header_compiler=yes
+else
+ ac_header_compiler=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
+$as_echo_n "checking $2 presence... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <$2>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+ ac_header_preproc=yes
+else
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in #((
+ yes:no: )
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+ ;;
+ no:yes:* )
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+( $as_echo "## ------------------------------------------------ ##
+## Report this to glx-general at lists.sourceforge.net ##
+## ------------------------------------------------ ##"
+ ) | sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ eval "$3=\$ac_header_compiler"
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_cxx_check_header_mongrel
+
+# ac_fn_cxx_try_run LINENO
+# ------------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
+# that executables *can* be run.
+ac_fn_cxx_try_run ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+ { { case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: program exited with status $ac_status" >&5
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=$ac_status
+fi
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_run
+
+# ac_fn_cxx_check_header_compile LINENO HEADER VAR INCLUDES
+# ---------------------------------------------------------
+# Tests whether HEADER exists and can be compiled using the include files in
+# INCLUDES, setting the cache variable VAR accordingly.
+ac_fn_cxx_check_header_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ eval "$3=yes"
+else
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_cxx_check_header_compile
+
+# ac_fn_c_find_uintX_t LINENO BITS VAR
+# ------------------------------------
+# Finds an unsigned integer type with width BITS, setting cache variable VAR
+# accordingly.
+ac_fn_c_find_uintX_t ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uint$2_t" >&5
+$as_echo_n "checking for uint$2_t... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ eval "$3=no"
+ # Order is important - never check a type that is potentially smaller
+ # than half of the expected target width.
+ for ac_type in uint$2_t 'unsigned int' 'unsigned long int' \
+ 'unsigned long long int' 'unsigned short int' 'unsigned char'; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !((($ac_type) -1 >> ($2 / 2 - 1)) >> ($2 / 2 - 1) == 3)];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ case $ac_type in #(
+ uint$2_t) :
+ eval "$3=yes" ;; #(
+ *) :
+ eval "$3=\$ac_type" ;;
+esac
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ if eval test \"x\$"$3"\" = x"no"; then :
+
+else
+ break
+fi
+ done
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_find_uintX_t
+
+# ac_fn_cxx_try_link LINENO
+# -------------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_link ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext conftest$ac_exeext
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_cxx_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ test -x conftest$ac_exeext
+ }; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+ # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+ # interfere with the next link command; also delete a directory that is
+ # left behind by Apple's compiler. We do this before executing the actions.
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_link
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by gle-graphics $as_me 4.2.5, which was
+generated by GNU Autoconf 2.69. Invocation command line was
+
+ $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
+
+/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown`
+/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
+/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ $as_echo "PATH: $as_dir"
+ done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+ for ac_arg
+ do
+ case $ac_arg in
+ -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ continue ;;
+ *\'*)
+ ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ case $ac_pass in
+ 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
+ 2)
+ as_fn_append ac_configure_args1 " '$ac_arg'"
+ if test $ac_must_keep_next = true; then
+ ac_must_keep_next=false # Got value, back to normal.
+ else
+ case $ac_arg in
+ *=* | --config-cache | -C | -disable-* | --disable-* \
+ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+ | -with-* | --with-* | -without-* | --without-* | --x)
+ case "$ac_configure_args0 " in
+ "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+ esac
+ ;;
+ -* ) ac_must_keep_next=true ;;
+ esac
+ fi
+ as_fn_append ac_configure_args " '$ac_arg'"
+ ;;
+ esac
+ done
+done
+{ ac_configure_args0=; unset ac_configure_args0;}
+{ ac_configure_args1=; unset ac_configure_args1;}
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log. We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+ # Save into config.log some information that might help in debugging.
+ {
+ echo
+
+ $as_echo "## ---------------- ##
+## Cache variables. ##
+## ---------------- ##"
+ echo
+ # The following way of writing the cache mishandles newlines in values,
+(
+ for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+ *) { eval $ac_var=; unset $ac_var;} ;;
+ esac ;;
+ esac
+ done
+ (set) 2>&1 |
+ case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ sed -n \
+ "s/'\''/'\''\\\\'\'''\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+ ;; #(
+ *)
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+)
+ echo
+
+ $as_echo "## ----------------- ##
+## Output variables. ##
+## ----------------- ##"
+ echo
+ for ac_var in $ac_subst_vars
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ $as_echo "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+
+ if test -n "$ac_subst_files"; then
+ $as_echo "## ------------------- ##
+## File substitutions. ##
+## ------------------- ##"
+ echo
+ for ac_var in $ac_subst_files
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ $as_echo "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+ fi
+
+ if test -s confdefs.h; then
+ $as_echo "## ----------- ##
+## confdefs.h. ##
+## ----------- ##"
+ echo
+ cat confdefs.h
+ echo
+ fi
+ test "$ac_signal" != 0 &&
+ $as_echo "$as_me: caught signal $ac_signal"
+ $as_echo "$as_me: exit $exit_status"
+ } >&5
+ rm -f core *.core core.conftest.* &&
+ rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+ exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+ trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+$as_echo "/* confdefs.h */" > confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_URL "$PACKAGE_URL"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer an explicitly selected file to automatically selected ones.
+ac_site_file1=NONE
+ac_site_file2=NONE
+if test -n "$CONFIG_SITE"; then
+ # We do not want a PATH search for config.site.
+ case $CONFIG_SITE in #((
+ -*) ac_site_file1=./$CONFIG_SITE;;
+ */*) ac_site_file1=$CONFIG_SITE;;
+ *) ac_site_file1=./$CONFIG_SITE;;
+ esac
+elif test "x$prefix" != xNONE; then
+ ac_site_file1=$prefix/share/config.site
+ ac_site_file2=$prefix/etc/config.site
+else
+ ac_site_file1=$ac_default_prefix/share/config.site
+ ac_site_file2=$ac_default_prefix/etc/config.site
+fi
+for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+do
+ test "x$ac_site_file" = xNONE && continue
+ if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+ sed 's/^/| /' "$ac_site_file" >&5
+ . "$ac_site_file" \
+ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "failed to load site script $ac_site_file
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+done
+
+if test -r "$cache_file"; then
+ # Some versions of bash will fail to source /dev/null (special files
+ # actually), so we avoid doing that. DJGPP emulates it as a regular file.
+ if test /dev/null != "$cache_file" && test -f "$cache_file"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+$as_echo "$as_me: loading cache $cache_file" >&6;}
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) . "$cache_file";;
+ *) . "./$cache_file";;
+ esac
+ fi
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+$as_echo "$as_me: creating cache $cache_file" >&6;}
+ >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+ eval ac_old_set=\$ac_cv_env_${ac_var}_set
+ eval ac_new_set=\$ac_env_${ac_var}_set
+ eval ac_old_val=\$ac_cv_env_${ac_var}_value
+ eval ac_new_val=\$ac_env_${ac_var}_value
+ case $ac_old_set,$ac_new_set in
+ set,)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,set)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,);;
+ *)
+ if test "x$ac_old_val" != "x$ac_new_val"; then
+ # differences in whitespace do not lead to failure.
+ ac_old_val_w=`echo x $ac_old_val`
+ ac_new_val_w=`echo x $ac_new_val`
+ if test "$ac_old_val_w" != "$ac_new_val_w"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ ac_cache_corrupted=:
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+ eval $ac_var=\$ac_old_val
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5
+$as_echo "$as_me: former value: \`$ac_old_val'" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5
+$as_echo "$as_me: current value: \`$ac_new_val'" >&2;}
+ fi;;
+ esac
+ # Pass precious variables to config.status.
+ if test "$ac_new_set" = set; then
+ case $ac_new_val in
+ *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *) ac_arg=$ac_var=$ac_new_val ;;
+ esac
+ case " $ac_configure_args " in
+ *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
+ *) as_fn_append ac_configure_args " '$ac_arg'" ;;
+ esac
+ fi
+done
+if $ac_cache_corrupted; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+ as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+fi
+## -------------------- ##
+## Main body of script. ##
+## -------------------- ##
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+ac_config_headers="$ac_config_headers src/config.h"
+
+
+
+GLE_VERSION=4.2.5
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+if test -z "$CXX"; then
+ if test -n "$CCC"; then
+ CXX=$CCC
+ else
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CXX+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CXX"; then
+ ac_cv_prog_CXX="$CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CXX=$ac_cv_prog_CXX
+if test -n "$CXX"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
+$as_echo "$CXX" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$CXX" && break
+ done
+fi
+if test -z "$CXX"; then
+ ac_ct_CXX=$CXX
+ for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CXX+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_CXX"; then
+ ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CXX="$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+if test -n "$ac_ct_CXX"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5
+$as_echo "$ac_ct_CXX" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_CXX" && break
+done
+
+ if test "x$ac_ct_CXX" = x; then
+ CXX="g++"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CXX=$ac_ct_CXX
+ fi
+fi
+
+ fi
+fi
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+ { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ sed '10a\
+... rest of stderr output deleted ...
+ 10q' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ fi
+ rm -f conftest.er1 conftest.err
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+done
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5
+$as_echo_n "checking whether the C++ compiler works... " >&6; }
+ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
+ac_rmfiles=
+for ac_file in $ac_files
+do
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+ * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+ esac
+done
+rm -f $ac_rmfiles
+
+if { { ac_try="$ac_link_default"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link_default") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then :
+ # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile. We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
+ ;;
+ [ab].out )
+ # We found the default executable, but exeext='' is most
+ # certainly right.
+ break;;
+ *.* )
+ if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+ then :; else
+ ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ fi
+ # We set ac_cv_exeext here because the later test for it is not
+ # safe: cross compilers may not add the suffix if given an `-o'
+ # argument, so we may need to know it at that point already.
+ # Even if this section looks crufty: it has the advantage of
+ # actually working.
+ break;;
+ * )
+ break;;
+ esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else
+ ac_file=''
+fi
+if test -z "$ac_file"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+$as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "C++ compiler cannot create executables
+See \`config.log' for more details" "$LINENO" 5; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name" >&5
+$as_echo_n "checking for C++ compiler default output file name... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+$as_echo "$ac_file" >&6; }
+ac_exeext=$ac_cv_exeext
+
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+$as_echo_n "checking for suffix of executables... " >&6; }
+if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then :
+ # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+ *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ break;;
+ * ) break;;
+ esac
+done
+else
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest conftest$ac_cv_exeext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+$as_echo "$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdio.h>
+int
+main ()
+{
+FILE *f = fopen ("conftest.out", "w");
+ return ferror (f) || fclose (f) != 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files="$ac_clean_files conftest.out"
+# Check that the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+$as_echo_n "checking whether we are cross compiling... " >&6; }
+if test "$cross_compiling" != yes; then
+ { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ if { ac_try='./conftest$ac_cv_exeext'
+ { { case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }; then
+ cross_compiling=no
+ else
+ if test "$cross_compiling" = maybe; then
+ cross_compiling=yes
+ else
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run C++ compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+$as_echo "$cross_compiling" >&6; }
+
+rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+$as_echo_n "checking for suffix of object files... " >&6; }
+if ${ac_cv_objext+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then :
+ for ac_file in conftest.o conftest.obj conftest.*; do
+ test -f "$ac_file" || continue;
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
+ *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+ break;;
+ esac
+done
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of object files: cannot compile
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+$as_echo "$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5
+$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; }
+if ${ac_cv_cxx_compiler_gnu+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ ac_compiler_gnu=yes
+else
+ ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5
+$as_echo "$ac_cv_cxx_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+ GXX=yes
+else
+ GXX=
+fi
+ac_test_CXXFLAGS=${CXXFLAGS+set}
+ac_save_CXXFLAGS=$CXXFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5
+$as_echo_n "checking whether $CXX accepts -g... " >&6; }
+if ${ac_cv_prog_cxx_g+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_save_cxx_werror_flag=$ac_cxx_werror_flag
+ ac_cxx_werror_flag=yes
+ ac_cv_prog_cxx_g=no
+ CXXFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ ac_cv_prog_cxx_g=yes
+else
+ CXXFLAGS=""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+
+else
+ ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+ CXXFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ ac_cv_prog_cxx_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5
+$as_echo "$ac_cv_prog_cxx_g" >&6; }
+if test "$ac_test_CXXFLAGS" = set; then
+ CXXFLAGS=$ac_save_CXXFLAGS
+elif test $ac_cv_prog_cxx_g = yes; then
+ if test "$GXX" = yes; then
+ CXXFLAGS="-g -O2"
+ else
+ CXXFLAGS="-g"
+ fi
+else
+ if test "$GXX" = yes; then
+ CXXFLAGS="-O2"
+ else
+ CXXFLAGS=
+ fi
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+
+
+
+
+
+
+
+HAVE_SOCKETS=1
+HAVE_LIBTIFF=0
+HAVE_LIBPNG=0
+HAVE_LIBJPEG=0
+HAVE_X11=0
+HAVE_CAIRO=0
+HAVE_POPPLER=0
+HAVE_NCURSES_H=0
+HAVE_CURSES_H=0
+HAVE_NOSCRIPTS=0
+HAVE_QT=0
+HAVE_AUTOPACKAGE=0
+HAVE_LIBGLE=0
+HAVE_LIBGLE_CPPFLAGS=0
+HAVE_LIBGLE_STATIC=0
+HAVE_MAC=0
+HAVE_FREEBSD=0
+HAVE_GNU_HURD=0
+HAVE_LINUX=0
+HAVE_WIN32=0
+HAVE_NOCYGWIN=0
+HAVE_CYGWIN=0
+HAVE_MINGW=0
+HAVE_LIBZ=0
+HAVE_LIBGLU_H=0
+QT_CONFIG="CONFIG += release"
+QT_RPATH=
+QT_LIBGLU_LIB=
+
+HAVE_STATIC_LIBPNG=0
+HAVE_STATIC_LIBTIFF=0
+HAVE_STATIC_LIBJPEG=0
+HAVE_STATIC_LIBZ=0
+HAVE_RPATH=0
+
+QMAKE_PROG=none
+QMAKE_VERS=none
+
+MANIP_LIBS=
+MANIP_LDFLAGS=
+AP_CONFIG_ARGS=
+
+LIBGLE_CPPFLAGS=
+LIBGLE_LDFLAGS=
+EXTRA_LDFLAGS=
+EXTRA_LIBS=
+SIMPLE_LIBS_DL=
+
+
+# Check whether --with-qt was given.
+if test "${with_qt+set}" = set; then :
+ withval=$with_qt;
+else
+ with_qt=yes
+fi
+
+
+# Check whether --with-jpeg was given.
+if test "${with_jpeg+set}" = set; then :
+ withval=$with_jpeg;
+else
+ with_jpeg=yes
+fi
+
+
+# Check whether --with-png was given.
+if test "${with_png+set}" = set; then :
+ withval=$with_png;
+else
+ with_png=yes
+fi
+
+
+# Check whether --with-tiff was given.
+if test "${with_tiff+set}" = set; then :
+ withval=$with_tiff;
+else
+ with_tiff=yes
+fi
+
+
+# Check whether --with-z was given.
+if test "${with_z+set}" = set; then :
+ withval=$with_z;
+else
+ with_z=yes
+fi
+
+
+# Check whether --with-cairo was given.
+if test "${with_cairo+set}" = set; then :
+ withval=$with_cairo;
+else
+ with_cairo=yes
+fi
+
+
+# Check whether --with-poppler was given.
+if test "${with_poppler+set}" = set; then :
+ withval=$with_poppler;
+else
+ with_poppler=yes
+fi
+
+
+# Check whether --with-manip was given.
+if test "${with_manip+set}" = set; then :
+ withval=$with_manip;
+else
+ with_manip=yes
+fi
+
+
+# Check whether --with-debug was given.
+if test "${with_debug+set}" = set; then :
+ withval=$with_debug;
+else
+ with_debug=no
+fi
+
+
+# Check whether --with-warn was given.
+if test "${with_warn+set}" = set; then :
+ withval=$with_warn;
+else
+ with_warn=no
+fi
+
+
+# Check whether --with-win32 was given.
+if test "${with_win32+set}" = set; then :
+ withval=$with_win32;
+else
+ with_win32=no
+fi
+
+
+# Check whether --with-arch was given.
+if test "${with_arch+set}" = set; then :
+ withval=$with_arch;
+else
+ with_arch=default
+fi
+
+
+# Check whether --with-scripts was given.
+if test "${with_scripts+set}" = set; then :
+ withval=$with_scripts;
+else
+ with_scritps=no
+fi
+
+
+# Check whether --with-libgle was given.
+if test "${with_libgle+set}" = set; then :
+ withval=$with_libgle;
+else
+ with_libgle=no
+fi
+
+
+# Check whether --with-rpath was given.
+if test "${with_rpath+set}" = set; then :
+ withval=$with_rpath;
+else
+ with_rpath=yes
+fi
+
+
+# Check whether --with-extrafonts was given.
+if test "${with_extrafonts+set}" = set; then :
+ withval=$with_extrafonts;
+else
+ extrafonts=no
+fi
+
+
+# Check whether --with-gnuwin32 was given.
+if test "${with_gnuwin32+set}" = set; then :
+ withval=$with_gnuwin32;
+else
+ with_gnuwin32=no
+fi
+
+
+# Check whether --with-staticlink was given.
+if test "${with_staticlink+set}" = set; then :
+ withval=$with_staticlink;
+else
+ with_staticlink=def
+fi
+
+
+# Check whether --with-autopackage was given.
+if test "${with_autopackage+set}" = set; then :
+ withval=$with_autopackage;
+else
+ with_autopackage=no
+fi
+
+
+# Check whether --with-apintern was given.
+if test "${with_apintern+set}" = set; then :
+ withval=$with_apintern;
+else
+ with_apintern=no
+fi
+
+
+HAVE_EXTRA_FONTS=0
+if test "x$extrafonts" != "xno"; then
+ HAVE_EXTRA_FONTS=1
+fi
+
+if test -f src/fonts/extrafonts.inf; then
+ HAVE_EXTRA_FONTS=1
+fi
+
+
+GLE_SNAPSHOT=""
+
+
+QT_CPPFLAGS=$CPPFLAGS
+QT_LDFLAGS=$LDFLAGS
+
+
+ac_aux_dir=
+for ac_dir in platform/autoconf "$srcdir"/platform/autoconf; do
+ if test -f "$ac_dir/install-sh"; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install-sh -c"
+ break
+ elif test -f "$ac_dir/install.sh"; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install.sh -c"
+ break
+ elif test -f "$ac_dir/shtool"; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/shtool install -c"
+ break
+ fi
+done
+if test -z "$ac_aux_dir"; then
+ as_fn_error $? "cannot find install-sh, install.sh, or shtool in platform/autoconf \"$srcdir\"/platform/autoconf" "$LINENO" 5
+fi
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var.
+ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var.
+ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var.
+
+
+# Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+# Reject install programs that cannot install multiple files.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
+$as_echo_n "checking for a BSD-compatible install... " >&6; }
+if test -z "$INSTALL"; then
+if ${ac_cv_path_install+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in #((
+ ./ | .// | /[cC]/* | \
+ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
+ /usr/ucb/* ) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+ if test $ac_prog = install &&
+ grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ elif test $ac_prog = install &&
+ grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # program-specific install script used by HP pwplus--don't use.
+ :
+ else
+ rm -rf conftest.one conftest.two conftest.dir
+ echo one > conftest.one
+ echo two > conftest.two
+ mkdir conftest.dir
+ if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
+ test -s conftest.one && test -s conftest.two &&
+ test -s conftest.dir/conftest.one &&
+ test -s conftest.dir/conftest.two
+ then
+ ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+ break 3
+ fi
+ fi
+ fi
+ done
+ done
+ ;;
+esac
+
+ done
+IFS=$as_save_IFS
+
+rm -rf conftest.one conftest.two conftest.dir
+
+fi
+ if test "${ac_cv_path_install+set}" = set; then
+ INSTALL=$ac_cv_path_install
+ else
+ # As a last resort, use the slow shell script. Don't cache a
+ # value for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the value is a relative name.
+ INSTALL=$ac_install_sh
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
+$as_echo "$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5
+$as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
+if test -z "$MKDIR_P"; then
+ if ${ac_cv_path_mkdir+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in mkdir gmkdir; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue
+ case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
+ 'mkdir (GNU coreutils) '* | \
+ 'mkdir (coreutils) '* | \
+ 'mkdir (fileutils) '4.1*)
+ ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
+ break 3;;
+ esac
+ done
+ done
+ done
+IFS=$as_save_IFS
+
+fi
+
+ test -d ./--version && rmdir ./--version
+ if test "${ac_cv_path_mkdir+set}" = set; then
+ MKDIR_P="$ac_cv_path_mkdir -p"
+ else
+ # As a last resort, use the slow shell script. Don't cache a
+ # value for MKDIR_P within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the value is a relative name.
+ MKDIR_P="$ac_install_sh -d"
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
+$as_echo "$MKDIR_P" >&6; }
+
+# Make sure we can run config.sub.
+$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
+ as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+$as_echo_n "checking build system type... " >&6; }
+if ${ac_cv_build+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+ ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+test "x$ac_build_alias" = x &&
+ as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
+ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
+ as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+$as_echo "$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+$as_echo_n "checking host system type... " >&6; }
+if ${ac_cv_host+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test "x$host_alias" = x; then
+ ac_cv_host=$ac_cv_build
+else
+ ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
+ as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+$as_echo "$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5
+$as_echo_n "checking how to run the C++ preprocessor... " >&6; }
+if test -z "$CXXCPP"; then
+ if ${ac_cv_prog_CXXCPP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ # Double quotes because CXXCPP needs to be expanded
+ for CXXCPP in "$CXX -E" "/lib/cpp"
+ do
+ ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+
+else
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+ # Broken: success on invalid input.
+continue
+else
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+ break
+fi
+
+ done
+ ac_cv_prog_CXXCPP=$CXXCPP
+
+fi
+ CXXCPP=$ac_cv_prog_CXXCPP
+else
+ ac_cv_prog_CXXCPP=$CXXCPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5
+$as_echo "$CXXCPP" >&6; }
+ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+
+else
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+ # Broken: success on invalid input.
+continue
+else
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
+$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
+if ${ac_cv_path_GREP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -z "$GREP"; then
+ ac_path_GREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in grep ggrep; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_GREP" || continue
+# Check for GNU ac_path_GREP and select it if it is found.
+ # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+ ac_count=0
+ $as_echo_n 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ $as_echo 'GREP' >> "conftest.nl"
+ "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_GREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_GREP="$ac_path_GREP"
+ ac_path_GREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_GREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_GREP"; then
+ as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_GREP=$GREP
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+$as_echo "$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+$as_echo_n "checking for egrep... " >&6; }
+if ${ac_cv_path_EGREP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+ then ac_cv_path_EGREP="$GREP -E"
+ else
+ if test -z "$EGREP"; then
+ ac_path_EGREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in egrep; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_EGREP" || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
+ # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+ ac_count=0
+ $as_echo_n 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ $as_echo 'EGREP' >> "conftest.nl"
+ "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_EGREP="$ac_path_EGREP"
+ ac_path_EGREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_EGREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_EGREP"; then
+ as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_EGREP=$EGREP
+fi
+
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+$as_echo "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
+$as_echo_n "checking for ANSI C header files... " >&6; }
+if ${ac_cv_header_stdc+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ ac_cv_header_stdc=yes
+else
+ ac_cv_header_stdc=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+ # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "memchr" >/dev/null 2>&1; then :
+
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "free" >/dev/null 2>&1; then :
+
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+ if test "$cross_compiling" = yes; then :
+ :
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+ (('a' <= (c) && (c) <= 'i') \
+ || ('j' <= (c) && (c) <= 'r') \
+ || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+ int i;
+ for (i = 0; i < 256; i++)
+ if (XOR (islower (i), ISLOWER (i))
+ || toupper (i) != TOUPPER (i))
+ return 2;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_run "$LINENO"; then :
+
+else
+ ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
+$as_echo "$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+$as_echo "#define STDC_HEADERS 1" >>confdefs.h
+
+fi
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+ inttypes.h stdint.h unistd.h
+do :
+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_cxx_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
+"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+for ac_header in sys/param.h
+do :
+ ac_fn_cxx_check_header_mongrel "$LINENO" "sys/param.h" "ac_cv_header_sys_param_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_param_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_SYS_PARAM_H 1
+_ACEOF
+
+fi
+
+done
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5
+$as_echo_n "checking whether byte ordering is bigendian... " >&6; }
+if ${ac_cv_c_bigendian+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_cv_c_bigendian=unknown
+ # See if we're dealing with a universal compiler.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifndef __APPLE_CC__
+ not a universal capable compiler
+ #endif
+ typedef int dummy;
+
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+
+ # Check for potential -arch flags. It is not universal unless
+ # there are at least two -arch flags with different values.
+ ac_arch=
+ ac_prev=
+ for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do
+ if test -n "$ac_prev"; then
+ case $ac_word in
+ i?86 | x86_64 | ppc | ppc64)
+ if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then
+ ac_arch=$ac_word
+ else
+ ac_cv_c_bigendian=universal
+ break
+ fi
+ ;;
+ esac
+ ac_prev=
+ elif test "x$ac_word" = "x-arch"; then
+ ac_prev=arch
+ fi
+ done
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ if test $ac_cv_c_bigendian = unknown; then
+ # See if sys/param.h defines the BYTE_ORDER macro.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+ #include <sys/param.h>
+
+int
+main ()
+{
+#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \
+ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \
+ && LITTLE_ENDIAN)
+ bogus endian macros
+ #endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ # It does; now see whether it defined to BIG_ENDIAN or not.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+ #include <sys/param.h>
+
+int
+main ()
+{
+#if BYTE_ORDER != BIG_ENDIAN
+ not big endian
+ #endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ ac_cv_c_bigendian=yes
+else
+ ac_cv_c_bigendian=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ fi
+ if test $ac_cv_c_bigendian = unknown; then
+ # See if <limits.h> defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris).
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <limits.h>
+
+int
+main ()
+{
+#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN)
+ bogus endian macros
+ #endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ # It does; now see whether it defined to _BIG_ENDIAN or not.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <limits.h>
+
+int
+main ()
+{
+#ifndef _BIG_ENDIAN
+ not big endian
+ #endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ ac_cv_c_bigendian=yes
+else
+ ac_cv_c_bigendian=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ fi
+ if test $ac_cv_c_bigendian = unknown; then
+ # Compile a test program.
+ if test "$cross_compiling" = yes; then :
+ # Try to guess by grepping values from an object file.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+short int ascii_mm[] =
+ { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
+ short int ascii_ii[] =
+ { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
+ int use_ascii (int i) {
+ return ascii_mm[i] + ascii_ii[i];
+ }
+ short int ebcdic_ii[] =
+ { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
+ short int ebcdic_mm[] =
+ { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
+ int use_ebcdic (int i) {
+ return ebcdic_mm[i] + ebcdic_ii[i];
+ }
+ extern int foo;
+
+int
+main ()
+{
+return use_ascii (foo) == use_ebcdic (foo);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then
+ ac_cv_c_bigendian=yes
+ fi
+ if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then
+ if test "$ac_cv_c_bigendian" = unknown; then
+ ac_cv_c_bigendian=no
+ else
+ # finding both strings is unlikely to happen, but who knows?
+ ac_cv_c_bigendian=unknown
+ fi
+ fi
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+
+ /* Are we little or big endian? From Harbison&Steele. */
+ union
+ {
+ long int l;
+ char c[sizeof (long int)];
+ } u;
+ u.l = 1;
+ return u.c[sizeof (long int) - 1] == 1;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_run "$LINENO"; then :
+ ac_cv_c_bigendian=no
+else
+ ac_cv_c_bigendian=yes
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5
+$as_echo "$ac_cv_c_bigendian" >&6; }
+ case $ac_cv_c_bigendian in #(
+ yes)
+ $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h
+;; #(
+ no)
+ ;; #(
+ universal)
+
+$as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h
+
+ ;; #(
+ *)
+ as_fn_error $? "unknown endianness
+ presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;;
+ esac
+
+ac_fn_c_find_uintX_t "$LINENO" "16" "ac_cv_c_uint16_t"
+case $ac_cv_c_uint16_t in #(
+ no|yes) ;; #(
+ *)
+
+
+cat >>confdefs.h <<_ACEOF
+#define uint16_t $ac_cv_c_uint16_t
+_ACEOF
+;;
+ esac
+
+
+
+
+
+
+
+
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_PKG_CONFIG+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $PKG_CONFIG in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+PKG_CONFIG=$ac_cv_path_PKG_CONFIG
+if test -n "$PKG_CONFIG"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5
+$as_echo "$PKG_CONFIG" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_path_PKG_CONFIG"; then
+ ac_pt_PKG_CONFIG=$PKG_CONFIG
+ # Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $ac_pt_PKG_CONFIG in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG
+if test -n "$ac_pt_PKG_CONFIG"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5
+$as_echo "$ac_pt_PKG_CONFIG" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_pt_PKG_CONFIG" = x; then
+ PKG_CONFIG=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ PKG_CONFIG=$ac_pt_PKG_CONFIG
+ fi
+else
+ PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
+fi
+
+fi
+if test -n "$PKG_CONFIG"; then
+ _pkg_min_version=0.9.0
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5
+$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; }
+ if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ PKG_CONFIG=""
+ fi
+fi
+
+if test "x$with_rpath" != "xno"; then
+ HAVE_RPATH=1
+fi
+
+
+if test "x$with_gnuwin32" != "xno"; then
+ with_win32=yes
+ CPPFLAGS="-I$with_gnuwin32/include $CPPFLAGS"
+ CXXFLAGS="-I$with_gnuwin32/include $CXXFLAGS"
+ LDFLAGS="-L$with_gnuwin32/lib $LDFLAGS"
+ CFLAGS="-I$with_gnuwin32/include $CFLAGS"
+ if test "x$with_staticlink" = "xdef"; then
+ with_staticlink=yes
+ fi
+fi
+
+if test "x$with_win32" != "xno"; then
+ HAVE_WIN32=1
+fi
+
+
+USE_ARCH=no
+
+case $host in
+ *-*-cygwin*)
+ $as_echo "#define __CYGWIN__ 1" >>confdefs.h
+
+ HAVE_CYGWIN=1
+ ;;
+ *-*-mingw*)
+ $as_echo "#define __CYGWIN__ 1" >>confdefs.h
+
+ HAVE_CYGWIN=1
+ HAVE_MINGW=1
+ ;;
+ x86_64-apple-*)
+ if test "x$with_arch" = "xdefault"; then
+ USE_ARCH=i386
+ fi
+ ;;
+esac
+
+if test "x$with_arch" != "xdefault"; then
+ USE_ARCH=$with_arch
+fi
+
+if test "x$USE_ARCH" != "xno"; then
+ CPPFLAGS="-arch $USE_ARCH $CPPFLAGS"
+ CXXFLAGS="-arch $USE_ARCH $CXXFLAGS"
+ LDFLAGS="-arch $USE_ARCH $LDFLAGS"
+ CFLAGS="-arch $USE_ARCH $CFLAGS"
+fi
+
+if test "x$HAVE_CYGWIN" = "x1"; then
+ if test "x$HAVE_WIN32" = "x1"; then
+ HAVE_CYGWIN=0
+ HAVE_NOCYGWIN=1
+ fi
+fi
+
+if test "x$HAVE_NOCYGWIN" = "x1"; then
+ if test "x$with_gnuwin32" = "xno"; then
+ with_png=no
+ with_jpeg=no
+ with_tiff=no
+ with_z=no
+ fi
+fi
+
+
+if test "x$HAVE_WIN32" != "x1"; then
+ $as_echo "#define __UNIX__ 1" >>confdefs.h
+
+ # MacOS should also define __UNIX__
+else
+ $as_echo "#define __WIN32__ 1" >>confdefs.h
+
+ $as_echo "#define __NOCYGWIN__ 1" >>confdefs.h
+
+ CPPFLAGS="-mno-cygwin -mthreads -mms-bitfields -march=i386 $CPPFLAGS"
+ CXXFLAGS="-mno-cygwin -mthreads -mms-bitfields -march=i386 $CXXFLAGS"
+ LDFLAGS="-mno-cygwin -mthreads -mms-bitfields -march=i386 $LDFLAGS"
+ CFLAGS="-mno-cygwin -mthreads -mms-bitfields -march=i386 $CFLAGS"
+ with_manip=no
+ with_x=no
+fi
+
+
+_CPPFLAGS_INI=$CPPFLAGS
+_CXXFLAGS_INI=$CXXFLAGS
+_LDFLAGS_INI=$LDFLAGS
+_LIBS_INI=$LIBS
+
+SIMPLE_LDFLAGS=$LDFLAGS
+SIMPLE_LIBS=$LIBS
+
+
+case $host in
+ *-apple*)
+ HAVE_MAC=1
+ ;;
+ *-freebsd*)
+ HAVE_FREEBSD=1
+ ;;
+ *-linux*)
+ HAVE_LINUX=1
+ ;;
+ *-gnu*)
+ HAVE_GNU_HURD=1
+ ;;
+esac
+
+
+if test "x$HAVE_MAC" = "x1"; then
+ $as_echo "#define __MACOS__ 1" >>confdefs.h
+
+ HAVE_RPATH=0
+fi
+
+
+if test "x$HAVE_FREEBSD" = "x1"; then
+ $as_echo "#define __FREEBSD__ 1" >>confdefs.h
+
+fi
+
+
+if test "x$HAVE_LINUX" = "x1"; then
+ $as_echo "#define __LINUX__ 1" >>confdefs.h
+
+fi
+
+
+if test "x$HAVE_GNU_HURD" = "x1"; then
+ $as_echo "#define __GNU_HURD__ 1" >>confdefs.h
+
+fi
+
+
+if test "$with_scripts" != yes; then
+ case $host in
+ *-*-cygwin*|*-*-linux*|*-*-mingw*|*-*-kfreebsd*)
+ HAVE_NOSCRIPTS=1
+ ;;
+ esac
+ if test "x$HAVE_MAC" = "x1"; then
+ HAVE_NOSCRIPTS=1
+ fi
+ if test "x$HAVE_FREEBSD" = "x1"; then
+ HAVE_NOSCRIPTS=1
+ fi
+ if test "x$HAVE_LINUX" = "x1"; then
+ HAVE_NOSCRIPTS=1
+ fi
+ if test "x$HAVE_GNU_HURD" = "x1"; then
+ HAVE_NOSCRIPTS=1
+ fi
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for X" >&5
+$as_echo_n "checking for X... " >&6; }
+
+
+# Check whether --with-x was given.
+if test "${with_x+set}" = set; then :
+ withval=$with_x;
+fi
+
+# $have_x is `yes', `no', `disabled', or empty when we do not yet know.
+if test "x$with_x" = xno; then
+ # The user explicitly disabled X.
+ have_x=disabled
+else
+ case $x_includes,$x_libraries in #(
+ *\'*) as_fn_error $? "cannot use X directory names containing '" "$LINENO" 5;; #(
+ *,NONE | NONE,*) if ${ac_cv_have_x+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ # One or both of the vars are not set, and there is no cached value.
+ac_x_includes=no ac_x_libraries=no
+rm -f -r conftest.dir
+if mkdir conftest.dir; then
+ cd conftest.dir
+ cat >Imakefile <<'_ACEOF'
+incroot:
+ @echo incroot='${INCROOT}'
+usrlibdir:
+ @echo usrlibdir='${USRLIBDIR}'
+libdir:
+ @echo libdir='${LIBDIR}'
+_ACEOF
+ if (export CC; ${XMKMF-xmkmf}) >/dev/null 2>/dev/null && test -f Makefile; then
+ # GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
+ for ac_var in incroot usrlibdir libdir; do
+ eval "ac_im_$ac_var=\`\${MAKE-make} $ac_var 2>/dev/null | sed -n 's/^$ac_var=//p'\`"
+ done
+ # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR.
+ for ac_extension in a so sl dylib la dll; do
+ if test ! -f "$ac_im_usrlibdir/libX11.$ac_extension" &&
+ test -f "$ac_im_libdir/libX11.$ac_extension"; then
+ ac_im_usrlibdir=$ac_im_libdir; break
+ fi
+ done
+ # Screen out bogus values from the imake configuration. They are
+ # bogus both because they are the default anyway, and because
+ # using them would break gcc on systems where it needs fixed includes.
+ case $ac_im_incroot in
+ /usr/include) ac_x_includes= ;;
+ *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;;
+ esac
+ case $ac_im_usrlibdir in
+ /usr/lib | /usr/lib64 | /lib | /lib64) ;;
+ *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;;
+ esac
+ fi
+ cd ..
+ rm -f -r conftest.dir
+fi
+
+# Standard set of common directories for X headers.
+# Check X11 before X11Rn because it is often a symlink to the current release.
+ac_x_header_dirs='
+/usr/X11/include
+/usr/X11R7/include
+/usr/X11R6/include
+/usr/X11R5/include
+/usr/X11R4/include
+
+/usr/include/X11
+/usr/include/X11R7
+/usr/include/X11R6
+/usr/include/X11R5
+/usr/include/X11R4
+
+/usr/local/X11/include
+/usr/local/X11R7/include
+/usr/local/X11R6/include
+/usr/local/X11R5/include
+/usr/local/X11R4/include
+
+/usr/local/include/X11
+/usr/local/include/X11R7
+/usr/local/include/X11R6
+/usr/local/include/X11R5
+/usr/local/include/X11R4
+
+/usr/X386/include
+/usr/x386/include
+/usr/XFree86/include/X11
+
+/usr/include
+/usr/local/include
+/usr/unsupported/include
+/usr/athena/include
+/usr/local/x11r5/include
+/usr/lpp/Xamples/include
+
+/usr/openwin/include
+/usr/openwin/share/include'
+
+if test "$ac_x_includes" = no; then
+ # Guess where to find include files, by looking for Xlib.h.
+ # First, try using that file with no special directory specified.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <X11/Xlib.h>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+ # We can compile using X headers with no special include directory.
+ac_x_includes=
+else
+ for ac_dir in $ac_x_header_dirs; do
+ if test -r "$ac_dir/X11/Xlib.h"; then
+ ac_x_includes=$ac_dir
+ break
+ fi
+done
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+fi # $ac_x_includes = no
+
+if test "$ac_x_libraries" = no; then
+ # Check for the libraries.
+ # See if we find them without any special options.
+ # Don't add to $LIBS permanently.
+ ac_save_LIBS=$LIBS
+ LIBS="-lX11 $LIBS"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <X11/Xlib.h>
+int
+main ()
+{
+XrmInitialize ()
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+ LIBS=$ac_save_LIBS
+# We can link X programs with no special library path.
+ac_x_libraries=
+else
+ LIBS=$ac_save_LIBS
+for ac_dir in `$as_echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g`
+do
+ # Don't even attempt the hair of trying to link an X program!
+ for ac_extension in a so sl dylib la dll; do
+ if test -r "$ac_dir/libX11.$ac_extension"; then
+ ac_x_libraries=$ac_dir
+ break 2
+ fi
+ done
+done
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi # $ac_x_libraries = no
+
+case $ac_x_includes,$ac_x_libraries in #(
+ no,* | *,no | *\'*)
+ # Didn't find X, or a directory has "'" in its name.
+ ac_cv_have_x="have_x=no";; #(
+ *)
+ # Record where we found X for the cache.
+ ac_cv_have_x="have_x=yes\
+ ac_x_includes='$ac_x_includes'\
+ ac_x_libraries='$ac_x_libraries'"
+esac
+fi
+;; #(
+ *) have_x=yes;;
+ esac
+ eval "$ac_cv_have_x"
+fi # $with_x != no
+
+if test "$have_x" != yes; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_x" >&5
+$as_echo "$have_x" >&6; }
+ no_x=yes
+else
+ # If each of the values was on the command line, it overrides each guess.
+ test "x$x_includes" = xNONE && x_includes=$ac_x_includes
+ test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries
+ # Update the cache value to reflect the command line values.
+ ac_cv_have_x="have_x=yes\
+ ac_x_includes='$x_includes'\
+ ac_x_libraries='$x_libraries'"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: libraries $x_libraries, headers $x_includes" >&5
+$as_echo "libraries $x_libraries, headers $x_includes" >&6; }
+fi
+
+if test "$with_x" != no; then
+ if test "x$x_libraries" = "x"; then
+ x_libraries=.
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XOpenDisplay in -lX11" >&5
+$as_echo_n "checking for XOpenDisplay in -lX11... " >&6; }
+if ${ac_cv_lib_X11_XOpenDisplay+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lX11 -lXt -L$x_libraries $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char XOpenDisplay ();
+int
+main ()
+{
+return XOpenDisplay ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+ ac_cv_lib_X11_XOpenDisplay=yes
+else
+ ac_cv_lib_X11_XOpenDisplay=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_X11_XOpenDisplay" >&5
+$as_echo "$ac_cv_lib_X11_XOpenDisplay" >&6; }
+if test "x$ac_cv_lib_X11_XOpenDisplay" = xyes; then :
+ HAVE_X11=1
+ if test "x$x_libraries" != "x"; then
+ LDFLAGS="$LDFLAGS -L$x_libraries"
+ fi
+ if test "x$x_includes" != "x"; then
+ CPPFLAGS="$CPPFLAGS -I$x_includes"
+ fi
+ LIBS="-lX11 $LIBS"
+
+fi
+
+fi
+
+
+if test "x$with_staticlink" = "xdef"; then
+ with_staticlink=no
+fi
+
+if test "x$with_staticlink" != "xno"; then
+ HAVE_STATIC_LIBPNG=1
+ HAVE_STATIC_LIBJPEG=1
+ HAVE_STATIC_LIBZ=1
+ HAVE_STATIC_LIBTIFF=1
+fi
+
+
+if test "$with_z" != no; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for deflate in -lz" >&5
+$as_echo_n "checking for deflate in -lz... " >&6; }
+if ${ac_cv_lib_z_deflate+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lz $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char deflate ();
+int
+main ()
+{
+return deflate ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+ ac_cv_lib_z_deflate=yes
+else
+ ac_cv_lib_z_deflate=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_deflate" >&5
+$as_echo "$ac_cv_lib_z_deflate" >&6; }
+if test "x$ac_cv_lib_z_deflate" = xyes; then :
+ HAVE_LIBZ=1
+fi
+
+
+ if test "x$HAVE_LIBZ" = "x1"; then
+ $as_echo "#define HAVE_LIBZ 1" >>confdefs.h
+
+ if test "x$HAVE_STATIC_LIBZ" = "x1"; then
+ LIBS="-Wl,-Bstatic -lz -Wl,-Bdynamic $LIBS"
+ else
+ LIBS="-lz $LIBS"
+ fi
+ fi
+fi
+
+
+SOCKET_LIB=0
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing socket" >&5
+$as_echo_n "checking for library containing socket... " >&6; }
+if ${ac_cv_search_socket+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char socket ();
+int
+main ()
+{
+return socket ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' socket; do
+ if test -z "$ac_lib"; then
+ ac_res="none required"
+ else
+ ac_res=-l$ac_lib
+ LIBS="-l$ac_lib $ac_func_search_save_LIBS"
+ fi
+ if ac_fn_cxx_try_link "$LINENO"; then :
+ ac_cv_search_socket=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext
+ if ${ac_cv_search_socket+:} false; then :
+ break
+fi
+done
+if ${ac_cv_search_socket+:} false; then :
+
+else
+ ac_cv_search_socket=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_socket" >&5
+$as_echo "$ac_cv_search_socket" >&6; }
+ac_res=$ac_cv_search_socket
+if test "$ac_res" != no; then :
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing gethostbyname" >&5
+$as_echo_n "checking for library containing gethostbyname... " >&6; }
+if ${ac_cv_search_gethostbyname+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char gethostbyname ();
+int
+main ()
+{
+return gethostbyname ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' nsl socket; do
+ if test -z "$ac_lib"; then
+ ac_res="none required"
+ else
+ ac_res=-l$ac_lib
+ LIBS="-l$ac_lib $ac_func_search_save_LIBS"
+ fi
+ if ac_fn_cxx_try_link "$LINENO"; then :
+ ac_cv_search_gethostbyname=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext
+ if ${ac_cv_search_gethostbyname+:} false; then :
+ break
+fi
+done
+if ${ac_cv_search_gethostbyname+:} false; then :
+
+else
+ ac_cv_search_gethostbyname=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_gethostbyname" >&5
+$as_echo "$ac_cv_search_gethostbyname" >&6; }
+ac_res=$ac_cv_search_gethostbyname
+if test "$ac_res" != no; then :
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+if test "$ac_cv_func_socket" = "yes" ; then
+ if test "$ac_cv_func_gethostbyname" = "yes" ; then
+ SOCKET_LIB=1
+ fi
+fi
+
+case $host in
+ *-*-solaris*)
+ if test "$SOCKET_LIB" = "0" ; then
+ HAVE_SOCKETS=0
+ fi
+ ;;
+ *)
+esac
+
+if test "$HAVE_SOCKETS" = 1; then
+ $as_echo "#define HAVE_SOCKETS 1" >>confdefs.h
+
+fi
+
+
+_CPPFLAGS=$CPPFLAGS
+_LDFLAGS=$LDFLAGS
+
+if test "$with_jpeg" != no; then
+ if test -d "$with_jpeg"; then
+ libjpeg_CPPFLAGS="-I$with_jpeg/include"
+ libjpeg_LDFLAGS="-L$with_jpeg/lib"
+ CPPFLAGS="$CPPFLAGS $libjpeg_CPPFLAGS"
+ LDFLAGS="$LDFLAGS $libjpeg_LDFLAGS"
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jpeg_destroy_decompress in -ljpeg" >&5
+$as_echo_n "checking for jpeg_destroy_decompress in -ljpeg... " >&6; }
+if ${ac_cv_lib_jpeg_jpeg_destroy_decompress+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ljpeg -lm $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char jpeg_destroy_decompress ();
+int
+main ()
+{
+return jpeg_destroy_decompress ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+ ac_cv_lib_jpeg_jpeg_destroy_decompress=yes
+else
+ ac_cv_lib_jpeg_jpeg_destroy_decompress=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jpeg_jpeg_destroy_decompress" >&5
+$as_echo "$ac_cv_lib_jpeg_jpeg_destroy_decompress" >&6; }
+if test "x$ac_cv_lib_jpeg_jpeg_destroy_decompress" = xyes; then :
+ for ac_header in jpeglib.h
+do :
+ ac_fn_cxx_check_header_mongrel "$LINENO" "jpeglib.h" "ac_cv_header_jpeglib_h" "$ac_includes_default"
+if test "x$ac_cv_header_jpeglib_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_JPEGLIB_H 1
+_ACEOF
+ HAVE_LIBJPEG=1
+ $as_echo "#define HAVE_LIBJPEG 1" >>confdefs.h
+
+
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: found jpeg library but not jpegio.h: make sure libjpeg development package is installed" >&5
+$as_echo "$as_me: WARNING: found jpeg library but not jpegio.h: make sure libjpeg development package is installed" >&2;}
+
+fi
+
+done
+
+else
+ CPPFLAGS=$_CPPFLAGS
+ LDFLAGS=$_LDFLAGS
+fi
+
+fi
+
+if test "x$HAVE_LIBJPEG" = "x1"; then
+ if test "x$HAVE_STATIC_LIBJPEG" = "x1"; then
+ LIBS="-Wl,-Bstatic -ljpeg -Wl,-Bdynamic $LIBS"
+ else
+ LIBS="-ljpeg $LIBS"
+ fi
+fi
+
+
+_CPPFLAGS=$CPPFLAGS
+_LDFLAGS=$LDFLAGS
+
+if test "$with_tiff" != no; then
+ if test -d "$with_tiff"; then
+ libtiff_CPPFLAGS="-I$with_tiff/include"
+ libtiff_LDFLAGS="-L$with_tiff/lib"
+ CPPFLAGS="$CPPFLAGS $libtiff_CPPFLAGS"
+ LDFLAGS="$LDFLAGS $libtiff_LDFLAGS"
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for TIFFReadScanline in -ltiff" >&5
+$as_echo_n "checking for TIFFReadScanline in -ltiff... " >&6; }
+if ${ac_cv_lib_tiff_TIFFReadScanline+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ltiff -lm $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char TIFFReadScanline ();
+int
+main ()
+{
+return TIFFReadScanline ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+ ac_cv_lib_tiff_TIFFReadScanline=yes
+else
+ ac_cv_lib_tiff_TIFFReadScanline=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_tiff_TIFFReadScanline" >&5
+$as_echo "$ac_cv_lib_tiff_TIFFReadScanline" >&6; }
+if test "x$ac_cv_lib_tiff_TIFFReadScanline" = xyes; then :
+ for ac_header in tiffio.h
+do :
+ ac_fn_cxx_check_header_mongrel "$LINENO" "tiffio.h" "ac_cv_header_tiffio_h" "$ac_includes_default"
+if test "x$ac_cv_header_tiffio_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_TIFFIO_H 1
+_ACEOF
+ HAVE_LIBTIFF=1
+ $as_echo "#define HAVE_LIBTIFF 1" >>confdefs.h
+
+
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: found TIFF library but not tiffio.h: make sure libtiff development package is installed" >&5
+$as_echo "$as_me: WARNING: found TIFF library but not tiffio.h: make sure libtiff development package is installed" >&2;}
+ CPPFLAGS=$_CPPFLAGS
+ LDFLAGS=$_LDFLAGS
+
+fi
+
+done
+
+else
+ CPPFLAGS=$_CPPFLAGS
+ LDFLAGS=$_LDFLAGS
+fi
+
+fi
+
+if test "x$HAVE_LIBTIFF" = "x1"; then
+ if test "x$HAVE_STATIC_LIBTIFF" = "x1"; then
+ LIBS="-Wl,-Bstatic -ltiff -Wl,-Bdynamic $LIBS"
+ else
+ LIBS="-ltiff $LIBS"
+ fi
+fi
+
+
+if test "$with_png" != no; then
+ if test -d "$with_png"; then
+ HAVE_LIBPNG=1
+ $as_echo "#define HAVE_LIBPNG 1" >>confdefs.h
+
+ CPPFLAGS="$CPPFLAGS -I$with_png/include"
+ LDFLAGS="$LDFLAGS -L$with_png/lib"
+ if test "x$with_staticlink" = "xyes"; then
+ LIBS="-Wl,-Bstatic -lpng -Wl,-Bdynamic $LIBS"
+ else
+ LIBS="-lpng $LIBS"
+ fi
+ else
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for libpng" >&5
+$as_echo_n "checking for libpng... " >&6; }
+
+if test -n "$libpng_CFLAGS"; then
+ pkg_cv_libpng_CFLAGS="$libpng_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpng >= 0\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "libpng >= 0") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_libpng_CFLAGS=`$PKG_CONFIG --cflags "libpng >= 0" 2>/dev/null`
+ test "x$?" != "x0" && pkg_failed=yes
+else
+ pkg_failed=yes
+fi
+ else
+ pkg_failed=untried
+fi
+if test -n "$libpng_LIBS"; then
+ pkg_cv_libpng_LIBS="$libpng_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpng >= 0\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "libpng >= 0") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_libpng_LIBS=`$PKG_CONFIG --libs "libpng >= 0" 2>/dev/null`
+ test "x$?" != "x0" && pkg_failed=yes
+else
+ pkg_failed=yes
+fi
+ else
+ pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+ _pkg_short_errors_supported=yes
+else
+ _pkg_short_errors_supported=no
+fi
+ if test $_pkg_short_errors_supported = yes; then
+ libpng_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libpng >= 0" 2>&1`
+ else
+ libpng_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libpng >= 0" 2>&1`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$libpng_PKG_ERRORS" >&5
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+elif test $pkg_failed = untried; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+else
+ libpng_CFLAGS=$pkg_cv_libpng_CFLAGS
+ libpng_LIBS=$pkg_cv_libpng_LIBS
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ HAVE_LIBPNG=1
+ $as_echo "#define HAVE_LIBPNG 1" >>confdefs.h
+
+ if test "x$with_staticlink" = "xyes"; then
+ LIBS="-Wl,-Bstatic $libpng_LIBS -Wl,-Bdynamic $LIBS"
+ else
+ LIBS="$libpng_LIBS $LIBS"
+ fi
+ CPPFLAGS="$libpng_CFLAGS $CPPFLAGS"
+ LDFLAGS="$libpng_LDFLAGS $LDFLAGS"
+
+fi
+ if test "x$HAVE_LIBPNG" = "x0"; then
+ # Extract the first word of "libpng-config", so it can be a program name with args.
+set dummy libpng-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_LIBPNG_CONFIG+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $LIBPNG_CONFIG in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_LIBPNG_CONFIG="$LIBPNG_CONFIG" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_LIBPNG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+LIBPNG_CONFIG=$ac_cv_path_LIBPNG_CONFIG
+if test -n "$LIBPNG_CONFIG"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBPNG_CONFIG" >&5
+$as_echo "$LIBPNG_CONFIG" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ if test -n "$LIBPNG_CONFIG"; then
+ HAVE_LIBPNG=1
+ $as_echo "#define HAVE_LIBPNG 1" >>confdefs.h
+
+ libpng_CPPFLAGS=`libpng-config --cflags`
+ libpng_LDFLAGS=`libpng-config --ldflags`
+ CPPFLAGS="$libpng_CPPFLAGS $CPPFLAGS"
+ LDFLAGS="$libpng_LDFLAGS $LDFLAGS"
+ if test "x$with_staticlink" = "xyes"; then
+ LIBS="-Wl,-Bstatic -lpng -Wl,-Bdynamic $LIBS"
+ else
+ LIBS="-lpng $LIBS"
+ fi
+ fi
+ fi
+ fi
+fi
+
+
+if test "x$with_cairo" != "xno"; then
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo" >&5
+$as_echo_n "checking for cairo... " >&6; }
+
+if test -n "$cairo_CFLAGS"; then
+ pkg_cv_cairo_CFLAGS="$cairo_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cairo >= 1.10.0\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "cairo >= 1.10.0") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_cairo_CFLAGS=`$PKG_CONFIG --cflags "cairo >= 1.10.0" 2>/dev/null`
+ test "x$?" != "x0" && pkg_failed=yes
+else
+ pkg_failed=yes
+fi
+ else
+ pkg_failed=untried
+fi
+if test -n "$cairo_LIBS"; then
+ pkg_cv_cairo_LIBS="$cairo_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cairo >= 1.10.0\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "cairo >= 1.10.0") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_cairo_LIBS=`$PKG_CONFIG --libs "cairo >= 1.10.0" 2>/dev/null`
+ test "x$?" != "x0" && pkg_failed=yes
+else
+ pkg_failed=yes
+fi
+ else
+ pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+ _pkg_short_errors_supported=yes
+else
+ _pkg_short_errors_supported=no
+fi
+ if test $_pkg_short_errors_supported = yes; then
+ cairo_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "cairo >= 1.10.0" 2>&1`
+ else
+ cairo_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "cairo >= 1.10.0" 2>&1`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$cairo_PKG_ERRORS" >&5
+
+
+ HAVE_CAIRO=0
+
+
+elif test $pkg_failed = untried; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+ HAVE_CAIRO=0
+
+
+else
+ cairo_CFLAGS=$pkg_cv_cairo_CFLAGS
+ cairo_LIBS=$pkg_cv_cairo_LIBS
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+ HAVE_CAIRO=1
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: cairo CFLAGS: $cairo_CFLAGS" >&5
+$as_echo " cairo CFLAGS: $cairo_CFLAGS" >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: cairo LIBS: $cairo_LIBS" >&5
+$as_echo " cairo LIBS: $cairo_LIBS" >&6; }
+ if test "x$with_staticlink" = "xyes"; then
+ LIBS="-Wl,-Bstatic $cairo_LIBS -Wl,-Bdynamic $LIBS"
+ else
+ LIBS="$cairo_LIBS $LIBS"
+ fi
+ CPPFLAGS="$cairo_CFLAGS $CPPFLAGS"
+ LDFLAGS="$cairo_LDFLAGS $LDFLAGS"
+
+fi
+fi
+
+if test "x$HAVE_CAIRO" = "x1"; then
+ if test "x$HAVE_WIN32" = "x1"; then
+ if test "x$with_staticlink" = "xyes"; then
+ EXTRA_LDFLAGS="$EXTRA_LDFLAGS -mwindows"
+ EXTRA_LIBS="$EXTRA_LIBS -lmsimg32"
+ fi
+ fi
+fi
+
+
+if test "x$HAVE_CAIRO" = "x1"; then
+ if test "x$with_poppler" != "xno"; then
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for POPPLER" >&5
+$as_echo_n "checking for POPPLER... " >&6; }
+
+if test -n "$POPPLER_CFLAGS"; then
+ pkg_cv_POPPLER_CFLAGS="$POPPLER_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"poppler-glib >= 0.10.0\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "poppler-glib >= 0.10.0") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_POPPLER_CFLAGS=`$PKG_CONFIG --cflags "poppler-glib >= 0.10.0" 2>/dev/null`
+ test "x$?" != "x0" && pkg_failed=yes
+else
+ pkg_failed=yes
+fi
+ else
+ pkg_failed=untried
+fi
+if test -n "$POPPLER_LIBS"; then
+ pkg_cv_POPPLER_LIBS="$POPPLER_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"poppler-glib >= 0.10.0\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "poppler-glib >= 0.10.0") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_POPPLER_LIBS=`$PKG_CONFIG --libs "poppler-glib >= 0.10.0" 2>/dev/null`
+ test "x$?" != "x0" && pkg_failed=yes
+else
+ pkg_failed=yes
+fi
+ else
+ pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+ _pkg_short_errors_supported=yes
+else
+ _pkg_short_errors_supported=no
+fi
+ if test $_pkg_short_errors_supported = yes; then
+ POPPLER_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "poppler-glib >= 0.10.0" 2>&1`
+ else
+ POPPLER_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "poppler-glib >= 0.10.0" 2>&1`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$POPPLER_PKG_ERRORS" >&5
+
+
+ HAVE_POPPLER=0
+
+
+elif test $pkg_failed = untried; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+ HAVE_POPPLER=0
+
+
+else
+ POPPLER_CFLAGS=$pkg_cv_POPPLER_CFLAGS
+ POPPLER_LIBS=$pkg_cv_POPPLER_LIBS
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+ HAVE_POPPLER=1
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: poppler CFLAGS: $POPPLER_CFLAGS" >&5
+$as_echo " poppler CFLAGS: $POPPLER_CFLAGS" >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: poppler LIBS: $POPPLER_LIBS" >&5
+$as_echo " poppler LIBS: $POPPLER_LIBS" >&6; }
+ if test "x$with_staticlink" = "xyes"; then
+ LIBS="-Wl,-Bstatic $POPPLER_LIBS -Wl,-Bdynamic $LIBS"
+ else
+ LIBS="$POPPLER_LIBS $LIBS"
+ fi
+ CPPFLAGS="$POPPLER_CFLAGS $CPPFLAGS"
+ LDFLAGS="$POPPLER_LDFLAGS $LDFLAGS"
+
+fi
+ fi
+fi
+
+
+QT4VER="?"
+QMAKE_PROG="none"
+if test "x$with_qt" != "xno"; then
+ if test "x$with_qt" = "xyes"; then
+ if test "x$PKG_CONFIG" != "x"; then
+ QT4LOC=`$PKG_CONFIG QtCore --variable=exec_prefix`
+ if test -x $QT4LOC/bin/qmake; then
+ if $PKG_CONFIG QtCore --atleast-version 4.1.1; then
+ with_qt=$QT4LOC
+ QT4VER=`$PKG_CONFIG QtCore --modversion`
+ fi
+ fi
+ fi
+ fi
+ if test "x$with_qt" = "xyes"; then
+ if test -x /opt/qt4/bin/qmake; then
+ with_qt=/opt/qt4
+ fi
+ if test -x /usr/lib/qt4/bin/qmake; then
+ with_qt=/usr/lib/qt4
+ fi
+ # Extract the first word of "qmake-qt4", so it can be a program name with args.
+set dummy qmake-qt4; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_QMAKE_PROG+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $QMAKE_PROG in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_QMAKE_PROG="$QMAKE_PROG" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_QMAKE_PROG="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ test -z "$ac_cv_path_QMAKE_PROG" && ac_cv_path_QMAKE_PROG="none"
+ ;;
+esac
+fi
+QMAKE_PROG=$ac_cv_path_QMAKE_PROG
+if test -n "$QMAKE_PROG"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QMAKE_PROG" >&5
+$as_echo "$QMAKE_PROG" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ fi
+ if test "x$with_qt" != "xyes"; then
+ QTDIR=$with_qt
+ if test -x $with_qt/bin/qmake; then
+ QMAKE_PROG=$with_qt/bin/qmake
+ fi
+ if test -x $with_qt/bin/qmake-qt4; then
+ QMAKE_PROG=$with_qt/bin/qmake-qt4
+ fi
+ if test -x $with_qt/bin/qmake.exe; then
+ QMAKE_PROG=$with_qt/bin/qmake.exe
+ fi
+ if test "x$QMAKE_PROG" = "xnone"; then
+ for ac_prog in qmake-qt4 qmake
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_QMAKE_PROG+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $QMAKE_PROG in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_QMAKE_PROG="$QMAKE_PROG" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_dummy="$QTDIR/bin:$PATH"
+for as_dir in $as_dummy
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_QMAKE_PROG="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+QMAKE_PROG=$ac_cv_path_QMAKE_PROG
+if test -n "$QMAKE_PROG"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QMAKE_PROG" >&5
+$as_echo "$QMAKE_PROG" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$QMAKE_PROG" && break
+done
+test -n "$QMAKE_PROG" || QMAKE_PROG="none"
+
+ fi
+ fi
+ if test "x$QMAKE_PROG" != "xnone"; then
+ HAVE_QT=1
+ QMAKE_VERS=`$QMAKE_PROG -v | tail -n 1`
+ fi
+
+ for ac_header in GL/glu.h
+do :
+ ac_fn_cxx_check_header_mongrel "$LINENO" "GL/glu.h" "ac_cv_header_GL_glu_h" "$ac_includes_default"
+if test "x$ac_cv_header_GL_glu_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_GL_GLU_H 1
+_ACEOF
+ $as_echo "#define HAVE_LIBGLU_H 1" >>confdefs.h
+
+fi
+
+done
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gluLookAt in -lGLU" >&5
+$as_echo_n "checking for gluLookAt in -lGLU... " >&6; }
+if ${ac_cv_lib_GLU_gluLookAt+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lGLU $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char gluLookAt ();
+int
+main ()
+{
+return gluLookAt ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+ ac_cv_lib_GLU_gluLookAt=yes
+else
+ ac_cv_lib_GLU_gluLookAt=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_GLU_gluLookAt" >&5
+$as_echo "$ac_cv_lib_GLU_gluLookAt" >&6; }
+if test "x$ac_cv_lib_GLU_gluLookAt" = xyes; then :
+ QT_LIBGLU_LIB=-lGLU
+fi
+
+fi
+
+if test "x$HAVE_RPATH" != "x0"; then
+ QT_RPATH="-Wl,-rpath,\\\\\\\$\\\$ORIGIN/../lib"
+fi
+
+
+if test "x$HAVE_QT" != "x0"; then
+ if test "x$with_libgle" != "xstatic"; then
+ if test "x$with_libgle" != "xboth"; then
+ with_libgle=yes
+ fi
+ fi
+fi
+
+if test "x$with_libgle" = "xboth"; then
+ HAVE_LIBGLE_STATIC=1
+ $as_echo "#define HAVE_LIBGLE_STATIC 1" >>confdefs.h
+
+ with_libgle=yes
+fi
+
+if test "x$with_libgle" = "xyes"; then
+ HAVE_LIBGLE=1
+ $as_echo "#define HAVE_LIBGLE 1" >>confdefs.h
+
+ case $host in
+ *-*-linux*|*-*-kfreebsd*)
+ LIBGLE_CPPFLAGS="-fPIC "
+ LIBGLE_LDFLAGS="-fPIC "
+ HAVE_LIBGLE_CPPFLAGS=1
+ ;;
+ esac
+fi
+
+if test "x$with_libgle" = "xstatic"; then
+ HAVE_LIBGLE_STATIC=1
+ $as_echo "#define HAVE_LIBGLE_STATIC 1" >>confdefs.h
+
+fi
+
+
+_SAVE_LIBS=$LIBS
+_SAVE_LDFLAGS=$LDFLAGS
+LIBS=$SIMPLE_LIBS
+LDFLAGS=$SIMPLE_LDFLAGS
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing dlopen" >&5
+$as_echo_n "checking for library containing dlopen... " >&6; }
+if ${ac_cv_search_dlopen+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' dl; do
+ if test -z "$ac_lib"; then
+ ac_res="none required"
+ else
+ ac_res=-l$ac_lib
+ LIBS="-l$ac_lib $ac_func_search_save_LIBS"
+ fi
+ if ac_fn_cxx_try_link "$LINENO"; then :
+ ac_cv_search_dlopen=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext
+ if ${ac_cv_search_dlopen+:} false; then :
+ break
+fi
+done
+if ${ac_cv_search_dlopen+:} false; then :
+
+else
+ ac_cv_search_dlopen=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_dlopen" >&5
+$as_echo "$ac_cv_search_dlopen" >&6; }
+ac_res=$ac_cv_search_dlopen
+if test "$ac_res" != no; then :
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+SIMPLE_LIBS_DL=$LIBS
+
+LIBS=$_SAVE_LIBS
+LDFLAGS=$_SAVE_LDFLAGS
+
+
+MAKE_MANIP=0
+
+if test "x$with_manip" != "xno"; then
+ _SAVE_LIBS=$LIBS
+ _SAVE_LDFLAGS=$LDFLAGS
+ LIBS=$SIMPLE_LIBS
+ LDFLAGS=$SIMPLE_LDFLAGS
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tgetent in -ltinfo" >&5
+$as_echo_n "checking for tgetent in -ltinfo... " >&6; }
+if ${ac_cv_lib_tinfo_tgetent+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ltinfo $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char tgetent ();
+int
+main ()
+{
+return tgetent ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+ ac_cv_lib_tinfo_tgetent=yes
+else
+ ac_cv_lib_tinfo_tgetent=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_tinfo_tgetent" >&5
+$as_echo "$ac_cv_lib_tinfo_tgetent" >&6; }
+if test "x$ac_cv_lib_tinfo_tgetent" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBTINFO 1
+_ACEOF
+
+ LIBS="-ltinfo $LIBS"
+
+fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing wbkgdset" >&5
+$as_echo_n "checking for library containing wbkgdset... " >&6; }
+if ${ac_cv_search_wbkgdset+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char wbkgdset ();
+int
+main ()
+{
+return wbkgdset ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' ncurses curses; do
+ if test -z "$ac_lib"; then
+ ac_res="none required"
+ else
+ ac_res=-l$ac_lib
+ LIBS="-l$ac_lib $ac_func_search_save_LIBS"
+ fi
+ if ac_fn_cxx_try_link "$LINENO"; then :
+ ac_cv_search_wbkgdset=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext
+ if ${ac_cv_search_wbkgdset+:} false; then :
+ break
+fi
+done
+if ${ac_cv_search_wbkgdset+:} false; then :
+
+else
+ ac_cv_search_wbkgdset=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_wbkgdset" >&5
+$as_echo "$ac_cv_search_wbkgdset" >&6; }
+ac_res=$ac_cv_search_wbkgdset
+if test "$ac_res" != no; then :
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+ MAKE_MANIP=1
+
+fi
+
+ ac_fn_cxx_check_header_mongrel "$LINENO" "ncurses.h" "ac_cv_header_ncurses_h" "$ac_includes_default"
+if test "x$ac_cv_header_ncurses_h" = xyes; then :
+
+ HAVE_NCURSES_H=1
+
+else
+
+ ac_fn_cxx_check_header_mongrel "$LINENO" "curses.h" "ac_cv_header_curses_h" "$ac_includes_default"
+if test "x$ac_cv_header_curses_h" = xyes; then :
+
+ HAVE_CURSES_H=1
+
+else
+
+ MAKE_MANIP=0
+
+fi
+
+
+
+fi
+
+
+ if test "$HAVE_NCURSES_H" = "1"; then
+ $as_echo "#define HAVE_NCURSES_H 1" >>confdefs.h
+
+ fi
+ if test "$HAVE_CURSES_H" = "1"; then
+ $as_echo "#define HAVE_CURSES_H 1" >>confdefs.h
+
+ fi
+ MANIP_LIBS=$LIBS
+ MANIP_LDFLAGS=$LDFLAGS
+ if test "x$with_staticlink" = "xyes"; then
+ MANIP_LIBS="$SIMPLE_LIBS -Wl,-Bstatic -lncurses -ltinfo -lm -Wl,-Bdynamic -ldl"
+ #MANIP_LIBS="$SIMPLE_LIBS -Wl,-Bstatic -lncurses -lm -Wl,-Bdynamic -ldl"
+ else
+ MANIP_LIBS="$MANIP_LIBS -lm"
+ fi
+ LIBS=$_SAVE_LIBS
+ LDFLAGS=$_SAVE_LDFLAGS
+fi
+
+
+if test "x$with_warn" != "xno"; then
+ CPPFLAGS="-Wall $CPPFLAGS"
+fi
+
+CPPFLAGS="-Wno-write-strings $CPPFLAGS"
+
+CPPFLAGS="-DHAVE_CONFIG_H \$(VERSION_INFO) $CPPFLAGS"
+LDFLAGS="$LDFLAGS $EXTRA_LDFLAGS"
+LIBS="$LIBS $EXTRA_LIBS"
+
+
+MAKE_AUTOPACKAGE=0
+if test "x$with_autopackage" != "xno"; then
+ MAKE_AUTOPACKAGE=1
+
+ if test "x$HAVE_QT" != "x0"; then
+ AP_CONFIG_ARGS="$AP_CONFIG_ARGS --with-qt=$QTDIR"
+ fi
+ if test "$with_png" != yes; then
+ AP_CONFIG_ARGS="$AP_CONFIG_ARGS --with-png=$with_png"
+ fi
+
+ CPPFLAGS=$_CPPFLAGS_INI
+ CXXFLAGS=$_CXXFLAGS_INI
+ LDFLAGS=$_LDFLAGS_INI
+ LIBS=$_LIBS_INI
+fi
+
+if test "x$with_apintern" != "xno"; then
+ LDFLAGS="$LDFLAGS -static-libgcc"
+ LIBS="$LIBS -Wl,-Bstatic -lstdc++ -Wl,-Bdynamic"
+ SIMPLE_LDFLAGS="$SIMPLE_LDFLAGS -static-libgcc"
+ SIMPLE_LIBS="$SIMPLE_LIBS -Wl,-Bstatic -lstdc++ -Wl,-Bdynamic"
+ MANIP_LDFLAGS="$MANIP_LDFLAGS -static-libgcc"
+ MANIP_LIBS="$MANIP_LIBS -Wl,-Bstatic -lstdc++ -Wl,-Bdynamic"
+ HAVE_X11=0
+ HAVE_AUTOPACKAGE=1
+fi
+
+
+
+if test "x$with_debug" != "xno"; then
+ CPPFLAGS="-g $CPPFLAGS"
+ LDFLAGS="-g $LDFLAGS"
+fi
+
+if test "x$with_debug" = "xyes"; then
+ QT_CONFIG="CONFIG += debug"
+fi
+
+
+if test -n "$ac_tool_prefix"; then
+ for ac_prog in strip,gstrip
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_STRIP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$STRIP"; then
+ ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_STRIP="$ac_tool_prefix$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$STRIP" && break
+ done
+fi
+if test -z "$STRIP"; then
+ ac_ct_STRIP=$STRIP
+ for ac_prog in strip,gstrip
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_STRIP"; then
+ ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_STRIP="$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_STRIP" && break
+done
+
+ if test "x$ac_ct_STRIP" = x; then
+ STRIP="strip"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ STRIP=$ac_ct_STRIP
+ fi
+fi
+
+echo Checking if strip is GNU strip
+if $STRIP -V | grep GNU > /dev/null
+then
+ STRIPALL="-s"
+
+ STRIPUNNEEDED="--strip-unneeded"
+
+ echo "strip is GNU strip ($STRIP)"
+else
+ STRIPALL=""
+
+ STRIPUNNEEDED="-x"
+
+ echo "strip is not GNU Strip ($STRIP)"
+fi
+
+
+if test "x$HAVE_X11" != "x0"; then
+ $as_echo "#define HAVE_X11 1" >>confdefs.h
+
+fi
+if test "x$HAVE_CAIRO" != "x0"; then
+ $as_echo "#define HAVE_CAIRO 1" >>confdefs.h
+
+fi
+if test "x$HAVE_POPPLER" != "x0"; then
+ $as_echo "#define HAVE_POPPLER 1" >>confdefs.h
+
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+if test "$prefix" = "NONE"; then
+ GLE_INSTALL_DATA=/usr/share/$PACKAGE_TARNAME/$GLE_VERSION
+ prefix="/usr"
+else
+ GLE_INSTALL_DATA=$prefix/share/$PACKAGE_TARNAME/$GLE_VERSION
+fi
+
+if test "$exec_prefix" = "NONE"; then
+ if test "$prefix" = "NONE"; then
+ GLE_INSTALL_BIN=/usr/bin
+ else
+ GLE_INSTALL_BIN=$prefix/bin
+ fi
+else
+ GLE_INSTALL_BIN=$exec_prefix
+fi
+
+if test "$bindir" != "\${exec_prefix}/bin"; then
+ GLE_INSTALL_BIN=$bindir
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ac_config_files="$ac_config_files Makefile src/gle/Makefile src/gle/bitmap/Makefile src/gle/letzfitz/Makefile src/gle/surface/Makefile src/gle/tokens/Makefile src/fbuild/Makefile src/makefmt/Makefile src/manip/Makefile src/TeX/Makefile src/gui/MakefileAC src/gui/qgle.pro src/doc/gle.1 platform/autoconf/gle-graphics.pc platform/autopackage/gle4.apspec"
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems. If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+ for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+ *) { eval $ac_var=; unset $ac_var;} ;;
+ esac ;;
+ esac
+ done
+
+ (set) 2>&1 |
+ case $as_nl`(ac_space=' '; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ # `set' does not quote correctly, so add quotes: double-quote
+ # substitution turns \\\\ into \\, and sed turns \\ into \.
+ sed -n \
+ "s/'/'\\\\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+ ;; #(
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+) |
+ sed '
+ /^ac_cv_env_/b end
+ t clear
+ :clear
+ s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+ t end
+ s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+ :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+ if test -w "$cache_file"; then
+ if test "x$cache_file" != "x/dev/null"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+$as_echo "$as_me: updating cache $cache_file" >&6;}
+ if test ! -f "$cache_file" || test -h "$cache_file"; then
+ cat confcache >"$cache_file"
+ else
+ case $cache_file in #(
+ */* | ?:*)
+ mv -f confcache "$cache_file"$$ &&
+ mv -f "$cache_file"$$ "$cache_file" ;; #(
+ *)
+ mv -f confcache "$cache_file" ;;
+ esac
+ fi
+ fi
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+ fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+U=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+ # 1. Remove the extension, and $U if already installed.
+ ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+ ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+ # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR
+ # will be set to the directory where LIBOBJS objects are built.
+ as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+ as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+
+
+: "${CONFIG_STATUS=./config.status}"
+ac_write_fail=0
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+as_write_fail=0
+cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='print -r --'
+ as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='printf %s\n'
+ as_echo_n='printf %s'
+else
+ if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+ as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+ as_echo_n='/usr/ucb/echo -n'
+ else
+ as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+ as_echo_n_body='eval
+ arg=$1;
+ case $arg in #(
+ *"$as_nl"*)
+ expr "X$arg" : "X\\(.*\\)$as_nl";
+ arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+ esac;
+ expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+ '
+ export as_echo_n_body
+ as_echo_n='sh -c $as_echo_n_body as_echo'
+ fi
+ export as_echo_body
+ as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order. Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" "" $as_nl"
+
+# Find who we are. Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there. '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+ as_status=$1; test $as_status -eq 0 && as_status=1
+ if test "$4"; then
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ fi
+ $as_echo "$as_me: error: $2" >&2
+ as_fn_exit $as_status
+} # as_fn_error
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+ return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+ set +e
+ as_fn_set_status $1
+ exit $1
+} # as_fn_exit
+
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+ { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+ eval 'as_fn_append ()
+ {
+ eval $1+=\$2
+ }'
+else
+ as_fn_append ()
+ {
+ eval $1=\$$1\$2
+ }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+ eval 'as_fn_arith ()
+ {
+ as_val=$(( $* ))
+ }'
+else
+ as_fn_arith ()
+ {
+ as_val=`expr "$@" || test $? -eq 1`
+ }
+fi # as_fn_arith
+
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+ case `echo 'xy\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ xy) ECHO_C='\c';;
+ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
+ ECHO_T=' ';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -pR'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -pR'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -pR'
+ fi
+else
+ as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || eval $as_mkdir_p || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p='mkdir -p "$as_dir"'
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## ----------------------------------- ##
+## Main body of $CONFIG_STATUS script. ##
+## ----------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# Save the log message, to keep $0 and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by gle-graphics $as_me 4.2.5, which was
+generated by GNU Autoconf 2.69. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+ CONFIG_HEADERS = $CONFIG_HEADERS
+ CONFIG_LINKS = $CONFIG_LINKS
+ CONFIG_COMMANDS = $CONFIG_COMMANDS
+ $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+case $ac_config_headers in *"
+"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
+esac
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_headers="$ac_config_headers"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files and other configuration actions
+from templates according to the current configuration. Unless the files
+and actions are specified as TAGs, all are instantiated by default.
+
+Usage: $0 [OPTION]... [TAG]...
+
+ -h, --help print this help, then exit
+ -V, --version print version number and configuration settings, then exit
+ --config print configuration, then exit
+ -q, --quiet, --silent
+ do not print progress messages
+ -d, --debug don't remove temporary files
+ --recheck update $as_me by reconfiguring in the same conditions
+ --file=FILE[:TEMPLATE]
+ instantiate the configuration file FILE
+ --header=FILE[:TEMPLATE]
+ instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Report bugs to <glx-general at lists.sourceforge.net>."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ac_cs_version="\\
+gle-graphics config.status 4.2.5
+configured by $0, generated by GNU Autoconf 2.69,
+ with options \\"\$ac_cs_config\\"
+
+Copyright (C) 2012 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+MKDIR_P='$MKDIR_P'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+ac_need_defaults=:
+while test $# != 0
+do
+ case $1 in
+ --*=?*)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+ ac_shift=:
+ ;;
+ --*=)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=
+ ac_shift=:
+ ;;
+ *)
+ ac_option=$1
+ ac_optarg=$2
+ ac_shift=shift
+ ;;
+ esac
+
+ case $ac_option in
+ # Handling of the options.
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ ac_cs_recheck=: ;;
+ --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+ $as_echo "$ac_cs_version"; exit ;;
+ --config | --confi | --conf | --con | --co | --c )
+ $as_echo "$ac_cs_config"; exit ;;
+ --debug | --debu | --deb | --de | --d | -d )
+ debug=: ;;
+ --file | --fil | --fi | --f )
+ $ac_shift
+ case $ac_optarg in
+ *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ '') as_fn_error $? "missing file argument" ;;
+ esac
+ as_fn_append CONFIG_FILES " '$ac_optarg'"
+ ac_need_defaults=false;;
+ --header | --heade | --head | --hea )
+ $ac_shift
+ case $ac_optarg in
+ *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ as_fn_append CONFIG_HEADERS " '$ac_optarg'"
+ ac_need_defaults=false;;
+ --he | --h)
+ # Conflict between --help and --header
+ as_fn_error $? "ambiguous option: \`$1'
+Try \`$0 --help' for more information.";;
+ --help | --hel | -h )
+ $as_echo "$ac_cs_usage"; exit ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil | --si | --s)
+ ac_cs_silent=: ;;
+
+ # This is an error.
+ -*) as_fn_error $? "unrecognized option: \`$1'
+Try \`$0 --help' for more information." ;;
+
+ *) as_fn_append ac_config_targets " $1"
+ ac_need_defaults=false ;;
+
+ esac
+ shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+ exec 6>/dev/null
+ ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+if \$ac_cs_recheck; then
+ set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+ shift
+ \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+ CONFIG_SHELL='$SHELL'
+ export CONFIG_SHELL
+ exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+ echo
+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+ $as_echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+ case $ac_config_target in
+ "src/config.h") CONFIG_HEADERS="$CONFIG_HEADERS src/config.h" ;;
+ "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+ "src/gle/Makefile") CONFIG_FILES="$CONFIG_FILES src/gle/Makefile" ;;
+ "src/gle/bitmap/Makefile") CONFIG_FILES="$CONFIG_FILES src/gle/bitmap/Makefile" ;;
+ "src/gle/letzfitz/Makefile") CONFIG_FILES="$CONFIG_FILES src/gle/letzfitz/Makefile" ;;
+ "src/gle/surface/Makefile") CONFIG_FILES="$CONFIG_FILES src/gle/surface/Makefile" ;;
+ "src/gle/tokens/Makefile") CONFIG_FILES="$CONFIG_FILES src/gle/tokens/Makefile" ;;
+ "src/fbuild/Makefile") CONFIG_FILES="$CONFIG_FILES src/fbuild/Makefile" ;;
+ "src/makefmt/Makefile") CONFIG_FILES="$CONFIG_FILES src/makefmt/Makefile" ;;
+ "src/manip/Makefile") CONFIG_FILES="$CONFIG_FILES src/manip/Makefile" ;;
+ "src/TeX/Makefile") CONFIG_FILES="$CONFIG_FILES src/TeX/Makefile" ;;
+ "src/gui/MakefileAC") CONFIG_FILES="$CONFIG_FILES src/gui/MakefileAC" ;;
+ "src/gui/qgle.pro") CONFIG_FILES="$CONFIG_FILES src/gui/qgle.pro" ;;
+ "src/doc/gle.1") CONFIG_FILES="$CONFIG_FILES src/doc/gle.1" ;;
+ "platform/autoconf/gle-graphics.pc") CONFIG_FILES="$CONFIG_FILES platform/autoconf/gle-graphics.pc" ;;
+ "platform/autopackage/gle4.apspec") CONFIG_FILES="$CONFIG_FILES platform/autopackage/gle4.apspec" ;;
+
+ *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+ esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used. Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+ test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+ test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+fi
+
+# Have a temporary directory for convenience. Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+ tmp= ac_tmp=
+ trap 'exit_status=$?
+ : "${ac_tmp:=$tmp}"
+ { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
+' 0
+ trap 'as_fn_exit 1' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+ tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+ test -d "$tmp"
+} ||
+{
+ tmp=./conf$$-$RANDOM
+ (umask 077 && mkdir "$tmp")
+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
+ac_tmp=$tmp
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr=`echo X | tr X '\015'`
+# On cygwin, bash can eat \r inside `` if the user requested igncr.
+# But we know of no other shell where ac_cr would be empty at this
+# point, so we can use a bashism as a fallback.
+if test "x$ac_cr" = x; then
+ eval ac_cr=\$\'\\r\'
+fi
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+ ac_cs_awk_cr='\\r'
+else
+ ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+ echo "cat >conf$$subs.awk <<_ACEOF" &&
+ echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+ echo "_ACEOF"
+} >conf$$subs.sh ||
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+ . ./conf$$subs.sh ||
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+
+ ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+ if test $ac_delim_n = $ac_delim_num; then
+ break
+ elif $ac_last_try; then
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\)..*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\)..*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+ N
+ s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
+ for (key in S) S_is_set[key] = 1
+ FS = ""
+
+}
+{
+ line = $ 0
+ nfields = split(line, field, "@")
+ substed = 0
+ len = length(field[1])
+ for (i = 2; i < nfields; i++) {
+ key = field[i]
+ keylen = length(key)
+ if (S_is_set[key]) {
+ value = S[key]
+ line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+ len += length(value) + length(field[++i])
+ substed = 1
+ } else
+ len += 1 + keylen
+ }
+
+ print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+ sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+ cat
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
+ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
+# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{
+h
+s///
+s/^/:/
+s/[ ]*$/:/
+s/:\$(srcdir):/:/g
+s/:\${srcdir}:/:/g
+s/:@srcdir@:/:/g
+s/^:*//
+s/:*$//
+x
+s/\(=[ ]*\).*/\1/
+G
+s/\n//
+s/^[^=]*=[ ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+# Set up the scripts for CONFIG_HEADERS section.
+# No need to generate them if there are no CONFIG_HEADERS.
+# This happens for instance with `./config.status Makefile'.
+if test -n "$CONFIG_HEADERS"; then
+cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
+BEGIN {
+_ACEOF
+
+# Transform confdefs.h into an awk script `defines.awk', embedded as
+# here-document in config.status, that substitutes the proper values into
+# config.h.in to produce config.h.
+
+# Create a delimiter string that does not exist in confdefs.h, to ease
+# handling of long lines.
+ac_delim='%!_!# '
+for ac_last_try in false false :; do
+ ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
+ if test -z "$ac_tt"; then
+ break
+ elif $ac_last_try; then
+ as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+done
+
+# For the awk script, D is an array of macro values keyed by name,
+# likewise P contains macro parameters if any. Preserve backslash
+# newline sequences.
+
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+sed -n '
+s/.\{148\}/&'"$ac_delim"'/g
+t rset
+:rset
+s/^[ ]*#[ ]*define[ ][ ]*/ /
+t def
+d
+:def
+s/\\$//
+t bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3"/p
+s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p
+d
+:bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3\\\\\\n"\\/p
+t cont
+s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
+t cont
+d
+:cont
+n
+s/.\{148\}/&'"$ac_delim"'/g
+t clear
+:clear
+s/\\$//
+t bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/"/p
+d
+:bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
+b cont
+' <confdefs.h | sed '
+s/'"$ac_delim"'/"\\\
+"/g' >>$CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ for (key in D) D_is_set[key] = 1
+ FS = ""
+}
+/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
+ line = \$ 0
+ split(line, arg, " ")
+ if (arg[1] == "#") {
+ defundef = arg[2]
+ mac1 = arg[3]
+ } else {
+ defundef = substr(arg[1], 2)
+ mac1 = arg[2]
+ }
+ split(mac1, mac2, "(") #)
+ macro = mac2[1]
+ prefix = substr(line, 1, index(line, defundef) - 1)
+ if (D_is_set[macro]) {
+ # Preserve the white space surrounding the "#".
+ print prefix "define", macro P[macro] D[macro]
+ next
+ } else {
+ # Replace #undef with comments. This is necessary, for example,
+ # in the case of _POSIX_SOURCE, which is predefined and required
+ # on some systems where configure will not decide to define it.
+ if (defundef == "undef") {
+ print "/*", prefix defundef, macro, "*/"
+ next
+ }
+ }
+}
+{ print }
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ as_fn_error $? "could not setup config headers machinery" "$LINENO" 5
+fi # test -n "$CONFIG_HEADERS"
+
+
+eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS "
+shift
+for ac_tag
+do
+ case $ac_tag in
+ :[FHLC]) ac_mode=$ac_tag; continue;;
+ esac
+ case $ac_mode$ac_tag in
+ :[FHL]*:*);;
+ :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
+ :[FH]-) ac_tag=-:-;;
+ :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+ esac
+ ac_save_IFS=$IFS
+ IFS=:
+ set x $ac_tag
+ IFS=$ac_save_IFS
+ shift
+ ac_file=$1
+ shift
+
+ case $ac_mode in
+ :L) ac_source=$1;;
+ :[FH])
+ ac_file_inputs=
+ for ac_f
+ do
+ case $ac_f in
+ -) ac_f="$ac_tmp/stdin";;
+ *) # Look for the file first in the build tree, then in the source tree
+ # (if the path is not absolute). The absolute path cannot be DOS-style,
+ # because $ac_f cannot contain `:'.
+ test -f "$ac_f" ||
+ case $ac_f in
+ [\\/$]*) false;;
+ *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+ esac ||
+ as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+ esac
+ case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+ as_fn_append ac_file_inputs " '$ac_f'"
+ done
+
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ configure_input='Generated from '`
+ $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+ `' by configure.'
+ if test x"$ac_file" != x-; then
+ configure_input="$ac_file. $configure_input"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+$as_echo "$as_me: creating $ac_file" >&6;}
+ fi
+ # Neutralize special characters interpreted by sed in replacement strings.
+ case $configure_input in #(
+ *\&* | *\|* | *\\* )
+ ac_sed_conf_input=`$as_echo "$configure_input" |
+ sed 's/[\\\\&|]/\\\\&/g'`;; #(
+ *) ac_sed_conf_input=$configure_input;;
+ esac
+
+ case $ac_tag in
+ *:-:* | *:-) cat >"$ac_tmp/stdin" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
+ esac
+ ;;
+ esac
+
+ ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ as_dir="$ac_dir"; as_fn_mkdir_p
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+ case $ac_mode in
+ :F)
+ #
+ # CONFIG_FILE
+ #
+
+ case $INSTALL in
+ [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+ *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+ esac
+ ac_MKDIR_P=$MKDIR_P
+ case $MKDIR_P in
+ [\\/$]* | ?:[\\/]* ) ;;
+ */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
+ esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+ac_sed_dataroot='
+/datarootdir/ {
+ p
+ q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ ac_datarootdir_hack='
+ s&@datadir@&$datadir&g
+ s&@docdir@&$docdir&g
+ s&@infodir@&$infodir&g
+ s&@localedir@&$localedir&g
+ s&@mandir@&$mandir&g
+ s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+s&@MKDIR_P@&$ac_MKDIR_P&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
+ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+ { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
+ { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \
+ "$ac_tmp/out"`; test -z "$ac_out"; } &&
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined" >&5
+$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined" >&2;}
+
+ rm -f "$ac_tmp/stdin"
+ case $ac_file in
+ -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
+ *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
+ esac \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ ;;
+ :H)
+ #
+ # CONFIG_HEADER
+ #
+ if test x"$ac_file" != x-; then
+ {
+ $as_echo "/* $configure_input */" \
+ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
+ } >"$ac_tmp/config.h" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
+$as_echo "$as_me: $ac_file is unchanged" >&6;}
+ else
+ rm -f "$ac_file"
+ mv "$ac_tmp/config.h" "$ac_file" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ fi
+ else
+ $as_echo "/* $configure_input */" \
+ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
+ || as_fn_error $? "could not create -" "$LINENO" 5
+ fi
+ ;;
+
+
+ esac
+
+done # for ac_tag
+
+
+as_fn_exit 0
+_ACEOF
+ac_clean_files=$ac_clean_files_save
+
+test $ac_write_fail = 0 ||
+ as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded. So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status. When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+ ac_cs_success=:
+ ac_config_status_args=
+ test "$silent" = yes &&
+ ac_config_status_args="$ac_config_status_args --quiet"
+ exec 5>/dev/null
+ $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+ exec 5>>config.log
+ # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+ # would make configure fail if this is the last instruction.
+ $ac_cs_success || as_fn_exit 1
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5
+$as_echo "" >&6; }
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: CPPFLAGS: $CPPFLAGS" >&5
+$as_echo "CPPFLAGS: $CPPFLAGS" >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: LDFLAGS: $LDFLAGS" >&5
+$as_echo "LDFLAGS: $LDFLAGS" >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: LIBS: $LIBS" >&5
+$as_echo "LIBS: $LIBS" >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: SIMPLE_LIBS: $SIMPLE_LIBS" >&5
+$as_echo "SIMPLE_LIBS: $SIMPLE_LIBS" >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: SIMPLE_LIBS_DL: $SIMPLE_LIBS_DL" >&5
+$as_echo "SIMPLE_LIBS_DL: $SIMPLE_LIBS_DL" >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: SIMPLE_LDFLAGS: $SIMPLE_LDFLAGS" >&5
+$as_echo "SIMPLE_LDFLAGS: $SIMPLE_LDFLAGS" >&6; }
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result:
+** Configuration summary for GLE $GLE_VERSION$GLE_SNAPSHOT ($host):
+" >&5
+$as_echo "
+** Configuration summary for GLE $GLE_VERSION$GLE_SNAPSHOT ($host):
+" >&6; }
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ** Bitmap support:" >&5
+$as_echo " ** Bitmap support:" >&6; }
+
+if test "$HAVE_LIBPNG" = 1; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: PNG support: yes" >&5
+$as_echo " PNG support: yes" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: PNG support: no" >&5
+$as_echo " PNG support: no" >&6; }
+fi
+
+if test "$HAVE_LIBTIFF" = 1; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: TIFF support: yes" >&5
+$as_echo " TIFF support: yes" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: TIFF support: no" >&5
+$as_echo " TIFF support: no" >&6; }
+fi
+
+if test "$HAVE_LIBJPEG" = 1; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: JPEG support: yes" >&5
+$as_echo " JPEG support: yes" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: JPEG support: no" >&5
+$as_echo " JPEG support: no" >&6; }
+fi
+
+if test "x$with_staticlink" != "xno"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: Statically link: yes" >&5
+$as_echo " Statically link: yes" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: Statically link: no" >&5
+$as_echo " Statically link: no" >&6; }
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5
+$as_echo "" >&6; }
+
+if test "$HAVE_X11" = 1; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: ** X11 preview support: yes" >&5
+$as_echo " ** X11 preview support: yes" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: ** X11 preview support: no" >&5
+$as_echo " ** X11 preview support: no" >&6; }
+fi
+
+if test "$HAVE_CAIRO" = 1; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: ** Cairo graphics support: yes" >&5
+$as_echo " ** Cairo graphics support: yes" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: ** Cairo graphics support: no" >&5
+$as_echo " ** Cairo graphics support: no" >&6; }
+fi
+
+if test "$HAVE_POPPLER" = 1; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: ** Poppler PDF support: yes" >&5
+$as_echo " ** Poppler PDF support: yes" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: ** Poppler PDF support: no" >&5
+$as_echo " ** Poppler PDF support: no" >&6; }
+fi
+
+if test "$HAVE_SOCKETS" = 1; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: ** Socket support: yes" >&5
+$as_echo " ** Socket support: yes" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: ** Socket support: no" >&5
+$as_echo " ** Socket support: no" >&6; }
+fi
+
+if test "$MAKE_MANIP" = 1; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: ** Include 'manip' utility: yes" >&5
+$as_echo " ** Include 'manip' utility: yes" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: ** Include 'manip' utility: no" >&5
+$as_echo " ** Include 'manip' utility: no" >&6; }
+fi
+
+if test "x$with_debug" != "xno"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: ** Debug mode: on" >&5
+$as_echo " ** Debug mode: on" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: ** Debug mode: off" >&5
+$as_echo " ** Debug mode: off" >&6; }
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5
+$as_echo "" >&6; }
+
+if test "$HAVE_QT" = 1; then
+ if test "x$QT4VER" != "x?"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: ** GLE GUI support: yes (Qt4 version: $QT4VER)" >&5
+$as_echo " ** GLE GUI support: yes (Qt4 version: $QT4VER)" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: ** GLE GUI support: yes" >&5
+$as_echo " ** GLE GUI support: yes" >&6; }
+ if test "x$QMAKE_VERS" != "xnone"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QMAKE_VERS" >&5
+$as_echo " $QMAKE_VERS" >&6; }
+ fi
+ fi
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: ** GLE GUI support: no" >&5
+$as_echo " ** GLE GUI support: no" >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: (make sure you have Qt >= 4.1.1 devel and use ./configure --with-qt=/path/to/qt.)" >&5
+$as_echo " (make sure you have Qt >= 4.1.1 devel and use ./configure --with-qt=/path/to/qt.)" >&6; }
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5
+$as_echo "" >&6; }
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ** Install data into: $GLE_INSTALL_DATA" >&5
+$as_echo "** Install data into: $GLE_INSTALL_DATA" >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ** Install binary into: $GLE_INSTALL_BIN" >&5
+$as_echo "** Install binary into: $GLE_INSTALL_BIN" >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: (use ./configure --prefix=dir to change the installation directory.)" >&5
+$as_echo " (use ./configure --prefix=dir to change the installation directory.)" >&6; }
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5
+$as_echo "" >&6; }
+
+if test "x$with_autopackage" != "xno"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: GLE $GLE_VERSION$GLE_SNAPSHOT has been configured. Run \"make\" to create an autopackage for GLE." >&5
+$as_echo "GLE $GLE_VERSION$GLE_SNAPSHOT has been configured. Run \"make\" to create an autopackage for GLE." >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: GLE $GLE_VERSION$GLE_SNAPSHOT has been configured. The next step is to run \"make\". After \"make\" completes, run \"make install\" to install GLE." >&5
+$as_echo "GLE $GLE_VERSION$GLE_SNAPSHOT has been configured. The next step is to run \"make\". After \"make\" completes, run \"make install\" to install GLE." >&6; }
+fi
diff --git a/configure.ac b/configure.ac
new file mode 100644
index 0000000..c1cc7f6
--- /dev/null
+++ b/configure.ac
@@ -0,0 +1,1025 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+m4_define([gle_cr_version], [4.2.5])
+
+AC_INIT(gle-graphics, [gle_cr_version], glx-general at lists.sourceforge.net)
+AC_CONFIG_HEADER(src/config.h)
+AC_CONFIG_SRCDIR(src/gle/gle.cpp)
+
+GLE_VERSION=gle_cr_version
+
+AC_PROG_CXX
+AC_LANG_CPLUSPLUS
+
+AH_TEMPLATE(__UNIX__, [On Unix])
+AH_TEMPLATE(__CYGWIN__,[On Cygwin])
+AH_TEMPLATE(__MACOS__, [On Mac])
+AH_TEMPLATE(__FREEBSD__, [On FreeBSD])
+AH_TEMPLATE(__GNU_HURD__, [On GNU Hurd])
+AH_TEMPLATE(__LINUX__, [On Linux])
+
+HAVE_SOCKETS=1
+HAVE_LIBTIFF=0
+HAVE_LIBPNG=0
+HAVE_LIBJPEG=0
+HAVE_X11=0
+HAVE_CAIRO=0
+HAVE_POPPLER=0
+HAVE_NCURSES_H=0
+HAVE_CURSES_H=0
+HAVE_NOSCRIPTS=0
+HAVE_QT=0
+HAVE_AUTOPACKAGE=0
+HAVE_LIBGLE=0
+HAVE_LIBGLE_CPPFLAGS=0
+HAVE_LIBGLE_STATIC=0
+HAVE_MAC=0
+HAVE_FREEBSD=0
+HAVE_GNU_HURD=0
+HAVE_LINUX=0
+HAVE_WIN32=0
+HAVE_NOCYGWIN=0
+HAVE_CYGWIN=0
+HAVE_MINGW=0
+HAVE_LIBZ=0
+HAVE_LIBGLU_H=0
+QT_CONFIG="CONFIG += release"
+QT_RPATH=
+QT_LIBGLU_LIB=
+
+HAVE_STATIC_LIBPNG=0
+HAVE_STATIC_LIBTIFF=0
+HAVE_STATIC_LIBJPEG=0
+HAVE_STATIC_LIBZ=0
+HAVE_RPATH=0
+
+QMAKE_PROG=none
+QMAKE_VERS=none
+
+MANIP_LIBS=
+MANIP_LDFLAGS=
+AP_CONFIG_ARGS=
+
+LIBGLE_CPPFLAGS=
+LIBGLE_LDFLAGS=
+EXTRA_LDFLAGS=
+EXTRA_LIBS=
+SIMPLE_LIBS_DL=
+
+AC_ARG_WITH(qt, [ --with-qt[=DIR] where to find the Qt-4.1.x library (or yes/no)],,with_qt=yes)
+AC_ARG_WITH(jpeg, [ --with-jpeg[=DIR] where to find the jpeg library (or yes/no)],,with_jpeg=yes)
+AC_ARG_WITH(png, [ --with-png[=DIR] where to find the png library (or yes/no)],,with_png=yes)
+AC_ARG_WITH(tiff, [ --with-tiff[=DIR] where to find the tiff library (or yes/no)],,with_tiff=yes)
+AC_ARG_WITH(z, [ --with-z[=DIR] where to find the z library (or yes/no)],,with_z=yes)
+AC_ARG_WITH(cairo, [ --with-cairo use the Cairo graphics library (yes/no)],,with_cairo=yes)
+AC_ARG_WITH(poppler, [ --with-poppler use the Poppler PDF library (yes/no)],,with_poppler=yes)
+AC_ARG_WITH(manip, [ --with-manip build manip utility (yes/no)],,with_manip=yes)
+AC_ARG_WITH(debug, [ --with-debug compile in debug information (yes/no)],,with_debug=no)
+AC_ARG_WITH(warn, [ --with-warn compile with all warnings enabled (yes/no)],,with_warn=no)
+AC_ARG_WITH(win32, [ --with-win32 compile Windows binary (yes/no)],,with_win32=no)
+AC_ARG_WITH(arch, [ --with-arch compile for a specific Mac OS architecture (or default/no)],,with_arch=default)
+AC_ARG_WITH(scripts, [ --with-scripts install scripts instead of executables (yes/no)],,with_scritps=no)
+AC_ARG_WITH(libgle, [ --with-libgle build libgle (yes/no/static/both)],,with_libgle=no)
+AC_ARG_WITH(rpath, [ --with-rpath build with rpath (or yes/no)],,with_rpath=yes)
+AC_ARG_WITH(extrafonts, [ --with-extrafonts include additional fonts (or yes/no)],,extrafonts=no)
+AC_ARG_WITH(gnuwin32, [ --with-gnuwin32 build with GnuWin32 libs (yes/no)],,with_gnuwin32=no)
+AC_ARG_WITH(staticlink, [ --with-staticlink statically link bitmap libs (yes/no)],,with_staticlink=def)
+AC_ARG_WITH(autopackage, [ --with-autopackage create autopackage package (yes/no)],,with_autopackage=no)
+AC_ARG_WITH(apintern, [ --with-apintern autopackage (internal use) (yes/no)],,with_apintern=no)
+
+HAVE_EXTRA_FONTS=0
+if test "x$extrafonts" != "xno"; then
+ HAVE_EXTRA_FONTS=1
+fi
+
+if test -f src/fonts/extrafonts.inf; then
+ HAVE_EXTRA_FONTS=1
+fi
+
+dnl ********************************************************************************
+dnl build snapshot or release?
+dnl ********************************************************************************
+
+GLE_SNAPSHOT=""
+
+dnl ********************************************************************************
+dnl remember CPPFLAGS for qmake
+dnl ********************************************************************************
+
+QT_CPPFLAGS=$CPPFLAGS
+QT_LDFLAGS=$LDFLAGS
+
+dnl ********************************************************************************
+dnl check CPU type and OS
+dnl ********************************************************************************
+
+AC_CONFIG_AUX_DIR(platform/autoconf)
+AC_PROG_INSTALL
+AC_PROG_MKDIR_P
+AC_CANONICAL_HOST
+AC_CHECK_HEADERS([sys/param.h])
+AC_C_BIGENDIAN
+AC_TYPE_UINT16_T
+PKG_PROG_PKG_CONFIG
+
+if test "x$with_rpath" != "xno"; then
+ HAVE_RPATH=1
+fi
+
+dnl ********************************************************************************
+dnl check for Win32
+dnl ********************************************************************************
+
+if test "x$with_gnuwin32" != "xno"; then
+ with_win32=yes
+ CPPFLAGS="-I$with_gnuwin32/include $CPPFLAGS"
+ CXXFLAGS="-I$with_gnuwin32/include $CXXFLAGS"
+ LDFLAGS="-L$with_gnuwin32/lib $LDFLAGS"
+ CFLAGS="-I$with_gnuwin32/include $CFLAGS"
+ if test "x$with_staticlink" = "xdef"; then
+ with_staticlink=yes
+ fi
+fi
+
+if test "x$with_win32" != "xno"; then
+ HAVE_WIN32=1
+fi
+
+dnl ********************************************************************************
+dnl check for host type
+dnl ********************************************************************************
+
+USE_ARCH=no
+
+case $host in
+ *-*-cygwin*)
+ AC_DEFINE(__CYGWIN__)
+ HAVE_CYGWIN=1
+ ;;
+ *-*-mingw*)
+ AC_DEFINE(__CYGWIN__)
+ HAVE_CYGWIN=1
+ HAVE_MINGW=1
+ ;;
+ x86_64-apple-*)
+ if test "x$with_arch" = "xdefault"; then
+ USE_ARCH=i386
+ fi
+ ;;
+esac
+
+if test "x$with_arch" != "xdefault"; then
+ USE_ARCH=$with_arch
+fi
+
+if test "x$USE_ARCH" != "xno"; then
+ CPPFLAGS="-arch $USE_ARCH $CPPFLAGS"
+ CXXFLAGS="-arch $USE_ARCH $CXXFLAGS"
+ LDFLAGS="-arch $USE_ARCH $LDFLAGS"
+ CFLAGS="-arch $USE_ARCH $CFLAGS"
+fi
+
+if test "x$HAVE_CYGWIN" = "x1"; then
+ if test "x$HAVE_WIN32" = "x1"; then
+ HAVE_CYGWIN=0
+ HAVE_NOCYGWIN=1
+ fi
+fi
+
+if test "x$HAVE_NOCYGWIN" = "x1"; then
+ if test "x$with_gnuwin32" = "xno"; then
+ with_png=no
+ with_jpeg=no
+ with_tiff=no
+ with_z=no
+ fi
+fi
+
+dnl ********************************************************************************
+dnl check for Win32
+dnl ********************************************************************************
+
+if test "x$HAVE_WIN32" != "x1"; then
+ AC_DEFINE(__UNIX__)
+ # MacOS should also define __UNIX__
+else
+ AC_DEFINE(__WIN32__)
+ AC_DEFINE(__NOCYGWIN__)
+ CPPFLAGS="-mno-cygwin -mthreads -mms-bitfields -march=i386 $CPPFLAGS"
+ CXXFLAGS="-mno-cygwin -mthreads -mms-bitfields -march=i386 $CXXFLAGS"
+ LDFLAGS="-mno-cygwin -mthreads -mms-bitfields -march=i386 $LDFLAGS"
+ CFLAGS="-mno-cygwin -mthreads -mms-bitfields -march=i386 $CFLAGS"
+ with_manip=no
+ with_x=no
+fi
+
+dnl ********************************************************************************
+dnl remember original value of different flags
+dnl ********************************************************************************
+
+_CPPFLAGS_INI=$CPPFLAGS
+_CXXFLAGS_INI=$CXXFLAGS
+_LDFLAGS_INI=$LDFLAGS
+_LIBS_INI=$LIBS
+
+SIMPLE_LDFLAGS=$LDFLAGS
+SIMPLE_LIBS=$LIBS
+
+dnl ********************************************************************************
+dnl OS Selection
+dnl ********************************************************************************
+
+case $host in
+ *-apple*)
+ HAVE_MAC=1
+ ;;
+ *-freebsd*)
+ HAVE_FREEBSD=1
+ ;;
+ *-linux*)
+ HAVE_LINUX=1
+ ;;
+ *-gnu*)
+ HAVE_GNU_HURD=1
+ ;;
+esac
+
+dnl ********************************************************************************
+dnl is Mac OX/X?
+dnl ********************************************************************************
+
+if test "x$HAVE_MAC" = "x1"; then
+ AC_DEFINE(__MACOS__)
+ HAVE_RPATH=0
+fi
+
+dnl ********************************************************************************
+dnl is Free BSD?
+dnl ********************************************************************************
+
+if test "x$HAVE_FREEBSD" = "x1"; then
+ AC_DEFINE(__FREEBSD__)
+fi
+
+dnl ********************************************************************************
+dnl is Linux?
+dnl ********************************************************************************
+
+if test "x$HAVE_LINUX" = "x1"; then
+ AC_DEFINE(__LINUX__)
+fi
+
+dnl ********************************************************************************
+dnl is GNU / Hurd
+dnl ********************************************************************************
+
+if test "x$HAVE_GNU_HURD" = "x1"; then
+ AC_DEFINE(__GNU_HURD__)
+fi
+
+dnl ********************************************************************************
+dnl install scripts
+dnl ********************************************************************************
+
+if test "$with_scripts" != yes; then
+ case $host in
+ *-*-cygwin*|*-*-linux*|*-*-mingw*|*-*-kfreebsd*)
+ HAVE_NOSCRIPTS=1
+ ;;
+ esac
+ if test "x$HAVE_MAC" = "x1"; then
+ HAVE_NOSCRIPTS=1
+ fi
+ if test "x$HAVE_FREEBSD" = "x1"; then
+ HAVE_NOSCRIPTS=1
+ fi
+ if test "x$HAVE_LINUX" = "x1"; then
+ HAVE_NOSCRIPTS=1
+ fi
+ if test "x$HAVE_GNU_HURD" = "x1"; then
+ HAVE_NOSCRIPTS=1
+ fi
+fi
+
+dnl ********************************************************************************
+dnl check presence of X11
+dnl ********************************************************************************
+
+AC_PATH_X
+if test "$with_x" != no; then
+ if test "x$x_libraries" = "x"; then
+ x_libraries=.
+ fi
+ AC_CHECK_LIB([X11], [XOpenDisplay],
+ [HAVE_X11=1
+ if test "x$x_libraries" != "x"; then
+ LDFLAGS="$LDFLAGS -L$x_libraries"
+ fi
+ if test "x$x_includes" != "x"; then
+ CPPFLAGS="$CPPFLAGS -I$x_includes"
+ fi
+ LIBS="-lX11 $LIBS"
+ ],
+ [],
+ [[-lXt -L$x_libraries]])
+fi
+
+dnl ********************************************************************************
+dnl check for static libs option
+dnl ********************************************************************************
+
+if test "x$with_staticlink" = "xdef"; then
+ with_staticlink=no
+fi
+
+if test "x$with_staticlink" != "xno"; then
+ HAVE_STATIC_LIBPNG=1
+ HAVE_STATIC_LIBJPEG=1
+ HAVE_STATIC_LIBZ=1
+ HAVE_STATIC_LIBTIFF=1
+fi
+
+dnl ********************************************************************************
+dnl check presence of Z library
+dnl ********************************************************************************
+
+if test "$with_z" != no; then
+ AC_CHECK_LIB(z,deflate,
+ [HAVE_LIBZ=1],
+ [])
+
+ if test "x$HAVE_LIBZ" = "x1"; then
+ AC_DEFINE(HAVE_LIBZ)
+ if test "x$HAVE_STATIC_LIBZ" = "x1"; then
+ LIBS="-Wl,-Bstatic -lz -Wl,-Bdynamic $LIBS"
+ else
+ LIBS="-lz $LIBS"
+ fi
+ fi
+fi
+
+dnl ********************************************************************************
+dnl check presence of sockets library
+dnl on Linux, no extra library is required for this
+dnl ********************************************************************************
+
+SOCKET_LIB=0
+
+AC_SEARCH_LIBS(socket,socket)
+AC_SEARCH_LIBS(gethostbyname,nsl socket)
+if test "$ac_cv_func_socket" = "yes" ; then
+ if test "$ac_cv_func_gethostbyname" = "yes" ; then
+ SOCKET_LIB=1
+ fi
+fi
+
+case $host in
+ *-*-solaris*)
+ if test "$SOCKET_LIB" = "0" ; then
+ HAVE_SOCKETS=0
+ fi
+ ;;
+ *)
+esac
+
+if test "$HAVE_SOCKETS" = 1; then
+ AC_DEFINE(HAVE_SOCKETS)
+fi
+
+dnl ********************************************************************************
+dnl check presence of JPEG library
+dnl ********************************************************************************
+
+_CPPFLAGS=$CPPFLAGS
+_LDFLAGS=$LDFLAGS
+
+if test "$with_jpeg" != no; then
+ if test -d "$with_jpeg"; then
+ libjpeg_CPPFLAGS="-I$with_jpeg/include"
+ libjpeg_LDFLAGS="-L$with_jpeg/lib"
+ CPPFLAGS="$CPPFLAGS $libjpeg_CPPFLAGS"
+ LDFLAGS="$LDFLAGS $libjpeg_LDFLAGS"
+ fi
+
+ AC_CHECK_LIB(jpeg,jpeg_destroy_decompress,
+ [AC_CHECK_HEADERS(jpeglib.h,
+ [HAVE_LIBJPEG=1
+ AC_DEFINE(HAVE_LIBJPEG)
+ ],
+ [AC_MSG_WARN([found jpeg library but not jpegio.h: make sure libjpeg development package is installed])
+ ])],
+ [CPPFLAGS=$_CPPFLAGS
+ LDFLAGS=$_LDFLAGS],
+ [-lm])
+fi
+
+if test "x$HAVE_LIBJPEG" = "x1"; then
+ if test "x$HAVE_STATIC_LIBJPEG" = "x1"; then
+ LIBS="-Wl,-Bstatic -ljpeg -Wl,-Bdynamic $LIBS"
+ else
+ LIBS="-ljpeg $LIBS"
+ fi
+fi
+
+dnl ********************************************************************************
+dnl check presence of TIFF library
+dnl ********************************************************************************
+
+_CPPFLAGS=$CPPFLAGS
+_LDFLAGS=$LDFLAGS
+
+if test "$with_tiff" != no; then
+ if test -d "$with_tiff"; then
+ libtiff_CPPFLAGS="-I$with_tiff/include"
+ libtiff_LDFLAGS="-L$with_tiff/lib"
+ CPPFLAGS="$CPPFLAGS $libtiff_CPPFLAGS"
+ LDFLAGS="$LDFLAGS $libtiff_LDFLAGS"
+ fi
+
+ AC_CHECK_LIB(tiff,TIFFReadScanline,
+ [AC_CHECK_HEADERS(tiffio.h,
+ [HAVE_LIBTIFF=1
+ AC_DEFINE(HAVE_LIBTIFF)
+ ],
+ [AC_MSG_WARN([found TIFF library but not tiffio.h: make sure libtiff development package is installed])
+ CPPFLAGS=$_CPPFLAGS
+ LDFLAGS=$_LDFLAGS
+ ])],
+ [CPPFLAGS=$_CPPFLAGS
+ LDFLAGS=$_LDFLAGS],
+ [-lm])
+fi
+
+if test "x$HAVE_LIBTIFF" = "x1"; then
+ if test "x$HAVE_STATIC_LIBTIFF" = "x1"; then
+ LIBS="-Wl,-Bstatic -ltiff -Wl,-Bdynamic $LIBS"
+ else
+ LIBS="-ltiff $LIBS"
+ fi
+fi
+
+dnl ********************************************************************************
+dnl check presence of PNG library
+dnl ********************************************************************************
+
+if test "$with_png" != no; then
+ if test -d "$with_png"; then
+ HAVE_LIBPNG=1
+ AC_DEFINE(HAVE_LIBPNG)
+ CPPFLAGS="$CPPFLAGS -I$with_png/include"
+ LDFLAGS="$LDFLAGS -L$with_png/lib"
+ if test "x$with_staticlink" = "xyes"; then
+ LIBS="-Wl,-Bstatic -lpng -Wl,-Bdynamic $LIBS"
+ else
+ LIBS="-lpng $LIBS"
+ fi
+ else
+ PKG_CHECK_MODULES([libpng], [libpng >= 0],
+ [HAVE_LIBPNG=1
+ AC_DEFINE(HAVE_LIBPNG)
+ if test "x$with_staticlink" = "xyes"; then
+ LIBS="-Wl,-Bstatic $libpng_LIBS -Wl,-Bdynamic $LIBS"
+ else
+ LIBS="$libpng_LIBS $LIBS"
+ fi
+ CPPFLAGS="$libpng_CFLAGS $CPPFLAGS"
+ LDFLAGS="$libpng_LDFLAGS $LDFLAGS"
+ ],
+ [AC_MSG_RESULT([no])]
+ )
+ if test "x$HAVE_LIBPNG" = "x0"; then
+ AC_PATH_PROG([LIBPNG_CONFIG], [libpng-config])
+ if test -n "$LIBPNG_CONFIG"; then
+ HAVE_LIBPNG=1
+ AC_DEFINE(HAVE_LIBPNG)
+ libpng_CPPFLAGS=`libpng-config --cflags`
+ libpng_LDFLAGS=`libpng-config --ldflags`
+ CPPFLAGS="$libpng_CPPFLAGS $CPPFLAGS"
+ LDFLAGS="$libpng_LDFLAGS $LDFLAGS"
+ if test "x$with_staticlink" = "xyes"; then
+ LIBS="-Wl,-Bstatic -lpng -Wl,-Bdynamic $LIBS"
+ else
+ LIBS="-lpng $LIBS"
+ fi
+ fi
+ fi
+ fi
+fi
+
+dnl ********************************************************************************
+dnl check Cairo
+dnl ********************************************************************************
+
+if test "x$with_cairo" != "xno"; then
+ PKG_CHECK_MODULES([cairo], [cairo >= 1.10.0],
+ [
+ HAVE_CAIRO=1
+ AC_MSG_RESULT([ cairo CFLAGS: $cairo_CFLAGS])
+ AC_MSG_RESULT([ cairo LIBS: $cairo_LIBS])
+ if test "x$with_staticlink" = "xyes"; then
+ LIBS="-Wl,-Bstatic $cairo_LIBS -Wl,-Bdynamic $LIBS"
+ else
+ LIBS="$cairo_LIBS $LIBS"
+ fi
+ CPPFLAGS="$cairo_CFLAGS $CPPFLAGS"
+ LDFLAGS="$cairo_LDFLAGS $LDFLAGS"
+ ],
+ [
+ HAVE_CAIRO=0
+ ]
+ )
+fi
+
+if test "x$HAVE_CAIRO" = "x1"; then
+ if test "x$HAVE_WIN32" = "x1"; then
+ if test "x$with_staticlink" = "xyes"; then
+ EXTRA_LDFLAGS="$EXTRA_LDFLAGS -mwindows"
+ EXTRA_LIBS="$EXTRA_LIBS -lmsimg32"
+ fi
+ fi
+fi
+
+dnl ********************************************************************************
+dnl check Poppler
+dnl ********************************************************************************
+
+if test "x$HAVE_CAIRO" = "x1"; then
+ if test "x$with_poppler" != "xno"; then
+ PKG_CHECK_MODULES(POPPLER, [poppler-glib >= 0.10.0],
+ [
+ HAVE_POPPLER=1
+ AC_MSG_RESULT([ poppler CFLAGS: $POPPLER_CFLAGS])
+ AC_MSG_RESULT([ poppler LIBS: $POPPLER_LIBS])
+ if test "x$with_staticlink" = "xyes"; then
+ LIBS="-Wl,-Bstatic $POPPLER_LIBS -Wl,-Bdynamic $LIBS"
+ else
+ LIBS="$POPPLER_LIBS $LIBS"
+ fi
+ CPPFLAGS="$POPPLER_CFLAGS $CPPFLAGS"
+ LDFLAGS="$POPPLER_LDFLAGS $LDFLAGS"
+ ],
+ [
+ HAVE_POPPLER=0
+ ]
+ )
+ fi
+fi
+
+dnl ********************************************************************************
+dnl check Qt 4.1.x
+dnl ********************************************************************************
+
+QT4VER="?"
+QMAKE_PROG="none"
+if test "x$with_qt" != "xno"; then
+ if test "x$with_qt" = "xyes"; then
+ if test "x$PKG_CONFIG" != "x"; then
+ QT4LOC=`$PKG_CONFIG QtCore --variable=exec_prefix`
+ if test -x $QT4LOC/bin/qmake; then
+ if $PKG_CONFIG QtCore --atleast-version 4.1.1; then
+ with_qt=$QT4LOC
+ QT4VER=`$PKG_CONFIG QtCore --modversion`
+ fi
+ fi
+ fi
+ fi
+ if test "x$with_qt" = "xyes"; then
+ if test -x /opt/qt4/bin/qmake; then
+ with_qt=/opt/qt4
+ fi
+ if test -x /usr/lib/qt4/bin/qmake; then
+ with_qt=/usr/lib/qt4
+ fi
+ AC_PATH_PROG([QMAKE_PROG], [qmake-qt4], [none], [$PATH])
+ fi
+ if test "x$with_qt" != "xyes"; then
+ QTDIR=$with_qt
+ if test -x $with_qt/bin/qmake; then
+ QMAKE_PROG=$with_qt/bin/qmake
+ fi
+ if test -x $with_qt/bin/qmake-qt4; then
+ QMAKE_PROG=$with_qt/bin/qmake-qt4
+ fi
+ if test -x $with_qt/bin/qmake.exe; then
+ QMAKE_PROG=$with_qt/bin/qmake.exe
+ fi
+ if test "x$QMAKE_PROG" = "xnone"; then
+ AC_PATH_PROGS([QMAKE_PROG], [qmake-qt4 qmake], [none], [$QTDIR/bin:$PATH])
+ fi
+ fi
+ if test "x$QMAKE_PROG" != "xnone"; then
+ HAVE_QT=1
+ QMAKE_VERS=`$QMAKE_PROG -v | tail -n 1`
+ fi
+
+ AC_CHECK_HEADERS(GL/glu.h,
+ [AC_DEFINE(HAVE_LIBGLU_H)],
+ [])
+
+ AC_CHECK_LIB(GLU,gluLookAt,
+ [QT_LIBGLU_LIB=-lGLU],
+ [])
+fi
+
+if test "x$HAVE_RPATH" != "x0"; then
+ QT_RPATH="-Wl,-rpath,\\\\\\\$\\\$ORIGIN/../lib"
+fi
+
+dnl ********************************************************************************
+dnl build libgle stuff
+dnl ********************************************************************************
+
+if test "x$HAVE_QT" != "x0"; then
+ if test "x$with_libgle" != "xstatic"; then
+ if test "x$with_libgle" != "xboth"; then
+ with_libgle=yes
+ fi
+ fi
+fi
+
+if test "x$with_libgle" = "xboth"; then
+ HAVE_LIBGLE_STATIC=1
+ AC_DEFINE(HAVE_LIBGLE_STATIC)
+ with_libgle=yes
+fi
+
+if test "x$with_libgle" = "xyes"; then
+ HAVE_LIBGLE=1
+ AC_DEFINE(HAVE_LIBGLE)
+ case $host in
+ *-*-linux*|*-*-kfreebsd*)
+ LIBGLE_CPPFLAGS="-fPIC "
+ LIBGLE_LDFLAGS="-fPIC "
+ HAVE_LIBGLE_CPPFLAGS=1
+ ;;
+ esac
+fi
+
+if test "x$with_libgle" = "xstatic"; then
+ HAVE_LIBGLE_STATIC=1
+ AC_DEFINE(HAVE_LIBGLE_STATIC)
+fi
+
+dnl ********************************************************************************
+dnl check for -ldl
+dnl ********************************************************************************
+
+_SAVE_LIBS=$LIBS
+_SAVE_LDFLAGS=$LDFLAGS
+LIBS=$SIMPLE_LIBS
+LDFLAGS=$SIMPLE_LDFLAGS
+
+AC_SEARCH_LIBS(dlopen,dl)
+SIMPLE_LIBS_DL=$LIBS
+
+LIBS=$_SAVE_LIBS
+LDFLAGS=$_SAVE_LDFLAGS
+
+dnl ********************************************************************************
+dnl build manip utility
+dnl ********************************************************************************
+
+MAKE_MANIP=0
+
+if test "x$with_manip" != "xno"; then
+ _SAVE_LIBS=$LIBS
+ _SAVE_LDFLAGS=$LDFLAGS
+ LIBS=$SIMPLE_LIBS
+ LDFLAGS=$SIMPLE_LDFLAGS
+ AC_CHECK_LIB(tinfo,tgetent)
+ AC_SEARCH_LIBS(wbkgdset,ncurses curses,
+ [
+ MAKE_MANIP=1
+ ],
+ [],[])
+ AC_CHECK_HEADER([ncurses.h],
+ [
+ HAVE_NCURSES_H=1
+ ],
+ [
+ AC_CHECK_HEADER([curses.h],
+ [
+ HAVE_CURSES_H=1
+ ],
+ [
+ MAKE_MANIP=0
+ ])
+ ])
+ if test "$HAVE_NCURSES_H" = "1"; then
+ AC_DEFINE(HAVE_NCURSES_H)
+ fi
+ if test "$HAVE_CURSES_H" = "1"; then
+ AC_DEFINE(HAVE_CURSES_H)
+ fi
+ MANIP_LIBS=$LIBS
+ MANIP_LDFLAGS=$LDFLAGS
+ if test "x$with_staticlink" = "xyes"; then
+ MANIP_LIBS="$SIMPLE_LIBS -Wl,-Bstatic -lncurses -ltinfo -lm -Wl,-Bdynamic -ldl"
+ #MANIP_LIBS="$SIMPLE_LIBS -Wl,-Bstatic -lncurses -lm -Wl,-Bdynamic -ldl"
+ else
+ MANIP_LIBS="$MANIP_LIBS -lm"
+ fi
+ LIBS=$_SAVE_LIBS
+ LDFLAGS=$_SAVE_LDFLAGS
+fi
+
+dnl ********************************************************************************
+dnl set CPPFLAGS correctly - NO TESTS INVOLVING CALLING gcc BEYOND THIS POINT
+dnl ********************************************************************************
+
+if test "x$with_warn" != "xno"; then
+ CPPFLAGS="-Wall $CPPFLAGS"
+fi
+
+CPPFLAGS="-Wno-write-strings $CPPFLAGS"
+
+CPPFLAGS="-DHAVE_CONFIG_H \$(VERSION_INFO) $CPPFLAGS"
+LDFLAGS="$LDFLAGS $EXTRA_LDFLAGS"
+LIBS="$LIBS $EXTRA_LIBS"
+
+dnl ********************************************************************************
+dnl autopackage support
+dnl ********************************************************************************
+
+MAKE_AUTOPACKAGE=0
+if test "x$with_autopackage" != "xno"; then
+ MAKE_AUTOPACKAGE=1
+
+ dnl Qt support compiled in?
+ if test "x$HAVE_QT" != "x0"; then
+ AP_CONFIG_ARGS="$AP_CONFIG_ARGS --with-qt=$QTDIR"
+ fi
+ if test "$with_png" != yes; then
+ AP_CONFIG_ARGS="$AP_CONFIG_ARGS --with-png=$with_png"
+ fi
+
+ CPPFLAGS=$_CPPFLAGS_INI
+ CXXFLAGS=$_CXXFLAGS_INI
+ LDFLAGS=$_LDFLAGS_INI
+ LIBS=$_LIBS_INI
+fi
+
+if test "x$with_apintern" != "xno"; then
+ LDFLAGS="$LDFLAGS -static-libgcc"
+ LIBS="$LIBS -Wl,-Bstatic -lstdc++ -Wl,-Bdynamic"
+ SIMPLE_LDFLAGS="$SIMPLE_LDFLAGS -static-libgcc"
+ SIMPLE_LIBS="$SIMPLE_LIBS -Wl,-Bstatic -lstdc++ -Wl,-Bdynamic"
+ MANIP_LDFLAGS="$MANIP_LDFLAGS -static-libgcc"
+ MANIP_LIBS="$MANIP_LIBS -Wl,-Bstatic -lstdc++ -Wl,-Bdynamic"
+ HAVE_X11=0
+ HAVE_AUTOPACKAGE=1
+fi
+
+dnl ********************************************************************************
+dnl debugging version?
+dnl ********************************************************************************
+
+dnl --with-debug=yes, --with-debug=no, --with-debug=gle
+
+if test "x$with_debug" != "xno"; then
+ CPPFLAGS="-g $CPPFLAGS"
+ LDFLAGS="-g $LDFLAGS"
+fi
+
+if test "x$with_debug" = "xyes"; then
+ QT_CONFIG="CONFIG += debug"
+fi
+
+dnl ********************************************************************************
+dnl check strip command
+dnl ********************************************************************************
+
+AC_CHECK_TOOLS(STRIP,[strip,gstrip],strip)
+echo Checking if strip is GNU strip
+if $STRIP -V | grep GNU > /dev/null
+then
+ AC_SUBST(STRIPALL,"-s")
+ AC_SUBST(STRIPUNNEEDED, "--strip-unneeded")
+ echo "strip is GNU strip ($STRIP)"
+else
+ AC_SUBST(STRIPALL, "")
+ AC_SUBST(STRIPUNNEEDED,"-x")
+ echo "strip is not GNU Strip ($STRIP)"
+fi
+
+dnl ********************************************************************************
+dnl final substitutes
+dnl ********************************************************************************
+
+if test "x$HAVE_X11" != "x0"; then
+ AC_DEFINE(HAVE_X11)
+fi
+if test "x$HAVE_CAIRO" != "x0"; then
+ AC_DEFINE(HAVE_CAIRO)
+fi
+if test "x$HAVE_POPPLER" != "x0"; then
+ AC_DEFINE(HAVE_POPPLER)
+fi
+
+AC_SUBST(HAVE_SOCKETS)
+AC_SUBST(HAVE_LIBTIFF)
+AC_SUBST(HAVE_LIBPNG)
+AC_SUBST(HAVE_LIBJPEG)
+AC_SUBST(HAVE_CAIRO)
+AC_SUBST(HAVE_NOSCRIPTS)
+AC_SUBST(HAVE_QT)
+AC_SUBST(HAVE_LIBGLE)
+AC_SUBST(HAVE_LIBGLE_CPPFLAGS)
+AC_SUBST(HAVE_LIBGLE_STATIC)
+AC_SUBST(HAVE_AUTOPACKAGE)
+AC_SUBST(HAVE_MAC)
+AC_SUBST(HAVE_FREEBSD)
+AC_SUBST(HAVE_WIN32)
+AC_SUBST(HAVE_NOCYGWIN)
+AC_SUBST(HAVE_CYGWIN)
+AC_SUBST(HAVE_MINGW)
+AC_SUBST(HAVE_RPATH)
+AC_SUBST(QMAKE_PROG)
+AC_SUBST(MAKE_MANIP)
+AC_SUBST(AP_CONFIG_ARGS)
+AC_SUBST(GLE_SNAPSHOT)
+
+if test "$prefix" = "NONE"; then
+ GLE_INSTALL_DATA=/usr/share/$PACKAGE_TARNAME/$GLE_VERSION
+ prefix="/usr"
+else
+ GLE_INSTALL_DATA=$prefix/share/$PACKAGE_TARNAME/$GLE_VERSION
+fi
+
+if test "$exec_prefix" = "NONE"; then
+ if test "$prefix" = "NONE"; then
+ GLE_INSTALL_BIN=/usr/bin
+ else
+ GLE_INSTALL_BIN=$prefix/bin
+ fi
+else
+ GLE_INSTALL_BIN=$exec_prefix
+fi
+
+if test "$bindir" != "\${exec_prefix}/bin"; then
+ GLE_INSTALL_BIN=$bindir
+fi
+
+AC_SUBST(SIMPLE_LIBS)
+AC_SUBST(SIMPLE_LIBS_DL)
+AC_SUBST(SIMPLE_LDFLAGS)
+AC_SUBST(MANIP_LIBS)
+AC_SUBST(MANIP_LDFLAGS)
+AC_SUBST(LIBGLE_CPPFLAGS)
+AC_SUBST(LIBGLE_LDFLAGS)
+AC_SUBST(GLE_INSTALL_DATA)
+AC_SUBST(GLE_INSTALL_BIN)
+AC_SUBST(GLE_VERSION)
+AC_SUBST(MAKE_AUTOPACKAGE)
+AC_SUBST(QT_CONFIG)
+AC_SUBST(QT_RPATH)
+AC_SUBST(QT_LIBGLU_LIB)
+AC_SUBST(QT_CPPFLAGS)
+AC_SUBST(QT_LDFLAGS)
+AC_SUBST(HAVE_EXTRA_FONTS)
+
+AC_CONFIG_FILES([Makefile src/gle/Makefile src/gle/bitmap/Makefile src/gle/letzfitz/Makefile src/gle/surface/Makefile src/gle/tokens/Makefile src/fbuild/Makefile src/makefmt/Makefile src/manip/Makefile src/TeX/Makefile src/gui/MakefileAC src/gui/qgle.pro src/doc/gle.1 platform/autoconf/gle-graphics.pc platform/autopackage/gle4.apspec])
+AC_OUTPUT
+
+AC_MSG_RESULT([])
+
+AC_MSG_RESULT([CPPFLAGS: $CPPFLAGS])
+AC_MSG_RESULT([LDFLAGS: $LDFLAGS])
+AC_MSG_RESULT([LIBS: $LIBS])
+AC_MSG_RESULT([SIMPLE_LIBS: $SIMPLE_LIBS])
+AC_MSG_RESULT([SIMPLE_LIBS_DL: $SIMPLE_LIBS_DL])
+AC_MSG_RESULT([SIMPLE_LDFLAGS: $SIMPLE_LDFLAGS])
+
+AC_MSG_RESULT([
+** Configuration summary for GLE $GLE_VERSION$GLE_SNAPSHOT ($host):
+])
+
+AC_MSG_RESULT([ ** Bitmap support:])
+
+if test "$HAVE_LIBPNG" = 1; then
+ AC_MSG_RESULT([ PNG support: yes])
+else
+ AC_MSG_RESULT([ PNG support: no])
+fi
+
+if test "$HAVE_LIBTIFF" = 1; then
+ AC_MSG_RESULT([ TIFF support: yes])
+else
+ AC_MSG_RESULT([ TIFF support: no])
+fi
+
+if test "$HAVE_LIBJPEG" = 1; then
+ AC_MSG_RESULT([ JPEG support: yes])
+else
+ AC_MSG_RESULT([ JPEG support: no])
+fi
+
+if test "x$with_staticlink" != "xno"; then
+ AC_MSG_RESULT([ Statically link: yes])
+else
+ AC_MSG_RESULT([ Statically link: no])
+fi
+
+AC_MSG_RESULT([])
+
+if test "$HAVE_X11" = 1; then
+ AC_MSG_RESULT([ ** X11 preview support: yes])
+else
+ AC_MSG_RESULT([ ** X11 preview support: no])
+fi
+
+if test "$HAVE_CAIRO" = 1; then
+ AC_MSG_RESULT([ ** Cairo graphics support: yes])
+else
+ AC_MSG_RESULT([ ** Cairo graphics support: no])
+fi
+
+if test "$HAVE_POPPLER" = 1; then
+ AC_MSG_RESULT([ ** Poppler PDF support: yes])
+else
+ AC_MSG_RESULT([ ** Poppler PDF support: no])
+fi
+
+if test "$HAVE_SOCKETS" = 1; then
+ AC_MSG_RESULT([ ** Socket support: yes])
+else
+ AC_MSG_RESULT([ ** Socket support: no])
+fi
+
+if test "$MAKE_MANIP" = 1; then
+ AC_MSG_RESULT([ ** Include 'manip' utility: yes])
+else
+ AC_MSG_RESULT([ ** Include 'manip' utility: no])
+fi
+
+if test "x$with_debug" != "xno"; then
+ AC_MSG_RESULT([ ** Debug mode: on])
+else
+ AC_MSG_RESULT([ ** Debug mode: off])
+fi
+
+AC_MSG_RESULT([])
+
+if test "$HAVE_QT" = 1; then
+ if test "x$QT4VER" != "x?"; then
+ AC_MSG_RESULT([ ** GLE GUI support: yes (Qt4 version: $QT4VER)])
+ else
+ AC_MSG_RESULT([ ** GLE GUI support: yes])
+ if test "x$QMAKE_VERS" != "xnone"; then
+ AC_MSG_RESULT([ $QMAKE_VERS])
+ fi
+ fi
+else
+ AC_MSG_RESULT([ ** GLE GUI support: no])
+ AC_MSG_RESULT([ (make sure you have Qt >= 4.1.1 devel and use ./configure --with-qt=/path/to/qt.)])
+fi
+
+AC_MSG_RESULT([])
+
+AC_MSG_RESULT([** Install data into: $GLE_INSTALL_DATA])
+AC_MSG_RESULT([** Install binary into: $GLE_INSTALL_BIN])
+AC_MSG_RESULT([ (use ./configure --prefix=dir to change the installation directory.)])
+
+AC_MSG_RESULT([])
+
+if test "x$with_autopackage" != "xno"; then
+ AC_MSG_RESULT([GLE $GLE_VERSION$GLE_SNAPSHOT has been configured. Run "make" to create an autopackage for GLE.])
+else
+ AC_MSG_RESULT([GLE $GLE_VERSION$GLE_SNAPSHOT has been configured. The next step is to run "make". After "make" completes, run "make install" to install GLE.])
+fi
diff --git a/contrib/editors/highlighting/gle-emacs.el b/contrib/editors/highlighting/gle-emacs.el
new file mode 100644
index 0000000..bbf0016
--- /dev/null
+++ b/contrib/editors/highlighting/gle-emacs.el
@@ -0,0 +1,194 @@
+;;; gle-mode.el --- major mode for editing .gle files
+
+ ;; Installation:
+ ;; Put this file somewhere in your load-path (e.g. /usr/share/emacs/site-lisp)
+ ;; Add the following to your ~/.emacs file:
+ ;; (autoload 'gle-mode "gle-mode")
+ ;; (add-to-list 'auto-mode-alist '("\\.gle\\'" . gle-mode))
+ ;; gle-mode will now be called whenever a .gle file is opened, or by executing
+ ;; M-x gle-mode
+
+ ;; Copyright:
+ ;; This file is free software; you can redistribute it and/or modify
+ ;; it under the terms of the GNU General Public License as published by
+ ;; the Free Software Foundation; either version 2, or (at your option)
+ ;; any later version.
+
+ ;; This file is distributed in the hope that it will be useful,
+ ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+ ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ ;; GNU General Public License for more details.
+
+ ;; You should have received a copy of the GNU General Public License
+ ;; along with GNU Emacs; see the file COPYING. If not, write to
+ ;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ ;; Boston, MA 02111-1307, USA.
+
+ ;; To done (a.k.a. Version History):
+ ;; 0.2.1: Then "adapted" it some more so that it worked!
+ ;; 0.2.0: Shamelessly "adapted" some of Kai Nordlund's code to allow Emacs
+ ;; to call GLE inline :-)
+ ;; 0.1.5: Regexps cleaned up after suggestions by Stefan Monnier, also
+ ;; Installation instructions trimmed a little.
+ ;; 0.1.0: First ever public version! God it's ugly :-(
+
+ ;; To do:
+ ;; Some more regexps to tidy
+ ;; Create some automatic indentification
+
+(require 'lmenu)
+
+ ;; Begin gle-mode
+(defvar gle-mode-syntax-table
+ (let ((st (make-syntax-table)))
+ (modify-syntax-entry ?! "<" st)
+ (modify-syntax-entry ?\n ">" st)
+ st)
+ "Syntax table for `gle-mode'.")
+
+(defvar gle-font-lock-keywords
+ `((,(concat "\\<"
+ (regexp-opt '("begin" "start" "both" "end" "define" "for" "to" "next" "if" "then" "else" "include" "postscript" "bigfile" "data" "fullsize" "let" "set") t)
+ "\\>") (0 font-lock-keyword-face))
+ (,(concat "\\<"
+ (regexp-opt '("sub") t)
+ "\\>") (0 font-lock-function-name-face))
+ (,(concat "\\<"
+ (regexp-opt '("aline" "rline" "line" "amove" "rmove" "arc" "arcto" "bezier" "circle" "closepath" "curve" "ellipse" "ellipse_arc" "ellipse_narc" "grestore" "gsave" "join" "rbezier" "reverse" "save" "text" "write" "bar" "size" "title" "xaxis" "yaxis" "x2axis" "y2axis" "hscale" "vscale" "xlabels" "ylabels" "x2labels" "y2labels" "xnames" "ynames" "x2names" "y2names" "xplaces" "yplaces" "x2places" "y2places" "xside" "yside" "x2side" "y2side" "xticks" "yticks" "xsubticks" "ysubticks" " [...]
+ "\\>") (0 font-lock-constant-face))
+ (,(concat "\\<"
+ (regexp-opt '("width" "err" "herr" "errwidth" "herrwidth" "errup" "herrup" "errdown" "herrdown" "hei" "color" "dashlen" "font" "fontlwidth" "just" "add" "nobox" "name" "arrow" "stroke" "fill" "justify" "cap" "lstyle" "lwidth" "from" "dist" "key" "xmin" "ymin" "xmax" "ymax" "nomiss" "smooth" "smoothm" "dsubticks" "dpoints" "nticks" "dticks" "font" "shift" "offset" "position" "marker" "msize" "mscale" "ignore") t)
+ "\\>") (0 font-lock-variable-name-face))
+ (,(concat "\\<"
+ (regexp-opt '("box" "clip" "origin" "path" "marker" "rotate" "scale" "table" "text" "translate") t)
+ "\\>") (0 font-lock-string-face))
+ (,(concat "\\<"
+ (regexp-opt '("butt" "round" "square" "mitre" "bevel" "left" "center" "right" "[tcblr]{2}" "on" "off" "grid" "log" "nofirst" "nolast") t)
+ "\\>") (0 font-lock-builtin-face))
+ (,(concat "\\<"
+ (regexp-opt '("time\\$" "date\\$") t)
+ "\\>") (0 font-lock-string-face))
+ ("\\s *@\\w+" (0 font-lock-function-name-face))
+ ("\\b\\(left\\$\\)\\s *(" (1 font-lock-string-face))
+ ("\\b\\(right\\$\\)\\s *(" (1 font-lock-string-face))
+ ("\\b\\(seg\\$\\)\\s *(" (1 font-lock-string-face))
+ ("\\b\\(num1?\\$\\)\\s *(" (1 font-lock-string-face))
+ ("\\b\\(val\\)\\s *(" (1 font-lock-string-face))
+ ("\\b\\(pos\\)\\s *(" (1 font-lock-string-face))
+ ("\\b\\(len\\)\\s *(" (1 font-lock-string-face))
+ ("\\b\\(abs\\)\\s *(" (1 font-lock-function-name-face))
+ ("\\b\\(a?cosh\\)\\s *(" (1 font-lock-function-name-face))
+ ("\\b\\(cos\\)\\s *(" (1 font-lock-function-name-face))
+ ("\\b\\(a?coth?\\)\\s *(" (1 font-lock-function-name-face))
+ ("\\b\\(a?csch?\\)\\s *(" (1 font-lock-function-name-face))
+ ("\\b\\(a?sech?\\)\\s *(" (1 font-lock-function-name-face))
+ ("\\b\\(a?sinh\\)\\s *(" (1 font-lock-function-name-face))
+ ("\\b\\(sin\\)\\s *(" (1 font-lock-function-name-face))
+ ("\\b\\(atn\\)\\s *(" (1 font-lock-function-name-face))
+ ("\\b\\(a?tanh\\)\\s *(" (1 font-lock-function-name-face))
+ ("\\b\\(tan\\)\\s *(" (1 font-lock-function-name-face))
+ ("\\b\\(exp\\)\\s *(" (1 font-lock-function-name-face))
+ ("\\b\\(fix\\)\\s *(" (1 font-lock-function-name-face))
+ ("\\b\\(int\\)\\s *(" (1 font-lock-function-name-face))
+ ("\\b\\(log\\)\\s *(" (1 font-lock-function-name-face))
+ ("\\b\\(log10\\)\\s *(" (1 font-lock-function-name-face))
+ ("\\b\\(sgn\\)\\s *(" (1 font-lock-function-name-face))
+ ("\\b\\(sqrt?\\)\\s *(" (1 font-lock-function-name-face))
+ ("\\b\\(todeg\\)\\s *(" (1 font-lock-function-name-face))
+ ("\\b\\(torad\\)\\s *(" (1 font-lock-function-name-face))
+ ("\\b\\(not\\)\\s *(" (1 font-lock-function-name-face))
+ ("\\b\\(rnd\\)\\s *(" (1 font-lock-function-name-face))
+ ("\\b\\([xy]end\\)\\s *(\\s *)" (1 font-lock-function-name-face))
+ ("\\b\\([xy]pos\\)\\s *(\\s *)" (1 font-lock-function-name-face))
+ ("\\b\\([xy]g\\)\\s *(" (1 font-lock-function-name-face))
+ ("\\b\\(twidth\\)\\s *(" (1 font-lock-function-name-face))
+ ("\\b\\(theight\\)\\s *(" (1 font-lock-function-name-face))
+ ("\\b\\(tdepth\\)\\s *(" (1 font-lock-function-name-face))
+ )
+ "Keyword highlighting specification for `gle-mode'.")
+
+
+(defun gle-create-postscript ()
+ "Creates eps file from current gle file"
+ (interactive)
+ (save-buffer)
+ (let ((file (file-name-nondirectory buffer-file-name)))
+ (shell-command (concat "gle -d eps " file )))
+)
+
+(defun gle-view-postscript ()
+ "Create and view Postscript from current gle file"
+ (interactive)
+ (save-buffer)
+ (let ((file (file-name-nondirectory buffer-file-name)))
+ (shell-command (concat "gle -d eps " file )))
+ (shell-command (concat "gv " (file-name-sans-extension (buffer-file-name)) ".eps" ))
+ (delete-file (concat (file-name-sans-extension (buffer-file-name)) ".eps"))
+)
+
+(defun gle-view-png ()
+ (interactive)
+ (save-buffer)
+ (let ((file (file-name-nondirectory buffer-file-name)))
+ (shell-command (concat "gle -d eps " file )))
+ (shell-command "convert emacsgle.eps emacsgle.png")
+ (shell-command "xv emacsgle.png")
+ (shell-command "rm emacsgle.eps emacsgle.png")
+)
+
+(defun gle-write-standard-graph ()
+ "Command writes out gle commands for drawing a simple graph"
+ (interactive)
+ (insert "size 26 19\n")
+ (insert "set lwidth 0.06\nset hei 0.5\nset font psh\n")
+ (insert "begin graph\n nobox\n")
+ (insert " \n")
+ (insert " data file.gle d1\n")
+ (insert " \n")
+ (insert " d1 marker dot msize 0.7\n")
+ (insert " d1 line lstyle 1 key \"\"\n")
+ (insert " \n")
+ (insert " key hei 0.6 nobox\n")
+ (insert " \n")
+ (insert " !yaxis min 0 max 10 ! log\n")
+ (insert " !xaxis min 0 max 10 ! log\n")
+ (insert " \n")
+ (insert " xtitle \"\" dist 0.3 hei 0.6\n")
+ (insert " ytitle \"\" dist 0.3 hei 0.6\n")
+ (insert " ! x2title \"\"\n")
+ (insert " \n")
+ (insert "end graph\n")
+
+)
+
+(define-derived-mode gle-mode fundamental-mode "GLE"
+ "A major mode for editing .gle files."
+ (set (make-local-variable 'comment-start) "! ")
+ (set (make-local-variable 'comment-start-skip) "!+\\s-*")
+ (set (make-local-variable 'font-lock-defaults)
+ '(gle-font-lock-keywords))
+ (run-hooks 'gle-mode-hook)
+ )
+
+(define-key gle-mode-map [menu-bar gle-mode]
+ (cons "GLE" (make-sparse-keymap "GLE")))
+(define-key gle-mode-map [menu-bar gle-mode gle-write-standard-graph]
+ '("Write graph" . gle-write-standard-graph))
+(define-key gle-mode-map [menu-bar gle-mode separator-gle-mode-2]
+ '("--------------------"))
+(define-key gle-mode-map [menu-bar gle-mode gle-create-postscript]
+ '("Create ps file" . gle-create-postscript))
+(define-key gle-mode-map [menu-bar gle-mode separator-gle-mode-1]
+ '("--------------------"))
+(define-key gle-mode-map [menu-bar gle-mode gle-view-png]
+ '("View png file" . gle-view-png))
+(define-key gle-mode-map [menu-bar gle-mode gle-view-postscript]
+ '("View ps file" . gle-view-postscript))
+
+(define-key gle-mode-map "\C-c\C-p" 'gle-create-postscript)
+(define-key gle-mode-map "\C-c\C-v" 'gle-view-postscript)
+(define-key gle-mode-map "\C-c\C-x" 'gle-view-x)
+(define-key gle-mode-map "\C-c\C-b" 'gle-write-basic-commands)
+
+(provide 'gle-mode)
+ ;; End gle-mode
diff --git a/contrib/editors/highlighting/gle.nedit b/contrib/editors/highlighting/gle.nedit
new file mode 100644
index 0000000..c4182bf
--- /dev/null
+++ b/contrib/editors/highlighting/gle.nedit
@@ -0,0 +1,64 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!
+! Syntax highlighting patterns for GLE <http://glx.sourceforge.net>
+! "The graphics language for creating complex diagrams from simple scripts"
+!
+! INSTALLATION
+!
+! Load this pattern by starting nedit with:
+!
+! nedit -import gle.nedit
+!
+! Then, check that the patterns were loaded correctly, and choose Save Defaults
+! from the Preferences menu. The new patterns will now be incorporated into
+! your own .nedit file, so the next time you start NEdit, you will no longer
+! need to use -import.
+!
+! This file is maintained by: Jan Struyf <jan.struyf at cs.kuleuven.ac.be>
+!
+! These comments will not appear in your ~/.nedit
+!
+nedit.highlightPatterns: GLE:1:0{\n\
+ Linecomment:"!":"$"::Comment::\n\
+ String:"""":""""::String::\n\
+ Keywords:"<(?:add|arc|arcto|[ar]line|[ar]move|arrow|bar|begin|bevel|bezier|bigfile|both|box|butt|cap|center|circle|clip|closepath|color|command|curve|dashlen|data|define|dist|dpoints|dsubticks|dticks|ellipse|elliptical_arc|elliptical_narc|else|end|err|errdown|errright|errup|errwidth|fill|font|fontlwidth|for|from|fullsize|graph|grestore|grid|gsave|hei|herr|herrleft|herrwidth|hscale|if|include|join|just|justify|key|left|let|line|log|lstyle|lwidth|marker|max|mdata|min|mitre|msize|name|nar [...]
+ Keywords:"<(?:d[0-9]+)>":::Storage Type::\n\
+ Float:"<(\\d)*\\.?(\\d)*(\\d[eE][+-]?\\d+)?>":::Numeric Const::\n\
+ }
+nedit.languageModes: GLE:.gle::Auto:::3:
diff --git a/contrib/editors/highlighting/gle.stx b/contrib/editors/highlighting/gle.stx
new file mode 100644
index 0000000..d68cb98
--- /dev/null
+++ b/contrib/editors/highlighting/gle.stx
@@ -0,0 +1,353 @@
+#TITLE=GLE
+;
+;
+; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+; ! !
+; ! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+; ! !
+; ! Modified BSD License !
+; ! !
+; ! Copyright (C) 2009 GLE. !
+; ! !
+; ! Redistribution and use in source and binary forms, with or without !
+; ! modification, are permitted provided that the following conditions !
+; ! are met: !
+; ! !
+; ! 1. Redistributions of source code must retain the above copyright !
+; ! notice, this list of conditions and the following disclaimer. !
+; ! !
+; ! 2. Redistributions in binary form must reproduce the above !
+; ! copyright notice, this list of conditions and the following !
+; ! disclaimer in the documentation and/or other materials provided with !
+; ! the distribution. !
+; ! !
+; ! 3. The name of the author may not be used to endorse or promote !
+; ! products derived from this software without specific prior written !
+; ! permission. !
+; ! !
+; ! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+; ! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+; ! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+; ! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+; ! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+; ! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+; ! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+; ! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+; ! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+; ! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+; ! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+; ! !
+; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+;
+; This file is provided as a default syntax file for gle
+; origninated by Vincent LaBella -- feel free to modify
+; but notify me if you do vlabella at comp.uark.edu
+;
+#DELIMITER=,(){}[]-+*%/="'~!&|\<>?:;.
+#QUOTATION1='
+#QUOTATION2="
+#CONTINUE_QUOTE=n
+#LINECOMMENT=!
+#LINECOMMENT2=
+#COMMENTON=
+#COMMENTOFF=
+#COMMENTON2=
+#COMMENTOFF2=
+#ESCAPE=\
+#CASE=
+#PREFIX1=
+#PREFIX2=
+#PREFIX3=
+#PREFIX4=
+#PREFIX5=
+#SUFFIX1=
+#SUFFIX2=
+#SUFFIX3=
+#SUFFIX4=
+#SUFFIX5=
+; Reserved words
+#KEYWORD=reserved words
+;graph commands
+add
+aline
+amove
+arc
+arcto
+arrow both
+arrow end
+arrow start
+bar
+begin
+bevel
+bezier
+bigfile
+bigfile
+box
+butt
+cap
+center
+circle
+clip
+closepath
+color
+color col
+command
+curve
+dashlen
+data
+define
+dist
+dpoints
+dsubticks
+dticks
+ellipse
+elliptical_arc
+elliptical_narc
+else
+end if
+err
+errdown
+errright
+errup
+errwidth
+fill
+fill
+font
+font
+fontlwidth
+for
+from
+fullsize
+grestore
+grid
+gsave
+hei
+herr
+herrleft
+herrwidth
+hscale
+if
+include
+join
+just
+justify
+left
+let
+line
+log
+lstyle
+lstyle
+lwidth
+lwidth
+marker
+marker
+max
+mdata
+min
+mitre
+msize
+name
+narc
+next
+nobox
+nobox
+nofirst
+nolast
+nomiss
+nticks
+off
+offset
+origin
+path
+pos
+postscript
+psbbtweak
+pscomment
+rad
+radius
+rbezier
+return
+reverse
+right
+rline
+rmove
+rotate
+round
+save
+scale
+sep
+set
+shift
+size
+smooth
+smoothm
+square
+step
+step
+stroke
+svg_smooth
+table
+text
+then
+tiff
+title
+tl
+to
+to
+translate
+vscale
+width
+width
+write
+xg
+xmax
+xmin
+xpos
+yg
+ymax
+ymin
+ypos
+d1
+d2
+d3
+d4
+d5
+d6
+d7
+d8
+d9
+d10
+d11
+d12
+d13
+d14
+d15
+d16
+d17
+d18
+d19
+d20
+d21
+d22
+d23
+d24
+d25
+d26
+d27
+d28
+d29
+d30
+d31
+d32
+d33
+d34
+d35
+d36
+d37
+d38
+d39
+d40
+d41
+d42
+d43
+d44
+d45
+d46
+d47
+d48
+d49
+d50
+d51
+d52
+d53
+d54
+d55
+d56
+d57
+d58
+d59
+d60
+d61
+d62
+d63
+d64
+d65
+d66
+d67
+d68
+d69
+d70
+d71
+d72
+d73
+d74
+d75
+d76
+d77
+d78
+d79
+d80
+d81
+d82
+d83
+d84
+d85
+d86
+d87
+d88
+d89
+d90
+d91
+d92
+d93
+d94
+d95
+d96
+d97
+d98
+d99
+
+#KEYWORD=xaxis commands
+xaxis
+xlabels
+xnames
+xplaces
+xside
+xsubticks
+xticks
+xtitle
+
+#KEYWORD=x2 axis commands
+x2axis
+x2labels
+x2names
+x2places
+x2side
+x2subticks
+x2ticks
+x2title
+
+#KEYWORD=yaxis commands
+yaxis
+ylabels
+ynames
+yplaces
+yside
+ysubticks
+yticks
+ytitle
+
+#KEYWORD=y2axis commands
+graph
+key
+rotate
+sub
+y2axis
+y2labels
+y2names
+y2places
+y2side
+y2subticks
+y2ticks
+y2title
+
diff --git a/contrib/editors/highlighting/vim/ftplugin/gle.vim b/contrib/editors/highlighting/vim/ftplugin/gle.vim
new file mode 100755
index 0000000..1c3dca0
--- /dev/null
+++ b/contrib/editors/highlighting/vim/ftplugin/gle.vim
@@ -0,0 +1,6 @@
+" TITLE=GLE
+"
+" File type plugin for GLE: handles % matching with
+" matchit.vim
+
+let b:match_words = '\<begin \([A-Za-z]\+\)\>:\<end \1\>,\<gsave\>:\<grestore\>'
diff --git a/contrib/editors/highlighting/vim/indent/gle.vim b/contrib/editors/highlighting/vim/indent/gle.vim
new file mode 100755
index 0000000..053af5a
--- /dev/null
+++ b/contrib/editors/highlighting/vim/indent/gle.vim
@@ -0,0 +1,35 @@
+setlocal indentexpr=GetGLEIndent()
+setlocal nolisp
+setlocal smartindent
+setlocal autoindent
+setlocal indentkeys+=end
+
+if exists("*GetGLEIndent") | finish
+endif
+
+function GetGLEIndent()
+
+ " Find a non-blank line above the current line.
+ let lnum = prevnonblank(v:lnum - 1)
+
+ " At the start of the file use zero indent.
+ if lnum == 0 | return 0
+ endif
+
+ let ind = indent(lnum)
+ let line = getline(lnum) " last line
+ let cline = getline(v:lnum) " current line
+
+
+ " Add a 'shiftwidth' after beginning of environments.
+ if line =~ 'begin \(.*\)'
+ let ind = ind + &sw
+ endif
+
+ " Subtract a 'shiftwidth' when an environment ends
+ if cline =~ '\s*end '
+ let ind = ind - &sw
+ endif
+ return ind
+endfunction
+
diff --git a/contrib/editors/highlighting/vim/syntax/gle.vim b/contrib/editors/highlighting/vim/syntax/gle.vim
new file mode 100755
index 0000000..dbc253e
--- /dev/null
+++ b/contrib/editors/highlighting/vim/syntax/gle.vim
@@ -0,0 +1,46 @@
+"TITLE=GLE
+"
+" This file is provided as a default syntax file for gle
+
+syntax clear
+syntax case ignore
+
+"#DELIMITER=,(){}[]-+*%/="'~!&|\<>?:;.
+"#QUOTATION1='
+"#QUOTATION2="
+"#CONTINUE_QUOTE=n
+"#LINECOMMENT=!
+"#ESCAPE=\
+"#KEYWORD=reserved words
+"syn keyword gleText text contained
+"syn match gleString /text .*/ms=s+5 contains=gleText
+syn region gleString matchgroup=gleText start="text " end="$" keepend
+"contains=Text
+"/^[ \t]*text .*/ms=s+5
+syn match Comment /!.*/
+syn keyword gleStatement add aline amove arc arcto asetpos arrow both arrow end arrow start bar begin bevel
+syn keyword gleStatement bezier bigfile bigfile box butt cap center circle clip closepath color color
+syn keyword gleStatement col command curve dashlen data define dist dpoints dsubticks dticks ellipse
+syn keyword gleStatement elliptical_arc elliptical_narc else end if err errdown errright errup errwidth
+syn keyword gleStatement fill fill font font fontlwidth for from fullsize grestore grid gsave hei
+syn keyword gleStatement herr herrleft herrwidth hscale if include join just justify left let line
+syn keyword gleStatement log lstyle lstyle lwidth lwidth marker marker max mdata min mitre msize
+syn keyword gleStatement name narc next nobox nobox nofirst nolast nomiss nticks off offset origin
+syn keyword gleStatement path pos postscript psbbtweak pscomment rad radius rbezier restoredefaults return reverse
+syn keyword gleStatement right rline rmove rotate round save scale sep set shift size smooth
+syn keyword gleStatement smoothm square step step stroke svg_smooth table then tiff title tl
+syn keyword gleStatement to to translate vscale width width write xg xmax xmin xpos yg ymax ymin
+syn keyword gleStatement ypos d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d12 d13 d14 d15 d16 d17 d18 d19
+syn keyword gleStatement d20 d21 d22 d23 d24 d25 d26 d27 d28 d29 d30 d31 d32 d33 d34 d35 d36 d37
+syn keyword gleStatement d38 d39 d40 d41 d42 d43 d44 d45 d46 d47 d48 d49 d50 d51 d52 d53 d54 d55
+syn keyword gleStatement d56 d57 d58 d59 d60 d61 d62 d63 d64 d65 d66 d67 d68 d69 d70 d71 d72 d73
+syn keyword gleStatement d74 d75 d76 d77 d78 d79 d80 d81 d82 d83 d84 d85 d86 d87 d88 d89 d90 d91
+syn keyword gleStatement d92 d93 d94 d95 d96 d97 d98 d99 xaxis xlabels xnames xplaces xside
+syn keyword gleStatement xsubticks xticks xtitle x2axis x2labels x2names x2places x2side x2subticks
+syn keyword gleStatement x2ticks x2title yaxis ylabels ynames yplaces yside ysubticks yticks ytitle
+syn keyword gleStatement graph key rotate sub y2axis y2labels y2names y2places y2side y2subticks
+syn keyword gleStatement y2ticks y2title
+
+hi link gleStatement Statement
+hi link gleString String
+hi link gleText Statement
diff --git a/contrib/packagers/nsis/AddToPath.nsi b/contrib/packagers/nsis/AddToPath.nsi
new file mode 100644
index 0000000..65a0279
--- /dev/null
+++ b/contrib/packagers/nsis/AddToPath.nsi
@@ -0,0 +1,446 @@
+!ifndef _AddToPath_nsh
+!define _AddToPath_nsh
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; ;;
+;; * All NSIS source code, plug-ins, documentation, examples, header files and graphics, ;;
+;; with the exception of the compression modules and where otherwise noted, are licensed ;;
+;; under the zlib/libpng license. ;;
+;; ;;
+;; ZLIB/LIBPNG LICENSE ;;
+;; ------------------- ;;
+;; ;;
+;; This software is provided 'as-is', without any express or implied warranty. In no ;;
+;; event will the authors be held liable for any damages arising from the use of this ;;
+;; software. ;;
+;; ;;
+;; Permission is granted to anyone to use this software for any purpose, including ;;
+;; commercial applications, and to alter it and redistribute it freely, subject to the ;;
+;; following restrictions: ;;
+;; ;;
+;; 1. The origin of this software must not be misrepresented; you must not claim that you ;;
+;; wrote the original software. If you use this software in a product, an acknowledgment ;;
+;; in the product documentation would be appreciated but is not required. ;;
+;; ;;
+;; 2. Altered source versions must be plainly marked as such, and must not be ;;
+;; misrepresented as being the original software. ;;
+;; ;;
+;; 3. This notice may not be removed or altered from any source distribution. ;;
+;; ;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+!verbose 3
+!include "WinMessages.NSH"
+!verbose 4
+
+!ifndef WriteEnvStr_RegKey
+ !ifdef ALL_USERS
+ !define WriteEnvStr_RegKey \
+ 'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"'
+ !else
+ !define WriteEnvStr_RegKey 'HKCU "Environment"'
+ !endif
+!endif
+
+; AddToPath - Adds the given dir to the search path.
+; Input - head of the stack
+; Note - Win9x systems requires reboot
+
+Function AddToPath
+ Exch $0
+ Push $1
+ Push $2
+ Push $3
+
+ # don't add if the path doesn't exist
+ IfFileExists "$0\*.*" "" AddToPath_done
+
+ ReadEnvStr $1 PATH
+ Push "$1;"
+ Push "$0;"
+ Call StrStr
+ Pop $2
+ StrCmp $2 "" "" AddToPath_done
+ Push "$1;"
+ Push "$0\;"
+ Call StrStr
+ Pop $2
+ StrCmp $2 "" "" AddToPath_done
+ GetFullPathName /SHORT $3 $0
+ Push "$1;"
+ Push "$3;"
+ Call StrStr
+ Pop $2
+ StrCmp $2 "" "" AddToPath_done
+ Push "$1;"
+ Push "$3\;"
+ Call StrStr
+ Pop $2
+ StrCmp $2 "" "" AddToPath_done
+
+ Call IsNT
+ Pop $1
+ StrCmp $1 1 AddToPath_NT
+ ; Not on NT
+ StrCpy $1 $WINDIR 2
+ FileOpen $1 "$1\autoexec.bat" a
+ FileSeek $1 -1 END
+ FileReadByte $1 $2
+ IntCmp $2 26 0 +2 +2 # DOS EOF
+ FileSeek $1 -1 END # write over EOF
+ FileWrite $1 "$\r$\nSET PATH=%PATH%;$3$\r$\n"
+ FileClose $1
+ SetRebootFlag true
+ Goto AddToPath_done
+
+ AddToPath_NT:
+ ReadRegStr $1 ${WriteEnvStr_RegKey} "PATH"
+ StrCpy $2 $1 1 -1 # copy last char
+ StrCmp $2 ";" 0 +2 # if last char == ;
+ StrCpy $1 $1 -1 # remove last char
+ StrCmp $1 "" AddToPath_NTdoIt
+ StrCpy $0 "$1;$0"
+ AddToPath_NTdoIt:
+ WriteRegExpandStr ${WriteEnvStr_RegKey} "PATH" $0
+ SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000
+
+ AddToPath_done:
+ Pop $3
+ Pop $2
+ Pop $1
+ Pop $0
+FunctionEnd
+
+; RemoveFromPath - Remove a given dir from the path
+; Input: head of the stack
+
+Function un.RemoveFromPath
+ Exch $0
+ Push $1
+ Push $2
+ Push $3
+ Push $4
+ Push $5
+ Push $6
+
+ IntFmt $6 "%c" 26 # DOS EOF
+
+ Call un.IsNT
+ Pop $1
+ StrCmp $1 1 unRemoveFromPath_NT
+ ; Not on NT
+ StrCpy $1 $WINDIR 2
+ FileOpen $1 "$1\autoexec.bat" r
+ GetTempFileName $4
+ FileOpen $2 $4 w
+ GetFullPathName /SHORT $0 $0
+ StrCpy $0 "SET PATH=%PATH%;$0"
+ Goto unRemoveFromPath_dosLoop
+
+ unRemoveFromPath_dosLoop:
+ FileRead $1 $3
+ StrCpy $5 $3 1 -1 # read last char
+ StrCmp $5 $6 0 +2 # if DOS EOF
+ StrCpy $3 $3 -1 # remove DOS EOF so we can compare
+ StrCmp $3 "$0$\r$\n" unRemoveFromPath_dosLoopRemoveLine
+ StrCmp $3 "$0$\n" unRemoveFromPath_dosLoopRemoveLine
+ StrCmp $3 "$0" unRemoveFromPath_dosLoopRemoveLine
+ StrCmp $3 "" unRemoveFromPath_dosLoopEnd
+ FileWrite $2 $3
+ Goto unRemoveFromPath_dosLoop
+ unRemoveFromPath_dosLoopRemoveLine:
+ SetRebootFlag true
+ Goto unRemoveFromPath_dosLoop
+
+ unRemoveFromPath_dosLoopEnd:
+ FileClose $2
+ FileClose $1
+ StrCpy $1 $WINDIR 2
+ Delete "$1\autoexec.bat"
+ CopyFiles /SILENT $4 "$1\autoexec.bat"
+ Delete $4
+ Goto unRemoveFromPath_done
+
+ unRemoveFromPath_NT:
+ ReadRegStr $1 ${WriteEnvStr_RegKey} "PATH"
+ StrCpy $5 $1 1 -1 # copy last char
+ StrCmp $5 ";" +2 # if last char != ;
+ StrCpy $1 "$1;" # append ;
+ Push $1
+ Push "$0;"
+ Call un.StrStr ; Find `$0;` in $1
+ Pop $2 ; pos of our dir
+ StrCmp $2 "" unRemoveFromPath_done
+ ; else, it is in path
+ # $0 - path to add
+ # $1 - path var
+ StrLen $3 "$0;"
+ StrLen $4 $2
+ StrCpy $5 $1 -$4 # $5 is now the part before the path to remove
+ StrCpy $6 $2 "" $3 # $6 is now the part after the path to remove
+ StrCpy $3 $5$6
+
+ StrCpy $5 $3 1 -1 # copy last char
+ StrCmp $5 ";" 0 +2 # if last char == ;
+ StrCpy $3 $3 -1 # remove last char
+
+ WriteRegExpandStr ${WriteEnvStr_RegKey} "PATH" $3
+ SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000
+
+ unRemoveFromPath_done:
+ Pop $6
+ Pop $5
+ Pop $4
+ Pop $3
+ Pop $2
+ Pop $1
+ Pop $0
+FunctionEnd
+
+
+
+; AddToEnvVar - Adds the given value to the given environment var
+; Input - head of the stack $0 environement variable $1=value to add
+; Note - Win9x systems requires reboot
+
+Function AddToEnvVar
+
+ Exch $1 ; $1 has environment variable value
+ Exch
+ Exch $0 ; $0 has environment variable name
+
+ DetailPrint "Adding $1 to $0"
+ Push $2
+ Push $3
+ Push $4
+
+
+ ReadEnvStr $2 $0
+ Push "$2;"
+ Push "$1;"
+ Call StrStr
+ Pop $3
+ StrCmp $3 "" "" AddToEnvVar_done
+
+ Push "$2;"
+ Push "$1\;"
+ Call StrStr
+ Pop $3
+ StrCmp $3 "" "" AddToEnvVar_done
+
+
+ Call IsNT
+ Pop $2
+ StrCmp $2 1 AddToEnvVar_NT
+ ; Not on NT
+ StrCpy $2 $WINDIR 2
+ FileOpen $2 "$2\autoexec.bat" a
+ FileSeek $2 -1 END
+ FileReadByte $2 $3
+ IntCmp $3 26 0 +2 +2 # DOS EOF
+ FileSeek $2 -1 END # write over EOF
+ FileWrite $2 "$\r$\nSET $0=%$0%;$4$\r$\n"
+ FileClose $2
+ SetRebootFlag true
+ Goto AddToEnvVar_done
+
+ AddToEnvVar_NT:
+ ReadRegStr $2 ${WriteEnvStr_RegKey} $0
+ StrCpy $3 $2 1 -1 # copy last char
+ StrCmp $3 ";" 0 +2 # if last char == ;
+ StrCpy $2 $2 -1 # remove last char
+ StrCmp $2 "" AddToEnvVar_NTdoIt
+ StrCpy $1 "$2;$1"
+ AddToEnvVar_NTdoIt:
+ WriteRegExpandStr ${WriteEnvStr_RegKey} $0 $1
+ SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000
+
+ AddToEnvVar_done:
+ Pop $4
+ Pop $3
+ Pop $2
+ Pop $1
+ Pop $0
+
+FunctionEnd
+
+; RemoveFromEnvVar - Remove a given value from a environment var
+; Input: head of the stack
+
+Function un.RemoveFromEnvVar
+
+ Exch $1 ; $1 has environment variable value
+ Exch
+ Exch $0 ; $0 has environment variable name
+
+ DetailPrint "Removing $1 from $0"
+ Push $2
+ Push $3
+ Push $4
+ Push $5
+ Push $6
+ Push $7
+
+ IntFmt $7 "%c" 26 # DOS EOF
+
+ Call un.IsNT
+ Pop $2
+ StrCmp $2 1 unRemoveFromEnvVar_NT
+ ; Not on NT
+ StrCpy $2 $WINDIR 2
+ FileOpen $2 "$2\autoexec.bat" r
+ GetTempFileName $5
+ FileOpen $3 $5 w
+ GetFullPathName /SHORT $1 $1
+ StrCpy $1 "SET $0=%$0%;$1"
+ Goto unRemoveFromEnvVar_dosLoop
+
+ unRemoveFromEnvVar_dosLoop:
+ FileRead $2 $4
+ StrCpy $6 $4 1 -1 # read last char
+ StrCmp $6 $7 0 +2 # if DOS EOF
+ StrCpy $4 $4 -1 # remove DOS EOF so we can compare
+ StrCmp $4 "$1$\r$\n" unRemoveFromEnvVar_dosLoopRemoveLine
+ StrCmp $4 "$1$\n" unRemoveFromEnvVar_dosLoopRemoveLine
+ StrCmp $4 "$1" unRemoveFromEnvVar_dosLoopRemoveLine
+ StrCmp $4 "" unRemoveFromEnvVar_dosLoopEnd
+ FileWrite $3 $4
+ Goto unRemoveFromEnvVar_dosLoop
+ unRemoveFromEnvVar_dosLoopRemoveLine:
+ SetRebootFlag true
+ Goto unRemoveFromEnvVar_dosLoop
+
+ unRemoveFromEnvVar_dosLoopEnd:
+ FileClose $3
+ FileClose $2
+ StrCpy $2 $WINDIR 2
+ Delete "$2\autoexec.bat"
+ CopyFiles /SILENT $5 "$2\autoexec.bat"
+ Delete $5
+ Goto unRemoveFromEnvVar_done
+
+ unRemoveFromEnvVar_NT:
+ ReadRegStr $2 ${WriteEnvStr_RegKey} $0
+ StrCpy $6 $2 1 -1 # copy last char
+ StrCmp $6 ";" +2 # if last char != ;
+ StrCpy $2 "$2;" # append ;
+ Push $2
+ Push "$1;"
+ Call un.StrStr ; Find `$1;` in $2
+ Pop $3 ; pos of our dir
+ StrCmp $3 "" unRemoveFromEnvVar_done
+ ; else, it is in path
+ # $1 - path to add
+ # $2 - path var
+ StrLen $4 "$1;"
+ StrLen $5 $3
+ StrCpy $6 $2 -$5 # $6 is now the part before the path to remove
+ StrCpy $7 $3 "" $4 # $7 is now the part after the path to remove
+ StrCpy $4 $6$7
+
+ StrCpy $6 $4 1 -1 # copy last char
+ StrCmp $6 ";" 0 +2 # if last char == ;
+ StrCpy $4 $4 -1 # remove last char
+
+ WriteRegExpandStr ${WriteEnvStr_RegKey} $0 $4
+ SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000
+
+ unRemoveFromEnvVar_done:
+ Pop $7
+ Pop $6
+ Pop $5
+ Pop $4
+ Pop $3
+ Pop $2
+ Pop $1
+ Pop $0
+FunctionEnd
+
+
+
+
+!ifndef IsNT_KiCHiK
+!define IsNT_KiCHiK
+
+###########################################
+# Utility Functions #
+###########################################
+
+; IsNT
+; no input
+; output, top of the stack = 1 if NT or 0 if not
+;
+; Usage:
+; Call IsNT
+; Pop $R0
+; ($R0 at this point is 1 or 0)
+
+!macro IsNT un
+Function ${un}IsNT
+ Push $0
+ ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" CurrentVersion
+ StrCmp $0 "" 0 IsNT_yes
+ ; we are not NT.
+ Pop $0
+ Push 0
+ Return
+
+ IsNT_yes:
+ ; NT!!!
+ Pop $0
+ Push 1
+FunctionEnd
+!macroend
+!insertmacro IsNT ""
+!insertmacro IsNT "un."
+
+!endif ; IsNT_KiCHiK
+
+; StrStr
+; input, top of stack = string to search for
+; top of stack-1 = string to search in
+; output, top of stack (replaces with the portion of the string remaining)
+; modifies no other variables.
+;
+; Usage:
+; Push "this is a long ass string"
+; Push "ass"
+; Call StrStr
+; Pop $R0
+; ($R0 at this point is "ass string")
+
+!macro StrStr un
+Function ${un}StrStr
+Exch $R1 ; st=haystack,old$R1, $R1=needle
+ Exch ; st=old$R1,haystack
+ Exch $R2 ; st=old$R1,old$R2, $R2=haystack
+ Push $R3
+ Push $R4
+ Push $R5
+ StrLen $R3 $R1
+ StrCpy $R4 0
+ ; $R1=needle
+ ; $R2=haystack
+ ; $R3=len(needle)
+ ; $R4=cnt
+ ; $R5=tmp
+ loop:
+ StrCpy $R5 $R2 $R3 $R4
+ StrCmp $R5 $R1 done
+ StrCmp $R5 "" done
+ IntOp $R4 $R4 + 1
+ Goto loop
+done:
+ StrCpy $R1 $R2 "" $R4
+ Pop $R5
+ Pop $R4
+ Pop $R3
+ Pop $R2
+ Exch $R1
+FunctionEnd
+!macroend
+!insertmacro StrStr ""
+!insertmacro StrStr "un."
+
+!endif ; _AddToPath_nsh
+
diff --git a/contrib/packagers/nsis/banner_image.bmp b/contrib/packagers/nsis/banner_image.bmp
new file mode 100644
index 0000000..6539145
Binary files /dev/null and b/contrib/packagers/nsis/banner_image.bmp differ
diff --git a/contrib/packagers/nsis/gle.nsi b/contrib/packagers/nsis/gle.nsi
new file mode 100644
index 0000000..e59ba7c
--- /dev/null
+++ b/contrib/packagers/nsis/gle.nsi
@@ -0,0 +1,247 @@
+; Script generated by the HM NIS Edit Script Wizard.
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; ;
+; GLE - Graphics Layout Engine <http://www.gle-graphics.org/> ;
+; ;
+; Modified BSD License ;
+; ;
+; Copyright (C) 2009 GLE. ;
+; ;
+; Redistribution and use in source and binary forms, with or without ;
+; modification, are permitted provided that the following conditions ;
+; are met: ;
+; ;
+; 1. Redistributions of source code must retain the above copyright ;
+; notice, this list of conditions and the following disclaimer. ;
+; ;
+; 2. Redistributions in binary form must reproduce the above ;
+; copyright notice, this list of conditions and the following ;
+; disclaimer in the documentation and/or other materials provided with ;
+; the distribution. ;
+; ;
+; 3. The name of the author may not be used to endorse or promote ;
+; products derived from this software without specific prior written ;
+; permission. ;
+; ;
+; THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR ;
+; IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED ;
+; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ;
+; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY ;
+; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ;
+; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE ;
+; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS ;
+; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER ;
+; IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR ;
+; OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;
+; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;
+; ;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+; HM NIS Edit Wizard helper defines
+!define PRODUCT_NAME "GLE"
+!define PRODUCT_VERSION "${GLE_VERSION}"
+!define PRODUCT_PUBLISHER "GLE"
+!define PRODUCT_WEB_SITE "http://www.gle-graphics.org/"
+!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\gle.exe"
+!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
+!define PRODUCT_UNINST_ROOT_KEY "HKLM"
+
+SetCompressor lzma
+
+; MUI 1.67 compatible ------
+!include "MUI.nsh"
+!include "AddToPath.nsi"
+
+; MUI Settings
+!define MUI_ABORTWARNING
+!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico"
+!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico"
+!define MUI_HEADERIMAGE
+!define MUI_HEADERIMAGE_RIGHT
+!define MUI_HEADERIMAGE_BITMAP "banner_image.bmp"
+!define MUI_HEADERIMAGE_BITMAP_NOSTRETCH
+!define MUI_WELCOMEFINISHPAGE_BITMAP_NOSTRETCH
+!define MUI_WELCOMEFINISHPAGE_BITMAP "welcome_image.bmp"
+
+; Welcome page
+!insertmacro MUI_PAGE_WELCOME
+; License page
+!insertmacro MUI_PAGE_LICENSE "..\..\..\LICENSE.txt"
+; Directory page
+!insertmacro MUI_PAGE_DIRECTORY
+; Instfiles page
+!insertmacro MUI_PAGE_INSTFILES
+; Finish page
+!define MUI_FINISHPAGE_SHOWREADME "$INSTDIR\readme-win32.txt"
+!insertmacro MUI_PAGE_FINISH
+
+; Uninstaller pages
+!insertmacro MUI_UNPAGE_INSTFILES
+
+; Language files
+!insertmacro MUI_LANGUAGE "English"
+
+; Reserve files
+!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS
+
+; MUI end ------
+
+Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
+OutFile "${OUTPUT_FILENAME}"
+InstallDir "$PROGRAMFILES\Gle4"
+InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" ""
+ShowInstDetails show
+ShowUnInstDetails show
+RequestExecutionLevel admin
+
+!define $GLEINST 0
+
+Section "MainSection" SEC01
+ SetShellVarContext all
+ ; Previous installation of GLE found?
+ ReadRegStr $0 HKLM "${PRODUCT_DIR_REGKEY}" ""
+ StrCmp $0 "" GLENotRegistered
+ CopyFiles /silent "$0/glerc" "$INSTDIR\glerc.old"
+ GLENotRegistered:
+ ; Is previous installation of GLE in same directory as currunt one?
+ Push 0
+ Pop $0
+ IfFileExists $INSTDIR\glerc 0 GLENotExists
+ IntOp $0 $0 + 1
+ ; Start with the installation
+ GLENotExists:
+ SetOutPath "$INSTDIR\bin"
+ SetOverwrite try
+ File "gle.exe.manifest"
+ File /oname=qgle.exe.manifest "gle.exe.manifest"
+ File /x gle-unit-test.exe "..\..\..\build\bin\*.*"
+ File "C:\cygwin\mingw\bin\mingwm10.dll"
+ File "C:\cygwin\mingw\bin\libgcc_s_dw2-1.dll"
+ File "C:\cygwin\mingw\bin\libstdc++-6.dll"
+ File "C:\Program Files\Debugging Tools for Windows (x86)\dbghelp.dll"
+ SetOutPath "$INSTDIR\font"
+ File /r "..\..\..\build\font\*.*"
+ SetOutPath "$INSTDIR\doc"
+ File "..\..\..\build\doc\*.*"
+ SetOutPath "$INSTDIR\gleinc"
+ File /r "..\..\..\build\gleinc\*.*"
+ SetOutPath "$INSTDIR\samples"
+ File "..\..\..\..\gle-www\examples\2dsimple\*.gle"
+ File "..\..\..\..\gle-www\examples\2dsimple\*.dat"
+ File "..\..\..\..\gle-www\examples\2dsimple\*.csv"
+ File "..\..\..\..\gle-www\examples\diagrams\shapes.gle"
+ File "..\..\..\src\samples\qgle_keyboard.gle"
+ SetOutPath "$INSTDIR"
+ File "..\..\..\build\glerc"
+ File "..\..\..\build\inittex.ini"
+ File "..\..\..\build\init.tex"
+ File "..\..\..\README*.*"
+ File "..\..\..\LICENSE*.*"
+ File "www.ico"
+ File /oname=readme-win32.txt "..\..\..\platform\readme.win32"
+ SetShellVarContext current
+ CreateDirectory "$DOCUMENTS\GLE"
+ CopyFiles "$INSTDIR\samples" "$DOCUMENTS\GLE\samples"
+ SetOutPath "$DOCUMENTS\GLE\samples"
+ CreateDirectory "$SMPROGRAMS\GLE"
+ CreateShortCut "$SMPROGRAMS\GLE\Command Prompt.lnk" "%SystemRoot%\system32\cmd.exe"
+ CreateShortCut "$SMPROGRAMS\GLE\GLE Previewer.lnk" "$INSTDIR\bin\qgle.exe"
+ SetShellVarContext all
+ SetOutPath "%SystemRoot%"
+ CreateDirectory "$SMPROGRAMS\GLE"
+ CreateShortCut "$SMPROGRAMS\GLE\Command Prompt.lnk" "%SystemRoot%\system32\cmd.exe"
+ CreateShortCut "$SMPROGRAMS\GLE\GLE Previewer.lnk" "$INSTDIR\bin\qgle.exe"
+ SetOutPath "$INSTDIR"
+ IntCmp $0 0 NotYetInst DoneIsInst DoneIsInst
+ NotYetInst:
+ Push "$INSTDIR\bin"
+ Call AddToPath
+ MessageBox MB_OK "The directory $INSTDIR\bin has been added to your system path."
+ DoneIsInst:
+ Exec "$INSTDIR\bin\qgle.exe -finddeps '$INSTDIR\glerc.old'"
+ !define Index "Line${__LINE__}"
+ ReadRegStr $1 HKCR ".gle" ""
+ StrCmp $1 "" "${Index}-NoBackup"
+ StrCmp $1 "GLEFile" "${Index}-NoBackup"
+ WriteRegStr HKCR ".gle" "backup_val" $1
+"${Index}-NoBackup:"
+ WriteRegStr HKCR ".gle" "" "GLEFile"
+ WriteRegStr HKCR "GLEFile" "" "GLE Script"
+ WriteRegStr HKCR "GLEFile\DefaultIcon" "" "$INSTDIR\bin\qgle.exe,0"
+ WriteRegStr HKCR "GLEFile\shell\open\command" "" '$INSTDIR\bin\qgle.exe "%1"'
+ WriteRegStr HKCR "GLEFile\shell\edit" "" "Edit GLE Script"
+ WriteRegStr HKCR "GLEFile\shell\edit\command" "" '$INSTDIR\bin\qgle.exe "%1"'
+ System::Call 'Shell32::SHChangeNotify(i 0x8000000, i 0, i 0, i 0)'
+ !undef Index
+SectionEnd
+
+Section -AdditionalIcons
+ WriteIniStr "$INSTDIR\${PRODUCT_NAME}.url" "InternetShortcut" "URL" "${PRODUCT_WEB_SITE}"
+ WriteIniStr "$INSTDIR\Tutorial.url" "InternetShortcut" "URL" "http://www.gle-graphics.org/tut/windows.html"
+ CreateShortCut "$SMPROGRAMS\GLE\Readme.lnk" "$INSTDIR\readme-win32.txt"
+ CreateShortCut "$SMPROGRAMS\GLE\Website.lnk" "$INSTDIR\${PRODUCT_NAME}.url" "" "$INSTDIR\www.ico"
+ CreateShortCut "$SMPROGRAMS\GLE\Tutorial.lnk" "$INSTDIR\Tutorial.url" "" "$INSTDIR\www.ico"
+ CreateShortCut "$SMPROGRAMS\GLE\Uninstall.lnk" "$INSTDIR\uninst.exe"
+SectionEnd
+
+Section -Post
+ WriteUninstaller "$INSTDIR\uninst.exe"
+ WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}"
+SectionEnd
+
+Function un.onUninstSuccess
+ HideWindow
+ MessageBox MB_ICONINFORMATION|MB_OK "$(^Name) was successfully removed from your computer."
+FunctionEnd
+
+Function un.onInit
+ MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "Are you sure you want to completely remove $(^Name) and all of its components?" IDYES +2
+ Abort
+FunctionEnd
+
+Section Uninstall
+ Delete "$INSTDIR\*.url"
+ Delete "$INSTDIR\*.ico"
+ Delete "$INSTDIR\uninst.exe"
+ Delete "$INSTDIR\glerc"
+ Delete "$INSTDIR\README*.*"
+ Delete "$INSTDIR\LICENSE*.*"
+ Delete "$INSTDIR\inittex.ini"
+ Delete "$INSTDIR\init.tex"
+ Delete "$INSTDIR\font\*.*"
+ Delete "$INSTDIR\samples\*.*"
+ Delete "$INSTDIR\lib\*.*"
+ Delete "$INSTDIR\gleinc\*.*"
+ Delete "$INSTDIR\gleinc\contrib\*.*"
+ Delete "$INSTDIR\bin\*.*"
+
+ Delete "$SMPROGRAMS\GLE\Uninstall.lnk"
+ Delete "$SMPROGRAMS\GLE\Website.lnk"
+ Delete "$SMPROGRAMS\GLE\Tutorial.lnk"
+ Delete "$SMPROGRAMS\GLE\Readme.lnk"
+ Delete "$SMPROGRAMS\GLE\GLE Previewer.lnk"
+ Delete "$SMPROGRAMS\GLE\Command Prompt.lnk"
+
+ RMDir "$SMPROGRAMS\GLE"
+ RMDir "$INSTDIR\font"
+ RMDir "$INSTDIR\bin"
+ RMDir "$INSTDIR\samples"
+ RMDir "$INSTDIR\lib"
+ RMDir "$INSTDIR\gleinc\contrib"
+ RMDir "$INSTDIR\gleinc"
+ RMDir "$INSTDIR"
+
+ DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
+ DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}"
+
+ Push "$INSTDIR\bin"
+ Call un.RemoveFromPath
+
+ SetAutoClose true
+SectionEnd
diff --git a/contrib/packagers/nsis/welcome_image.bmp b/contrib/packagers/nsis/welcome_image.bmp
new file mode 100644
index 0000000..1b36d43
Binary files /dev/null and b/contrib/packagers/nsis/welcome_image.bmp differ
diff --git a/contrib/packagers/nsis/www.ico b/contrib/packagers/nsis/www.ico
new file mode 100644
index 0000000..cb8c2af
Binary files /dev/null and b/contrib/packagers/nsis/www.ico differ
diff --git a/gle-refman/Makefile.gcc b/gle-refman/Makefile.gcc
new file mode 100644
index 0000000..682f6bc
--- /dev/null
+++ b/gle-refman/Makefile.gcc
@@ -0,0 +1,86 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+all: fig fonts pdf defs.tex
+
+fig:
+ $(MAKE) -C title -f Makefile.gcc
+ $(MAKE) -C tutorial/fig -f Makefile.gcc
+ $(MAKE) -C primitives/fig -f Makefile.gcc
+ $(MAKE) -C graph/fig -f Makefile.gcc
+ $(MAKE) -C key/fig -f Makefile.gcc
+ $(MAKE) -C advanced/fig -f Makefile.gcc
+ $(MAKE) -C utilities/fig -f Makefile.gcc
+ $(MAKE) -C appendix/fig -f Makefile.gcc
+ $(MAKE) -C prog/fig -f Makefile.gcc
+
+pdf: defs.tex
+ pdflatex gle-manual.tex
+
+dvi:
+ latex gle-manual.tex
+
+index:
+ makeindex gle-manual
+
+fonts:
+ $(MAKE) -C fonttest -f Makefile.gcc
+
+cfonts:
+ $(MAKE) -C fonttest -f Makefile.gcc clean
+
+clean:
+ rm -rf *.pdf *.idx *.aux *.dvi *.log *.out *.ilg *.ind *.toc defs.tex
+ $(MAKE) -C title -f Makefile.gcc clean
+ $(MAKE) -C tutorial/fig -f Makefile.gcc clean
+ $(MAKE) -C primitives/fig -f Makefile.gcc clean
+ $(MAKE) -C graph/fig -f Makefile.gcc clean
+ $(MAKE) -C key/fig -f Makefile.gcc clean
+ $(MAKE) -C advanced/fig -f Makefile.gcc clean
+ $(MAKE) -C utilities/fig -f Makefile.gcc clean
+ $(MAKE) -C appendix/fig -f Makefile.gcc clean
+ $(MAKE) -C prog/fig -f Makefile.gcc clean
+
+# PDFS = $(addsuffix .pdf, $(basename $(EPSS)))
+
+# %.pdf: %.eps
+# epstopdf $<
+
+defs.tex:
+ ../build/bin/glebtool -latexdef defs.tex hascairo $(HAVE_CAIRO)
+ ../build/bin/glebtool -latexversion defs.tex
diff --git a/gle-refman/Makefile.os2 b/gle-refman/Makefile.os2
new file mode 100644
index 0000000..88ac31d
--- /dev/null
+++ b/gle-refman/Makefile.os2
@@ -0,0 +1,71 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+all: fig pdf
+
+fig:
+ make -C title -f Makefile.os2
+ make -C tutorial/fig -f Makefile.os2
+ make -C primitives/fig -f Makefile.os2
+ make -C graph/fig -f Makefile.os2
+ make -C key/fig -f Makefile.os2
+ make -C advanced/fig -f Makefile.os2
+ make -C utilities/fig -f Makefile.os2
+ make -C appendix/fig -f Makefile.os2
+
+pdf:
+ vlatex gle-manual.tex
+
+index:
+ vmakeindex gle-manual
+
+clean:
+ rm -rf *.pdf *.idx *.aux *.dvi *.log *.out *.ilg *.ind *.toc
+ make -C title -f Makefile.os2 clean
+ make -C tutorial/fig -f Makefile.os2 clean
+ make -C primitives/fig -f Makefile.os2 clean
+ make -C graph/fig -f Makefile.os2 clean
+ make -C key/fig -f Makefile.os2 clean
+ make -C advanced/fig -f Makefile.os2 clean
+ make -C utilities/fig -f Makefile.os2 clean
+ make -C appendix/fig -f Makefile.os2 clean
+
+# PDFS = $(addsuffix .pdf, $(basename $(EPSS)))
+
+# %.pdf: %.eps
+# epstopdf $<
diff --git a/gle-refman/advanced/advanced.tex b/gle-refman/advanced/advanced.tex
new file mode 100644
index 0000000..f81d113
--- /dev/null
+++ b/gle-refman/advanced/advanced.tex
@@ -0,0 +1,482 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% GLE - Graphics Layout Engine <http://www.gle-graphics.org/> %
+% %
+% Modified BSD License %
+% %
+% Copyright (C) 2009 GLE. %
+% %
+% Redistribution and use in source and binary forms, with or without %
+% modification, are permitted provided that the following conditions %
+% are met: %
+% %
+% 1. Redistributions of source code must retain the above copyright %
+% notice, this list of conditions and the following disclaimer. %
+% %
+% 2. Redistributions in binary form must reproduce the above %
+% copyright notice, this list of conditions and the following %
+% disclaimer in the documentation and/or other materials provided with %
+% the distribution. %
+% %
+% 3. The name of the author may not be used to endorse or promote %
+% products derived from this software without specific prior written %
+% permission. %
+% %
+% THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR %
+% IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED %
+% WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE %
+% ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY %
+% DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL %
+% DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE %
+% GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS %
+% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER %
+% IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR %
+% OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN %
+% IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\chapter{Advanced Features}
+\label{adv:chap}
+
+This chapter covers the advanced features of GLE.
+
+\section{Diagrams}
+\index{diagrams}
+
+\subsection{Named Boxes and the Join Command}
+\label{join:sec}
+\index{joining}
+
+GLE can name objects using the ``begin/end name'' (p.~\pageref{cmd:beginname}), ``begin/end box'' (p.~\pageref{cmd:beginbox}), and ``begin/end object'' (p.~\pageref{cmd:beginobject}) constructs, and using the ``name'' option supported by some drawing commands. The name is always associated with the rectangular region on the figure that corresponds to the bounding box of the object (the smallest rectangle that surrounds all points of the object). The following example shows how to create [...]
+
+\begin{verbatim}
+ amove 1 1
+ box 1 1 fill blue name square
+
+ amove 5 5
+ begin box add 0.1 name titlebox
+ write "Title"
+ end box
+\end{verbatim}
+
+The ``join'' command (p.~\pageref{cmd:join}) can now be used to draw lines or curves (optinally with arrows) between designated points of the named objects. The following example shows how to draw an arrow from the top-right (``.tr'') point of the blue square to the bottom-centre point (``.bc'') of the object named ``titlebox''.
+
+\begin{verbatim}
+ join square.tr -> titlebox.bc
+\end{verbatim}
+
+The ``\verb+->+'' in the join command indicates that the arrow should go from the first object towards the second. The symbol ``\verb+<-+'' is used to draw the arrow in the opposite direction. A bidirectional arrow is obtained with ``\verb+<->+'' and a line without an arrow is obtained with ``\verb+-+''. The join command can also create Bezier curves instead of straight lines. See the command's description on p.~\pageref{cmd:join} for more information.
+
+\begin{verbatim}
+ join square.tr -> titlebox.bc
+ join square.tr <- titlebox.bc
+ join square.tr <-> titlebox.bc
+ join square.tr - titlebox.bc
+\end{verbatim}
+
+The named points (corners, centre points, ...) on each named object are indicated as defined in Table~\ref{tab:justopt}. ``.box'' clipping is the default and can be omitted.
+
+\begin{table}[tb]
+\caption{\label{tab:justopt}Justify options for the join command.}
+\centering
+\begin{tabular}{ll}\hline
+.tr & Top right \\
+.tc & Top centre \\
+.tl & Top left \\
+.bl & Bottom left \\
+.bc & Bottom centre \\
+.br & Bottom right \\
+.rc & Right centre \\
+.lc & Left centre \\
+.cc & Centre \\
+.v & Vertical line \\
+.h & Horizontal line \\
+.c & Circle/ellipse clipping (for drawing lines to, e.g., a circle) \\
+.box & Box clipping \\ \hline
+\end{tabular}
+\end{table}
+
+It is also possible to name an individual point (instead of an object). To do so, simply move there and save that point as a named object.
+
+\begin{verbatim}
+ amove 2 3; save apoint
+ join apoint - square
+\end{verbatim}
+
+The functions ``pointx'' (abbreviated to ``ptx'', see p.~\pageref{fct:pointxy}), ``pointy'' (abbreviated to ``pty''), ``width'', and ``height'' (p.~\pageref{fct:wdhi}) apply to named points and objects. They retrieve the ``x'' respectively ``y'' coordinate of a named point, and the width and height of a named object. For example:
+
+\begin{verbatim}
+ print ptx(square.tr)
+ print pty(square.tr)
+ print width(square)
+ print height(square)
+\end{verbatim}
+
+\subsubsection{Complete Example}
+
+Below is a complete example that makes use of the constructs described above. The resulting figure is shown in Fig.~\ref{fig:joindiag}.
+
+\begin{verbatim}
+begin name line
+ amove 8 18
+ rline 0 -6
+end name
+
+begin name main
+ amove 9.5 6.5
+ ellipse 2 0.8
+ write "Main"
+end name
+
+amove 3 16
+begin box name grv add 0.3 round 0.3 fill lightcyan
+ write "GRV"
+end box
+
+amove 12.5 16.5
+begin box name cheese add 0.3 fill lightcyan
+ write "Cheese"
+end box
+
+amove 15.5 11.5
+begin box name chv add 0.3 fill lightcyan
+ write "CHV"
+end box
+
+amove 3 10
+begin box name goats add 0.3 fill lightcyan
+ write "Goats"
+end box
+
+amove 13 1.5
+begin box name hi add 0.3 fill lightcyan
+ write "Hi there"
+end box
+
+join chv -> goats ! ".box" is default and can be omitted
+join grv -> line.h ! ".h" means to join horizontally
+join line.h <-> cheese.tl
+join cheese.rc -> chv.tc curve 0 90 1.5 1
+join main.c <- hi ! ".c" is used for circles
+join main.c <- chv
+join main.c <- goats
+\end{verbatim}
+
+\begin{figure}[tb]
+\centering
+\scalebox{0.4}{\includegraphics{advanced/fig/join}}
+\caption{\label{fig:joindiag}Joining named points.}
+\end{figure}
+
+\subsection{Object Blocks and Hierarchically Named Points}
+\label{sec:objblocks}
+
+The ``begin/end name'' (p.~\pageref{cmd:beginname}) construct names the object that results from the drawing commands in this block. The ``begin/end object'' (p.~\pageref{cmd:beginobject}) is similar, but it does not actually draw the object. It rather defines an object that can be drawn later by means of the ``draw'' command (p.~\pageref{cmd:draw}). An object block is therefore very similar to a subroutine. It actually works in the same way as a subroutine, but it is `executed' by the ` [...]
+
+\begin{verbatim}
+begin object house
+ ! draw a house with a named door and window
+ set join round
+ ! draw the roof
+ begin path stroke fill lightsalmon
+ amove 0 1.625
+ aline 1.25 2.5
+ aline 2.5 1.625
+ closepath
+ end path
+ ! draw the brick wall
+ amove 0 0
+ box 2.5 1.625 fill cornsilk
+ ! draw the door
+ amove 1.5 0
+ box 0.75 1.375 fill burlywood name door
+ ! draw the window
+ amove 0.25 0.625
+ box 1 0.75 fill skyblue name window
+end object
+\end{verbatim}
+
+To draw the house defined by the above block, one uses the following draw command. The first argument of the command is the name of the object followed by a dot followed by a justify option (Table~\ref{tab:justopt}). The justify option is used to position the object. In this case, the house is drawn such that its bottom-centre point is horizontally in the middle of the figure and at a height of 1.5 cm.
+
+\begin{verbatim}
+amove pagewidth()/2 1.5
+draw house.bc
+\end{verbatim}
+
+The ``draw'' command names the object using the same name as the name of the object block by default. An alternative name can be given using its ``name'' option. In this example, the resulting object on the figure will be called ``house''. Note that the object definition for the house also includes names for the sub-objects ``door'' and ``window''. These names can be accessed using the ``dot'' notation as follows:
+
+\begin{verbatim}
+print ptx(house.door.cc)
+print pty(house.door.cc)
+\end{verbatim}
+
+These so-called hierarchical object names can also be used to position the object. The following example draws the house such that its door's centre point is at position (5, 5).
+
+\begin{verbatim}
+amove 5 5
+draw house.door.cc
+\end{verbatim}
+
+By using the ``draw'' command inside an object's definition, names can be arbitrary nested. For example, if ``door'' would be defined as an object block that includes the name ``handle'', and if the object block defining ``house'' would include a draw command to draw the object ``door'', then the global name of the door's handle becomes ``house.door.handle''.
+
+The hierarchical object names can be used to refer to points on the object. The following example shows how these can be used with the pointx and pointy function to draw labels on the figure.
+
+\begin{verbatim}
+set just lc
+amove pointx(house.rc)+0.5 pointy(house.door.cc)
+begin name doorlabel add 0.05
+ write "house.door.cc"
+end name
+
+set just rc
+amove pointx(house.lc)-0.5 pointy(house.window.cc)
+begin name windowlabel add 0.05
+ write "house.window.cc"
+end name
+
+join windowlabel.rc -> house.window.cc
+join doorlabel.lc -> house.door.cc
+\end{verbatim}
+
+The resulting figure is shown in Fig.~\ref{fig:house}. The file ``shape.gle'' that is distributed with GLE contains object block definitions for many useful shapes.
+
+\begin{figure}[tb]
+\centering
+\includegraphics{advanced/fig/house}
+\caption{\label{fig:house}Drawing objects and hierarchically named points.}
+\end{figure}
+
+\section{\texorpdfstring{\LaTeX{} Interface}{LaTeX Interface}}
+\index{\LaTeX{} expression}
+\index{tex}
+\label{latexexp:sec}
+
+\subsection{Example}
+\index{}
+
+GLE files can include arbitrary \LaTeX{} expressions using the \LaTeX{} interface. There are two ways to include a \LaTeX{} expression. The first one is by using the `\texttt{tex}' primitive. The second one is by using the `\texttt{$\backslash{}$tex\{\}}' macro in a string.
+
+\preglegraph{}
+\begin{minipage}[c]{5cm}
+\begin{Verbatim}[baselinestretch=1,fontsize=\small,fontshape=n]
+set texlabels 1
+begin graph
+ ...
+ title "Plot of $f(x) =
+ \frac{x-\sqrt{5}}{(x-1)\cdot(x-4)}$"
+ xtitle "$x$"
+ ytitle "$y = f(x)$"
+ ...
+end graph
+
+set just bc
+amove xg(sqrt(5)) yg(2.5)
+tex "$\sqrt{5}$" add 0.1 name sq5b
+
+amove xg(sqrt(5)) yg(0); save sq50
+join sq5b.bc -> sq50
+\end{Verbatim}
+\end{minipage}
+\hfill
+\begin{minipage}[c]{7cm}
+\input{advanced/fig/texgraph.inc}
+\end{minipage}
+\postglegraph{}
+
+\LaTeX{} expressions are drawn on top of all other graphics and cannot clipped (Sec.~\ref{clip:sec}).
+
+\LaTeX{} expressions respect the `\texttt{just}' setting and, depending on the value of `\texttt{texscale}', also the `\texttt{hei}' setting (the font size). If `\texttt{set texscale scale}' is used, then \LaTeX{} expressions are scaled to the value of `\texttt{hei}'. If `\texttt{set texscale none}' is used, then \LaTeX{} expressions are not scaled. As a result, the font sizes in your graphics will be exactly the same as in your main document. To obtain different font sizes, use the font [...]
+
+\subsection{Using LaTeX Packages}\index{LaTeX packages}
+
+If your \LaTeX{} expressions require special \LaTeX{} packages, these can be loaded using the \texttt{texpreamble} block. E.g., put the following near the beginning of your GLE file:
+
+\begin{verbatim}
+begin texpreamble
+ \documentclass{llncs}
+ \usepackage{amsmath}
+ \usepackage{amssymb}
+ \DeclareMathSymbol{\R}{\mathbin}{AMSb}{"52}
+end texpreamble
+\end{verbatim}
+
+\subsection{Using UTF-8 Encoding in GLE Scripts with LaTeX Expressions}\index{UTF-8}\index{Unicode}
+
+If you save your .gle files in Unicode (UTF-8) encoding, then you can type accented characters (such as \'e, \"u, \v{z}, \ldots) directly into your GLE script. In order to also allow such encoded characters in \LaTeX{} expressions, add the following `texpreamble' to your GLE script:
+
+
+\verb+size 4 4+\\
+\verb+begin texpreamble+\\
+\verb+ \usepackage[utf8]{inputenc}+\\
+\verb+end texpreamble+\\
+\texttt{amove 1 2; tex "\'e\"u\v{z}"}
+
+\subsection{Import a GLE Figure in a LaTeX Document}
+
+There are two methods for importing the output of a GLE file with \TeX{} expressions in your \LaTeX{} document. The most obvious one is by just importing the .eps/.pdf file generated by GLE with \texttt{$\backslash$includegraphics}. E.g., if you have a GLE script `sin.gle' and you run `gle -d eps -d pdf sin.gle' to produce the .eps/.pdf output, then you could include this in a LaTeX document as follows:
+
+\begin{verbatim}
+\documentclass{article}
+\usepackage{graphics}
+\begin{document}
+ \begin{figure}
+ \includegraphics{sin}
+ \caption{\label{sin}The sine function.}
+ \end{figure}
+\end{document}
+\end{verbatim}
+
+An alternative method is by using GLE's command line option `\texttt{-inc}'. If this option is supplied, then GLE will create besides the usual .eps or .pdf file also an .inc file. This .inc file can be imported in a \LaTeX{} document as follows.
+
+\begin{verbatim}
+\input{myfile.inc}
+\end{verbatim}
+
+The .inc file tells \texttt{latex} (or \texttt{pdflatex}) to include the .eps/.pdf output file created by GLE. It also includes \TeX{} draw commands for drawing the \LaTeX{} expressions on top of the GLE output. Note that the .eps/.pdf file created by GLE does not include these if \texttt{-inc} is used (you can check this by viewing it with GhostView).
+
+To be able to include .inc files, the following must be included in the preamble of your \LaTeX{} document.
+
+\begin{verbatim}
+\usepackage{graphics}
+\usepackage{color}
+\end{verbatim}
+
+\begin{sloppypar}
+If you place your .gle files in a subdirectory of the directory where your \LaTeX{} document resides, the .inc file created by GLE should include the path to this subdirectory in the `\texttt{$\backslash$includegraphics}' primitive it uses for including the .eps/.pdf file generated by GLE. To add this path, use the `\texttt{-texincprefix}' command line option of GLE. For example, if your GLE files are in a subdirectory called `plots' then one should run GLE as follows.
+\end{sloppypar}
+
+\begin{verbatim}
+gle -texincprefix "plots/" -inc myfile.gle
+\end{verbatim}
+
+GLE can color and rotate \LaTeX{} expressions (use `\texttt{set color}' and `\texttt{begin rotate}'). Note however that `\texttt{xdvi}' does not support these effects, so you will not be able to see them if you use this viewer. In the final PostScript or PDF output, they will of course be displayed correctly.
+
+The main advantage of using the \texttt{-inc} method is that the resulting file size will be smaller because the \LaTeX{} fonts are not included in the .eps/.pdf file generated by GLE.
+
+\subsection{The .gle Directory}
+
+If your source includes \LaTeX{} expressions, then GLE will construct a subdirectory called `.gle' for storing temporary files (e.g., used for measuring the printed size of the \LaTeX{} expressions). After you are finished you can safely delete the .gle directory. GLE will recreate it automatically if required.
+
+\section{Filling, Stroking and Clipping Paths}
+\index{paths}
+\index{stroking}
+\index{clip}
+\index{clipping}
+\label{clip:sec}
+It is possible to set up arbitrary clipping regions. To do
+this draw a shape and make it into a path by putting
+a {\sf begin path clip} ... {\sf end path}, around it. Then draw the things to
+be clipped by that region. To clear a clipping path
+surround the whole section of GLE commands with {\sf begin clip ... end clip}
+
+ Characters can be used to make up clipping paths, but only the
+PostScript fonts will currently work for this purpose.
+
+\begin{verbatim}
+ size 10 5
+ begin clip ! Save current clipping path
+ begin path clip stroke ! Define new clipping region
+ amove 2 2
+ box 3 3
+ amove 6 2
+ box 3 3
+ end path
+ amove 2 2
+ set hei 3
+ text Here is clipped text
+ end clip ! Restore original clipping path
+\end{verbatim}
+
+\psgraphin{advanced/fig/gc_clip}{10.0}{5.0}{\sf begin clip}
+
+\section{Colour}
+\index{fill patterns}
+\index{color (variables)}
+
+Internally GLE treats color and fill identically, they are simply an intensity of red, green and blue. Each of the predefined color names (yellow, grey20, orange, red) simply define the ratio of red, green and blue. A sample of the predefined color names is included in Appendix~\ref{colors:sec}.
+
+\index{color-variables}
+There are two ways to use variables to show color, one is for shades of grey:
+\begin{verbatim}
+ for i = 0 to 10
+ box 3 .2 fill (i/10)
+ rmove 0 .2
+ next i
+\end{verbatim}
+The other is for passing a color {\bf name} as a variable:
+\begin{verbatim}
+ sub stick c$
+ box .2 2 fill c$
+ end sub
+ stick "green"
+\end{verbatim}
+
+\index{cvtrgb()}\index{rgb255()}\index{RGB}
+A color can also be defined based on its RGB values with the \texttt{rgb255} primitive.
+\begin{verbatim}
+mycolor$ = "rgb255(38,38,134)"
+\end{verbatim}
+
+\index{filling}
+Remember a fill pattern completely obscures what is behind it,
+so the following command would produce a box with a shadow:
+\begin{verbatim}
+ amove 4 4
+ box 3 2 fill grey10
+ rmove -.1 .1
+ box 3 2 fill white
+ rmove .4 .4
+ text hellow
+\end{verbatim}
+
+\section{GLE's Configuration File} \label{conffile:sec}
+
+GLE reads two configuration files during initialization. The first configuration file is the file ``glerc'' located in the root of your GLE installation. This location is usually referred to as \$GLE\_TOP. To find out where your \$GLE\_TOP is, run ``\texttt{gle -info}''. The second configuration file is the file ``.glerc'' located in your home directory (Unix and Mac OS/X only). The commands in this second file override the commands in \$GLE\_TOP/glerc.
+
+The configuration files can be used to set various options, such as the paper size and margins.
+
+To set the paper size and margins, add the following block to the configuration file.
+
+\preglecode{}
+\begin{verbatim}
+begin config paper
+ size = letterpaper
+ margins = 2.54 2.54 2.54 2.54
+end config
+\end{verbatim}
+\postglecode{}
+
+The supported paper sizes are listed with the description of the ``\texttt{papersize}'' command on page~\pageref{papsiz:cmd}.
+
+The configuration file can also be used to override default locations of external tools such as GhostScript and LaTeX.
+
+\preglecode{}
+\begin{verbatim}
+begin config tools
+ ghostscript = $HOME/bin/gs
+ pdflatex = /usr/bin/pdflatex
+ latex = /usr/bin/latex
+ dvips = /usr/bin/dvips
+ dvips_options = "-j0"
+end config
+\end{verbatim}
+\postglecode{}
+
+Note that GLE expands environment variables in the tool locations. If I'm john, then GLE will search for GhostScript in \verb+/home/john/bin/gs+ in the above example. It is also possible to specify additional command line options to be passed to the tools by means of \verb+ghostscript_options+, \verb+pdflatex_options+, \verb+latex_options+, and \verb+dvips_options+. In the above example, the option ``\verb+-j0+'' will be passed to dvips. As a result, it will not subset fonts.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/gle-refman/advanced/fig/Makefile.gcc b/gle-refman/advanced/fig/Makefile.gcc
new file mode 100644
index 0000000..5e6cc4a
--- /dev/null
+++ b/gle-refman/advanced/fig/Makefile.gcc
@@ -0,0 +1,56 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+EPSS = gc_join.pdf gc_clip.pdf texgraph.inc join.pdf house.pdf
+
+ifeq ($(RUNBUILD),1)
+ GLE = ../../../build/bin/gle
+else
+ GLE = gle
+endif
+
+all: $(EPSS)
+
+%.inc: %.gle
+ $(GLE) -texincprefix "advanced/fig/" -inc -d pdf $<
+
+%.pdf: %.gle
+ $(GLE) -d pdf $<
+
+clean:
+ rm -rf *.eps *.pdf *.inc .gle
diff --git a/gle-refman/advanced/fig/Makefile.os2 b/gle-refman/advanced/fig/Makefile.os2
new file mode 100644
index 0000000..7fe0bc8
--- /dev/null
+++ b/gle-refman/advanced/fig/Makefile.os2
@@ -0,0 +1,47 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+EPSS = gc_join.eps gc_clip.eps texgraph.eps
+
+all: $(EPSS)
+
+%.eps: %.gle
+ gle -texincprefix "advanced/fig/" -d eps $<
+
+clean:
+ rm -rf *.eps *.pdf *.inc .gle
diff --git a/gle-refman/advanced/fig/gc_clip.gle b/gle-refman/advanced/fig/gc_clip.gle
new file mode 100644
index 0000000..29404c4
--- /dev/null
+++ b/gle-refman/advanced/fig/gc_clip.gle
@@ -0,0 +1,51 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+ size 10 5
+ begin clip ! Save current clipping path
+ begin path clip stroke ! Define new clipping region
+ amove 2 2
+ box 3 3
+ amove 6 2
+ box 3 3
+ end path
+ amove 2 2
+ set hei 3
+ text Here is clipped text
+ end clip ! Restore original clipping path
+
diff --git a/gle-refman/advanced/fig/gc_join.gle b/gle-refman/advanced/fig/gc_join.gle
new file mode 100644
index 0000000..e46c8cb
--- /dev/null
+++ b/gle-refman/advanced/fig/gc_join.gle
@@ -0,0 +1,70 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 12 3.5 !3
+amove .5 3 ! 1 2.6
+set hei .28 !.27
+set font tt
+begin table
+ set hei .3 font psh
+ amove 1.2 .2
+ box 1 1 fill blue name square
+ amove 1.9 2
+ begin box add .1 name titlebox
+ text Title
+ end box
+ join square.tr -> titlebox.br
+ join square <- titlebox
+ join square.tc <-> titlebox.v
+end table
+
+amove 7.4 0.25 !0
+box 4.4 3 !4 3
+begin origin
+ set hei .6 font psh
+ set hei .3
+ amove 1.2 .2
+ box 1 1 fill blue name square
+ amove 1.9 2
+ begin box add .1 name titlebox
+ text Title
+ end box
+ join square.tr -> titlebox.br
+ join square <- titlebox
+ join square.tc <-> titlebox.v
+end origin
diff --git a/gle-refman/advanced/fig/house.gle b/gle-refman/advanced/fig/house.gle
new file mode 100644
index 0000000..8964eea
--- /dev/null
+++ b/gle-refman/advanced/fig/house.gle
@@ -0,0 +1,109 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 9 4.1
+
+set font psh
+
+sub red_bullet
+ ! draw a red bullet
+ gsave
+ set color red fill red
+ circle 0.06
+ grestore
+end sub
+
+begin object house
+ ! draw a house with a named door and window
+ set join round
+ ! draw the roof
+ begin path stroke fill lightsalmon
+ amove 0 1.625
+ aline 1.25 2.5
+ aline 2.5 1.625
+ closepath
+ end path
+ ! draw the brick wall
+ amove 0 0
+ box 2.5 1.625 fill cornsilk
+ ! draw the door
+ amove 1.5 0
+ box 0.75 1.375 fill burlywood name door
+ ! draw the window
+ amove 0.25 0.625
+ box 1 0.75 fill skyblue name window
+end object
+
+! draw the house
+amove pagewidth()/2 1.5
+draw house.bc
+red_bullet
+
+! mark the door and window with a red bullet
+move house.door.cc
+red_bullet
+move house.window.cc
+red_bullet
+
+! draw the labels
+set just bc
+amove pagewidth()/2 0.1
+begin name drawcmd add 0.05
+ begin text
+ amove pagewidth()/2 1.5
+ draw house.bc
+ end text
+end name
+
+set just lc
+amove pointx(house.rc)+0.5 pointy(house.door.cc)
+begin name doorlabel add 0.05
+ write "house.door.cc"
+end name
+
+set just rc
+amove pointx(house.lc)-0.5 pointy(house.window.cc)
+begin name windowlabel add 0.05
+ write "house.window.cc"
+end name
+
+! draw the arrows
+join drawcmd.tc -> house.bc
+join windowlabel.rc -> house.window.cc
+join doorlabel.lc -> house.door.cc
+
diff --git a/gle-refman/advanced/fig/join.gle b/gle-refman/advanced/fig/join.gle
new file mode 100644
index 0000000..6f30976
--- /dev/null
+++ b/gle-refman/advanced/fig/join.gle
@@ -0,0 +1,89 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 18 18.5
+
+! This is JOIN.GLE, demonstrates the join commands.
+
+set hei 0.8 just cc font psh arrowsize 0.6 arrowangle 16
+
+set lwidth 0.05 fill lightcyan
+
+begin name line
+ amove 8 18
+ rline 0 -6
+end name
+
+begin name main
+ amove 9.5 6.5
+ ellipse 2 0.8
+ write "Main"
+end name
+
+amove 3 16
+begin box name grv add 0.3 round 0.3 fill lightcyan
+ write "GRV"
+end box
+
+amove 12.5 16.5
+begin box name cheese add 0.3 fill lightcyan
+ write "Cheese"
+end box
+
+amove 15.5 11.5
+begin box name chv add 0.3 fill lightcyan
+ write "CHV"
+end box
+
+amove 3 10
+begin box name goats add 0.3 fill lightcyan
+ write "Goats"
+end box
+
+amove 13 1.5
+begin box name hi add 0.3 fill lightcyan
+ write "Hi there"
+end box
+
+join chv -> goats ! ".box" is default and can be omitted
+join grv -> line.h ! ".h" means to join horizontally
+join line.h <-> cheese.tl
+join cheese.rc -> chv.tc curve 0 90 1.5 1
+join main.c <- hi ! ".c" is used for circles
+join main.c <- chv
+join main.c <- goats
diff --git a/gle-refman/advanced/fig/texgraph.gle b/gle-refman/advanced/fig/texgraph.gle
new file mode 100644
index 0000000..fcc6521
--- /dev/null
+++ b/gle-refman/advanced/fig/texgraph.gle
@@ -0,0 +1,70 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 7 5
+
+include "../../script/manual.gle"
+
+amove 0 -0.1
+manual_graph_mode
+begin graph
+ scale auto
+ title "Plot of $f(x) = \frac{x-\sqrt{5}}{(x-1)\cdot(x-4)}$"
+ xtitle "$x$"
+ ytitle "$y = f(x)$"
+ xplaces 0 1 2 3 4 5
+ xaxis min 0 max 5 format "fix 0"
+ yaxis min -6 max 6
+ let d1 = (x-sqrt(5))/((x-1)*(x-4)) from 0 to 5 step 0.025
+ let d2 = 0 from 0 to 5 step 1
+ d1 line
+ d2 line color red
+end graph
+
+set just bc
+amove xg(sqrt(5)) yg(2.5)
+tex "$\sqrt{5}$" add 0.1 name sq5b
+
+amove xg(sqrt(5)) yg(0); save sq50
+join sq5b.bc -> sq50
+
+set color blue
+amove xg(1) yg(-6)
+aline xg(1) yg(6)
+amove xg(4) yg(-6)
+aline xg(4) yg(6)
diff --git a/gle-refman/advanced/fig/texgraph.tex b/gle-refman/advanced/fig/texgraph.tex
new file mode 100644
index 0000000..c27f425
--- /dev/null
+++ b/gle-refman/advanced/fig/texgraph.tex
@@ -0,0 +1,61 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% GLE - Graphics Layout Engine <http://www.gle-graphics.org/> %
+% %
+% Modified BSD License %
+% %
+% Copyright (C) 2009 GLE. %
+% %
+% Redistribution and use in source and binary forms, with or without %
+% modification, are permitted provided that the following conditions %
+% are met: %
+% %
+% 1. Redistributions of source code must retain the above copyright %
+% notice, this list of conditions and the following disclaimer. %
+% %
+% 2. Redistributions in binary form must reproduce the above %
+% copyright notice, this list of conditions and the following %
+% disclaimer in the documentation and/or other materials provided with %
+% the distribution. %
+% %
+% 3. The name of the author may not be used to endorse or promote %
+% products derived from this software without specific prior written %
+% permission. %
+% %
+% THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR %
+% IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED %
+% WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE %
+% ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY %
+% DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL %
+% DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE %
+% GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS %
+% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER %
+% IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR %
+% OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN %
+% IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\documentclass{article}
+\usepackage[dvips]{graphics}
+\usepackage{color}
+\usepackage{geometry}
+\geometry{%
+ paperwidth=6.075cm,
+ paperheight=5.075cm,
+ left=0in,
+ right=0in,
+ top=0in,
+ bottom=0in
+}
+\pagestyle{empty}
+\begin{document}
+\setlength{\unitlength}{1cm}%
+\noindent{}\begin{picture}(6.075,5.075)(0,0)%
+\put(0,0){\includegraphics{texgraph_inc}}
+\put(2.94245,0.149732){\makebox(0,0)[lb]{{\small $x$}}}
+\put(0.35209,1.91713){\rotatebox{90}{\makebox(0,0)[lb]{{\small $y = f(x)$}}}}
+\put(1.05637,4.57681){\makebox(0,0)[lb]{{\normalsize Plot of $f(x) = \frac{x-\sqrt{5}}{(x-1)\cdot(x-4)}$}}}
+\put(2.57729,3.2384){\makebox(0,0)[lb]{{\normalsize $\sqrt{5}$}}}
+\end{picture}
+\end{document}
diff --git a/gle-refman/appendix/appendix.tex b/gle-refman/appendix/appendix.tex
new file mode 100644
index 0000000..fe73d31
--- /dev/null
+++ b/gle-refman/appendix/appendix.tex
@@ -0,0 +1,189 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% GLE - Graphics Layout Engine <http://www.gle-graphics.org/> %
+% %
+% Modified BSD License %
+% %
+% Copyright (C) 2009 GLE. %
+% %
+% Redistribution and use in source and binary forms, with or without %
+% modification, are permitted provided that the following conditions %
+% are met: %
+% %
+% 1. Redistributions of source code must retain the above copyright %
+% notice, this list of conditions and the following disclaimer. %
+% %
+% 2. Redistributions in binary form must reproduce the above %
+% copyright notice, this list of conditions and the following %
+% disclaimer in the documentation and/or other materials provided with %
+% the distribution. %
+% %
+% 3. The name of the author may not be used to endorse or promote %
+% products derived from this software without specific prior written %
+% permission. %
+% %
+% THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR %
+% IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED %
+% WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE %
+% ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY %
+% DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL %
+% DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE %
+% GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS %
+% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER %
+% IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR %
+% OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN %
+% IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\appendix
+\chapter{Tables}
+\section{Markers}
+\index{markers}
+\mbox{\input{primitives/fig/gc_marker.inc}}
+
+\section{Functions and Variables}
+\index{functions}
+\label{fct:sec}
+
+\begin{supertabular}{ll} \hline
+Function name & Returns \ldots \\ \hline
+{\tt abs(exp)} \index{abs()} & absolute value of expression \\
+{\tt acos(exp)} \index{acos()} & arccosine \\
+{\tt acosh(exp)} \index{acosh()} & inverse hyperbolic cosine \\
+{\tt acot(exp)} \index{acot()} & 1/atan(exp) \\
+{\tt acoth(exp)} \index{acoth()} & 1/atanh(exp) \\
+{\tt acsc(exp)} \index{acsc()} & 1/asin(exp) \\
+{\tt acsch(exp)} \index{acsch()} & 1/asinh(exp) \\
+{\tt arg(i)} \index{arg()} & i-th command line argument \\
+{\tt arg\$(i)} \index{arg()} & i-th command line argument \\
+{\tt asec(exp)} \index{asec()} & 1/acos(exp) \\
+{\tt asech(exp)} \index{asech()} & 1/acosh(exp) \\
+{\tt asin(exp)} \index{asin()} & arcsine \\
+{\tt asinh(exp)} \index{asinh()} & inverse hyperbolic sine \\
+{\tt atan(exp)} \index{atan()} & arctan \\
+{\tt atanh(exp)} \index{atanh()} & inverse hyperbolic tangent \\
+{\tt atn(exp)} \index{atn()} & same as ATAN(exp) \\
+{\tt cos(exp)} \index{cos()} & cosine \\
+{\tt cosh(exp)} \index{cosh()} & hyperbolic cosine \\
+{\tt cot(exp)} \index{cot()} & 1/tan(exp) \\
+{\tt coth(exp)} \index{coth()} & 1/tanh(exp) \\
+{\tt csc()} \index{csc()} & 1/sin(exp) \\
+{\tt csch(exp)} \index{csch()} & 1/sinh(exp) \\
+{\tt dataxvalue(ds,i)} \index{dataxvalue} & $x$-value of $i$-th point in ds (p.~\pageref{dataxvalue})\\
+{\tt datayvalue(ds,i)} \index{datayvalue} & $y$-value of $i$-th point in ds (p.~\pageref{datayvalue})\\
+{\tt date\$()} \index{date\$()} & current date e.g. ``Tue Apr 09 1991'' \\
+{\tt device\$()} \index{device\$()} & available devices e.g. ``HARDCOPY, PS''\\
+{\tt getenv(str)} \index{getenv{}} & returns environment variable ``str''\\
+{\tt eval(str)} \index{eval()} & evaluates given GLE expression \\
+{\tt exp(exp)} \index{exp()} & exponent \\
+{\tt $\backslash{}$expr(exp)} \index{$\backslash{}$expr(exp)} & substitute result of evaluating ``exp'' \\
+{\tt file\$()} \index{file\$()} & returns GLE file name (without extension) \\
+{\tt fix(exp)} \index{fix()} & {\tt exp} rounded towards 0 \\
+{\tt format\$(exp,format)} \index{format\$()} & format {\tt exp} as specified in {\tt format} (p.~\pageref{formatnum:pg})\\
+{\tt height(name\$)} \index{height()} & the height of the object {\tt name\$} \\
+{\tt int(exp)} \index{int()} & integer part of {\tt exp} \\
+{\tt left\$(str\$,exp)} \index{left\$()} & left {\tt exp} characters of {\tt str\$} \\
+{\tt len(str\$)} \index{len()} & the length of {\tt str\$} \\
+{\tt log(exp)} \index{log()} & log to base $e$ of {\tt exp} \\
+{\tt log10(exp)} \index{log10()} & log to base 10 of {\tt exp} \\
+{\tt nargs()} \index{nargs()} & number of command line arguments \\
+{\tt ndata(ds)} \index{ndata} & number of points in data set ds (p.~\pageref{ndata})\\
+{\tt ndatasets()} \index{ndatasets} & number of available data sets\\
+{\tt not(exp)} \index{not()} & logical not of {\tt exp} \\
+{\tt num1\$(exp)} \index{num1\$()} & as above but with no spaces \\
+{\tt num\$(exp)} \index{num\$()} & string representation of {\tt exp} \\
+{\tt pageheight()} \index{pageheight()} & the height of the page (from size command) \\
+{\tt pagewidth()} \index{pagewidth()} & the width of the page (from size command) \\
+{\tt path\$()} \index{path\$()} & returns the directory where the script is located \\
+{\tt pointx(pt)} \index{pointx()} & the x value of named point pt \\
+{\tt pointy(pt)} \index{pointy()} & the y value of named point pt \\
+{\tt pos(str1\$,str2\$,exp)} \index{pos()} & position of {\tt str2\$} in {\tt str1\$} from {\tt exp} \\
+{\tt ptx(pt)} \index{ptx()} & the x value of named point pt (abbreviation for pointx) \\
+{\tt pty(pt)} \index{pty()} & the y value of named point pt (abbreviation for pointy)\\
+{\tt rgb(red,green,blue)} \index{rgb()} & create color given RGB values \\
+{\tt rgba(red,green,blue,alpha)} \index{rgba()} & create color given RGB and alpha values \\
+{\tt rgb255(red,green,blue)} \index{rgb255()} & create color given RGB values \\
+{\tt rgba255(red,green,blue,alpha)} \index{rgba255()} & create color given RGB and alpha values \\
+{\tt right\$(str\$,exp)} \index{right\$()} & rest of {\tt str\$} starting at {\tt exp} \\
+{\tt rnd(exp)} \index{rnd()} & random number between 0 and {\tt exp} \\
+{\tt sdiv(x,y)} \index{sdvi()} & return x/y or 0 if y = 0 \\
+{\tt sec(exp)} \index{sec()} & 1/cos(exp) \\
+{\tt sech(exp)} \index{sech()} & 1/cosh(exp) \\
+{\tt seg\$(str\$,exp1,exp2)} \index{seg\$()} & {\tt str\$} from {\tt exp1} to {\tt exp2} \\
+{\tt sgn(exp)} \index{sgn()} & returns 1 if {\tt exp} is positive, -1 if {\tt exp} is negative \\
+{\tt sin(exp)} \index{sin()} & sine of {\tt exp} \\
+{\tt sinh(exp)} \index{sinh()} & hyperbolic sine \\
+{\tt sqr(exp)} \index{sqr()} & {\tt exp} squared \\
+{\tt sqrt(exp)} \index{sqrt()} & square root of {\tt exp} \\
+{\tt tan(exp)} \index{tan()} & tangent of {\tt exp} \\
+{\tt tanh(exp)} \index{tanh()} & hyperbolic tangent \\
+{\tt tdepth(str\$)} \index{tdepth()} & the depth of {\tt str\$} assuming current the font, size \\
+{\tt theight(str\$)} \index{theight()} & the height of {\tt str\$} assuming current font, size \\
+{\tt time\$()} \index{time\$()} & current time e.g. ``11:44:27'' \\
+{\tt todeg(exp)} \index{todeg()} & convert from radians to degrees \\
+{\tt torad(exp)} \index{torad()} & convert from degrees to radians \\
+{\tt twidth(str\$)} \index{twidth()} & the width of {\tt str\$} assuming current font, size \\
+{\tt val(str\$)} \index{val()} & value of the string {\tt str\$} \\
+{\tt width(name\$)} \index{width()} & the width of the object {\tt name\$} \\
+{\tt xbar(x,i)} \index{xbar()} & the absolute x coordinate of the i-th bar at point x on the graph \\
+{\tt xend()} \index{xend()} & the x end point of a text string when drawn \\
+{\tt xg(xexp)} \index{xg()} & converts units of last graph to abs cm. \\
+{\tt xg3d(x,y,z)} \index{xg3d()} & converts units of last 3D graph to abs cm. \\
+{\tt xpos()} \index{xpos()} & the current x point \\
+{\tt xy2angle(dx,dy)} \index{xy2angle()}& convert rectangular coordinates to polar angle (in degrees)\\
+{\tt yend()} \index{yend()} & the y end point of a text string when drawn \\
+{\tt yg(yexp)} \index{yg()} & converts units of last graph to abs cm. \\
+{\tt yg3d(x,y,z)} \index{yg3d()} & converts units of last 3D graph to abs cm. \\
+{\tt ypos()} \index{ypos()} & the current y point \\
+\end{supertabular}
+
+\begin{supertabular}{ll} \hline
+Variable name & Returns \ldots \\ \hline
+{\tt pi} \index{pi} & 3.14... \\
+{\tt xgmin} \index{xgmin} & the minimum x-coordinate of the graph \\
+{\tt xgmax} \index{xgmax} & the maximum x-coordinate of the graph \\
+{\tt xg2min} \index{xg2min} & the minimum x2-coordinate of the graph \\
+{\tt xg2max} \index{xg2max} & the maximum x2-coordinate of the graph \\
+{\tt ygmin} \index{ygmin} & the minimum y-coordinate of the graph \\
+{\tt ygmax} \index{ygmax} & the maximum y-coordinate of the graph \\
+{\tt yg2min} \index{yg2min} & the minimum y2-coordinate of the graph \\
+{\tt yg2max} \index{yg2max} & the maximum y2-coordinate of the graph \\
+\end{supertabular}
+
+\input{appendix/sym}
+\newpage
+
+\section{Installing GLE}
+\label{install:app}
+
+\section{Fonts}
+
+\index{fonts} \index{font-examples}
+\resizebox{!}{22cm}{\includegraphics{appendix/fig/ap_fonts}}
+\newpage
+
+%%
+% \clearpage
+% \input{appendix/sm_single}
+%%
+% \clearpage
+% \input{appendix/sm_stack2}
+%
+% \clearpage
+% \input{appendix/sm_stack4b}
+%%
+% \clearpage
+% \input{appendix/sm_stack1}
+%%
+% \clearpage
+% \input{appendix/sm_loop}
+%%
+% \clearpage
+% \input{appendix/sm_join}
+%%
+% \clearpage
+% \input{appendix/sm_clip}
+%%
+%%\cleardoublepage
+
diff --git a/gle-refman/appendix/fig/Makefile.gcc b/gle-refman/appendix/fig/Makefile.gcc
new file mode 100644
index 0000000..751091a
--- /dev/null
+++ b/gle-refman/appendix/fig/Makefile.gcc
@@ -0,0 +1,58 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+EPSS = ap_marker.pdf ap_fonts.pdf wall.pdf join.pdf single.pdf stack2.pdf \
+ stack1.pdf stack4b.pdf loop.pdf clip.pdf color_sample.inc \
+ color_list_svg.inc symbols.inc
+
+ifeq ($(RUNBUILD),1)
+ GLE = ../../../build/bin/gle
+else
+ GLE = gle
+endif
+
+all: $(EPSS)
+
+%.inc: %.gle
+ $(GLE) -texincprefix appendix/fig/ -inc -d pdf $<
+
+%.pdf: %.gle
+ $(GLE) -d pdf $<
+
+clean:
+ rm -rf *.pdf *.inc .gle
diff --git a/gle-refman/appendix/fig/Makefile.os2 b/gle-refman/appendix/fig/Makefile.os2
new file mode 100644
index 0000000..3928dfe
--- /dev/null
+++ b/gle-refman/appendix/fig/Makefile.os2
@@ -0,0 +1,48 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+EPSS = ap_marker.eps ap_fonts.eps wall.eps join.eps single.eps stack2.eps \
+ stack1.eps stack4b.eps loop.eps clip.eps
+
+all: $(EPSS)
+
+%.eps: %.gle
+ gle -d eps $<
+
+clean:
+ rm -rf *.eps *.pdf *.inc
diff --git a/gle-refman/appendix/fig/ap_fonts.gle b/gle-refman/appendix/fig/ap_fonts.gle
new file mode 100644
index 0000000..4f48ed5
--- /dev/null
+++ b/gle-refman/appendix/fig/ap_fonts.gle
@@ -0,0 +1,158 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 18 24
+
+not_avail = 0
+
+sub fnt f$ n$
+ set font rm
+ set just right
+ write f$
+ rmove .5 0
+ if font(f$) then
+ set just left font f$
+ write n$
+ else
+ set just left font rm
+ write "Font `"+f$+"' not available"
+ not_avail = 1
+ end if
+ rmove -.5 -.6
+end sub
+
+set hei .4
+amove 1.6 23
+ at fnt "rm" "Roman"
+ at fnt "rmb" "Roman Bold"
+ at fnt "rmi" "Roman Italic"
+ at fnt "ss" "Sans Serif"
+ at fnt "ssb" "Sans Serif Bold"
+ at fnt "ssi" "Sans Serif Italic"
+ at fnt "tt" "Typewriter"
+ at fnt "ttb" "Typewriter Bold"
+ at fnt "tti" "Typewriter Italic"
+
+amove 1.6 (23-(.6*11))
+ at fnt "texcmr" "Computer Modern Roman"
+ at fnt "texcmb" "Computer Modern Bold"
+ at fnt "texcmti" "Computer Modern Text Italic"
+ at fnt "texcmmi" "Computer Modern Maths Italic"
+
+ at fnt "texcmss" "Computer Modern Sans Serif"
+ at fnt "texcmssb" "Computer Modern Sans Serif Bold"
+ at fnt "texcmssi" "Computer Modern Sans Serif Italic"
+
+ at fnt "texcmtt" "Computer Modern Typewriter Text"
+ at fnt "texcmitt" "Computer Modern Italic Typewriter"
+!@fnt "texcmex" "Computer Modern Extensible"
+!@fnt "texcmsl" "Computer Modern Slanted"
+!@fnt "texcmsy" "Computer Modern Symbol"
+
+amove 1.6 (23-(.6*22))
+!@fnt "plcc" "Complex Cartographic"
+!@fnt "plcg" "Complex Gothic"
+ at fnt "plsr" "Simplex Roman"
+ at fnt "pldr" "Duplex Roman"
+ at fnt "pltr" "Triplex Roman"
+ at fnt "plti" "Triplex Italic"
+ at fnt "plcr" "Complex Roman"
+ at fnt "plci" "Complex Italic"
+ at fnt "plss" "Simplex Script"
+ at fnt "plcs" "Complex Script"
+ at fnt "plsa" "Simplex Ascii"
+ at fnt "plba" "Block Ascii"
+ at fnt "plge" "Gothic English"
+ at fnt "plgg" "Gothic German"
+ at fnt "plgi" "Gothic Italian"
+ at fnt "plsg" "Simplex Greek"
+
+amove 10.75 23
+ at fnt "pstr" "Times-Roman"
+ at fnt "pstb" "Times-Bold"
+ at fnt "psti" "Times-Italic"
+ at fnt "pstbi" "Times-BoldItalic"
+
+ at fnt "psc" "Courier"
+ at fnt "pscb" "Courier-Bold"
+ at fnt "psco" "Courier-Oblique"
+ at fnt "pscbo" "Courier-BoldOblique"
+
+ at fnt "psh" "Helvetica"
+ at fnt "pshb" "Helvetica-Bold"
+ at fnt "psho" "Helvetica-Oblique"
+ at fnt "pshbo" "Helvetica-BoldOblique"
+
+ at fnt "pshc" "Helvetica-Condensed"
+ at fnt "pshcb" "Helvetica-Condensed-Bold"
+ at fnt "pshcdo" "Helvetica-Condensed-Oblique"
+
+ at fnt "pshn" "Helvetica-Narrow"
+ at fnt "pshnb" "Helvetica-Narrow-Bold"
+ at fnt "pshno" "Helvetica-NarrowOblique"
+ at fnt "pshnbo" "Helvetica-Narrow-BoldOblique"
+
+ at fnt "psagb" "AvantGarde-Book"
+ at fnt "psagd" "AvantGarde-Demi"
+ at fnt "psagbo" "AvantGarde-BookOblique"
+ at fnt "psagdo" "AvantGarde-DemiOblique"
+
+ at fnt "psbl" "Bookman-Light"
+ at fnt "psbd" "Bookman-Demi"
+ at fnt "psbli" "Bookman-LightItalic"
+ at fnt "psbdi" "Bookman-DemiItalic"
+
+ at fnt "psncsr" "NewCenturySchlbk-Roman"
+ at fnt "psncsb" "NewCenturySchlbk-Bold"
+ at fnt "psncsi" "NewCenturySchlbk-Italic"
+ at fnt "psncsbi" "NewCenturySchlbk-BoldItalic"
+
+ at fnt "pspr" "Palatino-Roman"
+ at fnt "pspb" "Palatino-Bold"
+ at fnt "pspi" "Palatino-Italic"
+ at fnt "pspbi" "Palatino-BoldItalic"
+
+ at fnt "pssym" "PostScript Symbol"
+ at fnt "pszcmi" "ZapfChancery-MediumItalic"
+ at fnt "pszd" "ZapfDingbats"
+
+if not_avail = 1 then
+ set just bl font rm
+ amove 0.1 0.2
+ write "Fonts marked `not available' are not in the standard GLE distribution (install the `extra-fonts' package)"
+end if
diff --git a/gle-refman/appendix/fig/ap_marker.gle b/gle-refman/appendix/fig/ap_marker.gle
new file mode 100644
index 0000000..7e619e8
--- /dev/null
+++ b/gle-refman/appendix/fig/ap_marker.gle
@@ -0,0 +1,95 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 13 5.5
+set hei .99
+sub mm name$
+ gsave
+ mk = mk+1
+ gsave
+ set lwidth .0001
+ set lstyle 1212
+ rmove 0 .8
+ rline 0 -1.6
+ rmove 0 .8
+ grestore
+ marker name$ 1
+ rmove .8 0
+ rline 1 0
+ rmove .5 -.3
+ write name$
+ grestore
+ rmove 0 -1.3
+end sub
+mk = 0
+amove 0.5 pageheight()-0.75
+scale .4 .4
+gsave
+ at mm "circle"
+ at mm "triangle"
+ at mm "square"
+ at mm "diamond"
+ at mm "fcircle"
+ at mm "ftriangle"
+ at mm "fsquare"
+ at mm "fdiamond"
+ at mm "dot"
+grestore
+rmove 11 0
+gsave
+ at mm "cross"
+ at mm "club"
+ at mm "heart"
+ at mm "star"
+ at mm "snake"
+ at mm "dag"
+ at mm "ddag"
+ at mm "asterisk"
+ at mm "oplus"
+grestore
+rmove 11 0
+ at mm "ominus"
+ at mm "otimes"
+ at mm "odot"
+ at mm "trianglez"
+ at mm "diamondz"
+ at mm "wcircle"
+ at mm "wtriangle"
+ at mm "wsquare"
+ at mm "wdiamond"
+
diff --git a/gle-refman/appendix/fig/clip.gle b/gle-refman/appendix/fig/clip.gle
new file mode 100644
index 0000000..ad9cf14
--- /dev/null
+++ b/gle-refman/appendix/fig/clip.gle
@@ -0,0 +1,79 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+!size 18 24 ! This is CLIP.GLE, sets up an arbitrary clipping region.
+size 14 18
+set font texcmr
+scale .6 .8
+set hei .3 ! NOTE: CLIPPING ONLY WORKS ON POSTSCRIPT DEVICES.
+amove 2.3 .3 ! So this won't work on the pc-screen.
+text clip.gle
+
+set hei 10
+amove 2 2
+begin clip ! Save default clipping region
+ begin path clip ! Set up the clipping region
+ text GLE
+ end path
+ gsave
+ amove 2 2
+ text www ! Draw some text which will be clipped
+ for i = 1 to 90 ! Draw some lines which will be clipped
+ amove 2 2
+ rotate -1
+ rline 0 30
+ next i
+ grestore
+end clip ! restore default clipping region
+amove 0 0
+rline 10 10 ! draw a line which won't be clipped.
+!-----------------------------------------------------------------------------
+!Here's a simple example of how to set up a clipping region which consists
+!of two squares. Try this out
+amove 1 11
+begin origin
+ begin path clip stroke
+ amove 2 2
+ box 4 4
+ amove 7 2
+ box 4 4
+ end path
+ amove 2 2
+ set hei 4
+ text Here is clipped text
+end origin
diff --git a/gle-refman/appendix/fig/color_list_svg.gle b/gle-refman/appendix/fig/color_list_svg.gle
new file mode 100644
index 0000000..7686196
--- /dev/null
+++ b/gle-refman/appendix/fig/color_list_svg.gle
@@ -0,0 +1,219 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 17 21
+
+include "../../script/manual.gle"
+manual_std_mode
+
+set font psh just tl
+
+amove 0.25 pageheight()-0.1
+tex "GLE supports these SVG/X11 standard colors (alphabetical order)"
+
+bw = 0.8; bh = 0.4; dy = 0.1; dx = 4.35; ytop = pageheight()-1.5
+
+sub show_color name$
+ rmove 0 -bh/2
+ box bw bh fill name$
+ rmove bw+0.2 bh/2
+ tex name$
+ rmove -bw-0.2 -bh-dy
+end sub
+
+set just lc
+
+amove 0.25 ytop
+show_color "aliceblue"
+show_color "antiquewhite"
+show_color "aqua"
+show_color "aquamarine"
+show_color "azure"
+show_color "beige"
+show_color "bisque"
+show_color "black"
+show_color "blanchedalmond"
+show_color "blue"
+show_color "blueviolet"
+show_color "brown"
+show_color "burlywood"
+show_color "cadetblue"
+show_color "chartreuse"
+show_color "chocolate"
+show_color "coral"
+show_color "cornflowerblue"
+show_color "cornsilk"
+show_color "crimson"
+show_color "cyan"
+show_color "darkblue"
+show_color "darkcyan"
+show_color "darkgoldenrod"
+show_color "darkgray"
+show_color "darkgreen"
+show_color "darkkhaki"
+show_color "darkmagenta"
+show_color "darkolivegreen"
+show_color "darkorange"
+show_color "darkorchid"
+show_color "darkred"
+show_color "darksalmon"
+show_color "darkseagreen"
+show_color "darkslateblue"
+show_color "darkslategray"
+show_color "darkturquoise"
+show_color "darkviolet"
+show_color "deeppink"
+
+amove 0.25+dx ytop
+show_color "deepskyblue"
+show_color "dimgray"
+show_color "dodgerblue"
+show_color "firebrick"
+show_color "floralwhite"
+show_color "forestgreen"
+show_color "fuchsia"
+show_color "gainsboro"
+show_color "ghostwhite"
+show_color "gold"
+show_color "goldenrod"
+show_color "gray"
+show_color "green"
+show_color "greenyellow"
+show_color "honeydew"
+show_color "hotpink"
+show_color "indianred"
+show_color "indigo"
+show_color "ivory"
+show_color "khaki"
+show_color "lavender"
+show_color "lavenderblush"
+show_color "lawngreen"
+show_color "lemonchiffon"
+show_color "lightblue"
+show_color "lightcoral"
+show_color "lightcyan"
+show_color "lightgoldenrodyellow"
+show_color "lightgray"
+show_color "lightgreen"
+show_color "lightpink"
+show_color "lightsalmon"
+show_color "lightseagreen"
+show_color "lightskyblue"
+show_color "lightslategray"
+show_color "lightsteelblue"
+show_color "lightyellow"
+show_color "lime"
+show_color "limegreen"
+
+amove 0.25+2*dx ytop
+show_color "linen"
+show_color "magenta"
+show_color "maroon"
+show_color "mediumaquamarine"
+show_color "mediumblue"
+show_color "mediumorchid"
+show_color "mediumpurple"
+show_color "mediumseagreen"
+show_color "mediumslateblue"
+show_color "mediumspringgreen"
+show_color "mediumturquoise"
+show_color "mediumvioletred"
+show_color "midnightblue"
+show_color "mintcream"
+show_color "mistyrose"
+show_color "moccasin"
+show_color "navajowhite"
+show_color "navy"
+show_color "oldlace"
+show_color "olive"
+show_color "olivedrab"
+show_color "orange"
+show_color "orangered"
+show_color "orchid"
+show_color "palegoldenrod"
+show_color "palegreen"
+show_color "paleturquoise"
+show_color "palevioletred"
+show_color "papayawhip"
+show_color "peachpuff"
+show_color "peru"
+show_color "pink"
+show_color "plum"
+show_color "powderblue"
+show_color "purple"
+show_color "red"
+show_color "rosybrown"
+show_color "royalblue"
+show_color "saddlebrown"
+
+amove 0.25+3*dx ytop
+show_color "salmon"
+show_color "sandybrown"
+show_color "seagreen"
+show_color "seashell"
+show_color "sienna"
+show_color "silver"
+show_color "skyblue"
+show_color "slateblue"
+show_color "slategray"
+show_color "snow"
+show_color "springgreen"
+show_color "steelblue"
+show_color "tan"
+show_color "teal"
+show_color "thistle"
+show_color "tomato"
+show_color "turquoise"
+show_color "violet"
+show_color "wheat"
+show_color "white"
+show_color "whitesmoke"
+show_color "yellow"
+show_color "yellowgreen"
+show_color "gray1"
+show_color "gray5"
+show_color "gray10"
+show_color "gray20"
+show_color "gray30"
+show_color "gray40"
+show_color "gray50"
+show_color "gray60"
+show_color "gray70"
+show_color "gray80"
+show_color "gray90"
+
diff --git a/gle-refman/appendix/fig/color_sample.gle b/gle-refman/appendix/fig/color_sample.gle
new file mode 100644
index 0000000..f140c89
--- /dev/null
+++ b/gle-refman/appendix/fig/color_sample.gle
@@ -0,0 +1,218 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 17 21
+
+include "../../script/manual.gle"
+manual_std_mode
+
+set font psh just tl
+
+amove 0.25 pageheight()-0.1
+tex "GLE supports these SVG/X11 standard colors (sorted by color)"
+
+bw = 0.8; bh = 0.4; dy = 0.1; dx = 4.35; ytop = pageheight()-1.5
+
+sub show_color name$
+ rmove 0 -bh/2
+ box bw bh fill name$
+ rmove bw+0.2 bh/2
+ tex name$
+ rmove -bw-0.2 -bh-dy
+end sub
+
+set just lc
+
+amove 0.25 ytop
+show_color "indianred"
+show_color "lightcoral"
+show_color "salmon"
+show_color "darksalmon"
+show_color "lightsalmon"
+show_color "crimson"
+show_color "red"
+show_color "firebrick"
+show_color "darkred"
+show_color "pink"
+show_color "lightpink"
+show_color "hotpink"
+show_color "deeppink"
+show_color "mediumvioletred"
+show_color "palevioletred"
+show_color "coral"
+show_color "tomato"
+show_color "orangered"
+show_color "darkorange"
+show_color "orange"
+show_color "gold"
+show_color "yellow"
+show_color "lightyellow"
+show_color "lemonchiffon"
+show_color "lightgoldenrodyellow"
+show_color "papayawhip"
+show_color "moccasin"
+show_color "peachpuff"
+show_color "palegoldenrod"
+show_color "khaki"
+show_color "darkkhaki"
+show_color "lavender"
+show_color "thistle"
+show_color "plum"
+show_color "violet"
+show_color "orchid"
+show_color "fuchsia"
+show_color "magenta"
+show_color "mediumorchid"
+
+amove 0.25+dx ytop
+show_color "mediumpurple"
+show_color "blueviolet"
+show_color "darkviolet"
+show_color "darkorchid"
+show_color "darkmagenta"
+show_color "purple"
+show_color "indigo"
+show_color "slateblue"
+show_color "darkslateblue"
+show_color "greenyellow"
+show_color "chartreuse"
+show_color "lawngreen"
+show_color "lime"
+show_color "limegreen"
+show_color "palegreen"
+show_color "lightgreen"
+show_color "mediumspringgreen"
+show_color "springgreen"
+show_color "mediumseagreen"
+show_color "seagreen"
+show_color "forestgreen"
+show_color "green"
+show_color "darkgreen"
+show_color "yellowgreen"
+show_color "olivedrab"
+show_color "olive"
+show_color "darkolivegreen"
+show_color "mediumaquamarine"
+show_color "darkseagreen"
+show_color "lightseagreen"
+show_color "darkcyan"
+show_color "teal"
+show_color "aqua"
+show_color "cyan"
+show_color "lightcyan"
+show_color "paleturquoise"
+show_color "aquamarine"
+show_color "turquoise"
+show_color "mediumturquoise"
+
+amove 0.25+2*dx ytop
+show_color "darkturquoise"
+show_color "cadetblue"
+show_color "steelblue"
+show_color "lightsteelblue"
+show_color "powderblue"
+show_color "lightblue"
+show_color "skyblue"
+show_color "lightskyblue"
+show_color "deepskyblue"
+show_color "dodgerblue"
+show_color "cornflowerblue"
+show_color "mediumslateblue"
+show_color "royalblue"
+show_color "blue"
+show_color "mediumblue"
+show_color "darkblue"
+show_color "navy"
+show_color "midnightblue"
+show_color "cornsilk"
+show_color "blanchedalmond"
+show_color "bisque"
+show_color "navajowhite"
+show_color "wheat"
+show_color "burlywood"
+show_color "tan"
+show_color "rosybrown"
+show_color "sandybrown"
+show_color "goldenrod"
+show_color "darkgoldenrod"
+show_color "peru"
+show_color "chocolate"
+show_color "saddlebrown"
+show_color "sienna"
+show_color "brown"
+show_color "maroon"
+show_color "white"
+show_color "snow"
+show_color "honeydew"
+show_color "mintcream"
+
+amove 0.25+3*dx ytop
+show_color "azure"
+show_color "aliceblue"
+show_color "ghostwhite"
+show_color "whitesmoke"
+show_color "seashell"
+show_color "beige"
+show_color "oldlace"
+show_color "floralwhite"
+show_color "ivory"
+show_color "antiquewhite"
+show_color "linen"
+show_color "lavenderblush"
+show_color "mistyrose"
+show_color "gainsboro"
+show_color "lightgray"
+show_color "silver"
+show_color "darkgray"
+show_color "gray"
+show_color "dimgray"
+show_color "lightslategray"
+show_color "slategray"
+show_color "darkslategray"
+show_color "black"
+show_color "gray1"
+show_color "gray5"
+show_color "gray10"
+show_color "gray20"
+show_color "gray30"
+show_color "gray40"
+show_color "gray50"
+show_color "gray60"
+show_color "gray70"
+show_color "gray80"
+show_color "gray90"
diff --git a/gle-refman/appendix/fig/fonttes2.gle b/gle-refman/appendix/fig/fonttes2.gle
new file mode 100644
index 0000000..1691faa
--- /dev/null
+++ b/gle-refman/appendix/fig/fonttes2.gle
@@ -0,0 +1,84 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 24 18
+!fnm$="psbd" !"texcmr"
+include glename.gle
+
+xstart=3
+ystart=14
+xspace=1
+yspace=1.75 !1
+
+set hei 1.0
+set font texcmr
+amove 12 17
+set just center
+write "Font : " fnm$
+
+set hei .5
+set color blue
+amove xstart-xspace ystart+1.5
+rmove xspace/2 yspace/2
+rline 0 -ystart-1.5
+amove xstart ystart+1.5
+for x=1 to 20
+ write x
+ gsave
+ rmove xspace/2 yspace/2
+ rline 0 -ystart-1.5
+ grestore
+ rmove xspace 0
+next x
+amove xstart-1 ystart
+for y=1 to 8 !13
+ write (y-1)*2
+ gsave
+ rmove -1*(xspace/2) yspace/2 ! .5 .5
+ rline 24-xstart 0
+ grestore
+ rmove 0 -yspace
+next y
+rmove -1*(xspace/2) (yspace/2)
+rline 24-xstart 0
+
+set color black
+set hei .6
+set font fnm$
+amove xstart ystart
+include glefont2.gle
diff --git a/gle-refman/appendix/fig/fonttest.gle b/gle-refman/appendix/fig/fonttest.gle
new file mode 100644
index 0000000..872e94e
--- /dev/null
+++ b/gle-refman/appendix/fig/fonttest.gle
@@ -0,0 +1,83 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 24 18
+fnm$="pszcmi" !"texcmr"
+
+xstart=3
+ystart=14
+xspace=1
+yspace=2 !1
+
+set hei 1.0
+set font texcmr
+amove 12 17
+set just center
+write "Font : " fnm$
+
+set hei .5
+set color blue
+amove xstart-xspace ystart+1.5
+rmove xspace/2 yspace/2
+rline 0 -ystart-1.5
+amove xstart ystart+1.5
+for x=1 to 20
+ write x
+ gsave
+ rmove xspace/2 yspace/2
+ rline 0 -ystart-1.5
+ grestore
+ rmove xspace 0
+next x
+amove xstart-1 ystart
+for y=1 to 7 !13
+ write (y-1)*2
+ gsave
+ rmove -1*(xspace/2) yspace/2 ! .5 .5
+ rline 24-xstart 0
+ grestore
+ rmove 0 -yspace
+next y
+rmove -1*(xspace/2) (yspace/2)
+rline 24-xstart 0
+
+set color black
+set hei .8
+set font fnm$
+amove xstart ystart
+include glefont.gle
diff --git a/gle-refman/appendix/fig/join.gle b/gle-refman/appendix/fig/join.gle
new file mode 100644
index 0000000..823f635
--- /dev/null
+++ b/gle-refman/appendix/fig/join.gle
@@ -0,0 +1,104 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 14 19 box ! This is JOIN.GLE, demonstrates the join commands.
+begin scale .8 .8
+set hei .3
+amove .3 .3
+text join.gle
+
+set hei 1.3 just center
+amove 9 21
+text Joining named objects
+
+set hei .8 lwidth .1
+amove 8.8 18.8
+begin box name line
+ rline 0 -8.2
+end box
+set lwidth 0
+
+amove 9.67745 8.7603
+begin box name cir nobox
+ circle 1
+end box
+circle 1
+amove 12.7461 4.59445
+begin box name hi add .2
+ text Hi there
+end box
+amove 3.14401 17.0566
+begin box name grv add .2
+ text GRV
+end box
+amove 14.9533 12.2986
+begin box name chv add .2
+ text CHV
+end box
+amove 12.5179 17.6103
+begin box name cheese add .2
+ text Cheese
+end box
+amove 2.7381 11.229
+begin box name goats add .2
+ text Goats
+end box
+! Now draw the lines between objects
+join chv - goats
+join grv -> line.h ! Note: ".h" means to join horizontally.
+join line.h <-> cheese.tl
+join cheese.tr - chv.tr
+join cir.ci <- hi ! Note: ".ci" is used for circles
+join cir.ci <- chv
+join cir.ci <- goats
+!-----------------------------------------------------------------------------
+! A pie slice (Will only work on PostScript it uses BEGIN PATH FILL).
+sub pie ang1 ang2 radius color$
+begin path fill color$ stroke
+ rmove 0 0
+ arc radius ang1 ang2
+ closepath
+end path
+end sub
+
+amove 3 2
+ at pie 0 10 2 "gray10"
+ at pie 10 40 2 "gray20"
+ at pie 40 120 2 "blue"
+
+end scale
diff --git a/gle-refman/appendix/fig/loop.gle b/gle-refman/appendix/fig/loop.gle
new file mode 100644
index 0000000..9bd845a
--- /dev/null
+++ b/gle-refman/appendix/fig/loop.gle
@@ -0,0 +1,78 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 17 17 box !18 24 box ! This is LOOP.GLE, shows programming examples
+amove 5 14
+set just center hei 1
+text Subroutines, Loops
+set just left hei .7
+set hei .9
+
+! First define a single neuron
+sub neuron xx yy
+ amove xx yy
+ begin scale .5 .5
+ curve 0 .4 .4 .4 .4 -.4 .4 .4 .4 -.8 -.4 -.8 -.4 .4
+ curve -.4 -.8 -.4 .4 -.4 -.4 -.4 .4 0 .4
+ closepath
+ end scale
+end sub
+
+! Draw the neurons
+for xx = 0 to 1
+ for i = 1 to 6
+ @neuron xx*6+2 i*2+1.2
+ next i
+next xx
+
+! Draw the lines between them
+for i = 1 to 6
+ for j = 1 to 6
+ amove 3 i*2+1
+ aline 7.5 j*2+1
+ next j
+next i
+
+!--------------------------------------------------------------------------
+include ziptext.gle
+amove 12 1
+ at ziptext "Hello"
+amove 13 4
+begin rotate 20
+ @ziptext "Green trees"
+end rotate
diff --git a/gle-refman/appendix/fig/nzmap.gle b/gle-refman/appendix/fig/nzmap.gle
new file mode 100644
index 0000000..797c5f1
--- /dev/null
+++ b/gle-refman/appendix/fig/nzmap.gle
@@ -0,0 +1,485 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 18 24
+rmove 9.11395 23.0791
+rline .393772 .452995E-02
+rline .939665E-01 .239124E-01
+rline -.846033E-01 -.179815
+rline -.135201 .82798E-02
+rline .377631 -.425119
+rline -.705366E-01 .266457E-02
+rline .13873 -.173044
+rline .764313E-01 -.852394E-02
+rline -.493231E-01 -.179672
+rline .140863 .535259E-01
+rline .235176E-02 .167721
+rline .647993E-01 -.409298E-01
+rline .946579E-01 -.179094
+rline .387963 -.131607E-01
+rline -.496264E-01 -.943489E-01
+rline .258481 .363541E-01
+rline .106403 -.176115
+rline .185359 -.610352E-01
+rline -.185243 .286713E-01
+rline .174305 -.264103
+rline .187638 .127279
+rline .499849E-01 -.863075E-02
+rline .097641 -.187916
+rline -.261517E-01 -.854244E-01
+rline .247985 -.322664
+rline -.064435 -.649929E-01
+rline .891743E-01 -.287985
+rline -.091156 .143471E-01
+rline -.179571 .904846E-01
+rline -.409393E-01 -.590076E-01
+rline .214806 -.078577
+rline -.316944E-01 -.179613
+rline .265935 -.416731
+rline .176787 -.131702
+rline -.666084E-01 -.629082E-01
+rline .501604E-01 -.586681E-01
+rline -.615234E-01 -.620537E-01
+rline .411034E-03 -.126541
+rline -.587435E-01 -.120106E-01
+rline -.232401E-01 -.824986E-01
+rline .974207E-01 -.132061
+rline -.675049E-01 -.326328E-01
+rline .891447E-01 -.29689
+rline -.205588 -.449848E-01
+rline .185198 -.110149E-01
+rline .314713 -.664291E-01
+rline .359472 -.275194
+rline -.549507E-02 -.117743
+rline .106373 -.173218
+rline .220302 .420933E-01
+rline -.151547 .505596
+rline .905123E-01 .185787
+rline -.186344 .36124
+rline -.325203E-03 .100063
+rmove .246206 .212896
+rline -.509806E-01 .311756
+rline -.088748 .176233
+rline -.879555E-01 -.680504E-01
+rline .915813E-02 -.102961
+rline -.467033E-01 -.100262
+rline .268155 -.210821
+rmove .347346 -.163401
+rline -.589466E-02 .291443E-02
+rmove .569077E-01 -.323503
+rline -.295639E-02 .58651E-02
+rmove -.963685 .790751
+rline -.292683E-02 -.295639E-02
+rmove -.283634 -.454384
+rline 0 .293922E-02
+rmove -.1701 .788055
+rline .58651E-02 .591278E-02
+rmove -1.01927 1.61457
+rline -.292683E-02 -.295639E-02
+rmove 1.57976 -3.15447
+rline -.293827E-02 .292778E-02
+rmove -.244665 .219744
+rline .21485 -.903664E-01
+rline -.326366E-01 .094038
+rline -.173392 -.658607E-02
+rmove -.111887 .613632E-01
+rline 0 0
+rmove -.111326 -.112284
+rline .295258E-02 -.293922E-02
+rmove 1.84844 -.81365
+rline -.292683E-02 -.295639E-02
+rmove .169325 -.549675
+rline -.294113E-02 -.114441E-04
+rmove 1.00495 .746899E-01
+rline .147142E-01 -.287819E-02
+rmove -1.35752 -.120264
+rline -.203678 .269943
+rline .04175 -.18524
+rline .15899 -.847034E-01
+rmove -1.00261 1.91777
+rline .238398 -.990925E-01
+rline .156931 -.355476
+rline .199607 .773258E-01
+rline -.163753 -.259661
+rline .152636 .065361
+rline .10711 -.399828
+rline -.290632E-01 -.103127
+rline .267859E-01 -.999451E-01
+rline -.468369E-01 -.619965E-01
+rline .159987 -.390785
+rline -.729589E-01 -.159222
+rline .285691 -.184261
+rline -.017333 -.913029E-01
+rline .405738 -.425034E-01
+rline .377029 -.245703
+rline .47968 -.183464
+rline -.105799 -.632286E-02
+rline .388023 -.131435E-01
+rline .352123 .178009
+rline .11093 .232946
+rline .425352 .254822
+rline .31749 -.193176E-01
+rline .344625 -.225227
+rline -.303892 -.548643
+rline .385475E-01 -.105785
+rline -.673447E-01 -.797348E-01
+rline .620461E-02 -.10004
+rline -.051981 -.282751
+rline .296803E-01 -.881729E-01
+rline -.336748 -.386907
+rline -.176261 -.301361E-01
+rline .179205E-01 -.882206E-01
+rline -.116253 -.403679
+rline .100464 -.164395
+rline -.160795 -.262582
+rmove -.273609E-02 -.647612E-01
+rline 0 0
+rmove .273609E-02 .647612E-01
+rline .225506E-01 .297332
+rline -.543984 .06845
+rline -.501951 -.199223
+rline -.236917 -.35413
+rline .715046E-01 -.296962
+rline .179538 -.787382E-01
+rline -.274301 -.607371
+rline -.125512 -.268333
+rline -.175939 -.1302
+rline -.636396E-01 -.312227
+rline -.307756 -.266129
+rline -.537795 -.926287
+rline -.636154 -.505846
+rline -.31133 -.718899E-01
+rline -.715199E-01 .302852
+rline -.1706 .040513
+rline -.167397 -.448227E-01
+rline .01964 .288499
+rline -.261053 -.162924
+rline -.270042E-01 .167645
+rline .23143 .236385
+rline .120002 .153518
+rmove -.20228 -.159734
+rline 0 .293827E-02
+rmove .180801 .436312
+rline .152588E-04 -.295067E-02
+rmove .214787E-01 -.279504
+rline .329926 .678242
+rline .331078E-01 .665265
+rline -.227493 .361091
+rline -.759644 .411898
+rline -.256407 .213808
+rline -.303009 .870705E-01
+rline -.215379 .24929
+rline .342073E-01 .326824
+rline .466406 .284415
+rline .463793 .187284
+rline .130836 .436109
+rline .974951E-01 .750881
+rline .270123 .864391E-01
+rline -.126791 .126045
+rline -.179796E-01 .105877
+rline .228434E-01 .2061
+rline .193872 .033165
+rline -.30182 .622702
+rline .965538E-01 .138718
+rmove -.323687E-01 .116405E-01
+rline -.438538E-01 -.737495E-01
+rline 0 0
+rmove -.152588E-04 .587654E-02
+rline -.222095 .5112
+rline .155812 -.140781E-01
+rline .476599E-01 -.19405
+rline .278619 .183596
+rline -.227049 .228636
+rline -.322902 -.124907
+rline -.163263 .493776
+rline -.254045 .390406
+rline .14695 .648499E-02
+rline .129777 -.140745
+rline -.261812E-01 -.854549E-01
+rline .821619E-01 .415325E-01
+rline .166035E-02 .394367
+rline -.132144 -.358334E-01
+rline .232553E-01 .795422E-01
+rline .196651 .861473E-01
+rline -.267491 .48027E-02
+rline .166983 .168425
+rline -.167453 -.212669E-01
+rline -.308743 .370159E-01
+rline .177232 -.270052
+rline -.137732 -.124163
+rline -.909794 1.39135
+rline .639772E-01 .212156
+rline .258144 .154079
+rline -.240636 -.118692
+rline -.167147 -.115459
+rline -.106402 .179094
+rline -.135774 .176043
+rline .201225E-01 .138407
+rline .375328E-01 .209118
+rline -.425452 .681067
+rline -.233123 .287485
+rline .280762E-02 .382652E-01
+rmove -.340166E-01 -9.93531
+rline .440843 -.046629
+rline -.329149 .202713E-01
+rline -.643578E-01 -.317752
+rline .247028 -.188024
+rline .149817 .736952E-01
+rline .825434E-01 -.27349
+rline -.733852E-01 -.942049E-01
+rline .443516E-01 -.288218
+rline .499964E-01 -.293732E-01
+rmove -.356197E-01 .370605
+rline .294113E-02 -.293922E-02
+rmove .356197E-01 -.367665
+rline .085351 -.149929
+rline .223214 .135523
+rline .292587E-02 .235376E-01
+rmove -.270286 -.796795E-01
+rline .294113E-02 -.293827E-02
+rmove .270284 .796738E-01
+rline .302466 .229746
+rline .176319 .161171E-03
+rline .140861 .206041
+rline .208661 -.861263E-02
+rline -.276047 -.20324
+rline .205705 .314713E-02
+rline -.214392 -.138461
+rline .911407E-01 -.410919E-01
+rline -.105667 -.135422
+rline .149843 .236807E-01
+rline .276152 .973349E-01
+rline -.279135 -.384989E-01
+rline .527325E-01 .176538
+rline .140992 .677881E-01
+rline .116882E-01 .588417E-01
+rline .173378 .148773E-01
+rline .105831 -.469685E-01
+rline -.158561 -.12663
+rline .471001E-01 -.911417E-01
+rline -.331926 -.156224
+rline .452516 .563326E-01
+rline -.149727 -.170761
+rline -.11456 -.354176E-01
+rmove -.20065 .846976
+rline .615234E-01 .203032
+rline -.182083 -.1149
+rline .890827E-02 -.102949
+rline -.615807E-01 -.138319
+rline .176173 .159019
+rmove .42373 -.593776
+rline .592422E-02 -.441132E-01
+rline .146815 .12663
+rline -.940685E-01 .029314
+rline .412197E-01 -.764313E-01
+rline -.969648E-01 -.892258E-02
+rline .295353E-02 -.294151E-01
+rmove -.228962 -.256127
+rline -.527143E-01 -.197136
+rline .235489 -.417471
+rline -.211233 -.36496
+rline -.4226 -.609308
+rline -.284663 -.403267
+rline -.763712E-01 -.442095E-01
+rline .265064E-01 -.676212E-01
+rline -.231713 -.464982
+rline -.587362 -.394743
+rline -.878363E-01 -.344241
+rmove -.586796E-02 -.589466E-02
+rline .884266E-01 -.2823
+rline -.132132 -.117796
+rline .285018 .038516
+rline .617409E-01 -.234604E-01
+rline .194198 -.255733
+rline -.114461 -.15896
+rline -.1088 .704885E-01
+rline .147915E-01 -.970483E-01
+rline -.57312 .759244E-01
+rline .202692 .825586E-01
+rline -.238135 .105673
+rline -.049881 -.882921E-01
+rline .892353E-02 -.105894
+rline -.161573 -.560522E-01
+rmove -.293884E-01 -.147285E-01
+rline -.120646 .173438
+rline .120646 -.173438
+rmove -.323114E-01 -.591278E-02
+rline -.78713 -.465536
+rmove -.293884E-01 -.591278E-02
+rline -.275901 -.344419
+rline .302792E-02 -.102949
+rline -.120208 -.288397
+rline .414433E-01 -.311756
+rline -.321507E-01 -.185347
+rmove -.292683E-02 -.147166E-01
+rline -.346139 -.659233
+rline .500264E-01 -.823259E-01
+rline -.293368 -.529748
+rline .064713 -.646529E-01
+rline -.968041E-01 -.176585
+rline .176218 .109005
+rline -.351934E-01 -.706377E-01
+rline -.234933E-01 -.264883E-01
+rline -.234973 -.114959
+rline -.252557 -.182611
+rline -.299349 -.42094
+rline -.170323 -.129586
+rline .104427E-03 -.114727
+rline -.223097 -.259066
+rline -.355476 -.103301
+rline -.417235 -.680685E-01
+rline -.34686 .996888E-01
+rline -.217438 -.325799E-01
+rline -.596046E-04 .558913E-01
+rline -.911145E-01 .175714E-01
+rline -.558171E-01 -.177145E-01
+rline -.148773E-01 .202954
+rline -.352678E-01 -.884533E-02
+rline -.144124 .143993
+rline -.396669 -.621557E-01
+rline -.358841 .334984
+rline -.323078 -.19446
+rline -.305656 .379384E-01
+rmove .855932 -.811034
+rline .293851E-02 -.293851E-02
+rmove 1.02553 .804305E-01
+rline .152588E-04 -.295639E-02
+rmove -1.22752 -.907177
+rline .293851E-02 -.293851E-02
+rmove .516301 .950617
+rline -.190947 -.649035E-01
+rline .07374 -.291133
+rline -.310949 -.576854
+rline .214496 .026679
+rline -.265033E-01 .588059E-01
+rline .34664 .138599
+rline .234991 .103182
+rline .276279E-02 .188255
+rline -.261524 -.208437E-01
+rline .211439 .150228
+rline -.288266 .282103
+rmove -1.18202 .707763
+rline -.302729 .408947E-01
+rline .161326 .314903
+rline -.117779E-01 .02352
+rline -.733109E-01 -.17069
+rline -.587881E-01 .146568E-01
+rline -.764577E-01 .617027E-01
+rline .155652 .108987
+rline -.305539 -.100315
+rline -.531733E-01 .302935
+rline .578722 .20647
+rline -.267449 .320911E-01
+rline .193855 .10314
+rline -.208631 -.237284E-01
+rline .117415 .144243
+rline -.617146E-01 .288486E-02
+rline -.117603 .498948E-01
+rline .055656 .197131
+rline .293776 .914693E-01
+rline .558348E-01 .888109E-02
+rline .061801 -.881734E-01
+rline -.234334E-01 -.941572E-01
+rline .351636E-01 .114751
+rline -.126514 .158721
+rline .188094 -.204024E-01
+rline -.247133 .288027
+rline .240931 .561299E-01
+rline -.108874 .141084
+rline .220436 -.350952E-01
+rline -.188154 .910163E-01
+rline .190786 .232559
+rline .105962 -.167554
+rline .561476E-02 .267684
+rline .149772 .106037
+rline .214276 .264948
+rline .182319 -.117486
+rline -.737815E-01 .335258
+rline .278914 .267953
+rline -.304294E-02 .105899
+rmove -1.59573 -3.07546
+rline -.293851E-02 .294447E-02
+rmove .853508E-01 -.144053
+rline -.587988E-02 -.178814E-04
+rmove .263831 .6827
+rline -.58651E-02 -.295639E-02
+rmove -.129277 -.324726E-01
+rline -.294137E-02 .588322E-02
+rmove -.30852 -.385466E-01
+rline -.294161E-02 0
+rmove .175536E-01 .794411E-01
+rline .237972 .561118E-01
+rline -.120589 .11167
+rline -.179038 -.223732
+rline .061655 .559506E-01
+rmove .507715 .712347
+rline -.530839E-01 .202912
+rline -.073415 -.055963
+rline .941873E-01 -.152874
+rline .381916E-01 .298643E-02
+rmove 1.17376 1.81608
+rline .372839 .397462
+rline .475946 .12989
+rline .182054 .159019
+rmove .146713E-01 .02355
+rline .419894 .35339
+rline .293764 .10618
+rline .733557E-01 .120682
+rmove .234752E-01 .323715E-01
+rline .352087E-01 .647545E-01
+rmove .011745 .883293E-02
+rline .279063 .126749
+rline .152579 .241358
+rline .792849 .636136
+rline .346318 .473934
+rmove -1.03053 -1.00406
+rline -.294161E-02 -.294495E-02
+rmove 1.0452 1.02173
+rline .360387 1.13579
+rline .233145E-01 .200046
+rline .469995 .209308
+rline .293293 .612116
+rline -.015214 .547116
+rline .255379 .300288
+rline .261334 .235581
+rline .149754 .120735
+set font texcmr
+set hei 0.3
+amove 18 1
+set just right
+text nzmap.gle
diff --git a/gle-refman/appendix/fig/showfont.gle b/gle-refman/appendix/fig/showfont.gle
new file mode 100644
index 0000000..e807a10
--- /dev/null
+++ b/gle-refman/appendix/fig/showfont.gle
@@ -0,0 +1,103 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 12 9 !24 18
+begin scale .5 .5
+!yanz=12 !/14
+!fnm$="plsym1" !"texcmr"
+!nam$="Ganz langer name"
+include glename.gle
+
+xstart=3
+ystart=14
+xspace=1
+yspace=2*(12/yanz)
+
+set hei .9
+set font texcmr
+amove 1.5 17
+set just bl
+write "Font : " fnm$
+amove 22.5 17
+set hei .7
+set just br
+write nam$
+set hei 1.0
+
+set hei .5
+!set color blue
+amove xstart-xspace ystart+1.5
+rmove xspace/2 yspace/2
+rline 0 -ystart-yspace+.5
+amove xstart ystart+1.5
+set just center
+for x=1 to 20
+ write (x-1)
+ gsave
+ rmove xspace/2 yspace/2
+ rline 0 -ystart-yspace+.5
+ grestore
+ rmove xspace 0
+next x
+amove xstart-1 ystart
+!!for y=1 to 7 !13
+for y=1 to (yanz/2)+1
+ write (y-1)*2
+ gsave
+ rmove -1*(xspace/2) yspace/2 ! .5 .5
+ rline 24-xstart 0
+ grestore
+ rmove 0 -yspace
+next y
+rmove -1*(xspace/2) (yspace/2)
+rline 24-xstart 0
+
+set color black
+set hei .8*(12/yanz)
+set font fnm$
+amove xstart ystart
+for j = 0 to (yanz/2)
+ for i = 0 to 19
+ ! note: no spaces in expression below. (exept inside quotes)
+ xx$ = "\char{"+num1$(j*20+i)+"}"
+ write xx$
+ rmove xspace 0
+ next i
+amove xstart ystart-((j+1)*yspace)
+next j
+end scale
diff --git a/gle-refman/appendix/fig/single.dat b/gle-refman/appendix/fig/single.dat
new file mode 100644
index 0000000..c78a495
--- /dev/null
+++ b/gle-refman/appendix/fig/single.dat
@@ -0,0 +1,43 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+0 2 6
+1 10 16
+2 3 6
+3 6 3
+4 5 4
+5 3 7
diff --git a/gle-refman/appendix/fig/single.gle b/gle-refman/appendix/fig/single.gle
new file mode 100644
index 0000000..05f2d42
--- /dev/null
+++ b/gle-refman/appendix/fig/single.gle
@@ -0,0 +1,46 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 12 9 box
+begin graph
+ SIZE 12 9
+ Title "Bar example"
+ data single.dat
+ bar d1,d2 fill green,blue
+ fill x1,d1 color gray10
+end graph
diff --git a/gle-refman/appendix/fig/stack1.gle b/gle-refman/appendix/fig/stack1.gle
new file mode 100644
index 0000000..a5b589c
--- /dev/null
+++ b/gle-refman/appendix/fig/stack1.gle
@@ -0,0 +1,61 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 17 23 ! This is STACK1.GLE, a single graph, with shading background
+set hei .4
+amove .3 .3
+text stack1.gle
+
+amove 1.5 5
+box 15 16 fill gray60
+rmove -1 1
+box 15 16 fill white
+rmove 2 4
+box 11 8 fill gray5
+set font ss
+begin graph
+ fullsize
+ size 11 8
+ title "Data transfer on 9600 bit/sec line"
+ xtitle "Time (seconds)"
+ ytitle "K Bits"
+ data test.dat
+ d1 line marker wsquare mscale 2
+ xaxis min -1 max 6
+ yaxis min 0 max 11
+end graph
diff --git a/gle-refman/appendix/fig/stack2.gle b/gle-refman/appendix/fig/stack2.gle
new file mode 100644
index 0000000..d84eee3
--- /dev/null
+++ b/gle-refman/appendix/fig/stack2.gle
@@ -0,0 +1,102 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 18 26 box ! (uncomment box for debugging) This is STACK2.GLE
+amove 1.3 13.5 !14.5
+begin graph
+ size 16 12
+ nobox
+ xaxis min 0 max 20 dticks 4 dsubticks 1
+ xplaces 4 8 12 16 20 ! these would be set to match the dates
+ xnames "Sep 13" "Sep 23" "Oct 3" "Oct 13" "Oct 23"
+ xticks length .2
+ yticks length .2
+ yaxis min 0 max 75 dticks 10 dsubticks 5 nofirst
+ ytitle "Bud burst (%)"
+ xtitle ""
+ data test4.dat
+ d1 lstyle 1 marker wcircle msize .3
+ d2 lstyle 1 marker wsquare msize .3
+ d3 lstyle 2 marker wcircle msize .3
+ d4 lstyle 2 marker wsquare msize .3
+end graph
+set hei .4
+begin key
+ offset 8.2 3.3
+ text "Shelter row" lstyle 1 marker circle mscale .6
+ text "Shelter row + H " lstyle 1 marker square mscale .6
+ text "Middle row" lstyle 2 marker circle mscale .6
+ text "Middle row + H" lstyle 2 marker square mscale .6
+end key
+rmove 12 8
+text (a)
+
+amove 1.3 4
+set font rm hei .5
+begin graph
+ size 16 12
+ nobox
+ xaxis min 0 max 20 dticks 4 dsubticks 1
+ xplaces 4 8 12 16 20 ! these would be set to match the dates
+ xnames "Nov 10" "Nov 15" "Nov 20" "Nov 25" "Nov 30"
+ xticks length .2
+ yticks length .2
+ yaxis min 0 max 110 dticks 10 dsubticks 5
+ ytitle "Flowers per cane at full bloom "
+ xtitle ""
+ data test4.dat
+ d1 lstyle 1 marker circle msize .3
+ d2 lstyle 1 marker square msize .3 smooth
+ d3 lstyle 2 marker circle msize .3 smooth
+ d4 lstyle 2 marker square msize .3
+end graph
+rmove 12 9
+text (b)
+
+set hei .4
+amove 9 25
+text 22.
+amove 1.3 3
+begin text width 16
+ Figure 5. Influence of Hicane on the duration and timing of (a) bud burst
+ and (b) flowering of kiwifruit. (Note: this data has been made up)
+end text
+
+set just left
+amove .5 25
+text stack2.gle
diff --git a/gle-refman/appendix/fig/stack4b.gle b/gle-refman/appendix/fig/stack4b.gle
new file mode 100644
index 0000000..3ce598c
--- /dev/null
+++ b/gle-refman/appendix/fig/stack4b.gle
@@ -0,0 +1,92 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 17 26 ! box (uncomment box for measuring with ruler) STACK4B.GLE
+set font ss
+amove 3.5 19
+begin graph
+ size 10 5
+ data test.dat
+ title "Top graph, stack4b.gle" hei .5 dist 1
+ fullsize
+ xaxis min -1 max 6 dticks 1 hei .3 nofirst nolast
+ yaxis min 0 max 20 hei .3 dticks 5
+ x2labels on
+ d1 marker wsquare msize .4 lstyle 1
+ d2 marker dot msize 1 lstyle 2
+ fill x1,d1 color grid4 xmax 3
+ fill x1,d1 color gray20 xmin 3
+end graph
+
+rmove 0 -5
+begin graph
+ size 10 5
+ data test.dat
+ fullsize
+ xaxis min -1 max 6 dticks 1 hei .3 nofirst nolast
+ yaxis min 0 max 20 hei .3 dticks 5 nolast
+ bar d1,d2 width .2 dist .2 fill gray10,grid3 color black,black
+end graph
+
+rmove 0 -5
+begin graph
+ data test.dat
+ fullsize
+ size 10 5
+ xaxis min -1 max 6 dticks 1 hei .3 nofirst nolast
+ yaxis min 0 max 20 hei .3 dticks 5 nolast
+ xlabels off
+ y2labels on
+ d1 marker dot lstyle 2 err 10%
+ d2 marker dot lstyle 1 err 10%
+end graph
+
+rmove 0 -5
+begin graph
+ data test.dat
+ title "Bottom graph" hei .4 dist 0.0
+ fullsize
+ size 10 5
+ xaxis min -1 max 6 dticks 1 hei .3 nofirst nolast grid
+ yaxis min 0 max 20 hei .3 dticks 5 nolast grid
+ xticks lstyle 2 lwidth 0.0001 ! sets the grid line style
+ yticks lstyle 2 lwidth 0.0001
+ d1 marker wsquare msize .4 lstyle 2 key "Age"
+ key hei .5
+ d2 marker dot msize 1 lstyle 1 key "Width"
+end graph
diff --git a/gle-refman/appendix/fig/symbols.csv b/gle-refman/appendix/fig/symbols.csv
new file mode 100644
index 0000000..b3a57ee
--- /dev/null
+++ b/gle-refman/appendix/fig/symbols.csv
@@ -0,0 +1,190 @@
+AA
+AE
+Delta
+Downarrow
+Gamma
+Im
+L
+Lambda
+Leftarrow
+Leftrightarrow
+O
+OE
+Omega
+P
+Phi
+Pi
+Psi
+Re
+Rightarrow
+S
+Sigma
+Theta
+Uparrow
+Updownarrow
+Upsilon
+Xi
+aa
+ae
+aleph
+alpha
+amalg
+approx
+ast
+asymp
+backslash
+beta
+bigcap
+bigcirc
+bigcup
+bigodot
+bigoplus
+bigotimes
+bigsqcup
+bigtriangledown
+bigtriangleup
+biguplus
+bigvee
+bigwedge
+bot
+bullet
+cap
+cdot
+chi
+circ
+clubsuit
+coprod
+cup
+dag
+dagger
+dashv
+ddag
+ddagger
+degree
+delta
+diamond
+diamondsuit
+div
+downarrow
+ell
+emptyset
+epsilon
+equiv
+eta
+exists
+flat
+forall
+frown
+gamma
+geq
+gg
+heartsuit
+i
+imath
+in
+infty
+intop
+iota
+j
+jmath
+kappa
+l
+lambda
+land
+leftarrow
+leftharpoondown
+leftharpoonup
+leftrightarrow
+leq
+lhook
+ll
+lor
+mapsto
+mapstochar
+mid
+minus
+mp
+mu
+nabla
+natural
+nearrow
+neg
+neq
+ni
+not
+nu
+nwarrow
+o
+odot
+oe
+ointop
+omega
+ominus
+oplus
+oslash
+otimes
+owns
+parallel
+partial
+perp
+phi
+pi
+pm
+prec
+preceq
+prime
+prod
+propto
+psi
+rho
+rhook
+rightarrow
+rightharpoondown
+rightharpoonup
+searrow
+setminus
+sharp
+sigma
+sim
+simeq
+smallint
+smile
+spadesuit
+sqcap
+sqcup
+sqsubseteq
+sqsupseteq
+ss
+star
+subset
+subseteq
+succ
+succeq
+sum
+supset
+supseteq
+swarrow
+tau
+theta
+times
+top
+triangle
+triangleleft
+triangleright
+uparrow
+updownarrow
+uplus
+upsilon
+varepsilon
+varphi
+varpi
+varrho
+varsigma
+vartheta
+vdash
+vee
+wedge
+wp
+wr
+xi
+zeta
diff --git a/gle-refman/appendix/fig/symbols.gle b/gle-refman/appendix/fig/symbols.gle
new file mode 100644
index 0000000..52155fb
--- /dev/null
+++ b/gle-refman/appendix/fig/symbols.gle
@@ -0,0 +1,32 @@
+
+size 16 22
+
+symwd = 0.5
+wd = 4
+hi = 0.45
+
+set font texcmr
+
+dx = 0.25
+dy = 0.5
+
+x = 0
+y = 0
+nrows = 48
+
+fopen "symbols.csv" f1 read
+until feof(f1)
+ fread f1 sym$
+ amove x*wd+dx pageheight()-y*hi-dy
+ towrite$ = "\"+sym$
+ ! print towrite$
+ write towrite$
+ amove x*wd+dx+symwd pageheight()-y*hi-dy
+ tex "$\backslash{}$"+sym$
+ y = y + 1
+ if y = nrows then
+ y = 0
+ x = x + 1
+ end if
+next
+fclose f1
diff --git a/gle-refman/appendix/fig/t.gle b/gle-refman/appendix/fig/t.gle
new file mode 100644
index 0000000..e85176d
--- /dev/null
+++ b/gle-refman/appendix/fig/t.gle
@@ -0,0 +1,115 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 18 27
+box 18 27
+amove .2 .2
+box 18-.4 27-.4
+set just center hei 1.3
+amove 11.8 23
+
+set hei 2.1 font rmi
+for i = 0 to 1 step .05
+ set color (1-i)
+ text GLE 3.2
+ rmove -.05 .025
+next i
+set color white
+text GLE 3.2
+set color black
+rmove 6 0
+!text V3.2
+set hei .8 just center
+amove 9 21.5
+amove 11.8 21.3
+text A General Purpose
+rmove 0 -1
+text Graphics Package
+set just left hei .7
+set hei .401 ! font cmr10
+set font rm
+
+sub thetext
+begin text width 13
+
+There has long been a need for a high quality graphics
+package for scientists GLE combines a friendly user
+interface with a full range of facilities needed by
+scientists for producing publication graphs, diagrams,
+posters and slides. It provides LATEX quality text and
+symbol typsetting in a large variety of styles and sizes.
+
+GLE is superior to most other graphics packages in two
+main areas, firstly the module for producing graphs
+is extremely flexible allowing the user to specify any
+feature of the graph (down to the line width of the
+sub-ticks for example) and secondly in providing publication
+quality output (with filled in fonts) similar to that
+expected from a package like LaTeX.
+
+GLE is available for both PC's and the VAX giving an
+identical user interface on both platforms.
+
+end text
+end sub
+
+
+amove 2.5 16
+begin box fill grey40 noborder add .4
+ @thetext
+end box
+rmove -.5 .5
+begin box fill white add .4
+ @thetext
+end box
+ at thetext
+amove 2.5 16
+
+
+set hei 7 font rmi
+amove 2 2
+begin path clip stroke
+text GLE
+end path
+
+set lwidth .1
+amove 2 1.8
+for i = 0 to 40
+amove 2 2
+aline i 40-i
+next i
diff --git a/gle-refman/appendix/fig/test.dat b/gle-refman/appendix/fig/test.dat
new file mode 100644
index 0000000..8f92062
--- /dev/null
+++ b/gle-refman/appendix/fig/test.dat
@@ -0,0 +1,44 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+1 10 5 90 12
+3 30 15 80 22
+5 50 25 70 10
+8 80 40 60 15
+10 90 45 55 11
+14 70 35 50 14
+19 80 40 60 6
diff --git a/gle-refman/appendix/fig/test4.dat b/gle-refman/appendix/fig/test4.dat
new file mode 100644
index 0000000..8f92062
--- /dev/null
+++ b/gle-refman/appendix/fig/test4.dat
@@ -0,0 +1,44 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+1 10 5 90 12
+3 30 15 80 22
+5 50 25 70 10
+8 80 40 60 15
+10 90 45 55 11
+14 70 35 50 14
+19 80 40 60 6
diff --git a/gle-refman/appendix/fig/title.gle b/gle-refman/appendix/fig/title.gle
new file mode 100644
index 0000000..d69a012
--- /dev/null
+++ b/gle-refman/appendix/fig/title.gle
@@ -0,0 +1,88 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 18 27 box
+set font texcmr
+set hei 20
+
+amove 0 0
+for i = 1 to 100
+box 18 27/100 fill (i/100)
+rmove 0 27/100
+next i
+
+begin path clip
+amove 0 0
+box 18 27
+end path
+
+amove 5 0 !5 1
+gsave
+rotate 60 !65
+scale .7 .5 !1 .5
+begin path clip
+text GLE
+rmove 10 -8
+set hei 1.5
+text A General Purpose
+rmove 0 -2
+text Graphics Package
+end path
+amove 5 0 ! 5 1
+scale 1.43 2 !1 2
+rotate -60 !-65
+
+amove 0 0
+for j = 1 to 100
+box 18 27/100 fill (1-j/100) noborder
+rmove 0 27/100
+next j
+
+
+grestore
+
+amove 5 0!5 1
+rotate 60 ! 65
+scale .7 .5 !1 .5
+begin path stroke
+text GLE
+end path
+amove 5 0 !5 1
+scale 1.43 2
+rotate -60 !-65
+
diff --git a/gle-refman/appendix/fig/title32.gle b/gle-refman/appendix/fig/title32.gle
new file mode 100644
index 0000000..c73d491
--- /dev/null
+++ b/gle-refman/appendix/fig/title32.gle
@@ -0,0 +1,116 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 18 27
+box 18 27
+amove .2 .2
+box 18-.4 27-.4
+set just center hei 1.3
+amove 12.2 23
+
+set hei 2.1 font rmi
+for i = 0 to 1 step .05
+ set color (1-i)
+ text GLE
+ rmove -.05 .025
+next i
+set color white
+text GLE
+set color black
+set hei .8 just center
+amove 9 21.5
+amove 11.8 21.6
+text A General Purpose
+rmove 0 -.9
+text Graphics Package
+Rmove 0 -1.2
+set hei .6
+text Version 3.2
+set just left hei .7
+set hei .401 ! font cmr10
+set font rm
+
+sub thetext
+begin text width 13
+
+There has long been a need for a high quality graphics
+package for scientists GLE combines a user friendly
+interface with a full range of facilities needed by
+scientists for producing publication graphs, diagrams,
+posters and slides. It provides LaTeX quality text and
+symbol typesetting in a large variety of styles and sizes.
+
+GLE is superior to most other graphics packages in two
+main areas, firstly the module for producing graphs
+is extremely flexible allowing the user to specify any
+feature of the graph (down to the line width of the
+sub-ticks for example) and secondly in providing publication
+quality output (with filled in fonts) similar to that
+expected from a package like LaTeX.
+
+GLE is available for both PCs and VAXes giving an
+almost identical user interface on both platforms.
+
+end text
+end sub
+
+
+amove 2.5 16
+begin box fill grey40 noborder add .4
+ @thetext
+end box
+rmove -.5 .5
+begin box fill white add .4
+ @thetext
+end box
+ at thetext
+amove 2.5 16
+
+
+set hei 7 font rmi
+amove 2 2
+begin path clip stroke
+text GLE
+end path
+
+set lwidth .1
+amove 2 1.8
+for i = 0 to 40
+amove 2 2
+aline i 40-i
+next i
diff --git a/gle-refman/appendix/fig/tut_slide.gle b/gle-refman/appendix/fig/tut_slide.gle
new file mode 100644
index 0000000..14c4c00
--- /dev/null
+++ b/gle-refman/appendix/fig/tut_slide.gle
@@ -0,0 +1,51 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 18 24
+amove 9 20
+set font rm hei 3 just center
+text Costs
+amove 9 18
+set just tc hei .8 font ss
+begin table
+Sector Cost Result
+Farming $200 $40
+Chickens $45 $60
+Grass $150 $70
+end table
+
diff --git a/gle-refman/appendix/fig/wall.gle b/gle-refman/appendix/fig/wall.gle
new file mode 100644
index 0000000..8890fe3
--- /dev/null
+++ b/gle-refman/appendix/fig/wall.gle
@@ -0,0 +1,238 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 17 26 box ! this is for sticking on your wall
+ ! it has fonts, lstyles, shading, colors, markers on it.
+
+set hei 1 just center font psh
+amove 9 24.5 !25.5
+text GLE Wall Reference
+
+set just left
+set hei .3
+amove .3 .4
+text wall.gle
+amove 2 4
+sub sh f$
+ set just left
+ box -.5 .5 fill f$
+ RMOVE .2 .1
+ write f$
+ rmove -.2 .4
+end sub
+
+amove 9.5 10
+set hei .3 font ss
+begin box add .2
+begin text width 7
+The GRID and SHADE patterns should only be used for filling
+on PostScript printers, the gray levels and colors will work
+for both filling and color settings on any device.
+end text
+end box
+
+set font rm
+set hei .4
+amove 11.5 2
+ at sh "Shade"
+ at sh "Shade1"
+ at sh "Shade2"
+ at sh "Shade3"
+ at sh "Shade4"
+ at sh "Shade5"
+ at sh "Grid"
+ at sh "Grid1"
+ at sh "Grid2"
+ at sh "Grid3"
+ at sh "Grid4"
+ at sh "Grid5"
+
+amove 14.5 2
+ at sh "Red"
+ at sh "Green"
+ at sh "Blue"
+ at sh "Magenta"
+ at sh "Yellow"
+ at sh "Black"
+ at sh "White"
+ at sh "Gray10"
+ at sh "Gray20"
+ at sh "Gray40"
+ at sh "Gray60"
+ at sh "Gray80"
+
+sub mm name$
+ gsave
+ mk = mk+1
+ gsave
+ set lwidth .0001
+ set lstyle 1212
+ rmove 0 .4
+ rline 0 -.8
+ rmove 0 .4
+ grestore
+ marker name$ 1
+ rmove .3 0
+ rline .5 0
+ rmove .2 -.15
+ write name$
+ grestore
+ rmove 0 -.65
+end sub
+amove 9.5 22
+ at mm "circle"
+ at mm "triangle"
+ at mm "square"
+ at mm "diamond"
+ at mm "fcircle"
+ at mm "ftriangle"
+ at mm "fsquare"
+ at mm "fdiamond"
+ at mm "dot"
+ at mm "cross"
+ at mm "club"
+ at mm "heart"
+ at mm "star"
+ at mm "snake"
+
+amove 13.5 22
+ at mm "dag"
+ at mm "ddag"
+ at mm "asterisk"
+ at mm "oplus"
+ at mm "ominus"
+ at mm "otimes"
+ at mm "odot"
+ at mm "trianglez"
+ at mm "diamondz"
+ at mm "wcircle"
+ at mm "wtriangle"
+ at mm "wsquare"
+ at mm "wdiamond"
+
+
+
+sub fnt f$ n$
+ set font rm
+ set just right
+ write f$
+ rmove .5 0
+ set just left font f$
+ write n$
+ rmove -.5 -.6
+end sub
+
+set hei .4
+amove 2 14
+ at fnt "rm" "Roman"
+ at fnt "rmi" "Roman Italic"
+ at fnt "rmb" "Roman Bold"
+ at fnt "rmbi" "Roman Bold Italic"
+ at fnt "tt" "Typewriter"
+ at fnt "ttb" "Typewriter Bold"
+ at fnt "ss" "Sans Serif "
+ at fnt "ssb" "Sans Serif Bold"
+ at fnt "ssi" "Sans Serif Italic"
+ at fnt "psc" "PostScript Courier"
+ at fnt "psh" "PostScript Helvetica"
+ at fnt "psbl" "PostScript Bookman"
+ at fnt "psncsr" "PostScript New Century Schlblk Roman"
+ at fnt "pszcmi" "PostScript ZapfChancery-MediumItalic"
+ at fnt "pszd" "PostScript ZapfDingbats"
+
+if font("pltr") then
+ @fnt "pltr" "Plotter Triplex Roman"
+ @fnt "pldr" "Plotter Duplex Roman"
+ @fnt "plsr" "Plotter Simplex Roman"
+ @fnt "plge" "Plotter Gothic English"
+ @fnt "plci" "Plotter Complex Italic"
+ @fnt "plss" "Plotter Simplex Script"
+else
+ @fnt "psagb" "PostScript AvantGarde-Book"
+ @fnt "psagd" "PostScript AvantGarde-Demi"
+ @fnt "pssym" "PostScript Symbol"
+ @fnt "texcmr" "Computer Modern Roman"
+ @fnt "texcmb" "Computer Modern Bold"
+ @fnt "texcmti" "Computer Modern Text Italic"
+end if
+
+amove 2 20
+box 6 3
+begin origin
+ set hei .3 just left font rm
+ amove .5 2.5
+ for z = 0 to 4
+ set lstyle z
+ rline 2 0
+ rmove .1 0
+ write z
+ rmove -2.1 -.4
+ next z
+
+ amove 3.5 2.5
+ for z = 5 to 9
+ set lstyle z
+ rline 2 0
+ rmove .1 0
+ write z
+ rmove -2.1 -.4
+ next z
+
+ amove .5 .2
+ set lstyle 9229
+ rline 3 0
+ rmove .1 0
+ text 9229
+end origin
+
+sub lw ww wn$
+ set lwidth ww
+ rline 1 0
+ rmove .2 -.1
+ write wn$
+ rmove -1.2 .5
+end sub
+set hei .3 just left font ss
+amove 3 16
+ at lw 0 "lwidth 0"
+ at lw .0001 "lwidth 0.0001"
+ at lw .01 "lwidth 0.01"
+ at lw .02 "lwidth 0.02"
+ at lw .05 "lwidth 0.05"
+ at lw .1 "lwidth 0.1"
+ at lw .2 "lwidth 0.2"
diff --git a/gle-refman/appendix/fig/xend.gle b/gle-refman/appendix/fig/xend.gle
new file mode 100644
index 0000000..56f239a
--- /dev/null
+++ b/gle-refman/appendix/fig/xend.gle
@@ -0,0 +1,45 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+\begin{verbatim}
+ text abc
+ set color blue
+ amove xend() yend()
+ text def
+\end{verbatim}
+
diff --git a/gle-refman/appendix/fig/ziptext.gle b/gle-refman/appendix/fig/ziptext.gle
new file mode 100644
index 0000000..3a0be07
--- /dev/null
+++ b/gle-refman/appendix/fig/ziptext.gle
@@ -0,0 +1,49 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+sub ziptext tt$
+gsave
+for i = 1 to 0 step -.05
+ set color (i)
+ write tt$
+ rmove -.05 .025
+next i
+set color white
+write tt$
+grestore
+end sub
diff --git a/gle-refman/appendix/sm_clip.tex b/gle-refman/appendix/sm_clip.tex
new file mode 100644
index 0000000..f2cc133
--- /dev/null
+++ b/gle-refman/appendix/sm_clip.tex
@@ -0,0 +1,92 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% GLE - Graphics Layout Engine <http://www.gle-graphics.org/> %
+% %
+% Modified BSD License %
+% %
+% Copyright (C) 2009 GLE. %
+% %
+% Redistribution and use in source and binary forms, with or without %
+% modification, are permitted provided that the following conditions %
+% are met: %
+% %
+% 1. Redistributions of source code must retain the above copyright %
+% notice, this list of conditions and the following disclaimer. %
+% %
+% 2. Redistributions in binary form must reproduce the above %
+% copyright notice, this list of conditions and the following %
+% disclaimer in the documentation and/or other materials provided with %
+% the distribution. %
+% %
+% 3. The name of the author may not be used to endorse or promote %
+% products derived from this software without specific prior written %
+% permission. %
+% %
+% THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR %
+% IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED %
+% WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE %
+% ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY %
+% DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL %
+% DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE %
+% GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS %
+% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER %
+% IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR %
+% OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN %
+% IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%\psgraphin{stack1}{15.0}{23.0}{Shadow Graph}
+\graphin{appendix/fig/clip}{14.0cm}{19.0cm}{1}
+\addcontentsline{toc}{section}{Clipping}
+\clearpage
+\begin{center}
+\begin{minipage}[t]{12.0cm}
+%%\input{clip.gle}
+{\scriptsize %\footnotesize
+\begin{verbatim}
+size 18 24 ! This is CLIP.GLE, sets up an arbitrary clipping region.
+set hei .3 ! NOTE: CLIPPING ONLY WORKS ON POSTSCRIPT DEVICES.
+amove 2.3 .3 ! So this won't work on the pc-screen.
+text clip.gle
+
+set hei 10
+amove 2 2
+begin clip ! Save default clipping region
+ begin path clip ! Set up the clipping region
+ text GLE
+ end path
+ gsave
+ amove 2 2
+ text www ! Draw some text which will be clipped
+ for i = 1 to 90 ! Draw some lines which will be clipped
+ amove 2 2
+ rotate -1
+ rline 0 30
+ next i
+ grestore
+end clip ! restore default clipping region
+amove 0 0
+rline 10 10 ! draw a line which won't be clipped.
+!-----------------------------------------------------------------------------
+!Here's a simple example of how to set up a clipping region which consists
+!of two squares. Try this out
+amove 1 11
+begin origin
+ begin path clip stroke
+ amove 2 2
+ box 4 4
+ amove 7 2
+ box 4 4
+ end path
+ amove 2 2
+ set hei 4
+ text Here is clipped text
+end origin
+\end{verbatim}
+}
+\hfill {\small clip.gle}\\
+\end{minipage}
+
+\end{center}
+\vfill
diff --git a/gle-refman/appendix/sm_fonttables.tex b/gle-refman/appendix/sm_fonttables.tex
new file mode 100644
index 0000000..212f662
--- /dev/null
+++ b/gle-refman/appendix/sm_fonttables.tex
@@ -0,0 +1,188 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% GLE - Graphics Layout Engine <http://www.gle-graphics.org/> %
+% %
+% Modified BSD License %
+% %
+% Copyright (C) 2009 GLE. %
+% %
+% Redistribution and use in source and binary forms, with or without %
+% modification, are permitted provided that the following conditions %
+% are met: %
+% %
+% 1. Redistributions of source code must retain the above copyright %
+% notice, this list of conditions and the following disclaimer. %
+% %
+% 2. Redistributions in binary form must reproduce the above %
+% copyright notice, this list of conditions and the following %
+% disclaimer in the documentation and/or other materials provided with %
+% the distribution. %
+% %
+% 3. The name of the author may not be used to endorse or promote %
+% products derived from this software without specific prior written %
+% permission. %
+% %
+% THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR %
+% IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED %
+% WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE %
+% ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY %
+% DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL %
+% DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE %
+% GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS %
+% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER %
+% IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR %
+% OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN %
+% IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\psgraphin{ft_rm}{12.0}{9.0}{Font: Roman }
+\vfill
+\psgraphin{ft_rmb}{12.0}{9.0}{Font: Roman Bold }
+\clearpage
+\psgraphin{ft_rmi}{12.0}{9.0}{Font: Roman Italic }
+\vfill
+\psgraphin{ft_ss}{12.0}{9.0}{Font: San Serif }
+\clearpage
+\psgraphin{ft_ssb}{12.0}{9.0}{Font: San Serif Bold }
+\vfill
+\psgraphin{ft_ssi}{12.0}{9.0}{Font: San Serif Italic }
+\clearpage
+\psgraphin{ft_tt}{12.0}{9.0}{Font: Typewriter }
+\vfill
+\psgraphin{ft_ttb}{12.0}{9.0}{Font: Typewriter Bold }
+\clearpage
+\psgraphin{ft_tti}{12.0}{9.0}{Font: Typewriter Italic }
+\vfill
+\psgraphin{ft_texcmb}{12.0}{9.0}{Font: \TeX Computer Modern Bold }
+\clearpage
+\psgraphin{ft_texcmex}{12.0}{9.0}{Font: \TeX Computer Modern Extensible }
+\vfill
+\psgraphin{ft_texcmitt}{12.0}{9.0}{Font: \TeX Computer Modern Italic Typewriter }
+\clearpage
+\psgraphin{ft_texcmmi}{12.0}{9.0}{Font: \TeX Computer Modern Maths Italic }
+\vfill
+\psgraphin{ft_texcmr}{12.0}{9.0}{Font: \TeX Computer Modern Roman }
+\clearpage
+\psgraphin{ft_texcmss}{12.0}{9.0}{Font: \TeX Computer Modern Sans Serif }
+\vfill
+\psgraphin{ft_texcmssb}{12.0}{9.0}{Font: \TeX Computer Modern Sans Serif Bold }
+\clearpage
+\psgraphin{ft_texcmssi}{12.0}{9.0}{Font: \TeX Computer Modern Sans Serif Italic }
+\vfill
+\psgraphin{ft_texcmsy}{12.0}{9.0}{Font: \TeX Computer Modern Symbol }
+\clearpage
+\psgraphin{ft_texcmti}{12.0}{9.0}{Font: \TeX Computer Modern Text Italic }
+\vfill
+\psgraphin{ft_texcmtt}{12.0}{9.0}{Font: \TeX Computer Modern Typewriter Text }
+\clearpage
+\psgraphin{ft_plba}{12.0}{9.0}{Font: Plotter Block Ascii }
+\vfill
+\psgraphin{ft_plcc}{12.0}{9.0}{Font: Plotter Complex Cartographic }
+\clearpage
+\psgraphin{ft_plcg}{12.0}{9.0}{Font: Plotter Complex Gothic }
+\vfill
+\psgraphin{ft_plci}{12.0}{9.0}{Font: Plotter Complex Italic }
+\clearpage
+\psgraphin{ft_plcr}{12.0}{9.0}{Font: Plotter Complex Roman }
+\vfill
+\psgraphin{ft_plcs}{12.0}{9.0}{Font: Plotter Complex Script }
+\clearpage
+\psgraphin{ft_pldr}{12.0}{9.0}{Font: Plotter Duplex Roman }
+\vfill
+\psgraphin{ft_plge}{12.0}{9.0}{Font: Plotter Gothic English }
+\clearpage
+\psgraphin{ft_plgg}{12.0}{9.0}{Font: Plotter Gothic German }
+\vfill
+\psgraphin{ft_plgi}{12.0}{9.0}{Font: Plotter Gothic Italian }
+\clearpage
+\psgraphin{ft_plsa}{12.0}{9.0}{Font: Plotter Simplex Ascii }
+\vfill
+\psgraphin{ft_plsg}{12.0}{9.0}{Font: Plotter Simplex German }
+\clearpage
+\psgraphin{ft_plsr}{12.0}{9.0}{Font: Plotter Simplex Roman }
+\vfill
+\psgraphin{ft_plss}{12.0}{9.0}{Font: Plotter Simplex Script }
+\clearpage
+\psgraphin{ft_plsym1}{12.0}{9.0}{Font: Plotter Symbols one }
+\vfill
+\psgraphin{ft_plsym2}{12.0}{9.0}{Font: Plotter Symbols two }
+\clearpage
+\psgraphin{ft_plti}{12.0}{9.0}{Font: Plotter Triplex Italic }
+\vfill
+\psgraphin{ft_pltr}{12.0}{9.0}{Font: Plotter Triplex Roman }
+\clearpage
+\psgraphin{ft_psagb}{12.0}{9.0}{Font: PostScript AvantGarde-Book }
+\vfill
+\psgraphin{ft_psagbo}{12.0}{9.0}{Font: PostScript AvantGarde-BookOblique }
+\clearpage
+\psgraphin{ft_psagd}{12.0}{9.0}{Font: PostScript AvantGarde-Demi }
+\vfill
+\psgraphin{ft_psagdo}{12.0}{9.0}{Font: PostScript AvantGarde-DemiOblique }
+\clearpage
+\psgraphin{ft_psbd}{12.0}{9.0}{Font: PostScript Bookman-Demi }
+\vfill
+\psgraphin{ft_psbdi}{12.0}{9.0}{Font: PostScript Bookman-DemiItalic }
+\clearpage
+\psgraphin{ft_psbli}{12.0}{9.0}{Font: PostScript Bookman-LightItalic }
+\vfill
+\psgraphin{ft_psc}{12.0}{9.0}{Font: PostScript Courier }
+\clearpage
+\psgraphin{ft_pscb}{12.0}{9.0}{Font: PostScript Courier-Bold }
+\vfill
+\psgraphin{ft_pscbo}{12.0}{9.0}{Font: PostScript Courier-BoldOblique }
+\clearpage
+\psgraphin{ft_psco}{12.0}{9.0}{Font: PostScript Courier-Oblique }
+\vfill
+\psgraphin{ft_psh}{12.0}{9.0}{Font: PostScript Helvetica }
+\clearpage
+\psgraphin{ft_pshb}{12.0}{9.0}{Font: PostScript Helvetica-Bold }
+\vfill
+\psgraphin{ft_pshbo}{12.0}{9.0}{Font: PostScript Helvetica-BoldOblique }
+\clearpage
+\psgraphin{ft_psho}{12.0}{9.0}{Font: PostScript Helvetica-Oblique }
+\vfill
+\psgraphin{ft_pshc}{12.0}{9.0}{Font: PostScript Helvetica-Condensed }
+\clearpage
+\psgraphin{ft_pshcb}{12.0}{9.0}{Font: PostScript Helvetica-Condensed-Bold }
+\vfill
+\psgraphin{ft_pshcdo}{12.0}{9.0}{Font: PostScript Helvetica-Condensed-BoldOblique }
+\clearpage
+\psgraphin{ft_pshn}{12.0}{9.0}{Font: PostScript Helvetica-Narrow }
+\vfill
+\psgraphin{ft_pshnb}{12.0}{9.0}{Font: PostScript Helvetica-Narrow-Bold }
+\clearpage
+\psgraphin{ft_pshnbo}{12.0}{9.0}{Font: PostScript Helvetica-Narrow-BoldOblique }
+\vfill
+\psgraphin{ft_pshno}{12.0}{9.0}{Font: PostScript Helvetica-NarrowOblique }
+\clearpage
+\psgraphin{ft_psncsb}{12.0}{9.0}{Font: PostScript NewCenturySchlbk-Bold }
+\vfill
+\psgraphin{ft_psncsbi}{12.0}{9.0}{Font: PostScript NewCenturySchlbk-BoldItalic }
+\clearpage
+\psgraphin{ft_psncsi}{12.0}{9.0}{Font: PostScript NewCenturySchlbk-Italic }
+\vfill
+\psgraphin{ft_psncsr}{12.0}{9.0}{Font: PostScript NewCenturySchlbk-Roman }
+\clearpage
+\psgraphin{ft_pspb}{12.0}{9.0}{Font: PostScript Palatino-Bold }
+\vfill
+\psgraphin{ft_pspbi}{12.0}{9.0}{Font: PostScript Palatino-BoldItalic }
+\clearpage
+\psgraphin{ft_pspi}{12.0}{9.0}{Font: PostScript Palatino-Italic }
+\vfill
+\psgraphin{ft_pspr}{12.0}{9.0}{Font: PostScript Palatino-Roman }
+\clearpage
+\psgraphin{ft_pssym}{12.0}{9.0}{Font: PostScript Symbol }
+\vfill
+\psgraphin{ft_pstb}{12.0}{9.0}{Font: PostScript Times-Bold }
+\clearpage
+\psgraphin{ft_pstbi}{12.0}{9.0}{Font: PostScript Times-BoldItalic }
+\vfill
+\psgraphin{ft_psti}{12.0}{9.0}{Font: PostScript Times-Italic }
+\clearpage
+\psgraphin{ft_pstr}{12.0}{9.0}{Font: PostScript Times-Roman }
+\vfill
+\psgraphin{ft_pszcmi}{12.0}{9.0}{Font: PostScript ZapfChancery-MediumItalic }
+\clearpage
+\psgraphin{ft_pszd}{12.0}{9.0}{Font: PostScript ZapfDingbats }
+\vfill
diff --git a/gle-refman/appendix/sm_join.tex b/gle-refman/appendix/sm_join.tex
new file mode 100644
index 0000000..f175ca2
--- /dev/null
+++ b/gle-refman/appendix/sm_join.tex
@@ -0,0 +1,117 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% GLE - Graphics Layout Engine <http://www.gle-graphics.org/> %
+% %
+% Modified BSD License %
+% %
+% Copyright (C) 2009 GLE. %
+% %
+% Redistribution and use in source and binary forms, with or without %
+% modification, are permitted provided that the following conditions %
+% are met: %
+% %
+% 1. Redistributions of source code must retain the above copyright %
+% notice, this list of conditions and the following disclaimer. %
+% %
+% 2. Redistributions in binary form must reproduce the above %
+% copyright notice, this list of conditions and the following %
+% disclaimer in the documentation and/or other materials provided with %
+% the distribution. %
+% %
+% 3. The name of the author may not be used to endorse or promote %
+% products derived from this software without specific prior written %
+% permission. %
+% %
+% THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR %
+% IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED %
+% WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE %
+% ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY %
+% DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL %
+% DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE %
+% GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS %
+% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER %
+% IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR %
+% OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN %
+% IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%\psgraphin{stack1}{15.0}{23.0}{Shadow Graph}
+\graphin{appendix/fig/join}{14.0cm}{19.0cm}{1}
+\addcontentsline{toc}{section}{Joining Objects}
+\clearpage
+\begin{center}
+\begin{minipage}[t]{12.0cm}
+%%\input{join.gle}
+{\scriptsize %\footnotesize
+\begin{verbatim}
+size 18 24 box ! This is JOIN.GLE, demonstrates the join commands.
+set hei .3
+amove .3 .3
+text join.gle
+
+set hei 1.3 just center
+amove 9 21
+text Joining named objects
+
+set hei .8 lwidth .1
+amove 8.8 18.8
+begin box name line
+ rline 0 -8.2
+end box
+set lwidth 0
+
+amove 9.67745 8.7603
+begin box name cir nobox
+ circle 1
+end box
+circle 1
+amove 12.7461 4.59445
+begin box name hi add .2
+ text Hi there
+end box
+amove 3.14401 17.0566
+begin box name grv add .2
+ text GRV
+end box
+amove 14.9533 12.2986
+begin box name chv add .2
+ text CHV
+end box
+amove 12.5179 17.6103
+begin box name cheese add .2
+ text Cheese
+end box
+amove 2.7381 11.229
+begin box name goats add .2
+ text Goats
+end box
+! Now draw the lines between objects
+join chv - goats
+join grv -> line.h ! Note: ".h" means to join horizontally.
+join line.h <-> cheese.tl
+join cheese.tr - chv.tr
+join cir.ci <- hi ! Note: ".ci" is used for circles
+join cir.ci <- chv
+join cir.ci <- goats
+!-----------------------------------------------------------------------------
+! A pie slice (Will only work on PostScript it uses BEGIN PATH FILL).
+sub pie ang1 ang2 radius color$
+begin path fill color$ stroke
+ rmove 0 0
+ arc radius ang1 ang2
+ closepath
+end path
+end sub
+
+amove 3 2
+ at pie 0 10 2 "grey10"
+ at pie 10 40 2 "grey20"
+ at pie 40 120 2 "blue"
+\end{verbatim}
+}
+\hfill {\small join.gle}\\
+\end{minipage}
+
+\end{center}
+\vfill
diff --git a/gle-refman/appendix/sm_loop.tex b/gle-refman/appendix/sm_loop.tex
new file mode 100644
index 0000000..57cf178
--- /dev/null
+++ b/gle-refman/appendix/sm_loop.tex
@@ -0,0 +1,113 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% GLE - Graphics Layout Engine <http://www.gle-graphics.org/> %
+% %
+% Modified BSD License %
+% %
+% Copyright (C) 2009 GLE. %
+% %
+% Redistribution and use in source and binary forms, with or without %
+% modification, are permitted provided that the following conditions %
+% are met: %
+% %
+% 1. Redistributions of source code must retain the above copyright %
+% notice, this list of conditions and the following disclaimer. %
+% %
+% 2. Redistributions in binary form must reproduce the above %
+% copyright notice, this list of conditions and the following %
+% disclaimer in the documentation and/or other materials provided with %
+% the distribution. %
+% %
+% 3. The name of the author may not be used to endorse or promote %
+% products derived from this software without specific prior written %
+% permission. %
+% %
+% THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR %
+% IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED %
+% WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE %
+% ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY %
+% DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL %
+% DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE %
+% GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS %
+% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER %
+% IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR %
+% OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN %
+% IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%\psgraphin{loop}{15.0}{25.0}{Loop, Subroutines}
+\graphin{appendix/fig/loop}{15.0cm}{25.0cm}{1}
+\addcontentsline{toc}{section}{Loop, Subroutines}
+\clearpage
+\begin{center}
+\begin{minipage}[t]{12.0cm}
+%%\input{loop.gle}
+{\scriptsize %\footnotesize
+\begin{verbatim}
+size 17 17 box !18 24 box ! This is LOOP.GLE, shows programming examples
+amove 5 14
+set just center hei 1
+text Subroutines, Loops
+set just left hei .7
+set hei .9
+
+! First define a single neuron
+sub neuron xx yy
+ amove xx yy
+ begin scale .5 .5
+ curve 0 .4 .4 .4 .4 -.4 .4 .4 .4 -.8 -.4 -.8 -.4 .4
+ curve -.4 -.8 -.4 .4 -.4 -.4 -.4 .4 0 .4
+ closepath
+ end scale
+end sub
+
+! Draw the neurons
+for xx = 0 to 1
+ for i = 1 to 6
+ @neuron xx*6+2 i*2+1.2
+ next i
+next xx
+
+! Draw the lines between them
+for i = 1 to 6
+ for j = 1 to 6
+ amove 3 i*2+1
+ aline 7.5 j*2+1
+ next j
+next i
+
+!--------------------------------------------------------------------------
+include ziptext.gle
+amove 12 1
+ at ziptext "Hello"
+amove 13 4
+begin rotate 20
+ @ziptext "Green trees"
+end rotate
+\end{verbatim}
+}
+\hfill {\small loop.gle}\\
+%
+%%\input{loop.gle}
+{\scriptsize %\footnotesize
+\begin{verbatim}
+sub ziptext tt$
+gsave
+for i = 1 to 0 step -.05
+ set color (i)
+ write tt$
+ rmove -.05 .025
+next i
+set color white
+write tt$
+grestore
+end sub
+
+\end{verbatim}
+}
+\hfill {\small ziptext.gle}\\
+%
+\end{minipage}
+\end{center}
+\vfill
diff --git a/gle-refman/appendix/sm_single.tex b/gle-refman/appendix/sm_single.tex
new file mode 100644
index 0000000..715af19
--- /dev/null
+++ b/gle-refman/appendix/sm_single.tex
@@ -0,0 +1,71 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% GLE - Graphics Layout Engine <http://www.gle-graphics.org/> %
+% %
+% Modified BSD License %
+% %
+% Copyright (C) 2009 GLE. %
+% %
+% Redistribution and use in source and binary forms, with or without %
+% modification, are permitted provided that the following conditions %
+% are met: %
+% %
+% 1. Redistributions of source code must retain the above copyright %
+% notice, this list of conditions and the following disclaimer. %
+% %
+% 2. Redistributions in binary form must reproduce the above %
+% copyright notice, this list of conditions and the following %
+% disclaimer in the documentation and/or other materials provided with %
+% the distribution. %
+% %
+% 3. The name of the author may not be used to endorse or promote %
+% products derived from this software without specific prior written %
+% permission. %
+% %
+% THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR %
+% IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED %
+% WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE %
+% ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY %
+% DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL %
+% DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE %
+% GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS %
+% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER %
+% IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR %
+% OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN %
+% IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\addcontentsline{toc}{section}{A Single Graph}
+\psgraphin{appendix/fig/single}{12.0}{9.0}{Single Graph}
+%%\graphin{single}{12.0cm}{9.0cm}{1}
+
+\vfill
+%%\input{single.gle}
+\begin{center}
+\begin{minipage}[t]{9.0cm}
+\begin{verbatim}
+size 12 9 box
+begin graph
+ SIZE 12 9
+ Title "Bar example"
+ data single.dat
+ bar d1,d2 fill green,blue
+ fill x1,d1 color grey10
+end graph
+\end{verbatim}
+\hfill {\small single.gle}\\
+\vfill
+%%\input{single.dat}
+\begin{verbatim}
+0 2 6
+1 10 16
+2 3 6
+3 6 3
+4 5 4
+5 3 7
+\end{verbatim}
+\hfill {\small single.dat}\\
+\end{minipage}
+\end{center}
+%%\vfill
diff --git a/gle-refman/appendix/sm_stack1.tex b/gle-refman/appendix/sm_stack1.tex
new file mode 100644
index 0000000..4ad3b32
--- /dev/null
+++ b/gle-refman/appendix/sm_stack1.tex
@@ -0,0 +1,78 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% GLE - Graphics Layout Engine <http://www.gle-graphics.org/> %
+% %
+% Modified BSD License %
+% %
+% Copyright (C) 2009 GLE. %
+% %
+% Redistribution and use in source and binary forms, with or without %
+% modification, are permitted provided that the following conditions %
+% are met: %
+% %
+% 1. Redistributions of source code must retain the above copyright %
+% notice, this list of conditions and the following disclaimer. %
+% %
+% 2. Redistributions in binary form must reproduce the above %
+% copyright notice, this list of conditions and the following %
+% disclaimer in the documentation and/or other materials provided with %
+% the distribution. %
+% %
+% 3. The name of the author may not be used to endorse or promote %
+% products derived from this software without specific prior written %
+% permission. %
+% %
+% THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR %
+% IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED %
+% WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE %
+% ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY %
+% DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL %
+% DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE %
+% GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS %
+% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER %
+% IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR %
+% OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN %
+% IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%\psgraphin{stack1}{15.0}{23.0}{Shadow Graph}
+\graphin{appendix/fig/stack1}{15.0cm}{23.0cm}{1}
+\addcontentsline{toc}{section}{Shadow Graph}
+\clearpage
+\begin{center}
+\begin{minipage}[t]{12.0cm}
+%%\input{stack1.gle}
+{\scriptsize %\footnotesize
+\begin{verbatim}
+size 17 23 ! This is STACK1.GLE, a single graph, with shading background
+set hei .4
+amove .3 .3
+text stack1.gle
+
+amove 1.5 5
+box 15 16 fill grey60
+rmove -1 1
+box 15 16 fill white
+rmove 2 4
+box 11 8 fill grey5
+set font ss
+begin graph
+ fullsize
+ size 11 8
+ title "Data transfer on 9600 bit/sec line"
+ xtitle "Time (seconds)"
+ ytitle "K Bits"
+ data test.dat
+ d1 line marker wsquare mscale 2
+ xaxis min -1 max 6
+ yaxis min 0 max 11
+end graph
+
+\end{verbatim}
+}
+\hfill {\small stack1.gle}\\
+\end{minipage}
+
+\end{center}
+\vfill
diff --git a/gle-refman/appendix/sm_stack2.tex b/gle-refman/appendix/sm_stack2.tex
new file mode 100644
index 0000000..eafac41
--- /dev/null
+++ b/gle-refman/appendix/sm_stack2.tex
@@ -0,0 +1,135 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% GLE - Graphics Layout Engine <http://www.gle-graphics.org/> %
+% %
+% Modified BSD License %
+% %
+% Copyright (C) 2009 GLE. %
+% %
+% Redistribution and use in source and binary forms, with or without %
+% modification, are permitted provided that the following conditions %
+% are met: %
+% %
+% 1. Redistributions of source code must retain the above copyright %
+% notice, this list of conditions and the following disclaimer. %
+% %
+% 2. Redistributions in binary form must reproduce the above %
+% copyright notice, this list of conditions and the following %
+% disclaimer in the documentation and/or other materials provided with %
+% the distribution. %
+% %
+% 3. The name of the author may not be used to endorse or promote %
+% products derived from this software without specific prior written %
+% permission. %
+% %
+% THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR %
+% IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED %
+% WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE %
+% ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY %
+% DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL %
+% DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE %
+% GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS %
+% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER %
+% IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR %
+% OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN %
+% IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\addcontentsline{toc}{section}{Stack of Two Graphs}
+\psgraphin{appendix/fig/stack2}{15.0}{25.0}{Stack of 2 Graphs}
+% \graphin{stack2}{15.0cm}{25.0cm}{Stack of 2 Graphs}
+\clearpage
+\vfill
+\begin{center}
+\begin{minipage}[t]{12.0cm}
+%%\input{stack2.gle}
+{\scriptsize %\footnotesize
+\begin{verbatim}
+size 18 27 box ! (uncomment box for debugging) This is STACK2.GLE
+amove 1.3 14.5
+begin graph
+ size 16 12
+ nobox
+ xaxis min 0 max 20 dticks 4 dsubticks 1
+ xplaces 4 8 12 16 20 ! these would be set to match the dates
+ xnames "Sep 13" "Sep 23" "Oct 3" "Oct 13" "Oct 23"
+ xticks length .2
+ yticks length .2
+ yaxis min 0 max 75 dticks 10 dsubticks 5 nofirst
+ ytitle "Bud burst (%)"
+ xtitle ""
+ data TEST4.DAT
+ d1 lstyle 1 marker wcircle msize .3
+ d2 lstyle 1 marker wsquare msize .3
+ d3 lstyle 2 marker wcircle msize .3
+ d4 lstyle 2 marker wsquare msize .3
+end graph
+set hei .4
+begin key
+ offset 8.2 2.3
+ text "Shelter row" lstyle 1 marker circle mscale .6
+ text "Shelter row + H " lstyle 1 marker square mscale .6
+ text "Middle row" lstyle 2 marker circle mscale .6
+ text "Middle row + H" lstyle 2 marker square mscale .6
+end key
+rmove 12 9
+text (a)
+
+amove 1.3 4
+set font rm hei .5
+begin graph
+ size 16 12
+ nobox
+ xaxis min 0 max 20 dticks 4 dsubticks 1
+ xplaces 4 8 12 16 20 ! these would be set to match the dates
+ xnames "Nov 10" "Nov 15" "Nov 20" "Nov 25" "Nov 30"
+ xticks length .2
+ yticks length .2
+ yaxis min 0 max 110 dticks 10 dsubticks 5
+ ytitle "Flowers per cane at full bloom "
+ xtitle ""
+ data TEST4.DAT
+ d1 lstyle 1 marker circle msize .3
+ d2 lstyle 1 marker square msize .3 smooth
+ d3 lstyle 2 marker circle msize .3 smooth
+ d4 lstyle 2 marker square msize .3
+end graph
+rmove 12 9
+text (b)
+
+set hei .4
+amove 9 26
+text 22.
+amove 1.3 3
+begin text width 16
+ Figure 5. Influence of Hicane on the duration and timing of (a) bud burst
+ and (b) flowering of kiwifruit. (Note: this data has been made up)
+end text
+
+set just left
+amove .5 26
+text stack2.gle
+\end{verbatim}
+} %% \footnotesize
+\hfill {\small stack2.gle}\\
+\vspace*{-4.0ex} %\vfill
+%%\input{test4.dat}
+{\footnotesize
+\begin{verbatim}
+1 10 5 90 12
+3 30 15 80 22
+5 50 25 70 10
+8 80 40 60 15
+10 90 45 55 11
+14 70 35 50 14
+19 80 40 60 6
+\end{verbatim}
+}
+\hfill {\small test4.dat}\\
+\end{minipage}
+\end{center}
+\vfill
+%\psgraphin{stack2}{15.0}{25.0}{Stack of 2 Graphs}
+%\graphin{stack2}{15.0cm}{25.0cm}{Stack of 2 Graphs}
+%\clearpage
diff --git a/gle-refman/appendix/sm_stack4b.tex b/gle-refman/appendix/sm_stack4b.tex
new file mode 100644
index 0000000..d52df02
--- /dev/null
+++ b/gle-refman/appendix/sm_stack4b.tex
@@ -0,0 +1,107 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% GLE - Graphics Layout Engine <http://www.gle-graphics.org/> %
+% %
+% Modified BSD License %
+% %
+% Copyright (C) 2009 GLE. %
+% %
+% Redistribution and use in source and binary forms, with or without %
+% modification, are permitted provided that the following conditions %
+% are met: %
+% %
+% 1. Redistributions of source code must retain the above copyright %
+% notice, this list of conditions and the following disclaimer. %
+% %
+% 2. Redistributions in binary form must reproduce the above %
+% copyright notice, this list of conditions and the following %
+% disclaimer in the documentation and/or other materials provided with %
+% the distribution. %
+% %
+% 3. The name of the author may not be used to endorse or promote %
+% products derived from this software without specific prior written %
+% permission. %
+% %
+% THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR %
+% IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED %
+% WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE %
+% ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY %
+% DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL %
+% DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE %
+% GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS %
+% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER %
+% IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR %
+% OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN %
+% IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%\psgraphin{stack4b}{15.0}{25.0}{Stack of 4 Graphs}
+\graphin{appendix/fig/stack4b}{13.0cm}{25.0cm}{1}
+\addcontentsline{toc}{section}{Stack of Four Graphs}
+\clearpage
+\begin{center}
+\begin{minipage}[t]{12.0cm}
+%%\input{stack4b.gle}
+{\scriptsize %\footnotesize
+\begin{verbatim}
+size 17 26 ! box (uncomment box for measuring with ruler) STACK4B.GLE
+set font ss
+amove 3.5 19
+begin graph
+ size 10 5
+ data TEST.DAT
+ title "Top graph, stack4b.gle" hei .5 dist 1
+ fullsize
+ xaxis min -1 max 6 dticks 1 hei .3 nofirst nolast
+ yaxis min 0 max 20 hei .3 dticks 5
+ x2labels on
+ d1 marker wsquare msize .4 lstyle 1
+ d2 marker dot msize 1 lstyle 2
+ fill x1,d1 color grid4 xmax 3
+ fill x1,d1 color grey20 xmin 3
+end graph
+
+rmove 0 -5
+begin graph
+ size 10 5
+ data TEST.DAT
+ fullsize
+ xaxis min -1 max 6 dticks 1 hei .3 nofirst nolast
+ yaxis min 0 max 20 hei .3 dticks 5 nolast
+ bar d1,d2 width .2 dist .2 fill grey10,grid3 color black,black
+end graph
+
+rmove 0 -5
+begin graph
+ data TEST.DAT
+ fullsize
+ size 10 5
+ xaxis min -1 max 6 dticks 1 hei .3 nofirst nolast
+ yaxis min 0 max 20 hei .3 dticks 5 nolast
+ xlabels off
+ y2labels on
+ d1 marker dot lstyle 2 err 10%
+ d2 marker dot lstyle 1 err 10%
+end graph
+
+rmove 0 -5
+begin graph
+ data TEST.DAT
+ title "Bottom graph" hei .4 dist 0.0
+ fullsize
+ size 10 5
+ xaxis min -1 max 6 dticks 1 hei .3 nofirst nolast grid
+ yaxis min 0 max 20 hei .3 dticks 5 nolast grid
+ xticks lstyle 2 lwidth 0.0001 ! sets the grid line style
+ yticks lstyle 2 lwidth 0.0001
+ d1 marker wsquare msize .4 lstyle 2 key "Age"
+ key hei .5
+ d2 marker dot msize 1 lstyle 1 key "Width"
+end graph
+\end{verbatim}
+}
+\hfill {\small stack4b.gle}\\
+\end{minipage}
+\end{center}
+\vfill
diff --git a/gle-refman/appendix/sym.tex b/gle-refman/appendix/sym.tex
new file mode 100644
index 0000000..80656a1
--- /dev/null
+++ b/gle-refman/appendix/sym.tex
@@ -0,0 +1,86 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% GLE - Graphics Layout Engine <http://www.gle-graphics.org/> %
+% %
+% Modified BSD License %
+% %
+% Copyright (C) 2009 GLE. %
+% %
+% Redistribution and use in source and binary forms, with or without %
+% modification, are permitted provided that the following conditions %
+% are met: %
+% %
+% 1. Redistributions of source code must retain the above copyright %
+% notice, this list of conditions and the following disclaimer. %
+% %
+% 2. Redistributions in binary form must reproduce the above %
+% copyright notice, this list of conditions and the following %
+% disclaimer in the documentation and/or other materials provided with %
+% the distribution. %
+% %
+% 3. The name of the author may not be used to endorse or promote %
+% products derived from this software without specific prior written %
+% permission. %
+% %
+% THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR %
+% IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED %
+% WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE %
+% ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY %
+% DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL %
+% DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE %
+% GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS %
+% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER %
+% IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR %
+% OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN %
+% IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\newpage
+\section{\LaTeX\ Macros}
+\label{ltxsym:sec}
+\index{\LaTeX!macros}
+
+\index{\LaTeX} There are several \LaTeX\ like commands
+which can be used within text, they are:
+
+\vspace{0.5cm}
+\begin{tabular}{ll}
+\verb+\` \' \v \u \= \^+ & Implemented TeX accents \\
+\verb+\. \H \~ \''+ & Implemented TeX accents \\
+\verb+^{}+ & Superscript \\
+\verb+_{}+ & Subscript \\
+\verb+\\+ & Forced newline \\
+\verb+\_+ & Underscore character \\
+\verb+\,+ & 0.5em (em = width of the letter `m') \\
+\verb+\:+ & 1em space \\
+\verb+\;+ & 2em space \\
+\verb+\!+ & -0.5em space \\
+\verb+\tex{expression}+ & Any LaTeX expression \\
+\verb+\char{22}+ & Any character in current font \\
+\verb+\chardef{a}{hello}+ & Define a character as a macro \\
+\verb+\def\v{hello}+ & Defines a macro \\
+\verb+\movexy{2}{3}+ & Moves the current text point \\
+\verb+\glass+ & Makes move/space work on beginning of line \\
+\verb+\it+ & Switches to italic font \\
+\verb+\kern{-0.1em}+ & Change inter character distance \\
+\verb+\ldots+ & $\ldots$ \\
+\verb+\lineskip{.1}+ & Sets the default distance between lines of text \\
+\verb+\linegap{-1}+ & Sets the minimum required gap between lines \\
+\verb+\lower{0.1em}{hello}+ & Lower the given text \\
+\verb+\parskip{0.1em}+ & Set distance between paragraphs \\
+\verb+\raise{0.1em}{hello}+ & Raise the given text \\
+\verb+\rm+ & Switches to roman font \\
+\verb+\bf+ & Switches to bold font \\
+\verb+\rule{2}{4}+ & Draws a filled in box, 2cm by 4cm \\
+\verb+\setfont{rmb}+ & Sets the current text font \\
+\verb+\sethei{.3}+ & Sets the font height (in cm) \\
+\verb+\setstretch{2}+ & Scales the quantity of glue between words \\
+\verb+\tt+ & Switches to typewriter (fixed space) font \\
+\end{tabular}
+
+\newpage
+\section{\LaTeX\ Symbols}
+\index{symbols}
+
+\mbox{\input{appendix/fig/symbols.inc}}
diff --git a/gle-refman/cmd.sty b/gle-refman/cmd.sty
new file mode 100644
index 0000000..7a8a3b6
--- /dev/null
+++ b/gle-refman/cmd.sty
@@ -0,0 +1,41 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% GLE - Graphics Layout Engine <http://www.gle-graphics.org/> %
+% %
+% Modified BSD License %
+% %
+% Copyright (C) 2009 GLE. %
+% %
+% Redistribution and use in source and binary forms, with or without %
+% modification, are permitted provided that the following conditions %
+% are met: %
+% %
+% 1. Redistributions of source code must retain the above copyright %
+% notice, this list of conditions and the following disclaimer. %
+% %
+% 2. Redistributions in binary form must reproduce the above %
+% copyright notice, this list of conditions and the following %
+% disclaimer in the documentation and/or other materials provided with %
+% the distribution. %
+% %
+% 3. The name of the author may not be used to endorse or promote %
+% products derived from this software without specific prior written %
+% permission. %
+% %
+% THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR %
+% IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED %
+% WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE %
+% ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY %
+% DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL %
+% DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE %
+% GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS %
+% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER %
+% IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR %
+% OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN %
+% IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\def\commandlabel#1{\makebox[\textwidth][l]{\hspace\labelsep #1}}
+\def\commanddescription{\list{}{\labelwidth\z@ \itemindent-\leftmargin\let\makelabel\commandlabel}}
+\let\endcommanddescription\endlist
diff --git a/gle-refman/fonttest/Makefile.gcc b/gle-refman/fonttest/Makefile.gcc
new file mode 100644
index 0000000..a95c443
--- /dev/null
+++ b/gle-refman/fonttest/Makefile.gcc
@@ -0,0 +1,75 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+FONTS = \
+ psagbo.pdf psagb.pdf psagdo.pdf psagd.pdf psbdi.pdf psbd.pdf psbl.pdf psbli.pdf \
+ pshbo.pdf pshb.pdf pscbo.pdf pscb.pdf psco.pdf psc.pdf pshnb.pdf pshnbo.pdf \
+ pshno.pdf pshn.pdf psho.pdf psh.pdf psncsbi.pdf psncsb.pdf psncsi.pdf \
+ psncsr.pdf pspbi.pdf pspb.pdf pspi.pdf pspr.pdf pssym.pdf pstbi.pdf \
+ pstb.pdf psti.pdf pstr.pdf pszcmi.pdf pszd.pdf rmb.pdf rmi.pdf rm.pdf \
+ ssb.pdf ssi.pdf ss.pdf texcmb.pdf texcmex.pdf texcmitt.pdf texcmmi.pdf \
+ texcmr.pdf texcmssb.pdf texcmssi.pdf texcmss.pdf texcmsy.pdf texcmti.pdf \
+ texcmtt.pdf ttb.pdf tti.pdf tt.pdf
+
+FONTS_EXTRA = \
+ plba.pdf plcc.pdf plcg.pdf plci.pdf plcr.pdf plcs.pdf pldr.pdf plge.pdf \
+ plgg.pdf plgi.pdf plsa.pdf plsg.pdf plsr.pdf plss.pdf plsym1.pdf plsym2.pdf \
+ plti.pdf pltr.pdf pshc.pdf pshcb.pdf pshcdo.pdf pshcbo.pdf
+
+COMPILE_EXTRA_FONTS=
+ifeq ($(HAVE_EXTRA_FONTS),1)
+ COMPILE_EXTRA_FONTS=$(FONTS_EXTRA)
+endif
+
+ifeq ($(RUNBUILD),1)
+ GLE = ../../build/bin/gle
+else
+ GLE = gle
+endif
+
+all: $(FONTS) $(COMPILE_EXTRA_FONTS) extrafonts.tex
+
+%.pdf: font-table.gle
+ $(GLE) -d pdf -o $*.pdf font-table.gle $*
+
+extrafonts.tex:
+ ../../build/bin/glebtool -latexdef extrafonts.tex extrafonts $(HAVE_EXTRA_FONTS)
+
+clean:
+ rm -f *.pdf extrafonts.tex
+
diff --git a/gle-refman/fonttest/font-table.gle b/gle-refman/fonttest/font-table.gle
new file mode 100644
index 0000000..5431100
--- /dev/null
+++ b/gle-refman/fonttest/font-table.gle
@@ -0,0 +1,109 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 7.75 7
+
+set font rm
+
+tlin = 0.6
+
+xdel = 0.1
+ydel = 0.1
+
+pagewd = pagewidth()-2*xdel
+
+sub show_table f1$ f2$
+ top = pageheight()-tlin-ydel*2
+
+ dx=pagewd/21
+ dy=top/14
+
+ for j = 0 to 12
+ amove 0.5*dx+xdel (j+1/2)*dy+ydel
+ set just cc hei 0.25
+ write (12-j)*2
+ next j
+
+ for j = 0 to 13
+ amove 0+xdel (j+1)*dy+ydel
+ aline pagewidth()-xdel (j+1)*dy+ydel
+ next j
+
+ for i = 0 to 19
+ amove (i+1)*dx+xdel ydel
+ aline (i+1)*dx+xdel top+ydel
+ amove (i+3/2)*dx+xdel 13.5*dy+ydel
+ set just cc hei 0.25 font rm
+ write i
+ next i
+
+ idx = 0
+ for j = 0 to 12
+ for i = 0 to 19
+ amove (i+1+0.5)*dx+xdel (12-j+0.5)*dy+ydel
+ if idx <= 256 then
+ set just cc hei 0.27 font f2$
+ begin text
+ \char{\expr{idx}}
+ end text
+ idx = idx + 1
+ end if
+ next i
+ next j
+
+ set just lc hei 0.35 font rm
+ amove xdel pageheight()-tlin/2-ydel+0.1
+
+ write f1$+" ("+f2$+")"
+end sub
+
+id$ = arg$(1)
+name$ = ""
+
+fopen "fonts.csv" fi read
+until feof(fi)
+ fread fi nr mid$ nm$
+ if mid$ = id$ then
+ name$ = nm$
+ end if
+next
+fclose fi
+
+! print name$+" ("+id$+")"
+
+show_table name$ id$
diff --git a/gle-refman/fonttest/fonts.csv b/gle-refman/fonttest/fonts.csv
new file mode 100644
index 0000000..1d6c203
--- /dev/null
+++ b/gle-refman/fonttest/fonts.csv
@@ -0,0 +1,112 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+12,rm,"Roman"
+12,rmb,"Roman Bold"
+12,rmi,"Roman Italic"
+12,ss,"San Serif"
+12,ssb,"San Serif Bold"
+12,ssi,"San Serif Italic"
+12,tt,"Typewriter"
+12,ttb,"Typewriter Bold"
+12,tti,"Typewriter Italic"
+12,texcmb,"\TeX Computer Modern Bold"
+12,texcmex,"\TeX Computer Modern Extensible"
+12,texcmitt,"\TeX Computer Modern Italic Typewriter"
+12,texcmmi,"\TeX Computer Modern Maths Italic"
+12,texcmr,"\TeX Computer Modern Roman"
+12,texcmss,"\TeX Computer Modern Sans Serif"
+12,texcmssb,"\TeX Computer Modern Sans Serif Bold"
+12,texcmssi,"\TeX Computer Modern Sans Serif Italic"
+12,texcmsy,"\TeX Computer Modern Symbol"
+12,texcmti,"\TeX Computer Modern Text Italic"
+12,texcmtt,"\TeX Computer Modern Typewriter Text"
+12,plba,"Plotter Block Ascii"
+12,plcc,"Plotter Complex Cartographic"
+12,plcg,"Plotter Complex Greek"
+12,plci,"Plotter Complex Italic"
+12,plcr,"Plotter Complex Roman"
+12,plcs,"Plotter Complex Script"
+12,pldr,"Plotter Duplex Roman"
+12,plge,"Plotter Gothic English"
+12,plgg,"Plotter Gothic German"
+12,plgi,"Plotter Gothic Italian"
+12,plsa,"Plotter Simplex Ascii"
+12,plsg,"Plotter Simplex Greek"
+12,plsr,"Plotter Simplex Roman"
+12,plss,"Plotter Simplex Script"
+14,plsym1,"Plotter Symbols one"
+14,plsym2,"Plotter Symbols two"
+12,plti,"Plotter Triplex Italic"
+12,pltr,"Plotter Triplex Roman"
+12,psagb,"PostScript AvantGarde-Book"
+12,psagbo,"PostScript AvantGarde-BookOblique"
+12,psagd,"PostScript AvantGarde-Demi"
+12,psagdo,"PostScript AvantGarde-DemiOblique"
+12,psbd,"PostScript Bookman-Demi"
+12,psbdi,"PostScript Bookman-DemiItalic"
+12,psbli,"PostScript Bookman-LightItalic"
+12,psc,"PostScript Courier"
+12,pscb,"PostScript Courier-Bold"
+12,pscbo,"PostScript Courier-BoldOblique"
+12,psco,"PostScript Courier-Oblique"
+12,psh,"PostScript Helvetica"
+12,pshb,"PostScript Helvetica-Bold"
+12,pshbo,"PostScript Helvetica-BoldOblique"
+12,psho,"PostScript Helvetica-Oblique"
+12,pshc,"PostScript Helvetica-Condensed"
+12,pshcb,"PostScript Helvetica-Condensed-Bold"
+12,pshcdo,"PostScript Helvetica-Condensed-BoldOblique"
+12,pshn,"PostScript Helvetica-Narrow"
+12,pshnb,"PostScript Helvetica-Narrow-Bold"
+12,pshnbo,"PostScript Helvetica-Narrow-BoldOblique"
+12,pshno,"PostScript Helvetica-NarrowOblique"
+12,psncsb,"PostScript NewCenturySchlbk-Bold"
+12,psncsbi,"PostScript NewCenturySchlbk-BoldItalic"
+12,psncsi,"PostScript NewCenturySchlbk-Italic"
+12,psncsr,"PostScript NewCenturySchlbk-Roman"
+12,pspb,"PostScript Palatino-Bold"
+12,pspbi,"PostScript Palatino-BoldItalic"
+12,pspi,"PostScript Palatino-Italic"
+12,pspr,"PostScript Palatino-Roman"
+14,pssym,"PostScript Symbol"
+12,pstb,"PostScript Times-Bold"
+12,pstbi,"PostScript Times-BoldItalic"
+12,psti,"PostScript Times-Italic"
+12,pstr,"PostScript Times-Roman"
+12,pszcmi,"PostScript ZapfChancery-MediumItalic"
+12,pszd,"PostScript ZapfDingbats"
diff --git a/gle-refman/fonttest/fonttab.tex b/gle-refman/fonttest/fonttab.tex
new file mode 100644
index 0000000..136a383
--- /dev/null
+++ b/gle-refman/fonttest/fonttab.tex
@@ -0,0 +1,158 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% GLE - Graphics Layout Engine <http://www.gle-graphics.org/> %
+% %
+% Modified BSD License %
+% %
+% Copyright (C) 2009 GLE. %
+% %
+% Redistribution and use in source and binary forms, with or without %
+% modification, are permitted provided that the following conditions %
+% are met: %
+% %
+% 1. Redistributions of source code must retain the above copyright %
+% notice, this list of conditions and the following disclaimer. %
+% %
+% 2. Redistributions in binary form must reproduce the above %
+% copyright notice, this list of conditions and the following %
+% disclaimer in the documentation and/or other materials provided with %
+% the distribution. %
+% %
+% 3. The name of the author may not be used to endorse or promote %
+% products derived from this software without specific prior written %
+% permission. %
+% %
+% THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR %
+% IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED %
+% WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE %
+% ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY %
+% DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL %
+% DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE %
+% GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS %
+% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER %
+% IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR %
+% OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN %
+% IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\input{fonttest/extrafonts.tex}
+
+\includegraphics{fonttest/rm}\hfill
+\includegraphics{fonttest/rmb}
+
+\includegraphics{fonttest/rmi}\hfill
+\includegraphics{fonttest/ss}
+
+\includegraphics{fonttest/ssb}\hfill
+\includegraphics{fonttest/ssi}
+
+\includegraphics{fonttest/tt}\hfill
+\includegraphics{fonttest/ttb}
+
+\includegraphics{fonttest/tti}\hfill
+\includegraphics{fonttest/texcmr}
+
+\includegraphics{fonttest/texcmb}\hfill
+\includegraphics{fonttest/texcmti}
+
+\includegraphics{fonttest/texcmss}\hfill
+\includegraphics{fonttest/texcmssb}
+
+\includegraphics{fonttest/texcmssi}\hfill
+\includegraphics{fonttest/texcmtt}
+
+\includegraphics{fonttest/texcmitt}\hfill
+\includegraphics{fonttest/texcmmi}
+
+\includegraphics{fonttest/texcmsy}\hfill
+\includegraphics{fonttest/texcmex}
+
+\includegraphics{fonttest/pssym}\hfill
+\includegraphics{fonttest/pszd}
+
+\extrafonts{%
+\includegraphics{fonttest/plsym1}\hfill
+\includegraphics{fonttest/plsym2}}
+
+\includegraphics{fonttest/pstr}\hfill
+\includegraphics{fonttest/pstb}
+
+\includegraphics{fonttest/psti}\hfill
+\includegraphics{fonttest/pstbi}
+
+\includegraphics{fonttest/psc}\hfill
+\includegraphics{fonttest/pscb}
+
+\includegraphics{fonttest/psco}\hfill
+\includegraphics{fonttest/pscbo}
+
+\includegraphics{fonttest/psh}\hfill
+\includegraphics{fonttest/pshb}
+
+\includegraphics{fonttest/psho}\hfill
+\includegraphics{fonttest/pshbo}
+
+\extrafonts{%
+\includegraphics{fonttest/pshc}\hfill
+\includegraphics{fonttest/pshcb}
+
+\includegraphics{fonttest/pshcdo}\hfill
+\includegraphics{fonttest/pshcbo}}
+
+\includegraphics{fonttest/pshn}\hfill
+\includegraphics{fonttest/pshnb}
+
+\includegraphics{fonttest/pshno}\hfill
+\includegraphics{fonttest/pshnbo}
+
+\includegraphics{fonttest/psagb}\hfill
+\includegraphics{fonttest/psagd}
+
+\includegraphics{fonttest/psagbo}\hfill
+\includegraphics{fonttest/psagdo}
+
+\includegraphics{fonttest/psbl}\hfill
+\includegraphics{fonttest/psbd}
+
+\includegraphics{fonttest/psbli}\hfill
+\includegraphics{fonttest/psbdi}
+
+\includegraphics{fonttest/psncsr}\hfill
+\includegraphics{fonttest/psncsb}
+
+\includegraphics{fonttest/psncsi}\hfill
+\includegraphics{fonttest/psncsbi}
+
+\includegraphics{fonttest/pspr}\hfill
+\includegraphics{fonttest/pspb}
+
+\includegraphics{fonttest/pspi}\hfill
+\includegraphics{fonttest/pspbi}
+
+\includegraphics{fonttest/pszcmi}
+
+\extrafonts{%
+\includegraphics{fonttest/plsr}\hfill
+\includegraphics{fonttest/pldr}
+
+\includegraphics{fonttest/pltr}\hfill
+\includegraphics{fonttest/plti}
+
+\includegraphics{fonttest/plcr}\hfill
+\includegraphics{fonttest/plci}
+
+\includegraphics{fonttest/plss}\hfill
+\includegraphics{fonttest/plcs}
+
+\includegraphics{fonttest/plsa}\hfill
+\includegraphics{fonttest/plba}
+
+\includegraphics{fonttest/plge}\hfill
+\includegraphics{fonttest/plgg}
+
+\includegraphics{fonttest/plgi}\hfill
+\includegraphics{fonttest/plsg}
+
+\includegraphics{fonttest/plcg}\hfill
+\includegraphics{fonttest/plcc}}
diff --git a/gle-refman/fonttest/ncleanfonts.pl b/gle-refman/fonttest/ncleanfonts.pl
new file mode 100644
index 0000000..4369d90
--- /dev/null
+++ b/gle-refman/fonttest/ncleanfonts.pl
@@ -0,0 +1,47 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+open(IN, "fonts.csv");
+while ($line = <IN>) {
+ chop($line);
+ if ($line =~ /^[0-9]+\,([^\,]+)\,/) {
+ $id = $1;
+ system("rm $id.gle $id.eps $id.pdf");
+ }
+}
+close(IN);
diff --git a/gle-refman/fonttest/ndofonts.pl b/gle-refman/fonttest/ndofonts.pl
new file mode 100644
index 0000000..cd7783c
--- /dev/null
+++ b/gle-refman/fonttest/ndofonts.pl
@@ -0,0 +1,60 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+if ($ENV{"RUNBUILD"} == 1) {
+ $gle = "../../build/bin/gle";
+} else {
+ $gle = "gle";
+}
+
+open(IN, "Fonts.lis");
+while ($line = <IN>) {
+ chop($line);
+ if ($line =~ /^[0-9]+\s+(\S+)\s+(.+)$/) {
+ $id = $1; $name = $2;
+ if (!(-f "$id.pdf")) {
+ open(OUT, ">$id.gle");
+ print OUT "size 7.75 7\n";
+ print OUT "include \"font-table.gle\"\n";
+ print OUT "\@show_table \"$name\" \"$id\"\n";
+ close(OUT);
+ system("$gle -d pdf $id.gle");
+ }
+ }
+}
+close(IN);
diff --git a/gle-refman/gle-manual.tex b/gle-refman/gle-manual.tex
new file mode 100644
index 0000000..9a59282
--- /dev/null
+++ b/gle-refman/gle-manual.tex
@@ -0,0 +1,92 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% GLE - Graphics Layout Engine <http://www.gle-graphics.org/> %
+% %
+% Modified BSD License %
+% %
+% Copyright (C) 2009 GLE. %
+% %
+% Redistribution and use in source and binary forms, with or without %
+% modification, are permitted provided that the following conditions %
+% are met: %
+% %
+% 1. Redistributions of source code must retain the above copyright %
+% notice, this list of conditions and the following disclaimer. %
+% %
+% 2. Redistributions in binary form must reproduce the above %
+% copyright notice, this list of conditions and the following %
+% disclaimer in the documentation and/or other materials provided with %
+% the distribution. %
+% %
+% 3. The name of the author may not be used to endorse or promote %
+% products derived from this software without specific prior written %
+% permission. %
+% %
+% THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR %
+% IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED %
+% WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE %
+% ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY %
+% DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL %
+% DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE %
+% GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS %
+% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER %
+% IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR %
+% OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN %
+% IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\documentclass{book}
+
+\input{defs}
+\input{title/sm_special}
+
+\makeindex
+
+\begin{document}
+\input{title/title}
+\pagenumbering{arabic}
+\cleardoublepage
+
+\input{tutorial/tutorial}
+\input{primitives/cmds}
+\input{graph/graph}
+\input{key/key}
+\input{prog/prog}
+\input{advanced/advanced}
+\input{qgle/qgle}
+
+\input{utilities/surface}
+\input{utilities/letz}
+\input{utilities/fitz}
+\input{utilities/contour}
+
+\input{utilities/fitls}
+\input{utilities/manip}
+
+\input{appendix/appendix}
+
+\section{Font Tables}
+
+\input{fonttest/fonttab}
+
+\newpage
+
+\section{Predefined Colors}
+
+\label{colors:sec}
+\mbox{\input{appendix/fig/color_sample.inc}}
+\newpage
+
+\label{sortedcol:sec}
+\mbox{\input{appendix/fig/color_list_svg.inc}}
+\newpage
+
+\section{Wall Reference}
+
+\label{wallref:sec}
+\resizebox{!}{22cm}{\includegraphics{appendix/fig/wall}}
+
+\chapter{Index}
+\printindex
+\end{document}
diff --git a/gle-refman/graph/fig/Makefile.gcc b/gle-refman/graph/fig/Makefile.gcc
new file mode 100644
index 0000000..d0f2c8a
--- /dev/null
+++ b/gle-refman/graph/fig/Makefile.gcc
@@ -0,0 +1,64 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+OPTS =
+
+EPSS = gc_axes.inc gc_axisall.inc gc_bargraph1.inc gc_bargraph2.inc gc_bargraph_3d.inc \
+ gc_err.inc gc_fillgraph.inc gc_let.inc gc_names.inc gc_nomiss.inc gc_fit.inc gc_fitfct.inc \
+ linemode.inc gc_loglabels.inc gc_graphscale.inc gc_horizbar.inc gc_mathmode.inc gc_logsubticks.inc \
+ noisysine.inc age.inc normal.inc gridmode.inc y2axis-scale.inc discontinuity.inc \
+ sqroot.inc cos2t.inc shadow.inc
+
+ifeq ($(HAVE_CAIRO),1)
+ EPSS := $(EPSS) semitrans.inc
+ OPTS := $(OPTS) -cairo
+endif
+
+ifeq ($(RUNBUILD),1)
+ GLE = ../../../build/bin/gle
+else
+ GLE = gle
+endif
+
+all: $(EPSS)
+
+%.inc: %.gle
+ $(GLE) $(OPTS) -texincprefix graph/fig/ -inc -d pdf $<
+
+clean:
+ rm -rf *.eps *.pdf *.inc .gle
diff --git a/gle-refman/graph/fig/Makefile.os2 b/gle-refman/graph/fig/Makefile.os2
new file mode 100644
index 0000000..24a28e6
--- /dev/null
+++ b/gle-refman/graph/fig/Makefile.os2
@@ -0,0 +1,49 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+EPSS = gc_axes.eps gc_axisall.eps gc_bargraph1.eps gc_bargraph2.eps gc_bargraph_3d.eps \
+ gc_err.eps gc_fillgraph.eps gc_let.eps gc_names.eps gc_nomiss.eps gc_fit.eps \
+ linemode.eps
+
+all: $(EPSS)
+
+%.eps: %.gle
+ gle -texincprefix "graph/fig/" -d eps $<
+
+clean:
+ rm -rf *.eps *.pdf *.inc .gle
diff --git a/gle-refman/graph/fig/age.csv b/gle-refman/graph/fig/age.csv
new file mode 100644
index 0000000..83c0908
--- /dev/null
+++ b/gle-refman/graph/fig/age.csv
@@ -0,0 +1,42 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+Age, John, Mary, Ken
+15, 73, 65, 77
+20, 80, 68, 77
+30, 82, 77, 80
+40, 85, 78, 82
diff --git a/gle-refman/graph/fig/age.gle b/gle-refman/graph/fig/age.gle
new file mode 100644
index 0000000..73172bf
--- /dev/null
+++ b/gle-refman/graph/fig/age.gle
@@ -0,0 +1,56 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 5.75 4
+
+include "../../script/manual.gle"
+
+manual_graph_mode
+
+amove 0.4 0.4
+begin graph
+ scale 0.8 0.75
+ data "age.csv"
+ xtitle "Age"
+ ytitle "Weight"
+ key pos br compact
+ dn msize 0.26
+ d1 line color red marker circle
+ d2 line color blue marker triangle
+ d3 line color green marker square
+end graph
diff --git a/gle-refman/graph/fig/cos2t.gle b/gle-refman/graph/fig/cos2t.gle
new file mode 100644
index 0000000..2964817
--- /dev/null
+++ b/gle-refman/graph/fig/cos2t.gle
@@ -0,0 +1,57 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 4.5 4.5
+
+include "../../script/manual.gle"
+manual_graph_mode
+
+include "polarplot.gle"
+
+set font texcmr
+begin graph
+ scale auto
+ title "$r = \cos(2\theta)$"
+ xaxis min -1.1 max 1.1
+ yaxis min -1.1 max 1.1
+ begin layer 0
+ draw polar_grid radius 2 rings 5 sectors 12
+ draw polar "cos(2*t)" from 0 to 2*pi fill wheat
+ end layer
+end graph
+
diff --git a/gle-refman/graph/fig/discontinuity.gle b/gle-refman/graph/fig/discontinuity.gle
new file mode 100644
index 0000000..434f6d2
--- /dev/null
+++ b/gle-refman/graph/fig/discontinuity.gle
@@ -0,0 +1,133 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 14 5.4
+
+include "../../script/manual.gle"
+
+manual_graph_mode
+set alabelscale 0.6
+
+wd = 14/3
+dy = -0.1
+
+xmin = -4
+xmax = 4
+
+sub floor x
+ if x>=0 then
+ return int(x)
+ else if x=int(x) then
+ return int(x)
+ else
+ return int(x)-1
+ end if
+end sub
+
+amove 0 dy
+begin graph
+ math
+ size wd wd
+ scale 0.8 0.8
+ xaxis min xmin max xmax
+ labels dist 0.15
+ xaxis format "fix 0"
+ yaxis format "fix 0"
+ x2axis off
+ y2axis off
+ discontinuity threshold 5
+ let d1 = floor(x) step 0.1
+ d1 line color red
+end graph
+
+begin key
+ pos tc hei 0.25
+ offset 0 -0.2
+ text "discontinuity threshold 5"
+ text "let d1 = floor(x)"
+ text "d1 line color red"
+end key
+
+amove wd dy
+begin graph
+ math
+ size wd wd
+ scale 0.8 0.8
+ xaxis min xmin max xmax
+ xaxis format "fix 0"
+ yaxis format "fix 0"
+ labels dist 0.15
+ x2axis off
+ y2axis off
+ discontinuity threshold 5
+ let d1 = floor(x) step 0.1
+ d1 line color red nomiss
+end graph
+
+begin key
+ pos tc hei 0.25
+ offset 0 -0.2
+ text "discontinuity threshold 5"
+ text "let d1 = floor(x)"
+ text "d1 line color red nomiss"
+end key
+
+amove 2*wd dy
+begin graph
+ math
+ size wd wd
+ scale 0.8 0.8
+ xaxis min -2.5 max 3.5
+ yaxis min -20
+ xaxis format "fix 0"
+ yaxis format "fix 0"
+ yaxis min 0 max 25
+ labels dist 0.15
+ x2axis off
+ y2axis off
+ let d1 = -log(sin(pi*x)) step 0.01
+ d1 line color red
+end graph
+
+begin key
+ pos tc hei 0.25
+ offset 0 -0.2
+ text "let d1 = -log(sin(pi*x))"
+ text "d1 line color red"
+end key
+
diff --git a/gle-refman/graph/fig/fitlin.dat b/gle-refman/graph/fig/fitlin.dat
new file mode 100644
index 0000000..c31e995
--- /dev/null
+++ b/gle-refman/graph/fig/fitlin.dat
@@ -0,0 +1,46 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+1 2
+2 5
+3 5
+4 6
+5 4
+6 5.5
+7 6
+8 9
+9 10
diff --git a/gle-refman/graph/fig/gc_axes.gle b/gle-refman/graph/fig/gc_axes.gle
new file mode 100644
index 0000000..c2ee23d
--- /dev/null
+++ b/gle-refman/graph/fig/gc_axes.gle
@@ -0,0 +1,55 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 7 4
+
+include "../../script/manual.gle"
+
+amove 0 0.2
+manual_graph_mode
+begin graph
+ xaxis min 0 max 10
+ yaxis min 0 max 10 dticks 2
+ xtitle "X-axis"
+ ytitle "Y-axis"
+ x2title "X2-axis"
+ y2title "Y2-axis"
+ x2ticks length 0.6
+ x2subticks color red
+end graph
+
diff --git a/gle-refman/graph/fig/gc_axisall.gle b/gle-refman/graph/fig/gc_axisall.gle
new file mode 100644
index 0000000..450a485
--- /dev/null
+++ b/gle-refman/graph/fig/gc_axisall.gle
@@ -0,0 +1,60 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 7 4
+
+include "../../script/manual.gle"
+
+amove 0 0.2
+manual_graph_mode
+begin graph
+ xaxis min 0 max 9 nofirst nolast
+ xaxis hei 0.4 nticks 6 dsubticks 0.3
+ xaxis lwidth 0.05 color red
+ xticks length 0.2
+ ytitle "Log Y Axis"
+ yaxis log min 1 max 10
+ yticks length 0.2
+ y2axis min 1 max 10000 format "sci 0 10"
+ y2side color blue
+ y2title "Y2 Title Rotated " hei 0.3 rotate
+ x2axis off
+ y2labels on
+ let d1 = sin(x)*4+5 from 0 to 9
+ dn line color blue
+end graph
diff --git a/gle-refman/graph/fig/gc_bargraph1.gle b/gle-refman/graph/fig/gc_bargraph1.gle
new file mode 100644
index 0000000..a8b594d
--- /dev/null
+++ b/gle-refman/graph/fig/gc_bargraph1.gle
@@ -0,0 +1,55 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 7 4
+
+include "../../script/manual.gle"
+
+amove 0 0.3
+manual_graph_mode
+begin graph
+ size 7 3.75
+ title "Bean Stalk Data" dist 0.15
+ xtitle "Year measured"
+ ytitle "Height of stalk"
+ yaxis min 0 max 5 dticks 1
+ xaxis dticks 1
+ data "gc_bean.dat"
+ bar d1 fill gray20
+ bar d2 from d1 fill white
+end graph
diff --git a/gle-refman/graph/fig/gc_bargraph2.gle b/gle-refman/graph/fig/gc_bargraph2.gle
new file mode 100644
index 0000000..a3bf718
--- /dev/null
+++ b/gle-refman/graph/fig/gc_bargraph2.gle
@@ -0,0 +1,54 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 7 4
+
+include "../../script/manual.gle"
+
+amove 0 0.2
+manual_graph_mode
+begin graph
+ vscale 0.675
+ title "Bean Stalk Data" dist 0.15
+ xtitle "Year measured"
+ ytitle "Height of stalk"
+ xaxis dticks 1
+ yaxis min 0 max 6 dticks 2
+ data "gc_bean.dat"
+ bar d1,d2,d3 fill blue,orange,red
+end graph
diff --git a/gle-refman/graph/fig/gc_bargraph_3d.gle b/gle-refman/graph/fig/gc_bargraph_3d.gle
new file mode 100644
index 0000000..a33b890
--- /dev/null
+++ b/gle-refman/graph/fig/gc_bargraph_3d.gle
@@ -0,0 +1,54 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 7 4
+
+include "../../script/manual.gle"
+
+amove 0 0.2
+manual_graph_mode
+begin graph
+ size 7 3.75
+ title "Bean Stalk Data" dist 0.15
+ xtitle "Year measured"
+ ytitle "Height of stalk"
+ xaxis min 85.4 max 90.75 dticks 1
+ yaxis min 0 max 6 dticks 1 format "fix 0"
+ data gc_bean.dat
+ bar d1,d2,d3 dist 0.25 width 0.15 3d 1 0.25 fill red,blue,forestgreen side orange,dodgerblue,green
+end graph
diff --git a/gle-refman/graph/fig/gc_bean.dat b/gle-refman/graph/fig/gc_bean.dat
new file mode 100644
index 0000000..9fe8953
--- /dev/null
+++ b/gle-refman/graph/fig/gc_bean.dat
@@ -0,0 +1,42 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+86 3 3.1 5.1 2
+87 3.2 4 5 2.1
+88 3 2.4 5.3 2
+89 3 4 5.6 2.2
+90 3.1 4.1 5.2 2.3
diff --git a/gle-refman/graph/fig/gc_err.gle b/gle-refman/graph/fig/gc_err.gle
new file mode 100644
index 0000000..d0f22e8
--- /dev/null
+++ b/gle-refman/graph/fig/gc_err.gle
@@ -0,0 +1,53 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 7 3.75
+
+include "../../script/manual.gle"
+
+manual_graph_mode
+begin graph
+ title "Error Bars" dist 0.15
+ yaxis min 0 max 35 dticks 10
+ xaxis min 0
+ let d1 = (sin(x)+1)*10+3 from 0.5 to 9 step 1
+ let d2 = (cos(x)+1)*10+3 from 0.5 to 9.5 step 1
+ dn lstyle 2 msize .15
+ d1 marker circle errup 30% errdown 1 color red
+ d2 marker square err 30% errwidth .1 color blue
+end graph
diff --git a/gle-refman/graph/fig/gc_fill.dat b/gle-refman/graph/fig/gc_fill.dat
new file mode 100644
index 0000000..7f882ec
--- /dev/null
+++ b/gle-refman/graph/fig/gc_fill.dat
@@ -0,0 +1,42 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+86 1 2.1
+87 2.2 4
+88 1 2.4
+89 3 4
+90 5.1 5.2
diff --git a/gle-refman/graph/fig/gc_fillgraph.gle b/gle-refman/graph/fig/gc_fillgraph.gle
new file mode 100644
index 0000000..11161ce
--- /dev/null
+++ b/gle-refman/graph/fig/gc_fillgraph.gle
@@ -0,0 +1,56 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 7 4
+
+include "../../script/manual.gle"
+
+manual_graph_mode
+begin graph
+ scale auto
+ title "Shading Areas of the Graph"
+ xtitle "Height of stalk"
+ ytitle "Year measured"
+ xaxis min 86 max 90 dticks 1
+ yaxis min 0 max 6
+ data "gc_fill.dat"
+ fill d2,x2 color gray40
+ fill x1,d1 color gray10 xmin 85 xmax 88
+ fill x1,d1 color gray90 xmin 88 xmax 91
+ dn line
+end graph
diff --git a/gle-refman/graph/fig/gc_fit.gle b/gle-refman/graph/fig/gc_fit.gle
new file mode 100644
index 0000000..a02a0b6
--- /dev/null
+++ b/gle-refman/graph/fig/gc_fit.gle
@@ -0,0 +1,66 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 7 5.5
+
+include "../../script/manual.gle"
+
+slope = 0; offs = 0; rsquare = 0
+
+manual_graph_mode
+set atitlescale 1
+amove 0 1.1
+begin graph
+ size 7 4.5
+ title "Linear Fit" dist 0.15
+ xaxis min 0 max 10 dticks 2
+ yaxis min 0 max 11 dticks 2
+ xtitle "$x$"
+ ytitle "$y = ax + b$"
+ data "fitlin.dat"
+ let d2 = linfit d1 from 0 to 10 slope offset rsquare
+ d1 marker circle msize 0.15 color blue
+ d2 line color red
+end graph
+
+begin key
+ pos br nobox
+ text "$y = "+format$(slope,"fix 2")+"x + "+format$(offset,"fix 2")+"$"
+ text "$r^2 = "+format$(rsquare,"fix 2")+"$"
+end key
+
diff --git a/gle-refman/graph/fig/gc_fitfct.csv b/gle-refman/graph/fig/gc_fitfct.csv
new file mode 100644
index 0000000..ed8aa09
--- /dev/null
+++ b/gle-refman/graph/fig/gc_fitfct.csv
@@ -0,0 +1,9 @@
+1 2
+2 5
+3 5
+4 6
+5 4
+6 3
+7 6
+8 9
+9 10
diff --git a/gle-refman/graph/fig/gc_fitfct.gle b/gle-refman/graph/fig/gc_fitfct.gle
new file mode 100644
index 0000000..024a1f3
--- /dev/null
+++ b/gle-refman/graph/fig/gc_fitfct.gle
@@ -0,0 +1,35 @@
+size 7 7
+
+include "../../script/manual.gle"
+
+a = 0; b = 0; c = 0; d = 0; r = 0
+
+manual_graph_mode
+set atitlescale 1
+amove 0 1.5
+begin graph
+ size 7 5.5
+ scale auto
+ xtitle "$x$"
+ ytitle "$f(x)$"
+ title "$f(x) = a\sin(bx)+cx^2+d$"
+ xaxis min 0 max 10
+ yaxis min -4 max 14
+ data "gc_fitfct.csv"
+ let d2 = fit d1 with a*sin(b*x)+c*x^2+d rsq r eqstr eq$
+ d1 marker circle msize 0.15 color blue
+ d2 line color red
+end graph
+
+set texscale scale
+
+fct$ = "$f(x) = "+format$(a,"fix 2")+ &
+ "\sin("+format$(b,"fix 2")+"x)+"+ &
+ format$(c,"fix 2")+"x^2+"+ &
+ format$(d,"fix 2")+"$"
+
+begin key
+ pos br nobox hei 0.3 offset 0.05 0.1
+ text fct$
+ text "$r^2$ = "+format$(r,"fix 3")
+end key
diff --git a/gle-refman/graph/fig/gc_graphscale.gle b/gle-refman/graph/fig/gc_graphscale.gle
new file mode 100644
index 0000000..7c8f5ae
--- /dev/null
+++ b/gle-refman/graph/fig/gc_graphscale.gle
@@ -0,0 +1,92 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 15 3.6
+
+include "../../script/manual.gle"
+
+manual_graph_mode
+
+set alabelscale 0.65
+
+amove 0.1 0.1
+gsave
+set color blue
+circle 0.1 fill blue
+grestore
+begin graph
+ box
+ size 4.8 3.5
+ title "scale 0.7 0.7" dist 0.15
+ xaxis min 0 max 2*pi dticks pi/2 format "pi"
+ yaxis min -1 max +1 dticks 0.5
+ let d1 = sin(x)
+ d1 line color red
+end graph
+
+amove 5.2 0.1
+gsave
+set color blue
+circle 0.1 fill blue
+grestore
+begin graph
+ box
+ size 4.8 3.5
+ scale auto
+ title "scale auto" dist 0.15
+ xaxis min 0 max 2*pi dticks pi/2 format "pi"
+ yaxis min -1 max +1 dticks 0.5
+ let d1 = sin(x)
+ d1 line color red
+end graph
+
+amove 10.3+(1-0.7)/2*4.8 0.1+(1-0.7)/2*3.5
+gsave
+set color blue
+circle 0.1 fill blue
+grestore
+begin graph
+ box
+ size 0.7*4.8 0.7*3.5
+ fullsize
+ title "fullsize" dist 0.15
+ xaxis min 0 max 2*pi dticks pi/2 format "pi"
+ yaxis min -1 max +1 dticks 0.5
+ let d1 = sin(x)
+ d1 line color red
+end graph
diff --git a/gle-refman/graph/fig/gc_horizbar.csv b/gle-refman/graph/fig/gc_horizbar.csv
new file mode 100644
index 0000000..f5e3f73
--- /dev/null
+++ b/gle-refman/graph/fig/gc_horizbar.csv
@@ -0,0 +1,44 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+0,Mercury,0.382
+1,Venus,0.949
+2,Mars,0.532
+3,Jupiter,11.209
+4,Saturn,9.449
+5,Uranus,4.007
+6,Neptune,3.883
diff --git a/gle-refman/graph/fig/gc_horizbar.gle b/gle-refman/graph/fig/gc_horizbar.gle
new file mode 100644
index 0000000..8d518a1
--- /dev/null
+++ b/gle-refman/graph/fig/gc_horizbar.gle
@@ -0,0 +1,59 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 7 5
+
+include "../../script/manual.gle"
+
+manual_graph_mode
+
+begin graph
+ scale auto
+ title "Planet Sizes" dist 0.15
+ xtitle "Size relative to Earth"
+ xaxis min 0 dticks 1
+ yaxis min -1 max 7 angle 30
+ ylabels dist 0.05
+ data "gc_horizbar.csv"
+ ynames from d1 hei 0.3633
+ bar d2 horiz fill red pattern shade2 background yellow
+end graph
+
+set color blue lstyle 2
+amove xg(1) yg(ygmin)
+aline xg(1) yg(ygmax)
diff --git a/gle-refman/graph/fig/gc_let.gle b/gle-refman/graph/fig/gc_let.gle
new file mode 100644
index 0000000..38581b1
--- /dev/null
+++ b/gle-refman/graph/fig/gc_let.gle
@@ -0,0 +1,59 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 7 3.75
+
+include "../../script/manual.gle"
+
+amove 0 0.2
+manual_graph_mode
+begin graph
+ vscale 0.66
+ title "Calculating Formulas" dist 0.15
+ xtitle "Time"
+ ytitle "Output"
+ xaxis min 0 max 9
+ yaxis min 0 max 5 dticks 1
+ let d1 = 1/x from 0.2 to 10
+ let d2 = sin(x)*2+2 from 0 to 10
+ let d3 = 10*(1/sqrt(2*pi))*exp(-2*(sqr(x-4)/sqr(2))) from 0.2 to 10 step .1
+ dn line
+ d1 color green
+ d2 lstyle 2 color red
+ d3 lstyle 3 color blue
+end graph
diff --git a/gle-refman/graph/fig/gc_loglabels.gle b/gle-refman/graph/fig/gc_loglabels.gle
new file mode 100644
index 0000000..7fd1448
--- /dev/null
+++ b/gle-refman/graph/fig/gc_loglabels.gle
@@ -0,0 +1,95 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 15.0 5
+
+gw = pagewidth()/4
+
+include "../../script/manual.gle"
+
+mh = 0.3
+
+manual_graph_mode
+
+amove 0*gw+0.2 0
+begin graph
+ size gw pageheight()
+ scale 0.7 0.8
+ title "ylabels log off"
+ xaxis min 0 max 5 dticks 1 hei mh
+ yaxis min 1e0 max 1e3 log hei mh format "sci 0 10"
+ ylabels log off
+ let d1 = 1+sqrt(x)*1e2
+ d1 line color red
+end graph
+
+amove 1*gw+0.2 0
+begin graph
+ size gw pageheight()
+ scale 0.7 0.8
+ title "ylabels log l1"
+ xaxis min 0 max 5 dticks 1 hei mh
+ yaxis min 1e0 max 1e1 log hei mh
+ ylabels log l1
+ let d1 = 1+sqrt(x)*2.5
+ d1 line color red
+end graph
+
+amove 2*gw+0.2 0
+begin graph
+ size gw pageheight()
+ scale 0.7 0.8
+ title "ylabels log l25"
+ xaxis min 0 max 5 dticks 1 hei mh
+ yaxis min 1e0 max 1e3 log hei mh format "sci 0 10"
+ ylabels log l25
+ let d1 = 1+sqrt(x)*1e2
+ d1 line color red
+end graph
+
+amove 3*gw+0.2 0
+begin graph
+ size gw pageheight()
+ scale 0.7 0.8
+ title "ylabels log l25b"
+ xaxis min 0 max 5 dticks 1 hei mh
+ yaxis min 1e0 max 1e2 log hei mh format "fix 0"
+ ylabels log l25b
+ let d1 = 1+sqrt(x)*10
+ d1 line color red
+end graph
diff --git a/gle-refman/graph/fig/gc_logsubticks.gle b/gle-refman/graph/fig/gc_logsubticks.gle
new file mode 100644
index 0000000..bdfbb0e
--- /dev/null
+++ b/gle-refman/graph/fig/gc_logsubticks.gle
@@ -0,0 +1,156 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 15.0 3.9
+
+include "../../script/manual.gle"
+mh = 0.3
+manual_graph_mode
+
+gw = 4.7
+dy = 2.5
+
+begin object g0
+ begin graph
+ size gw 0.01
+ yaxis off
+ xaxis log min 1 max 100
+ x2axis off
+ xticks length -0.3
+ end graph
+end object
+
+begin object g1
+ begin graph
+ size gw 0.01
+ yaxis off
+ xaxis log min 1 max 100
+ x2axis off
+ xticks length -0.3
+ xlabels log off
+ end graph
+end object
+
+begin object g2
+ begin graph
+ size gw 0.01
+ yaxis off
+ xaxis log min 1 max 100
+ x2axis off
+ xticks length -0.3
+ xsubticks off
+ end graph
+end object
+
+amove 0.1 pageheight()-dy
+draw g1.tl
+
+amove ptx(g1.rc)+0.4 pageheight()-dy
+draw g2.tl
+
+amove ptx(g1.rc)+0.3 pageheight()-0.1
+draw g0.tc
+
+sub arrow_line_label p1$ p2$ dis lab$ dx
+ local x0 = ptx(p1$)
+ local y0 = pty(p1$)
+ local x1 = ptx(p2$)
+ local y1 = pty(p2$)
+ amove (1-dis)*x0+dis*x1 (1-dis)*y0+dis*y1
+ aline dis*x0+(1-dis)*x1 dis*y0+(1-dis)*y1 arrow end
+ set just center
+ amove (x0+x1)/2+dx (y0+y1)/2
+ begin box fill white nobox add 0.05
+ tex lab$
+ end box
+end sub
+
+arrow_line_label "g0.bc" "g1.tc" 0.1 "add `xlabels log off'" -0.75
+arrow_line_label "g0.bc" "g2.tc" 0.1 "add `xsubticks off'" +0.75
+
+amove ptx(g2.bc) pty(g2.bc)-0.5
+tex "also turns off sublabels"
+
+gw = 4
+
+begin object g0b
+ begin graph
+ size gw 0.01
+ yaxis off
+ xaxis log min 1 max 100
+ x2axis off
+ xticks length -0.3
+ end graph
+end object
+
+begin object g1b
+ begin graph
+ size gw 0.01
+ yaxis off
+ xaxis log min 1 max 100
+ x2axis off
+ xticks length -0.3
+ xsubticks on
+ end graph
+end object
+
+begin object g2b
+ begin graph
+ size gw 0.01
+ yaxis off
+ xaxis log min 1 max 100
+ x2axis off
+ xticks length -0.3
+ xlabels log l25
+ end graph
+end object
+
+amove ptx(g2.rc)+0.5 pageheight()-dy
+draw g1b.tl
+
+amove ptx(g1b.rc)+0.4 pageheight()-dy
+draw g2b.tl
+
+amove ptx(g1b.rc)+0.3 pageheight()-0.1
+draw g0b.tc
+
+arrow_line_label "g0b.bc" "g1b.tc" 0.1 "add `xsubticks on'" -0.75
+arrow_line_label "g0b.bc" "g2b.tc" 0.1 "add `xlabels log l25'" +0.75
+
+amove ptx(g2b.bc) pty(g2b.bc)-0.5
+tex "also turns on subticks"
diff --git a/gle-refman/graph/fig/gc_mathmode.gle b/gle-refman/graph/fig/gc_mathmode.gle
new file mode 100644
index 0000000..420dcad
--- /dev/null
+++ b/gle-refman/graph/fig/gc_mathmode.gle
@@ -0,0 +1,69 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 15 4
+
+include "../../script/manual.gle"
+
+manual_graph_mode
+begin graph
+ math
+ size 7 4
+ scale auto
+ title "f(x) = sin(x)"
+ xaxis min -2*pi max 2*pi ftick -2*pi dticks pi format "pi"
+ yaxis dticks 0.25 format "frac"
+ let d1 = sin(x)
+ d1 line color red
+end graph
+
+amove 8 0
+begin graph
+ size 15-8 4
+ scale auto
+ title "$f(x) = 1/x+1/(x-1)$"
+ yaxis min -15 max 15 offset 0 symticks
+ ylabels off
+ y2axis offset 1
+ y0axis off
+ xaxis min -1 max 2 offset 0
+ x2axis off
+ x0axis off
+ let d1 = 1/x+1/(x-1)
+ d1 line color red
+end graph
diff --git a/gle-refman/graph/fig/gc_names.gle b/gle-refman/graph/fig/gc_names.gle
new file mode 100644
index 0000000..4f86d9f
--- /dev/null
+++ b/gle-refman/graph/fig/gc_names.gle
@@ -0,0 +1,53 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 7 4
+
+include "../../script/manual.gle"
+
+manual_graph_mode
+begin graph
+ ytitle "Happyness"
+ title "Names \& Places" dist 0.15
+ xaxis min 0 max 6 dticks 1
+ yaxis min 0 max 20 dticks 4
+ xnames "Mon" "Tue" "Wed" "Thu"
+ xnames "Fri" "Sat" "Sun"
+ let d1 = 3*x+3*sin(x)
+ d1 line color red
+end graph
diff --git a/gle-refman/graph/fig/gc_nomiss.gle b/gle-refman/graph/fig/gc_nomiss.gle
new file mode 100644
index 0000000..810af5f
--- /dev/null
+++ b/gle-refman/graph/fig/gc_nomiss.gle
@@ -0,0 +1,55 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 7 4
+
+include "../../script/manual.gle"
+
+amove 0 0.1
+manual_graph_mode
+begin graph
+ scale auto
+ title "Ignore Missing Values (nomiss)" dist 0.15
+ xtitle "Time"
+ ytitle "Output"
+ data "../../tutorial/fig/tut3.dat"
+ yaxis min 0 max 10 dticks 2
+ xaxis dticks 1
+ d1 lstyle 2 color red
+ d2 nomiss lstyle 1 marker diamond msize .2 color blue
+end graph
diff --git a/gle-refman/graph/fig/gridmode.gle b/gle-refman/graph/fig/gridmode.gle
new file mode 100644
index 0000000..108d5cb
--- /dev/null
+++ b/gle-refman/graph/fig/gridmode.gle
@@ -0,0 +1,150 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 14 2*3.9
+
+wd = 14/3
+hi = 3.8
+offs = 0.05
+fac = 0.9
+
+include "../../script/manual.gle"
+
+manual_graph_mode
+
+ytop = 3.9
+ybot = -0.1
+
+set dashlen 0.017
+
+amove offs ytop
+begin graph
+ title "(a) No Subticks"
+ size wd hi
+ hscale fac
+ yticks off
+ ylabels off
+ xticks color red
+ xaxis min 0 max 5 dticks 1 grid
+end graph
+begin key
+ pos cc
+ background grey5
+ margins 0.15 0.15
+ text "xaxis grid"
+end key
+
+amove offs+wd ytop
+begin graph
+ title "(b) Subticks Grid Lines"
+ size wd hi
+ hscale fac
+ yticks off
+ ylabels off
+ xticks color red
+ xaxis min 0 max 5 dticks 1 grid
+ xsubticks on
+end graph
+begin key
+ pos cc
+ margins 0.15 0.15
+ background grey5
+ text "xaxis grid"
+ text "xsubticks on"
+end key
+
+
+amove offs+2*wd ytop
+begin graph
+ title "(c) Normal Subticks"
+ size wd hi
+ hscale fac
+ yticks off
+ ylabels off
+ xticks color red
+ xaxis min 0 max 5 dticks 1 grid
+ xsubticks on length 0.12
+end graph
+begin key
+ pos cc
+ margins 0.15 0.15
+ background grey5
+ text "xaxis grid"
+ text "xsubticks on"
+ text "xsubticks length 0.12"
+end key
+
+amove offs ybot
+begin graph
+ title "(d) Various Settings"
+ size wd hi
+ hscale fac
+ xaxis min 0 max 5 dticks 1
+ yaxis min 0 max 5 dticks 1
+ axis grid
+ ticks color grey40
+ subticks on
+ subticks lstyle 2
+ ylabels off
+ let d1 = 1.7*sin(2*pi*x)+2.5
+ d1 line color red
+end graph
+begin key
+ pos rc
+ offset -0.3 0
+ margins 0.15 0.15
+ background grey5
+ text "axis grid"
+ text "ticks color grey40"
+ text "subticks on"
+ text "subticks lstyle 2"
+end key
+
+amove offs+2*wd ybot
+begin graph
+ title "(e) Various Settings"
+ size wd hi
+ hscale fac
+ xaxis min 0 max 3 dticks 1
+ yaxis min 1 max 1000 dticks 1 log format "sci 0 10"
+ axis grid
+ ticks color grey70
+ subticks on color grey20
+ let d1 = 40*exp(x)*abs(sin(pi*x))+2
+ d1 line color red
+end graph
diff --git a/gle-refman/graph/fig/linemode.gle b/gle-refman/graph/fig/linemode.gle
new file mode 100644
index 0000000..5be61d1
--- /dev/null
+++ b/gle-refman/graph/fig/linemode.gle
@@ -0,0 +1,68 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 14 3.75
+
+include "../../script/manual.gle"
+
+manual_graph_mode
+
+sub dograph type$
+ begin graph
+ size 3 4
+ hscale 0.9
+ data "test.dat"
+ title "`d1 line "+type$+"'" dist 0.15
+ xaxis min -1 max 23
+ yaxis min 0 max 100 dticks 20
+ d1 line \expr{type$}
+ d1 marker square msize 0.15 color red
+ end graph
+end sub
+
+amove 0.5 -0.2
+dograph "impulses"
+
+amove 0.5+3.5 -0.2
+dograph "steps"
+
+amove 0.5+3.5*2 -0.2
+dograph "fsteps"
+
+amove 0.5+3.5*3 -0.2
+dograph "hist"
diff --git a/gle-refman/graph/fig/noisysine.gle b/gle-refman/graph/fig/noisysine.gle
new file mode 100644
index 0000000..ed1f2c2
--- /dev/null
+++ b/gle-refman/graph/fig/noisysine.gle
@@ -0,0 +1,89 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 15 6
+
+include "../../script/manual.gle"
+manual_graph_mode
+
+sub noisy_sin x
+ if (x = -2*pi) or (x = 2*pi) then return 0
+ else return sin(x)+0.3*rnd(1)
+end sub
+
+dy = 0
+dy2 = -0.1
+gw = pagewidth()/3
+gh = pageheight()/2
+
+labelsize = 0.30
+
+sub do_graph t$ m$
+ begin graph
+ size gw gh
+ scale 0.8 0.68
+ title t$ dist 0.22 hei labelsize
+ yaxis dticks 0.5 hei labelsize
+ xaxis format "pi" min -2*pi max 2*pi dticks pi hei labelsize
+ let d1 = noisy_sin(x) step pi/50
+ d1 \expr{m$} line color red
+ end graph
+end sub
+
+sub do_graph2 m$
+ do_graph m$ m$
+end sub
+
+amove 0.1 gh+dy
+do_graph "Noisy Sine" ""
+
+amove gw+0.1 gh+dy
+do_graph "svg\_smooth 1" "svg_smooth 1"
+
+amove 2*gw+0.1 gh+dy
+do_graph "svg\_smooth 5" "svg_smooth 5"
+
+amove 0.1 dy2
+do_graph2 "deresolve 10"
+
+amove gw+0.1 dy2
+do_graph2 "deresolve 10 average"
+
+amove 2*gw+0.1 dy2
+do_graph2 "deresolve 10 average smooth"
+
diff --git a/gle-refman/graph/fig/normal.csv b/gle-refman/graph/fig/normal.csv
new file mode 100644
index 0000000..e738767
--- /dev/null
+++ b/gle-refman/graph/fig/normal.csv
@@ -0,0 +1,537 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+-0.818223401
+-1.119418878
+0.084141171
+-0.047038714
+0.755053238
+-1.026181084
+1.195552265
+0.654005970
+-0.514538444
+-0.123519989
+0.386336853
+-1.709712761
+0.082070029
+0.679123543
+-1.975601169
+-0.803385444
+-0.372009018
+-0.523353130
+-0.747163386
+-0.084790052
+-0.248395129
+-0.081430809
+0.320559769
+-1.487950931
+1.314048815
+-0.595636883
+-0.010242071
+-1.806780906
+-1.096131624
+1.130666407
+-0.961323463
+0.670131211
+1.417187392
+-0.674008277
+-0.861007426
+0.039069028
+-1.529200224
+-0.007059310
+0.188766060
+0.212453808
+-0.864885318
+-0.921759425
+0.475934254
+1.415165281
+-1.677867935
+0.753588466
+-1.791268678
+-0.024153662
+-0.219260291
+0.327043854
+-2.962131851
+0.068600898
+-0.475605871
+-0.831550419
+0.884850575
+0.179845524
+1.322186551
+0.170665626
+1.808278129
+0.784807084
+0.315994023
+1.140208784
+-1.013554759
+1.663905739
+-0.060132454
+0.602549214
+-0.400524472
+0.081493084
+0.060286057
+0.716469092
+1.100875196
+-0.600408703
+-0.564339841
+-0.329531682
+-1.525064779
+0.792573717
+-0.070989631
+0.688954905
+-0.650392310
+0.019595204
+2.260623984
+1.166627775
+0.885101822
+-0.883342865
+-2.268289845
+-0.148199011
+1.525970775
+0.358547312
+0.303906026
+0.280192575
+-0.113270785
+0.506262168
+0.230896414
+0.422153752
+-0.492218443
+1.556242204
+0.645980031
+-0.731655260
+-0.658767294
+0.679348074
+-0.613323868
+0.527944881
+-1.251903172
+-0.468709549
+-1.840000391
+-0.432357315
+0.548190141
+1.197361239
+0.159012081
+-0.479289268
+0.022591535
+-0.954780498
+0.631003411
+2.391513061
+-0.540225091
+1.402282464
+0.038134119
+0.834093148
+-0.012844578
+0.649722288
+-0.193639442
+0.902023910
+0.774524843
+0.884490365
+-0.941148061
+-1.338777480
+-1.710377486
+0.612490718
+1.897852323
+0.647670126
+1.192367434
+0.026472327
+-0.105959420
+0.317974718
+0.317744290
+0.781950773
+-0.211768992
+0.442636081
+-0.354803894
+1.634163009
+-1.824705684
+0.782446206
+-1.256877827
+0.189021773
+0.241909572
+0.731827912
+1.143131589
+-0.666423149
+0.064183087
+0.656383817
+1.780643327
+-0.471958506
+0.242199205
+-0.437596552
+0.557856912
+-0.089459285
+-0.483214861
+1.071956316
+1.073719592
+0.242891415
+-0.165022567
+0.822662323
+-0.064416561
+-1.141563346
+-1.122918870
+-1.907654565
+-1.647942646
+1.166695274
+0.092711465
+0.552642937
+2.290765017
+0.195648267
+-0.793116397
+-1.898959669
+-0.834663136
+0.187330850
+-1.063574166
+-0.144651053
+0.237693464
+-1.924505749
+-0.319668922
+1.358350202
+0.849861116
+0.759096105
+0.375337723
+1.915548207
+-1.375333936
+-0.490585659
+0.536422644
+2.771474801
+0.307237522
+-1.558009696
+0.217097069
+0.127986564
+-1.090314572
+-1.006432753
+-0.990620630
+-0.221453213
+0.480886908
+0.531878989
+-0.060147768
+-0.063235239
+1.157241459
+-0.140921612
+1.751499398
+-0.595820282
+1.515669346
+-0.750223485
+-1.961264028
+-1.045901599
+1.484622896
+-1.640015849
+1.742482835
+0.787190509
+-0.011919863
+1.737335178
+0.570172164
+-0.873523687
+-0.371818233
+-0.687666038
+-1.173187109
+0.225451636
+-0.911408042
+-0.769803282
+-2.089162178
+-0.484782004
+-0.433835521
+0.395570631
+0.438698388
+-2.974650219
+1.309828531
+1.273515302
+-0.434508727
+0.521854894
+0.690708534
+-0.824694687
+-0.002234318
+0.733346415
+-0.407726813
+0.780266090
+0.278113928
+1.088301469
+0.953393040
+0.101010776
+-1.499328049
+0.134042502
+-0.598439871
+-1.798021476
+-0.817172496
+-0.681768161
+0.309429030
+0.607879292
+-1.800084323
+0.550414343
+1.521553471
+-0.176693915
+1.110189474
+-0.565749547
+-1.063345577
+-2.145236747
+-0.374113305
+1.986077660
+1.906135360
+0.497397768
+-1.287680614
+-2.791624661
+0.454943375
+0.384289712
+-0.428902100
+0.881810068
+-1.318662092
+0.088824773
+1.116879458
+0.541041964
+0.630423482
+0.612189864
+0.535997073
+-2.148978488
+-0.116848097
+-0.519806516
+-0.096460334
+-1.404523199
+0.514865531
+-1.598051953
+-0.873365079
+-2.069778256
+0.046598717
+0.295336773
+-1.157163765
+-0.164964066
+0.162444850
+3.104242757
+1.532474625
+0.494813737
+1.374123115
+1.346121961
+2.075072186
+-0.900444592
+-0.723239036
+-0.598565069
+-0.117943435
+1.026376595
+-0.373615443
+2.319341176
+0.213674765
+1.644901479
+2.314284133
+-0.881356805
+-0.777634468
+0.149924779
+1.274423020
+-0.075110041
+0.924279846
+2.830223954
+-0.632119434
+0.426097605
+0.750317825
+0.792014513
+0.255811523
+-2.095241809
+-1.420528904
+-0.173709620
+0.263840878
+0.052231214
+0.056778503
+1.073769698
+-0.602439807
+0.270592431
+0.943100024
+-0.186282345
+-0.658161990
+-0.281835259
+0.801901475
+-1.188101546
+-0.372153820
+0.088797813
+0.869739153
+1.593809732
+-0.658670408
+1.360949548
+-0.677055353
+-0.677557169
+0.095744938
+-0.016624974
+0.164392885
+0.079174689
+-0.721634482
+-1.580753178
+-0.138098679
+-1.641471673
+-1.221624304
+-0.299948451
+1.657307714
+-0.322201809
+-1.494867472
+0.052048048
+1.694586199
+0.080890276
+0.338275327
+0.230342786
+-1.116308175
+-1.056702746
+1.699764799
+0.617501022
+1.453524599
+-2.196640817
+-1.514352871
+0.831004861
+0.602751482
+0.108796726
+0.401527669
+0.091689338
+-0.770064472
+-0.907687515
+-0.004380539
+0.770858727
+-1.544640413
+1.132025377
+1.286558301
+0.574239895
+-0.403595431
+-0.828754034
+1.431226601
+0.775348477
+1.167056873
+-1.108034200
+-1.889273548
+0.561821796
+0.708989184
+1.189834873
+-1.923224322
+2.118086887
+-0.168955764
+-0.617539541
+-1.388642172
+-0.633946270
+0.919069503
+0.534091964
+0.013756174
+-0.547635906
+0.126535198
+2.186914325
+0.544113541
+1.956777266
+1.822055923
+0.283381130
+-0.649266339
+-1.254131863
+2.254878530
+-1.211821440
+-0.594644718
+0.905283880
+-0.032559582
+-0.675902076
+-0.578300081
+-0.892346625
+-1.298233375
+-0.268286372
+-1.624803805
+-0.607675686
+-0.032494634
+-0.181490113
+-1.573547456
+0.381030377
+-0.408258696
+-1.215830279
+-0.191452227
+0.353232179
+-0.337670670
+0.715728402
+0.137908735
+2.062954931
+-1.106522164
+-0.605374729
+1.043847944
+1.118159451
+0.946241026
+0.241032288
+0.202779148
+1.596604586
+0.781867768
+-1.450242579
+0.123030561
+-0.620028967
+0.914349424
+-0.134840613
+0.966986332
+0.301443619
+0.405772154
+-0.642032485
+-0.306363189
+0.570526469
+0.092824097
+-3.054226505
+-0.957921829
+0.519414196
+1.354875095
+-1.497154757
+-0.297723040
+-0.196966650
+-0.265354256
+-1.295797262
+-0.442217526
+-0.386417029
+0.330771527
+-0.528329863
+-0.561802136
+0.603719280
+1.656141573
+0.810800707
+-0.145781841
+1.290284013
+-1.565462327
+-0.117007060
+0.285250874
+1.062784912
+-0.471335165
+0.849083194
+0.929782172
+-0.507318924
+0.459738826
+0.641070496
+0.612928915
+-0.812287470
+-0.201969336
+0.180692760
+-0.932909759
+1.359828396
+2.809105159
+-0.239358315
+-0.173974689
+-0.536431800
+-1.188504929
+0.473902795
+-0.101848526
+-0.162696964
+-0.493754413
+1.029033729
+0.430960801
+-1.782413333
diff --git a/gle-refman/graph/fig/normal.gle b/gle-refman/graph/fig/normal.gle
new file mode 100644
index 0000000..6396cc3
--- /dev/null
+++ b/gle-refman/graph/fig/normal.gle
@@ -0,0 +1,54 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 8 4
+
+include "../../script/manual.gle"
+
+manual_graph_mode
+begin graph
+ scale auto
+ title "1000 Samples of $N(\mu=0, \sigma=1)$"
+ ytitle "Frequency"
+ xtitle "Value"
+ data "normal.csv"
+ xticks off
+ yaxis min 0 max 100 dticks 20
+ let d2 = hist d1 step 0.5
+ d2 line bar color red
+end graph
diff --git a/gle-refman/graph/fig/semitrans.gle b/gle-refman/graph/fig/semitrans.gle
new file mode 100644
index 0000000..1c40c99
--- /dev/null
+++ b/gle-refman/graph/fig/semitrans.gle
@@ -0,0 +1,69 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 6.5 5.5
+
+include "../../script/manual.gle"
+manual_graph_mode
+
+begin graph
+ scale auto
+ title "Semi-Transparent Fills"
+ xtitle "Time"
+ ytitle "Output"
+ xaxis min 0 max 9
+ yaxis min 0 max 6 dticks 1
+ let d1 = sin(x)*1.5+1.5 from 0 to 10
+ let d2 = 1/x from 0.01 to 10
+ let d3 = 10*(1/sqrt(2*pi))*exp(-2*(sqr(x-4)/sqr(2))) from 0 to 10
+ key background gray5 hei 0.27
+ begin layer 300
+ fill x1,d1 color rgba255(255,0,0,80)
+ d1 line color red key "$1.5\sin(x)+1.5$"
+ end layer
+ begin layer 301
+ fill x1,d2 color rgba255(0,128,0,80)
+ d2 line color green key "$1/x$"
+ end layer
+ begin layer 302
+ fill x1,d3 color rgba255(0,0,255,80)
+ d3 line color blue key "$\frac{10}{\sqrt{2\pi}}\exp\left(\frac{-2(x-4)^2}{2^2}\right)$"
+ end layer
+end graph
+
+
diff --git a/gle-refman/graph/fig/shadow.gle b/gle-refman/graph/fig/shadow.gle
new file mode 100644
index 0000000..0213e68
--- /dev/null
+++ b/gle-refman/graph/fig/shadow.gle
@@ -0,0 +1,67 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 6 4.5
+
+include "../../script/manual.gle"
+manual_graph_mode
+
+sub background
+ amove xg(xgmin) yg(ygmin)
+ local wd = xg(xgmax)-xg(xgmin)
+ local hi = yg(ygmax)-yg(ygmin)
+ colormap y 0 0 0.8 1 1 200 wd hi
+end sub
+
+begin graph
+ scale auto
+ title "Chart 1"
+ xaxis dticks 0.2
+ yaxis dticks 0.2
+ yaxis grid
+ yticks color gray
+ let d1 = x^2
+ let d2 = x^2/2
+ key pos tl compact
+ d1 line marker wdiamond mdist 1 color steelblue key "$M_1$"
+ d2 line marker wcircle mdist 1 color green key "$M_2$"
+ begin layer 150
+ draw background
+ end layer
+end graph
+
diff --git a/gle-refman/graph/fig/sqroot.gle b/gle-refman/graph/fig/sqroot.gle
new file mode 100644
index 0000000..fe82e54
--- /dev/null
+++ b/gle-refman/graph/fig/sqroot.gle
@@ -0,0 +1,61 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 7 4.5
+
+include "../../script/manual.gle"
+manual_graph_mode
+
+amove 0 0.1
+begin graph
+ yaxis dticks 2
+ title "Square Root Function"
+ xtitle "$x$"
+ ytitle "$y = \sqrt{\alpha x}$"
+ for alpha = 1 to 10 step 2
+ let d[alpha] = sqrt(alpha*x) from 0 to 10
+ d[alpha] line color rgb(alpha/10,0,0)
+ next alpha
+end graph
+
+set just lc hei 0.27
+for alpha = 1 to 10 step 2
+ amove xg(xgmax)+0.1 yg(sqrt(alpha*xgmax))
+ write "$\alpha = "+num$(alpha)+"$"
+next alpha
+
diff --git a/gle-refman/graph/fig/test.dat b/gle-refman/graph/fig/test.dat
new file mode 100644
index 0000000..8f92062
--- /dev/null
+++ b/gle-refman/graph/fig/test.dat
@@ -0,0 +1,44 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+1 10 5 90 12
+3 30 15 80 22
+5 50 25 70 10
+8 80 40 60 15
+10 90 45 55 11
+14 70 35 50 14
+19 80 40 60 6
diff --git a/gle-refman/graph/fig/y2axis-scale.gle b/gle-refman/graph/fig/y2axis-scale.gle
new file mode 100644
index 0000000..fd24f6b
--- /dev/null
+++ b/gle-refman/graph/fig/y2axis-scale.gle
@@ -0,0 +1,61 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 7 5.5
+
+include "../../script/manual.gle"
+
+manual_graph_mode
+
+amove 0 -0.2
+begin graph
+ size 7 5.5
+ scale 0.8 0.7
+ title "Scale Graph to x2/y2 Axis"
+ let d1 = x^2 from -2 to 2
+ let d2 = sin(x) from 0 to 4*pi
+ d1 line color red key "$x^2$"
+ d2 x2axis y2axis line color blue key "$\sin(x)$"
+ key pos bl
+ xaxis dticks 1
+ yaxis dticks 1
+ y2axis dticks 0.5
+ x2axis format pi min 0 max 4*pi dticks pi
+end graph
+
+
diff --git a/gle-refman/graph/graph.tex b/gle-refman/graph/graph.tex
new file mode 100644
index 0000000..5772ffd
--- /dev/null
+++ b/gle-refman/graph/graph.tex
@@ -0,0 +1,1531 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% GLE - Graphics Layout Engine <http://www.gle-graphics.org/> %
+% %
+% Modified BSD License %
+% %
+% Copyright (C) 2009 GLE. %
+% %
+% Redistribution and use in source and binary forms, with or without %
+% modification, are permitted provided that the following conditions %
+% are met: %
+% %
+% 1. Redistributions of source code must retain the above copyright %
+% notice, this list of conditions and the following disclaimer. %
+% %
+% 2. Redistributions in binary form must reproduce the above %
+% copyright notice, this list of conditions and the following %
+% disclaimer in the documentation and/or other materials provided with %
+% the distribution. %
+% %
+% 3. The name of the author may not be used to endorse or promote %
+% products derived from this software without specific prior written %
+% permission. %
+% %
+% THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR %
+% IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED %
+% WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE %
+% ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY %
+% DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL %
+% DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE %
+% GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS %
+% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER %
+% IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR %
+% OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN %
+% IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\chapter{The Graph Module}
+\index{graphing}\label{graph:chap}
+A graph should start with {\sf begin graph} and end with {\sf end graph}.
+The data to be plotted are organised into datasets. A dataset consists of a
+series of (X,Y) coordinates, and has a name based on the letter ``d'' and a
+number between 1 and 1000, e.g. {\sf d1}
+
+The name {\sf dn} can be used to define a default for
+all datasets. Many graph commands described below start with {\sf d}{\it n}.
+This would normally be replaced by a specific dataset number e.g.,
+
+\preglecode{}
+\begin{Verbatim}
+ d3 marker diamond
+\end{Verbatim}
+\postglecode{}
+
+For each {\sf xaxis} command there is a corresponding {\sf yaxis, y2axis
+and x2axis} command for setting the top left and right hand axes. These
+commands are not explicitly mentioned in the following descriptions.
+
+\section{Graph Commands (a summary)}
+{\sf center} \\
+{\sf colormap {\it fct} {\it pixels-x} {\it pixels-y} [{\it color}] [{\it invert}] [{\it zmin} $z_1$] [{\it zmax} $z_2$] [{\it palette} {\it pal}]} \\
+{\sf data {\it filename {\sf [}d1 d2 d3 ...{\sf ] [}d1=c1,c3 ...{\sf ]} } [ignore {\it n}] [comment {\it char}] } \\
+{\sf discontinuity threshold {\it t}} \\
+{\sf dn [deresolve m] [average] line} \\
+{\sf dn err {\it d5} errwidth {\it width-exp} errup {\it nn\%} errdown {\it d4}} \\
+{\sf dn herr {\it d5} herrwidth {\it width-exp} herrleft {\it nn\%} herrright {\it d4}} \\
+{\sf dn key {\it "Dataset title"}} \\
+{\sf dn line [impulses] [steps] [fsteps] [hist] [bar]}\\
+{\sf dn lstyle {\it line-style} lwidth {\it line-width} color {\it col}} \\
+{\sf dn marker {\it marker-name} [color {\it c}] [msize {\it marker-size}] [mdata {\it dn}] [mdist {\it dexp}]} \\
+{\sf dn nomiss} \\
+{\sf dn smooth | smoothm} \\
+{\sf dn svg\_smooth [m]} \\
+{\sf dn xmin {\it x-low} xmax {\it x-high} ymin {\it y-low} ymax {\it y-high}} \\
+{\sf dn [x2axis] [y2axis]} \\
+{\sf dn file ``all.dat,xc,yc'' [marker {\sf mname}] [line]} \\
+{\sf d$\left[i\right]$ $\ldots$} \\
+{\sf draw call} \\
+{\sf fullsize } \\
+{\sf hscale h} \\
+{\sf key pos {\it tl} nobox hei {\it exp} offset {\it xexp yexp} } \\
+{\sf let ds = {\it exp {\sf [from} low{\sf] [to} high{\sf] [step} exp{\sf] [where} exp{\sf]}}} \\
+{\sf let ds = {\it x-exp, y-exp {\sf [from} low{\sf] [to} high{\sf] [step} exp{\sf] [where} exp{\sf]}}} \\
+{\sf let dn = [routine] dm [options]} \\
+{\sf let ds = hist dm [from {\it x1}] [to {\it x2}] [bins {\it n}] [step {\it n}]} \\
+{\sf let ds = \ldots [nsteps {\it n}]} \\
+{\sf let ds = \ldots [range {\it dn}]} \\
+{\sf math } \\
+{\sf nobox } \\
+{\sf scale {\it h v}} \\
+{\sf scale auto} \\
+{\sf size {\it x y }}\\
+{\sf title {\it "title"} [hei {\it ch-hei}] [color {\it col}] [font {\it font}] [dist {\it cm}] } \\
+{\sf vscale v} \\
+{\sf x2labels on} \\
+{\sf xaxis | yaxis | x2axis | y2axis}\\
+{\sf xaxis angle $\alpha$} \\
+{\sf xaxis base {\it exp-cm}} \\
+{\sf xaxis color {\it col} font {\it font-name} hei {\it exp-cm} lwidth {\it exp-cm}} \\
+{\sf xaxis dsubticks {\it sub-distance} } \\
+{\sf xaxis format {\it format-string} } \\
+{\sf xaxis grid } \\
+{\sf xaxis log} \\
+{\sf xaxis min {\it low} max {\it high}} \\
+{\sf xaxis nofirst nolast} \\
+{\sf xaxis nticks {\it number} dticks {\it distance} dsubticks {\it distance}} \\
+{\sf xaxis ftick {\it x0} dticks {\it distance}} \\
+{\sf xaxis {\sf off}} \\
+{\sf xaxis shift {\it cm-exp}} \\
+{\sf xaxis symticks} \\
+{\sf xlabels font {\it font-name} hei {\it char-hei} color {\it col} }\\
+{\sf xnames {\it "name" "name" ...}} \\
+{\sf xnames from {\it dx}} \\
+{\sf xnoticks {\it pos1 pos2 pos3 ...}} \\
+{\sf xplaces {\it pos1 pos2 pos3 ...}} \\
+{\sf xside color {\it col} lwidth {\it line-width} off } \\
+{\sf xsubticks {\it {\sf lstyle} num {\sf lwidth} exp {\sf length} exp {\sf on} {\sf off}}} \\
+{\sf xticks {\it {\sf lstyle} num {\sf lwidth} exp {\sf length} exp {\sf off}}} \\
+{\sf xtitle {\it "title"} [hei {\it ch-hei}] [color {\it col}] [font {\it font}] [dist {\it cm}] [adist {\it cm}]} \\
+{\sf y2title {\it "text-string"} [rotate] } \\
+{\sf yaxis negate} \\
+{\sf bar {\it dx,...} dist {\it spacing}}\\
+{\sf bar {\it dn,...} fill {\it f} pattern {\it p}} \\
+{\sf bar {\it dx,...} from {\it dy,...}}\\
+{\sf bar {\it dn,...} horiz} \\
+{\sf bar {\it dn,...} width {\it xunits,...} fill {\it col,...} color {\it col,...} }\\
+{\sf fill x1,{\it d3} color {\it green} xmin {\it val} xmax {\it val}} \\
+{\sf fill {\it d4},x2 color {\it blue} ymin {\it val} ymax {\it val}} \\
+{\sf fill {\it d3,d4} color {\it green} xmin {\it val} xmax {\it val}} \\
+{\sf fill {\it d4} color {\it green} xmin {\it val} xmax {\it val}} \\
+
+
+\section{Graph Commands (in detail)}
+
+\begin{commanddescription}
+\item[{\sf center}]
+\index{center}
+Centers the graph (including the title and axis labels) in the graph box. (The command `{\sf scale auto}' implicitly performs `{\sf center}'.)
+
+\item [{\sf colormap {\it fct} {\it pixels-x} {\it pixels-y} [{\it color}] [{\it invert}] [{\it zmin} $z_1$] [{\it zmax} $z_2$] [{\it palette} {\it pal}]}]
+\index{colormap!graph block}
+
+The colormap command is discussed in Section~\ref{colormap}.
+
+\item[{\sf data {\it filename {\sf [}d1 d2 d3 ...{\sf ] [}d1=c1,c3 ...{\sf ]}} [ignore {\it n}] [comment {\it char}]}]
+\index{data}\label{cmd:data}
+Specifies the name of a file to read data from. By default,
+the data will be read into the next free datasets unless the
+optional specific dataset names are specified.
+
+A dataset consists of a series of (X,Y) coordinates, and has a
+name based on the letter {\sf d} and a number between 1 and 1000,
+e.g. {\sf d1} or {\sf d4}. Up to 1000 datasets may be defined.
+
+From a file with 3 columns the command
+`{\sf data \verb+"+data.csv\verb+"+}' would read the first and second columns as the x and y values for dataset 1 (d1) and the first and third columns as the x and y values for dataset 2 (d2). The next {\sf data} command would use dataset 3 (d3).
+
+\index{files}
+\index{data (example file)}
+\index{example data file}
+Such a data file looks like this:
+
+\begin{Verbatim}
+1, 2.7, 3
+2, 5, *
+3, 7.8, 7
+4, 9, 4
+\end{Verbatim}
+
+The first point of dataset {\bf d1} would then be ({\bf 1, 2.7}) and the first point of dataset {\bf d2} would be ({\bf 1, 3}). The data values can be space, tab, comma, or semi-colon separated.
+
+\index{missing value}\index{?}Missing values can be indicated with ``\verb+*+'', ``\verb+?+'', ``\verb+-+'', or ``\verb+.+''.
+
+The option {\sf d3=c2,c3} allows particular columns of data to be read into a dataset. In this example, d3 would read its x-values from column 2 and y-values from column 3.
+
+\begin{minipage}[c]{8cm}
+\begin{Verbatim}
+size 7 3.5
+begin graph
+ size 6 3
+ title "Simple Graph"
+ xtitle "Time"
+ ytitle "Output"
+ data "data.csv"
+ d1 line marker triangle color red
+end graph
+\end{Verbatim}
+\end{minipage}
+\hfill
+\begin{minipage}[c]{7cm}
+\mbox{\input{tutorial/fig/tut_graph.inc}}
+\end{minipage}
+
+{\bf Comments:}\index{comment}\index{"!} Comments can be included with the symbol ``\verb+!+''. All characters from ``\verb+!+'' until the end of the line of the data file are ignored. It is possible to change the symbol that indicates a comment with the option `comment'. E.g., with `{\sf data \verb+"+data.csv\verb+"+ comment \#}', lines starting with \# will be treated as comments.
+
+{\bf Ignore header:}\label{opt:ignore}\index{ignore} The option {\sf ignore {\it n}} makes GLE ignore the first $n$ lines of the data file. This is useful if the first $n$ lines do not contain data.
+
+{\bf Auto key:}\index{key!data based} If the first row of a data file does not contain actual data but instead contains column labels, then these labels are used by GLE to create a key for the graph (Chapter~\ref{key:chap}). GLE automatically detects this case by checking if all fields in the first row are valid numbers or not. If not, then GLE assumes that the first row contains column labels. Column labels that include a space or that could be incorrectly interpreted as a number should [...]
+
+\begin{figure}[tb]
+\begin{minipage}[t]{6.35cm}%
+\begin{Verbatim}
+begin graph
+ xtitle "Age"
+ ytitle "Weight"
+ data "age.csv"
+ key pos br compact
+ d1 line color red marker circle
+ d2 line color blue marker triangle
+ d3 line color green marker square
+end graph
+\end{Verbatim}
+\end{minipage}
+\begin{minipage}[t]{3.5cm}%
+\begin{Verbatim}
+Age, John, Mary, Ken
+15, 73, 65, 77
+20, 80, 68, 77
+30, 82, 76, 80
+40, 85, 77, 82
+\end{Verbatim}
+\end{minipage}
+\begin{minipage}[t]{6cm}%
+\vskip0pt%
+\mbox{\input{graph/fig/age.inc}}
+\end{minipage}
+\caption{\label{fig:autokey}Line graph with key taken from the column labels in the first data row. Left: the graph block; middle: the dataset ``age.csv''; right: the resulting graph.}
+\end{figure}
+
+{\bf Auto x-labels:} If the first column of a data file does not contain numeric data, but instead contains symbolic labels, then these labels are used to label the horizontal axis. For example, if the data file contains
+
+\begin{Verbatim}
+Mon, 1
+Tue, 4
+Wed, 3.5
+Thu, 2
+Fri, 1
+Sat, 5
+Sun, 4
+\end{Verbatim}
+
+\noindent{}then GLE creates an x-axis with one label for each day of the week, similar to that of the graph in Fig.~\ref{fig:weekday}. See also the `{\sf xnames}' command for more details on how to add labels to an axis.
+
+\index{GZIP}\index{compression}GLE can also read GZIP compressed data files. If the data file name ends in ``.gz'', then GLE will assume it is GZIP compressed and read it accordingly.
+
+\item[{\sf discontinuity threshold {\it t}}]
+\index{discontinuity}
+
+GLE can automatically detect discontinuities in graphs. To enable this feature, add ``{\sf discontinuity threshold $t$}'' to the graph block. The value of $t$ is the percentage of the axis range that the graph needs to change in one step in order to be detected as a discontinuity. Fig.~\ref{fig:discont} plots the ``floor'' function as an example.
+
+The discontinuity detection feature inserts a missing value at the position of each discontinuity. This leads to gaps in the curve (Fig.~\ref{fig:discont}, left). These can be disabled by using the ``nomiss'' keyword (Fig.~\ref{fig:discont}, middle).
+
+\begin{figure}
+\centering
+\mbox{\input{graph/fig/discontinuity.inc}}
+\caption{\label{fig:discont}An example of the auto-discontinuity detection feature.}
+\end{figure}
+
+\item[{\sf dn [deresolve m] [average] line}]
+\index{dn!deresolve}\index{deresolve}
+
+The `{\sf deresolve}' option sub-samples a dataset. Given the parameter $m > 1$, it keeps only 1 out of every $m$ points (starting with the first point). If the option `{\sf average}' is given, then it will compute the average of the y-values of every window of $m$ points. This average value will be plotted at the middle (x-value) of the window. The `{\sf deresolve}' option never removes the first and last point in a dataset if it is used in conjunction with `{\sf dn line}'.
+
+\item[{\sf dn err {\it d5} errwidth {\it width-exp} dn errup {\it nn\%} errdown {\it d4}} ]
+\index{dn!err} \index{dn!errwidth} \index{dn!errup} \index{dn!errdown}
+\index{error bars (see dn err) }
+For drawing error bars on a graph. The error bars can be specified as
+an absolute value, as a percentage of the y value, or as a dataset.
+The up and down error bars can be specified separately e.g.,
+
+\preglecode{}
+\begin{Verbatim}
+ d3 err .1
+ d3 err 10%
+ d3 errup 10% errdown d2
+ d3 err d1 errwidth .2
+\end{Verbatim}
+\postglecode{}
+
+\begin{minipage}[c]{8cm}
+\begin{Verbatim}
+begin graph
+ title "Error Bars"
+ dn lstyle 2 msize 1.5
+ d1 marker circle errup 30% errdown 1
+ d2 marker square err 30% errwidth .1
+end graph
+\end{Verbatim}
+\end{minipage}
+\hfill
+\begin{minipage}[c]{7cm}
+\mbox{\input{graph/fig/gc_err.inc}}
+\end{minipage}
+
+\item[{\sf dn herr {\it d5} herrwidth {\it width-exp} dn herrleft {\it nn\%} herrright {\it d4}} ]
+\index{dn!herr} \index{dn!herrwidth} \index{dn!herrleft} \index{dn!herrright}
+\index{horizontal error bars}
+These commands are identical to the error bar commands above except that
+they will draw bars in the horizontal plane.
+
+\item[{\sf dn key {\it "Dataset title"}} ]
+\index{dn!key}
+\index{key}
+If a dataset is given a title like this a key will be drawn. Use the
+{\sf key} command (below, after hscale) to set the size and
+position of the key. Use the key module (Chapter~\ref{key:chap}) to draw
+more complex keys.
+
+\item[{\sf dn line [impulses] [steps] [fsteps] [hist] [bar]}]
+\index{dn}
+\index{dn!line}
+\index{line}
+\index{missing}
+This tells GLE to draw lines between the points of the dataset. By
+default GLE will not draw lines or markers, this is often the reason
+for a blank graph.
+
+If a dataset has missing values GLE will not draw a line to the next
+real value, which leaves a gap in the curve. To avoid this
+behavior simply use the {\sf nomiss} qualifier on the {\sf dn} command
+used to define the line. This simply throws away missing values so that
+lines are drawn from the last real value to the next real value.
+
+The options {\sf impulses}, {\sf steps}, {\sf fsteps}, {\sf hist}, and {\sf bar} draw lines as shown in Figure~\ref{linemode:fig}.
+\begin{itemize}
+\item {\sf impulses}: connects each point with the xaxis.
+
+\item {\sf steps}: connects consecutive points with two line segments: the first from (x1,y1) to (x2,y1) and the second from (x2,y1) to (x2,y2).
+
+\item {\sf fsteps}: connects consecutive points with two line segments: the first from (x1,y1) to (x1,y2) and the second from (x1,y2) to (x2,y2).
+
+\item {\sf hist}: useful for drawing histograms: assumes that each point is the center of a bin of the histogram.
+
+\item {\sf bar}: similar to `{\sf hist}', but now also separates the bins with vertical lines.
+\end{itemize}
+
+\begin{figure}[tb]
+\centering
+\input{graph/fig/linemode.inc}
+\caption{\label{linemode:fig}The {\sf impulses}, {\sf steps}, {\sf fsteps}, and {\sf hist} options of the line command.}
+\end{figure}
+
+\item[{\sf dn lstyle {\it line-style} lwidth {\it line-width} color {\it col}} ]
+\index{dn!lstyle}
+\index{dn!lwidth}
+\index{dn!color}
+\index{color (graph lines)}
+\index{lstyle (graph lines)}
+\index{lwidth (graph lines)}
+These qualifiers are all fairly self explanatory. See the {\sf lstyle} command
+in Chapter~\ref{prim:chap} (Page~\pageref{lstyle:cmd}) for details of specifying line styles.
+
+\item[{\sf dn marker {\it marker-name} [color {\it c}] [msize {\it marker-size}] [mdata {\it dn}] [mdist {\it dexp}]}]
+\index{dn!marker}
+\index{marker}
+Specifies the marker to be used for the dataset. There is a set of pre-defined markers (refer to Appendix A.1 for a list) which can be specified by name (e.g., {\sf circle, square, triangle, diamond, cross, ...}). The marker's color can be specified with the `{\sf color}' option.
+
+Markers can also be drawn using a user-defined subroutine (See the {\sf define marker} command in Chapter 2). The {\sf mdata} option allows a secondary dataset to be defined which will be used to pass another parameter to the marker subroutine, this allows each marker to be drawn at a different and date dependent angle, size or colour.
+
+\index{dn!msize}
+The {\sf msize} qualifier sets the marker size for that dataset. The size is a character height in cm, so that the actual size of the markers will be about 0.7 of this value.
+
+\index{dn!mdist}
+The `{\sf mdist}' option can be used to specify the distance between the markers on a curve. This can be used to add markers to a plot of a continuous function. See Fig.~\ref{grkey:fig} for an example.
+
+
+\item[{\sf dn nomiss} ]
+\index{dn!nomiss}
+\index{nomiss}
+If a dataset has missing values, GLE will not draw a line to the next
+real value, which leaves a gap in the curve. To avoid this
+behavior simply use the {\sf nomiss} qualifier on the {\sf dn} command
+used to define the line. This simply ignores missing values.
+
+\begin{minipage}[c]{8cm}
+\begin{Verbatim}
+begin graph
+ title "Ignore missing values (nomiss)"
+ xtitle "Time"
+ ytitle "Output"
+ data "tut.dat"
+ d1 lstyle 2
+ d2 nomiss lstyle 1 marker diamond msize .2
+end graph
+\end{Verbatim}
+\end{minipage}
+\hfill
+\begin{minipage}[c]{7cm}
+\mbox{\input{graph/fig/gc_nomiss.inc}}
+\end{minipage}
+
+\begin{figure}[tb]
+\centering
+\input{graph/fig/noisysine.inc}
+\caption{\label{smooth:fig}Various smooth options.}
+\end{figure}
+
+\item[{\sf dn [smooth] [smoothm] line}]
+\index{dn!smooth} \index{smooth} \index{smoothm}
+This will make GLE draw a smoothed line through the points.
+A third degree polynomial is fitted piecewise to the given points.
+
+The {\sf smoothm} alternative will work for multi valued functions,
+i.e., functions which have more than one y value for each x value.
+
+\item[{\sf dn [svg\_smooth] [m] line}]
+\index{dn!svg\_smooth}\index{svg\_smooth}\index{Savitsky Golay smoothing}
+
+The option {\sf svg\_smooth} performs a quadratic or cubic and 7 point Savitsky Golay smoothing on the data. The parameter $m$ specifies the number of iterations of smoothing, that is, the smoothing algorithm is run $m$ times on the dataset. Fig.~\ref{smooth:fig} shows an example.
+
+\item[{\sf dn xmin {\it x-low} xmax {\it x-high} ymin {\it y-low} ymax {\it y-high}} ]
+\index{dn!xmin} \index{dn!xmax} \index{dn!ymin} \index{dn!ymax}
+These commands map the dataset onto the graph's boundaries.
+The data will be drawn as if the X axis was labeled from {\it x-low} to {\it
+x-high} (regardless of how the axis is actually labeled). A point in the
+dataset at X = {\it x-low} will appear on the left hand edge of the graph.
+
+\item[{\sf dn [x2axis] [y2axis]}]
+\index{dn!x2axis} \index{dn!y2axis}
+Sometimes one needs to draw two or more curves on the same graph that have different scales or of which the values are measured in different units. In such cases, some of the curves may be associated to the x2axis and/or the y2axis.
+
+The example in Fig.~\ref{fig:y2scale} illustrates this for the parabola $y = x^2$ and the sine function $y = \sin{x}$. The former is scaled to the x/y axis as usual and the latter is scaled to the x2/y2 axis.
+
+\begin{figure}[tb]
+\begin{minipage}[c]{9.2cm}
+\begin{Verbatim}
+begin graph
+ let d1 = x^2 from -2 to 2
+ let d2 = sin(x) from 0 to 4*pi
+ d1 line color red key "$x^2$"
+ d2 x2axis y2axis line color blue key "$\sin(x)$"
+ x2axis format pi min 0 max 4*pi dticks pi
+end graph
+\end{Verbatim}
+\end{minipage}
+\hfill
+\begin{minipage}[c]{7cm}
+\mbox{\input{graph/fig/y2axis-scale.inc}}
+\end{minipage}
+\caption{\label{fig:y2scale}A parabola scaled to the x/y axis and the sine function scaled to the x2/y2 axis.}
+\end{figure}
+
+\item[{\sf dn file ``all.dat,xc,yc'' [marker {\sf mname}] [line]} ]
+\index{file (dataset)}
+\index{dn!file}
+
+The `file' option specifies a file from which the dataset is to be loaded. This option is an alternative to the ``data'' command (p.~\pageref{cmd:data}).
+
+By default the first two columns of the data file will be read in, but other columns may be specified.
+E.g., \verb+"all.dat,3,2"+ would read $x$-values from column 3 and $y$-values from column 2. Or, to read the 4th dataset, specify the file as \verb+"all.dat,1,5"+.
+
+If the x column is specified as {\sf '0'} then GLE will generate the x data points. E.g., {\sf 1,2,3,4,5...}
+
+The file option also accepts variables in place of the file name, e.g.:
+
+\begin{Verbatim}
+ x$ = "test.dat,2,3"
+ d1 file x$ line color red
+\end{Verbatim}
+
+% The {\sf AUTOSCALE} option pre-reads the file to scale the axis,
+% which is slow but sometimes required, e.g.:
+%
+% \begin{Verbatim}
+% d1 bigfile a.dat line autoscale
+% \end{Verbatim}
+%
+% Many (but not all) of the normal dn commands can be used with the
+% {\sf bigfile} command. E.g., {\sf marker, lstyle, xmin, xmax, ymin, ymax,
+% color and lwidth.} You cannot use commands like {\sf let} or {\sf bar}
+% with the {\sf bigfile} command.
+
+\item[{\sf d$\left[i\right]$ $\ldots$}]
+\index{for-next}
+
+A data set identifier ``d$i$'' can also be written using the array notation ``d$\left[i\right]$''. Any valid expression that results in an integer can be used inside d$\left[\ldots\right]$. This is useful if you want to select a data set based on the result of an expression.
+
+If-then-else, for-next loops, and other control constructs can be used insdide a graph block. These can be combined with the d$\left[i\right]$ notation to draw many similar functions. See Fig.~\ref{fig:sqroot} for an example that draws the functions $y = \sqrt{\alpha x}$ with $\alpha$ an integer constant.
+
+\begin{figure}[tb]
+\begin{minipage}[c]{9.2cm}
+\begin{Verbatim}
+begin graph
+ ...
+ for alpha = 1 to 10 step 2
+ let d[alpha] = sqrt(alpha*x) from 0 to 10
+ d[alpha] line color rgb(alpha/10,0,0)
+ next alpha
+end graph
+...
+for alpha = 1 to 10 step 2
+ amove xg(xgmax)+0.1 yg(sqrt(alpha*xgmax))
+ write "$\alpha = "+num$(alpha)+"$"
+next alpha
+\end{Verbatim}
+\end{minipage}
+\hfill
+\begin{minipage}[c]{7cm}
+\mbox{\input{graph/fig/sqroot.inc}}
+\end{minipage}
+\caption{\label{fig:sqroot}For-next loops in graph blocks and the use of ``d[i]''.}
+\end{figure}
+
+\item[{\sf draw call}]
+\index{draw}
+\label{cmd:gdraw}
+
+Executes subroutine `call' while drawing the graph. The call is drawn in the current layer (See ``begin layer''). The output is clipped to the graph window and the subroutine can use the functions `xg()', 'yg()', and variables `xgmin', `ygmin', etc. This is useful for drawing a custom graph background (Fig.~\ref{fig:shadow}) or for defining a custom graph type (Section~\ref{sec:polar}).
+
+\begin{figure}[tb]
+\begin{minipage}[c]{9.2cm}
+\begin{Verbatim}
+sub background
+ amove xg(xgmin) yg(ygmin)
+ local wd = xg(xgmax)-xg(xgmin)
+ local hi = yg(ygmax)-yg(ygmin)
+ colormap y 0 0 0.8 1 1 200 wd hi
+end sub
+
+begin graph
+ ...
+ d1 line marker wdiamond color steelblue
+ d2 line marker wcircle color green
+ begin layer 150
+ draw background
+ end layer
+end graph
+\end{Verbatim}
+\end{minipage}
+\hfill
+\begin{minipage}[c]{7cm}
+\mbox{\input{graph/fig/shadow.inc}}
+\end{minipage}
+\caption{\label{fig:shadow}Using the ``draw'' command to draw a graph background.}
+\end{figure}
+
+\item[{\sf fullsize } ]
+\index{fullsize}
+This is equivalent to {\sf scale 1 1, noborder}. It makes the graph {\sf size} command specify the size and position of the axes instead of the size of the outside border. See Fig.~\ref{grscale:fig} (right) for an example.
+
+\item[{\sf hscale h} ]
+\index{hscale}
+Sets the length of the xaxis to $h$ times the size of the graph box (default is 0.7). $h$ can also be set to `{\sf auto}'. See {\sf scale} for more details.
+
+
+\item[{\sf key pos {\it tl} nobox hei {\it exp} offset {\it xexp yexp} } ]
+\index{key!pos}
+\index{key!nobox}
+\index{key!offset}
+\index{key!hei}
+This command allows the features of a key to be specified.
+The {\sf pos}
+qualifier sets the position of the key.
+E.g., {\sf tl}=topleft, {\sf br}=bottomright, etc.
+
+\item[{\sf let ds = {\it exp {\sf [from} low{\sf] [to} high{\sf] [step} exp{\sf] [where} exp{\sf]}}}]
+\index{let}
+\index{graphing functions}
+This command defines a new dataset as the result of an expression on the variable x over a range of values. For example:
+
+\begin{Verbatim}
+ let d1 = sin(x)+log(x) from 1 to 100 step 1
+\end{Verbatim}
+
+{\bf NOTE: The lack of spaces inside the expression are necessary.}
+
+Here are some further examples:
+
+\begin{minipage}[c]{8cm}
+\begin{Verbatim}
+begin graph
+ ...
+ let d1 = 1/x from 0.2 to 10
+ let d2 = sin(x)*2+2 from 0 to 10
+ let d3 = 10*(1/sqrt(2*pi))* &
+ exp(-2*(sqr(x-4)/sqr(2)))) &
+ from 0.2 to 10 step 0.1
+ dn line
+ d2 lstyle 2 color red
+ d3 lstyle 3 color blue
+end graph
+\end{Verbatim}
+\end{minipage}
+\hfill
+\begin{minipage}[c]{7cm}
+\mbox{\input{graph/fig/gc_let.inc}}
+\end{minipage}
+\vspace{0.2cm}
+
+The let command also allows the use of other datasets. E.g., to generate an average of two datasets:
+
+\begin{Verbatim}
+ data "file.csv" d1 d2
+ let d3 = (d1+d2)/2
+\end{Verbatim}
+
+More precisely, this command creates a dataset with as $x$-values the union of the $x$-values from d1 and d2, and as $y$-values the average of the $y$-values of d1 and d2. That is, the let command first computes the set of $x$-values by taking the union of the sets of $x$-values of all datasets that appear in the expression together with the $x$-values generated by the from/to/step construct. Then it iterates over these $x$-values. In each iteration, it assigns the $x$-value to the varia [...]
+
+If the xaxis is a `log' axis then the `step' option is read as the number of steps to produce rather than the size of each step. The ``from'', ``to'', and ``step'' parameters are optional. The values of ``from'' and ``to'' default to the horizontal axis' range.
+
+This command can also be used to modify the values in a data set, e.g., `let d1 = 2*d1', will multiply all $y$-values in dataset d1 by 2.
+
+The option `where {\it exp}' can be used to select values from a dataset, e.g., `let d1 = d2 where ((x $>$ 10) and (x $<$ 20))' will select all points from d2 for which the $x$-value is between 10 and 20; `let d1 = d2 where d2 $<$ 10' will select all points for which the $y$-value is below 10.
+
+\item[{\sf let ds = {\it x-exp, y-exp {\sf [from} low{\sf] [to} high{\sf] [step} exp{\sf] [where} exp{\sf]}}}]
+
+This syntax for the `let' command is similar to the previous one, but now two expressions can be given: {\it x-exp} is used to compute the $x$-values of the points in the target dataset `ds' and {\it y-exp} is used to compute the $y$-values. The parameter that is modified by the from/to/step construct is still the variable `x'.
+
+This syntax can be used to perform transformations on both the $x$ and the $y$-values of the points in a dataset. For example,
+
+\begin{Verbatim}
+let d1 = 2*x, d1+4
+\end{Verbatim}
+
+will multiply the $x$-values of d1 by 2 and add 4 to the $y$-values.
+
+This syntax can also be used to define datasets that are not functions. The following example defines a circle:
+
+\begin{Verbatim}
+let d1 = sin(x), cos(x) from 0 to 2*pi
+\end{Verbatim}
+
+\item[{\sf let {\it dn} = [routine] {\it dm} [options] [{\it slopevar}] [{\it offsetvar}] [{\it rsqvar}]}]
+
+GLE includes several fitting routines that allow an equation to be fit to a data series. These routines can be included in a `let' expression as shown above, where {\it dn} will contain results of fitting {\sf routine} to the data in {\it dm}.
+
+The following routines are available :
+\begin{itemize}
+\item \texttt{linfit}\index{linfit}: fits the data in \textit{dm} to the straight line equation $y = m \cdot x + b$.
+\item \texttt{logefit}\index{logefit}: fits the data in \textit{dm} to the equation $y = a \cdot \exp(b \cdot x)$.
+\item \texttt{log10fit}\index{log10fit}: fits the data in \textit{dm} to the equation $y = a \cdot 10^{b \cdot x}$.
+\item \texttt{powxfit}\index{powxfit}: fits the data in \textit{dm} to the equation $y = a \cdot x^b$.
+\end{itemize}
+
+The value for $a$ is stored in `{\it slopevar}' and the value for $b$ is stored in `{\it offsetvar}'. The $r^2$ value of the fit is stored in `{\it rsqvar}'. Note that these variables are optional.
+
+The following options are available :
+\begin{itemize}
+\item \texttt{from {\it xmin} to {\it xmax}} The range of the data in \textit{dn} extends from the \textit{xmin} to \textit{xmax} as specified by the user.
+
+\item \texttt{step {\it xstep}} Specifies the x-resolution of the fitted equation. Similar to the \texttt{step} option of the \texttt{let} command.
+
+\item \texttt{rsq {\it var}} The $r^2$ value of the fit will be stored in {\it var}.
+
+\item \texttt{xmin {\it x1}}, \texttt{xmax {\it x2}}, \texttt{ymin {\it y1}}, \texttt{ymax {\it y2}} Only use data points from dm in the given window to fit the equation. That is, only data points $(x,y)$ from dm are used for which $x_1 \le x \le x_2$ and $y_1 \le y \le y_2$.
+
+\item \texttt{limit\_data\_x} The range of the data in \textit{dn} extends from the minimum $x$ value in \textit{dm} to the maximum $x$ value in \textit{dm}.
+
+\item \texttt{limit\_data\_y} The range of the data in \texttt{dn} extends from the $x$ value of the minimum $y$ value in \textit{dm} to the $x$ value of the maximum $y$ value in \textit{dm}.
+
+\item \texttt{limit\_data} The range of the data in \textit{dn} extends from the greater of the $x$ value of the minimum $y$ value or the minimum $x$ value in \textit{dm} to the greater of the $x$ value of the maximum $y$ value or the maximum $x$ value in \textit{dm}.
+\end{itemize}
+
+\begin{figure}[tb]
+\begin{minipage}[c]{9.2cm}
+\begin{Verbatim}
+slope = 0; offs = 0; rsquare = 0
+
+set texlabels 1
+begin graph
+ title "Linear fit"
+ xtitle "$x$"
+ ytitle "$y = ax + b$"
+ data "data.csv"
+ let d2 = linfit d1 from 0 to 10 slope offset rsquare
+ d1 marker circle color blue
+ d2 line color red
+end graph
+
+begin key
+ pos br nobox
+ text "$y = "+format$(slope,"fix 2")+"x + "+format$(offset,"fix 2")+"$"
+ text "$r^2 = "+format$(rsquare,"fix 2")+"$"
+end key
+\end{Verbatim}
+\end{minipage}
+\hfill
+\begin{minipage}[c]{7cm}
+\mbox{\input{graph/fig/gc_fit.inc}}
+\end{minipage}
+\caption{\label{fig:fitlin}Fitting linear equations `let d2 = fitlin d1'.}
+\end{figure}
+
+\begin{figure}[tb]
+\begin{minipage}[c]{8cm}
+\begin{Verbatim}
+a = 0; b = 0; c = 0; d = 0; r = 0
+
+set texlabels 1
+begin graph
+ xtitle "$x$"
+ ytitle "$f(x)$"
+ title "$f(x) = a\sin(bx)+cx^2+d$"
+ data "data.csv"
+ let d2 = fit d1 with a*sin(b*x)+c*x^2+d rsq r
+ d1 marker circle color blue
+ d2 line color red
+end graph
+
+fct$ = "$f(x) = "+format$(a,"fix 2")+ &
+ "\sin("+format$(b,"fix 2")+"x)+"+ &
+ format$(c,"fix 2")+"x^2+"+ &
+ format$(d,"fix 2")+"$"
+
+begin key
+ pos br nobox
+ text fct$
+ text "$r^2$ = "+format$(r,"fix 3")
+end key
+\end{Verbatim}
+\end{minipage}
+\hfill
+\begin{minipage}[c]{7cm}
+\mbox{\input{graph/fig/gc_fitfct.inc}}
+\end{minipage}
+\caption{\label{fig:fitfct}Fitting arbitrary curves `let d2 = fit d1 with $\ldots$'.}
+\end{figure}
+
+\item[{\sf let {\it dn} = fit {\it dm} with {\it eqn} [options]}]
+
+Fit the coefficients of a given equation so that it best fits the data in dataset dm. Fig.~\ref{fig:fitfct} shows an example. The equation to fit is given by the `\texttt{with}' option. In this example, it is $a\sin(bx)+cx^2+d$. GLE will search for values for the coefficients $a$, $b$, $c$, and $d$ such that the given equation fits dm best. Note that all used coefficients must be initialized to zero before the graph block (see figure).
+
+The fit command has the same options as the linfit command. In addition, it has the following settings.
+
+\begin{itemize}
+\item \texttt{with {\it eqn}} Gives the equation to fit.
+
+\item \texttt{eqstr {\it strvar\$}} Sets the string variable in which the string representation of the fitted equation is to be stored.
+
+\item \texttt{format {\it fmt\$}} Sets the numeric format to use while converting the fitted equation into its string representation. See the documentation of {\sf format\$} on page~\pageref{formatnum:pg} for a description of the syntax.
+\end{itemize}
+
+\item[{\sf let ds = hist dm [from {\it x1}] [to {\it x2}] [bins {\it n}] [step {\it n}]}]
+\index{histogram}\index{let!hist}
+
+Computes a histogram for the values in `dm' and store the result in `dn'. E.g., if the file `normal.csv' contains a single column with samples from the standard Gaussian distribution, then the graph block
+
+\begin{Verbatim}
+begin graph
+ ...
+ data "normal.csv"
+ let d2 = hist d1 step 0.5
+ d2 line bar color red
+end graph
+\end{Verbatim}
+
+\noindent{}will result in the histogram shown in Fig.~\ref{hist:fig}.
+
+The option `{\sf bins}' specifies the number of bins in the histogram. Alternatively, the option `{\sf step}' can be used to specify the bin size.
+
+\begin{figure}[tb]
+\centering
+\mbox{\input{graph/fig/normal.inc}}
+\caption{\label{hist:fig}An example of `let dn = hist dn'.}
+\end{figure}
+
+\item[{\sf let ds = \ldots [nsteps {\it n}]}]
+\index{nsteps}\index{let!nsteps}
+
+The `nsteps' options is an alternative to the `step' option of the `let' command. It specifies the total number of steps rather than the step width. The default value for `nsteps' is 100.
+
+\item[{\sf let ds = \ldots [range {\it dn}]}]
+\index{range}\index{let!range}
+
+Takes the x-values for this `let' expression from dataset `dn'. This is useful if you need to define a function for the same x-values as the ones you have in a given dataset.
+
+\item[{\sf math}]
+Use this option to create a math mode graph, with the axis crossing at point $(0,0)$. Fig.~\ref{grmath:fig} shows an example. The corresponding GLE code is as follows:
+
+\begin{Verbatim}
+begin graph
+ math
+ title "f(x) = sin(x)"
+ xaxis min -2*pi max 2*pi ftick -2*pi dticks pi format "pi"
+ yaxis dticks 0.25 format "frac"
+ let d1 = sin(x)
+ d1 line color red
+end graph
+\end{Verbatim}
+
+\begin{figure}[tb]
+\centering
+\mbox{\input{graph/fig/gc_mathmode.inc}}
+\caption{\label{grmath:fig}Left: math mode graph. Right: graph illustrating the `{\sf origin}' option of `{\sf xaxis}'.}
+\end{figure}
+
+
+\item[{\sf nobox}]
+\index{nobox}
+\index{noborder}
+\index{border}
+This removes the outer border from the graph.
+
+\item[{\sf size {\it x y }}]
+\index{size}
+Defines the size of the graph in cm. This is the size of the outside box of a graph. The default size of the axes of the graph will be 70\% of this, (see {\sf scale}). If no {\sf size} command is given, then the size of the graph is initialized to the size of the figure ({\sf pagewidth()} by {\sf pageheight()}).
+
+\item[{\sf scale {\it h v}}]
+\index{scale}
+Sets the length of the xaxis to $h$ times the width of the graph box, and the length of the yaxis to $v$ times the height of the graph box. For example, with `{\sf size 10 10}' and `{\sf scale 0.7 0.7}', the length of the $x$ and $y$ axis will be 7 centimeter. `{\sf scale 1 1}' makes the xaxis (yaxis) the same length as the width (height) of the graph box, which is useful for positioning some graphs (see `{\sf fullscale}'). The default value for $h$ and $v$ is 0.7.
+
+If {\it h} or {\it v} is set to the keyword {\sf auto}, then the graph is scaled automatically in that direction to fill the entire box. The command `{\sf scale auto}' automatically scales the graph in both directions. Note that autoscale also moves the graph, similar to the command `{\sf center}'.
+
+This {\sf size} command is equivalent to the two commands `{\sf hscale {\it h}}' and `{\sf vscale {\it v}}' and allows one to specify the two scale factors with one command.
+
+Fig.~\ref{grscale:fig} shows examples of the different axis scaling options: default, automatic, and `{\sf fullsize}'.
+
+\begin{figure}[tb]
+\centering
+\mbox{\input{graph/fig/gc_graphscale.inc}}
+\caption{\label{grscale:fig}Different axis scaling options: default, automatic, and `{\sf fullsize}'. The blue dot indicates the origin $(x,y)$ of the graph, that is, the graph is generated with `{\sf amove $x$ $y$}' followed by `{\sf begin graph}' ... `{\sf end graph}'. The xaxis is labeled using the option `{\sf format pi}'.}
+\end{figure}
+
+\item[{\sf title {\it "title"} [hei {\it ch-hei}] [color {\it col}] [font {\it font}] [dist {\it cm}] } ]
+\index{title}
+\index{title!hei}
+\index{title!font}
+\index{title!dist}
+\index{title!color}
+\index{color (title)}
+\index{font (title)}
+This command gives the graph a centered title. The list of optional keywords specifies features of it. The {\sf dist} command is used for moving the title up or down. The default title font size is the value of the `\texttt{hei}' setting multiplied by the setting `\texttt{titlescale}'\index{titlescale} (default 1.16).
+
+\item[{\sf vscale v}]
+\index{vscale}
+Sets the length of the yaxis to $v$ times the size of the graph box (default is 0.7). $v$ can also be set to `{\sf auto}'. See {\sf scale} for more details.
+
+\item[{\sf x2labels on}]
+\index{x2labels!on}
+This command `activates' the numbering of the x2axis. There is a
+corresponding command `{\sf y2axis on}' which will activate y2axis numbering.
+
+\item[{\sf xaxis | yaxis | x2axis | y2axis}]
+\index{xaxis}
+\index{yaxis (see xaxis)}
+\index{x2axis (see xaxis)}
+\index{y2axis (see xaxis)}
+A graph is considered to have four axes: The normal xaxis and
+yaxis as well as the top axis (x2axis) and the right axis (y2axis).
+
+Any command defining an xaxis setting will also define that setting
+for the x2axis.
+
+The secondary axes x2 and y2 can be modified individually by starting the
+axis command with the name of that axis. E.g.,
+
+\begin{minipage}[c]{8cm}
+\begin{Verbatim}
+ begin graph
+ size 6 3
+ xtitle "X-axis"
+ ytitle "Y-axis"
+ x2title "X2-axis"
+ y2title "Y2-axis"
+ x2ticks length 0.6
+ x2subticks color red
+ end graph
+\end{Verbatim}
+\end{minipage}
+\hfill
+\begin{minipage}[c]{7cm}
+\mbox{\input{graph/fig/gc_axes.inc}}
+\end{minipage}
+
+\item[{\sf xaxis angle $\alpha$}]
+Rotate the labels by $\alpha$ degrees. Fig.~\ref{hbar:fig} gives an example.
+
+\item[{\sf xaxis base {\it exp-cm}} ]
+\index{xaxis!base}
+Scale the axis font and ticks by {\it exp-cm}. The default value of the `{\sf base}' setting is the value of `{\sf hei}'.
+
+\item[{\sf xaxis color {\it col} font {\it font-name} hei {\it exp-cm} lwidth {\it exp-cm}} ]
+\index{xaxis!color}
+\index{xaxis!font}
+\index{xaxis!hei}
+\index{xaxis!lwidth}
+These axis qualifiers affect the colour, lstyle, lwidth, and font used for drawing the xaxis (and the x2axis). These can be overridden with more specific commands. E.g., `{\sf xticks color blue}' would override the axis colour when drawing the ticks. The subticks would also be blue as they pick up tick settings by default.
+
+\item[{\sf xaxis dsubticks {\it sub-distance} } ]
+\index{xaxis!dsubticks}
+See {\sf xaxis nticks} below.
+
+\item[{\sf xaxis format {\it format-string}} ]
+
+Specifies the number format for the labels. See the documentation of {\sf format\$} on page~\pageref{formatnum:pg} for a description of the syntax. Example:
+
+\preglecode{}
+\begin{Verbatim}
+ xaxis format "fix 1"
+\end{Verbatim}
+\postglecode{}
+
+\item[{\sf xaxis grid } ]
+\index{grid}
+\index{xaxis!grid}
+This command makes the xaxis ticks long enough to reach the x2axis and the yaxis ticks long enough to reach the y2axis. When used with both the x and y axes this produces a grid over the graph. Use the {\sf xticks lstyle} command to create a faint grid.
+
+It is possible to have grid lines for subticks or to have normal subticks. Figure~\ref{gridmode:fig} shows the different options.
+
+\begin{figure}[tb]
+\centering
+\input{graph/fig/gridmode.inc}
+\caption{\label{gridmode:fig}Different grid options: no subticks, grid lines at each subtick, or grid lines at main ticks with regular subticks. The box on each graph indicates which GLE commands to use for each option.}
+\end{figure}
+
+\item[{\sf xaxis log} ]
+\index{xaxis!log}
+\index{log}
+Draws the axis in logarithmic style, and scales the data logarithmically
+to match (on the x2axis or y2axis it does not affect the data, only the
+way the ticks and labeling are drawn)
+
+Be aware that a straight line should become curved
+when drawn on a log graph. This will only happen if you have
+enough points or have used the {\sf smooth} option.
+
+\item[{\sf xaxis min {\it low} max {\it high}} ]
+\index{xaxis!min}
+\index{xaxis!max}
+Sets the minimum and maximum values on the xaxis. This will determine both the
+labeling of the axis and the default mapping of data onto the graph.
+To change the mapping see the dataset {\sf dn} commands
+{\sf xmin}, {\sf ymin}, {\sf xmax}, and {\sf ymax}.
+
+\item[{\sf xaxis nofirst nolast} ]
+\index{nolast}
+\index{nofirst}
+\index{xaxis!nolast}
+\index{xaxis!nofirst}
+These two switches simply remove the first or last (or both) labels from
+the graph. This is useful when the first labels on
+the x and y axis are too close to each other.
+
+\index{xaxis!nticks}
+\index{xaxis!dticks}
+\index{xaxis!dsubticks}
+\index{xaxis!nsubticks}
+\index{dticks}
+\index{nticks}
+\index{dsubticks}
+\index{nsubticks}
+\item[{\sf xaxis nticks {\it number} dticks {\it distance} dsubticks {\it distance}} ]
+{\sf nticks} specifies the number of ticks along the axis. {\sf dticks}
+specifies the distance between ticks and {\sf dsubticks}
+specifies the distance between subticks. For example, to get one subtick
+between every main tick with main ticks 3 units apart, simply specify
+{\sf dsubticks 1.5}. Alternatively, one can also use {\sf nsubticks}.
+
+By default ticks are drawn on the inside of the graph. To draw
+them on the outside use the command:
+
+\preglecode{}
+\begin{Verbatim}
+ xticks length -.2
+ yticks length -.2
+\end{Verbatim}
+\postglecode{}
+
+\item[{\sf xaxis ftick {\it x0} dticks {\it distance} nticks {\it number}}]
+Labels the xaxis starting from position `{\it x0}', with distance `{\it distance}' between the ticks. This will result in a tick at the positions $\mathit{x0} + i \times \mathit{distance}$, with $i$ ranging from 0 to $(\mathit{number}-1)$.
+
+\item[{\sf xaxis off} ]
+\index{xaxis!off}
+Turns the whole axis off --- labels, ticks, subticks and line.
+Often the x2axis and y2axis are not required, they could be
+turned off with the following commands:
+
+\preglecode{}
+\begin{Verbatim}
+ x2axis off
+ y2axis off
+\end{Verbatim}
+\postglecode{}
+
+\item[{\sf xaxis shift {\it cm-exp}} ]
+\index{xaxis!shift}
+This moves the labeling to the left or right, which is useful when
+the label refers to the data between the two values.
+
+\item[{\sf xaxis symticks}]
+\index{xaxis!symticks}
+By default, the axis ticks are drawn on the inside of the graph frame. To make them appear on the outside, use a negative ticks length. E.g., `{\sf xticks length -0.1}' will produce 1mm ticks on the outside of the graph frame. The `symticks' option enables tick on both the inside and outside of the graph frame. This option is the default in `math' mode. (See the `{\sf math}' command.)
+
+\item[{\sf xlabels [font {\it font-name}] [hei {\it char-hei}] [color {\it col}] [dist {\it dis}] [on] [off] [log {\it lgmode}]}]
+\index{xlabels}
+\index{xlabels!font}
+\index{xlabels!hei}
+\index{xlabels!color}
+\index{xlabels!dist}
+\index{xlabels!on}
+\index{xlabels!off}
+\index{xlabels!log}
+This command controls the appearance of the axis labels. The default label font size is the value of the `\texttt{hei}' setting multiplied by the setting `\texttt{alabelscale}'\index{alabelscale} (default 0.8). The default value for {\it dist} is controlled by the setting `\texttt{alabeldist}'\index{alabeldist}.
+
+The command `\texttt{xlabels off}' turns the labels for the xaxis off. Similarly, `\texttt{xlabels on}' turns them on (the default for the $x$ and $y$ axis, but not for the $x2$ and $y2$ axis).
+
+Possible values for {\it lgmode} are: `\texttt{off}', `\texttt{l1}', `\texttt{l25}', and `\texttt{l25b}'. These control the subticks for a log scale axis. The value `\texttt{off}' means no subticks (i.e., only main ticks at $10^k$), `\texttt{l1}' means 10 subticks, and `\texttt{l25}' means two subticks at the positions $2\cdot 10^k$ and $5\cdot 10^k$. The value `\texttt{l25b}' is identical to `\texttt{l25}' except that now the format function (given with the `\texttt{format}' option of t [...]
+
+\begin{figure}[tb]
+\centering
+\mbox{\input{graph/fig/gc_loglabels.inc}}
+\caption{\label{loglab:fig}Possibilities for the `\texttt{log}' option of `\texttt{ylabels}'.}
+\end{figure}
+
+\begin{figure}[tb]
+\centering
+\mbox{\input{graph/fig/gc_logsubticks.inc}}
+\caption{\label{logsubt:fig}How log subticks and log sublabels interact.}
+\end{figure}
+
+\item[{\sf xnames {\it "name" "name" ...}} ]
+\index{xnames}
+\index{ynames (see xnames)}
+This command replaces the numeric labeling with text labels. Given data consisting of seven measurements, taken from Monday to Sunday, one per day then
+
+\begin{Verbatim}
+ xnames "Mon" "Tue" "Wed" "Thu" "Fri" "Sat" "Sun"
+ xaxis min 0 max 6 dticks 1
+\end{Verbatim}
+
+would give the desired result (Fig.~\ref{fig:weekday}). Note it is essential to define a specific axis minimum, maximum, dticks, etc., otherwise the labels may not correspond to the data.
+
+If there isn't enough room on the line for all the names then simply use an extra {\sf xnames} command.
+
+\begin{figure}[tb]
+\begin{minipage}[c]{8cm}
+\begin{Verbatim}
+begin graph
+ ytitle "Happyness"
+ title "Names \& Places"
+ xnames "Mon" "Tue" "Wed" "Thu"
+ xnames "Fri" "Sat" "Sun"
+ xaxis min 0 max 6 dticks 1
+ ...
+end graph
+\end{Verbatim}
+\end{minipage}
+\hfill
+\begin{minipage}[c]{7cm}
+\mbox{\input{graph/fig/gc_names.inc}}
+\end{minipage}
+\caption{\label{fig:weekday}Example illustrating the ``xnames'' command.}
+\end{figure}
+
+\item[{\sf xnames from {\it dx}}]
+Takes the labels for the xaxis from dataset {\it dx}. For example, if the data file contains:
+
+\begin{Verbatim}
+0, Mercury, 0.382
+1, Venus, 0.949
+2, Mars, 0.532
+3, Jupiter, 11.21
+4, Saturn, 9.449
+5, Uranus, 4.007
+6, Neptune, 3.883
+\end{Verbatim}
+
+\noindent{}then `{\sf ynames from d1}' uses the data from the second column as labels for the yaxis (Fig.~\ref{hbar:fig}).
+
+\item[{\sf xnoticks {\it pos1 pos2 pos3 ...}}]
+\index{xnoticks}
+Disables the axis ticks at the given positions.
+
+\item[{\sf xplaces {\it pos1 pos2 pos3 ...}} ]
+\index{xplaces}
+This is similar to the xnames command but it specifies a list of points
+which should be labeled. This allows labeling which isn't equally
+spaced. For example:
+
+\begin{Verbatim}
+ xplaces 1 2 5 7
+ xnames "Mon" "Tue" "Fri" "Sun"
+\end{Verbatim}
+
+If there isn't enough room on the line for all the places then simply
+use an extra {\sf xplaces} command.
+
+\item[{\sf xside color {\it col} lwidth {\it line-width} off } ]
+\index{xside}
+\index{yside (see xside)}
+\index{y2side (see xside)}
+\index{x2side (see xside)}
+\index{xside!lwidth}
+\index{xside!color}
+This command controls the appearance of the axis line, i.e. the line
+to which the ticks are attached.
+
+\item[{\sf xsubticks {\it {\sf lstyle} num {\sf lwidth} exp {\sf length} exp {\sf on} {\sf off}}} ]
+\index{xsubticks}
+\index{xsubticks!lstyle}
+\index{xsubticks!lwidth}
+\index{xsubticks!length}
+\index{xsubticks!on}
+\index{xsubticks!off}
+This command gives fine control of the appearance of the axis subticks.
+
+GLE uses an algorithm that decides based on the distance between the main ticks if it should draw subticks or not. However, you can override the decision of this algorithm and explicitly turn the subticks on or off by means of the commands ``xsubticks on'' or ``xsubticks off''.
+
+\item[{\sf xticks {\it {\sf lstyle} num {\sf lwidth} exp {\sf length} exp {\sf off}}} ]
+\index{xticks}
+\index{yticks (see xticks)}
+\index{xticks!lstyle}
+\index{xticks!lwidth}
+\index{xticks!length}
+\index{xticks!off}
+This command gives fine control of the appearance of the axis ticks.
+Note: To get ticks on the outside of the graph, i.e. pointing outwards,
+specify a negative tick length:
+
+\preglecode{}
+\begin{Verbatim}
+ xticks length -.2
+ yticks length -.2
+\end{Verbatim}
+\postglecode{}
+
+\item[{\sf xtitle {\it "title"} [hei {\it ch-hei}] [color {\it col}] [font {\it font}] [dist {\it cm}] [adist {\it cm}]}]
+\index{ytitle (see xtitle)}
+\index{xtitle}
+\index{xtitle!hei}
+\index{xtitle!font}
+\index{xtitle!dist}
+\index{xtitle!adist}
+\index{xtitle!color}
+This command gives the axis a centered title. The list of optional keywords specify features of it. The {\sf dist} option is used for controlling the distance between the title and the axis labels. The default font size is the value of the `\texttt{hei}' setting multiplied by the setting `\texttt{atitlescale}'\index{atitlescale} (default 1.0). The default value for {\it dist} is controlled by the setting `\texttt{atitledist}'\index{atitledist}. The `{\sf adist}' option is an alternativ [...]
+
+\item[{\sf xaxis negate} ]
+\index{negate}
+\index{xaxis!neagte}
+This is reversed the numbering on the y axis. For use with
+measurements below ground, where you want zero at the top and
+positive numbers below the zero.
+
+\item[{\sf y2title {\it "text-string"} [rotate] } ]
+\index{y2title rotate}
+\index{rotate (y2title)}
+By default the y2title is written vertically upwards. The optional
+{\sf rotate} keyword changes this direction to downwards. The {\sf rotate} option
+is specific to the {\sf y2title} command.
+
+\begin{minipage}[c]{8cm}
+\begin{Verbatim}
+begin graph
+ xaxis min 0 max 9 nofirst nolast
+ xaxis hei 0.4 nticks 6 dsubticks 0.3
+ xaxis lwidth 0.05 color red
+ xticks length 0.2
+ ytitle "Log Yaxis"
+ yaxis log min 1 max 10
+ yticks length 0.2
+ y2axis min 1 max 10000 format "sci 0 10"
+ y2side color blue
+ y2title "Y2title rotated " hei 0.3 rotate
+ x2axis off
+ y2labels on
+ let d1 = sin(x)*4+5 from 0 to 9
+ dn line color blue
+end graph
+\end{Verbatim}
+\end{minipage}
+\hfill
+\begin{minipage}[c]{7cm}
+\mbox{\input{graph/fig/gc_axisall.inc}}
+\end{minipage}
+
+\end{commanddescription}
+
+\section{Bar Graphs}
+\label{cmd:bar}
+\index{bar graphs}
+Drawing a bar graph is a subcommand of the normal graph module. This allows
+bar and line graphs to be mixed.
+The bar command is quite complex as it allows a
+great deal of flexibility. The same command allows stacked, overlapping and
+grouped bars.
+
+For stacked bars use separate bar commands as in the first
+example below:
+
+\preglecode{}
+\begin{Verbatim}
+ bar d1 fill black
+ bar d2 from d1 fill gray10
+\end{Verbatim}
+\postglecode{}
+
+For grouped bars put all the datasets in a list on a single bar
+command:
+
+\preglecode{}
+\begin{Verbatim}
+ bar d1,d2,d3 fill gray10,gray40,black
+\end{Verbatim}
+\postglecode{}
+
+\begin{minipage}[c]{8cm}
+\begin{Verbatim}
+begin graph
+ title "Bean stalk data" dist 0.1
+ xtitle "Year measured"
+ ytitle "Height of stalk"
+ xaxis dticks 1
+ yaxis min 0 max 6 dticks 2
+ data "gc_bean.dat"
+ bar d1,d2,d3 fill blue,orange,red
+end graph
+\end{Verbatim}
+\end{minipage}
+\hfill
+\begin{minipage}[c]{7cm}
+\mbox{\input{graph/fig/gc_bargraph2.inc}}
+\end{minipage}
+
+\begin{commanddescription}
+\item[{\sf bar {\it dx,...} dist {\it spacing}}]
+\index{bar!dist}
+Specifies the distance between bars in dataset(s) {\sf dx,...}. The
+distance is measured from the left hand side of one bar to the left hand side
+of the next bar. A distance of less than the width of a bar
+results in the bars overlapping.
+
+\item[{\sf bar {\it dx,...} from {\it dy,...}}]
+\index{bar!from}
+This sets the starting point of each bar in datasets {\sf dx,...} to be at
+the value in datasets {\sf dy,...}, and is used for creating stacked bar
+charts. Each layer of the bar chart is created with an additional bar command.
+
+\preglecode{}
+\begin{Verbatim}
+ bar d1,d2
+ bar d3,d4 from d1,d2
+ bar d5,d6 from d3,d4
+\end{Verbatim}
+\postglecode{}
+
+Note 1: It is important that the values in d3 and d4 are greater than
+the values in d1 and d2.
+
+Note 2: Data files for stacked bar graphs should not have
+missing values, replace the * character with the number on its left in the
+data file.
+
+\begin{minipage}[c]{8cm}
+\begin{Verbatim}
+begin graph
+ ...
+ data "gc_bean.dat"
+ bar d1 fill gray20
+ bar d2 from d1 fill white
+end graph
+\end{Verbatim}
+\end{minipage}
+\hfill
+\begin{minipage}[c]{7cm}
+\mbox{\input{graph/fig/gc_bargraph1.inc}}
+\end{minipage}
+
+\index{bar!width} \index{bar!fill}
+\index{bar!color}
+\item[{\sf bar {\it dn,...} width {\it xunits,...} fill {\it col,...} color {\it col,...} }]
+The rest of the bar qualifiers are fairly self explanatory.
+When several datasets are specified, separate them with commas
+(with no spaces between commas).
+
+\preglecode{}
+\begin{Verbatim}
+ bar d1,d2 width 0.2 dist 0.2 fill gray10,gray20 color red,green
+\end{Verbatim}
+\postglecode{}
+
+\item[{\sf bar {\it dn,...} fill {\it f} pattern {\it p}}]
+\index{pattern!bar}
+The `{\sf pattern}' option specifies the pattern used for filling the bars. Fig.~\ref{filpat:fig} gives an overview of the predefined patterns that can be used here. Fig.~\ref{hbar:fig} shows an example of the command `{\sf bar d2 horiz fill red pattern shade2}'.
+
+\item[{\sf bar {\it dn,...} horiz}]
+\index{horiz}
+The option `{\sf horiz}' makes the bars horizontal instead of vertical (Fig.~\ref{hbar:fig}).
+
+\begin{figure}[tb]
+\centering
+\input{graph/fig/gc_horizbar.inc}
+\caption{\label{hbar:fig}Illustration of the `{\sf horiz}' and `{\sf pattern}' keywords of the `{\sf bar}' command, and of the `{\sf angle}' option of the `{\sf yaxis}' command.}
+\end{figure}
+\end{commanddescription}
+
+\section{3D Bar Graphs}
+\index{bar graphs 3d}
+3d Bar graphs are now supported, the commands are:
+
+\preglecode{}
+\begin{Verbatim}
+ bar d1,d2 3d .5 .3 side red,green notop
+ bar d3,d4 3d .5 .3 side red,green top black,white
+\end{Verbatim}
+\postglecode{}
+
+Take note of comma's.
+\begin{commanddescription}
+\item[{\sf bar {\it dx,...} 3d {\it xoffset} \ {\it yoffset} side {\it color list}\ top {\it color list} [notop]}]
+\index{3d bar!offset} \index{3d bar!side} \index{3d bar!top} \index{3d bar!notop}
+\index{xoffset} \index{yoffset}
+
+\item[{\sf 3d {\it xoffset} {\it yoffset} }]
+Specifies the x and y vector used to draw the receding
+lines, they are defined as fractions of the width of the
+bar.
+A negative xoffset will draw the 3d bar on the left side
+of the bar instead of the right hand side.
+
+\item[{\sf side {\it color list} }]
+The color of the side of each of the bars in the group.
+
+\item[{\sf top {\it color list}}]
+The color of the top part of the bar
+
+\item[{\sf notop}]
+Turns off the top part of the bar, use this if you have
+a stacked bar graph so you only need sides on the lower parts
+of each stack.
+
+\begin{minipage}[c]{8cm}
+\begin{Verbatim}
+begin graph
+ ...
+ data "gc_bean.dat"
+ bar d1,d2,d3 dist 0.25 width 0.15 3d 1 0.25 &
+ fill red,blue,forestgreen &
+ side orange,dodgerblue,green
+end graph
+\end{Verbatim}
+\end{minipage}
+\hfill
+\begin{minipage}[c]{7cm}
+\mbox{\input{graph/fig/gc_bargraph_3d.inc}}
+\end{minipage}
+\end{commanddescription}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\section{Filling Between Lines}
+\label{cmd:fill}
+\begin{commanddescription}
+\index{fill!color} \index{fill!xmin} \index{fill!xmax}
+\index{fill!ymin} \index{fill!ymax}
+\item[{\sf fill x1,{\it d3} color {\it green} xmin {\it val} xmax {\it val}} ]
+\index{filling areas}
+Fills between the xaxis and a dataset, use the optional
+{\sf xmin, xmax, ymin, ymax} qualifiers to clip the filling
+to a smaller region
+
+\item[{\sf fill {\it d4},x2 color {\it blue} ymin {\it val} ymax {\it val}} ]
+This command fills from a dataset to the x2axis.
+
+\item[{\sf fill {\it d3,d4} color {\it green} xmin {\it val} xmax {\it val}} ]
+This command fills between two datasets.
+
+\item[{\sf fill {\it d4} color {\it green} xmin {\it val} xmax {\it val}} ]
+This command treats the dataset as a polygon and fills it. The dataset
+should be a closed polygon.
+
+\begin{minipage}[c]{8cm}
+\begin{Verbatim}
+begin graph
+ title "Shading areas of the graph" dist 0.1
+ xtitle "Height of stalk"
+ ytitle "Year measured"
+ xaxis min 86 max 90
+ yaxis min 0 max 6
+ data "gc_fill.dat"
+ fill d2,x2 color gray40
+ fill x1,d1 color gray10 xmin 85 xmax 88
+ fill x1,d1 color gray90 xmin 88 xmax 91
+ dn line
+end graph
+\end{Verbatim}
+\end{minipage}
+\hfill
+\begin{minipage}[c]{7cm}
+\mbox{\input{graph/fig/gc_fillgraph.inc}}
+\end{minipage}
+
+\end{commanddescription}
+
+To create semi-transparent fills, use the function ``rgba255'' to specify the fill color. This function allows one to define a semi-transparent color with red, green, blue, and alpha components. The alpha component defines the transparency. Fig.~\ref{fig:semitrans} shows an example. To create output with semi-transparent colors, GLE's command line option ``-cairo'' must be used.
+
+\begin{figure}[tb]
+\begin{minipage}[c]{7.5cm}
+\begin{Verbatim}
+begin graph
+ ...
+ begin layer 300
+ fill x1,d1 color rgba255(255,0,0,80)
+ d1 line color red key "$1.5\sin(x)+1.5$"
+ end layer
+ begin layer 301
+ fill x1,d2 color rgba255(0,128,0,80)
+ d2 line color green key "$1/x$"
+ end layer
+ ...
+end graph
+\end{Verbatim}
+\end{minipage}
+\hfill
+\begin{minipage}[c]{7cm}
+\hascairo{
+\mbox{\input{graph/fig/semitrans.inc}}
+}
+\end{minipage}
+\caption{\label{fig:semitrans}A graph with semi-transparent fills.}
+\end{figure}
+
+\subsection{Polar Plots}
+\label{sec:polar}
+
+GLE supports polar plots by means of the ``polar'' and ``polar\_grid'' functions from the library file ``polarplot.gle''. See Fig~\ref{fig:polar} for an example. This example also illustrates the use of the ``draw'' function (p.~\pageref{cmd:gdraw}) and the ``layer'' block (p.~\pageref{cmd:layer}). The ``layer'' block is used here to make sure that the polar grid is drawn before the axis are drawn.
+
+\begin{figure}[tb]
+\begin{minipage}[c]{10.5cm}
+\begin{Verbatim}
+begin graph
+ title "$r = \cos(2\theta)$"
+ xaxis min -1.1 max 1.1
+ yaxis min -1.1 max 1.1
+ begin layer 0
+ draw polar_grid radius 2 rings 5 sectors 12
+ draw polar "cos(2*t)" from 0 to 2*pi fill wheat
+ end layer
+end graph
+\end{Verbatim}
+\end{minipage}
+\hfill
+\begin{minipage}[c]{5cm}
+\mbox{\input{graph/fig/cos2t.inc}}
+\end{minipage}
+\caption{\label{fig:polar}Polar plots using the ``draw'' command and the ``polar'' function from ``polarplot.gle''.}
+\end{figure}
+
+\section{Notes on Drawing Graphs}
+
+\subsection{Importance of Order}
+\index{data (order)}
+\index{let (order)}
+Most of the graph commands can appear in any order, but in some
+cases order is significant.
+
+As some {\sf let} commands operate on data which has been read into datasets,
+the {\sf data} commands should precede the {\sf let} commands.
+
+The wildcard {\sf dn} command should appear before
+specific {\sf d1} commands which it will override.
+
+By default xaxis commands also change the x2axis, and xlabels commands
+also change x2labels, so to specify different settings for
+the x and x2 axes, put the x2 settings after the x settings.
+
+\preglecode{}
+\begin{Verbatim}
+ begin graph
+ size 10 10
+ data a.dat
+ let d2 = d1*3
+ dn marker square lstyle 3 ! sets d1 and d2
+ d2 marker dot
+ xaxis color green
+ xticks color blue
+ x2axis color black
+ end graph
+\end{Verbatim}
+\postglecode{}
+
+\subsection{Layers}
+\label{cmd:layer}
+
+GLE draws a graph as a sequence of layers. The following are the default layers.
+
+\begin{itemize}
+\item[200] A grid (e.g., ``yaxis grid'')
+\item[350] Fill type graphs (p.~\pageref{cmd:fill})
+\item[350] Bar type graphs (p.~\pageref{cmd:bar})
+\item[500] Graph axis
+\item[700] Line type graphs
+\item[700] Error bars
+\item[700] Marker type graphs
+\item[700] Draw commands (p.~\pageref{cmd:gdraw})
+\end{itemize}
+
+There are only 4 default layers. Each layer has a unique number (200, 350, 500, and 700). Layers are drawn from small to large. Within a layer, the elements are drawn in the order indicated above. For example, error bars are drawn after line type graphs.
+
+It is possible to define new layers with the ``begin layer / end layer'' block. This is illustrated by the following example.
+
+\preglecode{}
+\begin{Verbatim}
+ begin graph
+ data "file.csv"
+ ...
+ begin layer 400
+ d1 line color red
+ end layer
+ end graph
+\end{Verbatim}
+\postglecode{}
+
+This example defines a custom layer with the unique number 400 and one line type graph. The result will be that d1 is drawn after any defined bar type graphs and before the graph x/y axis.
+
+More examples of layers can be found in the following figures:
+
+\begin{itemize}
+\item Fig.~\ref{fig:shadow} shows how a layer can be used to draw a custom graph background.
+
+\item Fig.~\ref{fig:semitrans} shows how layers can be used to combine fill type and line graphs.
+
+\item Fig.~\ref{fig:polar} shows how layers can be used to draw a custom grid.
+\end{itemize}
+
+\subsection{Line Width}
+\index{line width (graphs)}
+\index{lwidth (graphs)}
+When scaling a graph up or down for publication the default
+line width may need changing. To do this simply
+specify a {\sf set lwidth} command before beginning the graph.
+
+\preglecode{}
+\begin{Verbatim}
+ size 10 10
+ set lwidth .1
+ begin graph
+ ...
+ end graph
+\end{Verbatim}
+\postglecode{}
diff --git a/gle-refman/key/fig/Makefile.gcc b/gle-refman/key/fig/Makefile.gcc
new file mode 100644
index 0000000..11860ae
--- /dev/null
+++ b/gle-refman/key/fig/Makefile.gcc
@@ -0,0 +1,53 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+EPSS = k_key.inc keypos.inc grkey.inc multicolkey.inc
+
+ifeq ($(RUNBUILD),1)
+ GLE = ../../../build/bin/gle
+else
+ GLE = gle
+endif
+
+all: $(EPSS)
+
+%.inc: %.gle
+ $(GLE) -texincprefix key/fig/ -inc -d pdf $<
+
+clean:
+ rm -rf *.eps *.pdf *.inc .gle
diff --git a/gle-refman/key/fig/Makefile.os2 b/gle-refman/key/fig/Makefile.os2
new file mode 100644
index 0000000..f1fc51c
--- /dev/null
+++ b/gle-refman/key/fig/Makefile.os2
@@ -0,0 +1,47 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+EPSS = k_key.eps
+
+all: $(EPSS)
+
+%.eps: %.gle
+ gle -d eps $<
+
+clean:
+ rm -rf *.eps *.pdf *.inc
diff --git a/gle-refman/key/fig/grkey.gle b/gle-refman/key/fig/grkey.gle
new file mode 100644
index 0000000..1bdafe5
--- /dev/null
+++ b/gle-refman/key/fig/grkey.gle
@@ -0,0 +1,55 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 9 5
+
+include "../../script/manual.gle"
+manual_graph_mode
+
+begin graph
+ scale auto
+ title "Implicitly defined key"
+ yaxis dticks 0.5
+ xaxis min 0 max 2*pi dticks pi/2 format "pi"
+ let d1 = sin(x)
+ let d2 = cos(x)
+! key compact pos bl
+ key pos bl compact
+ d1 line color red marker wtriangle mdist 1 key "Sine"
+ d2 line color blue lstyle 2 marker wcircle mdist 1 key "Cosine"
+end graph
diff --git a/gle-refman/key/fig/k_key.gle b/gle-refman/key/fig/k_key.gle
new file mode 100644
index 0000000..2220ef3
--- /dev/null
+++ b/gle-refman/key/fig/k_key.gle
@@ -0,0 +1,54 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 12 6
+
+include "../../script/manual.gle"
+
+manual_graph_mode
+begin graph
+ xaxis min 0 max 10 dticks 2.5
+ yaxis min 0 max 10 dticks 2.5
+end graph
+begin key
+ position tr
+ offset 0.2 0.2
+ text "Blue" marker circle fill blue dist 0.25 llen 0.55
+ text "Red" marker triangle fill red lstyle 2 dist 0.25 llen 0.55
+ text "Green" marker square fill green lstyle 3 dist 0.25 llen 0.55
+end key
diff --git a/gle-refman/key/fig/keypos.gle b/gle-refman/key/fig/keypos.gle
new file mode 100644
index 0000000..cd4f368
--- /dev/null
+++ b/gle-refman/key/fig/keypos.gle
@@ -0,0 +1,80 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 13 7.75
+
+include "../../script/manual.gle"
+manual_graph_mode
+
+amove -0.5 1
+begin graph
+ size 11.75 7
+ title "Various key positions"
+ axis min 0 max 1
+ let d1 = 0.5*sin(2*pi*x)+0.5
+ d1 line color red
+end graph
+
+amove xg(0) yg(0.5)
+aline xg(1) yg(0.5)
+
+begin key
+ justify bc
+ absolute (xg(xgmin)+xg(xgmax))/2 0.01
+ marker triangle color red text "\texttt{justify bc}"
+ marker circle color blue text "\texttt{absolute pagewidth()/2 0.1}"
+end key
+
+begin key
+ position tl
+ marker triangle color red text "\texttt{position tl}"
+end key
+
+begin key
+ position br
+ offset 0.25 0.25
+ marker triangle color red text "\texttt{position br}"
+ marker circle color blue text "\texttt{offset 0.25 0.25}"
+end key
+
+begin key
+ position tr
+ offset -0.1 0
+ marker triangle color red text "\texttt{position tr}"
+ marker circle color blue text "\texttt{offset -0.1 0}"
+end key
diff --git a/gle-refman/key/fig/multicolkey.gle b/gle-refman/key/fig/multicolkey.gle
new file mode 100644
index 0000000..9d1e276
--- /dev/null
+++ b/gle-refman/key/fig/multicolkey.gle
@@ -0,0 +1,53 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 4.3 1.5
+
+include "../../script/manual.gle"
+manual_graph_mode
+
+begin key
+ justify bl
+ line color red text "Red"
+ line color green text "Green"
+ line color blue text "Blue"
+ separator
+ line color orange text "Orange"
+ line color purple text "Purple"
+ line color black text "Black"
+end key
diff --git a/gle-refman/key/key.tex b/gle-refman/key/key.tex
new file mode 100644
index 0000000..394b1e7
--- /dev/null
+++ b/gle-refman/key/key.tex
@@ -0,0 +1,280 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% GLE - Graphics Layout Engine <http://www.gle-graphics.org/> %
+% %
+% Modified BSD License %
+% %
+% Copyright (C) 2009 GLE. %
+% %
+% Redistribution and use in source and binary forms, with or without %
+% modification, are permitted provided that the following conditions %
+% are met: %
+% %
+% 1. Redistributions of source code must retain the above copyright %
+% notice, this list of conditions and the following disclaimer. %
+% %
+% 2. Redistributions in binary form must reproduce the above %
+% copyright notice, this list of conditions and the following %
+% disclaimer in the documentation and/or other materials provided with %
+% the distribution. %
+% %
+% 3. The name of the author may not be used to endorse or promote %
+% products derived from this software without specific prior written %
+% permission. %
+% %
+% THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR %
+% IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED %
+% WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE %
+% ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY %
+% DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL %
+% DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE %
+% GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS %
+% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER %
+% IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR %
+% OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN %
+% IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\chapter{The Key Module}
+\label{key:chap}
+\index{key (module)}
+
+The key module is used for drawing keys. The key can be either specified through a separate key block or directly in the graph block (by prefixing the key commands with the keyword ``key''). This chapter first discusses how to define the key using a key block. Section~\ref{kgrb:sec} shows how to include the key commands directly in a graph block.
+
+The key block usually comes directly after the graph block as follows:
+
+\preglecode{}
+\begin{Verbatim}
+begin graph
+ ...
+end graph
+
+begin key
+ position tr
+ offset 0.2 0.2
+ text "Blue" marker circle fill blue
+ text "Red" marker triangle fill red lstyle 2
+ text "Orange" marker square fill orange lstyle 3
+end key
+\end{Verbatim}
+\postglecode{}
+\mbox{\input{key/fig/k_key.inc}}
+
+The key block consists of two parts: (a) global commands, and (b) the definitions of the entries. Global commands appear at the beginning of the key and define, e.g., the position of the key. In the example, ``position'' and ``offset'' are global commands. Multiple global commands are allowed on a given line. The entry definitions start after the global commands. All commands relevant to a given entry must appear on the same line. In the example, there are three entry definitions and eac [...]
+
+There are two possible ways to set the position of a key: (a) the key can be positioned relative to the graph, and (b) it can be positioned at given coordinates. To position the key relative to the graph, use the commands ``position'' and (optionally) ``offset''. For example,
+
+\preglecode{}
+\begin{Verbatim}
+position tr
+offset 0.2 0.2
+\end{Verbatim}
+\postglecode{}
+
+\noindent{}places the key at the top-right corner of the graph 0.2 cm from each side. To position the key at given coordinates use the ``justify'' and ``absolute'' commands. For example,
+
+\preglecode{}
+\begin{Verbatim}
+justify bc
+absolute 5 0.1
+\end{Verbatim}
+\postglecode{}
+
+\noindent{}places the bottom-center of the key at position (5 cm, 0.1 cm). Fig.~\ref{keypos:fig} gives some examples of positioning the key.
+
+\begin{figure}[tb]
+\centering
+\mbox{\input{key/fig/keypos.inc}}
+\caption{\label{keypos:fig}Various positions for the key.}
+\end{figure}
+
+\section{Global Commands}
+
+Global commands appear at the start of the key block. They control the position of the key and various other properties of the key. Several global key commands may appear on one line in the script.
+
+\begin{commanddescription}
+\item[{\sf absolute} {\it x} {\it y}]
+\index{key module!absolute}
+Places the key at position $(x, y)$ on the figure. The anchor point of the key is specified with the ``justify'' command.
+
+\item[{\sf base} {\it h} or {\sf row} {\it h}]
+\index{key module!row}
+Sets the base scale of the entries. The sizes of all components are initialized based on this. E.g., to change the size of the filled box in an entry, use this command.
+
+\item[{\sf boxcolor} {\it c}]
+\index{key module!boxcolor}
+Set the background color of the key to $c$.
+
+\item[{\sf coldist} {\it d}]
+\index{key module!coldist}
+Sets the distance between columns. (To obtain a key with multiple columns, use the ``separator'' command.)
+
+\item[{\sf compact}]
+\index{key module!compact}
+Creates a more compact key by combining the ``line'' and ``marker'' fields into one field. The effect of this is shown in Fig.~\ref{grkey:fig}.
+
+\item[{\sf dist} {\it d}]
+\index{key module!dist}
+Sets the distance between the different components of an entry (the marker, the line, the fill, and the text).
+
+\item[{\sf hei} {\it h}]
+\index{key module!hei}
+Sets the height of the text in the entries of the key. If this command is not given, then the current height is used. (To set the current height, use ``set hei'', see page~\pageref{shei:cmd}.)
+
+\item[{\sf justify} {\it x}]
+\index{key module!justify}
+Sets the anchor point of the key. Possible values: tl, bl, tr, br, tc, bc, lc, rc, cc. These stand for top-left, bottom-left, top-right, bottom-right, top-center, bottom-center, left-center, right-center, and center. Use this command in combination with the ``absolute'' command. Fig.~\ref{keypos:fig} gives some examples.
+
+\item[{\sf llen} {\it x}]
+\index{key module!llen}
+Sets the length of the line in the entries.
+
+\item[{\sf lpos} {\it x}]
+\index{key module!lpos}
+Sets the vertical position of the line in the entries. (This is normally set automatically.)
+
+\item[{\sf margins} {\it x} {\it y}]
+\index{key module!margins}
+Sets the margins of the key block. (The space between the border and the entries.)
+
+\item[{\sf nobox}]
+\index{key module!nobox}
+Do not draw a border around the key.
+
+\item[{\sf off}]
+\index{key module!off}
+Disable this key.
+
+\item[{\sf offset} {\it x y}]
+\index{key module!offset}
+Specifies the distance in cm between the position specified with the ``position'' or ``pos'' command and the actual key. A negative offset places the key outside of the graph (Fig.~\ref{keypos:fig}).
+
+\item[{\sf position} {\it x} or {\sf pos} {\it x}]
+\index{key module!position}
+Specifies the position of the key on the graph. Possible values: tl, bl, tr, br, tc, bc, lc, rc, cc. These stand for top-left, bottom-left, top-right, bottom-right, top-center, bottom-center, left-center, right-center, and center. Optionally, the ``offset'' command can be combined with this command. Fig.~\ref{keypos:fig} gives some examples.
+
+\end{commanddescription}
+
+\section{Entry Definition Commands}
+
+Each entry in the key is represented by one line in the key block, and all commands for a given entry must appear on that line. The following commands can be used to define key entries.
+
+\begin{commanddescription}
+
+\item[{\sf color} {\it c}]
+\index{key module!color}
+Sets the color of the line and marker. The other components of the key are drawn in the default color. (To set the default color, use ``set color'', see page~\pageref{scol:cmd}.)
+
+\item[{\sf fill} {\it p}]
+\index{key module!fill}
+Sets the fill color or pattern.
+
+\item[{\sf line}]
+\index{key module!line}
+Shorthand for ``lstyle 1''.
+
+\item[{\sf lstyle} {\it s}]
+\index{key module!lstyle}
+Sets the line style.
+
+\item[{\sf lwidth}]
+\index{key module!lwidth}
+Sets the width of the line.
+
+\item[{\sf marker} {\it m}]
+\index{key module!marker}
+Sets the marker.
+
+\item[{\sf mscale} {\it x}]
+\index{key module!mscale}
+Sets the scale of the marker.
+
+\item[{\sf msize} {\it x}]
+\index{key module!msize}
+Sets the size of the marker.
+
+\item[{\sf pattern} {\it x}]
+\index{key module!pattern}
+Sets the filling pattern. Fig.~\ref{filpat:fig} shows examples of filling patterns.
+
+\item[{\sf separator} {\sf [lstyle {\it s}]} ]
+\index{key module!separator}
+Use this command to divide the key into multiple columns. If the ``lstyle'' option is given, then a line is drawn between the columns in the given style. Possible values are given with the description of the ``set lstyle'' command on page~\pageref{lstyle:cmd}. The ``separator'' command should be inserted between the key entries that should go in different columns. For example,
+\vspace{3mm}
+\preglecode{}
+\begin{Verbatim}
+begin key
+ position bl
+ line color red text "Red"
+ line color green text "Green"
+ line color blue text "Blue"
+ separator
+ line color orange text "Orange"
+ line color purple text "Purple"
+ line color black text "Black"
+end key
+\end{Verbatim}
+\postglecode{}
+\vspace{3mm}
+\noindent{}will result in the key shown in Fig.~\ref{multicolkey:fig}.
+
+\item[{\sf text} {\it s}]
+\index{key module!text}
+The text for the entry.
+
+\item[{\sf textcolor} {\it c}]
+\index{key module!textcolor}
+Sets the color of the key entry's text.
+
+\end{commanddescription}
+
+\begin{figure}[tb]
+\centering
+\mbox{\input{key/fig/multicolkey.inc}}
+\caption{\label{multicolkey:fig}Defining a key with multiple columns.}
+\end{figure}
+
+\section{Defining the Key in the Graph Block}\label{kgrb:sec}
+
+\begin{figure}[tb]
+\centering
+\mbox{\input{key/fig/grkey.inc}}
+\caption{\label{grkey:fig}Defining the key together with the graph block. This figure also illustrates the `mdist' option of the `marker' command.}
+\end{figure}
+
+It is also possible to define the key in the graph block itself. This is accomplished by prefixing global key commands with the keyword ``key''. The entries are in this case defined with the ``dn'' commands and the labels are set with the ``key'' option to these commands.
+
+The following presents an example:
+
+\preglecode{}
+\begin{Verbatim}
+begin graph
+ title "Implicitly defined key"
+ let d1 = sin(x)
+ let d2 = cos(x)
+ xaxis min 0 max 2*pi dticks pi/2 format "pi"
+ key compact pos bl
+ d1 line color red marker triangle mdist 1 key "Sine"
+ d2 line color blue marker circle mdist 1 lstyle 2 key "Cosine"
+end graph
+\end{Verbatim}
+\postglecode{}
+
+\noindent{}Fig.~\ref{grkey:fig} shows the result.
+
+It is also possible to put a ``key separator'' line in between the ``dn'' lines create a key with multiple columns. For example:
+
+\preglecode{}
+\begin{Verbatim}
+ d1 line color red key "Sine"
+ key separator
+ d2 line color blue key "Cosine"
+\end{Verbatim}
+\postglecode{}
+
+If you plot data from a data file, and the first row of the file contains column labels, then these labels will be used automatically to construct the key. However, if you prefer to construct the key manually instead by defining a key block, then you can override this behavior by making GLE ignore the row with the labels using the ``ignore'' option of the ``data'' command. E.g., \verb+data "myfile.csv" ignore 1+ (see p.~\pageref{opt:ignore}). Alternatively, you can accomplish the same by [...]
+
+
+
+
diff --git a/gle-refman/obsolete/fonts.tex b/gle-refman/obsolete/fonts.tex
new file mode 100644
index 0000000..f15ea3c
--- /dev/null
+++ b/gle-refman/obsolete/fonts.tex
@@ -0,0 +1,135 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% GLE - Graphics Layout Engine <http://www.gle-graphics.org/> %
+% %
+% Modified BSD License %
+% %
+% Copyright (C) 2009 GLE. %
+% %
+% Redistribution and use in source and binary forms, with or without %
+% modification, are permitted provided that the following conditions %
+% are met: %
+% %
+% 1. Redistributions of source code must retain the above copyright %
+% notice, this list of conditions and the following disclaimer. %
+% %
+% 2. Redistributions in binary form must reproduce the above %
+% copyright notice, this list of conditions and the following %
+% disclaimer in the documentation and/or other materials provided with %
+% the distribution. %
+% %
+% 3. The name of the author may not be used to endorse or promote %
+% products derived from this software without specific prior written %
+% permission. %
+% %
+% THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR %
+% IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED %
+% WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE %
+% ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY %
+% DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL %
+% DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE %
+% GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS %
+% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER %
+% IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR %
+% OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN %
+% IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\samepage
+{\small
+\begin{tabular}{ll} \hline
+{\tt font-name} & Description \\ \hline
+rm & Roman \\
+rmb & Roman Bold \\
+rmi & Roman Italic \\
+ss & San Serif \\
+ssb & San Serif Bold \\
+ssi & San Serif Italic \\
+tt & Typewriter \\
+ttb & Typewriter Bold \\
+tti & Typewriter Italic \\ \hline
+\end{tabular} % \\ \samepage
+
+\begin{tabular}{ll} \hline
+{\tt font-name} & Description \\ \hline
+texcmb & Computer Modern Bold \\
+texcmex & Computer Modern Extensible \\
+texcmitt & Computer Modern Italic Typewriter \\
+texcmmi & Computer Modern Maths Italic \\
+texcmr & Computer Modern Roman \\
+texcmss & Computer Modern Sans Serif \\
+texcmssb & Computer Modern Sans Serif Bold \\
+texcmssi & Computer Modern Sans Serif Italic \\
+texcmsy & Computer Modern Symbol \\
+texcmti & Computer Modern Text Italic \\
+texcmtt & Computer Modern Typewriter Text \\
+\hline
+\end{tabular}
+
+\begin{tabular}{ll} \hline
+{\tt font-name} & Description \\ \hline
+plba & Block Ascii \\
+plcc & Complex Cartographic \\
+plcg & Complex Gothic \\
+plci & Complex Italic \\
+plcr & Complex Roman \\
+plcs & Complex Script \\
+pldr & Duplex Roman \\
+plge & Gothic English \\
+plgg & Gothic German \\
+plgi & Gothic Italian \\
+plsa & Simplex Ascii \\
+plsg & Simplex German \\
+plsr & Simplex Roman \\
+plss & Simplex Script \\
+plsym1 & Symbols one \\
+plsym2 & Symbols two \\
+plti & Triplex Italic \\
+pltr & Triplex Roman \\
+\hline
+\end{tabular}
+
+\begin{tabular}{ll} \\ \hline
+{\tt font-name} & Description \\ \hline
+psagb & AvantGarde-Book \\
+psagbo & AvantGarde-BookOblique \\
+psagd & AvantGarde-Demi \\
+psagdo & AvantGarde-DemiOblique \\
+psbd & Bookman-Demi \\
+psbdi & Bookman-DemiItalic \\
+psbl & Bookman-Light \\
+psbli & Bookman-LightItalic \\
+psc & Courier \\
+pscb & Courier-Bold \\
+pscbo & Courier-BoldOblique \\
+psco & Courier-Oblique \\
+psh & Helvetica \\
+pshb & Helvetica-Bold \\
+pshbo & Helvetica-BoldOblique \\
+psho & Helvetica-Oblique \\
+pshc & Helvetica-Condensed \\
+pshcb & Helvetica-Condensed-Bold \\
+pshcdo & Helvetica-Condensed-BoldOblique \\
+pshn & Helvetica-Narrow \\
+pshnb & Helvetica-Narrow-Bold \\
+pshnbo & Helvetica-Narrow-BoldOblique \\
+pshno & Helvetica-NarrowOblique \\
+psncsb & NewCenturySchlbk-Bold \\
+psncsbi & NewCenturySchlbk-BoldItalic \\
+psncsi & NewCenturySchlbk-Italic \\
+psncsr & NewCenturySchlbk-Roman \\
+pspb & Palatino-Bold \\
+pspbi & Palatino-BoldItalic \\
+pspi & Palatino-Italic \\
+pspr & Palatino-Roman \\
+pstr & Times-Roman \\
+psti & Times-Italic \\
+pstb & Times-Bold \\
+pstbi & Times-BoldItalic \\
+pszcmi & ZapfChancery-MediumItalic \\
+pszd & ZapfDingbats \\
+pssym & Symbol \\
+\hline
+\end{tabular}
+} % end small
diff --git a/gle-refman/obsolete/gle32.tex b/gle-refman/obsolete/gle32.tex
new file mode 100644
index 0000000..227bfb0
--- /dev/null
+++ b/gle-refman/obsolete/gle32.tex
@@ -0,0 +1,326 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% GLE - Graphics Layout Engine <http://www.gle-graphics.org/> %
+% %
+% Modified BSD License %
+% %
+% Copyright (C) 2009 GLE. %
+% %
+% Redistribution and use in source and binary forms, with or without %
+% modification, are permitted provided that the following conditions %
+% are met: %
+% %
+% 1. Redistributions of source code must retain the above copyright %
+% notice, this list of conditions and the following disclaimer. %
+% %
+% 2. Redistributions in binary form must reproduce the above %
+% copyright notice, this list of conditions and the following %
+% disclaimer in the documentation and/or other materials provided with %
+% the distribution. %
+% %
+% 3. The name of the author may not be used to endorse or promote %
+% products derived from this software without specific prior written %
+% permission. %
+% %
+% THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR %
+% IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED %
+% WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE %
+% ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY %
+% DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL %
+% DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE %
+% GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS %
+% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER %
+% IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR %
+% OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN %
+% IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\begin{center}
+\begin{minipage}[t]{11.0cm}
+{\scriptsize
+\begin{verbatim}
+ 32 bit DOS version of GLE by Axel Rohde
+ ---------------------------------------
+Introduction: (By Chris)
+ For a long time I have been explaining to people that a 32bit
+ dos version of GLE was not possible with currently available
+ compilers and libraries.
+ Clearly Axel has no appreciation for the impossible and has gone
+ ahead and compiled a version anyway (with absolutely no asistance
+ from me). On any 386 or better machine this version of GLE should
+ run without problems, it's main features are these:
+ 1) No 640K memory restrictions.
+ 2) Much faster.
+
+Installation Quick guide: (By Chris)
+
+ 1) FTP the binary distribution
+ ftp tui.marc.cri.nz
+ cd pub/gle/gle32
+ binary
+ mget gle32bi*.zip
+ 2) Unzip them keeping the directory structure
+ cd c:\
+ pkunzip gle32bi1.zip -d
+ pkunzip gle32bi2.zip -d
+ pkunzip gle32bi3.zip -d
+ pkunzip gle32bi4.zip -d
+ pkunzip gle32bi5.zip -d
+ pkunzip gle32bi6.zip -d
+ 3) Edit the batch file which tells gle where to find it's fonts
+ and also what sort of graphics card you have.
+ edit setgle32.bat
+ (change the disk and directory as appropriate)
+ 4) Run the batch script
+ setgle32
+ 5) Try out the new version
+ gle_vga
+ 6) Note most of the programs have been renamed to avoid conflicts!!!
+
+
+ Below are the more detailed instructions provided by Axel Rohde.
+ Read these carefully if you have any problems.
+\end{verbatim}
+}
+\end{minipage}
+\end{center}
+\clearpage
+\begin{center}
+\begin{minipage}[t]{11.0cm}
+{\scriptsize
+\begin{verbatim}
+ Installation-manual and documentation
+ for the 32-Bit DOS version of
+ GLE 3.3 b
+
+ by Axel Rohde
+
+
+ The source-Code of GLE is free and available from many FTP-sites
+ (e.g. nic.funet.fi, ftp.informatik.uni-stuttgart.de). GLE 32 is a
+ implementation of GLE for MS-DOS. It was compiled with the free port
+ of the GNU C-compiler DJGPP by D.J. Delorie. The compiler itself and
+ the DJGPP-compiled executables are running with the 32-bit DOS-extender
+ GO32 by the same author. Thus, GLE 32 runs only on i386SX and above CPUs.
+ GO32 comes with a co-processor-emulator for those without a i387xx
+ Real-mode co-prozessor-emulators don't work with GO32.
+
+ GLE was compiled using Borland-C compatible libraries for text and
+ graphics-modes and some filesystem calls.
+ There exists for the DJGPP specific graphics-library GRX from Csaba Biegl
+ a emulation-library called BCCGRX from Hartmut Schirmer
+ to replace calls of the Borland-Graphics-Interface (BGI) with GRX-calls.
+ Hartmut has implemented the mouse-functionality, too, with GRX-calls.
+ Copyright statements are at the end of this file.
+
+ Properties of GLE 32
+
+ - All programs are running in the 386-protected-mode and therefore there is
+ neither a limited 640kB adress-range nor a 64kB segmentation.
+ - 32-bit programs are running faster than their 16-bit-counterparts.
+ - There exists a multitude of GRX-graphics-drivers, e.g. for
+ TSENG ET4000(W32), S3, 8514A, Cirrus Logic GD 542x, Trident 8900,
+ Diamond Viper, ATI Ultra, ATI VGA and EGA. These drivers are highly
+ configureable and can use flicker-free high resolution modes.
+
+
+ Installation
+
+ To understand the next lines, you should have a basic knowledge of
+ the MS-DOS operating system and PC-hardware. Take a look into
+ your DOS-manual and your hardware documentation in case of doubt.
+
+ The DOS-Extender GO32 1.11 has different modes of operation:
+
+ 1) VCPI: VCPI is an extension to EMS. EMS can be installed by
+ the driver EMM386.EXE of MS-DOS 5.0 and higher.
+ The (unoptimized) entry in the system-file CONFIG.SYS looks
+ like the follwing lines:
+
+ DOS=high,umb
+ device=c:\dos\himem.sys
+ device=c:\dos\emm386.exe RAM 2048
+
+ This entry installs
+ a) 2 MB EMS in the memory area above 1MB,
+ b) a page-frame with a size of 64kB between the memory area
+ of the graphics-board and the BIOS (upper memory).
+ Programs, that use VCPI-calls, can NOT run under Windows or the
+ DOS-emulation of OS/2 2.x. Other products, such as QEMM386 can
+ also be used.
+\end{verbatim}
+}
+\end{minipage}
+\end{center}
+\clearpage
+\begin{center}
+\begin{minipage}[t]{11.0cm}
+{\scriptsize
+\begin{verbatim}
+ 2) DPMI: DPMI can be installed with special drivers like QDPMI (along
+ with QEMM 6.0 or higher) or 386ToTheMax 7.x. Both the DOS-emulation
+ of OS/2 2.x and Windows 3.x provide DPMI as a default. The
+ DPMI-interface does not allows direct access to (graphics-)hardware.
+ Only those programs, that don't use graphic-mode, can run with
+ DPMI. I had a lot of total system crashes while running
+ some of the text-mode programs of GLE under OS/2 2.1. I recommend
+ to run GLE 32 under plain DOS.
+
+
+ To avoid name-conflicts between a 16-bit and a 32-bit version of GLE,
+ all the programs and the environment-variables were renamed.
+ All GLE-programs have now unix-style names like 'gle_ps' (='psgle'-
+ Postscript-output), 'gle_vga' (='cgle' - VGA-Preview) etc. The names
+ of the utilities end with '32' - 'manip32', 'contou32'....
+
+ In the example on the following lines, the progams are installed in the
+ directory d:\gle32, the fonts are in d:\gle32\fonts. GLE 32 searches for
+ its vector-fonts in the directory GLE_TOP. Don't forget the trailing slash.
+ In addition to this, GL32FONT points to the directory where the bitmap-fonts
+ (you can see them in the status-line of the preview) can be found.
+ The directory with the DOS-Extender GO32 and, if there's no
+ numeric-prozessor installed, the co-prozessor-emulator, must be in the
+ path-environment.
+
+ set GLE_TOP=d:/gle32/
+ set gle32font=d:/gle32/grxfont
+ path=..your normal path..;d:\gle;
+ go32=driver d:/gle32/driver/vesa_s3.grn gw 1024 gh 768 tw 80 th 25 nc 256
+
+ The configuration of graphics-drivers is a little bit more complicated.
+ Please study the documentation of the Libraries GRX und BCCGRX and
+ the README of GO32 in their directories.
+ The environment GO32 sets den path-name and the mode of the driver
+ an. This example installs the driver for an S3 graphics-board with a
+ resolution of 1024 horizontal 768 vertical pixels and 256 colors.
+
+ There's a second way to install a graphics-mode. If the environment-
+ variables GLE32WIDTH, GLE32HEIGHT and GLE32COLORS are set, the graphics-
+ mode in the GO32 variable is overridden. You still have to specify a
+ driver in the GO32 environment.
+
+ set GLE32WIDTH=800
+ set GLE32HEIGHT=600
+ set GLE32COLORS=16
+
+ There's a prepared batch-file 'setgle32.bat' to set all the environment-
+ variables in the directory gle32.
+
+ To figure out, which modes are supported, try to run the program
+ modetest in the directory gle32\driver\doc
+ !!!! WARNING !!!!
+ A wrong installed graphics-mode can DESTROY your MONITOR (and/or graphics
+ board) if the refresh rate is too high!
+ USE THIS ON YOUR OWN RISK!!!
+ You should take a look into the manuals of your monitor and your
+ graphics-adapter to figure out, which horizontal frequencies are supported.
+ If the horizontal frequency of the monitor is 64 kHz or higher,
+ you MAY feel save. (MY Monitor has a horizontal frequency of 64 kHz and
+ supports a resolution of 1024x768 with a refresh rate up to 80Hz.)
+ If you want to go save, don't set the environment go32 at all!
+ This will use the normal (flickering) VGA-mode on a VGA-compatible
+ adapter.
+\end{verbatim}
+}
+\end{minipage}
+\end{center}
+%%\clearpage
+\begin{center}
+\begin{minipage}[t]{11.0cm}
+{\scriptsize
+\begin{verbatim}
+ RESTRICTIONS and BUGS
+
+ 1) The vector-fonts of the 32-bit-version are NOT compatible to their
+ 16-bit-counterparts. They may be compatible to fonts that were created
+ under other 32-bit operating-systems.
+ 2) The on-line-help of gle_vga is usable but may sometimes look different
+ compared to the original.
+ 3) Makefmt and fbuild are missing. DJGPP's Library lacks ecvt().
+ Both programs are used to calculate vector-fonts in the Unix-version
+ from the source-distribution. Both programs are NOT included in the
+ 16-bit DOS-version, too. This package includes all (allready calculated)
+ fonts from the Unix-source distribution. They were calculated under Linux,
+ a free Unix-implementation for i386-PC's and higher. Since a few months,
+ there exists an archive with my patches (at the ftp-sites sunsite.unc.edu
+ and nic.funet.fi) to compile GLE 3.3b under Linux.
+ 4) The DVI-drivers are not testet! (I use Ghostscript or HP2XX for printing
+ and converting. Both programs are freely avaiable. Gle_ps and gle_hpgl
+ run properly.)
+ 5) Surface (surf_vga) hanged under unknown circumstances while loading
+ one data-file. surf_vga can be stopped by pressing Control-Pause.
+ If this happens, load the data-file into an editor, save it, and try it
+ again.
+
+
+ Access to the DJGPP patches for the Source
+
+ I'll release them in the near future after contacting Chris Pugmire.
+ You need a fixed version of Hartmut Schirmers BCC2GRX-library
+ to (properly) compile gle_vga and surf_vga. This will be released soon.
+
+
+ Postscript Documentation
+
+ The complete Postscript documentaion is in the directory
+ gle32\postscri.doc. I made diff-files to patch them in a
+ Ghostscript-printable state. For further information, take
+ a look into the file gle32\postscri.doc\readme.pat. The 'patch'
+ utility from the 1.11 release of DJGPP is included in this package.
+
+
+\end{verbatim}
+}
+\end{minipage}
+\end{center}
+%%\clearpage
+\begin{center}
+\begin{minipage}[t]{11.0cm}
+{\scriptsize
+\begin{verbatim}
+ LEGAL STUFF
+
+Copyright-holders are:
+
+GLE: unknown to me, take a look into the original
+ documentation in the directory gle32\gle.doc\ and ask
+ Chris Pugmire
+
+DJGPP and GO32: D. J. Delorie, GNU LIBRARY GENERAL PUBLIC LICENSE and
+ GNU PUBLIC LICENSE,
+ see the files in the directory gle32\go32.doc
+
+GRX: Csaba Biegl, GNU LIBRARY GENERAL PUBLIC LICENSE,
+ (see gle32\driver\doc\grx.doc)
+
+BCC2GRX: Hartmut Schirmer, GNU LIBRARY GENERAL PUBLIC LICENSE,
+ (see gle32\driver\doc\bccgrx.doc)
+
+MS-DOS: Microsoft Corporation (if you haven't guessed...)
+
+DJGPP, GRX and BCC2GRX are available from many ftp-sites. For examples see
+the file gle32\driver\doc\bccgrx.doc.
+
+
+LIKE ANYTHING ELSE THAT'S FREE, GLE 32 AND ITS ASSOCIATED UTILITIES ARE
+PROVIDED AS IS AND COME WITH NO WARRANTY OF ANY KIND, EITHER EXPRESSED OR
+IMPLIED. IN NO EVENT WILL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY DAMAGES
+RESULTING FROM THE USE OF THIS SOFTWARE.
+
+These programs are distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+Bug-reports are wellcome (to me and Chris Pugmire). It can not be guaranteed
+that they can be fixed.
+
+
+ Axel Rohde, 19.1.94, email: rohde at physik.uni-kiel.d400.de
+
+ Chris Pugmire's email adress: chrisp at marc.cri.nz
+\end{verbatim}
+}
+\hfill {\small gle32b.txt}\\
+\end{minipage}
+\end{center}
diff --git a/gle-refman/obsolete/obsolete.tex b/gle-refman/obsolete/obsolete.tex
new file mode 100644
index 0000000..1cd8eb1
--- /dev/null
+++ b/gle-refman/obsolete/obsolete.tex
@@ -0,0 +1,553 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% GLE - Graphics Layout Engine <http://www.gle-graphics.org/> %
+% %
+% Modified BSD License %
+% %
+% Copyright (C) 2009 GLE. %
+% %
+% Redistribution and use in source and binary forms, with or without %
+% modification, are permitted provided that the following conditions %
+% are met: %
+% %
+% 1. Redistributions of source code must retain the above copyright %
+% notice, this list of conditions and the following disclaimer. %
+% %
+% 2. Redistributions in binary form must reproduce the above %
+% copyright notice, this list of conditions and the following %
+% disclaimer in the documentation and/or other materials provided with %
+% the distribution. %
+% %
+% 3. The name of the author may not be used to endorse or promote %
+% products derived from this software without specific prior written %
+% permission. %
+% %
+% THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR %
+% IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED %
+% WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE %
+% ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY %
+% DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL %
+% DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE %
+% GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS %
+% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER %
+% IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR %
+% OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN %
+% IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\section{GLE Installation on a PC}
+\index{DOS}
+To install GLE, put the distribution disk into drive a: and
+type:
+\begin{verbatim}
+ a:install
+\end{verbatim}
+
+GLE requires at least 800K of disk space for a minimal installation
+and 3.3M for a full installation (including all device drivers
+and fonts).
+
+GLE also requires 530K or more of free memory. Use the DOS
+command CHKDSK to check this figure. If you don't have
+enough then take copies of your AUTOEXEC.BAT and CONFIG.SYS files
+and then remove as much as possible from these files.
+
+GLE may work with less memory depending on what you are drawing.
+
+The installation disk contains a version of CGLE which will
+make use of epanded memory. This version can run with 70K less
+memory but if you don't have expanded memory then it has to
+use your hard disk instead which is a great deal slower.
+
+\index{EPS}
+\index{Encapsulated PostScript}
+To produce an .eps file for inclusion in WordPerfect you would type:
+\begin{verbatim}
+ C:> psgle myfile /eps
+\end{verbatim}
+This will create a file called myfile.EPS.
+
+WordPerfect can also understand a special file format which contains
+both an EPS file for printing to PostScript printers and a bitmap TIFF
+image for displaying on the screen. GLE can create this sort of
+file with the command:
+\begin{verbatim}
+ C:> wpgle myfile
+\end{verbatim}
+This will create a file called MYFILE.EPF which you can include into
+WordPerfect.
+
+If your PC is connected to a VAX computer which has a PostScript printer
+you may copy MYFILE.PS to the VAX using a standard file transfer
+program (e.g. FTP, KERMIT, VDISK)
+
+The best way to see what GLE can do is to have a play with it, simply
+start it up and try out some of the examples:
+\begin{verbatim}
+ Press F3 (Load file)
+ Press <enter> (for a menu of GLE files)
+ Use arrow keys to select example, then press <enter>
+ Press F10 to draw the picture
+ Press ESC to get back to the GLE editor.
+ ...
+ When you find a graph try pressing F9 and modifying
+ one of the fields (use F1 for an explanation of each
+ field).
+\end{verbatim}
+
+Used symbols for PC:
+\begin{verbatim}
+GLE_NOCONTROLD TRUE (Stops ^D being added to ps files)
+(this is the default for unix)
+
+GLE_ADDBGI ... (high resolution BGI-Driver)
+(see Device Drivers)
+\end{verbatim}
+%
+%
+\input{sm_gle32_tut}
+%%\section{32bit DOS Version of GLE}
+%%\index{DOS!32bit}
+%
+
+\section{Running GLE on a VAX}
+\index{VAX}
+The command to run GLE is:
+\begin{verbatim}
+ $ cgle myfile.gle
+ $ cgle myfile.gle /dev=regis
+ $ cgle myfile.gle /dev=x
+\end{verbatim}
+See the directory CGLE\_EXAMPLES: for examples and templates.
+To get access to these files from the GLE menus use the commands:
+\begin{verbatim}
+ $ define workarea sys$login:,cgle_examples:
+ $ set default workarea:
+ $ cgle stack4b.gle ! or any other example
+\end{verbatim}
+
+If your keyboard doesn't have the function keys F9 thru F14 you can
+use GOLD (PF1) followed by the numbers 9,0,1,2,3,4 (on the top of the
+QWERTYUIOP keypad).
+
+Keyboard Mappings:\\
+\begin{center}
+\begin{tabular}{|l|l|l|l|} \hline
+VT100 & VT200 & PC & Meaning \\ \hline
+GOLD 1 & F11 & F1 & Help \\
+GOLD 2 & F12 & F2 & Save \\
+GOLD 3 & F13 & F3 & Load \\
+GOLD 4 & F14 & F4 & Save-as \\
+GOLD 9 & F9 & F9 & Graph-menu \\
+GOLD 0 & F10 & F10 & Draw-it \\
+Control+Z & Control+Z & Control+Z & Exit/Escape \\
+& & Alt+X & Exit/Escape \\
+Control+E & Control+E & & Calls VAX EDT \\
+Control+F & Control+F & & Toggle fast/slow text \\
+Control+R & Control+R & F5 & Shows errors \\
+& & Control+S & Shells to DOS \\ \hline
+\end{tabular}
+\end{center}
+
+Supported devices: VT100, REGIS (VT125, VT240), TEK4010, VWS, XWindows.
+
+Supported output: PostScript, HPGL, Epson, Epson 24pin, HP Deskjet.
+
+\index{printing}
+To create a PostScript output file (.PS) and automatically print it to
+the LASER queue you would type:
+\begin{verbatim}
+ $ cgle myfile /print
+\end{verbatim}
+
+\index{EPS}
+\index{Encapsulated PostScript}
+To produce an .eps file for inclusion in \LaTeX\ you would type:
+\begin{verbatim}
+ $ cgle myfile /dev=eps
+\end{verbatim}
+
+To produce a .ps file suitable for printing to a laser writer type:
+\begin{verbatim}
+ $ cgle myfile /dev=ps
+\end{verbatim}
+
+The DCL symbol GLE\_NOCONTROLD should be set to "TRUE" to kill the
+\verb#^D# on vms systems.
+
+If you set the DCL symbol GLE\_EDITOR to TPU then you will get
+TPU instead of EDT when you press \verb#^E#.
+
+\section{It didn't work, bugs!!!}
+\index{bugs} \index{errors}
+If the installation fails, or one of the example GLE files fails to work
+then the most likely reason is a shortage of memory due to too many
+memory resident programs/drivers. To fix this remove these utilities from
+your autoexec.bat and config.sys files temporarily.
+
+There may well be a bug in your GLE file, try using the
+trace option to find the bug.\\
+On a PC:
+\begin{verbatim}
+ C:\GLE> psgle myfile /trace
+\end{verbatim}
+
+On a VAX:
+\begin{verbatim}
+ $ cgle myfile /dev=ps /trace
+\end{verbatim}
+
+Another reason for a failure is a bug in GLE, {\bf Please} report
+bugs to Chris Pugmire (Internet srghcxp at grv.dsir.govt.nz, grv::srghcxp)
+so they can be fixed. If possible, try and find a way of
+repeating the problem, then send relevant GLE and data files with
+an outline of what is wrong.
+
+\index{device drivers}
+\index{drivers} \index{EPSON} \index{LaserJet} \index{DeskJet}
+\index{plotters} \index{printers}
+\section{Device Drivers}
+GLE supports the following devices.
+
+Interactive: IBM/PC (BGI), VT100, REGIS (VT125, VT240), TEK4010, VWS, XWindows.
+
+Output: PostScript, HPGL, EPSON, EPSON 24pin, HP Deskjet.
+
+Keyboard Mappings:
+\begin{center}
+\begin{tabular}{|l|l|l|l|} \hline
+VT100 & VT200 & PC & Meaning \\ \hline
+GOLD 1 & F11 & F1 & Help \\
+GOLD 2 & F12 & F2 & Save \\
+GOLD 3 & F13 & F3 & Load \\
+GOLD 4 & F14 & F4 & Save-as \\
+GOLD 9 & F9 & F9 & Graph-menu \\
+GOLD 0 & F10 & F10 & Draw-it \\
+Control+Z & Control+Z & Control+Z & Exit/Escape \\
+& & Alt+X & Exit/Escape \\
+Control+E & Control+E & & Calls VAX EDT \\
+Control+F & Control+F & & Toggle fast/slow text \\ \hline
+\end{tabular}
+\end{center}
+To find out what drivers are available type in:
+\begin{verbatim}
+ ls /usr/local/gle/gle_*
+\end{verbatim}
+\subsection{PC Screen Drivers}
+\index{PC screen driver}
+\index{Device Drivers!PC screen driver}
+Remember that what you see on the screen isn't always what you will
+get on the printer. For example filled regions will not be filled,
+and some characters may not look right.
+
+After pressing F10 and drawing the graph it can be annotated by using
+the mouse (or arrow keys) to draw lines, text and boxes.
+To draw lines simply click on the points of the line, use the right
+hand mouse button to `pick up' the pen.
+
+To draw text press the letter `t' and then click on where you would
+like the text to be drawn.
+
+All movements are rounded to the grid size settings which are
+1.0cm, 0.1cm, 0.01cm etc.
+
+The height and colour of the text/lines is determined by the current
+settings at the end of the GLE file.
+
+If there is no mouse driver loaded then a cross-hair will appear
+and it can be moved around using the arrow keys. Press `c' to
+click, instead of the mouse button.
+% sm
+\subsubsection{SuperVGA}
+\index{Device Drivers!PC SVGA}
+%
+To use a SuperVGA card you first need to get a BGI
+driver that supports your card. From anonymous FTP
+you can get svgabgi3.zip: ftp wuarchive.wustl.edu
+\begin{verbatim}
+ ftp> user anonymous
+ ftp> (mail ident)
+ ftp> cd /mirrors/msdos/borland
+ ftp> binary
+ ftp> get svgabgi3.zip
+ ftp> quit
+\end{verbatim}
+Then unzip it, decide which driver will match your SVGA card
+and copy that driver into \verb?\GLE\EXE?.
+\begin{verbatim}
+ c:> pkunzip svgabgi3.zip
+ c:> pkunzip svgabgi3.zip
+ c:> type readme.
+ c:> copy svga16.bgi \gle\exe
+\end{verbatim}
+Define an environment variable to tell gle about this driver
+and which mode to use. (put this line in your autoexec.bat)
+\begin{verbatim}
+ c:> set gle_addbgi=4.svga16
+\end{verbatim}
+% sm
+%%\subsection{GO32/GRX Screen Driver}
+%%\include{sm_gle32_prog}
+\input{sm_gle32_prog}
+
+%
+\subsection{PostScript Driver}
+\index{PostScript (driver)}
+\index{printing}
+To print a GLE file to the laser printer type:
+\begin{verbatim}
+ $ cgle myfile /print
+\end{verbatim}
+
+or on a PC:
+\begin{verbatim}
+ C:\GLE> psgle myfile
+ C:\GLE> print myfile.ps
+\end{verbatim}
+
+\index{flipping}
+The postscript drivers for GLE will automatically flip a
+picture to best fit onto the page, e.g. a wide graph
+(as defined by the size command at the top) will be drawn
+in {\em landscape} mode and a tall thin graph will be drawn in
+{\em portrait} mode.
+
+\index{EPS}
+\index{Device Drivers!PostScript}
+\index{PostScript (EPS, WordPerfect)}
+\index{Encapsulated PostScript}
+\index{WordPerfect}
+\index{\LaTeX \ (inserting graphs)}
+To produce an .eps file on a VAX for inclusion in \LaTeX \ or
+WordPerfect you would type:
+\begin{verbatim}
+ $ cgle myfile /dev=eps
+\end{verbatim}
+
+On a PC you would type:
+\begin{verbatim}
+ C:\GLE> psgle myfile /eps
+ (this creates myfile.eps, not myfile.ps)
+\end{verbatim}
+
+WordPerfect can also understand a special file format which contains
+both an EPS file for printing to PostScript printers and a bitmap TIFF
+image for displaying on the screen. GLE can create this sort of
+file with the command:
+\begin{verbatim}
+ C:> wpgle myfile
+\end{verbatim}
+This will create a file called MYFILE.EPF which you can include into
+WordPerfect.
+
+%Inside your \LaTeX \ document use the \LaTeX \ command:
+%\begin{verbatim}
+% \graphin{myfile.eps}{12.0cm}{3.0cm}{1.0}
+%\end{verbatim}
+% sm
+To include Postscript in a \LaTeX \ document use epsf.sty of the
+{\sf DVIPS}-package.
+Inside your \LaTeX \ document use {\sf\\epsffile } to put it at the right
+place in a {\sf picture}-environment, e.g. :
+\begin{verbatim}
+ \documentstyle[12pt,epsf]{article}
+ ...
+ \begin{picture}(13.0, 5.5)
+ \put(0.0,0.0){
+ \epsfclipon
+ \epsfxsize=6cm
+ \epsffile[60 170 560 740]{myfile.ps} } % [ bounding-box ] { file_name }
+ \end{picture}
+\end{verbatim}
+
+Advanced features of {\sf epsf.sty} are described in {\tt
+../TeX/src/dvips/dvips.tex}.
+% sm
+
+\index{lwidth}
+\index{line width}
+The laser printer driver will draw all zero width lines .02cm wide
+for any line width equal to zero, but if an lwidth
+is greater than zero and less than or equal to .0001 then it will use a line
+width of 1 pixel. Without this it would be impossible to specify
+a line width that didn't occasionally get rounded to 2 pixels.
+
+There are also some commandline switches
+\begin{verbatim}
+ /nod (add ^D to ps file)
+ /addd (Don't add ^D to ps file)
+ /nomaxpath (Don't choke on complex fill paths)
+ /fill (For dvibit, makes bar's filled instead of shaded)
+\end{verbatim}
+
+\index{Device Drivers!TEK4010}
+\subsection{TEK4010 Driver}
+This driver allows initialization sequences to be defined
+with the symbols TEK\_OPEN and TEK\_CLOSE.
+
+On a VAX this is normally done by CGLECMD.COM so that when you
+specify /DEV=V550 the assignments are done for you.
+(V550 = Visual 550)
+
+\index{plotter pens}
+\index{pens} \index{HPGL}
+\subsection{HPGL Driver}
+\index{Device Drivers!HPGL Driver}
+This driver allows initialization sequences to be defined
+in the symbols HPGL\_OPEN and HPGL\_CLOSE. On the PC
+use environment variables and on the VAX use DCL symbols.
+Also HPGL\_WIDTH and HPGL\_HEIGHT can be defined for non A3 plotters.
+
+The HPGL driver supports sizes greater than A3.
+
+The symbols HPGL\_ADDX, HPGL\_ADDY add a margin to the plot.
+These default to .9cm and 1.5cm
+
+On a VAX this is normally done by CGLECMD.COM so that when you
+specify /DEV=HPA4 the assignments are done for you.
+
+The HPGL driver assigns the following colours to pen numbers:
+
+1=black, 2=red, 3=green, 4=blue, 5=magenta, 6=white, 7=yellow.
+
+To get Gle-Output in a WIN-WORD text, HPGL is a good and easy way to do it.
+\index{Win-Word} \index{Win-Word!HPGL-Import}
+
+The use of the HPGL-Converter HP2XX of Heinz W. Werntges is another way to
+get various pix-map format output. HP2XX has been ported successfully
+for Unix, OS/2, DOS, Amiga, Atari, VMS and AXP. \\
+HP2XX has many controling options. In
+the current version it is able to write the following formats:
+mf, cad, em, epic, eps, pcl, pcx, pic, img, pbm, pre, uis.
+
+HP2XX is available via anonymous FTP at ftp.rz.uni-duesseldorf.de. For
+further information ask Heinz (Internet:
+werntges at clio.rz.uni-duesseldorf.de).
+\index{hp2xx}
+\index{HPGL!converter}
+%
+
+\subsection{PC Bitmap Drivers}
+\index{PC Bitmap Driver}
+\index{Device Drivers!PC Bitmap Driver}
+GLE supports the EPSON 8 and 24 pin and HP deskjet/laserjet printers.
+To support bitmap devices which require a large amount of memory GLE
+first writes a device independent file OUT.DVI, then the
+appropriate bitmap driver for your printer will read the OUT.DVI file
+and create a bitmap which it then prints to LPT1:
+
+\begin{verbatim}
+ C:> dvigle myfile (produces OUT.DVI)
+ C:> dviepson (creates bitmap and prints to LPT1:)
+\end{verbatim}
+
+The output options are:
+\begin{verbatim}
+ C:> dviepson Standard EPSON printers
+ C:> dviep24 24 Pin EPSON printers (180dpi)
+ C:> dvilj HP Laser jet, Desk jet (150 dpi)
+ C:> dvilj300 HP Laser jet, Desk jet (300 dpi)
+ C:> dviprint -dpj HP PaintJet printers
+ C:> dviprint -dsx Sixel graphics driver
+\end{verbatim}
+The high resolution drivers (dviep24, dvilj300) are significantly slower
+than the low resolution drivers so would only be used for final output.
+
+See the file AAREADME.GLE for the latest information on drivers.
+% sm
+\clearpage
+\subsection{DVIPRINT}
+\index{Bitmap Driver}
+\index{Device Drivers! DVIPRINT}
+All available bitmap drivers and options can be use with
+\begin{verbatim}
+ gle myfile -ddevice [-hires] [...]
+\end{verbatim}
+To find out what drivers are available type in:
+\begin{verbatim}
+ gle_dviprint
+
+Usage: dviprint [-depson | -dlj] [-old] [-hires] [-vhires] [-debug] [-output xx.prt]
+ -depson To produce output for epson printers
+ -dwp To add tiff image to wp .eps file
+ -dec Epson color ribbon printers
+ -dlj To produce output for HP LaserJet printers
+ -dpj To produce output for HP PaintJet printers
+ -dsx Sixel graphics, for DEC printers la100's ...
+ -dvt To print bitmap to screen (preview)
+ -over Overhead transparency mode for PaintJet
+ -old For old HP Laser Jet printers (no compression)
+ -hires Uses high resolution for that printer (slower)
+ -vhires Viritcal high resolution for sixel graphics
+ -wide If your printer has a wide carriage
+ -noflip Disable's auto flipping
+ -flip Forces flip
+ -nosquash Tries to print it full size
+ -compress Force internal bitmap compression (slow)
+ -noff No form feed
+ -debug Prints debug messages
+ -out x.x Prints output to file instead of printer port
+\end{verbatim}
+% sm
+%
+\subsection{Fonts (font mapping)}
+\index{Device Drivers!fonts}
+By default the generic fonts (rm, rmb, ss, tt etc) will all map
+to PLSR (plotter simplex roman) on BITMAP and HPGL drivers. To make
+this happen on other drivers put the command
+{\sf plotter fonts} immediately after the {\sf size} command
+at the top of the GLE file.
+
+A typical result of this change in fonts is that something
+that lines up on the screen will not line up when printed
+to an EPSON printer. If this happens then use the {\sf plotter fonts}
+command.
+
+If a character is missing from a font, or isn't the particular
+variation you like, you can define a character to be from
+a different font in this way:
+\begin{verbatim}
+ \chardef{%}{{\setfont{texcmr}\char{37}}}
+ \chardef{[}{{\setfont{texcmr}\char{91}}}
+ \chardef{]}{{\setfont{texcmr}\char{93}}}
+\end{verbatim}
+
+ On the PC some fonts may not be installed to save disk space.
+When one of the missing fonts is called for, a replacement
+font will be displayed, this may look
+terrible and some special characters may be completely wrong.
+
+\clearpage
+More importantly if you use a font which does not have its font metric
+file installed (e.g. C:/GLE/FONTS/PLSR.FMT) then the
+PostScript driver will space the characters incorrectly. This can
+be fixed by extracting that particular metric file from the
+distribution file CGLE\_FVE.ZIP using PKUNZIP.
+
+\subsection{Printer Fonts}
+\index{Device Printer!fonts}
+You can now tell gle about postscript fonts that you have
+downloaded into your own printer.
+
+Lets pretend we are adding a font called Greek-Bold
+\begin{verbatim}
+ 1) Download the font into you laser printer
+ 2) Add a line to FONT.DAT
+psgb 86 psgb.fmt plsr.fve psgb.fmt
+a b c d
+ a = GLE's name for the font
+ b = The next unused number in font.dat
+ c = The font metric file, this can be created using
+ makefmt from and adobe font metric file
+ (.afm) which you should have been supplied
+ with your font.
+ d = The font vector file, this is just a font that
+ that gle can use to draw your font on non
+ postscript devices.
+ 3) Add a line to psfont.dat
+psgb Greek-Bold
+\end{verbatim}
+This tells the postscript driver that this is a
+font that the printer knows how to deal with.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5
diff --git a/gle-refman/obsolete/sm_gle32_prog.tex b/gle-refman/obsolete/sm_gle32_prog.tex
new file mode 100644
index 0000000..ec29f85
--- /dev/null
+++ b/gle-refman/obsolete/sm_gle32_prog.tex
@@ -0,0 +1,117 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% GLE - Graphics Layout Engine <http://www.gle-graphics.org/> %
+% %
+% Modified BSD License %
+% %
+% Copyright (C) 2009 GLE. %
+% %
+% Redistribution and use in source and binary forms, with or without %
+% modification, are permitted provided that the following conditions %
+% are met: %
+% %
+% 1. Redistributions of source code must retain the above copyright %
+% notice, this list of conditions and the following disclaimer. %
+% %
+% 2. Redistributions in binary form must reproduce the above %
+% copyright notice, this list of conditions and the following %
+% disclaimer in the documentation and/or other materials provided with %
+% the distribution. %
+% %
+% 3. The name of the author may not be used to endorse or promote %
+% products derived from this software without specific prior written %
+% permission. %
+% %
+% THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR %
+% IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED %
+% WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE %
+% ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY %
+% DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL %
+% DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE %
+% GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS %
+% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER %
+% IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR %
+% OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN %
+% IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsection{GO32/GRX Screen Driver}
+\index{GLE32!GRX}
+\index{GO32}
+\index{GLE32!SVGA}
+GLE 32 is a 32-bit-Implementation of GLE for MS-DOS.
+Axel Rohde did this port of the GLE version 3.3b
+GLE32 was compiled with the free port
+of the GNU C-compiler DJGPP by D.J. Delorie. The compiler itself and
+the DJGPP-compiled executables are running with the 32-bit DOS-extender
+GO32.\\
+%
+GLE32 was compiled using Borland-C compatible libraries for text and
+graphics-modes and some filesystem calls.
+There exists for the DJGPP specific graphics-library GRX from Csaba Biegl
+a emulation-library called BCCGRX from Hartmut Schirmer
+to replace calls of the Borland-Graphics-Interface (BGI) with GRX-calls.
+Hartmut has implemented the mouse-functionality, too, with GRX-calls.\\
+%
+In the example on the following lines, the progams are installed in the
+directory \verb#d:\gle32#, the fonts are in \verb#d:\gle32\fonts#.
+GLE 32 searches for
+its vector-fonts in the directory \verb#GLE_TOP#. Don't forget the trailing slash.
+In addition to this, \verb#GL32FONT# points to the directory where the bitmap-fonts
+(you can see them in the status-line of the preview) can be found. \\
+%
+The directory with the DOS-Extender GO32 and, if there's no
+numeric-prozessor installed, the co-prozessor-emulator, must be in the
+path-environment.
+\begin{verbatim}
+ set GLE_TOP=d:/gle32/
+ set gle32font=d:/gle32/grxfont
+ path=..your normal path..;d:\gle;
+ go32=driver d:/gle32/driver/vesa_s3.grn gw 1024 gh 768 tw 80 th 25 nc 256
+\end{verbatim}
+
+
+The configuration of graphics-drivers is a little bit more complicated.
+Please study the documentation of the Libraries GRX und BCCGRX and
+the README of GO32 in their directories.
+
+The environment GO32 sets den path-name and the mode of the driver
+an. This example installs the driver for an S3 graphics-board with a
+resolution of 1024 horizontal 768 vertical pixels and 256 colors.
+
+There's a second way to install a graphics-mode. If the environment-
+variables GLE32WIDTH, GLE32HEIGHT and GLE32COLORS are set, the graphics-
+mode in the GO32 variable is overridden. You still have to specify a
+driver in the GO32 environment.
+\begin{verbatim}
+ set GLE32WIDTH=800
+ set GLE32HEIGHT=600
+ set GLE32COLORS=16
+\end{verbatim}
+
+There's a prepared batch-file \verb#setgle32.bat# to set all the environment-
+variables in the directory gle32.
+
+To figure out, which modes are supported, try to run the program
+modetest in the directory \verb#gle32\driver\doc#.\\
+
+\begin{center} ! WARNING !\end{center}
+
+A wrong installed graphics-mode can DESTROY your MONITOR (and/or graphics
+board) if the refresh rate is too high!
+
+\begin{center} USE THIS ON YOUR OWN RISK ! \end{center}
+
+You should take a look into the manuals of your monitor and your
+graphics-adapter to figure out, which horizontal frequencies are supported.
+If the horizontal frequency of the monitor is 64 kHz or higher,
+you MAY feel save. (MY Monitor has a horizontal frequency of 64 kHz and
+supports a resolution of 1024x768 with a refresh rate up to 80Hz.)\\
+%
+If you want to go save, don't set the environment go32 at all!
+This will use the normal (flickering) VGA-mode on a VGA-compatible
+adapter.\\
+%
+For more detailed information and instructions how to install GO32 see
+\verb#gle32.txt#!
diff --git a/gle-refman/obsolete/sm_gle32_tut.tex b/gle-refman/obsolete/sm_gle32_tut.tex
new file mode 100644
index 0000000..84ac2cf
--- /dev/null
+++ b/gle-refman/obsolete/sm_gle32_tut.tex
@@ -0,0 +1,110 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% GLE - Graphics Layout Engine <http://www.gle-graphics.org/> %
+% %
+% Modified BSD License %
+% %
+% Copyright (C) 2009 GLE. %
+% %
+% Redistribution and use in source and binary forms, with or without %
+% modification, are permitted provided that the following conditions %
+% are met: %
+% %
+% 1. Redistributions of source code must retain the above copyright %
+% notice, this list of conditions and the following disclaimer. %
+% %
+% 2. Redistributions in binary form must reproduce the above %
+% copyright notice, this list of conditions and the following %
+% disclaimer in the documentation and/or other materials provided with %
+% the distribution. %
+% %
+% 3. The name of the author may not be used to endorse or promote %
+% products derived from this software without specific prior written %
+% permission. %
+% %
+% THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR %
+% IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED %
+% WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE %
+% ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY %
+% DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL %
+% DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE %
+% GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS %
+% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER %
+% IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR %
+% OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN %
+% IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\section{32bit DOS Version of GLE}
+\index{DOS!32bit}
+Axel Rohde has compiled a 32bit DOS version of GLE in 1994
+( email: rohde at physik.uni-kiel.d400.de)\\
+On any 386 or better machine this version of GLE should
+run without problems, it's main features are these:
+1) No 640K memory restrictions. 2) Much faster.\\
+\clearpage
+Properties of GLE 32:
+\begin{verbatim}
+ - All programs are running in the 386-protected-mode and therefore there is
+ neither a limited 640kB adress-range nor a 64kB segmentation.
+ - 32-bit programs are running faster than their 16-bit-counterparts.
+ - There exists a multitude of GRX-graphics-drivers, e.g. for
+ TSENG ET4000(W32), S3, 8514A, Cirrus Logic GD 542x, Trident 8900,
+ Diamond Viper, ATI Ultra, ATI VGA and EGA. These drivers are highly
+ configureable and can use flicker-free high resolution modes.
+\end{verbatim}
+Installation Quick guide:
+\begin{verbatim}
+ 1) FTP the binary distribution
+ ftp tui.marc.cri.nz
+ cd pub/gle/gle32
+ binary
+ mget gle32bi*.zip
+ 2) Unzip them keeping the directory structure
+ cd c:\
+ pkunzip gle32bi1.zip -d
+ pkunzip gle32bi2.zip -d
+ pkunzip gle32bi3.zip -d
+ pkunzip gle32bi4.zip -d
+ pkunzip gle32bi5.zip -d
+ pkunzip gle32bi6.zip -d
+ 3) Edit the batch file which tells gle where to find it's fonts
+ and also what sort of graphics card you have.
+ edit setgle32.bat
+ (change the disk and directory as appropriate)
+ 4) Run the batch script
+ setgle32
+ 5) Try out the new version
+ gle_vga
+ 6) Note most of the programs have been renamed to avoid conflicts!!!
+\end{verbatim}
+
+To avoid name-conflicts between a 16-bit and a 32-bit version of GLE,
+all the programs and the environment-variables were renamed.
+All GLE-programs have now unix-style names like \verb#gle_ps# (='psgle'-
+Postscript-output), \verb#gle_vga# (='cgle' - VGA-Preview) etc. The names
+of the utilities end with '32' - \verb#manip32#, \verb#contou32# \dots
+
+Restrictions and Bugs:
+\begin{description}
+\item[1.] The vector-fonts of the 32-bit-version are NOT compatible to their
+16-bit-counterparts. They may be compatible to fonts that were created
+under other 32-bit operating-systems.
+\item[2.] The on-line-help of \verb#gle_vga# is usable but may sometimes look different
+compared to the original.
+\item[3.] Makefmt and fbuild are missing. DJGPP's Library lacks ecvt().
+Both programs are used to calculate vector-fonts in the Unix-version
+from the source-distribution. Both programs are NOT included in the
+16-bit DOS-version, too. This package includes all (allready calculated)
+fonts from the Unix-source distribution. They were calculated under Linux,
+a free Unix-implementation for i386-PC's and higher.
+\item[4.] The DVI-drivers are not testet!
+\item[5.] Surface (\verb#surf_vga#) hanged under unknown circumstances while loading
+one data-file. \verb#surf_vga# can be stopped by pressing Control-Pause.
+If this happens, load the data-file into an editor, save it, and try it
+again.
+\end{description}
+
+In \verb#gle32b.txt# are the more detailed instructions provided by Axel Rohde.
+Read these carefully if you have any problems.
diff --git a/gle-refman/obsolete/symbols.tex b/gle-refman/obsolete/symbols.tex
new file mode 100644
index 0000000..39ea02b
--- /dev/null
+++ b/gle-refman/obsolete/symbols.tex
@@ -0,0 +1,187 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% GLE - Graphics Layout Engine <http://www.gle-graphics.org/> %
+% %
+% Modified BSD License %
+% %
+% Copyright (C) 2009 GLE. %
+% %
+% Redistribution and use in source and binary forms, with or without %
+% modification, are permitted provided that the following conditions %
+% are met: %
+% %
+% 1. Redistributions of source code must retain the above copyright %
+% notice, this list of conditions and the following disclaimer. %
+% %
+% 2. Redistributions in binary form must reproduce the above %
+% copyright notice, this list of conditions and the following %
+% disclaimer in the documentation and/or other materials provided with %
+% the distribution. %
+% %
+% 3. The name of the author may not be used to endorse or promote %
+% products derived from this software without specific prior written %
+% permission. %
+% %
+% THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR %
+% IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED %
+% WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE %
+% ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY %
+% DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL %
+% DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE %
+% GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS %
+% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER %
+% IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR %
+% OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN %
+% IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\chapter{SYMBOLS}
+The following table lists all the symbols (and the commands for generating
+them) available in GLE's text module.
+
+\begin{tabular}{llllll}
+\\
+\multicolumn{6}{l}{\em Lowercase Greek letters} \\ \hline
+$\alpha$ & \verb+\alpha+ & $\iota$ & \verb+\iota+ & $\sigma$ & \verb+\sigma+ \\
+$\beta$ & \verb+\beta+ & $\kappa$ & \verb+\kappa+ & $\varsigma$ & \verb+\varsigma+ \\
+$\gamma$ & \verb+\gamma+ & $\lambda$ & \verb+\lambda+ & $\tau$ & \verb+\tau+ \\
+$\delta$ & \verb+\delta+ & $\mu$ & \verb+\mu+ & $\upsilon$ & \verb+\upsilon+ \\
+$\epsilon$ & \verb+\epsilon+ & $\nu$ & \verb+\nu+ & $\phi$ & \verb+\phi+ \\
+$\varepsilon$ & \verb+\varepsilon+ & $\xi$ & \verb+\xi+ & $\varphi$ & \verb+\varphi+ \\
+$\zeta$ & \verb+\zeta+ & $\pi$ & \verb+\pi+ & $\chi$ & \verb+\chi+ \\
+$\eta$ & \verb+\eta+ & $\varpi$ & \verb+\varpi+ & $\psi$ & \verb+\psi+ \\
+$\theta$ & \verb+\theta+ & $\rho$ & \verb+\rho+ & $\omega$ & \verb+\omega+ \\
+$\vartheta$ & \verb+\vartheta+ & $\varrho$ & \verb+\varrho+ \\
+\end{tabular}
+\newpage
+\begin{tabular}{llllll}
+\\
+\multicolumn{6}{l}{\em Uppercase Greek Letters} \\ \hline
+$\Gamma$ & \verb+\Gamma+ & $\Xi$ & \verb+\Xi+ & $\Phi$ & \verb+\Phi+ \\
+$\Delta$ & \verb+\Delta+ & $\Pi$ & \verb+\Pi+ & $\Psi$ & \verb+\Psi+ \\
+$\Theta$ & \verb+\Theta+ & $\Sigma$ & \verb+\Sigma+ & $\Omega$ & \verb+\Omega+ \\
+$\Lambda$ & \verb+\Lambda+ & $\Upsilon$ & \verb+\Upsilon+ \\
+\\
+\multicolumn{6}{l}{\em Accents\dag} \\ \hline
+\`{o} & \verb+\`{o}+ & \={o} & \verb+\={o}+ & \t{oo} & \verb+\t{oo}+ \\
+\'{o} & \verb+\'{o}+ & \.{o} & \verb+\.{o}+ & \c{o} & \verb+\c{o}+ \\
+\^{o} & \verb+\^{o}+ & \u{o} & \verb+\u{o}+ & \d{o} & \verb+\d{o}+ \\
+\"{o} & \verb+\"{o}+ & \v{o} & \verb+\v{o}+ & \b{o} & \verb+\b{o}+ \\
+\~{o} & \verb+\~{o}+ & \H{o} & \verb+\H{o}+ \\
+\\
+\multicolumn{6}{l}{\em Foreign Symbols\dag} \\ \hline
+\oe & \verb+\oe+ & \aa & \verb+\aa+ & \l & \verb+\l+ \\
+\OE & \verb+\OE+ & \AA & \verb+\AA+ & \L & \verb+\L+ \\
+\ae & \verb+\ae+ & \o & \verb+\o+ & \ss & \verb+\ss+ \\
+\AE & \verb+\AE+ & \O & \verb+\O+ \\
+\\
+\multicolumn{6}{l}{\em Ellipsis} \\ \hline
+$\cdots$ & \verb+\cdots+ & $\ddots$ & \verb+\ddots+ & $\vdots$ & \verb+\vdots+ \\
+\end{tabular}
+\newpage
+\begin{tabular}{llllll}
+\\
+\multicolumn{6}{l}{\em Arrow symbols} \\ \hline
+$\leftarrow$ & \verb+\leftarrow+ & $\longleftarrow$ & \verb+\longleftarrow+ & $\uparrow$ & \verb+\uparrow+ \\
+$\Leftarrow$ & \verb+\Leftarrow+ & $\Longleftarrow$ & \verb+\Longleftarrow+ & $\Uparrow$ & \verb+\Uparrow+ \\
+$\rightarrow$ & \verb+\rightarrow+ & $\longrightarrow$ & \verb+\longrightarrow+ & $\downarrow$ & \verb+\downarrow+ \\
+$\Rightarrow$ & \verb+\Rightarrow+ & $\Longrightarrow$ & \verb+\Longrightarrow+ & $\Downarrow$ & \verb+\Downarrow+ \\
+$\leftrightarrow$ & \verb+\leftrightarrow+ & $\longleftrightarrow$ & \verb+\longleftrightarrow+ & $\updownarrow$ & \verb+\updownarrow+ \\
+$\Leftrightarrow$ & \verb+\Leftrightarrow+ & $\Longleftrightarrow$ & \verb+\Longleftrightarrow+ & $\Updownarrow$ & \verb+\Updownarrow+ \\
+$\mapsto$ & \verb+\mapsto+ & $\longmapsto$ & \verb+\longmapsto+ & $\nearrow$ & \verb+\nearrow+ \\
+$\hookleftarrow$ & \verb+\hookleftarrow+ & $\hookrightarrow$ & \verb+\hookrightarrow+ & $\searrow$ & \verb+\searrow+ \\
+$\leftharpoonup$ & \verb+\leftharpoonup+ & $\rightharpoonup$ & \verb+\rightharpoonup+ & $\swarrow$ & \verb+\swarrow+ \\
+$\leftharpoondown$ & \verb+\leftharpoondown+ & $\rightharpoondown$ & \verb+\rightharpoondown+ & $\nwarrow$ & \verb+\nwarrow+ \\
+$\rightleftharpoons$ & \verb+\rightleftharpoons+ & $\leadsto$ & \verb+\leadsto+ \\
+\\
+\multicolumn{6}{l}{\em Binary operation symbols} \\ \hline
+$\pm$ & \verb+\pm+ & $\sqcap$ & \verb+\sqcap+ & $\rhd$ & \verb+\rhd+ \\
+$\mp$ & \verb+\mp+ & $\sqcup$ & \verb+\sqcup+ & $\unlhd$ & \verb+\unlhd+ \\
+$\times$ & \verb+\times+ & $\vee$ & \verb+\vee+ & $\unrhd$ & \verb+\unrhd+ \\
+$\div$ & \verb+\div+ & $\wedge$ & \verb+\wedge+ & $\oplus$ & \verb+\oplus+ \\
+$\ast$ & \verb+\ast+ & $\setminus$ & \verb+\setminus+ & $\ominus$ & \verb+\ominus+ \\
+$\star$ & \verb+\star+ & $\wr$ & \verb+\wr+ & $\otimes$ & \verb+\otimes+ \\
+$\circ$ & \verb+\circ+ & $\diamond$ & \verb+\diamond+ & $\oslash$ & \verb+\oslash+ \\
+$\bullet$ & \verb+\bullet+ & $\bigtriangleup$ & \verb+\bigtriangleup+ & $\odot$ & \verb+\odot+ \\
+$\cdot$ & \verb+\cdot+ & $\bigtriangledown$ & \verb+\bigtriangledown+ & $\bigcirc$ & \verb+\bigcirc+ \\
+$\cap$ & \verb+\cap+ & $\triangleleft$ & \verb+\triangleleft+ & $\dagger$ & \verb+\dagger+ \\
+$\cup$ & \verb+\cup+ & $\triangleright$ & \verb+\triangleright+ & $\ddagger$ & \verb+\ddagger+ \\
+$\uplus$ & \verb+\uplus+ & $\lhd$ & \verb+\lhd+ & $\amalg$ & \verb+\amalg+ \\
+\end{tabular}
+\newpage
+\begin{tabular}{llllll}
+\\
+\multicolumn{6}{l}{\em Relational symbols} \\ \hline
+$\leq$ & \verb+\leq+ & $\geq$ & \verb+\geq+ & $\equiv$ & \verb+\equiv+ \\
+$\prec$ & \verb+\prec+ & $\succ$ & \verb+\succ+ & $\sim$ & \verb+\sim+ \\
+$\preceq$ & \verb+\preceq+ & $\succeq$ & \verb+\succeq+ & $\simeq$ & \verb+\simeq+ \\
+$\ll$ & \verb+\ll+ & $\gg$ & \verb+\gg+ & $\asymp$ & \verb+\asymp+ \\
+$\subset$ & \verb+\subset+ & $\supset$ & \verb+\supset+ & $\approx$ & \verb+\approx+ \\
+$\subseteq$ & \verb+\subseteq+ & $\supseteq$ & \verb+\supseteq+ & $\cong$ & \verb+\cong+ \\
+$\sqsubset$ & \verb+\sqsubset+ & $\sqsupset$ & \verb+\sqsupset+ & $\neq$ & \verb+\neq+ \\
+$\sqsubseteq$ & \verb+\sqsubseteq+ & $\sqsupseteq$ & \verb+\sqsupseteq+ & $\doteq$ & \verb+\doteq+ \\
+$\in$ & \verb+\in+ & $\ni$ & \verb+\ni+ & $\propto$ & \verb+\propto+ \\
+$\vdash$ & \verb+\vdash+ & $\dashv$ & \verb+\dashv+ & $\perp$ & \verb+\perp+ \\
+$\models$ & \verb+\models+ & $\mid$ & \verb+\mid+ & $\parallel$ & \verb+\parallel+ \\
+$\bowtie$ & \verb+\bowtie+ & $\Join$ & \verb+\Join+ & $\smile$ & \verb+\smile+ \\
+$\frown$ & \verb+\frown+ \\
+\\
+\multicolumn{6}{l}{\em Delimiter symbols} \\ \hline
+$($ & \verb+(+ & $)$ & \verb+)+ & $\uparrow$ & \verb+\uparrow+ \\
+$[$ & \verb+[+ & $]$ & \verb+]+ & $\downarrow$ & \verb+\downarrow+ \\
+$\{$ & \verb+\{+ & $\}$ & \verb+\}+ & $\updownarrow$ & \verb+\updownarrow+ \\
+$\lfloor$ & \verb+\lfloor+ & $\rfloor$ & \verb+\rfloor+ & $\Uparrow$ & \verb+\Uparrow+ \\
+$\lceil$ & \verb+\lceil+ & $\rceil$ & \verb+\rceil+ & $\Downarrow$ & \verb+\Downarrow+ \\
+$\langle$ & \verb+\langle+ & $\rangle$ & \verb+\rangle+ & $\Updownarrow$ & \verb+\Updownarrow+ \\
+$/$ & \verb+/+ & $\backslash$ & \verb+\backslash+ \\
+$|$ & \verb+|+ & $\|$ & \verb+\|+ \\
+\end{tabular}
+\newpage
+\begin{tabular}{llllll}
+\\
+\multicolumn{6}{l}{\em Miscellaneous symbols} \\ \hline
+$\aleph$ & \verb+\aleph+ & $\nabla$ & \verb+\nabla+ & $\sharp$ & \verb+\sharp+ \\
+$\hbar$ & \verb+\hbar+ & $\surd$ & \verb+\surd+ & $\backslash$ & \verb+\backslash+ \\
+$\imath$ & \verb+\imath+ & $\top$ & \verb+\top+ & $\partial$ & \verb+\partial+ \\
+$\jmath$ & \verb+\jmath+ & $\bot$ & \verb+\bot+ & $\infty$ & \verb+\infty+ \\
+$\ell$ & \verb+\ell+ & $\|$ & \verb+\|+ & $\Box$ & \verb+\Box+ \\
+$\wp$ & \verb+\wp+ & $\angle$ & \verb+\angle+ & $\Diamond$ & \verb+\Diamond+ \\
+$\Re$ & \verb+\Re+ & $\forall$ & \verb+\forall+ & $\triangle$ & \verb+\triangle+ \\
+$\Im$ & \verb+\Im+ & $\exists$ & \verb+\exists+ & $\clubsuit$ & \verb+\clubsuit+ \\
+$\mho$ & \verb+\mho+ & $\neg$ & \verb+\neg+ & $\diamondsuit$ & \verb+\diamondsuit+ \\
+$\prime$ & \verb+\prime+ & $\flat$ & \verb+\flat+ & $\heartsuit$ & \verb+\heartsuit+ \\
+$\emptyset$ & \verb+\emptyset+ & $\natural$ & \verb+\natural+ & $\spadesuit$ & \verb+\spadesuit+ \\
+\\
+\multicolumn{6}{l}{\em Trigonometric symbols} \\ \hline
+$\arccos$ & \verb+\arccos+ & $\dim$ & \verb+\dim+ & $\log$ & \verb+\log+ \\
+$\arcsin$ & \verb+\arcsin+ & $\exp$ & \verb+\exp+ & $\max$ & \verb+\max+ \\
+$\arctan$ & \verb+\arctan+ & $\gcd$ & \verb+\gcd+ & $\min$ & \verb+\min+ \\
+$\arg$ & \verb+\arg+ & $\hom$ & \verb+\hom+ & $\Pr$ & \verb+\Pr+ \\
+$\cos$ & \verb+\cos+ & $\inf$ & \verb+\inf+ & $\sec$ & \verb+\sec+ \\
+$\cosh$ & \verb+\cosh+ & $\ker$ & \verb+\ker+ & $\sin$ & \verb+\sin+ \\
+$\cot$ & \verb+\cot+ & $\lg$ & \verb+\lg+ & $\sinh$ & \verb+\sinh+ \\
+$\coth$ & \verb+\coth+ & $\lim$ & \verb+\lim+ & $\sup$ & \verb+\sup+ \\
+$\csc$ & \verb+\csc+ & $\liminf$ & \verb+\liminf+ & $\tan$ & \verb+\tan+ \\
+$\deg$ & \verb+\deg+ & $\limsup$ & \verb+\limsup+ & $\tanh$ & \verb+\tanh+ \\
+$\det$ & \verb+\det+ & $\ln$ & \verb+\ln+ \\
+\end{tabular}
+\newpage
+\begin{tabular}{llllll}
+\\
+\multicolumn{6}{l}{\em Variable-size symbols} \\ \hline
+$\sum$ & \verb+\sum+ & $\bigcap$ & \verb+\bigcap+ & $\bigodot$ & \verb+\bigodot+ \\
+$\prod$ & \verb+\prod+ & $\bigcup$ & \verb+\bigcup+ & $\bigotimes$ & \verb+\bigotimes+ \\
+$\coprod$ & \verb+\coprod+ & $\bigsqcup$ & \verb+\bigsqcup+ & $\bigoplus$ & \verb+\bigoplus+ \\
+$\int$ & \verb+\int+ & $\bigvee$ & \verb+\bigvee+ & $\biguplus$ & \verb+\biguplus+ \\
+$\oint$ & \verb+\oint+ & $\bigwedge$ & \verb+\bigwedge+ \\
+\\
+\multicolumn{6}{l}{\em Punctuation symbols\dag} \\ \hline
+\dag & \verb+\dag+ & \S & \verb+\S+ & \copyright & \verb+\copyright+ \\
+\ddag & \verb+\ddag+ & \P & \verb+\P+ & \pounds & \verb+\pounds+ \\
+?` & \verb+?`+ & !` & \verb+!`+ & \ldots & \verb+\ldots+ \\
+\end{tabular}
+
+\dag\ These symbols may not be used in math mode unless they are enclosed
+in an \verb+\mbox+.
+
diff --git a/gle-refman/primitives/cmds.tex b/gle-refman/primitives/cmds.tex
new file mode 100644
index 0000000..34a8386
--- /dev/null
+++ b/gle-refman/primitives/cmds.tex
@@ -0,0 +1,1178 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% GLE - Graphics Layout Engine <http://www.gle-graphics.org/> %
+% %
+% Modified BSD License %
+% %
+% Copyright (C) 2009 GLE. %
+% %
+% Redistribution and use in source and binary forms, with or without %
+% modification, are permitted provided that the following conditions %
+% are met: %
+% %
+% 1. Redistributions of source code must retain the above copyright %
+% notice, this list of conditions and the following disclaimer. %
+% %
+% 2. Redistributions in binary form must reproduce the above %
+% copyright notice, this list of conditions and the following %
+% disclaimer in the documentation and/or other materials provided with %
+% the distribution. %
+% %
+% 3. The name of the author may not be used to endorse or promote %
+% products derived from this software without specific prior written %
+% permission. %
+% %
+% THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR %
+% IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED %
+% WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE %
+% ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY %
+% DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL %
+% DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE %
+% GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS %
+% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER %
+% IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR %
+% OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN %
+% IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\chapter{Primitives}
+\label{prim:chap}
+
+A GLE command is a sequence of keywords and values separated by white space
+(one or more spaces or tabs). Each command must begin on a new line. Keywords
+may not be abbreviated, the case is not significant. All coordinates are
+expressed in centimeters from the bottom left corner of the page.
+
+GLE uses the concept of a {\bf current point} which most commands use.
+For example, the command {\sf aline 2 3} will draw a line from the
+{\bf current point} to the coordinates (2,3).
+
+The current graphics state also includes other settings like
+line width, colour, font, 2d transformation matrix. All of these
+can be set with various GLE commands.
+
+\section{Graphics Primitives (a summary)}
+{\sf ! {\it comment}} \\
+{\sf @{\it xxx}} \\
+{\sf abound {\it x y}} \\
+{\sf aline {\it x y} [arrow start] [arrow end] [arrow both] [curve {\it $\alpha1$} {\it $\alpha2$} {\it d1} {\it d2}]} \\
+{\sf amove {\it x y}} \\
+{\sf arc {\it radius a1 a2 [arrow end] [arrow start] [arrow both]}} \\
+{\sf arcto {\it x1 y1 x2 y2 rad}} \\
+{\sf begin box [fill {\it pattern}] [add {\it gap}] [nobox] [name {\it xyz}] [round {\it val}]} \\
+{\sf begin clip } \\
+{\sf begin length {\it var}} \\
+{\sf begin name {\it name}} \\
+{\sf begin object {\it name}} \\
+{\sf begin origin} \\
+{\sf begin path [stroke] [fill {\it pattern}] [clip]} \\
+{\sf begin rotate {\it angle}} \\
+{\sf begin scale {\it x y}} \\
+{\sf begin table } \\
+{\sf begin tex } \\
+{\sf begin text [width {\it exp}] } \\
+{\sf begin translate {\it x y}} \\
+{\sf bezier {\it x1 y1 x2 y2 x3 y3}} \\
+{\sf bitmap {\it filename width height} [type {\it type}]} \\
+{\sf bitmap\_info {\it filename width height} [type {\it type}]} \\
+{\sf box {\it x y} [justify {\it jtype}] [fill {\it color}] [name {\it xxx}] [nobox] [round {\it val}]} \\
+{\sf circle {\it radius} [fill {\it pattern}]} \\
+{\sf closepath } \\
+{\sf colormap {\it fct} {\it xmin} {\it xmax} {\it ymin} {\it ymax} {\it pixels-x} {\it pixels-y} {\it width} {\it height} [color] [palette {\it pal}]} \\
+{\sf curve {\it ix iy }[{\it x1 y1 x y x y ... xn yn}]{\it ex ey }} \\
+{\sf define marker {\it markername subroutine-name}} \\
+{\sf draw {\it name.point [{\it arg1} ... {\it argn}] [name {\it name}]}} \\
+{\sf ellipse dx dy [options]} \\
+{\sf elliptical\_arc dx dy theta1 theta2 [options]} \\
+{\sf for {\it var} = {\it exp1} to {\it exp2} [step {\it exp3}] {\it command [...]} next {\it var}} \\
+{\sf grestore} \\
+{\sf gsave} \\
+{\sf if {\it exp} then {\it command [...]} else {\it command [...]} end if} \\
+{\sf include {\it filename}} \\
+{\sf join {\it object1.just sep object2.just} [curve {\it $\alpha1$} {\it $\alpha2$} {\it d1} {\it d2}]} \\
+{\sf local {\it var}$_1$, $\ldots$, {\it var}$_n$} \\
+{\sf margins {\it top} {\it bottom} {\it left} {\it right}} \\
+{\sf marker {\it marker-name} [{\it scale-factor}]} \\
+{\sf orientation {\it o}} \\
+{\sf papersize {\it size}} \\
+{\sf postscript {\it filename.eps width-exp height-exp}} \\
+{\sf print {\it string\$} $\ldots$} \\
+{\sf psbbtweak} \\
+{\sf pscomment} {\it exp} \\
+{\sf rbezier {\it x1 y1 x2 y2 x3 y3}} \\
+{\sf return} {\it exp} \\
+{\sf reverse } \\
+{\sf rline {\it x y} [arrow end] [arrow start] [arrow both] [curve {\it $\alpha1$} {\it $\alpha2$} {\it d1} {\it d2}]} \\
+{\sf rmove {\it x y}} \\
+{\sf save {\it objectname}} \\
+{\sf set alabeldist {\it d}} \\
+{\sf set alabelscale {\it s}} \\
+{\sf set arrowangle {\sf angle}} \\
+{\sf set arrowsize {\sf size}} \\
+{\sf set arrowstyle {\sf simple | filled | empty}} \\
+{\sf set atitledist {\it s}} \\
+{\sf set atitlescale {\it s}} \\
+{\sf set background {it c}} \\
+{\sf set cap {\sf butt | round | square}} \\
+{\sf set color {\it col}} \\
+{\sf set dashlen {\it dashlen-exp}} \\
+{\sf set fill {\it fill color/pattern}} \\
+{\sf set font {\it font-name}} \\
+{\sf set fontlwidth {\it line-width}} \\
+{\sf set hei {\it character-size}} \\
+{\sf set join {\sf mitre | round | bevel }} \\
+{\sf set just left $|$ center $|$ right $|$ tl $|$ etc...} \\
+{\sf set lstyle {\it line-style}} \\
+{\sf set lwidth {\it line-width}} \\
+{\sf set pattern {\it fill pattern}} \\
+{\sf set texscale {\it scale} $|$ {\it fixed} $|$ {\it none}} \\
+{\sf set titlescale {\it s}} \\
+{\sf set ticksscale {\it s}} \\
+{\sf size {\it w} {\it h}} \\
+{\sf sub {\it sub-name parameter1 parameter2 etc}} \\
+{\sf tex {\it string} [name {\it xxx}] [add {\it val}]} \\
+{\sf text {\it unquoted-text-string}} \\
+{\sf write {\it string\$} $\ldots$}
+
+\section{Graphics Primitives (in detail)}
+\begin{commanddescription}
+
+\item[{\sf ! {\it comment}}]\index{comment}\index{"!}
+Indicates the start of a comment. GLE ignores everything from the exclamation point to the end of the line. This works both in GLE scripts and in data files used in, e.g., graph blocks.
+
+\item[{\sf @{\it xxx}}] Executes subroutine {\it xxx}.
+\index{"@}
+
+\item[{\sf abound {\it x y}}]
+\index{abound}
+Update the current bounding box to include the point $(x,y)$ without drawing anything. This command is useful in combination with `begin box', `begin name', etc., e.g., to add empty space to the box.
+
+\item[{\sf aline {\it x y} [arrow start] [arrow end] [arrow both] [curve {\it $\alpha1$} {\it $\alpha2$} {\it d1} {\it d2}]}]
+\index{aline} \index{arrow} Draws a line from
+the current point to the absolute coordinates
+{\it (x,y)}, which then becomes the new current point. The arrow qualifiers
+are optional, they draw arrows at the start or end of the line, the size of
+the arrow is proportional to the current font height.
+
+If the curve option is given, then a Bezier curve\index{Bezier curve}\index{curve} is drawn instead of a line. The first control point is located at a distance $d1$ and angle $\alpha1$ from the current point and the second control point is located at distance $d2$ and angle $\alpha2$ from {\it (x,y)}.
+
+\item[{\sf amove {\it x y}}]
+\index{amove} Changes the current point to the absolute coordinates
+{\it (x,y)}.
+
+\item[{\sf arc {\it radius a1 a2 [arrow end] [arrow start] [arrow both]}}]
+\index{arc}\index{narc} Draws an arc of a circle in the anti-clockwise direction, centered
+at the current point, of radius {\it radius},
+starting at angle {\it a1} and finishing at angle {\it a2}. Angles
+are specified in degrees. Zero degrees is at three o'clock and Ninety
+degrees is at twelve o'clock.
+
+\preglecode{}
+\begin{Verbatim}
+ arc 1.2 20 45
+\end{Verbatim}
+\postglecode{}
+
+The command {\sf narc} is identical but draws the arc in the clockwise
+direction. This is important when constructing a path.
+
+\begin{minipage}[c]{8cm}
+\begin{Verbatim}
+amove 0.5 0.5
+rline 1 0.5 arrow end
+set lwidth 0.1
+arc 1 10 160
+arc 0.5 -90 0
+\end{Verbatim}
+\end{minipage}
+\hfill
+\begin{minipage}[c]{7cm}
+\mbox{\includegraphics{primitives/fig/gc_arc}}
+\end{minipage}
+
+\item[{\sf arcto {\it x1 y1 x2 y2 rad}}]
+\index{arcto} Draws a line from the current point to {\it (x1,y1)} then to
+{\it (x2,y2)} but fits an arc of radius {\it rad} joining the two
+vectors instead of a vertex at the point {\it (x1,y1)}.
+
+\begin{minipage}[c]{8cm}
+\begin{Verbatim}
+amove 1.5 .5
+rline 1 0
+set lwidth .1
+arcto 2 0 -1 1 .5
+set lwidth 0
+rline -1 1
+\end{Verbatim}
+\end{minipage}
+\hfill
+\begin{minipage}[c]{7cm}
+\mbox{\includegraphics{primitives/fig/gc_arcto}}
+\end{minipage}
+
+\item[{\sf begin {\it block\_name} ... {\it end block\_name}}]
+There are several block structured commands in GLE. Each
+{\sf begin} must have a matching {\sf end}. Blocks which change the
+current graphics state (e.g. scale, rotate, clip etc) will restore
+whatever they change at the end of the block. Indentation is optional
+but should be used to make the GLE program easier to read.
+
+\item[{\sf begin box [fill {\it pattern}] [add {\it gap}] [nobox] [name {\it xyz}] [round {\it val}]} ]
+\index{add}
+\index{begin!box}
+\index{nobox}
+\index{name (box)}
+\label{cmd:beginbox}
+Draws a box around everything between {\sf begin box} and {\sf end box}.
+The option {\sf add} adds a margin of {\sf margin} cm to each side of the box to make the
+box slightly larger than the area defined by the graphics primitives in the
+{\sf begin box} \ldots {\sf end box} group (to leave a gap around text for
+example). The option {\sf nobox} stops the box outline from being drawn.
+
+The {\sf name} option saves the coordinates of the box for later use
+with among others the {\sf join} command.
+
+If the {\sf round} option is used, a box with rounded corners will be drawn.
+
+\begin{minipage}[c]{8cm}
+\begin{Verbatim}
+begin box add 0.2
+ begin box fill gray10 add 0.2 round .3
+ text John
+ end box
+end box
+\end{Verbatim}
+\end{minipage}
+\hfill
+\begin{minipage}[c]{7cm}
+\mbox{\includegraphics{primitives/fig/gc_beginbox}}
+\end{minipage}
+
+\item[{\sf begin clip }]
+\index{clip}
+\index{begin!clip}
+This saves the current clipping region.
+A clipping region is an arbitrary path made from lines and curves
+which defines the area on which drawing can occur.
+This is used to undo the
+effect of a clipping region defined with the begin path command.
+See the example CLIP.GLE in appendix B at the end of the manual.
+
+\item[{\sf begin length {\it var}}]
+\index{length}
+\index{begin!length}
+
+This block computes the total length of all the elements that are included in it and saves the result in the variable ``{\it var}''. See Fig.~\ref{beginlen:fig} for an example.
+
+\begin{figure}[tb]
+\centering
+\mbox{\input{primitives/fig/curve_length.inc}}
+\caption{\label{beginlen:fig}Compute the total length of a shape.}
+\end{figure}
+
+\item[{\sf begin name {\it name}}]
+\index{begin!name}\label{cmd:beginname}
+
+Saves the coordinates of what is inside the block for later use with among others the {\sf join} command. This command is equivalent to `{\sf begin box name} $\ldots$ {\sf nobox}'.
+
+\item[{\sf begin object {\it name} [{\it arg1}, \ldots, {\it argn}]}]
+\index{begin!object}\label{cmd:beginobject}
+
+Declares a new object (sub-figure) that can be drawn later with the `{\sf draw}' command. Section~\ref{sec:objblocks} explains in detail how this command works and how it can be used.
+
+Object blocks can have arguments if they are not defined inside a subroutine. Such object blocks are called `static objects'; they behave similar to subroutines. Object blocks can also be defined inside a subroutine. In that case, they are called `dynamic objects' and cannot have arguments. They may, however, refer to all arguments and local variables of the surrounding subroutine.
+
+\item[{\sf begin origin}]
+\index{amove (origin)}
+\index{begin!origin} This makes the current point the origin.
+This is good for subroutines or something which has been drawn
+using {\sf amove,aline}. Everything between the {\sf begin origin} and
+{\sf end origin} can be moved as one unit. The current point is also
+saved and restored.
+
+\item[{\sf begin path [stroke] [fill {\it pattern}] [clip]} ]
+\index{begin!path} \index{path} \index{end path} \index{stroke}
+Initialises the drawing of a filled shape. All the lines and curves generated
+until the next {\sf end path} command will be stored and then used to draw the
+shape. {\sf stroke} draws the outline of the shape, {\sf fill} paints the
+inside of the shape in the given colour and {\sf clip} defines the shape
+as a clipping region for all future drawing. Clipping and filling
+will only work on PostScript devices.
+
+\item[{\sf begin rotate {\it angle}}]
+\index{rotate}
+\index{angle}
+\index{begin!rotate} The coordinate system is rotated anti-clockwise about the current point by
+the angle {\it angle} (in degrees). For example, to draw a line of text running
+vertically up the page (as a Y axis label, say), type:
+
+\begin{minipage}[c]{8cm}
+\begin{Verbatim}
+begin rotate 90
+ text This is
+end rotate
+\end{Verbatim}
+\end{minipage}
+\hfill
+\begin{minipage}[c]{7cm}
+\mbox{\includegraphics{primitives/fig/gc_rot1}}
+\end{minipage}
+
+\item[{\sf begin scale {\it x y}}]
+\index{scale}
+\index{begin!scale} Everything between the {\sf begin} and {\sf end} is scaled
+by the factors x and y. E.g., {\it scale 2 3} would make
+the picture twice as wide and three times higher.
+
+\begin{minipage}[c]{8cm}
+\begin{Verbatim}
+begin scale 3 1
+ begin rotate 30
+ text This is
+ end rotate
+end scale
+\end{Verbatim}
+\end{minipage}
+\hfill
+\begin{minipage}[c]{7cm}
+\mbox{\includegraphics{primitives/fig/gc_rot2}}
+\end{minipage}
+
+\pagebreak[2]
+
+\item[{\sf begin table }]
+\index{table} \index{begin!table} This module is an alternative
+to the TEXT module. It reads
+the spaces and tabs in the source file and aligns the words
+accordingly. A single space between two words
+is treated as a real space, not an alignment space.
+
+With a proportionally spaced font columns will line
+up on the left hand side but not on the right hand side.
+However with a fixed pitch font, like {\sf tt},
+everything will line up.
+
+\begin{minipage}[c]{8cm}
+\begin{Verbatim}
+begin table
+ Here is my table
+ of text see how
+ 22 44 55 33
+ 0.1 999 1 .2
+ 3 33 2 33
+ it lines up
+end table
+\end{Verbatim}
+\end{minipage}
+\hfill
+\begin{minipage}[c]{7cm}
+\mbox{\includegraphics{primitives/fig/gc_table}}
+\end{minipage}
+
+\item[{\sf begin text [width {\it exp}] } ]
+\index{text (width)}
+\index{text (begin)}
+\index{justify (text)}
+\index{begin!text} This module displays multiple lines/paragraphs of text.
+The block of text is justified according to the current justify setting.
+See the {\sf set just} command for a description of justification settings.
+
+If a width is specified the text is wrapped and justified
+to the given width. If a width is not given, each line of text
+is drawn as it appears in the file. Remember that GLE treats
+text in the same way that \LaTeX \ does, so multiple spaces are ignored
+and some characters have special meaning. E.g, \verb#\ ^ _ & { }#
+
+\index{Greek characters}
+To include Greek characters in the middle of text use a
+backslash followed by the name of the character.
+E.g., \verb+ 3.3\Omega S+ would produce ``3.3$\Omega$S''.
+
+To put a space between the Omega and the S add a
+backslash space at the end. E.g., \verb+ 3.3\Omega\ S+
+produces ``3.3$\Omega$ S''
+
+Sometimes the space control characters (e.g. \verb+\:+)
+are also ignored, this may
+happen at the beginning of a line of text. In this case use the
+control sequence \verb+\glass+ which will trick GLE into
+thinking it isn't at the beginning of a line. E.g.,
+
+\preglecode{}
+\begin{Verbatim}
+ text \glass \:\: Indented text
+\end{Verbatim}
+\postglecode{}
+
+\begin{minipage}[c]{8cm}
+\begin{Verbatim}
+set hei 0.25 just tl font tt
+begin text width 5
+ This is my paragraph of text to see
+ if it wraps things at four cm as I have
+ told it to do.
+end text
+...
+begin text
+ Now some text
+ without a width
+ specified
+end text
+\end{Verbatim}
+\end{minipage}
+\hfill
+\begin{minipage}[c]{7cm}
+\mbox{\includegraphics{primitives/fig/gc_text}}
+\end{minipage}
+
+\index{char} \index{chardef} \index{def}
+\index{movexy} \index{setfont} \index{sethei}
+\index{baselineskip} \index{setstretch} \index{lineskip}
+\index{mathchar} \index{mathchardef} \index{mathcode}
+\index{TeX} \index{\LaTeX} There are several \LaTeX \ like commands which can be used within text. The complete list can be found in Appendix \ref{ltxsym:sec}. A few examples are:
+
+\begin{Verbatim}
+\ \' \v \u \= \^ \. \H \~ \'' Implemented TeX accents
+^{} _{} Superscript, subscript
+\\ \_ Forced Newline, underscore character
+\, \: \; 0.5em, 1em, 2em space (em = width of the letter `m')
+\tex{expression} Any LaTeX expression
+\char{22} Any character in current font
+\glass Makes move/space work on beginning of line
+\rule{2}{4} Draws a filled in box, 2cm by 4cm
+\setfont{rmb} Sets the current text font
+\sethei{0.3} Sets the font height (in cm)
+\setstretch{2} Scales the quantity of glue between words
+\lineskip{0.1} Sets the default distance between lines of text
+\linegap{-1} Sets the minimum required gap between lines
+{\rm ...}, {\it ...} Sets roman, and italic font
+{\bf ...}, {\tt ...} Sets bold, and typewriter (monospaced) font
+\alpha, \beta, ... Greek symbols
+\end{Verbatim}
+
+\item[{\sf begin translate {\it x y}}]
+\index{translate}
+\index{begin!translate} Everything between the {\sf begin} and {\sf end} is moved
+x units to the right and y units up.
+
+\item[{\sf bezier {\it x1 y1 x2 y2 x3 y3}}]
+\index{bezier}
+Draws a B\'{e}zier cubic section from the current point to the point
+{\it (x3,y3)} with B\'{e}zier cubic control points at the coordinates
+{\it (x1,y1)} and {\it (x2,y2)}. For a full explanation of B\'{e}zier curves
+see the PostScript Language Reference Manual.
+
+% \item[{\sf bigfile {\it filename.gle}}]
+% \index{bigfile} \index{include (bigfile)}
+% This command reads the file one line at a time, compiles each line and executes it. This means it can read any sized file. However, complex multi-line commands cannot be used. Subroutines can be used but not defined, inside the bigfile. Note: there is also a bigfile option in the graphing module for large datasets.
+
+\item[{\sf bitmap {\it filename width height} [type {\it type}]}]
+\index{bitmap}
+
+Imports the bitmap \textit{filename}. The bitmap is scaled to \textit{width}$\times$\textit{height}. If one of these is zero, it is computed based on the other one and the aspect ratio of the bitmap. GLE supports TIFF, JPEG, PNG and GIF bitmaps (depending on the compilation options).
+
+Bitmaps are compressed automatically by GLE using either the LZW or the JPEG compression scheme.
+
+\item[{\sf bitmap\_info {\it filename width height} [type {\it type}]}]
+\index{bitmap\_info}
+
+Returns the dimensions in pixels of the bitmap in the output parameters \textit{width} and \textit{height}.
+
+
+\item[{\sf box {\it x y} [justify {\it jtype}] [fill {\it color}] [name {\it xxx}] [nobox] [round {\it val}]} ]
+\index{box}
+\index{nobox}
+\index{justify (box)}
+\index{name (box)}
+Draws a box, of width {\it x} and height {\it y}, with its bottom left corner
+at the current point. If the justify option is used, the box will
+be positioned relative to the specified point. E.g., TL = top left,
+CC = center center, BL = bottom left, CENTER = bottom center,
+RIGHT = bottom right, LEFT = bottom left. See {\sf set just} for a description
+of justification settings.
+
+If a fill pattern is specified, the box will be filled.
+Remember that white fill is different from no fill pattern - white fill will
+erase anything that was inside the box.
+
+If the {\sf round} option is used, a box with rounded corners will be drawn.
+
+\item[{\sf circle {\it radius} [fill {\it pattern}]} ]
+\index{circle} \index{radius} Draws a circle at the current point,
+with radius {\it radius}. If a fill
+pattern is specified the circle will be filled.
+
+\item[{\sf closepath }]
+\index{closepath}
+\index{aline (closepath)}
+Joins the beginning of a line to the end of a line. I.e., it does an {\sf aline}
+to the end of the last {\sf amove}.
+
+\item[{\sf colormap {\it fct} {\it xmin} {\it xmax} {\it ymin} {\it ymax} {\it pixels-x} {\it pixels-y} {\it width} {\it height} [color] [palette {\it pal}]}]
+\index{colormap!command}
+
+Draws a colormap of the function {\it fct}$(x,y)$, in which $x$ ranges from {\it xmin} to {\it xmax}, and $y$ ranges from {\it ymin} to {\it ymax}. The size of the colormap is {\it width} by {\it height} centimeter and the resolution is {\it pixels-x} by {\it pixels-y} pixels. A colormap is grayscale by default; it is drawn in color if the option {\it color} is given. In the latter case, it is possible to specify a palette subroutine {\it pal} mapping the range $0 \ldots 1$ to a range of [...]
+
+\item[{\sf curve {\it ix iy }[{\it x1 y1 x y x y ... xn yn}]{\it ex ey }} ]
+\index{curve} Draws a curve starting at the current point and passing through the points
+{\it (x1,y1)} \ldots {\it (xn,yn)}, with an initial slope of {\it (ix,iy)} to
+{\it (x1,y1)} and a final slope of {\it (ex,ey)}. All the vectors are
+relative movements from the vector before.
+
+\begin{minipage}[c]{8cm}
+\begin{Verbatim}
+amove 1 1
+curve 1 0 0 1 1 0 0 -1 1 0
+amove 3.6 1
+curve 0 1 0 1 1 0 0 -1 0 -1
+\end{Verbatim}
+\end{minipage}
+\hfill
+\begin{minipage}[c]{7cm}
+\mbox{\includegraphics{primitives/fig/gc_curve}}
+\end{minipage}
+
+\item[{\sf define marker {\it markername subroutine-name}}]
+\index{define marker}
+This defines a new marker called {\it markername} which will call
+the subroutine {\it subroutine-name} whenever it is used. It
+passes two parameters, the first is the requested size of the
+marker and the second is a value from a secondary dataset which
+can be used to vary size or rotation of a marker for each point plotted.
+
+To define a character from the postscript ZapDingbats font as a marker you
+would use, e.g.
+
+\begin{Verbatim}
+sub subnamex size mdata
+ gsave ! save font and x,y
+ set just left font pszd hei size
+ t$ = "\char{102}"
+ rmove -twidth(t$)/2 -theight(t$)/2 ! centers marker
+ write t$
+ grestore ! restores font and x,y
+end sub
+\end{Verbatim}
+
+The second parameter can be supplied using the {\it mdata} command
+when drawing a graph, this gives the marker subroutine a
+value from another dataset to use to draw the marker. For
+example the marker could vary in size, or angle, with every
+one plotted.
+
+\begin{Verbatim}
+d3 marker myname mdata d4
+\end{Verbatim}
+
+\item[{\sf define {\it markername fontname scale dx dy}}]
+This command defines a new marker, from any font, it is
+automatically centered but can be adjusted using dx,dy. e.g.
+
+\begin{Verbatim}
+defmarker hand pszd 43 1 0 0
+\end{Verbatim}
+
+\item[{\sf draw {\it name.point [{\it arg1} ... {\it argn}] [name {\it name}]}}]
+\label{cmd:draw}
+
+Draws a named object block that has been previously defined using a ``begin/end object'' (p.~\pageref{cmd:beginobject}) construct. The object is drawn such that the point indicated by the first argument of the draw command appears at the current position. The point can be any (hierarchically) named point on the object and may include the justify options defined for the join command (p.~\pageref{cmd:join}).
+
+If the object block has parameters (similar to a subroutine) then these parameters can be given as {\it arg1} \ldots {\it argn}.
+
+The ``draw'' command names the object using the same name as the name of the object block by default. An alternative name can be supplied using its ``name'' option.
+
+See Sec.~\ref{sec:objblocks} for a detailed explanation of this command with examples.
+
+\item[{\sf ellipse} {\it dx dy [options]}]
+\index{ellipse}
+
+This command draws an ellipse with the diameters {\it dx} and {\it dy} in the $x$ and $y$ directions, respectively. The {\it options} are the same as the {\sf circle} command.
+
+\item[{\sf elliptical\_arc} {\it dx dy theta1 theta2 [options]}]
+\index{elliptical\_arc}\index{elliptical\_narc}
+
+This command is similar to the {\sf arc} command except that it draws an elliptical arc in the clockwise direction with the diameters {\it dx} and {\it dy} in the $x$ and $y$ directions, respectively. {\it theta1} and {\it theta2} are the start and stop angle, respectively. The {\it options} are the same as for the {\sf arc} command.
+
+The command {\sf elliptical\_narc} is identical but draws the arc in the clockwise direction. This is important when constructing a path.
+
+\item[{\sf for {\it var} = {\it exp1} to {\it exp2} [step {\it exp3}] {\it command [...]} next {\it var}} ]
+\index{for} \index{next} \index{step}
+The {\sf for ... next} structure lets you repeat a block of statements
+a number of times.
+
+GLE sets {\sf var} equal to {\it exp1} and then repeats the following
+steps.
+
+\begin{itemize}
+\item If {\sf var} is greater than {\it exp2} then GLE commands are skipped
+until the line after the {\sf next} statement.
+\item The value {\it exp3} is added to {\sf var}.
+\item The statements between the {\sf for} and {\sf next} statement are executed.
+\end{itemize}
+
+If {\it exp1} is greater than {\it exp2} then the loop is not executed.
+
+\begin{minipage}[c]{8cm}
+\begin{Verbatim}
+for x = 1 to 4 step 0.5
+ amove x 1
+ aline 5-x 2
+next x
+\end{Verbatim}
+\end{minipage}
+\hfill
+\begin{minipage}[c]{7cm}
+\mbox{\includegraphics{primitives/fig/gc_for}}
+\end{minipage}
+
+\item[{\sf grestore}]
+\index{grestore} Restores the most recently saved graphics state. This is the simplest way to
+restore complicated transformations such as rotations and translations. It
+must be paired with a previous {\sf gsave} command.
+
+\item[{\sf gsave}]
+\index{gsave} Saves the current graphics transformation matrix and the current point
+and the current colour, font etc.
+
+\item[{\sf if {\it expression} then {\it command [...]} else {\it command [...]} end if}]
+\index{if}\index{else}\index{then}\index{end if}
+If {\it expression} evaluates to true, then execution continues with the
+statements up to the corresponding {\sf else}, otherwise the statements
+following the {\sf else} and up to the corresponding {\sf end if} are executed.
+
+\preglecode{}
+\begin{Verbatim}
+ amove 3 3
+ if xpos()=3 then
+ text We are at x=3
+ else
+ text We are elsewhere
+ end if
+\end{Verbatim}
+\postglecode{}
+
+Note: {\sf end if} is not spelt {\sf endif}.
+
+\item[{\sf include {\it filename}}]\label{incl:cmnd}
+\index{include} Includes the GLE script ``filename'' into the current script. This is useful for including library scripts with subroutines. GLE searches a number of predefined directories for include files. By default, this includes the current directory and the ``lib'' or ``gleinc'' subdirectory of the root directory (GLE\_TOP) of your GLE installation. The latter includes a number of subroutine files that are distributed with GLE (Table~\ref{inc:tab}). Additional include directories c [...]
+
+\begin{table}[t]
+\centering
+\caption{\label{inc:tab}Include files distributed with GLE.}
+\begin{tabular}{ll} \hline
+barstyles.gle & Defines additional styles for bar plots.\\
+color.gle & Defines functions for working with colors.\\
+colors-gle-4.0.12.gle & Redefines all colors defined in GLE 4.0.12 and before.\\
+contour.gle & Subroutines for drawing contour plots\\
+electronics.gle & Subroutines for drawing electrical circuits\\
+ellipse.gle & Draw text in an ellipse\\
+feyn.gle & Subroutines for drawing Feynmann diagrams\\
+graphutil.gle & Subroutines for drawing graphs\\
+piesub.gle & Pie chart routines\\
+polarplot.gle & Polar plotting routines\\
+shape.gle & Drawing various shapes\\
+simpletree.gle & Draw simple trees\\
+stm.gle & Add labels to images\\
+ziptext.gle & Draw zipped text\\ \hline
+\end{tabular}
+\end{table}
+
+% With a large include file GLE may run out of memory. If this happens, use the {\sf bigfile} command instead of {\sf include}. Note: there is also a bigfile option in the graphing module.
+
+\item[{\sf join {\it object1.just sep object2.just} [curve {\it $\alpha1$} {\it $\alpha2$} {\it d1} {\it d2}]}]
+\index{name (join)}\index{join}\label{cmd:join}
+Draws a line between two named objects. An object is simply a point or a box which was given a name when it was drawn.
+
+\index{justify (join)}
+The justify qualifiers are the standard GLE justification abbreviations: \verb#.br# (bottom right), \verb#.bl# (bottom left), \verb#.bc# (bottom centre), \verb#.tr# (top right), \verb#.tc# (top centre), \verb#.tl# (top left), \verb#.cr# (centre right), \verb#.cc# (centre centre), and \verb#.cl# (centre left). In addition, \verb#.v# and \verb#.h# can be used to draw vertical or horizontal lines connecting to the object, \verb#.c# for drawing a line connecting to e circle or ellipse, and \ [...]
+
+If {\it sep} is written as {\sf -}, a line is drawn between the named objects e.g.
+
+\begin{Verbatim}
+ join fred.tr - mary.tl
+\end{Verbatim}
+
+Arrow heads can be included at both ends of the line by writing {\it sep} as \verb#<->#. Single arrow heads are produced by \verb#<-# and \verb#->#. Note that {\it sep} must be separated from object1.just and object2.just by white space.
+
+If the justification qualifiers are omitted, a line will be drawn between the centers of the two objects (clipped at the edges of the rectangles which define the objects). This is the same as using the \verb#.box# qualifier on both objects.
+
+The {\sf curve} option is explained with the {\sf aline} command. Fig.~\ref{joicur:fig} shows an example where the ``join'' command is used with the curve option.
+
+Sec.~\ref{join:sec} contains several examples of joining objects.
+
+\item[{\sf local {\it var}$_1$, $\ldots$, {\it var}$_n$}]
+\index{local}
+
+Defines a local variable inside a subroutine. It is possible to initialize the variable to a particular value with, e.g., `\texttt{local x = 3}', which defines the local variable `x' and assigns it the value 3. You can also define several local variables at once, e.g., `\texttt{local x, y}' defines the local variables `x' and `y'.
+
+\item[{\sf margins {\it top} {\it bottom} {\it left} {\it right}}]
+
+This command can be used to define the page margins. Margins are only relevant for making full-page figures (using the -fullpage command line option). See also the ``papersize'' command.
+
+\index{scale (marker)}
+\item[{\sf marker {\it marker-name} [{\it scale-factor}]} ]
+\index{wmarker} \index{marker} Draws marker {\it marker-name} at the current point. The size of the marker
+is proportional to the current font size, scaled by the value of
+{\it scale-factor} if present. Markers are referred to by name, eg.
+{\sf square}, {\sf diamond}, {\sf triangle} and {\sf fcircle}. Markers
+beginning with the letter {\sf f} are usually filled variants. Markers
+beginning with {\sf w} are filled with white so lines are not visible
+through the marker. For a complete
+list of markers refer to Fig.~\ref{mark:fig}.
+
+\begin{Verbatim}
+set just lc
+amove 0.5 2.5
+marker diamond 1
+rmove 0.6 0; text Diamond
+amove 0.5 2
+marker triangle 1
+rmove 0.6 0; text Triangle
+...
+\end{Verbatim}
+
+\item[{\sf orientation {\it o}}]\index{orientation}\label{orient:cmd}
+
+Sets the orientation of the output in full-page mode. Possible values are ``portrait'' and ``landscape''. Fig.~\ref{fullpage:fig} illustrates these two cases.
+
+\begin{figure}[tb]
+\centering
+\mbox{\input{primitives/fig/gc_marker.inc}}
+\caption{\label{mark:fig}All markers supported by GLE. (The names that start with ``w'' are white filled.)}
+\end{figure}
+
+\item[{\sf papersize {\it size}}]\index{papersize}\label{papsiz:cmd}
+\item[{\sf papersize {\it width} {\it height}}]
+
+Sets the paper size of the output. This is used only when GLE is run with the option ``-fullpage'' or when the PostScript output device is used (i.e., ``-d ps''). The command either takes one argument, which should be one of the predefined paper size names or two numbers, which give the width and height of the output measured in cm. The following paper sizes are known by GLE: a0paper, a1paper, a2paper, a3paper, a4paper, and letterpaper.
+
+If a ``size'' command is given in the script, then the output is drawn centered on the page. If no size command is included in the script, then the output will appear relative to the bottom-left corner of the page, offset by the page margins (see ``margins'' command). Fig.~\ref{fullpage:fig} illustrates these two cases.
+
+The paper size can also be set in GLE's configuration file (Sec.~\ref{conffile:sec}).
+
+\begin{figure}[tb]
+\centering
+\mbox{\input{primitives/fig/fullpage.inc}}
+\caption{\label{fullpage:fig}Result of different combinations of the commands ``papersize'', ``margins'', ``size'', and ``orientation'' for fullpage graphics (gle -fullpage figure.gle).}
+\end{figure}
+
+\item[{\sf postscript {\it filename.eps width-exp height-exp}} ]
+\index{postscript} Includes an encapsulated postscript file into a
+GLE picture, the postscript picture will be scaled up or down to fit
+the width given. On the screen you will just see a rectangle.
+
+Only the {\it width-exp} is used to scale the picture so that the
+aspect ratio is maintained. The
+height is only used to display a rectangle of the right size on the screen.
+
+\item[{\sf print {\it string\$} $\ldots$}]
+\index{print} This command prints its argument to the console (terminal).
+
+\item[{\sf psbbtweak}]
+\index{psbbtweak}
+
+Changes the default behavior of the bounding box. The default behavior is to have the lower corner at (-1,-1), which for some interpreters (i.e., Photoshop) will leave a black line around the bottom and left borders. If this command is specified then the origin of the bounding box will be set to (0,0).
+
+This command must appear before the first {\sf size} command in the GLE file.
+
+\begin{figure}
+\centering
+\mbox{\input{primitives/fig/curve.inc}}
+\caption{\label{joicur:fig}Different ways of joining objects.}
+\end{figure}
+
+\item[{\sf pscomment} {\it exp}]
+\index{pscomment}
+
+Allows inclusion of {\it exp} as a comment in the preamble of the postscript file. Multiple {\sf pscomment} commands are allowed.
+
+This command must appear before the first {\sf size} command in the GLE file.
+
+\item[{\sf rbezier {\it x1 y1 x2 y2 x3 y3}}]
+\index{bezier (rbezier)} \index{rbezier}
+This command is identical to the BEZIER command except that the points are
+all relative to the current point.
+
+\begin{minipage}[c]{8cm}
+\begin{Verbatim}
+amove 0.5 2.8
+rbezier 1 1 2 -1 3 1
+amove 0.2 0.2
+rbezier 1 1 2 1.2 1.8 0
+\end{Verbatim}
+\end{minipage}
+\hfill
+\begin{minipage}[c]{7cm}
+\mbox{\includegraphics{primitives/fig/gc_bezier}}
+\end{minipage}
+
+\item[{\sf return} {\it exp}]
+\index{return}
+The {\sf return} command is used inside subroutines to return a value.
+
+\item[{\sf reverse }]
+\index{reverse}
+Reverses the direction of the current path. This is used when filling
+multiple paths in order that the Non-Zero Winding Rule will know which
+part of the path is `inside'.
+
+With the Non-Zero Winding Rule an imaginary line is drawn through the
+object. Every time a line of the object crosses it from left to
+right, one is added to the counter; every time a line of the object
+crosses it from right to left, one is subtracted from the counter. Everywhere
+the counter is non-zero is considered to be the `inside' of the drawing and
+is filled.
+
+% \graphin{gc_nonzero.eps}{12.0cm}{3.0cm}{1.0}
+\psgraphin{primitives/fig/gc_nonzero}{12.0}{3.0}{\sf reverse}
+
+\item[{\sf rline {\it x y} [arrow end] [arrow start] [arrow both] [curve {\it $\alpha1$} {\it $\alpha2$} {\it d1} {\it d2}]}]
+\index{rline}
+\index{arrow}
+Draws a line from the current point to the relative coordinates {\it (x,y)},
+which then become the new current point. If the current point is (5,5) then
+{\sf rline 3 -2} is equivalent to {\sf aline 8 3}. The optional
+qualifiers on the end of the command will draw arrows at one or both
+ends of the line, the size of the arrow head is proportional to the current
+font size.
+
+The {\sf curve} option is explained with the {\sf aline} command.
+
+\item[{\sf rmove {\it x y}}]
+\index{rmove} Changes the current point to the relative coordinate
+{\it (x,y)}. If the
+current point is (5,5) then {\sf rmove 3 -2} is equivalent to {\sf amove 8 3}.
+
+\item[{\sf save {\it objectname}} ]
+\index{save}
+\index{name (point)}
+This command saves a point for later use with the join command.
+
+\item[{\sf set alabeldist {\it d}}]
+\index{alabeldist}
+
+The spacing between the graph axis labels and the axis is set to {\it d}.
+
+\item[{\sf set alabelscale {\it s}}]
+\index{alabelscale}
+
+The graph axis label font size is set to `\texttt{alabelscale}' times `\texttt{hei}'.
+
+\item[{\sf set arrowangle {\sf angle}}]
+\index{arrowangle}
+
+Sets the opening angle of the arrow tips. (Actually, half of the opening angle.)
+
+\item[{\sf set arrowsize {\sf size}}]
+\index{arrowsize}
+
+Sets the length of the arrow tips in centimeter.
+
+\item[{\sf set arrowstyle {\sf simple | filled | empty}}]
+\index{arrowstyle}
+
+Sets the style of the arrow tips. There are three pre-defined styles: simple, filled, and empty (See Fig.~\ref{arrsty:fig}).
+
+It is also possible to create user-defined arrow tip styles. To do so, create a subroutine `{\sf arrow\_xxxx langle aangle asize}', with {\sf xxxx} the name of the new style. The parameter {\sf langle} is the angle of the line on which the arrow tip is to be drawn and the parameters {\sf aangle} and {\sf asize} are the current values of the settings {\sf arrowangle} and {\sf arrowsize}. The user-defined style can be enabled, in the same way as the built-in ones, with `{\sf set arrowstyle [...]
+
+\begin{Verbatim}
+sub arrow_circle langle aangle asize
+ circle 0.1 fill red
+end sub
+\end{Verbatim}
+
+\noindent{}More complex examples of user-defined arrow styles can be found in the GLE example repository.
+
+\begin{figure}
+\centering
+\includegraphics{primitives/fig/gc_arrstyle}
+\caption{\label{arrsty:fig}Different arrow tip styles.}
+\end{figure}
+
+\item[{\sf set atitledist {\it s}}]
+\index{atitledist}
+
+The spacing between the graph axis title and the axis labels is set to {\it d}.
+
+\item[{\sf set atitlescale {\it s}}]
+\index{atitlescale}
+
+The graph axis title font size is set to `\texttt{atitlescale}' times `\texttt{hei}'.
+
+\item[{\sf set background {it c}}]
+
+Set the background color for a pattern fill to $c$. (See `set fill'.) Note that ``set background'' must come after ``set fill'' because ``set fill'' resets the background color to the specified color.
+
+\item[{\sf set cap {\sf butt | round | square}}]
+\index{round (cap)}
+\index{cap}
+Defines what happens at the end of a wide line.
+
+\psgraphin{primitives/fig/gc_cap}{12.0}{3.0}{\sf set cap}
+
+\item[{\sf set color {\it col}}]
+\label{scol:cmd}
+\index{color}
+\index{rgb()}
+\index{rgb255()}
+Sets the current colour for all future drawing operations. GLE supports all SVG/X11 standard color names. These are listed in Appendix~\ref{colors:sec}, and include the following: black, white, red, green, blue, cyan, magenta, yellow, gray10, gray20, $\ldots$, gray90. It is also possible to specify a gray scale as a real number with 0.0 = black and 1.0 = white. Colors can also be set using the HTML notation, e.g., \#FF0000 = red. Finally, the functions rgb(red,green,blue) and rgb255(red, [...]
+
+\begin{figure}
+\centering
+\mbox{\input{primitives/fig/setcolor.inc}}
+\caption{\label{colex:fig}Examples of setting the drawing color.}
+\end{figure}
+
+\vspace{0.25cm}
+\begin{minipage}[c]{8cm}
+\begin{Verbatim}
+mm$ = "blue"
+amove 0.5 0.5
+for c = 0 to 1 step 0.05
+ box 0.2 2 fill (c) nobox
+ rmove 0.2 0
+next c
+amove 2 1
+box 2 1 fill white nobox
+rmove -0.2 0.2
+box 2 1 fill mm$
+\end{Verbatim}
+\end{minipage}
+\hfill
+\begin{minipage}[c]{7cm}
+\mbox{\includegraphics{primitives/fig/gc_color}}
+\end{minipage}
+
+\item[{\sf set dashlen {\it dashlen-exp}}]
+\index{dashlen}
+Sets the length of the smallest dash used for the line styles.
+This command MUST come before the {\sf set lstyle} command.
+This may be needed when scaling a drawing by a large factor.
+
+\begin{figure}
+\centering
+\mbox{\input{primitives/fig/grids.inc}}
+\caption{\label{filpat:fig}Patterns for painting shapes.}
+\end{figure}
+
+\item[{\sf set fill {\it fill color/pattern}}]
+\index{fill}
+Sets the color or pattern for filling shapes. This command works in combination with shapes such as circles, ellipses, and boxes. If the argument is a color, then shapes are filled with the given color (see ``set color''). If it is a pattern, then the shapes are painted with the given pattern in black ink. Fig.~\ref{filpat:fig} lists a number of pre-defined patterns. To paint a shape in a color different from black, first set the color, then the pattern. That is,
+
+\begin{Verbatim}
+set fill red
+set pattern shade
+set background yellow
+box 2 2
+\end{Verbatim}
+
+\noindent{}will draw a box and paint is using the shade pattern and red ink on a yellow background. To draw shapes that are not filled, use the command ``set fill clear''. That is,
+
+\begin{Verbatim}
+set fill clear
+box 2 2
+\end{Verbatim}
+
+\noindent{}will draw an empty box.
+
+\item[{\sf set font {\it font-name}}]
+\index{font}
+\index{font}
+Sets the current font to {\it font-name}. Valid {\it font-name}s are listed
+in Appendix A.2.
+
+There are three types of font: PostScript, \LaTeX \ and
+Plotter. They will all work on any device, however \LaTeX \ fonts are
+drawn in outline on a plotter, and so may not look very nice.
+PostScript fonts will be emulated by \LaTeX \ fonts on non-PostScript
+printers.
+
+\item[{\sf set fontlwidth {\it line-width}}]
+\index{font (line width)} \index{fontlwidth} \index{fontlwidth}
+This sets the width of lines to be used to draw the stroked (Plotter fonts)
+on a PostScript printer. This has a great effect on their appearance.
+
+\begin{minipage}[c]{8cm}
+\begin{Verbatim}
+set font pltr
+amove .2 .2
+text Tester
+set fontlwidth .1
+set cap round
+rmove 0 1.5
+text Tester
+\end{Verbatim}
+\end{minipage}
+\hfill
+\begin{minipage}[c]{7cm}
+\mbox{\includegraphics{primitives/fig/gc_fontlwidth}}
+\end{minipage}
+
+\item[{\sf set hei {\it character-size}}]
+\label{shei:cmd}
+\index{hei}
+\index{character size}
+Sets the height of text. For historical reasons, concerning lead type and printing conventions, a height of 10cm actually results in capital letters about 6.5cm tall.
+
+The default value of ``hei'' is 0.3633 (to mimic the default height of \LaTeX{} expressions).
+
+\item[{\sf set join {\sf mitre | round | bevel }}]
+\index{round (join)}
+\index{join}
+\index{join (set join)}
+\index{bevel}
+\index{round}
+\index{mitre}
+Defines how two wide lines will be joined together. With {\sf mitre}, the
+outside edges of the join are extended to a point and then chopped
+off at a certain distance from the intersection of the two lines.
+With {\bf round}, a curve is drawn between the outside edges.
+
+%%\graphin{gc_ljoin.eps}{12.0cm}{3.0cm}{1.0}
+\psgraphin{primitives/fig/gc_ljoin}{12.0}{3.0}{\sf set join}
+
+\item[{\sf set just left $|$ center $|$ right $|$ tl $|$ etc...} ]
+\label{sjust:cmd}
+\index{just}
+\index{justify (set)}
+
+Sets the justification which will be used for {\sf text} commands.
+
+\begin{minipage}[c]{8cm}
+\begin{Verbatim}
+amove 0.5 3
+set just left
+box 1.5 0.6
+text Justify left
+rmove 2 0
+set just bl
+box 1.5 0.6
+text Justify bl
+\end{Verbatim}
+\end{minipage}
+\hfill
+\begin{minipage}[c]{7cm}
+\mbox{\includegraphics{primitives/fig/gc_justify}}
+\end{minipage}
+
+\item[{\sf set lstyle {\it line-style}}]
+\label{lstyle:cmd}
+\index{lstyle (set)}
+\index{lstyle}
+Sets the current line style to line style number {\sf line-style}. There are
+9 predefined line styles (1--9). When a line style is given with more than
+one digit the first digit is read as a run length in black,
+the second a run length in white, the third a run length in black, etc.
+
+\begin{minipage}[c]{8cm}
+\begin{Verbatim}
+set just left
+for z = 0 to 4
+ set lstyle z
+ rline 2 0
+ rmove 0.1 0
+ write z
+ rmove -2.1 -0.4
+next z
+\end{Verbatim}
+\end{minipage}
+\hfill
+\begin{minipage}[c]{7cm}
+\mbox{\includegraphics{primitives/fig/gc_lstyle}}
+\end{minipage}
+
+\item[{\sf set lwidth {\it line-width}}]
+\index{lwidth}
+Sets the width of lines to {\it line-width} cm. A value of zero will result in
+the device default of about 0.02 cm, so a lwidth of .0001 gives
+a thinner line than an lwidth of 0.
+
+\item[{\sf set pattern {\it fill pattern}}]
+\index{pattern}
+Specifies the filling pattern. A number of pre-defined patterns is listed in Fig.~\ref{filpat:fig}. See the description of ``set fill'' for more information. Note that ``set pattern'' must come after ``set fill'' because ``set fill'' resets the pattern to solid.
+
+\item[{\sf set texscale {\it scale} $|$ {\it fixed} $|$ {\it none}}]
+\index{texscale}
+This setting controls the scaling of \LaTeX{} expressions (Sec.~\ref{latexexp:sec}): `\texttt{scale}' scales them to the value of `\texttt{hei}', `\texttt{fixed}' scales them to the closest \LaTeX{} default size to `\texttt{hei}', and `\texttt{none}' does not scale them. With `\texttt{none}', the font size in your graphics will be exactly the same as in your main document.
+
+\item[{\sf set titlescale {\it s}}]
+\index{titlescale}
+
+The graph title font size is set to `\texttt{titlescale}' times `\texttt{hei}'.
+
+\item[{\sf set ticksscale {\it s}}]
+\index{ticksscale}
+
+The size of the graph axis ticks is set to `\texttt{ticksscale}' times `\texttt{hei}'.
+
+\item[{\sf size {\it w} {\it h}}]
+
+Sets the size of GLE's output to {\it w} centimeter wide by {\it h} centimeter tall.
+
+This command usually appears at the top of a GLE script. That is, only commands that do not generate output can precede the `size' command. For example, the `include' command, subroutine definitions, and assignments to variables can appear before the `size' command. Commands like `aline', on the other hand, should appear after the `size' command.
+
+It is possible to omit the size command. In that case, the size of the output is determined by the `pagesize' command (see Fig.~\ref{fullpage:fig}).
+
+\item[{\sf sub {\it sub-name parameter1 parameter2 etc.}}]
+\index{sub} Defines a subroutine. The end of the subroutine
+is denoted with {\sf end sub}. Subroutines must
+be defined before they are used.
+
+Subroutines can be called inside any GLE expression, and can
+also return values. The parameters of a subroutine become local variables.
+Subroutines are re-entrant.
+
+\begin{Verbatim}
+ sub tree x y a$
+ amove x y
+ rline 0 1
+ write a$
+ return x/y
+ end sub
+
+ tree 2 4 "mytree" (Normal call to subroutine)
+ slope = tree(2,4,"mytree") (Using subroutine in an expression)
+\end{Verbatim}
+
+\item[{\sf tex {\it string} [name {\it xxx}] [add {\it val}]}]
+\index{tex}
+Draw a \LaTeX{} expression at the current point using the current value of `justify'. See Sec.~\ref{latexexp:sec} for more information. Using the {\sf name} option, the \LaTeX{} expression can be named, just like a box. The size of the virtual named box can be increased with the {\sf add} option.
+
+\item[{\sf text {\it unquoted-text-string}}]
+\index{begin!text (single line)} \index{text} This is the simplest command for drawing text. The current point
+is unmodified after the text is drawn so following one text command
+with another will result in the second line of text being drawn on
+top of the first.
+To generate multiple lines of text, use the {\sf begin text} \ldots {\sf end
+text} construct.
+
+\preglecode{}
+\begin{Verbatim}
+ text "Hi, how's tricks", said Jack!
+\end{Verbatim}
+\postglecode{}
+
+\item[{\sf write {\it string\$} $\ldots$}]
+\index{write} This command is similar to {\sf text} except that it expects a quoted string,
+string variable, or string expression as a parameter. If write has more than one parameter, it will concatenate the values of all the parameters.
+
+\begin{minipage}[c]{8cm}
+\begin{Verbatim}
+a$ = "Hello there "
+xx = sqrt(10)
+t$ = time$()
+c$ = a$+t$
+write a$+t$ xx
+\end{Verbatim}
+\end{minipage}
+\hfill
+\begin{minipage}[c]{7cm}
+\mbox{\includegraphics{primitives/fig/gc_write}}
+\end{minipage}
+
+The built in functions {\sf sqrt()} and {\sf time\$()} are described in
+Appendix~\ref{fct:sec}.
+
+\end{commanddescription}
+
diff --git a/gle-refman/primitives/fig/Makefile.gcc b/gle-refman/primitives/fig/Makefile.gcc
new file mode 100644
index 0000000..ddc10bc
--- /dev/null
+++ b/gle-refman/primitives/fig/Makefile.gcc
@@ -0,0 +1,60 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+EPSS = gc_arc.pdf gc_arcto.pdf gc_beginbox.pdf gc_bezier.pdf gc_cap.pdf gc_color.pdf \
+ gc_curve.pdf gc_fontlwidth.pdf gc_for.pdf gc_justify.pdf gc_ljoin.pdf gc_lstyle.pdf \
+ gc_marker.inc gc_nonzero.pdf gc_rot1.pdf gc_rot2.pdf gc_table.pdf gc_text.pdf \
+ gc_write.pdf gc_xend.pdf grids.inc setcolor.inc curve.inc fullpage.inc gc_arrstyle.pdf \
+ curve_length.inc
+
+ifeq ($(RUNBUILD),1)
+ GLE = ../../../build/bin/gle
+else
+ GLE = gle
+endif
+
+all: $(EPSS)
+
+%.inc: %.gle
+ $(GLE) -texincprefix primitives/fig/ -inc -d pdf $<
+
+%.pdf: %.gle
+ $(GLE) -d pdf $<
+
+clean:
+ rm -rf *.pdf *.pdf *.inc .gle
diff --git a/gle-refman/primitives/fig/Makefile.os2 b/gle-refman/primitives/fig/Makefile.os2
new file mode 100644
index 0000000..e493fb8
--- /dev/null
+++ b/gle-refman/primitives/fig/Makefile.os2
@@ -0,0 +1,50 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+EPSS = gc_arc.eps gc_arcto.eps gc_beginbox.eps gc_bezier.eps gc_cap.eps gc_color.eps \
+ gc_curve.eps gc_fontlwidth.eps gc_for.eps gc_justify.eps gc_ljoin.eps gc_lstyle.eps \
+ gc_marker.eps gc_nonzero.eps gc_rot1.eps gc_rot2.eps gc_table.eps gc_text.eps \
+ gc_write.eps gc_xend.eps
+
+all: $(EPSS)
+
+%.eps: %.gle
+ gle -d eps $<
+
+clean:
+ rm -rf *.eps *.pdf *.inc
diff --git a/gle-refman/primitives/fig/curve.gle b/gle-refman/primitives/fig/curve.gle
new file mode 100644
index 0000000..ee416db
--- /dev/null
+++ b/gle-refman/primitives/fig/curve.gle
@@ -0,0 +1,177 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 11 4
+
+include "../../script/manual.gle"
+manual_graph_mode
+
+sub pmove d a
+ amove xpos()+d*cos(torad(a)) ypos()+d*sin(torad(a))
+end sub
+
+sub dist a$ b$
+ return sqrt((ptx(a$)-ptx(b$))^2 + (pty(a$)-pty(b$))^2)
+end sub
+
+begin object curve
+ set just lc
+ amove 0.2 1.5
+ begin box add 0.1 round 0.1 name b1
+ tex "GLE"
+ end box
+
+ set just bl
+ amove 2 0.1
+
+ begin box add 0.1 round 0.1 name b2
+ tex "test.gle"
+ end box
+
+ join b1.rc -> b2.tc curve 0 90 1.2 1
+end object
+
+amove 0 pageheight()
+draw curve.tl
+
+set just tl
+amove 0 pty(curve.bc)-0.2
+gsave
+set hei 0.3
+tex "\texttt{join b1.rc -> b2.tc curve 0 90 1.2 1}"
+grestore
+
+r = 0.35; hi = 0.2; d = 1.2
+set just cc
+
+begin object joint
+ begin name c
+ amove 0 0
+ tex "$c$"
+ ellipse r hi
+ end name
+
+ begin name a
+ pmove d 100
+ tex "$a$"
+ ellipse r hi
+ end name
+
+ begin name b
+ pmove d 220
+ tex "$b$"
+ ellipse r hi
+ end name
+
+ join a.c -> b.c
+ join a.c -> c.c
+ join b.c -> c.c
+end object
+
+amove pagewidth() pageheight()
+draw joint.tr
+
+set just tr
+amove pagewidth() pty(curve.bc)-0.2
+gsave
+set hei 0.3
+tex "\texttt{join a.c -> b.c}"
+grestore
+
+begin object hvjoin
+ box 0.3 0.3 name b1
+ rmove 2 0
+ box 1 1 name b2
+ join b1.rc -> b2.h
+end object
+
+amove 0 pty(curve.bc)-0.8
+draw hvjoin.tl
+
+set just tl
+amove 0 pty(hvjoin.bc)-0.2
+gsave
+set hei 0.3
+tex "\texttt{join b1.rc -> b2.h}"
+grestore
+
+begin object join_ci_box
+ set just cc
+ begin name a
+ amove 0 0
+ tex "$a$"
+ ellipse r hi
+ end name
+
+ pmove 1.5 160
+ begin box add 0.2 name b
+ tex "$b$"
+ end box
+
+ join a.c -> b.box
+end object
+
+amove pagewidth() pty(curve.bc)-0.8
+draw join_ci_box.tr
+
+set just tr
+amove pagewidth() pty(join_ci_box.bc)-0.2
+gsave
+set hei 0.3
+tex "\texttt{join a.c -> b.box}"
+grestore
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/gle-refman/primitives/fig/curve_length.gle b/gle-refman/primitives/fig/curve_length.gle
new file mode 100644
index 0000000..414b87c
--- /dev/null
+++ b/gle-refman/primitives/fig/curve_length.gle
@@ -0,0 +1,63 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 13 4
+
+include "../../script/manual.gle"
+manual_graph_mode
+
+begin length len
+ amove 0.8 1.4
+ curve 20 0 0 2 10 0 0 -2 -10 0 0 9
+end length
+
+amove 9.5 0.25
+tex "Length = "+format$(len, "fix 2")+" cm"
+
+amove 2.8 2.3
+begin tex
+ \begin{tabular}{l}
+ begin length len\\
+ \mbox{}\hspace{0.5cm}amove 0.8 1.4\\
+ \mbox{}\hspace{0.5cm}curve 20 0 0 2 10 0 0 -2 -10 0 0 9\\
+ end length\\
+ write ``Length = ''+format\$(len, "fix 2")+`` cm''\\
+ \end{tabular}
+end tex
+
+
diff --git a/gle-refman/primitives/fig/fullpage.gle b/gle-refman/primitives/fig/fullpage.gle
new file mode 100644
index 0000000..5b09359
--- /dev/null
+++ b/gle-refman/primitives/fig/fullpage.gle
@@ -0,0 +1,170 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 15 6
+
+include "../../script/manual.gle"
+manual_graph_mode
+
+include "shape.gle"
+
+sc = 0.13; dx = 3.75
+
+pagew = 21.0; pageh = 29.7
+
+!papersize a4paper
+!orientation landscape
+!margins 2 2 2 2
+!size 10 10
+
+sub measure_hb x0 x1 y0 del str$
+ amove x0 y0
+ rline 0 -del
+ amove x1 y0
+ rline 0 -del
+ amove x0 y0-0.75*del
+ aline x1 y0-0.75*del arrow both
+ set just tc
+ amove (x0+x1)/2 y0-del
+ tex str$
+end sub
+
+sub measure_vl y0 y1 x0 del str$
+ amove x0 y0
+ rline del 0
+ amove x0 y1
+ rline del 0
+ amove x0+0.75*del y0
+ aline x0+0.75*del y1 arrow both
+ set just tc
+ amove x0+del (y0+y1)/2
+ begin rotate 90
+ tex str$
+ end rotate
+end sub
+
+!include "../../script/manual.gle"
+!manual_std_mode
+
+sub draw_page pw ph
+ xp = xpos(); yp = ypos()
+ box pw*sc ph*sc
+ measure_hb xp xp+pw*sc yp 0.3 num$(pw)+" cm"
+ measure_vl yp yp+ph*sc xp+pw*sc 0.3 num$(ph)+" cm"
+ amove xp yp
+end sub
+
+sub content pw ph ang
+ xp = xpos(); yp = ypos()
+ box pw*sc ph*sc fill gray20
+ rmove pw/2*sc ph/2*sc
+ gsave
+ set fill lightsalmon
+ draw big_arrow_both_angle.cc pw/2*sc ph/2*sc ang
+ grestore
+ measure_hb xp xp+pw*sc yp 0.3 num$(pw)+" cm"
+ measure_vl yp yp+ph*sc xp+pw*sc 0.3 num$(ph)+" cm"
+end sub
+
+sub content_m pw ph ang
+ xp = xpos(); yp = ypos()
+ box pw*sc ph*sc fill gray20
+ rmove pw/2*sc ph/2*sc
+ gsave
+ set fill lightsalmon
+ draw big_arrow_both_angle.cc pw/2*sc ph/2*sc ang
+ grestore
+end sub
+
+amove 0.25 0.7
+draw_page pagew pageh
+rmove sc*(pagew/2-5) sc*(pageh/2-5)
+content 10 10 0
+
+amove 0.25+dx 0.7
+draw_page pagew pageh
+rmove sc*(pagew/2-5) sc*(pageh/2-5)
+content 10 10 90
+
+w1 = pagew-4
+h1 = pageh-4
+
+amove 0.25+2*dx 0.7
+draw_page pagew pageh
+rmove sc*2 sc*2
+content_m w1 h1 0
+
+amove 0.25+3*dx 0.7
+draw_page pagew pageh
+rmove sc*2 sc*2
+content_m w1 h1 90
+
+set just tl
+amove 0.05 pageheight()-0.05
+begin tex
+\begin{tabular}{l}
+papersize a4paper\\
+size 10 10 \\
+\end{tabular}
+end tex
+
+amove 0.05+dx pageheight()-0.05
+begin tex
+\begin{tabular}{l}
+papersize a4paper\\
+orientation landscape\\
+size 10 10 \\
+\end{tabular}
+end tex
+
+amove 0.05+2*dx pageheight()-0.05
+begin tex
+\begin{tabular}{l}
+papersize a4paper\\
+margins 2 2 2 2\\
+\end{tabular}
+end tex
+
+amove 0.05+3*dx pageheight()-0.05
+begin tex
+\begin{tabular}{l}
+papersize a4paper\\
+orientation landscape\\
+margins 2 2 2 2\\
+\end{tabular}
+end tex
diff --git a/gle-refman/primitives/fig/gc_arc.gle b/gle-refman/primitives/fig/gc_arc.gle
new file mode 100644
index 0000000..3fe57b1
--- /dev/null
+++ b/gle-refman/primitives/fig/gc_arc.gle
@@ -0,0 +1,48 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 7 3
+
+box 6 3
+begin origin
+ amove 0.5 0.5
+ rline 1 0.5 arrow end
+ set lwidth 0.1
+ arc 1 10 160
+ arc 0.5 -90 0
+end origin
diff --git a/gle-refman/primitives/fig/gc_arcto.gle b/gle-refman/primitives/fig/gc_arcto.gle
new file mode 100644
index 0000000..be366b0
--- /dev/null
+++ b/gle-refman/primitives/fig/gc_arcto.gle
@@ -0,0 +1,49 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 7 3
+
+box 6 3
+begin origin
+ amove 1.5 .5
+ rline 1 0
+ set lwidth .1
+ arcto 2 0 -1 1 .5
+ set lwidth 0
+ rline -1 1
+end origin
diff --git a/gle-refman/primitives/fig/gc_arrstyle.gle b/gle-refman/primitives/fig/gc_arrstyle.gle
new file mode 100644
index 0000000..667b307
--- /dev/null
+++ b/gle-refman/primitives/fig/gc_arrstyle.gle
@@ -0,0 +1,82 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 7.5 2.25
+
+set arrowsize 0.9 arrowangle 15
+
+sub arrow_circle langle aangle asize
+ circle 0.1 fill red
+end sub
+
+set color blue lstyle 2
+amove 3 0
+aline 3 2.25
+amove 7 0
+aline 7 2.25
+set lstyle 1 lwidth 0.07 color black
+
+set arrowstyle simple
+amove 0.25 1.5
+aline 3 1.5 arrow end
+
+set arrowstyle empty
+amove 0.25 0.5
+aline 3 0.5 arrow end
+
+set arrowstyle filled
+amove 4.25 1.5
+aline 7 1.5 arrow end
+
+set arrowstyle circle
+amove 4.25 0.5
+aline 7 0.5 arrow end
+
+set font texcmr just left
+
+amove 0.75 1.7
+write "simple"
+
+amove 0.75 0.7
+write "empty"
+
+amove 4.75 1.7
+write "filled"
+
+amove 4.75 0.7
+write "circle"
diff --git a/gle-refman/primitives/fig/gc_beginbox.gle b/gle-refman/primitives/fig/gc_beginbox.gle
new file mode 100644
index 0000000..c2875e2
--- /dev/null
+++ b/gle-refman/primitives/fig/gc_beginbox.gle
@@ -0,0 +1,50 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 7 3
+set hei 0.8
+box 6 3!5 3
+begin origin
+ amove 1 1
+ begin box add .2
+ begin box fill gray10 add .2 round .3
+ text John
+ end box
+ end box
+end origin
+
diff --git a/gle-refman/primitives/fig/gc_bezier.gle b/gle-refman/primitives/fig/gc_bezier.gle
new file mode 100644
index 0000000..43a9401
--- /dev/null
+++ b/gle-refman/primitives/fig/gc_bezier.gle
@@ -0,0 +1,57 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 7 4
+
+box 4 4
+begin origin
+ set lstyle 2 lwidth .0001
+ amove .2 .2
+ rline 1 1
+ rline 1 .2
+ rline -.2 -1.2
+ amove .5 2.8
+ rline 1 1
+ rline 1 -2
+ rline 1 2
+ set lstyle 1 lwidth 0
+ amove .2 .2
+ rbezier 1 1 2 1.2 1.8 0
+ amove .5 2.8
+ rbezier 1 1 2 -1 3 1
+end origin
diff --git a/gle-refman/primitives/fig/gc_cap.gle b/gle-refman/primitives/fig/gc_cap.gle
new file mode 100644
index 0000000..0813799
--- /dev/null
+++ b/gle-refman/primitives/fig/gc_cap.gle
@@ -0,0 +1,59 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 12 3 box
+scale 3/4 3/4
+set hei .4
+amove 1 .5
+box 4 3
+set lwidth .5
+set cap butt
+amove 1 3
+rline 4 0
+rmove .5 -.1
+text set cap butt
+set cap round
+amove 1 2
+rline 4 0
+rmove .5 -.1
+text set cap round
+set cap square
+amove 1 1
+rline 4 0
+rmove .5 -.1
+text set cap square
diff --git a/gle-refman/primitives/fig/gc_color.gle b/gle-refman/primitives/fig/gc_color.gle
new file mode 100644
index 0000000..205e62d
--- /dev/null
+++ b/gle-refman/primitives/fig/gc_color.gle
@@ -0,0 +1,53 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 7 3
+
+box 5 3
+begin origin
+ mm$ = "blue"
+ amove .5 .5
+ for c = 0 to 1 step .05
+ box .2 2 fill (c) nobox
+ rmove .2 0
+ next c
+ amove 2 1
+ box 2 1 fill white nobox
+ rmove -.2 .2
+ box 2 1 fill mm$
+end origin
diff --git a/gle-refman/primitives/fig/gc_curve.gle b/gle-refman/primitives/fig/gc_curve.gle
new file mode 100644
index 0000000..e67c126
--- /dev/null
+++ b/gle-refman/primitives/fig/gc_curve.gle
@@ -0,0 +1,62 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 7 3
+box 5 3
+begin origin
+ amove 1 1
+ set lwidth .09
+ curve 1 0 0 1 1 0 0 -1 1 0
+ set lwidth 0
+ amove 0 1
+ rline 1 0
+ rline 0 1
+ rline 1 0
+ rline 0 -1
+ rline 1 0
+ amove 3.6 1
+ set lwidth .09
+ curve 0 1 0 1 1 0 0 -1 0 -1
+ set lwidth 0
+ amove 3.6 0
+ rline 0 1
+ rline 0 1
+ rline 1 0
+ rline 0 -1
+ rline 0 -1
+end origin
diff --git a/gle-refman/primitives/fig/gc_fontlwidth.gle b/gle-refman/primitives/fig/gc_fontlwidth.gle
new file mode 100644
index 0000000..8bc59aa
--- /dev/null
+++ b/gle-refman/primitives/fig/gc_fontlwidth.gle
@@ -0,0 +1,52 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 7 3
+
+box 6 3
+if font("pltr") then
+ set hei 1.5
+ begin origin
+ set font pltr
+ amove .2 .2
+ text Tester
+ set fontlwidth .1 cap round
+ rmove 0 1.5
+ text Tester
+ end origin
+end if
diff --git a/gle-refman/primitives/fig/gc_for.gle b/gle-refman/primitives/fig/gc_for.gle
new file mode 100644
index 0000000..060ee31
--- /dev/null
+++ b/gle-refman/primitives/fig/gc_for.gle
@@ -0,0 +1,48 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 7 3
+
+box 5 3
+begin origin
+ for xx = 1 to 4 step .5
+ amove xx 1
+ aline 5-xx 2
+ next xx
+end origin
+
diff --git a/gle-refman/primitives/fig/gc_justify.gle b/gle-refman/primitives/fig/gc_justify.gle
new file mode 100644
index 0000000..8c5bbd6
--- /dev/null
+++ b/gle-refman/primitives/fig/gc_justify.gle
@@ -0,0 +1,82 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 7 4
+
+box 6 4 !5 4
+begin origin
+ set hei .3
+ amove .5 .5
+ box 2 2
+ set lwidth .0001
+ rmove 1 0
+ rline 0 2
+ rmove -1 -1
+ rline 2 0
+ set lwidth 0
+ amove .6 .6
+ set just bl
+ text bl
+ rmove 1 0
+ text bc
+ rmove 1 0
+ text br
+ rmove -2 1
+ text lc
+ rmove 1 0
+ text cc
+ rmove 1 0
+ text rc
+ rmove -2 1
+ text tl
+ rmove 1 0
+ text tc
+ rmove 1 0
+ text tr
+
+
+ set hei .4 just center font rm
+ amove .5 3
+ set just left
+ box 2 .6 !1.5 .6
+ text Justify left
+ rmove 3 0 !2 0
+ set just bl
+ box 2 .6 !1.5 .6
+ text Justify bl
+end origin
diff --git a/gle-refman/primitives/fig/gc_ljoin.gle b/gle-refman/primitives/fig/gc_ljoin.gle
new file mode 100644
index 0000000..c9eb067
--- /dev/null
+++ b/gle-refman/primitives/fig/gc_ljoin.gle
@@ -0,0 +1,61 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 12 3 box
+set hei .3
+set lwidth .4
+set join mitre
+amove 3 2.5
+rline -2 -1
+rline 2 -1
+rmove -1 1
+text join mitre
+
+set join round
+amove 6 2.5
+rline -2 -1
+rline 2 -1
+rmove -1 1
+text join round
+
+set join bevel
+amove 9 2.5
+rline -2 -1
+rline 2 -1
+rmove -1 1
+text join bevel
diff --git a/gle-refman/primitives/fig/gc_lstyle.gle b/gle-refman/primitives/fig/gc_lstyle.gle
new file mode 100644
index 0000000..dc93b1f
--- /dev/null
+++ b/gle-refman/primitives/fig/gc_lstyle.gle
@@ -0,0 +1,67 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 7 3
+
+box 6 3
+begin origin
+ set hei .3 just left font rm
+ amove .5 2.5
+ for z = 0 to 4
+ set lstyle z
+ rline 2 0
+ rmove .1 0
+ write z
+ rmove -2.1 -.4
+ next z
+
+ amove 3.5 2.5
+ for z = 5 to 9
+ set lstyle z
+ rline 2 0
+ rmove .1 0
+ write z
+ rmove -2.1 -.4
+ next z
+
+ amove .5 .2
+ set lstyle 9229
+ rline 3 0
+ rmove .1 0
+ text 9229
+end origin
diff --git a/gle-refman/primitives/fig/gc_marker.gle b/gle-refman/primitives/fig/gc_marker.gle
new file mode 100644
index 0000000..169f2cf
--- /dev/null
+++ b/gle-refman/primitives/fig/gc_marker.gle
@@ -0,0 +1,103 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 12.5 5
+
+include "../../script/manual.gle"
+manual_graph_mode
+
+x0 = 0.25
+y0 = pageheight()-0.25
+
+xp = x0; yp = y0
+set just lc
+
+sub showmarker name$
+ amove xp yp
+ gsave
+ set hei 0.5
+ marker name$
+ grestore
+ amove xp+0.3 yp
+ tex name$
+ yp = yp -0.6
+ if yp-0.3 < 0 then
+ yp = y0; xp = xp+2.5
+ end if
+end sub
+
+showmarker "triangle"
+showmarker "wtriangle"
+showmarker "ftriangle"
+showmarker "square"
+showmarker "wsquare"
+showmarker "fsquare"
+showmarker "circle"
+showmarker "wcircle"
+showmarker "fcircle"
+showmarker "diamond"
+showmarker "wdiamond"
+showmarker "fdiamond"
+showmarker "cross"
+showmarker "plus"
+showmarker "minus"
+showmarker "asterisk"
+showmarker "odot"
+showmarker "ominus"
+showmarker "oplus"
+showmarker "otimes"
+showmarker "star"
+showmarker "star2"
+showmarker "star3"
+showmarker "star4"
+showmarker "flower"
+showmarker "club"
+showmarker "heart"
+showmarker "spade"
+showmarker "dag"
+showmarker "ddag"
+showmarker "snake"
+showmarker "dot"
+showmarker "handpen"
+showmarker "letter"
+showmarker "phone"
+showmarker "plane"
+showmarker "scircle"
+showmarker "ssquare"
+showmarker "trianglez"
+showmarker "diamondz"
diff --git a/gle-refman/primitives/fig/gc_nonzero.gle b/gle-refman/primitives/fig/gc_nonzero.gle
new file mode 100644
index 0000000..2257fb6
--- /dev/null
+++ b/gle-refman/primitives/fig/gc_nonzero.gle
@@ -0,0 +1,133 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 12 3 box
+scale .5 .5
+amove 9 9
+set just left hei .7
+set hei 1.2
+set lwidth .1
+
+gsave
+translate -2 -13.5
+begin path fill gray10
+amove 5 19
+aline 5 14
+aline 11 14
+aline 11 19
+closepath
+amove 6 18
+aline 10 18
+aline 10 15
+aline 6 15
+closepath
+end path
+
+amove 5 19
+aline 5 14 arrow end
+aline 11 14 arrow end
+aline 11 19 arrow end
+aline 5 19 arrow end
+amove 6 18
+aline 10 18 arrow end
+aline 10 15 arrow end
+aline 6 15 arrow end
+aline 6 18 arrow end
+
+
+amove 3 16
+aline 13 16 arrow end
+set hei .7 just center
+amove 4 16.5
+text 0
+amove 5.5 16.5
+text 1
+amove 7 16.5
+text 0
+amove 10.5 16.5
+text 1
+amove 12 16.5
+text 0
+grestore
+
+! second one
+
+translate 9 -5.5
+
+begin path fill gray10
+amove 5 11
+aline 5 6
+aline 11 6
+aline 11 11
+aline 5 11
+amove 6 10
+aline 6 7
+aline 10 7
+aline 10 10
+aline 6 10
+end path
+
+amove 5 11
+aline 5 6 arrow end
+aline 11 6 arrow end
+aline 11 11 arrow end
+aline 5 11 arrow end
+amove 6 10
+aline 6 7 arrow end
+aline 10 7 arrow end
+aline 10 10 arrow end
+aline 6 10 arrow end
+
+set lwidth 0
+amove 3 8
+aline 13 8 arrow end
+
+set hei .7 just center
+amove 4 8.5
+text 0
+amove 5.5 8.5
+text 1
+amove 7 8.5
+text 2
+amove 10.5 8.5
+text 1
+amove 12 8.5
+text 0
+
+
+
diff --git a/gle-refman/primitives/fig/gc_rot1.gle b/gle-refman/primitives/fig/gc_rot1.gle
new file mode 100644
index 0000000..4418a64
--- /dev/null
+++ b/gle-refman/primitives/fig/gc_rot1.gle
@@ -0,0 +1,49 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 7 3
+
+set hei 0.4
+box 6 3
+begin origin
+ amove 1 1
+ begin rotate 90
+ text This is
+ end rotate
+end origin
+
diff --git a/gle-refman/primitives/fig/gc_rot2.gle b/gle-refman/primitives/fig/gc_rot2.gle
new file mode 100644
index 0000000..fe56e80
--- /dev/null
+++ b/gle-refman/primitives/fig/gc_rot2.gle
@@ -0,0 +1,51 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 7 3
+
+set hei 0.25
+box 6 3
+begin origin
+ amove 1 1
+ begin scale 3 1
+ begin rotate 30
+ text This is
+ end rotate
+ end scale
+end origin
+
diff --git a/gle-refman/primitives/fig/gc_table.gle b/gle-refman/primitives/fig/gc_table.gle
new file mode 100644
index 0000000..849d020
--- /dev/null
+++ b/gle-refman/primitives/fig/gc_table.gle
@@ -0,0 +1,54 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 7 3.5
+
+box 6 3
+begin origin
+ amove .5 .5
+ set font rm
+ set hei 0.3 just bl
+ begin table
+ Here is my table
+ of text see how
+ 22 44 55 33
+ 0.1 999 1 .2
+ 3 33 2 33
+ it lines up
+ end table
+end origin
diff --git a/gle-refman/primitives/fig/gc_text.gle b/gle-refman/primitives/fig/gc_text.gle
new file mode 100644
index 0000000..78d66d3
--- /dev/null
+++ b/gle-refman/primitives/fig/gc_text.gle
@@ -0,0 +1,59 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 7 3
+
+box 6 3
+begin origin
+ amove 0.5 2.5
+ set hei 0.25 just tl font tt
+ marker fcircle
+ begin text width 5
+ This is my paragraph of text to see
+ if it wraps things at four cm as I have
+ told it to do.
+ end text
+ amove .5 .5
+ set justify bl
+ marker fcircle
+ begin text
+ Now some text
+ without a width
+ specified
+ end text
+end origin
diff --git a/gle-refman/primitives/fig/gc_write.gle b/gle-refman/primitives/fig/gc_write.gle
new file mode 100644
index 0000000..cbaf671
--- /dev/null
+++ b/gle-refman/primitives/fig/gc_write.gle
@@ -0,0 +1,50 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 7 3
+
+box 6 3
+begin origin
+ set hei .35 just center font rm
+ amove 3 .5
+ a$ = "Hello there "
+ xx = sqrt(10)
+ t$ = time$()
+ c$ = a$+t$
+ write a$+t$ xx
+end origin
diff --git a/gle-refman/primitives/fig/gc_xend.gle b/gle-refman/primitives/fig/gc_xend.gle
new file mode 100644
index 0000000..2e40d42
--- /dev/null
+++ b/gle-refman/primitives/fig/gc_xend.gle
@@ -0,0 +1,50 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 7 3
+
+box 6 3
+begin origin
+ set hei 1 font rm
+ set just left
+ amove 1 1
+ text abc
+ set color gray20
+ amove xend() yend()
+ text def
+end origin
diff --git a/gle-refman/primitives/fig/grids.gle b/gle-refman/primitives/fig/grids.gle
new file mode 100644
index 0000000..e045733
--- /dev/null
+++ b/gle-refman/primitives/fig/grids.gle
@@ -0,0 +1,73 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 13.25 4.5
+
+include "../../script/manual.gle"
+manual_graph_mode
+
+wd = 1.75; hi = 1; yd = 0.15; del = 0.4
+
+sub dobox x y grid$
+ amove del+(wd+del)*x pageheight()-del-(hi+del)*y-hi-yd
+ set fill gray50 pattern grid$
+ box wd hi name "bx"
+ set just bc
+ amove ptx(bx.tc) pty(bx.tc)+0.1
+ tex grid$
+end sub
+
+dobox 0 0 "GRID"
+dobox 1 0 "GRID1"
+dobox 2 0 "GRID2"
+dobox 3 0 "GRID3"
+dobox 4 0 "GRID4"
+dobox 5 0 "GRID5"
+dobox 0 1 "SHADE"
+dobox 1 1 "SHADE1"
+dobox 2 1 "SHADE2"
+dobox 3 1 "SHADE3"
+dobox 4 1 "SHADE4"
+dobox 5 1 "SHADE5"
+dobox 0 2 "RSHADE"
+dobox 1 2 "RSHADE1"
+dobox 2 2 "RSHADE2"
+dobox 3 2 "RSHADE3"
+dobox 4 2 "RSHADE4"
+dobox 5 2 "RSHADE5"
+
diff --git a/gle-refman/primitives/fig/setcolor.gle b/gle-refman/primitives/fig/setcolor.gle
new file mode 100644
index 0000000..71cba39
--- /dev/null
+++ b/gle-refman/primitives/fig/setcolor.gle
@@ -0,0 +1,67 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 9.5 2
+
+include "../../script/manual.gle"
+manual_std_mode
+
+bw = 0.8; bh = 0.4; dy = 0.1; dx = 4; ytop = pageheight()-0.3
+
+sub show_color col$ name$
+ rmove 0 -bh/2
+ box bw bh fill col$
+ rmove bw+0.2 bh/2
+ tex name$
+ rmove -bw-0.2 -bh-dy
+end sub
+
+set just lc
+
+amove 0.25 ytop
+show_color "black" "set color black"
+show_color "white" "set color white"
+show_color "gray50" "set color gray50"
+show_color "0.3" "set color 0.3"
+
+amove 0.25+dx ytop
+show_color "red" "set color red"
+show_color "#ADFF2F" "set color \#ADFF2F"
+show_color "rgb255(255,140,0)" "set color rgb255(255,140,0)"
+show_color "rgb(0.5,0.2,0.2)" "set color rgb(0.5,0.2,0.2)"
+
diff --git a/gle-refman/prog/fig/Makefile.gcc b/gle-refman/prog/fig/Makefile.gcc
new file mode 100644
index 0000000..d5e26ad
--- /dev/null
+++ b/gle-refman/prog/fig/Makefile.gcc
@@ -0,0 +1,56 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+EPSS = axisformat.pdf
+
+ifeq ($(RUNBUILD),1)
+ GLE = ../../../build/bin/gle
+else
+ GLE = gle
+endif
+
+all: $(EPSS)
+
+%.inc: %.gle
+ $(GLE) -texincprefix graph/fig/ -inc -d pdf $<
+
+%.pdf: %.gle
+ $(GLE) -d pdf $<
+
+clean:
+ rm -rf *.eps *.pdf *.inc .gle
diff --git a/gle-refman/prog/fig/axisformat.gle b/gle-refman/prog/fig/axisformat.gle
new file mode 100644
index 0000000..ae11183
--- /dev/null
+++ b/gle-refman/prog/fig/axisformat.gle
@@ -0,0 +1,73 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 13.5 7
+
+include "../../script/manual.gle"
+
+manual_graph_mode
+
+set hei 0.29
+
+sub demo_axis x0 x1 dt fmt1$ fmt2$ opt$
+ set just lc
+ local xp = xpos()
+ begin box round 0.1 add 0.1
+ write fmt2$
+ end box
+ amove xp+4.5 ypos()
+ set alabelscale 0.9
+ begin graph
+ size 8 1
+ fullsize
+ yaxis off
+ x2axis off
+ xaxis min x0 max x1 dticks dt \expr{opt$} format "\expr{fmt1$}"
+ end graph
+end sub
+
+dy = 1; oy = 0.5
+
+amove 0.2 0*dy+oy; demo_axis -1 1 1/4 "fix 2" "fix 2" ""
+amove 0.2 1*dy+oy; demo_axis -1 1 1/4 "frac" "frac" ""
+amove 0.2 2*dy+oy; demo_axis 0 2*pi pi/2 "pi" "pi" ""
+amove 0.2 3*dy+oy; demo_axis 1e-6 1e6 2 "sci 0 10 expdigits 2 expsign" "sci 0 10 expdigits 2 expsign" "log"
+amove 0.2 4*dy+oy; demo_axis 1e-6 1e6 2 "eng 3 append $\Omega$" "eng 3 append $\backslash{}$Omega" "log"
+amove 0.2 5*dy+oy; demo_axis 1e-6 1e6 2 "eng 3 10 num" "eng 3 10 num" "log"
+amove 0.2 6*dy+oy; demo_axis 0 2000 500 "eng 3 append g" "eng 3 append g" ""
+
diff --git a/gle-refman/prog/prog.tex b/gle-refman/prog/prog.tex
new file mode 100644
index 0000000..f362e19
--- /dev/null
+++ b/gle-refman/prog/prog.tex
@@ -0,0 +1,608 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% GLE - Graphics Layout Engine <http://www.gle-graphics.org/> %
+% %
+% Modified BSD License %
+% %
+% Copyright (C) 2009 GLE. %
+% %
+% Redistribution and use in source and binary forms, with or without %
+% modification, are permitted provided that the following conditions %
+% are met: %
+% %
+% 1. Redistributions of source code must retain the above copyright %
+% notice, this list of conditions and the following disclaimer. %
+% %
+% 2. Redistributions in binary form must reproduce the above %
+% copyright notice, this list of conditions and the following %
+% disclaimer in the documentation and/or other materials provided with %
+% the distribution. %
+% %
+% 3. The name of the author may not be used to endorse or promote %
+% products derived from this software without specific prior written %
+% permission. %
+% %
+% THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR %
+% IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED %
+% WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE %
+% ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY %
+% DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL %
+% DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE %
+% GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS %
+% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER %
+% IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR %
+% OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN %
+% IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\chapter{Programming Facilities}
+
+\section{Expressions}
+\index{variables}
+\index{expressions}
+Wherever GLE is expecting a number it can be replaced with an expression. For
+example
+
+\preglecode{}
+\begin{Verbatim}
+ rline 3 2
+\end{Verbatim}
+\postglecode{}
+
+and
+
+\preglecode{}
+\begin{Verbatim}
+ rline 9/3 sqrt(4)
+\end{Verbatim}
+\postglecode{}
+
+will produce the same result.
+
+An expression in GLE is delimited by white space, so it may not contain any
+spaces - `{\sf rline 3*3 2}' is valid but `{\sf rline 3 * 3 2}' will not work.
+
+Or `{\sf let d2 = 3+sin(d1)}' will work and `{\sf let d2= 3 + sin(d1)}' won't.
+
+Expressions may contain numbers, arithmetic operators ({\sf +}, {\sf -}, {\sf *},
+{\sf /}, \verb+^+ (to the power of)), relational operators ($>$, $<$, $=>$, $<=$,
+$=$, $<>$) Boolean operators ({\sf and}, {\sf or}), variables and built-in functions.
+
+When GLE is expecting a colour or marker name (like `green' or `circle')
+it can be given a string variable, or an expression enclosed in braces.
+
+\section{Functions Inside Expressions}
+
+\begin{figure}[tb]
+\centering
+\mbox{\includegraphics{prog/fig/axisformat}}
+\caption{\label{axformat:fig}Examples of number formatting options.}
+\end{figure}
+
+\begin{commanddescription}
+
+\item[{\sf eval(str)}]
+\index{eval()}
+Evaluates the given string as if it was a GLE expression and returns the result. E.g., \texttt{eval("3+4")} returns 7.
+
+\item[{\sf arg(i), arg\$(i), nargs()}]
+\label{args:cmd}
+\index{arg()}
+\index{arg\$()}
+\index{nargs()}
+Provide access to the command line arguments that are passed to GLE. This is useful for generating multiple similar plots from a single script. arg(i) returns the i-the argument (as a number), arg\$(i) returns the i-the argument as a string, and nargs() returns the number of arguments. Only arguments that come after the name of the GLE script are counted. For example, if GLE is run as:
+
+\begin{Verbatim}
+ gle -o graph-1.eps graph.gle "Title" 0.5
+\end{Verbatim}
+
+\noindent{}then nargs() returns 2, arg\$(1) returns ``Title'', and arg(2) returns 0.5.
+
+The typical use of these functions is to create a script ``graph.gle'' as follows:
+
+\begin{Verbatim}
+size 10 10
+begin graph
+ title arg$(1)
+ data arg$(2)
+ d1 line color red
+end graph
+\end{Verbatim}
+
+\noindent{}and then creating different graphs by running GLE multiple times:
+
+\begin{Verbatim}
+ gle -o beans.eps graph.gle "Beans" "beans.csv"
+ gle -o peas.eps graph.gle "Peas" "peas.csv"
+\end{Verbatim}
+
+\noindent{}This will create two graphs: ``beans.eps'' and ``peas.eps''. The arg() functions can be used at all places in the script where an expression is expected. They can even be used in place of GLE commands in a graph block by means of the $\backslash{}$expr() function. For example,
+
+\begin{Verbatim}
+ data "file.csv"
+ d\expr{arg(1)} line color red
+\end{Verbatim}
+
+\noindent{}in the graph block will allow one to draw different datasets from a single file on multiple graphs. To do so, run:
+
+\begin{Verbatim}
+ gle -o d1.eps graph.gle 1
+ gle -o d2.eps graph.gle 2
+\end{Verbatim}
+
+\item[{\sf dataxvalue({\it ds},{\it i}), datayvalue({\it ds},{\it i}), ndata({\it ds})}]
+\index{dataxvalue}\label{dataxvalue}
+\index{datayvalue}\label{datayvalue}
+\index{ndata}\label{ndata}
+
+These functions can be used to retrieve the data values from a given dataset. They only work after data has been loaded by means of a graph block (Ch.~\ref{graph:chap}).
+
+A dataset is specified with a dataset identifier {\it ds} (a string of the form ``d$i$'', with $i$ an integer). The function `{\sf ndata}' returns the number of points in the dataset, and the functions `{\sf dataxvalue}' and `{\sf datayvalue}' return the $x$ and $y$ values of point {\it i}, where {\it i} ranges from 1 to {\sf ndata({\it ds})}.
+
+The following example shows how these functions can be used to compute the maximum of a dataset:
+
+\begin{Verbatim}
+sub dmaxy ds$
+ local crmax = datayvalue(ds$,1)
+ for i = 2 to ndata(ds$)
+ crmax = max(crmax, datayvalue(ds$,i))
+ next i
+ return crmax
+end sub
+\end{Verbatim}
+
+This subroutine together with other subroutines for computing the minimum, mean, area, etc. of a dataset are defined in the include file `graphutil.gle', which is distributed together with GLE.
+
+\item[{\sf format\$({\it exp},{\it format})}]
+\index{format\$()} \label{formatnum:pg}
+
+Returns a string representation of {\it exp} formatted as specified in {\it format}.
+
+Basic formats:
+\begin{itemize}
+\item {\sf append {\it s}}: appends the string $s$ after the formatted number. This can be used to add a unit.
+
+\item {\sf dec}, {\sf hex [upper|lower]}, {\sf bin}: format as decimal, hexadecimal (upper-case or lower-case), or binary.
+
+\item {\sf fix} {\it places}: format with {\it places} decimal places.
+
+\item {\sf percent} {\it places}: format as ({\it exp} $\cdot 100$)\% with {\it places} decimal places.
+
+\item {\sf sci} {\it sig} {\sf [e,E,10]} {\sf [expdigits {\it num}]} {\sf [expsign]}: format in scientific notation with {\it sig} significant digits. Use `e', `E', or `10' as notation for the exponent. With the option {\sf expdigits} the number of digits in the exponent can be set and {\sf expsign} forces a sign in the exponent.
+
+\item {\sf eng} {\it digits} {\sf [e,E,10]} {\sf [expdigits {\it num}]} {\sf [expsign]} {\sf [num]}: format in engineering notation. The options are similar to `sci'. If the option `num' is given, then numeric notation is used instead of, e.g., $\mu$, m, k, M.
+
+\item {\sf round} {\it sig}: format a number with {\it sig} significant digits.
+
+\item {\sf frac}: format the number as a fraction.
+
+\item {\sf pi}: format the number as a fraction times $\pi$ (E.g., xaxis labels of Fig.~\ref{grscale:fig}).
+\end{itemize}
+
+Options for all formats:
+\begin{itemize}
+\item {\sf nozeroes}: remove unnecessary zeroes at the end of the number.
+
+\item {\sf sign}: also include a sign for positive numbers.
+
+\item {\sf pad {\it nb} [left] [right]}: pad the result with spaces from the left or right.
+
+\item {\sf prefix {\it nb}}: prefix the number with zeroes so that {\it nb} digits are obtained.
+
+\item {\sf prepend {\it s}}: prepends the string $s$ before the formatted number.
+
+\item {\sf min {\it val}}: use format for numbers $\ge$ {\it val}.
+
+\item {\sf max {\it val}}: use format for numbers $\le$ {\it val}.
+\end{itemize}
+
+Examples:
+\begin{itemize}
+\item format\$(3.1415, ``fix 2'') = 3.14
+\item format\$(3756, ``round 2'') = 3800
+\item format\$(3756, ``sci 2 10 expdigits 2'') = $3.8\cdot10^{03}$
+\end{itemize}
+
+Several formats can be combined into one string: "sci 2 10 min 1e2 fix 0" uses scientific notations for numbers above $10^2$ and decimal notation for smaller numbers. See Fig.~\ref{axformat:fig} for more examples.
+
+\item[{\sf pagewidth(), pageheight()}]
+\index{pagewidth()} \index{pageheight()}
+These functions return the width and height of the output. These are the values set with the `\texttt{size}' command.
+
+\item[{\sf pointx(), pointy()}]\label{fct:pointxy}
+These functions return the x and y values of a named point.
+
+\preglecode{}
+\begin{Verbatim}
+ begin box add 0.1 name mybox
+ write "Hello"
+ end box
+ amove pointx(mybox.bc) pointy(mybox.bc)
+ rline 0 -2 arrow end
+\end{Verbatim}
+\postglecode{}
+
+\item[{\sf twidth(str), theight(str), tdepth(str)}]
+\index{twidth()} \index{theight()}
+These functions return the width, depth and height of a string, if it was
+printed in the current font and size.
+
+\item[{\sf width(obj), height(obj)}]\label{fct:wdhi}
+\index{width()} \index{height()}
+These functions return the width and height of a named object.
+
+\item[{\sf xend(), yend()}]
+\index{xend()} \index{yend()}
+These functions return the end point of the last thing drawn. This is
+of particular interest when drawing text.
+
+\preglecode{}
+\begin{Verbatim}
+ text abc
+ set color blue
+ text def
+\end{Verbatim}
+\postglecode{}
+
+This would draw the {\sf def} on top of the {\sf abc}. To draw the {\sf def}
+immediately following the {\sf abc} simply do the following (Note that
+absolute move is used, not relative move):
+
+\begin{minipage}[c]{8cm}
+\begin{Verbatim}
+set just left
+text abc
+set color gray20
+amove xend() yend()
+text def
+\end{Verbatim}
+\end{minipage}
+\hfill
+\begin{minipage}[c]{7cm}
+\mbox{\includegraphics{primitives/fig/gc_xend}}
+\end{minipage}
+
+\item[{\sf xg(), yg()}]
+\index{xg()} \index{yg()}
+\index{functions}
+With these functions it is possible to move to a position on a graph
+using the graph's axis units.
+To draw a filled box on a graph, at position x=948, y=.004 measured
+on the graph axis:
+
+\preglecode{}
+\begin{Verbatim}
+ begin graph
+ xaxis min 100 max 2000
+ yaxis min -.01 max .01
+ ...
+ end graph
+ amove xg(948) yg(.004)
+ box 2 2 fill gray10
+\end{Verbatim}
+\postglecode{}
+
+\item[{\sf xpos(), ypos()}]
+\index{xpos()} \index{ypos()}
+Returns the current x and y points.
+\end{commanddescription}
+
+\noindent{}See Appendix~\ref{fct:sec} for an overview of all functions provided by GLE.
+
+\section{Using Variables}
+\index{variables}
+\index{string!variables}
+
+GLE has two types of variables, floating point and string. String
+variables always end with a dollar sign. A string variable contains
+text like ``Hello, this is text'', a floating point variable can
+only store numbers like 1234.234.
+
+\preglecode{}
+\begin{Verbatim}
+name$ = "Joe"
+height = 6.5 ! Height of person
+shoe = 0.05 ! shoe adds to height of person
+amove 1 1
+box 0.2 height+shoe
+write name$
+\end{Verbatim}
+\postglecode{}
+
+\section{String constants}
+\index{string!constants}
+
+String constants can be double quoted or single quoted. To include a double quote character in a double quoted string it should be doubled. The same holds for a single quoted string. Backslash characters are not interpreted in a special way by GLE's parser. (They are, however, interpreted by the built-in \TeX{} system used in the `{\sf write}' command.) Here are some examples:
+
+\preglecode{}
+\begin{Verbatim}
+print "Double quoted string"
+print 'Single quoted string'
+print "Between ""double quotes"""
+print "{\it hello}"
+print "Three double quotes """""""
+print """"
+\end{Verbatim}
+\postglecode{}
+
+The result of these print commands is:
+
+\preglecode{}
+\begin{Verbatim}
+Double quoted string
+Single quoted string
+Between "double quotes"
+{\it hello}
+Three double quotes """
+"
+\end{Verbatim}
+\postglecode{}
+
+\section{Programming Loops}
+\index{loops}
+\index{for}
+\index{next}
+
+The simple way to draw a 6 $\times$ 8 grid would be to use a whole mass
+of line commands:
+
+\preglecode{}
+\begin{Verbatim}
+amove 0 0
+rline 0 8
+amove 1 0
+rline 1 8
+...
+amove 6 0
+rline 6 8
+\end{Verbatim}
+\postglecode{}
+
+this would be laborious to type in, and would become
+impossible to manage with several grids. By using a simple loop
+this can be avoided:
+
+\preglecode{}
+\begin{Verbatim}
+for x = 0 to 6
+ amove x 0
+ rline x 8
+next x
+for y = 0 to 8
+ amove 0 y
+ rline 6 y
+next y
+\end{Verbatim}
+\postglecode{}
+
+For-next loops, and all other control constructs, can also be used among others inside graph and key blocks. This is useful for drawing many similar functions (Fig.~\ref{fig:sqroot}). Besides for-next loops, GLE also supports while and until loops:
+
+\index{while}
+\preglecode{}
+\begin{Verbatim}
+i = 0
+while i <= 10
+ print "Value: " i
+ i = i + 1
+next
+\end{Verbatim}
+\postglecode{}
+
+\index{until}
+\preglecode{}
+\begin{Verbatim}
+i = 0
+until i > 10
+ print "Value: " i
+ i = i + 1
+next
+\end{Verbatim}
+\postglecode{}
+
+\section{If-then-else}
+\index{if}
+\index{then}
+\index{else}
+
+GLE supports if-then-else statements as follows:
+
+\preglecode{}
+\begin{Verbatim}
+if a < 1 then print a "is smaller than 1"
+else if a < 2 then print a "is smaller than 2 but larger than 1"
+else if a < 3 then print a "is smaller than 3 but larger than 2"
+else print a "is larger than 3"
+\end{Verbatim}
+\postglecode{}
+
+\noindent{}to create blocks of code for the `then' and `else' branches, instead use:
+
+\preglecode{}
+\begin{Verbatim}
+if a < 1 then
+ print a "is smaller than 1"
+ ...
+else
+ ...
+end if
+\end{Verbatim}
+\postglecode{}
+
+More complex conditions can be created with the logic connectives `{\sf and}', `{\sf or}', and `{\sf not}' (note the parenthesis around the logical expressions):
+
+\preglecode{}
+\begin{Verbatim}
+if (a >= 1) and (a <= 10) then print "a is between 1 and 10"
+\end{Verbatim}
+\postglecode{}
+
+\section{Subroutines}
+\index{subroutines}
+
+To draw lots of grids all of different dimensions a subroutine can
+be defined and then used again and again:
+
+\preglecode{}
+\begin{Verbatim}
+sub grid nx ny
+ local x, y
+ begin origin
+ for x = 0 to nx
+ amove x 0
+ aline x ny
+ next x
+ for y = 0 to ny
+ amove 0 y
+ aline nx y
+ next y
+ end origin
+end sub
+
+amove 2 4
+grid 6 8
+amove 2 2
+grid 9 5
+\end{Verbatim}
+\postglecode{}
+
+Inside a subroutine, the keyword `\texttt{local}'\index{local} can be used to define local variables. E.g., `\texttt{local x = 3}', defines the local variable `x' and assigns it the value 3. It is also possible to define several local variables at once, as is shown in the `grid' example above.
+
+The keyword `\texttt{return}'\index{return} can be used to return a value from a subroutine. E.g.,
+
+\preglecode{}
+\begin{Verbatim}
+sub gaussian x mu sigma
+ return 1/(sigma*sqrt(2*pi))*exp(-((x-mu)^2)/(2*sigma^2))
+end sub
+\end{Verbatim}
+\postglecode{}
+
+The main GLE file will be much easier to manage if subroutine definitions are moved into a separate file:
+
+\preglecode{}
+\begin{Verbatim}
+include "griddef.gle"
+
+amove 2 4
+grid 2 4
+amove 2 2
+grid 9 5
+\end{Verbatim}
+\postglecode{}
+
+More information about the ``include''\index{include} command can be found on page~\pageref{incl:cmnd}.
+
+\subsection{Default Arguments}
+
+Given the following subroutine definition:
+
+\preglecode{}
+\begin{Verbatim}
+sub mysub x y color$ fill$
+ default color "black"
+ default fill "clear"
+ print "Color: " color$
+ print "Fill: " fill$
+end sub
+\end{Verbatim}
+\postglecode{}
+
+\noindent{}the following calls are valid:
+
+\preglecode{}
+\begin{Verbatim}
+mysub 1 0
+mysub 1 0 red
+mysub 1 0 red green
+mysub 1 0 fill blue
+mysub 1 0 color red
+mysub 1 0 color red fill blue
+\end{Verbatim}
+\postglecode{}
+
+\section{Forward Declarations}
+
+A forward declaration of a subroutine is possible with:
+
+\preglecode{}
+\begin{Verbatim}
+declare sub mysub x y
+\end{Verbatim}
+\postglecode{}
+
+\noindent{}Forward declarations are required for declaring mutually recursive subroutines.
+
+\section{I/O Functions}
+\index{I/O-functions}
+\index{fopen} \index{fread} \index{freadln}
+\index{fclose} \index{fwrite} \index{fwriteln}
+\index{fgetline} \index{ftokenizer}
+
+The following I/O functions are available:
+
+\begin{commanddescription}
+\item[{\sf fopen {\it name} {\it file} [read$|$write]}]
+
+Open the file ``{\it name}'' for reading or for writing. The resulting file handle is stored in variable ``{\it file}'' and must be passed to all other I/O functions.
+
+\item[{\sf fclose {\it file}}]
+
+Close the given file.
+
+\item[{\sf fread {\it file} {\it x1} $\ldots$}]
+\item[{\sf freadln {\it file} {\it x1} $\ldots$}]
+
+Read entries from ``{\it file}'' into given arguments {\it x1} $\ldots$
+
+\item[{\sf fwrite {\it file} {\it x1} $\ldots$}]
+
+Write given arguments to ``{\it file}''.
+
+\item[{\sf fwriteln {\it file} {\it x1} $\ldots$}]
+
+Write given arguments to ``{\it file}'' and start a new line.
+
+\item[{\sf fgetline {\it file} {\it line\$}}]
+
+Read an entire line from ``{\it file}'' and store it in the string ``{\it line\$}''.
+
+\item[{\sf ftokenizer {\it file} {\it commentchar spacetokens singletokens}}]
+
+Sets up the parameters of the tokenizer that controls the reading of ``{\it file}''. The {\it commentchar} parameter specifies the characters that are to be interpreted as line comments. It is a string, but each character of the string is assumed to be a separate comment character. The default is ``!''. If one would write ``!\%'', then both ``!'' and ``\%'' would be comment indicators. The {\sf fread} functions skip everything after a comment character to the end of the line. The {\it sp [...]
+
+\end{commanddescription}
+
+For example:
+
+\preglecode{}
+\begin{Verbatim}
+fopen "file.dat" f1 read
+fopen "file.out" f2 write
+until feof(f1)
+ fread f1 x y z
+ aline x y
+ rline x z
+ fwriteln f2 x*2 "y =" y
+next
+fclose f1
+fclose f2
+\end{Verbatim}
+\postglecode{}
+
+\section{Device Dependent Control}
+\index{device control}
+A built in function which returns a string describing
+the device is available. \\e.g. \verb# DEVICE$() = "HARDCOPY, PS,"#\\
+on the postscript driver.
+
+This can be used to use particular fonts etc on appropriate
+devices. E.g.:
+
+\preglecode{}
+\begin{Verbatim}
+ if pos(device$(),"PS,",1)>0 then
+ set font psncsb
+ end if
+\end{Verbatim}
+\postglecode{}
diff --git a/gle-refman/qgle/qgle.tex b/gle-refman/qgle/qgle.tex
new file mode 100644
index 0000000..0af38bf
--- /dev/null
+++ b/gle-refman/qgle/qgle.tex
@@ -0,0 +1,67 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% GLE - Graphics Layout Engine <http://www.gle-graphics.org/> %
+% %
+% Modified BSD License %
+% %
+% Copyright (C) 2009 GLE. %
+% %
+% Redistribution and use in source and binary forms, with or without %
+% modification, are permitted provided that the following conditions %
+% are met: %
+% %
+% 1. Redistributions of source code must retain the above copyright %
+% notice, this list of conditions and the following disclaimer. %
+% %
+% 2. Redistributions in binary form must reproduce the above %
+% copyright notice, this list of conditions and the following %
+% disclaimer in the documentation and/or other materials provided with %
+% the distribution. %
+% %
+% 3. The name of the author may not be used to endorse or promote %
+% products derived from this software without specific prior written %
+% permission. %
+% %
+% THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR %
+% IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED %
+% WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE %
+% ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY %
+% DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL %
+% DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE %
+% GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS %
+% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER %
+% IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR %
+% OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN %
+% IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\chapter{QGLE: GLE's Graphical User Interface}
+\index{QGLE}\label{QGLE:chap}
+
+QGLE is the graphical user interface (GUI) to GLE. A screenshot of QGLE with some of its dialogs appears in Fig.~\ref{fig:qgle}.
+
+\begin{figure}
+\resizebox{\textwidth}{!}{\includegraphics{qgle/screenshot/qgle-windows1.png}}
+\caption{\label{fig:qgle}A screenshot of QGLE.}
+\end{figure}
+
+The current GUI contains a preview window that can receive messages from GLE and display the resulting EPS file. In addition, it can open GLE and EPS files directly (using Ghostscript and GLE). It has the capability to add and edit simple objects, such as, lines, circles, arcs (snapping to a grid if required), and complex object blocks (defined with begin/end object). It can also alter various properties of the objects, such as, line width, and color. The perpendicular line and tangenti [...]
+
+\vspace{0.5cm}
+When drawing objects, hit the escape key to cancel. The pointer tool can be used to select objects and they can be deleted using the 'del' key or moved/scaled. Shift can be used to select multiple objects.
+
+\vspace{0.5cm}
+Keyboard shortcuts include:
+
+\begin{tabular}{l|l}
+F1 & Open the GLE manual \\
+F3 & Toggle object snap \\
+F6 & Toggle coordinate display \\
+F7 & Toggle grid visibility \\
+F8 & Toggle orthographic snap \\
+F9 & Toggle grid snap \\
+F10 & Toggle polar snap \\
+'-' & Zoom in \\
+'=' & Zoom out \\
+\end{tabular}
diff --git a/gle-refman/qgle/screenshot/qgle-windows1.png b/gle-refman/qgle/screenshot/qgle-windows1.png
new file mode 100644
index 0000000..87722e1
Binary files /dev/null and b/gle-refman/qgle/screenshot/qgle-windows1.png differ
diff --git a/gle-refman/script/manual.gle b/gle-refman/script/manual.gle
new file mode 100644
index 0000000..684b63f
--- /dev/null
+++ b/gle-refman/script/manual.gle
@@ -0,0 +1,54 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+sub manual_graph_mode
+ set font psh
+ set texlabels 1 titlescale 1 atitlescale 0.9 alabelscale 0.75 ticksscale 0.2
+ set hei 0.3633
+ set texscale fixed
+ set lstyle 1
+ set lwidth 0.02
+ set color black
+end sub
+
+sub manual_std_mode
+ set font psh
+ set hei 0.3633
+ set texscale fixed
+ set color black
+end sub
diff --git a/gle-refman/title/Makefile.gcc b/gle-refman/title/Makefile.gcc
new file mode 100644
index 0000000..c94d7fc
--- /dev/null
+++ b/gle-refman/title/Makefile.gcc
@@ -0,0 +1,53 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+EPSS = glelogo.pdf
+
+ifeq ($(RUNBUILD),1)
+ GLE = ../../build/bin/gle
+else
+ GLE = gle
+endif
+
+all: $(EPSS)
+
+%.pdf: %.gle
+ $(GLE) -d pdf $<
+
+clean:
+ rm -rf *.eps *.pdf *.inc
diff --git a/gle-refman/title/Makefile.os2 b/gle-refman/title/Makefile.os2
new file mode 100644
index 0000000..1f784aa
--- /dev/null
+++ b/gle-refman/title/Makefile.os2
@@ -0,0 +1,47 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+EPSS = glelogo.eps
+
+all: $(EPSS)
+
+%.eps: %.gle
+ gle -d eps $<
+
+clean:
+ rm -rf *.eps *.pdf *.inc
diff --git a/gle-refman/title/glelogo.gle b/gle-refman/title/glelogo.gle
new file mode 100644
index 0000000..9fc077e
--- /dev/null
+++ b/gle-refman/title/glelogo.gle
@@ -0,0 +1,104 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!
+! GLE logo for web page
+! by: V.P. LaBella vlabella at albany.edu
+!
+psbbtweak
+size 12 6
+set font psagb
+name$="Professional Graphics Language"
+dx=12
+dy=6
+boxw=dx/7
+boxh=dy
+amove 0 0
+set color white
+box dx dy fill white
+
+sub draw_box dx dy clr$
+ gsave
+ set color clr$
+ box dx dy fill clr$
+ grestore
+end sub
+
+amove dx/2 dy/2+0.5
+set just cc
+begin clip ! Save default clipping region
+ begin path clip ! Set up the clipping region
+ set hei 6.0
+ text GLE
+ end path
+ amove 0 0
+ @draw_box boxw boxh red
+ rmove boxw 0
+ @draw_box boxw boxh orange
+ rmove boxw 0
+ @draw_box boxw boxh yellow
+ rmove boxw 0
+ @draw_box boxw boxh lime
+ rmove boxw 0
+ @draw_box boxw boxh blue
+ rmove boxw 0
+ @draw_box boxw boxh navy
+ rmove boxw 0
+ @draw_box boxw boxh violet
+ rmove boxw 0
+ gsave
+ set hei 0.67
+ delta=0.8
+ amove dx/2 dy-delta
+ set color black
+ for i=1 to 10
+ write name$
+ rmove 0.0 -delta
+ next i
+ grestore
+end clip
+
+!
+! version number
+!
+amove 9.4 1.8
+gsave
+set hei 1.0
+set just bl
+set color gray40
+text v4.2
+grestore
diff --git a/gle-refman/title/sm_special.tex b/gle-refman/title/sm_special.tex
new file mode 100644
index 0000000..f6ebd40
--- /dev/null
+++ b/gle-refman/title/sm_special.tex
@@ -0,0 +1,137 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% GLE - Graphics Layout Engine <http://www.gle-graphics.org/> %
+% %
+% Modified BSD License %
+% %
+% Copyright (C) 2009 GLE. %
+% %
+% Redistribution and use in source and binary forms, with or without %
+% modification, are permitted provided that the following conditions %
+% are met: %
+% %
+% 1. Redistributions of source code must retain the above copyright %
+% notice, this list of conditions and the following disclaimer. %
+% %
+% 2. Redistributions in binary form must reproduce the above %
+% copyright notice, this list of conditions and the following %
+% disclaimer in the documentation and/or other materials provided with %
+% the distribution. %
+% %
+% 3. The name of the author may not be used to endorse or promote %
+% products derived from this software without specific prior written %
+% permission. %
+% %
+% THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR %
+% IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED %
+% WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE %
+% ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY %
+% DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL %
+% DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE %
+% GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS %
+% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER %
+% IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR %
+% OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN %
+% IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\usepackage{ifpdf}
+
+\ifpdf
+ \usepackage[pdftex]{graphics}
+ \usepackage[pdftex]{geometry}
+ \pdfinfo{
+ /Title (GLE User Manual)
+ /Author (C. Pugmire, St.M. Mundt, V.P. LaBella, J. Struyf)
+ }
+\else
+ \usepackage[dvips]{graphics}
+ \usepackage[dvips]{geometry}
+\fi
+
+% Put include packages here (before hyperref!!!)
+\usepackage{makeidx}
+\usepackage{cmd}
+\usepackage{supertabular}
+\usepackage{fancyvrb}
+\usepackage{rotating}
+\usepackage{color}
+
+\ifpdf
+\usepackage[
+ pdfpagelabels=true,
+ plainpages=false,
+ colorlinks=true,
+ breaklinks=true,
+ linktocpage=true,
+ pdfstartview=FitV,
+ linkcolor=black,
+ citecolor=black,
+ urlcolor=black
+]{hyperref}
+\newcommand{\myaddtoc}[1]{\phantomsection{}\addcontentsline{toc}{chapter}{#1}}
+\else
+\usepackage{url}
+\newcommand{\myaddtoc}[1]{}
+\newcommand{\texorpdfstring}[2]{#1}
+\fi
+
+% Correctly defines pdf bounding box
+\geometry{%
+ a4paper,
+ left = 2.5cm,
+ right = 2.5cm,
+ top = 2.5cm,
+ bottom = 2.5cm,
+ % Note centering requires recent version of geometry
+ centering
+}
+
+%\pagestyle{headings}
+\sloppy
+\setlength{\parindent}{0in}
+% \setlength{\topmargin}{-2.0cm}
+% \setlength{\textwidth}{15.0cm}
+% \setlength{\textheight}{22.6cm}
+% \setlength{\oddsidemargin}{1.5cm}%{0.0cm}%{1.5cm}
+% \setlength{\evensidemargin}{-.5cm}%{1.5cm}%{-.5cm}
+% \setlength{\footskip}{1.0cm}
+%
+\setcounter{totalnumber}{5} %vgl. wonneberger s.73 + kopka
+\renewcommand{\floatpagefraction}{.25} %vgl. wonneberger s.73 figure & table
+\renewcommand{\dblfloatpagefraction}{.25} % auf einer seite
+%
+%\makeglossary
+%
+%-------------- sm --------- \psgraphin mit dvips
+\newcommand{\psgraphin}[4]{
+\begin{center}
+\unitlength1.0cm
+\begin{picture}(#2,#3)
+\unitlength1.0cm
+%%fclipon
+%%fxsize=#2cm
+\put(0.0,0.0){
+\includegraphics{#1}}
+%%\put(#2,0.0){\makebox(0,0)[tl]{ {\tt{\small $ \verb+ #1+ $ }} }}
+\addtocontents{lof}{#4}
+\end{picture}
+%
+%%\begin{figure}[hbt]
+%%\vspace*{-.5cm}
+%%\caption[#4]{#4}
+%%\end{figure}
+%
+\end{center}
+}
+
+\fvset{baselinestretch=1}
+\fvset{fontsize=\small}
+\fvset{fontshape=n}
+
+\newcommand{\preglecode}{}
+\newcommand{\postglecode}{}
+\newcommand{\preglegraph}{\vspace{3mm}}
+\newcommand{\postglegraph}{\vspace{3mm}}
+
diff --git a/gle-refman/title/title.tex b/gle-refman/title/title.tex
new file mode 100644
index 0000000..076c495
--- /dev/null
+++ b/gle-refman/title/title.tex
@@ -0,0 +1,127 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% GLE - Graphics Layout Engine <http://www.gle-graphics.org/> %
+% %
+% Modified BSD License %
+% %
+% Copyright (C) 2009 GLE. %
+% %
+% Redistribution and use in source and binary forms, with or without %
+% modification, are permitted provided that the following conditions %
+% are met: %
+% %
+% 1. Redistributions of source code must retain the above copyright %
+% notice, this list of conditions and the following disclaimer. %
+% %
+% 2. Redistributions in binary form must reproduce the above %
+% copyright notice, this list of conditions and the following %
+% disclaimer in the documentation and/or other materials provided with %
+% the distribution. %
+% %
+% 3. The name of the author may not be used to endorse or promote %
+% products derived from this software without specific prior written %
+% permission. %
+% %
+% THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR %
+% IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED %
+% WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE %
+% ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY %
+% DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL %
+% DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE %
+% GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS %
+% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER %
+% IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR %
+% OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN %
+% IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\thispagestyle{empty}
+\begin{center}
+\includegraphics{title/glelogo}
+
+{\Huge Graphics Layout Engine}
+
+\vspace{1cm}
+
+{\huge GLE \gleversion{}}
+
+\vspace{1cm}
+
+{\huge User Manual}
+
+\vspace{1cm}
+
+C. Pugmire, St.M. Mundt, V.P. LaBella, J. Struyf
+
+\vspace{1cm}
+
+\url{http://www.gle-graphics.org/}
+\vfill
+\today{}
+\end{center}
+
+\pagenumbering{roman}
+
+\tableofcontents
+
+\chapter{Preface}
+
+\section*{Abstract}
+
+GLE (Graphics Layout Engine) is a graphics scripting language designed for creating publication quality figures (e.g., a chart, plot, graph, or diagram). It supports various chart types (including function plot, histogram, bar chart, scatter plot, contour plot, color map, and surface plot) through a simple but flexible set of graphing commands. More complex output can be created by relying on GLE's scripting language, which is full featured with subroutines, variables, and logic control. [...]
+
+\subsection*{Trademark Acknowledgements}
+The following trademarks are used in this manual.
+
+\begin{tabular}{ll} % {p{7cm}}
+{Windows} & Microsoft Corporation.\\
+{\TeX} & Donald E. Knuth, A Typesetting System.\\
+{\LaTeX} & Leslie Lamport, A Document Preparation System.\\
+{PostScript} & Page Description Language, Adobe Systems Inc.\\
+\end{tabular}
+
+\subsection*{Typographic Conventions}
+
+The following conventions will be used in command descriptions:
+
+\begin{tabular}{lp{10cm}}
+{\sf [option]} & Specifies an optional keyword or parameter, the brackets
+ should not be typed.\\
+{\sf option1 $\mid$ option2} &
+ Pick one of the options listed.\\
+ {\sf keyword} &
+ Keywords are represented in a bold typewriter font.\\
+{\it exp,x,y,x1,y1} &
+ Represent numbers or expressions. E.g. 2.2 or 2*5.
+ Parameters to be entered by the user are given in italics.
+\end{tabular}
+
+\subsection*{Pathways}
+
+For those in a hurry:
+\begin{enumerate}
+ \item Read Chapter~\ref{tut:chap}, The GLE Tutorial (beginners only).
+ \item Examine the examples at \url{http://www.gle-graphics.org/examples/}.
+ \item Browse through Chapter~\ref{graph:chap}, The Graph Module.
+\end{enumerate}
+
+For those with time:
+\begin{itemize}
+ \item {\bf Chapter~\ref{tut:chap}, GLE Tutorial:}\\
+ Covers installation and drawing a simple graph, highly
+ recommended if you have never used GLE before.
+ \item {\bf Chapter~\ref{prim:chap}, GLE Primitives:}\\
+ Describes the commands used for creating diagrams and slides and for annotating graphs.
+ \item {\bf Chapter~\ref{graph:chap}, The Graph Module:}\\
+ Describes the commands for drawing graphs.
+ \item {\bf Chapter~\ref{key:chap}, The Key Module:}\\
+ Describes the commands for producing keys for graphs.
+ \item {\bf Chapter~\ref{adv:chap}, Advanced Features of GLE:}\\
+ Covers advanced features of GLE. This includes programming constructs,
+ the \LaTeX{} interface, $\ldots$
+ \item {\bf Chapter~\ref{surf:chap}, Surface and Contour Plots:}\\
+ Describes the commands for drawing three-dimensional graphs.
+ \item {\bf Chapter~\ref{util:chap}, GLE Utilities:}\\
+ Describes FITLS and MANIP.
+\end{itemize}
diff --git a/gle-refman/tutorial/fig/Makefile.gcc b/gle-refman/tutorial/fig/Makefile.gcc
new file mode 100644
index 0000000..be6d737
--- /dev/null
+++ b/gle-refman/tutorial/fig/Makefile.gcc
@@ -0,0 +1,53 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+EPSS = tut_simple.inc tut_graph.inc tut_graph2.inc tut_graph3.inc
+
+ifeq ($(RUNBUILD),1)
+ GLE = ../../../build/bin/gle
+else
+ GLE = gle
+endif
+
+all: $(EPSS)
+
+%.inc: %.gle
+ $(GLE) -texincprefix tutorial/fig/ -inc -d pdf $<
+
+clean:
+ rm -rf *.eps *.pdf *.inc .gle
diff --git a/gle-refman/tutorial/fig/Makefile.os2 b/gle-refman/tutorial/fig/Makefile.os2
new file mode 100644
index 0000000..0a482a4
--- /dev/null
+++ b/gle-refman/tutorial/fig/Makefile.os2
@@ -0,0 +1,47 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+EPSS = tut_simple.eps tut_graph.eps tut_graph2.eps tut_graph3.eps
+
+all: $(EPSS)
+
+%.eps: %.gle
+ gle -d eps $<
+
+clean:
+ rm -rf *.eps *.pdf *.inc
diff --git a/gle-refman/tutorial/fig/tut.dat b/gle-refman/tutorial/fig/tut.dat
new file mode 100644
index 0000000..5bdbf4d
--- /dev/null
+++ b/gle-refman/tutorial/fig/tut.dat
@@ -0,0 +1,42 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+1 2
+2 6
+3 2
+4 5
+5 9
diff --git a/gle-refman/tutorial/fig/tut3.dat b/gle-refman/tutorial/fig/tut3.dat
new file mode 100644
index 0000000..d2581da
--- /dev/null
+++ b/gle-refman/tutorial/fig/tut3.dat
@@ -0,0 +1,42 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+1 2 1
+2 6 5
+3 - -
+4 5 4
+5 9 8
diff --git a/gle-refman/tutorial/fig/tut_graph.gle b/gle-refman/tutorial/fig/tut_graph.gle
new file mode 100644
index 0000000..7b851a6
--- /dev/null
+++ b/gle-refman/tutorial/fig/tut_graph.gle
@@ -0,0 +1,53 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 7 3.75
+
+include "../../script/manual.gle"
+
+amove 0 0.2
+manual_graph_mode
+begin graph
+ vscale 0.66
+ title "Simple Graph" dist 0.15
+ xtitle "Time"
+ ytitle "Output"
+ data "tut.dat"
+ yaxis min 0 max 10 dticks 2
+ d1 line marker triangle color red
+end graph
diff --git a/gle-refman/tutorial/fig/tut_graph2.gle b/gle-refman/tutorial/fig/tut_graph2.gle
new file mode 100644
index 0000000..f04527c
--- /dev/null
+++ b/gle-refman/tutorial/fig/tut_graph2.gle
@@ -0,0 +1,53 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 7 3.75
+
+include "../../script/manual.gle"
+
+amove 0 0.2
+manual_graph_mode
+begin graph
+ vscale 0.66
+ title "Smooth Graph" dist 0.15
+ xtitle "Time"
+ ytitle "Output"
+ data "tut.dat"
+ yaxis min 0 max 10 dticks 2
+ d1 line smooth color red
+end graph
diff --git a/gle-refman/tutorial/fig/tut_graph3.gle b/gle-refman/tutorial/fig/tut_graph3.gle
new file mode 100644
index 0000000..1c8db1a
--- /dev/null
+++ b/gle-refman/tutorial/fig/tut_graph3.gle
@@ -0,0 +1,57 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 7 3.75
+
+include "../../script/manual.gle"
+
+amove 0 0.2
+manual_graph_mode
+begin graph
+ vscale 0.66
+ title "Bar Graph" dist 0.2
+ xtitle "Measurement"
+ ytitle "Output"
+ data "year-2000.csv"
+ data "year-2001.csv"
+ key pos tl hei 0.3
+ yaxis dticks 2
+ xaxis dticks 1 nofirst nolast
+ xticks off
+ bar d1,d2 fill red,blue
+end graph
diff --git a/gle-refman/tutorial/fig/tut_simple.gle b/gle-refman/tutorial/fig/tut_simple.gle
new file mode 100644
index 0000000..9c16489
--- /dev/null
+++ b/gle-refman/tutorial/fig/tut_simple.gle
@@ -0,0 +1,43 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 8 2 box
+amove 0.25 0.25
+rline 5 1
+tex "$(1,\sqrt{2})$"
+
diff --git a/gle-refman/tutorial/fig/year-2000.csv b/gle-refman/tutorial/fig/year-2000.csv
new file mode 100644
index 0000000..d03643f
--- /dev/null
+++ b/gle-refman/tutorial/fig/year-2000.csv
@@ -0,0 +1,43 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+Time, "Year 2000"
+1, 2
+2, 5
+3, 2
+4, 5
+5, 9
diff --git a/gle-refman/tutorial/fig/year-2001.csv b/gle-refman/tutorial/fig/year-2001.csv
new file mode 100644
index 0000000..47a538b
--- /dev/null
+++ b/gle-refman/tutorial/fig/year-2001.csv
@@ -0,0 +1,43 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+Time, "Year 2001"
+1, 1
+2, 5
+3, 6
+4, 3
+5, 9
diff --git a/gle-refman/tutorial/tutorial.tex b/gle-refman/tutorial/tutorial.tex
new file mode 100644
index 0000000..bce742a
--- /dev/null
+++ b/gle-refman/tutorial/tutorial.tex
@@ -0,0 +1,351 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% GLE - Graphics Layout Engine <http://www.gle-graphics.org/> %
+% %
+% Modified BSD License %
+% %
+% Copyright (C) 2009 GLE. %
+% %
+% Redistribution and use in source and binary forms, with or without %
+% modification, are permitted provided that the following conditions %
+% are met: %
+% %
+% 1. Redistributions of source code must retain the above copyright %
+% notice, this list of conditions and the following disclaimer. %
+% %
+% 2. Redistributions in binary form must reproduce the above %
+% copyright notice, this list of conditions and the following %
+% disclaimer in the documentation and/or other materials provided with %
+% the distribution. %
+% %
+% 3. The name of the author may not be used to endorse or promote %
+% products derived from this software without specific prior written %
+% permission. %
+% %
+% THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR %
+% IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED %
+% WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE %
+% ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY %
+% DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL %
+% DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE %
+% GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS %
+% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER %
+% IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR %
+% OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN %
+% IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%\def\tb{\hspace*{1cm}\sf} %% sm
+\def\tb{\hspace*{0.0cm}\sf}
+\chapter{Tutorial}
+\label{tut:chap}
+
+\section{Installing GLE}
+
+This tutorial assumes that GLE is correctly installed. Information about how to install GLE can be found at the following URLs. The GLE distribution also includes a README with brief installation instructions.
+
+\begin{itemize}
+\item Installation on Windows: \url{http://www.gle-graphics.org/tut/windows.html}.
+
+\item Installation on Linux: \url{http://www.gle-graphics.org/tut/linux.html}.
+
+\item Installation on Mac OS/X: \url{http://www.gle-graphics.org/tut/mac.html}.
+\end{itemize}
+
+Feel free to post any questions or comments you might have about installing GLE on the GLE mailing list, which is available here:
+
+\begin{itemize}
+\item Mailing list: \url{https://lists.sourceforge.net/lists/listinfo/glx-general}.
+\end{itemize}
+
+\section{Running GLE}
+
+GLE is essentially a command line application; this tutorial will show you how to run it from the command prompt. GLE can also be run from your favorite text editor or from QGLE, GLE's graphical user interface. More information about running GLE from a text editor is given in the installation instructions.
+
+On Windows, you run GLE from the Windows Command Prompt. Normally the GLE installer should have added an entry labeled ``Command Prompt'' to GLE's folder in the start menu. On Unix-like operating systems, GLE runs from an X-terminal, such as ``konsole'' on Linux / KDE.
+
+Once you have opened the command prompt or terminal, try running GLE by entering the following command.
+
+\preglecode{}
+\begin{Verbatim}
+ gle
+\end{Verbatim}
+\postglecode{}
+
+As a result, GLE displays the following message.
+
+\preglecode{}
+\begin{Verbatim}
+ GLE version x.y.z
+ Usage: gle [options] filename.gle
+ More information: gle -help
+\end{Verbatim}
+\postglecode{}
+
+If this message does not appear and you see an error message instead, then GLE is not correctly installed. Refer to the installation instructions (Appendix \ref{install:app}) for more information. In the following, we will show how to construct a simple drawing with GLE.
+
+\section{Drawing a Line on a Page}
+
+Let's start with drawing a line on the page. GLE needs to know the size of the drawing you wish to make. This is accomplished with the {\sf size} command:
+
+\preglecode{}
+\begin{Verbatim}
+ size 8 2
+\end{Verbatim}
+\postglecode{}
+
+This specifies that the output will be 8cm wide and 2cm high. Next we define a ``current point'' by moving to somewhere on the page:
+
+\preglecode{}
+\begin{Verbatim}
+ amove 0.25 0.25
+\end{Verbatim}
+\postglecode{}
+
+The origin (0,0) is at the bottom left hand corner of the page. Suppose we wish to draw a line from this point 5 cm across and 1 cm up:
+
+\preglecode{}
+\begin{Verbatim}
+ size 8 2
+ amove 0.25 0.25
+ rline 5 1
+\end{Verbatim}
+\postglecode{}
+
+This is a {\bf relative} movement as the x and y values are given as distances from the current point, alternatively we could have used {\bf absolute} coordinates:
+
+\preglecode{}
+\begin{Verbatim}
+ size 8 2
+ amove 0.25 0.25
+ aline 5.25 1.25
+\end{Verbatim}
+\postglecode{}
+
+To draw some text on the page at the current point, use the {\sf write} command:
+
+\preglecode{}
+\begin{Verbatim}
+ write "Hi there"
+\end{Verbatim}
+\postglecode{}
+
+Or, alternatively, you could include arbitrary \LaTeX{} expressions using the {\sf tex} command:
+
+\preglecode{}
+\begin{Verbatim}
+ tex "$(1,\sqrt{2})$"
+\end{Verbatim}
+\postglecode{}
+
+Now we have constructed complete GLE script, which looks as follows:
+
+\preglecode{}
+\begin{Verbatim}
+ size 8 2 box
+ amove 0.25 0.25
+ rline 5 1
+ tex "$(1,\sqrt{2})$"
+\end{Verbatim}
+\postglecode{}
+
+\begin{figure}
+\centering
+\input{tutorial/fig/tut_simple.inc}
+\caption{\label{firstgle:fig}Result of your first GLE script.}
+\end{figure}
+
+Enter the above GLE script using a text editor and save it to disk (any editor that saves in UTF8 or ASCII format will work). The following assumes that you have saved the file under the name ``\texttt{test.gle}'' in the folder \texttt{C:$\backslash$GLE} on Windows, or \texttt{/home/john/gle} on a Unix-like operating system. Now open a command prompt and go to the folder where you saved the file. Then, run GLE on the file.
+
+On Windows, you do this as follows (\texttt{C:$\backslash$>} is the prompt):
+
+\preglecode{}
+\begin{Verbatim}
+ C:\> cd C:\GLE
+ C:\GLE> gle test.gle
+\end{Verbatim}
+\postglecode{}
+
+Or on Unix:
+
+\preglecode{}
+\begin{Verbatim}
+ cd ~/gle
+ gle test.gle
+\end{Verbatim}
+\postglecode{}
+
+GLE produces by default an Encapsulated PostScript (.eps) file:
+
+\preglecode{}
+\begin{Verbatim}
+ GLE x.y.z [test.gle]-C-R-[test.eps]
+\end{Verbatim}
+\postglecode{}
+
+Try viewing the resulting ``\texttt{test.eps}'' with a PostScript viewer such as GhostView, and compare it to the output shown in Fig.~\ref{firstgle:fig}. You can also preview it with QGLE, GLE's graphical user interface. After you've started QGLE, enter the following command at the command prompt.
+
+\preglecode{}
+\begin{Verbatim}
+gle -p test.gle
+\end{Verbatim}
+\postglecode{}
+
+This will preview the output in the QGLE previewer window. GLE can also create PDF files. This is accomplished by setting the output device to ``pdf''.
+
+\preglecode{}
+\begin{Verbatim}
+gle -device pdf test.gle
+\end{Verbatim}
+\postglecode{}
+
+Try viewing the resulting ``\texttt{test.pdf}'' with Acrobat Reader or similar. Other output formats supported by GLE (eps, ps, pdf, svg, jpg, png, x11) can also be obtained with the -device command line option (which can be abbreviated to -d). For example, to create a JPEG bitmap file, one can use:
+
+\preglecode{}
+\begin{Verbatim}
+gle -d jpg -r 200 test.gle
+\end{Verbatim}
+\postglecode{}
+
+Help about the available command line options can be obtained with:
+
+\preglecode{}
+\begin{Verbatim}
+gle -help
+\end{Verbatim}
+\postglecode{}
+
+\noindent{}and to obtain more information about a particular option, use:
+
+\preglecode{}
+\begin{Verbatim}
+gle -help option
+\end{Verbatim}
+\postglecode{}
+
+The following command line options are supported by GLE:
+
+\preglecode{}
+\begin{Verbatim}
+ -help Shows help about command line options
+ -info Outputs software version, build date, GLE\_TOP, GLE\_BIN, etc.
+ -verbosity Sets the verbosity level of GLE console output
+ -device Selects output device(s)
+ -cairo Use cairo output device
+ -resolution Sets the resolution for bitmap and PDF output
+ -fullpage Selects full page output
+ -landscape Selects full page landscape output
+ -output Specifies the name of the output file
+ -nosave Don't write output file to disk (dry-run)
+ -preview Previews the output with QGLE
+ -gs Previews the output with GhostScript
+ -version Selects a GLE version to run
+ -compatibility Selects a GLE compatibility mode
+ -calc Runs GLE in "calculator" mode
+ -catcsv Pretty print a CSV file to standard output
+ -tex Indicates that the script includes LaTeX expressions
+ -inc Creates an .inc file with LaTeX code
+ -texincprefix Adds the given subdirectory to the path in the .inc file
+ -mkinittex Creates "inittex.ini" from "init.tex"
+ -finddeps Automatically finds dependencies
+ -nocolor Forces grayscale output
+ -transparent Creates transparent output (with -d png)
+ -noctrl-d Excludes CTRL-D from the PostScript output
+ -nomaxpath Disables the upper-bound on the drawing path complexity
+ -noligatures Disable the use of ligatures for 'fl' and 'fi'
+ -gsoptions Specify additional options for GhostScript
+ -safemode Disables reading/writing to the file system
+ -allowread Allows reading from the given path
+ -allowwrite Allows writing to the given path
+ -keep Don't delete temporary files
+\end{Verbatim}
+\postglecode{}
+
+\section{Drawing a Simple Graph}
+
+This section shows how to go about drawing a simple graph. Enter the following data in a new file and save it as ``test.csv''. Note that you can export files in CSV (comma separated values) format with most spread sheet programs.
+
+\preglecode{}
+\begin{Verbatim}
+1,2
+2,6
+3,2
+4,5
+5,9
+\end{Verbatim}
+\postglecode{}
+
+\index{data} \index{files}
+The data is in two columns with a comma separating each column of numbers. The following commands will draw a simple line graph of the data.
+
+\preglegraph{}
+\begin{minipage}[c]{8cm}
+\begin{Verbatim}
+size 7 4
+begin graph
+ title "Simple Graph"
+ xtitle "Time"
+ ytitle "Output"
+ data "test.csv"
+ d1 line marker triangle color red
+end graph
+\end{Verbatim}
+\end{minipage}
+\hfill
+\begin{minipage}[c]{7cm}
+\mbox{\input{tutorial/fig/tut_graph.inc}}
+\end{minipage}
+\postglegraph{}
+
+The commands {\sf title}, {\sf xtitle}, and {\sf ytitle} specify the graph title and the axis titles. The command {\sf data} loads the data file and the {\sf d1} command specifies how the first curve on the graph should look like. These commands are discussed in detail in Chapter~\ref{graph:chap}. Possible values for the {\sf marker} option can be found on the GLE wall reference chart in Appendix~\ref{wallref:sec}.
+
+The axis ranges can be specified with ``{\sf xaxis min $v_0$ max $v_1$}'' and ``{\sf yaxis min $v_0$ max $v_1$}''. A smooth line can be drawn through the data points by changing the d1 command to: ``{\sf d1 line smooth}'' as in the following example.
+
+\preglegraph{}
+\begin{minipage}[c]{8cm}
+\begin{Verbatim}
+size 7 4
+begin graph
+ title "Smooth Graph"
+ xtitle "Time"
+ ytitle "Output"
+ data "test.csv"
+ yaxis min 0 max 10
+ d1 line smooth color red
+end graph
+\end{Verbatim}
+\end{minipage}
+\hfill
+\begin{minipage}[c]{7cm}
+\mbox{\input{tutorial/fig/tut_graph2.inc}}
+\end{minipage}
+\postglegraph{}
+
+Note that the order of the commands is not important, except that {\sf circle} is a parameter for the option {\sf marker} and therefore must come right after it. The same holds for line and smooth and color and blue in the example ``d1 marker circle line smooth color blue''.
+
+It is simple to change to a bar graph and include last year's measurements:
+
+\preglegraph{}
+\begin{minipage}[c]{8cm}
+\begin{Verbatim}
+size 7 4
+begin graph
+ title "Bar Graph"
+ xtitle "Measurement"
+ ytitle "Output"
+ data "year-2000.csv"
+ data "year-2001.csv"
+ key pos tl
+ bar d1,d2 fill red,blue
+end graph
+\end{Verbatim}
+\end{minipage}
+\hfill
+\begin{minipage}[c]{7cm}
+\mbox{\input{tutorial/fig/tut_graph3.inc}}
+\end{minipage}
+\postglegraph{}
+
+Adding min and max values on the axis commands is highly recommended because by default GLE won't start from the origin unless the data happens to be very close to zero. It is also difficult to compare graphs unless they all have the same axis ranges. More information about the graph module is available in Chapter~\ref{graph:chap}.
+
diff --git a/gle-refman/utilities/contour.tex b/gle-refman/utilities/contour.tex
new file mode 100644
index 0000000..308fd5d
--- /dev/null
+++ b/gle-refman/utilities/contour.tex
@@ -0,0 +1,160 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% GLE - Graphics Layout Engine <http://www.gle-graphics.org/> %
+% %
+% Modified BSD License %
+% %
+% Copyright (C) 2009 GLE. %
+% %
+% Redistribution and use in source and binary forms, with or without %
+% modification, are permitted provided that the following conditions %
+% are met: %
+% %
+% 1. Redistributions of source code must retain the above copyright %
+% notice, this list of conditions and the following disclaimer. %
+% %
+% 2. Redistributions in binary form must reproduce the above %
+% copyright notice, this list of conditions and the following %
+% disclaimer in the documentation and/or other materials provided with %
+% the distribution. %
+% %
+% 3. The name of the author may not be used to endorse or promote %
+% products derived from this software without specific prior written %
+% permission. %
+% %
+% THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR %
+% IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED %
+% WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE %
+% ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY %
+% DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL %
+% DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE %
+% GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS %
+% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER %
+% IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR %
+% OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN %
+% IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\section{Contour}
+\index{contour}
+\index{.z file}
+
+The contour block produces contour lines of a function $z = f(x,y)$.
+
+The function $f(x,y)$ is given by a .z file. The .z file format is discussed on page~\pageref{zfile:pg}. Recall that a .z file can be created from sample data points, that is $(x,y,z)$ tuples, with the {\sf fitz} block (Section~\ref{fitz:sec}), or from an implicit definition of $f(x,y)$ with a {\sf letz} block (Section~\ref{letz:sec}).
+
+\begin{minipage}[c]{8cm}
+\begin{Verbatim}
+include "contour.gle"
+
+begin contour
+ data "saddle.z"
+ values 0.5 1 1.5 2 3
+end contour
+
+begin graph
+ title "Saddle Plot Contour Lines"
+ data "saddle-cdata.dat"
+ d1 line color blue
+end graph
+
+contour_labels "saddle-clabels.dat" "fix 1"
+\end{Verbatim}
+\end{minipage}
+\hfill
+\begin{minipage}[c]{7cm}
+\mbox{\input{utilities/fig/saddle-contour.inc}}
+\end{minipage}
+
+The contour block can contain the following commands:
+
+\begin{commanddescription}
+\item[{\sf data {\it file\$}}]\index{data} Specifies the name of the .z file.
+
+\item[{\sf values $v_1,\ldots, v_n$}]\index{values} Specifies the z-values to contour at.
+
+\item[{\sf values from $v_1$ to $v_n$ step $s$}] Specifies the z-values to contour at by means of from/to/step.
+
+\item[{\sf smooth {\it integer}}]\index{smooth} Specifies the smoothing parameter.
+\end{commanddescription}
+
+The contour block creates the files ``data-clabels.dat'' and ``data-cdata.dat'' with the prefix ``data'' the name of the .z file. The file ``data-clabels.dat'' contains information for drawing labels on the contour plot. This is done by the subroutine {\sf contour\_labels} defined in the library ``contour.gle'' in the example above. The file ``data-cdata.dat'' contains the $(x,y)$ values of the contour lines. This file can be used as input to a graph block and plotted with the ``d1 line' [...]
+
+\section{Color Maps}
+\label{colormap}
+\index{colormap}
+
+Color maps plot a function $z = f(x,y)$ by mapping $z$ to a color range. The following example combines a color map with a contour plot.
+
+\begin{minipage}[c]{8cm}
+\begin{Verbatim}
+begin contour
+ data "volcano.z"
+ values from 130 to 190 step 10
+end contour
+
+begin graph
+ title "Auckland's Maunga Whau Volcano"
+ data "volcano-cdata.dat"
+ xaxis min 0 max 20
+ yaxis min 0 max 20
+ d1 line color black
+ colormap "volcano.z" 100 100
+end graph
+\end{Verbatim}
+\end{minipage}
+\hfill
+\begin{minipage}[c]{7cm}
+\mbox{\input{utilities/fig/volcano.inc}}
+\end{minipage}
+
+The options to the colormap command are as follows:
+
+\begin{commanddescription}
+\item[{\sf colormap {\it fct} {\it pixels-x} {\it pixels-y} [color] [invert] [zmin $z_1$] [zmax $z_2$] [palette {\it pal}]}]
+
+\mbox{}\\
+\begin{itemize}
+\item {\it fct} specifies the function to map. This can either be the name of a .z file, or it can be a function definition $f(x,y)$.
+
+\item {\it pixels-x}, {\it pixels-x} specify the dimension of the color map. A color map is a stored as a bitmap image and ({\it pixels-x}, {\it pixels-x}) are the resolution of this bitmap. A larger resolution yields more detail, but at the cost of longer computation time and a larger file size.
+
+\item {\it color} is an optional argument and indicates that the color map should be drawn in color (as opposed to grayscale).
+
+\item {\it invert} is an optional argument that inverts the color map. That is, large function values will be drawn in black and small function values in white.
+
+\item {\it zmin}, {\it zmax} are optional arguments that specify the range of the function.
+
+\item {\it palette} is an optional argument that specifies the palette to use. A palette is a subroutine that maps $z$ values to colors. A number of example palette subroutines are included in the library ``color.gle''.
+\end{itemize}
+\end{commanddescription}
+
+The following example is a color map of a two dimensional Gaussian.
+
+\preglegraph{}
+\begin{minipage}[c]{8cm}
+\begin{Verbatim}
+include "color.gle"
+
+sub gauss x y
+ s = 0.75
+ return exp(-(x^2+y^2)/(2*s^2))
+end sub
+
+begin graph
+ title "2D Gaussian"
+ xaxis min -2 max 2
+ yaxis min -2 max 2
+ colormap gauss(x,y) 200 200 zmin 0 zmax 1 color
+end graph
+
+amove xg(xgmax)+0.3 yg(ygmin)
+color_range_vertical zmin 0 zmax 1 zstep 0.1 format "fix 1"
+\end{Verbatim}
+\end{minipage}
+\hfill
+\begin{minipage}[c]{7cm}
+\mbox{\input{utilities/fig/gaussian.inc}}
+\end{minipage}
+\postglegraph{}
diff --git a/gle-refman/utilities/fig/Makefile.gcc b/gle-refman/utilities/fig/Makefile.gcc
new file mode 100644
index 0000000..448b324
--- /dev/null
+++ b/gle-refman/utilities/fig/Makefile.gcc
@@ -0,0 +1,58 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+EPSS = xyz.pdf fitls.pdf fitz1.pdf jack.pdf saddle.pdf \
+ surf1.pdf surf2.pdf surf3.pdf surf4.pdf surf5.pdf surf5b.pdf saddle-contour.inc volcano.inc \
+ gaussian.inc
+
+ifeq ($(RUNBUILD),1)
+ GLE = ../../../build/bin/gle
+else
+ GLE = gle
+endif
+
+all: $(EPSS)
+
+%.pdf: %.gle
+ $(GLE) -d pdf $<
+
+%.inc: %.gle
+ $(GLE) -texincprefix utilities/fig/ -inc -d pdf $<
+
+clean:
+ rm -rf *.pdf *.inc .gle fitz.z saddle.z saddle-c*.dat volcano-c*.dat
diff --git a/gle-refman/utilities/fig/Makefile.os2 b/gle-refman/utilities/fig/Makefile.os2
new file mode 100644
index 0000000..6a00e0c
--- /dev/null
+++ b/gle-refman/utilities/fig/Makefile.os2
@@ -0,0 +1,48 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+EPSS = xyz.eps fitls.eps fitz1.eps jack.eps saddle.eps \
+ surf1.eps surf2.eps surf3.eps surf4.eps surf5.eps surf5b.eps
+
+all: $(EPSS)
+
+%.eps: %.gle
+ gle -d eps $<
+
+clean:
+ rm -rf *.eps *.pdf *.inc
diff --git a/gle-refman/utilities/fig/fitls.dat b/gle-refman/utilities/fig/fitls.dat
new file mode 100644
index 0000000..b6ecb80
--- /dev/null
+++ b/gle-refman/utilities/fig/fitls.dat
@@ -0,0 +1,46 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+1 2
+2 5
+3 5
+4 6
+5 4
+6 3
+7 6
+8 9
+9 10
diff --git a/gle-refman/utilities/fig/fitls.gle b/gle-refman/utilities/fig/fitls.gle
new file mode 100644
index 0000000..3fafe6f
--- /dev/null
+++ b/gle-refman/utilities/fig/fitls.gle
@@ -0,0 +1,47 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 8 5
+begin graph
+ size 8 5
+ title "y = sin(-0.638262*x)*-2.81719+0.140722*x^2+1.11256, fit = 0.938389" hei .25
+ data fitls.dat d1=c1,c2
+ d1 marker dot msize .3
+ let d2 = sin(-0.638262*x)*-2.81719+0.140722*x^2+1.11256 from 1 to 9 step 8.000000e-02
+ d2 line
+end graph
diff --git a/gle-refman/utilities/fig/fitz.dat b/gle-refman/utilities/fig/fitz.dat
new file mode 100644
index 0000000..d81b8e2
--- /dev/null
+++ b/gle-refman/utilities/fig/fitz.dat
@@ -0,0 +1,45 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+0 0 1
+1 1 1.5
+1 4 1
+4 4 1.2
+4 1 1
+2 2 2
+3 3 1
+4.5 4.5 1
diff --git a/gle-refman/utilities/fig/fitz1.gle b/gle-refman/utilities/fig/fitz1.gle
new file mode 100644
index 0000000..104f347
--- /dev/null
+++ b/gle-refman/utilities/fig/fitz1.gle
@@ -0,0 +1,63 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 7 5 ! run SURFACE to create FITZ1.BIG
+
+begin fitz
+ data "fitz.dat"
+ x from 0 to 5 step 0.2
+ y from 0 to 5 step 0.2
+ ncontour 6
+end fitz
+
+begin translate -0.1 -0.65
+ begin surface
+ size 7 7
+ data "fitz.z"
+ top color blue
+ xaxis min 0 max 5 step 1 hei .2
+ yaxis min 0 max 5 step 1 hei .2
+ zaxis step 0.5 hei 0.2
+ zaxis min 0 max 2.5
+ points "fitz.dat"
+ droplines lstyle 1
+ marker circle
+ view 2.5 3 .3
+ harray 5000
+ end surface
+end translate
diff --git a/gle-refman/utilities/fig/fitz1/fitz1.big b/gle-refman/utilities/fig/fitz1/fitz1.big
new file mode 100644
index 0000000..4dc4dff
--- /dev/null
+++ b/gle-refman/utilities/fig/fitz1/fitz1.big
@@ -0,0 +1,797 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+amove 2.5 3
+set hei 0.3
+set color BLACK
+set lstyle 1
+set color BLACK
+set lstyle 1
+amove 2.38889 2.12305
+aline 2.53333 2.08167
+amove 2.53333 2.08167
+aline 2.67222 2.0471
+amove 2.67222 2.0471
+aline 2.81111 2.02005
+amove 2.81111 2.02005
+aline 2.94444 2.00089
+amove 2.94444 2.00089
+aline 3.07778 1.99375
+amove 3.07778 1.99375
+aline 3.20556 2.0018
+amove 3.20556 2.0018
+aline 3.33333 2.02566
+amove 3.33333 2.02566
+aline 3.46111 2.06415
+amove 3.46111 2.06415
+aline 3.58333 2.04739
+amove 3.58333 2.04739
+aline 3.69444 1.9564
+amove 3.69444 1.9564
+aline 3.81111 1.86209
+amove 3.81111 1.86209
+aline 3.92222 1.82835
+amove 3.92222 1.82835
+aline 4.03889 1.91161
+amove 4.03889 1.91161
+aline 4.16111 2.16261
+amove 2.38889 2.12305
+aline 2.28333 2.39516
+amove 2.53333 2.08167
+aline 2.42778 2.36062
+amove 2.67222 2.0471
+aline 2.57222 2.32016
+amove 2.81111 2.02005
+aline 2.71111 2.27866
+amove 2.94444 2.00089
+aline 2.84444 2.2436
+amove 3.07778 1.99375
+aline 2.97778 2.21336
+amove 3.20556 2.0018
+aline 3.10556 2.16977
+amove 3.33333 2.02566
+aline 3.22778 2.11437
+amove 3.46111 2.06415
+aline 3.35 2.05424
+amove 3.58333 2.04739
+aline 3.58333 2.04739
+amove 3.69444 1.9564
+aline 3.69444 1.9564
+amove 3.81111 1.86209
+aline 3.81111 1.86209
+amove 3.92222 1.82835
+aline 3.81667 1.96786
+amove 4.03889 1.91161
+aline 3.93333 2.02144
+amove 4.16111 2.16261
+aline 4.04444 2.09219
+amove 2.28333 2.39516
+aline 2.42778 2.36062
+amove 2.42778 2.36062
+aline 2.56667 2.32171
+amove 2.57222 2.32016
+aline 2.70556 2.28032
+amove 2.71111 2.27866
+aline 2.84444 2.2436
+amove 2.84444 2.2436
+aline 2.97778 2.21336
+amove 2.97778 2.21336
+aline 3.10556 2.16977
+amove 3.10556 2.16977
+aline 3.22222 2.11689
+amove 3.22778 2.11437
+aline 3.34444 2.05697
+amove 3.35 2.05424
+aline 3.35 2.05424
+amove 3.70556 1.94918
+aline 3.81111 1.96692
+amove 3.81667 1.96786
+aline 3.93333 2.02144
+amove 3.93333 2.02144
+aline 4.04444 2.09219
+amove 2.28333 2.39516
+aline 2.18333 2.56714
+amove 2.42778 2.36062
+aline 2.32778 2.55921
+amove 2.57222 2.32016
+aline 2.46667 2.53395
+amove 2.71111 2.27866
+aline 2.60556 2.49707
+amove 2.84444 2.2436
+aline 2.74444 2.51827
+amove 2.97778 2.21336
+aline 2.87222 2.488
+amove 3.10556 2.16977
+aline 3.00556 2.47339
+amove 3.22778 2.11437
+aline 3.13333 2.46025
+amove 3.35 2.05424
+aline 3.25556 2.4034
+amove 3.45 2.0713
+aline 3.37222 2.32267
+amove 3.55556 2.05338
+aline 3.48889 2.23823
+amove 3.69444 1.96119
+aline 3.60556 2.16827
+amove 3.81667 1.96786
+aline 3.71667 2.1272
+amove 3.93333 2.02144
+aline 3.82778 2.13309
+amove 4.04444 2.09219
+aline 3.93889 2.14885
+amove 2.18333 2.56714
+aline 2.32778 2.55921
+amove 2.32778 2.55921
+aline 2.46111 2.53496
+amove 2.46667 2.53395
+aline 2.6 2.49855
+amove 2.60556 2.49707
+aline 2.73889 2.51742
+amove 2.74444 2.51827
+aline 2.87222 2.488
+amove 2.87222 2.488
+aline 3.00556 2.47339
+amove 3.00556 2.47339
+aline 3.13333 2.46025
+amove 3.13333 2.46025
+aline 3.25556 2.4034
+amove 3.25556 2.4034
+aline 3.37222 2.32267
+amove 3.37222 2.32267
+aline 3.48333 2.24225
+amove 3.48889 2.23823
+aline 3.6 2.1716
+amove 3.60556 2.16827
+aline 3.71667 2.1272
+amove 3.71667 2.1272
+aline 3.82778 2.13309
+amove 3.82778 2.13309
+aline 3.93889 2.14885
+amove 2.18333 2.56714
+aline 2.08333 2.65048
+amove 2.32778 2.55921
+aline 2.22778 2.68201
+amove 2.46667 2.53395
+aline 2.36667 2.68557
+amove 2.60556 2.49707
+aline 2.50556 2.7133
+amove 2.74444 2.51827
+aline 2.64444 2.81938
+amove 2.87222 2.488
+aline 2.77778 2.86695
+amove 3.00556 2.47339
+aline 2.90556 2.80168
+amove 3.13333 2.46025
+aline 3.03333 2.72125
+amove 3.25556 2.4034
+aline 3.15556 2.65738
+amove 3.37222 2.32267
+aline 3.27778 2.57026
+amove 3.48889 2.23823
+aline 3.39444 2.45207
+amove 3.60556 2.16827
+aline 3.50556 2.3402
+amove 3.71667 2.1272
+aline 3.61667 2.26481
+amove 3.82778 2.13309
+aline 3.72778 2.24022
+amove 3.93889 2.14885
+aline 3.83889 2.2778
+amove 2.08333 2.65048
+aline 2.22778 2.68201
+amove 2.22778 2.68201
+aline 2.36111 2.68543
+amove 2.36667 2.68557
+aline 2.5 2.71219
+amove 2.50556 2.7133
+aline 2.63889 2.81514
+amove 2.64444 2.81938
+aline 2.77222 2.86497
+amove 2.77778 2.86695
+aline 2.90556 2.80168
+amove 2.90556 2.80168
+aline 3.03333 2.72125
+amove 3.03333 2.72125
+aline 3.15 2.66028
+amove 3.15556 2.65738
+aline 3.27778 2.57026
+amove 3.27778 2.57026
+aline 3.39444 2.45207
+amove 3.39444 2.45207
+aline 3.50556 2.3402
+amove 3.50556 2.3402
+aline 3.61111 2.26858
+amove 3.61667 2.26481
+aline 3.72778 2.24022
+amove 3.72778 2.24022
+aline 3.83333 2.27592
+amove 2.08333 2.65048
+aline 1.98889 2.66287
+amove 2.22778 2.68201
+aline 2.12778 2.74034
+amove 2.36667 2.68557
+aline 2.27222 2.78051
+amove 2.50556 2.7133
+aline 2.40556 2.96232
+amove 2.64444 2.81938
+aline 2.54444 3.11152
+amove 2.77778 2.86695
+aline 2.67778 3.26615
+amove 2.90556 2.80168
+aline 2.81111 3.2208
+amove 3.03333 2.72125
+aline 2.93333 3.07554
+amove 3.15556 2.65738
+aline 3.06111 2.9005
+amove 3.27778 2.57026
+aline 3.17778 2.73464
+amove 3.39444 2.45207
+aline 3.29444 2.59245
+amove 3.50556 2.3402
+aline 3.40556 2.47525
+amove 3.61667 2.26481
+aline 3.51667 2.38913
+amove 3.72778 2.24022
+aline 3.62778 2.34239
+amove 3.83889 2.2778
+aline 3.73889 2.42937
+amove 1.98889 2.66287
+aline 2.12222 2.73724
+amove 2.12778 2.74034
+aline 2.27222 2.78051
+amove 2.27222 2.78051
+aline 2.4 2.95475
+amove 2.40556 2.96232
+aline 2.53889 3.10555
+amove 2.54444 3.11152
+aline 2.67222 3.25971
+amove 2.67778 3.26615
+aline 2.80556 3.22269
+amove 2.81111 3.2208
+aline 2.92778 3.08214
+amove 2.93333 3.07554
+aline 3.05556 2.90811
+amove 3.06111 2.9005
+aline 3.17778 2.73464
+amove 3.17778 2.73464
+aline 3.29444 2.59245
+amove 3.29444 2.59245
+aline 3.4 2.48111
+amove 3.40556 2.47525
+aline 3.51667 2.38913
+amove 3.51667 2.38913
+aline 3.62222 2.34472
+amove 3.62778 2.34239
+aline 3.73333 2.42502
+amove 1.98889 2.66287
+aline 1.89444 2.62546
+amove 2.12778 2.74034
+aline 2.03333 2.74997
+amove 2.27222 2.78051
+aline 2.17222 2.82935
+amove 2.40556 2.96232
+aline 2.31111 3.21503
+amove 2.54444 3.11152
+aline 2.44444 3.37321
+amove 2.67778 3.26615
+aline 2.57778 3.58631
+amove 2.81111 3.2208
+aline 2.71111 3.58015
+amove 2.93333 3.07554
+aline 2.83889 3.4212
+amove 3.06111 2.9005
+aline 2.96111 3.18057
+amove 3.17778 2.73464
+aline 3.08333 2.92569
+amove 3.29444 2.59245
+aline 3.19444 2.724
+amove 3.40556 2.47525
+aline 3.31111 2.59634
+amove 3.51667 2.38913
+aline 3.42222 2.50433
+amove 3.62778 2.34239
+aline 3.52778 2.44077
+amove 3.73889 2.42937
+aline 3.64444 2.55643
+amove 1.89444 2.62546
+aline 2.03333 2.74997
+amove 2.03333 2.74997
+aline 2.17222 2.82935
+amove 2.17222 2.82935
+aline 2.30556 3.19961
+amove 2.31111 3.21503
+aline 2.44444 3.37321
+amove 2.44444 3.37321
+aline 2.57778 3.58631
+amove 2.57778 3.58631
+aline 2.70556 3.5804
+amove 2.71111 3.58015
+aline 2.83333 3.42811
+amove 2.83889 3.4212
+aline 2.96111 3.18057
+amove 2.96111 3.18057
+aline 3.08333 2.92569
+amove 3.08333 2.92569
+aline 3.18889 2.73408
+amove 3.19444 2.724
+aline 3.30556 2.60242
+amove 3.31111 2.59634
+aline 3.42222 2.50433
+amove 3.42222 2.50433
+aline 3.52222 2.44412
+amove 3.52778 2.44077
+aline 3.64444 2.55643
+amove 1.89444 2.62546
+aline 1.80556 2.56045
+amove 2.03333 2.74997
+aline 1.94444 2.72881
+amove 2.17222 2.82935
+aline 2.08333 2.84578
+amove 2.31111 3.21503
+aline 2.21111 3.43109
+amove 2.44444 3.37321
+aline 2.35 3.57189
+amove 2.57778 3.58631
+aline 2.48333 3.79086
+amove 2.71111 3.58015
+aline 2.61667 3.78425
+amove 2.83889 3.4212
+aline 2.74444 3.64361
+amove 2.96111 3.18057
+aline 2.86667 3.40085
+amove 3.08333 2.92569
+aline 3.08333 2.92569
+amove 3.19444 2.724
+aline 3.19444 2.724
+amove 3.31111 2.59634
+aline 3.21111 2.71693
+amove 3.42222 2.50433
+aline 3.32222 2.61545
+amove 3.52778 2.44077
+aline 3.43333 2.53746
+amove 3.64444 2.55643
+aline 3.54444 2.61363
+amove 1.80556 2.56045
+aline 1.93889 2.72207
+amove 1.94444 2.72881
+aline 2.07778 2.8411
+amove 2.08333 2.84578
+aline 2.21111 3.43109
+amove 2.21111 3.43109
+aline 2.35 3.57189
+amove 2.35 3.57189
+aline 2.48333 3.79086
+amove 2.48333 3.79086
+aline 2.61667 3.78425
+amove 2.61667 3.78425
+aline 2.74444 3.64361
+amove 2.74444 3.64361
+aline 2.86111 3.41188
+amove 2.86667 3.40085
+aline 2.86667 3.40085
+amove 3.13889 2.82515
+aline 3.21111 2.71693
+amove 3.21111 2.71693
+aline 3.31667 2.62052
+amove 3.32222 2.61545
+aline 3.43333 2.53746
+amove 3.43333 2.53746
+aline 3.54444 2.61363
+amove 1.80556 2.56045
+aline 1.72222 2.48885
+amove 1.94444 2.72881
+aline 1.85556 2.69478
+amove 2.08333 2.84578
+aline 1.98889 2.90973
+amove 2.21111 3.43109
+aline 2.11667 3.56982
+amove 2.35 3.57189
+aline 2.25556 3.67515
+amove 2.48333 3.79086
+aline 2.38889 3.86045
+amove 2.61667 3.78425
+aline 2.51667 3.83669
+amove 2.74444 3.64361
+aline 2.74444 3.64361
+amove 2.86667 3.40085
+aline 2.86667 3.40085
+amove 3.21111 2.71693
+aline 3.12222 2.856
+amove 3.32222 2.61545
+aline 3.23333 2.72768
+amove 3.43333 2.53746
+aline 3.33889 2.63472
+amove 3.54444 2.61363
+aline 3.45 2.6298
+amove 1.72222 2.48885
+aline 1.85556 2.69478
+amove 1.85556 2.69478
+aline 1.98333 2.90077
+amove 1.98889 2.90973
+aline 2.11111 3.54112
+amove 2.11667 3.56982
+aline 2.25 3.67093
+amove 2.25556 3.67515
+aline 2.38889 3.86045
+amove 2.38889 3.86045
+aline 2.51667 3.83669
+amove 2.51667 3.83669
+aline 2.51667 3.83669
+amove 3.1 2.89545
+aline 3.12222 2.856
+amove 3.12222 2.856
+aline 3.22778 2.73409
+amove 3.23333 2.72768
+aline 3.33889 2.63472
+amove 3.33889 2.63472
+aline 3.45 2.6298
+amove 1.72222 2.48885
+aline 1.63889 2.42888
+amove 1.85556 2.69478
+aline 1.77222 2.66408
+amove 1.98889 2.90973
+aline 1.9 3.02697
+amove 2.11667 3.56982
+aline 2.02778 3.60203
+amove 2.25556 3.67515
+aline 2.16111 3.66269
+amove 2.38889 3.86045
+aline 2.29444 3.7893
+amove 2.51667 3.83669
+aline 2.51667 3.83669
+amove 3.12222 2.856
+aline 3.12222 2.856
+amove 3.23333 2.72768
+aline 3.13889 2.84562
+amove 3.33889 2.63472
+aline 3.25 2.73429
+amove 3.45 2.6298
+aline 3.35556 2.66719
+amove 1.63889 2.42888
+aline 1.77222 2.66408
+amove 1.77222 2.66408
+aline 1.9 3.02697
+amove 1.9 3.02697
+aline 2.02222 3.57703
+amove 2.02778 3.60203
+aline 2.16111 3.66269
+amove 2.16111 3.66269
+aline 2.29444 3.7893
+amove 2.29444 3.7893
+aline 2.29444 3.7893
+amove 3.07778 2.9379
+aline 3.13889 2.84562
+amove 3.13889 2.84562
+aline 3.24444 2.73986
+amove 3.25 2.73429
+aline 3.35 2.67072
+amove 1.63889 2.42888
+aline 1.56111 2.39477
+amove 1.77222 2.66408
+aline 1.68889 2.64981
+amove 1.9 3.02697
+aline 1.81111 3.1196
+amove 2.02778 3.60203
+aline 1.93889 3.52145
+amove 2.16111 3.66269
+aline 2.16111 3.66269
+amove 2.29444 3.7893
+aline 2.29444 3.7893
+amove 3.13889 2.84562
+aline 3.13889 2.84562
+amove 3.25 2.73429
+aline 3.15556 2.83676
+amove 3.35556 2.66719
+aline 3.26111 2.72895
+amove 1.56111 2.39477
+aline 1.68333 2.63872
+amove 1.68889 2.64981
+aline 1.81111 3.1196
+amove 1.81111 3.1196
+aline 1.93333 3.50398
+amove 1.93889 3.52145
+aline 1.93889 3.52145
+amove 3.07778 2.93808
+aline 3.15 2.84399
+amove 3.15556 2.83676
+aline 3.26111 2.72895
+amove 1.56111 2.39477
+aline 1.47778 2.39579
+amove 1.68889 2.64981
+aline 1.60556 2.66083
+amove 1.81111 3.1196
+aline 1.72778 3.14142
+amove 1.93889 3.52145
+aline 1.85556 3.35393
+amove 3.15556 2.83676
+aline 3.15556 2.83676
+amove 3.26111 2.72895
+aline 3.26111 2.72895
+amove 1.47778 2.39579
+aline 1.6 2.64931
+amove 1.60556 2.66083
+aline 1.72778 3.14142
+amove 1.72778 3.14142
+aline 1.85556 3.35393
+amove 1.85556 3.35393
+aline 1.85556 3.35393
+amove 1.47778 2.39579
+aline 1.4 2.43539
+amove 1.60556 2.66083
+aline 1.52778 2.72356
+amove 1.72778 3.14142
+aline 1.65 3.08737
+amove 1.85556 3.35393
+aline 1.85556 3.35393
+amove 1.4 2.43539
+aline 1.52778 2.72356
+amove 1.52778 2.72356
+aline 1.64444 3.07083
+amove 1.65 3.08737
+aline 1.65 3.08737
+amove 1.4 2.43539
+aline 1.32222 2.51026
+amove 1.52778 2.72356
+aline 1.44444 2.80207
+amove 1.65 3.08737
+aline 1.57222 3.00099
+amove 1.32222 2.51026
+aline 1.44444 2.80207
+amove 1.44444 2.80207
+aline 1.56667 2.99234
+amove 1.57222 3.00099
+aline 1.57222 3.00099
+amove 1.32222 2.51026
+aline 1.24444 2.60923
+amove 1.44444 2.80207
+aline 1.36667 2.85348
+amove 1.57222 3.00099
+aline 1.49444 3.03129
+amove 1.67778 3.11572
+aline 1.62222 3.2059
+amove 1.78889 3.25872
+aline 1.74444 3.35563
+amove 1.88889 3.42959
+aline 1.87222 3.46376
+amove 1.24444 2.60923
+aline 1.36667 2.85348
+amove 1.36667 2.85348
+aline 1.49444 3.03129
+amove 1.49444 3.03129
+aline 1.62222 3.2059
+amove 1.62222 3.2059
+aline 1.74444 3.35563
+amove 1.74444 3.35563
+aline 1.86667 3.45906
+amove 1.87222 3.46376
+aline 1.92778 3.49973
+amove 1.24444 2.60923
+aline 1.16667 2.71194
+amove 1.36667 2.85348
+aline 1.29444 2.92985
+amove 1.49444 3.03129
+aline 1.41667 3.10749
+amove 1.62222 3.2059
+aline 1.53889 3.25433
+amove 1.74444 3.35563
+aline 1.66667 3.37596
+amove 1.87222 3.46376
+aline 1.78889 3.47467
+amove 1.96111 3.54588
+aline 1.91111 3.55037
+amove 1.16667 2.71194
+aline 1.29444 2.92985
+amove 1.29444 2.92985
+aline 1.41667 3.10749
+amove 1.41667 3.10749
+aline 1.53333 3.24766
+amove 1.53889 3.25433
+aline 1.66667 3.37596
+amove 1.66667 3.37596
+aline 1.78333 3.47019
+amove 1.78889 3.47467
+aline 1.91111 3.55037
+amove 1.91111 3.55037
+aline 2.01667 3.59438
+set color BLACK
+set lstyle 1
+set color BLACK
+set lstyle 1
+amove 4.12222 1.4826
+aline 3.13889 1.9976
+amove 2.52778 2.08327
+aline 1.21111 1.6906
+amove 1.16111 2.81201
+aline 1.11667 3.80881
+amove 1.21111 1.6906
+aline 1.11667 3.80881
+amove 1.11667 3.80881
+aline 2.84444 4.09087
+amove 1.11667 3.80881
+aline 1.16111 3.81607
+amove 2.84444 4.09087
+aline 2.83333 3.46705
+amove 2.84444 4.09087
+aline 4.24444 3.68445
+amove 4.16667 3.70703
+aline 4.24444 3.68445
+amove 4.24444 3.68445
+aline 4.15556 2.15926
+amove 4.24444 3.68445
+aline 4.16111 2.16261
+amove 4.15556 2.1512
+aline 4.12222 1.4826
+amove 1.21631 1.6906
+aline 2.39531 0.829544
+amove 2.39531 0.829544
+aline 4.12386 1.4826
+set just BC
+set color BLACK
+set hei 0.2
+set just TC
+amove 1.21631 1.6906
+aline 1.21336 1.68656
+amove 1.15439 1.6058
+rotate -36.1417
+text 0
+rotate 36.1417
+amove 1.44599 1.52286
+aline 1.44304 1.51882
+amove 1.38407 1.43806
+rotate -36.1417
+text 1
+rotate 36.1417
+amove 1.69245 1.34286
+aline 1.68951 1.33882
+amove 1.63053 1.25807
+rotate -36.1417
+text 2
+rotate 36.1417
+amove 1.95761 1.14921
+aline 1.95466 1.14517
+amove 1.89568 1.06442
+rotate -36.1417
+text 3
+rotate 36.1417
+amove 2.24366 0.940299
+aline 2.24071 0.936261
+amove 2.18173 0.855505
+rotate -36.1417
+text 4
+rotate 36.1417
+set just TC
+set color BLACK
+set hei 0.2
+set just TC
+amove 2.39531 0.829544
+aline 2.39708 0.824866
+amove 2.43242 0.73132
+rotate 20.697
+text 0
+rotate -20.697
+amove 2.8176 0.989086
+aline 2.81936 0.984409
+amove 2.8547 0.890863
+rotate 20.697
+text 1
+rotate -20.697
+amove 3.21657 1.13982
+aline 3.21833 1.13514
+amove 3.25368 1.0416
+rotate 20.697
+text 2
+rotate -20.697
+amove 3.59411 1.28246
+aline 3.59587 1.27778
+amove 3.63122 1.18423
+rotate 20.697
+text 3
+rotate -20.697
+amove 3.95189 1.41763
+aline 3.95366 1.41296
+amove 3.989 1.31941
+rotate 20.697
+text 4
+rotate -20.697
+set just TC
+set color BLACK
+set hei 0.2
+set just RC
+amove 1.21631 1.6906
+aline 1.21132 1.69037
+amove 1.11142 1.6859
+text 0
+amove 1.19382 2.19232
+aline 1.18883 2.1921
+amove 1.08893 2.18762
+text 0.5
+amove 1.17053 2.71194
+aline 1.16554 2.71171
+amove 1.06564 2.70723
+text 1
+amove 1.1464 3.25042
+aline 1.1414 3.25019
+amove 1.0415 3.24571
+text 1.5
+amove 1.12137 3.80881
+aline 1.11638 3.80859
+amove 1.01648 3.80411
+text 2
+set just BC
+set color BLACK
+set lstyle 1
+set color BLACK
+set lstyle 1
+set color BLACK
+set lstyle 1
+set color BLACK
+set hei 0.0833333
+amove 1.17053 2.71194
+marker CIRCLE
+amove 1.80496 3.21871
+marker CIRCLE
+amove 2.93054 2.94741
+marker CIRCLE
+amove 3.81176 2.02473
+marker CIRCLE
+amove 2.66861 2.22423
+marker CIRCLE
+amove 2.47626 3.75495
+marker CIRCLE
+amove 3.14986 2.60065
+marker CIRCLE
+amove 4.18439 2.54248
+marker CIRCLE
+set color BLACK
+set lstyle 1
+amove 1.17053 2.71194
+aline 1.21631 1.6906
+amove 1.80496 3.21871
+aline 1.84119 1.6459
+amove 2.93054 2.94741
+aline 2.91662 1.98071
+amove 3.81176 2.02473
+aline 3.78831 1.50661
+amove 2.66861 2.22423
+aline 2.66208 1.0937
+amove 2.47626 3.75495
+aline 2.47792 1.60035
+amove 3.14986 2.60065
+aline 3.12684 1.55393
+amove 4.18439 2.54248
+aline 4.12386 1.4826
diff --git a/gle-refman/utilities/fig/fitz1/fitz1.dat b/gle-refman/utilities/fig/fitz1/fitz1.dat
new file mode 100644
index 0000000..ce0b4d4
--- /dev/null
+++ b/gle-refman/utilities/fig/fitz1/fitz1.dat
@@ -0,0 +1,45 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ 0 0 1
+ 1 1 1.5
+ 1 4 1
+ 4 4 .5
+ 4 1 1
+ 2 2 2
+ 3 3 1
+ 4.5 4.5 1
diff --git a/gle-refman/utilities/fig/fitz1/fitz1.sur b/gle-refman/utilities/fig/fitz1/fitz1.sur
new file mode 100644
index 0000000..3e50934
--- /dev/null
+++ b/gle-refman/utilities/fig/fitz1/fitz1.sur
@@ -0,0 +1,50 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+begin surface
+ size 5 5
+ data fitz1.z
+ xaxis step 1 hei .2
+ yaxis step 1 hei .2
+ zaxis step .5 hei .2
+ zaxis min 0 max 2
+ points fitz1.dat
+ droplines lstyle 1
+ marker circle
+ view 2.5 3 .3
+end surface
diff --git a/gle-refman/utilities/fig/fitz1/fitz1.z b/gle-refman/utilities/fig/fitz1/fitz1.z
new file mode 100644
index 0000000..43ef540
--- /dev/null
+++ b/gle-refman/utilities/fig/fitz1/fitz1.z
@@ -0,0 +1,53 @@
+! nx 15 ny 15 xmin 0 xmax 4.5 ymin 0 ymax 4.5
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+1 0.943856 0.893036 0.866349 0.873519 0.916502 0.990809 1.08683 1.19115 1.28788 1.35997 1.39051 1.36411 1.26816 1.09418
+1.17731 1.14366 1.13457 1.10171 1.08472 1.1155 1.16893 1.23632 1.30576 1.36347 1.39505 1.38684 1.32725 1.20808 1.02594
+1.31767 1.28227 1.29064 1.40552 1.48922 1.50502 1.4597 1.39475 1.37764 1.40216 1.39992 1.36044 1.2759 1.14241 0.9625
+1.43027 1.419 1.33696 1.44853 1.65317 1.83111 1.93014 1.9328 1.84758 1.70013 1.5245 1.35439 1.21432 1.07505 0.904688
+1.52038 1.53375 1.39873 1.4128 1.61088 1.82272 1.96043 1.99984 1.94272 1.80802 1.62309 1.4149 1.20128 1.01232 0.853063
+1.59009 1.61103 1.4845 1.38952 1.57858 1.85156 2.04794 2.13525 2.10425 1.9629 1.72754 1.42712 1.14454 0.953027 0.811418
+1.63913 1.66237 1.5809 1.39148 1.55565 1.83929 2.01552 2.0957 2.07872 1.93607 1.6648 1.34335 1.1008 0.881495 0.782872
+1.66562 1.68608 1.65799 1.41489 1.54303 1.79905 1.92354 1.96802 1.9389 1.7789 1.51507 1.24497 1.05807 0.798603 0.768357
+1.66686 1.67998 1.67464 1.44479 1.53045 1.73101 1.79952 1.79277 1.70632 1.54604 1.33535 1.15947 0.976293 0.710258 0.7672
+1.64009 1.64218 1.62799 1.46034 1.50183 1.62947 1.64008 1.56667 1.43712 1.29286 1.15907 1.0517 0.871753 0.62548 0.71729
+1.58329 1.57189 1.54659 1.44027 1.44057 1.48828 1.4336 1.31854 1.18905 1.08056 1 0.91348 0.761947 0.554489 0.599693
+1.49597 1.47014 1.43299 1.36817 1.335 1.30578 1.20947 1.09747 1.00498 0.932012 0.860578 0.778167 0.663657 0.50679 0.476827
+1.37991 1.34059 1.29272 1.23788 1.18368 1.10851 1.02124 0.946306 0.8788 0.814257 0.74776 0.674618 0.59104 0.489267 0.408486
+1.23997 1.19032 1.13504 1.07533 1.01157 0.946081 0.883998 0.826525 0.773068 0.721907 0.670873 0.618021 0.562308 0.504263 0.449928
+1.08485 1.03063 0.97375 0.914375 0.855139 0.80994 0.788222 0.791876 0.81712 0.803 0.722751 0.620971 0.543156 0.536378 0.64996
diff --git a/gle-refman/utilities/fig/gaussian.gle b/gle-refman/utilities/fig/gaussian.gle
new file mode 100644
index 0000000..d714a68
--- /dev/null
+++ b/gle-refman/utilities/fig/gaussian.gle
@@ -0,0 +1,62 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 7 6
+
+include "color.gle"
+
+include "../../script/manual.gle"
+
+sub gaussian x y
+ local s = 0.75
+ return exp(-(x^2+y^2)/(2*s^2))
+end sub
+
+manual_graph_mode
+begin graph
+ size 6 6
+ scale auto
+ title "2D Gaussian"
+ xaxis min -2 max 2
+ yaxis min -2 max 2
+ colormap gaussian(x,y) 200 200 zmin 0 zmax 1 color
+end graph
+
+set hei 0.3633*0.75
+amove xg(xgmax)+0.3 yg(ygmin)
+color_range_vertical zmin 0 zmax 1 zstep 0.1 format "fix 1"
diff --git a/gle-refman/utilities/fig/jack.gle b/gle-refman/utilities/fig/jack.gle
new file mode 100644
index 0000000..4f37fb3
--- /dev/null
+++ b/gle-refman/utilities/fig/jack.gle
@@ -0,0 +1,43 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 7 5
+begin origin
+box 5 5
+include jack/jack.big
+end origin
diff --git a/gle-refman/utilities/fig/jack/jack.big b/gle-refman/utilities/fig/jack/jack.big
new file mode 100644
index 0000000..932b1da
--- /dev/null
+++ b/gle-refman/utilities/fig/jack/jack.big
@@ -0,0 +1,833 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+amove 9 9
+set hei 0.3
+set color BLACK
+set lstyle 2
+amove 2.41333 3.32369
+aline 2.62 3.07536
+amove 2.62 3.07536
+aline 2.83333 2.89302
+amove 2.83333 2.89302
+aline 3.04 2.77668
+amove 3.04 2.77668
+aline 3.24667 2.72632
+amove 3.24667 2.72632
+aline 3.45333 2.74195
+amove 3.45333 2.74195
+aline 3.66 2.82357
+amove 3.66 2.82357
+aline 3.87333 2.97118
+amove 3.87333 2.97118
+aline 4.08 3.18478
+amove 4.08 3.18478
+aline 4.28667 3.46437
+amove 4.28667 3.46437
+aline 4.49333 3.80995
+amove 2.41333 3.32369
+aline 2.31333 2.90777
+amove 2.62 3.07536
+aline 2.52 2.65944
+amove 2.83333 2.89302
+aline 2.72667 2.4771
+amove 3.04 2.77668
+aline 2.93333 2.36075
+amove 3.24667 2.72632
+aline 3.14 2.31039
+amove 3.45333 2.74195
+aline 3.35333 2.32602
+amove 3.66 2.82357
+aline 3.56 2.40764
+amove 3.87333 2.97118
+aline 3.76667 2.55525
+amove 4.08 3.18478
+aline 3.97333 2.76885
+amove 4.28667 3.46437
+aline 4.18667 3.04844
+amove 4.49333 3.80995
+aline 4.39333 3.39402
+amove 2.31333 2.90777
+aline 2.51333 2.66745
+amove 2.52 2.65944
+aline 2.72667 2.4771
+amove 2.72667 2.4771
+aline 2.92667 2.3645
+amove 2.93333 2.36075
+aline 3.13333 2.31202
+amove 3.14 2.31039
+aline 3.35333 2.32602
+amove 3.35333 2.32602
+aline 3.56 2.40764
+amove 3.56 2.40764
+aline 3.76 2.55049
+amove 3.76667 2.55525
+aline 3.97333 2.76885
+amove 3.97333 2.76885
+aline 4.18667 3.04844
+amove 4.18667 3.04844
+aline 4.38667 3.38287
+amove 2.31333 2.90777
+aline 2.20667 2.55783
+amove 2.52 2.65944
+aline 2.41333 2.3095
+amove 2.72667 2.4771
+aline 2.62 2.12716
+amove 2.93333 2.36075
+aline 2.83333 2.01082
+amove 3.14 2.31039
+aline 3.04 1.96046
+amove 3.35333 2.32602
+aline 3.24667 1.97609
+amove 3.56 2.40764
+aline 3.45333 2.05771
+amove 3.76667 2.55525
+aline 3.66667 2.20532
+amove 3.97333 2.76885
+aline 3.87333 2.41892
+amove 4.18667 3.04844
+aline 4.08 2.69851
+amove 4.39333 3.39402
+aline 4.28667 3.04409
+amove 2.20667 2.55783
+aline 2.40667 2.31751
+amove 2.41333 2.3095
+aline 2.62 2.12716
+amove 2.62 2.12716
+aline 2.83333 2.01082
+amove 2.83333 2.01082
+aline 3.03333 1.96208
+amove 3.04 1.96046
+aline 3.24667 1.97609
+amove 3.24667 1.97609
+aline 3.44667 2.05507
+amove 3.45333 2.05771
+aline 3.66667 2.20532
+amove 3.66667 2.20532
+aline 3.86667 2.41203
+amove 3.87333 2.41892
+aline 4.08 2.69851
+amove 4.08 2.69851
+aline 4.28667 3.04409
+amove 2.20667 2.55783
+aline 2.1 2.27389
+amove 2.41333 2.3095
+aline 2.31333 2.02556
+amove 2.62 2.12716
+aline 2.52 1.84322
+amove 2.83333 2.01082
+aline 2.72667 1.75162
+amove 3.04 1.96046
+aline 2.93333 1.80024
+amove 3.24667 1.97609
+aline 3.14 1.84887
+amove 3.45333 2.05771
+aline 3.35333 1.89749
+amove 3.66667 2.20532
+aline 3.56 1.94612
+amove 3.87333 2.41892
+aline 3.76667 2.13497
+amove 4.08 2.69851
+aline 3.97333 2.41456
+amove 4.28667 3.04409
+aline 4.18667 2.76014
+amove 2.1 2.27389
+aline 2.31333 2.02556
+amove 2.31333 2.02556
+aline 2.51333 1.8491
+amove 2.52 1.84322
+aline 2.72 1.75457
+amove 2.72667 1.75162
+aline 2.93333 1.80024
+amove 2.93333 1.80024
+aline 3.14 1.84887
+amove 3.14 1.84887
+aline 3.35333 1.89749
+amove 3.35333 1.89749
+aline 3.56 1.94612
+amove 3.56 1.94612
+aline 3.76 2.12888
+amove 3.76667 2.13497
+aline 3.97333 2.41456
+amove 3.97333 2.41456
+aline 4.18667 2.76014
+amove 2.1 2.27389
+aline 2 2.05593
+amove 2.31333 2.02556
+aline 2.20667 1.8076
+amove 2.52 1.84322
+aline 2.41333 1.74899
+amove 2.72667 1.75162
+aline 2.62 1.79762
+amove 2.93333 1.80024
+aline 2.93333 1.80024
+amove 3.14 1.84887
+aline 3.14 1.84887
+amove 3.35333 1.89749
+aline 3.35333 1.89749
+amove 3.56 1.94612
+aline 3.56 1.94612
+amove 3.76667 2.13497
+aline 3.66667 2.04075
+amove 3.97333 2.41456
+aline 3.87333 2.19661
+amove 4.18667 2.76014
+aline 4.08 2.54219
+amove 2 2.05593
+aline 2.2 1.81561
+amove 2.20667 1.8076
+aline 2.40667 1.75089
+amove 2.41333 1.74899
+aline 2.62 1.79762
+amove 2.62 1.79762
+aline 2.62 1.79762
+amove 3.66667 2.04075
+aline 3.66667 2.04075
+amove 3.66667 2.04075
+aline 3.87333 2.19661
+amove 3.87333 2.19661
+aline 4.08 2.54219
+amove 2 2.05593
+aline 1.89333 1.90397
+amove 2.20667 1.8076
+aline 2.1 1.74637
+amove 2.41333 1.74899
+aline 2.41333 1.74899
+amove 2.62 1.79762
+aline 2.62 1.79762
+amove 3.66667 2.04075
+aline 3.66667 2.04075
+amove 3.87333 2.19661
+aline 3.87333 2.19661
+amove 4.08 2.54219
+aline 4.08 2.54219
+amove 1.89333 1.90397
+aline 2.1 1.74637
+amove 2.1 1.74637
+aline 2.27333 1.78588
+amove 1.89333 1.90397
+aline 1.78667 1.81799
+amove 2.1 1.74637
+aline 2 1.79238
+amove 1.78667 1.81799
+aline 2 1.79238
+amove 2 1.79238
+aline 2 1.79238
+amove 1.78667 1.81799
+aline 1.68667 1.798
+amove 2 1.79238
+aline 2 1.79238
+amove 1.68667 1.798
+aline 1.78667 1.81754
+amove 1.68667 1.798
+aline 1.58 1.84401
+amove 1.58 1.84401
+aline 1.58 1.84401
+amove 1.58 1.84401
+aline 1.48 1.956
+amove 1.48 1.956
+aline 1.48 1.956
+amove 1.48 1.956
+aline 1.37333 2.13398
+amove 1.37333 2.13398
+aline 1.37333 2.13398
+amove 1.37333 2.13398
+aline 1.26667 2.37796
+amove 1.26667 2.37796
+aline 1.26667 2.37796
+amove 1.26667 2.37796
+aline 1.16667 2.68792
+amove 1.16667 2.68792
+aline 1.16667 2.68792
+amove 1.16667 2.68792
+aline 1.06 3.06387
+amove 1.06 3.06387
+aline 1.06 3.06387
+amove 1.06 3.06387
+aline 0.96 3.50581
+amove 0.96 3.50581
+aline 0.96 3.50581
+amove 0.96 3.50581
+aline 0.853333 4.01375
+amove 0.853333 4.01375
+aline 0.853333 4.01375
+set color BLUE
+set lstyle 1
+amove 2.41333 3.32369
+aline 2.62 3.07536
+amove 2.62 3.07536
+aline 2.83333 2.89302
+amove 2.83333 2.89302
+aline 3.04 2.77668
+amove 3.04 2.77668
+aline 3.24667 2.72632
+amove 3.24667 2.72632
+aline 3.45333 2.74195
+amove 3.45333 2.74195
+aline 3.66 2.82357
+amove 3.66 2.82357
+aline 3.87333 2.97118
+amove 3.87333 2.97118
+aline 4.08 3.18478
+amove 4.08 3.18478
+aline 4.28667 3.46437
+amove 4.28667 3.46437
+aline 4.49333 3.80995
+amove 2.41333 3.32369
+aline 2.31333 2.90777
+amove 2.62 3.07536
+aline 2.62 3.07536
+amove 2.83333 2.89302
+aline 2.83333 2.89302
+amove 3.04 2.77668
+aline 3.04 2.77668
+amove 3.24667 2.72632
+aline 3.24667 2.72632
+amove 3.45333 2.74195
+aline 3.45333 2.74195
+amove 3.66 2.82357
+aline 3.66 2.82357
+amove 3.87333 2.97118
+aline 3.87333 2.97118
+amove 4.08 3.18478
+aline 4.08 3.18478
+amove 4.28667 3.46437
+aline 4.28667 3.46437
+amove 4.49333 3.80995
+aline 4.49333 3.80995
+amove 2.31333 2.90777
+aline 2.31333 2.90777
+amove 2.31333 2.90777
+aline 2.20667 2.55783
+amove 2.20667 2.55783
+aline 2.20667 2.55783
+amove 2.20667 2.55783
+aline 2.1 2.27389
+amove 2.1 2.27389
+aline 2.1 2.27389
+amove 2.1 2.27389
+aline 2 2.05593
+amove 2 2.05593
+aline 2 2.05593
+amove 2 2.05593
+aline 1.89333 1.90397
+amove 1.89333 1.90397
+aline 1.89333 1.90397
+amove 1.89333 1.90397
+aline 1.78667 1.81799
+amove 1.78667 1.81799
+aline 1.78667 1.81799
+amove 1.78667 1.81799
+aline 1.68667 1.798
+amove 1.68667 1.798
+aline 1.68667 1.798
+amove 1.7 1.80061
+aline 1.7 1.80061
+amove 1.68667 1.798
+aline 1.58 1.84401
+amove 1.84 1.86292
+aline 1.79333 1.88438
+amove 1.58 1.84401
+aline 1.79333 1.88438
+amove 1.79333 1.88438
+aline 1.89333 1.90791
+amove 1.58 1.84401
+aline 1.48 1.956
+amove 1.79333 1.88438
+aline 1.68667 1.93039
+amove 1.93333 1.96176
+aline 1.89333 1.97901
+amove 1.48 1.956
+aline 1.68 1.93121
+amove 1.68667 1.93039
+aline 1.88667 1.97744
+amove 1.89333 1.97901
+aline 1.95333 1.99313
+amove 1.48 1.956
+aline 1.37333 2.13398
+amove 1.68667 1.93039
+aline 1.58 1.97639
+amove 1.89333 1.97901
+aline 1.79333 2.02502
+amove 2.00667 2.07057
+aline 2 2.07364
+amove 1.37333 2.13398
+aline 1.58 1.97639
+amove 1.58 1.97639
+aline 1.79333 2.02502
+amove 1.79333 2.02502
+aline 1.99333 2.07207
+amove 2 2.07364
+aline 2.00667 2.07521
+amove 1.37333 2.13398
+aline 1.26667 2.37796
+amove 1.58 1.97639
+aline 1.48 2.12963
+amove 1.79333 2.02502
+aline 1.68667 2.07102
+amove 2 2.07364
+aline 1.89333 2.11965
+amove 3.4 2.75036
+aline 3.35333 2.86421
+amove 1.26667 2.37796
+aline 1.48 2.12963
+amove 1.48 2.12963
+aline 1.68667 2.07102
+amove 1.68667 2.07102
+aline 1.88667 2.11808
+amove 1.89333 2.11965
+aline 2.04 2.15415
+amove 3.27333 2.73044
+aline 3.34667 2.85306
+amove 1.26667 2.37796
+aline 1.16667 2.68792
+amove 1.48 2.12963
+aline 1.37333 2.43959
+amove 1.68667 2.07102
+aline 1.58 2.25725
+amove 1.89333 2.11965
+aline 1.79333 2.16565
+amove 2.06 2.18667
+aline 2 2.21427
+amove 3.05333 2.78985
+aline 3.04 2.82859
+amove 3.35333 2.86421
+aline 3.24667 3.17417
+amove 1.16667 2.68792
+aline 1.37333 2.43959
+amove 1.37333 2.43959
+aline 1.58 2.25725
+amove 1.58 2.25725
+aline 1.79333 2.16565
+amove 1.79333 2.16565
+aline 1.99333 2.21271
+amove 2 2.21427
+aline 2.08 2.2331
+amove 3.01333 2.79252
+aline 3.03333 2.81957
+amove 3.04 2.82859
+aline 3.24 3.16303
+amove 1.16667 2.68792
+aline 1.06 3.06387
+amove 1.37333 2.43959
+aline 1.27333 2.81554
+amove 1.58 2.25725
+aline 1.48 2.6332
+amove 1.79333 2.16565
+aline 1.68667 2.51686
+amove 2 2.21427
+aline 1.89333 2.4665
+amove 2.14 2.39992
+aline 2.1 2.48213
+amove 3.04 2.82859
+aline 2.93333 3.20455
+amove 3.24667 3.17417
+aline 3.14667 3.55013
+amove 1.06 3.06387
+aline 1.27333 2.81554
+amove 1.27333 2.81554
+aline 1.47333 2.63909
+amove 1.48 2.6332
+aline 1.68667 2.51686
+amove 1.68667 2.51686
+aline 1.89333 2.4665
+amove 1.89333 2.4665
+aline 2.09333 2.48162
+amove 2.1 2.48213
+aline 2.18667 2.51528
+amove 2.76 2.97005
+aline 2.92667 3.19553
+amove 2.93333 3.20455
+aline 3.14667 3.55013
+amove 1.06 3.06387
+aline 0.96 3.50581
+amove 1.27333 2.81554
+aline 1.16667 3.25749
+amove 1.48 2.6332
+aline 1.37333 3.07515
+amove 1.68667 2.51686
+aline 1.58 2.9588
+amove 1.89333 2.4665
+aline 1.79333 2.90844
+amove 2.1 2.48213
+aline 2 2.92407
+amove 2.26667 2.7571
+aline 2.20667 3.00569
+amove 2.70667 3.01335
+aline 2.62667 3.3669
+amove 2.93333 3.20455
+aline 2.83333 3.64649
+amove 3.14667 3.55013
+aline 3.04 3.99207
+amove 0.96 3.50581
+aline 1.16667 3.25749
+amove 1.16667 3.25749
+aline 1.36667 3.08103
+amove 1.37333 3.07515
+aline 1.58 2.9588
+amove 1.58 2.9588
+aline 1.79333 2.90844
+amove 1.79333 2.90844
+aline 1.99333 2.92356
+amove 2 2.92407
+aline 2.2 3.00306
+amove 2.20667 3.00569
+aline 2.36 3.11521
+amove 2.49333 3.2334
+aline 2.62667 3.3669
+amove 2.62667 3.3669
+aline 2.82667 3.63747
+amove 2.83333 3.64649
+aline 3.04 3.99207
+amove 0.96 3.50581
+aline 0.853333 4.01375
+amove 1.16667 3.25749
+aline 1.06 3.76542
+amove 1.37333 3.07515
+aline 1.27333 3.58308
+amove 1.58 2.9588
+aline 1.48 3.46673
+amove 1.79333 2.90844
+aline 1.68667 3.41637
+amove 2 2.92407
+aline 1.89333 3.432
+amove 2.20667 3.00569
+aline 2.1 3.51362
+amove 2.39333 3.25489
+aline 2.31333 3.66123
+amove 2.62667 3.3669
+aline 2.52 3.87483
+amove 2.83333 3.64649
+aline 2.72667 4.15442
+amove 3.04 3.99207
+aline 2.93333 4.5
+amove 0.853333 4.01375
+aline 1.06 3.76542
+amove 1.06 3.76542
+aline 1.27333 3.58308
+amove 1.27333 3.58308
+aline 1.48 3.46673
+amove 1.48 3.46673
+aline 1.68667 3.41637
+amove 1.68667 3.41637
+aline 1.88667 3.4315
+amove 1.89333 3.432
+aline 2.09333 3.51099
+amove 2.1 3.51362
+aline 2.31333 3.66123
+amove 2.31333 3.66123
+aline 2.52 3.87483
+amove 2.52 3.87483
+aline 2.72 4.1454
+amove 2.72667 4.15442
+aline 2.92667 4.48885
+set color BLUE
+set lstyle 1
+set color BLACK
+set lstyle 1
+amove 4.49333 1.12911
+aline 2.96 1.80652
+amove 2.69333 1.76599
+aline 0.853333 1.33291
+amove 0.853333 4.01375
+aline 0.853333 1.33291
+amove 0.853333 4.01375
+aline 2.93333 4.5
+amove 0.853333 4.01375
+aline 0.86 3.982
+amove 2.93333 4.5
+aline 4.49333 3.80995
+amove 4.49333 3.80995
+aline 4.49333 3.80995
+amove 4.49333 3.80995
+aline 4.49333 1.12911
+amove 0.857143 1.33291
+aline 2.41738 0.642857
+amove 2.41738 0.642857
+aline 4.49938 1.12911
+set just BC
+set color BLACK
+set hei 0.0833333
+set just TC
+amove 0.857143 1.33291
+aline 0.855121 1.32834
+amove 0.814672 1.23688
+rotate -23.8587
+text 0
+rotate 23.8587
+amove 1.11718 1.2179
+aline 1.11516 1.21333
+amove 1.07471 1.12187
+rotate -23.8587
+text 5
+rotate 23.8587
+amove 1.37722 1.10289
+aline 1.3752 1.09832
+amove 1.33475 1.00687
+rotate -23.8587
+text 10
+rotate 23.8587
+amove 1.63726 0.987884
+aline 1.63524 0.983311
+amove 1.59479 0.891857
+rotate -23.8587
+text 15
+rotate 23.8587
+amove 1.8973 0.872875
+aline 1.89528 0.868302
+amove 1.85483 0.776848
+rotate -23.8587
+text 20
+rotate 23.8587
+amove 2.15734 0.757866
+aline 2.15531 0.753293
+amove 2.11487 0.661839
+rotate -23.8587
+text 25
+rotate 23.8587
+amove 2.41738 0.642857
+aline 2.41535 0.638284
+amove 2.37491 0.54683
+rotate -23.8587
+text 30
+rotate 23.8587
+set just TC
+set color BLACK
+set hei 0.125
+amove 1.51829 0.7189
+rotate -23.8587
+text Xaxis
+rotate 23.8587
+set color BLACK
+set hei 0.0833333
+set just TC
+amove 2.41738 0.642857
+aline 2.41851 0.637988
+amove 2.44126 0.540609
+rotate 13.1458
+text 0
+rotate -13.1458
+amove 2.62558 0.691483
+aline 2.62671 0.686614
+amove 2.64946 0.589234
+rotate 13.1458
+text 2
+rotate -13.1458
+amove 2.83378 0.740108
+aline 2.83491 0.735239
+amove 2.85766 0.63786
+rotate 13.1458
+text 4
+rotate -13.1458
+amove 3.04198 0.788733
+aline 3.04311 0.783864
+amove 3.06586 0.686485
+rotate 13.1458
+text 6
+rotate -13.1458
+amove 3.25018 0.837359
+aline 3.25131 0.83249
+amove 3.27406 0.73511
+rotate 13.1458
+text 8
+rotate -13.1458
+amove 3.45838 0.885984
+aline 3.45951 0.881115
+amove 3.48226 0.783736
+rotate 13.1458
+text 10
+rotate -13.1458
+amove 3.66658 0.93461
+aline 3.66772 0.929741
+amove 3.69046 0.832361
+rotate 13.1458
+text 12
+rotate -13.1458
+amove 3.87478 0.983235
+aline 3.87592 0.978366
+amove 3.89866 0.880987
+rotate 13.1458
+text 14
+rotate -13.1458
+amove 4.08298 1.03186
+aline 4.08412 1.02699
+amove 4.10686 0.929612
+rotate 13.1458
+text 16
+rotate -13.1458
+amove 4.29118 1.08049
+aline 4.29232 1.07562
+amove 4.31506 0.978237
+rotate 13.1458
+text 18
+rotate -13.1458
+amove 4.49938 1.12911
+aline 4.50052 1.12424
+amove 4.52326 1.02686
+rotate 13.1458
+text 20
+rotate -13.1458
+set just TC
+set color BLACK
+set hei 0.125
+amove 3.52527 0.599574
+rotate 13.1458
+text Yaxis
+rotate -13.1458
+set color BLACK
+set hei 0.0833333
+set just RC
+amove 0.857143 1.33291
+aline 0.852143 1.33291
+amove 0.752143 1.33291
+text 0
+amove 0.857143 1.74535
+aline 0.852143 1.74535
+amove 0.752143 1.74535
+text 50
+amove 0.857143 2.15778
+aline 0.852143 2.15778
+amove 0.752143 2.15778
+text 100
+amove 0.857143 2.57022
+aline 0.852143 2.57022
+amove 0.752143 2.57022
+text 150
+amove 0.857143 2.98266
+aline 0.852143 2.98266
+amove 0.752143 2.98266
+text 200
+amove 0.857143 3.39509
+aline 0.852143 3.39509
+amove 0.752143 3.39509
+text 250
+amove 0.857143 3.80753
+aline 0.852143 3.80753
+amove 0.752143 3.80753
+text 300
+set just BC
+set color GREEN
+set lstyle 1
+amove 0.853333 4.01375
+aline 0.853333 1.33291
+amove 0.96 3.88558
+aline 0.96 4.03806
+amove 0.96 3.50581
+aline 0.96 1.35722
+amove 1.06 3.76542
+aline 1.06 4.06237
+amove 1.06 3.06387
+aline 1.06 1.38154
+amove 1.16667 3.67425
+aline 1.16667 4.08668
+amove 1.16667 2.68792
+aline 1.16667 1.40585
+amove 1.27333 3.58308
+aline 1.27333 4.111
+amove 1.27333 2.36271
+aline 1.27333 1.43016
+amove 1.37333 3.52678
+aline 1.37333 4.13531
+amove 1.37333 2.13398
+aline 1.37333 1.45447
+amove 1.48 3.46673
+aline 1.48 4.15962
+amove 1.48 1.956
+aline 1.48 1.47879
+amove 1.58 3.44236
+aline 1.58 4.18394
+amove 1.58 1.84401
+aline 1.58 1.5031
+amove 1.68667 3.41637
+aline 1.68667 4.20825
+amove 1.68667 1.798
+aline 1.68667 1.52741
+amove 1.79333 3.42444
+aline 1.79333 4.23256
+amove 1.79333 1.81719
+aline 1.79333 1.55173
+amove 1.89333 3.432
+aline 1.89333 4.25687
+amove 1.89333 1.80518
+aline 1.89333 1.57604
+amove 2 3.47413
+aline 2 4.28119
+amove 2 1.79238
+aline 2 1.60035
+amove 2.1 3.51362
+aline 2.1 4.3055
+amove 2.1 1.74637
+aline 2.1 1.62466
+amove 2.20667 3.58743
+aline 2.20667 4.32981
+amove 2.20667 1.77069
+aline 2.20667 1.64898
+amove 2.31333 3.66123
+aline 2.31333 4.35412
+amove 2.31333 1.77735
+aline 2.31333 1.67329
+amove 2.41333 3.76459
+aline 2.41333 4.37844
+amove 2.41333 1.74899
+aline 2.41333 1.6976
+amove 2.52 3.87483
+aline 2.52 4.40275
+amove 2.52 1.77409
+aline 2.52 1.72191
+amove 2.62667 4.01914
+aline 2.62667 4.42706
+amove 2.62667 1.79474
+aline 2.62667 1.74623
+amove 2.72667 4.15442
+aline 2.72667 4.45137
+amove 2.83333 4.33278
+aline 2.83333 4.47569
+amove 0.853333 1.33291
+aline 2.7 1.76312
+amove 0.853333 2.15778
+aline 1.32 2.25597
+amove 0.853333 2.98266
+aline 1.07333 3.01688
+amove 1 3.83751
+aline 2.79333 4.2659
+amove 0.853333 3.80753
+aline 0.9 3.79153
+set color BLACK
+set lstyle 1
+set color BLACK
+set lstyle 1
diff --git a/gle-refman/utilities/fig/jack/jack.let b/gle-refman/utilities/fig/jack/jack.let
new file mode 100644
index 0000000..be28e8c
--- /dev/null
+++ b/gle-refman/utilities/fig/jack/jack.let
@@ -0,0 +1,41 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+jack.z
+0, 30, 1
+0, 20, 1
+(x-15)^2+(y-10)^2
diff --git a/gle-refman/utilities/fig/jack/jack.sur b/gle-refman/utilities/fig/jack/jack.sur
new file mode 100644
index 0000000..6306b1f
--- /dev/null
+++ b/gle-refman/utilities/fig/jack/jack.sur
@@ -0,0 +1,49 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+begin surface
+ size 5 5
+ data jack.z sample 2
+ back ystep 1 zstep 100 color green
+ xtitle "Xaxis"
+ ytitle "Yaxis"
+ top color blue
+ zclip min 100
+ zaxis min 0
+ underneath on lstyle 2
+end surface
diff --git a/gle-refman/utilities/fig/jack/jack.z b/gle-refman/utilities/fig/jack/jack.z
new file mode 100644
index 0000000..0eb3252
--- /dev/null
+++ b/gle-refman/utilities/fig/jack/jack.z
@@ -0,0 +1,59 @@
+! nx 31 ny 21 xmin 0 xmax 30 ymin 0 ymax 20
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+325 296 269 244 221 200 181 164 149 136 125 116 109 104 101 100 101 104 109 116 125 136 149 164 181 200 221 244 269 296 325
+306 277 250 225 202 181 162 145 130 117 106 97 90 85 82 81 82 85 90 97 106 117 130 145 162 181 202 225 250 277 306
+289 260 233 208 185 164 145 128 113 100 89 80 73 68 65 64 65 68 73 80 89 100 113 128 145 164 185 208 233 260 289
+274 245 218 193 170 149 130 113 98 85 74 65 58 53 50 49 50 53 58 65 74 85 98 113 130 149 170 193 218 245 274
+261 232 205 180 157 136 117 100 85 72 61 52 45 40 37 36 37 40 45 52 61 72 85 100 117 136 157 180 205 232 261
+250 221 194 169 146 125 106 89 74 61 50 41 34 29 26 25 26 29 34 41 50 61 74 89 106 125 146 169 194 221 250
+241 212 185 160 137 116 97 80 65 52 41 32 25 20 17 16 17 20 25 32 41 52 65 80 97 116 137 160 185 212 241
+234 205 178 153 130 109 90 73 58 45 34 25 18 13 10 9 10 13 18 25 34 45 58 73 90 109 130 153 178 205 234
+229 200 173 148 125 104 85 68 53 40 29 20 13 8 5 4 5 8 13 20 29 40 53 68 85 104 125 148 173 200 229
+226 197 170 145 122 101 82 65 50 37 26 17 10 5 2 1 2 5 10 17 26 37 50 65 82 101 122 145 170 197 226
+225 196 169 144 121 100 81 64 49 36 25 16 9 4 1 0 1 4 9 16 25 36 49 64 81 100 121 144 169 196 225
+226 197 170 145 122 101 82 65 50 37 26 17 10 5 2 1 2 5 10 17 26 37 50 65 82 101 122 145 170 197 226
+229 200 173 148 125 104 85 68 53 40 29 20 13 8 5 4 5 8 13 20 29 40 53 68 85 104 125 148 173 200 229
+234 205 178 153 130 109 90 73 58 45 34 25 18 13 10 9 10 13 18 25 34 45 58 73 90 109 130 153 178 205 234
+241 212 185 160 137 116 97 80 65 52 41 32 25 20 17 16 17 20 25 32 41 52 65 80 97 116 137 160 185 212 241
+250 221 194 169 146 125 106 89 74 61 50 41 34 29 26 25 26 29 34 41 50 61 74 89 106 125 146 169 194 221 250
+261 232 205 180 157 136 117 100 85 72 61 52 45 40 37 36 37 40 45 52 61 72 85 100 117 136 157 180 205 232 261
+274 245 218 193 170 149 130 113 98 85 74 65 58 53 50 49 50 53 58 65 74 85 98 113 130 149 170 193 218 245 274
+289 260 233 208 185 164 145 128 113 100 89 80 73 68 65 64 65 68 73 80 89 100 113 128 145 164 185 208 233 260 289
+306 277 250 225 202 181 162 145 130 117 106 97 90 85 82 81 82 85 90 97 106 117 130 145 162 181 202 225 250 277 306
+325 296 269 244 221 200 181 164 149 136 125 116 109 104 101 100 101 104 109 116 125 136 149 164 181 200 221 244 269 296 325
diff --git a/gle-refman/utilities/fig/saddle-contour.gle b/gle-refman/utilities/fig/saddle-contour.gle
new file mode 100644
index 0000000..a3bd6f3
--- /dev/null
+++ b/gle-refman/utilities/fig/saddle-contour.gle
@@ -0,0 +1,70 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 7 6
+
+include "contour.gle"
+
+set font psh
+
+include "../../script/manual.gle"
+
+begin letz
+ data "saddle.z"
+ z = 3/2*(cos(3/5*(y-1))+5/4)/(1+(((x-4)/3)^2))
+ x from 0 to 20 step 0.5
+ y from 0 to 20 step 0.5
+end letz
+
+begin contour
+ data "saddle.z"
+ values 0.5 1 1.5 2 3
+end contour
+
+manual_graph_mode
+begin graph
+ scale 0.85 0.75 center
+ title "Saddle Plot Contour Lines"
+ data "saddle-cdata.dat"
+ xaxis min -0.75 max 11.75
+ yaxis min -1.5 max 21.5
+ d1 line color blue
+end graph
+
+contour_labels "saddle-clabels.dat" "fix 1"
+
diff --git a/gle-refman/utilities/fig/saddle.gle b/gle-refman/utilities/fig/saddle.gle
new file mode 100644
index 0000000..f6419c9
--- /dev/null
+++ b/gle-refman/utilities/fig/saddle.gle
@@ -0,0 +1,62 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 12 5
+amove 1 4
+set hei .28
+set font tt
+begin table
+ LETZ
+File to store data in ?
+ saddle.z
+Enter xmin,xmax,xstep (on one line):
+ 0, 20, 1
+Enter ymin,ymax,ystep:
+ 0, 20, 1
+Enter equation:
+end table
+
+amove 1 1.5
+set font rm
+text 3/2*(cos(3/5*(y-1))+5/4)/(1+(((x-4)/3)^2))
+
+amove 7 0
+begin origin
+box 5 5
+include saddle/saddle.big
+end origin
diff --git a/gle-refman/utilities/fig/saddle/saddle.big b/gle-refman/utilities/fig/saddle/saddle.big
new file mode 100644
index 0000000..a08bc41
--- /dev/null
+++ b/gle-refman/utilities/fig/saddle/saddle.big
@@ -0,0 +1,2069 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+amove 9 9
+set hei 0.3
+set color BLUE
+set lstyle 1
+amove 2.38 0.722021
+aline 2.48 0.754498
+amove 2.48 0.754498
+aline 2.58667 0.771523
+amove 2.58667 0.771523
+aline 2.69333 0.775792
+amove 2.69333 0.775792
+aline 2.8 0.774463
+amove 2.8 0.774463
+aline 2.90667 0.776644
+amove 2.90667 0.776644
+aline 3.01333 0.79022
+amove 3.01333 0.79022
+aline 3.12 0.819095
+amove 3.12 0.819095
+aline 3.22667 0.861828
+amove 3.22667 0.861828
+aline 3.33333 0.912137
+amove 3.33333 0.912137
+aline 3.44 0.961094
+amove 3.44 0.961094
+aline 3.54 1.00024
+amove 3.54 1.00024
+aline 3.64667 1.02455
+amove 3.64667 1.02455
+aline 3.75333 1.03418
+amove 3.75333 1.03418
+aline 3.86 1.03441
+amove 3.86 1.03441
+aline 3.96667 1.0338
+amove 3.96667 1.0338
+aline 4.07333 1.04121
+amove 4.07333 1.04121
+aline 4.18 1.06271
+amove 4.18 1.06271
+aline 4.28667 1.09942
+amove 4.28667 1.09942
+aline 4.39333 1.14718
+amove 4.39333 1.14718
+aline 4.49333 1.19793
+amove 2.38 0.722021
+aline 2.3 0.768244
+amove 2.48 0.754498
+aline 2.48 0.754498
+amove 2.58667 0.771523
+aline 2.58667 0.771523
+amove 2.69333 0.775792
+aline 2.69333 0.775792
+amove 2.8 0.774463
+aline 2.8 0.774463
+amove 2.90667 0.776644
+aline 2.90667 0.776644
+amove 3.01333 0.79022
+aline 3.01333 0.79022
+amove 3.12 0.819095
+aline 3.12 0.819095
+amove 3.22667 0.861828
+aline 3.22667 0.861828
+amove 3.33333 0.912137
+aline 3.33333 0.912137
+amove 3.44 0.961094
+aline 3.44 0.961094
+amove 3.54 1.00024
+aline 3.54 1.00024
+amove 3.64667 1.02455
+aline 3.64667 1.02455
+amove 3.75333 1.03418
+aline 3.75333 1.03418
+amove 3.86 1.03441
+aline 3.86 1.03441
+amove 3.96667 1.0338
+aline 3.96667 1.0338
+amove 4.07333 1.04121
+aline 4.07333 1.04121
+amove 4.18 1.06271
+aline 4.18 1.06271
+amove 4.28667 1.09942
+aline 4.28667 1.09942
+amove 4.39333 1.14718
+aline 4.39333 1.14718
+amove 4.49333 1.19793
+aline 4.49333 1.19793
+amove 2.3 0.768244
+aline 2.3 0.768244
+amove 2.3 0.768244
+aline 2.22 0.817011
+amove 2.22 0.817011
+aline 2.22 0.817011
+amove 2.22 0.817011
+aline 2.14667 0.869072
+amove 2.14667 0.869072
+aline 2.14667 0.869072
+amove 2.14667 0.869072
+aline 2.06667 0.925466
+amove 2.06667 0.925466
+aline 2.06667 0.925466
+amove 2.06667 0.925466
+aline 1.99333 0.987659
+amove 1.99333 0.987659
+aline 1.99333 0.987659
+amove 1.99333 0.987659
+aline 1.91333 1.05777
+amove 1.91333 1.05777
+aline 1.91333 1.05777
+amove 1.91333 1.05777
+aline 1.84 1.13895
+amove 1.84 1.13895
+aline 1.84 1.13895
+amove 1.84 1.13895
+aline 1.76 1.23596
+amove 1.76 1.23596
+aline 1.76 1.23596
+amove 1.76 1.23596
+aline 1.68667 1.35622
+amove 1.68667 1.35622
+aline 1.68667 1.35622
+amove 1.68667 1.35622
+aline 1.60667 1.51145
+amove 1.60667 1.51145
+aline 1.60667 1.51145
+amove 1.60667 1.51145
+aline 1.53333 1.72043
+amove 1.53333 1.72043
+aline 1.53333 1.72043
+amove 1.53333 1.72043
+aline 1.45333 2.01208
+amove 1.45333 2.01208
+aline 1.45333 2.01208
+amove 1.45333 2.01208
+aline 1.37333 2.42459
+amove 1.37333 2.42459
+aline 1.37333 2.42459
+amove 1.37333 2.42459
+aline 1.3 2.9785
+amove 1.3 2.9785
+aline 1.3 2.9785
+amove 1.3 2.9785
+aline 1.22 3.57399
+amove 1.22 3.57399
+aline 1.22 3.57399
+amove 1.22 3.57399
+aline 1.14667 3.87837
+amove 1.14667 3.87837
+aline 1.14667 3.87837
+amove 1.14667 3.87837
+aline 1.06667 3.64211
+amove 1.06667 3.64211
+aline 1.15333 3.82859
+amove 1.06667 3.64211
+aline 0.993333 3.11474
+amove 1.16 3.76714
+aline 1.1 3.297
+amove 1.23333 3.38398
+aline 1.2 3.16424
+amove 1.31333 2.80501
+aline 1.30667 2.7715
+amove 0.993333 3.11474
+aline 1.09333 3.28561
+amove 1.1 3.297
+aline 1.19333 3.17309
+amove 1.2 3.16424
+aline 1.3 2.79604
+amove 1.30667 2.7715
+aline 1.36 2.51805
+amove 0.993333 3.11474
+aline 0.913333 2.62895
+amove 1.1 3.297
+aline 1.02 2.76746
+amove 1.2 3.16424
+aline 1.12667 2.67845
+amove 1.30667 2.7715
+aline 1.23333 2.40168
+amove 1.40667 2.24442
+aline 1.34 2.04247
+amove 1.50667 1.81214
+aline 1.44667 1.73495
+amove 1.57333 1.60555
+aline 1.54667 1.59519
+amove 0.913333 2.62895
+aline 1.02 2.76746
+amove 1.02 2.76746
+aline 1.12667 2.67845
+amove 1.12667 2.67845
+aline 1.23333 2.40168
+amove 1.23333 2.40168
+aline 1.34 2.04247
+amove 1.34 2.04247
+aline 1.44667 1.73495
+amove 1.44667 1.73495
+aline 1.54 1.60451
+amove 1.54667 1.59519
+aline 1.54667 1.59519
+amove 0.913333 2.62895
+aline 0.84 2.28456
+amove 1.02 2.76746
+aline 0.94 2.39122
+amove 1.12667 2.67845
+aline 1.04667 2.33406
+amove 1.23333 2.40168
+aline 1.15333 2.14172
+amove 1.34 2.04247
+aline 1.26 1.89002
+amove 1.44667 1.73495
+aline 1.36667 1.67553
+amove 1.54667 1.59519
+aline 1.47333 1.58184
+amove 0.84 2.28456
+aline 0.933333 2.38411
+amove 0.94 2.39122
+aline 1.04667 2.33406
+amove 1.04667 2.33406
+aline 1.14667 2.15374
+amove 1.15333 2.14172
+aline 1.26 1.89002
+amove 1.26 1.89002
+aline 1.36 1.68894
+amove 1.36667 1.67553
+aline 1.47333 1.58184
+amove 1.47333 1.58184
+aline 1.47333 1.58184
+set color BLACK
+set lstyle 1
+amove 2.38 0.722021
+aline 2.48 0.754498
+amove 2.48 0.754498
+aline 2.58667 0.771523
+amove 2.58667 0.771523
+aline 2.69333 0.775792
+amove 2.69333 0.775792
+aline 2.8 0.774463
+amove 2.8 0.774463
+aline 2.90667 0.776644
+amove 2.90667 0.776644
+aline 3.01333 0.79022
+amove 3.01333 0.79022
+aline 3.12 0.819095
+amove 3.12 0.819095
+aline 3.22667 0.861828
+amove 3.22667 0.861828
+aline 3.33333 0.912137
+amove 3.33333 0.912137
+aline 3.44 0.961094
+amove 3.44 0.961094
+aline 3.54 1.00024
+amove 3.54 1.00024
+aline 3.64667 1.02455
+amove 3.64667 1.02455
+aline 3.75333 1.03418
+amove 3.75333 1.03418
+aline 3.86 1.03441
+amove 3.86 1.03441
+aline 3.96667 1.0338
+amove 3.96667 1.0338
+aline 4.07333 1.04121
+amove 4.07333 1.04121
+aline 4.18 1.06271
+amove 4.18 1.06271
+aline 4.28667 1.09942
+amove 4.28667 1.09942
+aline 4.39333 1.14718
+amove 4.39333 1.14718
+aline 4.49333 1.19793
+amove 2.38 0.722021
+aline 2.3 0.768244
+amove 2.48 0.754498
+aline 2.40667 0.801744
+amove 2.58667 0.771523
+aline 2.51333 0.817744
+amove 2.69333 0.775792
+aline 2.62 0.819301
+amove 2.8 0.774463
+aline 2.72667 0.814516
+amove 2.90667 0.776644
+aline 2.83333 0.813707
+amove 3.01333 0.79022
+aline 2.93333 0.825804
+amove 3.12 0.819095
+aline 3.04 0.855225
+amove 3.22667 0.861828
+aline 3.14667 0.90034
+amove 3.33333 0.912137
+aline 3.25333 0.954035
+amove 3.44 0.961094
+aline 3.36 1.0062
+amove 3.54 1.00024
+aline 3.46667 1.04726
+amove 3.64667 1.02455
+aline 3.57333 1.07151
+amove 3.75333 1.03418
+aline 3.68 1.07913
+amove 3.86 1.03441
+aline 3.78667 1.07611
+amove 3.96667 1.0338
+aline 3.88667 1.07214
+amove 4.07333 1.04121
+aline 3.99333 1.07726
+amove 4.18 1.06271
+aline 4.1 1.09833
+amove 4.28667 1.09942
+aline 4.20667 1.13662
+amove 4.39333 1.14718
+aline 4.31333 1.18742
+amove 4.49333 1.19793
+aline 4.42 1.24162
+amove 2.3 0.768244
+aline 2.4 0.799651
+amove 2.40667 0.801744
+aline 2.51333 0.817744
+amove 2.51333 0.817744
+aline 2.62 0.819301
+amove 2.62 0.819301
+aline 2.72667 0.814516
+amove 2.72667 0.814516
+aline 2.83333 0.813707
+amove 2.83333 0.813707
+aline 2.93333 0.825804
+amove 2.93333 0.825804
+aline 3.04 0.855225
+amove 3.04 0.855225
+aline 3.14667 0.90034
+amove 3.14667 0.90034
+aline 3.25333 0.954035
+amove 3.25333 0.954035
+aline 3.36 1.0062
+amove 3.36 1.0062
+aline 3.46667 1.04726
+amove 3.46667 1.04726
+aline 3.57333 1.07151
+amove 3.57333 1.07151
+aline 3.67333 1.07865
+amove 3.68 1.07913
+aline 3.78667 1.07611
+amove 3.78667 1.07611
+aline 3.88 1.0724
+amove 3.88667 1.07214
+aline 3.98667 1.07694
+amove 3.99333 1.07726
+aline 4.1 1.09833
+amove 4.1 1.09833
+aline 4.20667 1.13662
+amove 4.20667 1.13662
+aline 4.30667 1.18425
+amove 4.31333 1.18742
+aline 4.42 1.24162
+amove 2.3 0.768244
+aline 2.22 0.817011
+amove 2.40667 0.801744
+aline 2.32667 0.85175
+amove 2.51333 0.817744
+aline 2.43333 0.866512
+amove 2.62 0.819301
+aline 2.54 0.864788
+amove 2.72667 0.814516
+aline 2.64667 0.855824
+amove 2.83333 0.813707
+aline 2.75333 0.8514
+amove 2.93333 0.825804
+aline 2.86 0.861706
+amove 3.04 0.855225
+aline 2.96667 0.891788
+amove 3.14667 0.90034
+aline 3.07333 0.939784
+amove 3.25333 0.954035
+aline 3.18 0.997574
+amove 3.36 1.0062
+aline 3.28 1.05362
+amove 3.46667 1.04726
+aline 3.38667 1.09698
+amove 3.57333 1.07151
+aline 3.49333 1.12116
+amove 3.68 1.07913
+aline 3.6 1.12636
+amove 3.78667 1.07611
+aline 3.70667 1.11941
+amove 3.88667 1.07214
+aline 3.81333 1.11138
+amove 3.99333 1.07726
+aline 3.92 1.11372
+amove 4.1 1.09833
+aline 4.02667 1.13427
+amove 4.20667 1.13662
+aline 4.13333 1.17448
+amove 4.31333 1.18742
+aline 4.24 1.22896
+amove 4.42 1.24162
+aline 4.34 1.28733
+amove 2.22 0.817011
+aline 2.32667 0.85175
+amove 2.32667 0.85175
+aline 2.42667 0.86559
+amove 2.43333 0.866512
+aline 2.54 0.864788
+amove 2.54 0.864788
+aline 2.64667 0.855824
+amove 2.64667 0.855824
+aline 2.74667 0.851677
+amove 2.75333 0.8514
+aline 2.85333 0.861062
+amove 2.86 0.861706
+aline 2.96667 0.891788
+amove 2.96667 0.891788
+aline 3.07333 0.939784
+amove 3.07333 0.939784
+aline 3.17333 0.993962
+amove 3.18 0.997574
+aline 3.27333 1.04988
+amove 3.28 1.05362
+aline 3.38667 1.09698
+amove 3.38667 1.09698
+aline 3.48667 1.11965
+amove 3.49333 1.12116
+aline 3.59333 1.12603
+amove 3.6 1.12636
+aline 3.70667 1.11941
+amove 3.70667 1.11941
+aline 3.80667 1.11188
+amove 3.81333 1.11138
+aline 3.92 1.11372
+amove 3.92 1.11372
+aline 4.02667 1.13427
+amove 4.02667 1.13427
+aline 4.12667 1.17197
+amove 4.13333 1.17448
+aline 4.23333 1.22556
+amove 4.24 1.22896
+aline 4.33333 1.28344
+amove 2.22 0.817011
+aline 2.14667 0.869072
+amove 2.32667 0.85175
+aline 2.25333 0.905326
+amove 2.43333 0.866512
+aline 2.36 0.918573
+amove 2.54 0.864788
+aline 2.46667 0.912833
+amove 2.64667 0.855824
+aline 2.57333 0.898756
+amove 2.75333 0.8514
+aline 2.67333 0.889906
+amove 2.86 0.861706
+aline 2.78 0.898022
+amove 2.96667 0.891788
+aline 2.88667 0.928912
+amove 3.07333 0.939784
+aline 2.99333 0.980434
+amove 3.18 0.997574
+aline 3.1 1.04324
+amove 3.28 1.05362
+aline 3.20667 1.10402
+amove 3.38667 1.09698
+aline 3.31333 1.15021
+amove 3.49333 1.12116
+aline 3.42 1.17431
+amove 3.6 1.12636
+aline 3.52667 1.17654
+amove 3.70667 1.11941
+aline 3.62667 1.16478
+amove 3.81333 1.11138
+aline 3.73333 1.15178
+amove 3.92 1.11372
+aline 3.84 1.15072
+amove 4.02667 1.13427
+aline 3.94667 1.17063
+amove 4.13333 1.17448
+aline 4.05333 1.21319
+amove 4.24 1.22896
+aline 4.16 1.27218
+amove 4.34 1.28733
+aline 4.26667 1.33564
+amove 2.14667 0.869072
+aline 2.25333 0.905326
+amove 2.25333 0.905326
+aline 2.35333 0.917745
+amove 2.36 0.918573
+aline 2.46 0.913192
+amove 2.46667 0.912833
+aline 2.57333 0.898756
+amove 2.57333 0.898756
+aline 2.66667 0.890496
+amove 2.67333 0.889906
+aline 2.78 0.898022
+amove 2.78 0.898022
+aline 2.88 0.926982
+amove 2.88667 0.928912
+aline 2.99333 0.980434
+amove 2.99333 0.980434
+aline 3.1 1.04324
+amove 3.1 1.04324
+aline 3.2 1.10022
+amove 3.20667 1.10402
+aline 3.30667 1.14732
+amove 3.31333 1.15021
+aline 3.42 1.17431
+amove 3.42 1.17431
+aline 3.52667 1.17654
+amove 3.52667 1.17654
+aline 3.62667 1.16478
+amove 3.62667 1.16478
+aline 3.73333 1.15178
+amove 3.73333 1.15178
+aline 3.84 1.15072
+amove 3.84 1.15072
+aline 3.94 1.16938
+amove 3.94667 1.17063
+aline 4.05333 1.21319
+amove 4.05333 1.21319
+aline 4.15333 1.26849
+amove 4.16 1.27218
+aline 4.26667 1.33564
+amove 2.14667 0.869072
+aline 2.06667 0.925466
+amove 2.25333 0.905326
+aline 2.17333 0.963598
+amove 2.36 0.918573
+aline 2.28 0.974967
+amove 2.46667 0.912833
+aline 2.38667 0.964244
+amove 2.57333 0.898756
+aline 2.49333 0.943823
+amove 2.67333 0.889906
+aline 2.6 0.929482
+amove 2.78 0.898022
+aline 2.70667 0.934879
+amove 2.88667 0.928912
+aline 2.81333 0.966773
+amove 2.99333 0.980434
+aline 2.92 1.02267
+amove 3.1 1.04324
+aline 3.02 1.09169
+amove 3.20667 1.10402
+aline 3.12667 1.15836
+amove 3.31333 1.15021
+aline 3.23333 1.20805
+amove 3.42 1.17431
+aline 3.34 1.23204
+amove 3.52667 1.17654
+aline 3.44667 1.2306
+amove 3.62667 1.16478
+aline 3.55333 1.21287
+amove 3.73333 1.15178
+aline 3.66 1.1937
+amove 3.84 1.15072
+aline 3.76667 1.18843
+amove 3.94667 1.17063
+aline 3.87333 1.20754
+amove 4.05333 1.21319
+aline 3.98 1.25301
+amove 4.16 1.27218
+aline 4.08 1.3176
+amove 4.26667 1.33564
+aline 4.18667 1.38739
+amove 2.06667 0.925466
+aline 2.16667 0.961215
+amove 2.17333 0.963598
+aline 2.28 0.974967
+amove 2.28 0.974967
+aline 2.38667 0.964244
+amove 2.38667 0.964244
+aline 2.49333 0.943823
+amove 2.49333 0.943823
+aline 2.6 0.929482
+amove 2.6 0.929482
+aline 2.70667 0.934879
+amove 2.70667 0.934879
+aline 2.81333 0.966773
+amove 2.81333 0.966773
+aline 2.92 1.02267
+amove 2.92 1.02267
+aline 3.01333 1.08709
+amove 3.02 1.09169
+aline 3.12667 1.15836
+amove 3.12667 1.15836
+aline 3.23333 1.20805
+amove 3.23333 1.20805
+aline 3.33333 1.23054
+amove 3.34 1.23204
+aline 3.44667 1.2306
+amove 3.44667 1.2306
+aline 3.55333 1.21287
+amove 3.55333 1.21287
+aline 3.65333 1.1949
+amove 3.66 1.1937
+aline 3.76 1.18876
+amove 3.76667 1.18843
+aline 3.87333 1.20754
+amove 3.87333 1.20754
+aline 3.98 1.25301
+amove 3.98 1.25301
+aline 4.08 1.3176
+amove 4.08 1.3176
+aline 4.18667 1.38739
+amove 2.06667 0.925466
+aline 1.99333 0.987659
+amove 2.17333 0.963598
+aline 2.1 1.02816
+amove 2.28 0.974967
+aline 2.20667 1.03716
+amove 2.38667 0.964244
+aline 2.31333 1.02016
+amove 2.49333 0.943823
+aline 2.41333 0.991748
+amove 2.6 0.929482
+aline 2.52 0.970491
+amove 2.70667 0.934879
+aline 2.62667 0.972464
+amove 2.81333 0.966773
+aline 2.73333 1.00562
+amove 2.92 1.02267
+aline 2.84 1.06703
+amove 3.02 1.09169
+aline 2.94667 1.14388
+amove 3.12667 1.15836
+aline 3.05333 1.21797
+amove 3.23333 1.20805
+aline 3.16 1.27207
+amove 3.34 1.23204
+aline 3.26667 1.29593
+amove 3.44667 1.2306
+aline 3.36667 1.28985
+amove 3.55333 1.21287
+aline 3.47333 1.26461
+amove 3.66 1.1937
+aline 3.58 1.23767
+amove 3.76667 1.18843
+aline 3.68667 1.22708
+amove 3.87333 1.20754
+aline 3.79333 1.2452
+amove 3.98 1.25301
+aline 3.9 1.29434
+amove 4.08 1.3176
+aline 4.00667 1.36597
+amove 4.18667 1.38739
+aline 4.11333 1.44373
+amove 1.99333 0.987659
+aline 2.1 1.02816
+amove 2.1 1.02816
+aline 2.20667 1.03716
+amove 2.20667 1.03716
+aline 2.31333 1.02016
+amove 2.31333 1.02016
+aline 2.40667 0.993642
+amove 2.41333 0.991748
+aline 2.51333 0.97182
+amove 2.52 0.970491
+aline 2.62 0.97234
+amove 2.62667 0.972464
+aline 2.72667 1.00355
+amove 2.73333 1.00562
+aline 2.84 1.06703
+amove 2.84 1.06703
+aline 2.94667 1.14388
+amove 2.94667 1.14388
+aline 3.05333 1.21797
+amove 3.05333 1.21797
+aline 3.15333 1.26869
+amove 3.16 1.27207
+aline 3.26667 1.29593
+amove 3.26667 1.29593
+aline 3.36667 1.28985
+amove 3.36667 1.28985
+aline 3.47333 1.26461
+amove 3.47333 1.26461
+aline 3.57333 1.23935
+amove 3.58 1.23767
+aline 3.68 1.22774
+amove 3.68667 1.22708
+aline 3.79333 1.2452
+amove 3.79333 1.2452
+aline 3.9 1.29434
+amove 3.9 1.29434
+aline 4.00667 1.36597
+amove 4.00667 1.36597
+aline 4.11333 1.44373
+amove 1.99333 0.987659
+aline 1.91333 1.05777
+amove 2.1 1.02816
+aline 2.02 1.10131
+amove 2.20667 1.03716
+aline 2.12667 1.10727
+amove 2.31333 1.02016
+aline 2.23333 1.08223
+amove 2.41333 0.991748
+aline 2.34 1.04358
+amove 2.52 0.970491
+aline 2.44667 1.01346
+amove 2.62667 0.972464
+aline 2.55333 1.01104
+amove 2.73333 1.00562
+aline 2.66 1.04582
+amove 2.84 1.06703
+aline 2.76 1.11429
+amove 2.94667 1.14388
+aline 2.86667 1.20118
+amove 3.05333 1.21797
+aline 2.97333 1.28478
+amove 3.16 1.27207
+aline 3.08 1.34453
+amove 3.26667 1.29593
+aline 3.18667 1.36821
+amove 3.36667 1.28985
+aline 3.29333 1.3562
+amove 3.47333 1.26461
+aline 3.4 1.32132
+amove 3.58 1.23767
+aline 3.50667 1.28442
+amove 3.68667 1.22708
+aline 3.61333 1.26703
+amove 3.79333 1.2452
+aline 3.72 1.28387
+amove 3.9 1.29434
+aline 3.82 1.3377
+amove 4.00667 1.36597
+aline 3.92667 1.41837
+amove 4.11333 1.44373
+aline 4.03333 1.50634
+amove 1.91333 1.05777
+aline 2.01333 1.09859
+amove 2.02 1.10131
+aline 2.12667 1.10727
+amove 2.12667 1.10727
+aline 2.22667 1.0838
+amove 2.23333 1.08223
+aline 2.33333 1.04599
+amove 2.34 1.04358
+aline 2.44 1.01534
+amove 2.44667 1.01346
+aline 2.55333 1.01104
+amove 2.55333 1.01104
+aline 2.66 1.04582
+amove 2.66 1.04582
+aline 2.76 1.11429
+amove 2.76 1.11429
+aline 2.86 1.19574
+amove 2.86667 1.20118
+aline 2.97333 1.28478
+amove 2.97333 1.28478
+aline 3.07333 1.3408
+amove 3.08 1.34453
+aline 3.18 1.36673
+amove 3.18667 1.36821
+aline 3.28667 1.35695
+amove 3.29333 1.3562
+aline 3.4 1.32132
+amove 3.4 1.32132
+aline 3.5 1.28673
+amove 3.50667 1.28442
+aline 3.61333 1.26703
+amove 3.61333 1.26703
+aline 3.72 1.28387
+amove 3.72 1.28387
+aline 3.81333 1.33411
+amove 3.82 1.3377
+aline 3.92667 1.41837
+amove 3.92667 1.41837
+aline 4.02667 1.50084
+amove 1.91333 1.05777
+aline 1.84 1.13895
+amove 2.02 1.10131
+aline 1.94667 1.18645
+amove 2.12667 1.10727
+aline 2.05333 1.18845
+amove 2.23333 1.08223
+aline 2.15333 1.1529
+amove 2.34 1.04358
+aline 2.26 1.10086
+amove 2.44667 1.01346
+aline 2.36667 1.05915
+amove 2.55333 1.01104
+aline 2.47333 1.051
+amove 2.66 1.04582
+aline 2.58 1.0879
+amove 2.76 1.11429
+aline 2.68667 1.1656
+amove 2.86667 1.20118
+aline 2.79333 1.2656
+amove 2.97333 1.28478
+aline 2.9 1.36163
+amove 3.08 1.34453
+aline 3.00667 1.42877
+amove 3.18667 1.36821
+aline 3.10667 1.45223
+amove 3.29333 1.3562
+aline 3.21333 1.43245
+amove 3.4 1.32132
+aline 3.32 1.38499
+amove 3.50667 1.28442
+aline 3.42667 1.33507
+amove 3.61333 1.26703
+aline 3.53333 1.30878
+amove 3.72 1.28387
+aline 3.64 1.32395
+amove 3.82 1.3377
+aline 3.74667 1.38393
+amove 3.92667 1.41837
+aline 3.85333 1.4764
+amove 4.03333 1.50634
+aline 3.96 1.57772
+amove 1.84 1.13895
+aline 1.94 1.18349
+amove 1.94667 1.18645
+aline 2.04667 1.18833
+amove 2.05333 1.18845
+aline 2.15333 1.1529
+amove 2.15333 1.1529
+aline 2.26 1.10086
+amove 2.26 1.10086
+aline 2.36 1.06176
+amove 2.36667 1.05915
+aline 2.46667 1.05151
+amove 2.47333 1.051
+aline 2.57333 1.08559
+amove 2.58 1.0879
+aline 2.68 1.16074
+amove 2.68667 1.1656
+aline 2.79333 1.2656
+amove 2.79333 1.2656
+aline 2.89333 1.35563
+amove 2.9 1.36163
+aline 3 1.42458
+amove 3.00667 1.42877
+aline 3.10667 1.45223
+amove 3.10667 1.45223
+aline 3.20667 1.43368
+amove 3.21333 1.43245
+aline 3.31333 1.38795
+amove 3.32 1.38499
+aline 3.42667 1.33507
+amove 3.42667 1.33507
+aline 3.53333 1.30878
+amove 3.53333 1.30878
+aline 3.64 1.32395
+amove 3.64 1.32395
+aline 3.74667 1.38393
+amove 3.74667 1.38393
+aline 3.84667 1.47062
+amove 3.85333 1.4764
+aline 3.95333 1.57138
+amove 1.84 1.13895
+aline 1.76 1.23596
+amove 1.94667 1.18645
+aline 1.86667 1.28876
+amove 2.05333 1.18845
+aline 1.97333 1.28547
+amove 2.15333 1.1529
+aline 2.08 1.23587
+amove 2.26 1.10086
+aline 2.18667 1.16594
+amove 2.36667 1.05915
+aline 2.29333 1.10876
+amove 2.47333 1.051
+aline 2.4 1.09295
+amove 2.58 1.0879
+aline 2.5 1.13267
+amove 2.68667 1.1656
+aline 2.60667 1.2227
+amove 2.79333 1.2656
+aline 2.71333 1.34023
+amove 2.9 1.36163
+aline 2.82 1.45286
+amove 3.00667 1.42877
+aline 2.92667 1.52987
+amove 3.10667 1.45223
+aline 3.03333 1.55303
+amove 3.21333 1.43245
+aline 3.14 1.52288
+amove 3.32 1.38499
+aline 3.24667 1.4586
+amove 3.42667 1.33507
+aline 3.35333 1.3913
+amove 3.53333 1.30878
+aline 3.46 1.35312
+amove 3.64 1.32395
+aline 3.56 1.36606
+amove 3.74667 1.38393
+aline 3.66667 1.43424
+amove 3.85333 1.4764
+aline 3.77333 1.54248
+amove 3.96 1.57772
+aline 3.88 1.66163
+amove 1.76 1.23596
+aline 1.86667 1.28876
+amove 1.86667 1.28876
+aline 1.97333 1.28547
+amove 1.97333 1.28547
+aline 2.08 1.23587
+amove 2.08 1.23587
+aline 2.18667 1.16594
+amove 2.18667 1.16594
+aline 2.28667 1.11234
+amove 2.29333 1.10876
+aline 2.4 1.09295
+amove 2.4 1.09295
+aline 2.5 1.13267
+amove 2.5 1.13267
+aline 2.60667 1.2227
+amove 2.60667 1.2227
+aline 2.70667 1.33289
+amove 2.71333 1.34023
+aline 2.81333 1.44582
+amove 2.82 1.45286
+aline 2.92667 1.52987
+amove 2.92667 1.52987
+aline 3.03333 1.55303
+amove 3.03333 1.55303
+aline 3.13333 1.52476
+amove 3.14 1.52288
+aline 3.24667 1.4586
+amove 3.24667 1.4586
+aline 3.34667 1.3955
+amove 3.35333 1.3913
+aline 3.46 1.35312
+amove 3.46 1.35312
+aline 3.55333 1.3652
+amove 3.56 1.36606
+aline 3.66 1.42997
+amove 3.66667 1.43424
+aline 3.77333 1.54248
+amove 3.77333 1.54248
+aline 3.87333 1.65418
+amove 1.76 1.23596
+aline 1.68667 1.35622
+amove 1.86667 1.28876
+aline 1.79333 1.41627
+amove 1.97333 1.28547
+aline 1.89333 1.40572
+amove 2.08 1.23587
+aline 2 1.33689
+amove 2.18667 1.16594
+aline 2.10667 1.24248
+amove 2.29333 1.10876
+aline 2.21333 1.16411
+amove 2.4 1.09295
+aline 2.32 1.13781
+amove 2.5 1.13267
+aline 2.42667 1.1814
+amove 2.60667 1.2227
+aline 2.53333 1.28831
+amove 2.71333 1.34023
+aline 2.64 1.42984
+amove 2.82 1.45286
+aline 2.74667 1.56519
+amove 2.92667 1.52987
+aline 2.84667 1.65572
+amove 3.03333 1.55303
+aline 2.95333 1.67847
+amove 3.14 1.52288
+aline 3.06 1.63412
+amove 3.24667 1.4586
+aline 3.16667 1.54681
+amove 3.35333 1.3913
+aline 3.27333 1.4557
+amove 3.46 1.35312
+aline 3.38 1.40125
+amove 3.56 1.36606
+aline 3.48667 1.41114
+amove 3.66667 1.43424
+aline 3.59333 1.49055
+amove 3.77333 1.54248
+aline 3.7 1.62038
+amove 3.88 1.66163
+aline 3.80667 1.76394
+amove 1.68667 1.35622
+aline 1.79333 1.41627
+amove 1.79333 1.41627
+aline 1.88667 1.40642
+amove 1.89333 1.40572
+aline 2 1.33689
+amove 2 1.33689
+aline 2.1 1.24838
+amove 2.10667 1.24248
+aline 2.20667 1.16901
+amove 2.21333 1.16411
+aline 2.32 1.13781
+amove 2.32 1.13781
+aline 2.42 1.17868
+amove 2.42667 1.1814
+aline 2.53333 1.28831
+amove 2.53333 1.28831
+aline 2.63333 1.42099
+amove 2.64 1.42984
+aline 2.74 1.55673
+amove 2.74667 1.56519
+aline 2.84667 1.65572
+amove 2.84667 1.65572
+aline 2.95333 1.67847
+amove 2.95333 1.67847
+aline 3.05333 1.63689
+amove 3.06 1.63412
+aline 3.16 1.55227
+amove 3.16667 1.54681
+aline 3.27333 1.4557
+amove 3.27333 1.4557
+aline 3.37333 1.40466
+amove 3.38 1.40125
+aline 3.48667 1.41114
+amove 3.48667 1.41114
+aline 3.58667 1.48558
+amove 3.59333 1.49055
+aline 3.7 1.62038
+amove 3.7 1.62038
+aline 3.80667 1.76394
+amove 1.68667 1.35622
+aline 1.60667 1.51145
+amove 1.79333 1.41627
+aline 1.71333 1.58171
+amove 1.89333 1.40572
+aline 1.82 1.56095
+amove 2 1.33689
+aline 1.92667 1.4651
+amove 2.10667 1.24248
+aline 2.03333 1.33626
+amove 2.21333 1.16411
+aline 2.14 1.2281
+amove 2.32 1.13781
+aline 2.24 1.18705
+amove 2.42667 1.1814
+aline 2.34667 1.23609
+amove 2.53333 1.28831
+aline 2.45333 1.36674
+amove 2.64 1.42984
+aline 2.56 1.542
+amove 2.74667 1.56519
+aline 2.66667 1.7093
+amove 2.84667 1.65572
+aline 2.77333 1.81884
+amove 2.95333 1.67847
+aline 2.88 1.841
+amove 3.06 1.63412
+aline 2.98667 1.77668
+amove 3.16667 1.54681
+aline 3.09333 1.65701
+amove 3.27333 1.4557
+aline 3.2 1.53243
+amove 3.38 1.40125
+aline 3.3 1.4551
+amove 3.48667 1.41114
+aline 3.40667 1.46069
+amove 3.59333 1.49055
+aline 3.51333 1.55589
+amove 3.7 1.62038
+aline 3.62 1.71608
+amove 3.80667 1.76394
+aline 3.72667 1.89397
+amove 1.60667 1.51145
+aline 1.71333 1.58171
+amove 1.71333 1.58171
+aline 1.82 1.56095
+amove 1.82 1.56095
+aline 1.92 1.47109
+amove 1.92667 1.4651
+aline 2.03333 1.33626
+amove 2.03333 1.33626
+aline 2.13333 1.23486
+amove 2.14 1.2281
+aline 2.23333 1.18979
+amove 2.24 1.18705
+aline 2.34 1.23302
+amove 2.34667 1.23609
+aline 2.44667 1.35857
+amove 2.45333 1.36674
+aline 2.56 1.542
+amove 2.56 1.542
+aline 2.66667 1.7093
+amove 2.66667 1.7093
+aline 2.77333 1.81884
+amove 2.77333 1.81884
+aline 2.88 1.841
+amove 2.88 1.841
+aline 2.98667 1.77668
+amove 2.98667 1.77668
+aline 3.08667 1.66449
+amove 3.09333 1.65701
+aline 3.2 1.53243
+amove 3.2 1.53243
+aline 3.3 1.4551
+amove 3.3 1.4551
+aline 3.40667 1.46069
+amove 3.40667 1.46069
+aline 3.50667 1.54994
+amove 3.51333 1.55589
+aline 3.62 1.71608
+amove 3.62 1.71608
+aline 3.72667 1.89397
+amove 1.60667 1.51145
+aline 1.53333 1.72043
+amove 1.71333 1.58171
+aline 1.63333 1.8054
+amove 1.82 1.56095
+aline 1.74 1.76993
+amove 1.92667 1.4651
+aline 1.84667 1.63505
+amove 2.03333 1.33626
+aline 1.95333 1.45652
+amove 2.14 1.2281
+aline 2.14 1.2281
+amove 2.24 1.18705
+aline 2.16667 1.24302
+amove 2.34667 1.23609
+aline 2.27333 1.29992
+amove 2.45333 1.36674
+aline 2.38 1.46483
+amove 2.56 1.542
+aline 2.48667 1.68878
+amove 2.66667 1.7093
+aline 2.58667 1.9022
+amove 2.77333 1.81884
+aline 2.69333 2.03917
+amove 2.88 1.841
+aline 2.8 2.0605
+amove 2.98667 1.77668
+aline 2.90667 1.96737
+amove 3.09333 1.65701
+aline 3.01333 1.80097
+amove 3.2 1.53243
+aline 3.12 1.62807
+amove 3.3 1.4551
+aline 3.22667 1.51772
+amove 3.40667 1.46069
+aline 3.33333 1.51711
+amove 3.51333 1.55589
+aline 3.44 1.6351
+amove 3.62 1.71608
+aline 3.54667 1.83912
+amove 3.72667 1.89397
+aline 3.64667 2.06654
+amove 1.53333 1.72043
+aline 1.63333 1.8054
+amove 1.63333 1.8054
+aline 1.73333 1.77214
+amove 1.74 1.76993
+aline 1.84667 1.63505
+amove 1.84667 1.63505
+aline 1.95333 1.45652
+amove 1.95333 1.45652
+aline 2.04667 1.32426
+amove 2.07333 1.29757
+aline 2.16667 1.24302
+amove 2.16667 1.24302
+aline 2.26667 1.29636
+amove 2.27333 1.29992
+aline 2.37333 1.45452
+amove 2.38 1.46483
+aline 2.48667 1.68878
+amove 2.48667 1.68878
+aline 2.58 1.88797
+amove 2.58667 1.9022
+aline 2.68667 2.03061
+amove 2.69333 2.03917
+aline 2.8 2.0605
+amove 2.8 2.0605
+aline 2.90667 1.96737
+amove 2.90667 1.96737
+aline 3.00667 1.81137
+amove 3.01333 1.80097
+aline 3.12 1.62807
+amove 3.12 1.62807
+aline 3.22667 1.51772
+amove 3.22667 1.51772
+aline 3.33333 1.51711
+amove 3.33333 1.51711
+aline 3.43333 1.62772
+amove 3.44 1.6351
+aline 3.54 1.82637
+amove 3.54667 1.83912
+aline 3.64667 2.06654
+amove 1.53333 1.72043
+aline 1.45333 2.01208
+amove 1.63333 1.8054
+aline 1.56 2.11874
+amove 1.74 1.76993
+aline 1.66667 2.06159
+amove 1.84667 1.63505
+aline 1.77333 1.86924
+amove 1.95333 1.45652
+aline 1.88 1.61754
+amove 2.16667 1.24302
+aline 2.08667 1.30936
+amove 2.27333 1.29992
+aline 2.19333 1.37783
+amove 2.38 1.46483
+aline 2.3 1.59319
+amove 2.48667 1.68878
+aline 2.40667 1.88886
+amove 2.58667 1.9022
+aline 2.51333 2.17019
+amove 2.69333 2.03917
+aline 2.62 2.34757
+amove 2.8 2.0605
+aline 2.72667 2.36766
+amove 2.90667 1.96737
+aline 2.83333 2.2321
+amove 3.01333 1.80097
+aline 2.94 1.99688
+amove 3.12 1.62807
+aline 3.12 1.62807
+amove 3.22667 1.51772
+aline 3.22667 1.51772
+amove 3.33333 1.51711
+aline 3.25333 1.5841
+amove 3.44 1.6351
+aline 3.36 1.73566
+amove 3.54667 1.83912
+aline 3.46667 2.00421
+amove 3.64667 2.06654
+aline 3.57333 2.3046
+amove 1.45333 2.01208
+aline 1.56 2.11874
+amove 1.56 2.11874
+aline 1.66667 2.06159
+amove 1.66667 2.06159
+aline 1.77333 1.86924
+amove 1.77333 1.86924
+aline 1.88 1.61754
+amove 1.88 1.61754
+aline 1.95333 1.46025
+amove 2.01333 1.37377
+aline 2.08667 1.30936
+amove 2.08667 1.30936
+aline 2.19333 1.37783
+amove 2.19333 1.37783
+aline 2.3 1.59319
+amove 2.3 1.59319
+aline 2.4 1.87038
+amove 2.40667 1.88886
+aline 2.50667 2.15261
+amove 2.51333 2.17019
+aline 2.61333 2.33648
+amove 2.62 2.34757
+aline 2.72667 2.36766
+amove 2.72667 2.36766
+aline 2.82667 2.24057
+amove 2.83333 2.2321
+aline 2.93333 2.01158
+amove 2.94 1.99688
+aline 3.03333 1.7691
+amove 3.08 1.69321
+aline 3.12667 1.62365
+amove 3.16 1.59263
+aline 3.24667 1.58471
+amove 3.25333 1.5841
+aline 3.36 1.73566
+amove 3.36 1.73566
+aline 3.46667 2.00421
+amove 3.46667 2.00421
+aline 3.57333 2.3046
+amove 1.45333 2.01208
+aline 1.37333 2.42459
+amove 1.56 2.11874
+aline 1.48 2.5631
+amove 1.66667 2.06159
+aline 1.58667 2.47409
+amove 1.77333 1.86924
+aline 1.69333 2.19732
+amove 1.88 1.61754
+aline 1.8 1.83811
+amove 2.08667 1.30936
+aline 2.01333 1.39083
+amove 2.19333 1.37783
+aline 2.12 1.4763
+amove 2.3 1.59319
+aline 2.22667 1.76579
+amove 2.40667 1.88886
+aline 2.32667 2.16682
+amove 2.51333 2.17019
+aline 2.43333 2.54794
+amove 2.62 2.34757
+aline 2.54 2.78467
+amove 2.72667 2.36766
+aline 2.64667 2.80294
+amove 2.83333 2.2321
+aline 2.75333 2.60503
+amove 2.94 1.99688
+aline 2.86 2.26873
+amove 3.25333 1.5841
+aline 3.18 1.66654
+amove 3.36 1.73566
+aline 3.28667 1.86741
+amove 3.46667 2.00421
+aline 3.38667 2.23078
+amove 3.57333 2.3046
+aline 3.49333 2.63836
+amove 1.37333 2.42459
+aline 1.47333 2.55444
+amove 1.48 2.5631
+aline 1.58667 2.47409
+amove 1.58667 2.47409
+aline 1.68667 2.21462
+amove 1.69333 2.19732
+aline 1.79333 1.86056
+amove 1.8 1.83811
+aline 1.8 1.83811
+amove 1.94667 1.47818
+aline 2.01333 1.39083
+amove 2.01333 1.39083
+aline 2.12 1.4763
+amove 2.12 1.4763
+aline 2.22 1.7477
+amove 2.22667 1.76579
+aline 2.32667 2.16682
+amove 2.32667 2.16682
+aline 2.43333 2.54794
+amove 2.43333 2.54794
+aline 2.54 2.78467
+amove 2.54 2.78467
+aline 2.64667 2.80294
+amove 2.64667 2.80294
+aline 2.74667 2.6174
+amove 2.75333 2.60503
+aline 2.86 2.26873
+amove 2.86 2.26873
+aline 2.94667 1.9855
+amove 3.01333 1.81932
+aline 3.04667 1.74731
+amove 3.08667 1.6868
+aline 3.18 1.66654
+amove 3.18 1.66654
+aline 3.28667 1.86741
+amove 3.28667 1.86741
+aline 3.38 2.20655
+amove 3.38667 2.23078
+aline 3.48667 2.61289
+amove 1.37333 2.42459
+aline 1.3 2.9785
+amove 1.48 2.5631
+aline 1.40667 3.16076
+amove 1.58667 2.47409
+aline 1.51333 3.028
+amove 1.69333 2.19732
+aline 1.62 2.63526
+amove 1.8 1.83811
+aline 1.72 2.12837
+amove 2.01333 1.39083
+aline 2.01333 1.39083
+amove 2.12 1.4763
+aline 2.04 1.59884
+amove 2.22667 1.76579
+aline 2.14667 1.99016
+amove 2.32667 2.16682
+aline 2.25333 2.53591
+amove 2.43333 2.54794
+aline 2.36 3.05409
+amove 2.54 2.78467
+aline 2.46667 3.37235
+amove 2.64667 2.80294
+aline 2.57333 3.38814
+amove 2.75333 2.60503
+aline 2.68 3.10459
+amove 2.86 2.26873
+aline 2.78 2.62941
+amove 3.18 1.66654
+aline 3.1 1.76706
+amove 3.28667 1.86741
+aline 3.20667 2.03567
+amove 3.38667 2.23078
+aline 3.31333 2.52927
+amove 3.49333 2.63836
+aline 3.42 3.08409
+amove 1.3 2.9785
+aline 1.40667 3.16076
+amove 1.40667 3.16076
+aline 1.50667 3.0363
+amove 1.51333 3.028
+aline 1.62 2.63526
+amove 1.62 2.63526
+aline 1.72 2.12837
+amove 1.72 2.12837
+aline 1.72 2.12837
+amove 1.94 1.49682
+aline 2.04 1.59884
+amove 2.04 1.59884
+aline 2.14 1.9657
+amove 2.14667 1.99016
+aline 2.25333 2.53591
+amove 2.25333 2.53591
+aline 2.36 3.05409
+amove 2.36 3.05409
+aline 2.46667 3.37235
+amove 2.46667 3.37235
+aline 2.57333 3.38814
+amove 2.57333 3.38814
+aline 2.67333 3.12232
+amove 2.68 3.10459
+aline 2.78 2.62941
+amove 2.78 2.62941
+aline 2.78 2.62941
+amove 3.02667 1.79565
+aline 3.1 1.76706
+amove 3.1 1.76706
+aline 3.2 2.01888
+amove 3.20667 2.03567
+aline 3.31333 2.52927
+amove 3.31333 2.52927
+aline 3.42 3.08409
+amove 1.3 2.9785
+aline 1.22 3.57399
+amove 1.40667 3.16076
+aline 1.32667 3.8035
+amove 1.51333 3.028
+aline 1.43333 3.62349
+amove 1.62 2.63526
+aline 1.54 3.1055
+amove 1.72 2.12837
+aline 1.72 2.12837
+amove 2.04 1.59884
+aline 1.96667 1.72847
+amove 2.14667 1.99016
+aline 2.06667 2.22975
+amove 2.25333 2.53591
+aline 2.17333 2.93179
+amove 2.36 3.05409
+aline 2.28 3.59802
+amove 2.46667 3.37235
+aline 2.38667 4.00432
+amove 2.57333 3.38814
+aline 2.49333 4.01741
+amove 2.68 3.10459
+aline 2.6 3.64138
+amove 2.78 2.62941
+aline 2.70667 3.01623
+amove 3.1 1.76706
+aline 3.02667 1.87289
+amove 3.20667 2.03567
+aline 3.12667 2.21466
+amove 3.31333 2.52927
+aline 3.23333 2.84892
+amove 3.42 3.08409
+aline 3.34 3.56276
+amove 1.22 3.57399
+aline 1.32 3.78916
+amove 1.32667 3.8035
+aline 1.43333 3.62349
+amove 1.43333 3.62349
+aline 1.54 3.1055
+amove 1.54 3.1055
+aline 1.54 3.1055
+amove 1.88 1.61955
+aline 1.96667 1.72847
+amove 1.96667 1.72847
+aline 2.06667 2.22975
+amove 2.06667 2.22975
+aline 2.17333 2.93179
+amove 2.17333 2.93179
+aline 2.28 3.59802
+amove 2.28 3.59802
+aline 2.38667 4.00432
+amove 2.38667 4.00432
+aline 2.49333 4.01741
+amove 2.49333 4.01741
+aline 2.6 3.64138
+amove 2.6 3.64138
+aline 2.7 3.0553
+amove 2.70667 3.01623
+aline 2.70667 3.01623
+amove 2.98 1.89979
+aline 3.02667 1.87289
+amove 3.02667 1.87289
+aline 3.12 2.19187
+amove 3.12667 2.21466
+aline 3.23333 2.84892
+amove 3.23333 2.84892
+aline 3.33333 3.51814
+amove 1.22 3.57399
+aline 1.14667 3.87837
+amove 1.32667 3.8035
+aline 1.25333 4.13063
+amove 1.43333 3.62349
+aline 1.36 3.92787
+amove 1.54 3.1055
+aline 1.54 3.1055
+amove 1.96667 1.72847
+aline 1.88667 1.80854
+amove 2.06667 2.22975
+aline 1.99333 2.36277
+amove 2.17333 2.93179
+aline 2.1 3.14007
+amove 2.28 3.59802
+aline 2.20667 3.87756
+amove 2.38667 4.00432
+aline 2.31333 4.32626
+amove 2.49333 4.01741
+aline 2.42 4.33807
+amove 2.6 3.64138
+aline 2.6 3.64138
+amove 2.70667 3.01623
+aline 2.70667 3.01623
+amove 3.02667 1.87289
+aline 2.97333 1.91864
+amove 3.12667 2.21466
+aline 3.05333 2.3185
+amove 3.23333 2.84892
+aline 3.16 3.02049
+amove 3.34 3.56276
+aline 3.26667 3.8109
+amove 1.14667 3.87837
+aline 1.24667 4.11487
+amove 1.25333 4.13063
+aline 1.36 3.92787
+amove 1.36 3.92787
+aline 1.36 3.92787
+amove 1.84 1.74458
+aline 1.88667 1.80854
+amove 1.88667 1.80854
+aline 1.98667 2.32813
+amove 1.99333 2.36277
+aline 2.09333 3.09149
+amove 2.1 3.14007
+aline 2.2 3.83147
+amove 2.20667 3.87756
+aline 2.31333 4.32626
+amove 2.31333 4.32626
+aline 2.41333 4.33733
+amove 2.42 4.33807
+aline 2.50667 3.97358
+amove 2.95333 1.96507
+aline 3.05333 2.3185
+amove 3.05333 2.3185
+aline 3.15333 2.97661
+amove 3.16 3.02049
+aline 3.26667 3.8109
+amove 1.14667 3.87837
+aline 1.06667 3.64211
+amove 1.25333 4.13063
+aline 1.25333 4.13063
+amove 1.36 3.92787
+aline 1.36 3.92787
+amove 1.88667 1.80854
+aline 1.82 1.79858
+amove 1.99333 2.36277
+aline 1.91333 2.29787
+amove 2.1 3.14007
+aline 2.02 2.99991
+amove 2.20667 3.87756
+aline 2.12667 3.66614
+amove 2.31333 4.32626
+aline 2.23333 4.07244
+amove 2.42 4.33807
+aline 2.42 4.33807
+amove 3.05333 2.3185
+aline 2.97333 2.28278
+amove 3.16 3.02049
+aline 3.08 2.91703
+amove 3.26667 3.8109
+aline 3.18667 3.63088
+amove 1.06667 3.64211
+aline 1.06667 3.64211
+amove 1.81333 1.82792
+aline 1.91333 2.29787
+amove 1.91333 2.29787
+aline 2.01333 2.95603
+amove 2.02 2.99991
+aline 2.12 3.6245
+amove 2.12667 3.66614
+aline 2.23333 4.07244
+amove 2.23333 4.07244
+aline 2.23333 4.07244
+amove 2.92 2.11189
+aline 2.97333 2.28278
+amove 2.97333 2.28278
+aline 3.08 2.91703
+amove 3.08 2.91703
+aline 3.18 3.58626
+amove 1.06667 3.64211
+aline 0.993333 3.11474
+amove 1.91333 2.29787
+aline 1.84 2.1264
+amove 2.02 2.99991
+aline 1.94667 2.67214
+amove 2.12667 3.66614
+aline 2.12667 3.66614
+amove 2.23333 4.07244
+aline 2.23333 4.07244
+amove 2.97333 2.28278
+aline 2.9 2.17191
+amove 3.08 2.91703
+aline 3.00667 2.66551
+amove 3.18667 3.63088
+aline 3.11333 3.22033
+amove 0.993333 3.11474
+aline 0.993333 3.11474
+amove 1.78667 1.93074
+aline 1.84 2.1264
+amove 1.84 2.1264
+aline 1.94667 2.67214
+amove 1.94667 2.67214
+aline 2.04 3.12556
+amove 2.9 2.17191
+aline 2.9 2.17191
+amove 2.9 2.17191
+aline 3 2.63466
+amove 3.00667 2.66551
+aline 3.10667 3.18565
+amove 0.993333 3.11474
+aline 0.913333 2.62895
+amove 1.84 2.1264
+aline 1.76667 1.98317
+amove 1.94667 2.67214
+aline 1.86667 2.37117
+amove 2.9 2.17191
+aline 2.89333 2.16356
+amove 3.00667 2.66551
+aline 2.92667 2.43514
+amove 3.11333 3.22033
+aline 3.03333 2.84272
+amove 0.913333 2.62895
+aline 0.913333 2.62895
+amove 1.76667 1.99521
+aline 1.86667 2.37117
+amove 1.86667 2.37117
+aline 1.86667 2.37117
+amove 2.87333 2.25345
+aline 2.92 2.41243
+amove 2.92667 2.43514
+aline 3.03333 2.84272
+amove 0.913333 2.62895
+aline 0.84 2.28456
+amove 1.86667 2.37117
+aline 1.79333 2.16134
+amove 2.92667 2.43514
+aline 2.86 2.2911
+amove 3.03333 2.84272
+aline 2.95333 2.57708
+amove 0.84 2.28456
+aline 0.84 2.28456
+amove 1.74667 2.03198
+aline 1.78667 2.14286
+amove 1.79333 2.16134
+aline 1.79333 2.16134
+amove 2.86 2.29672
+aline 2.94667 2.55705
+set color BLACK
+set lstyle 1
+set color BLACK
+set lstyle 1
+amove 4.49333 1.12523
+aline 4.41333 1.15733
+amove 1.61333 1.49852
+aline 0.84 1.31141
+amove 0.84 2.28456
+aline 0.84 3.91649
+amove 0.84 2.28456
+aline 0.84 1.31141
+amove 0.84 3.91649
+aline 1.2 4.0045
+amove 1.31333 4.01658
+aline 2.29333 4.26281
+amove 2.43333 4.28199
+aline 2.95333 4.4115
+amove 2.95333 2.57708
+aline 2.95333 4.4115
+amove 2.95333 4.4115
+aline 4.5 3.7303
+amove 4.5 3.73028
+aline 4.5 3.7303
+amove 4.49333 1.19793
+aline 4.49333 3.7303
+amove 4.49333 1.19793
+aline 4.49333 1.12523
+amove 0.840285 1.31141
+aline 2.38049 0.630214
+amove 2.38049 0.630214
+aline 4.5 1.12523
+set just BC
+set color BLACK
+set hei 0.0833333
+set just TC
+amove 0.840285 1.31141
+aline 0.838263 1.30684
+amove 0.797815 1.21538
+rotate -23.8587
+text 0
+rotate 23.8587
+amove 0.994307 1.24329
+aline 0.992284 1.23872
+amove 0.951836 1.14726
+rotate -23.8587
+text 2
+rotate 23.8587
+amove 1.14833 1.17517
+aline 1.1463 1.1706
+amove 1.10586 1.07914
+rotate -23.8587
+text 4
+rotate 23.8587
+amove 1.30235 1.10705
+aline 1.30033 1.10248
+amove 1.25988 1.01102
+rotate -23.8587
+text 6
+rotate 23.8587
+amove 1.45637 1.03893
+aline 1.45435 1.03436
+amove 1.4139 0.942905
+rotate -23.8587
+text 8
+rotate 23.8587
+amove 1.61039 0.970813
+aline 1.60837 0.96624
+amove 1.56792 0.874785
+rotate -23.8587
+text 10
+rotate 23.8587
+amove 1.76441 0.902693
+aline 1.76239 0.89812
+amove 1.72194 0.806665
+rotate -23.8587
+text 12
+rotate 23.8587
+amove 1.91843 0.834573
+aline 1.91641 0.83
+amove 1.87596 0.738545
+rotate -23.8587
+text 14
+rotate 23.8587
+amove 2.07245 0.766454
+aline 2.07043 0.761881
+amove 2.02998 0.670426
+rotate -23.8587
+text 16
+rotate 23.8587
+amove 2.22647 0.698334
+aline 2.22445 0.693761
+amove 2.184 0.602306
+rotate -23.8587
+text 18
+rotate 23.8587
+amove 2.38049 0.630214
+aline 2.37847 0.625641
+amove 2.33802 0.534186
+rotate -23.8587
+text 20
+rotate 23.8587
+set just TC
+set color BLACK
+set hei 0.0833333
+set just TC
+amove 2.38049 0.630214
+aline 2.38163 0.625345
+amove 2.40437 0.527965
+rotate 13.1459
+text 0
+rotate -13.1459
+amove 2.59244 0.679715
+aline 2.59358 0.674846
+amove 2.61632 0.577467
+rotate 13.1459
+text 2
+rotate -13.1459
+amove 2.80439 0.729217
+aline 2.80553 0.724348
+amove 2.82827 0.626968
+rotate 13.1459
+text 4
+rotate -13.1459
+amove 3.01634 0.778718
+aline 3.01748 0.773849
+amove 3.04022 0.67647
+rotate 13.1459
+text 6
+rotate -13.1459
+amove 3.2283 0.828219
+aline 3.22943 0.82335
+amove 3.25218 0.725971
+rotate 13.1459
+text 8
+rotate -13.1459
+amove 3.44025 0.877721
+aline 3.44138 0.872852
+amove 3.46413 0.775472
+rotate 13.1459
+text 10
+rotate -13.1459
+amove 3.6522 0.927221
+aline 3.65333 0.922352
+amove 3.67608 0.824973
+rotate 13.1459
+text 12
+rotate -13.1459
+amove 3.86415 0.976723
+aline 3.86528 0.971854
+amove 3.88803 0.874474
+rotate 13.1459
+text 14
+rotate -13.1459
+amove 4.0761 1.02622
+aline 4.07724 1.02136
+amove 4.09998 0.923976
+rotate 13.1459
+text 16
+rotate -13.1459
+amove 4.28805 1.07573
+aline 4.28919 1.07086
+amove 4.31193 0.973477
+rotate 13.1459
+text 18
+rotate -13.1459
+amove 4.5 1.12523
+aline 4.50114 1.12036
+amove 4.52388 1.02298
+rotate 13.1459
+text 20
+rotate -13.1459
+set just TC
+set color BLACK
+set hei 0.0833333
+set just RC
+amove 0.840285 1.31141
+aline 0.835285 1.31141
+amove 0.735285 1.31141
+text 0
+amove 0.840285 1.74559
+aline 0.835285 1.74559
+amove 0.735285 1.74559
+text 0.5
+amove 0.840285 2.17977
+aline 0.835285 2.17977
+amove 0.735285 2.17977
+text 1
+amove 0.840285 2.61395
+aline 0.835285 2.61395
+amove 0.735285 2.61395
+text 1.5
+amove 0.840285 3.04813
+aline 0.835285 3.04813
+amove 0.735285 3.04813
+text 2
+amove 0.840286 3.48231
+aline 0.835286 3.48231
+amove 0.735286 3.48231
+text 2.5
+amove 0.840286 3.91649
+aline 0.835286 3.91649
+amove 0.735286 3.91649
+text 3
+set just BC
+set color BLACK
+set lstyle 1
+amove 0.84 2.28456
+aline 0.84 3.91649
+amove 0.84 2.28456
+aline 0.84 1.31141
+amove 1.04667 3.49828
+aline 1.04667 3.96599
+amove 1.04667 2.33406
+aline 1.04667 1.36091
+amove 1.26 1.89002
+aline 1.26 1.41041
+amove 1.47333 3.42925
+aline 1.47333 4.06499
+amove 1.47333 1.58184
+aline 1.47333 1.45991
+amove 1.68667 2.29733
+aline 1.68667 4.11449
+amove 1.9 2.49658
+aline 1.9 4.16399
+amove 2.10667 3.54122
+aline 2.10667 4.21349
+amove 2.53333 3.8764
+aline 2.53333 4.3125
+amove 2.74667 2.80524
+aline 2.74667 4.362
+amove 2.95333 2.57708
+aline 2.95333 4.4115
+amove 0.84 1.31141
+aline 1.62 1.48558
+amove 0.84 1.74559
+aline 1.28667 1.8364
+amove 1.67333 2.36492
+aline 1.88667 2.44642
+amove 2.78 2.62941
+aline 2.95333 2.67478
+amove 0.84 2.17977
+aline 1.1 2.23789
+amove 0.84 2.61395
+aline 0.92 2.66944
+amove 1.6 2.75282
+aline 1.99333 2.89885
+amove 2.70667 3.01623
+aline 2.95333 3.10896
+amove 0.84 3.04813
+aline 0.993333 3.11474
+amove 1.52 3.20263
+aline 2.08 3.37466
+amove 2.63333 3.44602
+aline 2.95333 3.54314
+amove 0.84 3.48231
+aline 1.05333 3.54623
+amove 1.44 3.59112
+aline 2.16 3.79311
+amove 2.53333 3.8764
+aline 2.95333 3.97732
+amove 0.84 3.91649
+aline 1.2 4.0045
+amove 1.31333 4.01658
+aline 2.29333 4.26281
+amove 2.43333 4.28199
+aline 2.95333 4.4115
+set color BLACK
+set lstyle 1
+amove 2.95333 2.57708
+aline 2.95333 4.4115
+amove 3.11333 3.22033
+aline 3.11333 4.34338
+amove 3.26667 3.8109
+aline 3.26667 4.27526
+amove 3.42 3.08409
+aline 3.42 4.20714
+amove 3.57333 2.3046
+aline 3.57333 4.13902
+amove 3.72667 1.89397
+aline 3.72667 4.0709
+amove 3.88 1.66163
+aline 3.88 4.00278
+amove 4.03333 1.50634
+aline 4.03333 3.93466
+amove 4.18667 1.38739
+aline 4.18667 3.86654
+amove 4.34 1.28733
+aline 4.34 3.79842
+amove 4.5 1.12523
+aline 4.5 3.7303
+amove 4.5 3.7303
+aline 4.5 1.12523
+amove 4.42 1.16071
+aline 4.49333 1.12523
+amove 3.72667 1.89397
+aline 4.49333 1.55941
+amove 2.95333 2.67478
+aline 2.98 2.66563
+amove 3.55333 2.38804
+aline 4.5 1.99359
+amove 4.5 1.9936
+aline 4.5 1.99359
+amove 2.95333 3.10896
+aline 3.08 3.06299
+amove 3.45333 2.88149
+aline 4.5 2.42776
+amove 4.5 2.42778
+aline 4.5 2.42776
+amove 2.95333 3.54314
+aline 3.16 3.48159
+amove 3.38 3.32343
+aline 4.5 2.86194
+amove 4.5 2.86196
+aline 4.5 2.86194
+amove 2.95333 3.97732
+aline 4.5 3.29612
+amove 4.5 3.29614
+aline 4.5 3.29612
+amove 2.95333 4.4115
+aline 4.5 3.7303
+amove 4.5 3.73028
+aline 4.5 3.7303
+set color BLACK
+set lstyle 1
+amove 0.84 1.31141
+aline 1.62 1.48558
+amove 0.913333 1.27735
+aline 1.64 1.44677
+amove 0.993333 1.24329
+aline 1.66667 1.39502
+amove 1.06667 1.20923
+aline 1.69333 1.34528
+amove 1.14667 1.17517
+aline 1.72 1.30156
+amove 1.22 1.14111
+aline 1.74667 1.25783
+amove 1.3 1.10705
+aline 1.78 1.21171
+amove 1.37333 1.07299
+aline 1.81333 1.17129
+amove 1.45333 1.03893
+aline 1.85333 1.12419
+amove 1.53333 1.00487
+aline 1.88667 1.08729
+amove 1.60667 0.970813
+aline 1.93333 1.04024
+amove 1.68667 0.936752
+aline 1.98 0.999344
+amove 1.76 0.902693
+aline 2.02667 0.959389
+amove 1.84 0.868633
+aline 2.07333 0.920766
+amove 1.91333 0.834573
+aline 2.12667 0.88317
+amove 1.99333 0.800513
+aline 2.18667 0.840675
+amove 2.06667 0.766454
+aline 2.24 0.804819
+amove 2.14667 0.732393
+aline 2.30667 0.764392
+amove 2.22 0.698334
+aline 2.36667 0.729725
+amove 2.3 0.664274
+aline 2.77333 0.774795
+amove 3.30667 0.89956
+aline 3.88667 1.03425
+amove 4.42 1.16071
+aline 4.42 1.15929
+amove 2.38 0.630214
+aline 4.49333 1.12523
+amove 0.84 1.31141
+aline 2.38 0.630214
+amove 1.04667 1.36091
+aline 2.12667 0.88317
+amove 2.44667 0.743672
+aline 2.58667 0.679715
+amove 1.26 1.41041
+aline 1.82667 1.15512
+amove 2.7 0.775709
+aline 2.8 0.729217
+amove 1.47333 1.45991
+aline 1.68667 1.35622
+amove 2.99333 0.787675
+aline 3.01333 0.778718
+amove 3.19333 0.848474
+aline 3.22667 0.828219
+amove 3.35333 0.921316
+aline 3.44 0.877721
+amove 3.51333 0.989804
+aline 3.64667 0.927221
+amove 3.74 1.03298
+aline 3.86 0.976723
+amove 4.04667 1.03936
+aline 4.07333 1.02622
+amove 4.26 1.09025
+aline 4.28667 1.07573
+amove 4.42 1.16071
+aline 4.49333 1.12523
diff --git a/gle-refman/utilities/fig/saddle/saddle.let b/gle-refman/utilities/fig/saddle/saddle.let
new file mode 100644
index 0000000..2425dd5
--- /dev/null
+++ b/gle-refman/utilities/fig/saddle/saddle.let
@@ -0,0 +1,41 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+saddle.z
+0, 20, 1
+0, 20, 1
+3/2*(cos(3/5*(y-1))+5/4)/(1+(((x-4)/3)^2))
diff --git a/gle-refman/utilities/fig/saddle/saddle.sur b/gle-refman/utilities/fig/saddle/saddle.sur
new file mode 100644
index 0000000..aec6fa9
--- /dev/null
+++ b/gle-refman/utilities/fig/saddle/saddle.sur
@@ -0,0 +1,47 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+begin surface
+ size 5 5
+ data saddle.z
+ zaxis min 0 max 3 step .5
+ underneath color blue
+ back zstep .5 ystep 2
+ base xstep 1 ystep 2
+ right zstep .5 xstep 2
+end surface
diff --git a/gle-refman/utilities/fig/saddle/saddle.z b/gle-refman/utilities/fig/saddle/saddle.z
new file mode 100644
index 0000000..1b2dd02
--- /dev/null
+++ b/gle-refman/utilities/fig/saddle/saddle.z
@@ -0,0 +1,59 @@
+! nx 21 ny 21 xmin 0 xmax 20 ymin 0 ymax 20
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+1.12068 1.5565 2.15516 2.8017 3.113 2.8017 2.15516 1.5565 1.12068 0.82403 0.622601 0.483052 0.383795 0.3113 0.257037 0.215516 0.183118 0.157399 0.136668 0.119731 0.105725
+1.215 1.6875 2.33654 3.0375 3.375 3.0375 2.33654 1.6875 1.215 0.893382 0.675 0.523707 0.416096 0.3375 0.27867 0.233654 0.198529 0.170646 0.148171 0.129808 0.114623
+1.12068 1.5565 2.15516 2.8017 3.113 2.8017 2.15516 1.5565 1.12068 0.82403 0.622601 0.483052 0.383795 0.3113 0.257037 0.215516 0.183118 0.157399 0.136668 0.119731 0.105725
+0.870673 1.20927 1.67437 2.17668 2.41854 2.17668 1.67437 1.20927 0.870673 0.640201 0.483707 0.37529 0.298176 0.241854 0.199696 0.167437 0.142267 0.122286 0.10618 0.0930206 0.082139
+0.552311 0.767098 1.06214 1.38078 1.5342 1.38078 1.06214 0.767098 0.552311 0.406111 0.306839 0.238065 0.189148 0.15342 0.126677 0.106214 0.0902469 0.0775718 0.067355 0.0590076 0.0521048
+0.276807 0.384455 0.532322 0.692018 0.768909 0.692018 0.532322 0.384455 0.276807 0.203535 0.153782 0.119314 0.0947971 0.0768909 0.0634879 0.0532322 0.04523 0.0388774 0.033757 0.0295734 0.0261139
+0.140404 0.195006 0.270008 0.35101 0.390011 0.35101 0.270008 0.195006 0.140404 0.103238 0.0780023 0.060519 0.0480836 0.0390011 0.0322028 0.0270008 0.0229418 0.0197197 0.0171224 0.0150004 0.0132457
+0.19075 0.264931 0.366828 0.476876 0.529862 0.476876 0.366828 0.264931 0.19075 0.140258 0.105972 0.08222 0.0653255 0.0529862 0.0437501 0.0366828 0.0311684 0.0267908 0.0232623 0.0203793 0.0179953
+0.410259 0.569804 0.78896 1.02565 1.13961 1.02565 0.78896 0.569804 0.410259 0.301661 0.227922 0.176836 0.1405 0.113961 0.0940961 0.078896 0.0670358 0.0576207 0.0500316 0.0438311 0.0387037
+0.722249 1.00312 1.38894 1.80562 2.00625 1.80562 1.38894 1.00312 0.722249 0.531066 0.40125 0.311314 0.247346 0.200625 0.165654 0.138894 0.118015 0.10144 0.0880792 0.0771634 0.0681367
+1.01773 1.41352 1.95718 2.54434 2.82704 2.54434 1.95718 1.41352 1.01773 0.748334 0.565408 0.438679 0.348539 0.282704 0.233425 0.195718 0.166296 0.14294 0.124114 0.108732 0.0960127
+1.19349 1.65763 2.29518 2.98373 3.31526 2.98373 2.29518 1.65763 1.19349 0.877568 0.663051 0.514436 0.40873 0.331526 0.273737 0.229518 0.195015 0.167625 0.145548 0.12751 0.112594
+1.18813 1.65017 2.28486 2.97031 3.30035 2.97031 2.28486 1.65017 1.18813 0.873622 0.66007 0.512123 0.406892 0.330035 0.272506 0.228486 0.194138 0.166872 0.144893 0.126936 0.112087
+1.00351 1.39376 1.92983 2.50877 2.78753 2.50877 1.92983 1.39376 1.00351 0.737875 0.557505 0.432547 0.343668 0.278753 0.230163 0.192983 0.163972 0.140942 0.122379 0.107213 0.0946707
+0.704136 0.977967 1.35411 1.76034 1.95593 1.76034 1.35411 0.977967 0.704136 0.517747 0.391187 0.303507 0.241142 0.195593 0.161499 0.135411 0.115055 0.0988955 0.0858702 0.0752282 0.0664279
+0.394584 0.548034 0.758816 0.98646 1.09607 0.98646 0.758816 0.548034 0.394584 0.290135 0.219213 0.170079 0.135132 0.109607 0.0905009 0.0758816 0.0644745 0.0554191 0.04812 0.0421564 0.0372249
+0.18299 0.254152 0.351903 0.457474 0.508305 0.457474 0.351903 0.254152 0.18299 0.134551 0.101661 0.0788749 0.0626677 0.0508305 0.0419701 0.0351903 0.0299003 0.0257008 0.0223158 0.0195502 0.0172632
+0.143269 0.198984 0.275516 0.358171 0.397968 0.358171 0.275516 0.198984 0.143269 0.105345 0.0795936 0.0617537 0.0490646 0.0397968 0.0328598 0.0275516 0.0234099 0.020122 0.0174718 0.0153065 0.0135159
+0.289297 0.401801 0.55634 0.723241 0.803602 0.723241 0.55634 0.401801 0.289297 0.212718 0.16072 0.124697 0.0990742 0.0803602 0.0663524 0.055634 0.0472707 0.0406315 0.0352801 0.0309078 0.0272921
+0.570062 0.791753 1.09627 1.42515 1.58351 1.42515 1.09627 0.791753 0.570062 0.419163 0.316701 0.245716 0.195227 0.158351 0.130748 0.109627 0.0931474 0.0800649 0.0695197 0.060904 0.0537794
+0.887485 1.23262 1.7067 2.21871 2.46524 2.21871 1.7067 1.23262 0.887485 0.652563 0.493047 0.382537 0.303933 0.246524 0.203552 0.17067 0.145014 0.124647 0.10823 0.0948168 0.083725
diff --git a/gle-refman/utilities/fig/surf/surf1.big b/gle-refman/utilities/fig/surf/surf1.big
new file mode 100644
index 0000000..d2d584d
--- /dev/null
+++ b/gle-refman/utilities/fig/surf/surf1.big
@@ -0,0 +1,317 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+amove 9 9
+set hei 0.3
+set color BLACK
+set lstyle 1
+set color BLACK
+set lstyle 1
+amove 2.25333 0.642857
+aline 2.85333 0.783363
+amove 2.85333 0.783363
+aline 3.45333 0.92387
+amove 3.45333 0.92387
+aline 4.06 1.06438
+amove 2.25333 0.642857
+aline 1.9 0.79754
+amove 2.85333 0.783363
+aline 2.50667 0.938046
+amove 3.45333 0.92387
+aline 3.10667 3.89544
+amove 4.06 1.06438
+aline 3.70667 1.21906
+amove 1.9 0.79754
+aline 2.5 0.9365
+amove 2.50667 0.938046
+aline 3.10667 3.89544
+amove 3.10667 3.89544
+aline 3.7 1.24879
+amove 1.9 0.79754
+aline 1.55333 0.952223
+amove 2.50667 0.938046
+aline 2.15333 2.50117
+amove 3.10667 3.89544
+aline 3.10667 3.89544
+amove 3.70667 1.21906
+aline 3.70667 1.21906
+amove 1.55333 0.952223
+aline 2.14667 2.48396
+amove 2.15333 2.50117
+aline 2.62 1.515
+amove 1.55333 0.952223
+aline 1.20667 1.1069
+amove 2.15333 2.50117
+aline 2.15333 2.50117
+amove 1.20667 1.1069
+aline 1.65333 1.2115
+amove 1.20667 1.1069
+aline 0.853333 1.26159
+amove 1.68667 1.29994
+aline 1.45333 1.40209
+amove 0.853333 1.26159
+aline 1.45333 1.40209
+amove 1.45333 1.40209
+aline 1.75333 1.47157
+amove 2.55333 1.65813
+aline 2.65333 1.68154
+set color BLACK
+set lstyle 1
+set color BLACK
+set lstyle 1
+amove 4.06 1.06438
+aline 3.7 1.24879
+amove 4.06 1.06438
+aline 4.05333 1.06283
+amove 2.65333 1.68154
+aline 2.54667 1.66997
+amove 1.75333 1.47157
+aline 1.74667 1.47003
+amove 1.74 1.46849
+aline 1.73333 1.46694
+amove 1.72667 1.4654
+aline 1.72 1.46385
+amove 1.71333 1.46231
+aline 1.70667 1.46077
+amove 1.7 1.45922
+aline 1.69333 1.45768
+amove 0.96 1.28657
+aline 0.953333 1.28501
+amove 0.946667 1.28344
+aline 0.94 1.28188
+amove 0.933333 1.28032
+aline 0.926667 1.27876
+amove 0.92 1.2772
+aline 0.913333 1.27564
+amove 0.906667 1.27408
+aline 0.9 1.27252
+amove 0.893333 1.27095
+aline 0.886667 1.26939
+amove 0.88 1.26783
+aline 0.873333 1.26627
+amove 0.866667 1.26471
+aline 0.86 1.26315
+amove 0.853333 1.26159
+aline 0.853333 1.26159
+amove 0.853333 1.26158
+aline 0.853333 1.26159
+amove 0.853333 1.26159
+aline 0.853333 4.07848
+amove 0.853333 4.07848
+aline 2.66 4.5
+amove 2.66 1.69383
+aline 2.66 4.5
+amove 2.66 4.5
+aline 4.06 3.88127
+amove 4.06 1.06438
+aline 4.06 3.88127
+amove 0.857142 1.26159
+aline 2.25611 0.642857
+amove 2.25611 0.642857
+aline 4.06094 1.06438
+set just BC
+set color BLACK
+set hei 0.0833333
+set just TC
+amove 0.857142 1.26159
+aline 0.85512 1.25701
+amove 0.814672 1.16556
+rotate -23.8587
+text 1
+rotate 23.8587
+amove 1.03201 1.18425
+aline 1.02999 1.17967
+amove 0.989543 1.08822
+rotate -23.8587
+text 1.5
+rotate 23.8587
+amove 1.20689 1.1069
+aline 1.20486 1.10233
+amove 1.16441 1.01088
+rotate -23.8587
+text 2
+rotate 23.8587
+amove 1.38176 1.02956
+aline 1.37973 1.02499
+amove 1.33929 0.933537
+rotate -23.8587
+text 2.5
+rotate 23.8587
+amove 1.55663 0.952223
+aline 1.55461 0.94765
+amove 1.51416 0.856196
+rotate -23.8587
+text 3
+rotate 23.8587
+amove 1.7315 0.874881
+aline 1.72948 0.870308
+amove 1.68903 0.778853
+rotate -23.8587
+text 3.5
+rotate 23.8587
+amove 1.90637 0.79754
+aline 1.90435 0.792967
+amove 1.8639 0.701512
+rotate -23.8587
+text 4
+rotate 23.8587
+amove 2.08124 0.720199
+aline 2.07922 0.715626
+amove 2.03877 0.624171
+rotate -23.8587
+text 4.5
+rotate 23.8587
+amove 2.25611 0.642857
+aline 2.25409 0.638284
+amove 2.21364 0.546829
+rotate -23.8587
+text 5
+rotate 23.8587
+set just TC
+set color BLACK
+set hei 0.125
+amove 1.43766 0.683239
+rotate -23.8587
+text Xaxis
+rotate 23.8587
+set color BLACK
+set hei 0.0833333
+set just TC
+amove 2.25611 0.642857
+aline 2.25725 0.637988
+amove 2.27999 0.540608
+rotate 13.1459
+text 1
+rotate -13.1459
+amove 2.55692 0.71311
+aline 2.55805 0.708241
+amove 2.5808 0.610862
+rotate 13.1459
+text 1.5
+rotate -13.1459
+amove 2.85772 0.783363
+aline 2.85886 0.778494
+amove 2.8816 0.681115
+rotate 13.1459
+text 2
+rotate -13.1459
+amove 3.15853 0.853617
+aline 3.15966 0.848748
+amove 3.18241 0.751368
+rotate 13.1459
+text 2.5
+rotate -13.1459
+amove 3.45933 0.92387
+aline 3.46047 0.919001
+amove 3.48321 0.821622
+rotate 13.1459
+text 3
+rotate -13.1459
+amove 3.76013 0.994123
+aline 3.76127 0.989254
+amove 3.78401 0.891874
+rotate 13.1459
+text 3.5
+rotate -13.1459
+amove 4.06094 1.06438
+aline 4.06208 1.05951
+amove 4.08482 0.962128
+rotate 13.1459
+text 4
+rotate -13.1459
+set just TC
+set color BLACK
+set hei 0.125
+amove 3.22542 0.567207
+rotate 13.1459
+text Yaxis
+rotate -13.1459
+set color BLACK
+set hei 0.0833333
+set just RC
+amove 0.857142 1.26159
+aline 0.852142 1.26159
+amove 0.752142 1.26159
+text 1
+amove 0.857142 1.54328
+aline 0.852142 1.54328
+amove 0.752142 1.54328
+text 1.1
+amove 0.857142 1.82497
+aline 0.852142 1.82497
+amove 0.752142 1.82497
+text 1.2
+amove 0.857142 2.10666
+aline 0.852142 2.10666
+amove 0.752142 2.10666
+text 1.3
+amove 0.857142 2.38835
+aline 0.852142 2.38835
+amove 0.752142 2.38835
+text 1.4
+amove 0.857143 2.67003
+aline 0.852143 2.67003
+amove 0.752143 2.67003
+text 1.5
+amove 0.857143 2.95172
+aline 0.852143 2.95172
+amove 0.752143 2.95172
+text 1.6
+amove 0.857143 3.23341
+aline 0.852143 3.23341
+amove 0.752143 3.23341
+text 1.7
+amove 0.857143 3.5151
+aline 0.852143 3.5151
+amove 0.752143 3.5151
+text 1.8
+amove 0.857143 3.79679
+aline 0.852143 3.79679
+amove 0.752143 3.79679
+text 1.9
+amove 0.857143 4.07848
+aline 0.852143 4.07848
+amove 0.752143 4.07848
+text 2
+set just BC
+set color BLACK
+set lstyle 1
+set color BLACK
+set lstyle 1
+set color BLACK
+set lstyle 1
diff --git a/gle-refman/utilities/fig/surf/surf1.sur b/gle-refman/utilities/fig/surf/surf1.sur
new file mode 100644
index 0000000..7955637
--- /dev/null
+++ b/gle-refman/utilities/fig/surf/surf1.sur
@@ -0,0 +1,44 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+begin surface
+ size 5 5
+ xtitle "Xaxis"
+ ytitle "Yaxis"
+ data surf1.z
+end surface
diff --git a/gle-refman/utilities/fig/surf/surf1.z b/gle-refman/utilities/fig/surf/surf1.z
new file mode 100644
index 0000000..372eb16
--- /dev/null
+++ b/gle-refman/utilities/fig/surf/surf1.z
@@ -0,0 +1,42 @@
+! nx 5 ny 4 xmin 1 xmax 5 ymin 1 ymax 4
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+1 1 1 1 1
+1 1 1.5 1 1
+1 1 1 2 1
+1 1 1 1 1
diff --git a/gle-refman/utilities/fig/surf/surf2.big b/gle-refman/utilities/fig/surf/surf2.big
new file mode 100644
index 0000000..2095df3
--- /dev/null
+++ b/gle-refman/utilities/fig/surf/surf2.big
@@ -0,0 +1,439 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+amove 9 9
+set hei 0.3
+set color BLACK
+set lstyle 1
+set color BLACK
+set lstyle 1
+amove 2.25333 2.0513
+aline 2.85333 2.19181
+amove 2.85333 2.19181
+aline 3.45333 2.33232
+amove 3.45333 2.33232
+aline 4.06 2.47282
+amove 2.25333 2.0513
+aline 1.9 2.20599
+amove 2.85333 2.19181
+aline 2.50667 2.34649
+amove 3.45333 2.33232
+aline 3.10667 3.19122
+amove 4.06 2.47282
+aline 3.70667 2.62751
+amove 1.9 2.20599
+aline 2.5 2.34495
+amove 2.50667 2.34649
+aline 3.1 3.18183
+amove 3.10667 3.19122
+aline 3.70667 2.62751
+amove 1.9 2.20599
+aline 1.55333 2.36067
+amove 2.50667 2.34649
+aline 2.15333 2.85329
+amove 3.10667 3.19122
+aline 3.10667 3.19122
+amove 3.70667 2.62751
+aline 3.70667 2.62751
+amove 1.55333 2.36067
+aline 2.15333 2.85329
+amove 2.15333 2.85329
+aline 2.72 2.65343
+amove 1.55333 2.36067
+aline 1.20667 2.51535
+amove 2.15333 2.85329
+aline 1.80667 2.65586
+amove 2.72 2.65656
+aline 2.40667 2.79636
+amove 1.20667 2.51535
+aline 1.80667 2.65586
+amove 1.80667 2.65586
+aline 1.80667 2.65586
+amove 2.35333 2.78387
+aline 2.4 2.7948
+amove 2.40667 2.79636
+aline 2.90667 2.91345
+amove 1.20667 2.51535
+aline 0.853333 2.67003
+amove 1.80667 2.65586
+aline 1.45333 2.81054
+amove 2.40667 2.79636
+aline 2.06 2.95105
+amove 2.94 2.96662
+aline 2.66 3.09155
+amove 0.853333 2.67003
+aline 1.45333 2.81054
+amove 1.45333 2.81054
+aline 2.05333 2.9495
+amove 2.06 2.95105
+aline 2.65333 3.08999
+set color BLACK
+set lstyle 1
+set color BLACK
+set lstyle 1
+amove 4.06 1.06438
+aline 2.66 1.68311
+amove 2.66 1.68311
+aline 0.853333 1.26159
+amove 0.853333 2.67003
+aline 0.853333 4.07848
+amove 0.853333 2.67003
+aline 0.853333 1.26159
+amove 0.853333 4.07848
+aline 2.66 4.5
+amove 2.66 3.09156
+aline 2.66 4.5
+amove 2.66 2.14653
+aline 2.66 1.68311
+amove 2.66 4.5
+aline 4.06 3.88127
+amove 4.06 2.47282
+aline 4.06 3.88127
+amove 4.06 2.47282
+aline 4.06 1.06438
+amove 0.857143 1.26159
+aline 2.25611 0.642858
+amove 2.25611 0.642858
+aline 4.06094 1.06438
+set just BC
+set color BLACK
+set hei 0.0833333
+set just TC
+amove 0.857143 1.26159
+aline 0.855121 1.25702
+amove 0.814673 1.16556
+rotate -23.8587
+text 1
+rotate 23.8587
+amove 1.03201 1.18425
+aline 1.02999 1.17967
+amove 0.989543 1.08822
+rotate -23.8587
+text 1.5
+rotate 23.8587
+amove 1.20689 1.10691
+aline 1.20486 1.10233
+amove 1.16441 1.01088
+rotate -23.8587
+text 2
+rotate 23.8587
+amove 1.38176 1.02956
+aline 1.37973 1.02499
+amove 1.33929 0.933537
+rotate -23.8587
+text 2.5
+rotate 23.8587
+amove 1.55663 0.952223
+aline 1.55461 0.94765
+amove 1.51416 0.856196
+rotate -23.8587
+text 3
+rotate 23.8587
+amove 1.7315 0.874882
+aline 1.72948 0.870309
+amove 1.68903 0.778854
+rotate -23.8587
+text 3.5
+rotate 23.8587
+amove 1.90637 0.79754
+aline 1.90435 0.792967
+amove 1.8639 0.701512
+rotate -23.8587
+text 4
+rotate 23.8587
+amove 2.08124 0.720199
+aline 2.07922 0.715626
+amove 2.03877 0.624171
+rotate -23.8587
+text 4.5
+rotate 23.8587
+amove 2.25611 0.642858
+aline 2.25409 0.638285
+amove 2.21364 0.54683
+rotate -23.8587
+text 5
+rotate 23.8587
+set just TC
+set color BLACK
+set hei 0.3
+amove 1.43766 0.683239
+rotate -23.8587
+text Xaxis
+rotate 23.8587
+set color BLACK
+set hei 0.0833333
+set just TC
+amove 2.25611 0.642858
+aline 2.25725 0.637989
+amove 2.27999 0.540609
+rotate 13.1458
+text 1
+rotate -13.1458
+amove 2.55692 0.71311
+aline 2.55805 0.708241
+amove 2.5808 0.610862
+rotate 13.1458
+text 1.5
+rotate -13.1458
+amove 2.85772 0.783363
+aline 2.85886 0.778494
+amove 2.8816 0.681115
+rotate 13.1458
+text 2
+rotate -13.1458
+amove 3.15853 0.853617
+aline 3.15966 0.848748
+amove 3.18241 0.751368
+rotate 13.1458
+text 2.5
+rotate -13.1458
+amove 3.45933 0.92387
+aline 3.46047 0.919001
+amove 3.48321 0.821622
+rotate 13.1458
+text 3
+rotate -13.1458
+amove 3.76014 0.994123
+aline 3.76127 0.989254
+amove 3.78402 0.891875
+rotate 13.1458
+text 3.5
+rotate -13.1458
+amove 4.06094 1.06438
+aline 4.06208 1.05951
+amove 4.08482 0.962127
+rotate 13.1458
+text 4
+rotate -13.1458
+set just TC
+set color BLACK
+set hei 0.3
+amove 3.22542 0.567207
+rotate 13.1458
+text Yaxis
+rotate -13.1458
+set color BLACK
+set hei 0.0833333
+set just RC
+amove 0.857143 1.26159
+aline 0.852143 1.26159
+amove 0.752143 1.26159
+text -1
+amove 0.857143 1.6137
+aline 0.852143 1.6137
+amove 0.752143 1.6137
+text -0.5
+amove 0.857143 1.96581
+aline 0.852143 1.96581
+amove 0.752143 1.96581
+text 0
+amove 0.857143 2.31792
+aline 0.852143 2.31792
+amove 0.752143 2.31792
+text 0.5
+amove 0.857143 2.67003
+aline 0.852143 2.67003
+amove 0.752143 2.67003
+text 1
+amove 0.857143 3.02215
+aline 0.852143 3.02215
+amove 0.752143 3.02215
+text 1.5
+amove 0.857143 3.37426
+aline 0.852143 3.37426
+amove 0.752143 3.37426
+text 2
+amove 0.857143 3.72637
+aline 0.852143 3.72637
+amove 0.752143 3.72637
+text 2.5
+amove 0.857143 4.07848
+aline 0.852143 4.07848
+amove 0.752143 4.07848
+text 3
+set just BC
+set color BLACK
+set lstyle 1
+amove 0.853333 2.67003
+aline 0.853333 4.07848
+amove 0.853333 2.67003
+aline 0.853333 1.26159
+amove 1.45333 2.81054
+aline 1.45333 4.21899
+amove 1.45333 2.40529
+aline 1.45333 1.40209
+amove 2.06 2.95105
+aline 2.06 4.35949
+amove 2.06 2.13594
+aline 2.06 1.5426
+amove 2.66 3.09156
+aline 2.66 4.5
+amove 2.66 2.14653
+aline 2.66 1.68311
+amove 0.853333 1.26159
+aline 2.66 1.68311
+amove 0.853333 1.96581
+aline 1.9 2.20598
+amove 0.853333 2.67003
+aline 0.86 2.6716
+amove 0.866667 2.67316
+aline 0.873333 2.67472
+amove 0.88 2.67628
+aline 0.886667 2.67784
+amove 0.893333 2.6794
+aline 0.9 2.68096
+amove 0.906667 2.68252
+aline 0.913333 2.68408
+amove 0.92 2.68565
+aline 0.926667 2.68721
+amove 0.933333 2.68877
+aline 0.94 2.69033
+amove 0.946667 2.69189
+aline 0.953333 2.69345
+amove 0.96 2.69501
+aline 0.966667 2.69657
+amove 1.7 2.86767
+aline 1.70667 2.86921
+amove 1.71333 2.87076
+aline 1.72 2.8723
+amove 1.72667 2.87385
+aline 1.73333 2.87539
+amove 1.74 2.87693
+aline 1.74667 2.87848
+amove 1.75333 2.88002
+aline 2.66 3.09155
+amove 0.853333 2.67003
+aline 0.86 2.66711
+amove 0.853333 3.37426
+aline 2.66 3.79578
+amove 0.853333 4.07848
+aline 2.66 4.5
+set color BLACK
+set lstyle 2
+amove 2.66 3.09156
+aline 2.66 4.5
+amove 2.66 2.14653
+aline 2.66 1.68311
+amove 2.83333 3.01421
+aline 2.83333 4.42266
+amove 2.83333 2.18713
+aline 2.83333 1.60577
+amove 3.00667 3.05043
+aline 3.00667 4.34532
+amove 3.00667 2.22772
+aline 3.00667 1.52842
+amove 3.18 3.12232
+aline 3.18 4.26798
+amove 3.18 2.26831
+aline 3.18 1.45108
+amove 3.36 2.95321
+aline 3.36 4.19063
+amove 3.36 2.31046
+aline 3.36 1.37374
+amove 3.53333 2.79036
+aline 3.53333 4.11329
+amove 3.53333 2.35084
+aline 3.53333 1.2964
+amove 3.70667 2.62751
+aline 3.70667 4.03595
+amove 3.70667 2.39099
+aline 3.70667 1.21906
+amove 3.88 2.55162
+aline 3.88 3.95861
+amove 3.88 2.43113
+aline 3.88 1.14172
+amove 4.06 2.47282
+aline 4.06 3.88127
+amove 4.06 2.47282
+aline 4.06 1.06438
+amove 2.66 1.68311
+aline 4.06 1.06438
+amove 2.66 2.03522
+aline 4.06 1.41649
+amove 3.02 2.23084
+aline 4.06 1.7686
+amove 3.54 2.35239
+aline 4.06 2.12071
+amove 2.66 3.09155
+aline 2.94667 2.96596
+amove 3.70667 2.62751
+aline 4.06 2.47282
+amove 4.06 2.47282
+aline 4.06 2.47282
+amove 2.66 3.44367
+aline 4.06 2.82493
+amove 2.66 3.79578
+aline 4.06 3.17705
+amove 2.66 4.14789
+aline 4.06 3.52916
+amove 2.66 4.5
+aline 4.06 3.88127
+set color BLACK
+set lstyle 1
+amove 0.853333 1.26159
+aline 2.66 1.68311
+amove 1.02667 1.18425
+aline 2.83333 1.60577
+amove 1.20667 1.10691
+aline 3.00667 1.52842
+amove 1.38 1.02956
+aline 3.18 1.45108
+amove 1.55333 0.952223
+aline 3.36 1.37374
+amove 1.72667 0.874882
+aline 3.53333 1.2964
+amove 1.9 0.79754
+aline 3.70667 1.21906
+amove 2.08 0.720199
+aline 3.88 1.14172
+amove 2.25333 0.642858
+aline 4.06 1.06438
+amove 0.853333 1.26159
+aline 2.25333 0.642858
+amove 1.15333 1.33184
+aline 2.55333 0.71311
+amove 1.45333 1.40209
+aline 2.85333 0.783363
+amove 1.75333 1.47235
+aline 3.15333 0.853617
+amove 2.06 1.5426
+aline 3.45333 0.92387
+amove 2.36 1.61285
+aline 3.76 0.994123
+amove 2.66 1.68311
+aline 4.06 1.06438
diff --git a/gle-refman/utilities/fig/surf/surf2.sur b/gle-refman/utilities/fig/surf/surf2.sur
new file mode 100644
index 0000000..cfd5fd9
--- /dev/null
+++ b/gle-refman/utilities/fig/surf/surf2.sur
@@ -0,0 +1,50 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+begin surface
+ size 5 5
+ data surf1.z
+ zaxis min -1 max 3
+ base xstep .5 ystep .5
+ back ystep 1 zstep 1
+ right xstep .5 zstep .5 lstyle 2
+ xtitle "Xaxis" hei .3
+ ytitle "Yaxis" hei .3
+end surface
+
+
diff --git a/gle-refman/utilities/fig/surf/surf3.big b/gle-refman/utilities/fig/surf/surf3.big
new file mode 100644
index 0000000..20f706e
--- /dev/null
+++ b/gle-refman/utilities/fig/surf/surf3.big
@@ -0,0 +1,333 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+amove 2.5 3
+set hei 0.3
+set color BLACK
+set lstyle 1
+set color BLACK
+set lstyle 1
+amove 3.11556 2.3656
+aline 2.57778 2.47301
+amove 2.57778 2.47301
+aline 2.13778 2.56031
+amove 2.13778 2.56031
+aline 1.77778 2.63267
+amove 1.77778 2.63267
+aline 1.47111 2.69363
+amove 3.11556 2.3656
+aline 3.30667 2.57064
+amove 2.57778 2.47301
+aline 2.84889 2.64132
+amove 2.13778 2.56031
+aline 2.46222 2.95762
+amove 1.77778 2.63267
+aline 2.13333 2.75199
+amove 1.47111 2.69363
+aline 1.84444 2.79612
+amove 3.30667 2.57064
+aline 2.84889 2.64132
+amove 2.84889 2.64132
+aline 2.46222 2.95762
+amove 2.46222 2.95762
+aline 2.13778 2.75477
+amove 2.13333 2.75199
+aline 1.84889 2.79545
+amove 3.30667 2.57064
+aline 3.43556 2.70817
+amove 2.84889 2.64132
+aline 3.05333 3.23736
+amove 2.46222 2.95762
+aline 2.69333 2.80151
+amove 2.13333 2.75199
+aline 2.13333 2.75199
+amove 1.84444 2.79612
+aline 2.12889 2.87283
+amove 3.43556 2.70817
+aline 3.05778 3.2312
+amove 3.05333 3.23736
+aline 2.69333 2.80151
+amove 2.69333 2.80151
+aline 2.69333 2.80151
+amove 2.28889 2.85243
+aline 2.12889 2.87283
+amove 3.43556 2.70817
+aline 3.52444 2.80681
+amove 3.05333 3.23736
+aline 3.05333 3.23736
+amove 2.69333 2.80151
+aline 2.69333 2.80151
+amove 2.56 2.89581
+aline 2.59111 2.9062
+amove 2.12889 2.87283
+aline 2.34667 2.93239
+amove 3.52444 2.80681
+aline 3.35111 2.82543
+amove 2.76444 2.8878
+aline 2.59111 2.9062
+amove 2.59111 2.9062
+aline 2.52889 2.91287
+amove 2.40889 2.92573
+aline 2.35111 2.93192
+set color BLACK
+set lstyle 1
+amove 3.11556 2.3656
+aline 3.06667 1.01846
+amove 3.30667 2.57064
+aline 3.25333 1.45845
+amove 3.43556 2.70817
+aline 3.38222 1.7615
+amove 3.52444 2.80681
+aline 3.52 2.80729
+amove 3.52444 2.80681
+aline 3.47556 1.98293
+amove 3.11556 2.3656
+aline 3.06667 1.01846
+amove 2.57333 2.47301
+aline 2.57333 1.2472
+amove 2.13778 2.56031
+aline 2.16444 1.43594
+amove 1.77778 2.63267
+aline 1.82222 1.59433
+amove 1.47111 2.69363
+aline 1.47556 2.69485
+amove 1.47111 2.69363
+aline 1.52889 1.72915
+set color BLACK
+set lstyle 1
+amove 3.47556 1.98293
+aline 3.47111 1.97239
+amove 1.52889 1.72915
+aline 1.52889 1.72915
+amove 1.46667 2.7544
+aline 1.40444 3.77965
+amove 1.52889 1.72915
+aline 1.52444 1.73119
+amove 1.40444 3.77965
+aline 2.33778 3.64923
+amove 2.33778 3.64923
+aline 2.34667 2.9324
+amove 2.33778 3.64923
+aline 3.57778 3.71714
+amove 3.55111 3.71568
+aline 3.57778 3.71714
+amove 3.57778 3.71714
+aline 3.52 2.80729
+amove 3.57778 3.71714
+aline 3.55111 3.26474
+amove 3.47556 1.98293
+aline 3.47556 1.98293
+amove 1.53004 1.72915
+aline 3.07032 1.01846
+amove 3.07032 1.01846
+aline 3.47917 1.98293
+set just BC
+set color BLACK
+set hei 0.0833333
+set just TC
+amove 1.53004 1.72915
+aline 1.52795 1.72461
+amove 1.48605 1.63381
+rotate -24.7687
+text 1
+rotate 24.7687
+amove 1.67049 1.66435
+aline 1.66839 1.65981
+amove 1.6265 1.56901
+rotate -24.7687
+text 1.5
+rotate 24.7687
+amove 1.82223 1.59433
+aline 1.82013 1.58979
+amove 1.77824 1.49899
+rotate -24.7687
+text 2
+rotate 24.7687
+amove 1.98668 1.51846
+aline 1.98459 1.51392
+amove 1.94269 1.42312
+rotate -24.7687
+text 2.5
+rotate 24.7687
+amove 2.16551 1.43594
+aline 2.16342 1.4314
+amove 2.12152 1.3406
+rotate -24.7687
+text 3
+rotate 24.7687
+amove 2.36069 1.34589
+aline 2.35859 1.34135
+amove 2.3167 1.25055
+rotate -24.7687
+text 3.5
+rotate 24.7687
+amove 2.57457 1.2472
+aline 2.57247 1.24266
+amove 2.53058 1.15186
+rotate -24.7687
+text 4
+rotate 24.7687
+amove 2.80997 1.13859
+aline 2.80788 1.13405
+amove 2.76598 1.04325
+rotate -24.7687
+text 4.5
+rotate 24.7687
+amove 3.07032 1.01846
+aline 3.06822 1.01392
+amove 3.02633 0.923124
+rotate -24.7687
+text 5
+rotate 24.7687
+set just TC
+set color BLACK
+set hei 0.125
+amove 2.04229 1.16888
+rotate -24.7687
+text Xaxis
+rotate 24.7687
+set color BLACK
+set hei 0.0833333
+set just TC
+amove 3.07032 1.01846
+aline 3.07492 1.01651
+amove 3.16699 0.977484
+rotate 67.0273
+text 1
+rotate -67.0273
+amove 3.17304 1.26079
+aline 3.17764 1.25883
+amove 3.26971 1.21981
+rotate 67.0273
+text 1.5
+rotate -67.0273
+amove 3.25683 1.45845
+aline 3.26144 1.4565
+amove 3.35351 1.41747
+rotate 67.0273
+text 2
+rotate -67.0273
+amove 3.32649 1.62276
+aline 3.33109 1.62081
+amove 3.42316 1.58178
+rotate 67.0273
+text 2.5
+rotate -67.0273
+amove 3.3853 1.7615
+aline 3.3899 1.75955
+amove 3.48197 1.72052
+rotate 67.0273
+text 3
+rotate -67.0273
+amove 3.43562 1.88021
+aline 3.44022 1.87826
+amove 3.53229 1.83923
+rotate 67.0273
+text 3.5
+rotate -67.0273
+amove 3.47917 1.98293
+aline 3.48377 1.98098
+amove 3.57584 1.94195
+rotate 67.0273
+text 4
+rotate -67.0273
+set just TC
+set color BLACK
+set hei 0.0833333
+set just RC
+amove 1.53004 1.72915
+aline 1.52505 1.72885
+amove 1.42523 1.7229
+text -1
+amove 1.51628 1.96001
+aline 1.51129 1.95971
+amove 1.41147 1.95376
+text -0.5
+amove 1.50212 2.19751
+aline 1.49713 2.19721
+amove 1.39731 2.19126
+text 0
+amove 1.48755 2.44195
+aline 1.48256 2.44165
+amove 1.38274 2.4357
+text 0.5
+amove 1.47255 2.69363
+aline 1.46756 2.69333
+amove 1.36773 2.68738
+text 1
+amove 1.45709 2.95288
+aline 1.4521 2.95258
+amove 1.35228 2.94663
+text 1.5
+amove 1.44117 3.22005
+aline 1.43618 3.21976
+amove 1.33635 3.2138
+text 2
+amove 1.42475 3.49551
+aline 1.41976 3.49521
+amove 1.31993 3.48926
+text 2.5
+amove 1.40781 3.77965
+aline 1.40282 3.77935
+amove 1.303 3.7734
+text 3
+set just BC
+set color BLACK
+set hei 0.125
+amove 1.17895 2.67613
+rotate 93.4114
+text Zaxis
+rotate -93.4114
+set color BLACK
+set lstyle 1
+set color BLACK
+set lstyle 1
+set color BLACK
+set lstyle 1
+set color BLACK
+set hei 0.0833333
+amove 2.46423 2.95762
+marker FCIRCLE
+amove 3.05446 3.23736
+marker FCIRCLE
+set color BLACK
+set lstyle 2
+amove 2.46423 2.95762
+aline 2.46256 3.77555
+amove 3.05446 3.23736
+aline 3.07025 3.74384
diff --git a/gle-refman/utilities/fig/surf/surf3.dat b/gle-refman/utilities/fig/surf/surf3.dat
new file mode 100644
index 0000000..0caca5b
--- /dev/null
+++ b/gle-refman/utilities/fig/surf/surf3.dat
@@ -0,0 +1,39 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+3 2 1.5
+4 3 2
diff --git a/gle-refman/utilities/fig/surf/surf3.sur b/gle-refman/utilities/fig/surf/surf3.sur
new file mode 100644
index 0000000..21b43b1
--- /dev/null
+++ b/gle-refman/utilities/fig/surf/surf3.sur
@@ -0,0 +1,51 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+begin surface
+ size 5 5
+ data surf1.z
+ zaxis min -1 max 3
+ xtitle "Xaxis"
+ ztitle "Zaxis"
+ points surf3.dat
+ riselines lstyle 2
+ marker fcircle
+ skirt on
+ rotate 80 30 0
+ view 2.5 3 .6
+end surface
diff --git a/gle-refman/utilities/fig/surf/surf4.big b/gle-refman/utilities/fig/surf/surf4.big
new file mode 100644
index 0000000..c540ecf
--- /dev/null
+++ b/gle-refman/utilities/fig/surf/surf4.big
@@ -0,0 +1,281 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+amove 0 5
+set hei 0.3
+set color BLACK
+set lstyle 1
+set color BLACK
+set lstyle 1
+amove 1.11111 3.20972
+aline 0.683333 3.83437
+amove 0.683333 3.83437
+aline 0.472222 4.13732
+amove 0.472222 4.13732
+aline 0.35 4.3162
+amove 0.35 4.3162
+aline 0.272222 4.43427
+amove 1.11111 3.20972
+aline 1.95 3.30821
+amove 0.683333 3.83437
+aline 1.25556 3.87721
+amove 0.472222 4.13732
+aline 0.911111 4.45956
+amove 0.35 4.3162
+aline 0.7 4.33136
+amove 0.272222 4.43427
+aline 0.561111 4.44475
+amove 1.95 3.30821
+aline 1.26111 3.87264
+amove 1.25556 3.87721
+aline 0.911111 4.45956
+amove 0.911111 4.45956
+aline 0.705556 4.33474
+amove 0.7 4.33136
+aline 0.566667 4.44021
+amove 1.95 3.30821
+aline 2.69444 3.39648
+amove 1.25556 3.87721
+aline 1.79444 4.68624
+amove 0.911111 4.45956
+aline 1.32222 4.18373
+amove 0.7 4.33136
+aline 0.7 4.33136
+amove 0.561111 4.44475
+aline 0.844444 4.45486
+amove 2.69444 3.39648
+aline 1.79444 4.68624
+amove 1.79444 4.68624
+aline 1.32222 4.18373
+amove 1.32222 4.18373
+aline 1.32222 4.18373
+amove 0.872222 4.43884
+aline 0.85 4.45166
+amove 2.69444 3.39648
+aline 3.37222 3.47606
+amove 1.79444 4.68624
+aline 1.79444 4.68624
+amove 1.32222 4.18373
+aline 1.32222 4.18373
+amove 1.07778 4.34779
+aline 1.35556 4.35977
+amove 0.844444 4.45486
+aline 0.905556 4.45705
+amove 0.916667 4.45744
+aline 1.11667 4.46461
+amove 3.37222 3.47606
+aline 2.31667 3.93952
+amove 1.44444 4.32111
+aline 1.36111 4.35735
+amove 1.35556 4.35977
+aline 1.11667 4.46461
+set color BLACK
+set lstyle 1
+set color BLACK
+set lstyle 1
+amove 3.33333 1.35573
+aline 1.52778 3.25864
+amove 0.266667 3.62791
+aline 0.266667 3.6279
+amove 0.788889 3.68024
+aline 0.266667 3.6279
+amove 0.272222 4.43427
+aline 0.272222 4.84007
+amove 0.272222 4.43427
+aline 0.272222 3.6279
+amove 0.272222 4.84007
+aline 1.12222 4.84908
+amove 1.12222 4.84908
+aline 1.11667 4.46461
+amove 1.12222 4.84908
+aline 3.38889 4.55462
+amove 3.37778 4.55597
+aline 3.38889 4.55462
+amove 3.38889 4.55462
+aline 3.36667 3.4785
+amove 3.38889 4.55462
+aline 3.37222 3.47606
+amove 3.36667 3.47541
+aline 3.33333 1.35573
+amove 0.271366 3.6279
+aline 1.10089 0.729884
+amove 1.10089 0.729884
+aline 3.3358 1.35573
+set just BC
+set color BLACK
+set hei 0.0833333
+set just TC
+amove 0.271366 3.6279
+aline 0.266559 3.62652
+amove 0.17042 3.59901
+rotate -74.0268
+text 1
+rotate 74.0268
+amove 0.30796 3.50006
+aline 0.303153 3.49868
+amove 0.207014 3.47116
+rotate -74.0268
+text 1.5
+rotate 74.0268
+amove 0.352008 3.34617
+aline 0.347201 3.3448
+amove 0.251062 3.31728
+rotate -74.0268
+text 2
+rotate 74.0268
+amove 0.406047 3.15738
+aline 0.40124 3.15601
+amove 0.305101 3.12849
+rotate -74.0268
+text 2.5
+rotate 74.0268
+amove 0.473911 2.9203
+aline 0.469104 2.91892
+amove 0.372965 2.8914
+rotate -74.0268
+text 3
+rotate 74.0268
+amove 0.561683 2.61366
+aline 0.556876 2.61228
+amove 0.460737 2.58476
+rotate -74.0268
+text 3.5
+rotate 74.0268
+amove 0.679629 2.2016
+aline 0.674822 2.20023
+amove 0.578683 2.17271
+rotate -74.0268
+text 4
+rotate 74.0268
+amove 0.84654 1.61849
+aline 0.841733 1.61711
+amove 0.745594 1.58959
+rotate -74.0268
+text 4.5
+rotate 74.0268
+amove 1.10089 0.729884
+aline 1.09609 0.728508
+amove 0.999947 0.700989
+rotate -74.0268
+text 5
+rotate 74.0268
+set just TC
+set color BLACK
+set hei 0.0833333
+set just TC
+amove 1.10089 0.729884
+aline 1.10224 0.725069
+amove 1.12921 0.628774
+rotate 15.6438
+text 1
+rotate -15.6438
+amove 1.52505 0.848661
+aline 1.5264 0.843847
+amove 1.55337 0.747551
+rotate 15.6438
+text 1.5
+rotate -15.6438
+amove 1.92631 0.961025
+aline 1.92766 0.95621
+amove 1.95462 0.859914
+rotate 15.6438
+text 2
+rotate -15.6438
+amove 2.30647 1.06748
+aline 2.30782 1.06267
+amove 2.33478 0.966371
+rotate 15.6438
+text 2.5
+rotate -15.6438
+amove 2.66716 1.16848
+aline 2.66851 1.16367
+amove 2.69547 1.06737
+rotate 15.6438
+text 3
+rotate -15.6438
+amove 3.00983 1.26444
+aline 3.01118 1.25963
+amove 3.03814 1.16333
+rotate 15.6438
+text 3.5
+rotate -15.6438
+amove 3.3358 1.35573
+aline 3.33715 1.35091
+amove 3.36412 1.25461
+rotate 15.6438
+text 4
+rotate -15.6438
+set just TC
+set color BLACK
+set hei 0.0833333
+set just RC
+amove 0.271366 3.6279
+aline 0.266366 3.62791
+amove 0.166366 3.62805
+text -1
+amove 0.271658 3.82884
+aline 0.266658 3.82885
+amove 0.166658 3.82899
+text -0.5
+amove 0.271951 4.03022
+aline 0.266951 4.03022
+amove 0.166951 4.03037
+text 0
+amove 0.272245 4.23202
+aline 0.267245 4.23203
+amove 0.167245 4.23218
+text 0.5
+amove 0.272539 4.43427
+aline 0.267539 4.43428
+amove 0.167539 4.43442
+text 1
+amove 0.272833 4.63695
+aline 0.267833 4.63696
+amove 0.167833 4.6371
+text 1.5
+amove 0.273128 4.84007
+aline 0.268128 4.84008
+amove 0.168129 4.84022
+text 2
+set just BC
+set color BLACK
+set lstyle 1
+set color BLACK
+set lstyle 1
+set color BLACK
+set lstyle 1
diff --git a/gle-refman/utilities/fig/surf/surf4.sur b/gle-refman/utilities/fig/surf/surf4.sur
new file mode 100644
index 0000000..c08a58b
--- /dev/null
+++ b/gle-refman/utilities/fig/surf/surf4.sur
@@ -0,0 +1,45 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+begin surface
+ size 5 5
+ data surf1.z
+ zaxis min -1
+ rotate 85 85 0
+ view 0 5 .7
+end surface
diff --git a/gle-refman/utilities/fig/surf/surf5.big b/gle-refman/utilities/fig/surf/surf5.big
new file mode 100644
index 0000000..ac4421f
--- /dev/null
+++ b/gle-refman/utilities/fig/surf/surf5.big
@@ -0,0 +1,2307 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+amove 9 9
+set hei 0.3
+set color GREEN
+set lstyle 1
+amove 2.38667 3.21761
+aline 2.49333 3.09084
+amove 2.49333 3.09084
+aline 2.6 2.97999
+amove 2.6 2.97999
+aline 2.70667 2.88508
+amove 2.70667 2.88508
+aline 2.81333 2.80611
+amove 2.81333 2.80611
+aline 2.91333 2.74307
+amove 2.91333 2.74307
+aline 3.02 2.69597
+amove 3.02 2.69597
+aline 3.12667 2.6648
+amove 3.12667 2.6648
+aline 3.23333 2.64956
+amove 3.23333 2.64956
+aline 3.34 2.65026
+amove 3.34 2.65026
+aline 3.44 2.6669
+amove 3.44 2.6669
+aline 3.54667 2.69947
+amove 3.54667 2.69947
+aline 3.65333 2.74797
+amove 3.65333 2.74797
+aline 3.76 2.81241
+amove 3.76 2.81241
+aline 3.86667 2.89278
+amove 3.86667 2.89278
+aline 3.96667 2.98909
+amove 3.96667 2.98909
+aline 4.07333 3.10133
+amove 4.07333 3.10133
+aline 4.18 3.22951
+amove 4.18 3.22951
+aline 4.28667 3.37362
+amove 4.28667 3.37362
+aline 4.39333 3.53366
+amove 4.39333 3.53366
+aline 4.5 3.70964
+amove 2.38667 3.21761
+aline 2.34 3.00949
+amove 2.49333 3.09084
+aline 2.44667 2.88272
+amove 2.6 2.97999
+aline 2.54667 2.77187
+amove 2.70667 2.88508
+aline 2.65333 2.67697
+amove 2.81333 2.80611
+aline 2.76 2.59799
+amove 2.91333 2.74307
+aline 2.86667 2.53495
+amove 3.02 2.69597
+aline 2.97333 2.48785
+amove 3.12667 2.6648
+aline 3.07333 2.45668
+amove 3.23333 2.64956
+aline 3.18 2.44144
+amove 3.34 2.65026
+aline 3.28667 2.44214
+amove 3.44 2.6669
+aline 3.39333 2.45878
+amove 3.54667 2.69947
+aline 3.5 2.49135
+amove 3.65333 2.74797
+aline 3.6 2.53985
+amove 3.76 2.81241
+aline 3.70667 2.60429
+amove 3.86667 2.89278
+aline 3.81333 2.68466
+amove 3.96667 2.98909
+aline 3.92 2.78097
+amove 4.07333 3.10133
+aline 4.02667 2.89321
+amove 4.18 3.22951
+aline 4.12667 3.02139
+amove 4.28667 3.37362
+aline 4.23333 3.1655
+amove 4.39333 3.53366
+aline 4.34 3.32554
+amove 4.5 3.70964
+aline 4.44667 3.50152
+amove 2.34 3.00949
+aline 2.44667 2.88272
+amove 2.44667 2.88272
+aline 2.54667 2.77187
+amove 2.54667 2.77187
+aline 2.65333 2.67697
+amove 2.65333 2.67697
+aline 2.76 2.59799
+amove 2.76 2.59799
+aline 2.86667 2.53495
+amove 2.86667 2.53495
+aline 2.97333 2.48785
+amove 2.97333 2.48785
+aline 3.07333 2.45668
+amove 3.07333 2.45668
+aline 3.18 2.44144
+amove 3.18 2.44144
+aline 3.28667 2.44214
+amove 3.28667 2.44214
+aline 3.39333 2.45878
+amove 3.39333 2.45878
+aline 3.5 2.49135
+amove 3.5 2.49135
+aline 3.6 2.53985
+amove 3.6 2.53985
+aline 3.70667 2.60429
+amove 3.70667 2.60429
+aline 3.81333 2.68466
+amove 3.81333 2.68466
+aline 3.92 2.78097
+amove 3.92 2.78097
+aline 4.02667 2.89321
+amove 4.02667 2.89321
+aline 4.12 3.01284
+amove 4.12667 3.02139
+aline 4.23333 3.1655
+amove 4.23333 3.1655
+aline 4.34 3.32554
+amove 4.34 3.32554
+aline 4.44667 3.50152
+amove 2.34 3.00949
+aline 2.28667 2.81731
+amove 2.44667 2.88272
+aline 2.39333 2.69053
+amove 2.54667 2.77187
+aline 2.5 2.57969
+amove 2.65333 2.67697
+aline 2.6 2.48478
+amove 2.76 2.59799
+aline 2.70667 2.40581
+amove 2.86667 2.53495
+aline 2.81333 2.34277
+amove 2.97333 2.48785
+aline 2.92 2.29567
+amove 3.07333 2.45668
+aline 3.02667 2.2645
+amove 3.18 2.44144
+aline 3.12667 2.24926
+amove 3.28667 2.44214
+aline 3.23333 2.24996
+amove 3.39333 2.45878
+aline 3.34 2.26659
+amove 3.5 2.49135
+aline 3.44667 2.29916
+amove 3.6 2.53985
+aline 3.55333 2.34767
+amove 3.70667 2.60429
+aline 3.65333 2.4121
+amove 3.81333 2.68466
+aline 3.76 2.49248
+amove 3.92 2.78097
+aline 3.86667 2.58878
+amove 4.02667 2.89321
+aline 3.97333 2.70103
+amove 4.12667 3.02139
+aline 4.08 2.8292
+amove 4.23333 3.1655
+aline 4.18 2.97331
+amove 4.34 3.32554
+aline 4.28667 3.13336
+amove 4.44667 3.50152
+aline 4.39333 3.30934
+amove 2.28667 2.81731
+aline 2.39333 2.69053
+amove 2.39333 2.69053
+aline 2.5 2.57969
+amove 2.5 2.57969
+aline 2.59333 2.49111
+amove 2.6 2.48478
+aline 2.70667 2.40581
+amove 2.70667 2.40581
+aline 2.81333 2.34277
+amove 2.81333 2.34277
+aline 2.92 2.29567
+amove 2.92 2.29567
+aline 3.02667 2.2645
+amove 3.02667 2.2645
+aline 3.12667 2.24926
+amove 3.12667 2.24926
+aline 3.23333 2.24996
+amove 3.23333 2.24996
+aline 3.34 2.26659
+amove 3.34 2.26659
+aline 3.44667 2.29916
+amove 3.44667 2.29916
+aline 3.55333 2.34767
+amove 3.55333 2.34767
+aline 3.65333 2.4121
+amove 3.65333 2.4121
+aline 3.76 2.49248
+amove 3.76 2.49248
+aline 3.86667 2.58878
+amove 3.86667 2.58878
+aline 3.97333 2.70103
+amove 3.97333 2.70103
+aline 4.08 2.8292
+amove 4.08 2.8292
+aline 4.18 2.97331
+amove 4.18 2.97331
+aline 4.28667 3.13336
+amove 4.28667 3.13336
+aline 4.39333 3.30934
+amove 2.28667 2.81731
+aline 2.23333 2.64106
+amove 2.39333 2.69053
+aline 2.34 2.51428
+amove 2.5 2.57969
+aline 2.44667 2.40344
+amove 2.6 2.48478
+aline 2.55333 2.30853
+amove 2.70667 2.40581
+aline 2.65333 2.22956
+amove 2.81333 2.34277
+aline 2.76 2.16652
+amove 2.92 2.29567
+aline 2.86667 2.11942
+amove 3.02667 2.2645
+aline 2.97333 2.08825
+amove 3.12667 2.24926
+aline 3.08 2.07301
+amove 3.23333 2.24996
+aline 3.18 2.07371
+amove 3.34 2.26659
+aline 3.28667 2.09035
+amove 3.44667 2.29916
+aline 3.39333 2.12291
+amove 3.55333 2.34767
+aline 3.5 2.17142
+amove 3.65333 2.4121
+aline 3.60667 2.23586
+amove 3.76 2.49248
+aline 3.70667 2.31623
+amove 3.86667 2.58878
+aline 3.81333 2.41254
+amove 3.97333 2.70103
+aline 3.92 2.52478
+amove 4.08 2.8292
+aline 4.02667 2.65295
+amove 4.18 2.97331
+aline 4.13333 2.79707
+amove 4.28667 3.13336
+aline 4.23333 2.95711
+amove 4.39333 3.30934
+aline 4.34 3.13309
+amove 2.23333 2.64106
+aline 2.34 2.51428
+amove 2.34 2.51428
+aline 2.44667 2.40344
+amove 2.44667 2.40344
+aline 2.55333 2.30853
+amove 2.55333 2.30853
+aline 2.64667 2.23482
+amove 2.65333 2.22956
+aline 2.76 2.16652
+amove 2.76 2.16652
+aline 2.86667 2.11942
+amove 2.86667 2.11942
+aline 2.97333 2.08825
+amove 2.97333 2.08825
+aline 3.08 2.07301
+amove 3.08 2.07301
+aline 3.17333 2.07366
+amove 3.18 2.07371
+aline 3.28667 2.09035
+amove 3.28667 2.09035
+aline 3.39333 2.12291
+amove 3.39333 2.12291
+aline 3.5 2.17142
+amove 3.5 2.17142
+aline 3.60667 2.23586
+amove 3.60667 2.23586
+aline 3.7 2.31087
+amove 3.70667 2.31623
+aline 3.81333 2.41254
+amove 3.81333 2.41254
+aline 3.92 2.52478
+amove 3.92 2.52478
+aline 4.02667 2.65295
+amove 4.02667 2.65295
+aline 4.13333 2.79707
+amove 4.13333 2.79707
+aline 4.23333 2.95711
+amove 4.23333 2.95711
+aline 4.34 3.13309
+amove 2.23333 2.64106
+aline 2.18 2.48075
+amove 2.34 2.51428
+aline 2.28667 2.35397
+amove 2.44667 2.40344
+aline 2.39333 2.24313
+amove 2.55333 2.30853
+aline 2.5 2.14822
+amove 2.65333 2.22956
+aline 2.60667 2.06925
+amove 2.76 2.16652
+aline 2.70667 2.00621
+amove 2.86667 2.11942
+aline 2.81333 1.9591
+amove 2.97333 2.08825
+aline 2.92 1.92793
+amove 3.08 2.07301
+aline 3.02667 1.9127
+amove 3.18 2.07371
+aline 3.13333 1.9134
+amove 3.28667 2.09035
+aline 3.23333 1.93003
+amove 3.39333 2.12291
+aline 3.34 1.9626
+amove 3.5 2.17142
+aline 3.44667 2.0111
+amove 3.60667 2.23586
+aline 3.55333 2.07554
+amove 3.70667 2.31623
+aline 3.66 2.15591
+amove 3.81333 2.41254
+aline 3.76 2.25222
+amove 3.92 2.52478
+aline 3.86667 2.36446
+amove 4.02667 2.65295
+aline 3.97333 2.49264
+amove 4.13333 2.79707
+aline 4.08 2.63675
+amove 4.23333 2.95711
+aline 4.18667 2.7968
+amove 4.34 3.13309
+aline 4.28667 2.97278
+amove 2.18 2.48075
+aline 2.28667 2.35397
+amove 2.28667 2.35397
+aline 2.39333 2.24313
+amove 2.39333 2.24313
+aline 2.5 2.14822
+amove 2.5 2.14822
+aline 2.60667 2.06925
+amove 2.60667 2.06925
+aline 2.70667 2.00621
+amove 2.70667 2.00621
+aline 2.81333 1.9591
+amove 2.81333 1.9591
+aline 2.92 1.92793
+amove 2.92 1.92793
+aline 3.02667 1.9127
+amove 3.02667 1.9127
+aline 3.13333 1.9134
+amove 3.13333 1.9134
+aline 3.23333 1.93003
+amove 3.23333 1.93003
+aline 3.34 1.9626
+amove 3.34 1.9626
+aline 3.44667 2.0111
+amove 3.44667 2.0111
+aline 3.55333 2.07554
+amove 3.55333 2.07554
+aline 3.66 2.15591
+amove 3.66 2.15591
+aline 3.75333 2.2458
+amove 3.76 2.25222
+aline 3.86667 2.36446
+amove 3.86667 2.36446
+aline 3.97333 2.49264
+amove 3.97333 2.49264
+aline 4.08 2.63675
+amove 4.08 2.63675
+aline 4.18667 2.7968
+amove 4.18667 2.7968
+aline 4.28 2.96105
+amove 2.18 2.48075
+aline 2.13333 2.33637
+amove 2.28667 2.35397
+aline 2.23333 2.20959
+amove 2.39333 2.24313
+aline 2.34 2.09875
+amove 2.5 2.14822
+aline 2.44667 2.00384
+amove 2.60667 2.06925
+aline 2.55333 1.92487
+amove 2.70667 2.00621
+aline 2.66 1.86183
+amove 2.81333 1.9591
+aline 2.76 1.81472
+amove 2.92 1.92793
+aline 2.86667 1.78355
+amove 3.02667 1.9127
+aline 2.97333 1.76832
+amove 3.13333 1.9134
+aline 3.08 1.76902
+amove 3.23333 1.93003
+aline 3.18667 1.78565
+amove 3.34 1.9626
+aline 3.28667 1.81822
+amove 3.44667 2.0111
+aline 3.39333 1.86672
+amove 3.55333 2.07554
+aline 3.5 1.93116
+amove 3.66 2.15591
+aline 3.60667 2.01153
+amove 3.76 2.25222
+aline 3.71333 2.10784
+amove 3.86667 2.36446
+aline 3.81333 2.22008
+amove 3.97333 2.49264
+aline 3.92 2.34826
+amove 4.08 2.63675
+aline 4.02667 2.49237
+amove 4.18667 2.7968
+aline 4.13333 2.65242
+amove 4.28667 2.97278
+aline 4.24 2.8284
+amove 2.13333 2.33637
+aline 2.23333 2.20959
+amove 2.23333 2.20959
+aline 2.34 2.09875
+amove 2.34 2.09875
+aline 2.44667 2.00384
+amove 2.44667 2.00384
+aline 2.55333 1.92487
+amove 2.55333 1.92487
+aline 2.66 1.86183
+amove 2.66 1.86183
+aline 2.75333 1.81786
+amove 2.76 1.81472
+aline 2.86667 1.78355
+amove 2.86667 1.78355
+aline 2.97333 1.76832
+amove 2.97333 1.76832
+aline 3.08 1.76902
+amove 3.08 1.76902
+aline 3.18667 1.78565
+amove 3.18667 1.78565
+aline 3.28 1.81605
+amove 3.28667 1.81822
+aline 3.39333 1.86672
+amove 3.39333 1.86672
+aline 3.5 1.93116
+amove 3.5 1.93116
+aline 3.60667 2.01153
+amove 3.60667 2.01153
+aline 3.71333 2.10784
+amove 3.71333 2.10784
+aline 3.81333 2.22008
+amove 3.81333 2.22008
+aline 3.92 2.34826
+amove 3.92 2.34826
+aline 4.02667 2.49237
+amove 4.02667 2.49237
+aline 4.13333 2.65242
+amove 4.13333 2.65242
+aline 4.24 2.8284
+amove 2.13333 2.33637
+aline 2.08 2.20792
+amove 2.23333 2.20959
+aline 2.18667 2.08114
+amove 2.34 2.09875
+aline 2.28667 1.9703
+amove 2.44667 2.00384
+aline 2.39333 1.87539
+amove 2.55333 1.92487
+aline 2.5 1.79642
+amove 2.66 1.86183
+aline 2.60667 1.73338
+amove 2.76 1.81472
+aline 2.71333 1.68628
+amove 2.86667 1.78355
+aline 2.81333 1.65511
+amove 2.97333 1.76832
+aline 2.92 1.63987
+amove 3.08 1.76902
+aline 3.02667 1.64057
+amove 3.18667 1.78565
+aline 3.13333 1.65721
+amove 3.28667 1.81822
+aline 3.24 1.68977
+amove 3.39333 1.86672
+aline 3.34 1.73828
+amove 3.5 1.93116
+aline 3.44667 1.80272
+amove 3.60667 2.01153
+aline 3.55333 1.88309
+amove 3.71333 2.10784
+aline 3.66 1.9794
+amove 3.81333 2.22008
+aline 3.76667 2.09164
+amove 3.92 2.34826
+aline 3.86667 2.21981
+amove 4.02667 2.49237
+aline 3.97333 2.36393
+amove 4.13333 2.65242
+aline 4.08 2.52397
+amove 4.24 2.8284
+aline 4.18667 2.69995
+amove 2.08 2.20792
+aline 2.18667 2.08114
+amove 2.18667 2.08114
+aline 2.28667 1.9703
+amove 2.28667 1.9703
+aline 2.39333 1.87539
+amove 2.39333 1.87539
+aline 2.5 1.79642
+amove 2.5 1.79642
+aline 2.60667 1.73338
+amove 2.60667 1.73338
+aline 2.71333 1.68628
+amove 2.71333 1.68628
+aline 2.81333 1.65511
+amove 2.81333 1.65511
+aline 2.92 1.63987
+amove 2.92 1.63987
+aline 3.02667 1.64057
+amove 3.02667 1.64057
+aline 3.13333 1.65721
+amove 3.13333 1.65721
+aline 3.24 1.68977
+amove 3.24 1.68977
+aline 3.34 1.73828
+amove 3.34 1.73828
+aline 3.44667 1.80272
+amove 3.44667 1.80272
+aline 3.55333 1.88309
+amove 3.55333 1.88309
+aline 3.66 1.9794
+amove 3.66 1.9794
+aline 3.76667 2.09164
+amove 3.76667 2.09164
+aline 3.86 2.21127
+amove 3.86667 2.21981
+aline 3.97333 2.36393
+amove 3.97333 2.36393
+aline 4.08 2.52397
+amove 4.08 2.52397
+aline 4.18667 2.69995
+amove 2.08 2.20792
+aline 2.02667 2.09541
+amove 2.18667 2.08114
+aline 2.13333 1.96863
+amove 2.28667 1.9703
+aline 2.24 1.85779
+amove 2.39333 1.87539
+aline 2.34 1.76288
+amove 2.5 1.79642
+aline 2.44667 1.68391
+amove 2.60667 1.73338
+aline 2.55333 1.62087
+amove 2.71333 1.68628
+aline 2.66 1.57377
+amove 2.81333 1.65511
+aline 2.76667 1.5426
+amove 2.92 1.63987
+aline 2.86667 1.52736
+amove 3.02667 1.64057
+aline 2.97333 1.52806
+amove 3.13333 1.65721
+aline 3.08 1.5447
+amove 3.24 1.68977
+aline 3.18667 1.57726
+amove 3.34 1.73828
+aline 3.29333 1.62577
+amove 3.44667 1.80272
+aline 3.39333 1.69021
+amove 3.55333 1.88309
+aline 3.5 1.77058
+amove 3.66 1.9794
+aline 3.60667 1.86689
+amove 3.76667 2.09164
+aline 3.71333 1.97913
+amove 3.86667 2.21981
+aline 3.82 2.1073
+amove 3.97333 2.36393
+aline 3.92 2.25142
+amove 4.08 2.52397
+aline 4.02667 2.41146
+amove 4.18667 2.69995
+aline 4.13333 2.58744
+amove 2.02667 2.09541
+aline 2.13333 1.96863
+amove 2.13333 1.96863
+aline 2.24 1.85779
+amove 2.24 1.85779
+aline 2.33333 1.76921
+amove 2.34 1.76288
+aline 2.44667 1.68391
+amove 2.44667 1.68391
+aline 2.55333 1.62087
+amove 2.55333 1.62087
+aline 2.66 1.57377
+amove 2.66 1.57377
+aline 2.76667 1.5426
+amove 2.76667 1.5426
+aline 2.86 1.52838
+amove 2.86667 1.52736
+aline 2.97333 1.52806
+amove 2.97333 1.52806
+aline 3.08 1.5447
+amove 3.08 1.5447
+aline 3.18667 1.57726
+amove 3.18667 1.57726
+aline 3.29333 1.62577
+amove 3.29333 1.62577
+aline 3.39333 1.69021
+amove 3.39333 1.69021
+aline 3.5 1.77058
+amove 3.5 1.77058
+aline 3.60667 1.86689
+amove 3.60667 1.86689
+aline 3.71333 1.97913
+amove 3.71333 1.97913
+aline 3.82 2.1073
+amove 3.82 2.1073
+aline 3.92 2.25142
+amove 3.92 2.25142
+aline 4.02667 2.41146
+amove 4.02667 2.41146
+aline 4.13333 2.58744
+amove 2.02667 2.09541
+aline 1.97333 1.99884
+amove 2.13333 1.96863
+aline 2.08 1.87206
+amove 2.24 1.85779
+aline 2.18667 1.76122
+amove 2.34 1.76288
+aline 2.29333 1.66631
+amove 2.44667 1.68391
+aline 2.39333 1.58733
+amove 2.55333 1.62087
+aline 2.5 1.52429
+amove 2.66 1.57377
+aline 2.60667 1.47719
+amove 2.76667 1.5426
+aline 2.71333 1.44602
+amove 2.86667 1.52736
+aline 2.82 1.43079
+amove 2.97333 1.52806
+aline 2.92 1.43149
+amove 3.08 1.5447
+aline 3.02667 1.44812
+amove 3.18667 1.57726
+aline 3.13333 1.48069
+amove 3.29333 1.62577
+aline 3.24 1.52919
+amove 3.39333 1.69021
+aline 3.34667 1.59363
+amove 3.5 1.77058
+aline 3.44667 1.674
+amove 3.60667 1.86689
+aline 3.55333 1.77031
+amove 3.71333 1.97913
+aline 3.66 1.88255
+amove 3.82 2.1073
+aline 3.76667 2.01073
+amove 3.92 2.25142
+aline 3.87333 2.15484
+amove 4.02667 2.41146
+aline 3.97333 2.31489
+amove 4.13333 2.58744
+aline 4.08 2.49087
+amove 1.97333 1.99884
+aline 2.08 1.87206
+amove 2.08 1.87206
+aline 2.18667 1.76122
+amove 2.18667 1.76122
+aline 2.29333 1.66631
+amove 2.29333 1.66631
+aline 2.38667 1.5926
+amove 2.39333 1.58733
+aline 2.5 1.52429
+amove 2.5 1.52429
+aline 2.60667 1.47719
+amove 2.60667 1.47719
+aline 2.71333 1.44602
+amove 2.71333 1.44602
+aline 2.82 1.43079
+amove 2.82 1.43079
+aline 2.91333 1.43144
+amove 2.92 1.43149
+aline 3.02667 1.44812
+amove 3.02667 1.44812
+aline 3.13333 1.48069
+amove 3.13333 1.48069
+aline 3.24 1.52919
+amove 3.24 1.52919
+aline 3.34667 1.59363
+amove 3.34667 1.59363
+aline 3.44 1.66864
+amove 3.44667 1.674
+aline 3.55333 1.77031
+amove 3.55333 1.77031
+aline 3.66 1.88255
+amove 3.66 1.88255
+aline 3.76667 2.01073
+amove 3.76667 2.01073
+aline 3.87333 2.15484
+amove 3.87333 2.15484
+aline 3.97333 2.31489
+amove 3.97333 2.31489
+aline 4.08 2.49087
+amove 1.97333 1.99884
+aline 1.92 1.91819
+amove 2.08 1.87206
+aline 2.02667 1.79142
+amove 2.18667 1.76122
+aline 2.13333 1.68057
+amove 2.29333 1.66631
+aline 2.24 1.58567
+amove 2.39333 1.58733
+aline 2.34667 1.50669
+amove 2.5 1.52429
+aline 2.44667 1.44365
+amove 2.60667 1.47719
+aline 2.55333 1.39655
+amove 2.71333 1.44602
+aline 2.66 1.36538
+amove 2.82 1.43079
+aline 2.76667 1.35014
+amove 2.92 1.43149
+aline 2.87333 1.35084
+amove 3.02667 1.44812
+aline 2.97333 1.36748
+amove 3.13333 1.48069
+aline 3.08 1.40005
+amove 3.24 1.52919
+aline 3.18667 1.44855
+amove 3.34667 1.59363
+aline 3.29333 1.51299
+amove 3.44667 1.674
+aline 3.4 1.59336
+amove 3.55333 1.77031
+aline 3.5 1.68967
+amove 3.66 1.88255
+aline 3.60667 1.80191
+amove 3.76667 2.01073
+aline 3.71333 1.93009
+amove 3.87333 2.15484
+aline 3.82 2.0742
+amove 3.97333 2.31489
+aline 3.92667 2.23424
+amove 4.08 2.49087
+aline 4.08 2.49087
+amove 1.92 1.91819
+aline 2.02667 1.79142
+amove 2.02667 1.79142
+aline 2.13333 1.68057
+amove 2.13333 1.68057
+aline 2.24 1.58567
+amove 2.24 1.58567
+aline 2.34667 1.50669
+amove 2.34667 1.50669
+aline 2.44667 1.44365
+amove 2.44667 1.44365
+aline 2.55333 1.39655
+amove 2.55333 1.39655
+aline 2.66 1.36538
+amove 2.66 1.36538
+aline 2.76667 1.35014
+amove 2.76667 1.35014
+aline 2.87333 1.35084
+amove 2.87333 1.35084
+aline 2.97333 1.36748
+amove 2.97333 1.36748
+aline 3.08 1.40005
+amove 3.08 1.40005
+aline 3.18667 1.44855
+amove 3.18667 1.44855
+aline 3.29333 1.51299
+amove 3.29333 1.51299
+aline 3.4 1.59336
+amove 3.4 1.59336
+aline 3.5 1.68967
+amove 3.5 1.68967
+aline 3.60667 1.80191
+amove 3.60667 1.80191
+aline 3.71333 1.93009
+amove 3.71333 1.93009
+aline 3.82 2.0742
+amove 3.82 2.0742
+aline 3.92667 2.23424
+amove 3.92667 2.23424
+aline 3.92667 2.23424
+amove 1.92 1.91819
+aline 1.87333 1.85349
+amove 2.02667 1.79142
+aline 1.98 1.72671
+amove 2.13333 1.68057
+aline 2.08 1.61587
+amove 2.24 1.58567
+aline 2.18667 1.52096
+amove 2.34667 1.50669
+aline 2.29333 1.44199
+amove 2.44667 1.44365
+aline 2.4 1.37895
+amove 2.55333 1.39655
+aline 2.50667 1.33184
+amove 2.66 1.36538
+aline 2.60667 1.30067
+amove 2.76667 1.35014
+aline 2.71333 1.28544
+amove 2.87333 1.35084
+aline 2.82 1.28614
+amove 2.97333 1.36748
+aline 2.92667 1.30277
+amove 3.08 1.40005
+aline 3.03333 1.33534
+amove 3.18667 1.44855
+aline 3.13333 1.38384
+amove 3.29333 1.51299
+aline 3.24 1.44828
+amove 3.4 1.59336
+aline 3.34667 1.52865
+amove 3.5 1.68967
+aline 3.45333 1.62496
+amove 3.60667 1.80191
+aline 3.56 1.7372
+amove 3.71333 1.93009
+aline 3.66 1.86538
+amove 3.82 2.0742
+aline 3.82 2.0742
+amove 3.92667 2.23424
+aline 3.92667 2.23424
+amove 1.87333 1.85349
+aline 1.98 1.72671
+amove 1.98 1.72671
+aline 2.08 1.61587
+amove 2.08 1.61587
+aline 2.18667 1.52096
+amove 2.18667 1.52096
+aline 2.29333 1.44199
+amove 2.29333 1.44199
+aline 2.4 1.37895
+amove 2.4 1.37895
+aline 2.50667 1.33184
+amove 2.50667 1.33184
+aline 2.60667 1.30067
+amove 2.60667 1.30067
+aline 2.71333 1.28544
+amove 2.71333 1.28544
+aline 2.82 1.28614
+amove 2.82 1.28614
+aline 2.92667 1.30277
+amove 2.92667 1.30277
+aline 3.03333 1.33534
+amove 3.03333 1.33534
+aline 3.13333 1.38384
+amove 3.13333 1.38384
+aline 3.24 1.44828
+amove 3.24 1.44828
+aline 3.34667 1.52865
+amove 3.34667 1.52865
+aline 3.45333 1.62496
+amove 3.45333 1.62496
+aline 3.56 1.7372
+amove 3.56 1.7372
+aline 3.66 1.86538
+amove 3.66 1.86538
+aline 3.66 1.86538
+amove 1.87333 1.85349
+aline 1.82 1.80472
+amove 1.98 1.72671
+aline 1.92667 1.67794
+amove 2.08 1.61587
+aline 2.03333 1.5671
+amove 2.18667 1.52096
+aline 2.13333 1.47219
+amove 2.29333 1.44199
+aline 2.24 1.39321
+amove 2.4 1.37895
+aline 2.34667 1.33017
+amove 2.50667 1.33184
+aline 2.45333 1.28307
+amove 2.60667 1.30067
+aline 2.56 1.2519
+amove 2.71333 1.28544
+aline 2.66 1.23667
+amove 2.82 1.28614
+aline 2.76667 1.23737
+amove 2.92667 1.30277
+aline 2.87333 1.254
+amove 3.03333 1.33534
+aline 2.98 1.28657
+amove 3.13333 1.38384
+aline 3.08667 1.33507
+amove 3.24 1.44828
+aline 3.18667 1.39951
+amove 3.34667 1.52865
+aline 3.29333 1.47988
+amove 3.45333 1.62496
+aline 3.4 1.57619
+amove 3.56 1.7372
+aline 3.56 1.7372
+amove 3.66 1.86538
+aline 3.66 1.86538
+amove 1.82 1.80472
+aline 1.92667 1.67794
+amove 1.92667 1.67794
+aline 2.03333 1.5671
+amove 2.03333 1.5671
+aline 2.13333 1.47219
+amove 2.13333 1.47219
+aline 2.24 1.39321
+amove 2.24 1.39321
+aline 2.34667 1.33017
+amove 2.34667 1.33017
+aline 2.45333 1.28307
+amove 2.45333 1.28307
+aline 2.56 1.2519
+amove 2.56 1.2519
+aline 2.65333 1.23768
+amove 2.66 1.23667
+aline 2.76667 1.23737
+amove 2.76667 1.23737
+aline 2.87333 1.254
+amove 2.87333 1.254
+aline 2.98 1.28657
+amove 2.98 1.28657
+aline 3.08667 1.33507
+amove 3.08667 1.33507
+aline 3.18667 1.39951
+amove 3.18667 1.39951
+aline 3.29333 1.47988
+amove 3.29333 1.47988
+aline 3.4 1.57619
+amove 3.4 1.57619
+aline 3.4 1.57619
+amove 1.82 1.80472
+aline 1.76667 1.77188
+amove 1.92667 1.67794
+aline 1.87333 1.6451
+amove 2.03333 1.5671
+aline 1.98 1.53426
+amove 2.13333 1.47219
+aline 2.08667 1.43935
+amove 2.24 1.39321
+aline 2.18667 1.36038
+amove 2.34667 1.33017
+aline 2.29333 1.29734
+amove 2.45333 1.28307
+aline 2.4 1.25023
+amove 2.56 1.2519
+aline 2.50667 1.21906
+amove 2.66 1.23667
+aline 2.61333 1.20383
+amove 2.76667 1.23737
+aline 2.71333 1.20453
+amove 2.87333 1.254
+aline 2.82 1.22116
+amove 2.98 1.28657
+aline 2.92667 1.25373
+amove 3.08667 1.33507
+aline 3.03333 1.30223
+amove 3.18667 1.39951
+aline 3.14 1.36667
+amove 3.29333 1.47988
+aline 3.29333 1.47988
+amove 3.4 1.57619
+aline 3.4 1.57619
+amove 1.76667 1.77188
+aline 1.87333 1.6451
+amove 1.87333 1.6451
+aline 1.98 1.53426
+amove 1.98 1.53426
+aline 2.08667 1.43935
+amove 2.08667 1.43935
+aline 2.18 1.36564
+amove 2.18667 1.36038
+aline 2.29333 1.29734
+amove 2.29333 1.29734
+aline 2.4 1.25023
+amove 2.4 1.25023
+aline 2.50667 1.21906
+amove 2.50667 1.21906
+aline 2.61333 1.20383
+amove 2.61333 1.20383
+aline 2.70667 1.20448
+amove 2.71333 1.20453
+aline 2.82 1.22116
+amove 2.82 1.22116
+aline 2.92667 1.25373
+amove 2.92667 1.25373
+aline 3.03333 1.30223
+amove 3.03333 1.30223
+aline 3.14 1.36667
+amove 3.14 1.36667
+aline 3.14 1.36667
+amove 1.76667 1.77188
+aline 1.71333 1.75498
+amove 1.87333 1.6451
+aline 1.82 1.6282
+amove 1.98 1.53426
+aline 1.92667 1.51736
+amove 2.08667 1.43935
+aline 2.03333 1.42245
+amove 2.18667 1.36038
+aline 2.14 1.34347
+amove 2.29333 1.29734
+aline 2.24 1.28043
+amove 2.4 1.25023
+aline 2.34667 1.23333
+amove 2.50667 1.21906
+aline 2.45333 1.20216
+amove 2.61333 1.20383
+aline 2.56 1.18693
+amove 2.71333 1.20453
+aline 2.66667 1.18763
+amove 2.82 1.22116
+aline 2.76667 1.20426
+amove 2.92667 1.25373
+aline 2.87333 1.23683
+amove 3.03333 1.30223
+aline 3.03333 1.30223
+amove 3.14 1.36667
+aline 3.14 1.36667
+amove 1.71333 1.75498
+aline 1.82 1.6282
+amove 1.82 1.6282
+aline 1.92667 1.51736
+amove 1.92667 1.51736
+aline 2.03333 1.42245
+amove 2.03333 1.42245
+aline 2.14 1.34347
+amove 2.14 1.34347
+aline 2.24 1.28043
+amove 2.24 1.28043
+aline 2.34667 1.23333
+amove 2.34667 1.23333
+aline 2.45333 1.20216
+amove 2.45333 1.20216
+aline 2.56 1.18693
+amove 2.56 1.18693
+aline 2.66667 1.18763
+amove 2.66667 1.18763
+aline 2.76 1.20315
+amove 2.76667 1.20426
+aline 2.87333 1.23683
+amove 2.87333 1.23683
+aline 2.87333 1.23683
+amove 1.71333 1.75498
+aline 1.66667 1.75401
+amove 1.82 1.6282
+aline 1.76667 1.62723
+amove 1.92667 1.51736
+aline 1.87333 1.51639
+amove 2.03333 1.42245
+aline 1.98 1.42148
+amove 2.14 1.34347
+aline 2.08667 1.34251
+amove 2.24 1.28043
+aline 2.19333 1.27947
+amove 2.34667 1.23333
+aline 2.29333 1.23236
+amove 2.45333 1.20216
+aline 2.4 1.20119
+amove 2.56 1.18693
+aline 2.50667 1.18596
+amove 2.66667 1.18763
+aline 2.61333 1.18666
+amove 2.76667 1.20426
+aline 2.76667 1.20426
+amove 2.87333 1.23683
+aline 2.87333 1.23683
+amove 1.66667 1.75401
+aline 1.76667 1.62723
+amove 1.76667 1.62723
+aline 1.87333 1.51639
+amove 1.87333 1.51639
+aline 1.98 1.42148
+amove 1.98 1.42148
+aline 2.08667 1.34251
+amove 2.08667 1.34251
+aline 2.19333 1.27947
+amove 2.19333 1.27947
+aline 2.28667 1.2355
+amove 2.29333 1.23236
+aline 2.4 1.20119
+amove 2.4 1.20119
+aline 2.50667 1.18596
+amove 2.50667 1.18596
+aline 2.61333 1.18666
+amove 2.61333 1.18666
+aline 2.61333 1.18666
+amove 1.66667 1.75401
+aline 1.61333 1.76897
+amove 1.76667 1.62723
+aline 1.72 1.6422
+amove 1.87333 1.51639
+aline 1.82 1.53135
+amove 1.98 1.42148
+aline 1.92667 1.43645
+amove 2.08667 1.34251
+aline 2.03333 1.35747
+amove 2.19333 1.27947
+aline 2.14 1.29443
+amove 2.29333 1.23236
+aline 2.24667 1.24733
+amove 2.4 1.20119
+aline 2.34667 1.21616
+amove 2.50667 1.18596
+aline 2.50667 1.18596
+amove 2.61333 1.18666
+aline 2.61333 1.18666
+amove 1.61333 1.76897
+aline 1.72 1.6422
+amove 1.72 1.6422
+aline 1.82 1.53135
+amove 1.82 1.53135
+aline 1.92667 1.43645
+amove 1.92667 1.43645
+aline 2.03333 1.35747
+amove 2.03333 1.35747
+aline 2.14 1.29443
+amove 2.14 1.29443
+aline 2.24667 1.24733
+amove 2.24667 1.24733
+aline 2.24667 1.24733
+amove 2.31333 1.22655
+aline 2.34667 1.21616
+amove 2.34667 1.21616
+aline 2.34667 1.21616
+amove 1.61333 1.76897
+aline 1.56 1.79987
+amove 1.72 1.6422
+aline 1.66667 1.6731
+amove 1.82 1.53135
+aline 1.77333 1.56225
+amove 1.92667 1.43645
+aline 1.87333 1.46735
+amove 2.03333 1.35747
+aline 1.98 1.38837
+amove 2.14 1.29443
+aline 2.08667 1.32533
+amove 2.24667 1.24733
+aline 2.24667 1.24733
+amove 2.34667 1.21616
+aline 2.34667 1.21616
+amove 1.56 1.79987
+aline 1.66667 1.6731
+amove 1.66667 1.6731
+aline 1.77333 1.56225
+amove 1.77333 1.56225
+aline 1.87333 1.46735
+amove 1.87333 1.46735
+aline 1.98 1.38837
+amove 1.98 1.38837
+aline 2.08667 1.32533
+amove 2.08667 1.32533
+aline 2.08667 1.32533
+amove 1.56 1.79987
+aline 1.50667 1.84671
+amove 1.66667 1.6731
+aline 1.61333 1.71993
+amove 1.77333 1.56225
+aline 1.72 1.60909
+amove 1.87333 1.46735
+aline 1.87333 1.46735
+amove 1.98 1.38837
+aline 1.98 1.38837
+amove 2.08667 1.32533
+aline 2.08667 1.32533
+amove 1.50667 1.84671
+aline 1.61333 1.71993
+amove 1.61333 1.71993
+aline 1.72 1.60909
+amove 1.72 1.60909
+aline 1.78 1.5557
+amove 1.50667 1.84671
+aline 1.45333 1.90948
+amove 1.61333 1.71993
+aline 1.56 1.7827
+amove 1.72 1.60909
+aline 1.72 1.60909
+amove 1.45333 1.90948
+aline 1.56 1.7827
+amove 1.56 1.7827
+aline 1.56 1.7827
+amove 1.45333 1.90948
+aline 1.40667 1.98819
+amove 1.56 1.7827
+aline 1.56 1.7827
+amove 1.40667 1.98819
+aline 1.40667 1.98819
+amove 1.40667 1.98819
+aline 1.35333 2.08282
+amove 1.35333 2.08282
+aline 1.35333 2.08282
+amove 1.35333 2.08282
+aline 1.3 2.1934
+amove 1.3 2.1934
+aline 1.3 2.1934
+amove 1.3 2.1934
+aline 1.24667 2.31991
+amove 1.24667 2.31991
+aline 1.24667 2.31991
+amove 1.24667 2.31991
+aline 1.2 2.46235
+amove 1.2 2.46235
+aline 1.2 2.46235
+amove 1.2 2.46235
+aline 1.14667 2.62073
+amove 1.14667 2.62073
+aline 1.14667 2.62073
+amove 1.14667 2.62073
+aline 1.09333 2.79504
+amove 1.09333 2.79504
+aline 1.09333 2.79504
+amove 1.09333 2.79504
+aline 1.04 2.98529
+amove 1.04 2.98529
+aline 1.04 2.98529
+amove 1.04 2.98529
+aline 0.986667 3.19147
+amove 0.986667 3.19147
+aline 0.986667 3.19147
+amove 0.986667 3.19147
+aline 0.94 3.41359
+amove 0.94 3.41359
+aline 0.94 3.41359
+amove 0.94 3.41359
+aline 0.886667 3.65164
+amove 0.886667 3.65164
+aline 0.886667 3.65164
+amove 0.886667 3.65164
+aline 0.833333 3.90562
+amove 0.833333 3.90562
+aline 0.833333 3.90562
+set color BLACK
+set lstyle 1
+amove 2.38667 3.21761
+aline 2.49333 3.09084
+amove 2.49333 3.09084
+aline 2.6 2.97999
+amove 2.6 2.97999
+aline 2.70667 2.88508
+amove 2.70667 2.88508
+aline 2.81333 2.80611
+amove 2.81333 2.80611
+aline 2.91333 2.74307
+amove 2.91333 2.74307
+aline 3.02 2.69597
+amove 3.02 2.69597
+aline 3.12667 2.6648
+amove 3.12667 2.6648
+aline 3.23333 2.64956
+amove 3.23333 2.64956
+aline 3.34 2.65026
+amove 3.34 2.65026
+aline 3.44 2.6669
+amove 3.44 2.6669
+aline 3.54667 2.69947
+amove 3.54667 2.69947
+aline 3.65333 2.74797
+amove 3.65333 2.74797
+aline 3.76 2.81241
+amove 3.76 2.81241
+aline 3.86667 2.89278
+amove 3.86667 2.89278
+aline 3.96667 2.98909
+amove 3.96667 2.98909
+aline 4.07333 3.10133
+amove 4.07333 3.10133
+aline 4.18 3.22951
+amove 4.18 3.22951
+aline 4.28667 3.37362
+amove 4.28667 3.37362
+aline 4.39333 3.53366
+amove 4.39333 3.53366
+aline 4.5 3.70964
+amove 2.38667 3.21761
+aline 2.34 3.00949
+amove 2.49333 3.09084
+aline 2.49333 3.09084
+amove 2.6 2.97999
+aline 2.6 2.97999
+amove 2.70667 2.88508
+aline 2.70667 2.88508
+amove 2.81333 2.80611
+aline 2.81333 2.80611
+amove 2.91333 2.74307
+aline 2.91333 2.74307
+amove 3.02 2.69597
+aline 3.02 2.69597
+amove 3.12667 2.6648
+aline 3.12667 2.6648
+amove 3.23333 2.64956
+aline 3.23333 2.64956
+amove 3.34 2.65026
+aline 3.34 2.65026
+amove 3.44 2.6669
+aline 3.44 2.6669
+amove 3.54667 2.69947
+aline 3.54667 2.69947
+amove 3.65333 2.74797
+aline 3.65333 2.74797
+amove 3.76 2.81241
+aline 3.76 2.81241
+amove 3.86667 2.89278
+aline 3.86667 2.89278
+amove 3.96667 2.98909
+aline 3.96667 2.98909
+amove 4.07333 3.10133
+aline 4.07333 3.10133
+amove 4.18 3.22951
+aline 4.18 3.22951
+amove 4.28667 3.37362
+aline 4.28667 3.37362
+amove 4.39333 3.53366
+aline 4.39333 3.53366
+amove 4.5 3.70964
+aline 4.5 3.70964
+amove 2.34 3.00949
+aline 2.34 3.00949
+amove 2.34 3.00949
+aline 2.28667 2.81731
+amove 2.28667 2.81731
+aline 2.28667 2.81731
+amove 2.28667 2.81731
+aline 2.23333 2.64106
+amove 2.23333 2.64106
+aline 2.23333 2.64106
+amove 2.23333 2.64106
+aline 2.18 2.48075
+amove 2.18 2.48075
+aline 2.18 2.48075
+amove 2.18 2.48075
+aline 2.13333 2.33637
+amove 2.13333 2.33637
+aline 2.13333 2.33637
+amove 2.13333 2.33637
+aline 2.08 2.20792
+amove 2.08 2.20792
+aline 2.08 2.20792
+amove 2.08 2.20792
+aline 2.02667 2.09541
+amove 2.02667 2.09541
+aline 2.02667 2.09541
+amove 2.02667 2.09541
+aline 1.97333 1.99884
+amove 1.97333 1.99884
+aline 1.97333 1.99884
+amove 1.97333 1.99884
+aline 1.92 1.91819
+amove 1.92 1.91819
+aline 1.92 1.91819
+amove 1.92 1.91819
+aline 1.87333 1.85349
+amove 1.87333 1.85349
+aline 1.87333 1.85349
+amove 1.87333 1.85349
+aline 1.82 1.80472
+amove 1.82 1.80472
+aline 1.82 1.80472
+amove 1.82 1.80472
+aline 1.76667 1.77188
+amove 1.76667 1.77188
+aline 1.76667 1.77188
+amove 1.76667 1.77188
+aline 1.71333 1.75498
+amove 1.71333 1.75498
+aline 1.71333 1.75498
+amove 1.71333 1.75498
+aline 1.66667 1.75401
+amove 1.66667 1.75401
+aline 1.66667 1.75401
+amove 1.66667 1.75401
+aline 1.61333 1.76897
+amove 1.61333 1.76897
+aline 1.61333 1.76897
+amove 1.61333 1.76897
+aline 1.56 1.79987
+amove 1.56 1.79987
+aline 1.56 1.79987
+amove 1.56 1.79987
+aline 1.50667 1.84671
+amove 1.50667 1.84671
+aline 1.50667 1.84671
+amove 1.50667 1.84671
+aline 1.45333 1.90948
+amove 1.45333 1.90948
+aline 1.45333 1.90948
+amove 1.45333 1.90948
+aline 1.40667 1.98819
+amove 1.53333 1.82768
+aline 1.51333 1.86141
+amove 1.40667 1.98819
+aline 1.51333 1.86141
+amove 1.51333 1.86141
+aline 1.57333 1.7949
+amove 1.40667 1.98819
+aline 1.35333 2.08282
+amove 1.51333 1.86141
+aline 1.46 1.95605
+amove 1.6 1.77761
+aline 1.56667 1.8452
+amove 1.35333 2.08282
+aline 1.46 1.95605
+amove 1.46 1.95605
+aline 1.56667 1.8452
+amove 1.56667 1.8452
+aline 1.66 1.75662
+amove 1.35333 2.08282
+aline 1.3 2.1934
+amove 1.46 1.95605
+aline 1.40667 2.06662
+amove 1.56667 1.8452
+aline 1.51333 1.95578
+amove 1.66 1.76609
+aline 1.62 1.86087
+amove 1.72667 1.76808
+aline 1.72 1.7819
+amove 3.41333 2.67161
+aline 3.40667 2.68543
+amove 1.3 2.1934
+aline 1.40667 2.06662
+amove 1.40667 2.06662
+aline 1.51333 1.95578
+amove 1.51333 1.95578
+aline 1.62 1.86087
+amove 1.62 1.86087
+aline 1.72 1.7819
+amove 1.72 1.7819
+aline 1.74667 1.76614
+amove 3.39333 2.66343
+aline 3.40667 2.68543
+amove 1.3 2.1934
+aline 1.24667 2.31991
+amove 1.40667 2.06662
+aline 1.35333 2.19313
+amove 1.51333 1.95578
+aline 1.46 2.08229
+amove 1.62 1.86087
+aline 1.56667 1.98738
+amove 1.72 1.7819
+aline 1.67333 1.90841
+amove 1.79333 1.79793
+aline 1.77333 1.84537
+amove 3.40667 2.68543
+aline 3.35333 2.81194
+amove 1.24667 2.31991
+aline 1.35333 2.19313
+amove 1.35333 2.19313
+aline 1.46 2.08229
+amove 1.46 2.08229
+aline 1.56667 1.98738
+amove 1.56667 1.98738
+aline 1.67333 1.90841
+amove 1.67333 1.90841
+aline 1.76667 1.84957
+amove 1.77333 1.84537
+aline 1.83333 1.81887
+amove 3.26667 2.65942
+aline 3.35333 2.81194
+amove 1.24667 2.31991
+aline 1.2 2.46235
+amove 1.35333 2.19313
+aline 1.3 2.33557
+amove 1.46 2.08229
+aline 1.40667 2.22473
+amove 1.56667 1.98738
+aline 1.51333 2.12982
+amove 1.67333 1.90841
+aline 1.62 2.05085
+amove 1.77333 1.84537
+aline 1.72667 1.98781
+amove 1.86 1.85168
+aline 1.82667 1.94071
+amove 3.24667 2.65376
+aline 3.2 2.7784
+amove 3.35333 2.81194
+aline 3.30667 2.95438
+amove 1.2 2.46235
+aline 1.29333 2.34403
+amove 1.3 2.33557
+aline 1.40667 2.22473
+amove 1.40667 2.22473
+aline 1.51333 2.12982
+amove 1.51333 2.12982
+aline 1.62 2.05085
+amove 1.62 2.05085
+aline 1.72667 1.98781
+amove 1.72667 1.98781
+aline 1.82667 1.94071
+amove 1.82667 1.94071
+aline 1.91333 1.91538
+amove 3.12667 2.66837
+aline 3.2 2.7784
+amove 3.2 2.7784
+aline 3.30667 2.95438
+amove 1.2 2.46235
+aline 1.14667 2.62073
+amove 1.3 2.33557
+aline 1.25333 2.49395
+amove 1.40667 2.22473
+aline 1.35333 2.38311
+amove 1.51333 2.12982
+aline 1.46 2.2882
+amove 1.62 2.05085
+aline 1.56667 2.20923
+amove 1.72667 1.98781
+aline 1.67333 2.14619
+amove 1.82667 1.94071
+aline 1.78 2.09908
+amove 1.92667 1.92933
+aline 1.88 2.06791
+amove 1.98667 2.05268
+aline 1.98667 2.05268
+amove 3.06667 2.69754
+aline 3.04 2.77673
+amove 3.2 2.7784
+aline 3.14667 2.93678
+amove 3.30667 2.95438
+aline 3.25333 3.11276
+amove 1.14667 2.62073
+aline 1.25333 2.49395
+amove 1.25333 2.49395
+aline 1.34667 2.3905
+amove 1.35333 2.38311
+aline 1.46 2.2882
+amove 1.46 2.2882
+aline 1.56667 2.20923
+amove 1.56667 2.20923
+aline 1.67333 2.14619
+amove 1.67333 2.14619
+aline 1.78 2.09908
+amove 1.78 2.09908
+aline 1.87333 2.06999
+amove 1.88 2.06791
+aline 1.98667 2.05268
+amove 1.98667 2.05268
+aline 2 2.05277
+amove 2.99333 2.71368
+aline 3.04 2.77673
+amove 3.04 2.77673
+aline 3.14667 2.93678
+amove 3.14667 2.93678
+aline 3.25333 3.11276
+amove 1.14667 2.62073
+aline 1.09333 2.79504
+amove 1.25333 2.49395
+aline 1.2 2.66826
+amove 1.35333 2.38311
+aline 1.30667 2.55742
+amove 1.46 2.2882
+aline 1.40667 2.46251
+amove 1.56667 2.20923
+aline 1.51333 2.38354
+amove 1.67333 2.14619
+aline 1.62 2.3205
+amove 1.78 2.09908
+aline 1.72667 2.2734
+amove 1.88 2.06791
+aline 1.83333 2.24223
+amove 1.98667 2.05268
+aline 1.93333 2.22699
+amove 2.05333 2.18411
+aline 2.04 2.22769
+amove 2.9 2.75713
+aline 2.88667 2.80693
+amove 3.04 2.77673
+aline 2.98667 2.95105
+amove 3.14667 2.93678
+aline 3.09333 3.11109
+amove 3.25333 3.11276
+aline 3.2 3.28707
+amove 1.09333 2.79504
+aline 1.2 2.66826
+amove 1.2 2.66826
+aline 1.30667 2.55742
+amove 1.30667 2.55742
+aline 1.4 2.46884
+amove 1.40667 2.46251
+aline 1.51333 2.38354
+amove 1.51333 2.38354
+aline 1.62 2.3205
+amove 1.62 2.3205
+aline 1.72667 2.2734
+amove 1.72667 2.2734
+aline 1.83333 2.24223
+amove 1.83333 2.24223
+aline 1.92667 2.22801
+amove 1.93333 2.22699
+aline 2.04 2.22769
+amove 2.04 2.22769
+aline 2.08667 2.23497
+amove 2.86667 2.7829
+aline 2.88667 2.80693
+amove 2.88667 2.80693
+aline 2.98 2.94144
+amove 2.98667 2.95105
+aline 3.09333 3.11109
+amove 3.09333 3.11109
+aline 3.2 3.28707
+amove 1.09333 2.79504
+aline 1.04 2.98529
+amove 1.2 2.66826
+aline 1.14667 2.85851
+amove 1.30667 2.55742
+aline 1.25333 2.74767
+amove 1.40667 2.46251
+aline 1.36 2.65276
+amove 1.51333 2.38354
+aline 1.46 2.57379
+amove 1.62 2.3205
+aline 1.56667 2.51075
+amove 1.72667 2.2734
+aline 1.67333 2.46364
+amove 1.83333 2.24223
+aline 1.78 2.43247
+amove 1.93333 2.22699
+aline 1.88667 2.41724
+amove 2.04 2.22769
+aline 1.98667 2.41794
+amove 2.12 2.33945
+aline 2.09333 2.43457
+amove 2.88667 2.80693
+aline 2.83333 2.99718
+amove 2.98667 2.95105
+aline 2.94 3.14129
+amove 3.09333 3.11109
+aline 3.04 3.30134
+amove 3.2 3.28707
+aline 3.14667 3.47732
+amove 1.04 2.98529
+aline 1.14667 2.85851
+amove 1.14667 2.85851
+aline 1.25333 2.74767
+amove 1.25333 2.74767
+aline 1.36 2.65276
+amove 1.36 2.65276
+aline 1.46 2.57379
+amove 1.46 2.57379
+aline 1.56667 2.51075
+amove 1.56667 2.51075
+aline 1.67333 2.46364
+amove 1.67333 2.46364
+aline 1.78 2.43247
+amove 1.78 2.43247
+aline 1.88667 2.41724
+amove 1.88667 2.41724
+aline 1.98667 2.41794
+amove 1.98667 2.41794
+aline 2.09333 2.43457
+amove 2.09333 2.43457
+aline 2.16667 2.45696
+amove 2.73333 2.87702
+aline 2.83333 2.99718
+amove 2.83333 2.99718
+aline 2.94 3.14129
+amove 2.94 3.14129
+aline 3.03333 3.29067
+amove 3.04 3.30134
+aline 3.14667 3.47732
+amove 1.04 2.98529
+aline 0.986667 3.19147
+amove 1.14667 2.85851
+aline 1.09333 3.06469
+amove 1.25333 2.74767
+aline 1.2 2.95385
+amove 1.36 2.65276
+aline 1.30667 2.85894
+amove 1.46 2.57379
+aline 1.41333 2.77997
+amove 1.56667 2.51075
+aline 1.51333 2.71693
+amove 1.67333 2.46364
+aline 1.62 2.66983
+amove 1.78 2.43247
+aline 1.72667 2.63866
+amove 1.88667 2.41724
+aline 1.83333 2.62342
+amove 1.98667 2.41794
+aline 1.94 2.62412
+amove 2.09333 2.43457
+aline 2.04 2.64076
+amove 2.18667 2.51869
+aline 2.14667 2.67332
+amove 2.25333 2.72183
+aline 2.25333 2.72183
+amove 2.72 2.89478
+aline 2.67333 3.07519
+amove 2.83333 2.99718
+aline 2.78 3.20336
+amove 2.94 3.14129
+aline 2.88667 3.34748
+amove 3.04 3.30134
+aline 2.99333 3.50752
+amove 3.14667 3.47732
+aline 3.09333 3.6835
+amove 0.986667 3.19147
+aline 1.09333 3.06469
+amove 1.09333 3.06469
+aline 1.2 2.95385
+amove 1.2 2.95385
+aline 1.30667 2.85894
+amove 1.30667 2.85894
+aline 1.41333 2.77997
+amove 1.41333 2.77997
+aline 1.50667 2.72113
+amove 1.51333 2.71693
+aline 1.62 2.66983
+amove 1.62 2.66983
+aline 1.72667 2.63866
+amove 1.72667 2.63866
+aline 1.83333 2.62342
+amove 1.83333 2.62342
+aline 1.94 2.62412
+amove 1.94 2.62412
+aline 2.03333 2.63965
+amove 2.04 2.64076
+aline 2.14667 2.67332
+amove 2.14667 2.67332
+aline 2.25333 2.72183
+amove 2.25333 2.72183
+aline 2.25333 2.72183
+amove 2.59333 2.99101
+aline 2.67333 3.07519
+amove 2.67333 3.07519
+aline 2.78 3.20336
+amove 2.78 3.20336
+aline 2.88667 3.34748
+amove 2.88667 3.34748
+aline 2.99333 3.50752
+amove 2.99333 3.50752
+aline 3.09333 3.6835
+amove 0.986667 3.19147
+aline 0.94 3.41359
+amove 1.09333 3.06469
+aline 1.04667 3.28681
+amove 1.2 2.95385
+aline 1.14667 3.17597
+amove 1.30667 2.85894
+aline 1.25333 3.08106
+amove 1.41333 2.77997
+aline 1.36 3.00209
+amove 1.51333 2.71693
+aline 1.46667 2.93905
+amove 1.62 2.66983
+aline 1.57333 2.89194
+amove 1.72667 2.63866
+aline 1.67333 2.86077
+amove 1.83333 2.62342
+aline 1.78 2.84554
+amove 1.94 2.62412
+aline 1.88667 2.84624
+amove 2.04 2.64076
+aline 1.99333 2.86287
+amove 2.14667 2.67332
+aline 2.1 2.89544
+amove 2.25333 2.72183
+aline 2.2 2.94394
+amove 2.32 2.95285
+aline 2.30667 3.00838
+amove 2.54667 3.05814
+aline 2.52 3.18506
+amove 2.67333 3.07519
+aline 2.62667 3.2973
+amove 2.78 3.20336
+aline 2.72667 3.42548
+amove 2.88667 3.34748
+aline 2.83333 3.56959
+amove 2.99333 3.50752
+aline 2.94 3.72964
+amove 3.09333 3.6835
+aline 3.04667 3.90562
+amove 0.94 3.41359
+aline 1.04667 3.28681
+amove 1.04667 3.28681
+aline 1.14 3.18336
+amove 1.14667 3.17597
+aline 1.25333 3.08106
+amove 1.25333 3.08106
+aline 1.36 3.00209
+amove 1.36 3.00209
+aline 1.46667 2.93905
+amove 1.46667 2.93905
+aline 1.57333 2.89194
+amove 1.57333 2.89194
+aline 1.66667 2.86285
+amove 1.67333 2.86077
+aline 1.78 2.84554
+amove 1.78 2.84554
+aline 1.88667 2.84624
+amove 1.88667 2.84624
+aline 1.99333 2.86287
+amove 1.99333 2.86287
+aline 2.1 2.89544
+amove 2.1 2.89544
+aline 2.19333 2.94071
+amove 2.2 2.94394
+aline 2.30667 3.00838
+amove 2.30667 3.00838
+aline 2.34 3.0335
+amove 2.46 3.13089
+aline 2.52 3.18506
+amove 2.52 3.18506
+aline 2.62667 3.2973
+amove 2.62667 3.2973
+aline 2.72667 3.42548
+amove 2.72667 3.42548
+aline 2.83333 3.56959
+amove 2.83333 3.56959
+aline 2.94 3.72964
+amove 2.94 3.72964
+aline 3.04667 3.90562
+amove 0.94 3.41359
+aline 0.886667 3.65164
+amove 1.04667 3.28681
+aline 0.993333 3.52486
+amove 1.14667 3.17597
+aline 1.1 3.41402
+amove 1.25333 3.08106
+aline 1.2 3.31911
+amove 1.36 3.00209
+aline 1.30667 3.24014
+amove 1.46667 2.93905
+aline 1.41333 3.1771
+amove 1.57333 2.89194
+aline 1.52 3.12999
+amove 1.67333 2.86077
+aline 1.62667 3.09882
+amove 1.78 2.84554
+aline 1.72667 3.08359
+amove 1.88667 2.84624
+aline 1.83333 3.08429
+amove 1.99333 2.86287
+aline 1.94 3.10092
+amove 2.1 2.89544
+aline 2.04667 3.13349
+amove 2.2 2.94394
+aline 2.15333 3.18199
+amove 2.30667 3.00838
+aline 2.25333 3.24643
+amove 2.38 3.23754
+aline 2.36 3.32681
+amove 2.52 3.18506
+aline 2.46667 3.42311
+amove 2.62667 3.2973
+aline 2.57333 3.53535
+amove 2.72667 3.42548
+aline 2.68 3.66353
+amove 2.83333 3.56959
+aline 2.78 3.80764
+amove 2.94 3.72964
+aline 2.88667 3.96769
+amove 3.04667 3.90562
+aline 2.99333 4.14367
+amove 0.886667 3.65164
+aline 0.993333 3.52486
+amove 0.993333 3.52486
+aline 1.1 3.41402
+amove 1.1 3.41402
+aline 1.19333 3.32544
+amove 1.2 3.31911
+aline 1.30667 3.24014
+amove 1.30667 3.24014
+aline 1.41333 3.1771
+amove 1.41333 3.1771
+aline 1.52 3.12999
+amove 1.52 3.12999
+aline 1.62667 3.09882
+amove 1.62667 3.09882
+aline 1.72667 3.08359
+amove 1.72667 3.08359
+aline 1.83333 3.08429
+amove 1.83333 3.08429
+aline 1.94 3.10092
+amove 1.94 3.10092
+aline 2.04667 3.13349
+amove 2.04667 3.13349
+aline 2.15333 3.18199
+amove 2.15333 3.18199
+aline 2.24667 3.24214
+amove 2.25333 3.24643
+aline 2.36 3.32681
+amove 2.36 3.32681
+aline 2.46667 3.42311
+amove 2.46667 3.42311
+aline 2.57333 3.53535
+amove 2.57333 3.53535
+aline 2.68 3.66353
+amove 2.68 3.66353
+aline 2.77333 3.79804
+amove 2.78 3.80764
+aline 2.88667 3.96769
+amove 2.88667 3.96769
+aline 2.99333 4.14367
+amove 0.886667 3.65164
+aline 0.833333 3.90562
+amove 0.993333 3.52486
+aline 0.94 3.77885
+amove 1.1 3.41402
+aline 1.04667 3.668
+amove 1.2 3.31911
+aline 1.15333 3.5731
+amove 1.30667 3.24014
+aline 1.25333 3.49412
+amove 1.41333 3.1771
+aline 1.36 3.43108
+amove 1.52 3.12999
+aline 1.46667 3.38398
+amove 1.62667 3.09882
+aline 1.57333 3.35281
+amove 1.72667 3.08359
+aline 1.68 3.33757
+amove 1.83333 3.08429
+aline 1.78 3.33827
+amove 1.94 3.10092
+aline 1.88667 3.35491
+amove 2.04667 3.13349
+aline 1.99333 3.38748
+amove 2.15333 3.18199
+aline 2.1 3.43598
+amove 2.25333 3.24643
+aline 2.20667 3.50042
+amove 2.36 3.32681
+aline 2.30667 3.58079
+amove 2.46667 3.42311
+aline 2.41333 3.6771
+amove 2.57333 3.53535
+aline 2.52 3.78934
+amove 2.68 3.66353
+aline 2.62667 3.91752
+amove 2.78 3.80764
+aline 2.73333 4.06163
+amove 2.88667 3.96769
+aline 2.83333 4.22167
+amove 2.99333 4.14367
+aline 2.94 4.39765
+amove 0.833333 3.90562
+aline 0.94 3.77885
+amove 0.94 3.77885
+aline 1.04667 3.668
+amove 1.04667 3.668
+aline 1.15333 3.5731
+amove 1.15333 3.5731
+aline 1.25333 3.49412
+amove 1.25333 3.49412
+aline 1.36 3.43108
+amove 1.36 3.43108
+aline 1.46667 3.38398
+amove 1.46667 3.38398
+aline 1.57333 3.35281
+amove 1.57333 3.35281
+aline 1.68 3.33757
+amove 1.68 3.33757
+aline 1.78 3.33827
+amove 1.78 3.33827
+aline 1.88667 3.35491
+amove 1.88667 3.35491
+aline 1.99333 3.38748
+amove 1.99333 3.38748
+aline 2.1 3.43598
+amove 2.1 3.43598
+aline 2.20667 3.50042
+amove 2.20667 3.50042
+aline 2.30667 3.58079
+amove 2.30667 3.58079
+aline 2.41333 3.6771
+amove 2.41333 3.6771
+aline 2.52 3.78934
+amove 2.52 3.78934
+aline 2.62667 3.91752
+amove 2.62667 3.91752
+aline 2.73333 4.06163
+amove 2.73333 4.06163
+aline 2.83333 4.22167
+amove 2.83333 4.22167
+aline 2.94 4.39765
+set color BLACK
+set lstyle 1
+set color BLACK
+set lstyle 1
+amove 4.5 1.12027
+aline 3.42 1.59448
+amove 1.79333 1.54327
+aline 0.833333 1.31625
+amove 0.833333 3.90562
+aline 0.833333 1.31625
+amove 0.833333 3.90562
+aline 2.94 4.39765
+amove 0.833333 3.90562
+aline 0.84 3.87388
+amove 2.94 4.39765
+aline 4.5 3.70964
+amove 4.5 3.70964
+aline 4.5 3.70964
+amove 4.5 3.70964
+aline 4.5 1.12027
+amove 0.837648 1.31625
+aline 2.39327 0.628236
+amove 2.39327 0.628236
+aline 4.5 1.12027
+set just BC
+set color BLACK
+set hei 0.0833333
+set just TC
+amove 0.837648 1.31625
+aline 0.835626 1.31168
+amove 0.795178 1.22022
+rotate -23.8587
+text 0
+rotate 23.8587
+amove 1.09692 1.20158
+aline 1.0949 1.19701
+amove 1.05445 1.10555
+rotate -23.8587
+text 5
+rotate 23.8587
+amove 1.35619 1.08691
+aline 1.35417 1.08234
+amove 1.31372 0.990884
+rotate -23.8587
+text 10
+rotate 23.8587
+amove 1.61546 0.972242
+aline 1.61343 0.96767
+amove 1.57299 0.876215
+rotate -23.8587
+text 15
+rotate 23.8587
+amove 1.87473 0.857574
+aline 1.8727 0.853001
+amove 1.83226 0.761546
+rotate -23.8587
+text 20
+rotate 23.8587
+amove 2.134 0.742905
+aline 2.13197 0.738332
+amove 2.09153 0.646878
+rotate -23.8587
+text 25
+rotate 23.8587
+amove 2.39327 0.628236
+aline 2.39124 0.623664
+amove 2.3508 0.532209
+rotate -23.8587
+text 30
+rotate 23.8587
+set just TC
+set color BLACK
+set hei 0.0833333
+set just TC
+amove 2.39327 0.628236
+aline 2.3944 0.623367
+amove 2.41715 0.525988
+rotate 13.1458
+text 0
+rotate -13.1458
+amove 2.60394 0.677439
+aline 2.60508 0.67257
+amove 2.62782 0.575191
+rotate 13.1458
+text 2
+rotate -13.1458
+amove 2.81461 0.726642
+aline 2.81575 0.721773
+amove 2.83849 0.624394
+rotate 13.1458
+text 4
+rotate -13.1458
+amove 3.02529 0.775845
+aline 3.02642 0.770976
+amove 3.04917 0.673597
+rotate 13.1458
+text 6
+rotate -13.1458
+amove 3.23596 0.825048
+aline 3.2371 0.820179
+amove 3.25984 0.7228
+rotate 13.1458
+text 8
+rotate -13.1458
+amove 3.44663 0.874251
+aline 3.44777 0.869382
+amove 3.47051 0.772003
+rotate 13.1458
+text 10
+rotate -13.1458
+amove 3.65731 0.923454
+aline 3.65844 0.918585
+amove 3.68119 0.821206
+rotate 13.1458
+text 12
+rotate -13.1458
+amove 3.86798 0.972657
+aline 3.86912 0.967788
+amove 3.89186 0.870409
+rotate 13.1458
+text 14
+rotate -13.1458
+amove 4.07865 1.02186
+aline 4.07979 1.01699
+amove 4.10253 0.919612
+rotate 13.1458
+text 16
+rotate -13.1458
+amove 4.28933 1.07106
+aline 4.29046 1.06619
+amove 4.31321 0.968815
+rotate 13.1458
+text 18
+rotate -13.1458
+amove 4.5 1.12027
+aline 4.50114 1.1154
+amove 4.52388 1.01802
+rotate 13.1458
+text 20
+rotate -13.1458
+set just TC
+set color BLACK
+set hei 0.0833333
+set just RC
+amove 0.837648 1.31625
+aline 0.832648 1.31625
+amove 0.732648 1.31625
+text 0
+amove 0.837648 1.71461
+aline 0.832648 1.71461
+amove 0.732648 1.71461
+text 50
+amove 0.837648 2.11298
+aline 0.832648 2.11298
+amove 0.732648 2.11298
+text 100
+amove 0.837648 2.51135
+aline 0.832648 2.51135
+amove 0.732648 2.51135
+text 150
+amove 0.837648 2.90971
+aline 0.832648 2.90971
+amove 0.732648 2.90971
+text 200
+amove 0.837648 3.30808
+aline 0.832648 3.30808
+amove 0.732648 3.30808
+text 250
+amove 0.837648 3.70644
+aline 0.832648 3.70644
+amove 0.732648 3.70644
+text 300
+set just BC
+set color BLACK
+set lstyle 1
+set color BLACK
+set lstyle 1
+set color BLACK
+set lstyle 1
+amove 0.833333 1.31625
+aline 1.8 1.53695
+amove 0.886667 1.29331
+aline 1.82667 1.51164
+amove 0.94 1.27038
+aline 1.86 1.48
+amove 0.986667 1.24745
+aline 1.88667 1.45747
+amove 1.04 1.22451
+aline 1.92667 1.42786
+amove 1.09333 1.20158
+aline 1.96 1.40318
+amove 1.14667 1.17865
+aline 2 1.37655
+amove 1.2 1.15571
+aline 2.04667 1.34897
+amove 1.24667 1.13278
+aline 2.08667 1.32533
+amove 1.3 1.10984
+aline 2.12667 1.30216
+amove 1.35333 1.08691
+aline 2.18 1.27677
+amove 3.38667 1.56415
+aline 3.46 1.57894
+amove 1.40667 1.06398
+aline 2.23333 1.25322
+amove 3.33333 1.516
+aline 3.51333 1.55601
+amove 1.45333 1.04104
+aline 2.28667 1.2345
+amove 3.28 1.46984
+aline 3.56 1.53307
+amove 1.50667 1.01811
+aline 2.35333 1.21429
+amove 3.21333 1.4196
+aline 3.61333 1.51014
+amove 1.56 0.995176
+aline 2.42667 1.19738
+amove 3.13333 1.36264
+aline 3.66667 1.48721
+amove 1.61333 0.972242
+aline 2.53333 1.18613
+amove 3.04 1.30626
+aline 3.72 1.46427
+amove 1.66667 0.949309
+aline 2.74 1.19982
+amove 2.79333 1.2124
+aline 3.77333 1.44134
+amove 1.71333 0.926375
+aline 3.82 1.4184
+amove 1.76667 0.903441
+aline 3.87333 1.39547
+amove 1.82 0.880508
+aline 3.92667 1.37254
+amove 1.87333 0.857574
+aline 3.98 1.3496
+amove 1.92 0.83464
+aline 4.02667 1.32667
+amove 1.97333 0.811706
+aline 4.08 1.30374
+amove 2.02667 0.788773
+aline 4.13333 1.2808
+amove 2.08 0.765839
+aline 4.18667 1.25787
+amove 2.13333 0.742905
+aline 4.24 1.23494
+amove 2.18 0.719971
+aline 4.28667 1.212
+amove 2.23333 0.697038
+aline 4.34 1.18907
+amove 2.28667 0.674104
+aline 4.39333 1.16613
+amove 2.34 0.65117
+aline 4.44667 1.1432
+amove 2.38667 0.628236
+aline 4.5 1.12027
+amove 0.833333 1.31625
+aline 2.38667 0.628236
+amove 0.94 1.34085
+aline 2.49333 0.652838
+amove 1.04667 1.36545
+aline 2.6 0.677439
+amove 1.15333 1.39005
+aline 2.70667 0.702041
+amove 1.25333 1.41465
+aline 2.81333 0.726642
+amove 1.36 1.43926
+aline 2.91333 0.751244
+amove 1.46667 1.46386
+aline 3.02 0.775845
+amove 1.57333 1.48846
+aline 3.12667 0.800447
+amove 1.68 1.51306
+aline 2.04 1.35291
+amove 2.36 1.21242
+aline 3.23333 0.825048
+amove 1.78 1.53766
+aline 1.82 1.51796
+amove 2.58 1.18644
+aline 3.34 0.84965
+amove 2.72 1.1965
+aline 3.44 0.874251
+amove 2.82667 1.22258
+aline 3.54667 0.898853
+amove 2.92 1.25162
+aline 3.65333 0.923454
+amove 3 1.28708
+aline 3.76 0.948056
+amove 3.07333 1.3264
+aline 3.86667 0.972657
+amove 3.14 1.36667
+aline 3.96667 0.997259
+amove 3.2 1.40956
+aline 4.07333 1.02186
+amove 3.26 1.45477
+aline 4.18 1.04646
+amove 3.32 1.50396
+aline 4.28667 1.07106
+amove 3.37333 1.55211
+aline 4.39333 1.09566
+amove 3.42667 1.60058
+aline 4.5 1.12027
diff --git a/gle-refman/utilities/fig/surf/surf5.sur b/gle-refman/utilities/fig/surf/surf5.sur
new file mode 100644
index 0000000..6d0617c
--- /dev/null
+++ b/gle-refman/utilities/fig/surf/surf5.sur
@@ -0,0 +1,46 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+begin surface
+ size 5 5
+ data jack.z
+ underneath on color green
+ !zaxis min -2 max 2
+ !cube zlen 5
+ base xstep 1 ystep 1
+end surface
diff --git a/gle-refman/utilities/fig/surf/surf5b.big b/gle-refman/utilities/fig/surf/surf5b.big
new file mode 100644
index 0000000..ffd4bf2
--- /dev/null
+++ b/gle-refman/utilities/fig/surf/surf5b.big
@@ -0,0 +1,2625 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+amove 9 9
+set hei 0.3
+set color GREEN
+set lstyle 1
+amove 2.38 1.33673
+aline 2.48667 1.31919
+amove 2.48667 1.31919
+aline 2.59333 1.3061
+amove 2.59333 1.3061
+aline 2.69333 1.29746
+amove 2.69333 1.29746
+aline 2.8 1.29327
+amove 2.8 1.29327
+aline 2.90667 1.29352
+amove 2.90667 1.29352
+aline 3.01333 1.29823
+amove 3.01333 1.29823
+aline 3.12 1.30739
+amove 3.12 1.30739
+aline 3.22667 1.321
+amove 3.22667 1.321
+aline 3.33333 1.33906
+amove 3.33333 1.33906
+aline 3.44 1.36156
+amove 3.44 1.36156
+aline 3.54667 1.38852
+amove 3.54667 1.38852
+aline 3.64667 1.41993
+amove 3.64667 1.41993
+aline 3.75333 1.45578
+amove 3.75333 1.45578
+aline 3.86 1.49609
+amove 3.86 1.49609
+aline 3.96667 1.54085
+amove 3.96667 1.54085
+aline 4.07333 1.59005
+amove 4.07333 1.59005
+aline 4.18 1.64371
+amove 4.18 1.64371
+aline 4.28667 1.70181
+amove 4.28667 1.70181
+aline 4.39333 1.76437
+amove 4.39333 1.76437
+aline 4.5 1.83138
+amove 2.38 1.33673
+aline 2.32667 1.29526
+amove 2.48667 1.31919
+aline 2.43333 1.27772
+amove 2.59333 1.3061
+aline 2.54 1.26463
+amove 2.69333 1.29746
+aline 2.64667 1.25599
+amove 2.8 1.29327
+aline 2.75333 1.2518
+amove 2.90667 1.29352
+aline 2.85333 1.25206
+amove 3.01333 1.29823
+aline 2.96 1.25677
+amove 3.12 1.30739
+aline 3.06667 1.26592
+amove 3.22667 1.321
+aline 3.17333 1.27953
+amove 3.33333 1.33906
+aline 3.28 1.29759
+amove 3.44 1.36156
+aline 3.38667 1.3201
+amove 3.54667 1.38852
+aline 3.49333 1.34705
+amove 3.64667 1.41993
+aline 3.6 1.37846
+amove 3.75333 1.45578
+aline 3.7 1.41432
+amove 3.86 1.49609
+aline 3.80667 1.45462
+amove 3.96667 1.54085
+aline 3.91333 1.49938
+amove 4.07333 1.59005
+aline 4.02 1.54859
+amove 4.18 1.64371
+aline 4.12667 1.60224
+amove 4.28667 1.70181
+aline 4.23333 1.66035
+amove 4.39333 1.76437
+aline 4.34 1.7229
+amove 4.5 1.83138
+aline 4.44667 1.78991
+amove 2.32667 1.29526
+aline 2.43333 1.27772
+amove 2.43333 1.27772
+aline 2.54 1.26463
+amove 2.54 1.26463
+aline 2.64667 1.25599
+amove 2.64667 1.25599
+aline 2.75333 1.2518
+amove 2.75333 1.2518
+aline 2.85333 1.25206
+amove 2.85333 1.25206
+aline 2.96 1.25677
+amove 2.96 1.25677
+aline 3.06667 1.26592
+amove 3.06667 1.26592
+aline 3.17333 1.27953
+amove 3.17333 1.27953
+aline 3.28 1.29759
+amove 3.28 1.29759
+aline 3.38667 1.3201
+amove 3.38667 1.3201
+aline 3.49333 1.34705
+amove 3.49333 1.34705
+aline 3.6 1.37846
+amove 3.6 1.37846
+aline 3.7 1.41432
+amove 3.7 1.41432
+aline 3.80667 1.45462
+amove 3.80667 1.45462
+aline 3.91333 1.49938
+amove 3.91333 1.49938
+aline 4.02 1.54859
+amove 4.02 1.54859
+aline 4.12667 1.60224
+amove 4.12667 1.60224
+aline 4.23333 1.66035
+amove 4.23333 1.66035
+aline 4.34 1.7229
+amove 4.34 1.7229
+aline 4.44667 1.78991
+amove 2.32667 1.29526
+aline 2.27333 1.25825
+amove 2.43333 1.27772
+aline 2.38 1.24071
+amove 2.54 1.26463
+aline 2.48667 1.22762
+amove 2.64667 1.25599
+aline 2.59333 1.21897
+amove 2.75333 1.2518
+aline 2.7 1.21478
+amove 2.85333 1.25206
+aline 2.80667 1.21504
+amove 2.96 1.25677
+aline 2.90667 1.21975
+amove 3.06667 1.26592
+aline 3.01333 1.22891
+amove 3.17333 1.27953
+aline 3.12 1.24251
+amove 3.28 1.29759
+aline 3.22667 1.26057
+amove 3.38667 1.3201
+aline 3.33333 1.28308
+amove 3.49333 1.34705
+aline 3.44 1.31004
+amove 3.6 1.37846
+aline 3.54667 1.34144
+amove 3.7 1.41432
+aline 3.65333 1.3773
+amove 3.80667 1.45462
+aline 3.76 1.41761
+amove 3.91333 1.49938
+aline 3.86 1.46236
+amove 4.02 1.54859
+aline 3.96667 1.51157
+amove 4.12667 1.60224
+aline 4.07333 1.56523
+amove 4.23333 1.66035
+aline 4.18 1.62333
+amove 4.34 1.7229
+aline 4.28667 1.68589
+amove 4.44667 1.78991
+aline 4.39333 1.75289
+amove 2.27333 1.25825
+aline 2.38 1.24071
+amove 2.38 1.24071
+aline 2.48667 1.22762
+amove 2.48667 1.22762
+aline 2.59333 1.21897
+amove 2.59333 1.21897
+aline 2.7 1.21478
+amove 2.7 1.21478
+aline 2.80667 1.21504
+amove 2.80667 1.21504
+aline 2.90667 1.21975
+amove 2.90667 1.21975
+aline 3.01333 1.22891
+amove 3.01333 1.22891
+aline 3.12 1.24251
+amove 3.12 1.24251
+aline 3.22667 1.26057
+amove 3.22667 1.26057
+aline 3.33333 1.28308
+amove 3.33333 1.28308
+aline 3.44 1.31004
+amove 3.44 1.31004
+aline 3.54667 1.34144
+amove 3.54667 1.34144
+aline 3.65333 1.3773
+amove 3.65333 1.3773
+aline 3.76 1.41761
+amove 3.76 1.41761
+aline 3.86 1.46236
+amove 3.86 1.46236
+aline 3.96667 1.51157
+amove 3.96667 1.51157
+aline 4.07333 1.56523
+amove 4.07333 1.56523
+aline 4.18 1.62333
+amove 4.18 1.62333
+aline 4.28667 1.68589
+amove 4.28667 1.68589
+aline 4.39333 1.75289
+amove 2.27333 1.25825
+aline 2.22 1.22568
+amove 2.38 1.24071
+aline 2.32667 1.20814
+amove 2.48667 1.22762
+aline 2.43333 1.19505
+amove 2.59333 1.21897
+aline 2.54 1.18641
+amove 2.7 1.21478
+aline 2.64667 1.18222
+amove 2.80667 1.21504
+aline 2.75333 1.18247
+amove 2.90667 1.21975
+aline 2.86 1.18718
+amove 3.01333 1.22891
+aline 2.96667 1.19634
+amove 3.12 1.24251
+aline 3.06667 1.20995
+amove 3.22667 1.26057
+aline 3.17333 1.228
+amove 3.33333 1.28308
+aline 3.28 1.25051
+amove 3.44 1.31004
+aline 3.38667 1.27747
+amove 3.54667 1.34144
+aline 3.49333 1.30888
+amove 3.65333 1.3773
+aline 3.6 1.34473
+amove 3.76 1.41761
+aline 3.70667 1.38504
+amove 3.86 1.46236
+aline 3.81333 1.4298
+amove 3.96667 1.51157
+aline 3.92 1.479
+amove 4.07333 1.56523
+aline 4.02 1.53266
+amove 4.18 1.62333
+aline 4.12667 1.59076
+amove 4.28667 1.68589
+aline 4.23333 1.65332
+amove 4.39333 1.75289
+aline 4.39333 1.75289
+amove 2.22 1.22568
+aline 2.32667 1.20814
+amove 2.32667 1.20814
+aline 2.43333 1.19505
+amove 2.43333 1.19505
+aline 2.54 1.18641
+amove 2.54 1.18641
+aline 2.64667 1.18222
+amove 2.64667 1.18222
+aline 2.75333 1.18247
+amove 2.75333 1.18247
+aline 2.86 1.18718
+amove 2.86 1.18718
+aline 2.96667 1.19634
+amove 2.96667 1.19634
+aline 3.06667 1.20995
+amove 3.06667 1.20995
+aline 3.17333 1.228
+amove 3.17333 1.228
+aline 3.28 1.25051
+amove 3.28 1.25051
+aline 3.38667 1.27747
+amove 3.38667 1.27747
+aline 3.49333 1.30888
+amove 3.49333 1.30888
+aline 3.6 1.34473
+amove 3.6 1.34473
+aline 3.70667 1.38504
+amove 3.70667 1.38504
+aline 3.81333 1.4298
+amove 3.81333 1.4298
+aline 3.92 1.479
+amove 3.92 1.479
+aline 4.02 1.53266
+amove 4.02 1.53266
+aline 4.12667 1.59076
+amove 4.12667 1.59076
+aline 4.23333 1.65332
+amove 4.23333 1.65332
+aline 4.23333 1.65332
+amove 2.22 1.22568
+aline 2.17333 1.19756
+amove 2.32667 1.20814
+aline 2.27333 1.18002
+amove 2.43333 1.19505
+aline 2.38 1.16693
+amove 2.54 1.18641
+aline 2.48667 1.15829
+amove 2.64667 1.18222
+aline 2.59333 1.1541
+amove 2.75333 1.18247
+aline 2.7 1.15436
+amove 2.86 1.18718
+aline 2.80667 1.15906
+amove 2.96667 1.19634
+aline 2.91333 1.16822
+amove 3.06667 1.20995
+aline 3.02 1.18183
+amove 3.17333 1.228
+aline 3.12 1.19989
+amove 3.28 1.25051
+aline 3.22667 1.2224
+amove 3.38667 1.27747
+aline 3.33333 1.24935
+amove 3.49333 1.30888
+aline 3.44 1.28076
+amove 3.6 1.34473
+aline 3.54667 1.31662
+amove 3.70667 1.38504
+aline 3.65333 1.35692
+amove 3.81333 1.4298
+aline 3.76 1.40168
+amove 3.92 1.479
+aline 3.86667 1.45089
+amove 4.02 1.53266
+aline 3.97333 1.50454
+amove 4.12667 1.59076
+aline 4.12667 1.59076
+amove 4.23333 1.65332
+aline 4.23333 1.65332
+amove 2.17333 1.19756
+aline 2.26667 1.18119
+amove 2.27333 1.18002
+aline 2.38 1.16693
+amove 2.38 1.16693
+aline 2.48667 1.15829
+amove 2.48667 1.15829
+aline 2.59333 1.1541
+amove 2.59333 1.1541
+aline 2.7 1.15436
+amove 2.7 1.15436
+aline 2.80667 1.15906
+amove 2.80667 1.15906
+aline 2.91333 1.16822
+amove 2.91333 1.16822
+aline 3.02 1.18183
+amove 3.02 1.18183
+aline 3.12 1.19989
+amove 3.12 1.19989
+aline 3.22667 1.2224
+amove 3.22667 1.2224
+aline 3.33333 1.24935
+amove 3.33333 1.24935
+aline 3.44 1.28076
+amove 3.44 1.28076
+aline 3.54667 1.31662
+amove 3.54667 1.31662
+aline 3.65333 1.35692
+amove 3.65333 1.35692
+aline 3.76 1.40168
+amove 3.76 1.40168
+aline 3.86667 1.45089
+amove 3.86667 1.45089
+aline 3.97333 1.50454
+amove 3.97333 1.50454
+aline 4.04667 1.54715
+amove 2.17333 1.19756
+aline 2.12 1.1739
+amove 2.27333 1.18002
+aline 2.22667 1.15635
+amove 2.38 1.16693
+aline 2.32667 1.14326
+amove 2.48667 1.15829
+aline 2.43333 1.13462
+amove 2.59333 1.1541
+aline 2.54 1.13043
+amove 2.7 1.15436
+aline 2.64667 1.13069
+amove 2.80667 1.15906
+aline 2.75333 1.1354
+amove 2.91333 1.16822
+aline 2.86 1.14456
+amove 3.02 1.18183
+aline 2.96667 1.15816
+amove 3.12 1.19989
+aline 3.07333 1.17622
+amove 3.22667 1.2224
+aline 3.18 1.19873
+amove 3.33333 1.24935
+aline 3.28 1.22568
+amove 3.44 1.28076
+aline 3.38667 1.25709
+amove 3.54667 1.31662
+aline 3.49333 1.29295
+amove 3.65333 1.35692
+aline 3.6 1.33326
+amove 3.76 1.40168
+aline 3.70667 1.37801
+amove 3.86667 1.45089
+aline 3.86667 1.45089
+amove 3.97333 1.50454
+aline 3.97333 1.50454
+amove 2.12 1.1739
+aline 2.22667 1.15635
+amove 2.22667 1.15635
+aline 2.32667 1.14326
+amove 2.32667 1.14326
+aline 2.43333 1.13462
+amove 2.43333 1.13462
+aline 2.54 1.13043
+amove 2.54 1.13043
+aline 2.64667 1.13069
+amove 2.64667 1.13069
+aline 2.75333 1.1354
+amove 2.75333 1.1354
+aline 2.86 1.14456
+amove 2.86 1.14456
+aline 2.96667 1.15816
+amove 2.96667 1.15816
+aline 3.07333 1.17622
+amove 3.07333 1.17622
+aline 3.18 1.19873
+amove 3.18 1.19873
+aline 3.28 1.22568
+amove 3.28 1.22568
+aline 3.38667 1.25709
+amove 3.38667 1.25709
+aline 3.49333 1.29295
+amove 3.49333 1.29295
+aline 3.6 1.33326
+amove 3.6 1.33326
+aline 3.70667 1.37801
+amove 3.70667 1.37801
+aline 3.70667 1.37801
+amove 2.12 1.1739
+aline 2.06667 1.15468
+amove 2.22667 1.15635
+aline 2.17333 1.13714
+amove 2.32667 1.14326
+aline 2.28 1.12405
+amove 2.43333 1.13462
+aline 2.38667 1.1154
+amove 2.54 1.13043
+aline 2.48667 1.11121
+amove 2.64667 1.13069
+aline 2.59333 1.11147
+amove 2.75333 1.1354
+aline 2.7 1.11618
+amove 2.86 1.14456
+aline 2.80667 1.12534
+amove 2.96667 1.15816
+aline 2.91333 1.13895
+amove 3.07333 1.17622
+aline 3.02 1.157
+amove 3.18 1.19873
+aline 3.12667 1.17951
+amove 3.28 1.22568
+aline 3.23333 1.20647
+amove 3.38667 1.25709
+aline 3.34 1.23787
+amove 3.49333 1.29295
+aline 3.44 1.27373
+amove 3.6 1.33326
+aline 3.6 1.33326
+amove 3.70667 1.37801
+aline 3.70667 1.37801
+amove 2.06667 1.15468
+aline 2.17333 1.13714
+amove 2.17333 1.13714
+aline 2.28 1.12405
+amove 2.28 1.12405
+aline 2.38667 1.1154
+amove 2.38667 1.1154
+aline 2.48 1.11149
+amove 2.48667 1.11121
+aline 2.59333 1.11147
+amove 2.59333 1.11147
+aline 2.7 1.11618
+amove 2.7 1.11618
+aline 2.80667 1.12534
+amove 2.80667 1.12534
+aline 2.91333 1.13895
+amove 2.91333 1.13895
+aline 3.02 1.157
+amove 3.02 1.157
+aline 3.12667 1.17951
+amove 3.12667 1.17951
+aline 3.23333 1.20647
+amove 3.23333 1.20647
+aline 3.34 1.23787
+amove 3.34 1.23787
+aline 3.44 1.27373
+amove 3.44 1.27373
+aline 3.44 1.27373
+amove 2.06667 1.15468
+aline 2.01333 1.13991
+amove 2.17333 1.13714
+aline 2.12 1.12237
+amove 2.28 1.12405
+aline 2.22667 1.10928
+amove 2.38667 1.1154
+aline 2.33333 1.10064
+amove 2.48667 1.11121
+aline 2.44 1.09645
+amove 2.59333 1.11147
+aline 2.54 1.0967
+amove 2.7 1.11618
+aline 2.64667 1.10141
+amove 2.80667 1.12534
+aline 2.75333 1.11057
+amove 2.91333 1.13895
+aline 2.86 1.12418
+amove 3.02 1.157
+aline 2.96667 1.14224
+amove 3.12667 1.17951
+aline 3.07333 1.16474
+amove 3.23333 1.20647
+aline 3.18 1.1917
+amove 3.34 1.23787
+aline 3.34 1.23787
+amove 3.44 1.27373
+aline 3.44 1.27373
+amove 2.01333 1.13991
+aline 2.12 1.12237
+amove 2.12 1.12237
+aline 2.22667 1.10928
+amove 2.22667 1.10928
+aline 2.33333 1.10064
+amove 2.33333 1.10064
+aline 2.44 1.09645
+amove 2.44 1.09645
+aline 2.54 1.0967
+amove 2.54 1.0967
+aline 2.64667 1.10141
+amove 2.64667 1.10141
+aline 2.75333 1.11057
+amove 2.75333 1.11057
+aline 2.86 1.12418
+amove 2.86 1.12418
+aline 2.96667 1.14224
+amove 2.96667 1.14224
+aline 3.07333 1.16474
+amove 3.07333 1.16474
+aline 3.18 1.1917
+amove 3.18 1.1917
+aline 3.18 1.1917
+amove 2.01333 1.13991
+aline 1.96 1.12959
+amove 2.12 1.12237
+aline 2.06667 1.11205
+amove 2.22667 1.10928
+aline 2.17333 1.09896
+amove 2.33333 1.10064
+aline 2.28 1.09032
+amove 2.44 1.09645
+aline 2.38667 1.08613
+amove 2.54 1.0967
+aline 2.49333 1.08639
+amove 2.64667 1.10141
+aline 2.6 1.09109
+amove 2.75333 1.11057
+aline 2.7 1.10025
+amove 2.86 1.12418
+aline 2.80667 1.11386
+amove 2.96667 1.14224
+aline 2.91333 1.13192
+amove 3.07333 1.16474
+aline 3.07333 1.16474
+amove 3.18 1.1917
+aline 3.18 1.1917
+amove 1.96 1.12959
+aline 2.06667 1.11205
+amove 2.06667 1.11205
+aline 2.17333 1.09896
+amove 2.17333 1.09896
+aline 2.28 1.09032
+amove 2.28 1.09032
+aline 2.38667 1.08613
+amove 2.38667 1.08613
+aline 2.49333 1.08639
+amove 2.49333 1.08639
+aline 2.6 1.09109
+amove 2.6 1.09109
+aline 2.69333 1.09964
+amove 2.7 1.10025
+aline 2.80667 1.11386
+amove 2.80667 1.11386
+aline 2.91333 1.13192
+amove 2.91333 1.13192
+aline 2.91333 1.13192
+amove 1.96 1.12959
+aline 1.90667 1.12372
+amove 2.06667 1.11205
+aline 2.01333 1.10618
+amove 2.17333 1.09896
+aline 2.12 1.09309
+amove 2.28 1.09032
+aline 2.22667 1.08445
+amove 2.38667 1.08613
+aline 2.33333 1.08026
+amove 2.49333 1.08639
+aline 2.44 1.08052
+amove 2.6 1.09109
+aline 2.54667 1.08523
+amove 2.7 1.10025
+aline 2.65333 1.09438
+amove 2.80667 1.11386
+aline 2.80667 1.11386
+amove 2.79333 1.11218
+aline 2.79333 1.11218
+amove 2.78 1.11051
+aline 2.78 1.11051
+amove 2.76667 1.10883
+aline 2.76667 1.10883
+amove 2.91333 1.13192
+aline 2.91333 1.13192
+amove 1.90667 1.12372
+aline 2.01333 1.10618
+amove 2.01333 1.10618
+aline 2.12 1.09309
+amove 2.12 1.09309
+aline 2.22667 1.08445
+amove 2.22667 1.08445
+aline 2.33333 1.08026
+amove 2.33333 1.08026
+aline 2.44 1.08052
+amove 2.44 1.08052
+aline 2.54667 1.08523
+amove 2.54667 1.08523
+aline 2.65333 1.09438
+amove 2.65333 1.09438
+aline 2.65333 1.09438
+amove 2.66667 1.09608
+aline 2.66667 1.09608
+amove 2.68 1.09779
+aline 2.68 1.09779
+amove 2.69333 1.09949
+aline 2.69333 1.09949
+amove 2.70667 1.10119
+aline 2.70667 1.10119
+amove 2.72 1.10289
+aline 2.72 1.10289
+amove 2.73333 1.10459
+aline 2.73333 1.10459
+amove 2.74667 1.10629
+aline 2.74667 1.10629
+amove 2.76 1.10799
+aline 2.76 1.10799
+amove 2.76 1.10799
+aline 2.76 1.10799
+amove 1.90667 1.12372
+aline 1.86 1.12231
+amove 2.01333 1.10618
+aline 1.96667 1.10476
+amove 2.12 1.09309
+aline 2.06667 1.09167
+amove 2.22667 1.08445
+aline 2.17333 1.08303
+amove 2.33333 1.08026
+aline 2.28 1.07884
+amove 2.44 1.08052
+aline 2.38667 1.0791
+amove 2.54667 1.08523
+aline 2.54667 1.08523
+amove 2.65333 1.09438
+aline 2.65333 1.09438
+amove 2.76 1.10799
+aline 2.76 1.10799
+amove 1.86 1.12231
+aline 1.96667 1.10476
+amove 1.96667 1.10476
+aline 2.06667 1.09167
+amove 2.06667 1.09167
+aline 2.17333 1.08303
+amove 2.17333 1.08303
+aline 2.28 1.07884
+amove 2.28 1.07884
+aline 2.38667 1.0791
+amove 2.38667 1.0791
+aline 2.38667 1.0791
+amove 1.86 1.12231
+aline 1.80667 1.12534
+amove 1.96667 1.10476
+aline 1.91333 1.1078
+amove 2.06667 1.09167
+aline 2.02 1.09471
+amove 2.17333 1.08303
+aline 2.12 1.08606
+amove 2.28 1.07884
+aline 2.28 1.07884
+amove 2.38667 1.0791
+aline 2.38667 1.0791
+amove 1.80667 1.12534
+aline 1.91333 1.1078
+amove 1.91333 1.1078
+aline 2.02 1.09471
+amove 2.02 1.09471
+aline 2.12 1.08606
+amove 2.12 1.08606
+aline 2.12 1.08606
+amove 1.80667 1.12534
+aline 1.75333 1.13282
+amove 1.91333 1.1078
+aline 1.86 1.11528
+amove 2.02 1.09471
+aline 2.02 1.09471
+amove 2.12 1.08606
+aline 2.12 1.08606
+amove 1.75333 1.13282
+aline 1.86 1.11528
+amove 1.86 1.11528
+aline 1.86 1.11528
+amove 1.75333 1.13282
+aline 1.7 1.14475
+amove 1.86 1.11528
+aline 1.86 1.11528
+amove 1.7 1.14475
+aline 1.7 1.14475
+amove 1.7 1.14475
+aline 1.64667 1.16113
+amove 1.64667 1.16113
+aline 1.64667 1.16113
+amove 1.64667 1.16113
+aline 1.6 1.18196
+amove 1.6 1.18196
+aline 1.6 1.18196
+amove 1.6 1.18196
+aline 1.54667 1.20724
+amove 1.54667 1.20724
+aline 1.54667 1.20724
+amove 1.54667 1.20724
+aline 1.49333 1.23697
+amove 1.49333 1.23697
+aline 1.49333 1.23697
+amove 1.49333 1.23697
+aline 1.44 1.27115
+amove 1.44 1.27115
+aline 1.44 1.27115
+amove 1.44 1.27115
+aline 1.38667 1.30978
+amove 1.38667 1.30978
+aline 1.38667 1.30978
+amove 1.38667 1.30978
+aline 1.33333 1.35286
+amove 1.33333 1.35286
+aline 1.33333 1.35286
+amove 1.33333 1.35286
+aline 1.28667 1.40039
+amove 1.28667 1.40039
+aline 1.28667 1.40039
+amove 1.28667 1.40039
+aline 1.23333 1.45237
+amove 1.23333 1.45237
+aline 1.23333 1.45237
+amove 1.23333 1.45237
+aline 1.18 1.5088
+amove 1.18 1.5088
+aline 1.18 1.5088
+amove 1.18 1.5088
+aline 1.12667 1.56968
+amove 1.12667 1.56968
+aline 1.12667 1.56968
+amove 1.12667 1.56968
+aline 1.07333 1.63501
+amove 1.07333 1.63501
+aline 1.07333 1.63501
+amove 1.07333 1.63501
+aline 1.02667 1.70479
+amove 1.02667 1.70479
+aline 1.02667 1.70479
+amove 1.02667 1.70479
+aline 0.973333 1.77902
+amove 0.973333 1.77902
+aline 0.973333 1.77902
+amove 0.973333 1.77902
+aline 0.92 1.85769
+amove 0.92 1.85769
+aline 0.92 1.85769
+amove 0.92 1.85769
+aline 0.866667 1.94082
+amove 0.866667 1.94082
+aline 0.866667 1.94082
+amove 0.866667 1.94082
+aline 0.813333 2.0284
+amove 0.813333 2.0284
+aline 0.813333 2.0284
+set color BLACK
+set lstyle 1
+amove 2.38 1.33673
+aline 2.48667 1.31919
+amove 2.48667 1.31919
+aline 2.59333 1.3061
+amove 2.59333 1.3061
+aline 2.69333 1.29746
+amove 2.69333 1.29746
+aline 2.8 1.29327
+amove 2.8 1.29327
+aline 2.90667 1.29352
+amove 2.90667 1.29352
+aline 3.01333 1.29823
+amove 3.01333 1.29823
+aline 3.12 1.30739
+amove 3.12 1.30739
+aline 3.22667 1.321
+amove 3.22667 1.321
+aline 3.33333 1.33906
+amove 3.33333 1.33906
+aline 3.44 1.36156
+amove 3.44 1.36156
+aline 3.54667 1.38852
+amove 3.54667 1.38852
+aline 3.64667 1.41993
+amove 3.64667 1.41993
+aline 3.75333 1.45578
+amove 3.75333 1.45578
+aline 3.86 1.49609
+amove 3.86 1.49609
+aline 3.96667 1.54085
+amove 3.96667 1.54085
+aline 4.07333 1.59005
+amove 4.07333 1.59005
+aline 4.18 1.64371
+amove 4.18 1.64371
+aline 4.28667 1.70181
+amove 4.28667 1.70181
+aline 4.39333 1.76437
+amove 4.39333 1.76437
+aline 4.5 1.83138
+amove 2.38 1.33673
+aline 2.32667 1.29526
+amove 2.48667 1.31919
+aline 2.48667 1.31919
+amove 2.59333 1.3061
+aline 2.59333 1.3061
+amove 2.69333 1.29746
+aline 2.69333 1.29746
+amove 2.8 1.29327
+aline 2.8 1.29327
+amove 2.90667 1.29352
+aline 2.90667 1.29352
+amove 3.01333 1.29823
+aline 3.01333 1.29823
+amove 3.12 1.30739
+aline 3.12 1.30739
+amove 3.22667 1.321
+aline 3.22667 1.321
+amove 3.33333 1.33906
+aline 3.33333 1.33906
+amove 3.44 1.36156
+aline 3.44 1.36156
+amove 3.54667 1.38852
+aline 3.54667 1.38852
+amove 3.64667 1.41993
+aline 3.64667 1.41993
+amove 3.75333 1.45578
+aline 3.75333 1.45578
+amove 3.86 1.49609
+aline 3.86 1.49609
+amove 3.96667 1.54085
+aline 3.96667 1.54085
+amove 4.07333 1.59005
+aline 4.07333 1.59005
+amove 4.18 1.64371
+aline 4.18 1.64371
+amove 4.28667 1.70181
+aline 4.28667 1.70181
+amove 4.39333 1.76437
+aline 4.39333 1.76437
+amove 4.5 1.83138
+aline 4.5 1.83138
+amove 2.32667 1.29526
+aline 2.32667 1.29526
+amove 2.32667 1.29526
+aline 2.27333 1.25825
+amove 2.27333 1.25825
+aline 2.27333 1.25825
+amove 2.27333 1.25825
+aline 2.22 1.22568
+amove 2.22 1.22568
+aline 2.22 1.22568
+amove 2.22 1.22568
+aline 2.17333 1.19756
+amove 2.17333 1.19756
+aline 2.17333 1.19756
+amove 2.17333 1.19756
+aline 2.12 1.1739
+amove 2.12 1.1739
+aline 2.12 1.1739
+amove 2.12 1.1739
+aline 2.06667 1.15468
+amove 4.2 1.65481
+aline 4.18667 1.64932
+amove 2.06667 1.15468
+aline 2.06667 1.15468
+amove 4.17333 1.64095
+aline 4.18667 1.64932
+amove 2.06667 1.15468
+aline 2.01333 1.13991
+amove 4.18667 1.64932
+aline 4.13333 1.63456
+amove 2.01333 1.13991
+aline 2.01333 1.13991
+amove 4.03333 1.57174
+aline 4.13333 1.63456
+amove 2.01333 1.13991
+aline 1.96 1.12959
+amove 4.02 1.56626
+aline 3.97333 1.55723
+amove 4.13333 1.63456
+aline 4.08 1.62424
+amove 1.96 1.12959
+aline 1.96 1.12959
+amove 3.89333 1.51032
+aline 3.97333 1.55723
+amove 3.97333 1.55723
+aline 4.08 1.62424
+amove 1.96 1.12959
+aline 1.90667 1.12372
+amove 3.84667 1.49248
+aline 3.81333 1.48881
+amove 3.97333 1.55723
+aline 3.92 1.55136
+amove 4.08 1.62424
+aline 4.02667 1.61837
+amove 1.90667 1.12372
+aline 1.90667 1.12372
+amove 3.75333 1.45612
+aline 3.81333 1.48881
+amove 3.81333 1.48881
+aline 3.92 1.55136
+amove 3.92 1.55136
+aline 4.02667 1.61837
+amove 1.90667 1.12372
+aline 1.86 1.12231
+amove 3.67333 1.42969
+aline 3.66 1.42928
+amove 3.81333 1.48881
+aline 3.76667 1.48739
+amove 3.92 1.55136
+aline 3.86667 1.54995
+amove 4.02667 1.61837
+aline 3.97333 1.61695
+amove 1.86 1.12231
+aline 1.86 1.12231
+amove 3.63333 1.41587
+aline 3.66 1.42928
+amove 3.66 1.42928
+aline 3.76667 1.48739
+amove 3.76667 1.48739
+aline 3.86667 1.54995
+amove 3.86667 1.54995
+aline 3.97333 1.61695
+amove 1.86 1.12231
+aline 1.80667 1.12534
+amove 3.5 1.37866
+aline 3.5 1.37866
+amove 3.66 1.42928
+aline 3.60667 1.43232
+amove 3.76667 1.48739
+aline 3.71333 1.49042
+amove 3.86667 1.54995
+aline 3.82 1.55298
+amove 3.97333 1.61695
+aline 3.92 1.61998
+amove 1.80667 1.12534
+aline 1.80667 1.12534
+amove 3.49333 1.37558
+aline 3.5 1.37866
+amove 3.5 1.37866
+aline 3.60667 1.43232
+amove 3.60667 1.43232
+aline 3.71333 1.49042
+amove 3.71333 1.49042
+aline 3.82 1.55298
+amove 3.82 1.55298
+aline 3.91333 1.61552
+amove 1.80667 1.12534
+aline 1.75333 1.13282
+amove 3.5 1.37866
+aline 3.44667 1.38614
+amove 3.60667 1.43232
+aline 3.55333 1.4398
+amove 3.71333 1.49042
+aline 3.66 1.4979
+amove 3.82 1.55298
+aline 3.76667 1.56046
+amove 3.92 1.61998
+aline 3.87333 1.62746
+amove 1.75333 1.13282
+aline 1.75333 1.13282
+amove 3.36 1.34616
+aline 3.44667 1.38614
+amove 3.44667 1.38614
+aline 3.55333 1.4398
+amove 3.55333 1.4398
+aline 3.66 1.4979
+amove 3.66 1.4979
+aline 3.76667 1.56046
+amove 3.76667 1.56046
+aline 3.87333 1.62746
+amove 1.75333 1.13282
+aline 1.7 1.14475
+amove 1.81333 1.12572
+aline 1.80667 1.12721
+amove 3.32667 1.33992
+aline 3.28667 1.34887
+amove 3.44667 1.38614
+aline 3.39333 1.39807
+amove 3.55333 1.4398
+aline 3.5 1.45173
+amove 3.66 1.4979
+aline 3.60667 1.50983
+amove 3.76667 1.56046
+aline 3.71333 1.57239
+amove 3.87333 1.62746
+aline 3.82 1.6394
+amove 1.7 1.14475
+aline 1.80667 1.12721
+amove 1.80667 1.12721
+aline 1.83333 1.12394
+amove 3.22667 1.32201
+aline 3.28 1.34588
+amove 3.28667 1.34887
+aline 3.39333 1.39807
+amove 3.39333 1.39807
+aline 3.5 1.45173
+amove 3.5 1.45173
+aline 3.60667 1.50983
+amove 3.60667 1.50983
+aline 3.71333 1.57239
+amove 3.71333 1.57239
+aline 3.82 1.6394
+amove 1.7 1.14475
+aline 1.64667 1.16113
+amove 1.80667 1.12721
+aline 1.75333 1.14359
+amove 1.88 1.12436
+aline 1.86 1.1305
+amove 3.15333 1.31435
+aline 3.13333 1.32049
+amove 3.28667 1.34887
+aline 3.24 1.36525
+amove 3.39333 1.39807
+aline 3.34 1.41445
+amove 3.5 1.45173
+aline 3.44667 1.46811
+amove 3.60667 1.50983
+aline 3.55333 1.52621
+amove 3.71333 1.57239
+aline 3.66 1.58877
+amove 3.82 1.6394
+aline 3.76667 1.65578
+amove 1.64667 1.16113
+aline 1.75333 1.14359
+amove 1.75333 1.14359
+aline 1.86 1.1305
+amove 1.86 1.1305
+aline 1.92 1.12564
+amove 3.09333 1.30538
+aline 3.13333 1.32049
+amove 3.13333 1.32049
+aline 3.24 1.36525
+amove 3.24 1.36525
+aline 3.33333 1.41117
+amove 3.34 1.41445
+aline 3.44667 1.46811
+amove 3.44667 1.46811
+aline 3.55333 1.52621
+amove 3.55333 1.52621
+aline 3.66 1.58877
+amove 3.66 1.58877
+aline 3.76667 1.65578
+amove 1.64667 1.16113
+aline 1.6 1.18196
+amove 1.75333 1.14359
+aline 1.7 1.16442
+amove 1.86 1.1305
+aline 1.80667 1.15133
+amove 1.94667 1.12967
+aline 1.91333 1.14269
+amove 2.98 1.29841
+aline 2.97333 1.30101
+amove 3.13333 1.32049
+aline 3.08 1.34132
+amove 3.24 1.36525
+aline 3.18667 1.38608
+amove 3.34 1.41445
+aline 3.29333 1.43528
+amove 3.44667 1.46811
+aline 3.4 1.48894
+amove 3.55333 1.52621
+aline 3.5 1.54705
+amove 3.66 1.58877
+aline 3.60667 1.6096
+amove 3.76667 1.65578
+aline 3.71333 1.67661
+amove 1.6 1.18196
+aline 1.7 1.16442
+amove 1.7 1.16442
+aline 1.80667 1.15133
+amove 1.80667 1.15133
+aline 1.91333 1.14269
+amove 1.91333 1.14269
+aline 2.00667 1.13902
+amove 2.96 1.29653
+aline 2.97333 1.30101
+amove 2.97333 1.30101
+aline 3.08 1.34132
+amove 3.08 1.34132
+aline 3.18667 1.38608
+amove 3.18667 1.38608
+aline 3.29333 1.43528
+amove 3.29333 1.43528
+aline 3.4 1.48894
+amove 3.4 1.48894
+aline 3.49333 1.54317
+amove 3.5 1.54705
+aline 3.60667 1.6096
+amove 3.60667 1.6096
+aline 3.71333 1.67661
+amove 1.6 1.18196
+aline 1.54667 1.20724
+amove 1.7 1.16442
+aline 1.65333 1.1897
+amove 1.80667 1.15133
+aline 1.75333 1.17661
+amove 1.91333 1.14269
+aline 1.86 1.16797
+amove 2.01333 1.14166
+aline 1.96667 1.16378
+amove 2.08 1.16088
+aline 2.07333 1.16404
+amove 2.97333 1.30101
+aline 2.92 1.3263
+amove 3.08 1.34132
+aline 3.02667 1.3666
+amove 3.18667 1.38608
+aline 3.13333 1.41136
+amove 3.29333 1.43528
+aline 3.24 1.46056
+amove 3.4 1.48894
+aline 3.34667 1.51422
+amove 3.5 1.54705
+aline 3.45333 1.57233
+amove 3.60667 1.6096
+aline 3.56 1.63488
+amove 3.71333 1.67661
+aline 3.66 1.70189
+amove 1.54667 1.20724
+aline 1.65333 1.1897
+amove 1.65333 1.1897
+aline 1.75333 1.17661
+amove 1.75333 1.17661
+aline 1.86 1.16797
+amove 1.86 1.16797
+aline 1.96667 1.16378
+amove 1.96667 1.16378
+aline 2.07333 1.16404
+amove 2.07333 1.16404
+aline 2.09333 1.16492
+amove 2.82667 1.29492
+aline 2.92 1.3263
+amove 2.92 1.3263
+aline 3.02667 1.3666
+amove 3.02667 1.3666
+aline 3.13333 1.41136
+amove 3.13333 1.41136
+aline 3.24 1.46056
+amove 3.24 1.46056
+aline 3.34667 1.51422
+amove 3.34667 1.51422
+aline 3.45333 1.57233
+amove 3.45333 1.57233
+aline 3.56 1.63488
+amove 3.56 1.63488
+aline 3.65333 1.69742
+amove 1.54667 1.20724
+aline 1.49333 1.23697
+amove 1.65333 1.1897
+aline 1.6 1.21943
+amove 1.75333 1.17661
+aline 1.70667 1.20634
+amove 1.86 1.16797
+aline 1.81333 1.1977
+amove 1.96667 1.16378
+aline 1.91333 1.19351
+amove 2.07333 1.16404
+aline 2.02 1.19377
+amove 2.14667 1.18733
+aline 2.12667 1.19847
+amove 2.80667 1.29415
+aline 2.76 1.32017
+amove 2.92 1.3263
+aline 2.86667 1.35603
+amove 3.02667 1.3666
+aline 2.97333 1.39633
+amove 3.13333 1.41136
+aline 3.08 1.44109
+amove 3.24 1.46056
+aline 3.18667 1.49029
+amove 3.34667 1.51422
+aline 3.29333 1.54395
+amove 3.45333 1.57233
+aline 3.4 1.60206
+amove 3.56 1.63488
+aline 3.50667 1.66461
+amove 3.66 1.70189
+aline 3.61333 1.73162
+amove 1.49333 1.23697
+aline 1.6 1.21943
+amove 1.6 1.21943
+aline 1.70667 1.20634
+amove 1.70667 1.20634
+aline 1.81333 1.1977
+amove 1.81333 1.1977
+aline 1.91333 1.19351
+amove 1.91333 1.19351
+aline 2.02 1.19377
+amove 2.02 1.19377
+aline 2.12667 1.19847
+amove 2.12667 1.19847
+aline 2.18 1.20305
+amove 2.69333 1.29923
+aline 2.75333 1.31807
+amove 2.76 1.32017
+aline 2.86667 1.35603
+amove 2.86667 1.35603
+aline 2.97333 1.39633
+amove 2.97333 1.39633
+aline 3.08 1.44109
+amove 3.08 1.44109
+aline 3.18667 1.49029
+amove 3.18667 1.49029
+aline 3.29333 1.54395
+amove 3.29333 1.54395
+aline 3.4 1.60206
+amove 3.4 1.60206
+aline 3.50667 1.66461
+amove 3.50667 1.66461
+aline 3.61333 1.73162
+amove 1.49333 1.23697
+aline 1.44 1.27115
+amove 1.6 1.21943
+aline 1.54667 1.25361
+amove 1.70667 1.20634
+aline 1.65333 1.24052
+amove 1.81333 1.1977
+aline 1.76 1.23188
+amove 1.91333 1.19351
+aline 1.86667 1.22769
+amove 2.02 1.19377
+aline 1.96667 1.22795
+amove 2.12667 1.19847
+aline 2.07333 1.23265
+amove 2.20667 1.22472
+aline 2.18 1.24181
+amove 2.63333 1.30585
+aline 2.60667 1.32294
+amove 2.76 1.32017
+aline 2.71333 1.35435
+amove 2.86667 1.35603
+aline 2.82 1.39021
+amove 2.97333 1.39633
+aline 2.92 1.43051
+amove 3.08 1.44109
+aline 3.02667 1.47527
+amove 3.18667 1.49029
+aline 3.13333 1.52447
+amove 3.29333 1.54395
+aline 3.24 1.57813
+amove 3.4 1.60206
+aline 3.34667 1.63624
+amove 3.50667 1.66461
+aline 3.45333 1.69879
+amove 3.61333 1.73162
+aline 3.56 1.7658
+amove 1.44 1.27115
+aline 1.54667 1.25361
+amove 1.54667 1.25361
+aline 1.65333 1.24052
+amove 1.65333 1.24052
+aline 1.76 1.23188
+amove 1.76 1.23188
+aline 1.86667 1.22769
+amove 1.86667 1.22769
+aline 1.96 1.22793
+amove 1.96667 1.22795
+aline 2.07333 1.23265
+amove 2.07333 1.23265
+aline 2.18 1.24181
+amove 2.18 1.24181
+aline 2.26 1.25202
+amove 2.56 1.31115
+aline 2.60667 1.32294
+amove 2.60667 1.32294
+aline 2.71333 1.35435
+amove 2.71333 1.35435
+aline 2.82 1.39021
+amove 2.82 1.39021
+aline 2.91333 1.42783
+amove 2.92 1.43051
+aline 3.02667 1.47527
+amove 3.02667 1.47527
+aline 3.13333 1.52447
+amove 3.13333 1.52447
+aline 3.24 1.57813
+amove 3.24 1.57813
+aline 3.34667 1.63624
+amove 3.34667 1.63624
+aline 3.45333 1.69879
+amove 3.45333 1.69879
+aline 3.56 1.7658
+amove 1.44 1.27115
+aline 1.38667 1.30978
+amove 1.54667 1.25361
+aline 1.49333 1.29224
+amove 1.65333 1.24052
+aline 1.6 1.27915
+amove 1.76 1.23188
+aline 1.70667 1.27051
+amove 1.86667 1.22769
+aline 1.81333 1.26632
+amove 1.96667 1.22795
+aline 1.92 1.26658
+amove 2.07333 1.23265
+aline 2.02667 1.27128
+amove 2.18 1.24181
+aline 2.12667 1.28044
+amove 2.27333 1.26508
+aline 2.23333 1.29405
+amove 2.34 1.31211
+aline 2.34 1.31211
+amove 2.46 1.32496
+aline 2.44667 1.33461
+amove 2.60667 1.32294
+aline 2.55333 1.36157
+amove 2.71333 1.35435
+aline 2.66 1.39298
+amove 2.82 1.39021
+aline 2.76667 1.42884
+amove 2.92 1.43051
+aline 2.87333 1.46914
+amove 3.02667 1.47527
+aline 2.98 1.5139
+amove 3.13333 1.52447
+aline 3.08 1.5631
+amove 3.24 1.57813
+aline 3.18667 1.61676
+amove 3.34667 1.63624
+aline 3.29333 1.67487
+amove 3.45333 1.69879
+aline 3.4 1.73742
+amove 3.56 1.7658
+aline 3.50667 1.80443
+amove 1.38667 1.30978
+aline 1.49333 1.29224
+amove 1.49333 1.29224
+aline 1.6 1.27915
+amove 1.6 1.27915
+aline 1.70667 1.27051
+amove 1.70667 1.27051
+aline 1.81333 1.26632
+amove 1.81333 1.26632
+aline 1.92 1.26658
+amove 1.92 1.26658
+aline 2.02667 1.27128
+amove 2.02667 1.27128
+aline 2.12 1.27983
+amove 2.12667 1.28044
+aline 2.23333 1.29405
+amove 2.23333 1.29405
+aline 2.34 1.31211
+amove 2.34 1.31211
+aline 2.34667 1.31351
+amove 2.42667 1.33039
+aline 2.44667 1.33461
+amove 2.44667 1.33461
+aline 2.55333 1.36157
+amove 2.55333 1.36157
+aline 2.66 1.39298
+amove 2.66 1.39298
+aline 2.76667 1.42884
+amove 2.76667 1.42884
+aline 2.87333 1.46914
+amove 2.87333 1.46914
+aline 2.98 1.5139
+amove 2.98 1.5139
+aline 3.07333 1.55982
+amove 3.08 1.5631
+aline 3.18667 1.61676
+amove 3.18667 1.61676
+aline 3.29333 1.67487
+amove 3.29333 1.67487
+aline 3.4 1.73742
+amove 3.4 1.73742
+aline 3.50667 1.80443
+amove 1.38667 1.30978
+aline 1.33333 1.35286
+amove 1.49333 1.29224
+aline 1.44 1.33532
+amove 1.6 1.27915
+aline 1.54667 1.32223
+amove 1.70667 1.27051
+aline 1.65333 1.31359
+amove 1.81333 1.26632
+aline 1.76 1.3094
+amove 1.92 1.26658
+aline 1.86667 1.30966
+amove 2.02667 1.27128
+aline 1.97333 1.31436
+amove 2.12667 1.28044
+aline 2.08 1.32352
+amove 2.23333 1.29405
+aline 2.18 1.33713
+amove 2.34 1.31211
+aline 2.28667 1.35519
+amove 2.44667 1.33461
+aline 2.39333 1.37769
+amove 2.55333 1.36157
+aline 2.5 1.40465
+amove 2.66 1.39298
+aline 2.60667 1.43606
+amove 2.76667 1.42884
+aline 2.71333 1.47192
+amove 2.87333 1.46914
+aline 2.82 1.51222
+amove 2.98 1.5139
+aline 2.92667 1.55698
+amove 3.08 1.5631
+aline 3.03333 1.60618
+amove 3.18667 1.61676
+aline 3.13333 1.65984
+amove 3.29333 1.67487
+aline 3.24 1.71795
+amove 3.4 1.73742
+aline 3.34667 1.7805
+amove 3.50667 1.80443
+aline 3.45333 1.84751
+amove 1.33333 1.35286
+aline 1.44 1.33532
+amove 1.44 1.33532
+aline 1.54667 1.32223
+amove 1.54667 1.32223
+aline 1.65333 1.31359
+amove 1.65333 1.31359
+aline 1.76 1.3094
+amove 1.76 1.3094
+aline 1.86667 1.30966
+amove 1.86667 1.30966
+aline 1.97333 1.31436
+amove 1.97333 1.31436
+aline 2.08 1.32352
+amove 2.08 1.32352
+aline 2.18 1.33713
+amove 2.18 1.33713
+aline 2.28667 1.35519
+amove 2.28667 1.35519
+aline 2.39333 1.37769
+amove 2.39333 1.37769
+aline 2.5 1.40465
+amove 2.5 1.40465
+aline 2.60667 1.43606
+amove 2.60667 1.43606
+aline 2.71333 1.47192
+amove 2.71333 1.47192
+aline 2.82 1.51222
+amove 2.82 1.51222
+aline 2.92667 1.55698
+amove 2.92667 1.55698
+aline 3.03333 1.60618
+amove 3.03333 1.60618
+aline 3.12667 1.65626
+amove 3.13333 1.65984
+aline 3.24 1.71795
+amove 3.24 1.71795
+aline 3.34667 1.7805
+amove 3.34667 1.7805
+aline 3.45333 1.84751
+amove 1.33333 1.35286
+aline 1.28667 1.40039
+amove 1.44 1.33532
+aline 1.38667 1.38285
+amove 1.54667 1.32223
+aline 1.49333 1.36976
+amove 1.65333 1.31359
+aline 1.6 1.36112
+amove 1.76 1.3094
+aline 1.70667 1.35693
+amove 1.86667 1.30966
+aline 1.81333 1.35719
+amove 1.97333 1.31436
+aline 1.92 1.36189
+amove 2.08 1.32352
+aline 2.02667 1.37105
+amove 2.18 1.33713
+aline 2.13333 1.38466
+amove 2.28667 1.35519
+aline 2.24 1.40272
+amove 2.39333 1.37769
+aline 2.34 1.42522
+amove 2.5 1.40465
+aline 2.44667 1.45218
+amove 2.60667 1.43606
+aline 2.55333 1.48359
+amove 2.71333 1.47192
+aline 2.66 1.51944
+amove 2.82 1.51222
+aline 2.76667 1.55975
+amove 2.92667 1.55698
+aline 2.87333 1.60451
+amove 3.03333 1.60618
+aline 2.98 1.65371
+amove 3.13333 1.65984
+aline 3.08667 1.70737
+amove 3.24 1.71795
+aline 3.19333 1.76548
+amove 3.34667 1.7805
+aline 3.29333 1.82803
+amove 3.45333 1.84751
+aline 3.4 1.89504
+amove 1.28667 1.40039
+aline 1.38667 1.38285
+amove 1.38667 1.38285
+aline 1.49333 1.36976
+amove 1.49333 1.36976
+aline 1.6 1.36112
+amove 1.6 1.36112
+aline 1.70667 1.35693
+amove 1.70667 1.35693
+aline 1.81333 1.35719
+amove 1.81333 1.35719
+aline 1.92 1.36189
+amove 1.92 1.36189
+aline 2.02667 1.37105
+amove 2.02667 1.37105
+aline 2.13333 1.38466
+amove 2.13333 1.38466
+aline 2.24 1.40272
+amove 2.24 1.40272
+aline 2.34 1.42522
+amove 2.34 1.42522
+aline 2.44667 1.45218
+amove 2.44667 1.45218
+aline 2.55333 1.48359
+amove 2.55333 1.48359
+aline 2.66 1.51944
+amove 2.66 1.51944
+aline 2.76667 1.55975
+amove 2.76667 1.55975
+aline 2.87333 1.60451
+amove 2.87333 1.60451
+aline 2.98 1.65371
+amove 2.98 1.65371
+aline 3.08667 1.70737
+amove 3.08667 1.70737
+aline 3.19333 1.76548
+amove 3.19333 1.76548
+aline 3.29333 1.82803
+amove 3.29333 1.82803
+aline 3.4 1.89504
+amove 1.28667 1.40039
+aline 1.23333 1.45237
+amove 1.38667 1.38285
+aline 1.34 1.43483
+amove 1.49333 1.36976
+aline 1.44667 1.42174
+amove 1.6 1.36112
+aline 1.54667 1.4131
+amove 1.70667 1.35693
+aline 1.65333 1.40891
+amove 1.81333 1.35719
+aline 1.76 1.40916
+amove 1.92 1.36189
+aline 1.86667 1.41387
+amove 2.02667 1.37105
+aline 1.97333 1.42303
+amove 2.13333 1.38466
+aline 2.08 1.43664
+amove 2.24 1.40272
+aline 2.18667 1.4547
+amove 2.34 1.42522
+aline 2.29333 1.4772
+amove 2.44667 1.45218
+aline 2.4 1.50416
+amove 2.55333 1.48359
+aline 2.5 1.53557
+amove 2.66 1.51944
+aline 2.60667 1.57142
+amove 2.76667 1.55975
+aline 2.71333 1.61173
+amove 2.87333 1.60451
+aline 2.82 1.65649
+amove 2.98 1.65371
+aline 2.92667 1.70569
+amove 3.08667 1.70737
+aline 3.03333 1.75935
+amove 3.19333 1.76548
+aline 3.14 1.81746
+amove 3.29333 1.82803
+aline 3.24667 1.88001
+amove 3.4 1.89504
+aline 3.34667 1.94702
+amove 1.23333 1.45237
+aline 1.34 1.43483
+amove 1.34 1.43483
+aline 1.44667 1.42174
+amove 1.44667 1.42174
+aline 1.54667 1.4131
+amove 1.54667 1.4131
+aline 1.65333 1.40891
+amove 1.65333 1.40891
+aline 1.76 1.40916
+amove 1.76 1.40916
+aline 1.86667 1.41387
+amove 1.86667 1.41387
+aline 1.97333 1.42303
+amove 1.97333 1.42303
+aline 2.08 1.43664
+amove 2.08 1.43664
+aline 2.18667 1.4547
+amove 2.18667 1.4547
+aline 2.29333 1.4772
+amove 2.29333 1.4772
+aline 2.4 1.50416
+amove 2.4 1.50416
+aline 2.49333 1.53347
+amove 2.5 1.53557
+aline 2.60667 1.57142
+amove 2.60667 1.57142
+aline 2.71333 1.61173
+amove 2.71333 1.61173
+aline 2.82 1.65649
+amove 2.82 1.65649
+aline 2.92667 1.70569
+amove 2.92667 1.70569
+aline 3.03333 1.75935
+amove 3.03333 1.75935
+aline 3.14 1.81746
+amove 3.14 1.81746
+aline 3.24667 1.88001
+amove 3.24667 1.88001
+aline 3.34 1.94255
+amove 1.23333 1.45237
+aline 1.18 1.5088
+amove 1.34 1.43483
+aline 1.28667 1.49126
+amove 1.44667 1.42174
+aline 1.39333 1.47817
+amove 1.54667 1.4131
+aline 1.5 1.46953
+amove 1.65333 1.40891
+aline 1.60667 1.46534
+amove 1.76 1.40916
+aline 1.70667 1.46559
+amove 1.86667 1.41387
+aline 1.81333 1.4703
+amove 1.97333 1.42303
+aline 1.92 1.47946
+amove 2.08 1.43664
+aline 2.02667 1.49307
+amove 2.18667 1.4547
+aline 2.13333 1.51113
+amove 2.29333 1.4772
+aline 2.24 1.53363
+amove 2.4 1.50416
+aline 2.34667 1.56059
+amove 2.5 1.53557
+aline 2.45333 1.592
+amove 2.60667 1.57142
+aline 2.55333 1.62785
+amove 2.71333 1.61173
+aline 2.66 1.66816
+amove 2.82 1.65649
+aline 2.76667 1.71292
+amove 2.92667 1.70569
+aline 2.87333 1.76212
+amove 3.03333 1.75935
+aline 2.98 1.81578
+amove 3.14 1.81746
+aline 3.08667 1.87388
+amove 3.24667 1.88001
+aline 3.19333 1.93644
+amove 3.34667 1.94702
+aline 3.3 2.00345
+amove 1.18 1.5088
+aline 1.28667 1.49126
+amove 1.28667 1.49126
+aline 1.39333 1.47817
+amove 1.39333 1.47817
+aline 1.5 1.46953
+amove 1.5 1.46953
+aline 1.60667 1.46534
+amove 1.60667 1.46534
+aline 1.7 1.46558
+amove 1.70667 1.46559
+aline 1.81333 1.4703
+amove 1.81333 1.4703
+aline 1.92 1.47946
+amove 1.92 1.47946
+aline 2.02667 1.49307
+amove 2.02667 1.49307
+aline 2.13333 1.51113
+amove 2.13333 1.51113
+aline 2.24 1.53363
+amove 2.24 1.53363
+aline 2.34667 1.56059
+amove 2.34667 1.56059
+aline 2.45333 1.592
+amove 2.45333 1.592
+aline 2.54667 1.62546
+amove 2.55333 1.62785
+aline 2.66 1.66816
+amove 2.66 1.66816
+aline 2.76667 1.71292
+amove 2.76667 1.71292
+aline 2.87333 1.76212
+amove 2.87333 1.76212
+aline 2.98 1.81578
+amove 2.98 1.81578
+aline 3.08667 1.87388
+amove 3.08667 1.87388
+aline 3.19333 1.93644
+amove 3.19333 1.93644
+aline 3.3 2.00345
+amove 1.18 1.5088
+aline 1.12667 1.56968
+amove 1.28667 1.49126
+aline 1.23333 1.55214
+amove 1.39333 1.47817
+aline 1.34 1.53905
+amove 1.5 1.46953
+aline 1.44667 1.53041
+amove 1.60667 1.46534
+aline 1.55333 1.52621
+amove 1.70667 1.46559
+aline 1.66 1.52647
+amove 1.81333 1.4703
+aline 1.76 1.53118
+amove 1.92 1.47946
+aline 1.86667 1.54034
+amove 2.02667 1.49307
+aline 1.97333 1.55395
+amove 2.13333 1.51113
+aline 2.08 1.572
+amove 2.24 1.53363
+aline 2.18667 1.59451
+amove 2.34667 1.56059
+aline 2.29333 1.62147
+amove 2.45333 1.592
+aline 2.4 1.65288
+amove 2.55333 1.62785
+aline 2.50667 1.68873
+amove 2.66 1.66816
+aline 2.61333 1.72904
+amove 2.76667 1.71292
+aline 2.71333 1.7738
+amove 2.87333 1.76212
+aline 2.82 1.823
+amove 2.98 1.81578
+aline 2.92667 1.87666
+amove 3.08667 1.87388
+aline 3.03333 1.93476
+amove 3.19333 1.93644
+aline 3.14 1.99732
+amove 3.3 2.00345
+aline 3.24667 2.06432
+amove 1.12667 1.56968
+aline 1.23333 1.55214
+amove 1.23333 1.55214
+aline 1.34 1.53905
+amove 1.34 1.53905
+aline 1.44667 1.53041
+amove 1.44667 1.53041
+aline 1.55333 1.52621
+amove 1.55333 1.52621
+aline 1.66 1.52647
+amove 1.66 1.52647
+aline 1.76 1.53118
+amove 1.76 1.53118
+aline 1.86667 1.54034
+amove 1.86667 1.54034
+aline 1.97333 1.55395
+amove 1.97333 1.55395
+aline 2.08 1.572
+amove 2.08 1.572
+aline 2.18667 1.59451
+amove 2.18667 1.59451
+aline 2.29333 1.62147
+amove 2.29333 1.62147
+aline 2.4 1.65288
+amove 2.4 1.65288
+aline 2.50667 1.68873
+amove 2.50667 1.68873
+aline 2.61333 1.72904
+amove 2.61333 1.72904
+aline 2.70667 1.77081
+amove 2.71333 1.7738
+aline 2.82 1.823
+amove 2.82 1.823
+aline 2.92667 1.87666
+amove 2.92667 1.87666
+aline 3.03333 1.93476
+amove 3.03333 1.93476
+aline 3.14 1.99732
+amove 3.14 1.99732
+aline 3.24667 2.06432
+amove 1.12667 1.56968
+aline 1.07333 1.63501
+amove 1.23333 1.55214
+aline 1.18 1.61747
+amove 1.34 1.53905
+aline 1.28667 1.60438
+amove 1.44667 1.53041
+aline 1.39333 1.59574
+amove 1.55333 1.52621
+aline 1.5 1.59154
+amove 1.66 1.52647
+aline 1.60667 1.5918
+amove 1.76 1.53118
+aline 1.71333 1.59651
+amove 1.86667 1.54034
+aline 1.82 1.60567
+amove 1.97333 1.55395
+aline 1.92 1.61928
+amove 2.08 1.572
+aline 2.02667 1.63733
+amove 2.18667 1.59451
+aline 2.13333 1.65984
+amove 2.29333 1.62147
+aline 2.24 1.6868
+amove 2.4 1.65288
+aline 2.34667 1.7182
+amove 2.50667 1.68873
+aline 2.45333 1.75406
+amove 2.61333 1.72904
+aline 2.56 1.79437
+amove 2.71333 1.7738
+aline 2.66667 1.83912
+amove 2.82 1.823
+aline 2.76667 1.88833
+amove 2.92667 1.87666
+aline 2.87333 1.94199
+amove 3.03333 1.93476
+aline 2.98 2.00009
+amove 3.14 1.99732
+aline 3.08667 2.06265
+amove 3.24667 2.06432
+aline 3.19333 2.12965
+amove 1.07333 1.63501
+aline 1.18 1.61747
+amove 1.18 1.61747
+aline 1.28667 1.60438
+amove 1.28667 1.60438
+aline 1.39333 1.59574
+amove 1.39333 1.59574
+aline 1.5 1.59154
+amove 1.5 1.59154
+aline 1.60667 1.5918
+amove 1.60667 1.5918
+aline 1.71333 1.59651
+amove 1.71333 1.59651
+aline 1.82 1.60567
+amove 1.82 1.60567
+aline 1.92 1.61928
+amove 1.92 1.61928
+aline 2.02667 1.63733
+amove 2.02667 1.63733
+aline 2.13333 1.65984
+amove 2.13333 1.65984
+aline 2.24 1.6868
+amove 2.24 1.6868
+aline 2.34667 1.7182
+amove 2.34667 1.7182
+aline 2.45333 1.75406
+amove 2.45333 1.75406
+aline 2.56 1.79437
+amove 2.56 1.79437
+aline 2.66667 1.83912
+amove 2.66667 1.83912
+aline 2.76 1.88505
+amove 2.76667 1.88833
+aline 2.87333 1.94199
+amove 2.87333 1.94199
+aline 2.98 2.00009
+amove 2.98 2.00009
+aline 3.08667 2.06265
+amove 3.08667 2.06265
+aline 3.19333 2.12965
+amove 1.07333 1.63501
+aline 1.02667 1.70479
+amove 1.18 1.61747
+aline 1.12667 1.68725
+amove 1.28667 1.60438
+aline 1.23333 1.67415
+amove 1.39333 1.59574
+aline 1.34 1.66551
+amove 1.5 1.59154
+aline 1.44667 1.66132
+amove 1.60667 1.5918
+aline 1.55333 1.66158
+amove 1.71333 1.59651
+aline 1.66 1.66629
+amove 1.82 1.60567
+aline 1.76667 1.67545
+amove 1.92 1.61928
+aline 1.87333 1.68905
+amove 2.02667 1.63733
+aline 1.97333 1.70711
+amove 2.13333 1.65984
+aline 2.08 1.72962
+amove 2.24 1.6868
+aline 2.18667 1.75658
+amove 2.34667 1.7182
+aline 2.29333 1.78798
+amove 2.45333 1.75406
+aline 2.4 1.82384
+amove 2.56 1.79437
+aline 2.50667 1.86415
+amove 2.66667 1.83912
+aline 2.61333 1.9089
+amove 2.76667 1.88833
+aline 2.72 1.95811
+amove 2.87333 1.94199
+aline 2.82667 2.01177
+amove 2.98 2.00009
+aline 2.92667 2.06987
+amove 3.08667 2.06265
+aline 3.03333 2.13243
+amove 3.19333 2.12965
+aline 3.14 2.19943
+amove 1.02667 1.70479
+aline 1.12667 1.68725
+amove 1.12667 1.68725
+aline 1.23333 1.67415
+amove 1.23333 1.67415
+aline 1.34 1.66551
+amove 1.34 1.66551
+aline 1.44667 1.66132
+amove 1.44667 1.66132
+aline 1.55333 1.66158
+amove 1.55333 1.66158
+aline 1.66 1.66629
+amove 1.66 1.66629
+aline 1.76667 1.67545
+amove 1.76667 1.67545
+aline 1.87333 1.68905
+amove 1.87333 1.68905
+aline 1.96667 1.70591
+amove 1.97333 1.70711
+aline 2.08 1.72962
+amove 2.08 1.72962
+aline 2.18667 1.75658
+amove 2.18667 1.75658
+aline 2.29333 1.78798
+amove 2.29333 1.78798
+aline 2.4 1.82384
+amove 2.4 1.82384
+aline 2.50667 1.86415
+amove 2.50667 1.86415
+aline 2.61333 1.9089
+amove 2.61333 1.9089
+aline 2.72 1.95811
+amove 2.72 1.95811
+aline 2.82667 2.01177
+amove 2.82667 2.01177
+aline 2.92 2.066
+amove 2.92667 2.06987
+aline 3.03333 2.13243
+amove 3.03333 2.13243
+aline 3.14 2.19943
+amove 1.02667 1.70479
+aline 0.973333 1.77902
+amove 1.12667 1.68725
+aline 1.08 1.76147
+amove 1.23333 1.67415
+aline 1.18 1.74838
+amove 1.34 1.66551
+aline 1.28667 1.73974
+amove 1.44667 1.66132
+aline 1.39333 1.73555
+amove 1.55333 1.66158
+aline 1.5 1.73581
+amove 1.66 1.66629
+aline 1.60667 1.74052
+amove 1.76667 1.67545
+aline 1.71333 1.74968
+amove 1.87333 1.68905
+aline 1.82 1.76328
+amove 1.97333 1.70711
+aline 1.92667 1.78134
+amove 2.08 1.72962
+aline 2.03333 1.80385
+amove 2.18667 1.75658
+aline 2.13333 1.8308
+amove 2.29333 1.78798
+aline 2.24 1.86221
+amove 2.4 1.82384
+aline 2.34667 1.89807
+amove 2.50667 1.86415
+aline 2.45333 1.93838
+amove 2.61333 1.9089
+aline 2.56 1.98313
+amove 2.72 1.95811
+aline 2.66667 2.03234
+amove 2.82667 2.01177
+aline 2.77333 2.08599
+amove 2.92667 2.06987
+aline 2.88 2.1441
+amove 3.03333 2.13243
+aline 2.98 2.20666
+amove 3.14 2.19943
+aline 3.08667 2.27366
+amove 0.973333 1.77902
+aline 1.08 1.76147
+amove 1.08 1.76147
+aline 1.17333 1.74926
+amove 1.18 1.74838
+aline 1.28667 1.73974
+amove 1.28667 1.73974
+aline 1.39333 1.73555
+amove 1.39333 1.73555
+aline 1.5 1.73581
+amove 1.5 1.73581
+aline 1.60667 1.74052
+amove 1.60667 1.74052
+aline 1.71333 1.74968
+amove 1.71333 1.74968
+aline 1.82 1.76328
+amove 1.82 1.76328
+aline 1.92667 1.78134
+amove 1.92667 1.78134
+aline 2.03333 1.80385
+amove 2.03333 1.80385
+aline 2.12667 1.82901
+amove 2.13333 1.8308
+aline 2.24 1.86221
+amove 2.24 1.86221
+aline 2.34667 1.89807
+amove 2.34667 1.89807
+aline 2.45333 1.93838
+amove 2.45333 1.93838
+aline 2.56 1.98313
+amove 2.56 1.98313
+aline 2.66667 2.03234
+amove 2.66667 2.03234
+aline 2.77333 2.08599
+amove 2.77333 2.08599
+aline 2.88 2.1441
+amove 2.88 2.1441
+aline 2.98 2.20666
+amove 2.98 2.20666
+aline 3.08667 2.27366
+amove 0.973333 1.77902
+aline 0.92 1.85769
+amove 1.08 1.76147
+aline 1.02667 1.84015
+amove 1.18 1.74838
+aline 1.13333 1.82706
+amove 1.28667 1.73974
+aline 1.24 1.81842
+amove 1.39333 1.73555
+aline 1.34 1.81423
+amove 1.5 1.73581
+aline 1.44667 1.81449
+amove 1.60667 1.74052
+aline 1.55333 1.8192
+amove 1.71333 1.74968
+aline 1.66 1.82835
+amove 1.82 1.76328
+aline 1.76667 1.84196
+amove 1.92667 1.78134
+aline 1.87333 1.86002
+amove 2.03333 1.80385
+aline 1.98 1.88253
+amove 2.13333 1.8308
+aline 2.08667 1.90948
+amove 2.24 1.86221
+aline 2.18667 1.94089
+amove 2.34667 1.89807
+aline 2.29333 1.97675
+amove 2.45333 1.93838
+aline 2.4 2.01705
+amove 2.56 1.98313
+aline 2.50667 2.06181
+amove 2.66667 2.03234
+aline 2.61333 2.11102
+amove 2.77333 2.08599
+aline 2.72 2.16467
+amove 2.88 2.1441
+aline 2.82667 2.22278
+amove 2.98 2.20666
+aline 2.93333 2.28533
+amove 3.08667 2.27366
+aline 3.04 2.35234
+amove 0.92 1.85769
+aline 1.02667 1.84015
+amove 1.02667 1.84015
+aline 1.13333 1.82706
+amove 1.13333 1.82706
+aline 1.24 1.81842
+amove 1.24 1.81842
+aline 1.34 1.81423
+amove 1.34 1.81423
+aline 1.44667 1.81449
+amove 1.44667 1.81449
+aline 1.55333 1.8192
+amove 1.55333 1.8192
+aline 1.66 1.82835
+amove 1.66 1.82835
+aline 1.76667 1.84196
+amove 1.76667 1.84196
+aline 1.87333 1.86002
+amove 1.87333 1.86002
+aline 1.98 1.88253
+amove 1.98 1.88253
+aline 2.08667 1.90948
+amove 2.08667 1.90948
+aline 2.18 1.9388
+amove 2.18667 1.94089
+aline 2.29333 1.97675
+amove 2.29333 1.97675
+aline 2.4 2.01705
+amove 2.4 2.01705
+aline 2.50667 2.06181
+amove 2.50667 2.06181
+aline 2.61333 2.11102
+amove 2.61333 2.11102
+aline 2.72 2.16467
+amove 2.72 2.16467
+aline 2.82667 2.22278
+amove 2.82667 2.22278
+aline 2.93333 2.28533
+amove 2.93333 2.28533
+aline 3.04 2.35234
+amove 0.92 1.85769
+aline 0.866667 1.94082
+amove 1.02667 1.84015
+aline 0.973333 1.92328
+amove 1.13333 1.82706
+aline 1.08 1.91019
+amove 1.24 1.81842
+aline 1.18667 1.90155
+amove 1.34 1.81423
+aline 1.29333 1.89736
+amove 1.44667 1.81449
+aline 1.39333 1.89762
+amove 1.55333 1.8192
+aline 1.5 1.90232
+amove 1.66 1.82835
+aline 1.60667 1.91148
+amove 1.76667 1.84196
+aline 1.71333 1.92509
+amove 1.87333 1.86002
+aline 1.82 1.94315
+amove 1.98 1.88253
+aline 1.92667 1.96565
+amove 2.08667 1.90948
+aline 2.03333 1.99261
+amove 2.18667 1.94089
+aline 2.14 2.02402
+amove 2.29333 1.97675
+aline 2.24667 2.05988
+amove 2.4 2.01705
+aline 2.34667 2.10018
+amove 2.50667 2.06181
+aline 2.45333 2.14494
+amove 2.61333 2.11102
+aline 2.56 2.19414
+amove 2.72 2.16467
+aline 2.66667 2.2478
+amove 2.82667 2.22278
+aline 2.77333 2.30591
+amove 2.93333 2.28533
+aline 2.88 2.36846
+amove 3.04 2.35234
+aline 2.98667 2.43547
+amove 0.866667 1.94082
+aline 0.973333 1.92328
+amove 0.973333 1.92328
+aline 1.08 1.91019
+amove 1.08 1.91019
+aline 1.18667 1.90155
+amove 1.18667 1.90155
+aline 1.29333 1.89736
+amove 1.29333 1.89736
+aline 1.38667 1.8976
+amove 1.39333 1.89762
+aline 1.5 1.90232
+amove 1.5 1.90232
+aline 1.60667 1.91148
+amove 1.60667 1.91148
+aline 1.71333 1.92509
+amove 1.71333 1.92509
+aline 1.82 1.94315
+amove 1.82 1.94315
+aline 1.92667 1.96565
+amove 1.92667 1.96565
+aline 2.03333 1.99261
+amove 2.03333 1.99261
+aline 2.14 2.02402
+amove 2.14 2.02402
+aline 2.24667 2.05988
+amove 2.24667 2.05988
+aline 2.34 2.09749
+amove 2.34667 2.10018
+aline 2.45333 2.14494
+amove 2.45333 2.14494
+aline 2.56 2.19414
+amove 2.56 2.19414
+aline 2.66667 2.2478
+amove 2.66667 2.2478
+aline 2.77333 2.30591
+amove 2.77333 2.30591
+aline 2.88 2.36846
+amove 2.88 2.36846
+aline 2.98667 2.43547
+amove 0.866667 1.94082
+aline 0.813333 2.0284
+amove 0.973333 1.92328
+aline 0.92 2.01086
+amove 1.08 1.91019
+aline 1.02667 1.99777
+amove 1.18667 1.90155
+aline 1.13333 1.98913
+amove 1.29333 1.89736
+aline 1.24 1.98493
+amove 1.39333 1.89762
+aline 1.34667 1.98519
+amove 1.5 1.90232
+aline 1.45333 1.9899
+amove 1.60667 1.91148
+aline 1.55333 1.99906
+amove 1.71333 1.92509
+aline 1.66 2.01267
+amove 1.82 1.94315
+aline 1.76667 2.03072
+amove 1.92667 1.96565
+aline 1.87333 2.05323
+amove 2.03333 1.99261
+aline 1.98 2.08019
+amove 2.14 2.02402
+aline 2.08667 2.1116
+amove 2.24667 2.05988
+aline 2.19333 2.14745
+amove 2.34667 2.10018
+aline 2.3 2.18776
+amove 2.45333 2.14494
+aline 2.4 2.23252
+amove 2.56 2.19414
+aline 2.50667 2.28172
+amove 2.66667 2.2478
+aline 2.61333 2.33538
+amove 2.77333 2.30591
+aline 2.72 2.39348
+amove 2.88 2.36846
+aline 2.82667 2.45604
+amove 2.98667 2.43547
+aline 2.93333 2.52305
+amove 0.813333 2.0284
+aline 0.92 2.01086
+amove 0.92 2.01086
+aline 1.02667 1.99777
+amove 1.02667 1.99777
+aline 1.13333 1.98913
+amove 1.13333 1.98913
+aline 1.24 1.98493
+amove 1.24 1.98493
+aline 1.34667 1.98519
+amove 1.34667 1.98519
+aline 1.45333 1.9899
+amove 1.45333 1.9899
+aline 1.54667 1.99845
+amove 1.55333 1.99906
+aline 1.66 2.01267
+amove 1.66 2.01267
+aline 1.76667 2.03072
+amove 1.76667 2.03072
+aline 1.87333 2.05323
+amove 1.87333 2.05323
+aline 1.98 2.08019
+amove 1.98 2.08019
+aline 2.08667 2.1116
+amove 2.08667 2.1116
+aline 2.19333 2.14745
+amove 2.19333 2.14745
+aline 2.3 2.18776
+amove 2.3 2.18776
+aline 2.39333 2.22953
+amove 2.4 2.23252
+aline 2.50667 2.28172
+amove 2.50667 2.28172
+aline 2.61333 2.33538
+amove 2.61333 2.33538
+aline 2.72 2.39348
+amove 2.72 2.39348
+aline 2.82667 2.45604
+amove 2.82667 2.45604
+aline 2.93333 2.52305
+set color BLACK
+set lstyle 1
+set color BLACK
+set lstyle 1
+amove 4.5 1.10828
+aline 3.79333 1.41706
+amove 1.27333 1.41339
+aline 0.813333 1.30531
+amove 0.813333 2.0284
+aline 0.813333 1.30531
+amove 0.813333 2.0284
+aline 2.93333 2.52305
+amove 0.813333 2.0284
+aline 0.82 2.01745
+amove 2.93333 2.52305
+aline 4.5 1.83138
+amove 4.5 1.83138
+aline 4.5 1.83138
+amove 4.5 1.83138
+aline 4.5 1.10828
+amove 0.818182 1.30531
+aline 2.38207 0.613636
+amove 2.38207 0.613636
+aline 4.5 1.10828
+set just BC
+set color BLACK
+set hei 0.0833333
+set just TC
+amove 0.818182 1.30531
+aline 0.816159 1.30073
+amove 0.775711 1.20928
+rotate -23.8587
+text 0
+rotate 23.8587
+amove 1.07883 1.19003
+aline 1.07681 1.18545
+amove 1.03636 1.094
+rotate -23.8587
+text 5
+rotate 23.8587
+amove 1.33948 1.07475
+aline 1.33745 1.07018
+amove 1.29701 0.978722
+rotate -23.8587
+text 10
+rotate 23.8587
+amove 1.60012 0.959471
+aline 1.5981 0.954898
+amove 1.55765 0.863444
+rotate -23.8587
+text 15
+rotate 23.8587
+amove 1.86077 0.844193
+aline 1.85875 0.83962
+amove 1.8183 0.748165
+rotate -23.8587
+text 20
+rotate 23.8587
+amove 2.12142 0.728914
+aline 2.1194 0.724342
+amove 2.07895 0.632887
+rotate -23.8587
+text 25
+rotate 23.8587
+amove 2.38207 0.613636
+aline 2.38005 0.609064
+amove 2.3396 0.517609
+rotate -23.8587
+text 30
+rotate 23.8587
+set just TC
+set color BLACK
+set hei 0.0833333
+set just TC
+amove 2.38207 0.613636
+aline 2.3832 0.608767
+amove 2.40595 0.511388
+rotate 13.1459
+text 0
+rotate -13.1459
+amove 2.59386 0.663101
+aline 2.595 0.658232
+amove 2.61774 0.560852
+rotate 13.1459
+text 2
+rotate -13.1459
+amove 2.80565 0.712565
+aline 2.80679 0.707696
+amove 2.82953 0.610317
+rotate 13.1459
+text 4
+rotate -13.1459
+amove 3.01745 0.76203
+aline 3.01858 0.757161
+amove 3.04133 0.659782
+rotate 13.1459
+text 6
+rotate -13.1459
+amove 3.22924 0.811494
+aline 3.23038 0.806625
+amove 3.25312 0.709246
+rotate 13.1459
+text 8
+rotate -13.1459
+amove 3.44103 0.860959
+aline 3.44217 0.85609
+amove 3.46491 0.758711
+rotate 13.1459
+text 10
+rotate -13.1459
+amove 3.65283 0.910424
+aline 3.65396 0.905555
+amove 3.67671 0.808175
+rotate 13.1459
+text 12
+rotate -13.1459
+amove 3.86462 0.959888
+aline 3.86576 0.955019
+amove 3.8885 0.85764
+rotate 13.1459
+text 14
+rotate -13.1459
+amove 4.07641 1.00935
+aline 4.07755 1.00448
+amove 4.10029 0.907104
+rotate 13.1459
+text 16
+rotate -13.1459
+amove 4.28821 1.05882
+aline 4.28934 1.05395
+amove 4.31209 0.956569
+rotate 13.1459
+text 18
+rotate -13.1459
+amove 4.5 1.10828
+aline 4.50114 1.10341
+amove 4.52388 1.00603
+rotate 13.1459
+text 20
+rotate -13.1459
+set just TC
+set color BLACK
+set hei 0.0833333
+set just RC
+amove 0.818182 1.30531
+aline 0.813182 1.30531
+amove 0.713182 1.30531
+text 0
+amove 0.818182 1.41655
+aline 0.813182 1.41655
+amove 0.713182 1.41655
+text 50
+amove 0.818182 1.5278
+aline 0.813182 1.5278
+amove 0.713182 1.5278
+text 100
+amove 0.818182 1.63904
+aline 0.813182 1.63904
+amove 0.713182 1.63904
+text 150
+amove 0.818182 1.75029
+aline 0.813182 1.75029
+amove 0.713182 1.75029
+text 200
+amove 0.818182 1.86153
+aline 0.813182 1.86153
+amove 0.713182 1.86153
+text 250
+amove 0.818182 1.97278
+aline 0.813182 1.97278
+amove 0.713182 1.97278
+text 300
+set just BC
+set color BLACK
+set lstyle 1
+set color BLACK
+set lstyle 1
+set color BLACK
+set lstyle 1
+amove 0.813333 1.30531
+aline 1.28 1.40689
+amove 0.866667 1.28225
+aline 1.30667 1.38002
+amove 0.92 1.25919
+aline 1.33333 1.35286
+amove 0.973333 1.23614
+aline 1.36667 1.32594
+amove 1.02667 1.21308
+aline 1.4 1.30013
+amove 1.07333 1.19003
+aline 1.44 1.27115
+amove 1.12667 1.16697
+aline 1.48 1.24552
+amove 1.18 1.14392
+aline 1.52 1.22211
+amove 1.23333 1.12086
+aline 1.56667 1.19776
+amove 1.28667 1.0978
+aline 1.62 1.17303
+amove 1.33333 1.07475
+aline 1.67333 1.15294
+amove 1.38667 1.05169
+aline 1.74667 1.13431
+amove 1.44 1.02864
+aline 1.83333 1.11966
+amove 1.49333 1.00558
+aline 1.92667 1.10616
+amove 1.54667 0.982527
+aline 2.02667 1.09413
+amove 1.6 0.959471
+aline 2.14 1.08493
+amove 1.64667 0.936415
+aline 2.26667 1.07936
+amove 1.7 0.91336
+aline 2.42 1.07999
+amove 3.72667 1.38689
+aline 3.82 1.408
+amove 1.75333 0.890304
+aline 2.61333 1.09095
+amove 3.52 1.30303
+aline 3.87333 1.38495
+amove 1.80667 0.867248
+aline 3.92 1.36189
+amove 1.86 0.844193
+aline 3.97333 1.33884
+amove 1.90667 0.821137
+aline 4.02667 1.31578
+amove 1.96 0.798081
+aline 4.08 1.29273
+amove 2.01333 0.775026
+aline 4.13333 1.26967
+amove 2.06667 0.75197
+aline 4.18667 1.24662
+amove 2.12 0.728914
+aline 4.23333 1.22356
+amove 2.17333 0.705859
+aline 4.28667 1.2005
+amove 2.22 0.682803
+aline 4.34 1.17745
+amove 2.27333 0.659748
+aline 4.39333 1.15439
+amove 2.32667 0.636692
+aline 4.44667 1.13134
+amove 2.38 0.613636
+aline 4.5 1.10828
+amove 0.813333 1.30531
+aline 2.38 0.613636
+amove 0.92 1.33004
+aline 2.48667 0.638369
+amove 1.02667 1.35477
+aline 2.59333 0.663101
+amove 1.13333 1.3795
+aline 2.69333 0.687833
+amove 1.24 1.40423
+aline 1.32 1.36644
+amove 1.90667 1.10873
+aline 2.8 0.712565
+amove 2.12 1.08606
+aline 2.90667 0.737298
+amove 2.3 1.07889
+aline 3.01333 0.76203
+amove 2.45333 1.08111
+aline 3.12 0.786762
+amove 2.6 1.0898
+aline 3.22667 0.811494
+amove 2.73333 1.10459
+aline 3.33333 0.836227
+amove 2.85333 1.12176
+aline 3.44 0.860959
+amove 2.96667 1.14224
+aline 3.54667 0.885691
+amove 3.07333 1.16474
+aline 3.64667 0.910424
+amove 3.18 1.1917
+aline 3.75333 0.935156
+amove 3.28 1.22021
+aline 3.86 0.959888
+amove 3.37333 1.24983
+aline 3.96667 0.98462
+amove 3.46 1.28094
+aline 4.07333 1.00935
+amove 3.55333 1.31562
+aline 4.18 1.03408
+amove 3.63333 1.34724
+aline 4.28667 1.05882
+amove 3.72 1.38393
+aline 4.39333 1.08355
+amove 3.8 1.42013
+aline 4.5 1.10828
diff --git a/gle-refman/utilities/fig/surf/surf5b.sur b/gle-refman/utilities/fig/surf/surf5b.sur
new file mode 100644
index 0000000..3e11169
--- /dev/null
+++ b/gle-refman/utilities/fig/surf/surf5b.sur
@@ -0,0 +1,46 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+begin surface
+ size 5 5
+ data jack.z
+ underneath on color green
+ !zaxis min -2 max 2
+ cube zlen 5
+ base xstep 1 ystep 1 ! color red
+end surface
diff --git a/gle-refman/utilities/fig/surf1.gle b/gle-refman/utilities/fig/surf1.gle
new file mode 100644
index 0000000..618d760
--- /dev/null
+++ b/gle-refman/utilities/fig/surf1.gle
@@ -0,0 +1,55 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 7 5
+
+set font psh
+
+begin origin
+box 5 5
+begin surface
+ size 5 5
+ xtitle "X-axis" hei 0.2
+ ytitle "Y-axis" hei 0.2
+ data "surf/surf1.z"
+ xaxis hei 0.2 dticks 1
+ yaxis hei 0.2 dticks 1 nofirst
+ zaxis hei 0.2 dticks 0.2
+ harray 5000
+end surface
+end origin
diff --git a/gle-refman/utilities/fig/surf2.gle b/gle-refman/utilities/fig/surf2.gle
new file mode 100644
index 0000000..16b3eeb
--- /dev/null
+++ b/gle-refman/utilities/fig/surf2.gle
@@ -0,0 +1,57 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 7 5 ! Run SURFACE to create SURF2.BIG
+
+begin origin
+box 5 5
+begin surface
+ size 5 5
+ zaxis min -1 max 3
+ base xstep 0.5 ystep 0.5
+ back ystep 1 zstep 1
+ right xstep 0.5 zstep 0.5 lstyle 2
+ xtitle "X-axis" hei 0.2
+ ytitle "Y-axis" hei 0.2
+ data "surf/surf1.z"
+ xaxis hei 0.2 dticks 1
+ yaxis hei 0.2 dticks 1 nofirst
+ zaxis hei 0.2 dticks 0.5
+ harray 5000
+end surface
+end origin
diff --git a/gle-refman/utilities/fig/surf3.gle b/gle-refman/utilities/fig/surf3.gle
new file mode 100644
index 0000000..fdd962f
--- /dev/null
+++ b/gle-refman/utilities/fig/surf3.gle
@@ -0,0 +1,64 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 7 5
+
+set font psh
+
+box 5 5
+amove -0.75 -0.75
+begin origin
+begin surface
+ size 8 8
+ data "surf/surf1.z"
+ zaxis min -1 max 3
+ xtitle "X-axis" hei 0.25 dist 0.5
+ ytitle "Y-axis" hei 0.25 dist 0.5
+ ztitle "Z-axis" hei 0.25 dist 0.6
+ points "surf/surf3.dat"
+ riselines lstyle 2 color red
+ marker fcircle
+ skirt on
+ rotate 60 35 0
+ view 2.5 3 0.6
+ xaxis hei 0.2 dticks 1
+ yaxis hei 0.2 dticks 1
+ zaxis hei 0.2
+ harray 5000
+end surface
+end origin
diff --git a/gle-refman/utilities/fig/surf4.gle b/gle-refman/utilities/fig/surf4.gle
new file mode 100644
index 0000000..e6ad3a7
--- /dev/null
+++ b/gle-refman/utilities/fig/surf4.gle
@@ -0,0 +1,68 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 7 5
+
+set font psh
+
+amove 2.5 -0.25
+begin origin
+amove -1 4
+set just right hei .25
+begin box add .1 name start
+text View point
+end box
+amove 0 5
+begin box add .0 name end nobox
+marker fcircle .5
+end box
+join start -> end
+set just left
+amove 0 0
+begin surface
+ size 5 5
+ data "surf/surf1.z"
+ zaxis min -1
+ rotate 85 85 0
+ view 0 5 0.7
+ xaxis hei 0.2 dticks 1 nofirst
+ yaxis hei 0.2 dticks 1
+ zaxis hei 0.2 dticks 1
+ harray 5000
+end surface
+end origin
diff --git a/gle-refman/utilities/fig/surf5.gle b/gle-refman/utilities/fig/surf5.gle
new file mode 100644
index 0000000..7e2b5cc
--- /dev/null
+++ b/gle-refman/utilities/fig/surf5.gle
@@ -0,0 +1,56 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 7 5
+
+set font psh
+
+amove -0.25 -0.45
+begin origin
+ begin surface
+ size 7 7
+ data "jack/jack.z"
+ cube zlen 13
+ top color orange
+ underneath color red
+ xaxis hei 0.2
+ yaxis hei 0.2 nofirst
+ zaxis hei 0.2
+ harray 5000
+ end surface
+end origin
diff --git a/gle-refman/utilities/fig/surf5b.gle b/gle-refman/utilities/fig/surf5b.gle
new file mode 100644
index 0000000..d962893
--- /dev/null
+++ b/gle-refman/utilities/fig/surf5b.gle
@@ -0,0 +1,40 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 24 18
+include surf/surf5b.big
diff --git a/gle-refman/utilities/fig/volcano.gle b/gle-refman/utilities/fig/volcano.gle
new file mode 100644
index 0000000..8493a4a
--- /dev/null
+++ b/gle-refman/utilities/fig/volcano.gle
@@ -0,0 +1,57 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 7 6
+
+set font psh
+include "../../script/manual.gle"
+
+begin contour
+ data "volcano.z"
+ values from 130 to 190 step 10
+end contour
+
+manual_graph_mode
+begin graph
+ title "Auckland's Maunga Whau Volcano"
+ data "volcano-cdata.dat"
+ xaxis min 0 max 20
+ yaxis min 0 max 20
+ d1 line color black
+ colormap "volcano.z" 100 100
+end graph
diff --git a/gle-refman/utilities/fig/volcano.z b/gle-refman/utilities/fig/volcano.z
new file mode 100644
index 0000000..af5dd76
--- /dev/null
+++ b/gle-refman/utilities/fig/volcano.z
@@ -0,0 +1,125 @@
+! nx 87 ny 61 xmin 0 xmax 20 ymin 0 ymax 20
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+100 101 102 103 104 105 105 106 107 108 109 110 110 111 114 116 118 120 120 121 122 122 123 124 123 123 120 118 117 115 114 115 113 111 110 109 108 108 107 107 107 108 109 110 111 111 112 113 113 114 115 115 114 113 112 111 111 112 112 112 113
+114 114 115 115 116 116 117 117 116 114 112 109 106 104 102 101 100 100 99 99 99 99 98 98 97 97 100 101 102 103 104 105 106 107 108 109 110 110 111 113 115 118 120 121 122 124 125 125 126 127 128 127 124 121 120 118 116 114 113 112 112
+110 109 109 108 108 108 109 110 111 112 112 113 114 114 115 116 116 115 114 113 112 112 113 113 114 114 115 115 116 116 117 117 118 118 117 115 113 111 107 105 103 102 101 101 100 100 100 99 99 98 98 97 101 102 103 104 105 105 106 107 108
+109 110 111 113 115 117 118 120 122 125 126 127 128 129 130 131 131 128 125 121 120 118 116 114 113 113 111 111 111 111 110 109 110 111 112 113 113 114 115 115 116 117 117 116 115 114 114 113 113 114 114 115 115 116 116 117 118 118 119 119 118
+116 114 112 108 105 103 103 102 101 101 100 100 99 99 98 98 97 101 102 103 104 105 106 107 108 109 110 111 113 115 117 117 118 121 123 126 128 130 130 131 132 133 134 131 129 125 122 120 118 116 114 113 112 112 113 112 112 111 112 113 113
+114 115 116 116 117 117 118 118 116 116 115 115 115 114 114 115 116 116 117 117 118 118 119 119 120 120 117 115 112 108 106 104 103 102 102 102 101 100 99 99 99 98 98 101 102 103 104 105 106 107 108 109 110 111 112 114 116 117 120 122 124
+126 129 130 132 133 135 136 136 134 132 129 126 122 120 118 116 114 114 114 114 114 113 113 114 115 116 116 117 117 117 118 118 119 119 118 117 116 116 115 115 116 116 116 117 117 118 118 119 120 120 120 120 119 116 113 109 106 104 104 103 102
+102 101 101 100 99 99 99 98 101 102 103 104 105 106 107 108 109 110 111 111 113 115 118 121 123 125 127 129 131 133 135 137 138 138 137 134 132 130 127 122 120 118 116 116 116 116 115 113 114 115 116 117 117 118 118 119 119 119 120 120 119
+118 117 117 116 116 117 117 117 118 119 119 119 120 121 121 121 121 119 116 113 110 107 105 105 103 103 103 102 101 100 100 99 99 99 101 102 103 104 105 106 107 108 109 110 111 113 114 116 119 121 124 126 128 130 133 135 137 138 140 140 139
+137 135 133 131 127 122 120 118 118 117 117 116 115 116 116 117 118 118 118 119 119 120 120 121 121 120 119 119 118 117 117 118 119 118 118 118 119 120 122 123 123 123 122 120 117 113 110 108 106 105 104 103 103 102 101 101 100 100 99 99 100
+101 102 103 104 105 106 107 108 109 110 112 114 117 119 122 124 127 129 131 134 136 138 140 142 142 142 140 138 136 133 129 125 122 120 119 118 118 117 116 117 117 118 119 119 120 120 120 121 121 121 122 121 120 120 120 119 119 120 120 120 120
+120 120 123 123 124 124 124 123 121 119 114 112 108 106 106 104 104 103 102 102 101 101 100 100 99 100 101 102 103 104 105 106 107 108 109 110 112 115 117 120 122 125 127 130 132 135 137 139 142 144 144 144 142 140 138 136 132 129 126 123 120
+120 119 119 118 119 119 120 120 120 121 122 122 123 123 123 123 122 123 122 122 121 122 122 122 123 123 123 124 125 125 126 126 125 124 122 120 116 113 109 107 106 105 104 104 103 102 102 101 101 100 100 100 101 102 103 103 104 105 106 107 108
+110 114 117 119 121 123 126 128 130 133 136 139 141 144 146 147 146 145 143 141 138 136 133 130 127 124 121 120 120 120 120 120 121 122 123 124 124 125 125 126 126 125 126 126 126 125 126 127 128 128 129 129 128 128 128 128 128 128 126 125 123
+122 119 114 109 108 107 106 105 104 103 103 102 102 101 100 100 101 102 103 103 104 104 105 106 108 110 112 116 119 121 124 125 127 130 132 135 137 140 143 147 149 149 149 147 145 143 141 139 136 133 131 128 125 122 121 122 122 122 123 125 125
+126 127 127 127 128 128 128 129 129 130 131 131 132 132 133 133 133 132 132 131 131 130 129 128 126 125 124 121 117 111 109 108 106 105 104 103 102 101 101 100 100 100 101 102 103 104 104 105 106 107 108 110 114 119 121 124 126 128 129 132 134
+137 140 143 147 149 151 151 151 149 147 145 143 141 138 136 134 131 128 126 124 125 125 126 126 127 128 128 129 129 130 130 131 131 132 132 133 134 135 135 136 136 137 137 136 136 135 134 133 131 129 128 127 126 123 119 115 111 109 107 105 104
+103 102 101 100 100 100 99 102 103 104 104 105 105 106 108 110 113 118 121 124 126 128 130 132 134 136 139 143 147 150 154 154 154 153 151 149 148 146 143 141 139 137 136 132 130 128 128 128 129 129 130 130 131 132 132 132 133 134 134 135 135
+136 137 138 139 139 140 140 140 139 139 138 137 137 135 132 130 129 127 124 120 116 112 109 106 105 103 102 101 101 100 99 99 99 102 103 104 104 105 106 107 108 111 116 121 124 126 128 131 134 135 137 139 143 147 152 156 157 157 157 156 155
+153 151 148 146 143 142 141 140 138 135 133 132 132 133 133 133 134 135 135 135 135 136 136 137 137 138 138 139 140 141 141 142 142 143 142 142 141 141 140 139 137 134 133 129 125 121 114 110 107 106 106 104 103 102 101 100 99 99 99 102 103
+104 105 105 106 108 110 113 118 123 127 129 132 137 141 142 142 145 150 154 157 161 161 160 160 160 159 157 154 151 148 146 145 143 142 142 139 137 136 137 137 138 138 139 139 139 139 139 139 139 139 140 140 141 142 142 143 144 144 144 145 145
+145 145 145 144 142 140 139 136 129 124 119 113 109 106 106 105 104 103 102 101 101 100 99 99 102 103 104 105 106 107 109 113 116 120 125 129 133 137 143 147 149 151 152 154 158 161 164 165 164 164 163 163 160 157 154 151 149 147 145 145 144
+143 141 140 141 141 141 141 141 142 142 142 142 142 142 142 143 143 143 144 144 145 146 146 146 147 148 148 148 148 145 143 142 140 134 128 123 117 112 108 106 105 105 104 104 103 102 101 100 100 99 103 104 105 106 107 109 111 115 118 122 127
+133 140 143 150 152 153 155 157 159 162 164 167 168 168 168 167 166 163 160 157 153 150 148 148 147 147 147 145 145 144 143 143 143 144 144 144 144 145 145 145 145 146 146 146 146 146 147 147 148 149 150 150 150 150 149 147 145 143 141 134 127
+123 117 111 108 105 105 104 104 103 103 102 101 100 100 100 104 105 106 107 108 110 113 117 120 125 129 138 145 151 156 156 157 158 160 164 166 168 170 171 172 171 171 169 166 163 160 156 153 151 150 150 149 149 149 148 146 146 146 146 146 146
+146 147 148 148 149 149 149 148 148 148 148 149 149 150 150 150 150 150 150 150 148 146 143 141 136 129 123 117 110 108 105 104 103 102 102 101 101 100 100 100 100 103 104 105 106 108 110 114 118 123 127 133 143 150 156 160 160 161 162 167 170
+171 172 173 175 175 174 174 173 171 168 164 160 156 155 154 153 153 152 152 150 149 148 148 148 148 148 149 149 150 152 152 152 152 151 150 150 150 150 150 150 150 150 150 150 150 150 149 147 144 141 138 132 125 118 111 108 105 103 102 101 101
+101 100 100 100 100 100 102 103 104 106 108 112 116 120 125 129 137 146 154 161 163 165 166 169 172 173 174 175 177 178 178 178 178 177 174 171 168 164 160 158 157 157 156 156 156 155 152 151 150 150 151 151 152 154 156 157 157 156 155 153 152
+152 151 150 150 150 150 150 150 150 150 150 150 147 144 141 138 133 127 120 113 109 106 103 101 101 101 100 100 100 100 100 100 101 102 104 106 109 113 118 122 127 133 141 149 155 161 165 168 170 172 175 176 177 179 181 181 181 180 180 179 177
+174 171 167 165 163 161 160 160 160 160 160 157 155 155 154 154 155 157 159 161 161 161 159 156 154 154 153 151 150 150 150 150 150 150 150 150 150 149 147 144 141 137 133 129 123 116 110 107 104 102 102 101 101 101 100 100 100 100 101 102 105
+107 110 115 120 124 129 136 143 149 155 162 168 170 174 176 178 179 181 182 184 184 183 181 180 180 179 177 174 172 170 168 166 165 164 164 164 164 162 160 159 159 158 160 162 164 166 166 163 159 157 156 155 153 151 150 150 150 150 150 150 150
+150 150 149 146 143 140 137 133 129 124 119 112 108 105 103 103 102 101 101 101 101 100 100 102 103 106 108 112 116 121 125 130 138 145 151 157 163 170 174 178 181 181 184 186 186 187 186 184 181 180 180 180 179 178 174 173 173 171 170 170 169
+168 167 166 164 163 162 161 164 167 169 170 168 164 160 158 157 155 153 151 150 150 150 150 150 150 150 150 150 147 144 141 138 135 133 128 125 122 116 109 107 104 104 103 102 101 101 101 101 101 103 105 107 110 114 118 122 127 132 140 146 153
+159 165 171 176 180 183 185 186 189 190 188 187 184 182 180 180 180 179 178 176 176 176 176 174 174 173 172 170 168 167 165 163 164 165 169 170 170 170 166 162 159 157 155 153 151 150 150 150 150 150 150 150 150 150 146 142 139 136 133 131 128
+125 122 117 110 108 106 105 104 103 103 101 101 101 101 104 106 108 111 115 119 123 128 134 141 148 154 161 166 172 179 182 184 186 189 190 190 190 187 185 183 180 180 180 179 179 177 176 177 178 178 178 177 176 174 171 168 166 164 166 168 170
+170 170 170 168 162 159 157 155 153 151 150 150 150 150 150 150 150 150 148 144 140 137 134 132 129 127 125 122 117 111 110 107 107 106 105 104 103 102 101 100 104 106 110 114 118 121 125 129 135 142 150 157 162 167 173 180 183 186 188 190 190
+190 189 184 183 181 180 179 179 176 177 176 176 177 178 179 180 180 179 177 173 169 167 166 167 169 170 170 170 170 167 161 159 157 155 153 151 150 150 150 150 150 150 149 147 145 141 138 135 133 130 127 125 123 121 118 113 111 110 110 109 109
+107 106 105 103 100 105 107 111 117 121 124 127 131 137 148 154 159 164 168 174 181 184 187 190 191 191 190 187 184 180 178 175 174 172 171 173 173 173 176 178 179 180 180 180 179 175 170 168 166 168 169 170 170 170 170 166 161 158 156 154 153
+151 150 150 150 150 148 147 146 145 143 139 135 133 131 129 126 124 121 120 118 114 111 111 111 110 110 109 107 106 104 100 107 109 113 118 122 126 129 134 139 150 156 160 165 170 175 181 184 188 191 192 192 189 185 181 177 173 171 169 168 167
+169 170 172 174 176 178 179 180 180 179 175 170 168 166 166 168 168 170 170 168 164 160 158 155 152 151 150 149 149 148 147 145 144 143 142 141 136 133 130 129 127 125 123 120 119 118 115 112 111 111 111 110 109 109 109 105 100 107 110 114 117
+121 126 130 135 142 151 159 163 167 171 177 182 185 189 192 193 191 187 183 179 174 169 167 166 164 164 165 166 169 171 174 178 179 180 180 178 173 169 166 165 165 166 165 168 169 166 163 159 157 154 152 149 148 147 146 145 143 142 141 140 139
+138 133 130 128 127 125 124 122 120 118 117 115 112 111 111 111 111 110 109 108 106 100 107 110 115 119 123 129 135 141 146 156 161 165 168 173 179 182 186 189 193 194 191 184 179 175 170 166 162 161 160 160 161 162 165 169 172 176 178 179 179
+176 172 168 165 163 163 163 163 165 166 164 161 158 155 152 150 147 146 144 143 142 141 139 139 138 137 135 131 128 127 125 124 122 121 119 118 116 115 113 112 111 111 110 110 109 109 105 100 108 110 114 120 128 134 140 146 152 158 162 166 169
+175 180 183 186 189 193 195 190 184 176 171 167 163 160 158 157 156 157 159 163 166 170 174 176 178 178 176 172 167 164 161 161 160 161 163 163 163 160 157 153 150 148 146 144 142 141 140 139 138 136 135 134 133 129 127 126 124 122 121 119 118
+117 116 114 113 112 111 110 110 109 109 107 104 100 108 110 115 121 131 137 142 147 152 159 163 167 170 177 182 184 187 189 192 194 189 183 174 169 165 161 158 156 154 153 154 157 160 164 167 171 172 174 174 173 171 168 161 159 158 158 159 161
+161 160 158 155 151 149 147 144 142 141 140 138 137 136 135 134 132 130 128 126 125 123 121 119 118 117 116 115 113 112 112 111 110 109 108 107 105 101 100 110 111 116 122 129 137 142 146 151 158 164 168 172 179 183 186 189 190 192 193 188 182
+174 168 164 161 157 154 151 149 151 154 158 161 167 170 170 170 170 169 168 166 160 157 156 156 157 158 159 159 156 153 150 148 146 144 141 140 140 138 136 135 134 133 131 129 127 125 123 122 120 118 117 116 115 114 112 111 110 108 107 106 105
+104 102 100 100 110 112 118 124 130 136 142 146 151 157 163 168 174 178 183 187 189 190 191 192 189 182 174 168 164 160 157 153 149 148 149 153 157 161 167 170 170 170 168 166 165 163 159 156 154 153 155 155 155 155 152 150 149 147 145 143 141
+140 139 138 136 134 133 131 130 128 126 124 122 120 119 117 116 115 114 113 111 110 107 106 105 105 102 101 100 100 100 110 113 119 125 131 136 141 145 150 158 164 168 172 177 183 187 189 191 192 191 190 183 174 168 164 160 157 153 150 149 150
+154 158 162 166 170 170 168 166 164 162 160 158 155 152 151 151 151 151 151 149 148 147 146 145 143 142 140 139 137 135 134 132 131 129 127 125 123 121 119 117 116 114 114 113 112 110 108 107 105 103 100 100 100 100 99 99 110 114 119 126 131
+135 140 144 149 158 164 168 172 176 183 184 189 190 191 191 190 183 174 169 165 161 158 154 150 151 152 155 159 164 168 168 168 167 165 163 160 158 155 153 150 148 148 148 148 148 147 146 146 145 143 142 141 140 139 138 136 134 132 131 128 126
+124 122 120 118 116 114 113 113 112 111 108 107 106 105 104 102 100 99 99 99 99 110 116 121 127 132 136 140 144 148 154 160 166 171 176 180 184 189 190 191 191 191 183 176 170 166 163 159 156 154 155 155 158 161 165 170 167 166 165 163 161
+158 155 152 150 146 145 145 145 146 146 144 145 145 144 142 141 140 140 140 140 138 136 134 131 128 125 123 121 119 117 115 113 112 111 111 110 108 106 105 102 100 100 99 99 99 98 98 110 115 121 127 132 136 140 144 148 151 157 162 169 174
+178 181 186 188 190 191 190 184 177 172 168 165 162 159 158 158 159 161 166 167 169 166 164 163 161 159 156 153 149 146 142 142 141 142 143 143 143 143 144 142 141 140 140 140 140 140 140 138 134 131 128 125 123 120 117 116 114 112 110 109 108
+107 106 105 102 101 100 99 99 99 98 98 97 110 114 120 126 131 136 140 143 146 149 154 159 166 171 177 180 182 186 190 190 190 185 179 174 171 168 166 163 164 163 166 169 170 170 168 164 162 161 158 155 153 150 147 143 139 139 139 139 140
+141 141 142 142 141 140 140 140 140 140 140 140 137 134 131 128 125 122 119 116 114 112 110 109 109 108 107 105 100 100 100 99 99 99 98 98 97 97 110 112 118 124 130 135 139 142 145 148 151 157 163 169 172 176 179 183 187 190 190 186 180
+177 175 173 170 169 169 170 171 172 170 170 167 163 160 157 154 152 149 147 144 140 137 137 136 137 138 138 139 140 141 140 140 140 140 140 140 140 140 138 134 131 128 124 121 118 115 112 110 109 108 107 106 105 100 100 100 99 99 99 98 98
+98 97 97 108 110 116 122 128 133 137 141 143 146 149 154 161 165 168 172 175 180 184 188 189 187 182 178 176 176 175 173 174 173 175 174 173 171 168 161 157 154 150 148 145 143 141 138 135 135 134 135 135 136 136 137 138 139 140 140 140 140
+140 140 140 139 135 130 126 123 120 117 114 111 109 108 107 106 105 100 100 100 99 99 98 98 98 98 97 97 96 108 110 114 120 126 129 134 139 142 144 146 152 158 161 164 168 171 175 181 184 186 186 183 179 178 178 177 175 178 177 177 176
+175 173 168 162 156 153 149 145 142 140 138 136 133 132 132 132 134 134 134 134 135 136 137 138 140 140 140 140 139 137 133 127 123 120 118 115 112 108 108 106 106 105 100 100 100 98 98 98 98 98 98 97 96 96 96 108 110 112 117 122 126
+129 135 139 141 144 149 153 156 160 165 168 171 177 181 184 185 182 180 180 179 178 178 180 179 179 178 176 173 168 163 157 152 148 143 139 137 135 133 131 130 130 131 132 132 132 131 132 132 133 134 136 137 137 137 136 134 131 124 121 118 116
+114 111 109 107 106 105 100 100 100 97 97 97 97 97 97 97 96 96 96 96 107 109 111 116 119 122 125 130 135 137 140 144 148 152 156 161 165 168 172 177 181 184 181 181 181 180 180 180 180 180 180 178 178 173 168 163 158 152 146 141 138
+136 134 132 130 129 128 128 130 130 130 129 128 129 129 130 132 133 133 134 134 132 128 122 119 116 114 112 108 106 105 105 100 100 100 97 97 97 97 97 97 97 96 96 96 96 95 107 108 110 113 115 118 121 126 131 134 137 140 143 148 152
+157 162 165 169 173 177 181 181 181 180 181 181 181 180 180 180 178 176 170 167 163 158 152 145 140 137 134 132 130 129 127 127 126 127 128 128 126 125 125 125 123 126 128 129 130 130 125 124 119 116 114 112 110 107 106 105 100 100 100 96 96
+96 96 96 96 96 96 96 96 96 95 95 108 109 110 111 114 116 118 122 127 130 133 136 140 144 148 153 157 161 165 169 173 177 180 180 180 180 181 180 180 180 179 178 173 168 165 161 156 149 143 139 136 133 130 129 128 126 126 125 125 125
+125 124 122 121 120 120 120 120 121 122 123 122 120 117 114 111 108 106 105 100 100 100 100 96 96 96 96 96 96 96 96 96 96 96 95 95 95 108 109 110 110 112 115 116 118 122 125 129 133 137 140 144 149 152 157 161 165 169 173 176 179
+179 180 180 180 178 178 176 175 171 165 163 160 153 148 143 139 135 132 129 128 127 125 124 124 123 123 122 122 120 118 117 118 115 117 118 118 119 117 116 115 112 109 107 105 100 100 100 100 97 96 96 96 96 96 96 96 96 96 96 95 95
+95 95 108 109 110 110 110 113 114 116 119 122 126 131 134 138 141 145 149 152 156 160 164 169 171 174 177 175 178 179 177 175 174 172 168 163 160 157 151 147 143 138 133 130 128 125 125 124 123 122 121 121 120 120 118 116 115 111 110 110 110
+110 113 114 113 112 110 107 105 102 100 100 100 98 97 96 96 96 96 96 96 96 96 96 96 95 95 95 94 108 109 109 110 110 111 112 114 117 120 124 128 131 135 138 142 145 149 152 155 158 163 166 167 170 173 175 175 175 173 171 169 164
+160 156 153 149 144 140 136 131 129 126 124 123 123 122 121 120 120 120 119 117 115 111 110 110 110 110 110 109 109 110 109 108 106 103 101 100 100 100 98 97 96 96 96 96 96 96 96 96 96 95 95 95 95 94 108 108 109 109 110 110 110
+112 115 118 121 125 128 131 134 138 141 145 147 149 152 157 160 161 163 166 169 170 170 171 168 162 158 155 152 148 144 140 136 132 129 127 124 122 121 120 120 120 120 120 119 117 115 113 110 110 110 110 109 108 108 107 107 106 105 104 102 100
+100 100 99 98 97 96 96 96 96 96 96 96 96 96 95 95 95 94 94 107 108 109 109 110 110 110 112 115 117 119 122 125 127 130 133 137 141 143 145 148 149 152 155 157 159 160 160 161 162 159 156 153 149 146 142 139 134 130 128 126 125
+122 120 120 120 119 119 119 118 117 115 113 111 110 110 109 108 107 106 106 105 104 104 103 102 100 100 100 99 99 98 97 96 96 96 96 96 96 96 96 95 95 95 95 94 94 107 108 109 109 110 110 110 113 115 117 118 119 120 123 126 129
+131 134 139 142 144 145 147 148 150 152 154 154 153 154 151 149 146 143 140 136 130 128 126 124 122 121 120 119 118 117 117 117 116 116 115 113 112 110 109 108 107 106 106 105 104 103 102 101 101 100 100 100 100 99 99 98 97 96 96 96 96
+96 96 96 96 95 95 95 94 94 94 107 108 108 109 109 110 111 112 114 115 116 117 118 119 121 125 125 127 131 136 140 141 142 144 144 145 148 149 148 147 146 144 140 138 136 130 127 125 123 121 119 118 117 117 116 116 116 115 114 113 113
+111 110 109 108 107 106 105 105 103 103 102 102 102 103 101 100 100 100 99 98 98 97 96 96 96 96 96 96 96 96 95 95 95 94 94 94 107 107 108 108 109 109 110 110 112 113 114 115 116 117 117 120 120 121 123 129 134 136 138 139 139
+139 140 142 142 141 141 140 137 134 131 127 124 122 120 118 117 115 113 114 113 114 114 113 112 111 110 110 109 108 107 106 105 105 105 104 104 104 103 103 103 101 100 100 99 99 98 97 96 96 96 96 96 96 96 96 96 95 95 94 94 94
+94 106 107 107 108 108 108 109 110 110 111 112 113 114 115 114 115 116 116 119 123 125 130 133 134 134 134 134 135 135 136 135 134 132 130 128 124 121 119 118 116 114 112 111 111 111 112 112 111 110 110 110 109 108 108 107 108 107 106 105 104
+104 104 103 103 103 102 101 100 99 99 98 97 96 96 96 96 96 96 96 96 95 95 95 94 94 94 94 106 106 107 107 107 108 109 109 110 110 111 111 112 113 112 111 111 112 115 118 118 119 126 128 128 127 128 128 129 130 129 128 127 125
+122 120 118 117 115 114 112 110 110 110 110 110 111 110 110 110 109 109 108 107 106 105 105 105 104 104 104 103 103 102 102 102 101 100 99 99 98 97 96 96 96 96 96 96 96 96 95 95 94 94 94 94 94 105 106 106 107 107 108 108 109
+109 110 110 110 110 111 110 110 110 110 111 114 115 116 121 121 121 121 121 122 123 124 124 123 121 119 118 117 115 114 112 111 110 110 110 110 110 110 109 109 108 109 107 107 106 106 105 105 104 104 104 104 103 103 102 102 102 101 100 100 99
+99 98 97 96 96 96 96 96 96 96 96 95 95 94 94 94 94 94 105 105 106 106 107 107 108 108 109 109 109 109 109 110 110 110 110 110 110 110 111 112 115 115 115 115 115 116 116 117 119 118 117 116 114 113 112 110 110 110 110 110 110
+109 109 108 107 106 106 106 106 106 105 105 105 104 104 104 103 103 103 102 102 102 101 100 100 99 99 98 97 97 96 96 96 96 96 96 96 96 95 95 94 94 94 94 94 104 105 105 106 106 107 107 108 108 108 108 108 108 108 108 108 108
+108 108 108 110 110 110 110 110 110 110 111 113 115 116 115 113 112 110 110 110 110 110 110 109 108 108 108 108 107 106 105 105 105 105 105 105 104 104 104 104 103 103 103 102 102 102 101 100 100 100 99 99 98 97 97 96 96 96 96 96 96
+96 96 95 95 94 94 94 94 94 104 104 105 105 106 106 107 107 107 107 107 107 107 106 106 106 106 106 106 108 108 108 106 106 108 109 110 110 112 112 113 112 111 110 110 110 110 109 109 109 108 107 107 107 107 106 106 105 104 104 104 104
+104 104 104 103 103 103 103 102 102 101 101 100 100 100 100 99 99 98 97 97 96 96 96 96 96 96 96 95 95 95 94 94 94 94 94 103 104 104 105 105 106 106 106 107 107 106 106 105 105 104 104 104 104 105 107 107 106 105 105 107 108
+109 110 110 110 110 110 110 109 109 109 109 109 109 108 107 107 107 107 106 106 105 104 104 104 104 104 104 104 103 103 103 103 102 102 101 101 100 100 100 100 100 99 98 97 97 96 96 96 96 96 96 96 95 95 95 94 94 94 94 94 94
diff --git a/gle-refman/utilities/fig/xyz.gle b/gle-refman/utilities/fig/xyz.gle
new file mode 100644
index 0000000..7448d81
--- /dev/null
+++ b/gle-refman/utilities/fig/xyz.gle
@@ -0,0 +1,62 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 12 13
+amove 0 5
+begin scale 10.9/24 8.2/18
+begin graph
+ size 24 18
+ nobox
+ xaxis min 0 max 6
+ yaxis min 0 max 10
+ data "xyz/xyz.dat"
+ d1 lstyle 1
+end graph
+save theorigin
+set hei .3 just cc
+include "xyz/xyz.lab"
+move theorigin
+set hei .3 just left
+include "xyz/xyz.key"
+end scale
+amove 6 0
+begin origin
+!box 6 6
+translate 0 -.6
+include "xyz/xyz.big"
+end origin
diff --git a/gle-refman/utilities/fig/xyz/xyz.big b/gle-refman/utilities/fig/xyz/xyz.big
new file mode 100644
index 0000000..efaa8ae
--- /dev/null
+++ b/gle-refman/utilities/fig/xyz/xyz.big
@@ -0,0 +1,413 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+amove 9 9
+set hei 0.3
+set color BLACK
+set lstyle 2
+amove 3.14667 1.60055
+aline 4.34 1.87851
+amove 4.34 1.87851
+aline 5.52667 2.15647
+amove 3.14667 1.60055
+aline 2.5 1.88743
+amove 4.34 1.87851
+aline 4.34 1.87851
+amove 5.52667 2.15647
+aline 5.52667 2.15647
+amove 2.5 1.88743
+aline 2.5 1.88743
+amove 2.5 1.88743
+aline 1.85333 2.17431
+amove 1.85333 2.17431
+aline 1.85333 2.17431
+amove 1.85333 2.17431
+aline 1.2 5.2475
+amove 1.2 5.2475
+aline 1.2 5.2475
+set color BLACK
+set lstyle 1
+amove 3.14667 1.60055
+aline 4.34 1.87851
+amove 4.34 1.87851
+aline 5.52667 2.15647
+amove 3.14667 1.60055
+aline 2.5 1.88743
+amove 4.34 1.87851
+aline 3.68667 3.55855
+amove 5.52667 2.15647
+aline 4.88 2.44335
+amove 2.5 1.88743
+aline 3.68 3.54915
+amove 3.68667 3.55855
+aline 4.87333 2.44959
+amove 2.5 1.88743
+aline 1.85333 2.17431
+amove 3.68667 3.55855
+aline 3.04 3.84543
+amove 4.88 2.44335
+aline 4.88 2.44335
+amove 1.85333 2.17431
+aline 3.03333 3.83602
+amove 3.04 3.84543
+aline 3.04 3.84543
+amove 1.85333 2.17431
+aline 1.2 5.2475
+amove 3.04 3.84543
+aline 3.04 3.84543
+amove 1.2 5.2475
+aline 2.33333 2.86526
+set color BLACK
+set lstyle 1
+set color BLACK
+set lstyle 1
+amove 5.52667 1.4599
+aline 4.49333 1.91443
+amove 2.22667 2.00869
+aline 1.2 1.76462
+amove 1.2 5.2475
+aline 1.2 5.94408
+amove 1.2 5.2475
+aline 1.2 1.76462
+amove 1.2 5.94408
+aline 3.58 6.5
+amove 3.58 3.60587
+aline 3.58 6.5
+amove 3.58 6.5
+aline 5.52667 5.63936
+amove 5.52667 2.15647
+aline 5.52667 5.63936
+amove 5.52667 2.15647
+aline 5.52667 1.4599
+amove 1.2053 1.76462
+aline 3.15124 0.903974
+amove 3.15124 0.903974
+aline 5.53155 1.4599
+set just BC
+set color BLACK
+set hei 0.116667
+set just TC
+amove 1.2053 1.76462
+aline 1.20247 1.75821
+amove 1.14584 1.63018
+rotate -23.8587
+text 0
+rotate 23.8587
+amove 1.52962 1.62118
+aline 1.52679 1.61477
+amove 1.47016 1.48674
+rotate -23.8587
+text 1
+rotate 23.8587
+amove 1.85394 1.47774
+aline 1.85111 1.47133
+amove 1.79449 1.3433
+rotate -23.8587
+text 2
+rotate 23.8587
+amove 2.17827 1.33429
+aline 2.17544 1.32789
+amove 2.11881 1.19986
+rotate -23.8587
+text 3
+rotate 23.8587
+amove 2.50259 1.19085
+aline 2.49976 1.18445
+amove 2.44313 1.05642
+rotate -23.8587
+text 4
+rotate 23.8587
+amove 2.82692 1.04741
+aline 2.82408 1.04101
+amove 2.76746 0.912976
+rotate -23.8587
+text 5
+rotate 23.8587
+amove 3.15124 0.903974
+aline 3.14841 0.897572
+amove 3.09178 0.769535
+rotate -23.8587
+text 6
+rotate 23.8587
+set just TC
+set color BLACK
+set hei 0.116667
+set just TC
+amove 3.15124 0.903974
+aline 3.15283 0.897157
+amove 3.18467 0.760826
+rotate 13.1458
+text 0
+rotate -13.1458
+amove 3.38927 0.959566
+aline 3.39086 0.95275
+amove 3.4227 0.816418
+rotate 13.1458
+text 1
+rotate -13.1458
+amove 3.6273 1.01516
+aline 3.62889 1.00834
+amove 3.66073 0.87201
+rotate 13.1458
+text 2
+rotate -13.1458
+amove 3.86533 1.07075
+aline 3.86692 1.06393
+amove 3.89876 0.927602
+rotate 13.1458
+text 3
+rotate -13.1458
+amove 4.10336 1.12634
+aline 4.10495 1.11953
+amove 4.13679 0.983195
+rotate 13.1458
+text 4
+rotate -13.1458
+amove 4.34139 1.18193
+aline 4.34298 1.17512
+amove 4.37482 1.03879
+rotate 13.1458
+text 5
+rotate -13.1458
+amove 4.57942 1.23753
+aline 4.58102 1.23071
+amove 4.61286 1.09438
+rotate 13.1458
+text 6
+rotate -13.1458
+amove 4.81745 1.29312
+aline 4.81905 1.2863
+amove 4.85089 1.14997
+rotate 13.1458
+text 7
+rotate -13.1458
+amove 5.05548 1.34871
+aline 5.05708 1.34189
+amove 5.08892 1.20556
+rotate 13.1458
+text 8
+rotate -13.1458
+amove 5.29351 1.4043
+aline 5.29511 1.39749
+amove 5.32695 1.26116
+rotate 13.1458
+text 9
+rotate -13.1458
+amove 5.53155 1.4599
+aline 5.53314 1.45308
+amove 5.56498 1.31675
+rotate 13.1458
+text 10
+rotate -13.1458
+set just TC
+set color BLACK
+set hei 0.116667
+set just RC
+amove 1.2053 1.76462
+aline 1.1983 1.76462
+amove 1.0583 1.76462
+text 0.5
+amove 1.2053 2.46119
+aline 1.1983 2.46119
+amove 1.0583 2.46119
+text 1
+amove 1.2053 3.15777
+aline 1.1983 3.15777
+amove 1.0583 3.15777
+text 1.5
+amove 1.2053 3.85435
+aline 1.1983 3.85435
+amove 1.0583 3.85435
+text 2
+amove 1.2053 4.55092
+aline 1.1983 4.55092
+amove 1.0583 4.55092
+text 2.5
+amove 1.2053 5.2475
+aline 1.1983 5.2475
+amove 1.0583 5.2475
+text 3
+amove 1.2053 5.94408
+aline 1.1983 5.94408
+amove 1.0583 5.94408
+text 3.5
+set just BC
+set color BLACK
+set lstyle 1
+amove 1.2 5.2475
+aline 1.2 5.94408
+amove 1.2 5.2475
+aline 1.2 1.76462
+amove 1.44 4.74302
+aline 1.44 5.99967
+amove 1.44 4.11857
+aline 1.44 1.82021
+amove 1.68 4.23854
+aline 1.68 6.05526
+amove 1.68 2.98965
+aline 1.68 1.8758
+amove 1.91333 3.74808
+aline 1.91333 6.11085
+amove 1.91333 2.1477
+aline 1.91333 1.93139
+amove 2.15333 3.24361
+aline 2.15333 6.16645
+amove 2.15333 2.04123
+aline 2.15333 1.98699
+amove 2.39333 2.93476
+aline 2.39333 6.22204
+amove 2.63333 3.27273
+aline 2.63333 6.27763
+amove 2.86667 3.60132
+aline 2.86667 6.33322
+amove 3.10667 3.81586
+aline 3.10667 6.38882
+amove 3.34667 3.70938
+aline 3.34667 6.44441
+amove 3.58 3.60587
+aline 3.58 6.5
+amove 1.2 1.76462
+aline 2.23333 2.00573
+amove 1.2 2.46119
+aline 1.76667 2.58198
+amove 2.1 3.35572
+aline 2.82667 3.54499
+amove 3.42667 3.67389
+aline 3.58 3.71369
+amove 1.2 3.15777
+aline 1.62667 3.24052
+amove 1.8 3.9863
+aline 3.58 4.41027
+amove 1.2 3.85435
+aline 1.48667 3.89905
+amove 1.5 4.6169
+aline 3.58 5.10685
+amove 1.2 4.55092
+aline 1.34667 4.5576
+amove 1.2 5.2475
+aline 3.58 5.80342
+amove 1.2 5.2475
+aline 1.20667 5.21614
+amove 1.2 5.94408
+aline 3.58 6.5
+set color BLACK
+set lstyle 1
+amove 3.58 3.60587
+aline 3.58 6.5
+amove 3.90667 3.35295
+aline 3.90667 6.35656
+amove 4.23333 3.04768
+aline 4.23333 6.21312
+amove 4.55333 2.74863
+aline 4.55333 6.06968
+amove 4.55333 1.92848
+aline 4.55333 1.89022
+amove 4.88 2.44335
+aline 4.88 5.92624
+amove 4.88 2.005
+aline 4.88 1.74678
+amove 5.20667 2.29844
+aline 5.20667 5.7828
+amove 5.20667 2.08152
+aline 5.20667 1.60334
+amove 5.52667 2.15647
+aline 5.52667 5.63936
+amove 5.52667 2.15647
+aline 5.52667 1.4599
+amove 4.5 1.91599
+aline 5.52667 1.4599
+amove 5.45333 2.18901
+aline 5.46 2.18605
+amove 5.46667 2.18309
+aline 5.47333 2.18013
+amove 5.48 2.17718
+aline 5.48667 2.17422
+amove 5.49333 2.17126
+aline 5.5 2.1683
+amove 5.50667 2.16535
+aline 5.52667 2.15647
+amove 5.52667 2.15647
+aline 5.52667 2.15647
+amove 3.58 3.71369
+aline 5.52667 2.85305
+amove 3.58 4.41027
+aline 5.52667 3.54963
+amove 3.58 5.10685
+aline 5.52667 4.2462
+amove 3.58 5.80342
+aline 5.52667 4.94278
+amove 3.58 6.5
+aline 5.52667 5.63936
+set color BLACK
+set lstyle 1
+amove 1.2 1.76462
+aline 2.23333 2.00573
+amove 1.52667 1.62118
+aline 2.56 1.86082
+amove 1.85333 1.47774
+aline 2.88667 1.7159
+amove 2.17333 1.33429
+aline 4.55333 1.89022
+amove 2.5 1.19085
+aline 4.88 1.74678
+amove 2.82667 1.04741
+aline 5.20667 1.60334
+amove 3.14667 0.903974
+aline 5.52667 1.4599
+amove 1.2 1.76462
+aline 3.14667 0.903974
+amove 1.44 1.82021
+aline 3.38667 0.959566
+amove 1.68 1.8758
+aline 3.62667 1.01516
+amove 1.91333 1.93139
+aline 3.86 1.07075
+amove 2.15333 1.98699
+aline 4.1 1.12634
+amove 3.31333 1.63937
+aline 4.34 1.18193
+amove 3.54667 1.69372
+aline 4.57333 1.23753
+amove 3.78667 1.74962
+aline 4.81333 1.29312
+amove 4.02667 1.80552
+aline 5.05333 1.34871
+amove 4.26667 1.86142
+aline 5.29333 1.4043
+amove 4.5 1.91599
+aline 5.52667 1.4599
diff --git a/gle-refman/utilities/fig/xyz/xyz.dat b/gle-refman/utilities/fig/xyz/xyz.dat
new file mode 100644
index 0000000..6061245
--- /dev/null
+++ b/gle-refman/utilities/fig/xyz/xyz.dat
@@ -0,0 +1,102 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+* *
+1.8 0
+2 1
+4 1
+5.6 5
+4 9
+2 9
+0.4 5
+0 4.5
+* *
+1.6 0
+2 2
+4 2
+5.2 5
+4 8
+2 8
+0.8 5
+0 4
+* *
+1.4 0
+2 3
+4 3
+4.8 5
+4 7
+2 7
+1.2 5
+0 3.5
+* *
+1.2 0
+0 3
+* *
+1 0
+0 2.5
+* *
+0.8 0
+0 2
+* *
+0.6 0
+0 1.5
+* *
+0.4 0
+0 1
+* *
+0.2 0
+0 0.5
+* *
+0 0
+0 0
+* *
+2 4
+1.6 5
+2 6
+4 6
+4.4 5
+4 4
+2 4
+* *
+2 5
+2 5
+2 5
+4 5
+4 5
+4 5
+2 5
diff --git a/gle-refman/utilities/fig/xyz/xyz.key b/gle-refman/utilities/fig/xyz/xyz.key
new file mode 100644
index 0000000..99632f1
--- /dev/null
+++ b/gle-refman/utilities/fig/xyz/xyz.key
@@ -0,0 +1,133 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+rmove .2 .2
+set lwidth 0
+save keystart
+begin box fill white add .2
+text K
+rmove .6 0
+text 3
+rmove -.6 .5
+text J
+rmove .6 0
+text 2.8
+rmove -.6 .5
+text I
+rmove .6 0
+text 2.6
+rmove -.6 .5
+text H
+rmove .6 0
+text 2.4
+rmove -.6 .5
+text G
+rmove .6 0
+text 2.2
+rmove -.6 .5
+text F
+rmove .6 0
+text 2
+rmove -.6 .5
+text E
+rmove .6 0
+text 1.8
+rmove -.6 .5
+text D
+rmove .6 0
+text 1.6
+rmove -.6 .5
+text C
+rmove .6 0
+text 1.4
+rmove -.6 .5
+text B
+rmove .6 0
+text 1.2
+rmove -.6 .5
+text A
+rmove .6 0
+text 1
+rmove -.6 .5
+end box
+move keystart
+text K
+rmove .6 0
+text 3
+rmove -.6 .5
+text J
+rmove .6 0
+text 2.8
+rmove -.6 .5
+text I
+rmove .6 0
+text 2.6
+rmove -.6 .5
+text H
+rmove .6 0
+text 2.4
+rmove -.6 .5
+text G
+rmove .6 0
+text 2.2
+rmove -.6 .5
+text F
+rmove .6 0
+text 2
+rmove -.6 .5
+text E
+rmove .6 0
+text 1.8
+rmove -.6 .5
+text D
+rmove .6 0
+text 1.6
+rmove -.6 .5
+text C
+rmove .6 0
+text 1.4
+rmove -.6 .5
+text B
+rmove .6 0
+text 1.2
+rmove -.6 .5
+text A
+rmove .6 0
+text 1
+rmove -.6 .5
+move keystart
diff --git a/gle-refman/utilities/fig/xyz/xyz.lab b/gle-refman/utilities/fig/xyz/xyz.lab
new file mode 100644
index 0000000..679006b
--- /dev/null
+++ b/gle-refman/utilities/fig/xyz/xyz.lab
@@ -0,0 +1,99 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+set lwidth .0000001
+amove xg(1.8) yg(0)
+begin box fill white add .07
+ text B
+end box
+text B
+amove xg(1.6) yg(0)
+begin box fill white add .07
+ text C
+end box
+text C
+amove xg(1.4) yg(0)
+begin box fill white add .07
+ text D
+end box
+text D
+amove xg(1.2) yg(0)
+begin box fill white add .07
+ text E
+end box
+text E
+amove xg(1) yg(0)
+begin box fill white add .07
+ text F
+end box
+text F
+amove xg(0.8) yg(0)
+begin box fill white add .07
+ text G
+end box
+text G
+amove xg(0.6) yg(0)
+begin box fill white add .07
+ text H
+end box
+text H
+amove xg(0.4) yg(0)
+begin box fill white add .07
+ text I
+end box
+text I
+amove xg(0.2) yg(0)
+begin box fill white add .07
+ text J
+end box
+text J
+amove xg(0) yg(0)
+begin box fill white add .07
+ text K
+end box
+text K
+amove xg(2) yg(4)
+begin box fill white add .07
+ text E
+end box
+text E
+amove xg(2) yg(5)
+begin box fill white add .07
+ text F
+end box
+text F
diff --git a/gle-refman/utilities/fig/xyz/xyz.sur b/gle-refman/utilities/fig/xyz/xyz.sur
new file mode 100644
index 0000000..174e0ff
--- /dev/null
+++ b/gle-refman/utilities/fig/xyz/xyz.sur
@@ -0,0 +1,48 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+begin surface
+ size 7 7
+ data xyz.z
+ back ystep 1 zstep 0.5 !color green
+ base xstep 1 ystep 1 !color green
+ right zstep .5 xstep 1 !color green
+ !top color blue
+ zaxis min 0.5 max 3.5
+ underneath on lstyle 2
+end surface
diff --git a/gle-refman/utilities/fig/xyz/xyz.z b/gle-refman/utilities/fig/xyz/xyz.z
new file mode 100644
index 0000000..50abbe7
--- /dev/null
+++ b/gle-refman/utilities/fig/xyz/xyz.z
@@ -0,0 +1,41 @@
+! nx 4 ny 3 xmin 0 xmax 6 ymin 0 ymax 10
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+3 1 1 1
+1 2 2 1
+1 1 1 1
diff --git a/gle-refman/utilities/fitls.tex b/gle-refman/utilities/fitls.tex
new file mode 100644
index 0000000..6af246b
--- /dev/null
+++ b/gle-refman/utilities/fitls.tex
@@ -0,0 +1,100 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% GLE - Graphics Layout Engine <http://www.gle-graphics.org/> %
+% %
+% Modified BSD License %
+% %
+% Copyright (C) 2009 GLE. %
+% %
+% Redistribution and use in source and binary forms, with or without %
+% modification, are permitted provided that the following conditions %
+% are met: %
+% %
+% 1. Redistributions of source code must retain the above copyright %
+% notice, this list of conditions and the following disclaimer. %
+% %
+% 2. Redistributions in binary form must reproduce the above %
+% copyright notice, this list of conditions and the following %
+% disclaimer in the documentation and/or other materials provided with %
+% the distribution. %
+% %
+% 3. The name of the author may not be used to endorse or promote %
+% products derived from this software without specific prior written %
+% permission. %
+% %
+% THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR %
+% IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED %
+% WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE %
+% ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY %
+% DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL %
+% DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE %
+% GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS %
+% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER %
+% IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR %
+% OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN %
+% IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\chapter {GLE Utilities}
+\label{util:chap}
+\section{Fitls}
+\index{Fitls}
+The FITLS utility allows an equation with $n$ unknown constants to
+be fitted to experimental data.
+
+For example to fit a simple least squares regression line to a set of
+points you would give FITLS the equation: \verb# a*x+b#
+
+FITLS would then solve the equation to find the {\em best} values for
+the constants $a$ and $b$.
+
+FITLS can work with non linear equations, it will ask for initial
+values for the parameters so that a solution around those initial
+guesses will be found.
+
+FITLS writes out a GLE file containing commands to draw the data
+points and the equation it has fitted to them.
+
+Here is a sample FITLS session:
+\begin{verbatim}
+$ fitls
+Input data file (x and y columns optional) [test.dat,1,2] ? fitls.dat
+Loading data from file, fitls.dat, xcolumn=1, ycolumn=2
+Valid operators: +, -, *, /, ^ (power)
+Valid functions:
+ abs(), atn(), cos(), exp(), fix(), int()
+ log(), log10(), not(), rnd(), sgn(), sin()
+ sqr(), sqrt(), tan()
+
+ Enter a function of 'x' using constants 'a'...'z'
+ e.g. a + b*x (standard linear least squares fit)
+ sin(x)*a+b
+ a + b*x + c*x^2 + d*x^3
+ log(a*x)+(b+x)*c+a
+
+Equation ? sin(a*x)*b+c*x^2+d
+
+Output file name to write gle file [fitls.gle] ?
+Precision of fit required, [1e-4] ?
+Initial value for constant a [1.0] ?
+Initial value for constant b [1.0] ?
+Initial value for constant c [1.0] ?
+Initial value for constant d [1.0] ?
+0 evaluations, 1 1 1 1 , fit = 1355.36
+20 evaluations, 1.97005 1 1 1 , fit = 1281.95
+40 evaluations, 1.97005 10.228 0.151285 1 , fit = 54.7694
+60 evaluations, 2.01053 10.228 0.151285 1.06365 , fit = 54.1771
+.
+.
+.
+440 evaluations, -0.640525 -2.81525 0.13997 1.13871 , fit = 0.940192
+460 evaluations, -0.638055 -2.82934 0.140971 1.10502 , fit = 0.93842
+480 evaluations, -0.63808 -2.82357 0.140993 1.10452 , fit = 0.938389
+a = -0.638262 b = -2.81719 c = 0.140722 d = 1.11256
+
+10 Iterations, sum of squares devided by n = 0.938389
+y = sin(-0.638262*x)*-2.81719+0.140722*x^2+1.11256
+\end{verbatim}
+\vspace*{1.0cm}
+\psgraphin{utilities/fig/fitls}{8.0}{5.0}{\sf fitls}
diff --git a/gle-refman/utilities/fitz.tex b/gle-refman/utilities/fitz.tex
new file mode 100644
index 0000000..d0b9b84
--- /dev/null
+++ b/gle-refman/utilities/fitz.tex
@@ -0,0 +1,82 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% GLE - Graphics Layout Engine <http://www.gle-graphics.org/> %
+% %
+% Modified BSD License %
+% %
+% Copyright (C) 2009 GLE. %
+% %
+% Redistribution and use in source and binary forms, with or without %
+% modification, are permitted provided that the following conditions %
+% are met: %
+% %
+% 1. Redistributions of source code must retain the above copyright %
+% notice, this list of conditions and the following disclaimer. %
+% %
+% 2. Redistributions in binary form must reproduce the above %
+% copyright notice, this list of conditions and the following %
+% disclaimer in the documentation and/or other materials provided with %
+% the distribution. %
+% %
+% 3. The name of the author may not be used to endorse or promote %
+% products derived from this software without specific prior written %
+% permission. %
+% %
+% THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR %
+% IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED %
+% WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE %
+% ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY %
+% DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL %
+% DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE %
+% GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS %
+% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER %
+% IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR %
+% OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN %
+% IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\section{Fitz}
+\index{fitz} \label{fitz:sec}
+
+{\sf FITZ} fits smooth curves based on a set of 3D data points. E.g., given some data points (note that each line has three values: an x, y, and z coordinate):
+\begin{verbatim}
+x y z
+---- data file testf.dat -----
+1 1 1
+1 2 1
+2 2 1
+2 1 1
+1.5 1.5 2
+------------------------------
+\end{verbatim}
+
+Fitz creates a ".z" file that can be used in a surface block, a colormap or contour plot. The following example illustrates this.
+
+\begin{minipage}[c]{8cm}
+\begin{Verbatim}
+begin fitz
+ data "fitz.dat"
+ x from 0 to 5 step 0.2
+ y from 0 to 5 step 0.2
+ ncontour 6
+end fitz
+
+begin surface
+ size 7 7
+ data "fitz.z"
+ top color blue
+ xaxis min 0 max 5 step 1
+ yaxis min 0 max 5 step 1
+ points "fitz.dat"
+ droplines lstyle 1
+ marker circle
+ view 2.5 3 0.3
+ harray 5000
+end surface
+\end{Verbatim}
+\end{minipage}
+\hfill
+\begin{minipage}[c]{7cm}
+\mbox{\includegraphics{utilities/fig/fitz1}}
+\end{minipage}
diff --git a/gle-refman/utilities/letz.tex b/gle-refman/utilities/letz.tex
new file mode 100644
index 0000000..2211028
--- /dev/null
+++ b/gle-refman/utilities/letz.tex
@@ -0,0 +1,53 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% GLE - Graphics Layout Engine <http://www.gle-graphics.org/> %
+% %
+% Modified BSD License %
+% %
+% Copyright (C) 2009 GLE. %
+% %
+% Redistribution and use in source and binary forms, with or without %
+% modification, are permitted provided that the following conditions %
+% are met: %
+% %
+% 1. Redistributions of source code must retain the above copyright %
+% notice, this list of conditions and the following disclaimer. %
+% %
+% 2. Redistributions in binary form must reproduce the above %
+% copyright notice, this list of conditions and the following %
+% disclaimer in the documentation and/or other materials provided with %
+% the distribution. %
+% %
+% 3. The name of the author may not be used to endorse or promote %
+% products derived from this software without specific prior written %
+% permission. %
+% %
+% THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR %
+% IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED %
+% WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE %
+% ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY %
+% DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL %
+% DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE %
+% GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS %
+% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER %
+% IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR %
+% OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN %
+% IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\section{Letz} \label{letz:sec}
+
+LETZ generates a data file of z values given an expression in terms of x and y.
+
+\begin{verbatim}
+begin letz
+ data "jack.z"
+ z = x+sin(y^2)/pi+10.22
+ x from 0 to 30 step 1
+ y from 0 to 20 step 1
+end letz
+\end{verbatim}
+
+The file jack.z now contains the required data. The resulting file can be used to generate surface plots with the begin/end surface block discussed in the previous section.
+
diff --git a/gle-refman/utilities/manip.tex b/gle-refman/utilities/manip.tex
new file mode 100644
index 0000000..448f1c4
--- /dev/null
+++ b/gle-refman/utilities/manip.tex
@@ -0,0 +1,470 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% GLE - Graphics Layout Engine <http://www.gle-graphics.org/> %
+% %
+% Modified BSD License %
+% %
+% Copyright (C) 2009 GLE. %
+% %
+% Redistribution and use in source and binary forms, with or without %
+% modification, are permitted provided that the following conditions %
+% are met: %
+% %
+% 1. Redistributions of source code must retain the above copyright %
+% notice, this list of conditions and the following disclaimer. %
+% %
+% 2. Redistributions in binary form must reproduce the above %
+% copyright notice, this list of conditions and the following %
+% disclaimer in the documentation and/or other materials provided with %
+% the distribution. %
+% %
+% 3. The name of the author may not be used to endorse or promote %
+% products derived from this software without specific prior written %
+% permission. %
+% %
+% THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR %
+% IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED %
+% WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE %
+% ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY %
+% DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL %
+% DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE %
+% GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS %
+% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER %
+% IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR %
+% OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN %
+% IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%\chapter {GLE Utilities}
+\section{Manip}
+\index{Manip}
+%
+Manip is a data manipulation package. It reads in a text
+file of numbers and displays them like a spreadsheet.
+You can then do simple operations on the columns and write
+them out in any format you like.
+
+\subsection{Usage}
+\index{Manip!usage}
+\begin{verbatim}
+ MANIP infile.dat -recover -step -commands c.log -single -size x y
+\end{verbatim}
+
+\begin{commanddescription}
+\item[{\sf --recover}]
+\index{recover}
+Manip logs everything you type to a file called \verb#MANIP_.J1#
+When you use the {\sf -RECOVER} option on the manip command it then
+reads keys from that file as if they were typed at the keyboard.
+
+This will restore you to the
+point just before your pc crashed.
+The last three journal files are stored (.j1 .j2 .j3)
+simply copy the one you want to (.j1) to use it.
+
+\item[{\sf --step}]
+\index{step}
+Used with recover, press a space for each key you
+want to read from the journal file, press any other
+key to stop reading the journal.
+
+\item[{\sf --commands {\it filename.man}}]
+\index{commands}
+This reads the commands in {\it filename.man} as if they
+were typed at the keyboard.
+
+\item[{\sf --single}]
+\index{single}
+This makes {\sf MANIP} use single precision arithmetic
+and doesn't store strings at all, this enables
+three times as much data in the same amount of memory
+
+\item[{\sf --size {\it x y}}]
+\index{size {\it x y}}
+Sets the initial size of the spreadsheet. Use this
+with large datasets as it prevents the heap from
+becoming fragmented and thus lets you use much
+larger datasets.
+\end{commanddescription}
+
+\subsubsection{Range}
+\index{Manip!Range}
+Most manip commands accept a range as one or more of there
+parameters. A range is a rectangular section of your
+spreadsheet. A range can ether start with a 'c' or an
+'r' and this will affect how the command operates.
+
+If your spreadsheet has 5 columns and 10 rows then.
+\begin{verbatim}
+ c1 == c1c1r1r10 == 1,1 1,2 1,3 1,4 1,5 1,6 ...
+ r1 == r1r1c1c5 == 1,1 2,1 3,1 4,1 5,1
+ c1c2 ==c1c2r1r10 == 1,1 2,1 1,2 2,2 3,1 3,2 ...
+ r1r2c3=r1r2c3c5 == 3,1 3,2 4,1 4,2 5,1 5,2
+\end{verbatim}
+
+\subsubsection{Arrows}
+\index{Manip!Arrows}
+The arrow keys normally move the data cursor, however if you are half
+way thru typing a command then, the left and right arrow keys allow you
+to edit the command. Use the {\sf PAGE-UP} and {\sf PAGE-DOWN} keys to recall
+your last command.
+
+{\sf SHIFT} arrow keys will jump 7 cells at a time for fast movement.\\
+
+Further help is available on the following toppics via
+the HELP command e.g. "HELP COPY"
+
+\subsection{Manip Primitives (a summary)}
+%
+%%{\sf xplaces {\it pos1 pos2 pos3 ...}} \\
+%
+{\sf @{\it mycmds}}\\
+{\sf Arrows}\\
+{\sf BLANK}\\
+{\sf CLEAR}\\
+{\sf CLOSE}\\
+{\sf COPY [{\it range}] [{\it range}] IF [{\it exp}]}\\
+{\sf DATA [{\it range}]}\\
+{\sf DELETE [{\it range}] IF [{\it exp}]}\\
+{\sf EXIT {\it filename} [{\it range}] --TAB --SPACE --COMMA}\\
+{\sf FIT {\it c3}}\\
+{\sf Functions}\\
+{\sf GENERATE [{\it pattern}] [{\it destination}]}\\
+{\sf GOTO {\it x y}}\\
+{\sf INSERT [C{\it n}] or [R{\it n}]}\\
+{\sf LOAD {\it filename} [{\it range}] --0}\\
+{\sf LOAD {\it filename} [{\it range}]}\\
+{\sf LOGGING {\it mycmds.man}}\\
+{\sf MOVE [{\it range}] [{\it range}] IF [{\it exp}]}\\
+{\sf NEW}\\
+{\sf PARSUM [{\it range1}] [{\it range2}]}\\
+{\sf PROP [{\it range}] [{\it range}]}\\
+{\sf QUIT}\\
+{\sf Recover (recovering from power failure or crash)}\\
+{\sf SAVE {\it filename} [{\it range}] --TAB --SPACE --COMMA}\\
+{\sf SET SIZE {\it ncols nrows} }\\
+{\sf SET BETWEEN " "}\\
+{\sf SET COLTYPE}\\
+{\sf SET COLWIDTH}\\
+{\sf SET NCOL {\it n}}\\
+{\sf SET DPOINTS {\it n}}\\
+{\sf SET DIGITS {\it n}}\\
+{\sf SET WIDTH {\it n}}\\
+{\sf SHELL}\\
+{\sf SORT [{\it range}] on [{\it exp}]}\\
+{\sf SUM [{\it range}]}\\
+{\sf SWAP C{\it n}C{\it n} | R{\it n}R{\it n}}
+
+\subsection{Manip Primitives (in detail)}
+%
+\begin{commanddescription}
+%%\item[{\sf data {\it filename {\sf [}d1 d2 d3 ...{\sf ] [}d1=c1,c3{\sf ]} }
+%%} ]
+%% \index{data}
+\item[{\sf COPY [{\it range1}] [{\it range2}] if [{\it exp}]}]
+\index{copy}
+
+For copying a section to another section.
+They do not have to be the same shape. The pointers to both rangers
+are increased even if the number is not coppied e.g.
+\begin{verbatim}
+ "% COPY r4r2 r1r2"
+ "% COPY c1c3r6r100 c6c8 if c1<c2"
+
+ "% COPY C1 C2 IF C1<4"
+ c1 c2
+ 1 1
+ 2 2
+ 5 -
+ 3 3
+ 9 -
+\end{verbatim}
+
+\item[{\sf DELETE [{\it range}] IF [{\it exp}]}]
+\index{delete}
+For deleteing entire rows or columns. e.g.
+\begin{verbatim}
+ "% DELETE c1c3 IF r1>3.and.r2=0
+ "% DELETE r1"
+\end{verbatim}
+Numbers are shuffled in from the right to take the place of the
+deleted range.
+
+\item[{\sf DATA [{\it range}]}]
+\index{data}
+Data entry mode is usefull for entering data. After typing in
+\verb#"% DATA c1c3"# or \verb#"% DATA C2"# you can then enter data and pressing
+{\sf <cr>} will move you to the next valid data position.
+In this mode text or numbers can be entered.
+Press {\sf ESC} to get back to command mode.
+
+\item[{\sf FIT {\it c3}}]
+\index{fit}
+\verb#"FIT C3"# will fit a least squares regression line to the data
+in columns c3 and c4 (x values taken from c3) and print
+out the results.
+
+\item[{\sf EXIT}]
+\index{exit}
+EXIT saves the data in your input file spec and exits to DOS. You
+can optionally specify an output file as well. eg.
+\verb#"% EXIT myfile.dat"#
+
+The command \verb#"EXIT myfile.dat c3c5r1r3"# will write out that range of
+numbers to the file.
+
+By default manip will write columns seperated by spaces.
+
+The command \verb#"EXIT myfile.dat -TAB"# will put a single tab between
+each column of numbers and \verb#"EXIT myfile.dat -COMMA"# will put a
+comma and a space between each number. (these two options are
+usefull if your data file is very big and you don't want to waste
+diskspace with the space characters.)
+Note: The settings stay in effect for future saves and exits.
+
+You can make it line up the columns on the decimal point by typing in the
+command. \verb#"SET DPOINTS 3"#
+
+You change the width of each column or completely remove the spaces
+between columns with the command. \verb#"SET WIDTH 10"# (or set width 0)
+
+You can change the number of significant digits displayed with
+the command \verb#"SET DIGITS 4"#
+
+\item[{\sf SAVE {\it myfile.dat}}]
+\index{save}
+Saves all or part of your data.
+The command \verb#"SAVE myfile.dat c3c5r1r3"# will write out that range of
+numbers to the file.
+
+By default manip will write columns seperated by spaces.
+
+The command \verb#"SAVE myfile.dat -TAB"# will put a single tab between
+each column of numbers and \verb#"SAVE myfile.dat -COMMA"# will put a
+comma and a space between each number. (these two options are
+usefull if your data file is very big and you don't want to waste
+diskspace with the space characters).
+
+Further options are the same like {\sf EXIT}
+
+\item[{\sf GOTO}]
+\index{goto}
+For moving the cursor directly to a point in your array.
+e.g. \verb#"% GOTO x y"#
+
+\item[{\sf CLEAR}]
+\index{clear}
+\verb#"% CLEAR C2C3"# Clears the given range of all values
+
+\item[{\sf BLANK}]
+\index{BLANK}
+\verb#"% BLANK C2C3"# Clears the given range of all values
+
+\item[{\sf NEW}]
+\index{new}
+Clears the spread sheet of all data and frees memory.
+
+\item[{\sf INSERT}]
+\index{insert}
+Inserts a new column or row and shifts all others over.
+e.g.\verb#"% INSERT c5" or "% INSERT r2"#.
+
+\item[{\sf LOAD}]
+\index{load}
+Load data into columns. eg. \verb#"% LOAD filename"# loads all
+data into corresponding columns. \verb#"% LOAD filename c3"#
+load first column of data into c3 etc.
+
+\verb# "LOAD myfile.dat c3 -LIST"#
+This commmand will load the the data into a single column or range
+(even if it is several columns wide in the data file)
+
+\item[{\sf MOVE [{\it range1}] [{\it range2}] if [{\it exp}]}]
+\index{move}
+For copying a section to another section. They do not have to be the
+same shape. The pointer to the destination is only increased if
+the line or column is coppied e.g.
+\begin{verbatim}
+ "% MOVE c1 c2c3"
+ "% MOVE r4r2 r1r2"
+ "% MOVE c1c3r6r100 c6c8 if c1<c2"
+
+ "% MOVE C1 C2 IF C1<4"
+ c1 c2
+ 1 1
+ 2 2
+ 5 3
+ 3 -
+ 9 -
+
+ (See COPY command)
+\end{verbatim}
+
+\item[{\sf SORT [{\it range}] ON [{\it exp}]}]
+\index{sort}
+Sort entire rows of the data based on the data in a particular column. e.g.
+\begin{verbatim}
+ "% SORT c8 on c9"
+ "% SORT c1c8 on -c8"
+ "% SORT c1c3 on c2 " !for sorting strings
+
+\end{verbatim}
+This command works out how to sort the column (or exp) specified
+in the {\sf ON} part of the command. It then does that operation to
+the range specified. e.g. \verb#"SORT C1 ON C1"# will sort column one.
+
+Use the additional qualifier \verb#-STRINGS# if you want to sort a
+column with strings in it. e.g. \verb#"sort c1 on c2 -strings"#
+
+\item[{\sf SWAP}]
+\index{swap}
+Swap over two columns or rows. e.g.
+\begin{verbatim}
+ "% SWAP c1c2"
+ "% SWAP r3r1"
+\end{verbatim}
+
+\item[{\sf SET SIZE {\it ncols nrows}}]
+\index{set size}
+\verb#"SIZE 3 4"# Truncates the spreadsheet to 3 columns and 4 rows. This
+also sets the values to use for default ranges.
+
+\item[{\sf SET BETWEEN " "}]
+\index{set between}
+\verb$"SET BETWEEN "##"$ Defines the string to be printed
+between each column of numbers when written to a file.
+This is normally set to a single space.
+
+\item[{\sf SET COLWIDTH}]
+\index{set colwidth}
+Set the width of each column when displayed.
+e.g. \verb#"% SET COLWIDTH 12"#
+
+\item[{\sf SET COLTYPE [{\it n}] DECIMAL | EXP | BOTH | DPOINTS {\it n}}]
+\index{set coltype}
+This commands allows all or individual columns to be set to
+different output types. If colnumber is missing then that
+setting is applied to all columns.
+
+\verb#SET COLTYPE Ccolnumber TYPE# Where {\sf TYPE} is one of:
+\begin{verbatim}
+ DECIMAL produces 123.456
+ EXP produces 1.23456e02
+ BOTH produces whichever is more suitable
+ DPOINTS n produces a fixed number of decimal places.
+ e.g.
+ SET COLTYPE c2 DECIMAL
+ SET COLTYPE c1 EXP
+ SET COLTYPE c3 DPOINTS 4
+\end{verbatim}
+Would print out: \verb# 1.2e02 1.2 1.2000#
+\begin{verbatim}
+ SET COLTYPE EXP (column number missed out)
+\end{verbatim}
+Would print out: \verb# 1.2e02 1.2e02 1.2e02#
+
+\item[{\sf SET NCOL {\it n}}]
+\index{set ncol}
+ Set the number of columns to display. e.g.\verb#"% SET NCOL 3"#
+
+\item[{\sf SET DPOINTS {\it n}}]
+\index{set dpoints}
+Sets the number of decimal places to print. This is used for
+producing columns which line up on the decimal point.
+e.g. with \verb#DPOINTS 3#.
+\begin{verbatim}
+ 2.2 -> 2.200
+ 234 -> 234.000
+\end{verbatim}
+(See also {\sf SET COLTYPE})
+
+\item[{\sf SET DIGITS {\it n}}]
+\index{set digits}
+Sets the number of significat digits to be displayed, e.g.
+with \verb#DIGITS 3#.
+\begin{verbatim}
+ 123456 becomes 123000
+ 0.12345 becomes 0.123
+\end{verbatim}
+
+\item[{\sf SET WIDTH {\it n}}]
+\index{set width}
+Sets the width of padding to use for the columns when they
+are written to a file.
+The columns usually one space wider than this setting as
+the {\sf BETWEEN} string is usually set to one space by default.
+
+\item[{\sf LOGGING}]
+\index{logging}
+For creating command files. e.g.
+\begin{verbatim}
+ "% LOG sin.man"
+ "% c2=sin(c1)
+ "% c3=c2+2
+ "% close"
+\end{verbatim}
+Then type in \verb#"@sin"# to execute these commands.
+
+\item[{\sf PROPAGATE [{\it source}] [{\it destination}]}]
+\index{propagate}
+This command has the same format as move.
+The difference is that the source is coppied as many times as
+possible to fill up the destination.
+e.g. \verb#"% PROP c1r1r7 c2"#
+
+\item[{\sf SUM [{\it range}]}]
+\index{sum}
+Adds up all the numbers in a range and displays the total and average.
+e.g. \verb#"% SUM C1C3"#
+
+\item[{\sf PARSUM [{\it range1}] [{\it range2}]}]
+\index{parsum}
+Adds up one coloumn, putting the partial sum's into another coloumn.
+e.g. \verb# 1,2,3,4# becomes \verb# 1,3,6,10#.
+
+\item[{\sf GENERATE [{\it pattern}] [{\it destination}]}]
+\index{generate}
+For generating a patter of data e.g. \verb# 1 1 2 2 5 5 1 1 2 2 5 5# etc.
+\begin{verbatim}
+ "% GEN 2(1,2,5)30 c4" !1 1 2 2 5 5 repeated 30 times
+ "% GEN (1:100:5)5 c1" !1 to 100 step 5, 5 times
+ "% GEN (1,2,*,3:5)5 c1" !missing values included
+\end{verbatim}
+
+\item[Functions]
+\index{Functions}
+Calculations can be performed on rows or columns. eg \verb#"% C1=C2*3+R"#
+where "R" stands for row-number and C1 and C2 are columns.
+They can also be performed on {\sf ROWS}. eg
+\begin{verbatim}
+ r1=sin(r2)+log10(c)
+ c1 = cell(c+1,r)+cell(c+2,r)
+ cell(1,3) = 33.3
+ 3+4*COS(PI/180)^(3+1/30)+C1+R
+\end{verbatim}
+ Valid operators and functions:
+%%\begin{verbatim}
+{\tt
+\begin{center}
+\begin{tabular}{ccccccc}
+ $,$ & $+$ & $-$ & \verb#^# & $*$ & $/$ & $<=$ \\
+ $>=$ & $<>$ & $<$ & $>$ & $=$ & )AND(& )OR( \\
+ ABS( & ATN( & COS( & EXP( & FIX( & INT( & LOG( \\
+LOG10( & SGN( & SIN( & SQR( & TAN( & NOT( & RND( \\
+ SQRT( & .NE. & .EQ. & .LT. & .GT. & .LE. & .GE. \\
+ .NOT. & .AND.& .OR. & & & & \\
+\end{tabular}
+\end{center}
+}
+%%\end{verbatim}
+
+\item[{\sf QUIT}]
+\index{quit}
+Abandon file.
+
+
+\item[{\sf SHELL}]
+\index{shell}
+Gives access to DOS.
+\end{commanddescription}
diff --git a/gle-refman/utilities/surface.tex b/gle-refman/utilities/surface.tex
new file mode 100644
index 0000000..c50b714
--- /dev/null
+++ b/gle-refman/utilities/surface.tex
@@ -0,0 +1,383 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% GLE - Graphics Layout Engine <http://www.gle-graphics.org/> %
+% %
+% Modified BSD License %
+% %
+% Copyright (C) 2009 GLE. %
+% %
+% Redistribution and use in source and binary forms, with or without %
+% modification, are permitted provided that the following conditions %
+% are met: %
+% %
+% 1. Redistributions of source code must retain the above copyright %
+% notice, this list of conditions and the following disclaimer. %
+% %
+% 2. Redistributions in binary form must reproduce the above %
+% copyright notice, this list of conditions and the following %
+% disclaimer in the documentation and/or other materials provided with %
+% the distribution. %
+% %
+% 3. The name of the author may not be used to endorse or promote %
+% products derived from this software without specific prior written %
+% permission. %
+% %
+% THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR %
+% IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED %
+% WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE %
+% ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY %
+% DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL %
+% DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE %
+% GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS %
+% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER %
+% IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR %
+% OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN %
+% IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\chapter{Surface and Contour Plots}
+\label{surf:chap}
+
+\section{Surface Primitives}
+
+\subsection{Overview}
+
+\index{Surface}
+Surface plots three dimensional data using a wire frame with hidden line removal.
+
+The simplist surface code would look like this.
+\preglecode{}
+\begin{Verbatim}
+begin surface
+ data "myfile.z" 5 5
+end surface
+\end{Verbatim}
+\postglecode{}
+
+The surface block can contain the following commands:\\
+{\sf size {\it x } {\it y }}\\
+{\sf cube [off] [xlen {\it v}\ ] [ylen {\it v}\ ] [zlen {\it v}\ ] [nofront] [lstyle {\it l\ }] [color {\it c\ }] }\\
+{\sf data {\it myfile.z} [xsample {\it n1}\ ] [ysample {\it n2}\ ] [sample {\it n3}\ ] [nx {\it n1}\ ] [ny {\it n2}\ ] }\\
+{\sf harray {\it n} \ }\\
+{\sf xlines --- ylines [off]}\\
+{\sf xaxis --- yaxis --- zaxis [min {\it v}\ ] [max {\it v}\ ] [step {\it v}\ ] [color {\it c}\ ] [lstyle {\it l}\ ] [hei {\it v}\ ] [off] }\\
+{\sf xtitle --- ytitle --- ztitle "{\sf title}" [dist {\it v}\ ] [color {\it c}\ ] [hei {\it v}\ ] }\\
+{\sf title "{\it main title}" [dist {\it v}\ ] [color {\it c}\ ] [hei {\it v}\ ] }\\
+{\sf rotate $\theta$\ $\phi$\ x}\\
+{\sf view x y p}\\
+{\sf top --- underneath \ [off]\ [lstyle {\it n} \ ]\ [color {\it c}\ ]}\\
+{\sf back [zstep {\it v}\ ] [ystep {\it v}\ ] [lstyle {\it l}\ ] [color {\it c}\ ] [nohidden] }\\
+{\sf base [xstep {\it v}\ ] [ystep {\it v}\ ] [lstyle {\it l}\ ] [color {\it c}\ ] [nohidden] }\\
+{\sf right [zstep {\it v}\ ] [xstep {\it v}\ ] [lstyle {\it l}\ ] [color {\it c}\ ] [nohidden] }\\
+{\sf skirt on}\\
+{\sf points {\it myfile.dat} }\\
+{\sf marker {\it circle}\ [hei {\it v} \ ] [color {\it c} \ ] }\\
+{\sf droplines --- riselines \ [color {\it c}\ ] [lstyle {\it n}\ ]}\\
+{\sf zclip [min {\it v1}\ ] [max {\it v2}\ ]}\\
+%
+%
+
+\subsection{Surface Commands}
+\begin{commanddescription}
+\item[{\sf size {\it x} \ {\it y}}]
+\index{size}
+Specifies the size in cm to draw the surface. The 3d cube
+will fit inside this box. The default is 18cm x 18cm
+e.g. \verb# size 10 10#
+
+\item[{\sf cube [off] [xlen {\it v}\ ] [ylen {\it v}\ ] [zlen {\it v}\ ] [nofront] [lstyle {\it l}\ ] [COLOR {\it c}\ ] }]
+Surface is drawing a 3d cube.
+
+\begin{tabular}{ll}
+off & Stops GLE from drawing the cube.\\
+xlen & The length of the cubes x dimension in cm.\\
+nofront & Removes the front three lines of the cube.\\
+lstyle & Sets the line style to use drawing the cube.\\
+color & Sets the color of lines to use drawing the cube.\\
+\end{tabular}
+
+\begin{minipage}[c]{8cm}
+\begin{Verbatim}
+begin surface
+ size 7 7
+ data "jack.z"
+ cube zlen 13
+ top color orange
+ underneath color red
+end surface
+\end{Verbatim}
+\end{minipage}
+\hfill
+\begin{minipage}[c]{7cm}
+\mbox{\includegraphics{utilities/fig/surf5}}
+\end{minipage}
+
+\item[{\sf data {\it myfile.z} [xsample {\it n1}\ ] [ysample {\it n2}\ ] [sample {\it n3}\ ] [nx {\it n1}\ ] [ny {\it n2}\ ]}]
+\index{data}\label{zfile:pg}
+Loads a file of Z values in. The NX and NY dimensions
+are optional, normally the dimensions of the data will
+be defined on the first line of the data file. e.g.
+\begin{verbatim}
+ ! nx 10 ny 20 xmin 1 xmax 10 ymin 1 ymax 20
+ 1 2 42 4 5 2 31 4 3 2 4
+ 1 2 42 4 5 2 31 4 3 2 4 etc...
+
+ y1,x1, y1,x2 ... y1,xn
+ y2,x1, y2,x2 ... y2,xn
+ .
+ .
+ .
+ yn,x1, yn,x2 ... yn,xn
+\end{verbatim}
+
+Data files can be created using LETZ or FITZ.
+LETZ will create a data file from an x,y function.
+FITZ will create a data file from a list of x,y,z data points.
+
+\begin{tabular}{ll}
+xsample & Tells surface to only read every n'th data point from\\
+ & the data file. This speeds things up while you are\\
+ & messing around.\\[1.5ex]
+ysample & Tells surface to only read every n'th line from the\\
+ & data file.\\[1.5ex]
+sample & Sets both xsample and ysample\\
+\end{tabular}
+(see also POINTS)
+
+\begin{minipage}[c]{8cm}
+\begin{Verbatim}
+begin surface
+ size 5 5
+ xtitle "X-axis"
+ ytitle "Y-axis"
+ data "surf1.z"
+end surface
+\end{Verbatim}
+\end{minipage}
+\hfill
+\begin{minipage}[c]{7cm}
+\mbox{\includegraphics{utilities/fig/surf1}}
+\end{minipage}
+
+\item[{\sf harray {\it n}}]
+\index{harray}
+The hidden line removal is accomplished with the help of
+an array of heights which record the current horizon, the
+quality of the output is proportional to the width of this
+array. (also the speed of output)
+
+To get good quality you may want to increase this from
+the default of about 900 to 2 or 3 thousand.
+e.g. \verb# harray 2000#
+
+\item[{\sf xlines off}]
+\index{xlines}
+Stops SURF from drawing lines of constant X.
+
+\item[{\sf ylines off}]
+\index{ylines}
+Stops SURF from drawing lines of constant Y.
+
+\item[{\sf xaxis [min {\it v}\ ] [max {\it v}\ ] [step {\it v}\ ] [color {\it
+c}\ ] [lstyle {\it l}\ ] [hei {\it v}\ ] [off] }]
+\index{xaxis}
+
+\item[{\sf zaxis [min {\it v}\ ] [max {\it v}\ ] [step {\it v}\ ] [color {\it
+c}\ ] [lstyle {\it l}\ ] [hei {\it v}\ ] [off] }]
+\index{zaxis}
+
+\item[{\sf yaxis [min {\it v}\ ] [max {\it v}\ ] [step {\it v}\ ] [color {\it
+c}\ ] [lstyle {\it l}\ ] [hei {\it v}\ ] [off] }]
+\index{yaxis}
+
+\begin{tabular}{ll}
+min,max & Set the range used for labelling the axis.\\
+step & The distance between labels on the axis.\\
+color & The color of the axis ticks and labels.\\
+lstyle & The line style used for drawing the ticks.\\
+ticklen & The length of the ticks.\\
+hei & The height of text used for labelling.\\
+off & Stops GLE from drawing the axis.\\
+\end{tabular}
+
+\begin{minipage}[c]{8cm}
+\begin{Verbatim}
+begin surface
+ size 5 5
+ data "surf1.z"
+ zaxis min -1 max 3
+ base xstep 0.5 ystep 0.5
+ back ystep 1 zstep 1
+ right xstep 0.5 zstep 0.5 lstyle 2
+ xtitle "X-axis" hei 0.3
+ ytitle "Y-axis" hei 0.3
+end surface
+\end{Verbatim}
+\end{minipage}
+\hfill
+\begin{minipage}[c]{7cm}
+\mbox{\includegraphics{utilities/fig/surf2}}
+\end{minipage}
+
+\item[{\sf xtitle "{\sf x title}" [dist {\it v}\ ] [color {\it c}\ ] [hei {\it v}\ ]}]
+\index{xtitle}
+
+\item[{\sf ytitle "{\sf y title}" [dist {\it v}\ ] [color {\it c}\ ] [hei {\it v}\ ]}]
+\index{ytitle}
+
+\item[{\sf ztitle "{\sf z title}" [dist {\it v}\ ] [color {\it c}\ ] [hei {\it v}\ ]}]
+\index{ztitle}
+
+\begin{tabular}{ll}
+dist & Moves the title further away from the axis.\\
+color & Sets the color of the title.\\
+hei & Sets the hei in cm of the text used for the title.\\
+\end{tabular}
+
+\item[{\sf title "{\it main title}" [dist {\it v}\ ] [color {\it c}\ ]
+[hei {\it v}\ ] }]
+\index{title}
+
+\begin{tabular}{ll}
+dist & Moves the title further away from the axis.\\
+color & Sets the color of the title.\\
+hei & Sets the hei in cm of the text used for the title.\\
+\end{tabular}
+
+\item[{\sf rotate\ $\theta$\ $\phi$\ x }]
+\index{rotate}
+\begin{verbatim}
+rotate 10 20 30
+\end{verbatim}
+Imagine the unit cube is sitting on the front of your
+terminal screen, x along the bottom, y up the left hand
+side, and z coming towards you.
+
+The first number (10) rotates the cube along the xaxis, ie
+hold the right hand side of the cube and rotate your hand
+clockwise 10 degrees.
+
+The second number (20) rotates the cube along the yaxis, ie
+hold the top of the cube and rotate it 20 degrees clockwise.
+
+The third number is currently ignored.
+
+The default setting is 60 50 0.
+
+\item[{\sf view x y p }]
+\index{view}
+Sets the perspective, this is where the cube gets smaller
+as the lines dissappear towards infinity.
+
+x and y are the position of infinity on your screen.
+p is the degree of perspective, 0 = no perspective
+and with 1 the back edge of the box will be touching
+infinitiy. Good values are between 0 and 0.6
+
+\begin{minipage}[c]{8cm}
+\begin{Verbatim}
+begin surface
+ size 5 5
+ data "surf1.z"
+ zaxis min -1
+ rotate 85 85 0
+ view 0 5 0.7
+end surface
+\end{Verbatim}
+\end{minipage}
+\hfill
+\begin{minipage}[c]{7cm}
+\mbox{\includegraphics{utilities/fig/surf4}}
+\end{minipage}
+
+\item[{\sf top [off]\ [lstyle {\it n} \ ]\ [color {\it c}\ ] }]
+\index{top}
+Sets the features of the top of the surface.
+By default the top is on.
+
+(see also {\sf UNDERNEATH, XLINES, YLINES})
+
+\item[{\sf underneath [off]\ [lstyle {\it n} \ ]\ [color {\it c}\ ] }]
+\index{underneath}
+Sets the features of the under side of the surface.
+By default the underneath is off.
+
+(see also TOP, XLINES, YLINES)
+
+\item[{\sf back [zstep {\it v}\ ] [ystep {\it v}\ ] [lstyle {\it l}\ ] [color {\it c}\ ] [nohidden] }]
+\index{back}
+Draws a grid on the back face of the cube.
+
+By default hidden lines are removed but {\sf NOHIDDEN} will
+stop this from happenning.
+
+\item[{\sf base [xstep {\it v}\ ] [ystep {\it v}\ ] [lstyle {\it l}\ ] [color {\it c}\ ] [nohidden] }]
+\index{base}
+Draws a grid on the base of the cube.
+
+By default hidden lines are removed but {\sf NOHIDDEN} will
+stop this from happenning.
+
+\item[{\sf right [zstep {\it v}\ ] [xstep {\it v}\ ] [lstyle {\it l}\ ] [color {\it c}\ ] [nohidden] }]
+\index{right}
+Draws a grid on the right face of the cube.
+
+By default hidden lines are removed but {\sf NOHIDDEN} will
+stop this from happenning.
+
+\item[{\sf skirt on}]
+\index{skirt}
+Draws a skirt from the edge of the surface to {\sf ZMIN}.
+
+\begin{minipage}[c]{8cm}
+\begin{Verbatim}
+begin surface
+ size 5 5
+ data "surf1.z"
+ zaxis min -1 max 3
+ xtitle "X-axis"
+ ytitle "Y-axis"
+ ztitle "Z-axis"
+ points "surf3.dat"
+ riselines lstyle 2
+ marker fcircle
+ skirt on
+ rotate 60 35 0
+ view 2.5 3 0.6
+end surface
+\end{Verbatim}
+\end{minipage}
+\hfill
+\begin{minipage}[c]{7cm}
+\mbox{\includegraphics{utilities/fig/surf3}}
+\end{minipage}
+
+\item[{\sf points {\it myfile.dat} }]
+\index{points}
+Reads in a data file which must have 3 columns (x,y,z)
+
+This is then used for plotting markers and
+rise and drop lines.
+
+\item[{\sf marker {\it circle}\ [hei {\it v} \ ] [color {\it c} \ ]}]
+\index{marker}
+Draws markers at the co-ordinates read from the {\sf POINTS} file.
+
+\item[{\sf droplines [color {\it c}\ ] [lstyle{\it n}\ ] }]
+\index{droplines}
+Draws lines from the co-ordinates read from the {\sf POINTS} file
+down to zmin.
+
+\item[{\sf riselines [color {\it c}\ ] [lstyle {\it n}\ ]}]
+\index{riselines}
+Draws lines from the co-ordinates read from the {\sf POINTS} file
+up to zmax.
+
+\item[{\sf zclip [min {\it v1}\ ] [max {\it v2}\ ] }]
+\index{zclip}
+{\sf ZCLIP} goes through the Z array and sets any Z value smaller
+than {\sf MIN} to {\it v1} and sets any value greater
+than {\sf MAX} to {\it v2}.
+
+\end{commanddescription}
diff --git a/platform/autoconf/config.guess b/platform/autoconf/config.guess
new file mode 100755
index 0000000..115f944
--- /dev/null
+++ b/platform/autoconf/config.guess
@@ -0,0 +1,1502 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
+# Free Software Foundation, Inc.
+
+timestamp='2010-04-03'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Originally written by Per Bothner. Please send patches (context
+# diff format) to <config-patches at gnu.org> and include a ChangeLog
+# entry.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub. If it succeeds, it prints the system name on stdout, and
+# exits with 0. Otherwise, it exits with 1.
+#
+# You can get the latest version of this script from:
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+ -h, --help print this help, then exit
+ -t, --time-stamp print date of last modification, then exit
+ -v, --version print version number, then exit
+
+Report bugs and patches to <config-patches at gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free
+Software Foundation, Inc.
+
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+ case $1 in
+ --time-stamp | --time* | -t )
+ echo "$timestamp" ; exit ;;
+ --version | -v )
+ echo "$version" ; exit ;;
+ --help | --h* | -h )
+ echo "$usage"; exit ;;
+ -- ) # Stop option processing
+ shift; break ;;
+ - ) # Use stdin as input.
+ break ;;
+ -* )
+ echo "$me: invalid option $1$help" >&2
+ exit 1 ;;
+ * )
+ break ;;
+ esac
+done
+
+if test $# != 0; then
+ echo "$me: too many arguments$help" >&2
+ exit 1
+fi
+
+trap 'exit 1' HUP INT TERM
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+set_cc_for_build='
+trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" HUP INT PIPE TERM ;
+: ${TMPDIR=/tmp} ;
+ { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
+dummy=$tmp/dummy ;
+tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
+case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,) echo "int x;" > $dummy.c ;
+ for c in cc gcc c89 c99 ; do
+ if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
+ CC_FOR_BUILD="$c"; break ;
+ fi ;
+ done ;
+ if test x"$CC_FOR_BUILD" = x ; then
+ CC_FOR_BUILD=no_compiler_found ;
+ fi
+ ;;
+ ,,*) CC_FOR_BUILD=$CC ;;
+ ,*,*) CC_FOR_BUILD=$HOST_CC ;;
+esac ; set_cc_for_build= ;'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi at noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+ PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+ *:NetBSD:*:*)
+ # NetBSD (nbsd) targets should (where applicable) match one or
+ # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
+ # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently
+ # switched to ELF, *-*-netbsd* would select the old
+ # object file format. This provides both forward
+ # compatibility and a consistent mechanism for selecting the
+ # object file format.
+ #
+ # Note: NetBSD doesn't particularly care about the vendor
+ # portion of the name. We always set it to "unknown".
+ sysctl="sysctl -n hw.machine_arch"
+ UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
+ /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+ case "${UNAME_MACHINE_ARCH}" in
+ armeb) machine=armeb-unknown ;;
+ arm*) machine=arm-unknown ;;
+ sh3el) machine=shl-unknown ;;
+ sh3eb) machine=sh-unknown ;;
+ sh5el) machine=sh5le-unknown ;;
+ *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+ esac
+ # The Operating System including object format, if it has switched
+ # to ELF recently, or will in the future.
+ case "${UNAME_MACHINE_ARCH}" in
+ arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+ eval $set_cc_for_build
+ if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep -q __ELF__
+ then
+ # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+ # Return netbsd for either. FIX?
+ os=netbsd
+ else
+ os=netbsdelf
+ fi
+ ;;
+ *)
+ os=netbsd
+ ;;
+ esac
+ # The OS release
+ # Debian GNU/NetBSD machines have a different userland, and
+ # thus, need a distinct triplet. However, they do not need
+ # kernel version information, so it can be replaced with a
+ # suitable tag, in the style of linux-gnu.
+ case "${UNAME_VERSION}" in
+ Debian*)
+ release='-gnu'
+ ;;
+ *)
+ release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+ ;;
+ esac
+ # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+ # contains redundant information, the shorter form:
+ # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+ echo "${machine}-${os}${release}"
+ exit ;;
+ *:OpenBSD:*:*)
+ UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+ echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
+ exit ;;
+ *:ekkoBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
+ exit ;;
+ *:SolidBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
+ exit ;;
+ macppc:MirBSD:*:*)
+ echo powerpc-unknown-mirbsd${UNAME_RELEASE}
+ exit ;;
+ *:MirBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
+ exit ;;
+ alpha:OSF1:*:*)
+ case $UNAME_RELEASE in
+ *4.0)
+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+ ;;
+ *5.*)
+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+ ;;
+ esac
+ # According to Compaq, /usr/sbin/psrinfo has been available on
+ # OSF/1 and Tru64 systems produced since 1995. I hope that
+ # covers most systems running today. This code pipes the CPU
+ # types through head -n 1, so we only detect the type of CPU 0.
+ ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+ case "$ALPHA_CPU_TYPE" in
+ "EV4 (21064)")
+ UNAME_MACHINE="alpha" ;;
+ "EV4.5 (21064)")
+ UNAME_MACHINE="alpha" ;;
+ "LCA4 (21066/21068)")
+ UNAME_MACHINE="alpha" ;;
+ "EV5 (21164)")
+ UNAME_MACHINE="alphaev5" ;;
+ "EV5.6 (21164A)")
+ UNAME_MACHINE="alphaev56" ;;
+ "EV5.6 (21164PC)")
+ UNAME_MACHINE="alphapca56" ;;
+ "EV5.7 (21164PC)")
+ UNAME_MACHINE="alphapca57" ;;
+ "EV6 (21264)")
+ UNAME_MACHINE="alphaev6" ;;
+ "EV6.7 (21264A)")
+ UNAME_MACHINE="alphaev67" ;;
+ "EV6.8CB (21264C)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.8AL (21264B)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.8CX (21264D)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.9A (21264/EV69A)")
+ UNAME_MACHINE="alphaev69" ;;
+ "EV7 (21364)")
+ UNAME_MACHINE="alphaev7" ;;
+ "EV7.9 (21364A)")
+ UNAME_MACHINE="alphaev79" ;;
+ esac
+ # A Pn.n version is a patched version.
+ # A Vn.n version is a released version.
+ # A Tn.n version is a released field test version.
+ # A Xn.n version is an unreleased experimental baselevel.
+ # 1.2 uses "1.2" for uname -r.
+ echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+ exit ;;
+ Alpha\ *:Windows_NT*:*)
+ # How do we know it's Interix rather than the generic POSIX subsystem?
+ # Should we change UNAME_MACHINE based on the output of uname instead
+ # of the specific Alpha model?
+ echo alpha-pc-interix
+ exit ;;
+ 21064:Windows_NT:50:3)
+ echo alpha-dec-winnt3.5
+ exit ;;
+ Amiga*:UNIX_System_V:4.0:*)
+ echo m68k-unknown-sysv4
+ exit ;;
+ *:[Aa]miga[Oo][Ss]:*:*)
+ echo ${UNAME_MACHINE}-unknown-amigaos
+ exit ;;
+ *:[Mm]orph[Oo][Ss]:*:*)
+ echo ${UNAME_MACHINE}-unknown-morphos
+ exit ;;
+ *:OS/390:*:*)
+ echo i370-ibm-openedition
+ exit ;;
+ *:z/VM:*:*)
+ echo s390-ibm-zvmoe
+ exit ;;
+ *:OS400:*:*)
+ echo powerpc-ibm-os400
+ exit ;;
+ arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+ echo arm-acorn-riscix${UNAME_RELEASE}
+ exit ;;
+ arm:riscos:*:*|arm:RISCOS:*:*)
+ echo arm-unknown-riscos
+ exit ;;
+ SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+ echo hppa1.1-hitachi-hiuxmpp
+ exit ;;
+ Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+ # akee at wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+ if test "`(/bin/universe) 2>/dev/null`" = att ; then
+ echo pyramid-pyramid-sysv3
+ else
+ echo pyramid-pyramid-bsd
+ fi
+ exit ;;
+ NILE*:*:*:dcosx)
+ echo pyramid-pyramid-svr4
+ exit ;;
+ DRS?6000:unix:4.0:6*)
+ echo sparc-icl-nx6
+ exit ;;
+ DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+ case `/usr/bin/uname -p` in
+ sparc) echo sparc-icl-nx7; exit ;;
+ esac ;;
+ s390x:SunOS:*:*)
+ echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ sun4H:SunOS:5.*:*)
+ echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+ echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
+ echo i386-pc-auroraux${UNAME_RELEASE}
+ exit ;;
+ i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
+ eval $set_cc_for_build
+ SUN_ARCH="i386"
+ # If there is a compiler, see if it is configured for 64-bit objects.
+ # Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
+ # This test works for both compilers.
+ if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+ if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
+ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+ grep IS_64BIT_ARCH >/dev/null
+ then
+ SUN_ARCH="x86_64"
+ fi
+ fi
+ echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ sun4*:SunOS:6*:*)
+ # According to config.sub, this is the proper way to canonicalize
+ # SunOS6. Hard to guess exactly what SunOS6 will be like, but
+ # it's likely to be more like Solaris than SunOS4.
+ echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ sun4*:SunOS:*:*)
+ case "`/usr/bin/arch -k`" in
+ Series*|S4*)
+ UNAME_RELEASE=`uname -v`
+ ;;
+ esac
+ # Japanese Language versions have a version number like `4.1.3-JL'.
+ echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+ exit ;;
+ sun3*:SunOS:*:*)
+ echo m68k-sun-sunos${UNAME_RELEASE}
+ exit ;;
+ sun*:*:4.2BSD:*)
+ UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+ test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+ case "`/bin/arch`" in
+ sun3)
+ echo m68k-sun-sunos${UNAME_RELEASE}
+ ;;
+ sun4)
+ echo sparc-sun-sunos${UNAME_RELEASE}
+ ;;
+ esac
+ exit ;;
+ aushp:SunOS:*:*)
+ echo sparc-auspex-sunos${UNAME_RELEASE}
+ exit ;;
+ # The situation for MiNT is a little confusing. The machine name
+ # can be virtually everything (everything which is not
+ # "atarist" or "atariste" at least should have a processor
+ # > m68000). The system name ranges from "MiNT" over "FreeMiNT"
+ # to the lowercase version "mint" (or "freemint"). Finally
+ # the system name "TOS" denotes a system which is actually not
+ # MiNT. But MiNT is downward compatible to TOS, so this should
+ # be no problem.
+ atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit ;;
+ atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit ;;
+ *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit ;;
+ milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+ echo m68k-milan-mint${UNAME_RELEASE}
+ exit ;;
+ hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+ echo m68k-hades-mint${UNAME_RELEASE}
+ exit ;;
+ *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+ echo m68k-unknown-mint${UNAME_RELEASE}
+ exit ;;
+ m68k:machten:*:*)
+ echo m68k-apple-machten${UNAME_RELEASE}
+ exit ;;
+ powerpc:machten:*:*)
+ echo powerpc-apple-machten${UNAME_RELEASE}
+ exit ;;
+ RISC*:Mach:*:*)
+ echo mips-dec-mach_bsd4.3
+ exit ;;
+ RISC*:ULTRIX:*:*)
+ echo mips-dec-ultrix${UNAME_RELEASE}
+ exit ;;
+ VAX*:ULTRIX*:*:*)
+ echo vax-dec-ultrix${UNAME_RELEASE}
+ exit ;;
+ 2020:CLIX:*:* | 2430:CLIX:*:*)
+ echo clipper-intergraph-clix${UNAME_RELEASE}
+ exit ;;
+ mips:*:*:UMIPS | mips:*:*:RISCos)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h> /* for printf() prototype */
+ int main (int argc, char *argv[]) {
+#else
+ int main (argc, argv) int argc; char *argv[]; {
+#endif
+ #if defined (host_mips) && defined (MIPSEB)
+ #if defined (SYSTYPE_SYSV)
+ printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_SVR4)
+ printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+ printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+ #endif
+ #endif
+ exit (-1);
+ }
+EOF
+ $CC_FOR_BUILD -o $dummy $dummy.c &&
+ dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+ SYSTEM_NAME=`$dummy $dummyarg` &&
+ { echo "$SYSTEM_NAME"; exit; }
+ echo mips-mips-riscos${UNAME_RELEASE}
+ exit ;;
+ Motorola:PowerMAX_OS:*:*)
+ echo powerpc-motorola-powermax
+ exit ;;
+ Motorola:*:4.3:PL8-*)
+ echo powerpc-harris-powermax
+ exit ;;
+ Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+ echo powerpc-harris-powermax
+ exit ;;
+ Night_Hawk:Power_UNIX:*:*)
+ echo powerpc-harris-powerunix
+ exit ;;
+ m88k:CX/UX:7*:*)
+ echo m88k-harris-cxux7
+ exit ;;
+ m88k:*:4*:R4*)
+ echo m88k-motorola-sysv4
+ exit ;;
+ m88k:*:3*:R3*)
+ echo m88k-motorola-sysv3
+ exit ;;
+ AViiON:dgux:*:*)
+ # DG/UX returns AViiON for all architectures
+ UNAME_PROCESSOR=`/usr/bin/uname -p`
+ if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+ then
+ if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+ [ ${TARGET_BINARY_INTERFACE}x = x ]
+ then
+ echo m88k-dg-dgux${UNAME_RELEASE}
+ else
+ echo m88k-dg-dguxbcs${UNAME_RELEASE}
+ fi
+ else
+ echo i586-dg-dgux${UNAME_RELEASE}
+ fi
+ exit ;;
+ M88*:DolphinOS:*:*) # DolphinOS (SVR3)
+ echo m88k-dolphin-sysv3
+ exit ;;
+ M88*:*:R3*:*)
+ # Delta 88k system running SVR3
+ echo m88k-motorola-sysv3
+ exit ;;
+ XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+ echo m88k-tektronix-sysv3
+ exit ;;
+ Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+ echo m68k-tektronix-bsd
+ exit ;;
+ *:IRIX*:*:*)
+ echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+ exit ;;
+ ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+ echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
+ exit ;; # Note that: echo "'`uname -s`'" gives 'AIX '
+ i*86:AIX:*:*)
+ echo i386-ibm-aix
+ exit ;;
+ ia64:AIX:*:*)
+ if [ -x /usr/bin/oslevel ] ; then
+ IBM_REV=`/usr/bin/oslevel`
+ else
+ IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+ fi
+ echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+ exit ;;
+ *:AIX:2:3)
+ if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #include <sys/systemcfg.h>
+
+ main()
+ {
+ if (!__power_pc())
+ exit(1);
+ puts("powerpc-ibm-aix3.2.5");
+ exit(0);
+ }
+EOF
+ if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
+ then
+ echo "$SYSTEM_NAME"
+ else
+ echo rs6000-ibm-aix3.2.5
+ fi
+ elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+ echo rs6000-ibm-aix3.2.4
+ else
+ echo rs6000-ibm-aix3.2
+ fi
+ exit ;;
+ *:AIX:*:[456])
+ IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+ if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+ IBM_ARCH=rs6000
+ else
+ IBM_ARCH=powerpc
+ fi
+ if [ -x /usr/bin/oslevel ] ; then
+ IBM_REV=`/usr/bin/oslevel`
+ else
+ IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+ fi
+ echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+ exit ;;
+ *:AIX:*:*)
+ echo rs6000-ibm-aix
+ exit ;;
+ ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+ echo romp-ibm-bsd4.4
+ exit ;;
+ ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and
+ echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to
+ exit ;; # report: romp-ibm BSD 4.3
+ *:BOSX:*:*)
+ echo rs6000-bull-bosx
+ exit ;;
+ DPX/2?00:B.O.S.:*:*)
+ echo m68k-bull-sysv3
+ exit ;;
+ 9000/[34]??:4.3bsd:1.*:*)
+ echo m68k-hp-bsd
+ exit ;;
+ hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+ echo m68k-hp-bsd4.4
+ exit ;;
+ 9000/[34678]??:HP-UX:*:*)
+ HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+ case "${UNAME_MACHINE}" in
+ 9000/31? ) HP_ARCH=m68000 ;;
+ 9000/[34]?? ) HP_ARCH=m68k ;;
+ 9000/[678][0-9][0-9])
+ if [ -x /usr/bin/getconf ]; then
+ sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+ sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+ case "${sc_cpu_version}" in
+ 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+ 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+ 532) # CPU_PA_RISC2_0
+ case "${sc_kernel_bits}" in
+ 32) HP_ARCH="hppa2.0n" ;;
+ 64) HP_ARCH="hppa2.0w" ;;
+ '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20
+ esac ;;
+ esac
+ fi
+ if [ "${HP_ARCH}" = "" ]; then
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+
+ #define _HPUX_SOURCE
+ #include <stdlib.h>
+ #include <unistd.h>
+
+ int main ()
+ {
+ #if defined(_SC_KERNEL_BITS)
+ long bits = sysconf(_SC_KERNEL_BITS);
+ #endif
+ long cpu = sysconf (_SC_CPU_VERSION);
+
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+ case CPU_PA_RISC2_0:
+ #if defined(_SC_KERNEL_BITS)
+ switch (bits)
+ {
+ case 64: puts ("hppa2.0w"); break;
+ case 32: puts ("hppa2.0n"); break;
+ default: puts ("hppa2.0"); break;
+ } break;
+ #else /* !defined(_SC_KERNEL_BITS) */
+ puts ("hppa2.0"); break;
+ #endif
+ default: puts ("hppa1.0"); break;
+ }
+ exit (0);
+ }
+EOF
+ (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+ test -z "$HP_ARCH" && HP_ARCH=hppa
+ fi ;;
+ esac
+ if [ ${HP_ARCH} = "hppa2.0w" ]
+ then
+ eval $set_cc_for_build
+
+ # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+ # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler
+ # generating 64-bit code. GNU and HP use different nomenclature:
+ #
+ # $ CC_FOR_BUILD=cc ./config.guess
+ # => hppa2.0w-hp-hpux11.23
+ # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+ # => hppa64-hp-hpux11.23
+
+ if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
+ grep -q __LP64__
+ then
+ HP_ARCH="hppa2.0w"
+ else
+ HP_ARCH="hppa64"
+ fi
+ fi
+ echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+ exit ;;
+ ia64:HP-UX:*:*)
+ HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+ echo ia64-hp-hpux${HPUX_REV}
+ exit ;;
+ 3050*:HI-UX:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #include <unistd.h>
+ int
+ main ()
+ {
+ long cpu = sysconf (_SC_CPU_VERSION);
+ /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+ true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct
+ results, however. */
+ if (CPU_IS_PA_RISC (cpu))
+ {
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+ default: puts ("hppa-hitachi-hiuxwe2"); break;
+ }
+ }
+ else if (CPU_IS_HP_MC68K (cpu))
+ puts ("m68k-hitachi-hiuxwe2");
+ else puts ("unknown-hitachi-hiuxwe2");
+ exit (0);
+ }
+EOF
+ $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
+ { echo "$SYSTEM_NAME"; exit; }
+ echo unknown-hitachi-hiuxwe2
+ exit ;;
+ 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+ echo hppa1.1-hp-bsd
+ exit ;;
+ 9000/8??:4.3bsd:*:*)
+ echo hppa1.0-hp-bsd
+ exit ;;
+ *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+ echo hppa1.0-hp-mpeix
+ exit ;;
+ hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+ echo hppa1.1-hp-osf
+ exit ;;
+ hp8??:OSF1:*:*)
+ echo hppa1.0-hp-osf
+ exit ;;
+ i*86:OSF1:*:*)
+ if [ -x /usr/sbin/sysversion ] ; then
+ echo ${UNAME_MACHINE}-unknown-osf1mk
+ else
+ echo ${UNAME_MACHINE}-unknown-osf1
+ fi
+ exit ;;
+ parisc*:Lites*:*:*)
+ echo hppa1.1-hp-lites
+ exit ;;
+ C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+ echo c1-convex-bsd
+ exit ;;
+ C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+ exit ;;
+ C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+ echo c34-convex-bsd
+ exit ;;
+ C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+ echo c38-convex-bsd
+ exit ;;
+ C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+ echo c4-convex-bsd
+ exit ;;
+ CRAY*Y-MP:*:*:*)
+ echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*[A-Z]90:*:*:*)
+ echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+ -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*TS:*:*:*)
+ echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*T3E:*:*:*)
+ echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*SV1:*:*:*)
+ echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ *:UNICOS/mp:*:*)
+ echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+ FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+ FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+ FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+ echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+ exit ;;
+ 5000:UNIX_System_V:4.*:*)
+ FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+ FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+ echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+ exit ;;
+ i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+ echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+ exit ;;
+ sparc*:BSD/OS:*:*)
+ echo sparc-unknown-bsdi${UNAME_RELEASE}
+ exit ;;
+ *:BSD/OS:*:*)
+ echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+ exit ;;
+ *:FreeBSD:*:*)
+ case ${UNAME_MACHINE} in
+ pc98)
+ echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+ amd64)
+ echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+ *)
+ echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+ esac
+ exit ;;
+ i*:CYGWIN*:*)
+ echo ${UNAME_MACHINE}-pc-cygwin
+ exit ;;
+ *:MINGW*:*)
+ echo ${UNAME_MACHINE}-pc-mingw32
+ exit ;;
+ i*:windows32*:*)
+ # uname -m includes "-pc" on this system.
+ echo ${UNAME_MACHINE}-mingw32
+ exit ;;
+ i*:PW*:*)
+ echo ${UNAME_MACHINE}-pc-pw32
+ exit ;;
+ *:Interix*:*)
+ case ${UNAME_MACHINE} in
+ x86)
+ echo i586-pc-interix${UNAME_RELEASE}
+ exit ;;
+ authenticamd | genuineintel | EM64T)
+ echo x86_64-unknown-interix${UNAME_RELEASE}
+ exit ;;
+ IA64)
+ echo ia64-unknown-interix${UNAME_RELEASE}
+ exit ;;
+ esac ;;
+ [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
+ echo i${UNAME_MACHINE}-pc-mks
+ exit ;;
+ 8664:Windows_NT:*)
+ echo x86_64-pc-mks
+ exit ;;
+ i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+ # How do we know it's Interix rather than the generic POSIX subsystem?
+ # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+ # UNAME_MACHINE based on the output of uname instead of i386?
+ echo i586-pc-interix
+ exit ;;
+ i*:UWIN*:*)
+ echo ${UNAME_MACHINE}-pc-uwin
+ exit ;;
+ amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+ echo x86_64-unknown-cygwin
+ exit ;;
+ p*:CYGWIN*:*)
+ echo powerpcle-unknown-cygwin
+ exit ;;
+ prep*:SunOS:5.*:*)
+ echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ *:GNU:*:*)
+ # the GNU system
+ echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+ exit ;;
+ *:GNU/*:*:*)
+ # other systems with GNU libc and userland
+ echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
+ exit ;;
+ i*86:Minix:*:*)
+ echo ${UNAME_MACHINE}-pc-minix
+ exit ;;
+ alpha:Linux:*:*)
+ case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+ EV5) UNAME_MACHINE=alphaev5 ;;
+ EV56) UNAME_MACHINE=alphaev56 ;;
+ PCA56) UNAME_MACHINE=alphapca56 ;;
+ PCA57) UNAME_MACHINE=alphapca56 ;;
+ EV6) UNAME_MACHINE=alphaev6 ;;
+ EV67) UNAME_MACHINE=alphaev67 ;;
+ EV68*) UNAME_MACHINE=alphaev68 ;;
+ esac
+ objdump --private-headers /bin/sh | grep -q ld.so.1
+ if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+ echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+ exit ;;
+ arm*:Linux:*:*)
+ eval $set_cc_for_build
+ if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep -q __ARM_EABI__
+ then
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ else
+ echo ${UNAME_MACHINE}-unknown-linux-gnueabi
+ fi
+ exit ;;
+ avr32*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ cris:Linux:*:*)
+ echo cris-axis-linux-gnu
+ exit ;;
+ crisv32:Linux:*:*)
+ echo crisv32-axis-linux-gnu
+ exit ;;
+ frv:Linux:*:*)
+ echo frv-unknown-linux-gnu
+ exit ;;
+ i*86:Linux:*:*)
+ LIBC=gnu
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #ifdef __dietlibc__
+ LIBC=dietlibc
+ #endif
+EOF
+ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
+ echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
+ exit ;;
+ ia64:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ m32r*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ m68*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ mips:Linux:*:* | mips64:Linux:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #undef CPU
+ #undef ${UNAME_MACHINE}
+ #undef ${UNAME_MACHINE}el
+ #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+ CPU=${UNAME_MACHINE}el
+ #else
+ #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+ CPU=${UNAME_MACHINE}
+ #else
+ CPU=
+ #endif
+ #endif
+EOF
+ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
+ test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+ ;;
+ or32:Linux:*:*)
+ echo or32-unknown-linux-gnu
+ exit ;;
+ padre:Linux:*:*)
+ echo sparc-unknown-linux-gnu
+ exit ;;
+ parisc64:Linux:*:* | hppa64:Linux:*:*)
+ echo hppa64-unknown-linux-gnu
+ exit ;;
+ parisc:Linux:*:* | hppa:Linux:*:*)
+ # Look for CPU level
+ case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+ PA7*) echo hppa1.1-unknown-linux-gnu ;;
+ PA8*) echo hppa2.0-unknown-linux-gnu ;;
+ *) echo hppa-unknown-linux-gnu ;;
+ esac
+ exit ;;
+ ppc64:Linux:*:*)
+ echo powerpc64-unknown-linux-gnu
+ exit ;;
+ ppc:Linux:*:*)
+ echo powerpc-unknown-linux-gnu
+ exit ;;
+ s390:Linux:*:* | s390x:Linux:*:*)
+ echo ${UNAME_MACHINE}-ibm-linux
+ exit ;;
+ sh64*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ sh*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ sparc:Linux:*:* | sparc64:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ vax:Linux:*:*)
+ echo ${UNAME_MACHINE}-dec-linux-gnu
+ exit ;;
+ x86_64:Linux:*:*)
+ echo x86_64-unknown-linux-gnu
+ exit ;;
+ xtensa*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ i*86:DYNIX/ptx:4*:*)
+ # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+ # earlier versions are messed up and put the nodename in both
+ # sysname and nodename.
+ echo i386-sequent-sysv4
+ exit ;;
+ i*86:UNIX_SV:4.2MP:2.*)
+ # Unixware is an offshoot of SVR4, but it has its own version
+ # number series starting with 2...
+ # I am not positive that other SVR4 systems won't match this,
+ # I just have to hope. -- rms.
+ # Use sysv4.2uw... so that sysv4* matches it.
+ echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+ exit ;;
+ i*86:OS/2:*:*)
+ # If we were able to find `uname', then EMX Unix compatibility
+ # is probably installed.
+ echo ${UNAME_MACHINE}-pc-os2-emx
+ exit ;;
+ i*86:XTS-300:*:STOP)
+ echo ${UNAME_MACHINE}-unknown-stop
+ exit ;;
+ i*86:atheos:*:*)
+ echo ${UNAME_MACHINE}-unknown-atheos
+ exit ;;
+ i*86:syllable:*:*)
+ echo ${UNAME_MACHINE}-pc-syllable
+ exit ;;
+ i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
+ echo i386-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ i*86:*DOS:*:*)
+ echo ${UNAME_MACHINE}-pc-msdosdjgpp
+ exit ;;
+ i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+ UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+ if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+ echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+ else
+ echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+ fi
+ exit ;;
+ i*86:*:5:[678]*)
+ # UnixWare 7.x, OpenUNIX and OpenServer 6.
+ case `/bin/uname -X | grep "^Machine"` in
+ *486*) UNAME_MACHINE=i486 ;;
+ *Pentium) UNAME_MACHINE=i586 ;;
+ *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+ esac
+ echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+ exit ;;
+ i*86:*:3.2:*)
+ if test -f /usr/options/cb.name; then
+ UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+ echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+ elif /bin/uname -X 2>/dev/null >/dev/null ; then
+ UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+ (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+ (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+ && UNAME_MACHINE=i586
+ (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+ && UNAME_MACHINE=i686
+ (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+ && UNAME_MACHINE=i686
+ echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+ else
+ echo ${UNAME_MACHINE}-pc-sysv32
+ fi
+ exit ;;
+ pc:*:*:*)
+ # Left here for compatibility:
+ # uname -m prints for DJGPP always 'pc', but it prints nothing about
+ # the processor, so we play safe by assuming i586.
+ # Note: whatever this is, it MUST be the same as what config.sub
+ # prints for the "djgpp" host, or else GDB configury will decide that
+ # this is a cross-build.
+ echo i586-pc-msdosdjgpp
+ exit ;;
+ Intel:Mach:3*:*)
+ echo i386-pc-mach3
+ exit ;;
+ paragon:*:*:*)
+ echo i860-intel-osf1
+ exit ;;
+ i860:*:4.*:*) # i860-SVR4
+ if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+ echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+ else # Add other i860-SVR4 vendors below as they are discovered.
+ echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4
+ fi
+ exit ;;
+ mini*:CTIX:SYS*5:*)
+ # "miniframe"
+ echo m68010-convergent-sysv
+ exit ;;
+ mc68k:UNIX:SYSTEM5:3.51m)
+ echo m68k-convergent-sysv
+ exit ;;
+ M680?0:D-NIX:5.3:*)
+ echo m68k-diab-dnix
+ exit ;;
+ M68*:*:R3V[5678]*:*)
+ test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+ 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
+ OS_REL=''
+ test -r /etc/.relid \
+ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+ /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+ 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && { echo i486-ncr-sysv4; exit; } ;;
+ NCR*:*:4.2:* | MPRAS*:*:4.2:*)
+ OS_REL='.3'
+ test -r /etc/.relid \
+ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+ /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+ && { echo i586-ncr-sysv4.3${OS_REL}; exit; }
+ /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
+ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+ m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+ echo m68k-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ mc68030:UNIX_System_V:4.*:*)
+ echo m68k-atari-sysv4
+ exit ;;
+ TSUNAMI:LynxOS:2.*:*)
+ echo sparc-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ rs6000:LynxOS:2.*:*)
+ echo rs6000-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
+ echo powerpc-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ SM[BE]S:UNIX_SV:*:*)
+ echo mips-dde-sysv${UNAME_RELEASE}
+ exit ;;
+ RM*:ReliantUNIX-*:*:*)
+ echo mips-sni-sysv4
+ exit ;;
+ RM*:SINIX-*:*:*)
+ echo mips-sni-sysv4
+ exit ;;
+ *:SINIX-*:*:*)
+ if uname -p 2>/dev/null >/dev/null ; then
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ echo ${UNAME_MACHINE}-sni-sysv4
+ else
+ echo ns32k-sni-sysv
+ fi
+ exit ;;
+ PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+ # says <Richard.M.Bartel at ccMail.Census.GOV>
+ echo i586-unisys-sysv4
+ exit ;;
+ *:UNIX_System_V:4*:FTX*)
+ # From Gerald Hewes <hewes at openmarket.com>.
+ # How about differentiating between stratus architectures? -djm
+ echo hppa1.1-stratus-sysv4
+ exit ;;
+ *:*:*:FTX*)
+ # From seanf at swdc.stratus.com.
+ echo i860-stratus-sysv4
+ exit ;;
+ i*86:VOS:*:*)
+ # From Paul.Green at stratus.com.
+ echo ${UNAME_MACHINE}-stratus-vos
+ exit ;;
+ *:VOS:*:*)
+ # From Paul.Green at stratus.com.
+ echo hppa1.1-stratus-vos
+ exit ;;
+ mc68*:A/UX:*:*)
+ echo m68k-apple-aux${UNAME_RELEASE}
+ exit ;;
+ news*:NEWS-OS:6*:*)
+ echo mips-sony-newsos6
+ exit ;;
+ R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+ if [ -d /usr/nec ]; then
+ echo mips-nec-sysv${UNAME_RELEASE}
+ else
+ echo mips-unknown-sysv${UNAME_RELEASE}
+ fi
+ exit ;;
+ BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only.
+ echo powerpc-be-beos
+ exit ;;
+ BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only.
+ echo powerpc-apple-beos
+ exit ;;
+ BePC:BeOS:*:*) # BeOS running on Intel PC compatible.
+ echo i586-pc-beos
+ exit ;;
+ BePC:Haiku:*:*) # Haiku running on Intel PC compatible.
+ echo i586-pc-haiku
+ exit ;;
+ SX-4:SUPER-UX:*:*)
+ echo sx4-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-5:SUPER-UX:*:*)
+ echo sx5-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-6:SUPER-UX:*:*)
+ echo sx6-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-7:SUPER-UX:*:*)
+ echo sx7-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-8:SUPER-UX:*:*)
+ echo sx8-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-8R:SUPER-UX:*:*)
+ echo sx8r-nec-superux${UNAME_RELEASE}
+ exit ;;
+ Power*:Rhapsody:*:*)
+ echo powerpc-apple-rhapsody${UNAME_RELEASE}
+ exit ;;
+ *:Rhapsody:*:*)
+ echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+ exit ;;
+ *:Darwin:*:*)
+ UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
+ case $UNAME_PROCESSOR in
+ i386)
+ eval $set_cc_for_build
+ if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+ if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+ grep IS_64BIT_ARCH >/dev/null
+ then
+ UNAME_PROCESSOR="x86_64"
+ fi
+ fi ;;
+ unknown) UNAME_PROCESSOR=powerpc ;;
+ esac
+ echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
+ exit ;;
+ *:procnto*:*:* | *:QNX:[0123456789]*:*)
+ UNAME_PROCESSOR=`uname -p`
+ if test "$UNAME_PROCESSOR" = "x86"; then
+ UNAME_PROCESSOR=i386
+ UNAME_MACHINE=pc
+ fi
+ echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
+ exit ;;
+ *:QNX:*:4*)
+ echo i386-pc-qnx
+ exit ;;
+ NSE-?:NONSTOP_KERNEL:*:*)
+ echo nse-tandem-nsk${UNAME_RELEASE}
+ exit ;;
+ NSR-?:NONSTOP_KERNEL:*:*)
+ echo nsr-tandem-nsk${UNAME_RELEASE}
+ exit ;;
+ *:NonStop-UX:*:*)
+ echo mips-compaq-nonstopux
+ exit ;;
+ BS2000:POSIX*:*:*)
+ echo bs2000-siemens-sysv
+ exit ;;
+ DS/*:UNIX_System_V:*:*)
+ echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+ exit ;;
+ *:Plan9:*:*)
+ # "uname -m" is not consistent, so use $cputype instead. 386
+ # is converted to i386 for consistency with other x86
+ # operating systems.
+ if test "$cputype" = "386"; then
+ UNAME_MACHINE=i386
+ else
+ UNAME_MACHINE="$cputype"
+ fi
+ echo ${UNAME_MACHINE}-unknown-plan9
+ exit ;;
+ *:TOPS-10:*:*)
+ echo pdp10-unknown-tops10
+ exit ;;
+ *:TENEX:*:*)
+ echo pdp10-unknown-tenex
+ exit ;;
+ KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+ echo pdp10-dec-tops20
+ exit ;;
+ XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+ echo pdp10-xkl-tops20
+ exit ;;
+ *:TOPS-20:*:*)
+ echo pdp10-unknown-tops20
+ exit ;;
+ *:ITS:*:*)
+ echo pdp10-unknown-its
+ exit ;;
+ SEI:*:*:SEIUX)
+ echo mips-sei-seiux${UNAME_RELEASE}
+ exit ;;
+ *:DragonFly:*:*)
+ echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+ exit ;;
+ *:*VMS:*:*)
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ case "${UNAME_MACHINE}" in
+ A*) echo alpha-dec-vms ; exit ;;
+ I*) echo ia64-dec-vms ; exit ;;
+ V*) echo vax-dec-vms ; exit ;;
+ esac ;;
+ *:XENIX:*:SysV)
+ echo i386-pc-xenix
+ exit ;;
+ i*86:skyos:*:*)
+ echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
+ exit ;;
+ i*86:rdos:*:*)
+ echo ${UNAME_MACHINE}-pc-rdos
+ exit ;;
+ i*86:AROS:*:*)
+ echo ${UNAME_MACHINE}-pc-aros
+ exit ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+eval $set_cc_for_build
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+ /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed,
+ I don't know.... */
+ printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+ printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+ "4"
+#else
+ ""
+#endif
+ ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+ printf ("arm-acorn-riscix\n"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+ printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+ int version;
+ version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+ if (version < 4)
+ printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+ else
+ printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+ exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+ printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+ printf ("ns32k-encore-mach\n"); exit (0);
+#else
+ printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+ printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+ printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+ printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+ struct utsname un;
+
+ uname(&un);
+
+ if (strncmp(un.version, "V2", 2) == 0) {
+ printf ("i386-sequent-ptx2\n"); exit (0);
+ }
+ if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+ printf ("i386-sequent-ptx1\n"); exit (0);
+ }
+ printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+# if !defined (ultrix)
+# include <sys/param.h>
+# if defined (BSD)
+# if BSD == 43
+ printf ("vax-dec-bsd4.3\n"); exit (0);
+# else
+# if BSD == 199006
+ printf ("vax-dec-bsd4.3reno\n"); exit (0);
+# else
+ printf ("vax-dec-bsd\n"); exit (0);
+# endif
+# endif
+# else
+ printf ("vax-dec-bsd\n"); exit (0);
+# endif
+# else
+ printf ("vax-dec-ultrix\n"); exit (0);
+# endif
+#endif
+
+#if defined (alliant) && defined (i860)
+ printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+ exit (1);
+}
+EOF
+
+$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
+ { echo "$SYSTEM_NAME"; exit; }
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+ case `getsysinfo -f cpu_type` in
+ c1*)
+ echo c1-convex-bsd
+ exit ;;
+ c2*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+ exit ;;
+ c34*)
+ echo c34-convex-bsd
+ exit ;;
+ c38*)
+ echo c38-convex-bsd
+ exit ;;
+ c4*)
+ echo c4-convex-bsd
+ exit ;;
+ esac
+fi
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+ http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+and
+ http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches at gnu.org> in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo = `(hostinfo) 2>/dev/null`
+/bin/universe = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/platform/autoconf/config.sub b/platform/autoconf/config.sub
new file mode 100755
index 0000000..204218c
--- /dev/null
+++ b/platform/autoconf/config.sub
@@ -0,0 +1,1731 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
+# Free Software Foundation, Inc.
+
+timestamp='2010-05-21'
+
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine. It does not imply ALL GNU software can.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Please send patches to <config-patches at gnu.org>. Submit a context
+# diff and a properly formatted GNU ChangeLog entry.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# You can get the latest version of this script from:
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support. The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+ $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+ -h, --help print this help, then exit
+ -t, --time-stamp print date of last modification, then exit
+ -v, --version print version number, then exit
+
+Report bugs and patches to <config-patches at gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free
+Software Foundation, Inc.
+
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+ case $1 in
+ --time-stamp | --time* | -t )
+ echo "$timestamp" ; exit ;;
+ --version | -v )
+ echo "$version" ; exit ;;
+ --help | --h* | -h )
+ echo "$usage"; exit ;;
+ -- ) # Stop option processing
+ shift; break ;;
+ - ) # Use stdin as input.
+ break ;;
+ -* )
+ echo "$me: invalid option $1$help"
+ exit 1 ;;
+
+ *local*)
+ # First pass through any local machine types.
+ echo $1
+ exit ;;
+
+ * )
+ break ;;
+ esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+ exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+ exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+ nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
+ linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
+ knetbsd*-gnu* | netbsd*-gnu* | \
+ kopensolaris*-gnu* | \
+ storm-chaos* | os2-emx* | rtmk-nova*)
+ os=-$maybe_os
+ basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+ ;;
+ *)
+ basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+ if [ $basic_machine != $1 ]
+ then os=`echo $1 | sed 's/.*-/-/'`
+ else os=; fi
+ ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work. We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+ -sun*os*)
+ # Prevent following clause from handling this invalid input.
+ ;;
+ -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+ -apple | -axis | -knuth | -cray | -microblaze)
+ os=
+ basic_machine=$1
+ ;;
+ -bluegene*)
+ os=-cnk
+ ;;
+ -sim | -cisco | -oki | -wec | -winbond)
+ os=
+ basic_machine=$1
+ ;;
+ -scout)
+ ;;
+ -wrs)
+ os=-vxworks
+ basic_machine=$1
+ ;;
+ -chorusos*)
+ os=-chorusos
+ basic_machine=$1
+ ;;
+ -chorusrdb)
+ os=-chorusrdb
+ basic_machine=$1
+ ;;
+ -hiux*)
+ os=-hiuxwe2
+ ;;
+ -sco6)
+ os=-sco5v6
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco5)
+ os=-sco3.2v5
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco4)
+ os=-sco3.2v4
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco3.2.[4-9]*)
+ os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco3.2v[4-9]*)
+ # Don't forget version if it is 3.2v4 or newer.
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco5v6*)
+ # Don't forget version if it is 3.2v4 or newer.
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco*)
+ os=-sco3.2v2
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -udk*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -isc)
+ os=-isc2.2
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -clix*)
+ basic_machine=clipper-intergraph
+ ;;
+ -isc*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -lynx*)
+ os=-lynxos
+ ;;
+ -ptx*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+ ;;
+ -windowsnt*)
+ os=`echo $os | sed -e 's/windowsnt/winnt/'`
+ ;;
+ -psos*)
+ os=-psos
+ ;;
+ -mint | -mint[0-9]*)
+ basic_machine=m68k-atari
+ os=-mint
+ ;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+ # Recognize the basic CPU types without company name.
+ # Some are omitted here because they have special meanings below.
+ 1750a | 580 \
+ | a29k \
+ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+ | am33_2.0 \
+ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
+ | bfin \
+ | c4x | clipper \
+ | d10v | d30v | dlx | dsp16xx \
+ | fido | fr30 | frv \
+ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+ | i370 | i860 | i960 | ia64 \
+ | ip2k | iq2000 \
+ | lm32 \
+ | m32c | m32r | m32rle | m68000 | m68k | m88k \
+ | maxq | mb | microblaze | mcore | mep | metag \
+ | mips | mipsbe | mipseb | mipsel | mipsle \
+ | mips16 \
+ | mips64 | mips64el \
+ | mips64octeon | mips64octeonel \
+ | mips64orion | mips64orionel \
+ | mips64r5900 | mips64r5900el \
+ | mips64vr | mips64vrel \
+ | mips64vr4100 | mips64vr4100el \
+ | mips64vr4300 | mips64vr4300el \
+ | mips64vr5000 | mips64vr5000el \
+ | mips64vr5900 | mips64vr5900el \
+ | mipsisa32 | mipsisa32el \
+ | mipsisa32r2 | mipsisa32r2el \
+ | mipsisa64 | mipsisa64el \
+ | mipsisa64r2 | mipsisa64r2el \
+ | mipsisa64sb1 | mipsisa64sb1el \
+ | mipsisa64sr71k | mipsisa64sr71kel \
+ | mipstx39 | mipstx39el \
+ | mn10200 | mn10300 \
+ | moxie \
+ | mt \
+ | msp430 \
+ | nios | nios2 \
+ | ns16k | ns32k \
+ | or32 \
+ | pdp10 | pdp11 | pj | pjl \
+ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+ | pyramid \
+ | rx \
+ | score \
+ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+ | sh64 | sh64le \
+ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
+ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \
+ | spu | strongarm \
+ | tahoe | thumb | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
+ | ubicom32 \
+ | v850 | v850e \
+ | we32k \
+ | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \
+ | z8k | z80)
+ basic_machine=$basic_machine-unknown
+ ;;
+ c54x)
+ basic_machine=tic54x-unknown
+ ;;
+ c55x)
+ basic_machine=tic55x-unknown
+ ;;
+ c6x)
+ basic_machine=tic6x-unknown
+ ;;
+ m6811 | m68hc11 | m6812 | m68hc12 | picochip)
+ # Motorola 68HC11/12.
+ basic_machine=$basic_machine-unknown
+ os=-none
+ ;;
+ m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+ ;;
+ ms1)
+ basic_machine=mt-unknown
+ ;;
+
+ # We use `pc' rather than `unknown'
+ # because (1) that's what they normally are, and
+ # (2) the word "unknown" tends to confuse beginning users.
+ i*86 | x86_64)
+ basic_machine=$basic_machine-pc
+ ;;
+ # Object if more than one company name word.
+ *-*-*)
+ echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+ exit 1
+ ;;
+ # Recognize the basic CPU types with company name.
+ 580-* \
+ | a29k-* \
+ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \
+ | avr-* | avr32-* \
+ | bfin-* | bs2000-* \
+ | c[123]* | c30-* | [cjt]90-* | c4x-* \
+ | clipper-* | craynv-* | cydra-* \
+ | d10v-* | d30v-* | dlx-* \
+ | elxsi-* \
+ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
+ | h8300-* | h8500-* \
+ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+ | i*86-* | i860-* | i960-* | ia64-* \
+ | ip2k-* | iq2000-* \
+ | lm32-* \
+ | m32c-* | m32r-* | m32rle-* \
+ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \
+ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+ | mips16-* \
+ | mips64-* | mips64el-* \
+ | mips64octeon-* | mips64octeonel-* \
+ | mips64orion-* | mips64orionel-* \
+ | mips64r5900-* | mips64r5900el-* \
+ | mips64vr-* | mips64vrel-* \
+ | mips64vr4100-* | mips64vr4100el-* \
+ | mips64vr4300-* | mips64vr4300el-* \
+ | mips64vr5000-* | mips64vr5000el-* \
+ | mips64vr5900-* | mips64vr5900el-* \
+ | mipsisa32-* | mipsisa32el-* \
+ | mipsisa32r2-* | mipsisa32r2el-* \
+ | mipsisa64-* | mipsisa64el-* \
+ | mipsisa64r2-* | mipsisa64r2el-* \
+ | mipsisa64sb1-* | mipsisa64sb1el-* \
+ | mipsisa64sr71k-* | mipsisa64sr71kel-* \
+ | mipstx39-* | mipstx39el-* \
+ | mmix-* \
+ | mt-* \
+ | msp430-* \
+ | nios-* | nios2-* \
+ | none-* | np1-* | ns16k-* | ns32k-* \
+ | orion-* \
+ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+ | pyramid-* \
+ | romp-* | rs6000-* | rx-* \
+ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
+ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
+ | sparclite-* \
+ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
+ | tahoe-* | thumb-* \
+ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+ | tile-* | tilegx-* \
+ | tron-* \
+ | ubicom32-* \
+ | v850-* | v850e-* | vax-* \
+ | we32k-* \
+ | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \
+ | xstormy16-* | xtensa*-* \
+ | ymp-* \
+ | z8k-* | z80-*)
+ ;;
+ # Recognize the basic CPU types without company name, with glob match.
+ xtensa*)
+ basic_machine=$basic_machine-unknown
+ ;;
+ # Recognize the various machine names and aliases which stand
+ # for a CPU type and a company and sometimes even an OS.
+ 386bsd)
+ basic_machine=i386-unknown
+ os=-bsd
+ ;;
+ 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+ basic_machine=m68000-att
+ ;;
+ 3b*)
+ basic_machine=we32k-att
+ ;;
+ a29khif)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ abacus)
+ basic_machine=abacus-unknown
+ ;;
+ adobe68k)
+ basic_machine=m68010-adobe
+ os=-scout
+ ;;
+ alliant | fx80)
+ basic_machine=fx80-alliant
+ ;;
+ altos | altos3068)
+ basic_machine=m68k-altos
+ ;;
+ am29k)
+ basic_machine=a29k-none
+ os=-bsd
+ ;;
+ amd64)
+ basic_machine=x86_64-pc
+ ;;
+ amd64-*)
+ basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ amdahl)
+ basic_machine=580-amdahl
+ os=-sysv
+ ;;
+ amiga | amiga-*)
+ basic_machine=m68k-unknown
+ ;;
+ amigaos | amigados)
+ basic_machine=m68k-unknown
+ os=-amigaos
+ ;;
+ amigaunix | amix)
+ basic_machine=m68k-unknown
+ os=-sysv4
+ ;;
+ apollo68)
+ basic_machine=m68k-apollo
+ os=-sysv
+ ;;
+ apollo68bsd)
+ basic_machine=m68k-apollo
+ os=-bsd
+ ;;
+ aros)
+ basic_machine=i386-pc
+ os=-aros
+ ;;
+ aux)
+ basic_machine=m68k-apple
+ os=-aux
+ ;;
+ balance)
+ basic_machine=ns32k-sequent
+ os=-dynix
+ ;;
+ blackfin)
+ basic_machine=bfin-unknown
+ os=-linux
+ ;;
+ blackfin-*)
+ basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
+ os=-linux
+ ;;
+ bluegene*)
+ basic_machine=powerpc-ibm
+ os=-cnk
+ ;;
+ c54x-*)
+ basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ c55x-*)
+ basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ c6x-*)
+ basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ c90)
+ basic_machine=c90-cray
+ os=-unicos
+ ;;
+ cegcc)
+ basic_machine=arm-unknown
+ os=-cegcc
+ ;;
+ convex-c1)
+ basic_machine=c1-convex
+ os=-bsd
+ ;;
+ convex-c2)
+ basic_machine=c2-convex
+ os=-bsd
+ ;;
+ convex-c32)
+ basic_machine=c32-convex
+ os=-bsd
+ ;;
+ convex-c34)
+ basic_machine=c34-convex
+ os=-bsd
+ ;;
+ convex-c38)
+ basic_machine=c38-convex
+ os=-bsd
+ ;;
+ cray | j90)
+ basic_machine=j90-cray
+ os=-unicos
+ ;;
+ craynv)
+ basic_machine=craynv-cray
+ os=-unicosmp
+ ;;
+ cr16)
+ basic_machine=cr16-unknown
+ os=-elf
+ ;;
+ crds | unos)
+ basic_machine=m68k-crds
+ ;;
+ crisv32 | crisv32-* | etraxfs*)
+ basic_machine=crisv32-axis
+ ;;
+ cris | cris-* | etrax*)
+ basic_machine=cris-axis
+ ;;
+ crx)
+ basic_machine=crx-unknown
+ os=-elf
+ ;;
+ da30 | da30-*)
+ basic_machine=m68k-da30
+ ;;
+ decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+ basic_machine=mips-dec
+ ;;
+ decsystem10* | dec10*)
+ basic_machine=pdp10-dec
+ os=-tops10
+ ;;
+ decsystem20* | dec20*)
+ basic_machine=pdp10-dec
+ os=-tops20
+ ;;
+ delta | 3300 | motorola-3300 | motorola-delta \
+ | 3300-motorola | delta-motorola)
+ basic_machine=m68k-motorola
+ ;;
+ delta88)
+ basic_machine=m88k-motorola
+ os=-sysv3
+ ;;
+ dicos)
+ basic_machine=i686-pc
+ os=-dicos
+ ;;
+ djgpp)
+ basic_machine=i586-pc
+ os=-msdosdjgpp
+ ;;
+ dpx20 | dpx20-*)
+ basic_machine=rs6000-bull
+ os=-bosx
+ ;;
+ dpx2* | dpx2*-bull)
+ basic_machine=m68k-bull
+ os=-sysv3
+ ;;
+ ebmon29k)
+ basic_machine=a29k-amd
+ os=-ebmon
+ ;;
+ elxsi)
+ basic_machine=elxsi-elxsi
+ os=-bsd
+ ;;
+ encore | umax | mmax)
+ basic_machine=ns32k-encore
+ ;;
+ es1800 | OSE68k | ose68k | ose | OSE)
+ basic_machine=m68k-ericsson
+ os=-ose
+ ;;
+ fx2800)
+ basic_machine=i860-alliant
+ ;;
+ genix)
+ basic_machine=ns32k-ns
+ ;;
+ gmicro)
+ basic_machine=tron-gmicro
+ os=-sysv
+ ;;
+ go32)
+ basic_machine=i386-pc
+ os=-go32
+ ;;
+ h3050r* | hiux*)
+ basic_machine=hppa1.1-hitachi
+ os=-hiuxwe2
+ ;;
+ h8300hms)
+ basic_machine=h8300-hitachi
+ os=-hms
+ ;;
+ h8300xray)
+ basic_machine=h8300-hitachi
+ os=-xray
+ ;;
+ h8500hms)
+ basic_machine=h8500-hitachi
+ os=-hms
+ ;;
+ harris)
+ basic_machine=m88k-harris
+ os=-sysv3
+ ;;
+ hp300-*)
+ basic_machine=m68k-hp
+ ;;
+ hp300bsd)
+ basic_machine=m68k-hp
+ os=-bsd
+ ;;
+ hp300hpux)
+ basic_machine=m68k-hp
+ os=-hpux
+ ;;
+ hp3k9[0-9][0-9] | hp9[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hp9k2[0-9][0-9] | hp9k31[0-9])
+ basic_machine=m68000-hp
+ ;;
+ hp9k3[2-9][0-9])
+ basic_machine=m68k-hp
+ ;;
+ hp9k6[0-9][0-9] | hp6[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hp9k7[0-79][0-9] | hp7[0-79][0-9])
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k78[0-9] | hp78[0-9])
+ # FIXME: really hppa2.0-hp
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+ # FIXME: really hppa2.0-hp
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[0-9][13679] | hp8[0-9][13679])
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[0-9][0-9] | hp8[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hppa-next)
+ os=-nextstep3
+ ;;
+ hppaosf)
+ basic_machine=hppa1.1-hp
+ os=-osf
+ ;;
+ hppro)
+ basic_machine=hppa1.1-hp
+ os=-proelf
+ ;;
+ i370-ibm* | ibm*)
+ basic_machine=i370-ibm
+ ;;
+# I'm not sure what "Sysv32" means. Should this be sysv3.2?
+ i*86v32)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv32
+ ;;
+ i*86v4*)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv4
+ ;;
+ i*86v)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv
+ ;;
+ i*86sol2)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-solaris2
+ ;;
+ i386mach)
+ basic_machine=i386-mach
+ os=-mach
+ ;;
+ i386-vsta | vsta)
+ basic_machine=i386-unknown
+ os=-vsta
+ ;;
+ iris | iris4d)
+ basic_machine=mips-sgi
+ case $os in
+ -irix*)
+ ;;
+ *)
+ os=-irix4
+ ;;
+ esac
+ ;;
+ isi68 | isi)
+ basic_machine=m68k-isi
+ os=-sysv
+ ;;
+ m68knommu)
+ basic_machine=m68k-unknown
+ os=-linux
+ ;;
+ m68knommu-*)
+ basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
+ os=-linux
+ ;;
+ m88k-omron*)
+ basic_machine=m88k-omron
+ ;;
+ magnum | m3230)
+ basic_machine=mips-mips
+ os=-sysv
+ ;;
+ merlin)
+ basic_machine=ns32k-utek
+ os=-sysv
+ ;;
+ microblaze)
+ basic_machine=microblaze-xilinx
+ ;;
+ mingw32)
+ basic_machine=i386-pc
+ os=-mingw32
+ ;;
+ mingw32ce)
+ basic_machine=arm-unknown
+ os=-mingw32ce
+ ;;
+ miniframe)
+ basic_machine=m68000-convergent
+ ;;
+ *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+ basic_machine=m68k-atari
+ os=-mint
+ ;;
+ mips3*-*)
+ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+ ;;
+ mips3*)
+ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+ ;;
+ monitor)
+ basic_machine=m68k-rom68k
+ os=-coff
+ ;;
+ morphos)
+ basic_machine=powerpc-unknown
+ os=-morphos
+ ;;
+ msdos)
+ basic_machine=i386-pc
+ os=-msdos
+ ;;
+ ms1-*)
+ basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
+ ;;
+ mvs)
+ basic_machine=i370-ibm
+ os=-mvs
+ ;;
+ ncr3000)
+ basic_machine=i486-ncr
+ os=-sysv4
+ ;;
+ netbsd386)
+ basic_machine=i386-unknown
+ os=-netbsd
+ ;;
+ netwinder)
+ basic_machine=armv4l-rebel
+ os=-linux
+ ;;
+ news | news700 | news800 | news900)
+ basic_machine=m68k-sony
+ os=-newsos
+ ;;
+ news1000)
+ basic_machine=m68030-sony
+ os=-newsos
+ ;;
+ news-3600 | risc-news)
+ basic_machine=mips-sony
+ os=-newsos
+ ;;
+ necv70)
+ basic_machine=v70-nec
+ os=-sysv
+ ;;
+ next | m*-next )
+ basic_machine=m68k-next
+ case $os in
+ -nextstep* )
+ ;;
+ -ns2*)
+ os=-nextstep2
+ ;;
+ *)
+ os=-nextstep3
+ ;;
+ esac
+ ;;
+ nh3000)
+ basic_machine=m68k-harris
+ os=-cxux
+ ;;
+ nh[45]000)
+ basic_machine=m88k-harris
+ os=-cxux
+ ;;
+ nindy960)
+ basic_machine=i960-intel
+ os=-nindy
+ ;;
+ mon960)
+ basic_machine=i960-intel
+ os=-mon960
+ ;;
+ nonstopux)
+ basic_machine=mips-compaq
+ os=-nonstopux
+ ;;
+ np1)
+ basic_machine=np1-gould
+ ;;
+ nsr-tandem)
+ basic_machine=nsr-tandem
+ ;;
+ op50n-* | op60c-*)
+ basic_machine=hppa1.1-oki
+ os=-proelf
+ ;;
+ openrisc | openrisc-*)
+ basic_machine=or32-unknown
+ ;;
+ os400)
+ basic_machine=powerpc-ibm
+ os=-os400
+ ;;
+ OSE68000 | ose68000)
+ basic_machine=m68000-ericsson
+ os=-ose
+ ;;
+ os68k)
+ basic_machine=m68k-none
+ os=-os68k
+ ;;
+ pa-hitachi)
+ basic_machine=hppa1.1-hitachi
+ os=-hiuxwe2
+ ;;
+ paragon)
+ basic_machine=i860-intel
+ os=-osf
+ ;;
+ parisc)
+ basic_machine=hppa-unknown
+ os=-linux
+ ;;
+ parisc-*)
+ basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
+ os=-linux
+ ;;
+ pbd)
+ basic_machine=sparc-tti
+ ;;
+ pbb)
+ basic_machine=m68k-tti
+ ;;
+ pc532 | pc532-*)
+ basic_machine=ns32k-pc532
+ ;;
+ pc98)
+ basic_machine=i386-pc
+ ;;
+ pc98-*)
+ basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentium | p5 | k5 | k6 | nexgen | viac3)
+ basic_machine=i586-pc
+ ;;
+ pentiumpro | p6 | 6x86 | athlon | athlon_*)
+ basic_machine=i686-pc
+ ;;
+ pentiumii | pentium2 | pentiumiii | pentium3)
+ basic_machine=i686-pc
+ ;;
+ pentium4)
+ basic_machine=i786-pc
+ ;;
+ pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+ basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentiumpro-* | p6-* | 6x86-* | athlon-*)
+ basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+ basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentium4-*)
+ basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pn)
+ basic_machine=pn-gould
+ ;;
+ power) basic_machine=power-ibm
+ ;;
+ ppc) basic_machine=powerpc-unknown
+ ;;
+ ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppcle | powerpclittle | ppc-le | powerpc-little)
+ basic_machine=powerpcle-unknown
+ ;;
+ ppcle-* | powerpclittle-*)
+ basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppc64) basic_machine=powerpc64-unknown
+ ;;
+ ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+ basic_machine=powerpc64le-unknown
+ ;;
+ ppc64le-* | powerpc64little-*)
+ basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ps2)
+ basic_machine=i386-ibm
+ ;;
+ pw32)
+ basic_machine=i586-unknown
+ os=-pw32
+ ;;
+ rdos)
+ basic_machine=i386-pc
+ os=-rdos
+ ;;
+ rom68k)
+ basic_machine=m68k-rom68k
+ os=-coff
+ ;;
+ rm[46]00)
+ basic_machine=mips-siemens
+ ;;
+ rtpc | rtpc-*)
+ basic_machine=romp-ibm
+ ;;
+ s390 | s390-*)
+ basic_machine=s390-ibm
+ ;;
+ s390x | s390x-*)
+ basic_machine=s390x-ibm
+ ;;
+ sa29200)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ sb1)
+ basic_machine=mipsisa64sb1-unknown
+ ;;
+ sb1el)
+ basic_machine=mipsisa64sb1el-unknown
+ ;;
+ sde)
+ basic_machine=mipsisa32-sde
+ os=-elf
+ ;;
+ sei)
+ basic_machine=mips-sei
+ os=-seiux
+ ;;
+ sequent)
+ basic_machine=i386-sequent
+ ;;
+ sh)
+ basic_machine=sh-hitachi
+ os=-hms
+ ;;
+ sh5el)
+ basic_machine=sh5le-unknown
+ ;;
+ sh64)
+ basic_machine=sh64-unknown
+ ;;
+ sparclite-wrs | simso-wrs)
+ basic_machine=sparclite-wrs
+ os=-vxworks
+ ;;
+ sps7)
+ basic_machine=m68k-bull
+ os=-sysv2
+ ;;
+ spur)
+ basic_machine=spur-unknown
+ ;;
+ st2000)
+ basic_machine=m68k-tandem
+ ;;
+ stratus)
+ basic_machine=i860-stratus
+ os=-sysv4
+ ;;
+ sun2)
+ basic_machine=m68000-sun
+ ;;
+ sun2os3)
+ basic_machine=m68000-sun
+ os=-sunos3
+ ;;
+ sun2os4)
+ basic_machine=m68000-sun
+ os=-sunos4
+ ;;
+ sun3os3)
+ basic_machine=m68k-sun
+ os=-sunos3
+ ;;
+ sun3os4)
+ basic_machine=m68k-sun
+ os=-sunos4
+ ;;
+ sun4os3)
+ basic_machine=sparc-sun
+ os=-sunos3
+ ;;
+ sun4os4)
+ basic_machine=sparc-sun
+ os=-sunos4
+ ;;
+ sun4sol2)
+ basic_machine=sparc-sun
+ os=-solaris2
+ ;;
+ sun3 | sun3-*)
+ basic_machine=m68k-sun
+ ;;
+ sun4)
+ basic_machine=sparc-sun
+ ;;
+ sun386 | sun386i | roadrunner)
+ basic_machine=i386-sun
+ ;;
+ sv1)
+ basic_machine=sv1-cray
+ os=-unicos
+ ;;
+ symmetry)
+ basic_machine=i386-sequent
+ os=-dynix
+ ;;
+ t3e)
+ basic_machine=alphaev5-cray
+ os=-unicos
+ ;;
+ t90)
+ basic_machine=t90-cray
+ os=-unicos
+ ;;
+ # This must be matched before tile*.
+ tilegx*)
+ basic_machine=tilegx-unknown
+ os=-linux-gnu
+ ;;
+ tile*)
+ basic_machine=tile-unknown
+ os=-linux-gnu
+ ;;
+ tx39)
+ basic_machine=mipstx39-unknown
+ ;;
+ tx39el)
+ basic_machine=mipstx39el-unknown
+ ;;
+ toad1)
+ basic_machine=pdp10-xkl
+ os=-tops20
+ ;;
+ tower | tower-32)
+ basic_machine=m68k-ncr
+ ;;
+ tpf)
+ basic_machine=s390x-ibm
+ os=-tpf
+ ;;
+ udi29k)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ ultra3)
+ basic_machine=a29k-nyu
+ os=-sym1
+ ;;
+ v810 | necv810)
+ basic_machine=v810-nec
+ os=-none
+ ;;
+ vaxv)
+ basic_machine=vax-dec
+ os=-sysv
+ ;;
+ vms)
+ basic_machine=vax-dec
+ os=-vms
+ ;;
+ vpp*|vx|vx-*)
+ basic_machine=f301-fujitsu
+ ;;
+ vxworks960)
+ basic_machine=i960-wrs
+ os=-vxworks
+ ;;
+ vxworks68)
+ basic_machine=m68k-wrs
+ os=-vxworks
+ ;;
+ vxworks29k)
+ basic_machine=a29k-wrs
+ os=-vxworks
+ ;;
+ w65*)
+ basic_machine=w65-wdc
+ os=-none
+ ;;
+ w89k-*)
+ basic_machine=hppa1.1-winbond
+ os=-proelf
+ ;;
+ xbox)
+ basic_machine=i686-pc
+ os=-mingw32
+ ;;
+ xps | xps100)
+ basic_machine=xps100-honeywell
+ ;;
+ ymp)
+ basic_machine=ymp-cray
+ os=-unicos
+ ;;
+ z8k-*-coff)
+ basic_machine=z8k-unknown
+ os=-sim
+ ;;
+ z80-*-coff)
+ basic_machine=z80-unknown
+ os=-sim
+ ;;
+ none)
+ basic_machine=none-none
+ os=-none
+ ;;
+
+# Here we handle the default manufacturer of certain CPU types. It is in
+# some cases the only manufacturer, in others, it is the most popular.
+ w89k)
+ basic_machine=hppa1.1-winbond
+ ;;
+ op50n)
+ basic_machine=hppa1.1-oki
+ ;;
+ op60c)
+ basic_machine=hppa1.1-oki
+ ;;
+ romp)
+ basic_machine=romp-ibm
+ ;;
+ mmix)
+ basic_machine=mmix-knuth
+ ;;
+ rs6000)
+ basic_machine=rs6000-ibm
+ ;;
+ vax)
+ basic_machine=vax-dec
+ ;;
+ pdp10)
+ # there are many clones, so DEC is not a safe bet
+ basic_machine=pdp10-unknown
+ ;;
+ pdp11)
+ basic_machine=pdp11-dec
+ ;;
+ we32k)
+ basic_machine=we32k-att
+ ;;
+ sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
+ basic_machine=sh-unknown
+ ;;
+ sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
+ basic_machine=sparc-sun
+ ;;
+ cydra)
+ basic_machine=cydra-cydrome
+ ;;
+ orion)
+ basic_machine=orion-highlevel
+ ;;
+ orion105)
+ basic_machine=clipper-highlevel
+ ;;
+ mac | mpw | mac-mpw)
+ basic_machine=m68k-apple
+ ;;
+ pmac | pmac-mpw)
+ basic_machine=powerpc-apple
+ ;;
+ *-unknown)
+ # Make sure to match an already-canonicalized machine name.
+ ;;
+ *)
+ echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+ *-digital*)
+ basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+ ;;
+ *-commodore*)
+ basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+ ;;
+ *)
+ ;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+ # First match some system type aliases
+ # that might get confused with valid system types.
+ # -solaris* is a basic system type, with this one exception.
+ -auroraux)
+ os=-auroraux
+ ;;
+ -solaris1 | -solaris1.*)
+ os=`echo $os | sed -e 's|solaris1|sunos4|'`
+ ;;
+ -solaris)
+ os=-solaris2
+ ;;
+ -svr4*)
+ os=-sysv4
+ ;;
+ -unixware*)
+ os=-sysv4.2uw
+ ;;
+ -gnu/linux*)
+ os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+ ;;
+ # First accept the basic system types.
+ # The portable systems comes first.
+ # Each alternative MUST END IN A *, to match a version number.
+ # -sysv* is not here because it comes later, after sysvr4.
+ -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
+ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
+ | -sym* | -kopensolaris* \
+ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+ | -aos* | -aros* \
+ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
+ | -openbsd* | -solidbsd* \
+ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+ | -chorusos* | -chorusrdb* | -cegcc* \
+ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+ | -mingw32* | -linux-gnu* | -linux-android* \
+ | -linux-newlib* | -linux-uclibc* \
+ | -uxpv* | -beos* | -mpeix* | -udk* \
+ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*)
+ # Remember, each alternative MUST END IN *, to match a version number.
+ ;;
+ -qnx*)
+ case $basic_machine in
+ x86-* | i*86-*)
+ ;;
+ *)
+ os=-nto$os
+ ;;
+ esac
+ ;;
+ -nto-qnx*)
+ ;;
+ -nto*)
+ os=`echo $os | sed -e 's|nto|nto-qnx|'`
+ ;;
+ -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
+ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+ ;;
+ -mac*)
+ os=`echo $os | sed -e 's|mac|macos|'`
+ ;;
+ -linux-dietlibc)
+ os=-linux-dietlibc
+ ;;
+ -linux*)
+ os=`echo $os | sed -e 's|linux|linux-gnu|'`
+ ;;
+ -sunos5*)
+ os=`echo $os | sed -e 's|sunos5|solaris2|'`
+ ;;
+ -sunos6*)
+ os=`echo $os | sed -e 's|sunos6|solaris3|'`
+ ;;
+ -opened*)
+ os=-openedition
+ ;;
+ -os400*)
+ os=-os400
+ ;;
+ -wince*)
+ os=-wince
+ ;;
+ -osfrose*)
+ os=-osfrose
+ ;;
+ -osf*)
+ os=-osf
+ ;;
+ -utek*)
+ os=-bsd
+ ;;
+ -dynix*)
+ os=-bsd
+ ;;
+ -acis*)
+ os=-aos
+ ;;
+ -atheos*)
+ os=-atheos
+ ;;
+ -syllable*)
+ os=-syllable
+ ;;
+ -386bsd)
+ os=-bsd
+ ;;
+ -ctix* | -uts*)
+ os=-sysv
+ ;;
+ -nova*)
+ os=-rtmk-nova
+ ;;
+ -ns2 )
+ os=-nextstep2
+ ;;
+ -nsk*)
+ os=-nsk
+ ;;
+ # Preserve the version number of sinix5.
+ -sinix5.*)
+ os=`echo $os | sed -e 's|sinix|sysv|'`
+ ;;
+ -sinix*)
+ os=-sysv4
+ ;;
+ -tpf*)
+ os=-tpf
+ ;;
+ -triton*)
+ os=-sysv3
+ ;;
+ -oss*)
+ os=-sysv3
+ ;;
+ -svr4)
+ os=-sysv4
+ ;;
+ -svr3)
+ os=-sysv3
+ ;;
+ -sysvr4)
+ os=-sysv4
+ ;;
+ # This must come after -sysvr4.
+ -sysv*)
+ ;;
+ -ose*)
+ os=-ose
+ ;;
+ -es1800*)
+ os=-ose
+ ;;
+ -xenix)
+ os=-xenix
+ ;;
+ -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+ os=-mint
+ ;;
+ -aros*)
+ os=-aros
+ ;;
+ -kaos*)
+ os=-kaos
+ ;;
+ -zvmoe)
+ os=-zvmoe
+ ;;
+ -dicos*)
+ os=-dicos
+ ;;
+ -nacl*)
+ ;;
+ -none)
+ ;;
+ *)
+ # Get rid of the `-' at the beginning of $os.
+ os=`echo $os | sed 's/[^-]*-//'`
+ echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system. Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+ score-*)
+ os=-elf
+ ;;
+ spu-*)
+ os=-elf
+ ;;
+ *-acorn)
+ os=-riscix1.2
+ ;;
+ arm*-rebel)
+ os=-linux
+ ;;
+ arm*-semi)
+ os=-aout
+ ;;
+ c4x-* | tic4x-*)
+ os=-coff
+ ;;
+ tic54x-*)
+ os=-coff
+ ;;
+ tic55x-*)
+ os=-coff
+ ;;
+ tic6x-*)
+ os=-coff
+ ;;
+ # This must come before the *-dec entry.
+ pdp10-*)
+ os=-tops20
+ ;;
+ pdp11-*)
+ os=-none
+ ;;
+ *-dec | vax-*)
+ os=-ultrix4.2
+ ;;
+ m68*-apollo)
+ os=-domain
+ ;;
+ i386-sun)
+ os=-sunos4.0.2
+ ;;
+ m68000-sun)
+ os=-sunos3
+ # This also exists in the configure program, but was not the
+ # default.
+ # os=-sunos4
+ ;;
+ m68*-cisco)
+ os=-aout
+ ;;
+ mep-*)
+ os=-elf
+ ;;
+ mips*-cisco)
+ os=-elf
+ ;;
+ mips*-*)
+ os=-elf
+ ;;
+ or32-*)
+ os=-coff
+ ;;
+ *-tti) # must be before sparc entry or we get the wrong os.
+ os=-sysv3
+ ;;
+ sparc-* | *-sun)
+ os=-sunos4.1.1
+ ;;
+ *-be)
+ os=-beos
+ ;;
+ *-haiku)
+ os=-haiku
+ ;;
+ *-ibm)
+ os=-aix
+ ;;
+ *-knuth)
+ os=-mmixware
+ ;;
+ *-wec)
+ os=-proelf
+ ;;
+ *-winbond)
+ os=-proelf
+ ;;
+ *-oki)
+ os=-proelf
+ ;;
+ *-hp)
+ os=-hpux
+ ;;
+ *-hitachi)
+ os=-hiux
+ ;;
+ i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+ os=-sysv
+ ;;
+ *-cbm)
+ os=-amigaos
+ ;;
+ *-dg)
+ os=-dgux
+ ;;
+ *-dolphin)
+ os=-sysv3
+ ;;
+ m68k-ccur)
+ os=-rtu
+ ;;
+ m88k-omron*)
+ os=-luna
+ ;;
+ *-next )
+ os=-nextstep
+ ;;
+ *-sequent)
+ os=-ptx
+ ;;
+ *-crds)
+ os=-unos
+ ;;
+ *-ns)
+ os=-genix
+ ;;
+ i370-*)
+ os=-mvs
+ ;;
+ *-next)
+ os=-nextstep3
+ ;;
+ *-gould)
+ os=-sysv
+ ;;
+ *-highlevel)
+ os=-bsd
+ ;;
+ *-encore)
+ os=-bsd
+ ;;
+ *-sgi)
+ os=-irix
+ ;;
+ *-siemens)
+ os=-sysv4
+ ;;
+ *-masscomp)
+ os=-rtu
+ ;;
+ f30[01]-fujitsu | f700-fujitsu)
+ os=-uxpv
+ ;;
+ *-rom68k)
+ os=-coff
+ ;;
+ *-*bug)
+ os=-coff
+ ;;
+ *-apple)
+ os=-macos
+ ;;
+ *-atari*)
+ os=-mint
+ ;;
+ *)
+ os=-none
+ ;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer. We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+ *-unknown)
+ case $os in
+ -riscix*)
+ vendor=acorn
+ ;;
+ -sunos*)
+ vendor=sun
+ ;;
+ -cnk*|-aix*)
+ vendor=ibm
+ ;;
+ -beos*)
+ vendor=be
+ ;;
+ -hpux*)
+ vendor=hp
+ ;;
+ -mpeix*)
+ vendor=hp
+ ;;
+ -hiux*)
+ vendor=hitachi
+ ;;
+ -unos*)
+ vendor=crds
+ ;;
+ -dgux*)
+ vendor=dg
+ ;;
+ -luna*)
+ vendor=omron
+ ;;
+ -genix*)
+ vendor=ns
+ ;;
+ -mvs* | -opened*)
+ vendor=ibm
+ ;;
+ -os400*)
+ vendor=ibm
+ ;;
+ -ptx*)
+ vendor=sequent
+ ;;
+ -tpf*)
+ vendor=ibm
+ ;;
+ -vxsim* | -vxworks* | -windiss*)
+ vendor=wrs
+ ;;
+ -aux*)
+ vendor=apple
+ ;;
+ -hms*)
+ vendor=hitachi
+ ;;
+ -mpw* | -macos*)
+ vendor=apple
+ ;;
+ -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+ vendor=atari
+ ;;
+ -vos*)
+ vendor=stratus
+ ;;
+ esac
+ basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+ ;;
+esac
+
+echo $basic_machine$os
+exit
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/platform/autoconf/gle-graphics.pc.in b/platform/autoconf/gle-graphics.pc.in
new file mode 100644
index 0000000..59622d1
--- /dev/null
+++ b/platform/autoconf/gle-graphics.pc.in
@@ -0,0 +1,9 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+gle_top=@GLE_INSTALL_DATA@
+
+Name: GLE
+Description: Graphics Layout Engine
+Version: @GLE_VERSION@
diff --git a/platform/autoconf/install-sh b/platform/autoconf/install-sh
new file mode 100755
index 0000000..a5897de
--- /dev/null
+++ b/platform/autoconf/install-sh
@@ -0,0 +1,519 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2006-12-25.00
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.
+
+nl='
+'
+IFS=" "" $nl"
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit=${DOITPROG-}
+if test -z "$doit"; then
+ doit_exec=exec
+else
+ doit_exec=$doit
+fi
+
+# Put in absolute file names if you don't have them in your path;
+# or use environment vars.
+
+chgrpprog=${CHGRPPROG-chgrp}
+chmodprog=${CHMODPROG-chmod}
+chownprog=${CHOWNPROG-chown}
+cmpprog=${CMPPROG-cmp}
+cpprog=${CPPROG-cp}
+mkdirprog=${MKDIRPROG-mkdir}
+mvprog=${MVPROG-mv}
+rmprog=${RMPROG-rm}
+stripprog=${STRIPPROG-strip}
+
+posix_glob='?'
+initialize_posix_glob='
+ test "$posix_glob" != "?" || {
+ if (set -f) 2>/dev/null; then
+ posix_glob=
+ else
+ posix_glob=:
+ fi
+ }
+'
+
+posix_mkdir=
+
+# Desired mode of installed file.
+mode=0755
+
+chgrpcmd=
+chmodcmd=$chmodprog
+chowncmd=
+mvcmd=$mvprog
+rmcmd="$rmprog -f"
+stripcmd=
+
+src=
+dst=
+dir_arg=
+dst_arg=
+
+copy_on_change=false
+no_target_directory=
+
+usage="\
+Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+ or: $0 [OPTION]... SRCFILES... DIRECTORY
+ or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+ or: $0 [OPTION]... -d DIRECTORIES...
+
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
+
+Options:
+ --help display this help and exit.
+ --version display version info and exit.
+
+ -c (ignored)
+ -C install only if different (preserve the last data modification time)
+ -d create directories instead of installing files.
+ -g GROUP $chgrpprog installed files to GROUP.
+ -m MODE $chmodprog installed files to MODE.
+ -o USER $chownprog installed files to USER.
+ -s $stripprog installed files.
+ -t DIRECTORY install into DIRECTORY.
+ -T report an error if DSTFILE is a directory.
+
+Environment variables override the default commands:
+ CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
+ RMPROG STRIPPROG
+"
+
+while test $# -ne 0; do
+ case $1 in
+ -c) ;;
+
+ -C) copy_on_change=true;;
+
+ -d) dir_arg=true;;
+
+ -g) chgrpcmd="$chgrpprog $2"
+ shift;;
+
+ --help) echo "$usage"; exit $?;;
+
+ -m) mode=$2
+ case $mode in
+ *' '* | *' '* | *'
+'* | *'*'* | *'?'* | *'['*)
+ echo "$0: invalid mode: $mode" >&2
+ exit 1;;
+ esac
+ shift;;
+
+ -o) chowncmd="$chownprog $2"
+ shift;;
+
+ -s) stripcmd=$stripprog;;
+
+ -t) dst_arg=$2
+ shift;;
+
+ -T) no_target_directory=true;;
+
+ --version) echo "$0 $scriptversion"; exit $?;;
+
+ --) shift
+ break;;
+
+ -*) echo "$0: invalid option: $1" >&2
+ exit 1;;
+
+ *) break;;
+ esac
+ shift
+done
+
+if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
+ # When -d is used, all remaining arguments are directories to create.
+ # When -t is used, the destination is already specified.
+ # Otherwise, the last argument is the destination. Remove it from $@.
+ for arg
+ do
+ if test -n "$dst_arg"; then
+ # $@ is not empty: it contains at least $arg.
+ set fnord "$@" "$dst_arg"
+ shift # fnord
+ fi
+ shift # arg
+ dst_arg=$arg
+ done
+fi
+
+if test $# -eq 0; then
+ if test -z "$dir_arg"; then
+ echo "$0: no input file specified." >&2
+ exit 1
+ fi
+ # It's OK to call `install-sh -d' without argument.
+ # This can happen when creating conditional directories.
+ exit 0
+fi
+
+if test -z "$dir_arg"; then
+ trap '(exit $?); exit' 1 2 13 15
+
+ # Set umask so as not to create temps with too-generous modes.
+ # However, 'strip' requires both read and write access to temps.
+ case $mode in
+ # Optimize common cases.
+ *644) cp_umask=133;;
+ *755) cp_umask=22;;
+
+ *[0-7])
+ if test -z "$stripcmd"; then
+ u_plus_rw=
+ else
+ u_plus_rw='% 200'
+ fi
+ cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
+ *)
+ if test -z "$stripcmd"; then
+ u_plus_rw=
+ else
+ u_plus_rw=,u+rw
+ fi
+ cp_umask=$mode$u_plus_rw;;
+ esac
+fi
+
+for src
+do
+ # Protect names starting with `-'.
+ case $src in
+ -*) src=./$src;;
+ esac
+
+ if test -n "$dir_arg"; then
+ dst=$src
+ dstdir=$dst
+ test -d "$dstdir"
+ dstdir_status=$?
+ else
+
+ # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+ # might cause directories to be created, which would be especially bad
+ # if $src (and thus $dsttmp) contains '*'.
+ if test ! -f "$src" && test ! -d "$src"; then
+ echo "$0: $src does not exist." >&2
+ exit 1
+ fi
+
+ if test -z "$dst_arg"; then
+ echo "$0: no destination specified." >&2
+ exit 1
+ fi
+
+ dst=$dst_arg
+ # Protect names starting with `-'.
+ case $dst in
+ -*) dst=./$dst;;
+ esac
+
+ # If destination is a directory, append the input filename; won't work
+ # if double slashes aren't ignored.
+ if test -d "$dst"; then
+ if test -n "$no_target_directory"; then
+ echo "$0: $dst_arg: Is a directory" >&2
+ exit 1
+ fi
+ dstdir=$dst
+ dst=$dstdir/`basename "$src"`
+ dstdir_status=0
+ else
+ # Prefer dirname, but fall back on a substitute if dirname fails.
+ dstdir=`
+ (dirname "$dst") 2>/dev/null ||
+ expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$dst" : 'X\(//\)[^/]' \| \
+ X"$dst" : 'X\(//\)$' \| \
+ X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
+ echo X"$dst" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'
+ `
+
+ test -d "$dstdir"
+ dstdir_status=$?
+ fi
+ fi
+
+ obsolete_mkdir_used=false
+
+ if test $dstdir_status != 0; then
+ case $posix_mkdir in
+ '')
+ # Create intermediate dirs using mode 755 as modified by the umask.
+ # This is like FreeBSD 'install' as of 1997-10-28.
+ umask=`umask`
+ case $stripcmd.$umask in
+ # Optimize common cases.
+ *[2367][2367]) mkdir_umask=$umask;;
+ .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
+
+ *[0-7])
+ mkdir_umask=`expr $umask + 22 \
+ - $umask % 100 % 40 + $umask % 20 \
+ - $umask % 10 % 4 + $umask % 2
+ `;;
+ *) mkdir_umask=$umask,go-w;;
+ esac
+
+ # With -d, create the new directory with the user-specified mode.
+ # Otherwise, rely on $mkdir_umask.
+ if test -n "$dir_arg"; then
+ mkdir_mode=-m$mode
+ else
+ mkdir_mode=
+ fi
+
+ posix_mkdir=false
+ case $umask in
+ *[123567][0-7][0-7])
+ # POSIX mkdir -p sets u+wx bits regardless of umask, which
+ # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
+ ;;
+ *)
+ tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
+
+ if (umask $mkdir_umask &&
+ exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
+ then
+ if test -z "$dir_arg" || {
+ # Check for POSIX incompatibilities with -m.
+ # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+ # other-writeable bit of parent directory when it shouldn't.
+ # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+ ls_ld_tmpdir=`ls -ld "$tmpdir"`
+ case $ls_ld_tmpdir in
+ d????-?r-*) different_mode=700;;
+ d????-?--*) different_mode=755;;
+ *) false;;
+ esac &&
+ $mkdirprog -m$different_mode -p -- "$tmpdir" && {
+ ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
+ test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+ }
+ }
+ then posix_mkdir=:
+ fi
+ rmdir "$tmpdir/d" "$tmpdir"
+ else
+ # Remove any dirs left behind by ancient mkdir implementations.
+ rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
+ fi
+ trap '' 0;;
+ esac;;
+ esac
+
+ if
+ $posix_mkdir && (
+ umask $mkdir_umask &&
+ $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+ )
+ then :
+ else
+
+ # The umask is ridiculous, or mkdir does not conform to POSIX,
+ # or it failed possibly due to a race condition. Create the
+ # directory the slow way, step by step, checking for races as we go.
+
+ case $dstdir in
+ /*) prefix='/';;
+ -*) prefix='./';;
+ *) prefix='';;
+ esac
+
+ eval "$initialize_posix_glob"
+
+ oIFS=$IFS
+ IFS=/
+ $posix_glob set -f
+ set fnord $dstdir
+ shift
+ $posix_glob set +f
+ IFS=$oIFS
+
+ prefixes=
+
+ for d
+ do
+ test -z "$d" && continue
+
+ prefix=$prefix$d
+ if test -d "$prefix"; then
+ prefixes=
+ else
+ if $posix_mkdir; then
+ (umask=$mkdir_umask &&
+ $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+ # Don't fail if two instances are running concurrently.
+ test -d "$prefix" || exit 1
+ else
+ case $prefix in
+ *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+ *) qprefix=$prefix;;
+ esac
+ prefixes="$prefixes '$qprefix'"
+ fi
+ fi
+ prefix=$prefix/
+ done
+
+ if test -n "$prefixes"; then
+ # Don't fail if two instances are running concurrently.
+ (umask $mkdir_umask &&
+ eval "\$doit_exec \$mkdirprog $prefixes") ||
+ test -d "$dstdir" || exit 1
+ obsolete_mkdir_used=true
+ fi
+ fi
+ fi
+
+ if test -n "$dir_arg"; then
+ { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
+ { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
+ { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
+ test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
+ else
+
+ # Make a couple of temp file names in the proper directory.
+ dsttmp=$dstdir/_inst.$$_
+ rmtmp=$dstdir/_rm.$$_
+
+ # Trap to clean up those temp files at exit.
+ trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+
+ # Copy the file name to the temp name.
+ (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
+
+ # and set any options; do chmod last to preserve setuid bits.
+ #
+ # If any of these fail, we abort the whole thing. If we want to
+ # ignore errors from any of these, just make sure not to ignore
+ # errors from the above "$doit $cpprog $src $dsttmp" command.
+ #
+ { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
+ { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
+ { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
+ { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
+
+ # If -C, don't bother to copy if it wouldn't change the file.
+ if $copy_on_change &&
+ old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
+ new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
+
+ eval "$initialize_posix_glob" &&
+ $posix_glob set -f &&
+ set X $old && old=:$2:$4:$5:$6 &&
+ set X $new && new=:$2:$4:$5:$6 &&
+ $posix_glob set +f &&
+
+ test "$old" = "$new" &&
+ $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
+ then
+ rm -f "$dsttmp"
+ else
+ # Rename the file to the real destination.
+ $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
+
+ # The rename failed, perhaps because mv can't rename something else
+ # to itself, or perhaps because mv is so ancient that it does not
+ # support -f.
+ {
+ # Now remove or move aside any old file at destination location.
+ # We try this two ways since rm can't unlink itself on some
+ # systems and the destination file might be busy for other
+ # reasons. In this case, the final cleanup might fail but the new
+ # file should still install successfully.
+ {
+ test ! -f "$dst" ||
+ $doit $rmcmd -f "$dst" 2>/dev/null ||
+ { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
+ { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
+ } ||
+ { echo "$0: cannot unlink or rename $dst" >&2
+ (exit 1); exit 1
+ }
+ } &&
+
+ # Now rename the file to the real destination.
+ $doit $mvcmd "$dsttmp" "$dst"
+ }
+ fi || exit 1
+
+ trap '' 0
+ fi
+done
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/platform/autopackage/gle.desktop b/platform/autopackage/gle.desktop
new file mode 100644
index 0000000..49e4c6e
--- /dev/null
+++ b/platform/autopackage/gle.desktop
@@ -0,0 +1,10 @@
+[Desktop Entry]
+Version=1.0
+Categories=Graphics;2DGraphics;VectorGraphics;
+Type=Application
+Name=GLE
+Comment=A package for creating graphs, plots, and diagrams
+TryExec=qgle
+Exec=qgle %F
+MimeType=text/x-gle;
+Icon=gle
diff --git a/platform/autopackage/gle.gle b/platform/autopackage/gle.gle
new file mode 100644
index 0000000..f4659a6
--- /dev/null
+++ b/platform/autopackage/gle.gle
@@ -0,0 +1,88 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+!
+! Small gle Logo
+!
+size 4 4
+!set font psagb
+dx=4
+dy=4
+set hei 2
+boxw=dx/7
+boxh=6
+amove -0.05 -0.05
+set color BLACK
+box dx+0.1 dy+0.1 fill BLACK round 0.5
+sub draw_box dx dy clr$
+ gsave
+ set color clr$
+ box dx dy fill clr$
+ grestore
+end sub
+
+
+amove dx/2 dy/2
+
+begin scale 1 2
+
+set just cc
+
+begin clip ! Save default clipping region
+begin path clip ! Set up the clipping region
+ text GLE
+end path
+amove 0 0
+ at draw_box boxw boxh red
+rmove boxw 0
+ at draw_box boxw boxh orange
+rmove boxw 0
+ at draw_box boxw boxh yellow
+rmove boxw 0
+ at draw_box boxw boxh green
+rmove boxw 0
+ at draw_box boxw boxh neon_blue
+rmove boxw 0
+ at draw_box boxw boxh coral
+rmove boxw 0
+ at draw_box boxw boxh violet
+rmove boxw 0
+
+end clip
+
+end scale
diff --git a/platform/autopackage/gle.png b/platform/autopackage/gle.png
new file mode 100644
index 0000000..3e52275
Binary files /dev/null and b/platform/autopackage/gle.png differ
diff --git a/platform/autopackage/gle.xml b/platform/autopackage/gle.xml
new file mode 100644
index 0000000..6e8112a
--- /dev/null
+++ b/platform/autopackage/gle.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<mime-info xmlns='http://www.freedesktop.org/standards/shared-mime-info'>
+ <mime-type type="text/x-gle">
+ <comment>GLE Script File</comment>
+ <glob pattern="*.gle"/>
+ </mime-type>
+</mime-info>
diff --git a/platform/autopackage/gle4.apspec.in b/platform/autopackage/gle4.apspec.in
new file mode 100644
index 0000000..92fbc8a
--- /dev/null
+++ b/platform/autopackage/gle4.apspec.in
@@ -0,0 +1,88 @@
+# -*-shell-script-*-
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+[Meta]
+ShortName: gle
+SoftwareVersion: @GLE_VERSION@
+DisplayName: Graphics Layout Engine (GLE)
+RootName: @glx.sourceforge.net/gle:@GLE_VERSION@
+Summary: A high quality package for creating graphs, plots, and diagrams.
+Maintainer: Jan Struyf <jan.struyf at cs.kuleuven.be>
+Packager: Jan Struyf <jan.struyf at cs.kuleuven.be>
+PackageVersion: 1
+CPUArchitectures: x86
+AutopackageTarget: 1.0
+Type: Application
+License: BSD
+
+[Description]
+GLE (Graphics Layout Engine) is a high-quality graphics package for scientists, combining a
+user-friendly scripting language with a full range of facilities for producing
+publication-quality graphs, diagrams, posters and slides. GLE provides LaTeX quality fonts
+together with a flexible graphics module which allows the user to specify any feature of a
+graph. Complex pictures can be drawn with user-defined subroutines and simple looping
+structures. Current output formats include EPS, PS, PDF, JPEG, and PNG.
+
+[BuildPrepare]
+APBUILD_STATIC_LIBGCC=1
+APBUILD_STATIC="tiff png12 png jpeg z"
+prepareBuild --with-apintern --with-staticlink=yes --with-qt=/localhost/tmp/jans/qt4.3.2 @AP_CONFIG_ARGS@
+
+[BuildUnprepare]
+unprepareBuild
+
+[Globals]
+
+[Prepare]
+recommend @freetype.org/freetype 6
+
+[Imports]
+echo '*' | import
+
+[Install]
+installExe bin/*
+installLib lib/*
+installData share/gle
+installIcon share/gle/@GLE_VERSION@/gle.png
+installMime share/gle/@GLE_VERSION@/gle.xml
+installDesktop "Graphics/Vector Graphics" share/gle/@GLE_VERSION@/gle.desktop
+installMan man/man1/gle.1
+
+[Uninstall]
+uninstallFromLog
diff --git a/platform/autopackage/qt-replace.pl b/platform/autopackage/qt-replace.pl
new file mode 100644
index 0000000..de78df8
--- /dev/null
+++ b/platform/autopackage/qt-replace.pl
@@ -0,0 +1,64 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+# Replace entries in makefile
+
+# ./configure -prefix /localhost/tmp/jans/qt4.3.2 -nomake examples,tools -release -static -no-qt3support -no-openssl -no-cups -no-opengl -no-xinerama -no-xfixes -no-xrandr -no-tablet -no-glib -no-mmx -no-3dnow -no-sse -no-sse2
+
+$file = $ARGV[0];
+
+open(IN, $file) || die "Can't open $file";
+ at LINES = <IN>;
+close(IN);
+
+open(OUT, ">$file") || die "Can't create $file";
+foreach $line (@LINES) {
+ chomp($line);
+ if ($line =~ /^CXX\s+\=/) {
+ $line = "CXX = apg++";
+ }
+ if ($line =~ /^LINK\s+\=/) {
+ $line = "LINK = apg++";
+ }
+ if ($line =~ /^LFLAGS\s+\=\s+(.+)$/) {
+ $flags = $1;
+ $line = "LFLAGS = $flags -static-libgcc -Wl,-Bstatic -lstdc++ -Wl,-Bdynamic";
+ }
+ print OUT "$line\n";
+}
+close(OUT);
diff --git a/platform/mac/build-path.sh b/platform/mac/build-path.sh
new file mode 100644
index 0000000..9a49e9b
--- /dev/null
+++ b/platform/mac/build-path.sh
@@ -0,0 +1,25 @@
+export CPPFLAGS="-I$HOME/staticlibs/include -arch i386 -mmacosx-version-min=10.4 -isysroot /Developer/SDKs/MacOSX10.4u.sdk"
+export CXXFLAGS="-I$HOME/staticlibs/include -arch i386 -mmacosx-version-min=10.4 -isysroot /Developer/SDKs/MacOSX10.4u.sdk"
+export CFLAGS="-I$HOME/staticlibs/include -arch i386 -mmacosx-version-min=10.4 -isysroot /Developer/SDKs/MacOSX10.4u.sdk"
+export LDFLAGS="-L$HOME/staticlibs/lib -arch i386 -mmacosx-version-min=10.4 -isysroot /Developer/SDKs/MacOSX10.4u.sdk"
+export PATH=/Users/macbook/staticlibs/bin/:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin:/opt/local/bin
+export CC=gcc-4.0
+export CXX=g++-4.0
+export MACOSX_DEPLOYMENT_TARGET=10.4
+
+# Build QT:
+#
+# ./configure -prefix $HOME/staticlibs -release -nomake examples -nomake tools -static -system-libpng -no-qt3support -no-xmlpatterns -no-phonon -no-phonon-backend -no-webkit -no-mmx -no-3dnow -no-sse -no-sse2 -qt-zlib -no-gif -no-libtiff -no-libmng -no-libjpeg -no-openssl -no-cups -no-iconv -no-dbus -carbon -arch x86 -nomake demos -no-javascript-jit -no-script -no-scripttools -no-declarative -I /Users/macbook/staticlibs/include -L /Users/macbook/staticlibs/lib
+# make sub-src
+# make install
+
+# Build libjpeg, libtiff, pixman
+#
+# ./configure --prefix=$HOME/staticlibs --enable-static=yes --enable-shared=no
+
+# Cairo
+#
+# ./configure --prefix=$HOME/staticlibs --enable-static=yes --enable-shared=no --enable-quartz=no --enable-ft=no --enable-xlib=no
+
+# libpng should be linked dynamically
+# (it is used by both Qt and GLE)
diff --git a/platform/mac/conf-static.src b/platform/mac/conf-static.src
new file mode 100644
index 0000000..f451218
--- /dev/null
+++ b/platform/mac/conf-static.src
@@ -0,0 +1,9 @@
+export PATH=$HOME/staticlibs/bin/:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin:/opt/local/bin
+export CPPFLAGS="-I$HOME/staticlibs/include -mmacosx-version-min=10.4 -isysroot /Developer/SDKs/MacOSX10.4u.sdk"
+export LDFLAGS="-L$HOME/staticlibs/lib -mmacosx-version-min=10.4 -isysroot /Developer/SDKs/MacOSX10.4u.sdk"
+export CC=gcc-4.0
+export CXX=g++-4.0
+export MACOSX_DEPLOYMENT_TARGET=10.4
+./configure --with-qt=$HOME/staticlibs --with-extrafonts=yes --with-x=no
+
+
diff --git a/platform/script/checkdos b/platform/script/checkdos
new file mode 100755
index 0000000..3409b86
--- /dev/null
+++ b/platform/script/checkdos
@@ -0,0 +1,41 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+#!/bin/sh
+find src -name "*.cpp" -exec perl platform/script/dosperc {} \;
+find src -name "*.h" -exec perl platform/script/dosperc {} \;
diff --git a/platform/script/checklicense.pl b/platform/script/checklicense.pl
new file mode 100644
index 0000000..7908d34
--- /dev/null
+++ b/platform/script/checklicense.pl
@@ -0,0 +1,181 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+# cat srcfiles.txt | xargs perl platform/script/checklicense.pl
+
+# identify -verbose *.png | grep Comment
+# for file in *.png ; do mogrify -comment "License: GPL v.2 or later" "$file" ; done
+
+open(IN, "platform/script/licenses.csv") || die "Can't open 'platform/script/licenses.csv'";
+while ($line = <IN>) {
+ chomp($line);
+ if (!($line =~ /^\s*\!.*$/) && !($line =~ /^\s*$/)) {
+ if ($line =~ /^([^\,]+)\,\s*(.+)$/) {
+ $file = $1;
+ $lic = $2;
+ if ($lic =~ /Modified BSD/) {
+ $MOD_BSD_LIC{$file} = 1;
+ $HAS_LIC{$file} = 1;
+ }
+ if ($lic =~ /GPL v2 or later/) {
+ $GPL_LIC2L{$file} = 1;
+ $HAS_LIC{$file} = 1;
+ }
+ }
+ }
+}
+
+for ($i = 0; $i <= $#ARGV; $i++) {
+ $file = $ARGV[$i];
+
+ $modified_bsd = 0;
+ $gpl = 0;
+ $gpl2 = 0;
+ $gpl21 = 0;
+ $gpl_later = 0;
+ $zlib = 0;
+
+ if ($file =~ /\.png$/) {
+ $comment = `identify -verbose $file`;
+ if ($comment =~ /GPL v\.2 or later/) {
+ $gpl = 1;
+ $gpl2 = 1;
+ $gpl_later = 1;
+ }
+ if ($comment =~ /Modified BSD/) {
+ $modified_bsd = 1;
+ }
+ } else {
+ @ALL = ();
+ open(IN, $file) || die "Can't open '$file'";
+ while ($line = <IN>) {
+ if ($line =~ /^[\s\#\%\!\*\;]+ZLIB\/LIBPNG LICENSE/) {
+ $zlib = 1;
+ }
+ if ($line =~ /^[\s\#\%\!\*\;\.\\\"]+Modified BSD License/) {
+ $modified_bsd = 1;
+ }
+ if ($line =~ /^rem[\s\#\%\!\*]+Modified BSD License/) {
+ $modified_bsd = 1;
+ }
+ if ($line =~ /General Public License/) {
+ $gpl = 1;
+ }
+ $line =~ s/[\n\r]+//g;
+ push @ALL, $line;
+ }
+ close(IN);
+
+ if ($gpl == 1) {
+ $lines = join(" ", @ALL);
+ $lines =~ s/[\*\#\!\%]/ /g;
+ $lines =~ s/\;\;/ /g;
+ $lines =~ s/\s\s+/ /g;
+
+ # print "$lines\n";
+
+ if ($lines =~ /version 2 of the License, or \(at your option\) any later version/) {
+ $gpl2 = 1;
+ $gpl_later = 1;
+ }
+ if ($lines =~ /either version 2, or \(at your option\) any later version/) {
+ $gpl2 = 1;
+ $gpl_later = 1;
+ }
+ if ($lines =~ /version 2\.1 of the License, or \(at your option\) any later version/) {
+ $gpl21 = 1;
+ $gpl_later = 1;
+ }
+ }
+ }
+
+ if ($HAS_LIC{$file} != 1) {
+ if ($gpl == 1) {
+ if (($gpl21 == 1) && ($gpl_later == 1)) {
+ $GPL_LIC21L{$file} = 1;
+ } elsif (($gpl2 == 1) && ($gpl_later == 1)) {
+ $GPL_LIC2L{$file} = 1;
+ } elsif ($gpl2 == 1) {
+ $GPL_LIC2{$file} = 1;
+ } else {
+ $GPL_LIC{$file} = 1;
+ }
+ } elsif ($modified_bsd == 1) {
+ $MOD_BSD_LIC{$file} = 1;
+ } elsif ($zlib == 1) {
+ $ZLIB_LIC{$file} = 1;
+ } else {
+ $UNKNOWN{$file} = 1;
+ }
+ }
+}
+
+print "*** Modified BSD License ***\n\n";
+foreach $f (sort keys(%MOD_BSD_LIC)) {
+ print "$f\n";
+}
+
+print "\n*** LGPL v2.1 or later ***\n\n";
+foreach $f (sort keys %GPL_LIC21L) {
+ print "$f\n";
+}
+
+print "\n*** GPL v2 or later ***\n\n";
+foreach $f (sort keys %GPL_LIC2L) {
+ print "$f\n";
+}
+
+print "\n*** GPL v2 ***\n\n";
+foreach $f (sort keys %GPL_LIC2) {
+ print "$f\n";
+}
+
+print "\n*** GPL (unknown) ***\n\n";
+foreach $f (sort keys %GPL_LIC) {
+ print "$f\n";
+}
+
+print "\n*** ZLIB/LIBPNG License ***\n\n";
+foreach $f (sort keys %ZLIB_LIC) {
+ print "$f\n";
+}
+
+print "\n*** Unknown ***\n\n";
+foreach $f (sort keys %UNKNOWN) {
+ print "$f\n";
+}
diff --git a/platform/script/collectsrcfiles.pl b/platform/script/collectsrcfiles.pl
new file mode 100644
index 0000000..de065cd
--- /dev/null
+++ b/platform/script/collectsrcfiles.pl
@@ -0,0 +1,159 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+$distall = 0;
+
+sub try_sel {
+ my ($path, $file) = @_;
+ my ($ok, $nok, $pos);
+ if ($file eq ".notdist") {
+ return;
+ }
+ $ok = 0;
+ foreach $pos (@SEL) {
+ if (eval($pos)) {
+ $ok = 1;
+ }
+ }
+ $nok = 0;
+ foreach $pos (@IGN) {
+ if (eval($pos)) {
+ $nok = 1;
+ }
+ }
+ $path =~ s/^\.\///;
+ if (($ok == 1) || ($nok == 1)) {
+ if ($nok != 1) {
+ print "$path\n";
+ }
+ } else {
+ print STDERR "What about: '$path'\n";
+ }
+}
+
+sub recursive_search {
+ my ($dir) = @_;
+ print STDERR "Recursive Directory: $dir\n";
+ my (@FILES, $handle, $file, $path, $ntline, %NOTDIST);
+ opendir($handle, $dir);
+ @FILES = readdir($handle);
+ closedir($handle);
+ if (-f "$dir/.notdist") {
+ open(NOTDIST, "$dir/.notdist");
+ while ($ntline = <NOTDIST>) {
+ chomp($ntline);
+ if ($ntline =~ /^distall\: (.+)$/) {
+ $ntline = $1;
+ if ($distall == 0) {
+ $NOTDIST{$ntline} = 1;
+ }
+ } else {
+ $NOTDIST{$ntline} = 1;
+ }
+ }
+ close(NOTDIST);
+ }
+ foreach $file (@FILES) {
+ if (!($file =~ /^\.svn$/) && !($file =~ /^CVS$/) && !($file =~ /^\.cvsignore$/) && !($file =~ /^\.+$/) && !($file =~ /^\.gle$/)) {
+ $path = $dir . "/" . $file;
+ if (-d $path) {
+ recursive_search($path);
+ } elsif (!defined($NOTDIST{$file})) {
+ try_sel($path, $file);
+ } else {
+ print STDERR "Can't distribute: $path\n";
+ }
+ }
+ }
+}
+
+sub dir_search {
+ my ($dir) = @_;
+ print STDERR "Directory: $dir\n";
+ my (@FILES, $handle, $file, $path);
+ opendir($handle, $dir);
+ @FILES = readdir($handle);
+ closedir($handle);
+ foreach $file (@FILES) {
+ if (!($file =~ /^\.svn$/) && !($file =~ /^CVS$/) && !($file =~ /^\.cvsignore$/) && !($file =~ /^\.+$/)) {
+ $path = $dir . "/" . $file;
+ if (!(-d $path)) {
+ try_sel($path, $file);
+ }
+ }
+ }
+}
+
+
+sub update_regex {
+ my ($re) = @_;
+ $re =~ s/\./\\./g;
+ $re =~ s/\*/\.*/g;
+ return "\$file =~ /^$re\$/";
+}
+
+if ($ARGV[0] eq "-all") {
+ $distall = 1;
+ $file = $ARGV[1];
+} else {
+ $file = $ARGV[0];
+}
+open(IN, $file) || die "Can't open '$file'";
+while ($line = <IN>) {
+ chomp($line);
+ if (!($line =~ /^\s*$/) && !($line =~ /^\s*!/)) {
+ ($dir, $select, $ignore) = split(/\s*,\s*/, $line);
+ $select =~ s/\s+$//;
+ $ignore =~ s/\s+$//;
+ @SEL = split(/\s*;\s*/, $select);
+ for ($i = 0; $i <= $#SEL; $i++) {
+ $SEL[$i] = update_regex($SEL[$i]);
+ }
+ @IGN = split(/\s*;\s*/, $ignore);
+ for ($i = 0; $i <= $#IGN; $i++) {
+ $IGN[$i] = update_regex($IGN[$i]);
+ }
+ if ($dir =~ /^\$(.+)$/) {
+ $dir = $1;
+ dir_search($dir);
+ } else {
+ recursive_search($dir);
+ }
+ }
+}
+close(IN);
diff --git a/platform/script/correctfilemodes.pl b/platform/script/correctfilemodes.pl
new file mode 100644
index 0000000..ef0b8d1
--- /dev/null
+++ b/platform/script/correctfilemodes.pl
@@ -0,0 +1,133 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+use Fcntl ':mode';
+
+$files = `find .`;
+ at files = split(/[\n\r]+/, $files);
+
+ at OKEXEEXT_A = ("cmd","sh","pl","exe","so","package");
+ at NOEXEEXT_A = ("gle","cpp","h","i","gif","png","html","hlp","ico","pdf","tex","dat","csv","bak","let","sur","z","txt","bmp","css","big","key","lab","lis","xpm","ttf","sty","stx","win32","nsi");
+ at NOEXTFILES_A = ("changelog","surf_batch","surf_regis","surf_tek","surf_vt","surf_x");
+
+foreach $ext (@NOEXEEXT_A) {
+ $NOEXEEXT{$ext} = 1;
+}
+
+foreach $ext (@OKEXEEXT_A) {
+ $OKEXEEXT{$ext} = 1;
+}
+
+foreach $ext (@NOEXTFILES_A) {
+ $NOEXTFILES{$ext} = 1;
+}
+
+foreach $f (@files) {
+ if (!($f =~ /\.svn/)) {
+ ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = stat($f);
+ if (S_ISLNK($mode) ||
+ S_ISBLK($mode) ||
+ S_ISCHR($mode) ||
+ S_ISFIFO($mode) ||
+ S_ISSOCK($mode)) {
+ printf "*** FILE: $f has strange mode: %o\n", $mode;
+ }
+ if (($mode & S_ISUID) != 0) {
+ printf "*** FILE: $f has UID bit set: %o\n", $mode;
+ }
+ if ((($mode & S_ISGID) != 0) ||
+ (($mode & S_ISVTX) != 0)) {
+ printf "*** FILE: $f has GID/Sticky bit set: %o\n", $mode;
+ }
+ if ((($mode & S_IWGRP) != 0) || (($mode & S_IWOTH) != 0)) {
+ printf "*** FILE: $f is group/other writable: %o\n", $mode;
+ }
+ if ((($mode & S_IRUSR) == 0) || (($mode & S_IRUSR) == 0) || (($mode & S_IRUSR) == 0)) {
+ printf "*** FILE: $f is not world readable: %o\n", $mode;
+ }
+ if (($mode & S_IWUSR) == 0) {
+ printf "*** FILE: $f is read only: %o\n", $mode;
+ }
+ if (($mode & S_IXUSR) != 0) {
+ if ((($mode & S_IXOTH) == 0) || (($mode & S_IXGRP) == 0)) {
+ printf "*** FILE: $f user executable, but not world executable: %o\n", $mode;
+ }
+ if (S_ISREG($mode)) {
+ $ok = 0;
+ if ($f =~ /\.([^\.\/]+)$/) {
+ $ext = lc($1);
+ if ($NOEXEEXT{$ext} == 1) {
+ $ok = 1;
+ printf "*** FILE: $f should *not* be executable, fixing: %o\n", $mode;
+ chmod 0644, $f;
+ }
+ if ($OKEXEEXT{$ext} == 1) {
+ $ok = 1;
+ }
+ }
+ if ($f =~ /\/([^\/]+)$/) {
+ $fname = lc($1);
+ if ($fname =~ /makefile/) {
+ $ok = 1;
+ printf "*** FILE: $f should *not* be executable, fixing: %o\n", $mode;
+ chmod 0644, $f;
+ }
+ if ($NOEXTFILES{$fname} == 1) {
+ $ok = 1;
+ printf "*** FILE: $f should *not* be executable, fixing: %o\n", $mode;
+ chmod 0644, $f;
+ }
+ }
+ if ($ok == 0) {
+ printf "*** FILE: $f is executable: %o\n", $mode;
+ }
+ }
+ }
+ if ((!S_ISREG($mode)) && (!S_ISDIR($mode))) {
+ printf "*** FILE: $f is not a regular file nor a directory: %o\n", $mode;
+ }
+ if (S_ISREG($mode) && S_ISDIR($mode)) {
+ printf "*** FILE: $f both a regular file and a directory: %o\n", $mode;
+ }
+ if (S_ISDIR($mode)) {
+ if (($mode & S_IXUSR) == 0) {
+ printf "*** FILE: $f is a directory and not executable: %o\n", $mode;
+ }
+ }
+ }
+}
diff --git a/platform/script/dosperc b/platform/script/dosperc
new file mode 100755
index 0000000..14559b9
--- /dev/null
+++ b/platform/script/dosperc
@@ -0,0 +1,61 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+#!/usr/local/bin/perl
+
+$cnt = 0; $dos = 0;
+
+$fname = $ARGV[0];
+open(IN, $fname) || die "Can't open '$fname'";
+while ($line = <IN>) {
+ $cnt ++;
+ if ($line =~ /\r/) {
+ $dos++;
+ }
+}
+close(IN);
+
+if ($cnt != 0) {
+ $perc = 100.0*$dos/$cnt;
+} else {
+ $perc = 0;
+}
+
+if ($dos > 0) {
+ printf "File: $fname DOS: $dos/$cnt = %.1f\%\n", $perc;
+}
diff --git a/platform/script/install_qgle_mac b/platform/script/install_qgle_mac
new file mode 100755
index 0000000..c6747ab
--- /dev/null
+++ b/platform/script/install_qgle_mac
@@ -0,0 +1,56 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+#!/bin/sh
+
+touch /Applications/qgle.check 2>/dev/null
+QGLEDIR=
+if test -f /Applications/qgle.check; then
+ QGLEDIR=/Applications
+else
+ mkdir -p ~/Applications
+ QGLEDIR=~/Applications
+fi
+rm -f /Applications/qgle.check 2>/dev/null
+rm -rf $QGLEDIR/QGLE.app
+cp -r ./build/bin/QGLE.app $QGLEDIR/
+
+echo ""
+echo "****************************************************************"
+echo "QGLE has been installed in: $QGLEDIR/QGLE.app"
+echo "****************************************************************"
diff --git a/platform/script/killspace b/platform/script/killspace
new file mode 100644
index 0000000..5dae733
--- /dev/null
+++ b/platform/script/killspace
@@ -0,0 +1,42 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+#!/bin/sh
+find src -name "*.cpp" -exec perl platform/script/killtrailspace.pl {} \;
+find src -name "*.h" -exec perl platform/script/killtrailspace.pl {} \;
+find . -name "Makefile.in" -exec perl platform/script/killtrailspace.pl {} \;
diff --git a/platform/script/killtrailspace.pl b/platform/script/killtrailspace.pl
new file mode 100644
index 0000000..885ffdf
--- /dev/null
+++ b/platform/script/killtrailspace.pl
@@ -0,0 +1,65 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+$file = $ARGV[0];
+
+open(IN,"$file") || die "Can't open '$file'";
+ at LINES = <IN>;
+close(IN);
+
+$count = 0;
+for ($i = 0; $i <= $#LINES; $i++) {
+ $line = $LINES[$i];
+ $line =~ s/[\r\n]+//g;
+ $prev = $line;
+ $line =~ s/\s+$//;
+ if ($line ne $prev) {
+ $count++;
+ }
+ $LINES[$i] = $line;
+}
+
+if ($count > 0) {
+ print "F: $file - $count\n";
+ open(OUT,">$file") || die "Can't create '$file'";
+ for ($i = 0; $i <= $#LINES; $i++) {
+ $line = $LINES[$i];
+ print OUT "$line\n";
+ }
+ close(OUT);
+}
diff --git a/platform/script/licenses.csv b/platform/script/licenses.csv
new file mode 100644
index 0000000..c270dc3
--- /dev/null
+++ b/platform/script/licenses.csv
@@ -0,0 +1,58 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+README.txt, Modified BSD
+LICENSE.txt, Modified BSD
+configure, Modified BSD
+contrib/editors/highlighting/vim/ftplugin/gle.vim, Modified BSD
+contrib/editors/highlighting/vim/indent/gle.vim, Modified BSD
+contrib/editors/highlighting/vim/syntax/gle.vim, Modified BSD
+contrib/packagers/nsis/banner_image.bmp, Modified BSD
+contrib/packagers/nsis/welcome_image.bmp, Modified BSD
+contrib/packagers/nsis/www.ico, Modified BSD
+platform/autoconf/gle-graphics.pc.in, Modified BSD
+platform/autopackage/gle.desktop, Modified BSD
+platform/autopackage/gle.xml, Modified BSD
+platform/script/checklicense.pl, Modified BSD
+src/fonts/font.dat, Modified BSD
+src/fonts/glemark.afm, Modified BSD
+src/fonts/psfont.dat, Modified BSD
+src/gui/images/gle.icns, GPL v2 or later
+src/gui/images/gle.ico, GPL v2 or later
+src/gui/qgle.rc, GPL v2 or later
+src/manip/manip.hlp, Modified BSD
diff --git a/platform/script/makesnapshot.pl b/platform/script/makesnapshot.pl
new file mode 100644
index 0000000..688e1bf
--- /dev/null
+++ b/platform/script/makesnapshot.pl
@@ -0,0 +1,80 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+$make = $ARGV[0];
+
+open(IN, "configure.ac") || die "Can't open configure.ac";
+ at LINES = <IN>;
+close(IN);
+
+$found = 0;
+open(OUT, ">configure.ac") || die "Can't write to configure.ac";
+for ($i = 0; $i <= $#LINES; $i++) {
+ $line = $LINES[$i];
+ chomp($line);
+ if ($found == 0) {
+ if ($line =~ /^GLE_SNAPSHOT\=/) {
+ $found = 1;
+ if ($make == 1) {
+ $date = `date +\%m\%d\%y`;
+ $date =~ s/[\n\r]+$//;
+ if ($ARGV[1] eq "") {
+ $snap = "S$date";
+ } else {
+ $snap = $ARGV[1];
+ }
+ print OUT "GLE_SNAPSHOT=\"-$snap\"\n";
+ print OUT "AC_DEFINE_UNQUOTED(GLE_SNAPSHOT, \"\$GLE_SNAPSHOT\")\n";
+ print "Making snapshot: $snap\n";
+ } else {
+ print OUT "GLE_SNAPSHOT=\"\"\n";
+ print "Clearing snapshot\n";
+ }
+ if ($LINES[$i+1] =~ /AC_DEFINE_UNQUOTED/) {
+ $i++;
+ }
+ } else {
+ print OUT "$line\n";
+ }
+ } else {
+ print OUT "$line\n";
+ }
+}
+close(OUT);
+
+system("autoconf");
diff --git a/platform/script/srcfiles.csv b/platform/script/srcfiles.csv
new file mode 100644
index 0000000..a1e2bdd
--- /dev/null
+++ b/platform/script/srcfiles.csv
@@ -0,0 +1,60 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+$.,Makefile.*;config.*;configure.ac;configure;README.txt;LICENSE.txt;ChangeLog.txt,*.zip;*.gz;*.patch;Makefile;test.*;.*;extraconfig.*;srcfiles.txt;conf.txt*;config.status;config.log;aclocal.m4
+platform/autoconf,config.*;install-sh;*.in,gle-graphics.pc
+platform/autopackage,gle.*;*.in;*.pl,gle4.apspec
+platform/script,*,
+platform/mac,*.sh;*.src,
+contrib/packagers/nsis,*.nsi;*.ico;*.bmp,*.psd
+contrib/editors/highlighting,*.el;*.nedit;*.vim;*.stx
+gle-refman,Makefile.*;*.tex;*.gle;*.dat;*.csv;*.big;*.sur;*.z;*.key;*.lab;*.let;*.sty;*.pl;*.lis,*.eps;*.pdf;*.ps;*.inc;*.aux;*.idx;*.ilg;*.ind;*.log;*.out;*.toc;*-cdata.dat;*-clabels.dat;*-cvalues.dat$src,config.h.*;config_noauto.h,config.h
+gle-refman/qgle/screenshot,*.png,
+$src,config.h.*;config_noauto.h,config.h
+src/doc,*.in,gle.1
+src/gle,Makefile.*;*.cpp;*.h;*.i;files.txt,Makefile;*.o
+src/makefmt,Makefile.*;*.cpp;*.h;*.i;files.txt;parseAFM.diff,Makefile;*.o
+src/fbuild,Makefile.*;*.cpp;*.h;*.i;files.txt,Makefile;*.o
+$src/gui,Makefile.*;*.cpp;*.h;*.i;*.txt;*.html;*.in;*.sh;*.rc;*.qrc;doxyfile,Makefile;*.o;MakefileAC;qgle.pro;qrc_qgle.cpp;*.Debug;*.Release
+src/gui/gsinc,*.h;LICENSE
+src/gui/images,*.png;*.ico;*.icns
+src/TeX,Makefile.*;*.tex;*.cmd,Makefile
+src/lib,Makefile.*;*.gle
+src/fonts,Makefile.*;*.gle;*.afm;*.dat;*.enc;*.txt;*.pl;*.html;*.inf,*.fve;*.fmt;movefonts
+src/manip,Makefile.*;*.cpp;*.h;*.i;files.txt;*.hlp;*.dat,Makefile;*.o
+src/samples,Makefile.*;qgle_keyboard.gle;sample.gle;sample_compare.eps
diff --git a/src/TeX/Makefile.gcc b/src/TeX/Makefile.gcc
new file mode 100644
index 0000000..f83e1ba
--- /dev/null
+++ b/src/TeX/Makefile.gcc
@@ -0,0 +1,53 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+#makefile for building initex.ini
+
+include ../../config.i
+include ../../config.gcc
+
+RUNGLE := $(PROJECT_BINDIR)/bin/rungle
+
+all: $(PROJECT_BINDIR)/inittex.ini
+
+$(PROJECT_BINDIR)/inittex.ini: $(PROJECT_BINDIR)/bin/gle
+ -cp -p init.tex $(PROJECT_BINDIR)/
+ -$(RUNGLE) -mkinittex
+
+clean:
+ -$(RM) $(PROJECT_BINDIR)/inittex.ini $(PROJECT_BINDIR)/init.tex init.ps
diff --git a/src/TeX/Makefile.in b/src/TeX/Makefile.in
new file mode 100644
index 0000000..7ee55c3
--- /dev/null
+++ b/src/TeX/Makefile.in
@@ -0,0 +1,58 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+#makefile for building initex.ini
+
+include ../../config.i
+include ../../config.aconf
+
+ifeq (@HAVE_NOSCRIPTS@,1)
+ RUNGLE := $(PROJECT_BINDIR)/bin/gle
+endif
+ifeq (@HAVE_NOSCRIPTS@,0)
+ RUNGLE := $(PROJECT_BINDIR)/bin/rungle
+endif
+
+all: $(PROJECT_BINDIR)/inittex.ini
+
+$(PROJECT_BINDIR)/inittex.ini: $(PROJECT_BINDIR)/bin/gle init.tex
+ -cp -p init.tex $(PROJECT_BINDIR)/
+ -$(RUNGLE) -mkinittex
+
+clean:
+ -$(RM) $(PROJECT_BINDIR)/inittex.ini $(PROJECT_BINDIR)/init.tex init.ps
diff --git a/src/TeX/Makefile.os2 b/src/TeX/Makefile.os2
new file mode 100644
index 0000000..1f41c07
--- /dev/null
+++ b/src/TeX/Makefile.os2
@@ -0,0 +1,50 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+#makefile for building initex.ini
+
+include ../../config.os2
+
+all: $(PROJECT_BINDIR)/inittex.ini
+
+$(PROJECT_BINDIR)/inittex.ini: $(PROJECT_BINDIR)/bin/gle.exe
+ -$(CP) init.tex $(PROJECT_BINDIR)/
+ -cmd.exe /c makeinittex.cmd
+
+clean:
+ -$(RM) $(PROJECT_BINDIR)/inittex.ini $(PROJECT_BINDIR)/init.tex init.ps
diff --git a/src/TeX/Makefile.vc b/src/TeX/Makefile.vc
new file mode 100644
index 0000000..8cc2167
--- /dev/null
+++ b/src/TeX/Makefile.vc
@@ -0,0 +1,49 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+#makefile for building initex.ini
+
+!include ..\..\config.vc
+
+all:
+ set GLE_TOP=$(PROJECT_BINDIR)
+ -copy init.tex $(PROJECT_BINDIR)
+ $(PROJECT_BINDIR)\bin\gle -mkinittex
+
+clean:
+ -del $(PROJECT_BINDIR)\inittex.ini $(PROJECT_BINDIR)\init.tex init.ps
diff --git a/src/TeX/init.tex b/src/TeX/init.tex
new file mode 100644
index 0000000..0a68800
--- /dev/null
+++ b/src/TeX/init.tex
@@ -0,0 +1,692 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 10 10
+! To update inittex.ini first delete the current version from CGLE_TOP:
+! and then CGLE INIT.TEX /DEV=PS to create a new version and copy
+! it to CGLE_TOP:
+
+print ""
+print "If GLE says 'Saving definitions', then compilation was successful."
+
+amove 2 8
+begin text
+\tfont{0}{texcmr}{1} \sfont{0}{texcmr}{.7} \ssfont{0}{texcmr}{.5}
+\tfont{1}{texcmmi}{1} \sfont{1}{texcmmi}{.7} \ssfont{1}{texcmmi}{.5}
+\tfont{2}{texcmsy}{1} \sfont{2}{texcmsy}{.7} \ssfont{2}{texcmsy}{.5}
+\tfont{3}{texcmex}{1} \sfont{3}{texcmex}{.7} \ssfont{3}{texcmex}{.5}
+end text
+begin text
+\mathcode{ }{$8000}
+\mathcode{!}{$5021}
+\mathcode{'}{$8000}
+\mathcode{(}{$4028}
+\mathcode{)}{$5029}
+\mathcode{*}{$2203}
+\mathcode{+}{$202B}
+\mathcode{,}{$613B}
+\mathcode{-}{$2200}
+\mathcode{.}{$013A}
+\mathcode{/}{$013D}
+\mathcode{:}{$303A}
+\mathcode{;}{$603B}
+\mathcode{<}{$313C}
+\mathcode{=}{$303D}
+\mathcode{>}{$313E}
+\mathcode{?}{$503F}
+\mathcode{[}{$405B}
+\mathcode{]}{$505D}
+\mathcode{_}{$8000}
+\mathcode{|}{$026A}
+
+end text
+begin text
+\delcode{.}{0}
+\delcode{(}{$028300}
+\delcode{)}{$029301}
+\delcode{[}{$05B302}
+\delcode{]}{$05D303}
+\delcode{<}{$26830A}
+\delcode{>}{$26930B}
+\delcode{/}{$02F30E}
+\delcode{|}{$26A30C}
+
+\def\lbrack{[} \def\rbrack{]}
+\def\space{ }
+
+\def\,{\movexy{0.5em}{0}}
+\def\:{\movexy{1em}{0}}
+\def\;{\movexy{2em}{0}}
+\def\!{\movexy{-0.5em}{0}}
+
+\def\smallskip{\vskip{2 ex}} %does not work
+\def\medskip{\vskip{4 ex}} %does not work
+\def\bigskip{\vskip{8 ex}} %does not work
+
+\def\ss{\char{$19}}
+\def\ae{\char{$1A}}
+\def\oe{\char{$1b}}
+\def\o{\char{$1c}}
+\def\AE{\char{$1d}}
+\def\OE{\char{$1e}}
+\def\O{\char{$1f}}
+
+!\def\ae{\uchr{00E6}}
+!\def\oe{\uchr{0153}}
+!\def\o{\uchr{00F8}}
+!\def\AE{\uchr{00C6}}
+!\def\OE{\uchr{0152}}
+!\def\O{\uchr{00D8}}
+
+\def\i{\char{$10}}
+\def\j{\char{$11}}
+\def\l{{\fontenc{1}{rm}\char{248}}}
+\def\L{{\fontenc{1}{rm}\char{232}}}
+
+\def\adobess{\char{251}}
+\def\adobeae{\char{241}}
+\def\adobeoe{\char{250}}
+\def\adobeAE{\char{225}}
+\def\adobeOE{\char{234}}
+\def\adobeo{\char{249}}
+\def\adobeO{\char{233}}
+\def\adobei{\char{245}}
+\def\adobesterlin{\char{163}}
+\def\adobeyen{\char{165}}
+\def\adobeflorin{\char{166}}
+\def\adobesection{\char{167}}
+\def\adobecurrency{\char{168}}
+
+\def\degree{{\fontenc{1}{rm}\char{202}}}
+
+\def\dag{\mathchar{$279}}
+\def\ddag{\mathchar{$27A}}
+\def\S{\mathchar{$278}}
+\def\P{\mathchar{$27B}}
+end text
+
+begin text
+\mathchardef{\alpha}{$010B}
+\mathchardef{\beta}{$010C}
+\mathchardef{\gamma}{$010D}
+\mathchardef{\delta}{$010E}
+\mathchardef{\epsilon}{$010F}
+\mathchardef{\zeta}{$0110}
+\mathchardef{\eta}{$0111}
+\mathchardef{\theta}{$0112}
+\mathchardef{\iota}{$0113}
+\mathchardef{\kappa}{$0114}
+\mathchardef{\lambda}{$0115}
+\mathchardef{\mu}{$0116}
+\mathchardef{\nu}{$0117}
+\mathchardef{\xi}{$0118}
+\mathchardef{\pi}{$0119}
+\mathchardef{\rho}{$011A}
+\mathchardef{\sigma}{$011B}
+\mathchardef{\tau}{$011C}
+\mathchardef{\upsilon}{$011D}
+\mathchardef{\phi}{$011E}
+\mathchardef{\chi}{$011F}
+\mathchardef{\psi}{$0120}
+\mathchardef{\omega}{$0121}
+\mathchardef{\varepsilon}{$0122}
+\mathchardef{\vartheta}{$0123}
+\mathchardef{\varpi}{$0124}
+\mathchardef{\varrho}{$0125}
+\mathchardef{\varsigma}{$0126}
+\mathchardef{\varphi}{$0127}
+\mathchardef{\Gamma}{$7000}
+\mathchardef{\Delta}{$7001}
+\mathchardef{\Theta}{$7002}
+\mathchardef{\Lambda}{$7003}
+\mathchardef{\Xi}{$7004}
+\mathchardef{\Pi}{$7005}
+\mathchardef{\Sigma}{$7006}
+\mathchardef{\Upsilon}{$7007}
+\mathchardef{\Phi}{$7008}
+\mathchardef{\Psi}{$7009}
+\mathchardef{\Omega}{$700A}
+end text
+begin text
+
+\mathchardef{\aleph}{$0240}
+\mathchardef{\imath}{$017B}
+\mathchardef{\jmath}{$017C}
+\mathchardef{\ell}{$0160}
+\mathchardef{\wp}{$017D}
+\mathchardef{\Re}{$023C}
+\mathchardef{\Im}{$023D}
+\mathchardef{\partial}{$0140}
+\mathchardef{\infty}{$0231}
+\mathchardef{\prime}{$0230}
+\mathchardef{\emptyset}{$023B}
+\mathchardef{\nabla}{$0272}
+\mathchardef{\top}{$023E}
+\mathchardef{\bot}{$023F}
+end text
+begin text
+\mathchardef{\minus}{$007C}
+\mathchardef{\triangle}{$0234}
+\mathchardef{\forall}{$0238}
+\mathchardef{\exists}{$0239}
+\mathchardef{\neg}{$023A}
+\mathchardef{\flat}{$015B}
+\mathchardef{\natural}{$015C}
+\mathchardef{\sharp}{$015D}
+\def\clubsuit{{\setfont{pszd}\char{168}}}
+\def\diamondsuit{{\setfont{pszd}\char{169}}}
+\def\heartsuit{{\setfont{pszd}\char{170}}}
+\def\spadesuit{{\setfont{pszd}\char{171}}}
+
+\mathchardef{\coprod}{$1360}
+\mathchardef{\bigvee}{$1357}
+\mathchardef{\bigwedge}{$1356}
+\mathchardef{\biguplus}{$1355}
+\mathchardef{\bigcap}{$1354}
+\mathchardef{\bigcup}{$1353}
+\mathchardef{\prod}{$1351}
+\mathchardef{\sum}{$1350}
+\mathchardef{\bigotimes}{$134E}
+\mathchardef{\bigoplus}{$134C}
+\mathchardef{\bigodot}{$134A}
+\mathchardef{\bigsqcup}{$1346}
+\mathchardef{\smallint}{$1273}
+
+\mathchardef{\intop}{$1352}
+\mathchardef{\ointop}{$1348}
+\def{\int}{\intop\nolimits}
+\def{\oint}{\ointop\nolimits}
+
+end text
+begin text
+\mathchardef{\triangleleft}{$212F}
+\mathchardef{\triangleright}{$212E}
+\mathchardef{\bigtriangleup}{$2234}
+\mathchardef{\bigtriangledown}{$2235}
+\mathchardef{\wedge}{$225E}
+\mathchardef{\land}{$225E}
+\mathchardef{\vee}{$225F}
+\mathchardef{\lor}{$225F}
+\mathchardef{\cap}{$225C}
+\mathchardef{\cup}{$225B}
+\mathchardef{\ddagger}{$227A}
+\mathchardef{\dagger}{$2279}
+\mathchardef{\sqcap}{$2275}
+\mathchardef{\sqcup}{$2274}
+\mathchardef{\uplus}{$225D}
+\mathchardef{\amalg}{$2271}
+\mathchardef{\diamond}{$2205}
+\mathchardef{\bullet}{$220F}
+\mathchardef{\wr}{$226F}
+\mathchardef{\div}{$2204}
+\mathchardef{\odot}{$220C}
+\mathchardef{\oslash}{$220B}
+\mathchardef{\otimes}{$220A}
+\mathchardef{\ominus}{$2209}
+\mathchardef{\oplus}{$2208}
+\mathchardef{\mp}{$2207}
+\mathchardef{\pm}{$2206}
+\mathchardef{\circ}{$220E}
+\mathchardef{\bigcirc}{$220D}
+\mathchardef{\setminus}{$226E}
+\mathchardef{\cdot}{$2201}
+\mathchardef{\ast}{$2203}
+\mathchardef{\times}{$2202}
+\mathchardef{\star}{$213F}
+
+end text
+begin text
+\mathchardef{\propto}{$322F}
+\mathchardef{\sqsubseteq}{$3276}
+\mathchardef{\sqsupseteq}{$3277}
+\mathchardef{\parallel}{$326B}
+\mathchardef{\mid}{$326A}
+\mathchardef{\dashv}{$3261}
+\mathchardef{\vdash}{$3260}
+\mathchardef{\nearrow}{$3225}
+\mathchardef{\searrow}{$3226}
+\mathchardef{\nwarrow}{$322D}
+\mathchardef{\swarrow}{$322E}
+\mathchardef{\Leftrightarrow}{$322C}
+\mathchardef{\Leftarrow}{$3228}
+\mathchardef{\Rightarrow}{$3229}
+\def\neq{\not=}
+\def\ne{\neq}
+\mathchardef{\leq}{$3214}
+\def\le{\leq}
+\def\ge{\geq}
+\mathchardef{\geq}{$3215}
+\mathchardef{\succ}{$321F}
+\mathchardef{\prec}{$321E}
+\mathchardef{\approx}{$3219}
+\mathchardef{\succeq}{$3217}
+\mathchardef{\preceq}{$3216}
+\mathchardef{\supset}{$321B}
+\mathchardef{\subset}{$321A}
+\mathchardef{\supseteq}{$3213}
+\mathchardef{\subseteq}{$3212}
+\mathchardef{\in}{$3232}
+end text
+begin text
+\def\owns{\ni}
+\mathchardef{\ni}{$3233}
+\mathchardef{\gg}{$321D}
+\mathchardef{\ll}{$321C}
+\mathchardef{\not}{$3236}
+\mathchardef{\leftrightarrow}{$3224}
+\mathchardef{\leftarrow}{$3220}
+ \def\gets{\leftarrow}
+\mathchardef{\rightarrow}{$3221}
+\def{\to}{\rightarrow}
+\mathchardef{\uparrow}{$3222}
+\mathchardef{\downarrow}{$3223}
+\mathchardef{\updownarrow}{$326C}
+\mathchardef{\Uparrow}{$322A}
+\mathchardef{\Downarrow}{$322B}
+\mathchardef{\Updownarrow}{$326D}
+\mathchardef{\mapstochar}{$3237}
+ \def\mapsto{\mapstochar\rightarrow}
+\mathchardef{\sim}{$3218}
+\mathchardef{\simeq}{$3227}
+\mathchardef{\perp}{$323F}
+\mathchardef{\equiv}{$3211}
+\mathchardef{\asymp}{$3210}
+\mathchardef{\smile}{$315E}
+\mathchardef{\frown}{$315F}
+\mathchardef{\leftharpoonup}{$3128}
+\mathchardef{\leftharpoondown}{$3129}
+\mathchardef{\rightharpoonup}{$312A}
+\mathchardef{\rightharpoondown}{$312B}
+end text
+begin text
+
+\mathchardef{\lhook}{$312C}
+ \def\hookrightarrow{\lhook\joinrel\rightarrow}
+\mathchardef{\rhook}{$312D}
+\def\hookleftarrow{\leftarrow\joinrel\rhook}
+\def\bowtie{\mathrel\triangleright\joinrel\mathrel\triangleleft}
+\def\models{\mathrel|\joinrel=}
+\def\Longrightarrow{\Relbar\joinrel\Rightarrow}
+
+\def\longrightarrow{\protect\@lra}
+\def\longleftarrow{\protect\@lla}
+\def\Longleftarrow{\Leftarrow\joinrel\Relbar}
+\def\longmapsto{\mapstochar\longrightarrow}
+\def\longleftrightarrow{\leftarrow\joinrel\rightarrow}
+\def\Longleftrightarrow{\Leftarrow\joinrel\Rightarrow}
+\def\iff{\Longleftrightarrow}
+end text
+begin text
+\def\lmoustache{\delimiter{$4000340}}
+\def\rmoustache{\delimiter{$5000341}}
+\def\lgroup{\delimiter{$400033A}}
+\def\rgroup{\delimiter{$500033B}}
+\def\arrowvert{\delimiter{$33C}}
+\def\Arrowvert{\delimiter{$33D}}
+\def\bracevert{\delimiter{$33E}}
+\def\Vert{\delimiter{$26B30D}}
+\def\|{\Vert}
+\def\vert{\delimiter{$26A30C}}
+end text
+begin text
+\mathchardef{\backslash}{$326E}
+\def\rangle{\delimiter{$526930B}}
+\def\langle{\delimiter{$426830A}}
+\def\rbrace{\delimiter{$5267309}}
+\def\lbrace{\delimiter{$4266308}}
+\def\rceil{\delimiter{$5265307}}
+\def\lceil{\delimiter{$4264306}}
+\def\rfloor{\delimiter{$5263305}}
+\def\lfloor{\delimiter{$4262304}}
+
+end text
+begin text
+\def\rmf{\fam{0}}
+\def\log{\mathop{\rmf log}\nolimits}
+\def\lg{\mathop{\rmf lg}\nolimits}
+\def\ln{\mathop{\rmf ln}\nolimits}
+\def\lim{\mathop{\rmf lim}}
+\def\limsup{\mathop{\rmf lim\,sup}}
+\def\liminf{\mathop{\rmf lim\,inf}}
+\def\sin{\mathop{\rmf sin}\nolimits}
+\def\arcsin{\mathop{\rmf arcsin}\nolimits}
+\def\sinh{\mathop{\rmf sinh}\nolimits}
+\def\cos{\mathop{\rmf cos}\nolimits}
+\def\arccos{\mathop{\rmf arccos}\nolimits}
+\def\AA{\acccmb{texcmr}{23}{6}A}
+\def\aa{\acccmb{texcmr}{23}{6}a}
+end text
+begin text
+\def\cosh{\mathop{\rmf cosh}\nolimits}
+\def\tan{\mathop{\rmf tan}\nolimits}
+\def\arctan{\mathop{\rmf arctan}\nolimits}
+\def\tanh{\mathop{\rmf tanh}\nolimits}
+\def\cot{\mathop{\rmf cot}\nolimits}
+\def\coth{\mathop{\rmf coth}\nolimits}
+\def\sec{\mathop{\rmf sec}\nolimits}
+\def\csc{\mathop{\rmf csc}\nolimits}
+\def\max{\mathop{\rmf max}}
+\def\min{\mathop{\rmf min}}
+\def\inf{\mathop{\rmf inf}}
+\def\arg{\mathop{\rmf arg}\nolimits}
+\def\ker{\mathop{\rmf ker}\nolimits}
+\def\dim{\mathop{\rmf dim}\nolimits}
+\def\hom{\mathop{\rmf hom}\nolimits}
+\def\det{\mathop{\rmf det}}
+\def\exp{\mathop{\rmf exp}\nolimits}
+\def\Pr{\mathop{\rmf Pr}}
+\def\gcd{\mathop{\rmf gcd}}
+\def\deg{\mathop{\rmf deg}\nolimits}
+end text
+begin text
+\def\`{\acccmb{texcmr}{18}{5}}
+\def\'{\acccmb{texcmr}{19}{2}}
+\def\v{\acccmb{texcmr}{20}{0}}
+\def\u{\accent{texcmr}{21}}
+\def\={\accent{texcmr}{22}}
+\def\.{\accent{texcmr}{95}}
+\def\H{\accent{texcmr}{125}}
+\def\~{\acccmb{texcmr}{126}{7}}
+\def{''}{\acccmb{texcmr}{127}{3}}
+\def\c{\acccmb{rm}{203}{1}}
+\def\k{\accent{rm}{206}}
+end text
+! hardcoded in tex.cpp because of conflict with character "^"
+! \def\^{\acccmb{texcmr}{94}{4}}
+! can this be fixed by moving these:
+! tex_chardef('^',"\\sup ");
+! tex_chardef('_',"\\sub ");
+! from the code to this file?
+begin text
+
+% emulator stuff here.
+\def\kern#1{\movexy{#1}{0}}
+\def\raise#2{\movexy{0}{#1}#2\movexy{0}{-(#1)}} %does not work
+\def\lower#2{\movexy{0}{-(#1)}#2\movexy{0}{(#1)}} %does not work
+\def\mathord#1{\math{0}{#1}}
+\def\mathop#1{\math{1}{#1}}
+\def\mathbin#1{\math{2}{#1}}
+\def\mathrel#1{\math{3}{#1}}
+\def\mathopen#1{\math{4}{#1}}
+\def\mathclose#1{\math{5}{#1}}
+\def\mathpunct#1{\math{6}{#1}}
+\def\mathinnter#1{\math{7}{#1}}
+
+%does not work
+\def\copyright{c\mathchar{20D}}
+\def\test{\char{20D}}
+\def\dots{\ldotp\ldotp\ldotp}
+\def\ldots{\ldotp\ldotp\ldotp}
+\def\TeX{T\kern{-0.1667em}\lower{0.5 ex}{E}\kern{-0.125em}X}
+%
+\def\sp{^}
+\def\sb{_}
+
+% define some fonts, won't work in math mode. should define rmf,itf,bff,ttf
+\def\rm{\setfont{rm}}
+\def\it{\setfont{rmi}}
+\def\bf{\setfont{rmb}}
+\def\tt{\setfont{tt}}
+\def\glass{\rule{0}{0}}
+end text
+
+begin text
+\unicode{$A3}{\adobesterlin{}}
+\unicode{$A5}{\adobeyen{}}
+\unicode{$A7}{\adobesection{}}
+\unicode{$A4}{\adobecurrency{}}
+\unicode{$B1}{\pm{}}
+\unicode{$B2}{{}^2}
+\unicode{$B3}{{}^3}
+\unicode{$B5}{\mu{}}
+\unicode{$B7}{\cdot{}}
+\unicode{$BA}{{}^1}
+\unicode{$C0}{\`A}
+\unicode{$C1}{\'A}
+\unicode{$C2}{\^A}
+\unicode{$C3}{\~A}
+\unicode{$C4}{\''A}
+\unicode{$C5}{\AA{}}
+\unicode{$C6}{\adobeAE{}}
+\unicode{$C7}{\c C}
+\unicode{$C8}{\`E}
+\unicode{$C9}{\'E}
+\unicode{$CA}{\^E}
+\unicode{$CB}{\''E}
+\unicode{$CC}{\`I}
+\unicode{$CD}{\'I}
+\unicode{$CE}{\^I}
+\unicode{$CF}{\''I}
+\unicode{$D1}{\~N}
+\unicode{$D2}{\`O}
+\unicode{$D3}{\'O}
+\unicode{$D4}{\^O}
+\unicode{$D5}{\~O}
+\unicode{$D6}{\''O}
+\unicode{$D7}{\times{}}
+\unicode{$D8}{\emptyset{}}
+\unicode{$D9}{\`U}
+\unicode{$DA}{\'U}
+\unicode{$DB}{\^U}
+\unicode{$DC}{\''U}
+\unicode{$DD}{\'Y}
+\unicode{$DF}{\adobess{}}
+\unicode{$E0}{\`a}
+\unicode{$E1}{\'a}
+\unicode{$E2}{\^a}
+\unicode{$E3}{\~a}
+\unicode{$E4}{\''a}
+\unicode{$E5}{\aa{}}
+\unicode{$E6}{\adobeae{}}
+\unicode{$E7}{\c c}
+\unicode{$E8}{\`e}
+\unicode{$E9}{\'e}
+\unicode{$EA}{\^e}
+\unicode{$EB}{\''e}
+\unicode{$EC}{\`i}
+\unicode{$ED}{\'i}
+\unicode{$EE}{\^i}
+\unicode{$EF}{\''i}
+\unicode{$F1}{\~n}
+\unicode{$F2}{\`o}
+\unicode{$F3}{\'o}
+\unicode{$F4}{\^o}
+\unicode{$F5}{\~o}
+\unicode{$F6}{\''o}
+\unicode{$F9}{\`u}
+\unicode{$FA}{\'u}
+\unicode{$FB}{\^u}
+\unicode{$FC}{\''u}
+\unicode{$FD}{\'y}
+\unicode{$FF}{\''y}
+\unicode{$100}{\=A}
+\unicode{$101}{\=a}
+\unicode{$102}{\u A}
+\unicode{$103}{\u a}
+\unicode{$104}{\k A}
+\unicode{$105}{\k a}
+\unicode{$106}{\'C}
+\unicode{$107}{\'c}
+\unicode{$108}{\^C}
+\unicode{$109}{\^c}
+\unicode{$10A}{\.C}
+\unicode{$10B}{\.c}
+\unicode{$10C}{\v C}
+\unicode{$10D}{\v c}
+\unicode{$10E}{\v D}
+\unicode{$112}{\=E}
+\unicode{$113}{\=e}
+\unicode{$114}{\u E}
+\unicode{$115}{\u e}
+\unicode{$116}{\.E}
+\unicode{$117}{\.e}
+\unicode{$118}{\k E}
+\unicode{$119}{\k e}
+\unicode{$11A}{\v E}
+\unicode{$11B}{\v e}
+\unicode{$11C}{\^G}
+\unicode{$11D}{\^g}
+\unicode{$11E}{\u G}
+\unicode{$11F}{\u g}
+\unicode{$120}{\.G}
+\unicode{$121}{\.g}
+\unicode{$124}{\^H}
+\unicode{$125}{\^h}
+\unicode{$128}{\~I}
+\unicode{$129}{\~i}
+\unicode{$12A}{\=I}
+\unicode{$12B}{\accent{texcmr}{22}\i{}}
+\unicode{$12C}{\u I}
+\unicode{$12D}{\accent{texcmr}{21}\i{}}
+\unicode{$12E}{\k I}
+\unicode{$12F}{\k i}
+\unicode{$134}{\^J}
+\unicode{$135}{\^j}
+\unicode{$139}{\'L}
+\unicode{$13A}{\'l}
+\unicode{$141}{\L{}}
+\unicode{$142}{\l{}}
+\unicode{$143}{\'N}
+\unicode{$144}{\'n}
+\unicode{$147}{\v N}
+\unicode{$148}{\v n}
+\unicode{$14C}{\=O}
+\unicode{$14D}{\=o}
+\unicode{$14E}{\u O}
+\unicode{$14F}{\u o}
+\unicode{$150}{\H O}
+\unicode{$151}{\H o}
+\unicode{$152}{\adobeOE{}}
+\unicode{$153}{\adobeoe{}}
+\unicode{$154}{\'R}
+\unicode{$155}{\'r}
+\unicode{$158}{\v R}
+\unicode{$159}{\v r}
+\unicode{$15A}{\'S}
+\unicode{$15B}{\'s}
+\unicode{$15C}{\^S}
+\unicode{$15D}{\^s}
+\unicode{$15E}{\c S}
+\unicode{$15F}{\c s}
+\unicode{$160}{\v S}
+\unicode{$161}{\v s}
+\unicode{$164}{\v T}
+\unicode{$168}{\~U}
+\unicode{$169}{\~u}
+\unicode{$16A}{\=U}
+\unicode{$16B}{\=u}
+\unicode{$16C}{\u U}
+\unicode{$16D}{\u u}
+\unicode{$16E}{\accent{texcmr}{23}U}
+\unicode{$16F}{\accent{texcmr}{23}u}
+\unicode{$170}{\H U}
+\unicode{$171}{\H u}
+\unicode{$174}{\^W}
+\unicode{$175}{\^w}
+\unicode{$176}{\^Y}
+\unicode{$177}{\^y}
+\unicode{$178}{\''Y}
+\unicode{$179}{\'Z}
+\unicode{$17A}{\'z}
+\unicode{$17B}{\.Z}
+\unicode{$17C}{\.z}
+\unicode{$17D}{\v Z}
+\unicode{$17E}{\v z}
+\unicode{$1CD}{\v A}
+\unicode{$1CE}{\v a}
+\unicode{$1CF}{\v I}
+\unicode{$1D0}{\v i}
+\unicode{$1D1}{\v O}
+\unicode{$1D2}{\v o}
+\unicode{$1D3}{\v U}
+\unicode{$1D4}{\v u}
+\unicode{$1FC}{\accent{texcmr}{19}\AE{}}
+\unicode{$1FD}{\accent{texcmr}{19}\ae{}}
+\unicode{$3B1}{\alpha{}}
+\unicode{$3B2}{\beta{}}
+\unicode{$3B3}{\gamma{}}
+\unicode{$3B4}{\delta{}}
+\unicode{$3B5}{\epsilon{}}
+\unicode{$3B6}{\zeta{}}
+\unicode{$3B7}{\eta{}}
+\unicode{$3B8}{\theta{}}
+\unicode{$3B9}{\iota{}}
+\unicode{$3BA}{\kappa{}}
+\unicode{$3BB}{\lambda{}}
+\unicode{$3BC}{\mu{}}
+\unicode{$3BD}{\nu{}}
+\unicode{$3BE}{\xi{}}
+\unicode{$3BF}{o}
+\unicode{$3C0}{\pi{}}
+\unicode{$3C1}{\rho{}}
+\unicode{$3C3}{\sigma{}}
+\unicode{$3C4}{\tau{}}
+\unicode{$3C5}{\upsilon{}}
+\unicode{$3C6}{\phi{}}
+\unicode{$3C7}{\chi{}}
+\unicode{$3C8}{\psi{}}
+\unicode{$3C9}{\omega{}}
+\unicode{$391}{A}
+\unicode{$392}{B}
+\unicode{$393}{\Gamma{}}
+\unicode{$394}{\Delta{}}
+\unicode{$395}{E}
+\unicode{$396}{F}
+\unicode{$397}{G}
+\unicode{$398}{\Theta{}}
+\unicode{$399}{I}
+\unicode{$39A}{K}
+\unicode{$39B}{\Lambda{}}
+\unicode{$39C}{M}
+\unicode{$39D}{N}
+\unicode{$39E}{\Xi{}}
+\unicode{$39F}{O}
+\unicode{$3A0}{\Pi{}}
+\unicode{$3A1}{R}
+\unicode{$3A3}{\Sigma{}}
+\unicode{$3A4}{T}
+\unicode{$3A5}{\Upsilon{}}
+\unicode{$3A6}{\Phi{}}
+\unicode{$3A7}{X}
+\unicode{$3A8}{\Psi{}}
+\unicode{$3A9}{\Omega{}}
+end text
+
+begin text
+\presave
+end text
diff --git a/src/TeX/makeinittex.cmd b/src/TeX/makeinittex.cmd
new file mode 100755
index 0000000..ef6e9cf
--- /dev/null
+++ b/src/TeX/makeinittex.cmd
@@ -0,0 +1,46 @@
+ at echo off
+
+rem ########################################################################
+rem # #
+rem # GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+rem # #
+rem # Modified BSD License #
+rem # #
+rem # Copyright (C) 2009 GLE. #
+rem # #
+rem # Redistribution and use in source and binary forms, with or without #
+rem # modification, are permitted provided that the following conditions #
+rem # are met: #
+rem # #
+rem # 1. Redistributions of source code must retain the above copyright #
+rem # notice, this list of conditions and the following disclaimer. #
+rem # #
+rem # 2. Redistributions in binary form must reproduce the above #
+rem # copyright notice, this list of conditions and the following #
+rem # disclaimer in the documentation and/or other materials provided with #
+rem # the distribution. #
+rem # #
+rem # 3. The name of the author may not be used to endorse or promote #
+rem # products derived from this software without specific prior written #
+rem # permission. #
+rem # #
+rem # THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+rem # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+rem # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+rem # ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+rem # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+rem # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+rem # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+rem # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+rem # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+rem # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+rem # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+rem # #
+rem ########################################################################
+
+rem Setting GLE_TOP in config.os2 didn't work (depends from the used shell? I don't know.).
+rem Use this CMD script to create inittex.ini.
+setlocal
+set gle_top=..\..\build
+%gle_top%\bin\gle.exe -mkinittex
+endlocal
diff --git a/src/config.h.in b/src/config.h.in
new file mode 100644
index 0000000..eabb7c6
--- /dev/null
+++ b/src/config.h.in
@@ -0,0 +1,87 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+// Operating system
+
+#undef __UNIX__
+#undef __WIN32__
+#undef __OS2__
+#undef __NOCYGWIN__
+#undef __CYGWIN__
+#undef __MACOS__
+#undef __FREEBSD__
+#undef __GNU_HURD__
+#undef __LINUX__
+
+#undef __VN__
+#undef __BN__
+
+#undef HAVE_SOCKETS
+
+#undef HAVE_LIBZ
+#undef HAVE_LIBPNG
+#undef HAVE_LIBJPEG
+#undef HAVE_LIBTIFF
+
+#undef HAVE_X11
+#undef HAVE_CAIRO
+#undef HAVE_POPPLER
+
+#undef WORDS_BIGENDIAN
+
+#undef HAVE_SYS_TYPES_H
+#undef HAVE_SYS_STAT_H
+#undef STDC_HEADERS
+#undef HAVE_STDLIB_H
+#undef HAVE_STRING_H
+#undef STDC_HEADERS
+#undef HAVE_MEMORY_H
+#undef HAVE_STRINGS_H
+#undef HAVE_UNISTD_H
+#undef HAVE_STDINT_H
+#undef HAVE_INTTYPES_H
+#undef HAVE_SYS_PARAM_H
+#undef HAVE_LIBGLU_H
+
+#undef HAVE_NCURSES_H
+#undef HAVE_CURSES_H
+
+#undef HAVE_LIBGLE
+#undef HAVE_LIBGLE_STATIC
+
+#undef GLE_SNAPSHOT
diff --git a/src/config.h.os2 b/src/config.h.os2
new file mode 100644
index 0000000..9fb8663
--- /dev/null
+++ b/src/config.h.os2
@@ -0,0 +1,51 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#define HAVE_SOCKETS
+
+#define HAVE_SYS_TYPES_H 1
+#define HAVE_SYS_STAT_H 1
+#define STDC_HEADERS 1
+#define HAVE_STDLIB_H 1
+#define HAVE_STRING_H 1
+#define STDC_HEADERS 1
+#define HAVE_MEMORY_H 1
+#define HAVE_UNISTD_H 1
+
+#define HAVE_NCURSES_H 1
+
diff --git a/src/config_noauto.h b/src/config_noauto.h
new file mode 100644
index 0000000..de913be
--- /dev/null
+++ b/src/config_noauto.h
@@ -0,0 +1,48 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#define HAVE_SOCKETS
+
+#define HAVE_SYS_TYPES_H 1
+#define HAVE_SYS_STAT_H 1
+#define STDC_HEADERS 1
+#define HAVE_STDLIB_H 1
+#define HAVE_STRING_H 1
+#define STDC_HEADERS 1
+#define HAVE_NCURSES_H 1
+
diff --git a/src/doc/gle.1.in b/src/doc/gle.1.in
new file mode 100644
index 0000000..98f659e
--- /dev/null
+++ b/src/doc/gle.1.in
@@ -0,0 +1,129 @@
+.\" !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+.\" ! !
+.\" ! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+.\" ! !
+.\" ! Modified BSD License !
+.\" ! !
+.\" ! Copyright (C) 2009 GLE. !
+.\" ! !
+.\" ! Redistribution and use in source and binary forms, with or without !
+.\" ! modification, are permitted provided that the following conditions !
+.\" ! are met: !
+.\" ! !
+.\" ! 1. Redistributions of source code must retain the above copyright !
+.\" ! notice, this list of conditions and the following disclaimer. !
+.\" ! !
+.\" ! 2. Redistributions in binary form must reproduce the above !
+.\" ! copyright notice, this list of conditions and the following !
+.\" ! disclaimer in the documentation and/or other materials provided with !
+.\" ! the distribution. !
+.\" ! !
+.\" ! 3. The name of the author may not be used to endorse or promote !
+.\" ! products derived from this software without specific prior written !
+.\" ! permission. !
+.\" ! !
+.\" ! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+.\" ! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+.\" ! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+.\" ! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+.\" ! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+.\" ! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+.\" ! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+.\" ! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+.\" ! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+.\" ! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+.\" ! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+.\" ! !
+.\" !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+.\"
+.\" Process this file with
+.\" groff -man -Tascii foo.1
+.\"
+.TH GLE 1 "JULY 2007" @GLE_VERSION@ "User Manuals"
+.SH NAME
+gle \- Graphics Layout Engine
+.SH SYNOPSIS
+.B gle
+[options]
+.I file.gle
+.B ...
+.SH DESCRIPTION
+GLE (Graphics Layout Engine) is a graphics scripting language designed for creating publication quality graphs, plots, diagrams, figures and slides. GLE supports various graph types (function plots, histograms, bar graphs, scatter plots, contour lines, color maps, surface plots, ...) through a simple but flexible set of graphing commands. More complex output can be created by relying on GLE's scripting language, which is full featured with subroutines, variables, and logic control. GLE r [...]
+.SH DOCUMENTATION
+GLE's documentation is distrubuted in PDF format and can be found at the GLE website:
+.P
+<http://www.gle\-graphics.org>
+.SH OPTIONS
+.IP \-help
+Shows help about command line options.
+.IP \-info
+Outputs software version, build date, GLE_TOP, GLE_BIN, etc..
+.IP \-verbosity
+Sets the verbosity level of GLE console output.
+.IP \-device
+Selects output device(s).
+.IP \-cairo
+Use cairo output device.
+.IP \-resolution
+Sets the resolution for bitmap and PDF output.
+.IP \-fullpage
+Selects full page output.
+.IP \-landscape
+Selects full page landscape output.
+.IP \-output
+Specifies the name of the output file.
+.IP \-nosave
+Don't write output file to disk (dry-run).
+.IP \-preview
+Previews the output with QGLE.
+.IP \-gs
+Previews the output with GhostScript.
+.IP \-version
+Selects a GLE version to run.
+.IP \-compatibility
+Selects a GLE compatibility mode.
+.IP \-calc
+Runs GLE in "calculator" mode.
+.IP \-catcsv
+Pretty print a CSV file to standard output.
+.IP \-tex
+Indicates that the script includes LaTeX expressions.
+.IP \-inc
+Creates an .inc file with LaTeX code.
+.IP \-texincprefix
+Adds the given subdirectory to the path in the .inc file.
+.IP \-mkinittex
+Creates "inittex.ini" from "init.tex".
+.IP \-nocolor
+Forces grayscale output.
+.IP \-transparent
+Creates transparent output (with \-d png).
+.IP \-noctrl\-d
+Excludes CTRL-D from the PostScript output.
+.IP \-nomaxpath
+Disables the upper-bound on the drawing path complexity.
+.IP \-noligatures
+Disable the use of ligatures for 'fl' and 'fi'.
+.IP \-gsoptions
+Specify additional options for GhostScript.
+.IP \-safemode
+Disables reading/writing to the file system.
+.IP \-allowread
+Allows reading from the given path.
+.IP \-allowwrite
+Allows writing to the given path.
+.IP \-keep
+Don't delete temporary files.
+.SH FILES
+.I @GLE_INSTALL_DATA@/glerc
+.RS
+The system wide configuration file.
+.RE
+.I ~/.glerc
+.RS
+Per user configuration file.
+.SH ENVIRONMENT
+.IP GLE_USRLIB
+The search path for include files.
+.IP GLE_TOP
+The location of the fonts and other resources.
diff --git a/src/fbuild/Makefile.gcc b/src/fbuild/Makefile.gcc
new file mode 100644
index 0000000..e562e6f
--- /dev/null
+++ b/src/fbuild/Makefile.gcc
@@ -0,0 +1,57 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+#
+# makefile.vc for makefmt
+# for compilation with MS vc++ .net
+#
+#
+include ../../config.gcc
+#
+include files.txt
+
+all: $(OBJECTS) $(PROJECT_BINDIR)/bin/$(PROGRAM)$(EXE_SUFF)
+
+$(OBJECTS): $(INCLUDES)
+ $(CC) $(CXXFLAGS) -c $(OBJECTS:.o=.cpp)
+
+$(PROJECT_BINDIR)/bin/$(PROGRAM)$(EXE_SUFF): $(OBJECTS) $(EXTRA_OBJS) $(INCLUDES) $(PROGRAM).cpp
+ $(CC) $(CXXFLAGS) $(PROGRAM).cpp $(OBJECTS) $(EXTRA_OBJS) -o $(PROJECT_BINDIR)/bin/$(PROGRAM)$(EXE_SUFF)
+
+clean:
+ -$(RM) $(OBJECTS) $(PROJECT_BINDIR)/bin/$(PROGRAM)$(EXE_SUFF) $(PROGRAM).$(OBJ_SUFF)
diff --git a/src/fbuild/Makefile.in b/src/fbuild/Makefile.in
new file mode 100644
index 0000000..b465414
--- /dev/null
+++ b/src/fbuild/Makefile.in
@@ -0,0 +1,75 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+#
+# makefile.vc for makefmt
+# for compilation with MS vc++ .net
+#
+
+include ../../config.i
+include ../../config.aconf
+
+include files.txt
+
+CXX=@CXX@
+CPPFLAGS=@CPPFLAGS@
+
+LDFLAGS=@LDFLAGS@
+LIBS=@LIBS@
+ELIBS=
+
+ifeq (@HAVE_LIBGLE_CPPFLAGS@,1)
+ EXTRA_OBJS := ../gle/cutils.static.$(OBJ_SUFF) ../gle/file_io.static.$(OBJ_SUFF)
+endif
+
+ifeq (@HAVE_WIN32@,1)
+ ELIBS := -lwsock32
+endif
+
+CPPFLAGS := $(strip $(CPPFLAGS))
+
+all: $(OBJECTS) $(PROJECT_BINDIR)/bin/$(PROGRAM)$(EXE_SUFF)
+
+$(OBJECTS): %.o: %.cpp $(INCLUDES)
+ $(CXX) $(CPPFLAGS) -c $< -o $@
+
+$(PROJECT_BINDIR)/bin/$(PROGRAM)$(EXE_SUFF): $(OBJECTS) $(EXTRA_OBJS) $(INCLUDES) $(PROGRAM).cpp
+ $(CXX) $(CPPFLAGS) $(PROGRAM).cpp $(OBJECTS) $(EXTRA_OBJS) $(ELIBS) -o $(PROJECT_BINDIR)/bin/$(PROGRAM)$(EXE_SUFF)
+
+clean:
+ -$(RM) $(OBJECTS) $(PROJECT_BINDIR)/bin/$(PROGRAM)$(EXE_SUFF) $(PROGRAM).$(OBJ_SUFF)
diff --git a/src/fbuild/Makefile.os2 b/src/fbuild/Makefile.os2
new file mode 100644
index 0000000..dbcee12
--- /dev/null
+++ b/src/fbuild/Makefile.os2
@@ -0,0 +1,58 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+#
+# makefile.vc for makefmt
+# for compilation with MS vc++ .net
+#
+#
+include ../../config.i
+include ../../config.os2
+#
+include files.txt
+
+all: $(OBJECTS) $(PROJECT_BINDIR)/bin/$(PROGRAM)$(EXE_SUFF)
+
+$(OBJECTS): $(INCLUDES)
+ $(CC) $(CXXFLAGS) -c $(OBJECTS:.o=.cpp)
+
+$(PROJECT_BINDIR)/bin/$(PROGRAM)$(EXE_SUFF): $(OBJECTS) $(EXTRA_OBJS) $(INCLUDES) $(PROGRAM).cpp
+ $(CC) $(CXXFLAGS) $(PROGRAM).cpp $(OBJECTS) $(EXTRA_OBJS) -o $(PROJECT_BINDIR)/bin/$(PROGRAM)$(EXE_SUFF)
+
+clean:
+ -$(RM) $(OBJECTS) $(PROJECT_BINDIR)/bin/$(PROGRAM)$(EXE_SUFF) $(PROGRAM).$(OBJ_SUFF)
diff --git a/src/fbuild/Makefile.vc b/src/fbuild/Makefile.vc
new file mode 100644
index 0000000..9fcfc7d
--- /dev/null
+++ b/src/fbuild/Makefile.vc
@@ -0,0 +1,56 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+#
+# makefile.vc for makefmt
+# for compilation with MS vc++ .net
+#
+#
+!include ..\..\config.vc
+#
+!include files.txt
+
+all: $(OBJECTS) $(PROJECT_BINDIR)\bin\$(PROGRAM)$(EXE_SUFF)
+
+$(OBJECTS): $(INCLUDES)
+
+$(PROJECT_BINDIR)\bin\$(PROGRAM)$(EXE_SUFF): $(OBJECTS) $(INCLUDES) $(EXTRA_OBJS) $(PROGRAM).cpp
+ $(CC) $(CPPFLAGS) $(PROGRAM).cpp -o $(PROJECT_BINDIR)\bin\$(PROGRAM)$(EXE_SUFF) $(OBJECTS) $(EXTRA_OBJS)
+
+clean:
+ -$(RM) $(OBJECTS) $(PROJECT_BINDIR)\bin\$(PROGRAM)$(EXE_SUFF) $(PROGRAM).$(OBJ_SUFF)
diff --git a/src/fbuild/basicconf.h b/src/fbuild/basicconf.h
new file mode 100644
index 0000000..132d2f3
--- /dev/null
+++ b/src/fbuild/basicconf.h
@@ -0,0 +1,99 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#ifndef INCLUDE_BASICCONF_H
+#define INCLUDE_BASICCONF_H
+
+#ifdef HAVE_CONFIG_H
+ #include "../config.h"
+#else
+ #include "../config_noauto.h"
+#endif
+
+#ifdef __UNIX__
+ #define READ_BIN "r"
+ #define WRITE_BIN "w"
+#endif
+
+#ifdef __WIN32__
+ #define READ_BIN "rb"
+ #define WRITE_BIN "wb"
+#endif
+
+#if defined(__OS2__) && defined(__EMX__)
+ #define READ_BIN "rb"
+ #define WRITE_BIN "wb"
+#endif
+
+#include <stdio.h>
+#if HAVE_SYS_TYPES_H
+ #include <sys/types.h>
+#endif
+#if HAVE_SYS_STAT_H
+ #include <sys/stat.h>
+#endif
+#if STDC_HEADERS
+ #include <stdlib.h>
+ #include <stddef.h>
+#else
+ #if HAVE_STDLIB_H
+ #include <stdlib.h>
+ #endif
+#endif
+#if HAVE_STRING_H
+ #if !STDC_HEADERS && HAVE_MEMORY_H
+ #include <memory.h>
+ #endif
+ #include <string.h>
+#endif
+#if HAVE_STRINGS_H
+ #include <strings.h>
+#endif
+#if HAVE_UNISTD_H
+ #include <unistd.h>
+#endif
+#include <math.h>
+
+#include <string>
+#include <vector>
+#include <iostream>
+#include <fstream>
+
+using namespace std;
+
+#endif
diff --git a/src/fbuild/fbuild.cpp b/src/fbuild/fbuild.cpp
new file mode 100644
index 0000000..0eb9e5a
--- /dev/null
+++ b/src/fbuild/fbuild.cpp
@@ -0,0 +1,250 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+/*----------------------------------------------------------------------*/
+/* This is the font builder for GLE, it runs completely independently */
+/* and only understands the following commands. */
+/*1 AMOVE x y */
+/*2 ALINE x y */
+/*3 BEZIER x y x y x y */
+/*4 CLOSEPATH */
+/*5 FILL */
+/*6 STROKE */
+/*8 SET LWIDTH w */
+/*7 FILLWHITE (no newpath ) */
+/*15 DFONT ENDCHAR */
+/* DFONT CHAR=nn or CHAR="A" */
+/* DFONT DESIGN=v */
+/*----------------------------------------------------------------------*/
+#define GPRINTDEF
+
+#include "basicconf.h"
+#include "token.h"
+#include "../gle/cutils.h"
+#include "../gle/file_io.h"
+
+#define gprint printf
+
+int debugit=0;
+#define dbg if (debugit==1)
+double design,gx,gy;
+int thischar;
+char inbuff[200],zzz[200];
+char source[20];
+char tk[TOKEN_LENGTH][TOKEN_WIDTH];
+char tkbuff[500];
+unsigned char *outbuff;
+int outpnt[256];
+int nbig,nsmall;
+int cx,cy;
+int nout;
+
+void sendp(int p);
+void sendx(double x);
+void sendxy(double x, double y);
+void sendxyabs(double x, double y);
+void sendi(int ix);
+void do_line(void);
+
+int main(int argc, char **argv) {
+ int ntok;
+ int i;
+ FILE *fptr;
+ char *s;
+ char space_str[] = " ";
+ char fname[80];
+ char outfile[80];
+ design = 1;
+ token_equal();
+ strcpy(fname,*(++argv));
+ s = strchr(fname,'.');
+ if (s!=NULL) *s = 0;
+ strcpy(outfile,fname);
+ if (strchr(fname,':')!=NULL) strcpy(outfile,strchr(fname,':')+1);
+ strcat(outfile,".fve");
+ strcat(fname,".gle");
+ printf("[%s]==>[%s]\n",fname,outfile);
+ outbuff = (unsigned char*) malloc(64000);
+ GLEFileIO fout;
+ fout.open(outfile, WRITE_BIN);
+ if (!fout.isOpen()) perror("Could not open output file \n");
+ fptr = fopen(fname,"r");
+ if (fptr==NULL) perror("Could not open input file \n");
+ for (i=0;i<TOKEN_LENGTH;i++) strcpy(tk[i],space_str);
+ if (fgets(inbuff,200,fptr) != 0) {
+ while (!feof(fptr)) {
+ #ifdef __UNIX__
+ // remove DOS CR if present
+ i = strlen(inbuff);
+ if (i >= 2 && inbuff[i-2] == '\r') {
+ inbuff[i-2] = '\n';
+ inbuff[i-1] = '\0';
+ }
+ #endif
+ /* printf("Source | %s",inbuff); */
+ token(inbuff,tk,&ntok,tkbuff);
+ do_line();
+ if (fgets(inbuff,200,fptr) == 0) {
+ break;
+ }
+ }
+ }
+ //printf(" nbig %d nsmall %d nbytes %d\n",nbig,nsmall,nout);
+/* for (i=0;i<100;i++) if (outpnt[i]>0) dbg printf("index %d %d ",i,outpnt[i]);*/
+ dbg printf("\n\n");
+ dbg printf("\n nbig %d nsmall %d nbytes %d\n\n",nbig,nsmall,nout);
+ for (i=0;i<100;i++) dbg printf("%d ",*(outbuff+i));
+ dbg printf("\n nbig %d nsmall %d nbytes %d\n\n",nbig,nsmall,nout);
+ outpnt[0] = nout;
+ fout.fwrite(outpnt, sizeof(i), 256);
+ fout.fwrite(outbuff, 1, nout);
+ fout.close();
+ fclose(fptr);
+ return 0;
+}
+/*--------------------------------------------------------------------------*/
+#define skipspace if (*tk[ct]==' ') ct++;
+void do_line()
+{
+ int ct;
+
+ ct = 1;
+ if (str_i_equals(tk[ct],"ALINE")) {
+ sendp(2);
+ sendxy(gx=atof(tk[2]),gy=atof(tk[3]));
+ } else if (str_i_equals(tk[ct],"RLINE")) {
+ sendp(2);
+ gx = gx + atof(tk[2]);
+ gy = gy + atof(tk[3]);
+ sendxy(gx,gy);
+ } else if (str_i_equals(tk[ct],"RMOVE")) {
+ sendp(1);
+ gx = gx + atof(tk[2]);
+ gy = gy + atof(tk[3]);
+ sendxyabs(gx,gy);
+ } else if (str_i_equals(tk[ct],"BEZIER")) {
+ sendp(3);
+ sendxy(atof(tk[2]),atof(tk[3]));
+ sendxy(atof(tk[4]),atof(tk[5]));
+ sendxy(gx=atof(tk[6]),gy=atof(tk[7]));
+ } else if (str_i_equals(tk[ct],"AMOVE")) {
+ sendp(1);
+ sendxyabs(gx=atof(tk[2]),gy=atof(tk[3]));
+ } else if (str_i_equals(tk[ct],"ASETPOS")) {
+ sendp(9);
+ sendxyabs(gx=atof(tk[2]),gy=atof(tk[3]));
+ } else if (str_i_equals(tk[ct],"CIRCLE")) {
+ sendp(10);
+ sendx(atof(tk[2]));
+ } else if (str_i_equals(tk[ct],"CLOSEPATH")) sendp(4);
+ else if (str_i_equals(tk[ct],"FILL")) sendp(5);
+ else if (str_i_equals(tk[ct],"FILLWHITE")) sendp(7);
+ else if (str_i_equals(tk[ct],"STROKE")) sendp(6);
+ else if (strcmp(tk[ct],"\n")==0) ;
+ else if (str_i_equals(tk[ct],"FBY")) ;
+ else if (str_i_equals(tk[ct],"NEWPATH")) ;
+ else if (str_i_equals(tk[ct],"\n")) ;
+ else if (strcmp(tk[ct],"!")==0) ;
+ else if (str_i_equals(tk[ct],"SET")) {
+ if (str_i_equals(tk[2],"LWIDTH")) {
+ sendp(8); sendx(atof(tk[3]));
+ }
+ }
+ else if (str_i_equals(tk[ct],"DFONT")) {
+ ct+=1;
+ if (str_i_equals(tk[ct],"DESIGN")) {
+ ct++;ct++;
+ design = atof(tk[ct]);
+ //printf(" %g",design);
+ } else if (str_i_equals(tk[ct],"CHAR")) {
+ ct++;ct++;
+ if (*tk[ct]=='"') thischar = *(tk[ct]+1);
+ else thischar = atoi(tk[ct]);
+ if (thischar==0) thischar=254;
+ outpnt[thischar] = nout;
+ dbg printf("This char %d {%s} nout %d \n",thischar,tk[ct],nout);
+ } else if (str_i_equals(tk[ct],"ENDCHAR")) sendp(15) ;
+ else if (str_i_equals(tk[ct],"WID")) ;
+ else if (str_i_equals(tk[ct],"FBY")) ;
+ else dbg printf("DFONT unknown command {%s} \n",tk[ct]);
+ }
+ else dbg printf("Unrecoginzed FONT BUILD command {%s} \n",tk[ct]);
+ ct++;
+}
+void sendp(int p)
+{
+ *(outbuff+nout++) = p;
+}
+int scl(double x);
+int scl(double x)
+{
+ return (int)(1000*x/design);
+}
+void sendxyabs(double x, double y)
+{
+ cx = scl(x);
+ cy = scl(y);
+ sendi(cx); sendi(cy);
+/* printf("Move cx cy %d %d %g %g \n",cx,cy,x,y); */
+}
+void sendxy(double x, double y)
+{
+/* printf("rove cx cy %d %d %d %d %g %g \n",cx,cy,scl(x),scl(y),x,y); */
+ sendi(scl(x)-cx); sendi(scl(y)-cy);
+ cx = scl(x);
+ cy = scl(y);
+}
+void sendi(int ix)
+{
+ union jjj {char a[2]; short b;} both;
+/* if (thischar=='i') printf("ix %d \n",ix);
+*/
+ if (ix>120 || ix <-120) {
+ both.b = ix;
+ *(outbuff+nout++) = 127;
+ *(outbuff+nout++) = both.a[0];
+ *(outbuff+nout++) = both.a[1];
+ nbig++;
+ } else { *(outbuff+nout++) = ix; nsmall++; }
+}
+void sendx(double x)
+{
+ sendi(scl(x));
+}
+
+
diff --git a/src/fbuild/files.txt b/src/fbuild/files.txt
new file mode 100644
index 0000000..ad73e9e
--- /dev/null
+++ b/src/fbuild/files.txt
@@ -0,0 +1,55 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+#
+# files list for GLE to be included by the makefiles
+#
+
+PROGRAM = \
+fbuild
+
+INCLUDES = \
+token.h \
+../gle/cutils.h
+
+OBJECTS = \
+token.$(OBJ_SUFF)
+
+EXTRA_OBJS = \
+../gle/cutils.$(OBJ_SUFF) \
+../gle/file_io.$(OBJ_SUFF)
diff --git a/src/fbuild/token.cpp b/src/fbuild/token.cpp
new file mode 100644
index 0000000..0c4a433
--- /dev/null
+++ b/src/fbuild/token.cpp
@@ -0,0 +1,242 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#include "basicconf.h"
+#include "token.h"
+#include "../gle/cutils.h"
+
+void add_tokf(char* pp1,int n,TOKENS tok, int* ntok, char* outbuff, int tj, bool in_quote)
+{
+ char* token_start;
+// for(vi=1;vi<=*ntok;vi++) printf("(add_tokf) tok[%d]=%s\n",vi,tok[vi]);
+ (*ntok)++;
+// tok[*ntok] = outbuff;
+ //
+ // save the starting position
+ //
+ token_start = outbuff;
+// printf("tok=%u outbuf=%u\n",tok,outbuff);
+// for(vi=1;vi<=*ntok-1;vi++) printf("(add_tokf) tok[%d]=%s\n",vi,tok[vi]);
+// printf("outbuff=%s pp1=%s\n",outbuff,pp1);
+ for (tj=0;tj<n;tj++){
+ if (in_quote){
+ *(outbuff+tj) = *(pp1+tj);
+ }else{
+ *(outbuff+tj) = toupper(*(pp1+tj));
+ }
+ if (*(outbuff+tj) == '"' && *(outbuff+tj-1) != '\\'){
+ in_quote = (in_quote ? false :true);
+ }
+ }
+ in_quote = false;
+ outbuff = outbuff + (n);
+ *(outbuff++) = '\0';
+// printf("a ntok=%d tok[%d]=%s token_start=%s",*ntok,*ntok,tok[*ntok],token_start);
+ //fflush(stdout);
+ strcpy(tok[*ntok],token_start);
+// printf("(add_tokf) token added tok[%d]=%s\n",*ntok,tok[*ntok]);
+// for(vi=1;vi<=*ntok;vi++) printf("(add_tokf) tok[%d]=%s\n",vi,tok[vi]);
+}
+
+static char term_table1[256];
+static char term_table2[256];
+static char term_table3[256];
+static char *term_table;
+static int table_loaded;
+char *find_non_term();
+char *find_non_space();
+char *find_term();
+int spmode;
+/* typedef char (*(*TOKENS)[500]); */
+
+/*--------------------------------------------------------------------------*/
+
+void token_norm()
+{
+ if (table_loaded==false) token_init();
+ term_table = &term_table1[0];
+ spmode = false;
+}
+void token_space()
+{
+ if (table_loaded==false) token_init();
+ term_table = &term_table2[0];
+ spmode = true;
+}
+void token_equal()
+{
+ if (table_loaded==false) token_init();
+ term_table = &term_table3[0];
+ spmode = false;
+}
+void token_init()
+{
+ int i;
+ term_table = &term_table1[0];
+ table_loaded = true;
+ {const char *termset=" ,-+*)(<>=/!^@";
+ for (i=0;i<=255;i++) {
+ if (strchr(termset,i)!=NULL) {
+ term_table1[i]=true;
+ }
+ }}
+ {const char *termset=" !";
+ for (i=0;i<=255;i++) {
+ if (strchr(termset,i)!=NULL) {
+ term_table2[i]=true;
+ }
+ }
+ }
+ {const char *termset=" ,+*)(<>=/!^@";
+ for (i=0;i<=255;i++) {
+ if (strchr(termset,i)!=NULL) {
+ term_table3[i]=true;
+ }
+ }
+ }
+}
+
+void token(char *lin,TOKENS tok,int *ntok,char *outbuff)
+{
+ int jj;
+ int tj=0;
+ char* cp;
+ char* p2 = 0;
+ *ntok = 0;
+ bool in_quote = false;
+ if (table_loaded==false) token_init();
+ cp = lin;
+ cp = find_non_space(cp);
+// printf("tok=%u outbuf=%u\n",tok,outbuff);
+// printf("tok[1]=%s\n",tok[1]);
+// for(vi=0;vi<5;vi++) printf("(token)=%d tok[%d]=%s\n",*ntok,vi,tok[vi]);
+ while (*cp!=0) {
+// printf("lin =|%s| cp=%s ntok=%d ,i=%d ,jj=%d\n",lin,cp,*ntok,i,jj);
+ if (*cp==' ' || *cp==' '){
+ *cp = ' ';
+ cp = find_non_space(cp);
+ }
+ if (*cp == '!') goto endofline;
+ p2 = find_term(cp);
+ jj = p2-cp+1;
+ if (jj==0) goto endofline;
+// for(vi=1;vi<=*ntok;vi++) printf("(token)=%d tok[%d]=%s\n",*ntok,vi,tok[vi]);
+// printf("tok[1]=%s\n",tok[1]);
+ add_tokf(cp,jj,tok,ntok,outbuff,tj,in_quote);
+ //add_tok(cp,jj);
+// for(i=1;vi<=*ntok;vi++) printf("(token)=%d tok[%d]=%s\n",*ntok,vi,tok[vi]);
+ cp = p2 + 1 ;
+ if (*ntok>280) subscript();
+ }
+endofline:;
+ if (*ntok>0)
+ {
+// if ( (*(*tok)[*ntok])=='\n' ) (*ntok)--;
+ if (str_i_equals(tok[*ntok],"\n")) (*ntok)--;
+// if (strcmp((*tok)[*ntok]," ")==0) (*ntok)--;
+ if (str_i_equals(tok[*ntok]," ")) (*ntok)--;
+// if (*ntok>0) p2 = (*tok)[*ntok] + strlen((*tok)[*ntok]) - 1;
+ if (*ntok > 0) p2 = tok[*ntok] + strlen(tok[*ntok]) - 1;
+ if (p2 != 0 && *p2 == 10) *p2 = 0;
+ }
+// for(vi=1;vi<=*ntok;vi++) printf("(token) tok[%d]=%s\n",vi,tok[vi]);
+}
+
+/*--------------------------------------------------------------------------*/
+char *find_non_space(char *cp)
+{
+ for ( ; *cp!=0 ; cp++ ) {
+ if (*cp!=' ' && *cp!=' ') break;
+ }
+ return cp;
+}
+/*--------------------------------------------------------------------------*/
+char *find_term(char *cp)
+{
+char *start;
+ start = cp;
+/* if (*cp=='"') {
+ cp++;
+ for (; *cp!=0 ; cp++ ) {
+ if (*cp=='"') break;
+ }
+ return cp;
+ } */
+ for (; *cp!=0 ; cp++ ) {
+ if (*cp == '"') {
+ cp++;
+ for (; *cp!=0 ; cp++ ) {
+ if (*cp=='"') if (*(cp-1)!='\\') break;
+ }
+ }
+ if (term_table[(int)*cp]==static_cast<char>(true)) break;
+ }
+ if (cp>start) return cp-1;
+ if (*cp==' ' || *cp==' ') return cp-1;
+ if (*cp==0) return cp-1;
+ return cp;
+}
+/*--------------------------------------------------------------------------*/
+void subscript(void)
+{
+// gprint("Subscript out of range in tokenizer (use shorter lines)\n");
+ printf("Subscript out of range in tokenizer (use shorter lines)\n");
+}
+
+void token_data(char *lin,TOKENS tk,int *ntok,char *outbuff)
+{
+ char *s;
+
+ s = strtok(lin," ,=\t\n\x0a\x0c\x0d");
+ *ntok = 0;
+
+ for (;s!=NULL;) {
+ if (*s == '"' || *s == '!' || *s == ';') goto endofline;
+ *ntok += 1;
+
+ strcpy(outbuff,s);
+ strcpy(tk[*ntok],outbuff);
+ outbuff = outbuff + strlen(outbuff) + 1;
+ s = strtok(NULL," ,=\t\n\x0a\x0c\x0d");
+
+ }
+/* printf("%d",*ntok);*/
+endofline:;
+
+}
+
diff --git a/src/fbuild/token.h b/src/fbuild/token.h
new file mode 100644
index 0000000..cea6a70
--- /dev/null
+++ b/src/fbuild/token.h
@@ -0,0 +1,71 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+//#ifdef unix
+//#define VAXC 1
+//#endif
+//#ifdef VAXC
+//char *strupr(char *s);
+//#endif
+
+#ifndef INCLUDE_TOKEN
+#define INCLUDE_TOKEN
+
+//typedef struct op_key (*OPKEY)[];
+//typedef char (*(*TOKENS)[]);
+//typedef char** TOKENS;
+
+#define TOKEN_WIDTH 500
+#define TOKEN_LENGTH 500
+
+
+typedef char TOKENS[][TOKEN_WIDTH];
+
+
+char *find_non_space(char *cp);
+char *find_term(char *cp);
+void add_tokf(char* pp1,int n,TOKENS tok, int* ntok, char* outbuff, int tj, int in_quote);
+void subscript(void);
+void token(char *lin,TOKENS tok,int *ntok,char *outbuff);
+void token_data(char *lin,TOKENS tk,int *ntok,char *outbuff);
+void token_equal(void);
+void token_init(void);
+void token_norm(void);
+void token_space(void);
+
+#endif
diff --git a/src/fonts/Adobe-Core35_AFMs-314/Courier-Bold.afm b/src/fonts/Adobe-Core35_AFMs-314/Courier-Bold.afm
new file mode 100644
index 0000000..20246cc
--- /dev/null
+++ b/src/fonts/Adobe-Core35_AFMs-314/Courier-Bold.afm
@@ -0,0 +1,340 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Mon Jun 23 16:28:00 1997
+Comment UniqueID 43048
+Comment VMusage 41139 52164
+FontName Courier-Bold
+FullName Courier Bold
+FamilyName Courier
+Weight Bold
+ItalicAngle 0
+IsFixedPitch true
+FontBBox -113 -250 749 801
+UnderlinePosition -100
+UnderlineThickness 50
+Version 003.000
+Notice Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.
+EncodingScheme AdobeStandardEncoding
+CapHeight 562
+XHeight 439
+Ascender 629
+Descender -157
+StdHW 84
+StdVW 106
+StartCharMetrics 314
+C 32 ; WX 600 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 600 ; N exclam ; B 202 -15 398 572 ;
+C 34 ; WX 600 ; N quotedbl ; B 135 277 465 562 ;
+C 35 ; WX 600 ; N numbersign ; B 56 -45 544 651 ;
+C 36 ; WX 600 ; N dollar ; B 82 -126 519 666 ;
+C 37 ; WX 600 ; N percent ; B 5 -15 595 616 ;
+C 38 ; WX 600 ; N ampersand ; B 36 -15 546 543 ;
+C 39 ; WX 600 ; N quoteright ; B 171 277 423 562 ;
+C 40 ; WX 600 ; N parenleft ; B 219 -102 461 616 ;
+C 41 ; WX 600 ; N parenright ; B 139 -102 381 616 ;
+C 42 ; WX 600 ; N asterisk ; B 91 219 509 601 ;
+C 43 ; WX 600 ; N plus ; B 71 39 529 478 ;
+C 44 ; WX 600 ; N comma ; B 123 -111 393 174 ;
+C 45 ; WX 600 ; N hyphen ; B 100 203 500 313 ;
+C 46 ; WX 600 ; N period ; B 192 -15 408 171 ;
+C 47 ; WX 600 ; N slash ; B 98 -77 502 626 ;
+C 48 ; WX 600 ; N zero ; B 87 -15 513 616 ;
+C 49 ; WX 600 ; N one ; B 81 0 539 616 ;
+C 50 ; WX 600 ; N two ; B 61 0 499 616 ;
+C 51 ; WX 600 ; N three ; B 63 -15 501 616 ;
+C 52 ; WX 600 ; N four ; B 53 0 507 616 ;
+C 53 ; WX 600 ; N five ; B 70 -15 521 601 ;
+C 54 ; WX 600 ; N six ; B 90 -15 521 616 ;
+C 55 ; WX 600 ; N seven ; B 55 0 494 601 ;
+C 56 ; WX 600 ; N eight ; B 83 -15 517 616 ;
+C 57 ; WX 600 ; N nine ; B 79 -15 510 616 ;
+C 58 ; WX 600 ; N colon ; B 191 -15 407 425 ;
+C 59 ; WX 600 ; N semicolon ; B 123 -111 408 425 ;
+C 60 ; WX 600 ; N less ; B 66 15 523 501 ;
+C 61 ; WX 600 ; N equal ; B 71 118 529 398 ;
+C 62 ; WX 600 ; N greater ; B 77 15 534 501 ;
+C 63 ; WX 600 ; N question ; B 98 -14 501 580 ;
+C 64 ; WX 600 ; N at ; B 16 -15 584 616 ;
+C 65 ; WX 600 ; N A ; B -9 0 609 562 ;
+C 66 ; WX 600 ; N B ; B 30 0 573 562 ;
+C 67 ; WX 600 ; N C ; B 22 -18 560 580 ;
+C 68 ; WX 600 ; N D ; B 30 0 594 562 ;
+C 69 ; WX 600 ; N E ; B 25 0 560 562 ;
+C 70 ; WX 600 ; N F ; B 39 0 570 562 ;
+C 71 ; WX 600 ; N G ; B 22 -18 594 580 ;
+C 72 ; WX 600 ; N H ; B 20 0 580 562 ;
+C 73 ; WX 600 ; N I ; B 77 0 523 562 ;
+C 74 ; WX 600 ; N J ; B 37 -18 601 562 ;
+C 75 ; WX 600 ; N K ; B 21 0 599 562 ;
+C 76 ; WX 600 ; N L ; B 39 0 578 562 ;
+C 77 ; WX 600 ; N M ; B -2 0 602 562 ;
+C 78 ; WX 600 ; N N ; B 8 -12 610 562 ;
+C 79 ; WX 600 ; N O ; B 22 -18 578 580 ;
+C 80 ; WX 600 ; N P ; B 48 0 559 562 ;
+C 81 ; WX 600 ; N Q ; B 32 -138 578 580 ;
+C 82 ; WX 600 ; N R ; B 24 0 599 562 ;
+C 83 ; WX 600 ; N S ; B 47 -22 553 582 ;
+C 84 ; WX 600 ; N T ; B 21 0 579 562 ;
+C 85 ; WX 600 ; N U ; B 4 -18 596 562 ;
+C 86 ; WX 600 ; N V ; B -13 0 613 562 ;
+C 87 ; WX 600 ; N W ; B -18 0 618 562 ;
+C 88 ; WX 600 ; N X ; B 12 0 588 562 ;
+C 89 ; WX 600 ; N Y ; B 12 0 589 562 ;
+C 90 ; WX 600 ; N Z ; B 62 0 539 562 ;
+C 91 ; WX 600 ; N bracketleft ; B 245 -102 475 616 ;
+C 92 ; WX 600 ; N backslash ; B 99 -77 503 626 ;
+C 93 ; WX 600 ; N bracketright ; B 125 -102 355 616 ;
+C 94 ; WX 600 ; N asciicircum ; B 108 250 492 616 ;
+C 95 ; WX 600 ; N underscore ; B 0 -125 600 -75 ;
+C 96 ; WX 600 ; N quoteleft ; B 178 277 428 562 ;
+C 97 ; WX 600 ; N a ; B 35 -15 570 454 ;
+C 98 ; WX 600 ; N b ; B 0 -15 584 626 ;
+C 99 ; WX 600 ; N c ; B 40 -15 545 459 ;
+C 100 ; WX 600 ; N d ; B 20 -15 591 626 ;
+C 101 ; WX 600 ; N e ; B 40 -15 563 454 ;
+C 102 ; WX 600 ; N f ; B 83 0 547 626 ; L i fi ; L l fl ;
+C 103 ; WX 600 ; N g ; B 30 -146 580 454 ;
+C 104 ; WX 600 ; N h ; B 5 0 592 626 ;
+C 105 ; WX 600 ; N i ; B 77 0 523 658 ;
+C 106 ; WX 600 ; N j ; B 63 -146 440 658 ;
+C 107 ; WX 600 ; N k ; B 20 0 585 626 ;
+C 108 ; WX 600 ; N l ; B 77 0 523 626 ;
+C 109 ; WX 600 ; N m ; B -22 0 626 454 ;
+C 110 ; WX 600 ; N n ; B 18 0 592 454 ;
+C 111 ; WX 600 ; N o ; B 30 -15 570 454 ;
+C 112 ; WX 600 ; N p ; B -1 -142 570 454 ;
+C 113 ; WX 600 ; N q ; B 20 -142 591 454 ;
+C 114 ; WX 600 ; N r ; B 47 0 580 454 ;
+C 115 ; WX 600 ; N s ; B 68 -17 535 459 ;
+C 116 ; WX 600 ; N t ; B 47 -15 532 562 ;
+C 117 ; WX 600 ; N u ; B -1 -15 569 439 ;
+C 118 ; WX 600 ; N v ; B -1 0 601 439 ;
+C 119 ; WX 600 ; N w ; B -18 0 618 439 ;
+C 120 ; WX 600 ; N x ; B 6 0 594 439 ;
+C 121 ; WX 600 ; N y ; B -4 -142 601 439 ;
+C 122 ; WX 600 ; N z ; B 81 0 520 439 ;
+C 123 ; WX 600 ; N braceleft ; B 160 -102 464 616 ;
+C 124 ; WX 600 ; N bar ; B 255 -250 345 750 ;
+C 125 ; WX 600 ; N braceright ; B 136 -102 440 616 ;
+C 126 ; WX 600 ; N asciitilde ; B 71 153 530 356 ;
+C 161 ; WX 600 ; N exclamdown ; B 202 -146 398 449 ;
+C 162 ; WX 600 ; N cent ; B 66 -49 518 614 ;
+C 163 ; WX 600 ; N sterling ; B 72 -28 558 611 ;
+C 164 ; WX 600 ; N fraction ; B 25 -60 576 661 ;
+C 165 ; WX 600 ; N yen ; B 10 0 590 562 ;
+C 166 ; WX 600 ; N florin ; B -30 -131 572 616 ;
+C 167 ; WX 600 ; N section ; B 83 -70 517 580 ;
+C 168 ; WX 600 ; N currency ; B 54 49 546 517 ;
+C 169 ; WX 600 ; N quotesingle ; B 227 277 373 562 ;
+C 170 ; WX 600 ; N quotedblleft ; B 71 277 535 562 ;
+C 171 ; WX 600 ; N guillemotleft ; B 8 70 553 446 ;
+C 172 ; WX 600 ; N guilsinglleft ; B 141 70 459 446 ;
+C 173 ; WX 600 ; N guilsinglright ; B 141 70 459 446 ;
+C 174 ; WX 600 ; N fi ; B 12 0 593 626 ;
+C 175 ; WX 600 ; N fl ; B 12 0 593 626 ;
+C 177 ; WX 600 ; N endash ; B 65 203 535 313 ;
+C 178 ; WX 600 ; N dagger ; B 106 -70 494 580 ;
+C 179 ; WX 600 ; N daggerdbl ; B 106 -70 494 580 ;
+C 180 ; WX 600 ; N periodcentered ; B 196 165 404 351 ;
+C 182 ; WX 600 ; N paragraph ; B 6 -70 576 580 ;
+C 183 ; WX 600 ; N bullet ; B 140 132 460 430 ;
+C 184 ; WX 600 ; N quotesinglbase ; B 175 -142 427 143 ;
+C 185 ; WX 600 ; N quotedblbase ; B 65 -142 529 143 ;
+C 186 ; WX 600 ; N quotedblright ; B 61 277 525 562 ;
+C 187 ; WX 600 ; N guillemotright ; B 47 70 592 446 ;
+C 188 ; WX 600 ; N ellipsis ; B 26 -15 574 116 ;
+C 189 ; WX 600 ; N perthousand ; B -113 -15 713 616 ;
+C 191 ; WX 600 ; N questiondown ; B 99 -146 502 449 ;
+C 193 ; WX 600 ; N grave ; B 132 508 395 661 ;
+C 194 ; WX 600 ; N acute ; B 205 508 468 661 ;
+C 195 ; WX 600 ; N circumflex ; B 103 483 497 657 ;
+C 196 ; WX 600 ; N tilde ; B 89 493 512 636 ;
+C 197 ; WX 600 ; N macron ; B 88 505 512 585 ;
+C 198 ; WX 600 ; N breve ; B 83 468 517 631 ;
+C 199 ; WX 600 ; N dotaccent ; B 230 498 370 638 ;
+C 200 ; WX 600 ; N dieresis ; B 128 498 472 638 ;
+C 202 ; WX 600 ; N ring ; B 198 481 402 678 ;
+C 203 ; WX 600 ; N cedilla ; B 205 -206 387 0 ;
+C 205 ; WX 600 ; N hungarumlaut ; B 68 488 588 661 ;
+C 206 ; WX 600 ; N ogonek ; B 169 -199 400 0 ;
+C 207 ; WX 600 ; N caron ; B 103 493 497 667 ;
+C 208 ; WX 600 ; N emdash ; B -10 203 610 313 ;
+C 225 ; WX 600 ; N AE ; B -29 0 602 562 ;
+C 227 ; WX 600 ; N ordfeminine ; B 147 196 453 580 ;
+C 232 ; WX 600 ; N Lslash ; B 39 0 578 562 ;
+C 233 ; WX 600 ; N Oslash ; B 22 -22 578 584 ;
+C 234 ; WX 600 ; N OE ; B -25 0 595 562 ;
+C 235 ; WX 600 ; N ordmasculine ; B 147 196 453 580 ;
+C 241 ; WX 600 ; N ae ; B -4 -15 601 454 ;
+C 245 ; WX 600 ; N dotlessi ; B 77 0 523 439 ;
+C 248 ; WX 600 ; N lslash ; B 77 0 523 626 ;
+C 249 ; WX 600 ; N oslash ; B 30 -24 570 463 ;
+C 250 ; WX 600 ; N oe ; B -18 -15 611 454 ;
+C 251 ; WX 600 ; N germandbls ; B 22 -15 596 626 ;
+C -1 ; WX 600 ; N Idieresis ; B 77 0 523 761 ;
+C -1 ; WX 600 ; N eacute ; B 40 -15 563 661 ;
+C -1 ; WX 600 ; N abreve ; B 35 -15 570 661 ;
+C -1 ; WX 600 ; N uhungarumlaut ; B -1 -15 628 661 ;
+C -1 ; WX 600 ; N ecaron ; B 40 -15 563 667 ;
+C -1 ; WX 600 ; N Ydieresis ; B 12 0 589 761 ;
+C -1 ; WX 600 ; N divide ; B 71 16 529 500 ;
+C -1 ; WX 600 ; N Yacute ; B 12 0 589 784 ;
+C -1 ; WX 600 ; N Acircumflex ; B -9 0 609 780 ;
+C -1 ; WX 600 ; N aacute ; B 35 -15 570 661 ;
+C -1 ; WX 600 ; N Ucircumflex ; B 4 -18 596 780 ;
+C -1 ; WX 600 ; N yacute ; B -4 -142 601 661 ;
+C -1 ; WX 600 ; N scommaaccent ; B 68 -250 535 459 ;
+C -1 ; WX 600 ; N ecircumflex ; B 40 -15 563 657 ;
+C -1 ; WX 600 ; N Uring ; B 4 -18 596 801 ;
+C -1 ; WX 600 ; N Udieresis ; B 4 -18 596 761 ;
+C -1 ; WX 600 ; N aogonek ; B 35 -199 586 454 ;
+C -1 ; WX 600 ; N Uacute ; B 4 -18 596 784 ;
+C -1 ; WX 600 ; N uogonek ; B -1 -199 585 439 ;
+C -1 ; WX 600 ; N Edieresis ; B 25 0 560 761 ;
+C -1 ; WX 600 ; N Dcroat ; B 30 0 594 562 ;
+C -1 ; WX 600 ; N commaaccent ; B 205 -250 397 -57 ;
+C -1 ; WX 600 ; N copyright ; B 0 -18 600 580 ;
+C -1 ; WX 600 ; N Emacron ; B 25 0 560 708 ;
+C -1 ; WX 600 ; N ccaron ; B 40 -15 545 667 ;
+C -1 ; WX 600 ; N aring ; B 35 -15 570 678 ;
+C -1 ; WX 600 ; N Ncommaaccent ; B 8 -250 610 562 ;
+C -1 ; WX 600 ; N lacute ; B 77 0 523 801 ;
+C -1 ; WX 600 ; N agrave ; B 35 -15 570 661 ;
+C -1 ; WX 600 ; N Tcommaaccent ; B 21 -250 579 562 ;
+C -1 ; WX 600 ; N Cacute ; B 22 -18 560 784 ;
+C -1 ; WX 600 ; N atilde ; B 35 -15 570 636 ;
+C -1 ; WX 600 ; N Edotaccent ; B 25 0 560 761 ;
+C -1 ; WX 600 ; N scaron ; B 68 -17 535 667 ;
+C -1 ; WX 600 ; N scedilla ; B 68 -206 535 459 ;
+C -1 ; WX 600 ; N iacute ; B 77 0 523 661 ;
+C -1 ; WX 600 ; N lozenge ; B 66 0 534 740 ;
+C -1 ; WX 600 ; N Rcaron ; B 24 0 599 790 ;
+C -1 ; WX 600 ; N Gcommaaccent ; B 22 -250 594 580 ;
+C -1 ; WX 600 ; N ucircumflex ; B -1 -15 569 657 ;
+C -1 ; WX 600 ; N acircumflex ; B 35 -15 570 657 ;
+C -1 ; WX 600 ; N Amacron ; B -9 0 609 708 ;
+C -1 ; WX 600 ; N rcaron ; B 47 0 580 667 ;
+C -1 ; WX 600 ; N ccedilla ; B 40 -206 545 459 ;
+C -1 ; WX 600 ; N Zdotaccent ; B 62 0 539 761 ;
+C -1 ; WX 600 ; N Thorn ; B 48 0 557 562 ;
+C -1 ; WX 600 ; N Omacron ; B 22 -18 578 708 ;
+C -1 ; WX 600 ; N Racute ; B 24 0 599 784 ;
+C -1 ; WX 600 ; N Sacute ; B 47 -22 553 784 ;
+C -1 ; WX 600 ; N dcaron ; B 20 -15 727 626 ;
+C -1 ; WX 600 ; N Umacron ; B 4 -18 596 708 ;
+C -1 ; WX 600 ; N uring ; B -1 -15 569 678 ;
+C -1 ; WX 600 ; N threesuperior ; B 138 222 433 616 ;
+C -1 ; WX 600 ; N Ograve ; B 22 -18 578 784 ;
+C -1 ; WX 600 ; N Agrave ; B -9 0 609 784 ;
+C -1 ; WX 600 ; N Abreve ; B -9 0 609 784 ;
+C -1 ; WX 600 ; N multiply ; B 81 39 520 478 ;
+C -1 ; WX 600 ; N uacute ; B -1 -15 569 661 ;
+C -1 ; WX 600 ; N Tcaron ; B 21 0 579 790 ;
+C -1 ; WX 600 ; N partialdiff ; B 63 -38 537 728 ;
+C -1 ; WX 600 ; N ydieresis ; B -4 -142 601 638 ;
+C -1 ; WX 600 ; N Nacute ; B 8 -12 610 784 ;
+C -1 ; WX 600 ; N icircumflex ; B 73 0 523 657 ;
+C -1 ; WX 600 ; N Ecircumflex ; B 25 0 560 780 ;
+C -1 ; WX 600 ; N adieresis ; B 35 -15 570 638 ;
+C -1 ; WX 600 ; N edieresis ; B 40 -15 563 638 ;
+C -1 ; WX 600 ; N cacute ; B 40 -15 545 661 ;
+C -1 ; WX 600 ; N nacute ; B 18 0 592 661 ;
+C -1 ; WX 600 ; N umacron ; B -1 -15 569 585 ;
+C -1 ; WX 600 ; N Ncaron ; B 8 -12 610 790 ;
+C -1 ; WX 600 ; N Iacute ; B 77 0 523 784 ;
+C -1 ; WX 600 ; N plusminus ; B 71 24 529 515 ;
+C -1 ; WX 600 ; N brokenbar ; B 255 -175 345 675 ;
+C -1 ; WX 600 ; N registered ; B 0 -18 600 580 ;
+C -1 ; WX 600 ; N Gbreve ; B 22 -18 594 784 ;
+C -1 ; WX 600 ; N Idotaccent ; B 77 0 523 761 ;
+C -1 ; WX 600 ; N summation ; B 15 -10 586 706 ;
+C -1 ; WX 600 ; N Egrave ; B 25 0 560 784 ;
+C -1 ; WX 600 ; N racute ; B 47 0 580 661 ;
+C -1 ; WX 600 ; N omacron ; B 30 -15 570 585 ;
+C -1 ; WX 600 ; N Zacute ; B 62 0 539 784 ;
+C -1 ; WX 600 ; N Zcaron ; B 62 0 539 790 ;
+C -1 ; WX 600 ; N greaterequal ; B 26 0 523 696 ;
+C -1 ; WX 600 ; N Eth ; B 30 0 594 562 ;
+C -1 ; WX 600 ; N Ccedilla ; B 22 -206 560 580 ;
+C -1 ; WX 600 ; N lcommaaccent ; B 77 -250 523 626 ;
+C -1 ; WX 600 ; N tcaron ; B 47 -15 532 703 ;
+C -1 ; WX 600 ; N eogonek ; B 40 -199 563 454 ;
+C -1 ; WX 600 ; N Uogonek ; B 4 -199 596 562 ;
+C -1 ; WX 600 ; N Aacute ; B -9 0 609 784 ;
+C -1 ; WX 600 ; N Adieresis ; B -9 0 609 761 ;
+C -1 ; WX 600 ; N egrave ; B 40 -15 563 661 ;
+C -1 ; WX 600 ; N zacute ; B 81 0 520 661 ;
+C -1 ; WX 600 ; N iogonek ; B 77 -199 523 658 ;
+C -1 ; WX 600 ; N Oacute ; B 22 -18 578 784 ;
+C -1 ; WX 600 ; N oacute ; B 30 -15 570 661 ;
+C -1 ; WX 600 ; N amacron ; B 35 -15 570 585 ;
+C -1 ; WX 600 ; N sacute ; B 68 -17 535 661 ;
+C -1 ; WX 600 ; N idieresis ; B 77 0 523 618 ;
+C -1 ; WX 600 ; N Ocircumflex ; B 22 -18 578 780 ;
+C -1 ; WX 600 ; N Ugrave ; B 4 -18 596 784 ;
+C -1 ; WX 600 ; N Delta ; B 6 0 594 688 ;
+C -1 ; WX 600 ; N thorn ; B -14 -142 570 626 ;
+C -1 ; WX 600 ; N twosuperior ; B 143 230 436 616 ;
+C -1 ; WX 600 ; N Odieresis ; B 22 -18 578 761 ;
+C -1 ; WX 600 ; N mu ; B -1 -142 569 439 ;
+C -1 ; WX 600 ; N igrave ; B 77 0 523 661 ;
+C -1 ; WX 600 ; N ohungarumlaut ; B 30 -15 668 661 ;
+C -1 ; WX 600 ; N Eogonek ; B 25 -199 576 562 ;
+C -1 ; WX 600 ; N dcroat ; B 20 -15 591 626 ;
+C -1 ; WX 600 ; N threequarters ; B -47 -60 648 661 ;
+C -1 ; WX 600 ; N Scedilla ; B 47 -206 553 582 ;
+C -1 ; WX 600 ; N lcaron ; B 77 0 597 626 ;
+C -1 ; WX 600 ; N Kcommaaccent ; B 21 -250 599 562 ;
+C -1 ; WX 600 ; N Lacute ; B 39 0 578 784 ;
+C -1 ; WX 600 ; N trademark ; B -9 230 749 562 ;
+C -1 ; WX 600 ; N edotaccent ; B 40 -15 563 638 ;
+C -1 ; WX 600 ; N Igrave ; B 77 0 523 784 ;
+C -1 ; WX 600 ; N Imacron ; B 77 0 523 708 ;
+C -1 ; WX 600 ; N Lcaron ; B 39 0 637 562 ;
+C -1 ; WX 600 ; N onehalf ; B -47 -60 648 661 ;
+C -1 ; WX 600 ; N lessequal ; B 26 0 523 696 ;
+C -1 ; WX 600 ; N ocircumflex ; B 30 -15 570 657 ;
+C -1 ; WX 600 ; N ntilde ; B 18 0 592 636 ;
+C -1 ; WX 600 ; N Uhungarumlaut ; B 4 -18 638 784 ;
+C -1 ; WX 600 ; N Eacute ; B 25 0 560 784 ;
+C -1 ; WX 600 ; N emacron ; B 40 -15 563 585 ;
+C -1 ; WX 600 ; N gbreve ; B 30 -146 580 661 ;
+C -1 ; WX 600 ; N onequarter ; B -56 -60 656 661 ;
+C -1 ; WX 600 ; N Scaron ; B 47 -22 553 790 ;
+C -1 ; WX 600 ; N Scommaaccent ; B 47 -250 553 582 ;
+C -1 ; WX 600 ; N Ohungarumlaut ; B 22 -18 628 784 ;
+C -1 ; WX 600 ; N degree ; B 86 243 474 616 ;
+C -1 ; WX 600 ; N ograve ; B 30 -15 570 661 ;
+C -1 ; WX 600 ; N Ccaron ; B 22 -18 560 790 ;
+C -1 ; WX 600 ; N ugrave ; B -1 -15 569 661 ;
+C -1 ; WX 600 ; N radical ; B -19 -104 473 778 ;
+C -1 ; WX 600 ; N Dcaron ; B 30 0 594 790 ;
+C -1 ; WX 600 ; N rcommaaccent ; B 47 -250 580 454 ;
+C -1 ; WX 600 ; N Ntilde ; B 8 -12 610 759 ;
+C -1 ; WX 600 ; N otilde ; B 30 -15 570 636 ;
+C -1 ; WX 600 ; N Rcommaaccent ; B 24 -250 599 562 ;
+C -1 ; WX 600 ; N Lcommaaccent ; B 39 -250 578 562 ;
+C -1 ; WX 600 ; N Atilde ; B -9 0 609 759 ;
+C -1 ; WX 600 ; N Aogonek ; B -9 -199 625 562 ;
+C -1 ; WX 600 ; N Aring ; B -9 0 609 801 ;
+C -1 ; WX 600 ; N Otilde ; B 22 -18 578 759 ;
+C -1 ; WX 600 ; N zdotaccent ; B 81 0 520 638 ;
+C -1 ; WX 600 ; N Ecaron ; B 25 0 560 790 ;
+C -1 ; WX 600 ; N Iogonek ; B 77 -199 523 562 ;
+C -1 ; WX 600 ; N kcommaaccent ; B 20 -250 585 626 ;
+C -1 ; WX 600 ; N minus ; B 71 203 529 313 ;
+C -1 ; WX 600 ; N Icircumflex ; B 77 0 523 780 ;
+C -1 ; WX 600 ; N ncaron ; B 18 0 592 667 ;
+C -1 ; WX 600 ; N tcommaaccent ; B 47 -250 532 562 ;
+C -1 ; WX 600 ; N logicalnot ; B 71 103 529 413 ;
+C -1 ; WX 600 ; N odieresis ; B 30 -15 570 638 ;
+C -1 ; WX 600 ; N udieresis ; B -1 -15 569 638 ;
+C -1 ; WX 600 ; N notequal ; B 12 -47 537 563 ;
+C -1 ; WX 600 ; N gcommaaccent ; B 30 -146 580 714 ;
+C -1 ; WX 600 ; N eth ; B 58 -27 543 626 ;
+C -1 ; WX 600 ; N zcaron ; B 81 0 520 667 ;
+C -1 ; WX 600 ; N ncommaaccent ; B 18 -250 592 454 ;
+C -1 ; WX 600 ; N onesuperior ; B 153 230 447 616 ;
+C -1 ; WX 600 ; N imacron ; B 77 0 523 585 ;
+EndCharMetrics
+EndFontMetrics
diff --git a/src/fonts/Adobe-Core35_AFMs-314/Courier-BoldOblique.afm b/src/fonts/Adobe-Core35_AFMs-314/Courier-BoldOblique.afm
new file mode 100644
index 0000000..053da6c
--- /dev/null
+++ b/src/fonts/Adobe-Core35_AFMs-314/Courier-BoldOblique.afm
@@ -0,0 +1,340 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Mon Jun 23 16:28:46 1997
+Comment UniqueID 43049
+Comment VMusage 17529 79244
+FontName Courier-BoldOblique
+FullName Courier Bold Oblique
+FamilyName Courier
+Weight Bold
+ItalicAngle -12
+IsFixedPitch true
+FontBBox -57 -250 869 801
+UnderlinePosition -100
+UnderlineThickness 50
+Version 003.000
+Notice Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.
+EncodingScheme AdobeStandardEncoding
+CapHeight 562
+XHeight 439
+Ascender 629
+Descender -157
+StdHW 84
+StdVW 106
+StartCharMetrics 314
+C 32 ; WX 600 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 600 ; N exclam ; B 215 -15 495 572 ;
+C 34 ; WX 600 ; N quotedbl ; B 211 277 585 562 ;
+C 35 ; WX 600 ; N numbersign ; B 88 -45 641 651 ;
+C 36 ; WX 600 ; N dollar ; B 87 -126 630 666 ;
+C 37 ; WX 600 ; N percent ; B 101 -15 625 616 ;
+C 38 ; WX 600 ; N ampersand ; B 61 -15 595 543 ;
+C 39 ; WX 600 ; N quoteright ; B 229 277 543 562 ;
+C 40 ; WX 600 ; N parenleft ; B 265 -102 592 616 ;
+C 41 ; WX 600 ; N parenright ; B 117 -102 444 616 ;
+C 42 ; WX 600 ; N asterisk ; B 179 219 598 601 ;
+C 43 ; WX 600 ; N plus ; B 114 39 596 478 ;
+C 44 ; WX 600 ; N comma ; B 99 -111 430 174 ;
+C 45 ; WX 600 ; N hyphen ; B 143 203 567 313 ;
+C 46 ; WX 600 ; N period ; B 206 -15 427 171 ;
+C 47 ; WX 600 ; N slash ; B 90 -77 626 626 ;
+C 48 ; WX 600 ; N zero ; B 135 -15 593 616 ;
+C 49 ; WX 600 ; N one ; B 93 0 562 616 ;
+C 50 ; WX 600 ; N two ; B 61 0 594 616 ;
+C 51 ; WX 600 ; N three ; B 71 -15 571 616 ;
+C 52 ; WX 600 ; N four ; B 81 0 559 616 ;
+C 53 ; WX 600 ; N five ; B 77 -15 621 601 ;
+C 54 ; WX 600 ; N six ; B 135 -15 652 616 ;
+C 55 ; WX 600 ; N seven ; B 147 0 622 601 ;
+C 56 ; WX 600 ; N eight ; B 115 -15 604 616 ;
+C 57 ; WX 600 ; N nine ; B 75 -15 592 616 ;
+C 58 ; WX 600 ; N colon ; B 205 -15 480 425 ;
+C 59 ; WX 600 ; N semicolon ; B 99 -111 481 425 ;
+C 60 ; WX 600 ; N less ; B 120 15 613 501 ;
+C 61 ; WX 600 ; N equal ; B 96 118 614 398 ;
+C 62 ; WX 600 ; N greater ; B 97 15 589 501 ;
+C 63 ; WX 600 ; N question ; B 183 -14 592 580 ;
+C 64 ; WX 600 ; N at ; B 65 -15 642 616 ;
+C 65 ; WX 600 ; N A ; B -9 0 632 562 ;
+C 66 ; WX 600 ; N B ; B 30 0 630 562 ;
+C 67 ; WX 600 ; N C ; B 74 -18 675 580 ;
+C 68 ; WX 600 ; N D ; B 30 0 664 562 ;
+C 69 ; WX 600 ; N E ; B 25 0 670 562 ;
+C 70 ; WX 600 ; N F ; B 39 0 684 562 ;
+C 71 ; WX 600 ; N G ; B 74 -18 675 580 ;
+C 72 ; WX 600 ; N H ; B 20 0 700 562 ;
+C 73 ; WX 600 ; N I ; B 77 0 643 562 ;
+C 74 ; WX 600 ; N J ; B 58 -18 721 562 ;
+C 75 ; WX 600 ; N K ; B 21 0 692 562 ;
+C 76 ; WX 600 ; N L ; B 39 0 636 562 ;
+C 77 ; WX 600 ; N M ; B -2 0 722 562 ;
+C 78 ; WX 600 ; N N ; B 8 -12 730 562 ;
+C 79 ; WX 600 ; N O ; B 74 -18 645 580 ;
+C 80 ; WX 600 ; N P ; B 48 0 643 562 ;
+C 81 ; WX 600 ; N Q ; B 83 -138 636 580 ;
+C 82 ; WX 600 ; N R ; B 24 0 617 562 ;
+C 83 ; WX 600 ; N S ; B 54 -22 673 582 ;
+C 84 ; WX 600 ; N T ; B 86 0 679 562 ;
+C 85 ; WX 600 ; N U ; B 101 -18 716 562 ;
+C 86 ; WX 600 ; N V ; B 84 0 733 562 ;
+C 87 ; WX 600 ; N W ; B 79 0 738 562 ;
+C 88 ; WX 600 ; N X ; B 12 0 690 562 ;
+C 89 ; WX 600 ; N Y ; B 109 0 709 562 ;
+C 90 ; WX 600 ; N Z ; B 62 0 637 562 ;
+C 91 ; WX 600 ; N bracketleft ; B 223 -102 606 616 ;
+C 92 ; WX 600 ; N backslash ; B 222 -77 496 626 ;
+C 93 ; WX 600 ; N bracketright ; B 103 -102 486 616 ;
+C 94 ; WX 600 ; N asciicircum ; B 171 250 556 616 ;
+C 95 ; WX 600 ; N underscore ; B -27 -125 585 -75 ;
+C 96 ; WX 600 ; N quoteleft ; B 297 277 487 562 ;
+C 97 ; WX 600 ; N a ; B 61 -15 593 454 ;
+C 98 ; WX 600 ; N b ; B 13 -15 636 626 ;
+C 99 ; WX 600 ; N c ; B 81 -15 631 459 ;
+C 100 ; WX 600 ; N d ; B 60 -15 645 626 ;
+C 101 ; WX 600 ; N e ; B 81 -15 605 454 ;
+C 102 ; WX 600 ; N f ; B 83 0 677 626 ; L i fi ; L l fl ;
+C 103 ; WX 600 ; N g ; B 40 -146 674 454 ;
+C 104 ; WX 600 ; N h ; B 18 0 615 626 ;
+C 105 ; WX 600 ; N i ; B 77 0 546 658 ;
+C 106 ; WX 600 ; N j ; B 36 -146 580 658 ;
+C 107 ; WX 600 ; N k ; B 33 0 643 626 ;
+C 108 ; WX 600 ; N l ; B 77 0 546 626 ;
+C 109 ; WX 600 ; N m ; B -22 0 649 454 ;
+C 110 ; WX 600 ; N n ; B 18 0 615 454 ;
+C 111 ; WX 600 ; N o ; B 71 -15 622 454 ;
+C 112 ; WX 600 ; N p ; B -32 -142 622 454 ;
+C 113 ; WX 600 ; N q ; B 60 -142 685 454 ;
+C 114 ; WX 600 ; N r ; B 47 0 655 454 ;
+C 115 ; WX 600 ; N s ; B 66 -17 608 459 ;
+C 116 ; WX 600 ; N t ; B 118 -15 567 562 ;
+C 117 ; WX 600 ; N u ; B 70 -15 592 439 ;
+C 118 ; WX 600 ; N v ; B 70 0 695 439 ;
+C 119 ; WX 600 ; N w ; B 53 0 712 439 ;
+C 120 ; WX 600 ; N x ; B 6 0 671 439 ;
+C 121 ; WX 600 ; N y ; B -21 -142 695 439 ;
+C 122 ; WX 600 ; N z ; B 81 0 614 439 ;
+C 123 ; WX 600 ; N braceleft ; B 203 -102 595 616 ;
+C 124 ; WX 600 ; N bar ; B 201 -250 505 750 ;
+C 125 ; WX 600 ; N braceright ; B 114 -102 506 616 ;
+C 126 ; WX 600 ; N asciitilde ; B 120 153 590 356 ;
+C 161 ; WX 600 ; N exclamdown ; B 196 -146 477 449 ;
+C 162 ; WX 600 ; N cent ; B 121 -49 605 614 ;
+C 163 ; WX 600 ; N sterling ; B 106 -28 650 611 ;
+C 164 ; WX 600 ; N fraction ; B 22 -60 708 661 ;
+C 165 ; WX 600 ; N yen ; B 98 0 710 562 ;
+C 166 ; WX 600 ; N florin ; B -57 -131 702 616 ;
+C 167 ; WX 600 ; N section ; B 74 -70 620 580 ;
+C 168 ; WX 600 ; N currency ; B 77 49 644 517 ;
+C 169 ; WX 600 ; N quotesingle ; B 303 277 493 562 ;
+C 170 ; WX 600 ; N quotedblleft ; B 190 277 594 562 ;
+C 171 ; WX 600 ; N guillemotleft ; B 62 70 639 446 ;
+C 172 ; WX 600 ; N guilsinglleft ; B 195 70 545 446 ;
+C 173 ; WX 600 ; N guilsinglright ; B 165 70 514 446 ;
+C 174 ; WX 600 ; N fi ; B 12 0 644 626 ;
+C 175 ; WX 600 ; N fl ; B 12 0 644 626 ;
+C 177 ; WX 600 ; N endash ; B 108 203 602 313 ;
+C 178 ; WX 600 ; N dagger ; B 175 -70 586 580 ;
+C 179 ; WX 600 ; N daggerdbl ; B 121 -70 587 580 ;
+C 180 ; WX 600 ; N periodcentered ; B 248 165 461 351 ;
+C 182 ; WX 600 ; N paragraph ; B 61 -70 700 580 ;
+C 183 ; WX 600 ; N bullet ; B 196 132 523 430 ;
+C 184 ; WX 600 ; N quotesinglbase ; B 144 -142 458 143 ;
+C 185 ; WX 600 ; N quotedblbase ; B 34 -142 560 143 ;
+C 186 ; WX 600 ; N quotedblright ; B 119 277 645 562 ;
+C 187 ; WX 600 ; N guillemotright ; B 71 70 647 446 ;
+C 188 ; WX 600 ; N ellipsis ; B 35 -15 587 116 ;
+C 189 ; WX 600 ; N perthousand ; B -45 -15 743 616 ;
+C 191 ; WX 600 ; N questiondown ; B 100 -146 509 449 ;
+C 193 ; WX 600 ; N grave ; B 272 508 503 661 ;
+C 194 ; WX 600 ; N acute ; B 312 508 609 661 ;
+C 195 ; WX 600 ; N circumflex ; B 212 483 607 657 ;
+C 196 ; WX 600 ; N tilde ; B 199 493 643 636 ;
+C 197 ; WX 600 ; N macron ; B 195 505 637 585 ;
+C 198 ; WX 600 ; N breve ; B 217 468 652 631 ;
+C 199 ; WX 600 ; N dotaccent ; B 348 498 493 638 ;
+C 200 ; WX 600 ; N dieresis ; B 246 498 595 638 ;
+C 202 ; WX 600 ; N ring ; B 319 481 528 678 ;
+C 203 ; WX 600 ; N cedilla ; B 168 -206 368 0 ;
+C 205 ; WX 600 ; N hungarumlaut ; B 171 488 729 661 ;
+C 206 ; WX 600 ; N ogonek ; B 143 -199 367 0 ;
+C 207 ; WX 600 ; N caron ; B 238 493 633 667 ;
+C 208 ; WX 600 ; N emdash ; B 33 203 677 313 ;
+C 225 ; WX 600 ; N AE ; B -29 0 708 562 ;
+C 227 ; WX 600 ; N ordfeminine ; B 188 196 526 580 ;
+C 232 ; WX 600 ; N Lslash ; B 39 0 636 562 ;
+C 233 ; WX 600 ; N Oslash ; B 48 -22 673 584 ;
+C 234 ; WX 600 ; N OE ; B 26 0 701 562 ;
+C 235 ; WX 600 ; N ordmasculine ; B 188 196 543 580 ;
+C 241 ; WX 600 ; N ae ; B 21 -15 652 454 ;
+C 245 ; WX 600 ; N dotlessi ; B 77 0 546 439 ;
+C 248 ; WX 600 ; N lslash ; B 77 0 587 626 ;
+C 249 ; WX 600 ; N oslash ; B 54 -24 638 463 ;
+C 250 ; WX 600 ; N oe ; B 18 -15 662 454 ;
+C 251 ; WX 600 ; N germandbls ; B 22 -15 629 626 ;
+C -1 ; WX 600 ; N Idieresis ; B 77 0 643 761 ;
+C -1 ; WX 600 ; N eacute ; B 81 -15 609 661 ;
+C -1 ; WX 600 ; N abreve ; B 61 -15 658 661 ;
+C -1 ; WX 600 ; N uhungarumlaut ; B 70 -15 769 661 ;
+C -1 ; WX 600 ; N ecaron ; B 81 -15 633 667 ;
+C -1 ; WX 600 ; N Ydieresis ; B 109 0 709 761 ;
+C -1 ; WX 600 ; N divide ; B 114 16 596 500 ;
+C -1 ; WX 600 ; N Yacute ; B 109 0 709 784 ;
+C -1 ; WX 600 ; N Acircumflex ; B -9 0 632 780 ;
+C -1 ; WX 600 ; N aacute ; B 61 -15 609 661 ;
+C -1 ; WX 600 ; N Ucircumflex ; B 101 -18 716 780 ;
+C -1 ; WX 600 ; N yacute ; B -21 -142 695 661 ;
+C -1 ; WX 600 ; N scommaaccent ; B 66 -250 608 459 ;
+C -1 ; WX 600 ; N ecircumflex ; B 81 -15 607 657 ;
+C -1 ; WX 600 ; N Uring ; B 101 -18 716 801 ;
+C -1 ; WX 600 ; N Udieresis ; B 101 -18 716 761 ;
+C -1 ; WX 600 ; N aogonek ; B 61 -199 593 454 ;
+C -1 ; WX 600 ; N Uacute ; B 101 -18 716 784 ;
+C -1 ; WX 600 ; N uogonek ; B 70 -199 592 439 ;
+C -1 ; WX 600 ; N Edieresis ; B 25 0 670 761 ;
+C -1 ; WX 600 ; N Dcroat ; B 30 0 664 562 ;
+C -1 ; WX 600 ; N commaaccent ; B 151 -250 385 -57 ;
+C -1 ; WX 600 ; N copyright ; B 53 -18 667 580 ;
+C -1 ; WX 600 ; N Emacron ; B 25 0 670 708 ;
+C -1 ; WX 600 ; N ccaron ; B 81 -15 633 667 ;
+C -1 ; WX 600 ; N aring ; B 61 -15 593 678 ;
+C -1 ; WX 600 ; N Ncommaaccent ; B 8 -250 730 562 ;
+C -1 ; WX 600 ; N lacute ; B 77 0 639 801 ;
+C -1 ; WX 600 ; N agrave ; B 61 -15 593 661 ;
+C -1 ; WX 600 ; N Tcommaaccent ; B 86 -250 679 562 ;
+C -1 ; WX 600 ; N Cacute ; B 74 -18 675 784 ;
+C -1 ; WX 600 ; N atilde ; B 61 -15 643 636 ;
+C -1 ; WX 600 ; N Edotaccent ; B 25 0 670 761 ;
+C -1 ; WX 600 ; N scaron ; B 66 -17 633 667 ;
+C -1 ; WX 600 ; N scedilla ; B 66 -206 608 459 ;
+C -1 ; WX 600 ; N iacute ; B 77 0 609 661 ;
+C -1 ; WX 600 ; N lozenge ; B 145 0 614 740 ;
+C -1 ; WX 600 ; N Rcaron ; B 24 0 659 790 ;
+C -1 ; WX 600 ; N Gcommaaccent ; B 74 -250 675 580 ;
+C -1 ; WX 600 ; N ucircumflex ; B 70 -15 597 657 ;
+C -1 ; WX 600 ; N acircumflex ; B 61 -15 607 657 ;
+C -1 ; WX 600 ; N Amacron ; B -9 0 633 708 ;
+C -1 ; WX 600 ; N rcaron ; B 47 0 655 667 ;
+C -1 ; WX 600 ; N ccedilla ; B 81 -206 631 459 ;
+C -1 ; WX 600 ; N Zdotaccent ; B 62 0 637 761 ;
+C -1 ; WX 600 ; N Thorn ; B 48 0 620 562 ;
+C -1 ; WX 600 ; N Omacron ; B 74 -18 663 708 ;
+C -1 ; WX 600 ; N Racute ; B 24 0 665 784 ;
+C -1 ; WX 600 ; N Sacute ; B 54 -22 673 784 ;
+C -1 ; WX 600 ; N dcaron ; B 60 -15 861 626 ;
+C -1 ; WX 600 ; N Umacron ; B 101 -18 716 708 ;
+C -1 ; WX 600 ; N uring ; B 70 -15 592 678 ;
+C -1 ; WX 600 ; N threesuperior ; B 193 222 526 616 ;
+C -1 ; WX 600 ; N Ograve ; B 74 -18 645 784 ;
+C -1 ; WX 600 ; N Agrave ; B -9 0 632 784 ;
+C -1 ; WX 600 ; N Abreve ; B -9 0 684 784 ;
+C -1 ; WX 600 ; N multiply ; B 104 39 606 478 ;
+C -1 ; WX 600 ; N uacute ; B 70 -15 599 661 ;
+C -1 ; WX 600 ; N Tcaron ; B 86 0 679 790 ;
+C -1 ; WX 600 ; N partialdiff ; B 91 -38 627 728 ;
+C -1 ; WX 600 ; N ydieresis ; B -21 -142 695 638 ;
+C -1 ; WX 600 ; N Nacute ; B 8 -12 730 784 ;
+C -1 ; WX 600 ; N icircumflex ; B 77 0 577 657 ;
+C -1 ; WX 600 ; N Ecircumflex ; B 25 0 670 780 ;
+C -1 ; WX 600 ; N adieresis ; B 61 -15 595 638 ;
+C -1 ; WX 600 ; N edieresis ; B 81 -15 605 638 ;
+C -1 ; WX 600 ; N cacute ; B 81 -15 649 661 ;
+C -1 ; WX 600 ; N nacute ; B 18 0 639 661 ;
+C -1 ; WX 600 ; N umacron ; B 70 -15 637 585 ;
+C -1 ; WX 600 ; N Ncaron ; B 8 -12 730 790 ;
+C -1 ; WX 600 ; N Iacute ; B 77 0 643 784 ;
+C -1 ; WX 600 ; N plusminus ; B 76 24 614 515 ;
+C -1 ; WX 600 ; N brokenbar ; B 217 -175 489 675 ;
+C -1 ; WX 600 ; N registered ; B 53 -18 667 580 ;
+C -1 ; WX 600 ; N Gbreve ; B 74 -18 684 784 ;
+C -1 ; WX 600 ; N Idotaccent ; B 77 0 643 761 ;
+C -1 ; WX 600 ; N summation ; B 15 -10 672 706 ;
+C -1 ; WX 600 ; N Egrave ; B 25 0 670 784 ;
+C -1 ; WX 600 ; N racute ; B 47 0 655 661 ;
+C -1 ; WX 600 ; N omacron ; B 71 -15 637 585 ;
+C -1 ; WX 600 ; N Zacute ; B 62 0 665 784 ;
+C -1 ; WX 600 ; N Zcaron ; B 62 0 659 790 ;
+C -1 ; WX 600 ; N greaterequal ; B 26 0 627 696 ;
+C -1 ; WX 600 ; N Eth ; B 30 0 664 562 ;
+C -1 ; WX 600 ; N Ccedilla ; B 74 -206 675 580 ;
+C -1 ; WX 600 ; N lcommaaccent ; B 77 -250 546 626 ;
+C -1 ; WX 600 ; N tcaron ; B 118 -15 627 703 ;
+C -1 ; WX 600 ; N eogonek ; B 81 -199 605 454 ;
+C -1 ; WX 600 ; N Uogonek ; B 101 -199 716 562 ;
+C -1 ; WX 600 ; N Aacute ; B -9 0 655 784 ;
+C -1 ; WX 600 ; N Adieresis ; B -9 0 632 761 ;
+C -1 ; WX 600 ; N egrave ; B 81 -15 605 661 ;
+C -1 ; WX 600 ; N zacute ; B 81 0 614 661 ;
+C -1 ; WX 600 ; N iogonek ; B 77 -199 546 658 ;
+C -1 ; WX 600 ; N Oacute ; B 74 -18 645 784 ;
+C -1 ; WX 600 ; N oacute ; B 71 -15 649 661 ;
+C -1 ; WX 600 ; N amacron ; B 61 -15 637 585 ;
+C -1 ; WX 600 ; N sacute ; B 66 -17 609 661 ;
+C -1 ; WX 600 ; N idieresis ; B 77 0 561 618 ;
+C -1 ; WX 600 ; N Ocircumflex ; B 74 -18 645 780 ;
+C -1 ; WX 600 ; N Ugrave ; B 101 -18 716 784 ;
+C -1 ; WX 600 ; N Delta ; B 6 0 594 688 ;
+C -1 ; WX 600 ; N thorn ; B -32 -142 622 626 ;
+C -1 ; WX 600 ; N twosuperior ; B 191 230 542 616 ;
+C -1 ; WX 600 ; N Odieresis ; B 74 -18 645 761 ;
+C -1 ; WX 600 ; N mu ; B 49 -142 592 439 ;
+C -1 ; WX 600 ; N igrave ; B 77 0 546 661 ;
+C -1 ; WX 600 ; N ohungarumlaut ; B 71 -15 809 661 ;
+C -1 ; WX 600 ; N Eogonek ; B 25 -199 670 562 ;
+C -1 ; WX 600 ; N dcroat ; B 60 -15 712 626 ;
+C -1 ; WX 600 ; N threequarters ; B 8 -60 699 661 ;
+C -1 ; WX 600 ; N Scedilla ; B 54 -206 673 582 ;
+C -1 ; WX 600 ; N lcaron ; B 77 0 731 626 ;
+C -1 ; WX 600 ; N Kcommaaccent ; B 21 -250 692 562 ;
+C -1 ; WX 600 ; N Lacute ; B 39 0 636 784 ;
+C -1 ; WX 600 ; N trademark ; B 86 230 869 562 ;
+C -1 ; WX 600 ; N edotaccent ; B 81 -15 605 638 ;
+C -1 ; WX 600 ; N Igrave ; B 77 0 643 784 ;
+C -1 ; WX 600 ; N Imacron ; B 77 0 663 708 ;
+C -1 ; WX 600 ; N Lcaron ; B 39 0 757 562 ;
+C -1 ; WX 600 ; N onehalf ; B 22 -60 716 661 ;
+C -1 ; WX 600 ; N lessequal ; B 26 0 671 696 ;
+C -1 ; WX 600 ; N ocircumflex ; B 71 -15 622 657 ;
+C -1 ; WX 600 ; N ntilde ; B 18 0 643 636 ;
+C -1 ; WX 600 ; N Uhungarumlaut ; B 101 -18 805 784 ;
+C -1 ; WX 600 ; N Eacute ; B 25 0 670 784 ;
+C -1 ; WX 600 ; N emacron ; B 81 -15 637 585 ;
+C -1 ; WX 600 ; N gbreve ; B 40 -146 674 661 ;
+C -1 ; WX 600 ; N onequarter ; B 13 -60 707 661 ;
+C -1 ; WX 600 ; N Scaron ; B 54 -22 689 790 ;
+C -1 ; WX 600 ; N Scommaaccent ; B 54 -250 673 582 ;
+C -1 ; WX 600 ; N Ohungarumlaut ; B 74 -18 795 784 ;
+C -1 ; WX 600 ; N degree ; B 173 243 570 616 ;
+C -1 ; WX 600 ; N ograve ; B 71 -15 622 661 ;
+C -1 ; WX 600 ; N Ccaron ; B 74 -18 689 790 ;
+C -1 ; WX 600 ; N ugrave ; B 70 -15 592 661 ;
+C -1 ; WX 600 ; N radical ; B 67 -104 635 778 ;
+C -1 ; WX 600 ; N Dcaron ; B 30 0 664 790 ;
+C -1 ; WX 600 ; N rcommaaccent ; B 47 -250 655 454 ;
+C -1 ; WX 600 ; N Ntilde ; B 8 -12 730 759 ;
+C -1 ; WX 600 ; N otilde ; B 71 -15 643 636 ;
+C -1 ; WX 600 ; N Rcommaaccent ; B 24 -250 617 562 ;
+C -1 ; WX 600 ; N Lcommaaccent ; B 39 -250 636 562 ;
+C -1 ; WX 600 ; N Atilde ; B -9 0 669 759 ;
+C -1 ; WX 600 ; N Aogonek ; B -9 -199 632 562 ;
+C -1 ; WX 600 ; N Aring ; B -9 0 632 801 ;
+C -1 ; WX 600 ; N Otilde ; B 74 -18 669 759 ;
+C -1 ; WX 600 ; N zdotaccent ; B 81 0 614 638 ;
+C -1 ; WX 600 ; N Ecaron ; B 25 0 670 790 ;
+C -1 ; WX 600 ; N Iogonek ; B 77 -199 643 562 ;
+C -1 ; WX 600 ; N kcommaaccent ; B 33 -250 643 626 ;
+C -1 ; WX 600 ; N minus ; B 114 203 596 313 ;
+C -1 ; WX 600 ; N Icircumflex ; B 77 0 643 780 ;
+C -1 ; WX 600 ; N ncaron ; B 18 0 633 667 ;
+C -1 ; WX 600 ; N tcommaaccent ; B 118 -250 567 562 ;
+C -1 ; WX 600 ; N logicalnot ; B 135 103 617 413 ;
+C -1 ; WX 600 ; N odieresis ; B 71 -15 622 638 ;
+C -1 ; WX 600 ; N udieresis ; B 70 -15 595 638 ;
+C -1 ; WX 600 ; N notequal ; B 30 -47 626 563 ;
+C -1 ; WX 600 ; N gcommaaccent ; B 40 -146 674 714 ;
+C -1 ; WX 600 ; N eth ; B 93 -27 661 626 ;
+C -1 ; WX 600 ; N zcaron ; B 81 0 643 667 ;
+C -1 ; WX 600 ; N ncommaaccent ; B 18 -250 615 454 ;
+C -1 ; WX 600 ; N onesuperior ; B 212 230 514 616 ;
+C -1 ; WX 600 ; N imacron ; B 77 0 575 585 ;
+EndCharMetrics
+EndFontMetrics
diff --git a/src/fonts/Adobe-Core35_AFMs-314/Courier-Oblique.afm b/src/fonts/Adobe-Core35_AFMs-314/Courier-Oblique.afm
new file mode 100644
index 0000000..996792d
--- /dev/null
+++ b/src/fonts/Adobe-Core35_AFMs-314/Courier-Oblique.afm
@@ -0,0 +1,340 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Thu May 1 17:37:52 1997
+Comment UniqueID 43051
+Comment VMusage 16248 75829
+FontName Courier-Oblique
+FullName Courier Oblique
+FamilyName Courier
+Weight Medium
+ItalicAngle -12
+IsFixedPitch true
+FontBBox -27 -250 849 805
+UnderlinePosition -100
+UnderlineThickness 50
+Version 003.000
+Notice Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.
+EncodingScheme AdobeStandardEncoding
+CapHeight 562
+XHeight 426
+Ascender 629
+Descender -157
+StdHW 51
+StdVW 51
+StartCharMetrics 314
+C 32 ; WX 600 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 600 ; N exclam ; B 243 -15 464 572 ;
+C 34 ; WX 600 ; N quotedbl ; B 273 328 532 562 ;
+C 35 ; WX 600 ; N numbersign ; B 133 -32 596 639 ;
+C 36 ; WX 600 ; N dollar ; B 108 -126 596 662 ;
+C 37 ; WX 600 ; N percent ; B 134 -15 599 622 ;
+C 38 ; WX 600 ; N ampersand ; B 87 -15 580 543 ;
+C 39 ; WX 600 ; N quoteright ; B 283 328 495 562 ;
+C 40 ; WX 600 ; N parenleft ; B 313 -108 572 622 ;
+C 41 ; WX 600 ; N parenright ; B 137 -108 396 622 ;
+C 42 ; WX 600 ; N asterisk ; B 212 257 580 607 ;
+C 43 ; WX 600 ; N plus ; B 129 44 580 470 ;
+C 44 ; WX 600 ; N comma ; B 157 -112 370 122 ;
+C 45 ; WX 600 ; N hyphen ; B 152 231 558 285 ;
+C 46 ; WX 600 ; N period ; B 238 -15 382 109 ;
+C 47 ; WX 600 ; N slash ; B 112 -80 604 629 ;
+C 48 ; WX 600 ; N zero ; B 154 -15 575 622 ;
+C 49 ; WX 600 ; N one ; B 98 0 515 622 ;
+C 50 ; WX 600 ; N two ; B 70 0 568 622 ;
+C 51 ; WX 600 ; N three ; B 82 -15 538 622 ;
+C 52 ; WX 600 ; N four ; B 108 0 541 622 ;
+C 53 ; WX 600 ; N five ; B 99 -15 589 607 ;
+C 54 ; WX 600 ; N six ; B 155 -15 629 622 ;
+C 55 ; WX 600 ; N seven ; B 182 0 612 607 ;
+C 56 ; WX 600 ; N eight ; B 132 -15 588 622 ;
+C 57 ; WX 600 ; N nine ; B 93 -15 574 622 ;
+C 58 ; WX 600 ; N colon ; B 238 -15 441 385 ;
+C 59 ; WX 600 ; N semicolon ; B 157 -112 441 385 ;
+C 60 ; WX 600 ; N less ; B 96 42 610 472 ;
+C 61 ; WX 600 ; N equal ; B 109 138 600 376 ;
+C 62 ; WX 600 ; N greater ; B 85 42 599 472 ;
+C 63 ; WX 600 ; N question ; B 222 -15 583 572 ;
+C 64 ; WX 600 ; N at ; B 127 -15 582 622 ;
+C 65 ; WX 600 ; N A ; B 3 0 607 562 ;
+C 66 ; WX 600 ; N B ; B 43 0 616 562 ;
+C 67 ; WX 600 ; N C ; B 93 -18 655 580 ;
+C 68 ; WX 600 ; N D ; B 43 0 645 562 ;
+C 69 ; WX 600 ; N E ; B 53 0 660 562 ;
+C 70 ; WX 600 ; N F ; B 53 0 660 562 ;
+C 71 ; WX 600 ; N G ; B 83 -18 645 580 ;
+C 72 ; WX 600 ; N H ; B 32 0 687 562 ;
+C 73 ; WX 600 ; N I ; B 96 0 623 562 ;
+C 74 ; WX 600 ; N J ; B 52 -18 685 562 ;
+C 75 ; WX 600 ; N K ; B 38 0 671 562 ;
+C 76 ; WX 600 ; N L ; B 47 0 607 562 ;
+C 77 ; WX 600 ; N M ; B 4 0 715 562 ;
+C 78 ; WX 600 ; N N ; B 7 -13 712 562 ;
+C 79 ; WX 600 ; N O ; B 94 -18 625 580 ;
+C 80 ; WX 600 ; N P ; B 79 0 644 562 ;
+C 81 ; WX 600 ; N Q ; B 95 -138 625 580 ;
+C 82 ; WX 600 ; N R ; B 38 0 598 562 ;
+C 83 ; WX 600 ; N S ; B 76 -20 650 580 ;
+C 84 ; WX 600 ; N T ; B 108 0 665 562 ;
+C 85 ; WX 600 ; N U ; B 125 -18 702 562 ;
+C 86 ; WX 600 ; N V ; B 105 -13 723 562 ;
+C 87 ; WX 600 ; N W ; B 106 -13 722 562 ;
+C 88 ; WX 600 ; N X ; B 23 0 675 562 ;
+C 89 ; WX 600 ; N Y ; B 133 0 695 562 ;
+C 90 ; WX 600 ; N Z ; B 86 0 610 562 ;
+C 91 ; WX 600 ; N bracketleft ; B 246 -108 574 622 ;
+C 92 ; WX 600 ; N backslash ; B 249 -80 468 629 ;
+C 93 ; WX 600 ; N bracketright ; B 135 -108 463 622 ;
+C 94 ; WX 600 ; N asciicircum ; B 175 354 587 622 ;
+C 95 ; WX 600 ; N underscore ; B -27 -125 584 -75 ;
+C 96 ; WX 600 ; N quoteleft ; B 343 328 457 562 ;
+C 97 ; WX 600 ; N a ; B 76 -15 569 441 ;
+C 98 ; WX 600 ; N b ; B 29 -15 625 629 ;
+C 99 ; WX 600 ; N c ; B 106 -15 608 441 ;
+C 100 ; WX 600 ; N d ; B 85 -15 640 629 ;
+C 101 ; WX 600 ; N e ; B 106 -15 598 441 ;
+C 102 ; WX 600 ; N f ; B 114 0 662 629 ; L i fi ; L l fl ;
+C 103 ; WX 600 ; N g ; B 61 -157 657 441 ;
+C 104 ; WX 600 ; N h ; B 33 0 592 629 ;
+C 105 ; WX 600 ; N i ; B 95 0 515 657 ;
+C 106 ; WX 600 ; N j ; B 52 -157 550 657 ;
+C 107 ; WX 600 ; N k ; B 58 0 633 629 ;
+C 108 ; WX 600 ; N l ; B 95 0 515 629 ;
+C 109 ; WX 600 ; N m ; B -5 0 615 441 ;
+C 110 ; WX 600 ; N n ; B 26 0 585 441 ;
+C 111 ; WX 600 ; N o ; B 102 -15 588 441 ;
+C 112 ; WX 600 ; N p ; B -24 -157 605 441 ;
+C 113 ; WX 600 ; N q ; B 85 -157 682 441 ;
+C 114 ; WX 600 ; N r ; B 60 0 636 441 ;
+C 115 ; WX 600 ; N s ; B 78 -15 584 441 ;
+C 116 ; WX 600 ; N t ; B 167 -15 561 561 ;
+C 117 ; WX 600 ; N u ; B 101 -15 572 426 ;
+C 118 ; WX 600 ; N v ; B 90 -10 681 426 ;
+C 119 ; WX 600 ; N w ; B 76 -10 695 426 ;
+C 120 ; WX 600 ; N x ; B 20 0 655 426 ;
+C 121 ; WX 600 ; N y ; B -4 -157 683 426 ;
+C 122 ; WX 600 ; N z ; B 99 0 593 426 ;
+C 123 ; WX 600 ; N braceleft ; B 233 -108 569 622 ;
+C 124 ; WX 600 ; N bar ; B 222 -250 485 750 ;
+C 125 ; WX 600 ; N braceright ; B 140 -108 477 622 ;
+C 126 ; WX 600 ; N asciitilde ; B 116 197 600 320 ;
+C 161 ; WX 600 ; N exclamdown ; B 225 -157 445 430 ;
+C 162 ; WX 600 ; N cent ; B 151 -49 588 614 ;
+C 163 ; WX 600 ; N sterling ; B 124 -21 621 611 ;
+C 164 ; WX 600 ; N fraction ; B 84 -57 646 665 ;
+C 165 ; WX 600 ; N yen ; B 120 0 693 562 ;
+C 166 ; WX 600 ; N florin ; B -26 -143 671 622 ;
+C 167 ; WX 600 ; N section ; B 104 -78 590 580 ;
+C 168 ; WX 600 ; N currency ; B 94 58 628 506 ;
+C 169 ; WX 600 ; N quotesingle ; B 345 328 460 562 ;
+C 170 ; WX 600 ; N quotedblleft ; B 262 328 541 562 ;
+C 171 ; WX 600 ; N guillemotleft ; B 92 70 652 446 ;
+C 172 ; WX 600 ; N guilsinglleft ; B 204 70 540 446 ;
+C 173 ; WX 600 ; N guilsinglright ; B 170 70 506 446 ;
+C 174 ; WX 600 ; N fi ; B 3 0 619 629 ;
+C 175 ; WX 600 ; N fl ; B 3 0 619 629 ;
+C 177 ; WX 600 ; N endash ; B 124 231 586 285 ;
+C 178 ; WX 600 ; N dagger ; B 217 -78 546 580 ;
+C 179 ; WX 600 ; N daggerdbl ; B 163 -78 546 580 ;
+C 180 ; WX 600 ; N periodcentered ; B 275 189 434 327 ;
+C 182 ; WX 600 ; N paragraph ; B 100 -78 630 562 ;
+C 183 ; WX 600 ; N bullet ; B 224 130 485 383 ;
+C 184 ; WX 600 ; N quotesinglbase ; B 185 -134 397 100 ;
+C 185 ; WX 600 ; N quotedblbase ; B 115 -134 478 100 ;
+C 186 ; WX 600 ; N quotedblright ; B 213 328 576 562 ;
+C 187 ; WX 600 ; N guillemotright ; B 58 70 618 446 ;
+C 188 ; WX 600 ; N ellipsis ; B 46 -15 575 111 ;
+C 189 ; WX 600 ; N perthousand ; B 59 -15 627 622 ;
+C 191 ; WX 600 ; N questiondown ; B 105 -157 466 430 ;
+C 193 ; WX 600 ; N grave ; B 294 497 484 672 ;
+C 194 ; WX 600 ; N acute ; B 348 497 612 672 ;
+C 195 ; WX 600 ; N circumflex ; B 229 477 581 654 ;
+C 196 ; WX 600 ; N tilde ; B 212 489 629 606 ;
+C 197 ; WX 600 ; N macron ; B 232 525 600 565 ;
+C 198 ; WX 600 ; N breve ; B 279 501 576 609 ;
+C 199 ; WX 600 ; N dotaccent ; B 373 537 478 640 ;
+C 200 ; WX 600 ; N dieresis ; B 272 537 579 640 ;
+C 202 ; WX 600 ; N ring ; B 332 463 500 627 ;
+C 203 ; WX 600 ; N cedilla ; B 197 -151 344 10 ;
+C 205 ; WX 600 ; N hungarumlaut ; B 239 497 683 672 ;
+C 206 ; WX 600 ; N ogonek ; B 189 -172 377 4 ;
+C 207 ; WX 600 ; N caron ; B 262 492 614 669 ;
+C 208 ; WX 600 ; N emdash ; B 49 231 661 285 ;
+C 225 ; WX 600 ; N AE ; B 3 0 655 562 ;
+C 227 ; WX 600 ; N ordfeminine ; B 209 249 512 580 ;
+C 232 ; WX 600 ; N Lslash ; B 47 0 607 562 ;
+C 233 ; WX 600 ; N Oslash ; B 94 -80 625 629 ;
+C 234 ; WX 600 ; N OE ; B 59 0 672 562 ;
+C 235 ; WX 600 ; N ordmasculine ; B 210 249 535 580 ;
+C 241 ; WX 600 ; N ae ; B 41 -15 626 441 ;
+C 245 ; WX 600 ; N dotlessi ; B 95 0 515 426 ;
+C 248 ; WX 600 ; N lslash ; B 95 0 587 629 ;
+C 249 ; WX 600 ; N oslash ; B 102 -80 588 506 ;
+C 250 ; WX 600 ; N oe ; B 54 -15 615 441 ;
+C 251 ; WX 600 ; N germandbls ; B 48 -15 617 629 ;
+C -1 ; WX 600 ; N Idieresis ; B 96 0 623 753 ;
+C -1 ; WX 600 ; N eacute ; B 106 -15 612 672 ;
+C -1 ; WX 600 ; N abreve ; B 76 -15 576 609 ;
+C -1 ; WX 600 ; N uhungarumlaut ; B 101 -15 723 672 ;
+C -1 ; WX 600 ; N ecaron ; B 106 -15 614 669 ;
+C -1 ; WX 600 ; N Ydieresis ; B 133 0 695 753 ;
+C -1 ; WX 600 ; N divide ; B 136 48 573 467 ;
+C -1 ; WX 600 ; N Yacute ; B 133 0 695 805 ;
+C -1 ; WX 600 ; N Acircumflex ; B 3 0 607 787 ;
+C -1 ; WX 600 ; N aacute ; B 76 -15 612 672 ;
+C -1 ; WX 600 ; N Ucircumflex ; B 125 -18 702 787 ;
+C -1 ; WX 600 ; N yacute ; B -4 -157 683 672 ;
+C -1 ; WX 600 ; N scommaaccent ; B 78 -250 584 441 ;
+C -1 ; WX 600 ; N ecircumflex ; B 106 -15 598 654 ;
+C -1 ; WX 600 ; N Uring ; B 125 -18 702 760 ;
+C -1 ; WX 600 ; N Udieresis ; B 125 -18 702 753 ;
+C -1 ; WX 600 ; N aogonek ; B 76 -172 569 441 ;
+C -1 ; WX 600 ; N Uacute ; B 125 -18 702 805 ;
+C -1 ; WX 600 ; N uogonek ; B 101 -172 572 426 ;
+C -1 ; WX 600 ; N Edieresis ; B 53 0 660 753 ;
+C -1 ; WX 600 ; N Dcroat ; B 43 0 645 562 ;
+C -1 ; WX 600 ; N commaaccent ; B 145 -250 323 -58 ;
+C -1 ; WX 600 ; N copyright ; B 53 -18 667 580 ;
+C -1 ; WX 600 ; N Emacron ; B 53 0 660 698 ;
+C -1 ; WX 600 ; N ccaron ; B 106 -15 614 669 ;
+C -1 ; WX 600 ; N aring ; B 76 -15 569 627 ;
+C -1 ; WX 600 ; N Ncommaaccent ; B 7 -250 712 562 ;
+C -1 ; WX 600 ; N lacute ; B 95 0 640 805 ;
+C -1 ; WX 600 ; N agrave ; B 76 -15 569 672 ;
+C -1 ; WX 600 ; N Tcommaaccent ; B 108 -250 665 562 ;
+C -1 ; WX 600 ; N Cacute ; B 93 -18 655 805 ;
+C -1 ; WX 600 ; N atilde ; B 76 -15 629 606 ;
+C -1 ; WX 600 ; N Edotaccent ; B 53 0 660 753 ;
+C -1 ; WX 600 ; N scaron ; B 78 -15 614 669 ;
+C -1 ; WX 600 ; N scedilla ; B 78 -151 584 441 ;
+C -1 ; WX 600 ; N iacute ; B 95 0 612 672 ;
+C -1 ; WX 600 ; N lozenge ; B 94 0 519 706 ;
+C -1 ; WX 600 ; N Rcaron ; B 38 0 642 802 ;
+C -1 ; WX 600 ; N Gcommaaccent ; B 83 -250 645 580 ;
+C -1 ; WX 600 ; N ucircumflex ; B 101 -15 572 654 ;
+C -1 ; WX 600 ; N acircumflex ; B 76 -15 581 654 ;
+C -1 ; WX 600 ; N Amacron ; B 3 0 607 698 ;
+C -1 ; WX 600 ; N rcaron ; B 60 0 636 669 ;
+C -1 ; WX 600 ; N ccedilla ; B 106 -151 614 441 ;
+C -1 ; WX 600 ; N Zdotaccent ; B 86 0 610 753 ;
+C -1 ; WX 600 ; N Thorn ; B 79 0 606 562 ;
+C -1 ; WX 600 ; N Omacron ; B 94 -18 628 698 ;
+C -1 ; WX 600 ; N Racute ; B 38 0 670 805 ;
+C -1 ; WX 600 ; N Sacute ; B 76 -20 650 805 ;
+C -1 ; WX 600 ; N dcaron ; B 85 -15 849 629 ;
+C -1 ; WX 600 ; N Umacron ; B 125 -18 702 698 ;
+C -1 ; WX 600 ; N uring ; B 101 -15 572 627 ;
+C -1 ; WX 600 ; N threesuperior ; B 213 240 501 622 ;
+C -1 ; WX 600 ; N Ograve ; B 94 -18 625 805 ;
+C -1 ; WX 600 ; N Agrave ; B 3 0 607 805 ;
+C -1 ; WX 600 ; N Abreve ; B 3 0 607 732 ;
+C -1 ; WX 600 ; N multiply ; B 103 43 607 470 ;
+C -1 ; WX 600 ; N uacute ; B 101 -15 602 672 ;
+C -1 ; WX 600 ; N Tcaron ; B 108 0 665 802 ;
+C -1 ; WX 600 ; N partialdiff ; B 45 -38 546 710 ;
+C -1 ; WX 600 ; N ydieresis ; B -4 -157 683 620 ;
+C -1 ; WX 600 ; N Nacute ; B 7 -13 712 805 ;
+C -1 ; WX 600 ; N icircumflex ; B 95 0 551 654 ;
+C -1 ; WX 600 ; N Ecircumflex ; B 53 0 660 787 ;
+C -1 ; WX 600 ; N adieresis ; B 76 -15 575 620 ;
+C -1 ; WX 600 ; N edieresis ; B 106 -15 598 620 ;
+C -1 ; WX 600 ; N cacute ; B 106 -15 612 672 ;
+C -1 ; WX 600 ; N nacute ; B 26 0 602 672 ;
+C -1 ; WX 600 ; N umacron ; B 101 -15 600 565 ;
+C -1 ; WX 600 ; N Ncaron ; B 7 -13 712 802 ;
+C -1 ; WX 600 ; N Iacute ; B 96 0 640 805 ;
+C -1 ; WX 600 ; N plusminus ; B 96 44 594 558 ;
+C -1 ; WX 600 ; N brokenbar ; B 238 -175 469 675 ;
+C -1 ; WX 600 ; N registered ; B 53 -18 667 580 ;
+C -1 ; WX 600 ; N Gbreve ; B 83 -18 645 732 ;
+C -1 ; WX 600 ; N Idotaccent ; B 96 0 623 753 ;
+C -1 ; WX 600 ; N summation ; B 15 -10 670 706 ;
+C -1 ; WX 600 ; N Egrave ; B 53 0 660 805 ;
+C -1 ; WX 600 ; N racute ; B 60 0 636 672 ;
+C -1 ; WX 600 ; N omacron ; B 102 -15 600 565 ;
+C -1 ; WX 600 ; N Zacute ; B 86 0 670 805 ;
+C -1 ; WX 600 ; N Zcaron ; B 86 0 642 802 ;
+C -1 ; WX 600 ; N greaterequal ; B 98 0 594 710 ;
+C -1 ; WX 600 ; N Eth ; B 43 0 645 562 ;
+C -1 ; WX 600 ; N Ccedilla ; B 93 -151 658 580 ;
+C -1 ; WX 600 ; N lcommaaccent ; B 95 -250 515 629 ;
+C -1 ; WX 600 ; N tcaron ; B 167 -15 587 717 ;
+C -1 ; WX 600 ; N eogonek ; B 106 -172 598 441 ;
+C -1 ; WX 600 ; N Uogonek ; B 124 -172 702 562 ;
+C -1 ; WX 600 ; N Aacute ; B 3 0 660 805 ;
+C -1 ; WX 600 ; N Adieresis ; B 3 0 607 753 ;
+C -1 ; WX 600 ; N egrave ; B 106 -15 598 672 ;
+C -1 ; WX 600 ; N zacute ; B 99 0 612 672 ;
+C -1 ; WX 600 ; N iogonek ; B 95 -172 515 657 ;
+C -1 ; WX 600 ; N Oacute ; B 94 -18 640 805 ;
+C -1 ; WX 600 ; N oacute ; B 102 -15 612 672 ;
+C -1 ; WX 600 ; N amacron ; B 76 -15 600 565 ;
+C -1 ; WX 600 ; N sacute ; B 78 -15 612 672 ;
+C -1 ; WX 600 ; N idieresis ; B 95 0 545 620 ;
+C -1 ; WX 600 ; N Ocircumflex ; B 94 -18 625 787 ;
+C -1 ; WX 600 ; N Ugrave ; B 125 -18 702 805 ;
+C -1 ; WX 600 ; N Delta ; B 6 0 598 688 ;
+C -1 ; WX 600 ; N thorn ; B -24 -157 605 629 ;
+C -1 ; WX 600 ; N twosuperior ; B 230 249 535 622 ;
+C -1 ; WX 600 ; N Odieresis ; B 94 -18 625 753 ;
+C -1 ; WX 600 ; N mu ; B 72 -157 572 426 ;
+C -1 ; WX 600 ; N igrave ; B 95 0 515 672 ;
+C -1 ; WX 600 ; N ohungarumlaut ; B 102 -15 723 672 ;
+C -1 ; WX 600 ; N Eogonek ; B 53 -172 660 562 ;
+C -1 ; WX 600 ; N dcroat ; B 85 -15 704 629 ;
+C -1 ; WX 600 ; N threequarters ; B 73 -56 659 666 ;
+C -1 ; WX 600 ; N Scedilla ; B 76 -151 650 580 ;
+C -1 ; WX 600 ; N lcaron ; B 95 0 667 629 ;
+C -1 ; WX 600 ; N Kcommaaccent ; B 38 -250 671 562 ;
+C -1 ; WX 600 ; N Lacute ; B 47 0 607 805 ;
+C -1 ; WX 600 ; N trademark ; B 75 263 742 562 ;
+C -1 ; WX 600 ; N edotaccent ; B 106 -15 598 620 ;
+C -1 ; WX 600 ; N Igrave ; B 96 0 623 805 ;
+C -1 ; WX 600 ; N Imacron ; B 96 0 628 698 ;
+C -1 ; WX 600 ; N Lcaron ; B 47 0 632 562 ;
+C -1 ; WX 600 ; N onehalf ; B 65 -57 669 665 ;
+C -1 ; WX 600 ; N lessequal ; B 98 0 645 710 ;
+C -1 ; WX 600 ; N ocircumflex ; B 102 -15 588 654 ;
+C -1 ; WX 600 ; N ntilde ; B 26 0 629 606 ;
+C -1 ; WX 600 ; N Uhungarumlaut ; B 125 -18 761 805 ;
+C -1 ; WX 600 ; N Eacute ; B 53 0 670 805 ;
+C -1 ; WX 600 ; N emacron ; B 106 -15 600 565 ;
+C -1 ; WX 600 ; N gbreve ; B 61 -157 657 609 ;
+C -1 ; WX 600 ; N onequarter ; B 65 -57 674 665 ;
+C -1 ; WX 600 ; N Scaron ; B 76 -20 672 802 ;
+C -1 ; WX 600 ; N Scommaaccent ; B 76 -250 650 580 ;
+C -1 ; WX 600 ; N Ohungarumlaut ; B 94 -18 751 805 ;
+C -1 ; WX 600 ; N degree ; B 214 269 576 622 ;
+C -1 ; WX 600 ; N ograve ; B 102 -15 588 672 ;
+C -1 ; WX 600 ; N Ccaron ; B 93 -18 672 802 ;
+C -1 ; WX 600 ; N ugrave ; B 101 -15 572 672 ;
+C -1 ; WX 600 ; N radical ; B 85 -15 765 792 ;
+C -1 ; WX 600 ; N Dcaron ; B 43 0 645 802 ;
+C -1 ; WX 600 ; N rcommaaccent ; B 60 -250 636 441 ;
+C -1 ; WX 600 ; N Ntilde ; B 7 -13 712 729 ;
+C -1 ; WX 600 ; N otilde ; B 102 -15 629 606 ;
+C -1 ; WX 600 ; N Rcommaaccent ; B 38 -250 598 562 ;
+C -1 ; WX 600 ; N Lcommaaccent ; B 47 -250 607 562 ;
+C -1 ; WX 600 ; N Atilde ; B 3 0 655 729 ;
+C -1 ; WX 600 ; N Aogonek ; B 3 -172 607 562 ;
+C -1 ; WX 600 ; N Aring ; B 3 0 607 750 ;
+C -1 ; WX 600 ; N Otilde ; B 94 -18 655 729 ;
+C -1 ; WX 600 ; N zdotaccent ; B 99 0 593 620 ;
+C -1 ; WX 600 ; N Ecaron ; B 53 0 660 802 ;
+C -1 ; WX 600 ; N Iogonek ; B 96 -172 623 562 ;
+C -1 ; WX 600 ; N kcommaaccent ; B 58 -250 633 629 ;
+C -1 ; WX 600 ; N minus ; B 129 232 580 283 ;
+C -1 ; WX 600 ; N Icircumflex ; B 96 0 623 787 ;
+C -1 ; WX 600 ; N ncaron ; B 26 0 614 669 ;
+C -1 ; WX 600 ; N tcommaaccent ; B 165 -250 561 561 ;
+C -1 ; WX 600 ; N logicalnot ; B 155 108 591 369 ;
+C -1 ; WX 600 ; N odieresis ; B 102 -15 588 620 ;
+C -1 ; WX 600 ; N udieresis ; B 101 -15 575 620 ;
+C -1 ; WX 600 ; N notequal ; B 43 -16 621 529 ;
+C -1 ; WX 600 ; N gcommaaccent ; B 61 -157 657 708 ;
+C -1 ; WX 600 ; N eth ; B 102 -15 639 629 ;
+C -1 ; WX 600 ; N zcaron ; B 99 0 624 669 ;
+C -1 ; WX 600 ; N ncommaaccent ; B 26 -250 585 441 ;
+C -1 ; WX 600 ; N onesuperior ; B 231 249 491 622 ;
+C -1 ; WX 600 ; N imacron ; B 95 0 543 565 ;
+EndCharMetrics
+EndFontMetrics
diff --git a/src/fonts/Adobe-Core35_AFMs-314/Courier.afm b/src/fonts/Adobe-Core35_AFMs-314/Courier.afm
new file mode 100644
index 0000000..b288dbd
--- /dev/null
+++ b/src/fonts/Adobe-Core35_AFMs-314/Courier.afm
@@ -0,0 +1,340 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Thu May 1 17:27:09 1997
+Comment UniqueID 43050
+Comment VMusage 39754 50779
+FontName Courier
+FullName Courier
+FamilyName Courier
+Weight Medium
+ItalicAngle 0
+IsFixedPitch true
+FontBBox -23 -250 715 805
+UnderlinePosition -100
+UnderlineThickness 50
+Version 003.000
+Notice Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.
+EncodingScheme AdobeStandardEncoding
+CapHeight 562
+XHeight 426
+Ascender 629
+Descender -157
+StdHW 51
+StdVW 51
+StartCharMetrics 314
+C 32 ; WX 600 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 600 ; N exclam ; B 236 -15 364 572 ;
+C 34 ; WX 600 ; N quotedbl ; B 187 328 413 562 ;
+C 35 ; WX 600 ; N numbersign ; B 93 -32 507 639 ;
+C 36 ; WX 600 ; N dollar ; B 105 -126 496 662 ;
+C 37 ; WX 600 ; N percent ; B 81 -15 518 622 ;
+C 38 ; WX 600 ; N ampersand ; B 63 -15 538 543 ;
+C 39 ; WX 600 ; N quoteright ; B 213 328 376 562 ;
+C 40 ; WX 600 ; N parenleft ; B 269 -108 440 622 ;
+C 41 ; WX 600 ; N parenright ; B 160 -108 331 622 ;
+C 42 ; WX 600 ; N asterisk ; B 116 257 484 607 ;
+C 43 ; WX 600 ; N plus ; B 80 44 520 470 ;
+C 44 ; WX 600 ; N comma ; B 181 -112 344 122 ;
+C 45 ; WX 600 ; N hyphen ; B 103 231 497 285 ;
+C 46 ; WX 600 ; N period ; B 229 -15 371 109 ;
+C 47 ; WX 600 ; N slash ; B 125 -80 475 629 ;
+C 48 ; WX 600 ; N zero ; B 106 -15 494 622 ;
+C 49 ; WX 600 ; N one ; B 96 0 505 622 ;
+C 50 ; WX 600 ; N two ; B 70 0 471 622 ;
+C 51 ; WX 600 ; N three ; B 75 -15 466 622 ;
+C 52 ; WX 600 ; N four ; B 78 0 500 622 ;
+C 53 ; WX 600 ; N five ; B 92 -15 497 607 ;
+C 54 ; WX 600 ; N six ; B 111 -15 497 622 ;
+C 55 ; WX 600 ; N seven ; B 82 0 483 607 ;
+C 56 ; WX 600 ; N eight ; B 102 -15 498 622 ;
+C 57 ; WX 600 ; N nine ; B 96 -15 489 622 ;
+C 58 ; WX 600 ; N colon ; B 229 -15 371 385 ;
+C 59 ; WX 600 ; N semicolon ; B 181 -112 371 385 ;
+C 60 ; WX 600 ; N less ; B 41 42 519 472 ;
+C 61 ; WX 600 ; N equal ; B 80 138 520 376 ;
+C 62 ; WX 600 ; N greater ; B 66 42 544 472 ;
+C 63 ; WX 600 ; N question ; B 129 -15 492 572 ;
+C 64 ; WX 600 ; N at ; B 77 -15 533 622 ;
+C 65 ; WX 600 ; N A ; B 3 0 597 562 ;
+C 66 ; WX 600 ; N B ; B 43 0 559 562 ;
+C 67 ; WX 600 ; N C ; B 41 -18 540 580 ;
+C 68 ; WX 600 ; N D ; B 43 0 574 562 ;
+C 69 ; WX 600 ; N E ; B 53 0 550 562 ;
+C 70 ; WX 600 ; N F ; B 53 0 545 562 ;
+C 71 ; WX 600 ; N G ; B 31 -18 575 580 ;
+C 72 ; WX 600 ; N H ; B 32 0 568 562 ;
+C 73 ; WX 600 ; N I ; B 96 0 504 562 ;
+C 74 ; WX 600 ; N J ; B 34 -18 566 562 ;
+C 75 ; WX 600 ; N K ; B 38 0 582 562 ;
+C 76 ; WX 600 ; N L ; B 47 0 554 562 ;
+C 77 ; WX 600 ; N M ; B 4 0 596 562 ;
+C 78 ; WX 600 ; N N ; B 7 -13 593 562 ;
+C 79 ; WX 600 ; N O ; B 43 -18 557 580 ;
+C 80 ; WX 600 ; N P ; B 79 0 558 562 ;
+C 81 ; WX 600 ; N Q ; B 43 -138 557 580 ;
+C 82 ; WX 600 ; N R ; B 38 0 588 562 ;
+C 83 ; WX 600 ; N S ; B 72 -20 529 580 ;
+C 84 ; WX 600 ; N T ; B 38 0 563 562 ;
+C 85 ; WX 600 ; N U ; B 17 -18 583 562 ;
+C 86 ; WX 600 ; N V ; B -4 -13 604 562 ;
+C 87 ; WX 600 ; N W ; B -3 -13 603 562 ;
+C 88 ; WX 600 ; N X ; B 23 0 577 562 ;
+C 89 ; WX 600 ; N Y ; B 24 0 576 562 ;
+C 90 ; WX 600 ; N Z ; B 86 0 514 562 ;
+C 91 ; WX 600 ; N bracketleft ; B 269 -108 442 622 ;
+C 92 ; WX 600 ; N backslash ; B 118 -80 482 629 ;
+C 93 ; WX 600 ; N bracketright ; B 158 -108 331 622 ;
+C 94 ; WX 600 ; N asciicircum ; B 94 354 506 622 ;
+C 95 ; WX 600 ; N underscore ; B 0 -125 600 -75 ;
+C 96 ; WX 600 ; N quoteleft ; B 224 328 387 562 ;
+C 97 ; WX 600 ; N a ; B 53 -15 559 441 ;
+C 98 ; WX 600 ; N b ; B 14 -15 575 629 ;
+C 99 ; WX 600 ; N c ; B 66 -15 529 441 ;
+C 100 ; WX 600 ; N d ; B 45 -15 591 629 ;
+C 101 ; WX 600 ; N e ; B 66 -15 548 441 ;
+C 102 ; WX 600 ; N f ; B 114 0 531 629 ; L i fi ; L l fl ;
+C 103 ; WX 600 ; N g ; B 45 -157 566 441 ;
+C 104 ; WX 600 ; N h ; B 18 0 582 629 ;
+C 105 ; WX 600 ; N i ; B 95 0 505 657 ;
+C 106 ; WX 600 ; N j ; B 82 -157 410 657 ;
+C 107 ; WX 600 ; N k ; B 43 0 580 629 ;
+C 108 ; WX 600 ; N l ; B 95 0 505 629 ;
+C 109 ; WX 600 ; N m ; B -5 0 605 441 ;
+C 110 ; WX 600 ; N n ; B 26 0 575 441 ;
+C 111 ; WX 600 ; N o ; B 62 -15 538 441 ;
+C 112 ; WX 600 ; N p ; B 9 -157 555 441 ;
+C 113 ; WX 600 ; N q ; B 45 -157 591 441 ;
+C 114 ; WX 600 ; N r ; B 60 0 559 441 ;
+C 115 ; WX 600 ; N s ; B 80 -15 513 441 ;
+C 116 ; WX 600 ; N t ; B 87 -15 530 561 ;
+C 117 ; WX 600 ; N u ; B 21 -15 562 426 ;
+C 118 ; WX 600 ; N v ; B 10 -10 590 426 ;
+C 119 ; WX 600 ; N w ; B -4 -10 604 426 ;
+C 120 ; WX 600 ; N x ; B 20 0 580 426 ;
+C 121 ; WX 600 ; N y ; B 7 -157 592 426 ;
+C 122 ; WX 600 ; N z ; B 99 0 502 426 ;
+C 123 ; WX 600 ; N braceleft ; B 182 -108 437 622 ;
+C 124 ; WX 600 ; N bar ; B 275 -250 326 750 ;
+C 125 ; WX 600 ; N braceright ; B 163 -108 418 622 ;
+C 126 ; WX 600 ; N asciitilde ; B 63 197 540 320 ;
+C 161 ; WX 600 ; N exclamdown ; B 236 -157 364 430 ;
+C 162 ; WX 600 ; N cent ; B 96 -49 500 614 ;
+C 163 ; WX 600 ; N sterling ; B 84 -21 521 611 ;
+C 164 ; WX 600 ; N fraction ; B 92 -57 509 665 ;
+C 165 ; WX 600 ; N yen ; B 26 0 574 562 ;
+C 166 ; WX 600 ; N florin ; B 4 -143 539 622 ;
+C 167 ; WX 600 ; N section ; B 113 -78 488 580 ;
+C 168 ; WX 600 ; N currency ; B 73 58 527 506 ;
+C 169 ; WX 600 ; N quotesingle ; B 259 328 341 562 ;
+C 170 ; WX 600 ; N quotedblleft ; B 143 328 471 562 ;
+C 171 ; WX 600 ; N guillemotleft ; B 37 70 563 446 ;
+C 172 ; WX 600 ; N guilsinglleft ; B 149 70 451 446 ;
+C 173 ; WX 600 ; N guilsinglright ; B 149 70 451 446 ;
+C 174 ; WX 600 ; N fi ; B 3 0 597 629 ;
+C 175 ; WX 600 ; N fl ; B 3 0 597 629 ;
+C 177 ; WX 600 ; N endash ; B 75 231 525 285 ;
+C 178 ; WX 600 ; N dagger ; B 141 -78 459 580 ;
+C 179 ; WX 600 ; N daggerdbl ; B 141 -78 459 580 ;
+C 180 ; WX 600 ; N periodcentered ; B 222 189 378 327 ;
+C 182 ; WX 600 ; N paragraph ; B 50 -78 511 562 ;
+C 183 ; WX 600 ; N bullet ; B 172 130 428 383 ;
+C 184 ; WX 600 ; N quotesinglbase ; B 213 -134 376 100 ;
+C 185 ; WX 600 ; N quotedblbase ; B 143 -134 457 100 ;
+C 186 ; WX 600 ; N quotedblright ; B 143 328 457 562 ;
+C 187 ; WX 600 ; N guillemotright ; B 37 70 563 446 ;
+C 188 ; WX 600 ; N ellipsis ; B 37 -15 563 111 ;
+C 189 ; WX 600 ; N perthousand ; B 3 -15 600 622 ;
+C 191 ; WX 600 ; N questiondown ; B 108 -157 471 430 ;
+C 193 ; WX 600 ; N grave ; B 151 497 378 672 ;
+C 194 ; WX 600 ; N acute ; B 242 497 469 672 ;
+C 195 ; WX 600 ; N circumflex ; B 124 477 476 654 ;
+C 196 ; WX 600 ; N tilde ; B 105 489 503 606 ;
+C 197 ; WX 600 ; N macron ; B 120 525 480 565 ;
+C 198 ; WX 600 ; N breve ; B 153 501 447 609 ;
+C 199 ; WX 600 ; N dotaccent ; B 249 537 352 640 ;
+C 200 ; WX 600 ; N dieresis ; B 148 537 453 640 ;
+C 202 ; WX 600 ; N ring ; B 218 463 382 627 ;
+C 203 ; WX 600 ; N cedilla ; B 224 -151 362 10 ;
+C 205 ; WX 600 ; N hungarumlaut ; B 133 497 540 672 ;
+C 206 ; WX 600 ; N ogonek ; B 211 -172 407 4 ;
+C 207 ; WX 600 ; N caron ; B 124 492 476 669 ;
+C 208 ; WX 600 ; N emdash ; B 0 231 600 285 ;
+C 225 ; WX 600 ; N AE ; B 3 0 550 562 ;
+C 227 ; WX 600 ; N ordfeminine ; B 156 249 442 580 ;
+C 232 ; WX 600 ; N Lslash ; B 47 0 554 562 ;
+C 233 ; WX 600 ; N Oslash ; B 43 -80 557 629 ;
+C 234 ; WX 600 ; N OE ; B 7 0 567 562 ;
+C 235 ; WX 600 ; N ordmasculine ; B 157 249 443 580 ;
+C 241 ; WX 600 ; N ae ; B 19 -15 570 441 ;
+C 245 ; WX 600 ; N dotlessi ; B 95 0 505 426 ;
+C 248 ; WX 600 ; N lslash ; B 95 0 505 629 ;
+C 249 ; WX 600 ; N oslash ; B 62 -80 538 506 ;
+C 250 ; WX 600 ; N oe ; B 19 -15 559 441 ;
+C 251 ; WX 600 ; N germandbls ; B 48 -15 588 629 ;
+C -1 ; WX 600 ; N Idieresis ; B 96 0 504 753 ;
+C -1 ; WX 600 ; N eacute ; B 66 -15 548 672 ;
+C -1 ; WX 600 ; N abreve ; B 53 -15 559 609 ;
+C -1 ; WX 600 ; N uhungarumlaut ; B 21 -15 580 672 ;
+C -1 ; WX 600 ; N ecaron ; B 66 -15 548 669 ;
+C -1 ; WX 600 ; N Ydieresis ; B 24 0 576 753 ;
+C -1 ; WX 600 ; N divide ; B 87 48 513 467 ;
+C -1 ; WX 600 ; N Yacute ; B 24 0 576 805 ;
+C -1 ; WX 600 ; N Acircumflex ; B 3 0 597 787 ;
+C -1 ; WX 600 ; N aacute ; B 53 -15 559 672 ;
+C -1 ; WX 600 ; N Ucircumflex ; B 17 -18 583 787 ;
+C -1 ; WX 600 ; N yacute ; B 7 -157 592 672 ;
+C -1 ; WX 600 ; N scommaaccent ; B 80 -250 513 441 ;
+C -1 ; WX 600 ; N ecircumflex ; B 66 -15 548 654 ;
+C -1 ; WX 600 ; N Uring ; B 17 -18 583 760 ;
+C -1 ; WX 600 ; N Udieresis ; B 17 -18 583 753 ;
+C -1 ; WX 600 ; N aogonek ; B 53 -172 587 441 ;
+C -1 ; WX 600 ; N Uacute ; B 17 -18 583 805 ;
+C -1 ; WX 600 ; N uogonek ; B 21 -172 590 426 ;
+C -1 ; WX 600 ; N Edieresis ; B 53 0 550 753 ;
+C -1 ; WX 600 ; N Dcroat ; B 30 0 574 562 ;
+C -1 ; WX 600 ; N commaaccent ; B 198 -250 335 -58 ;
+C -1 ; WX 600 ; N copyright ; B 0 -18 600 580 ;
+C -1 ; WX 600 ; N Emacron ; B 53 0 550 698 ;
+C -1 ; WX 600 ; N ccaron ; B 66 -15 529 669 ;
+C -1 ; WX 600 ; N aring ; B 53 -15 559 627 ;
+C -1 ; WX 600 ; N Ncommaaccent ; B 7 -250 593 562 ;
+C -1 ; WX 600 ; N lacute ; B 95 0 505 805 ;
+C -1 ; WX 600 ; N agrave ; B 53 -15 559 672 ;
+C -1 ; WX 600 ; N Tcommaaccent ; B 38 -250 563 562 ;
+C -1 ; WX 600 ; N Cacute ; B 41 -18 540 805 ;
+C -1 ; WX 600 ; N atilde ; B 53 -15 559 606 ;
+C -1 ; WX 600 ; N Edotaccent ; B 53 0 550 753 ;
+C -1 ; WX 600 ; N scaron ; B 80 -15 513 669 ;
+C -1 ; WX 600 ; N scedilla ; B 80 -151 513 441 ;
+C -1 ; WX 600 ; N iacute ; B 95 0 505 672 ;
+C -1 ; WX 600 ; N lozenge ; B 18 0 443 706 ;
+C -1 ; WX 600 ; N Rcaron ; B 38 0 588 802 ;
+C -1 ; WX 600 ; N Gcommaaccent ; B 31 -250 575 580 ;
+C -1 ; WX 600 ; N ucircumflex ; B 21 -15 562 654 ;
+C -1 ; WX 600 ; N acircumflex ; B 53 -15 559 654 ;
+C -1 ; WX 600 ; N Amacron ; B 3 0 597 698 ;
+C -1 ; WX 600 ; N rcaron ; B 60 0 559 669 ;
+C -1 ; WX 600 ; N ccedilla ; B 66 -151 529 441 ;
+C -1 ; WX 600 ; N Zdotaccent ; B 86 0 514 753 ;
+C -1 ; WX 600 ; N Thorn ; B 79 0 538 562 ;
+C -1 ; WX 600 ; N Omacron ; B 43 -18 557 698 ;
+C -1 ; WX 600 ; N Racute ; B 38 0 588 805 ;
+C -1 ; WX 600 ; N Sacute ; B 72 -20 529 805 ;
+C -1 ; WX 600 ; N dcaron ; B 45 -15 715 629 ;
+C -1 ; WX 600 ; N Umacron ; B 17 -18 583 698 ;
+C -1 ; WX 600 ; N uring ; B 21 -15 562 627 ;
+C -1 ; WX 600 ; N threesuperior ; B 155 240 406 622 ;
+C -1 ; WX 600 ; N Ograve ; B 43 -18 557 805 ;
+C -1 ; WX 600 ; N Agrave ; B 3 0 597 805 ;
+C -1 ; WX 600 ; N Abreve ; B 3 0 597 732 ;
+C -1 ; WX 600 ; N multiply ; B 87 43 515 470 ;
+C -1 ; WX 600 ; N uacute ; B 21 -15 562 672 ;
+C -1 ; WX 600 ; N Tcaron ; B 38 0 563 802 ;
+C -1 ; WX 600 ; N partialdiff ; B 17 -38 459 710 ;
+C -1 ; WX 600 ; N ydieresis ; B 7 -157 592 620 ;
+C -1 ; WX 600 ; N Nacute ; B 7 -13 593 805 ;
+C -1 ; WX 600 ; N icircumflex ; B 94 0 505 654 ;
+C -1 ; WX 600 ; N Ecircumflex ; B 53 0 550 787 ;
+C -1 ; WX 600 ; N adieresis ; B 53 -15 559 620 ;
+C -1 ; WX 600 ; N edieresis ; B 66 -15 548 620 ;
+C -1 ; WX 600 ; N cacute ; B 66 -15 529 672 ;
+C -1 ; WX 600 ; N nacute ; B 26 0 575 672 ;
+C -1 ; WX 600 ; N umacron ; B 21 -15 562 565 ;
+C -1 ; WX 600 ; N Ncaron ; B 7 -13 593 802 ;
+C -1 ; WX 600 ; N Iacute ; B 96 0 504 805 ;
+C -1 ; WX 600 ; N plusminus ; B 87 44 513 558 ;
+C -1 ; WX 600 ; N brokenbar ; B 275 -175 326 675 ;
+C -1 ; WX 600 ; N registered ; B 0 -18 600 580 ;
+C -1 ; WX 600 ; N Gbreve ; B 31 -18 575 732 ;
+C -1 ; WX 600 ; N Idotaccent ; B 96 0 504 753 ;
+C -1 ; WX 600 ; N summation ; B 15 -10 585 706 ;
+C -1 ; WX 600 ; N Egrave ; B 53 0 550 805 ;
+C -1 ; WX 600 ; N racute ; B 60 0 559 672 ;
+C -1 ; WX 600 ; N omacron ; B 62 -15 538 565 ;
+C -1 ; WX 600 ; N Zacute ; B 86 0 514 805 ;
+C -1 ; WX 600 ; N Zcaron ; B 86 0 514 802 ;
+C -1 ; WX 600 ; N greaterequal ; B 98 0 502 710 ;
+C -1 ; WX 600 ; N Eth ; B 30 0 574 562 ;
+C -1 ; WX 600 ; N Ccedilla ; B 41 -151 540 580 ;
+C -1 ; WX 600 ; N lcommaaccent ; B 95 -250 505 629 ;
+C -1 ; WX 600 ; N tcaron ; B 87 -15 530 717 ;
+C -1 ; WX 600 ; N eogonek ; B 66 -172 548 441 ;
+C -1 ; WX 600 ; N Uogonek ; B 17 -172 583 562 ;
+C -1 ; WX 600 ; N Aacute ; B 3 0 597 805 ;
+C -1 ; WX 600 ; N Adieresis ; B 3 0 597 753 ;
+C -1 ; WX 600 ; N egrave ; B 66 -15 548 672 ;
+C -1 ; WX 600 ; N zacute ; B 99 0 502 672 ;
+C -1 ; WX 600 ; N iogonek ; B 95 -172 505 657 ;
+C -1 ; WX 600 ; N Oacute ; B 43 -18 557 805 ;
+C -1 ; WX 600 ; N oacute ; B 62 -15 538 672 ;
+C -1 ; WX 600 ; N amacron ; B 53 -15 559 565 ;
+C -1 ; WX 600 ; N sacute ; B 80 -15 513 672 ;
+C -1 ; WX 600 ; N idieresis ; B 95 0 505 620 ;
+C -1 ; WX 600 ; N Ocircumflex ; B 43 -18 557 787 ;
+C -1 ; WX 600 ; N Ugrave ; B 17 -18 583 805 ;
+C -1 ; WX 600 ; N Delta ; B 6 0 598 688 ;
+C -1 ; WX 600 ; N thorn ; B -6 -157 555 629 ;
+C -1 ; WX 600 ; N twosuperior ; B 177 249 424 622 ;
+C -1 ; WX 600 ; N Odieresis ; B 43 -18 557 753 ;
+C -1 ; WX 600 ; N mu ; B 21 -157 562 426 ;
+C -1 ; WX 600 ; N igrave ; B 95 0 505 672 ;
+C -1 ; WX 600 ; N ohungarumlaut ; B 62 -15 580 672 ;
+C -1 ; WX 600 ; N Eogonek ; B 53 -172 561 562 ;
+C -1 ; WX 600 ; N dcroat ; B 45 -15 591 629 ;
+C -1 ; WX 600 ; N threequarters ; B 8 -56 593 666 ;
+C -1 ; WX 600 ; N Scedilla ; B 72 -151 529 580 ;
+C -1 ; WX 600 ; N lcaron ; B 95 0 533 629 ;
+C -1 ; WX 600 ; N Kcommaaccent ; B 38 -250 582 562 ;
+C -1 ; WX 600 ; N Lacute ; B 47 0 554 805 ;
+C -1 ; WX 600 ; N trademark ; B -23 263 623 562 ;
+C -1 ; WX 600 ; N edotaccent ; B 66 -15 548 620 ;
+C -1 ; WX 600 ; N Igrave ; B 96 0 504 805 ;
+C -1 ; WX 600 ; N Imacron ; B 96 0 504 698 ;
+C -1 ; WX 600 ; N Lcaron ; B 47 0 554 562 ;
+C -1 ; WX 600 ; N onehalf ; B 0 -57 611 665 ;
+C -1 ; WX 600 ; N lessequal ; B 98 0 502 710 ;
+C -1 ; WX 600 ; N ocircumflex ; B 62 -15 538 654 ;
+C -1 ; WX 600 ; N ntilde ; B 26 0 575 606 ;
+C -1 ; WX 600 ; N Uhungarumlaut ; B 17 -18 590 805 ;
+C -1 ; WX 600 ; N Eacute ; B 53 0 550 805 ;
+C -1 ; WX 600 ; N emacron ; B 66 -15 548 565 ;
+C -1 ; WX 600 ; N gbreve ; B 45 -157 566 609 ;
+C -1 ; WX 600 ; N onequarter ; B 0 -57 600 665 ;
+C -1 ; WX 600 ; N Scaron ; B 72 -20 529 802 ;
+C -1 ; WX 600 ; N Scommaaccent ; B 72 -250 529 580 ;
+C -1 ; WX 600 ; N Ohungarumlaut ; B 43 -18 580 805 ;
+C -1 ; WX 600 ; N degree ; B 123 269 477 622 ;
+C -1 ; WX 600 ; N ograve ; B 62 -15 538 672 ;
+C -1 ; WX 600 ; N Ccaron ; B 41 -18 540 802 ;
+C -1 ; WX 600 ; N ugrave ; B 21 -15 562 672 ;
+C -1 ; WX 600 ; N radical ; B 3 -15 597 792 ;
+C -1 ; WX 600 ; N Dcaron ; B 43 0 574 802 ;
+C -1 ; WX 600 ; N rcommaaccent ; B 60 -250 559 441 ;
+C -1 ; WX 600 ; N Ntilde ; B 7 -13 593 729 ;
+C -1 ; WX 600 ; N otilde ; B 62 -15 538 606 ;
+C -1 ; WX 600 ; N Rcommaaccent ; B 38 -250 588 562 ;
+C -1 ; WX 600 ; N Lcommaaccent ; B 47 -250 554 562 ;
+C -1 ; WX 600 ; N Atilde ; B 3 0 597 729 ;
+C -1 ; WX 600 ; N Aogonek ; B 3 -172 608 562 ;
+C -1 ; WX 600 ; N Aring ; B 3 0 597 750 ;
+C -1 ; WX 600 ; N Otilde ; B 43 -18 557 729 ;
+C -1 ; WX 600 ; N zdotaccent ; B 99 0 502 620 ;
+C -1 ; WX 600 ; N Ecaron ; B 53 0 550 802 ;
+C -1 ; WX 600 ; N Iogonek ; B 96 -172 504 562 ;
+C -1 ; WX 600 ; N kcommaaccent ; B 43 -250 580 629 ;
+C -1 ; WX 600 ; N minus ; B 80 232 520 283 ;
+C -1 ; WX 600 ; N Icircumflex ; B 96 0 504 787 ;
+C -1 ; WX 600 ; N ncaron ; B 26 0 575 669 ;
+C -1 ; WX 600 ; N tcommaaccent ; B 87 -250 530 561 ;
+C -1 ; WX 600 ; N logicalnot ; B 87 108 513 369 ;
+C -1 ; WX 600 ; N odieresis ; B 62 -15 538 620 ;
+C -1 ; WX 600 ; N udieresis ; B 21 -15 562 620 ;
+C -1 ; WX 600 ; N notequal ; B 15 -16 540 529 ;
+C -1 ; WX 600 ; N gcommaaccent ; B 45 -157 566 708 ;
+C -1 ; WX 600 ; N eth ; B 62 -15 538 629 ;
+C -1 ; WX 600 ; N zcaron ; B 99 0 502 669 ;
+C -1 ; WX 600 ; N ncommaaccent ; B 26 -250 575 441 ;
+C -1 ; WX 600 ; N onesuperior ; B 172 249 428 622 ;
+C -1 ; WX 600 ; N imacron ; B 95 0 505 565 ;
+EndCharMetrics
+EndFontMetrics
diff --git a/src/fonts/Adobe-Core35_AFMs-314/Helvetica-Bold.afm b/src/fonts/Adobe-Core35_AFMs-314/Helvetica-Bold.afm
new file mode 100644
index 0000000..0932bdf
--- /dev/null
+++ b/src/fonts/Adobe-Core35_AFMs-314/Helvetica-Bold.afm
@@ -0,0 +1,2825 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Thu May 1 12:43:52 1997
+Comment UniqueID 43052
+Comment VMusage 37169 48194
+FontName Helvetica-Bold
+FullName Helvetica Bold
+FamilyName Helvetica
+Weight Bold
+ItalicAngle 0
+IsFixedPitch false
+FontBBox -170 -228 1003 962
+UnderlinePosition -100
+UnderlineThickness 50
+Version 002.000
+Notice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries.
+EncodingScheme AdobeStandardEncoding
+CapHeight 718
+XHeight 532
+Ascender 718
+Descender -207
+StdHW 118
+StdVW 140
+StartCharMetrics 314
+C 32 ; WX 278 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 333 ; N exclam ; B 90 0 244 718 ;
+C 34 ; WX 474 ; N quotedbl ; B 98 447 376 718 ;
+C 35 ; WX 556 ; N numbersign ; B 18 0 538 698 ;
+C 36 ; WX 556 ; N dollar ; B 30 -115 523 775 ;
+C 37 ; WX 889 ; N percent ; B 28 -19 861 710 ;
+C 38 ; WX 722 ; N ampersand ; B 54 -19 701 718 ;
+C 39 ; WX 278 ; N quoteright ; B 69 445 209 718 ;
+C 40 ; WX 333 ; N parenleft ; B 35 -208 314 734 ;
+C 41 ; WX 333 ; N parenright ; B 19 -208 298 734 ;
+C 42 ; WX 389 ; N asterisk ; B 27 387 362 718 ;
+C 43 ; WX 584 ; N plus ; B 40 0 544 506 ;
+C 44 ; WX 278 ; N comma ; B 64 -168 214 146 ;
+C 45 ; WX 333 ; N hyphen ; B 27 215 306 345 ;
+C 46 ; WX 278 ; N period ; B 64 0 214 146 ;
+C 47 ; WX 278 ; N slash ; B -33 -19 311 737 ;
+C 48 ; WX 556 ; N zero ; B 32 -19 524 710 ;
+C 49 ; WX 556 ; N one ; B 69 0 378 710 ;
+C 50 ; WX 556 ; N two ; B 26 0 511 710 ;
+C 51 ; WX 556 ; N three ; B 27 -19 516 710 ;
+C 52 ; WX 556 ; N four ; B 27 0 526 710 ;
+C 53 ; WX 556 ; N five ; B 27 -19 516 698 ;
+C 54 ; WX 556 ; N six ; B 31 -19 520 710 ;
+C 55 ; WX 556 ; N seven ; B 25 0 528 698 ;
+C 56 ; WX 556 ; N eight ; B 32 -19 524 710 ;
+C 57 ; WX 556 ; N nine ; B 30 -19 522 710 ;
+C 58 ; WX 333 ; N colon ; B 92 0 242 512 ;
+C 59 ; WX 333 ; N semicolon ; B 92 -168 242 512 ;
+C 60 ; WX 584 ; N less ; B 38 -8 546 514 ;
+C 61 ; WX 584 ; N equal ; B 40 87 544 419 ;
+C 62 ; WX 584 ; N greater ; B 38 -8 546 514 ;
+C 63 ; WX 611 ; N question ; B 60 0 556 727 ;
+C 64 ; WX 975 ; N at ; B 118 -19 856 737 ;
+C 65 ; WX 722 ; N A ; B 20 0 702 718 ;
+C 66 ; WX 722 ; N B ; B 76 0 669 718 ;
+C 67 ; WX 722 ; N C ; B 44 -19 684 737 ;
+C 68 ; WX 722 ; N D ; B 76 0 685 718 ;
+C 69 ; WX 667 ; N E ; B 76 0 621 718 ;
+C 70 ; WX 611 ; N F ; B 76 0 587 718 ;
+C 71 ; WX 778 ; N G ; B 44 -19 713 737 ;
+C 72 ; WX 722 ; N H ; B 71 0 651 718 ;
+C 73 ; WX 278 ; N I ; B 64 0 214 718 ;
+C 74 ; WX 556 ; N J ; B 22 -18 484 718 ;
+C 75 ; WX 722 ; N K ; B 87 0 722 718 ;
+C 76 ; WX 611 ; N L ; B 76 0 583 718 ;
+C 77 ; WX 833 ; N M ; B 69 0 765 718 ;
+C 78 ; WX 722 ; N N ; B 69 0 654 718 ;
+C 79 ; WX 778 ; N O ; B 44 -19 734 737 ;
+C 80 ; WX 667 ; N P ; B 76 0 627 718 ;
+C 81 ; WX 778 ; N Q ; B 44 -52 737 737 ;
+C 82 ; WX 722 ; N R ; B 76 0 677 718 ;
+C 83 ; WX 667 ; N S ; B 39 -19 629 737 ;
+C 84 ; WX 611 ; N T ; B 14 0 598 718 ;
+C 85 ; WX 722 ; N U ; B 72 -19 651 718 ;
+C 86 ; WX 667 ; N V ; B 19 0 648 718 ;
+C 87 ; WX 944 ; N W ; B 16 0 929 718 ;
+C 88 ; WX 667 ; N X ; B 14 0 653 718 ;
+C 89 ; WX 667 ; N Y ; B 15 0 653 718 ;
+C 90 ; WX 611 ; N Z ; B 25 0 586 718 ;
+C 91 ; WX 333 ; N bracketleft ; B 63 -196 309 722 ;
+C 92 ; WX 278 ; N backslash ; B -33 -19 311 737 ;
+C 93 ; WX 333 ; N bracketright ; B 24 -196 270 722 ;
+C 94 ; WX 584 ; N asciicircum ; B 62 323 522 698 ;
+C 95 ; WX 556 ; N underscore ; B 0 -125 556 -75 ;
+C 96 ; WX 278 ; N quoteleft ; B 69 454 209 727 ;
+C 97 ; WX 556 ; N a ; B 29 -14 527 546 ;
+C 98 ; WX 611 ; N b ; B 61 -14 578 718 ;
+C 99 ; WX 556 ; N c ; B 34 -14 524 546 ;
+C 100 ; WX 611 ; N d ; B 34 -14 551 718 ;
+C 101 ; WX 556 ; N e ; B 23 -14 528 546 ;
+C 102 ; WX 333 ; N f ; B 10 0 318 727 ; L i fi ; L l fl ;
+C 103 ; WX 611 ; N g ; B 40 -217 553 546 ;
+C 104 ; WX 611 ; N h ; B 65 0 546 718 ;
+C 105 ; WX 278 ; N i ; B 69 0 209 725 ;
+C 106 ; WX 278 ; N j ; B 3 -214 209 725 ;
+C 107 ; WX 556 ; N k ; B 69 0 562 718 ;
+C 108 ; WX 278 ; N l ; B 69 0 209 718 ;
+C 109 ; WX 889 ; N m ; B 64 0 826 546 ;
+C 110 ; WX 611 ; N n ; B 65 0 546 546 ;
+C 111 ; WX 611 ; N o ; B 34 -14 578 546 ;
+C 112 ; WX 611 ; N p ; B 62 -207 578 546 ;
+C 113 ; WX 611 ; N q ; B 34 -207 552 546 ;
+C 114 ; WX 389 ; N r ; B 64 0 373 546 ;
+C 115 ; WX 556 ; N s ; B 30 -14 519 546 ;
+C 116 ; WX 333 ; N t ; B 10 -6 309 676 ;
+C 117 ; WX 611 ; N u ; B 66 -14 545 532 ;
+C 118 ; WX 556 ; N v ; B 13 0 543 532 ;
+C 119 ; WX 778 ; N w ; B 10 0 769 532 ;
+C 120 ; WX 556 ; N x ; B 15 0 541 532 ;
+C 121 ; WX 556 ; N y ; B 10 -214 539 532 ;
+C 122 ; WX 500 ; N z ; B 20 0 480 532 ;
+C 123 ; WX 389 ; N braceleft ; B 48 -196 365 722 ;
+C 124 ; WX 280 ; N bar ; B 84 -225 196 775 ;
+C 125 ; WX 389 ; N braceright ; B 24 -196 341 722 ;
+C 126 ; WX 584 ; N asciitilde ; B 61 163 523 343 ;
+C 161 ; WX 333 ; N exclamdown ; B 90 -186 244 532 ;
+C 162 ; WX 556 ; N cent ; B 34 -118 524 628 ;
+C 163 ; WX 556 ; N sterling ; B 28 -16 541 718 ;
+C 164 ; WX 167 ; N fraction ; B -170 -19 336 710 ;
+C 165 ; WX 556 ; N yen ; B -9 0 565 698 ;
+C 166 ; WX 556 ; N florin ; B -10 -210 516 737 ;
+C 167 ; WX 556 ; N section ; B 34 -184 522 727 ;
+C 168 ; WX 556 ; N currency ; B -3 76 559 636 ;
+C 169 ; WX 238 ; N quotesingle ; B 70 447 168 718 ;
+C 170 ; WX 500 ; N quotedblleft ; B 64 454 436 727 ;
+C 171 ; WX 556 ; N guillemotleft ; B 88 76 468 484 ;
+C 172 ; WX 333 ; N guilsinglleft ; B 83 76 250 484 ;
+C 173 ; WX 333 ; N guilsinglright ; B 83 76 250 484 ;
+C 174 ; WX 611 ; N fi ; B 10 0 542 727 ;
+C 175 ; WX 611 ; N fl ; B 10 0 542 727 ;
+C 177 ; WX 556 ; N endash ; B 0 227 556 333 ;
+C 178 ; WX 556 ; N dagger ; B 36 -171 520 718 ;
+C 179 ; WX 556 ; N daggerdbl ; B 36 -171 520 718 ;
+C 180 ; WX 278 ; N periodcentered ; B 58 172 220 334 ;
+C 182 ; WX 556 ; N paragraph ; B -8 -191 539 700 ;
+C 183 ; WX 350 ; N bullet ; B 10 194 340 524 ;
+C 184 ; WX 278 ; N quotesinglbase ; B 69 -146 209 127 ;
+C 185 ; WX 500 ; N quotedblbase ; B 64 -146 436 127 ;
+C 186 ; WX 500 ; N quotedblright ; B 64 445 436 718 ;
+C 187 ; WX 556 ; N guillemotright ; B 88 76 468 484 ;
+C 188 ; WX 1000 ; N ellipsis ; B 92 0 908 146 ;
+C 189 ; WX 1000 ; N perthousand ; B -3 -19 1003 710 ;
+C 191 ; WX 611 ; N questiondown ; B 55 -195 551 532 ;
+C 193 ; WX 333 ; N grave ; B -23 604 225 750 ;
+C 194 ; WX 333 ; N acute ; B 108 604 356 750 ;
+C 195 ; WX 333 ; N circumflex ; B -10 604 343 750 ;
+C 196 ; WX 333 ; N tilde ; B -17 610 350 737 ;
+C 197 ; WX 333 ; N macron ; B -6 604 339 678 ;
+C 198 ; WX 333 ; N breve ; B -2 604 335 750 ;
+C 199 ; WX 333 ; N dotaccent ; B 104 614 230 729 ;
+C 200 ; WX 333 ; N dieresis ; B 6 614 327 729 ;
+C 202 ; WX 333 ; N ring ; B 59 568 275 776 ;
+C 203 ; WX 333 ; N cedilla ; B 6 -228 245 0 ;
+C 205 ; WX 333 ; N hungarumlaut ; B 9 604 486 750 ;
+C 206 ; WX 333 ; N ogonek ; B 71 -228 304 0 ;
+C 207 ; WX 333 ; N caron ; B -10 604 343 750 ;
+C 208 ; WX 1000 ; N emdash ; B 0 227 1000 333 ;
+C 225 ; WX 1000 ; N AE ; B 5 0 954 718 ;
+C 227 ; WX 370 ; N ordfeminine ; B 22 401 347 737 ;
+C 232 ; WX 611 ; N Lslash ; B -20 0 583 718 ;
+C 233 ; WX 778 ; N Oslash ; B 33 -27 744 745 ;
+C 234 ; WX 1000 ; N OE ; B 37 -19 961 737 ;
+C 235 ; WX 365 ; N ordmasculine ; B 6 401 360 737 ;
+C 241 ; WX 889 ; N ae ; B 29 -14 858 546 ;
+C 245 ; WX 278 ; N dotlessi ; B 69 0 209 532 ;
+C 248 ; WX 278 ; N lslash ; B -18 0 296 718 ;
+C 249 ; WX 611 ; N oslash ; B 22 -29 589 560 ;
+C 250 ; WX 944 ; N oe ; B 34 -14 912 546 ;
+C 251 ; WX 611 ; N germandbls ; B 69 -14 579 731 ;
+C -1 ; WX 278 ; N Idieresis ; B -21 0 300 915 ;
+C -1 ; WX 556 ; N eacute ; B 23 -14 528 750 ;
+C -1 ; WX 556 ; N abreve ; B 29 -14 527 750 ;
+C -1 ; WX 611 ; N uhungarumlaut ; B 66 -14 625 750 ;
+C -1 ; WX 556 ; N ecaron ; B 23 -14 528 750 ;
+C -1 ; WX 667 ; N Ydieresis ; B 15 0 653 915 ;
+C -1 ; WX 584 ; N divide ; B 40 -42 544 548 ;
+C -1 ; WX 667 ; N Yacute ; B 15 0 653 936 ;
+C -1 ; WX 722 ; N Acircumflex ; B 20 0 702 936 ;
+C -1 ; WX 556 ; N aacute ; B 29 -14 527 750 ;
+C -1 ; WX 722 ; N Ucircumflex ; B 72 -19 651 936 ;
+C -1 ; WX 556 ; N yacute ; B 10 -214 539 750 ;
+C -1 ; WX 556 ; N scommaaccent ; B 30 -228 519 546 ;
+C -1 ; WX 556 ; N ecircumflex ; B 23 -14 528 750 ;
+C -1 ; WX 722 ; N Uring ; B 72 -19 651 962 ;
+C -1 ; WX 722 ; N Udieresis ; B 72 -19 651 915 ;
+C -1 ; WX 556 ; N aogonek ; B 29 -224 545 546 ;
+C -1 ; WX 722 ; N Uacute ; B 72 -19 651 936 ;
+C -1 ; WX 611 ; N uogonek ; B 66 -228 545 532 ;
+C -1 ; WX 667 ; N Edieresis ; B 76 0 621 915 ;
+C -1 ; WX 722 ; N Dcroat ; B -5 0 685 718 ;
+C -1 ; WX 250 ; N commaaccent ; B 64 -228 199 -50 ;
+C -1 ; WX 737 ; N copyright ; B -11 -19 749 737 ;
+C -1 ; WX 667 ; N Emacron ; B 76 0 621 864 ;
+C -1 ; WX 556 ; N ccaron ; B 34 -14 524 750 ;
+C -1 ; WX 556 ; N aring ; B 29 -14 527 776 ;
+C -1 ; WX 722 ; N Ncommaaccent ; B 69 -228 654 718 ;
+C -1 ; WX 278 ; N lacute ; B 69 0 329 936 ;
+C -1 ; WX 556 ; N agrave ; B 29 -14 527 750 ;
+C -1 ; WX 611 ; N Tcommaaccent ; B 14 -228 598 718 ;
+C -1 ; WX 722 ; N Cacute ; B 44 -19 684 936 ;
+C -1 ; WX 556 ; N atilde ; B 29 -14 527 737 ;
+C -1 ; WX 667 ; N Edotaccent ; B 76 0 621 915 ;
+C -1 ; WX 556 ; N scaron ; B 30 -14 519 750 ;
+C -1 ; WX 556 ; N scedilla ; B 30 -228 519 546 ;
+C -1 ; WX 278 ; N iacute ; B 69 0 329 750 ;
+C -1 ; WX 494 ; N lozenge ; B 10 0 484 745 ;
+C -1 ; WX 722 ; N Rcaron ; B 76 0 677 936 ;
+C -1 ; WX 778 ; N Gcommaaccent ; B 44 -228 713 737 ;
+C -1 ; WX 611 ; N ucircumflex ; B 66 -14 545 750 ;
+C -1 ; WX 556 ; N acircumflex ; B 29 -14 527 750 ;
+C -1 ; WX 722 ; N Amacron ; B 20 0 702 864 ;
+C -1 ; WX 389 ; N rcaron ; B 18 0 373 750 ;
+C -1 ; WX 556 ; N ccedilla ; B 34 -228 524 546 ;
+C -1 ; WX 611 ; N Zdotaccent ; B 25 0 586 915 ;
+C -1 ; WX 667 ; N Thorn ; B 76 0 627 718 ;
+C -1 ; WX 778 ; N Omacron ; B 44 -19 734 864 ;
+C -1 ; WX 722 ; N Racute ; B 76 0 677 936 ;
+C -1 ; WX 667 ; N Sacute ; B 39 -19 629 936 ;
+C -1 ; WX 743 ; N dcaron ; B 34 -14 750 718 ;
+C -1 ; WX 722 ; N Umacron ; B 72 -19 651 864 ;
+C -1 ; WX 611 ; N uring ; B 66 -14 545 776 ;
+C -1 ; WX 333 ; N threesuperior ; B 8 271 326 710 ;
+C -1 ; WX 778 ; N Ograve ; B 44 -19 734 936 ;
+C -1 ; WX 722 ; N Agrave ; B 20 0 702 936 ;
+C -1 ; WX 722 ; N Abreve ; B 20 0 702 936 ;
+C -1 ; WX 584 ; N multiply ; B 40 1 545 505 ;
+C -1 ; WX 611 ; N uacute ; B 66 -14 545 750 ;
+C -1 ; WX 611 ; N Tcaron ; B 14 0 598 936 ;
+C -1 ; WX 494 ; N partialdiff ; B 11 -21 494 750 ;
+C -1 ; WX 556 ; N ydieresis ; B 10 -214 539 729 ;
+C -1 ; WX 722 ; N Nacute ; B 69 0 654 936 ;
+C -1 ; WX 278 ; N icircumflex ; B -37 0 316 750 ;
+C -1 ; WX 667 ; N Ecircumflex ; B 76 0 621 936 ;
+C -1 ; WX 556 ; N adieresis ; B 29 -14 527 729 ;
+C -1 ; WX 556 ; N edieresis ; B 23 -14 528 729 ;
+C -1 ; WX 556 ; N cacute ; B 34 -14 524 750 ;
+C -1 ; WX 611 ; N nacute ; B 65 0 546 750 ;
+C -1 ; WX 611 ; N umacron ; B 66 -14 545 678 ;
+C -1 ; WX 722 ; N Ncaron ; B 69 0 654 936 ;
+C -1 ; WX 278 ; N Iacute ; B 64 0 329 936 ;
+C -1 ; WX 584 ; N plusminus ; B 40 0 544 506 ;
+C -1 ; WX 280 ; N brokenbar ; B 84 -150 196 700 ;
+C -1 ; WX 737 ; N registered ; B -11 -19 748 737 ;
+C -1 ; WX 778 ; N Gbreve ; B 44 -19 713 936 ;
+C -1 ; WX 278 ; N Idotaccent ; B 64 0 214 915 ;
+C -1 ; WX 600 ; N summation ; B 14 -10 585 706 ;
+C -1 ; WX 667 ; N Egrave ; B 76 0 621 936 ;
+C -1 ; WX 389 ; N racute ; B 64 0 384 750 ;
+C -1 ; WX 611 ; N omacron ; B 34 -14 578 678 ;
+C -1 ; WX 611 ; N Zacute ; B 25 0 586 936 ;
+C -1 ; WX 611 ; N Zcaron ; B 25 0 586 936 ;
+C -1 ; WX 549 ; N greaterequal ; B 26 0 523 704 ;
+C -1 ; WX 722 ; N Eth ; B -5 0 685 718 ;
+C -1 ; WX 722 ; N Ccedilla ; B 44 -228 684 737 ;
+C -1 ; WX 278 ; N lcommaaccent ; B 69 -228 213 718 ;
+C -1 ; WX 389 ; N tcaron ; B 10 -6 421 878 ;
+C -1 ; WX 556 ; N eogonek ; B 23 -228 528 546 ;
+C -1 ; WX 722 ; N Uogonek ; B 72 -228 651 718 ;
+C -1 ; WX 722 ; N Aacute ; B 20 0 702 936 ;
+C -1 ; WX 722 ; N Adieresis ; B 20 0 702 915 ;
+C -1 ; WX 556 ; N egrave ; B 23 -14 528 750 ;
+C -1 ; WX 500 ; N zacute ; B 20 0 480 750 ;
+C -1 ; WX 278 ; N iogonek ; B 16 -224 249 725 ;
+C -1 ; WX 778 ; N Oacute ; B 44 -19 734 936 ;
+C -1 ; WX 611 ; N oacute ; B 34 -14 578 750 ;
+C -1 ; WX 556 ; N amacron ; B 29 -14 527 678 ;
+C -1 ; WX 556 ; N sacute ; B 30 -14 519 750 ;
+C -1 ; WX 278 ; N idieresis ; B -21 0 300 729 ;
+C -1 ; WX 778 ; N Ocircumflex ; B 44 -19 734 936 ;
+C -1 ; WX 722 ; N Ugrave ; B 72 -19 651 936 ;
+C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ;
+C -1 ; WX 611 ; N thorn ; B 62 -208 578 718 ;
+C -1 ; WX 333 ; N twosuperior ; B 9 283 324 710 ;
+C -1 ; WX 778 ; N Odieresis ; B 44 -19 734 915 ;
+C -1 ; WX 611 ; N mu ; B 66 -207 545 532 ;
+C -1 ; WX 278 ; N igrave ; B -50 0 209 750 ;
+C -1 ; WX 611 ; N ohungarumlaut ; B 34 -14 625 750 ;
+C -1 ; WX 667 ; N Eogonek ; B 76 -224 639 718 ;
+C -1 ; WX 611 ; N dcroat ; B 34 -14 650 718 ;
+C -1 ; WX 834 ; N threequarters ; B 16 -19 799 710 ;
+C -1 ; WX 667 ; N Scedilla ; B 39 -228 629 737 ;
+C -1 ; WX 400 ; N lcaron ; B 69 0 408 718 ;
+C -1 ; WX 722 ; N Kcommaaccent ; B 87 -228 722 718 ;
+C -1 ; WX 611 ; N Lacute ; B 76 0 583 936 ;
+C -1 ; WX 1000 ; N trademark ; B 44 306 956 718 ;
+C -1 ; WX 556 ; N edotaccent ; B 23 -14 528 729 ;
+C -1 ; WX 278 ; N Igrave ; B -50 0 214 936 ;
+C -1 ; WX 278 ; N Imacron ; B -33 0 312 864 ;
+C -1 ; WX 611 ; N Lcaron ; B 76 0 583 718 ;
+C -1 ; WX 834 ; N onehalf ; B 26 -19 794 710 ;
+C -1 ; WX 549 ; N lessequal ; B 29 0 526 704 ;
+C -1 ; WX 611 ; N ocircumflex ; B 34 -14 578 750 ;
+C -1 ; WX 611 ; N ntilde ; B 65 0 546 737 ;
+C -1 ; WX 722 ; N Uhungarumlaut ; B 72 -19 681 936 ;
+C -1 ; WX 667 ; N Eacute ; B 76 0 621 936 ;
+C -1 ; WX 556 ; N emacron ; B 23 -14 528 678 ;
+C -1 ; WX 611 ; N gbreve ; B 40 -217 553 750 ;
+C -1 ; WX 834 ; N onequarter ; B 26 -19 766 710 ;
+C -1 ; WX 667 ; N Scaron ; B 39 -19 629 936 ;
+C -1 ; WX 667 ; N Scommaaccent ; B 39 -228 629 737 ;
+C -1 ; WX 778 ; N Ohungarumlaut ; B 44 -19 734 936 ;
+C -1 ; WX 400 ; N degree ; B 57 426 343 712 ;
+C -1 ; WX 611 ; N ograve ; B 34 -14 578 750 ;
+C -1 ; WX 722 ; N Ccaron ; B 44 -19 684 936 ;
+C -1 ; WX 611 ; N ugrave ; B 66 -14 545 750 ;
+C -1 ; WX 549 ; N radical ; B 10 -46 512 850 ;
+C -1 ; WX 722 ; N Dcaron ; B 76 0 685 936 ;
+C -1 ; WX 389 ; N rcommaaccent ; B 64 -228 373 546 ;
+C -1 ; WX 722 ; N Ntilde ; B 69 0 654 923 ;
+C -1 ; WX 611 ; N otilde ; B 34 -14 578 737 ;
+C -1 ; WX 722 ; N Rcommaaccent ; B 76 -228 677 718 ;
+C -1 ; WX 611 ; N Lcommaaccent ; B 76 -228 583 718 ;
+C -1 ; WX 722 ; N Atilde ; B 20 0 702 923 ;
+C -1 ; WX 722 ; N Aogonek ; B 20 -224 742 718 ;
+C -1 ; WX 722 ; N Aring ; B 20 0 702 962 ;
+C -1 ; WX 778 ; N Otilde ; B 44 -19 734 923 ;
+C -1 ; WX 500 ; N zdotaccent ; B 20 0 480 729 ;
+C -1 ; WX 667 ; N Ecaron ; B 76 0 621 936 ;
+C -1 ; WX 278 ; N Iogonek ; B -11 -228 222 718 ;
+C -1 ; WX 556 ; N kcommaaccent ; B 69 -228 562 718 ;
+C -1 ; WX 584 ; N minus ; B 40 197 544 309 ;
+C -1 ; WX 278 ; N Icircumflex ; B -37 0 316 936 ;
+C -1 ; WX 611 ; N ncaron ; B 65 0 546 750 ;
+C -1 ; WX 333 ; N tcommaaccent ; B 10 -228 309 676 ;
+C -1 ; WX 584 ; N logicalnot ; B 40 108 544 419 ;
+C -1 ; WX 611 ; N odieresis ; B 34 -14 578 729 ;
+C -1 ; WX 611 ; N udieresis ; B 66 -14 545 729 ;
+C -1 ; WX 549 ; N notequal ; B 15 -49 540 570 ;
+C -1 ; WX 611 ; N gcommaaccent ; B 40 -217 553 850 ;
+C -1 ; WX 611 ; N eth ; B 34 -14 578 737 ;
+C -1 ; WX 500 ; N zcaron ; B 20 0 480 750 ;
+C -1 ; WX 611 ; N ncommaaccent ; B 65 -228 546 546 ;
+C -1 ; WX 333 ; N onesuperior ; B 26 283 237 710 ;
+C -1 ; WX 278 ; N imacron ; B -8 0 285 678 ;
+EndCharMetrics
+StartKernData
+StartKernPairs 2481
+KPX A C -40
+KPX A Cacute -40
+KPX A Ccaron -40
+KPX A Ccedilla -40
+KPX A G -50
+KPX A Gbreve -50
+KPX A Gcommaaccent -50
+KPX A O -40
+KPX A Oacute -40
+KPX A Ocircumflex -40
+KPX A Odieresis -40
+KPX A Ograve -40
+KPX A Ohungarumlaut -40
+KPX A Omacron -40
+KPX A Oslash -40
+KPX A Otilde -40
+KPX A Q -40
+KPX A T -90
+KPX A Tcaron -90
+KPX A Tcommaaccent -90
+KPX A U -50
+KPX A Uacute -50
+KPX A Ucircumflex -50
+KPX A Udieresis -50
+KPX A Ugrave -50
+KPX A Uhungarumlaut -50
+KPX A Umacron -50
+KPX A Uogonek -50
+KPX A Uring -50
+KPX A V -80
+KPX A W -60
+KPX A Y -110
+KPX A Yacute -110
+KPX A Ydieresis -110
+KPX A u -30
+KPX A uacute -30
+KPX A ucircumflex -30
+KPX A udieresis -30
+KPX A ugrave -30
+KPX A uhungarumlaut -30
+KPX A umacron -30
+KPX A uogonek -30
+KPX A uring -30
+KPX A v -40
+KPX A w -30
+KPX A y -30
+KPX A yacute -30
+KPX A ydieresis -30
+KPX Aacute C -40
+KPX Aacute Cacute -40
+KPX Aacute Ccaron -40
+KPX Aacute Ccedilla -40
+KPX Aacute G -50
+KPX Aacute Gbreve -50
+KPX Aacute Gcommaaccent -50
+KPX Aacute O -40
+KPX Aacute Oacute -40
+KPX Aacute Ocircumflex -40
+KPX Aacute Odieresis -40
+KPX Aacute Ograve -40
+KPX Aacute Ohungarumlaut -40
+KPX Aacute Omacron -40
+KPX Aacute Oslash -40
+KPX Aacute Otilde -40
+KPX Aacute Q -40
+KPX Aacute T -90
+KPX Aacute Tcaron -90
+KPX Aacute Tcommaaccent -90
+KPX Aacute U -50
+KPX Aacute Uacute -50
+KPX Aacute Ucircumflex -50
+KPX Aacute Udieresis -50
+KPX Aacute Ugrave -50
+KPX Aacute Uhungarumlaut -50
+KPX Aacute Umacron -50
+KPX Aacute Uogonek -50
+KPX Aacute Uring -50
+KPX Aacute V -80
+KPX Aacute W -60
+KPX Aacute Y -110
+KPX Aacute Yacute -110
+KPX Aacute Ydieresis -110
+KPX Aacute u -30
+KPX Aacute uacute -30
+KPX Aacute ucircumflex -30
+KPX Aacute udieresis -30
+KPX Aacute ugrave -30
+KPX Aacute uhungarumlaut -30
+KPX Aacute umacron -30
+KPX Aacute uogonek -30
+KPX Aacute uring -30
+KPX Aacute v -40
+KPX Aacute w -30
+KPX Aacute y -30
+KPX Aacute yacute -30
+KPX Aacute ydieresis -30
+KPX Abreve C -40
+KPX Abreve Cacute -40
+KPX Abreve Ccaron -40
+KPX Abreve Ccedilla -40
+KPX Abreve G -50
+KPX Abreve Gbreve -50
+KPX Abreve Gcommaaccent -50
+KPX Abreve O -40
+KPX Abreve Oacute -40
+KPX Abreve Ocircumflex -40
+KPX Abreve Odieresis -40
+KPX Abreve Ograve -40
+KPX Abreve Ohungarumlaut -40
+KPX Abreve Omacron -40
+KPX Abreve Oslash -40
+KPX Abreve Otilde -40
+KPX Abreve Q -40
+KPX Abreve T -90
+KPX Abreve Tcaron -90
+KPX Abreve Tcommaaccent -90
+KPX Abreve U -50
+KPX Abreve Uacute -50
+KPX Abreve Ucircumflex -50
+KPX Abreve Udieresis -50
+KPX Abreve Ugrave -50
+KPX Abreve Uhungarumlaut -50
+KPX Abreve Umacron -50
+KPX Abreve Uogonek -50
+KPX Abreve Uring -50
+KPX Abreve V -80
+KPX Abreve W -60
+KPX Abreve Y -110
+KPX Abreve Yacute -110
+KPX Abreve Ydieresis -110
+KPX Abreve u -30
+KPX Abreve uacute -30
+KPX Abreve ucircumflex -30
+KPX Abreve udieresis -30
+KPX Abreve ugrave -30
+KPX Abreve uhungarumlaut -30
+KPX Abreve umacron -30
+KPX Abreve uogonek -30
+KPX Abreve uring -30
+KPX Abreve v -40
+KPX Abreve w -30
+KPX Abreve y -30
+KPX Abreve yacute -30
+KPX Abreve ydieresis -30
+KPX Acircumflex C -40
+KPX Acircumflex Cacute -40
+KPX Acircumflex Ccaron -40
+KPX Acircumflex Ccedilla -40
+KPX Acircumflex G -50
+KPX Acircumflex Gbreve -50
+KPX Acircumflex Gcommaaccent -50
+KPX Acircumflex O -40
+KPX Acircumflex Oacute -40
+KPX Acircumflex Ocircumflex -40
+KPX Acircumflex Odieresis -40
+KPX Acircumflex Ograve -40
+KPX Acircumflex Ohungarumlaut -40
+KPX Acircumflex Omacron -40
+KPX Acircumflex Oslash -40
+KPX Acircumflex Otilde -40
+KPX Acircumflex Q -40
+KPX Acircumflex T -90
+KPX Acircumflex Tcaron -90
+KPX Acircumflex Tcommaaccent -90
+KPX Acircumflex U -50
+KPX Acircumflex Uacute -50
+KPX Acircumflex Ucircumflex -50
+KPX Acircumflex Udieresis -50
+KPX Acircumflex Ugrave -50
+KPX Acircumflex Uhungarumlaut -50
+KPX Acircumflex Umacron -50
+KPX Acircumflex Uogonek -50
+KPX Acircumflex Uring -50
+KPX Acircumflex V -80
+KPX Acircumflex W -60
+KPX Acircumflex Y -110
+KPX Acircumflex Yacute -110
+KPX Acircumflex Ydieresis -110
+KPX Acircumflex u -30
+KPX Acircumflex uacute -30
+KPX Acircumflex ucircumflex -30
+KPX Acircumflex udieresis -30
+KPX Acircumflex ugrave -30
+KPX Acircumflex uhungarumlaut -30
+KPX Acircumflex umacron -30
+KPX Acircumflex uogonek -30
+KPX Acircumflex uring -30
+KPX Acircumflex v -40
+KPX Acircumflex w -30
+KPX Acircumflex y -30
+KPX Acircumflex yacute -30
+KPX Acircumflex ydieresis -30
+KPX Adieresis C -40
+KPX Adieresis Cacute -40
+KPX Adieresis Ccaron -40
+KPX Adieresis Ccedilla -40
+KPX Adieresis G -50
+KPX Adieresis Gbreve -50
+KPX Adieresis Gcommaaccent -50
+KPX Adieresis O -40
+KPX Adieresis Oacute -40
+KPX Adieresis Ocircumflex -40
+KPX Adieresis Odieresis -40
+KPX Adieresis Ograve -40
+KPX Adieresis Ohungarumlaut -40
+KPX Adieresis Omacron -40
+KPX Adieresis Oslash -40
+KPX Adieresis Otilde -40
+KPX Adieresis Q -40
+KPX Adieresis T -90
+KPX Adieresis Tcaron -90
+KPX Adieresis Tcommaaccent -90
+KPX Adieresis U -50
+KPX Adieresis Uacute -50
+KPX Adieresis Ucircumflex -50
+KPX Adieresis Udieresis -50
+KPX Adieresis Ugrave -50
+KPX Adieresis Uhungarumlaut -50
+KPX Adieresis Umacron -50
+KPX Adieresis Uogonek -50
+KPX Adieresis Uring -50
+KPX Adieresis V -80
+KPX Adieresis W -60
+KPX Adieresis Y -110
+KPX Adieresis Yacute -110
+KPX Adieresis Ydieresis -110
+KPX Adieresis u -30
+KPX Adieresis uacute -30
+KPX Adieresis ucircumflex -30
+KPX Adieresis udieresis -30
+KPX Adieresis ugrave -30
+KPX Adieresis uhungarumlaut -30
+KPX Adieresis umacron -30
+KPX Adieresis uogonek -30
+KPX Adieresis uring -30
+KPX Adieresis v -40
+KPX Adieresis w -30
+KPX Adieresis y -30
+KPX Adieresis yacute -30
+KPX Adieresis ydieresis -30
+KPX Agrave C -40
+KPX Agrave Cacute -40
+KPX Agrave Ccaron -40
+KPX Agrave Ccedilla -40
+KPX Agrave G -50
+KPX Agrave Gbreve -50
+KPX Agrave Gcommaaccent -50
+KPX Agrave O -40
+KPX Agrave Oacute -40
+KPX Agrave Ocircumflex -40
+KPX Agrave Odieresis -40
+KPX Agrave Ograve -40
+KPX Agrave Ohungarumlaut -40
+KPX Agrave Omacron -40
+KPX Agrave Oslash -40
+KPX Agrave Otilde -40
+KPX Agrave Q -40
+KPX Agrave T -90
+KPX Agrave Tcaron -90
+KPX Agrave Tcommaaccent -90
+KPX Agrave U -50
+KPX Agrave Uacute -50
+KPX Agrave Ucircumflex -50
+KPX Agrave Udieresis -50
+KPX Agrave Ugrave -50
+KPX Agrave Uhungarumlaut -50
+KPX Agrave Umacron -50
+KPX Agrave Uogonek -50
+KPX Agrave Uring -50
+KPX Agrave V -80
+KPX Agrave W -60
+KPX Agrave Y -110
+KPX Agrave Yacute -110
+KPX Agrave Ydieresis -110
+KPX Agrave u -30
+KPX Agrave uacute -30
+KPX Agrave ucircumflex -30
+KPX Agrave udieresis -30
+KPX Agrave ugrave -30
+KPX Agrave uhungarumlaut -30
+KPX Agrave umacron -30
+KPX Agrave uogonek -30
+KPX Agrave uring -30
+KPX Agrave v -40
+KPX Agrave w -30
+KPX Agrave y -30
+KPX Agrave yacute -30
+KPX Agrave ydieresis -30
+KPX Amacron C -40
+KPX Amacron Cacute -40
+KPX Amacron Ccaron -40
+KPX Amacron Ccedilla -40
+KPX Amacron G -50
+KPX Amacron Gbreve -50
+KPX Amacron Gcommaaccent -50
+KPX Amacron O -40
+KPX Amacron Oacute -40
+KPX Amacron Ocircumflex -40
+KPX Amacron Odieresis -40
+KPX Amacron Ograve -40
+KPX Amacron Ohungarumlaut -40
+KPX Amacron Omacron -40
+KPX Amacron Oslash -40
+KPX Amacron Otilde -40
+KPX Amacron Q -40
+KPX Amacron T -90
+KPX Amacron Tcaron -90
+KPX Amacron Tcommaaccent -90
+KPX Amacron U -50
+KPX Amacron Uacute -50
+KPX Amacron Ucircumflex -50
+KPX Amacron Udieresis -50
+KPX Amacron Ugrave -50
+KPX Amacron Uhungarumlaut -50
+KPX Amacron Umacron -50
+KPX Amacron Uogonek -50
+KPX Amacron Uring -50
+KPX Amacron V -80
+KPX Amacron W -60
+KPX Amacron Y -110
+KPX Amacron Yacute -110
+KPX Amacron Ydieresis -110
+KPX Amacron u -30
+KPX Amacron uacute -30
+KPX Amacron ucircumflex -30
+KPX Amacron udieresis -30
+KPX Amacron ugrave -30
+KPX Amacron uhungarumlaut -30
+KPX Amacron umacron -30
+KPX Amacron uogonek -30
+KPX Amacron uring -30
+KPX Amacron v -40
+KPX Amacron w -30
+KPX Amacron y -30
+KPX Amacron yacute -30
+KPX Amacron ydieresis -30
+KPX Aogonek C -40
+KPX Aogonek Cacute -40
+KPX Aogonek Ccaron -40
+KPX Aogonek Ccedilla -40
+KPX Aogonek G -50
+KPX Aogonek Gbreve -50
+KPX Aogonek Gcommaaccent -50
+KPX Aogonek O -40
+KPX Aogonek Oacute -40
+KPX Aogonek Ocircumflex -40
+KPX Aogonek Odieresis -40
+KPX Aogonek Ograve -40
+KPX Aogonek Ohungarumlaut -40
+KPX Aogonek Omacron -40
+KPX Aogonek Oslash -40
+KPX Aogonek Otilde -40
+KPX Aogonek Q -40
+KPX Aogonek T -90
+KPX Aogonek Tcaron -90
+KPX Aogonek Tcommaaccent -90
+KPX Aogonek U -50
+KPX Aogonek Uacute -50
+KPX Aogonek Ucircumflex -50
+KPX Aogonek Udieresis -50
+KPX Aogonek Ugrave -50
+KPX Aogonek Uhungarumlaut -50
+KPX Aogonek Umacron -50
+KPX Aogonek Uogonek -50
+KPX Aogonek Uring -50
+KPX Aogonek V -80
+KPX Aogonek W -60
+KPX Aogonek Y -110
+KPX Aogonek Yacute -110
+KPX Aogonek Ydieresis -110
+KPX Aogonek u -30
+KPX Aogonek uacute -30
+KPX Aogonek ucircumflex -30
+KPX Aogonek udieresis -30
+KPX Aogonek ugrave -30
+KPX Aogonek uhungarumlaut -30
+KPX Aogonek umacron -30
+KPX Aogonek uogonek -30
+KPX Aogonek uring -30
+KPX Aogonek v -40
+KPX Aogonek w -30
+KPX Aogonek y -30
+KPX Aogonek yacute -30
+KPX Aogonek ydieresis -30
+KPX Aring C -40
+KPX Aring Cacute -40
+KPX Aring Ccaron -40
+KPX Aring Ccedilla -40
+KPX Aring G -50
+KPX Aring Gbreve -50
+KPX Aring Gcommaaccent -50
+KPX Aring O -40
+KPX Aring Oacute -40
+KPX Aring Ocircumflex -40
+KPX Aring Odieresis -40
+KPX Aring Ograve -40
+KPX Aring Ohungarumlaut -40
+KPX Aring Omacron -40
+KPX Aring Oslash -40
+KPX Aring Otilde -40
+KPX Aring Q -40
+KPX Aring T -90
+KPX Aring Tcaron -90
+KPX Aring Tcommaaccent -90
+KPX Aring U -50
+KPX Aring Uacute -50
+KPX Aring Ucircumflex -50
+KPX Aring Udieresis -50
+KPX Aring Ugrave -50
+KPX Aring Uhungarumlaut -50
+KPX Aring Umacron -50
+KPX Aring Uogonek -50
+KPX Aring Uring -50
+KPX Aring V -80
+KPX Aring W -60
+KPX Aring Y -110
+KPX Aring Yacute -110
+KPX Aring Ydieresis -110
+KPX Aring u -30
+KPX Aring uacute -30
+KPX Aring ucircumflex -30
+KPX Aring udieresis -30
+KPX Aring ugrave -30
+KPX Aring uhungarumlaut -30
+KPX Aring umacron -30
+KPX Aring uogonek -30
+KPX Aring uring -30
+KPX Aring v -40
+KPX Aring w -30
+KPX Aring y -30
+KPX Aring yacute -30
+KPX Aring ydieresis -30
+KPX Atilde C -40
+KPX Atilde Cacute -40
+KPX Atilde Ccaron -40
+KPX Atilde Ccedilla -40
+KPX Atilde G -50
+KPX Atilde Gbreve -50
+KPX Atilde Gcommaaccent -50
+KPX Atilde O -40
+KPX Atilde Oacute -40
+KPX Atilde Ocircumflex -40
+KPX Atilde Odieresis -40
+KPX Atilde Ograve -40
+KPX Atilde Ohungarumlaut -40
+KPX Atilde Omacron -40
+KPX Atilde Oslash -40
+KPX Atilde Otilde -40
+KPX Atilde Q -40
+KPX Atilde T -90
+KPX Atilde Tcaron -90
+KPX Atilde Tcommaaccent -90
+KPX Atilde U -50
+KPX Atilde Uacute -50
+KPX Atilde Ucircumflex -50
+KPX Atilde Udieresis -50
+KPX Atilde Ugrave -50
+KPX Atilde Uhungarumlaut -50
+KPX Atilde Umacron -50
+KPX Atilde Uogonek -50
+KPX Atilde Uring -50
+KPX Atilde V -80
+KPX Atilde W -60
+KPX Atilde Y -110
+KPX Atilde Yacute -110
+KPX Atilde Ydieresis -110
+KPX Atilde u -30
+KPX Atilde uacute -30
+KPX Atilde ucircumflex -30
+KPX Atilde udieresis -30
+KPX Atilde ugrave -30
+KPX Atilde uhungarumlaut -30
+KPX Atilde umacron -30
+KPX Atilde uogonek -30
+KPX Atilde uring -30
+KPX Atilde v -40
+KPX Atilde w -30
+KPX Atilde y -30
+KPX Atilde yacute -30
+KPX Atilde ydieresis -30
+KPX B A -30
+KPX B Aacute -30
+KPX B Abreve -30
+KPX B Acircumflex -30
+KPX B Adieresis -30
+KPX B Agrave -30
+KPX B Amacron -30
+KPX B Aogonek -30
+KPX B Aring -30
+KPX B Atilde -30
+KPX B U -10
+KPX B Uacute -10
+KPX B Ucircumflex -10
+KPX B Udieresis -10
+KPX B Ugrave -10
+KPX B Uhungarumlaut -10
+KPX B Umacron -10
+KPX B Uogonek -10
+KPX B Uring -10
+KPX D A -40
+KPX D Aacute -40
+KPX D Abreve -40
+KPX D Acircumflex -40
+KPX D Adieresis -40
+KPX D Agrave -40
+KPX D Amacron -40
+KPX D Aogonek -40
+KPX D Aring -40
+KPX D Atilde -40
+KPX D V -40
+KPX D W -40
+KPX D Y -70
+KPX D Yacute -70
+KPX D Ydieresis -70
+KPX D comma -30
+KPX D period -30
+KPX Dcaron A -40
+KPX Dcaron Aacute -40
+KPX Dcaron Abreve -40
+KPX Dcaron Acircumflex -40
+KPX Dcaron Adieresis -40
+KPX Dcaron Agrave -40
+KPX Dcaron Amacron -40
+KPX Dcaron Aogonek -40
+KPX Dcaron Aring -40
+KPX Dcaron Atilde -40
+KPX Dcaron V -40
+KPX Dcaron W -40
+KPX Dcaron Y -70
+KPX Dcaron Yacute -70
+KPX Dcaron Ydieresis -70
+KPX Dcaron comma -30
+KPX Dcaron period -30
+KPX Dcroat A -40
+KPX Dcroat Aacute -40
+KPX Dcroat Abreve -40
+KPX Dcroat Acircumflex -40
+KPX Dcroat Adieresis -40
+KPX Dcroat Agrave -40
+KPX Dcroat Amacron -40
+KPX Dcroat Aogonek -40
+KPX Dcroat Aring -40
+KPX Dcroat Atilde -40
+KPX Dcroat V -40
+KPX Dcroat W -40
+KPX Dcroat Y -70
+KPX Dcroat Yacute -70
+KPX Dcroat Ydieresis -70
+KPX Dcroat comma -30
+KPX Dcroat period -30
+KPX F A -80
+KPX F Aacute -80
+KPX F Abreve -80
+KPX F Acircumflex -80
+KPX F Adieresis -80
+KPX F Agrave -80
+KPX F Amacron -80
+KPX F Aogonek -80
+KPX F Aring -80
+KPX F Atilde -80
+KPX F a -20
+KPX F aacute -20
+KPX F abreve -20
+KPX F acircumflex -20
+KPX F adieresis -20
+KPX F agrave -20
+KPX F amacron -20
+KPX F aogonek -20
+KPX F aring -20
+KPX F atilde -20
+KPX F comma -100
+KPX F period -100
+KPX J A -20
+KPX J Aacute -20
+KPX J Abreve -20
+KPX J Acircumflex -20
+KPX J Adieresis -20
+KPX J Agrave -20
+KPX J Amacron -20
+KPX J Aogonek -20
+KPX J Aring -20
+KPX J Atilde -20
+KPX J comma -20
+KPX J period -20
+KPX J u -20
+KPX J uacute -20
+KPX J ucircumflex -20
+KPX J udieresis -20
+KPX J ugrave -20
+KPX J uhungarumlaut -20
+KPX J umacron -20
+KPX J uogonek -20
+KPX J uring -20
+KPX K O -30
+KPX K Oacute -30
+KPX K Ocircumflex -30
+KPX K Odieresis -30
+KPX K Ograve -30
+KPX K Ohungarumlaut -30
+KPX K Omacron -30
+KPX K Oslash -30
+KPX K Otilde -30
+KPX K e -15
+KPX K eacute -15
+KPX K ecaron -15
+KPX K ecircumflex -15
+KPX K edieresis -15
+KPX K edotaccent -15
+KPX K egrave -15
+KPX K emacron -15
+KPX K eogonek -15
+KPX K o -35
+KPX K oacute -35
+KPX K ocircumflex -35
+KPX K odieresis -35
+KPX K ograve -35
+KPX K ohungarumlaut -35
+KPX K omacron -35
+KPX K oslash -35
+KPX K otilde -35
+KPX K u -30
+KPX K uacute -30
+KPX K ucircumflex -30
+KPX K udieresis -30
+KPX K ugrave -30
+KPX K uhungarumlaut -30
+KPX K umacron -30
+KPX K uogonek -30
+KPX K uring -30
+KPX K y -40
+KPX K yacute -40
+KPX K ydieresis -40
+KPX Kcommaaccent O -30
+KPX Kcommaaccent Oacute -30
+KPX Kcommaaccent Ocircumflex -30
+KPX Kcommaaccent Odieresis -30
+KPX Kcommaaccent Ograve -30
+KPX Kcommaaccent Ohungarumlaut -30
+KPX Kcommaaccent Omacron -30
+KPX Kcommaaccent Oslash -30
+KPX Kcommaaccent Otilde -30
+KPX Kcommaaccent e -15
+KPX Kcommaaccent eacute -15
+KPX Kcommaaccent ecaron -15
+KPX Kcommaaccent ecircumflex -15
+KPX Kcommaaccent edieresis -15
+KPX Kcommaaccent edotaccent -15
+KPX Kcommaaccent egrave -15
+KPX Kcommaaccent emacron -15
+KPX Kcommaaccent eogonek -15
+KPX Kcommaaccent o -35
+KPX Kcommaaccent oacute -35
+KPX Kcommaaccent ocircumflex -35
+KPX Kcommaaccent odieresis -35
+KPX Kcommaaccent ograve -35
+KPX Kcommaaccent ohungarumlaut -35
+KPX Kcommaaccent omacron -35
+KPX Kcommaaccent oslash -35
+KPX Kcommaaccent otilde -35
+KPX Kcommaaccent u -30
+KPX Kcommaaccent uacute -30
+KPX Kcommaaccent ucircumflex -30
+KPX Kcommaaccent udieresis -30
+KPX Kcommaaccent ugrave -30
+KPX Kcommaaccent uhungarumlaut -30
+KPX Kcommaaccent umacron -30
+KPX Kcommaaccent uogonek -30
+KPX Kcommaaccent uring -30
+KPX Kcommaaccent y -40
+KPX Kcommaaccent yacute -40
+KPX Kcommaaccent ydieresis -40
+KPX L T -90
+KPX L Tcaron -90
+KPX L Tcommaaccent -90
+KPX L V -110
+KPX L W -80
+KPX L Y -120
+KPX L Yacute -120
+KPX L Ydieresis -120
+KPX L quotedblright -140
+KPX L quoteright -140
+KPX L y -30
+KPX L yacute -30
+KPX L ydieresis -30
+KPX Lacute T -90
+KPX Lacute Tcaron -90
+KPX Lacute Tcommaaccent -90
+KPX Lacute V -110
+KPX Lacute W -80
+KPX Lacute Y -120
+KPX Lacute Yacute -120
+KPX Lacute Ydieresis -120
+KPX Lacute quotedblright -140
+KPX Lacute quoteright -140
+KPX Lacute y -30
+KPX Lacute yacute -30
+KPX Lacute ydieresis -30
+KPX Lcommaaccent T -90
+KPX Lcommaaccent Tcaron -90
+KPX Lcommaaccent Tcommaaccent -90
+KPX Lcommaaccent V -110
+KPX Lcommaaccent W -80
+KPX Lcommaaccent Y -120
+KPX Lcommaaccent Yacute -120
+KPX Lcommaaccent Ydieresis -120
+KPX Lcommaaccent quotedblright -140
+KPX Lcommaaccent quoteright -140
+KPX Lcommaaccent y -30
+KPX Lcommaaccent yacute -30
+KPX Lcommaaccent ydieresis -30
+KPX Lslash T -90
+KPX Lslash Tcaron -90
+KPX Lslash Tcommaaccent -90
+KPX Lslash V -110
+KPX Lslash W -80
+KPX Lslash Y -120
+KPX Lslash Yacute -120
+KPX Lslash Ydieresis -120
+KPX Lslash quotedblright -140
+KPX Lslash quoteright -140
+KPX Lslash y -30
+KPX Lslash yacute -30
+KPX Lslash ydieresis -30
+KPX O A -50
+KPX O Aacute -50
+KPX O Abreve -50
+KPX O Acircumflex -50
+KPX O Adieresis -50
+KPX O Agrave -50
+KPX O Amacron -50
+KPX O Aogonek -50
+KPX O Aring -50
+KPX O Atilde -50
+KPX O T -40
+KPX O Tcaron -40
+KPX O Tcommaaccent -40
+KPX O V -50
+KPX O W -50
+KPX O X -50
+KPX O Y -70
+KPX O Yacute -70
+KPX O Ydieresis -70
+KPX O comma -40
+KPX O period -40
+KPX Oacute A -50
+KPX Oacute Aacute -50
+KPX Oacute Abreve -50
+KPX Oacute Acircumflex -50
+KPX Oacute Adieresis -50
+KPX Oacute Agrave -50
+KPX Oacute Amacron -50
+KPX Oacute Aogonek -50
+KPX Oacute Aring -50
+KPX Oacute Atilde -50
+KPX Oacute T -40
+KPX Oacute Tcaron -40
+KPX Oacute Tcommaaccent -40
+KPX Oacute V -50
+KPX Oacute W -50
+KPX Oacute X -50
+KPX Oacute Y -70
+KPX Oacute Yacute -70
+KPX Oacute Ydieresis -70
+KPX Oacute comma -40
+KPX Oacute period -40
+KPX Ocircumflex A -50
+KPX Ocircumflex Aacute -50
+KPX Ocircumflex Abreve -50
+KPX Ocircumflex Acircumflex -50
+KPX Ocircumflex Adieresis -50
+KPX Ocircumflex Agrave -50
+KPX Ocircumflex Amacron -50
+KPX Ocircumflex Aogonek -50
+KPX Ocircumflex Aring -50
+KPX Ocircumflex Atilde -50
+KPX Ocircumflex T -40
+KPX Ocircumflex Tcaron -40
+KPX Ocircumflex Tcommaaccent -40
+KPX Ocircumflex V -50
+KPX Ocircumflex W -50
+KPX Ocircumflex X -50
+KPX Ocircumflex Y -70
+KPX Ocircumflex Yacute -70
+KPX Ocircumflex Ydieresis -70
+KPX Ocircumflex comma -40
+KPX Ocircumflex period -40
+KPX Odieresis A -50
+KPX Odieresis Aacute -50
+KPX Odieresis Abreve -50
+KPX Odieresis Acircumflex -50
+KPX Odieresis Adieresis -50
+KPX Odieresis Agrave -50
+KPX Odieresis Amacron -50
+KPX Odieresis Aogonek -50
+KPX Odieresis Aring -50
+KPX Odieresis Atilde -50
+KPX Odieresis T -40
+KPX Odieresis Tcaron -40
+KPX Odieresis Tcommaaccent -40
+KPX Odieresis V -50
+KPX Odieresis W -50
+KPX Odieresis X -50
+KPX Odieresis Y -70
+KPX Odieresis Yacute -70
+KPX Odieresis Ydieresis -70
+KPX Odieresis comma -40
+KPX Odieresis period -40
+KPX Ograve A -50
+KPX Ograve Aacute -50
+KPX Ograve Abreve -50
+KPX Ograve Acircumflex -50
+KPX Ograve Adieresis -50
+KPX Ograve Agrave -50
+KPX Ograve Amacron -50
+KPX Ograve Aogonek -50
+KPX Ograve Aring -50
+KPX Ograve Atilde -50
+KPX Ograve T -40
+KPX Ograve Tcaron -40
+KPX Ograve Tcommaaccent -40
+KPX Ograve V -50
+KPX Ograve W -50
+KPX Ograve X -50
+KPX Ograve Y -70
+KPX Ograve Yacute -70
+KPX Ograve Ydieresis -70
+KPX Ograve comma -40
+KPX Ograve period -40
+KPX Ohungarumlaut A -50
+KPX Ohungarumlaut Aacute -50
+KPX Ohungarumlaut Abreve -50
+KPX Ohungarumlaut Acircumflex -50
+KPX Ohungarumlaut Adieresis -50
+KPX Ohungarumlaut Agrave -50
+KPX Ohungarumlaut Amacron -50
+KPX Ohungarumlaut Aogonek -50
+KPX Ohungarumlaut Aring -50
+KPX Ohungarumlaut Atilde -50
+KPX Ohungarumlaut T -40
+KPX Ohungarumlaut Tcaron -40
+KPX Ohungarumlaut Tcommaaccent -40
+KPX Ohungarumlaut V -50
+KPX Ohungarumlaut W -50
+KPX Ohungarumlaut X -50
+KPX Ohungarumlaut Y -70
+KPX Ohungarumlaut Yacute -70
+KPX Ohungarumlaut Ydieresis -70
+KPX Ohungarumlaut comma -40
+KPX Ohungarumlaut period -40
+KPX Omacron A -50
+KPX Omacron Aacute -50
+KPX Omacron Abreve -50
+KPX Omacron Acircumflex -50
+KPX Omacron Adieresis -50
+KPX Omacron Agrave -50
+KPX Omacron Amacron -50
+KPX Omacron Aogonek -50
+KPX Omacron Aring -50
+KPX Omacron Atilde -50
+KPX Omacron T -40
+KPX Omacron Tcaron -40
+KPX Omacron Tcommaaccent -40
+KPX Omacron V -50
+KPX Omacron W -50
+KPX Omacron X -50
+KPX Omacron Y -70
+KPX Omacron Yacute -70
+KPX Omacron Ydieresis -70
+KPX Omacron comma -40
+KPX Omacron period -40
+KPX Oslash A -50
+KPX Oslash Aacute -50
+KPX Oslash Abreve -50
+KPX Oslash Acircumflex -50
+KPX Oslash Adieresis -50
+KPX Oslash Agrave -50
+KPX Oslash Amacron -50
+KPX Oslash Aogonek -50
+KPX Oslash Aring -50
+KPX Oslash Atilde -50
+KPX Oslash T -40
+KPX Oslash Tcaron -40
+KPX Oslash Tcommaaccent -40
+KPX Oslash V -50
+KPX Oslash W -50
+KPX Oslash X -50
+KPX Oslash Y -70
+KPX Oslash Yacute -70
+KPX Oslash Ydieresis -70
+KPX Oslash comma -40
+KPX Oslash period -40
+KPX Otilde A -50
+KPX Otilde Aacute -50
+KPX Otilde Abreve -50
+KPX Otilde Acircumflex -50
+KPX Otilde Adieresis -50
+KPX Otilde Agrave -50
+KPX Otilde Amacron -50
+KPX Otilde Aogonek -50
+KPX Otilde Aring -50
+KPX Otilde Atilde -50
+KPX Otilde T -40
+KPX Otilde Tcaron -40
+KPX Otilde Tcommaaccent -40
+KPX Otilde V -50
+KPX Otilde W -50
+KPX Otilde X -50
+KPX Otilde Y -70
+KPX Otilde Yacute -70
+KPX Otilde Ydieresis -70
+KPX Otilde comma -40
+KPX Otilde period -40
+KPX P A -100
+KPX P Aacute -100
+KPX P Abreve -100
+KPX P Acircumflex -100
+KPX P Adieresis -100
+KPX P Agrave -100
+KPX P Amacron -100
+KPX P Aogonek -100
+KPX P Aring -100
+KPX P Atilde -100
+KPX P a -30
+KPX P aacute -30
+KPX P abreve -30
+KPX P acircumflex -30
+KPX P adieresis -30
+KPX P agrave -30
+KPX P amacron -30
+KPX P aogonek -30
+KPX P aring -30
+KPX P atilde -30
+KPX P comma -120
+KPX P e -30
+KPX P eacute -30
+KPX P ecaron -30
+KPX P ecircumflex -30
+KPX P edieresis -30
+KPX P edotaccent -30
+KPX P egrave -30
+KPX P emacron -30
+KPX P eogonek -30
+KPX P o -40
+KPX P oacute -40
+KPX P ocircumflex -40
+KPX P odieresis -40
+KPX P ograve -40
+KPX P ohungarumlaut -40
+KPX P omacron -40
+KPX P oslash -40
+KPX P otilde -40
+KPX P period -120
+KPX Q U -10
+KPX Q Uacute -10
+KPX Q Ucircumflex -10
+KPX Q Udieresis -10
+KPX Q Ugrave -10
+KPX Q Uhungarumlaut -10
+KPX Q Umacron -10
+KPX Q Uogonek -10
+KPX Q Uring -10
+KPX Q comma 20
+KPX Q period 20
+KPX R O -20
+KPX R Oacute -20
+KPX R Ocircumflex -20
+KPX R Odieresis -20
+KPX R Ograve -20
+KPX R Ohungarumlaut -20
+KPX R Omacron -20
+KPX R Oslash -20
+KPX R Otilde -20
+KPX R T -20
+KPX R Tcaron -20
+KPX R Tcommaaccent -20
+KPX R U -20
+KPX R Uacute -20
+KPX R Ucircumflex -20
+KPX R Udieresis -20
+KPX R Ugrave -20
+KPX R Uhungarumlaut -20
+KPX R Umacron -20
+KPX R Uogonek -20
+KPX R Uring -20
+KPX R V -50
+KPX R W -40
+KPX R Y -50
+KPX R Yacute -50
+KPX R Ydieresis -50
+KPX Racute O -20
+KPX Racute Oacute -20
+KPX Racute Ocircumflex -20
+KPX Racute Odieresis -20
+KPX Racute Ograve -20
+KPX Racute Ohungarumlaut -20
+KPX Racute Omacron -20
+KPX Racute Oslash -20
+KPX Racute Otilde -20
+KPX Racute T -20
+KPX Racute Tcaron -20
+KPX Racute Tcommaaccent -20
+KPX Racute U -20
+KPX Racute Uacute -20
+KPX Racute Ucircumflex -20
+KPX Racute Udieresis -20
+KPX Racute Ugrave -20
+KPX Racute Uhungarumlaut -20
+KPX Racute Umacron -20
+KPX Racute Uogonek -20
+KPX Racute Uring -20
+KPX Racute V -50
+KPX Racute W -40
+KPX Racute Y -50
+KPX Racute Yacute -50
+KPX Racute Ydieresis -50
+KPX Rcaron O -20
+KPX Rcaron Oacute -20
+KPX Rcaron Ocircumflex -20
+KPX Rcaron Odieresis -20
+KPX Rcaron Ograve -20
+KPX Rcaron Ohungarumlaut -20
+KPX Rcaron Omacron -20
+KPX Rcaron Oslash -20
+KPX Rcaron Otilde -20
+KPX Rcaron T -20
+KPX Rcaron Tcaron -20
+KPX Rcaron Tcommaaccent -20
+KPX Rcaron U -20
+KPX Rcaron Uacute -20
+KPX Rcaron Ucircumflex -20
+KPX Rcaron Udieresis -20
+KPX Rcaron Ugrave -20
+KPX Rcaron Uhungarumlaut -20
+KPX Rcaron Umacron -20
+KPX Rcaron Uogonek -20
+KPX Rcaron Uring -20
+KPX Rcaron V -50
+KPX Rcaron W -40
+KPX Rcaron Y -50
+KPX Rcaron Yacute -50
+KPX Rcaron Ydieresis -50
+KPX Rcommaaccent O -20
+KPX Rcommaaccent Oacute -20
+KPX Rcommaaccent Ocircumflex -20
+KPX Rcommaaccent Odieresis -20
+KPX Rcommaaccent Ograve -20
+KPX Rcommaaccent Ohungarumlaut -20
+KPX Rcommaaccent Omacron -20
+KPX Rcommaaccent Oslash -20
+KPX Rcommaaccent Otilde -20
+KPX Rcommaaccent T -20
+KPX Rcommaaccent Tcaron -20
+KPX Rcommaaccent Tcommaaccent -20
+KPX Rcommaaccent U -20
+KPX Rcommaaccent Uacute -20
+KPX Rcommaaccent Ucircumflex -20
+KPX Rcommaaccent Udieresis -20
+KPX Rcommaaccent Ugrave -20
+KPX Rcommaaccent Uhungarumlaut -20
+KPX Rcommaaccent Umacron -20
+KPX Rcommaaccent Uogonek -20
+KPX Rcommaaccent Uring -20
+KPX Rcommaaccent V -50
+KPX Rcommaaccent W -40
+KPX Rcommaaccent Y -50
+KPX Rcommaaccent Yacute -50
+KPX Rcommaaccent Ydieresis -50
+KPX T A -90
+KPX T Aacute -90
+KPX T Abreve -90
+KPX T Acircumflex -90
+KPX T Adieresis -90
+KPX T Agrave -90
+KPX T Amacron -90
+KPX T Aogonek -90
+KPX T Aring -90
+KPX T Atilde -90
+KPX T O -40
+KPX T Oacute -40
+KPX T Ocircumflex -40
+KPX T Odieresis -40
+KPX T Ograve -40
+KPX T Ohungarumlaut -40
+KPX T Omacron -40
+KPX T Oslash -40
+KPX T Otilde -40
+KPX T a -80
+KPX T aacute -80
+KPX T abreve -80
+KPX T acircumflex -80
+KPX T adieresis -80
+KPX T agrave -80
+KPX T amacron -80
+KPX T aogonek -80
+KPX T aring -80
+KPX T atilde -80
+KPX T colon -40
+KPX T comma -80
+KPX T e -60
+KPX T eacute -60
+KPX T ecaron -60
+KPX T ecircumflex -60
+KPX T edieresis -60
+KPX T edotaccent -60
+KPX T egrave -60
+KPX T emacron -60
+KPX T eogonek -60
+KPX T hyphen -120
+KPX T o -80
+KPX T oacute -80
+KPX T ocircumflex -80
+KPX T odieresis -80
+KPX T ograve -80
+KPX T ohungarumlaut -80
+KPX T omacron -80
+KPX T oslash -80
+KPX T otilde -80
+KPX T period -80
+KPX T r -80
+KPX T racute -80
+KPX T rcommaaccent -80
+KPX T semicolon -40
+KPX T u -90
+KPX T uacute -90
+KPX T ucircumflex -90
+KPX T udieresis -90
+KPX T ugrave -90
+KPX T uhungarumlaut -90
+KPX T umacron -90
+KPX T uogonek -90
+KPX T uring -90
+KPX T w -60
+KPX T y -60
+KPX T yacute -60
+KPX T ydieresis -60
+KPX Tcaron A -90
+KPX Tcaron Aacute -90
+KPX Tcaron Abreve -90
+KPX Tcaron Acircumflex -90
+KPX Tcaron Adieresis -90
+KPX Tcaron Agrave -90
+KPX Tcaron Amacron -90
+KPX Tcaron Aogonek -90
+KPX Tcaron Aring -90
+KPX Tcaron Atilde -90
+KPX Tcaron O -40
+KPX Tcaron Oacute -40
+KPX Tcaron Ocircumflex -40
+KPX Tcaron Odieresis -40
+KPX Tcaron Ograve -40
+KPX Tcaron Ohungarumlaut -40
+KPX Tcaron Omacron -40
+KPX Tcaron Oslash -40
+KPX Tcaron Otilde -40
+KPX Tcaron a -80
+KPX Tcaron aacute -80
+KPX Tcaron abreve -80
+KPX Tcaron acircumflex -80
+KPX Tcaron adieresis -80
+KPX Tcaron agrave -80
+KPX Tcaron amacron -80
+KPX Tcaron aogonek -80
+KPX Tcaron aring -80
+KPX Tcaron atilde -80
+KPX Tcaron colon -40
+KPX Tcaron comma -80
+KPX Tcaron e -60
+KPX Tcaron eacute -60
+KPX Tcaron ecaron -60
+KPX Tcaron ecircumflex -60
+KPX Tcaron edieresis -60
+KPX Tcaron edotaccent -60
+KPX Tcaron egrave -60
+KPX Tcaron emacron -60
+KPX Tcaron eogonek -60
+KPX Tcaron hyphen -120
+KPX Tcaron o -80
+KPX Tcaron oacute -80
+KPX Tcaron ocircumflex -80
+KPX Tcaron odieresis -80
+KPX Tcaron ograve -80
+KPX Tcaron ohungarumlaut -80
+KPX Tcaron omacron -80
+KPX Tcaron oslash -80
+KPX Tcaron otilde -80
+KPX Tcaron period -80
+KPX Tcaron r -80
+KPX Tcaron racute -80
+KPX Tcaron rcommaaccent -80
+KPX Tcaron semicolon -40
+KPX Tcaron u -90
+KPX Tcaron uacute -90
+KPX Tcaron ucircumflex -90
+KPX Tcaron udieresis -90
+KPX Tcaron ugrave -90
+KPX Tcaron uhungarumlaut -90
+KPX Tcaron umacron -90
+KPX Tcaron uogonek -90
+KPX Tcaron uring -90
+KPX Tcaron w -60
+KPX Tcaron y -60
+KPX Tcaron yacute -60
+KPX Tcaron ydieresis -60
+KPX Tcommaaccent A -90
+KPX Tcommaaccent Aacute -90
+KPX Tcommaaccent Abreve -90
+KPX Tcommaaccent Acircumflex -90
+KPX Tcommaaccent Adieresis -90
+KPX Tcommaaccent Agrave -90
+KPX Tcommaaccent Amacron -90
+KPX Tcommaaccent Aogonek -90
+KPX Tcommaaccent Aring -90
+KPX Tcommaaccent Atilde -90
+KPX Tcommaaccent O -40
+KPX Tcommaaccent Oacute -40
+KPX Tcommaaccent Ocircumflex -40
+KPX Tcommaaccent Odieresis -40
+KPX Tcommaaccent Ograve -40
+KPX Tcommaaccent Ohungarumlaut -40
+KPX Tcommaaccent Omacron -40
+KPX Tcommaaccent Oslash -40
+KPX Tcommaaccent Otilde -40
+KPX Tcommaaccent a -80
+KPX Tcommaaccent aacute -80
+KPX Tcommaaccent abreve -80
+KPX Tcommaaccent acircumflex -80
+KPX Tcommaaccent adieresis -80
+KPX Tcommaaccent agrave -80
+KPX Tcommaaccent amacron -80
+KPX Tcommaaccent aogonek -80
+KPX Tcommaaccent aring -80
+KPX Tcommaaccent atilde -80
+KPX Tcommaaccent colon -40
+KPX Tcommaaccent comma -80
+KPX Tcommaaccent e -60
+KPX Tcommaaccent eacute -60
+KPX Tcommaaccent ecaron -60
+KPX Tcommaaccent ecircumflex -60
+KPX Tcommaaccent edieresis -60
+KPX Tcommaaccent edotaccent -60
+KPX Tcommaaccent egrave -60
+KPX Tcommaaccent emacron -60
+KPX Tcommaaccent eogonek -60
+KPX Tcommaaccent hyphen -120
+KPX Tcommaaccent o -80
+KPX Tcommaaccent oacute -80
+KPX Tcommaaccent ocircumflex -80
+KPX Tcommaaccent odieresis -80
+KPX Tcommaaccent ograve -80
+KPX Tcommaaccent ohungarumlaut -80
+KPX Tcommaaccent omacron -80
+KPX Tcommaaccent oslash -80
+KPX Tcommaaccent otilde -80
+KPX Tcommaaccent period -80
+KPX Tcommaaccent r -80
+KPX Tcommaaccent racute -80
+KPX Tcommaaccent rcommaaccent -80
+KPX Tcommaaccent semicolon -40
+KPX Tcommaaccent u -90
+KPX Tcommaaccent uacute -90
+KPX Tcommaaccent ucircumflex -90
+KPX Tcommaaccent udieresis -90
+KPX Tcommaaccent ugrave -90
+KPX Tcommaaccent uhungarumlaut -90
+KPX Tcommaaccent umacron -90
+KPX Tcommaaccent uogonek -90
+KPX Tcommaaccent uring -90
+KPX Tcommaaccent w -60
+KPX Tcommaaccent y -60
+KPX Tcommaaccent yacute -60
+KPX Tcommaaccent ydieresis -60
+KPX U A -50
+KPX U Aacute -50
+KPX U Abreve -50
+KPX U Acircumflex -50
+KPX U Adieresis -50
+KPX U Agrave -50
+KPX U Amacron -50
+KPX U Aogonek -50
+KPX U Aring -50
+KPX U Atilde -50
+KPX U comma -30
+KPX U period -30
+KPX Uacute A -50
+KPX Uacute Aacute -50
+KPX Uacute Abreve -50
+KPX Uacute Acircumflex -50
+KPX Uacute Adieresis -50
+KPX Uacute Agrave -50
+KPX Uacute Amacron -50
+KPX Uacute Aogonek -50
+KPX Uacute Aring -50
+KPX Uacute Atilde -50
+KPX Uacute comma -30
+KPX Uacute period -30
+KPX Ucircumflex A -50
+KPX Ucircumflex Aacute -50
+KPX Ucircumflex Abreve -50
+KPX Ucircumflex Acircumflex -50
+KPX Ucircumflex Adieresis -50
+KPX Ucircumflex Agrave -50
+KPX Ucircumflex Amacron -50
+KPX Ucircumflex Aogonek -50
+KPX Ucircumflex Aring -50
+KPX Ucircumflex Atilde -50
+KPX Ucircumflex comma -30
+KPX Ucircumflex period -30
+KPX Udieresis A -50
+KPX Udieresis Aacute -50
+KPX Udieresis Abreve -50
+KPX Udieresis Acircumflex -50
+KPX Udieresis Adieresis -50
+KPX Udieresis Agrave -50
+KPX Udieresis Amacron -50
+KPX Udieresis Aogonek -50
+KPX Udieresis Aring -50
+KPX Udieresis Atilde -50
+KPX Udieresis comma -30
+KPX Udieresis period -30
+KPX Ugrave A -50
+KPX Ugrave Aacute -50
+KPX Ugrave Abreve -50
+KPX Ugrave Acircumflex -50
+KPX Ugrave Adieresis -50
+KPX Ugrave Agrave -50
+KPX Ugrave Amacron -50
+KPX Ugrave Aogonek -50
+KPX Ugrave Aring -50
+KPX Ugrave Atilde -50
+KPX Ugrave comma -30
+KPX Ugrave period -30
+KPX Uhungarumlaut A -50
+KPX Uhungarumlaut Aacute -50
+KPX Uhungarumlaut Abreve -50
+KPX Uhungarumlaut Acircumflex -50
+KPX Uhungarumlaut Adieresis -50
+KPX Uhungarumlaut Agrave -50
+KPX Uhungarumlaut Amacron -50
+KPX Uhungarumlaut Aogonek -50
+KPX Uhungarumlaut Aring -50
+KPX Uhungarumlaut Atilde -50
+KPX Uhungarumlaut comma -30
+KPX Uhungarumlaut period -30
+KPX Umacron A -50
+KPX Umacron Aacute -50
+KPX Umacron Abreve -50
+KPX Umacron Acircumflex -50
+KPX Umacron Adieresis -50
+KPX Umacron Agrave -50
+KPX Umacron Amacron -50
+KPX Umacron Aogonek -50
+KPX Umacron Aring -50
+KPX Umacron Atilde -50
+KPX Umacron comma -30
+KPX Umacron period -30
+KPX Uogonek A -50
+KPX Uogonek Aacute -50
+KPX Uogonek Abreve -50
+KPX Uogonek Acircumflex -50
+KPX Uogonek Adieresis -50
+KPX Uogonek Agrave -50
+KPX Uogonek Amacron -50
+KPX Uogonek Aogonek -50
+KPX Uogonek Aring -50
+KPX Uogonek Atilde -50
+KPX Uogonek comma -30
+KPX Uogonek period -30
+KPX Uring A -50
+KPX Uring Aacute -50
+KPX Uring Abreve -50
+KPX Uring Acircumflex -50
+KPX Uring Adieresis -50
+KPX Uring Agrave -50
+KPX Uring Amacron -50
+KPX Uring Aogonek -50
+KPX Uring Aring -50
+KPX Uring Atilde -50
+KPX Uring comma -30
+KPX Uring period -30
+KPX V A -80
+KPX V Aacute -80
+KPX V Abreve -80
+KPX V Acircumflex -80
+KPX V Adieresis -80
+KPX V Agrave -80
+KPX V Amacron -80
+KPX V Aogonek -80
+KPX V Aring -80
+KPX V Atilde -80
+KPX V G -50
+KPX V Gbreve -50
+KPX V Gcommaaccent -50
+KPX V O -50
+KPX V Oacute -50
+KPX V Ocircumflex -50
+KPX V Odieresis -50
+KPX V Ograve -50
+KPX V Ohungarumlaut -50
+KPX V Omacron -50
+KPX V Oslash -50
+KPX V Otilde -50
+KPX V a -60
+KPX V aacute -60
+KPX V abreve -60
+KPX V acircumflex -60
+KPX V adieresis -60
+KPX V agrave -60
+KPX V amacron -60
+KPX V aogonek -60
+KPX V aring -60
+KPX V atilde -60
+KPX V colon -40
+KPX V comma -120
+KPX V e -50
+KPX V eacute -50
+KPX V ecaron -50
+KPX V ecircumflex -50
+KPX V edieresis -50
+KPX V edotaccent -50
+KPX V egrave -50
+KPX V emacron -50
+KPX V eogonek -50
+KPX V hyphen -80
+KPX V o -90
+KPX V oacute -90
+KPX V ocircumflex -90
+KPX V odieresis -90
+KPX V ograve -90
+KPX V ohungarumlaut -90
+KPX V omacron -90
+KPX V oslash -90
+KPX V otilde -90
+KPX V period -120
+KPX V semicolon -40
+KPX V u -60
+KPX V uacute -60
+KPX V ucircumflex -60
+KPX V udieresis -60
+KPX V ugrave -60
+KPX V uhungarumlaut -60
+KPX V umacron -60
+KPX V uogonek -60
+KPX V uring -60
+KPX W A -60
+KPX W Aacute -60
+KPX W Abreve -60
+KPX W Acircumflex -60
+KPX W Adieresis -60
+KPX W Agrave -60
+KPX W Amacron -60
+KPX W Aogonek -60
+KPX W Aring -60
+KPX W Atilde -60
+KPX W O -20
+KPX W Oacute -20
+KPX W Ocircumflex -20
+KPX W Odieresis -20
+KPX W Ograve -20
+KPX W Ohungarumlaut -20
+KPX W Omacron -20
+KPX W Oslash -20
+KPX W Otilde -20
+KPX W a -40
+KPX W aacute -40
+KPX W abreve -40
+KPX W acircumflex -40
+KPX W adieresis -40
+KPX W agrave -40
+KPX W amacron -40
+KPX W aogonek -40
+KPX W aring -40
+KPX W atilde -40
+KPX W colon -10
+KPX W comma -80
+KPX W e -35
+KPX W eacute -35
+KPX W ecaron -35
+KPX W ecircumflex -35
+KPX W edieresis -35
+KPX W edotaccent -35
+KPX W egrave -35
+KPX W emacron -35
+KPX W eogonek -35
+KPX W hyphen -40
+KPX W o -60
+KPX W oacute -60
+KPX W ocircumflex -60
+KPX W odieresis -60
+KPX W ograve -60
+KPX W ohungarumlaut -60
+KPX W omacron -60
+KPX W oslash -60
+KPX W otilde -60
+KPX W period -80
+KPX W semicolon -10
+KPX W u -45
+KPX W uacute -45
+KPX W ucircumflex -45
+KPX W udieresis -45
+KPX W ugrave -45
+KPX W uhungarumlaut -45
+KPX W umacron -45
+KPX W uogonek -45
+KPX W uring -45
+KPX W y -20
+KPX W yacute -20
+KPX W ydieresis -20
+KPX Y A -110
+KPX Y Aacute -110
+KPX Y Abreve -110
+KPX Y Acircumflex -110
+KPX Y Adieresis -110
+KPX Y Agrave -110
+KPX Y Amacron -110
+KPX Y Aogonek -110
+KPX Y Aring -110
+KPX Y Atilde -110
+KPX Y O -70
+KPX Y Oacute -70
+KPX Y Ocircumflex -70
+KPX Y Odieresis -70
+KPX Y Ograve -70
+KPX Y Ohungarumlaut -70
+KPX Y Omacron -70
+KPX Y Oslash -70
+KPX Y Otilde -70
+KPX Y a -90
+KPX Y aacute -90
+KPX Y abreve -90
+KPX Y acircumflex -90
+KPX Y adieresis -90
+KPX Y agrave -90
+KPX Y amacron -90
+KPX Y aogonek -90
+KPX Y aring -90
+KPX Y atilde -90
+KPX Y colon -50
+KPX Y comma -100
+KPX Y e -80
+KPX Y eacute -80
+KPX Y ecaron -80
+KPX Y ecircumflex -80
+KPX Y edieresis -80
+KPX Y edotaccent -80
+KPX Y egrave -80
+KPX Y emacron -80
+KPX Y eogonek -80
+KPX Y o -100
+KPX Y oacute -100
+KPX Y ocircumflex -100
+KPX Y odieresis -100
+KPX Y ograve -100
+KPX Y ohungarumlaut -100
+KPX Y omacron -100
+KPX Y oslash -100
+KPX Y otilde -100
+KPX Y period -100
+KPX Y semicolon -50
+KPX Y u -100
+KPX Y uacute -100
+KPX Y ucircumflex -100
+KPX Y udieresis -100
+KPX Y ugrave -100
+KPX Y uhungarumlaut -100
+KPX Y umacron -100
+KPX Y uogonek -100
+KPX Y uring -100
+KPX Yacute A -110
+KPX Yacute Aacute -110
+KPX Yacute Abreve -110
+KPX Yacute Acircumflex -110
+KPX Yacute Adieresis -110
+KPX Yacute Agrave -110
+KPX Yacute Amacron -110
+KPX Yacute Aogonek -110
+KPX Yacute Aring -110
+KPX Yacute Atilde -110
+KPX Yacute O -70
+KPX Yacute Oacute -70
+KPX Yacute Ocircumflex -70
+KPX Yacute Odieresis -70
+KPX Yacute Ograve -70
+KPX Yacute Ohungarumlaut -70
+KPX Yacute Omacron -70
+KPX Yacute Oslash -70
+KPX Yacute Otilde -70
+KPX Yacute a -90
+KPX Yacute aacute -90
+KPX Yacute abreve -90
+KPX Yacute acircumflex -90
+KPX Yacute adieresis -90
+KPX Yacute agrave -90
+KPX Yacute amacron -90
+KPX Yacute aogonek -90
+KPX Yacute aring -90
+KPX Yacute atilde -90
+KPX Yacute colon -50
+KPX Yacute comma -100
+KPX Yacute e -80
+KPX Yacute eacute -80
+KPX Yacute ecaron -80
+KPX Yacute ecircumflex -80
+KPX Yacute edieresis -80
+KPX Yacute edotaccent -80
+KPX Yacute egrave -80
+KPX Yacute emacron -80
+KPX Yacute eogonek -80
+KPX Yacute o -100
+KPX Yacute oacute -100
+KPX Yacute ocircumflex -100
+KPX Yacute odieresis -100
+KPX Yacute ograve -100
+KPX Yacute ohungarumlaut -100
+KPX Yacute omacron -100
+KPX Yacute oslash -100
+KPX Yacute otilde -100
+KPX Yacute period -100
+KPX Yacute semicolon -50
+KPX Yacute u -100
+KPX Yacute uacute -100
+KPX Yacute ucircumflex -100
+KPX Yacute udieresis -100
+KPX Yacute ugrave -100
+KPX Yacute uhungarumlaut -100
+KPX Yacute umacron -100
+KPX Yacute uogonek -100
+KPX Yacute uring -100
+KPX Ydieresis A -110
+KPX Ydieresis Aacute -110
+KPX Ydieresis Abreve -110
+KPX Ydieresis Acircumflex -110
+KPX Ydieresis Adieresis -110
+KPX Ydieresis Agrave -110
+KPX Ydieresis Amacron -110
+KPX Ydieresis Aogonek -110
+KPX Ydieresis Aring -110
+KPX Ydieresis Atilde -110
+KPX Ydieresis O -70
+KPX Ydieresis Oacute -70
+KPX Ydieresis Ocircumflex -70
+KPX Ydieresis Odieresis -70
+KPX Ydieresis Ograve -70
+KPX Ydieresis Ohungarumlaut -70
+KPX Ydieresis Omacron -70
+KPX Ydieresis Oslash -70
+KPX Ydieresis Otilde -70
+KPX Ydieresis a -90
+KPX Ydieresis aacute -90
+KPX Ydieresis abreve -90
+KPX Ydieresis acircumflex -90
+KPX Ydieresis adieresis -90
+KPX Ydieresis agrave -90
+KPX Ydieresis amacron -90
+KPX Ydieresis aogonek -90
+KPX Ydieresis aring -90
+KPX Ydieresis atilde -90
+KPX Ydieresis colon -50
+KPX Ydieresis comma -100
+KPX Ydieresis e -80
+KPX Ydieresis eacute -80
+KPX Ydieresis ecaron -80
+KPX Ydieresis ecircumflex -80
+KPX Ydieresis edieresis -80
+KPX Ydieresis edotaccent -80
+KPX Ydieresis egrave -80
+KPX Ydieresis emacron -80
+KPX Ydieresis eogonek -80
+KPX Ydieresis o -100
+KPX Ydieresis oacute -100
+KPX Ydieresis ocircumflex -100
+KPX Ydieresis odieresis -100
+KPX Ydieresis ograve -100
+KPX Ydieresis ohungarumlaut -100
+KPX Ydieresis omacron -100
+KPX Ydieresis oslash -100
+KPX Ydieresis otilde -100
+KPX Ydieresis period -100
+KPX Ydieresis semicolon -50
+KPX Ydieresis u -100
+KPX Ydieresis uacute -100
+KPX Ydieresis ucircumflex -100
+KPX Ydieresis udieresis -100
+KPX Ydieresis ugrave -100
+KPX Ydieresis uhungarumlaut -100
+KPX Ydieresis umacron -100
+KPX Ydieresis uogonek -100
+KPX Ydieresis uring -100
+KPX a g -10
+KPX a gbreve -10
+KPX a gcommaaccent -10
+KPX a v -15
+KPX a w -15
+KPX a y -20
+KPX a yacute -20
+KPX a ydieresis -20
+KPX aacute g -10
+KPX aacute gbreve -10
+KPX aacute gcommaaccent -10
+KPX aacute v -15
+KPX aacute w -15
+KPX aacute y -20
+KPX aacute yacute -20
+KPX aacute ydieresis -20
+KPX abreve g -10
+KPX abreve gbreve -10
+KPX abreve gcommaaccent -10
+KPX abreve v -15
+KPX abreve w -15
+KPX abreve y -20
+KPX abreve yacute -20
+KPX abreve ydieresis -20
+KPX acircumflex g -10
+KPX acircumflex gbreve -10
+KPX acircumflex gcommaaccent -10
+KPX acircumflex v -15
+KPX acircumflex w -15
+KPX acircumflex y -20
+KPX acircumflex yacute -20
+KPX acircumflex ydieresis -20
+KPX adieresis g -10
+KPX adieresis gbreve -10
+KPX adieresis gcommaaccent -10
+KPX adieresis v -15
+KPX adieresis w -15
+KPX adieresis y -20
+KPX adieresis yacute -20
+KPX adieresis ydieresis -20
+KPX agrave g -10
+KPX agrave gbreve -10
+KPX agrave gcommaaccent -10
+KPX agrave v -15
+KPX agrave w -15
+KPX agrave y -20
+KPX agrave yacute -20
+KPX agrave ydieresis -20
+KPX amacron g -10
+KPX amacron gbreve -10
+KPX amacron gcommaaccent -10
+KPX amacron v -15
+KPX amacron w -15
+KPX amacron y -20
+KPX amacron yacute -20
+KPX amacron ydieresis -20
+KPX aogonek g -10
+KPX aogonek gbreve -10
+KPX aogonek gcommaaccent -10
+KPX aogonek v -15
+KPX aogonek w -15
+KPX aogonek y -20
+KPX aogonek yacute -20
+KPX aogonek ydieresis -20
+KPX aring g -10
+KPX aring gbreve -10
+KPX aring gcommaaccent -10
+KPX aring v -15
+KPX aring w -15
+KPX aring y -20
+KPX aring yacute -20
+KPX aring ydieresis -20
+KPX atilde g -10
+KPX atilde gbreve -10
+KPX atilde gcommaaccent -10
+KPX atilde v -15
+KPX atilde w -15
+KPX atilde y -20
+KPX atilde yacute -20
+KPX atilde ydieresis -20
+KPX b l -10
+KPX b lacute -10
+KPX b lcommaaccent -10
+KPX b lslash -10
+KPX b u -20
+KPX b uacute -20
+KPX b ucircumflex -20
+KPX b udieresis -20
+KPX b ugrave -20
+KPX b uhungarumlaut -20
+KPX b umacron -20
+KPX b uogonek -20
+KPX b uring -20
+KPX b v -20
+KPX b y -20
+KPX b yacute -20
+KPX b ydieresis -20
+KPX c h -10
+KPX c k -20
+KPX c kcommaaccent -20
+KPX c l -20
+KPX c lacute -20
+KPX c lcommaaccent -20
+KPX c lslash -20
+KPX c y -10
+KPX c yacute -10
+KPX c ydieresis -10
+KPX cacute h -10
+KPX cacute k -20
+KPX cacute kcommaaccent -20
+KPX cacute l -20
+KPX cacute lacute -20
+KPX cacute lcommaaccent -20
+KPX cacute lslash -20
+KPX cacute y -10
+KPX cacute yacute -10
+KPX cacute ydieresis -10
+KPX ccaron h -10
+KPX ccaron k -20
+KPX ccaron kcommaaccent -20
+KPX ccaron l -20
+KPX ccaron lacute -20
+KPX ccaron lcommaaccent -20
+KPX ccaron lslash -20
+KPX ccaron y -10
+KPX ccaron yacute -10
+KPX ccaron ydieresis -10
+KPX ccedilla h -10
+KPX ccedilla k -20
+KPX ccedilla kcommaaccent -20
+KPX ccedilla l -20
+KPX ccedilla lacute -20
+KPX ccedilla lcommaaccent -20
+KPX ccedilla lslash -20
+KPX ccedilla y -10
+KPX ccedilla yacute -10
+KPX ccedilla ydieresis -10
+KPX colon space -40
+KPX comma quotedblright -120
+KPX comma quoteright -120
+KPX comma space -40
+KPX d d -10
+KPX d dcroat -10
+KPX d v -15
+KPX d w -15
+KPX d y -15
+KPX d yacute -15
+KPX d ydieresis -15
+KPX dcroat d -10
+KPX dcroat dcroat -10
+KPX dcroat v -15
+KPX dcroat w -15
+KPX dcroat y -15
+KPX dcroat yacute -15
+KPX dcroat ydieresis -15
+KPX e comma 10
+KPX e period 20
+KPX e v -15
+KPX e w -15
+KPX e x -15
+KPX e y -15
+KPX e yacute -15
+KPX e ydieresis -15
+KPX eacute comma 10
+KPX eacute period 20
+KPX eacute v -15
+KPX eacute w -15
+KPX eacute x -15
+KPX eacute y -15
+KPX eacute yacute -15
+KPX eacute ydieresis -15
+KPX ecaron comma 10
+KPX ecaron period 20
+KPX ecaron v -15
+KPX ecaron w -15
+KPX ecaron x -15
+KPX ecaron y -15
+KPX ecaron yacute -15
+KPX ecaron ydieresis -15
+KPX ecircumflex comma 10
+KPX ecircumflex period 20
+KPX ecircumflex v -15
+KPX ecircumflex w -15
+KPX ecircumflex x -15
+KPX ecircumflex y -15
+KPX ecircumflex yacute -15
+KPX ecircumflex ydieresis -15
+KPX edieresis comma 10
+KPX edieresis period 20
+KPX edieresis v -15
+KPX edieresis w -15
+KPX edieresis x -15
+KPX edieresis y -15
+KPX edieresis yacute -15
+KPX edieresis ydieresis -15
+KPX edotaccent comma 10
+KPX edotaccent period 20
+KPX edotaccent v -15
+KPX edotaccent w -15
+KPX edotaccent x -15
+KPX edotaccent y -15
+KPX edotaccent yacute -15
+KPX edotaccent ydieresis -15
+KPX egrave comma 10
+KPX egrave period 20
+KPX egrave v -15
+KPX egrave w -15
+KPX egrave x -15
+KPX egrave y -15
+KPX egrave yacute -15
+KPX egrave ydieresis -15
+KPX emacron comma 10
+KPX emacron period 20
+KPX emacron v -15
+KPX emacron w -15
+KPX emacron x -15
+KPX emacron y -15
+KPX emacron yacute -15
+KPX emacron ydieresis -15
+KPX eogonek comma 10
+KPX eogonek period 20
+KPX eogonek v -15
+KPX eogonek w -15
+KPX eogonek x -15
+KPX eogonek y -15
+KPX eogonek yacute -15
+KPX eogonek ydieresis -15
+KPX f comma -10
+KPX f e -10
+KPX f eacute -10
+KPX f ecaron -10
+KPX f ecircumflex -10
+KPX f edieresis -10
+KPX f edotaccent -10
+KPX f egrave -10
+KPX f emacron -10
+KPX f eogonek -10
+KPX f o -20
+KPX f oacute -20
+KPX f ocircumflex -20
+KPX f odieresis -20
+KPX f ograve -20
+KPX f ohungarumlaut -20
+KPX f omacron -20
+KPX f oslash -20
+KPX f otilde -20
+KPX f period -10
+KPX f quotedblright 30
+KPX f quoteright 30
+KPX g e 10
+KPX g eacute 10
+KPX g ecaron 10
+KPX g ecircumflex 10
+KPX g edieresis 10
+KPX g edotaccent 10
+KPX g egrave 10
+KPX g emacron 10
+KPX g eogonek 10
+KPX g g -10
+KPX g gbreve -10
+KPX g gcommaaccent -10
+KPX gbreve e 10
+KPX gbreve eacute 10
+KPX gbreve ecaron 10
+KPX gbreve ecircumflex 10
+KPX gbreve edieresis 10
+KPX gbreve edotaccent 10
+KPX gbreve egrave 10
+KPX gbreve emacron 10
+KPX gbreve eogonek 10
+KPX gbreve g -10
+KPX gbreve gbreve -10
+KPX gbreve gcommaaccent -10
+KPX gcommaaccent e 10
+KPX gcommaaccent eacute 10
+KPX gcommaaccent ecaron 10
+KPX gcommaaccent ecircumflex 10
+KPX gcommaaccent edieresis 10
+KPX gcommaaccent edotaccent 10
+KPX gcommaaccent egrave 10
+KPX gcommaaccent emacron 10
+KPX gcommaaccent eogonek 10
+KPX gcommaaccent g -10
+KPX gcommaaccent gbreve -10
+KPX gcommaaccent gcommaaccent -10
+KPX h y -20
+KPX h yacute -20
+KPX h ydieresis -20
+KPX k o -15
+KPX k oacute -15
+KPX k ocircumflex -15
+KPX k odieresis -15
+KPX k ograve -15
+KPX k ohungarumlaut -15
+KPX k omacron -15
+KPX k oslash -15
+KPX k otilde -15
+KPX kcommaaccent o -15
+KPX kcommaaccent oacute -15
+KPX kcommaaccent ocircumflex -15
+KPX kcommaaccent odieresis -15
+KPX kcommaaccent ograve -15
+KPX kcommaaccent ohungarumlaut -15
+KPX kcommaaccent omacron -15
+KPX kcommaaccent oslash -15
+KPX kcommaaccent otilde -15
+KPX l w -15
+KPX l y -15
+KPX l yacute -15
+KPX l ydieresis -15
+KPX lacute w -15
+KPX lacute y -15
+KPX lacute yacute -15
+KPX lacute ydieresis -15
+KPX lcommaaccent w -15
+KPX lcommaaccent y -15
+KPX lcommaaccent yacute -15
+KPX lcommaaccent ydieresis -15
+KPX lslash w -15
+KPX lslash y -15
+KPX lslash yacute -15
+KPX lslash ydieresis -15
+KPX m u -20
+KPX m uacute -20
+KPX m ucircumflex -20
+KPX m udieresis -20
+KPX m ugrave -20
+KPX m uhungarumlaut -20
+KPX m umacron -20
+KPX m uogonek -20
+KPX m uring -20
+KPX m y -30
+KPX m yacute -30
+KPX m ydieresis -30
+KPX n u -10
+KPX n uacute -10
+KPX n ucircumflex -10
+KPX n udieresis -10
+KPX n ugrave -10
+KPX n uhungarumlaut -10
+KPX n umacron -10
+KPX n uogonek -10
+KPX n uring -10
+KPX n v -40
+KPX n y -20
+KPX n yacute -20
+KPX n ydieresis -20
+KPX nacute u -10
+KPX nacute uacute -10
+KPX nacute ucircumflex -10
+KPX nacute udieresis -10
+KPX nacute ugrave -10
+KPX nacute uhungarumlaut -10
+KPX nacute umacron -10
+KPX nacute uogonek -10
+KPX nacute uring -10
+KPX nacute v -40
+KPX nacute y -20
+KPX nacute yacute -20
+KPX nacute ydieresis -20
+KPX ncaron u -10
+KPX ncaron uacute -10
+KPX ncaron ucircumflex -10
+KPX ncaron udieresis -10
+KPX ncaron ugrave -10
+KPX ncaron uhungarumlaut -10
+KPX ncaron umacron -10
+KPX ncaron uogonek -10
+KPX ncaron uring -10
+KPX ncaron v -40
+KPX ncaron y -20
+KPX ncaron yacute -20
+KPX ncaron ydieresis -20
+KPX ncommaaccent u -10
+KPX ncommaaccent uacute -10
+KPX ncommaaccent ucircumflex -10
+KPX ncommaaccent udieresis -10
+KPX ncommaaccent ugrave -10
+KPX ncommaaccent uhungarumlaut -10
+KPX ncommaaccent umacron -10
+KPX ncommaaccent uogonek -10
+KPX ncommaaccent uring -10
+KPX ncommaaccent v -40
+KPX ncommaaccent y -20
+KPX ncommaaccent yacute -20
+KPX ncommaaccent ydieresis -20
+KPX ntilde u -10
+KPX ntilde uacute -10
+KPX ntilde ucircumflex -10
+KPX ntilde udieresis -10
+KPX ntilde ugrave -10
+KPX ntilde uhungarumlaut -10
+KPX ntilde umacron -10
+KPX ntilde uogonek -10
+KPX ntilde uring -10
+KPX ntilde v -40
+KPX ntilde y -20
+KPX ntilde yacute -20
+KPX ntilde ydieresis -20
+KPX o v -20
+KPX o w -15
+KPX o x -30
+KPX o y -20
+KPX o yacute -20
+KPX o ydieresis -20
+KPX oacute v -20
+KPX oacute w -15
+KPX oacute x -30
+KPX oacute y -20
+KPX oacute yacute -20
+KPX oacute ydieresis -20
+KPX ocircumflex v -20
+KPX ocircumflex w -15
+KPX ocircumflex x -30
+KPX ocircumflex y -20
+KPX ocircumflex yacute -20
+KPX ocircumflex ydieresis -20
+KPX odieresis v -20
+KPX odieresis w -15
+KPX odieresis x -30
+KPX odieresis y -20
+KPX odieresis yacute -20
+KPX odieresis ydieresis -20
+KPX ograve v -20
+KPX ograve w -15
+KPX ograve x -30
+KPX ograve y -20
+KPX ograve yacute -20
+KPX ograve ydieresis -20
+KPX ohungarumlaut v -20
+KPX ohungarumlaut w -15
+KPX ohungarumlaut x -30
+KPX ohungarumlaut y -20
+KPX ohungarumlaut yacute -20
+KPX ohungarumlaut ydieresis -20
+KPX omacron v -20
+KPX omacron w -15
+KPX omacron x -30
+KPX omacron y -20
+KPX omacron yacute -20
+KPX omacron ydieresis -20
+KPX oslash v -20
+KPX oslash w -15
+KPX oslash x -30
+KPX oslash y -20
+KPX oslash yacute -20
+KPX oslash ydieresis -20
+KPX otilde v -20
+KPX otilde w -15
+KPX otilde x -30
+KPX otilde y -20
+KPX otilde yacute -20
+KPX otilde ydieresis -20
+KPX p y -15
+KPX p yacute -15
+KPX p ydieresis -15
+KPX period quotedblright -120
+KPX period quoteright -120
+KPX period space -40
+KPX quotedblright space -80
+KPX quoteleft quoteleft -46
+KPX quoteright d -80
+KPX quoteright dcroat -80
+KPX quoteright l -20
+KPX quoteright lacute -20
+KPX quoteright lcommaaccent -20
+KPX quoteright lslash -20
+KPX quoteright quoteright -46
+KPX quoteright r -40
+KPX quoteright racute -40
+KPX quoteright rcaron -40
+KPX quoteright rcommaaccent -40
+KPX quoteright s -60
+KPX quoteright sacute -60
+KPX quoteright scaron -60
+KPX quoteright scedilla -60
+KPX quoteright scommaaccent -60
+KPX quoteright space -80
+KPX quoteright v -20
+KPX r c -20
+KPX r cacute -20
+KPX r ccaron -20
+KPX r ccedilla -20
+KPX r comma -60
+KPX r d -20
+KPX r dcroat -20
+KPX r g -15
+KPX r gbreve -15
+KPX r gcommaaccent -15
+KPX r hyphen -20
+KPX r o -20
+KPX r oacute -20
+KPX r ocircumflex -20
+KPX r odieresis -20
+KPX r ograve -20
+KPX r ohungarumlaut -20
+KPX r omacron -20
+KPX r oslash -20
+KPX r otilde -20
+KPX r period -60
+KPX r q -20
+KPX r s -15
+KPX r sacute -15
+KPX r scaron -15
+KPX r scedilla -15
+KPX r scommaaccent -15
+KPX r t 20
+KPX r tcommaaccent 20
+KPX r v 10
+KPX r y 10
+KPX r yacute 10
+KPX r ydieresis 10
+KPX racute c -20
+KPX racute cacute -20
+KPX racute ccaron -20
+KPX racute ccedilla -20
+KPX racute comma -60
+KPX racute d -20
+KPX racute dcroat -20
+KPX racute g -15
+KPX racute gbreve -15
+KPX racute gcommaaccent -15
+KPX racute hyphen -20
+KPX racute o -20
+KPX racute oacute -20
+KPX racute ocircumflex -20
+KPX racute odieresis -20
+KPX racute ograve -20
+KPX racute ohungarumlaut -20
+KPX racute omacron -20
+KPX racute oslash -20
+KPX racute otilde -20
+KPX racute period -60
+KPX racute q -20
+KPX racute s -15
+KPX racute sacute -15
+KPX racute scaron -15
+KPX racute scedilla -15
+KPX racute scommaaccent -15
+KPX racute t 20
+KPX racute tcommaaccent 20
+KPX racute v 10
+KPX racute y 10
+KPX racute yacute 10
+KPX racute ydieresis 10
+KPX rcaron c -20
+KPX rcaron cacute -20
+KPX rcaron ccaron -20
+KPX rcaron ccedilla -20
+KPX rcaron comma -60
+KPX rcaron d -20
+KPX rcaron dcroat -20
+KPX rcaron g -15
+KPX rcaron gbreve -15
+KPX rcaron gcommaaccent -15
+KPX rcaron hyphen -20
+KPX rcaron o -20
+KPX rcaron oacute -20
+KPX rcaron ocircumflex -20
+KPX rcaron odieresis -20
+KPX rcaron ograve -20
+KPX rcaron ohungarumlaut -20
+KPX rcaron omacron -20
+KPX rcaron oslash -20
+KPX rcaron otilde -20
+KPX rcaron period -60
+KPX rcaron q -20
+KPX rcaron s -15
+KPX rcaron sacute -15
+KPX rcaron scaron -15
+KPX rcaron scedilla -15
+KPX rcaron scommaaccent -15
+KPX rcaron t 20
+KPX rcaron tcommaaccent 20
+KPX rcaron v 10
+KPX rcaron y 10
+KPX rcaron yacute 10
+KPX rcaron ydieresis 10
+KPX rcommaaccent c -20
+KPX rcommaaccent cacute -20
+KPX rcommaaccent ccaron -20
+KPX rcommaaccent ccedilla -20
+KPX rcommaaccent comma -60
+KPX rcommaaccent d -20
+KPX rcommaaccent dcroat -20
+KPX rcommaaccent g -15
+KPX rcommaaccent gbreve -15
+KPX rcommaaccent gcommaaccent -15
+KPX rcommaaccent hyphen -20
+KPX rcommaaccent o -20
+KPX rcommaaccent oacute -20
+KPX rcommaaccent ocircumflex -20
+KPX rcommaaccent odieresis -20
+KPX rcommaaccent ograve -20
+KPX rcommaaccent ohungarumlaut -20
+KPX rcommaaccent omacron -20
+KPX rcommaaccent oslash -20
+KPX rcommaaccent otilde -20
+KPX rcommaaccent period -60
+KPX rcommaaccent q -20
+KPX rcommaaccent s -15
+KPX rcommaaccent sacute -15
+KPX rcommaaccent scaron -15
+KPX rcommaaccent scedilla -15
+KPX rcommaaccent scommaaccent -15
+KPX rcommaaccent t 20
+KPX rcommaaccent tcommaaccent 20
+KPX rcommaaccent v 10
+KPX rcommaaccent y 10
+KPX rcommaaccent yacute 10
+KPX rcommaaccent ydieresis 10
+KPX s w -15
+KPX sacute w -15
+KPX scaron w -15
+KPX scedilla w -15
+KPX scommaaccent w -15
+KPX semicolon space -40
+KPX space T -100
+KPX space Tcaron -100
+KPX space Tcommaaccent -100
+KPX space V -80
+KPX space W -80
+KPX space Y -120
+KPX space Yacute -120
+KPX space Ydieresis -120
+KPX space quotedblleft -80
+KPX space quoteleft -60
+KPX v a -20
+KPX v aacute -20
+KPX v abreve -20
+KPX v acircumflex -20
+KPX v adieresis -20
+KPX v agrave -20
+KPX v amacron -20
+KPX v aogonek -20
+KPX v aring -20
+KPX v atilde -20
+KPX v comma -80
+KPX v o -30
+KPX v oacute -30
+KPX v ocircumflex -30
+KPX v odieresis -30
+KPX v ograve -30
+KPX v ohungarumlaut -30
+KPX v omacron -30
+KPX v oslash -30
+KPX v otilde -30
+KPX v period -80
+KPX w comma -40
+KPX w o -20
+KPX w oacute -20
+KPX w ocircumflex -20
+KPX w odieresis -20
+KPX w ograve -20
+KPX w ohungarumlaut -20
+KPX w omacron -20
+KPX w oslash -20
+KPX w otilde -20
+KPX w period -40
+KPX x e -10
+KPX x eacute -10
+KPX x ecaron -10
+KPX x ecircumflex -10
+KPX x edieresis -10
+KPX x edotaccent -10
+KPX x egrave -10
+KPX x emacron -10
+KPX x eogonek -10
+KPX y a -30
+KPX y aacute -30
+KPX y abreve -30
+KPX y acircumflex -30
+KPX y adieresis -30
+KPX y agrave -30
+KPX y amacron -30
+KPX y aogonek -30
+KPX y aring -30
+KPX y atilde -30
+KPX y comma -80
+KPX y e -10
+KPX y eacute -10
+KPX y ecaron -10
+KPX y ecircumflex -10
+KPX y edieresis -10
+KPX y edotaccent -10
+KPX y egrave -10
+KPX y emacron -10
+KPX y eogonek -10
+KPX y o -25
+KPX y oacute -25
+KPX y ocircumflex -25
+KPX y odieresis -25
+KPX y ograve -25
+KPX y ohungarumlaut -25
+KPX y omacron -25
+KPX y oslash -25
+KPX y otilde -25
+KPX y period -80
+KPX yacute a -30
+KPX yacute aacute -30
+KPX yacute abreve -30
+KPX yacute acircumflex -30
+KPX yacute adieresis -30
+KPX yacute agrave -30
+KPX yacute amacron -30
+KPX yacute aogonek -30
+KPX yacute aring -30
+KPX yacute atilde -30
+KPX yacute comma -80
+KPX yacute e -10
+KPX yacute eacute -10
+KPX yacute ecaron -10
+KPX yacute ecircumflex -10
+KPX yacute edieresis -10
+KPX yacute edotaccent -10
+KPX yacute egrave -10
+KPX yacute emacron -10
+KPX yacute eogonek -10
+KPX yacute o -25
+KPX yacute oacute -25
+KPX yacute ocircumflex -25
+KPX yacute odieresis -25
+KPX yacute ograve -25
+KPX yacute ohungarumlaut -25
+KPX yacute omacron -25
+KPX yacute oslash -25
+KPX yacute otilde -25
+KPX yacute period -80
+KPX ydieresis a -30
+KPX ydieresis aacute -30
+KPX ydieresis abreve -30
+KPX ydieresis acircumflex -30
+KPX ydieresis adieresis -30
+KPX ydieresis agrave -30
+KPX ydieresis amacron -30
+KPX ydieresis aogonek -30
+KPX ydieresis aring -30
+KPX ydieresis atilde -30
+KPX ydieresis comma -80
+KPX ydieresis e -10
+KPX ydieresis eacute -10
+KPX ydieresis ecaron -10
+KPX ydieresis ecircumflex -10
+KPX ydieresis edieresis -10
+KPX ydieresis edotaccent -10
+KPX ydieresis egrave -10
+KPX ydieresis emacron -10
+KPX ydieresis eogonek -10
+KPX ydieresis o -25
+KPX ydieresis oacute -25
+KPX ydieresis ocircumflex -25
+KPX ydieresis odieresis -25
+KPX ydieresis ograve -25
+KPX ydieresis ohungarumlaut -25
+KPX ydieresis omacron -25
+KPX ydieresis oslash -25
+KPX ydieresis otilde -25
+KPX ydieresis period -80
+KPX z e 10
+KPX z eacute 10
+KPX z ecaron 10
+KPX z ecircumflex 10
+KPX z edieresis 10
+KPX z edotaccent 10
+KPX z egrave 10
+KPX z emacron 10
+KPX z eogonek 10
+KPX zacute e 10
+KPX zacute eacute 10
+KPX zacute ecaron 10
+KPX zacute ecircumflex 10
+KPX zacute edieresis 10
+KPX zacute edotaccent 10
+KPX zacute egrave 10
+KPX zacute emacron 10
+KPX zacute eogonek 10
+KPX zcaron e 10
+KPX zcaron eacute 10
+KPX zcaron ecaron 10
+KPX zcaron ecircumflex 10
+KPX zcaron edieresis 10
+KPX zcaron edotaccent 10
+KPX zcaron egrave 10
+KPX zcaron emacron 10
+KPX zcaron eogonek 10
+KPX zdotaccent e 10
+KPX zdotaccent eacute 10
+KPX zdotaccent ecaron 10
+KPX zdotaccent ecircumflex 10
+KPX zdotaccent edieresis 10
+KPX zdotaccent edotaccent 10
+KPX zdotaccent egrave 10
+KPX zdotaccent emacron 10
+KPX zdotaccent eogonek 10
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/src/fonts/Adobe-Core35_AFMs-314/Helvetica-BoldOblique.afm b/src/fonts/Adobe-Core35_AFMs-314/Helvetica-BoldOblique.afm
new file mode 100644
index 0000000..e944120
--- /dev/null
+++ b/src/fonts/Adobe-Core35_AFMs-314/Helvetica-BoldOblique.afm
@@ -0,0 +1,2825 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Thu May 1 12:45:12 1997
+Comment UniqueID 43053
+Comment VMusage 14482 68586
+FontName Helvetica-BoldOblique
+FullName Helvetica Bold Oblique
+FamilyName Helvetica
+Weight Bold
+ItalicAngle -12
+IsFixedPitch false
+FontBBox -174 -228 1114 962
+UnderlinePosition -100
+UnderlineThickness 50
+Version 002.000
+Notice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries.
+EncodingScheme AdobeStandardEncoding
+CapHeight 718
+XHeight 532
+Ascender 718
+Descender -207
+StdHW 118
+StdVW 140
+StartCharMetrics 314
+C 32 ; WX 278 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 333 ; N exclam ; B 94 0 397 718 ;
+C 34 ; WX 474 ; N quotedbl ; B 193 447 529 718 ;
+C 35 ; WX 556 ; N numbersign ; B 60 0 644 698 ;
+C 36 ; WX 556 ; N dollar ; B 67 -115 622 775 ;
+C 37 ; WX 889 ; N percent ; B 136 -19 901 710 ;
+C 38 ; WX 722 ; N ampersand ; B 89 -19 732 718 ;
+C 39 ; WX 278 ; N quoteright ; B 167 445 362 718 ;
+C 40 ; WX 333 ; N parenleft ; B 76 -208 470 734 ;
+C 41 ; WX 333 ; N parenright ; B -25 -208 369 734 ;
+C 42 ; WX 389 ; N asterisk ; B 146 387 481 718 ;
+C 43 ; WX 584 ; N plus ; B 82 0 610 506 ;
+C 44 ; WX 278 ; N comma ; B 28 -168 245 146 ;
+C 45 ; WX 333 ; N hyphen ; B 73 215 379 345 ;
+C 46 ; WX 278 ; N period ; B 64 0 245 146 ;
+C 47 ; WX 278 ; N slash ; B -37 -19 468 737 ;
+C 48 ; WX 556 ; N zero ; B 86 -19 617 710 ;
+C 49 ; WX 556 ; N one ; B 173 0 529 710 ;
+C 50 ; WX 556 ; N two ; B 26 0 619 710 ;
+C 51 ; WX 556 ; N three ; B 65 -19 608 710 ;
+C 52 ; WX 556 ; N four ; B 60 0 598 710 ;
+C 53 ; WX 556 ; N five ; B 64 -19 636 698 ;
+C 54 ; WX 556 ; N six ; B 85 -19 619 710 ;
+C 55 ; WX 556 ; N seven ; B 125 0 676 698 ;
+C 56 ; WX 556 ; N eight ; B 69 -19 616 710 ;
+C 57 ; WX 556 ; N nine ; B 78 -19 615 710 ;
+C 58 ; WX 333 ; N colon ; B 92 0 351 512 ;
+C 59 ; WX 333 ; N semicolon ; B 56 -168 351 512 ;
+C 60 ; WX 584 ; N less ; B 82 -8 655 514 ;
+C 61 ; WX 584 ; N equal ; B 58 87 633 419 ;
+C 62 ; WX 584 ; N greater ; B 36 -8 609 514 ;
+C 63 ; WX 611 ; N question ; B 165 0 671 727 ;
+C 64 ; WX 975 ; N at ; B 186 -19 954 737 ;
+C 65 ; WX 722 ; N A ; B 20 0 702 718 ;
+C 66 ; WX 722 ; N B ; B 76 0 764 718 ;
+C 67 ; WX 722 ; N C ; B 107 -19 789 737 ;
+C 68 ; WX 722 ; N D ; B 76 0 777 718 ;
+C 69 ; WX 667 ; N E ; B 76 0 757 718 ;
+C 70 ; WX 611 ; N F ; B 76 0 740 718 ;
+C 71 ; WX 778 ; N G ; B 108 -19 817 737 ;
+C 72 ; WX 722 ; N H ; B 71 0 804 718 ;
+C 73 ; WX 278 ; N I ; B 64 0 367 718 ;
+C 74 ; WX 556 ; N J ; B 60 -18 637 718 ;
+C 75 ; WX 722 ; N K ; B 87 0 858 718 ;
+C 76 ; WX 611 ; N L ; B 76 0 611 718 ;
+C 77 ; WX 833 ; N M ; B 69 0 918 718 ;
+C 78 ; WX 722 ; N N ; B 69 0 807 718 ;
+C 79 ; WX 778 ; N O ; B 107 -19 823 737 ;
+C 80 ; WX 667 ; N P ; B 76 0 738 718 ;
+C 81 ; WX 778 ; N Q ; B 107 -52 823 737 ;
+C 82 ; WX 722 ; N R ; B 76 0 778 718 ;
+C 83 ; WX 667 ; N S ; B 81 -19 718 737 ;
+C 84 ; WX 611 ; N T ; B 140 0 751 718 ;
+C 85 ; WX 722 ; N U ; B 116 -19 804 718 ;
+C 86 ; WX 667 ; N V ; B 172 0 801 718 ;
+C 87 ; WX 944 ; N W ; B 169 0 1082 718 ;
+C 88 ; WX 667 ; N X ; B 14 0 791 718 ;
+C 89 ; WX 667 ; N Y ; B 168 0 806 718 ;
+C 90 ; WX 611 ; N Z ; B 25 0 737 718 ;
+C 91 ; WX 333 ; N bracketleft ; B 21 -196 462 722 ;
+C 92 ; WX 278 ; N backslash ; B 124 -19 307 737 ;
+C 93 ; WX 333 ; N bracketright ; B -18 -196 423 722 ;
+C 94 ; WX 584 ; N asciicircum ; B 131 323 591 698 ;
+C 95 ; WX 556 ; N underscore ; B -27 -125 540 -75 ;
+C 96 ; WX 278 ; N quoteleft ; B 165 454 361 727 ;
+C 97 ; WX 556 ; N a ; B 55 -14 583 546 ;
+C 98 ; WX 611 ; N b ; B 61 -14 645 718 ;
+C 99 ; WX 556 ; N c ; B 79 -14 599 546 ;
+C 100 ; WX 611 ; N d ; B 82 -14 704 718 ;
+C 101 ; WX 556 ; N e ; B 70 -14 593 546 ;
+C 102 ; WX 333 ; N f ; B 87 0 469 727 ; L i fi ; L l fl ;
+C 103 ; WX 611 ; N g ; B 38 -217 666 546 ;
+C 104 ; WX 611 ; N h ; B 65 0 629 718 ;
+C 105 ; WX 278 ; N i ; B 69 0 363 725 ;
+C 106 ; WX 278 ; N j ; B -42 -214 363 725 ;
+C 107 ; WX 556 ; N k ; B 69 0 670 718 ;
+C 108 ; WX 278 ; N l ; B 69 0 362 718 ;
+C 109 ; WX 889 ; N m ; B 64 0 909 546 ;
+C 110 ; WX 611 ; N n ; B 65 0 629 546 ;
+C 111 ; WX 611 ; N o ; B 82 -14 643 546 ;
+C 112 ; WX 611 ; N p ; B 18 -207 645 546 ;
+C 113 ; WX 611 ; N q ; B 80 -207 665 546 ;
+C 114 ; WX 389 ; N r ; B 64 0 489 546 ;
+C 115 ; WX 556 ; N s ; B 63 -14 584 546 ;
+C 116 ; WX 333 ; N t ; B 100 -6 422 676 ;
+C 117 ; WX 611 ; N u ; B 98 -14 658 532 ;
+C 118 ; WX 556 ; N v ; B 126 0 656 532 ;
+C 119 ; WX 778 ; N w ; B 123 0 882 532 ;
+C 120 ; WX 556 ; N x ; B 15 0 648 532 ;
+C 121 ; WX 556 ; N y ; B 42 -214 652 532 ;
+C 122 ; WX 500 ; N z ; B 20 0 583 532 ;
+C 123 ; WX 389 ; N braceleft ; B 94 -196 518 722 ;
+C 124 ; WX 280 ; N bar ; B 36 -225 361 775 ;
+C 125 ; WX 389 ; N braceright ; B -18 -196 407 722 ;
+C 126 ; WX 584 ; N asciitilde ; B 115 163 577 343 ;
+C 161 ; WX 333 ; N exclamdown ; B 50 -186 353 532 ;
+C 162 ; WX 556 ; N cent ; B 79 -118 599 628 ;
+C 163 ; WX 556 ; N sterling ; B 50 -16 635 718 ;
+C 164 ; WX 167 ; N fraction ; B -174 -19 487 710 ;
+C 165 ; WX 556 ; N yen ; B 60 0 713 698 ;
+C 166 ; WX 556 ; N florin ; B -50 -210 669 737 ;
+C 167 ; WX 556 ; N section ; B 61 -184 598 727 ;
+C 168 ; WX 556 ; N currency ; B 27 76 680 636 ;
+C 169 ; WX 238 ; N quotesingle ; B 165 447 321 718 ;
+C 170 ; WX 500 ; N quotedblleft ; B 160 454 588 727 ;
+C 171 ; WX 556 ; N guillemotleft ; B 135 76 571 484 ;
+C 172 ; WX 333 ; N guilsinglleft ; B 130 76 353 484 ;
+C 173 ; WX 333 ; N guilsinglright ; B 99 76 322 484 ;
+C 174 ; WX 611 ; N fi ; B 87 0 696 727 ;
+C 175 ; WX 611 ; N fl ; B 87 0 695 727 ;
+C 177 ; WX 556 ; N endash ; B 48 227 627 333 ;
+C 178 ; WX 556 ; N dagger ; B 118 -171 626 718 ;
+C 179 ; WX 556 ; N daggerdbl ; B 46 -171 628 718 ;
+C 180 ; WX 278 ; N periodcentered ; B 110 172 276 334 ;
+C 182 ; WX 556 ; N paragraph ; B 98 -191 688 700 ;
+C 183 ; WX 350 ; N bullet ; B 83 194 420 524 ;
+C 184 ; WX 278 ; N quotesinglbase ; B 41 -146 236 127 ;
+C 185 ; WX 500 ; N quotedblbase ; B 36 -146 463 127 ;
+C 186 ; WX 500 ; N quotedblright ; B 162 445 589 718 ;
+C 187 ; WX 556 ; N guillemotright ; B 104 76 540 484 ;
+C 188 ; WX 1000 ; N ellipsis ; B 92 0 939 146 ;
+C 189 ; WX 1000 ; N perthousand ; B 76 -19 1038 710 ;
+C 191 ; WX 611 ; N questiondown ; B 53 -195 559 532 ;
+C 193 ; WX 333 ; N grave ; B 136 604 353 750 ;
+C 194 ; WX 333 ; N acute ; B 236 604 515 750 ;
+C 195 ; WX 333 ; N circumflex ; B 118 604 471 750 ;
+C 196 ; WX 333 ; N tilde ; B 113 610 507 737 ;
+C 197 ; WX 333 ; N macron ; B 122 604 483 678 ;
+C 198 ; WX 333 ; N breve ; B 156 604 494 750 ;
+C 199 ; WX 333 ; N dotaccent ; B 235 614 385 729 ;
+C 200 ; WX 333 ; N dieresis ; B 137 614 482 729 ;
+C 202 ; WX 333 ; N ring ; B 200 568 420 776 ;
+C 203 ; WX 333 ; N cedilla ; B -37 -228 220 0 ;
+C 205 ; WX 333 ; N hungarumlaut ; B 137 604 645 750 ;
+C 206 ; WX 333 ; N ogonek ; B 41 -228 264 0 ;
+C 207 ; WX 333 ; N caron ; B 149 604 502 750 ;
+C 208 ; WX 1000 ; N emdash ; B 48 227 1071 333 ;
+C 225 ; WX 1000 ; N AE ; B 5 0 1100 718 ;
+C 227 ; WX 370 ; N ordfeminine ; B 125 401 465 737 ;
+C 232 ; WX 611 ; N Lslash ; B 34 0 611 718 ;
+C 233 ; WX 778 ; N Oslash ; B 35 -27 894 745 ;
+C 234 ; WX 1000 ; N OE ; B 99 -19 1114 737 ;
+C 235 ; WX 365 ; N ordmasculine ; B 123 401 485 737 ;
+C 241 ; WX 889 ; N ae ; B 56 -14 923 546 ;
+C 245 ; WX 278 ; N dotlessi ; B 69 0 322 532 ;
+C 248 ; WX 278 ; N lslash ; B 40 0 407 718 ;
+C 249 ; WX 611 ; N oslash ; B 22 -29 701 560 ;
+C 250 ; WX 944 ; N oe ; B 82 -14 977 546 ;
+C 251 ; WX 611 ; N germandbls ; B 69 -14 657 731 ;
+C -1 ; WX 278 ; N Idieresis ; B 64 0 494 915 ;
+C -1 ; WX 556 ; N eacute ; B 70 -14 627 750 ;
+C -1 ; WX 556 ; N abreve ; B 55 -14 606 750 ;
+C -1 ; WX 611 ; N uhungarumlaut ; B 98 -14 784 750 ;
+C -1 ; WX 556 ; N ecaron ; B 70 -14 614 750 ;
+C -1 ; WX 667 ; N Ydieresis ; B 168 0 806 915 ;
+C -1 ; WX 584 ; N divide ; B 82 -42 610 548 ;
+C -1 ; WX 667 ; N Yacute ; B 168 0 806 936 ;
+C -1 ; WX 722 ; N Acircumflex ; B 20 0 706 936 ;
+C -1 ; WX 556 ; N aacute ; B 55 -14 627 750 ;
+C -1 ; WX 722 ; N Ucircumflex ; B 116 -19 804 936 ;
+C -1 ; WX 556 ; N yacute ; B 42 -214 652 750 ;
+C -1 ; WX 556 ; N scommaaccent ; B 63 -228 584 546 ;
+C -1 ; WX 556 ; N ecircumflex ; B 70 -14 593 750 ;
+C -1 ; WX 722 ; N Uring ; B 116 -19 804 962 ;
+C -1 ; WX 722 ; N Udieresis ; B 116 -19 804 915 ;
+C -1 ; WX 556 ; N aogonek ; B 55 -224 583 546 ;
+C -1 ; WX 722 ; N Uacute ; B 116 -19 804 936 ;
+C -1 ; WX 611 ; N uogonek ; B 98 -228 658 532 ;
+C -1 ; WX 667 ; N Edieresis ; B 76 0 757 915 ;
+C -1 ; WX 722 ; N Dcroat ; B 62 0 777 718 ;
+C -1 ; WX 250 ; N commaaccent ; B 16 -228 188 -50 ;
+C -1 ; WX 737 ; N copyright ; B 56 -19 835 737 ;
+C -1 ; WX 667 ; N Emacron ; B 76 0 757 864 ;
+C -1 ; WX 556 ; N ccaron ; B 79 -14 614 750 ;
+C -1 ; WX 556 ; N aring ; B 55 -14 583 776 ;
+C -1 ; WX 722 ; N Ncommaaccent ; B 69 -228 807 718 ;
+C -1 ; WX 278 ; N lacute ; B 69 0 528 936 ;
+C -1 ; WX 556 ; N agrave ; B 55 -14 583 750 ;
+C -1 ; WX 611 ; N Tcommaaccent ; B 140 -228 751 718 ;
+C -1 ; WX 722 ; N Cacute ; B 107 -19 789 936 ;
+C -1 ; WX 556 ; N atilde ; B 55 -14 619 737 ;
+C -1 ; WX 667 ; N Edotaccent ; B 76 0 757 915 ;
+C -1 ; WX 556 ; N scaron ; B 63 -14 614 750 ;
+C -1 ; WX 556 ; N scedilla ; B 63 -228 584 546 ;
+C -1 ; WX 278 ; N iacute ; B 69 0 488 750 ;
+C -1 ; WX 494 ; N lozenge ; B 90 0 564 745 ;
+C -1 ; WX 722 ; N Rcaron ; B 76 0 778 936 ;
+C -1 ; WX 778 ; N Gcommaaccent ; B 108 -228 817 737 ;
+C -1 ; WX 611 ; N ucircumflex ; B 98 -14 658 750 ;
+C -1 ; WX 556 ; N acircumflex ; B 55 -14 583 750 ;
+C -1 ; WX 722 ; N Amacron ; B 20 0 718 864 ;
+C -1 ; WX 389 ; N rcaron ; B 64 0 530 750 ;
+C -1 ; WX 556 ; N ccedilla ; B 79 -228 599 546 ;
+C -1 ; WX 611 ; N Zdotaccent ; B 25 0 737 915 ;
+C -1 ; WX 667 ; N Thorn ; B 76 0 716 718 ;
+C -1 ; WX 778 ; N Omacron ; B 107 -19 823 864 ;
+C -1 ; WX 722 ; N Racute ; B 76 0 778 936 ;
+C -1 ; WX 667 ; N Sacute ; B 81 -19 722 936 ;
+C -1 ; WX 743 ; N dcaron ; B 82 -14 903 718 ;
+C -1 ; WX 722 ; N Umacron ; B 116 -19 804 864 ;
+C -1 ; WX 611 ; N uring ; B 98 -14 658 776 ;
+C -1 ; WX 333 ; N threesuperior ; B 91 271 441 710 ;
+C -1 ; WX 778 ; N Ograve ; B 107 -19 823 936 ;
+C -1 ; WX 722 ; N Agrave ; B 20 0 702 936 ;
+C -1 ; WX 722 ; N Abreve ; B 20 0 729 936 ;
+C -1 ; WX 584 ; N multiply ; B 57 1 635 505 ;
+C -1 ; WX 611 ; N uacute ; B 98 -14 658 750 ;
+C -1 ; WX 611 ; N Tcaron ; B 140 0 751 936 ;
+C -1 ; WX 494 ; N partialdiff ; B 43 -21 585 750 ;
+C -1 ; WX 556 ; N ydieresis ; B 42 -214 652 729 ;
+C -1 ; WX 722 ; N Nacute ; B 69 0 807 936 ;
+C -1 ; WX 278 ; N icircumflex ; B 69 0 444 750 ;
+C -1 ; WX 667 ; N Ecircumflex ; B 76 0 757 936 ;
+C -1 ; WX 556 ; N adieresis ; B 55 -14 594 729 ;
+C -1 ; WX 556 ; N edieresis ; B 70 -14 594 729 ;
+C -1 ; WX 556 ; N cacute ; B 79 -14 627 750 ;
+C -1 ; WX 611 ; N nacute ; B 65 0 654 750 ;
+C -1 ; WX 611 ; N umacron ; B 98 -14 658 678 ;
+C -1 ; WX 722 ; N Ncaron ; B 69 0 807 936 ;
+C -1 ; WX 278 ; N Iacute ; B 64 0 528 936 ;
+C -1 ; WX 584 ; N plusminus ; B 40 0 625 506 ;
+C -1 ; WX 280 ; N brokenbar ; B 52 -150 345 700 ;
+C -1 ; WX 737 ; N registered ; B 55 -19 834 737 ;
+C -1 ; WX 778 ; N Gbreve ; B 108 -19 817 936 ;
+C -1 ; WX 278 ; N Idotaccent ; B 64 0 397 915 ;
+C -1 ; WX 600 ; N summation ; B 14 -10 670 706 ;
+C -1 ; WX 667 ; N Egrave ; B 76 0 757 936 ;
+C -1 ; WX 389 ; N racute ; B 64 0 543 750 ;
+C -1 ; WX 611 ; N omacron ; B 82 -14 643 678 ;
+C -1 ; WX 611 ; N Zacute ; B 25 0 737 936 ;
+C -1 ; WX 611 ; N Zcaron ; B 25 0 737 936 ;
+C -1 ; WX 549 ; N greaterequal ; B 26 0 629 704 ;
+C -1 ; WX 722 ; N Eth ; B 62 0 777 718 ;
+C -1 ; WX 722 ; N Ccedilla ; B 107 -228 789 737 ;
+C -1 ; WX 278 ; N lcommaaccent ; B 30 -228 362 718 ;
+C -1 ; WX 389 ; N tcaron ; B 100 -6 608 878 ;
+C -1 ; WX 556 ; N eogonek ; B 70 -228 593 546 ;
+C -1 ; WX 722 ; N Uogonek ; B 116 -228 804 718 ;
+C -1 ; WX 722 ; N Aacute ; B 20 0 750 936 ;
+C -1 ; WX 722 ; N Adieresis ; B 20 0 716 915 ;
+C -1 ; WX 556 ; N egrave ; B 70 -14 593 750 ;
+C -1 ; WX 500 ; N zacute ; B 20 0 599 750 ;
+C -1 ; WX 278 ; N iogonek ; B -14 -224 363 725 ;
+C -1 ; WX 778 ; N Oacute ; B 107 -19 823 936 ;
+C -1 ; WX 611 ; N oacute ; B 82 -14 654 750 ;
+C -1 ; WX 556 ; N amacron ; B 55 -14 595 678 ;
+C -1 ; WX 556 ; N sacute ; B 63 -14 627 750 ;
+C -1 ; WX 278 ; N idieresis ; B 69 0 455 729 ;
+C -1 ; WX 778 ; N Ocircumflex ; B 107 -19 823 936 ;
+C -1 ; WX 722 ; N Ugrave ; B 116 -19 804 936 ;
+C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ;
+C -1 ; WX 611 ; N thorn ; B 18 -208 645 718 ;
+C -1 ; WX 333 ; N twosuperior ; B 69 283 449 710 ;
+C -1 ; WX 778 ; N Odieresis ; B 107 -19 823 915 ;
+C -1 ; WX 611 ; N mu ; B 22 -207 658 532 ;
+C -1 ; WX 278 ; N igrave ; B 69 0 326 750 ;
+C -1 ; WX 611 ; N ohungarumlaut ; B 82 -14 784 750 ;
+C -1 ; WX 667 ; N Eogonek ; B 76 -224 757 718 ;
+C -1 ; WX 611 ; N dcroat ; B 82 -14 789 718 ;
+C -1 ; WX 834 ; N threequarters ; B 99 -19 839 710 ;
+C -1 ; WX 667 ; N Scedilla ; B 81 -228 718 737 ;
+C -1 ; WX 400 ; N lcaron ; B 69 0 561 718 ;
+C -1 ; WX 722 ; N Kcommaaccent ; B 87 -228 858 718 ;
+C -1 ; WX 611 ; N Lacute ; B 76 0 611 936 ;
+C -1 ; WX 1000 ; N trademark ; B 179 306 1109 718 ;
+C -1 ; WX 556 ; N edotaccent ; B 70 -14 593 729 ;
+C -1 ; WX 278 ; N Igrave ; B 64 0 367 936 ;
+C -1 ; WX 278 ; N Imacron ; B 64 0 496 864 ;
+C -1 ; WX 611 ; N Lcaron ; B 76 0 643 718 ;
+C -1 ; WX 834 ; N onehalf ; B 132 -19 858 710 ;
+C -1 ; WX 549 ; N lessequal ; B 29 0 676 704 ;
+C -1 ; WX 611 ; N ocircumflex ; B 82 -14 643 750 ;
+C -1 ; WX 611 ; N ntilde ; B 65 0 646 737 ;
+C -1 ; WX 722 ; N Uhungarumlaut ; B 116 -19 880 936 ;
+C -1 ; WX 667 ; N Eacute ; B 76 0 757 936 ;
+C -1 ; WX 556 ; N emacron ; B 70 -14 595 678 ;
+C -1 ; WX 611 ; N gbreve ; B 38 -217 666 750 ;
+C -1 ; WX 834 ; N onequarter ; B 132 -19 806 710 ;
+C -1 ; WX 667 ; N Scaron ; B 81 -19 718 936 ;
+C -1 ; WX 667 ; N Scommaaccent ; B 81 -228 718 737 ;
+C -1 ; WX 778 ; N Ohungarumlaut ; B 107 -19 908 936 ;
+C -1 ; WX 400 ; N degree ; B 175 426 467 712 ;
+C -1 ; WX 611 ; N ograve ; B 82 -14 643 750 ;
+C -1 ; WX 722 ; N Ccaron ; B 107 -19 789 936 ;
+C -1 ; WX 611 ; N ugrave ; B 98 -14 658 750 ;
+C -1 ; WX 549 ; N radical ; B 112 -46 689 850 ;
+C -1 ; WX 722 ; N Dcaron ; B 76 0 777 936 ;
+C -1 ; WX 389 ; N rcommaaccent ; B 26 -228 489 546 ;
+C -1 ; WX 722 ; N Ntilde ; B 69 0 807 923 ;
+C -1 ; WX 611 ; N otilde ; B 82 -14 646 737 ;
+C -1 ; WX 722 ; N Rcommaaccent ; B 76 -228 778 718 ;
+C -1 ; WX 611 ; N Lcommaaccent ; B 76 -228 611 718 ;
+C -1 ; WX 722 ; N Atilde ; B 20 0 741 923 ;
+C -1 ; WX 722 ; N Aogonek ; B 20 -224 702 718 ;
+C -1 ; WX 722 ; N Aring ; B 20 0 702 962 ;
+C -1 ; WX 778 ; N Otilde ; B 107 -19 823 923 ;
+C -1 ; WX 500 ; N zdotaccent ; B 20 0 583 729 ;
+C -1 ; WX 667 ; N Ecaron ; B 76 0 757 936 ;
+C -1 ; WX 278 ; N Iogonek ; B -41 -228 367 718 ;
+C -1 ; WX 556 ; N kcommaaccent ; B 69 -228 670 718 ;
+C -1 ; WX 584 ; N minus ; B 82 197 610 309 ;
+C -1 ; WX 278 ; N Icircumflex ; B 64 0 484 936 ;
+C -1 ; WX 611 ; N ncaron ; B 65 0 641 750 ;
+C -1 ; WX 333 ; N tcommaaccent ; B 58 -228 422 676 ;
+C -1 ; WX 584 ; N logicalnot ; B 105 108 633 419 ;
+C -1 ; WX 611 ; N odieresis ; B 82 -14 643 729 ;
+C -1 ; WX 611 ; N udieresis ; B 98 -14 658 729 ;
+C -1 ; WX 549 ; N notequal ; B 32 -49 630 570 ;
+C -1 ; WX 611 ; N gcommaaccent ; B 38 -217 666 850 ;
+C -1 ; WX 611 ; N eth ; B 82 -14 670 737 ;
+C -1 ; WX 500 ; N zcaron ; B 20 0 586 750 ;
+C -1 ; WX 611 ; N ncommaaccent ; B 65 -228 629 546 ;
+C -1 ; WX 333 ; N onesuperior ; B 148 283 388 710 ;
+C -1 ; WX 278 ; N imacron ; B 69 0 429 678 ;
+EndCharMetrics
+StartKernData
+StartKernPairs 2481
+KPX A C -40
+KPX A Cacute -40
+KPX A Ccaron -40
+KPX A Ccedilla -40
+KPX A G -50
+KPX A Gbreve -50
+KPX A Gcommaaccent -50
+KPX A O -40
+KPX A Oacute -40
+KPX A Ocircumflex -40
+KPX A Odieresis -40
+KPX A Ograve -40
+KPX A Ohungarumlaut -40
+KPX A Omacron -40
+KPX A Oslash -40
+KPX A Otilde -40
+KPX A Q -40
+KPX A T -90
+KPX A Tcaron -90
+KPX A Tcommaaccent -90
+KPX A U -50
+KPX A Uacute -50
+KPX A Ucircumflex -50
+KPX A Udieresis -50
+KPX A Ugrave -50
+KPX A Uhungarumlaut -50
+KPX A Umacron -50
+KPX A Uogonek -50
+KPX A Uring -50
+KPX A V -80
+KPX A W -60
+KPX A Y -110
+KPX A Yacute -110
+KPX A Ydieresis -110
+KPX A u -30
+KPX A uacute -30
+KPX A ucircumflex -30
+KPX A udieresis -30
+KPX A ugrave -30
+KPX A uhungarumlaut -30
+KPX A umacron -30
+KPX A uogonek -30
+KPX A uring -30
+KPX A v -40
+KPX A w -30
+KPX A y -30
+KPX A yacute -30
+KPX A ydieresis -30
+KPX Aacute C -40
+KPX Aacute Cacute -40
+KPX Aacute Ccaron -40
+KPX Aacute Ccedilla -40
+KPX Aacute G -50
+KPX Aacute Gbreve -50
+KPX Aacute Gcommaaccent -50
+KPX Aacute O -40
+KPX Aacute Oacute -40
+KPX Aacute Ocircumflex -40
+KPX Aacute Odieresis -40
+KPX Aacute Ograve -40
+KPX Aacute Ohungarumlaut -40
+KPX Aacute Omacron -40
+KPX Aacute Oslash -40
+KPX Aacute Otilde -40
+KPX Aacute Q -40
+KPX Aacute T -90
+KPX Aacute Tcaron -90
+KPX Aacute Tcommaaccent -90
+KPX Aacute U -50
+KPX Aacute Uacute -50
+KPX Aacute Ucircumflex -50
+KPX Aacute Udieresis -50
+KPX Aacute Ugrave -50
+KPX Aacute Uhungarumlaut -50
+KPX Aacute Umacron -50
+KPX Aacute Uogonek -50
+KPX Aacute Uring -50
+KPX Aacute V -80
+KPX Aacute W -60
+KPX Aacute Y -110
+KPX Aacute Yacute -110
+KPX Aacute Ydieresis -110
+KPX Aacute u -30
+KPX Aacute uacute -30
+KPX Aacute ucircumflex -30
+KPX Aacute udieresis -30
+KPX Aacute ugrave -30
+KPX Aacute uhungarumlaut -30
+KPX Aacute umacron -30
+KPX Aacute uogonek -30
+KPX Aacute uring -30
+KPX Aacute v -40
+KPX Aacute w -30
+KPX Aacute y -30
+KPX Aacute yacute -30
+KPX Aacute ydieresis -30
+KPX Abreve C -40
+KPX Abreve Cacute -40
+KPX Abreve Ccaron -40
+KPX Abreve Ccedilla -40
+KPX Abreve G -50
+KPX Abreve Gbreve -50
+KPX Abreve Gcommaaccent -50
+KPX Abreve O -40
+KPX Abreve Oacute -40
+KPX Abreve Ocircumflex -40
+KPX Abreve Odieresis -40
+KPX Abreve Ograve -40
+KPX Abreve Ohungarumlaut -40
+KPX Abreve Omacron -40
+KPX Abreve Oslash -40
+KPX Abreve Otilde -40
+KPX Abreve Q -40
+KPX Abreve T -90
+KPX Abreve Tcaron -90
+KPX Abreve Tcommaaccent -90
+KPX Abreve U -50
+KPX Abreve Uacute -50
+KPX Abreve Ucircumflex -50
+KPX Abreve Udieresis -50
+KPX Abreve Ugrave -50
+KPX Abreve Uhungarumlaut -50
+KPX Abreve Umacron -50
+KPX Abreve Uogonek -50
+KPX Abreve Uring -50
+KPX Abreve V -80
+KPX Abreve W -60
+KPX Abreve Y -110
+KPX Abreve Yacute -110
+KPX Abreve Ydieresis -110
+KPX Abreve u -30
+KPX Abreve uacute -30
+KPX Abreve ucircumflex -30
+KPX Abreve udieresis -30
+KPX Abreve ugrave -30
+KPX Abreve uhungarumlaut -30
+KPX Abreve umacron -30
+KPX Abreve uogonek -30
+KPX Abreve uring -30
+KPX Abreve v -40
+KPX Abreve w -30
+KPX Abreve y -30
+KPX Abreve yacute -30
+KPX Abreve ydieresis -30
+KPX Acircumflex C -40
+KPX Acircumflex Cacute -40
+KPX Acircumflex Ccaron -40
+KPX Acircumflex Ccedilla -40
+KPX Acircumflex G -50
+KPX Acircumflex Gbreve -50
+KPX Acircumflex Gcommaaccent -50
+KPX Acircumflex O -40
+KPX Acircumflex Oacute -40
+KPX Acircumflex Ocircumflex -40
+KPX Acircumflex Odieresis -40
+KPX Acircumflex Ograve -40
+KPX Acircumflex Ohungarumlaut -40
+KPX Acircumflex Omacron -40
+KPX Acircumflex Oslash -40
+KPX Acircumflex Otilde -40
+KPX Acircumflex Q -40
+KPX Acircumflex T -90
+KPX Acircumflex Tcaron -90
+KPX Acircumflex Tcommaaccent -90
+KPX Acircumflex U -50
+KPX Acircumflex Uacute -50
+KPX Acircumflex Ucircumflex -50
+KPX Acircumflex Udieresis -50
+KPX Acircumflex Ugrave -50
+KPX Acircumflex Uhungarumlaut -50
+KPX Acircumflex Umacron -50
+KPX Acircumflex Uogonek -50
+KPX Acircumflex Uring -50
+KPX Acircumflex V -80
+KPX Acircumflex W -60
+KPX Acircumflex Y -110
+KPX Acircumflex Yacute -110
+KPX Acircumflex Ydieresis -110
+KPX Acircumflex u -30
+KPX Acircumflex uacute -30
+KPX Acircumflex ucircumflex -30
+KPX Acircumflex udieresis -30
+KPX Acircumflex ugrave -30
+KPX Acircumflex uhungarumlaut -30
+KPX Acircumflex umacron -30
+KPX Acircumflex uogonek -30
+KPX Acircumflex uring -30
+KPX Acircumflex v -40
+KPX Acircumflex w -30
+KPX Acircumflex y -30
+KPX Acircumflex yacute -30
+KPX Acircumflex ydieresis -30
+KPX Adieresis C -40
+KPX Adieresis Cacute -40
+KPX Adieresis Ccaron -40
+KPX Adieresis Ccedilla -40
+KPX Adieresis G -50
+KPX Adieresis Gbreve -50
+KPX Adieresis Gcommaaccent -50
+KPX Adieresis O -40
+KPX Adieresis Oacute -40
+KPX Adieresis Ocircumflex -40
+KPX Adieresis Odieresis -40
+KPX Adieresis Ograve -40
+KPX Adieresis Ohungarumlaut -40
+KPX Adieresis Omacron -40
+KPX Adieresis Oslash -40
+KPX Adieresis Otilde -40
+KPX Adieresis Q -40
+KPX Adieresis T -90
+KPX Adieresis Tcaron -90
+KPX Adieresis Tcommaaccent -90
+KPX Adieresis U -50
+KPX Adieresis Uacute -50
+KPX Adieresis Ucircumflex -50
+KPX Adieresis Udieresis -50
+KPX Adieresis Ugrave -50
+KPX Adieresis Uhungarumlaut -50
+KPX Adieresis Umacron -50
+KPX Adieresis Uogonek -50
+KPX Adieresis Uring -50
+KPX Adieresis V -80
+KPX Adieresis W -60
+KPX Adieresis Y -110
+KPX Adieresis Yacute -110
+KPX Adieresis Ydieresis -110
+KPX Adieresis u -30
+KPX Adieresis uacute -30
+KPX Adieresis ucircumflex -30
+KPX Adieresis udieresis -30
+KPX Adieresis ugrave -30
+KPX Adieresis uhungarumlaut -30
+KPX Adieresis umacron -30
+KPX Adieresis uogonek -30
+KPX Adieresis uring -30
+KPX Adieresis v -40
+KPX Adieresis w -30
+KPX Adieresis y -30
+KPX Adieresis yacute -30
+KPX Adieresis ydieresis -30
+KPX Agrave C -40
+KPX Agrave Cacute -40
+KPX Agrave Ccaron -40
+KPX Agrave Ccedilla -40
+KPX Agrave G -50
+KPX Agrave Gbreve -50
+KPX Agrave Gcommaaccent -50
+KPX Agrave O -40
+KPX Agrave Oacute -40
+KPX Agrave Ocircumflex -40
+KPX Agrave Odieresis -40
+KPX Agrave Ograve -40
+KPX Agrave Ohungarumlaut -40
+KPX Agrave Omacron -40
+KPX Agrave Oslash -40
+KPX Agrave Otilde -40
+KPX Agrave Q -40
+KPX Agrave T -90
+KPX Agrave Tcaron -90
+KPX Agrave Tcommaaccent -90
+KPX Agrave U -50
+KPX Agrave Uacute -50
+KPX Agrave Ucircumflex -50
+KPX Agrave Udieresis -50
+KPX Agrave Ugrave -50
+KPX Agrave Uhungarumlaut -50
+KPX Agrave Umacron -50
+KPX Agrave Uogonek -50
+KPX Agrave Uring -50
+KPX Agrave V -80
+KPX Agrave W -60
+KPX Agrave Y -110
+KPX Agrave Yacute -110
+KPX Agrave Ydieresis -110
+KPX Agrave u -30
+KPX Agrave uacute -30
+KPX Agrave ucircumflex -30
+KPX Agrave udieresis -30
+KPX Agrave ugrave -30
+KPX Agrave uhungarumlaut -30
+KPX Agrave umacron -30
+KPX Agrave uogonek -30
+KPX Agrave uring -30
+KPX Agrave v -40
+KPX Agrave w -30
+KPX Agrave y -30
+KPX Agrave yacute -30
+KPX Agrave ydieresis -30
+KPX Amacron C -40
+KPX Amacron Cacute -40
+KPX Amacron Ccaron -40
+KPX Amacron Ccedilla -40
+KPX Amacron G -50
+KPX Amacron Gbreve -50
+KPX Amacron Gcommaaccent -50
+KPX Amacron O -40
+KPX Amacron Oacute -40
+KPX Amacron Ocircumflex -40
+KPX Amacron Odieresis -40
+KPX Amacron Ograve -40
+KPX Amacron Ohungarumlaut -40
+KPX Amacron Omacron -40
+KPX Amacron Oslash -40
+KPX Amacron Otilde -40
+KPX Amacron Q -40
+KPX Amacron T -90
+KPX Amacron Tcaron -90
+KPX Amacron Tcommaaccent -90
+KPX Amacron U -50
+KPX Amacron Uacute -50
+KPX Amacron Ucircumflex -50
+KPX Amacron Udieresis -50
+KPX Amacron Ugrave -50
+KPX Amacron Uhungarumlaut -50
+KPX Amacron Umacron -50
+KPX Amacron Uogonek -50
+KPX Amacron Uring -50
+KPX Amacron V -80
+KPX Amacron W -60
+KPX Amacron Y -110
+KPX Amacron Yacute -110
+KPX Amacron Ydieresis -110
+KPX Amacron u -30
+KPX Amacron uacute -30
+KPX Amacron ucircumflex -30
+KPX Amacron udieresis -30
+KPX Amacron ugrave -30
+KPX Amacron uhungarumlaut -30
+KPX Amacron umacron -30
+KPX Amacron uogonek -30
+KPX Amacron uring -30
+KPX Amacron v -40
+KPX Amacron w -30
+KPX Amacron y -30
+KPX Amacron yacute -30
+KPX Amacron ydieresis -30
+KPX Aogonek C -40
+KPX Aogonek Cacute -40
+KPX Aogonek Ccaron -40
+KPX Aogonek Ccedilla -40
+KPX Aogonek G -50
+KPX Aogonek Gbreve -50
+KPX Aogonek Gcommaaccent -50
+KPX Aogonek O -40
+KPX Aogonek Oacute -40
+KPX Aogonek Ocircumflex -40
+KPX Aogonek Odieresis -40
+KPX Aogonek Ograve -40
+KPX Aogonek Ohungarumlaut -40
+KPX Aogonek Omacron -40
+KPX Aogonek Oslash -40
+KPX Aogonek Otilde -40
+KPX Aogonek Q -40
+KPX Aogonek T -90
+KPX Aogonek Tcaron -90
+KPX Aogonek Tcommaaccent -90
+KPX Aogonek U -50
+KPX Aogonek Uacute -50
+KPX Aogonek Ucircumflex -50
+KPX Aogonek Udieresis -50
+KPX Aogonek Ugrave -50
+KPX Aogonek Uhungarumlaut -50
+KPX Aogonek Umacron -50
+KPX Aogonek Uogonek -50
+KPX Aogonek Uring -50
+KPX Aogonek V -80
+KPX Aogonek W -60
+KPX Aogonek Y -110
+KPX Aogonek Yacute -110
+KPX Aogonek Ydieresis -110
+KPX Aogonek u -30
+KPX Aogonek uacute -30
+KPX Aogonek ucircumflex -30
+KPX Aogonek udieresis -30
+KPX Aogonek ugrave -30
+KPX Aogonek uhungarumlaut -30
+KPX Aogonek umacron -30
+KPX Aogonek uogonek -30
+KPX Aogonek uring -30
+KPX Aogonek v -40
+KPX Aogonek w -30
+KPX Aogonek y -30
+KPX Aogonek yacute -30
+KPX Aogonek ydieresis -30
+KPX Aring C -40
+KPX Aring Cacute -40
+KPX Aring Ccaron -40
+KPX Aring Ccedilla -40
+KPX Aring G -50
+KPX Aring Gbreve -50
+KPX Aring Gcommaaccent -50
+KPX Aring O -40
+KPX Aring Oacute -40
+KPX Aring Ocircumflex -40
+KPX Aring Odieresis -40
+KPX Aring Ograve -40
+KPX Aring Ohungarumlaut -40
+KPX Aring Omacron -40
+KPX Aring Oslash -40
+KPX Aring Otilde -40
+KPX Aring Q -40
+KPX Aring T -90
+KPX Aring Tcaron -90
+KPX Aring Tcommaaccent -90
+KPX Aring U -50
+KPX Aring Uacute -50
+KPX Aring Ucircumflex -50
+KPX Aring Udieresis -50
+KPX Aring Ugrave -50
+KPX Aring Uhungarumlaut -50
+KPX Aring Umacron -50
+KPX Aring Uogonek -50
+KPX Aring Uring -50
+KPX Aring V -80
+KPX Aring W -60
+KPX Aring Y -110
+KPX Aring Yacute -110
+KPX Aring Ydieresis -110
+KPX Aring u -30
+KPX Aring uacute -30
+KPX Aring ucircumflex -30
+KPX Aring udieresis -30
+KPX Aring ugrave -30
+KPX Aring uhungarumlaut -30
+KPX Aring umacron -30
+KPX Aring uogonek -30
+KPX Aring uring -30
+KPX Aring v -40
+KPX Aring w -30
+KPX Aring y -30
+KPX Aring yacute -30
+KPX Aring ydieresis -30
+KPX Atilde C -40
+KPX Atilde Cacute -40
+KPX Atilde Ccaron -40
+KPX Atilde Ccedilla -40
+KPX Atilde G -50
+KPX Atilde Gbreve -50
+KPX Atilde Gcommaaccent -50
+KPX Atilde O -40
+KPX Atilde Oacute -40
+KPX Atilde Ocircumflex -40
+KPX Atilde Odieresis -40
+KPX Atilde Ograve -40
+KPX Atilde Ohungarumlaut -40
+KPX Atilde Omacron -40
+KPX Atilde Oslash -40
+KPX Atilde Otilde -40
+KPX Atilde Q -40
+KPX Atilde T -90
+KPX Atilde Tcaron -90
+KPX Atilde Tcommaaccent -90
+KPX Atilde U -50
+KPX Atilde Uacute -50
+KPX Atilde Ucircumflex -50
+KPX Atilde Udieresis -50
+KPX Atilde Ugrave -50
+KPX Atilde Uhungarumlaut -50
+KPX Atilde Umacron -50
+KPX Atilde Uogonek -50
+KPX Atilde Uring -50
+KPX Atilde V -80
+KPX Atilde W -60
+KPX Atilde Y -110
+KPX Atilde Yacute -110
+KPX Atilde Ydieresis -110
+KPX Atilde u -30
+KPX Atilde uacute -30
+KPX Atilde ucircumflex -30
+KPX Atilde udieresis -30
+KPX Atilde ugrave -30
+KPX Atilde uhungarumlaut -30
+KPX Atilde umacron -30
+KPX Atilde uogonek -30
+KPX Atilde uring -30
+KPX Atilde v -40
+KPX Atilde w -30
+KPX Atilde y -30
+KPX Atilde yacute -30
+KPX Atilde ydieresis -30
+KPX B A -30
+KPX B Aacute -30
+KPX B Abreve -30
+KPX B Acircumflex -30
+KPX B Adieresis -30
+KPX B Agrave -30
+KPX B Amacron -30
+KPX B Aogonek -30
+KPX B Aring -30
+KPX B Atilde -30
+KPX B U -10
+KPX B Uacute -10
+KPX B Ucircumflex -10
+KPX B Udieresis -10
+KPX B Ugrave -10
+KPX B Uhungarumlaut -10
+KPX B Umacron -10
+KPX B Uogonek -10
+KPX B Uring -10
+KPX D A -40
+KPX D Aacute -40
+KPX D Abreve -40
+KPX D Acircumflex -40
+KPX D Adieresis -40
+KPX D Agrave -40
+KPX D Amacron -40
+KPX D Aogonek -40
+KPX D Aring -40
+KPX D Atilde -40
+KPX D V -40
+KPX D W -40
+KPX D Y -70
+KPX D Yacute -70
+KPX D Ydieresis -70
+KPX D comma -30
+KPX D period -30
+KPX Dcaron A -40
+KPX Dcaron Aacute -40
+KPX Dcaron Abreve -40
+KPX Dcaron Acircumflex -40
+KPX Dcaron Adieresis -40
+KPX Dcaron Agrave -40
+KPX Dcaron Amacron -40
+KPX Dcaron Aogonek -40
+KPX Dcaron Aring -40
+KPX Dcaron Atilde -40
+KPX Dcaron V -40
+KPX Dcaron W -40
+KPX Dcaron Y -70
+KPX Dcaron Yacute -70
+KPX Dcaron Ydieresis -70
+KPX Dcaron comma -30
+KPX Dcaron period -30
+KPX Dcroat A -40
+KPX Dcroat Aacute -40
+KPX Dcroat Abreve -40
+KPX Dcroat Acircumflex -40
+KPX Dcroat Adieresis -40
+KPX Dcroat Agrave -40
+KPX Dcroat Amacron -40
+KPX Dcroat Aogonek -40
+KPX Dcroat Aring -40
+KPX Dcroat Atilde -40
+KPX Dcroat V -40
+KPX Dcroat W -40
+KPX Dcroat Y -70
+KPX Dcroat Yacute -70
+KPX Dcroat Ydieresis -70
+KPX Dcroat comma -30
+KPX Dcroat period -30
+KPX F A -80
+KPX F Aacute -80
+KPX F Abreve -80
+KPX F Acircumflex -80
+KPX F Adieresis -80
+KPX F Agrave -80
+KPX F Amacron -80
+KPX F Aogonek -80
+KPX F Aring -80
+KPX F Atilde -80
+KPX F a -20
+KPX F aacute -20
+KPX F abreve -20
+KPX F acircumflex -20
+KPX F adieresis -20
+KPX F agrave -20
+KPX F amacron -20
+KPX F aogonek -20
+KPX F aring -20
+KPX F atilde -20
+KPX F comma -100
+KPX F period -100
+KPX J A -20
+KPX J Aacute -20
+KPX J Abreve -20
+KPX J Acircumflex -20
+KPX J Adieresis -20
+KPX J Agrave -20
+KPX J Amacron -20
+KPX J Aogonek -20
+KPX J Aring -20
+KPX J Atilde -20
+KPX J comma -20
+KPX J period -20
+KPX J u -20
+KPX J uacute -20
+KPX J ucircumflex -20
+KPX J udieresis -20
+KPX J ugrave -20
+KPX J uhungarumlaut -20
+KPX J umacron -20
+KPX J uogonek -20
+KPX J uring -20
+KPX K O -30
+KPX K Oacute -30
+KPX K Ocircumflex -30
+KPX K Odieresis -30
+KPX K Ograve -30
+KPX K Ohungarumlaut -30
+KPX K Omacron -30
+KPX K Oslash -30
+KPX K Otilde -30
+KPX K e -15
+KPX K eacute -15
+KPX K ecaron -15
+KPX K ecircumflex -15
+KPX K edieresis -15
+KPX K edotaccent -15
+KPX K egrave -15
+KPX K emacron -15
+KPX K eogonek -15
+KPX K o -35
+KPX K oacute -35
+KPX K ocircumflex -35
+KPX K odieresis -35
+KPX K ograve -35
+KPX K ohungarumlaut -35
+KPX K omacron -35
+KPX K oslash -35
+KPX K otilde -35
+KPX K u -30
+KPX K uacute -30
+KPX K ucircumflex -30
+KPX K udieresis -30
+KPX K ugrave -30
+KPX K uhungarumlaut -30
+KPX K umacron -30
+KPX K uogonek -30
+KPX K uring -30
+KPX K y -40
+KPX K yacute -40
+KPX K ydieresis -40
+KPX Kcommaaccent O -30
+KPX Kcommaaccent Oacute -30
+KPX Kcommaaccent Ocircumflex -30
+KPX Kcommaaccent Odieresis -30
+KPX Kcommaaccent Ograve -30
+KPX Kcommaaccent Ohungarumlaut -30
+KPX Kcommaaccent Omacron -30
+KPX Kcommaaccent Oslash -30
+KPX Kcommaaccent Otilde -30
+KPX Kcommaaccent e -15
+KPX Kcommaaccent eacute -15
+KPX Kcommaaccent ecaron -15
+KPX Kcommaaccent ecircumflex -15
+KPX Kcommaaccent edieresis -15
+KPX Kcommaaccent edotaccent -15
+KPX Kcommaaccent egrave -15
+KPX Kcommaaccent emacron -15
+KPX Kcommaaccent eogonek -15
+KPX Kcommaaccent o -35
+KPX Kcommaaccent oacute -35
+KPX Kcommaaccent ocircumflex -35
+KPX Kcommaaccent odieresis -35
+KPX Kcommaaccent ograve -35
+KPX Kcommaaccent ohungarumlaut -35
+KPX Kcommaaccent omacron -35
+KPX Kcommaaccent oslash -35
+KPX Kcommaaccent otilde -35
+KPX Kcommaaccent u -30
+KPX Kcommaaccent uacute -30
+KPX Kcommaaccent ucircumflex -30
+KPX Kcommaaccent udieresis -30
+KPX Kcommaaccent ugrave -30
+KPX Kcommaaccent uhungarumlaut -30
+KPX Kcommaaccent umacron -30
+KPX Kcommaaccent uogonek -30
+KPX Kcommaaccent uring -30
+KPX Kcommaaccent y -40
+KPX Kcommaaccent yacute -40
+KPX Kcommaaccent ydieresis -40
+KPX L T -90
+KPX L Tcaron -90
+KPX L Tcommaaccent -90
+KPX L V -110
+KPX L W -80
+KPX L Y -120
+KPX L Yacute -120
+KPX L Ydieresis -120
+KPX L quotedblright -140
+KPX L quoteright -140
+KPX L y -30
+KPX L yacute -30
+KPX L ydieresis -30
+KPX Lacute T -90
+KPX Lacute Tcaron -90
+KPX Lacute Tcommaaccent -90
+KPX Lacute V -110
+KPX Lacute W -80
+KPX Lacute Y -120
+KPX Lacute Yacute -120
+KPX Lacute Ydieresis -120
+KPX Lacute quotedblright -140
+KPX Lacute quoteright -140
+KPX Lacute y -30
+KPX Lacute yacute -30
+KPX Lacute ydieresis -30
+KPX Lcommaaccent T -90
+KPX Lcommaaccent Tcaron -90
+KPX Lcommaaccent Tcommaaccent -90
+KPX Lcommaaccent V -110
+KPX Lcommaaccent W -80
+KPX Lcommaaccent Y -120
+KPX Lcommaaccent Yacute -120
+KPX Lcommaaccent Ydieresis -120
+KPX Lcommaaccent quotedblright -140
+KPX Lcommaaccent quoteright -140
+KPX Lcommaaccent y -30
+KPX Lcommaaccent yacute -30
+KPX Lcommaaccent ydieresis -30
+KPX Lslash T -90
+KPX Lslash Tcaron -90
+KPX Lslash Tcommaaccent -90
+KPX Lslash V -110
+KPX Lslash W -80
+KPX Lslash Y -120
+KPX Lslash Yacute -120
+KPX Lslash Ydieresis -120
+KPX Lslash quotedblright -140
+KPX Lslash quoteright -140
+KPX Lslash y -30
+KPX Lslash yacute -30
+KPX Lslash ydieresis -30
+KPX O A -50
+KPX O Aacute -50
+KPX O Abreve -50
+KPX O Acircumflex -50
+KPX O Adieresis -50
+KPX O Agrave -50
+KPX O Amacron -50
+KPX O Aogonek -50
+KPX O Aring -50
+KPX O Atilde -50
+KPX O T -40
+KPX O Tcaron -40
+KPX O Tcommaaccent -40
+KPX O V -50
+KPX O W -50
+KPX O X -50
+KPX O Y -70
+KPX O Yacute -70
+KPX O Ydieresis -70
+KPX O comma -40
+KPX O period -40
+KPX Oacute A -50
+KPX Oacute Aacute -50
+KPX Oacute Abreve -50
+KPX Oacute Acircumflex -50
+KPX Oacute Adieresis -50
+KPX Oacute Agrave -50
+KPX Oacute Amacron -50
+KPX Oacute Aogonek -50
+KPX Oacute Aring -50
+KPX Oacute Atilde -50
+KPX Oacute T -40
+KPX Oacute Tcaron -40
+KPX Oacute Tcommaaccent -40
+KPX Oacute V -50
+KPX Oacute W -50
+KPX Oacute X -50
+KPX Oacute Y -70
+KPX Oacute Yacute -70
+KPX Oacute Ydieresis -70
+KPX Oacute comma -40
+KPX Oacute period -40
+KPX Ocircumflex A -50
+KPX Ocircumflex Aacute -50
+KPX Ocircumflex Abreve -50
+KPX Ocircumflex Acircumflex -50
+KPX Ocircumflex Adieresis -50
+KPX Ocircumflex Agrave -50
+KPX Ocircumflex Amacron -50
+KPX Ocircumflex Aogonek -50
+KPX Ocircumflex Aring -50
+KPX Ocircumflex Atilde -50
+KPX Ocircumflex T -40
+KPX Ocircumflex Tcaron -40
+KPX Ocircumflex Tcommaaccent -40
+KPX Ocircumflex V -50
+KPX Ocircumflex W -50
+KPX Ocircumflex X -50
+KPX Ocircumflex Y -70
+KPX Ocircumflex Yacute -70
+KPX Ocircumflex Ydieresis -70
+KPX Ocircumflex comma -40
+KPX Ocircumflex period -40
+KPX Odieresis A -50
+KPX Odieresis Aacute -50
+KPX Odieresis Abreve -50
+KPX Odieresis Acircumflex -50
+KPX Odieresis Adieresis -50
+KPX Odieresis Agrave -50
+KPX Odieresis Amacron -50
+KPX Odieresis Aogonek -50
+KPX Odieresis Aring -50
+KPX Odieresis Atilde -50
+KPX Odieresis T -40
+KPX Odieresis Tcaron -40
+KPX Odieresis Tcommaaccent -40
+KPX Odieresis V -50
+KPX Odieresis W -50
+KPX Odieresis X -50
+KPX Odieresis Y -70
+KPX Odieresis Yacute -70
+KPX Odieresis Ydieresis -70
+KPX Odieresis comma -40
+KPX Odieresis period -40
+KPX Ograve A -50
+KPX Ograve Aacute -50
+KPX Ograve Abreve -50
+KPX Ograve Acircumflex -50
+KPX Ograve Adieresis -50
+KPX Ograve Agrave -50
+KPX Ograve Amacron -50
+KPX Ograve Aogonek -50
+KPX Ograve Aring -50
+KPX Ograve Atilde -50
+KPX Ograve T -40
+KPX Ograve Tcaron -40
+KPX Ograve Tcommaaccent -40
+KPX Ograve V -50
+KPX Ograve W -50
+KPX Ograve X -50
+KPX Ograve Y -70
+KPX Ograve Yacute -70
+KPX Ograve Ydieresis -70
+KPX Ograve comma -40
+KPX Ograve period -40
+KPX Ohungarumlaut A -50
+KPX Ohungarumlaut Aacute -50
+KPX Ohungarumlaut Abreve -50
+KPX Ohungarumlaut Acircumflex -50
+KPX Ohungarumlaut Adieresis -50
+KPX Ohungarumlaut Agrave -50
+KPX Ohungarumlaut Amacron -50
+KPX Ohungarumlaut Aogonek -50
+KPX Ohungarumlaut Aring -50
+KPX Ohungarumlaut Atilde -50
+KPX Ohungarumlaut T -40
+KPX Ohungarumlaut Tcaron -40
+KPX Ohungarumlaut Tcommaaccent -40
+KPX Ohungarumlaut V -50
+KPX Ohungarumlaut W -50
+KPX Ohungarumlaut X -50
+KPX Ohungarumlaut Y -70
+KPX Ohungarumlaut Yacute -70
+KPX Ohungarumlaut Ydieresis -70
+KPX Ohungarumlaut comma -40
+KPX Ohungarumlaut period -40
+KPX Omacron A -50
+KPX Omacron Aacute -50
+KPX Omacron Abreve -50
+KPX Omacron Acircumflex -50
+KPX Omacron Adieresis -50
+KPX Omacron Agrave -50
+KPX Omacron Amacron -50
+KPX Omacron Aogonek -50
+KPX Omacron Aring -50
+KPX Omacron Atilde -50
+KPX Omacron T -40
+KPX Omacron Tcaron -40
+KPX Omacron Tcommaaccent -40
+KPX Omacron V -50
+KPX Omacron W -50
+KPX Omacron X -50
+KPX Omacron Y -70
+KPX Omacron Yacute -70
+KPX Omacron Ydieresis -70
+KPX Omacron comma -40
+KPX Omacron period -40
+KPX Oslash A -50
+KPX Oslash Aacute -50
+KPX Oslash Abreve -50
+KPX Oslash Acircumflex -50
+KPX Oslash Adieresis -50
+KPX Oslash Agrave -50
+KPX Oslash Amacron -50
+KPX Oslash Aogonek -50
+KPX Oslash Aring -50
+KPX Oslash Atilde -50
+KPX Oslash T -40
+KPX Oslash Tcaron -40
+KPX Oslash Tcommaaccent -40
+KPX Oslash V -50
+KPX Oslash W -50
+KPX Oslash X -50
+KPX Oslash Y -70
+KPX Oslash Yacute -70
+KPX Oslash Ydieresis -70
+KPX Oslash comma -40
+KPX Oslash period -40
+KPX Otilde A -50
+KPX Otilde Aacute -50
+KPX Otilde Abreve -50
+KPX Otilde Acircumflex -50
+KPX Otilde Adieresis -50
+KPX Otilde Agrave -50
+KPX Otilde Amacron -50
+KPX Otilde Aogonek -50
+KPX Otilde Aring -50
+KPX Otilde Atilde -50
+KPX Otilde T -40
+KPX Otilde Tcaron -40
+KPX Otilde Tcommaaccent -40
+KPX Otilde V -50
+KPX Otilde W -50
+KPX Otilde X -50
+KPX Otilde Y -70
+KPX Otilde Yacute -70
+KPX Otilde Ydieresis -70
+KPX Otilde comma -40
+KPX Otilde period -40
+KPX P A -100
+KPX P Aacute -100
+KPX P Abreve -100
+KPX P Acircumflex -100
+KPX P Adieresis -100
+KPX P Agrave -100
+KPX P Amacron -100
+KPX P Aogonek -100
+KPX P Aring -100
+KPX P Atilde -100
+KPX P a -30
+KPX P aacute -30
+KPX P abreve -30
+KPX P acircumflex -30
+KPX P adieresis -30
+KPX P agrave -30
+KPX P amacron -30
+KPX P aogonek -30
+KPX P aring -30
+KPX P atilde -30
+KPX P comma -120
+KPX P e -30
+KPX P eacute -30
+KPX P ecaron -30
+KPX P ecircumflex -30
+KPX P edieresis -30
+KPX P edotaccent -30
+KPX P egrave -30
+KPX P emacron -30
+KPX P eogonek -30
+KPX P o -40
+KPX P oacute -40
+KPX P ocircumflex -40
+KPX P odieresis -40
+KPX P ograve -40
+KPX P ohungarumlaut -40
+KPX P omacron -40
+KPX P oslash -40
+KPX P otilde -40
+KPX P period -120
+KPX Q U -10
+KPX Q Uacute -10
+KPX Q Ucircumflex -10
+KPX Q Udieresis -10
+KPX Q Ugrave -10
+KPX Q Uhungarumlaut -10
+KPX Q Umacron -10
+KPX Q Uogonek -10
+KPX Q Uring -10
+KPX Q comma 20
+KPX Q period 20
+KPX R O -20
+KPX R Oacute -20
+KPX R Ocircumflex -20
+KPX R Odieresis -20
+KPX R Ograve -20
+KPX R Ohungarumlaut -20
+KPX R Omacron -20
+KPX R Oslash -20
+KPX R Otilde -20
+KPX R T -20
+KPX R Tcaron -20
+KPX R Tcommaaccent -20
+KPX R U -20
+KPX R Uacute -20
+KPX R Ucircumflex -20
+KPX R Udieresis -20
+KPX R Ugrave -20
+KPX R Uhungarumlaut -20
+KPX R Umacron -20
+KPX R Uogonek -20
+KPX R Uring -20
+KPX R V -50
+KPX R W -40
+KPX R Y -50
+KPX R Yacute -50
+KPX R Ydieresis -50
+KPX Racute O -20
+KPX Racute Oacute -20
+KPX Racute Ocircumflex -20
+KPX Racute Odieresis -20
+KPX Racute Ograve -20
+KPX Racute Ohungarumlaut -20
+KPX Racute Omacron -20
+KPX Racute Oslash -20
+KPX Racute Otilde -20
+KPX Racute T -20
+KPX Racute Tcaron -20
+KPX Racute Tcommaaccent -20
+KPX Racute U -20
+KPX Racute Uacute -20
+KPX Racute Ucircumflex -20
+KPX Racute Udieresis -20
+KPX Racute Ugrave -20
+KPX Racute Uhungarumlaut -20
+KPX Racute Umacron -20
+KPX Racute Uogonek -20
+KPX Racute Uring -20
+KPX Racute V -50
+KPX Racute W -40
+KPX Racute Y -50
+KPX Racute Yacute -50
+KPX Racute Ydieresis -50
+KPX Rcaron O -20
+KPX Rcaron Oacute -20
+KPX Rcaron Ocircumflex -20
+KPX Rcaron Odieresis -20
+KPX Rcaron Ograve -20
+KPX Rcaron Ohungarumlaut -20
+KPX Rcaron Omacron -20
+KPX Rcaron Oslash -20
+KPX Rcaron Otilde -20
+KPX Rcaron T -20
+KPX Rcaron Tcaron -20
+KPX Rcaron Tcommaaccent -20
+KPX Rcaron U -20
+KPX Rcaron Uacute -20
+KPX Rcaron Ucircumflex -20
+KPX Rcaron Udieresis -20
+KPX Rcaron Ugrave -20
+KPX Rcaron Uhungarumlaut -20
+KPX Rcaron Umacron -20
+KPX Rcaron Uogonek -20
+KPX Rcaron Uring -20
+KPX Rcaron V -50
+KPX Rcaron W -40
+KPX Rcaron Y -50
+KPX Rcaron Yacute -50
+KPX Rcaron Ydieresis -50
+KPX Rcommaaccent O -20
+KPX Rcommaaccent Oacute -20
+KPX Rcommaaccent Ocircumflex -20
+KPX Rcommaaccent Odieresis -20
+KPX Rcommaaccent Ograve -20
+KPX Rcommaaccent Ohungarumlaut -20
+KPX Rcommaaccent Omacron -20
+KPX Rcommaaccent Oslash -20
+KPX Rcommaaccent Otilde -20
+KPX Rcommaaccent T -20
+KPX Rcommaaccent Tcaron -20
+KPX Rcommaaccent Tcommaaccent -20
+KPX Rcommaaccent U -20
+KPX Rcommaaccent Uacute -20
+KPX Rcommaaccent Ucircumflex -20
+KPX Rcommaaccent Udieresis -20
+KPX Rcommaaccent Ugrave -20
+KPX Rcommaaccent Uhungarumlaut -20
+KPX Rcommaaccent Umacron -20
+KPX Rcommaaccent Uogonek -20
+KPX Rcommaaccent Uring -20
+KPX Rcommaaccent V -50
+KPX Rcommaaccent W -40
+KPX Rcommaaccent Y -50
+KPX Rcommaaccent Yacute -50
+KPX Rcommaaccent Ydieresis -50
+KPX T A -90
+KPX T Aacute -90
+KPX T Abreve -90
+KPX T Acircumflex -90
+KPX T Adieresis -90
+KPX T Agrave -90
+KPX T Amacron -90
+KPX T Aogonek -90
+KPX T Aring -90
+KPX T Atilde -90
+KPX T O -40
+KPX T Oacute -40
+KPX T Ocircumflex -40
+KPX T Odieresis -40
+KPX T Ograve -40
+KPX T Ohungarumlaut -40
+KPX T Omacron -40
+KPX T Oslash -40
+KPX T Otilde -40
+KPX T a -80
+KPX T aacute -80
+KPX T abreve -80
+KPX T acircumflex -80
+KPX T adieresis -80
+KPX T agrave -80
+KPX T amacron -80
+KPX T aogonek -80
+KPX T aring -80
+KPX T atilde -80
+KPX T colon -40
+KPX T comma -80
+KPX T e -60
+KPX T eacute -60
+KPX T ecaron -60
+KPX T ecircumflex -60
+KPX T edieresis -60
+KPX T edotaccent -60
+KPX T egrave -60
+KPX T emacron -60
+KPX T eogonek -60
+KPX T hyphen -120
+KPX T o -80
+KPX T oacute -80
+KPX T ocircumflex -80
+KPX T odieresis -80
+KPX T ograve -80
+KPX T ohungarumlaut -80
+KPX T omacron -80
+KPX T oslash -80
+KPX T otilde -80
+KPX T period -80
+KPX T r -80
+KPX T racute -80
+KPX T rcommaaccent -80
+KPX T semicolon -40
+KPX T u -90
+KPX T uacute -90
+KPX T ucircumflex -90
+KPX T udieresis -90
+KPX T ugrave -90
+KPX T uhungarumlaut -90
+KPX T umacron -90
+KPX T uogonek -90
+KPX T uring -90
+KPX T w -60
+KPX T y -60
+KPX T yacute -60
+KPX T ydieresis -60
+KPX Tcaron A -90
+KPX Tcaron Aacute -90
+KPX Tcaron Abreve -90
+KPX Tcaron Acircumflex -90
+KPX Tcaron Adieresis -90
+KPX Tcaron Agrave -90
+KPX Tcaron Amacron -90
+KPX Tcaron Aogonek -90
+KPX Tcaron Aring -90
+KPX Tcaron Atilde -90
+KPX Tcaron O -40
+KPX Tcaron Oacute -40
+KPX Tcaron Ocircumflex -40
+KPX Tcaron Odieresis -40
+KPX Tcaron Ograve -40
+KPX Tcaron Ohungarumlaut -40
+KPX Tcaron Omacron -40
+KPX Tcaron Oslash -40
+KPX Tcaron Otilde -40
+KPX Tcaron a -80
+KPX Tcaron aacute -80
+KPX Tcaron abreve -80
+KPX Tcaron acircumflex -80
+KPX Tcaron adieresis -80
+KPX Tcaron agrave -80
+KPX Tcaron amacron -80
+KPX Tcaron aogonek -80
+KPX Tcaron aring -80
+KPX Tcaron atilde -80
+KPX Tcaron colon -40
+KPX Tcaron comma -80
+KPX Tcaron e -60
+KPX Tcaron eacute -60
+KPX Tcaron ecaron -60
+KPX Tcaron ecircumflex -60
+KPX Tcaron edieresis -60
+KPX Tcaron edotaccent -60
+KPX Tcaron egrave -60
+KPX Tcaron emacron -60
+KPX Tcaron eogonek -60
+KPX Tcaron hyphen -120
+KPX Tcaron o -80
+KPX Tcaron oacute -80
+KPX Tcaron ocircumflex -80
+KPX Tcaron odieresis -80
+KPX Tcaron ograve -80
+KPX Tcaron ohungarumlaut -80
+KPX Tcaron omacron -80
+KPX Tcaron oslash -80
+KPX Tcaron otilde -80
+KPX Tcaron period -80
+KPX Tcaron r -80
+KPX Tcaron racute -80
+KPX Tcaron rcommaaccent -80
+KPX Tcaron semicolon -40
+KPX Tcaron u -90
+KPX Tcaron uacute -90
+KPX Tcaron ucircumflex -90
+KPX Tcaron udieresis -90
+KPX Tcaron ugrave -90
+KPX Tcaron uhungarumlaut -90
+KPX Tcaron umacron -90
+KPX Tcaron uogonek -90
+KPX Tcaron uring -90
+KPX Tcaron w -60
+KPX Tcaron y -60
+KPX Tcaron yacute -60
+KPX Tcaron ydieresis -60
+KPX Tcommaaccent A -90
+KPX Tcommaaccent Aacute -90
+KPX Tcommaaccent Abreve -90
+KPX Tcommaaccent Acircumflex -90
+KPX Tcommaaccent Adieresis -90
+KPX Tcommaaccent Agrave -90
+KPX Tcommaaccent Amacron -90
+KPX Tcommaaccent Aogonek -90
+KPX Tcommaaccent Aring -90
+KPX Tcommaaccent Atilde -90
+KPX Tcommaaccent O -40
+KPX Tcommaaccent Oacute -40
+KPX Tcommaaccent Ocircumflex -40
+KPX Tcommaaccent Odieresis -40
+KPX Tcommaaccent Ograve -40
+KPX Tcommaaccent Ohungarumlaut -40
+KPX Tcommaaccent Omacron -40
+KPX Tcommaaccent Oslash -40
+KPX Tcommaaccent Otilde -40
+KPX Tcommaaccent a -80
+KPX Tcommaaccent aacute -80
+KPX Tcommaaccent abreve -80
+KPX Tcommaaccent acircumflex -80
+KPX Tcommaaccent adieresis -80
+KPX Tcommaaccent agrave -80
+KPX Tcommaaccent amacron -80
+KPX Tcommaaccent aogonek -80
+KPX Tcommaaccent aring -80
+KPX Tcommaaccent atilde -80
+KPX Tcommaaccent colon -40
+KPX Tcommaaccent comma -80
+KPX Tcommaaccent e -60
+KPX Tcommaaccent eacute -60
+KPX Tcommaaccent ecaron -60
+KPX Tcommaaccent ecircumflex -60
+KPX Tcommaaccent edieresis -60
+KPX Tcommaaccent edotaccent -60
+KPX Tcommaaccent egrave -60
+KPX Tcommaaccent emacron -60
+KPX Tcommaaccent eogonek -60
+KPX Tcommaaccent hyphen -120
+KPX Tcommaaccent o -80
+KPX Tcommaaccent oacute -80
+KPX Tcommaaccent ocircumflex -80
+KPX Tcommaaccent odieresis -80
+KPX Tcommaaccent ograve -80
+KPX Tcommaaccent ohungarumlaut -80
+KPX Tcommaaccent omacron -80
+KPX Tcommaaccent oslash -80
+KPX Tcommaaccent otilde -80
+KPX Tcommaaccent period -80
+KPX Tcommaaccent r -80
+KPX Tcommaaccent racute -80
+KPX Tcommaaccent rcommaaccent -80
+KPX Tcommaaccent semicolon -40
+KPX Tcommaaccent u -90
+KPX Tcommaaccent uacute -90
+KPX Tcommaaccent ucircumflex -90
+KPX Tcommaaccent udieresis -90
+KPX Tcommaaccent ugrave -90
+KPX Tcommaaccent uhungarumlaut -90
+KPX Tcommaaccent umacron -90
+KPX Tcommaaccent uogonek -90
+KPX Tcommaaccent uring -90
+KPX Tcommaaccent w -60
+KPX Tcommaaccent y -60
+KPX Tcommaaccent yacute -60
+KPX Tcommaaccent ydieresis -60
+KPX U A -50
+KPX U Aacute -50
+KPX U Abreve -50
+KPX U Acircumflex -50
+KPX U Adieresis -50
+KPX U Agrave -50
+KPX U Amacron -50
+KPX U Aogonek -50
+KPX U Aring -50
+KPX U Atilde -50
+KPX U comma -30
+KPX U period -30
+KPX Uacute A -50
+KPX Uacute Aacute -50
+KPX Uacute Abreve -50
+KPX Uacute Acircumflex -50
+KPX Uacute Adieresis -50
+KPX Uacute Agrave -50
+KPX Uacute Amacron -50
+KPX Uacute Aogonek -50
+KPX Uacute Aring -50
+KPX Uacute Atilde -50
+KPX Uacute comma -30
+KPX Uacute period -30
+KPX Ucircumflex A -50
+KPX Ucircumflex Aacute -50
+KPX Ucircumflex Abreve -50
+KPX Ucircumflex Acircumflex -50
+KPX Ucircumflex Adieresis -50
+KPX Ucircumflex Agrave -50
+KPX Ucircumflex Amacron -50
+KPX Ucircumflex Aogonek -50
+KPX Ucircumflex Aring -50
+KPX Ucircumflex Atilde -50
+KPX Ucircumflex comma -30
+KPX Ucircumflex period -30
+KPX Udieresis A -50
+KPX Udieresis Aacute -50
+KPX Udieresis Abreve -50
+KPX Udieresis Acircumflex -50
+KPX Udieresis Adieresis -50
+KPX Udieresis Agrave -50
+KPX Udieresis Amacron -50
+KPX Udieresis Aogonek -50
+KPX Udieresis Aring -50
+KPX Udieresis Atilde -50
+KPX Udieresis comma -30
+KPX Udieresis period -30
+KPX Ugrave A -50
+KPX Ugrave Aacute -50
+KPX Ugrave Abreve -50
+KPX Ugrave Acircumflex -50
+KPX Ugrave Adieresis -50
+KPX Ugrave Agrave -50
+KPX Ugrave Amacron -50
+KPX Ugrave Aogonek -50
+KPX Ugrave Aring -50
+KPX Ugrave Atilde -50
+KPX Ugrave comma -30
+KPX Ugrave period -30
+KPX Uhungarumlaut A -50
+KPX Uhungarumlaut Aacute -50
+KPX Uhungarumlaut Abreve -50
+KPX Uhungarumlaut Acircumflex -50
+KPX Uhungarumlaut Adieresis -50
+KPX Uhungarumlaut Agrave -50
+KPX Uhungarumlaut Amacron -50
+KPX Uhungarumlaut Aogonek -50
+KPX Uhungarumlaut Aring -50
+KPX Uhungarumlaut Atilde -50
+KPX Uhungarumlaut comma -30
+KPX Uhungarumlaut period -30
+KPX Umacron A -50
+KPX Umacron Aacute -50
+KPX Umacron Abreve -50
+KPX Umacron Acircumflex -50
+KPX Umacron Adieresis -50
+KPX Umacron Agrave -50
+KPX Umacron Amacron -50
+KPX Umacron Aogonek -50
+KPX Umacron Aring -50
+KPX Umacron Atilde -50
+KPX Umacron comma -30
+KPX Umacron period -30
+KPX Uogonek A -50
+KPX Uogonek Aacute -50
+KPX Uogonek Abreve -50
+KPX Uogonek Acircumflex -50
+KPX Uogonek Adieresis -50
+KPX Uogonek Agrave -50
+KPX Uogonek Amacron -50
+KPX Uogonek Aogonek -50
+KPX Uogonek Aring -50
+KPX Uogonek Atilde -50
+KPX Uogonek comma -30
+KPX Uogonek period -30
+KPX Uring A -50
+KPX Uring Aacute -50
+KPX Uring Abreve -50
+KPX Uring Acircumflex -50
+KPX Uring Adieresis -50
+KPX Uring Agrave -50
+KPX Uring Amacron -50
+KPX Uring Aogonek -50
+KPX Uring Aring -50
+KPX Uring Atilde -50
+KPX Uring comma -30
+KPX Uring period -30
+KPX V A -80
+KPX V Aacute -80
+KPX V Abreve -80
+KPX V Acircumflex -80
+KPX V Adieresis -80
+KPX V Agrave -80
+KPX V Amacron -80
+KPX V Aogonek -80
+KPX V Aring -80
+KPX V Atilde -80
+KPX V G -50
+KPX V Gbreve -50
+KPX V Gcommaaccent -50
+KPX V O -50
+KPX V Oacute -50
+KPX V Ocircumflex -50
+KPX V Odieresis -50
+KPX V Ograve -50
+KPX V Ohungarumlaut -50
+KPX V Omacron -50
+KPX V Oslash -50
+KPX V Otilde -50
+KPX V a -60
+KPX V aacute -60
+KPX V abreve -60
+KPX V acircumflex -60
+KPX V adieresis -60
+KPX V agrave -60
+KPX V amacron -60
+KPX V aogonek -60
+KPX V aring -60
+KPX V atilde -60
+KPX V colon -40
+KPX V comma -120
+KPX V e -50
+KPX V eacute -50
+KPX V ecaron -50
+KPX V ecircumflex -50
+KPX V edieresis -50
+KPX V edotaccent -50
+KPX V egrave -50
+KPX V emacron -50
+KPX V eogonek -50
+KPX V hyphen -80
+KPX V o -90
+KPX V oacute -90
+KPX V ocircumflex -90
+KPX V odieresis -90
+KPX V ograve -90
+KPX V ohungarumlaut -90
+KPX V omacron -90
+KPX V oslash -90
+KPX V otilde -90
+KPX V period -120
+KPX V semicolon -40
+KPX V u -60
+KPX V uacute -60
+KPX V ucircumflex -60
+KPX V udieresis -60
+KPX V ugrave -60
+KPX V uhungarumlaut -60
+KPX V umacron -60
+KPX V uogonek -60
+KPX V uring -60
+KPX W A -60
+KPX W Aacute -60
+KPX W Abreve -60
+KPX W Acircumflex -60
+KPX W Adieresis -60
+KPX W Agrave -60
+KPX W Amacron -60
+KPX W Aogonek -60
+KPX W Aring -60
+KPX W Atilde -60
+KPX W O -20
+KPX W Oacute -20
+KPX W Ocircumflex -20
+KPX W Odieresis -20
+KPX W Ograve -20
+KPX W Ohungarumlaut -20
+KPX W Omacron -20
+KPX W Oslash -20
+KPX W Otilde -20
+KPX W a -40
+KPX W aacute -40
+KPX W abreve -40
+KPX W acircumflex -40
+KPX W adieresis -40
+KPX W agrave -40
+KPX W amacron -40
+KPX W aogonek -40
+KPX W aring -40
+KPX W atilde -40
+KPX W colon -10
+KPX W comma -80
+KPX W e -35
+KPX W eacute -35
+KPX W ecaron -35
+KPX W ecircumflex -35
+KPX W edieresis -35
+KPX W edotaccent -35
+KPX W egrave -35
+KPX W emacron -35
+KPX W eogonek -35
+KPX W hyphen -40
+KPX W o -60
+KPX W oacute -60
+KPX W ocircumflex -60
+KPX W odieresis -60
+KPX W ograve -60
+KPX W ohungarumlaut -60
+KPX W omacron -60
+KPX W oslash -60
+KPX W otilde -60
+KPX W period -80
+KPX W semicolon -10
+KPX W u -45
+KPX W uacute -45
+KPX W ucircumflex -45
+KPX W udieresis -45
+KPX W ugrave -45
+KPX W uhungarumlaut -45
+KPX W umacron -45
+KPX W uogonek -45
+KPX W uring -45
+KPX W y -20
+KPX W yacute -20
+KPX W ydieresis -20
+KPX Y A -110
+KPX Y Aacute -110
+KPX Y Abreve -110
+KPX Y Acircumflex -110
+KPX Y Adieresis -110
+KPX Y Agrave -110
+KPX Y Amacron -110
+KPX Y Aogonek -110
+KPX Y Aring -110
+KPX Y Atilde -110
+KPX Y O -70
+KPX Y Oacute -70
+KPX Y Ocircumflex -70
+KPX Y Odieresis -70
+KPX Y Ograve -70
+KPX Y Ohungarumlaut -70
+KPX Y Omacron -70
+KPX Y Oslash -70
+KPX Y Otilde -70
+KPX Y a -90
+KPX Y aacute -90
+KPX Y abreve -90
+KPX Y acircumflex -90
+KPX Y adieresis -90
+KPX Y agrave -90
+KPX Y amacron -90
+KPX Y aogonek -90
+KPX Y aring -90
+KPX Y atilde -90
+KPX Y colon -50
+KPX Y comma -100
+KPX Y e -80
+KPX Y eacute -80
+KPX Y ecaron -80
+KPX Y ecircumflex -80
+KPX Y edieresis -80
+KPX Y edotaccent -80
+KPX Y egrave -80
+KPX Y emacron -80
+KPX Y eogonek -80
+KPX Y o -100
+KPX Y oacute -100
+KPX Y ocircumflex -100
+KPX Y odieresis -100
+KPX Y ograve -100
+KPX Y ohungarumlaut -100
+KPX Y omacron -100
+KPX Y oslash -100
+KPX Y otilde -100
+KPX Y period -100
+KPX Y semicolon -50
+KPX Y u -100
+KPX Y uacute -100
+KPX Y ucircumflex -100
+KPX Y udieresis -100
+KPX Y ugrave -100
+KPX Y uhungarumlaut -100
+KPX Y umacron -100
+KPX Y uogonek -100
+KPX Y uring -100
+KPX Yacute A -110
+KPX Yacute Aacute -110
+KPX Yacute Abreve -110
+KPX Yacute Acircumflex -110
+KPX Yacute Adieresis -110
+KPX Yacute Agrave -110
+KPX Yacute Amacron -110
+KPX Yacute Aogonek -110
+KPX Yacute Aring -110
+KPX Yacute Atilde -110
+KPX Yacute O -70
+KPX Yacute Oacute -70
+KPX Yacute Ocircumflex -70
+KPX Yacute Odieresis -70
+KPX Yacute Ograve -70
+KPX Yacute Ohungarumlaut -70
+KPX Yacute Omacron -70
+KPX Yacute Oslash -70
+KPX Yacute Otilde -70
+KPX Yacute a -90
+KPX Yacute aacute -90
+KPX Yacute abreve -90
+KPX Yacute acircumflex -90
+KPX Yacute adieresis -90
+KPX Yacute agrave -90
+KPX Yacute amacron -90
+KPX Yacute aogonek -90
+KPX Yacute aring -90
+KPX Yacute atilde -90
+KPX Yacute colon -50
+KPX Yacute comma -100
+KPX Yacute e -80
+KPX Yacute eacute -80
+KPX Yacute ecaron -80
+KPX Yacute ecircumflex -80
+KPX Yacute edieresis -80
+KPX Yacute edotaccent -80
+KPX Yacute egrave -80
+KPX Yacute emacron -80
+KPX Yacute eogonek -80
+KPX Yacute o -100
+KPX Yacute oacute -100
+KPX Yacute ocircumflex -100
+KPX Yacute odieresis -100
+KPX Yacute ograve -100
+KPX Yacute ohungarumlaut -100
+KPX Yacute omacron -100
+KPX Yacute oslash -100
+KPX Yacute otilde -100
+KPX Yacute period -100
+KPX Yacute semicolon -50
+KPX Yacute u -100
+KPX Yacute uacute -100
+KPX Yacute ucircumflex -100
+KPX Yacute udieresis -100
+KPX Yacute ugrave -100
+KPX Yacute uhungarumlaut -100
+KPX Yacute umacron -100
+KPX Yacute uogonek -100
+KPX Yacute uring -100
+KPX Ydieresis A -110
+KPX Ydieresis Aacute -110
+KPX Ydieresis Abreve -110
+KPX Ydieresis Acircumflex -110
+KPX Ydieresis Adieresis -110
+KPX Ydieresis Agrave -110
+KPX Ydieresis Amacron -110
+KPX Ydieresis Aogonek -110
+KPX Ydieresis Aring -110
+KPX Ydieresis Atilde -110
+KPX Ydieresis O -70
+KPX Ydieresis Oacute -70
+KPX Ydieresis Ocircumflex -70
+KPX Ydieresis Odieresis -70
+KPX Ydieresis Ograve -70
+KPX Ydieresis Ohungarumlaut -70
+KPX Ydieresis Omacron -70
+KPX Ydieresis Oslash -70
+KPX Ydieresis Otilde -70
+KPX Ydieresis a -90
+KPX Ydieresis aacute -90
+KPX Ydieresis abreve -90
+KPX Ydieresis acircumflex -90
+KPX Ydieresis adieresis -90
+KPX Ydieresis agrave -90
+KPX Ydieresis amacron -90
+KPX Ydieresis aogonek -90
+KPX Ydieresis aring -90
+KPX Ydieresis atilde -90
+KPX Ydieresis colon -50
+KPX Ydieresis comma -100
+KPX Ydieresis e -80
+KPX Ydieresis eacute -80
+KPX Ydieresis ecaron -80
+KPX Ydieresis ecircumflex -80
+KPX Ydieresis edieresis -80
+KPX Ydieresis edotaccent -80
+KPX Ydieresis egrave -80
+KPX Ydieresis emacron -80
+KPX Ydieresis eogonek -80
+KPX Ydieresis o -100
+KPX Ydieresis oacute -100
+KPX Ydieresis ocircumflex -100
+KPX Ydieresis odieresis -100
+KPX Ydieresis ograve -100
+KPX Ydieresis ohungarumlaut -100
+KPX Ydieresis omacron -100
+KPX Ydieresis oslash -100
+KPX Ydieresis otilde -100
+KPX Ydieresis period -100
+KPX Ydieresis semicolon -50
+KPX Ydieresis u -100
+KPX Ydieresis uacute -100
+KPX Ydieresis ucircumflex -100
+KPX Ydieresis udieresis -100
+KPX Ydieresis ugrave -100
+KPX Ydieresis uhungarumlaut -100
+KPX Ydieresis umacron -100
+KPX Ydieresis uogonek -100
+KPX Ydieresis uring -100
+KPX a g -10
+KPX a gbreve -10
+KPX a gcommaaccent -10
+KPX a v -15
+KPX a w -15
+KPX a y -20
+KPX a yacute -20
+KPX a ydieresis -20
+KPX aacute g -10
+KPX aacute gbreve -10
+KPX aacute gcommaaccent -10
+KPX aacute v -15
+KPX aacute w -15
+KPX aacute y -20
+KPX aacute yacute -20
+KPX aacute ydieresis -20
+KPX abreve g -10
+KPX abreve gbreve -10
+KPX abreve gcommaaccent -10
+KPX abreve v -15
+KPX abreve w -15
+KPX abreve y -20
+KPX abreve yacute -20
+KPX abreve ydieresis -20
+KPX acircumflex g -10
+KPX acircumflex gbreve -10
+KPX acircumflex gcommaaccent -10
+KPX acircumflex v -15
+KPX acircumflex w -15
+KPX acircumflex y -20
+KPX acircumflex yacute -20
+KPX acircumflex ydieresis -20
+KPX adieresis g -10
+KPX adieresis gbreve -10
+KPX adieresis gcommaaccent -10
+KPX adieresis v -15
+KPX adieresis w -15
+KPX adieresis y -20
+KPX adieresis yacute -20
+KPX adieresis ydieresis -20
+KPX agrave g -10
+KPX agrave gbreve -10
+KPX agrave gcommaaccent -10
+KPX agrave v -15
+KPX agrave w -15
+KPX agrave y -20
+KPX agrave yacute -20
+KPX agrave ydieresis -20
+KPX amacron g -10
+KPX amacron gbreve -10
+KPX amacron gcommaaccent -10
+KPX amacron v -15
+KPX amacron w -15
+KPX amacron y -20
+KPX amacron yacute -20
+KPX amacron ydieresis -20
+KPX aogonek g -10
+KPX aogonek gbreve -10
+KPX aogonek gcommaaccent -10
+KPX aogonek v -15
+KPX aogonek w -15
+KPX aogonek y -20
+KPX aogonek yacute -20
+KPX aogonek ydieresis -20
+KPX aring g -10
+KPX aring gbreve -10
+KPX aring gcommaaccent -10
+KPX aring v -15
+KPX aring w -15
+KPX aring y -20
+KPX aring yacute -20
+KPX aring ydieresis -20
+KPX atilde g -10
+KPX atilde gbreve -10
+KPX atilde gcommaaccent -10
+KPX atilde v -15
+KPX atilde w -15
+KPX atilde y -20
+KPX atilde yacute -20
+KPX atilde ydieresis -20
+KPX b l -10
+KPX b lacute -10
+KPX b lcommaaccent -10
+KPX b lslash -10
+KPX b u -20
+KPX b uacute -20
+KPX b ucircumflex -20
+KPX b udieresis -20
+KPX b ugrave -20
+KPX b uhungarumlaut -20
+KPX b umacron -20
+KPX b uogonek -20
+KPX b uring -20
+KPX b v -20
+KPX b y -20
+KPX b yacute -20
+KPX b ydieresis -20
+KPX c h -10
+KPX c k -20
+KPX c kcommaaccent -20
+KPX c l -20
+KPX c lacute -20
+KPX c lcommaaccent -20
+KPX c lslash -20
+KPX c y -10
+KPX c yacute -10
+KPX c ydieresis -10
+KPX cacute h -10
+KPX cacute k -20
+KPX cacute kcommaaccent -20
+KPX cacute l -20
+KPX cacute lacute -20
+KPX cacute lcommaaccent -20
+KPX cacute lslash -20
+KPX cacute y -10
+KPX cacute yacute -10
+KPX cacute ydieresis -10
+KPX ccaron h -10
+KPX ccaron k -20
+KPX ccaron kcommaaccent -20
+KPX ccaron l -20
+KPX ccaron lacute -20
+KPX ccaron lcommaaccent -20
+KPX ccaron lslash -20
+KPX ccaron y -10
+KPX ccaron yacute -10
+KPX ccaron ydieresis -10
+KPX ccedilla h -10
+KPX ccedilla k -20
+KPX ccedilla kcommaaccent -20
+KPX ccedilla l -20
+KPX ccedilla lacute -20
+KPX ccedilla lcommaaccent -20
+KPX ccedilla lslash -20
+KPX ccedilla y -10
+KPX ccedilla yacute -10
+KPX ccedilla ydieresis -10
+KPX colon space -40
+KPX comma quotedblright -120
+KPX comma quoteright -120
+KPX comma space -40
+KPX d d -10
+KPX d dcroat -10
+KPX d v -15
+KPX d w -15
+KPX d y -15
+KPX d yacute -15
+KPX d ydieresis -15
+KPX dcroat d -10
+KPX dcroat dcroat -10
+KPX dcroat v -15
+KPX dcroat w -15
+KPX dcroat y -15
+KPX dcroat yacute -15
+KPX dcroat ydieresis -15
+KPX e comma 10
+KPX e period 20
+KPX e v -15
+KPX e w -15
+KPX e x -15
+KPX e y -15
+KPX e yacute -15
+KPX e ydieresis -15
+KPX eacute comma 10
+KPX eacute period 20
+KPX eacute v -15
+KPX eacute w -15
+KPX eacute x -15
+KPX eacute y -15
+KPX eacute yacute -15
+KPX eacute ydieresis -15
+KPX ecaron comma 10
+KPX ecaron period 20
+KPX ecaron v -15
+KPX ecaron w -15
+KPX ecaron x -15
+KPX ecaron y -15
+KPX ecaron yacute -15
+KPX ecaron ydieresis -15
+KPX ecircumflex comma 10
+KPX ecircumflex period 20
+KPX ecircumflex v -15
+KPX ecircumflex w -15
+KPX ecircumflex x -15
+KPX ecircumflex y -15
+KPX ecircumflex yacute -15
+KPX ecircumflex ydieresis -15
+KPX edieresis comma 10
+KPX edieresis period 20
+KPX edieresis v -15
+KPX edieresis w -15
+KPX edieresis x -15
+KPX edieresis y -15
+KPX edieresis yacute -15
+KPX edieresis ydieresis -15
+KPX edotaccent comma 10
+KPX edotaccent period 20
+KPX edotaccent v -15
+KPX edotaccent w -15
+KPX edotaccent x -15
+KPX edotaccent y -15
+KPX edotaccent yacute -15
+KPX edotaccent ydieresis -15
+KPX egrave comma 10
+KPX egrave period 20
+KPX egrave v -15
+KPX egrave w -15
+KPX egrave x -15
+KPX egrave y -15
+KPX egrave yacute -15
+KPX egrave ydieresis -15
+KPX emacron comma 10
+KPX emacron period 20
+KPX emacron v -15
+KPX emacron w -15
+KPX emacron x -15
+KPX emacron y -15
+KPX emacron yacute -15
+KPX emacron ydieresis -15
+KPX eogonek comma 10
+KPX eogonek period 20
+KPX eogonek v -15
+KPX eogonek w -15
+KPX eogonek x -15
+KPX eogonek y -15
+KPX eogonek yacute -15
+KPX eogonek ydieresis -15
+KPX f comma -10
+KPX f e -10
+KPX f eacute -10
+KPX f ecaron -10
+KPX f ecircumflex -10
+KPX f edieresis -10
+KPX f edotaccent -10
+KPX f egrave -10
+KPX f emacron -10
+KPX f eogonek -10
+KPX f o -20
+KPX f oacute -20
+KPX f ocircumflex -20
+KPX f odieresis -20
+KPX f ograve -20
+KPX f ohungarumlaut -20
+KPX f omacron -20
+KPX f oslash -20
+KPX f otilde -20
+KPX f period -10
+KPX f quotedblright 30
+KPX f quoteright 30
+KPX g e 10
+KPX g eacute 10
+KPX g ecaron 10
+KPX g ecircumflex 10
+KPX g edieresis 10
+KPX g edotaccent 10
+KPX g egrave 10
+KPX g emacron 10
+KPX g eogonek 10
+KPX g g -10
+KPX g gbreve -10
+KPX g gcommaaccent -10
+KPX gbreve e 10
+KPX gbreve eacute 10
+KPX gbreve ecaron 10
+KPX gbreve ecircumflex 10
+KPX gbreve edieresis 10
+KPX gbreve edotaccent 10
+KPX gbreve egrave 10
+KPX gbreve emacron 10
+KPX gbreve eogonek 10
+KPX gbreve g -10
+KPX gbreve gbreve -10
+KPX gbreve gcommaaccent -10
+KPX gcommaaccent e 10
+KPX gcommaaccent eacute 10
+KPX gcommaaccent ecaron 10
+KPX gcommaaccent ecircumflex 10
+KPX gcommaaccent edieresis 10
+KPX gcommaaccent edotaccent 10
+KPX gcommaaccent egrave 10
+KPX gcommaaccent emacron 10
+KPX gcommaaccent eogonek 10
+KPX gcommaaccent g -10
+KPX gcommaaccent gbreve -10
+KPX gcommaaccent gcommaaccent -10
+KPX h y -20
+KPX h yacute -20
+KPX h ydieresis -20
+KPX k o -15
+KPX k oacute -15
+KPX k ocircumflex -15
+KPX k odieresis -15
+KPX k ograve -15
+KPX k ohungarumlaut -15
+KPX k omacron -15
+KPX k oslash -15
+KPX k otilde -15
+KPX kcommaaccent o -15
+KPX kcommaaccent oacute -15
+KPX kcommaaccent ocircumflex -15
+KPX kcommaaccent odieresis -15
+KPX kcommaaccent ograve -15
+KPX kcommaaccent ohungarumlaut -15
+KPX kcommaaccent omacron -15
+KPX kcommaaccent oslash -15
+KPX kcommaaccent otilde -15
+KPX l w -15
+KPX l y -15
+KPX l yacute -15
+KPX l ydieresis -15
+KPX lacute w -15
+KPX lacute y -15
+KPX lacute yacute -15
+KPX lacute ydieresis -15
+KPX lcommaaccent w -15
+KPX lcommaaccent y -15
+KPX lcommaaccent yacute -15
+KPX lcommaaccent ydieresis -15
+KPX lslash w -15
+KPX lslash y -15
+KPX lslash yacute -15
+KPX lslash ydieresis -15
+KPX m u -20
+KPX m uacute -20
+KPX m ucircumflex -20
+KPX m udieresis -20
+KPX m ugrave -20
+KPX m uhungarumlaut -20
+KPX m umacron -20
+KPX m uogonek -20
+KPX m uring -20
+KPX m y -30
+KPX m yacute -30
+KPX m ydieresis -30
+KPX n u -10
+KPX n uacute -10
+KPX n ucircumflex -10
+KPX n udieresis -10
+KPX n ugrave -10
+KPX n uhungarumlaut -10
+KPX n umacron -10
+KPX n uogonek -10
+KPX n uring -10
+KPX n v -40
+KPX n y -20
+KPX n yacute -20
+KPX n ydieresis -20
+KPX nacute u -10
+KPX nacute uacute -10
+KPX nacute ucircumflex -10
+KPX nacute udieresis -10
+KPX nacute ugrave -10
+KPX nacute uhungarumlaut -10
+KPX nacute umacron -10
+KPX nacute uogonek -10
+KPX nacute uring -10
+KPX nacute v -40
+KPX nacute y -20
+KPX nacute yacute -20
+KPX nacute ydieresis -20
+KPX ncaron u -10
+KPX ncaron uacute -10
+KPX ncaron ucircumflex -10
+KPX ncaron udieresis -10
+KPX ncaron ugrave -10
+KPX ncaron uhungarumlaut -10
+KPX ncaron umacron -10
+KPX ncaron uogonek -10
+KPX ncaron uring -10
+KPX ncaron v -40
+KPX ncaron y -20
+KPX ncaron yacute -20
+KPX ncaron ydieresis -20
+KPX ncommaaccent u -10
+KPX ncommaaccent uacute -10
+KPX ncommaaccent ucircumflex -10
+KPX ncommaaccent udieresis -10
+KPX ncommaaccent ugrave -10
+KPX ncommaaccent uhungarumlaut -10
+KPX ncommaaccent umacron -10
+KPX ncommaaccent uogonek -10
+KPX ncommaaccent uring -10
+KPX ncommaaccent v -40
+KPX ncommaaccent y -20
+KPX ncommaaccent yacute -20
+KPX ncommaaccent ydieresis -20
+KPX ntilde u -10
+KPX ntilde uacute -10
+KPX ntilde ucircumflex -10
+KPX ntilde udieresis -10
+KPX ntilde ugrave -10
+KPX ntilde uhungarumlaut -10
+KPX ntilde umacron -10
+KPX ntilde uogonek -10
+KPX ntilde uring -10
+KPX ntilde v -40
+KPX ntilde y -20
+KPX ntilde yacute -20
+KPX ntilde ydieresis -20
+KPX o v -20
+KPX o w -15
+KPX o x -30
+KPX o y -20
+KPX o yacute -20
+KPX o ydieresis -20
+KPX oacute v -20
+KPX oacute w -15
+KPX oacute x -30
+KPX oacute y -20
+KPX oacute yacute -20
+KPX oacute ydieresis -20
+KPX ocircumflex v -20
+KPX ocircumflex w -15
+KPX ocircumflex x -30
+KPX ocircumflex y -20
+KPX ocircumflex yacute -20
+KPX ocircumflex ydieresis -20
+KPX odieresis v -20
+KPX odieresis w -15
+KPX odieresis x -30
+KPX odieresis y -20
+KPX odieresis yacute -20
+KPX odieresis ydieresis -20
+KPX ograve v -20
+KPX ograve w -15
+KPX ograve x -30
+KPX ograve y -20
+KPX ograve yacute -20
+KPX ograve ydieresis -20
+KPX ohungarumlaut v -20
+KPX ohungarumlaut w -15
+KPX ohungarumlaut x -30
+KPX ohungarumlaut y -20
+KPX ohungarumlaut yacute -20
+KPX ohungarumlaut ydieresis -20
+KPX omacron v -20
+KPX omacron w -15
+KPX omacron x -30
+KPX omacron y -20
+KPX omacron yacute -20
+KPX omacron ydieresis -20
+KPX oslash v -20
+KPX oslash w -15
+KPX oslash x -30
+KPX oslash y -20
+KPX oslash yacute -20
+KPX oslash ydieresis -20
+KPX otilde v -20
+KPX otilde w -15
+KPX otilde x -30
+KPX otilde y -20
+KPX otilde yacute -20
+KPX otilde ydieresis -20
+KPX p y -15
+KPX p yacute -15
+KPX p ydieresis -15
+KPX period quotedblright -120
+KPX period quoteright -120
+KPX period space -40
+KPX quotedblright space -80
+KPX quoteleft quoteleft -46
+KPX quoteright d -80
+KPX quoteright dcroat -80
+KPX quoteright l -20
+KPX quoteright lacute -20
+KPX quoteright lcommaaccent -20
+KPX quoteright lslash -20
+KPX quoteright quoteright -46
+KPX quoteright r -40
+KPX quoteright racute -40
+KPX quoteright rcaron -40
+KPX quoteright rcommaaccent -40
+KPX quoteright s -60
+KPX quoteright sacute -60
+KPX quoteright scaron -60
+KPX quoteright scedilla -60
+KPX quoteright scommaaccent -60
+KPX quoteright space -80
+KPX quoteright v -20
+KPX r c -20
+KPX r cacute -20
+KPX r ccaron -20
+KPX r ccedilla -20
+KPX r comma -60
+KPX r d -20
+KPX r dcroat -20
+KPX r g -15
+KPX r gbreve -15
+KPX r gcommaaccent -15
+KPX r hyphen -20
+KPX r o -20
+KPX r oacute -20
+KPX r ocircumflex -20
+KPX r odieresis -20
+KPX r ograve -20
+KPX r ohungarumlaut -20
+KPX r omacron -20
+KPX r oslash -20
+KPX r otilde -20
+KPX r period -60
+KPX r q -20
+KPX r s -15
+KPX r sacute -15
+KPX r scaron -15
+KPX r scedilla -15
+KPX r scommaaccent -15
+KPX r t 20
+KPX r tcommaaccent 20
+KPX r v 10
+KPX r y 10
+KPX r yacute 10
+KPX r ydieresis 10
+KPX racute c -20
+KPX racute cacute -20
+KPX racute ccaron -20
+KPX racute ccedilla -20
+KPX racute comma -60
+KPX racute d -20
+KPX racute dcroat -20
+KPX racute g -15
+KPX racute gbreve -15
+KPX racute gcommaaccent -15
+KPX racute hyphen -20
+KPX racute o -20
+KPX racute oacute -20
+KPX racute ocircumflex -20
+KPX racute odieresis -20
+KPX racute ograve -20
+KPX racute ohungarumlaut -20
+KPX racute omacron -20
+KPX racute oslash -20
+KPX racute otilde -20
+KPX racute period -60
+KPX racute q -20
+KPX racute s -15
+KPX racute sacute -15
+KPX racute scaron -15
+KPX racute scedilla -15
+KPX racute scommaaccent -15
+KPX racute t 20
+KPX racute tcommaaccent 20
+KPX racute v 10
+KPX racute y 10
+KPX racute yacute 10
+KPX racute ydieresis 10
+KPX rcaron c -20
+KPX rcaron cacute -20
+KPX rcaron ccaron -20
+KPX rcaron ccedilla -20
+KPX rcaron comma -60
+KPX rcaron d -20
+KPX rcaron dcroat -20
+KPX rcaron g -15
+KPX rcaron gbreve -15
+KPX rcaron gcommaaccent -15
+KPX rcaron hyphen -20
+KPX rcaron o -20
+KPX rcaron oacute -20
+KPX rcaron ocircumflex -20
+KPX rcaron odieresis -20
+KPX rcaron ograve -20
+KPX rcaron ohungarumlaut -20
+KPX rcaron omacron -20
+KPX rcaron oslash -20
+KPX rcaron otilde -20
+KPX rcaron period -60
+KPX rcaron q -20
+KPX rcaron s -15
+KPX rcaron sacute -15
+KPX rcaron scaron -15
+KPX rcaron scedilla -15
+KPX rcaron scommaaccent -15
+KPX rcaron t 20
+KPX rcaron tcommaaccent 20
+KPX rcaron v 10
+KPX rcaron y 10
+KPX rcaron yacute 10
+KPX rcaron ydieresis 10
+KPX rcommaaccent c -20
+KPX rcommaaccent cacute -20
+KPX rcommaaccent ccaron -20
+KPX rcommaaccent ccedilla -20
+KPX rcommaaccent comma -60
+KPX rcommaaccent d -20
+KPX rcommaaccent dcroat -20
+KPX rcommaaccent g -15
+KPX rcommaaccent gbreve -15
+KPX rcommaaccent gcommaaccent -15
+KPX rcommaaccent hyphen -20
+KPX rcommaaccent o -20
+KPX rcommaaccent oacute -20
+KPX rcommaaccent ocircumflex -20
+KPX rcommaaccent odieresis -20
+KPX rcommaaccent ograve -20
+KPX rcommaaccent ohungarumlaut -20
+KPX rcommaaccent omacron -20
+KPX rcommaaccent oslash -20
+KPX rcommaaccent otilde -20
+KPX rcommaaccent period -60
+KPX rcommaaccent q -20
+KPX rcommaaccent s -15
+KPX rcommaaccent sacute -15
+KPX rcommaaccent scaron -15
+KPX rcommaaccent scedilla -15
+KPX rcommaaccent scommaaccent -15
+KPX rcommaaccent t 20
+KPX rcommaaccent tcommaaccent 20
+KPX rcommaaccent v 10
+KPX rcommaaccent y 10
+KPX rcommaaccent yacute 10
+KPX rcommaaccent ydieresis 10
+KPX s w -15
+KPX sacute w -15
+KPX scaron w -15
+KPX scedilla w -15
+KPX scommaaccent w -15
+KPX semicolon space -40
+KPX space T -100
+KPX space Tcaron -100
+KPX space Tcommaaccent -100
+KPX space V -80
+KPX space W -80
+KPX space Y -120
+KPX space Yacute -120
+KPX space Ydieresis -120
+KPX space quotedblleft -80
+KPX space quoteleft -60
+KPX v a -20
+KPX v aacute -20
+KPX v abreve -20
+KPX v acircumflex -20
+KPX v adieresis -20
+KPX v agrave -20
+KPX v amacron -20
+KPX v aogonek -20
+KPX v aring -20
+KPX v atilde -20
+KPX v comma -80
+KPX v o -30
+KPX v oacute -30
+KPX v ocircumflex -30
+KPX v odieresis -30
+KPX v ograve -30
+KPX v ohungarumlaut -30
+KPX v omacron -30
+KPX v oslash -30
+KPX v otilde -30
+KPX v period -80
+KPX w comma -40
+KPX w o -20
+KPX w oacute -20
+KPX w ocircumflex -20
+KPX w odieresis -20
+KPX w ograve -20
+KPX w ohungarumlaut -20
+KPX w omacron -20
+KPX w oslash -20
+KPX w otilde -20
+KPX w period -40
+KPX x e -10
+KPX x eacute -10
+KPX x ecaron -10
+KPX x ecircumflex -10
+KPX x edieresis -10
+KPX x edotaccent -10
+KPX x egrave -10
+KPX x emacron -10
+KPX x eogonek -10
+KPX y a -30
+KPX y aacute -30
+KPX y abreve -30
+KPX y acircumflex -30
+KPX y adieresis -30
+KPX y agrave -30
+KPX y amacron -30
+KPX y aogonek -30
+KPX y aring -30
+KPX y atilde -30
+KPX y comma -80
+KPX y e -10
+KPX y eacute -10
+KPX y ecaron -10
+KPX y ecircumflex -10
+KPX y edieresis -10
+KPX y edotaccent -10
+KPX y egrave -10
+KPX y emacron -10
+KPX y eogonek -10
+KPX y o -25
+KPX y oacute -25
+KPX y ocircumflex -25
+KPX y odieresis -25
+KPX y ograve -25
+KPX y ohungarumlaut -25
+KPX y omacron -25
+KPX y oslash -25
+KPX y otilde -25
+KPX y period -80
+KPX yacute a -30
+KPX yacute aacute -30
+KPX yacute abreve -30
+KPX yacute acircumflex -30
+KPX yacute adieresis -30
+KPX yacute agrave -30
+KPX yacute amacron -30
+KPX yacute aogonek -30
+KPX yacute aring -30
+KPX yacute atilde -30
+KPX yacute comma -80
+KPX yacute e -10
+KPX yacute eacute -10
+KPX yacute ecaron -10
+KPX yacute ecircumflex -10
+KPX yacute edieresis -10
+KPX yacute edotaccent -10
+KPX yacute egrave -10
+KPX yacute emacron -10
+KPX yacute eogonek -10
+KPX yacute o -25
+KPX yacute oacute -25
+KPX yacute ocircumflex -25
+KPX yacute odieresis -25
+KPX yacute ograve -25
+KPX yacute ohungarumlaut -25
+KPX yacute omacron -25
+KPX yacute oslash -25
+KPX yacute otilde -25
+KPX yacute period -80
+KPX ydieresis a -30
+KPX ydieresis aacute -30
+KPX ydieresis abreve -30
+KPX ydieresis acircumflex -30
+KPX ydieresis adieresis -30
+KPX ydieresis agrave -30
+KPX ydieresis amacron -30
+KPX ydieresis aogonek -30
+KPX ydieresis aring -30
+KPX ydieresis atilde -30
+KPX ydieresis comma -80
+KPX ydieresis e -10
+KPX ydieresis eacute -10
+KPX ydieresis ecaron -10
+KPX ydieresis ecircumflex -10
+KPX ydieresis edieresis -10
+KPX ydieresis edotaccent -10
+KPX ydieresis egrave -10
+KPX ydieresis emacron -10
+KPX ydieresis eogonek -10
+KPX ydieresis o -25
+KPX ydieresis oacute -25
+KPX ydieresis ocircumflex -25
+KPX ydieresis odieresis -25
+KPX ydieresis ograve -25
+KPX ydieresis ohungarumlaut -25
+KPX ydieresis omacron -25
+KPX ydieresis oslash -25
+KPX ydieresis otilde -25
+KPX ydieresis period -80
+KPX z e 10
+KPX z eacute 10
+KPX z ecaron 10
+KPX z ecircumflex 10
+KPX z edieresis 10
+KPX z edotaccent 10
+KPX z egrave 10
+KPX z emacron 10
+KPX z eogonek 10
+KPX zacute e 10
+KPX zacute eacute 10
+KPX zacute ecaron 10
+KPX zacute ecircumflex 10
+KPX zacute edieresis 10
+KPX zacute edotaccent 10
+KPX zacute egrave 10
+KPX zacute emacron 10
+KPX zacute eogonek 10
+KPX zcaron e 10
+KPX zcaron eacute 10
+KPX zcaron ecaron 10
+KPX zcaron ecircumflex 10
+KPX zcaron edieresis 10
+KPX zcaron edotaccent 10
+KPX zcaron egrave 10
+KPX zcaron emacron 10
+KPX zcaron eogonek 10
+KPX zdotaccent e 10
+KPX zdotaccent eacute 10
+KPX zdotaccent ecaron 10
+KPX zdotaccent ecircumflex 10
+KPX zdotaccent edieresis 10
+KPX zdotaccent edotaccent 10
+KPX zdotaccent egrave 10
+KPX zdotaccent emacron 10
+KPX zdotaccent eogonek 10
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/src/fonts/Adobe-Core35_AFMs-314/Helvetica-Narrow.afm b/src/fonts/Adobe-Core35_AFMs-314/Helvetica-Narrow.afm
new file mode 100644
index 0000000..4922029
--- /dev/null
+++ b/src/fonts/Adobe-Core35_AFMs-314/Helvetica-Narrow.afm
@@ -0,0 +1,3049 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Fri May 2 17:00:45 1997
+Comment UniqueID 43179
+Comment VMusage 14960 69346
+FontName Helvetica-Narrow
+FullName Helvetica Narrow
+FamilyName Helvetica
+Weight Medium
+ItalicAngle 0
+IsFixedPitch false
+FontBBox -136 -225 820 931
+UnderlinePosition -100
+UnderlineThickness 50
+Version 002.000
+Notice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries.
+EncodingScheme AdobeStandardEncoding
+CapHeight 718
+XHeight 523
+Ascender 718
+Descender -207
+StdHW 76
+StdVW 88
+StartCharMetrics 314
+C 32 ; WX 228 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 228 ; N exclam ; B 74 0 153 718 ;
+C 34 ; WX 291 ; N quotedbl ; B 57 463 234 718 ;
+C 35 ; WX 456 ; N numbersign ; B 23 0 434 688 ;
+C 36 ; WX 456 ; N dollar ; B 26 -115 426 775 ;
+C 37 ; WX 729 ; N percent ; B 32 -19 697 703 ;
+C 38 ; WX 547 ; N ampersand ; B 36 -15 529 718 ;
+C 39 ; WX 182 ; N quoteright ; B 43 463 129 718 ;
+C 40 ; WX 273 ; N parenleft ; B 56 -207 245 733 ;
+C 41 ; WX 273 ; N parenright ; B 28 -207 217 733 ;
+C 42 ; WX 319 ; N asterisk ; B 32 431 286 718 ;
+C 43 ; WX 479 ; N plus ; B 32 0 447 505 ;
+C 44 ; WX 228 ; N comma ; B 71 -147 157 106 ;
+C 45 ; WX 273 ; N hyphen ; B 36 232 237 322 ;
+C 46 ; WX 228 ; N period ; B 71 0 157 106 ;
+C 47 ; WX 228 ; N slash ; B -14 -19 242 737 ;
+C 48 ; WX 456 ; N zero ; B 30 -19 426 703 ;
+C 49 ; WX 456 ; N one ; B 83 0 294 703 ;
+C 50 ; WX 456 ; N two ; B 21 0 416 703 ;
+C 51 ; WX 456 ; N three ; B 28 -19 428 703 ;
+C 52 ; WX 456 ; N four ; B 21 0 429 703 ;
+C 53 ; WX 456 ; N five ; B 26 -19 421 688 ;
+C 54 ; WX 456 ; N six ; B 31 -19 425 703 ;
+C 55 ; WX 456 ; N seven ; B 30 0 429 688 ;
+C 56 ; WX 456 ; N eight ; B 31 -19 424 703 ;
+C 57 ; WX 456 ; N nine ; B 34 -19 421 703 ;
+C 58 ; WX 228 ; N colon ; B 71 0 157 516 ;
+C 59 ; WX 228 ; N semicolon ; B 71 -147 157 516 ;
+C 60 ; WX 479 ; N less ; B 39 11 440 495 ;
+C 61 ; WX 479 ; N equal ; B 32 115 447 390 ;
+C 62 ; WX 479 ; N greater ; B 39 11 440 495 ;
+C 63 ; WX 456 ; N question ; B 46 0 403 727 ;
+C 64 ; WX 832 ; N at ; B 121 -19 712 737 ;
+C 65 ; WX 547 ; N A ; B 11 0 536 718 ;
+C 66 ; WX 547 ; N B ; B 61 0 514 718 ;
+C 67 ; WX 592 ; N C ; B 36 -19 558 737 ;
+C 68 ; WX 592 ; N D ; B 66 0 553 718 ;
+C 69 ; WX 547 ; N E ; B 71 0 505 718 ;
+C 70 ; WX 501 ; N F ; B 71 0 478 718 ;
+C 71 ; WX 638 ; N G ; B 39 -19 577 737 ;
+C 72 ; WX 592 ; N H ; B 63 0 530 718 ;
+C 73 ; WX 228 ; N I ; B 75 0 154 718 ;
+C 74 ; WX 410 ; N J ; B 14 -19 351 718 ;
+C 75 ; WX 547 ; N K ; B 62 0 544 718 ;
+C 76 ; WX 456 ; N L ; B 62 0 440 718 ;
+C 77 ; WX 683 ; N M ; B 60 0 624 718 ;
+C 78 ; WX 592 ; N N ; B 62 0 530 718 ;
+C 79 ; WX 638 ; N O ; B 32 -19 606 737 ;
+C 80 ; WX 547 ; N P ; B 71 0 510 718 ;
+C 81 ; WX 638 ; N Q ; B 32 -56 606 737 ;
+C 82 ; WX 592 ; N R ; B 72 0 561 718 ;
+C 83 ; WX 547 ; N S ; B 40 -19 508 737 ;
+C 84 ; WX 501 ; N T ; B 11 0 490 718 ;
+C 85 ; WX 592 ; N U ; B 65 -19 528 718 ;
+C 86 ; WX 547 ; N V ; B 16 0 531 718 ;
+C 87 ; WX 774 ; N W ; B 13 0 761 718 ;
+C 88 ; WX 547 ; N X ; B 16 0 531 718 ;
+C 89 ; WX 547 ; N Y ; B 11 0 535 718 ;
+C 90 ; WX 501 ; N Z ; B 19 0 482 718 ;
+C 91 ; WX 228 ; N bracketleft ; B 52 -196 205 722 ;
+C 92 ; WX 228 ; N backslash ; B -14 -19 242 737 ;
+C 93 ; WX 228 ; N bracketright ; B 23 -196 176 722 ;
+C 94 ; WX 385 ; N asciicircum ; B -11 264 396 688 ;
+C 95 ; WX 456 ; N underscore ; B 0 -125 456 -75 ;
+C 96 ; WX 182 ; N quoteleft ; B 53 470 139 725 ;
+C 97 ; WX 456 ; N a ; B 30 -15 435 538 ;
+C 98 ; WX 456 ; N b ; B 48 -15 424 718 ;
+C 99 ; WX 410 ; N c ; B 25 -15 391 538 ;
+C 100 ; WX 456 ; N d ; B 29 -15 409 718 ;
+C 101 ; WX 456 ; N e ; B 33 -15 423 538 ;
+C 102 ; WX 228 ; N f ; B 11 0 215 728 ; L i fi ; L l fl ;
+C 103 ; WX 456 ; N g ; B 33 -220 409 538 ;
+C 104 ; WX 456 ; N h ; B 53 0 403 718 ;
+C 105 ; WX 182 ; N i ; B 55 0 127 718 ;
+C 106 ; WX 182 ; N j ; B -13 -210 127 718 ;
+C 107 ; WX 410 ; N k ; B 55 0 411 718 ;
+C 108 ; WX 182 ; N l ; B 55 0 127 718 ;
+C 109 ; WX 683 ; N m ; B 53 0 631 538 ;
+C 110 ; WX 456 ; N n ; B 53 0 403 538 ;
+C 111 ; WX 456 ; N o ; B 29 -14 427 538 ;
+C 112 ; WX 456 ; N p ; B 48 -207 424 538 ;
+C 113 ; WX 456 ; N q ; B 29 -207 405 538 ;
+C 114 ; WX 273 ; N r ; B 63 0 272 538 ;
+C 115 ; WX 410 ; N s ; B 26 -15 380 538 ;
+C 116 ; WX 228 ; N t ; B 11 -7 211 669 ;
+C 117 ; WX 456 ; N u ; B 56 -15 401 523 ;
+C 118 ; WX 410 ; N v ; B 7 0 403 523 ;
+C 119 ; WX 592 ; N w ; B 11 0 581 523 ;
+C 120 ; WX 410 ; N x ; B 9 0 402 523 ;
+C 121 ; WX 410 ; N y ; B 9 -214 401 523 ;
+C 122 ; WX 410 ; N z ; B 25 0 385 523 ;
+C 123 ; WX 274 ; N braceleft ; B 34 -196 239 722 ;
+C 124 ; WX 213 ; N bar ; B 77 -225 137 775 ;
+C 125 ; WX 274 ; N braceright ; B 34 -196 239 722 ;
+C 126 ; WX 479 ; N asciitilde ; B 50 180 429 326 ;
+C 161 ; WX 273 ; N exclamdown ; B 97 -195 176 523 ;
+C 162 ; WX 456 ; N cent ; B 42 -115 421 623 ;
+C 163 ; WX 456 ; N sterling ; B 27 -16 442 718 ;
+C 164 ; WX 137 ; N fraction ; B -136 -19 273 703 ;
+C 165 ; WX 456 ; N yen ; B 2 0 453 688 ;
+C 166 ; WX 456 ; N florin ; B -9 -207 411 737 ;
+C 167 ; WX 456 ; N section ; B 35 -191 420 737 ;
+C 168 ; WX 456 ; N currency ; B 23 99 433 603 ;
+C 169 ; WX 157 ; N quotesingle ; B 48 463 108 718 ;
+C 170 ; WX 273 ; N quotedblleft ; B 31 470 252 725 ;
+C 171 ; WX 456 ; N guillemotleft ; B 80 108 376 446 ;
+C 172 ; WX 273 ; N guilsinglleft ; B 72 108 201 446 ;
+C 173 ; WX 273 ; N guilsinglright ; B 72 108 201 446 ;
+C 174 ; WX 410 ; N fi ; B 11 0 356 728 ;
+C 175 ; WX 410 ; N fl ; B 11 0 354 728 ;
+C 177 ; WX 456 ; N endash ; B 0 240 456 313 ;
+C 178 ; WX 456 ; N dagger ; B 35 -159 421 718 ;
+C 179 ; WX 456 ; N daggerdbl ; B 35 -159 421 718 ;
+C 180 ; WX 228 ; N periodcentered ; B 63 190 166 315 ;
+C 182 ; WX 440 ; N paragraph ; B 15 -173 408 718 ;
+C 183 ; WX 287 ; N bullet ; B 15 202 273 517 ;
+C 184 ; WX 182 ; N quotesinglbase ; B 43 -149 129 106 ;
+C 185 ; WX 273 ; N quotedblbase ; B 21 -149 242 106 ;
+C 186 ; WX 273 ; N quotedblright ; B 21 463 242 718 ;
+C 187 ; WX 456 ; N guillemotright ; B 80 108 376 446 ;
+C 188 ; WX 820 ; N ellipsis ; B 94 0 726 106 ;
+C 189 ; WX 820 ; N perthousand ; B 6 -19 815 703 ;
+C 191 ; WX 501 ; N questiondown ; B 75 -201 432 525 ;
+C 193 ; WX 273 ; N grave ; B 11 593 173 734 ;
+C 194 ; WX 273 ; N acute ; B 100 593 262 734 ;
+C 195 ; WX 273 ; N circumflex ; B 17 593 256 734 ;
+C 196 ; WX 273 ; N tilde ; B -3 606 276 722 ;
+C 197 ; WX 273 ; N macron ; B 8 627 265 684 ;
+C 198 ; WX 273 ; N breve ; B 11 595 263 731 ;
+C 199 ; WX 273 ; N dotaccent ; B 99 604 174 706 ;
+C 200 ; WX 273 ; N dieresis ; B 33 604 240 706 ;
+C 202 ; WX 273 ; N ring ; B 62 572 212 756 ;
+C 203 ; WX 273 ; N cedilla ; B 37 -225 212 0 ;
+C 205 ; WX 273 ; N hungarumlaut ; B 25 593 335 734 ;
+C 206 ; WX 273 ; N ogonek ; B 60 -225 235 0 ;
+C 207 ; WX 273 ; N caron ; B 17 593 256 734 ;
+C 208 ; WX 820 ; N emdash ; B 0 240 820 313 ;
+C 225 ; WX 820 ; N AE ; B 7 0 780 718 ;
+C 227 ; WX 303 ; N ordfeminine ; B 20 405 284 737 ;
+C 232 ; WX 456 ; N Lslash ; B -16 0 440 718 ;
+C 233 ; WX 638 ; N Oslash ; B 32 -19 607 737 ;
+C 234 ; WX 820 ; N OE ; B 30 -19 791 737 ;
+C 235 ; WX 299 ; N ordmasculine ; B 21 405 280 737 ;
+C 241 ; WX 729 ; N ae ; B 30 -15 695 538 ;
+C 245 ; WX 228 ; N dotlessi ; B 78 0 150 523 ;
+C 248 ; WX 182 ; N lslash ; B -16 0 198 718 ;
+C 249 ; WX 501 ; N oslash ; B 23 -22 440 545 ;
+C 250 ; WX 774 ; N oe ; B 29 -15 740 538 ;
+C 251 ; WX 501 ; N germandbls ; B 55 -15 468 728 ;
+C -1 ; WX 228 ; N Idieresis ; B 11 0 218 901 ;
+C -1 ; WX 456 ; N eacute ; B 33 -15 423 734 ;
+C -1 ; WX 456 ; N abreve ; B 30 -15 435 731 ;
+C -1 ; WX 456 ; N uhungarumlaut ; B 56 -15 427 734 ;
+C -1 ; WX 456 ; N ecaron ; B 33 -15 423 734 ;
+C -1 ; WX 547 ; N Ydieresis ; B 11 0 535 901 ;
+C -1 ; WX 479 ; N divide ; B 32 -19 447 524 ;
+C -1 ; WX 547 ; N Yacute ; B 11 0 535 929 ;
+C -1 ; WX 547 ; N Acircumflex ; B 11 0 536 929 ;
+C -1 ; WX 456 ; N aacute ; B 30 -15 435 734 ;
+C -1 ; WX 592 ; N Ucircumflex ; B 65 -19 528 929 ;
+C -1 ; WX 410 ; N yacute ; B 9 -214 401 734 ;
+C -1 ; WX 410 ; N scommaaccent ; B 26 -225 380 538 ;
+C -1 ; WX 456 ; N ecircumflex ; B 33 -15 423 734 ;
+C -1 ; WX 592 ; N Uring ; B 65 -19 528 931 ;
+C -1 ; WX 592 ; N Udieresis ; B 65 -19 528 901 ;
+C -1 ; WX 456 ; N aogonek ; B 30 -220 449 538 ;
+C -1 ; WX 592 ; N Uacute ; B 65 -19 528 929 ;
+C -1 ; WX 456 ; N uogonek ; B 56 -225 426 523 ;
+C -1 ; WX 547 ; N Edieresis ; B 71 0 505 901 ;
+C -1 ; WX 592 ; N Dcroat ; B 0 0 553 718 ;
+C -1 ; WX 205 ; N commaaccent ; B 71 -225 148 -40 ;
+C -1 ; WX 604 ; N copyright ; B -11 -19 617 737 ;
+C -1 ; WX 547 ; N Emacron ; B 71 0 505 879 ;
+C -1 ; WX 410 ; N ccaron ; B 25 -15 391 734 ;
+C -1 ; WX 456 ; N aring ; B 30 -15 435 756 ;
+C -1 ; WX 592 ; N Ncommaaccent ; B 62 -225 530 718 ;
+C -1 ; WX 182 ; N lacute ; B 55 0 216 929 ;
+C -1 ; WX 456 ; N agrave ; B 30 -15 435 734 ;
+C -1 ; WX 501 ; N Tcommaaccent ; B 11 -225 490 718 ;
+C -1 ; WX 592 ; N Cacute ; B 36 -19 558 929 ;
+C -1 ; WX 456 ; N atilde ; B 30 -15 435 722 ;
+C -1 ; WX 547 ; N Edotaccent ; B 71 0 505 901 ;
+C -1 ; WX 410 ; N scaron ; B 26 -15 380 734 ;
+C -1 ; WX 410 ; N scedilla ; B 26 -225 380 538 ;
+C -1 ; WX 228 ; N iacute ; B 78 0 239 734 ;
+C -1 ; WX 386 ; N lozenge ; B 8 0 379 728 ;
+C -1 ; WX 592 ; N Rcaron ; B 72 0 561 929 ;
+C -1 ; WX 638 ; N Gcommaaccent ; B 39 -225 577 737 ;
+C -1 ; WX 456 ; N ucircumflex ; B 56 -15 401 734 ;
+C -1 ; WX 456 ; N acircumflex ; B 30 -15 435 734 ;
+C -1 ; WX 547 ; N Amacron ; B 11 0 536 879 ;
+C -1 ; WX 273 ; N rcaron ; B 50 0 289 734 ;
+C -1 ; WX 410 ; N ccedilla ; B 25 -225 391 538 ;
+C -1 ; WX 501 ; N Zdotaccent ; B 19 0 482 901 ;
+C -1 ; WX 547 ; N Thorn ; B 71 0 510 718 ;
+C -1 ; WX 638 ; N Omacron ; B 32 -19 606 879 ;
+C -1 ; WX 592 ; N Racute ; B 72 0 561 929 ;
+C -1 ; WX 547 ; N Sacute ; B 40 -19 508 929 ;
+C -1 ; WX 527 ; N dcaron ; B 29 -15 537 718 ;
+C -1 ; WX 592 ; N Umacron ; B 65 -19 528 879 ;
+C -1 ; WX 456 ; N uring ; B 56 -15 401 756 ;
+C -1 ; WX 273 ; N threesuperior ; B 4 270 267 703 ;
+C -1 ; WX 638 ; N Ograve ; B 32 -19 606 929 ;
+C -1 ; WX 547 ; N Agrave ; B 11 0 536 929 ;
+C -1 ; WX 547 ; N Abreve ; B 11 0 536 926 ;
+C -1 ; WX 479 ; N multiply ; B 32 0 447 506 ;
+C -1 ; WX 456 ; N uacute ; B 56 -15 401 734 ;
+C -1 ; WX 501 ; N Tcaron ; B 11 0 490 929 ;
+C -1 ; WX 390 ; N partialdiff ; B 11 -38 380 714 ;
+C -1 ; WX 410 ; N ydieresis ; B 9 -214 401 706 ;
+C -1 ; WX 592 ; N Nacute ; B 62 0 530 929 ;
+C -1 ; WX 228 ; N icircumflex ; B -5 0 234 734 ;
+C -1 ; WX 547 ; N Ecircumflex ; B 71 0 505 929 ;
+C -1 ; WX 456 ; N adieresis ; B 30 -15 435 706 ;
+C -1 ; WX 456 ; N edieresis ; B 33 -15 423 706 ;
+C -1 ; WX 410 ; N cacute ; B 25 -15 391 734 ;
+C -1 ; WX 456 ; N nacute ; B 53 0 403 734 ;
+C -1 ; WX 456 ; N umacron ; B 56 -15 401 684 ;
+C -1 ; WX 592 ; N Ncaron ; B 62 0 530 929 ;
+C -1 ; WX 228 ; N Iacute ; B 75 0 239 929 ;
+C -1 ; WX 479 ; N plusminus ; B 32 0 447 506 ;
+C -1 ; WX 213 ; N brokenbar ; B 77 -150 137 700 ;
+C -1 ; WX 604 ; N registered ; B -11 -19 617 737 ;
+C -1 ; WX 638 ; N Gbreve ; B 39 -19 577 926 ;
+C -1 ; WX 228 ; N Idotaccent ; B 75 0 154 901 ;
+C -1 ; WX 492 ; N summation ; B 12 -10 481 706 ;
+C -1 ; WX 547 ; N Egrave ; B 71 0 505 929 ;
+C -1 ; WX 273 ; N racute ; B 63 0 272 734 ;
+C -1 ; WX 456 ; N omacron ; B 29 -14 427 684 ;
+C -1 ; WX 501 ; N Zacute ; B 19 0 482 929 ;
+C -1 ; WX 501 ; N Zcaron ; B 19 0 482 929 ;
+C -1 ; WX 450 ; N greaterequal ; B 21 0 429 674 ;
+C -1 ; WX 592 ; N Eth ; B 0 0 553 718 ;
+C -1 ; WX 592 ; N Ccedilla ; B 36 -225 558 737 ;
+C -1 ; WX 182 ; N lcommaaccent ; B 55 -225 137 718 ;
+C -1 ; WX 260 ; N tcaron ; B 11 -7 270 808 ;
+C -1 ; WX 456 ; N eogonek ; B 33 -225 423 538 ;
+C -1 ; WX 592 ; N Uogonek ; B 65 -225 528 718 ;
+C -1 ; WX 547 ; N Aacute ; B 11 0 536 929 ;
+C -1 ; WX 547 ; N Adieresis ; B 11 0 536 901 ;
+C -1 ; WX 456 ; N egrave ; B 33 -15 423 734 ;
+C -1 ; WX 410 ; N zacute ; B 25 0 385 734 ;
+C -1 ; WX 182 ; N iogonek ; B -25 -225 150 718 ;
+C -1 ; WX 638 ; N Oacute ; B 32 -19 606 929 ;
+C -1 ; WX 456 ; N oacute ; B 29 -14 427 734 ;
+C -1 ; WX 456 ; N amacron ; B 30 -15 435 684 ;
+C -1 ; WX 410 ; N sacute ; B 26 -15 380 734 ;
+C -1 ; WX 228 ; N idieresis ; B 11 0 218 706 ;
+C -1 ; WX 638 ; N Ocircumflex ; B 32 -19 606 929 ;
+C -1 ; WX 592 ; N Ugrave ; B 65 -19 528 929 ;
+C -1 ; WX 502 ; N Delta ; B 5 0 499 688 ;
+C -1 ; WX 456 ; N thorn ; B 48 -207 424 718 ;
+C -1 ; WX 273 ; N twosuperior ; B 3 281 265 703 ;
+C -1 ; WX 638 ; N Odieresis ; B 32 -19 606 901 ;
+C -1 ; WX 456 ; N mu ; B 56 -207 401 523 ;
+C -1 ; WX 228 ; N igrave ; B -11 0 151 734 ;
+C -1 ; WX 456 ; N ohungarumlaut ; B 29 -14 427 734 ;
+C -1 ; WX 547 ; N Eogonek ; B 71 -220 519 718 ;
+C -1 ; WX 456 ; N dcroat ; B 29 -15 451 718 ;
+C -1 ; WX 684 ; N threequarters ; B 37 -19 664 703 ;
+C -1 ; WX 547 ; N Scedilla ; B 40 -225 508 737 ;
+C -1 ; WX 245 ; N lcaron ; B 55 0 255 718 ;
+C -1 ; WX 547 ; N Kcommaaccent ; B 62 -225 544 718 ;
+C -1 ; WX 456 ; N Lacute ; B 62 0 440 929 ;
+C -1 ; WX 820 ; N trademark ; B 38 306 740 718 ;
+C -1 ; WX 456 ; N edotaccent ; B 33 -15 423 706 ;
+C -1 ; WX 228 ; N Igrave ; B -11 0 154 929 ;
+C -1 ; WX 228 ; N Imacron ; B -14 0 243 879 ;
+C -1 ; WX 456 ; N Lcaron ; B 62 0 440 718 ;
+C -1 ; WX 684 ; N onehalf ; B 35 -19 634 703 ;
+C -1 ; WX 450 ; N lessequal ; B 21 0 429 674 ;
+C -1 ; WX 456 ; N ocircumflex ; B 29 -14 427 734 ;
+C -1 ; WX 456 ; N ntilde ; B 53 0 403 722 ;
+C -1 ; WX 592 ; N Uhungarumlaut ; B 65 -19 528 929 ;
+C -1 ; WX 547 ; N Eacute ; B 71 0 505 929 ;
+C -1 ; WX 456 ; N emacron ; B 33 -15 423 684 ;
+C -1 ; WX 456 ; N gbreve ; B 33 -220 409 731 ;
+C -1 ; WX 684 ; N onequarter ; B 60 -19 620 703 ;
+C -1 ; WX 547 ; N Scaron ; B 40 -19 508 929 ;
+C -1 ; WX 547 ; N Scommaaccent ; B 40 -225 508 737 ;
+C -1 ; WX 638 ; N Ohungarumlaut ; B 32 -19 606 929 ;
+C -1 ; WX 328 ; N degree ; B 44 411 284 703 ;
+C -1 ; WX 456 ; N ograve ; B 29 -14 427 734 ;
+C -1 ; WX 592 ; N Ccaron ; B 36 -19 558 929 ;
+C -1 ; WX 456 ; N ugrave ; B 56 -15 401 734 ;
+C -1 ; WX 371 ; N radical ; B -3 -80 376 762 ;
+C -1 ; WX 592 ; N Dcaron ; B 66 0 553 929 ;
+C -1 ; WX 273 ; N rcommaaccent ; B 63 -225 272 538 ;
+C -1 ; WX 592 ; N Ntilde ; B 62 0 530 917 ;
+C -1 ; WX 456 ; N otilde ; B 29 -14 427 722 ;
+C -1 ; WX 592 ; N Rcommaaccent ; B 72 -225 561 718 ;
+C -1 ; WX 456 ; N Lcommaaccent ; B 62 -225 440 718 ;
+C -1 ; WX 547 ; N Atilde ; B 11 0 536 917 ;
+C -1 ; WX 547 ; N Aogonek ; B 11 -225 536 718 ;
+C -1 ; WX 547 ; N Aring ; B 11 0 536 931 ;
+C -1 ; WX 638 ; N Otilde ; B 32 -19 606 917 ;
+C -1 ; WX 410 ; N zdotaccent ; B 25 0 385 706 ;
+C -1 ; WX 547 ; N Ecaron ; B 71 0 505 929 ;
+C -1 ; WX 228 ; N Iogonek ; B -2 -225 173 718 ;
+C -1 ; WX 410 ; N kcommaaccent ; B 55 -225 411 718 ;
+C -1 ; WX 479 ; N minus ; B 32 216 447 289 ;
+C -1 ; WX 228 ; N Icircumflex ; B -5 0 234 929 ;
+C -1 ; WX 456 ; N ncaron ; B 53 0 403 734 ;
+C -1 ; WX 228 ; N tcommaaccent ; B 11 -225 211 669 ;
+C -1 ; WX 479 ; N logicalnot ; B 32 108 447 390 ;
+C -1 ; WX 456 ; N odieresis ; B 29 -14 427 706 ;
+C -1 ; WX 456 ; N udieresis ; B 56 -15 401 706 ;
+C -1 ; WX 450 ; N notequal ; B 10 -35 440 551 ;
+C -1 ; WX 456 ; N gcommaaccent ; B 33 -220 409 822 ;
+C -1 ; WX 456 ; N eth ; B 29 -15 428 737 ;
+C -1 ; WX 410 ; N zcaron ; B 25 0 385 734 ;
+C -1 ; WX 456 ; N ncommaaccent ; B 53 -225 403 538 ;
+C -1 ; WX 273 ; N onesuperior ; B 35 281 182 703 ;
+C -1 ; WX 228 ; N imacron ; B 4 0 223 684 ;
+EndCharMetrics
+StartKernData
+StartKernPairs 2705
+KPX A C -30
+KPX A Cacute -30
+KPX A Ccaron -30
+KPX A Ccedilla -30
+KPX A G -30
+KPX A Gbreve -30
+KPX A Gcommaaccent -30
+KPX A O -30
+KPX A Oacute -30
+KPX A Ocircumflex -30
+KPX A Odieresis -30
+KPX A Ograve -30
+KPX A Ohungarumlaut -30
+KPX A Omacron -30
+KPX A Oslash -30
+KPX A Otilde -30
+KPX A Q -30
+KPX A T -120
+KPX A Tcaron -120
+KPX A Tcommaaccent -120
+KPX A U -50
+KPX A Uacute -50
+KPX A Ucircumflex -50
+KPX A Udieresis -50
+KPX A Ugrave -50
+KPX A Uhungarumlaut -50
+KPX A Umacron -50
+KPX A Uogonek -50
+KPX A Uring -50
+KPX A V -70
+KPX A W -50
+KPX A Y -100
+KPX A Yacute -100
+KPX A Ydieresis -100
+KPX A u -30
+KPX A uacute -30
+KPX A ucircumflex -30
+KPX A udieresis -30
+KPX A ugrave -30
+KPX A uhungarumlaut -30
+KPX A umacron -30
+KPX A uogonek -30
+KPX A uring -30
+KPX A v -40
+KPX A w -40
+KPX A y -40
+KPX A yacute -40
+KPX A ydieresis -40
+KPX Aacute C -30
+KPX Aacute Cacute -30
+KPX Aacute Ccaron -30
+KPX Aacute Ccedilla -30
+KPX Aacute G -30
+KPX Aacute Gbreve -30
+KPX Aacute Gcommaaccent -30
+KPX Aacute O -30
+KPX Aacute Oacute -30
+KPX Aacute Ocircumflex -30
+KPX Aacute Odieresis -30
+KPX Aacute Ograve -30
+KPX Aacute Ohungarumlaut -30
+KPX Aacute Omacron -30
+KPX Aacute Oslash -30
+KPX Aacute Otilde -30
+KPX Aacute Q -30
+KPX Aacute T -120
+KPX Aacute Tcaron -120
+KPX Aacute Tcommaaccent -120
+KPX Aacute U -50
+KPX Aacute Uacute -50
+KPX Aacute Ucircumflex -50
+KPX Aacute Udieresis -50
+KPX Aacute Ugrave -50
+KPX Aacute Uhungarumlaut -50
+KPX Aacute Umacron -50
+KPX Aacute Uogonek -50
+KPX Aacute Uring -50
+KPX Aacute V -70
+KPX Aacute W -50
+KPX Aacute Y -100
+KPX Aacute Yacute -100
+KPX Aacute Ydieresis -100
+KPX Aacute u -30
+KPX Aacute uacute -30
+KPX Aacute ucircumflex -30
+KPX Aacute udieresis -30
+KPX Aacute ugrave -30
+KPX Aacute uhungarumlaut -30
+KPX Aacute umacron -30
+KPX Aacute uogonek -30
+KPX Aacute uring -30
+KPX Aacute v -40
+KPX Aacute w -40
+KPX Aacute y -40
+KPX Aacute yacute -40
+KPX Aacute ydieresis -40
+KPX Abreve C -30
+KPX Abreve Cacute -30
+KPX Abreve Ccaron -30
+KPX Abreve Ccedilla -30
+KPX Abreve G -30
+KPX Abreve Gbreve -30
+KPX Abreve Gcommaaccent -30
+KPX Abreve O -30
+KPX Abreve Oacute -30
+KPX Abreve Ocircumflex -30
+KPX Abreve Odieresis -30
+KPX Abreve Ograve -30
+KPX Abreve Ohungarumlaut -30
+KPX Abreve Omacron -30
+KPX Abreve Oslash -30
+KPX Abreve Otilde -30
+KPX Abreve Q -30
+KPX Abreve T -120
+KPX Abreve Tcaron -120
+KPX Abreve Tcommaaccent -120
+KPX Abreve U -50
+KPX Abreve Uacute -50
+KPX Abreve Ucircumflex -50
+KPX Abreve Udieresis -50
+KPX Abreve Ugrave -50
+KPX Abreve Uhungarumlaut -50
+KPX Abreve Umacron -50
+KPX Abreve Uogonek -50
+KPX Abreve Uring -50
+KPX Abreve V -70
+KPX Abreve W -50
+KPX Abreve Y -100
+KPX Abreve Yacute -100
+KPX Abreve Ydieresis -100
+KPX Abreve u -30
+KPX Abreve uacute -30
+KPX Abreve ucircumflex -30
+KPX Abreve udieresis -30
+KPX Abreve ugrave -30
+KPX Abreve uhungarumlaut -30
+KPX Abreve umacron -30
+KPX Abreve uogonek -30
+KPX Abreve uring -30
+KPX Abreve v -40
+KPX Abreve w -40
+KPX Abreve y -40
+KPX Abreve yacute -40
+KPX Abreve ydieresis -40
+KPX Acircumflex C -30
+KPX Acircumflex Cacute -30
+KPX Acircumflex Ccaron -30
+KPX Acircumflex Ccedilla -30
+KPX Acircumflex G -30
+KPX Acircumflex Gbreve -30
+KPX Acircumflex Gcommaaccent -30
+KPX Acircumflex O -30
+KPX Acircumflex Oacute -30
+KPX Acircumflex Ocircumflex -30
+KPX Acircumflex Odieresis -30
+KPX Acircumflex Ograve -30
+KPX Acircumflex Ohungarumlaut -30
+KPX Acircumflex Omacron -30
+KPX Acircumflex Oslash -30
+KPX Acircumflex Otilde -30
+KPX Acircumflex Q -30
+KPX Acircumflex T -120
+KPX Acircumflex Tcaron -120
+KPX Acircumflex Tcommaaccent -120
+KPX Acircumflex U -50
+KPX Acircumflex Uacute -50
+KPX Acircumflex Ucircumflex -50
+KPX Acircumflex Udieresis -50
+KPX Acircumflex Ugrave -50
+KPX Acircumflex Uhungarumlaut -50
+KPX Acircumflex Umacron -50
+KPX Acircumflex Uogonek -50
+KPX Acircumflex Uring -50
+KPX Acircumflex V -70
+KPX Acircumflex W -50
+KPX Acircumflex Y -100
+KPX Acircumflex Yacute -100
+KPX Acircumflex Ydieresis -100
+KPX Acircumflex u -30
+KPX Acircumflex uacute -30
+KPX Acircumflex ucircumflex -30
+KPX Acircumflex udieresis -30
+KPX Acircumflex ugrave -30
+KPX Acircumflex uhungarumlaut -30
+KPX Acircumflex umacron -30
+KPX Acircumflex uogonek -30
+KPX Acircumflex uring -30
+KPX Acircumflex v -40
+KPX Acircumflex w -40
+KPX Acircumflex y -40
+KPX Acircumflex yacute -40
+KPX Acircumflex ydieresis -40
+KPX Adieresis C -30
+KPX Adieresis Cacute -30
+KPX Adieresis Ccaron -30
+KPX Adieresis Ccedilla -30
+KPX Adieresis G -30
+KPX Adieresis Gbreve -30
+KPX Adieresis Gcommaaccent -30
+KPX Adieresis O -30
+KPX Adieresis Oacute -30
+KPX Adieresis Ocircumflex -30
+KPX Adieresis Odieresis -30
+KPX Adieresis Ograve -30
+KPX Adieresis Ohungarumlaut -30
+KPX Adieresis Omacron -30
+KPX Adieresis Oslash -30
+KPX Adieresis Otilde -30
+KPX Adieresis Q -30
+KPX Adieresis T -120
+KPX Adieresis Tcaron -120
+KPX Adieresis Tcommaaccent -120
+KPX Adieresis U -50
+KPX Adieresis Uacute -50
+KPX Adieresis Ucircumflex -50
+KPX Adieresis Udieresis -50
+KPX Adieresis Ugrave -50
+KPX Adieresis Uhungarumlaut -50
+KPX Adieresis Umacron -50
+KPX Adieresis Uogonek -50
+KPX Adieresis Uring -50
+KPX Adieresis V -70
+KPX Adieresis W -50
+KPX Adieresis Y -100
+KPX Adieresis Yacute -100
+KPX Adieresis Ydieresis -100
+KPX Adieresis u -30
+KPX Adieresis uacute -30
+KPX Adieresis ucircumflex -30
+KPX Adieresis udieresis -30
+KPX Adieresis ugrave -30
+KPX Adieresis uhungarumlaut -30
+KPX Adieresis umacron -30
+KPX Adieresis uogonek -30
+KPX Adieresis uring -30
+KPX Adieresis v -40
+KPX Adieresis w -40
+KPX Adieresis y -40
+KPX Adieresis yacute -40
+KPX Adieresis ydieresis -40
+KPX Agrave C -30
+KPX Agrave Cacute -30
+KPX Agrave Ccaron -30
+KPX Agrave Ccedilla -30
+KPX Agrave G -30
+KPX Agrave Gbreve -30
+KPX Agrave Gcommaaccent -30
+KPX Agrave O -30
+KPX Agrave Oacute -30
+KPX Agrave Ocircumflex -30
+KPX Agrave Odieresis -30
+KPX Agrave Ograve -30
+KPX Agrave Ohungarumlaut -30
+KPX Agrave Omacron -30
+KPX Agrave Oslash -30
+KPX Agrave Otilde -30
+KPX Agrave Q -30
+KPX Agrave T -120
+KPX Agrave Tcaron -120
+KPX Agrave Tcommaaccent -120
+KPX Agrave U -50
+KPX Agrave Uacute -50
+KPX Agrave Ucircumflex -50
+KPX Agrave Udieresis -50
+KPX Agrave Ugrave -50
+KPX Agrave Uhungarumlaut -50
+KPX Agrave Umacron -50
+KPX Agrave Uogonek -50
+KPX Agrave Uring -50
+KPX Agrave V -70
+KPX Agrave W -50
+KPX Agrave Y -100
+KPX Agrave Yacute -100
+KPX Agrave Ydieresis -100
+KPX Agrave u -30
+KPX Agrave uacute -30
+KPX Agrave ucircumflex -30
+KPX Agrave udieresis -30
+KPX Agrave ugrave -30
+KPX Agrave uhungarumlaut -30
+KPX Agrave umacron -30
+KPX Agrave uogonek -30
+KPX Agrave uring -30
+KPX Agrave v -40
+KPX Agrave w -40
+KPX Agrave y -40
+KPX Agrave yacute -40
+KPX Agrave ydieresis -40
+KPX Amacron C -30
+KPX Amacron Cacute -30
+KPX Amacron Ccaron -30
+KPX Amacron Ccedilla -30
+KPX Amacron G -30
+KPX Amacron Gbreve -30
+KPX Amacron Gcommaaccent -30
+KPX Amacron O -30
+KPX Amacron Oacute -30
+KPX Amacron Ocircumflex -30
+KPX Amacron Odieresis -30
+KPX Amacron Ograve -30
+KPX Amacron Ohungarumlaut -30
+KPX Amacron Omacron -30
+KPX Amacron Oslash -30
+KPX Amacron Otilde -30
+KPX Amacron Q -30
+KPX Amacron T -120
+KPX Amacron Tcaron -120
+KPX Amacron Tcommaaccent -120
+KPX Amacron U -50
+KPX Amacron Uacute -50
+KPX Amacron Ucircumflex -50
+KPX Amacron Udieresis -50
+KPX Amacron Ugrave -50
+KPX Amacron Uhungarumlaut -50
+KPX Amacron Umacron -50
+KPX Amacron Uogonek -50
+KPX Amacron Uring -50
+KPX Amacron V -70
+KPX Amacron W -50
+KPX Amacron Y -100
+KPX Amacron Yacute -100
+KPX Amacron Ydieresis -100
+KPX Amacron u -30
+KPX Amacron uacute -30
+KPX Amacron ucircumflex -30
+KPX Amacron udieresis -30
+KPX Amacron ugrave -30
+KPX Amacron uhungarumlaut -30
+KPX Amacron umacron -30
+KPX Amacron uogonek -30
+KPX Amacron uring -30
+KPX Amacron v -40
+KPX Amacron w -40
+KPX Amacron y -40
+KPX Amacron yacute -40
+KPX Amacron ydieresis -40
+KPX Aogonek C -30
+KPX Aogonek Cacute -30
+KPX Aogonek Ccaron -30
+KPX Aogonek Ccedilla -30
+KPX Aogonek G -30
+KPX Aogonek Gbreve -30
+KPX Aogonek Gcommaaccent -30
+KPX Aogonek O -30
+KPX Aogonek Oacute -30
+KPX Aogonek Ocircumflex -30
+KPX Aogonek Odieresis -30
+KPX Aogonek Ograve -30
+KPX Aogonek Ohungarumlaut -30
+KPX Aogonek Omacron -30
+KPX Aogonek Oslash -30
+KPX Aogonek Otilde -30
+KPX Aogonek Q -30
+KPX Aogonek T -120
+KPX Aogonek Tcaron -120
+KPX Aogonek Tcommaaccent -120
+KPX Aogonek U -50
+KPX Aogonek Uacute -50
+KPX Aogonek Ucircumflex -50
+KPX Aogonek Udieresis -50
+KPX Aogonek Ugrave -50
+KPX Aogonek Uhungarumlaut -50
+KPX Aogonek Umacron -50
+KPX Aogonek Uogonek -50
+KPX Aogonek Uring -50
+KPX Aogonek V -70
+KPX Aogonek W -50
+KPX Aogonek Y -100
+KPX Aogonek Yacute -100
+KPX Aogonek Ydieresis -100
+KPX Aogonek u -30
+KPX Aogonek uacute -30
+KPX Aogonek ucircumflex -30
+KPX Aogonek udieresis -30
+KPX Aogonek ugrave -30
+KPX Aogonek uhungarumlaut -30
+KPX Aogonek umacron -30
+KPX Aogonek uogonek -30
+KPX Aogonek uring -30
+KPX Aogonek v -40
+KPX Aogonek w -40
+KPX Aogonek y -40
+KPX Aogonek yacute -40
+KPX Aogonek ydieresis -40
+KPX Aring C -30
+KPX Aring Cacute -30
+KPX Aring Ccaron -30
+KPX Aring Ccedilla -30
+KPX Aring G -30
+KPX Aring Gbreve -30
+KPX Aring Gcommaaccent -30
+KPX Aring O -30
+KPX Aring Oacute -30
+KPX Aring Ocircumflex -30
+KPX Aring Odieresis -30
+KPX Aring Ograve -30
+KPX Aring Ohungarumlaut -30
+KPX Aring Omacron -30
+KPX Aring Oslash -30
+KPX Aring Otilde -30
+KPX Aring Q -30
+KPX Aring T -120
+KPX Aring Tcaron -120
+KPX Aring Tcommaaccent -120
+KPX Aring U -50
+KPX Aring Uacute -50
+KPX Aring Ucircumflex -50
+KPX Aring Udieresis -50
+KPX Aring Ugrave -50
+KPX Aring Uhungarumlaut -50
+KPX Aring Umacron -50
+KPX Aring Uogonek -50
+KPX Aring Uring -50
+KPX Aring V -70
+KPX Aring W -50
+KPX Aring Y -100
+KPX Aring Yacute -100
+KPX Aring Ydieresis -100
+KPX Aring u -30
+KPX Aring uacute -30
+KPX Aring ucircumflex -30
+KPX Aring udieresis -30
+KPX Aring ugrave -30
+KPX Aring uhungarumlaut -30
+KPX Aring umacron -30
+KPX Aring uogonek -30
+KPX Aring uring -30
+KPX Aring v -40
+KPX Aring w -40
+KPX Aring y -40
+KPX Aring yacute -40
+KPX Aring ydieresis -40
+KPX Atilde C -30
+KPX Atilde Cacute -30
+KPX Atilde Ccaron -30
+KPX Atilde Ccedilla -30
+KPX Atilde G -30
+KPX Atilde Gbreve -30
+KPX Atilde Gcommaaccent -30
+KPX Atilde O -30
+KPX Atilde Oacute -30
+KPX Atilde Ocircumflex -30
+KPX Atilde Odieresis -30
+KPX Atilde Ograve -30
+KPX Atilde Ohungarumlaut -30
+KPX Atilde Omacron -30
+KPX Atilde Oslash -30
+KPX Atilde Otilde -30
+KPX Atilde Q -30
+KPX Atilde T -120
+KPX Atilde Tcaron -120
+KPX Atilde Tcommaaccent -120
+KPX Atilde U -50
+KPX Atilde Uacute -50
+KPX Atilde Ucircumflex -50
+KPX Atilde Udieresis -50
+KPX Atilde Ugrave -50
+KPX Atilde Uhungarumlaut -50
+KPX Atilde Umacron -50
+KPX Atilde Uogonek -50
+KPX Atilde Uring -50
+KPX Atilde V -70
+KPX Atilde W -50
+KPX Atilde Y -100
+KPX Atilde Yacute -100
+KPX Atilde Ydieresis -100
+KPX Atilde u -30
+KPX Atilde uacute -30
+KPX Atilde ucircumflex -30
+KPX Atilde udieresis -30
+KPX Atilde ugrave -30
+KPX Atilde uhungarumlaut -30
+KPX Atilde umacron -30
+KPX Atilde uogonek -30
+KPX Atilde uring -30
+KPX Atilde v -40
+KPX Atilde w -40
+KPX Atilde y -40
+KPX Atilde yacute -40
+KPX Atilde ydieresis -40
+KPX B U -10
+KPX B Uacute -10
+KPX B Ucircumflex -10
+KPX B Udieresis -10
+KPX B Ugrave -10
+KPX B Uhungarumlaut -10
+KPX B Umacron -10
+KPX B Uogonek -10
+KPX B Uring -10
+KPX B comma -20
+KPX B period -20
+KPX C comma -30
+KPX C period -30
+KPX Cacute comma -30
+KPX Cacute period -30
+KPX Ccaron comma -30
+KPX Ccaron period -30
+KPX Ccedilla comma -30
+KPX Ccedilla period -30
+KPX D A -40
+KPX D Aacute -40
+KPX D Abreve -40
+KPX D Acircumflex -40
+KPX D Adieresis -40
+KPX D Agrave -40
+KPX D Amacron -40
+KPX D Aogonek -40
+KPX D Aring -40
+KPX D Atilde -40
+KPX D V -70
+KPX D W -40
+KPX D Y -90
+KPX D Yacute -90
+KPX D Ydieresis -90
+KPX D comma -70
+KPX D period -70
+KPX Dcaron A -40
+KPX Dcaron Aacute -40
+KPX Dcaron Abreve -40
+KPX Dcaron Acircumflex -40
+KPX Dcaron Adieresis -40
+KPX Dcaron Agrave -40
+KPX Dcaron Amacron -40
+KPX Dcaron Aogonek -40
+KPX Dcaron Aring -40
+KPX Dcaron Atilde -40
+KPX Dcaron V -70
+KPX Dcaron W -40
+KPX Dcaron Y -90
+KPX Dcaron Yacute -90
+KPX Dcaron Ydieresis -90
+KPX Dcaron comma -70
+KPX Dcaron period -70
+KPX Dcroat A -40
+KPX Dcroat Aacute -40
+KPX Dcroat Abreve -40
+KPX Dcroat Acircumflex -40
+KPX Dcroat Adieresis -40
+KPX Dcroat Agrave -40
+KPX Dcroat Amacron -40
+KPX Dcroat Aogonek -40
+KPX Dcroat Aring -40
+KPX Dcroat Atilde -40
+KPX Dcroat V -70
+KPX Dcroat W -40
+KPX Dcroat Y -90
+KPX Dcroat Yacute -90
+KPX Dcroat Ydieresis -90
+KPX Dcroat comma -70
+KPX Dcroat period -70
+KPX F A -80
+KPX F Aacute -80
+KPX F Abreve -80
+KPX F Acircumflex -80
+KPX F Adieresis -80
+KPX F Agrave -80
+KPX F Amacron -80
+KPX F Aogonek -80
+KPX F Aring -80
+KPX F Atilde -80
+KPX F a -50
+KPX F aacute -50
+KPX F abreve -50
+KPX F acircumflex -50
+KPX F adieresis -50
+KPX F agrave -50
+KPX F amacron -50
+KPX F aogonek -50
+KPX F aring -50
+KPX F atilde -50
+KPX F comma -150
+KPX F e -30
+KPX F eacute -30
+KPX F ecaron -30
+KPX F ecircumflex -30
+KPX F edieresis -30
+KPX F edotaccent -30
+KPX F egrave -30
+KPX F emacron -30
+KPX F eogonek -30
+KPX F o -30
+KPX F oacute -30
+KPX F ocircumflex -30
+KPX F odieresis -30
+KPX F ograve -30
+KPX F ohungarumlaut -30
+KPX F omacron -30
+KPX F oslash -30
+KPX F otilde -30
+KPX F period -150
+KPX F r -45
+KPX F racute -45
+KPX F rcaron -45
+KPX F rcommaaccent -45
+KPX J A -20
+KPX J Aacute -20
+KPX J Abreve -20
+KPX J Acircumflex -20
+KPX J Adieresis -20
+KPX J Agrave -20
+KPX J Amacron -20
+KPX J Aogonek -20
+KPX J Aring -20
+KPX J Atilde -20
+KPX J a -20
+KPX J aacute -20
+KPX J abreve -20
+KPX J acircumflex -20
+KPX J adieresis -20
+KPX J agrave -20
+KPX J amacron -20
+KPX J aogonek -20
+KPX J aring -20
+KPX J atilde -20
+KPX J comma -30
+KPX J period -30
+KPX J u -20
+KPX J uacute -20
+KPX J ucircumflex -20
+KPX J udieresis -20
+KPX J ugrave -20
+KPX J uhungarumlaut -20
+KPX J umacron -20
+KPX J uogonek -20
+KPX J uring -20
+KPX K O -50
+KPX K Oacute -50
+KPX K Ocircumflex -50
+KPX K Odieresis -50
+KPX K Ograve -50
+KPX K Ohungarumlaut -50
+KPX K Omacron -50
+KPX K Oslash -50
+KPX K Otilde -50
+KPX K e -40
+KPX K eacute -40
+KPX K ecaron -40
+KPX K ecircumflex -40
+KPX K edieresis -40
+KPX K edotaccent -40
+KPX K egrave -40
+KPX K emacron -40
+KPX K eogonek -40
+KPX K o -40
+KPX K oacute -40
+KPX K ocircumflex -40
+KPX K odieresis -40
+KPX K ograve -40
+KPX K ohungarumlaut -40
+KPX K omacron -40
+KPX K oslash -40
+KPX K otilde -40
+KPX K u -30
+KPX K uacute -30
+KPX K ucircumflex -30
+KPX K udieresis -30
+KPX K ugrave -30
+KPX K uhungarumlaut -30
+KPX K umacron -30
+KPX K uogonek -30
+KPX K uring -30
+KPX K y -50
+KPX K yacute -50
+KPX K ydieresis -50
+KPX Kcommaaccent O -50
+KPX Kcommaaccent Oacute -50
+KPX Kcommaaccent Ocircumflex -50
+KPX Kcommaaccent Odieresis -50
+KPX Kcommaaccent Ograve -50
+KPX Kcommaaccent Ohungarumlaut -50
+KPX Kcommaaccent Omacron -50
+KPX Kcommaaccent Oslash -50
+KPX Kcommaaccent Otilde -50
+KPX Kcommaaccent e -40
+KPX Kcommaaccent eacute -40
+KPX Kcommaaccent ecaron -40
+KPX Kcommaaccent ecircumflex -40
+KPX Kcommaaccent edieresis -40
+KPX Kcommaaccent edotaccent -40
+KPX Kcommaaccent egrave -40
+KPX Kcommaaccent emacron -40
+KPX Kcommaaccent eogonek -40
+KPX Kcommaaccent o -40
+KPX Kcommaaccent oacute -40
+KPX Kcommaaccent ocircumflex -40
+KPX Kcommaaccent odieresis -40
+KPX Kcommaaccent ograve -40
+KPX Kcommaaccent ohungarumlaut -40
+KPX Kcommaaccent omacron -40
+KPX Kcommaaccent oslash -40
+KPX Kcommaaccent otilde -40
+KPX Kcommaaccent u -30
+KPX Kcommaaccent uacute -30
+KPX Kcommaaccent ucircumflex -30
+KPX Kcommaaccent udieresis -30
+KPX Kcommaaccent ugrave -30
+KPX Kcommaaccent uhungarumlaut -30
+KPX Kcommaaccent umacron -30
+KPX Kcommaaccent uogonek -30
+KPX Kcommaaccent uring -30
+KPX Kcommaaccent y -50
+KPX Kcommaaccent yacute -50
+KPX Kcommaaccent ydieresis -50
+KPX L T -110
+KPX L Tcaron -110
+KPX L Tcommaaccent -110
+KPX L V -110
+KPX L W -70
+KPX L Y -140
+KPX L Yacute -140
+KPX L Ydieresis -140
+KPX L quotedblright -140
+KPX L quoteright -160
+KPX L y -30
+KPX L yacute -30
+KPX L ydieresis -30
+KPX Lacute T -110
+KPX Lacute Tcaron -110
+KPX Lacute Tcommaaccent -110
+KPX Lacute V -110
+KPX Lacute W -70
+KPX Lacute Y -140
+KPX Lacute Yacute -140
+KPX Lacute Ydieresis -140
+KPX Lacute quotedblright -140
+KPX Lacute quoteright -160
+KPX Lacute y -30
+KPX Lacute yacute -30
+KPX Lacute ydieresis -30
+KPX Lcaron T -110
+KPX Lcaron Tcaron -110
+KPX Lcaron Tcommaaccent -110
+KPX Lcaron V -110
+KPX Lcaron W -70
+KPX Lcaron Y -140
+KPX Lcaron Yacute -140
+KPX Lcaron Ydieresis -140
+KPX Lcaron quotedblright -140
+KPX Lcaron quoteright -160
+KPX Lcaron y -30
+KPX Lcaron yacute -30
+KPX Lcaron ydieresis -30
+KPX Lcommaaccent T -110
+KPX Lcommaaccent Tcaron -110
+KPX Lcommaaccent Tcommaaccent -110
+KPX Lcommaaccent V -110
+KPX Lcommaaccent W -70
+KPX Lcommaaccent Y -140
+KPX Lcommaaccent Yacute -140
+KPX Lcommaaccent Ydieresis -140
+KPX Lcommaaccent quotedblright -140
+KPX Lcommaaccent quoteright -160
+KPX Lcommaaccent y -30
+KPX Lcommaaccent yacute -30
+KPX Lcommaaccent ydieresis -30
+KPX Lslash T -110
+KPX Lslash Tcaron -110
+KPX Lslash Tcommaaccent -110
+KPX Lslash V -110
+KPX Lslash W -70
+KPX Lslash Y -140
+KPX Lslash Yacute -140
+KPX Lslash Ydieresis -140
+KPX Lslash quotedblright -140
+KPX Lslash quoteright -160
+KPX Lslash y -30
+KPX Lslash yacute -30
+KPX Lslash ydieresis -30
+KPX O A -20
+KPX O Aacute -20
+KPX O Abreve -20
+KPX O Acircumflex -20
+KPX O Adieresis -20
+KPX O Agrave -20
+KPX O Amacron -20
+KPX O Aogonek -20
+KPX O Aring -20
+KPX O Atilde -20
+KPX O T -40
+KPX O Tcaron -40
+KPX O Tcommaaccent -40
+KPX O V -50
+KPX O W -30
+KPX O X -60
+KPX O Y -70
+KPX O Yacute -70
+KPX O Ydieresis -70
+KPX O comma -40
+KPX O period -40
+KPX Oacute A -20
+KPX Oacute Aacute -20
+KPX Oacute Abreve -20
+KPX Oacute Acircumflex -20
+KPX Oacute Adieresis -20
+KPX Oacute Agrave -20
+KPX Oacute Amacron -20
+KPX Oacute Aogonek -20
+KPX Oacute Aring -20
+KPX Oacute Atilde -20
+KPX Oacute T -40
+KPX Oacute Tcaron -40
+KPX Oacute Tcommaaccent -40
+KPX Oacute V -50
+KPX Oacute W -30
+KPX Oacute X -60
+KPX Oacute Y -70
+KPX Oacute Yacute -70
+KPX Oacute Ydieresis -70
+KPX Oacute comma -40
+KPX Oacute period -40
+KPX Ocircumflex A -20
+KPX Ocircumflex Aacute -20
+KPX Ocircumflex Abreve -20
+KPX Ocircumflex Acircumflex -20
+KPX Ocircumflex Adieresis -20
+KPX Ocircumflex Agrave -20
+KPX Ocircumflex Amacron -20
+KPX Ocircumflex Aogonek -20
+KPX Ocircumflex Aring -20
+KPX Ocircumflex Atilde -20
+KPX Ocircumflex T -40
+KPX Ocircumflex Tcaron -40
+KPX Ocircumflex Tcommaaccent -40
+KPX Ocircumflex V -50
+KPX Ocircumflex W -30
+KPX Ocircumflex X -60
+KPX Ocircumflex Y -70
+KPX Ocircumflex Yacute -70
+KPX Ocircumflex Ydieresis -70
+KPX Ocircumflex comma -40
+KPX Ocircumflex period -40
+KPX Odieresis A -20
+KPX Odieresis Aacute -20
+KPX Odieresis Abreve -20
+KPX Odieresis Acircumflex -20
+KPX Odieresis Adieresis -20
+KPX Odieresis Agrave -20
+KPX Odieresis Amacron -20
+KPX Odieresis Aogonek -20
+KPX Odieresis Aring -20
+KPX Odieresis Atilde -20
+KPX Odieresis T -40
+KPX Odieresis Tcaron -40
+KPX Odieresis Tcommaaccent -40
+KPX Odieresis V -50
+KPX Odieresis W -30
+KPX Odieresis X -60
+KPX Odieresis Y -70
+KPX Odieresis Yacute -70
+KPX Odieresis Ydieresis -70
+KPX Odieresis comma -40
+KPX Odieresis period -40
+KPX Ograve A -20
+KPX Ograve Aacute -20
+KPX Ograve Abreve -20
+KPX Ograve Acircumflex -20
+KPX Ograve Adieresis -20
+KPX Ograve Agrave -20
+KPX Ograve Amacron -20
+KPX Ograve Aogonek -20
+KPX Ograve Aring -20
+KPX Ograve Atilde -20
+KPX Ograve T -40
+KPX Ograve Tcaron -40
+KPX Ograve Tcommaaccent -40
+KPX Ograve V -50
+KPX Ograve W -30
+KPX Ograve X -60
+KPX Ograve Y -70
+KPX Ograve Yacute -70
+KPX Ograve Ydieresis -70
+KPX Ograve comma -40
+KPX Ograve period -40
+KPX Ohungarumlaut A -20
+KPX Ohungarumlaut Aacute -20
+KPX Ohungarumlaut Abreve -20
+KPX Ohungarumlaut Acircumflex -20
+KPX Ohungarumlaut Adieresis -20
+KPX Ohungarumlaut Agrave -20
+KPX Ohungarumlaut Amacron -20
+KPX Ohungarumlaut Aogonek -20
+KPX Ohungarumlaut Aring -20
+KPX Ohungarumlaut Atilde -20
+KPX Ohungarumlaut T -40
+KPX Ohungarumlaut Tcaron -40
+KPX Ohungarumlaut Tcommaaccent -40
+KPX Ohungarumlaut V -50
+KPX Ohungarumlaut W -30
+KPX Ohungarumlaut X -60
+KPX Ohungarumlaut Y -70
+KPX Ohungarumlaut Yacute -70
+KPX Ohungarumlaut Ydieresis -70
+KPX Ohungarumlaut comma -40
+KPX Ohungarumlaut period -40
+KPX Omacron A -20
+KPX Omacron Aacute -20
+KPX Omacron Abreve -20
+KPX Omacron Acircumflex -20
+KPX Omacron Adieresis -20
+KPX Omacron Agrave -20
+KPX Omacron Amacron -20
+KPX Omacron Aogonek -20
+KPX Omacron Aring -20
+KPX Omacron Atilde -20
+KPX Omacron T -40
+KPX Omacron Tcaron -40
+KPX Omacron Tcommaaccent -40
+KPX Omacron V -50
+KPX Omacron W -30
+KPX Omacron X -60
+KPX Omacron Y -70
+KPX Omacron Yacute -70
+KPX Omacron Ydieresis -70
+KPX Omacron comma -40
+KPX Omacron period -40
+KPX Oslash A -20
+KPX Oslash Aacute -20
+KPX Oslash Abreve -20
+KPX Oslash Acircumflex -20
+KPX Oslash Adieresis -20
+KPX Oslash Agrave -20
+KPX Oslash Amacron -20
+KPX Oslash Aogonek -20
+KPX Oslash Aring -20
+KPX Oslash Atilde -20
+KPX Oslash T -40
+KPX Oslash Tcaron -40
+KPX Oslash Tcommaaccent -40
+KPX Oslash V -50
+KPX Oslash W -30
+KPX Oslash X -60
+KPX Oslash Y -70
+KPX Oslash Yacute -70
+KPX Oslash Ydieresis -70
+KPX Oslash comma -40
+KPX Oslash period -40
+KPX Otilde A -20
+KPX Otilde Aacute -20
+KPX Otilde Abreve -20
+KPX Otilde Acircumflex -20
+KPX Otilde Adieresis -20
+KPX Otilde Agrave -20
+KPX Otilde Amacron -20
+KPX Otilde Aogonek -20
+KPX Otilde Aring -20
+KPX Otilde Atilde -20
+KPX Otilde T -40
+KPX Otilde Tcaron -40
+KPX Otilde Tcommaaccent -40
+KPX Otilde V -50
+KPX Otilde W -30
+KPX Otilde X -60
+KPX Otilde Y -70
+KPX Otilde Yacute -70
+KPX Otilde Ydieresis -70
+KPX Otilde comma -40
+KPX Otilde period -40
+KPX P A -120
+KPX P Aacute -120
+KPX P Abreve -120
+KPX P Acircumflex -120
+KPX P Adieresis -120
+KPX P Agrave -120
+KPX P Amacron -120
+KPX P Aogonek -120
+KPX P Aring -120
+KPX P Atilde -120
+KPX P a -40
+KPX P aacute -40
+KPX P abreve -40
+KPX P acircumflex -40
+KPX P adieresis -40
+KPX P agrave -40
+KPX P amacron -40
+KPX P aogonek -40
+KPX P aring -40
+KPX P atilde -40
+KPX P comma -180
+KPX P e -50
+KPX P eacute -50
+KPX P ecaron -50
+KPX P ecircumflex -50
+KPX P edieresis -50
+KPX P edotaccent -50
+KPX P egrave -50
+KPX P emacron -50
+KPX P eogonek -50
+KPX P o -50
+KPX P oacute -50
+KPX P ocircumflex -50
+KPX P odieresis -50
+KPX P ograve -50
+KPX P ohungarumlaut -50
+KPX P omacron -50
+KPX P oslash -50
+KPX P otilde -50
+KPX P period -180
+KPX Q U -10
+KPX Q Uacute -10
+KPX Q Ucircumflex -10
+KPX Q Udieresis -10
+KPX Q Ugrave -10
+KPX Q Uhungarumlaut -10
+KPX Q Umacron -10
+KPX Q Uogonek -10
+KPX Q Uring -10
+KPX R O -20
+KPX R Oacute -20
+KPX R Ocircumflex -20
+KPX R Odieresis -20
+KPX R Ograve -20
+KPX R Ohungarumlaut -20
+KPX R Omacron -20
+KPX R Oslash -20
+KPX R Otilde -20
+KPX R T -30
+KPX R Tcaron -30
+KPX R Tcommaaccent -30
+KPX R U -40
+KPX R Uacute -40
+KPX R Ucircumflex -40
+KPX R Udieresis -40
+KPX R Ugrave -40
+KPX R Uhungarumlaut -40
+KPX R Umacron -40
+KPX R Uogonek -40
+KPX R Uring -40
+KPX R V -50
+KPX R W -30
+KPX R Y -50
+KPX R Yacute -50
+KPX R Ydieresis -50
+KPX Racute O -20
+KPX Racute Oacute -20
+KPX Racute Ocircumflex -20
+KPX Racute Odieresis -20
+KPX Racute Ograve -20
+KPX Racute Ohungarumlaut -20
+KPX Racute Omacron -20
+KPX Racute Oslash -20
+KPX Racute Otilde -20
+KPX Racute T -30
+KPX Racute Tcaron -30
+KPX Racute Tcommaaccent -30
+KPX Racute U -40
+KPX Racute Uacute -40
+KPX Racute Ucircumflex -40
+KPX Racute Udieresis -40
+KPX Racute Ugrave -40
+KPX Racute Uhungarumlaut -40
+KPX Racute Umacron -40
+KPX Racute Uogonek -40
+KPX Racute Uring -40
+KPX Racute V -50
+KPX Racute W -30
+KPX Racute Y -50
+KPX Racute Yacute -50
+KPX Racute Ydieresis -50
+KPX Rcaron O -20
+KPX Rcaron Oacute -20
+KPX Rcaron Ocircumflex -20
+KPX Rcaron Odieresis -20
+KPX Rcaron Ograve -20
+KPX Rcaron Ohungarumlaut -20
+KPX Rcaron Omacron -20
+KPX Rcaron Oslash -20
+KPX Rcaron Otilde -20
+KPX Rcaron T -30
+KPX Rcaron Tcaron -30
+KPX Rcaron Tcommaaccent -30
+KPX Rcaron U -40
+KPX Rcaron Uacute -40
+KPX Rcaron Ucircumflex -40
+KPX Rcaron Udieresis -40
+KPX Rcaron Ugrave -40
+KPX Rcaron Uhungarumlaut -40
+KPX Rcaron Umacron -40
+KPX Rcaron Uogonek -40
+KPX Rcaron Uring -40
+KPX Rcaron V -50
+KPX Rcaron W -30
+KPX Rcaron Y -50
+KPX Rcaron Yacute -50
+KPX Rcaron Ydieresis -50
+KPX Rcommaaccent O -20
+KPX Rcommaaccent Oacute -20
+KPX Rcommaaccent Ocircumflex -20
+KPX Rcommaaccent Odieresis -20
+KPX Rcommaaccent Ograve -20
+KPX Rcommaaccent Ohungarumlaut -20
+KPX Rcommaaccent Omacron -20
+KPX Rcommaaccent Oslash -20
+KPX Rcommaaccent Otilde -20
+KPX Rcommaaccent T -30
+KPX Rcommaaccent Tcaron -30
+KPX Rcommaaccent Tcommaaccent -30
+KPX Rcommaaccent U -40
+KPX Rcommaaccent Uacute -40
+KPX Rcommaaccent Ucircumflex -40
+KPX Rcommaaccent Udieresis -40
+KPX Rcommaaccent Ugrave -40
+KPX Rcommaaccent Uhungarumlaut -40
+KPX Rcommaaccent Umacron -40
+KPX Rcommaaccent Uogonek -40
+KPX Rcommaaccent Uring -40
+KPX Rcommaaccent V -50
+KPX Rcommaaccent W -30
+KPX Rcommaaccent Y -50
+KPX Rcommaaccent Yacute -50
+KPX Rcommaaccent Ydieresis -50
+KPX S comma -20
+KPX S period -20
+KPX Sacute comma -20
+KPX Sacute period -20
+KPX Scaron comma -20
+KPX Scaron period -20
+KPX Scedilla comma -20
+KPX Scedilla period -20
+KPX Scommaaccent comma -20
+KPX Scommaaccent period -20
+KPX T A -120
+KPX T Aacute -120
+KPX T Abreve -120
+KPX T Acircumflex -120
+KPX T Adieresis -120
+KPX T Agrave -120
+KPX T Amacron -120
+KPX T Aogonek -120
+KPX T Aring -120
+KPX T Atilde -120
+KPX T O -40
+KPX T Oacute -40
+KPX T Ocircumflex -40
+KPX T Odieresis -40
+KPX T Ograve -40
+KPX T Ohungarumlaut -40
+KPX T Omacron -40
+KPX T Oslash -40
+KPX T Otilde -40
+KPX T a -120
+KPX T aacute -120
+KPX T abreve -60
+KPX T acircumflex -120
+KPX T adieresis -120
+KPX T agrave -120
+KPX T amacron -60
+KPX T aogonek -120
+KPX T aring -120
+KPX T atilde -60
+KPX T colon -20
+KPX T comma -120
+KPX T e -120
+KPX T eacute -120
+KPX T ecaron -120
+KPX T ecircumflex -120
+KPX T edieresis -120
+KPX T edotaccent -120
+KPX T egrave -60
+KPX T emacron -60
+KPX T eogonek -120
+KPX T hyphen -140
+KPX T o -120
+KPX T oacute -120
+KPX T ocircumflex -120
+KPX T odieresis -120
+KPX T ograve -120
+KPX T ohungarumlaut -120
+KPX T omacron -60
+KPX T oslash -120
+KPX T otilde -60
+KPX T period -120
+KPX T r -120
+KPX T racute -120
+KPX T rcaron -120
+KPX T rcommaaccent -120
+KPX T semicolon -20
+KPX T u -120
+KPX T uacute -120
+KPX T ucircumflex -120
+KPX T udieresis -120
+KPX T ugrave -120
+KPX T uhungarumlaut -120
+KPX T umacron -60
+KPX T uogonek -120
+KPX T uring -120
+KPX T w -120
+KPX T y -120
+KPX T yacute -120
+KPX T ydieresis -60
+KPX Tcaron A -120
+KPX Tcaron Aacute -120
+KPX Tcaron Abreve -120
+KPX Tcaron Acircumflex -120
+KPX Tcaron Adieresis -120
+KPX Tcaron Agrave -120
+KPX Tcaron Amacron -120
+KPX Tcaron Aogonek -120
+KPX Tcaron Aring -120
+KPX Tcaron Atilde -120
+KPX Tcaron O -40
+KPX Tcaron Oacute -40
+KPX Tcaron Ocircumflex -40
+KPX Tcaron Odieresis -40
+KPX Tcaron Ograve -40
+KPX Tcaron Ohungarumlaut -40
+KPX Tcaron Omacron -40
+KPX Tcaron Oslash -40
+KPX Tcaron Otilde -40
+KPX Tcaron a -120
+KPX Tcaron aacute -120
+KPX Tcaron abreve -60
+KPX Tcaron acircumflex -120
+KPX Tcaron adieresis -120
+KPX Tcaron agrave -120
+KPX Tcaron amacron -60
+KPX Tcaron aogonek -120
+KPX Tcaron aring -120
+KPX Tcaron atilde -60
+KPX Tcaron colon -20
+KPX Tcaron comma -120
+KPX Tcaron e -120
+KPX Tcaron eacute -120
+KPX Tcaron ecaron -120
+KPX Tcaron ecircumflex -120
+KPX Tcaron edieresis -120
+KPX Tcaron edotaccent -120
+KPX Tcaron egrave -60
+KPX Tcaron emacron -60
+KPX Tcaron eogonek -120
+KPX Tcaron hyphen -140
+KPX Tcaron o -120
+KPX Tcaron oacute -120
+KPX Tcaron ocircumflex -120
+KPX Tcaron odieresis -120
+KPX Tcaron ograve -120
+KPX Tcaron ohungarumlaut -120
+KPX Tcaron omacron -60
+KPX Tcaron oslash -120
+KPX Tcaron otilde -60
+KPX Tcaron period -120
+KPX Tcaron r -120
+KPX Tcaron racute -120
+KPX Tcaron rcaron -120
+KPX Tcaron rcommaaccent -120
+KPX Tcaron semicolon -20
+KPX Tcaron u -120
+KPX Tcaron uacute -120
+KPX Tcaron ucircumflex -120
+KPX Tcaron udieresis -120
+KPX Tcaron ugrave -120
+KPX Tcaron uhungarumlaut -120
+KPX Tcaron umacron -60
+KPX Tcaron uogonek -120
+KPX Tcaron uring -120
+KPX Tcaron w -120
+KPX Tcaron y -120
+KPX Tcaron yacute -120
+KPX Tcaron ydieresis -60
+KPX Tcommaaccent A -120
+KPX Tcommaaccent Aacute -120
+KPX Tcommaaccent Abreve -120
+KPX Tcommaaccent Acircumflex -120
+KPX Tcommaaccent Adieresis -120
+KPX Tcommaaccent Agrave -120
+KPX Tcommaaccent Amacron -120
+KPX Tcommaaccent Aogonek -120
+KPX Tcommaaccent Aring -120
+KPX Tcommaaccent Atilde -120
+KPX Tcommaaccent O -40
+KPX Tcommaaccent Oacute -40
+KPX Tcommaaccent Ocircumflex -40
+KPX Tcommaaccent Odieresis -40
+KPX Tcommaaccent Ograve -40
+KPX Tcommaaccent Ohungarumlaut -40
+KPX Tcommaaccent Omacron -40
+KPX Tcommaaccent Oslash -40
+KPX Tcommaaccent Otilde -40
+KPX Tcommaaccent a -120
+KPX Tcommaaccent aacute -120
+KPX Tcommaaccent abreve -60
+KPX Tcommaaccent acircumflex -120
+KPX Tcommaaccent adieresis -120
+KPX Tcommaaccent agrave -120
+KPX Tcommaaccent amacron -60
+KPX Tcommaaccent aogonek -120
+KPX Tcommaaccent aring -120
+KPX Tcommaaccent atilde -60
+KPX Tcommaaccent colon -20
+KPX Tcommaaccent comma -120
+KPX Tcommaaccent e -120
+KPX Tcommaaccent eacute -120
+KPX Tcommaaccent ecaron -120
+KPX Tcommaaccent ecircumflex -120
+KPX Tcommaaccent edieresis -120
+KPX Tcommaaccent edotaccent -120
+KPX Tcommaaccent egrave -60
+KPX Tcommaaccent emacron -60
+KPX Tcommaaccent eogonek -120
+KPX Tcommaaccent hyphen -140
+KPX Tcommaaccent o -120
+KPX Tcommaaccent oacute -120
+KPX Tcommaaccent ocircumflex -120
+KPX Tcommaaccent odieresis -120
+KPX Tcommaaccent ograve -120
+KPX Tcommaaccent ohungarumlaut -120
+KPX Tcommaaccent omacron -60
+KPX Tcommaaccent oslash -120
+KPX Tcommaaccent otilde -60
+KPX Tcommaaccent period -120
+KPX Tcommaaccent r -120
+KPX Tcommaaccent racute -120
+KPX Tcommaaccent rcaron -120
+KPX Tcommaaccent rcommaaccent -120
+KPX Tcommaaccent semicolon -20
+KPX Tcommaaccent u -120
+KPX Tcommaaccent uacute -120
+KPX Tcommaaccent ucircumflex -120
+KPX Tcommaaccent udieresis -120
+KPX Tcommaaccent ugrave -120
+KPX Tcommaaccent uhungarumlaut -120
+KPX Tcommaaccent umacron -60
+KPX Tcommaaccent uogonek -120
+KPX Tcommaaccent uring -120
+KPX Tcommaaccent w -120
+KPX Tcommaaccent y -120
+KPX Tcommaaccent yacute -120
+KPX Tcommaaccent ydieresis -60
+KPX U A -40
+KPX U Aacute -40
+KPX U Abreve -40
+KPX U Acircumflex -40
+KPX U Adieresis -40
+KPX U Agrave -40
+KPX U Amacron -40
+KPX U Aogonek -40
+KPX U Aring -40
+KPX U Atilde -40
+KPX U comma -40
+KPX U period -40
+KPX Uacute A -40
+KPX Uacute Aacute -40
+KPX Uacute Abreve -40
+KPX Uacute Acircumflex -40
+KPX Uacute Adieresis -40
+KPX Uacute Agrave -40
+KPX Uacute Amacron -40
+KPX Uacute Aogonek -40
+KPX Uacute Aring -40
+KPX Uacute Atilde -40
+KPX Uacute comma -40
+KPX Uacute period -40
+KPX Ucircumflex A -40
+KPX Ucircumflex Aacute -40
+KPX Ucircumflex Abreve -40
+KPX Ucircumflex Acircumflex -40
+KPX Ucircumflex Adieresis -40
+KPX Ucircumflex Agrave -40
+KPX Ucircumflex Amacron -40
+KPX Ucircumflex Aogonek -40
+KPX Ucircumflex Aring -40
+KPX Ucircumflex Atilde -40
+KPX Ucircumflex comma -40
+KPX Ucircumflex period -40
+KPX Udieresis A -40
+KPX Udieresis Aacute -40
+KPX Udieresis Abreve -40
+KPX Udieresis Acircumflex -40
+KPX Udieresis Adieresis -40
+KPX Udieresis Agrave -40
+KPX Udieresis Amacron -40
+KPX Udieresis Aogonek -40
+KPX Udieresis Aring -40
+KPX Udieresis Atilde -40
+KPX Udieresis comma -40
+KPX Udieresis period -40
+KPX Ugrave A -40
+KPX Ugrave Aacute -40
+KPX Ugrave Abreve -40
+KPX Ugrave Acircumflex -40
+KPX Ugrave Adieresis -40
+KPX Ugrave Agrave -40
+KPX Ugrave Amacron -40
+KPX Ugrave Aogonek -40
+KPX Ugrave Aring -40
+KPX Ugrave Atilde -40
+KPX Ugrave comma -40
+KPX Ugrave period -40
+KPX Uhungarumlaut A -40
+KPX Uhungarumlaut Aacute -40
+KPX Uhungarumlaut Abreve -40
+KPX Uhungarumlaut Acircumflex -40
+KPX Uhungarumlaut Adieresis -40
+KPX Uhungarumlaut Agrave -40
+KPX Uhungarumlaut Amacron -40
+KPX Uhungarumlaut Aogonek -40
+KPX Uhungarumlaut Aring -40
+KPX Uhungarumlaut Atilde -40
+KPX Uhungarumlaut comma -40
+KPX Uhungarumlaut period -40
+KPX Umacron A -40
+KPX Umacron Aacute -40
+KPX Umacron Abreve -40
+KPX Umacron Acircumflex -40
+KPX Umacron Adieresis -40
+KPX Umacron Agrave -40
+KPX Umacron Amacron -40
+KPX Umacron Aogonek -40
+KPX Umacron Aring -40
+KPX Umacron Atilde -40
+KPX Umacron comma -40
+KPX Umacron period -40
+KPX Uogonek A -40
+KPX Uogonek Aacute -40
+KPX Uogonek Abreve -40
+KPX Uogonek Acircumflex -40
+KPX Uogonek Adieresis -40
+KPX Uogonek Agrave -40
+KPX Uogonek Amacron -40
+KPX Uogonek Aogonek -40
+KPX Uogonek Aring -40
+KPX Uogonek Atilde -40
+KPX Uogonek comma -40
+KPX Uogonek period -40
+KPX Uring A -40
+KPX Uring Aacute -40
+KPX Uring Abreve -40
+KPX Uring Acircumflex -40
+KPX Uring Adieresis -40
+KPX Uring Agrave -40
+KPX Uring Amacron -40
+KPX Uring Aogonek -40
+KPX Uring Aring -40
+KPX Uring Atilde -40
+KPX Uring comma -40
+KPX Uring period -40
+KPX V A -80
+KPX V Aacute -80
+KPX V Abreve -80
+KPX V Acircumflex -80
+KPX V Adieresis -80
+KPX V Agrave -80
+KPX V Amacron -80
+KPX V Aogonek -80
+KPX V Aring -80
+KPX V Atilde -80
+KPX V G -40
+KPX V Gbreve -40
+KPX V Gcommaaccent -40
+KPX V O -40
+KPX V Oacute -40
+KPX V Ocircumflex -40
+KPX V Odieresis -40
+KPX V Ograve -40
+KPX V Ohungarumlaut -40
+KPX V Omacron -40
+KPX V Oslash -40
+KPX V Otilde -40
+KPX V a -70
+KPX V aacute -70
+KPX V abreve -70
+KPX V acircumflex -70
+KPX V adieresis -70
+KPX V agrave -70
+KPX V amacron -70
+KPX V aogonek -70
+KPX V aring -70
+KPX V atilde -70
+KPX V colon -40
+KPX V comma -125
+KPX V e -80
+KPX V eacute -80
+KPX V ecaron -80
+KPX V ecircumflex -80
+KPX V edieresis -80
+KPX V edotaccent -80
+KPX V egrave -80
+KPX V emacron -80
+KPX V eogonek -80
+KPX V hyphen -80
+KPX V o -80
+KPX V oacute -80
+KPX V ocircumflex -80
+KPX V odieresis -80
+KPX V ograve -80
+KPX V ohungarumlaut -80
+KPX V omacron -80
+KPX V oslash -80
+KPX V otilde -80
+KPX V period -125
+KPX V semicolon -40
+KPX V u -70
+KPX V uacute -70
+KPX V ucircumflex -70
+KPX V udieresis -70
+KPX V ugrave -70
+KPX V uhungarumlaut -70
+KPX V umacron -70
+KPX V uogonek -70
+KPX V uring -70
+KPX W A -50
+KPX W Aacute -50
+KPX W Abreve -50
+KPX W Acircumflex -50
+KPX W Adieresis -50
+KPX W Agrave -50
+KPX W Amacron -50
+KPX W Aogonek -50
+KPX W Aring -50
+KPX W Atilde -50
+KPX W O -20
+KPX W Oacute -20
+KPX W Ocircumflex -20
+KPX W Odieresis -20
+KPX W Ograve -20
+KPX W Ohungarumlaut -20
+KPX W Omacron -20
+KPX W Oslash -20
+KPX W Otilde -20
+KPX W a -40
+KPX W aacute -40
+KPX W abreve -40
+KPX W acircumflex -40
+KPX W adieresis -40
+KPX W agrave -40
+KPX W amacron -40
+KPX W aogonek -40
+KPX W aring -40
+KPX W atilde -40
+KPX W comma -80
+KPX W e -30
+KPX W eacute -30
+KPX W ecaron -30
+KPX W ecircumflex -30
+KPX W edieresis -30
+KPX W edotaccent -30
+KPX W egrave -30
+KPX W emacron -30
+KPX W eogonek -30
+KPX W hyphen -40
+KPX W o -30
+KPX W oacute -30
+KPX W ocircumflex -30
+KPX W odieresis -30
+KPX W ograve -30
+KPX W ohungarumlaut -30
+KPX W omacron -30
+KPX W oslash -30
+KPX W otilde -30
+KPX W period -80
+KPX W u -30
+KPX W uacute -30
+KPX W ucircumflex -30
+KPX W udieresis -30
+KPX W ugrave -30
+KPX W uhungarumlaut -30
+KPX W umacron -30
+KPX W uogonek -30
+KPX W uring -30
+KPX W y -20
+KPX W yacute -20
+KPX W ydieresis -20
+KPX Y A -110
+KPX Y Aacute -110
+KPX Y Abreve -110
+KPX Y Acircumflex -110
+KPX Y Adieresis -110
+KPX Y Agrave -110
+KPX Y Amacron -110
+KPX Y Aogonek -110
+KPX Y Aring -110
+KPX Y Atilde -110
+KPX Y O -85
+KPX Y Oacute -85
+KPX Y Ocircumflex -85
+KPX Y Odieresis -85
+KPX Y Ograve -85
+KPX Y Ohungarumlaut -85
+KPX Y Omacron -85
+KPX Y Oslash -85
+KPX Y Otilde -85
+KPX Y a -140
+KPX Y aacute -140
+KPX Y abreve -70
+KPX Y acircumflex -140
+KPX Y adieresis -140
+KPX Y agrave -140
+KPX Y amacron -70
+KPX Y aogonek -140
+KPX Y aring -140
+KPX Y atilde -140
+KPX Y colon -60
+KPX Y comma -140
+KPX Y e -140
+KPX Y eacute -140
+KPX Y ecaron -140
+KPX Y ecircumflex -140
+KPX Y edieresis -140
+KPX Y edotaccent -140
+KPX Y egrave -140
+KPX Y emacron -70
+KPX Y eogonek -140
+KPX Y hyphen -140
+KPX Y i -20
+KPX Y iacute -20
+KPX Y iogonek -20
+KPX Y o -140
+KPX Y oacute -140
+KPX Y ocircumflex -140
+KPX Y odieresis -140
+KPX Y ograve -140
+KPX Y ohungarumlaut -140
+KPX Y omacron -140
+KPX Y oslash -140
+KPX Y otilde -140
+KPX Y period -140
+KPX Y semicolon -60
+KPX Y u -110
+KPX Y uacute -110
+KPX Y ucircumflex -110
+KPX Y udieresis -110
+KPX Y ugrave -110
+KPX Y uhungarumlaut -110
+KPX Y umacron -110
+KPX Y uogonek -110
+KPX Y uring -110
+KPX Yacute A -110
+KPX Yacute Aacute -110
+KPX Yacute Abreve -110
+KPX Yacute Acircumflex -110
+KPX Yacute Adieresis -110
+KPX Yacute Agrave -110
+KPX Yacute Amacron -110
+KPX Yacute Aogonek -110
+KPX Yacute Aring -110
+KPX Yacute Atilde -110
+KPX Yacute O -85
+KPX Yacute Oacute -85
+KPX Yacute Ocircumflex -85
+KPX Yacute Odieresis -85
+KPX Yacute Ograve -85
+KPX Yacute Ohungarumlaut -85
+KPX Yacute Omacron -85
+KPX Yacute Oslash -85
+KPX Yacute Otilde -85
+KPX Yacute a -140
+KPX Yacute aacute -140
+KPX Yacute abreve -70
+KPX Yacute acircumflex -140
+KPX Yacute adieresis -140
+KPX Yacute agrave -140
+KPX Yacute amacron -70
+KPX Yacute aogonek -140
+KPX Yacute aring -140
+KPX Yacute atilde -70
+KPX Yacute colon -60
+KPX Yacute comma -140
+KPX Yacute e -140
+KPX Yacute eacute -140
+KPX Yacute ecaron -140
+KPX Yacute ecircumflex -140
+KPX Yacute edieresis -140
+KPX Yacute edotaccent -140
+KPX Yacute egrave -140
+KPX Yacute emacron -70
+KPX Yacute eogonek -140
+KPX Yacute hyphen -140
+KPX Yacute i -20
+KPX Yacute iacute -20
+KPX Yacute iogonek -20
+KPX Yacute o -140
+KPX Yacute oacute -140
+KPX Yacute ocircumflex -140
+KPX Yacute odieresis -140
+KPX Yacute ograve -140
+KPX Yacute ohungarumlaut -140
+KPX Yacute omacron -70
+KPX Yacute oslash -140
+KPX Yacute otilde -140
+KPX Yacute period -140
+KPX Yacute semicolon -60
+KPX Yacute u -110
+KPX Yacute uacute -110
+KPX Yacute ucircumflex -110
+KPX Yacute udieresis -110
+KPX Yacute ugrave -110
+KPX Yacute uhungarumlaut -110
+KPX Yacute umacron -110
+KPX Yacute uogonek -110
+KPX Yacute uring -110
+KPX Ydieresis A -110
+KPX Ydieresis Aacute -110
+KPX Ydieresis Abreve -110
+KPX Ydieresis Acircumflex -110
+KPX Ydieresis Adieresis -110
+KPX Ydieresis Agrave -110
+KPX Ydieresis Amacron -110
+KPX Ydieresis Aogonek -110
+KPX Ydieresis Aring -110
+KPX Ydieresis Atilde -110
+KPX Ydieresis O -85
+KPX Ydieresis Oacute -85
+KPX Ydieresis Ocircumflex -85
+KPX Ydieresis Odieresis -85
+KPX Ydieresis Ograve -85
+KPX Ydieresis Ohungarumlaut -85
+KPX Ydieresis Omacron -85
+KPX Ydieresis Oslash -85
+KPX Ydieresis Otilde -85
+KPX Ydieresis a -140
+KPX Ydieresis aacute -140
+KPX Ydieresis abreve -70
+KPX Ydieresis acircumflex -140
+KPX Ydieresis adieresis -140
+KPX Ydieresis agrave -140
+KPX Ydieresis amacron -70
+KPX Ydieresis aogonek -140
+KPX Ydieresis aring -140
+KPX Ydieresis atilde -70
+KPX Ydieresis colon -60
+KPX Ydieresis comma -140
+KPX Ydieresis e -140
+KPX Ydieresis eacute -140
+KPX Ydieresis ecaron -140
+KPX Ydieresis ecircumflex -140
+KPX Ydieresis edieresis -140
+KPX Ydieresis edotaccent -140
+KPX Ydieresis egrave -140
+KPX Ydieresis emacron -70
+KPX Ydieresis eogonek -140
+KPX Ydieresis hyphen -140
+KPX Ydieresis i -20
+KPX Ydieresis iacute -20
+KPX Ydieresis iogonek -20
+KPX Ydieresis o -140
+KPX Ydieresis oacute -140
+KPX Ydieresis ocircumflex -140
+KPX Ydieresis odieresis -140
+KPX Ydieresis ograve -140
+KPX Ydieresis ohungarumlaut -140
+KPX Ydieresis omacron -140
+KPX Ydieresis oslash -140
+KPX Ydieresis otilde -140
+KPX Ydieresis period -140
+KPX Ydieresis semicolon -60
+KPX Ydieresis u -110
+KPX Ydieresis uacute -110
+KPX Ydieresis ucircumflex -110
+KPX Ydieresis udieresis -110
+KPX Ydieresis ugrave -110
+KPX Ydieresis uhungarumlaut -110
+KPX Ydieresis umacron -110
+KPX Ydieresis uogonek -110
+KPX Ydieresis uring -110
+KPX a v -20
+KPX a w -20
+KPX a y -30
+KPX a yacute -30
+KPX a ydieresis -30
+KPX aacute v -20
+KPX aacute w -20
+KPX aacute y -30
+KPX aacute yacute -30
+KPX aacute ydieresis -30
+KPX abreve v -20
+KPX abreve w -20
+KPX abreve y -30
+KPX abreve yacute -30
+KPX abreve ydieresis -30
+KPX acircumflex v -20
+KPX acircumflex w -20
+KPX acircumflex y -30
+KPX acircumflex yacute -30
+KPX acircumflex ydieresis -30
+KPX adieresis v -20
+KPX adieresis w -20
+KPX adieresis y -30
+KPX adieresis yacute -30
+KPX adieresis ydieresis -30
+KPX agrave v -20
+KPX agrave w -20
+KPX agrave y -30
+KPX agrave yacute -30
+KPX agrave ydieresis -30
+KPX amacron v -20
+KPX amacron w -20
+KPX amacron y -30
+KPX amacron yacute -30
+KPX amacron ydieresis -30
+KPX aogonek v -20
+KPX aogonek w -20
+KPX aogonek y -30
+KPX aogonek yacute -30
+KPX aogonek ydieresis -30
+KPX aring v -20
+KPX aring w -20
+KPX aring y -30
+KPX aring yacute -30
+KPX aring ydieresis -30
+KPX atilde v -20
+KPX atilde w -20
+KPX atilde y -30
+KPX atilde yacute -30
+KPX atilde ydieresis -30
+KPX b b -10
+KPX b comma -40
+KPX b l -20
+KPX b lacute -20
+KPX b lcommaaccent -20
+KPX b lslash -20
+KPX b period -40
+KPX b u -20
+KPX b uacute -20
+KPX b ucircumflex -20
+KPX b udieresis -20
+KPX b ugrave -20
+KPX b uhungarumlaut -20
+KPX b umacron -20
+KPX b uogonek -20
+KPX b uring -20
+KPX b v -20
+KPX b y -20
+KPX b yacute -20
+KPX b ydieresis -20
+KPX c comma -15
+KPX c k -20
+KPX c kcommaaccent -20
+KPX cacute comma -15
+KPX cacute k -20
+KPX cacute kcommaaccent -20
+KPX ccaron comma -15
+KPX ccaron k -20
+KPX ccaron kcommaaccent -20
+KPX ccedilla comma -15
+KPX ccedilla k -20
+KPX ccedilla kcommaaccent -20
+KPX colon space -50
+KPX comma quotedblright -100
+KPX comma quoteright -100
+KPX e comma -15
+KPX e period -15
+KPX e v -30
+KPX e w -20
+KPX e x -30
+KPX e y -20
+KPX e yacute -20
+KPX e ydieresis -20
+KPX eacute comma -15
+KPX eacute period -15
+KPX eacute v -30
+KPX eacute w -20
+KPX eacute x -30
+KPX eacute y -20
+KPX eacute yacute -20
+KPX eacute ydieresis -20
+KPX ecaron comma -15
+KPX ecaron period -15
+KPX ecaron v -30
+KPX ecaron w -20
+KPX ecaron x -30
+KPX ecaron y -20
+KPX ecaron yacute -20
+KPX ecaron ydieresis -20
+KPX ecircumflex comma -15
+KPX ecircumflex period -15
+KPX ecircumflex v -30
+KPX ecircumflex w -20
+KPX ecircumflex x -30
+KPX ecircumflex y -20
+KPX ecircumflex yacute -20
+KPX ecircumflex ydieresis -20
+KPX edieresis comma -15
+KPX edieresis period -15
+KPX edieresis v -30
+KPX edieresis w -20
+KPX edieresis x -30
+KPX edieresis y -20
+KPX edieresis yacute -20
+KPX edieresis ydieresis -20
+KPX edotaccent comma -15
+KPX edotaccent period -15
+KPX edotaccent v -30
+KPX edotaccent w -20
+KPX edotaccent x -30
+KPX edotaccent y -20
+KPX edotaccent yacute -20
+KPX edotaccent ydieresis -20
+KPX egrave comma -15
+KPX egrave period -15
+KPX egrave v -30
+KPX egrave w -20
+KPX egrave x -30
+KPX egrave y -20
+KPX egrave yacute -20
+KPX egrave ydieresis -20
+KPX emacron comma -15
+KPX emacron period -15
+KPX emacron v -30
+KPX emacron w -20
+KPX emacron x -30
+KPX emacron y -20
+KPX emacron yacute -20
+KPX emacron ydieresis -20
+KPX eogonek comma -15
+KPX eogonek period -15
+KPX eogonek v -30
+KPX eogonek w -20
+KPX eogonek x -30
+KPX eogonek y -20
+KPX eogonek yacute -20
+KPX eogonek ydieresis -20
+KPX f a -30
+KPX f aacute -30
+KPX f abreve -30
+KPX f acircumflex -30
+KPX f adieresis -30
+KPX f agrave -30
+KPX f amacron -30
+KPX f aogonek -30
+KPX f aring -30
+KPX f atilde -30
+KPX f comma -30
+KPX f dotlessi -28
+KPX f e -30
+KPX f eacute -30
+KPX f ecaron -30
+KPX f ecircumflex -30
+KPX f edieresis -30
+KPX f edotaccent -30
+KPX f egrave -30
+KPX f emacron -30
+KPX f eogonek -30
+KPX f o -30
+KPX f oacute -30
+KPX f ocircumflex -30
+KPX f odieresis -30
+KPX f ograve -30
+KPX f ohungarumlaut -30
+KPX f omacron -30
+KPX f oslash -30
+KPX f otilde -30
+KPX f period -30
+KPX f quotedblright 60
+KPX f quoteright 50
+KPX g r -10
+KPX g racute -10
+KPX g rcaron -10
+KPX g rcommaaccent -10
+KPX gbreve r -10
+KPX gbreve racute -10
+KPX gbreve rcaron -10
+KPX gbreve rcommaaccent -10
+KPX gcommaaccent r -10
+KPX gcommaaccent racute -10
+KPX gcommaaccent rcaron -10
+KPX gcommaaccent rcommaaccent -10
+KPX h y -30
+KPX h yacute -30
+KPX h ydieresis -30
+KPX k e -20
+KPX k eacute -20
+KPX k ecaron -20
+KPX k ecircumflex -20
+KPX k edieresis -20
+KPX k edotaccent -20
+KPX k egrave -20
+KPX k emacron -20
+KPX k eogonek -20
+KPX k o -20
+KPX k oacute -20
+KPX k ocircumflex -20
+KPX k odieresis -20
+KPX k ograve -20
+KPX k ohungarumlaut -20
+KPX k omacron -20
+KPX k oslash -20
+KPX k otilde -20
+KPX kcommaaccent e -20
+KPX kcommaaccent eacute -20
+KPX kcommaaccent ecaron -20
+KPX kcommaaccent ecircumflex -20
+KPX kcommaaccent edieresis -20
+KPX kcommaaccent edotaccent -20
+KPX kcommaaccent egrave -20
+KPX kcommaaccent emacron -20
+KPX kcommaaccent eogonek -20
+KPX kcommaaccent o -20
+KPX kcommaaccent oacute -20
+KPX kcommaaccent ocircumflex -20
+KPX kcommaaccent odieresis -20
+KPX kcommaaccent ograve -20
+KPX kcommaaccent ohungarumlaut -20
+KPX kcommaaccent omacron -20
+KPX kcommaaccent oslash -20
+KPX kcommaaccent otilde -20
+KPX m u -10
+KPX m uacute -10
+KPX m ucircumflex -10
+KPX m udieresis -10
+KPX m ugrave -10
+KPX m uhungarumlaut -10
+KPX m umacron -10
+KPX m uogonek -10
+KPX m uring -10
+KPX m y -15
+KPX m yacute -15
+KPX m ydieresis -15
+KPX n u -10
+KPX n uacute -10
+KPX n ucircumflex -10
+KPX n udieresis -10
+KPX n ugrave -10
+KPX n uhungarumlaut -10
+KPX n umacron -10
+KPX n uogonek -10
+KPX n uring -10
+KPX n v -20
+KPX n y -15
+KPX n yacute -15
+KPX n ydieresis -15
+KPX nacute u -10
+KPX nacute uacute -10
+KPX nacute ucircumflex -10
+KPX nacute udieresis -10
+KPX nacute ugrave -10
+KPX nacute uhungarumlaut -10
+KPX nacute umacron -10
+KPX nacute uogonek -10
+KPX nacute uring -10
+KPX nacute v -20
+KPX nacute y -15
+KPX nacute yacute -15
+KPX nacute ydieresis -15
+KPX ncaron u -10
+KPX ncaron uacute -10
+KPX ncaron ucircumflex -10
+KPX ncaron udieresis -10
+KPX ncaron ugrave -10
+KPX ncaron uhungarumlaut -10
+KPX ncaron umacron -10
+KPX ncaron uogonek -10
+KPX ncaron uring -10
+KPX ncaron v -20
+KPX ncaron y -15
+KPX ncaron yacute -15
+KPX ncaron ydieresis -15
+KPX ncommaaccent u -10
+KPX ncommaaccent uacute -10
+KPX ncommaaccent ucircumflex -10
+KPX ncommaaccent udieresis -10
+KPX ncommaaccent ugrave -10
+KPX ncommaaccent uhungarumlaut -10
+KPX ncommaaccent umacron -10
+KPX ncommaaccent uogonek -10
+KPX ncommaaccent uring -10
+KPX ncommaaccent v -20
+KPX ncommaaccent y -15
+KPX ncommaaccent yacute -15
+KPX ncommaaccent ydieresis -15
+KPX ntilde u -10
+KPX ntilde uacute -10
+KPX ntilde ucircumflex -10
+KPX ntilde udieresis -10
+KPX ntilde ugrave -10
+KPX ntilde uhungarumlaut -10
+KPX ntilde umacron -10
+KPX ntilde uogonek -10
+KPX ntilde uring -10
+KPX ntilde v -20
+KPX ntilde y -15
+KPX ntilde yacute -15
+KPX ntilde ydieresis -15
+KPX o comma -40
+KPX o period -40
+KPX o v -15
+KPX o w -15
+KPX o x -30
+KPX o y -30
+KPX o yacute -30
+KPX o ydieresis -30
+KPX oacute comma -40
+KPX oacute period -40
+KPX oacute v -15
+KPX oacute w -15
+KPX oacute x -30
+KPX oacute y -30
+KPX oacute yacute -30
+KPX oacute ydieresis -30
+KPX ocircumflex comma -40
+KPX ocircumflex period -40
+KPX ocircumflex v -15
+KPX ocircumflex w -15
+KPX ocircumflex x -30
+KPX ocircumflex y -30
+KPX ocircumflex yacute -30
+KPX ocircumflex ydieresis -30
+KPX odieresis comma -40
+KPX odieresis period -40
+KPX odieresis v -15
+KPX odieresis w -15
+KPX odieresis x -30
+KPX odieresis y -30
+KPX odieresis yacute -30
+KPX odieresis ydieresis -30
+KPX ograve comma -40
+KPX ograve period -40
+KPX ograve v -15
+KPX ograve w -15
+KPX ograve x -30
+KPX ograve y -30
+KPX ograve yacute -30
+KPX ograve ydieresis -30
+KPX ohungarumlaut comma -40
+KPX ohungarumlaut period -40
+KPX ohungarumlaut v -15
+KPX ohungarumlaut w -15
+KPX ohungarumlaut x -30
+KPX ohungarumlaut y -30
+KPX ohungarumlaut yacute -30
+KPX ohungarumlaut ydieresis -30
+KPX omacron comma -40
+KPX omacron period -40
+KPX omacron v -15
+KPX omacron w -15
+KPX omacron x -30
+KPX omacron y -30
+KPX omacron yacute -30
+KPX omacron ydieresis -30
+KPX oslash a -55
+KPX oslash aacute -55
+KPX oslash abreve -55
+KPX oslash acircumflex -55
+KPX oslash adieresis -55
+KPX oslash agrave -55
+KPX oslash amacron -55
+KPX oslash aogonek -55
+KPX oslash aring -55
+KPX oslash atilde -55
+KPX oslash b -55
+KPX oslash c -55
+KPX oslash cacute -55
+KPX oslash ccaron -55
+KPX oslash ccedilla -55
+KPX oslash comma -95
+KPX oslash d -55
+KPX oslash dcroat -55
+KPX oslash e -55
+KPX oslash eacute -55
+KPX oslash ecaron -55
+KPX oslash ecircumflex -55
+KPX oslash edieresis -55
+KPX oslash edotaccent -55
+KPX oslash egrave -55
+KPX oslash emacron -55
+KPX oslash eogonek -55
+KPX oslash f -55
+KPX oslash g -55
+KPX oslash gbreve -55
+KPX oslash gcommaaccent -55
+KPX oslash h -55
+KPX oslash i -55
+KPX oslash iacute -55
+KPX oslash icircumflex -55
+KPX oslash idieresis -55
+KPX oslash igrave -55
+KPX oslash imacron -55
+KPX oslash iogonek -55
+KPX oslash j -55
+KPX oslash k -55
+KPX oslash kcommaaccent -55
+KPX oslash l -55
+KPX oslash lacute -55
+KPX oslash lcommaaccent -55
+KPX oslash lslash -55
+KPX oslash m -55
+KPX oslash n -55
+KPX oslash nacute -55
+KPX oslash ncaron -55
+KPX oslash ncommaaccent -55
+KPX oslash ntilde -55
+KPX oslash o -55
+KPX oslash oacute -55
+KPX oslash ocircumflex -55
+KPX oslash odieresis -55
+KPX oslash ograve -55
+KPX oslash ohungarumlaut -55
+KPX oslash omacron -55
+KPX oslash oslash -55
+KPX oslash otilde -55
+KPX oslash p -55
+KPX oslash period -95
+KPX oslash q -55
+KPX oslash r -55
+KPX oslash racute -55
+KPX oslash rcaron -55
+KPX oslash rcommaaccent -55
+KPX oslash s -55
+KPX oslash sacute -55
+KPX oslash scaron -55
+KPX oslash scedilla -55
+KPX oslash scommaaccent -55
+KPX oslash t -55
+KPX oslash tcommaaccent -55
+KPX oslash u -55
+KPX oslash uacute -55
+KPX oslash ucircumflex -55
+KPX oslash udieresis -55
+KPX oslash ugrave -55
+KPX oslash uhungarumlaut -55
+KPX oslash umacron -55
+KPX oslash uogonek -55
+KPX oslash uring -55
+KPX oslash v -70
+KPX oslash w -70
+KPX oslash x -85
+KPX oslash y -70
+KPX oslash yacute -70
+KPX oslash ydieresis -70
+KPX oslash z -55
+KPX oslash zacute -55
+KPX oslash zcaron -55
+KPX oslash zdotaccent -55
+KPX otilde comma -40
+KPX otilde period -40
+KPX otilde v -15
+KPX otilde w -15
+KPX otilde x -30
+KPX otilde y -30
+KPX otilde yacute -30
+KPX otilde ydieresis -30
+KPX p comma -35
+KPX p period -35
+KPX p y -30
+KPX p yacute -30
+KPX p ydieresis -30
+KPX period quotedblright -100
+KPX period quoteright -100
+KPX period space -60
+KPX quotedblright space -40
+KPX quoteleft quoteleft -57
+KPX quoteright d -50
+KPX quoteright dcroat -50
+KPX quoteright quoteright -57
+KPX quoteright r -50
+KPX quoteright racute -50
+KPX quoteright rcaron -50
+KPX quoteright rcommaaccent -50
+KPX quoteright s -50
+KPX quoteright sacute -50
+KPX quoteright scaron -50
+KPX quoteright scedilla -50
+KPX quoteright scommaaccent -50
+KPX quoteright space -70
+KPX r a -10
+KPX r aacute -10
+KPX r abreve -10
+KPX r acircumflex -10
+KPX r adieresis -10
+KPX r agrave -10
+KPX r amacron -10
+KPX r aogonek -10
+KPX r aring -10
+KPX r atilde -10
+KPX r colon 30
+KPX r comma -50
+KPX r i 15
+KPX r iacute 15
+KPX r icircumflex 15
+KPX r idieresis 15
+KPX r igrave 15
+KPX r imacron 15
+KPX r iogonek 15
+KPX r k 15
+KPX r kcommaaccent 15
+KPX r l 15
+KPX r lacute 15
+KPX r lcommaaccent 15
+KPX r lslash 15
+KPX r m 25
+KPX r n 25
+KPX r nacute 25
+KPX r ncaron 25
+KPX r ncommaaccent 25
+KPX r ntilde 25
+KPX r p 30
+KPX r period -50
+KPX r semicolon 30
+KPX r t 40
+KPX r tcommaaccent 40
+KPX r u 15
+KPX r uacute 15
+KPX r ucircumflex 15
+KPX r udieresis 15
+KPX r ugrave 15
+KPX r uhungarumlaut 15
+KPX r umacron 15
+KPX r uogonek 15
+KPX r uring 15
+KPX r v 30
+KPX r y 30
+KPX r yacute 30
+KPX r ydieresis 30
+KPX racute a -10
+KPX racute aacute -10
+KPX racute abreve -10
+KPX racute acircumflex -10
+KPX racute adieresis -10
+KPX racute agrave -10
+KPX racute amacron -10
+KPX racute aogonek -10
+KPX racute aring -10
+KPX racute atilde -10
+KPX racute colon 30
+KPX racute comma -50
+KPX racute i 15
+KPX racute iacute 15
+KPX racute icircumflex 15
+KPX racute idieresis 15
+KPX racute igrave 15
+KPX racute imacron 15
+KPX racute iogonek 15
+KPX racute k 15
+KPX racute kcommaaccent 15
+KPX racute l 15
+KPX racute lacute 15
+KPX racute lcommaaccent 15
+KPX racute lslash 15
+KPX racute m 25
+KPX racute n 25
+KPX racute nacute 25
+KPX racute ncaron 25
+KPX racute ncommaaccent 25
+KPX racute ntilde 25
+KPX racute p 30
+KPX racute period -50
+KPX racute semicolon 30
+KPX racute t 40
+KPX racute tcommaaccent 40
+KPX racute u 15
+KPX racute uacute 15
+KPX racute ucircumflex 15
+KPX racute udieresis 15
+KPX racute ugrave 15
+KPX racute uhungarumlaut 15
+KPX racute umacron 15
+KPX racute uogonek 15
+KPX racute uring 15
+KPX racute v 30
+KPX racute y 30
+KPX racute yacute 30
+KPX racute ydieresis 30
+KPX rcaron a -10
+KPX rcaron aacute -10
+KPX rcaron abreve -10
+KPX rcaron acircumflex -10
+KPX rcaron adieresis -10
+KPX rcaron agrave -10
+KPX rcaron amacron -10
+KPX rcaron aogonek -10
+KPX rcaron aring -10
+KPX rcaron atilde -10
+KPX rcaron colon 30
+KPX rcaron comma -50
+KPX rcaron i 15
+KPX rcaron iacute 15
+KPX rcaron icircumflex 15
+KPX rcaron idieresis 15
+KPX rcaron igrave 15
+KPX rcaron imacron 15
+KPX rcaron iogonek 15
+KPX rcaron k 15
+KPX rcaron kcommaaccent 15
+KPX rcaron l 15
+KPX rcaron lacute 15
+KPX rcaron lcommaaccent 15
+KPX rcaron lslash 15
+KPX rcaron m 25
+KPX rcaron n 25
+KPX rcaron nacute 25
+KPX rcaron ncaron 25
+KPX rcaron ncommaaccent 25
+KPX rcaron ntilde 25
+KPX rcaron p 30
+KPX rcaron period -50
+KPX rcaron semicolon 30
+KPX rcaron t 40
+KPX rcaron tcommaaccent 40
+KPX rcaron u 15
+KPX rcaron uacute 15
+KPX rcaron ucircumflex 15
+KPX rcaron udieresis 15
+KPX rcaron ugrave 15
+KPX rcaron uhungarumlaut 15
+KPX rcaron umacron 15
+KPX rcaron uogonek 15
+KPX rcaron uring 15
+KPX rcaron v 30
+KPX rcaron y 30
+KPX rcaron yacute 30
+KPX rcaron ydieresis 30
+KPX rcommaaccent a -10
+KPX rcommaaccent aacute -10
+KPX rcommaaccent abreve -10
+KPX rcommaaccent acircumflex -10
+KPX rcommaaccent adieresis -10
+KPX rcommaaccent agrave -10
+KPX rcommaaccent amacron -10
+KPX rcommaaccent aogonek -10
+KPX rcommaaccent aring -10
+KPX rcommaaccent atilde -10
+KPX rcommaaccent colon 30
+KPX rcommaaccent comma -50
+KPX rcommaaccent i 15
+KPX rcommaaccent iacute 15
+KPX rcommaaccent icircumflex 15
+KPX rcommaaccent idieresis 15
+KPX rcommaaccent igrave 15
+KPX rcommaaccent imacron 15
+KPX rcommaaccent iogonek 15
+KPX rcommaaccent k 15
+KPX rcommaaccent kcommaaccent 15
+KPX rcommaaccent l 15
+KPX rcommaaccent lacute 15
+KPX rcommaaccent lcommaaccent 15
+KPX rcommaaccent lslash 15
+KPX rcommaaccent m 25
+KPX rcommaaccent n 25
+KPX rcommaaccent nacute 25
+KPX rcommaaccent ncaron 25
+KPX rcommaaccent ncommaaccent 25
+KPX rcommaaccent ntilde 25
+KPX rcommaaccent p 30
+KPX rcommaaccent period -50
+KPX rcommaaccent semicolon 30
+KPX rcommaaccent t 40
+KPX rcommaaccent tcommaaccent 40
+KPX rcommaaccent u 15
+KPX rcommaaccent uacute 15
+KPX rcommaaccent ucircumflex 15
+KPX rcommaaccent udieresis 15
+KPX rcommaaccent ugrave 15
+KPX rcommaaccent uhungarumlaut 15
+KPX rcommaaccent umacron 15
+KPX rcommaaccent uogonek 15
+KPX rcommaaccent uring 15
+KPX rcommaaccent v 30
+KPX rcommaaccent y 30
+KPX rcommaaccent yacute 30
+KPX rcommaaccent ydieresis 30
+KPX s comma -15
+KPX s period -15
+KPX s w -30
+KPX sacute comma -15
+KPX sacute period -15
+KPX sacute w -30
+KPX scaron comma -15
+KPX scaron period -15
+KPX scaron w -30
+KPX scedilla comma -15
+KPX scedilla period -15
+KPX scedilla w -30
+KPX scommaaccent comma -15
+KPX scommaaccent period -15
+KPX scommaaccent w -30
+KPX semicolon space -50
+KPX space T -50
+KPX space Tcaron -50
+KPX space Tcommaaccent -50
+KPX space V -50
+KPX space W -40
+KPX space Y -90
+KPX space Yacute -90
+KPX space Ydieresis -90
+KPX space quotedblleft -30
+KPX space quoteleft -60
+KPX v a -25
+KPX v aacute -25
+KPX v abreve -25
+KPX v acircumflex -25
+KPX v adieresis -25
+KPX v agrave -25
+KPX v amacron -25
+KPX v aogonek -25
+KPX v aring -25
+KPX v atilde -25
+KPX v comma -80
+KPX v e -25
+KPX v eacute -25
+KPX v ecaron -25
+KPX v ecircumflex -25
+KPX v edieresis -25
+KPX v edotaccent -25
+KPX v egrave -25
+KPX v emacron -25
+KPX v eogonek -25
+KPX v o -25
+KPX v oacute -25
+KPX v ocircumflex -25
+KPX v odieresis -25
+KPX v ograve -25
+KPX v ohungarumlaut -25
+KPX v omacron -25
+KPX v oslash -25
+KPX v otilde -25
+KPX v period -80
+KPX w a -15
+KPX w aacute -15
+KPX w abreve -15
+KPX w acircumflex -15
+KPX w adieresis -15
+KPX w agrave -15
+KPX w amacron -15
+KPX w aogonek -15
+KPX w aring -15
+KPX w atilde -15
+KPX w comma -60
+KPX w e -10
+KPX w eacute -10
+KPX w ecaron -10
+KPX w ecircumflex -10
+KPX w edieresis -10
+KPX w edotaccent -10
+KPX w egrave -10
+KPX w emacron -10
+KPX w eogonek -10
+KPX w o -10
+KPX w oacute -10
+KPX w ocircumflex -10
+KPX w odieresis -10
+KPX w ograve -10
+KPX w ohungarumlaut -10
+KPX w omacron -10
+KPX w oslash -10
+KPX w otilde -10
+KPX w period -60
+KPX x e -30
+KPX x eacute -30
+KPX x ecaron -30
+KPX x ecircumflex -30
+KPX x edieresis -30
+KPX x edotaccent -30
+KPX x egrave -30
+KPX x emacron -30
+KPX x eogonek -30
+KPX y a -20
+KPX y aacute -20
+KPX y abreve -20
+KPX y acircumflex -20
+KPX y adieresis -20
+KPX y agrave -20
+KPX y amacron -20
+KPX y aogonek -20
+KPX y aring -20
+KPX y atilde -20
+KPX y comma -100
+KPX y e -20
+KPX y eacute -20
+KPX y ecaron -20
+KPX y ecircumflex -20
+KPX y edieresis -20
+KPX y edotaccent -20
+KPX y egrave -20
+KPX y emacron -20
+KPX y eogonek -20
+KPX y o -20
+KPX y oacute -20
+KPX y ocircumflex -20
+KPX y odieresis -20
+KPX y ograve -20
+KPX y ohungarumlaut -20
+KPX y omacron -20
+KPX y oslash -20
+KPX y otilde -20
+KPX y period -100
+KPX yacute a -20
+KPX yacute aacute -20
+KPX yacute abreve -20
+KPX yacute acircumflex -20
+KPX yacute adieresis -20
+KPX yacute agrave -20
+KPX yacute amacron -20
+KPX yacute aogonek -20
+KPX yacute aring -20
+KPX yacute atilde -20
+KPX yacute comma -100
+KPX yacute e -20
+KPX yacute eacute -20
+KPX yacute ecaron -20
+KPX yacute ecircumflex -20
+KPX yacute edieresis -20
+KPX yacute edotaccent -20
+KPX yacute egrave -20
+KPX yacute emacron -20
+KPX yacute eogonek -20
+KPX yacute o -20
+KPX yacute oacute -20
+KPX yacute ocircumflex -20
+KPX yacute odieresis -20
+KPX yacute ograve -20
+KPX yacute ohungarumlaut -20
+KPX yacute omacron -20
+KPX yacute oslash -20
+KPX yacute otilde -20
+KPX yacute period -100
+KPX ydieresis a -20
+KPX ydieresis aacute -20
+KPX ydieresis abreve -20
+KPX ydieresis acircumflex -20
+KPX ydieresis adieresis -20
+KPX ydieresis agrave -20
+KPX ydieresis amacron -20
+KPX ydieresis aogonek -20
+KPX ydieresis aring -20
+KPX ydieresis atilde -20
+KPX ydieresis comma -100
+KPX ydieresis e -20
+KPX ydieresis eacute -20
+KPX ydieresis ecaron -20
+KPX ydieresis ecircumflex -20
+KPX ydieresis edieresis -20
+KPX ydieresis edotaccent -20
+KPX ydieresis egrave -20
+KPX ydieresis emacron -20
+KPX ydieresis eogonek -20
+KPX ydieresis o -20
+KPX ydieresis oacute -20
+KPX ydieresis ocircumflex -20
+KPX ydieresis odieresis -20
+KPX ydieresis ograve -20
+KPX ydieresis ohungarumlaut -20
+KPX ydieresis omacron -20
+KPX ydieresis oslash -20
+KPX ydieresis otilde -20
+KPX ydieresis period -100
+KPX z e -15
+KPX z eacute -15
+KPX z ecaron -15
+KPX z ecircumflex -15
+KPX z edieresis -15
+KPX z edotaccent -15
+KPX z egrave -15
+KPX z emacron -15
+KPX z eogonek -15
+KPX z o -15
+KPX z oacute -15
+KPX z ocircumflex -15
+KPX z odieresis -15
+KPX z ograve -15
+KPX z ohungarumlaut -15
+KPX z omacron -15
+KPX z oslash -15
+KPX z otilde -15
+KPX zacute e -15
+KPX zacute eacute -15
+KPX zacute ecaron -15
+KPX zacute ecircumflex -15
+KPX zacute edieresis -15
+KPX zacute edotaccent -15
+KPX zacute egrave -15
+KPX zacute emacron -15
+KPX zacute eogonek -15
+KPX zacute o -15
+KPX zacute oacute -15
+KPX zacute ocircumflex -15
+KPX zacute odieresis -15
+KPX zacute ograve -15
+KPX zacute ohungarumlaut -15
+KPX zacute omacron -15
+KPX zacute oslash -15
+KPX zacute otilde -15
+KPX zcaron e -15
+KPX zcaron eacute -15
+KPX zcaron ecaron -15
+KPX zcaron ecircumflex -15
+KPX zcaron edieresis -15
+KPX zcaron edotaccent -15
+KPX zcaron egrave -15
+KPX zcaron emacron -15
+KPX zcaron eogonek -15
+KPX zcaron o -15
+KPX zcaron oacute -15
+KPX zcaron ocircumflex -15
+KPX zcaron odieresis -15
+KPX zcaron ograve -15
+KPX zcaron ohungarumlaut -15
+KPX zcaron omacron -15
+KPX zcaron oslash -15
+KPX zcaron otilde -15
+KPX zdotaccent e -15
+KPX zdotaccent eacute -15
+KPX zdotaccent ecaron -15
+KPX zdotaccent ecircumflex -15
+KPX zdotaccent edieresis -15
+KPX zdotaccent edotaccent -15
+KPX zdotaccent egrave -15
+KPX zdotaccent emacron -15
+KPX zdotaccent eogonek -15
+KPX zdotaccent o -15
+KPX zdotaccent oacute -15
+KPX zdotaccent ocircumflex -15
+KPX zdotaccent odieresis -15
+KPX zdotaccent ograve -15
+KPX zdotaccent ohungarumlaut -15
+KPX zdotaccent omacron -15
+KPX zdotaccent oslash -15
+KPX zdotaccent otilde -15
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/src/fonts/Adobe-Core35_AFMs-314/Helvetica-NarrowBold.afm b/src/fonts/Adobe-Core35_AFMs-314/Helvetica-NarrowBold.afm
new file mode 100644
index 0000000..19f0ede
--- /dev/null
+++ b/src/fonts/Adobe-Core35_AFMs-314/Helvetica-NarrowBold.afm
@@ -0,0 +1,2825 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Fri May 2 16:55:34 1997
+Comment UniqueID 43181
+Comment VMusage 14482 68586
+FontName Helvetica-Narrow-Bold
+FullName Helvetica Narrow Bold
+FamilyName Helvetica
+Weight Bold
+ItalicAngle 0
+IsFixedPitch false
+FontBBox -139 -228 822 962
+UnderlinePosition -100
+UnderlineThickness 50
+Version 002.000
+Notice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries.
+EncodingScheme AdobeStandardEncoding
+CapHeight 718
+XHeight 532
+Ascender 718
+Descender -207
+StdHW 118
+StdVW 140
+StartCharMetrics 314
+C 32 ; WX 228 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 273 ; N exclam ; B 74 0 200 718 ;
+C 34 ; WX 389 ; N quotedbl ; B 80 447 308 718 ;
+C 35 ; WX 456 ; N numbersign ; B 15 0 441 698 ;
+C 36 ; WX 456 ; N dollar ; B 25 -115 429 775 ;
+C 37 ; WX 729 ; N percent ; B 23 -19 706 710 ;
+C 38 ; WX 592 ; N ampersand ; B 44 -19 575 718 ;
+C 39 ; WX 228 ; N quoteright ; B 57 445 171 718 ;
+C 40 ; WX 273 ; N parenleft ; B 29 -208 257 734 ;
+C 41 ; WX 273 ; N parenright ; B 16 -208 244 734 ;
+C 42 ; WX 319 ; N asterisk ; B 22 387 297 718 ;
+C 43 ; WX 479 ; N plus ; B 33 0 446 506 ;
+C 44 ; WX 228 ; N comma ; B 52 -168 175 146 ;
+C 45 ; WX 273 ; N hyphen ; B 22 215 251 345 ;
+C 46 ; WX 228 ; N period ; B 52 0 175 146 ;
+C 47 ; WX 228 ; N slash ; B -27 -19 255 737 ;
+C 48 ; WX 456 ; N zero ; B 26 -19 430 710 ;
+C 49 ; WX 456 ; N one ; B 57 0 310 710 ;
+C 50 ; WX 456 ; N two ; B 21 0 419 710 ;
+C 51 ; WX 456 ; N three ; B 22 -19 423 710 ;
+C 52 ; WX 456 ; N four ; B 22 0 431 710 ;
+C 53 ; WX 456 ; N five ; B 22 -19 423 698 ;
+C 54 ; WX 456 ; N six ; B 25 -19 426 710 ;
+C 55 ; WX 456 ; N seven ; B 21 0 433 698 ;
+C 56 ; WX 456 ; N eight ; B 26 -19 430 710 ;
+C 57 ; WX 456 ; N nine ; B 25 -19 428 710 ;
+C 58 ; WX 273 ; N colon ; B 75 0 198 512 ;
+C 59 ; WX 273 ; N semicolon ; B 75 -168 198 512 ;
+C 60 ; WX 479 ; N less ; B 31 -8 448 514 ;
+C 61 ; WX 479 ; N equal ; B 33 87 446 419 ;
+C 62 ; WX 479 ; N greater ; B 31 -8 448 514 ;
+C 63 ; WX 501 ; N question ; B 49 0 456 727 ;
+C 64 ; WX 800 ; N at ; B 97 -19 702 737 ;
+C 65 ; WX 592 ; N A ; B 16 0 576 718 ;
+C 66 ; WX 592 ; N B ; B 62 0 549 718 ;
+C 67 ; WX 592 ; N C ; B 36 -19 561 737 ;
+C 68 ; WX 592 ; N D ; B 62 0 562 718 ;
+C 69 ; WX 547 ; N E ; B 62 0 509 718 ;
+C 70 ; WX 501 ; N F ; B 62 0 481 718 ;
+C 71 ; WX 638 ; N G ; B 36 -19 585 737 ;
+C 72 ; WX 592 ; N H ; B 58 0 534 718 ;
+C 73 ; WX 228 ; N I ; B 52 0 175 718 ;
+C 74 ; WX 456 ; N J ; B 18 -18 397 718 ;
+C 75 ; WX 592 ; N K ; B 71 0 592 718 ;
+C 76 ; WX 501 ; N L ; B 62 0 478 718 ;
+C 77 ; WX 683 ; N M ; B 57 0 627 718 ;
+C 78 ; WX 592 ; N N ; B 57 0 536 718 ;
+C 79 ; WX 638 ; N O ; B 36 -19 602 737 ;
+C 80 ; WX 547 ; N P ; B 62 0 514 718 ;
+C 81 ; WX 638 ; N Q ; B 36 -52 604 737 ;
+C 82 ; WX 592 ; N R ; B 62 0 555 718 ;
+C 83 ; WX 547 ; N S ; B 32 -19 516 737 ;
+C 84 ; WX 501 ; N T ; B 11 0 490 718 ;
+C 85 ; WX 592 ; N U ; B 59 -19 534 718 ;
+C 86 ; WX 547 ; N V ; B 16 0 531 718 ;
+C 87 ; WX 774 ; N W ; B 13 0 762 718 ;
+C 88 ; WX 547 ; N X ; B 11 0 535 718 ;
+C 89 ; WX 547 ; N Y ; B 12 0 535 718 ;
+C 90 ; WX 501 ; N Z ; B 21 0 481 718 ;
+C 91 ; WX 273 ; N bracketleft ; B 52 -196 253 722 ;
+C 92 ; WX 228 ; N backslash ; B -27 -19 255 737 ;
+C 93 ; WX 273 ; N bracketright ; B 20 -196 221 722 ;
+C 94 ; WX 479 ; N asciicircum ; B 51 323 428 698 ;
+C 95 ; WX 456 ; N underscore ; B 0 -125 456 -75 ;
+C 96 ; WX 228 ; N quoteleft ; B 57 454 171 727 ;
+C 97 ; WX 456 ; N a ; B 24 -14 432 546 ;
+C 98 ; WX 501 ; N b ; B 50 -14 474 718 ;
+C 99 ; WX 456 ; N c ; B 28 -14 430 546 ;
+C 100 ; WX 501 ; N d ; B 28 -14 452 718 ;
+C 101 ; WX 456 ; N e ; B 19 -14 433 546 ;
+C 102 ; WX 273 ; N f ; B 8 0 261 727 ; L i fi ; L l fl ;
+C 103 ; WX 501 ; N g ; B 33 -217 453 546 ;
+C 104 ; WX 501 ; N h ; B 53 0 448 718 ;
+C 105 ; WX 228 ; N i ; B 57 0 171 725 ;
+C 106 ; WX 228 ; N j ; B 2 -214 171 725 ;
+C 107 ; WX 456 ; N k ; B 57 0 461 718 ;
+C 108 ; WX 228 ; N l ; B 57 0 171 718 ;
+C 109 ; WX 729 ; N m ; B 52 0 677 546 ;
+C 110 ; WX 501 ; N n ; B 53 0 448 546 ;
+C 111 ; WX 501 ; N o ; B 28 -14 474 546 ;
+C 112 ; WX 501 ; N p ; B 51 -207 474 546 ;
+C 113 ; WX 501 ; N q ; B 28 -207 453 546 ;
+C 114 ; WX 319 ; N r ; B 52 0 306 546 ;
+C 115 ; WX 456 ; N s ; B 25 -14 426 546 ;
+C 116 ; WX 273 ; N t ; B 8 -6 253 676 ;
+C 117 ; WX 501 ; N u ; B 54 -14 447 532 ;
+C 118 ; WX 456 ; N v ; B 11 0 445 532 ;
+C 119 ; WX 638 ; N w ; B 8 0 631 532 ;
+C 120 ; WX 456 ; N x ; B 12 0 444 532 ;
+C 121 ; WX 456 ; N y ; B 8 -214 442 532 ;
+C 122 ; WX 410 ; N z ; B 16 0 394 532 ;
+C 123 ; WX 319 ; N braceleft ; B 39 -196 299 722 ;
+C 124 ; WX 230 ; N bar ; B 69 -225 161 775 ;
+C 125 ; WX 319 ; N braceright ; B 20 -196 280 722 ;
+C 126 ; WX 479 ; N asciitilde ; B 50 163 429 343 ;
+C 161 ; WX 273 ; N exclamdown ; B 74 -186 200 532 ;
+C 162 ; WX 456 ; N cent ; B 28 -118 430 628 ;
+C 163 ; WX 456 ; N sterling ; B 23 -16 444 718 ;
+C 164 ; WX 137 ; N fraction ; B -139 -19 276 710 ;
+C 165 ; WX 456 ; N yen ; B -7 0 463 698 ;
+C 166 ; WX 456 ; N florin ; B -8 -210 423 737 ;
+C 167 ; WX 456 ; N section ; B 28 -184 428 727 ;
+C 168 ; WX 456 ; N currency ; B -2 76 458 636 ;
+C 169 ; WX 195 ; N quotesingle ; B 57 447 138 718 ;
+C 170 ; WX 410 ; N quotedblleft ; B 52 454 358 727 ;
+C 171 ; WX 456 ; N guillemotleft ; B 72 76 384 484 ;
+C 172 ; WX 273 ; N guilsinglleft ; B 68 76 205 484 ;
+C 173 ; WX 273 ; N guilsinglright ; B 68 76 205 484 ;
+C 174 ; WX 501 ; N fi ; B 8 0 444 727 ;
+C 175 ; WX 501 ; N fl ; B 8 0 444 727 ;
+C 177 ; WX 456 ; N endash ; B 0 227 456 333 ;
+C 178 ; WX 456 ; N dagger ; B 30 -171 426 718 ;
+C 179 ; WX 456 ; N daggerdbl ; B 30 -171 426 718 ;
+C 180 ; WX 228 ; N periodcentered ; B 48 172 180 334 ;
+C 182 ; WX 456 ; N paragraph ; B -7 -191 442 700 ;
+C 183 ; WX 287 ; N bullet ; B 8 194 279 524 ;
+C 184 ; WX 228 ; N quotesinglbase ; B 57 -146 171 127 ;
+C 185 ; WX 410 ; N quotedblbase ; B 52 -146 358 127 ;
+C 186 ; WX 410 ; N quotedblright ; B 52 445 358 718 ;
+C 187 ; WX 456 ; N guillemotright ; B 72 76 384 484 ;
+C 188 ; WX 820 ; N ellipsis ; B 75 0 745 146 ;
+C 189 ; WX 820 ; N perthousand ; B -2 -19 822 710 ;
+C 191 ; WX 501 ; N questiondown ; B 45 -195 452 532 ;
+C 193 ; WX 273 ; N grave ; B -19 604 185 750 ;
+C 194 ; WX 273 ; N acute ; B 89 604 292 750 ;
+C 195 ; WX 273 ; N circumflex ; B -8 604 281 750 ;
+C 196 ; WX 273 ; N tilde ; B -14 610 287 737 ;
+C 197 ; WX 273 ; N macron ; B -5 604 278 678 ;
+C 198 ; WX 273 ; N breve ; B -2 604 275 750 ;
+C 199 ; WX 273 ; N dotaccent ; B 85 614 189 729 ;
+C 200 ; WX 273 ; N dieresis ; B 5 614 268 729 ;
+C 202 ; WX 273 ; N ring ; B 48 568 226 776 ;
+C 203 ; WX 273 ; N cedilla ; B 5 -228 201 0 ;
+C 205 ; WX 273 ; N hungarumlaut ; B 7 604 399 750 ;
+C 206 ; WX 273 ; N ogonek ; B 58 -228 249 0 ;
+C 207 ; WX 273 ; N caron ; B -8 604 281 750 ;
+C 208 ; WX 820 ; N emdash ; B 0 227 820 333 ;
+C 225 ; WX 820 ; N AE ; B 4 0 782 718 ;
+C 227 ; WX 303 ; N ordfeminine ; B 18 401 285 737 ;
+C 232 ; WX 501 ; N Lslash ; B -16 0 478 718 ;
+C 233 ; WX 638 ; N Oslash ; B 27 -27 610 745 ;
+C 234 ; WX 820 ; N OE ; B 30 -19 788 737 ;
+C 235 ; WX 299 ; N ordmasculine ; B 5 401 295 737 ;
+C 241 ; WX 729 ; N ae ; B 24 -14 704 546 ;
+C 245 ; WX 228 ; N dotlessi ; B 57 0 171 532 ;
+C 248 ; WX 228 ; N lslash ; B -15 0 243 718 ;
+C 249 ; WX 501 ; N oslash ; B 18 -29 483 560 ;
+C 250 ; WX 774 ; N oe ; B 28 -14 748 546 ;
+C 251 ; WX 501 ; N germandbls ; B 57 -14 475 731 ;
+C -1 ; WX 228 ; N Idieresis ; B -17 0 246 915 ;
+C -1 ; WX 456 ; N eacute ; B 19 -14 433 750 ;
+C -1 ; WX 456 ; N abreve ; B 24 -14 432 750 ;
+C -1 ; WX 501 ; N uhungarumlaut ; B 54 -14 513 750 ;
+C -1 ; WX 456 ; N ecaron ; B 19 -14 433 750 ;
+C -1 ; WX 547 ; N Ydieresis ; B 12 0 535 915 ;
+C -1 ; WX 479 ; N divide ; B 33 -42 446 548 ;
+C -1 ; WX 547 ; N Yacute ; B 12 0 535 936 ;
+C -1 ; WX 592 ; N Acircumflex ; B 16 0 576 936 ;
+C -1 ; WX 456 ; N aacute ; B 24 -14 432 750 ;
+C -1 ; WX 592 ; N Ucircumflex ; B 59 -19 534 936 ;
+C -1 ; WX 456 ; N yacute ; B 8 -214 442 750 ;
+C -1 ; WX 456 ; N scommaaccent ; B 25 -228 426 546 ;
+C -1 ; WX 456 ; N ecircumflex ; B 19 -14 433 750 ;
+C -1 ; WX 592 ; N Uring ; B 59 -19 534 962 ;
+C -1 ; WX 592 ; N Udieresis ; B 59 -19 534 915 ;
+C -1 ; WX 456 ; N aogonek ; B 24 -224 447 546 ;
+C -1 ; WX 592 ; N Uacute ; B 59 -19 534 936 ;
+C -1 ; WX 501 ; N uogonek ; B 54 -228 447 532 ;
+C -1 ; WX 547 ; N Edieresis ; B 62 0 509 915 ;
+C -1 ; WX 592 ; N Dcroat ; B -4 0 562 718 ;
+C -1 ; WX 205 ; N commaaccent ; B 52 -228 163 -50 ;
+C -1 ; WX 604 ; N copyright ; B -9 -19 614 737 ;
+C -1 ; WX 547 ; N Emacron ; B 62 0 509 864 ;
+C -1 ; WX 456 ; N ccaron ; B 28 -14 430 750 ;
+C -1 ; WX 456 ; N aring ; B 24 -14 432 776 ;
+C -1 ; WX 592 ; N Ncommaaccent ; B 57 -228 536 718 ;
+C -1 ; WX 228 ; N lacute ; B 57 0 270 936 ;
+C -1 ; WX 456 ; N agrave ; B 24 -14 432 750 ;
+C -1 ; WX 501 ; N Tcommaaccent ; B 11 -228 490 718 ;
+C -1 ; WX 592 ; N Cacute ; B 36 -19 561 936 ;
+C -1 ; WX 456 ; N atilde ; B 24 -14 432 737 ;
+C -1 ; WX 547 ; N Edotaccent ; B 62 0 509 915 ;
+C -1 ; WX 456 ; N scaron ; B 25 -14 426 750 ;
+C -1 ; WX 456 ; N scedilla ; B 25 -228 426 546 ;
+C -1 ; WX 228 ; N iacute ; B 57 0 270 750 ;
+C -1 ; WX 405 ; N lozenge ; B 8 0 397 745 ;
+C -1 ; WX 592 ; N Rcaron ; B 62 0 555 936 ;
+C -1 ; WX 638 ; N Gcommaaccent ; B 36 -228 585 737 ;
+C -1 ; WX 501 ; N ucircumflex ; B 54 -14 447 750 ;
+C -1 ; WX 456 ; N acircumflex ; B 24 -14 432 750 ;
+C -1 ; WX 592 ; N Amacron ; B 16 0 576 864 ;
+C -1 ; WX 319 ; N rcaron ; B 15 0 306 750 ;
+C -1 ; WX 456 ; N ccedilla ; B 28 -228 430 546 ;
+C -1 ; WX 501 ; N Zdotaccent ; B 21 0 481 915 ;
+C -1 ; WX 547 ; N Thorn ; B 62 0 514 718 ;
+C -1 ; WX 638 ; N Omacron ; B 36 -19 602 864 ;
+C -1 ; WX 592 ; N Racute ; B 62 0 555 936 ;
+C -1 ; WX 547 ; N Sacute ; B 32 -19 516 936 ;
+C -1 ; WX 609 ; N dcaron ; B 28 -14 615 718 ;
+C -1 ; WX 592 ; N Umacron ; B 59 -19 534 864 ;
+C -1 ; WX 501 ; N uring ; B 54 -14 447 776 ;
+C -1 ; WX 273 ; N threesuperior ; B 7 271 267 710 ;
+C -1 ; WX 638 ; N Ograve ; B 36 -19 602 936 ;
+C -1 ; WX 592 ; N Agrave ; B 16 0 576 936 ;
+C -1 ; WX 592 ; N Abreve ; B 16 0 576 936 ;
+C -1 ; WX 479 ; N multiply ; B 33 1 447 505 ;
+C -1 ; WX 501 ; N uacute ; B 54 -14 447 750 ;
+C -1 ; WX 501 ; N Tcaron ; B 11 0 490 936 ;
+C -1 ; WX 405 ; N partialdiff ; B 9 -21 405 750 ;
+C -1 ; WX 456 ; N ydieresis ; B 8 -214 442 729 ;
+C -1 ; WX 592 ; N Nacute ; B 57 0 536 936 ;
+C -1 ; WX 228 ; N icircumflex ; B -30 0 259 750 ;
+C -1 ; WX 547 ; N Ecircumflex ; B 62 0 509 936 ;
+C -1 ; WX 456 ; N adieresis ; B 24 -14 432 729 ;
+C -1 ; WX 456 ; N edieresis ; B 19 -14 433 729 ;
+C -1 ; WX 456 ; N cacute ; B 28 -14 430 750 ;
+C -1 ; WX 501 ; N nacute ; B 53 0 448 750 ;
+C -1 ; WX 501 ; N umacron ; B 54 -14 447 678 ;
+C -1 ; WX 592 ; N Ncaron ; B 57 0 536 936 ;
+C -1 ; WX 228 ; N Iacute ; B 52 0 270 936 ;
+C -1 ; WX 479 ; N plusminus ; B 33 0 446 506 ;
+C -1 ; WX 230 ; N brokenbar ; B 69 -150 161 700 ;
+C -1 ; WX 604 ; N registered ; B -9 -19 613 737 ;
+C -1 ; WX 638 ; N Gbreve ; B 36 -19 585 936 ;
+C -1 ; WX 228 ; N Idotaccent ; B 52 0 175 915 ;
+C -1 ; WX 492 ; N summation ; B 11 -10 480 706 ;
+C -1 ; WX 547 ; N Egrave ; B 62 0 509 936 ;
+C -1 ; WX 319 ; N racute ; B 52 0 315 750 ;
+C -1 ; WX 501 ; N omacron ; B 28 -14 474 678 ;
+C -1 ; WX 501 ; N Zacute ; B 21 0 481 936 ;
+C -1 ; WX 501 ; N Zcaron ; B 21 0 481 936 ;
+C -1 ; WX 450 ; N greaterequal ; B 21 0 429 704 ;
+C -1 ; WX 592 ; N Eth ; B -4 0 562 718 ;
+C -1 ; WX 592 ; N Ccedilla ; B 36 -228 561 737 ;
+C -1 ; WX 228 ; N lcommaaccent ; B 57 -228 175 718 ;
+C -1 ; WX 319 ; N tcaron ; B 8 -6 345 878 ;
+C -1 ; WX 456 ; N eogonek ; B 19 -228 433 546 ;
+C -1 ; WX 592 ; N Uogonek ; B 59 -228 534 718 ;
+C -1 ; WX 592 ; N Aacute ; B 16 0 576 936 ;
+C -1 ; WX 592 ; N Adieresis ; B 16 0 576 915 ;
+C -1 ; WX 456 ; N egrave ; B 19 -14 433 750 ;
+C -1 ; WX 410 ; N zacute ; B 16 0 394 750 ;
+C -1 ; WX 228 ; N iogonek ; B 13 -224 204 725 ;
+C -1 ; WX 638 ; N Oacute ; B 36 -19 602 936 ;
+C -1 ; WX 501 ; N oacute ; B 28 -14 474 750 ;
+C -1 ; WX 456 ; N amacron ; B 24 -14 432 678 ;
+C -1 ; WX 456 ; N sacute ; B 25 -14 426 750 ;
+C -1 ; WX 228 ; N idieresis ; B -17 0 246 729 ;
+C -1 ; WX 638 ; N Ocircumflex ; B 36 -19 602 936 ;
+C -1 ; WX 592 ; N Ugrave ; B 59 -19 534 936 ;
+C -1 ; WX 502 ; N Delta ; B 5 0 499 688 ;
+C -1 ; WX 501 ; N thorn ; B 51 -208 474 718 ;
+C -1 ; WX 273 ; N twosuperior ; B 7 283 266 710 ;
+C -1 ; WX 638 ; N Odieresis ; B 36 -19 602 915 ;
+C -1 ; WX 501 ; N mu ; B 54 -207 447 532 ;
+C -1 ; WX 228 ; N igrave ; B -41 0 171 750 ;
+C -1 ; WX 501 ; N ohungarumlaut ; B 28 -14 513 750 ;
+C -1 ; WX 547 ; N Eogonek ; B 62 -224 524 718 ;
+C -1 ; WX 501 ; N dcroat ; B 28 -14 533 718 ;
+C -1 ; WX 684 ; N threequarters ; B 13 -19 655 710 ;
+C -1 ; WX 547 ; N Scedilla ; B 32 -228 516 737 ;
+C -1 ; WX 328 ; N lcaron ; B 57 0 335 718 ;
+C -1 ; WX 592 ; N Kcommaaccent ; B 71 -228 592 718 ;
+C -1 ; WX 501 ; N Lacute ; B 62 0 478 936 ;
+C -1 ; WX 820 ; N trademark ; B 36 306 784 718 ;
+C -1 ; WX 456 ; N edotaccent ; B 19 -14 433 729 ;
+C -1 ; WX 228 ; N Igrave ; B -41 0 175 936 ;
+C -1 ; WX 228 ; N Imacron ; B -27 0 256 864 ;
+C -1 ; WX 501 ; N Lcaron ; B 62 0 478 718 ;
+C -1 ; WX 684 ; N onehalf ; B 21 -19 651 710 ;
+C -1 ; WX 450 ; N lessequal ; B 24 0 431 704 ;
+C -1 ; WX 501 ; N ocircumflex ; B 28 -14 474 750 ;
+C -1 ; WX 501 ; N ntilde ; B 53 0 448 737 ;
+C -1 ; WX 592 ; N Uhungarumlaut ; B 59 -19 558 936 ;
+C -1 ; WX 547 ; N Eacute ; B 62 0 509 936 ;
+C -1 ; WX 456 ; N emacron ; B 19 -14 433 678 ;
+C -1 ; WX 501 ; N gbreve ; B 33 -217 453 750 ;
+C -1 ; WX 684 ; N onequarter ; B 21 -19 628 710 ;
+C -1 ; WX 547 ; N Scaron ; B 32 -19 516 936 ;
+C -1 ; WX 547 ; N Scommaaccent ; B 32 -228 516 737 ;
+C -1 ; WX 638 ; N Ohungarumlaut ; B 36 -19 602 936 ;
+C -1 ; WX 328 ; N degree ; B 47 426 281 712 ;
+C -1 ; WX 501 ; N ograve ; B 28 -14 474 750 ;
+C -1 ; WX 592 ; N Ccaron ; B 36 -19 561 936 ;
+C -1 ; WX 501 ; N ugrave ; B 54 -14 447 750 ;
+C -1 ; WX 450 ; N radical ; B 8 -46 420 850 ;
+C -1 ; WX 592 ; N Dcaron ; B 62 0 562 936 ;
+C -1 ; WX 319 ; N rcommaaccent ; B 52 -228 306 546 ;
+C -1 ; WX 592 ; N Ntilde ; B 57 0 536 923 ;
+C -1 ; WX 501 ; N otilde ; B 28 -14 474 737 ;
+C -1 ; WX 592 ; N Rcommaaccent ; B 62 -228 555 718 ;
+C -1 ; WX 501 ; N Lcommaaccent ; B 62 -228 478 718 ;
+C -1 ; WX 592 ; N Atilde ; B 16 0 576 923 ;
+C -1 ; WX 592 ; N Aogonek ; B 16 -224 608 718 ;
+C -1 ; WX 592 ; N Aring ; B 16 0 576 962 ;
+C -1 ; WX 638 ; N Otilde ; B 36 -19 602 923 ;
+C -1 ; WX 410 ; N zdotaccent ; B 16 0 394 729 ;
+C -1 ; WX 547 ; N Ecaron ; B 62 0 509 936 ;
+C -1 ; WX 228 ; N Iogonek ; B -9 -228 182 718 ;
+C -1 ; WX 456 ; N kcommaaccent ; B 57 -228 461 718 ;
+C -1 ; WX 479 ; N minus ; B 33 197 446 309 ;
+C -1 ; WX 228 ; N Icircumflex ; B -30 0 259 936 ;
+C -1 ; WX 501 ; N ncaron ; B 53 0 448 750 ;
+C -1 ; WX 273 ; N tcommaaccent ; B 8 -228 253 676 ;
+C -1 ; WX 479 ; N logicalnot ; B 33 108 446 419 ;
+C -1 ; WX 501 ; N odieresis ; B 28 -14 474 729 ;
+C -1 ; WX 501 ; N udieresis ; B 54 -14 447 729 ;
+C -1 ; WX 450 ; N notequal ; B 12 -49 443 570 ;
+C -1 ; WX 501 ; N gcommaaccent ; B 33 -217 453 850 ;
+C -1 ; WX 501 ; N eth ; B 28 -14 474 737 ;
+C -1 ; WX 410 ; N zcaron ; B 16 0 394 750 ;
+C -1 ; WX 501 ; N ncommaaccent ; B 53 -228 448 546 ;
+C -1 ; WX 273 ; N onesuperior ; B 21 283 194 710 ;
+C -1 ; WX 228 ; N imacron ; B -7 0 234 678 ;
+EndCharMetrics
+StartKernData
+StartKernPairs 2481
+KPX A C -40
+KPX A Cacute -40
+KPX A Ccaron -40
+KPX A Ccedilla -40
+KPX A G -50
+KPX A Gbreve -50
+KPX A Gcommaaccent -50
+KPX A O -40
+KPX A Oacute -40
+KPX A Ocircumflex -40
+KPX A Odieresis -40
+KPX A Ograve -40
+KPX A Ohungarumlaut -40
+KPX A Omacron -40
+KPX A Oslash -40
+KPX A Otilde -40
+KPX A Q -40
+KPX A T -90
+KPX A Tcaron -90
+KPX A Tcommaaccent -90
+KPX A U -50
+KPX A Uacute -50
+KPX A Ucircumflex -50
+KPX A Udieresis -50
+KPX A Ugrave -50
+KPX A Uhungarumlaut -50
+KPX A Umacron -50
+KPX A Uogonek -50
+KPX A Uring -50
+KPX A V -80
+KPX A W -60
+KPX A Y -110
+KPX A Yacute -110
+KPX A Ydieresis -110
+KPX A u -30
+KPX A uacute -30
+KPX A ucircumflex -30
+KPX A udieresis -30
+KPX A ugrave -30
+KPX A uhungarumlaut -30
+KPX A umacron -30
+KPX A uogonek -30
+KPX A uring -30
+KPX A v -40
+KPX A w -30
+KPX A y -30
+KPX A yacute -30
+KPX A ydieresis -30
+KPX Aacute C -40
+KPX Aacute Cacute -40
+KPX Aacute Ccaron -40
+KPX Aacute Ccedilla -40
+KPX Aacute G -50
+KPX Aacute Gbreve -50
+KPX Aacute Gcommaaccent -50
+KPX Aacute O -40
+KPX Aacute Oacute -40
+KPX Aacute Ocircumflex -40
+KPX Aacute Odieresis -40
+KPX Aacute Ograve -40
+KPX Aacute Ohungarumlaut -40
+KPX Aacute Omacron -40
+KPX Aacute Oslash -40
+KPX Aacute Otilde -40
+KPX Aacute Q -40
+KPX Aacute T -90
+KPX Aacute Tcaron -90
+KPX Aacute Tcommaaccent -90
+KPX Aacute U -50
+KPX Aacute Uacute -50
+KPX Aacute Ucircumflex -50
+KPX Aacute Udieresis -50
+KPX Aacute Ugrave -50
+KPX Aacute Uhungarumlaut -50
+KPX Aacute Umacron -50
+KPX Aacute Uogonek -50
+KPX Aacute Uring -50
+KPX Aacute V -80
+KPX Aacute W -60
+KPX Aacute Y -110
+KPX Aacute Yacute -110
+KPX Aacute Ydieresis -110
+KPX Aacute u -30
+KPX Aacute uacute -30
+KPX Aacute ucircumflex -30
+KPX Aacute udieresis -30
+KPX Aacute ugrave -30
+KPX Aacute uhungarumlaut -30
+KPX Aacute umacron -30
+KPX Aacute uogonek -30
+KPX Aacute uring -30
+KPX Aacute v -40
+KPX Aacute w -30
+KPX Aacute y -30
+KPX Aacute yacute -30
+KPX Aacute ydieresis -30
+KPX Abreve C -40
+KPX Abreve Cacute -40
+KPX Abreve Ccaron -40
+KPX Abreve Ccedilla -40
+KPX Abreve G -50
+KPX Abreve Gbreve -50
+KPX Abreve Gcommaaccent -50
+KPX Abreve O -40
+KPX Abreve Oacute -40
+KPX Abreve Ocircumflex -40
+KPX Abreve Odieresis -40
+KPX Abreve Ograve -40
+KPX Abreve Ohungarumlaut -40
+KPX Abreve Omacron -40
+KPX Abreve Oslash -40
+KPX Abreve Otilde -40
+KPX Abreve Q -40
+KPX Abreve T -90
+KPX Abreve Tcaron -90
+KPX Abreve Tcommaaccent -90
+KPX Abreve U -50
+KPX Abreve Uacute -50
+KPX Abreve Ucircumflex -50
+KPX Abreve Udieresis -50
+KPX Abreve Ugrave -50
+KPX Abreve Uhungarumlaut -50
+KPX Abreve Umacron -50
+KPX Abreve Uogonek -50
+KPX Abreve Uring -50
+KPX Abreve V -80
+KPX Abreve W -60
+KPX Abreve Y -110
+KPX Abreve Yacute -110
+KPX Abreve Ydieresis -110
+KPX Abreve u -30
+KPX Abreve uacute -30
+KPX Abreve ucircumflex -30
+KPX Abreve udieresis -30
+KPX Abreve ugrave -30
+KPX Abreve uhungarumlaut -30
+KPX Abreve umacron -30
+KPX Abreve uogonek -30
+KPX Abreve uring -30
+KPX Abreve v -40
+KPX Abreve w -30
+KPX Abreve y -30
+KPX Abreve yacute -30
+KPX Abreve ydieresis -30
+KPX Acircumflex C -40
+KPX Acircumflex Cacute -40
+KPX Acircumflex Ccaron -40
+KPX Acircumflex Ccedilla -40
+KPX Acircumflex G -50
+KPX Acircumflex Gbreve -50
+KPX Acircumflex Gcommaaccent -50
+KPX Acircumflex O -40
+KPX Acircumflex Oacute -40
+KPX Acircumflex Ocircumflex -40
+KPX Acircumflex Odieresis -40
+KPX Acircumflex Ograve -40
+KPX Acircumflex Ohungarumlaut -40
+KPX Acircumflex Omacron -40
+KPX Acircumflex Oslash -40
+KPX Acircumflex Otilde -40
+KPX Acircumflex Q -40
+KPX Acircumflex T -90
+KPX Acircumflex Tcaron -90
+KPX Acircumflex Tcommaaccent -90
+KPX Acircumflex U -50
+KPX Acircumflex Uacute -50
+KPX Acircumflex Ucircumflex -50
+KPX Acircumflex Udieresis -50
+KPX Acircumflex Ugrave -50
+KPX Acircumflex Uhungarumlaut -50
+KPX Acircumflex Umacron -50
+KPX Acircumflex Uogonek -50
+KPX Acircumflex Uring -50
+KPX Acircumflex V -80
+KPX Acircumflex W -60
+KPX Acircumflex Y -110
+KPX Acircumflex Yacute -110
+KPX Acircumflex Ydieresis -110
+KPX Acircumflex u -30
+KPX Acircumflex uacute -30
+KPX Acircumflex ucircumflex -30
+KPX Acircumflex udieresis -30
+KPX Acircumflex ugrave -30
+KPX Acircumflex uhungarumlaut -30
+KPX Acircumflex umacron -30
+KPX Acircumflex uogonek -30
+KPX Acircumflex uring -30
+KPX Acircumflex v -40
+KPX Acircumflex w -30
+KPX Acircumflex y -30
+KPX Acircumflex yacute -30
+KPX Acircumflex ydieresis -30
+KPX Adieresis C -40
+KPX Adieresis Cacute -40
+KPX Adieresis Ccaron -40
+KPX Adieresis Ccedilla -40
+KPX Adieresis G -50
+KPX Adieresis Gbreve -50
+KPX Adieresis Gcommaaccent -50
+KPX Adieresis O -40
+KPX Adieresis Oacute -40
+KPX Adieresis Ocircumflex -40
+KPX Adieresis Odieresis -40
+KPX Adieresis Ograve -40
+KPX Adieresis Ohungarumlaut -40
+KPX Adieresis Omacron -40
+KPX Adieresis Oslash -40
+KPX Adieresis Otilde -40
+KPX Adieresis Q -40
+KPX Adieresis T -90
+KPX Adieresis Tcaron -90
+KPX Adieresis Tcommaaccent -90
+KPX Adieresis U -50
+KPX Adieresis Uacute -50
+KPX Adieresis Ucircumflex -50
+KPX Adieresis Udieresis -50
+KPX Adieresis Ugrave -50
+KPX Adieresis Uhungarumlaut -50
+KPX Adieresis Umacron -50
+KPX Adieresis Uogonek -50
+KPX Adieresis Uring -50
+KPX Adieresis V -80
+KPX Adieresis W -60
+KPX Adieresis Y -110
+KPX Adieresis Yacute -110
+KPX Adieresis Ydieresis -110
+KPX Adieresis u -30
+KPX Adieresis uacute -30
+KPX Adieresis ucircumflex -30
+KPX Adieresis udieresis -30
+KPX Adieresis ugrave -30
+KPX Adieresis uhungarumlaut -30
+KPX Adieresis umacron -30
+KPX Adieresis uogonek -30
+KPX Adieresis uring -30
+KPX Adieresis v -40
+KPX Adieresis w -30
+KPX Adieresis y -30
+KPX Adieresis yacute -30
+KPX Adieresis ydieresis -30
+KPX Agrave C -40
+KPX Agrave Cacute -40
+KPX Agrave Ccaron -40
+KPX Agrave Ccedilla -40
+KPX Agrave G -50
+KPX Agrave Gbreve -50
+KPX Agrave Gcommaaccent -50
+KPX Agrave O -40
+KPX Agrave Oacute -40
+KPX Agrave Ocircumflex -40
+KPX Agrave Odieresis -40
+KPX Agrave Ograve -40
+KPX Agrave Ohungarumlaut -40
+KPX Agrave Omacron -40
+KPX Agrave Oslash -40
+KPX Agrave Otilde -40
+KPX Agrave Q -40
+KPX Agrave T -90
+KPX Agrave Tcaron -90
+KPX Agrave Tcommaaccent -90
+KPX Agrave U -50
+KPX Agrave Uacute -50
+KPX Agrave Ucircumflex -50
+KPX Agrave Udieresis -50
+KPX Agrave Ugrave -50
+KPX Agrave Uhungarumlaut -50
+KPX Agrave Umacron -50
+KPX Agrave Uogonek -50
+KPX Agrave Uring -50
+KPX Agrave V -80
+KPX Agrave W -60
+KPX Agrave Y -110
+KPX Agrave Yacute -110
+KPX Agrave Ydieresis -110
+KPX Agrave u -30
+KPX Agrave uacute -30
+KPX Agrave ucircumflex -30
+KPX Agrave udieresis -30
+KPX Agrave ugrave -30
+KPX Agrave uhungarumlaut -30
+KPX Agrave umacron -30
+KPX Agrave uogonek -30
+KPX Agrave uring -30
+KPX Agrave v -40
+KPX Agrave w -30
+KPX Agrave y -30
+KPX Agrave yacute -30
+KPX Agrave ydieresis -30
+KPX Amacron C -40
+KPX Amacron Cacute -40
+KPX Amacron Ccaron -40
+KPX Amacron Ccedilla -40
+KPX Amacron G -50
+KPX Amacron Gbreve -50
+KPX Amacron Gcommaaccent -50
+KPX Amacron O -40
+KPX Amacron Oacute -40
+KPX Amacron Ocircumflex -40
+KPX Amacron Odieresis -40
+KPX Amacron Ograve -40
+KPX Amacron Ohungarumlaut -40
+KPX Amacron Omacron -40
+KPX Amacron Oslash -40
+KPX Amacron Otilde -40
+KPX Amacron Q -40
+KPX Amacron T -90
+KPX Amacron Tcaron -90
+KPX Amacron Tcommaaccent -90
+KPX Amacron U -50
+KPX Amacron Uacute -50
+KPX Amacron Ucircumflex -50
+KPX Amacron Udieresis -50
+KPX Amacron Ugrave -50
+KPX Amacron Uhungarumlaut -50
+KPX Amacron Umacron -50
+KPX Amacron Uogonek -50
+KPX Amacron Uring -50
+KPX Amacron V -80
+KPX Amacron W -60
+KPX Amacron Y -110
+KPX Amacron Yacute -110
+KPX Amacron Ydieresis -110
+KPX Amacron u -30
+KPX Amacron uacute -30
+KPX Amacron ucircumflex -30
+KPX Amacron udieresis -30
+KPX Amacron ugrave -30
+KPX Amacron uhungarumlaut -30
+KPX Amacron umacron -30
+KPX Amacron uogonek -30
+KPX Amacron uring -30
+KPX Amacron v -40
+KPX Amacron w -30
+KPX Amacron y -30
+KPX Amacron yacute -30
+KPX Amacron ydieresis -30
+KPX Aogonek C -40
+KPX Aogonek Cacute -40
+KPX Aogonek Ccaron -40
+KPX Aogonek Ccedilla -40
+KPX Aogonek G -50
+KPX Aogonek Gbreve -50
+KPX Aogonek Gcommaaccent -50
+KPX Aogonek O -40
+KPX Aogonek Oacute -40
+KPX Aogonek Ocircumflex -40
+KPX Aogonek Odieresis -40
+KPX Aogonek Ograve -40
+KPX Aogonek Ohungarumlaut -40
+KPX Aogonek Omacron -40
+KPX Aogonek Oslash -40
+KPX Aogonek Otilde -40
+KPX Aogonek Q -40
+KPX Aogonek T -90
+KPX Aogonek Tcaron -90
+KPX Aogonek Tcommaaccent -90
+KPX Aogonek U -50
+KPX Aogonek Uacute -50
+KPX Aogonek Ucircumflex -50
+KPX Aogonek Udieresis -50
+KPX Aogonek Ugrave -50
+KPX Aogonek Uhungarumlaut -50
+KPX Aogonek Umacron -50
+KPX Aogonek Uogonek -50
+KPX Aogonek Uring -50
+KPX Aogonek V -80
+KPX Aogonek W -60
+KPX Aogonek Y -110
+KPX Aogonek Yacute -110
+KPX Aogonek Ydieresis -110
+KPX Aogonek u -30
+KPX Aogonek uacute -30
+KPX Aogonek ucircumflex -30
+KPX Aogonek udieresis -30
+KPX Aogonek ugrave -30
+KPX Aogonek uhungarumlaut -30
+KPX Aogonek umacron -30
+KPX Aogonek uogonek -30
+KPX Aogonek uring -30
+KPX Aogonek v -40
+KPX Aogonek w -30
+KPX Aogonek y -30
+KPX Aogonek yacute -30
+KPX Aogonek ydieresis -30
+KPX Aring C -40
+KPX Aring Cacute -40
+KPX Aring Ccaron -40
+KPX Aring Ccedilla -40
+KPX Aring G -50
+KPX Aring Gbreve -50
+KPX Aring Gcommaaccent -50
+KPX Aring O -40
+KPX Aring Oacute -40
+KPX Aring Ocircumflex -40
+KPX Aring Odieresis -40
+KPX Aring Ograve -40
+KPX Aring Ohungarumlaut -40
+KPX Aring Omacron -40
+KPX Aring Oslash -40
+KPX Aring Otilde -40
+KPX Aring Q -40
+KPX Aring T -90
+KPX Aring Tcaron -90
+KPX Aring Tcommaaccent -90
+KPX Aring U -50
+KPX Aring Uacute -50
+KPX Aring Ucircumflex -50
+KPX Aring Udieresis -50
+KPX Aring Ugrave -50
+KPX Aring Uhungarumlaut -50
+KPX Aring Umacron -50
+KPX Aring Uogonek -50
+KPX Aring Uring -50
+KPX Aring V -80
+KPX Aring W -60
+KPX Aring Y -110
+KPX Aring Yacute -110
+KPX Aring Ydieresis -110
+KPX Aring u -30
+KPX Aring uacute -30
+KPX Aring ucircumflex -30
+KPX Aring udieresis -30
+KPX Aring ugrave -30
+KPX Aring uhungarumlaut -30
+KPX Aring umacron -30
+KPX Aring uogonek -30
+KPX Aring uring -30
+KPX Aring v -40
+KPX Aring w -30
+KPX Aring y -30
+KPX Aring yacute -30
+KPX Aring ydieresis -30
+KPX Atilde C -40
+KPX Atilde Cacute -40
+KPX Atilde Ccaron -40
+KPX Atilde Ccedilla -40
+KPX Atilde G -50
+KPX Atilde Gbreve -50
+KPX Atilde Gcommaaccent -50
+KPX Atilde O -40
+KPX Atilde Oacute -40
+KPX Atilde Ocircumflex -40
+KPX Atilde Odieresis -40
+KPX Atilde Ograve -40
+KPX Atilde Ohungarumlaut -40
+KPX Atilde Omacron -40
+KPX Atilde Oslash -40
+KPX Atilde Otilde -40
+KPX Atilde Q -40
+KPX Atilde T -90
+KPX Atilde Tcaron -90
+KPX Atilde Tcommaaccent -90
+KPX Atilde U -50
+KPX Atilde Uacute -50
+KPX Atilde Ucircumflex -50
+KPX Atilde Udieresis -50
+KPX Atilde Ugrave -50
+KPX Atilde Uhungarumlaut -50
+KPX Atilde Umacron -50
+KPX Atilde Uogonek -50
+KPX Atilde Uring -50
+KPX Atilde V -80
+KPX Atilde W -60
+KPX Atilde Y -110
+KPX Atilde Yacute -110
+KPX Atilde Ydieresis -110
+KPX Atilde u -30
+KPX Atilde uacute -30
+KPX Atilde ucircumflex -30
+KPX Atilde udieresis -30
+KPX Atilde ugrave -30
+KPX Atilde uhungarumlaut -30
+KPX Atilde umacron -30
+KPX Atilde uogonek -30
+KPX Atilde uring -30
+KPX Atilde v -40
+KPX Atilde w -30
+KPX Atilde y -30
+KPX Atilde yacute -30
+KPX Atilde ydieresis -30
+KPX B A -30
+KPX B Aacute -30
+KPX B Abreve -30
+KPX B Acircumflex -30
+KPX B Adieresis -30
+KPX B Agrave -30
+KPX B Amacron -30
+KPX B Aogonek -30
+KPX B Aring -30
+KPX B Atilde -30
+KPX B U -10
+KPX B Uacute -10
+KPX B Ucircumflex -10
+KPX B Udieresis -10
+KPX B Ugrave -10
+KPX B Uhungarumlaut -10
+KPX B Umacron -10
+KPX B Uogonek -10
+KPX B Uring -10
+KPX D A -40
+KPX D Aacute -40
+KPX D Abreve -40
+KPX D Acircumflex -40
+KPX D Adieresis -40
+KPX D Agrave -40
+KPX D Amacron -40
+KPX D Aogonek -40
+KPX D Aring -40
+KPX D Atilde -40
+KPX D V -40
+KPX D W -40
+KPX D Y -70
+KPX D Yacute -70
+KPX D Ydieresis -70
+KPX D comma -30
+KPX D period -30
+KPX Dcaron A -40
+KPX Dcaron Aacute -40
+KPX Dcaron Abreve -40
+KPX Dcaron Acircumflex -40
+KPX Dcaron Adieresis -40
+KPX Dcaron Agrave -40
+KPX Dcaron Amacron -40
+KPX Dcaron Aogonek -40
+KPX Dcaron Aring -40
+KPX Dcaron Atilde -40
+KPX Dcaron V -40
+KPX Dcaron W -40
+KPX Dcaron Y -70
+KPX Dcaron Yacute -70
+KPX Dcaron Ydieresis -70
+KPX Dcaron comma -30
+KPX Dcaron period -30
+KPX Dcroat A -40
+KPX Dcroat Aacute -40
+KPX Dcroat Abreve -40
+KPX Dcroat Acircumflex -40
+KPX Dcroat Adieresis -40
+KPX Dcroat Agrave -40
+KPX Dcroat Amacron -40
+KPX Dcroat Aogonek -40
+KPX Dcroat Aring -40
+KPX Dcroat Atilde -40
+KPX Dcroat V -40
+KPX Dcroat W -40
+KPX Dcroat Y -70
+KPX Dcroat Yacute -70
+KPX Dcroat Ydieresis -70
+KPX Dcroat comma -30
+KPX Dcroat period -30
+KPX F A -80
+KPX F Aacute -80
+KPX F Abreve -80
+KPX F Acircumflex -80
+KPX F Adieresis -80
+KPX F Agrave -80
+KPX F Amacron -80
+KPX F Aogonek -80
+KPX F Aring -80
+KPX F Atilde -80
+KPX F a -20
+KPX F aacute -20
+KPX F abreve -20
+KPX F acircumflex -20
+KPX F adieresis -20
+KPX F agrave -20
+KPX F amacron -20
+KPX F aogonek -20
+KPX F aring -20
+KPX F atilde -20
+KPX F comma -100
+KPX F period -100
+KPX J A -20
+KPX J Aacute -20
+KPX J Abreve -20
+KPX J Acircumflex -20
+KPX J Adieresis -20
+KPX J Agrave -20
+KPX J Amacron -20
+KPX J Aogonek -20
+KPX J Aring -20
+KPX J Atilde -20
+KPX J comma -20
+KPX J period -20
+KPX J u -20
+KPX J uacute -20
+KPX J ucircumflex -20
+KPX J udieresis -20
+KPX J ugrave -20
+KPX J uhungarumlaut -20
+KPX J umacron -20
+KPX J uogonek -20
+KPX J uring -20
+KPX K O -30
+KPX K Oacute -30
+KPX K Ocircumflex -30
+KPX K Odieresis -30
+KPX K Ograve -30
+KPX K Ohungarumlaut -30
+KPX K Omacron -30
+KPX K Oslash -30
+KPX K Otilde -30
+KPX K e -15
+KPX K eacute -15
+KPX K ecaron -15
+KPX K ecircumflex -15
+KPX K edieresis -15
+KPX K edotaccent -15
+KPX K egrave -15
+KPX K emacron -15
+KPX K eogonek -15
+KPX K o -35
+KPX K oacute -35
+KPX K ocircumflex -35
+KPX K odieresis -35
+KPX K ograve -35
+KPX K ohungarumlaut -35
+KPX K omacron -35
+KPX K oslash -35
+KPX K otilde -35
+KPX K u -30
+KPX K uacute -30
+KPX K ucircumflex -30
+KPX K udieresis -30
+KPX K ugrave -30
+KPX K uhungarumlaut -30
+KPX K umacron -30
+KPX K uogonek -30
+KPX K uring -30
+KPX K y -40
+KPX K yacute -40
+KPX K ydieresis -40
+KPX Kcommaaccent O -30
+KPX Kcommaaccent Oacute -30
+KPX Kcommaaccent Ocircumflex -30
+KPX Kcommaaccent Odieresis -30
+KPX Kcommaaccent Ograve -30
+KPX Kcommaaccent Ohungarumlaut -30
+KPX Kcommaaccent Omacron -30
+KPX Kcommaaccent Oslash -30
+KPX Kcommaaccent Otilde -30
+KPX Kcommaaccent e -15
+KPX Kcommaaccent eacute -15
+KPX Kcommaaccent ecaron -15
+KPX Kcommaaccent ecircumflex -15
+KPX Kcommaaccent edieresis -15
+KPX Kcommaaccent edotaccent -15
+KPX Kcommaaccent egrave -15
+KPX Kcommaaccent emacron -15
+KPX Kcommaaccent eogonek -15
+KPX Kcommaaccent o -35
+KPX Kcommaaccent oacute -35
+KPX Kcommaaccent ocircumflex -35
+KPX Kcommaaccent odieresis -35
+KPX Kcommaaccent ograve -35
+KPX Kcommaaccent ohungarumlaut -35
+KPX Kcommaaccent omacron -35
+KPX Kcommaaccent oslash -35
+KPX Kcommaaccent otilde -35
+KPX Kcommaaccent u -30
+KPX Kcommaaccent uacute -30
+KPX Kcommaaccent ucircumflex -30
+KPX Kcommaaccent udieresis -30
+KPX Kcommaaccent ugrave -30
+KPX Kcommaaccent uhungarumlaut -30
+KPX Kcommaaccent umacron -30
+KPX Kcommaaccent uogonek -30
+KPX Kcommaaccent uring -30
+KPX Kcommaaccent y -40
+KPX Kcommaaccent yacute -40
+KPX Kcommaaccent ydieresis -40
+KPX L T -90
+KPX L Tcaron -90
+KPX L Tcommaaccent -90
+KPX L V -110
+KPX L W -80
+KPX L Y -120
+KPX L Yacute -120
+KPX L Ydieresis -120
+KPX L quotedblright -140
+KPX L quoteright -140
+KPX L y -30
+KPX L yacute -30
+KPX L ydieresis -30
+KPX Lacute T -90
+KPX Lacute Tcaron -90
+KPX Lacute Tcommaaccent -90
+KPX Lacute V -110
+KPX Lacute W -80
+KPX Lacute Y -120
+KPX Lacute Yacute -120
+KPX Lacute Ydieresis -120
+KPX Lacute quotedblright -140
+KPX Lacute quoteright -140
+KPX Lacute y -30
+KPX Lacute yacute -30
+KPX Lacute ydieresis -30
+KPX Lcommaaccent T -90
+KPX Lcommaaccent Tcaron -90
+KPX Lcommaaccent Tcommaaccent -90
+KPX Lcommaaccent V -110
+KPX Lcommaaccent W -80
+KPX Lcommaaccent Y -120
+KPX Lcommaaccent Yacute -120
+KPX Lcommaaccent Ydieresis -120
+KPX Lcommaaccent quotedblright -140
+KPX Lcommaaccent quoteright -140
+KPX Lcommaaccent y -30
+KPX Lcommaaccent yacute -30
+KPX Lcommaaccent ydieresis -30
+KPX Lslash T -90
+KPX Lslash Tcaron -90
+KPX Lslash Tcommaaccent -90
+KPX Lslash V -110
+KPX Lslash W -80
+KPX Lslash Y -120
+KPX Lslash Yacute -120
+KPX Lslash Ydieresis -120
+KPX Lslash quotedblright -140
+KPX Lslash quoteright -140
+KPX Lslash y -30
+KPX Lslash yacute -30
+KPX Lslash ydieresis -30
+KPX O A -50
+KPX O Aacute -50
+KPX O Abreve -50
+KPX O Acircumflex -50
+KPX O Adieresis -50
+KPX O Agrave -50
+KPX O Amacron -50
+KPX O Aogonek -50
+KPX O Aring -50
+KPX O Atilde -50
+KPX O T -40
+KPX O Tcaron -40
+KPX O Tcommaaccent -40
+KPX O V -50
+KPX O W -50
+KPX O X -50
+KPX O Y -70
+KPX O Yacute -70
+KPX O Ydieresis -70
+KPX O comma -40
+KPX O period -40
+KPX Oacute A -50
+KPX Oacute Aacute -50
+KPX Oacute Abreve -50
+KPX Oacute Acircumflex -50
+KPX Oacute Adieresis -50
+KPX Oacute Agrave -50
+KPX Oacute Amacron -50
+KPX Oacute Aogonek -50
+KPX Oacute Aring -50
+KPX Oacute Atilde -50
+KPX Oacute T -40
+KPX Oacute Tcaron -40
+KPX Oacute Tcommaaccent -40
+KPX Oacute V -50
+KPX Oacute W -50
+KPX Oacute X -50
+KPX Oacute Y -70
+KPX Oacute Yacute -70
+KPX Oacute Ydieresis -70
+KPX Oacute comma -40
+KPX Oacute period -40
+KPX Ocircumflex A -50
+KPX Ocircumflex Aacute -50
+KPX Ocircumflex Abreve -50
+KPX Ocircumflex Acircumflex -50
+KPX Ocircumflex Adieresis -50
+KPX Ocircumflex Agrave -50
+KPX Ocircumflex Amacron -50
+KPX Ocircumflex Aogonek -50
+KPX Ocircumflex Aring -50
+KPX Ocircumflex Atilde -50
+KPX Ocircumflex T -40
+KPX Ocircumflex Tcaron -40
+KPX Ocircumflex Tcommaaccent -40
+KPX Ocircumflex V -50
+KPX Ocircumflex W -50
+KPX Ocircumflex X -50
+KPX Ocircumflex Y -70
+KPX Ocircumflex Yacute -70
+KPX Ocircumflex Ydieresis -70
+KPX Ocircumflex comma -40
+KPX Ocircumflex period -40
+KPX Odieresis A -50
+KPX Odieresis Aacute -50
+KPX Odieresis Abreve -50
+KPX Odieresis Acircumflex -50
+KPX Odieresis Adieresis -50
+KPX Odieresis Agrave -50
+KPX Odieresis Amacron -50
+KPX Odieresis Aogonek -50
+KPX Odieresis Aring -50
+KPX Odieresis Atilde -50
+KPX Odieresis T -40
+KPX Odieresis Tcaron -40
+KPX Odieresis Tcommaaccent -40
+KPX Odieresis V -50
+KPX Odieresis W -50
+KPX Odieresis X -50
+KPX Odieresis Y -70
+KPX Odieresis Yacute -70
+KPX Odieresis Ydieresis -70
+KPX Odieresis comma -40
+KPX Odieresis period -40
+KPX Ograve A -50
+KPX Ograve Aacute -50
+KPX Ograve Abreve -50
+KPX Ograve Acircumflex -50
+KPX Ograve Adieresis -50
+KPX Ograve Agrave -50
+KPX Ograve Amacron -50
+KPX Ograve Aogonek -50
+KPX Ograve Aring -50
+KPX Ograve Atilde -50
+KPX Ograve T -40
+KPX Ograve Tcaron -40
+KPX Ograve Tcommaaccent -40
+KPX Ograve V -50
+KPX Ograve W -50
+KPX Ograve X -50
+KPX Ograve Y -70
+KPX Ograve Yacute -70
+KPX Ograve Ydieresis -70
+KPX Ograve comma -40
+KPX Ograve period -40
+KPX Ohungarumlaut A -50
+KPX Ohungarumlaut Aacute -50
+KPX Ohungarumlaut Abreve -50
+KPX Ohungarumlaut Acircumflex -50
+KPX Ohungarumlaut Adieresis -50
+KPX Ohungarumlaut Agrave -50
+KPX Ohungarumlaut Amacron -50
+KPX Ohungarumlaut Aogonek -50
+KPX Ohungarumlaut Aring -50
+KPX Ohungarumlaut Atilde -50
+KPX Ohungarumlaut T -40
+KPX Ohungarumlaut Tcaron -40
+KPX Ohungarumlaut Tcommaaccent -40
+KPX Ohungarumlaut V -50
+KPX Ohungarumlaut W -50
+KPX Ohungarumlaut X -50
+KPX Ohungarumlaut Y -70
+KPX Ohungarumlaut Yacute -70
+KPX Ohungarumlaut Ydieresis -70
+KPX Ohungarumlaut comma -40
+KPX Ohungarumlaut period -40
+KPX Omacron A -50
+KPX Omacron Aacute -50
+KPX Omacron Abreve -50
+KPX Omacron Acircumflex -50
+KPX Omacron Adieresis -50
+KPX Omacron Agrave -50
+KPX Omacron Amacron -50
+KPX Omacron Aogonek -50
+KPX Omacron Aring -50
+KPX Omacron Atilde -50
+KPX Omacron T -40
+KPX Omacron Tcaron -40
+KPX Omacron Tcommaaccent -40
+KPX Omacron V -50
+KPX Omacron W -50
+KPX Omacron X -50
+KPX Omacron Y -70
+KPX Omacron Yacute -70
+KPX Omacron Ydieresis -70
+KPX Omacron comma -40
+KPX Omacron period -40
+KPX Oslash A -50
+KPX Oslash Aacute -50
+KPX Oslash Abreve -50
+KPX Oslash Acircumflex -50
+KPX Oslash Adieresis -50
+KPX Oslash Agrave -50
+KPX Oslash Amacron -50
+KPX Oslash Aogonek -50
+KPX Oslash Aring -50
+KPX Oslash Atilde -50
+KPX Oslash T -40
+KPX Oslash Tcaron -40
+KPX Oslash Tcommaaccent -40
+KPX Oslash V -50
+KPX Oslash W -50
+KPX Oslash X -50
+KPX Oslash Y -70
+KPX Oslash Yacute -70
+KPX Oslash Ydieresis -70
+KPX Oslash comma -40
+KPX Oslash period -40
+KPX Otilde A -50
+KPX Otilde Aacute -50
+KPX Otilde Abreve -50
+KPX Otilde Acircumflex -50
+KPX Otilde Adieresis -50
+KPX Otilde Agrave -50
+KPX Otilde Amacron -50
+KPX Otilde Aogonek -50
+KPX Otilde Aring -50
+KPX Otilde Atilde -50
+KPX Otilde T -40
+KPX Otilde Tcaron -40
+KPX Otilde Tcommaaccent -40
+KPX Otilde V -50
+KPX Otilde W -50
+KPX Otilde X -50
+KPX Otilde Y -70
+KPX Otilde Yacute -70
+KPX Otilde Ydieresis -70
+KPX Otilde comma -40
+KPX Otilde period -40
+KPX P A -100
+KPX P Aacute -100
+KPX P Abreve -100
+KPX P Acircumflex -100
+KPX P Adieresis -100
+KPX P Agrave -100
+KPX P Amacron -100
+KPX P Aogonek -100
+KPX P Aring -100
+KPX P Atilde -100
+KPX P a -30
+KPX P aacute -30
+KPX P abreve -30
+KPX P acircumflex -30
+KPX P adieresis -30
+KPX P agrave -30
+KPX P amacron -30
+KPX P aogonek -30
+KPX P aring -30
+KPX P atilde -30
+KPX P comma -120
+KPX P e -30
+KPX P eacute -30
+KPX P ecaron -30
+KPX P ecircumflex -30
+KPX P edieresis -30
+KPX P edotaccent -30
+KPX P egrave -30
+KPX P emacron -30
+KPX P eogonek -30
+KPX P o -40
+KPX P oacute -40
+KPX P ocircumflex -40
+KPX P odieresis -40
+KPX P ograve -40
+KPX P ohungarumlaut -40
+KPX P omacron -40
+KPX P oslash -40
+KPX P otilde -40
+KPX P period -120
+KPX Q U -10
+KPX Q Uacute -10
+KPX Q Ucircumflex -10
+KPX Q Udieresis -10
+KPX Q Ugrave -10
+KPX Q Uhungarumlaut -10
+KPX Q Umacron -10
+KPX Q Uogonek -10
+KPX Q Uring -10
+KPX Q comma 20
+KPX Q period 20
+KPX R O -20
+KPX R Oacute -20
+KPX R Ocircumflex -20
+KPX R Odieresis -20
+KPX R Ograve -20
+KPX R Ohungarumlaut -20
+KPX R Omacron -20
+KPX R Oslash -20
+KPX R Otilde -20
+KPX R T -20
+KPX R Tcaron -20
+KPX R Tcommaaccent -20
+KPX R U -20
+KPX R Uacute -20
+KPX R Ucircumflex -20
+KPX R Udieresis -20
+KPX R Ugrave -20
+KPX R Uhungarumlaut -20
+KPX R Umacron -20
+KPX R Uogonek -20
+KPX R Uring -20
+KPX R V -50
+KPX R W -40
+KPX R Y -50
+KPX R Yacute -50
+KPX R Ydieresis -50
+KPX Racute O -20
+KPX Racute Oacute -20
+KPX Racute Ocircumflex -20
+KPX Racute Odieresis -20
+KPX Racute Ograve -20
+KPX Racute Ohungarumlaut -20
+KPX Racute Omacron -20
+KPX Racute Oslash -20
+KPX Racute Otilde -20
+KPX Racute T -20
+KPX Racute Tcaron -20
+KPX Racute Tcommaaccent -20
+KPX Racute U -20
+KPX Racute Uacute -20
+KPX Racute Ucircumflex -20
+KPX Racute Udieresis -20
+KPX Racute Ugrave -20
+KPX Racute Uhungarumlaut -20
+KPX Racute Umacron -20
+KPX Racute Uogonek -20
+KPX Racute Uring -20
+KPX Racute V -50
+KPX Racute W -40
+KPX Racute Y -50
+KPX Racute Yacute -50
+KPX Racute Ydieresis -50
+KPX Rcaron O -20
+KPX Rcaron Oacute -20
+KPX Rcaron Ocircumflex -20
+KPX Rcaron Odieresis -20
+KPX Rcaron Ograve -20
+KPX Rcaron Ohungarumlaut -20
+KPX Rcaron Omacron -20
+KPX Rcaron Oslash -20
+KPX Rcaron Otilde -20
+KPX Rcaron T -20
+KPX Rcaron Tcaron -20
+KPX Rcaron Tcommaaccent -20
+KPX Rcaron U -20
+KPX Rcaron Uacute -20
+KPX Rcaron Ucircumflex -20
+KPX Rcaron Udieresis -20
+KPX Rcaron Ugrave -20
+KPX Rcaron Uhungarumlaut -20
+KPX Rcaron Umacron -20
+KPX Rcaron Uogonek -20
+KPX Rcaron Uring -20
+KPX Rcaron V -50
+KPX Rcaron W -40
+KPX Rcaron Y -50
+KPX Rcaron Yacute -50
+KPX Rcaron Ydieresis -50
+KPX Rcommaaccent O -20
+KPX Rcommaaccent Oacute -20
+KPX Rcommaaccent Ocircumflex -20
+KPX Rcommaaccent Odieresis -20
+KPX Rcommaaccent Ograve -20
+KPX Rcommaaccent Ohungarumlaut -20
+KPX Rcommaaccent Omacron -20
+KPX Rcommaaccent Oslash -20
+KPX Rcommaaccent Otilde -20
+KPX Rcommaaccent T -20
+KPX Rcommaaccent Tcaron -20
+KPX Rcommaaccent Tcommaaccent -20
+KPX Rcommaaccent U -20
+KPX Rcommaaccent Uacute -20
+KPX Rcommaaccent Ucircumflex -20
+KPX Rcommaaccent Udieresis -20
+KPX Rcommaaccent Ugrave -20
+KPX Rcommaaccent Uhungarumlaut -20
+KPX Rcommaaccent Umacron -20
+KPX Rcommaaccent Uogonek -20
+KPX Rcommaaccent Uring -20
+KPX Rcommaaccent V -50
+KPX Rcommaaccent W -40
+KPX Rcommaaccent Y -50
+KPX Rcommaaccent Yacute -50
+KPX Rcommaaccent Ydieresis -50
+KPX T A -90
+KPX T Aacute -90
+KPX T Abreve -90
+KPX T Acircumflex -90
+KPX T Adieresis -90
+KPX T Agrave -90
+KPX T Amacron -90
+KPX T Aogonek -90
+KPX T Aring -90
+KPX T Atilde -90
+KPX T O -40
+KPX T Oacute -40
+KPX T Ocircumflex -40
+KPX T Odieresis -40
+KPX T Ograve -40
+KPX T Ohungarumlaut -40
+KPX T Omacron -40
+KPX T Oslash -40
+KPX T Otilde -40
+KPX T a -80
+KPX T aacute -80
+KPX T abreve -80
+KPX T acircumflex -80
+KPX T adieresis -80
+KPX T agrave -80
+KPX T amacron -80
+KPX T aogonek -80
+KPX T aring -80
+KPX T atilde -80
+KPX T colon -40
+KPX T comma -80
+KPX T e -60
+KPX T eacute -60
+KPX T ecaron -60
+KPX T ecircumflex -60
+KPX T edieresis -60
+KPX T edotaccent -60
+KPX T egrave -60
+KPX T emacron -60
+KPX T eogonek -60
+KPX T hyphen -120
+KPX T o -80
+KPX T oacute -80
+KPX T ocircumflex -80
+KPX T odieresis -80
+KPX T ograve -80
+KPX T ohungarumlaut -80
+KPX T omacron -80
+KPX T oslash -80
+KPX T otilde -80
+KPX T period -80
+KPX T r -80
+KPX T racute -80
+KPX T rcommaaccent -80
+KPX T semicolon -40
+KPX T u -90
+KPX T uacute -90
+KPX T ucircumflex -90
+KPX T udieresis -90
+KPX T ugrave -90
+KPX T uhungarumlaut -90
+KPX T umacron -90
+KPX T uogonek -90
+KPX T uring -90
+KPX T w -60
+KPX T y -60
+KPX T yacute -60
+KPX T ydieresis -60
+KPX Tcaron A -90
+KPX Tcaron Aacute -90
+KPX Tcaron Abreve -90
+KPX Tcaron Acircumflex -90
+KPX Tcaron Adieresis -90
+KPX Tcaron Agrave -90
+KPX Tcaron Amacron -90
+KPX Tcaron Aogonek -90
+KPX Tcaron Aring -90
+KPX Tcaron Atilde -90
+KPX Tcaron O -40
+KPX Tcaron Oacute -40
+KPX Tcaron Ocircumflex -40
+KPX Tcaron Odieresis -40
+KPX Tcaron Ograve -40
+KPX Tcaron Ohungarumlaut -40
+KPX Tcaron Omacron -40
+KPX Tcaron Oslash -40
+KPX Tcaron Otilde -40
+KPX Tcaron a -80
+KPX Tcaron aacute -80
+KPX Tcaron abreve -80
+KPX Tcaron acircumflex -80
+KPX Tcaron adieresis -80
+KPX Tcaron agrave -80
+KPX Tcaron amacron -80
+KPX Tcaron aogonek -80
+KPX Tcaron aring -80
+KPX Tcaron atilde -80
+KPX Tcaron colon -40
+KPX Tcaron comma -80
+KPX Tcaron e -60
+KPX Tcaron eacute -60
+KPX Tcaron ecaron -60
+KPX Tcaron ecircumflex -60
+KPX Tcaron edieresis -60
+KPX Tcaron edotaccent -60
+KPX Tcaron egrave -60
+KPX Tcaron emacron -60
+KPX Tcaron eogonek -60
+KPX Tcaron hyphen -120
+KPX Tcaron o -80
+KPX Tcaron oacute -80
+KPX Tcaron ocircumflex -80
+KPX Tcaron odieresis -80
+KPX Tcaron ograve -80
+KPX Tcaron ohungarumlaut -80
+KPX Tcaron omacron -80
+KPX Tcaron oslash -80
+KPX Tcaron otilde -80
+KPX Tcaron period -80
+KPX Tcaron r -80
+KPX Tcaron racute -80
+KPX Tcaron rcommaaccent -80
+KPX Tcaron semicolon -40
+KPX Tcaron u -90
+KPX Tcaron uacute -90
+KPX Tcaron ucircumflex -90
+KPX Tcaron udieresis -90
+KPX Tcaron ugrave -90
+KPX Tcaron uhungarumlaut -90
+KPX Tcaron umacron -90
+KPX Tcaron uogonek -90
+KPX Tcaron uring -90
+KPX Tcaron w -60
+KPX Tcaron y -60
+KPX Tcaron yacute -60
+KPX Tcaron ydieresis -60
+KPX Tcommaaccent A -90
+KPX Tcommaaccent Aacute -90
+KPX Tcommaaccent Abreve -90
+KPX Tcommaaccent Acircumflex -90
+KPX Tcommaaccent Adieresis -90
+KPX Tcommaaccent Agrave -90
+KPX Tcommaaccent Amacron -90
+KPX Tcommaaccent Aogonek -90
+KPX Tcommaaccent Aring -90
+KPX Tcommaaccent Atilde -90
+KPX Tcommaaccent O -40
+KPX Tcommaaccent Oacute -40
+KPX Tcommaaccent Ocircumflex -40
+KPX Tcommaaccent Odieresis -40
+KPX Tcommaaccent Ograve -40
+KPX Tcommaaccent Ohungarumlaut -40
+KPX Tcommaaccent Omacron -40
+KPX Tcommaaccent Oslash -40
+KPX Tcommaaccent Otilde -40
+KPX Tcommaaccent a -80
+KPX Tcommaaccent aacute -80
+KPX Tcommaaccent abreve -80
+KPX Tcommaaccent acircumflex -80
+KPX Tcommaaccent adieresis -80
+KPX Tcommaaccent agrave -80
+KPX Tcommaaccent amacron -80
+KPX Tcommaaccent aogonek -80
+KPX Tcommaaccent aring -80
+KPX Tcommaaccent atilde -80
+KPX Tcommaaccent colon -40
+KPX Tcommaaccent comma -80
+KPX Tcommaaccent e -60
+KPX Tcommaaccent eacute -60
+KPX Tcommaaccent ecaron -60
+KPX Tcommaaccent ecircumflex -60
+KPX Tcommaaccent edieresis -60
+KPX Tcommaaccent edotaccent -60
+KPX Tcommaaccent egrave -60
+KPX Tcommaaccent emacron -60
+KPX Tcommaaccent eogonek -60
+KPX Tcommaaccent hyphen -120
+KPX Tcommaaccent o -80
+KPX Tcommaaccent oacute -80
+KPX Tcommaaccent ocircumflex -80
+KPX Tcommaaccent odieresis -80
+KPX Tcommaaccent ograve -80
+KPX Tcommaaccent ohungarumlaut -80
+KPX Tcommaaccent omacron -80
+KPX Tcommaaccent oslash -80
+KPX Tcommaaccent otilde -80
+KPX Tcommaaccent period -80
+KPX Tcommaaccent r -80
+KPX Tcommaaccent racute -80
+KPX Tcommaaccent rcommaaccent -80
+KPX Tcommaaccent semicolon -40
+KPX Tcommaaccent u -90
+KPX Tcommaaccent uacute -90
+KPX Tcommaaccent ucircumflex -90
+KPX Tcommaaccent udieresis -90
+KPX Tcommaaccent ugrave -90
+KPX Tcommaaccent uhungarumlaut -90
+KPX Tcommaaccent umacron -90
+KPX Tcommaaccent uogonek -90
+KPX Tcommaaccent uring -90
+KPX Tcommaaccent w -60
+KPX Tcommaaccent y -60
+KPX Tcommaaccent yacute -60
+KPX Tcommaaccent ydieresis -60
+KPX U A -50
+KPX U Aacute -50
+KPX U Abreve -50
+KPX U Acircumflex -50
+KPX U Adieresis -50
+KPX U Agrave -50
+KPX U Amacron -50
+KPX U Aogonek -50
+KPX U Aring -50
+KPX U Atilde -50
+KPX U comma -30
+KPX U period -30
+KPX Uacute A -50
+KPX Uacute Aacute -50
+KPX Uacute Abreve -50
+KPX Uacute Acircumflex -50
+KPX Uacute Adieresis -50
+KPX Uacute Agrave -50
+KPX Uacute Amacron -50
+KPX Uacute Aogonek -50
+KPX Uacute Aring -50
+KPX Uacute Atilde -50
+KPX Uacute comma -30
+KPX Uacute period -30
+KPX Ucircumflex A -50
+KPX Ucircumflex Aacute -50
+KPX Ucircumflex Abreve -50
+KPX Ucircumflex Acircumflex -50
+KPX Ucircumflex Adieresis -50
+KPX Ucircumflex Agrave -50
+KPX Ucircumflex Amacron -50
+KPX Ucircumflex Aogonek -50
+KPX Ucircumflex Aring -50
+KPX Ucircumflex Atilde -50
+KPX Ucircumflex comma -30
+KPX Ucircumflex period -30
+KPX Udieresis A -50
+KPX Udieresis Aacute -50
+KPX Udieresis Abreve -50
+KPX Udieresis Acircumflex -50
+KPX Udieresis Adieresis -50
+KPX Udieresis Agrave -50
+KPX Udieresis Amacron -50
+KPX Udieresis Aogonek -50
+KPX Udieresis Aring -50
+KPX Udieresis Atilde -50
+KPX Udieresis comma -30
+KPX Udieresis period -30
+KPX Ugrave A -50
+KPX Ugrave Aacute -50
+KPX Ugrave Abreve -50
+KPX Ugrave Acircumflex -50
+KPX Ugrave Adieresis -50
+KPX Ugrave Agrave -50
+KPX Ugrave Amacron -50
+KPX Ugrave Aogonek -50
+KPX Ugrave Aring -50
+KPX Ugrave Atilde -50
+KPX Ugrave comma -30
+KPX Ugrave period -30
+KPX Uhungarumlaut A -50
+KPX Uhungarumlaut Aacute -50
+KPX Uhungarumlaut Abreve -50
+KPX Uhungarumlaut Acircumflex -50
+KPX Uhungarumlaut Adieresis -50
+KPX Uhungarumlaut Agrave -50
+KPX Uhungarumlaut Amacron -50
+KPX Uhungarumlaut Aogonek -50
+KPX Uhungarumlaut Aring -50
+KPX Uhungarumlaut Atilde -50
+KPX Uhungarumlaut comma -30
+KPX Uhungarumlaut period -30
+KPX Umacron A -50
+KPX Umacron Aacute -50
+KPX Umacron Abreve -50
+KPX Umacron Acircumflex -50
+KPX Umacron Adieresis -50
+KPX Umacron Agrave -50
+KPX Umacron Amacron -50
+KPX Umacron Aogonek -50
+KPX Umacron Aring -50
+KPX Umacron Atilde -50
+KPX Umacron comma -30
+KPX Umacron period -30
+KPX Uogonek A -50
+KPX Uogonek Aacute -50
+KPX Uogonek Abreve -50
+KPX Uogonek Acircumflex -50
+KPX Uogonek Adieresis -50
+KPX Uogonek Agrave -50
+KPX Uogonek Amacron -50
+KPX Uogonek Aogonek -50
+KPX Uogonek Aring -50
+KPX Uogonek Atilde -50
+KPX Uogonek comma -30
+KPX Uogonek period -30
+KPX Uring A -50
+KPX Uring Aacute -50
+KPX Uring Abreve -50
+KPX Uring Acircumflex -50
+KPX Uring Adieresis -50
+KPX Uring Agrave -50
+KPX Uring Amacron -50
+KPX Uring Aogonek -50
+KPX Uring Aring -50
+KPX Uring Atilde -50
+KPX Uring comma -30
+KPX Uring period -30
+KPX V A -80
+KPX V Aacute -80
+KPX V Abreve -80
+KPX V Acircumflex -80
+KPX V Adieresis -80
+KPX V Agrave -80
+KPX V Amacron -80
+KPX V Aogonek -80
+KPX V Aring -80
+KPX V Atilde -80
+KPX V G -50
+KPX V Gbreve -50
+KPX V Gcommaaccent -50
+KPX V O -50
+KPX V Oacute -50
+KPX V Ocircumflex -50
+KPX V Odieresis -50
+KPX V Ograve -50
+KPX V Ohungarumlaut -50
+KPX V Omacron -50
+KPX V Oslash -50
+KPX V Otilde -50
+KPX V a -60
+KPX V aacute -60
+KPX V abreve -60
+KPX V acircumflex -60
+KPX V adieresis -60
+KPX V agrave -60
+KPX V amacron -60
+KPX V aogonek -60
+KPX V aring -60
+KPX V atilde -60
+KPX V colon -40
+KPX V comma -120
+KPX V e -50
+KPX V eacute -50
+KPX V ecaron -50
+KPX V ecircumflex -50
+KPX V edieresis -50
+KPX V edotaccent -50
+KPX V egrave -50
+KPX V emacron -50
+KPX V eogonek -50
+KPX V hyphen -80
+KPX V o -90
+KPX V oacute -90
+KPX V ocircumflex -90
+KPX V odieresis -90
+KPX V ograve -90
+KPX V ohungarumlaut -90
+KPX V omacron -90
+KPX V oslash -90
+KPX V otilde -90
+KPX V period -120
+KPX V semicolon -40
+KPX V u -60
+KPX V uacute -60
+KPX V ucircumflex -60
+KPX V udieresis -60
+KPX V ugrave -60
+KPX V uhungarumlaut -60
+KPX V umacron -60
+KPX V uogonek -60
+KPX V uring -60
+KPX W A -60
+KPX W Aacute -60
+KPX W Abreve -60
+KPX W Acircumflex -60
+KPX W Adieresis -60
+KPX W Agrave -60
+KPX W Amacron -60
+KPX W Aogonek -60
+KPX W Aring -60
+KPX W Atilde -60
+KPX W O -20
+KPX W Oacute -20
+KPX W Ocircumflex -20
+KPX W Odieresis -20
+KPX W Ograve -20
+KPX W Ohungarumlaut -20
+KPX W Omacron -20
+KPX W Oslash -20
+KPX W Otilde -20
+KPX W a -40
+KPX W aacute -40
+KPX W abreve -40
+KPX W acircumflex -40
+KPX W adieresis -40
+KPX W agrave -40
+KPX W amacron -40
+KPX W aogonek -40
+KPX W aring -40
+KPX W atilde -40
+KPX W colon -10
+KPX W comma -80
+KPX W e -35
+KPX W eacute -35
+KPX W ecaron -35
+KPX W ecircumflex -35
+KPX W edieresis -35
+KPX W edotaccent -35
+KPX W egrave -35
+KPX W emacron -35
+KPX W eogonek -35
+KPX W hyphen -40
+KPX W o -60
+KPX W oacute -60
+KPX W ocircumflex -60
+KPX W odieresis -60
+KPX W ograve -60
+KPX W ohungarumlaut -60
+KPX W omacron -60
+KPX W oslash -60
+KPX W otilde -60
+KPX W period -80
+KPX W semicolon -10
+KPX W u -45
+KPX W uacute -45
+KPX W ucircumflex -45
+KPX W udieresis -45
+KPX W ugrave -45
+KPX W uhungarumlaut -45
+KPX W umacron -45
+KPX W uogonek -45
+KPX W uring -45
+KPX W y -20
+KPX W yacute -20
+KPX W ydieresis -20
+KPX Y A -110
+KPX Y Aacute -110
+KPX Y Abreve -110
+KPX Y Acircumflex -110
+KPX Y Adieresis -110
+KPX Y Agrave -110
+KPX Y Amacron -110
+KPX Y Aogonek -110
+KPX Y Aring -110
+KPX Y Atilde -110
+KPX Y O -70
+KPX Y Oacute -70
+KPX Y Ocircumflex -70
+KPX Y Odieresis -70
+KPX Y Ograve -70
+KPX Y Ohungarumlaut -70
+KPX Y Omacron -70
+KPX Y Oslash -70
+KPX Y Otilde -70
+KPX Y a -90
+KPX Y aacute -90
+KPX Y abreve -90
+KPX Y acircumflex -90
+KPX Y adieresis -90
+KPX Y agrave -90
+KPX Y amacron -90
+KPX Y aogonek -90
+KPX Y aring -90
+KPX Y atilde -90
+KPX Y colon -50
+KPX Y comma -100
+KPX Y e -80
+KPX Y eacute -80
+KPX Y ecaron -80
+KPX Y ecircumflex -80
+KPX Y edieresis -80
+KPX Y edotaccent -80
+KPX Y egrave -80
+KPX Y emacron -80
+KPX Y eogonek -80
+KPX Y o -100
+KPX Y oacute -100
+KPX Y ocircumflex -100
+KPX Y odieresis -100
+KPX Y ograve -100
+KPX Y ohungarumlaut -100
+KPX Y omacron -100
+KPX Y oslash -100
+KPX Y otilde -100
+KPX Y period -100
+KPX Y semicolon -50
+KPX Y u -100
+KPX Y uacute -100
+KPX Y ucircumflex -100
+KPX Y udieresis -100
+KPX Y ugrave -100
+KPX Y uhungarumlaut -100
+KPX Y umacron -100
+KPX Y uogonek -100
+KPX Y uring -100
+KPX Yacute A -110
+KPX Yacute Aacute -110
+KPX Yacute Abreve -110
+KPX Yacute Acircumflex -110
+KPX Yacute Adieresis -110
+KPX Yacute Agrave -110
+KPX Yacute Amacron -110
+KPX Yacute Aogonek -110
+KPX Yacute Aring -110
+KPX Yacute Atilde -110
+KPX Yacute O -70
+KPX Yacute Oacute -70
+KPX Yacute Ocircumflex -70
+KPX Yacute Odieresis -70
+KPX Yacute Ograve -70
+KPX Yacute Ohungarumlaut -70
+KPX Yacute Omacron -70
+KPX Yacute Oslash -70
+KPX Yacute Otilde -70
+KPX Yacute a -90
+KPX Yacute aacute -90
+KPX Yacute abreve -90
+KPX Yacute acircumflex -90
+KPX Yacute adieresis -90
+KPX Yacute agrave -90
+KPX Yacute amacron -90
+KPX Yacute aogonek -90
+KPX Yacute aring -90
+KPX Yacute atilde -90
+KPX Yacute colon -50
+KPX Yacute comma -100
+KPX Yacute e -80
+KPX Yacute eacute -80
+KPX Yacute ecaron -80
+KPX Yacute ecircumflex -80
+KPX Yacute edieresis -80
+KPX Yacute edotaccent -80
+KPX Yacute egrave -80
+KPX Yacute emacron -80
+KPX Yacute eogonek -80
+KPX Yacute o -100
+KPX Yacute oacute -100
+KPX Yacute ocircumflex -100
+KPX Yacute odieresis -100
+KPX Yacute ograve -100
+KPX Yacute ohungarumlaut -100
+KPX Yacute omacron -100
+KPX Yacute oslash -100
+KPX Yacute otilde -100
+KPX Yacute period -100
+KPX Yacute semicolon -50
+KPX Yacute u -100
+KPX Yacute uacute -100
+KPX Yacute ucircumflex -100
+KPX Yacute udieresis -100
+KPX Yacute ugrave -100
+KPX Yacute uhungarumlaut -100
+KPX Yacute umacron -100
+KPX Yacute uogonek -100
+KPX Yacute uring -100
+KPX Ydieresis A -110
+KPX Ydieresis Aacute -110
+KPX Ydieresis Abreve -110
+KPX Ydieresis Acircumflex -110
+KPX Ydieresis Adieresis -110
+KPX Ydieresis Agrave -110
+KPX Ydieresis Amacron -110
+KPX Ydieresis Aogonek -110
+KPX Ydieresis Aring -110
+KPX Ydieresis Atilde -110
+KPX Ydieresis O -70
+KPX Ydieresis Oacute -70
+KPX Ydieresis Ocircumflex -70
+KPX Ydieresis Odieresis -70
+KPX Ydieresis Ograve -70
+KPX Ydieresis Ohungarumlaut -70
+KPX Ydieresis Omacron -70
+KPX Ydieresis Oslash -70
+KPX Ydieresis Otilde -70
+KPX Ydieresis a -90
+KPX Ydieresis aacute -90
+KPX Ydieresis abreve -90
+KPX Ydieresis acircumflex -90
+KPX Ydieresis adieresis -90
+KPX Ydieresis agrave -90
+KPX Ydieresis amacron -90
+KPX Ydieresis aogonek -90
+KPX Ydieresis aring -90
+KPX Ydieresis atilde -90
+KPX Ydieresis colon -50
+KPX Ydieresis comma -100
+KPX Ydieresis e -80
+KPX Ydieresis eacute -80
+KPX Ydieresis ecaron -80
+KPX Ydieresis ecircumflex -80
+KPX Ydieresis edieresis -80
+KPX Ydieresis edotaccent -80
+KPX Ydieresis egrave -80
+KPX Ydieresis emacron -80
+KPX Ydieresis eogonek -80
+KPX Ydieresis o -100
+KPX Ydieresis oacute -100
+KPX Ydieresis ocircumflex -100
+KPX Ydieresis odieresis -100
+KPX Ydieresis ograve -100
+KPX Ydieresis ohungarumlaut -100
+KPX Ydieresis omacron -100
+KPX Ydieresis oslash -100
+KPX Ydieresis otilde -100
+KPX Ydieresis period -100
+KPX Ydieresis semicolon -50
+KPX Ydieresis u -100
+KPX Ydieresis uacute -100
+KPX Ydieresis ucircumflex -100
+KPX Ydieresis udieresis -100
+KPX Ydieresis ugrave -100
+KPX Ydieresis uhungarumlaut -100
+KPX Ydieresis umacron -100
+KPX Ydieresis uogonek -100
+KPX Ydieresis uring -100
+KPX a g -10
+KPX a gbreve -10
+KPX a gcommaaccent -10
+KPX a v -15
+KPX a w -15
+KPX a y -20
+KPX a yacute -20
+KPX a ydieresis -20
+KPX aacute g -10
+KPX aacute gbreve -10
+KPX aacute gcommaaccent -10
+KPX aacute v -15
+KPX aacute w -15
+KPX aacute y -20
+KPX aacute yacute -20
+KPX aacute ydieresis -20
+KPX abreve g -10
+KPX abreve gbreve -10
+KPX abreve gcommaaccent -10
+KPX abreve v -15
+KPX abreve w -15
+KPX abreve y -20
+KPX abreve yacute -20
+KPX abreve ydieresis -20
+KPX acircumflex g -10
+KPX acircumflex gbreve -10
+KPX acircumflex gcommaaccent -10
+KPX acircumflex v -15
+KPX acircumflex w -15
+KPX acircumflex y -20
+KPX acircumflex yacute -20
+KPX acircumflex ydieresis -20
+KPX adieresis g -10
+KPX adieresis gbreve -10
+KPX adieresis gcommaaccent -10
+KPX adieresis v -15
+KPX adieresis w -15
+KPX adieresis y -20
+KPX adieresis yacute -20
+KPX adieresis ydieresis -20
+KPX agrave g -10
+KPX agrave gbreve -10
+KPX agrave gcommaaccent -10
+KPX agrave v -15
+KPX agrave w -15
+KPX agrave y -20
+KPX agrave yacute -20
+KPX agrave ydieresis -20
+KPX amacron g -10
+KPX amacron gbreve -10
+KPX amacron gcommaaccent -10
+KPX amacron v -15
+KPX amacron w -15
+KPX amacron y -20
+KPX amacron yacute -20
+KPX amacron ydieresis -20
+KPX aogonek g -10
+KPX aogonek gbreve -10
+KPX aogonek gcommaaccent -10
+KPX aogonek v -15
+KPX aogonek w -15
+KPX aogonek y -20
+KPX aogonek yacute -20
+KPX aogonek ydieresis -20
+KPX aring g -10
+KPX aring gbreve -10
+KPX aring gcommaaccent -10
+KPX aring v -15
+KPX aring w -15
+KPX aring y -20
+KPX aring yacute -20
+KPX aring ydieresis -20
+KPX atilde g -10
+KPX atilde gbreve -10
+KPX atilde gcommaaccent -10
+KPX atilde v -15
+KPX atilde w -15
+KPX atilde y -20
+KPX atilde yacute -20
+KPX atilde ydieresis -20
+KPX b l -10
+KPX b lacute -10
+KPX b lcommaaccent -10
+KPX b lslash -10
+KPX b u -20
+KPX b uacute -20
+KPX b ucircumflex -20
+KPX b udieresis -20
+KPX b ugrave -20
+KPX b uhungarumlaut -20
+KPX b umacron -20
+KPX b uogonek -20
+KPX b uring -20
+KPX b v -20
+KPX b y -20
+KPX b yacute -20
+KPX b ydieresis -20
+KPX c h -10
+KPX c k -20
+KPX c kcommaaccent -20
+KPX c l -20
+KPX c lacute -20
+KPX c lcommaaccent -20
+KPX c lslash -20
+KPX c y -10
+KPX c yacute -10
+KPX c ydieresis -10
+KPX cacute h -10
+KPX cacute k -20
+KPX cacute kcommaaccent -20
+KPX cacute l -20
+KPX cacute lacute -20
+KPX cacute lcommaaccent -20
+KPX cacute lslash -20
+KPX cacute y -10
+KPX cacute yacute -10
+KPX cacute ydieresis -10
+KPX ccaron h -10
+KPX ccaron k -20
+KPX ccaron kcommaaccent -20
+KPX ccaron l -20
+KPX ccaron lacute -20
+KPX ccaron lcommaaccent -20
+KPX ccaron lslash -20
+KPX ccaron y -10
+KPX ccaron yacute -10
+KPX ccaron ydieresis -10
+KPX ccedilla h -10
+KPX ccedilla k -20
+KPX ccedilla kcommaaccent -20
+KPX ccedilla l -20
+KPX ccedilla lacute -20
+KPX ccedilla lcommaaccent -20
+KPX ccedilla lslash -20
+KPX ccedilla y -10
+KPX ccedilla yacute -10
+KPX ccedilla ydieresis -10
+KPX colon space -40
+KPX comma quotedblright -120
+KPX comma quoteright -120
+KPX comma space -40
+KPX d d -10
+KPX d dcroat -10
+KPX d v -15
+KPX d w -15
+KPX d y -15
+KPX d yacute -15
+KPX d ydieresis -15
+KPX dcroat d -10
+KPX dcroat dcroat -10
+KPX dcroat v -15
+KPX dcroat w -15
+KPX dcroat y -15
+KPX dcroat yacute -15
+KPX dcroat ydieresis -15
+KPX e comma 10
+KPX e period 20
+KPX e v -15
+KPX e w -15
+KPX e x -15
+KPX e y -15
+KPX e yacute -15
+KPX e ydieresis -15
+KPX eacute comma 10
+KPX eacute period 20
+KPX eacute v -15
+KPX eacute w -15
+KPX eacute x -15
+KPX eacute y -15
+KPX eacute yacute -15
+KPX eacute ydieresis -15
+KPX ecaron comma 10
+KPX ecaron period 20
+KPX ecaron v -15
+KPX ecaron w -15
+KPX ecaron x -15
+KPX ecaron y -15
+KPX ecaron yacute -15
+KPX ecaron ydieresis -15
+KPX ecircumflex comma 10
+KPX ecircumflex period 20
+KPX ecircumflex v -15
+KPX ecircumflex w -15
+KPX ecircumflex x -15
+KPX ecircumflex y -15
+KPX ecircumflex yacute -15
+KPX ecircumflex ydieresis -15
+KPX edieresis comma 10
+KPX edieresis period 20
+KPX edieresis v -15
+KPX edieresis w -15
+KPX edieresis x -15
+KPX edieresis y -15
+KPX edieresis yacute -15
+KPX edieresis ydieresis -15
+KPX edotaccent comma 10
+KPX edotaccent period 20
+KPX edotaccent v -15
+KPX edotaccent w -15
+KPX edotaccent x -15
+KPX edotaccent y -15
+KPX edotaccent yacute -15
+KPX edotaccent ydieresis -15
+KPX egrave comma 10
+KPX egrave period 20
+KPX egrave v -15
+KPX egrave w -15
+KPX egrave x -15
+KPX egrave y -15
+KPX egrave yacute -15
+KPX egrave ydieresis -15
+KPX emacron comma 10
+KPX emacron period 20
+KPX emacron v -15
+KPX emacron w -15
+KPX emacron x -15
+KPX emacron y -15
+KPX emacron yacute -15
+KPX emacron ydieresis -15
+KPX eogonek comma 10
+KPX eogonek period 20
+KPX eogonek v -15
+KPX eogonek w -15
+KPX eogonek x -15
+KPX eogonek y -15
+KPX eogonek yacute -15
+KPX eogonek ydieresis -15
+KPX f comma -10
+KPX f e -10
+KPX f eacute -10
+KPX f ecaron -10
+KPX f ecircumflex -10
+KPX f edieresis -10
+KPX f edotaccent -10
+KPX f egrave -10
+KPX f emacron -10
+KPX f eogonek -10
+KPX f o -20
+KPX f oacute -20
+KPX f ocircumflex -20
+KPX f odieresis -20
+KPX f ograve -20
+KPX f ohungarumlaut -20
+KPX f omacron -20
+KPX f oslash -20
+KPX f otilde -20
+KPX f period -10
+KPX f quotedblright 30
+KPX f quoteright 30
+KPX g e 10
+KPX g eacute 10
+KPX g ecaron 10
+KPX g ecircumflex 10
+KPX g edieresis 10
+KPX g edotaccent 10
+KPX g egrave 10
+KPX g emacron 10
+KPX g eogonek 10
+KPX g g -10
+KPX g gbreve -10
+KPX g gcommaaccent -10
+KPX gbreve e 10
+KPX gbreve eacute 10
+KPX gbreve ecaron 10
+KPX gbreve ecircumflex 10
+KPX gbreve edieresis 10
+KPX gbreve edotaccent 10
+KPX gbreve egrave 10
+KPX gbreve emacron 10
+KPX gbreve eogonek 10
+KPX gbreve g -10
+KPX gbreve gbreve -10
+KPX gbreve gcommaaccent -10
+KPX gcommaaccent e 10
+KPX gcommaaccent eacute 10
+KPX gcommaaccent ecaron 10
+KPX gcommaaccent ecircumflex 10
+KPX gcommaaccent edieresis 10
+KPX gcommaaccent edotaccent 10
+KPX gcommaaccent egrave 10
+KPX gcommaaccent emacron 10
+KPX gcommaaccent eogonek 10
+KPX gcommaaccent g -10
+KPX gcommaaccent gbreve -10
+KPX gcommaaccent gcommaaccent -10
+KPX h y -20
+KPX h yacute -20
+KPX h ydieresis -20
+KPX k o -15
+KPX k oacute -15
+KPX k ocircumflex -15
+KPX k odieresis -15
+KPX k ograve -15
+KPX k ohungarumlaut -15
+KPX k omacron -15
+KPX k oslash -15
+KPX k otilde -15
+KPX kcommaaccent o -15
+KPX kcommaaccent oacute -15
+KPX kcommaaccent ocircumflex -15
+KPX kcommaaccent odieresis -15
+KPX kcommaaccent ograve -15
+KPX kcommaaccent ohungarumlaut -15
+KPX kcommaaccent omacron -15
+KPX kcommaaccent oslash -15
+KPX kcommaaccent otilde -15
+KPX l w -15
+KPX l y -15
+KPX l yacute -15
+KPX l ydieresis -15
+KPX lacute w -15
+KPX lacute y -15
+KPX lacute yacute -15
+KPX lacute ydieresis -15
+KPX lcommaaccent w -15
+KPX lcommaaccent y -15
+KPX lcommaaccent yacute -15
+KPX lcommaaccent ydieresis -15
+KPX lslash w -15
+KPX lslash y -15
+KPX lslash yacute -15
+KPX lslash ydieresis -15
+KPX m u -20
+KPX m uacute -20
+KPX m ucircumflex -20
+KPX m udieresis -20
+KPX m ugrave -20
+KPX m uhungarumlaut -20
+KPX m umacron -20
+KPX m uogonek -20
+KPX m uring -20
+KPX m y -30
+KPX m yacute -30
+KPX m ydieresis -30
+KPX n u -10
+KPX n uacute -10
+KPX n ucircumflex -10
+KPX n udieresis -10
+KPX n ugrave -10
+KPX n uhungarumlaut -10
+KPX n umacron -10
+KPX n uogonek -10
+KPX n uring -10
+KPX n v -40
+KPX n y -20
+KPX n yacute -20
+KPX n ydieresis -20
+KPX nacute u -10
+KPX nacute uacute -10
+KPX nacute ucircumflex -10
+KPX nacute udieresis -10
+KPX nacute ugrave -10
+KPX nacute uhungarumlaut -10
+KPX nacute umacron -10
+KPX nacute uogonek -10
+KPX nacute uring -10
+KPX nacute v -40
+KPX nacute y -20
+KPX nacute yacute -20
+KPX nacute ydieresis -20
+KPX ncaron u -10
+KPX ncaron uacute -10
+KPX ncaron ucircumflex -10
+KPX ncaron udieresis -10
+KPX ncaron ugrave -10
+KPX ncaron uhungarumlaut -10
+KPX ncaron umacron -10
+KPX ncaron uogonek -10
+KPX ncaron uring -10
+KPX ncaron v -40
+KPX ncaron y -20
+KPX ncaron yacute -20
+KPX ncaron ydieresis -20
+KPX ncommaaccent u -10
+KPX ncommaaccent uacute -10
+KPX ncommaaccent ucircumflex -10
+KPX ncommaaccent udieresis -10
+KPX ncommaaccent ugrave -10
+KPX ncommaaccent uhungarumlaut -10
+KPX ncommaaccent umacron -10
+KPX ncommaaccent uogonek -10
+KPX ncommaaccent uring -10
+KPX ncommaaccent v -40
+KPX ncommaaccent y -20
+KPX ncommaaccent yacute -20
+KPX ncommaaccent ydieresis -20
+KPX ntilde u -10
+KPX ntilde uacute -10
+KPX ntilde ucircumflex -10
+KPX ntilde udieresis -10
+KPX ntilde ugrave -10
+KPX ntilde uhungarumlaut -10
+KPX ntilde umacron -10
+KPX ntilde uogonek -10
+KPX ntilde uring -10
+KPX ntilde v -40
+KPX ntilde y -20
+KPX ntilde yacute -20
+KPX ntilde ydieresis -20
+KPX o v -20
+KPX o w -15
+KPX o x -30
+KPX o y -20
+KPX o yacute -20
+KPX o ydieresis -20
+KPX oacute v -20
+KPX oacute w -15
+KPX oacute x -30
+KPX oacute y -20
+KPX oacute yacute -20
+KPX oacute ydieresis -20
+KPX ocircumflex v -20
+KPX ocircumflex w -15
+KPX ocircumflex x -30
+KPX ocircumflex y -20
+KPX ocircumflex yacute -20
+KPX ocircumflex ydieresis -20
+KPX odieresis v -20
+KPX odieresis w -15
+KPX odieresis x -30
+KPX odieresis y -20
+KPX odieresis yacute -20
+KPX odieresis ydieresis -20
+KPX ograve v -20
+KPX ograve w -15
+KPX ograve x -30
+KPX ograve y -20
+KPX ograve yacute -20
+KPX ograve ydieresis -20
+KPX ohungarumlaut v -20
+KPX ohungarumlaut w -15
+KPX ohungarumlaut x -30
+KPX ohungarumlaut y -20
+KPX ohungarumlaut yacute -20
+KPX ohungarumlaut ydieresis -20
+KPX omacron v -20
+KPX omacron w -15
+KPX omacron x -30
+KPX omacron y -20
+KPX omacron yacute -20
+KPX omacron ydieresis -20
+KPX oslash v -20
+KPX oslash w -15
+KPX oslash x -30
+KPX oslash y -20
+KPX oslash yacute -20
+KPX oslash ydieresis -20
+KPX otilde v -20
+KPX otilde w -15
+KPX otilde x -30
+KPX otilde y -20
+KPX otilde yacute -20
+KPX otilde ydieresis -20
+KPX p y -15
+KPX p yacute -15
+KPX p ydieresis -15
+KPX period quotedblright -120
+KPX period quoteright -120
+KPX period space -40
+KPX quotedblright space -80
+KPX quoteleft quoteleft -46
+KPX quoteright d -80
+KPX quoteright dcroat -80
+KPX quoteright l -20
+KPX quoteright lacute -20
+KPX quoteright lcommaaccent -20
+KPX quoteright lslash -20
+KPX quoteright quoteright -46
+KPX quoteright r -40
+KPX quoteright racute -40
+KPX quoteright rcaron -40
+KPX quoteright rcommaaccent -40
+KPX quoteright s -60
+KPX quoteright sacute -60
+KPX quoteright scaron -60
+KPX quoteright scedilla -60
+KPX quoteright scommaaccent -60
+KPX quoteright space -80
+KPX quoteright v -20
+KPX r c -20
+KPX r cacute -20
+KPX r ccaron -20
+KPX r ccedilla -20
+KPX r comma -60
+KPX r d -20
+KPX r dcroat -20
+KPX r g -15
+KPX r gbreve -15
+KPX r gcommaaccent -15
+KPX r hyphen -20
+KPX r o -20
+KPX r oacute -20
+KPX r ocircumflex -20
+KPX r odieresis -20
+KPX r ograve -20
+KPX r ohungarumlaut -20
+KPX r omacron -20
+KPX r oslash -20
+KPX r otilde -20
+KPX r period -60
+KPX r q -20
+KPX r s -15
+KPX r sacute -15
+KPX r scaron -15
+KPX r scedilla -15
+KPX r scommaaccent -15
+KPX r t 20
+KPX r tcommaaccent 20
+KPX r v 10
+KPX r y 10
+KPX r yacute 10
+KPX r ydieresis 10
+KPX racute c -20
+KPX racute cacute -20
+KPX racute ccaron -20
+KPX racute ccedilla -20
+KPX racute comma -60
+KPX racute d -20
+KPX racute dcroat -20
+KPX racute g -15
+KPX racute gbreve -15
+KPX racute gcommaaccent -15
+KPX racute hyphen -20
+KPX racute o -20
+KPX racute oacute -20
+KPX racute ocircumflex -20
+KPX racute odieresis -20
+KPX racute ograve -20
+KPX racute ohungarumlaut -20
+KPX racute omacron -20
+KPX racute oslash -20
+KPX racute otilde -20
+KPX racute period -60
+KPX racute q -20
+KPX racute s -15
+KPX racute sacute -15
+KPX racute scaron -15
+KPX racute scedilla -15
+KPX racute scommaaccent -15
+KPX racute t 20
+KPX racute tcommaaccent 20
+KPX racute v 10
+KPX racute y 10
+KPX racute yacute 10
+KPX racute ydieresis 10
+KPX rcaron c -20
+KPX rcaron cacute -20
+KPX rcaron ccaron -20
+KPX rcaron ccedilla -20
+KPX rcaron comma -60
+KPX rcaron d -20
+KPX rcaron dcroat -20
+KPX rcaron g -15
+KPX rcaron gbreve -15
+KPX rcaron gcommaaccent -15
+KPX rcaron hyphen -20
+KPX rcaron o -20
+KPX rcaron oacute -20
+KPX rcaron ocircumflex -20
+KPX rcaron odieresis -20
+KPX rcaron ograve -20
+KPX rcaron ohungarumlaut -20
+KPX rcaron omacron -20
+KPX rcaron oslash -20
+KPX rcaron otilde -20
+KPX rcaron period -60
+KPX rcaron q -20
+KPX rcaron s -15
+KPX rcaron sacute -15
+KPX rcaron scaron -15
+KPX rcaron scedilla -15
+KPX rcaron scommaaccent -15
+KPX rcaron t 20
+KPX rcaron tcommaaccent 20
+KPX rcaron v 10
+KPX rcaron y 10
+KPX rcaron yacute 10
+KPX rcaron ydieresis 10
+KPX rcommaaccent c -20
+KPX rcommaaccent cacute -20
+KPX rcommaaccent ccaron -20
+KPX rcommaaccent ccedilla -20
+KPX rcommaaccent comma -60
+KPX rcommaaccent d -20
+KPX rcommaaccent dcroat -20
+KPX rcommaaccent g -15
+KPX rcommaaccent gbreve -15
+KPX rcommaaccent gcommaaccent -15
+KPX rcommaaccent hyphen -20
+KPX rcommaaccent o -20
+KPX rcommaaccent oacute -20
+KPX rcommaaccent ocircumflex -20
+KPX rcommaaccent odieresis -20
+KPX rcommaaccent ograve -20
+KPX rcommaaccent ohungarumlaut -20
+KPX rcommaaccent omacron -20
+KPX rcommaaccent oslash -20
+KPX rcommaaccent otilde -20
+KPX rcommaaccent period -60
+KPX rcommaaccent q -20
+KPX rcommaaccent s -15
+KPX rcommaaccent sacute -15
+KPX rcommaaccent scaron -15
+KPX rcommaaccent scedilla -15
+KPX rcommaaccent scommaaccent -15
+KPX rcommaaccent t 20
+KPX rcommaaccent tcommaaccent 20
+KPX rcommaaccent v 10
+KPX rcommaaccent y 10
+KPX rcommaaccent yacute 10
+KPX rcommaaccent ydieresis 10
+KPX s w -15
+KPX sacute w -15
+KPX scaron w -15
+KPX scedilla w -15
+KPX scommaaccent w -15
+KPX semicolon space -40
+KPX space T -100
+KPX space Tcaron -100
+KPX space Tcommaaccent -100
+KPX space V -80
+KPX space W -80
+KPX space Y -120
+KPX space Yacute -120
+KPX space Ydieresis -120
+KPX space quotedblleft -80
+KPX space quoteleft -60
+KPX v a -20
+KPX v aacute -20
+KPX v abreve -20
+KPX v acircumflex -20
+KPX v adieresis -20
+KPX v agrave -20
+KPX v amacron -20
+KPX v aogonek -20
+KPX v aring -20
+KPX v atilde -20
+KPX v comma -80
+KPX v o -30
+KPX v oacute -30
+KPX v ocircumflex -30
+KPX v odieresis -30
+KPX v ograve -30
+KPX v ohungarumlaut -30
+KPX v omacron -30
+KPX v oslash -30
+KPX v otilde -30
+KPX v period -80
+KPX w comma -40
+KPX w o -20
+KPX w oacute -20
+KPX w ocircumflex -20
+KPX w odieresis -20
+KPX w ograve -20
+KPX w ohungarumlaut -20
+KPX w omacron -20
+KPX w oslash -20
+KPX w otilde -20
+KPX w period -40
+KPX x e -10
+KPX x eacute -10
+KPX x ecaron -10
+KPX x ecircumflex -10
+KPX x edieresis -10
+KPX x edotaccent -10
+KPX x egrave -10
+KPX x emacron -10
+KPX x eogonek -10
+KPX y a -30
+KPX y aacute -30
+KPX y abreve -30
+KPX y acircumflex -30
+KPX y adieresis -30
+KPX y agrave -30
+KPX y amacron -30
+KPX y aogonek -30
+KPX y aring -30
+KPX y atilde -30
+KPX y comma -80
+KPX y e -10
+KPX y eacute -10
+KPX y ecaron -10
+KPX y ecircumflex -10
+KPX y edieresis -10
+KPX y edotaccent -10
+KPX y egrave -10
+KPX y emacron -10
+KPX y eogonek -10
+KPX y o -25
+KPX y oacute -25
+KPX y ocircumflex -25
+KPX y odieresis -25
+KPX y ograve -25
+KPX y ohungarumlaut -25
+KPX y omacron -25
+KPX y oslash -25
+KPX y otilde -25
+KPX y period -80
+KPX yacute a -30
+KPX yacute aacute -30
+KPX yacute abreve -30
+KPX yacute acircumflex -30
+KPX yacute adieresis -30
+KPX yacute agrave -30
+KPX yacute amacron -30
+KPX yacute aogonek -30
+KPX yacute aring -30
+KPX yacute atilde -30
+KPX yacute comma -80
+KPX yacute e -10
+KPX yacute eacute -10
+KPX yacute ecaron -10
+KPX yacute ecircumflex -10
+KPX yacute edieresis -10
+KPX yacute edotaccent -10
+KPX yacute egrave -10
+KPX yacute emacron -10
+KPX yacute eogonek -10
+KPX yacute o -25
+KPX yacute oacute -25
+KPX yacute ocircumflex -25
+KPX yacute odieresis -25
+KPX yacute ograve -25
+KPX yacute ohungarumlaut -25
+KPX yacute omacron -25
+KPX yacute oslash -25
+KPX yacute otilde -25
+KPX yacute period -80
+KPX ydieresis a -30
+KPX ydieresis aacute -30
+KPX ydieresis abreve -30
+KPX ydieresis acircumflex -30
+KPX ydieresis adieresis -30
+KPX ydieresis agrave -30
+KPX ydieresis amacron -30
+KPX ydieresis aogonek -30
+KPX ydieresis aring -30
+KPX ydieresis atilde -30
+KPX ydieresis comma -80
+KPX ydieresis e -10
+KPX ydieresis eacute -10
+KPX ydieresis ecaron -10
+KPX ydieresis ecircumflex -10
+KPX ydieresis edieresis -10
+KPX ydieresis edotaccent -10
+KPX ydieresis egrave -10
+KPX ydieresis emacron -10
+KPX ydieresis eogonek -10
+KPX ydieresis o -25
+KPX ydieresis oacute -25
+KPX ydieresis ocircumflex -25
+KPX ydieresis odieresis -25
+KPX ydieresis ograve -25
+KPX ydieresis ohungarumlaut -25
+KPX ydieresis omacron -25
+KPX ydieresis oslash -25
+KPX ydieresis otilde -25
+KPX ydieresis period -80
+KPX z e 10
+KPX z eacute 10
+KPX z ecaron 10
+KPX z ecircumflex 10
+KPX z edieresis 10
+KPX z edotaccent 10
+KPX z egrave 10
+KPX z emacron 10
+KPX z eogonek 10
+KPX zacute e 10
+KPX zacute eacute 10
+KPX zacute ecaron 10
+KPX zacute ecircumflex 10
+KPX zacute edieresis 10
+KPX zacute edotaccent 10
+KPX zacute egrave 10
+KPX zacute emacron 10
+KPX zacute eogonek 10
+KPX zcaron e 10
+KPX zcaron eacute 10
+KPX zcaron ecaron 10
+KPX zcaron ecircumflex 10
+KPX zcaron edieresis 10
+KPX zcaron edotaccent 10
+KPX zcaron egrave 10
+KPX zcaron emacron 10
+KPX zcaron eogonek 10
+KPX zdotaccent e 10
+KPX zdotaccent eacute 10
+KPX zdotaccent ecaron 10
+KPX zdotaccent ecircumflex 10
+KPX zdotaccent edieresis 10
+KPX zdotaccent edotaccent 10
+KPX zdotaccent egrave 10
+KPX zdotaccent emacron 10
+KPX zdotaccent eogonek 10
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/src/fonts/Adobe-Core35_AFMs-314/Helvetica-NarrowBoldOblique.afm b/src/fonts/Adobe-Core35_AFMs-314/Helvetica-NarrowBoldOblique.afm
new file mode 100644
index 0000000..34cb220
--- /dev/null
+++ b/src/fonts/Adobe-Core35_AFMs-314/Helvetica-NarrowBoldOblique.afm
@@ -0,0 +1,2825 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Fri May 2 16:58:06 1997
+Comment UniqueID 43182
+Comment VMusage 14482 68586
+FontName Helvetica-Narrow-BoldOblique
+FullName Helvetica Narrow Bold Oblique
+FamilyName Helvetica
+Weight Bold
+ItalicAngle -12
+IsFixedPitch false
+FontBBox -143 -228 913 962
+UnderlinePosition -100
+UnderlineThickness 50
+Version 002.000
+Notice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries.
+EncodingScheme AdobeStandardEncoding
+CapHeight 718
+XHeight 532
+Ascender 718
+Descender -207
+StdHW 118
+StdVW 140
+StartCharMetrics 314
+C 32 ; WX 228 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 273 ; N exclam ; B 77 0 325 718 ;
+C 34 ; WX 389 ; N quotedbl ; B 158 447 433 718 ;
+C 35 ; WX 456 ; N numbersign ; B 49 0 528 698 ;
+C 36 ; WX 456 ; N dollar ; B 55 -115 510 775 ;
+C 37 ; WX 729 ; N percent ; B 112 -19 739 710 ;
+C 38 ; WX 592 ; N ampersand ; B 73 -19 600 718 ;
+C 39 ; WX 228 ; N quoteright ; B 137 445 297 718 ;
+C 40 ; WX 273 ; N parenleft ; B 62 -208 385 734 ;
+C 41 ; WX 273 ; N parenright ; B -21 -208 302 734 ;
+C 42 ; WX 319 ; N asterisk ; B 120 387 394 718 ;
+C 43 ; WX 479 ; N plus ; B 67 0 500 506 ;
+C 44 ; WX 228 ; N comma ; B 23 -168 201 146 ;
+C 45 ; WX 273 ; N hyphen ; B 60 215 311 345 ;
+C 46 ; WX 228 ; N period ; B 52 0 201 146 ;
+C 47 ; WX 228 ; N slash ; B -30 -19 383 737 ;
+C 48 ; WX 456 ; N zero ; B 71 -19 506 710 ;
+C 49 ; WX 456 ; N one ; B 142 0 434 710 ;
+C 50 ; WX 456 ; N two ; B 21 0 508 710 ;
+C 51 ; WX 456 ; N three ; B 54 -19 499 710 ;
+C 52 ; WX 456 ; N four ; B 50 0 490 710 ;
+C 53 ; WX 456 ; N five ; B 53 -19 522 698 ;
+C 54 ; WX 456 ; N six ; B 70 -19 507 710 ;
+C 55 ; WX 456 ; N seven ; B 103 0 555 698 ;
+C 56 ; WX 456 ; N eight ; B 57 -19 505 710 ;
+C 57 ; WX 456 ; N nine ; B 64 -19 504 710 ;
+C 58 ; WX 273 ; N colon ; B 75 0 288 512 ;
+C 59 ; WX 273 ; N semicolon ; B 46 -168 288 512 ;
+C 60 ; WX 479 ; N less ; B 67 -8 537 514 ;
+C 61 ; WX 479 ; N equal ; B 48 87 519 419 ;
+C 62 ; WX 479 ; N greater ; B 30 -8 500 514 ;
+C 63 ; WX 501 ; N question ; B 135 0 550 727 ;
+C 64 ; WX 800 ; N at ; B 152 -19 782 737 ;
+C 65 ; WX 592 ; N A ; B 16 0 576 718 ;
+C 66 ; WX 592 ; N B ; B 62 0 626 718 ;
+C 67 ; WX 592 ; N C ; B 88 -19 647 737 ;
+C 68 ; WX 592 ; N D ; B 62 0 637 718 ;
+C 69 ; WX 547 ; N E ; B 62 0 620 718 ;
+C 70 ; WX 501 ; N F ; B 62 0 606 718 ;
+C 71 ; WX 638 ; N G ; B 89 -19 670 737 ;
+C 72 ; WX 592 ; N H ; B 58 0 659 718 ;
+C 73 ; WX 228 ; N I ; B 52 0 301 718 ;
+C 74 ; WX 456 ; N J ; B 49 -18 522 718 ;
+C 75 ; WX 592 ; N K ; B 71 0 703 718 ;
+C 76 ; WX 501 ; N L ; B 62 0 501 718 ;
+C 77 ; WX 683 ; N M ; B 57 0 752 718 ;
+C 78 ; WX 592 ; N N ; B 57 0 661 718 ;
+C 79 ; WX 638 ; N O ; B 88 -19 675 737 ;
+C 80 ; WX 547 ; N P ; B 62 0 605 718 ;
+C 81 ; WX 638 ; N Q ; B 88 -52 675 737 ;
+C 82 ; WX 592 ; N R ; B 62 0 638 718 ;
+C 83 ; WX 547 ; N S ; B 66 -19 588 737 ;
+C 84 ; WX 501 ; N T ; B 114 0 616 718 ;
+C 85 ; WX 592 ; N U ; B 96 -19 659 718 ;
+C 86 ; WX 547 ; N V ; B 141 0 657 718 ;
+C 87 ; WX 774 ; N W ; B 138 0 887 718 ;
+C 88 ; WX 547 ; N X ; B 11 0 648 718 ;
+C 89 ; WX 547 ; N Y ; B 137 0 661 718 ;
+C 90 ; WX 501 ; N Z ; B 21 0 604 718 ;
+C 91 ; WX 273 ; N bracketleft ; B 17 -196 379 722 ;
+C 92 ; WX 228 ; N backslash ; B 101 -19 252 737 ;
+C 93 ; WX 273 ; N bracketright ; B -14 -196 347 722 ;
+C 94 ; WX 479 ; N asciicircum ; B 107 323 484 698 ;
+C 95 ; WX 456 ; N underscore ; B -22 -125 443 -75 ;
+C 96 ; WX 228 ; N quoteleft ; B 136 454 296 727 ;
+C 97 ; WX 456 ; N a ; B 45 -14 478 546 ;
+C 98 ; WX 501 ; N b ; B 50 -14 529 718 ;
+C 99 ; WX 456 ; N c ; B 65 -14 491 546 ;
+C 100 ; WX 501 ; N d ; B 67 -14 577 718 ;
+C 101 ; WX 456 ; N e ; B 58 -14 486 546 ;
+C 102 ; WX 273 ; N f ; B 71 0 385 727 ; L i fi ; L l fl ;
+C 103 ; WX 501 ; N g ; B 31 -217 546 546 ;
+C 104 ; WX 501 ; N h ; B 53 0 516 718 ;
+C 105 ; WX 228 ; N i ; B 57 0 298 725 ;
+C 106 ; WX 228 ; N j ; B -35 -214 298 725 ;
+C 107 ; WX 456 ; N k ; B 57 0 549 718 ;
+C 108 ; WX 228 ; N l ; B 57 0 297 718 ;
+C 109 ; WX 729 ; N m ; B 52 0 746 546 ;
+C 110 ; WX 501 ; N n ; B 53 0 516 546 ;
+C 111 ; WX 501 ; N o ; B 67 -14 527 546 ;
+C 112 ; WX 501 ; N p ; B 15 -207 529 546 ;
+C 113 ; WX 501 ; N q ; B 66 -207 545 546 ;
+C 114 ; WX 319 ; N r ; B 52 0 401 546 ;
+C 115 ; WX 456 ; N s ; B 52 -14 479 546 ;
+C 116 ; WX 273 ; N t ; B 82 -6 346 676 ;
+C 117 ; WX 501 ; N u ; B 80 -14 540 532 ;
+C 118 ; WX 456 ; N v ; B 103 0 538 532 ;
+C 119 ; WX 638 ; N w ; B 101 0 723 532 ;
+C 120 ; WX 456 ; N x ; B 12 0 531 532 ;
+C 121 ; WX 456 ; N y ; B 34 -214 535 532 ;
+C 122 ; WX 410 ; N z ; B 16 0 478 532 ;
+C 123 ; WX 319 ; N braceleft ; B 77 -196 425 722 ;
+C 124 ; WX 230 ; N bar ; B 30 -225 296 775 ;
+C 125 ; WX 319 ; N braceright ; B -14 -196 333 722 ;
+C 126 ; WX 479 ; N asciitilde ; B 94 163 473 343 ;
+C 161 ; WX 273 ; N exclamdown ; B 41 -186 290 532 ;
+C 162 ; WX 456 ; N cent ; B 65 -118 491 628 ;
+C 163 ; WX 456 ; N sterling ; B 41 -16 520 718 ;
+C 164 ; WX 137 ; N fraction ; B -143 -19 399 710 ;
+C 165 ; WX 456 ; N yen ; B 49 0 585 698 ;
+C 166 ; WX 456 ; N florin ; B -41 -210 548 737 ;
+C 167 ; WX 456 ; N section ; B 50 -184 491 727 ;
+C 168 ; WX 456 ; N currency ; B 22 76 558 636 ;
+C 169 ; WX 195 ; N quotesingle ; B 135 447 263 718 ;
+C 170 ; WX 410 ; N quotedblleft ; B 132 454 482 727 ;
+C 171 ; WX 456 ; N guillemotleft ; B 111 76 468 484 ;
+C 172 ; WX 273 ; N guilsinglleft ; B 106 76 289 484 ;
+C 173 ; WX 273 ; N guilsinglright ; B 81 76 264 484 ;
+C 174 ; WX 501 ; N fi ; B 71 0 571 727 ;
+C 175 ; WX 501 ; N fl ; B 71 0 570 727 ;
+C 177 ; WX 456 ; N endash ; B 40 227 514 333 ;
+C 178 ; WX 456 ; N dagger ; B 97 -171 513 718 ;
+C 179 ; WX 456 ; N daggerdbl ; B 38 -171 515 718 ;
+C 180 ; WX 228 ; N periodcentered ; B 90 172 226 334 ;
+C 182 ; WX 456 ; N paragraph ; B 80 -191 564 700 ;
+C 183 ; WX 287 ; N bullet ; B 68 194 345 524 ;
+C 184 ; WX 228 ; N quotesinglbase ; B 34 -146 194 127 ;
+C 185 ; WX 410 ; N quotedblbase ; B 29 -146 380 127 ;
+C 186 ; WX 410 ; N quotedblright ; B 133 445 483 718 ;
+C 187 ; WX 456 ; N guillemotright ; B 85 76 443 484 ;
+C 188 ; WX 820 ; N ellipsis ; B 75 0 770 146 ;
+C 189 ; WX 820 ; N perthousand ; B 62 -19 851 710 ;
+C 191 ; WX 501 ; N questiondown ; B 44 -195 459 532 ;
+C 193 ; WX 273 ; N grave ; B 112 604 290 750 ;
+C 194 ; WX 273 ; N acute ; B 194 604 423 750 ;
+C 195 ; WX 273 ; N circumflex ; B 97 604 387 750 ;
+C 196 ; WX 273 ; N tilde ; B 92 610 415 737 ;
+C 197 ; WX 273 ; N macron ; B 100 604 396 678 ;
+C 198 ; WX 273 ; N breve ; B 128 604 405 750 ;
+C 199 ; WX 273 ; N dotaccent ; B 192 614 316 729 ;
+C 200 ; WX 273 ; N dieresis ; B 112 614 395 729 ;
+C 202 ; WX 273 ; N ring ; B 164 568 344 776 ;
+C 203 ; WX 273 ; N cedilla ; B -30 -228 180 0 ;
+C 205 ; WX 273 ; N hungarumlaut ; B 113 604 529 750 ;
+C 206 ; WX 273 ; N ogonek ; B 33 -228 216 0 ;
+C 207 ; WX 273 ; N caron ; B 123 604 412 750 ;
+C 208 ; WX 820 ; N emdash ; B 40 227 878 333 ;
+C 225 ; WX 820 ; N AE ; B 4 0 902 718 ;
+C 227 ; WX 303 ; N ordfeminine ; B 102 401 381 737 ;
+C 232 ; WX 501 ; N Lslash ; B 28 0 501 718 ;
+C 233 ; WX 638 ; N Oslash ; B 29 -27 733 745 ;
+C 234 ; WX 820 ; N OE ; B 81 -19 913 737 ;
+C 235 ; WX 299 ; N ordmasculine ; B 101 401 398 737 ;
+C 241 ; WX 729 ; N ae ; B 46 -14 757 546 ;
+C 245 ; WX 228 ; N dotlessi ; B 57 0 264 532 ;
+C 248 ; WX 228 ; N lslash ; B 33 0 334 718 ;
+C 249 ; WX 501 ; N oslash ; B 18 -29 575 560 ;
+C 250 ; WX 774 ; N oe ; B 67 -14 801 546 ;
+C 251 ; WX 501 ; N germandbls ; B 57 -14 539 731 ;
+C -1 ; WX 228 ; N Idieresis ; B 52 0 405 915 ;
+C -1 ; WX 456 ; N eacute ; B 58 -14 514 750 ;
+C -1 ; WX 456 ; N abreve ; B 45 -14 497 750 ;
+C -1 ; WX 501 ; N uhungarumlaut ; B 80 -14 643 750 ;
+C -1 ; WX 456 ; N ecaron ; B 58 -14 504 750 ;
+C -1 ; WX 547 ; N Ydieresis ; B 137 0 661 915 ;
+C -1 ; WX 479 ; N divide ; B 67 -42 500 548 ;
+C -1 ; WX 547 ; N Yacute ; B 137 0 661 936 ;
+C -1 ; WX 592 ; N Acircumflex ; B 16 0 579 936 ;
+C -1 ; WX 456 ; N aacute ; B 45 -14 514 750 ;
+C -1 ; WX 592 ; N Ucircumflex ; B 96 -19 659 936 ;
+C -1 ; WX 456 ; N yacute ; B 34 -214 535 750 ;
+C -1 ; WX 456 ; N scommaaccent ; B 52 -228 479 546 ;
+C -1 ; WX 456 ; N ecircumflex ; B 58 -14 486 750 ;
+C -1 ; WX 592 ; N Uring ; B 96 -19 659 962 ;
+C -1 ; WX 592 ; N Udieresis ; B 96 -19 659 915 ;
+C -1 ; WX 456 ; N aogonek ; B 45 -224 478 546 ;
+C -1 ; WX 592 ; N Uacute ; B 96 -19 659 936 ;
+C -1 ; WX 501 ; N uogonek ; B 80 -228 540 532 ;
+C -1 ; WX 547 ; N Edieresis ; B 62 0 620 915 ;
+C -1 ; WX 592 ; N Dcroat ; B 51 0 637 718 ;
+C -1 ; WX 205 ; N commaaccent ; B 13 -228 154 -50 ;
+C -1 ; WX 604 ; N copyright ; B 46 -19 685 737 ;
+C -1 ; WX 547 ; N Emacron ; B 62 0 620 864 ;
+C -1 ; WX 456 ; N ccaron ; B 65 -14 504 750 ;
+C -1 ; WX 456 ; N aring ; B 45 -14 478 776 ;
+C -1 ; WX 592 ; N Ncommaaccent ; B 57 -228 661 718 ;
+C -1 ; WX 228 ; N lacute ; B 57 0 433 936 ;
+C -1 ; WX 456 ; N agrave ; B 45 -14 478 750 ;
+C -1 ; WX 501 ; N Tcommaaccent ; B 114 -228 616 718 ;
+C -1 ; WX 592 ; N Cacute ; B 88 -19 647 936 ;
+C -1 ; WX 456 ; N atilde ; B 45 -14 507 737 ;
+C -1 ; WX 547 ; N Edotaccent ; B 62 0 620 915 ;
+C -1 ; WX 456 ; N scaron ; B 52 -14 504 750 ;
+C -1 ; WX 456 ; N scedilla ; B 52 -228 479 546 ;
+C -1 ; WX 228 ; N iacute ; B 57 0 401 750 ;
+C -1 ; WX 405 ; N lozenge ; B 74 0 463 745 ;
+C -1 ; WX 592 ; N Rcaron ; B 62 0 638 936 ;
+C -1 ; WX 638 ; N Gcommaaccent ; B 89 -228 670 737 ;
+C -1 ; WX 501 ; N ucircumflex ; B 80 -14 540 750 ;
+C -1 ; WX 456 ; N acircumflex ; B 45 -14 478 750 ;
+C -1 ; WX 592 ; N Amacron ; B 16 0 588 864 ;
+C -1 ; WX 319 ; N rcaron ; B 52 0 435 750 ;
+C -1 ; WX 456 ; N ccedilla ; B 65 -228 491 546 ;
+C -1 ; WX 501 ; N Zdotaccent ; B 21 0 604 915 ;
+C -1 ; WX 547 ; N Thorn ; B 62 0 588 718 ;
+C -1 ; WX 638 ; N Omacron ; B 88 -19 675 864 ;
+C -1 ; WX 592 ; N Racute ; B 62 0 638 936 ;
+C -1 ; WX 547 ; N Sacute ; B 66 -19 592 936 ;
+C -1 ; WX 609 ; N dcaron ; B 67 -14 740 718 ;
+C -1 ; WX 592 ; N Umacron ; B 96 -19 659 864 ;
+C -1 ; WX 501 ; N uring ; B 80 -14 540 776 ;
+C -1 ; WX 273 ; N threesuperior ; B 75 271 361 710 ;
+C -1 ; WX 638 ; N Ograve ; B 88 -19 675 936 ;
+C -1 ; WX 592 ; N Agrave ; B 16 0 576 936 ;
+C -1 ; WX 592 ; N Abreve ; B 16 0 598 936 ;
+C -1 ; WX 479 ; N multiply ; B 47 1 520 505 ;
+C -1 ; WX 501 ; N uacute ; B 80 -14 540 750 ;
+C -1 ; WX 501 ; N Tcaron ; B 114 0 616 936 ;
+C -1 ; WX 405 ; N partialdiff ; B 35 -21 480 750 ;
+C -1 ; WX 456 ; N ydieresis ; B 34 -214 535 729 ;
+C -1 ; WX 592 ; N Nacute ; B 57 0 661 936 ;
+C -1 ; WX 228 ; N icircumflex ; B 57 0 364 750 ;
+C -1 ; WX 547 ; N Ecircumflex ; B 62 0 620 936 ;
+C -1 ; WX 456 ; N adieresis ; B 45 -14 487 729 ;
+C -1 ; WX 456 ; N edieresis ; B 58 -14 487 729 ;
+C -1 ; WX 456 ; N cacute ; B 65 -14 514 750 ;
+C -1 ; WX 501 ; N nacute ; B 53 0 537 750 ;
+C -1 ; WX 501 ; N umacron ; B 80 -14 540 678 ;
+C -1 ; WX 592 ; N Ncaron ; B 57 0 661 936 ;
+C -1 ; WX 228 ; N Iacute ; B 52 0 433 936 ;
+C -1 ; WX 479 ; N plusminus ; B 33 0 512 506 ;
+C -1 ; WX 230 ; N brokenbar ; B 43 -150 283 700 ;
+C -1 ; WX 604 ; N registered ; B 45 -19 684 737 ;
+C -1 ; WX 638 ; N Gbreve ; B 89 -19 670 936 ;
+C -1 ; WX 228 ; N Idotaccent ; B 52 0 326 915 ;
+C -1 ; WX 492 ; N summation ; B 11 -10 549 706 ;
+C -1 ; WX 547 ; N Egrave ; B 62 0 620 936 ;
+C -1 ; WX 319 ; N racute ; B 52 0 446 750 ;
+C -1 ; WX 501 ; N omacron ; B 67 -14 527 678 ;
+C -1 ; WX 501 ; N Zacute ; B 21 0 604 936 ;
+C -1 ; WX 501 ; N Zcaron ; B 21 0 604 936 ;
+C -1 ; WX 450 ; N greaterequal ; B 21 0 516 704 ;
+C -1 ; WX 592 ; N Eth ; B 51 0 637 718 ;
+C -1 ; WX 592 ; N Ccedilla ; B 88 -228 647 737 ;
+C -1 ; WX 228 ; N lcommaaccent ; B 24 -228 297 718 ;
+C -1 ; WX 319 ; N tcaron ; B 82 -6 498 878 ;
+C -1 ; WX 456 ; N eogonek ; B 58 -228 486 546 ;
+C -1 ; WX 592 ; N Uogonek ; B 96 -228 659 718 ;
+C -1 ; WX 592 ; N Aacute ; B 16 0 615 936 ;
+C -1 ; WX 592 ; N Adieresis ; B 16 0 588 915 ;
+C -1 ; WX 456 ; N egrave ; B 58 -14 486 750 ;
+C -1 ; WX 410 ; N zacute ; B 16 0 492 750 ;
+C -1 ; WX 228 ; N iogonek ; B -11 -224 298 725 ;
+C -1 ; WX 638 ; N Oacute ; B 88 -19 675 936 ;
+C -1 ; WX 501 ; N oacute ; B 67 -14 537 750 ;
+C -1 ; WX 456 ; N amacron ; B 45 -14 488 678 ;
+C -1 ; WX 456 ; N sacute ; B 52 -14 514 750 ;
+C -1 ; WX 228 ; N idieresis ; B 57 0 373 729 ;
+C -1 ; WX 638 ; N Ocircumflex ; B 88 -19 675 936 ;
+C -1 ; WX 592 ; N Ugrave ; B 96 -19 659 936 ;
+C -1 ; WX 502 ; N Delta ; B 5 0 499 688 ;
+C -1 ; WX 501 ; N thorn ; B 15 -208 529 718 ;
+C -1 ; WX 273 ; N twosuperior ; B 57 283 368 710 ;
+C -1 ; WX 638 ; N Odieresis ; B 88 -19 675 915 ;
+C -1 ; WX 501 ; N mu ; B 18 -207 540 532 ;
+C -1 ; WX 228 ; N igrave ; B 57 0 268 750 ;
+C -1 ; WX 501 ; N ohungarumlaut ; B 67 -14 643 750 ;
+C -1 ; WX 547 ; N Eogonek ; B 62 -224 620 718 ;
+C -1 ; WX 501 ; N dcroat ; B 67 -14 647 718 ;
+C -1 ; WX 684 ; N threequarters ; B 82 -19 688 710 ;
+C -1 ; WX 547 ; N Scedilla ; B 66 -228 588 737 ;
+C -1 ; WX 328 ; N lcaron ; B 57 0 460 718 ;
+C -1 ; WX 592 ; N Kcommaaccent ; B 71 -228 703 718 ;
+C -1 ; WX 501 ; N Lacute ; B 62 0 501 936 ;
+C -1 ; WX 820 ; N trademark ; B 146 306 909 718 ;
+C -1 ; WX 456 ; N edotaccent ; B 58 -14 486 729 ;
+C -1 ; WX 228 ; N Igrave ; B 52 0 301 936 ;
+C -1 ; WX 228 ; N Imacron ; B 52 0 406 864 ;
+C -1 ; WX 501 ; N Lcaron ; B 62 0 527 718 ;
+C -1 ; WX 684 ; N onehalf ; B 108 -19 704 710 ;
+C -1 ; WX 450 ; N lessequal ; B 24 0 554 704 ;
+C -1 ; WX 501 ; N ocircumflex ; B 67 -14 527 750 ;
+C -1 ; WX 501 ; N ntilde ; B 53 0 529 737 ;
+C -1 ; WX 592 ; N Uhungarumlaut ; B 96 -19 722 936 ;
+C -1 ; WX 547 ; N Eacute ; B 62 0 620 936 ;
+C -1 ; WX 456 ; N emacron ; B 58 -14 488 678 ;
+C -1 ; WX 501 ; N gbreve ; B 31 -217 546 750 ;
+C -1 ; WX 684 ; N onequarter ; B 108 -19 661 710 ;
+C -1 ; WX 547 ; N Scaron ; B 66 -19 588 936 ;
+C -1 ; WX 547 ; N Scommaaccent ; B 66 -228 588 737 ;
+C -1 ; WX 638 ; N Ohungarumlaut ; B 88 -19 745 936 ;
+C -1 ; WX 328 ; N degree ; B 143 426 383 712 ;
+C -1 ; WX 501 ; N ograve ; B 67 -14 527 750 ;
+C -1 ; WX 592 ; N Ccaron ; B 88 -19 647 936 ;
+C -1 ; WX 501 ; N ugrave ; B 80 -14 540 750 ;
+C -1 ; WX 450 ; N radical ; B 92 -46 565 850 ;
+C -1 ; WX 592 ; N Dcaron ; B 62 0 637 936 ;
+C -1 ; WX 319 ; N rcommaaccent ; B 21 -228 401 546 ;
+C -1 ; WX 592 ; N Ntilde ; B 57 0 661 923 ;
+C -1 ; WX 501 ; N otilde ; B 67 -14 529 737 ;
+C -1 ; WX 592 ; N Rcommaaccent ; B 62 -228 638 718 ;
+C -1 ; WX 501 ; N Lcommaaccent ; B 62 -228 501 718 ;
+C -1 ; WX 592 ; N Atilde ; B 16 0 608 923 ;
+C -1 ; WX 592 ; N Aogonek ; B 16 -224 576 718 ;
+C -1 ; WX 592 ; N Aring ; B 16 0 576 962 ;
+C -1 ; WX 638 ; N Otilde ; B 88 -19 675 923 ;
+C -1 ; WX 410 ; N zdotaccent ; B 16 0 478 729 ;
+C -1 ; WX 547 ; N Ecaron ; B 62 0 620 936 ;
+C -1 ; WX 228 ; N Iogonek ; B -34 -228 301 718 ;
+C -1 ; WX 456 ; N kcommaaccent ; B 57 -228 549 718 ;
+C -1 ; WX 479 ; N minus ; B 67 197 500 309 ;
+C -1 ; WX 228 ; N Icircumflex ; B 52 0 397 936 ;
+C -1 ; WX 501 ; N ncaron ; B 53 0 526 750 ;
+C -1 ; WX 273 ; N tcommaaccent ; B 47 -228 346 676 ;
+C -1 ; WX 479 ; N logicalnot ; B 86 108 519 419 ;
+C -1 ; WX 501 ; N odieresis ; B 67 -14 527 729 ;
+C -1 ; WX 501 ; N udieresis ; B 80 -14 540 729 ;
+C -1 ; WX 450 ; N notequal ; B 26 -49 517 570 ;
+C -1 ; WX 501 ; N gcommaaccent ; B 31 -217 546 850 ;
+C -1 ; WX 501 ; N eth ; B 67 -14 549 737 ;
+C -1 ; WX 410 ; N zcaron ; B 16 0 481 750 ;
+C -1 ; WX 501 ; N ncommaaccent ; B 53 -228 516 546 ;
+C -1 ; WX 273 ; N onesuperior ; B 121 283 318 710 ;
+C -1 ; WX 228 ; N imacron ; B 57 0 352 678 ;
+EndCharMetrics
+StartKernData
+StartKernPairs 2481
+KPX A C -40
+KPX A Cacute -40
+KPX A Ccaron -40
+KPX A Ccedilla -40
+KPX A G -50
+KPX A Gbreve -50
+KPX A Gcommaaccent -50
+KPX A O -40
+KPX A Oacute -40
+KPX A Ocircumflex -40
+KPX A Odieresis -40
+KPX A Ograve -40
+KPX A Ohungarumlaut -40
+KPX A Omacron -40
+KPX A Oslash -40
+KPX A Otilde -40
+KPX A Q -40
+KPX A T -90
+KPX A Tcaron -90
+KPX A Tcommaaccent -90
+KPX A U -50
+KPX A Uacute -50
+KPX A Ucircumflex -50
+KPX A Udieresis -50
+KPX A Ugrave -50
+KPX A Uhungarumlaut -50
+KPX A Umacron -50
+KPX A Uogonek -50
+KPX A Uring -50
+KPX A V -80
+KPX A W -60
+KPX A Y -110
+KPX A Yacute -110
+KPX A Ydieresis -110
+KPX A u -30
+KPX A uacute -30
+KPX A ucircumflex -30
+KPX A udieresis -30
+KPX A ugrave -30
+KPX A uhungarumlaut -30
+KPX A umacron -30
+KPX A uogonek -30
+KPX A uring -30
+KPX A v -40
+KPX A w -30
+KPX A y -30
+KPX A yacute -30
+KPX A ydieresis -30
+KPX Aacute C -40
+KPX Aacute Cacute -40
+KPX Aacute Ccaron -40
+KPX Aacute Ccedilla -40
+KPX Aacute G -50
+KPX Aacute Gbreve -50
+KPX Aacute Gcommaaccent -50
+KPX Aacute O -40
+KPX Aacute Oacute -40
+KPX Aacute Ocircumflex -40
+KPX Aacute Odieresis -40
+KPX Aacute Ograve -40
+KPX Aacute Ohungarumlaut -40
+KPX Aacute Omacron -40
+KPX Aacute Oslash -40
+KPX Aacute Otilde -40
+KPX Aacute Q -40
+KPX Aacute T -90
+KPX Aacute Tcaron -90
+KPX Aacute Tcommaaccent -90
+KPX Aacute U -50
+KPX Aacute Uacute -50
+KPX Aacute Ucircumflex -50
+KPX Aacute Udieresis -50
+KPX Aacute Ugrave -50
+KPX Aacute Uhungarumlaut -50
+KPX Aacute Umacron -50
+KPX Aacute Uogonek -50
+KPX Aacute Uring -50
+KPX Aacute V -80
+KPX Aacute W -60
+KPX Aacute Y -110
+KPX Aacute Yacute -110
+KPX Aacute Ydieresis -110
+KPX Aacute u -30
+KPX Aacute uacute -30
+KPX Aacute ucircumflex -30
+KPX Aacute udieresis -30
+KPX Aacute ugrave -30
+KPX Aacute uhungarumlaut -30
+KPX Aacute umacron -30
+KPX Aacute uogonek -30
+KPX Aacute uring -30
+KPX Aacute v -40
+KPX Aacute w -30
+KPX Aacute y -30
+KPX Aacute yacute -30
+KPX Aacute ydieresis -30
+KPX Abreve C -40
+KPX Abreve Cacute -40
+KPX Abreve Ccaron -40
+KPX Abreve Ccedilla -40
+KPX Abreve G -50
+KPX Abreve Gbreve -50
+KPX Abreve Gcommaaccent -50
+KPX Abreve O -40
+KPX Abreve Oacute -40
+KPX Abreve Ocircumflex -40
+KPX Abreve Odieresis -40
+KPX Abreve Ograve -40
+KPX Abreve Ohungarumlaut -40
+KPX Abreve Omacron -40
+KPX Abreve Oslash -40
+KPX Abreve Otilde -40
+KPX Abreve Q -40
+KPX Abreve T -90
+KPX Abreve Tcaron -90
+KPX Abreve Tcommaaccent -90
+KPX Abreve U -50
+KPX Abreve Uacute -50
+KPX Abreve Ucircumflex -50
+KPX Abreve Udieresis -50
+KPX Abreve Ugrave -50
+KPX Abreve Uhungarumlaut -50
+KPX Abreve Umacron -50
+KPX Abreve Uogonek -50
+KPX Abreve Uring -50
+KPX Abreve V -80
+KPX Abreve W -60
+KPX Abreve Y -110
+KPX Abreve Yacute -110
+KPX Abreve Ydieresis -110
+KPX Abreve u -30
+KPX Abreve uacute -30
+KPX Abreve ucircumflex -30
+KPX Abreve udieresis -30
+KPX Abreve ugrave -30
+KPX Abreve uhungarumlaut -30
+KPX Abreve umacron -30
+KPX Abreve uogonek -30
+KPX Abreve uring -30
+KPX Abreve v -40
+KPX Abreve w -30
+KPX Abreve y -30
+KPX Abreve yacute -30
+KPX Abreve ydieresis -30
+KPX Acircumflex C -40
+KPX Acircumflex Cacute -40
+KPX Acircumflex Ccaron -40
+KPX Acircumflex Ccedilla -40
+KPX Acircumflex G -50
+KPX Acircumflex Gbreve -50
+KPX Acircumflex Gcommaaccent -50
+KPX Acircumflex O -40
+KPX Acircumflex Oacute -40
+KPX Acircumflex Ocircumflex -40
+KPX Acircumflex Odieresis -40
+KPX Acircumflex Ograve -40
+KPX Acircumflex Ohungarumlaut -40
+KPX Acircumflex Omacron -40
+KPX Acircumflex Oslash -40
+KPX Acircumflex Otilde -40
+KPX Acircumflex Q -40
+KPX Acircumflex T -90
+KPX Acircumflex Tcaron -90
+KPX Acircumflex Tcommaaccent -90
+KPX Acircumflex U -50
+KPX Acircumflex Uacute -50
+KPX Acircumflex Ucircumflex -50
+KPX Acircumflex Udieresis -50
+KPX Acircumflex Ugrave -50
+KPX Acircumflex Uhungarumlaut -50
+KPX Acircumflex Umacron -50
+KPX Acircumflex Uogonek -50
+KPX Acircumflex Uring -50
+KPX Acircumflex V -80
+KPX Acircumflex W -60
+KPX Acircumflex Y -110
+KPX Acircumflex Yacute -110
+KPX Acircumflex Ydieresis -110
+KPX Acircumflex u -30
+KPX Acircumflex uacute -30
+KPX Acircumflex ucircumflex -30
+KPX Acircumflex udieresis -30
+KPX Acircumflex ugrave -30
+KPX Acircumflex uhungarumlaut -30
+KPX Acircumflex umacron -30
+KPX Acircumflex uogonek -30
+KPX Acircumflex uring -30
+KPX Acircumflex v -40
+KPX Acircumflex w -30
+KPX Acircumflex y -30
+KPX Acircumflex yacute -30
+KPX Acircumflex ydieresis -30
+KPX Adieresis C -40
+KPX Adieresis Cacute -40
+KPX Adieresis Ccaron -40
+KPX Adieresis Ccedilla -40
+KPX Adieresis G -50
+KPX Adieresis Gbreve -50
+KPX Adieresis Gcommaaccent -50
+KPX Adieresis O -40
+KPX Adieresis Oacute -40
+KPX Adieresis Ocircumflex -40
+KPX Adieresis Odieresis -40
+KPX Adieresis Ograve -40
+KPX Adieresis Ohungarumlaut -40
+KPX Adieresis Omacron -40
+KPX Adieresis Oslash -40
+KPX Adieresis Otilde -40
+KPX Adieresis Q -40
+KPX Adieresis T -90
+KPX Adieresis Tcaron -90
+KPX Adieresis Tcommaaccent -90
+KPX Adieresis U -50
+KPX Adieresis Uacute -50
+KPX Adieresis Ucircumflex -50
+KPX Adieresis Udieresis -50
+KPX Adieresis Ugrave -50
+KPX Adieresis Uhungarumlaut -50
+KPX Adieresis Umacron -50
+KPX Adieresis Uogonek -50
+KPX Adieresis Uring -50
+KPX Adieresis V -80
+KPX Adieresis W -60
+KPX Adieresis Y -110
+KPX Adieresis Yacute -110
+KPX Adieresis Ydieresis -110
+KPX Adieresis u -30
+KPX Adieresis uacute -30
+KPX Adieresis ucircumflex -30
+KPX Adieresis udieresis -30
+KPX Adieresis ugrave -30
+KPX Adieresis uhungarumlaut -30
+KPX Adieresis umacron -30
+KPX Adieresis uogonek -30
+KPX Adieresis uring -30
+KPX Adieresis v -40
+KPX Adieresis w -30
+KPX Adieresis y -30
+KPX Adieresis yacute -30
+KPX Adieresis ydieresis -30
+KPX Agrave C -40
+KPX Agrave Cacute -40
+KPX Agrave Ccaron -40
+KPX Agrave Ccedilla -40
+KPX Agrave G -50
+KPX Agrave Gbreve -50
+KPX Agrave Gcommaaccent -50
+KPX Agrave O -40
+KPX Agrave Oacute -40
+KPX Agrave Ocircumflex -40
+KPX Agrave Odieresis -40
+KPX Agrave Ograve -40
+KPX Agrave Ohungarumlaut -40
+KPX Agrave Omacron -40
+KPX Agrave Oslash -40
+KPX Agrave Otilde -40
+KPX Agrave Q -40
+KPX Agrave T -90
+KPX Agrave Tcaron -90
+KPX Agrave Tcommaaccent -90
+KPX Agrave U -50
+KPX Agrave Uacute -50
+KPX Agrave Ucircumflex -50
+KPX Agrave Udieresis -50
+KPX Agrave Ugrave -50
+KPX Agrave Uhungarumlaut -50
+KPX Agrave Umacron -50
+KPX Agrave Uogonek -50
+KPX Agrave Uring -50
+KPX Agrave V -80
+KPX Agrave W -60
+KPX Agrave Y -110
+KPX Agrave Yacute -110
+KPX Agrave Ydieresis -110
+KPX Agrave u -30
+KPX Agrave uacute -30
+KPX Agrave ucircumflex -30
+KPX Agrave udieresis -30
+KPX Agrave ugrave -30
+KPX Agrave uhungarumlaut -30
+KPX Agrave umacron -30
+KPX Agrave uogonek -30
+KPX Agrave uring -30
+KPX Agrave v -40
+KPX Agrave w -30
+KPX Agrave y -30
+KPX Agrave yacute -30
+KPX Agrave ydieresis -30
+KPX Amacron C -40
+KPX Amacron Cacute -40
+KPX Amacron Ccaron -40
+KPX Amacron Ccedilla -40
+KPX Amacron G -50
+KPX Amacron Gbreve -50
+KPX Amacron Gcommaaccent -50
+KPX Amacron O -40
+KPX Amacron Oacute -40
+KPX Amacron Ocircumflex -40
+KPX Amacron Odieresis -40
+KPX Amacron Ograve -40
+KPX Amacron Ohungarumlaut -40
+KPX Amacron Omacron -40
+KPX Amacron Oslash -40
+KPX Amacron Otilde -40
+KPX Amacron Q -40
+KPX Amacron T -90
+KPX Amacron Tcaron -90
+KPX Amacron Tcommaaccent -90
+KPX Amacron U -50
+KPX Amacron Uacute -50
+KPX Amacron Ucircumflex -50
+KPX Amacron Udieresis -50
+KPX Amacron Ugrave -50
+KPX Amacron Uhungarumlaut -50
+KPX Amacron Umacron -50
+KPX Amacron Uogonek -50
+KPX Amacron Uring -50
+KPX Amacron V -80
+KPX Amacron W -60
+KPX Amacron Y -110
+KPX Amacron Yacute -110
+KPX Amacron Ydieresis -110
+KPX Amacron u -30
+KPX Amacron uacute -30
+KPX Amacron ucircumflex -30
+KPX Amacron udieresis -30
+KPX Amacron ugrave -30
+KPX Amacron uhungarumlaut -30
+KPX Amacron umacron -30
+KPX Amacron uogonek -30
+KPX Amacron uring -30
+KPX Amacron v -40
+KPX Amacron w -30
+KPX Amacron y -30
+KPX Amacron yacute -30
+KPX Amacron ydieresis -30
+KPX Aogonek C -40
+KPX Aogonek Cacute -40
+KPX Aogonek Ccaron -40
+KPX Aogonek Ccedilla -40
+KPX Aogonek G -50
+KPX Aogonek Gbreve -50
+KPX Aogonek Gcommaaccent -50
+KPX Aogonek O -40
+KPX Aogonek Oacute -40
+KPX Aogonek Ocircumflex -40
+KPX Aogonek Odieresis -40
+KPX Aogonek Ograve -40
+KPX Aogonek Ohungarumlaut -40
+KPX Aogonek Omacron -40
+KPX Aogonek Oslash -40
+KPX Aogonek Otilde -40
+KPX Aogonek Q -40
+KPX Aogonek T -90
+KPX Aogonek Tcaron -90
+KPX Aogonek Tcommaaccent -90
+KPX Aogonek U -50
+KPX Aogonek Uacute -50
+KPX Aogonek Ucircumflex -50
+KPX Aogonek Udieresis -50
+KPX Aogonek Ugrave -50
+KPX Aogonek Uhungarumlaut -50
+KPX Aogonek Umacron -50
+KPX Aogonek Uogonek -50
+KPX Aogonek Uring -50
+KPX Aogonek V -80
+KPX Aogonek W -60
+KPX Aogonek Y -110
+KPX Aogonek Yacute -110
+KPX Aogonek Ydieresis -110
+KPX Aogonek u -30
+KPX Aogonek uacute -30
+KPX Aogonek ucircumflex -30
+KPX Aogonek udieresis -30
+KPX Aogonek ugrave -30
+KPX Aogonek uhungarumlaut -30
+KPX Aogonek umacron -30
+KPX Aogonek uogonek -30
+KPX Aogonek uring -30
+KPX Aogonek v -40
+KPX Aogonek w -30
+KPX Aogonek y -30
+KPX Aogonek yacute -30
+KPX Aogonek ydieresis -30
+KPX Aring C -40
+KPX Aring Cacute -40
+KPX Aring Ccaron -40
+KPX Aring Ccedilla -40
+KPX Aring G -50
+KPX Aring Gbreve -50
+KPX Aring Gcommaaccent -50
+KPX Aring O -40
+KPX Aring Oacute -40
+KPX Aring Ocircumflex -40
+KPX Aring Odieresis -40
+KPX Aring Ograve -40
+KPX Aring Ohungarumlaut -40
+KPX Aring Omacron -40
+KPX Aring Oslash -40
+KPX Aring Otilde -40
+KPX Aring Q -40
+KPX Aring T -90
+KPX Aring Tcaron -90
+KPX Aring Tcommaaccent -90
+KPX Aring U -50
+KPX Aring Uacute -50
+KPX Aring Ucircumflex -50
+KPX Aring Udieresis -50
+KPX Aring Ugrave -50
+KPX Aring Uhungarumlaut -50
+KPX Aring Umacron -50
+KPX Aring Uogonek -50
+KPX Aring Uring -50
+KPX Aring V -80
+KPX Aring W -60
+KPX Aring Y -110
+KPX Aring Yacute -110
+KPX Aring Ydieresis -110
+KPX Aring u -30
+KPX Aring uacute -30
+KPX Aring ucircumflex -30
+KPX Aring udieresis -30
+KPX Aring ugrave -30
+KPX Aring uhungarumlaut -30
+KPX Aring umacron -30
+KPX Aring uogonek -30
+KPX Aring uring -30
+KPX Aring v -40
+KPX Aring w -30
+KPX Aring y -30
+KPX Aring yacute -30
+KPX Aring ydieresis -30
+KPX Atilde C -40
+KPX Atilde Cacute -40
+KPX Atilde Ccaron -40
+KPX Atilde Ccedilla -40
+KPX Atilde G -50
+KPX Atilde Gbreve -50
+KPX Atilde Gcommaaccent -50
+KPX Atilde O -40
+KPX Atilde Oacute -40
+KPX Atilde Ocircumflex -40
+KPX Atilde Odieresis -40
+KPX Atilde Ograve -40
+KPX Atilde Ohungarumlaut -40
+KPX Atilde Omacron -40
+KPX Atilde Oslash -40
+KPX Atilde Otilde -40
+KPX Atilde Q -40
+KPX Atilde T -90
+KPX Atilde Tcaron -90
+KPX Atilde Tcommaaccent -90
+KPX Atilde U -50
+KPX Atilde Uacute -50
+KPX Atilde Ucircumflex -50
+KPX Atilde Udieresis -50
+KPX Atilde Ugrave -50
+KPX Atilde Uhungarumlaut -50
+KPX Atilde Umacron -50
+KPX Atilde Uogonek -50
+KPX Atilde Uring -50
+KPX Atilde V -80
+KPX Atilde W -60
+KPX Atilde Y -110
+KPX Atilde Yacute -110
+KPX Atilde Ydieresis -110
+KPX Atilde u -30
+KPX Atilde uacute -30
+KPX Atilde ucircumflex -30
+KPX Atilde udieresis -30
+KPX Atilde ugrave -30
+KPX Atilde uhungarumlaut -30
+KPX Atilde umacron -30
+KPX Atilde uogonek -30
+KPX Atilde uring -30
+KPX Atilde v -40
+KPX Atilde w -30
+KPX Atilde y -30
+KPX Atilde yacute -30
+KPX Atilde ydieresis -30
+KPX B A -30
+KPX B Aacute -30
+KPX B Abreve -30
+KPX B Acircumflex -30
+KPX B Adieresis -30
+KPX B Agrave -30
+KPX B Amacron -30
+KPX B Aogonek -30
+KPX B Aring -30
+KPX B Atilde -30
+KPX B U -10
+KPX B Uacute -10
+KPX B Ucircumflex -10
+KPX B Udieresis -10
+KPX B Ugrave -10
+KPX B Uhungarumlaut -10
+KPX B Umacron -10
+KPX B Uogonek -10
+KPX B Uring -10
+KPX D A -40
+KPX D Aacute -40
+KPX D Abreve -40
+KPX D Acircumflex -40
+KPX D Adieresis -40
+KPX D Agrave -40
+KPX D Amacron -40
+KPX D Aogonek -40
+KPX D Aring -40
+KPX D Atilde -40
+KPX D V -40
+KPX D W -40
+KPX D Y -70
+KPX D Yacute -70
+KPX D Ydieresis -70
+KPX D comma -30
+KPX D period -30
+KPX Dcaron A -40
+KPX Dcaron Aacute -40
+KPX Dcaron Abreve -40
+KPX Dcaron Acircumflex -40
+KPX Dcaron Adieresis -40
+KPX Dcaron Agrave -40
+KPX Dcaron Amacron -40
+KPX Dcaron Aogonek -40
+KPX Dcaron Aring -40
+KPX Dcaron Atilde -40
+KPX Dcaron V -40
+KPX Dcaron W -40
+KPX Dcaron Y -70
+KPX Dcaron Yacute -70
+KPX Dcaron Ydieresis -70
+KPX Dcaron comma -30
+KPX Dcaron period -30
+KPX Dcroat A -40
+KPX Dcroat Aacute -40
+KPX Dcroat Abreve -40
+KPX Dcroat Acircumflex -40
+KPX Dcroat Adieresis -40
+KPX Dcroat Agrave -40
+KPX Dcroat Amacron -40
+KPX Dcroat Aogonek -40
+KPX Dcroat Aring -40
+KPX Dcroat Atilde -40
+KPX Dcroat V -40
+KPX Dcroat W -40
+KPX Dcroat Y -70
+KPX Dcroat Yacute -70
+KPX Dcroat Ydieresis -70
+KPX Dcroat comma -30
+KPX Dcroat period -30
+KPX F A -80
+KPX F Aacute -80
+KPX F Abreve -80
+KPX F Acircumflex -80
+KPX F Adieresis -80
+KPX F Agrave -80
+KPX F Amacron -80
+KPX F Aogonek -80
+KPX F Aring -80
+KPX F Atilde -80
+KPX F a -20
+KPX F aacute -20
+KPX F abreve -20
+KPX F acircumflex -20
+KPX F adieresis -20
+KPX F agrave -20
+KPX F amacron -20
+KPX F aogonek -20
+KPX F aring -20
+KPX F atilde -20
+KPX F comma -100
+KPX F period -100
+KPX J A -20
+KPX J Aacute -20
+KPX J Abreve -20
+KPX J Acircumflex -20
+KPX J Adieresis -20
+KPX J Agrave -20
+KPX J Amacron -20
+KPX J Aogonek -20
+KPX J Aring -20
+KPX J Atilde -20
+KPX J comma -20
+KPX J period -20
+KPX J u -20
+KPX J uacute -20
+KPX J ucircumflex -20
+KPX J udieresis -20
+KPX J ugrave -20
+KPX J uhungarumlaut -20
+KPX J umacron -20
+KPX J uogonek -20
+KPX J uring -20
+KPX K O -30
+KPX K Oacute -30
+KPX K Ocircumflex -30
+KPX K Odieresis -30
+KPX K Ograve -30
+KPX K Ohungarumlaut -30
+KPX K Omacron -30
+KPX K Oslash -30
+KPX K Otilde -30
+KPX K e -15
+KPX K eacute -15
+KPX K ecaron -15
+KPX K ecircumflex -15
+KPX K edieresis -15
+KPX K edotaccent -15
+KPX K egrave -15
+KPX K emacron -15
+KPX K eogonek -15
+KPX K o -35
+KPX K oacute -35
+KPX K ocircumflex -35
+KPX K odieresis -35
+KPX K ograve -35
+KPX K ohungarumlaut -35
+KPX K omacron -35
+KPX K oslash -35
+KPX K otilde -35
+KPX K u -30
+KPX K uacute -30
+KPX K ucircumflex -30
+KPX K udieresis -30
+KPX K ugrave -30
+KPX K uhungarumlaut -30
+KPX K umacron -30
+KPX K uogonek -30
+KPX K uring -30
+KPX K y -40
+KPX K yacute -40
+KPX K ydieresis -40
+KPX Kcommaaccent O -30
+KPX Kcommaaccent Oacute -30
+KPX Kcommaaccent Ocircumflex -30
+KPX Kcommaaccent Odieresis -30
+KPX Kcommaaccent Ograve -30
+KPX Kcommaaccent Ohungarumlaut -30
+KPX Kcommaaccent Omacron -30
+KPX Kcommaaccent Oslash -30
+KPX Kcommaaccent Otilde -30
+KPX Kcommaaccent e -15
+KPX Kcommaaccent eacute -15
+KPX Kcommaaccent ecaron -15
+KPX Kcommaaccent ecircumflex -15
+KPX Kcommaaccent edieresis -15
+KPX Kcommaaccent edotaccent -15
+KPX Kcommaaccent egrave -15
+KPX Kcommaaccent emacron -15
+KPX Kcommaaccent eogonek -15
+KPX Kcommaaccent o -35
+KPX Kcommaaccent oacute -35
+KPX Kcommaaccent ocircumflex -35
+KPX Kcommaaccent odieresis -35
+KPX Kcommaaccent ograve -35
+KPX Kcommaaccent ohungarumlaut -35
+KPX Kcommaaccent omacron -35
+KPX Kcommaaccent oslash -35
+KPX Kcommaaccent otilde -35
+KPX Kcommaaccent u -30
+KPX Kcommaaccent uacute -30
+KPX Kcommaaccent ucircumflex -30
+KPX Kcommaaccent udieresis -30
+KPX Kcommaaccent ugrave -30
+KPX Kcommaaccent uhungarumlaut -30
+KPX Kcommaaccent umacron -30
+KPX Kcommaaccent uogonek -30
+KPX Kcommaaccent uring -30
+KPX Kcommaaccent y -40
+KPX Kcommaaccent yacute -40
+KPX Kcommaaccent ydieresis -40
+KPX L T -90
+KPX L Tcaron -90
+KPX L Tcommaaccent -90
+KPX L V -110
+KPX L W -80
+KPX L Y -120
+KPX L Yacute -120
+KPX L Ydieresis -120
+KPX L quotedblright -140
+KPX L quoteright -140
+KPX L y -30
+KPX L yacute -30
+KPX L ydieresis -30
+KPX Lacute T -90
+KPX Lacute Tcaron -90
+KPX Lacute Tcommaaccent -90
+KPX Lacute V -110
+KPX Lacute W -80
+KPX Lacute Y -120
+KPX Lacute Yacute -120
+KPX Lacute Ydieresis -120
+KPX Lacute quotedblright -140
+KPX Lacute quoteright -140
+KPX Lacute y -30
+KPX Lacute yacute -30
+KPX Lacute ydieresis -30
+KPX Lcommaaccent T -90
+KPX Lcommaaccent Tcaron -90
+KPX Lcommaaccent Tcommaaccent -90
+KPX Lcommaaccent V -110
+KPX Lcommaaccent W -80
+KPX Lcommaaccent Y -120
+KPX Lcommaaccent Yacute -120
+KPX Lcommaaccent Ydieresis -120
+KPX Lcommaaccent quotedblright -140
+KPX Lcommaaccent quoteright -140
+KPX Lcommaaccent y -30
+KPX Lcommaaccent yacute -30
+KPX Lcommaaccent ydieresis -30
+KPX Lslash T -90
+KPX Lslash Tcaron -90
+KPX Lslash Tcommaaccent -90
+KPX Lslash V -110
+KPX Lslash W -80
+KPX Lslash Y -120
+KPX Lslash Yacute -120
+KPX Lslash Ydieresis -120
+KPX Lslash quotedblright -140
+KPX Lslash quoteright -140
+KPX Lslash y -30
+KPX Lslash yacute -30
+KPX Lslash ydieresis -30
+KPX O A -50
+KPX O Aacute -50
+KPX O Abreve -50
+KPX O Acircumflex -50
+KPX O Adieresis -50
+KPX O Agrave -50
+KPX O Amacron -50
+KPX O Aogonek -50
+KPX O Aring -50
+KPX O Atilde -50
+KPX O T -40
+KPX O Tcaron -40
+KPX O Tcommaaccent -40
+KPX O V -50
+KPX O W -50
+KPX O X -50
+KPX O Y -70
+KPX O Yacute -70
+KPX O Ydieresis -70
+KPX O comma -40
+KPX O period -40
+KPX Oacute A -50
+KPX Oacute Aacute -50
+KPX Oacute Abreve -50
+KPX Oacute Acircumflex -50
+KPX Oacute Adieresis -50
+KPX Oacute Agrave -50
+KPX Oacute Amacron -50
+KPX Oacute Aogonek -50
+KPX Oacute Aring -50
+KPX Oacute Atilde -50
+KPX Oacute T -40
+KPX Oacute Tcaron -40
+KPX Oacute Tcommaaccent -40
+KPX Oacute V -50
+KPX Oacute W -50
+KPX Oacute X -50
+KPX Oacute Y -70
+KPX Oacute Yacute -70
+KPX Oacute Ydieresis -70
+KPX Oacute comma -40
+KPX Oacute period -40
+KPX Ocircumflex A -50
+KPX Ocircumflex Aacute -50
+KPX Ocircumflex Abreve -50
+KPX Ocircumflex Acircumflex -50
+KPX Ocircumflex Adieresis -50
+KPX Ocircumflex Agrave -50
+KPX Ocircumflex Amacron -50
+KPX Ocircumflex Aogonek -50
+KPX Ocircumflex Aring -50
+KPX Ocircumflex Atilde -50
+KPX Ocircumflex T -40
+KPX Ocircumflex Tcaron -40
+KPX Ocircumflex Tcommaaccent -40
+KPX Ocircumflex V -50
+KPX Ocircumflex W -50
+KPX Ocircumflex X -50
+KPX Ocircumflex Y -70
+KPX Ocircumflex Yacute -70
+KPX Ocircumflex Ydieresis -70
+KPX Ocircumflex comma -40
+KPX Ocircumflex period -40
+KPX Odieresis A -50
+KPX Odieresis Aacute -50
+KPX Odieresis Abreve -50
+KPX Odieresis Acircumflex -50
+KPX Odieresis Adieresis -50
+KPX Odieresis Agrave -50
+KPX Odieresis Amacron -50
+KPX Odieresis Aogonek -50
+KPX Odieresis Aring -50
+KPX Odieresis Atilde -50
+KPX Odieresis T -40
+KPX Odieresis Tcaron -40
+KPX Odieresis Tcommaaccent -40
+KPX Odieresis V -50
+KPX Odieresis W -50
+KPX Odieresis X -50
+KPX Odieresis Y -70
+KPX Odieresis Yacute -70
+KPX Odieresis Ydieresis -70
+KPX Odieresis comma -40
+KPX Odieresis period -40
+KPX Ograve A -50
+KPX Ograve Aacute -50
+KPX Ograve Abreve -50
+KPX Ograve Acircumflex -50
+KPX Ograve Adieresis -50
+KPX Ograve Agrave -50
+KPX Ograve Amacron -50
+KPX Ograve Aogonek -50
+KPX Ograve Aring -50
+KPX Ograve Atilde -50
+KPX Ograve T -40
+KPX Ograve Tcaron -40
+KPX Ograve Tcommaaccent -40
+KPX Ograve V -50
+KPX Ograve W -50
+KPX Ograve X -50
+KPX Ograve Y -70
+KPX Ograve Yacute -70
+KPX Ograve Ydieresis -70
+KPX Ograve comma -40
+KPX Ograve period -40
+KPX Ohungarumlaut A -50
+KPX Ohungarumlaut Aacute -50
+KPX Ohungarumlaut Abreve -50
+KPX Ohungarumlaut Acircumflex -50
+KPX Ohungarumlaut Adieresis -50
+KPX Ohungarumlaut Agrave -50
+KPX Ohungarumlaut Amacron -50
+KPX Ohungarumlaut Aogonek -50
+KPX Ohungarumlaut Aring -50
+KPX Ohungarumlaut Atilde -50
+KPX Ohungarumlaut T -40
+KPX Ohungarumlaut Tcaron -40
+KPX Ohungarumlaut Tcommaaccent -40
+KPX Ohungarumlaut V -50
+KPX Ohungarumlaut W -50
+KPX Ohungarumlaut X -50
+KPX Ohungarumlaut Y -70
+KPX Ohungarumlaut Yacute -70
+KPX Ohungarumlaut Ydieresis -70
+KPX Ohungarumlaut comma -40
+KPX Ohungarumlaut period -40
+KPX Omacron A -50
+KPX Omacron Aacute -50
+KPX Omacron Abreve -50
+KPX Omacron Acircumflex -50
+KPX Omacron Adieresis -50
+KPX Omacron Agrave -50
+KPX Omacron Amacron -50
+KPX Omacron Aogonek -50
+KPX Omacron Aring -50
+KPX Omacron Atilde -50
+KPX Omacron T -40
+KPX Omacron Tcaron -40
+KPX Omacron Tcommaaccent -40
+KPX Omacron V -50
+KPX Omacron W -50
+KPX Omacron X -50
+KPX Omacron Y -70
+KPX Omacron Yacute -70
+KPX Omacron Ydieresis -70
+KPX Omacron comma -40
+KPX Omacron period -40
+KPX Oslash A -50
+KPX Oslash Aacute -50
+KPX Oslash Abreve -50
+KPX Oslash Acircumflex -50
+KPX Oslash Adieresis -50
+KPX Oslash Agrave -50
+KPX Oslash Amacron -50
+KPX Oslash Aogonek -50
+KPX Oslash Aring -50
+KPX Oslash Atilde -50
+KPX Oslash T -40
+KPX Oslash Tcaron -40
+KPX Oslash Tcommaaccent -40
+KPX Oslash V -50
+KPX Oslash W -50
+KPX Oslash X -50
+KPX Oslash Y -70
+KPX Oslash Yacute -70
+KPX Oslash Ydieresis -70
+KPX Oslash comma -40
+KPX Oslash period -40
+KPX Otilde A -50
+KPX Otilde Aacute -50
+KPX Otilde Abreve -50
+KPX Otilde Acircumflex -50
+KPX Otilde Adieresis -50
+KPX Otilde Agrave -50
+KPX Otilde Amacron -50
+KPX Otilde Aogonek -50
+KPX Otilde Aring -50
+KPX Otilde Atilde -50
+KPX Otilde T -40
+KPX Otilde Tcaron -40
+KPX Otilde Tcommaaccent -40
+KPX Otilde V -50
+KPX Otilde W -50
+KPX Otilde X -50
+KPX Otilde Y -70
+KPX Otilde Yacute -70
+KPX Otilde Ydieresis -70
+KPX Otilde comma -40
+KPX Otilde period -40
+KPX P A -100
+KPX P Aacute -100
+KPX P Abreve -100
+KPX P Acircumflex -100
+KPX P Adieresis -100
+KPX P Agrave -100
+KPX P Amacron -100
+KPX P Aogonek -100
+KPX P Aring -100
+KPX P Atilde -100
+KPX P a -30
+KPX P aacute -30
+KPX P abreve -30
+KPX P acircumflex -30
+KPX P adieresis -30
+KPX P agrave -30
+KPX P amacron -30
+KPX P aogonek -30
+KPX P aring -30
+KPX P atilde -30
+KPX P comma -120
+KPX P e -30
+KPX P eacute -30
+KPX P ecaron -30
+KPX P ecircumflex -30
+KPX P edieresis -30
+KPX P edotaccent -30
+KPX P egrave -30
+KPX P emacron -30
+KPX P eogonek -30
+KPX P o -40
+KPX P oacute -40
+KPX P ocircumflex -40
+KPX P odieresis -40
+KPX P ograve -40
+KPX P ohungarumlaut -40
+KPX P omacron -40
+KPX P oslash -40
+KPX P otilde -40
+KPX P period -120
+KPX Q U -10
+KPX Q Uacute -10
+KPX Q Ucircumflex -10
+KPX Q Udieresis -10
+KPX Q Ugrave -10
+KPX Q Uhungarumlaut -10
+KPX Q Umacron -10
+KPX Q Uogonek -10
+KPX Q Uring -10
+KPX Q comma 20
+KPX Q period 20
+KPX R O -20
+KPX R Oacute -20
+KPX R Ocircumflex -20
+KPX R Odieresis -20
+KPX R Ograve -20
+KPX R Ohungarumlaut -20
+KPX R Omacron -20
+KPX R Oslash -20
+KPX R Otilde -20
+KPX R T -20
+KPX R Tcaron -20
+KPX R Tcommaaccent -20
+KPX R U -20
+KPX R Uacute -20
+KPX R Ucircumflex -20
+KPX R Udieresis -20
+KPX R Ugrave -20
+KPX R Uhungarumlaut -20
+KPX R Umacron -20
+KPX R Uogonek -20
+KPX R Uring -20
+KPX R V -50
+KPX R W -40
+KPX R Y -50
+KPX R Yacute -50
+KPX R Ydieresis -50
+KPX Racute O -20
+KPX Racute Oacute -20
+KPX Racute Ocircumflex -20
+KPX Racute Odieresis -20
+KPX Racute Ograve -20
+KPX Racute Ohungarumlaut -20
+KPX Racute Omacron -20
+KPX Racute Oslash -20
+KPX Racute Otilde -20
+KPX Racute T -20
+KPX Racute Tcaron -20
+KPX Racute Tcommaaccent -20
+KPX Racute U -20
+KPX Racute Uacute -20
+KPX Racute Ucircumflex -20
+KPX Racute Udieresis -20
+KPX Racute Ugrave -20
+KPX Racute Uhungarumlaut -20
+KPX Racute Umacron -20
+KPX Racute Uogonek -20
+KPX Racute Uring -20
+KPX Racute V -50
+KPX Racute W -40
+KPX Racute Y -50
+KPX Racute Yacute -50
+KPX Racute Ydieresis -50
+KPX Rcaron O -20
+KPX Rcaron Oacute -20
+KPX Rcaron Ocircumflex -20
+KPX Rcaron Odieresis -20
+KPX Rcaron Ograve -20
+KPX Rcaron Ohungarumlaut -20
+KPX Rcaron Omacron -20
+KPX Rcaron Oslash -20
+KPX Rcaron Otilde -20
+KPX Rcaron T -20
+KPX Rcaron Tcaron -20
+KPX Rcaron Tcommaaccent -20
+KPX Rcaron U -20
+KPX Rcaron Uacute -20
+KPX Rcaron Ucircumflex -20
+KPX Rcaron Udieresis -20
+KPX Rcaron Ugrave -20
+KPX Rcaron Uhungarumlaut -20
+KPX Rcaron Umacron -20
+KPX Rcaron Uogonek -20
+KPX Rcaron Uring -20
+KPX Rcaron V -50
+KPX Rcaron W -40
+KPX Rcaron Y -50
+KPX Rcaron Yacute -50
+KPX Rcaron Ydieresis -50
+KPX Rcommaaccent O -20
+KPX Rcommaaccent Oacute -20
+KPX Rcommaaccent Ocircumflex -20
+KPX Rcommaaccent Odieresis -20
+KPX Rcommaaccent Ograve -20
+KPX Rcommaaccent Ohungarumlaut -20
+KPX Rcommaaccent Omacron -20
+KPX Rcommaaccent Oslash -20
+KPX Rcommaaccent Otilde -20
+KPX Rcommaaccent T -20
+KPX Rcommaaccent Tcaron -20
+KPX Rcommaaccent Tcommaaccent -20
+KPX Rcommaaccent U -20
+KPX Rcommaaccent Uacute -20
+KPX Rcommaaccent Ucircumflex -20
+KPX Rcommaaccent Udieresis -20
+KPX Rcommaaccent Ugrave -20
+KPX Rcommaaccent Uhungarumlaut -20
+KPX Rcommaaccent Umacron -20
+KPX Rcommaaccent Uogonek -20
+KPX Rcommaaccent Uring -20
+KPX Rcommaaccent V -50
+KPX Rcommaaccent W -40
+KPX Rcommaaccent Y -50
+KPX Rcommaaccent Yacute -50
+KPX Rcommaaccent Ydieresis -50
+KPX T A -90
+KPX T Aacute -90
+KPX T Abreve -90
+KPX T Acircumflex -90
+KPX T Adieresis -90
+KPX T Agrave -90
+KPX T Amacron -90
+KPX T Aogonek -90
+KPX T Aring -90
+KPX T Atilde -90
+KPX T O -40
+KPX T Oacute -40
+KPX T Ocircumflex -40
+KPX T Odieresis -40
+KPX T Ograve -40
+KPX T Ohungarumlaut -40
+KPX T Omacron -40
+KPX T Oslash -40
+KPX T Otilde -40
+KPX T a -80
+KPX T aacute -80
+KPX T abreve -80
+KPX T acircumflex -80
+KPX T adieresis -80
+KPX T agrave -80
+KPX T amacron -80
+KPX T aogonek -80
+KPX T aring -80
+KPX T atilde -80
+KPX T colon -40
+KPX T comma -80
+KPX T e -60
+KPX T eacute -60
+KPX T ecaron -60
+KPX T ecircumflex -60
+KPX T edieresis -60
+KPX T edotaccent -60
+KPX T egrave -60
+KPX T emacron -60
+KPX T eogonek -60
+KPX T hyphen -120
+KPX T o -80
+KPX T oacute -80
+KPX T ocircumflex -80
+KPX T odieresis -80
+KPX T ograve -80
+KPX T ohungarumlaut -80
+KPX T omacron -80
+KPX T oslash -80
+KPX T otilde -80
+KPX T period -80
+KPX T r -80
+KPX T racute -80
+KPX T rcommaaccent -80
+KPX T semicolon -40
+KPX T u -90
+KPX T uacute -90
+KPX T ucircumflex -90
+KPX T udieresis -90
+KPX T ugrave -90
+KPX T uhungarumlaut -90
+KPX T umacron -90
+KPX T uogonek -90
+KPX T uring -90
+KPX T w -60
+KPX T y -60
+KPX T yacute -60
+KPX T ydieresis -60
+KPX Tcaron A -90
+KPX Tcaron Aacute -90
+KPX Tcaron Abreve -90
+KPX Tcaron Acircumflex -90
+KPX Tcaron Adieresis -90
+KPX Tcaron Agrave -90
+KPX Tcaron Amacron -90
+KPX Tcaron Aogonek -90
+KPX Tcaron Aring -90
+KPX Tcaron Atilde -90
+KPX Tcaron O -40
+KPX Tcaron Oacute -40
+KPX Tcaron Ocircumflex -40
+KPX Tcaron Odieresis -40
+KPX Tcaron Ograve -40
+KPX Tcaron Ohungarumlaut -40
+KPX Tcaron Omacron -40
+KPX Tcaron Oslash -40
+KPX Tcaron Otilde -40
+KPX Tcaron a -80
+KPX Tcaron aacute -80
+KPX Tcaron abreve -80
+KPX Tcaron acircumflex -80
+KPX Tcaron adieresis -80
+KPX Tcaron agrave -80
+KPX Tcaron amacron -80
+KPX Tcaron aogonek -80
+KPX Tcaron aring -80
+KPX Tcaron atilde -80
+KPX Tcaron colon -40
+KPX Tcaron comma -80
+KPX Tcaron e -60
+KPX Tcaron eacute -60
+KPX Tcaron ecaron -60
+KPX Tcaron ecircumflex -60
+KPX Tcaron edieresis -60
+KPX Tcaron edotaccent -60
+KPX Tcaron egrave -60
+KPX Tcaron emacron -60
+KPX Tcaron eogonek -60
+KPX Tcaron hyphen -120
+KPX Tcaron o -80
+KPX Tcaron oacute -80
+KPX Tcaron ocircumflex -80
+KPX Tcaron odieresis -80
+KPX Tcaron ograve -80
+KPX Tcaron ohungarumlaut -80
+KPX Tcaron omacron -80
+KPX Tcaron oslash -80
+KPX Tcaron otilde -80
+KPX Tcaron period -80
+KPX Tcaron r -80
+KPX Tcaron racute -80
+KPX Tcaron rcommaaccent -80
+KPX Tcaron semicolon -40
+KPX Tcaron u -90
+KPX Tcaron uacute -90
+KPX Tcaron ucircumflex -90
+KPX Tcaron udieresis -90
+KPX Tcaron ugrave -90
+KPX Tcaron uhungarumlaut -90
+KPX Tcaron umacron -90
+KPX Tcaron uogonek -90
+KPX Tcaron uring -90
+KPX Tcaron w -60
+KPX Tcaron y -60
+KPX Tcaron yacute -60
+KPX Tcaron ydieresis -60
+KPX Tcommaaccent A -90
+KPX Tcommaaccent Aacute -90
+KPX Tcommaaccent Abreve -90
+KPX Tcommaaccent Acircumflex -90
+KPX Tcommaaccent Adieresis -90
+KPX Tcommaaccent Agrave -90
+KPX Tcommaaccent Amacron -90
+KPX Tcommaaccent Aogonek -90
+KPX Tcommaaccent Aring -90
+KPX Tcommaaccent Atilde -90
+KPX Tcommaaccent O -40
+KPX Tcommaaccent Oacute -40
+KPX Tcommaaccent Ocircumflex -40
+KPX Tcommaaccent Odieresis -40
+KPX Tcommaaccent Ograve -40
+KPX Tcommaaccent Ohungarumlaut -40
+KPX Tcommaaccent Omacron -40
+KPX Tcommaaccent Oslash -40
+KPX Tcommaaccent Otilde -40
+KPX Tcommaaccent a -80
+KPX Tcommaaccent aacute -80
+KPX Tcommaaccent abreve -80
+KPX Tcommaaccent acircumflex -80
+KPX Tcommaaccent adieresis -80
+KPX Tcommaaccent agrave -80
+KPX Tcommaaccent amacron -80
+KPX Tcommaaccent aogonek -80
+KPX Tcommaaccent aring -80
+KPX Tcommaaccent atilde -80
+KPX Tcommaaccent colon -40
+KPX Tcommaaccent comma -80
+KPX Tcommaaccent e -60
+KPX Tcommaaccent eacute -60
+KPX Tcommaaccent ecaron -60
+KPX Tcommaaccent ecircumflex -60
+KPX Tcommaaccent edieresis -60
+KPX Tcommaaccent edotaccent -60
+KPX Tcommaaccent egrave -60
+KPX Tcommaaccent emacron -60
+KPX Tcommaaccent eogonek -60
+KPX Tcommaaccent hyphen -120
+KPX Tcommaaccent o -80
+KPX Tcommaaccent oacute -80
+KPX Tcommaaccent ocircumflex -80
+KPX Tcommaaccent odieresis -80
+KPX Tcommaaccent ograve -80
+KPX Tcommaaccent ohungarumlaut -80
+KPX Tcommaaccent omacron -80
+KPX Tcommaaccent oslash -80
+KPX Tcommaaccent otilde -80
+KPX Tcommaaccent period -80
+KPX Tcommaaccent r -80
+KPX Tcommaaccent racute -80
+KPX Tcommaaccent rcommaaccent -80
+KPX Tcommaaccent semicolon -40
+KPX Tcommaaccent u -90
+KPX Tcommaaccent uacute -90
+KPX Tcommaaccent ucircumflex -90
+KPX Tcommaaccent udieresis -90
+KPX Tcommaaccent ugrave -90
+KPX Tcommaaccent uhungarumlaut -90
+KPX Tcommaaccent umacron -90
+KPX Tcommaaccent uogonek -90
+KPX Tcommaaccent uring -90
+KPX Tcommaaccent w -60
+KPX Tcommaaccent y -60
+KPX Tcommaaccent yacute -60
+KPX Tcommaaccent ydieresis -60
+KPX U A -50
+KPX U Aacute -50
+KPX U Abreve -50
+KPX U Acircumflex -50
+KPX U Adieresis -50
+KPX U Agrave -50
+KPX U Amacron -50
+KPX U Aogonek -50
+KPX U Aring -50
+KPX U Atilde -50
+KPX U comma -30
+KPX U period -30
+KPX Uacute A -50
+KPX Uacute Aacute -50
+KPX Uacute Abreve -50
+KPX Uacute Acircumflex -50
+KPX Uacute Adieresis -50
+KPX Uacute Agrave -50
+KPX Uacute Amacron -50
+KPX Uacute Aogonek -50
+KPX Uacute Aring -50
+KPX Uacute Atilde -50
+KPX Uacute comma -30
+KPX Uacute period -30
+KPX Ucircumflex A -50
+KPX Ucircumflex Aacute -50
+KPX Ucircumflex Abreve -50
+KPX Ucircumflex Acircumflex -50
+KPX Ucircumflex Adieresis -50
+KPX Ucircumflex Agrave -50
+KPX Ucircumflex Amacron -50
+KPX Ucircumflex Aogonek -50
+KPX Ucircumflex Aring -50
+KPX Ucircumflex Atilde -50
+KPX Ucircumflex comma -30
+KPX Ucircumflex period -30
+KPX Udieresis A -50
+KPX Udieresis Aacute -50
+KPX Udieresis Abreve -50
+KPX Udieresis Acircumflex -50
+KPX Udieresis Adieresis -50
+KPX Udieresis Agrave -50
+KPX Udieresis Amacron -50
+KPX Udieresis Aogonek -50
+KPX Udieresis Aring -50
+KPX Udieresis Atilde -50
+KPX Udieresis comma -30
+KPX Udieresis period -30
+KPX Ugrave A -50
+KPX Ugrave Aacute -50
+KPX Ugrave Abreve -50
+KPX Ugrave Acircumflex -50
+KPX Ugrave Adieresis -50
+KPX Ugrave Agrave -50
+KPX Ugrave Amacron -50
+KPX Ugrave Aogonek -50
+KPX Ugrave Aring -50
+KPX Ugrave Atilde -50
+KPX Ugrave comma -30
+KPX Ugrave period -30
+KPX Uhungarumlaut A -50
+KPX Uhungarumlaut Aacute -50
+KPX Uhungarumlaut Abreve -50
+KPX Uhungarumlaut Acircumflex -50
+KPX Uhungarumlaut Adieresis -50
+KPX Uhungarumlaut Agrave -50
+KPX Uhungarumlaut Amacron -50
+KPX Uhungarumlaut Aogonek -50
+KPX Uhungarumlaut Aring -50
+KPX Uhungarumlaut Atilde -50
+KPX Uhungarumlaut comma -30
+KPX Uhungarumlaut period -30
+KPX Umacron A -50
+KPX Umacron Aacute -50
+KPX Umacron Abreve -50
+KPX Umacron Acircumflex -50
+KPX Umacron Adieresis -50
+KPX Umacron Agrave -50
+KPX Umacron Amacron -50
+KPX Umacron Aogonek -50
+KPX Umacron Aring -50
+KPX Umacron Atilde -50
+KPX Umacron comma -30
+KPX Umacron period -30
+KPX Uogonek A -50
+KPX Uogonek Aacute -50
+KPX Uogonek Abreve -50
+KPX Uogonek Acircumflex -50
+KPX Uogonek Adieresis -50
+KPX Uogonek Agrave -50
+KPX Uogonek Amacron -50
+KPX Uogonek Aogonek -50
+KPX Uogonek Aring -50
+KPX Uogonek Atilde -50
+KPX Uogonek comma -30
+KPX Uogonek period -30
+KPX Uring A -50
+KPX Uring Aacute -50
+KPX Uring Abreve -50
+KPX Uring Acircumflex -50
+KPX Uring Adieresis -50
+KPX Uring Agrave -50
+KPX Uring Amacron -50
+KPX Uring Aogonek -50
+KPX Uring Aring -50
+KPX Uring Atilde -50
+KPX Uring comma -30
+KPX Uring period -30
+KPX V A -80
+KPX V Aacute -80
+KPX V Abreve -80
+KPX V Acircumflex -80
+KPX V Adieresis -80
+KPX V Agrave -80
+KPX V Amacron -80
+KPX V Aogonek -80
+KPX V Aring -80
+KPX V Atilde -80
+KPX V G -50
+KPX V Gbreve -50
+KPX V Gcommaaccent -50
+KPX V O -50
+KPX V Oacute -50
+KPX V Ocircumflex -50
+KPX V Odieresis -50
+KPX V Ograve -50
+KPX V Ohungarumlaut -50
+KPX V Omacron -50
+KPX V Oslash -50
+KPX V Otilde -50
+KPX V a -60
+KPX V aacute -60
+KPX V abreve -60
+KPX V acircumflex -60
+KPX V adieresis -60
+KPX V agrave -60
+KPX V amacron -60
+KPX V aogonek -60
+KPX V aring -60
+KPX V atilde -60
+KPX V colon -40
+KPX V comma -120
+KPX V e -50
+KPX V eacute -50
+KPX V ecaron -50
+KPX V ecircumflex -50
+KPX V edieresis -50
+KPX V edotaccent -50
+KPX V egrave -50
+KPX V emacron -50
+KPX V eogonek -50
+KPX V hyphen -80
+KPX V o -90
+KPX V oacute -90
+KPX V ocircumflex -90
+KPX V odieresis -90
+KPX V ograve -90
+KPX V ohungarumlaut -90
+KPX V omacron -90
+KPX V oslash -90
+KPX V otilde -90
+KPX V period -120
+KPX V semicolon -40
+KPX V u -60
+KPX V uacute -60
+KPX V ucircumflex -60
+KPX V udieresis -60
+KPX V ugrave -60
+KPX V uhungarumlaut -60
+KPX V umacron -60
+KPX V uogonek -60
+KPX V uring -60
+KPX W A -60
+KPX W Aacute -60
+KPX W Abreve -60
+KPX W Acircumflex -60
+KPX W Adieresis -60
+KPX W Agrave -60
+KPX W Amacron -60
+KPX W Aogonek -60
+KPX W Aring -60
+KPX W Atilde -60
+KPX W O -20
+KPX W Oacute -20
+KPX W Ocircumflex -20
+KPX W Odieresis -20
+KPX W Ograve -20
+KPX W Ohungarumlaut -20
+KPX W Omacron -20
+KPX W Oslash -20
+KPX W Otilde -20
+KPX W a -40
+KPX W aacute -40
+KPX W abreve -40
+KPX W acircumflex -40
+KPX W adieresis -40
+KPX W agrave -40
+KPX W amacron -40
+KPX W aogonek -40
+KPX W aring -40
+KPX W atilde -40
+KPX W colon -10
+KPX W comma -80
+KPX W e -35
+KPX W eacute -35
+KPX W ecaron -35
+KPX W ecircumflex -35
+KPX W edieresis -35
+KPX W edotaccent -35
+KPX W egrave -35
+KPX W emacron -35
+KPX W eogonek -35
+KPX W hyphen -40
+KPX W o -60
+KPX W oacute -60
+KPX W ocircumflex -60
+KPX W odieresis -60
+KPX W ograve -60
+KPX W ohungarumlaut -60
+KPX W omacron -60
+KPX W oslash -60
+KPX W otilde -60
+KPX W period -80
+KPX W semicolon -10
+KPX W u -45
+KPX W uacute -45
+KPX W ucircumflex -45
+KPX W udieresis -45
+KPX W ugrave -45
+KPX W uhungarumlaut -45
+KPX W umacron -45
+KPX W uogonek -45
+KPX W uring -45
+KPX W y -20
+KPX W yacute -20
+KPX W ydieresis -20
+KPX Y A -110
+KPX Y Aacute -110
+KPX Y Abreve -110
+KPX Y Acircumflex -110
+KPX Y Adieresis -110
+KPX Y Agrave -110
+KPX Y Amacron -110
+KPX Y Aogonek -110
+KPX Y Aring -110
+KPX Y Atilde -110
+KPX Y O -70
+KPX Y Oacute -70
+KPX Y Ocircumflex -70
+KPX Y Odieresis -70
+KPX Y Ograve -70
+KPX Y Ohungarumlaut -70
+KPX Y Omacron -70
+KPX Y Oslash -70
+KPX Y Otilde -70
+KPX Y a -90
+KPX Y aacute -90
+KPX Y abreve -90
+KPX Y acircumflex -90
+KPX Y adieresis -90
+KPX Y agrave -90
+KPX Y amacron -90
+KPX Y aogonek -90
+KPX Y aring -90
+KPX Y atilde -90
+KPX Y colon -50
+KPX Y comma -100
+KPX Y e -80
+KPX Y eacute -80
+KPX Y ecaron -80
+KPX Y ecircumflex -80
+KPX Y edieresis -80
+KPX Y edotaccent -80
+KPX Y egrave -80
+KPX Y emacron -80
+KPX Y eogonek -80
+KPX Y o -100
+KPX Y oacute -100
+KPX Y ocircumflex -100
+KPX Y odieresis -100
+KPX Y ograve -100
+KPX Y ohungarumlaut -100
+KPX Y omacron -100
+KPX Y oslash -100
+KPX Y otilde -100
+KPX Y period -100
+KPX Y semicolon -50
+KPX Y u -100
+KPX Y uacute -100
+KPX Y ucircumflex -100
+KPX Y udieresis -100
+KPX Y ugrave -100
+KPX Y uhungarumlaut -100
+KPX Y umacron -100
+KPX Y uogonek -100
+KPX Y uring -100
+KPX Yacute A -110
+KPX Yacute Aacute -110
+KPX Yacute Abreve -110
+KPX Yacute Acircumflex -110
+KPX Yacute Adieresis -110
+KPX Yacute Agrave -110
+KPX Yacute Amacron -110
+KPX Yacute Aogonek -110
+KPX Yacute Aring -110
+KPX Yacute Atilde -110
+KPX Yacute O -70
+KPX Yacute Oacute -70
+KPX Yacute Ocircumflex -70
+KPX Yacute Odieresis -70
+KPX Yacute Ograve -70
+KPX Yacute Ohungarumlaut -70
+KPX Yacute Omacron -70
+KPX Yacute Oslash -70
+KPX Yacute Otilde -70
+KPX Yacute a -90
+KPX Yacute aacute -90
+KPX Yacute abreve -90
+KPX Yacute acircumflex -90
+KPX Yacute adieresis -90
+KPX Yacute agrave -90
+KPX Yacute amacron -90
+KPX Yacute aogonek -90
+KPX Yacute aring -90
+KPX Yacute atilde -90
+KPX Yacute colon -50
+KPX Yacute comma -100
+KPX Yacute e -80
+KPX Yacute eacute -80
+KPX Yacute ecaron -80
+KPX Yacute ecircumflex -80
+KPX Yacute edieresis -80
+KPX Yacute edotaccent -80
+KPX Yacute egrave -80
+KPX Yacute emacron -80
+KPX Yacute eogonek -80
+KPX Yacute o -100
+KPX Yacute oacute -100
+KPX Yacute ocircumflex -100
+KPX Yacute odieresis -100
+KPX Yacute ograve -100
+KPX Yacute ohungarumlaut -100
+KPX Yacute omacron -100
+KPX Yacute oslash -100
+KPX Yacute otilde -100
+KPX Yacute period -100
+KPX Yacute semicolon -50
+KPX Yacute u -100
+KPX Yacute uacute -100
+KPX Yacute ucircumflex -100
+KPX Yacute udieresis -100
+KPX Yacute ugrave -100
+KPX Yacute uhungarumlaut -100
+KPX Yacute umacron -100
+KPX Yacute uogonek -100
+KPX Yacute uring -100
+KPX Ydieresis A -110
+KPX Ydieresis Aacute -110
+KPX Ydieresis Abreve -110
+KPX Ydieresis Acircumflex -110
+KPX Ydieresis Adieresis -110
+KPX Ydieresis Agrave -110
+KPX Ydieresis Amacron -110
+KPX Ydieresis Aogonek -110
+KPX Ydieresis Aring -110
+KPX Ydieresis Atilde -110
+KPX Ydieresis O -70
+KPX Ydieresis Oacute -70
+KPX Ydieresis Ocircumflex -70
+KPX Ydieresis Odieresis -70
+KPX Ydieresis Ograve -70
+KPX Ydieresis Ohungarumlaut -70
+KPX Ydieresis Omacron -70
+KPX Ydieresis Oslash -70
+KPX Ydieresis Otilde -70
+KPX Ydieresis a -90
+KPX Ydieresis aacute -90
+KPX Ydieresis abreve -90
+KPX Ydieresis acircumflex -90
+KPX Ydieresis adieresis -90
+KPX Ydieresis agrave -90
+KPX Ydieresis amacron -90
+KPX Ydieresis aogonek -90
+KPX Ydieresis aring -90
+KPX Ydieresis atilde -90
+KPX Ydieresis colon -50
+KPX Ydieresis comma -100
+KPX Ydieresis e -80
+KPX Ydieresis eacute -80
+KPX Ydieresis ecaron -80
+KPX Ydieresis ecircumflex -80
+KPX Ydieresis edieresis -80
+KPX Ydieresis edotaccent -80
+KPX Ydieresis egrave -80
+KPX Ydieresis emacron -80
+KPX Ydieresis eogonek -80
+KPX Ydieresis o -100
+KPX Ydieresis oacute -100
+KPX Ydieresis ocircumflex -100
+KPX Ydieresis odieresis -100
+KPX Ydieresis ograve -100
+KPX Ydieresis ohungarumlaut -100
+KPX Ydieresis omacron -100
+KPX Ydieresis oslash -100
+KPX Ydieresis otilde -100
+KPX Ydieresis period -100
+KPX Ydieresis semicolon -50
+KPX Ydieresis u -100
+KPX Ydieresis uacute -100
+KPX Ydieresis ucircumflex -100
+KPX Ydieresis udieresis -100
+KPX Ydieresis ugrave -100
+KPX Ydieresis uhungarumlaut -100
+KPX Ydieresis umacron -100
+KPX Ydieresis uogonek -100
+KPX Ydieresis uring -100
+KPX a g -10
+KPX a gbreve -10
+KPX a gcommaaccent -10
+KPX a v -15
+KPX a w -15
+KPX a y -20
+KPX a yacute -20
+KPX a ydieresis -20
+KPX aacute g -10
+KPX aacute gbreve -10
+KPX aacute gcommaaccent -10
+KPX aacute v -15
+KPX aacute w -15
+KPX aacute y -20
+KPX aacute yacute -20
+KPX aacute ydieresis -20
+KPX abreve g -10
+KPX abreve gbreve -10
+KPX abreve gcommaaccent -10
+KPX abreve v -15
+KPX abreve w -15
+KPX abreve y -20
+KPX abreve yacute -20
+KPX abreve ydieresis -20
+KPX acircumflex g -10
+KPX acircumflex gbreve -10
+KPX acircumflex gcommaaccent -10
+KPX acircumflex v -15
+KPX acircumflex w -15
+KPX acircumflex y -20
+KPX acircumflex yacute -20
+KPX acircumflex ydieresis -20
+KPX adieresis g -10
+KPX adieresis gbreve -10
+KPX adieresis gcommaaccent -10
+KPX adieresis v -15
+KPX adieresis w -15
+KPX adieresis y -20
+KPX adieresis yacute -20
+KPX adieresis ydieresis -20
+KPX agrave g -10
+KPX agrave gbreve -10
+KPX agrave gcommaaccent -10
+KPX agrave v -15
+KPX agrave w -15
+KPX agrave y -20
+KPX agrave yacute -20
+KPX agrave ydieresis -20
+KPX amacron g -10
+KPX amacron gbreve -10
+KPX amacron gcommaaccent -10
+KPX amacron v -15
+KPX amacron w -15
+KPX amacron y -20
+KPX amacron yacute -20
+KPX amacron ydieresis -20
+KPX aogonek g -10
+KPX aogonek gbreve -10
+KPX aogonek gcommaaccent -10
+KPX aogonek v -15
+KPX aogonek w -15
+KPX aogonek y -20
+KPX aogonek yacute -20
+KPX aogonek ydieresis -20
+KPX aring g -10
+KPX aring gbreve -10
+KPX aring gcommaaccent -10
+KPX aring v -15
+KPX aring w -15
+KPX aring y -20
+KPX aring yacute -20
+KPX aring ydieresis -20
+KPX atilde g -10
+KPX atilde gbreve -10
+KPX atilde gcommaaccent -10
+KPX atilde v -15
+KPX atilde w -15
+KPX atilde y -20
+KPX atilde yacute -20
+KPX atilde ydieresis -20
+KPX b l -10
+KPX b lacute -10
+KPX b lcommaaccent -10
+KPX b lslash -10
+KPX b u -20
+KPX b uacute -20
+KPX b ucircumflex -20
+KPX b udieresis -20
+KPX b ugrave -20
+KPX b uhungarumlaut -20
+KPX b umacron -20
+KPX b uogonek -20
+KPX b uring -20
+KPX b v -20
+KPX b y -20
+KPX b yacute -20
+KPX b ydieresis -20
+KPX c h -10
+KPX c k -20
+KPX c kcommaaccent -20
+KPX c l -20
+KPX c lacute -20
+KPX c lcommaaccent -20
+KPX c lslash -20
+KPX c y -10
+KPX c yacute -10
+KPX c ydieresis -10
+KPX cacute h -10
+KPX cacute k -20
+KPX cacute kcommaaccent -20
+KPX cacute l -20
+KPX cacute lacute -20
+KPX cacute lcommaaccent -20
+KPX cacute lslash -20
+KPX cacute y -10
+KPX cacute yacute -10
+KPX cacute ydieresis -10
+KPX ccaron h -10
+KPX ccaron k -20
+KPX ccaron kcommaaccent -20
+KPX ccaron l -20
+KPX ccaron lacute -20
+KPX ccaron lcommaaccent -20
+KPX ccaron lslash -20
+KPX ccaron y -10
+KPX ccaron yacute -10
+KPX ccaron ydieresis -10
+KPX ccedilla h -10
+KPX ccedilla k -20
+KPX ccedilla kcommaaccent -20
+KPX ccedilla l -20
+KPX ccedilla lacute -20
+KPX ccedilla lcommaaccent -20
+KPX ccedilla lslash -20
+KPX ccedilla y -10
+KPX ccedilla yacute -10
+KPX ccedilla ydieresis -10
+KPX colon space -40
+KPX comma quotedblright -120
+KPX comma quoteright -120
+KPX comma space -40
+KPX d d -10
+KPX d dcroat -10
+KPX d v -15
+KPX d w -15
+KPX d y -15
+KPX d yacute -15
+KPX d ydieresis -15
+KPX dcroat d -10
+KPX dcroat dcroat -10
+KPX dcroat v -15
+KPX dcroat w -15
+KPX dcroat y -15
+KPX dcroat yacute -15
+KPX dcroat ydieresis -15
+KPX e comma 10
+KPX e period 20
+KPX e v -15
+KPX e w -15
+KPX e x -15
+KPX e y -15
+KPX e yacute -15
+KPX e ydieresis -15
+KPX eacute comma 10
+KPX eacute period 20
+KPX eacute v -15
+KPX eacute w -15
+KPX eacute x -15
+KPX eacute y -15
+KPX eacute yacute -15
+KPX eacute ydieresis -15
+KPX ecaron comma 10
+KPX ecaron period 20
+KPX ecaron v -15
+KPX ecaron w -15
+KPX ecaron x -15
+KPX ecaron y -15
+KPX ecaron yacute -15
+KPX ecaron ydieresis -15
+KPX ecircumflex comma 10
+KPX ecircumflex period 20
+KPX ecircumflex v -15
+KPX ecircumflex w -15
+KPX ecircumflex x -15
+KPX ecircumflex y -15
+KPX ecircumflex yacute -15
+KPX ecircumflex ydieresis -15
+KPX edieresis comma 10
+KPX edieresis period 20
+KPX edieresis v -15
+KPX edieresis w -15
+KPX edieresis x -15
+KPX edieresis y -15
+KPX edieresis yacute -15
+KPX edieresis ydieresis -15
+KPX edotaccent comma 10
+KPX edotaccent period 20
+KPX edotaccent v -15
+KPX edotaccent w -15
+KPX edotaccent x -15
+KPX edotaccent y -15
+KPX edotaccent yacute -15
+KPX edotaccent ydieresis -15
+KPX egrave comma 10
+KPX egrave period 20
+KPX egrave v -15
+KPX egrave w -15
+KPX egrave x -15
+KPX egrave y -15
+KPX egrave yacute -15
+KPX egrave ydieresis -15
+KPX emacron comma 10
+KPX emacron period 20
+KPX emacron v -15
+KPX emacron w -15
+KPX emacron x -15
+KPX emacron y -15
+KPX emacron yacute -15
+KPX emacron ydieresis -15
+KPX eogonek comma 10
+KPX eogonek period 20
+KPX eogonek v -15
+KPX eogonek w -15
+KPX eogonek x -15
+KPX eogonek y -15
+KPX eogonek yacute -15
+KPX eogonek ydieresis -15
+KPX f comma -10
+KPX f e -10
+KPX f eacute -10
+KPX f ecaron -10
+KPX f ecircumflex -10
+KPX f edieresis -10
+KPX f edotaccent -10
+KPX f egrave -10
+KPX f emacron -10
+KPX f eogonek -10
+KPX f o -20
+KPX f oacute -20
+KPX f ocircumflex -20
+KPX f odieresis -20
+KPX f ograve -20
+KPX f ohungarumlaut -20
+KPX f omacron -20
+KPX f oslash -20
+KPX f otilde -20
+KPX f period -10
+KPX f quotedblright 30
+KPX f quoteright 30
+KPX g e 10
+KPX g eacute 10
+KPX g ecaron 10
+KPX g ecircumflex 10
+KPX g edieresis 10
+KPX g edotaccent 10
+KPX g egrave 10
+KPX g emacron 10
+KPX g eogonek 10
+KPX g g -10
+KPX g gbreve -10
+KPX g gcommaaccent -10
+KPX gbreve e 10
+KPX gbreve eacute 10
+KPX gbreve ecaron 10
+KPX gbreve ecircumflex 10
+KPX gbreve edieresis 10
+KPX gbreve edotaccent 10
+KPX gbreve egrave 10
+KPX gbreve emacron 10
+KPX gbreve eogonek 10
+KPX gbreve g -10
+KPX gbreve gbreve -10
+KPX gbreve gcommaaccent -10
+KPX gcommaaccent e 10
+KPX gcommaaccent eacute 10
+KPX gcommaaccent ecaron 10
+KPX gcommaaccent ecircumflex 10
+KPX gcommaaccent edieresis 10
+KPX gcommaaccent edotaccent 10
+KPX gcommaaccent egrave 10
+KPX gcommaaccent emacron 10
+KPX gcommaaccent eogonek 10
+KPX gcommaaccent g -10
+KPX gcommaaccent gbreve -10
+KPX gcommaaccent gcommaaccent -10
+KPX h y -20
+KPX h yacute -20
+KPX h ydieresis -20
+KPX k o -15
+KPX k oacute -15
+KPX k ocircumflex -15
+KPX k odieresis -15
+KPX k ograve -15
+KPX k ohungarumlaut -15
+KPX k omacron -15
+KPX k oslash -15
+KPX k otilde -15
+KPX kcommaaccent o -15
+KPX kcommaaccent oacute -15
+KPX kcommaaccent ocircumflex -15
+KPX kcommaaccent odieresis -15
+KPX kcommaaccent ograve -15
+KPX kcommaaccent ohungarumlaut -15
+KPX kcommaaccent omacron -15
+KPX kcommaaccent oslash -15
+KPX kcommaaccent otilde -15
+KPX l w -15
+KPX l y -15
+KPX l yacute -15
+KPX l ydieresis -15
+KPX lacute w -15
+KPX lacute y -15
+KPX lacute yacute -15
+KPX lacute ydieresis -15
+KPX lcommaaccent w -15
+KPX lcommaaccent y -15
+KPX lcommaaccent yacute -15
+KPX lcommaaccent ydieresis -15
+KPX lslash w -15
+KPX lslash y -15
+KPX lslash yacute -15
+KPX lslash ydieresis -15
+KPX m u -20
+KPX m uacute -20
+KPX m ucircumflex -20
+KPX m udieresis -20
+KPX m ugrave -20
+KPX m uhungarumlaut -20
+KPX m umacron -20
+KPX m uogonek -20
+KPX m uring -20
+KPX m y -30
+KPX m yacute -30
+KPX m ydieresis -30
+KPX n u -10
+KPX n uacute -10
+KPX n ucircumflex -10
+KPX n udieresis -10
+KPX n ugrave -10
+KPX n uhungarumlaut -10
+KPX n umacron -10
+KPX n uogonek -10
+KPX n uring -10
+KPX n v -40
+KPX n y -20
+KPX n yacute -20
+KPX n ydieresis -20
+KPX nacute u -10
+KPX nacute uacute -10
+KPX nacute ucircumflex -10
+KPX nacute udieresis -10
+KPX nacute ugrave -10
+KPX nacute uhungarumlaut -10
+KPX nacute umacron -10
+KPX nacute uogonek -10
+KPX nacute uring -10
+KPX nacute v -40
+KPX nacute y -20
+KPX nacute yacute -20
+KPX nacute ydieresis -20
+KPX ncaron u -10
+KPX ncaron uacute -10
+KPX ncaron ucircumflex -10
+KPX ncaron udieresis -10
+KPX ncaron ugrave -10
+KPX ncaron uhungarumlaut -10
+KPX ncaron umacron -10
+KPX ncaron uogonek -10
+KPX ncaron uring -10
+KPX ncaron v -40
+KPX ncaron y -20
+KPX ncaron yacute -20
+KPX ncaron ydieresis -20
+KPX ncommaaccent u -10
+KPX ncommaaccent uacute -10
+KPX ncommaaccent ucircumflex -10
+KPX ncommaaccent udieresis -10
+KPX ncommaaccent ugrave -10
+KPX ncommaaccent uhungarumlaut -10
+KPX ncommaaccent umacron -10
+KPX ncommaaccent uogonek -10
+KPX ncommaaccent uring -10
+KPX ncommaaccent v -40
+KPX ncommaaccent y -20
+KPX ncommaaccent yacute -20
+KPX ncommaaccent ydieresis -20
+KPX ntilde u -10
+KPX ntilde uacute -10
+KPX ntilde ucircumflex -10
+KPX ntilde udieresis -10
+KPX ntilde ugrave -10
+KPX ntilde uhungarumlaut -10
+KPX ntilde umacron -10
+KPX ntilde uogonek -10
+KPX ntilde uring -10
+KPX ntilde v -40
+KPX ntilde y -20
+KPX ntilde yacute -20
+KPX ntilde ydieresis -20
+KPX o v -20
+KPX o w -15
+KPX o x -30
+KPX o y -20
+KPX o yacute -20
+KPX o ydieresis -20
+KPX oacute v -20
+KPX oacute w -15
+KPX oacute x -30
+KPX oacute y -20
+KPX oacute yacute -20
+KPX oacute ydieresis -20
+KPX ocircumflex v -20
+KPX ocircumflex w -15
+KPX ocircumflex x -30
+KPX ocircumflex y -20
+KPX ocircumflex yacute -20
+KPX ocircumflex ydieresis -20
+KPX odieresis v -20
+KPX odieresis w -15
+KPX odieresis x -30
+KPX odieresis y -20
+KPX odieresis yacute -20
+KPX odieresis ydieresis -20
+KPX ograve v -20
+KPX ograve w -15
+KPX ograve x -30
+KPX ograve y -20
+KPX ograve yacute -20
+KPX ograve ydieresis -20
+KPX ohungarumlaut v -20
+KPX ohungarumlaut w -15
+KPX ohungarumlaut x -30
+KPX ohungarumlaut y -20
+KPX ohungarumlaut yacute -20
+KPX ohungarumlaut ydieresis -20
+KPX omacron v -20
+KPX omacron w -15
+KPX omacron x -30
+KPX omacron y -20
+KPX omacron yacute -20
+KPX omacron ydieresis -20
+KPX oslash v -20
+KPX oslash w -15
+KPX oslash x -30
+KPX oslash y -20
+KPX oslash yacute -20
+KPX oslash ydieresis -20
+KPX otilde v -20
+KPX otilde w -15
+KPX otilde x -30
+KPX otilde y -20
+KPX otilde yacute -20
+KPX otilde ydieresis -20
+KPX p y -15
+KPX p yacute -15
+KPX p ydieresis -15
+KPX period quotedblright -120
+KPX period quoteright -120
+KPX period space -40
+KPX quotedblright space -80
+KPX quoteleft quoteleft -46
+KPX quoteright d -80
+KPX quoteright dcroat -80
+KPX quoteright l -20
+KPX quoteright lacute -20
+KPX quoteright lcommaaccent -20
+KPX quoteright lslash -20
+KPX quoteright quoteright -46
+KPX quoteright r -40
+KPX quoteright racute -40
+KPX quoteright rcaron -40
+KPX quoteright rcommaaccent -40
+KPX quoteright s -60
+KPX quoteright sacute -60
+KPX quoteright scaron -60
+KPX quoteright scedilla -60
+KPX quoteright scommaaccent -60
+KPX quoteright space -80
+KPX quoteright v -20
+KPX r c -20
+KPX r cacute -20
+KPX r ccaron -20
+KPX r ccedilla -20
+KPX r comma -60
+KPX r d -20
+KPX r dcroat -20
+KPX r g -15
+KPX r gbreve -15
+KPX r gcommaaccent -15
+KPX r hyphen -20
+KPX r o -20
+KPX r oacute -20
+KPX r ocircumflex -20
+KPX r odieresis -20
+KPX r ograve -20
+KPX r ohungarumlaut -20
+KPX r omacron -20
+KPX r oslash -20
+KPX r otilde -20
+KPX r period -60
+KPX r q -20
+KPX r s -15
+KPX r sacute -15
+KPX r scaron -15
+KPX r scedilla -15
+KPX r scommaaccent -15
+KPX r t 20
+KPX r tcommaaccent 20
+KPX r v 10
+KPX r y 10
+KPX r yacute 10
+KPX r ydieresis 10
+KPX racute c -20
+KPX racute cacute -20
+KPX racute ccaron -20
+KPX racute ccedilla -20
+KPX racute comma -60
+KPX racute d -20
+KPX racute dcroat -20
+KPX racute g -15
+KPX racute gbreve -15
+KPX racute gcommaaccent -15
+KPX racute hyphen -20
+KPX racute o -20
+KPX racute oacute -20
+KPX racute ocircumflex -20
+KPX racute odieresis -20
+KPX racute ograve -20
+KPX racute ohungarumlaut -20
+KPX racute omacron -20
+KPX racute oslash -20
+KPX racute otilde -20
+KPX racute period -60
+KPX racute q -20
+KPX racute s -15
+KPX racute sacute -15
+KPX racute scaron -15
+KPX racute scedilla -15
+KPX racute scommaaccent -15
+KPX racute t 20
+KPX racute tcommaaccent 20
+KPX racute v 10
+KPX racute y 10
+KPX racute yacute 10
+KPX racute ydieresis 10
+KPX rcaron c -20
+KPX rcaron cacute -20
+KPX rcaron ccaron -20
+KPX rcaron ccedilla -20
+KPX rcaron comma -60
+KPX rcaron d -20
+KPX rcaron dcroat -20
+KPX rcaron g -15
+KPX rcaron gbreve -15
+KPX rcaron gcommaaccent -15
+KPX rcaron hyphen -20
+KPX rcaron o -20
+KPX rcaron oacute -20
+KPX rcaron ocircumflex -20
+KPX rcaron odieresis -20
+KPX rcaron ograve -20
+KPX rcaron ohungarumlaut -20
+KPX rcaron omacron -20
+KPX rcaron oslash -20
+KPX rcaron otilde -20
+KPX rcaron period -60
+KPX rcaron q -20
+KPX rcaron s -15
+KPX rcaron sacute -15
+KPX rcaron scaron -15
+KPX rcaron scedilla -15
+KPX rcaron scommaaccent -15
+KPX rcaron t 20
+KPX rcaron tcommaaccent 20
+KPX rcaron v 10
+KPX rcaron y 10
+KPX rcaron yacute 10
+KPX rcaron ydieresis 10
+KPX rcommaaccent c -20
+KPX rcommaaccent cacute -20
+KPX rcommaaccent ccaron -20
+KPX rcommaaccent ccedilla -20
+KPX rcommaaccent comma -60
+KPX rcommaaccent d -20
+KPX rcommaaccent dcroat -20
+KPX rcommaaccent g -15
+KPX rcommaaccent gbreve -15
+KPX rcommaaccent gcommaaccent -15
+KPX rcommaaccent hyphen -20
+KPX rcommaaccent o -20
+KPX rcommaaccent oacute -20
+KPX rcommaaccent ocircumflex -20
+KPX rcommaaccent odieresis -20
+KPX rcommaaccent ograve -20
+KPX rcommaaccent ohungarumlaut -20
+KPX rcommaaccent omacron -20
+KPX rcommaaccent oslash -20
+KPX rcommaaccent otilde -20
+KPX rcommaaccent period -60
+KPX rcommaaccent q -20
+KPX rcommaaccent s -15
+KPX rcommaaccent sacute -15
+KPX rcommaaccent scaron -15
+KPX rcommaaccent scedilla -15
+KPX rcommaaccent scommaaccent -15
+KPX rcommaaccent t 20
+KPX rcommaaccent tcommaaccent 20
+KPX rcommaaccent v 10
+KPX rcommaaccent y 10
+KPX rcommaaccent yacute 10
+KPX rcommaaccent ydieresis 10
+KPX s w -15
+KPX sacute w -15
+KPX scaron w -15
+KPX scedilla w -15
+KPX scommaaccent w -15
+KPX semicolon space -40
+KPX space T -100
+KPX space Tcaron -100
+KPX space Tcommaaccent -100
+KPX space V -80
+KPX space W -80
+KPX space Y -120
+KPX space Yacute -120
+KPX space Ydieresis -120
+KPX space quotedblleft -80
+KPX space quoteleft -60
+KPX v a -20
+KPX v aacute -20
+KPX v abreve -20
+KPX v acircumflex -20
+KPX v adieresis -20
+KPX v agrave -20
+KPX v amacron -20
+KPX v aogonek -20
+KPX v aring -20
+KPX v atilde -20
+KPX v comma -80
+KPX v o -30
+KPX v oacute -30
+KPX v ocircumflex -30
+KPX v odieresis -30
+KPX v ograve -30
+KPX v ohungarumlaut -30
+KPX v omacron -30
+KPX v oslash -30
+KPX v otilde -30
+KPX v period -80
+KPX w comma -40
+KPX w o -20
+KPX w oacute -20
+KPX w ocircumflex -20
+KPX w odieresis -20
+KPX w ograve -20
+KPX w ohungarumlaut -20
+KPX w omacron -20
+KPX w oslash -20
+KPX w otilde -20
+KPX w period -40
+KPX x e -10
+KPX x eacute -10
+KPX x ecaron -10
+KPX x ecircumflex -10
+KPX x edieresis -10
+KPX x edotaccent -10
+KPX x egrave -10
+KPX x emacron -10
+KPX x eogonek -10
+KPX y a -30
+KPX y aacute -30
+KPX y abreve -30
+KPX y acircumflex -30
+KPX y adieresis -30
+KPX y agrave -30
+KPX y amacron -30
+KPX y aogonek -30
+KPX y aring -30
+KPX y atilde -30
+KPX y comma -80
+KPX y e -10
+KPX y eacute -10
+KPX y ecaron -10
+KPX y ecircumflex -10
+KPX y edieresis -10
+KPX y edotaccent -10
+KPX y egrave -10
+KPX y emacron -10
+KPX y eogonek -10
+KPX y o -25
+KPX y oacute -25
+KPX y ocircumflex -25
+KPX y odieresis -25
+KPX y ograve -25
+KPX y ohungarumlaut -25
+KPX y omacron -25
+KPX y oslash -25
+KPX y otilde -25
+KPX y period -80
+KPX yacute a -30
+KPX yacute aacute -30
+KPX yacute abreve -30
+KPX yacute acircumflex -30
+KPX yacute adieresis -30
+KPX yacute agrave -30
+KPX yacute amacron -30
+KPX yacute aogonek -30
+KPX yacute aring -30
+KPX yacute atilde -30
+KPX yacute comma -80
+KPX yacute e -10
+KPX yacute eacute -10
+KPX yacute ecaron -10
+KPX yacute ecircumflex -10
+KPX yacute edieresis -10
+KPX yacute edotaccent -10
+KPX yacute egrave -10
+KPX yacute emacron -10
+KPX yacute eogonek -10
+KPX yacute o -25
+KPX yacute oacute -25
+KPX yacute ocircumflex -25
+KPX yacute odieresis -25
+KPX yacute ograve -25
+KPX yacute ohungarumlaut -25
+KPX yacute omacron -25
+KPX yacute oslash -25
+KPX yacute otilde -25
+KPX yacute period -80
+KPX ydieresis a -30
+KPX ydieresis aacute -30
+KPX ydieresis abreve -30
+KPX ydieresis acircumflex -30
+KPX ydieresis adieresis -30
+KPX ydieresis agrave -30
+KPX ydieresis amacron -30
+KPX ydieresis aogonek -30
+KPX ydieresis aring -30
+KPX ydieresis atilde -30
+KPX ydieresis comma -80
+KPX ydieresis e -10
+KPX ydieresis eacute -10
+KPX ydieresis ecaron -10
+KPX ydieresis ecircumflex -10
+KPX ydieresis edieresis -10
+KPX ydieresis edotaccent -10
+KPX ydieresis egrave -10
+KPX ydieresis emacron -10
+KPX ydieresis eogonek -10
+KPX ydieresis o -25
+KPX ydieresis oacute -25
+KPX ydieresis ocircumflex -25
+KPX ydieresis odieresis -25
+KPX ydieresis ograve -25
+KPX ydieresis ohungarumlaut -25
+KPX ydieresis omacron -25
+KPX ydieresis oslash -25
+KPX ydieresis otilde -25
+KPX ydieresis period -80
+KPX z e 10
+KPX z eacute 10
+KPX z ecaron 10
+KPX z ecircumflex 10
+KPX z edieresis 10
+KPX z edotaccent 10
+KPX z egrave 10
+KPX z emacron 10
+KPX z eogonek 10
+KPX zacute e 10
+KPX zacute eacute 10
+KPX zacute ecaron 10
+KPX zacute ecircumflex 10
+KPX zacute edieresis 10
+KPX zacute edotaccent 10
+KPX zacute egrave 10
+KPX zacute emacron 10
+KPX zacute eogonek 10
+KPX zcaron e 10
+KPX zcaron eacute 10
+KPX zcaron ecaron 10
+KPX zcaron ecircumflex 10
+KPX zcaron edieresis 10
+KPX zcaron edotaccent 10
+KPX zcaron egrave 10
+KPX zcaron emacron 10
+KPX zcaron eogonek 10
+KPX zdotaccent e 10
+KPX zdotaccent eacute 10
+KPX zdotaccent ecaron 10
+KPX zdotaccent ecircumflex 10
+KPX zdotaccent edieresis 10
+KPX zdotaccent edotaccent 10
+KPX zdotaccent egrave 10
+KPX zdotaccent emacron 10
+KPX zdotaccent eogonek 10
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/src/fonts/Adobe-Core35_AFMs-314/Helvetica-NarrowOblique.afm b/src/fonts/Adobe-Core35_AFMs-314/Helvetica-NarrowOblique.afm
new file mode 100644
index 0000000..60b201a
--- /dev/null
+++ b/src/fonts/Adobe-Core35_AFMs-314/Helvetica-NarrowOblique.afm
@@ -0,0 +1,3049 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Fri May 2 17:03:30 1997
+Comment UniqueID 43180
+Comment VMusage 14960 69346
+FontName Helvetica-Narrow-Oblique
+FullName Helvetica Narrow Oblique
+FamilyName Helvetica
+Weight Medium
+ItalicAngle -12
+IsFixedPitch false
+FontBBox -139 -225 915 931
+UnderlinePosition -100
+UnderlineThickness 50
+Version 002.000
+Notice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries.
+EncodingScheme AdobeStandardEncoding
+CapHeight 718
+XHeight 523
+Ascender 718
+Descender -207
+StdHW 76
+StdVW 88
+StartCharMetrics 314
+C 32 ; WX 228 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 228 ; N exclam ; B 74 0 278 718 ;
+C 34 ; WX 291 ; N quotedbl ; B 138 463 359 718 ;
+C 35 ; WX 456 ; N numbersign ; B 60 0 517 688 ;
+C 36 ; WX 456 ; N dollar ; B 57 -115 506 775 ;
+C 37 ; WX 729 ; N percent ; B 120 -19 729 703 ;
+C 38 ; WX 547 ; N ampersand ; B 63 -15 530 718 ;
+C 39 ; WX 182 ; N quoteright ; B 124 463 254 718 ;
+C 40 ; WX 273 ; N parenleft ; B 89 -207 372 733 ;
+C 41 ; WX 273 ; N parenright ; B -7 -207 276 733 ;
+C 42 ; WX 319 ; N asterisk ; B 135 431 389 718 ;
+C 43 ; WX 479 ; N plus ; B 70 0 497 505 ;
+C 44 ; WX 228 ; N comma ; B 46 -147 175 106 ;
+C 45 ; WX 273 ; N hyphen ; B 77 232 293 322 ;
+C 46 ; WX 228 ; N period ; B 71 0 175 106 ;
+C 47 ; WX 228 ; N slash ; B -17 -19 370 737 ;
+C 48 ; WX 456 ; N zero ; B 77 -19 499 703 ;
+C 49 ; WX 456 ; N one ; B 170 0 417 703 ;
+C 50 ; WX 456 ; N two ; B 21 0 506 703 ;
+C 51 ; WX 456 ; N three ; B 61 -19 500 703 ;
+C 52 ; WX 456 ; N four ; B 50 0 472 703 ;
+C 53 ; WX 456 ; N five ; B 55 -19 509 688 ;
+C 54 ; WX 456 ; N six ; B 74 -19 505 703 ;
+C 55 ; WX 456 ; N seven ; B 112 0 549 688 ;
+C 56 ; WX 456 ; N eight ; B 60 -19 497 703 ;
+C 57 ; WX 456 ; N nine ; B 67 -19 499 703 ;
+C 58 ; WX 228 ; N colon ; B 71 0 247 516 ;
+C 59 ; WX 228 ; N semicolon ; B 46 -147 247 516 ;
+C 60 ; WX 479 ; N less ; B 77 11 526 495 ;
+C 61 ; WX 479 ; N equal ; B 52 115 515 390 ;
+C 62 ; WX 479 ; N greater ; B 41 11 490 495 ;
+C 63 ; WX 456 ; N question ; B 132 0 500 727 ;
+C 64 ; WX 832 ; N at ; B 176 -19 791 737 ;
+C 65 ; WX 547 ; N A ; B 11 0 536 718 ;
+C 66 ; WX 547 ; N B ; B 61 0 583 718 ;
+C 67 ; WX 592 ; N C ; B 88 -19 640 737 ;
+C 68 ; WX 592 ; N D ; B 66 0 626 718 ;
+C 69 ; WX 547 ; N E ; B 71 0 625 718 ;
+C 70 ; WX 501 ; N F ; B 71 0 603 718 ;
+C 71 ; WX 638 ; N G ; B 91 -19 655 737 ;
+C 72 ; WX 592 ; N H ; B 63 0 655 718 ;
+C 73 ; WX 228 ; N I ; B 75 0 279 718 ;
+C 74 ; WX 410 ; N J ; B 39 -19 476 718 ;
+C 75 ; WX 547 ; N K ; B 62 0 662 718 ;
+C 76 ; WX 456 ; N L ; B 62 0 455 718 ;
+C 77 ; WX 683 ; N M ; B 60 0 749 718 ;
+C 78 ; WX 592 ; N N ; B 62 0 655 718 ;
+C 79 ; WX 638 ; N O ; B 86 -19 677 737 ;
+C 80 ; WX 547 ; N P ; B 71 0 604 718 ;
+C 81 ; WX 638 ; N Q ; B 86 -56 677 737 ;
+C 82 ; WX 592 ; N R ; B 72 0 634 718 ;
+C 83 ; WX 547 ; N S ; B 74 -19 584 737 ;
+C 84 ; WX 501 ; N T ; B 122 0 615 718 ;
+C 85 ; WX 592 ; N U ; B 101 -19 653 718 ;
+C 86 ; WX 547 ; N V ; B 142 0 656 718 ;
+C 87 ; WX 774 ; N W ; B 138 0 886 718 ;
+C 88 ; WX 547 ; N X ; B 16 0 647 718 ;
+C 89 ; WX 547 ; N Y ; B 137 0 661 718 ;
+C 90 ; WX 501 ; N Z ; B 19 0 607 718 ;
+C 91 ; WX 228 ; N bracketleft ; B 17 -196 331 722 ;
+C 92 ; WX 228 ; N backslash ; B 115 -19 239 737 ;
+C 93 ; WX 228 ; N bracketright ; B -11 -196 302 722 ;
+C 94 ; WX 385 ; N asciicircum ; B 35 264 442 688 ;
+C 95 ; WX 456 ; N underscore ; B -22 -125 443 -75 ;
+C 96 ; WX 182 ; N quoteleft ; B 135 470 265 725 ;
+C 97 ; WX 456 ; N a ; B 50 -15 458 538 ;
+C 98 ; WX 456 ; N b ; B 48 -15 479 718 ;
+C 99 ; WX 410 ; N c ; B 61 -15 454 538 ;
+C 100 ; WX 456 ; N d ; B 69 -15 534 718 ;
+C 101 ; WX 456 ; N e ; B 69 -15 474 538 ;
+C 102 ; WX 228 ; N f ; B 71 0 341 728 ; L i fi ; L l fl ;
+C 103 ; WX 456 ; N g ; B 34 -220 500 538 ;
+C 104 ; WX 456 ; N h ; B 53 0 470 718 ;
+C 105 ; WX 182 ; N i ; B 55 0 252 718 ;
+C 106 ; WX 182 ; N j ; B -49 -210 252 718 ;
+C 107 ; WX 410 ; N k ; B 55 0 492 718 ;
+C 108 ; WX 182 ; N l ; B 55 0 252 718 ;
+C 109 ; WX 683 ; N m ; B 53 0 699 538 ;
+C 110 ; WX 456 ; N n ; B 53 0 470 538 ;
+C 111 ; WX 456 ; N o ; B 68 -14 479 538 ;
+C 112 ; WX 456 ; N p ; B 11 -207 479 538 ;
+C 113 ; WX 456 ; N q ; B 69 -207 496 538 ;
+C 114 ; WX 273 ; N r ; B 63 0 365 538 ;
+C 115 ; WX 410 ; N s ; B 52 -15 434 538 ;
+C 116 ; WX 228 ; N t ; B 84 -7 302 669 ;
+C 117 ; WX 456 ; N u ; B 77 -15 492 523 ;
+C 118 ; WX 410 ; N v ; B 98 0 495 523 ;
+C 119 ; WX 592 ; N w ; B 103 0 673 523 ;
+C 120 ; WX 410 ; N x ; B 9 0 487 523 ;
+C 121 ; WX 410 ; N y ; B 12 -214 492 523 ;
+C 122 ; WX 410 ; N z ; B 25 0 468 523 ;
+C 123 ; WX 274 ; N braceleft ; B 75 -196 365 722 ;
+C 124 ; WX 213 ; N bar ; B 38 -225 272 775 ;
+C 125 ; WX 274 ; N braceright ; B 0 -196 291 722 ;
+C 126 ; WX 479 ; N asciitilde ; B 91 180 476 326 ;
+C 161 ; WX 273 ; N exclamdown ; B 63 -195 267 523 ;
+C 162 ; WX 456 ; N cent ; B 78 -115 479 623 ;
+C 163 ; WX 456 ; N sterling ; B 40 -16 520 718 ;
+C 164 ; WX 137 ; N fraction ; B -139 -19 396 703 ;
+C 165 ; WX 456 ; N yen ; B 67 0 573 688 ;
+C 166 ; WX 456 ; N florin ; B -43 -207 537 737 ;
+C 167 ; WX 456 ; N section ; B 63 -191 479 737 ;
+C 168 ; WX 456 ; N currency ; B 49 99 530 603 ;
+C 169 ; WX 157 ; N quotesingle ; B 129 463 233 718 ;
+C 170 ; WX 273 ; N quotedblleft ; B 113 470 378 725 ;
+C 171 ; WX 456 ; N guillemotleft ; B 120 108 454 446 ;
+C 172 ; WX 273 ; N guilsinglleft ; B 112 108 279 446 ;
+C 173 ; WX 273 ; N guilsinglright ; B 91 108 257 446 ;
+C 174 ; WX 410 ; N fi ; B 71 0 481 728 ;
+C 175 ; WX 410 ; N fl ; B 71 0 479 728 ;
+C 177 ; WX 456 ; N endash ; B 42 240 510 313 ;
+C 178 ; WX 456 ; N dagger ; B 110 -159 510 718 ;
+C 179 ; WX 456 ; N daggerdbl ; B 43 -159 511 718 ;
+C 180 ; WX 228 ; N periodcentered ; B 106 190 211 315 ;
+C 182 ; WX 440 ; N paragraph ; B 103 -173 533 718 ;
+C 183 ; WX 287 ; N bullet ; B 74 202 339 517 ;
+C 184 ; WX 182 ; N quotesinglbase ; B 17 -149 147 106 ;
+C 185 ; WX 273 ; N quotedblbase ; B -5 -149 260 106 ;
+C 186 ; WX 273 ; N quotedblright ; B 102 463 367 718 ;
+C 187 ; WX 456 ; N guillemotright ; B 98 108 433 446 ;
+C 188 ; WX 820 ; N ellipsis ; B 94 0 744 106 ;
+C 189 ; WX 820 ; N perthousand ; B 72 -19 844 703 ;
+C 191 ; WX 501 ; N questiondown ; B 70 -201 438 525 ;
+C 193 ; WX 273 ; N grave ; B 139 593 276 734 ;
+C 194 ; WX 273 ; N acute ; B 203 593 390 734 ;
+C 195 ; WX 273 ; N circumflex ; B 121 593 359 734 ;
+C 196 ; WX 273 ; N tilde ; B 102 606 402 722 ;
+C 197 ; WX 273 ; N macron ; B 117 627 384 684 ;
+C 198 ; WX 273 ; N breve ; B 137 595 391 731 ;
+C 199 ; WX 273 ; N dotaccent ; B 204 604 297 706 ;
+C 200 ; WX 273 ; N dieresis ; B 138 604 363 706 ;
+C 202 ; WX 273 ; N ring ; B 175 572 330 756 ;
+C 203 ; WX 273 ; N cedilla ; B 2 -225 191 0 ;
+C 205 ; WX 273 ; N hungarumlaut ; B 129 593 463 734 ;
+C 206 ; WX 273 ; N ogonek ; B 35 -225 204 0 ;
+C 207 ; WX 273 ; N caron ; B 145 593 384 734 ;
+C 208 ; WX 820 ; N emdash ; B 42 240 875 313 ;
+C 225 ; WX 820 ; N AE ; B 7 0 899 718 ;
+C 227 ; WX 303 ; N ordfeminine ; B 104 405 368 737 ;
+C 232 ; WX 456 ; N Lslash ; B 34 0 455 718 ;
+C 233 ; WX 638 ; N Oslash ; B 35 -19 730 737 ;
+C 234 ; WX 820 ; N OE ; B 80 -19 915 737 ;
+C 235 ; WX 299 ; N ordmasculine ; B 115 405 384 737 ;
+C 241 ; WX 729 ; N ae ; B 50 -15 746 538 ;
+C 245 ; WX 228 ; N dotlessi ; B 78 0 241 523 ;
+C 248 ; WX 182 ; N lslash ; B 34 0 284 718 ;
+C 249 ; WX 501 ; N oslash ; B 24 -22 531 545 ;
+C 250 ; WX 774 ; N oe ; B 68 -15 791 538 ;
+C 251 ; WX 501 ; N germandbls ; B 55 -15 539 728 ;
+C -1 ; WX 228 ; N Idieresis ; B 75 0 375 901 ;
+C -1 ; WX 456 ; N eacute ; B 69 -15 481 734 ;
+C -1 ; WX 456 ; N abreve ; B 50 -15 474 731 ;
+C -1 ; WX 456 ; N uhungarumlaut ; B 77 -15 555 734 ;
+C -1 ; WX 456 ; N ecaron ; B 69 -15 476 734 ;
+C -1 ; WX 547 ; N Ydieresis ; B 137 0 661 901 ;
+C -1 ; WX 479 ; N divide ; B 70 -19 497 524 ;
+C -1 ; WX 547 ; N Yacute ; B 137 0 661 929 ;
+C -1 ; WX 547 ; N Acircumflex ; B 11 0 536 929 ;
+C -1 ; WX 456 ; N aacute ; B 50 -15 481 734 ;
+C -1 ; WX 592 ; N Ucircumflex ; B 101 -19 653 929 ;
+C -1 ; WX 410 ; N yacute ; B 12 -214 492 734 ;
+C -1 ; WX 410 ; N scommaaccent ; B 52 -225 434 538 ;
+C -1 ; WX 456 ; N ecircumflex ; B 69 -15 474 734 ;
+C -1 ; WX 592 ; N Uring ; B 101 -19 653 931 ;
+C -1 ; WX 592 ; N Udieresis ; B 101 -19 653 901 ;
+C -1 ; WX 456 ; N aogonek ; B 50 -220 458 538 ;
+C -1 ; WX 592 ; N Uacute ; B 101 -19 653 929 ;
+C -1 ; WX 456 ; N uogonek ; B 77 -225 492 523 ;
+C -1 ; WX 547 ; N Edieresis ; B 71 0 625 901 ;
+C -1 ; WX 592 ; N Dcroat ; B 57 0 626 718 ;
+C -1 ; WX 205 ; N commaaccent ; B 32 -225 141 -40 ;
+C -1 ; WX 604 ; N copyright ; B 44 -19 687 737 ;
+C -1 ; WX 547 ; N Emacron ; B 71 0 625 879 ;
+C -1 ; WX 410 ; N ccaron ; B 61 -15 454 734 ;
+C -1 ; WX 456 ; N aring ; B 50 -15 458 756 ;
+C -1 ; WX 592 ; N Ncommaaccent ; B 62 -225 655 718 ;
+C -1 ; WX 182 ; N lacute ; B 55 0 378 929 ;
+C -1 ; WX 456 ; N agrave ; B 50 -15 458 734 ;
+C -1 ; WX 501 ; N Tcommaaccent ; B 122 -225 615 718 ;
+C -1 ; WX 592 ; N Cacute ; B 88 -19 640 929 ;
+C -1 ; WX 456 ; N atilde ; B 50 -15 486 722 ;
+C -1 ; WX 547 ; N Edotaccent ; B 71 0 625 901 ;
+C -1 ; WX 410 ; N scaron ; B 52 -15 453 734 ;
+C -1 ; WX 410 ; N scedilla ; B 52 -225 434 538 ;
+C -1 ; WX 228 ; N iacute ; B 78 0 367 734 ;
+C -1 ; WX 386 ; N lozenge ; B 72 0 443 728 ;
+C -1 ; WX 592 ; N Rcaron ; B 72 0 634 929 ;
+C -1 ; WX 638 ; N Gcommaaccent ; B 91 -225 655 737 ;
+C -1 ; WX 456 ; N ucircumflex ; B 77 -15 492 734 ;
+C -1 ; WX 456 ; N acircumflex ; B 50 -15 458 734 ;
+C -1 ; WX 547 ; N Amacron ; B 11 0 555 879 ;
+C -1 ; WX 273 ; N rcaron ; B 63 0 417 734 ;
+C -1 ; WX 410 ; N ccedilla ; B 62 -225 454 538 ;
+C -1 ; WX 501 ; N Zdotaccent ; B 19 0 607 901 ;
+C -1 ; WX 547 ; N Thorn ; B 71 0 584 718 ;
+C -1 ; WX 638 ; N Omacron ; B 86 -19 677 879 ;
+C -1 ; WX 592 ; N Racute ; B 72 0 634 929 ;
+C -1 ; WX 547 ; N Sacute ; B 74 -19 584 929 ;
+C -1 ; WX 527 ; N dcaron ; B 69 -15 662 718 ;
+C -1 ; WX 592 ; N Umacron ; B 101 -19 653 879 ;
+C -1 ; WX 456 ; N uring ; B 77 -15 492 756 ;
+C -1 ; WX 273 ; N threesuperior ; B 74 270 358 703 ;
+C -1 ; WX 638 ; N Ograve ; B 86 -19 677 929 ;
+C -1 ; WX 547 ; N Agrave ; B 11 0 536 929 ;
+C -1 ; WX 547 ; N Abreve ; B 11 0 562 926 ;
+C -1 ; WX 479 ; N multiply ; B 41 0 526 506 ;
+C -1 ; WX 456 ; N uacute ; B 77 -15 492 734 ;
+C -1 ; WX 501 ; N Tcaron ; B 122 0 615 929 ;
+C -1 ; WX 390 ; N partialdiff ; B 34 -38 451 714 ;
+C -1 ; WX 410 ; N ydieresis ; B 12 -214 492 706 ;
+C -1 ; WX 592 ; N Nacute ; B 62 0 655 929 ;
+C -1 ; WX 228 ; N icircumflex ; B 78 0 337 734 ;
+C -1 ; WX 547 ; N Ecircumflex ; B 71 0 625 929 ;
+C -1 ; WX 456 ; N adieresis ; B 50 -15 458 706 ;
+C -1 ; WX 456 ; N edieresis ; B 69 -15 474 706 ;
+C -1 ; WX 410 ; N cacute ; B 61 -15 458 734 ;
+C -1 ; WX 456 ; N nacute ; B 53 0 481 734 ;
+C -1 ; WX 456 ; N umacron ; B 77 -15 492 684 ;
+C -1 ; WX 592 ; N Ncaron ; B 62 0 655 929 ;
+C -1 ; WX 228 ; N Iacute ; B 75 0 401 929 ;
+C -1 ; WX 479 ; N plusminus ; B 32 0 507 506 ;
+C -1 ; WX 213 ; N brokenbar ; B 51 -150 259 700 ;
+C -1 ; WX 604 ; N registered ; B 44 -19 687 737 ;
+C -1 ; WX 638 ; N Gbreve ; B 91 -19 655 926 ;
+C -1 ; WX 228 ; N Idotaccent ; B 75 0 309 901 ;
+C -1 ; WX 492 ; N summation ; B 12 -10 550 706 ;
+C -1 ; WX 547 ; N Egrave ; B 71 0 625 929 ;
+C -1 ; WX 273 ; N racute ; B 63 0 390 734 ;
+C -1 ; WX 456 ; N omacron ; B 68 -14 479 684 ;
+C -1 ; WX 501 ; N Zacute ; B 19 0 607 929 ;
+C -1 ; WX 501 ; N Zcaron ; B 19 0 607 929 ;
+C -1 ; WX 450 ; N greaterequal ; B 21 0 509 674 ;
+C -1 ; WX 592 ; N Eth ; B 57 0 626 718 ;
+C -1 ; WX 592 ; N Ccedilla ; B 88 -225 640 737 ;
+C -1 ; WX 182 ; N lcommaaccent ; B 21 -225 252 718 ;
+C -1 ; WX 260 ; N tcaron ; B 84 -7 411 808 ;
+C -1 ; WX 456 ; N eogonek ; B 69 -225 474 538 ;
+C -1 ; WX 592 ; N Uogonek ; B 101 -225 653 718 ;
+C -1 ; WX 547 ; N Aacute ; B 11 0 560 929 ;
+C -1 ; WX 547 ; N Adieresis ; B 11 0 536 901 ;
+C -1 ; WX 456 ; N egrave ; B 69 -15 474 734 ;
+C -1 ; WX 410 ; N zacute ; B 25 0 468 734 ;
+C -1 ; WX 182 ; N iogonek ; B -50 -225 252 718 ;
+C -1 ; WX 638 ; N Oacute ; B 86 -19 677 929 ;
+C -1 ; WX 456 ; N oacute ; B 68 -14 481 734 ;
+C -1 ; WX 456 ; N amacron ; B 50 -15 476 684 ;
+C -1 ; WX 410 ; N sacute ; B 52 -15 458 734 ;
+C -1 ; WX 228 ; N idieresis ; B 78 0 341 706 ;
+C -1 ; WX 638 ; N Ocircumflex ; B 86 -19 677 929 ;
+C -1 ; WX 592 ; N Ugrave ; B 101 -19 653 929 ;
+C -1 ; WX 502 ; N Delta ; B 5 0 499 688 ;
+C -1 ; WX 456 ; N thorn ; B 11 -207 479 718 ;
+C -1 ; WX 273 ; N twosuperior ; B 52 281 368 703 ;
+C -1 ; WX 638 ; N Odieresis ; B 86 -19 677 901 ;
+C -1 ; WX 456 ; N mu ; B 20 -207 492 523 ;
+C -1 ; WX 228 ; N igrave ; B 78 0 254 734 ;
+C -1 ; WX 456 ; N ohungarumlaut ; B 68 -14 555 734 ;
+C -1 ; WX 547 ; N Eogonek ; B 71 -220 625 718 ;
+C -1 ; WX 456 ; N dcroat ; B 69 -15 565 718 ;
+C -1 ; WX 684 ; N threequarters ; B 106 -19 706 703 ;
+C -1 ; WX 547 ; N Scedilla ; B 74 -225 584 737 ;
+C -1 ; WX 245 ; N lcaron ; B 55 0 380 718 ;
+C -1 ; WX 547 ; N Kcommaaccent ; B 62 -225 662 718 ;
+C -1 ; WX 456 ; N Lacute ; B 62 0 455 929 ;
+C -1 ; WX 820 ; N trademark ; B 152 306 866 718 ;
+C -1 ; WX 456 ; N edotaccent ; B 69 -15 474 706 ;
+C -1 ; WX 228 ; N Igrave ; B 75 0 288 929 ;
+C -1 ; WX 228 ; N Imacron ; B 75 0 396 879 ;
+C -1 ; WX 456 ; N Lcaron ; B 62 0 467 718 ;
+C -1 ; WX 684 ; N onehalf ; B 93 -19 688 703 ;
+C -1 ; WX 450 ; N lessequal ; B 21 0 546 674 ;
+C -1 ; WX 456 ; N ocircumflex ; B 68 -14 479 734 ;
+C -1 ; WX 456 ; N ntilde ; B 53 0 486 722 ;
+C -1 ; WX 592 ; N Uhungarumlaut ; B 101 -19 657 929 ;
+C -1 ; WX 547 ; N Eacute ; B 71 0 625 929 ;
+C -1 ; WX 456 ; N emacron ; B 69 -15 476 684 ;
+C -1 ; WX 456 ; N gbreve ; B 34 -220 500 731 ;
+C -1 ; WX 684 ; N onequarter ; B 123 -19 658 703 ;
+C -1 ; WX 547 ; N Scaron ; B 74 -19 584 929 ;
+C -1 ; WX 547 ; N Scommaaccent ; B 74 -225 584 737 ;
+C -1 ; WX 638 ; N Ohungarumlaut ; B 86 -19 680 929 ;
+C -1 ; WX 328 ; N degree ; B 138 411 384 703 ;
+C -1 ; WX 456 ; N ograve ; B 68 -14 479 734 ;
+C -1 ; WX 592 ; N Ccaron ; B 88 -19 640 929 ;
+C -1 ; WX 456 ; N ugrave ; B 77 -15 492 734 ;
+C -1 ; WX 371 ; N radical ; B 65 -80 506 762 ;
+C -1 ; WX 592 ; N Dcaron ; B 66 0 626 929 ;
+C -1 ; WX 273 ; N rcommaaccent ; B 25 -225 365 538 ;
+C -1 ; WX 592 ; N Ntilde ; B 62 0 655 917 ;
+C -1 ; WX 456 ; N otilde ; B 68 -14 494 722 ;
+C -1 ; WX 592 ; N Rcommaaccent ; B 72 -225 634 718 ;
+C -1 ; WX 456 ; N Lcommaaccent ; B 62 -225 455 718 ;
+C -1 ; WX 547 ; N Atilde ; B 11 0 573 917 ;
+C -1 ; WX 547 ; N Aogonek ; B 11 -225 536 718 ;
+C -1 ; WX 547 ; N Aring ; B 11 0 536 931 ;
+C -1 ; WX 638 ; N Otilde ; B 86 -19 677 917 ;
+C -1 ; WX 410 ; N zdotaccent ; B 25 0 468 706 ;
+C -1 ; WX 547 ; N Ecaron ; B 71 0 625 929 ;
+C -1 ; WX 228 ; N Iogonek ; B -27 -225 279 718 ;
+C -1 ; WX 410 ; N kcommaaccent ; B 55 -225 492 718 ;
+C -1 ; WX 479 ; N minus ; B 70 216 497 289 ;
+C -1 ; WX 228 ; N Icircumflex ; B 75 0 371 929 ;
+C -1 ; WX 456 ; N ncaron ; B 53 0 476 734 ;
+C -1 ; WX 228 ; N tcommaaccent ; B 52 -225 302 669 ;
+C -1 ; WX 479 ; N logicalnot ; B 87 108 515 390 ;
+C -1 ; WX 456 ; N odieresis ; B 68 -14 479 706 ;
+C -1 ; WX 456 ; N udieresis ; B 77 -15 492 706 ;
+C -1 ; WX 450 ; N notequal ; B 28 -35 511 551 ;
+C -1 ; WX 456 ; N gcommaaccent ; B 34 -220 500 822 ;
+C -1 ; WX 456 ; N eth ; B 67 -15 506 737 ;
+C -1 ; WX 410 ; N zcaron ; B 25 0 468 734 ;
+C -1 ; WX 456 ; N ncommaaccent ; B 53 -225 470 538 ;
+C -1 ; WX 273 ; N onesuperior ; B 136 281 305 703 ;
+C -1 ; WX 228 ; N imacron ; B 78 0 342 684 ;
+EndCharMetrics
+StartKernData
+StartKernPairs 2705
+KPX A C -30
+KPX A Cacute -30
+KPX A Ccaron -30
+KPX A Ccedilla -30
+KPX A G -30
+KPX A Gbreve -30
+KPX A Gcommaaccent -30
+KPX A O -30
+KPX A Oacute -30
+KPX A Ocircumflex -30
+KPX A Odieresis -30
+KPX A Ograve -30
+KPX A Ohungarumlaut -30
+KPX A Omacron -30
+KPX A Oslash -30
+KPX A Otilde -30
+KPX A Q -30
+KPX A T -120
+KPX A Tcaron -120
+KPX A Tcommaaccent -120
+KPX A U -50
+KPX A Uacute -50
+KPX A Ucircumflex -50
+KPX A Udieresis -50
+KPX A Ugrave -50
+KPX A Uhungarumlaut -50
+KPX A Umacron -50
+KPX A Uogonek -50
+KPX A Uring -50
+KPX A V -70
+KPX A W -50
+KPX A Y -100
+KPX A Yacute -100
+KPX A Ydieresis -100
+KPX A u -30
+KPX A uacute -30
+KPX A ucircumflex -30
+KPX A udieresis -30
+KPX A ugrave -30
+KPX A uhungarumlaut -30
+KPX A umacron -30
+KPX A uogonek -30
+KPX A uring -30
+KPX A v -40
+KPX A w -40
+KPX A y -40
+KPX A yacute -40
+KPX A ydieresis -40
+KPX Aacute C -30
+KPX Aacute Cacute -30
+KPX Aacute Ccaron -30
+KPX Aacute Ccedilla -30
+KPX Aacute G -30
+KPX Aacute Gbreve -30
+KPX Aacute Gcommaaccent -30
+KPX Aacute O -30
+KPX Aacute Oacute -30
+KPX Aacute Ocircumflex -30
+KPX Aacute Odieresis -30
+KPX Aacute Ograve -30
+KPX Aacute Ohungarumlaut -30
+KPX Aacute Omacron -30
+KPX Aacute Oslash -30
+KPX Aacute Otilde -30
+KPX Aacute Q -30
+KPX Aacute T -120
+KPX Aacute Tcaron -120
+KPX Aacute Tcommaaccent -120
+KPX Aacute U -50
+KPX Aacute Uacute -50
+KPX Aacute Ucircumflex -50
+KPX Aacute Udieresis -50
+KPX Aacute Ugrave -50
+KPX Aacute Uhungarumlaut -50
+KPX Aacute Umacron -50
+KPX Aacute Uogonek -50
+KPX Aacute Uring -50
+KPX Aacute V -70
+KPX Aacute W -50
+KPX Aacute Y -100
+KPX Aacute Yacute -100
+KPX Aacute Ydieresis -100
+KPX Aacute u -30
+KPX Aacute uacute -30
+KPX Aacute ucircumflex -30
+KPX Aacute udieresis -30
+KPX Aacute ugrave -30
+KPX Aacute uhungarumlaut -30
+KPX Aacute umacron -30
+KPX Aacute uogonek -30
+KPX Aacute uring -30
+KPX Aacute v -40
+KPX Aacute w -40
+KPX Aacute y -40
+KPX Aacute yacute -40
+KPX Aacute ydieresis -40
+KPX Abreve C -30
+KPX Abreve Cacute -30
+KPX Abreve Ccaron -30
+KPX Abreve Ccedilla -30
+KPX Abreve G -30
+KPX Abreve Gbreve -30
+KPX Abreve Gcommaaccent -30
+KPX Abreve O -30
+KPX Abreve Oacute -30
+KPX Abreve Ocircumflex -30
+KPX Abreve Odieresis -30
+KPX Abreve Ograve -30
+KPX Abreve Ohungarumlaut -30
+KPX Abreve Omacron -30
+KPX Abreve Oslash -30
+KPX Abreve Otilde -30
+KPX Abreve Q -30
+KPX Abreve T -120
+KPX Abreve Tcaron -120
+KPX Abreve Tcommaaccent -120
+KPX Abreve U -50
+KPX Abreve Uacute -50
+KPX Abreve Ucircumflex -50
+KPX Abreve Udieresis -50
+KPX Abreve Ugrave -50
+KPX Abreve Uhungarumlaut -50
+KPX Abreve Umacron -50
+KPX Abreve Uogonek -50
+KPX Abreve Uring -50
+KPX Abreve V -70
+KPX Abreve W -50
+KPX Abreve Y -100
+KPX Abreve Yacute -100
+KPX Abreve Ydieresis -100
+KPX Abreve u -30
+KPX Abreve uacute -30
+KPX Abreve ucircumflex -30
+KPX Abreve udieresis -30
+KPX Abreve ugrave -30
+KPX Abreve uhungarumlaut -30
+KPX Abreve umacron -30
+KPX Abreve uogonek -30
+KPX Abreve uring -30
+KPX Abreve v -40
+KPX Abreve w -40
+KPX Abreve y -40
+KPX Abreve yacute -40
+KPX Abreve ydieresis -40
+KPX Acircumflex C -30
+KPX Acircumflex Cacute -30
+KPX Acircumflex Ccaron -30
+KPX Acircumflex Ccedilla -30
+KPX Acircumflex G -30
+KPX Acircumflex Gbreve -30
+KPX Acircumflex Gcommaaccent -30
+KPX Acircumflex O -30
+KPX Acircumflex Oacute -30
+KPX Acircumflex Ocircumflex -30
+KPX Acircumflex Odieresis -30
+KPX Acircumflex Ograve -30
+KPX Acircumflex Ohungarumlaut -30
+KPX Acircumflex Omacron -30
+KPX Acircumflex Oslash -30
+KPX Acircumflex Otilde -30
+KPX Acircumflex Q -30
+KPX Acircumflex T -120
+KPX Acircumflex Tcaron -120
+KPX Acircumflex Tcommaaccent -120
+KPX Acircumflex U -50
+KPX Acircumflex Uacute -50
+KPX Acircumflex Ucircumflex -50
+KPX Acircumflex Udieresis -50
+KPX Acircumflex Ugrave -50
+KPX Acircumflex Uhungarumlaut -50
+KPX Acircumflex Umacron -50
+KPX Acircumflex Uogonek -50
+KPX Acircumflex Uring -50
+KPX Acircumflex V -70
+KPX Acircumflex W -50
+KPX Acircumflex Y -100
+KPX Acircumflex Yacute -100
+KPX Acircumflex Ydieresis -100
+KPX Acircumflex u -30
+KPX Acircumflex uacute -30
+KPX Acircumflex ucircumflex -30
+KPX Acircumflex udieresis -30
+KPX Acircumflex ugrave -30
+KPX Acircumflex uhungarumlaut -30
+KPX Acircumflex umacron -30
+KPX Acircumflex uogonek -30
+KPX Acircumflex uring -30
+KPX Acircumflex v -40
+KPX Acircumflex w -40
+KPX Acircumflex y -40
+KPX Acircumflex yacute -40
+KPX Acircumflex ydieresis -40
+KPX Adieresis C -30
+KPX Adieresis Cacute -30
+KPX Adieresis Ccaron -30
+KPX Adieresis Ccedilla -30
+KPX Adieresis G -30
+KPX Adieresis Gbreve -30
+KPX Adieresis Gcommaaccent -30
+KPX Adieresis O -30
+KPX Adieresis Oacute -30
+KPX Adieresis Ocircumflex -30
+KPX Adieresis Odieresis -30
+KPX Adieresis Ograve -30
+KPX Adieresis Ohungarumlaut -30
+KPX Adieresis Omacron -30
+KPX Adieresis Oslash -30
+KPX Adieresis Otilde -30
+KPX Adieresis Q -30
+KPX Adieresis T -120
+KPX Adieresis Tcaron -120
+KPX Adieresis Tcommaaccent -120
+KPX Adieresis U -50
+KPX Adieresis Uacute -50
+KPX Adieresis Ucircumflex -50
+KPX Adieresis Udieresis -50
+KPX Adieresis Ugrave -50
+KPX Adieresis Uhungarumlaut -50
+KPX Adieresis Umacron -50
+KPX Adieresis Uogonek -50
+KPX Adieresis Uring -50
+KPX Adieresis V -70
+KPX Adieresis W -50
+KPX Adieresis Y -100
+KPX Adieresis Yacute -100
+KPX Adieresis Ydieresis -100
+KPX Adieresis u -30
+KPX Adieresis uacute -30
+KPX Adieresis ucircumflex -30
+KPX Adieresis udieresis -30
+KPX Adieresis ugrave -30
+KPX Adieresis uhungarumlaut -30
+KPX Adieresis umacron -30
+KPX Adieresis uogonek -30
+KPX Adieresis uring -30
+KPX Adieresis v -40
+KPX Adieresis w -40
+KPX Adieresis y -40
+KPX Adieresis yacute -40
+KPX Adieresis ydieresis -40
+KPX Agrave C -30
+KPX Agrave Cacute -30
+KPX Agrave Ccaron -30
+KPX Agrave Ccedilla -30
+KPX Agrave G -30
+KPX Agrave Gbreve -30
+KPX Agrave Gcommaaccent -30
+KPX Agrave O -30
+KPX Agrave Oacute -30
+KPX Agrave Ocircumflex -30
+KPX Agrave Odieresis -30
+KPX Agrave Ograve -30
+KPX Agrave Ohungarumlaut -30
+KPX Agrave Omacron -30
+KPX Agrave Oslash -30
+KPX Agrave Otilde -30
+KPX Agrave Q -30
+KPX Agrave T -120
+KPX Agrave Tcaron -120
+KPX Agrave Tcommaaccent -120
+KPX Agrave U -50
+KPX Agrave Uacute -50
+KPX Agrave Ucircumflex -50
+KPX Agrave Udieresis -50
+KPX Agrave Ugrave -50
+KPX Agrave Uhungarumlaut -50
+KPX Agrave Umacron -50
+KPX Agrave Uogonek -50
+KPX Agrave Uring -50
+KPX Agrave V -70
+KPX Agrave W -50
+KPX Agrave Y -100
+KPX Agrave Yacute -100
+KPX Agrave Ydieresis -100
+KPX Agrave u -30
+KPX Agrave uacute -30
+KPX Agrave ucircumflex -30
+KPX Agrave udieresis -30
+KPX Agrave ugrave -30
+KPX Agrave uhungarumlaut -30
+KPX Agrave umacron -30
+KPX Agrave uogonek -30
+KPX Agrave uring -30
+KPX Agrave v -40
+KPX Agrave w -40
+KPX Agrave y -40
+KPX Agrave yacute -40
+KPX Agrave ydieresis -40
+KPX Amacron C -30
+KPX Amacron Cacute -30
+KPX Amacron Ccaron -30
+KPX Amacron Ccedilla -30
+KPX Amacron G -30
+KPX Amacron Gbreve -30
+KPX Amacron Gcommaaccent -30
+KPX Amacron O -30
+KPX Amacron Oacute -30
+KPX Amacron Ocircumflex -30
+KPX Amacron Odieresis -30
+KPX Amacron Ograve -30
+KPX Amacron Ohungarumlaut -30
+KPX Amacron Omacron -30
+KPX Amacron Oslash -30
+KPX Amacron Otilde -30
+KPX Amacron Q -30
+KPX Amacron T -120
+KPX Amacron Tcaron -120
+KPX Amacron Tcommaaccent -120
+KPX Amacron U -50
+KPX Amacron Uacute -50
+KPX Amacron Ucircumflex -50
+KPX Amacron Udieresis -50
+KPX Amacron Ugrave -50
+KPX Amacron Uhungarumlaut -50
+KPX Amacron Umacron -50
+KPX Amacron Uogonek -50
+KPX Amacron Uring -50
+KPX Amacron V -70
+KPX Amacron W -50
+KPX Amacron Y -100
+KPX Amacron Yacute -100
+KPX Amacron Ydieresis -100
+KPX Amacron u -30
+KPX Amacron uacute -30
+KPX Amacron ucircumflex -30
+KPX Amacron udieresis -30
+KPX Amacron ugrave -30
+KPX Amacron uhungarumlaut -30
+KPX Amacron umacron -30
+KPX Amacron uogonek -30
+KPX Amacron uring -30
+KPX Amacron v -40
+KPX Amacron w -40
+KPX Amacron y -40
+KPX Amacron yacute -40
+KPX Amacron ydieresis -40
+KPX Aogonek C -30
+KPX Aogonek Cacute -30
+KPX Aogonek Ccaron -30
+KPX Aogonek Ccedilla -30
+KPX Aogonek G -30
+KPX Aogonek Gbreve -30
+KPX Aogonek Gcommaaccent -30
+KPX Aogonek O -30
+KPX Aogonek Oacute -30
+KPX Aogonek Ocircumflex -30
+KPX Aogonek Odieresis -30
+KPX Aogonek Ograve -30
+KPX Aogonek Ohungarumlaut -30
+KPX Aogonek Omacron -30
+KPX Aogonek Oslash -30
+KPX Aogonek Otilde -30
+KPX Aogonek Q -30
+KPX Aogonek T -120
+KPX Aogonek Tcaron -120
+KPX Aogonek Tcommaaccent -120
+KPX Aogonek U -50
+KPX Aogonek Uacute -50
+KPX Aogonek Ucircumflex -50
+KPX Aogonek Udieresis -50
+KPX Aogonek Ugrave -50
+KPX Aogonek Uhungarumlaut -50
+KPX Aogonek Umacron -50
+KPX Aogonek Uogonek -50
+KPX Aogonek Uring -50
+KPX Aogonek V -70
+KPX Aogonek W -50
+KPX Aogonek Y -100
+KPX Aogonek Yacute -100
+KPX Aogonek Ydieresis -100
+KPX Aogonek u -30
+KPX Aogonek uacute -30
+KPX Aogonek ucircumflex -30
+KPX Aogonek udieresis -30
+KPX Aogonek ugrave -30
+KPX Aogonek uhungarumlaut -30
+KPX Aogonek umacron -30
+KPX Aogonek uogonek -30
+KPX Aogonek uring -30
+KPX Aogonek v -40
+KPX Aogonek w -40
+KPX Aogonek y -40
+KPX Aogonek yacute -40
+KPX Aogonek ydieresis -40
+KPX Aring C -30
+KPX Aring Cacute -30
+KPX Aring Ccaron -30
+KPX Aring Ccedilla -30
+KPX Aring G -30
+KPX Aring Gbreve -30
+KPX Aring Gcommaaccent -30
+KPX Aring O -30
+KPX Aring Oacute -30
+KPX Aring Ocircumflex -30
+KPX Aring Odieresis -30
+KPX Aring Ograve -30
+KPX Aring Ohungarumlaut -30
+KPX Aring Omacron -30
+KPX Aring Oslash -30
+KPX Aring Otilde -30
+KPX Aring Q -30
+KPX Aring T -120
+KPX Aring Tcaron -120
+KPX Aring Tcommaaccent -120
+KPX Aring U -50
+KPX Aring Uacute -50
+KPX Aring Ucircumflex -50
+KPX Aring Udieresis -50
+KPX Aring Ugrave -50
+KPX Aring Uhungarumlaut -50
+KPX Aring Umacron -50
+KPX Aring Uogonek -50
+KPX Aring Uring -50
+KPX Aring V -70
+KPX Aring W -50
+KPX Aring Y -100
+KPX Aring Yacute -100
+KPX Aring Ydieresis -100
+KPX Aring u -30
+KPX Aring uacute -30
+KPX Aring ucircumflex -30
+KPX Aring udieresis -30
+KPX Aring ugrave -30
+KPX Aring uhungarumlaut -30
+KPX Aring umacron -30
+KPX Aring uogonek -30
+KPX Aring uring -30
+KPX Aring v -40
+KPX Aring w -40
+KPX Aring y -40
+KPX Aring yacute -40
+KPX Aring ydieresis -40
+KPX Atilde C -30
+KPX Atilde Cacute -30
+KPX Atilde Ccaron -30
+KPX Atilde Ccedilla -30
+KPX Atilde G -30
+KPX Atilde Gbreve -30
+KPX Atilde Gcommaaccent -30
+KPX Atilde O -30
+KPX Atilde Oacute -30
+KPX Atilde Ocircumflex -30
+KPX Atilde Odieresis -30
+KPX Atilde Ograve -30
+KPX Atilde Ohungarumlaut -30
+KPX Atilde Omacron -30
+KPX Atilde Oslash -30
+KPX Atilde Otilde -30
+KPX Atilde Q -30
+KPX Atilde T -120
+KPX Atilde Tcaron -120
+KPX Atilde Tcommaaccent -120
+KPX Atilde U -50
+KPX Atilde Uacute -50
+KPX Atilde Ucircumflex -50
+KPX Atilde Udieresis -50
+KPX Atilde Ugrave -50
+KPX Atilde Uhungarumlaut -50
+KPX Atilde Umacron -50
+KPX Atilde Uogonek -50
+KPX Atilde Uring -50
+KPX Atilde V -70
+KPX Atilde W -50
+KPX Atilde Y -100
+KPX Atilde Yacute -100
+KPX Atilde Ydieresis -100
+KPX Atilde u -30
+KPX Atilde uacute -30
+KPX Atilde ucircumflex -30
+KPX Atilde udieresis -30
+KPX Atilde ugrave -30
+KPX Atilde uhungarumlaut -30
+KPX Atilde umacron -30
+KPX Atilde uogonek -30
+KPX Atilde uring -30
+KPX Atilde v -40
+KPX Atilde w -40
+KPX Atilde y -40
+KPX Atilde yacute -40
+KPX Atilde ydieresis -40
+KPX B U -10
+KPX B Uacute -10
+KPX B Ucircumflex -10
+KPX B Udieresis -10
+KPX B Ugrave -10
+KPX B Uhungarumlaut -10
+KPX B Umacron -10
+KPX B Uogonek -10
+KPX B Uring -10
+KPX B comma -20
+KPX B period -20
+KPX C comma -30
+KPX C period -30
+KPX Cacute comma -30
+KPX Cacute period -30
+KPX Ccaron comma -30
+KPX Ccaron period -30
+KPX Ccedilla comma -30
+KPX Ccedilla period -30
+KPX D A -40
+KPX D Aacute -40
+KPX D Abreve -40
+KPX D Acircumflex -40
+KPX D Adieresis -40
+KPX D Agrave -40
+KPX D Amacron -40
+KPX D Aogonek -40
+KPX D Aring -40
+KPX D Atilde -40
+KPX D V -70
+KPX D W -40
+KPX D Y -90
+KPX D Yacute -90
+KPX D Ydieresis -90
+KPX D comma -70
+KPX D period -70
+KPX Dcaron A -40
+KPX Dcaron Aacute -40
+KPX Dcaron Abreve -40
+KPX Dcaron Acircumflex -40
+KPX Dcaron Adieresis -40
+KPX Dcaron Agrave -40
+KPX Dcaron Amacron -40
+KPX Dcaron Aogonek -40
+KPX Dcaron Aring -40
+KPX Dcaron Atilde -40
+KPX Dcaron V -70
+KPX Dcaron W -40
+KPX Dcaron Y -90
+KPX Dcaron Yacute -90
+KPX Dcaron Ydieresis -90
+KPX Dcaron comma -70
+KPX Dcaron period -70
+KPX Dcroat A -40
+KPX Dcroat Aacute -40
+KPX Dcroat Abreve -40
+KPX Dcroat Acircumflex -40
+KPX Dcroat Adieresis -40
+KPX Dcroat Agrave -40
+KPX Dcroat Amacron -40
+KPX Dcroat Aogonek -40
+KPX Dcroat Aring -40
+KPX Dcroat Atilde -40
+KPX Dcroat V -70
+KPX Dcroat W -40
+KPX Dcroat Y -90
+KPX Dcroat Yacute -90
+KPX Dcroat Ydieresis -90
+KPX Dcroat comma -70
+KPX Dcroat period -70
+KPX F A -80
+KPX F Aacute -80
+KPX F Abreve -80
+KPX F Acircumflex -80
+KPX F Adieresis -80
+KPX F Agrave -80
+KPX F Amacron -80
+KPX F Aogonek -80
+KPX F Aring -80
+KPX F Atilde -80
+KPX F a -50
+KPX F aacute -50
+KPX F abreve -50
+KPX F acircumflex -50
+KPX F adieresis -50
+KPX F agrave -50
+KPX F amacron -50
+KPX F aogonek -50
+KPX F aring -50
+KPX F atilde -50
+KPX F comma -150
+KPX F e -30
+KPX F eacute -30
+KPX F ecaron -30
+KPX F ecircumflex -30
+KPX F edieresis -30
+KPX F edotaccent -30
+KPX F egrave -30
+KPX F emacron -30
+KPX F eogonek -30
+KPX F o -30
+KPX F oacute -30
+KPX F ocircumflex -30
+KPX F odieresis -30
+KPX F ograve -30
+KPX F ohungarumlaut -30
+KPX F omacron -30
+KPX F oslash -30
+KPX F otilde -30
+KPX F period -150
+KPX F r -45
+KPX F racute -45
+KPX F rcaron -45
+KPX F rcommaaccent -45
+KPX J A -20
+KPX J Aacute -20
+KPX J Abreve -20
+KPX J Acircumflex -20
+KPX J Adieresis -20
+KPX J Agrave -20
+KPX J Amacron -20
+KPX J Aogonek -20
+KPX J Aring -20
+KPX J Atilde -20
+KPX J a -20
+KPX J aacute -20
+KPX J abreve -20
+KPX J acircumflex -20
+KPX J adieresis -20
+KPX J agrave -20
+KPX J amacron -20
+KPX J aogonek -20
+KPX J aring -20
+KPX J atilde -20
+KPX J comma -30
+KPX J period -30
+KPX J u -20
+KPX J uacute -20
+KPX J ucircumflex -20
+KPX J udieresis -20
+KPX J ugrave -20
+KPX J uhungarumlaut -20
+KPX J umacron -20
+KPX J uogonek -20
+KPX J uring -20
+KPX K O -50
+KPX K Oacute -50
+KPX K Ocircumflex -50
+KPX K Odieresis -50
+KPX K Ograve -50
+KPX K Ohungarumlaut -50
+KPX K Omacron -50
+KPX K Oslash -50
+KPX K Otilde -50
+KPX K e -40
+KPX K eacute -40
+KPX K ecaron -40
+KPX K ecircumflex -40
+KPX K edieresis -40
+KPX K edotaccent -40
+KPX K egrave -40
+KPX K emacron -40
+KPX K eogonek -40
+KPX K o -40
+KPX K oacute -40
+KPX K ocircumflex -40
+KPX K odieresis -40
+KPX K ograve -40
+KPX K ohungarumlaut -40
+KPX K omacron -40
+KPX K oslash -40
+KPX K otilde -40
+KPX K u -30
+KPX K uacute -30
+KPX K ucircumflex -30
+KPX K udieresis -30
+KPX K ugrave -30
+KPX K uhungarumlaut -30
+KPX K umacron -30
+KPX K uogonek -30
+KPX K uring -30
+KPX K y -50
+KPX K yacute -50
+KPX K ydieresis -50
+KPX Kcommaaccent O -50
+KPX Kcommaaccent Oacute -50
+KPX Kcommaaccent Ocircumflex -50
+KPX Kcommaaccent Odieresis -50
+KPX Kcommaaccent Ograve -50
+KPX Kcommaaccent Ohungarumlaut -50
+KPX Kcommaaccent Omacron -50
+KPX Kcommaaccent Oslash -50
+KPX Kcommaaccent Otilde -50
+KPX Kcommaaccent e -40
+KPX Kcommaaccent eacute -40
+KPX Kcommaaccent ecaron -40
+KPX Kcommaaccent ecircumflex -40
+KPX Kcommaaccent edieresis -40
+KPX Kcommaaccent edotaccent -40
+KPX Kcommaaccent egrave -40
+KPX Kcommaaccent emacron -40
+KPX Kcommaaccent eogonek -40
+KPX Kcommaaccent o -40
+KPX Kcommaaccent oacute -40
+KPX Kcommaaccent ocircumflex -40
+KPX Kcommaaccent odieresis -40
+KPX Kcommaaccent ograve -40
+KPX Kcommaaccent ohungarumlaut -40
+KPX Kcommaaccent omacron -40
+KPX Kcommaaccent oslash -40
+KPX Kcommaaccent otilde -40
+KPX Kcommaaccent u -30
+KPX Kcommaaccent uacute -30
+KPX Kcommaaccent ucircumflex -30
+KPX Kcommaaccent udieresis -30
+KPX Kcommaaccent ugrave -30
+KPX Kcommaaccent uhungarumlaut -30
+KPX Kcommaaccent umacron -30
+KPX Kcommaaccent uogonek -30
+KPX Kcommaaccent uring -30
+KPX Kcommaaccent y -50
+KPX Kcommaaccent yacute -50
+KPX Kcommaaccent ydieresis -50
+KPX L T -110
+KPX L Tcaron -110
+KPX L Tcommaaccent -110
+KPX L V -110
+KPX L W -70
+KPX L Y -140
+KPX L Yacute -140
+KPX L Ydieresis -140
+KPX L quotedblright -140
+KPX L quoteright -160
+KPX L y -30
+KPX L yacute -30
+KPX L ydieresis -30
+KPX Lacute T -110
+KPX Lacute Tcaron -110
+KPX Lacute Tcommaaccent -110
+KPX Lacute V -110
+KPX Lacute W -70
+KPX Lacute Y -140
+KPX Lacute Yacute -140
+KPX Lacute Ydieresis -140
+KPX Lacute quotedblright -140
+KPX Lacute quoteright -160
+KPX Lacute y -30
+KPX Lacute yacute -30
+KPX Lacute ydieresis -30
+KPX Lcaron T -110
+KPX Lcaron Tcaron -110
+KPX Lcaron Tcommaaccent -110
+KPX Lcaron V -110
+KPX Lcaron W -70
+KPX Lcaron Y -140
+KPX Lcaron Yacute -140
+KPX Lcaron Ydieresis -140
+KPX Lcaron quotedblright -140
+KPX Lcaron quoteright -160
+KPX Lcaron y -30
+KPX Lcaron yacute -30
+KPX Lcaron ydieresis -30
+KPX Lcommaaccent T -110
+KPX Lcommaaccent Tcaron -110
+KPX Lcommaaccent Tcommaaccent -110
+KPX Lcommaaccent V -110
+KPX Lcommaaccent W -70
+KPX Lcommaaccent Y -140
+KPX Lcommaaccent Yacute -140
+KPX Lcommaaccent Ydieresis -140
+KPX Lcommaaccent quotedblright -140
+KPX Lcommaaccent quoteright -160
+KPX Lcommaaccent y -30
+KPX Lcommaaccent yacute -30
+KPX Lcommaaccent ydieresis -30
+KPX Lslash T -110
+KPX Lslash Tcaron -110
+KPX Lslash Tcommaaccent -110
+KPX Lslash V -110
+KPX Lslash W -70
+KPX Lslash Y -140
+KPX Lslash Yacute -140
+KPX Lslash Ydieresis -140
+KPX Lslash quotedblright -140
+KPX Lslash quoteright -160
+KPX Lslash y -30
+KPX Lslash yacute -30
+KPX Lslash ydieresis -30
+KPX O A -20
+KPX O Aacute -20
+KPX O Abreve -20
+KPX O Acircumflex -20
+KPX O Adieresis -20
+KPX O Agrave -20
+KPX O Amacron -20
+KPX O Aogonek -20
+KPX O Aring -20
+KPX O Atilde -20
+KPX O T -40
+KPX O Tcaron -40
+KPX O Tcommaaccent -40
+KPX O V -50
+KPX O W -30
+KPX O X -60
+KPX O Y -70
+KPX O Yacute -70
+KPX O Ydieresis -70
+KPX O comma -40
+KPX O period -40
+KPX Oacute A -20
+KPX Oacute Aacute -20
+KPX Oacute Abreve -20
+KPX Oacute Acircumflex -20
+KPX Oacute Adieresis -20
+KPX Oacute Agrave -20
+KPX Oacute Amacron -20
+KPX Oacute Aogonek -20
+KPX Oacute Aring -20
+KPX Oacute Atilde -20
+KPX Oacute T -40
+KPX Oacute Tcaron -40
+KPX Oacute Tcommaaccent -40
+KPX Oacute V -50
+KPX Oacute W -30
+KPX Oacute X -60
+KPX Oacute Y -70
+KPX Oacute Yacute -70
+KPX Oacute Ydieresis -70
+KPX Oacute comma -40
+KPX Oacute period -40
+KPX Ocircumflex A -20
+KPX Ocircumflex Aacute -20
+KPX Ocircumflex Abreve -20
+KPX Ocircumflex Acircumflex -20
+KPX Ocircumflex Adieresis -20
+KPX Ocircumflex Agrave -20
+KPX Ocircumflex Amacron -20
+KPX Ocircumflex Aogonek -20
+KPX Ocircumflex Aring -20
+KPX Ocircumflex Atilde -20
+KPX Ocircumflex T -40
+KPX Ocircumflex Tcaron -40
+KPX Ocircumflex Tcommaaccent -40
+KPX Ocircumflex V -50
+KPX Ocircumflex W -30
+KPX Ocircumflex X -60
+KPX Ocircumflex Y -70
+KPX Ocircumflex Yacute -70
+KPX Ocircumflex Ydieresis -70
+KPX Ocircumflex comma -40
+KPX Ocircumflex period -40
+KPX Odieresis A -20
+KPX Odieresis Aacute -20
+KPX Odieresis Abreve -20
+KPX Odieresis Acircumflex -20
+KPX Odieresis Adieresis -20
+KPX Odieresis Agrave -20
+KPX Odieresis Amacron -20
+KPX Odieresis Aogonek -20
+KPX Odieresis Aring -20
+KPX Odieresis Atilde -20
+KPX Odieresis T -40
+KPX Odieresis Tcaron -40
+KPX Odieresis Tcommaaccent -40
+KPX Odieresis V -50
+KPX Odieresis W -30
+KPX Odieresis X -60
+KPX Odieresis Y -70
+KPX Odieresis Yacute -70
+KPX Odieresis Ydieresis -70
+KPX Odieresis comma -40
+KPX Odieresis period -40
+KPX Ograve A -20
+KPX Ograve Aacute -20
+KPX Ograve Abreve -20
+KPX Ograve Acircumflex -20
+KPX Ograve Adieresis -20
+KPX Ograve Agrave -20
+KPX Ograve Amacron -20
+KPX Ograve Aogonek -20
+KPX Ograve Aring -20
+KPX Ograve Atilde -20
+KPX Ograve T -40
+KPX Ograve Tcaron -40
+KPX Ograve Tcommaaccent -40
+KPX Ograve V -50
+KPX Ograve W -30
+KPX Ograve X -60
+KPX Ograve Y -70
+KPX Ograve Yacute -70
+KPX Ograve Ydieresis -70
+KPX Ograve comma -40
+KPX Ograve period -40
+KPX Ohungarumlaut A -20
+KPX Ohungarumlaut Aacute -20
+KPX Ohungarumlaut Abreve -20
+KPX Ohungarumlaut Acircumflex -20
+KPX Ohungarumlaut Adieresis -20
+KPX Ohungarumlaut Agrave -20
+KPX Ohungarumlaut Amacron -20
+KPX Ohungarumlaut Aogonek -20
+KPX Ohungarumlaut Aring -20
+KPX Ohungarumlaut Atilde -20
+KPX Ohungarumlaut T -40
+KPX Ohungarumlaut Tcaron -40
+KPX Ohungarumlaut Tcommaaccent -40
+KPX Ohungarumlaut V -50
+KPX Ohungarumlaut W -30
+KPX Ohungarumlaut X -60
+KPX Ohungarumlaut Y -70
+KPX Ohungarumlaut Yacute -70
+KPX Ohungarumlaut Ydieresis -70
+KPX Ohungarumlaut comma -40
+KPX Ohungarumlaut period -40
+KPX Omacron A -20
+KPX Omacron Aacute -20
+KPX Omacron Abreve -20
+KPX Omacron Acircumflex -20
+KPX Omacron Adieresis -20
+KPX Omacron Agrave -20
+KPX Omacron Amacron -20
+KPX Omacron Aogonek -20
+KPX Omacron Aring -20
+KPX Omacron Atilde -20
+KPX Omacron T -40
+KPX Omacron Tcaron -40
+KPX Omacron Tcommaaccent -40
+KPX Omacron V -50
+KPX Omacron W -30
+KPX Omacron X -60
+KPX Omacron Y -70
+KPX Omacron Yacute -70
+KPX Omacron Ydieresis -70
+KPX Omacron comma -40
+KPX Omacron period -40
+KPX Oslash A -20
+KPX Oslash Aacute -20
+KPX Oslash Abreve -20
+KPX Oslash Acircumflex -20
+KPX Oslash Adieresis -20
+KPX Oslash Agrave -20
+KPX Oslash Amacron -20
+KPX Oslash Aogonek -20
+KPX Oslash Aring -20
+KPX Oslash Atilde -20
+KPX Oslash T -40
+KPX Oslash Tcaron -40
+KPX Oslash Tcommaaccent -40
+KPX Oslash V -50
+KPX Oslash W -30
+KPX Oslash X -60
+KPX Oslash Y -70
+KPX Oslash Yacute -70
+KPX Oslash Ydieresis -70
+KPX Oslash comma -40
+KPX Oslash period -40
+KPX Otilde A -20
+KPX Otilde Aacute -20
+KPX Otilde Abreve -20
+KPX Otilde Acircumflex -20
+KPX Otilde Adieresis -20
+KPX Otilde Agrave -20
+KPX Otilde Amacron -20
+KPX Otilde Aogonek -20
+KPX Otilde Aring -20
+KPX Otilde Atilde -20
+KPX Otilde T -40
+KPX Otilde Tcaron -40
+KPX Otilde Tcommaaccent -40
+KPX Otilde V -50
+KPX Otilde W -30
+KPX Otilde X -60
+KPX Otilde Y -70
+KPX Otilde Yacute -70
+KPX Otilde Ydieresis -70
+KPX Otilde comma -40
+KPX Otilde period -40
+KPX P A -120
+KPX P Aacute -120
+KPX P Abreve -120
+KPX P Acircumflex -120
+KPX P Adieresis -120
+KPX P Agrave -120
+KPX P Amacron -120
+KPX P Aogonek -120
+KPX P Aring -120
+KPX P Atilde -120
+KPX P a -40
+KPX P aacute -40
+KPX P abreve -40
+KPX P acircumflex -40
+KPX P adieresis -40
+KPX P agrave -40
+KPX P amacron -40
+KPX P aogonek -40
+KPX P aring -40
+KPX P atilde -40
+KPX P comma -180
+KPX P e -50
+KPX P eacute -50
+KPX P ecaron -50
+KPX P ecircumflex -50
+KPX P edieresis -50
+KPX P edotaccent -50
+KPX P egrave -50
+KPX P emacron -50
+KPX P eogonek -50
+KPX P o -50
+KPX P oacute -50
+KPX P ocircumflex -50
+KPX P odieresis -50
+KPX P ograve -50
+KPX P ohungarumlaut -50
+KPX P omacron -50
+KPX P oslash -50
+KPX P otilde -50
+KPX P period -180
+KPX Q U -10
+KPX Q Uacute -10
+KPX Q Ucircumflex -10
+KPX Q Udieresis -10
+KPX Q Ugrave -10
+KPX Q Uhungarumlaut -10
+KPX Q Umacron -10
+KPX Q Uogonek -10
+KPX Q Uring -10
+KPX R O -20
+KPX R Oacute -20
+KPX R Ocircumflex -20
+KPX R Odieresis -20
+KPX R Ograve -20
+KPX R Ohungarumlaut -20
+KPX R Omacron -20
+KPX R Oslash -20
+KPX R Otilde -20
+KPX R T -30
+KPX R Tcaron -30
+KPX R Tcommaaccent -30
+KPX R U -40
+KPX R Uacute -40
+KPX R Ucircumflex -40
+KPX R Udieresis -40
+KPX R Ugrave -40
+KPX R Uhungarumlaut -40
+KPX R Umacron -40
+KPX R Uogonek -40
+KPX R Uring -40
+KPX R V -50
+KPX R W -30
+KPX R Y -50
+KPX R Yacute -50
+KPX R Ydieresis -50
+KPX Racute O -20
+KPX Racute Oacute -20
+KPX Racute Ocircumflex -20
+KPX Racute Odieresis -20
+KPX Racute Ograve -20
+KPX Racute Ohungarumlaut -20
+KPX Racute Omacron -20
+KPX Racute Oslash -20
+KPX Racute Otilde -20
+KPX Racute T -30
+KPX Racute Tcaron -30
+KPX Racute Tcommaaccent -30
+KPX Racute U -40
+KPX Racute Uacute -40
+KPX Racute Ucircumflex -40
+KPX Racute Udieresis -40
+KPX Racute Ugrave -40
+KPX Racute Uhungarumlaut -40
+KPX Racute Umacron -40
+KPX Racute Uogonek -40
+KPX Racute Uring -40
+KPX Racute V -50
+KPX Racute W -30
+KPX Racute Y -50
+KPX Racute Yacute -50
+KPX Racute Ydieresis -50
+KPX Rcaron O -20
+KPX Rcaron Oacute -20
+KPX Rcaron Ocircumflex -20
+KPX Rcaron Odieresis -20
+KPX Rcaron Ograve -20
+KPX Rcaron Ohungarumlaut -20
+KPX Rcaron Omacron -20
+KPX Rcaron Oslash -20
+KPX Rcaron Otilde -20
+KPX Rcaron T -30
+KPX Rcaron Tcaron -30
+KPX Rcaron Tcommaaccent -30
+KPX Rcaron U -40
+KPX Rcaron Uacute -40
+KPX Rcaron Ucircumflex -40
+KPX Rcaron Udieresis -40
+KPX Rcaron Ugrave -40
+KPX Rcaron Uhungarumlaut -40
+KPX Rcaron Umacron -40
+KPX Rcaron Uogonek -40
+KPX Rcaron Uring -40
+KPX Rcaron V -50
+KPX Rcaron W -30
+KPX Rcaron Y -50
+KPX Rcaron Yacute -50
+KPX Rcaron Ydieresis -50
+KPX Rcommaaccent O -20
+KPX Rcommaaccent Oacute -20
+KPX Rcommaaccent Ocircumflex -20
+KPX Rcommaaccent Odieresis -20
+KPX Rcommaaccent Ograve -20
+KPX Rcommaaccent Ohungarumlaut -20
+KPX Rcommaaccent Omacron -20
+KPX Rcommaaccent Oslash -20
+KPX Rcommaaccent Otilde -20
+KPX Rcommaaccent T -30
+KPX Rcommaaccent Tcaron -30
+KPX Rcommaaccent Tcommaaccent -30
+KPX Rcommaaccent U -40
+KPX Rcommaaccent Uacute -40
+KPX Rcommaaccent Ucircumflex -40
+KPX Rcommaaccent Udieresis -40
+KPX Rcommaaccent Ugrave -40
+KPX Rcommaaccent Uhungarumlaut -40
+KPX Rcommaaccent Umacron -40
+KPX Rcommaaccent Uogonek -40
+KPX Rcommaaccent Uring -40
+KPX Rcommaaccent V -50
+KPX Rcommaaccent W -30
+KPX Rcommaaccent Y -50
+KPX Rcommaaccent Yacute -50
+KPX Rcommaaccent Ydieresis -50
+KPX S comma -20
+KPX S period -20
+KPX Sacute comma -20
+KPX Sacute period -20
+KPX Scaron comma -20
+KPX Scaron period -20
+KPX Scedilla comma -20
+KPX Scedilla period -20
+KPX Scommaaccent comma -20
+KPX Scommaaccent period -20
+KPX T A -120
+KPX T Aacute -120
+KPX T Abreve -120
+KPX T Acircumflex -120
+KPX T Adieresis -120
+KPX T Agrave -120
+KPX T Amacron -120
+KPX T Aogonek -120
+KPX T Aring -120
+KPX T Atilde -120
+KPX T O -40
+KPX T Oacute -40
+KPX T Ocircumflex -40
+KPX T Odieresis -40
+KPX T Ograve -40
+KPX T Ohungarumlaut -40
+KPX T Omacron -40
+KPX T Oslash -40
+KPX T Otilde -40
+KPX T a -120
+KPX T aacute -120
+KPX T abreve -60
+KPX T acircumflex -120
+KPX T adieresis -120
+KPX T agrave -120
+KPX T amacron -60
+KPX T aogonek -120
+KPX T aring -120
+KPX T atilde -60
+KPX T colon -20
+KPX T comma -120
+KPX T e -120
+KPX T eacute -120
+KPX T ecaron -120
+KPX T ecircumflex -120
+KPX T edieresis -120
+KPX T edotaccent -120
+KPX T egrave -60
+KPX T emacron -60
+KPX T eogonek -120
+KPX T hyphen -140
+KPX T o -120
+KPX T oacute -120
+KPX T ocircumflex -120
+KPX T odieresis -120
+KPX T ograve -120
+KPX T ohungarumlaut -120
+KPX T omacron -60
+KPX T oslash -120
+KPX T otilde -60
+KPX T period -120
+KPX T r -120
+KPX T racute -120
+KPX T rcaron -120
+KPX T rcommaaccent -120
+KPX T semicolon -20
+KPX T u -120
+KPX T uacute -120
+KPX T ucircumflex -120
+KPX T udieresis -120
+KPX T ugrave -120
+KPX T uhungarumlaut -120
+KPX T umacron -60
+KPX T uogonek -120
+KPX T uring -120
+KPX T w -120
+KPX T y -120
+KPX T yacute -120
+KPX T ydieresis -60
+KPX Tcaron A -120
+KPX Tcaron Aacute -120
+KPX Tcaron Abreve -120
+KPX Tcaron Acircumflex -120
+KPX Tcaron Adieresis -120
+KPX Tcaron Agrave -120
+KPX Tcaron Amacron -120
+KPX Tcaron Aogonek -120
+KPX Tcaron Aring -120
+KPX Tcaron Atilde -120
+KPX Tcaron O -40
+KPX Tcaron Oacute -40
+KPX Tcaron Ocircumflex -40
+KPX Tcaron Odieresis -40
+KPX Tcaron Ograve -40
+KPX Tcaron Ohungarumlaut -40
+KPX Tcaron Omacron -40
+KPX Tcaron Oslash -40
+KPX Tcaron Otilde -40
+KPX Tcaron a -120
+KPX Tcaron aacute -120
+KPX Tcaron abreve -60
+KPX Tcaron acircumflex -120
+KPX Tcaron adieresis -120
+KPX Tcaron agrave -120
+KPX Tcaron amacron -60
+KPX Tcaron aogonek -120
+KPX Tcaron aring -120
+KPX Tcaron atilde -60
+KPX Tcaron colon -20
+KPX Tcaron comma -120
+KPX Tcaron e -120
+KPX Tcaron eacute -120
+KPX Tcaron ecaron -120
+KPX Tcaron ecircumflex -120
+KPX Tcaron edieresis -120
+KPX Tcaron edotaccent -120
+KPX Tcaron egrave -60
+KPX Tcaron emacron -60
+KPX Tcaron eogonek -120
+KPX Tcaron hyphen -140
+KPX Tcaron o -120
+KPX Tcaron oacute -120
+KPX Tcaron ocircumflex -120
+KPX Tcaron odieresis -120
+KPX Tcaron ograve -120
+KPX Tcaron ohungarumlaut -120
+KPX Tcaron omacron -60
+KPX Tcaron oslash -120
+KPX Tcaron otilde -60
+KPX Tcaron period -120
+KPX Tcaron r -120
+KPX Tcaron racute -120
+KPX Tcaron rcaron -120
+KPX Tcaron rcommaaccent -120
+KPX Tcaron semicolon -20
+KPX Tcaron u -120
+KPX Tcaron uacute -120
+KPX Tcaron ucircumflex -120
+KPX Tcaron udieresis -120
+KPX Tcaron ugrave -120
+KPX Tcaron uhungarumlaut -120
+KPX Tcaron umacron -60
+KPX Tcaron uogonek -120
+KPX Tcaron uring -120
+KPX Tcaron w -120
+KPX Tcaron y -120
+KPX Tcaron yacute -120
+KPX Tcaron ydieresis -60
+KPX Tcommaaccent A -120
+KPX Tcommaaccent Aacute -120
+KPX Tcommaaccent Abreve -120
+KPX Tcommaaccent Acircumflex -120
+KPX Tcommaaccent Adieresis -120
+KPX Tcommaaccent Agrave -120
+KPX Tcommaaccent Amacron -120
+KPX Tcommaaccent Aogonek -120
+KPX Tcommaaccent Aring -120
+KPX Tcommaaccent Atilde -120
+KPX Tcommaaccent O -40
+KPX Tcommaaccent Oacute -40
+KPX Tcommaaccent Ocircumflex -40
+KPX Tcommaaccent Odieresis -40
+KPX Tcommaaccent Ograve -40
+KPX Tcommaaccent Ohungarumlaut -40
+KPX Tcommaaccent Omacron -40
+KPX Tcommaaccent Oslash -40
+KPX Tcommaaccent Otilde -40
+KPX Tcommaaccent a -120
+KPX Tcommaaccent aacute -120
+KPX Tcommaaccent abreve -60
+KPX Tcommaaccent acircumflex -120
+KPX Tcommaaccent adieresis -120
+KPX Tcommaaccent agrave -120
+KPX Tcommaaccent amacron -60
+KPX Tcommaaccent aogonek -120
+KPX Tcommaaccent aring -120
+KPX Tcommaaccent atilde -60
+KPX Tcommaaccent colon -20
+KPX Tcommaaccent comma -120
+KPX Tcommaaccent e -120
+KPX Tcommaaccent eacute -120
+KPX Tcommaaccent ecaron -120
+KPX Tcommaaccent ecircumflex -120
+KPX Tcommaaccent edieresis -120
+KPX Tcommaaccent edotaccent -120
+KPX Tcommaaccent egrave -60
+KPX Tcommaaccent emacron -60
+KPX Tcommaaccent eogonek -120
+KPX Tcommaaccent hyphen -140
+KPX Tcommaaccent o -120
+KPX Tcommaaccent oacute -120
+KPX Tcommaaccent ocircumflex -120
+KPX Tcommaaccent odieresis -120
+KPX Tcommaaccent ograve -120
+KPX Tcommaaccent ohungarumlaut -120
+KPX Tcommaaccent omacron -60
+KPX Tcommaaccent oslash -120
+KPX Tcommaaccent otilde -60
+KPX Tcommaaccent period -120
+KPX Tcommaaccent r -120
+KPX Tcommaaccent racute -120
+KPX Tcommaaccent rcaron -120
+KPX Tcommaaccent rcommaaccent -120
+KPX Tcommaaccent semicolon -20
+KPX Tcommaaccent u -120
+KPX Tcommaaccent uacute -120
+KPX Tcommaaccent ucircumflex -120
+KPX Tcommaaccent udieresis -120
+KPX Tcommaaccent ugrave -120
+KPX Tcommaaccent uhungarumlaut -120
+KPX Tcommaaccent umacron -60
+KPX Tcommaaccent uogonek -120
+KPX Tcommaaccent uring -120
+KPX Tcommaaccent w -120
+KPX Tcommaaccent y -120
+KPX Tcommaaccent yacute -120
+KPX Tcommaaccent ydieresis -60
+KPX U A -40
+KPX U Aacute -40
+KPX U Abreve -40
+KPX U Acircumflex -40
+KPX U Adieresis -40
+KPX U Agrave -40
+KPX U Amacron -40
+KPX U Aogonek -40
+KPX U Aring -40
+KPX U Atilde -40
+KPX U comma -40
+KPX U period -40
+KPX Uacute A -40
+KPX Uacute Aacute -40
+KPX Uacute Abreve -40
+KPX Uacute Acircumflex -40
+KPX Uacute Adieresis -40
+KPX Uacute Agrave -40
+KPX Uacute Amacron -40
+KPX Uacute Aogonek -40
+KPX Uacute Aring -40
+KPX Uacute Atilde -40
+KPX Uacute comma -40
+KPX Uacute period -40
+KPX Ucircumflex A -40
+KPX Ucircumflex Aacute -40
+KPX Ucircumflex Abreve -40
+KPX Ucircumflex Acircumflex -40
+KPX Ucircumflex Adieresis -40
+KPX Ucircumflex Agrave -40
+KPX Ucircumflex Amacron -40
+KPX Ucircumflex Aogonek -40
+KPX Ucircumflex Aring -40
+KPX Ucircumflex Atilde -40
+KPX Ucircumflex comma -40
+KPX Ucircumflex period -40
+KPX Udieresis A -40
+KPX Udieresis Aacute -40
+KPX Udieresis Abreve -40
+KPX Udieresis Acircumflex -40
+KPX Udieresis Adieresis -40
+KPX Udieresis Agrave -40
+KPX Udieresis Amacron -40
+KPX Udieresis Aogonek -40
+KPX Udieresis Aring -40
+KPX Udieresis Atilde -40
+KPX Udieresis comma -40
+KPX Udieresis period -40
+KPX Ugrave A -40
+KPX Ugrave Aacute -40
+KPX Ugrave Abreve -40
+KPX Ugrave Acircumflex -40
+KPX Ugrave Adieresis -40
+KPX Ugrave Agrave -40
+KPX Ugrave Amacron -40
+KPX Ugrave Aogonek -40
+KPX Ugrave Aring -40
+KPX Ugrave Atilde -40
+KPX Ugrave comma -40
+KPX Ugrave period -40
+KPX Uhungarumlaut A -40
+KPX Uhungarumlaut Aacute -40
+KPX Uhungarumlaut Abreve -40
+KPX Uhungarumlaut Acircumflex -40
+KPX Uhungarumlaut Adieresis -40
+KPX Uhungarumlaut Agrave -40
+KPX Uhungarumlaut Amacron -40
+KPX Uhungarumlaut Aogonek -40
+KPX Uhungarumlaut Aring -40
+KPX Uhungarumlaut Atilde -40
+KPX Uhungarumlaut comma -40
+KPX Uhungarumlaut period -40
+KPX Umacron A -40
+KPX Umacron Aacute -40
+KPX Umacron Abreve -40
+KPX Umacron Acircumflex -40
+KPX Umacron Adieresis -40
+KPX Umacron Agrave -40
+KPX Umacron Amacron -40
+KPX Umacron Aogonek -40
+KPX Umacron Aring -40
+KPX Umacron Atilde -40
+KPX Umacron comma -40
+KPX Umacron period -40
+KPX Uogonek A -40
+KPX Uogonek Aacute -40
+KPX Uogonek Abreve -40
+KPX Uogonek Acircumflex -40
+KPX Uogonek Adieresis -40
+KPX Uogonek Agrave -40
+KPX Uogonek Amacron -40
+KPX Uogonek Aogonek -40
+KPX Uogonek Aring -40
+KPX Uogonek Atilde -40
+KPX Uogonek comma -40
+KPX Uogonek period -40
+KPX Uring A -40
+KPX Uring Aacute -40
+KPX Uring Abreve -40
+KPX Uring Acircumflex -40
+KPX Uring Adieresis -40
+KPX Uring Agrave -40
+KPX Uring Amacron -40
+KPX Uring Aogonek -40
+KPX Uring Aring -40
+KPX Uring Atilde -40
+KPX Uring comma -40
+KPX Uring period -40
+KPX V A -80
+KPX V Aacute -80
+KPX V Abreve -80
+KPX V Acircumflex -80
+KPX V Adieresis -80
+KPX V Agrave -80
+KPX V Amacron -80
+KPX V Aogonek -80
+KPX V Aring -80
+KPX V Atilde -80
+KPX V G -40
+KPX V Gbreve -40
+KPX V Gcommaaccent -40
+KPX V O -40
+KPX V Oacute -40
+KPX V Ocircumflex -40
+KPX V Odieresis -40
+KPX V Ograve -40
+KPX V Ohungarumlaut -40
+KPX V Omacron -40
+KPX V Oslash -40
+KPX V Otilde -40
+KPX V a -70
+KPX V aacute -70
+KPX V abreve -70
+KPX V acircumflex -70
+KPX V adieresis -70
+KPX V agrave -70
+KPX V amacron -70
+KPX V aogonek -70
+KPX V aring -70
+KPX V atilde -70
+KPX V colon -40
+KPX V comma -125
+KPX V e -80
+KPX V eacute -80
+KPX V ecaron -80
+KPX V ecircumflex -80
+KPX V edieresis -80
+KPX V edotaccent -80
+KPX V egrave -80
+KPX V emacron -80
+KPX V eogonek -80
+KPX V hyphen -80
+KPX V o -80
+KPX V oacute -80
+KPX V ocircumflex -80
+KPX V odieresis -80
+KPX V ograve -80
+KPX V ohungarumlaut -80
+KPX V omacron -80
+KPX V oslash -80
+KPX V otilde -80
+KPX V period -125
+KPX V semicolon -40
+KPX V u -70
+KPX V uacute -70
+KPX V ucircumflex -70
+KPX V udieresis -70
+KPX V ugrave -70
+KPX V uhungarumlaut -70
+KPX V umacron -70
+KPX V uogonek -70
+KPX V uring -70
+KPX W A -50
+KPX W Aacute -50
+KPX W Abreve -50
+KPX W Acircumflex -50
+KPX W Adieresis -50
+KPX W Agrave -50
+KPX W Amacron -50
+KPX W Aogonek -50
+KPX W Aring -50
+KPX W Atilde -50
+KPX W O -20
+KPX W Oacute -20
+KPX W Ocircumflex -20
+KPX W Odieresis -20
+KPX W Ograve -20
+KPX W Ohungarumlaut -20
+KPX W Omacron -20
+KPX W Oslash -20
+KPX W Otilde -20
+KPX W a -40
+KPX W aacute -40
+KPX W abreve -40
+KPX W acircumflex -40
+KPX W adieresis -40
+KPX W agrave -40
+KPX W amacron -40
+KPX W aogonek -40
+KPX W aring -40
+KPX W atilde -40
+KPX W comma -80
+KPX W e -30
+KPX W eacute -30
+KPX W ecaron -30
+KPX W ecircumflex -30
+KPX W edieresis -30
+KPX W edotaccent -30
+KPX W egrave -30
+KPX W emacron -30
+KPX W eogonek -30
+KPX W hyphen -40
+KPX W o -30
+KPX W oacute -30
+KPX W ocircumflex -30
+KPX W odieresis -30
+KPX W ograve -30
+KPX W ohungarumlaut -30
+KPX W omacron -30
+KPX W oslash -30
+KPX W otilde -30
+KPX W period -80
+KPX W u -30
+KPX W uacute -30
+KPX W ucircumflex -30
+KPX W udieresis -30
+KPX W ugrave -30
+KPX W uhungarumlaut -30
+KPX W umacron -30
+KPX W uogonek -30
+KPX W uring -30
+KPX W y -20
+KPX W yacute -20
+KPX W ydieresis -20
+KPX Y A -110
+KPX Y Aacute -110
+KPX Y Abreve -110
+KPX Y Acircumflex -110
+KPX Y Adieresis -110
+KPX Y Agrave -110
+KPX Y Amacron -110
+KPX Y Aogonek -110
+KPX Y Aring -110
+KPX Y Atilde -110
+KPX Y O -85
+KPX Y Oacute -85
+KPX Y Ocircumflex -85
+KPX Y Odieresis -85
+KPX Y Ograve -85
+KPX Y Ohungarumlaut -85
+KPX Y Omacron -85
+KPX Y Oslash -85
+KPX Y Otilde -85
+KPX Y a -140
+KPX Y aacute -140
+KPX Y abreve -70
+KPX Y acircumflex -140
+KPX Y adieresis -140
+KPX Y agrave -140
+KPX Y amacron -70
+KPX Y aogonek -140
+KPX Y aring -140
+KPX Y atilde -140
+KPX Y colon -60
+KPX Y comma -140
+KPX Y e -140
+KPX Y eacute -140
+KPX Y ecaron -140
+KPX Y ecircumflex -140
+KPX Y edieresis -140
+KPX Y edotaccent -140
+KPX Y egrave -140
+KPX Y emacron -70
+KPX Y eogonek -140
+KPX Y hyphen -140
+KPX Y i -20
+KPX Y iacute -20
+KPX Y iogonek -20
+KPX Y o -140
+KPX Y oacute -140
+KPX Y ocircumflex -140
+KPX Y odieresis -140
+KPX Y ograve -140
+KPX Y ohungarumlaut -140
+KPX Y omacron -140
+KPX Y oslash -140
+KPX Y otilde -140
+KPX Y period -140
+KPX Y semicolon -60
+KPX Y u -110
+KPX Y uacute -110
+KPX Y ucircumflex -110
+KPX Y udieresis -110
+KPX Y ugrave -110
+KPX Y uhungarumlaut -110
+KPX Y umacron -110
+KPX Y uogonek -110
+KPX Y uring -110
+KPX Yacute A -110
+KPX Yacute Aacute -110
+KPX Yacute Abreve -110
+KPX Yacute Acircumflex -110
+KPX Yacute Adieresis -110
+KPX Yacute Agrave -110
+KPX Yacute Amacron -110
+KPX Yacute Aogonek -110
+KPX Yacute Aring -110
+KPX Yacute Atilde -110
+KPX Yacute O -85
+KPX Yacute Oacute -85
+KPX Yacute Ocircumflex -85
+KPX Yacute Odieresis -85
+KPX Yacute Ograve -85
+KPX Yacute Ohungarumlaut -85
+KPX Yacute Omacron -85
+KPX Yacute Oslash -85
+KPX Yacute Otilde -85
+KPX Yacute a -140
+KPX Yacute aacute -140
+KPX Yacute abreve -70
+KPX Yacute acircumflex -140
+KPX Yacute adieresis -140
+KPX Yacute agrave -140
+KPX Yacute amacron -70
+KPX Yacute aogonek -140
+KPX Yacute aring -140
+KPX Yacute atilde -70
+KPX Yacute colon -60
+KPX Yacute comma -140
+KPX Yacute e -140
+KPX Yacute eacute -140
+KPX Yacute ecaron -140
+KPX Yacute ecircumflex -140
+KPX Yacute edieresis -140
+KPX Yacute edotaccent -140
+KPX Yacute egrave -140
+KPX Yacute emacron -70
+KPX Yacute eogonek -140
+KPX Yacute hyphen -140
+KPX Yacute i -20
+KPX Yacute iacute -20
+KPX Yacute iogonek -20
+KPX Yacute o -140
+KPX Yacute oacute -140
+KPX Yacute ocircumflex -140
+KPX Yacute odieresis -140
+KPX Yacute ograve -140
+KPX Yacute ohungarumlaut -140
+KPX Yacute omacron -70
+KPX Yacute oslash -140
+KPX Yacute otilde -140
+KPX Yacute period -140
+KPX Yacute semicolon -60
+KPX Yacute u -110
+KPX Yacute uacute -110
+KPX Yacute ucircumflex -110
+KPX Yacute udieresis -110
+KPX Yacute ugrave -110
+KPX Yacute uhungarumlaut -110
+KPX Yacute umacron -110
+KPX Yacute uogonek -110
+KPX Yacute uring -110
+KPX Ydieresis A -110
+KPX Ydieresis Aacute -110
+KPX Ydieresis Abreve -110
+KPX Ydieresis Acircumflex -110
+KPX Ydieresis Adieresis -110
+KPX Ydieresis Agrave -110
+KPX Ydieresis Amacron -110
+KPX Ydieresis Aogonek -110
+KPX Ydieresis Aring -110
+KPX Ydieresis Atilde -110
+KPX Ydieresis O -85
+KPX Ydieresis Oacute -85
+KPX Ydieresis Ocircumflex -85
+KPX Ydieresis Odieresis -85
+KPX Ydieresis Ograve -85
+KPX Ydieresis Ohungarumlaut -85
+KPX Ydieresis Omacron -85
+KPX Ydieresis Oslash -85
+KPX Ydieresis Otilde -85
+KPX Ydieresis a -140
+KPX Ydieresis aacute -140
+KPX Ydieresis abreve -70
+KPX Ydieresis acircumflex -140
+KPX Ydieresis adieresis -140
+KPX Ydieresis agrave -140
+KPX Ydieresis amacron -70
+KPX Ydieresis aogonek -140
+KPX Ydieresis aring -140
+KPX Ydieresis atilde -70
+KPX Ydieresis colon -60
+KPX Ydieresis comma -140
+KPX Ydieresis e -140
+KPX Ydieresis eacute -140
+KPX Ydieresis ecaron -140
+KPX Ydieresis ecircumflex -140
+KPX Ydieresis edieresis -140
+KPX Ydieresis edotaccent -140
+KPX Ydieresis egrave -140
+KPX Ydieresis emacron -70
+KPX Ydieresis eogonek -140
+KPX Ydieresis hyphen -140
+KPX Ydieresis i -20
+KPX Ydieresis iacute -20
+KPX Ydieresis iogonek -20
+KPX Ydieresis o -140
+KPX Ydieresis oacute -140
+KPX Ydieresis ocircumflex -140
+KPX Ydieresis odieresis -140
+KPX Ydieresis ograve -140
+KPX Ydieresis ohungarumlaut -140
+KPX Ydieresis omacron -140
+KPX Ydieresis oslash -140
+KPX Ydieresis otilde -140
+KPX Ydieresis period -140
+KPX Ydieresis semicolon -60
+KPX Ydieresis u -110
+KPX Ydieresis uacute -110
+KPX Ydieresis ucircumflex -110
+KPX Ydieresis udieresis -110
+KPX Ydieresis ugrave -110
+KPX Ydieresis uhungarumlaut -110
+KPX Ydieresis umacron -110
+KPX Ydieresis uogonek -110
+KPX Ydieresis uring -110
+KPX a v -20
+KPX a w -20
+KPX a y -30
+KPX a yacute -30
+KPX a ydieresis -30
+KPX aacute v -20
+KPX aacute w -20
+KPX aacute y -30
+KPX aacute yacute -30
+KPX aacute ydieresis -30
+KPX abreve v -20
+KPX abreve w -20
+KPX abreve y -30
+KPX abreve yacute -30
+KPX abreve ydieresis -30
+KPX acircumflex v -20
+KPX acircumflex w -20
+KPX acircumflex y -30
+KPX acircumflex yacute -30
+KPX acircumflex ydieresis -30
+KPX adieresis v -20
+KPX adieresis w -20
+KPX adieresis y -30
+KPX adieresis yacute -30
+KPX adieresis ydieresis -30
+KPX agrave v -20
+KPX agrave w -20
+KPX agrave y -30
+KPX agrave yacute -30
+KPX agrave ydieresis -30
+KPX amacron v -20
+KPX amacron w -20
+KPX amacron y -30
+KPX amacron yacute -30
+KPX amacron ydieresis -30
+KPX aogonek v -20
+KPX aogonek w -20
+KPX aogonek y -30
+KPX aogonek yacute -30
+KPX aogonek ydieresis -30
+KPX aring v -20
+KPX aring w -20
+KPX aring y -30
+KPX aring yacute -30
+KPX aring ydieresis -30
+KPX atilde v -20
+KPX atilde w -20
+KPX atilde y -30
+KPX atilde yacute -30
+KPX atilde ydieresis -30
+KPX b b -10
+KPX b comma -40
+KPX b l -20
+KPX b lacute -20
+KPX b lcommaaccent -20
+KPX b lslash -20
+KPX b period -40
+KPX b u -20
+KPX b uacute -20
+KPX b ucircumflex -20
+KPX b udieresis -20
+KPX b ugrave -20
+KPX b uhungarumlaut -20
+KPX b umacron -20
+KPX b uogonek -20
+KPX b uring -20
+KPX b v -20
+KPX b y -20
+KPX b yacute -20
+KPX b ydieresis -20
+KPX c comma -15
+KPX c k -20
+KPX c kcommaaccent -20
+KPX cacute comma -15
+KPX cacute k -20
+KPX cacute kcommaaccent -20
+KPX ccaron comma -15
+KPX ccaron k -20
+KPX ccaron kcommaaccent -20
+KPX ccedilla comma -15
+KPX ccedilla k -20
+KPX ccedilla kcommaaccent -20
+KPX colon space -50
+KPX comma quotedblright -100
+KPX comma quoteright -100
+KPX e comma -15
+KPX e period -15
+KPX e v -30
+KPX e w -20
+KPX e x -30
+KPX e y -20
+KPX e yacute -20
+KPX e ydieresis -20
+KPX eacute comma -15
+KPX eacute period -15
+KPX eacute v -30
+KPX eacute w -20
+KPX eacute x -30
+KPX eacute y -20
+KPX eacute yacute -20
+KPX eacute ydieresis -20
+KPX ecaron comma -15
+KPX ecaron period -15
+KPX ecaron v -30
+KPX ecaron w -20
+KPX ecaron x -30
+KPX ecaron y -20
+KPX ecaron yacute -20
+KPX ecaron ydieresis -20
+KPX ecircumflex comma -15
+KPX ecircumflex period -15
+KPX ecircumflex v -30
+KPX ecircumflex w -20
+KPX ecircumflex x -30
+KPX ecircumflex y -20
+KPX ecircumflex yacute -20
+KPX ecircumflex ydieresis -20
+KPX edieresis comma -15
+KPX edieresis period -15
+KPX edieresis v -30
+KPX edieresis w -20
+KPX edieresis x -30
+KPX edieresis y -20
+KPX edieresis yacute -20
+KPX edieresis ydieresis -20
+KPX edotaccent comma -15
+KPX edotaccent period -15
+KPX edotaccent v -30
+KPX edotaccent w -20
+KPX edotaccent x -30
+KPX edotaccent y -20
+KPX edotaccent yacute -20
+KPX edotaccent ydieresis -20
+KPX egrave comma -15
+KPX egrave period -15
+KPX egrave v -30
+KPX egrave w -20
+KPX egrave x -30
+KPX egrave y -20
+KPX egrave yacute -20
+KPX egrave ydieresis -20
+KPX emacron comma -15
+KPX emacron period -15
+KPX emacron v -30
+KPX emacron w -20
+KPX emacron x -30
+KPX emacron y -20
+KPX emacron yacute -20
+KPX emacron ydieresis -20
+KPX eogonek comma -15
+KPX eogonek period -15
+KPX eogonek v -30
+KPX eogonek w -20
+KPX eogonek x -30
+KPX eogonek y -20
+KPX eogonek yacute -20
+KPX eogonek ydieresis -20
+KPX f a -30
+KPX f aacute -30
+KPX f abreve -30
+KPX f acircumflex -30
+KPX f adieresis -30
+KPX f agrave -30
+KPX f amacron -30
+KPX f aogonek -30
+KPX f aring -30
+KPX f atilde -30
+KPX f comma -30
+KPX f dotlessi -28
+KPX f e -30
+KPX f eacute -30
+KPX f ecaron -30
+KPX f ecircumflex -30
+KPX f edieresis -30
+KPX f edotaccent -30
+KPX f egrave -30
+KPX f emacron -30
+KPX f eogonek -30
+KPX f o -30
+KPX f oacute -30
+KPX f ocircumflex -30
+KPX f odieresis -30
+KPX f ograve -30
+KPX f ohungarumlaut -30
+KPX f omacron -30
+KPX f oslash -30
+KPX f otilde -30
+KPX f period -30
+KPX f quotedblright 60
+KPX f quoteright 50
+KPX g r -10
+KPX g racute -10
+KPX g rcaron -10
+KPX g rcommaaccent -10
+KPX gbreve r -10
+KPX gbreve racute -10
+KPX gbreve rcaron -10
+KPX gbreve rcommaaccent -10
+KPX gcommaaccent r -10
+KPX gcommaaccent racute -10
+KPX gcommaaccent rcaron -10
+KPX gcommaaccent rcommaaccent -10
+KPX h y -30
+KPX h yacute -30
+KPX h ydieresis -30
+KPX k e -20
+KPX k eacute -20
+KPX k ecaron -20
+KPX k ecircumflex -20
+KPX k edieresis -20
+KPX k edotaccent -20
+KPX k egrave -20
+KPX k emacron -20
+KPX k eogonek -20
+KPX k o -20
+KPX k oacute -20
+KPX k ocircumflex -20
+KPX k odieresis -20
+KPX k ograve -20
+KPX k ohungarumlaut -20
+KPX k omacron -20
+KPX k oslash -20
+KPX k otilde -20
+KPX kcommaaccent e -20
+KPX kcommaaccent eacute -20
+KPX kcommaaccent ecaron -20
+KPX kcommaaccent ecircumflex -20
+KPX kcommaaccent edieresis -20
+KPX kcommaaccent edotaccent -20
+KPX kcommaaccent egrave -20
+KPX kcommaaccent emacron -20
+KPX kcommaaccent eogonek -20
+KPX kcommaaccent o -20
+KPX kcommaaccent oacute -20
+KPX kcommaaccent ocircumflex -20
+KPX kcommaaccent odieresis -20
+KPX kcommaaccent ograve -20
+KPX kcommaaccent ohungarumlaut -20
+KPX kcommaaccent omacron -20
+KPX kcommaaccent oslash -20
+KPX kcommaaccent otilde -20
+KPX m u -10
+KPX m uacute -10
+KPX m ucircumflex -10
+KPX m udieresis -10
+KPX m ugrave -10
+KPX m uhungarumlaut -10
+KPX m umacron -10
+KPX m uogonek -10
+KPX m uring -10
+KPX m y -15
+KPX m yacute -15
+KPX m ydieresis -15
+KPX n u -10
+KPX n uacute -10
+KPX n ucircumflex -10
+KPX n udieresis -10
+KPX n ugrave -10
+KPX n uhungarumlaut -10
+KPX n umacron -10
+KPX n uogonek -10
+KPX n uring -10
+KPX n v -20
+KPX n y -15
+KPX n yacute -15
+KPX n ydieresis -15
+KPX nacute u -10
+KPX nacute uacute -10
+KPX nacute ucircumflex -10
+KPX nacute udieresis -10
+KPX nacute ugrave -10
+KPX nacute uhungarumlaut -10
+KPX nacute umacron -10
+KPX nacute uogonek -10
+KPX nacute uring -10
+KPX nacute v -20
+KPX nacute y -15
+KPX nacute yacute -15
+KPX nacute ydieresis -15
+KPX ncaron u -10
+KPX ncaron uacute -10
+KPX ncaron ucircumflex -10
+KPX ncaron udieresis -10
+KPX ncaron ugrave -10
+KPX ncaron uhungarumlaut -10
+KPX ncaron umacron -10
+KPX ncaron uogonek -10
+KPX ncaron uring -10
+KPX ncaron v -20
+KPX ncaron y -15
+KPX ncaron yacute -15
+KPX ncaron ydieresis -15
+KPX ncommaaccent u -10
+KPX ncommaaccent uacute -10
+KPX ncommaaccent ucircumflex -10
+KPX ncommaaccent udieresis -10
+KPX ncommaaccent ugrave -10
+KPX ncommaaccent uhungarumlaut -10
+KPX ncommaaccent umacron -10
+KPX ncommaaccent uogonek -10
+KPX ncommaaccent uring -10
+KPX ncommaaccent v -20
+KPX ncommaaccent y -15
+KPX ncommaaccent yacute -15
+KPX ncommaaccent ydieresis -15
+KPX ntilde u -10
+KPX ntilde uacute -10
+KPX ntilde ucircumflex -10
+KPX ntilde udieresis -10
+KPX ntilde ugrave -10
+KPX ntilde uhungarumlaut -10
+KPX ntilde umacron -10
+KPX ntilde uogonek -10
+KPX ntilde uring -10
+KPX ntilde v -20
+KPX ntilde y -15
+KPX ntilde yacute -15
+KPX ntilde ydieresis -15
+KPX o comma -40
+KPX o period -40
+KPX o v -15
+KPX o w -15
+KPX o x -30
+KPX o y -30
+KPX o yacute -30
+KPX o ydieresis -30
+KPX oacute comma -40
+KPX oacute period -40
+KPX oacute v -15
+KPX oacute w -15
+KPX oacute x -30
+KPX oacute y -30
+KPX oacute yacute -30
+KPX oacute ydieresis -30
+KPX ocircumflex comma -40
+KPX ocircumflex period -40
+KPX ocircumflex v -15
+KPX ocircumflex w -15
+KPX ocircumflex x -30
+KPX ocircumflex y -30
+KPX ocircumflex yacute -30
+KPX ocircumflex ydieresis -30
+KPX odieresis comma -40
+KPX odieresis period -40
+KPX odieresis v -15
+KPX odieresis w -15
+KPX odieresis x -30
+KPX odieresis y -30
+KPX odieresis yacute -30
+KPX odieresis ydieresis -30
+KPX ograve comma -40
+KPX ograve period -40
+KPX ograve v -15
+KPX ograve w -15
+KPX ograve x -30
+KPX ograve y -30
+KPX ograve yacute -30
+KPX ograve ydieresis -30
+KPX ohungarumlaut comma -40
+KPX ohungarumlaut period -40
+KPX ohungarumlaut v -15
+KPX ohungarumlaut w -15
+KPX ohungarumlaut x -30
+KPX ohungarumlaut y -30
+KPX ohungarumlaut yacute -30
+KPX ohungarumlaut ydieresis -30
+KPX omacron comma -40
+KPX omacron period -40
+KPX omacron v -15
+KPX omacron w -15
+KPX omacron x -30
+KPX omacron y -30
+KPX omacron yacute -30
+KPX omacron ydieresis -30
+KPX oslash a -55
+KPX oslash aacute -55
+KPX oslash abreve -55
+KPX oslash acircumflex -55
+KPX oslash adieresis -55
+KPX oslash agrave -55
+KPX oslash amacron -55
+KPX oslash aogonek -55
+KPX oslash aring -55
+KPX oslash atilde -55
+KPX oslash b -55
+KPX oslash c -55
+KPX oslash cacute -55
+KPX oslash ccaron -55
+KPX oslash ccedilla -55
+KPX oslash comma -95
+KPX oslash d -55
+KPX oslash dcroat -55
+KPX oslash e -55
+KPX oslash eacute -55
+KPX oslash ecaron -55
+KPX oslash ecircumflex -55
+KPX oslash edieresis -55
+KPX oslash edotaccent -55
+KPX oslash egrave -55
+KPX oslash emacron -55
+KPX oslash eogonek -55
+KPX oslash f -55
+KPX oslash g -55
+KPX oslash gbreve -55
+KPX oslash gcommaaccent -55
+KPX oslash h -55
+KPX oslash i -55
+KPX oslash iacute -55
+KPX oslash icircumflex -55
+KPX oslash idieresis -55
+KPX oslash igrave -55
+KPX oslash imacron -55
+KPX oslash iogonek -55
+KPX oslash j -55
+KPX oslash k -55
+KPX oslash kcommaaccent -55
+KPX oslash l -55
+KPX oslash lacute -55
+KPX oslash lcommaaccent -55
+KPX oslash lslash -55
+KPX oslash m -55
+KPX oslash n -55
+KPX oslash nacute -55
+KPX oslash ncaron -55
+KPX oslash ncommaaccent -55
+KPX oslash ntilde -55
+KPX oslash o -55
+KPX oslash oacute -55
+KPX oslash ocircumflex -55
+KPX oslash odieresis -55
+KPX oslash ograve -55
+KPX oslash ohungarumlaut -55
+KPX oslash omacron -55
+KPX oslash oslash -55
+KPX oslash otilde -55
+KPX oslash p -55
+KPX oslash period -95
+KPX oslash q -55
+KPX oslash r -55
+KPX oslash racute -55
+KPX oslash rcaron -55
+KPX oslash rcommaaccent -55
+KPX oslash s -55
+KPX oslash sacute -55
+KPX oslash scaron -55
+KPX oslash scedilla -55
+KPX oslash scommaaccent -55
+KPX oslash t -55
+KPX oslash tcommaaccent -55
+KPX oslash u -55
+KPX oslash uacute -55
+KPX oslash ucircumflex -55
+KPX oslash udieresis -55
+KPX oslash ugrave -55
+KPX oslash uhungarumlaut -55
+KPX oslash umacron -55
+KPX oslash uogonek -55
+KPX oslash uring -55
+KPX oslash v -70
+KPX oslash w -70
+KPX oslash x -85
+KPX oslash y -70
+KPX oslash yacute -70
+KPX oslash ydieresis -70
+KPX oslash z -55
+KPX oslash zacute -55
+KPX oslash zcaron -55
+KPX oslash zdotaccent -55
+KPX otilde comma -40
+KPX otilde period -40
+KPX otilde v -15
+KPX otilde w -15
+KPX otilde x -30
+KPX otilde y -30
+KPX otilde yacute -30
+KPX otilde ydieresis -30
+KPX p comma -35
+KPX p period -35
+KPX p y -30
+KPX p yacute -30
+KPX p ydieresis -30
+KPX period quotedblright -100
+KPX period quoteright -100
+KPX period space -60
+KPX quotedblright space -40
+KPX quoteleft quoteleft -57
+KPX quoteright d -50
+KPX quoteright dcroat -50
+KPX quoteright quoteright -57
+KPX quoteright r -50
+KPX quoteright racute -50
+KPX quoteright rcaron -50
+KPX quoteright rcommaaccent -50
+KPX quoteright s -50
+KPX quoteright sacute -50
+KPX quoteright scaron -50
+KPX quoteright scedilla -50
+KPX quoteright scommaaccent -50
+KPX quoteright space -70
+KPX r a -10
+KPX r aacute -10
+KPX r abreve -10
+KPX r acircumflex -10
+KPX r adieresis -10
+KPX r agrave -10
+KPX r amacron -10
+KPX r aogonek -10
+KPX r aring -10
+KPX r atilde -10
+KPX r colon 30
+KPX r comma -50
+KPX r i 15
+KPX r iacute 15
+KPX r icircumflex 15
+KPX r idieresis 15
+KPX r igrave 15
+KPX r imacron 15
+KPX r iogonek 15
+KPX r k 15
+KPX r kcommaaccent 15
+KPX r l 15
+KPX r lacute 15
+KPX r lcommaaccent 15
+KPX r lslash 15
+KPX r m 25
+KPX r n 25
+KPX r nacute 25
+KPX r ncaron 25
+KPX r ncommaaccent 25
+KPX r ntilde 25
+KPX r p 30
+KPX r period -50
+KPX r semicolon 30
+KPX r t 40
+KPX r tcommaaccent 40
+KPX r u 15
+KPX r uacute 15
+KPX r ucircumflex 15
+KPX r udieresis 15
+KPX r ugrave 15
+KPX r uhungarumlaut 15
+KPX r umacron 15
+KPX r uogonek 15
+KPX r uring 15
+KPX r v 30
+KPX r y 30
+KPX r yacute 30
+KPX r ydieresis 30
+KPX racute a -10
+KPX racute aacute -10
+KPX racute abreve -10
+KPX racute acircumflex -10
+KPX racute adieresis -10
+KPX racute agrave -10
+KPX racute amacron -10
+KPX racute aogonek -10
+KPX racute aring -10
+KPX racute atilde -10
+KPX racute colon 30
+KPX racute comma -50
+KPX racute i 15
+KPX racute iacute 15
+KPX racute icircumflex 15
+KPX racute idieresis 15
+KPX racute igrave 15
+KPX racute imacron 15
+KPX racute iogonek 15
+KPX racute k 15
+KPX racute kcommaaccent 15
+KPX racute l 15
+KPX racute lacute 15
+KPX racute lcommaaccent 15
+KPX racute lslash 15
+KPX racute m 25
+KPX racute n 25
+KPX racute nacute 25
+KPX racute ncaron 25
+KPX racute ncommaaccent 25
+KPX racute ntilde 25
+KPX racute p 30
+KPX racute period -50
+KPX racute semicolon 30
+KPX racute t 40
+KPX racute tcommaaccent 40
+KPX racute u 15
+KPX racute uacute 15
+KPX racute ucircumflex 15
+KPX racute udieresis 15
+KPX racute ugrave 15
+KPX racute uhungarumlaut 15
+KPX racute umacron 15
+KPX racute uogonek 15
+KPX racute uring 15
+KPX racute v 30
+KPX racute y 30
+KPX racute yacute 30
+KPX racute ydieresis 30
+KPX rcaron a -10
+KPX rcaron aacute -10
+KPX rcaron abreve -10
+KPX rcaron acircumflex -10
+KPX rcaron adieresis -10
+KPX rcaron agrave -10
+KPX rcaron amacron -10
+KPX rcaron aogonek -10
+KPX rcaron aring -10
+KPX rcaron atilde -10
+KPX rcaron colon 30
+KPX rcaron comma -50
+KPX rcaron i 15
+KPX rcaron iacute 15
+KPX rcaron icircumflex 15
+KPX rcaron idieresis 15
+KPX rcaron igrave 15
+KPX rcaron imacron 15
+KPX rcaron iogonek 15
+KPX rcaron k 15
+KPX rcaron kcommaaccent 15
+KPX rcaron l 15
+KPX rcaron lacute 15
+KPX rcaron lcommaaccent 15
+KPX rcaron lslash 15
+KPX rcaron m 25
+KPX rcaron n 25
+KPX rcaron nacute 25
+KPX rcaron ncaron 25
+KPX rcaron ncommaaccent 25
+KPX rcaron ntilde 25
+KPX rcaron p 30
+KPX rcaron period -50
+KPX rcaron semicolon 30
+KPX rcaron t 40
+KPX rcaron tcommaaccent 40
+KPX rcaron u 15
+KPX rcaron uacute 15
+KPX rcaron ucircumflex 15
+KPX rcaron udieresis 15
+KPX rcaron ugrave 15
+KPX rcaron uhungarumlaut 15
+KPX rcaron umacron 15
+KPX rcaron uogonek 15
+KPX rcaron uring 15
+KPX rcaron v 30
+KPX rcaron y 30
+KPX rcaron yacute 30
+KPX rcaron ydieresis 30
+KPX rcommaaccent a -10
+KPX rcommaaccent aacute -10
+KPX rcommaaccent abreve -10
+KPX rcommaaccent acircumflex -10
+KPX rcommaaccent adieresis -10
+KPX rcommaaccent agrave -10
+KPX rcommaaccent amacron -10
+KPX rcommaaccent aogonek -10
+KPX rcommaaccent aring -10
+KPX rcommaaccent atilde -10
+KPX rcommaaccent colon 30
+KPX rcommaaccent comma -50
+KPX rcommaaccent i 15
+KPX rcommaaccent iacute 15
+KPX rcommaaccent icircumflex 15
+KPX rcommaaccent idieresis 15
+KPX rcommaaccent igrave 15
+KPX rcommaaccent imacron 15
+KPX rcommaaccent iogonek 15
+KPX rcommaaccent k 15
+KPX rcommaaccent kcommaaccent 15
+KPX rcommaaccent l 15
+KPX rcommaaccent lacute 15
+KPX rcommaaccent lcommaaccent 15
+KPX rcommaaccent lslash 15
+KPX rcommaaccent m 25
+KPX rcommaaccent n 25
+KPX rcommaaccent nacute 25
+KPX rcommaaccent ncaron 25
+KPX rcommaaccent ncommaaccent 25
+KPX rcommaaccent ntilde 25
+KPX rcommaaccent p 30
+KPX rcommaaccent period -50
+KPX rcommaaccent semicolon 30
+KPX rcommaaccent t 40
+KPX rcommaaccent tcommaaccent 40
+KPX rcommaaccent u 15
+KPX rcommaaccent uacute 15
+KPX rcommaaccent ucircumflex 15
+KPX rcommaaccent udieresis 15
+KPX rcommaaccent ugrave 15
+KPX rcommaaccent uhungarumlaut 15
+KPX rcommaaccent umacron 15
+KPX rcommaaccent uogonek 15
+KPX rcommaaccent uring 15
+KPX rcommaaccent v 30
+KPX rcommaaccent y 30
+KPX rcommaaccent yacute 30
+KPX rcommaaccent ydieresis 30
+KPX s comma -15
+KPX s period -15
+KPX s w -30
+KPX sacute comma -15
+KPX sacute period -15
+KPX sacute w -30
+KPX scaron comma -15
+KPX scaron period -15
+KPX scaron w -30
+KPX scedilla comma -15
+KPX scedilla period -15
+KPX scedilla w -30
+KPX scommaaccent comma -15
+KPX scommaaccent period -15
+KPX scommaaccent w -30
+KPX semicolon space -50
+KPX space T -50
+KPX space Tcaron -50
+KPX space Tcommaaccent -50
+KPX space V -50
+KPX space W -40
+KPX space Y -90
+KPX space Yacute -90
+KPX space Ydieresis -90
+KPX space quotedblleft -30
+KPX space quoteleft -60
+KPX v a -25
+KPX v aacute -25
+KPX v abreve -25
+KPX v acircumflex -25
+KPX v adieresis -25
+KPX v agrave -25
+KPX v amacron -25
+KPX v aogonek -25
+KPX v aring -25
+KPX v atilde -25
+KPX v comma -80
+KPX v e -25
+KPX v eacute -25
+KPX v ecaron -25
+KPX v ecircumflex -25
+KPX v edieresis -25
+KPX v edotaccent -25
+KPX v egrave -25
+KPX v emacron -25
+KPX v eogonek -25
+KPX v o -25
+KPX v oacute -25
+KPX v ocircumflex -25
+KPX v odieresis -25
+KPX v ograve -25
+KPX v ohungarumlaut -25
+KPX v omacron -25
+KPX v oslash -25
+KPX v otilde -25
+KPX v period -80
+KPX w a -15
+KPX w aacute -15
+KPX w abreve -15
+KPX w acircumflex -15
+KPX w adieresis -15
+KPX w agrave -15
+KPX w amacron -15
+KPX w aogonek -15
+KPX w aring -15
+KPX w atilde -15
+KPX w comma -60
+KPX w e -10
+KPX w eacute -10
+KPX w ecaron -10
+KPX w ecircumflex -10
+KPX w edieresis -10
+KPX w edotaccent -10
+KPX w egrave -10
+KPX w emacron -10
+KPX w eogonek -10
+KPX w o -10
+KPX w oacute -10
+KPX w ocircumflex -10
+KPX w odieresis -10
+KPX w ograve -10
+KPX w ohungarumlaut -10
+KPX w omacron -10
+KPX w oslash -10
+KPX w otilde -10
+KPX w period -60
+KPX x e -30
+KPX x eacute -30
+KPX x ecaron -30
+KPX x ecircumflex -30
+KPX x edieresis -30
+KPX x edotaccent -30
+KPX x egrave -30
+KPX x emacron -30
+KPX x eogonek -30
+KPX y a -20
+KPX y aacute -20
+KPX y abreve -20
+KPX y acircumflex -20
+KPX y adieresis -20
+KPX y agrave -20
+KPX y amacron -20
+KPX y aogonek -20
+KPX y aring -20
+KPX y atilde -20
+KPX y comma -100
+KPX y e -20
+KPX y eacute -20
+KPX y ecaron -20
+KPX y ecircumflex -20
+KPX y edieresis -20
+KPX y edotaccent -20
+KPX y egrave -20
+KPX y emacron -20
+KPX y eogonek -20
+KPX y o -20
+KPX y oacute -20
+KPX y ocircumflex -20
+KPX y odieresis -20
+KPX y ograve -20
+KPX y ohungarumlaut -20
+KPX y omacron -20
+KPX y oslash -20
+KPX y otilde -20
+KPX y period -100
+KPX yacute a -20
+KPX yacute aacute -20
+KPX yacute abreve -20
+KPX yacute acircumflex -20
+KPX yacute adieresis -20
+KPX yacute agrave -20
+KPX yacute amacron -20
+KPX yacute aogonek -20
+KPX yacute aring -20
+KPX yacute atilde -20
+KPX yacute comma -100
+KPX yacute e -20
+KPX yacute eacute -20
+KPX yacute ecaron -20
+KPX yacute ecircumflex -20
+KPX yacute edieresis -20
+KPX yacute edotaccent -20
+KPX yacute egrave -20
+KPX yacute emacron -20
+KPX yacute eogonek -20
+KPX yacute o -20
+KPX yacute oacute -20
+KPX yacute ocircumflex -20
+KPX yacute odieresis -20
+KPX yacute ograve -20
+KPX yacute ohungarumlaut -20
+KPX yacute omacron -20
+KPX yacute oslash -20
+KPX yacute otilde -20
+KPX yacute period -100
+KPX ydieresis a -20
+KPX ydieresis aacute -20
+KPX ydieresis abreve -20
+KPX ydieresis acircumflex -20
+KPX ydieresis adieresis -20
+KPX ydieresis agrave -20
+KPX ydieresis amacron -20
+KPX ydieresis aogonek -20
+KPX ydieresis aring -20
+KPX ydieresis atilde -20
+KPX ydieresis comma -100
+KPX ydieresis e -20
+KPX ydieresis eacute -20
+KPX ydieresis ecaron -20
+KPX ydieresis ecircumflex -20
+KPX ydieresis edieresis -20
+KPX ydieresis edotaccent -20
+KPX ydieresis egrave -20
+KPX ydieresis emacron -20
+KPX ydieresis eogonek -20
+KPX ydieresis o -20
+KPX ydieresis oacute -20
+KPX ydieresis ocircumflex -20
+KPX ydieresis odieresis -20
+KPX ydieresis ograve -20
+KPX ydieresis ohungarumlaut -20
+KPX ydieresis omacron -20
+KPX ydieresis oslash -20
+KPX ydieresis otilde -20
+KPX ydieresis period -100
+KPX z e -15
+KPX z eacute -15
+KPX z ecaron -15
+KPX z ecircumflex -15
+KPX z edieresis -15
+KPX z edotaccent -15
+KPX z egrave -15
+KPX z emacron -15
+KPX z eogonek -15
+KPX z o -15
+KPX z oacute -15
+KPX z ocircumflex -15
+KPX z odieresis -15
+KPX z ograve -15
+KPX z ohungarumlaut -15
+KPX z omacron -15
+KPX z oslash -15
+KPX z otilde -15
+KPX zacute e -15
+KPX zacute eacute -15
+KPX zacute ecaron -15
+KPX zacute ecircumflex -15
+KPX zacute edieresis -15
+KPX zacute edotaccent -15
+KPX zacute egrave -15
+KPX zacute emacron -15
+KPX zacute eogonek -15
+KPX zacute o -15
+KPX zacute oacute -15
+KPX zacute ocircumflex -15
+KPX zacute odieresis -15
+KPX zacute ograve -15
+KPX zacute ohungarumlaut -15
+KPX zacute omacron -15
+KPX zacute oslash -15
+KPX zacute otilde -15
+KPX zcaron e -15
+KPX zcaron eacute -15
+KPX zcaron ecaron -15
+KPX zcaron ecircumflex -15
+KPX zcaron edieresis -15
+KPX zcaron edotaccent -15
+KPX zcaron egrave -15
+KPX zcaron emacron -15
+KPX zcaron eogonek -15
+KPX zcaron o -15
+KPX zcaron oacute -15
+KPX zcaron ocircumflex -15
+KPX zcaron odieresis -15
+KPX zcaron ograve -15
+KPX zcaron ohungarumlaut -15
+KPX zcaron omacron -15
+KPX zcaron oslash -15
+KPX zcaron otilde -15
+KPX zdotaccent e -15
+KPX zdotaccent eacute -15
+KPX zdotaccent ecaron -15
+KPX zdotaccent ecircumflex -15
+KPX zdotaccent edieresis -15
+KPX zdotaccent edotaccent -15
+KPX zdotaccent egrave -15
+KPX zdotaccent emacron -15
+KPX zdotaccent eogonek -15
+KPX zdotaccent o -15
+KPX zdotaccent oacute -15
+KPX zdotaccent ocircumflex -15
+KPX zdotaccent odieresis -15
+KPX zdotaccent ograve -15
+KPX zdotaccent ohungarumlaut -15
+KPX zdotaccent omacron -15
+KPX zdotaccent oslash -15
+KPX zdotaccent otilde -15
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/src/fonts/Adobe-Core35_AFMs-314/Helvetica-Oblique.afm b/src/fonts/Adobe-Core35_AFMs-314/Helvetica-Oblique.afm
new file mode 100644
index 0000000..4d5dbbc
--- /dev/null
+++ b/src/fonts/Adobe-Core35_AFMs-314/Helvetica-Oblique.afm
@@ -0,0 +1,3049 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Thu May 1 12:44:31 1997
+Comment UniqueID 43055
+Comment VMusage 14960 69346
+FontName Helvetica-Oblique
+FullName Helvetica Oblique
+FamilyName Helvetica
+Weight Medium
+ItalicAngle -12
+IsFixedPitch false
+FontBBox -170 -225 1116 931
+UnderlinePosition -100
+UnderlineThickness 50
+Version 002.000
+Notice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries.
+EncodingScheme AdobeStandardEncoding
+CapHeight 718
+XHeight 523
+Ascender 718
+Descender -207
+StdHW 76
+StdVW 88
+StartCharMetrics 314
+C 32 ; WX 278 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 278 ; N exclam ; B 90 0 340 718 ;
+C 34 ; WX 355 ; N quotedbl ; B 168 463 438 718 ;
+C 35 ; WX 556 ; N numbersign ; B 73 0 631 688 ;
+C 36 ; WX 556 ; N dollar ; B 69 -115 617 775 ;
+C 37 ; WX 889 ; N percent ; B 147 -19 889 703 ;
+C 38 ; WX 667 ; N ampersand ; B 77 -15 647 718 ;
+C 39 ; WX 222 ; N quoteright ; B 151 463 310 718 ;
+C 40 ; WX 333 ; N parenleft ; B 108 -207 454 733 ;
+C 41 ; WX 333 ; N parenright ; B -9 -207 337 733 ;
+C 42 ; WX 389 ; N asterisk ; B 165 431 475 718 ;
+C 43 ; WX 584 ; N plus ; B 85 0 606 505 ;
+C 44 ; WX 278 ; N comma ; B 56 -147 214 106 ;
+C 45 ; WX 333 ; N hyphen ; B 93 232 357 322 ;
+C 46 ; WX 278 ; N period ; B 87 0 214 106 ;
+C 47 ; WX 278 ; N slash ; B -21 -19 452 737 ;
+C 48 ; WX 556 ; N zero ; B 93 -19 608 703 ;
+C 49 ; WX 556 ; N one ; B 207 0 508 703 ;
+C 50 ; WX 556 ; N two ; B 26 0 617 703 ;
+C 51 ; WX 556 ; N three ; B 75 -19 610 703 ;
+C 52 ; WX 556 ; N four ; B 61 0 576 703 ;
+C 53 ; WX 556 ; N five ; B 68 -19 621 688 ;
+C 54 ; WX 556 ; N six ; B 91 -19 615 703 ;
+C 55 ; WX 556 ; N seven ; B 137 0 669 688 ;
+C 56 ; WX 556 ; N eight ; B 74 -19 607 703 ;
+C 57 ; WX 556 ; N nine ; B 82 -19 609 703 ;
+C 58 ; WX 278 ; N colon ; B 87 0 301 516 ;
+C 59 ; WX 278 ; N semicolon ; B 56 -147 301 516 ;
+C 60 ; WX 584 ; N less ; B 94 11 641 495 ;
+C 61 ; WX 584 ; N equal ; B 63 115 628 390 ;
+C 62 ; WX 584 ; N greater ; B 50 11 597 495 ;
+C 63 ; WX 556 ; N question ; B 161 0 610 727 ;
+C 64 ; WX 1015 ; N at ; B 215 -19 965 737 ;
+C 65 ; WX 667 ; N A ; B 14 0 654 718 ;
+C 66 ; WX 667 ; N B ; B 74 0 712 718 ;
+C 67 ; WX 722 ; N C ; B 108 -19 782 737 ;
+C 68 ; WX 722 ; N D ; B 81 0 764 718 ;
+C 69 ; WX 667 ; N E ; B 86 0 762 718 ;
+C 70 ; WX 611 ; N F ; B 86 0 736 718 ;
+C 71 ; WX 778 ; N G ; B 111 -19 799 737 ;
+C 72 ; WX 722 ; N H ; B 77 0 799 718 ;
+C 73 ; WX 278 ; N I ; B 91 0 341 718 ;
+C 74 ; WX 500 ; N J ; B 47 -19 581 718 ;
+C 75 ; WX 667 ; N K ; B 76 0 808 718 ;
+C 76 ; WX 556 ; N L ; B 76 0 555 718 ;
+C 77 ; WX 833 ; N M ; B 73 0 914 718 ;
+C 78 ; WX 722 ; N N ; B 76 0 799 718 ;
+C 79 ; WX 778 ; N O ; B 105 -19 826 737 ;
+C 80 ; WX 667 ; N P ; B 86 0 737 718 ;
+C 81 ; WX 778 ; N Q ; B 105 -56 826 737 ;
+C 82 ; WX 722 ; N R ; B 88 0 773 718 ;
+C 83 ; WX 667 ; N S ; B 90 -19 713 737 ;
+C 84 ; WX 611 ; N T ; B 148 0 750 718 ;
+C 85 ; WX 722 ; N U ; B 123 -19 797 718 ;
+C 86 ; WX 667 ; N V ; B 173 0 800 718 ;
+C 87 ; WX 944 ; N W ; B 169 0 1081 718 ;
+C 88 ; WX 667 ; N X ; B 19 0 790 718 ;
+C 89 ; WX 667 ; N Y ; B 167 0 806 718 ;
+C 90 ; WX 611 ; N Z ; B 23 0 741 718 ;
+C 91 ; WX 278 ; N bracketleft ; B 21 -196 403 722 ;
+C 92 ; WX 278 ; N backslash ; B 140 -19 291 737 ;
+C 93 ; WX 278 ; N bracketright ; B -14 -196 368 722 ;
+C 94 ; WX 469 ; N asciicircum ; B 42 264 539 688 ;
+C 95 ; WX 556 ; N underscore ; B -27 -125 540 -75 ;
+C 96 ; WX 222 ; N quoteleft ; B 165 470 323 725 ;
+C 97 ; WX 556 ; N a ; B 61 -15 559 538 ;
+C 98 ; WX 556 ; N b ; B 58 -15 584 718 ;
+C 99 ; WX 500 ; N c ; B 74 -15 553 538 ;
+C 100 ; WX 556 ; N d ; B 84 -15 652 718 ;
+C 101 ; WX 556 ; N e ; B 84 -15 578 538 ;
+C 102 ; WX 278 ; N f ; B 86 0 416 728 ; L i fi ; L l fl ;
+C 103 ; WX 556 ; N g ; B 42 -220 610 538 ;
+C 104 ; WX 556 ; N h ; B 65 0 573 718 ;
+C 105 ; WX 222 ; N i ; B 67 0 308 718 ;
+C 106 ; WX 222 ; N j ; B -60 -210 308 718 ;
+C 107 ; WX 500 ; N k ; B 67 0 600 718 ;
+C 108 ; WX 222 ; N l ; B 67 0 308 718 ;
+C 109 ; WX 833 ; N m ; B 65 0 852 538 ;
+C 110 ; WX 556 ; N n ; B 65 0 573 538 ;
+C 111 ; WX 556 ; N o ; B 83 -14 585 538 ;
+C 112 ; WX 556 ; N p ; B 14 -207 584 538 ;
+C 113 ; WX 556 ; N q ; B 84 -207 605 538 ;
+C 114 ; WX 333 ; N r ; B 77 0 446 538 ;
+C 115 ; WX 500 ; N s ; B 63 -15 529 538 ;
+C 116 ; WX 278 ; N t ; B 102 -7 368 669 ;
+C 117 ; WX 556 ; N u ; B 94 -15 600 523 ;
+C 118 ; WX 500 ; N v ; B 119 0 603 523 ;
+C 119 ; WX 722 ; N w ; B 125 0 820 523 ;
+C 120 ; WX 500 ; N x ; B 11 0 594 523 ;
+C 121 ; WX 500 ; N y ; B 15 -214 600 523 ;
+C 122 ; WX 500 ; N z ; B 31 0 571 523 ;
+C 123 ; WX 334 ; N braceleft ; B 92 -196 445 722 ;
+C 124 ; WX 260 ; N bar ; B 46 -225 332 775 ;
+C 125 ; WX 334 ; N braceright ; B 0 -196 354 722 ;
+C 126 ; WX 584 ; N asciitilde ; B 111 180 580 326 ;
+C 161 ; WX 333 ; N exclamdown ; B 77 -195 326 523 ;
+C 162 ; WX 556 ; N cent ; B 95 -115 584 623 ;
+C 163 ; WX 556 ; N sterling ; B 49 -16 634 718 ;
+C 164 ; WX 167 ; N fraction ; B -170 -19 482 703 ;
+C 165 ; WX 556 ; N yen ; B 81 0 699 688 ;
+C 166 ; WX 556 ; N florin ; B -52 -207 654 737 ;
+C 167 ; WX 556 ; N section ; B 76 -191 584 737 ;
+C 168 ; WX 556 ; N currency ; B 60 99 646 603 ;
+C 169 ; WX 191 ; N quotesingle ; B 157 463 285 718 ;
+C 170 ; WX 333 ; N quotedblleft ; B 138 470 461 725 ;
+C 171 ; WX 556 ; N guillemotleft ; B 146 108 554 446 ;
+C 172 ; WX 333 ; N guilsinglleft ; B 137 108 340 446 ;
+C 173 ; WX 333 ; N guilsinglright ; B 111 108 314 446 ;
+C 174 ; WX 500 ; N fi ; B 86 0 587 728 ;
+C 175 ; WX 500 ; N fl ; B 86 0 585 728 ;
+C 177 ; WX 556 ; N endash ; B 51 240 623 313 ;
+C 178 ; WX 556 ; N dagger ; B 135 -159 622 718 ;
+C 179 ; WX 556 ; N daggerdbl ; B 52 -159 623 718 ;
+C 180 ; WX 278 ; N periodcentered ; B 129 190 257 315 ;
+C 182 ; WX 537 ; N paragraph ; B 126 -173 650 718 ;
+C 183 ; WX 350 ; N bullet ; B 91 202 413 517 ;
+C 184 ; WX 222 ; N quotesinglbase ; B 21 -149 180 106 ;
+C 185 ; WX 333 ; N quotedblbase ; B -6 -149 318 106 ;
+C 186 ; WX 333 ; N quotedblright ; B 124 463 448 718 ;
+C 187 ; WX 556 ; N guillemotright ; B 120 108 528 446 ;
+C 188 ; WX 1000 ; N ellipsis ; B 115 0 908 106 ;
+C 189 ; WX 1000 ; N perthousand ; B 88 -19 1029 703 ;
+C 191 ; WX 611 ; N questiondown ; B 85 -201 534 525 ;
+C 193 ; WX 333 ; N grave ; B 170 593 337 734 ;
+C 194 ; WX 333 ; N acute ; B 248 593 475 734 ;
+C 195 ; WX 333 ; N circumflex ; B 147 593 438 734 ;
+C 196 ; WX 333 ; N tilde ; B 125 606 490 722 ;
+C 197 ; WX 333 ; N macron ; B 143 627 468 684 ;
+C 198 ; WX 333 ; N breve ; B 167 595 476 731 ;
+C 199 ; WX 333 ; N dotaccent ; B 249 604 362 706 ;
+C 200 ; WX 333 ; N dieresis ; B 168 604 443 706 ;
+C 202 ; WX 333 ; N ring ; B 214 572 402 756 ;
+C 203 ; WX 333 ; N cedilla ; B 2 -225 232 0 ;
+C 205 ; WX 333 ; N hungarumlaut ; B 157 593 565 734 ;
+C 206 ; WX 333 ; N ogonek ; B 43 -225 249 0 ;
+C 207 ; WX 333 ; N caron ; B 177 593 468 734 ;
+C 208 ; WX 1000 ; N emdash ; B 51 240 1067 313 ;
+C 225 ; WX 1000 ; N AE ; B 8 0 1097 718 ;
+C 227 ; WX 370 ; N ordfeminine ; B 127 405 449 737 ;
+C 232 ; WX 556 ; N Lslash ; B 41 0 555 718 ;
+C 233 ; WX 778 ; N Oslash ; B 43 -19 890 737 ;
+C 234 ; WX 1000 ; N OE ; B 98 -19 1116 737 ;
+C 235 ; WX 365 ; N ordmasculine ; B 141 405 468 737 ;
+C 241 ; WX 889 ; N ae ; B 61 -15 909 538 ;
+C 245 ; WX 278 ; N dotlessi ; B 95 0 294 523 ;
+C 248 ; WX 222 ; N lslash ; B 41 0 347 718 ;
+C 249 ; WX 611 ; N oslash ; B 29 -22 647 545 ;
+C 250 ; WX 944 ; N oe ; B 83 -15 964 538 ;
+C 251 ; WX 611 ; N germandbls ; B 67 -15 658 728 ;
+C -1 ; WX 278 ; N Idieresis ; B 91 0 458 901 ;
+C -1 ; WX 556 ; N eacute ; B 84 -15 587 734 ;
+C -1 ; WX 556 ; N abreve ; B 61 -15 578 731 ;
+C -1 ; WX 556 ; N uhungarumlaut ; B 94 -15 677 734 ;
+C -1 ; WX 556 ; N ecaron ; B 84 -15 580 734 ;
+C -1 ; WX 667 ; N Ydieresis ; B 167 0 806 901 ;
+C -1 ; WX 584 ; N divide ; B 85 -19 606 524 ;
+C -1 ; WX 667 ; N Yacute ; B 167 0 806 929 ;
+C -1 ; WX 667 ; N Acircumflex ; B 14 0 654 929 ;
+C -1 ; WX 556 ; N aacute ; B 61 -15 587 734 ;
+C -1 ; WX 722 ; N Ucircumflex ; B 123 -19 797 929 ;
+C -1 ; WX 500 ; N yacute ; B 15 -214 600 734 ;
+C -1 ; WX 500 ; N scommaaccent ; B 63 -225 529 538 ;
+C -1 ; WX 556 ; N ecircumflex ; B 84 -15 578 734 ;
+C -1 ; WX 722 ; N Uring ; B 123 -19 797 931 ;
+C -1 ; WX 722 ; N Udieresis ; B 123 -19 797 901 ;
+C -1 ; WX 556 ; N aogonek ; B 61 -220 559 538 ;
+C -1 ; WX 722 ; N Uacute ; B 123 -19 797 929 ;
+C -1 ; WX 556 ; N uogonek ; B 94 -225 600 523 ;
+C -1 ; WX 667 ; N Edieresis ; B 86 0 762 901 ;
+C -1 ; WX 722 ; N Dcroat ; B 69 0 764 718 ;
+C -1 ; WX 250 ; N commaaccent ; B 39 -225 172 -40 ;
+C -1 ; WX 737 ; N copyright ; B 54 -19 837 737 ;
+C -1 ; WX 667 ; N Emacron ; B 86 0 762 879 ;
+C -1 ; WX 500 ; N ccaron ; B 74 -15 553 734 ;
+C -1 ; WX 556 ; N aring ; B 61 -15 559 756 ;
+C -1 ; WX 722 ; N Ncommaaccent ; B 76 -225 799 718 ;
+C -1 ; WX 222 ; N lacute ; B 67 0 461 929 ;
+C -1 ; WX 556 ; N agrave ; B 61 -15 559 734 ;
+C -1 ; WX 611 ; N Tcommaaccent ; B 148 -225 750 718 ;
+C -1 ; WX 722 ; N Cacute ; B 108 -19 782 929 ;
+C -1 ; WX 556 ; N atilde ; B 61 -15 592 722 ;
+C -1 ; WX 667 ; N Edotaccent ; B 86 0 762 901 ;
+C -1 ; WX 500 ; N scaron ; B 63 -15 552 734 ;
+C -1 ; WX 500 ; N scedilla ; B 63 -225 529 538 ;
+C -1 ; WX 278 ; N iacute ; B 95 0 448 734 ;
+C -1 ; WX 471 ; N lozenge ; B 88 0 540 728 ;
+C -1 ; WX 722 ; N Rcaron ; B 88 0 773 929 ;
+C -1 ; WX 778 ; N Gcommaaccent ; B 111 -225 799 737 ;
+C -1 ; WX 556 ; N ucircumflex ; B 94 -15 600 734 ;
+C -1 ; WX 556 ; N acircumflex ; B 61 -15 559 734 ;
+C -1 ; WX 667 ; N Amacron ; B 14 0 677 879 ;
+C -1 ; WX 333 ; N rcaron ; B 77 0 508 734 ;
+C -1 ; WX 500 ; N ccedilla ; B 74 -225 553 538 ;
+C -1 ; WX 611 ; N Zdotaccent ; B 23 0 741 901 ;
+C -1 ; WX 667 ; N Thorn ; B 86 0 712 718 ;
+C -1 ; WX 778 ; N Omacron ; B 105 -19 826 879 ;
+C -1 ; WX 722 ; N Racute ; B 88 0 773 929 ;
+C -1 ; WX 667 ; N Sacute ; B 90 -19 713 929 ;
+C -1 ; WX 643 ; N dcaron ; B 84 -15 808 718 ;
+C -1 ; WX 722 ; N Umacron ; B 123 -19 797 879 ;
+C -1 ; WX 556 ; N uring ; B 94 -15 600 756 ;
+C -1 ; WX 333 ; N threesuperior ; B 90 270 436 703 ;
+C -1 ; WX 778 ; N Ograve ; B 105 -19 826 929 ;
+C -1 ; WX 667 ; N Agrave ; B 14 0 654 929 ;
+C -1 ; WX 667 ; N Abreve ; B 14 0 685 926 ;
+C -1 ; WX 584 ; N multiply ; B 50 0 642 506 ;
+C -1 ; WX 556 ; N uacute ; B 94 -15 600 734 ;
+C -1 ; WX 611 ; N Tcaron ; B 148 0 750 929 ;
+C -1 ; WX 476 ; N partialdiff ; B 41 -38 550 714 ;
+C -1 ; WX 500 ; N ydieresis ; B 15 -214 600 706 ;
+C -1 ; WX 722 ; N Nacute ; B 76 0 799 929 ;
+C -1 ; WX 278 ; N icircumflex ; B 95 0 411 734 ;
+C -1 ; WX 667 ; N Ecircumflex ; B 86 0 762 929 ;
+C -1 ; WX 556 ; N adieresis ; B 61 -15 559 706 ;
+C -1 ; WX 556 ; N edieresis ; B 84 -15 578 706 ;
+C -1 ; WX 500 ; N cacute ; B 74 -15 559 734 ;
+C -1 ; WX 556 ; N nacute ; B 65 0 587 734 ;
+C -1 ; WX 556 ; N umacron ; B 94 -15 600 684 ;
+C -1 ; WX 722 ; N Ncaron ; B 76 0 799 929 ;
+C -1 ; WX 278 ; N Iacute ; B 91 0 489 929 ;
+C -1 ; WX 584 ; N plusminus ; B 39 0 618 506 ;
+C -1 ; WX 260 ; N brokenbar ; B 62 -150 316 700 ;
+C -1 ; WX 737 ; N registered ; B 54 -19 837 737 ;
+C -1 ; WX 778 ; N Gbreve ; B 111 -19 799 926 ;
+C -1 ; WX 278 ; N Idotaccent ; B 91 0 377 901 ;
+C -1 ; WX 600 ; N summation ; B 15 -10 671 706 ;
+C -1 ; WX 667 ; N Egrave ; B 86 0 762 929 ;
+C -1 ; WX 333 ; N racute ; B 77 0 475 734 ;
+C -1 ; WX 556 ; N omacron ; B 83 -14 585 684 ;
+C -1 ; WX 611 ; N Zacute ; B 23 0 741 929 ;
+C -1 ; WX 611 ; N Zcaron ; B 23 0 741 929 ;
+C -1 ; WX 549 ; N greaterequal ; B 26 0 620 674 ;
+C -1 ; WX 722 ; N Eth ; B 69 0 764 718 ;
+C -1 ; WX 722 ; N Ccedilla ; B 108 -225 782 737 ;
+C -1 ; WX 222 ; N lcommaaccent ; B 25 -225 308 718 ;
+C -1 ; WX 317 ; N tcaron ; B 102 -7 501 808 ;
+C -1 ; WX 556 ; N eogonek ; B 84 -225 578 538 ;
+C -1 ; WX 722 ; N Uogonek ; B 123 -225 797 718 ;
+C -1 ; WX 667 ; N Aacute ; B 14 0 683 929 ;
+C -1 ; WX 667 ; N Adieresis ; B 14 0 654 901 ;
+C -1 ; WX 556 ; N egrave ; B 84 -15 578 734 ;
+C -1 ; WX 500 ; N zacute ; B 31 0 571 734 ;
+C -1 ; WX 222 ; N iogonek ; B -61 -225 308 718 ;
+C -1 ; WX 778 ; N Oacute ; B 105 -19 826 929 ;
+C -1 ; WX 556 ; N oacute ; B 83 -14 587 734 ;
+C -1 ; WX 556 ; N amacron ; B 61 -15 580 684 ;
+C -1 ; WX 500 ; N sacute ; B 63 -15 559 734 ;
+C -1 ; WX 278 ; N idieresis ; B 95 0 416 706 ;
+C -1 ; WX 778 ; N Ocircumflex ; B 105 -19 826 929 ;
+C -1 ; WX 722 ; N Ugrave ; B 123 -19 797 929 ;
+C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ;
+C -1 ; WX 556 ; N thorn ; B 14 -207 584 718 ;
+C -1 ; WX 333 ; N twosuperior ; B 64 281 449 703 ;
+C -1 ; WX 778 ; N Odieresis ; B 105 -19 826 901 ;
+C -1 ; WX 556 ; N mu ; B 24 -207 600 523 ;
+C -1 ; WX 278 ; N igrave ; B 95 0 310 734 ;
+C -1 ; WX 556 ; N ohungarumlaut ; B 83 -14 677 734 ;
+C -1 ; WX 667 ; N Eogonek ; B 86 -220 762 718 ;
+C -1 ; WX 556 ; N dcroat ; B 84 -15 689 718 ;
+C -1 ; WX 834 ; N threequarters ; B 130 -19 861 703 ;
+C -1 ; WX 667 ; N Scedilla ; B 90 -225 713 737 ;
+C -1 ; WX 299 ; N lcaron ; B 67 0 464 718 ;
+C -1 ; WX 667 ; N Kcommaaccent ; B 76 -225 808 718 ;
+C -1 ; WX 556 ; N Lacute ; B 76 0 555 929 ;
+C -1 ; WX 1000 ; N trademark ; B 186 306 1056 718 ;
+C -1 ; WX 556 ; N edotaccent ; B 84 -15 578 706 ;
+C -1 ; WX 278 ; N Igrave ; B 91 0 351 929 ;
+C -1 ; WX 278 ; N Imacron ; B 91 0 483 879 ;
+C -1 ; WX 556 ; N Lcaron ; B 76 0 570 718 ;
+C -1 ; WX 834 ; N onehalf ; B 114 -19 839 703 ;
+C -1 ; WX 549 ; N lessequal ; B 26 0 666 674 ;
+C -1 ; WX 556 ; N ocircumflex ; B 83 -14 585 734 ;
+C -1 ; WX 556 ; N ntilde ; B 65 0 592 722 ;
+C -1 ; WX 722 ; N Uhungarumlaut ; B 123 -19 801 929 ;
+C -1 ; WX 667 ; N Eacute ; B 86 0 762 929 ;
+C -1 ; WX 556 ; N emacron ; B 84 -15 580 684 ;
+C -1 ; WX 556 ; N gbreve ; B 42 -220 610 731 ;
+C -1 ; WX 834 ; N onequarter ; B 150 -19 802 703 ;
+C -1 ; WX 667 ; N Scaron ; B 90 -19 713 929 ;
+C -1 ; WX 667 ; N Scommaaccent ; B 90 -225 713 737 ;
+C -1 ; WX 778 ; N Ohungarumlaut ; B 105 -19 829 929 ;
+C -1 ; WX 400 ; N degree ; B 169 411 468 703 ;
+C -1 ; WX 556 ; N ograve ; B 83 -14 585 734 ;
+C -1 ; WX 722 ; N Ccaron ; B 108 -19 782 929 ;
+C -1 ; WX 556 ; N ugrave ; B 94 -15 600 734 ;
+C -1 ; WX 453 ; N radical ; B 79 -80 617 762 ;
+C -1 ; WX 722 ; N Dcaron ; B 81 0 764 929 ;
+C -1 ; WX 333 ; N rcommaaccent ; B 30 -225 446 538 ;
+C -1 ; WX 722 ; N Ntilde ; B 76 0 799 917 ;
+C -1 ; WX 556 ; N otilde ; B 83 -14 602 722 ;
+C -1 ; WX 722 ; N Rcommaaccent ; B 88 -225 773 718 ;
+C -1 ; WX 556 ; N Lcommaaccent ; B 76 -225 555 718 ;
+C -1 ; WX 667 ; N Atilde ; B 14 0 699 917 ;
+C -1 ; WX 667 ; N Aogonek ; B 14 -225 654 718 ;
+C -1 ; WX 667 ; N Aring ; B 14 0 654 931 ;
+C -1 ; WX 778 ; N Otilde ; B 105 -19 826 917 ;
+C -1 ; WX 500 ; N zdotaccent ; B 31 0 571 706 ;
+C -1 ; WX 667 ; N Ecaron ; B 86 0 762 929 ;
+C -1 ; WX 278 ; N Iogonek ; B -33 -225 341 718 ;
+C -1 ; WX 500 ; N kcommaaccent ; B 67 -225 600 718 ;
+C -1 ; WX 584 ; N minus ; B 85 216 606 289 ;
+C -1 ; WX 278 ; N Icircumflex ; B 91 0 452 929 ;
+C -1 ; WX 556 ; N ncaron ; B 65 0 580 734 ;
+C -1 ; WX 278 ; N tcommaaccent ; B 63 -225 368 669 ;
+C -1 ; WX 584 ; N logicalnot ; B 106 108 628 390 ;
+C -1 ; WX 556 ; N odieresis ; B 83 -14 585 706 ;
+C -1 ; WX 556 ; N udieresis ; B 94 -15 600 706 ;
+C -1 ; WX 549 ; N notequal ; B 34 -35 623 551 ;
+C -1 ; WX 556 ; N gcommaaccent ; B 42 -220 610 822 ;
+C -1 ; WX 556 ; N eth ; B 81 -15 617 737 ;
+C -1 ; WX 500 ; N zcaron ; B 31 0 571 734 ;
+C -1 ; WX 556 ; N ncommaaccent ; B 65 -225 573 538 ;
+C -1 ; WX 333 ; N onesuperior ; B 166 281 371 703 ;
+C -1 ; WX 278 ; N imacron ; B 95 0 417 684 ;
+EndCharMetrics
+StartKernData
+StartKernPairs 2705
+KPX A C -30
+KPX A Cacute -30
+KPX A Ccaron -30
+KPX A Ccedilla -30
+KPX A G -30
+KPX A Gbreve -30
+KPX A Gcommaaccent -30
+KPX A O -30
+KPX A Oacute -30
+KPX A Ocircumflex -30
+KPX A Odieresis -30
+KPX A Ograve -30
+KPX A Ohungarumlaut -30
+KPX A Omacron -30
+KPX A Oslash -30
+KPX A Otilde -30
+KPX A Q -30
+KPX A T -120
+KPX A Tcaron -120
+KPX A Tcommaaccent -120
+KPX A U -50
+KPX A Uacute -50
+KPX A Ucircumflex -50
+KPX A Udieresis -50
+KPX A Ugrave -50
+KPX A Uhungarumlaut -50
+KPX A Umacron -50
+KPX A Uogonek -50
+KPX A Uring -50
+KPX A V -70
+KPX A W -50
+KPX A Y -100
+KPX A Yacute -100
+KPX A Ydieresis -100
+KPX A u -30
+KPX A uacute -30
+KPX A ucircumflex -30
+KPX A udieresis -30
+KPX A ugrave -30
+KPX A uhungarumlaut -30
+KPX A umacron -30
+KPX A uogonek -30
+KPX A uring -30
+KPX A v -40
+KPX A w -40
+KPX A y -40
+KPX A yacute -40
+KPX A ydieresis -40
+KPX Aacute C -30
+KPX Aacute Cacute -30
+KPX Aacute Ccaron -30
+KPX Aacute Ccedilla -30
+KPX Aacute G -30
+KPX Aacute Gbreve -30
+KPX Aacute Gcommaaccent -30
+KPX Aacute O -30
+KPX Aacute Oacute -30
+KPX Aacute Ocircumflex -30
+KPX Aacute Odieresis -30
+KPX Aacute Ograve -30
+KPX Aacute Ohungarumlaut -30
+KPX Aacute Omacron -30
+KPX Aacute Oslash -30
+KPX Aacute Otilde -30
+KPX Aacute Q -30
+KPX Aacute T -120
+KPX Aacute Tcaron -120
+KPX Aacute Tcommaaccent -120
+KPX Aacute U -50
+KPX Aacute Uacute -50
+KPX Aacute Ucircumflex -50
+KPX Aacute Udieresis -50
+KPX Aacute Ugrave -50
+KPX Aacute Uhungarumlaut -50
+KPX Aacute Umacron -50
+KPX Aacute Uogonek -50
+KPX Aacute Uring -50
+KPX Aacute V -70
+KPX Aacute W -50
+KPX Aacute Y -100
+KPX Aacute Yacute -100
+KPX Aacute Ydieresis -100
+KPX Aacute u -30
+KPX Aacute uacute -30
+KPX Aacute ucircumflex -30
+KPX Aacute udieresis -30
+KPX Aacute ugrave -30
+KPX Aacute uhungarumlaut -30
+KPX Aacute umacron -30
+KPX Aacute uogonek -30
+KPX Aacute uring -30
+KPX Aacute v -40
+KPX Aacute w -40
+KPX Aacute y -40
+KPX Aacute yacute -40
+KPX Aacute ydieresis -40
+KPX Abreve C -30
+KPX Abreve Cacute -30
+KPX Abreve Ccaron -30
+KPX Abreve Ccedilla -30
+KPX Abreve G -30
+KPX Abreve Gbreve -30
+KPX Abreve Gcommaaccent -30
+KPX Abreve O -30
+KPX Abreve Oacute -30
+KPX Abreve Ocircumflex -30
+KPX Abreve Odieresis -30
+KPX Abreve Ograve -30
+KPX Abreve Ohungarumlaut -30
+KPX Abreve Omacron -30
+KPX Abreve Oslash -30
+KPX Abreve Otilde -30
+KPX Abreve Q -30
+KPX Abreve T -120
+KPX Abreve Tcaron -120
+KPX Abreve Tcommaaccent -120
+KPX Abreve U -50
+KPX Abreve Uacute -50
+KPX Abreve Ucircumflex -50
+KPX Abreve Udieresis -50
+KPX Abreve Ugrave -50
+KPX Abreve Uhungarumlaut -50
+KPX Abreve Umacron -50
+KPX Abreve Uogonek -50
+KPX Abreve Uring -50
+KPX Abreve V -70
+KPX Abreve W -50
+KPX Abreve Y -100
+KPX Abreve Yacute -100
+KPX Abreve Ydieresis -100
+KPX Abreve u -30
+KPX Abreve uacute -30
+KPX Abreve ucircumflex -30
+KPX Abreve udieresis -30
+KPX Abreve ugrave -30
+KPX Abreve uhungarumlaut -30
+KPX Abreve umacron -30
+KPX Abreve uogonek -30
+KPX Abreve uring -30
+KPX Abreve v -40
+KPX Abreve w -40
+KPX Abreve y -40
+KPX Abreve yacute -40
+KPX Abreve ydieresis -40
+KPX Acircumflex C -30
+KPX Acircumflex Cacute -30
+KPX Acircumflex Ccaron -30
+KPX Acircumflex Ccedilla -30
+KPX Acircumflex G -30
+KPX Acircumflex Gbreve -30
+KPX Acircumflex Gcommaaccent -30
+KPX Acircumflex O -30
+KPX Acircumflex Oacute -30
+KPX Acircumflex Ocircumflex -30
+KPX Acircumflex Odieresis -30
+KPX Acircumflex Ograve -30
+KPX Acircumflex Ohungarumlaut -30
+KPX Acircumflex Omacron -30
+KPX Acircumflex Oslash -30
+KPX Acircumflex Otilde -30
+KPX Acircumflex Q -30
+KPX Acircumflex T -120
+KPX Acircumflex Tcaron -120
+KPX Acircumflex Tcommaaccent -120
+KPX Acircumflex U -50
+KPX Acircumflex Uacute -50
+KPX Acircumflex Ucircumflex -50
+KPX Acircumflex Udieresis -50
+KPX Acircumflex Ugrave -50
+KPX Acircumflex Uhungarumlaut -50
+KPX Acircumflex Umacron -50
+KPX Acircumflex Uogonek -50
+KPX Acircumflex Uring -50
+KPX Acircumflex V -70
+KPX Acircumflex W -50
+KPX Acircumflex Y -100
+KPX Acircumflex Yacute -100
+KPX Acircumflex Ydieresis -100
+KPX Acircumflex u -30
+KPX Acircumflex uacute -30
+KPX Acircumflex ucircumflex -30
+KPX Acircumflex udieresis -30
+KPX Acircumflex ugrave -30
+KPX Acircumflex uhungarumlaut -30
+KPX Acircumflex umacron -30
+KPX Acircumflex uogonek -30
+KPX Acircumflex uring -30
+KPX Acircumflex v -40
+KPX Acircumflex w -40
+KPX Acircumflex y -40
+KPX Acircumflex yacute -40
+KPX Acircumflex ydieresis -40
+KPX Adieresis C -30
+KPX Adieresis Cacute -30
+KPX Adieresis Ccaron -30
+KPX Adieresis Ccedilla -30
+KPX Adieresis G -30
+KPX Adieresis Gbreve -30
+KPX Adieresis Gcommaaccent -30
+KPX Adieresis O -30
+KPX Adieresis Oacute -30
+KPX Adieresis Ocircumflex -30
+KPX Adieresis Odieresis -30
+KPX Adieresis Ograve -30
+KPX Adieresis Ohungarumlaut -30
+KPX Adieresis Omacron -30
+KPX Adieresis Oslash -30
+KPX Adieresis Otilde -30
+KPX Adieresis Q -30
+KPX Adieresis T -120
+KPX Adieresis Tcaron -120
+KPX Adieresis Tcommaaccent -120
+KPX Adieresis U -50
+KPX Adieresis Uacute -50
+KPX Adieresis Ucircumflex -50
+KPX Adieresis Udieresis -50
+KPX Adieresis Ugrave -50
+KPX Adieresis Uhungarumlaut -50
+KPX Adieresis Umacron -50
+KPX Adieresis Uogonek -50
+KPX Adieresis Uring -50
+KPX Adieresis V -70
+KPX Adieresis W -50
+KPX Adieresis Y -100
+KPX Adieresis Yacute -100
+KPX Adieresis Ydieresis -100
+KPX Adieresis u -30
+KPX Adieresis uacute -30
+KPX Adieresis ucircumflex -30
+KPX Adieresis udieresis -30
+KPX Adieresis ugrave -30
+KPX Adieresis uhungarumlaut -30
+KPX Adieresis umacron -30
+KPX Adieresis uogonek -30
+KPX Adieresis uring -30
+KPX Adieresis v -40
+KPX Adieresis w -40
+KPX Adieresis y -40
+KPX Adieresis yacute -40
+KPX Adieresis ydieresis -40
+KPX Agrave C -30
+KPX Agrave Cacute -30
+KPX Agrave Ccaron -30
+KPX Agrave Ccedilla -30
+KPX Agrave G -30
+KPX Agrave Gbreve -30
+KPX Agrave Gcommaaccent -30
+KPX Agrave O -30
+KPX Agrave Oacute -30
+KPX Agrave Ocircumflex -30
+KPX Agrave Odieresis -30
+KPX Agrave Ograve -30
+KPX Agrave Ohungarumlaut -30
+KPX Agrave Omacron -30
+KPX Agrave Oslash -30
+KPX Agrave Otilde -30
+KPX Agrave Q -30
+KPX Agrave T -120
+KPX Agrave Tcaron -120
+KPX Agrave Tcommaaccent -120
+KPX Agrave U -50
+KPX Agrave Uacute -50
+KPX Agrave Ucircumflex -50
+KPX Agrave Udieresis -50
+KPX Agrave Ugrave -50
+KPX Agrave Uhungarumlaut -50
+KPX Agrave Umacron -50
+KPX Agrave Uogonek -50
+KPX Agrave Uring -50
+KPX Agrave V -70
+KPX Agrave W -50
+KPX Agrave Y -100
+KPX Agrave Yacute -100
+KPX Agrave Ydieresis -100
+KPX Agrave u -30
+KPX Agrave uacute -30
+KPX Agrave ucircumflex -30
+KPX Agrave udieresis -30
+KPX Agrave ugrave -30
+KPX Agrave uhungarumlaut -30
+KPX Agrave umacron -30
+KPX Agrave uogonek -30
+KPX Agrave uring -30
+KPX Agrave v -40
+KPX Agrave w -40
+KPX Agrave y -40
+KPX Agrave yacute -40
+KPX Agrave ydieresis -40
+KPX Amacron C -30
+KPX Amacron Cacute -30
+KPX Amacron Ccaron -30
+KPX Amacron Ccedilla -30
+KPX Amacron G -30
+KPX Amacron Gbreve -30
+KPX Amacron Gcommaaccent -30
+KPX Amacron O -30
+KPX Amacron Oacute -30
+KPX Amacron Ocircumflex -30
+KPX Amacron Odieresis -30
+KPX Amacron Ograve -30
+KPX Amacron Ohungarumlaut -30
+KPX Amacron Omacron -30
+KPX Amacron Oslash -30
+KPX Amacron Otilde -30
+KPX Amacron Q -30
+KPX Amacron T -120
+KPX Amacron Tcaron -120
+KPX Amacron Tcommaaccent -120
+KPX Amacron U -50
+KPX Amacron Uacute -50
+KPX Amacron Ucircumflex -50
+KPX Amacron Udieresis -50
+KPX Amacron Ugrave -50
+KPX Amacron Uhungarumlaut -50
+KPX Amacron Umacron -50
+KPX Amacron Uogonek -50
+KPX Amacron Uring -50
+KPX Amacron V -70
+KPX Amacron W -50
+KPX Amacron Y -100
+KPX Amacron Yacute -100
+KPX Amacron Ydieresis -100
+KPX Amacron u -30
+KPX Amacron uacute -30
+KPX Amacron ucircumflex -30
+KPX Amacron udieresis -30
+KPX Amacron ugrave -30
+KPX Amacron uhungarumlaut -30
+KPX Amacron umacron -30
+KPX Amacron uogonek -30
+KPX Amacron uring -30
+KPX Amacron v -40
+KPX Amacron w -40
+KPX Amacron y -40
+KPX Amacron yacute -40
+KPX Amacron ydieresis -40
+KPX Aogonek C -30
+KPX Aogonek Cacute -30
+KPX Aogonek Ccaron -30
+KPX Aogonek Ccedilla -30
+KPX Aogonek G -30
+KPX Aogonek Gbreve -30
+KPX Aogonek Gcommaaccent -30
+KPX Aogonek O -30
+KPX Aogonek Oacute -30
+KPX Aogonek Ocircumflex -30
+KPX Aogonek Odieresis -30
+KPX Aogonek Ograve -30
+KPX Aogonek Ohungarumlaut -30
+KPX Aogonek Omacron -30
+KPX Aogonek Oslash -30
+KPX Aogonek Otilde -30
+KPX Aogonek Q -30
+KPX Aogonek T -120
+KPX Aogonek Tcaron -120
+KPX Aogonek Tcommaaccent -120
+KPX Aogonek U -50
+KPX Aogonek Uacute -50
+KPX Aogonek Ucircumflex -50
+KPX Aogonek Udieresis -50
+KPX Aogonek Ugrave -50
+KPX Aogonek Uhungarumlaut -50
+KPX Aogonek Umacron -50
+KPX Aogonek Uogonek -50
+KPX Aogonek Uring -50
+KPX Aogonek V -70
+KPX Aogonek W -50
+KPX Aogonek Y -100
+KPX Aogonek Yacute -100
+KPX Aogonek Ydieresis -100
+KPX Aogonek u -30
+KPX Aogonek uacute -30
+KPX Aogonek ucircumflex -30
+KPX Aogonek udieresis -30
+KPX Aogonek ugrave -30
+KPX Aogonek uhungarumlaut -30
+KPX Aogonek umacron -30
+KPX Aogonek uogonek -30
+KPX Aogonek uring -30
+KPX Aogonek v -40
+KPX Aogonek w -40
+KPX Aogonek y -40
+KPX Aogonek yacute -40
+KPX Aogonek ydieresis -40
+KPX Aring C -30
+KPX Aring Cacute -30
+KPX Aring Ccaron -30
+KPX Aring Ccedilla -30
+KPX Aring G -30
+KPX Aring Gbreve -30
+KPX Aring Gcommaaccent -30
+KPX Aring O -30
+KPX Aring Oacute -30
+KPX Aring Ocircumflex -30
+KPX Aring Odieresis -30
+KPX Aring Ograve -30
+KPX Aring Ohungarumlaut -30
+KPX Aring Omacron -30
+KPX Aring Oslash -30
+KPX Aring Otilde -30
+KPX Aring Q -30
+KPX Aring T -120
+KPX Aring Tcaron -120
+KPX Aring Tcommaaccent -120
+KPX Aring U -50
+KPX Aring Uacute -50
+KPX Aring Ucircumflex -50
+KPX Aring Udieresis -50
+KPX Aring Ugrave -50
+KPX Aring Uhungarumlaut -50
+KPX Aring Umacron -50
+KPX Aring Uogonek -50
+KPX Aring Uring -50
+KPX Aring V -70
+KPX Aring W -50
+KPX Aring Y -100
+KPX Aring Yacute -100
+KPX Aring Ydieresis -100
+KPX Aring u -30
+KPX Aring uacute -30
+KPX Aring ucircumflex -30
+KPX Aring udieresis -30
+KPX Aring ugrave -30
+KPX Aring uhungarumlaut -30
+KPX Aring umacron -30
+KPX Aring uogonek -30
+KPX Aring uring -30
+KPX Aring v -40
+KPX Aring w -40
+KPX Aring y -40
+KPX Aring yacute -40
+KPX Aring ydieresis -40
+KPX Atilde C -30
+KPX Atilde Cacute -30
+KPX Atilde Ccaron -30
+KPX Atilde Ccedilla -30
+KPX Atilde G -30
+KPX Atilde Gbreve -30
+KPX Atilde Gcommaaccent -30
+KPX Atilde O -30
+KPX Atilde Oacute -30
+KPX Atilde Ocircumflex -30
+KPX Atilde Odieresis -30
+KPX Atilde Ograve -30
+KPX Atilde Ohungarumlaut -30
+KPX Atilde Omacron -30
+KPX Atilde Oslash -30
+KPX Atilde Otilde -30
+KPX Atilde Q -30
+KPX Atilde T -120
+KPX Atilde Tcaron -120
+KPX Atilde Tcommaaccent -120
+KPX Atilde U -50
+KPX Atilde Uacute -50
+KPX Atilde Ucircumflex -50
+KPX Atilde Udieresis -50
+KPX Atilde Ugrave -50
+KPX Atilde Uhungarumlaut -50
+KPX Atilde Umacron -50
+KPX Atilde Uogonek -50
+KPX Atilde Uring -50
+KPX Atilde V -70
+KPX Atilde W -50
+KPX Atilde Y -100
+KPX Atilde Yacute -100
+KPX Atilde Ydieresis -100
+KPX Atilde u -30
+KPX Atilde uacute -30
+KPX Atilde ucircumflex -30
+KPX Atilde udieresis -30
+KPX Atilde ugrave -30
+KPX Atilde uhungarumlaut -30
+KPX Atilde umacron -30
+KPX Atilde uogonek -30
+KPX Atilde uring -30
+KPX Atilde v -40
+KPX Atilde w -40
+KPX Atilde y -40
+KPX Atilde yacute -40
+KPX Atilde ydieresis -40
+KPX B U -10
+KPX B Uacute -10
+KPX B Ucircumflex -10
+KPX B Udieresis -10
+KPX B Ugrave -10
+KPX B Uhungarumlaut -10
+KPX B Umacron -10
+KPX B Uogonek -10
+KPX B Uring -10
+KPX B comma -20
+KPX B period -20
+KPX C comma -30
+KPX C period -30
+KPX Cacute comma -30
+KPX Cacute period -30
+KPX Ccaron comma -30
+KPX Ccaron period -30
+KPX Ccedilla comma -30
+KPX Ccedilla period -30
+KPX D A -40
+KPX D Aacute -40
+KPX D Abreve -40
+KPX D Acircumflex -40
+KPX D Adieresis -40
+KPX D Agrave -40
+KPX D Amacron -40
+KPX D Aogonek -40
+KPX D Aring -40
+KPX D Atilde -40
+KPX D V -70
+KPX D W -40
+KPX D Y -90
+KPX D Yacute -90
+KPX D Ydieresis -90
+KPX D comma -70
+KPX D period -70
+KPX Dcaron A -40
+KPX Dcaron Aacute -40
+KPX Dcaron Abreve -40
+KPX Dcaron Acircumflex -40
+KPX Dcaron Adieresis -40
+KPX Dcaron Agrave -40
+KPX Dcaron Amacron -40
+KPX Dcaron Aogonek -40
+KPX Dcaron Aring -40
+KPX Dcaron Atilde -40
+KPX Dcaron V -70
+KPX Dcaron W -40
+KPX Dcaron Y -90
+KPX Dcaron Yacute -90
+KPX Dcaron Ydieresis -90
+KPX Dcaron comma -70
+KPX Dcaron period -70
+KPX Dcroat A -40
+KPX Dcroat Aacute -40
+KPX Dcroat Abreve -40
+KPX Dcroat Acircumflex -40
+KPX Dcroat Adieresis -40
+KPX Dcroat Agrave -40
+KPX Dcroat Amacron -40
+KPX Dcroat Aogonek -40
+KPX Dcroat Aring -40
+KPX Dcroat Atilde -40
+KPX Dcroat V -70
+KPX Dcroat W -40
+KPX Dcroat Y -90
+KPX Dcroat Yacute -90
+KPX Dcroat Ydieresis -90
+KPX Dcroat comma -70
+KPX Dcroat period -70
+KPX F A -80
+KPX F Aacute -80
+KPX F Abreve -80
+KPX F Acircumflex -80
+KPX F Adieresis -80
+KPX F Agrave -80
+KPX F Amacron -80
+KPX F Aogonek -80
+KPX F Aring -80
+KPX F Atilde -80
+KPX F a -50
+KPX F aacute -50
+KPX F abreve -50
+KPX F acircumflex -50
+KPX F adieresis -50
+KPX F agrave -50
+KPX F amacron -50
+KPX F aogonek -50
+KPX F aring -50
+KPX F atilde -50
+KPX F comma -150
+KPX F e -30
+KPX F eacute -30
+KPX F ecaron -30
+KPX F ecircumflex -30
+KPX F edieresis -30
+KPX F edotaccent -30
+KPX F egrave -30
+KPX F emacron -30
+KPX F eogonek -30
+KPX F o -30
+KPX F oacute -30
+KPX F ocircumflex -30
+KPX F odieresis -30
+KPX F ograve -30
+KPX F ohungarumlaut -30
+KPX F omacron -30
+KPX F oslash -30
+KPX F otilde -30
+KPX F period -150
+KPX F r -45
+KPX F racute -45
+KPX F rcaron -45
+KPX F rcommaaccent -45
+KPX J A -20
+KPX J Aacute -20
+KPX J Abreve -20
+KPX J Acircumflex -20
+KPX J Adieresis -20
+KPX J Agrave -20
+KPX J Amacron -20
+KPX J Aogonek -20
+KPX J Aring -20
+KPX J Atilde -20
+KPX J a -20
+KPX J aacute -20
+KPX J abreve -20
+KPX J acircumflex -20
+KPX J adieresis -20
+KPX J agrave -20
+KPX J amacron -20
+KPX J aogonek -20
+KPX J aring -20
+KPX J atilde -20
+KPX J comma -30
+KPX J period -30
+KPX J u -20
+KPX J uacute -20
+KPX J ucircumflex -20
+KPX J udieresis -20
+KPX J ugrave -20
+KPX J uhungarumlaut -20
+KPX J umacron -20
+KPX J uogonek -20
+KPX J uring -20
+KPX K O -50
+KPX K Oacute -50
+KPX K Ocircumflex -50
+KPX K Odieresis -50
+KPX K Ograve -50
+KPX K Ohungarumlaut -50
+KPX K Omacron -50
+KPX K Oslash -50
+KPX K Otilde -50
+KPX K e -40
+KPX K eacute -40
+KPX K ecaron -40
+KPX K ecircumflex -40
+KPX K edieresis -40
+KPX K edotaccent -40
+KPX K egrave -40
+KPX K emacron -40
+KPX K eogonek -40
+KPX K o -40
+KPX K oacute -40
+KPX K ocircumflex -40
+KPX K odieresis -40
+KPX K ograve -40
+KPX K ohungarumlaut -40
+KPX K omacron -40
+KPX K oslash -40
+KPX K otilde -40
+KPX K u -30
+KPX K uacute -30
+KPX K ucircumflex -30
+KPX K udieresis -30
+KPX K ugrave -30
+KPX K uhungarumlaut -30
+KPX K umacron -30
+KPX K uogonek -30
+KPX K uring -30
+KPX K y -50
+KPX K yacute -50
+KPX K ydieresis -50
+KPX Kcommaaccent O -50
+KPX Kcommaaccent Oacute -50
+KPX Kcommaaccent Ocircumflex -50
+KPX Kcommaaccent Odieresis -50
+KPX Kcommaaccent Ograve -50
+KPX Kcommaaccent Ohungarumlaut -50
+KPX Kcommaaccent Omacron -50
+KPX Kcommaaccent Oslash -50
+KPX Kcommaaccent Otilde -50
+KPX Kcommaaccent e -40
+KPX Kcommaaccent eacute -40
+KPX Kcommaaccent ecaron -40
+KPX Kcommaaccent ecircumflex -40
+KPX Kcommaaccent edieresis -40
+KPX Kcommaaccent edotaccent -40
+KPX Kcommaaccent egrave -40
+KPX Kcommaaccent emacron -40
+KPX Kcommaaccent eogonek -40
+KPX Kcommaaccent o -40
+KPX Kcommaaccent oacute -40
+KPX Kcommaaccent ocircumflex -40
+KPX Kcommaaccent odieresis -40
+KPX Kcommaaccent ograve -40
+KPX Kcommaaccent ohungarumlaut -40
+KPX Kcommaaccent omacron -40
+KPX Kcommaaccent oslash -40
+KPX Kcommaaccent otilde -40
+KPX Kcommaaccent u -30
+KPX Kcommaaccent uacute -30
+KPX Kcommaaccent ucircumflex -30
+KPX Kcommaaccent udieresis -30
+KPX Kcommaaccent ugrave -30
+KPX Kcommaaccent uhungarumlaut -30
+KPX Kcommaaccent umacron -30
+KPX Kcommaaccent uogonek -30
+KPX Kcommaaccent uring -30
+KPX Kcommaaccent y -50
+KPX Kcommaaccent yacute -50
+KPX Kcommaaccent ydieresis -50
+KPX L T -110
+KPX L Tcaron -110
+KPX L Tcommaaccent -110
+KPX L V -110
+KPX L W -70
+KPX L Y -140
+KPX L Yacute -140
+KPX L Ydieresis -140
+KPX L quotedblright -140
+KPX L quoteright -160
+KPX L y -30
+KPX L yacute -30
+KPX L ydieresis -30
+KPX Lacute T -110
+KPX Lacute Tcaron -110
+KPX Lacute Tcommaaccent -110
+KPX Lacute V -110
+KPX Lacute W -70
+KPX Lacute Y -140
+KPX Lacute Yacute -140
+KPX Lacute Ydieresis -140
+KPX Lacute quotedblright -140
+KPX Lacute quoteright -160
+KPX Lacute y -30
+KPX Lacute yacute -30
+KPX Lacute ydieresis -30
+KPX Lcaron T -110
+KPX Lcaron Tcaron -110
+KPX Lcaron Tcommaaccent -110
+KPX Lcaron V -110
+KPX Lcaron W -70
+KPX Lcaron Y -140
+KPX Lcaron Yacute -140
+KPX Lcaron Ydieresis -140
+KPX Lcaron quotedblright -140
+KPX Lcaron quoteright -160
+KPX Lcaron y -30
+KPX Lcaron yacute -30
+KPX Lcaron ydieresis -30
+KPX Lcommaaccent T -110
+KPX Lcommaaccent Tcaron -110
+KPX Lcommaaccent Tcommaaccent -110
+KPX Lcommaaccent V -110
+KPX Lcommaaccent W -70
+KPX Lcommaaccent Y -140
+KPX Lcommaaccent Yacute -140
+KPX Lcommaaccent Ydieresis -140
+KPX Lcommaaccent quotedblright -140
+KPX Lcommaaccent quoteright -160
+KPX Lcommaaccent y -30
+KPX Lcommaaccent yacute -30
+KPX Lcommaaccent ydieresis -30
+KPX Lslash T -110
+KPX Lslash Tcaron -110
+KPX Lslash Tcommaaccent -110
+KPX Lslash V -110
+KPX Lslash W -70
+KPX Lslash Y -140
+KPX Lslash Yacute -140
+KPX Lslash Ydieresis -140
+KPX Lslash quotedblright -140
+KPX Lslash quoteright -160
+KPX Lslash y -30
+KPX Lslash yacute -30
+KPX Lslash ydieresis -30
+KPX O A -20
+KPX O Aacute -20
+KPX O Abreve -20
+KPX O Acircumflex -20
+KPX O Adieresis -20
+KPX O Agrave -20
+KPX O Amacron -20
+KPX O Aogonek -20
+KPX O Aring -20
+KPX O Atilde -20
+KPX O T -40
+KPX O Tcaron -40
+KPX O Tcommaaccent -40
+KPX O V -50
+KPX O W -30
+KPX O X -60
+KPX O Y -70
+KPX O Yacute -70
+KPX O Ydieresis -70
+KPX O comma -40
+KPX O period -40
+KPX Oacute A -20
+KPX Oacute Aacute -20
+KPX Oacute Abreve -20
+KPX Oacute Acircumflex -20
+KPX Oacute Adieresis -20
+KPX Oacute Agrave -20
+KPX Oacute Amacron -20
+KPX Oacute Aogonek -20
+KPX Oacute Aring -20
+KPX Oacute Atilde -20
+KPX Oacute T -40
+KPX Oacute Tcaron -40
+KPX Oacute Tcommaaccent -40
+KPX Oacute V -50
+KPX Oacute W -30
+KPX Oacute X -60
+KPX Oacute Y -70
+KPX Oacute Yacute -70
+KPX Oacute Ydieresis -70
+KPX Oacute comma -40
+KPX Oacute period -40
+KPX Ocircumflex A -20
+KPX Ocircumflex Aacute -20
+KPX Ocircumflex Abreve -20
+KPX Ocircumflex Acircumflex -20
+KPX Ocircumflex Adieresis -20
+KPX Ocircumflex Agrave -20
+KPX Ocircumflex Amacron -20
+KPX Ocircumflex Aogonek -20
+KPX Ocircumflex Aring -20
+KPX Ocircumflex Atilde -20
+KPX Ocircumflex T -40
+KPX Ocircumflex Tcaron -40
+KPX Ocircumflex Tcommaaccent -40
+KPX Ocircumflex V -50
+KPX Ocircumflex W -30
+KPX Ocircumflex X -60
+KPX Ocircumflex Y -70
+KPX Ocircumflex Yacute -70
+KPX Ocircumflex Ydieresis -70
+KPX Ocircumflex comma -40
+KPX Ocircumflex period -40
+KPX Odieresis A -20
+KPX Odieresis Aacute -20
+KPX Odieresis Abreve -20
+KPX Odieresis Acircumflex -20
+KPX Odieresis Adieresis -20
+KPX Odieresis Agrave -20
+KPX Odieresis Amacron -20
+KPX Odieresis Aogonek -20
+KPX Odieresis Aring -20
+KPX Odieresis Atilde -20
+KPX Odieresis T -40
+KPX Odieresis Tcaron -40
+KPX Odieresis Tcommaaccent -40
+KPX Odieresis V -50
+KPX Odieresis W -30
+KPX Odieresis X -60
+KPX Odieresis Y -70
+KPX Odieresis Yacute -70
+KPX Odieresis Ydieresis -70
+KPX Odieresis comma -40
+KPX Odieresis period -40
+KPX Ograve A -20
+KPX Ograve Aacute -20
+KPX Ograve Abreve -20
+KPX Ograve Acircumflex -20
+KPX Ograve Adieresis -20
+KPX Ograve Agrave -20
+KPX Ograve Amacron -20
+KPX Ograve Aogonek -20
+KPX Ograve Aring -20
+KPX Ograve Atilde -20
+KPX Ograve T -40
+KPX Ograve Tcaron -40
+KPX Ograve Tcommaaccent -40
+KPX Ograve V -50
+KPX Ograve W -30
+KPX Ograve X -60
+KPX Ograve Y -70
+KPX Ograve Yacute -70
+KPX Ograve Ydieresis -70
+KPX Ograve comma -40
+KPX Ograve period -40
+KPX Ohungarumlaut A -20
+KPX Ohungarumlaut Aacute -20
+KPX Ohungarumlaut Abreve -20
+KPX Ohungarumlaut Acircumflex -20
+KPX Ohungarumlaut Adieresis -20
+KPX Ohungarumlaut Agrave -20
+KPX Ohungarumlaut Amacron -20
+KPX Ohungarumlaut Aogonek -20
+KPX Ohungarumlaut Aring -20
+KPX Ohungarumlaut Atilde -20
+KPX Ohungarumlaut T -40
+KPX Ohungarumlaut Tcaron -40
+KPX Ohungarumlaut Tcommaaccent -40
+KPX Ohungarumlaut V -50
+KPX Ohungarumlaut W -30
+KPX Ohungarumlaut X -60
+KPX Ohungarumlaut Y -70
+KPX Ohungarumlaut Yacute -70
+KPX Ohungarumlaut Ydieresis -70
+KPX Ohungarumlaut comma -40
+KPX Ohungarumlaut period -40
+KPX Omacron A -20
+KPX Omacron Aacute -20
+KPX Omacron Abreve -20
+KPX Omacron Acircumflex -20
+KPX Omacron Adieresis -20
+KPX Omacron Agrave -20
+KPX Omacron Amacron -20
+KPX Omacron Aogonek -20
+KPX Omacron Aring -20
+KPX Omacron Atilde -20
+KPX Omacron T -40
+KPX Omacron Tcaron -40
+KPX Omacron Tcommaaccent -40
+KPX Omacron V -50
+KPX Omacron W -30
+KPX Omacron X -60
+KPX Omacron Y -70
+KPX Omacron Yacute -70
+KPX Omacron Ydieresis -70
+KPX Omacron comma -40
+KPX Omacron period -40
+KPX Oslash A -20
+KPX Oslash Aacute -20
+KPX Oslash Abreve -20
+KPX Oslash Acircumflex -20
+KPX Oslash Adieresis -20
+KPX Oslash Agrave -20
+KPX Oslash Amacron -20
+KPX Oslash Aogonek -20
+KPX Oslash Aring -20
+KPX Oslash Atilde -20
+KPX Oslash T -40
+KPX Oslash Tcaron -40
+KPX Oslash Tcommaaccent -40
+KPX Oslash V -50
+KPX Oslash W -30
+KPX Oslash X -60
+KPX Oslash Y -70
+KPX Oslash Yacute -70
+KPX Oslash Ydieresis -70
+KPX Oslash comma -40
+KPX Oslash period -40
+KPX Otilde A -20
+KPX Otilde Aacute -20
+KPX Otilde Abreve -20
+KPX Otilde Acircumflex -20
+KPX Otilde Adieresis -20
+KPX Otilde Agrave -20
+KPX Otilde Amacron -20
+KPX Otilde Aogonek -20
+KPX Otilde Aring -20
+KPX Otilde Atilde -20
+KPX Otilde T -40
+KPX Otilde Tcaron -40
+KPX Otilde Tcommaaccent -40
+KPX Otilde V -50
+KPX Otilde W -30
+KPX Otilde X -60
+KPX Otilde Y -70
+KPX Otilde Yacute -70
+KPX Otilde Ydieresis -70
+KPX Otilde comma -40
+KPX Otilde period -40
+KPX P A -120
+KPX P Aacute -120
+KPX P Abreve -120
+KPX P Acircumflex -120
+KPX P Adieresis -120
+KPX P Agrave -120
+KPX P Amacron -120
+KPX P Aogonek -120
+KPX P Aring -120
+KPX P Atilde -120
+KPX P a -40
+KPX P aacute -40
+KPX P abreve -40
+KPX P acircumflex -40
+KPX P adieresis -40
+KPX P agrave -40
+KPX P amacron -40
+KPX P aogonek -40
+KPX P aring -40
+KPX P atilde -40
+KPX P comma -180
+KPX P e -50
+KPX P eacute -50
+KPX P ecaron -50
+KPX P ecircumflex -50
+KPX P edieresis -50
+KPX P edotaccent -50
+KPX P egrave -50
+KPX P emacron -50
+KPX P eogonek -50
+KPX P o -50
+KPX P oacute -50
+KPX P ocircumflex -50
+KPX P odieresis -50
+KPX P ograve -50
+KPX P ohungarumlaut -50
+KPX P omacron -50
+KPX P oslash -50
+KPX P otilde -50
+KPX P period -180
+KPX Q U -10
+KPX Q Uacute -10
+KPX Q Ucircumflex -10
+KPX Q Udieresis -10
+KPX Q Ugrave -10
+KPX Q Uhungarumlaut -10
+KPX Q Umacron -10
+KPX Q Uogonek -10
+KPX Q Uring -10
+KPX R O -20
+KPX R Oacute -20
+KPX R Ocircumflex -20
+KPX R Odieresis -20
+KPX R Ograve -20
+KPX R Ohungarumlaut -20
+KPX R Omacron -20
+KPX R Oslash -20
+KPX R Otilde -20
+KPX R T -30
+KPX R Tcaron -30
+KPX R Tcommaaccent -30
+KPX R U -40
+KPX R Uacute -40
+KPX R Ucircumflex -40
+KPX R Udieresis -40
+KPX R Ugrave -40
+KPX R Uhungarumlaut -40
+KPX R Umacron -40
+KPX R Uogonek -40
+KPX R Uring -40
+KPX R V -50
+KPX R W -30
+KPX R Y -50
+KPX R Yacute -50
+KPX R Ydieresis -50
+KPX Racute O -20
+KPX Racute Oacute -20
+KPX Racute Ocircumflex -20
+KPX Racute Odieresis -20
+KPX Racute Ograve -20
+KPX Racute Ohungarumlaut -20
+KPX Racute Omacron -20
+KPX Racute Oslash -20
+KPX Racute Otilde -20
+KPX Racute T -30
+KPX Racute Tcaron -30
+KPX Racute Tcommaaccent -30
+KPX Racute U -40
+KPX Racute Uacute -40
+KPX Racute Ucircumflex -40
+KPX Racute Udieresis -40
+KPX Racute Ugrave -40
+KPX Racute Uhungarumlaut -40
+KPX Racute Umacron -40
+KPX Racute Uogonek -40
+KPX Racute Uring -40
+KPX Racute V -50
+KPX Racute W -30
+KPX Racute Y -50
+KPX Racute Yacute -50
+KPX Racute Ydieresis -50
+KPX Rcaron O -20
+KPX Rcaron Oacute -20
+KPX Rcaron Ocircumflex -20
+KPX Rcaron Odieresis -20
+KPX Rcaron Ograve -20
+KPX Rcaron Ohungarumlaut -20
+KPX Rcaron Omacron -20
+KPX Rcaron Oslash -20
+KPX Rcaron Otilde -20
+KPX Rcaron T -30
+KPX Rcaron Tcaron -30
+KPX Rcaron Tcommaaccent -30
+KPX Rcaron U -40
+KPX Rcaron Uacute -40
+KPX Rcaron Ucircumflex -40
+KPX Rcaron Udieresis -40
+KPX Rcaron Ugrave -40
+KPX Rcaron Uhungarumlaut -40
+KPX Rcaron Umacron -40
+KPX Rcaron Uogonek -40
+KPX Rcaron Uring -40
+KPX Rcaron V -50
+KPX Rcaron W -30
+KPX Rcaron Y -50
+KPX Rcaron Yacute -50
+KPX Rcaron Ydieresis -50
+KPX Rcommaaccent O -20
+KPX Rcommaaccent Oacute -20
+KPX Rcommaaccent Ocircumflex -20
+KPX Rcommaaccent Odieresis -20
+KPX Rcommaaccent Ograve -20
+KPX Rcommaaccent Ohungarumlaut -20
+KPX Rcommaaccent Omacron -20
+KPX Rcommaaccent Oslash -20
+KPX Rcommaaccent Otilde -20
+KPX Rcommaaccent T -30
+KPX Rcommaaccent Tcaron -30
+KPX Rcommaaccent Tcommaaccent -30
+KPX Rcommaaccent U -40
+KPX Rcommaaccent Uacute -40
+KPX Rcommaaccent Ucircumflex -40
+KPX Rcommaaccent Udieresis -40
+KPX Rcommaaccent Ugrave -40
+KPX Rcommaaccent Uhungarumlaut -40
+KPX Rcommaaccent Umacron -40
+KPX Rcommaaccent Uogonek -40
+KPX Rcommaaccent Uring -40
+KPX Rcommaaccent V -50
+KPX Rcommaaccent W -30
+KPX Rcommaaccent Y -50
+KPX Rcommaaccent Yacute -50
+KPX Rcommaaccent Ydieresis -50
+KPX S comma -20
+KPX S period -20
+KPX Sacute comma -20
+KPX Sacute period -20
+KPX Scaron comma -20
+KPX Scaron period -20
+KPX Scedilla comma -20
+KPX Scedilla period -20
+KPX Scommaaccent comma -20
+KPX Scommaaccent period -20
+KPX T A -120
+KPX T Aacute -120
+KPX T Abreve -120
+KPX T Acircumflex -120
+KPX T Adieresis -120
+KPX T Agrave -120
+KPX T Amacron -120
+KPX T Aogonek -120
+KPX T Aring -120
+KPX T Atilde -120
+KPX T O -40
+KPX T Oacute -40
+KPX T Ocircumflex -40
+KPX T Odieresis -40
+KPX T Ograve -40
+KPX T Ohungarumlaut -40
+KPX T Omacron -40
+KPX T Oslash -40
+KPX T Otilde -40
+KPX T a -120
+KPX T aacute -120
+KPX T abreve -60
+KPX T acircumflex -120
+KPX T adieresis -120
+KPX T agrave -120
+KPX T amacron -60
+KPX T aogonek -120
+KPX T aring -120
+KPX T atilde -60
+KPX T colon -20
+KPX T comma -120
+KPX T e -120
+KPX T eacute -120
+KPX T ecaron -120
+KPX T ecircumflex -120
+KPX T edieresis -120
+KPX T edotaccent -120
+KPX T egrave -60
+KPX T emacron -60
+KPX T eogonek -120
+KPX T hyphen -140
+KPX T o -120
+KPX T oacute -120
+KPX T ocircumflex -120
+KPX T odieresis -120
+KPX T ograve -120
+KPX T ohungarumlaut -120
+KPX T omacron -60
+KPX T oslash -120
+KPX T otilde -60
+KPX T period -120
+KPX T r -120
+KPX T racute -120
+KPX T rcaron -120
+KPX T rcommaaccent -120
+KPX T semicolon -20
+KPX T u -120
+KPX T uacute -120
+KPX T ucircumflex -120
+KPX T udieresis -120
+KPX T ugrave -120
+KPX T uhungarumlaut -120
+KPX T umacron -60
+KPX T uogonek -120
+KPX T uring -120
+KPX T w -120
+KPX T y -120
+KPX T yacute -120
+KPX T ydieresis -60
+KPX Tcaron A -120
+KPX Tcaron Aacute -120
+KPX Tcaron Abreve -120
+KPX Tcaron Acircumflex -120
+KPX Tcaron Adieresis -120
+KPX Tcaron Agrave -120
+KPX Tcaron Amacron -120
+KPX Tcaron Aogonek -120
+KPX Tcaron Aring -120
+KPX Tcaron Atilde -120
+KPX Tcaron O -40
+KPX Tcaron Oacute -40
+KPX Tcaron Ocircumflex -40
+KPX Tcaron Odieresis -40
+KPX Tcaron Ograve -40
+KPX Tcaron Ohungarumlaut -40
+KPX Tcaron Omacron -40
+KPX Tcaron Oslash -40
+KPX Tcaron Otilde -40
+KPX Tcaron a -120
+KPX Tcaron aacute -120
+KPX Tcaron abreve -60
+KPX Tcaron acircumflex -120
+KPX Tcaron adieresis -120
+KPX Tcaron agrave -120
+KPX Tcaron amacron -60
+KPX Tcaron aogonek -120
+KPX Tcaron aring -120
+KPX Tcaron atilde -60
+KPX Tcaron colon -20
+KPX Tcaron comma -120
+KPX Tcaron e -120
+KPX Tcaron eacute -120
+KPX Tcaron ecaron -120
+KPX Tcaron ecircumflex -120
+KPX Tcaron edieresis -120
+KPX Tcaron edotaccent -120
+KPX Tcaron egrave -60
+KPX Tcaron emacron -60
+KPX Tcaron eogonek -120
+KPX Tcaron hyphen -140
+KPX Tcaron o -120
+KPX Tcaron oacute -120
+KPX Tcaron ocircumflex -120
+KPX Tcaron odieresis -120
+KPX Tcaron ograve -120
+KPX Tcaron ohungarumlaut -120
+KPX Tcaron omacron -60
+KPX Tcaron oslash -120
+KPX Tcaron otilde -60
+KPX Tcaron period -120
+KPX Tcaron r -120
+KPX Tcaron racute -120
+KPX Tcaron rcaron -120
+KPX Tcaron rcommaaccent -120
+KPX Tcaron semicolon -20
+KPX Tcaron u -120
+KPX Tcaron uacute -120
+KPX Tcaron ucircumflex -120
+KPX Tcaron udieresis -120
+KPX Tcaron ugrave -120
+KPX Tcaron uhungarumlaut -120
+KPX Tcaron umacron -60
+KPX Tcaron uogonek -120
+KPX Tcaron uring -120
+KPX Tcaron w -120
+KPX Tcaron y -120
+KPX Tcaron yacute -120
+KPX Tcaron ydieresis -60
+KPX Tcommaaccent A -120
+KPX Tcommaaccent Aacute -120
+KPX Tcommaaccent Abreve -120
+KPX Tcommaaccent Acircumflex -120
+KPX Tcommaaccent Adieresis -120
+KPX Tcommaaccent Agrave -120
+KPX Tcommaaccent Amacron -120
+KPX Tcommaaccent Aogonek -120
+KPX Tcommaaccent Aring -120
+KPX Tcommaaccent Atilde -120
+KPX Tcommaaccent O -40
+KPX Tcommaaccent Oacute -40
+KPX Tcommaaccent Ocircumflex -40
+KPX Tcommaaccent Odieresis -40
+KPX Tcommaaccent Ograve -40
+KPX Tcommaaccent Ohungarumlaut -40
+KPX Tcommaaccent Omacron -40
+KPX Tcommaaccent Oslash -40
+KPX Tcommaaccent Otilde -40
+KPX Tcommaaccent a -120
+KPX Tcommaaccent aacute -120
+KPX Tcommaaccent abreve -60
+KPX Tcommaaccent acircumflex -120
+KPX Tcommaaccent adieresis -120
+KPX Tcommaaccent agrave -120
+KPX Tcommaaccent amacron -60
+KPX Tcommaaccent aogonek -120
+KPX Tcommaaccent aring -120
+KPX Tcommaaccent atilde -60
+KPX Tcommaaccent colon -20
+KPX Tcommaaccent comma -120
+KPX Tcommaaccent e -120
+KPX Tcommaaccent eacute -120
+KPX Tcommaaccent ecaron -120
+KPX Tcommaaccent ecircumflex -120
+KPX Tcommaaccent edieresis -120
+KPX Tcommaaccent edotaccent -120
+KPX Tcommaaccent egrave -60
+KPX Tcommaaccent emacron -60
+KPX Tcommaaccent eogonek -120
+KPX Tcommaaccent hyphen -140
+KPX Tcommaaccent o -120
+KPX Tcommaaccent oacute -120
+KPX Tcommaaccent ocircumflex -120
+KPX Tcommaaccent odieresis -120
+KPX Tcommaaccent ograve -120
+KPX Tcommaaccent ohungarumlaut -120
+KPX Tcommaaccent omacron -60
+KPX Tcommaaccent oslash -120
+KPX Tcommaaccent otilde -60
+KPX Tcommaaccent period -120
+KPX Tcommaaccent r -120
+KPX Tcommaaccent racute -120
+KPX Tcommaaccent rcaron -120
+KPX Tcommaaccent rcommaaccent -120
+KPX Tcommaaccent semicolon -20
+KPX Tcommaaccent u -120
+KPX Tcommaaccent uacute -120
+KPX Tcommaaccent ucircumflex -120
+KPX Tcommaaccent udieresis -120
+KPX Tcommaaccent ugrave -120
+KPX Tcommaaccent uhungarumlaut -120
+KPX Tcommaaccent umacron -60
+KPX Tcommaaccent uogonek -120
+KPX Tcommaaccent uring -120
+KPX Tcommaaccent w -120
+KPX Tcommaaccent y -120
+KPX Tcommaaccent yacute -120
+KPX Tcommaaccent ydieresis -60
+KPX U A -40
+KPX U Aacute -40
+KPX U Abreve -40
+KPX U Acircumflex -40
+KPX U Adieresis -40
+KPX U Agrave -40
+KPX U Amacron -40
+KPX U Aogonek -40
+KPX U Aring -40
+KPX U Atilde -40
+KPX U comma -40
+KPX U period -40
+KPX Uacute A -40
+KPX Uacute Aacute -40
+KPX Uacute Abreve -40
+KPX Uacute Acircumflex -40
+KPX Uacute Adieresis -40
+KPX Uacute Agrave -40
+KPX Uacute Amacron -40
+KPX Uacute Aogonek -40
+KPX Uacute Aring -40
+KPX Uacute Atilde -40
+KPX Uacute comma -40
+KPX Uacute period -40
+KPX Ucircumflex A -40
+KPX Ucircumflex Aacute -40
+KPX Ucircumflex Abreve -40
+KPX Ucircumflex Acircumflex -40
+KPX Ucircumflex Adieresis -40
+KPX Ucircumflex Agrave -40
+KPX Ucircumflex Amacron -40
+KPX Ucircumflex Aogonek -40
+KPX Ucircumflex Aring -40
+KPX Ucircumflex Atilde -40
+KPX Ucircumflex comma -40
+KPX Ucircumflex period -40
+KPX Udieresis A -40
+KPX Udieresis Aacute -40
+KPX Udieresis Abreve -40
+KPX Udieresis Acircumflex -40
+KPX Udieresis Adieresis -40
+KPX Udieresis Agrave -40
+KPX Udieresis Amacron -40
+KPX Udieresis Aogonek -40
+KPX Udieresis Aring -40
+KPX Udieresis Atilde -40
+KPX Udieresis comma -40
+KPX Udieresis period -40
+KPX Ugrave A -40
+KPX Ugrave Aacute -40
+KPX Ugrave Abreve -40
+KPX Ugrave Acircumflex -40
+KPX Ugrave Adieresis -40
+KPX Ugrave Agrave -40
+KPX Ugrave Amacron -40
+KPX Ugrave Aogonek -40
+KPX Ugrave Aring -40
+KPX Ugrave Atilde -40
+KPX Ugrave comma -40
+KPX Ugrave period -40
+KPX Uhungarumlaut A -40
+KPX Uhungarumlaut Aacute -40
+KPX Uhungarumlaut Abreve -40
+KPX Uhungarumlaut Acircumflex -40
+KPX Uhungarumlaut Adieresis -40
+KPX Uhungarumlaut Agrave -40
+KPX Uhungarumlaut Amacron -40
+KPX Uhungarumlaut Aogonek -40
+KPX Uhungarumlaut Aring -40
+KPX Uhungarumlaut Atilde -40
+KPX Uhungarumlaut comma -40
+KPX Uhungarumlaut period -40
+KPX Umacron A -40
+KPX Umacron Aacute -40
+KPX Umacron Abreve -40
+KPX Umacron Acircumflex -40
+KPX Umacron Adieresis -40
+KPX Umacron Agrave -40
+KPX Umacron Amacron -40
+KPX Umacron Aogonek -40
+KPX Umacron Aring -40
+KPX Umacron Atilde -40
+KPX Umacron comma -40
+KPX Umacron period -40
+KPX Uogonek A -40
+KPX Uogonek Aacute -40
+KPX Uogonek Abreve -40
+KPX Uogonek Acircumflex -40
+KPX Uogonek Adieresis -40
+KPX Uogonek Agrave -40
+KPX Uogonek Amacron -40
+KPX Uogonek Aogonek -40
+KPX Uogonek Aring -40
+KPX Uogonek Atilde -40
+KPX Uogonek comma -40
+KPX Uogonek period -40
+KPX Uring A -40
+KPX Uring Aacute -40
+KPX Uring Abreve -40
+KPX Uring Acircumflex -40
+KPX Uring Adieresis -40
+KPX Uring Agrave -40
+KPX Uring Amacron -40
+KPX Uring Aogonek -40
+KPX Uring Aring -40
+KPX Uring Atilde -40
+KPX Uring comma -40
+KPX Uring period -40
+KPX V A -80
+KPX V Aacute -80
+KPX V Abreve -80
+KPX V Acircumflex -80
+KPX V Adieresis -80
+KPX V Agrave -80
+KPX V Amacron -80
+KPX V Aogonek -80
+KPX V Aring -80
+KPX V Atilde -80
+KPX V G -40
+KPX V Gbreve -40
+KPX V Gcommaaccent -40
+KPX V O -40
+KPX V Oacute -40
+KPX V Ocircumflex -40
+KPX V Odieresis -40
+KPX V Ograve -40
+KPX V Ohungarumlaut -40
+KPX V Omacron -40
+KPX V Oslash -40
+KPX V Otilde -40
+KPX V a -70
+KPX V aacute -70
+KPX V abreve -70
+KPX V acircumflex -70
+KPX V adieresis -70
+KPX V agrave -70
+KPX V amacron -70
+KPX V aogonek -70
+KPX V aring -70
+KPX V atilde -70
+KPX V colon -40
+KPX V comma -125
+KPX V e -80
+KPX V eacute -80
+KPX V ecaron -80
+KPX V ecircumflex -80
+KPX V edieresis -80
+KPX V edotaccent -80
+KPX V egrave -80
+KPX V emacron -80
+KPX V eogonek -80
+KPX V hyphen -80
+KPX V o -80
+KPX V oacute -80
+KPX V ocircumflex -80
+KPX V odieresis -80
+KPX V ograve -80
+KPX V ohungarumlaut -80
+KPX V omacron -80
+KPX V oslash -80
+KPX V otilde -80
+KPX V period -125
+KPX V semicolon -40
+KPX V u -70
+KPX V uacute -70
+KPX V ucircumflex -70
+KPX V udieresis -70
+KPX V ugrave -70
+KPX V uhungarumlaut -70
+KPX V umacron -70
+KPX V uogonek -70
+KPX V uring -70
+KPX W A -50
+KPX W Aacute -50
+KPX W Abreve -50
+KPX W Acircumflex -50
+KPX W Adieresis -50
+KPX W Agrave -50
+KPX W Amacron -50
+KPX W Aogonek -50
+KPX W Aring -50
+KPX W Atilde -50
+KPX W O -20
+KPX W Oacute -20
+KPX W Ocircumflex -20
+KPX W Odieresis -20
+KPX W Ograve -20
+KPX W Ohungarumlaut -20
+KPX W Omacron -20
+KPX W Oslash -20
+KPX W Otilde -20
+KPX W a -40
+KPX W aacute -40
+KPX W abreve -40
+KPX W acircumflex -40
+KPX W adieresis -40
+KPX W agrave -40
+KPX W amacron -40
+KPX W aogonek -40
+KPX W aring -40
+KPX W atilde -40
+KPX W comma -80
+KPX W e -30
+KPX W eacute -30
+KPX W ecaron -30
+KPX W ecircumflex -30
+KPX W edieresis -30
+KPX W edotaccent -30
+KPX W egrave -30
+KPX W emacron -30
+KPX W eogonek -30
+KPX W hyphen -40
+KPX W o -30
+KPX W oacute -30
+KPX W ocircumflex -30
+KPX W odieresis -30
+KPX W ograve -30
+KPX W ohungarumlaut -30
+KPX W omacron -30
+KPX W oslash -30
+KPX W otilde -30
+KPX W period -80
+KPX W u -30
+KPX W uacute -30
+KPX W ucircumflex -30
+KPX W udieresis -30
+KPX W ugrave -30
+KPX W uhungarumlaut -30
+KPX W umacron -30
+KPX W uogonek -30
+KPX W uring -30
+KPX W y -20
+KPX W yacute -20
+KPX W ydieresis -20
+KPX Y A -110
+KPX Y Aacute -110
+KPX Y Abreve -110
+KPX Y Acircumflex -110
+KPX Y Adieresis -110
+KPX Y Agrave -110
+KPX Y Amacron -110
+KPX Y Aogonek -110
+KPX Y Aring -110
+KPX Y Atilde -110
+KPX Y O -85
+KPX Y Oacute -85
+KPX Y Ocircumflex -85
+KPX Y Odieresis -85
+KPX Y Ograve -85
+KPX Y Ohungarumlaut -85
+KPX Y Omacron -85
+KPX Y Oslash -85
+KPX Y Otilde -85
+KPX Y a -140
+KPX Y aacute -140
+KPX Y abreve -70
+KPX Y acircumflex -140
+KPX Y adieresis -140
+KPX Y agrave -140
+KPX Y amacron -70
+KPX Y aogonek -140
+KPX Y aring -140
+KPX Y atilde -140
+KPX Y colon -60
+KPX Y comma -140
+KPX Y e -140
+KPX Y eacute -140
+KPX Y ecaron -140
+KPX Y ecircumflex -140
+KPX Y edieresis -140
+KPX Y edotaccent -140
+KPX Y egrave -140
+KPX Y emacron -70
+KPX Y eogonek -140
+KPX Y hyphen -140
+KPX Y i -20
+KPX Y iacute -20
+KPX Y iogonek -20
+KPX Y o -140
+KPX Y oacute -140
+KPX Y ocircumflex -140
+KPX Y odieresis -140
+KPX Y ograve -140
+KPX Y ohungarumlaut -140
+KPX Y omacron -140
+KPX Y oslash -140
+KPX Y otilde -140
+KPX Y period -140
+KPX Y semicolon -60
+KPX Y u -110
+KPX Y uacute -110
+KPX Y ucircumflex -110
+KPX Y udieresis -110
+KPX Y ugrave -110
+KPX Y uhungarumlaut -110
+KPX Y umacron -110
+KPX Y uogonek -110
+KPX Y uring -110
+KPX Yacute A -110
+KPX Yacute Aacute -110
+KPX Yacute Abreve -110
+KPX Yacute Acircumflex -110
+KPX Yacute Adieresis -110
+KPX Yacute Agrave -110
+KPX Yacute Amacron -110
+KPX Yacute Aogonek -110
+KPX Yacute Aring -110
+KPX Yacute Atilde -110
+KPX Yacute O -85
+KPX Yacute Oacute -85
+KPX Yacute Ocircumflex -85
+KPX Yacute Odieresis -85
+KPX Yacute Ograve -85
+KPX Yacute Ohungarumlaut -85
+KPX Yacute Omacron -85
+KPX Yacute Oslash -85
+KPX Yacute Otilde -85
+KPX Yacute a -140
+KPX Yacute aacute -140
+KPX Yacute abreve -70
+KPX Yacute acircumflex -140
+KPX Yacute adieresis -140
+KPX Yacute agrave -140
+KPX Yacute amacron -70
+KPX Yacute aogonek -140
+KPX Yacute aring -140
+KPX Yacute atilde -70
+KPX Yacute colon -60
+KPX Yacute comma -140
+KPX Yacute e -140
+KPX Yacute eacute -140
+KPX Yacute ecaron -140
+KPX Yacute ecircumflex -140
+KPX Yacute edieresis -140
+KPX Yacute edotaccent -140
+KPX Yacute egrave -140
+KPX Yacute emacron -70
+KPX Yacute eogonek -140
+KPX Yacute hyphen -140
+KPX Yacute i -20
+KPX Yacute iacute -20
+KPX Yacute iogonek -20
+KPX Yacute o -140
+KPX Yacute oacute -140
+KPX Yacute ocircumflex -140
+KPX Yacute odieresis -140
+KPX Yacute ograve -140
+KPX Yacute ohungarumlaut -140
+KPX Yacute omacron -70
+KPX Yacute oslash -140
+KPX Yacute otilde -140
+KPX Yacute period -140
+KPX Yacute semicolon -60
+KPX Yacute u -110
+KPX Yacute uacute -110
+KPX Yacute ucircumflex -110
+KPX Yacute udieresis -110
+KPX Yacute ugrave -110
+KPX Yacute uhungarumlaut -110
+KPX Yacute umacron -110
+KPX Yacute uogonek -110
+KPX Yacute uring -110
+KPX Ydieresis A -110
+KPX Ydieresis Aacute -110
+KPX Ydieresis Abreve -110
+KPX Ydieresis Acircumflex -110
+KPX Ydieresis Adieresis -110
+KPX Ydieresis Agrave -110
+KPX Ydieresis Amacron -110
+KPX Ydieresis Aogonek -110
+KPX Ydieresis Aring -110
+KPX Ydieresis Atilde -110
+KPX Ydieresis O -85
+KPX Ydieresis Oacute -85
+KPX Ydieresis Ocircumflex -85
+KPX Ydieresis Odieresis -85
+KPX Ydieresis Ograve -85
+KPX Ydieresis Ohungarumlaut -85
+KPX Ydieresis Omacron -85
+KPX Ydieresis Oslash -85
+KPX Ydieresis Otilde -85
+KPX Ydieresis a -140
+KPX Ydieresis aacute -140
+KPX Ydieresis abreve -70
+KPX Ydieresis acircumflex -140
+KPX Ydieresis adieresis -140
+KPX Ydieresis agrave -140
+KPX Ydieresis amacron -70
+KPX Ydieresis aogonek -140
+KPX Ydieresis aring -140
+KPX Ydieresis atilde -70
+KPX Ydieresis colon -60
+KPX Ydieresis comma -140
+KPX Ydieresis e -140
+KPX Ydieresis eacute -140
+KPX Ydieresis ecaron -140
+KPX Ydieresis ecircumflex -140
+KPX Ydieresis edieresis -140
+KPX Ydieresis edotaccent -140
+KPX Ydieresis egrave -140
+KPX Ydieresis emacron -70
+KPX Ydieresis eogonek -140
+KPX Ydieresis hyphen -140
+KPX Ydieresis i -20
+KPX Ydieresis iacute -20
+KPX Ydieresis iogonek -20
+KPX Ydieresis o -140
+KPX Ydieresis oacute -140
+KPX Ydieresis ocircumflex -140
+KPX Ydieresis odieresis -140
+KPX Ydieresis ograve -140
+KPX Ydieresis ohungarumlaut -140
+KPX Ydieresis omacron -140
+KPX Ydieresis oslash -140
+KPX Ydieresis otilde -140
+KPX Ydieresis period -140
+KPX Ydieresis semicolon -60
+KPX Ydieresis u -110
+KPX Ydieresis uacute -110
+KPX Ydieresis ucircumflex -110
+KPX Ydieresis udieresis -110
+KPX Ydieresis ugrave -110
+KPX Ydieresis uhungarumlaut -110
+KPX Ydieresis umacron -110
+KPX Ydieresis uogonek -110
+KPX Ydieresis uring -110
+KPX a v -20
+KPX a w -20
+KPX a y -30
+KPX a yacute -30
+KPX a ydieresis -30
+KPX aacute v -20
+KPX aacute w -20
+KPX aacute y -30
+KPX aacute yacute -30
+KPX aacute ydieresis -30
+KPX abreve v -20
+KPX abreve w -20
+KPX abreve y -30
+KPX abreve yacute -30
+KPX abreve ydieresis -30
+KPX acircumflex v -20
+KPX acircumflex w -20
+KPX acircumflex y -30
+KPX acircumflex yacute -30
+KPX acircumflex ydieresis -30
+KPX adieresis v -20
+KPX adieresis w -20
+KPX adieresis y -30
+KPX adieresis yacute -30
+KPX adieresis ydieresis -30
+KPX agrave v -20
+KPX agrave w -20
+KPX agrave y -30
+KPX agrave yacute -30
+KPX agrave ydieresis -30
+KPX amacron v -20
+KPX amacron w -20
+KPX amacron y -30
+KPX amacron yacute -30
+KPX amacron ydieresis -30
+KPX aogonek v -20
+KPX aogonek w -20
+KPX aogonek y -30
+KPX aogonek yacute -30
+KPX aogonek ydieresis -30
+KPX aring v -20
+KPX aring w -20
+KPX aring y -30
+KPX aring yacute -30
+KPX aring ydieresis -30
+KPX atilde v -20
+KPX atilde w -20
+KPX atilde y -30
+KPX atilde yacute -30
+KPX atilde ydieresis -30
+KPX b b -10
+KPX b comma -40
+KPX b l -20
+KPX b lacute -20
+KPX b lcommaaccent -20
+KPX b lslash -20
+KPX b period -40
+KPX b u -20
+KPX b uacute -20
+KPX b ucircumflex -20
+KPX b udieresis -20
+KPX b ugrave -20
+KPX b uhungarumlaut -20
+KPX b umacron -20
+KPX b uogonek -20
+KPX b uring -20
+KPX b v -20
+KPX b y -20
+KPX b yacute -20
+KPX b ydieresis -20
+KPX c comma -15
+KPX c k -20
+KPX c kcommaaccent -20
+KPX cacute comma -15
+KPX cacute k -20
+KPX cacute kcommaaccent -20
+KPX ccaron comma -15
+KPX ccaron k -20
+KPX ccaron kcommaaccent -20
+KPX ccedilla comma -15
+KPX ccedilla k -20
+KPX ccedilla kcommaaccent -20
+KPX colon space -50
+KPX comma quotedblright -100
+KPX comma quoteright -100
+KPX e comma -15
+KPX e period -15
+KPX e v -30
+KPX e w -20
+KPX e x -30
+KPX e y -20
+KPX e yacute -20
+KPX e ydieresis -20
+KPX eacute comma -15
+KPX eacute period -15
+KPX eacute v -30
+KPX eacute w -20
+KPX eacute x -30
+KPX eacute y -20
+KPX eacute yacute -20
+KPX eacute ydieresis -20
+KPX ecaron comma -15
+KPX ecaron period -15
+KPX ecaron v -30
+KPX ecaron w -20
+KPX ecaron x -30
+KPX ecaron y -20
+KPX ecaron yacute -20
+KPX ecaron ydieresis -20
+KPX ecircumflex comma -15
+KPX ecircumflex period -15
+KPX ecircumflex v -30
+KPX ecircumflex w -20
+KPX ecircumflex x -30
+KPX ecircumflex y -20
+KPX ecircumflex yacute -20
+KPX ecircumflex ydieresis -20
+KPX edieresis comma -15
+KPX edieresis period -15
+KPX edieresis v -30
+KPX edieresis w -20
+KPX edieresis x -30
+KPX edieresis y -20
+KPX edieresis yacute -20
+KPX edieresis ydieresis -20
+KPX edotaccent comma -15
+KPX edotaccent period -15
+KPX edotaccent v -30
+KPX edotaccent w -20
+KPX edotaccent x -30
+KPX edotaccent y -20
+KPX edotaccent yacute -20
+KPX edotaccent ydieresis -20
+KPX egrave comma -15
+KPX egrave period -15
+KPX egrave v -30
+KPX egrave w -20
+KPX egrave x -30
+KPX egrave y -20
+KPX egrave yacute -20
+KPX egrave ydieresis -20
+KPX emacron comma -15
+KPX emacron period -15
+KPX emacron v -30
+KPX emacron w -20
+KPX emacron x -30
+KPX emacron y -20
+KPX emacron yacute -20
+KPX emacron ydieresis -20
+KPX eogonek comma -15
+KPX eogonek period -15
+KPX eogonek v -30
+KPX eogonek w -20
+KPX eogonek x -30
+KPX eogonek y -20
+KPX eogonek yacute -20
+KPX eogonek ydieresis -20
+KPX f a -30
+KPX f aacute -30
+KPX f abreve -30
+KPX f acircumflex -30
+KPX f adieresis -30
+KPX f agrave -30
+KPX f amacron -30
+KPX f aogonek -30
+KPX f aring -30
+KPX f atilde -30
+KPX f comma -30
+KPX f dotlessi -28
+KPX f e -30
+KPX f eacute -30
+KPX f ecaron -30
+KPX f ecircumflex -30
+KPX f edieresis -30
+KPX f edotaccent -30
+KPX f egrave -30
+KPX f emacron -30
+KPX f eogonek -30
+KPX f o -30
+KPX f oacute -30
+KPX f ocircumflex -30
+KPX f odieresis -30
+KPX f ograve -30
+KPX f ohungarumlaut -30
+KPX f omacron -30
+KPX f oslash -30
+KPX f otilde -30
+KPX f period -30
+KPX f quotedblright 60
+KPX f quoteright 50
+KPX g r -10
+KPX g racute -10
+KPX g rcaron -10
+KPX g rcommaaccent -10
+KPX gbreve r -10
+KPX gbreve racute -10
+KPX gbreve rcaron -10
+KPX gbreve rcommaaccent -10
+KPX gcommaaccent r -10
+KPX gcommaaccent racute -10
+KPX gcommaaccent rcaron -10
+KPX gcommaaccent rcommaaccent -10
+KPX h y -30
+KPX h yacute -30
+KPX h ydieresis -30
+KPX k e -20
+KPX k eacute -20
+KPX k ecaron -20
+KPX k ecircumflex -20
+KPX k edieresis -20
+KPX k edotaccent -20
+KPX k egrave -20
+KPX k emacron -20
+KPX k eogonek -20
+KPX k o -20
+KPX k oacute -20
+KPX k ocircumflex -20
+KPX k odieresis -20
+KPX k ograve -20
+KPX k ohungarumlaut -20
+KPX k omacron -20
+KPX k oslash -20
+KPX k otilde -20
+KPX kcommaaccent e -20
+KPX kcommaaccent eacute -20
+KPX kcommaaccent ecaron -20
+KPX kcommaaccent ecircumflex -20
+KPX kcommaaccent edieresis -20
+KPX kcommaaccent edotaccent -20
+KPX kcommaaccent egrave -20
+KPX kcommaaccent emacron -20
+KPX kcommaaccent eogonek -20
+KPX kcommaaccent o -20
+KPX kcommaaccent oacute -20
+KPX kcommaaccent ocircumflex -20
+KPX kcommaaccent odieresis -20
+KPX kcommaaccent ograve -20
+KPX kcommaaccent ohungarumlaut -20
+KPX kcommaaccent omacron -20
+KPX kcommaaccent oslash -20
+KPX kcommaaccent otilde -20
+KPX m u -10
+KPX m uacute -10
+KPX m ucircumflex -10
+KPX m udieresis -10
+KPX m ugrave -10
+KPX m uhungarumlaut -10
+KPX m umacron -10
+KPX m uogonek -10
+KPX m uring -10
+KPX m y -15
+KPX m yacute -15
+KPX m ydieresis -15
+KPX n u -10
+KPX n uacute -10
+KPX n ucircumflex -10
+KPX n udieresis -10
+KPX n ugrave -10
+KPX n uhungarumlaut -10
+KPX n umacron -10
+KPX n uogonek -10
+KPX n uring -10
+KPX n v -20
+KPX n y -15
+KPX n yacute -15
+KPX n ydieresis -15
+KPX nacute u -10
+KPX nacute uacute -10
+KPX nacute ucircumflex -10
+KPX nacute udieresis -10
+KPX nacute ugrave -10
+KPX nacute uhungarumlaut -10
+KPX nacute umacron -10
+KPX nacute uogonek -10
+KPX nacute uring -10
+KPX nacute v -20
+KPX nacute y -15
+KPX nacute yacute -15
+KPX nacute ydieresis -15
+KPX ncaron u -10
+KPX ncaron uacute -10
+KPX ncaron ucircumflex -10
+KPX ncaron udieresis -10
+KPX ncaron ugrave -10
+KPX ncaron uhungarumlaut -10
+KPX ncaron umacron -10
+KPX ncaron uogonek -10
+KPX ncaron uring -10
+KPX ncaron v -20
+KPX ncaron y -15
+KPX ncaron yacute -15
+KPX ncaron ydieresis -15
+KPX ncommaaccent u -10
+KPX ncommaaccent uacute -10
+KPX ncommaaccent ucircumflex -10
+KPX ncommaaccent udieresis -10
+KPX ncommaaccent ugrave -10
+KPX ncommaaccent uhungarumlaut -10
+KPX ncommaaccent umacron -10
+KPX ncommaaccent uogonek -10
+KPX ncommaaccent uring -10
+KPX ncommaaccent v -20
+KPX ncommaaccent y -15
+KPX ncommaaccent yacute -15
+KPX ncommaaccent ydieresis -15
+KPX ntilde u -10
+KPX ntilde uacute -10
+KPX ntilde ucircumflex -10
+KPX ntilde udieresis -10
+KPX ntilde ugrave -10
+KPX ntilde uhungarumlaut -10
+KPX ntilde umacron -10
+KPX ntilde uogonek -10
+KPX ntilde uring -10
+KPX ntilde v -20
+KPX ntilde y -15
+KPX ntilde yacute -15
+KPX ntilde ydieresis -15
+KPX o comma -40
+KPX o period -40
+KPX o v -15
+KPX o w -15
+KPX o x -30
+KPX o y -30
+KPX o yacute -30
+KPX o ydieresis -30
+KPX oacute comma -40
+KPX oacute period -40
+KPX oacute v -15
+KPX oacute w -15
+KPX oacute x -30
+KPX oacute y -30
+KPX oacute yacute -30
+KPX oacute ydieresis -30
+KPX ocircumflex comma -40
+KPX ocircumflex period -40
+KPX ocircumflex v -15
+KPX ocircumflex w -15
+KPX ocircumflex x -30
+KPX ocircumflex y -30
+KPX ocircumflex yacute -30
+KPX ocircumflex ydieresis -30
+KPX odieresis comma -40
+KPX odieresis period -40
+KPX odieresis v -15
+KPX odieresis w -15
+KPX odieresis x -30
+KPX odieresis y -30
+KPX odieresis yacute -30
+KPX odieresis ydieresis -30
+KPX ograve comma -40
+KPX ograve period -40
+KPX ograve v -15
+KPX ograve w -15
+KPX ograve x -30
+KPX ograve y -30
+KPX ograve yacute -30
+KPX ograve ydieresis -30
+KPX ohungarumlaut comma -40
+KPX ohungarumlaut period -40
+KPX ohungarumlaut v -15
+KPX ohungarumlaut w -15
+KPX ohungarumlaut x -30
+KPX ohungarumlaut y -30
+KPX ohungarumlaut yacute -30
+KPX ohungarumlaut ydieresis -30
+KPX omacron comma -40
+KPX omacron period -40
+KPX omacron v -15
+KPX omacron w -15
+KPX omacron x -30
+KPX omacron y -30
+KPX omacron yacute -30
+KPX omacron ydieresis -30
+KPX oslash a -55
+KPX oslash aacute -55
+KPX oslash abreve -55
+KPX oslash acircumflex -55
+KPX oslash adieresis -55
+KPX oslash agrave -55
+KPX oslash amacron -55
+KPX oslash aogonek -55
+KPX oslash aring -55
+KPX oslash atilde -55
+KPX oslash b -55
+KPX oslash c -55
+KPX oslash cacute -55
+KPX oslash ccaron -55
+KPX oslash ccedilla -55
+KPX oslash comma -95
+KPX oslash d -55
+KPX oslash dcroat -55
+KPX oslash e -55
+KPX oslash eacute -55
+KPX oslash ecaron -55
+KPX oslash ecircumflex -55
+KPX oslash edieresis -55
+KPX oslash edotaccent -55
+KPX oslash egrave -55
+KPX oslash emacron -55
+KPX oslash eogonek -55
+KPX oslash f -55
+KPX oslash g -55
+KPX oslash gbreve -55
+KPX oslash gcommaaccent -55
+KPX oslash h -55
+KPX oslash i -55
+KPX oslash iacute -55
+KPX oslash icircumflex -55
+KPX oslash idieresis -55
+KPX oslash igrave -55
+KPX oslash imacron -55
+KPX oslash iogonek -55
+KPX oslash j -55
+KPX oslash k -55
+KPX oslash kcommaaccent -55
+KPX oslash l -55
+KPX oslash lacute -55
+KPX oslash lcommaaccent -55
+KPX oslash lslash -55
+KPX oslash m -55
+KPX oslash n -55
+KPX oslash nacute -55
+KPX oslash ncaron -55
+KPX oslash ncommaaccent -55
+KPX oslash ntilde -55
+KPX oslash o -55
+KPX oslash oacute -55
+KPX oslash ocircumflex -55
+KPX oslash odieresis -55
+KPX oslash ograve -55
+KPX oslash ohungarumlaut -55
+KPX oslash omacron -55
+KPX oslash oslash -55
+KPX oslash otilde -55
+KPX oslash p -55
+KPX oslash period -95
+KPX oslash q -55
+KPX oslash r -55
+KPX oslash racute -55
+KPX oslash rcaron -55
+KPX oslash rcommaaccent -55
+KPX oslash s -55
+KPX oslash sacute -55
+KPX oslash scaron -55
+KPX oslash scedilla -55
+KPX oslash scommaaccent -55
+KPX oslash t -55
+KPX oslash tcommaaccent -55
+KPX oslash u -55
+KPX oslash uacute -55
+KPX oslash ucircumflex -55
+KPX oslash udieresis -55
+KPX oslash ugrave -55
+KPX oslash uhungarumlaut -55
+KPX oslash umacron -55
+KPX oslash uogonek -55
+KPX oslash uring -55
+KPX oslash v -70
+KPX oslash w -70
+KPX oslash x -85
+KPX oslash y -70
+KPX oslash yacute -70
+KPX oslash ydieresis -70
+KPX oslash z -55
+KPX oslash zacute -55
+KPX oslash zcaron -55
+KPX oslash zdotaccent -55
+KPX otilde comma -40
+KPX otilde period -40
+KPX otilde v -15
+KPX otilde w -15
+KPX otilde x -30
+KPX otilde y -30
+KPX otilde yacute -30
+KPX otilde ydieresis -30
+KPX p comma -35
+KPX p period -35
+KPX p y -30
+KPX p yacute -30
+KPX p ydieresis -30
+KPX period quotedblright -100
+KPX period quoteright -100
+KPX period space -60
+KPX quotedblright space -40
+KPX quoteleft quoteleft -57
+KPX quoteright d -50
+KPX quoteright dcroat -50
+KPX quoteright quoteright -57
+KPX quoteright r -50
+KPX quoteright racute -50
+KPX quoteright rcaron -50
+KPX quoteright rcommaaccent -50
+KPX quoteright s -50
+KPX quoteright sacute -50
+KPX quoteright scaron -50
+KPX quoteright scedilla -50
+KPX quoteright scommaaccent -50
+KPX quoteright space -70
+KPX r a -10
+KPX r aacute -10
+KPX r abreve -10
+KPX r acircumflex -10
+KPX r adieresis -10
+KPX r agrave -10
+KPX r amacron -10
+KPX r aogonek -10
+KPX r aring -10
+KPX r atilde -10
+KPX r colon 30
+KPX r comma -50
+KPX r i 15
+KPX r iacute 15
+KPX r icircumflex 15
+KPX r idieresis 15
+KPX r igrave 15
+KPX r imacron 15
+KPX r iogonek 15
+KPX r k 15
+KPX r kcommaaccent 15
+KPX r l 15
+KPX r lacute 15
+KPX r lcommaaccent 15
+KPX r lslash 15
+KPX r m 25
+KPX r n 25
+KPX r nacute 25
+KPX r ncaron 25
+KPX r ncommaaccent 25
+KPX r ntilde 25
+KPX r p 30
+KPX r period -50
+KPX r semicolon 30
+KPX r t 40
+KPX r tcommaaccent 40
+KPX r u 15
+KPX r uacute 15
+KPX r ucircumflex 15
+KPX r udieresis 15
+KPX r ugrave 15
+KPX r uhungarumlaut 15
+KPX r umacron 15
+KPX r uogonek 15
+KPX r uring 15
+KPX r v 30
+KPX r y 30
+KPX r yacute 30
+KPX r ydieresis 30
+KPX racute a -10
+KPX racute aacute -10
+KPX racute abreve -10
+KPX racute acircumflex -10
+KPX racute adieresis -10
+KPX racute agrave -10
+KPX racute amacron -10
+KPX racute aogonek -10
+KPX racute aring -10
+KPX racute atilde -10
+KPX racute colon 30
+KPX racute comma -50
+KPX racute i 15
+KPX racute iacute 15
+KPX racute icircumflex 15
+KPX racute idieresis 15
+KPX racute igrave 15
+KPX racute imacron 15
+KPX racute iogonek 15
+KPX racute k 15
+KPX racute kcommaaccent 15
+KPX racute l 15
+KPX racute lacute 15
+KPX racute lcommaaccent 15
+KPX racute lslash 15
+KPX racute m 25
+KPX racute n 25
+KPX racute nacute 25
+KPX racute ncaron 25
+KPX racute ncommaaccent 25
+KPX racute ntilde 25
+KPX racute p 30
+KPX racute period -50
+KPX racute semicolon 30
+KPX racute t 40
+KPX racute tcommaaccent 40
+KPX racute u 15
+KPX racute uacute 15
+KPX racute ucircumflex 15
+KPX racute udieresis 15
+KPX racute ugrave 15
+KPX racute uhungarumlaut 15
+KPX racute umacron 15
+KPX racute uogonek 15
+KPX racute uring 15
+KPX racute v 30
+KPX racute y 30
+KPX racute yacute 30
+KPX racute ydieresis 30
+KPX rcaron a -10
+KPX rcaron aacute -10
+KPX rcaron abreve -10
+KPX rcaron acircumflex -10
+KPX rcaron adieresis -10
+KPX rcaron agrave -10
+KPX rcaron amacron -10
+KPX rcaron aogonek -10
+KPX rcaron aring -10
+KPX rcaron atilde -10
+KPX rcaron colon 30
+KPX rcaron comma -50
+KPX rcaron i 15
+KPX rcaron iacute 15
+KPX rcaron icircumflex 15
+KPX rcaron idieresis 15
+KPX rcaron igrave 15
+KPX rcaron imacron 15
+KPX rcaron iogonek 15
+KPX rcaron k 15
+KPX rcaron kcommaaccent 15
+KPX rcaron l 15
+KPX rcaron lacute 15
+KPX rcaron lcommaaccent 15
+KPX rcaron lslash 15
+KPX rcaron m 25
+KPX rcaron n 25
+KPX rcaron nacute 25
+KPX rcaron ncaron 25
+KPX rcaron ncommaaccent 25
+KPX rcaron ntilde 25
+KPX rcaron p 30
+KPX rcaron period -50
+KPX rcaron semicolon 30
+KPX rcaron t 40
+KPX rcaron tcommaaccent 40
+KPX rcaron u 15
+KPX rcaron uacute 15
+KPX rcaron ucircumflex 15
+KPX rcaron udieresis 15
+KPX rcaron ugrave 15
+KPX rcaron uhungarumlaut 15
+KPX rcaron umacron 15
+KPX rcaron uogonek 15
+KPX rcaron uring 15
+KPX rcaron v 30
+KPX rcaron y 30
+KPX rcaron yacute 30
+KPX rcaron ydieresis 30
+KPX rcommaaccent a -10
+KPX rcommaaccent aacute -10
+KPX rcommaaccent abreve -10
+KPX rcommaaccent acircumflex -10
+KPX rcommaaccent adieresis -10
+KPX rcommaaccent agrave -10
+KPX rcommaaccent amacron -10
+KPX rcommaaccent aogonek -10
+KPX rcommaaccent aring -10
+KPX rcommaaccent atilde -10
+KPX rcommaaccent colon 30
+KPX rcommaaccent comma -50
+KPX rcommaaccent i 15
+KPX rcommaaccent iacute 15
+KPX rcommaaccent icircumflex 15
+KPX rcommaaccent idieresis 15
+KPX rcommaaccent igrave 15
+KPX rcommaaccent imacron 15
+KPX rcommaaccent iogonek 15
+KPX rcommaaccent k 15
+KPX rcommaaccent kcommaaccent 15
+KPX rcommaaccent l 15
+KPX rcommaaccent lacute 15
+KPX rcommaaccent lcommaaccent 15
+KPX rcommaaccent lslash 15
+KPX rcommaaccent m 25
+KPX rcommaaccent n 25
+KPX rcommaaccent nacute 25
+KPX rcommaaccent ncaron 25
+KPX rcommaaccent ncommaaccent 25
+KPX rcommaaccent ntilde 25
+KPX rcommaaccent p 30
+KPX rcommaaccent period -50
+KPX rcommaaccent semicolon 30
+KPX rcommaaccent t 40
+KPX rcommaaccent tcommaaccent 40
+KPX rcommaaccent u 15
+KPX rcommaaccent uacute 15
+KPX rcommaaccent ucircumflex 15
+KPX rcommaaccent udieresis 15
+KPX rcommaaccent ugrave 15
+KPX rcommaaccent uhungarumlaut 15
+KPX rcommaaccent umacron 15
+KPX rcommaaccent uogonek 15
+KPX rcommaaccent uring 15
+KPX rcommaaccent v 30
+KPX rcommaaccent y 30
+KPX rcommaaccent yacute 30
+KPX rcommaaccent ydieresis 30
+KPX s comma -15
+KPX s period -15
+KPX s w -30
+KPX sacute comma -15
+KPX sacute period -15
+KPX sacute w -30
+KPX scaron comma -15
+KPX scaron period -15
+KPX scaron w -30
+KPX scedilla comma -15
+KPX scedilla period -15
+KPX scedilla w -30
+KPX scommaaccent comma -15
+KPX scommaaccent period -15
+KPX scommaaccent w -30
+KPX semicolon space -50
+KPX space T -50
+KPX space Tcaron -50
+KPX space Tcommaaccent -50
+KPX space V -50
+KPX space W -40
+KPX space Y -90
+KPX space Yacute -90
+KPX space Ydieresis -90
+KPX space quotedblleft -30
+KPX space quoteleft -60
+KPX v a -25
+KPX v aacute -25
+KPX v abreve -25
+KPX v acircumflex -25
+KPX v adieresis -25
+KPX v agrave -25
+KPX v amacron -25
+KPX v aogonek -25
+KPX v aring -25
+KPX v atilde -25
+KPX v comma -80
+KPX v e -25
+KPX v eacute -25
+KPX v ecaron -25
+KPX v ecircumflex -25
+KPX v edieresis -25
+KPX v edotaccent -25
+KPX v egrave -25
+KPX v emacron -25
+KPX v eogonek -25
+KPX v o -25
+KPX v oacute -25
+KPX v ocircumflex -25
+KPX v odieresis -25
+KPX v ograve -25
+KPX v ohungarumlaut -25
+KPX v omacron -25
+KPX v oslash -25
+KPX v otilde -25
+KPX v period -80
+KPX w a -15
+KPX w aacute -15
+KPX w abreve -15
+KPX w acircumflex -15
+KPX w adieresis -15
+KPX w agrave -15
+KPX w amacron -15
+KPX w aogonek -15
+KPX w aring -15
+KPX w atilde -15
+KPX w comma -60
+KPX w e -10
+KPX w eacute -10
+KPX w ecaron -10
+KPX w ecircumflex -10
+KPX w edieresis -10
+KPX w edotaccent -10
+KPX w egrave -10
+KPX w emacron -10
+KPX w eogonek -10
+KPX w o -10
+KPX w oacute -10
+KPX w ocircumflex -10
+KPX w odieresis -10
+KPX w ograve -10
+KPX w ohungarumlaut -10
+KPX w omacron -10
+KPX w oslash -10
+KPX w otilde -10
+KPX w period -60
+KPX x e -30
+KPX x eacute -30
+KPX x ecaron -30
+KPX x ecircumflex -30
+KPX x edieresis -30
+KPX x edotaccent -30
+KPX x egrave -30
+KPX x emacron -30
+KPX x eogonek -30
+KPX y a -20
+KPX y aacute -20
+KPX y abreve -20
+KPX y acircumflex -20
+KPX y adieresis -20
+KPX y agrave -20
+KPX y amacron -20
+KPX y aogonek -20
+KPX y aring -20
+KPX y atilde -20
+KPX y comma -100
+KPX y e -20
+KPX y eacute -20
+KPX y ecaron -20
+KPX y ecircumflex -20
+KPX y edieresis -20
+KPX y edotaccent -20
+KPX y egrave -20
+KPX y emacron -20
+KPX y eogonek -20
+KPX y o -20
+KPX y oacute -20
+KPX y ocircumflex -20
+KPX y odieresis -20
+KPX y ograve -20
+KPX y ohungarumlaut -20
+KPX y omacron -20
+KPX y oslash -20
+KPX y otilde -20
+KPX y period -100
+KPX yacute a -20
+KPX yacute aacute -20
+KPX yacute abreve -20
+KPX yacute acircumflex -20
+KPX yacute adieresis -20
+KPX yacute agrave -20
+KPX yacute amacron -20
+KPX yacute aogonek -20
+KPX yacute aring -20
+KPX yacute atilde -20
+KPX yacute comma -100
+KPX yacute e -20
+KPX yacute eacute -20
+KPX yacute ecaron -20
+KPX yacute ecircumflex -20
+KPX yacute edieresis -20
+KPX yacute edotaccent -20
+KPX yacute egrave -20
+KPX yacute emacron -20
+KPX yacute eogonek -20
+KPX yacute o -20
+KPX yacute oacute -20
+KPX yacute ocircumflex -20
+KPX yacute odieresis -20
+KPX yacute ograve -20
+KPX yacute ohungarumlaut -20
+KPX yacute omacron -20
+KPX yacute oslash -20
+KPX yacute otilde -20
+KPX yacute period -100
+KPX ydieresis a -20
+KPX ydieresis aacute -20
+KPX ydieresis abreve -20
+KPX ydieresis acircumflex -20
+KPX ydieresis adieresis -20
+KPX ydieresis agrave -20
+KPX ydieresis amacron -20
+KPX ydieresis aogonek -20
+KPX ydieresis aring -20
+KPX ydieresis atilde -20
+KPX ydieresis comma -100
+KPX ydieresis e -20
+KPX ydieresis eacute -20
+KPX ydieresis ecaron -20
+KPX ydieresis ecircumflex -20
+KPX ydieresis edieresis -20
+KPX ydieresis edotaccent -20
+KPX ydieresis egrave -20
+KPX ydieresis emacron -20
+KPX ydieresis eogonek -20
+KPX ydieresis o -20
+KPX ydieresis oacute -20
+KPX ydieresis ocircumflex -20
+KPX ydieresis odieresis -20
+KPX ydieresis ograve -20
+KPX ydieresis ohungarumlaut -20
+KPX ydieresis omacron -20
+KPX ydieresis oslash -20
+KPX ydieresis otilde -20
+KPX ydieresis period -100
+KPX z e -15
+KPX z eacute -15
+KPX z ecaron -15
+KPX z ecircumflex -15
+KPX z edieresis -15
+KPX z edotaccent -15
+KPX z egrave -15
+KPX z emacron -15
+KPX z eogonek -15
+KPX z o -15
+KPX z oacute -15
+KPX z ocircumflex -15
+KPX z odieresis -15
+KPX z ograve -15
+KPX z ohungarumlaut -15
+KPX z omacron -15
+KPX z oslash -15
+KPX z otilde -15
+KPX zacute e -15
+KPX zacute eacute -15
+KPX zacute ecaron -15
+KPX zacute ecircumflex -15
+KPX zacute edieresis -15
+KPX zacute edotaccent -15
+KPX zacute egrave -15
+KPX zacute emacron -15
+KPX zacute eogonek -15
+KPX zacute o -15
+KPX zacute oacute -15
+KPX zacute ocircumflex -15
+KPX zacute odieresis -15
+KPX zacute ograve -15
+KPX zacute ohungarumlaut -15
+KPX zacute omacron -15
+KPX zacute oslash -15
+KPX zacute otilde -15
+KPX zcaron e -15
+KPX zcaron eacute -15
+KPX zcaron ecaron -15
+KPX zcaron ecircumflex -15
+KPX zcaron edieresis -15
+KPX zcaron edotaccent -15
+KPX zcaron egrave -15
+KPX zcaron emacron -15
+KPX zcaron eogonek -15
+KPX zcaron o -15
+KPX zcaron oacute -15
+KPX zcaron ocircumflex -15
+KPX zcaron odieresis -15
+KPX zcaron ograve -15
+KPX zcaron ohungarumlaut -15
+KPX zcaron omacron -15
+KPX zcaron oslash -15
+KPX zcaron otilde -15
+KPX zdotaccent e -15
+KPX zdotaccent eacute -15
+KPX zdotaccent ecaron -15
+KPX zdotaccent ecircumflex -15
+KPX zdotaccent edieresis -15
+KPX zdotaccent edotaccent -15
+KPX zdotaccent egrave -15
+KPX zdotaccent emacron -15
+KPX zdotaccent eogonek -15
+KPX zdotaccent o -15
+KPX zdotaccent oacute -15
+KPX zdotaccent ocircumflex -15
+KPX zdotaccent odieresis -15
+KPX zdotaccent ograve -15
+KPX zdotaccent ohungarumlaut -15
+KPX zdotaccent omacron -15
+KPX zdotaccent oslash -15
+KPX zdotaccent otilde -15
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/src/fonts/Adobe-Core35_AFMs-314/Helvetica.afm b/src/fonts/Adobe-Core35_AFMs-314/Helvetica.afm
new file mode 100644
index 0000000..0e3acae
--- /dev/null
+++ b/src/fonts/Adobe-Core35_AFMs-314/Helvetica.afm
@@ -0,0 +1,3049 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Thu May 1 12:38:23 1997
+Comment UniqueID 43054
+Comment VMusage 37069 48094
+FontName Helvetica
+FullName Helvetica
+FamilyName Helvetica
+Weight Medium
+ItalicAngle 0
+IsFixedPitch false
+FontBBox -166 -225 1000 931
+UnderlinePosition -100
+UnderlineThickness 50
+Version 002.000
+Notice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries.
+EncodingScheme AdobeStandardEncoding
+CapHeight 718
+XHeight 523
+Ascender 718
+Descender -207
+StdHW 76
+StdVW 88
+StartCharMetrics 314
+C 32 ; WX 278 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 278 ; N exclam ; B 90 0 187 718 ;
+C 34 ; WX 355 ; N quotedbl ; B 70 463 285 718 ;
+C 35 ; WX 556 ; N numbersign ; B 28 0 529 688 ;
+C 36 ; WX 556 ; N dollar ; B 32 -115 520 775 ;
+C 37 ; WX 889 ; N percent ; B 39 -19 850 703 ;
+C 38 ; WX 667 ; N ampersand ; B 44 -15 645 718 ;
+C 39 ; WX 222 ; N quoteright ; B 53 463 157 718 ;
+C 40 ; WX 333 ; N parenleft ; B 68 -207 299 733 ;
+C 41 ; WX 333 ; N parenright ; B 34 -207 265 733 ;
+C 42 ; WX 389 ; N asterisk ; B 39 431 349 718 ;
+C 43 ; WX 584 ; N plus ; B 39 0 545 505 ;
+C 44 ; WX 278 ; N comma ; B 87 -147 191 106 ;
+C 45 ; WX 333 ; N hyphen ; B 44 232 289 322 ;
+C 46 ; WX 278 ; N period ; B 87 0 191 106 ;
+C 47 ; WX 278 ; N slash ; B -17 -19 295 737 ;
+C 48 ; WX 556 ; N zero ; B 37 -19 519 703 ;
+C 49 ; WX 556 ; N one ; B 101 0 359 703 ;
+C 50 ; WX 556 ; N two ; B 26 0 507 703 ;
+C 51 ; WX 556 ; N three ; B 34 -19 522 703 ;
+C 52 ; WX 556 ; N four ; B 25 0 523 703 ;
+C 53 ; WX 556 ; N five ; B 32 -19 514 688 ;
+C 54 ; WX 556 ; N six ; B 38 -19 518 703 ;
+C 55 ; WX 556 ; N seven ; B 37 0 523 688 ;
+C 56 ; WX 556 ; N eight ; B 38 -19 517 703 ;
+C 57 ; WX 556 ; N nine ; B 42 -19 514 703 ;
+C 58 ; WX 278 ; N colon ; B 87 0 191 516 ;
+C 59 ; WX 278 ; N semicolon ; B 87 -147 191 516 ;
+C 60 ; WX 584 ; N less ; B 48 11 536 495 ;
+C 61 ; WX 584 ; N equal ; B 39 115 545 390 ;
+C 62 ; WX 584 ; N greater ; B 48 11 536 495 ;
+C 63 ; WX 556 ; N question ; B 56 0 492 727 ;
+C 64 ; WX 1015 ; N at ; B 147 -19 868 737 ;
+C 65 ; WX 667 ; N A ; B 14 0 654 718 ;
+C 66 ; WX 667 ; N B ; B 74 0 627 718 ;
+C 67 ; WX 722 ; N C ; B 44 -19 681 737 ;
+C 68 ; WX 722 ; N D ; B 81 0 674 718 ;
+C 69 ; WX 667 ; N E ; B 86 0 616 718 ;
+C 70 ; WX 611 ; N F ; B 86 0 583 718 ;
+C 71 ; WX 778 ; N G ; B 48 -19 704 737 ;
+C 72 ; WX 722 ; N H ; B 77 0 646 718 ;
+C 73 ; WX 278 ; N I ; B 91 0 188 718 ;
+C 74 ; WX 500 ; N J ; B 17 -19 428 718 ;
+C 75 ; WX 667 ; N K ; B 76 0 663 718 ;
+C 76 ; WX 556 ; N L ; B 76 0 537 718 ;
+C 77 ; WX 833 ; N M ; B 73 0 761 718 ;
+C 78 ; WX 722 ; N N ; B 76 0 646 718 ;
+C 79 ; WX 778 ; N O ; B 39 -19 739 737 ;
+C 80 ; WX 667 ; N P ; B 86 0 622 718 ;
+C 81 ; WX 778 ; N Q ; B 39 -56 739 737 ;
+C 82 ; WX 722 ; N R ; B 88 0 684 718 ;
+C 83 ; WX 667 ; N S ; B 49 -19 620 737 ;
+C 84 ; WX 611 ; N T ; B 14 0 597 718 ;
+C 85 ; WX 722 ; N U ; B 79 -19 644 718 ;
+C 86 ; WX 667 ; N V ; B 20 0 647 718 ;
+C 87 ; WX 944 ; N W ; B 16 0 928 718 ;
+C 88 ; WX 667 ; N X ; B 19 0 648 718 ;
+C 89 ; WX 667 ; N Y ; B 14 0 653 718 ;
+C 90 ; WX 611 ; N Z ; B 23 0 588 718 ;
+C 91 ; WX 278 ; N bracketleft ; B 63 -196 250 722 ;
+C 92 ; WX 278 ; N backslash ; B -17 -19 295 737 ;
+C 93 ; WX 278 ; N bracketright ; B 28 -196 215 722 ;
+C 94 ; WX 469 ; N asciicircum ; B -14 264 483 688 ;
+C 95 ; WX 556 ; N underscore ; B 0 -125 556 -75 ;
+C 96 ; WX 222 ; N quoteleft ; B 65 470 169 725 ;
+C 97 ; WX 556 ; N a ; B 36 -15 530 538 ;
+C 98 ; WX 556 ; N b ; B 58 -15 517 718 ;
+C 99 ; WX 500 ; N c ; B 30 -15 477 538 ;
+C 100 ; WX 556 ; N d ; B 35 -15 499 718 ;
+C 101 ; WX 556 ; N e ; B 40 -15 516 538 ;
+C 102 ; WX 278 ; N f ; B 14 0 262 728 ; L i fi ; L l fl ;
+C 103 ; WX 556 ; N g ; B 40 -220 499 538 ;
+C 104 ; WX 556 ; N h ; B 65 0 491 718 ;
+C 105 ; WX 222 ; N i ; B 67 0 155 718 ;
+C 106 ; WX 222 ; N j ; B -16 -210 155 718 ;
+C 107 ; WX 500 ; N k ; B 67 0 501 718 ;
+C 108 ; WX 222 ; N l ; B 67 0 155 718 ;
+C 109 ; WX 833 ; N m ; B 65 0 769 538 ;
+C 110 ; WX 556 ; N n ; B 65 0 491 538 ;
+C 111 ; WX 556 ; N o ; B 35 -14 521 538 ;
+C 112 ; WX 556 ; N p ; B 58 -207 517 538 ;
+C 113 ; WX 556 ; N q ; B 35 -207 494 538 ;
+C 114 ; WX 333 ; N r ; B 77 0 332 538 ;
+C 115 ; WX 500 ; N s ; B 32 -15 464 538 ;
+C 116 ; WX 278 ; N t ; B 14 -7 257 669 ;
+C 117 ; WX 556 ; N u ; B 68 -15 489 523 ;
+C 118 ; WX 500 ; N v ; B 8 0 492 523 ;
+C 119 ; WX 722 ; N w ; B 14 0 709 523 ;
+C 120 ; WX 500 ; N x ; B 11 0 490 523 ;
+C 121 ; WX 500 ; N y ; B 11 -214 489 523 ;
+C 122 ; WX 500 ; N z ; B 31 0 469 523 ;
+C 123 ; WX 334 ; N braceleft ; B 42 -196 292 722 ;
+C 124 ; WX 260 ; N bar ; B 94 -225 167 775 ;
+C 125 ; WX 334 ; N braceright ; B 42 -196 292 722 ;
+C 126 ; WX 584 ; N asciitilde ; B 61 180 523 326 ;
+C 161 ; WX 333 ; N exclamdown ; B 118 -195 215 523 ;
+C 162 ; WX 556 ; N cent ; B 51 -115 513 623 ;
+C 163 ; WX 556 ; N sterling ; B 33 -16 539 718 ;
+C 164 ; WX 167 ; N fraction ; B -166 -19 333 703 ;
+C 165 ; WX 556 ; N yen ; B 3 0 553 688 ;
+C 166 ; WX 556 ; N florin ; B -11 -207 501 737 ;
+C 167 ; WX 556 ; N section ; B 43 -191 512 737 ;
+C 168 ; WX 556 ; N currency ; B 28 99 528 603 ;
+C 169 ; WX 191 ; N quotesingle ; B 59 463 132 718 ;
+C 170 ; WX 333 ; N quotedblleft ; B 38 470 307 725 ;
+C 171 ; WX 556 ; N guillemotleft ; B 97 108 459 446 ;
+C 172 ; WX 333 ; N guilsinglleft ; B 88 108 245 446 ;
+C 173 ; WX 333 ; N guilsinglright ; B 88 108 245 446 ;
+C 174 ; WX 500 ; N fi ; B 14 0 434 728 ;
+C 175 ; WX 500 ; N fl ; B 14 0 432 728 ;
+C 177 ; WX 556 ; N endash ; B 0 240 556 313 ;
+C 178 ; WX 556 ; N dagger ; B 43 -159 514 718 ;
+C 179 ; WX 556 ; N daggerdbl ; B 43 -159 514 718 ;
+C 180 ; WX 278 ; N periodcentered ; B 77 190 202 315 ;
+C 182 ; WX 537 ; N paragraph ; B 18 -173 497 718 ;
+C 183 ; WX 350 ; N bullet ; B 18 202 333 517 ;
+C 184 ; WX 222 ; N quotesinglbase ; B 53 -149 157 106 ;
+C 185 ; WX 333 ; N quotedblbase ; B 26 -149 295 106 ;
+C 186 ; WX 333 ; N quotedblright ; B 26 463 295 718 ;
+C 187 ; WX 556 ; N guillemotright ; B 97 108 459 446 ;
+C 188 ; WX 1000 ; N ellipsis ; B 115 0 885 106 ;
+C 189 ; WX 1000 ; N perthousand ; B 7 -19 994 703 ;
+C 191 ; WX 611 ; N questiondown ; B 91 -201 527 525 ;
+C 193 ; WX 333 ; N grave ; B 14 593 211 734 ;
+C 194 ; WX 333 ; N acute ; B 122 593 319 734 ;
+C 195 ; WX 333 ; N circumflex ; B 21 593 312 734 ;
+C 196 ; WX 333 ; N tilde ; B -4 606 337 722 ;
+C 197 ; WX 333 ; N macron ; B 10 627 323 684 ;
+C 198 ; WX 333 ; N breve ; B 13 595 321 731 ;
+C 199 ; WX 333 ; N dotaccent ; B 121 604 212 706 ;
+C 200 ; WX 333 ; N dieresis ; B 40 604 293 706 ;
+C 202 ; WX 333 ; N ring ; B 75 572 259 756 ;
+C 203 ; WX 333 ; N cedilla ; B 45 -225 259 0 ;
+C 205 ; WX 333 ; N hungarumlaut ; B 31 593 409 734 ;
+C 206 ; WX 333 ; N ogonek ; B 73 -225 287 0 ;
+C 207 ; WX 333 ; N caron ; B 21 593 312 734 ;
+C 208 ; WX 1000 ; N emdash ; B 0 240 1000 313 ;
+C 225 ; WX 1000 ; N AE ; B 8 0 951 718 ;
+C 227 ; WX 370 ; N ordfeminine ; B 24 405 346 737 ;
+C 232 ; WX 556 ; N Lslash ; B -20 0 537 718 ;
+C 233 ; WX 778 ; N Oslash ; B 39 -19 740 737 ;
+C 234 ; WX 1000 ; N OE ; B 36 -19 965 737 ;
+C 235 ; WX 365 ; N ordmasculine ; B 25 405 341 737 ;
+C 241 ; WX 889 ; N ae ; B 36 -15 847 538 ;
+C 245 ; WX 278 ; N dotlessi ; B 95 0 183 523 ;
+C 248 ; WX 222 ; N lslash ; B -20 0 242 718 ;
+C 249 ; WX 611 ; N oslash ; B 28 -22 537 545 ;
+C 250 ; WX 944 ; N oe ; B 35 -15 902 538 ;
+C 251 ; WX 611 ; N germandbls ; B 67 -15 571 728 ;
+C -1 ; WX 278 ; N Idieresis ; B 13 0 266 901 ;
+C -1 ; WX 556 ; N eacute ; B 40 -15 516 734 ;
+C -1 ; WX 556 ; N abreve ; B 36 -15 530 731 ;
+C -1 ; WX 556 ; N uhungarumlaut ; B 68 -15 521 734 ;
+C -1 ; WX 556 ; N ecaron ; B 40 -15 516 734 ;
+C -1 ; WX 667 ; N Ydieresis ; B 14 0 653 901 ;
+C -1 ; WX 584 ; N divide ; B 39 -19 545 524 ;
+C -1 ; WX 667 ; N Yacute ; B 14 0 653 929 ;
+C -1 ; WX 667 ; N Acircumflex ; B 14 0 654 929 ;
+C -1 ; WX 556 ; N aacute ; B 36 -15 530 734 ;
+C -1 ; WX 722 ; N Ucircumflex ; B 79 -19 644 929 ;
+C -1 ; WX 500 ; N yacute ; B 11 -214 489 734 ;
+C -1 ; WX 500 ; N scommaaccent ; B 32 -225 464 538 ;
+C -1 ; WX 556 ; N ecircumflex ; B 40 -15 516 734 ;
+C -1 ; WX 722 ; N Uring ; B 79 -19 644 931 ;
+C -1 ; WX 722 ; N Udieresis ; B 79 -19 644 901 ;
+C -1 ; WX 556 ; N aogonek ; B 36 -220 547 538 ;
+C -1 ; WX 722 ; N Uacute ; B 79 -19 644 929 ;
+C -1 ; WX 556 ; N uogonek ; B 68 -225 519 523 ;
+C -1 ; WX 667 ; N Edieresis ; B 86 0 616 901 ;
+C -1 ; WX 722 ; N Dcroat ; B 0 0 674 718 ;
+C -1 ; WX 250 ; N commaaccent ; B 87 -225 181 -40 ;
+C -1 ; WX 737 ; N copyright ; B -14 -19 752 737 ;
+C -1 ; WX 667 ; N Emacron ; B 86 0 616 879 ;
+C -1 ; WX 500 ; N ccaron ; B 30 -15 477 734 ;
+C -1 ; WX 556 ; N aring ; B 36 -15 530 756 ;
+C -1 ; WX 722 ; N Ncommaaccent ; B 76 -225 646 718 ;
+C -1 ; WX 222 ; N lacute ; B 67 0 264 929 ;
+C -1 ; WX 556 ; N agrave ; B 36 -15 530 734 ;
+C -1 ; WX 611 ; N Tcommaaccent ; B 14 -225 597 718 ;
+C -1 ; WX 722 ; N Cacute ; B 44 -19 681 929 ;
+C -1 ; WX 556 ; N atilde ; B 36 -15 530 722 ;
+C -1 ; WX 667 ; N Edotaccent ; B 86 0 616 901 ;
+C -1 ; WX 500 ; N scaron ; B 32 -15 464 734 ;
+C -1 ; WX 500 ; N scedilla ; B 32 -225 464 538 ;
+C -1 ; WX 278 ; N iacute ; B 95 0 292 734 ;
+C -1 ; WX 471 ; N lozenge ; B 10 0 462 728 ;
+C -1 ; WX 722 ; N Rcaron ; B 88 0 684 929 ;
+C -1 ; WX 778 ; N Gcommaaccent ; B 48 -225 704 737 ;
+C -1 ; WX 556 ; N ucircumflex ; B 68 -15 489 734 ;
+C -1 ; WX 556 ; N acircumflex ; B 36 -15 530 734 ;
+C -1 ; WX 667 ; N Amacron ; B 14 0 654 879 ;
+C -1 ; WX 333 ; N rcaron ; B 61 0 352 734 ;
+C -1 ; WX 500 ; N ccedilla ; B 30 -225 477 538 ;
+C -1 ; WX 611 ; N Zdotaccent ; B 23 0 588 901 ;
+C -1 ; WX 667 ; N Thorn ; B 86 0 622 718 ;
+C -1 ; WX 778 ; N Omacron ; B 39 -19 739 879 ;
+C -1 ; WX 722 ; N Racute ; B 88 0 684 929 ;
+C -1 ; WX 667 ; N Sacute ; B 49 -19 620 929 ;
+C -1 ; WX 643 ; N dcaron ; B 35 -15 655 718 ;
+C -1 ; WX 722 ; N Umacron ; B 79 -19 644 879 ;
+C -1 ; WX 556 ; N uring ; B 68 -15 489 756 ;
+C -1 ; WX 333 ; N threesuperior ; B 5 270 325 703 ;
+C -1 ; WX 778 ; N Ograve ; B 39 -19 739 929 ;
+C -1 ; WX 667 ; N Agrave ; B 14 0 654 929 ;
+C -1 ; WX 667 ; N Abreve ; B 14 0 654 926 ;
+C -1 ; WX 584 ; N multiply ; B 39 0 545 506 ;
+C -1 ; WX 556 ; N uacute ; B 68 -15 489 734 ;
+C -1 ; WX 611 ; N Tcaron ; B 14 0 597 929 ;
+C -1 ; WX 476 ; N partialdiff ; B 13 -38 463 714 ;
+C -1 ; WX 500 ; N ydieresis ; B 11 -214 489 706 ;
+C -1 ; WX 722 ; N Nacute ; B 76 0 646 929 ;
+C -1 ; WX 278 ; N icircumflex ; B -6 0 285 734 ;
+C -1 ; WX 667 ; N Ecircumflex ; B 86 0 616 929 ;
+C -1 ; WX 556 ; N adieresis ; B 36 -15 530 706 ;
+C -1 ; WX 556 ; N edieresis ; B 40 -15 516 706 ;
+C -1 ; WX 500 ; N cacute ; B 30 -15 477 734 ;
+C -1 ; WX 556 ; N nacute ; B 65 0 491 734 ;
+C -1 ; WX 556 ; N umacron ; B 68 -15 489 684 ;
+C -1 ; WX 722 ; N Ncaron ; B 76 0 646 929 ;
+C -1 ; WX 278 ; N Iacute ; B 91 0 292 929 ;
+C -1 ; WX 584 ; N plusminus ; B 39 0 545 506 ;
+C -1 ; WX 260 ; N brokenbar ; B 94 -150 167 700 ;
+C -1 ; WX 737 ; N registered ; B -14 -19 752 737 ;
+C -1 ; WX 778 ; N Gbreve ; B 48 -19 704 926 ;
+C -1 ; WX 278 ; N Idotaccent ; B 91 0 188 901 ;
+C -1 ; WX 600 ; N summation ; B 15 -10 586 706 ;
+C -1 ; WX 667 ; N Egrave ; B 86 0 616 929 ;
+C -1 ; WX 333 ; N racute ; B 77 0 332 734 ;
+C -1 ; WX 556 ; N omacron ; B 35 -14 521 684 ;
+C -1 ; WX 611 ; N Zacute ; B 23 0 588 929 ;
+C -1 ; WX 611 ; N Zcaron ; B 23 0 588 929 ;
+C -1 ; WX 549 ; N greaterequal ; B 26 0 523 674 ;
+C -1 ; WX 722 ; N Eth ; B 0 0 674 718 ;
+C -1 ; WX 722 ; N Ccedilla ; B 44 -225 681 737 ;
+C -1 ; WX 222 ; N lcommaaccent ; B 67 -225 167 718 ;
+C -1 ; WX 317 ; N tcaron ; B 14 -7 329 808 ;
+C -1 ; WX 556 ; N eogonek ; B 40 -225 516 538 ;
+C -1 ; WX 722 ; N Uogonek ; B 79 -225 644 718 ;
+C -1 ; WX 667 ; N Aacute ; B 14 0 654 929 ;
+C -1 ; WX 667 ; N Adieresis ; B 14 0 654 901 ;
+C -1 ; WX 556 ; N egrave ; B 40 -15 516 734 ;
+C -1 ; WX 500 ; N zacute ; B 31 0 469 734 ;
+C -1 ; WX 222 ; N iogonek ; B -31 -225 183 718 ;
+C -1 ; WX 778 ; N Oacute ; B 39 -19 739 929 ;
+C -1 ; WX 556 ; N oacute ; B 35 -14 521 734 ;
+C -1 ; WX 556 ; N amacron ; B 36 -15 530 684 ;
+C -1 ; WX 500 ; N sacute ; B 32 -15 464 734 ;
+C -1 ; WX 278 ; N idieresis ; B 13 0 266 706 ;
+C -1 ; WX 778 ; N Ocircumflex ; B 39 -19 739 929 ;
+C -1 ; WX 722 ; N Ugrave ; B 79 -19 644 929 ;
+C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ;
+C -1 ; WX 556 ; N thorn ; B 58 -207 517 718 ;
+C -1 ; WX 333 ; N twosuperior ; B 4 281 323 703 ;
+C -1 ; WX 778 ; N Odieresis ; B 39 -19 739 901 ;
+C -1 ; WX 556 ; N mu ; B 68 -207 489 523 ;
+C -1 ; WX 278 ; N igrave ; B -13 0 184 734 ;
+C -1 ; WX 556 ; N ohungarumlaut ; B 35 -14 521 734 ;
+C -1 ; WX 667 ; N Eogonek ; B 86 -220 633 718 ;
+C -1 ; WX 556 ; N dcroat ; B 35 -15 550 718 ;
+C -1 ; WX 834 ; N threequarters ; B 45 -19 810 703 ;
+C -1 ; WX 667 ; N Scedilla ; B 49 -225 620 737 ;
+C -1 ; WX 299 ; N lcaron ; B 67 0 311 718 ;
+C -1 ; WX 667 ; N Kcommaaccent ; B 76 -225 663 718 ;
+C -1 ; WX 556 ; N Lacute ; B 76 0 537 929 ;
+C -1 ; WX 1000 ; N trademark ; B 46 306 903 718 ;
+C -1 ; WX 556 ; N edotaccent ; B 40 -15 516 706 ;
+C -1 ; WX 278 ; N Igrave ; B -13 0 188 929 ;
+C -1 ; WX 278 ; N Imacron ; B -17 0 296 879 ;
+C -1 ; WX 556 ; N Lcaron ; B 76 0 537 718 ;
+C -1 ; WX 834 ; N onehalf ; B 43 -19 773 703 ;
+C -1 ; WX 549 ; N lessequal ; B 26 0 523 674 ;
+C -1 ; WX 556 ; N ocircumflex ; B 35 -14 521 734 ;
+C -1 ; WX 556 ; N ntilde ; B 65 0 491 722 ;
+C -1 ; WX 722 ; N Uhungarumlaut ; B 79 -19 644 929 ;
+C -1 ; WX 667 ; N Eacute ; B 86 0 616 929 ;
+C -1 ; WX 556 ; N emacron ; B 40 -15 516 684 ;
+C -1 ; WX 556 ; N gbreve ; B 40 -220 499 731 ;
+C -1 ; WX 834 ; N onequarter ; B 73 -19 756 703 ;
+C -1 ; WX 667 ; N Scaron ; B 49 -19 620 929 ;
+C -1 ; WX 667 ; N Scommaaccent ; B 49 -225 620 737 ;
+C -1 ; WX 778 ; N Ohungarumlaut ; B 39 -19 739 929 ;
+C -1 ; WX 400 ; N degree ; B 54 411 346 703 ;
+C -1 ; WX 556 ; N ograve ; B 35 -14 521 734 ;
+C -1 ; WX 722 ; N Ccaron ; B 44 -19 681 929 ;
+C -1 ; WX 556 ; N ugrave ; B 68 -15 489 734 ;
+C -1 ; WX 453 ; N radical ; B -4 -80 458 762 ;
+C -1 ; WX 722 ; N Dcaron ; B 81 0 674 929 ;
+C -1 ; WX 333 ; N rcommaaccent ; B 77 -225 332 538 ;
+C -1 ; WX 722 ; N Ntilde ; B 76 0 646 917 ;
+C -1 ; WX 556 ; N otilde ; B 35 -14 521 722 ;
+C -1 ; WX 722 ; N Rcommaaccent ; B 88 -225 684 718 ;
+C -1 ; WX 556 ; N Lcommaaccent ; B 76 -225 537 718 ;
+C -1 ; WX 667 ; N Atilde ; B 14 0 654 917 ;
+C -1 ; WX 667 ; N Aogonek ; B 14 -225 654 718 ;
+C -1 ; WX 667 ; N Aring ; B 14 0 654 931 ;
+C -1 ; WX 778 ; N Otilde ; B 39 -19 739 917 ;
+C -1 ; WX 500 ; N zdotaccent ; B 31 0 469 706 ;
+C -1 ; WX 667 ; N Ecaron ; B 86 0 616 929 ;
+C -1 ; WX 278 ; N Iogonek ; B -3 -225 211 718 ;
+C -1 ; WX 500 ; N kcommaaccent ; B 67 -225 501 718 ;
+C -1 ; WX 584 ; N minus ; B 39 216 545 289 ;
+C -1 ; WX 278 ; N Icircumflex ; B -6 0 285 929 ;
+C -1 ; WX 556 ; N ncaron ; B 65 0 491 734 ;
+C -1 ; WX 278 ; N tcommaaccent ; B 14 -225 257 669 ;
+C -1 ; WX 584 ; N logicalnot ; B 39 108 545 390 ;
+C -1 ; WX 556 ; N odieresis ; B 35 -14 521 706 ;
+C -1 ; WX 556 ; N udieresis ; B 68 -15 489 706 ;
+C -1 ; WX 549 ; N notequal ; B 12 -35 537 551 ;
+C -1 ; WX 556 ; N gcommaaccent ; B 40 -220 499 822 ;
+C -1 ; WX 556 ; N eth ; B 35 -15 522 737 ;
+C -1 ; WX 500 ; N zcaron ; B 31 0 469 734 ;
+C -1 ; WX 556 ; N ncommaaccent ; B 65 -225 491 538 ;
+C -1 ; WX 333 ; N onesuperior ; B 43 281 222 703 ;
+C -1 ; WX 278 ; N imacron ; B 5 0 272 684 ;
+EndCharMetrics
+StartKernData
+StartKernPairs 2705
+KPX A C -30
+KPX A Cacute -30
+KPX A Ccaron -30
+KPX A Ccedilla -30
+KPX A G -30
+KPX A Gbreve -30
+KPX A Gcommaaccent -30
+KPX A O -30
+KPX A Oacute -30
+KPX A Ocircumflex -30
+KPX A Odieresis -30
+KPX A Ograve -30
+KPX A Ohungarumlaut -30
+KPX A Omacron -30
+KPX A Oslash -30
+KPX A Otilde -30
+KPX A Q -30
+KPX A T -120
+KPX A Tcaron -120
+KPX A Tcommaaccent -120
+KPX A U -50
+KPX A Uacute -50
+KPX A Ucircumflex -50
+KPX A Udieresis -50
+KPX A Ugrave -50
+KPX A Uhungarumlaut -50
+KPX A Umacron -50
+KPX A Uogonek -50
+KPX A Uring -50
+KPX A V -70
+KPX A W -50
+KPX A Y -100
+KPX A Yacute -100
+KPX A Ydieresis -100
+KPX A u -30
+KPX A uacute -30
+KPX A ucircumflex -30
+KPX A udieresis -30
+KPX A ugrave -30
+KPX A uhungarumlaut -30
+KPX A umacron -30
+KPX A uogonek -30
+KPX A uring -30
+KPX A v -40
+KPX A w -40
+KPX A y -40
+KPX A yacute -40
+KPX A ydieresis -40
+KPX Aacute C -30
+KPX Aacute Cacute -30
+KPX Aacute Ccaron -30
+KPX Aacute Ccedilla -30
+KPX Aacute G -30
+KPX Aacute Gbreve -30
+KPX Aacute Gcommaaccent -30
+KPX Aacute O -30
+KPX Aacute Oacute -30
+KPX Aacute Ocircumflex -30
+KPX Aacute Odieresis -30
+KPX Aacute Ograve -30
+KPX Aacute Ohungarumlaut -30
+KPX Aacute Omacron -30
+KPX Aacute Oslash -30
+KPX Aacute Otilde -30
+KPX Aacute Q -30
+KPX Aacute T -120
+KPX Aacute Tcaron -120
+KPX Aacute Tcommaaccent -120
+KPX Aacute U -50
+KPX Aacute Uacute -50
+KPX Aacute Ucircumflex -50
+KPX Aacute Udieresis -50
+KPX Aacute Ugrave -50
+KPX Aacute Uhungarumlaut -50
+KPX Aacute Umacron -50
+KPX Aacute Uogonek -50
+KPX Aacute Uring -50
+KPX Aacute V -70
+KPX Aacute W -50
+KPX Aacute Y -100
+KPX Aacute Yacute -100
+KPX Aacute Ydieresis -100
+KPX Aacute u -30
+KPX Aacute uacute -30
+KPX Aacute ucircumflex -30
+KPX Aacute udieresis -30
+KPX Aacute ugrave -30
+KPX Aacute uhungarumlaut -30
+KPX Aacute umacron -30
+KPX Aacute uogonek -30
+KPX Aacute uring -30
+KPX Aacute v -40
+KPX Aacute w -40
+KPX Aacute y -40
+KPX Aacute yacute -40
+KPX Aacute ydieresis -40
+KPX Abreve C -30
+KPX Abreve Cacute -30
+KPX Abreve Ccaron -30
+KPX Abreve Ccedilla -30
+KPX Abreve G -30
+KPX Abreve Gbreve -30
+KPX Abreve Gcommaaccent -30
+KPX Abreve O -30
+KPX Abreve Oacute -30
+KPX Abreve Ocircumflex -30
+KPX Abreve Odieresis -30
+KPX Abreve Ograve -30
+KPX Abreve Ohungarumlaut -30
+KPX Abreve Omacron -30
+KPX Abreve Oslash -30
+KPX Abreve Otilde -30
+KPX Abreve Q -30
+KPX Abreve T -120
+KPX Abreve Tcaron -120
+KPX Abreve Tcommaaccent -120
+KPX Abreve U -50
+KPX Abreve Uacute -50
+KPX Abreve Ucircumflex -50
+KPX Abreve Udieresis -50
+KPX Abreve Ugrave -50
+KPX Abreve Uhungarumlaut -50
+KPX Abreve Umacron -50
+KPX Abreve Uogonek -50
+KPX Abreve Uring -50
+KPX Abreve V -70
+KPX Abreve W -50
+KPX Abreve Y -100
+KPX Abreve Yacute -100
+KPX Abreve Ydieresis -100
+KPX Abreve u -30
+KPX Abreve uacute -30
+KPX Abreve ucircumflex -30
+KPX Abreve udieresis -30
+KPX Abreve ugrave -30
+KPX Abreve uhungarumlaut -30
+KPX Abreve umacron -30
+KPX Abreve uogonek -30
+KPX Abreve uring -30
+KPX Abreve v -40
+KPX Abreve w -40
+KPX Abreve y -40
+KPX Abreve yacute -40
+KPX Abreve ydieresis -40
+KPX Acircumflex C -30
+KPX Acircumflex Cacute -30
+KPX Acircumflex Ccaron -30
+KPX Acircumflex Ccedilla -30
+KPX Acircumflex G -30
+KPX Acircumflex Gbreve -30
+KPX Acircumflex Gcommaaccent -30
+KPX Acircumflex O -30
+KPX Acircumflex Oacute -30
+KPX Acircumflex Ocircumflex -30
+KPX Acircumflex Odieresis -30
+KPX Acircumflex Ograve -30
+KPX Acircumflex Ohungarumlaut -30
+KPX Acircumflex Omacron -30
+KPX Acircumflex Oslash -30
+KPX Acircumflex Otilde -30
+KPX Acircumflex Q -30
+KPX Acircumflex T -120
+KPX Acircumflex Tcaron -120
+KPX Acircumflex Tcommaaccent -120
+KPX Acircumflex U -50
+KPX Acircumflex Uacute -50
+KPX Acircumflex Ucircumflex -50
+KPX Acircumflex Udieresis -50
+KPX Acircumflex Ugrave -50
+KPX Acircumflex Uhungarumlaut -50
+KPX Acircumflex Umacron -50
+KPX Acircumflex Uogonek -50
+KPX Acircumflex Uring -50
+KPX Acircumflex V -70
+KPX Acircumflex W -50
+KPX Acircumflex Y -100
+KPX Acircumflex Yacute -100
+KPX Acircumflex Ydieresis -100
+KPX Acircumflex u -30
+KPX Acircumflex uacute -30
+KPX Acircumflex ucircumflex -30
+KPX Acircumflex udieresis -30
+KPX Acircumflex ugrave -30
+KPX Acircumflex uhungarumlaut -30
+KPX Acircumflex umacron -30
+KPX Acircumflex uogonek -30
+KPX Acircumflex uring -30
+KPX Acircumflex v -40
+KPX Acircumflex w -40
+KPX Acircumflex y -40
+KPX Acircumflex yacute -40
+KPX Acircumflex ydieresis -40
+KPX Adieresis C -30
+KPX Adieresis Cacute -30
+KPX Adieresis Ccaron -30
+KPX Adieresis Ccedilla -30
+KPX Adieresis G -30
+KPX Adieresis Gbreve -30
+KPX Adieresis Gcommaaccent -30
+KPX Adieresis O -30
+KPX Adieresis Oacute -30
+KPX Adieresis Ocircumflex -30
+KPX Adieresis Odieresis -30
+KPX Adieresis Ograve -30
+KPX Adieresis Ohungarumlaut -30
+KPX Adieresis Omacron -30
+KPX Adieresis Oslash -30
+KPX Adieresis Otilde -30
+KPX Adieresis Q -30
+KPX Adieresis T -120
+KPX Adieresis Tcaron -120
+KPX Adieresis Tcommaaccent -120
+KPX Adieresis U -50
+KPX Adieresis Uacute -50
+KPX Adieresis Ucircumflex -50
+KPX Adieresis Udieresis -50
+KPX Adieresis Ugrave -50
+KPX Adieresis Uhungarumlaut -50
+KPX Adieresis Umacron -50
+KPX Adieresis Uogonek -50
+KPX Adieresis Uring -50
+KPX Adieresis V -70
+KPX Adieresis W -50
+KPX Adieresis Y -100
+KPX Adieresis Yacute -100
+KPX Adieresis Ydieresis -100
+KPX Adieresis u -30
+KPX Adieresis uacute -30
+KPX Adieresis ucircumflex -30
+KPX Adieresis udieresis -30
+KPX Adieresis ugrave -30
+KPX Adieresis uhungarumlaut -30
+KPX Adieresis umacron -30
+KPX Adieresis uogonek -30
+KPX Adieresis uring -30
+KPX Adieresis v -40
+KPX Adieresis w -40
+KPX Adieresis y -40
+KPX Adieresis yacute -40
+KPX Adieresis ydieresis -40
+KPX Agrave C -30
+KPX Agrave Cacute -30
+KPX Agrave Ccaron -30
+KPX Agrave Ccedilla -30
+KPX Agrave G -30
+KPX Agrave Gbreve -30
+KPX Agrave Gcommaaccent -30
+KPX Agrave O -30
+KPX Agrave Oacute -30
+KPX Agrave Ocircumflex -30
+KPX Agrave Odieresis -30
+KPX Agrave Ograve -30
+KPX Agrave Ohungarumlaut -30
+KPX Agrave Omacron -30
+KPX Agrave Oslash -30
+KPX Agrave Otilde -30
+KPX Agrave Q -30
+KPX Agrave T -120
+KPX Agrave Tcaron -120
+KPX Agrave Tcommaaccent -120
+KPX Agrave U -50
+KPX Agrave Uacute -50
+KPX Agrave Ucircumflex -50
+KPX Agrave Udieresis -50
+KPX Agrave Ugrave -50
+KPX Agrave Uhungarumlaut -50
+KPX Agrave Umacron -50
+KPX Agrave Uogonek -50
+KPX Agrave Uring -50
+KPX Agrave V -70
+KPX Agrave W -50
+KPX Agrave Y -100
+KPX Agrave Yacute -100
+KPX Agrave Ydieresis -100
+KPX Agrave u -30
+KPX Agrave uacute -30
+KPX Agrave ucircumflex -30
+KPX Agrave udieresis -30
+KPX Agrave ugrave -30
+KPX Agrave uhungarumlaut -30
+KPX Agrave umacron -30
+KPX Agrave uogonek -30
+KPX Agrave uring -30
+KPX Agrave v -40
+KPX Agrave w -40
+KPX Agrave y -40
+KPX Agrave yacute -40
+KPX Agrave ydieresis -40
+KPX Amacron C -30
+KPX Amacron Cacute -30
+KPX Amacron Ccaron -30
+KPX Amacron Ccedilla -30
+KPX Amacron G -30
+KPX Amacron Gbreve -30
+KPX Amacron Gcommaaccent -30
+KPX Amacron O -30
+KPX Amacron Oacute -30
+KPX Amacron Ocircumflex -30
+KPX Amacron Odieresis -30
+KPX Amacron Ograve -30
+KPX Amacron Ohungarumlaut -30
+KPX Amacron Omacron -30
+KPX Amacron Oslash -30
+KPX Amacron Otilde -30
+KPX Amacron Q -30
+KPX Amacron T -120
+KPX Amacron Tcaron -120
+KPX Amacron Tcommaaccent -120
+KPX Amacron U -50
+KPX Amacron Uacute -50
+KPX Amacron Ucircumflex -50
+KPX Amacron Udieresis -50
+KPX Amacron Ugrave -50
+KPX Amacron Uhungarumlaut -50
+KPX Amacron Umacron -50
+KPX Amacron Uogonek -50
+KPX Amacron Uring -50
+KPX Amacron V -70
+KPX Amacron W -50
+KPX Amacron Y -100
+KPX Amacron Yacute -100
+KPX Amacron Ydieresis -100
+KPX Amacron u -30
+KPX Amacron uacute -30
+KPX Amacron ucircumflex -30
+KPX Amacron udieresis -30
+KPX Amacron ugrave -30
+KPX Amacron uhungarumlaut -30
+KPX Amacron umacron -30
+KPX Amacron uogonek -30
+KPX Amacron uring -30
+KPX Amacron v -40
+KPX Amacron w -40
+KPX Amacron y -40
+KPX Amacron yacute -40
+KPX Amacron ydieresis -40
+KPX Aogonek C -30
+KPX Aogonek Cacute -30
+KPX Aogonek Ccaron -30
+KPX Aogonek Ccedilla -30
+KPX Aogonek G -30
+KPX Aogonek Gbreve -30
+KPX Aogonek Gcommaaccent -30
+KPX Aogonek O -30
+KPX Aogonek Oacute -30
+KPX Aogonek Ocircumflex -30
+KPX Aogonek Odieresis -30
+KPX Aogonek Ograve -30
+KPX Aogonek Ohungarumlaut -30
+KPX Aogonek Omacron -30
+KPX Aogonek Oslash -30
+KPX Aogonek Otilde -30
+KPX Aogonek Q -30
+KPX Aogonek T -120
+KPX Aogonek Tcaron -120
+KPX Aogonek Tcommaaccent -120
+KPX Aogonek U -50
+KPX Aogonek Uacute -50
+KPX Aogonek Ucircumflex -50
+KPX Aogonek Udieresis -50
+KPX Aogonek Ugrave -50
+KPX Aogonek Uhungarumlaut -50
+KPX Aogonek Umacron -50
+KPX Aogonek Uogonek -50
+KPX Aogonek Uring -50
+KPX Aogonek V -70
+KPX Aogonek W -50
+KPX Aogonek Y -100
+KPX Aogonek Yacute -100
+KPX Aogonek Ydieresis -100
+KPX Aogonek u -30
+KPX Aogonek uacute -30
+KPX Aogonek ucircumflex -30
+KPX Aogonek udieresis -30
+KPX Aogonek ugrave -30
+KPX Aogonek uhungarumlaut -30
+KPX Aogonek umacron -30
+KPX Aogonek uogonek -30
+KPX Aogonek uring -30
+KPX Aogonek v -40
+KPX Aogonek w -40
+KPX Aogonek y -40
+KPX Aogonek yacute -40
+KPX Aogonek ydieresis -40
+KPX Aring C -30
+KPX Aring Cacute -30
+KPX Aring Ccaron -30
+KPX Aring Ccedilla -30
+KPX Aring G -30
+KPX Aring Gbreve -30
+KPX Aring Gcommaaccent -30
+KPX Aring O -30
+KPX Aring Oacute -30
+KPX Aring Ocircumflex -30
+KPX Aring Odieresis -30
+KPX Aring Ograve -30
+KPX Aring Ohungarumlaut -30
+KPX Aring Omacron -30
+KPX Aring Oslash -30
+KPX Aring Otilde -30
+KPX Aring Q -30
+KPX Aring T -120
+KPX Aring Tcaron -120
+KPX Aring Tcommaaccent -120
+KPX Aring U -50
+KPX Aring Uacute -50
+KPX Aring Ucircumflex -50
+KPX Aring Udieresis -50
+KPX Aring Ugrave -50
+KPX Aring Uhungarumlaut -50
+KPX Aring Umacron -50
+KPX Aring Uogonek -50
+KPX Aring Uring -50
+KPX Aring V -70
+KPX Aring W -50
+KPX Aring Y -100
+KPX Aring Yacute -100
+KPX Aring Ydieresis -100
+KPX Aring u -30
+KPX Aring uacute -30
+KPX Aring ucircumflex -30
+KPX Aring udieresis -30
+KPX Aring ugrave -30
+KPX Aring uhungarumlaut -30
+KPX Aring umacron -30
+KPX Aring uogonek -30
+KPX Aring uring -30
+KPX Aring v -40
+KPX Aring w -40
+KPX Aring y -40
+KPX Aring yacute -40
+KPX Aring ydieresis -40
+KPX Atilde C -30
+KPX Atilde Cacute -30
+KPX Atilde Ccaron -30
+KPX Atilde Ccedilla -30
+KPX Atilde G -30
+KPX Atilde Gbreve -30
+KPX Atilde Gcommaaccent -30
+KPX Atilde O -30
+KPX Atilde Oacute -30
+KPX Atilde Ocircumflex -30
+KPX Atilde Odieresis -30
+KPX Atilde Ograve -30
+KPX Atilde Ohungarumlaut -30
+KPX Atilde Omacron -30
+KPX Atilde Oslash -30
+KPX Atilde Otilde -30
+KPX Atilde Q -30
+KPX Atilde T -120
+KPX Atilde Tcaron -120
+KPX Atilde Tcommaaccent -120
+KPX Atilde U -50
+KPX Atilde Uacute -50
+KPX Atilde Ucircumflex -50
+KPX Atilde Udieresis -50
+KPX Atilde Ugrave -50
+KPX Atilde Uhungarumlaut -50
+KPX Atilde Umacron -50
+KPX Atilde Uogonek -50
+KPX Atilde Uring -50
+KPX Atilde V -70
+KPX Atilde W -50
+KPX Atilde Y -100
+KPX Atilde Yacute -100
+KPX Atilde Ydieresis -100
+KPX Atilde u -30
+KPX Atilde uacute -30
+KPX Atilde ucircumflex -30
+KPX Atilde udieresis -30
+KPX Atilde ugrave -30
+KPX Atilde uhungarumlaut -30
+KPX Atilde umacron -30
+KPX Atilde uogonek -30
+KPX Atilde uring -30
+KPX Atilde v -40
+KPX Atilde w -40
+KPX Atilde y -40
+KPX Atilde yacute -40
+KPX Atilde ydieresis -40
+KPX B U -10
+KPX B Uacute -10
+KPX B Ucircumflex -10
+KPX B Udieresis -10
+KPX B Ugrave -10
+KPX B Uhungarumlaut -10
+KPX B Umacron -10
+KPX B Uogonek -10
+KPX B Uring -10
+KPX B comma -20
+KPX B period -20
+KPX C comma -30
+KPX C period -30
+KPX Cacute comma -30
+KPX Cacute period -30
+KPX Ccaron comma -30
+KPX Ccaron period -30
+KPX Ccedilla comma -30
+KPX Ccedilla period -30
+KPX D A -40
+KPX D Aacute -40
+KPX D Abreve -40
+KPX D Acircumflex -40
+KPX D Adieresis -40
+KPX D Agrave -40
+KPX D Amacron -40
+KPX D Aogonek -40
+KPX D Aring -40
+KPX D Atilde -40
+KPX D V -70
+KPX D W -40
+KPX D Y -90
+KPX D Yacute -90
+KPX D Ydieresis -90
+KPX D comma -70
+KPX D period -70
+KPX Dcaron A -40
+KPX Dcaron Aacute -40
+KPX Dcaron Abreve -40
+KPX Dcaron Acircumflex -40
+KPX Dcaron Adieresis -40
+KPX Dcaron Agrave -40
+KPX Dcaron Amacron -40
+KPX Dcaron Aogonek -40
+KPX Dcaron Aring -40
+KPX Dcaron Atilde -40
+KPX Dcaron V -70
+KPX Dcaron W -40
+KPX Dcaron Y -90
+KPX Dcaron Yacute -90
+KPX Dcaron Ydieresis -90
+KPX Dcaron comma -70
+KPX Dcaron period -70
+KPX Dcroat A -40
+KPX Dcroat Aacute -40
+KPX Dcroat Abreve -40
+KPX Dcroat Acircumflex -40
+KPX Dcroat Adieresis -40
+KPX Dcroat Agrave -40
+KPX Dcroat Amacron -40
+KPX Dcroat Aogonek -40
+KPX Dcroat Aring -40
+KPX Dcroat Atilde -40
+KPX Dcroat V -70
+KPX Dcroat W -40
+KPX Dcroat Y -90
+KPX Dcroat Yacute -90
+KPX Dcroat Ydieresis -90
+KPX Dcroat comma -70
+KPX Dcroat period -70
+KPX F A -80
+KPX F Aacute -80
+KPX F Abreve -80
+KPX F Acircumflex -80
+KPX F Adieresis -80
+KPX F Agrave -80
+KPX F Amacron -80
+KPX F Aogonek -80
+KPX F Aring -80
+KPX F Atilde -80
+KPX F a -50
+KPX F aacute -50
+KPX F abreve -50
+KPX F acircumflex -50
+KPX F adieresis -50
+KPX F agrave -50
+KPX F amacron -50
+KPX F aogonek -50
+KPX F aring -50
+KPX F atilde -50
+KPX F comma -150
+KPX F e -30
+KPX F eacute -30
+KPX F ecaron -30
+KPX F ecircumflex -30
+KPX F edieresis -30
+KPX F edotaccent -30
+KPX F egrave -30
+KPX F emacron -30
+KPX F eogonek -30
+KPX F o -30
+KPX F oacute -30
+KPX F ocircumflex -30
+KPX F odieresis -30
+KPX F ograve -30
+KPX F ohungarumlaut -30
+KPX F omacron -30
+KPX F oslash -30
+KPX F otilde -30
+KPX F period -150
+KPX F r -45
+KPX F racute -45
+KPX F rcaron -45
+KPX F rcommaaccent -45
+KPX J A -20
+KPX J Aacute -20
+KPX J Abreve -20
+KPX J Acircumflex -20
+KPX J Adieresis -20
+KPX J Agrave -20
+KPX J Amacron -20
+KPX J Aogonek -20
+KPX J Aring -20
+KPX J Atilde -20
+KPX J a -20
+KPX J aacute -20
+KPX J abreve -20
+KPX J acircumflex -20
+KPX J adieresis -20
+KPX J agrave -20
+KPX J amacron -20
+KPX J aogonek -20
+KPX J aring -20
+KPX J atilde -20
+KPX J comma -30
+KPX J period -30
+KPX J u -20
+KPX J uacute -20
+KPX J ucircumflex -20
+KPX J udieresis -20
+KPX J ugrave -20
+KPX J uhungarumlaut -20
+KPX J umacron -20
+KPX J uogonek -20
+KPX J uring -20
+KPX K O -50
+KPX K Oacute -50
+KPX K Ocircumflex -50
+KPX K Odieresis -50
+KPX K Ograve -50
+KPX K Ohungarumlaut -50
+KPX K Omacron -50
+KPX K Oslash -50
+KPX K Otilde -50
+KPX K e -40
+KPX K eacute -40
+KPX K ecaron -40
+KPX K ecircumflex -40
+KPX K edieresis -40
+KPX K edotaccent -40
+KPX K egrave -40
+KPX K emacron -40
+KPX K eogonek -40
+KPX K o -40
+KPX K oacute -40
+KPX K ocircumflex -40
+KPX K odieresis -40
+KPX K ograve -40
+KPX K ohungarumlaut -40
+KPX K omacron -40
+KPX K oslash -40
+KPX K otilde -40
+KPX K u -30
+KPX K uacute -30
+KPX K ucircumflex -30
+KPX K udieresis -30
+KPX K ugrave -30
+KPX K uhungarumlaut -30
+KPX K umacron -30
+KPX K uogonek -30
+KPX K uring -30
+KPX K y -50
+KPX K yacute -50
+KPX K ydieresis -50
+KPX Kcommaaccent O -50
+KPX Kcommaaccent Oacute -50
+KPX Kcommaaccent Ocircumflex -50
+KPX Kcommaaccent Odieresis -50
+KPX Kcommaaccent Ograve -50
+KPX Kcommaaccent Ohungarumlaut -50
+KPX Kcommaaccent Omacron -50
+KPX Kcommaaccent Oslash -50
+KPX Kcommaaccent Otilde -50
+KPX Kcommaaccent e -40
+KPX Kcommaaccent eacute -40
+KPX Kcommaaccent ecaron -40
+KPX Kcommaaccent ecircumflex -40
+KPX Kcommaaccent edieresis -40
+KPX Kcommaaccent edotaccent -40
+KPX Kcommaaccent egrave -40
+KPX Kcommaaccent emacron -40
+KPX Kcommaaccent eogonek -40
+KPX Kcommaaccent o -40
+KPX Kcommaaccent oacute -40
+KPX Kcommaaccent ocircumflex -40
+KPX Kcommaaccent odieresis -40
+KPX Kcommaaccent ograve -40
+KPX Kcommaaccent ohungarumlaut -40
+KPX Kcommaaccent omacron -40
+KPX Kcommaaccent oslash -40
+KPX Kcommaaccent otilde -40
+KPX Kcommaaccent u -30
+KPX Kcommaaccent uacute -30
+KPX Kcommaaccent ucircumflex -30
+KPX Kcommaaccent udieresis -30
+KPX Kcommaaccent ugrave -30
+KPX Kcommaaccent uhungarumlaut -30
+KPX Kcommaaccent umacron -30
+KPX Kcommaaccent uogonek -30
+KPX Kcommaaccent uring -30
+KPX Kcommaaccent y -50
+KPX Kcommaaccent yacute -50
+KPX Kcommaaccent ydieresis -50
+KPX L T -110
+KPX L Tcaron -110
+KPX L Tcommaaccent -110
+KPX L V -110
+KPX L W -70
+KPX L Y -140
+KPX L Yacute -140
+KPX L Ydieresis -140
+KPX L quotedblright -140
+KPX L quoteright -160
+KPX L y -30
+KPX L yacute -30
+KPX L ydieresis -30
+KPX Lacute T -110
+KPX Lacute Tcaron -110
+KPX Lacute Tcommaaccent -110
+KPX Lacute V -110
+KPX Lacute W -70
+KPX Lacute Y -140
+KPX Lacute Yacute -140
+KPX Lacute Ydieresis -140
+KPX Lacute quotedblright -140
+KPX Lacute quoteright -160
+KPX Lacute y -30
+KPX Lacute yacute -30
+KPX Lacute ydieresis -30
+KPX Lcaron T -110
+KPX Lcaron Tcaron -110
+KPX Lcaron Tcommaaccent -110
+KPX Lcaron V -110
+KPX Lcaron W -70
+KPX Lcaron Y -140
+KPX Lcaron Yacute -140
+KPX Lcaron Ydieresis -140
+KPX Lcaron quotedblright -140
+KPX Lcaron quoteright -160
+KPX Lcaron y -30
+KPX Lcaron yacute -30
+KPX Lcaron ydieresis -30
+KPX Lcommaaccent T -110
+KPX Lcommaaccent Tcaron -110
+KPX Lcommaaccent Tcommaaccent -110
+KPX Lcommaaccent V -110
+KPX Lcommaaccent W -70
+KPX Lcommaaccent Y -140
+KPX Lcommaaccent Yacute -140
+KPX Lcommaaccent Ydieresis -140
+KPX Lcommaaccent quotedblright -140
+KPX Lcommaaccent quoteright -160
+KPX Lcommaaccent y -30
+KPX Lcommaaccent yacute -30
+KPX Lcommaaccent ydieresis -30
+KPX Lslash T -110
+KPX Lslash Tcaron -110
+KPX Lslash Tcommaaccent -110
+KPX Lslash V -110
+KPX Lslash W -70
+KPX Lslash Y -140
+KPX Lslash Yacute -140
+KPX Lslash Ydieresis -140
+KPX Lslash quotedblright -140
+KPX Lslash quoteright -160
+KPX Lslash y -30
+KPX Lslash yacute -30
+KPX Lslash ydieresis -30
+KPX O A -20
+KPX O Aacute -20
+KPX O Abreve -20
+KPX O Acircumflex -20
+KPX O Adieresis -20
+KPX O Agrave -20
+KPX O Amacron -20
+KPX O Aogonek -20
+KPX O Aring -20
+KPX O Atilde -20
+KPX O T -40
+KPX O Tcaron -40
+KPX O Tcommaaccent -40
+KPX O V -50
+KPX O W -30
+KPX O X -60
+KPX O Y -70
+KPX O Yacute -70
+KPX O Ydieresis -70
+KPX O comma -40
+KPX O period -40
+KPX Oacute A -20
+KPX Oacute Aacute -20
+KPX Oacute Abreve -20
+KPX Oacute Acircumflex -20
+KPX Oacute Adieresis -20
+KPX Oacute Agrave -20
+KPX Oacute Amacron -20
+KPX Oacute Aogonek -20
+KPX Oacute Aring -20
+KPX Oacute Atilde -20
+KPX Oacute T -40
+KPX Oacute Tcaron -40
+KPX Oacute Tcommaaccent -40
+KPX Oacute V -50
+KPX Oacute W -30
+KPX Oacute X -60
+KPX Oacute Y -70
+KPX Oacute Yacute -70
+KPX Oacute Ydieresis -70
+KPX Oacute comma -40
+KPX Oacute period -40
+KPX Ocircumflex A -20
+KPX Ocircumflex Aacute -20
+KPX Ocircumflex Abreve -20
+KPX Ocircumflex Acircumflex -20
+KPX Ocircumflex Adieresis -20
+KPX Ocircumflex Agrave -20
+KPX Ocircumflex Amacron -20
+KPX Ocircumflex Aogonek -20
+KPX Ocircumflex Aring -20
+KPX Ocircumflex Atilde -20
+KPX Ocircumflex T -40
+KPX Ocircumflex Tcaron -40
+KPX Ocircumflex Tcommaaccent -40
+KPX Ocircumflex V -50
+KPX Ocircumflex W -30
+KPX Ocircumflex X -60
+KPX Ocircumflex Y -70
+KPX Ocircumflex Yacute -70
+KPX Ocircumflex Ydieresis -70
+KPX Ocircumflex comma -40
+KPX Ocircumflex period -40
+KPX Odieresis A -20
+KPX Odieresis Aacute -20
+KPX Odieresis Abreve -20
+KPX Odieresis Acircumflex -20
+KPX Odieresis Adieresis -20
+KPX Odieresis Agrave -20
+KPX Odieresis Amacron -20
+KPX Odieresis Aogonek -20
+KPX Odieresis Aring -20
+KPX Odieresis Atilde -20
+KPX Odieresis T -40
+KPX Odieresis Tcaron -40
+KPX Odieresis Tcommaaccent -40
+KPX Odieresis V -50
+KPX Odieresis W -30
+KPX Odieresis X -60
+KPX Odieresis Y -70
+KPX Odieresis Yacute -70
+KPX Odieresis Ydieresis -70
+KPX Odieresis comma -40
+KPX Odieresis period -40
+KPX Ograve A -20
+KPX Ograve Aacute -20
+KPX Ograve Abreve -20
+KPX Ograve Acircumflex -20
+KPX Ograve Adieresis -20
+KPX Ograve Agrave -20
+KPX Ograve Amacron -20
+KPX Ograve Aogonek -20
+KPX Ograve Aring -20
+KPX Ograve Atilde -20
+KPX Ograve T -40
+KPX Ograve Tcaron -40
+KPX Ograve Tcommaaccent -40
+KPX Ograve V -50
+KPX Ograve W -30
+KPX Ograve X -60
+KPX Ograve Y -70
+KPX Ograve Yacute -70
+KPX Ograve Ydieresis -70
+KPX Ograve comma -40
+KPX Ograve period -40
+KPX Ohungarumlaut A -20
+KPX Ohungarumlaut Aacute -20
+KPX Ohungarumlaut Abreve -20
+KPX Ohungarumlaut Acircumflex -20
+KPX Ohungarumlaut Adieresis -20
+KPX Ohungarumlaut Agrave -20
+KPX Ohungarumlaut Amacron -20
+KPX Ohungarumlaut Aogonek -20
+KPX Ohungarumlaut Aring -20
+KPX Ohungarumlaut Atilde -20
+KPX Ohungarumlaut T -40
+KPX Ohungarumlaut Tcaron -40
+KPX Ohungarumlaut Tcommaaccent -40
+KPX Ohungarumlaut V -50
+KPX Ohungarumlaut W -30
+KPX Ohungarumlaut X -60
+KPX Ohungarumlaut Y -70
+KPX Ohungarumlaut Yacute -70
+KPX Ohungarumlaut Ydieresis -70
+KPX Ohungarumlaut comma -40
+KPX Ohungarumlaut period -40
+KPX Omacron A -20
+KPX Omacron Aacute -20
+KPX Omacron Abreve -20
+KPX Omacron Acircumflex -20
+KPX Omacron Adieresis -20
+KPX Omacron Agrave -20
+KPX Omacron Amacron -20
+KPX Omacron Aogonek -20
+KPX Omacron Aring -20
+KPX Omacron Atilde -20
+KPX Omacron T -40
+KPX Omacron Tcaron -40
+KPX Omacron Tcommaaccent -40
+KPX Omacron V -50
+KPX Omacron W -30
+KPX Omacron X -60
+KPX Omacron Y -70
+KPX Omacron Yacute -70
+KPX Omacron Ydieresis -70
+KPX Omacron comma -40
+KPX Omacron period -40
+KPX Oslash A -20
+KPX Oslash Aacute -20
+KPX Oslash Abreve -20
+KPX Oslash Acircumflex -20
+KPX Oslash Adieresis -20
+KPX Oslash Agrave -20
+KPX Oslash Amacron -20
+KPX Oslash Aogonek -20
+KPX Oslash Aring -20
+KPX Oslash Atilde -20
+KPX Oslash T -40
+KPX Oslash Tcaron -40
+KPX Oslash Tcommaaccent -40
+KPX Oslash V -50
+KPX Oslash W -30
+KPX Oslash X -60
+KPX Oslash Y -70
+KPX Oslash Yacute -70
+KPX Oslash Ydieresis -70
+KPX Oslash comma -40
+KPX Oslash period -40
+KPX Otilde A -20
+KPX Otilde Aacute -20
+KPX Otilde Abreve -20
+KPX Otilde Acircumflex -20
+KPX Otilde Adieresis -20
+KPX Otilde Agrave -20
+KPX Otilde Amacron -20
+KPX Otilde Aogonek -20
+KPX Otilde Aring -20
+KPX Otilde Atilde -20
+KPX Otilde T -40
+KPX Otilde Tcaron -40
+KPX Otilde Tcommaaccent -40
+KPX Otilde V -50
+KPX Otilde W -30
+KPX Otilde X -60
+KPX Otilde Y -70
+KPX Otilde Yacute -70
+KPX Otilde Ydieresis -70
+KPX Otilde comma -40
+KPX Otilde period -40
+KPX P A -120
+KPX P Aacute -120
+KPX P Abreve -120
+KPX P Acircumflex -120
+KPX P Adieresis -120
+KPX P Agrave -120
+KPX P Amacron -120
+KPX P Aogonek -120
+KPX P Aring -120
+KPX P Atilde -120
+KPX P a -40
+KPX P aacute -40
+KPX P abreve -40
+KPX P acircumflex -40
+KPX P adieresis -40
+KPX P agrave -40
+KPX P amacron -40
+KPX P aogonek -40
+KPX P aring -40
+KPX P atilde -40
+KPX P comma -180
+KPX P e -50
+KPX P eacute -50
+KPX P ecaron -50
+KPX P ecircumflex -50
+KPX P edieresis -50
+KPX P edotaccent -50
+KPX P egrave -50
+KPX P emacron -50
+KPX P eogonek -50
+KPX P o -50
+KPX P oacute -50
+KPX P ocircumflex -50
+KPX P odieresis -50
+KPX P ograve -50
+KPX P ohungarumlaut -50
+KPX P omacron -50
+KPX P oslash -50
+KPX P otilde -50
+KPX P period -180
+KPX Q U -10
+KPX Q Uacute -10
+KPX Q Ucircumflex -10
+KPX Q Udieresis -10
+KPX Q Ugrave -10
+KPX Q Uhungarumlaut -10
+KPX Q Umacron -10
+KPX Q Uogonek -10
+KPX Q Uring -10
+KPX R O -20
+KPX R Oacute -20
+KPX R Ocircumflex -20
+KPX R Odieresis -20
+KPX R Ograve -20
+KPX R Ohungarumlaut -20
+KPX R Omacron -20
+KPX R Oslash -20
+KPX R Otilde -20
+KPX R T -30
+KPX R Tcaron -30
+KPX R Tcommaaccent -30
+KPX R U -40
+KPX R Uacute -40
+KPX R Ucircumflex -40
+KPX R Udieresis -40
+KPX R Ugrave -40
+KPX R Uhungarumlaut -40
+KPX R Umacron -40
+KPX R Uogonek -40
+KPX R Uring -40
+KPX R V -50
+KPX R W -30
+KPX R Y -50
+KPX R Yacute -50
+KPX R Ydieresis -50
+KPX Racute O -20
+KPX Racute Oacute -20
+KPX Racute Ocircumflex -20
+KPX Racute Odieresis -20
+KPX Racute Ograve -20
+KPX Racute Ohungarumlaut -20
+KPX Racute Omacron -20
+KPX Racute Oslash -20
+KPX Racute Otilde -20
+KPX Racute T -30
+KPX Racute Tcaron -30
+KPX Racute Tcommaaccent -30
+KPX Racute U -40
+KPX Racute Uacute -40
+KPX Racute Ucircumflex -40
+KPX Racute Udieresis -40
+KPX Racute Ugrave -40
+KPX Racute Uhungarumlaut -40
+KPX Racute Umacron -40
+KPX Racute Uogonek -40
+KPX Racute Uring -40
+KPX Racute V -50
+KPX Racute W -30
+KPX Racute Y -50
+KPX Racute Yacute -50
+KPX Racute Ydieresis -50
+KPX Rcaron O -20
+KPX Rcaron Oacute -20
+KPX Rcaron Ocircumflex -20
+KPX Rcaron Odieresis -20
+KPX Rcaron Ograve -20
+KPX Rcaron Ohungarumlaut -20
+KPX Rcaron Omacron -20
+KPX Rcaron Oslash -20
+KPX Rcaron Otilde -20
+KPX Rcaron T -30
+KPX Rcaron Tcaron -30
+KPX Rcaron Tcommaaccent -30
+KPX Rcaron U -40
+KPX Rcaron Uacute -40
+KPX Rcaron Ucircumflex -40
+KPX Rcaron Udieresis -40
+KPX Rcaron Ugrave -40
+KPX Rcaron Uhungarumlaut -40
+KPX Rcaron Umacron -40
+KPX Rcaron Uogonek -40
+KPX Rcaron Uring -40
+KPX Rcaron V -50
+KPX Rcaron W -30
+KPX Rcaron Y -50
+KPX Rcaron Yacute -50
+KPX Rcaron Ydieresis -50
+KPX Rcommaaccent O -20
+KPX Rcommaaccent Oacute -20
+KPX Rcommaaccent Ocircumflex -20
+KPX Rcommaaccent Odieresis -20
+KPX Rcommaaccent Ograve -20
+KPX Rcommaaccent Ohungarumlaut -20
+KPX Rcommaaccent Omacron -20
+KPX Rcommaaccent Oslash -20
+KPX Rcommaaccent Otilde -20
+KPX Rcommaaccent T -30
+KPX Rcommaaccent Tcaron -30
+KPX Rcommaaccent Tcommaaccent -30
+KPX Rcommaaccent U -40
+KPX Rcommaaccent Uacute -40
+KPX Rcommaaccent Ucircumflex -40
+KPX Rcommaaccent Udieresis -40
+KPX Rcommaaccent Ugrave -40
+KPX Rcommaaccent Uhungarumlaut -40
+KPX Rcommaaccent Umacron -40
+KPX Rcommaaccent Uogonek -40
+KPX Rcommaaccent Uring -40
+KPX Rcommaaccent V -50
+KPX Rcommaaccent W -30
+KPX Rcommaaccent Y -50
+KPX Rcommaaccent Yacute -50
+KPX Rcommaaccent Ydieresis -50
+KPX S comma -20
+KPX S period -20
+KPX Sacute comma -20
+KPX Sacute period -20
+KPX Scaron comma -20
+KPX Scaron period -20
+KPX Scedilla comma -20
+KPX Scedilla period -20
+KPX Scommaaccent comma -20
+KPX Scommaaccent period -20
+KPX T A -120
+KPX T Aacute -120
+KPX T Abreve -120
+KPX T Acircumflex -120
+KPX T Adieresis -120
+KPX T Agrave -120
+KPX T Amacron -120
+KPX T Aogonek -120
+KPX T Aring -120
+KPX T Atilde -120
+KPX T O -40
+KPX T Oacute -40
+KPX T Ocircumflex -40
+KPX T Odieresis -40
+KPX T Ograve -40
+KPX T Ohungarumlaut -40
+KPX T Omacron -40
+KPX T Oslash -40
+KPX T Otilde -40
+KPX T a -120
+KPX T aacute -120
+KPX T abreve -60
+KPX T acircumflex -120
+KPX T adieresis -120
+KPX T agrave -120
+KPX T amacron -60
+KPX T aogonek -120
+KPX T aring -120
+KPX T atilde -60
+KPX T colon -20
+KPX T comma -120
+KPX T e -120
+KPX T eacute -120
+KPX T ecaron -120
+KPX T ecircumflex -120
+KPX T edieresis -120
+KPX T edotaccent -120
+KPX T egrave -60
+KPX T emacron -60
+KPX T eogonek -120
+KPX T hyphen -140
+KPX T o -120
+KPX T oacute -120
+KPX T ocircumflex -120
+KPX T odieresis -120
+KPX T ograve -120
+KPX T ohungarumlaut -120
+KPX T omacron -60
+KPX T oslash -120
+KPX T otilde -60
+KPX T period -120
+KPX T r -120
+KPX T racute -120
+KPX T rcaron -120
+KPX T rcommaaccent -120
+KPX T semicolon -20
+KPX T u -120
+KPX T uacute -120
+KPX T ucircumflex -120
+KPX T udieresis -120
+KPX T ugrave -120
+KPX T uhungarumlaut -120
+KPX T umacron -60
+KPX T uogonek -120
+KPX T uring -120
+KPX T w -120
+KPX T y -120
+KPX T yacute -120
+KPX T ydieresis -60
+KPX Tcaron A -120
+KPX Tcaron Aacute -120
+KPX Tcaron Abreve -120
+KPX Tcaron Acircumflex -120
+KPX Tcaron Adieresis -120
+KPX Tcaron Agrave -120
+KPX Tcaron Amacron -120
+KPX Tcaron Aogonek -120
+KPX Tcaron Aring -120
+KPX Tcaron Atilde -120
+KPX Tcaron O -40
+KPX Tcaron Oacute -40
+KPX Tcaron Ocircumflex -40
+KPX Tcaron Odieresis -40
+KPX Tcaron Ograve -40
+KPX Tcaron Ohungarumlaut -40
+KPX Tcaron Omacron -40
+KPX Tcaron Oslash -40
+KPX Tcaron Otilde -40
+KPX Tcaron a -120
+KPX Tcaron aacute -120
+KPX Tcaron abreve -60
+KPX Tcaron acircumflex -120
+KPX Tcaron adieresis -120
+KPX Tcaron agrave -120
+KPX Tcaron amacron -60
+KPX Tcaron aogonek -120
+KPX Tcaron aring -120
+KPX Tcaron atilde -60
+KPX Tcaron colon -20
+KPX Tcaron comma -120
+KPX Tcaron e -120
+KPX Tcaron eacute -120
+KPX Tcaron ecaron -120
+KPX Tcaron ecircumflex -120
+KPX Tcaron edieresis -120
+KPX Tcaron edotaccent -120
+KPX Tcaron egrave -60
+KPX Tcaron emacron -60
+KPX Tcaron eogonek -120
+KPX Tcaron hyphen -140
+KPX Tcaron o -120
+KPX Tcaron oacute -120
+KPX Tcaron ocircumflex -120
+KPX Tcaron odieresis -120
+KPX Tcaron ograve -120
+KPX Tcaron ohungarumlaut -120
+KPX Tcaron omacron -60
+KPX Tcaron oslash -120
+KPX Tcaron otilde -60
+KPX Tcaron period -120
+KPX Tcaron r -120
+KPX Tcaron racute -120
+KPX Tcaron rcaron -120
+KPX Tcaron rcommaaccent -120
+KPX Tcaron semicolon -20
+KPX Tcaron u -120
+KPX Tcaron uacute -120
+KPX Tcaron ucircumflex -120
+KPX Tcaron udieresis -120
+KPX Tcaron ugrave -120
+KPX Tcaron uhungarumlaut -120
+KPX Tcaron umacron -60
+KPX Tcaron uogonek -120
+KPX Tcaron uring -120
+KPX Tcaron w -120
+KPX Tcaron y -120
+KPX Tcaron yacute -120
+KPX Tcaron ydieresis -60
+KPX Tcommaaccent A -120
+KPX Tcommaaccent Aacute -120
+KPX Tcommaaccent Abreve -120
+KPX Tcommaaccent Acircumflex -120
+KPX Tcommaaccent Adieresis -120
+KPX Tcommaaccent Agrave -120
+KPX Tcommaaccent Amacron -120
+KPX Tcommaaccent Aogonek -120
+KPX Tcommaaccent Aring -120
+KPX Tcommaaccent Atilde -120
+KPX Tcommaaccent O -40
+KPX Tcommaaccent Oacute -40
+KPX Tcommaaccent Ocircumflex -40
+KPX Tcommaaccent Odieresis -40
+KPX Tcommaaccent Ograve -40
+KPX Tcommaaccent Ohungarumlaut -40
+KPX Tcommaaccent Omacron -40
+KPX Tcommaaccent Oslash -40
+KPX Tcommaaccent Otilde -40
+KPX Tcommaaccent a -120
+KPX Tcommaaccent aacute -120
+KPX Tcommaaccent abreve -60
+KPX Tcommaaccent acircumflex -120
+KPX Tcommaaccent adieresis -120
+KPX Tcommaaccent agrave -120
+KPX Tcommaaccent amacron -60
+KPX Tcommaaccent aogonek -120
+KPX Tcommaaccent aring -120
+KPX Tcommaaccent atilde -60
+KPX Tcommaaccent colon -20
+KPX Tcommaaccent comma -120
+KPX Tcommaaccent e -120
+KPX Tcommaaccent eacute -120
+KPX Tcommaaccent ecaron -120
+KPX Tcommaaccent ecircumflex -120
+KPX Tcommaaccent edieresis -120
+KPX Tcommaaccent edotaccent -120
+KPX Tcommaaccent egrave -60
+KPX Tcommaaccent emacron -60
+KPX Tcommaaccent eogonek -120
+KPX Tcommaaccent hyphen -140
+KPX Tcommaaccent o -120
+KPX Tcommaaccent oacute -120
+KPX Tcommaaccent ocircumflex -120
+KPX Tcommaaccent odieresis -120
+KPX Tcommaaccent ograve -120
+KPX Tcommaaccent ohungarumlaut -120
+KPX Tcommaaccent omacron -60
+KPX Tcommaaccent oslash -120
+KPX Tcommaaccent otilde -60
+KPX Tcommaaccent period -120
+KPX Tcommaaccent r -120
+KPX Tcommaaccent racute -120
+KPX Tcommaaccent rcaron -120
+KPX Tcommaaccent rcommaaccent -120
+KPX Tcommaaccent semicolon -20
+KPX Tcommaaccent u -120
+KPX Tcommaaccent uacute -120
+KPX Tcommaaccent ucircumflex -120
+KPX Tcommaaccent udieresis -120
+KPX Tcommaaccent ugrave -120
+KPX Tcommaaccent uhungarumlaut -120
+KPX Tcommaaccent umacron -60
+KPX Tcommaaccent uogonek -120
+KPX Tcommaaccent uring -120
+KPX Tcommaaccent w -120
+KPX Tcommaaccent y -120
+KPX Tcommaaccent yacute -120
+KPX Tcommaaccent ydieresis -60
+KPX U A -40
+KPX U Aacute -40
+KPX U Abreve -40
+KPX U Acircumflex -40
+KPX U Adieresis -40
+KPX U Agrave -40
+KPX U Amacron -40
+KPX U Aogonek -40
+KPX U Aring -40
+KPX U Atilde -40
+KPX U comma -40
+KPX U period -40
+KPX Uacute A -40
+KPX Uacute Aacute -40
+KPX Uacute Abreve -40
+KPX Uacute Acircumflex -40
+KPX Uacute Adieresis -40
+KPX Uacute Agrave -40
+KPX Uacute Amacron -40
+KPX Uacute Aogonek -40
+KPX Uacute Aring -40
+KPX Uacute Atilde -40
+KPX Uacute comma -40
+KPX Uacute period -40
+KPX Ucircumflex A -40
+KPX Ucircumflex Aacute -40
+KPX Ucircumflex Abreve -40
+KPX Ucircumflex Acircumflex -40
+KPX Ucircumflex Adieresis -40
+KPX Ucircumflex Agrave -40
+KPX Ucircumflex Amacron -40
+KPX Ucircumflex Aogonek -40
+KPX Ucircumflex Aring -40
+KPX Ucircumflex Atilde -40
+KPX Ucircumflex comma -40
+KPX Ucircumflex period -40
+KPX Udieresis A -40
+KPX Udieresis Aacute -40
+KPX Udieresis Abreve -40
+KPX Udieresis Acircumflex -40
+KPX Udieresis Adieresis -40
+KPX Udieresis Agrave -40
+KPX Udieresis Amacron -40
+KPX Udieresis Aogonek -40
+KPX Udieresis Aring -40
+KPX Udieresis Atilde -40
+KPX Udieresis comma -40
+KPX Udieresis period -40
+KPX Ugrave A -40
+KPX Ugrave Aacute -40
+KPX Ugrave Abreve -40
+KPX Ugrave Acircumflex -40
+KPX Ugrave Adieresis -40
+KPX Ugrave Agrave -40
+KPX Ugrave Amacron -40
+KPX Ugrave Aogonek -40
+KPX Ugrave Aring -40
+KPX Ugrave Atilde -40
+KPX Ugrave comma -40
+KPX Ugrave period -40
+KPX Uhungarumlaut A -40
+KPX Uhungarumlaut Aacute -40
+KPX Uhungarumlaut Abreve -40
+KPX Uhungarumlaut Acircumflex -40
+KPX Uhungarumlaut Adieresis -40
+KPX Uhungarumlaut Agrave -40
+KPX Uhungarumlaut Amacron -40
+KPX Uhungarumlaut Aogonek -40
+KPX Uhungarumlaut Aring -40
+KPX Uhungarumlaut Atilde -40
+KPX Uhungarumlaut comma -40
+KPX Uhungarumlaut period -40
+KPX Umacron A -40
+KPX Umacron Aacute -40
+KPX Umacron Abreve -40
+KPX Umacron Acircumflex -40
+KPX Umacron Adieresis -40
+KPX Umacron Agrave -40
+KPX Umacron Amacron -40
+KPX Umacron Aogonek -40
+KPX Umacron Aring -40
+KPX Umacron Atilde -40
+KPX Umacron comma -40
+KPX Umacron period -40
+KPX Uogonek A -40
+KPX Uogonek Aacute -40
+KPX Uogonek Abreve -40
+KPX Uogonek Acircumflex -40
+KPX Uogonek Adieresis -40
+KPX Uogonek Agrave -40
+KPX Uogonek Amacron -40
+KPX Uogonek Aogonek -40
+KPX Uogonek Aring -40
+KPX Uogonek Atilde -40
+KPX Uogonek comma -40
+KPX Uogonek period -40
+KPX Uring A -40
+KPX Uring Aacute -40
+KPX Uring Abreve -40
+KPX Uring Acircumflex -40
+KPX Uring Adieresis -40
+KPX Uring Agrave -40
+KPX Uring Amacron -40
+KPX Uring Aogonek -40
+KPX Uring Aring -40
+KPX Uring Atilde -40
+KPX Uring comma -40
+KPX Uring period -40
+KPX V A -80
+KPX V Aacute -80
+KPX V Abreve -80
+KPX V Acircumflex -80
+KPX V Adieresis -80
+KPX V Agrave -80
+KPX V Amacron -80
+KPX V Aogonek -80
+KPX V Aring -80
+KPX V Atilde -80
+KPX V G -40
+KPX V Gbreve -40
+KPX V Gcommaaccent -40
+KPX V O -40
+KPX V Oacute -40
+KPX V Ocircumflex -40
+KPX V Odieresis -40
+KPX V Ograve -40
+KPX V Ohungarumlaut -40
+KPX V Omacron -40
+KPX V Oslash -40
+KPX V Otilde -40
+KPX V a -70
+KPX V aacute -70
+KPX V abreve -70
+KPX V acircumflex -70
+KPX V adieresis -70
+KPX V agrave -70
+KPX V amacron -70
+KPX V aogonek -70
+KPX V aring -70
+KPX V atilde -70
+KPX V colon -40
+KPX V comma -125
+KPX V e -80
+KPX V eacute -80
+KPX V ecaron -80
+KPX V ecircumflex -80
+KPX V edieresis -80
+KPX V edotaccent -80
+KPX V egrave -80
+KPX V emacron -80
+KPX V eogonek -80
+KPX V hyphen -80
+KPX V o -80
+KPX V oacute -80
+KPX V ocircumflex -80
+KPX V odieresis -80
+KPX V ograve -80
+KPX V ohungarumlaut -80
+KPX V omacron -80
+KPX V oslash -80
+KPX V otilde -80
+KPX V period -125
+KPX V semicolon -40
+KPX V u -70
+KPX V uacute -70
+KPX V ucircumflex -70
+KPX V udieresis -70
+KPX V ugrave -70
+KPX V uhungarumlaut -70
+KPX V umacron -70
+KPX V uogonek -70
+KPX V uring -70
+KPX W A -50
+KPX W Aacute -50
+KPX W Abreve -50
+KPX W Acircumflex -50
+KPX W Adieresis -50
+KPX W Agrave -50
+KPX W Amacron -50
+KPX W Aogonek -50
+KPX W Aring -50
+KPX W Atilde -50
+KPX W O -20
+KPX W Oacute -20
+KPX W Ocircumflex -20
+KPX W Odieresis -20
+KPX W Ograve -20
+KPX W Ohungarumlaut -20
+KPX W Omacron -20
+KPX W Oslash -20
+KPX W Otilde -20
+KPX W a -40
+KPX W aacute -40
+KPX W abreve -40
+KPX W acircumflex -40
+KPX W adieresis -40
+KPX W agrave -40
+KPX W amacron -40
+KPX W aogonek -40
+KPX W aring -40
+KPX W atilde -40
+KPX W comma -80
+KPX W e -30
+KPX W eacute -30
+KPX W ecaron -30
+KPX W ecircumflex -30
+KPX W edieresis -30
+KPX W edotaccent -30
+KPX W egrave -30
+KPX W emacron -30
+KPX W eogonek -30
+KPX W hyphen -40
+KPX W o -30
+KPX W oacute -30
+KPX W ocircumflex -30
+KPX W odieresis -30
+KPX W ograve -30
+KPX W ohungarumlaut -30
+KPX W omacron -30
+KPX W oslash -30
+KPX W otilde -30
+KPX W period -80
+KPX W u -30
+KPX W uacute -30
+KPX W ucircumflex -30
+KPX W udieresis -30
+KPX W ugrave -30
+KPX W uhungarumlaut -30
+KPX W umacron -30
+KPX W uogonek -30
+KPX W uring -30
+KPX W y -20
+KPX W yacute -20
+KPX W ydieresis -20
+KPX Y A -110
+KPX Y Aacute -110
+KPX Y Abreve -110
+KPX Y Acircumflex -110
+KPX Y Adieresis -110
+KPX Y Agrave -110
+KPX Y Amacron -110
+KPX Y Aogonek -110
+KPX Y Aring -110
+KPX Y Atilde -110
+KPX Y O -85
+KPX Y Oacute -85
+KPX Y Ocircumflex -85
+KPX Y Odieresis -85
+KPX Y Ograve -85
+KPX Y Ohungarumlaut -85
+KPX Y Omacron -85
+KPX Y Oslash -85
+KPX Y Otilde -85
+KPX Y a -140
+KPX Y aacute -140
+KPX Y abreve -70
+KPX Y acircumflex -140
+KPX Y adieresis -140
+KPX Y agrave -140
+KPX Y amacron -70
+KPX Y aogonek -140
+KPX Y aring -140
+KPX Y atilde -140
+KPX Y colon -60
+KPX Y comma -140
+KPX Y e -140
+KPX Y eacute -140
+KPX Y ecaron -140
+KPX Y ecircumflex -140
+KPX Y edieresis -140
+KPX Y edotaccent -140
+KPX Y egrave -140
+KPX Y emacron -70
+KPX Y eogonek -140
+KPX Y hyphen -140
+KPX Y i -20
+KPX Y iacute -20
+KPX Y iogonek -20
+KPX Y o -140
+KPX Y oacute -140
+KPX Y ocircumflex -140
+KPX Y odieresis -140
+KPX Y ograve -140
+KPX Y ohungarumlaut -140
+KPX Y omacron -140
+KPX Y oslash -140
+KPX Y otilde -140
+KPX Y period -140
+KPX Y semicolon -60
+KPX Y u -110
+KPX Y uacute -110
+KPX Y ucircumflex -110
+KPX Y udieresis -110
+KPX Y ugrave -110
+KPX Y uhungarumlaut -110
+KPX Y umacron -110
+KPX Y uogonek -110
+KPX Y uring -110
+KPX Yacute A -110
+KPX Yacute Aacute -110
+KPX Yacute Abreve -110
+KPX Yacute Acircumflex -110
+KPX Yacute Adieresis -110
+KPX Yacute Agrave -110
+KPX Yacute Amacron -110
+KPX Yacute Aogonek -110
+KPX Yacute Aring -110
+KPX Yacute Atilde -110
+KPX Yacute O -85
+KPX Yacute Oacute -85
+KPX Yacute Ocircumflex -85
+KPX Yacute Odieresis -85
+KPX Yacute Ograve -85
+KPX Yacute Ohungarumlaut -85
+KPX Yacute Omacron -85
+KPX Yacute Oslash -85
+KPX Yacute Otilde -85
+KPX Yacute a -140
+KPX Yacute aacute -140
+KPX Yacute abreve -70
+KPX Yacute acircumflex -140
+KPX Yacute adieresis -140
+KPX Yacute agrave -140
+KPX Yacute amacron -70
+KPX Yacute aogonek -140
+KPX Yacute aring -140
+KPX Yacute atilde -70
+KPX Yacute colon -60
+KPX Yacute comma -140
+KPX Yacute e -140
+KPX Yacute eacute -140
+KPX Yacute ecaron -140
+KPX Yacute ecircumflex -140
+KPX Yacute edieresis -140
+KPX Yacute edotaccent -140
+KPX Yacute egrave -140
+KPX Yacute emacron -70
+KPX Yacute eogonek -140
+KPX Yacute hyphen -140
+KPX Yacute i -20
+KPX Yacute iacute -20
+KPX Yacute iogonek -20
+KPX Yacute o -140
+KPX Yacute oacute -140
+KPX Yacute ocircumflex -140
+KPX Yacute odieresis -140
+KPX Yacute ograve -140
+KPX Yacute ohungarumlaut -140
+KPX Yacute omacron -70
+KPX Yacute oslash -140
+KPX Yacute otilde -140
+KPX Yacute period -140
+KPX Yacute semicolon -60
+KPX Yacute u -110
+KPX Yacute uacute -110
+KPX Yacute ucircumflex -110
+KPX Yacute udieresis -110
+KPX Yacute ugrave -110
+KPX Yacute uhungarumlaut -110
+KPX Yacute umacron -110
+KPX Yacute uogonek -110
+KPX Yacute uring -110
+KPX Ydieresis A -110
+KPX Ydieresis Aacute -110
+KPX Ydieresis Abreve -110
+KPX Ydieresis Acircumflex -110
+KPX Ydieresis Adieresis -110
+KPX Ydieresis Agrave -110
+KPX Ydieresis Amacron -110
+KPX Ydieresis Aogonek -110
+KPX Ydieresis Aring -110
+KPX Ydieresis Atilde -110
+KPX Ydieresis O -85
+KPX Ydieresis Oacute -85
+KPX Ydieresis Ocircumflex -85
+KPX Ydieresis Odieresis -85
+KPX Ydieresis Ograve -85
+KPX Ydieresis Ohungarumlaut -85
+KPX Ydieresis Omacron -85
+KPX Ydieresis Oslash -85
+KPX Ydieresis Otilde -85
+KPX Ydieresis a -140
+KPX Ydieresis aacute -140
+KPX Ydieresis abreve -70
+KPX Ydieresis acircumflex -140
+KPX Ydieresis adieresis -140
+KPX Ydieresis agrave -140
+KPX Ydieresis amacron -70
+KPX Ydieresis aogonek -140
+KPX Ydieresis aring -140
+KPX Ydieresis atilde -70
+KPX Ydieresis colon -60
+KPX Ydieresis comma -140
+KPX Ydieresis e -140
+KPX Ydieresis eacute -140
+KPX Ydieresis ecaron -140
+KPX Ydieresis ecircumflex -140
+KPX Ydieresis edieresis -140
+KPX Ydieresis edotaccent -140
+KPX Ydieresis egrave -140
+KPX Ydieresis emacron -70
+KPX Ydieresis eogonek -140
+KPX Ydieresis hyphen -140
+KPX Ydieresis i -20
+KPX Ydieresis iacute -20
+KPX Ydieresis iogonek -20
+KPX Ydieresis o -140
+KPX Ydieresis oacute -140
+KPX Ydieresis ocircumflex -140
+KPX Ydieresis odieresis -140
+KPX Ydieresis ograve -140
+KPX Ydieresis ohungarumlaut -140
+KPX Ydieresis omacron -140
+KPX Ydieresis oslash -140
+KPX Ydieresis otilde -140
+KPX Ydieresis period -140
+KPX Ydieresis semicolon -60
+KPX Ydieresis u -110
+KPX Ydieresis uacute -110
+KPX Ydieresis ucircumflex -110
+KPX Ydieresis udieresis -110
+KPX Ydieresis ugrave -110
+KPX Ydieresis uhungarumlaut -110
+KPX Ydieresis umacron -110
+KPX Ydieresis uogonek -110
+KPX Ydieresis uring -110
+KPX a v -20
+KPX a w -20
+KPX a y -30
+KPX a yacute -30
+KPX a ydieresis -30
+KPX aacute v -20
+KPX aacute w -20
+KPX aacute y -30
+KPX aacute yacute -30
+KPX aacute ydieresis -30
+KPX abreve v -20
+KPX abreve w -20
+KPX abreve y -30
+KPX abreve yacute -30
+KPX abreve ydieresis -30
+KPX acircumflex v -20
+KPX acircumflex w -20
+KPX acircumflex y -30
+KPX acircumflex yacute -30
+KPX acircumflex ydieresis -30
+KPX adieresis v -20
+KPX adieresis w -20
+KPX adieresis y -30
+KPX adieresis yacute -30
+KPX adieresis ydieresis -30
+KPX agrave v -20
+KPX agrave w -20
+KPX agrave y -30
+KPX agrave yacute -30
+KPX agrave ydieresis -30
+KPX amacron v -20
+KPX amacron w -20
+KPX amacron y -30
+KPX amacron yacute -30
+KPX amacron ydieresis -30
+KPX aogonek v -20
+KPX aogonek w -20
+KPX aogonek y -30
+KPX aogonek yacute -30
+KPX aogonek ydieresis -30
+KPX aring v -20
+KPX aring w -20
+KPX aring y -30
+KPX aring yacute -30
+KPX aring ydieresis -30
+KPX atilde v -20
+KPX atilde w -20
+KPX atilde y -30
+KPX atilde yacute -30
+KPX atilde ydieresis -30
+KPX b b -10
+KPX b comma -40
+KPX b l -20
+KPX b lacute -20
+KPX b lcommaaccent -20
+KPX b lslash -20
+KPX b period -40
+KPX b u -20
+KPX b uacute -20
+KPX b ucircumflex -20
+KPX b udieresis -20
+KPX b ugrave -20
+KPX b uhungarumlaut -20
+KPX b umacron -20
+KPX b uogonek -20
+KPX b uring -20
+KPX b v -20
+KPX b y -20
+KPX b yacute -20
+KPX b ydieresis -20
+KPX c comma -15
+KPX c k -20
+KPX c kcommaaccent -20
+KPX cacute comma -15
+KPX cacute k -20
+KPX cacute kcommaaccent -20
+KPX ccaron comma -15
+KPX ccaron k -20
+KPX ccaron kcommaaccent -20
+KPX ccedilla comma -15
+KPX ccedilla k -20
+KPX ccedilla kcommaaccent -20
+KPX colon space -50
+KPX comma quotedblright -100
+KPX comma quoteright -100
+KPX e comma -15
+KPX e period -15
+KPX e v -30
+KPX e w -20
+KPX e x -30
+KPX e y -20
+KPX e yacute -20
+KPX e ydieresis -20
+KPX eacute comma -15
+KPX eacute period -15
+KPX eacute v -30
+KPX eacute w -20
+KPX eacute x -30
+KPX eacute y -20
+KPX eacute yacute -20
+KPX eacute ydieresis -20
+KPX ecaron comma -15
+KPX ecaron period -15
+KPX ecaron v -30
+KPX ecaron w -20
+KPX ecaron x -30
+KPX ecaron y -20
+KPX ecaron yacute -20
+KPX ecaron ydieresis -20
+KPX ecircumflex comma -15
+KPX ecircumflex period -15
+KPX ecircumflex v -30
+KPX ecircumflex w -20
+KPX ecircumflex x -30
+KPX ecircumflex y -20
+KPX ecircumflex yacute -20
+KPX ecircumflex ydieresis -20
+KPX edieresis comma -15
+KPX edieresis period -15
+KPX edieresis v -30
+KPX edieresis w -20
+KPX edieresis x -30
+KPX edieresis y -20
+KPX edieresis yacute -20
+KPX edieresis ydieresis -20
+KPX edotaccent comma -15
+KPX edotaccent period -15
+KPX edotaccent v -30
+KPX edotaccent w -20
+KPX edotaccent x -30
+KPX edotaccent y -20
+KPX edotaccent yacute -20
+KPX edotaccent ydieresis -20
+KPX egrave comma -15
+KPX egrave period -15
+KPX egrave v -30
+KPX egrave w -20
+KPX egrave x -30
+KPX egrave y -20
+KPX egrave yacute -20
+KPX egrave ydieresis -20
+KPX emacron comma -15
+KPX emacron period -15
+KPX emacron v -30
+KPX emacron w -20
+KPX emacron x -30
+KPX emacron y -20
+KPX emacron yacute -20
+KPX emacron ydieresis -20
+KPX eogonek comma -15
+KPX eogonek period -15
+KPX eogonek v -30
+KPX eogonek w -20
+KPX eogonek x -30
+KPX eogonek y -20
+KPX eogonek yacute -20
+KPX eogonek ydieresis -20
+KPX f a -30
+KPX f aacute -30
+KPX f abreve -30
+KPX f acircumflex -30
+KPX f adieresis -30
+KPX f agrave -30
+KPX f amacron -30
+KPX f aogonek -30
+KPX f aring -30
+KPX f atilde -30
+KPX f comma -30
+KPX f dotlessi -28
+KPX f e -30
+KPX f eacute -30
+KPX f ecaron -30
+KPX f ecircumflex -30
+KPX f edieresis -30
+KPX f edotaccent -30
+KPX f egrave -30
+KPX f emacron -30
+KPX f eogonek -30
+KPX f o -30
+KPX f oacute -30
+KPX f ocircumflex -30
+KPX f odieresis -30
+KPX f ograve -30
+KPX f ohungarumlaut -30
+KPX f omacron -30
+KPX f oslash -30
+KPX f otilde -30
+KPX f period -30
+KPX f quotedblright 60
+KPX f quoteright 50
+KPX g r -10
+KPX g racute -10
+KPX g rcaron -10
+KPX g rcommaaccent -10
+KPX gbreve r -10
+KPX gbreve racute -10
+KPX gbreve rcaron -10
+KPX gbreve rcommaaccent -10
+KPX gcommaaccent r -10
+KPX gcommaaccent racute -10
+KPX gcommaaccent rcaron -10
+KPX gcommaaccent rcommaaccent -10
+KPX h y -30
+KPX h yacute -30
+KPX h ydieresis -30
+KPX k e -20
+KPX k eacute -20
+KPX k ecaron -20
+KPX k ecircumflex -20
+KPX k edieresis -20
+KPX k edotaccent -20
+KPX k egrave -20
+KPX k emacron -20
+KPX k eogonek -20
+KPX k o -20
+KPX k oacute -20
+KPX k ocircumflex -20
+KPX k odieresis -20
+KPX k ograve -20
+KPX k ohungarumlaut -20
+KPX k omacron -20
+KPX k oslash -20
+KPX k otilde -20
+KPX kcommaaccent e -20
+KPX kcommaaccent eacute -20
+KPX kcommaaccent ecaron -20
+KPX kcommaaccent ecircumflex -20
+KPX kcommaaccent edieresis -20
+KPX kcommaaccent edotaccent -20
+KPX kcommaaccent egrave -20
+KPX kcommaaccent emacron -20
+KPX kcommaaccent eogonek -20
+KPX kcommaaccent o -20
+KPX kcommaaccent oacute -20
+KPX kcommaaccent ocircumflex -20
+KPX kcommaaccent odieresis -20
+KPX kcommaaccent ograve -20
+KPX kcommaaccent ohungarumlaut -20
+KPX kcommaaccent omacron -20
+KPX kcommaaccent oslash -20
+KPX kcommaaccent otilde -20
+KPX m u -10
+KPX m uacute -10
+KPX m ucircumflex -10
+KPX m udieresis -10
+KPX m ugrave -10
+KPX m uhungarumlaut -10
+KPX m umacron -10
+KPX m uogonek -10
+KPX m uring -10
+KPX m y -15
+KPX m yacute -15
+KPX m ydieresis -15
+KPX n u -10
+KPX n uacute -10
+KPX n ucircumflex -10
+KPX n udieresis -10
+KPX n ugrave -10
+KPX n uhungarumlaut -10
+KPX n umacron -10
+KPX n uogonek -10
+KPX n uring -10
+KPX n v -20
+KPX n y -15
+KPX n yacute -15
+KPX n ydieresis -15
+KPX nacute u -10
+KPX nacute uacute -10
+KPX nacute ucircumflex -10
+KPX nacute udieresis -10
+KPX nacute ugrave -10
+KPX nacute uhungarumlaut -10
+KPX nacute umacron -10
+KPX nacute uogonek -10
+KPX nacute uring -10
+KPX nacute v -20
+KPX nacute y -15
+KPX nacute yacute -15
+KPX nacute ydieresis -15
+KPX ncaron u -10
+KPX ncaron uacute -10
+KPX ncaron ucircumflex -10
+KPX ncaron udieresis -10
+KPX ncaron ugrave -10
+KPX ncaron uhungarumlaut -10
+KPX ncaron umacron -10
+KPX ncaron uogonek -10
+KPX ncaron uring -10
+KPX ncaron v -20
+KPX ncaron y -15
+KPX ncaron yacute -15
+KPX ncaron ydieresis -15
+KPX ncommaaccent u -10
+KPX ncommaaccent uacute -10
+KPX ncommaaccent ucircumflex -10
+KPX ncommaaccent udieresis -10
+KPX ncommaaccent ugrave -10
+KPX ncommaaccent uhungarumlaut -10
+KPX ncommaaccent umacron -10
+KPX ncommaaccent uogonek -10
+KPX ncommaaccent uring -10
+KPX ncommaaccent v -20
+KPX ncommaaccent y -15
+KPX ncommaaccent yacute -15
+KPX ncommaaccent ydieresis -15
+KPX ntilde u -10
+KPX ntilde uacute -10
+KPX ntilde ucircumflex -10
+KPX ntilde udieresis -10
+KPX ntilde ugrave -10
+KPX ntilde uhungarumlaut -10
+KPX ntilde umacron -10
+KPX ntilde uogonek -10
+KPX ntilde uring -10
+KPX ntilde v -20
+KPX ntilde y -15
+KPX ntilde yacute -15
+KPX ntilde ydieresis -15
+KPX o comma -40
+KPX o period -40
+KPX o v -15
+KPX o w -15
+KPX o x -30
+KPX o y -30
+KPX o yacute -30
+KPX o ydieresis -30
+KPX oacute comma -40
+KPX oacute period -40
+KPX oacute v -15
+KPX oacute w -15
+KPX oacute x -30
+KPX oacute y -30
+KPX oacute yacute -30
+KPX oacute ydieresis -30
+KPX ocircumflex comma -40
+KPX ocircumflex period -40
+KPX ocircumflex v -15
+KPX ocircumflex w -15
+KPX ocircumflex x -30
+KPX ocircumflex y -30
+KPX ocircumflex yacute -30
+KPX ocircumflex ydieresis -30
+KPX odieresis comma -40
+KPX odieresis period -40
+KPX odieresis v -15
+KPX odieresis w -15
+KPX odieresis x -30
+KPX odieresis y -30
+KPX odieresis yacute -30
+KPX odieresis ydieresis -30
+KPX ograve comma -40
+KPX ograve period -40
+KPX ograve v -15
+KPX ograve w -15
+KPX ograve x -30
+KPX ograve y -30
+KPX ograve yacute -30
+KPX ograve ydieresis -30
+KPX ohungarumlaut comma -40
+KPX ohungarumlaut period -40
+KPX ohungarumlaut v -15
+KPX ohungarumlaut w -15
+KPX ohungarumlaut x -30
+KPX ohungarumlaut y -30
+KPX ohungarumlaut yacute -30
+KPX ohungarumlaut ydieresis -30
+KPX omacron comma -40
+KPX omacron period -40
+KPX omacron v -15
+KPX omacron w -15
+KPX omacron x -30
+KPX omacron y -30
+KPX omacron yacute -30
+KPX omacron ydieresis -30
+KPX oslash a -55
+KPX oslash aacute -55
+KPX oslash abreve -55
+KPX oslash acircumflex -55
+KPX oslash adieresis -55
+KPX oslash agrave -55
+KPX oslash amacron -55
+KPX oslash aogonek -55
+KPX oslash aring -55
+KPX oslash atilde -55
+KPX oslash b -55
+KPX oslash c -55
+KPX oslash cacute -55
+KPX oslash ccaron -55
+KPX oslash ccedilla -55
+KPX oslash comma -95
+KPX oslash d -55
+KPX oslash dcroat -55
+KPX oslash e -55
+KPX oslash eacute -55
+KPX oslash ecaron -55
+KPX oslash ecircumflex -55
+KPX oslash edieresis -55
+KPX oslash edotaccent -55
+KPX oslash egrave -55
+KPX oslash emacron -55
+KPX oslash eogonek -55
+KPX oslash f -55
+KPX oslash g -55
+KPX oslash gbreve -55
+KPX oslash gcommaaccent -55
+KPX oslash h -55
+KPX oslash i -55
+KPX oslash iacute -55
+KPX oslash icircumflex -55
+KPX oslash idieresis -55
+KPX oslash igrave -55
+KPX oslash imacron -55
+KPX oslash iogonek -55
+KPX oslash j -55
+KPX oslash k -55
+KPX oslash kcommaaccent -55
+KPX oslash l -55
+KPX oslash lacute -55
+KPX oslash lcommaaccent -55
+KPX oslash lslash -55
+KPX oslash m -55
+KPX oslash n -55
+KPX oslash nacute -55
+KPX oslash ncaron -55
+KPX oslash ncommaaccent -55
+KPX oslash ntilde -55
+KPX oslash o -55
+KPX oslash oacute -55
+KPX oslash ocircumflex -55
+KPX oslash odieresis -55
+KPX oslash ograve -55
+KPX oslash ohungarumlaut -55
+KPX oslash omacron -55
+KPX oslash oslash -55
+KPX oslash otilde -55
+KPX oslash p -55
+KPX oslash period -95
+KPX oslash q -55
+KPX oslash r -55
+KPX oslash racute -55
+KPX oslash rcaron -55
+KPX oslash rcommaaccent -55
+KPX oslash s -55
+KPX oslash sacute -55
+KPX oslash scaron -55
+KPX oslash scedilla -55
+KPX oslash scommaaccent -55
+KPX oslash t -55
+KPX oslash tcommaaccent -55
+KPX oslash u -55
+KPX oslash uacute -55
+KPX oslash ucircumflex -55
+KPX oslash udieresis -55
+KPX oslash ugrave -55
+KPX oslash uhungarumlaut -55
+KPX oslash umacron -55
+KPX oslash uogonek -55
+KPX oslash uring -55
+KPX oslash v -70
+KPX oslash w -70
+KPX oslash x -85
+KPX oslash y -70
+KPX oslash yacute -70
+KPX oslash ydieresis -70
+KPX oslash z -55
+KPX oslash zacute -55
+KPX oslash zcaron -55
+KPX oslash zdotaccent -55
+KPX otilde comma -40
+KPX otilde period -40
+KPX otilde v -15
+KPX otilde w -15
+KPX otilde x -30
+KPX otilde y -30
+KPX otilde yacute -30
+KPX otilde ydieresis -30
+KPX p comma -35
+KPX p period -35
+KPX p y -30
+KPX p yacute -30
+KPX p ydieresis -30
+KPX period quotedblright -100
+KPX period quoteright -100
+KPX period space -60
+KPX quotedblright space -40
+KPX quoteleft quoteleft -57
+KPX quoteright d -50
+KPX quoteright dcroat -50
+KPX quoteright quoteright -57
+KPX quoteright r -50
+KPX quoteright racute -50
+KPX quoteright rcaron -50
+KPX quoteright rcommaaccent -50
+KPX quoteright s -50
+KPX quoteright sacute -50
+KPX quoteright scaron -50
+KPX quoteright scedilla -50
+KPX quoteright scommaaccent -50
+KPX quoteright space -70
+KPX r a -10
+KPX r aacute -10
+KPX r abreve -10
+KPX r acircumflex -10
+KPX r adieresis -10
+KPX r agrave -10
+KPX r amacron -10
+KPX r aogonek -10
+KPX r aring -10
+KPX r atilde -10
+KPX r colon 30
+KPX r comma -50
+KPX r i 15
+KPX r iacute 15
+KPX r icircumflex 15
+KPX r idieresis 15
+KPX r igrave 15
+KPX r imacron 15
+KPX r iogonek 15
+KPX r k 15
+KPX r kcommaaccent 15
+KPX r l 15
+KPX r lacute 15
+KPX r lcommaaccent 15
+KPX r lslash 15
+KPX r m 25
+KPX r n 25
+KPX r nacute 25
+KPX r ncaron 25
+KPX r ncommaaccent 25
+KPX r ntilde 25
+KPX r p 30
+KPX r period -50
+KPX r semicolon 30
+KPX r t 40
+KPX r tcommaaccent 40
+KPX r u 15
+KPX r uacute 15
+KPX r ucircumflex 15
+KPX r udieresis 15
+KPX r ugrave 15
+KPX r uhungarumlaut 15
+KPX r umacron 15
+KPX r uogonek 15
+KPX r uring 15
+KPX r v 30
+KPX r y 30
+KPX r yacute 30
+KPX r ydieresis 30
+KPX racute a -10
+KPX racute aacute -10
+KPX racute abreve -10
+KPX racute acircumflex -10
+KPX racute adieresis -10
+KPX racute agrave -10
+KPX racute amacron -10
+KPX racute aogonek -10
+KPX racute aring -10
+KPX racute atilde -10
+KPX racute colon 30
+KPX racute comma -50
+KPX racute i 15
+KPX racute iacute 15
+KPX racute icircumflex 15
+KPX racute idieresis 15
+KPX racute igrave 15
+KPX racute imacron 15
+KPX racute iogonek 15
+KPX racute k 15
+KPX racute kcommaaccent 15
+KPX racute l 15
+KPX racute lacute 15
+KPX racute lcommaaccent 15
+KPX racute lslash 15
+KPX racute m 25
+KPX racute n 25
+KPX racute nacute 25
+KPX racute ncaron 25
+KPX racute ncommaaccent 25
+KPX racute ntilde 25
+KPX racute p 30
+KPX racute period -50
+KPX racute semicolon 30
+KPX racute t 40
+KPX racute tcommaaccent 40
+KPX racute u 15
+KPX racute uacute 15
+KPX racute ucircumflex 15
+KPX racute udieresis 15
+KPX racute ugrave 15
+KPX racute uhungarumlaut 15
+KPX racute umacron 15
+KPX racute uogonek 15
+KPX racute uring 15
+KPX racute v 30
+KPX racute y 30
+KPX racute yacute 30
+KPX racute ydieresis 30
+KPX rcaron a -10
+KPX rcaron aacute -10
+KPX rcaron abreve -10
+KPX rcaron acircumflex -10
+KPX rcaron adieresis -10
+KPX rcaron agrave -10
+KPX rcaron amacron -10
+KPX rcaron aogonek -10
+KPX rcaron aring -10
+KPX rcaron atilde -10
+KPX rcaron colon 30
+KPX rcaron comma -50
+KPX rcaron i 15
+KPX rcaron iacute 15
+KPX rcaron icircumflex 15
+KPX rcaron idieresis 15
+KPX rcaron igrave 15
+KPX rcaron imacron 15
+KPX rcaron iogonek 15
+KPX rcaron k 15
+KPX rcaron kcommaaccent 15
+KPX rcaron l 15
+KPX rcaron lacute 15
+KPX rcaron lcommaaccent 15
+KPX rcaron lslash 15
+KPX rcaron m 25
+KPX rcaron n 25
+KPX rcaron nacute 25
+KPX rcaron ncaron 25
+KPX rcaron ncommaaccent 25
+KPX rcaron ntilde 25
+KPX rcaron p 30
+KPX rcaron period -50
+KPX rcaron semicolon 30
+KPX rcaron t 40
+KPX rcaron tcommaaccent 40
+KPX rcaron u 15
+KPX rcaron uacute 15
+KPX rcaron ucircumflex 15
+KPX rcaron udieresis 15
+KPX rcaron ugrave 15
+KPX rcaron uhungarumlaut 15
+KPX rcaron umacron 15
+KPX rcaron uogonek 15
+KPX rcaron uring 15
+KPX rcaron v 30
+KPX rcaron y 30
+KPX rcaron yacute 30
+KPX rcaron ydieresis 30
+KPX rcommaaccent a -10
+KPX rcommaaccent aacute -10
+KPX rcommaaccent abreve -10
+KPX rcommaaccent acircumflex -10
+KPX rcommaaccent adieresis -10
+KPX rcommaaccent agrave -10
+KPX rcommaaccent amacron -10
+KPX rcommaaccent aogonek -10
+KPX rcommaaccent aring -10
+KPX rcommaaccent atilde -10
+KPX rcommaaccent colon 30
+KPX rcommaaccent comma -50
+KPX rcommaaccent i 15
+KPX rcommaaccent iacute 15
+KPX rcommaaccent icircumflex 15
+KPX rcommaaccent idieresis 15
+KPX rcommaaccent igrave 15
+KPX rcommaaccent imacron 15
+KPX rcommaaccent iogonek 15
+KPX rcommaaccent k 15
+KPX rcommaaccent kcommaaccent 15
+KPX rcommaaccent l 15
+KPX rcommaaccent lacute 15
+KPX rcommaaccent lcommaaccent 15
+KPX rcommaaccent lslash 15
+KPX rcommaaccent m 25
+KPX rcommaaccent n 25
+KPX rcommaaccent nacute 25
+KPX rcommaaccent ncaron 25
+KPX rcommaaccent ncommaaccent 25
+KPX rcommaaccent ntilde 25
+KPX rcommaaccent p 30
+KPX rcommaaccent period -50
+KPX rcommaaccent semicolon 30
+KPX rcommaaccent t 40
+KPX rcommaaccent tcommaaccent 40
+KPX rcommaaccent u 15
+KPX rcommaaccent uacute 15
+KPX rcommaaccent ucircumflex 15
+KPX rcommaaccent udieresis 15
+KPX rcommaaccent ugrave 15
+KPX rcommaaccent uhungarumlaut 15
+KPX rcommaaccent umacron 15
+KPX rcommaaccent uogonek 15
+KPX rcommaaccent uring 15
+KPX rcommaaccent v 30
+KPX rcommaaccent y 30
+KPX rcommaaccent yacute 30
+KPX rcommaaccent ydieresis 30
+KPX s comma -15
+KPX s period -15
+KPX s w -30
+KPX sacute comma -15
+KPX sacute period -15
+KPX sacute w -30
+KPX scaron comma -15
+KPX scaron period -15
+KPX scaron w -30
+KPX scedilla comma -15
+KPX scedilla period -15
+KPX scedilla w -30
+KPX scommaaccent comma -15
+KPX scommaaccent period -15
+KPX scommaaccent w -30
+KPX semicolon space -50
+KPX space T -50
+KPX space Tcaron -50
+KPX space Tcommaaccent -50
+KPX space V -50
+KPX space W -40
+KPX space Y -90
+KPX space Yacute -90
+KPX space Ydieresis -90
+KPX space quotedblleft -30
+KPX space quoteleft -60
+KPX v a -25
+KPX v aacute -25
+KPX v abreve -25
+KPX v acircumflex -25
+KPX v adieresis -25
+KPX v agrave -25
+KPX v amacron -25
+KPX v aogonek -25
+KPX v aring -25
+KPX v atilde -25
+KPX v comma -80
+KPX v e -25
+KPX v eacute -25
+KPX v ecaron -25
+KPX v ecircumflex -25
+KPX v edieresis -25
+KPX v edotaccent -25
+KPX v egrave -25
+KPX v emacron -25
+KPX v eogonek -25
+KPX v o -25
+KPX v oacute -25
+KPX v ocircumflex -25
+KPX v odieresis -25
+KPX v ograve -25
+KPX v ohungarumlaut -25
+KPX v omacron -25
+KPX v oslash -25
+KPX v otilde -25
+KPX v period -80
+KPX w a -15
+KPX w aacute -15
+KPX w abreve -15
+KPX w acircumflex -15
+KPX w adieresis -15
+KPX w agrave -15
+KPX w amacron -15
+KPX w aogonek -15
+KPX w aring -15
+KPX w atilde -15
+KPX w comma -60
+KPX w e -10
+KPX w eacute -10
+KPX w ecaron -10
+KPX w ecircumflex -10
+KPX w edieresis -10
+KPX w edotaccent -10
+KPX w egrave -10
+KPX w emacron -10
+KPX w eogonek -10
+KPX w o -10
+KPX w oacute -10
+KPX w ocircumflex -10
+KPX w odieresis -10
+KPX w ograve -10
+KPX w ohungarumlaut -10
+KPX w omacron -10
+KPX w oslash -10
+KPX w otilde -10
+KPX w period -60
+KPX x e -30
+KPX x eacute -30
+KPX x ecaron -30
+KPX x ecircumflex -30
+KPX x edieresis -30
+KPX x edotaccent -30
+KPX x egrave -30
+KPX x emacron -30
+KPX x eogonek -30
+KPX y a -20
+KPX y aacute -20
+KPX y abreve -20
+KPX y acircumflex -20
+KPX y adieresis -20
+KPX y agrave -20
+KPX y amacron -20
+KPX y aogonek -20
+KPX y aring -20
+KPX y atilde -20
+KPX y comma -100
+KPX y e -20
+KPX y eacute -20
+KPX y ecaron -20
+KPX y ecircumflex -20
+KPX y edieresis -20
+KPX y edotaccent -20
+KPX y egrave -20
+KPX y emacron -20
+KPX y eogonek -20
+KPX y o -20
+KPX y oacute -20
+KPX y ocircumflex -20
+KPX y odieresis -20
+KPX y ograve -20
+KPX y ohungarumlaut -20
+KPX y omacron -20
+KPX y oslash -20
+KPX y otilde -20
+KPX y period -100
+KPX yacute a -20
+KPX yacute aacute -20
+KPX yacute abreve -20
+KPX yacute acircumflex -20
+KPX yacute adieresis -20
+KPX yacute agrave -20
+KPX yacute amacron -20
+KPX yacute aogonek -20
+KPX yacute aring -20
+KPX yacute atilde -20
+KPX yacute comma -100
+KPX yacute e -20
+KPX yacute eacute -20
+KPX yacute ecaron -20
+KPX yacute ecircumflex -20
+KPX yacute edieresis -20
+KPX yacute edotaccent -20
+KPX yacute egrave -20
+KPX yacute emacron -20
+KPX yacute eogonek -20
+KPX yacute o -20
+KPX yacute oacute -20
+KPX yacute ocircumflex -20
+KPX yacute odieresis -20
+KPX yacute ograve -20
+KPX yacute ohungarumlaut -20
+KPX yacute omacron -20
+KPX yacute oslash -20
+KPX yacute otilde -20
+KPX yacute period -100
+KPX ydieresis a -20
+KPX ydieresis aacute -20
+KPX ydieresis abreve -20
+KPX ydieresis acircumflex -20
+KPX ydieresis adieresis -20
+KPX ydieresis agrave -20
+KPX ydieresis amacron -20
+KPX ydieresis aogonek -20
+KPX ydieresis aring -20
+KPX ydieresis atilde -20
+KPX ydieresis comma -100
+KPX ydieresis e -20
+KPX ydieresis eacute -20
+KPX ydieresis ecaron -20
+KPX ydieresis ecircumflex -20
+KPX ydieresis edieresis -20
+KPX ydieresis edotaccent -20
+KPX ydieresis egrave -20
+KPX ydieresis emacron -20
+KPX ydieresis eogonek -20
+KPX ydieresis o -20
+KPX ydieresis oacute -20
+KPX ydieresis ocircumflex -20
+KPX ydieresis odieresis -20
+KPX ydieresis ograve -20
+KPX ydieresis ohungarumlaut -20
+KPX ydieresis omacron -20
+KPX ydieresis oslash -20
+KPX ydieresis otilde -20
+KPX ydieresis period -100
+KPX z e -15
+KPX z eacute -15
+KPX z ecaron -15
+KPX z ecircumflex -15
+KPX z edieresis -15
+KPX z edotaccent -15
+KPX z egrave -15
+KPX z emacron -15
+KPX z eogonek -15
+KPX z o -15
+KPX z oacute -15
+KPX z ocircumflex -15
+KPX z odieresis -15
+KPX z ograve -15
+KPX z ohungarumlaut -15
+KPX z omacron -15
+KPX z oslash -15
+KPX z otilde -15
+KPX zacute e -15
+KPX zacute eacute -15
+KPX zacute ecaron -15
+KPX zacute ecircumflex -15
+KPX zacute edieresis -15
+KPX zacute edotaccent -15
+KPX zacute egrave -15
+KPX zacute emacron -15
+KPX zacute eogonek -15
+KPX zacute o -15
+KPX zacute oacute -15
+KPX zacute ocircumflex -15
+KPX zacute odieresis -15
+KPX zacute ograve -15
+KPX zacute ohungarumlaut -15
+KPX zacute omacron -15
+KPX zacute oslash -15
+KPX zacute otilde -15
+KPX zcaron e -15
+KPX zcaron eacute -15
+KPX zcaron ecaron -15
+KPX zcaron ecircumflex -15
+KPX zcaron edieresis -15
+KPX zcaron edotaccent -15
+KPX zcaron egrave -15
+KPX zcaron emacron -15
+KPX zcaron eogonek -15
+KPX zcaron o -15
+KPX zcaron oacute -15
+KPX zcaron ocircumflex -15
+KPX zcaron odieresis -15
+KPX zcaron ograve -15
+KPX zcaron ohungarumlaut -15
+KPX zcaron omacron -15
+KPX zcaron oslash -15
+KPX zcaron otilde -15
+KPX zdotaccent e -15
+KPX zdotaccent eacute -15
+KPX zdotaccent ecaron -15
+KPX zdotaccent ecircumflex -15
+KPX zdotaccent edieresis -15
+KPX zdotaccent edotaccent -15
+KPX zdotaccent egrave -15
+KPX zdotaccent emacron -15
+KPX zdotaccent eogonek -15
+KPX zdotaccent o -15
+KPX zdotaccent oacute -15
+KPX zdotaccent ocircumflex -15
+KPX zdotaccent odieresis -15
+KPX zdotaccent ograve -15
+KPX zdotaccent ohungarumlaut -15
+KPX zdotaccent omacron -15
+KPX zdotaccent oslash -15
+KPX zdotaccent otilde -15
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/src/fonts/Adobe-Core35_AFMs-314/ITCAvantGarde-Book.afm b/src/fonts/Adobe-Core35_AFMs-314/ITCAvantGarde-Book.afm
new file mode 100644
index 0000000..3864097
--- /dev/null
+++ b/src/fonts/Adobe-Core35_AFMs-314/ITCAvantGarde-Book.afm
@@ -0,0 +1,1266 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1985, 1987, 1989, 1990, 1991, 1992, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Thu May 1 14:01:14 1997
+Comment UniqueID 43083
+Comment VMusage 33801 44826
+FontName AvantGarde-Book
+FullName ITC Avant Garde Gothic Book
+FamilyName ITC Avant Garde Gothic
+Weight Book
+ItalicAngle 0
+IsFixedPitch false
+FontBBox -113 -222 1148 955
+UnderlinePosition -100
+UnderlineThickness 50
+Version 002.000
+Notice Copyright (c) 1985, 1987, 1989, 1990, 1991, 1992, 1997 Adobe Systems Incorporated. All Rights Reserved.ITC Avant Garde Gothic is a registered trademark of International Typeface Corporation.
+EncodingScheme AdobeStandardEncoding
+CapHeight 740
+XHeight 547
+Ascender 740
+Descender -192
+StdHW 63
+StdVW 70
+StartCharMetrics 314
+C 32 ; WX 277 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 295 ; N exclam ; B 111 0 185 740 ;
+C 34 ; WX 309 ; N quotedbl ; B 36 444 273 740 ;
+C 35 ; WX 554 ; N numbersign ; B 33 0 521 740 ;
+C 36 ; WX 554 ; N dollar ; B 70 -70 485 811 ;
+C 37 ; WX 775 ; N percent ; B 21 -13 753 751 ;
+C 38 ; WX 757 ; N ampersand ; B 56 -12 736 753 ;
+C 39 ; WX 351 ; N quoteright ; B 94 546 256 740 ;
+C 40 ; WX 369 ; N parenleft ; B 47 -205 355 757 ;
+C 41 ; WX 369 ; N parenright ; B 14 -205 322 757 ;
+C 42 ; WX 425 ; N asterisk ; B 58 446 367 740 ;
+C 43 ; WX 606 ; N plus ; B 51 0 555 506 ;
+C 44 ; WX 277 ; N comma ; B 14 -67 176 126 ;
+C 45 ; WX 332 ; N hyphen ; B 30 248 302 315 ;
+C 46 ; WX 277 ; N period ; B 102 0 176 126 ;
+C 47 ; WX 437 ; N slash ; B 44 -100 403 740 ;
+C 48 ; WX 554 ; N zero ; B 29 -13 525 753 ;
+C 49 ; WX 554 ; N one ; B 135 0 336 740 ;
+C 50 ; WX 554 ; N two ; B 40 0 514 753 ;
+C 51 ; WX 554 ; N three ; B 34 -13 506 753 ;
+C 52 ; WX 554 ; N four ; B 14 0 528 740 ;
+C 53 ; WX 554 ; N five ; B 26 -13 530 740 ;
+C 54 ; WX 554 ; N six ; B 24 -13 530 739 ;
+C 55 ; WX 554 ; N seven ; B 63 0 491 740 ;
+C 56 ; WX 554 ; N eight ; B 41 -13 513 753 ;
+C 57 ; WX 554 ; N nine ; B 24 0 530 752 ;
+C 58 ; WX 277 ; N colon ; B 102 0 176 548 ;
+C 59 ; WX 277 ; N semicolon ; B 14 -67 176 548 ;
+C 60 ; WX 606 ; N less ; B 46 -8 554 514 ;
+C 61 ; WX 606 ; N equal ; B 51 118 555 388 ;
+C 62 ; WX 606 ; N greater ; B 52 -8 560 514 ;
+C 63 ; WX 591 ; N question ; B 64 0 526 752 ;
+C 64 ; WX 867 ; N at ; B 65 -13 803 753 ;
+C 65 ; WX 740 ; N A ; B 12 0 729 740 ;
+C 66 ; WX 574 ; N B ; B 74 0 544 740 ;
+C 67 ; WX 813 ; N C ; B 43 -13 771 752 ;
+C 68 ; WX 744 ; N D ; B 74 0 699 740 ;
+C 69 ; WX 536 ; N E ; B 70 0 475 740 ;
+C 70 ; WX 485 ; N F ; B 70 0 444 740 ;
+C 71 ; WX 872 ; N G ; B 40 -13 828 753 ;
+C 72 ; WX 683 ; N H ; B 76 0 607 740 ;
+C 73 ; WX 226 ; N I ; B 76 0 150 740 ;
+C 74 ; WX 482 ; N J ; B 6 -13 402 740 ;
+C 75 ; WX 591 ; N K ; B 81 0 591 740 ;
+C 76 ; WX 462 ; N L ; B 82 0 462 740 ;
+C 77 ; WX 919 ; N M ; B 76 0 843 740 ;
+C 78 ; WX 740 ; N N ; B 75 0 664 740 ;
+C 79 ; WX 869 ; N O ; B 43 -13 826 753 ;
+C 80 ; WX 592 ; N P ; B 75 0 564 740 ;
+C 81 ; WX 871 ; N Q ; B 40 -13 837 753 ;
+C 82 ; WX 607 ; N R ; B 70 0 572 740 ;
+C 83 ; WX 498 ; N S ; B 22 -13 473 753 ;
+C 84 ; WX 426 ; N T ; B 6 0 419 740 ;
+C 85 ; WX 655 ; N U ; B 75 -13 579 740 ;
+C 86 ; WX 702 ; N V ; B 8 0 693 740 ;
+C 87 ; WX 960 ; N W ; B 11 0 950 740 ;
+C 88 ; WX 609 ; N X ; B 8 0 602 740 ;
+C 89 ; WX 592 ; N Y ; B 1 0 592 740 ;
+C 90 ; WX 480 ; N Z ; B 12 0 470 740 ;
+C 91 ; WX 351 ; N bracketleft ; B 133 -179 337 753 ;
+C 92 ; WX 605 ; N backslash ; B 118 -100 477 740 ;
+C 93 ; WX 351 ; N bracketright ; B 14 -179 218 753 ;
+C 94 ; WX 606 ; N asciicircum ; B 53 307 553 740 ;
+C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;
+C 96 ; WX 351 ; N quoteleft ; B 95 546 257 740 ;
+C 97 ; WX 683 ; N a ; B 42 -13 621 561 ;
+C 98 ; WX 682 ; N b ; B 68 -13 647 740 ;
+C 99 ; WX 647 ; N c ; B 41 -13 607 561 ;
+C 100 ; WX 685 ; N d ; B 39 -13 618 740 ;
+C 101 ; WX 650 ; N e ; B 38 -13 608 561 ;
+C 102 ; WX 314 ; N f ; B 19 0 314 753 ; L i fi ; L l fl ;
+C 103 ; WX 673 ; N g ; B 37 -215 606 561 ;
+C 104 ; WX 610 ; N h ; B 62 0 543 740 ;
+C 105 ; WX 200 ; N i ; B 65 0 135 740 ;
+C 106 ; WX 203 ; N j ; B -44 -192 137 740 ;
+C 107 ; WX 502 ; N k ; B 70 0 498 740 ;
+C 108 ; WX 200 ; N l ; B 65 0 135 740 ;
+C 109 ; WX 938 ; N m ; B 66 0 872 561 ;
+C 110 ; WX 610 ; N n ; B 65 0 546 561 ;
+C 111 ; WX 655 ; N o ; B 42 -13 614 561 ;
+C 112 ; WX 682 ; N p ; B 64 -192 643 561 ;
+C 113 ; WX 682 ; N q ; B 37 -192 616 561 ;
+C 114 ; WX 301 ; N r ; B 65 0 291 561 ;
+C 115 ; WX 388 ; N s ; B 24 -13 364 561 ;
+C 116 ; WX 339 ; N t ; B 14 0 330 740 ;
+C 117 ; WX 608 ; N u ; B 62 -13 541 547 ;
+C 118 ; WX 554 ; N v ; B 7 0 546 547 ;
+C 119 ; WX 831 ; N w ; B 13 0 820 547 ;
+C 120 ; WX 480 ; N x ; B 12 0 468 547 ;
+C 121 ; WX 536 ; N y ; B 15 -192 523 547 ;
+C 122 ; WX 425 ; N z ; B 10 0 415 547 ;
+C 123 ; WX 351 ; N braceleft ; B 70 -189 331 740 ;
+C 124 ; WX 672 ; N bar ; B 299 -222 373 778 ;
+C 125 ; WX 351 ; N braceright ; B 20 -189 281 740 ;
+C 126 ; WX 606 ; N asciitilde ; B 72 179 534 319 ;
+C 161 ; WX 295 ; N exclamdown ; B 110 -192 184 548 ;
+C 162 ; WX 554 ; N cent ; B 48 62 510 707 ;
+C 163 ; WX 554 ; N sterling ; B 4 0 552 753 ;
+C 164 ; WX 166 ; N fraction ; B -113 0 280 740 ;
+C 165 ; WX 554 ; N yen ; B 4 0 550 740 ;
+C 166 ; WX 554 ; N florin ; B -12 -153 518 818 ;
+C 167 ; WX 615 ; N section ; B 85 -141 529 753 ;
+C 168 ; WX 554 ; N currency ; B 8 42 546 580 ;
+C 169 ; WX 198 ; N quotesingle ; B 59 444 140 740 ;
+C 170 ; WX 502 ; N quotedblleft ; B 97 546 406 740 ;
+C 171 ; WX 425 ; N guillemotleft ; B 40 81 386 481 ;
+C 172 ; WX 251 ; N guilsinglleft ; B 40 81 212 481 ;
+C 173 ; WX 251 ; N guilsinglright ; B 39 81 211 481 ;
+C 174 ; WX 487 ; N fi ; B 19 0 422 753 ;
+C 175 ; WX 485 ; N fl ; B 19 0 420 753 ;
+C 177 ; WX 500 ; N endash ; B 35 248 465 315 ;
+C 178 ; WX 553 ; N dagger ; B 59 -133 493 740 ;
+C 179 ; WX 553 ; N daggerdbl ; B 59 -133 493 740 ;
+C 180 ; WX 277 ; N periodcentered ; B 102 190 176 316 ;
+C 182 ; WX 564 ; N paragraph ; B 22 -110 551 740 ;
+C 183 ; WX 606 ; N bullet ; B 150 222 455 532 ;
+C 184 ; WX 354 ; N quotesinglbase ; B 89 -68 251 126 ;
+C 185 ; WX 502 ; N quotedblbase ; B 89 -68 399 126 ;
+C 186 ; WX 484 ; N quotedblright ; B 96 546 405 740 ;
+C 187 ; WX 425 ; N guillemotright ; B 39 81 385 481 ;
+C 188 ; WX 1000 ; N ellipsis ; B 130 0 870 126 ;
+C 189 ; WX 1174 ; N perthousand ; B 25 -13 1148 751 ;
+C 191 ; WX 591 ; N questiondown ; B 65 -205 527 548 ;
+C 193 ; WX 378 ; N grave ; B 69 619 300 786 ;
+C 194 ; WX 375 ; N acute ; B 78 619 309 786 ;
+C 195 ; WX 502 ; N circumflex ; B 74 639 428 764 ;
+C 196 ; WX 439 ; N tilde ; B 47 651 392 754 ;
+C 197 ; WX 485 ; N macron ; B 73 669 411 736 ;
+C 198 ; WX 453 ; N breve ; B 52 651 401 754 ;
+C 199 ; WX 222 ; N dotaccent ; B 74 639 148 765 ;
+C 200 ; WX 369 ; N dieresis ; B 73 639 295 765 ;
+C 202 ; WX 332 ; N ring ; B 62 600 269 807 ;
+C 203 ; WX 324 ; N cedilla ; B 79 -222 254 3 ;
+C 205 ; WX 552 ; N hungarumlaut ; B 109 605 486 786 ;
+C 206 ; WX 302 ; N ogonek ; B 73 -191 228 0 ;
+C 207 ; WX 502 ; N caron ; B 68 639 423 764 ;
+C 208 ; WX 1000 ; N emdash ; B 35 248 965 315 ;
+C 225 ; WX 992 ; N AE ; B -20 0 907 740 ;
+C 227 ; WX 369 ; N ordfeminine ; B -3 407 356 753 ;
+C 232 ; WX 517 ; N Lslash ; B 59 0 517 740 ;
+C 233 ; WX 868 ; N Oslash ; B 43 -83 826 819 ;
+C 234 ; WX 1194 ; N OE ; B 45 -13 1142 753 ;
+C 235 ; WX 369 ; N ordmasculine ; B 12 407 356 753 ;
+C 241 ; WX 1157 ; N ae ; B 34 -13 1113 561 ;
+C 245 ; WX 200 ; N dotlessi ; B 65 0 135 547 ;
+C 248 ; WX 300 ; N lslash ; B 43 0 259 740 ;
+C 249 ; WX 653 ; N oslash ; B 41 -64 613 614 ;
+C 250 ; WX 1137 ; N oe ; B 34 -13 1104 561 ;
+C 251 ; WX 554 ; N germandbls ; B 61 -13 525 753 ;
+C -1 ; WX 226 ; N Idieresis ; B 2 0 224 928 ;
+C -1 ; WX 650 ; N eacute ; B 38 -13 608 786 ;
+C -1 ; WX 683 ; N abreve ; B 42 -13 621 754 ;
+C -1 ; WX 608 ; N uhungarumlaut ; B 62 -13 541 786 ;
+C -1 ; WX 650 ; N ecaron ; B 38 -13 608 764 ;
+C -1 ; WX 592 ; N Ydieresis ; B 1 0 592 928 ;
+C -1 ; WX 606 ; N divide ; B 51 -13 555 519 ;
+C -1 ; WX 592 ; N Yacute ; B 1 0 592 949 ;
+C -1 ; WX 740 ; N Acircumflex ; B 12 0 729 927 ;
+C -1 ; WX 683 ; N aacute ; B 42 -13 621 786 ;
+C -1 ; WX 655 ; N Ucircumflex ; B 75 -13 579 927 ;
+C -1 ; WX 536 ; N yacute ; B 15 -192 523 786 ;
+C -1 ; WX 388 ; N scommaaccent ; B 24 -222 364 561 ;
+C -1 ; WX 650 ; N ecircumflex ; B 38 -13 608 764 ;
+C -1 ; WX 655 ; N Uring ; B 75 -13 579 955 ;
+C -1 ; WX 655 ; N Udieresis ; B 75 -13 579 928 ;
+C -1 ; WX 683 ; N aogonek ; B 42 -191 634 561 ;
+C -1 ; WX 655 ; N Uacute ; B 75 -13 579 949 ;
+C -1 ; WX 608 ; N uogonek ; B 62 -191 558 547 ;
+C -1 ; WX 536 ; N Edieresis ; B 70 0 475 928 ;
+C -1 ; WX 790 ; N Dcroat ; B 40 0 739 740 ;
+C -1 ; WX 250 ; N commaaccent ; B 23 -222 169 -54 ;
+C -1 ; WX 747 ; N copyright ; B -9 -12 755 752 ;
+C -1 ; WX 536 ; N Emacron ; B 70 0 475 899 ;
+C -1 ; WX 647 ; N ccaron ; B 41 -13 607 764 ;
+C -1 ; WX 683 ; N aring ; B 42 -13 621 807 ;
+C -1 ; WX 740 ; N Ncommaaccent ; B 75 -202 664 740 ;
+C -1 ; WX 200 ; N lacute ; B 20 0 251 949 ;
+C -1 ; WX 683 ; N agrave ; B 42 -13 621 786 ;
+C -1 ; WX 426 ; N Tcommaaccent ; B 6 -222 419 740 ;
+C -1 ; WX 813 ; N Cacute ; B 43 -13 771 949 ;
+C -1 ; WX 683 ; N atilde ; B 42 -13 621 754 ;
+C -1 ; WX 536 ; N Edotaccent ; B 70 0 475 928 ;
+C -1 ; WX 388 ; N scaron ; B 11 -13 366 764 ;
+C -1 ; WX 388 ; N scedilla ; B 24 -222 364 561 ;
+C -1 ; WX 200 ; N iacute ; B 30 0 261 786 ;
+C -1 ; WX 471 ; N lozenge ; B 15 0 457 719 ;
+C -1 ; WX 607 ; N Rcaron ; B 70 0 572 927 ;
+C -1 ; WX 872 ; N Gcommaaccent ; B 40 -222 828 753 ;
+C -1 ; WX 608 ; N ucircumflex ; B 62 -13 541 764 ;
+C -1 ; WX 683 ; N acircumflex ; B 42 -13 621 764 ;
+C -1 ; WX 740 ; N Amacron ; B 12 0 729 899 ;
+C -1 ; WX 301 ; N rcaron ; B -3 0 352 764 ;
+C -1 ; WX 647 ; N ccedilla ; B 41 -222 607 561 ;
+C -1 ; WX 480 ; N Zdotaccent ; B 12 0 470 928 ;
+C -1 ; WX 592 ; N Thorn ; B 60 0 549 740 ;
+C -1 ; WX 869 ; N Omacron ; B 43 -13 826 899 ;
+C -1 ; WX 607 ; N Racute ; B 70 0 572 949 ;
+C -1 ; WX 498 ; N Sacute ; B 22 -13 473 949 ;
+C -1 ; WX 755 ; N dcaron ; B 39 -13 792 740 ;
+C -1 ; WX 655 ; N Umacron ; B 75 -13 579 899 ;
+C -1 ; WX 608 ; N uring ; B 62 -13 541 807 ;
+C -1 ; WX 332 ; N threesuperior ; B 18 289 318 747 ;
+C -1 ; WX 869 ; N Ograve ; B 43 -13 826 949 ;
+C -1 ; WX 740 ; N Agrave ; B 12 0 729 949 ;
+C -1 ; WX 740 ; N Abreve ; B 12 0 729 917 ;
+C -1 ; WX 606 ; N multiply ; B 74 24 533 482 ;
+C -1 ; WX 608 ; N uacute ; B 62 -13 541 786 ;
+C -1 ; WX 426 ; N Tcaron ; B 6 0 419 927 ;
+C -1 ; WX 476 ; N partialdiff ; B 22 -38 454 704 ;
+C -1 ; WX 536 ; N ydieresis ; B 15 -192 523 765 ;
+C -1 ; WX 740 ; N Nacute ; B 75 0 664 949 ;
+C -1 ; WX 200 ; N icircumflex ; B -77 0 277 764 ;
+C -1 ; WX 536 ; N Ecircumflex ; B 70 0 475 927 ;
+C -1 ; WX 683 ; N adieresis ; B 42 -13 621 765 ;
+C -1 ; WX 650 ; N edieresis ; B 38 -13 608 765 ;
+C -1 ; WX 647 ; N cacute ; B 41 -13 607 786 ;
+C -1 ; WX 610 ; N nacute ; B 65 0 546 786 ;
+C -1 ; WX 608 ; N umacron ; B 62 -13 541 736 ;
+C -1 ; WX 740 ; N Ncaron ; B 75 0 664 927 ;
+C -1 ; WX 226 ; N Iacute ; B 43 0 274 949 ;
+C -1 ; WX 606 ; N plusminus ; B 51 -24 555 518 ;
+C -1 ; WX 672 ; N brokenbar ; B 299 -147 373 703 ;
+C -1 ; WX 747 ; N registered ; B -9 -12 755 752 ;
+C -1 ; WX 872 ; N Gbreve ; B 40 -13 828 917 ;
+C -1 ; WX 226 ; N Idotaccent ; B 76 0 150 928 ;
+C -1 ; WX 600 ; N summation ; B 15 -10 586 706 ;
+C -1 ; WX 536 ; N Egrave ; B 70 0 475 949 ;
+C -1 ; WX 301 ; N racute ; B 65 0 332 786 ;
+C -1 ; WX 655 ; N omacron ; B 42 -13 614 736 ;
+C -1 ; WX 480 ; N Zacute ; B 12 0 470 949 ;
+C -1 ; WX 480 ; N Zcaron ; B 12 0 470 927 ;
+C -1 ; WX 549 ; N greaterequal ; B 26 0 523 658 ;
+C -1 ; WX 790 ; N Eth ; B 40 0 739 740 ;
+C -1 ; WX 813 ; N Ccedilla ; B 43 -222 771 752 ;
+C -1 ; WX 200 ; N lcommaaccent ; B -2 -222 144 740 ;
+C -1 ; WX 359 ; N tcaron ; B 14 0 394 780 ;
+C -1 ; WX 650 ; N eogonek ; B 38 -191 608 561 ;
+C -1 ; WX 655 ; N Uogonek ; B 75 -191 579 740 ;
+C -1 ; WX 740 ; N Aacute ; B 12 0 729 949 ;
+C -1 ; WX 740 ; N Adieresis ; B 12 0 729 928 ;
+C -1 ; WX 650 ; N egrave ; B 38 -13 608 786 ;
+C -1 ; WX 425 ; N zacute ; B 10 0 415 786 ;
+C -1 ; WX 200 ; N iogonek ; B 11 -191 166 740 ;
+C -1 ; WX 869 ; N Oacute ; B 43 -13 826 949 ;
+C -1 ; WX 655 ; N oacute ; B 42 -13 614 786 ;
+C -1 ; WX 683 ; N amacron ; B 42 -13 621 736 ;
+C -1 ; WX 388 ; N sacute ; B 24 -13 364 786 ;
+C -1 ; WX 200 ; N idieresis ; B -11 0 211 765 ;
+C -1 ; WX 869 ; N Ocircumflex ; B 43 -13 826 927 ;
+C -1 ; WX 655 ; N Ugrave ; B 75 -13 579 949 ;
+C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ;
+C -1 ; WX 682 ; N thorn ; B 64 -192 643 740 ;
+C -1 ; WX 332 ; N twosuperior ; B 19 296 318 747 ;
+C -1 ; WX 869 ; N Odieresis ; B 43 -13 826 928 ;
+C -1 ; WX 608 ; N mu ; B 80 -184 527 547 ;
+C -1 ; WX 200 ; N igrave ; B -60 0 171 786 ;
+C -1 ; WX 655 ; N ohungarumlaut ; B 42 -13 614 786 ;
+C -1 ; WX 536 ; N Eogonek ; B 70 -191 475 740 ;
+C -1 ; WX 685 ; N dcroat ; B 39 -13 680 740 ;
+C -1 ; WX 831 ; N threequarters ; B 46 0 784 747 ;
+C -1 ; WX 498 ; N Scedilla ; B 22 -222 473 753 ;
+C -1 ; WX 260 ; N lcaron ; B 65 0 309 740 ;
+C -1 ; WX 591 ; N Kcommaaccent ; B 81 -202 591 740 ;
+C -1 ; WX 462 ; N Lacute ; B 82 0 462 949 ;
+C -1 ; WX 1000 ; N trademark ; B 9 296 816 740 ;
+C -1 ; WX 650 ; N edotaccent ; B 38 -13 608 765 ;
+C -1 ; WX 226 ; N Igrave ; B -47 0 184 949 ;
+C -1 ; WX 226 ; N Imacron ; B -31 0 256 899 ;
+C -1 ; WX 462 ; N Lcaron ; B 82 0 462 740 ;
+C -1 ; WX 831 ; N onehalf ; B 81 0 750 740 ;
+C -1 ; WX 549 ; N lessequal ; B 26 0 523 658 ;
+C -1 ; WX 655 ; N ocircumflex ; B 42 -13 614 764 ;
+C -1 ; WX 610 ; N ntilde ; B 65 0 546 754 ;
+C -1 ; WX 655 ; N Uhungarumlaut ; B 75 -13 579 949 ;
+C -1 ; WX 536 ; N Eacute ; B 70 0 475 949 ;
+C -1 ; WX 650 ; N emacron ; B 38 -13 608 736 ;
+C -1 ; WX 673 ; N gbreve ; B 37 -215 606 754 ;
+C -1 ; WX 831 ; N onequarter ; B 100 0 729 740 ;
+C -1 ; WX 498 ; N Scaron ; B 22 -13 473 927 ;
+C -1 ; WX 498 ; N Scommaaccent ; B 22 -222 473 753 ;
+C -1 ; WX 869 ; N Ohungarumlaut ; B 43 -13 826 949 ;
+C -1 ; WX 400 ; N degree ; B 56 421 344 709 ;
+C -1 ; WX 655 ; N ograve ; B 42 -13 614 786 ;
+C -1 ; WX 813 ; N Ccaron ; B 43 -13 771 927 ;
+C -1 ; WX 608 ; N ugrave ; B 62 -13 541 786 ;
+C -1 ; WX 453 ; N radical ; B 7 -58 447 756 ;
+C -1 ; WX 744 ; N Dcaron ; B 74 0 699 927 ;
+C -1 ; WX 301 ; N rcommaaccent ; B 8 -222 291 561 ;
+C -1 ; WX 740 ; N Ntilde ; B 75 0 664 917 ;
+C -1 ; WX 655 ; N otilde ; B 42 -13 614 754 ;
+C -1 ; WX 607 ; N Rcommaaccent ; B 70 -202 572 740 ;
+C -1 ; WX 462 ; N Lcommaaccent ; B 82 -222 462 740 ;
+C -1 ; WX 740 ; N Atilde ; B 12 0 729 917 ;
+C -1 ; WX 740 ; N Aogonek ; B 12 -191 751 740 ;
+C -1 ; WX 740 ; N Aring ; B 12 0 729 955 ;
+C -1 ; WX 869 ; N Otilde ; B 43 -13 826 917 ;
+C -1 ; WX 425 ; N zdotaccent ; B 10 0 415 765 ;
+C -1 ; WX 536 ; N Ecaron ; B 70 0 475 927 ;
+C -1 ; WX 226 ; N Iogonek ; B 21 -191 176 740 ;
+C -1 ; WX 502 ; N kcommaaccent ; B 70 -202 498 740 ;
+C -1 ; WX 606 ; N minus ; B 51 219 555 287 ;
+C -1 ; WX 226 ; N Icircumflex ; B -64 0 290 927 ;
+C -1 ; WX 610 ; N ncaron ; B 65 0 546 764 ;
+C -1 ; WX 339 ; N tcommaaccent ; B 14 -222 330 740 ;
+C -1 ; WX 606 ; N logicalnot ; B 51 109 555 388 ;
+C -1 ; WX 655 ; N odieresis ; B 42 -13 614 765 ;
+C -1 ; WX 608 ; N udieresis ; B 62 -13 541 765 ;
+C -1 ; WX 549 ; N notequal ; B 12 -29 537 541 ;
+C -1 ; WX 673 ; N gcommaaccent ; B 37 -215 606 786 ;
+C -1 ; WX 655 ; N eth ; B 42 -12 614 753 ;
+C -1 ; WX 425 ; N zcaron ; B 10 0 415 764 ;
+C -1 ; WX 610 ; N ncommaaccent ; B 65 -202 546 561 ;
+C -1 ; WX 332 ; N onesuperior ; B 63 296 198 740 ;
+C -1 ; WX 200 ; N imacron ; B -44 0 243 736 ;
+EndCharMetrics
+StartKernData
+StartKernPairs 922
+KPX A T -81
+KPX A Tcaron -81
+KPX A Tcommaaccent -81
+KPX A V -122
+KPX A W -95
+KPX A Y -122
+KPX A Yacute -122
+KPX A Ydieresis -122
+KPX A v -73
+KPX A w -65
+KPX A y -72
+KPX A yacute -72
+KPX A ydieresis -72
+KPX Aacute T -81
+KPX Aacute Tcaron -81
+KPX Aacute Tcommaaccent -81
+KPX Aacute V -122
+KPX Aacute W -95
+KPX Aacute Y -122
+KPX Aacute Yacute -122
+KPX Aacute Ydieresis -122
+KPX Aacute v -73
+KPX Aacute w -65
+KPX Aacute y -72
+KPX Aacute yacute -72
+KPX Aacute ydieresis -72
+KPX Abreve T -81
+KPX Abreve Tcaron -81
+KPX Abreve Tcommaaccent -81
+KPX Abreve V -122
+KPX Abreve W -95
+KPX Abreve Y -122
+KPX Abreve Yacute -122
+KPX Abreve Ydieresis -122
+KPX Abreve v -73
+KPX Abreve w -65
+KPX Abreve y -72
+KPX Abreve yacute -72
+KPX Abreve ydieresis -72
+KPX Acircumflex T -81
+KPX Acircumflex Tcaron -81
+KPX Acircumflex Tcommaaccent -81
+KPX Acircumflex V -122
+KPX Acircumflex W -95
+KPX Acircumflex Y -122
+KPX Acircumflex Yacute -122
+KPX Acircumflex Ydieresis -122
+KPX Acircumflex v -73
+KPX Acircumflex w -65
+KPX Acircumflex y -72
+KPX Acircumflex yacute -72
+KPX Acircumflex ydieresis -72
+KPX Adieresis T -81
+KPX Adieresis Tcaron -81
+KPX Adieresis Tcommaaccent -81
+KPX Adieresis V -122
+KPX Adieresis W -95
+KPX Adieresis Y -122
+KPX Adieresis Yacute -122
+KPX Adieresis Ydieresis -122
+KPX Adieresis v -73
+KPX Adieresis w -65
+KPX Adieresis y -72
+KPX Adieresis yacute -72
+KPX Adieresis ydieresis -72
+KPX Agrave T -81
+KPX Agrave Tcaron -81
+KPX Agrave Tcommaaccent -81
+KPX Agrave V -122
+KPX Agrave W -95
+KPX Agrave Y -122
+KPX Agrave Yacute -122
+KPX Agrave Ydieresis -122
+KPX Agrave v -73
+KPX Agrave w -65
+KPX Agrave y -72
+KPX Agrave yacute -72
+KPX Agrave ydieresis -72
+KPX Amacron T -81
+KPX Amacron Tcaron -81
+KPX Amacron Tcommaaccent -81
+KPX Amacron V -122
+KPX Amacron W -95
+KPX Amacron Y -122
+KPX Amacron Yacute -122
+KPX Amacron Ydieresis -122
+KPX Amacron v -73
+KPX Amacron w -65
+KPX Amacron y -72
+KPX Amacron yacute -72
+KPX Amacron ydieresis -72
+KPX Aogonek T -81
+KPX Aogonek Tcaron -81
+KPX Aogonek Tcommaaccent -81
+KPX Aogonek V -122
+KPX Aogonek W -95
+KPX Aogonek Y -122
+KPX Aogonek Yacute -122
+KPX Aogonek Ydieresis -122
+KPX Aogonek v -73
+KPX Aogonek w -65
+KPX Aogonek y -72
+KPX Aogonek yacute -72
+KPX Aogonek ydieresis -72
+KPX Aring T -81
+KPX Aring Tcaron -81
+KPX Aring Tcommaaccent -81
+KPX Aring V -122
+KPX Aring W -95
+KPX Aring Y -122
+KPX Aring Yacute -122
+KPX Aring Ydieresis -122
+KPX Aring v -73
+KPX Aring w -65
+KPX Aring y -72
+KPX Aring yacute -72
+KPX Aring ydieresis -72
+KPX Atilde T -81
+KPX Atilde Tcaron -81
+KPX Atilde Tcommaaccent -81
+KPX Atilde V -122
+KPX Atilde W -95
+KPX Atilde Y -122
+KPX Atilde Yacute -122
+KPX Atilde Ydieresis -122
+KPX Atilde v -73
+KPX Atilde w -65
+KPX Atilde y -72
+KPX Atilde yacute -72
+KPX Atilde ydieresis -72
+KPX F A -60
+KPX F Aacute -60
+KPX F Abreve -60
+KPX F Acircumflex -60
+KPX F Adieresis -60
+KPX F Agrave -60
+KPX F Amacron -60
+KPX F Aogonek -60
+KPX F Aring -60
+KPX F Atilde -60
+KPX F comma -122
+KPX F period -79
+KPX L T -46
+KPX L Tcaron -46
+KPX L Tcommaaccent -46
+KPX L V -113
+KPX L W -67
+KPX L Y -91
+KPX L Yacute -91
+KPX L Ydieresis -91
+KPX L y -23
+KPX L yacute -23
+KPX L ydieresis -23
+KPX Lacute T -46
+KPX Lacute Tcaron -46
+KPX Lacute Tcommaaccent -46
+KPX Lacute V -113
+KPX Lacute W -67
+KPX Lacute Y -91
+KPX Lacute Yacute -91
+KPX Lacute Ydieresis -91
+KPX Lacute y -23
+KPX Lacute yacute -23
+KPX Lacute ydieresis -23
+KPX Lcaron y -23
+KPX Lcaron yacute -23
+KPX Lcaron ydieresis -23
+KPX Lcommaaccent T -46
+KPX Lcommaaccent Tcaron -46
+KPX Lcommaaccent Tcommaaccent -46
+KPX Lcommaaccent V -113
+KPX Lcommaaccent W -67
+KPX Lcommaaccent Y -91
+KPX Lcommaaccent Yacute -91
+KPX Lcommaaccent Ydieresis -91
+KPX Lcommaaccent y -23
+KPX Lcommaaccent yacute -23
+KPX Lcommaaccent ydieresis -23
+KPX Lslash T -46
+KPX Lslash Tcaron -46
+KPX Lslash Tcommaaccent -46
+KPX Lslash V -113
+KPX Lslash W -67
+KPX Lslash Y -91
+KPX Lslash Yacute -91
+KPX Lslash Ydieresis -91
+KPX Lslash y -23
+KPX Lslash yacute -23
+KPX Lslash ydieresis -23
+KPX P A -74
+KPX P Aacute -74
+KPX P Abreve -74
+KPX P Acircumflex -74
+KPX P Adieresis -74
+KPX P Agrave -74
+KPX P Amacron -74
+KPX P Aogonek -74
+KPX P Aring -74
+KPX P Atilde -74
+KPX P comma -123
+KPX P period -91
+KPX R T 6
+KPX R Tcaron 6
+KPX R Tcommaaccent 6
+KPX R V -39
+KPX R W 2
+KPX R Y -20
+KPX R Yacute -20
+KPX R Ydieresis -20
+KPX R y 32
+KPX R yacute 32
+KPX R ydieresis 32
+KPX Racute T 6
+KPX Racute Tcaron 6
+KPX Racute Tcommaaccent 6
+KPX Racute V -39
+KPX Racute W 2
+KPX Racute Y -20
+KPX Racute Yacute -20
+KPX Racute Ydieresis -20
+KPX Racute y 32
+KPX Racute yacute 32
+KPX Racute ydieresis 32
+KPX Rcaron T 6
+KPX Rcaron Tcaron 6
+KPX Rcaron Tcommaaccent 6
+KPX Rcaron V -39
+KPX Rcaron W 2
+KPX Rcaron Y -20
+KPX Rcaron Yacute -20
+KPX Rcaron Ydieresis -20
+KPX Rcaron y 32
+KPX Rcaron yacute 32
+KPX Rcaron ydieresis 32
+KPX Rcommaaccent T 6
+KPX Rcommaaccent Tcaron 6
+KPX Rcommaaccent Tcommaaccent 6
+KPX Rcommaaccent V -39
+KPX Rcommaaccent W 2
+KPX Rcommaaccent Y -20
+KPX Rcommaaccent Yacute -20
+KPX Rcommaaccent Ydieresis -20
+KPX Rcommaaccent y 32
+KPX Rcommaaccent yacute 32
+KPX Rcommaaccent ydieresis 32
+KPX T A -81
+KPX T Aacute -81
+KPX T Abreve -81
+KPX T Acircumflex -81
+KPX T Adieresis -81
+KPX T Agrave -81
+KPX T Amacron -81
+KPX T Aogonek -81
+KPX T Aring -81
+KPX T Atilde -81
+KPX T a -52
+KPX T aacute -52
+KPX T abreve -52
+KPX T acircumflex -52
+KPX T adieresis -52
+KPX T agrave -52
+KPX T amacron -52
+KPX T aogonek -52
+KPX T aring -52
+KPX T atilde -52
+KPX T c -51
+KPX T cacute -51
+KPX T ccaron -51
+KPX T ccedilla -51
+KPX T colon 3
+KPX T comma -102
+KPX T e -49
+KPX T eacute -49
+KPX T ecaron -49
+KPX T ecircumflex -49
+KPX T edieresis -49
+KPX T edotaccent -49
+KPX T egrave -49
+KPX T emacron -49
+KPX T eogonek -49
+KPX T i 31
+KPX T iacute 31
+KPX T icircumflex 31
+KPX T idieresis 31
+KPX T igrave 31
+KPX T imacron 31
+KPX T iogonek 31
+KPX T o -49
+KPX T oacute -49
+KPX T ocircumflex -49
+KPX T odieresis -49
+KPX T ograve -49
+KPX T ohungarumlaut -49
+KPX T omacron -49
+KPX T oslash -49
+KPX T otilde -49
+KPX T period -71
+KPX T r -30
+KPX T racute -30
+KPX T rcaron -30
+KPX T rcommaaccent -30
+KPX T s -23
+KPX T sacute -23
+KPX T scedilla -23
+KPX T scommaaccent -23
+KPX T semicolon -29
+KPX T u -46
+KPX T uacute -46
+KPX T ucircumflex -46
+KPX T udieresis -46
+KPX T ugrave -46
+KPX T uhungarumlaut -46
+KPX T umacron -46
+KPX T uogonek -46
+KPX T uring -46
+KPX T w 7
+KPX T y 5
+KPX T yacute 5
+KPX T ydieresis 5
+KPX Tcaron A -81
+KPX Tcaron Aacute -81
+KPX Tcaron Abreve -81
+KPX Tcaron Acircumflex -81
+KPX Tcaron Adieresis -81
+KPX Tcaron Agrave -81
+KPX Tcaron Amacron -81
+KPX Tcaron Aogonek -81
+KPX Tcaron Aring -81
+KPX Tcaron Atilde -81
+KPX Tcaron a -52
+KPX Tcaron aacute -52
+KPX Tcaron abreve -52
+KPX Tcaron acircumflex -52
+KPX Tcaron adieresis -52
+KPX Tcaron agrave -52
+KPX Tcaron amacron -52
+KPX Tcaron aogonek -52
+KPX Tcaron aring -52
+KPX Tcaron atilde -52
+KPX Tcaron c -51
+KPX Tcaron cacute -51
+KPX Tcaron ccaron -51
+KPX Tcaron ccedilla -51
+KPX Tcaron colon 3
+KPX Tcaron comma -102
+KPX Tcaron e -49
+KPX Tcaron eacute -49
+KPX Tcaron ecaron -49
+KPX Tcaron ecircumflex -49
+KPX Tcaron edieresis -49
+KPX Tcaron edotaccent -49
+KPX Tcaron egrave -49
+KPX Tcaron emacron -49
+KPX Tcaron eogonek -49
+KPX Tcaron i 31
+KPX Tcaron iacute 31
+KPX Tcaron iogonek 31
+KPX Tcaron o -49
+KPX Tcaron oacute -49
+KPX Tcaron ocircumflex -49
+KPX Tcaron odieresis -49
+KPX Tcaron ograve -49
+KPX Tcaron ohungarumlaut -49
+KPX Tcaron omacron -49
+KPX Tcaron oslash -49
+KPX Tcaron otilde -49
+KPX Tcaron period -71
+KPX Tcaron r -30
+KPX Tcaron racute -30
+KPX Tcaron rcaron -30
+KPX Tcaron rcommaaccent -30
+KPX Tcaron s -23
+KPX Tcaron sacute -23
+KPX Tcaron scaron -23
+KPX Tcaron scedilla -23
+KPX Tcaron scommaaccent -23
+KPX Tcaron semicolon -29
+KPX Tcaron u -46
+KPX Tcaron uacute -46
+KPX Tcaron ucircumflex -46
+KPX Tcaron udieresis -46
+KPX Tcaron ugrave -46
+KPX Tcaron uhungarumlaut -46
+KPX Tcaron umacron -46
+KPX Tcaron uogonek -46
+KPX Tcaron uring -46
+KPX Tcaron w 7
+KPX Tcaron y 5
+KPX Tcaron yacute 5
+KPX Tcaron ydieresis 5
+KPX Tcommaaccent A -81
+KPX Tcommaaccent Aacute -81
+KPX Tcommaaccent Abreve -81
+KPX Tcommaaccent Acircumflex -81
+KPX Tcommaaccent Adieresis -81
+KPX Tcommaaccent Agrave -81
+KPX Tcommaaccent Amacron -81
+KPX Tcommaaccent Aogonek -81
+KPX Tcommaaccent Aring -81
+KPX Tcommaaccent Atilde -81
+KPX Tcommaaccent a -52
+KPX Tcommaaccent aacute -52
+KPX Tcommaaccent abreve -52
+KPX Tcommaaccent acircumflex -52
+KPX Tcommaaccent adieresis -52
+KPX Tcommaaccent agrave -52
+KPX Tcommaaccent amacron -52
+KPX Tcommaaccent aogonek -52
+KPX Tcommaaccent aring -52
+KPX Tcommaaccent atilde -52
+KPX Tcommaaccent c -51
+KPX Tcommaaccent cacute -51
+KPX Tcommaaccent ccaron -51
+KPX Tcommaaccent ccedilla -51
+KPX Tcommaaccent colon 3
+KPX Tcommaaccent comma -102
+KPX Tcommaaccent e -49
+KPX Tcommaaccent eacute -49
+KPX Tcommaaccent ecaron -49
+KPX Tcommaaccent ecircumflex -49
+KPX Tcommaaccent edieresis -49
+KPX Tcommaaccent edotaccent -49
+KPX Tcommaaccent egrave -49
+KPX Tcommaaccent emacron -49
+KPX Tcommaaccent eogonek -49
+KPX Tcommaaccent i 31
+KPX Tcommaaccent iacute 31
+KPX Tcommaaccent iogonek 31
+KPX Tcommaaccent o -49
+KPX Tcommaaccent oacute -49
+KPX Tcommaaccent ocircumflex -49
+KPX Tcommaaccent odieresis -49
+KPX Tcommaaccent ograve -49
+KPX Tcommaaccent ohungarumlaut -49
+KPX Tcommaaccent omacron -49
+KPX Tcommaaccent oslash -49
+KPX Tcommaaccent otilde -49
+KPX Tcommaaccent period -71
+KPX Tcommaaccent r -30
+KPX Tcommaaccent racute -30
+KPX Tcommaaccent rcaron -30
+KPX Tcommaaccent rcommaaccent -30
+KPX Tcommaaccent s -23
+KPX Tcommaaccent sacute -23
+KPX Tcommaaccent scedilla -23
+KPX Tcommaaccent scommaaccent -23
+KPX Tcommaaccent semicolon -29
+KPX Tcommaaccent u -46
+KPX Tcommaaccent uacute -46
+KPX Tcommaaccent ucircumflex -46
+KPX Tcommaaccent udieresis -46
+KPX Tcommaaccent ugrave -46
+KPX Tcommaaccent uhungarumlaut -46
+KPX Tcommaaccent umacron -46
+KPX Tcommaaccent uogonek -46
+KPX Tcommaaccent uring -46
+KPX Tcommaaccent w 7
+KPX Tcommaaccent y 5
+KPX Tcommaaccent yacute 5
+KPX Tcommaaccent ydieresis 5
+KPX V A -122
+KPX V Aacute -122
+KPX V Abreve -122
+KPX V Acircumflex -122
+KPX V Adieresis -122
+KPX V Agrave -122
+KPX V Amacron -122
+KPX V Aogonek -122
+KPX V Aring -122
+KPX V Atilde -122
+KPX V a -104
+KPX V aacute -104
+KPX V abreve -104
+KPX V acircumflex -104
+KPX V adieresis -104
+KPX V agrave -104
+KPX V amacron -104
+KPX V aogonek -104
+KPX V aring -104
+KPX V atilde -104
+KPX V colon -1
+KPX V comma -106
+KPX V e -101
+KPX V eacute -101
+KPX V ecaron -101
+KPX V ecircumflex -101
+KPX V edieresis -101
+KPX V edotaccent -101
+KPX V egrave -101
+KPX V emacron -101
+KPX V eogonek -101
+KPX V i 5
+KPX V iacute 5
+KPX V iogonek 5
+KPX V o -101
+KPX V oacute -101
+KPX V ocircumflex -101
+KPX V odieresis -101
+KPX V ograve -101
+KPX V ohungarumlaut -101
+KPX V omacron -101
+KPX V oslash -101
+KPX V otilde -101
+KPX V period -75
+KPX V r -40
+KPX V racute -40
+KPX V rcaron -40
+KPX V rcommaaccent -40
+KPX V semicolon -33
+KPX V u -40
+KPX V uacute -40
+KPX V ucircumflex -40
+KPX V udieresis -40
+KPX V ugrave -40
+KPX V uhungarumlaut -40
+KPX V umacron -40
+KPX V uogonek -40
+KPX V uring -40
+KPX V y -25
+KPX V yacute -25
+KPX V ydieresis -25
+KPX W A -73
+KPX W Aacute -73
+KPX W Abreve -73
+KPX W Acircumflex -73
+KPX W Adieresis -73
+KPX W Agrave -73
+KPX W Amacron -73
+KPX W Aogonek -73
+KPX W Aring -73
+KPX W Atilde -73
+KPX W a -50
+KPX W aacute -50
+KPX W abreve -50
+KPX W acircumflex -50
+KPX W adieresis -50
+KPX W agrave -50
+KPX W amacron -50
+KPX W aogonek -50
+KPX W aring -50
+KPX W atilde -50
+KPX W colon -1
+KPX W comma -106
+KPX W e -47
+KPX W eacute -47
+KPX W ecaron -47
+KPX W ecircumflex -47
+KPX W edieresis -47
+KPX W edotaccent -47
+KPX W egrave -47
+KPX W emacron -47
+KPX W eogonek -47
+KPX W i 6
+KPX W iacute 6
+KPX W icircumflex 16
+KPX W idieresis 16
+KPX W igrave 16
+KPX W imacron 16
+KPX W iogonek 6
+KPX W o -46
+KPX W oacute -46
+KPX W ocircumflex -46
+KPX W odieresis -46
+KPX W ograve -46
+KPX W ohungarumlaut -46
+KPX W omacron -46
+KPX W oslash -46
+KPX W otilde -46
+KPX W period -74
+KPX W r -29
+KPX W racute -29
+KPX W rcaron -29
+KPX W rcommaaccent -29
+KPX W semicolon -33
+KPX W u -30
+KPX W uacute -30
+KPX W ucircumflex -30
+KPX W udieresis -30
+KPX W ugrave -30
+KPX W uhungarumlaut -30
+KPX W umacron -30
+KPX W uogonek -30
+KPX W uring -30
+KPX W y -2
+KPX W yacute -2
+KPX W ydieresis -2
+KPX Y A -122
+KPX Y Aacute -122
+KPX Y Abreve -122
+KPX Y Acircumflex -122
+KPX Y Adieresis -122
+KPX Y Agrave -122
+KPX Y Amacron -122
+KPX Y Aogonek -122
+KPX Y Aring -122
+KPX Y Atilde -122
+KPX Y a -93
+KPX Y aacute -93
+KPX Y abreve -93
+KPX Y acircumflex -93
+KPX Y adieresis -93
+KPX Y agrave -93
+KPX Y amacron -93
+KPX Y aogonek -93
+KPX Y aring -93
+KPX Y atilde -93
+KPX Y colon 9
+KPX Y comma -97
+KPX Y e -89
+KPX Y eacute -89
+KPX Y ecaron -89
+KPX Y ecircumflex -89
+KPX Y edieresis -89
+KPX Y edotaccent -89
+KPX Y egrave -89
+KPX Y emacron -89
+KPX Y eogonek -89
+KPX Y i 13
+KPX Y iacute 13
+KPX Y icircumflex 23
+KPX Y idieresis 23
+KPX Y igrave 23
+KPX Y imacron 23
+KPX Y iogonek 13
+KPX Y o -89
+KPX Y oacute -89
+KPX Y ocircumflex -89
+KPX Y odieresis -89
+KPX Y ograve -89
+KPX Y ohungarumlaut -89
+KPX Y omacron -89
+KPX Y oslash -89
+KPX Y otilde -89
+KPX Y p -67
+KPX Y period -65
+KPX Y q -93
+KPX Y semicolon -23
+KPX Y u -69
+KPX Y uacute -69
+KPX Y ucircumflex -69
+KPX Y udieresis -69
+KPX Y ugrave -69
+KPX Y uhungarumlaut -69
+KPX Y umacron -69
+KPX Y uogonek -69
+KPX Y uring -69
+KPX Y v -17
+KPX Yacute A -122
+KPX Yacute Aacute -122
+KPX Yacute Abreve -122
+KPX Yacute Acircumflex -122
+KPX Yacute Adieresis -122
+KPX Yacute Agrave -122
+KPX Yacute Amacron -122
+KPX Yacute Aogonek -122
+KPX Yacute Aring -122
+KPX Yacute Atilde -122
+KPX Yacute a -93
+KPX Yacute aacute -93
+KPX Yacute abreve -93
+KPX Yacute acircumflex -93
+KPX Yacute adieresis -93
+KPX Yacute agrave -93
+KPX Yacute amacron -93
+KPX Yacute aogonek -93
+KPX Yacute aring -93
+KPX Yacute atilde -93
+KPX Yacute colon 9
+KPX Yacute comma -97
+KPX Yacute e -89
+KPX Yacute eacute -89
+KPX Yacute ecaron -89
+KPX Yacute ecircumflex -89
+KPX Yacute edieresis -89
+KPX Yacute edotaccent -89
+KPX Yacute egrave -89
+KPX Yacute emacron -89
+KPX Yacute eogonek -89
+KPX Yacute i 13
+KPX Yacute iacute 13
+KPX Yacute icircumflex 23
+KPX Yacute idieresis 23
+KPX Yacute igrave 23
+KPX Yacute imacron 23
+KPX Yacute iogonek 13
+KPX Yacute o -89
+KPX Yacute oacute -89
+KPX Yacute ocircumflex -89
+KPX Yacute odieresis -89
+KPX Yacute ograve -89
+KPX Yacute ohungarumlaut -89
+KPX Yacute omacron -89
+KPX Yacute oslash -89
+KPX Yacute otilde -89
+KPX Yacute p -67
+KPX Yacute period -65
+KPX Yacute q -93
+KPX Yacute semicolon -23
+KPX Yacute u -69
+KPX Yacute uacute -69
+KPX Yacute ucircumflex -69
+KPX Yacute udieresis -69
+KPX Yacute ugrave -69
+KPX Yacute uhungarumlaut -69
+KPX Yacute umacron -69
+KPX Yacute uogonek -69
+KPX Yacute uring -69
+KPX Yacute v -17
+KPX Ydieresis A -122
+KPX Ydieresis Aacute -122
+KPX Ydieresis Abreve -122
+KPX Ydieresis Acircumflex -122
+KPX Ydieresis Adieresis -122
+KPX Ydieresis Agrave -122
+KPX Ydieresis Amacron -122
+KPX Ydieresis Aogonek -122
+KPX Ydieresis Aring -122
+KPX Ydieresis Atilde -122
+KPX Ydieresis a -93
+KPX Ydieresis aacute -93
+KPX Ydieresis abreve -93
+KPX Ydieresis acircumflex -93
+KPX Ydieresis adieresis -93
+KPX Ydieresis agrave -93
+KPX Ydieresis amacron -93
+KPX Ydieresis aogonek -93
+KPX Ydieresis aring -93
+KPX Ydieresis atilde -93
+KPX Ydieresis colon 9
+KPX Ydieresis comma -97
+KPX Ydieresis e -89
+KPX Ydieresis eacute -89
+KPX Ydieresis ecaron -89
+KPX Ydieresis ecircumflex -89
+KPX Ydieresis edieresis -89
+KPX Ydieresis edotaccent -89
+KPX Ydieresis egrave -89
+KPX Ydieresis emacron -89
+KPX Ydieresis eogonek -89
+KPX Ydieresis i 13
+KPX Ydieresis iacute 13
+KPX Ydieresis icircumflex 23
+KPX Ydieresis idieresis 23
+KPX Ydieresis igrave 23
+KPX Ydieresis imacron 23
+KPX Ydieresis iogonek 13
+KPX Ydieresis o -89
+KPX Ydieresis oacute -89
+KPX Ydieresis ocircumflex -89
+KPX Ydieresis odieresis -89
+KPX Ydieresis ograve -89
+KPX Ydieresis ohungarumlaut -89
+KPX Ydieresis omacron -89
+KPX Ydieresis oslash -89
+KPX Ydieresis otilde -89
+KPX Ydieresis p -67
+KPX Ydieresis period -65
+KPX Ydieresis q -93
+KPX Ydieresis semicolon -23
+KPX Ydieresis u -69
+KPX Ydieresis uacute -69
+KPX Ydieresis ucircumflex -69
+KPX Ydieresis udieresis -69
+KPX Ydieresis ugrave -69
+KPX Ydieresis uhungarumlaut -69
+KPX Ydieresis umacron -69
+KPX Ydieresis uogonek -69
+KPX Ydieresis uring -69
+KPX Ydieresis v -17
+KPX f f 3
+KPX r c -7
+KPX r cacute -7
+KPX r ccaron -7
+KPX r ccedilla -7
+KPX r comma -105
+KPX r d -6
+KPX r dcroat -6
+KPX r e -4
+KPX r eacute -4
+KPX r ecaron -4
+KPX r ecircumflex -4
+KPX r edieresis -4
+KPX r edotaccent -4
+KPX r egrave -4
+KPX r emacron -4
+KPX r eogonek -4
+KPX r f 48
+KPX r g 1
+KPX r gbreve 1
+KPX r gcommaaccent 1
+KPX r h 29
+KPX r m 28
+KPX r n 21
+KPX r nacute 21
+KPX r ncaron 21
+KPX r ncommaaccent 21
+KPX r ntilde 21
+KPX r o -4
+KPX r oacute -4
+KPX r ocircumflex -4
+KPX r odieresis -4
+KPX r ograve -4
+KPX r ohungarumlaut -4
+KPX r omacron -4
+KPX r oslash -4
+KPX r otilde -4
+KPX r period -73
+KPX r q -8
+KPX racute c -7
+KPX racute cacute -7
+KPX racute ccaron -7
+KPX racute ccedilla -7
+KPX racute comma -105
+KPX racute d -6
+KPX racute dcroat -6
+KPX racute e -4
+KPX racute eacute -4
+KPX racute ecaron -4
+KPX racute ecircumflex -4
+KPX racute edieresis -4
+KPX racute edotaccent -4
+KPX racute egrave -4
+KPX racute emacron -4
+KPX racute eogonek -4
+KPX racute f 48
+KPX racute g 1
+KPX racute gbreve 1
+KPX racute gcommaaccent 1
+KPX racute h 29
+KPX racute m 28
+KPX racute n 21
+KPX racute nacute 21
+KPX racute ncaron 21
+KPX racute ncommaaccent 21
+KPX racute ntilde 21
+KPX racute o -4
+KPX racute oacute -4
+KPX racute ocircumflex -4
+KPX racute odieresis -4
+KPX racute ograve -4
+KPX racute ohungarumlaut -4
+KPX racute omacron -4
+KPX racute oslash -4
+KPX racute otilde -4
+KPX racute period -73
+KPX racute q -8
+KPX rcaron c -7
+KPX rcaron cacute -7
+KPX rcaron ccaron -7
+KPX rcaron ccedilla -7
+KPX rcaron comma -105
+KPX rcaron d -6
+KPX rcaron dcroat -6
+KPX rcaron e -4
+KPX rcaron eacute -4
+KPX rcaron ecaron -4
+KPX rcaron ecircumflex -4
+KPX rcaron edieresis -4
+KPX rcaron edotaccent -4
+KPX rcaron egrave -4
+KPX rcaron emacron -4
+KPX rcaron eogonek -4
+KPX rcaron f 48
+KPX rcaron g 1
+KPX rcaron gbreve 1
+KPX rcaron gcommaaccent 1
+KPX rcaron h 29
+KPX rcaron m 28
+KPX rcaron n 21
+KPX rcaron nacute 21
+KPX rcaron ncaron 21
+KPX rcaron ncommaaccent 21
+KPX rcaron ntilde 21
+KPX rcaron o -4
+KPX rcaron oacute -4
+KPX rcaron ocircumflex -4
+KPX rcaron odieresis -4
+KPX rcaron ograve -4
+KPX rcaron ohungarumlaut -4
+KPX rcaron omacron -4
+KPX rcaron oslash -4
+KPX rcaron otilde -4
+KPX rcaron period -73
+KPX rcaron q -8
+KPX rcommaaccent c -7
+KPX rcommaaccent cacute -7
+KPX rcommaaccent ccaron -7
+KPX rcommaaccent ccedilla -7
+KPX rcommaaccent comma -105
+KPX rcommaaccent d -6
+KPX rcommaaccent dcroat -6
+KPX rcommaaccent e -4
+KPX rcommaaccent eacute -4
+KPX rcommaaccent ecaron -4
+KPX rcommaaccent ecircumflex -4
+KPX rcommaaccent edieresis -4
+KPX rcommaaccent edotaccent -4
+KPX rcommaaccent egrave -4
+KPX rcommaaccent emacron -4
+KPX rcommaaccent eogonek -4
+KPX rcommaaccent f 48
+KPX rcommaaccent g 1
+KPX rcommaaccent gbreve 1
+KPX rcommaaccent gcommaaccent 1
+KPX rcommaaccent h 29
+KPX rcommaaccent m 28
+KPX rcommaaccent n 21
+KPX rcommaaccent nacute 21
+KPX rcommaaccent ncaron 21
+KPX rcommaaccent ncommaaccent 21
+KPX rcommaaccent ntilde 21
+KPX rcommaaccent o -4
+KPX rcommaaccent oacute -4
+KPX rcommaaccent ocircumflex -4
+KPX rcommaaccent odieresis -4
+KPX rcommaaccent ograve -4
+KPX rcommaaccent ohungarumlaut -4
+KPX rcommaaccent omacron -4
+KPX rcommaaccent oslash -4
+KPX rcommaaccent otilde -4
+KPX rcommaaccent period -73
+KPX rcommaaccent q -8
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/src/fonts/Adobe-Core35_AFMs-314/ITCAvantGarde-BookOblique.afm b/src/fonts/Adobe-Core35_AFMs-314/ITCAvantGarde-BookOblique.afm
new file mode 100644
index 0000000..5d5ef83
--- /dev/null
+++ b/src/fonts/Adobe-Core35_AFMs-314/ITCAvantGarde-BookOblique.afm
@@ -0,0 +1,1266 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1985, 1987, 1989, 1990, 1991, 1992, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Thu May 1 14:07:08 1997
+Comment UniqueID 43084
+Comment VMusage 11964 62330
+FontName AvantGarde-BookOblique
+FullName ITC Avant Garde Gothic Book Oblique
+FamilyName ITC Avant Garde Gothic
+Weight Book
+ItalicAngle -10.5
+IsFixedPitch false
+FontBBox -113 -222 1279 955
+UnderlinePosition -100
+UnderlineThickness 50
+Version 002.000
+Notice Copyright (c) 1985, 1987, 1989, 1990, 1991, 1992, 1997 Adobe Systems Incorporated. All Rights Reserved.ITC Avant Garde Gothic is a registered trademark of International Typeface Corporation.
+EncodingScheme AdobeStandardEncoding
+CapHeight 740
+XHeight 547
+Ascender 740
+Descender -192
+StdHW 63
+StdVW 70
+StartCharMetrics 314
+C 32 ; WX 277 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 295 ; N exclam ; B 111 0 322 740 ;
+C 34 ; WX 309 ; N quotedbl ; B 130 444 410 740 ;
+C 35 ; WX 554 ; N numbersign ; B 71 0 620 740 ;
+C 36 ; WX 554 ; N dollar ; B 107 -70 581 811 ;
+C 37 ; WX 775 ; N percent ; B 124 -13 787 751 ;
+C 38 ; WX 757 ; N ampersand ; B 92 -12 775 753 ;
+C 39 ; WX 351 ; N quoteright ; B 195 546 393 740 ;
+C 40 ; WX 369 ; N parenleft ; B 89 -205 495 757 ;
+C 41 ; WX 369 ; N parenright ; B -24 -205 382 757 ;
+C 42 ; WX 425 ; N asterisk ; B 170 446 479 740 ;
+C 43 ; WX 606 ; N plus ; B 92 0 608 506 ;
+C 44 ; WX 277 ; N comma ; B 2 -67 199 126 ;
+C 45 ; WX 332 ; N hyphen ; B 76 248 360 315 ;
+C 46 ; WX 277 ; N period ; B 102 0 199 126 ;
+C 47 ; WX 437 ; N slash ; B 25 -100 540 740 ;
+C 48 ; WX 554 ; N zero ; B 71 -13 622 753 ;
+C 49 ; WX 554 ; N one ; B 260 0 473 740 ;
+C 50 ; WX 554 ; N two ; B 40 0 615 753 ;
+C 51 ; WX 554 ; N three ; B 73 -13 565 753 ;
+C 52 ; WX 554 ; N four ; B 39 0 598 740 ;
+C 53 ; WX 554 ; N five ; B 69 -13 605 740 ;
+C 54 ; WX 554 ; N six ; B 65 -13 580 739 ;
+C 55 ; WX 554 ; N seven ; B 110 0 628 740 ;
+C 56 ; WX 554 ; N eight ; B 77 -13 580 753 ;
+C 57 ; WX 554 ; N nine ; B 111 0 626 752 ;
+C 58 ; WX 277 ; N colon ; B 102 0 278 548 ;
+C 59 ; WX 277 ; N semicolon ; B 2 -67 278 548 ;
+C 60 ; WX 606 ; N less ; B 87 -8 649 514 ;
+C 61 ; WX 606 ; N equal ; B 73 118 627 388 ;
+C 62 ; WX 606 ; N greater ; B 51 -8 613 514 ;
+C 63 ; WX 591 ; N question ; B 158 0 628 752 ;
+C 64 ; WX 867 ; N at ; B 126 -13 888 753 ;
+C 65 ; WX 740 ; N A ; B 12 0 729 740 ;
+C 66 ; WX 574 ; N B ; B 74 0 606 740 ;
+C 67 ; WX 813 ; N C ; B 105 -13 870 752 ;
+C 68 ; WX 744 ; N D ; B 74 0 773 740 ;
+C 69 ; WX 536 ; N E ; B 70 0 612 740 ;
+C 70 ; WX 485 ; N F ; B 70 0 581 740 ;
+C 71 ; WX 872 ; N G ; B 103 -13 891 753 ;
+C 72 ; WX 683 ; N H ; B 76 0 744 740 ;
+C 73 ; WX 226 ; N I ; B 76 0 287 740 ;
+C 74 ; WX 482 ; N J ; B 37 -13 539 740 ;
+C 75 ; WX 591 ; N K ; B 81 0 728 740 ;
+C 76 ; WX 462 ; N L ; B 82 0 474 740 ;
+C 77 ; WX 919 ; N M ; B 76 0 980 740 ;
+C 78 ; WX 740 ; N N ; B 75 0 801 740 ;
+C 79 ; WX 869 ; N O ; B 105 -13 901 753 ;
+C 80 ; WX 592 ; N P ; B 75 0 664 740 ;
+C 81 ; WX 871 ; N Q ; B 102 -13 912 753 ;
+C 82 ; WX 607 ; N R ; B 70 0 669 740 ;
+C 83 ; WX 498 ; N S ; B 57 -13 561 753 ;
+C 84 ; WX 426 ; N T ; B 131 0 556 740 ;
+C 85 ; WX 655 ; N U ; B 118 -13 716 740 ;
+C 86 ; WX 702 ; N V ; B 145 0 830 740 ;
+C 87 ; WX 960 ; N W ; B 148 0 1087 740 ;
+C 88 ; WX 609 ; N X ; B 8 0 724 740 ;
+C 89 ; WX 592 ; N Y ; B 138 0 729 740 ;
+C 90 ; WX 480 ; N Z ; B 12 0 596 740 ;
+C 91 ; WX 351 ; N bracketleft ; B 145 -179 477 753 ;
+C 92 ; WX 605 ; N backslash ; B 255 -100 458 740 ;
+C 93 ; WX 351 ; N bracketright ; B -19 -179 312 753 ;
+C 94 ; WX 606 ; N asciicircum ; B 110 307 610 740 ;
+C 95 ; WX 500 ; N underscore ; B -23 -125 486 -75 ;
+C 96 ; WX 351 ; N quoteleft ; B 232 546 358 740 ;
+C 97 ; WX 683 ; N a ; B 88 -13 722 561 ;
+C 98 ; WX 682 ; N b ; B 68 -13 703 740 ;
+C 99 ; WX 647 ; N c ; B 87 -13 678 561 ;
+C 100 ; WX 685 ; N d ; B 85 -13 755 740 ;
+C 101 ; WX 650 ; N e ; B 84 -13 664 561 ;
+C 102 ; WX 314 ; N f ; B 104 0 454 753 ; L i fi ; L l fl ;
+C 103 ; WX 673 ; N g ; B 56 -215 707 561 ;
+C 104 ; WX 610 ; N h ; B 62 0 606 740 ;
+C 105 ; WX 200 ; N i ; B 65 0 272 740 ;
+C 106 ; WX 203 ; N j ; B -80 -192 274 740 ;
+C 107 ; WX 502 ; N k ; B 70 0 588 740 ;
+C 108 ; WX 200 ; N l ; B 65 0 272 740 ;
+C 109 ; WX 938 ; N m ; B 66 0 938 561 ;
+C 110 ; WX 610 ; N n ; B 65 0 609 561 ;
+C 111 ; WX 655 ; N o ; B 88 -13 669 561 ;
+C 112 ; WX 682 ; N p ; B 28 -192 699 561 ;
+C 113 ; WX 682 ; N q ; B 83 -192 717 561 ;
+C 114 ; WX 301 ; N r ; B 65 0 395 561 ;
+C 115 ; WX 388 ; N s ; B 49 -13 424 561 ;
+C 116 ; WX 339 ; N t ; B 104 0 431 740 ;
+C 117 ; WX 608 ; N u ; B 100 -13 642 547 ;
+C 118 ; WX 554 ; N v ; B 108 0 647 547 ;
+C 119 ; WX 831 ; N w ; B 114 0 921 547 ;
+C 120 ; WX 480 ; N x ; B 12 0 569 547 ;
+C 121 ; WX 536 ; N y ; B 97 -192 624 547 ;
+C 122 ; WX 425 ; N z ; B 10 0 498 547 ;
+C 123 ; WX 351 ; N braceleft ; B 115 -189 468 740 ;
+C 124 ; WX 672 ; N bar ; B 258 -222 517 778 ;
+C 125 ; WX 351 ; N braceright ; B -15 -189 338 740 ;
+C 126 ; WX 606 ; N asciitilde ; B 114 179 584 319 ;
+C 161 ; WX 295 ; N exclamdown ; B 74 -192 286 548 ;
+C 162 ; WX 554 ; N cent ; B 115 62 596 707 ;
+C 163 ; WX 554 ; N sterling ; B 29 0 614 753 ;
+C 164 ; WX 166 ; N fraction ; B -113 0 417 740 ;
+C 165 ; WX 554 ; N yen ; B 75 0 687 740 ;
+C 166 ; WX 554 ; N florin ; B -39 -153 669 818 ;
+C 167 ; WX 615 ; N section ; B 118 -141 597 753 ;
+C 168 ; WX 554 ; N currency ; B 24 42 645 580 ;
+C 169 ; WX 198 ; N quotesingle ; B 153 444 277 740 ;
+C 170 ; WX 502 ; N quotedblleft ; B 234 546 507 740 ;
+C 171 ; WX 425 ; N guillemotleft ; B 92 81 469 481 ;
+C 172 ; WX 251 ; N guilsinglleft ; B 92 81 295 481 ;
+C 173 ; WX 251 ; N guilsinglright ; B 60 81 263 481 ;
+C 174 ; WX 487 ; N fi ; B 104 0 559 753 ;
+C 175 ; WX 485 ; N fl ; B 104 0 557 753 ;
+C 177 ; WX 500 ; N endash ; B 81 248 523 315 ;
+C 178 ; WX 553 ; N dagger ; B 146 -133 593 740 ;
+C 179 ; WX 553 ; N daggerdbl ; B 72 -133 593 740 ;
+C 180 ; WX 277 ; N periodcentered ; B 137 190 235 316 ;
+C 182 ; WX 564 ; N paragraph ; B 119 -110 688 740 ;
+C 183 ; WX 606 ; N bullet ; B 217 222 528 532 ;
+C 184 ; WX 354 ; N quotesinglbase ; B 76 -68 274 126 ;
+C 185 ; WX 502 ; N quotedblbase ; B 76 -68 422 126 ;
+C 186 ; WX 484 ; N quotedblright ; B 197 546 542 740 ;
+C 187 ; WX 425 ; N guillemotright ; B 60 81 437 481 ;
+C 188 ; WX 1000 ; N ellipsis ; B 130 0 893 126 ;
+C 189 ; WX 1174 ; N perthousand ; B 128 -13 1182 751 ;
+C 191 ; WX 591 ; N questiondown ; B 64 -205 534 548 ;
+C 193 ; WX 378 ; N grave ; B 204 619 425 786 ;
+C 194 ; WX 375 ; N acute ; B 203 619 444 786 ;
+C 195 ; WX 502 ; N circumflex ; B 192 639 546 764 ;
+C 196 ; WX 439 ; N tilde ; B 179 651 520 754 ;
+C 197 ; WX 485 ; N macron ; B 197 669 547 736 ;
+C 198 ; WX 453 ; N breve ; B 192 651 541 754 ;
+C 199 ; WX 222 ; N dotaccent ; B 192 639 290 765 ;
+C 200 ; WX 369 ; N dieresis ; B 191 639 437 765 ;
+C 202 ; WX 332 ; N ring ; B 191 600 401 807 ;
+C 203 ; WX 324 ; N cedilla ; B 52 -222 231 3 ;
+C 205 ; WX 552 ; N hungarumlaut ; B 230 605 623 786 ;
+C 206 ; WX 302 ; N ogonek ; B 53 -191 202 0 ;
+C 207 ; WX 502 ; N caron ; B 210 639 565 764 ;
+C 208 ; WX 1000 ; N emdash ; B 81 248 1023 315 ;
+C 225 ; WX 992 ; N AE ; B -20 0 1044 740 ;
+C 227 ; WX 369 ; N ordfeminine ; B 102 407 494 753 ;
+C 232 ; WX 517 ; N Lslash ; B 107 0 529 740 ;
+C 233 ; WX 868 ; N Oslash ; B 76 -83 929 819 ;
+C 234 ; WX 1194 ; N OE ; B 107 -13 1279 753 ;
+C 235 ; WX 369 ; N ordmasculine ; B 116 407 466 753 ;
+C 241 ; WX 1157 ; N ae ; B 80 -13 1169 561 ;
+C 245 ; WX 200 ; N dotlessi ; B 65 0 236 547 ;
+C 248 ; WX 300 ; N lslash ; B 95 0 354 740 ;
+C 249 ; WX 653 ; N oslash ; B 51 -64 703 614 ;
+C 250 ; WX 1137 ; N oe ; B 80 -13 1160 561 ;
+C 251 ; WX 554 ; N germandbls ; B 61 -13 578 753 ;
+C -1 ; WX 226 ; N Idieresis ; B 76 0 396 928 ;
+C -1 ; WX 650 ; N eacute ; B 84 -13 664 786 ;
+C -1 ; WX 683 ; N abreve ; B 88 -13 722 754 ;
+C -1 ; WX 608 ; N uhungarumlaut ; B 100 -13 671 786 ;
+C -1 ; WX 650 ; N ecaron ; B 84 -13 664 764 ;
+C -1 ; WX 592 ; N Ydieresis ; B 138 0 729 928 ;
+C -1 ; WX 606 ; N divide ; B 92 -13 608 519 ;
+C -1 ; WX 592 ; N Yacute ; B 138 0 729 949 ;
+C -1 ; WX 740 ; N Acircumflex ; B 12 0 729 927 ;
+C -1 ; WX 683 ; N aacute ; B 88 -13 722 786 ;
+C -1 ; WX 655 ; N Ucircumflex ; B 118 -13 716 927 ;
+C -1 ; WX 536 ; N yacute ; B 97 -192 624 786 ;
+C -1 ; WX 388 ; N scommaaccent ; B 49 -222 424 561 ;
+C -1 ; WX 650 ; N ecircumflex ; B 84 -13 664 764 ;
+C -1 ; WX 655 ; N Uring ; B 118 -13 716 955 ;
+C -1 ; WX 655 ; N Udieresis ; B 118 -13 716 928 ;
+C -1 ; WX 683 ; N aogonek ; B 88 -191 722 561 ;
+C -1 ; WX 655 ; N Uacute ; B 118 -13 716 949 ;
+C -1 ; WX 608 ; N uogonek ; B 100 -191 642 547 ;
+C -1 ; WX 536 ; N Edieresis ; B 70 0 612 928 ;
+C -1 ; WX 790 ; N Dcroat ; B 104 0 813 740 ;
+C -1 ; WX 250 ; N commaaccent ; B -18 -222 159 -54 ;
+C -1 ; WX 747 ; N copyright ; B 53 -12 830 752 ;
+C -1 ; WX 536 ; N Emacron ; B 70 0 612 899 ;
+C -1 ; WX 647 ; N ccaron ; B 87 -13 678 764 ;
+C -1 ; WX 683 ; N aring ; B 88 -13 722 807 ;
+C -1 ; WX 740 ; N Ncommaaccent ; B 75 -202 801 740 ;
+C -1 ; WX 200 ; N lacute ; B 65 0 416 949 ;
+C -1 ; WX 683 ; N agrave ; B 88 -13 722 786 ;
+C -1 ; WX 426 ; N Tcommaaccent ; B 70 -222 556 740 ;
+C -1 ; WX 813 ; N Cacute ; B 105 -13 870 949 ;
+C -1 ; WX 683 ; N atilde ; B 88 -13 722 754 ;
+C -1 ; WX 536 ; N Edotaccent ; B 70 0 612 928 ;
+C -1 ; WX 388 ; N scaron ; B 49 -13 508 764 ;
+C -1 ; WX 388 ; N scedilla ; B 49 -222 424 561 ;
+C -1 ; WX 200 ; N iacute ; B 65 0 396 786 ;
+C -1 ; WX 471 ; N lozenge ; B 82 0 524 719 ;
+C -1 ; WX 607 ; N Rcaron ; B 70 0 669 927 ;
+C -1 ; WX 872 ; N Gcommaaccent ; B 103 -222 891 753 ;
+C -1 ; WX 608 ; N ucircumflex ; B 100 -13 642 764 ;
+C -1 ; WX 683 ; N acircumflex ; B 88 -13 722 764 ;
+C -1 ; WX 740 ; N Amacron ; B 12 0 729 899 ;
+C -1 ; WX 301 ; N rcaron ; B 65 0 494 764 ;
+C -1 ; WX 647 ; N ccedilla ; B 87 -222 678 561 ;
+C -1 ; WX 480 ; N Zdotaccent ; B 12 0 596 928 ;
+C -1 ; WX 592 ; N Thorn ; B 60 0 621 740 ;
+C -1 ; WX 869 ; N Omacron ; B 105 -13 901 899 ;
+C -1 ; WX 607 ; N Racute ; B 70 0 669 949 ;
+C -1 ; WX 498 ; N Sacute ; B 57 -13 561 949 ;
+C -1 ; WX 755 ; N dcaron ; B 85 -13 929 740 ;
+C -1 ; WX 655 ; N Umacron ; B 118 -13 716 899 ;
+C -1 ; WX 608 ; N uring ; B 100 -13 642 807 ;
+C -1 ; WX 332 ; N threesuperior ; B 98 289 408 747 ;
+C -1 ; WX 869 ; N Ograve ; B 105 -13 901 949 ;
+C -1 ; WX 740 ; N Agrave ; B 12 0 729 949 ;
+C -1 ; WX 740 ; N Abreve ; B 12 0 729 917 ;
+C -1 ; WX 606 ; N multiply ; B 87 24 612 482 ;
+C -1 ; WX 608 ; N uacute ; B 100 -13 642 786 ;
+C -1 ; WX 426 ; N Tcaron ; B 131 0 557 927 ;
+C -1 ; WX 476 ; N partialdiff ; B 46 -38 529 704 ;
+C -1 ; WX 536 ; N ydieresis ; B 97 -192 624 765 ;
+C -1 ; WX 740 ; N Nacute ; B 75 0 801 949 ;
+C -1 ; WX 200 ; N icircumflex ; B 41 0 395 764 ;
+C -1 ; WX 536 ; N Ecircumflex ; B 70 0 612 927 ;
+C -1 ; WX 683 ; N adieresis ; B 88 -13 722 765 ;
+C -1 ; WX 650 ; N edieresis ; B 84 -13 664 765 ;
+C -1 ; WX 647 ; N cacute ; B 87 -13 678 786 ;
+C -1 ; WX 610 ; N nacute ; B 65 0 609 786 ;
+C -1 ; WX 608 ; N umacron ; B 100 -13 642 736 ;
+C -1 ; WX 740 ; N Ncaron ; B 75 0 801 927 ;
+C -1 ; WX 226 ; N Iacute ; B 76 0 439 949 ;
+C -1 ; WX 606 ; N plusminus ; B 47 -24 618 518 ;
+C -1 ; WX 672 ; N brokenbar ; B 272 -147 503 703 ;
+C -1 ; WX 747 ; N registered ; B 53 -12 830 752 ;
+C -1 ; WX 872 ; N Gbreve ; B 103 -13 891 917 ;
+C -1 ; WX 226 ; N Idotaccent ; B 76 0 322 928 ;
+C -1 ; WX 600 ; N summation ; B 15 -10 652 706 ;
+C -1 ; WX 536 ; N Egrave ; B 70 0 612 949 ;
+C -1 ; WX 301 ; N racute ; B 65 0 467 786 ;
+C -1 ; WX 655 ; N omacron ; B 88 -13 669 736 ;
+C -1 ; WX 480 ; N Zacute ; B 12 0 596 949 ;
+C -1 ; WX 480 ; N Zcaron ; B 12 0 596 927 ;
+C -1 ; WX 549 ; N greaterequal ; B 26 0 604 658 ;
+C -1 ; WX 790 ; N Eth ; B 104 0 813 740 ;
+C -1 ; WX 813 ; N Ccedilla ; B 105 -222 870 752 ;
+C -1 ; WX 200 ; N lcommaaccent ; B -43 -222 272 740 ;
+C -1 ; WX 359 ; N tcaron ; B 104 0 539 780 ;
+C -1 ; WX 650 ; N eogonek ; B 84 -191 664 561 ;
+C -1 ; WX 655 ; N Uogonek ; B 118 -191 716 740 ;
+C -1 ; WX 740 ; N Aacute ; B 12 0 729 949 ;
+C -1 ; WX 740 ; N Adieresis ; B 12 0 729 928 ;
+C -1 ; WX 650 ; N egrave ; B 84 -13 664 786 ;
+C -1 ; WX 425 ; N zacute ; B 10 0 498 786 ;
+C -1 ; WX 200 ; N iogonek ; B -8 -191 272 740 ;
+C -1 ; WX 869 ; N Oacute ; B 105 -13 901 949 ;
+C -1 ; WX 655 ; N oacute ; B 88 -13 669 786 ;
+C -1 ; WX 683 ; N amacron ; B 88 -13 722 736 ;
+C -1 ; WX 388 ; N sacute ; B 49 -13 451 786 ;
+C -1 ; WX 200 ; N idieresis ; B 65 0 353 765 ;
+C -1 ; WX 869 ; N Ocircumflex ; B 105 -13 901 927 ;
+C -1 ; WX 655 ; N Ugrave ; B 118 -13 716 949 ;
+C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ;
+C -1 ; WX 682 ; N thorn ; B 28 -192 699 740 ;
+C -1 ; WX 332 ; N twosuperior ; B 74 296 433 747 ;
+C -1 ; WX 869 ; N Odieresis ; B 105 -13 901 928 ;
+C -1 ; WX 608 ; N mu ; B 46 -184 628 547 ;
+C -1 ; WX 200 ; N igrave ; B 65 0 296 786 ;
+C -1 ; WX 655 ; N ohungarumlaut ; B 88 -13 715 786 ;
+C -1 ; WX 536 ; N Eogonek ; B 70 -191 612 740 ;
+C -1 ; WX 685 ; N dcroat ; B 85 -13 801 740 ;
+C -1 ; WX 831 ; N threequarters ; B 126 0 825 747 ;
+C -1 ; WX 498 ; N Scedilla ; B 57 -222 561 753 ;
+C -1 ; WX 260 ; N lcaron ; B 65 0 446 740 ;
+C -1 ; WX 591 ; N Kcommaaccent ; B 81 -202 728 740 ;
+C -1 ; WX 462 ; N Lacute ; B 82 0 518 949 ;
+C -1 ; WX 1000 ; N trademark ; B 137 296 953 740 ;
+C -1 ; WX 650 ; N edotaccent ; B 84 -13 664 765 ;
+C -1 ; WX 226 ; N Igrave ; B 76 0 340 949 ;
+C -1 ; WX 226 ; N Imacron ; B 76 0 423 899 ;
+C -1 ; WX 462 ; N Lcaron ; B 82 0 592 740 ;
+C -1 ; WX 831 ; N onehalf ; B 164 0 810 740 ;
+C -1 ; WX 549 ; N lessequal ; B 26 0 645 658 ;
+C -1 ; WX 655 ; N ocircumflex ; B 88 -13 669 764 ;
+C -1 ; WX 610 ; N ntilde ; B 65 0 609 754 ;
+C -1 ; WX 655 ; N Uhungarumlaut ; B 118 -13 725 949 ;
+C -1 ; WX 536 ; N Eacute ; B 70 0 612 949 ;
+C -1 ; WX 650 ; N emacron ; B 84 -13 664 736 ;
+C -1 ; WX 673 ; N gbreve ; B 56 -215 707 754 ;
+C -1 ; WX 831 ; N onequarter ; B 183 0 770 740 ;
+C -1 ; WX 498 ; N Scaron ; B 57 -13 593 927 ;
+C -1 ; WX 498 ; N Scommaaccent ; B 57 -222 561 753 ;
+C -1 ; WX 869 ; N Ohungarumlaut ; B 105 -13 901 949 ;
+C -1 ; WX 400 ; N degree ; B 158 421 451 709 ;
+C -1 ; WX 655 ; N ograve ; B 88 -13 669 786 ;
+C -1 ; WX 813 ; N Ccaron ; B 105 -13 870 927 ;
+C -1 ; WX 608 ; N ugrave ; B 100 -13 642 786 ;
+C -1 ; WX 453 ; N radical ; B 78 -58 585 756 ;
+C -1 ; WX 744 ; N Dcaron ; B 74 0 773 927 ;
+C -1 ; WX 301 ; N rcommaaccent ; B -33 -222 395 561 ;
+C -1 ; WX 740 ; N Ntilde ; B 75 0 801 917 ;
+C -1 ; WX 655 ; N otilde ; B 88 -13 669 754 ;
+C -1 ; WX 607 ; N Rcommaaccent ; B 70 -202 669 740 ;
+C -1 ; WX 462 ; N Lcommaaccent ; B 82 -222 474 740 ;
+C -1 ; WX 740 ; N Atilde ; B 12 0 729 917 ;
+C -1 ; WX 740 ; N Aogonek ; B 12 -191 729 740 ;
+C -1 ; WX 740 ; N Aring ; B 12 0 729 955 ;
+C -1 ; WX 869 ; N Otilde ; B 105 -13 901 917 ;
+C -1 ; WX 425 ; N zdotaccent ; B 10 0 498 765 ;
+C -1 ; WX 536 ; N Ecaron ; B 70 0 612 927 ;
+C -1 ; WX 226 ; N Iogonek ; B 1 -191 287 740 ;
+C -1 ; WX 502 ; N kcommaaccent ; B 70 -202 588 740 ;
+C -1 ; WX 606 ; N minus ; B 92 219 608 287 ;
+C -1 ; WX 226 ; N Icircumflex ; B 76 0 439 927 ;
+C -1 ; WX 610 ; N ncaron ; B 65 0 619 764 ;
+C -1 ; WX 339 ; N tcommaaccent ; B 27 -222 431 740 ;
+C -1 ; WX 606 ; N logicalnot ; B 110 109 627 388 ;
+C -1 ; WX 655 ; N odieresis ; B 88 -13 669 765 ;
+C -1 ; WX 608 ; N udieresis ; B 100 -13 642 765 ;
+C -1 ; WX 549 ; N notequal ; B 33 -29 610 541 ;
+C -1 ; WX 673 ; N gcommaaccent ; B 56 -215 707 786 ;
+C -1 ; WX 655 ; N eth ; B 88 -12 675 753 ;
+C -1 ; WX 425 ; N zcaron ; B 10 0 527 764 ;
+C -1 ; WX 610 ; N ncommaaccent ; B 65 -202 609 561 ;
+C -1 ; WX 332 ; N onesuperior ; B 190 296 335 740 ;
+C -1 ; WX 200 ; N imacron ; B 65 0 379 736 ;
+EndCharMetrics
+StartKernData
+StartKernPairs 922
+KPX A T -81
+KPX A Tcaron -81
+KPX A Tcommaaccent -81
+KPX A V -122
+KPX A W -95
+KPX A Y -122
+KPX A Yacute -122
+KPX A Ydieresis -122
+KPX A v -73
+KPX A w -65
+KPX A y -72
+KPX A yacute -72
+KPX A ydieresis -72
+KPX Aacute T -81
+KPX Aacute Tcaron -81
+KPX Aacute Tcommaaccent -81
+KPX Aacute V -122
+KPX Aacute W -95
+KPX Aacute Y -122
+KPX Aacute Yacute -122
+KPX Aacute Ydieresis -122
+KPX Aacute v -73
+KPX Aacute w -65
+KPX Aacute y -72
+KPX Aacute yacute -72
+KPX Aacute ydieresis -72
+KPX Abreve T -81
+KPX Abreve Tcaron -81
+KPX Abreve Tcommaaccent -81
+KPX Abreve V -122
+KPX Abreve W -95
+KPX Abreve Y -122
+KPX Abreve Yacute -122
+KPX Abreve Ydieresis -122
+KPX Abreve v -73
+KPX Abreve w -65
+KPX Abreve y -72
+KPX Abreve yacute -72
+KPX Abreve ydieresis -72
+KPX Acircumflex T -81
+KPX Acircumflex Tcaron -81
+KPX Acircumflex Tcommaaccent -81
+KPX Acircumflex V -122
+KPX Acircumflex W -95
+KPX Acircumflex Y -122
+KPX Acircumflex Yacute -122
+KPX Acircumflex Ydieresis -122
+KPX Acircumflex v -73
+KPX Acircumflex w -65
+KPX Acircumflex y -72
+KPX Acircumflex yacute -72
+KPX Acircumflex ydieresis -72
+KPX Adieresis T -81
+KPX Adieresis Tcaron -81
+KPX Adieresis Tcommaaccent -81
+KPX Adieresis V -122
+KPX Adieresis W -95
+KPX Adieresis Y -122
+KPX Adieresis Yacute -122
+KPX Adieresis Ydieresis -122
+KPX Adieresis v -73
+KPX Adieresis w -65
+KPX Adieresis y -72
+KPX Adieresis yacute -72
+KPX Adieresis ydieresis -72
+KPX Agrave T -81
+KPX Agrave Tcaron -81
+KPX Agrave Tcommaaccent -81
+KPX Agrave V -122
+KPX Agrave W -95
+KPX Agrave Y -122
+KPX Agrave Yacute -122
+KPX Agrave Ydieresis -122
+KPX Agrave v -73
+KPX Agrave w -65
+KPX Agrave y -72
+KPX Agrave yacute -72
+KPX Agrave ydieresis -72
+KPX Amacron T -81
+KPX Amacron Tcaron -81
+KPX Amacron Tcommaaccent -81
+KPX Amacron V -122
+KPX Amacron W -95
+KPX Amacron Y -122
+KPX Amacron Yacute -122
+KPX Amacron Ydieresis -122
+KPX Amacron v -73
+KPX Amacron w -65
+KPX Amacron y -72
+KPX Amacron yacute -72
+KPX Amacron ydieresis -72
+KPX Aogonek T -81
+KPX Aogonek Tcaron -81
+KPX Aogonek Tcommaaccent -81
+KPX Aogonek V -122
+KPX Aogonek W -95
+KPX Aogonek Y -122
+KPX Aogonek Yacute -122
+KPX Aogonek Ydieresis -122
+KPX Aogonek v -73
+KPX Aogonek w -65
+KPX Aogonek y -72
+KPX Aogonek yacute -72
+KPX Aogonek ydieresis -72
+KPX Aring T -81
+KPX Aring Tcaron -81
+KPX Aring Tcommaaccent -81
+KPX Aring V -122
+KPX Aring W -95
+KPX Aring Y -122
+KPX Aring Yacute -122
+KPX Aring Ydieresis -122
+KPX Aring v -73
+KPX Aring w -65
+KPX Aring y -72
+KPX Aring yacute -72
+KPX Aring ydieresis -72
+KPX Atilde T -81
+KPX Atilde Tcaron -81
+KPX Atilde Tcommaaccent -81
+KPX Atilde V -122
+KPX Atilde W -95
+KPX Atilde Y -122
+KPX Atilde Yacute -122
+KPX Atilde Ydieresis -122
+KPX Atilde v -73
+KPX Atilde w -65
+KPX Atilde y -72
+KPX Atilde yacute -72
+KPX Atilde ydieresis -72
+KPX F A -60
+KPX F Aacute -60
+KPX F Abreve -60
+KPX F Acircumflex -60
+KPX F Adieresis -60
+KPX F Agrave -60
+KPX F Amacron -60
+KPX F Aogonek -60
+KPX F Aring -60
+KPX F Atilde -60
+KPX F comma -122
+KPX F period -79
+KPX L T -46
+KPX L Tcaron -46
+KPX L Tcommaaccent -46
+KPX L V -113
+KPX L W -67
+KPX L Y -91
+KPX L Yacute -91
+KPX L Ydieresis -91
+KPX L y -23
+KPX L yacute -23
+KPX L ydieresis -23
+KPX Lacute T -46
+KPX Lacute Tcaron -46
+KPX Lacute Tcommaaccent -46
+KPX Lacute V -113
+KPX Lacute W -67
+KPX Lacute Y -91
+KPX Lacute Yacute -91
+KPX Lacute Ydieresis -91
+KPX Lacute y -23
+KPX Lacute yacute -23
+KPX Lacute ydieresis -23
+KPX Lcaron y -23
+KPX Lcaron yacute -23
+KPX Lcaron ydieresis -23
+KPX Lcommaaccent T -46
+KPX Lcommaaccent Tcaron -46
+KPX Lcommaaccent Tcommaaccent -46
+KPX Lcommaaccent V -113
+KPX Lcommaaccent W -67
+KPX Lcommaaccent Y -91
+KPX Lcommaaccent Yacute -91
+KPX Lcommaaccent Ydieresis -91
+KPX Lcommaaccent y -23
+KPX Lcommaaccent yacute -23
+KPX Lcommaaccent ydieresis -23
+KPX Lslash T -46
+KPX Lslash Tcaron -46
+KPX Lslash Tcommaaccent -46
+KPX Lslash V -113
+KPX Lslash W -67
+KPX Lslash Y -91
+KPX Lslash Yacute -91
+KPX Lslash Ydieresis -91
+KPX Lslash y -23
+KPX Lslash yacute -23
+KPX Lslash ydieresis -23
+KPX P A -74
+KPX P Aacute -74
+KPX P Abreve -74
+KPX P Acircumflex -74
+KPX P Adieresis -74
+KPX P Agrave -74
+KPX P Amacron -74
+KPX P Aogonek -74
+KPX P Aring -74
+KPX P Atilde -74
+KPX P comma -123
+KPX P period -91
+KPX R T 6
+KPX R Tcaron 6
+KPX R Tcommaaccent 6
+KPX R V -39
+KPX R W 2
+KPX R Y -20
+KPX R Yacute -20
+KPX R Ydieresis -20
+KPX R y 32
+KPX R yacute 32
+KPX R ydieresis 32
+KPX Racute T 6
+KPX Racute Tcaron 6
+KPX Racute Tcommaaccent 6
+KPX Racute V -39
+KPX Racute W 2
+KPX Racute Y -20
+KPX Racute Yacute -20
+KPX Racute Ydieresis -20
+KPX Racute y 32
+KPX Racute yacute 32
+KPX Racute ydieresis 32
+KPX Rcaron T 6
+KPX Rcaron Tcaron 6
+KPX Rcaron Tcommaaccent 6
+KPX Rcaron V -39
+KPX Rcaron W 2
+KPX Rcaron Y -20
+KPX Rcaron Yacute -20
+KPX Rcaron Ydieresis -20
+KPX Rcaron y 32
+KPX Rcaron yacute 32
+KPX Rcaron ydieresis 32
+KPX Rcommaaccent T 6
+KPX Rcommaaccent Tcaron 6
+KPX Rcommaaccent Tcommaaccent 6
+KPX Rcommaaccent V -39
+KPX Rcommaaccent W 2
+KPX Rcommaaccent Y -20
+KPX Rcommaaccent Yacute -20
+KPX Rcommaaccent Ydieresis -20
+KPX Rcommaaccent y 32
+KPX Rcommaaccent yacute 32
+KPX Rcommaaccent ydieresis 32
+KPX T A -81
+KPX T Aacute -81
+KPX T Abreve -81
+KPX T Acircumflex -81
+KPX T Adieresis -81
+KPX T Agrave -81
+KPX T Amacron -81
+KPX T Aogonek -81
+KPX T Aring -81
+KPX T Atilde -81
+KPX T a -52
+KPX T aacute -52
+KPX T abreve -52
+KPX T acircumflex -52
+KPX T adieresis -52
+KPX T agrave -52
+KPX T amacron -52
+KPX T aogonek -52
+KPX T aring -52
+KPX T atilde -52
+KPX T c -51
+KPX T cacute -51
+KPX T ccaron -51
+KPX T ccedilla -51
+KPX T colon 3
+KPX T comma -102
+KPX T e -49
+KPX T eacute -49
+KPX T ecaron -49
+KPX T ecircumflex -49
+KPX T edieresis -49
+KPX T edotaccent -49
+KPX T egrave -49
+KPX T emacron -49
+KPX T eogonek -49
+KPX T i 31
+KPX T iacute 31
+KPX T icircumflex 31
+KPX T idieresis 31
+KPX T igrave 31
+KPX T imacron 31
+KPX T iogonek 31
+KPX T o -49
+KPX T oacute -49
+KPX T ocircumflex -49
+KPX T odieresis -49
+KPX T ograve -49
+KPX T ohungarumlaut -49
+KPX T omacron -49
+KPX T oslash -49
+KPX T otilde -49
+KPX T period -71
+KPX T r -30
+KPX T racute -30
+KPX T rcaron -30
+KPX T rcommaaccent -30
+KPX T s -23
+KPX T sacute -23
+KPX T scedilla -23
+KPX T scommaaccent -23
+KPX T semicolon -29
+KPX T u -46
+KPX T uacute -46
+KPX T ucircumflex -46
+KPX T udieresis -46
+KPX T ugrave -46
+KPX T uhungarumlaut -46
+KPX T umacron -46
+KPX T uogonek -46
+KPX T uring -46
+KPX T w 7
+KPX T y 5
+KPX T yacute 5
+KPX T ydieresis 5
+KPX Tcaron A -81
+KPX Tcaron Aacute -81
+KPX Tcaron Abreve -81
+KPX Tcaron Acircumflex -81
+KPX Tcaron Adieresis -81
+KPX Tcaron Agrave -81
+KPX Tcaron Amacron -81
+KPX Tcaron Aogonek -81
+KPX Tcaron Aring -81
+KPX Tcaron Atilde -81
+KPX Tcaron a -52
+KPX Tcaron aacute -52
+KPX Tcaron abreve -52
+KPX Tcaron acircumflex -52
+KPX Tcaron adieresis -52
+KPX Tcaron agrave -52
+KPX Tcaron amacron -52
+KPX Tcaron aogonek -52
+KPX Tcaron aring -52
+KPX Tcaron atilde -52
+KPX Tcaron c -51
+KPX Tcaron cacute -51
+KPX Tcaron ccaron -51
+KPX Tcaron ccedilla -51
+KPX Tcaron colon 3
+KPX Tcaron comma -102
+KPX Tcaron e -49
+KPX Tcaron eacute -49
+KPX Tcaron ecaron -49
+KPX Tcaron ecircumflex -49
+KPX Tcaron edieresis -49
+KPX Tcaron edotaccent -49
+KPX Tcaron egrave -49
+KPX Tcaron emacron -49
+KPX Tcaron eogonek -49
+KPX Tcaron i 31
+KPX Tcaron iacute 31
+KPX Tcaron iogonek 31
+KPX Tcaron o -49
+KPX Tcaron oacute -49
+KPX Tcaron ocircumflex -49
+KPX Tcaron odieresis -49
+KPX Tcaron ograve -49
+KPX Tcaron ohungarumlaut -49
+KPX Tcaron omacron -49
+KPX Tcaron oslash -49
+KPX Tcaron otilde -49
+KPX Tcaron period -71
+KPX Tcaron r -30
+KPX Tcaron racute -30
+KPX Tcaron rcaron -30
+KPX Tcaron rcommaaccent -30
+KPX Tcaron s -23
+KPX Tcaron sacute -23
+KPX Tcaron scaron -23
+KPX Tcaron scedilla -23
+KPX Tcaron scommaaccent -23
+KPX Tcaron semicolon -29
+KPX Tcaron u -46
+KPX Tcaron uacute -46
+KPX Tcaron ucircumflex -46
+KPX Tcaron udieresis -46
+KPX Tcaron ugrave -46
+KPX Tcaron uhungarumlaut -46
+KPX Tcaron umacron -46
+KPX Tcaron uogonek -46
+KPX Tcaron uring -46
+KPX Tcaron w 7
+KPX Tcaron y 5
+KPX Tcaron yacute 5
+KPX Tcaron ydieresis 5
+KPX Tcommaaccent A -81
+KPX Tcommaaccent Aacute -81
+KPX Tcommaaccent Abreve -81
+KPX Tcommaaccent Acircumflex -81
+KPX Tcommaaccent Adieresis -81
+KPX Tcommaaccent Agrave -81
+KPX Tcommaaccent Amacron -81
+KPX Tcommaaccent Aogonek -81
+KPX Tcommaaccent Aring -81
+KPX Tcommaaccent Atilde -81
+KPX Tcommaaccent a -52
+KPX Tcommaaccent aacute -52
+KPX Tcommaaccent abreve -52
+KPX Tcommaaccent acircumflex -52
+KPX Tcommaaccent adieresis -52
+KPX Tcommaaccent agrave -52
+KPX Tcommaaccent amacron -52
+KPX Tcommaaccent aogonek -52
+KPX Tcommaaccent aring -52
+KPX Tcommaaccent atilde -52
+KPX Tcommaaccent c -51
+KPX Tcommaaccent cacute -51
+KPX Tcommaaccent ccaron -51
+KPX Tcommaaccent ccedilla -51
+KPX Tcommaaccent colon 3
+KPX Tcommaaccent comma -102
+KPX Tcommaaccent e -49
+KPX Tcommaaccent eacute -49
+KPX Tcommaaccent ecaron -49
+KPX Tcommaaccent ecircumflex -49
+KPX Tcommaaccent edieresis -49
+KPX Tcommaaccent edotaccent -49
+KPX Tcommaaccent egrave -49
+KPX Tcommaaccent emacron -49
+KPX Tcommaaccent eogonek -49
+KPX Tcommaaccent i 31
+KPX Tcommaaccent iacute 31
+KPX Tcommaaccent iogonek 31
+KPX Tcommaaccent o -49
+KPX Tcommaaccent oacute -49
+KPX Tcommaaccent ocircumflex -49
+KPX Tcommaaccent odieresis -49
+KPX Tcommaaccent ograve -49
+KPX Tcommaaccent ohungarumlaut -49
+KPX Tcommaaccent omacron -49
+KPX Tcommaaccent oslash -49
+KPX Tcommaaccent otilde -49
+KPX Tcommaaccent period -71
+KPX Tcommaaccent r -30
+KPX Tcommaaccent racute -30
+KPX Tcommaaccent rcaron -30
+KPX Tcommaaccent rcommaaccent -30
+KPX Tcommaaccent s -23
+KPX Tcommaaccent sacute -23
+KPX Tcommaaccent scedilla -23
+KPX Tcommaaccent scommaaccent -23
+KPX Tcommaaccent semicolon -29
+KPX Tcommaaccent u -46
+KPX Tcommaaccent uacute -46
+KPX Tcommaaccent ucircumflex -46
+KPX Tcommaaccent udieresis -46
+KPX Tcommaaccent ugrave -46
+KPX Tcommaaccent uhungarumlaut -46
+KPX Tcommaaccent umacron -46
+KPX Tcommaaccent uogonek -46
+KPX Tcommaaccent uring -46
+KPX Tcommaaccent w 7
+KPX Tcommaaccent y 5
+KPX Tcommaaccent yacute 5
+KPX Tcommaaccent ydieresis 5
+KPX V A -122
+KPX V Aacute -122
+KPX V Abreve -122
+KPX V Acircumflex -122
+KPX V Adieresis -122
+KPX V Agrave -122
+KPX V Amacron -122
+KPX V Aogonek -122
+KPX V Aring -122
+KPX V Atilde -122
+KPX V a -104
+KPX V aacute -104
+KPX V abreve -104
+KPX V acircumflex -104
+KPX V adieresis -104
+KPX V agrave -104
+KPX V amacron -104
+KPX V aogonek -104
+KPX V aring -104
+KPX V atilde -104
+KPX V colon -1
+KPX V comma -106
+KPX V e -101
+KPX V eacute -101
+KPX V ecaron -101
+KPX V ecircumflex -101
+KPX V edieresis -101
+KPX V edotaccent -101
+KPX V egrave -101
+KPX V emacron -101
+KPX V eogonek -101
+KPX V i 5
+KPX V iacute 5
+KPX V iogonek 5
+KPX V o -101
+KPX V oacute -101
+KPX V ocircumflex -101
+KPX V odieresis -101
+KPX V ograve -101
+KPX V ohungarumlaut -101
+KPX V omacron -101
+KPX V oslash -101
+KPX V otilde -101
+KPX V period -75
+KPX V r -40
+KPX V racute -40
+KPX V rcaron -40
+KPX V rcommaaccent -40
+KPX V semicolon -33
+KPX V u -40
+KPX V uacute -40
+KPX V ucircumflex -40
+KPX V udieresis -40
+KPX V ugrave -40
+KPX V uhungarumlaut -40
+KPX V umacron -40
+KPX V uogonek -40
+KPX V uring -40
+KPX V y -25
+KPX V yacute -25
+KPX V ydieresis -25
+KPX W A -73
+KPX W Aacute -73
+KPX W Abreve -73
+KPX W Acircumflex -73
+KPX W Adieresis -73
+KPX W Agrave -73
+KPX W Amacron -73
+KPX W Aogonek -73
+KPX W Aring -73
+KPX W Atilde -73
+KPX W a -50
+KPX W aacute -50
+KPX W abreve -50
+KPX W acircumflex -50
+KPX W adieresis -50
+KPX W agrave -50
+KPX W amacron -50
+KPX W aogonek -50
+KPX W aring -50
+KPX W atilde -50
+KPX W colon -1
+KPX W comma -106
+KPX W e -47
+KPX W eacute -47
+KPX W ecaron -47
+KPX W ecircumflex -47
+KPX W edieresis -47
+KPX W edotaccent -47
+KPX W egrave -47
+KPX W emacron -47
+KPX W eogonek -47
+KPX W i 6
+KPX W iacute 6
+KPX W icircumflex 16
+KPX W idieresis 16
+KPX W igrave 16
+KPX W imacron 16
+KPX W iogonek 6
+KPX W o -46
+KPX W oacute -46
+KPX W ocircumflex -46
+KPX W odieresis -46
+KPX W ograve -46
+KPX W ohungarumlaut -46
+KPX W omacron -46
+KPX W oslash -46
+KPX W otilde -46
+KPX W period -74
+KPX W r -29
+KPX W racute -29
+KPX W rcaron -29
+KPX W rcommaaccent -29
+KPX W semicolon -33
+KPX W u -30
+KPX W uacute -30
+KPX W ucircumflex -30
+KPX W udieresis -30
+KPX W ugrave -30
+KPX W uhungarumlaut -30
+KPX W umacron -30
+KPX W uogonek -30
+KPX W uring -30
+KPX W y -2
+KPX W yacute -2
+KPX W ydieresis -2
+KPX Y A -122
+KPX Y Aacute -122
+KPX Y Abreve -122
+KPX Y Acircumflex -122
+KPX Y Adieresis -122
+KPX Y Agrave -122
+KPX Y Amacron -122
+KPX Y Aogonek -122
+KPX Y Aring -122
+KPX Y Atilde -122
+KPX Y a -93
+KPX Y aacute -93
+KPX Y abreve -93
+KPX Y acircumflex -93
+KPX Y adieresis -93
+KPX Y agrave -93
+KPX Y amacron -93
+KPX Y aogonek -93
+KPX Y aring -93
+KPX Y atilde -93
+KPX Y colon 9
+KPX Y comma -97
+KPX Y e -89
+KPX Y eacute -89
+KPX Y ecaron -89
+KPX Y ecircumflex -89
+KPX Y edieresis -89
+KPX Y edotaccent -89
+KPX Y egrave -89
+KPX Y emacron -89
+KPX Y eogonek -89
+KPX Y i 13
+KPX Y iacute 13
+KPX Y icircumflex 23
+KPX Y idieresis 23
+KPX Y igrave 23
+KPX Y imacron 23
+KPX Y iogonek 13
+KPX Y o -89
+KPX Y oacute -89
+KPX Y ocircumflex -89
+KPX Y odieresis -89
+KPX Y ograve -89
+KPX Y ohungarumlaut -89
+KPX Y omacron -89
+KPX Y oslash -89
+KPX Y otilde -89
+KPX Y p -67
+KPX Y period -65
+KPX Y q -93
+KPX Y semicolon -23
+KPX Y u -69
+KPX Y uacute -69
+KPX Y ucircumflex -69
+KPX Y udieresis -69
+KPX Y ugrave -69
+KPX Y uhungarumlaut -69
+KPX Y umacron -69
+KPX Y uogonek -69
+KPX Y uring -69
+KPX Y v -17
+KPX Yacute A -122
+KPX Yacute Aacute -122
+KPX Yacute Abreve -122
+KPX Yacute Acircumflex -122
+KPX Yacute Adieresis -122
+KPX Yacute Agrave -122
+KPX Yacute Amacron -122
+KPX Yacute Aogonek -122
+KPX Yacute Aring -122
+KPX Yacute Atilde -122
+KPX Yacute a -93
+KPX Yacute aacute -93
+KPX Yacute abreve -93
+KPX Yacute acircumflex -93
+KPX Yacute adieresis -93
+KPX Yacute agrave -93
+KPX Yacute amacron -93
+KPX Yacute aogonek -93
+KPX Yacute aring -93
+KPX Yacute atilde -93
+KPX Yacute colon 9
+KPX Yacute comma -97
+KPX Yacute e -89
+KPX Yacute eacute -89
+KPX Yacute ecaron -89
+KPX Yacute ecircumflex -89
+KPX Yacute edieresis -89
+KPX Yacute edotaccent -89
+KPX Yacute egrave -89
+KPX Yacute emacron -89
+KPX Yacute eogonek -89
+KPX Yacute i 13
+KPX Yacute iacute 13
+KPX Yacute icircumflex 23
+KPX Yacute idieresis 23
+KPX Yacute igrave 23
+KPX Yacute imacron 23
+KPX Yacute iogonek 13
+KPX Yacute o -89
+KPX Yacute oacute -89
+KPX Yacute ocircumflex -89
+KPX Yacute odieresis -89
+KPX Yacute ograve -89
+KPX Yacute ohungarumlaut -89
+KPX Yacute omacron -89
+KPX Yacute oslash -89
+KPX Yacute otilde -89
+KPX Yacute p -67
+KPX Yacute period -65
+KPX Yacute q -93
+KPX Yacute semicolon -23
+KPX Yacute u -69
+KPX Yacute uacute -69
+KPX Yacute ucircumflex -69
+KPX Yacute udieresis -69
+KPX Yacute ugrave -69
+KPX Yacute uhungarumlaut -69
+KPX Yacute umacron -69
+KPX Yacute uogonek -69
+KPX Yacute uring -69
+KPX Yacute v -17
+KPX Ydieresis A -122
+KPX Ydieresis Aacute -122
+KPX Ydieresis Abreve -122
+KPX Ydieresis Acircumflex -122
+KPX Ydieresis Adieresis -122
+KPX Ydieresis Agrave -122
+KPX Ydieresis Amacron -122
+KPX Ydieresis Aogonek -122
+KPX Ydieresis Aring -122
+KPX Ydieresis Atilde -122
+KPX Ydieresis a -93
+KPX Ydieresis aacute -93
+KPX Ydieresis abreve -93
+KPX Ydieresis acircumflex -93
+KPX Ydieresis adieresis -93
+KPX Ydieresis agrave -93
+KPX Ydieresis amacron -93
+KPX Ydieresis aogonek -93
+KPX Ydieresis aring -93
+KPX Ydieresis atilde -93
+KPX Ydieresis colon 9
+KPX Ydieresis comma -97
+KPX Ydieresis e -89
+KPX Ydieresis eacute -89
+KPX Ydieresis ecaron -89
+KPX Ydieresis ecircumflex -89
+KPX Ydieresis edieresis -89
+KPX Ydieresis edotaccent -89
+KPX Ydieresis egrave -89
+KPX Ydieresis emacron -89
+KPX Ydieresis eogonek -89
+KPX Ydieresis i 13
+KPX Ydieresis iacute 13
+KPX Ydieresis icircumflex 23
+KPX Ydieresis idieresis 23
+KPX Ydieresis igrave 23
+KPX Ydieresis imacron 23
+KPX Ydieresis iogonek 13
+KPX Ydieresis o -89
+KPX Ydieresis oacute -89
+KPX Ydieresis ocircumflex -89
+KPX Ydieresis odieresis -89
+KPX Ydieresis ograve -89
+KPX Ydieresis ohungarumlaut -89
+KPX Ydieresis omacron -89
+KPX Ydieresis oslash -89
+KPX Ydieresis otilde -89
+KPX Ydieresis p -67
+KPX Ydieresis period -65
+KPX Ydieresis q -93
+KPX Ydieresis semicolon -23
+KPX Ydieresis u -69
+KPX Ydieresis uacute -69
+KPX Ydieresis ucircumflex -69
+KPX Ydieresis udieresis -69
+KPX Ydieresis ugrave -69
+KPX Ydieresis uhungarumlaut -69
+KPX Ydieresis umacron -69
+KPX Ydieresis uogonek -69
+KPX Ydieresis uring -69
+KPX Ydieresis v -17
+KPX f f 3
+KPX r c -7
+KPX r cacute -7
+KPX r ccaron -7
+KPX r ccedilla -7
+KPX r comma -105
+KPX r d -6
+KPX r dcroat -6
+KPX r e -4
+KPX r eacute -4
+KPX r ecaron -4
+KPX r ecircumflex -4
+KPX r edieresis -4
+KPX r edotaccent -4
+KPX r egrave -4
+KPX r emacron -4
+KPX r eogonek -4
+KPX r f 48
+KPX r g 1
+KPX r gbreve 1
+KPX r gcommaaccent 1
+KPX r h 29
+KPX r m 28
+KPX r n 21
+KPX r nacute 21
+KPX r ncaron 21
+KPX r ncommaaccent 21
+KPX r ntilde 21
+KPX r o -4
+KPX r oacute -4
+KPX r ocircumflex -4
+KPX r odieresis -4
+KPX r ograve -4
+KPX r ohungarumlaut -4
+KPX r omacron -4
+KPX r oslash -4
+KPX r otilde -4
+KPX r period -73
+KPX r q -8
+KPX racute c -7
+KPX racute cacute -7
+KPX racute ccaron -7
+KPX racute ccedilla -7
+KPX racute comma -105
+KPX racute d -6
+KPX racute dcroat -6
+KPX racute e -4
+KPX racute eacute -4
+KPX racute ecaron -4
+KPX racute ecircumflex -4
+KPX racute edieresis -4
+KPX racute edotaccent -4
+KPX racute egrave -4
+KPX racute emacron -4
+KPX racute eogonek -4
+KPX racute f 48
+KPX racute g 1
+KPX racute gbreve 1
+KPX racute gcommaaccent 1
+KPX racute h 29
+KPX racute m 28
+KPX racute n 21
+KPX racute nacute 21
+KPX racute ncaron 21
+KPX racute ncommaaccent 21
+KPX racute ntilde 21
+KPX racute o -4
+KPX racute oacute -4
+KPX racute ocircumflex -4
+KPX racute odieresis -4
+KPX racute ograve -4
+KPX racute ohungarumlaut -4
+KPX racute omacron -4
+KPX racute oslash -4
+KPX racute otilde -4
+KPX racute period -73
+KPX racute q -8
+KPX rcaron c -7
+KPX rcaron cacute -7
+KPX rcaron ccaron -7
+KPX rcaron ccedilla -7
+KPX rcaron comma -105
+KPX rcaron d -6
+KPX rcaron dcroat -6
+KPX rcaron e -4
+KPX rcaron eacute -4
+KPX rcaron ecaron -4
+KPX rcaron ecircumflex -4
+KPX rcaron edieresis -4
+KPX rcaron edotaccent -4
+KPX rcaron egrave -4
+KPX rcaron emacron -4
+KPX rcaron eogonek -4
+KPX rcaron f 48
+KPX rcaron g 1
+KPX rcaron gbreve 1
+KPX rcaron gcommaaccent 1
+KPX rcaron h 29
+KPX rcaron m 28
+KPX rcaron n 21
+KPX rcaron nacute 21
+KPX rcaron ncaron 21
+KPX rcaron ncommaaccent 21
+KPX rcaron ntilde 21
+KPX rcaron o -4
+KPX rcaron oacute -4
+KPX rcaron ocircumflex -4
+KPX rcaron odieresis -4
+KPX rcaron ograve -4
+KPX rcaron ohungarumlaut -4
+KPX rcaron omacron -4
+KPX rcaron oslash -4
+KPX rcaron otilde -4
+KPX rcaron period -73
+KPX rcaron q -8
+KPX rcommaaccent c -7
+KPX rcommaaccent cacute -7
+KPX rcommaaccent ccaron -7
+KPX rcommaaccent ccedilla -7
+KPX rcommaaccent comma -105
+KPX rcommaaccent d -6
+KPX rcommaaccent dcroat -6
+KPX rcommaaccent e -4
+KPX rcommaaccent eacute -4
+KPX rcommaaccent ecaron -4
+KPX rcommaaccent ecircumflex -4
+KPX rcommaaccent edieresis -4
+KPX rcommaaccent edotaccent -4
+KPX rcommaaccent egrave -4
+KPX rcommaaccent emacron -4
+KPX rcommaaccent eogonek -4
+KPX rcommaaccent f 48
+KPX rcommaaccent g 1
+KPX rcommaaccent gbreve 1
+KPX rcommaaccent gcommaaccent 1
+KPX rcommaaccent h 29
+KPX rcommaaccent m 28
+KPX rcommaaccent n 21
+KPX rcommaaccent nacute 21
+KPX rcommaaccent ncaron 21
+KPX rcommaaccent ncommaaccent 21
+KPX rcommaaccent ntilde 21
+KPX rcommaaccent o -4
+KPX rcommaaccent oacute -4
+KPX rcommaaccent ocircumflex -4
+KPX rcommaaccent odieresis -4
+KPX rcommaaccent ograve -4
+KPX rcommaaccent ohungarumlaut -4
+KPX rcommaaccent omacron -4
+KPX rcommaaccent oslash -4
+KPX rcommaaccent otilde -4
+KPX rcommaaccent period -73
+KPX rcommaaccent q -8
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/src/fonts/Adobe-Core35_AFMs-314/ITCAvantGarde-Demi.afm b/src/fonts/Adobe-Core35_AFMs-314/ITCAvantGarde-Demi.afm
new file mode 100644
index 0000000..ed71a3e
--- /dev/null
+++ b/src/fonts/Adobe-Core35_AFMs-314/ITCAvantGarde-Demi.afm
@@ -0,0 +1,1277 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1985, 1987, 1989, 1990, 1991, 1992, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Mon Jun 23 16:39:17 1997
+Comment UniqueID 43085
+Comment VMusage 35038 46063
+FontName AvantGarde-Demi
+FullName ITC Avant Garde Gothic Demi
+FamilyName ITC Avant Garde Gothic
+Weight Demi
+ItalicAngle 0
+IsFixedPitch false
+FontBBox -123 -251 1222 1021
+UnderlinePosition -100
+UnderlineThickness 50
+Version 002.000
+Notice Copyright (c) 1985, 1987, 1989, 1990, 1991, 1992, 1997 Adobe Systems Incorporated. All Rights Reserved.ITC Avant Garde Gothic is a registered trademark of International Typeface Corporation.
+EncodingScheme AdobeStandardEncoding
+CapHeight 740
+XHeight 555
+Ascender 740
+Descender -192
+StdHW 122
+StdVW 133
+StartCharMetrics 314
+C 32 ; WX 280 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 280 ; N exclam ; B 73 0 206 740 ;
+C 34 ; WX 360 ; N quotedbl ; B 19 444 341 740 ;
+C 35 ; WX 560 ; N numbersign ; B 29 0 525 700 ;
+C 36 ; WX 560 ; N dollar ; B 58 -86 501 857 ;
+C 37 ; WX 860 ; N percent ; B 36 -15 822 755 ;
+C 38 ; WX 680 ; N ampersand ; B 34 -15 665 755 ;
+C 39 ; WX 280 ; N quoteright ; B 72 466 205 740 ;
+C 40 ; WX 380 ; N parenleft ; B 74 -157 350 754 ;
+C 41 ; WX 380 ; N parenright ; B 37 -157 313 754 ;
+C 42 ; WX 440 ; N asterisk ; B 67 457 374 755 ;
+C 43 ; WX 600 ; N plus ; B 48 0 552 506 ;
+C 44 ; WX 280 ; N comma ; B 73 -141 206 133 ;
+C 45 ; WX 420 ; N hyphen ; B 71 230 349 348 ;
+C 46 ; WX 280 ; N period ; B 73 0 206 133 ;
+C 47 ; WX 460 ; N slash ; B 6 -100 454 740 ;
+C 48 ; WX 560 ; N zero ; B 32 -15 529 755 ;
+C 49 ; WX 560 ; N one ; B 137 0 363 740 ;
+C 50 ; WX 560 ; N two ; B 36 0 523 755 ;
+C 51 ; WX 560 ; N three ; B 28 -15 532 755 ;
+C 52 ; WX 560 ; N four ; B 15 0 545 740 ;
+C 53 ; WX 560 ; N five ; B 25 -15 535 740 ;
+C 54 ; WX 560 ; N six ; B 23 -15 536 739 ;
+C 55 ; WX 560 ; N seven ; B 62 0 498 740 ;
+C 56 ; WX 560 ; N eight ; B 33 -15 527 755 ;
+C 57 ; WX 560 ; N nine ; B 24 0 537 754 ;
+C 58 ; WX 280 ; N colon ; B 73 0 206 555 ;
+C 59 ; WX 280 ; N semicolon ; B 73 -141 206 555 ;
+C 60 ; WX 600 ; N less ; B 46 -8 554 514 ;
+C 61 ; WX 600 ; N equal ; B 48 81 552 425 ;
+C 62 ; WX 600 ; N greater ; B 46 -8 554 514 ;
+C 63 ; WX 560 ; N question ; B 38 0 491 755 ;
+C 64 ; WX 740 ; N at ; B 50 -12 750 712 ;
+C 65 ; WX 740 ; N A ; B 7 0 732 740 ;
+C 66 ; WX 580 ; N B ; B 70 0 551 740 ;
+C 67 ; WX 780 ; N C ; B 34 -15 766 755 ;
+C 68 ; WX 700 ; N D ; B 63 0 657 740 ;
+C 69 ; WX 520 ; N E ; B 61 0 459 740 ;
+C 70 ; WX 480 ; N F ; B 61 0 438 740 ;
+C 71 ; WX 840 ; N G ; B 27 -15 817 755 ;
+C 72 ; WX 680 ; N H ; B 71 0 610 740 ;
+C 73 ; WX 280 ; N I ; B 72 0 209 740 ;
+C 74 ; WX 480 ; N J ; B 2 -15 409 740 ;
+C 75 ; WX 620 ; N K ; B 89 0 620 740 ;
+C 76 ; WX 440 ; N L ; B 72 0 435 740 ;
+C 77 ; WX 900 ; N M ; B 63 0 837 740 ;
+C 78 ; WX 740 ; N N ; B 70 0 671 740 ;
+C 79 ; WX 840 ; N O ; B 33 -15 807 755 ;
+C 80 ; WX 560 ; N P ; B 72 0 545 740 ;
+C 81 ; WX 840 ; N Q ; B 32 -15 824 755 ;
+C 82 ; WX 580 ; N R ; B 64 0 565 740 ;
+C 83 ; WX 520 ; N S ; B 12 -15 493 755 ;
+C 84 ; WX 420 ; N T ; B 6 0 418 740 ;
+C 85 ; WX 640 ; N U ; B 55 -15 585 740 ;
+C 86 ; WX 700 ; N V ; B 8 0 695 740 ;
+C 87 ; WX 900 ; N W ; B 7 0 899 740 ;
+C 88 ; WX 680 ; N X ; B 4 0 676 740 ;
+C 89 ; WX 620 ; N Y ; B -2 0 622 740 ;
+C 90 ; WX 500 ; N Z ; B 19 0 481 740 ;
+C 91 ; WX 320 ; N bracketleft ; B 66 -157 284 754 ;
+C 92 ; WX 640 ; N backslash ; B 96 -100 544 740 ;
+C 93 ; WX 320 ; N bracketright ; B 36 -157 254 754 ;
+C 94 ; WX 600 ; N asciicircum ; B 73 375 527 740 ;
+C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;
+C 96 ; WX 280 ; N quoteleft ; B 72 466 205 740 ;
+C 97 ; WX 660 ; N a ; B 27 -18 613 574 ;
+C 98 ; WX 660 ; N b ; B 47 -18 632 740 ;
+C 99 ; WX 640 ; N c ; B 37 -18 610 574 ;
+C 100 ; WX 660 ; N d ; B 34 -18 618 740 ;
+C 101 ; WX 640 ; N e ; B 31 -18 610 574 ;
+C 102 ; WX 280 ; N f ; B 15 0 280 755 ; L i fi ; L l fl ;
+C 103 ; WX 660 ; N g ; B 32 -226 623 574 ;
+C 104 ; WX 600 ; N h ; B 54 0 546 740 ;
+C 105 ; WX 240 ; N i ; B 53 0 186 740 ;
+C 106 ; WX 260 ; N j ; B 16 -185 205 740 ;
+C 107 ; WX 580 ; N k ; B 80 0 571 740 ;
+C 108 ; WX 240 ; N l ; B 54 0 187 740 ;
+C 109 ; WX 940 ; N m ; B 54 0 887 574 ;
+C 110 ; WX 600 ; N n ; B 54 0 547 574 ;
+C 111 ; WX 640 ; N o ; B 25 -18 615 574 ;
+C 112 ; WX 660 ; N p ; B 47 -185 629 574 ;
+C 113 ; WX 660 ; N q ; B 31 -185 613 574 ;
+C 114 ; WX 320 ; N r ; B 63 0 317 574 ;
+C 115 ; WX 440 ; N s ; B 19 -18 421 574 ;
+C 116 ; WX 300 ; N t ; B 21 0 299 740 ;
+C 117 ; WX 600 ; N u ; B 50 -18 544 555 ;
+C 118 ; WX 560 ; N v ; B 3 0 556 555 ;
+C 119 ; WX 800 ; N w ; B 11 0 789 555 ;
+C 120 ; WX 560 ; N x ; B 3 0 556 555 ;
+C 121 ; WX 580 ; N y ; B 8 -185 571 555 ;
+C 122 ; WX 460 ; N z ; B 20 0 442 555 ;
+C 123 ; WX 340 ; N braceleft ; B -3 -191 317 747 ;
+C 124 ; WX 600 ; N bar ; B 233 -250 366 750 ;
+C 125 ; WX 340 ; N braceright ; B 23 -191 343 747 ;
+C 126 ; WX 600 ; N asciitilde ; B 67 160 533 347 ;
+C 161 ; WX 280 ; N exclamdown ; B 74 -185 207 555 ;
+C 162 ; WX 560 ; N cent ; B 43 39 517 715 ;
+C 163 ; WX 560 ; N sterling ; B -2 0 562 755 ;
+C 164 ; WX 160 ; N fraction ; B -123 0 282 740 ;
+C 165 ; WX 560 ; N yen ; B -10 0 570 740 ;
+C 166 ; WX 560 ; N florin ; B 0 -151 512 824 ;
+C 167 ; WX 560 ; N section ; B 28 -158 530 755 ;
+C 168 ; WX 560 ; N currency ; B 27 69 534 577 ;
+C 169 ; WX 220 ; N quotesingle ; B 44 444 177 740 ;
+C 170 ; WX 480 ; N quotedblleft ; B 70 466 410 740 ;
+C 171 ; WX 460 ; N guillemotleft ; B 61 108 400 469 ;
+C 172 ; WX 240 ; N guilsinglleft ; B 50 108 190 469 ;
+C 173 ; WX 240 ; N guilsinglright ; B 50 108 190 469 ;
+C 174 ; WX 520 ; N fi ; B 25 0 461 755 ;
+C 175 ; WX 520 ; N fl ; B 25 0 461 755 ;
+C 177 ; WX 500 ; N endash ; B 35 230 465 348 ;
+C 178 ; WX 560 ; N dagger ; B 51 -142 509 740 ;
+C 179 ; WX 560 ; N daggerdbl ; B 51 -142 509 740 ;
+C 180 ; WX 280 ; N periodcentered ; B 73 187 206 320 ;
+C 182 ; WX 600 ; N paragraph ; B -7 -103 607 740 ;
+C 183 ; WX 600 ; N bullet ; B 148 222 453 532 ;
+C 184 ; WX 280 ; N quotesinglbase ; B 72 -141 205 133 ;
+C 185 ; WX 480 ; N quotedblbase ; B 70 -141 410 133 ;
+C 186 ; WX 480 ; N quotedblright ; B 70 466 410 740 ;
+C 187 ; WX 460 ; N guillemotright ; B 61 108 400 469 ;
+C 188 ; WX 1000 ; N ellipsis ; B 100 0 899 133 ;
+C 189 ; WX 1280 ; N perthousand ; B 36 -15 1222 755 ;
+C 191 ; WX 560 ; N questiondown ; B 68 -200 521 555 ;
+C 193 ; WX 420 ; N grave ; B 50 624 329 851 ;
+C 194 ; WX 420 ; N acute ; B 89 624 368 851 ;
+C 195 ; WX 540 ; N circumflex ; B 71 636 470 774 ;
+C 196 ; WX 480 ; N tilde ; B 44 636 437 767 ;
+C 197 ; WX 420 ; N macron ; B 72 648 349 759 ;
+C 198 ; WX 480 ; N breve ; B 42 633 439 770 ;
+C 199 ; WX 280 ; N dotaccent ; B 74 636 207 769 ;
+C 200 ; WX 500 ; N dieresis ; B 78 636 422 769 ;
+C 202 ; WX 360 ; N ring ; B 73 619 288 834 ;
+C 203 ; WX 340 ; N cedilla ; B 98 -251 298 6 ;
+C 205 ; WX 700 ; N hungarumlaut ; B 120 610 626 849 ;
+C 206 ; WX 340 ; N ogonek ; B 79 -195 262 9 ;
+C 207 ; WX 540 ; N caron ; B 71 636 470 774 ;
+C 208 ; WX 1000 ; N emdash ; B 35 230 965 348 ;
+C 225 ; WX 900 ; N AE ; B -5 0 824 740 ;
+C 227 ; WX 360 ; N ordfeminine ; B 19 438 334 755 ;
+C 232 ; WX 480 ; N Lslash ; B 26 0 460 740 ;
+C 233 ; WX 840 ; N Oslash ; B 33 -71 807 814 ;
+C 234 ; WX 1060 ; N OE ; B 37 -15 1007 755 ;
+C 235 ; WX 360 ; N ordmasculine ; B 23 438 338 755 ;
+C 241 ; WX 1080 ; N ae ; B 29 -18 1049 574 ;
+C 245 ; WX 240 ; N dotlessi ; B 53 0 186 555 ;
+C 248 ; WX 320 ; N lslash ; B 34 0 305 740 ;
+C 249 ; WX 660 ; N oslash ; B 35 -50 625 608 ;
+C 250 ; WX 1080 ; N oe ; B 30 -18 1050 574 ;
+C 251 ; WX 600 ; N germandbls ; B 51 -18 585 755 ;
+C -1 ; WX 280 ; N Idieresis ; B -32 0 312 939 ;
+C -1 ; WX 640 ; N eacute ; B 31 -18 610 851 ;
+C -1 ; WX 660 ; N abreve ; B 27 -18 613 770 ;
+C -1 ; WX 600 ; N uhungarumlaut ; B 50 -18 576 849 ;
+C -1 ; WX 640 ; N ecaron ; B 31 -18 610 774 ;
+C -1 ; WX 620 ; N Ydieresis ; B -2 0 622 939 ;
+C -1 ; WX 600 ; N divide ; B 48 -20 552 526 ;
+C -1 ; WX 620 ; N Yacute ; B -2 0 622 1021 ;
+C -1 ; WX 740 ; N Acircumflex ; B 7 0 732 944 ;
+C -1 ; WX 660 ; N aacute ; B 27 -18 613 851 ;
+C -1 ; WX 640 ; N Ucircumflex ; B 55 -15 585 944 ;
+C -1 ; WX 580 ; N yacute ; B 8 -185 571 851 ;
+C -1 ; WX 440 ; N scommaaccent ; B 19 -229 421 574 ;
+C -1 ; WX 640 ; N ecircumflex ; B 31 -18 610 774 ;
+C -1 ; WX 640 ; N Uring ; B 55 -15 585 969 ;
+C -1 ; WX 640 ; N Udieresis ; B 55 -15 585 939 ;
+C -1 ; WX 660 ; N aogonek ; B 27 -195 613 574 ;
+C -1 ; WX 640 ; N Uacute ; B 55 -15 585 1021 ;
+C -1 ; WX 600 ; N uogonek ; B 50 -195 544 555 ;
+C -1 ; WX 520 ; N Edieresis ; B 61 0 459 939 ;
+C -1 ; WX 742 ; N Dcroat ; B 25 0 691 740 ;
+C -1 ; WX 351 ; N commaaccent ; B 48 -229 223 -54 ;
+C -1 ; WX 740 ; N copyright ; B -12 -12 752 752 ;
+C -1 ; WX 520 ; N Emacron ; B 61 0 459 944 ;
+C -1 ; WX 640 ; N ccaron ; B 37 -18 610 774 ;
+C -1 ; WX 660 ; N aring ; B 27 -18 613 834 ;
+C -1 ; WX 740 ; N Ncommaaccent ; B 70 -209 671 740 ;
+C -1 ; WX 240 ; N lacute ; B -1 0 278 1011 ;
+C -1 ; WX 660 ; N agrave ; B 27 -18 613 851 ;
+C -1 ; WX 420 ; N Tcommaaccent ; B 6 -229 418 740 ;
+C -1 ; WX 780 ; N Cacute ; B 34 -15 766 1021 ;
+C -1 ; WX 660 ; N atilde ; B 27 -18 613 767 ;
+C -1 ; WX 520 ; N Edotaccent ; B 61 0 459 954 ;
+C -1 ; WX 440 ; N scaron ; B 19 -18 421 774 ;
+C -1 ; WX 440 ; N scedilla ; B 19 -251 421 574 ;
+C -1 ; WX 240 ; N iacute ; B 24 0 303 851 ;
+C -1 ; WX 494 ; N lozenge ; B 10 0 484 745 ;
+C -1 ; WX 580 ; N Rcaron ; B 64 0 565 959 ;
+C -1 ; WX 840 ; N Gcommaaccent ; B 27 -229 817 755 ;
+C -1 ; WX 600 ; N ucircumflex ; B 50 -18 544 774 ;
+C -1 ; WX 660 ; N acircumflex ; B 27 -18 613 774 ;
+C -1 ; WX 740 ; N Amacron ; B 7 0 732 944 ;
+C -1 ; WX 320 ; N rcaron ; B -39 0 360 774 ;
+C -1 ; WX 640 ; N ccedilla ; B 37 -251 610 574 ;
+C -1 ; WX 500 ; N Zdotaccent ; B 19 0 481 954 ;
+C -1 ; WX 560 ; N Thorn ; B 72 0 545 740 ;
+C -1 ; WX 840 ; N Omacron ; B 33 -15 807 944 ;
+C -1 ; WX 580 ; N Racute ; B 64 0 565 1021 ;
+C -1 ; WX 520 ; N Sacute ; B 12 -15 493 1021 ;
+C -1 ; WX 800 ; N dcaron ; B 34 -18 828 740 ;
+C -1 ; WX 640 ; N Umacron ; B 55 -15 585 944 ;
+C -1 ; WX 600 ; N uring ; B 50 -18 544 834 ;
+C -1 ; WX 336 ; N threesuperior ; B 8 287 328 749 ;
+C -1 ; WX 840 ; N Ograve ; B 33 -15 807 1021 ;
+C -1 ; WX 740 ; N Agrave ; B 7 0 732 1021 ;
+C -1 ; WX 740 ; N Abreve ; B 7 0 732 955 ;
+C -1 ; WX 600 ; N multiply ; B 59 12 541 494 ;
+C -1 ; WX 600 ; N uacute ; B 50 -18 544 851 ;
+C -1 ; WX 420 ; N Tcaron ; B 6 0 418 959 ;
+C -1 ; WX 494 ; N partialdiff ; B 11 -21 494 750 ;
+C -1 ; WX 580 ; N ydieresis ; B 8 -185 571 769 ;
+C -1 ; WX 740 ; N Nacute ; B 70 0 671 1021 ;
+C -1 ; WX 240 ; N icircumflex ; B -79 0 320 774 ;
+C -1 ; WX 520 ; N Ecircumflex ; B 61 0 460 944 ;
+C -1 ; WX 660 ; N adieresis ; B 27 -18 613 769 ;
+C -1 ; WX 640 ; N edieresis ; B 31 -18 610 769 ;
+C -1 ; WX 640 ; N cacute ; B 37 -18 610 851 ;
+C -1 ; WX 600 ; N nacute ; B 54 0 547 851 ;
+C -1 ; WX 600 ; N umacron ; B 50 -18 544 759 ;
+C -1 ; WX 740 ; N Ncaron ; B 70 0 671 959 ;
+C -1 ; WX 280 ; N Iacute ; B 44 0 323 1021 ;
+C -1 ; WX 600 ; N plusminus ; B 48 -62 552 556 ;
+C -1 ; WX 600 ; N brokenbar ; B 233 -175 366 675 ;
+C -1 ; WX 740 ; N registered ; B -12 -12 752 752 ;
+C -1 ; WX 840 ; N Gbreve ; B 27 -15 817 955 ;
+C -1 ; WX 280 ; N Idotaccent ; B 72 0 209 954 ;
+C -1 ; WX 713 ; N summation ; B 14 -108 695 752 ;
+C -1 ; WX 520 ; N Egrave ; B 61 0 459 1021 ;
+C -1 ; WX 320 ; N racute ; B 63 0 348 851 ;
+C -1 ; WX 640 ; N omacron ; B 25 -18 615 759 ;
+C -1 ; WX 500 ; N Zacute ; B 19 0 481 1021 ;
+C -1 ; WX 500 ; N Zcaron ; B 19 0 481 944 ;
+C -1 ; WX 549 ; N greaterequal ; B 26 0 523 704 ;
+C -1 ; WX 742 ; N Eth ; B 25 0 691 740 ;
+C -1 ; WX 780 ; N Ccedilla ; B 34 -251 766 755 ;
+C -1 ; WX 240 ; N lcommaaccent ; B -7 -229 187 740 ;
+C -1 ; WX 400 ; N tcaron ; B 21 0 438 786 ;
+C -1 ; WX 640 ; N eogonek ; B 31 -195 610 574 ;
+C -1 ; WX 640 ; N Uogonek ; B 55 -195 585 740 ;
+C -1 ; WX 740 ; N Aacute ; B 7 0 732 1021 ;
+C -1 ; WX 740 ; N Adieresis ; B 7 0 732 939 ;
+C -1 ; WX 640 ; N egrave ; B 31 -18 610 851 ;
+C -1 ; WX 460 ; N zacute ; B 20 0 442 851 ;
+C -1 ; WX 240 ; N iogonek ; B -14 -195 186 740 ;
+C -1 ; WX 840 ; N Oacute ; B 33 -15 807 1021 ;
+C -1 ; WX 640 ; N oacute ; B 25 -18 615 851 ;
+C -1 ; WX 660 ; N amacron ; B 27 -18 613 759 ;
+C -1 ; WX 440 ; N sacute ; B 19 -18 421 851 ;
+C -1 ; WX 240 ; N idieresis ; B -52 0 292 769 ;
+C -1 ; WX 840 ; N Ocircumflex ; B 33 -15 807 944 ;
+C -1 ; WX 640 ; N Ugrave ; B 55 -15 585 1021 ;
+C -1 ; WX 612 ; N Delta ; B 2 0 612 692 ;
+C -1 ; WX 660 ; N thorn ; B 47 -185 629 740 ;
+C -1 ; WX 336 ; N twosuperior ; B 13 296 322 749 ;
+C -1 ; WX 840 ; N Odieresis ; B 33 -15 807 939 ;
+C -1 ; WX 576 ; N mu ; B 38 -187 539 555 ;
+C -1 ; WX 240 ; N igrave ; B -65 0 214 851 ;
+C -1 ; WX 640 ; N ohungarumlaut ; B 25 -18 615 849 ;
+C -1 ; WX 520 ; N Eogonek ; B 61 -195 459 740 ;
+C -1 ; WX 660 ; N dcroat ; B 34 -18 700 740 ;
+C -1 ; WX 840 ; N threequarters ; B 18 0 803 749 ;
+C -1 ; WX 520 ; N Scedilla ; B 12 -251 493 755 ;
+C -1 ; WX 380 ; N lcaron ; B 54 0 398 740 ;
+C -1 ; WX 620 ; N Kcommaaccent ; B 89 -209 620 740 ;
+C -1 ; WX 440 ; N Lacute ; B 72 0 435 1021 ;
+C -1 ; WX 1000 ; N trademark ; B 9 296 821 740 ;
+C -1 ; WX 640 ; N edotaccent ; B 31 -18 610 769 ;
+C -1 ; WX 280 ; N Igrave ; B -45 0 234 1021 ;
+C -1 ; WX 280 ; N Imacron ; B 2 0 279 944 ;
+C -1 ; WX 440 ; N Lcaron ; B 72 0 488 740 ;
+C -1 ; WX 840 ; N onehalf ; B 62 0 771 740 ;
+C -1 ; WX 549 ; N lessequal ; B 29 0 526 704 ;
+C -1 ; WX 640 ; N ocircumflex ; B 25 -18 615 774 ;
+C -1 ; WX 600 ; N ntilde ; B 54 0 547 767 ;
+C -1 ; WX 640 ; N Uhungarumlaut ; B 55 -15 596 1019 ;
+C -1 ; WX 520 ; N Eacute ; B 61 0 459 1021 ;
+C -1 ; WX 640 ; N emacron ; B 31 -18 610 759 ;
+C -1 ; WX 660 ; N gbreve ; B 32 -226 623 770 ;
+C -1 ; WX 840 ; N onequarter ; B 92 0 746 740 ;
+C -1 ; WX 520 ; N Scaron ; B 12 -15 493 944 ;
+C -1 ; WX 520 ; N Scommaaccent ; B 12 -229 493 755 ;
+C -1 ; WX 840 ; N Ohungarumlaut ; B 33 -15 807 1019 ;
+C -1 ; WX 400 ; N degree ; B 57 426 343 712 ;
+C -1 ; WX 640 ; N ograve ; B 25 -18 615 851 ;
+C -1 ; WX 780 ; N Ccaron ; B 34 -15 766 959 ;
+C -1 ; WX 600 ; N ugrave ; B 50 -18 544 851 ;
+C -1 ; WX 549 ; N radical ; B 10 -46 512 850 ;
+C -1 ; WX 700 ; N Dcaron ; B 63 0 657 959 ;
+C -1 ; WX 320 ; N rcommaaccent ; B -8 -229 317 574 ;
+C -1 ; WX 740 ; N Ntilde ; B 70 0 671 937 ;
+C -1 ; WX 640 ; N otilde ; B 25 -18 615 767 ;
+C -1 ; WX 580 ; N Rcommaaccent ; B 64 -209 565 740 ;
+C -1 ; WX 440 ; N Lcommaaccent ; B 72 -229 435 740 ;
+C -1 ; WX 740 ; N Atilde ; B 7 0 732 937 ;
+C -1 ; WX 740 ; N Aogonek ; B 7 -195 732 740 ;
+C -1 ; WX 740 ; N Aring ; B 7 0 732 969 ;
+C -1 ; WX 840 ; N Otilde ; B 33 -15 807 937 ;
+C -1 ; WX 460 ; N zdotaccent ; B 20 0 442 769 ;
+C -1 ; WX 520 ; N Ecaron ; B 61 0 460 959 ;
+C -1 ; WX 280 ; N Iogonek ; B 11 -195 209 740 ;
+C -1 ; WX 580 ; N kcommaaccent ; B 80 -209 571 740 ;
+C -1 ; WX 600 ; N minus ; B 48 193 552 313 ;
+C -1 ; WX 280 ; N Icircumflex ; B -59 0 340 944 ;
+C -1 ; WX 600 ; N ncaron ; B 54 0 547 774 ;
+C -1 ; WX 300 ; N tcommaaccent ; B 21 -229 299 740 ;
+C -1 ; WX 600 ; N logicalnot ; B 48 108 552 425 ;
+C -1 ; WX 640 ; N odieresis ; B 25 -18 615 769 ;
+C -1 ; WX 600 ; N udieresis ; B 50 -18 544 769 ;
+C -1 ; WX 549 ; N notequal ; B 15 -49 540 570 ;
+C -1 ; WX 660 ; N gcommaaccent ; B 32 -226 623 800 ;
+C -1 ; WX 640 ; N eth ; B 27 -18 616 754 ;
+C -1 ; WX 460 ; N zcaron ; B 20 0 455 774 ;
+C -1 ; WX 600 ; N ncommaaccent ; B 54 -209 547 574 ;
+C -1 ; WX 336 ; N onesuperior ; B 72 296 223 740 ;
+C -1 ; WX 240 ; N imacron ; B -18 0 259 759 ;
+EndCharMetrics
+StartKernData
+StartKernPairs 933
+KPX A T -73
+KPX A Tcaron -73
+KPX A Tcommaaccent -73
+KPX A V -127
+KPX A W -96
+KPX A Y -139
+KPX A Yacute -139
+KPX A Ydieresis -139
+KPX A v -50
+KPX A w -50
+KPX A y -50
+KPX A yacute -50
+KPX A ydieresis -50
+KPX Aacute T -73
+KPX Aacute Tcaron -73
+KPX Aacute Tcommaaccent -73
+KPX Aacute V -127
+KPX Aacute W -96
+KPX Aacute Y -139
+KPX Aacute Yacute -139
+KPX Aacute Ydieresis -139
+KPX Aacute v -50
+KPX Aacute w -50
+KPX Aacute y -50
+KPX Aacute yacute -50
+KPX Aacute ydieresis -50
+KPX Abreve T -73
+KPX Abreve Tcaron -73
+KPX Abreve Tcommaaccent -73
+KPX Abreve V -127
+KPX Abreve W -96
+KPX Abreve Y -139
+KPX Abreve Yacute -139
+KPX Abreve Ydieresis -139
+KPX Abreve v -50
+KPX Abreve w -50
+KPX Abreve y -50
+KPX Abreve yacute -50
+KPX Abreve ydieresis -50
+KPX Acircumflex T -73
+KPX Acircumflex Tcaron -73
+KPX Acircumflex Tcommaaccent -73
+KPX Acircumflex V -127
+KPX Acircumflex W -96
+KPX Acircumflex Y -139
+KPX Acircumflex Yacute -139
+KPX Acircumflex Ydieresis -139
+KPX Acircumflex v -50
+KPX Acircumflex w -50
+KPX Acircumflex y -50
+KPX Acircumflex yacute -50
+KPX Acircumflex ydieresis -50
+KPX Adieresis T -73
+KPX Adieresis Tcaron -73
+KPX Adieresis Tcommaaccent -73
+KPX Adieresis V -127
+KPX Adieresis W -96
+KPX Adieresis Y -139
+KPX Adieresis Yacute -139
+KPX Adieresis Ydieresis -139
+KPX Adieresis v -50
+KPX Adieresis w -50
+KPX Adieresis y -50
+KPX Adieresis yacute -50
+KPX Adieresis ydieresis -50
+KPX Agrave T -73
+KPX Agrave Tcaron -73
+KPX Agrave Tcommaaccent -73
+KPX Agrave V -127
+KPX Agrave W -96
+KPX Agrave Y -139
+KPX Agrave Yacute -139
+KPX Agrave Ydieresis -139
+KPX Agrave v -50
+KPX Agrave w -50
+KPX Agrave y -50
+KPX Agrave yacute -50
+KPX Agrave ydieresis -50
+KPX Amacron T -73
+KPX Amacron Tcaron -73
+KPX Amacron Tcommaaccent -73
+KPX Amacron V -127
+KPX Amacron W -96
+KPX Amacron Y -139
+KPX Amacron Yacute -139
+KPX Amacron Ydieresis -139
+KPX Amacron v -50
+KPX Amacron w -50
+KPX Amacron y -50
+KPX Amacron yacute -50
+KPX Amacron ydieresis -50
+KPX Aogonek T -73
+KPX Aogonek Tcaron -73
+KPX Aogonek Tcommaaccent -73
+KPX Aogonek V -127
+KPX Aogonek W -96
+KPX Aogonek Y -139
+KPX Aogonek Yacute -139
+KPX Aogonek Ydieresis -139
+KPX Aogonek v -50
+KPX Aogonek w -50
+KPX Aogonek y -50
+KPX Aogonek yacute -50
+KPX Aogonek ydieresis -50
+KPX Aring T -73
+KPX Aring Tcaron -73
+KPX Aring Tcommaaccent -73
+KPX Aring V -127
+KPX Aring W -96
+KPX Aring Y -139
+KPX Aring Yacute -139
+KPX Aring Ydieresis -139
+KPX Aring v -50
+KPX Aring w -50
+KPX Aring y -50
+KPX Aring yacute -50
+KPX Aring ydieresis -50
+KPX Atilde T -73
+KPX Atilde Tcaron -73
+KPX Atilde Tcommaaccent -73
+KPX Atilde V -127
+KPX Atilde W -96
+KPX Atilde Y -139
+KPX Atilde Yacute -139
+KPX Atilde Ydieresis -139
+KPX Atilde v -50
+KPX Atilde w -50
+KPX Atilde y -50
+KPX Atilde yacute -50
+KPX Atilde ydieresis -50
+KPX F A -95
+KPX F Aacute -95
+KPX F Abreve -95
+KPX F Acircumflex -95
+KPX F Adieresis -95
+KPX F Agrave -95
+KPX F Amacron -95
+KPX F Aogonek -95
+KPX F Aring -95
+KPX F Atilde -95
+KPX F comma -42
+KPX F period -42
+KPX L T -50
+KPX L Tcaron -50
+KPX L Tcommaaccent -50
+KPX L V -90
+KPX L W -90
+KPX L Y -90
+KPX L Yacute -90
+KPX L Ydieresis -90
+KPX L y -75
+KPX L yacute -75
+KPX L ydieresis -75
+KPX Lacute T -50
+KPX Lacute Tcaron -50
+KPX Lacute Tcommaaccent -50
+KPX Lacute V -90
+KPX Lacute W -90
+KPX Lacute Y -90
+KPX Lacute Yacute -90
+KPX Lacute Ydieresis -90
+KPX Lacute y -75
+KPX Lacute yacute -75
+KPX Lacute ydieresis -75
+KPX Lcommaaccent T -50
+KPX Lcommaaccent Tcaron -50
+KPX Lcommaaccent Tcommaaccent -50
+KPX Lcommaaccent V -90
+KPX Lcommaaccent W -90
+KPX Lcommaaccent Y -90
+KPX Lcommaaccent Yacute -90
+KPX Lcommaaccent Ydieresis -90
+KPX Lcommaaccent y -75
+KPX Lcommaaccent yacute -75
+KPX Lcommaaccent ydieresis -75
+KPX Lslash T -50
+KPX Lslash Tcaron -50
+KPX Lslash Tcommaaccent -50
+KPX Lslash V -90
+KPX Lslash W -90
+KPX Lslash Y -90
+KPX Lslash Yacute -90
+KPX Lslash Ydieresis -90
+KPX Lslash y -75
+KPX Lslash yacute -75
+KPX Lslash ydieresis -75
+KPX P A -100
+KPX P Aacute -100
+KPX P Abreve -100
+KPX P Acircumflex -100
+KPX P Adieresis -100
+KPX P Agrave -100
+KPX P Amacron -100
+KPX P Aogonek -100
+KPX P Aring -100
+KPX P Atilde -100
+KPX P comma -16
+KPX P period -16
+KPX R T 16
+KPX R Tcaron 16
+KPX R Tcommaaccent 16
+KPX R V -26
+KPX R W -20
+KPX R Y -20
+KPX R Yacute -20
+KPX R Ydieresis -20
+KPX R y 31
+KPX R yacute 31
+KPX R ydieresis 31
+KPX Racute T 16
+KPX Racute Tcaron 16
+KPX Racute Tcommaaccent 16
+KPX Racute V -26
+KPX Racute W -20
+KPX Racute Y -20
+KPX Racute Yacute -20
+KPX Racute Ydieresis -20
+KPX Racute y 31
+KPX Racute yacute 31
+KPX Racute ydieresis 31
+KPX Rcaron T 16
+KPX Rcaron Tcaron 16
+KPX Rcaron Tcommaaccent 16
+KPX Rcaron V -26
+KPX Rcaron W -20
+KPX Rcaron Y -20
+KPX Rcaron Yacute -20
+KPX Rcaron Ydieresis -20
+KPX Rcaron y 31
+KPX Rcaron yacute 31
+KPX Rcaron ydieresis 31
+KPX Rcommaaccent T 16
+KPX Rcommaaccent Tcaron 16
+KPX Rcommaaccent Tcommaaccent 16
+KPX Rcommaaccent V -26
+KPX Rcommaaccent W -20
+KPX Rcommaaccent Y -20
+KPX Rcommaaccent Yacute -20
+KPX Rcommaaccent Ydieresis -20
+KPX Rcommaaccent y 31
+KPX Rcommaaccent yacute 31
+KPX Rcommaaccent ydieresis 31
+KPX T A -70
+KPX T Aacute -70
+KPX T Abreve -70
+KPX T Acircumflex -70
+KPX T Adieresis -70
+KPX T Agrave -70
+KPX T Amacron -70
+KPX T Aogonek -70
+KPX T Aring -70
+KPX T Atilde -70
+KPX T a -40
+KPX T aacute -40
+KPX T abreve -40
+KPX T acircumflex -40
+KPX T adieresis -40
+KPX T agrave -40
+KPX T amacron -40
+KPX T aogonek -40
+KPX T aring -40
+KPX T atilde -40
+KPX T c -50
+KPX T cacute -50
+KPX T ccaron -50
+KPX T ccedilla -50
+KPX T colon -12
+KPX T comma 4
+KPX T e -50
+KPX T eacute -50
+KPX T ecaron -50
+KPX T ecircumflex -50
+KPX T edieresis -50
+KPX T edotaccent -50
+KPX T egrave -50
+KPX T emacron -50
+KPX T eogonek -50
+KPX T hyphen -10
+KPX T i -5
+KPX T iacute 10
+KPX T icircumflex 10
+KPX T idieresis 10
+KPX T igrave 10
+KPX T imacron 10
+KPX T iogonek -5
+KPX T o -50
+KPX T oacute -50
+KPX T ocircumflex -50
+KPX T odieresis -50
+KPX T ograve -50
+KPX T ohungarumlaut -50
+KPX T omacron -50
+KPX T oslash -50
+KPX T otilde -50
+KPX T period 4
+KPX T r -42
+KPX T rcommaaccent -42
+KPX T s -43
+KPX T sacute -43
+KPX T scedilla -43
+KPX T scommaaccent -43
+KPX T semicolon -12
+KPX T u -56
+KPX T uacute -56
+KPX T ucircumflex -56
+KPX T udieresis -56
+KPX T ugrave -56
+KPX T uhungarumlaut -56
+KPX T umacron -56
+KPX T uogonek -56
+KPX T uring -56
+KPX T w -15
+KPX T y -12
+KPX T yacute -12
+KPX T ydieresis -12
+KPX Tcaron A -70
+KPX Tcaron Aacute -70
+KPX Tcaron Abreve -70
+KPX Tcaron Acircumflex -70
+KPX Tcaron Adieresis -70
+KPX Tcaron Agrave -70
+KPX Tcaron Amacron -70
+KPX Tcaron Aogonek -70
+KPX Tcaron Aring -70
+KPX Tcaron Atilde -70
+KPX Tcaron a -40
+KPX Tcaron aacute -40
+KPX Tcaron abreve -40
+KPX Tcaron acircumflex -40
+KPX Tcaron adieresis -40
+KPX Tcaron agrave -40
+KPX Tcaron amacron -40
+KPX Tcaron aogonek -40
+KPX Tcaron aring -40
+KPX Tcaron atilde -40
+KPX Tcaron c -50
+KPX Tcaron cacute -50
+KPX Tcaron ccaron -50
+KPX Tcaron ccedilla -50
+KPX Tcaron colon -12
+KPX Tcaron comma 4
+KPX Tcaron e -50
+KPX Tcaron eacute -50
+KPX Tcaron ecaron -50
+KPX Tcaron ecircumflex -50
+KPX Tcaron edieresis -50
+KPX Tcaron edotaccent -50
+KPX Tcaron egrave -50
+KPX Tcaron emacron -50
+KPX Tcaron eogonek -50
+KPX Tcaron hyphen -10
+KPX Tcaron i -5
+KPX Tcaron iacute 10
+KPX Tcaron icircumflex 10
+KPX Tcaron idieresis 10
+KPX Tcaron igrave 10
+KPX Tcaron imacron 10
+KPX Tcaron iogonek -5
+KPX Tcaron o -50
+KPX Tcaron oacute -50
+KPX Tcaron ocircumflex -50
+KPX Tcaron odieresis -50
+KPX Tcaron ograve -50
+KPX Tcaron ohungarumlaut -50
+KPX Tcaron omacron -50
+KPX Tcaron oslash -50
+KPX Tcaron otilde -50
+KPX Tcaron period 4
+KPX Tcaron r -42
+KPX Tcaron racute -42
+KPX Tcaron rcaron -42
+KPX Tcaron rcommaaccent -42
+KPX Tcaron s -43
+KPX Tcaron sacute -43
+KPX Tcaron scaron -43
+KPX Tcaron scedilla -43
+KPX Tcaron scommaaccent -43
+KPX Tcaron semicolon -12
+KPX Tcaron u -56
+KPX Tcaron uacute -56
+KPX Tcaron ucircumflex -56
+KPX Tcaron udieresis -56
+KPX Tcaron ugrave -56
+KPX Tcaron uhungarumlaut -56
+KPX Tcaron umacron -56
+KPX Tcaron uogonek -56
+KPX Tcaron uring -56
+KPX Tcaron w -15
+KPX Tcaron y -12
+KPX Tcaron yacute -12
+KPX Tcaron ydieresis -12
+KPX Tcommaaccent A -70
+KPX Tcommaaccent Aacute -70
+KPX Tcommaaccent Abreve -70
+KPX Tcommaaccent Acircumflex -70
+KPX Tcommaaccent Adieresis -70
+KPX Tcommaaccent Agrave -70
+KPX Tcommaaccent Amacron -70
+KPX Tcommaaccent Aogonek -70
+KPX Tcommaaccent Aring -70
+KPX Tcommaaccent Atilde -70
+KPX Tcommaaccent a -40
+KPX Tcommaaccent aacute -40
+KPX Tcommaaccent abreve -40
+KPX Tcommaaccent acircumflex -40
+KPX Tcommaaccent adieresis -40
+KPX Tcommaaccent agrave -40
+KPX Tcommaaccent amacron -40
+KPX Tcommaaccent aogonek -40
+KPX Tcommaaccent aring -40
+KPX Tcommaaccent atilde -40
+KPX Tcommaaccent c -50
+KPX Tcommaaccent cacute -50
+KPX Tcommaaccent ccaron -50
+KPX Tcommaaccent ccedilla -50
+KPX Tcommaaccent colon -12
+KPX Tcommaaccent comma 4
+KPX Tcommaaccent e -50
+KPX Tcommaaccent eacute -50
+KPX Tcommaaccent ecaron -50
+KPX Tcommaaccent ecircumflex -50
+KPX Tcommaaccent edieresis -50
+KPX Tcommaaccent edotaccent -50
+KPX Tcommaaccent egrave -50
+KPX Tcommaaccent emacron -50
+KPX Tcommaaccent eogonek -50
+KPX Tcommaaccent hyphen -10
+KPX Tcommaaccent i -5
+KPX Tcommaaccent iacute 10
+KPX Tcommaaccent icircumflex 10
+KPX Tcommaaccent idieresis 10
+KPX Tcommaaccent igrave 10
+KPX Tcommaaccent imacron 10
+KPX Tcommaaccent iogonek -5
+KPX Tcommaaccent o -50
+KPX Tcommaaccent oacute -50
+KPX Tcommaaccent ocircumflex -50
+KPX Tcommaaccent odieresis -50
+KPX Tcommaaccent ograve -50
+KPX Tcommaaccent ohungarumlaut -50
+KPX Tcommaaccent omacron -50
+KPX Tcommaaccent oslash -50
+KPX Tcommaaccent otilde -50
+KPX Tcommaaccent period 4
+KPX Tcommaaccent r -42
+KPX Tcommaaccent racute -42
+KPX Tcommaaccent rcaron -42
+KPX Tcommaaccent rcommaaccent -42
+KPX Tcommaaccent s -43
+KPX Tcommaaccent sacute -43
+KPX Tcommaaccent scaron -43
+KPX Tcommaaccent scedilla -43
+KPX Tcommaaccent scommaaccent -43
+KPX Tcommaaccent semicolon -12
+KPX Tcommaaccent u -56
+KPX Tcommaaccent uacute -56
+KPX Tcommaaccent ucircumflex -56
+KPX Tcommaaccent udieresis -56
+KPX Tcommaaccent ugrave -56
+KPX Tcommaaccent uhungarumlaut -56
+KPX Tcommaaccent umacron -56
+KPX Tcommaaccent uogonek -56
+KPX Tcommaaccent uring -56
+KPX Tcommaaccent w -15
+KPX Tcommaaccent y -12
+KPX Tcommaaccent yacute -12
+KPX Tcommaaccent ydieresis -12
+KPX V A -125
+KPX V Aacute -125
+KPX V Abreve -125
+KPX V Acircumflex -125
+KPX V Adieresis -125
+KPX V Agrave -125
+KPX V Amacron -125
+KPX V Aogonek -125
+KPX V Aring -125
+KPX V Atilde -125
+KPX V a -80
+KPX V aacute -80
+KPX V abreve -80
+KPX V acircumflex -80
+KPX V adieresis -80
+KPX V agrave -80
+KPX V amacron -80
+KPX V aogonek -80
+KPX V aring -80
+KPX V atilde -80
+KPX V colon -13
+KPX V comma -13
+KPX V e -80
+KPX V eacute -80
+KPX V ecaron -80
+KPX V ecircumflex -80
+KPX V edieresis -80
+KPX V edotaccent -80
+KPX V egrave -80
+KPX V emacron -80
+KPX V eogonek -80
+KPX V hyphen -20
+KPX V i -9
+KPX V iacute -9
+KPX V iogonek -9
+KPX V o -80
+KPX V oacute -80
+KPX V ocircumflex -80
+KPX V odieresis -80
+KPX V ograve -80
+KPX V ohungarumlaut -80
+KPX V omacron -80
+KPX V oslash -80
+KPX V otilde -80
+KPX V period -13
+KPX V r -40
+KPX V racute -40
+KPX V rcaron -40
+KPX V rcommaaccent -40
+KPX V semicolon -13
+KPX V u -68
+KPX V uacute -68
+KPX V ucircumflex -68
+KPX V udieresis -68
+KPX V ugrave -68
+KPX V uhungarumlaut -68
+KPX V umacron -68
+KPX V uogonek -68
+KPX V uring -68
+KPX V y -15
+KPX V yacute -15
+KPX V ydieresis -15
+KPX W A -94
+KPX W Aacute -94
+KPX W Abreve -94
+KPX W Acircumflex -94
+KPX W Adieresis -94
+KPX W Agrave -94
+KPX W Amacron -94
+KPX W Aogonek -94
+KPX W Aring -94
+KPX W Atilde -94
+KPX W a -50
+KPX W aacute -50
+KPX W abreve -50
+KPX W acircumflex -50
+KPX W adieresis -50
+KPX W agrave -50
+KPX W amacron -50
+KPX W aogonek -50
+KPX W aring -50
+KPX W atilde -50
+KPX W colon -12
+KPX W comma -12
+KPX W e -50
+KPX W eacute -50
+KPX W ecaron -50
+KPX W ecircumflex -50
+KPX W edieresis -50
+KPX W edotaccent -50
+KPX W egrave -50
+KPX W emacron -50
+KPX W eogonek -50
+KPX W hyphen -10
+KPX W i -7
+KPX W iacute 10
+KPX W icircumflex 10
+KPX W idieresis 10
+KPX W igrave 10
+KPX W imacron 10
+KPX W iogonek -7
+KPX W o -50
+KPX W oacute -50
+KPX W ocircumflex -50
+KPX W odieresis -50
+KPX W ograve -50
+KPX W ohungarumlaut -50
+KPX W omacron -50
+KPX W oslash -50
+KPX W otilde -50
+KPX W period -12
+KPX W r -39
+KPX W racute -39
+KPX W rcommaaccent -39
+KPX W semicolon -12
+KPX W u -40
+KPX W uacute -40
+KPX W ucircumflex -40
+KPX W udieresis -40
+KPX W ugrave -40
+KPX W uhungarumlaut -40
+KPX W umacron -40
+KPX W uogonek -40
+KPX W uring -40
+KPX W y 1
+KPX W yacute 1
+KPX W ydieresis 1
+KPX Y A -138
+KPX Y Aacute -138
+KPX Y Abreve -138
+KPX Y Acircumflex -138
+KPX Y Adieresis -138
+KPX Y Agrave -138
+KPX Y Amacron -138
+KPX Y Aogonek -138
+KPX Y Aring -138
+KPX Y Atilde -138
+KPX Y a -100
+KPX Y aacute -100
+KPX Y abreve -100
+KPX Y acircumflex -100
+KPX Y adieresis -100
+KPX Y agrave -100
+KPX Y amacron -100
+KPX Y aogonek -100
+KPX Y aring -100
+KPX Y atilde -100
+KPX Y colon -8
+KPX Y comma -8
+KPX Y e -100
+KPX Y eacute -100
+KPX Y ecaron -100
+KPX Y ecircumflex -100
+KPX Y edieresis -100
+KPX Y edotaccent -100
+KPX Y egrave -100
+KPX Y emacron -100
+KPX Y eogonek -100
+KPX Y hyphen -60
+KPX Y i -5
+KPX Y iacute -5
+KPX Y icircumflex 10
+KPX Y idieresis 10
+KPX Y igrave 10
+KPX Y imacron 10
+KPX Y iogonek -5
+KPX Y o -100
+KPX Y oacute -100
+KPX Y ocircumflex -100
+KPX Y odieresis -100
+KPX Y ograve -100
+KPX Y ohungarumlaut -100
+KPX Y omacron -100
+KPX Y oslash -100
+KPX Y otilde -100
+KPX Y p -60
+KPX Y period -8
+KPX Y q -100
+KPX Y semicolon -8
+KPX Y u -82
+KPX Y uacute -82
+KPX Y ucircumflex -82
+KPX Y udieresis -82
+KPX Y ugrave -82
+KPX Y uhungarumlaut -82
+KPX Y umacron -82
+KPX Y uogonek -82
+KPX Y uring -82
+KPX Y v -25
+KPX Yacute A -138
+KPX Yacute Aacute -138
+KPX Yacute Abreve -138
+KPX Yacute Acircumflex -138
+KPX Yacute Adieresis -138
+KPX Yacute Agrave -138
+KPX Yacute Amacron -138
+KPX Yacute Aogonek -138
+KPX Yacute Aring -138
+KPX Yacute Atilde -138
+KPX Yacute a -100
+KPX Yacute aacute -100
+KPX Yacute abreve -100
+KPX Yacute acircumflex -100
+KPX Yacute adieresis -100
+KPX Yacute agrave -100
+KPX Yacute amacron -100
+KPX Yacute aogonek -100
+KPX Yacute aring -100
+KPX Yacute atilde -100
+KPX Yacute colon -8
+KPX Yacute comma -8
+KPX Yacute e -100
+KPX Yacute eacute -100
+KPX Yacute ecaron -100
+KPX Yacute ecircumflex -100
+KPX Yacute edieresis -100
+KPX Yacute edotaccent -100
+KPX Yacute egrave -100
+KPX Yacute emacron -100
+KPX Yacute eogonek -100
+KPX Yacute hyphen -60
+KPX Yacute i -5
+KPX Yacute iacute -5
+KPX Yacute icircumflex 10
+KPX Yacute idieresis 10
+KPX Yacute igrave 10
+KPX Yacute imacron 10
+KPX Yacute iogonek -5
+KPX Yacute o -100
+KPX Yacute oacute -100
+KPX Yacute ocircumflex -100
+KPX Yacute odieresis -100
+KPX Yacute ograve -100
+KPX Yacute ohungarumlaut -100
+KPX Yacute omacron -100
+KPX Yacute oslash -100
+KPX Yacute otilde -100
+KPX Yacute p -60
+KPX Yacute period -8
+KPX Yacute q -100
+KPX Yacute semicolon -8
+KPX Yacute u -82
+KPX Yacute uacute -82
+KPX Yacute ucircumflex -82
+KPX Yacute udieresis -82
+KPX Yacute ugrave -82
+KPX Yacute uhungarumlaut -82
+KPX Yacute umacron -82
+KPX Yacute uogonek -82
+KPX Yacute uring -82
+KPX Yacute v -25
+KPX Ydieresis A -138
+KPX Ydieresis Aacute -138
+KPX Ydieresis Abreve -138
+KPX Ydieresis Acircumflex -138
+KPX Ydieresis Adieresis -138
+KPX Ydieresis Agrave -138
+KPX Ydieresis Amacron -138
+KPX Ydieresis Aogonek -138
+KPX Ydieresis Aring -138
+KPX Ydieresis Atilde -138
+KPX Ydieresis a -100
+KPX Ydieresis aacute -100
+KPX Ydieresis abreve -100
+KPX Ydieresis acircumflex -100
+KPX Ydieresis adieresis -100
+KPX Ydieresis agrave -100
+KPX Ydieresis amacron -100
+KPX Ydieresis aogonek -100
+KPX Ydieresis aring -100
+KPX Ydieresis atilde -100
+KPX Ydieresis colon -8
+KPX Ydieresis comma -8
+KPX Ydieresis e -100
+KPX Ydieresis eacute -100
+KPX Ydieresis ecaron -100
+KPX Ydieresis ecircumflex -100
+KPX Ydieresis edieresis -100
+KPX Ydieresis edotaccent -100
+KPX Ydieresis egrave -100
+KPX Ydieresis emacron -100
+KPX Ydieresis eogonek -100
+KPX Ydieresis hyphen -60
+KPX Ydieresis i -5
+KPX Ydieresis iacute -5
+KPX Ydieresis icircumflex 10
+KPX Ydieresis idieresis 10
+KPX Ydieresis igrave 10
+KPX Ydieresis imacron 10
+KPX Ydieresis iogonek -5
+KPX Ydieresis o -100
+KPX Ydieresis oacute -100
+KPX Ydieresis ocircumflex -100
+KPX Ydieresis odieresis -100
+KPX Ydieresis ograve -100
+KPX Ydieresis ohungarumlaut -100
+KPX Ydieresis omacron -100
+KPX Ydieresis oslash -100
+KPX Ydieresis otilde -100
+KPX Ydieresis p -60
+KPX Ydieresis period -8
+KPX Ydieresis q -100
+KPX Ydieresis semicolon -8
+KPX Ydieresis u -82
+KPX Ydieresis uacute -82
+KPX Ydieresis ucircumflex -82
+KPX Ydieresis udieresis -82
+KPX Ydieresis ugrave -82
+KPX Ydieresis uhungarumlaut -82
+KPX Ydieresis umacron -82
+KPX Ydieresis uogonek -82
+KPX Ydieresis uring -82
+KPX Ydieresis v -25
+KPX f f 38
+KPX r c -27
+KPX r cacute -27
+KPX r ccaron -27
+KPX r ccedilla -27
+KPX r comma 9
+KPX r d -8
+KPX r dcroat -8
+KPX r e -8
+KPX r eacute -8
+KPX r ecaron -8
+KPX r ecircumflex -8
+KPX r edieresis -8
+KPX r edotaccent -8
+KPX r egrave -8
+KPX r emacron -8
+KPX r eogonek -8
+KPX r f 38
+KPX r g -8
+KPX r gbreve -8
+KPX r gcommaaccent -8
+KPX r hyphen -10
+KPX r m 5
+KPX r n 5
+KPX r nacute 5
+KPX r ncaron 5
+KPX r ncommaaccent 5
+KPX r ntilde 5
+KPX r o -18
+KPX r oacute -18
+KPX r ocircumflex -18
+KPX r odieresis -18
+KPX r ograve -18
+KPX r ohungarumlaut -18
+KPX r omacron -18
+KPX r oslash -18
+KPX r otilde -18
+KPX r period 9
+KPX r q -18
+KPX racute c -27
+KPX racute cacute -27
+KPX racute ccaron -27
+KPX racute ccedilla -27
+KPX racute comma 9
+KPX racute d -8
+KPX racute dcroat -8
+KPX racute e -8
+KPX racute eacute -8
+KPX racute ecaron -8
+KPX racute ecircumflex -8
+KPX racute edieresis -8
+KPX racute edotaccent -8
+KPX racute egrave -8
+KPX racute emacron -8
+KPX racute eogonek -8
+KPX racute f 38
+KPX racute g -8
+KPX racute gbreve -8
+KPX racute gcommaaccent -8
+KPX racute hyphen -10
+KPX racute m 5
+KPX racute n 5
+KPX racute nacute 5
+KPX racute ncaron 5
+KPX racute ncommaaccent 5
+KPX racute ntilde 5
+KPX racute o -18
+KPX racute oacute -18
+KPX racute ocircumflex -18
+KPX racute odieresis -18
+KPX racute ograve -18
+KPX racute ohungarumlaut -18
+KPX racute omacron -18
+KPX racute oslash -18
+KPX racute otilde -18
+KPX racute period 9
+KPX racute q -18
+KPX rcaron c -27
+KPX rcaron cacute -27
+KPX rcaron ccaron -27
+KPX rcaron ccedilla -27
+KPX rcaron comma 9
+KPX rcaron d -8
+KPX rcaron dcroat -8
+KPX rcaron e -8
+KPX rcaron eacute -8
+KPX rcaron ecaron -8
+KPX rcaron ecircumflex -8
+KPX rcaron edieresis -8
+KPX rcaron edotaccent -8
+KPX rcaron egrave -8
+KPX rcaron emacron -8
+KPX rcaron eogonek -8
+KPX rcaron f 38
+KPX rcaron g -8
+KPX rcaron gbreve -8
+KPX rcaron gcommaaccent -8
+KPX rcaron hyphen -10
+KPX rcaron m 5
+KPX rcaron n 5
+KPX rcaron nacute 5
+KPX rcaron ncaron 5
+KPX rcaron ncommaaccent 5
+KPX rcaron ntilde 5
+KPX rcaron o -18
+KPX rcaron oacute -18
+KPX rcaron ocircumflex -18
+KPX rcaron odieresis -18
+KPX rcaron ograve -18
+KPX rcaron ohungarumlaut -18
+KPX rcaron omacron -18
+KPX rcaron oslash -18
+KPX rcaron otilde -18
+KPX rcaron period 9
+KPX rcaron q -18
+KPX rcommaaccent c -27
+KPX rcommaaccent cacute -27
+KPX rcommaaccent ccaron -27
+KPX rcommaaccent ccedilla -27
+KPX rcommaaccent comma 9
+KPX rcommaaccent d -8
+KPX rcommaaccent dcroat -8
+KPX rcommaaccent e -8
+KPX rcommaaccent eacute -8
+KPX rcommaaccent ecaron -8
+KPX rcommaaccent ecircumflex -8
+KPX rcommaaccent edieresis -8
+KPX rcommaaccent edotaccent -8
+KPX rcommaaccent egrave -8
+KPX rcommaaccent emacron -8
+KPX rcommaaccent eogonek -8
+KPX rcommaaccent f 38
+KPX rcommaaccent g -8
+KPX rcommaaccent gbreve -8
+KPX rcommaaccent gcommaaccent -8
+KPX rcommaaccent hyphen -10
+KPX rcommaaccent m 5
+KPX rcommaaccent n 5
+KPX rcommaaccent nacute 5
+KPX rcommaaccent ncaron 5
+KPX rcommaaccent ncommaaccent 5
+KPX rcommaaccent ntilde 5
+KPX rcommaaccent o -18
+KPX rcommaaccent oacute -18
+KPX rcommaaccent ocircumflex -18
+KPX rcommaaccent odieresis -18
+KPX rcommaaccent ograve -18
+KPX rcommaaccent ohungarumlaut -18
+KPX rcommaaccent omacron -18
+KPX rcommaaccent oslash -18
+KPX rcommaaccent otilde -18
+KPX rcommaaccent period 9
+KPX rcommaaccent q -18
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/src/fonts/Adobe-Core35_AFMs-314/ITCAvantGarde-DemiOblique.afm b/src/fonts/Adobe-Core35_AFMs-314/ITCAvantGarde-DemiOblique.afm
new file mode 100644
index 0000000..f65f4b0
--- /dev/null
+++ b/src/fonts/Adobe-Core35_AFMs-314/ITCAvantGarde-DemiOblique.afm
@@ -0,0 +1,1277 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1985, 1987, 1989, 1990, 1991, 1992, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Mon Jun 23 16:39:52 1997
+Comment UniqueID 43086
+Comment VMusage 12316 64111
+FontName AvantGarde-DemiOblique
+FullName ITC Avant Garde Gothic Demi Oblique
+FamilyName ITC Avant Garde Gothic
+Weight Demi
+ItalicAngle -10.5
+IsFixedPitch false
+FontBBox -123 -251 1256 1021
+UnderlinePosition -100
+UnderlineThickness 50
+Version 002.000
+Notice Copyright (c) 1985, 1987, 1989, 1990, 1991, 1992, 1997 Adobe Systems Incorporated. All Rights Reserved.ITC Avant Garde Gothic is a registered trademark of International Typeface Corporation.
+EncodingScheme AdobeStandardEncoding
+CapHeight 740
+XHeight 555
+Ascender 740
+Descender -192
+StdHW 122
+StdVW 133
+StartCharMetrics 314
+C 32 ; WX 280 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 280 ; N exclam ; B 73 0 344 740 ;
+C 34 ; WX 360 ; N quotedbl ; B 127 444 479 740 ;
+C 35 ; WX 560 ; N numbersign ; B 65 0 619 700 ;
+C 36 ; WX 560 ; N dollar ; B 99 -86 582 857 ;
+C 37 ; WX 860 ; N percent ; B 139 -15 856 755 ;
+C 38 ; WX 680 ; N ampersand ; B 70 -15 742 755 ;
+C 39 ; WX 280 ; N quoteright ; B 159 466 343 740 ;
+C 40 ; WX 380 ; N parenleft ; B 119 -157 490 754 ;
+C 41 ; WX 380 ; N parenright ; B 7 -157 378 754 ;
+C 42 ; WX 440 ; N asterisk ; B 173 457 493 755 ;
+C 43 ; WX 600 ; N plus ; B 83 0 611 506 ;
+C 44 ; WX 280 ; N comma ; B 47 -141 231 133 ;
+C 45 ; WX 420 ; N hyphen ; B 113 230 414 348 ;
+C 46 ; WX 280 ; N period ; B 73 0 231 133 ;
+C 47 ; WX 460 ; N slash ; B -13 -100 592 740 ;
+C 48 ; WX 560 ; N zero ; B 69 -15 628 755 ;
+C 49 ; WX 560 ; N one ; B 230 0 501 740 ;
+C 50 ; WX 560 ; N two ; B 44 0 622 755 ;
+C 51 ; WX 560 ; N three ; B 67 -15 586 755 ;
+C 52 ; WX 560 ; N four ; B 35 0 605 740 ;
+C 53 ; WX 560 ; N five ; B 63 -15 601 740 ;
+C 54 ; WX 560 ; N six ; B 64 -15 588 739 ;
+C 55 ; WX 560 ; N seven ; B 83 0 636 740 ;
+C 56 ; WX 560 ; N eight ; B 70 -15 590 755 ;
+C 57 ; WX 560 ; N nine ; B 109 0 633 754 ;
+C 58 ; WX 280 ; N colon ; B 73 0 309 555 ;
+C 59 ; WX 280 ; N semicolon ; B 47 -141 309 555 ;
+C 60 ; WX 600 ; N less ; B 84 -8 650 514 ;
+C 61 ; WX 600 ; N equal ; B 63 81 631 425 ;
+C 62 ; WX 600 ; N greater ; B 44 -8 610 514 ;
+C 63 ; WX 560 ; N question ; B 135 0 594 755 ;
+C 64 ; WX 740 ; N at ; B 108 -12 832 712 ;
+C 65 ; WX 740 ; N A ; B 7 0 732 740 ;
+C 66 ; WX 580 ; N B ; B 70 0 611 740 ;
+C 67 ; WX 780 ; N C ; B 96 -15 865 755 ;
+C 68 ; WX 700 ; N D ; B 63 0 732 740 ;
+C 69 ; WX 520 ; N E ; B 61 0 597 740 ;
+C 70 ; WX 480 ; N F ; B 61 0 576 740 ;
+C 71 ; WX 840 ; N G ; B 89 -15 887 755 ;
+C 72 ; WX 680 ; N H ; B 71 0 748 740 ;
+C 73 ; WX 280 ; N I ; B 72 0 347 740 ;
+C 74 ; WX 480 ; N J ; B 34 -15 547 740 ;
+C 75 ; WX 620 ; N K ; B 89 0 758 740 ;
+C 76 ; WX 440 ; N L ; B 72 0 459 740 ;
+C 77 ; WX 900 ; N M ; B 63 0 975 740 ;
+C 78 ; WX 740 ; N N ; B 70 0 809 740 ;
+C 79 ; WX 840 ; N O ; B 94 -15 882 755 ;
+C 80 ; WX 560 ; N P ; B 72 0 645 740 ;
+C 81 ; WX 840 ; N Q ; B 93 -15 882 755 ;
+C 82 ; WX 580 ; N R ; B 64 0 657 740 ;
+C 83 ; WX 520 ; N S ; B 48 -15 579 755 ;
+C 84 ; WX 420 ; N T ; B 119 0 556 740 ;
+C 85 ; WX 640 ; N U ; B 96 -15 723 740 ;
+C 86 ; WX 700 ; N V ; B 145 0 833 740 ;
+C 87 ; WX 900 ; N W ; B 144 0 1037 740 ;
+C 88 ; WX 680 ; N X ; B 4 0 814 740 ;
+C 89 ; WX 620 ; N Y ; B 135 0 760 740 ;
+C 90 ; WX 500 ; N Z ; B 19 0 600 740 ;
+C 91 ; WX 320 ; N bracketleft ; B 88 -157 424 754 ;
+C 92 ; WX 640 ; N backslash ; B 233 -100 526 740 ;
+C 93 ; WX 320 ; N bracketright ; B 6 -157 342 754 ;
+C 94 ; WX 600 ; N asciicircum ; B 142 375 597 740 ;
+C 95 ; WX 500 ; N underscore ; B -24 -125 487 -75 ;
+C 96 ; WX 280 ; N quoteleft ; B 158 466 342 740 ;
+C 97 ; WX 660 ; N a ; B 72 -18 716 574 ;
+C 98 ; WX 660 ; N b ; B 47 -18 689 740 ;
+C 99 ; WX 640 ; N c ; B 83 -18 679 574 ;
+C 100 ; WX 660 ; N d ; B 79 -18 756 740 ;
+C 101 ; WX 640 ; N e ; B 76 -18 668 574 ;
+C 102 ; WX 280 ; N f ; B 62 0 420 755 ; L i fi ; L l fl ;
+C 103 ; WX 660 ; N g ; B 33 -226 726 574 ;
+C 104 ; WX 600 ; N h ; B 54 0 614 740 ;
+C 105 ; WX 240 ; N i ; B 53 0 324 740 ;
+C 106 ; WX 260 ; N j ; B -19 -185 343 740 ;
+C 107 ; WX 580 ; N k ; B 80 0 648 740 ;
+C 108 ; WX 240 ; N l ; B 54 0 325 740 ;
+C 109 ; WX 940 ; N m ; B 54 0 955 574 ;
+C 110 ; WX 600 ; N n ; B 54 0 614 574 ;
+C 111 ; WX 640 ; N o ; B 71 -18 672 574 ;
+C 112 ; WX 660 ; N p ; B 12 -185 687 574 ;
+C 113 ; WX 660 ; N q ; B 78 -185 716 574 ;
+C 114 ; WX 320 ; N r ; B 63 0 424 574 ;
+C 115 ; WX 440 ; N s ; B 49 -18 483 574 ;
+C 116 ; WX 300 ; N t ; B 86 0 402 740 ;
+C 117 ; WX 600 ; N u ; B 86 -18 647 555 ;
+C 118 ; WX 560 ; N v ; B 105 0 659 555 ;
+C 119 ; WX 800 ; N w ; B 113 0 892 555 ;
+C 120 ; WX 560 ; N x ; B 3 0 632 555 ;
+C 121 ; WX 580 ; N y ; B 74 -185 674 555 ;
+C 122 ; WX 460 ; N z ; B 20 0 528 555 ;
+C 123 ; WX 340 ; N braceleft ; B 40 -191 456 747 ;
+C 124 ; WX 600 ; N bar ; B 186 -250 505 750 ;
+C 125 ; WX 340 ; N braceright ; B -13 -191 405 747 ;
+C 126 ; WX 600 ; N asciitilde ; B 114 160 580 347 ;
+C 161 ; WX 280 ; N exclamdown ; B 39 -185 310 555 ;
+C 162 ; WX 560 ; N cent ; B 110 39 600 715 ;
+C 163 ; WX 560 ; N sterling ; B 38 0 616 755 ;
+C 164 ; WX 160 ; N fraction ; B -123 0 420 740 ;
+C 165 ; WX 560 ; N yen ; B 83 0 708 740 ;
+C 166 ; WX 560 ; N florin ; B -27 -151 665 824 ;
+C 167 ; WX 560 ; N section ; B 65 -158 602 755 ;
+C 168 ; WX 560 ; N currency ; B 52 69 628 577 ;
+C 169 ; WX 220 ; N quotesingle ; B 152 444 315 740 ;
+C 170 ; WX 480 ; N quotedblleft ; B 156 466 547 740 ;
+C 171 ; WX 460 ; N guillemotleft ; B 105 108 487 469 ;
+C 172 ; WX 240 ; N guilsinglleft ; B 94 108 277 469 ;
+C 173 ; WX 240 ; N guilsinglright ; B 70 108 254 469 ;
+C 174 ; WX 520 ; N fi ; B 72 0 599 755 ;
+C 175 ; WX 520 ; N fl ; B 72 0 599 755 ;
+C 177 ; WX 500 ; N endash ; B 77 230 530 348 ;
+C 178 ; WX 560 ; N dagger ; B 132 -142 612 740 ;
+C 179 ; WX 560 ; N daggerdbl ; B 63 -142 618 740 ;
+C 180 ; WX 280 ; N periodcentered ; B 107 187 266 320 ;
+C 182 ; WX 600 ; N paragraph ; B 89 -103 745 740 ;
+C 183 ; WX 600 ; N bullet ; B 215 222 526 532 ;
+C 184 ; WX 280 ; N quotesinglbase ; B 46 -141 230 133 ;
+C 185 ; WX 480 ; N quotedblbase ; B 44 -141 435 133 ;
+C 186 ; WX 480 ; N quotedblright ; B 157 466 548 740 ;
+C 187 ; WX 460 ; N guillemotright ; B 81 108 464 469 ;
+C 188 ; WX 1000 ; N ellipsis ; B 100 0 924 133 ;
+C 189 ; WX 1280 ; N perthousand ; B 139 -15 1256 755 ;
+C 191 ; WX 560 ; N questiondown ; B 68 -200 527 555 ;
+C 193 ; WX 420 ; N grave ; B 188 624 462 851 ;
+C 194 ; WX 420 ; N acute ; B 221 624 507 851 ;
+C 195 ; WX 540 ; N circumflex ; B 188 636 588 774 ;
+C 196 ; WX 480 ; N tilde ; B 178 636 564 767 ;
+C 197 ; WX 420 ; N macron ; B 192 648 490 759 ;
+C 198 ; WX 480 ; N breve ; B 184 633 582 770 ;
+C 199 ; WX 280 ; N dotaccent ; B 191 636 350 769 ;
+C 200 ; WX 500 ; N dieresis ; B 195 636 565 769 ;
+C 202 ; WX 360 ; N ring ; B 205 619 425 834 ;
+C 203 ; WX 340 ; N cedilla ; B 66 -251 272 6 ;
+C 205 ; WX 700 ; N hungarumlaut ; B 247 610 767 849 ;
+C 206 ; WX 340 ; N ogonek ; B 59 -195 243 9 ;
+C 207 ; WX 540 ; N caron ; B 214 636 614 774 ;
+C 208 ; WX 1000 ; N emdash ; B 77 230 1030 348 ;
+C 225 ; WX 900 ; N AE ; B -5 0 962 740 ;
+C 227 ; WX 360 ; N ordfeminine ; B 126 438 473 755 ;
+C 232 ; WX 480 ; N Lslash ; B 67 0 484 740 ;
+C 233 ; WX 840 ; N Oslash ; B 93 -71 891 814 ;
+C 234 ; WX 1060 ; N OE ; B 98 -15 1145 755 ;
+C 235 ; WX 360 ; N ordmasculine ; B 130 438 452 755 ;
+C 241 ; WX 1080 ; N ae ; B 75 -18 1106 574 ;
+C 245 ; WX 240 ; N dotlessi ; B 53 0 289 555 ;
+C 248 ; WX 320 ; N lslash ; B 74 0 405 740 ;
+C 249 ; WX 660 ; N oslash ; B 81 -50 685 608 ;
+C 250 ; WX 1080 ; N oe ; B 76 -18 1109 574 ;
+C 251 ; WX 600 ; N germandbls ; B 51 -18 629 755 ;
+C -1 ; WX 280 ; N Idieresis ; B 72 0 487 939 ;
+C -1 ; WX 640 ; N eacute ; B 76 -18 668 851 ;
+C -1 ; WX 660 ; N abreve ; B 72 -18 716 770 ;
+C -1 ; WX 600 ; N uhungarumlaut ; B 86 -18 717 849 ;
+C -1 ; WX 640 ; N ecaron ; B 76 -18 674 774 ;
+C -1 ; WX 620 ; N Ydieresis ; B 135 0 760 939 ;
+C -1 ; WX 600 ; N divide ; B 83 -20 611 526 ;
+C -1 ; WX 620 ; N Yacute ; B 135 0 760 1021 ;
+C -1 ; WX 740 ; N Acircumflex ; B 7 0 732 944 ;
+C -1 ; WX 660 ; N aacute ; B 72 -18 716 851 ;
+C -1 ; WX 640 ; N Ucircumflex ; B 96 -15 723 944 ;
+C -1 ; WX 580 ; N yacute ; B 74 -185 674 851 ;
+C -1 ; WX 440 ; N scommaaccent ; B 49 -229 483 574 ;
+C -1 ; WX 640 ; N ecircumflex ; B 76 -18 668 774 ;
+C -1 ; WX 640 ; N Uring ; B 96 -15 723 969 ;
+C -1 ; WX 640 ; N Udieresis ; B 96 -15 723 939 ;
+C -1 ; WX 660 ; N aogonek ; B 72 -195 716 574 ;
+C -1 ; WX 640 ; N Uacute ; B 96 -15 723 1021 ;
+C -1 ; WX 600 ; N uogonek ; B 86 -195 647 555 ;
+C -1 ; WX 520 ; N Edieresis ; B 61 0 607 939 ;
+C -1 ; WX 742 ; N Dcroat ; B 82 0 766 740 ;
+C -1 ; WX 351 ; N commaaccent ; B 5 -229 213 -54 ;
+C -1 ; WX 740 ; N copyright ; B 50 -12 828 752 ;
+C -1 ; WX 520 ; N Emacron ; B 61 0 597 944 ;
+C -1 ; WX 640 ; N ccaron ; B 83 -18 679 774 ;
+C -1 ; WX 660 ; N aring ; B 72 -18 716 834 ;
+C -1 ; WX 740 ; N Ncommaaccent ; B 70 -209 809 740 ;
+C -1 ; WX 240 ; N lacute ; B 54 0 447 1011 ;
+C -1 ; WX 660 ; N agrave ; B 72 -18 716 851 ;
+C -1 ; WX 420 ; N Tcommaaccent ; B 40 -229 556 740 ;
+C -1 ; WX 780 ; N Cacute ; B 96 -15 865 1021 ;
+C -1 ; WX 660 ; N atilde ; B 72 -18 716 767 ;
+C -1 ; WX 520 ; N Edotaccent ; B 61 0 597 954 ;
+C -1 ; WX 440 ; N scaron ; B 49 -18 564 774 ;
+C -1 ; WX 440 ; N scedilla ; B 49 -251 483 574 ;
+C -1 ; WX 240 ; N iacute ; B 53 0 442 851 ;
+C -1 ; WX 494 ; N lozenge ; B 79 0 554 745 ;
+C -1 ; WX 580 ; N Rcaron ; B 64 0 668 959 ;
+C -1 ; WX 840 ; N Gcommaaccent ; B 89 -229 887 755 ;
+C -1 ; WX 600 ; N ucircumflex ; B 86 -18 647 774 ;
+C -1 ; WX 660 ; N acircumflex ; B 72 -18 716 774 ;
+C -1 ; WX 740 ; N Amacron ; B 7 0 732 944 ;
+C -1 ; WX 320 ; N rcaron ; B 63 0 504 774 ;
+C -1 ; WX 640 ; N ccedilla ; B 83 -251 679 574 ;
+C -1 ; WX 500 ; N Zdotaccent ; B 19 0 600 954 ;
+C -1 ; WX 560 ; N Thorn ; B 72 0 619 740 ;
+C -1 ; WX 840 ; N Omacron ; B 94 -15 882 944 ;
+C -1 ; WX 580 ; N Racute ; B 64 0 657 1021 ;
+C -1 ; WX 520 ; N Sacute ; B 48 -15 589 1021 ;
+C -1 ; WX 800 ; N dcaron ; B 79 -18 966 740 ;
+C -1 ; WX 640 ; N Umacron ; B 96 -15 723 944 ;
+C -1 ; WX 600 ; N uring ; B 86 -18 647 834 ;
+C -1 ; WX 336 ; N threesuperior ; B 87 287 414 749 ;
+C -1 ; WX 840 ; N Ograve ; B 94 -15 882 1021 ;
+C -1 ; WX 740 ; N Agrave ; B 7 0 732 1021 ;
+C -1 ; WX 740 ; N Abreve ; B 7 0 746 955 ;
+C -1 ; WX 600 ; N multiply ; B 76 12 618 494 ;
+C -1 ; WX 600 ; N uacute ; B 86 -18 647 851 ;
+C -1 ; WX 420 ; N Tcaron ; B 119 0 588 959 ;
+C -1 ; WX 494 ; N partialdiff ; B 39 -21 573 750 ;
+C -1 ; WX 580 ; N ydieresis ; B 74 -185 674 769 ;
+C -1 ; WX 740 ; N Nacute ; B 70 0 809 1021 ;
+C -1 ; WX 240 ; N icircumflex ; B 38 0 438 774 ;
+C -1 ; WX 520 ; N Ecircumflex ; B 61 0 610 944 ;
+C -1 ; WX 660 ; N adieresis ; B 72 -18 716 769 ;
+C -1 ; WX 640 ; N edieresis ; B 76 -18 668 769 ;
+C -1 ; WX 640 ; N cacute ; B 83 -18 679 851 ;
+C -1 ; WX 600 ; N nacute ; B 54 0 614 851 ;
+C -1 ; WX 600 ; N umacron ; B 86 -18 647 759 ;
+C -1 ; WX 740 ; N Ncaron ; B 70 0 809 959 ;
+C -1 ; WX 280 ; N Iacute ; B 72 0 494 1021 ;
+C -1 ; WX 600 ; N plusminus ; B 36 -62 627 556 ;
+C -1 ; WX 600 ; N brokenbar ; B 200 -175 492 675 ;
+C -1 ; WX 740 ; N registered ; B 50 -12 828 752 ;
+C -1 ; WX 840 ; N Gbreve ; B 89 -15 887 955 ;
+C -1 ; WX 280 ; N Idotaccent ; B 72 0 384 954 ;
+C -1 ; WX 713 ; N summation ; B -5 -108 756 752 ;
+C -1 ; WX 520 ; N Egrave ; B 61 0 597 1021 ;
+C -1 ; WX 320 ; N racute ; B 63 0 487 851 ;
+C -1 ; WX 640 ; N omacron ; B 71 -18 672 759 ;
+C -1 ; WX 500 ; N Zacute ; B 19 0 600 1021 ;
+C -1 ; WX 500 ; N Zcaron ; B 19 0 650 944 ;
+C -1 ; WX 549 ; N greaterequal ; B 26 0 616 704 ;
+C -1 ; WX 742 ; N Eth ; B 82 0 766 740 ;
+C -1 ; WX 780 ; N Ccedilla ; B 96 -251 865 755 ;
+C -1 ; WX 240 ; N lcommaaccent ; B -50 -229 325 740 ;
+C -1 ; WX 400 ; N tcaron ; B 86 0 584 786 ;
+C -1 ; WX 640 ; N eogonek ; B 76 -195 668 574 ;
+C -1 ; WX 640 ; N Uogonek ; B 96 -195 723 740 ;
+C -1 ; WX 740 ; N Aacute ; B 7 0 732 1021 ;
+C -1 ; WX 740 ; N Adieresis ; B 7 0 732 939 ;
+C -1 ; WX 640 ; N egrave ; B 76 -18 668 851 ;
+C -1 ; WX 460 ; N zacute ; B 20 0 528 851 ;
+C -1 ; WX 240 ; N iogonek ; B -34 -195 324 740 ;
+C -1 ; WX 840 ; N Oacute ; B 94 -15 882 1021 ;
+C -1 ; WX 640 ; N oacute ; B 71 -18 672 851 ;
+C -1 ; WX 660 ; N amacron ; B 72 -18 716 759 ;
+C -1 ; WX 440 ; N sacute ; B 49 -18 517 851 ;
+C -1 ; WX 240 ; N idieresis ; B 53 0 435 769 ;
+C -1 ; WX 840 ; N Ocircumflex ; B 94 -15 882 944 ;
+C -1 ; WX 640 ; N Ugrave ; B 96 -15 723 1021 ;
+C -1 ; WX 612 ; N Delta ; B 2 0 612 692 ;
+C -1 ; WX 660 ; N thorn ; B 12 -185 687 740 ;
+C -1 ; WX 336 ; N twosuperior ; B 72 296 436 749 ;
+C -1 ; WX 840 ; N Odieresis ; B 94 -15 882 939 ;
+C -1 ; WX 576 ; N mu ; B 3 -187 642 555 ;
+C -1 ; WX 240 ; N igrave ; B 53 0 347 851 ;
+C -1 ; WX 640 ; N ohungarumlaut ; B 71 -18 737 849 ;
+C -1 ; WX 520 ; N Eogonek ; B 61 -195 597 740 ;
+C -1 ; WX 660 ; N dcroat ; B 79 -18 829 740 ;
+C -1 ; WX 840 ; N threequarters ; B 97 0 837 749 ;
+C -1 ; WX 520 ; N Scedilla ; B 49 -251 579 755 ;
+C -1 ; WX 380 ; N lcaron ; B 54 0 536 740 ;
+C -1 ; WX 620 ; N Kcommaaccent ; B 89 -209 758 740 ;
+C -1 ; WX 440 ; N Lacute ; B 72 0 549 1021 ;
+C -1 ; WX 1000 ; N trademark ; B 130 296 959 740 ;
+C -1 ; WX 640 ; N edotaccent ; B 76 -18 668 769 ;
+C -1 ; WX 280 ; N Igrave ; B 72 0 399 1021 ;
+C -1 ; WX 280 ; N Imacron ; B 72 0 454 944 ;
+C -1 ; WX 440 ; N Lcaron ; B 72 0 626 740 ;
+C -1 ; WX 840 ; N onehalf ; B 157 0 831 740 ;
+C -1 ; WX 549 ; N lessequal ; B 29 0 657 704 ;
+C -1 ; WX 640 ; N ocircumflex ; B 71 -18 672 774 ;
+C -1 ; WX 600 ; N ntilde ; B 54 0 624 767 ;
+C -1 ; WX 640 ; N Uhungarumlaut ; B 96 -15 769 1019 ;
+C -1 ; WX 520 ; N Eacute ; B 61 0 597 1021 ;
+C -1 ; WX 640 ; N emacron ; B 76 -18 668 759 ;
+C -1 ; WX 660 ; N gbreve ; B 33 -226 726 770 ;
+C -1 ; WX 840 ; N onequarter ; B 187 0 780 740 ;
+C -1 ; WX 520 ; N Scaron ; B 48 -15 635 944 ;
+C -1 ; WX 520 ; N Scommaaccent ; B 48 -229 579 755 ;
+C -1 ; WX 840 ; N Ohungarumlaut ; B 94 -15 882 1019 ;
+C -1 ; WX 400 ; N degree ; B 159 426 451 712 ;
+C -1 ; WX 640 ; N ograve ; B 71 -18 672 851 ;
+C -1 ; WX 780 ; N Ccaron ; B 96 -15 865 959 ;
+C -1 ; WX 600 ; N ugrave ; B 86 -18 647 851 ;
+C -1 ; WX 549 ; N radical ; B 99 -46 667 850 ;
+C -1 ; WX 700 ; N Dcaron ; B 63 0 732 959 ;
+C -1 ; WX 320 ; N rcommaaccent ; B -51 -229 424 574 ;
+C -1 ; WX 740 ; N Ntilde ; B 70 0 809 937 ;
+C -1 ; WX 640 ; N otilde ; B 71 -18 672 767 ;
+C -1 ; WX 580 ; N Rcommaaccent ; B 64 -209 657 740 ;
+C -1 ; WX 440 ; N Lcommaaccent ; B 72 -229 459 740 ;
+C -1 ; WX 740 ; N Atilde ; B 7 0 732 937 ;
+C -1 ; WX 740 ; N Aogonek ; B 7 -195 732 740 ;
+C -1 ; WX 740 ; N Aring ; B 7 0 732 969 ;
+C -1 ; WX 840 ; N Otilde ; B 94 -15 882 937 ;
+C -1 ; WX 460 ; N zdotaccent ; B 20 0 528 769 ;
+C -1 ; WX 520 ; N Ecaron ; B 61 0 638 959 ;
+C -1 ; WX 280 ; N Iogonek ; B -9 -195 347 740 ;
+C -1 ; WX 580 ; N kcommaaccent ; B 80 -209 648 740 ;
+C -1 ; WX 600 ; N minus ; B 83 193 611 313 ;
+C -1 ; WX 280 ; N Icircumflex ; B 72 0 490 944 ;
+C -1 ; WX 600 ; N ncaron ; B 54 0 644 774 ;
+C -1 ; WX 300 ; N tcommaaccent ; B -1 -229 402 740 ;
+C -1 ; WX 600 ; N logicalnot ; B 104 108 631 425 ;
+C -1 ; WX 640 ; N odieresis ; B 71 -18 672 769 ;
+C -1 ; WX 600 ; N udieresis ; B 86 -18 647 769 ;
+C -1 ; WX 549 ; N notequal ; B 30 -49 619 570 ;
+C -1 ; WX 660 ; N gcommaaccent ; B 33 -226 726 800 ;
+C -1 ; WX 640 ; N eth ; B 73 -18 699 754 ;
+C -1 ; WX 460 ; N zcaron ; B 20 0 599 774 ;
+C -1 ; WX 600 ; N ncommaaccent ; B 54 -209 614 574 ;
+C -1 ; WX 336 ; N onesuperior ; B 181 296 361 740 ;
+C -1 ; WX 240 ; N imacron ; B 53 0 400 759 ;
+EndCharMetrics
+StartKernData
+StartKernPairs 933
+KPX A T -73
+KPX A Tcaron -73
+KPX A Tcommaaccent -73
+KPX A V -127
+KPX A W -96
+KPX A Y -139
+KPX A Yacute -139
+KPX A Ydieresis -139
+KPX A v -50
+KPX A w -50
+KPX A y -50
+KPX A yacute -50
+KPX A ydieresis -50
+KPX Aacute T -73
+KPX Aacute Tcaron -73
+KPX Aacute Tcommaaccent -73
+KPX Aacute V -127
+KPX Aacute W -96
+KPX Aacute Y -139
+KPX Aacute Yacute -139
+KPX Aacute Ydieresis -139
+KPX Aacute v -50
+KPX Aacute w -50
+KPX Aacute y -50
+KPX Aacute yacute -50
+KPX Aacute ydieresis -50
+KPX Abreve T -73
+KPX Abreve Tcaron -73
+KPX Abreve Tcommaaccent -73
+KPX Abreve V -127
+KPX Abreve W -96
+KPX Abreve Y -139
+KPX Abreve Yacute -139
+KPX Abreve Ydieresis -139
+KPX Abreve v -50
+KPX Abreve w -50
+KPX Abreve y -50
+KPX Abreve yacute -50
+KPX Abreve ydieresis -50
+KPX Acircumflex T -73
+KPX Acircumflex Tcaron -73
+KPX Acircumflex Tcommaaccent -73
+KPX Acircumflex V -127
+KPX Acircumflex W -96
+KPX Acircumflex Y -139
+KPX Acircumflex Yacute -139
+KPX Acircumflex Ydieresis -139
+KPX Acircumflex v -50
+KPX Acircumflex w -50
+KPX Acircumflex y -50
+KPX Acircumflex yacute -50
+KPX Acircumflex ydieresis -50
+KPX Adieresis T -73
+KPX Adieresis Tcaron -73
+KPX Adieresis Tcommaaccent -73
+KPX Adieresis V -127
+KPX Adieresis W -96
+KPX Adieresis Y -139
+KPX Adieresis Yacute -139
+KPX Adieresis Ydieresis -139
+KPX Adieresis v -50
+KPX Adieresis w -50
+KPX Adieresis y -50
+KPX Adieresis yacute -50
+KPX Adieresis ydieresis -50
+KPX Agrave T -73
+KPX Agrave Tcaron -73
+KPX Agrave Tcommaaccent -73
+KPX Agrave V -127
+KPX Agrave W -96
+KPX Agrave Y -139
+KPX Agrave Yacute -139
+KPX Agrave Ydieresis -139
+KPX Agrave v -50
+KPX Agrave w -50
+KPX Agrave y -50
+KPX Agrave yacute -50
+KPX Agrave ydieresis -50
+KPX Amacron T -73
+KPX Amacron Tcaron -73
+KPX Amacron Tcommaaccent -73
+KPX Amacron V -127
+KPX Amacron W -96
+KPX Amacron Y -139
+KPX Amacron Yacute -139
+KPX Amacron Ydieresis -139
+KPX Amacron v -50
+KPX Amacron w -50
+KPX Amacron y -50
+KPX Amacron yacute -50
+KPX Amacron ydieresis -50
+KPX Aogonek T -73
+KPX Aogonek Tcaron -73
+KPX Aogonek Tcommaaccent -73
+KPX Aogonek V -127
+KPX Aogonek W -96
+KPX Aogonek Y -139
+KPX Aogonek Yacute -139
+KPX Aogonek Ydieresis -139
+KPX Aogonek v -50
+KPX Aogonek w -50
+KPX Aogonek y -50
+KPX Aogonek yacute -50
+KPX Aogonek ydieresis -50
+KPX Aring T -73
+KPX Aring Tcaron -73
+KPX Aring Tcommaaccent -73
+KPX Aring V -127
+KPX Aring W -96
+KPX Aring Y -139
+KPX Aring Yacute -139
+KPX Aring Ydieresis -139
+KPX Aring v -50
+KPX Aring w -50
+KPX Aring y -50
+KPX Aring yacute -50
+KPX Aring ydieresis -50
+KPX Atilde T -73
+KPX Atilde Tcaron -73
+KPX Atilde Tcommaaccent -73
+KPX Atilde V -127
+KPX Atilde W -96
+KPX Atilde Y -139
+KPX Atilde Yacute -139
+KPX Atilde Ydieresis -139
+KPX Atilde v -50
+KPX Atilde w -50
+KPX Atilde y -50
+KPX Atilde yacute -50
+KPX Atilde ydieresis -50
+KPX F A -95
+KPX F Aacute -95
+KPX F Abreve -95
+KPX F Acircumflex -95
+KPX F Adieresis -95
+KPX F Agrave -95
+KPX F Amacron -95
+KPX F Aogonek -95
+KPX F Aring -95
+KPX F Atilde -95
+KPX F comma -42
+KPX F period -42
+KPX L T -50
+KPX L Tcaron -50
+KPX L Tcommaaccent -50
+KPX L V -90
+KPX L W -90
+KPX L Y -90
+KPX L Yacute -90
+KPX L Ydieresis -90
+KPX L y -75
+KPX L yacute -75
+KPX L ydieresis -75
+KPX Lacute T -50
+KPX Lacute Tcaron -50
+KPX Lacute Tcommaaccent -50
+KPX Lacute V -90
+KPX Lacute W -90
+KPX Lacute Y -90
+KPX Lacute Yacute -90
+KPX Lacute Ydieresis -90
+KPX Lacute y -75
+KPX Lacute yacute -75
+KPX Lacute ydieresis -75
+KPX Lcommaaccent T -50
+KPX Lcommaaccent Tcaron -50
+KPX Lcommaaccent Tcommaaccent -50
+KPX Lcommaaccent V -90
+KPX Lcommaaccent W -90
+KPX Lcommaaccent Y -90
+KPX Lcommaaccent Yacute -90
+KPX Lcommaaccent Ydieresis -90
+KPX Lcommaaccent y -75
+KPX Lcommaaccent yacute -75
+KPX Lcommaaccent ydieresis -75
+KPX Lslash T -50
+KPX Lslash Tcaron -50
+KPX Lslash Tcommaaccent -50
+KPX Lslash V -90
+KPX Lslash W -90
+KPX Lslash Y -90
+KPX Lslash Yacute -90
+KPX Lslash Ydieresis -90
+KPX Lslash y -75
+KPX Lslash yacute -75
+KPX Lslash ydieresis -75
+KPX P A -100
+KPX P Aacute -100
+KPX P Abreve -100
+KPX P Acircumflex -100
+KPX P Adieresis -100
+KPX P Agrave -100
+KPX P Amacron -100
+KPX P Aogonek -100
+KPX P Aring -100
+KPX P Atilde -100
+KPX P comma -16
+KPX P period -16
+KPX R T 16
+KPX R Tcaron 16
+KPX R Tcommaaccent 16
+KPX R V -26
+KPX R W -20
+KPX R Y -20
+KPX R Yacute -20
+KPX R Ydieresis -20
+KPX R y 31
+KPX R yacute 31
+KPX R ydieresis 31
+KPX Racute T 16
+KPX Racute Tcaron 16
+KPX Racute Tcommaaccent 16
+KPX Racute V -26
+KPX Racute W -20
+KPX Racute Y -20
+KPX Racute Yacute -20
+KPX Racute Ydieresis -20
+KPX Racute y 31
+KPX Racute yacute 31
+KPX Racute ydieresis 31
+KPX Rcaron T 16
+KPX Rcaron Tcaron 16
+KPX Rcaron Tcommaaccent 16
+KPX Rcaron V -26
+KPX Rcaron W -20
+KPX Rcaron Y -20
+KPX Rcaron Yacute -20
+KPX Rcaron Ydieresis -20
+KPX Rcaron y 31
+KPX Rcaron yacute 31
+KPX Rcaron ydieresis 31
+KPX Rcommaaccent T 16
+KPX Rcommaaccent Tcaron 16
+KPX Rcommaaccent Tcommaaccent 16
+KPX Rcommaaccent V -26
+KPX Rcommaaccent W -20
+KPX Rcommaaccent Y -20
+KPX Rcommaaccent Yacute -20
+KPX Rcommaaccent Ydieresis -20
+KPX Rcommaaccent y 31
+KPX Rcommaaccent yacute 31
+KPX Rcommaaccent ydieresis 31
+KPX T A -70
+KPX T Aacute -70
+KPX T Abreve -70
+KPX T Acircumflex -70
+KPX T Adieresis -70
+KPX T Agrave -70
+KPX T Amacron -70
+KPX T Aogonek -70
+KPX T Aring -70
+KPX T Atilde -70
+KPX T a -40
+KPX T aacute -40
+KPX T abreve -40
+KPX T acircumflex -40
+KPX T adieresis -40
+KPX T agrave -40
+KPX T amacron -40
+KPX T aogonek -40
+KPX T aring -40
+KPX T atilde -40
+KPX T c -50
+KPX T cacute -50
+KPX T ccaron -50
+KPX T ccedilla -50
+KPX T colon -12
+KPX T comma 4
+KPX T e -50
+KPX T eacute -50
+KPX T ecaron -50
+KPX T ecircumflex -50
+KPX T edieresis -50
+KPX T edotaccent -50
+KPX T egrave -50
+KPX T emacron -50
+KPX T eogonek -50
+KPX T hyphen -10
+KPX T i -5
+KPX T iacute 10
+KPX T icircumflex 10
+KPX T idieresis 10
+KPX T igrave 10
+KPX T imacron 10
+KPX T iogonek -5
+KPX T o -50
+KPX T oacute -50
+KPX T ocircumflex -50
+KPX T odieresis -50
+KPX T ograve -50
+KPX T ohungarumlaut -50
+KPX T omacron -50
+KPX T oslash -50
+KPX T otilde -50
+KPX T period 4
+KPX T r -42
+KPX T rcommaaccent -42
+KPX T s -43
+KPX T sacute -43
+KPX T scedilla -43
+KPX T scommaaccent -43
+KPX T semicolon -12
+KPX T u -56
+KPX T uacute -56
+KPX T ucircumflex -56
+KPX T udieresis -56
+KPX T ugrave -56
+KPX T uhungarumlaut -56
+KPX T umacron -56
+KPX T uogonek -56
+KPX T uring -56
+KPX T w -15
+KPX T y -12
+KPX T yacute -12
+KPX T ydieresis -12
+KPX Tcaron A -70
+KPX Tcaron Aacute -70
+KPX Tcaron Abreve -70
+KPX Tcaron Acircumflex -70
+KPX Tcaron Adieresis -70
+KPX Tcaron Agrave -70
+KPX Tcaron Amacron -70
+KPX Tcaron Aogonek -70
+KPX Tcaron Aring -70
+KPX Tcaron Atilde -70
+KPX Tcaron a -40
+KPX Tcaron aacute -40
+KPX Tcaron abreve -40
+KPX Tcaron acircumflex -40
+KPX Tcaron adieresis -40
+KPX Tcaron agrave -40
+KPX Tcaron amacron -40
+KPX Tcaron aogonek -40
+KPX Tcaron aring -40
+KPX Tcaron atilde -40
+KPX Tcaron c -50
+KPX Tcaron cacute -50
+KPX Tcaron ccaron -50
+KPX Tcaron ccedilla -50
+KPX Tcaron colon -12
+KPX Tcaron comma 4
+KPX Tcaron e -50
+KPX Tcaron eacute -50
+KPX Tcaron ecaron -50
+KPX Tcaron ecircumflex -50
+KPX Tcaron edieresis -50
+KPX Tcaron edotaccent -50
+KPX Tcaron egrave -50
+KPX Tcaron emacron -50
+KPX Tcaron eogonek -50
+KPX Tcaron hyphen -10
+KPX Tcaron i -5
+KPX Tcaron iacute 10
+KPX Tcaron icircumflex 10
+KPX Tcaron idieresis 10
+KPX Tcaron igrave 10
+KPX Tcaron imacron 10
+KPX Tcaron iogonek -5
+KPX Tcaron o -50
+KPX Tcaron oacute -50
+KPX Tcaron ocircumflex -50
+KPX Tcaron odieresis -50
+KPX Tcaron ograve -50
+KPX Tcaron ohungarumlaut -50
+KPX Tcaron omacron -50
+KPX Tcaron oslash -50
+KPX Tcaron otilde -50
+KPX Tcaron period 4
+KPX Tcaron r -42
+KPX Tcaron racute -42
+KPX Tcaron rcaron -42
+KPX Tcaron rcommaaccent -42
+KPX Tcaron s -43
+KPX Tcaron sacute -43
+KPX Tcaron scaron -43
+KPX Tcaron scedilla -43
+KPX Tcaron scommaaccent -43
+KPX Tcaron semicolon -12
+KPX Tcaron u -56
+KPX Tcaron uacute -56
+KPX Tcaron ucircumflex -56
+KPX Tcaron udieresis -56
+KPX Tcaron ugrave -56
+KPX Tcaron uhungarumlaut -56
+KPX Tcaron umacron -56
+KPX Tcaron uogonek -56
+KPX Tcaron uring -56
+KPX Tcaron w -15
+KPX Tcaron y -12
+KPX Tcaron yacute -12
+KPX Tcaron ydieresis -12
+KPX Tcommaaccent A -70
+KPX Tcommaaccent Aacute -70
+KPX Tcommaaccent Abreve -70
+KPX Tcommaaccent Acircumflex -70
+KPX Tcommaaccent Adieresis -70
+KPX Tcommaaccent Agrave -70
+KPX Tcommaaccent Amacron -70
+KPX Tcommaaccent Aogonek -70
+KPX Tcommaaccent Aring -70
+KPX Tcommaaccent Atilde -70
+KPX Tcommaaccent a -40
+KPX Tcommaaccent aacute -40
+KPX Tcommaaccent abreve -40
+KPX Tcommaaccent acircumflex -40
+KPX Tcommaaccent adieresis -40
+KPX Tcommaaccent agrave -40
+KPX Tcommaaccent amacron -40
+KPX Tcommaaccent aogonek -40
+KPX Tcommaaccent aring -40
+KPX Tcommaaccent atilde -40
+KPX Tcommaaccent c -50
+KPX Tcommaaccent cacute -50
+KPX Tcommaaccent ccaron -50
+KPX Tcommaaccent ccedilla -50
+KPX Tcommaaccent colon -12
+KPX Tcommaaccent comma 4
+KPX Tcommaaccent e -50
+KPX Tcommaaccent eacute -50
+KPX Tcommaaccent ecaron -50
+KPX Tcommaaccent ecircumflex -50
+KPX Tcommaaccent edieresis -50
+KPX Tcommaaccent edotaccent -50
+KPX Tcommaaccent egrave -50
+KPX Tcommaaccent emacron -50
+KPX Tcommaaccent eogonek -50
+KPX Tcommaaccent hyphen -10
+KPX Tcommaaccent i -5
+KPX Tcommaaccent iacute 10
+KPX Tcommaaccent icircumflex 10
+KPX Tcommaaccent idieresis 10
+KPX Tcommaaccent igrave 10
+KPX Tcommaaccent imacron 10
+KPX Tcommaaccent iogonek -5
+KPX Tcommaaccent o -50
+KPX Tcommaaccent oacute -50
+KPX Tcommaaccent ocircumflex -50
+KPX Tcommaaccent odieresis -50
+KPX Tcommaaccent ograve -50
+KPX Tcommaaccent ohungarumlaut -50
+KPX Tcommaaccent omacron -50
+KPX Tcommaaccent oslash -50
+KPX Tcommaaccent otilde -50
+KPX Tcommaaccent period 4
+KPX Tcommaaccent r -42
+KPX Tcommaaccent racute -42
+KPX Tcommaaccent rcaron -42
+KPX Tcommaaccent rcommaaccent -42
+KPX Tcommaaccent s -43
+KPX Tcommaaccent sacute -43
+KPX Tcommaaccent scaron -43
+KPX Tcommaaccent scedilla -43
+KPX Tcommaaccent scommaaccent -43
+KPX Tcommaaccent semicolon -12
+KPX Tcommaaccent u -56
+KPX Tcommaaccent uacute -56
+KPX Tcommaaccent ucircumflex -56
+KPX Tcommaaccent udieresis -56
+KPX Tcommaaccent ugrave -56
+KPX Tcommaaccent uhungarumlaut -56
+KPX Tcommaaccent umacron -56
+KPX Tcommaaccent uogonek -56
+KPX Tcommaaccent uring -56
+KPX Tcommaaccent w -15
+KPX Tcommaaccent y -12
+KPX Tcommaaccent yacute -12
+KPX Tcommaaccent ydieresis -12
+KPX V A -125
+KPX V Aacute -125
+KPX V Abreve -125
+KPX V Acircumflex -125
+KPX V Adieresis -125
+KPX V Agrave -125
+KPX V Amacron -125
+KPX V Aogonek -125
+KPX V Aring -125
+KPX V Atilde -125
+KPX V a -80
+KPX V aacute -80
+KPX V abreve -80
+KPX V acircumflex -80
+KPX V adieresis -80
+KPX V agrave -80
+KPX V amacron -80
+KPX V aogonek -80
+KPX V aring -80
+KPX V atilde -80
+KPX V colon -13
+KPX V comma -13
+KPX V e -80
+KPX V eacute -80
+KPX V ecaron -80
+KPX V ecircumflex -80
+KPX V edieresis -80
+KPX V edotaccent -80
+KPX V egrave -80
+KPX V emacron -80
+KPX V eogonek -80
+KPX V hyphen -20
+KPX V i -9
+KPX V iacute -9
+KPX V iogonek -9
+KPX V o -80
+KPX V oacute -80
+KPX V ocircumflex -80
+KPX V odieresis -80
+KPX V ograve -80
+KPX V ohungarumlaut -80
+KPX V omacron -80
+KPX V oslash -80
+KPX V otilde -80
+KPX V period -13
+KPX V r -40
+KPX V racute -40
+KPX V rcaron -40
+KPX V rcommaaccent -40
+KPX V semicolon -13
+KPX V u -68
+KPX V uacute -68
+KPX V ucircumflex -68
+KPX V udieresis -68
+KPX V ugrave -68
+KPX V uhungarumlaut -68
+KPX V umacron -68
+KPX V uogonek -68
+KPX V uring -68
+KPX V y -15
+KPX V yacute -15
+KPX V ydieresis -15
+KPX W A -94
+KPX W Aacute -94
+KPX W Abreve -94
+KPX W Acircumflex -94
+KPX W Adieresis -94
+KPX W Agrave -94
+KPX W Amacron -94
+KPX W Aogonek -94
+KPX W Aring -94
+KPX W Atilde -94
+KPX W a -50
+KPX W aacute -50
+KPX W abreve -50
+KPX W acircumflex -50
+KPX W adieresis -50
+KPX W agrave -50
+KPX W amacron -50
+KPX W aogonek -50
+KPX W aring -50
+KPX W atilde -50
+KPX W colon -12
+KPX W comma -12
+KPX W e -50
+KPX W eacute -50
+KPX W ecaron -50
+KPX W ecircumflex -50
+KPX W edieresis -50
+KPX W edotaccent -50
+KPX W egrave -50
+KPX W emacron -50
+KPX W eogonek -50
+KPX W hyphen -10
+KPX W i -7
+KPX W iacute 10
+KPX W icircumflex 10
+KPX W idieresis 10
+KPX W igrave 10
+KPX W imacron 10
+KPX W iogonek -7
+KPX W o -50
+KPX W oacute -50
+KPX W ocircumflex -50
+KPX W odieresis -50
+KPX W ograve -50
+KPX W ohungarumlaut -50
+KPX W omacron -50
+KPX W oslash -50
+KPX W otilde -50
+KPX W period -12
+KPX W r -39
+KPX W racute -39
+KPX W rcommaaccent -39
+KPX W semicolon -12
+KPX W u -40
+KPX W uacute -40
+KPX W ucircumflex -40
+KPX W udieresis -40
+KPX W ugrave -40
+KPX W uhungarumlaut -40
+KPX W umacron -40
+KPX W uogonek -40
+KPX W uring -40
+KPX W y 1
+KPX W yacute 1
+KPX W ydieresis 1
+KPX Y A -138
+KPX Y Aacute -138
+KPX Y Abreve -138
+KPX Y Acircumflex -138
+KPX Y Adieresis -138
+KPX Y Agrave -138
+KPX Y Amacron -138
+KPX Y Aogonek -138
+KPX Y Aring -138
+KPX Y Atilde -138
+KPX Y a -100
+KPX Y aacute -100
+KPX Y abreve -100
+KPX Y acircumflex -100
+KPX Y adieresis -100
+KPX Y agrave -100
+KPX Y amacron -100
+KPX Y aogonek -100
+KPX Y aring -100
+KPX Y atilde -100
+KPX Y colon -8
+KPX Y comma -8
+KPX Y e -100
+KPX Y eacute -100
+KPX Y ecaron -100
+KPX Y ecircumflex -100
+KPX Y edieresis -100
+KPX Y edotaccent -100
+KPX Y egrave -100
+KPX Y emacron -100
+KPX Y eogonek -100
+KPX Y hyphen -60
+KPX Y i -5
+KPX Y iacute -5
+KPX Y icircumflex 10
+KPX Y idieresis 10
+KPX Y igrave 10
+KPX Y imacron 10
+KPX Y iogonek -5
+KPX Y o -100
+KPX Y oacute -100
+KPX Y ocircumflex -100
+KPX Y odieresis -100
+KPX Y ograve -100
+KPX Y ohungarumlaut -100
+KPX Y omacron -100
+KPX Y oslash -100
+KPX Y otilde -100
+KPX Y p -60
+KPX Y period -8
+KPX Y q -100
+KPX Y semicolon -8
+KPX Y u -82
+KPX Y uacute -82
+KPX Y ucircumflex -82
+KPX Y udieresis -82
+KPX Y ugrave -82
+KPX Y uhungarumlaut -82
+KPX Y umacron -82
+KPX Y uogonek -82
+KPX Y uring -82
+KPX Y v -25
+KPX Yacute A -138
+KPX Yacute Aacute -138
+KPX Yacute Abreve -138
+KPX Yacute Acircumflex -138
+KPX Yacute Adieresis -138
+KPX Yacute Agrave -138
+KPX Yacute Amacron -138
+KPX Yacute Aogonek -138
+KPX Yacute Aring -138
+KPX Yacute Atilde -138
+KPX Yacute a -100
+KPX Yacute aacute -100
+KPX Yacute abreve -100
+KPX Yacute acircumflex -100
+KPX Yacute adieresis -100
+KPX Yacute agrave -100
+KPX Yacute amacron -100
+KPX Yacute aogonek -100
+KPX Yacute aring -100
+KPX Yacute atilde -100
+KPX Yacute colon -8
+KPX Yacute comma -8
+KPX Yacute e -100
+KPX Yacute eacute -100
+KPX Yacute ecaron -100
+KPX Yacute ecircumflex -100
+KPX Yacute edieresis -100
+KPX Yacute edotaccent -100
+KPX Yacute egrave -100
+KPX Yacute emacron -100
+KPX Yacute eogonek -100
+KPX Yacute hyphen -60
+KPX Yacute i -5
+KPX Yacute iacute -5
+KPX Yacute icircumflex 10
+KPX Yacute idieresis 10
+KPX Yacute igrave 10
+KPX Yacute imacron 10
+KPX Yacute iogonek -5
+KPX Yacute o -100
+KPX Yacute oacute -100
+KPX Yacute ocircumflex -100
+KPX Yacute odieresis -100
+KPX Yacute ograve -100
+KPX Yacute ohungarumlaut -100
+KPX Yacute omacron -100
+KPX Yacute oslash -100
+KPX Yacute otilde -100
+KPX Yacute p -60
+KPX Yacute period -8
+KPX Yacute q -100
+KPX Yacute semicolon -8
+KPX Yacute u -82
+KPX Yacute uacute -82
+KPX Yacute ucircumflex -82
+KPX Yacute udieresis -82
+KPX Yacute ugrave -82
+KPX Yacute uhungarumlaut -82
+KPX Yacute umacron -82
+KPX Yacute uogonek -82
+KPX Yacute uring -82
+KPX Yacute v -25
+KPX Ydieresis A -138
+KPX Ydieresis Aacute -138
+KPX Ydieresis Abreve -138
+KPX Ydieresis Acircumflex -138
+KPX Ydieresis Adieresis -138
+KPX Ydieresis Agrave -138
+KPX Ydieresis Amacron -138
+KPX Ydieresis Aogonek -138
+KPX Ydieresis Aring -138
+KPX Ydieresis Atilde -138
+KPX Ydieresis a -100
+KPX Ydieresis aacute -100
+KPX Ydieresis abreve -100
+KPX Ydieresis acircumflex -100
+KPX Ydieresis adieresis -100
+KPX Ydieresis agrave -100
+KPX Ydieresis amacron -100
+KPX Ydieresis aogonek -100
+KPX Ydieresis aring -100
+KPX Ydieresis atilde -100
+KPX Ydieresis colon -8
+KPX Ydieresis comma -8
+KPX Ydieresis e -100
+KPX Ydieresis eacute -100
+KPX Ydieresis ecaron -100
+KPX Ydieresis ecircumflex -100
+KPX Ydieresis edieresis -100
+KPX Ydieresis edotaccent -100
+KPX Ydieresis egrave -100
+KPX Ydieresis emacron -100
+KPX Ydieresis eogonek -100
+KPX Ydieresis hyphen -60
+KPX Ydieresis i -5
+KPX Ydieresis iacute -5
+KPX Ydieresis icircumflex 10
+KPX Ydieresis idieresis 10
+KPX Ydieresis igrave 10
+KPX Ydieresis imacron 10
+KPX Ydieresis iogonek -5
+KPX Ydieresis o -100
+KPX Ydieresis oacute -100
+KPX Ydieresis ocircumflex -100
+KPX Ydieresis odieresis -100
+KPX Ydieresis ograve -100
+KPX Ydieresis ohungarumlaut -100
+KPX Ydieresis omacron -100
+KPX Ydieresis oslash -100
+KPX Ydieresis otilde -100
+KPX Ydieresis p -60
+KPX Ydieresis period -8
+KPX Ydieresis q -100
+KPX Ydieresis semicolon -8
+KPX Ydieresis u -82
+KPX Ydieresis uacute -82
+KPX Ydieresis ucircumflex -82
+KPX Ydieresis udieresis -82
+KPX Ydieresis ugrave -82
+KPX Ydieresis uhungarumlaut -82
+KPX Ydieresis umacron -82
+KPX Ydieresis uogonek -82
+KPX Ydieresis uring -82
+KPX Ydieresis v -25
+KPX f f 38
+KPX r c -27
+KPX r cacute -27
+KPX r ccaron -27
+KPX r ccedilla -27
+KPX r comma 9
+KPX r d -8
+KPX r dcroat -8
+KPX r e -8
+KPX r eacute -8
+KPX r ecaron -8
+KPX r ecircumflex -8
+KPX r edieresis -8
+KPX r edotaccent -8
+KPX r egrave -8
+KPX r emacron -8
+KPX r eogonek -8
+KPX r f 38
+KPX r g -8
+KPX r gbreve -8
+KPX r gcommaaccent -8
+KPX r hyphen -10
+KPX r m 5
+KPX r n 5
+KPX r nacute 5
+KPX r ncaron 5
+KPX r ncommaaccent 5
+KPX r ntilde 5
+KPX r o -18
+KPX r oacute -18
+KPX r ocircumflex -18
+KPX r odieresis -18
+KPX r ograve -18
+KPX r ohungarumlaut -18
+KPX r omacron -18
+KPX r oslash -18
+KPX r otilde -18
+KPX r period 9
+KPX r q -18
+KPX racute c -27
+KPX racute cacute -27
+KPX racute ccaron -27
+KPX racute ccedilla -27
+KPX racute comma 9
+KPX racute d -8
+KPX racute dcroat -8
+KPX racute e -8
+KPX racute eacute -8
+KPX racute ecaron -8
+KPX racute ecircumflex -8
+KPX racute edieresis -8
+KPX racute edotaccent -8
+KPX racute egrave -8
+KPX racute emacron -8
+KPX racute eogonek -8
+KPX racute f 38
+KPX racute g -8
+KPX racute gbreve -8
+KPX racute gcommaaccent -8
+KPX racute hyphen -10
+KPX racute m 5
+KPX racute n 5
+KPX racute nacute 5
+KPX racute ncaron 5
+KPX racute ncommaaccent 5
+KPX racute ntilde 5
+KPX racute o -18
+KPX racute oacute -18
+KPX racute ocircumflex -18
+KPX racute odieresis -18
+KPX racute ograve -18
+KPX racute ohungarumlaut -18
+KPX racute omacron -18
+KPX racute oslash -18
+KPX racute otilde -18
+KPX racute period 9
+KPX racute q -18
+KPX rcaron c -27
+KPX rcaron cacute -27
+KPX rcaron ccaron -27
+KPX rcaron ccedilla -27
+KPX rcaron comma 9
+KPX rcaron d -8
+KPX rcaron dcroat -8
+KPX rcaron e -8
+KPX rcaron eacute -8
+KPX rcaron ecaron -8
+KPX rcaron ecircumflex -8
+KPX rcaron edieresis -8
+KPX rcaron edotaccent -8
+KPX rcaron egrave -8
+KPX rcaron emacron -8
+KPX rcaron eogonek -8
+KPX rcaron f 38
+KPX rcaron g -8
+KPX rcaron gbreve -8
+KPX rcaron gcommaaccent -8
+KPX rcaron hyphen -10
+KPX rcaron m 5
+KPX rcaron n 5
+KPX rcaron nacute 5
+KPX rcaron ncaron 5
+KPX rcaron ncommaaccent 5
+KPX rcaron ntilde 5
+KPX rcaron o -18
+KPX rcaron oacute -18
+KPX rcaron ocircumflex -18
+KPX rcaron odieresis -18
+KPX rcaron ograve -18
+KPX rcaron ohungarumlaut -18
+KPX rcaron omacron -18
+KPX rcaron oslash -18
+KPX rcaron otilde -18
+KPX rcaron period 9
+KPX rcaron q -18
+KPX rcommaaccent c -27
+KPX rcommaaccent cacute -27
+KPX rcommaaccent ccaron -27
+KPX rcommaaccent ccedilla -27
+KPX rcommaaccent comma 9
+KPX rcommaaccent d -8
+KPX rcommaaccent dcroat -8
+KPX rcommaaccent e -8
+KPX rcommaaccent eacute -8
+KPX rcommaaccent ecaron -8
+KPX rcommaaccent ecircumflex -8
+KPX rcommaaccent edieresis -8
+KPX rcommaaccent edotaccent -8
+KPX rcommaaccent egrave -8
+KPX rcommaaccent emacron -8
+KPX rcommaaccent eogonek -8
+KPX rcommaaccent f 38
+KPX rcommaaccent g -8
+KPX rcommaaccent gbreve -8
+KPX rcommaaccent gcommaaccent -8
+KPX rcommaaccent hyphen -10
+KPX rcommaaccent m 5
+KPX rcommaaccent n 5
+KPX rcommaaccent nacute 5
+KPX rcommaaccent ncaron 5
+KPX rcommaaccent ncommaaccent 5
+KPX rcommaaccent ntilde 5
+KPX rcommaaccent o -18
+KPX rcommaaccent oacute -18
+KPX rcommaaccent ocircumflex -18
+KPX rcommaaccent odieresis -18
+KPX rcommaaccent ograve -18
+KPX rcommaaccent ohungarumlaut -18
+KPX rcommaaccent omacron -18
+KPX rcommaaccent oslash -18
+KPX rcommaaccent otilde -18
+KPX rcommaaccent period 9
+KPX rcommaaccent q -18
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/src/fonts/Adobe-Core35_AFMs-314/ITCBookman-Demi.afm b/src/fonts/Adobe-Core35_AFMs-314/ITCBookman-Demi.afm
new file mode 100644
index 0000000..2e8b3ef
--- /dev/null
+++ b/src/fonts/Adobe-Core35_AFMs-314/ITCBookman-Demi.afm
@@ -0,0 +1,1256 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1985, 1987, 1989, 1992, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Thu May 1 13:44:58 1997
+Comment UniqueID 43079
+Comment VMusage 45854 56879
+FontName Bookman-Demi
+FullName ITC Bookman Demi
+FamilyName ITC Bookman
+Weight Demi
+ItalicAngle 0
+IsFixedPitch false
+FontBBox -194 -250 1346 934
+UnderlinePosition -100
+UnderlineThickness 50
+Version 002.000
+Notice Copyright (c) 1985, 1987, 1989, 1992, 1997 Adobe Systems Incorporated. All Rights Reserved.ITC Bookman is a registered trademark of International Typeface Corporation.
+EncodingScheme AdobeStandardEncoding
+CapHeight 681
+XHeight 502
+Ascender 717
+Descender -228
+StdHW 82
+StdVW 167
+StartCharMetrics 314
+C 32 ; WX 340 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 360 ; N exclam ; B 82 -8 282 698 ;
+C 34 ; WX 420 ; N quotedbl ; B 11 379 369 698 ;
+C 35 ; WX 660 ; N numbersign ; B 84 0 576 681 ;
+C 36 ; WX 660 ; N dollar ; B 48 -119 620 805 ;
+C 37 ; WX 940 ; N percent ; B 12 -8 924 698 ;
+C 38 ; WX 800 ; N ampersand ; B 21 -17 772 698 ;
+C 39 ; WX 320 ; N quoteright ; B 82 440 242 698 ;
+C 40 ; WX 320 ; N parenleft ; B 48 -150 289 749 ;
+C 41 ; WX 320 ; N parenright ; B 20 -150 262 749 ;
+C 42 ; WX 460 ; N asterisk ; B 62 317 405 697 ;
+C 43 ; WX 600 ; N plus ; B 51 9 555 514 ;
+C 44 ; WX 340 ; N comma ; B 78 -124 257 162 ;
+C 45 ; WX 360 ; N hyphen ; B 20 210 340 318 ;
+C 46 ; WX 340 ; N period ; B 76 -8 258 172 ;
+C 47 ; WX 600 ; N slash ; B 50 -149 555 725 ;
+C 48 ; WX 660 ; N zero ; B 30 -17 639 698 ;
+C 49 ; WX 660 ; N one ; B 137 0 568 681 ;
+C 50 ; WX 660 ; N two ; B 41 0 628 698 ;
+C 51 ; WX 660 ; N three ; B 37 -17 631 698 ;
+C 52 ; WX 660 ; N four ; B 19 0 649 681 ;
+C 53 ; WX 660 ; N five ; B 44 -17 623 723 ;
+C 54 ; WX 660 ; N six ; B 34 -17 634 698 ;
+C 55 ; WX 660 ; N seven ; B 36 0 632 681 ;
+C 56 ; WX 660 ; N eight ; B 36 -17 633 698 ;
+C 57 ; WX 660 ; N nine ; B 33 -17 636 698 ;
+C 58 ; WX 340 ; N colon ; B 76 -8 258 515 ;
+C 59 ; WX 340 ; N semicolon ; B 75 -124 259 515 ;
+C 60 ; WX 600 ; N less ; B 49 -9 558 542 ;
+C 61 ; WX 600 ; N equal ; B 51 109 555 421 ;
+C 62 ; WX 600 ; N greater ; B 48 -9 557 542 ;
+C 63 ; WX 660 ; N question ; B 61 -8 608 698 ;
+C 64 ; WX 820 ; N at ; B 60 -17 758 698 ;
+C 65 ; WX 720 ; N A ; B -34 0 763 681 ;
+C 66 ; WX 720 ; N B ; B 20 0 693 681 ;
+C 67 ; WX 740 ; N C ; B 35 -17 724 698 ;
+C 68 ; WX 780 ; N D ; B 20 0 748 681 ;
+C 69 ; WX 720 ; N E ; B 20 0 724 681 ;
+C 70 ; WX 680 ; N F ; B 20 0 686 681 ;
+C 71 ; WX 780 ; N G ; B 35 -17 773 698 ;
+C 72 ; WX 820 ; N H ; B 20 0 800 681 ;
+C 73 ; WX 400 ; N I ; B 20 0 379 681 ;
+C 74 ; WX 640 ; N J ; B -12 -17 622 681 ;
+C 75 ; WX 800 ; N K ; B 20 0 796 681 ;
+C 76 ; WX 640 ; N L ; B 20 0 668 681 ;
+C 77 ; WX 940 ; N M ; B 20 0 924 681 ;
+C 78 ; WX 740 ; N N ; B 20 0 724 681 ;
+C 79 ; WX 800 ; N O ; B 35 -17 769 698 ;
+C 80 ; WX 660 ; N P ; B 20 0 658 681 ;
+C 81 ; WX 800 ; N Q ; B 35 -226 775 698 ;
+C 82 ; WX 780 ; N R ; B 20 0 783 681 ;
+C 83 ; WX 660 ; N S ; B 21 -17 639 698 ;
+C 84 ; WX 700 ; N T ; B -4 0 703 681 ;
+C 85 ; WX 740 ; N U ; B 15 -17 724 681 ;
+C 86 ; WX 720 ; N V ; B -20 0 730 681 ;
+C 87 ; WX 940 ; N W ; B -20 0 963 681 ;
+C 88 ; WX 780 ; N X ; B 1 0 770 681 ;
+C 89 ; WX 700 ; N Y ; B -20 0 718 681 ;
+C 90 ; WX 640 ; N Z ; B 6 0 635 681 ;
+C 91 ; WX 300 ; N bracketleft ; B 75 -138 285 725 ;
+C 92 ; WX 600 ; N backslash ; B 50 0 555 725 ;
+C 93 ; WX 300 ; N bracketright ; B 21 -138 231 725 ;
+C 94 ; WX 600 ; N asciicircum ; B 52 281 554 681 ;
+C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;
+C 96 ; WX 320 ; N quoteleft ; B 82 440 242 698 ;
+C 97 ; WX 580 ; N a ; B 28 -8 588 515 ;
+C 98 ; WX 600 ; N b ; B -20 -8 568 725 ;
+C 99 ; WX 580 ; N c ; B 31 -8 550 515 ;
+C 100 ; WX 640 ; N d ; B 31 -8 622 725 ;
+C 101 ; WX 580 ; N e ; B 31 -8 548 515 ;
+C 102 ; WX 380 ; N f ; B 22 0 461 741 ; L i fi ; L l fl ;
+C 103 ; WX 580 ; N g ; B 9 -243 583 595 ;
+C 104 ; WX 680 ; N h ; B 22 0 654 725 ;
+C 105 ; WX 360 ; N i ; B 22 0 335 729 ;
+C 106 ; WX 340 ; N j ; B -94 -221 278 729 ;
+C 107 ; WX 660 ; N k ; B 22 0 643 725 ;
+C 108 ; WX 340 ; N l ; B 9 0 322 725 ;
+C 109 ; WX 1000 ; N m ; B 22 0 980 515 ;
+C 110 ; WX 680 ; N n ; B 22 0 652 515 ;
+C 111 ; WX 620 ; N o ; B 31 -8 585 515 ;
+C 112 ; WX 640 ; N p ; B 22 -212 611 515 ;
+C 113 ; WX 620 ; N q ; B 31 -212 633 515 ;
+C 114 ; WX 460 ; N r ; B 22 0 462 502 ;
+C 115 ; WX 520 ; N s ; B 22 -8 492 515 ;
+C 116 ; WX 460 ; N t ; B 22 -8 445 660 ;
+C 117 ; WX 660 ; N u ; B 22 -8 653 502 ;
+C 118 ; WX 600 ; N v ; B -6 0 593 502 ;
+C 119 ; WX 800 ; N w ; B -6 0 810 502 ;
+C 120 ; WX 600 ; N x ; B 8 0 591 502 ;
+C 121 ; WX 620 ; N y ; B 6 -221 613 502 ;
+C 122 ; WX 560 ; N z ; B 22 0 547 502 ;
+C 123 ; WX 320 ; N braceleft ; B 14 -139 301 726 ;
+C 124 ; WX 600 ; N bar ; B 243 -250 362 750 ;
+C 125 ; WX 320 ; N braceright ; B 15 -140 302 725 ;
+C 126 ; WX 600 ; N asciitilde ; B 51 162 555 368 ;
+C 161 ; WX 360 ; N exclamdown ; B 84 -191 284 515 ;
+C 162 ; WX 660 ; N cent ; B 133 17 535 674 ;
+C 163 ; WX 660 ; N sterling ; B 10 -17 659 698 ;
+C 164 ; WX 120 ; N fraction ; B -194 0 312 681 ;
+C 165 ; WX 660 ; N yen ; B -28 0 696 681 ;
+C 166 ; WX 660 ; N florin ; B -46 -209 674 749 ;
+C 167 ; WX 600 ; N section ; B 36 -153 560 698 ;
+C 168 ; WX 660 ; N currency ; B 77 88 584 593 ;
+C 169 ; WX 240 ; N quotesingle ; B 42 379 178 698 ;
+C 170 ; WX 540 ; N quotedblleft ; B 82 439 449 698 ;
+C 171 ; WX 400 ; N guillemotleft ; B 34 101 360 457 ;
+C 172 ; WX 220 ; N guilsinglleft ; B 34 101 188 457 ;
+C 173 ; WX 220 ; N guilsinglright ; B 34 101 188 457 ;
+C 174 ; WX 740 ; N fi ; B 22 0 710 741 ;
+C 175 ; WX 740 ; N fl ; B 22 0 710 741 ;
+C 177 ; WX 500 ; N endash ; B -25 212 525 318 ;
+C 178 ; WX 440 ; N dagger ; B 33 -156 398 698 ;
+C 179 ; WX 380 ; N daggerdbl ; B 8 -156 380 698 ;
+C 180 ; WX 340 ; N periodcentered ; B 76 175 258 355 ;
+C 182 ; WX 800 ; N paragraph ; B 51 0 698 681 ;
+C 183 ; WX 460 ; N bullet ; B 60 170 404 511 ;
+C 184 ; WX 320 ; N quotesinglbase ; B 82 -114 242 144 ;
+C 185 ; WX 540 ; N quotedblbase ; B 82 -114 450 144 ;
+C 186 ; WX 540 ; N quotedblright ; B 82 440 449 698 ;
+C 187 ; WX 400 ; N guillemotright ; B 34 101 360 457 ;
+C 188 ; WX 1000 ; N ellipsis ; B 76 -8 924 172 ;
+C 189 ; WX 1360 ; N perthousand ; B 12 -8 1346 698 ;
+C 191 ; WX 660 ; N questiondown ; B 62 -191 609 515 ;
+C 193 ; WX 400 ; N grave ; B 68 547 327 730 ;
+C 194 ; WX 400 ; N acute ; B 98 547 357 731 ;
+C 195 ; WX 500 ; N circumflex ; B 68 555 430 731 ;
+C 196 ; WX 480 ; N tilde ; B 69 556 421 691 ;
+C 197 ; WX 460 ; N macron ; B 68 577 383 663 ;
+C 198 ; WX 500 ; N breve ; B 68 553 429 722 ;
+C 199 ; WX 320 ; N dotaccent ; B 68 535 259 729 ;
+C 200 ; WX 500 ; N dieresis ; B 68 535 441 673 ;
+C 202 ; WX 340 ; N ring ; B 68 552 275 755 ;
+C 203 ; WX 360 ; N cedilla ; B 68 -213 284 0 ;
+C 205 ; WX 440 ; N hungarumlaut ; B 68 554 365 741 ;
+C 206 ; WX 320 ; N ogonek ; B 82 -199 314 0 ;
+C 207 ; WX 500 ; N caron ; B 68 541 430 717 ;
+C 208 ; WX 1000 ; N emdash ; B -25 212 1025 318 ;
+C 225 ; WX 1140 ; N AE ; B -34 0 1149 681 ;
+C 227 ; WX 400 ; N ordfeminine ; B 27 383 396 698 ;
+C 232 ; WX 640 ; N Lslash ; B 20 0 668 681 ;
+C 233 ; WX 800 ; N Oslash ; B 35 -110 771 781 ;
+C 234 ; WX 1220 ; N OE ; B 35 -17 1219 698 ;
+C 235 ; WX 400 ; N ordmasculine ; B 17 383 383 698 ;
+C 241 ; WX 880 ; N ae ; B 28 -8 852 515 ;
+C 245 ; WX 360 ; N dotlessi ; B 22 0 335 502 ;
+C 248 ; WX 340 ; N lslash ; B 9 0 322 725 ;
+C 249 ; WX 620 ; N oslash ; B 31 -40 586 551 ;
+C 250 ; WX 940 ; N oe ; B 31 -8 908 515 ;
+C 251 ; WX 660 ; N germandbls ; B -61 -91 644 699 ;
+C -1 ; WX 400 ; N Idieresis ; B 18 0 391 877 ;
+C -1 ; WX 580 ; N eacute ; B 31 -8 548 731 ;
+C -1 ; WX 580 ; N abreve ; B 28 -8 588 722 ;
+C -1 ; WX 660 ; N uhungarumlaut ; B 22 -8 653 741 ;
+C -1 ; WX 580 ; N ecaron ; B 31 -8 548 717 ;
+C -1 ; WX 700 ; N Ydieresis ; B -20 0 718 877 ;
+C -1 ; WX 600 ; N divide ; B 51 9 555 521 ;
+C -1 ; WX 700 ; N Yacute ; B -20 0 718 910 ;
+C -1 ; WX 720 ; N Acircumflex ; B -34 0 763 910 ;
+C -1 ; WX 580 ; N aacute ; B 28 -8 588 731 ;
+C -1 ; WX 740 ; N Ucircumflex ; B 15 -17 724 910 ;
+C -1 ; WX 620 ; N yacute ; B 6 -221 613 731 ;
+C -1 ; WX 520 ; N scommaaccent ; B 22 -249 492 515 ;
+C -1 ; WX 580 ; N ecircumflex ; B 31 -8 548 731 ;
+C -1 ; WX 740 ; N Uring ; B 15 -17 724 934 ;
+C -1 ; WX 740 ; N Udieresis ; B 15 -17 724 877 ;
+C -1 ; WX 580 ; N aogonek ; B 28 -206 594 515 ;
+C -1 ; WX 740 ; N Uacute ; B 15 -17 724 910 ;
+C -1 ; WX 660 ; N uogonek ; B 22 -199 663 502 ;
+C -1 ; WX 720 ; N Edieresis ; B 20 0 724 877 ;
+C -1 ; WX 780 ; N Dcroat ; B 20 0 748 681 ;
+C -1 ; WX 250 ; N commaaccent ; B 53 -249 197 -40 ;
+C -1 ; WX 740 ; N copyright ; B 23 -17 723 698 ;
+C -1 ; WX 720 ; N Emacron ; B 20 0 724 842 ;
+C -1 ; WX 580 ; N ccaron ; B 31 -8 550 717 ;
+C -1 ; WX 580 ; N aring ; B 28 -8 588 755 ;
+C -1 ; WX 740 ; N Ncommaaccent ; B 20 -249 724 681 ;
+C -1 ; WX 340 ; N lacute ; B 9 0 367 930 ;
+C -1 ; WX 580 ; N agrave ; B 28 -8 588 730 ;
+C -1 ; WX 700 ; N Tcommaaccent ; B -4 -249 703 681 ;
+C -1 ; WX 740 ; N Cacute ; B 35 -17 724 910 ;
+C -1 ; WX 580 ; N atilde ; B 28 -8 588 691 ;
+C -1 ; WX 720 ; N Edotaccent ; B 20 0 724 933 ;
+C -1 ; WX 520 ; N scaron ; B 22 -8 492 717 ;
+C -1 ; WX 520 ; N scedilla ; B 22 -213 492 515 ;
+C -1 ; WX 360 ; N iacute ; B 22 0 337 731 ;
+C -1 ; WX 494 ; N lozenge ; B 10 0 484 745 ;
+C -1 ; WX 780 ; N Rcaron ; B 20 0 783 896 ;
+C -1 ; WX 780 ; N Gcommaaccent ; B 35 -249 773 698 ;
+C -1 ; WX 660 ; N ucircumflex ; B 22 -8 653 731 ;
+C -1 ; WX 580 ; N acircumflex ; B 28 -8 588 731 ;
+C -1 ; WX 720 ; N Amacron ; B -34 0 763 842 ;
+C -1 ; WX 460 ; N rcaron ; B 22 0 462 717 ;
+C -1 ; WX 580 ; N ccedilla ; B 31 -213 550 515 ;
+C -1 ; WX 640 ; N Zdotaccent ; B 6 0 635 933 ;
+C -1 ; WX 660 ; N Thorn ; B 20 0 658 681 ;
+C -1 ; WX 800 ; N Omacron ; B 35 -17 769 842 ;
+C -1 ; WX 780 ; N Racute ; B 20 0 783 910 ;
+C -1 ; WX 660 ; N Sacute ; B 21 -17 639 910 ;
+C -1 ; WX 737 ; N dcaron ; B 31 -8 726 731 ;
+C -1 ; WX 740 ; N Umacron ; B 15 -17 724 842 ;
+C -1 ; WX 660 ; N uring ; B 22 -8 653 755 ;
+C -1 ; WX 396 ; N threesuperior ; B 5 269 391 698 ;
+C -1 ; WX 800 ; N Ograve ; B 35 -17 769 909 ;
+C -1 ; WX 720 ; N Agrave ; B -34 0 763 909 ;
+C -1 ; WX 720 ; N Abreve ; B -34 0 763 901 ;
+C -1 ; WX 600 ; N multiply ; B 48 10 552 514 ;
+C -1 ; WX 660 ; N uacute ; B 22 -8 653 731 ;
+C -1 ; WX 700 ; N Tcaron ; B -4 0 703 896 ;
+C -1 ; WX 494 ; N partialdiff ; B 11 -21 494 750 ;
+C -1 ; WX 620 ; N ydieresis ; B 6 -221 613 698 ;
+C -1 ; WX 740 ; N Nacute ; B 20 0 724 910 ;
+C -1 ; WX 360 ; N icircumflex ; B -2 0 360 731 ;
+C -1 ; WX 720 ; N Ecircumflex ; B 20 0 724 910 ;
+C -1 ; WX 580 ; N adieresis ; B 28 -8 588 698 ;
+C -1 ; WX 580 ; N edieresis ; B 31 -8 548 698 ;
+C -1 ; WX 580 ; N cacute ; B 31 -8 550 731 ;
+C -1 ; WX 680 ; N nacute ; B 22 0 652 731 ;
+C -1 ; WX 660 ; N umacron ; B 22 -8 653 663 ;
+C -1 ; WX 740 ; N Ncaron ; B 20 0 724 896 ;
+C -1 ; WX 400 ; N Iacute ; B 20 0 379 910 ;
+C -1 ; WX 600 ; N plusminus ; B 51 0 555 514 ;
+C -1 ; WX 600 ; N brokenbar ; B 243 -175 362 675 ;
+C -1 ; WX 740 ; N registered ; B 23 -17 723 698 ;
+C -1 ; WX 780 ; N Gbreve ; B 35 -17 773 901 ;
+C -1 ; WX 400 ; N Idotaccent ; B 20 0 379 933 ;
+C -1 ; WX 600 ; N summation ; B 14 -10 585 706 ;
+C -1 ; WX 720 ; N Egrave ; B 20 0 724 909 ;
+C -1 ; WX 460 ; N racute ; B 22 0 462 731 ;
+C -1 ; WX 620 ; N omacron ; B 31 -8 585 663 ;
+C -1 ; WX 640 ; N Zacute ; B 6 0 635 910 ;
+C -1 ; WX 640 ; N Zcaron ; B 6 0 635 896 ;
+C -1 ; WX 549 ; N greaterequal ; B 26 0 523 704 ;
+C -1 ; WX 780 ; N Eth ; B 20 0 748 681 ;
+C -1 ; WX 740 ; N Ccedilla ; B 35 -213 724 698 ;
+C -1 ; WX 340 ; N lcommaaccent ; B 9 -249 322 725 ;
+C -1 ; WX 460 ; N tcaron ; B 22 -8 445 794 ;
+C -1 ; WX 580 ; N eogonek ; B 31 -204 548 515 ;
+C -1 ; WX 740 ; N Uogonek ; B 15 -199 724 681 ;
+C -1 ; WX 720 ; N Aacute ; B -34 0 763 910 ;
+C -1 ; WX 720 ; N Adieresis ; B -34 0 763 877 ;
+C -1 ; WX 580 ; N egrave ; B 31 -8 548 730 ;
+C -1 ; WX 560 ; N zacute ; B 22 0 547 731 ;
+C -1 ; WX 360 ; N iogonek ; B 22 -199 335 729 ;
+C -1 ; WX 800 ; N Oacute ; B 35 -17 769 910 ;
+C -1 ; WX 620 ; N oacute ; B 31 -8 585 731 ;
+C -1 ; WX 580 ; N amacron ; B 28 -8 588 663 ;
+C -1 ; WX 520 ; N sacute ; B 22 -8 492 731 ;
+C -1 ; WX 360 ; N idieresis ; B -2 0 371 698 ;
+C -1 ; WX 800 ; N Ocircumflex ; B 35 -17 769 910 ;
+C -1 ; WX 740 ; N Ugrave ; B 15 -17 724 909 ;
+C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ;
+C -1 ; WX 640 ; N thorn ; B 22 -212 611 725 ;
+C -1 ; WX 396 ; N twosuperior ; B 14 279 396 698 ;
+C -1 ; WX 800 ; N Odieresis ; B 35 -17 769 877 ;
+C -1 ; WX 660 ; N mu ; B 22 -221 653 502 ;
+C -1 ; WX 360 ; N igrave ; B 18 0 335 730 ;
+C -1 ; WX 620 ; N ohungarumlaut ; B 31 -8 585 741 ;
+C -1 ; WX 720 ; N Eogonek ; B 20 -204 724 681 ;
+C -1 ; WX 640 ; N dcroat ; B 31 -8 622 725 ;
+C -1 ; WX 990 ; N threequarters ; B 15 0 967 692 ;
+C -1 ; WX 660 ; N Scedilla ; B 21 -213 639 698 ;
+C -1 ; WX 450 ; N lcaron ; B 9 0 434 731 ;
+C -1 ; WX 800 ; N Kcommaaccent ; B 20 -249 796 681 ;
+C -1 ; WX 640 ; N Lacute ; B 20 0 668 910 ;
+C -1 ; WX 980 ; N trademark ; B 42 277 982 681 ;
+C -1 ; WX 580 ; N edotaccent ; B 31 -8 548 754 ;
+C -1 ; WX 400 ; N Igrave ; B 20 0 379 909 ;
+C -1 ; WX 400 ; N Imacron ; B 20 0 379 842 ;
+C -1 ; WX 640 ; N Lcaron ; B 20 0 668 698 ;
+C -1 ; WX 990 ; N onehalf ; B 65 0 980 681 ;
+C -1 ; WX 549 ; N lessequal ; B 29 0 526 704 ;
+C -1 ; WX 620 ; N ocircumflex ; B 31 -8 585 731 ;
+C -1 ; WX 680 ; N ntilde ; B 22 0 652 691 ;
+C -1 ; WX 740 ; N Uhungarumlaut ; B 15 -17 724 920 ;
+C -1 ; WX 720 ; N Eacute ; B 20 0 724 910 ;
+C -1 ; WX 580 ; N emacron ; B 31 -8 548 663 ;
+C -1 ; WX 580 ; N gbreve ; B 9 -243 583 722 ;
+C -1 ; WX 990 ; N onequarter ; B 65 0 967 681 ;
+C -1 ; WX 660 ; N Scaron ; B 21 -17 639 896 ;
+C -1 ; WX 660 ; N Scommaaccent ; B 21 -249 639 698 ;
+C -1 ; WX 800 ; N Ohungarumlaut ; B 35 -17 769 920 ;
+C -1 ; WX 400 ; N degree ; B 50 398 350 698 ;
+C -1 ; WX 620 ; N ograve ; B 31 -8 585 730 ;
+C -1 ; WX 740 ; N Ccaron ; B 35 -17 724 896 ;
+C -1 ; WX 660 ; N ugrave ; B 22 -8 653 730 ;
+C -1 ; WX 549 ; N radical ; B 10 -46 512 850 ;
+C -1 ; WX 780 ; N Dcaron ; B 20 0 748 896 ;
+C -1 ; WX 460 ; N rcommaaccent ; B 22 -249 462 502 ;
+C -1 ; WX 740 ; N Ntilde ; B 20 0 724 870 ;
+C -1 ; WX 620 ; N otilde ; B 31 -8 585 691 ;
+C -1 ; WX 780 ; N Rcommaaccent ; B 20 -249 783 681 ;
+C -1 ; WX 640 ; N Lcommaaccent ; B 20 -249 668 681 ;
+C -1 ; WX 720 ; N Atilde ; B -34 0 763 870 ;
+C -1 ; WX 720 ; N Aogonek ; B -34 -199 763 681 ;
+C -1 ; WX 720 ; N Aring ; B -34 0 763 934 ;
+C -1 ; WX 800 ; N Otilde ; B 35 -17 769 870 ;
+C -1 ; WX 560 ; N zdotaccent ; B 22 0 547 754 ;
+C -1 ; WX 720 ; N Ecaron ; B 20 0 724 896 ;
+C -1 ; WX 400 ; N Iogonek ; B 20 -204 379 681 ;
+C -1 ; WX 660 ; N kcommaaccent ; B 22 -249 643 725 ;
+C -1 ; WX 600 ; N minus ; B 51 207 555 323 ;
+C -1 ; WX 400 ; N Icircumflex ; B 18 0 380 910 ;
+C -1 ; WX 680 ; N ncaron ; B 22 0 652 717 ;
+C -1 ; WX 460 ; N tcommaaccent ; B 22 -249 445 660 ;
+C -1 ; WX 600 ; N logicalnot ; B 51 129 555 421 ;
+C -1 ; WX 620 ; N odieresis ; B 31 -8 585 698 ;
+C -1 ; WX 660 ; N udieresis ; B 22 -8 653 698 ;
+C -1 ; WX 549 ; N notequal ; B 15 -49 540 570 ;
+C -1 ; WX 580 ; N gcommaaccent ; B 9 -243 583 785 ;
+C -1 ; WX 620 ; N eth ; B 31 -8 585 741 ;
+C -1 ; WX 560 ; N zcaron ; B 22 0 547 717 ;
+C -1 ; WX 680 ; N ncommaaccent ; B 22 -249 652 515 ;
+C -1 ; WX 396 ; N onesuperior ; B 65 279 345 687 ;
+C -1 ; WX 360 ; N imacron ; B 18 0 335 663 ;
+EndCharMetrics
+StartKernData
+StartKernPairs 912
+KPX A T -40
+KPX A Tcaron -40
+KPX A Tcommaaccent -40
+KPX A V -68
+KPX A W -20
+KPX A Y -52
+KPX A Yacute -52
+KPX A Ydieresis -52
+KPX A v -8
+KPX A w -9
+KPX A y -1
+KPX A yacute -1
+KPX A ydieresis -1
+KPX Aacute T -40
+KPX Aacute Tcaron -40
+KPX Aacute Tcommaaccent -40
+KPX Aacute V -68
+KPX Aacute W -20
+KPX Aacute Y -52
+KPX Aacute Yacute -52
+KPX Aacute Ydieresis -52
+KPX Aacute v -8
+KPX Aacute w -9
+KPX Aacute y -1
+KPX Aacute yacute -1
+KPX Aacute ydieresis -1
+KPX Abreve T -40
+KPX Abreve Tcaron -40
+KPX Abreve Tcommaaccent -40
+KPX Abreve V -68
+KPX Abreve W -20
+KPX Abreve Y -52
+KPX Abreve Yacute -52
+KPX Abreve Ydieresis -52
+KPX Abreve v -8
+KPX Abreve w -9
+KPX Abreve y -1
+KPX Abreve yacute -1
+KPX Abreve ydieresis -1
+KPX Acircumflex T -40
+KPX Acircumflex Tcaron -40
+KPX Acircumflex Tcommaaccent -40
+KPX Acircumflex V -68
+KPX Acircumflex W -20
+KPX Acircumflex Y -52
+KPX Acircumflex Yacute -52
+KPX Acircumflex Ydieresis -52
+KPX Acircumflex v -8
+KPX Acircumflex w -9
+KPX Acircumflex y -1
+KPX Acircumflex yacute -1
+KPX Acircumflex ydieresis -1
+KPX Adieresis T -40
+KPX Adieresis Tcaron -40
+KPX Adieresis Tcommaaccent -40
+KPX Adieresis V -68
+KPX Adieresis W -20
+KPX Adieresis Y -52
+KPX Adieresis Yacute -52
+KPX Adieresis Ydieresis -52
+KPX Adieresis v -8
+KPX Adieresis w -9
+KPX Adieresis y -1
+KPX Adieresis yacute -1
+KPX Adieresis ydieresis -1
+KPX Agrave T -40
+KPX Agrave Tcaron -40
+KPX Agrave Tcommaaccent -40
+KPX Agrave V -68
+KPX Agrave W -20
+KPX Agrave Y -52
+KPX Agrave Yacute -52
+KPX Agrave Ydieresis -52
+KPX Agrave v -8
+KPX Agrave w -9
+KPX Agrave y -1
+KPX Agrave yacute -1
+KPX Agrave ydieresis -1
+KPX Amacron T -40
+KPX Amacron Tcaron -40
+KPX Amacron Tcommaaccent -40
+KPX Amacron V -68
+KPX Amacron W -20
+KPX Amacron Y -52
+KPX Amacron Yacute -52
+KPX Amacron Ydieresis -52
+KPX Amacron v -8
+KPX Amacron w -9
+KPX Amacron y -1
+KPX Amacron yacute -1
+KPX Amacron ydieresis -1
+KPX Aogonek T -40
+KPX Aogonek Tcaron -40
+KPX Aogonek Tcommaaccent -40
+KPX Aogonek V -68
+KPX Aogonek W -20
+KPX Aogonek Y -52
+KPX Aogonek Yacute -52
+KPX Aogonek Ydieresis -52
+KPX Aogonek v -8
+KPX Aogonek w -9
+KPX Aogonek y -1
+KPX Aogonek yacute -1
+KPX Aogonek ydieresis -1
+KPX Aring T -40
+KPX Aring Tcaron -40
+KPX Aring Tcommaaccent -40
+KPX Aring V -68
+KPX Aring W -20
+KPX Aring Y -52
+KPX Aring Yacute -52
+KPX Aring Ydieresis -52
+KPX Aring v -8
+KPX Aring w -9
+KPX Aring y -1
+KPX Aring yacute -1
+KPX Aring ydieresis -1
+KPX Atilde T -40
+KPX Atilde Tcaron -40
+KPX Atilde Tcommaaccent -40
+KPX Atilde V -68
+KPX Atilde W -20
+KPX Atilde Y -52
+KPX Atilde Yacute -52
+KPX Atilde Ydieresis -52
+KPX Atilde v -8
+KPX Atilde w -9
+KPX Atilde y -1
+KPX Atilde yacute -1
+KPX Atilde ydieresis -1
+KPX F A -59
+KPX F Aacute -59
+KPX F Abreve -59
+KPX F Acircumflex -59
+KPX F Adieresis -59
+KPX F Agrave -59
+KPX F Amacron -59
+KPX F Aogonek -59
+KPX F Aring -59
+KPX F Atilde -59
+KPX F comma -130
+KPX F period -132
+KPX L T -4
+KPX L Tcaron -4
+KPX L Tcommaaccent -4
+KPX L V -50
+KPX L W -41
+KPX L Y -35
+KPX L Yacute -35
+KPX L Ydieresis -35
+KPX L y 19
+KPX L yacute 19
+KPX L ydieresis 19
+KPX Lacute T -4
+KPX Lacute Tcaron -4
+KPX Lacute Tcommaaccent -4
+KPX Lacute V -50
+KPX Lacute W -41
+KPX Lacute Y -35
+KPX Lacute Yacute -35
+KPX Lacute Ydieresis -35
+KPX Lacute y 19
+KPX Lacute yacute 19
+KPX Lacute ydieresis 19
+KPX Lcaron T -4
+KPX Lcaron Tcaron -4
+KPX Lcaron Tcommaaccent -4
+KPX Lcaron y 19
+KPX Lcaron yacute 19
+KPX Lcaron ydieresis 19
+KPX Lcommaaccent T -4
+KPX Lcommaaccent Tcaron -4
+KPX Lcommaaccent Tcommaaccent -4
+KPX Lcommaaccent V -50
+KPX Lcommaaccent W -41
+KPX Lcommaaccent Y -35
+KPX Lcommaaccent Yacute -35
+KPX Lcommaaccent Ydieresis -35
+KPX Lcommaaccent y 19
+KPX Lcommaaccent yacute 19
+KPX Lcommaaccent ydieresis 19
+KPX Lslash T -4
+KPX Lslash Tcaron -4
+KPX Lslash Tcommaaccent -4
+KPX Lslash V -50
+KPX Lslash W -41
+KPX Lslash Y -35
+KPX Lslash Yacute -35
+KPX Lslash Ydieresis -35
+KPX Lslash y 19
+KPX Lslash yacute 19
+KPX Lslash ydieresis 19
+KPX P A -46
+KPX P Aacute -46
+KPX P Abreve -46
+KPX P Acircumflex -46
+KPX P Adieresis -46
+KPX P Agrave -46
+KPX P Amacron -46
+KPX P Aogonek -46
+KPX P Aring -46
+KPX P Atilde -46
+KPX P comma -129
+KPX P period -128
+KPX R T -4
+KPX R Tcaron -4
+KPX R Tcommaaccent -4
+KPX R V -29
+KPX R W -24
+KPX R Y -20
+KPX R Yacute -20
+KPX R Ydieresis -20
+KPX R y -8
+KPX R yacute -8
+KPX R ydieresis -8
+KPX Racute T -4
+KPX Racute Tcaron -4
+KPX Racute Tcommaaccent -4
+KPX Racute V -29
+KPX Racute W -24
+KPX Racute Y -20
+KPX Racute Yacute -20
+KPX Racute Ydieresis -20
+KPX Racute y -8
+KPX Racute yacute -8
+KPX Racute ydieresis -8
+KPX Rcaron T -4
+KPX Rcaron Tcaron -4
+KPX Rcaron Tcommaaccent -4
+KPX Rcaron V -29
+KPX Rcaron W -24
+KPX Rcaron Y -20
+KPX Rcaron Yacute -20
+KPX Rcaron Ydieresis -20
+KPX Rcaron y -8
+KPX Rcaron yacute -8
+KPX Rcaron ydieresis -8
+KPX Rcommaaccent T -4
+KPX Rcommaaccent Tcaron -4
+KPX Rcommaaccent Tcommaaccent -4
+KPX Rcommaaccent V -29
+KPX Rcommaaccent W -24
+KPX Rcommaaccent Y -20
+KPX Rcommaaccent Yacute -20
+KPX Rcommaaccent Ydieresis -20
+KPX Rcommaaccent y -8
+KPX Rcommaaccent yacute -8
+KPX Rcommaaccent ydieresis -8
+KPX T A -42
+KPX T Aacute -42
+KPX T Abreve -42
+KPX T Acircumflex -42
+KPX T Adieresis -42
+KPX T Agrave -42
+KPX T Amacron -42
+KPX T Aogonek -42
+KPX T Aring -42
+KPX T Atilde -42
+KPX T a -24
+KPX T aacute -24
+KPX T abreve -24
+KPX T acircumflex -24
+KPX T adieresis -24
+KPX T agrave -24
+KPX T amacron -24
+KPX T aogonek -24
+KPX T aring -24
+KPX T atilde -24
+KPX T c -29
+KPX T cacute -29
+KPX T ccaron -29
+KPX T ccedilla -29
+KPX T colon 7
+KPX T comma -122
+KPX T e -29
+KPX T eacute -29
+KPX T ecaron -29
+KPX T ecircumflex -29
+KPX T edieresis -29
+KPX T edotaccent -29
+KPX T egrave -29
+KPX T emacron -29
+KPX T eogonek -29
+KPX T hyphen -10
+KPX T i 27
+KPX T iacute 27
+KPX T icircumflex 27
+KPX T idieresis 27
+KPX T igrave 27
+KPX T imacron 27
+KPX T iogonek 27
+KPX T o -28
+KPX T oacute -28
+KPX T ocircumflex -28
+KPX T odieresis -28
+KPX T ograve -28
+KPX T ohungarumlaut -28
+KPX T omacron -28
+KPX T oslash -28
+KPX T otilde -28
+KPX T period -122
+KPX T r 27
+KPX T racute 27
+KPX T rcaron 27
+KPX T rcommaaccent 27
+KPX T s -10
+KPX T sacute -10
+KPX T scaron -10
+KPX T scedilla -10
+KPX T scommaaccent -10
+KPX T semicolon 5
+KPX Tcaron A -42
+KPX Tcaron Aacute -42
+KPX Tcaron Abreve -42
+KPX Tcaron Acircumflex -42
+KPX Tcaron Adieresis -42
+KPX Tcaron Agrave -42
+KPX Tcaron Amacron -42
+KPX Tcaron Aogonek -42
+KPX Tcaron Aring -42
+KPX Tcaron Atilde -42
+KPX Tcaron a -24
+KPX Tcaron aacute -24
+KPX Tcaron abreve -24
+KPX Tcaron acircumflex -24
+KPX Tcaron adieresis -24
+KPX Tcaron agrave -24
+KPX Tcaron amacron -24
+KPX Tcaron aogonek -24
+KPX Tcaron aring -24
+KPX Tcaron atilde -24
+KPX Tcaron c -29
+KPX Tcaron cacute -29
+KPX Tcaron ccaron -29
+KPX Tcaron ccedilla -29
+KPX Tcaron colon 7
+KPX Tcaron comma -122
+KPX Tcaron e -29
+KPX Tcaron eacute -29
+KPX Tcaron ecaron -29
+KPX Tcaron ecircumflex -29
+KPX Tcaron edieresis -29
+KPX Tcaron edotaccent -29
+KPX Tcaron egrave -29
+KPX Tcaron emacron -29
+KPX Tcaron eogonek -29
+KPX Tcaron hyphen -10
+KPX Tcaron i 27
+KPX Tcaron iacute 27
+KPX Tcaron icircumflex 27
+KPX Tcaron idieresis 27
+KPX Tcaron igrave 27
+KPX Tcaron imacron 27
+KPX Tcaron iogonek 27
+KPX Tcaron o -28
+KPX Tcaron oacute -28
+KPX Tcaron ocircumflex -28
+KPX Tcaron odieresis -28
+KPX Tcaron ograve -28
+KPX Tcaron ohungarumlaut -28
+KPX Tcaron omacron -28
+KPX Tcaron oslash -28
+KPX Tcaron otilde -28
+KPX Tcaron period -122
+KPX Tcaron r 27
+KPX Tcaron racute 27
+KPX Tcaron rcaron 27
+KPX Tcaron rcommaaccent 27
+KPX Tcaron s -10
+KPX Tcaron sacute -10
+KPX Tcaron scaron -10
+KPX Tcaron scedilla -10
+KPX Tcaron scommaaccent -10
+KPX Tcaron semicolon 5
+KPX Tcommaaccent A -42
+KPX Tcommaaccent Aacute -42
+KPX Tcommaaccent Abreve -42
+KPX Tcommaaccent Acircumflex -42
+KPX Tcommaaccent Adieresis -42
+KPX Tcommaaccent Agrave -42
+KPX Tcommaaccent Amacron -42
+KPX Tcommaaccent Aogonek -42
+KPX Tcommaaccent Aring -42
+KPX Tcommaaccent Atilde -42
+KPX Tcommaaccent a -24
+KPX Tcommaaccent aacute -24
+KPX Tcommaaccent abreve -24
+KPX Tcommaaccent acircumflex -24
+KPX Tcommaaccent adieresis -24
+KPX Tcommaaccent agrave -24
+KPX Tcommaaccent amacron -24
+KPX Tcommaaccent aogonek -24
+KPX Tcommaaccent aring -24
+KPX Tcommaaccent atilde -24
+KPX Tcommaaccent c -29
+KPX Tcommaaccent cacute -29
+KPX Tcommaaccent ccaron -29
+KPX Tcommaaccent ccedilla -29
+KPX Tcommaaccent colon 7
+KPX Tcommaaccent comma -122
+KPX Tcommaaccent e -29
+KPX Tcommaaccent eacute -29
+KPX Tcommaaccent ecaron -29
+KPX Tcommaaccent ecircumflex -29
+KPX Tcommaaccent edieresis -29
+KPX Tcommaaccent edotaccent -29
+KPX Tcommaaccent egrave -29
+KPX Tcommaaccent emacron -29
+KPX Tcommaaccent eogonek -29
+KPX Tcommaaccent hyphen -10
+KPX Tcommaaccent i 27
+KPX Tcommaaccent iacute 27
+KPX Tcommaaccent icircumflex 27
+KPX Tcommaaccent idieresis 27
+KPX Tcommaaccent igrave 27
+KPX Tcommaaccent imacron 27
+KPX Tcommaaccent iogonek 27
+KPX Tcommaaccent o -28
+KPX Tcommaaccent oacute -28
+KPX Tcommaaccent ocircumflex -28
+KPX Tcommaaccent odieresis -28
+KPX Tcommaaccent ograve -28
+KPX Tcommaaccent ohungarumlaut -28
+KPX Tcommaaccent omacron -28
+KPX Tcommaaccent oslash -28
+KPX Tcommaaccent otilde -28
+KPX Tcommaaccent period -122
+KPX Tcommaaccent r 27
+KPX Tcommaaccent racute 27
+KPX Tcommaaccent rcaron 27
+KPX Tcommaaccent rcommaaccent 27
+KPX Tcommaaccent s -10
+KPX Tcommaaccent sacute -10
+KPX Tcommaaccent scaron -10
+KPX Tcommaaccent scedilla -10
+KPX Tcommaaccent scommaaccent -10
+KPX Tcommaaccent semicolon 5
+KPX V A -88
+KPX V Aacute -88
+KPX V Abreve -88
+KPX V Acircumflex -88
+KPX V Adieresis -88
+KPX V Agrave -88
+KPX V Amacron -88
+KPX V Aogonek -88
+KPX V Aring -88
+KPX V Atilde -88
+KPX V a -74
+KPX V aacute -74
+KPX V abreve -74
+KPX V acircumflex -74
+KPX V adieresis -74
+KPX V agrave -74
+KPX V amacron -74
+KPX V aogonek -74
+KPX V aring -74
+KPX V atilde -74
+KPX V colon -37
+KPX V comma -103
+KPX V e -80
+KPX V eacute -80
+KPX V ecaron -80
+KPX V ecircumflex -80
+KPX V edieresis -80
+KPX V edotaccent -80
+KPX V egrave -80
+KPX V emacron -80
+KPX V eogonek -80
+KPX V hyphen -10
+KPX V i 15
+KPX V iacute 15
+KPX V icircumflex 15
+KPX V idieresis 15
+KPX V igrave 15
+KPX V imacron 15
+KPX V iogonek 15
+KPX V o -79
+KPX V oacute -79
+KPX V ocircumflex -79
+KPX V odieresis -79
+KPX V ograve -79
+KPX V ohungarumlaut -79
+KPX V omacron -79
+KPX V oslash -79
+KPX V otilde -79
+KPX V period -105
+KPX V r -15
+KPX V racute -15
+KPX V rcaron -15
+KPX V rcommaaccent -15
+KPX V semicolon -38
+KPX V u -11
+KPX V uacute -11
+KPX V ucircumflex -11
+KPX V udieresis -11
+KPX V ugrave -11
+KPX V uhungarumlaut -11
+KPX V umacron -11
+KPX V uogonek -11
+KPX V uring -11
+KPX V y 12
+KPX V yacute 12
+KPX V ydieresis 12
+KPX W A -60
+KPX W Aacute -60
+KPX W Abreve -60
+KPX W Acircumflex -60
+KPX W Adieresis -60
+KPX W Agrave -60
+KPX W Amacron -60
+KPX W Aogonek -60
+KPX W Aring -60
+KPX W Atilde -60
+KPX W a -73
+KPX W aacute -73
+KPX W abreve -73
+KPX W acircumflex -73
+KPX W adieresis -73
+KPX W agrave -73
+KPX W amacron -73
+KPX W aogonek -73
+KPX W aring -73
+KPX W atilde -73
+KPX W colon -37
+KPX W comma -103
+KPX W e -79
+KPX W eacute -79
+KPX W ecaron -79
+KPX W ecircumflex -79
+KPX W edieresis -79
+KPX W edotaccent -79
+KPX W egrave -79
+KPX W emacron -79
+KPX W eogonek -79
+KPX W hyphen -10
+KPX W i 15
+KPX W iacute 15
+KPX W icircumflex 15
+KPX W idieresis 15
+KPX W igrave 15
+KPX W imacron 15
+KPX W iogonek 15
+KPX W o -78
+KPX W oacute -78
+KPX W ocircumflex -78
+KPX W odieresis -78
+KPX W ograve -78
+KPX W ohungarumlaut -78
+KPX W omacron -78
+KPX W oslash -78
+KPX W otilde -78
+KPX W period -105
+KPX W r -15
+KPX W racute -15
+KPX W rcaron -15
+KPX W rcommaaccent -15
+KPX W semicolon -38
+KPX W u -11
+KPX W uacute -11
+KPX W ucircumflex -11
+KPX W udieresis -11
+KPX W ugrave -11
+KPX W uhungarumlaut -11
+KPX W umacron -11
+KPX W uogonek -11
+KPX W uring -11
+KPX W y 12
+KPX W yacute 12
+KPX W ydieresis 12
+KPX Y A -56
+KPX Y Aacute -56
+KPX Y Abreve -56
+KPX Y Acircumflex -56
+KPX Y Adieresis -56
+KPX Y Agrave -56
+KPX Y Amacron -56
+KPX Y Aogonek -56
+KPX Y Aring -56
+KPX Y Atilde -56
+KPX Y a -60
+KPX Y aacute -60
+KPX Y abreve -60
+KPX Y acircumflex -60
+KPX Y adieresis -60
+KPX Y agrave -60
+KPX Y amacron -60
+KPX Y aogonek -60
+KPX Y aring -60
+KPX Y atilde -60
+KPX Y colon -32
+KPX Y comma -103
+KPX Y e -67
+KPX Y eacute -67
+KPX Y ecaron -67
+KPX Y ecircumflex -67
+KPX Y edieresis -67
+KPX Y edotaccent -67
+KPX Y egrave -67
+KPX Y emacron -67
+KPX Y eogonek -67
+KPX Y hyphen -10
+KPX Y i 2
+KPX Y iacute 2
+KPX Y icircumflex 12
+KPX Y idieresis 12
+KPX Y igrave 12
+KPX Y imacron 12
+KPX Y iogonek 2
+KPX Y o -66
+KPX Y oacute -66
+KPX Y ocircumflex -66
+KPX Y odieresis -66
+KPX Y ograve -66
+KPX Y ohungarumlaut -66
+KPX Y omacron -66
+KPX Y oslash -66
+KPX Y otilde -66
+KPX Y p -23
+KPX Y period -105
+KPX Y q -66
+KPX Y semicolon -34
+KPX Y u -13
+KPX Y uacute -13
+KPX Y ucircumflex -13
+KPX Y udieresis -13
+KPX Y ugrave -13
+KPX Y uhungarumlaut -13
+KPX Y umacron -13
+KPX Y uogonek -13
+KPX Y uring -13
+KPX Y v 24
+KPX Yacute A -56
+KPX Yacute Aacute -56
+KPX Yacute Abreve -56
+KPX Yacute Acircumflex -56
+KPX Yacute Adieresis -56
+KPX Yacute Agrave -56
+KPX Yacute Amacron -56
+KPX Yacute Aogonek -56
+KPX Yacute Aring -56
+KPX Yacute Atilde -56
+KPX Yacute a -60
+KPX Yacute aacute -60
+KPX Yacute abreve -60
+KPX Yacute acircumflex -60
+KPX Yacute adieresis -60
+KPX Yacute agrave -60
+KPX Yacute amacron -60
+KPX Yacute aogonek -60
+KPX Yacute aring -60
+KPX Yacute atilde -60
+KPX Yacute colon -32
+KPX Yacute comma -103
+KPX Yacute e -67
+KPX Yacute eacute -67
+KPX Yacute ecaron -67
+KPX Yacute ecircumflex -67
+KPX Yacute edieresis -67
+KPX Yacute edotaccent -67
+KPX Yacute egrave -67
+KPX Yacute emacron -67
+KPX Yacute eogonek -67
+KPX Yacute hyphen -10
+KPX Yacute i 2
+KPX Yacute iacute 2
+KPX Yacute icircumflex 12
+KPX Yacute idieresis 12
+KPX Yacute igrave 12
+KPX Yacute imacron 12
+KPX Yacute iogonek 2
+KPX Yacute o -66
+KPX Yacute oacute -66
+KPX Yacute ocircumflex -66
+KPX Yacute odieresis -66
+KPX Yacute ograve -66
+KPX Yacute ohungarumlaut -66
+KPX Yacute omacron -66
+KPX Yacute oslash -66
+KPX Yacute otilde -66
+KPX Yacute p -23
+KPX Yacute period -105
+KPX Yacute q -66
+KPX Yacute semicolon -34
+KPX Yacute u -13
+KPX Yacute uacute -13
+KPX Yacute ucircumflex -13
+KPX Yacute udieresis -13
+KPX Yacute ugrave -13
+KPX Yacute uhungarumlaut -13
+KPX Yacute umacron -13
+KPX Yacute uogonek -13
+KPX Yacute uring -13
+KPX Yacute v 24
+KPX Ydieresis A -56
+KPX Ydieresis Aacute -56
+KPX Ydieresis Abreve -56
+KPX Ydieresis Acircumflex -56
+KPX Ydieresis Adieresis -56
+KPX Ydieresis Agrave -56
+KPX Ydieresis Amacron -56
+KPX Ydieresis Aogonek -56
+KPX Ydieresis Aring -56
+KPX Ydieresis Atilde -56
+KPX Ydieresis a -60
+KPX Ydieresis aacute -60
+KPX Ydieresis abreve -60
+KPX Ydieresis acircumflex -60
+KPX Ydieresis adieresis -60
+KPX Ydieresis agrave -60
+KPX Ydieresis amacron -60
+KPX Ydieresis aogonek -60
+KPX Ydieresis aring -60
+KPX Ydieresis atilde -60
+KPX Ydieresis colon -32
+KPX Ydieresis comma -103
+KPX Ydieresis e -67
+KPX Ydieresis eacute -67
+KPX Ydieresis ecaron -67
+KPX Ydieresis ecircumflex -67
+KPX Ydieresis edieresis -67
+KPX Ydieresis edotaccent -67
+KPX Ydieresis egrave -67
+KPX Ydieresis emacron -67
+KPX Ydieresis eogonek -67
+KPX Ydieresis hyphen -10
+KPX Ydieresis i 2
+KPX Ydieresis iacute 2
+KPX Ydieresis icircumflex 12
+KPX Ydieresis idieresis 12
+KPX Ydieresis igrave 12
+KPX Ydieresis imacron 12
+KPX Ydieresis iogonek 2
+KPX Ydieresis o -66
+KPX Ydieresis oacute -66
+KPX Ydieresis ocircumflex -66
+KPX Ydieresis odieresis -66
+KPX Ydieresis ograve -66
+KPX Ydieresis ohungarumlaut -66
+KPX Ydieresis omacron -66
+KPX Ydieresis oslash -66
+KPX Ydieresis otilde -66
+KPX Ydieresis p -23
+KPX Ydieresis period -105
+KPX Ydieresis q -66
+KPX Ydieresis semicolon -34
+KPX Ydieresis u -13
+KPX Ydieresis uacute -13
+KPX Ydieresis ucircumflex -13
+KPX Ydieresis udieresis -13
+KPX Ydieresis ugrave -13
+KPX Ydieresis uhungarumlaut -13
+KPX Ydieresis umacron -13
+KPX Ydieresis uogonek -13
+KPX Ydieresis uring -13
+KPX Ydieresis v 24
+KPX f f 21
+KPX r c -9
+KPX r cacute -9
+KPX r ccaron -9
+KPX r ccedilla -9
+KPX r comma -101
+KPX r d -10
+KPX r dcroat -10
+KPX r e -10
+KPX r eacute -10
+KPX r ecaron -10
+KPX r ecircumflex -10
+KPX r edieresis -10
+KPX r edotaccent -10
+KPX r egrave -10
+KPX r emacron -10
+KPX r eogonek -10
+KPX r f 20
+KPX r g -9
+KPX r gbreve -9
+KPX r gcommaaccent -9
+KPX r h -23
+KPX r hyphen -10
+KPX r m 20
+KPX r n 20
+KPX r nacute 20
+KPX r ncaron 20
+KPX r ncommaaccent 20
+KPX r ntilde 20
+KPX r o -9
+KPX r oacute -9
+KPX r ocircumflex -9
+KPX r odieresis -9
+KPX r ograve -9
+KPX r ohungarumlaut -9
+KPX r omacron -9
+KPX r oslash -9
+KPX r otilde -9
+KPX r period -102
+KPX r q -9
+KPX racute c -9
+KPX racute cacute -9
+KPX racute ccaron -9
+KPX racute ccedilla -9
+KPX racute comma -101
+KPX racute d -10
+KPX racute dcroat -10
+KPX racute e -10
+KPX racute eacute -10
+KPX racute ecaron -10
+KPX racute ecircumflex -10
+KPX racute edieresis -10
+KPX racute edotaccent -10
+KPX racute egrave -10
+KPX racute emacron -10
+KPX racute eogonek -10
+KPX racute f 20
+KPX racute g -9
+KPX racute gbreve -9
+KPX racute gcommaaccent -9
+KPX racute h -23
+KPX racute hyphen -10
+KPX racute m 20
+KPX racute n 20
+KPX racute nacute 20
+KPX racute ncaron 20
+KPX racute ncommaaccent 20
+KPX racute ntilde 20
+KPX racute o -9
+KPX racute oacute -9
+KPX racute ocircumflex -9
+KPX racute odieresis -9
+KPX racute ograve -9
+KPX racute ohungarumlaut -9
+KPX racute omacron -9
+KPX racute oslash -9
+KPX racute otilde -9
+KPX racute period -102
+KPX racute q -9
+KPX rcaron c -9
+KPX rcaron cacute -9
+KPX rcaron ccaron -9
+KPX rcaron ccedilla -9
+KPX rcaron comma -101
+KPX rcaron d -10
+KPX rcaron dcroat -10
+KPX rcaron e -10
+KPX rcaron eacute -10
+KPX rcaron ecaron -10
+KPX rcaron ecircumflex -10
+KPX rcaron edieresis -10
+KPX rcaron edotaccent -10
+KPX rcaron egrave -10
+KPX rcaron emacron -10
+KPX rcaron eogonek -10
+KPX rcaron f 20
+KPX rcaron g -9
+KPX rcaron gbreve -9
+KPX rcaron gcommaaccent -9
+KPX rcaron h -23
+KPX rcaron hyphen -10
+KPX rcaron m 20
+KPX rcaron n 20
+KPX rcaron nacute 20
+KPX rcaron ncaron 20
+KPX rcaron ncommaaccent 20
+KPX rcaron ntilde 20
+KPX rcaron o -9
+KPX rcaron oacute -9
+KPX rcaron ocircumflex -9
+KPX rcaron odieresis -9
+KPX rcaron ograve -9
+KPX rcaron ohungarumlaut -9
+KPX rcaron omacron -9
+KPX rcaron oslash -9
+KPX rcaron otilde -9
+KPX rcaron period -102
+KPX rcaron q -9
+KPX rcommaaccent c -9
+KPX rcommaaccent cacute -9
+KPX rcommaaccent ccaron -9
+KPX rcommaaccent ccedilla -9
+KPX rcommaaccent comma -101
+KPX rcommaaccent d -10
+KPX rcommaaccent dcroat -10
+KPX rcommaaccent e -10
+KPX rcommaaccent eacute -10
+KPX rcommaaccent ecaron -10
+KPX rcommaaccent ecircumflex -10
+KPX rcommaaccent edieresis -10
+KPX rcommaaccent edotaccent -10
+KPX rcommaaccent egrave -10
+KPX rcommaaccent emacron -10
+KPX rcommaaccent eogonek -10
+KPX rcommaaccent f 20
+KPX rcommaaccent g -9
+KPX rcommaaccent gbreve -9
+KPX rcommaaccent gcommaaccent -9
+KPX rcommaaccent h -23
+KPX rcommaaccent hyphen -10
+KPX rcommaaccent m 20
+KPX rcommaaccent n 20
+KPX rcommaaccent nacute 20
+KPX rcommaaccent ncaron 20
+KPX rcommaaccent ncommaaccent 20
+KPX rcommaaccent ntilde 20
+KPX rcommaaccent o -9
+KPX rcommaaccent oacute -9
+KPX rcommaaccent ocircumflex -9
+KPX rcommaaccent odieresis -9
+KPX rcommaaccent ograve -9
+KPX rcommaaccent ohungarumlaut -9
+KPX rcommaaccent omacron -9
+KPX rcommaaccent oslash -9
+KPX rcommaaccent otilde -9
+KPX rcommaaccent period -102
+KPX rcommaaccent q -9
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/src/fonts/Adobe-Core35_AFMs-314/ITCBookman-DemiItalic.afm b/src/fonts/Adobe-Core35_AFMs-314/ITCBookman-DemiItalic.afm
new file mode 100644
index 0000000..56cc40c
--- /dev/null
+++ b/src/fonts/Adobe-Core35_AFMs-314/ITCBookman-DemiItalic.afm
@@ -0,0 +1,1275 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1985, 1987, 1989, 1992, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Thu May 1 13:56:49 1997
+Comment UniqueID 43080
+Comment VMusage 43194 54219
+FontName Bookman-DemiItalic
+FullName ITC Bookman Demi Italic
+FamilyName ITC Bookman
+Weight Demi
+ItalicAngle -10
+IsFixedPitch false
+FontBBox -231 -250 1333 941
+UnderlinePosition -100
+UnderlineThickness 50
+Version 002.000
+Notice Copyright (c) 1985, 1987, 1989, 1992, 1997 Adobe Systems Incorporated. All Rights Reserved.ITC Bookman is a registered trademark of International Typeface Corporation.
+EncodingScheme AdobeStandardEncoding
+CapHeight 681
+XHeight 515
+Ascender 717
+Descender -228
+StdHW 82
+StdVW 172
+StartCharMetrics 314
+C 32 ; WX 340 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 320 ; N exclam ; B 86 -8 366 698 ;
+C 34 ; WX 380 ; N quotedbl ; B 140 371 507 697 ;
+C 35 ; WX 680 ; N numbersign ; B 157 0 649 681 ;
+C 36 ; WX 680 ; N dollar ; B 45 -164 697 790 ;
+C 37 ; WX 880 ; N percent ; B 106 -17 899 698 ;
+C 38 ; WX 980 ; N ampersand ; B 48 -17 1016 698 ;
+C 39 ; WX 320 ; N quoteright ; B 171 420 349 698 ;
+C 40 ; WX 260 ; N parenleft ; B 31 -134 388 741 ;
+C 41 ; WX 260 ; N parenright ; B -35 -134 322 741 ;
+C 42 ; WX 460 ; N asterisk ; B 126 346 508 698 ;
+C 43 ; WX 600 ; N plus ; B 91 9 595 514 ;
+C 44 ; WX 340 ; N comma ; B 100 -124 298 185 ;
+C 45 ; WX 280 ; N hyphen ; B 59 218 319 313 ;
+C 46 ; WX 340 ; N period ; B 106 -8 296 177 ;
+C 47 ; WX 360 ; N slash ; B 9 -106 502 742 ;
+C 48 ; WX 680 ; N zero ; B 87 -17 703 698 ;
+C 49 ; WX 680 ; N one ; B 123 0 565 681 ;
+C 50 ; WX 680 ; N two ; B 67 0 674 698 ;
+C 51 ; WX 680 ; N three ; B 72 -17 683 698 ;
+C 52 ; WX 680 ; N four ; B 63 0 708 681 ;
+C 53 ; WX 680 ; N five ; B 78 -17 669 681 ;
+C 54 ; WX 680 ; N six ; B 88 -17 704 698 ;
+C 55 ; WX 680 ; N seven ; B 123 0 739 681 ;
+C 56 ; WX 680 ; N eight ; B 68 -17 686 698 ;
+C 57 ; WX 680 ; N nine ; B 71 -17 712 698 ;
+C 58 ; WX 340 ; N colon ; B 106 -8 356 515 ;
+C 59 ; WX 340 ; N semicolon ; B 100 -124 352 515 ;
+C 60 ; WX 620 ; N less ; B 79 -9 588 540 ;
+C 61 ; WX 600 ; N equal ; B 91 109 595 421 ;
+C 62 ; WX 620 ; N greater ; B 89 -9 598 540 ;
+C 63 ; WX 620 ; N question ; B 145 -8 668 698 ;
+C 64 ; WX 780 ; N at ; B 80 -17 790 698 ;
+C 65 ; WX 720 ; N A ; B -27 0 769 681 ;
+C 66 ; WX 720 ; N B ; B 14 0 762 681 ;
+C 67 ; WX 700 ; N C ; B 78 -17 754 698 ;
+C 68 ; WX 760 ; N D ; B 14 0 805 681 ;
+C 69 ; WX 720 ; N E ; B 14 0 777 681 ;
+C 70 ; WX 660 ; N F ; B 14 0 763 681 ;
+C 71 ; WX 760 ; N G ; B 77 -17 828 698 ;
+C 72 ; WX 800 ; N H ; B 14 0 910 681 ;
+C 73 ; WX 380 ; N I ; B 14 0 485 681 ;
+C 74 ; WX 620 ; N J ; B 8 -17 721 681 ;
+C 75 ; WX 780 ; N K ; B 14 0 879 681 ;
+C 76 ; WX 640 ; N L ; B 14 0 725 681 ;
+C 77 ; WX 860 ; N M ; B 14 0 970 681 ;
+C 78 ; WX 740 ; N N ; B 14 0 845 681 ;
+C 79 ; WX 760 ; N O ; B 78 -17 806 698 ;
+C 80 ; WX 640 ; N P ; B -6 0 724 681 ;
+C 81 ; WX 760 ; N Q ; B 37 -213 805 698 ;
+C 82 ; WX 740 ; N R ; B 14 0 765 681 ;
+C 83 ; WX 700 ; N S ; B 59 -17 731 698 ;
+C 84 ; WX 700 ; N T ; B 70 0 802 681 ;
+C 85 ; WX 740 ; N U ; B 112 -17 855 681 ;
+C 86 ; WX 660 ; N V ; B 72 0 819 681 ;
+C 87 ; WX 1000 ; N W ; B 72 0 1090 681 ;
+C 88 ; WX 740 ; N X ; B -7 0 835 681 ;
+C 89 ; WX 660 ; N Y ; B 72 0 817 681 ;
+C 90 ; WX 680 ; N Z ; B 23 0 740 681 ;
+C 91 ; WX 260 ; N bracketleft ; B 9 -118 374 741 ;
+C 92 ; WX 580 ; N backslash ; B 73 0 575 741 ;
+C 93 ; WX 260 ; N bracketright ; B -18 -118 347 741 ;
+C 94 ; WX 620 ; N asciicircum ; B 92 281 594 681 ;
+C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;
+C 96 ; WX 320 ; N quoteleft ; B 155 420 333 698 ;
+C 97 ; WX 680 ; N a ; B 84 -8 735 515 ;
+C 98 ; WX 600 ; N b ; B 57 -8 633 732 ;
+C 99 ; WX 560 ; N c ; B 58 -8 597 515 ;
+C 100 ; WX 680 ; N d ; B 60 -8 714 732 ;
+C 101 ; WX 560 ; N e ; B 59 -8 596 515 ;
+C 102 ; WX 420 ; N f ; B -192 -213 641 741 ; L i fi ; L l fl ;
+C 103 ; WX 620 ; N g ; B 21 -213 669 515 ;
+C 104 ; WX 700 ; N h ; B 93 -8 736 732 ;
+C 105 ; WX 380 ; N i ; B 83 -8 420 755 ;
+C 106 ; WX 320 ; N j ; B -160 -213 392 755 ;
+C 107 ; WX 700 ; N k ; B 97 -8 732 732 ;
+C 108 ; WX 380 ; N l ; B 109 -8 410 732 ;
+C 109 ; WX 960 ; N m ; B 83 -8 996 515 ;
+C 110 ; WX 680 ; N n ; B 83 -8 715 515 ;
+C 111 ; WX 600 ; N o ; B 59 -8 627 515 ;
+C 112 ; WX 660 ; N p ; B -24 -213 682 515 ;
+C 113 ; WX 620 ; N q ; B 60 -213 640 515 ;
+C 114 ; WX 500 ; N r ; B 84 0 582 515 ;
+C 115 ; WX 540 ; N s ; B 32 -8 573 515 ;
+C 116 ; WX 440 ; N t ; B 106 -8 488 658 ;
+C 117 ; WX 680 ; N u ; B 83 -8 720 507 ;
+C 118 ; WX 540 ; N v ; B 56 -8 572 515 ;
+C 119 ; WX 860 ; N w ; B 56 -8 891 515 ;
+C 120 ; WX 620 ; N x ; B 10 -8 654 515 ;
+C 121 ; WX 600 ; N y ; B 25 -213 642 507 ;
+C 122 ; WX 560 ; N z ; B 36 -8 586 515 ;
+C 123 ; WX 300 ; N braceleft ; B 49 -123 413 742 ;
+C 124 ; WX 620 ; N bar ; B 303 -250 422 750 ;
+C 125 ; WX 300 ; N braceright ; B -8 -114 356 751 ;
+C 126 ; WX 620 ; N asciitilde ; B 101 162 605 368 ;
+C 161 ; WX 320 ; N exclamdown ; B 64 -191 344 515 ;
+C 162 ; WX 680 ; N cent ; B 161 25 616 718 ;
+C 163 ; WX 680 ; N sterling ; B 0 -17 787 698 ;
+C 164 ; WX 120 ; N fraction ; B -144 0 382 681 ;
+C 165 ; WX 680 ; N yen ; B 92 0 782 681 ;
+C 166 ; WX 680 ; N florin ; B -28 -199 743 741 ;
+C 167 ; WX 620 ; N section ; B 46 -137 638 698 ;
+C 168 ; WX 680 ; N currency ; B 148 85 637 571 ;
+C 169 ; WX 180 ; N quotesingle ; B 126 370 295 696 ;
+C 170 ; WX 520 ; N quotedblleft ; B 156 420 545 698 ;
+C 171 ; WX 380 ; N guillemotleft ; B 62 84 406 503 ;
+C 172 ; WX 220 ; N guilsinglleft ; B 62 84 249 503 ;
+C 173 ; WX 220 ; N guilsinglright ; B 62 84 249 503 ;
+C 174 ; WX 820 ; N fi ; B -191 -213 850 741 ;
+C 175 ; WX 820 ; N fl ; B -191 -213 850 741 ;
+C 177 ; WX 500 ; N endash ; B 40 219 573 311 ;
+C 178 ; WX 420 ; N dagger ; B 89 -137 466 698 ;
+C 179 ; WX 420 ; N daggerdbl ; B 79 -137 486 698 ;
+C 180 ; WX 340 ; N periodcentered ; B 126 173 316 358 ;
+C 182 ; WX 680 ; N paragraph ; B 137 0 715 681 ;
+C 183 ; WX 360 ; N bullet ; B 60 170 404 511 ;
+C 184 ; WX 300 ; N quotesinglbase ; B 106 -112 284 166 ;
+C 185 ; WX 520 ; N quotedblbase ; B 106 -112 495 166 ;
+C 186 ; WX 520 ; N quotedblright ; B 171 420 560 698 ;
+C 187 ; WX 380 ; N guillemotright ; B 62 84 406 503 ;
+C 188 ; WX 1000 ; N ellipsis ; B 86 -8 942 177 ;
+C 189 ; WX 1360 ; N perthousand ; B 106 -17 1333 698 ;
+C 191 ; WX 620 ; N questiondown ; B 83 -189 606 515 ;
+C 193 ; WX 380 ; N grave ; B 193 566 424 771 ;
+C 194 ; WX 340 ; N acute ; B 176 566 407 771 ;
+C 195 ; WX 480 ; N circumflex ; B 183 582 523 749 ;
+C 196 ; WX 480 ; N tilde ; B 178 587 533 709 ;
+C 197 ; WX 480 ; N macron ; B 177 603 531 691 ;
+C 198 ; WX 460 ; N breve ; B 177 577 516 707 ;
+C 199 ; WX 380 ; N dotaccent ; B 167 563 365 755 ;
+C 200 ; WX 520 ; N dieresis ; B 180 563 569 727 ;
+C 202 ; WX 360 ; N ring ; B 185 558 406 775 ;
+C 203 ; WX 360 ; N cedilla ; B 68 -220 289 -8 ;
+C 205 ; WX 560 ; N hungarumlaut ; B 181 560 616 775 ;
+C 206 ; WX 320 ; N ogonek ; B 58 -199 293 0 ;
+C 207 ; WX 480 ; N caron ; B 183 582 523 749 ;
+C 208 ; WX 1000 ; N emdash ; B 40 219 1073 311 ;
+C 225 ; WX 1140 ; N AE ; B -27 0 1207 681 ;
+C 227 ; WX 440 ; N ordfeminine ; B 118 400 495 685 ;
+C 232 ; WX 640 ; N Lslash ; B 14 0 724 681 ;
+C 233 ; WX 760 ; N Oslash ; B 21 -29 847 725 ;
+C 234 ; WX 1180 ; N OE ; B 94 -17 1245 698 ;
+C 235 ; WX 440 ; N ordmasculine ; B 127 400 455 685 ;
+C 241 ; WX 880 ; N ae ; B 39 -8 913 515 ;
+C 245 ; WX 380 ; N dotlessi ; B 83 -8 420 507 ;
+C 248 ; WX 380 ; N lslash ; B 75 -8 424 732 ;
+C 249 ; WX 600 ; N oslash ; B 17 -54 661 571 ;
+C 250 ; WX 920 ; N oe ; B 48 -8 961 515 ;
+C 251 ; WX 660 ; N germandbls ; B -231 -213 702 741 ;
+C -1 ; WX 380 ; N Idieresis ; B 14 0 499 900 ;
+C -1 ; WX 560 ; N eacute ; B 59 -8 596 771 ;
+C -1 ; WX 680 ; N abreve ; B 84 -8 735 707 ;
+C -1 ; WX 680 ; N uhungarumlaut ; B 83 -8 720 775 ;
+C -1 ; WX 560 ; N ecaron ; B 59 -8 596 749 ;
+C -1 ; WX 660 ; N Ydieresis ; B 72 0 817 900 ;
+C -1 ; WX 600 ; N divide ; B 91 9 595 521 ;
+C -1 ; WX 660 ; N Yacute ; B 72 0 817 937 ;
+C -1 ; WX 720 ; N Acircumflex ; B -27 0 769 915 ;
+C -1 ; WX 680 ; N aacute ; B 84 -8 735 771 ;
+C -1 ; WX 740 ; N Ucircumflex ; B 112 -17 855 915 ;
+C -1 ; WX 600 ; N yacute ; B 25 -213 642 771 ;
+C -1 ; WX 540 ; N scommaaccent ; B 32 -250 573 515 ;
+C -1 ; WX 560 ; N ecircumflex ; B 59 -8 596 749 ;
+C -1 ; WX 740 ; N Uring ; B 112 -17 855 941 ;
+C -1 ; WX 740 ; N Udieresis ; B 112 -17 855 900 ;
+C -1 ; WX 680 ; N aogonek ; B 84 -199 735 515 ;
+C -1 ; WX 740 ; N Uacute ; B 112 -17 855 937 ;
+C -1 ; WX 680 ; N uogonek ; B 83 -199 720 507 ;
+C -1 ; WX 720 ; N Edieresis ; B 14 0 777 900 ;
+C -1 ; WX 760 ; N Dcroat ; B 14 0 805 681 ;
+C -1 ; WX 250 ; N commaaccent ; B 55 -250 199 -50 ;
+C -1 ; WX 780 ; N copyright ; B 83 -17 783 698 ;
+C -1 ; WX 720 ; N Emacron ; B 14 0 777 857 ;
+C -1 ; WX 560 ; N ccaron ; B 58 -8 597 749 ;
+C -1 ; WX 680 ; N aring ; B 84 -8 735 775 ;
+C -1 ; WX 740 ; N Ncommaaccent ; B 14 -250 845 681 ;
+C -1 ; WX 380 ; N lacute ; B 109 -8 466 940 ;
+C -1 ; WX 680 ; N agrave ; B 84 -8 735 771 ;
+C -1 ; WX 700 ; N Tcommaaccent ; B 70 -250 802 681 ;
+C -1 ; WX 700 ; N Cacute ; B 78 -17 754 937 ;
+C -1 ; WX 680 ; N atilde ; B 84 -8 735 709 ;
+C -1 ; WX 720 ; N Edotaccent ; B 14 0 777 928 ;
+C -1 ; WX 540 ; N scaron ; B 32 -8 573 749 ;
+C -1 ; WX 540 ; N scedilla ; B 32 -220 573 515 ;
+C -1 ; WX 380 ; N iacute ; B 83 -8 420 771 ;
+C -1 ; WX 494 ; N lozenge ; B 10 0 484 745 ;
+C -1 ; WX 740 ; N Rcaron ; B 14 0 765 915 ;
+C -1 ; WX 760 ; N Gcommaaccent ; B 77 -250 828 698 ;
+C -1 ; WX 680 ; N ucircumflex ; B 83 -8 720 749 ;
+C -1 ; WX 680 ; N acircumflex ; B 84 -8 735 749 ;
+C -1 ; WX 720 ; N Amacron ; B -27 0 769 857 ;
+C -1 ; WX 500 ; N rcaron ; B 84 0 582 749 ;
+C -1 ; WX 560 ; N ccedilla ; B 58 -220 597 515 ;
+C -1 ; WX 680 ; N Zdotaccent ; B 23 0 740 928 ;
+C -1 ; WX 640 ; N Thorn ; B -6 0 701 681 ;
+C -1 ; WX 760 ; N Omacron ; B 78 -17 806 857 ;
+C -1 ; WX 740 ; N Racute ; B 14 0 765 937 ;
+C -1 ; WX 700 ; N Sacute ; B 59 -17 731 937 ;
+C -1 ; WX 755 ; N dcaron ; B 60 -8 874 738 ;
+C -1 ; WX 740 ; N Umacron ; B 112 -17 855 857 ;
+C -1 ; WX 680 ; N uring ; B 83 -8 720 775 ;
+C -1 ; WX 408 ; N threesuperior ; B 86 269 483 698 ;
+C -1 ; WX 760 ; N Ograve ; B 78 -17 806 937 ;
+C -1 ; WX 720 ; N Agrave ; B -27 0 769 937 ;
+C -1 ; WX 720 ; N Abreve ; B -27 0 769 873 ;
+C -1 ; WX 600 ; N multiply ; B 91 10 595 514 ;
+C -1 ; WX 680 ; N uacute ; B 83 -8 720 771 ;
+C -1 ; WX 700 ; N Tcaron ; B 70 0 802 915 ;
+C -1 ; WX 505 ; N partialdiff ; B 11 -21 494 750 ;
+C -1 ; WX 600 ; N ydieresis ; B 25 -213 642 734 ;
+C -1 ; WX 740 ; N Nacute ; B 14 0 845 937 ;
+C -1 ; WX 380 ; N icircumflex ; B 83 -8 433 749 ;
+C -1 ; WX 720 ; N Ecircumflex ; B 14 0 777 915 ;
+C -1 ; WX 680 ; N adieresis ; B 84 -8 735 734 ;
+C -1 ; WX 560 ; N edieresis ; B 59 -8 596 734 ;
+C -1 ; WX 560 ; N cacute ; B 58 -8 597 771 ;
+C -1 ; WX 680 ; N nacute ; B 83 -8 715 771 ;
+C -1 ; WX 680 ; N umacron ; B 83 -8 720 691 ;
+C -1 ; WX 740 ; N Ncaron ; B 14 0 845 915 ;
+C -1 ; WX 380 ; N Iacute ; B 14 0 487 937 ;
+C -1 ; WX 600 ; N plusminus ; B 91 0 595 514 ;
+C -1 ; WX 620 ; N brokenbar ; B 303 -175 422 675 ;
+C -1 ; WX 780 ; N registered ; B 83 -17 783 698 ;
+C -1 ; WX 760 ; N Gbreve ; B 77 -17 828 873 ;
+C -1 ; WX 380 ; N Idotaccent ; B 14 0 485 928 ;
+C -1 ; WX 599 ; N summation ; B 14 -10 585 706 ;
+C -1 ; WX 720 ; N Egrave ; B 14 0 777 937 ;
+C -1 ; WX 500 ; N racute ; B 84 0 582 771 ;
+C -1 ; WX 600 ; N omacron ; B 59 -8 627 691 ;
+C -1 ; WX 680 ; N Zacute ; B 23 0 740 937 ;
+C -1 ; WX 680 ; N Zcaron ; B 23 0 740 915 ;
+C -1 ; WX 549 ; N greaterequal ; B 26 0 523 704 ;
+C -1 ; WX 760 ; N Eth ; B 14 0 805 681 ;
+C -1 ; WX 700 ; N Ccedilla ; B 78 -220 754 698 ;
+C -1 ; WX 380 ; N lcommaaccent ; B 109 -250 410 732 ;
+C -1 ; WX 450 ; N tcaron ; B 106 -8 571 798 ;
+C -1 ; WX 560 ; N eogonek ; B 59 -199 596 515 ;
+C -1 ; WX 740 ; N Uogonek ; B 112 -199 855 681 ;
+C -1 ; WX 720 ; N Aacute ; B -27 0 769 937 ;
+C -1 ; WX 720 ; N Adieresis ; B -27 0 769 900 ;
+C -1 ; WX 560 ; N egrave ; B 59 -8 596 771 ;
+C -1 ; WX 560 ; N zacute ; B 36 -8 586 771 ;
+C -1 ; WX 380 ; N iogonek ; B 83 -199 420 755 ;
+C -1 ; WX 760 ; N Oacute ; B 78 -17 806 937 ;
+C -1 ; WX 600 ; N oacute ; B 59 -8 627 771 ;
+C -1 ; WX 680 ; N amacron ; B 84 -8 735 691 ;
+C -1 ; WX 540 ; N sacute ; B 32 -8 573 771 ;
+C -1 ; WX 380 ; N idieresis ; B 83 -8 479 734 ;
+C -1 ; WX 760 ; N Ocircumflex ; B 78 -17 806 915 ;
+C -1 ; WX 740 ; N Ugrave ; B 112 -17 855 937 ;
+C -1 ; WX 614 ; N Delta ; B 6 0 608 688 ;
+C -1 ; WX 660 ; N thorn ; B -24 -213 682 732 ;
+C -1 ; WX 408 ; N twosuperior ; B 91 279 485 698 ;
+C -1 ; WX 760 ; N Odieresis ; B 78 -17 806 900 ;
+C -1 ; WX 680 ; N mu ; B 54 -213 720 507 ;
+C -1 ; WX 380 ; N igrave ; B 83 -8 420 771 ;
+C -1 ; WX 600 ; N ohungarumlaut ; B 59 -8 636 775 ;
+C -1 ; WX 720 ; N Eogonek ; B 14 -199 777 681 ;
+C -1 ; WX 680 ; N dcroat ; B 60 -8 748 732 ;
+C -1 ; WX 1020 ; N threequarters ; B 86 0 1054 691 ;
+C -1 ; WX 700 ; N Scedilla ; B 59 -220 731 698 ;
+C -1 ; WX 463 ; N lcaron ; B 109 -8 573 738 ;
+C -1 ; WX 780 ; N Kcommaaccent ; B 14 -250 879 681 ;
+C -1 ; WX 640 ; N Lacute ; B 14 0 725 937 ;
+C -1 ; WX 940 ; N trademark ; B 42 277 982 681 ;
+C -1 ; WX 560 ; N edotaccent ; B 59 -8 596 762 ;
+C -1 ; WX 380 ; N Igrave ; B 14 0 485 937 ;
+C -1 ; WX 380 ; N Imacron ; B 14 0 485 857 ;
+C -1 ; WX 640 ; N Lcaron ; B 14 0 725 698 ;
+C -1 ; WX 1020 ; N onehalf ; B 118 0 1036 681 ;
+C -1 ; WX 549 ; N lessequal ; B 29 0 526 704 ;
+C -1 ; WX 600 ; N ocircumflex ; B 59 -8 627 749 ;
+C -1 ; WX 680 ; N ntilde ; B 83 -8 715 709 ;
+C -1 ; WX 740 ; N Uhungarumlaut ; B 112 -17 855 941 ;
+C -1 ; WX 720 ; N Eacute ; B 14 0 777 937 ;
+C -1 ; WX 560 ; N emacron ; B 59 -8 596 691 ;
+C -1 ; WX 620 ; N gbreve ; B 21 -213 669 707 ;
+C -1 ; WX 1020 ; N onequarter ; B 118 0 1054 681 ;
+C -1 ; WX 700 ; N Scaron ; B 59 -17 731 915 ;
+C -1 ; WX 700 ; N Scommaaccent ; B 59 -250 731 698 ;
+C -1 ; WX 760 ; N Ohungarumlaut ; B 78 -17 806 941 ;
+C -1 ; WX 400 ; N degree ; B 130 398 430 698 ;
+C -1 ; WX 600 ; N ograve ; B 59 -8 627 771 ;
+C -1 ; WX 700 ; N Ccaron ; B 78 -17 754 915 ;
+C -1 ; WX 680 ; N ugrave ; B 83 -8 720 771 ;
+C -1 ; WX 522 ; N radical ; B 10 -46 512 850 ;
+C -1 ; WX 760 ; N Dcaron ; B 14 0 805 915 ;
+C -1 ; WX 500 ; N rcommaaccent ; B 80 -250 582 515 ;
+C -1 ; WX 740 ; N Ntilde ; B 14 0 845 875 ;
+C -1 ; WX 600 ; N otilde ; B 59 -8 627 709 ;
+C -1 ; WX 740 ; N Rcommaaccent ; B 14 -250 765 681 ;
+C -1 ; WX 640 ; N Lcommaaccent ; B 14 -250 725 681 ;
+C -1 ; WX 720 ; N Atilde ; B -27 0 769 875 ;
+C -1 ; WX 720 ; N Aogonek ; B -27 -199 789 681 ;
+C -1 ; WX 720 ; N Aring ; B -27 0 769 941 ;
+C -1 ; WX 760 ; N Otilde ; B 78 -17 806 875 ;
+C -1 ; WX 560 ; N zdotaccent ; B 36 -8 586 762 ;
+C -1 ; WX 720 ; N Ecaron ; B 14 0 777 915 ;
+C -1 ; WX 380 ; N Iogonek ; B 14 -199 485 681 ;
+C -1 ; WX 700 ; N kcommaaccent ; B 97 -250 732 732 ;
+C -1 ; WX 600 ; N minus ; B 91 207 595 323 ;
+C -1 ; WX 380 ; N Icircumflex ; B 14 0 493 915 ;
+C -1 ; WX 680 ; N ncaron ; B 83 -8 715 749 ;
+C -1 ; WX 440 ; N tcommaaccent ; B 106 -250 488 658 ;
+C -1 ; WX 620 ; N logicalnot ; B 81 129 585 421 ;
+C -1 ; WX 600 ; N odieresis ; B 59 -8 627 734 ;
+C -1 ; WX 680 ; N udieresis ; B 83 -8 720 734 ;
+C -1 ; WX 555 ; N notequal ; B 15 -49 540 570 ;
+C -1 ; WX 620 ; N gcommaaccent ; B 21 -213 669 827 ;
+C -1 ; WX 600 ; N eth ; B 59 -8 662 741 ;
+C -1 ; WX 560 ; N zcaron ; B 36 -8 586 749 ;
+C -1 ; WX 680 ; N ncommaaccent ; B 83 -250 715 515 ;
+C -1 ; WX 408 ; N onesuperior ; B 118 279 406 688 ;
+C -1 ; WX 380 ; N imacron ; B 83 -8 461 691 ;
+EndCharMetrics
+StartKernData
+StartKernPairs 931
+KPX A T -17
+KPX A Tcaron -17
+KPX A Tcommaaccent -17
+KPX A V -40
+KPX A W -35
+KPX A Y -25
+KPX A Yacute -25
+KPX A Ydieresis -25
+KPX A v 20
+KPX A w 20
+KPX A y 20
+KPX A yacute 20
+KPX A ydieresis 20
+KPX Aacute T -17
+KPX Aacute Tcaron -17
+KPX Aacute Tcommaaccent -17
+KPX Aacute V -40
+KPX Aacute W -35
+KPX Aacute Y -25
+KPX Aacute Yacute -25
+KPX Aacute Ydieresis -25
+KPX Aacute v 20
+KPX Aacute w 20
+KPX Aacute y 20
+KPX Aacute yacute 20
+KPX Aacute ydieresis 20
+KPX Abreve T -17
+KPX Abreve Tcaron -17
+KPX Abreve Tcommaaccent -17
+KPX Abreve V -40
+KPX Abreve W -35
+KPX Abreve Y -25
+KPX Abreve Yacute -25
+KPX Abreve Ydieresis -25
+KPX Abreve v 20
+KPX Abreve w 20
+KPX Abreve y 20
+KPX Abreve yacute 20
+KPX Abreve ydieresis 20
+KPX Acircumflex T -17
+KPX Acircumflex Tcaron -17
+KPX Acircumflex Tcommaaccent -17
+KPX Acircumflex V -40
+KPX Acircumflex W -35
+KPX Acircumflex Y -25
+KPX Acircumflex Yacute -25
+KPX Acircumflex Ydieresis -25
+KPX Acircumflex v 20
+KPX Acircumflex w 20
+KPX Acircumflex y 20
+KPX Acircumflex yacute 20
+KPX Acircumflex ydieresis 20
+KPX Adieresis T -17
+KPX Adieresis Tcaron -17
+KPX Adieresis Tcommaaccent -17
+KPX Adieresis V -40
+KPX Adieresis W -35
+KPX Adieresis Y -25
+KPX Adieresis Yacute -25
+KPX Adieresis Ydieresis -25
+KPX Adieresis v 20
+KPX Adieresis w 20
+KPX Adieresis y 20
+KPX Adieresis yacute 20
+KPX Adieresis ydieresis 20
+KPX Agrave T -17
+KPX Agrave Tcaron -17
+KPX Agrave Tcommaaccent -17
+KPX Agrave V -40
+KPX Agrave W -35
+KPX Agrave Y -25
+KPX Agrave Yacute -25
+KPX Agrave Ydieresis -25
+KPX Agrave v 20
+KPX Agrave w 20
+KPX Agrave y 20
+KPX Agrave yacute 20
+KPX Agrave ydieresis 20
+KPX Amacron T -17
+KPX Amacron Tcaron -17
+KPX Amacron Tcommaaccent -17
+KPX Amacron V -40
+KPX Amacron W -35
+KPX Amacron Y -25
+KPX Amacron Yacute -25
+KPX Amacron Ydieresis -25
+KPX Amacron v 20
+KPX Amacron w 20
+KPX Amacron y 20
+KPX Amacron yacute 20
+KPX Amacron ydieresis 20
+KPX Aogonek T -17
+KPX Aogonek Tcaron -17
+KPX Aogonek Tcommaaccent -17
+KPX Aogonek V -40
+KPX Aogonek W -35
+KPX Aogonek Y -25
+KPX Aogonek Yacute -25
+KPX Aogonek Ydieresis -25
+KPX Aogonek v 20
+KPX Aogonek w 20
+KPX Aogonek y 20
+KPX Aogonek yacute 20
+KPX Aogonek ydieresis 20
+KPX Aring T -17
+KPX Aring Tcaron -17
+KPX Aring Tcommaaccent -17
+KPX Aring V -40
+KPX Aring W -35
+KPX Aring Y -25
+KPX Aring Yacute -25
+KPX Aring Ydieresis -25
+KPX Aring v 20
+KPX Aring w 20
+KPX Aring y 20
+KPX Aring yacute 20
+KPX Aring ydieresis 20
+KPX Atilde T -17
+KPX Atilde Tcaron -17
+KPX Atilde Tcommaaccent -17
+KPX Atilde V -40
+KPX Atilde W -35
+KPX Atilde Y -25
+KPX Atilde Yacute -25
+KPX Atilde Ydieresis -25
+KPX Atilde v 20
+KPX Atilde w 20
+KPX Atilde y 20
+KPX Atilde yacute 20
+KPX Atilde ydieresis 20
+KPX F A -35
+KPX F Aacute -35
+KPX F Abreve -35
+KPX F Acircumflex -35
+KPX F Adieresis -35
+KPX F Agrave -35
+KPX F Amacron -35
+KPX F Aogonek -35
+KPX F Aring -35
+KPX F Atilde -35
+KPX F comma -98
+KPX F period -105
+KPX L T -26
+KPX L Tcaron -26
+KPX L Tcommaaccent -26
+KPX L V -19
+KPX L W -15
+KPX L Y -5
+KPX L Yacute -5
+KPX L Ydieresis -5
+KPX L y 62
+KPX L yacute 62
+KPX L ydieresis 62
+KPX Lacute T -26
+KPX Lacute Tcaron -26
+KPX Lacute Tcommaaccent -26
+KPX Lacute V -19
+KPX Lacute W -15
+KPX Lacute Y -5
+KPX Lacute Yacute -5
+KPX Lacute Ydieresis -5
+KPX Lacute y 62
+KPX Lacute yacute 62
+KPX Lacute ydieresis 62
+KPX Lcommaaccent T -26
+KPX Lcommaaccent Tcaron -26
+KPX Lcommaaccent Tcommaaccent -26
+KPX Lcommaaccent V -19
+KPX Lcommaaccent W -15
+KPX Lcommaaccent Y -5
+KPX Lcommaaccent Yacute -5
+KPX Lcommaaccent Ydieresis -5
+KPX Lcommaaccent y 62
+KPX Lcommaaccent yacute 62
+KPX Lcommaaccent ydieresis 62
+KPX Lslash T -26
+KPX Lslash Tcaron -26
+KPX Lslash Tcommaaccent -26
+KPX Lslash V -19
+KPX Lslash W -15
+KPX Lslash Y -5
+KPX Lslash Yacute -5
+KPX Lslash Ydieresis -5
+KPX Lslash y 62
+KPX Lslash yacute 62
+KPX Lslash ydieresis 62
+KPX P A -31
+KPX P Aacute -31
+KPX P Abreve -31
+KPX P Acircumflex -31
+KPX P Adieresis -31
+KPX P Agrave -31
+KPX P Amacron -31
+KPX P Aogonek -31
+KPX P Aring -31
+KPX P Atilde -31
+KPX P comma -98
+KPX P period -105
+KPX R T -3
+KPX R Tcaron -3
+KPX R Tcommaaccent -3
+KPX R V -8
+KPX R W -4
+KPX R Y 4
+KPX R Yacute 4
+KPX R Ydieresis 4
+KPX R y 27
+KPX R yacute 27
+KPX R ydieresis 27
+KPX Racute T -3
+KPX Racute Tcaron -3
+KPX Racute Tcommaaccent -3
+KPX Racute V -8
+KPX Racute W -4
+KPX Racute Y 4
+KPX Racute Yacute 4
+KPX Racute Ydieresis 4
+KPX Racute y 27
+KPX Racute yacute 27
+KPX Racute ydieresis 27
+KPX Rcaron T -3
+KPX Rcaron Tcaron -3
+KPX Rcaron Tcommaaccent -3
+KPX Rcaron V -8
+KPX Rcaron W -4
+KPX Rcaron Y 4
+KPX Rcaron Yacute 4
+KPX Rcaron Ydieresis 4
+KPX Rcaron y 27
+KPX Rcaron yacute 27
+KPX Rcaron ydieresis 27
+KPX Rcommaaccent T -3
+KPX Rcommaaccent Tcaron -3
+KPX Rcommaaccent Tcommaaccent -3
+KPX Rcommaaccent V -8
+KPX Rcommaaccent W -4
+KPX Rcommaaccent Y 4
+KPX Rcommaaccent Yacute 4
+KPX Rcommaaccent Ydieresis 4
+KPX Rcommaaccent y 27
+KPX Rcommaaccent yacute 27
+KPX Rcommaaccent ydieresis 27
+KPX T A -42
+KPX T Aacute -42
+KPX T Abreve -42
+KPX T Acircumflex -42
+KPX T Adieresis -42
+KPX T Agrave -42
+KPX T Amacron -42
+KPX T Aogonek -42
+KPX T Aring -42
+KPX T Atilde -42
+KPX T a -8
+KPX T aacute -8
+KPX T abreve -8
+KPX T acircumflex -8
+KPX T adieresis -8
+KPX T agrave -8
+KPX T amacron -8
+KPX T aogonek -8
+KPX T aring -8
+KPX T atilde -8
+KPX T c -8
+KPX T cacute -8
+KPX T ccaron -8
+KPX T ccedilla -8
+KPX T colon 26
+KPX T comma -100
+KPX T e -10
+KPX T eacute -10
+KPX T ecaron -10
+KPX T ecircumflex -10
+KPX T edieresis -10
+KPX T edotaccent -10
+KPX T egrave -10
+KPX T emacron -10
+KPX T eogonek -10
+KPX T hyphen -20
+KPX T i 42
+KPX T iacute 42
+KPX T icircumflex 42
+KPX T idieresis 42
+KPX T igrave 42
+KPX T imacron 42
+KPX T iogonek 42
+KPX T o -5
+KPX T oacute -5
+KPX T ocircumflex -5
+KPX T odieresis -5
+KPX T ograve -5
+KPX T ohungarumlaut -5
+KPX T omacron -5
+KPX T oslash -5
+KPX T otilde -5
+KPX T period -107
+KPX T r 41
+KPX T racute 41
+KPX T rcaron 41
+KPX T rcommaaccent 41
+KPX T s -1
+KPX T sacute -1
+KPX T scaron -1
+KPX T scedilla -1
+KPX T scommaaccent -1
+KPX T semicolon 31
+KPX T u 42
+KPX T uacute 42
+KPX T ucircumflex 42
+KPX T udieresis 42
+KPX T ugrave 42
+KPX T uhungarumlaut 42
+KPX T umacron 42
+KPX T uogonek 42
+KPX T uring 42
+KPX T w 69
+KPX T y 56
+KPX T yacute 56
+KPX T ydieresis 56
+KPX Tcaron A -42
+KPX Tcaron Aacute -42
+KPX Tcaron Abreve -42
+KPX Tcaron Acircumflex -42
+KPX Tcaron Adieresis -42
+KPX Tcaron Agrave -42
+KPX Tcaron Amacron -42
+KPX Tcaron Aogonek -42
+KPX Tcaron Aring -42
+KPX Tcaron Atilde -42
+KPX Tcaron a -8
+KPX Tcaron aacute -8
+KPX Tcaron abreve -8
+KPX Tcaron acircumflex -8
+KPX Tcaron adieresis -8
+KPX Tcaron agrave -8
+KPX Tcaron amacron -8
+KPX Tcaron aogonek -8
+KPX Tcaron aring -8
+KPX Tcaron atilde -8
+KPX Tcaron c -8
+KPX Tcaron cacute -8
+KPX Tcaron ccaron -8
+KPX Tcaron ccedilla -8
+KPX Tcaron colon 26
+KPX Tcaron comma -100
+KPX Tcaron e -10
+KPX Tcaron eacute -10
+KPX Tcaron ecaron -10
+KPX Tcaron ecircumflex -10
+KPX Tcaron edieresis -10
+KPX Tcaron edotaccent -10
+KPX Tcaron egrave -10
+KPX Tcaron emacron -10
+KPX Tcaron eogonek -10
+KPX Tcaron hyphen -20
+KPX Tcaron i 42
+KPX Tcaron iacute 42
+KPX Tcaron icircumflex 42
+KPX Tcaron idieresis 42
+KPX Tcaron igrave 42
+KPX Tcaron imacron 42
+KPX Tcaron iogonek 42
+KPX Tcaron o -5
+KPX Tcaron oacute -5
+KPX Tcaron ocircumflex -5
+KPX Tcaron odieresis -5
+KPX Tcaron ograve -5
+KPX Tcaron ohungarumlaut -5
+KPX Tcaron omacron -5
+KPX Tcaron oslash -5
+KPX Tcaron otilde -5
+KPX Tcaron period -107
+KPX Tcaron r 41
+KPX Tcaron racute 41
+KPX Tcaron rcaron 41
+KPX Tcaron rcommaaccent 41
+KPX Tcaron s -1
+KPX Tcaron sacute -1
+KPX Tcaron scaron -1
+KPX Tcaron scedilla -1
+KPX Tcaron scommaaccent -1
+KPX Tcaron semicolon 31
+KPX Tcaron u 42
+KPX Tcaron uacute 42
+KPX Tcaron ucircumflex 42
+KPX Tcaron udieresis 42
+KPX Tcaron ugrave 42
+KPX Tcaron uhungarumlaut 42
+KPX Tcaron umacron 42
+KPX Tcaron uogonek 42
+KPX Tcaron uring 42
+KPX Tcaron w 69
+KPX Tcaron y 56
+KPX Tcaron yacute 56
+KPX Tcaron ydieresis 56
+KPX Tcommaaccent A -42
+KPX Tcommaaccent Aacute -42
+KPX Tcommaaccent Abreve -42
+KPX Tcommaaccent Acircumflex -42
+KPX Tcommaaccent Adieresis -42
+KPX Tcommaaccent Agrave -42
+KPX Tcommaaccent Amacron -42
+KPX Tcommaaccent Aogonek -42
+KPX Tcommaaccent Aring -42
+KPX Tcommaaccent Atilde -42
+KPX Tcommaaccent a -8
+KPX Tcommaaccent aacute -8
+KPX Tcommaaccent abreve -8
+KPX Tcommaaccent acircumflex -8
+KPX Tcommaaccent adieresis -8
+KPX Tcommaaccent agrave -8
+KPX Tcommaaccent amacron -8
+KPX Tcommaaccent aogonek -8
+KPX Tcommaaccent aring -8
+KPX Tcommaaccent atilde -8
+KPX Tcommaaccent c -8
+KPX Tcommaaccent cacute -8
+KPX Tcommaaccent ccaron -8
+KPX Tcommaaccent ccedilla -8
+KPX Tcommaaccent colon 26
+KPX Tcommaaccent comma -100
+KPX Tcommaaccent e -10
+KPX Tcommaaccent eacute -10
+KPX Tcommaaccent ecaron -10
+KPX Tcommaaccent ecircumflex -10
+KPX Tcommaaccent edieresis -10
+KPX Tcommaaccent edotaccent -10
+KPX Tcommaaccent egrave -10
+KPX Tcommaaccent emacron -10
+KPX Tcommaaccent eogonek -10
+KPX Tcommaaccent hyphen -20
+KPX Tcommaaccent i 42
+KPX Tcommaaccent iacute 42
+KPX Tcommaaccent icircumflex 42
+KPX Tcommaaccent idieresis 42
+KPX Tcommaaccent igrave 42
+KPX Tcommaaccent imacron 42
+KPX Tcommaaccent iogonek 42
+KPX Tcommaaccent o -5
+KPX Tcommaaccent oacute -5
+KPX Tcommaaccent ocircumflex -5
+KPX Tcommaaccent odieresis -5
+KPX Tcommaaccent ograve -5
+KPX Tcommaaccent ohungarumlaut -5
+KPX Tcommaaccent omacron -5
+KPX Tcommaaccent oslash -5
+KPX Tcommaaccent otilde -5
+KPX Tcommaaccent period -107
+KPX Tcommaaccent r 41
+KPX Tcommaaccent racute 41
+KPX Tcommaaccent rcaron 41
+KPX Tcommaaccent rcommaaccent 41
+KPX Tcommaaccent s -1
+KPX Tcommaaccent sacute -1
+KPX Tcommaaccent scaron -1
+KPX Tcommaaccent scedilla -1
+KPX Tcommaaccent scommaaccent -1
+KPX Tcommaaccent semicolon 31
+KPX Tcommaaccent u 42
+KPX Tcommaaccent uacute 42
+KPX Tcommaaccent ucircumflex 42
+KPX Tcommaaccent udieresis 42
+KPX Tcommaaccent ugrave 42
+KPX Tcommaaccent uhungarumlaut 42
+KPX Tcommaaccent umacron 42
+KPX Tcommaaccent uogonek 42
+KPX Tcommaaccent uring 42
+KPX Tcommaaccent w 69
+KPX Tcommaaccent y 56
+KPX Tcommaaccent yacute 56
+KPX Tcommaaccent ydieresis 56
+KPX V A -50
+KPX V Aacute -50
+KPX V Abreve -50
+KPX V Acircumflex -50
+KPX V Adieresis -50
+KPX V Agrave -50
+KPX V Amacron -50
+KPX V Aogonek -50
+KPX V Aring -50
+KPX V Atilde -50
+KPX V a -50
+KPX V aacute -50
+KPX V abreve -50
+KPX V acircumflex -50
+KPX V adieresis -50
+KPX V agrave -50
+KPX V amacron -50
+KPX V aogonek -50
+KPX V aring -50
+KPX V atilde -50
+KPX V colon -28
+KPX V comma -137
+KPX V e -50
+KPX V eacute -50
+KPX V ecaron -50
+KPX V ecircumflex -50
+KPX V edotaccent -50
+KPX V egrave -50
+KPX V eogonek -50
+KPX V hyphen -20
+KPX V i 32
+KPX V iacute 32
+KPX V icircumflex 48
+KPX V idieresis 48
+KPX V igrave 32
+KPX V imacron 48
+KPX V iogonek 32
+KPX V o -50
+KPX V oacute -50
+KPX V ocircumflex -50
+KPX V odieresis -50
+KPX V ograve -50
+KPX V ohungarumlaut -20
+KPX V omacron -52
+KPX V oslash -50
+KPX V otilde -20
+KPX V period -115
+KPX V r 2
+KPX V racute 2
+KPX V rcaron 2
+KPX V rcommaaccent 2
+KPX V semicolon -22
+KPX V u -1
+KPX V uacute -1
+KPX V ucircumflex -1
+KPX V udieresis -1
+KPX V ugrave -1
+KPX V uhungarumlaut -1
+KPX V umacron -1
+KPX V uogonek -1
+KPX V uring -1
+KPX V y 17
+KPX V yacute 17
+KPX V ydieresis 17
+KPX W A -77
+KPX W Aacute -77
+KPX W Abreve -77
+KPX W Acircumflex -77
+KPX W Adieresis -77
+KPX W Agrave -77
+KPX W Amacron -77
+KPX W Aogonek -77
+KPX W Aring -77
+KPX W Atilde -77
+KPX W a -100
+KPX W aacute -100
+KPX W abreve -100
+KPX W acircumflex -100
+KPX W adieresis -100
+KPX W agrave -100
+KPX W amacron -100
+KPX W aogonek -100
+KPX W aring -100
+KPX W atilde -100
+KPX W colon -86
+KPX W comma -201
+KPX W e -100
+KPX W eacute -100
+KPX W ecaron -100
+KPX W ecircumflex -100
+KPX W edieresis -100
+KPX W edotaccent -100
+KPX W egrave -100
+KPX W emacron -100
+KPX W eogonek -100
+KPX W hyphen -22
+KPX W i -36
+KPX W iacute -36
+KPX W igrave -36
+KPX W iogonek -36
+KPX W o -100
+KPX W oacute -100
+KPX W ocircumflex -100
+KPX W odieresis -100
+KPX W ograve -100
+KPX W ohungarumlaut -100
+KPX W omacron -100
+KPX W oslash -100
+KPX W otilde -100
+KPX W period -183
+KPX W r -66
+KPX W racute -66
+KPX W rcaron -66
+KPX W rcommaaccent -66
+KPX W semicolon -81
+KPX W u -69
+KPX W uacute -69
+KPX W ucircumflex -69
+KPX W udieresis -69
+KPX W ugrave -69
+KPX W uhungarumlaut -69
+KPX W umacron -69
+KPX W uogonek -69
+KPX W uring -69
+KPX W y -51
+KPX W yacute -51
+KPX W ydieresis -51
+KPX Y A -30
+KPX Y Aacute -30
+KPX Y Abreve -30
+KPX Y Acircumflex -30
+KPX Y Adieresis -30
+KPX Y Agrave -30
+KPX Y Amacron -30
+KPX Y Aogonek -30
+KPX Y Aring -30
+KPX Y Atilde -30
+KPX Y a -45
+KPX Y aacute -45
+KPX Y abreve -45
+KPX Y acircumflex -45
+KPX Y adieresis -45
+KPX Y agrave -45
+KPX Y amacron -45
+KPX Y aogonek -45
+KPX Y aring -45
+KPX Y atilde -45
+KPX Y colon -9
+KPX Y comma -106
+KPX Y e -46
+KPX Y eacute -46
+KPX Y ecaron -46
+KPX Y ecircumflex -46
+KPX Y edotaccent -46
+KPX Y egrave -46
+KPX Y eogonek -46
+KPX Y hyphen -20
+KPX Y i 20
+KPX Y iacute 20
+KPX Y icircumflex 40
+KPX Y idieresis 40
+KPX Y igrave 40
+KPX Y imacron 40
+KPX Y iogonek 20
+KPX Y o -41
+KPX Y oacute -41
+KPX Y ocircumflex -41
+KPX Y odieresis -21
+KPX Y ograve -41
+KPX Y ohungarumlaut -21
+KPX Y omacron -41
+KPX Y oslash -41
+KPX Y otilde -41
+KPX Y period -113
+KPX Y q -43
+KPX Y semicolon -4
+KPX Y u -1
+KPX Y uacute -1
+KPX Y ucircumflex -1
+KPX Y udieresis -1
+KPX Y ugrave -1
+KPX Y uhungarumlaut -1
+KPX Y umacron -1
+KPX Y uogonek -1
+KPX Y uring -1
+KPX Y v 26
+KPX Yacute A -30
+KPX Yacute Aacute -30
+KPX Yacute Abreve -30
+KPX Yacute Acircumflex -30
+KPX Yacute Adieresis -30
+KPX Yacute Agrave -30
+KPX Yacute Amacron -30
+KPX Yacute Aogonek -30
+KPX Yacute Aring -30
+KPX Yacute Atilde -30
+KPX Yacute a -45
+KPX Yacute aacute -45
+KPX Yacute abreve -45
+KPX Yacute acircumflex -45
+KPX Yacute adieresis -45
+KPX Yacute agrave -45
+KPX Yacute amacron -45
+KPX Yacute aogonek -45
+KPX Yacute aring -45
+KPX Yacute atilde -45
+KPX Yacute colon -9
+KPX Yacute comma -106
+KPX Yacute e -46
+KPX Yacute eacute -46
+KPX Yacute ecaron -46
+KPX Yacute ecircumflex -46
+KPX Yacute edotaccent -46
+KPX Yacute egrave -46
+KPX Yacute eogonek -46
+KPX Yacute hyphen -20
+KPX Yacute i 20
+KPX Yacute iacute 20
+KPX Yacute icircumflex 40
+KPX Yacute idieresis 40
+KPX Yacute igrave 40
+KPX Yacute imacron 40
+KPX Yacute iogonek 20
+KPX Yacute o -41
+KPX Yacute oacute -41
+KPX Yacute ocircumflex -41
+KPX Yacute odieresis -21
+KPX Yacute ograve -41
+KPX Yacute ohungarumlaut -21
+KPX Yacute omacron -41
+KPX Yacute oslash -41
+KPX Yacute otilde -41
+KPX Yacute period -113
+KPX Yacute q -43
+KPX Yacute semicolon -4
+KPX Yacute u -1
+KPX Yacute uacute -1
+KPX Yacute ucircumflex -1
+KPX Yacute udieresis -1
+KPX Yacute ugrave -1
+KPX Yacute uhungarumlaut -1
+KPX Yacute umacron -1
+KPX Yacute uogonek -1
+KPX Yacute uring -1
+KPX Yacute v 26
+KPX Ydieresis A -30
+KPX Ydieresis Aacute -30
+KPX Ydieresis Abreve -30
+KPX Ydieresis Acircumflex -30
+KPX Ydieresis Adieresis -30
+KPX Ydieresis Agrave -30
+KPX Ydieresis Amacron -30
+KPX Ydieresis Aogonek -30
+KPX Ydieresis Aring -30
+KPX Ydieresis Atilde -30
+KPX Ydieresis a -45
+KPX Ydieresis aacute -45
+KPX Ydieresis abreve -45
+KPX Ydieresis acircumflex -45
+KPX Ydieresis adieresis -45
+KPX Ydieresis agrave -45
+KPX Ydieresis amacron -45
+KPX Ydieresis aogonek -45
+KPX Ydieresis aring -45
+KPX Ydieresis atilde -45
+KPX Ydieresis colon -9
+KPX Ydieresis comma -106
+KPX Ydieresis e -46
+KPX Ydieresis eacute -46
+KPX Ydieresis ecaron -46
+KPX Ydieresis ecircumflex -46
+KPX Ydieresis edotaccent -46
+KPX Ydieresis egrave -46
+KPX Ydieresis eogonek -46
+KPX Ydieresis hyphen -20
+KPX Ydieresis i 20
+KPX Ydieresis iacute 20
+KPX Ydieresis icircumflex 40
+KPX Ydieresis idieresis 40
+KPX Ydieresis igrave 40
+KPX Ydieresis imacron 40
+KPX Ydieresis iogonek 20
+KPX Ydieresis o -41
+KPX Ydieresis oacute -41
+KPX Ydieresis ocircumflex -41
+KPX Ydieresis odieresis -21
+KPX Ydieresis ograve -41
+KPX Ydieresis ohungarumlaut -21
+KPX Ydieresis omacron -41
+KPX Ydieresis oslash -41
+KPX Ydieresis otilde -41
+KPX Ydieresis period -113
+KPX Ydieresis q -43
+KPX Ydieresis semicolon -4
+KPX Ydieresis u -1
+KPX Ydieresis uacute -1
+KPX Ydieresis ucircumflex -1
+KPX Ydieresis udieresis -1
+KPX Ydieresis ugrave -1
+KPX Ydieresis uhungarumlaut -1
+KPX Ydieresis umacron -1
+KPX Ydieresis uogonek -1
+KPX Ydieresis uring -1
+KPX Ydieresis v 26
+KPX f f 10
+KPX r c -5
+KPX r cacute -5
+KPX r ccaron -5
+KPX r ccedilla -5
+KPX r comma -113
+KPX r d -3
+KPX r dcroat -3
+KPX r e -6
+KPX r eacute -6
+KPX r ecaron -6
+KPX r ecircumflex -6
+KPX r edieresis -6
+KPX r edotaccent -6
+KPX r egrave -6
+KPX r emacron -6
+KPX r eogonek -6
+KPX r f 42
+KPX r g -23
+KPX r gbreve -23
+KPX r gcommaaccent -23
+KPX r h -35
+KPX r hyphen -20
+KPX r m 39
+KPX r n 39
+KPX r nacute 39
+KPX r ncaron 39
+KPX r ncommaaccent 39
+KPX r ntilde 39
+KPX r o -1
+KPX r oacute -1
+KPX r ocircumflex -1
+KPX r odieresis -1
+KPX r ograve -1
+KPX r ohungarumlaut -1
+KPX r omacron -1
+KPX r oslash -1
+KPX r otilde -1
+KPX r period -120
+KPX r q -3
+KPX racute c -5
+KPX racute cacute -5
+KPX racute ccaron -5
+KPX racute ccedilla -5
+KPX racute comma -113
+KPX racute d -3
+KPX racute dcroat -3
+KPX racute e -6
+KPX racute eacute -6
+KPX racute ecaron -6
+KPX racute ecircumflex -6
+KPX racute edieresis -6
+KPX racute edotaccent -6
+KPX racute egrave -6
+KPX racute emacron -6
+KPX racute eogonek -6
+KPX racute f 42
+KPX racute g -23
+KPX racute gbreve -23
+KPX racute gcommaaccent -23
+KPX racute h -35
+KPX racute hyphen -20
+KPX racute m 39
+KPX racute n 39
+KPX racute nacute 39
+KPX racute ncaron 39
+KPX racute ncommaaccent 39
+KPX racute ntilde 39
+KPX racute o -1
+KPX racute oacute -1
+KPX racute ocircumflex -1
+KPX racute odieresis -1
+KPX racute ograve -1
+KPX racute ohungarumlaut -1
+KPX racute omacron -1
+KPX racute oslash -1
+KPX racute otilde -1
+KPX racute period -120
+KPX racute q -3
+KPX rcaron c -5
+KPX rcaron cacute -5
+KPX rcaron ccaron -5
+KPX rcaron ccedilla -5
+KPX rcaron comma -113
+KPX rcaron d -3
+KPX rcaron dcroat -3
+KPX rcaron e -6
+KPX rcaron eacute -6
+KPX rcaron ecaron -6
+KPX rcaron ecircumflex -6
+KPX rcaron edieresis -6
+KPX rcaron edotaccent -6
+KPX rcaron egrave -6
+KPX rcaron emacron -6
+KPX rcaron eogonek -6
+KPX rcaron f 42
+KPX rcaron g -23
+KPX rcaron gbreve -23
+KPX rcaron gcommaaccent -23
+KPX rcaron h -35
+KPX rcaron hyphen -20
+KPX rcaron m 39
+KPX rcaron n 39
+KPX rcaron nacute 39
+KPX rcaron ncaron 39
+KPX rcaron ncommaaccent 39
+KPX rcaron ntilde 39
+KPX rcaron o -1
+KPX rcaron oacute -1
+KPX rcaron ocircumflex -1
+KPX rcaron odieresis -1
+KPX rcaron ograve -1
+KPX rcaron ohungarumlaut -1
+KPX rcaron omacron -1
+KPX rcaron oslash -1
+KPX rcaron otilde -1
+KPX rcaron period -120
+KPX rcaron q -3
+KPX rcommaaccent c -5
+KPX rcommaaccent cacute -5
+KPX rcommaaccent ccaron -5
+KPX rcommaaccent ccedilla -5
+KPX rcommaaccent comma -113
+KPX rcommaaccent d -3
+KPX rcommaaccent dcroat -3
+KPX rcommaaccent e -6
+KPX rcommaaccent eacute -6
+KPX rcommaaccent ecaron -6
+KPX rcommaaccent ecircumflex -6
+KPX rcommaaccent edieresis -6
+KPX rcommaaccent edotaccent -6
+KPX rcommaaccent egrave -6
+KPX rcommaaccent emacron -6
+KPX rcommaaccent eogonek -6
+KPX rcommaaccent f 42
+KPX rcommaaccent g -23
+KPX rcommaaccent gbreve -23
+KPX rcommaaccent gcommaaccent -23
+KPX rcommaaccent h -35
+KPX rcommaaccent hyphen -20
+KPX rcommaaccent m 39
+KPX rcommaaccent n 39
+KPX rcommaaccent nacute 39
+KPX rcommaaccent ncaron 39
+KPX rcommaaccent ncommaaccent 39
+KPX rcommaaccent ntilde 39
+KPX rcommaaccent o -1
+KPX rcommaaccent oacute -1
+KPX rcommaaccent ocircumflex -1
+KPX rcommaaccent odieresis -1
+KPX rcommaaccent ograve -1
+KPX rcommaaccent ohungarumlaut -1
+KPX rcommaaccent omacron -1
+KPX rcommaaccent oslash -1
+KPX rcommaaccent otilde -1
+KPX rcommaaccent period -120
+KPX rcommaaccent q -3
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/src/fonts/Adobe-Core35_AFMs-314/ITCBookman-Light.afm b/src/fonts/Adobe-Core35_AFMs-314/ITCBookman-Light.afm
new file mode 100644
index 0000000..5baca8f
--- /dev/null
+++ b/src/fonts/Adobe-Core35_AFMs-314/ITCBookman-Light.afm
@@ -0,0 +1,1226 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1985, 1987, 1989, 1992, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Thu May 1 13:40:29 1997
+Comment UniqueID 43077
+Comment VMusage 44500 55525
+FontName Bookman-Light
+FullName ITC Bookman Light
+FamilyName ITC Bookman
+Weight Light
+ItalicAngle 0
+IsFixedPitch false
+FontBBox -188 -251 1266 908
+UnderlinePosition -100
+UnderlineThickness 50
+Version 002.000
+Notice Copyright (c) 1985, 1987, 1989, 1992, 1997 Adobe Systems Incorporated. All Rights Reserved.ITC Bookman is a registered trademark of International Typeface Corporation.
+EncodingScheme AdobeStandardEncoding
+CapHeight 681
+XHeight 484
+Ascender 717
+Descender -228
+StdHW 42
+StdVW 96
+StartCharMetrics 314
+C 32 ; WX 320 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 300 ; N exclam ; B 75 -8 219 698 ;
+C 34 ; WX 380 ; N quotedbl ; B 56 458 323 698 ;
+C 35 ; WX 620 ; N numbersign ; B 65 0 556 681 ;
+C 36 ; WX 620 ; N dollar ; B 34 -109 593 791 ;
+C 37 ; WX 900 ; N percent ; B 22 -8 873 698 ;
+C 38 ; WX 800 ; N ampersand ; B 45 -17 787 698 ;
+C 39 ; WX 220 ; N quoteright ; B 46 480 178 698 ;
+C 40 ; WX 300 ; N parenleft ; B 76 -145 278 727 ;
+C 41 ; WX 300 ; N parenright ; B 17 -146 219 727 ;
+C 42 ; WX 440 ; N asterisk ; B 54 325 391 698 ;
+C 43 ; WX 600 ; N plus ; B 51 8 555 513 ;
+C 44 ; WX 320 ; N comma ; B 90 -114 223 114 ;
+C 45 ; WX 400 ; N hyphen ; B 50 232 350 292 ;
+C 46 ; WX 320 ; N period ; B 92 -8 220 123 ;
+C 47 ; WX 600 ; N slash ; B 74 -149 532 717 ;
+C 48 ; WX 620 ; N zero ; B 40 -17 586 698 ;
+C 49 ; WX 620 ; N one ; B 160 0 501 681 ;
+C 50 ; WX 620 ; N two ; B 42 0 576 698 ;
+C 51 ; WX 620 ; N three ; B 40 -17 576 698 ;
+C 52 ; WX 620 ; N four ; B 25 0 600 681 ;
+C 53 ; WX 620 ; N five ; B 60 -17 584 717 ;
+C 54 ; WX 620 ; N six ; B 45 -17 590 698 ;
+C 55 ; WX 620 ; N seven ; B 60 0 586 681 ;
+C 56 ; WX 620 ; N eight ; B 44 -17 583 698 ;
+C 57 ; WX 620 ; N nine ; B 37 -17 576 698 ;
+C 58 ; WX 320 ; N colon ; B 92 -8 220 494 ;
+C 59 ; WX 320 ; N semicolon ; B 90 -114 223 494 ;
+C 60 ; WX 600 ; N less ; B 49 -2 558 526 ;
+C 61 ; WX 600 ; N equal ; B 51 126 555 398 ;
+C 62 ; WX 600 ; N greater ; B 48 -2 557 526 ;
+C 63 ; WX 540 ; N question ; B 27 -8 514 698 ;
+C 64 ; WX 820 ; N at ; B 55 -17 755 698 ;
+C 65 ; WX 680 ; N A ; B -37 0 714 681 ;
+C 66 ; WX 740 ; N B ; B 31 0 702 681 ;
+C 67 ; WX 740 ; N C ; B 44 -17 702 698 ;
+C 68 ; WX 800 ; N D ; B 31 0 752 681 ;
+C 69 ; WX 720 ; N E ; B 31 0 705 681 ;
+C 70 ; WX 640 ; N F ; B 31 0 654 681 ;
+C 71 ; WX 800 ; N G ; B 44 -17 778 698 ;
+C 72 ; WX 800 ; N H ; B 31 0 769 681 ;
+C 73 ; WX 340 ; N I ; B 31 0 301 681 ;
+C 74 ; WX 600 ; N J ; B -23 -17 567 681 ;
+C 75 ; WX 720 ; N K ; B 31 0 750 681 ;
+C 76 ; WX 600 ; N L ; B 31 0 629 681 ;
+C 77 ; WX 920 ; N M ; B 26 0 894 681 ;
+C 78 ; WX 740 ; N N ; B 26 0 722 681 ;
+C 79 ; WX 800 ; N O ; B 44 -17 758 698 ;
+C 80 ; WX 620 ; N P ; B 31 0 613 681 ;
+C 81 ; WX 820 ; N Q ; B 44 -189 769 698 ;
+C 82 ; WX 720 ; N R ; B 31 0 757 681 ;
+C 83 ; WX 660 ; N S ; B 28 -17 634 698 ;
+C 84 ; WX 620 ; N T ; B -37 0 656 681 ;
+C 85 ; WX 780 ; N U ; B 25 -17 754 681 ;
+C 86 ; WX 700 ; N V ; B -30 0 725 681 ;
+C 87 ; WX 960 ; N W ; B -30 0 984 681 ;
+C 88 ; WX 720 ; N X ; B -30 0 755 681 ;
+C 89 ; WX 640 ; N Y ; B -30 0 666 681 ;
+C 90 ; WX 640 ; N Z ; B 10 0 656 681 ;
+C 91 ; WX 300 ; N bracketleft ; B 92 -136 258 717 ;
+C 92 ; WX 600 ; N backslash ; B 74 0 532 717 ;
+C 93 ; WX 300 ; N bracketright ; B 41 -136 207 717 ;
+C 94 ; WX 600 ; N asciicircum ; B 52 276 554 681 ;
+C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;
+C 96 ; WX 220 ; N quoteleft ; B 46 479 178 698 ;
+C 97 ; WX 580 ; N a ; B 35 -8 587 494 ;
+C 98 ; WX 620 ; N b ; B -2 -8 582 717 ;
+C 99 ; WX 520 ; N c ; B 37 -8 498 494 ;
+C 100 ; WX 620 ; N d ; B 37 -8 591 717 ;
+C 101 ; WX 520 ; N e ; B 37 -8 491 494 ;
+C 102 ; WX 320 ; N f ; B 20 0 414 734 ; L i fi ; L l fl ;
+C 103 ; WX 540 ; N g ; B 17 -243 542 567 ;
+C 104 ; WX 660 ; N h ; B 20 0 643 717 ;
+C 105 ; WX 300 ; N i ; B 20 0 288 654 ;
+C 106 ; WX 300 ; N j ; B -109 -251 214 654 ;
+C 107 ; WX 620 ; N k ; B 20 0 628 717 ;
+C 108 ; WX 300 ; N l ; B 20 0 286 717 ;
+C 109 ; WX 940 ; N m ; B 17 0 928 494 ;
+C 110 ; WX 660 ; N n ; B 20 0 649 494 ;
+C 111 ; WX 560 ; N o ; B 37 -8 526 494 ;
+C 112 ; WX 620 ; N p ; B 20 -228 583 494 ;
+C 113 ; WX 580 ; N q ; B 37 -228 589 494 ;
+C 114 ; WX 440 ; N r ; B 20 0 447 494 ;
+C 115 ; WX 520 ; N s ; B 40 -8 487 494 ;
+C 116 ; WX 380 ; N t ; B 20 -8 388 667 ;
+C 117 ; WX 680 ; N u ; B 20 -8 653 484 ;
+C 118 ; WX 520 ; N v ; B -23 0 534 484 ;
+C 119 ; WX 780 ; N w ; B -19 0 804 484 ;
+C 120 ; WX 560 ; N x ; B -16 0 576 484 ;
+C 121 ; WX 540 ; N y ; B -23 -236 549 484 ;
+C 122 ; WX 480 ; N z ; B 7 0 476 484 ;
+C 123 ; WX 280 ; N braceleft ; B 21 -136 260 717 ;
+C 124 ; WX 600 ; N bar ; B 264 -250 342 750 ;
+C 125 ; WX 280 ; N braceright ; B 21 -136 260 717 ;
+C 126 ; WX 600 ; N asciitilde ; B 52 173 556 352 ;
+C 161 ; WX 300 ; N exclamdown ; B 75 -214 219 494 ;
+C 162 ; WX 620 ; N cent ; B 116 20 511 651 ;
+C 163 ; WX 620 ; N sterling ; B 8 -17 631 698 ;
+C 164 ; WX 140 ; N fraction ; B -188 0 335 681 ;
+C 165 ; WX 620 ; N yen ; B -22 0 647 681 ;
+C 166 ; WX 620 ; N florin ; B -29 -155 633 749 ;
+C 167 ; WX 520 ; N section ; B 33 -178 486 698 ;
+C 168 ; WX 620 ; N currency ; B 58 89 563 591 ;
+C 169 ; WX 220 ; N quotesingle ; B 67 458 153 698 ;
+C 170 ; WX 400 ; N quotedblleft ; B 46 479 348 698 ;
+C 171 ; WX 360 ; N guillemotleft ; B 51 89 312 437 ;
+C 172 ; WX 240 ; N guilsinglleft ; B 51 89 189 437 ;
+C 173 ; WX 240 ; N guilsinglright ; B 51 89 189 437 ;
+C 174 ; WX 620 ; N fi ; B 20 0 608 734 ;
+C 175 ; WX 620 ; N fl ; B 20 0 606 734 ;
+C 177 ; WX 500 ; N endash ; B -15 232 515 292 ;
+C 178 ; WX 540 ; N dagger ; B 79 -156 455 698 ;
+C 179 ; WX 540 ; N daggerdbl ; B 79 -156 455 698 ;
+C 180 ; WX 320 ; N periodcentered ; B 92 196 220 327 ;
+C 182 ; WX 600 ; N paragraph ; B 14 0 577 681 ;
+C 183 ; WX 460 ; N bullet ; B 60 170 404 511 ;
+C 184 ; WX 220 ; N quotesinglbase ; B 46 -108 178 110 ;
+C 185 ; WX 400 ; N quotedblbase ; B 46 -108 348 110 ;
+C 186 ; WX 400 ; N quotedblright ; B 46 480 348 698 ;
+C 187 ; WX 360 ; N guillemotright ; B 51 89 312 437 ;
+C 188 ; WX 1000 ; N ellipsis ; B 101 -8 898 123 ;
+C 189 ; WX 1280 ; N perthousand ; B 22 -8 1266 698 ;
+C 191 ; WX 540 ; N questiondown ; B 23 -217 510 494 ;
+C 193 ; WX 340 ; N grave ; B 68 571 274 689 ;
+C 194 ; WX 340 ; N acute ; B 68 571 274 689 ;
+C 195 ; WX 420 ; N circumflex ; B 68 567 352 685 ;
+C 196 ; WX 440 ; N tilde ; B 68 572 375 661 ;
+C 197 ; WX 440 ; N macron ; B 68 587 364 635 ;
+C 198 ; WX 460 ; N breve ; B 68 568 396 687 ;
+C 199 ; WX 260 ; N dotaccent ; B 68 564 186 684 ;
+C 200 ; WX 420 ; N dieresis ; B 68 533 349 655 ;
+C 202 ; WX 320 ; N ring ; B 68 546 252 731 ;
+C 203 ; WX 320 ; N cedilla ; B 68 -200 257 0 ;
+C 205 ; WX 380 ; N hungarumlaut ; B 68 538 311 698 ;
+C 206 ; WX 320 ; N ogonek ; B 38 -153 258 0 ;
+C 207 ; WX 420 ; N caron ; B 68 554 352 672 ;
+C 208 ; WX 1000 ; N emdash ; B -15 232 1015 292 ;
+C 225 ; WX 1260 ; N AE ; B -36 0 1250 681 ;
+C 227 ; WX 420 ; N ordfeminine ; B 49 395 393 698 ;
+C 232 ; WX 600 ; N Lslash ; B 31 0 629 681 ;
+C 233 ; WX 800 ; N Oslash ; B 44 -53 758 733 ;
+C 234 ; WX 1240 ; N OE ; B 44 -17 1214 698 ;
+C 235 ; WX 420 ; N ordmasculine ; B 56 394 361 698 ;
+C 241 ; WX 860 ; N ae ; B 35 -8 832 494 ;
+C 245 ; WX 300 ; N dotlessi ; B 20 0 288 484 ;
+C 248 ; WX 320 ; N lslash ; B 20 0 291 717 ;
+C 249 ; WX 560 ; N oslash ; B 37 -40 526 534 ;
+C 250 ; WX 900 ; N oe ; B 37 -8 876 494 ;
+C 251 ; WX 660 ; N germandbls ; B -109 -110 614 698 ;
+C -1 ; WX 340 ; N Idieresis ; B 28 0 309 851 ;
+C -1 ; WX 520 ; N eacute ; B 37 -8 491 689 ;
+C -1 ; WX 580 ; N abreve ; B 35 -8 587 687 ;
+C -1 ; WX 680 ; N uhungarumlaut ; B 20 -8 653 698 ;
+C -1 ; WX 520 ; N ecaron ; B 37 -8 491 672 ;
+C -1 ; WX 640 ; N Ydieresis ; B -30 0 666 851 ;
+C -1 ; WX 600 ; N divide ; B 51 10 555 514 ;
+C -1 ; WX 640 ; N Yacute ; B -30 0 666 866 ;
+C -1 ; WX 680 ; N Acircumflex ; B -37 0 714 862 ;
+C -1 ; WX 580 ; N aacute ; B 35 -8 587 689 ;
+C -1 ; WX 780 ; N Ucircumflex ; B 25 -17 754 862 ;
+C -1 ; WX 540 ; N yacute ; B -23 -236 549 689 ;
+C -1 ; WX 520 ; N scommaaccent ; B 40 -251 487 494 ;
+C -1 ; WX 520 ; N ecircumflex ; B 37 -8 491 685 ;
+C -1 ; WX 780 ; N Uring ; B 25 -17 754 908 ;
+C -1 ; WX 780 ; N Udieresis ; B 25 -17 754 851 ;
+C -1 ; WX 580 ; N aogonek ; B 35 -153 588 494 ;
+C -1 ; WX 780 ; N Uacute ; B 25 -17 754 866 ;
+C -1 ; WX 680 ; N uogonek ; B 20 -153 653 484 ;
+C -1 ; WX 720 ; N Edieresis ; B 31 0 705 851 ;
+C -1 ; WX 800 ; N Dcroat ; B 31 0 752 681 ;
+C -1 ; WX 250 ; N commaaccent ; B 66 -251 185 -50 ;
+C -1 ; WX 740 ; N copyright ; B 24 -17 724 698 ;
+C -1 ; WX 720 ; N Emacron ; B 31 0 705 812 ;
+C -1 ; WX 520 ; N ccaron ; B 37 -8 498 672 ;
+C -1 ; WX 580 ; N aring ; B 35 -8 587 731 ;
+C -1 ; WX 740 ; N Ncommaaccent ; B 26 -251 722 681 ;
+C -1 ; WX 300 ; N lacute ; B 20 0 294 866 ;
+C -1 ; WX 580 ; N agrave ; B 35 -8 587 689 ;
+C -1 ; WX 620 ; N Tcommaaccent ; B -37 -251 656 681 ;
+C -1 ; WX 740 ; N Cacute ; B 44 -17 702 866 ;
+C -1 ; WX 580 ; N atilde ; B 35 -8 587 661 ;
+C -1 ; WX 720 ; N Edotaccent ; B 31 0 705 880 ;
+C -1 ; WX 520 ; N scaron ; B 40 -8 487 672 ;
+C -1 ; WX 520 ; N scedilla ; B 40 -200 487 494 ;
+C -1 ; WX 300 ; N iacute ; B 20 0 294 689 ;
+C -1 ; WX 471 ; N lozenge ; B 10 0 462 728 ;
+C -1 ; WX 720 ; N Rcaron ; B 31 0 757 849 ;
+C -1 ; WX 800 ; N Gcommaaccent ; B 44 -251 778 698 ;
+C -1 ; WX 680 ; N ucircumflex ; B 20 -8 653 685 ;
+C -1 ; WX 580 ; N acircumflex ; B 35 -8 587 685 ;
+C -1 ; WX 680 ; N Amacron ; B -37 0 714 812 ;
+C -1 ; WX 440 ; N rcaron ; B 20 0 447 672 ;
+C -1 ; WX 520 ; N ccedilla ; B 37 -200 498 494 ;
+C -1 ; WX 640 ; N Zdotaccent ; B 10 0 656 880 ;
+C -1 ; WX 620 ; N Thorn ; B 31 0 613 681 ;
+C -1 ; WX 800 ; N Omacron ; B 44 -17 758 812 ;
+C -1 ; WX 720 ; N Racute ; B 31 0 757 866 ;
+C -1 ; WX 660 ; N Sacute ; B 28 -17 634 866 ;
+C -1 ; WX 690 ; N dcaron ; B 37 -8 701 732 ;
+C -1 ; WX 780 ; N Umacron ; B 25 -17 754 812 ;
+C -1 ; WX 680 ; N uring ; B 20 -8 653 731 ;
+C -1 ; WX 372 ; N threesuperior ; B 12 269 360 698 ;
+C -1 ; WX 800 ; N Ograve ; B 44 -17 758 866 ;
+C -1 ; WX 680 ; N Agrave ; B -37 0 714 866 ;
+C -1 ; WX 680 ; N Abreve ; B -37 0 714 864 ;
+C -1 ; WX 600 ; N multiply ; B 51 9 555 513 ;
+C -1 ; WX 680 ; N uacute ; B 20 -8 653 689 ;
+C -1 ; WX 620 ; N Tcaron ; B -37 0 656 849 ;
+C -1 ; WX 476 ; N partialdiff ; B 34 -21 442 707 ;
+C -1 ; WX 540 ; N ydieresis ; B -23 -236 549 674 ;
+C -1 ; WX 740 ; N Nacute ; B 26 0 722 866 ;
+C -1 ; WX 300 ; N icircumflex ; B 8 0 292 685 ;
+C -1 ; WX 720 ; N Ecircumflex ; B 31 0 705 862 ;
+C -1 ; WX 580 ; N adieresis ; B 35 -8 587 674 ;
+C -1 ; WX 520 ; N edieresis ; B 37 -8 491 674 ;
+C -1 ; WX 520 ; N cacute ; B 37 -8 498 689 ;
+C -1 ; WX 660 ; N nacute ; B 20 0 649 689 ;
+C -1 ; WX 680 ; N umacron ; B 20 -8 653 635 ;
+C -1 ; WX 740 ; N Ncaron ; B 26 0 722 849 ;
+C -1 ; WX 340 ; N Iacute ; B 31 0 301 866 ;
+C -1 ; WX 600 ; N plusminus ; B 51 0 555 513 ;
+C -1 ; WX 600 ; N brokenbar ; B 264 -175 342 675 ;
+C -1 ; WX 740 ; N registered ; B 23 -17 723 698 ;
+C -1 ; WX 800 ; N Gbreve ; B 44 -17 778 864 ;
+C -1 ; WX 340 ; N Idotaccent ; B 31 0 301 880 ;
+C -1 ; WX 600 ; N summation ; B 15 -10 586 706 ;
+C -1 ; WX 720 ; N Egrave ; B 31 0 705 866 ;
+C -1 ; WX 440 ; N racute ; B 20 0 447 689 ;
+C -1 ; WX 560 ; N omacron ; B 37 -8 526 635 ;
+C -1 ; WX 640 ; N Zacute ; B 10 0 656 866 ;
+C -1 ; WX 640 ; N Zcaron ; B 10 0 656 849 ;
+C -1 ; WX 549 ; N greaterequal ; B 29 0 526 635 ;
+C -1 ; WX 800 ; N Eth ; B 31 0 752 681 ;
+C -1 ; WX 740 ; N Ccedilla ; B 44 -200 702 698 ;
+C -1 ; WX 300 ; N lcommaaccent ; B 20 -251 286 717 ;
+C -1 ; WX 380 ; N tcaron ; B 20 -8 388 747 ;
+C -1 ; WX 520 ; N eogonek ; B 37 -154 491 494 ;
+C -1 ; WX 780 ; N Uogonek ; B 25 -153 754 681 ;
+C -1 ; WX 680 ; N Aacute ; B -37 0 714 866 ;
+C -1 ; WX 680 ; N Adieresis ; B -37 0 714 851 ;
+C -1 ; WX 520 ; N egrave ; B 37 -8 491 689 ;
+C -1 ; WX 480 ; N zacute ; B 7 0 476 689 ;
+C -1 ; WX 300 ; N iogonek ; B 20 -153 289 654 ;
+C -1 ; WX 800 ; N Oacute ; B 44 -17 758 866 ;
+C -1 ; WX 560 ; N oacute ; B 37 -8 526 689 ;
+C -1 ; WX 580 ; N amacron ; B 35 -8 587 635 ;
+C -1 ; WX 520 ; N sacute ; B 40 -8 487 689 ;
+C -1 ; WX 300 ; N idieresis ; B 8 0 289 674 ;
+C -1 ; WX 800 ; N Ocircumflex ; B 44 -17 758 862 ;
+C -1 ; WX 780 ; N Ugrave ; B 25 -17 754 866 ;
+C -1 ; WX 614 ; N Delta ; B 6 0 608 688 ;
+C -1 ; WX 620 ; N thorn ; B 20 -228 583 717 ;
+C -1 ; WX 372 ; N twosuperior ; B 20 279 367 698 ;
+C -1 ; WX 800 ; N Odieresis ; B 44 -17 758 851 ;
+C -1 ; WX 680 ; N mu ; B 20 -251 653 484 ;
+C -1 ; WX 300 ; N igrave ; B 20 0 288 689 ;
+C -1 ; WX 560 ; N ohungarumlaut ; B 37 -8 526 698 ;
+C -1 ; WX 720 ; N Eogonek ; B 31 -153 705 681 ;
+C -1 ; WX 620 ; N dcroat ; B 37 -8 612 717 ;
+C -1 ; WX 930 ; N threequarters ; B 52 0 889 691 ;
+C -1 ; WX 660 ; N Scedilla ; B 28 -200 634 698 ;
+C -1 ; WX 372 ; N lcaron ; B 20 0 383 732 ;
+C -1 ; WX 720 ; N Kcommaaccent ; B 31 -251 750 681 ;
+C -1 ; WX 600 ; N Lacute ; B 31 0 629 866 ;
+C -1 ; WX 980 ; N trademark ; B 34 277 930 681 ;
+C -1 ; WX 520 ; N edotaccent ; B 37 -8 491 703 ;
+C -1 ; WX 340 ; N Igrave ; B 31 0 301 866 ;
+C -1 ; WX 340 ; N Imacron ; B 18 0 314 812 ;
+C -1 ; WX 600 ; N Lcaron ; B 31 0 629 707 ;
+C -1 ; WX 930 ; N onehalf ; B 80 0 885 681 ;
+C -1 ; WX 549 ; N lessequal ; B 29 0 526 635 ;
+C -1 ; WX 560 ; N ocircumflex ; B 37 -8 526 685 ;
+C -1 ; WX 660 ; N ntilde ; B 20 0 649 661 ;
+C -1 ; WX 780 ; N Uhungarumlaut ; B 25 -17 754 875 ;
+C -1 ; WX 720 ; N Eacute ; B 31 0 705 866 ;
+C -1 ; WX 520 ; N emacron ; B 37 -8 491 635 ;
+C -1 ; WX 540 ; N gbreve ; B 17 -243 542 687 ;
+C -1 ; WX 930 ; N onequarter ; B 80 0 869 681 ;
+C -1 ; WX 660 ; N Scaron ; B 28 -17 634 849 ;
+C -1 ; WX 660 ; N Scommaaccent ; B 28 -251 634 698 ;
+C -1 ; WX 800 ; N Ohungarumlaut ; B 44 -17 758 875 ;
+C -1 ; WX 400 ; N degree ; B 50 398 350 698 ;
+C -1 ; WX 560 ; N ograve ; B 37 -8 526 689 ;
+C -1 ; WX 740 ; N Ccaron ; B 44 -17 702 849 ;
+C -1 ; WX 680 ; N ugrave ; B 20 -8 653 689 ;
+C -1 ; WX 453 ; N radical ; B -4 -80 458 762 ;
+C -1 ; WX 800 ; N Dcaron ; B 31 0 752 849 ;
+C -1 ; WX 440 ; N rcommaaccent ; B 20 -251 447 494 ;
+C -1 ; WX 740 ; N Ntilde ; B 26 0 722 838 ;
+C -1 ; WX 560 ; N otilde ; B 37 -8 526 661 ;
+C -1 ; WX 720 ; N Rcommaaccent ; B 31 -251 757 681 ;
+C -1 ; WX 600 ; N Lcommaaccent ; B 31 -251 629 681 ;
+C -1 ; WX 680 ; N Atilde ; B -37 0 714 838 ;
+C -1 ; WX 680 ; N Aogonek ; B -37 -153 718 681 ;
+C -1 ; WX 680 ; N Aring ; B -37 0 714 908 ;
+C -1 ; WX 800 ; N Otilde ; B 44 -17 758 838 ;
+C -1 ; WX 480 ; N zdotaccent ; B 7 0 476 703 ;
+C -1 ; WX 720 ; N Ecaron ; B 31 0 705 849 ;
+C -1 ; WX 340 ; N Iogonek ; B 31 -153 302 681 ;
+C -1 ; WX 620 ; N kcommaaccent ; B 20 -251 628 717 ;
+C -1 ; WX 600 ; N minus ; B 51 224 555 300 ;
+C -1 ; WX 340 ; N Icircumflex ; B 28 0 312 862 ;
+C -1 ; WX 660 ; N ncaron ; B 20 0 649 672 ;
+C -1 ; WX 380 ; N tcommaaccent ; B 20 -251 388 667 ;
+C -1 ; WX 600 ; N logicalnot ; B 51 128 555 398 ;
+C -1 ; WX 560 ; N odieresis ; B 37 -8 526 674 ;
+C -1 ; WX 680 ; N udieresis ; B 20 -8 653 674 ;
+C -1 ; WX 549 ; N notequal ; B 15 -16 540 529 ;
+C -1 ; WX 540 ; N gcommaaccent ; B 17 -243 542 765 ;
+C -1 ; WX 560 ; N eth ; B 37 -8 526 734 ;
+C -1 ; WX 480 ; N zcaron ; B 7 0 476 672 ;
+C -1 ; WX 660 ; N ncommaaccent ; B 20 -251 649 494 ;
+C -1 ; WX 372 ; N onesuperior ; B 80 279 302 688 ;
+C -1 ; WX 300 ; N imacron ; B -2 0 294 635 ;
+EndCharMetrics
+StartKernData
+StartKernPairs 882
+KPX A T 1
+KPX A Tcaron 1
+KPX A Tcommaaccent 1
+KPX A V -56
+KPX A W -40
+KPX A Y -35
+KPX A Yacute -35
+KPX A Ydieresis -35
+KPX A v 7
+KPX A w 4
+KPX A y 32
+KPX A yacute 32
+KPX A ydieresis 32
+KPX Aacute T 1
+KPX Aacute Tcaron 1
+KPX Aacute Tcommaaccent 1
+KPX Aacute V -56
+KPX Aacute W -40
+KPX Aacute Y -35
+KPX Aacute Yacute -35
+KPX Aacute Ydieresis -35
+KPX Aacute v 7
+KPX Aacute w 4
+KPX Aacute y 32
+KPX Aacute yacute 32
+KPX Aacute ydieresis 32
+KPX Abreve T 1
+KPX Abreve Tcaron 1
+KPX Abreve Tcommaaccent 1
+KPX Abreve V -56
+KPX Abreve W -40
+KPX Abreve Y -35
+KPX Abreve Yacute -35
+KPX Abreve Ydieresis -35
+KPX Abreve v 7
+KPX Abreve w 4
+KPX Abreve y 32
+KPX Abreve yacute 32
+KPX Abreve ydieresis 32
+KPX Acircumflex T 1
+KPX Acircumflex Tcaron 1
+KPX Acircumflex Tcommaaccent 1
+KPX Acircumflex V -56
+KPX Acircumflex W -40
+KPX Acircumflex Y -35
+KPX Acircumflex Yacute -35
+KPX Acircumflex Ydieresis -35
+KPX Acircumflex v 7
+KPX Acircumflex w 4
+KPX Acircumflex y 32
+KPX Acircumflex yacute 32
+KPX Acircumflex ydieresis 32
+KPX Adieresis T 1
+KPX Adieresis Tcaron 1
+KPX Adieresis Tcommaaccent 1
+KPX Adieresis V -56
+KPX Adieresis W -40
+KPX Adieresis Y -35
+KPX Adieresis Yacute -35
+KPX Adieresis Ydieresis -35
+KPX Adieresis v 7
+KPX Adieresis w 4
+KPX Adieresis y 32
+KPX Adieresis yacute 32
+KPX Adieresis ydieresis 32
+KPX Agrave T 1
+KPX Agrave Tcaron 1
+KPX Agrave Tcommaaccent 1
+KPX Agrave V -56
+KPX Agrave W -40
+KPX Agrave Y -35
+KPX Agrave Yacute -35
+KPX Agrave Ydieresis -35
+KPX Agrave v 7
+KPX Agrave w 4
+KPX Agrave y 32
+KPX Agrave yacute 32
+KPX Agrave ydieresis 32
+KPX Amacron T 1
+KPX Amacron Tcaron 1
+KPX Amacron Tcommaaccent 1
+KPX Amacron V -56
+KPX Amacron W -40
+KPX Amacron Y -35
+KPX Amacron Yacute -35
+KPX Amacron Ydieresis -35
+KPX Amacron v 7
+KPX Amacron w 4
+KPX Amacron y 32
+KPX Amacron yacute 32
+KPX Amacron ydieresis 32
+KPX Aogonek T 1
+KPX Aogonek Tcaron 1
+KPX Aogonek Tcommaaccent 1
+KPX Aogonek V -56
+KPX Aogonek W -40
+KPX Aogonek Y -35
+KPX Aogonek Yacute -35
+KPX Aogonek Ydieresis -35
+KPX Aogonek v 7
+KPX Aogonek w 4
+KPX Aogonek y 32
+KPX Aogonek yacute 32
+KPX Aogonek ydieresis 32
+KPX Aring T 1
+KPX Aring Tcaron 1
+KPX Aring Tcommaaccent 1
+KPX Aring V -56
+KPX Aring W -40
+KPX Aring Y -35
+KPX Aring Yacute -35
+KPX Aring Ydieresis -35
+KPX Aring v 7
+KPX Aring w 4
+KPX Aring y 32
+KPX Aring yacute 32
+KPX Aring ydieresis 32
+KPX Atilde T 1
+KPX Atilde Tcaron 1
+KPX Atilde Tcommaaccent 1
+KPX Atilde V -56
+KPX Atilde W -40
+KPX Atilde Y -35
+KPX Atilde Yacute -35
+KPX Atilde Ydieresis -35
+KPX Atilde v 7
+KPX Atilde w 4
+KPX Atilde y 32
+KPX Atilde yacute 32
+KPX Atilde ydieresis 32
+KPX F A -21
+KPX F Aacute -21
+KPX F Abreve -21
+KPX F Acircumflex -21
+KPX F Adieresis -21
+KPX F Agrave -21
+KPX F Amacron -21
+KPX F Aogonek -21
+KPX F Aring -21
+KPX F Atilde -21
+KPX F comma -41
+KPX F period -46
+KPX L T 28
+KPX L Tcaron 28
+KPX L Tcommaaccent 28
+KPX L V -4
+KPX L W 1
+KPX L Y 13
+KPX L Yacute 13
+KPX L Ydieresis 13
+KPX L y 79
+KPX L yacute 79
+KPX L ydieresis 79
+KPX Lacute T 28
+KPX Lacute Tcaron 28
+KPX Lacute Tcommaaccent 28
+KPX Lacute V -4
+KPX Lacute W 1
+KPX Lacute Y 13
+KPX Lacute Yacute 13
+KPX Lacute Ydieresis 13
+KPX Lacute y 79
+KPX Lacute yacute 79
+KPX Lacute ydieresis 79
+KPX Lcaron T 28
+KPX Lcaron Tcaron 28
+KPX Lcaron Tcommaaccent 28
+KPX Lcaron V -4
+KPX Lcaron W 1
+KPX Lcaron Y 13
+KPX Lcaron Yacute 13
+KPX Lcaron Ydieresis 13
+KPX Lcaron y 79
+KPX Lcaron yacute 79
+KPX Lcaron ydieresis 79
+KPX Lcommaaccent T 28
+KPX Lcommaaccent Tcaron 28
+KPX Lcommaaccent Tcommaaccent 28
+KPX Lcommaaccent V -4
+KPX Lcommaaccent W 1
+KPX Lcommaaccent Y 13
+KPX Lcommaaccent Yacute 13
+KPX Lcommaaccent Ydieresis 13
+KPX Lcommaaccent y 79
+KPX Lcommaaccent yacute 79
+KPX Lcommaaccent ydieresis 79
+KPX Lslash T 28
+KPX Lslash Tcaron 28
+KPX Lslash Tcommaaccent 28
+KPX Lslash V -4
+KPX Lslash W 1
+KPX Lslash Y 13
+KPX Lslash Yacute 13
+KPX Lslash Ydieresis 13
+KPX Lslash y 79
+KPX Lslash yacute 79
+KPX Lslash ydieresis 79
+KPX P A -8
+KPX P Aacute -8
+KPX P Abreve -8
+KPX P Acircumflex -8
+KPX P Adieresis -8
+KPX P Agrave -8
+KPX P Amacron -8
+KPX P Aogonek -8
+KPX P Aring -8
+KPX P Atilde -8
+KPX P comma -55
+KPX P period -60
+KPX R T 71
+KPX R Tcaron 71
+KPX R Tcommaaccent 71
+KPX R V 8
+KPX R W 13
+KPX R Y 26
+KPX R Yacute 26
+KPX R Ydieresis 26
+KPX R y 59
+KPX R yacute 59
+KPX R ydieresis 59
+KPX Racute T 71
+KPX Racute Tcaron 71
+KPX Racute Tcommaaccent 71
+KPX Racute V 8
+KPX Racute W 13
+KPX Racute Y 26
+KPX Racute Yacute 26
+KPX Racute Ydieresis 26
+KPX Racute y 59
+KPX Racute yacute 59
+KPX Racute ydieresis 59
+KPX Rcaron T 71
+KPX Rcaron Tcaron 71
+KPX Rcaron Tcommaaccent 71
+KPX Rcaron V 8
+KPX Rcaron W 13
+KPX Rcaron Y 26
+KPX Rcaron Yacute 26
+KPX Rcaron Ydieresis 26
+KPX Rcaron y 59
+KPX Rcaron yacute 59
+KPX Rcaron ydieresis 59
+KPX Rcommaaccent T 71
+KPX Rcommaaccent Tcaron 71
+KPX Rcommaaccent Tcommaaccent 71
+KPX Rcommaaccent V 8
+KPX Rcommaaccent W 13
+KPX Rcommaaccent Y 26
+KPX Rcommaaccent Yacute 26
+KPX Rcommaaccent Ydieresis 26
+KPX Rcommaaccent y 59
+KPX Rcommaaccent yacute 59
+KPX Rcommaaccent ydieresis 59
+KPX T A 1
+KPX T Aacute 1
+KPX T Abreve 1
+KPX T Acircumflex 1
+KPX T Adieresis 1
+KPX T Agrave 1
+KPX T Amacron 1
+KPX T Aogonek 1
+KPX T Aring 1
+KPX T Atilde 1
+KPX T a 17
+KPX T aacute 17
+KPX T abreve 17
+KPX T acircumflex 17
+KPX T adieresis 17
+KPX T agrave 17
+KPX T amacron 17
+KPX T aogonek 17
+KPX T aring 17
+KPX T atilde 17
+KPX T c 14
+KPX T cacute 14
+KPX T ccaron 14
+KPX T ccedilla 14
+KPX T comma -28
+KPX T e 13
+KPX T eacute 13
+KPX T ecaron 13
+KPX T ecircumflex 13
+KPX T edieresis 13
+KPX T edotaccent 13
+KPX T egrave 13
+KPX T emacron 13
+KPX T eogonek 13
+KPX T hyphen 90
+KPX T i 42
+KPX T iacute 42
+KPX T icircumflex 42
+KPX T idieresis 42
+KPX T igrave 42
+KPX T imacron 42
+KPX T iogonek 42
+KPX T o 15
+KPX T oacute 15
+KPX T ocircumflex 15
+KPX T odieresis 15
+KPX T ograve 15
+KPX T ohungarumlaut 15
+KPX T omacron 15
+KPX T oslash 15
+KPX T otilde 15
+KPX T period -33
+KPX T r 38
+KPX T racute 38
+KPX T rcaron 38
+KPX T rcommaaccent 38
+KPX T s 16
+KPX T sacute 16
+KPX T scaron 16
+KPX T scedilla 16
+KPX T scommaaccent 16
+KPX Tcaron A 1
+KPX Tcaron Aacute 1
+KPX Tcaron Abreve 1
+KPX Tcaron Acircumflex 1
+KPX Tcaron Adieresis 1
+KPX Tcaron Agrave 1
+KPX Tcaron Amacron 1
+KPX Tcaron Aogonek 1
+KPX Tcaron Aring 1
+KPX Tcaron Atilde 1
+KPX Tcaron a 17
+KPX Tcaron aacute 17
+KPX Tcaron abreve 17
+KPX Tcaron acircumflex 17
+KPX Tcaron adieresis 17
+KPX Tcaron agrave 17
+KPX Tcaron amacron 17
+KPX Tcaron aogonek 17
+KPX Tcaron aring 17
+KPX Tcaron atilde 17
+KPX Tcaron c 14
+KPX Tcaron cacute 14
+KPX Tcaron ccaron 14
+KPX Tcaron ccedilla 14
+KPX Tcaron comma -28
+KPX Tcaron e 13
+KPX Tcaron eacute 13
+KPX Tcaron ecaron 13
+KPX Tcaron ecircumflex 13
+KPX Tcaron edieresis 13
+KPX Tcaron edotaccent 13
+KPX Tcaron egrave 13
+KPX Tcaron emacron 13
+KPX Tcaron eogonek 13
+KPX Tcaron hyphen 90
+KPX Tcaron i 42
+KPX Tcaron iacute 42
+KPX Tcaron icircumflex 42
+KPX Tcaron idieresis 42
+KPX Tcaron igrave 42
+KPX Tcaron imacron 42
+KPX Tcaron iogonek 42
+KPX Tcaron o 15
+KPX Tcaron oacute 15
+KPX Tcaron ocircumflex 15
+KPX Tcaron odieresis 15
+KPX Tcaron ograve 15
+KPX Tcaron ohungarumlaut 15
+KPX Tcaron omacron 15
+KPX Tcaron oslash 15
+KPX Tcaron otilde 15
+KPX Tcaron period -33
+KPX Tcaron r 38
+KPX Tcaron racute 38
+KPX Tcaron rcaron 38
+KPX Tcaron rcommaaccent 38
+KPX Tcaron s 16
+KPX Tcaron sacute 16
+KPX Tcaron scaron 16
+KPX Tcaron scedilla 16
+KPX Tcaron scommaaccent 16
+KPX Tcommaaccent A 1
+KPX Tcommaaccent Aacute 1
+KPX Tcommaaccent Abreve 1
+KPX Tcommaaccent Acircumflex 1
+KPX Tcommaaccent Adieresis 1
+KPX Tcommaaccent Agrave 1
+KPX Tcommaaccent Amacron 1
+KPX Tcommaaccent Aogonek 1
+KPX Tcommaaccent Aring 1
+KPX Tcommaaccent Atilde 1
+KPX Tcommaaccent a 17
+KPX Tcommaaccent aacute 17
+KPX Tcommaaccent abreve 17
+KPX Tcommaaccent acircumflex 17
+KPX Tcommaaccent adieresis 17
+KPX Tcommaaccent agrave 17
+KPX Tcommaaccent amacron 17
+KPX Tcommaaccent aogonek 17
+KPX Tcommaaccent aring 17
+KPX Tcommaaccent atilde 17
+KPX Tcommaaccent c 14
+KPX Tcommaaccent cacute 14
+KPX Tcommaaccent ccaron 14
+KPX Tcommaaccent ccedilla 14
+KPX Tcommaaccent comma -28
+KPX Tcommaaccent e 13
+KPX Tcommaaccent eacute 13
+KPX Tcommaaccent ecaron 13
+KPX Tcommaaccent ecircumflex 13
+KPX Tcommaaccent edieresis 13
+KPX Tcommaaccent edotaccent 13
+KPX Tcommaaccent egrave 13
+KPX Tcommaaccent emacron 13
+KPX Tcommaaccent eogonek 13
+KPX Tcommaaccent hyphen 90
+KPX Tcommaaccent i 42
+KPX Tcommaaccent iacute 42
+KPX Tcommaaccent icircumflex 42
+KPX Tcommaaccent idieresis 42
+KPX Tcommaaccent igrave 42
+KPX Tcommaaccent imacron 42
+KPX Tcommaaccent iogonek 42
+KPX Tcommaaccent o 15
+KPX Tcommaaccent oacute 15
+KPX Tcommaaccent ocircumflex 15
+KPX Tcommaaccent odieresis 15
+KPX Tcommaaccent ograve 15
+KPX Tcommaaccent ohungarumlaut 15
+KPX Tcommaaccent omacron 15
+KPX Tcommaaccent oslash 15
+KPX Tcommaaccent otilde 15
+KPX Tcommaaccent period -33
+KPX Tcommaaccent r 38
+KPX Tcommaaccent racute 38
+KPX Tcommaaccent rcaron 38
+KPX Tcommaaccent rcommaaccent 38
+KPX Tcommaaccent s 16
+KPX Tcommaaccent sacute 16
+KPX Tcommaaccent scaron 16
+KPX Tcommaaccent scedilla 16
+KPX Tcommaaccent scommaaccent 16
+KPX V A -66
+KPX V Aacute -66
+KPX V Abreve -66
+KPX V Acircumflex -66
+KPX V Adieresis -66
+KPX V Agrave -66
+KPX V Amacron -66
+KPX V Aogonek -66
+KPX V Aring -66
+KPX V Atilde -66
+KPX V a -69
+KPX V aacute -69
+KPX V abreve -69
+KPX V acircumflex -69
+KPX V adieresis -69
+KPX V agrave -69
+KPX V amacron -69
+KPX V aogonek -69
+KPX V aring -69
+KPX V atilde -69
+KPX V comma -34
+KPX V e -72
+KPX V eacute -72
+KPX V ecaron -72
+KPX V ecircumflex -72
+KPX V edieresis -72
+KPX V edotaccent -72
+KPX V egrave -72
+KPX V emacron -72
+KPX V eogonek -72
+KPX V hyphen 11
+KPX V i -20
+KPX V iacute -20
+KPX V iogonek -20
+KPX V o -71
+KPX V oacute -71
+KPX V ocircumflex -71
+KPX V odieresis -71
+KPX V ograve -71
+KPX V ohungarumlaut -71
+KPX V omacron -71
+KPX V oslash -71
+KPX V otilde -71
+KPX V period -40
+KPX V r -41
+KPX V racute -41
+KPX V rcaron -41
+KPX V rcommaaccent -41
+KPX V u -38
+KPX V uacute -38
+KPX V ucircumflex -38
+KPX V udieresis -38
+KPX V ugrave -38
+KPX V uhungarumlaut -38
+KPX V umacron -38
+KPX V uogonek -38
+KPX V uring -38
+KPX V y 15
+KPX V yacute 15
+KPX V ydieresis 15
+KPX W A -64
+KPX W Aacute -64
+KPX W Abreve -64
+KPX W Acircumflex -64
+KPX W Adieresis -64
+KPX W Agrave -64
+KPX W Amacron -64
+KPX W Aogonek -64
+KPX W Aring -64
+KPX W Atilde -64
+KPX W a -66
+KPX W aacute -66
+KPX W abreve -66
+KPX W acircumflex -66
+KPX W adieresis -66
+KPX W agrave -66
+KPX W amacron -66
+KPX W aogonek -66
+KPX W aring -66
+KPX W atilde -66
+KPX W comma -34
+KPX W e -69
+KPX W eacute -69
+KPX W ecaron -69
+KPX W ecircumflex -69
+KPX W edieresis -69
+KPX W edotaccent -69
+KPX W egrave -69
+KPX W emacron -69
+KPX W eogonek -69
+KPX W hyphen 11
+KPX W i -20
+KPX W iacute -20
+KPX W iogonek -20
+KPX W o -68
+KPX W oacute -68
+KPX W ocircumflex -68
+KPX W odieresis -68
+KPX W ograve -68
+KPX W ohungarumlaut -68
+KPX W omacron -68
+KPX W oslash -68
+KPX W otilde -68
+KPX W period -40
+KPX W r -41
+KPX W racute -41
+KPX W rcaron -41
+KPX W rcommaaccent -41
+KPX W u -38
+KPX W uacute -38
+KPX W ucircumflex -38
+KPX W udieresis -38
+KPX W ugrave -38
+KPX W uhungarumlaut -38
+KPX W umacron -38
+KPX W uogonek -38
+KPX W uring -38
+KPX W y 15
+KPX W yacute 15
+KPX W ydieresis 15
+KPX Y A -53
+KPX Y Aacute -53
+KPX Y Abreve -53
+KPX Y Acircumflex -53
+KPX Y Adieresis -53
+KPX Y Agrave -53
+KPX Y Amacron -53
+KPX Y Aogonek -53
+KPX Y Aring -53
+KPX Y Atilde -53
+KPX Y a -54
+KPX Y aacute -54
+KPX Y abreve -54
+KPX Y acircumflex -54
+KPX Y adieresis -54
+KPX Y agrave -54
+KPX Y amacron -54
+KPX Y aogonek -54
+KPX Y aring -54
+KPX Y atilde -54
+KPX Y comma -34
+KPX Y e -58
+KPX Y eacute -58
+KPX Y ecaron -58
+KPX Y ecircumflex -58
+KPX Y edieresis -58
+KPX Y edotaccent -58
+KPX Y egrave -58
+KPX Y emacron -58
+KPX Y eogonek -58
+KPX Y hyphen 11
+KPX Y i -37
+KPX Y iacute -37
+KPX Y icircumflex -37
+KPX Y iogonek -37
+KPX Y o -57
+KPX Y oacute -57
+KPX Y ocircumflex -57
+KPX Y odieresis -57
+KPX Y ograve -57
+KPX Y ohungarumlaut -57
+KPX Y omacron -57
+KPX Y oslash -57
+KPX Y otilde -57
+KPX Y p -31
+KPX Y period -40
+KPX Y q -55
+KPX Y u -38
+KPX Y uacute -38
+KPX Y ucircumflex -38
+KPX Y udieresis -38
+KPX Y ugrave -38
+KPX Y uhungarumlaut -38
+KPX Y umacron -38
+KPX Y uogonek -38
+KPX Y uring -38
+KPX Y v 15
+KPX Yacute A -53
+KPX Yacute Aacute -53
+KPX Yacute Abreve -53
+KPX Yacute Acircumflex -53
+KPX Yacute Adieresis -53
+KPX Yacute Agrave -53
+KPX Yacute Amacron -53
+KPX Yacute Aogonek -53
+KPX Yacute Aring -53
+KPX Yacute Atilde -53
+KPX Yacute a -54
+KPX Yacute aacute -54
+KPX Yacute abreve -54
+KPX Yacute acircumflex -54
+KPX Yacute adieresis -54
+KPX Yacute agrave -54
+KPX Yacute amacron -54
+KPX Yacute aogonek -54
+KPX Yacute aring -54
+KPX Yacute atilde -54
+KPX Yacute comma -34
+KPX Yacute e -58
+KPX Yacute eacute -58
+KPX Yacute ecaron -58
+KPX Yacute ecircumflex -58
+KPX Yacute edieresis -58
+KPX Yacute edotaccent -58
+KPX Yacute egrave -58
+KPX Yacute emacron -58
+KPX Yacute eogonek -58
+KPX Yacute hyphen 11
+KPX Yacute i -37
+KPX Yacute iacute -37
+KPX Yacute iogonek -37
+KPX Yacute o -57
+KPX Yacute oacute -57
+KPX Yacute ocircumflex -57
+KPX Yacute odieresis -57
+KPX Yacute ograve -57
+KPX Yacute ohungarumlaut -57
+KPX Yacute omacron -57
+KPX Yacute oslash -57
+KPX Yacute otilde -57
+KPX Yacute p -31
+KPX Yacute period -40
+KPX Yacute q -55
+KPX Yacute u -38
+KPX Yacute uacute -38
+KPX Yacute ucircumflex -38
+KPX Yacute udieresis -38
+KPX Yacute ugrave -38
+KPX Yacute uhungarumlaut -38
+KPX Yacute umacron -38
+KPX Yacute uogonek -38
+KPX Yacute uring -38
+KPX Yacute v 15
+KPX Ydieresis A -53
+KPX Ydieresis Aacute -53
+KPX Ydieresis Abreve -53
+KPX Ydieresis Acircumflex -53
+KPX Ydieresis Adieresis -53
+KPX Ydieresis Agrave -53
+KPX Ydieresis Amacron -53
+KPX Ydieresis Aogonek -53
+KPX Ydieresis Aring -53
+KPX Ydieresis Atilde -53
+KPX Ydieresis a -54
+KPX Ydieresis aacute -54
+KPX Ydieresis abreve -54
+KPX Ydieresis acircumflex -54
+KPX Ydieresis adieresis -54
+KPX Ydieresis agrave -54
+KPX Ydieresis amacron -54
+KPX Ydieresis aogonek -54
+KPX Ydieresis aring -54
+KPX Ydieresis atilde -54
+KPX Ydieresis comma -34
+KPX Ydieresis e -58
+KPX Ydieresis eacute -58
+KPX Ydieresis ecaron -58
+KPX Ydieresis ecircumflex -58
+KPX Ydieresis edieresis -58
+KPX Ydieresis edotaccent -58
+KPX Ydieresis egrave -58
+KPX Ydieresis emacron -58
+KPX Ydieresis eogonek -58
+KPX Ydieresis hyphen 11
+KPX Ydieresis i -37
+KPX Ydieresis iacute -37
+KPX Ydieresis iogonek -37
+KPX Ydieresis o -57
+KPX Ydieresis oacute -57
+KPX Ydieresis ocircumflex -57
+KPX Ydieresis odieresis -57
+KPX Ydieresis ograve -57
+KPX Ydieresis ohungarumlaut -57
+KPX Ydieresis omacron -57
+KPX Ydieresis oslash -57
+KPX Ydieresis otilde -57
+KPX Ydieresis p -31
+KPX Ydieresis period -40
+KPX Ydieresis q -55
+KPX Ydieresis u -38
+KPX Ydieresis uacute -38
+KPX Ydieresis ucircumflex -38
+KPX Ydieresis udieresis -38
+KPX Ydieresis ugrave -38
+KPX Ydieresis uhungarumlaut -38
+KPX Ydieresis umacron -38
+KPX Ydieresis uogonek -38
+KPX Ydieresis uring -38
+KPX Ydieresis v 15
+KPX f f 29
+KPX r c 7
+KPX r cacute 7
+KPX r ccaron 7
+KPX r ccedilla 7
+KPX r comma -58
+KPX r d 7
+KPX r dcroat 7
+KPX r e 7
+KPX r eacute 7
+KPX r ecaron 7
+KPX r ecircumflex 7
+KPX r edieresis 7
+KPX r edotaccent 7
+KPX r egrave 7
+KPX r emacron 7
+KPX r eogonek 7
+KPX r f 33
+KPX r g -4
+KPX r gbreve -4
+KPX r gcommaaccent -4
+KPX r h -21
+KPX r hyphen 70
+KPX r m 31
+KPX r n 31
+KPX r nacute 31
+KPX r ncaron 31
+KPX r ncommaaccent 31
+KPX r ntilde 31
+KPX r o 8
+KPX r oacute 8
+KPX r ocircumflex 8
+KPX r odieresis 8
+KPX r ograve 8
+KPX r ohungarumlaut 8
+KPX r omacron 8
+KPX r oslash 8
+KPX r otilde 8
+KPX r period -64
+KPX r q 9
+KPX racute c 7
+KPX racute cacute 7
+KPX racute ccaron 7
+KPX racute ccedilla 7
+KPX racute comma -58
+KPX racute d 7
+KPX racute dcroat 7
+KPX racute e 7
+KPX racute eacute 7
+KPX racute ecaron 7
+KPX racute ecircumflex 7
+KPX racute edieresis 7
+KPX racute edotaccent 7
+KPX racute egrave 7
+KPX racute emacron 7
+KPX racute eogonek 7
+KPX racute f 33
+KPX racute g -4
+KPX racute gbreve -4
+KPX racute gcommaaccent -4
+KPX racute h -21
+KPX racute hyphen 70
+KPX racute m 31
+KPX racute n 31
+KPX racute nacute 31
+KPX racute ncaron 31
+KPX racute ncommaaccent 31
+KPX racute ntilde 31
+KPX racute o 8
+KPX racute oacute 8
+KPX racute ocircumflex 8
+KPX racute odieresis 8
+KPX racute ograve 8
+KPX racute ohungarumlaut 8
+KPX racute omacron 8
+KPX racute oslash 8
+KPX racute otilde 8
+KPX racute period -64
+KPX racute q 9
+KPX rcaron c 7
+KPX rcaron cacute 7
+KPX rcaron ccaron 7
+KPX rcaron ccedilla 7
+KPX rcaron comma -58
+KPX rcaron d 7
+KPX rcaron dcroat 7
+KPX rcaron e 7
+KPX rcaron eacute 7
+KPX rcaron ecaron 7
+KPX rcaron ecircumflex 7
+KPX rcaron edieresis 7
+KPX rcaron edotaccent 7
+KPX rcaron egrave 7
+KPX rcaron emacron 7
+KPX rcaron eogonek 7
+KPX rcaron f 33
+KPX rcaron g -4
+KPX rcaron gbreve -4
+KPX rcaron gcommaaccent -4
+KPX rcaron h -21
+KPX rcaron hyphen 70
+KPX rcaron m 31
+KPX rcaron n 31
+KPX rcaron nacute 31
+KPX rcaron ncaron 31
+KPX rcaron ncommaaccent 31
+KPX rcaron ntilde 31
+KPX rcaron o 8
+KPX rcaron oacute 8
+KPX rcaron ocircumflex 8
+KPX rcaron odieresis 8
+KPX rcaron ograve 8
+KPX rcaron ohungarumlaut 8
+KPX rcaron omacron 8
+KPX rcaron oslash 8
+KPX rcaron otilde 8
+KPX rcaron period -64
+KPX rcaron q 9
+KPX rcommaaccent c 7
+KPX rcommaaccent cacute 7
+KPX rcommaaccent ccaron 7
+KPX rcommaaccent ccedilla 7
+KPX rcommaaccent comma -58
+KPX rcommaaccent d 7
+KPX rcommaaccent dcroat 7
+KPX rcommaaccent e 7
+KPX rcommaaccent eacute 7
+KPX rcommaaccent ecaron 7
+KPX rcommaaccent ecircumflex 7
+KPX rcommaaccent edieresis 7
+KPX rcommaaccent edotaccent 7
+KPX rcommaaccent egrave 7
+KPX rcommaaccent emacron 7
+KPX rcommaaccent eogonek 7
+KPX rcommaaccent f 33
+KPX rcommaaccent g -4
+KPX rcommaaccent gbreve -4
+KPX rcommaaccent gcommaaccent -4
+KPX rcommaaccent h -21
+KPX rcommaaccent hyphen 70
+KPX rcommaaccent m 31
+KPX rcommaaccent n 31
+KPX rcommaaccent nacute 31
+KPX rcommaaccent ncaron 31
+KPX rcommaaccent ncommaaccent 31
+KPX rcommaaccent ntilde 31
+KPX rcommaaccent o 8
+KPX rcommaaccent oacute 8
+KPX rcommaaccent ocircumflex 8
+KPX rcommaaccent odieresis 8
+KPX rcommaaccent ograve 8
+KPX rcommaaccent ohungarumlaut 8
+KPX rcommaaccent omacron 8
+KPX rcommaaccent oslash 8
+KPX rcommaaccent otilde 8
+KPX rcommaaccent period -64
+KPX rcommaaccent q 9
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/src/fonts/Adobe-Core35_AFMs-314/ITCBookman-LightItalic.afm b/src/fonts/Adobe-Core35_AFMs-314/ITCBookman-LightItalic.afm
new file mode 100644
index 0000000..0d3c3b8
--- /dev/null
+++ b/src/fonts/Adobe-Core35_AFMs-314/ITCBookman-LightItalic.afm
@@ -0,0 +1,1172 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1985, 1987, 1989, 1992, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Mon Jun 23 16:36:46 1997
+Comment UniqueID 43078
+Comment VMusage 44679 55704
+FontName Bookman-LightItalic
+FullName ITC Bookman Light Italic
+FamilyName ITC Bookman
+Weight Light
+ItalicAngle -10
+IsFixedPitch false
+FontBBox -228 -250 1269 883
+UnderlinePosition -100
+UnderlineThickness 50
+Version 002.000
+Notice Copyright (c) 1985, 1987, 1989, 1992, 1997 Adobe Systems Incorporated. All Rights Reserved.ITC Bookman is a registered trademark of International Typeface Corporation.
+EncodingScheme AdobeStandardEncoding
+CapHeight 681
+XHeight 494
+Ascender 717
+Descender -228
+StdHW 42
+StdVW 96
+StartCharMetrics 314
+C 32 ; WX 300 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 320 ; N exclam ; B 103 -8 342 698 ;
+C 34 ; WX 360 ; N quotedbl ; B 107 468 402 699 ;
+C 35 ; WX 620 ; N numbersign ; B 107 0 598 681 ;
+C 36 ; WX 620 ; N dollar ; B 78 -85 619 762 ;
+C 37 ; WX 800 ; N percent ; B 56 -8 811 691 ;
+C 38 ; WX 820 ; N ampersand ; B 65 -18 848 698 ;
+C 39 ; WX 280 ; N quoteright ; B 148 470 288 698 ;
+C 40 ; WX 280 ; N parenleft ; B 96 -146 383 727 ;
+C 41 ; WX 280 ; N parenright ; B -8 -146 279 727 ;
+C 42 ; WX 440 ; N asterisk ; B 139 324 505 698 ;
+C 43 ; WX 600 ; N plus ; B 91 43 595 548 ;
+C 44 ; WX 300 ; N comma ; B 88 -115 227 112 ;
+C 45 ; WX 320 ; N hyphen ; B 78 269 336 325 ;
+C 46 ; WX 300 ; N period ; B 96 -8 231 127 ;
+C 47 ; WX 600 ; N slash ; B 104 -149 562 717 ;
+C 48 ; WX 620 ; N zero ; B 86 -17 646 698 ;
+C 49 ; WX 620 ; N one ; B 154 0 500 681 ;
+C 50 ; WX 620 ; N two ; B 66 0 636 698 ;
+C 51 ; WX 620 ; N three ; B 55 -17 622 698 ;
+C 52 ; WX 620 ; N four ; B 69 0 634 681 ;
+C 53 ; WX 620 ; N five ; B 70 -17 614 681 ;
+C 54 ; WX 620 ; N six ; B 89 -17 657 698 ;
+C 55 ; WX 620 ; N seven ; B 143 0 672 681 ;
+C 56 ; WX 620 ; N eight ; B 61 -17 655 698 ;
+C 57 ; WX 620 ; N nine ; B 77 -17 649 698 ;
+C 58 ; WX 300 ; N colon ; B 96 -8 292 494 ;
+C 59 ; WX 300 ; N semicolon ; B 88 -114 292 494 ;
+C 60 ; WX 600 ; N less ; B 79 33 588 561 ;
+C 61 ; WX 600 ; N equal ; B 91 161 595 433 ;
+C 62 ; WX 600 ; N greater ; B 93 33 602 561 ;
+C 63 ; WX 540 ; N question ; B 114 -8 604 698 ;
+C 64 ; WX 780 ; N at ; B 102 -17 802 698 ;
+C 65 ; WX 700 ; N A ; B -25 0 720 681 ;
+C 66 ; WX 720 ; N B ; B 21 0 746 681 ;
+C 67 ; WX 720 ; N C ; B 88 -17 746 698 ;
+C 68 ; WX 740 ; N D ; B 21 0 782 681 ;
+C 69 ; WX 680 ; N E ; B 21 0 736 681 ;
+C 70 ; WX 620 ; N F ; B 21 0 743 681 ;
+C 71 ; WX 760 ; N G ; B 88 -17 813 698 ;
+C 72 ; WX 800 ; N H ; B 21 0 888 681 ;
+C 73 ; WX 320 ; N I ; B 21 0 412 681 ;
+C 74 ; WX 560 ; N J ; B -2 -17 666 681 ;
+C 75 ; WX 720 ; N K ; B 21 0 804 681 ;
+C 76 ; WX 580 ; N L ; B 21 0 656 681 ;
+C 77 ; WX 860 ; N M ; B 18 0 956 681 ;
+C 78 ; WX 720 ; N N ; B 18 0 823 681 ;
+C 79 ; WX 760 ; N O ; B 88 -17 799 698 ;
+C 80 ; WX 600 ; N P ; B 21 0 681 681 ;
+C 81 ; WX 780 ; N Q ; B 61 -191 812 698 ;
+C 82 ; WX 700 ; N R ; B 21 0 736 681 ;
+C 83 ; WX 640 ; N S ; B 61 -17 668 698 ;
+C 84 ; WX 600 ; N T ; B 50 0 725 681 ;
+C 85 ; WX 720 ; N U ; B 118 -17 842 681 ;
+C 86 ; WX 680 ; N V ; B 87 0 815 681 ;
+C 87 ; WX 960 ; N W ; B 87 0 1095 681 ;
+C 88 ; WX 700 ; N X ; B -25 0 815 681 ;
+C 89 ; WX 660 ; N Y ; B 87 0 809 681 ;
+C 90 ; WX 580 ; N Z ; B 8 0 695 681 ;
+C 91 ; WX 260 ; N bracketleft ; B 56 -136 351 717 ;
+C 92 ; WX 600 ; N backslash ; B 84 0 542 717 ;
+C 93 ; WX 260 ; N bracketright ; B 15 -136 309 717 ;
+C 94 ; WX 600 ; N asciicircum ; B 97 276 599 681 ;
+C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;
+C 96 ; WX 280 ; N quoteleft ; B 191 470 330 698 ;
+C 97 ; WX 620 ; N a ; B 71 -8 686 494 ;
+C 98 ; WX 600 ; N b ; B 88 -8 621 717 ;
+C 99 ; WX 480 ; N c ; B 65 -8 522 494 ;
+C 100 ; WX 640 ; N d ; B 65 -8 695 717 ;
+C 101 ; WX 540 ; N e ; B 65 -8 575 494 ;
+C 102 ; WX 340 ; N f ; B -160 -218 557 725 ; L i fi ; L l fl ;
+C 103 ; WX 560 ; N g ; B 4 -221 581 494 ;
+C 104 ; WX 620 ; N h ; B 88 -8 689 717 ;
+C 105 ; WX 280 ; N i ; B 88 -8 351 663 ;
+C 106 ; WX 280 ; N j ; B -200 -221 308 663 ;
+C 107 ; WX 600 ; N k ; B 88 -8 657 717 ;
+C 108 ; WX 280 ; N l ; B 100 -8 342 717 ;
+C 109 ; WX 880 ; N m ; B 88 -8 952 494 ;
+C 110 ; WX 620 ; N n ; B 88 -8 673 494 ;
+C 111 ; WX 540 ; N o ; B 65 -8 572 494 ;
+C 112 ; WX 600 ; N p ; B -24 -212 621 494 ;
+C 113 ; WX 560 ; N q ; B 65 -212 584 494 ;
+C 114 ; WX 400 ; N r ; B 88 0 481 494 ;
+C 115 ; WX 540 ; N s ; B 65 -8 547 494 ;
+C 116 ; WX 340 ; N t ; B 88 -8 411 664 ;
+C 117 ; WX 620 ; N u ; B 88 -8 686 484 ;
+C 118 ; WX 540 ; N v ; B 88 -8 562 494 ;
+C 119 ; WX 880 ; N w ; B 88 -8 893 494 ;
+C 120 ; WX 540 ; N x ; B 9 -8 626 494 ;
+C 121 ; WX 600 ; N y ; B 60 -221 609 484 ;
+C 122 ; WX 520 ; N z ; B 38 -8 561 494 ;
+C 123 ; WX 360 ; N braceleft ; B 122 -191 442 718 ;
+C 124 ; WX 600 ; N bar ; B 294 -250 372 750 ;
+C 125 ; WX 380 ; N braceright ; B 13 -192 333 717 ;
+C 126 ; WX 600 ; N asciitilde ; B 91 207 595 386 ;
+C 161 ; WX 320 ; N exclamdown ; B 73 -213 301 494 ;
+C 162 ; WX 620 ; N cent ; B 148 -29 596 715 ;
+C 163 ; WX 620 ; N sterling ; B 4 -17 702 698 ;
+C 164 ; WX 20 ; N fraction ; B -228 0 323 681 ;
+C 165 ; WX 620 ; N yen ; B 71 0 735 681 ;
+C 166 ; WX 620 ; N florin ; B -26 -218 692 725 ;
+C 167 ; WX 620 ; N section ; B 38 -178 638 698 ;
+C 168 ; WX 620 ; N currency ; B 100 89 605 591 ;
+C 169 ; WX 200 ; N quotesingle ; B 99 473 247 698 ;
+C 170 ; WX 440 ; N quotedblleft ; B 191 470 493 698 ;
+C 171 ; WX 300 ; N guillemotleft ; B 70 129 313 434 ;
+C 172 ; WX 180 ; N guilsinglleft ; B 75 129 208 434 ;
+C 173 ; WX 180 ; N guilsinglright ; B 70 129 203 434 ;
+C 174 ; WX 640 ; N fi ; B -159 -222 709 725 ;
+C 175 ; WX 660 ; N fl ; B -159 -218 713 725 ;
+C 177 ; WX 500 ; N endash ; B 33 269 561 325 ;
+C 178 ; WX 620 ; N dagger ; B 192 -130 570 698 ;
+C 179 ; WX 620 ; N daggerdbl ; B 144 -122 566 698 ;
+C 180 ; WX 300 ; N periodcentered ; B 137 229 272 364 ;
+C 182 ; WX 620 ; N paragraph ; B 112 0 718 681 ;
+C 183 ; WX 460 ; N bullet ; B 100 170 444 511 ;
+C 184 ; WX 320 ; N quotesinglbase ; B 87 -114 226 113 ;
+C 185 ; WX 480 ; N quotedblbase ; B 87 -114 390 113 ;
+C 186 ; WX 440 ; N quotedblright ; B 148 470 451 698 ;
+C 187 ; WX 300 ; N guillemotright ; B 60 129 303 434 ;
+C 188 ; WX 1000 ; N ellipsis ; B 99 -8 900 127 ;
+C 189 ; WX 1180 ; N perthousand ; B 56 -8 1199 691 ;
+C 191 ; WX 540 ; N questiondown ; B 18 -212 508 494 ;
+C 193 ; WX 340 ; N grave ; B 182 551 377 706 ;
+C 194 ; WX 320 ; N acute ; B 208 551 403 706 ;
+C 195 ; WX 440 ; N circumflex ; B 176 571 479 685 ;
+C 196 ; WX 440 ; N tilde ; B 180 586 488 671 ;
+C 197 ; WX 440 ; N macron ; B 178 599 484 658 ;
+C 198 ; WX 440 ; N breve ; B 191 577 500 680 ;
+C 199 ; WX 260 ; N dotaccent ; B 189 572 310 693 ;
+C 200 ; WX 420 ; N dieresis ; B 185 542 467 661 ;
+C 202 ; WX 300 ; N ring ; B 178 551 334 706 ;
+C 203 ; WX 320 ; N cedilla ; B 45 -178 240 0 ;
+C 205 ; WX 340 ; N hungarumlaut ; B 188 547 520 694 ;
+C 206 ; WX 260 ; N ogonek ; B 71 -153 282 0 ;
+C 207 ; WX 440 ; N caron ; B 218 571 521 684 ;
+C 208 ; WX 1000 ; N emdash ; B 33 269 1061 325 ;
+C 225 ; WX 1220 ; N AE ; B -45 0 1269 681 ;
+C 227 ; WX 440 ; N ordfeminine ; B 130 396 513 698 ;
+C 232 ; WX 580 ; N Lslash ; B 21 0 656 681 ;
+C 233 ; WX 760 ; N Oslash ; B 88 -95 799 777 ;
+C 234 ; WX 1180 ; N OE ; B 88 -17 1237 698 ;
+C 235 ; WX 400 ; N ordmasculine ; B 139 396 455 698 ;
+C 241 ; WX 880 ; N ae ; B 71 -8 918 494 ;
+C 245 ; WX 280 ; N dotlessi ; B 88 -8 351 484 ;
+C 248 ; WX 340 ; N lslash ; B 33 -8 373 717 ;
+C 249 ; WX 540 ; N oslash ; B 65 -49 571 532 ;
+C 250 ; WX 900 ; N oe ; B 65 -8 948 494 ;
+C 251 ; WX 620 ; N germandbls ; B -121 -111 653 698 ;
+C -1 ; WX 320 ; N Idieresis ; B 21 0 447 865 ;
+C -1 ; WX 540 ; N eacute ; B 65 -8 575 706 ;
+C -1 ; WX 620 ; N abreve ; B 71 -8 686 680 ;
+C -1 ; WX 620 ; N uhungarumlaut ; B 88 -8 686 694 ;
+C -1 ; WX 540 ; N ecaron ; B 65 -8 575 684 ;
+C -1 ; WX 660 ; N Ydieresis ; B 87 0 809 865 ;
+C -1 ; WX 600 ; N divide ; B 91 46 595 548 ;
+C -1 ; WX 660 ; N Yacute ; B 87 0 809 883 ;
+C -1 ; WX 700 ; N Acircumflex ; B -25 0 720 862 ;
+C -1 ; WX 620 ; N aacute ; B 71 -8 686 706 ;
+C -1 ; WX 720 ; N Ucircumflex ; B 118 -17 842 862 ;
+C -1 ; WX 600 ; N yacute ; B 60 -221 609 706 ;
+C -1 ; WX 540 ; N scommaaccent ; B 65 -250 547 494 ;
+C -1 ; WX 540 ; N ecircumflex ; B 65 -8 575 685 ;
+C -1 ; WX 720 ; N Uring ; B 118 -17 842 883 ;
+C -1 ; WX 720 ; N Udieresis ; B 118 -17 842 865 ;
+C -1 ; WX 620 ; N aogonek ; B 71 -153 686 494 ;
+C -1 ; WX 720 ; N Uacute ; B 118 -17 842 883 ;
+C -1 ; WX 620 ; N uogonek ; B 88 -153 686 484 ;
+C -1 ; WX 680 ; N Edieresis ; B 21 0 736 865 ;
+C -1 ; WX 740 ; N Dcroat ; B 21 0 782 681 ;
+C -1 ; WX 250 ; N commaaccent ; B 92 -250 217 -50 ;
+C -1 ; WX 740 ; N copyright ; B 84 -17 784 698 ;
+C -1 ; WX 680 ; N Emacron ; B 21 0 736 835 ;
+C -1 ; WX 480 ; N ccaron ; B 65 -8 561 684 ;
+C -1 ; WX 620 ; N aring ; B 71 -8 686 706 ;
+C -1 ; WX 720 ; N Ncommaaccent ; B 18 -250 823 681 ;
+C -1 ; WX 280 ; N lacute ; B 100 -8 383 883 ;
+C -1 ; WX 620 ; N agrave ; B 71 -8 686 706 ;
+C -1 ; WX 600 ; N Tcommaaccent ; B 50 -250 725 681 ;
+C -1 ; WX 720 ; N Cacute ; B 88 -17 746 883 ;
+C -1 ; WX 620 ; N atilde ; B 71 -8 686 671 ;
+C -1 ; WX 680 ; N Edotaccent ; B 21 0 736 883 ;
+C -1 ; WX 540 ; N scaron ; B 65 -8 551 684 ;
+C -1 ; WX 540 ; N scedilla ; B 65 -178 547 494 ;
+C -1 ; WX 280 ; N iacute ; B 88 -8 363 706 ;
+C -1 ; WX 471 ; N lozenge ; B 10 0 462 728 ;
+C -1 ; WX 700 ; N Rcaron ; B 21 0 736 861 ;
+C -1 ; WX 760 ; N Gcommaaccent ; B 88 -250 813 698 ;
+C -1 ; WX 620 ; N ucircumflex ; B 88 -8 686 685 ;
+C -1 ; WX 620 ; N acircumflex ; B 71 -8 686 685 ;
+C -1 ; WX 700 ; N Amacron ; B -25 0 720 835 ;
+C -1 ; WX 400 ; N rcaron ; B 88 0 481 684 ;
+C -1 ; WX 480 ; N ccedilla ; B 65 -178 522 494 ;
+C -1 ; WX 580 ; N Zdotaccent ; B 8 0 695 883 ;
+C -1 ; WX 600 ; N Thorn ; B 21 0 656 681 ;
+C -1 ; WX 760 ; N Omacron ; B 88 -17 799 835 ;
+C -1 ; WX 700 ; N Racute ; B 21 0 736 883 ;
+C -1 ; WX 640 ; N Sacute ; B 61 -17 668 883 ;
+C -1 ; WX 710 ; N dcaron ; B 65 -8 806 723 ;
+C -1 ; WX 720 ; N Umacron ; B 118 -17 842 835 ;
+C -1 ; WX 620 ; N uring ; B 88 -8 686 706 ;
+C -1 ; WX 372 ; N threesuperior ; B 70 269 439 698 ;
+C -1 ; WX 760 ; N Ograve ; B 88 -17 799 883 ;
+C -1 ; WX 700 ; N Agrave ; B -25 0 720 883 ;
+C -1 ; WX 700 ; N Abreve ; B -25 0 720 857 ;
+C -1 ; WX 600 ; N multiply ; B 91 44 595 548 ;
+C -1 ; WX 620 ; N uacute ; B 88 -8 686 706 ;
+C -1 ; WX 600 ; N Tcaron ; B 50 0 725 861 ;
+C -1 ; WX 476 ; N partialdiff ; B 17 -38 459 710 ;
+C -1 ; WX 600 ; N ydieresis ; B 60 -221 609 688 ;
+C -1 ; WX 720 ; N Nacute ; B 18 0 823 883 ;
+C -1 ; WX 280 ; N icircumflex ; B 76 -8 379 685 ;
+C -1 ; WX 680 ; N Ecircumflex ; B 21 0 736 862 ;
+C -1 ; WX 620 ; N adieresis ; B 71 -8 686 688 ;
+C -1 ; WX 540 ; N edieresis ; B 65 -8 575 688 ;
+C -1 ; WX 480 ; N cacute ; B 65 -8 522 706 ;
+C -1 ; WX 620 ; N nacute ; B 88 -8 673 706 ;
+C -1 ; WX 620 ; N umacron ; B 88 -8 686 658 ;
+C -1 ; WX 720 ; N Ncaron ; B 18 0 823 861 ;
+C -1 ; WX 320 ; N Iacute ; B 21 0 433 883 ;
+C -1 ; WX 600 ; N plusminus ; B 91 0 595 548 ;
+C -1 ; WX 600 ; N brokenbar ; B 294 -175 372 675 ;
+C -1 ; WX 740 ; N registered ; B 84 -17 784 698 ;
+C -1 ; WX 760 ; N Gbreve ; B 88 -17 813 857 ;
+C -1 ; WX 320 ; N Idotaccent ; B 21 0 412 883 ;
+C -1 ; WX 600 ; N summation ; B 15 -10 586 706 ;
+C -1 ; WX 680 ; N Egrave ; B 21 0 736 883 ;
+C -1 ; WX 400 ; N racute ; B 88 0 481 706 ;
+C -1 ; WX 540 ; N omacron ; B 65 -8 572 658 ;
+C -1 ; WX 580 ; N Zacute ; B 8 0 695 883 ;
+C -1 ; WX 580 ; N Zcaron ; B 8 0 695 861 ;
+C -1 ; WX 549 ; N greaterequal ; B 26 0 523 666 ;
+C -1 ; WX 740 ; N Eth ; B 21 0 782 681 ;
+C -1 ; WX 720 ; N Ccedilla ; B 88 -178 746 698 ;
+C -1 ; WX 280 ; N lcommaaccent ; B 100 -250 342 717 ;
+C -1 ; WX 370 ; N tcaron ; B 88 -8 476 737 ;
+C -1 ; WX 540 ; N eogonek ; B 65 -160 575 494 ;
+C -1 ; WX 720 ; N Uogonek ; B 118 -168 842 681 ;
+C -1 ; WX 700 ; N Aacute ; B -25 0 720 883 ;
+C -1 ; WX 700 ; N Adieresis ; B -25 0 720 865 ;
+C -1 ; WX 540 ; N egrave ; B 65 -8 575 706 ;
+C -1 ; WX 520 ; N zacute ; B 38 -8 561 706 ;
+C -1 ; WX 280 ; N iogonek ; B 88 -157 351 663 ;
+C -1 ; WX 760 ; N Oacute ; B 88 -17 799 883 ;
+C -1 ; WX 540 ; N oacute ; B 65 -8 572 706 ;
+C -1 ; WX 620 ; N amacron ; B 71 -8 686 658 ;
+C -1 ; WX 540 ; N sacute ; B 65 -8 547 706 ;
+C -1 ; WX 280 ; N idieresis ; B 88 -8 377 688 ;
+C -1 ; WX 760 ; N Ocircumflex ; B 88 -17 799 862 ;
+C -1 ; WX 720 ; N Ugrave ; B 118 -17 842 883 ;
+C -1 ; WX 614 ; N Delta ; B 6 0 608 688 ;
+C -1 ; WX 600 ; N thorn ; B -24 -212 621 717 ;
+C -1 ; WX 372 ; N twosuperior ; B 68 279 439 698 ;
+C -1 ; WX 760 ; N Odieresis ; B 88 -17 799 865 ;
+C -1 ; WX 620 ; N mu ; B 53 -221 686 484 ;
+C -1 ; WX 280 ; N igrave ; B 88 -8 351 706 ;
+C -1 ; WX 540 ; N ohungarumlaut ; B 65 -8 590 694 ;
+C -1 ; WX 680 ; N Eogonek ; B 21 -153 736 681 ;
+C -1 ; WX 640 ; N dcroat ; B 65 -8 725 717 ;
+C -1 ; WX 930 ; N threequarters ; B 99 0 913 691 ;
+C -1 ; WX 640 ; N Scedilla ; B 61 -178 668 698 ;
+C -1 ; WX 350 ; N lcaron ; B 100 -8 446 722 ;
+C -1 ; WX 720 ; N Kcommaaccent ; B 21 -250 804 681 ;
+C -1 ; WX 580 ; N Lacute ; B 21 0 656 883 ;
+C -1 ; WX 980 ; N trademark ; B 69 277 965 681 ;
+C -1 ; WX 540 ; N edotaccent ; B 65 -8 575 720 ;
+C -1 ; WX 320 ; N Igrave ; B 21 0 412 883 ;
+C -1 ; WX 320 ; N Imacron ; B 21 0 454 835 ;
+C -1 ; WX 580 ; N Lcaron ; B 21 0 656 698 ;
+C -1 ; WX 930 ; N onehalf ; B 91 0 925 681 ;
+C -1 ; WX 549 ; N lessequal ; B 26 0 523 666 ;
+C -1 ; WX 540 ; N ocircumflex ; B 65 -8 572 685 ;
+C -1 ; WX 620 ; N ntilde ; B 88 -8 673 671 ;
+C -1 ; WX 720 ; N Uhungarumlaut ; B 118 -17 842 871 ;
+C -1 ; WX 680 ; N Eacute ; B 21 0 736 883 ;
+C -1 ; WX 540 ; N emacron ; B 65 -8 594 658 ;
+C -1 ; WX 560 ; N gbreve ; B 4 -221 581 680 ;
+C -1 ; WX 930 ; N onequarter ; B 91 0 913 681 ;
+C -1 ; WX 640 ; N Scaron ; B 61 -17 668 861 ;
+C -1 ; WX 640 ; N Scommaaccent ; B 61 -250 668 698 ;
+C -1 ; WX 760 ; N Ohungarumlaut ; B 88 -17 799 871 ;
+C -1 ; WX 400 ; N degree ; B 120 398 420 698 ;
+C -1 ; WX 540 ; N ograve ; B 65 -8 572 706 ;
+C -1 ; WX 720 ; N Ccaron ; B 88 -17 746 861 ;
+C -1 ; WX 620 ; N ugrave ; B 88 -8 686 706 ;
+C -1 ; WX 453 ; N radical ; B -4 -80 458 762 ;
+C -1 ; WX 740 ; N Dcaron ; B 21 0 782 861 ;
+C -1 ; WX 400 ; N rcommaaccent ; B 67 -250 481 494 ;
+C -1 ; WX 720 ; N Ntilde ; B 18 0 823 848 ;
+C -1 ; WX 540 ; N otilde ; B 65 -8 572 671 ;
+C -1 ; WX 700 ; N Rcommaaccent ; B 21 -250 736 681 ;
+C -1 ; WX 580 ; N Lcommaaccent ; B 21 -250 656 681 ;
+C -1 ; WX 700 ; N Atilde ; B -25 0 720 848 ;
+C -1 ; WX 700 ; N Aogonek ; B -25 -153 748 681 ;
+C -1 ; WX 700 ; N Aring ; B -25 0 720 883 ;
+C -1 ; WX 760 ; N Otilde ; B 88 -17 799 848 ;
+C -1 ; WX 520 ; N zdotaccent ; B 38 -8 561 720 ;
+C -1 ; WX 680 ; N Ecaron ; B 21 0 736 861 ;
+C -1 ; WX 320 ; N Iogonek ; B 21 -153 412 681 ;
+C -1 ; WX 600 ; N kcommaaccent ; B 88 -250 657 717 ;
+C -1 ; WX 600 ; N minus ; B 91 259 595 335 ;
+C -1 ; WX 320 ; N Icircumflex ; B 21 0 449 862 ;
+C -1 ; WX 620 ; N ncaron ; B 88 -8 673 684 ;
+C -1 ; WX 340 ; N tcommaaccent ; B 88 -250 411 664 ;
+C -1 ; WX 600 ; N logicalnot ; B 91 163 595 433 ;
+C -1 ; WX 540 ; N odieresis ; B 65 -8 572 688 ;
+C -1 ; WX 620 ; N udieresis ; B 88 -8 686 688 ;
+C -1 ; WX 549 ; N notequal ; B 12 -31 537 547 ;
+C -1 ; WX 560 ; N gcommaaccent ; B 4 -221 581 782 ;
+C -1 ; WX 540 ; N eth ; B 65 -8 642 725 ;
+C -1 ; WX 520 ; N zcaron ; B 38 -8 561 684 ;
+C -1 ; WX 620 ; N ncommaaccent ; B 88 -250 673 494 ;
+C -1 ; WX 372 ; N onesuperior ; B 114 279 339 688 ;
+C -1 ; WX 280 ; N imacron ; B 88 -8 404 658 ;
+EndCharMetrics
+StartKernData
+StartKernPairs 828
+KPX A T -5
+KPX A Tcaron -5
+KPX A Tcommaaccent -5
+KPX A V -78
+KPX A W -73
+KPX A Y -62
+KPX A Yacute -62
+KPX A Ydieresis -62
+KPX Aacute T -5
+KPX Aacute Tcaron -5
+KPX Aacute Tcommaaccent -5
+KPX Aacute V -78
+KPX Aacute W -73
+KPX Aacute Y -62
+KPX Aacute Yacute -62
+KPX Aacute Ydieresis -62
+KPX Abreve T -5
+KPX Abreve Tcaron -5
+KPX Abreve Tcommaaccent -5
+KPX Abreve V -78
+KPX Abreve W -73
+KPX Abreve Y -62
+KPX Abreve Yacute -62
+KPX Abreve Ydieresis -62
+KPX Acircumflex T -5
+KPX Acircumflex Tcaron -5
+KPX Acircumflex Tcommaaccent -5
+KPX Acircumflex V -78
+KPX Acircumflex W -73
+KPX Acircumflex Y -62
+KPX Acircumflex Yacute -62
+KPX Acircumflex Ydieresis -62
+KPX Adieresis T -5
+KPX Adieresis Tcaron -5
+KPX Adieresis Tcommaaccent -5
+KPX Adieresis V -78
+KPX Adieresis W -73
+KPX Adieresis Y -62
+KPX Adieresis Yacute -62
+KPX Adieresis Ydieresis -62
+KPX Agrave T -5
+KPX Agrave Tcaron -5
+KPX Agrave Tcommaaccent -5
+KPX Agrave V -78
+KPX Agrave W -73
+KPX Agrave Y -62
+KPX Agrave Yacute -62
+KPX Agrave Ydieresis -62
+KPX Amacron T -5
+KPX Amacron Tcaron -5
+KPX Amacron Tcommaaccent -5
+KPX Amacron V -78
+KPX Amacron W -73
+KPX Amacron Y -62
+KPX Amacron Yacute -62
+KPX Amacron Ydieresis -62
+KPX Aogonek T -5
+KPX Aogonek Tcaron -5
+KPX Aogonek Tcommaaccent -5
+KPX Aogonek V -78
+KPX Aogonek W -73
+KPX Aogonek Y -62
+KPX Aogonek Yacute -62
+KPX Aogonek Ydieresis -62
+KPX Aring T -5
+KPX Aring Tcaron -5
+KPX Aring Tcommaaccent -5
+KPX Aring V -78
+KPX Aring W -73
+KPX Aring Y -62
+KPX Aring Yacute -62
+KPX Aring Ydieresis -62
+KPX Atilde T -5
+KPX Atilde Tcaron -5
+KPX Atilde Tcommaaccent -5
+KPX Atilde V -78
+KPX Atilde W -73
+KPX Atilde Y -62
+KPX Atilde Yacute -62
+KPX Atilde Ydieresis -62
+KPX F A -16
+KPX F Aacute -16
+KPX F Abreve -16
+KPX F Acircumflex -16
+KPX F Adieresis -16
+KPX F Agrave -16
+KPX F Amacron -16
+KPX F Aogonek -16
+KPX F Aring -16
+KPX F Atilde -16
+KPX F comma -98
+KPX F period -97
+KPX L V 4
+KPX L W 9
+KPX L Y 7
+KPX L Yacute 7
+KPX L Ydieresis 7
+KPX L y 20
+KPX L yacute 20
+KPX L ydieresis 20
+KPX Lacute V 4
+KPX Lacute W 9
+KPX Lacute Y 7
+KPX Lacute Yacute 7
+KPX Lacute Ydieresis 7
+KPX Lacute y 20
+KPX Lacute yacute 20
+KPX Lacute ydieresis 20
+KPX Lcaron V 4
+KPX Lcaron W 9
+KPX Lcaron Y 7
+KPX Lcaron Yacute 7
+KPX Lcaron Ydieresis 7
+KPX Lcaron y 20
+KPX Lcaron yacute 20
+KPX Lcaron ydieresis 20
+KPX Lcommaaccent V 4
+KPX Lcommaaccent W 9
+KPX Lcommaaccent Y 7
+KPX Lcommaaccent Yacute 7
+KPX Lcommaaccent Ydieresis 7
+KPX Lcommaaccent y 20
+KPX Lcommaaccent yacute 20
+KPX Lcommaaccent ydieresis 20
+KPX Lslash V 4
+KPX Lslash W 9
+KPX Lslash Y 7
+KPX Lslash Yacute 7
+KPX Lslash Ydieresis 7
+KPX Lslash y 20
+KPX Lslash yacute 20
+KPX Lslash ydieresis 20
+KPX P A -30
+KPX P Aacute -30
+KPX P Abreve -30
+KPX P Acircumflex -30
+KPX P Adieresis -30
+KPX P Agrave -30
+KPX P Amacron -30
+KPX P Aogonek -30
+KPX P Aring -30
+KPX P Atilde -30
+KPX P comma -106
+KPX P period -105
+KPX R T 65
+KPX R Tcaron 65
+KPX R Tcommaaccent 65
+KPX R V 2
+KPX R W 2
+KPX R Y 11
+KPX R Yacute 11
+KPX R Ydieresis 11
+KPX Racute T 65
+KPX Racute Tcaron 65
+KPX Racute Tcommaaccent 65
+KPX Racute V 2
+KPX Racute W 2
+KPX Racute Y 11
+KPX Racute Yacute 11
+KPX Racute Ydieresis 11
+KPX Rcaron T 65
+KPX Rcaron Tcaron 65
+KPX Rcaron Tcommaaccent 65
+KPX Rcaron V 2
+KPX Rcaron W 2
+KPX Rcaron Y 11
+KPX Rcaron Yacute 11
+KPX Rcaron Ydieresis 11
+KPX Rcommaaccent T 65
+KPX Rcommaaccent Tcaron 65
+KPX Rcommaaccent Tcommaaccent 65
+KPX Rcommaaccent V 2
+KPX Rcommaaccent W 2
+KPX Rcommaaccent Y 11
+KPX Rcommaaccent Yacute 11
+KPX Rcommaaccent Ydieresis 11
+KPX T A -14
+KPX T Aacute -14
+KPX T Abreve -14
+KPX T Acircumflex -14
+KPX T Adieresis -14
+KPX T Agrave -14
+KPX T Amacron -14
+KPX T Aogonek -14
+KPX T Aring -14
+KPX T Atilde -14
+KPX T a 9
+KPX T aacute 9
+KPX T abreve 9
+KPX T acircumflex 9
+KPX T adieresis 9
+KPX T agrave 9
+KPX T amacron 9
+KPX T aogonek 9
+KPX T aring 9
+KPX T atilde 9
+KPX T c 16
+KPX T cacute 16
+KPX T ccaron 16
+KPX T ccedilla 16
+KPX T colon 48
+KPX T comma -79
+KPX T e 10
+KPX T eacute 10
+KPX T ecaron 10
+KPX T ecircumflex 10
+KPX T edieresis 10
+KPX T edotaccent 10
+KPX T egrave 10
+KPX T emacron 10
+KPX T eogonek 10
+KPX T hyphen 20
+KPX T i 71
+KPX T iacute 71
+KPX T icircumflex 71
+KPX T idieresis 71
+KPX T igrave 71
+KPX T imacron 71
+KPX T iogonek 71
+KPX T o 14
+KPX T oacute 14
+KPX T ocircumflex 14
+KPX T odieresis 14
+KPX T ograve 14
+KPX T ohungarumlaut 14
+KPX T omacron 14
+KPX T oslash 14
+KPX T otilde 14
+KPX T period -78
+KPX T r 67
+KPX T racute 67
+KPX T rcaron 67
+KPX T rcommaaccent 67
+KPX T s -7
+KPX T sacute -7
+KPX T scaron -7
+KPX T scedilla -7
+KPX T scommaaccent -7
+KPX T semicolon 48
+KPX Tcaron A -14
+KPX Tcaron Aacute -14
+KPX Tcaron Abreve -14
+KPX Tcaron Acircumflex -14
+KPX Tcaron Adieresis -14
+KPX Tcaron Agrave -14
+KPX Tcaron Amacron -14
+KPX Tcaron Aogonek -14
+KPX Tcaron Aring -14
+KPX Tcaron Atilde -14
+KPX Tcaron a 9
+KPX Tcaron aacute 9
+KPX Tcaron abreve 9
+KPX Tcaron acircumflex 9
+KPX Tcaron adieresis 9
+KPX Tcaron agrave 9
+KPX Tcaron amacron 9
+KPX Tcaron aogonek 9
+KPX Tcaron aring 9
+KPX Tcaron atilde 9
+KPX Tcaron c 16
+KPX Tcaron cacute 16
+KPX Tcaron ccaron 16
+KPX Tcaron ccedilla 16
+KPX Tcaron colon 48
+KPX Tcaron comma -79
+KPX Tcaron e 10
+KPX Tcaron eacute 10
+KPX Tcaron ecaron 10
+KPX Tcaron ecircumflex 10
+KPX Tcaron edieresis 10
+KPX Tcaron edotaccent 10
+KPX Tcaron egrave 10
+KPX Tcaron emacron 10
+KPX Tcaron eogonek 10
+KPX Tcaron hyphen 20
+KPX Tcaron i 71
+KPX Tcaron iacute 71
+KPX Tcaron icircumflex 71
+KPX Tcaron idieresis 71
+KPX Tcaron igrave 71
+KPX Tcaron imacron 71
+KPX Tcaron iogonek 71
+KPX Tcaron o 14
+KPX Tcaron oacute 14
+KPX Tcaron ocircumflex 14
+KPX Tcaron odieresis 14
+KPX Tcaron ograve 14
+KPX Tcaron ohungarumlaut 14
+KPX Tcaron omacron 14
+KPX Tcaron oslash 14
+KPX Tcaron otilde 14
+KPX Tcaron period -78
+KPX Tcaron r 67
+KPX Tcaron racute 67
+KPX Tcaron rcaron 67
+KPX Tcaron rcommaaccent 67
+KPX Tcaron s -7
+KPX Tcaron sacute -7
+KPX Tcaron scaron -7
+KPX Tcaron scedilla -7
+KPX Tcaron scommaaccent -7
+KPX Tcaron semicolon 48
+KPX Tcommaaccent A -14
+KPX Tcommaaccent Aacute -14
+KPX Tcommaaccent Abreve -14
+KPX Tcommaaccent Acircumflex -14
+KPX Tcommaaccent Adieresis -14
+KPX Tcommaaccent Agrave -14
+KPX Tcommaaccent Amacron -14
+KPX Tcommaaccent Aogonek -14
+KPX Tcommaaccent Aring -14
+KPX Tcommaaccent Atilde -14
+KPX Tcommaaccent a 9
+KPX Tcommaaccent aacute 9
+KPX Tcommaaccent abreve 9
+KPX Tcommaaccent acircumflex 9
+KPX Tcommaaccent adieresis 9
+KPX Tcommaaccent agrave 9
+KPX Tcommaaccent amacron 9
+KPX Tcommaaccent aogonek 9
+KPX Tcommaaccent aring 9
+KPX Tcommaaccent atilde 9
+KPX Tcommaaccent c 16
+KPX Tcommaaccent cacute 16
+KPX Tcommaaccent ccaron 16
+KPX Tcommaaccent ccedilla 16
+KPX Tcommaaccent colon 48
+KPX Tcommaaccent comma -79
+KPX Tcommaaccent e 10
+KPX Tcommaaccent eacute 10
+KPX Tcommaaccent ecaron 10
+KPX Tcommaaccent ecircumflex 10
+KPX Tcommaaccent edieresis 10
+KPX Tcommaaccent edotaccent 10
+KPX Tcommaaccent egrave 10
+KPX Tcommaaccent emacron 10
+KPX Tcommaaccent eogonek 10
+KPX Tcommaaccent hyphen 20
+KPX Tcommaaccent i 71
+KPX Tcommaaccent iacute 71
+KPX Tcommaaccent icircumflex 71
+KPX Tcommaaccent idieresis 71
+KPX Tcommaaccent igrave 71
+KPX Tcommaaccent imacron 71
+KPX Tcommaaccent iogonek 71
+KPX Tcommaaccent o 14
+KPX Tcommaaccent oacute 14
+KPX Tcommaaccent ocircumflex 14
+KPX Tcommaaccent odieresis 14
+KPX Tcommaaccent ograve 14
+KPX Tcommaaccent ohungarumlaut 14
+KPX Tcommaaccent omacron 14
+KPX Tcommaaccent oslash 14
+KPX Tcommaaccent otilde 14
+KPX Tcommaaccent period -78
+KPX Tcommaaccent r 67
+KPX Tcommaaccent racute 67
+KPX Tcommaaccent rcaron 67
+KPX Tcommaaccent rcommaaccent 67
+KPX Tcommaaccent s -7
+KPX Tcommaaccent sacute -7
+KPX Tcommaaccent scaron -7
+KPX Tcommaaccent scedilla -7
+KPX Tcommaaccent scommaaccent -7
+KPX Tcommaaccent semicolon 48
+KPX V A -70
+KPX V Aacute -70
+KPX V Abreve -70
+KPX V Acircumflex -70
+KPX V Adieresis -70
+KPX V Agrave -70
+KPX V Amacron -70
+KPX V Aogonek -70
+KPX V Aring -70
+KPX V Atilde -70
+KPX V a -70
+KPX V aacute -70
+KPX V abreve -70
+KPX V acircumflex -70
+KPX V adieresis -70
+KPX V agrave -70
+KPX V amacron -70
+KPX V aogonek -70
+KPX V aring -70
+KPX V atilde -70
+KPX V colon -35
+KPX V comma -109
+KPX V e -70
+KPX V eacute -70
+KPX V ecaron -70
+KPX V ecircumflex -70
+KPX V edieresis -70
+KPX V edotaccent -70
+KPX V egrave -70
+KPX V emacron -70
+KPX V eogonek -70
+KPX V hyphen 20
+KPX V i 3
+KPX V iacute 3
+KPX V icircumflex 3
+KPX V idieresis 13
+KPX V igrave 13
+KPX V imacron 13
+KPX V iogonek 3
+KPX V o -70
+KPX V oacute -70
+KPX V ocircumflex -70
+KPX V odieresis -70
+KPX V ograve -70
+KPX V ohungarumlaut -70
+KPX V omacron -70
+KPX V oslash -70
+KPX V otilde -70
+KPX V period -100
+KPX V r -20
+KPX V racute -20
+KPX V rcaron -20
+KPX V rcommaaccent -20
+KPX V semicolon -44
+KPX V u -10
+KPX V uacute -10
+KPX V ucircumflex -10
+KPX V udieresis -10
+KPX V ugrave -10
+KPX V uhungarumlaut -10
+KPX V umacron -10
+KPX V uogonek -10
+KPX V uring -10
+KPX V y -14
+KPX V yacute -14
+KPX V ydieresis -14
+KPX W A -60
+KPX W Aacute -60
+KPX W Abreve -60
+KPX W Acircumflex -60
+KPX W Adieresis -60
+KPX W Agrave -60
+KPX W Amacron -60
+KPX W Aogonek -60
+KPX W Aring -60
+KPX W Atilde -60
+KPX W a -60
+KPX W aacute -60
+KPX W abreve -60
+KPX W acircumflex -60
+KPX W adieresis -60
+KPX W agrave -60
+KPX W amacron -60
+KPX W aogonek -60
+KPX W aring -60
+KPX W atilde -60
+KPX W colon -35
+KPX W comma -109
+KPX W e -60
+KPX W eacute -60
+KPX W ecaron -60
+KPX W ecircumflex -60
+KPX W edieresis -60
+KPX W edotaccent -60
+KPX W egrave -60
+KPX W emacron -60
+KPX W eogonek -60
+KPX W hyphen 20
+KPX W i 3
+KPX W iacute 3
+KPX W icircumflex 13
+KPX W idieresis 13
+KPX W igrave 13
+KPX W imacron 13
+KPX W iogonek 3
+KPX W o -60
+KPX W oacute -60
+KPX W ocircumflex -60
+KPX W odieresis -60
+KPX W ograve -60
+KPX W ohungarumlaut -60
+KPX W omacron -60
+KPX W oslash -60
+KPX W otilde -60
+KPX W period -100
+KPX W r -30
+KPX W racute -30
+KPX W rcaron -30
+KPX W rcommaaccent -30
+KPX W semicolon -42
+KPX W u -20
+KPX W uacute -20
+KPX W ucircumflex -20
+KPX W udieresis -20
+KPX W ugrave -20
+KPX W uhungarumlaut -20
+KPX W umacron -20
+KPX W uogonek -20
+KPX W uring -20
+KPX W y -14
+KPX W yacute -14
+KPX W ydieresis -14
+KPX Y A -82
+KPX Y Aacute -82
+KPX Y Abreve -82
+KPX Y Acircumflex -82
+KPX Y Adieresis -82
+KPX Y Agrave -82
+KPX Y Amacron -82
+KPX Y Aogonek -82
+KPX Y Aring -82
+KPX Y Atilde -82
+KPX Y a -79
+KPX Y aacute -79
+KPX Y abreve -79
+KPX Y acircumflex -79
+KPX Y adieresis -79
+KPX Y agrave -79
+KPX Y amacron -79
+KPX Y aogonek -79
+KPX Y aring -79
+KPX Y atilde -79
+KPX Y colon -35
+KPX Y comma -109
+KPX Y e -78
+KPX Y eacute -78
+KPX Y ecaron -78
+KPX Y ecircumflex -78
+KPX Y edieresis -78
+KPX Y edotaccent -78
+KPX Y egrave -78
+KPX Y emacron -78
+KPX Y eogonek -78
+KPX Y hyphen 20
+KPX Y i -11
+KPX Y iacute -11
+KPX Y iogonek -11
+KPX Y o -75
+KPX Y oacute -75
+KPX Y ocircumflex -75
+KPX Y odieresis -75
+KPX Y ograve -75
+KPX Y ohungarumlaut -75
+KPX Y omacron -75
+KPX Y oslash -75
+KPX Y otilde -75
+KPX Y p -37
+KPX Y period -100
+KPX Y q -72
+KPX Y semicolon -40
+KPX Y u -31
+KPX Y uacute -31
+KPX Y ucircumflex -31
+KPX Y udieresis -31
+KPX Y ugrave -31
+KPX Y uhungarumlaut -31
+KPX Y umacron -31
+KPX Y uogonek -31
+KPX Y uring -31
+KPX Y v -19
+KPX Yacute A -82
+KPX Yacute Aacute -82
+KPX Yacute Abreve -82
+KPX Yacute Acircumflex -82
+KPX Yacute Adieresis -82
+KPX Yacute Agrave -82
+KPX Yacute Amacron -82
+KPX Yacute Aogonek -82
+KPX Yacute Aring -82
+KPX Yacute Atilde -82
+KPX Yacute a -79
+KPX Yacute aacute -79
+KPX Yacute abreve -79
+KPX Yacute acircumflex -79
+KPX Yacute adieresis -79
+KPX Yacute agrave -79
+KPX Yacute amacron -79
+KPX Yacute aogonek -79
+KPX Yacute aring -79
+KPX Yacute atilde -79
+KPX Yacute colon -35
+KPX Yacute comma -109
+KPX Yacute e -78
+KPX Yacute eacute -78
+KPX Yacute ecaron -78
+KPX Yacute ecircumflex -78
+KPX Yacute edieresis -78
+KPX Yacute edotaccent -78
+KPX Yacute egrave -78
+KPX Yacute emacron -78
+KPX Yacute eogonek -78
+KPX Yacute hyphen 20
+KPX Yacute i -11
+KPX Yacute iacute -11
+KPX Yacute iogonek -11
+KPX Yacute o -75
+KPX Yacute oacute -75
+KPX Yacute ocircumflex -75
+KPX Yacute odieresis -75
+KPX Yacute ograve -75
+KPX Yacute ohungarumlaut -75
+KPX Yacute omacron -75
+KPX Yacute oslash -75
+KPX Yacute otilde -75
+KPX Yacute p -37
+KPX Yacute period -100
+KPX Yacute q -72
+KPX Yacute semicolon -40
+KPX Yacute u -31
+KPX Yacute uacute -31
+KPX Yacute ucircumflex -31
+KPX Yacute udieresis -31
+KPX Yacute ugrave -31
+KPX Yacute uhungarumlaut -31
+KPX Yacute umacron -31
+KPX Yacute uogonek -31
+KPX Yacute uring -31
+KPX Yacute v -19
+KPX Ydieresis A -82
+KPX Ydieresis Aacute -82
+KPX Ydieresis Abreve -82
+KPX Ydieresis Acircumflex -82
+KPX Ydieresis Adieresis -82
+KPX Ydieresis Agrave -82
+KPX Ydieresis Amacron -82
+KPX Ydieresis Aogonek -82
+KPX Ydieresis Aring -82
+KPX Ydieresis Atilde -82
+KPX Ydieresis a -79
+KPX Ydieresis aacute -79
+KPX Ydieresis abreve -79
+KPX Ydieresis acircumflex -79
+KPX Ydieresis adieresis -79
+KPX Ydieresis agrave -79
+KPX Ydieresis amacron -79
+KPX Ydieresis aogonek -79
+KPX Ydieresis aring -79
+KPX Ydieresis atilde -79
+KPX Ydieresis colon -35
+KPX Ydieresis comma -109
+KPX Ydieresis e -78
+KPX Ydieresis eacute -78
+KPX Ydieresis ecaron -78
+KPX Ydieresis ecircumflex -78
+KPX Ydieresis edieresis -78
+KPX Ydieresis edotaccent -78
+KPX Ydieresis egrave -78
+KPX Ydieresis emacron -78
+KPX Ydieresis eogonek -78
+KPX Ydieresis hyphen 20
+KPX Ydieresis i -11
+KPX Ydieresis iacute -11
+KPX Ydieresis iogonek -11
+KPX Ydieresis o -75
+KPX Ydieresis oacute -75
+KPX Ydieresis ocircumflex -75
+KPX Ydieresis odieresis -75
+KPX Ydieresis ograve -75
+KPX Ydieresis ohungarumlaut -75
+KPX Ydieresis omacron -75
+KPX Ydieresis oslash -75
+KPX Ydieresis otilde -75
+KPX Ydieresis p -37
+KPX Ydieresis period -100
+KPX Ydieresis q -72
+KPX Ydieresis semicolon -40
+KPX Ydieresis u -31
+KPX Ydieresis uacute -31
+KPX Ydieresis ucircumflex -31
+KPX Ydieresis udieresis -31
+KPX Ydieresis ugrave -31
+KPX Ydieresis uhungarumlaut -31
+KPX Ydieresis umacron -31
+KPX Ydieresis uogonek -31
+KPX Ydieresis uring -31
+KPX Ydieresis v -19
+KPX f f -19
+KPX r c -8
+KPX r cacute -8
+KPX r ccaron -8
+KPX r ccedilla -8
+KPX r comma -143
+KPX r d -9
+KPX r dcroat -9
+KPX r e -15
+KPX r eacute -15
+KPX r ecaron -15
+KPX r ecircumflex -15
+KPX r edieresis -15
+KPX r edotaccent -15
+KPX r egrave -15
+KPX r emacron -15
+KPX r eogonek -15
+KPX r f -9
+KPX r g -3
+KPX r gbreve -3
+KPX r gcommaaccent -3
+KPX r h -20
+KPX r hyphen 20
+KPX r m 37
+KPX r n 38
+KPX r nacute 38
+KPX r ncaron 38
+KPX r ncommaaccent 38
+KPX r ntilde 38
+KPX r o -10
+KPX r oacute -10
+KPX r ocircumflex -10
+KPX r odieresis -10
+KPX r ograve -10
+KPX r ohungarumlaut -10
+KPX r omacron -10
+KPX r oslash -10
+KPX r otilde -10
+KPX r period -134
+KPX r q -14
+KPX racute c -8
+KPX racute cacute -8
+KPX racute ccaron -8
+KPX racute ccedilla -8
+KPX racute comma -143
+KPX racute d -9
+KPX racute dcroat -9
+KPX racute e -15
+KPX racute eacute -15
+KPX racute ecaron -15
+KPX racute ecircumflex -15
+KPX racute edieresis -15
+KPX racute edotaccent -15
+KPX racute egrave -15
+KPX racute emacron -15
+KPX racute eogonek -15
+KPX racute f -9
+KPX racute g -3
+KPX racute gbreve -3
+KPX racute gcommaaccent -3
+KPX racute h -20
+KPX racute hyphen 20
+KPX racute m 37
+KPX racute n 38
+KPX racute nacute 38
+KPX racute ncaron 38
+KPX racute ncommaaccent 38
+KPX racute ntilde 38
+KPX racute o -10
+KPX racute oacute -10
+KPX racute ocircumflex -10
+KPX racute odieresis -10
+KPX racute ograve -10
+KPX racute ohungarumlaut -10
+KPX racute omacron -10
+KPX racute oslash -10
+KPX racute otilde -10
+KPX racute period -134
+KPX racute q -14
+KPX rcaron c -8
+KPX rcaron cacute -8
+KPX rcaron ccaron -8
+KPX rcaron ccedilla -8
+KPX rcaron comma -143
+KPX rcaron d -9
+KPX rcaron dcroat -9
+KPX rcaron e -15
+KPX rcaron eacute -15
+KPX rcaron ecaron -15
+KPX rcaron ecircumflex -15
+KPX rcaron edieresis -15
+KPX rcaron edotaccent -15
+KPX rcaron egrave -15
+KPX rcaron emacron -15
+KPX rcaron eogonek -15
+KPX rcaron f -9
+KPX rcaron g -3
+KPX rcaron gbreve -3
+KPX rcaron gcommaaccent -3
+KPX rcaron h -20
+KPX rcaron hyphen 20
+KPX rcaron m 37
+KPX rcaron n 38
+KPX rcaron nacute 38
+KPX rcaron ncaron 38
+KPX rcaron ncommaaccent 38
+KPX rcaron ntilde 38
+KPX rcaron o -10
+KPX rcaron oacute -10
+KPX rcaron ocircumflex -10
+KPX rcaron odieresis -10
+KPX rcaron ograve -10
+KPX rcaron ohungarumlaut -10
+KPX rcaron omacron -10
+KPX rcaron oslash -10
+KPX rcaron otilde -10
+KPX rcaron period -134
+KPX rcaron q -14
+KPX rcommaaccent c -8
+KPX rcommaaccent cacute -8
+KPX rcommaaccent ccaron -8
+KPX rcommaaccent ccedilla -8
+KPX rcommaaccent comma -143
+KPX rcommaaccent d -9
+KPX rcommaaccent dcroat -9
+KPX rcommaaccent e -15
+KPX rcommaaccent eacute -15
+KPX rcommaaccent ecaron -15
+KPX rcommaaccent ecircumflex -15
+KPX rcommaaccent edieresis -15
+KPX rcommaaccent edotaccent -15
+KPX rcommaaccent egrave -15
+KPX rcommaaccent emacron -15
+KPX rcommaaccent eogonek -15
+KPX rcommaaccent f -9
+KPX rcommaaccent g -3
+KPX rcommaaccent gbreve -3
+KPX rcommaaccent gcommaaccent -3
+KPX rcommaaccent h -20
+KPX rcommaaccent hyphen 20
+KPX rcommaaccent m 37
+KPX rcommaaccent n 38
+KPX rcommaaccent nacute 38
+KPX rcommaaccent ncaron 38
+KPX rcommaaccent ncommaaccent 38
+KPX rcommaaccent ntilde 38
+KPX rcommaaccent o -10
+KPX rcommaaccent oacute -10
+KPX rcommaaccent ocircumflex -10
+KPX rcommaaccent odieresis -10
+KPX rcommaaccent ograve -10
+KPX rcommaaccent ohungarumlaut -10
+KPX rcommaaccent omacron -10
+KPX rcommaaccent oslash -10
+KPX rcommaaccent otilde -10
+KPX rcommaaccent period -134
+KPX rcommaaccent q -14
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/src/fonts/Adobe-Core35_AFMs-314/ITCZapfChancery-MediumItalic.afm b/src/fonts/Adobe-Core35_AFMs-314/ITCZapfChancery-MediumItalic.afm
new file mode 100644
index 0000000..90a731a
--- /dev/null
+++ b/src/fonts/Adobe-Core35_AFMs-314/ITCZapfChancery-MediumItalic.afm
@@ -0,0 +1,1551 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Thu May 1 15:04:18 1997
+Comment UniqueID 43081
+Comment VMusage 45650 56675
+FontName ZapfChancery-MediumItalic
+FullName ITC Zapf Chancery Medium Italic
+FamilyName ITC Zapf Chancery
+Weight Medium
+ItalicAngle -14
+IsFixedPitch false
+FontBBox -181 -314 1065 831
+UnderlinePosition -100
+UnderlineThickness 50
+Version 002.000
+Notice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.ITC Zapf Chancery is a registered trademark of International Typeface Corporation.
+EncodingScheme AdobeStandardEncoding
+CapHeight 708
+XHeight 438
+Ascender 714
+Descender -314
+StdHW 34
+StdVW 70
+StartCharMetrics 314
+C 32 ; WX 220 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 280 ; N exclam ; B 119 -14 353 610 ;
+C 34 ; WX 220 ; N quotedbl ; B 120 343 333 610 ;
+C 35 ; WX 440 ; N numbersign ; B 83 0 521 594 ;
+C 36 ; WX 440 ; N dollar ; B 60 -144 508 709 ;
+C 37 ; WX 680 ; N percent ; B 132 -160 710 700 ;
+C 38 ; WX 780 ; N ampersand ; B 126 -16 915 610 ;
+C 39 ; WX 240 ; N quoteright ; B 168 343 338 610 ;
+C 40 ; WX 260 ; N parenleft ; B 96 -216 411 664 ;
+C 41 ; WX 220 ; N parenright ; B -13 -216 302 664 ;
+C 42 ; WX 420 ; N asterisk ; B 139 263 479 610 ;
+C 43 ; WX 520 ; N plus ; B 117 0 543 426 ;
+C 44 ; WX 220 ; N comma ; B 25 -140 213 148 ;
+C 45 ; WX 280 ; N hyphen ; B 69 190 334 248 ;
+C 46 ; WX 220 ; N period ; B 102 -14 228 128 ;
+C 47 ; WX 340 ; N slash ; B 74 -16 458 610 ;
+C 48 ; WX 440 ; N zero ; B 79 -16 538 610 ;
+C 49 ; WX 440 ; N one ; B 41 0 428 610 ;
+C 50 ; WX 440 ; N two ; B 17 -16 485 610 ;
+C 51 ; WX 440 ; N three ; B 1 -16 485 610 ;
+C 52 ; WX 440 ; N four ; B 77 -35 499 610 ;
+C 53 ; WX 440 ; N five ; B 60 -16 595 679 ;
+C 54 ; WX 440 ; N six ; B 90 -16 556 610 ;
+C 55 ; WX 440 ; N seven ; B 157 -33 561 645 ;
+C 56 ; WX 440 ; N eight ; B 65 -16 529 610 ;
+C 57 ; WX 440 ; N nine ; B 32 -16 517 610 ;
+C 58 ; WX 260 ; N colon ; B 98 -14 296 438 ;
+C 59 ; WX 240 ; N semicolon ; B 29 -140 299 438 ;
+C 60 ; WX 520 ; N less ; B 139 0 527 468 ;
+C 61 ; WX 520 ; N equal ; B 117 86 543 340 ;
+C 62 ; WX 520 ; N greater ; B 139 0 527 468 ;
+C 63 ; WX 380 ; N question ; B 150 -14 455 610 ;
+C 64 ; WX 700 ; N at ; B 127 -16 753 610 ;
+C 65 ; WX 620 ; N A ; B 13 -16 697 632 ;
+C 66 ; WX 600 ; N B ; B 85 -6 674 640 ;
+C 67 ; WX 520 ; N C ; B 93 -16 631 610 ;
+C 68 ; WX 700 ; N D ; B 86 -6 768 640 ;
+C 69 ; WX 620 ; N E ; B 91 -12 709 618 ;
+C 70 ; WX 580 ; N F ; B 120 -118 793 629 ;
+C 71 ; WX 620 ; N G ; B 148 -242 709 610 ;
+C 72 ; WX 680 ; N H ; B 18 -16 878 708 ;
+C 73 ; WX 380 ; N I ; B 99 0 504 594 ;
+C 74 ; WX 400 ; N J ; B -14 -147 538 594 ;
+C 75 ; WX 660 ; N K ; B 53 -153 844 610 ;
+C 76 ; WX 580 ; N L ; B 53 -16 657 610 ;
+C 77 ; WX 840 ; N M ; B 58 -16 1020 722 ;
+C 78 ; WX 700 ; N N ; B 85 -168 915 708 ;
+C 79 ; WX 600 ; N O ; B 94 -16 660 610 ;
+C 80 ; WX 540 ; N P ; B 42 0 658 628 ;
+C 81 ; WX 600 ; N Q ; B 84 -177 775 610 ;
+C 82 ; WX 600 ; N R ; B 58 -168 805 640 ;
+C 83 ; WX 460 ; N S ; B 45 -81 558 610 ;
+C 84 ; WX 500 ; N T ; B 63 0 744 667 ;
+C 85 ; WX 740 ; N U ; B 126 -16 792 617 ;
+C 86 ; WX 640 ; N V ; B 124 -16 810 714 ;
+C 87 ; WX 880 ; N W ; B 94 -16 1046 723 ;
+C 88 ; WX 560 ; N X ; B -30 -16 699 610 ;
+C 89 ; WX 560 ; N Y ; B 41 -168 774 647 ;
+C 90 ; WX 620 ; N Z ; B 42 -19 669 624 ;
+C 91 ; WX 240 ; N bracketleft ; B -13 -207 405 655 ;
+C 92 ; WX 480 ; N backslash ; B 140 -16 524 610 ;
+C 93 ; WX 320 ; N bracketright ; B -27 -207 391 655 ;
+C 94 ; WX 520 ; N asciicircum ; B 132 239 532 594 ;
+C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;
+C 96 ; WX 240 ; N quoteleft ; B 169 343 339 610 ;
+C 97 ; WX 420 ; N a ; B 92 -15 485 438 ;
+C 98 ; WX 420 ; N b ; B 82 -23 492 714 ;
+C 99 ; WX 340 ; N c ; B 87 -14 406 438 ;
+C 100 ; WX 440 ; N d ; B 102 -14 651 714 ;
+C 101 ; WX 340 ; N e ; B 87 -14 403 438 ;
+C 102 ; WX 320 ; N f ; B -119 -314 547 714 ; L i fi ; L l fl ;
+C 103 ; WX 400 ; N g ; B -108 -314 503 438 ;
+C 104 ; WX 440 ; N h ; B 55 -14 524 714 ;
+C 105 ; WX 240 ; N i ; B 100 -14 341 635 ;
+C 106 ; WX 220 ; N j ; B -112 -314 332 635 ;
+C 107 ; WX 440 ; N k ; B 87 -184 628 714 ;
+C 108 ; WX 240 ; N l ; B 102 -14 480 714 ;
+C 109 ; WX 620 ; N m ; B 86 -14 704 438 ;
+C 110 ; WX 460 ; N n ; B 101 -14 544 438 ;
+C 111 ; WX 400 ; N o ; B 87 -14 449 438 ;
+C 112 ; WX 440 ; N p ; B -23 -314 484 432 ;
+C 113 ; WX 400 ; N q ; B 87 -300 490 510 ;
+C 114 ; WX 300 ; N r ; B 101 -14 424 438 ;
+C 115 ; WX 320 ; N s ; B 46 -14 403 438 ;
+C 116 ; WX 320 ; N t ; B 106 -14 426 539 ;
+C 117 ; WX 460 ; N u ; B 102 -14 528 438 ;
+C 118 ; WX 440 ; N v ; B 87 -14 533 488 ;
+C 119 ; WX 680 ; N w ; B 87 -14 782 488 ;
+C 120 ; WX 420 ; N x ; B 70 -195 589 438 ;
+C 121 ; WX 400 ; N y ; B -24 -314 483 438 ;
+C 122 ; WX 440 ; N z ; B 26 -14 508 445 ;
+C 123 ; WX 240 ; N braceleft ; B 55 -207 383 655 ;
+C 124 ; WX 520 ; N bar ; B 320 -250 378 750 ;
+C 125 ; WX 240 ; N braceright ; B -10 -207 318 655 ;
+C 126 ; WX 520 ; N asciitilde ; B 123 186 539 320 ;
+C 161 ; WX 280 ; N exclamdown ; B 72 -186 306 438 ;
+C 162 ; WX 440 ; N cent ; B 122 -134 476 543 ;
+C 163 ; WX 440 ; N sterling ; B -16 -52 506 610 ;
+C 164 ; WX 60 ; N fraction ; B -181 -16 320 610 ;
+C 165 ; WX 440 ; N yen ; B -1 -168 613 647 ;
+C 166 ; WX 440 ; N florin ; B -64 -314 582 610 ;
+C 167 ; WX 420 ; N section ; B 53 -215 514 610 ;
+C 168 ; WX 440 ; N currency ; B 50 85 474 509 ;
+C 169 ; WX 160 ; N quotesingle ; B 145 343 215 610 ;
+C 170 ; WX 340 ; N quotedblleft ; B 169 343 464 610 ;
+C 171 ; WX 340 ; N guillemotleft ; B 98 24 356 414 ;
+C 172 ; WX 240 ; N guilsinglleft ; B 98 24 258 414 ;
+C 173 ; WX 260 ; N guilsinglright ; B 106 24 266 414 ;
+C 174 ; WX 520 ; N fi ; B -124 -314 605 714 ;
+C 175 ; WX 520 ; N fl ; B -124 -314 670 714 ;
+C 177 ; WX 500 ; N endash ; B 51 199 565 239 ;
+C 178 ; WX 460 ; N dagger ; B 138 -37 568 610 ;
+C 179 ; WX 480 ; N daggerdbl ; B 138 -59 533 610 ;
+C 180 ; WX 220 ; N periodcentered ; B 139 208 241 310 ;
+C 182 ; WX 500 ; N paragraph ; B 105 -199 638 594 ;
+C 183 ; WX 600 ; N bullet ; B 228 149 524 445 ;
+C 184 ; WX 180 ; N quotesinglbase ; B 21 -121 191 146 ;
+C 185 ; WX 280 ; N quotedblbase ; B -14 -121 281 146 ;
+C 186 ; WX 360 ; N quotedblright ; B 158 343 453 610 ;
+C 187 ; WX 380 ; N guillemotright ; B 117 24 375 414 ;
+C 188 ; WX 1000 ; N ellipsis ; B 124 -14 916 128 ;
+C 189 ; WX 960 ; N perthousand ; B 112 -160 1005 700 ;
+C 191 ; WX 400 ; N questiondown ; B 82 -186 387 438 ;
+C 193 ; WX 220 ; N grave ; B 193 492 339 659 ;
+C 194 ; WX 300 ; N acute ; B 265 492 422 659 ;
+C 195 ; WX 340 ; N circumflex ; B 223 482 443 649 ;
+C 196 ; WX 440 ; N tilde ; B 243 543 522 619 ;
+C 197 ; WX 440 ; N macron ; B 292 544 537 584 ;
+C 198 ; WX 440 ; N breve ; B 253 522 501 631 ;
+C 199 ; WX 220 ; N dotaccent ; B 236 515 342 635 ;
+C 200 ; WX 360 ; N dieresis ; B 233 515 503 635 ;
+C 202 ; WX 300 ; N ring ; B 240 483 416 659 ;
+C 203 ; WX 300 ; N cedilla ; B 12 -191 184 6 ;
+C 205 ; WX 400 ; N hungarumlaut ; B 208 492 495 659 ;
+C 206 ; WX 280 ; N ogonek ; B 114 -191 320 40 ;
+C 207 ; WX 340 ; N caron ; B 254 492 474 659 ;
+C 208 ; WX 1000 ; N emdash ; B 51 199 1065 239 ;
+C 225 ; WX 740 ; N AE ; B -21 -16 799 594 ;
+C 227 ; WX 260 ; N ordfeminine ; B 111 338 386 610 ;
+C 232 ; WX 580 ; N Lslash ; B 49 -16 657 610 ;
+C 233 ; WX 660 ; N Oslash ; B 83 -78 751 672 ;
+C 234 ; WX 820 ; N OE ; B 63 -16 909 610 ;
+C 235 ; WX 260 ; N ordmasculine ; B 128 339 373 610 ;
+C 241 ; WX 540 ; N ae ; B 67 -14 624 468 ;
+C 245 ; WX 240 ; N dotlessi ; B 100 -14 306 438 ;
+C 248 ; WX 300 ; N lslash ; B 74 -14 480 714 ;
+C 249 ; WX 440 ; N oslash ; B 46 -64 540 488 ;
+C 250 ; WX 560 ; N oe ; B 78 -14 628 438 ;
+C 251 ; WX 420 ; N germandbls ; B -127 -314 542 714 ;
+C -1 ; WX 380 ; N Idieresis ; B 99 0 553 762 ;
+C -1 ; WX 340 ; N eacute ; B 87 -14 462 659 ;
+C -1 ; WX 420 ; N abreve ; B 92 -15 501 631 ;
+C -1 ; WX 460 ; N uhungarumlaut ; B 102 -14 565 659 ;
+C -1 ; WX 340 ; N ecaron ; B 87 -14 474 659 ;
+C -1 ; WX 560 ; N Ydieresis ; B 41 -168 774 762 ;
+C -1 ; WX 520 ; N divide ; B 117 -14 543 440 ;
+C -1 ; WX 560 ; N Yacute ; B 41 -168 774 821 ;
+C -1 ; WX 620 ; N Acircumflex ; B 13 -16 697 821 ;
+C -1 ; WX 420 ; N aacute ; B 92 -15 492 659 ;
+C -1 ; WX 740 ; N Ucircumflex ; B 126 -16 792 821 ;
+C -1 ; WX 400 ; N yacute ; B -24 -314 483 659 ;
+C -1 ; WX 320 ; N scommaaccent ; B 42 -304 403 438 ;
+C -1 ; WX 340 ; N ecircumflex ; B 87 -14 433 649 ;
+C -1 ; WX 740 ; N Uring ; B 126 -16 792 831 ;
+C -1 ; WX 740 ; N Udieresis ; B 126 -16 792 762 ;
+C -1 ; WX 420 ; N aogonek ; B 92 -191 485 438 ;
+C -1 ; WX 740 ; N Uacute ; B 126 -16 792 821 ;
+C -1 ; WX 460 ; N uogonek ; B 102 -178 528 438 ;
+C -1 ; WX 620 ; N Edieresis ; B 91 -12 709 762 ;
+C -1 ; WX 700 ; N Dcroat ; B 86 -6 768 640 ;
+C -1 ; WX 180 ; N commaaccent ; B 52 -304 201 -72 ;
+C -1 ; WX 740 ; N copyright ; B 137 -16 763 610 ;
+C -1 ; WX 620 ; N Emacron ; B 91 -12 709 746 ;
+C -1 ; WX 340 ; N ccaron ; B 87 -14 474 659 ;
+C -1 ; WX 420 ; N aring ; B 92 -15 485 659 ;
+C -1 ; WX 700 ; N Ncommaaccent ; B 85 -274 915 708 ;
+C -1 ; WX 240 ; N lacute ; B 102 -14 522 831 ;
+C -1 ; WX 420 ; N agrave ; B 92 -15 485 659 ;
+C -1 ; WX 500 ; N Tcommaaccent ; B 63 -304 744 667 ;
+C -1 ; WX 520 ; N Cacute ; B 93 -16 631 821 ;
+C -1 ; WX 420 ; N atilde ; B 92 -15 522 619 ;
+C -1 ; WX 620 ; N Edotaccent ; B 91 -12 709 762 ;
+C -1 ; WX 320 ; N scaron ; B 46 -14 464 659 ;
+C -1 ; WX 320 ; N scedilla ; B 42 -191 403 438 ;
+C -1 ; WX 240 ; N iacute ; B 100 -14 392 659 ;
+C -1 ; WX 471 ; N lozenge ; B 15 0 457 719 ;
+C -1 ; WX 600 ; N Rcaron ; B 58 -168 805 821 ;
+C -1 ; WX 620 ; N Gcommaaccent ; B 148 -304 709 610 ;
+C -1 ; WX 460 ; N ucircumflex ; B 102 -14 528 649 ;
+C -1 ; WX 420 ; N acircumflex ; B 92 -15 485 649 ;
+C -1 ; WX 620 ; N Amacron ; B 13 -16 717 746 ;
+C -1 ; WX 300 ; N rcaron ; B 101 -14 444 659 ;
+C -1 ; WX 340 ; N ccedilla ; B 62 -191 406 438 ;
+C -1 ; WX 620 ; N Zdotaccent ; B 42 -19 669 762 ;
+C -1 ; WX 540 ; N Thorn ; B 52 0 647 623 ;
+C -1 ; WX 600 ; N Omacron ; B 94 -16 660 746 ;
+C -1 ; WX 600 ; N Racute ; B 58 -168 805 821 ;
+C -1 ; WX 460 ; N Sacute ; B 45 -81 558 821 ;
+C -1 ; WX 490 ; N dcaron ; B 102 -14 651 714 ;
+C -1 ; WX 740 ; N Umacron ; B 126 -16 792 746 ;
+C -1 ; WX 460 ; N uring ; B 102 -14 528 659 ;
+C -1 ; WX 264 ; N threesuperior ; B 59 234 348 610 ;
+C -1 ; WX 600 ; N Ograve ; B 94 -16 660 821 ;
+C -1 ; WX 620 ; N Agrave ; B 13 -16 697 821 ;
+C -1 ; WX 620 ; N Abreve ; B 13 -16 761 793 ;
+C -1 ; WX 520 ; N multiply ; B 133 16 527 410 ;
+C -1 ; WX 460 ; N uacute ; B 102 -14 528 659 ;
+C -1 ; WX 500 ; N Tcaron ; B 63 0 744 821 ;
+C -1 ; WX 476 ; N partialdiff ; B 17 -38 459 710 ;
+C -1 ; WX 400 ; N ydieresis ; B -24 -314 503 610 ;
+C -1 ; WX 700 ; N Nacute ; B 85 -168 915 821 ;
+C -1 ; WX 240 ; N icircumflex ; B 100 -14 363 649 ;
+C -1 ; WX 620 ; N Ecircumflex ; B 91 -12 709 821 ;
+C -1 ; WX 420 ; N adieresis ; B 92 -15 513 610 ;
+C -1 ; WX 340 ; N edieresis ; B 87 -14 483 610 ;
+C -1 ; WX 340 ; N cacute ; B 87 -14 452 659 ;
+C -1 ; WX 460 ; N nacute ; B 101 -14 544 659 ;
+C -1 ; WX 460 ; N umacron ; B 102 -14 528 584 ;
+C -1 ; WX 700 ; N Ncaron ; B 85 -168 915 821 ;
+C -1 ; WX 380 ; N Iacute ; B 99 0 532 821 ;
+C -1 ; WX 520 ; N plusminus ; B 117 0 543 436 ;
+C -1 ; WX 520 ; N brokenbar ; B 320 -175 378 675 ;
+C -1 ; WX 740 ; N registered ; B 137 -16 763 610 ;
+C -1 ; WX 620 ; N Gbreve ; B 148 -242 709 793 ;
+C -1 ; WX 380 ; N Idotaccent ; B 99 0 504 762 ;
+C -1 ; WX 600 ; N summation ; B 15 -10 585 706 ;
+C -1 ; WX 620 ; N Egrave ; B 91 -12 709 821 ;
+C -1 ; WX 300 ; N racute ; B 101 -14 442 659 ;
+C -1 ; WX 400 ; N omacron ; B 87 -14 507 584 ;
+C -1 ; WX 620 ; N Zacute ; B 42 -19 669 821 ;
+C -1 ; WX 620 ; N Zcaron ; B 42 -19 669 821 ;
+C -1 ; WX 549 ; N greaterequal ; B 26 0 523 658 ;
+C -1 ; WX 700 ; N Eth ; B 86 -6 768 640 ;
+C -1 ; WX 520 ; N Ccedilla ; B 93 -191 631 610 ;
+C -1 ; WX 240 ; N lcommaaccent ; B 42 -304 480 714 ;
+C -1 ; WX 320 ; N tcaron ; B 106 -14 501 678 ;
+C -1 ; WX 340 ; N eogonek ; B 87 -191 403 438 ;
+C -1 ; WX 740 ; N Uogonek ; B 126 -191 792 617 ;
+C -1 ; WX 620 ; N Aacute ; B 13 -16 702 821 ;
+C -1 ; WX 620 ; N Adieresis ; B 13 -16 743 762 ;
+C -1 ; WX 340 ; N egrave ; B 87 -14 403 659 ;
+C -1 ; WX 440 ; N zacute ; B 26 -14 512 659 ;
+C -1 ; WX 240 ; N iogonek ; B 94 -191 341 635 ;
+C -1 ; WX 600 ; N Oacute ; B 94 -16 660 821 ;
+C -1 ; WX 400 ; N oacute ; B 87 -14 482 659 ;
+C -1 ; WX 420 ; N amacron ; B 92 -15 507 584 ;
+C -1 ; WX 320 ; N sacute ; B 46 -14 442 659 ;
+C -1 ; WX 240 ; N idieresis ; B 100 -14 403 610 ;
+C -1 ; WX 600 ; N Ocircumflex ; B 94 -16 660 821 ;
+C -1 ; WX 740 ; N Ugrave ; B 126 -16 792 821 ;
+C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ;
+C -1 ; WX 440 ; N thorn ; B -38 -314 505 714 ;
+C -1 ; WX 264 ; N twosuperior ; B 72 234 354 610 ;
+C -1 ; WX 600 ; N Odieresis ; B 94 -16 660 762 ;
+C -1 ; WX 460 ; N mu ; B 7 -314 523 438 ;
+C -1 ; WX 240 ; N igrave ; B 100 -14 306 659 ;
+C -1 ; WX 400 ; N ohungarumlaut ; B 87 -14 535 659 ;
+C -1 ; WX 620 ; N Eogonek ; B 91 -191 709 618 ;
+C -1 ; WX 440 ; N dcroat ; B 102 -14 651 714 ;
+C -1 ; WX 660 ; N threequarters ; B 39 -16 706 610 ;
+C -1 ; WX 460 ; N Scedilla ; B 45 -251 558 610 ;
+C -1 ; WX 280 ; N lcaron ; B 102 -14 480 714 ;
+C -1 ; WX 660 ; N Kcommaaccent ; B 53 -274 844 610 ;
+C -1 ; WX 580 ; N Lacute ; B 53 -16 657 821 ;
+C -1 ; WX 1000 ; N trademark ; B 127 187 1046 594 ;
+C -1 ; WX 340 ; N edotaccent ; B 87 -14 403 610 ;
+C -1 ; WX 380 ; N Igrave ; B 99 0 504 821 ;
+C -1 ; WX 380 ; N Imacron ; B 99 0 547 746 ;
+C -1 ; WX 580 ; N Lcaron ; B 53 -16 721 610 ;
+C -1 ; WX 660 ; N onehalf ; B 56 -16 702 610 ;
+C -1 ; WX 549 ; N lessequal ; B 26 0 523 658 ;
+C -1 ; WX 400 ; N ocircumflex ; B 87 -14 453 649 ;
+C -1 ; WX 460 ; N ntilde ; B 101 -14 544 619 ;
+C -1 ; WX 740 ; N Uhungarumlaut ; B 126 -16 792 821 ;
+C -1 ; WX 620 ; N Eacute ; B 91 -12 709 821 ;
+C -1 ; WX 340 ; N emacron ; B 87 -14 477 584 ;
+C -1 ; WX 400 ; N gbreve ; B -108 -314 503 631 ;
+C -1 ; WX 660 ; N onequarter ; B 56 -16 702 610 ;
+C -1 ; WX 460 ; N Scaron ; B 45 -81 594 821 ;
+C -1 ; WX 460 ; N Scommaaccent ; B 45 -314 558 610 ;
+C -1 ; WX 600 ; N Ohungarumlaut ; B 94 -16 660 821 ;
+C -1 ; WX 400 ; N degree ; B 171 324 457 610 ;
+C -1 ; WX 400 ; N ograve ; B 87 -14 449 659 ;
+C -1 ; WX 520 ; N Ccaron ; B 93 -16 631 821 ;
+C -1 ; WX 460 ; N ugrave ; B 102 -14 528 659 ;
+C -1 ; WX 453 ; N radical ; B 2 -60 452 768 ;
+C -1 ; WX 700 ; N Dcaron ; B 86 -6 768 821 ;
+C -1 ; WX 300 ; N rcommaaccent ; B 32 -304 424 438 ;
+C -1 ; WX 700 ; N Ntilde ; B 85 -168 915 781 ;
+C -1 ; WX 400 ; N otilde ; B 87 -14 502 619 ;
+C -1 ; WX 600 ; N Rcommaaccent ; B 58 -304 805 640 ;
+C -1 ; WX 580 ; N Lcommaaccent ; B 53 -304 657 610 ;
+C -1 ; WX 620 ; N Atilde ; B 13 -16 702 781 ;
+C -1 ; WX 620 ; N Aogonek ; B 13 -191 697 632 ;
+C -1 ; WX 620 ; N Aring ; B 13 -16 697 831 ;
+C -1 ; WX 600 ; N Otilde ; B 94 -16 660 781 ;
+C -1 ; WX 440 ; N zdotaccent ; B 26 -14 508 610 ;
+C -1 ; WX 620 ; N Ecaron ; B 91 -12 709 821 ;
+C -1 ; WX 380 ; N Iogonek ; B 99 -191 504 594 ;
+C -1 ; WX 440 ; N kcommaaccent ; B 87 -304 628 714 ;
+C -1 ; WX 520 ; N minus ; B 117 184 543 242 ;
+C -1 ; WX 380 ; N Icircumflex ; B 99 0 504 821 ;
+C -1 ; WX 460 ; N ncaron ; B 101 -14 544 659 ;
+C -1 ; WX 320 ; N tcommaaccent ; B 72 -304 426 539 ;
+C -1 ; WX 520 ; N logicalnot ; B 117 86 543 340 ;
+C -1 ; WX 400 ; N odieresis ; B 87 -14 513 610 ;
+C -1 ; WX 460 ; N udieresis ; B 102 -14 528 610 ;
+C -1 ; WX 549 ; N notequal ; B 12 -29 537 541 ;
+C -1 ; WX 400 ; N gcommaaccent ; B -108 -314 506 714 ;
+C -1 ; WX 400 ; N eth ; B 87 -14 522 714 ;
+C -1 ; WX 440 ; N zcaron ; B 26 -14 514 659 ;
+C -1 ; WX 460 ; N ncommaaccent ; B 101 -304 544 438 ;
+C -1 ; WX 264 ; N onesuperior ; B 83 244 311 610 ;
+C -1 ; WX 240 ; N imacron ; B 100 -14 330 584 ;
+EndCharMetrics
+StartKernData
+StartKernPairs 1207
+KPX A C 20
+KPX A Cacute 20
+KPX A Ccaron 20
+KPX A Ccedilla 20
+KPX A G -30
+KPX A Gbreve -30
+KPX A Gcommaaccent -30
+KPX A O 10
+KPX A Oacute 10
+KPX A Ocircumflex 10
+KPX A Odieresis 10
+KPX A Ograve 10
+KPX A Ohungarumlaut 10
+KPX A Omacron 10
+KPX A Oslash 10
+KPX A Otilde 10
+KPX A Q 10
+KPX A T 10
+KPX A Tcaron 10
+KPX A Tcommaaccent 10
+KPX A U -10
+KPX A Uacute -10
+KPX A Ucircumflex -10
+KPX A Udieresis -10
+KPX A Ugrave -10
+KPX A Uhungarumlaut -10
+KPX A Umacron -10
+KPX A Uogonek -10
+KPX A Uring -10
+KPX A quotedblright -40
+KPX A quoteright -40
+KPX Aacute C 20
+KPX Aacute Cacute 20
+KPX Aacute Ccaron 20
+KPX Aacute Ccedilla 20
+KPX Aacute G -30
+KPX Aacute Gbreve -30
+KPX Aacute Gcommaaccent -30
+KPX Aacute O 10
+KPX Aacute Oacute 10
+KPX Aacute Ocircumflex 10
+KPX Aacute Odieresis 10
+KPX Aacute Ograve 10
+KPX Aacute Ohungarumlaut 10
+KPX Aacute Omacron 10
+KPX Aacute Oslash 10
+KPX Aacute Otilde 10
+KPX Aacute Q 10
+KPX Aacute T 10
+KPX Aacute Tcaron 10
+KPX Aacute Tcommaaccent 10
+KPX Aacute U -10
+KPX Aacute Uacute -10
+KPX Aacute Ucircumflex -10
+KPX Aacute Udieresis -10
+KPX Aacute Ugrave -10
+KPX Aacute Uhungarumlaut -10
+KPX Aacute Umacron -10
+KPX Aacute Uogonek -10
+KPX Aacute Uring -10
+KPX Abreve C 20
+KPX Abreve Cacute 20
+KPX Abreve Ccaron 20
+KPX Abreve Ccedilla 20
+KPX Abreve G -30
+KPX Abreve Gbreve -30
+KPX Abreve Gcommaaccent -30
+KPX Abreve O 10
+KPX Abreve Oacute 10
+KPX Abreve Ocircumflex 10
+KPX Abreve Odieresis 10
+KPX Abreve Ograve 10
+KPX Abreve Ohungarumlaut 10
+KPX Abreve Omacron 10
+KPX Abreve Oslash 10
+KPX Abreve Otilde 10
+KPX Abreve Q 10
+KPX Abreve T 10
+KPX Abreve Tcaron 10
+KPX Abreve Tcommaaccent 10
+KPX Abreve U -10
+KPX Abreve Uacute -10
+KPX Abreve Ucircumflex -10
+KPX Abreve Udieresis -10
+KPX Abreve Ugrave -10
+KPX Abreve Uhungarumlaut -10
+KPX Abreve Umacron -10
+KPX Abreve Uogonek -10
+KPX Abreve Uring -10
+KPX Acircumflex C 20
+KPX Acircumflex Cacute 20
+KPX Acircumflex Ccaron 20
+KPX Acircumflex Ccedilla 20
+KPX Acircumflex G -30
+KPX Acircumflex Gbreve -30
+KPX Acircumflex Gcommaaccent -30
+KPX Acircumflex O 10
+KPX Acircumflex Oacute 10
+KPX Acircumflex Ocircumflex 10
+KPX Acircumflex Odieresis 10
+KPX Acircumflex Ograve 10
+KPX Acircumflex Ohungarumlaut 10
+KPX Acircumflex Omacron 10
+KPX Acircumflex Oslash 10
+KPX Acircumflex Otilde 10
+KPX Acircumflex Q 10
+KPX Acircumflex T 10
+KPX Acircumflex Tcaron 10
+KPX Acircumflex Tcommaaccent 10
+KPX Acircumflex U -10
+KPX Acircumflex Uacute -10
+KPX Acircumflex Ucircumflex -10
+KPX Acircumflex Udieresis -10
+KPX Acircumflex Ugrave -10
+KPX Acircumflex Uhungarumlaut -10
+KPX Acircumflex Umacron -10
+KPX Acircumflex Uogonek -10
+KPX Acircumflex Uring -10
+KPX Adieresis C 20
+KPX Adieresis Cacute 20
+KPX Adieresis Ccaron 20
+KPX Adieresis Ccedilla 20
+KPX Adieresis G -30
+KPX Adieresis Gbreve -30
+KPX Adieresis Gcommaaccent -30
+KPX Adieresis O 10
+KPX Adieresis Oacute 10
+KPX Adieresis Ocircumflex 10
+KPX Adieresis Odieresis 10
+KPX Adieresis Ograve 10
+KPX Adieresis Ohungarumlaut 10
+KPX Adieresis Omacron 10
+KPX Adieresis Oslash 10
+KPX Adieresis Otilde 10
+KPX Adieresis Q 10
+KPX Adieresis T 10
+KPX Adieresis Tcaron 10
+KPX Adieresis Tcommaaccent 10
+KPX Adieresis U -10
+KPX Adieresis Uacute -10
+KPX Adieresis Ucircumflex -10
+KPX Adieresis Udieresis -10
+KPX Adieresis Ugrave -10
+KPX Adieresis Uhungarumlaut -10
+KPX Adieresis Umacron -10
+KPX Adieresis Uogonek -10
+KPX Adieresis Uring -10
+KPX Agrave C 20
+KPX Agrave Cacute 20
+KPX Agrave Ccaron 20
+KPX Agrave Ccedilla 20
+KPX Agrave G -30
+KPX Agrave Gbreve -30
+KPX Agrave Gcommaaccent -30
+KPX Agrave O 10
+KPX Agrave Oacute 10
+KPX Agrave Ocircumflex 10
+KPX Agrave Odieresis 10
+KPX Agrave Ograve 10
+KPX Agrave Ohungarumlaut 10
+KPX Agrave Omacron 10
+KPX Agrave Oslash 10
+KPX Agrave Otilde 10
+KPX Agrave Q 10
+KPX Agrave T 10
+KPX Agrave Tcaron 10
+KPX Agrave Tcommaaccent 10
+KPX Agrave U -10
+KPX Agrave Uacute -10
+KPX Agrave Ucircumflex -10
+KPX Agrave Udieresis -10
+KPX Agrave Ugrave -10
+KPX Agrave Uhungarumlaut -10
+KPX Agrave Umacron -10
+KPX Agrave Uogonek -10
+KPX Agrave Uring -10
+KPX Amacron C 20
+KPX Amacron Cacute 20
+KPX Amacron Ccaron 20
+KPX Amacron Ccedilla 20
+KPX Amacron G -30
+KPX Amacron Gbreve -30
+KPX Amacron Gcommaaccent -30
+KPX Amacron O 10
+KPX Amacron Oacute 10
+KPX Amacron Ocircumflex 10
+KPX Amacron Odieresis 10
+KPX Amacron Ograve 10
+KPX Amacron Ohungarumlaut 10
+KPX Amacron Omacron 10
+KPX Amacron Oslash 10
+KPX Amacron Otilde 10
+KPX Amacron Q 10
+KPX Amacron T 10
+KPX Amacron Tcaron 10
+KPX Amacron Tcommaaccent 10
+KPX Amacron U -10
+KPX Amacron Uacute -10
+KPX Amacron Ucircumflex -10
+KPX Amacron Udieresis -10
+KPX Amacron Ugrave -10
+KPX Amacron Uhungarumlaut -10
+KPX Amacron Umacron -10
+KPX Amacron Uogonek -10
+KPX Amacron Uring -10
+KPX Aogonek C 20
+KPX Aogonek Cacute 20
+KPX Aogonek Ccaron 20
+KPX Aogonek Ccedilla 20
+KPX Aogonek G -30
+KPX Aogonek Gbreve -30
+KPX Aogonek Gcommaaccent -30
+KPX Aogonek O 10
+KPX Aogonek Oacute 10
+KPX Aogonek Ocircumflex 10
+KPX Aogonek Odieresis 10
+KPX Aogonek Ograve 10
+KPX Aogonek Ohungarumlaut 10
+KPX Aogonek Omacron 10
+KPX Aogonek Oslash 10
+KPX Aogonek Otilde 10
+KPX Aogonek Q 10
+KPX Aogonek T 10
+KPX Aogonek Tcaron 10
+KPX Aogonek Tcommaaccent 10
+KPX Aogonek U -10
+KPX Aogonek Uacute -10
+KPX Aogonek Ucircumflex -10
+KPX Aogonek Udieresis -10
+KPX Aogonek Ugrave -10
+KPX Aogonek Uhungarumlaut -10
+KPX Aogonek Umacron -10
+KPX Aogonek Uogonek -10
+KPX Aogonek Uring -10
+KPX Aogonek y -10
+KPX Aogonek yacute -10
+KPX Aogonek ydieresis -10
+KPX Aring C 20
+KPX Aring Cacute 20
+KPX Aring Ccaron 20
+KPX Aring Ccedilla 20
+KPX Aring G -30
+KPX Aring Gbreve -30
+KPX Aring Gcommaaccent -30
+KPX Aring O 10
+KPX Aring Oacute 10
+KPX Aring Ocircumflex 10
+KPX Aring Odieresis 10
+KPX Aring Ograve 10
+KPX Aring Ohungarumlaut 10
+KPX Aring Omacron 10
+KPX Aring Oslash 10
+KPX Aring Otilde 10
+KPX Aring Q 10
+KPX Aring T 10
+KPX Aring Tcaron 10
+KPX Aring Tcommaaccent 10
+KPX Aring U -10
+KPX Aring Uacute -10
+KPX Aring Ucircumflex -10
+KPX Aring Udieresis -10
+KPX Aring Ugrave -10
+KPX Aring Uhungarumlaut -10
+KPX Aring Umacron -10
+KPX Aring Uogonek -10
+KPX Aring Uring -10
+KPX Atilde C 20
+KPX Atilde Cacute 20
+KPX Atilde Ccaron 20
+KPX Atilde Ccedilla 20
+KPX Atilde G -30
+KPX Atilde Gbreve -30
+KPX Atilde Gcommaaccent -30
+KPX Atilde O 10
+KPX Atilde Oacute 10
+KPX Atilde Ocircumflex 10
+KPX Atilde Odieresis 10
+KPX Atilde Ograve 10
+KPX Atilde Ohungarumlaut 10
+KPX Atilde Omacron 10
+KPX Atilde Oslash 10
+KPX Atilde Otilde 10
+KPX Atilde Q 10
+KPX Atilde T 10
+KPX Atilde Tcaron 10
+KPX Atilde Tcommaaccent 10
+KPX Atilde U -10
+KPX Atilde Uacute -10
+KPX Atilde Ucircumflex -10
+KPX Atilde Udieresis -10
+KPX Atilde Ugrave -10
+KPX Atilde Uhungarumlaut -10
+KPX Atilde Umacron -10
+KPX Atilde Uogonek -10
+KPX Atilde Uring -10
+KPX D A -10
+KPX D Aacute -10
+KPX D Abreve -10
+KPX D Acircumflex -10
+KPX D Adieresis -10
+KPX D Agrave -10
+KPX D Amacron -10
+KPX D Aogonek -10
+KPX D Aring -10
+KPX D Atilde -10
+KPX D Y 10
+KPX D Yacute 10
+KPX D Ydieresis 10
+KPX D comma -20
+KPX D period -30
+KPX Dcaron A -10
+KPX Dcaron Aacute -10
+KPX Dcaron Abreve -10
+KPX Dcaron Acircumflex -10
+KPX Dcaron Adieresis -10
+KPX Dcaron Agrave -10
+KPX Dcaron Amacron -10
+KPX Dcaron Aogonek -10
+KPX Dcaron Aring -10
+KPX Dcaron Atilde -10
+KPX Dcaron Y 10
+KPX Dcaron Yacute 10
+KPX Dcaron Ydieresis 10
+KPX Dcaron comma -20
+KPX Dcaron period -30
+KPX Dcroat A -10
+KPX Dcroat Aacute -10
+KPX Dcroat Abreve -10
+KPX Dcroat Acircumflex -10
+KPX Dcroat Adieresis -10
+KPX Dcroat Agrave -10
+KPX Dcroat Amacron -10
+KPX Dcroat Aogonek -10
+KPX Dcroat Aring -10
+KPX Dcroat Atilde -10
+KPX Dcroat Y 10
+KPX Dcroat Yacute 10
+KPX Dcroat Ydieresis 10
+KPX Dcroat comma -20
+KPX Dcroat period -30
+KPX F comma -30
+KPX F i 10
+KPX F period -40
+KPX G comma -10
+KPX G period -20
+KPX J comma -10
+KPX J period -20
+KPX K e -20
+KPX K eacute -20
+KPX K ecaron -20
+KPX K ecircumflex -20
+KPX K edieresis -20
+KPX K edotaccent -20
+KPX K egrave -20
+KPX K emacron -20
+KPX K eogonek -20
+KPX K o -20
+KPX K oacute -20
+KPX K ocircumflex -20
+KPX K odieresis -20
+KPX K ograve -20
+KPX K ohungarumlaut -20
+KPX K omacron -20
+KPX K otilde -20
+KPX K u -20
+KPX K uacute -20
+KPX K ucircumflex -20
+KPX K udieresis -20
+KPX K ugrave -20
+KPX K uhungarumlaut -20
+KPX K umacron -20
+KPX K uogonek -20
+KPX K uring -20
+KPX Kcommaaccent e -20
+KPX Kcommaaccent eacute -20
+KPX Kcommaaccent ecaron -20
+KPX Kcommaaccent ecircumflex -20
+KPX Kcommaaccent edieresis -20
+KPX Kcommaaccent edotaccent -20
+KPX Kcommaaccent egrave -20
+KPX Kcommaaccent emacron -20
+KPX Kcommaaccent eogonek -20
+KPX Kcommaaccent o -20
+KPX Kcommaaccent oacute -20
+KPX Kcommaaccent ocircumflex -20
+KPX Kcommaaccent odieresis -20
+KPX Kcommaaccent ograve -20
+KPX Kcommaaccent ohungarumlaut -20
+KPX Kcommaaccent omacron -20
+KPX Kcommaaccent otilde -20
+KPX Kcommaaccent u -20
+KPX Kcommaaccent uacute -20
+KPX Kcommaaccent ucircumflex -20
+KPX Kcommaaccent udieresis -20
+KPX Kcommaaccent ugrave -20
+KPX Kcommaaccent uhungarumlaut -20
+KPX Kcommaaccent umacron -20
+KPX Kcommaaccent uogonek -20
+KPX Kcommaaccent uring -20
+KPX L V -20
+KPX L W -10
+KPX L quotedblright -25
+KPX L quoteright -25
+KPX L y -10
+KPX L yacute -10
+KPX L ydieresis -10
+KPX Lacute V -20
+KPX Lacute W -10
+KPX Lacute quotedblright -25
+KPX Lacute quoteright -25
+KPX Lacute y -10
+KPX Lacute yacute -10
+KPX Lacute ydieresis -10
+KPX Lcommaaccent V -20
+KPX Lcommaaccent W -10
+KPX Lcommaaccent quotedblright -25
+KPX Lcommaaccent quoteright -25
+KPX Lcommaaccent y -10
+KPX Lcommaaccent yacute -10
+KPX Lcommaaccent ydieresis -10
+KPX O A -20
+KPX O Aacute -20
+KPX O Abreve -20
+KPX O Acircumflex -20
+KPX O Adieresis -20
+KPX O Agrave -20
+KPX O Amacron -20
+KPX O Aogonek -20
+KPX O Aring -20
+KPX O Atilde -20
+KPX O T 20
+KPX O Tcaron 20
+KPX O Tcommaaccent 20
+KPX O Y 10
+KPX O Yacute 10
+KPX O Ydieresis 10
+KPX O comma -10
+KPX O period -20
+KPX Oacute A -20
+KPX Oacute Aacute -20
+KPX Oacute Abreve -20
+KPX Oacute Acircumflex -20
+KPX Oacute Adieresis -20
+KPX Oacute Agrave -20
+KPX Oacute Amacron -20
+KPX Oacute Aogonek -20
+KPX Oacute Aring -20
+KPX Oacute Atilde -20
+KPX Oacute T 20
+KPX Oacute Tcaron 20
+KPX Oacute Tcommaaccent 20
+KPX Oacute Y 10
+KPX Oacute Yacute 10
+KPX Oacute Ydieresis 10
+KPX Oacute comma -10
+KPX Oacute period -20
+KPX Ocircumflex A -20
+KPX Ocircumflex Aacute -20
+KPX Ocircumflex Abreve -20
+KPX Ocircumflex Acircumflex -20
+KPX Ocircumflex Adieresis -20
+KPX Ocircumflex Agrave -20
+KPX Ocircumflex Amacron -20
+KPX Ocircumflex Aogonek -20
+KPX Ocircumflex Aring -20
+KPX Ocircumflex Atilde -20
+KPX Ocircumflex T 20
+KPX Ocircumflex Tcaron 20
+KPX Ocircumflex Tcommaaccent 20
+KPX Ocircumflex Y 10
+KPX Ocircumflex Yacute 10
+KPX Ocircumflex Ydieresis 10
+KPX Ocircumflex comma -10
+KPX Ocircumflex period -20
+KPX Odieresis A -20
+KPX Odieresis Aacute -20
+KPX Odieresis Abreve -20
+KPX Odieresis Acircumflex -20
+KPX Odieresis Adieresis -20
+KPX Odieresis Agrave -20
+KPX Odieresis Amacron -20
+KPX Odieresis Aogonek -20
+KPX Odieresis Aring -20
+KPX Odieresis Atilde -20
+KPX Odieresis T 20
+KPX Odieresis Tcaron 20
+KPX Odieresis Tcommaaccent 20
+KPX Odieresis Y 10
+KPX Odieresis Yacute 10
+KPX Odieresis Ydieresis 10
+KPX Odieresis comma -10
+KPX Odieresis period -20
+KPX Ograve A -20
+KPX Ograve Aacute -20
+KPX Ograve Abreve -20
+KPX Ograve Acircumflex -20
+KPX Ograve Adieresis -20
+KPX Ograve Agrave -20
+KPX Ograve Amacron -20
+KPX Ograve Aogonek -20
+KPX Ograve Aring -20
+KPX Ograve Atilde -20
+KPX Ograve T 20
+KPX Ograve Tcaron 20
+KPX Ograve Tcommaaccent 20
+KPX Ograve Y 10
+KPX Ograve Yacute 10
+KPX Ograve Ydieresis 10
+KPX Ograve comma -10
+KPX Ograve period -20
+KPX Ohungarumlaut A -20
+KPX Ohungarumlaut Aacute -20
+KPX Ohungarumlaut Abreve -20
+KPX Ohungarumlaut Acircumflex -20
+KPX Ohungarumlaut Adieresis -20
+KPX Ohungarumlaut Agrave -20
+KPX Ohungarumlaut Amacron -20
+KPX Ohungarumlaut Aogonek -20
+KPX Ohungarumlaut Aring -20
+KPX Ohungarumlaut Atilde -20
+KPX Ohungarumlaut T 20
+KPX Ohungarumlaut Tcaron 20
+KPX Ohungarumlaut Tcommaaccent 20
+KPX Ohungarumlaut Y 10
+KPX Ohungarumlaut Yacute 10
+KPX Ohungarumlaut Ydieresis 10
+KPX Ohungarumlaut comma -10
+KPX Ohungarumlaut period -20
+KPX Omacron A -20
+KPX Omacron Aacute -20
+KPX Omacron Abreve -20
+KPX Omacron Acircumflex -20
+KPX Omacron Adieresis -20
+KPX Omacron Agrave -20
+KPX Omacron Amacron -20
+KPX Omacron Aogonek -20
+KPX Omacron Aring -20
+KPX Omacron Atilde -20
+KPX Omacron T 20
+KPX Omacron Tcaron 20
+KPX Omacron Tcommaaccent 20
+KPX Omacron Y 10
+KPX Omacron Yacute 10
+KPX Omacron Ydieresis 10
+KPX Omacron comma -10
+KPX Omacron period -20
+KPX Oslash A -20
+KPX Oslash Aacute -20
+KPX Oslash Abreve -20
+KPX Oslash Acircumflex -20
+KPX Oslash Adieresis -20
+KPX Oslash Agrave -20
+KPX Oslash Amacron -20
+KPX Oslash Aogonek -20
+KPX Oslash Aring -20
+KPX Oslash Atilde -20
+KPX Oslash T 20
+KPX Oslash Tcaron 20
+KPX Oslash Tcommaaccent 20
+KPX Oslash Y 10
+KPX Oslash Yacute 10
+KPX Oslash Ydieresis 10
+KPX Oslash comma -10
+KPX Oslash period -20
+KPX Otilde A -20
+KPX Otilde Aacute -20
+KPX Otilde Abreve -20
+KPX Otilde Acircumflex -20
+KPX Otilde Adieresis -20
+KPX Otilde Agrave -20
+KPX Otilde Amacron -20
+KPX Otilde Aogonek -20
+KPX Otilde Aring -20
+KPX Otilde Atilde -20
+KPX Otilde T 20
+KPX Otilde Tcaron 20
+KPX Otilde Tcommaaccent 20
+KPX Otilde Y 10
+KPX Otilde Yacute 10
+KPX Otilde Ydieresis 10
+KPX Otilde comma -10
+KPX Otilde period -20
+KPX P A -10
+KPX P Aacute -10
+KPX P Abreve -10
+KPX P Acircumflex -10
+KPX P Adieresis -10
+KPX P Agrave -10
+KPX P Amacron -10
+KPX P Aogonek -10
+KPX P Aring -10
+KPX P Atilde -10
+KPX P a -20
+KPX P aacute -20
+KPX P abreve -20
+KPX P acircumflex -20
+KPX P adieresis -20
+KPX P agrave -20
+KPX P amacron -20
+KPX P aogonek -20
+KPX P aring -20
+KPX P atilde -20
+KPX P comma -40
+KPX P e -10
+KPX P eacute -10
+KPX P ecaron -10
+KPX P ecircumflex -10
+KPX P edieresis -10
+KPX P edotaccent -10
+KPX P egrave -10
+KPX P emacron -10
+KPX P eogonek -10
+KPX P o -10
+KPX P oacute -10
+KPX P ocircumflex -10
+KPX P odieresis -10
+KPX P ograve -10
+KPX P ohungarumlaut -10
+KPX P omacron -10
+KPX P otilde -10
+KPX P period -50
+KPX Q U -10
+KPX Q Uacute -10
+KPX Q Ucircumflex -10
+KPX Q Udieresis -10
+KPX Q Ugrave -10
+KPX Q Uhungarumlaut -10
+KPX Q Umacron -10
+KPX Q Uogonek -10
+KPX Q Uring -10
+KPX R T 20
+KPX R Tcaron 20
+KPX R Tcommaaccent 20
+KPX R W 10
+KPX R Y 10
+KPX R Yacute 10
+KPX R Ydieresis 10
+KPX Racute T 20
+KPX Racute Tcaron 20
+KPX Racute Tcommaaccent 20
+KPX Racute W 10
+KPX Racute Y 10
+KPX Racute Yacute 10
+KPX Racute Ydieresis 10
+KPX Rcaron T 20
+KPX Rcaron Tcaron 20
+KPX Rcaron Tcommaaccent 20
+KPX Rcaron W 10
+KPX Rcaron Y 10
+KPX Rcaron Yacute 10
+KPX Rcaron Ydieresis 10
+KPX Rcommaaccent T 20
+KPX Rcommaaccent Tcaron 20
+KPX Rcommaaccent Tcommaaccent 20
+KPX Rcommaaccent W 10
+KPX Rcommaaccent Y 10
+KPX Rcommaaccent Yacute 10
+KPX Rcommaaccent Ydieresis 10
+KPX T A 10
+KPX T Aacute 10
+KPX T Abreve 10
+KPX T Acircumflex 10
+KPX T Adieresis 10
+KPX T Agrave 10
+KPX T Amacron 10
+KPX T Aogonek 10
+KPX T Aring 10
+KPX T Atilde 10
+KPX T O 30
+KPX T Oacute 30
+KPX T Ocircumflex 30
+KPX T Odieresis 30
+KPX T Ograve 30
+KPX T Ohungarumlaut 30
+KPX T Omacron 30
+KPX T Oslash 30
+KPX T Otilde 30
+KPX T a -20
+KPX T aacute -20
+KPX T acircumflex -20
+KPX T agrave -20
+KPX T amacron -20
+KPX T aogonek -20
+KPX T aring -20
+KPX T e -20
+KPX T eacute -20
+KPX T eogonek -20
+KPX T h 20
+KPX T hyphen -20
+KPX T i 20
+KPX T o -20
+KPX T oacute -20
+KPX T ocircumflex -20
+KPX T ohungarumlaut -20
+KPX T omacron -20
+KPX Tcaron A 10
+KPX Tcaron Aacute 10
+KPX Tcaron Abreve 10
+KPX Tcaron Acircumflex 10
+KPX Tcaron Adieresis 10
+KPX Tcaron Agrave 10
+KPX Tcaron Amacron 10
+KPX Tcaron Aogonek 10
+KPX Tcaron Aring 10
+KPX Tcaron Atilde 10
+KPX Tcaron O 30
+KPX Tcaron Oacute 30
+KPX Tcaron Ocircumflex 30
+KPX Tcaron Odieresis 30
+KPX Tcaron Ograve 30
+KPX Tcaron Ohungarumlaut 30
+KPX Tcaron Omacron 30
+KPX Tcaron Oslash 30
+KPX Tcaron Otilde 30
+KPX Tcaron a -20
+KPX Tcaron aacute -20
+KPX Tcaron acircumflex -20
+KPX Tcaron agrave -20
+KPX Tcaron amacron -20
+KPX Tcaron aogonek -20
+KPX Tcaron aring -20
+KPX Tcaron e -20
+KPX Tcaron eacute -20
+KPX Tcaron eogonek -20
+KPX Tcaron hyphen -20
+KPX Tcaron o -20
+KPX Tcaron oacute -20
+KPX Tcaron ocircumflex -20
+KPX Tcaron ohungarumlaut -20
+KPX Tcaron omacron -20
+KPX Tcommaaccent A 10
+KPX Tcommaaccent Aacute 10
+KPX Tcommaaccent Abreve 10
+KPX Tcommaaccent Acircumflex 10
+KPX Tcommaaccent Adieresis 10
+KPX Tcommaaccent Agrave 10
+KPX Tcommaaccent Amacron 10
+KPX Tcommaaccent Aogonek 10
+KPX Tcommaaccent Aring 10
+KPX Tcommaaccent Atilde 10
+KPX Tcommaaccent O 30
+KPX Tcommaaccent Oacute 30
+KPX Tcommaaccent Ocircumflex 30
+KPX Tcommaaccent Odieresis 30
+KPX Tcommaaccent Ograve 30
+KPX Tcommaaccent Ohungarumlaut 30
+KPX Tcommaaccent Omacron 30
+KPX Tcommaaccent Oslash 30
+KPX Tcommaaccent Otilde 30
+KPX Tcommaaccent a -20
+KPX Tcommaaccent aacute -20
+KPX Tcommaaccent acircumflex -20
+KPX Tcommaaccent agrave -20
+KPX Tcommaaccent amacron -20
+KPX Tcommaaccent aogonek -20
+KPX Tcommaaccent aring -20
+KPX Tcommaaccent e -20
+KPX Tcommaaccent eacute -20
+KPX Tcommaaccent eogonek -20
+KPX Tcommaaccent hyphen -20
+KPX Tcommaaccent o -20
+KPX Tcommaaccent oacute -20
+KPX Tcommaaccent ocircumflex -20
+KPX Tcommaaccent ohungarumlaut -20
+KPX Tcommaaccent omacron -20
+KPX V G -20
+KPX V Gbreve -20
+KPX V Gcommaaccent -20
+KPX V O 10
+KPX V Oacute 10
+KPX V Ocircumflex 10
+KPX V Odieresis 10
+KPX V Ograve 10
+KPX V Ohungarumlaut 10
+KPX V Omacron 10
+KPX V Oslash 10
+KPX V Otilde 10
+KPX V a -20
+KPX V aacute -20
+KPX V abreve -20
+KPX V acircumflex -20
+KPX V adieresis -20
+KPX V agrave -20
+KPX V amacron -20
+KPX V aogonek -20
+KPX V aring -20
+KPX V atilde -20
+KPX V comma -90
+KPX V e -20
+KPX V eacute -20
+KPX V ecaron -20
+KPX V ecircumflex -20
+KPX V edieresis -20
+KPX V edotaccent -20
+KPX V egrave -20
+KPX V emacron -20
+KPX V eogonek -20
+KPX V o -20
+KPX V oacute -20
+KPX V ocircumflex -20
+KPX V odieresis -20
+KPX V ograve -20
+KPX V ohungarumlaut -20
+KPX V omacron -20
+KPX V otilde -20
+KPX V period -100
+KPX W O 10
+KPX W Oacute 10
+KPX W Ocircumflex 10
+KPX W Odieresis 10
+KPX W Ograve 10
+KPX W Ohungarumlaut 10
+KPX W Omacron 10
+KPX W Oslash 10
+KPX W Otilde 10
+KPX W a -20
+KPX W aacute -20
+KPX W abreve -20
+KPX W acircumflex -20
+KPX W adieresis -20
+KPX W agrave -20
+KPX W amacron -20
+KPX W aogonek -20
+KPX W aring -20
+KPX W atilde -20
+KPX W comma -40
+KPX W e -20
+KPX W eacute -20
+KPX W ecaron -20
+KPX W ecircumflex -20
+KPX W edieresis -20
+KPX W edotaccent -20
+KPX W egrave -20
+KPX W emacron -20
+KPX W eogonek -20
+KPX W h 10
+KPX W i 10
+KPX W o -20
+KPX W oacute -20
+KPX W ocircumflex -20
+KPX W odieresis -20
+KPX W ograve -20
+KPX W ohungarumlaut -20
+KPX W omacron -20
+KPX W otilde -20
+KPX W period -50
+KPX Y a -60
+KPX Y aacute -60
+KPX Y abreve -60
+KPX Y acircumflex -20
+KPX Y adieresis -20
+KPX Y agrave -20
+KPX Y amacron -20
+KPX Y aogonek -60
+KPX Y aring -60
+KPX Y atilde -20
+KPX Y comma -40
+KPX Y e -40
+KPX Y eacute -40
+KPX Y ecaron -40
+KPX Y edotaccent -40
+KPX Y eogonek -40
+KPX Y i 10
+KPX Y iacute 10
+KPX Y icircumflex 30
+KPX Y idieresis 30
+KPX Y igrave 30
+KPX Y imacron 30
+KPX Y iogonek 10
+KPX Y o -50
+KPX Y oacute -20
+KPX Y ocircumflex -20
+KPX Y odieresis -20
+KPX Y ograve -20
+KPX Y ohungarumlaut -20
+KPX Y omacron -20
+KPX Y otilde -20
+KPX Y period -50
+KPX Y u -20
+KPX Y uacute -20
+KPX Y ucircumflex -20
+KPX Y udieresis -20
+KPX Y ugrave -20
+KPX Y uhungarumlaut -20
+KPX Y umacron -20
+KPX Y uogonek -20
+KPX Y uring -20
+KPX Yacute a -60
+KPX Yacute aacute -60
+KPX Yacute abreve -60
+KPX Yacute acircumflex -60
+KPX Yacute adieresis -20
+KPX Yacute agrave -20
+KPX Yacute amacron -20
+KPX Yacute aogonek -60
+KPX Yacute aring -60
+KPX Yacute atilde -20
+KPX Yacute comma -40
+KPX Yacute e -40
+KPX Yacute eacute -40
+KPX Yacute ecaron -40
+KPX Yacute ecircumflex -40
+KPX Yacute edotaccent -40
+KPX Yacute eogonek -40
+KPX Yacute i 10
+KPX Yacute iacute 10
+KPX Yacute icircumflex 10
+KPX Yacute idieresis 30
+KPX Yacute igrave 30
+KPX Yacute imacron 30
+KPX Yacute iogonek 10
+KPX Yacute o -50
+KPX Yacute oacute -50
+KPX Yacute ocircumflex -20
+KPX Yacute odieresis -20
+KPX Yacute ograve -20
+KPX Yacute ohungarumlaut -50
+KPX Yacute omacron -20
+KPX Yacute otilde -20
+KPX Yacute period -50
+KPX Yacute u -20
+KPX Yacute uacute -20
+KPX Yacute ucircumflex -20
+KPX Yacute udieresis -20
+KPX Yacute ugrave -20
+KPX Yacute uhungarumlaut -20
+KPX Yacute umacron -20
+KPX Yacute uogonek -20
+KPX Yacute uring -20
+KPX Ydieresis a -60
+KPX Ydieresis aacute -60
+KPX Ydieresis abreve -60
+KPX Ydieresis acircumflex -20
+KPX Ydieresis adieresis -20
+KPX Ydieresis agrave -20
+KPX Ydieresis amacron -20
+KPX Ydieresis aogonek -60
+KPX Ydieresis aring -60
+KPX Ydieresis atilde -20
+KPX Ydieresis comma -40
+KPX Ydieresis e -40
+KPX Ydieresis eacute -40
+KPX Ydieresis ecaron -40
+KPX Ydieresis ecircumflex -40
+KPX Ydieresis edotaccent -40
+KPX Ydieresis eogonek -40
+KPX Ydieresis i 10
+KPX Ydieresis iacute 10
+KPX Ydieresis icircumflex 30
+KPX Ydieresis idieresis 30
+KPX Ydieresis igrave 30
+KPX Ydieresis imacron 30
+KPX Ydieresis iogonek 10
+KPX Ydieresis o -50
+KPX Ydieresis oacute -50
+KPX Ydieresis ocircumflex -50
+KPX Ydieresis odieresis -20
+KPX Ydieresis ograve -20
+KPX Ydieresis ohungarumlaut -50
+KPX Ydieresis omacron -20
+KPX Ydieresis otilde -20
+KPX Ydieresis period -50
+KPX Ydieresis u -20
+KPX Ydieresis uacute -20
+KPX Ydieresis ucircumflex -20
+KPX Ydieresis udieresis -20
+KPX Ydieresis ugrave -20
+KPX Ydieresis uhungarumlaut -20
+KPX Ydieresis umacron -20
+KPX Ydieresis uogonek -20
+KPX Ydieresis uring -20
+KPX b b -20
+KPX b comma -20
+KPX b l -20
+KPX b lacute -20
+KPX b lcommaaccent -20
+KPX b period -30
+KPX c k -10
+KPX c kcommaaccent -10
+KPX cacute k -10
+KPX cacute kcommaaccent -10
+KPX ccaron k -10
+KPX ccaron kcommaaccent -10
+KPX ccedilla k -10
+KPX ccedilla kcommaaccent -10
+KPX comma quotedblright -70
+KPX comma quoteright -70
+KPX d d -40
+KPX d v -10
+KPX d w -20
+KPX e y 10
+KPX e yacute 10
+KPX e ydieresis 10
+KPX eacute y 10
+KPX eacute yacute 10
+KPX eacute ydieresis 10
+KPX ecaron y 10
+KPX ecaron yacute 10
+KPX ecaron ydieresis 10
+KPX ecircumflex y 10
+KPX ecircumflex yacute 10
+KPX ecircumflex ydieresis 10
+KPX edieresis y 10
+KPX edieresis yacute 10
+KPX edieresis ydieresis 10
+KPX edotaccent y 10
+KPX edotaccent yacute 10
+KPX edotaccent ydieresis 10
+KPX egrave y 10
+KPX egrave yacute 10
+KPX egrave ydieresis 10
+KPX emacron y 10
+KPX emacron yacute 10
+KPX emacron ydieresis 10
+KPX eogonek y 10
+KPX eogonek yacute 10
+KPX eogonek ydieresis 10
+KPX f a -20
+KPX f aacute -20
+KPX f abreve -20
+KPX f acircumflex -20
+KPX f adieresis -20
+KPX f agrave -20
+KPX f amacron -20
+KPX f aogonek -20
+KPX f aring -20
+KPX f atilde -20
+KPX f comma -40
+KPX f e -10
+KPX f eacute -10
+KPX f ecaron -10
+KPX f ecircumflex -10
+KPX f edieresis -10
+KPX f edotaccent -10
+KPX f egrave -10
+KPX f emacron -10
+KPX f eogonek -10
+KPX f f -50
+KPX f period -50
+KPX f quotedblright 30
+KPX f quoteright 30
+KPX g a 10
+KPX g comma -20
+KPX g e 10
+KPX g i 10
+KPX g period -30
+KPX g y 10
+KPX k e -20
+KPX k eacute -20
+KPX k ecaron -20
+KPX k ecircumflex -20
+KPX k edieresis -20
+KPX k edotaccent -20
+KPX k egrave -20
+KPX k emacron -20
+KPX k eogonek -20
+KPX k o -10
+KPX k oacute -10
+KPX k ocircumflex -10
+KPX k odieresis -10
+KPX k ograve -10
+KPX k ohungarumlaut -10
+KPX k omacron -10
+KPX k otilde -10
+KPX k y 10
+KPX kcommaaccent e -20
+KPX kcommaaccent eacute -20
+KPX kcommaaccent ecaron -20
+KPX kcommaaccent ecircumflex -20
+KPX kcommaaccent edieresis -20
+KPX kcommaaccent edotaccent -20
+KPX kcommaaccent egrave -20
+KPX kcommaaccent emacron -20
+KPX kcommaaccent eogonek -20
+KPX kcommaaccent o -10
+KPX kcommaaccent oacute -10
+KPX kcommaaccent ocircumflex -10
+KPX kcommaaccent odieresis -10
+KPX kcommaaccent ograve -10
+KPX kcommaaccent ohungarumlaut -10
+KPX kcommaaccent omacron -10
+KPX kcommaaccent otilde -10
+KPX m u 10
+KPX m uacute 10
+KPX m ucircumflex 10
+KPX m udieresis 10
+KPX m ugrave 10
+KPX m uhungarumlaut 10
+KPX m umacron 10
+KPX m uogonek 10
+KPX m uring 10
+KPX m y 10
+KPX m yacute 10
+KPX m ydieresis 10
+KPX n y 20
+KPX n yacute 20
+KPX n ydieresis 20
+KPX nacute y 20
+KPX nacute yacute 20
+KPX nacute ydieresis 20
+KPX ncaron y 20
+KPX ncaron yacute 20
+KPX ncaron ydieresis 20
+KPX ncommaaccent y 20
+KPX ncommaaccent yacute 20
+KPX ncommaaccent ydieresis 20
+KPX ntilde y 20
+KPX ntilde yacute 20
+KPX ntilde ydieresis 20
+KPX o comma -20
+KPX o period -30
+KPX oacute comma -20
+KPX oacute period -30
+KPX ocircumflex comma -20
+KPX ocircumflex period -30
+KPX odieresis comma -20
+KPX odieresis period -30
+KPX ograve comma -20
+KPX ograve period -30
+KPX ohungarumlaut comma -20
+KPX ohungarumlaut period -30
+KPX omacron comma -20
+KPX omacron period -30
+KPX otilde comma -20
+KPX otilde period -30
+KPX p comma -20
+KPX p p -10
+KPX p period -30
+KPX period quotedblright -80
+KPX period quoteright -80
+KPX quotedblleft A 10
+KPX quotedblleft quoteleft 20
+KPX quoteleft A 10
+KPX quoteleft quoteleft -115
+KPX quoteright l 20
+KPX quoteright quotedblright 20
+KPX quoteright quoteright -115
+KPX quoteright r 30
+KPX quoteright racute 30
+KPX quoteright rcaron 30
+KPX quoteright rcommaaccent 30
+KPX quoteright s -25
+KPX quoteright sacute -25
+KPX quoteright scaron -25
+KPX quoteright scedilla -25
+KPX quoteright scommaaccent -25
+KPX quoteright t 20
+KPX quoteright v 30
+KPX r comma -40
+KPX r i 10
+KPX r iacute 10
+KPX r icircumflex 10
+KPX r idieresis 10
+KPX r igrave 10
+KPX r imacron 10
+KPX r iogonek 10
+KPX r period -50
+KPX racute comma -40
+KPX racute i 10
+KPX racute iacute 10
+KPX racute icircumflex 10
+KPX racute idieresis 10
+KPX racute igrave 10
+KPX racute imacron 10
+KPX racute iogonek 10
+KPX racute period -50
+KPX rcaron comma -40
+KPX rcaron i 10
+KPX rcaron iacute 10
+KPX rcaron icircumflex 10
+KPX rcaron idieresis 10
+KPX rcaron igrave 10
+KPX rcaron imacron 10
+KPX rcaron iogonek 10
+KPX rcaron period -50
+KPX rcommaaccent comma -40
+KPX rcommaaccent i 10
+KPX rcommaaccent iacute 10
+KPX rcommaaccent icircumflex 10
+KPX rcommaaccent idieresis 10
+KPX rcommaaccent igrave 10
+KPX rcommaaccent imacron 10
+KPX rcommaaccent iogonek 10
+KPX rcommaaccent period -50
+KPX s comma -10
+KPX s period -20
+KPX sacute comma -10
+KPX sacute period -20
+KPX scaron comma -10
+KPX scaron period -20
+KPX scedilla comma -10
+KPX scedilla period -20
+KPX scommaaccent comma -10
+KPX scommaaccent period -20
+KPX v comma -20
+KPX v period -30
+KPX w comma -20
+KPX w h 20
+KPX w o 10
+KPX w oacute 10
+KPX w ocircumflex 10
+KPX w odieresis 10
+KPX w ograve 10
+KPX w ohungarumlaut 10
+KPX w omacron 10
+KPX w otilde 10
+KPX w period -30
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/src/fonts/Adobe-Core35_AFMs-314/MustRead.html b/src/fonts/Adobe-Core35_AFMs-314/MustRead.html
new file mode 100644
index 0000000..572487a
--- /dev/null
+++ b/src/fonts/Adobe-Core35_AFMs-314/MustRead.html
@@ -0,0 +1,28 @@
+<html>
+
+ <head>
+ <meta http-equiv="content-type"
+ content="text/html;charset=iso-8859-1">
+ <title>Adobe Core 35 AFM Files with 314 Glyph Entries - ReadMe</title>
+ </head>
+
+ <body>
+ <h1>Adobe Core 35 AFM Files with 314 Glyph Entries - ReadMe</h1>
+ <table>
+ <tr>
+ <td width="10%"></td>
+ <td width="30%">This file and the 35 PostScript(R) AFM files it
+ accompanies may be used, copied, and distributed for any purpose and
+ without charge, with or without modification, provided that all
+ copyright notices are retained; that the AFM files are not
+ distributed without this file; that all modifications to this file
+ or any of the AFM files are prominently noted in the modified
+ file(s); and that this paragraph is not modified. Adobe Systems has
+ no responsibility or obligation to support the use of the AFM
+ files.</td>
+ <td width="60%"></td>
+ </tr>
+ </table>
+ </body>
+
+</html>
diff --git a/src/fonts/Adobe-Core35_AFMs-314/NewCenturySchlbk-Bold.afm b/src/fonts/Adobe-Core35_AFMs-314/NewCenturySchlbk-Bold.afm
new file mode 100644
index 0000000..58e44a9
--- /dev/null
+++ b/src/fonts/Adobe-Core35_AFMs-314/NewCenturySchlbk-Bold.afm
@@ -0,0 +1,1549 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1985, 1987, 1988, 1991, 1992, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Thu May 1 14:22:15 1997
+Comment UniqueID 43095
+Comment VMusage 44510 55535
+FontName NewCenturySchlbk-Bold
+FullName New Century Schoolbook Bold
+FamilyName New Century Schoolbook
+Weight Bold
+ItalicAngle 0
+IsFixedPitch false
+FontBBox -165 -250 1000 988
+UnderlinePosition -100
+UnderlineThickness 50
+Version 002.000
+Notice Copyright (c) 1985, 1987, 1988, 1991, 1992, 1997 Adobe Systems Incorporated. All Rights Reserved.
+EncodingScheme AdobeStandardEncoding
+CapHeight 722
+XHeight 475
+Ascender 737
+Descender -205
+StdHW 54
+StdVW 154
+StartCharMetrics 314
+C 32 ; WX 287 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 296 ; N exclam ; B 53 -15 243 737 ;
+C 34 ; WX 333 ; N quotedbl ; B 0 378 333 737 ;
+C 35 ; WX 574 ; N numbersign ; B 36 0 538 690 ;
+C 36 ; WX 574 ; N dollar ; B 25 -141 549 810 ;
+C 37 ; WX 833 ; N percent ; B 14 -15 819 705 ;
+C 38 ; WX 852 ; N ampersand ; B 34 -15 818 737 ;
+C 39 ; WX 241 ; N quoteright ; B 22 378 220 737 ;
+C 40 ; WX 389 ; N parenleft ; B 77 -117 345 745 ;
+C 41 ; WX 389 ; N parenright ; B 44 -117 312 745 ;
+C 42 ; WX 500 ; N asterisk ; B 54 302 446 737 ;
+C 43 ; WX 606 ; N plus ; B 50 0 556 506 ;
+C 44 ; WX 278 ; N comma ; B 40 -184 238 175 ;
+C 45 ; WX 333 ; N hyphen ; B 42 174 291 302 ;
+C 46 ; WX 278 ; N period ; B 44 -15 234 175 ;
+C 47 ; WX 278 ; N slash ; B -42 -15 320 737 ;
+C 48 ; WX 574 ; N zero ; B 27 -15 547 705 ;
+C 49 ; WX 574 ; N one ; B 83 0 491 705 ;
+C 50 ; WX 574 ; N two ; B 19 0 531 705 ;
+C 51 ; WX 574 ; N three ; B 23 -15 531 705 ;
+C 52 ; WX 574 ; N four ; B 19 0 547 705 ;
+C 53 ; WX 574 ; N five ; B 32 -15 534 705 ;
+C 54 ; WX 574 ; N six ; B 27 -15 547 705 ;
+C 55 ; WX 574 ; N seven ; B 45 -15 547 705 ;
+C 56 ; WX 574 ; N eight ; B 27 -15 548 705 ;
+C 57 ; WX 574 ; N nine ; B 27 -15 547 705 ;
+C 58 ; WX 278 ; N colon ; B 44 -15 234 485 ;
+C 59 ; WX 278 ; N semicolon ; B 40 -184 238 485 ;
+C 60 ; WX 606 ; N less ; B 50 -9 556 515 ;
+C 61 ; WX 606 ; N equal ; B 50 103 556 403 ;
+C 62 ; WX 606 ; N greater ; B 50 -9 556 515 ;
+C 63 ; WX 500 ; N question ; B 23 -15 477 737 ;
+C 64 ; WX 747 ; N at ; B -2 -15 750 737 ;
+C 65 ; WX 759 ; N A ; B -19 0 778 737 ;
+C 66 ; WX 778 ; N B ; B 19 0 739 722 ;
+C 67 ; WX 778 ; N C ; B 39 -15 723 737 ;
+C 68 ; WX 833 ; N D ; B 19 0 794 722 ;
+C 69 ; WX 759 ; N E ; B 19 0 708 722 ;
+C 70 ; WX 722 ; N F ; B 19 0 697 722 ;
+C 71 ; WX 833 ; N G ; B 39 -15 818 737 ;
+C 72 ; WX 870 ; N H ; B 19 0 851 722 ;
+C 73 ; WX 444 ; N I ; B 29 0 415 722 ;
+C 74 ; WX 648 ; N J ; B 6 -15 642 722 ;
+C 75 ; WX 815 ; N K ; B 19 0 822 722 ;
+C 76 ; WX 722 ; N L ; B 19 0 703 722 ;
+C 77 ; WX 981 ; N M ; B 10 0 971 722 ;
+C 78 ; WX 833 ; N N ; B 5 -10 828 722 ;
+C 79 ; WX 833 ; N O ; B 39 -15 794 737 ;
+C 80 ; WX 759 ; N P ; B 24 0 735 722 ;
+C 81 ; WX 833 ; N Q ; B 39 -189 808 737 ;
+C 82 ; WX 815 ; N R ; B 19 -15 815 722 ;
+C 83 ; WX 667 ; N S ; B 51 -15 634 737 ;
+C 84 ; WX 722 ; N T ; B 16 0 706 722 ;
+C 85 ; WX 833 ; N U ; B 14 -15 825 722 ;
+C 86 ; WX 759 ; N V ; B -19 -10 778 722 ;
+C 87 ; WX 981 ; N W ; B 7 -10 974 722 ;
+C 88 ; WX 722 ; N X ; B -12 0 734 722 ;
+C 89 ; WX 722 ; N Y ; B -12 0 734 722 ;
+C 90 ; WX 667 ; N Z ; B 28 0 639 722 ;
+C 91 ; WX 389 ; N bracketleft ; B 84 -109 339 737 ;
+C 92 ; WX 606 ; N backslash ; B 122 -15 484 737 ;
+C 93 ; WX 389 ; N bracketright ; B 50 -109 305 737 ;
+C 94 ; WX 606 ; N asciicircum ; B 66 325 540 690 ;
+C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;
+C 96 ; WX 241 ; N quoteleft ; B 22 378 220 737 ;
+C 97 ; WX 611 ; N a ; B 40 -15 601 485 ;
+C 98 ; WX 648 ; N b ; B 4 -15 616 737 ;
+C 99 ; WX 556 ; N c ; B 32 -15 524 485 ;
+C 100 ; WX 667 ; N d ; B 32 -15 644 737 ;
+C 101 ; WX 574 ; N e ; B 32 -15 542 485 ;
+C 102 ; WX 389 ; N f ; B 11 0 461 737 ; L i fi ; L l fl ;
+C 103 ; WX 611 ; N g ; B 30 -205 623 535 ;
+C 104 ; WX 685 ; N h ; B 17 0 662 737 ;
+C 105 ; WX 370 ; N i ; B 26 0 338 737 ;
+C 106 ; WX 352 ; N j ; B -86 -205 271 737 ;
+C 107 ; WX 667 ; N k ; B 17 0 662 737 ;
+C 108 ; WX 352 ; N l ; B 17 0 329 737 ;
+C 109 ; WX 963 ; N m ; B 17 0 940 485 ;
+C 110 ; WX 685 ; N n ; B 17 0 662 485 ;
+C 111 ; WX 611 ; N o ; B 32 -15 579 485 ;
+C 112 ; WX 667 ; N p ; B 17 -205 629 485 ;
+C 113 ; WX 648 ; N q ; B 32 -205 638 485 ;
+C 114 ; WX 519 ; N r ; B 17 0 516 485 ;
+C 115 ; WX 500 ; N s ; B 48 -15 476 485 ;
+C 116 ; WX 426 ; N t ; B 21 -15 405 675 ;
+C 117 ; WX 685 ; N u ; B 17 -15 668 475 ;
+C 118 ; WX 611 ; N v ; B 12 -10 599 475 ;
+C 119 ; WX 889 ; N w ; B 16 -10 873 475 ;
+C 120 ; WX 611 ; N x ; B 12 0 599 475 ;
+C 121 ; WX 611 ; N y ; B 12 -205 599 475 ;
+C 122 ; WX 537 ; N z ; B 38 0 499 475 ;
+C 123 ; WX 389 ; N braceleft ; B 36 -109 313 737 ;
+C 124 ; WX 606 ; N bar ; B 249 -250 357 750 ;
+C 125 ; WX 389 ; N braceright ; B 76 -109 353 737 ;
+C 126 ; WX 606 ; N asciitilde ; B 72 160 534 346 ;
+C 161 ; WX 296 ; N exclamdown ; B 53 -205 243 547 ;
+C 162 ; WX 574 ; N cent ; B 32 -102 528 572 ;
+C 163 ; WX 574 ; N sterling ; B 16 -15 558 705 ;
+C 164 ; WX 167 ; N fraction ; B -165 -15 332 705 ;
+C 165 ; WX 574 ; N yen ; B -10 0 584 690 ;
+C 166 ; WX 574 ; N florin ; B 14 -205 548 737 ;
+C 167 ; WX 500 ; N section ; B 62 -86 438 737 ;
+C 168 ; WX 574 ; N currency ; B 27 84 547 605 ;
+C 169 ; WX 241 ; N quotesingle ; B 53 378 189 737 ;
+C 170 ; WX 481 ; N quotedblleft ; B 22 378 459 737 ;
+C 171 ; WX 500 ; N guillemotleft ; B 46 79 454 397 ;
+C 172 ; WX 333 ; N guilsinglleft ; B 62 79 271 397 ;
+C 173 ; WX 333 ; N guilsinglright ; B 62 79 271 397 ;
+C 174 ; WX 685 ; N fi ; B 11 0 666 737 ;
+C 175 ; WX 685 ; N fl ; B 11 0 666 737 ;
+C 177 ; WX 500 ; N endash ; B 0 184 500 292 ;
+C 178 ; WX 500 ; N dagger ; B 39 -101 461 737 ;
+C 179 ; WX 500 ; N daggerdbl ; B 39 -89 461 737 ;
+C 180 ; WX 278 ; N periodcentered ; B 53 200 225 372 ;
+C 182 ; WX 747 ; N paragraph ; B 96 -71 631 722 ;
+C 183 ; WX 606 ; N bullet ; B 122 180 484 542 ;
+C 184 ; WX 241 ; N quotesinglbase ; B 22 -184 220 175 ;
+C 185 ; WX 481 ; N quotedblbase ; B 22 -184 459 175 ;
+C 186 ; WX 481 ; N quotedblright ; B 22 378 459 737 ;
+C 187 ; WX 500 ; N guillemotright ; B 46 79 454 397 ;
+C 188 ; WX 1000 ; N ellipsis ; B 72 -15 928 175 ;
+C 189 ; WX 1000 ; N perthousand ; B 7 -15 993 705 ;
+C 191 ; WX 500 ; N questiondown ; B 23 -205 477 547 ;
+C 193 ; WX 333 ; N grave ; B 2 547 249 737 ;
+C 194 ; WX 333 ; N acute ; B 84 547 331 737 ;
+C 195 ; WX 333 ; N circumflex ; B -10 547 344 725 ;
+C 196 ; WX 333 ; N tilde ; B -24 563 357 705 ;
+C 197 ; WX 333 ; N macron ; B -6 582 339 664 ;
+C 198 ; WX 333 ; N breve ; B 9 547 324 714 ;
+C 199 ; WX 333 ; N dotaccent ; B 95 565 267 737 ;
+C 200 ; WX 333 ; N dieresis ; B -12 565 345 707 ;
+C 202 ; WX 333 ; N ring ; B 58 545 274 761 ;
+C 203 ; WX 333 ; N cedilla ; B 17 -224 248 0 ;
+C 205 ; WX 333 ; N hungarumlaut ; B -16 547 431 737 ;
+C 206 ; WX 333 ; N ogonek ; B 72 -220 330 4 ;
+C 207 ; WX 333 ; N caron ; B -10 547 344 725 ;
+C 208 ; WX 1000 ; N emdash ; B 0 184 1000 292 ;
+C 225 ; WX 981 ; N AE ; B -29 0 963 722 ;
+C 227 ; WX 367 ; N ordfeminine ; B 1 407 393 705 ;
+C 232 ; WX 722 ; N Lslash ; B 19 0 703 722 ;
+C 233 ; WX 833 ; N Oslash ; B 39 -53 794 775 ;
+C 234 ; WX 1000 ; N OE ; B 0 0 982 722 ;
+C 235 ; WX 367 ; N ordmasculine ; B 1 407 366 705 ;
+C 241 ; WX 870 ; N ae ; B 32 -15 838 485 ;
+C 245 ; WX 370 ; N dotlessi ; B 26 0 338 475 ;
+C 248 ; WX 352 ; N lslash ; B 17 0 329 737 ;
+C 249 ; WX 611 ; N oslash ; B 32 -103 579 573 ;
+C 250 ; WX 907 ; N oe ; B 32 -15 875 485 ;
+C 251 ; WX 611 ; N germandbls ; B -2 -15 580 737 ;
+C -1 ; WX 444 ; N Idieresis ; B 29 0 415 921 ;
+C -1 ; WX 574 ; N eacute ; B 32 -15 542 737 ;
+C -1 ; WX 611 ; N abreve ; B 40 -15 601 714 ;
+C -1 ; WX 685 ; N uhungarumlaut ; B 17 -15 668 737 ;
+C -1 ; WX 574 ; N ecaron ; B 32 -15 542 725 ;
+C -1 ; WX 722 ; N Ydieresis ; B -12 0 734 921 ;
+C -1 ; WX 606 ; N divide ; B 50 -40 556 546 ;
+C -1 ; WX 722 ; N Yacute ; B -12 0 734 964 ;
+C -1 ; WX 759 ; N Acircumflex ; B -19 0 778 952 ;
+C -1 ; WX 611 ; N aacute ; B 40 -15 601 737 ;
+C -1 ; WX 833 ; N Ucircumflex ; B 14 -15 825 952 ;
+C -1 ; WX 611 ; N yacute ; B 12 -205 599 737 ;
+C -1 ; WX 500 ; N scommaaccent ; B 48 -250 476 485 ;
+C -1 ; WX 574 ; N ecircumflex ; B 32 -15 542 725 ;
+C -1 ; WX 833 ; N Uring ; B 14 -15 825 988 ;
+C -1 ; WX 833 ; N Udieresis ; B 14 -15 825 921 ;
+C -1 ; WX 611 ; N aogonek ; B 40 -231 628 485 ;
+C -1 ; WX 833 ; N Uacute ; B 14 -15 825 964 ;
+C -1 ; WX 685 ; N uogonek ; B 17 -220 670 475 ;
+C -1 ; WX 759 ; N Edieresis ; B 19 0 708 921 ;
+C -1 ; WX 833 ; N Dcroat ; B 19 0 794 722 ;
+C -1 ; WX 250 ; N commaaccent ; B 45 -250 187 -50 ;
+C -1 ; WX 747 ; N copyright ; B -2 -15 750 737 ;
+C -1 ; WX 759 ; N Emacron ; B 19 0 708 891 ;
+C -1 ; WX 556 ; N ccaron ; B 32 -15 524 725 ;
+C -1 ; WX 611 ; N aring ; B 40 -15 601 761 ;
+C -1 ; WX 833 ; N Ncommaaccent ; B 5 -230 828 722 ;
+C -1 ; WX 352 ; N lacute ; B 17 0 341 964 ;
+C -1 ; WX 611 ; N agrave ; B 40 -15 601 737 ;
+C -1 ; WX 722 ; N Tcommaaccent ; B 16 -250 706 722 ;
+C -1 ; WX 778 ; N Cacute ; B 39 -15 723 964 ;
+C -1 ; WX 611 ; N atilde ; B 40 -15 601 705 ;
+C -1 ; WX 759 ; N Edotaccent ; B 19 0 708 951 ;
+C -1 ; WX 500 ; N scaron ; B 48 -15 476 725 ;
+C -1 ; WX 500 ; N scedilla ; B 48 -224 476 485 ;
+C -1 ; WX 370 ; N iacute ; B 26 0 350 737 ;
+C -1 ; WX 494 ; N lozenge ; B 10 0 484 745 ;
+C -1 ; WX 815 ; N Rcaron ; B 19 -15 815 952 ;
+C -1 ; WX 833 ; N Gcommaaccent ; B 39 -250 818 737 ;
+C -1 ; WX 685 ; N ucircumflex ; B 17 -15 668 725 ;
+C -1 ; WX 611 ; N acircumflex ; B 40 -15 601 725 ;
+C -1 ; WX 759 ; N Amacron ; B -19 0 778 891 ;
+C -1 ; WX 519 ; N rcaron ; B 17 0 516 725 ;
+C -1 ; WX 556 ; N ccedilla ; B 32 -224 524 485 ;
+C -1 ; WX 667 ; N Zdotaccent ; B 28 0 639 951 ;
+C -1 ; WX 759 ; N Thorn ; B 24 0 735 722 ;
+C -1 ; WX 833 ; N Omacron ; B 39 -15 794 891 ;
+C -1 ; WX 815 ; N Racute ; B 19 -15 815 964 ;
+C -1 ; WX 667 ; N Sacute ; B 51 -15 634 964 ;
+C -1 ; WX 747 ; N dcaron ; B 32 -15 748 737 ;
+C -1 ; WX 833 ; N Umacron ; B 14 -15 825 891 ;
+C -1 ; WX 685 ; N uring ; B 17 -15 668 761 ;
+C -1 ; WX 344 ; N threesuperior ; B -3 273 355 705 ;
+C -1 ; WX 833 ; N Ograve ; B 39 -15 794 964 ;
+C -1 ; WX 759 ; N Agrave ; B -19 0 778 964 ;
+C -1 ; WX 759 ; N Abreve ; B -19 0 778 941 ;
+C -1 ; WX 606 ; N multiply ; B 65 15 541 491 ;
+C -1 ; WX 685 ; N uacute ; B 17 -15 668 737 ;
+C -1 ; WX 722 ; N Tcaron ; B 16 0 706 952 ;
+C -1 ; WX 494 ; N partialdiff ; B 11 -21 494 750 ;
+C -1 ; WX 611 ; N ydieresis ; B 12 -205 599 694 ;
+C -1 ; WX 833 ; N Nacute ; B 5 -10 828 964 ;
+C -1 ; WX 370 ; N icircumflex ; B 9 0 363 725 ;
+C -1 ; WX 759 ; N Ecircumflex ; B 19 0 708 952 ;
+C -1 ; WX 611 ; N adieresis ; B 40 -15 601 694 ;
+C -1 ; WX 574 ; N edieresis ; B 32 -15 542 694 ;
+C -1 ; WX 556 ; N cacute ; B 32 -15 524 737 ;
+C -1 ; WX 685 ; N nacute ; B 17 0 662 737 ;
+C -1 ; WX 685 ; N umacron ; B 17 -15 668 664 ;
+C -1 ; WX 833 ; N Ncaron ; B 5 -10 828 952 ;
+C -1 ; WX 444 ; N Iacute ; B 29 0 415 964 ;
+C -1 ; WX 606 ; N plusminus ; B 50 0 556 506 ;
+C -1 ; WX 606 ; N brokenbar ; B 249 -175 357 675 ;
+C -1 ; WX 747 ; N registered ; B -2 -15 750 737 ;
+C -1 ; WX 833 ; N Gbreve ; B 39 -15 818 941 ;
+C -1 ; WX 444 ; N Idotaccent ; B 29 0 415 951 ;
+C -1 ; WX 600 ; N summation ; B 14 -10 585 706 ;
+C -1 ; WX 759 ; N Egrave ; B 19 0 708 964 ;
+C -1 ; WX 519 ; N racute ; B 17 0 516 737 ;
+C -1 ; WX 611 ; N omacron ; B 32 -15 579 664 ;
+C -1 ; WX 667 ; N Zacute ; B 28 0 639 964 ;
+C -1 ; WX 667 ; N Zcaron ; B 28 0 639 952 ;
+C -1 ; WX 549 ; N greaterequal ; B 26 0 523 704 ;
+C -1 ; WX 833 ; N Eth ; B 19 0 794 722 ;
+C -1 ; WX 778 ; N Ccedilla ; B 39 -224 723 737 ;
+C -1 ; WX 352 ; N lcommaaccent ; B 17 -250 329 737 ;
+C -1 ; WX 456 ; N tcaron ; B 21 -15 450 795 ;
+C -1 ; WX 574 ; N eogonek ; B 32 -220 542 485 ;
+C -1 ; WX 833 ; N Uogonek ; B 14 -220 825 722 ;
+C -1 ; WX 759 ; N Aacute ; B -19 0 778 964 ;
+C -1 ; WX 759 ; N Adieresis ; B -19 0 778 921 ;
+C -1 ; WX 574 ; N egrave ; B 32 -15 542 737 ;
+C -1 ; WX 537 ; N zacute ; B 38 0 499 737 ;
+C -1 ; WX 370 ; N iogonek ; B 26 -224 353 737 ;
+C -1 ; WX 833 ; N Oacute ; B 39 -15 794 964 ;
+C -1 ; WX 611 ; N oacute ; B 32 -15 579 737 ;
+C -1 ; WX 611 ; N amacron ; B 40 -15 601 664 ;
+C -1 ; WX 500 ; N sacute ; B 48 -15 476 737 ;
+C -1 ; WX 370 ; N idieresis ; B 7 0 364 694 ;
+C -1 ; WX 833 ; N Ocircumflex ; B 39 -15 794 952 ;
+C -1 ; WX 833 ; N Ugrave ; B 14 -15 825 964 ;
+C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ;
+C -1 ; WX 667 ; N thorn ; B 17 -205 629 737 ;
+C -1 ; WX 344 ; N twosuperior ; B -3 282 350 705 ;
+C -1 ; WX 833 ; N Odieresis ; B 39 -15 794 921 ;
+C -1 ; WX 685 ; N mu ; B 17 -205 668 475 ;
+C -1 ; WX 370 ; N igrave ; B 21 0 338 737 ;
+C -1 ; WX 611 ; N ohungarumlaut ; B 32 -15 579 737 ;
+C -1 ; WX 759 ; N Eogonek ; B 19 -224 712 722 ;
+C -1 ; WX 667 ; N dcroat ; B 32 -15 644 737 ;
+C -1 ; WX 861 ; N threequarters ; B 15 -15 838 705 ;
+C -1 ; WX 667 ; N Scedilla ; B 51 -224 634 737 ;
+C -1 ; WX 448 ; N lcaron ; B 17 0 439 737 ;
+C -1 ; WX 815 ; N Kcommaaccent ; B 19 -250 822 722 ;
+C -1 ; WX 722 ; N Lacute ; B 19 0 703 964 ;
+C -1 ; WX 1000 ; N trademark ; B 6 317 982 722 ;
+C -1 ; WX 574 ; N edotaccent ; B 32 -15 542 724 ;
+C -1 ; WX 444 ; N Igrave ; B 29 0 415 964 ;
+C -1 ; WX 444 ; N Imacron ; B 29 0 415 891 ;
+C -1 ; WX 722 ; N Lcaron ; B 19 0 703 737 ;
+C -1 ; WX 861 ; N onehalf ; B 31 -15 838 705 ;
+C -1 ; WX 549 ; N lessequal ; B 29 0 526 704 ;
+C -1 ; WX 611 ; N ocircumflex ; B 32 -15 579 725 ;
+C -1 ; WX 685 ; N ntilde ; B 17 0 662 705 ;
+C -1 ; WX 833 ; N Uhungarumlaut ; B 14 -15 825 964 ;
+C -1 ; WX 759 ; N Eacute ; B 19 0 708 964 ;
+C -1 ; WX 574 ; N emacron ; B 32 -15 542 664 ;
+C -1 ; WX 611 ; N gbreve ; B 30 -205 623 734 ;
+C -1 ; WX 861 ; N onequarter ; B 31 -15 838 705 ;
+C -1 ; WX 667 ; N Scaron ; B 51 -15 634 952 ;
+C -1 ; WX 667 ; N Scommaaccent ; B 51 -250 634 737 ;
+C -1 ; WX 833 ; N Ohungarumlaut ; B 39 -15 794 964 ;
+C -1 ; WX 400 ; N degree ; B 57 419 343 705 ;
+C -1 ; WX 611 ; N ograve ; B 32 -15 579 737 ;
+C -1 ; WX 778 ; N Ccaron ; B 39 -15 723 952 ;
+C -1 ; WX 685 ; N ugrave ; B 17 -15 668 737 ;
+C -1 ; WX 549 ; N radical ; B 10 -46 512 850 ;
+C -1 ; WX 833 ; N Dcaron ; B 19 0 794 952 ;
+C -1 ; WX 519 ; N rcommaaccent ; B 17 -250 516 485 ;
+C -1 ; WX 833 ; N Ntilde ; B 5 -10 828 932 ;
+C -1 ; WX 611 ; N otilde ; B 32 -15 579 705 ;
+C -1 ; WX 815 ; N Rcommaaccent ; B 19 -230 815 722 ;
+C -1 ; WX 722 ; N Lcommaaccent ; B 19 -250 703 722 ;
+C -1 ; WX 759 ; N Atilde ; B -19 0 778 932 ;
+C -1 ; WX 759 ; N Aogonek ; B -19 -224 793 737 ;
+C -1 ; WX 759 ; N Aring ; B -19 0 778 988 ;
+C -1 ; WX 833 ; N Otilde ; B 39 -15 794 932 ;
+C -1 ; WX 537 ; N zdotaccent ; B 38 0 499 724 ;
+C -1 ; WX 759 ; N Ecaron ; B 19 0 708 952 ;
+C -1 ; WX 444 ; N Iogonek ; B 29 -220 415 722 ;
+C -1 ; WX 667 ; N kcommaaccent ; B 17 -250 662 737 ;
+C -1 ; WX 606 ; N minus ; B 50 199 556 307 ;
+C -1 ; WX 444 ; N Icircumflex ; B 29 0 415 952 ;
+C -1 ; WX 685 ; N ncaron ; B 17 0 662 725 ;
+C -1 ; WX 426 ; N tcommaaccent ; B 21 -250 405 675 ;
+C -1 ; WX 606 ; N logicalnot ; B 50 103 556 403 ;
+C -1 ; WX 611 ; N odieresis ; B 32 -15 579 694 ;
+C -1 ; WX 685 ; N udieresis ; B 17 -15 668 694 ;
+C -1 ; WX 549 ; N notequal ; B 15 -49 540 570 ;
+C -1 ; WX 611 ; N gcommaaccent ; B 30 -205 623 842 ;
+C -1 ; WX 611 ; N eth ; B 32 -15 579 737 ;
+C -1 ; WX 537 ; N zcaron ; B 38 0 499 725 ;
+C -1 ; WX 685 ; N ncommaaccent ; B 17 -250 662 485 ;
+C -1 ; WX 344 ; N onesuperior ; B 31 282 309 705 ;
+C -1 ; WX 370 ; N imacron ; B 26 0 338 664 ;
+EndCharMetrics
+StartKernData
+StartKernPairs 1205
+KPX A T -55
+KPX A Tcaron -55
+KPX A Tcommaaccent -55
+KPX A U -18
+KPX A Uacute -18
+KPX A Ucircumflex -18
+KPX A Udieresis -18
+KPX A Ugrave -18
+KPX A Uhungarumlaut -18
+KPX A Umacron -18
+KPX A Uogonek -18
+KPX A Uring -18
+KPX A V -74
+KPX A W -74
+KPX A Y -91
+KPX A Yacute -91
+KPX A Ydieresis -91
+KPX A quotedblright -74
+KPX A quoteright -74
+KPX A v -18
+KPX A w -18
+KPX A y -18
+KPX A yacute -18
+KPX A ydieresis -18
+KPX Aacute T -55
+KPX Aacute Tcaron -55
+KPX Aacute Tcommaaccent -55
+KPX Aacute U -18
+KPX Aacute Uacute -18
+KPX Aacute Ucircumflex -18
+KPX Aacute Udieresis -18
+KPX Aacute Ugrave -18
+KPX Aacute Uhungarumlaut -18
+KPX Aacute Umacron -18
+KPX Aacute Uogonek -18
+KPX Aacute Uring -18
+KPX Aacute V -74
+KPX Aacute W -74
+KPX Aacute Y -91
+KPX Aacute Yacute -91
+KPX Aacute Ydieresis -91
+KPX Aacute quotedblright -74
+KPX Aacute quoteright -74
+KPX Aacute v -18
+KPX Aacute w -18
+KPX Aacute y -18
+KPX Aacute yacute -18
+KPX Aacute ydieresis -18
+KPX Abreve T -55
+KPX Abreve Tcaron -55
+KPX Abreve Tcommaaccent -55
+KPX Abreve U -18
+KPX Abreve Uacute -18
+KPX Abreve Ucircumflex -18
+KPX Abreve Udieresis -18
+KPX Abreve Ugrave -18
+KPX Abreve Uhungarumlaut -18
+KPX Abreve Umacron -18
+KPX Abreve Uogonek -18
+KPX Abreve Uring -18
+KPX Abreve V -74
+KPX Abreve W -74
+KPX Abreve Y -91
+KPX Abreve Yacute -91
+KPX Abreve Ydieresis -91
+KPX Abreve quotedblright -74
+KPX Abreve quoteright -74
+KPX Abreve v -18
+KPX Abreve w -18
+KPX Abreve y -18
+KPX Abreve yacute -18
+KPX Abreve ydieresis -18
+KPX Acircumflex T -55
+KPX Acircumflex Tcaron -55
+KPX Acircumflex Tcommaaccent -55
+KPX Acircumflex U -18
+KPX Acircumflex Uacute -18
+KPX Acircumflex Ucircumflex -18
+KPX Acircumflex Udieresis -18
+KPX Acircumflex Ugrave -18
+KPX Acircumflex Uhungarumlaut -18
+KPX Acircumflex Umacron -18
+KPX Acircumflex Uogonek -18
+KPX Acircumflex Uring -18
+KPX Acircumflex V -74
+KPX Acircumflex W -74
+KPX Acircumflex Y -91
+KPX Acircumflex Yacute -91
+KPX Acircumflex Ydieresis -91
+KPX Acircumflex quotedblright -74
+KPX Acircumflex quoteright -74
+KPX Acircumflex v -18
+KPX Acircumflex w -18
+KPX Acircumflex y -18
+KPX Acircumflex yacute -18
+KPX Acircumflex ydieresis -18
+KPX Adieresis T -55
+KPX Adieresis Tcaron -55
+KPX Adieresis Tcommaaccent -55
+KPX Adieresis U -18
+KPX Adieresis Uacute -18
+KPX Adieresis Ucircumflex -18
+KPX Adieresis Udieresis -18
+KPX Adieresis Ugrave -18
+KPX Adieresis Uhungarumlaut -18
+KPX Adieresis Umacron -18
+KPX Adieresis Uogonek -18
+KPX Adieresis Uring -18
+KPX Adieresis V -74
+KPX Adieresis W -74
+KPX Adieresis Y -91
+KPX Adieresis Yacute -91
+KPX Adieresis Ydieresis -91
+KPX Adieresis quotedblright -74
+KPX Adieresis quoteright -74
+KPX Adieresis v -18
+KPX Adieresis w -18
+KPX Adieresis y -18
+KPX Adieresis yacute -18
+KPX Adieresis ydieresis -18
+KPX Agrave T -55
+KPX Agrave Tcaron -55
+KPX Agrave Tcommaaccent -55
+KPX Agrave U -18
+KPX Agrave Uacute -18
+KPX Agrave Ucircumflex -18
+KPX Agrave Udieresis -18
+KPX Agrave Ugrave -18
+KPX Agrave Uhungarumlaut -18
+KPX Agrave Umacron -18
+KPX Agrave Uogonek -18
+KPX Agrave Uring -18
+KPX Agrave V -74
+KPX Agrave W -74
+KPX Agrave Y -91
+KPX Agrave Yacute -91
+KPX Agrave Ydieresis -91
+KPX Agrave quotedblright -74
+KPX Agrave quoteright -74
+KPX Agrave v -18
+KPX Agrave w -18
+KPX Agrave y -18
+KPX Agrave yacute -18
+KPX Agrave ydieresis -18
+KPX Amacron T -55
+KPX Amacron Tcaron -55
+KPX Amacron Tcommaaccent -55
+KPX Amacron U -18
+KPX Amacron Uacute -18
+KPX Amacron Ucircumflex -18
+KPX Amacron Udieresis -18
+KPX Amacron Ugrave -18
+KPX Amacron Uhungarumlaut -18
+KPX Amacron Umacron -18
+KPX Amacron Uogonek -18
+KPX Amacron Uring -18
+KPX Amacron V -74
+KPX Amacron W -74
+KPX Amacron Y -91
+KPX Amacron Yacute -91
+KPX Amacron Ydieresis -91
+KPX Amacron quotedblright -74
+KPX Amacron quoteright -74
+KPX Amacron v -18
+KPX Amacron w -18
+KPX Amacron y -18
+KPX Amacron yacute -18
+KPX Amacron ydieresis -18
+KPX Aogonek T -55
+KPX Aogonek Tcaron -55
+KPX Aogonek Tcommaaccent -55
+KPX Aogonek U -18
+KPX Aogonek Uacute -18
+KPX Aogonek Ucircumflex -18
+KPX Aogonek Udieresis -18
+KPX Aogonek Ugrave -18
+KPX Aogonek Uhungarumlaut -18
+KPX Aogonek Umacron -18
+KPX Aogonek Uogonek -18
+KPX Aogonek Uring -18
+KPX Aogonek V -74
+KPX Aogonek W -74
+KPX Aogonek Y -91
+KPX Aogonek Yacute -91
+KPX Aogonek Ydieresis -91
+KPX Aogonek quotedblright -74
+KPX Aogonek quoteright -74
+KPX Aogonek v -18
+KPX Aogonek w -18
+KPX Aring T -55
+KPX Aring Tcaron -55
+KPX Aring Tcommaaccent -55
+KPX Aring U -18
+KPX Aring Uacute -18
+KPX Aring Ucircumflex -18
+KPX Aring Udieresis -18
+KPX Aring Ugrave -18
+KPX Aring Uhungarumlaut -18
+KPX Aring Umacron -18
+KPX Aring Uogonek -18
+KPX Aring Uring -18
+KPX Aring V -74
+KPX Aring W -74
+KPX Aring Y -91
+KPX Aring Yacute -91
+KPX Aring Ydieresis -91
+KPX Aring quotedblright -74
+KPX Aring quoteright -74
+KPX Aring v -18
+KPX Aring w -18
+KPX Aring y -18
+KPX Aring yacute -18
+KPX Aring ydieresis -18
+KPX Atilde T -55
+KPX Atilde Tcaron -55
+KPX Atilde Tcommaaccent -55
+KPX Atilde U -18
+KPX Atilde Uacute -18
+KPX Atilde Ucircumflex -18
+KPX Atilde Udieresis -18
+KPX Atilde Ugrave -18
+KPX Atilde Uhungarumlaut -18
+KPX Atilde Umacron -18
+KPX Atilde Uogonek -18
+KPX Atilde Uring -18
+KPX Atilde V -74
+KPX Atilde W -74
+KPX Atilde Y -91
+KPX Atilde Yacute -91
+KPX Atilde Ydieresis -91
+KPX Atilde quotedblright -74
+KPX Atilde quoteright -74
+KPX Atilde v -18
+KPX Atilde w -18
+KPX Atilde y -18
+KPX Atilde yacute -18
+KPX Atilde ydieresis -18
+KPX C comma -18
+KPX C period -18
+KPX Cacute comma -18
+KPX Cacute period -18
+KPX Ccaron comma -18
+KPX Ccaron period -18
+KPX Ccedilla comma -18
+KPX Ccedilla period -18
+KPX D comma -25
+KPX D period -25
+KPX Dcaron comma -25
+KPX Dcaron period -25
+KPX Dcroat comma -25
+KPX Dcroat period -25
+KPX F a -74
+KPX F aacute -74
+KPX F abreve -74
+KPX F acircumflex -74
+KPX F adieresis -74
+KPX F agrave -74
+KPX F amacron -74
+KPX F aogonek -74
+KPX F aring -74
+KPX F atilde -74
+KPX F comma -125
+KPX F e -55
+KPX F eacute -55
+KPX F ecaron -55
+KPX F ecircumflex -55
+KPX F edieresis -55
+KPX F edotaccent -55
+KPX F egrave -55
+KPX F emacron -55
+KPX F eogonek -55
+KPX F i -18
+KPX F iacute -18
+KPX F icircumflex -18
+KPX F idieresis -18
+KPX F igrave -18
+KPX F imacron -18
+KPX F iogonek -18
+KPX F o -55
+KPX F oacute -55
+KPX F ocircumflex -55
+KPX F odieresis -55
+KPX F ograve -55
+KPX F ohungarumlaut -55
+KPX F omacron -55
+KPX F oslash -55
+KPX F otilde -55
+KPX F period -125
+KPX F r -18
+KPX F racute -18
+KPX F rcaron -18
+KPX F rcommaaccent -18
+KPX J A -18
+KPX J Aacute -18
+KPX J Abreve -18
+KPX J Acircumflex -18
+KPX J Adieresis -18
+KPX J Agrave -18
+KPX J Amacron -18
+KPX J Aogonek -18
+KPX J Aring -18
+KPX J Atilde -18
+KPX J a -18
+KPX J aacute -18
+KPX J abreve -18
+KPX J acircumflex -18
+KPX J adieresis -18
+KPX J agrave -18
+KPX J amacron -18
+KPX J aogonek -18
+KPX J aring -18
+KPX J atilde -18
+KPX J comma -55
+KPX J e -18
+KPX J eacute -18
+KPX J ecaron -18
+KPX J ecircumflex -18
+KPX J edieresis -18
+KPX J edotaccent -18
+KPX J egrave -18
+KPX J emacron -18
+KPX J eogonek -18
+KPX J o -18
+KPX J oacute -18
+KPX J ocircumflex -18
+KPX J odieresis -18
+KPX J ograve -18
+KPX J ohungarumlaut -18
+KPX J omacron -18
+KPX J oslash -18
+KPX J otilde -18
+KPX J period -55
+KPX J u -18
+KPX J uacute -18
+KPX J ucircumflex -18
+KPX J udieresis -18
+KPX J ugrave -18
+KPX J uhungarumlaut -18
+KPX J umacron -18
+KPX J uogonek -18
+KPX J uring -18
+KPX K u -18
+KPX K uacute -18
+KPX K ucircumflex -18
+KPX K udieresis -18
+KPX K ugrave -18
+KPX K uhungarumlaut -18
+KPX K umacron -18
+KPX K uogonek -18
+KPX K uring -18
+KPX K y -25
+KPX K yacute -25
+KPX K ydieresis -25
+KPX Kcommaaccent u -18
+KPX Kcommaaccent uacute -18
+KPX Kcommaaccent ucircumflex -18
+KPX Kcommaaccent udieresis -18
+KPX Kcommaaccent ugrave -18
+KPX Kcommaaccent uhungarumlaut -18
+KPX Kcommaaccent umacron -18
+KPX Kcommaaccent uogonek -18
+KPX Kcommaaccent uring -18
+KPX Kcommaaccent y -25
+KPX Kcommaaccent yacute -25
+KPX Kcommaaccent ydieresis -25
+KPX L T -100
+KPX L Tcaron -100
+KPX L Tcommaaccent -100
+KPX L V -100
+KPX L W -74
+KPX L Y -74
+KPX L Yacute -74
+KPX L Ydieresis -74
+KPX L quotedblright -100
+KPX L quoteright -100
+KPX L y -25
+KPX L yacute -25
+KPX L ydieresis -25
+KPX Lacute T -100
+KPX Lacute Tcaron -100
+KPX Lacute Tcommaaccent -100
+KPX Lacute V -100
+KPX Lacute W -74
+KPX Lacute Y -74
+KPX Lacute Yacute -74
+KPX Lacute Ydieresis -74
+KPX Lacute quotedblright -100
+KPX Lacute quoteright -100
+KPX Lacute y -25
+KPX Lacute yacute -25
+KPX Lacute ydieresis -25
+KPX Lcommaaccent T -100
+KPX Lcommaaccent Tcaron -100
+KPX Lcommaaccent Tcommaaccent -100
+KPX Lcommaaccent V -100
+KPX Lcommaaccent W -74
+KPX Lcommaaccent Y -74
+KPX Lcommaaccent Yacute -74
+KPX Lcommaaccent Ydieresis -74
+KPX Lcommaaccent quotedblright -100
+KPX Lcommaaccent quoteright -100
+KPX Lcommaaccent y -25
+KPX Lcommaaccent yacute -25
+KPX Lcommaaccent ydieresis -25
+KPX Lslash T -100
+KPX Lslash Tcaron -100
+KPX Lslash Tcommaaccent -100
+KPX Lslash V -100
+KPX Lslash W -74
+KPX Lslash Y -74
+KPX Lslash Yacute -74
+KPX Lslash Ydieresis -74
+KPX Lslash quotedblright -100
+KPX Lslash quoteright -100
+KPX Lslash y -25
+KPX Lslash yacute -25
+KPX Lslash ydieresis -25
+KPX N comma -18
+KPX N period -18
+KPX Nacute comma -18
+KPX Nacute period -18
+KPX Ncaron comma -18
+KPX Ncaron period -18
+KPX Ncommaaccent comma -18
+KPX Ncommaaccent period -18
+KPX Ntilde comma -18
+KPX Ntilde period -18
+KPX O T 10
+KPX O Tcaron 10
+KPX O Tcommaaccent 10
+KPX O comma -25
+KPX O period -25
+KPX Oacute T 10
+KPX Oacute Tcaron 10
+KPX Oacute Tcommaaccent 10
+KPX Oacute comma -25
+KPX Oacute period -25
+KPX Ocircumflex T 10
+KPX Ocircumflex Tcaron 10
+KPX Ocircumflex Tcommaaccent 10
+KPX Ocircumflex comma -25
+KPX Ocircumflex period -25
+KPX Odieresis T 10
+KPX Odieresis Tcaron 10
+KPX Odieresis Tcommaaccent 10
+KPX Odieresis comma -25
+KPX Odieresis period -25
+KPX Ograve T 10
+KPX Ograve Tcaron 10
+KPX Ograve Tcommaaccent 10
+KPX Ograve comma -25
+KPX Ograve period -25
+KPX Ohungarumlaut T 10
+KPX Ohungarumlaut Tcaron 10
+KPX Ohungarumlaut Tcommaaccent 10
+KPX Ohungarumlaut comma -25
+KPX Ohungarumlaut period -25
+KPX Omacron T 10
+KPX Omacron Tcaron 10
+KPX Omacron Tcommaaccent 10
+KPX Omacron comma -25
+KPX Omacron period -25
+KPX Oslash T 10
+KPX Oslash Tcaron 10
+KPX Oslash Tcommaaccent 10
+KPX Oslash comma -25
+KPX Oslash period -25
+KPX Otilde T 10
+KPX Otilde Tcaron 10
+KPX Otilde Tcommaaccent 10
+KPX Otilde comma -25
+KPX Otilde period -25
+KPX P A -74
+KPX P Aacute -74
+KPX P Abreve -74
+KPX P Acircumflex -74
+KPX P Adieresis -74
+KPX P Agrave -74
+KPX P Amacron -74
+KPX P Aogonek -74
+KPX P Aring -74
+KPX P Atilde -74
+KPX P a -55
+KPX P aacute -55
+KPX P abreve -55
+KPX P acircumflex -55
+KPX P adieresis -55
+KPX P agrave -55
+KPX P amacron -55
+KPX P aogonek -55
+KPX P aring -55
+KPX P atilde -55
+KPX P comma -150
+KPX P e -55
+KPX P eacute -55
+KPX P ecaron -55
+KPX P ecircumflex -55
+KPX P edieresis -55
+KPX P edotaccent -55
+KPX P egrave -55
+KPX P emacron -55
+KPX P eogonek -55
+KPX P o -55
+KPX P oacute -55
+KPX P ocircumflex -55
+KPX P odieresis -55
+KPX P ograve -55
+KPX P ohungarumlaut -55
+KPX P omacron -55
+KPX P oslash -55
+KPX P otilde -55
+KPX P period -150
+KPX S comma -18
+KPX S period -18
+KPX Sacute comma -18
+KPX Sacute period -18
+KPX Scaron comma -18
+KPX Scaron period -18
+KPX Scedilla comma -18
+KPX Scedilla period -18
+KPX Scommaaccent comma -18
+KPX Scommaaccent period -18
+KPX T A -55
+KPX T Aacute -55
+KPX T Abreve -55
+KPX T Acircumflex -55
+KPX T Adieresis -55
+KPX T Agrave -55
+KPX T Amacron -55
+KPX T Aogonek -55
+KPX T Aring -55
+KPX T Atilde -55
+KPX T O 10
+KPX T Oacute 10
+KPX T Ocircumflex 10
+KPX T Odieresis 10
+KPX T Ograve 10
+KPX T Ohungarumlaut 10
+KPX T Omacron 10
+KPX T Oslash 10
+KPX T Otilde 10
+KPX T a -74
+KPX T aacute -74
+KPX T abreve -74
+KPX T acircumflex -74
+KPX T adieresis -74
+KPX T agrave -74
+KPX T amacron -74
+KPX T aogonek -74
+KPX T aring -74
+KPX T atilde -74
+KPX T comma -100
+KPX T e -74
+KPX T eacute -74
+KPX T ecaron -74
+KPX T ecircumflex -74
+KPX T edieresis -74
+KPX T edotaccent -74
+KPX T egrave -74
+KPX T emacron -74
+KPX T eogonek -74
+KPX T hyphen -125
+KPX T i -18
+KPX T iacute -18
+KPX T icircumflex -18
+KPX T idieresis -18
+KPX T igrave -18
+KPX T imacron -18
+KPX T iogonek -18
+KPX T o -74
+KPX T oacute -74
+KPX T ocircumflex -74
+KPX T odieresis -74
+KPX T ograve -74
+KPX T ohungarumlaut -74
+KPX T omacron -74
+KPX T oslash -74
+KPX T otilde -74
+KPX T period -100
+KPX T r -18
+KPX T racute -18
+KPX T rcaron -18
+KPX T rcommaaccent -18
+KPX T u -18
+KPX T uacute -18
+KPX T ucircumflex -18
+KPX T udieresis -18
+KPX T ugrave -18
+KPX T uhungarumlaut -18
+KPX T umacron -18
+KPX T uogonek -18
+KPX T uring -18
+KPX Tcaron A -55
+KPX Tcaron Aacute -55
+KPX Tcaron Abreve -55
+KPX Tcaron Acircumflex -55
+KPX Tcaron Adieresis -55
+KPX Tcaron Agrave -55
+KPX Tcaron Amacron -55
+KPX Tcaron Aogonek -55
+KPX Tcaron Aring -55
+KPX Tcaron Atilde -55
+KPX Tcaron O 10
+KPX Tcaron Oacute 10
+KPX Tcaron Ocircumflex 10
+KPX Tcaron Odieresis 10
+KPX Tcaron Ograve 10
+KPX Tcaron Ohungarumlaut 10
+KPX Tcaron Omacron 10
+KPX Tcaron Oslash 10
+KPX Tcaron Otilde 10
+KPX Tcaron a -74
+KPX Tcaron aacute -74
+KPX Tcaron abreve -74
+KPX Tcaron acircumflex -74
+KPX Tcaron adieresis -74
+KPX Tcaron agrave -74
+KPX Tcaron amacron -74
+KPX Tcaron aogonek -74
+KPX Tcaron aring -74
+KPX Tcaron atilde -74
+KPX Tcaron comma -100
+KPX Tcaron e -74
+KPX Tcaron eacute -74
+KPX Tcaron ecaron -74
+KPX Tcaron ecircumflex -74
+KPX Tcaron edieresis -74
+KPX Tcaron edotaccent -74
+KPX Tcaron egrave -74
+KPX Tcaron emacron -74
+KPX Tcaron eogonek -74
+KPX Tcaron hyphen -125
+KPX Tcaron i -18
+KPX Tcaron iacute -18
+KPX Tcaron icircumflex -18
+KPX Tcaron idieresis -18
+KPX Tcaron igrave -18
+KPX Tcaron imacron -18
+KPX Tcaron iogonek -18
+KPX Tcaron o -74
+KPX Tcaron oacute -74
+KPX Tcaron ocircumflex -74
+KPX Tcaron odieresis -74
+KPX Tcaron ograve -74
+KPX Tcaron ohungarumlaut -74
+KPX Tcaron omacron -74
+KPX Tcaron oslash -74
+KPX Tcaron otilde -74
+KPX Tcaron period -100
+KPX Tcaron r -18
+KPX Tcaron racute -18
+KPX Tcaron rcaron -18
+KPX Tcaron rcommaaccent -18
+KPX Tcaron u -18
+KPX Tcaron uacute -18
+KPX Tcaron ucircumflex -18
+KPX Tcaron udieresis -18
+KPX Tcaron ugrave -18
+KPX Tcaron uhungarumlaut -18
+KPX Tcaron umacron -18
+KPX Tcaron uogonek -18
+KPX Tcaron uring -18
+KPX Tcommaaccent A -55
+KPX Tcommaaccent Aacute -55
+KPX Tcommaaccent Abreve -55
+KPX Tcommaaccent Acircumflex -55
+KPX Tcommaaccent Adieresis -55
+KPX Tcommaaccent Agrave -55
+KPX Tcommaaccent Amacron -55
+KPX Tcommaaccent Aogonek -55
+KPX Tcommaaccent Aring -55
+KPX Tcommaaccent Atilde -55
+KPX Tcommaaccent O 10
+KPX Tcommaaccent Oacute 10
+KPX Tcommaaccent Ocircumflex 10
+KPX Tcommaaccent Odieresis 10
+KPX Tcommaaccent Ograve 10
+KPX Tcommaaccent Ohungarumlaut 10
+KPX Tcommaaccent Omacron 10
+KPX Tcommaaccent Oslash 10
+KPX Tcommaaccent Otilde 10
+KPX Tcommaaccent a -74
+KPX Tcommaaccent aacute -74
+KPX Tcommaaccent abreve -74
+KPX Tcommaaccent acircumflex -74
+KPX Tcommaaccent adieresis -74
+KPX Tcommaaccent agrave -74
+KPX Tcommaaccent amacron -74
+KPX Tcommaaccent aogonek -74
+KPX Tcommaaccent aring -74
+KPX Tcommaaccent atilde -74
+KPX Tcommaaccent comma -100
+KPX Tcommaaccent e -74
+KPX Tcommaaccent eacute -74
+KPX Tcommaaccent ecaron -74
+KPX Tcommaaccent ecircumflex -74
+KPX Tcommaaccent edieresis -74
+KPX Tcommaaccent edotaccent -74
+KPX Tcommaaccent egrave -74
+KPX Tcommaaccent emacron -74
+KPX Tcommaaccent eogonek -74
+KPX Tcommaaccent hyphen -125
+KPX Tcommaaccent i -18
+KPX Tcommaaccent iacute -18
+KPX Tcommaaccent icircumflex -18
+KPX Tcommaaccent idieresis -18
+KPX Tcommaaccent igrave -18
+KPX Tcommaaccent imacron -18
+KPX Tcommaaccent iogonek -18
+KPX Tcommaaccent o -74
+KPX Tcommaaccent oacute -74
+KPX Tcommaaccent ocircumflex -74
+KPX Tcommaaccent odieresis -74
+KPX Tcommaaccent ograve -74
+KPX Tcommaaccent ohungarumlaut -74
+KPX Tcommaaccent omacron -74
+KPX Tcommaaccent oslash -74
+KPX Tcommaaccent otilde -74
+KPX Tcommaaccent period -100
+KPX Tcommaaccent r -18
+KPX Tcommaaccent racute -18
+KPX Tcommaaccent rcaron -18
+KPX Tcommaaccent rcommaaccent -18
+KPX Tcommaaccent u -18
+KPX Tcommaaccent uacute -18
+KPX Tcommaaccent ucircumflex -18
+KPX Tcommaaccent udieresis -18
+KPX Tcommaaccent ugrave -18
+KPX Tcommaaccent uhungarumlaut -18
+KPX Tcommaaccent umacron -18
+KPX Tcommaaccent uogonek -18
+KPX Tcommaaccent uring -18
+KPX U A -18
+KPX U Aacute -18
+KPX U Abreve -18
+KPX U Acircumflex -18
+KPX U Adieresis -18
+KPX U Agrave -18
+KPX U Amacron -18
+KPX U Aogonek -18
+KPX U Aring -18
+KPX U Atilde -18
+KPX U comma -25
+KPX U period -25
+KPX Uacute A -18
+KPX Uacute Aacute -18
+KPX Uacute Abreve -18
+KPX Uacute Acircumflex -18
+KPX Uacute Adieresis -18
+KPX Uacute Agrave -18
+KPX Uacute Amacron -18
+KPX Uacute Aogonek -18
+KPX Uacute Aring -18
+KPX Uacute Atilde -18
+KPX Uacute comma -25
+KPX Uacute period -25
+KPX Ucircumflex A -18
+KPX Ucircumflex Aacute -18
+KPX Ucircumflex Abreve -18
+KPX Ucircumflex Acircumflex -18
+KPX Ucircumflex Adieresis -18
+KPX Ucircumflex Agrave -18
+KPX Ucircumflex Amacron -18
+KPX Ucircumflex Aogonek -18
+KPX Ucircumflex Aring -18
+KPX Ucircumflex Atilde -18
+KPX Ucircumflex comma -25
+KPX Ucircumflex period -25
+KPX Udieresis A -18
+KPX Udieresis Aacute -18
+KPX Udieresis Abreve -18
+KPX Udieresis Acircumflex -18
+KPX Udieresis Adieresis -18
+KPX Udieresis Agrave -18
+KPX Udieresis Amacron -18
+KPX Udieresis Aogonek -18
+KPX Udieresis Aring -18
+KPX Udieresis Atilde -18
+KPX Udieresis comma -25
+KPX Udieresis period -25
+KPX Ugrave A -18
+KPX Ugrave Aacute -18
+KPX Ugrave Abreve -18
+KPX Ugrave Acircumflex -18
+KPX Ugrave Adieresis -18
+KPX Ugrave Agrave -18
+KPX Ugrave Amacron -18
+KPX Ugrave Aogonek -18
+KPX Ugrave Aring -18
+KPX Ugrave Atilde -18
+KPX Ugrave comma -25
+KPX Ugrave period -25
+KPX Uhungarumlaut A -18
+KPX Uhungarumlaut Aacute -18
+KPX Uhungarumlaut Abreve -18
+KPX Uhungarumlaut Acircumflex -18
+KPX Uhungarumlaut Adieresis -18
+KPX Uhungarumlaut Agrave -18
+KPX Uhungarumlaut Amacron -18
+KPX Uhungarumlaut Aogonek -18
+KPX Uhungarumlaut Aring -18
+KPX Uhungarumlaut Atilde -18
+KPX Uhungarumlaut comma -25
+KPX Uhungarumlaut period -25
+KPX Umacron A -18
+KPX Umacron Aacute -18
+KPX Umacron Abreve -18
+KPX Umacron Acircumflex -18
+KPX Umacron Adieresis -18
+KPX Umacron Agrave -18
+KPX Umacron Amacron -18
+KPX Umacron Aogonek -18
+KPX Umacron Aring -18
+KPX Umacron Atilde -18
+KPX Umacron comma -25
+KPX Umacron period -25
+KPX Uogonek A -18
+KPX Uogonek Aacute -18
+KPX Uogonek Abreve -18
+KPX Uogonek Acircumflex -18
+KPX Uogonek Adieresis -18
+KPX Uogonek Agrave -18
+KPX Uogonek Amacron -18
+KPX Uogonek Aogonek -18
+KPX Uogonek Aring -18
+KPX Uogonek Atilde -18
+KPX Uogonek comma -25
+KPX Uogonek period -25
+KPX Uring A -18
+KPX Uring Aacute -18
+KPX Uring Abreve -18
+KPX Uring Acircumflex -18
+KPX Uring Adieresis -18
+KPX Uring Agrave -18
+KPX Uring Amacron -18
+KPX Uring Aogonek -18
+KPX Uring Aring -18
+KPX Uring Atilde -18
+KPX Uring comma -25
+KPX Uring period -25
+KPX V A -74
+KPX V Aacute -74
+KPX V Abreve -74
+KPX V Acircumflex -74
+KPX V Adieresis -74
+KPX V Agrave -74
+KPX V Amacron -74
+KPX V Aogonek -74
+KPX V Aring -74
+KPX V Atilde -74
+KPX V a -74
+KPX V aacute -74
+KPX V abreve -74
+KPX V acircumflex -74
+KPX V adieresis -74
+KPX V agrave -74
+KPX V amacron -74
+KPX V aogonek -74
+KPX V aring -74
+KPX V atilde -74
+KPX V colon -37
+KPX V comma -125
+KPX V e -74
+KPX V eacute -74
+KPX V ecaron -74
+KPX V ecircumflex -74
+KPX V edieresis -74
+KPX V edotaccent -74
+KPX V egrave -74
+KPX V emacron -74
+KPX V eogonek -74
+KPX V hyphen -100
+KPX V i -18
+KPX V iacute -18
+KPX V icircumflex -18
+KPX V idieresis -18
+KPX V igrave -18
+KPX V imacron -18
+KPX V iogonek -18
+KPX V o -74
+KPX V oacute -74
+KPX V ocircumflex -74
+KPX V odieresis -74
+KPX V ograve -74
+KPX V ohungarumlaut -74
+KPX V omacron -74
+KPX V oslash -74
+KPX V otilde -74
+KPX V period -125
+KPX V semicolon -37
+KPX V u -55
+KPX V uacute -55
+KPX V ucircumflex -55
+KPX V udieresis -55
+KPX V ugrave -55
+KPX V uhungarumlaut -55
+KPX V umacron -55
+KPX V uogonek -55
+KPX V uring -55
+KPX W A -74
+KPX W Aacute -74
+KPX W Abreve -74
+KPX W Acircumflex -74
+KPX W Adieresis -74
+KPX W Agrave -74
+KPX W Amacron -74
+KPX W Aogonek -74
+KPX W Aring -74
+KPX W Atilde -74
+KPX W a -74
+KPX W aacute -74
+KPX W abreve -74
+KPX W acircumflex -74
+KPX W adieresis -74
+KPX W agrave -74
+KPX W amacron -74
+KPX W aogonek -74
+KPX W aring -74
+KPX W atilde -74
+KPX W colon -55
+KPX W comma -100
+KPX W e -74
+KPX W eacute -74
+KPX W ecaron -74
+KPX W ecircumflex -74
+KPX W edieresis -74
+KPX W edotaccent -74
+KPX W egrave -74
+KPX W emacron -74
+KPX W eogonek -74
+KPX W hyphen -100
+KPX W i -18
+KPX W iacute -18
+KPX W icircumflex -18
+KPX W idieresis -18
+KPX W igrave -18
+KPX W imacron -18
+KPX W iogonek -18
+KPX W o -74
+KPX W oacute -74
+KPX W ocircumflex -74
+KPX W odieresis -74
+KPX W ograve -74
+KPX W ohungarumlaut -74
+KPX W omacron -74
+KPX W oslash -74
+KPX W otilde -74
+KPX W period -100
+KPX W semicolon -55
+KPX W u -37
+KPX W uacute -37
+KPX W ucircumflex -37
+KPX W udieresis -37
+KPX W ugrave -37
+KPX W uhungarumlaut -37
+KPX W umacron -37
+KPX W uogonek -37
+KPX W uring -37
+KPX W y -25
+KPX W yacute -25
+KPX W ydieresis -25
+KPX Y A -91
+KPX Y Aacute -91
+KPX Y Abreve -91
+KPX Y Acircumflex -91
+KPX Y Adieresis -91
+KPX Y Agrave -91
+KPX Y Amacron -91
+KPX Y Aogonek -91
+KPX Y Aring -91
+KPX Y Atilde -91
+KPX Y a -100
+KPX Y aacute -100
+KPX Y abreve -100
+KPX Y acircumflex -100
+KPX Y adieresis -100
+KPX Y agrave -100
+KPX Y amacron -100
+KPX Y aogonek -100
+KPX Y aring -100
+KPX Y atilde -100
+KPX Y colon -25
+KPX Y comma -100
+KPX Y e -100
+KPX Y eacute -100
+KPX Y ecaron -40
+KPX Y ecircumflex -100
+KPX Y edieresis -40
+KPX Y edotaccent -100
+KPX Y egrave -40
+KPX Y emacron -40
+KPX Y eogonek -100
+KPX Y hyphen -125
+KPX Y i -18
+KPX Y iacute -18
+KPX Y icircumflex -18
+KPX Y iogonek -18
+KPX Y o -100
+KPX Y oacute -100
+KPX Y ocircumflex -100
+KPX Y odieresis -40
+KPX Y ograve -40
+KPX Y ohungarumlaut -100
+KPX Y omacron -40
+KPX Y oslash -100
+KPX Y otilde -100
+KPX Y period -100
+KPX Y semicolon -25
+KPX Y u -55
+KPX Y uacute -55
+KPX Y ucircumflex -55
+KPX Y udieresis -55
+KPX Y ugrave -55
+KPX Y uhungarumlaut -55
+KPX Y umacron -55
+KPX Y uogonek -55
+KPX Y uring -55
+KPX Yacute A -91
+KPX Yacute Aacute -91
+KPX Yacute Abreve -91
+KPX Yacute Acircumflex -91
+KPX Yacute Adieresis -91
+KPX Yacute Agrave -91
+KPX Yacute Amacron -91
+KPX Yacute Aogonek -91
+KPX Yacute Aring -91
+KPX Yacute Atilde -91
+KPX Yacute a -100
+KPX Yacute aacute -100
+KPX Yacute abreve -100
+KPX Yacute acircumflex -100
+KPX Yacute adieresis -100
+KPX Yacute agrave -100
+KPX Yacute amacron -100
+KPX Yacute aogonek -100
+KPX Yacute aring -100
+KPX Yacute atilde -100
+KPX Yacute colon -25
+KPX Yacute comma -100
+KPX Yacute e -100
+KPX Yacute eacute -100
+KPX Yacute ecaron -40
+KPX Yacute ecircumflex -100
+KPX Yacute edieresis -40
+KPX Yacute edotaccent -100
+KPX Yacute egrave -40
+KPX Yacute emacron -40
+KPX Yacute eogonek -100
+KPX Yacute hyphen -125
+KPX Yacute i -18
+KPX Yacute iacute -18
+KPX Yacute icircumflex -18
+KPX Yacute iogonek -18
+KPX Yacute o -100
+KPX Yacute oacute -100
+KPX Yacute ocircumflex -100
+KPX Yacute odieresis -40
+KPX Yacute ograve -40
+KPX Yacute ohungarumlaut -100
+KPX Yacute omacron -40
+KPX Yacute oslash -100
+KPX Yacute otilde -100
+KPX Yacute period -100
+KPX Yacute semicolon -25
+KPX Yacute u -55
+KPX Yacute uacute -55
+KPX Yacute ucircumflex -55
+KPX Yacute udieresis -55
+KPX Yacute ugrave -55
+KPX Yacute uhungarumlaut -55
+KPX Yacute umacron -55
+KPX Yacute uogonek -55
+KPX Yacute uring -55
+KPX Ydieresis A -91
+KPX Ydieresis Aacute -91
+KPX Ydieresis Abreve -91
+KPX Ydieresis Acircumflex -91
+KPX Ydieresis Adieresis -91
+KPX Ydieresis Agrave -91
+KPX Ydieresis Amacron -91
+KPX Ydieresis Aogonek -91
+KPX Ydieresis Aring -91
+KPX Ydieresis Atilde -91
+KPX Ydieresis a -100
+KPX Ydieresis aacute -100
+KPX Ydieresis abreve -100
+KPX Ydieresis acircumflex -100
+KPX Ydieresis adieresis -100
+KPX Ydieresis agrave -100
+KPX Ydieresis amacron -100
+KPX Ydieresis aogonek -100
+KPX Ydieresis aring -100
+KPX Ydieresis atilde -100
+KPX Ydieresis colon -25
+KPX Ydieresis comma -100
+KPX Ydieresis e -100
+KPX Ydieresis eacute -100
+KPX Ydieresis ecaron -40
+KPX Ydieresis ecircumflex -100
+KPX Ydieresis edieresis -40
+KPX Ydieresis edotaccent -100
+KPX Ydieresis egrave -40
+KPX Ydieresis emacron -40
+KPX Ydieresis eogonek -100
+KPX Ydieresis hyphen -125
+KPX Ydieresis i -18
+KPX Ydieresis iacute -18
+KPX Ydieresis icircumflex -18
+KPX Ydieresis iogonek -18
+KPX Ydieresis o -100
+KPX Ydieresis oacute -100
+KPX Ydieresis ocircumflex -100
+KPX Ydieresis odieresis -40
+KPX Ydieresis ograve -40
+KPX Ydieresis ohungarumlaut -100
+KPX Ydieresis omacron -40
+KPX Ydieresis oslash -100
+KPX Ydieresis otilde -100
+KPX Ydieresis period -100
+KPX Ydieresis semicolon -25
+KPX Ydieresis u -55
+KPX Ydieresis uacute -55
+KPX Ydieresis ucircumflex -55
+KPX Ydieresis udieresis -55
+KPX Ydieresis ugrave -55
+KPX Ydieresis uhungarumlaut -55
+KPX Ydieresis umacron -55
+KPX Ydieresis uogonek -55
+KPX Ydieresis uring -55
+KPX colon space -18
+KPX comma quotedblright -18
+KPX comma quoteright -18
+KPX comma space -18
+KPX f quotedblright 75
+KPX f quoteright 75
+KPX period quotedblright -18
+KPX period quoteright -18
+KPX period space -18
+KPX quotedblleft A -74
+KPX quotedblleft Aacute -74
+KPX quotedblleft Abreve -74
+KPX quotedblleft Acircumflex -74
+KPX quotedblleft Adieresis -74
+KPX quotedblleft Agrave -74
+KPX quotedblleft Amacron -74
+KPX quotedblleft Aogonek -74
+KPX quotedblleft Aring -74
+KPX quotedblleft Atilde -74
+KPX quotedblright space -18
+KPX quoteleft A -74
+KPX quoteleft Aacute -74
+KPX quoteleft Abreve -74
+KPX quoteleft Acircumflex -74
+KPX quoteleft Adieresis -74
+KPX quoteleft Agrave -74
+KPX quoteleft Amacron -74
+KPX quoteleft Aogonek -74
+KPX quoteleft Aring -74
+KPX quoteleft Atilde -74
+KPX quoteright d -25
+KPX quoteright dcroat -25
+KPX quoteright s -25
+KPX quoteright sacute -25
+KPX quoteright scaron -25
+KPX quoteright scedilla -25
+KPX quoteright scommaaccent -25
+KPX r comma -74
+KPX r period -74
+KPX racute comma -74
+KPX racute period -74
+KPX rcaron comma -74
+KPX rcaron period -74
+KPX rcommaaccent comma -74
+KPX rcommaaccent period -74
+KPX semicolon space -18
+KPX space A -18
+KPX space Aacute -18
+KPX space Abreve -18
+KPX space Acircumflex -18
+KPX space Adieresis -18
+KPX space Agrave -18
+KPX space Amacron -18
+KPX space Aogonek -18
+KPX space Aring -18
+KPX space Atilde -18
+KPX space T -18
+KPX space Tcaron -18
+KPX space Tcommaaccent -18
+KPX space V -18
+KPX space W -18
+KPX space Y -18
+KPX space Yacute -18
+KPX space Ydieresis -18
+KPX space quotedblleft -18
+KPX space quoteleft -18
+KPX v comma -100
+KPX v period -100
+KPX w comma -100
+KPX w period -100
+KPX y comma -100
+KPX y period -100
+KPX yacute comma -100
+KPX yacute period -100
+KPX ydieresis comma -100
+KPX ydieresis period -100
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/src/fonts/Adobe-Core35_AFMs-314/NewCenturySchlbk-BoldItalic.afm b/src/fonts/Adobe-Core35_AFMs-314/NewCenturySchlbk-BoldItalic.afm
new file mode 100644
index 0000000..f086dd2
--- /dev/null
+++ b/src/fonts/Adobe-Core35_AFMs-314/NewCenturySchlbk-BoldItalic.afm
@@ -0,0 +1,2997 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1985, 1987, 1989, 1991, 1992, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Thu May 1 14:34:01 1997
+Comment UniqueID 43097
+Comment VMusage 44127 55152
+FontName NewCenturySchlbk-BoldItalic
+FullName New Century Schoolbook Bold Italic
+FamilyName New Century Schoolbook
+Weight Bold
+ItalicAngle -16
+IsFixedPitch false
+FontBBox -205 -250 1147 991
+UnderlinePosition -100
+UnderlineThickness 50
+Version 002.000
+Notice Copyright (c) 1985, 1987, 1989, 1991, 1992, 1997 Adobe Systems Incorporated. All Rights Reserved.
+EncodingScheme AdobeStandardEncoding
+CapHeight 722
+XHeight 477
+Ascender 737
+Descender -205
+StdHW 54
+StdVW 150
+StartCharMetrics 314
+C 32 ; WX 287 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 333 ; N exclam ; B 0 -15 333 737 ;
+C 34 ; WX 400 ; N quotedbl ; B 66 388 428 737 ;
+C 35 ; WX 574 ; N numbersign ; B 30 0 544 690 ;
+C 36 ; WX 574 ; N dollar ; B 9 -120 565 810 ;
+C 37 ; WX 889 ; N percent ; B 54 -28 835 727 ;
+C 38 ; WX 889 ; N ampersand ; B 32 -15 823 737 ;
+C 39 ; WX 259 ; N quoteright ; B 48 388 275 737 ;
+C 40 ; WX 407 ; N parenleft ; B 72 -117 454 745 ;
+C 41 ; WX 407 ; N parenright ; B -70 -117 310 745 ;
+C 42 ; WX 500 ; N asterisk ; B 58 301 498 737 ;
+C 43 ; WX 606 ; N plus ; B 50 0 556 506 ;
+C 44 ; WX 287 ; N comma ; B -57 -192 170 157 ;
+C 45 ; WX 333 ; N hyphen ; B 2 177 263 299 ;
+C 46 ; WX 287 ; N period ; B -20 -15 152 157 ;
+C 47 ; WX 278 ; N slash ; B -41 -15 320 737 ;
+C 48 ; WX 574 ; N zero ; B 21 -15 553 705 ;
+C 49 ; WX 574 ; N one ; B 25 0 489 705 ;
+C 50 ; WX 574 ; N two ; B -38 -3 538 705 ;
+C 51 ; WX 574 ; N three ; B -7 -15 536 705 ;
+C 52 ; WX 574 ; N four ; B -13 0 544 705 ;
+C 53 ; WX 574 ; N five ; B 0 -15 574 705 ;
+C 54 ; WX 574 ; N six ; B 31 -15 574 705 ;
+C 55 ; WX 574 ; N seven ; B 64 -15 593 705 ;
+C 56 ; WX 574 ; N eight ; B 0 -15 552 705 ;
+C 57 ; WX 574 ; N nine ; B 0 -15 543 705 ;
+C 58 ; WX 287 ; N colon ; B -20 -15 237 477 ;
+C 59 ; WX 287 ; N semicolon ; B -57 -192 237 477 ;
+C 60 ; WX 606 ; N less ; B 50 -9 556 515 ;
+C 61 ; WX 606 ; N equal ; B 50 103 556 403 ;
+C 62 ; WX 606 ; N greater ; B 50 -8 556 514 ;
+C 63 ; WX 481 ; N question ; B 79 -15 451 737 ;
+C 64 ; WX 747 ; N at ; B -4 -15 751 737 ;
+C 65 ; WX 741 ; N A ; B -75 0 716 737 ;
+C 66 ; WX 759 ; N B ; B -50 0 721 722 ;
+C 67 ; WX 759 ; N C ; B 37 -15 759 737 ;
+C 68 ; WX 833 ; N D ; B -47 0 796 722 ;
+C 69 ; WX 741 ; N E ; B -41 0 730 722 ;
+C 70 ; WX 704 ; N F ; B -41 0 730 722 ;
+C 71 ; WX 815 ; N G ; B 37 -15 805 737 ;
+C 72 ; WX 870 ; N H ; B -41 0 911 722 ;
+C 73 ; WX 444 ; N I ; B -41 0 485 722 ;
+C 74 ; WX 667 ; N J ; B -20 -15 708 722 ;
+C 75 ; WX 778 ; N K ; B -41 0 832 722 ;
+C 76 ; WX 704 ; N L ; B -41 0 670 722 ;
+C 77 ; WX 944 ; N M ; B -44 0 988 722 ;
+C 78 ; WX 852 ; N N ; B -61 -10 913 722 ;
+C 79 ; WX 833 ; N O ; B 37 -15 796 737 ;
+C 80 ; WX 741 ; N P ; B -41 0 730 722 ;
+C 81 ; WX 833 ; N Q ; B 37 -189 796 737 ;
+C 82 ; WX 796 ; N R ; B -41 -15 749 722 ;
+C 83 ; WX 685 ; N S ; B 1 -15 666 737 ;
+C 84 ; WX 722 ; N T ; B 41 0 759 722 ;
+C 85 ; WX 833 ; N U ; B 88 -15 900 722 ;
+C 86 ; WX 741 ; N V ; B 32 -10 802 722 ;
+C 87 ; WX 944 ; N W ; B 40 -10 1000 722 ;
+C 88 ; WX 741 ; N X ; B -82 0 801 722 ;
+C 89 ; WX 704 ; N Y ; B 13 0 775 722 ;
+C 90 ; WX 704 ; N Z ; B -33 0 711 722 ;
+C 91 ; WX 407 ; N bracketleft ; B 1 -109 464 737 ;
+C 92 ; WX 606 ; N backslash ; B 161 -15 445 737 ;
+C 93 ; WX 407 ; N bracketright ; B -101 -109 362 737 ;
+C 94 ; WX 606 ; N asciicircum ; B 66 325 540 690 ;
+C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;
+C 96 ; WX 259 ; N quoteleft ; B 47 388 274 737 ;
+C 97 ; WX 667 ; N a ; B 6 -15 636 477 ;
+C 98 ; WX 611 ; N b ; B 29 -15 557 737 ;
+C 99 ; WX 537 ; N c ; B 0 -15 482 477 ;
+C 100 ; WX 667 ; N d ; B 0 -15 660 737 ;
+C 101 ; WX 519 ; N e ; B 0 -15 479 477 ;
+C 102 ; WX 389 ; N f ; B -48 -205 550 737 ; L i fi ; L l fl ;
+C 103 ; WX 611 ; N g ; B -63 -205 604 528 ;
+C 104 ; WX 685 ; N h ; B 0 -15 639 737 ;
+C 105 ; WX 389 ; N i ; B 32 -15 345 737 ;
+C 106 ; WX 370 ; N j ; B -205 -205 347 737 ;
+C 107 ; WX 648 ; N k ; B -11 -15 578 737 ;
+C 108 ; WX 389 ; N l ; B 32 -15 375 737 ;
+C 109 ; WX 944 ; N m ; B 0 -15 909 477 ;
+C 110 ; WX 685 ; N n ; B 0 -15 639 477 ;
+C 111 ; WX 574 ; N o ; B 0 -15 530 477 ;
+C 112 ; WX 648 ; N p ; B -119 -205 590 477 ;
+C 113 ; WX 630 ; N q ; B 0 -205 587 477 ;
+C 114 ; WX 519 ; N r ; B 0 0 527 486 ;
+C 115 ; WX 481 ; N s ; B 0 -15 435 477 ;
+C 116 ; WX 407 ; N t ; B 24 -15 403 650 ;
+C 117 ; WX 685 ; N u ; B 30 -15 635 477 ;
+C 118 ; WX 556 ; N v ; B 30 -15 496 477 ;
+C 119 ; WX 833 ; N w ; B 30 -15 773 477 ;
+C 120 ; WX 574 ; N x ; B -46 -15 574 477 ;
+C 121 ; WX 519 ; N y ; B -66 -205 493 477 ;
+C 122 ; WX 519 ; N z ; B -19 -15 473 477 ;
+C 123 ; WX 407 ; N braceleft ; B 52 -109 408 737 ;
+C 124 ; WX 606 ; N bar ; B 249 -250 357 750 ;
+C 125 ; WX 407 ; N braceright ; B -25 -109 331 737 ;
+C 126 ; WX 606 ; N asciitilde ; B 72 160 534 346 ;
+C 161 ; WX 333 ; N exclamdown ; B -44 -205 289 547 ;
+C 162 ; WX 574 ; N cent ; B 30 -144 512 578 ;
+C 163 ; WX 574 ; N sterling ; B -18 -15 566 705 ;
+C 164 ; WX 167 ; N fraction ; B -166 -15 333 705 ;
+C 165 ; WX 574 ; N yen ; B 17 0 629 690 ;
+C 166 ; WX 574 ; N florin ; B -43 -205 575 737 ;
+C 167 ; WX 500 ; N section ; B -30 -146 515 737 ;
+C 168 ; WX 574 ; N currency ; B 27 84 547 605 ;
+C 169 ; WX 287 ; N quotesingle ; B 112 388 250 737 ;
+C 170 ; WX 481 ; N quotedblleft ; B 54 388 521 737 ;
+C 171 ; WX 481 ; N guillemotleft ; B -35 69 449 407 ;
+C 172 ; WX 278 ; N guilsinglleft ; B -25 69 244 407 ;
+C 173 ; WX 278 ; N guilsinglright ; B -26 69 243 407 ;
+C 174 ; WX 685 ; N fi ; B -70 -205 641 737 ;
+C 175 ; WX 685 ; N fl ; B -70 -205 671 737 ;
+C 177 ; WX 500 ; N endash ; B -47 189 479 287 ;
+C 178 ; WX 500 ; N dagger ; B 48 -146 508 737 ;
+C 179 ; WX 500 ; N daggerdbl ; B -60 -150 508 737 ;
+C 180 ; WX 287 ; N periodcentered ; B 57 200 229 372 ;
+C 182 ; WX 650 ; N paragraph ; B 25 -131 681 722 ;
+C 183 ; WX 606 ; N bullet ; B 122 180 484 542 ;
+C 184 ; WX 259 ; N quotesinglbase ; B -57 -192 170 157 ;
+C 185 ; WX 481 ; N quotedblbase ; B -57 -192 412 157 ;
+C 186 ; WX 481 ; N quotedblright ; B 43 388 510 737 ;
+C 187 ; WX 481 ; N guillemotright ; B -31 69 453 407 ;
+C 188 ; WX 1000 ; N ellipsis ; B 81 -15 919 157 ;
+C 189 ; WX 1167 ; N perthousand ; B 20 -28 1147 727 ;
+C 191 ; WX 481 ; N questiondown ; B 0 -205 372 547 ;
+C 193 ; WX 333 ; N grave ; B 74 538 294 722 ;
+C 194 ; WX 333 ; N acute ; B 123 538 372 722 ;
+C 195 ; WX 333 ; N circumflex ; B 23 533 365 705 ;
+C 196 ; WX 333 ; N tilde ; B 28 561 398 690 ;
+C 197 ; WX 333 ; N macron ; B 47 573 404 649 ;
+C 198 ; WX 333 ; N breve ; B 67 535 390 698 ;
+C 199 ; WX 333 ; N dotaccent ; B 145 571 311 737 ;
+C 200 ; WX 333 ; N dieresis ; B 33 571 393 715 ;
+C 202 ; WX 333 ; N ring ; B 111 522 335 746 ;
+C 203 ; WX 333 ; N cedilla ; B -21 -220 225 3 ;
+C 205 ; WX 333 ; N hungarumlaut ; B 15 538 480 722 ;
+C 206 ; WX 333 ; N ogonek ; B 36 -220 338 4 ;
+C 207 ; WX 333 ; N caron ; B 60 531 403 705 ;
+C 208 ; WX 1000 ; N emdash ; B -47 189 979 287 ;
+C 225 ; WX 889 ; N AE ; B -86 0 915 722 ;
+C 227 ; WX 412 ; N ordfeminine ; B 47 407 460 705 ;
+C 232 ; WX 704 ; N Lslash ; B -41 0 670 722 ;
+C 233 ; WX 833 ; N Oslash ; B 35 -68 798 790 ;
+C 234 ; WX 963 ; N OE ; B 29 0 989 722 ;
+C 235 ; WX 356 ; N ordmasculine ; B 42 407 394 705 ;
+C 241 ; WX 815 ; N ae ; B -18 -15 775 477 ;
+C 245 ; WX 389 ; N dotlessi ; B 32 -15 345 477 ;
+C 248 ; WX 389 ; N lslash ; B 24 -15 387 737 ;
+C 249 ; WX 574 ; N oslash ; B 0 -121 530 583 ;
+C 250 ; WX 852 ; N oe ; B -6 -15 812 477 ;
+C 251 ; WX 574 ; N germandbls ; B -91 -205 540 737 ;
+C -1 ; WX 444 ; N Idieresis ; B -41 0 509 915 ;
+C -1 ; WX 519 ; N eacute ; B 0 -15 479 722 ;
+C -1 ; WX 667 ; N abreve ; B 6 -15 636 698 ;
+C -1 ; WX 685 ; N uhungarumlaut ; B 30 -15 656 722 ;
+C -1 ; WX 519 ; N ecaron ; B 0 -15 496 705 ;
+C -1 ; WX 704 ; N Ydieresis ; B 13 0 775 915 ;
+C -1 ; WX 606 ; N divide ; B 50 -40 556 546 ;
+C -1 ; WX 704 ; N Yacute ; B 13 0 775 947 ;
+C -1 ; WX 741 ; N Acircumflex ; B -75 0 716 930 ;
+C -1 ; WX 667 ; N aacute ; B 6 -15 636 722 ;
+C -1 ; WX 833 ; N Ucircumflex ; B 88 -15 900 930 ;
+C -1 ; WX 519 ; N yacute ; B -66 -205 493 722 ;
+C -1 ; WX 481 ; N scommaaccent ; B 0 -250 435 477 ;
+C -1 ; WX 519 ; N ecircumflex ; B 0 -15 479 705 ;
+C -1 ; WX 833 ; N Uring ; B 88 -15 900 991 ;
+C -1 ; WX 833 ; N Udieresis ; B 88 -15 900 915 ;
+C -1 ; WX 667 ; N aogonek ; B 6 -230 636 477 ;
+C -1 ; WX 833 ; N Uacute ; B 88 -15 900 947 ;
+C -1 ; WX 685 ; N uogonek ; B 30 -233 635 477 ;
+C -1 ; WX 741 ; N Edieresis ; B -41 0 730 915 ;
+C -1 ; WX 833 ; N Dcroat ; B -47 0 796 722 ;
+C -1 ; WX 250 ; N commaaccent ; B -25 -250 141 -50 ;
+C -1 ; WX 747 ; N copyright ; B -2 -15 750 737 ;
+C -1 ; WX 741 ; N Emacron ; B -41 0 730 874 ;
+C -1 ; WX 537 ; N ccaron ; B 0 -15 505 705 ;
+C -1 ; WX 667 ; N aring ; B 6 -15 636 746 ;
+C -1 ; WX 852 ; N Ncommaaccent ; B -61 -230 913 722 ;
+C -1 ; WX 389 ; N lacute ; B 32 -15 500 947 ;
+C -1 ; WX 667 ; N agrave ; B 6 -15 636 722 ;
+C -1 ; WX 722 ; N Tcommaaccent ; B 41 -250 759 722 ;
+C -1 ; WX 759 ; N Cacute ; B 37 -15 759 947 ;
+C -1 ; WX 667 ; N atilde ; B 6 -15 636 690 ;
+C -1 ; WX 741 ; N Edotaccent ; B -41 0 730 937 ;
+C -1 ; WX 481 ; N scaron ; B 0 -15 477 705 ;
+C -1 ; WX 481 ; N scedilla ; B 0 -220 435 477 ;
+C -1 ; WX 389 ; N iacute ; B 32 -15 370 715 ;
+C -1 ; WX 494 ; N lozenge ; B 10 0 484 745 ;
+C -1 ; WX 796 ; N Rcaron ; B -41 -15 749 930 ;
+C -1 ; WX 815 ; N Gcommaaccent ; B 37 -250 805 737 ;
+C -1 ; WX 685 ; N ucircumflex ; B 30 -15 635 705 ;
+C -1 ; WX 667 ; N acircumflex ; B 6 -15 636 705 ;
+C -1 ; WX 741 ; N Amacron ; B -75 0 716 874 ;
+C -1 ; WX 519 ; N rcaron ; B 0 0 527 695 ;
+C -1 ; WX 537 ; N ccedilla ; B 0 -220 482 477 ;
+C -1 ; WX 704 ; N Zdotaccent ; B -33 0 711 937 ;
+C -1 ; WX 741 ; N Thorn ; B -41 0 690 722 ;
+C -1 ; WX 833 ; N Omacron ; B 37 -15 796 874 ;
+C -1 ; WX 796 ; N Racute ; B -41 -15 749 947 ;
+C -1 ; WX 685 ; N Sacute ; B 1 -15 666 947 ;
+C -1 ; WX 747 ; N dcaron ; B 0 -15 826 737 ;
+C -1 ; WX 833 ; N Umacron ; B 88 -15 900 874 ;
+C -1 ; WX 685 ; N uring ; B 30 -15 635 746 ;
+C -1 ; WX 344 ; N threesuperior ; B 3 273 361 705 ;
+C -1 ; WX 833 ; N Ograve ; B 37 -15 796 947 ;
+C -1 ; WX 741 ; N Agrave ; B -75 0 716 947 ;
+C -1 ; WX 741 ; N Abreve ; B -75 0 716 923 ;
+C -1 ; WX 606 ; N multiply ; B 65 15 541 491 ;
+C -1 ; WX 685 ; N uacute ; B 30 -15 635 722 ;
+C -1 ; WX 722 ; N Tcaron ; B 41 0 759 930 ;
+C -1 ; WX 494 ; N partialdiff ; B 11 -21 494 750 ;
+C -1 ; WX 519 ; N ydieresis ; B -66 -205 493 690 ;
+C -1 ; WX 852 ; N Nacute ; B -61 -10 913 947 ;
+C -1 ; WX 389 ; N icircumflex ; B 21 -15 363 698 ;
+C -1 ; WX 741 ; N Ecircumflex ; B -41 0 730 930 ;
+C -1 ; WX 667 ; N adieresis ; B 6 -15 636 690 ;
+C -1 ; WX 519 ; N edieresis ; B 0 -15 486 690 ;
+C -1 ; WX 537 ; N cacute ; B 0 -15 482 722 ;
+C -1 ; WX 685 ; N nacute ; B 0 -15 639 722 ;
+C -1 ; WX 685 ; N umacron ; B 30 -15 635 649 ;
+C -1 ; WX 852 ; N Ncaron ; B -61 -10 913 930 ;
+C -1 ; WX 444 ; N Iacute ; B -41 0 488 947 ;
+C -1 ; WX 606 ; N plusminus ; B 50 0 556 506 ;
+C -1 ; WX 606 ; N brokenbar ; B 249 -175 357 675 ;
+C -1 ; WX 747 ; N registered ; B -2 -15 750 737 ;
+C -1 ; WX 815 ; N Gbreve ; B 37 -15 805 923 ;
+C -1 ; WX 444 ; N Idotaccent ; B -41 0 485 937 ;
+C -1 ; WX 600 ; N summation ; B 14 -10 585 706 ;
+C -1 ; WX 741 ; N Egrave ; B -41 0 730 947 ;
+C -1 ; WX 519 ; N racute ; B 0 0 527 722 ;
+C -1 ; WX 574 ; N omacron ; B 0 -15 530 649 ;
+C -1 ; WX 704 ; N Zacute ; B -33 0 711 947 ;
+C -1 ; WX 704 ; N Zcaron ; B -33 0 711 930 ;
+C -1 ; WX 549 ; N greaterequal ; B 26 0 523 704 ;
+C -1 ; WX 833 ; N Eth ; B -47 0 796 722 ;
+C -1 ; WX 759 ; N Ccedilla ; B 37 -220 759 737 ;
+C -1 ; WX 389 ; N lcommaaccent ; B 25 -250 375 737 ;
+C -1 ; WX 447 ; N tcaron ; B 24 -15 544 767 ;
+C -1 ; WX 519 ; N eogonek ; B 0 -229 479 477 ;
+C -1 ; WX 833 ; N Uogonek ; B 88 -230 900 722 ;
+C -1 ; WX 741 ; N Aacute ; B -75 0 716 947 ;
+C -1 ; WX 741 ; N Adieresis ; B -75 0 716 915 ;
+C -1 ; WX 519 ; N egrave ; B 0 -15 479 722 ;
+C -1 ; WX 519 ; N zacute ; B -19 -15 473 722 ;
+C -1 ; WX 389 ; N iogonek ; B -8 -232 345 737 ;
+C -1 ; WX 833 ; N Oacute ; B 37 -15 796 947 ;
+C -1 ; WX 574 ; N oacute ; B 0 -15 530 722 ;
+C -1 ; WX 667 ; N amacron ; B 6 -15 636 649 ;
+C -1 ; WX 481 ; N sacute ; B 0 -15 446 722 ;
+C -1 ; WX 389 ; N idieresis ; B 31 -15 391 690 ;
+C -1 ; WX 833 ; N Ocircumflex ; B 37 -15 796 930 ;
+C -1 ; WX 833 ; N Ugrave ; B 88 -15 900 947 ;
+C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ;
+C -1 ; WX 648 ; N thorn ; B -119 -205 590 737 ;
+C -1 ; WX 344 ; N twosuperior ; B -17 280 362 705 ;
+C -1 ; WX 833 ; N Odieresis ; B 37 -15 796 915 ;
+C -1 ; WX 685 ; N mu ; B -89 -205 635 477 ;
+C -1 ; WX 389 ; N igrave ; B 32 -15 345 715 ;
+C -1 ; WX 574 ; N ohungarumlaut ; B 0 -15 601 722 ;
+C -1 ; WX 741 ; N Eogonek ; B -41 -224 730 722 ;
+C -1 ; WX 667 ; N dcroat ; B 0 -15 734 737 ;
+C -1 ; WX 861 ; N threequarters ; B 35 -15 789 705 ;
+C -1 ; WX 685 ; N Scedilla ; B 1 -220 666 737 ;
+C -1 ; WX 449 ; N lcaron ; B 32 -15 541 737 ;
+C -1 ; WX 778 ; N Kcommaaccent ; B -41 -250 832 722 ;
+C -1 ; WX 704 ; N Lacute ; B -41 0 670 947 ;
+C -1 ; WX 950 ; N trademark ; B 42 317 1017 722 ;
+C -1 ; WX 519 ; N edotaccent ; B 0 -15 479 712 ;
+C -1 ; WX 444 ; N Igrave ; B -41 0 485 947 ;
+C -1 ; WX 444 ; N Imacron ; B -41 0 520 874 ;
+C -1 ; WX 704 ; N Lcaron ; B -41 0 702 737 ;
+C -1 ; WX 861 ; N onehalf ; B 17 -15 798 705 ;
+C -1 ; WX 549 ; N lessequal ; B 29 0 526 704 ;
+C -1 ; WX 574 ; N ocircumflex ; B 0 -15 530 705 ;
+C -1 ; WX 685 ; N ntilde ; B 0 -15 639 690 ;
+C -1 ; WX 833 ; N Uhungarumlaut ; B 88 -15 900 947 ;
+C -1 ; WX 741 ; N Eacute ; B -41 0 730 947 ;
+C -1 ; WX 519 ; N emacron ; B 0 -15 497 649 ;
+C -1 ; WX 611 ; N gbreve ; B -63 -205 604 698 ;
+C -1 ; WX 861 ; N onequarter ; B 17 -15 789 705 ;
+C -1 ; WX 685 ; N Scaron ; B 1 -15 666 930 ;
+C -1 ; WX 685 ; N Scommaaccent ; B 1 -250 666 737 ;
+C -1 ; WX 833 ; N Ohungarumlaut ; B 37 -15 796 947 ;
+C -1 ; WX 400 ; N degree ; B 86 419 372 705 ;
+C -1 ; WX 574 ; N ograve ; B 0 -15 530 722 ;
+C -1 ; WX 759 ; N Ccaron ; B 37 -15 759 930 ;
+C -1 ; WX 685 ; N ugrave ; B 30 -15 635 722 ;
+C -1 ; WX 549 ; N radical ; B 10 -46 512 850 ;
+C -1 ; WX 833 ; N Dcaron ; B -47 0 796 930 ;
+C -1 ; WX 519 ; N rcommaaccent ; B -31 -250 527 486 ;
+C -1 ; WX 852 ; N Ntilde ; B -61 -10 913 915 ;
+C -1 ; WX 574 ; N otilde ; B 0 -15 530 690 ;
+C -1 ; WX 796 ; N Rcommaaccent ; B -41 -250 749 722 ;
+C -1 ; WX 704 ; N Lcommaaccent ; B -41 -250 670 722 ;
+C -1 ; WX 741 ; N Atilde ; B -75 0 716 915 ;
+C -1 ; WX 741 ; N Aogonek ; B -75 -224 744 737 ;
+C -1 ; WX 741 ; N Aring ; B -75 0 716 991 ;
+C -1 ; WX 833 ; N Otilde ; B 37 -15 796 915 ;
+C -1 ; WX 519 ; N zdotaccent ; B -19 -15 473 712 ;
+C -1 ; WX 741 ; N Ecaron ; B -41 0 730 930 ;
+C -1 ; WX 444 ; N Iogonek ; B -41 -220 485 722 ;
+C -1 ; WX 648 ; N kcommaaccent ; B -11 -250 578 737 ;
+C -1 ; WX 606 ; N minus ; B 50 199 556 307 ;
+C -1 ; WX 444 ; N Icircumflex ; B -41 0 485 930 ;
+C -1 ; WX 685 ; N ncaron ; B 0 -15 639 705 ;
+C -1 ; WX 407 ; N tcommaaccent ; B -6 -250 403 650 ;
+C -1 ; WX 606 ; N logicalnot ; B 50 103 556 403 ;
+C -1 ; WX 574 ; N odieresis ; B 0 -15 530 690 ;
+C -1 ; WX 685 ; N udieresis ; B 30 -15 635 690 ;
+C -1 ; WX 549 ; N notequal ; B 15 -49 540 570 ;
+C -1 ; WX 611 ; N gcommaaccent ; B -63 -205 604 822 ;
+C -1 ; WX 574 ; N eth ; B 0 -15 530 752 ;
+C -1 ; WX 519 ; N zcaron ; B -19 -15 473 695 ;
+C -1 ; WX 685 ; N ncommaaccent ; B 0 -250 639 477 ;
+C -1 ; WX 344 ; N onesuperior ; B 19 282 326 705 ;
+C -1 ; WX 389 ; N imacron ; B 32 -15 376 642 ;
+EndCharMetrics
+StartKernData
+StartKernPairs 2653
+KPX A C 5
+KPX A Cacute 5
+KPX A Ccaron 5
+KPX A Ccedilla 5
+KPX A G 5
+KPX A Gbreve 5
+KPX A Gcommaaccent 5
+KPX A O 5
+KPX A Oacute 5
+KPX A Ocircumflex 5
+KPX A Odieresis 5
+KPX A Ograve 5
+KPX A Ohungarumlaut 5
+KPX A Omacron 5
+KPX A Oslash 5
+KPX A Otilde 5
+KPX A Q 5
+KPX A T 5
+KPX A Tcaron 5
+KPX A Tcommaaccent 5
+KPX A U -32
+KPX A Uacute -32
+KPX A Ucircumflex -32
+KPX A Udieresis -32
+KPX A Ugrave -32
+KPX A Uhungarumlaut -32
+KPX A Umacron -32
+KPX A Uogonek -32
+KPX A Uring -32
+KPX A V -100
+KPX A W -84
+KPX A Y -70
+KPX A Yacute -70
+KPX A Ydieresis -70
+KPX A quotedblright -95
+KPX A quoteright -95
+KPX A u -15
+KPX A uacute -15
+KPX A ucircumflex -15
+KPX A udieresis -15
+KPX A ugrave -15
+KPX A uhungarumlaut -15
+KPX A umacron -15
+KPX A uogonek -15
+KPX A uring -15
+KPX A v -10
+KPX A w -25
+KPX A y -33
+KPX A yacute -33
+KPX A ydieresis -33
+KPX Aacute C 5
+KPX Aacute Cacute 5
+KPX Aacute Ccaron 5
+KPX Aacute Ccedilla 5
+KPX Aacute G 5
+KPX Aacute Gbreve 5
+KPX Aacute Gcommaaccent 5
+KPX Aacute O 5
+KPX Aacute Oacute 5
+KPX Aacute Ocircumflex 5
+KPX Aacute Odieresis 5
+KPX Aacute Ograve 5
+KPX Aacute Ohungarumlaut 5
+KPX Aacute Omacron 5
+KPX Aacute Oslash 5
+KPX Aacute Otilde 5
+KPX Aacute Q 5
+KPX Aacute T 5
+KPX Aacute Tcaron 5
+KPX Aacute Tcommaaccent 5
+KPX Aacute U -32
+KPX Aacute Uacute -32
+KPX Aacute Ucircumflex -32
+KPX Aacute Udieresis -32
+KPX Aacute Ugrave -32
+KPX Aacute Uhungarumlaut -32
+KPX Aacute Umacron -32
+KPX Aacute Uogonek -32
+KPX Aacute Uring -32
+KPX Aacute V -100
+KPX Aacute W -84
+KPX Aacute Y -70
+KPX Aacute Yacute -70
+KPX Aacute Ydieresis -70
+KPX Aacute quotedblright -95
+KPX Aacute quoteright -95
+KPX Aacute u -15
+KPX Aacute uacute -15
+KPX Aacute ucircumflex -15
+KPX Aacute udieresis -15
+KPX Aacute ugrave -15
+KPX Aacute uhungarumlaut -15
+KPX Aacute umacron -15
+KPX Aacute uogonek -15
+KPX Aacute uring -15
+KPX Aacute v -10
+KPX Aacute w -25
+KPX Aacute y -33
+KPX Aacute yacute -33
+KPX Aacute ydieresis -33
+KPX Abreve C 5
+KPX Abreve Cacute 5
+KPX Abreve Ccaron 5
+KPX Abreve Ccedilla 5
+KPX Abreve G 5
+KPX Abreve Gbreve 5
+KPX Abreve Gcommaaccent 5
+KPX Abreve O 5
+KPX Abreve Oacute 5
+KPX Abreve Ocircumflex 5
+KPX Abreve Odieresis 5
+KPX Abreve Ograve 5
+KPX Abreve Ohungarumlaut 5
+KPX Abreve Omacron 5
+KPX Abreve Oslash 5
+KPX Abreve Otilde 5
+KPX Abreve Q 5
+KPX Abreve T 5
+KPX Abreve Tcaron 5
+KPX Abreve Tcommaaccent 5
+KPX Abreve U -32
+KPX Abreve Uacute -32
+KPX Abreve Ucircumflex -32
+KPX Abreve Udieresis -32
+KPX Abreve Ugrave -32
+KPX Abreve Uhungarumlaut -32
+KPX Abreve Umacron -32
+KPX Abreve Uogonek -32
+KPX Abreve Uring -32
+KPX Abreve V -100
+KPX Abreve W -84
+KPX Abreve Y -70
+KPX Abreve Yacute -70
+KPX Abreve Ydieresis -70
+KPX Abreve quotedblright -95
+KPX Abreve quoteright -95
+KPX Abreve u -15
+KPX Abreve uacute -15
+KPX Abreve ucircumflex -15
+KPX Abreve udieresis -15
+KPX Abreve ugrave -15
+KPX Abreve uhungarumlaut -15
+KPX Abreve umacron -15
+KPX Abreve uogonek -15
+KPX Abreve uring -15
+KPX Abreve v -10
+KPX Abreve w -25
+KPX Abreve y -33
+KPX Abreve yacute -33
+KPX Abreve ydieresis -33
+KPX Acircumflex C 5
+KPX Acircumflex Cacute 5
+KPX Acircumflex Ccaron 5
+KPX Acircumflex Ccedilla 5
+KPX Acircumflex G 5
+KPX Acircumflex Gbreve 5
+KPX Acircumflex Gcommaaccent 5
+KPX Acircumflex O 5
+KPX Acircumflex Oacute 5
+KPX Acircumflex Ocircumflex 5
+KPX Acircumflex Odieresis 5
+KPX Acircumflex Ograve 5
+KPX Acircumflex Ohungarumlaut 5
+KPX Acircumflex Omacron 5
+KPX Acircumflex Oslash 5
+KPX Acircumflex Otilde 5
+KPX Acircumflex Q 5
+KPX Acircumflex T 5
+KPX Acircumflex Tcaron 5
+KPX Acircumflex Tcommaaccent 5
+KPX Acircumflex U -32
+KPX Acircumflex Uacute -32
+KPX Acircumflex Ucircumflex -32
+KPX Acircumflex Udieresis -32
+KPX Acircumflex Ugrave -32
+KPX Acircumflex Uhungarumlaut -32
+KPX Acircumflex Umacron -32
+KPX Acircumflex Uogonek -32
+KPX Acircumflex Uring -32
+KPX Acircumflex V -100
+KPX Acircumflex W -84
+KPX Acircumflex Y -70
+KPX Acircumflex Yacute -70
+KPX Acircumflex Ydieresis -70
+KPX Acircumflex quotedblright -95
+KPX Acircumflex quoteright -95
+KPX Acircumflex u -15
+KPX Acircumflex uacute -15
+KPX Acircumflex ucircumflex -15
+KPX Acircumflex udieresis -15
+KPX Acircumflex ugrave -15
+KPX Acircumflex uhungarumlaut -15
+KPX Acircumflex umacron -15
+KPX Acircumflex uogonek -15
+KPX Acircumflex uring -15
+KPX Acircumflex v -10
+KPX Acircumflex w -25
+KPX Acircumflex y -33
+KPX Acircumflex yacute -33
+KPX Acircumflex ydieresis -33
+KPX Adieresis C 5
+KPX Adieresis Cacute 5
+KPX Adieresis Ccaron 5
+KPX Adieresis Ccedilla 5
+KPX Adieresis G 5
+KPX Adieresis Gbreve 5
+KPX Adieresis Gcommaaccent 5
+KPX Adieresis O 5
+KPX Adieresis Oacute 5
+KPX Adieresis Ocircumflex 5
+KPX Adieresis Odieresis 5
+KPX Adieresis Ograve 5
+KPX Adieresis Ohungarumlaut 5
+KPX Adieresis Omacron 5
+KPX Adieresis Oslash 5
+KPX Adieresis Otilde 5
+KPX Adieresis Q 5
+KPX Adieresis T 5
+KPX Adieresis Tcaron 5
+KPX Adieresis Tcommaaccent 5
+KPX Adieresis U -32
+KPX Adieresis Uacute -32
+KPX Adieresis Ucircumflex -32
+KPX Adieresis Udieresis -32
+KPX Adieresis Ugrave -32
+KPX Adieresis Uhungarumlaut -32
+KPX Adieresis Umacron -32
+KPX Adieresis Uogonek -32
+KPX Adieresis Uring -32
+KPX Adieresis V -100
+KPX Adieresis W -84
+KPX Adieresis Y -70
+KPX Adieresis Yacute -70
+KPX Adieresis Ydieresis -70
+KPX Adieresis quotedblright -95
+KPX Adieresis quoteright -95
+KPX Adieresis u -15
+KPX Adieresis uacute -15
+KPX Adieresis ucircumflex -15
+KPX Adieresis udieresis -15
+KPX Adieresis ugrave -15
+KPX Adieresis uhungarumlaut -15
+KPX Adieresis umacron -15
+KPX Adieresis uogonek -15
+KPX Adieresis uring -15
+KPX Adieresis v -10
+KPX Adieresis w -25
+KPX Adieresis y -33
+KPX Adieresis yacute -33
+KPX Adieresis ydieresis -33
+KPX Agrave C 5
+KPX Agrave Cacute 5
+KPX Agrave Ccaron 5
+KPX Agrave Ccedilla 5
+KPX Agrave G 5
+KPX Agrave Gbreve 5
+KPX Agrave Gcommaaccent 5
+KPX Agrave O 5
+KPX Agrave Oacute 5
+KPX Agrave Ocircumflex 5
+KPX Agrave Odieresis 5
+KPX Agrave Ograve 5
+KPX Agrave Ohungarumlaut 5
+KPX Agrave Omacron 5
+KPX Agrave Oslash 5
+KPX Agrave Otilde 5
+KPX Agrave Q 5
+KPX Agrave T 5
+KPX Agrave Tcaron 5
+KPX Agrave Tcommaaccent 5
+KPX Agrave U -32
+KPX Agrave Uacute -32
+KPX Agrave Ucircumflex -32
+KPX Agrave Udieresis -32
+KPX Agrave Ugrave -32
+KPX Agrave Uhungarumlaut -32
+KPX Agrave Umacron -32
+KPX Agrave Uogonek -32
+KPX Agrave Uring -32
+KPX Agrave V -100
+KPX Agrave W -84
+KPX Agrave Y -70
+KPX Agrave Yacute -70
+KPX Agrave Ydieresis -70
+KPX Agrave quotedblright -95
+KPX Agrave quoteright -95
+KPX Agrave u -15
+KPX Agrave uacute -15
+KPX Agrave ucircumflex -15
+KPX Agrave udieresis -15
+KPX Agrave ugrave -15
+KPX Agrave uhungarumlaut -15
+KPX Agrave umacron -15
+KPX Agrave uogonek -15
+KPX Agrave uring -15
+KPX Agrave v -10
+KPX Agrave w -25
+KPX Agrave y -33
+KPX Agrave yacute -33
+KPX Agrave ydieresis -33
+KPX Amacron C 5
+KPX Amacron Cacute 5
+KPX Amacron Ccaron 5
+KPX Amacron Ccedilla 5
+KPX Amacron G 5
+KPX Amacron Gbreve 5
+KPX Amacron Gcommaaccent 5
+KPX Amacron O 5
+KPX Amacron Oacute 5
+KPX Amacron Ocircumflex 5
+KPX Amacron Odieresis 5
+KPX Amacron Ograve 5
+KPX Amacron Ohungarumlaut 5
+KPX Amacron Omacron 5
+KPX Amacron Oslash 5
+KPX Amacron Otilde 5
+KPX Amacron Q 5
+KPX Amacron T 5
+KPX Amacron Tcaron 5
+KPX Amacron Tcommaaccent 5
+KPX Amacron U -32
+KPX Amacron Uacute -32
+KPX Amacron Ucircumflex -32
+KPX Amacron Udieresis -32
+KPX Amacron Ugrave -32
+KPX Amacron Uhungarumlaut -32
+KPX Amacron Umacron -32
+KPX Amacron Uogonek -32
+KPX Amacron Uring -32
+KPX Amacron V -100
+KPX Amacron W -84
+KPX Amacron Y -70
+KPX Amacron Yacute -70
+KPX Amacron Ydieresis -70
+KPX Amacron quotedblright -95
+KPX Amacron quoteright -95
+KPX Amacron u -15
+KPX Amacron uacute -15
+KPX Amacron ucircumflex -15
+KPX Amacron udieresis -15
+KPX Amacron ugrave -15
+KPX Amacron uhungarumlaut -15
+KPX Amacron umacron -15
+KPX Amacron uogonek -15
+KPX Amacron uring -15
+KPX Amacron v -10
+KPX Amacron w -25
+KPX Amacron y -33
+KPX Amacron yacute -33
+KPX Amacron ydieresis -33
+KPX Aogonek C 5
+KPX Aogonek Cacute 5
+KPX Aogonek Ccaron 5
+KPX Aogonek Ccedilla 5
+KPX Aogonek G 5
+KPX Aogonek Gbreve 5
+KPX Aogonek Gcommaaccent 5
+KPX Aogonek O 5
+KPX Aogonek Oacute 5
+KPX Aogonek Ocircumflex 5
+KPX Aogonek Odieresis 5
+KPX Aogonek Ograve 5
+KPX Aogonek Ohungarumlaut 5
+KPX Aogonek Omacron 5
+KPX Aogonek Oslash 5
+KPX Aogonek Otilde 5
+KPX Aogonek Q 5
+KPX Aogonek T 5
+KPX Aogonek Tcaron 5
+KPX Aogonek Tcommaaccent 5
+KPX Aogonek U -32
+KPX Aogonek Uacute -32
+KPX Aogonek Ucircumflex -32
+KPX Aogonek Udieresis -32
+KPX Aogonek Ugrave -32
+KPX Aogonek Uhungarumlaut -32
+KPX Aogonek Umacron -32
+KPX Aogonek Uogonek -32
+KPX Aogonek Uring -32
+KPX Aogonek V -100
+KPX Aogonek W -84
+KPX Aogonek Y -70
+KPX Aogonek Yacute -70
+KPX Aogonek Ydieresis -70
+KPX Aogonek quotedblright -95
+KPX Aogonek quoteright -95
+KPX Aogonek u -15
+KPX Aogonek uacute -15
+KPX Aogonek ucircumflex -15
+KPX Aogonek udieresis -15
+KPX Aogonek ugrave -15
+KPX Aogonek uhungarumlaut -15
+KPX Aogonek umacron -15
+KPX Aogonek uogonek -15
+KPX Aogonek uring -15
+KPX Aogonek v -10
+KPX Aogonek w -25
+KPX Aring C 5
+KPX Aring Cacute 5
+KPX Aring Ccaron 5
+KPX Aring Ccedilla 5
+KPX Aring G 5
+KPX Aring Gbreve 5
+KPX Aring Gcommaaccent 5
+KPX Aring O 5
+KPX Aring Oacute 5
+KPX Aring Ocircumflex 5
+KPX Aring Odieresis 5
+KPX Aring Ograve 5
+KPX Aring Ohungarumlaut 5
+KPX Aring Omacron 5
+KPX Aring Oslash 5
+KPX Aring Otilde 5
+KPX Aring Q 5
+KPX Aring T 5
+KPX Aring Tcaron 5
+KPX Aring Tcommaaccent 5
+KPX Aring U -32
+KPX Aring Uacute -32
+KPX Aring Ucircumflex -32
+KPX Aring Udieresis -32
+KPX Aring Ugrave -32
+KPX Aring Uhungarumlaut -32
+KPX Aring Umacron -32
+KPX Aring Uogonek -32
+KPX Aring Uring -32
+KPX Aring V -100
+KPX Aring W -84
+KPX Aring Y -70
+KPX Aring Yacute -70
+KPX Aring Ydieresis -70
+KPX Aring quotedblright -95
+KPX Aring quoteright -95
+KPX Aring u -15
+KPX Aring uacute -15
+KPX Aring ucircumflex -15
+KPX Aring udieresis -15
+KPX Aring ugrave -15
+KPX Aring uhungarumlaut -15
+KPX Aring umacron -15
+KPX Aring uogonek -15
+KPX Aring uring -15
+KPX Aring v -10
+KPX Aring w -25
+KPX Aring y -33
+KPX Aring yacute -33
+KPX Aring ydieresis -33
+KPX Atilde C 5
+KPX Atilde Cacute 5
+KPX Atilde Ccaron 5
+KPX Atilde Ccedilla 5
+KPX Atilde G 5
+KPX Atilde Gbreve 5
+KPX Atilde Gcommaaccent 5
+KPX Atilde O 5
+KPX Atilde Oacute 5
+KPX Atilde Ocircumflex 5
+KPX Atilde Odieresis 5
+KPX Atilde Ograve 5
+KPX Atilde Ohungarumlaut 5
+KPX Atilde Omacron 5
+KPX Atilde Oslash 5
+KPX Atilde Otilde 5
+KPX Atilde Q 5
+KPX Atilde T 5
+KPX Atilde Tcaron 5
+KPX Atilde Tcommaaccent 5
+KPX Atilde U -32
+KPX Atilde Uacute -32
+KPX Atilde Ucircumflex -32
+KPX Atilde Udieresis -32
+KPX Atilde Ugrave -32
+KPX Atilde Uhungarumlaut -32
+KPX Atilde Umacron -32
+KPX Atilde Uogonek -32
+KPX Atilde Uring -32
+KPX Atilde V -100
+KPX Atilde W -84
+KPX Atilde Y -70
+KPX Atilde Yacute -70
+KPX Atilde Ydieresis -70
+KPX Atilde quotedblright -95
+KPX Atilde quoteright -95
+KPX Atilde u -15
+KPX Atilde uacute -15
+KPX Atilde ucircumflex -15
+KPX Atilde udieresis -15
+KPX Atilde ugrave -15
+KPX Atilde uhungarumlaut -15
+KPX Atilde umacron -15
+KPX Atilde uogonek -15
+KPX Atilde uring -15
+KPX Atilde v -10
+KPX Atilde w -25
+KPX Atilde y -33
+KPX Atilde yacute -33
+KPX Atilde ydieresis -33
+KPX B A -11
+KPX B Aacute -11
+KPX B Abreve -11
+KPX B Acircumflex -11
+KPX B Adieresis -11
+KPX B Agrave -11
+KPX B Amacron -11
+KPX B Aogonek -11
+KPX B Aring -11
+KPX B Atilde -11
+KPX B U 15
+KPX B Uacute 15
+KPX B Ucircumflex 15
+KPX B Udieresis 15
+KPX B Ugrave 15
+KPX B Uhungarumlaut 15
+KPX B Umacron 15
+KPX B Uogonek 15
+KPX B Uring 15
+KPX B comma 15
+KPX B period 15
+KPX C A -5
+KPX C Aacute -5
+KPX C Abreve -5
+KPX C Acircumflex -5
+KPX C Adieresis -5
+KPX C Agrave -5
+KPX C Amacron -5
+KPX C Aogonek -5
+KPX C Aring -5
+KPX C Atilde -5
+KPX Cacute A -5
+KPX Cacute Aacute -5
+KPX Cacute Abreve -5
+KPX Cacute Acircumflex -5
+KPX Cacute Adieresis -5
+KPX Cacute Agrave -5
+KPX Cacute Amacron -5
+KPX Cacute Aogonek -5
+KPX Cacute Aring -5
+KPX Cacute Atilde -5
+KPX Ccaron A -5
+KPX Ccaron Aacute -5
+KPX Ccaron Abreve -5
+KPX Ccaron Acircumflex -5
+KPX Ccaron Adieresis -5
+KPX Ccaron Agrave -5
+KPX Ccaron Amacron -5
+KPX Ccaron Aogonek -5
+KPX Ccaron Aring -5
+KPX Ccaron Atilde -5
+KPX Ccedilla A -5
+KPX Ccedilla Aacute -5
+KPX Ccedilla Abreve -5
+KPX Ccedilla Acircumflex -5
+KPX Ccedilla Adieresis -5
+KPX Ccedilla Agrave -5
+KPX Ccedilla Amacron -5
+KPX Ccedilla Aogonek -5
+KPX Ccedilla Aring -5
+KPX Ccedilla Atilde -5
+KPX D V -18
+KPX D W -11
+KPX D Y 6
+KPX D Yacute 6
+KPX D Ydieresis 6
+KPX D comma -11
+KPX D period -11
+KPX Dcaron V -18
+KPX Dcaron W -11
+KPX Dcaron Y 6
+KPX Dcaron Yacute 6
+KPX Dcaron Ydieresis 6
+KPX Dcaron comma -11
+KPX Dcaron period -11
+KPX Dcroat V -18
+KPX Dcroat W -11
+KPX Dcroat Y 6
+KPX Dcroat Yacute 6
+KPX Dcroat Ydieresis 6
+KPX Dcroat comma -11
+KPX Dcroat period -11
+KPX F A -79
+KPX F Aacute -79
+KPX F Abreve -79
+KPX F Acircumflex -79
+KPX F Adieresis -79
+KPX F Agrave -79
+KPX F Amacron -79
+KPX F Aogonek -79
+KPX F Aring -79
+KPX F Atilde -79
+KPX F a -47
+KPX F aacute -47
+KPX F abreve -47
+KPX F acircumflex -47
+KPX F adieresis -47
+KPX F agrave -47
+KPX F amacron -47
+KPX F aogonek -47
+KPX F aring -47
+KPX F atilde -47
+KPX F comma -91
+KPX F e -41
+KPX F eacute -41
+KPX F ecaron -41
+KPX F ecircumflex -41
+KPX F edieresis -41
+KPX F edotaccent -41
+KPX F egrave -41
+KPX F emacron -41
+KPX F eogonek -41
+KPX F i -41
+KPX F iacute -41
+KPX F icircumflex -41
+KPX F idieresis -41
+KPX F igrave -41
+KPX F imacron -41
+KPX F iogonek -41
+KPX F o -47
+KPX F oacute -47
+KPX F ocircumflex -47
+KPX F odieresis -47
+KPX F ograve -47
+KPX F ohungarumlaut -47
+KPX F omacron -47
+KPX F oslash -47
+KPX F otilde -47
+KPX F period -91
+KPX F r -27
+KPX F racute -27
+KPX F rcaron -27
+KPX F rcommaaccent -27
+KPX J A -30
+KPX J Aacute -30
+KPX J Abreve -30
+KPX J Acircumflex -30
+KPX J Adieresis -30
+KPX J Agrave -30
+KPX J Amacron -30
+KPX J Aogonek -30
+KPX J Aring -30
+KPX J Atilde -30
+KPX J a -40
+KPX J aacute -40
+KPX J abreve -40
+KPX J acircumflex -40
+KPX J adieresis -40
+KPX J agrave -40
+KPX J amacron -40
+KPX J aogonek -40
+KPX J aring -40
+KPX J atilde -40
+KPX J comma -74
+KPX J e -33
+KPX J eacute -33
+KPX J ecaron -33
+KPX J ecircumflex -33
+KPX J edieresis -33
+KPX J edotaccent -33
+KPX J egrave -33
+KPX J emacron -33
+KPX J eogonek -33
+KPX J o -40
+KPX J oacute -40
+KPX J ocircumflex -40
+KPX J odieresis -40
+KPX J ograve -40
+KPX J ohungarumlaut -40
+KPX J omacron -40
+KPX J oslash -40
+KPX J otilde -40
+KPX J period -74
+KPX J u -39
+KPX J uacute -39
+KPX J ucircumflex -39
+KPX J udieresis -39
+KPX J ugrave -39
+KPX J uhungarumlaut -39
+KPX J umacron -39
+KPX J uogonek -39
+KPX J uring -39
+KPX K e 18
+KPX K eacute 18
+KPX K ecaron 18
+KPX K ecircumflex 18
+KPX K edieresis 18
+KPX K edotaccent 18
+KPX K egrave 18
+KPX K emacron 18
+KPX K eogonek 18
+KPX K o -4
+KPX K oacute -4
+KPX K ocircumflex -4
+KPX K odieresis -4
+KPX K ograve -4
+KPX K ohungarumlaut -4
+KPX K omacron -4
+KPX K oslash -4
+KPX K otilde -4
+KPX K u -4
+KPX K uacute -4
+KPX K ucircumflex -4
+KPX K udieresis -4
+KPX K ugrave -4
+KPX K uhungarumlaut -4
+KPX K umacron -4
+KPX K uogonek -4
+KPX K uring -4
+KPX K y -48
+KPX K yacute -48
+KPX K ydieresis -48
+KPX Kcommaaccent e 18
+KPX Kcommaaccent eacute 18
+KPX Kcommaaccent ecaron 18
+KPX Kcommaaccent ecircumflex 18
+KPX Kcommaaccent edieresis 18
+KPX Kcommaaccent edotaccent 18
+KPX Kcommaaccent egrave 18
+KPX Kcommaaccent emacron 18
+KPX Kcommaaccent eogonek 18
+KPX Kcommaaccent o -4
+KPX Kcommaaccent oacute -4
+KPX Kcommaaccent ocircumflex -4
+KPX Kcommaaccent odieresis -4
+KPX Kcommaaccent ograve -4
+KPX Kcommaaccent ohungarumlaut -4
+KPX Kcommaaccent omacron -4
+KPX Kcommaaccent oslash -4
+KPX Kcommaaccent otilde -4
+KPX Kcommaaccent u -4
+KPX Kcommaaccent uacute -4
+KPX Kcommaaccent ucircumflex -4
+KPX Kcommaaccent udieresis -4
+KPX Kcommaaccent ugrave -4
+KPX Kcommaaccent uhungarumlaut -4
+KPX Kcommaaccent umacron -4
+KPX Kcommaaccent uogonek -4
+KPX Kcommaaccent uring -4
+KPX Kcommaaccent y -48
+KPX Kcommaaccent yacute -48
+KPX Kcommaaccent ydieresis -48
+KPX L T -75
+KPX L Tcaron -75
+KPX L Tcommaaccent -75
+KPX L V -97
+KPX L W -69
+KPX L Y -55
+KPX L Yacute -55
+KPX L Ydieresis -55
+KPX L quotedblright -100
+KPX L quoteright -100
+KPX L y -30
+KPX L yacute -30
+KPX L ydieresis -30
+KPX Lacute T -75
+KPX Lacute Tcaron -75
+KPX Lacute Tcommaaccent -75
+KPX Lacute V -97
+KPX Lacute W -69
+KPX Lacute Y -55
+KPX Lacute Yacute -55
+KPX Lacute Ydieresis -55
+KPX Lacute quotedblright -100
+KPX Lacute quoteright -100
+KPX Lacute y -30
+KPX Lacute yacute -30
+KPX Lacute ydieresis -30
+KPX Lcommaaccent T -75
+KPX Lcommaaccent Tcaron -75
+KPX Lcommaaccent Tcommaaccent -75
+KPX Lcommaaccent V -97
+KPX Lcommaaccent W -69
+KPX Lcommaaccent Y -55
+KPX Lcommaaccent Yacute -55
+KPX Lcommaaccent Ydieresis -55
+KPX Lcommaaccent quotedblright -100
+KPX Lcommaaccent quoteright -100
+KPX Lcommaaccent y -30
+KPX Lcommaaccent yacute -30
+KPX Lcommaaccent ydieresis -30
+KPX Lslash T -75
+KPX Lslash Tcaron -75
+KPX Lslash Tcommaaccent -75
+KPX Lslash V -97
+KPX Lslash W -69
+KPX Lslash Y -55
+KPX Lslash Yacute -55
+KPX Lslash Ydieresis -55
+KPX Lslash quotedblright -100
+KPX Lslash quoteright -100
+KPX Lslash y -30
+KPX Lslash yacute -30
+KPX Lslash ydieresis -30
+KPX N comma -49
+KPX N period -49
+KPX Nacute comma -49
+KPX Nacute period -49
+KPX Ncaron comma -49
+KPX Ncaron period -49
+KPX Ncommaaccent comma -49
+KPX Ncommaaccent period -49
+KPX Ntilde comma -49
+KPX Ntilde period -49
+KPX O A -5
+KPX O Aacute -5
+KPX O Abreve -5
+KPX O Acircumflex -5
+KPX O Adieresis -5
+KPX O Agrave -5
+KPX O Amacron -5
+KPX O Aogonek -5
+KPX O Aring -5
+KPX O Atilde -5
+KPX O V -24
+KPX O W -15
+KPX O X -18
+KPX O comma -18
+KPX O period -18
+KPX Oacute A -5
+KPX Oacute Aacute -5
+KPX Oacute Abreve -5
+KPX Oacute Acircumflex -5
+KPX Oacute Adieresis -5
+KPX Oacute Agrave -5
+KPX Oacute Amacron -5
+KPX Oacute Aogonek -5
+KPX Oacute Aring -5
+KPX Oacute Atilde -5
+KPX Oacute V -24
+KPX Oacute W -15
+KPX Oacute X -18
+KPX Oacute comma -18
+KPX Oacute period -18
+KPX Ocircumflex A -5
+KPX Ocircumflex Aacute -5
+KPX Ocircumflex Abreve -5
+KPX Ocircumflex Acircumflex -5
+KPX Ocircumflex Adieresis -5
+KPX Ocircumflex Agrave -5
+KPX Ocircumflex Amacron -5
+KPX Ocircumflex Aogonek -5
+KPX Ocircumflex Aring -5
+KPX Ocircumflex Atilde -5
+KPX Ocircumflex V -24
+KPX Ocircumflex W -15
+KPX Ocircumflex X -18
+KPX Ocircumflex comma -18
+KPX Ocircumflex period -18
+KPX Odieresis A -5
+KPX Odieresis Aacute -5
+KPX Odieresis Abreve -5
+KPX Odieresis Acircumflex -5
+KPX Odieresis Adieresis -5
+KPX Odieresis Agrave -5
+KPX Odieresis Amacron -5
+KPX Odieresis Aogonek -5
+KPX Odieresis Aring -5
+KPX Odieresis Atilde -5
+KPX Odieresis V -24
+KPX Odieresis W -15
+KPX Odieresis X -18
+KPX Odieresis comma -18
+KPX Odieresis period -18
+KPX Ograve A -5
+KPX Ograve Aacute -5
+KPX Ograve Abreve -5
+KPX Ograve Acircumflex -5
+KPX Ograve Adieresis -5
+KPX Ograve Agrave -5
+KPX Ograve Amacron -5
+KPX Ograve Aogonek -5
+KPX Ograve Aring -5
+KPX Ograve Atilde -5
+KPX Ograve V -24
+KPX Ograve W -15
+KPX Ograve X -18
+KPX Ograve comma -18
+KPX Ograve period -18
+KPX Ohungarumlaut A -5
+KPX Ohungarumlaut Aacute -5
+KPX Ohungarumlaut Abreve -5
+KPX Ohungarumlaut Acircumflex -5
+KPX Ohungarumlaut Adieresis -5
+KPX Ohungarumlaut Agrave -5
+KPX Ohungarumlaut Amacron -5
+KPX Ohungarumlaut Aogonek -5
+KPX Ohungarumlaut Aring -5
+KPX Ohungarumlaut Atilde -5
+KPX Ohungarumlaut V -24
+KPX Ohungarumlaut W -15
+KPX Ohungarumlaut X -18
+KPX Ohungarumlaut comma -18
+KPX Ohungarumlaut period -18
+KPX Omacron A -5
+KPX Omacron Aacute -5
+KPX Omacron Abreve -5
+KPX Omacron Acircumflex -5
+KPX Omacron Adieresis -5
+KPX Omacron Agrave -5
+KPX Omacron Amacron -5
+KPX Omacron Aogonek -5
+KPX Omacron Aring -5
+KPX Omacron Atilde -5
+KPX Omacron V -24
+KPX Omacron W -15
+KPX Omacron X -18
+KPX Omacron comma -18
+KPX Omacron period -18
+KPX Oslash A -5
+KPX Oslash Aacute -5
+KPX Oslash Abreve -5
+KPX Oslash Acircumflex -5
+KPX Oslash Adieresis -5
+KPX Oslash Agrave -5
+KPX Oslash Amacron -5
+KPX Oslash Aogonek -5
+KPX Oslash Aring -5
+KPX Oslash Atilde -5
+KPX Oslash V -24
+KPX Oslash W -15
+KPX Oslash X -18
+KPX Oslash comma -18
+KPX Oslash period -18
+KPX Otilde A -5
+KPX Otilde Aacute -5
+KPX Otilde Abreve -5
+KPX Otilde Acircumflex -5
+KPX Otilde Adieresis -5
+KPX Otilde Agrave -5
+KPX Otilde Amacron -5
+KPX Otilde Aogonek -5
+KPX Otilde Aring -5
+KPX Otilde Atilde -5
+KPX Otilde V -24
+KPX Otilde W -15
+KPX Otilde X -18
+KPX Otilde comma -18
+KPX Otilde period -18
+KPX P A -80
+KPX P Aacute -80
+KPX P Abreve -80
+KPX P Acircumflex -80
+KPX P Adieresis -80
+KPX P Agrave -80
+KPX P Amacron -80
+KPX P Aogonek -80
+KPX P Aring -80
+KPX P Atilde -80
+KPX P a -40
+KPX P aacute -40
+KPX P abreve -40
+KPX P acircumflex -40
+KPX P adieresis -40
+KPX P agrave -40
+KPX P amacron -40
+KPX P aogonek -40
+KPX P aring -40
+KPX P atilde -40
+KPX P comma -100
+KPX P e -33
+KPX P eacute -33
+KPX P ecaron -33
+KPX P ecircumflex -33
+KPX P edieresis -33
+KPX P edotaccent -33
+KPX P egrave -33
+KPX P emacron -33
+KPX P eogonek -33
+KPX P o -40
+KPX P oacute -40
+KPX P ocircumflex -40
+KPX P odieresis -40
+KPX P ograve -40
+KPX P ohungarumlaut -40
+KPX P omacron -40
+KPX P oslash -40
+KPX P otilde -40
+KPX P period -100
+KPX R V -24
+KPX R W -14
+KPX Racute V -24
+KPX Racute W -14
+KPX Rcaron V -24
+KPX Rcaron W -14
+KPX Rcommaaccent V -24
+KPX Rcommaaccent W -14
+KPX S comma -18
+KPX S period -18
+KPX Sacute comma -18
+KPX Sacute period -18
+KPX Scaron comma -18
+KPX Scaron period -18
+KPX Scedilla comma -18
+KPX Scedilla period -18
+KPX Scommaaccent comma -18
+KPX Scommaaccent period -18
+KPX T A -60
+KPX T Aacute -60
+KPX T Abreve -60
+KPX T Acircumflex -60
+KPX T Adieresis -60
+KPX T Agrave -60
+KPX T Amacron -60
+KPX T Aogonek -60
+KPX T Aring -60
+KPX T Atilde -60
+KPX T O 11
+KPX T Oacute 11
+KPX T Ocircumflex 11
+KPX T Odieresis 11
+KPX T Ograve 11
+KPX T Ohungarumlaut 11
+KPX T Omacron 11
+KPX T Oslash 11
+KPX T Otilde 11
+KPX T a -40
+KPX T aacute -40
+KPX T abreve -40
+KPX T acircumflex -40
+KPX T adieresis -40
+KPX T agrave -40
+KPX T amacron -40
+KPX T aogonek -40
+KPX T aring -40
+KPX T atilde -40
+KPX T comma -55
+KPX T e -33
+KPX T eacute -33
+KPX T ecaron -33
+KPX T ecircumflex -33
+KPX T edieresis -33
+KPX T edotaccent -33
+KPX T egrave -33
+KPX T emacron -33
+KPX T eogonek -33
+KPX T h -9
+KPX T hyphen -75
+KPX T i -22
+KPX T iacute -22
+KPX T icircumflex -22
+KPX T idieresis -22
+KPX T igrave -22
+KPX T imacron -22
+KPX T iogonek -22
+KPX T o -40
+KPX T oacute -40
+KPX T ocircumflex -40
+KPX T odieresis -40
+KPX T ograve -40
+KPX T ohungarumlaut -40
+KPX T omacron -40
+KPX T oslash -40
+KPX T otilde -40
+KPX T period -55
+KPX T r -9
+KPX T racute -9
+KPX T rcaron -9
+KPX T rcommaaccent -9
+KPX T u -22
+KPX T uacute -22
+KPX T ucircumflex -22
+KPX T udieresis -22
+KPX T ugrave -22
+KPX T uhungarumlaut -22
+KPX T umacron -22
+KPX T uogonek -22
+KPX T uring -22
+KPX T w -30
+KPX T y -30
+KPX T yacute -30
+KPX T ydieresis -30
+KPX Tcaron A -60
+KPX Tcaron Aacute -60
+KPX Tcaron Abreve -60
+KPX Tcaron Acircumflex -60
+KPX Tcaron Adieresis -60
+KPX Tcaron Agrave -60
+KPX Tcaron Amacron -60
+KPX Tcaron Aogonek -60
+KPX Tcaron Aring -60
+KPX Tcaron Atilde -60
+KPX Tcaron O 11
+KPX Tcaron Oacute 11
+KPX Tcaron Ocircumflex 11
+KPX Tcaron Odieresis 11
+KPX Tcaron Ograve 11
+KPX Tcaron Ohungarumlaut 11
+KPX Tcaron Omacron 11
+KPX Tcaron Oslash 11
+KPX Tcaron Otilde 11
+KPX Tcaron a -40
+KPX Tcaron aacute -40
+KPX Tcaron abreve -40
+KPX Tcaron acircumflex -40
+KPX Tcaron adieresis -40
+KPX Tcaron agrave -40
+KPX Tcaron amacron -40
+KPX Tcaron aogonek -40
+KPX Tcaron aring -40
+KPX Tcaron atilde -40
+KPX Tcaron comma -55
+KPX Tcaron e -33
+KPX Tcaron eacute -33
+KPX Tcaron ecaron -33
+KPX Tcaron ecircumflex -33
+KPX Tcaron edieresis -33
+KPX Tcaron edotaccent -33
+KPX Tcaron egrave -33
+KPX Tcaron emacron -33
+KPX Tcaron eogonek -33
+KPX Tcaron h -9
+KPX Tcaron hyphen -75
+KPX Tcaron i -22
+KPX Tcaron iacute -22
+KPX Tcaron icircumflex -22
+KPX Tcaron idieresis -22
+KPX Tcaron igrave -22
+KPX Tcaron imacron -22
+KPX Tcaron iogonek -22
+KPX Tcaron o -40
+KPX Tcaron oacute -40
+KPX Tcaron ocircumflex -40
+KPX Tcaron odieresis -40
+KPX Tcaron ograve -40
+KPX Tcaron ohungarumlaut -40
+KPX Tcaron omacron -40
+KPX Tcaron oslash -40
+KPX Tcaron otilde -40
+KPX Tcaron period -55
+KPX Tcaron r -9
+KPX Tcaron racute -9
+KPX Tcaron rcaron -9
+KPX Tcaron rcommaaccent -9
+KPX Tcaron u -22
+KPX Tcaron uacute -22
+KPX Tcaron ucircumflex -22
+KPX Tcaron udieresis -22
+KPX Tcaron ugrave -22
+KPX Tcaron uhungarumlaut -22
+KPX Tcaron umacron -22
+KPX Tcaron uogonek -22
+KPX Tcaron uring -22
+KPX Tcaron w -30
+KPX Tcaron y -30
+KPX Tcaron yacute -30
+KPX Tcaron ydieresis -30
+KPX Tcommaaccent A -60
+KPX Tcommaaccent Aacute -60
+KPX Tcommaaccent Abreve -60
+KPX Tcommaaccent Acircumflex -60
+KPX Tcommaaccent Adieresis -60
+KPX Tcommaaccent Agrave -60
+KPX Tcommaaccent Amacron -60
+KPX Tcommaaccent Aogonek -60
+KPX Tcommaaccent Aring -60
+KPX Tcommaaccent Atilde -60
+KPX Tcommaaccent O 11
+KPX Tcommaaccent Oacute 11
+KPX Tcommaaccent Ocircumflex 11
+KPX Tcommaaccent Odieresis 11
+KPX Tcommaaccent Ograve 11
+KPX Tcommaaccent Ohungarumlaut 11
+KPX Tcommaaccent Omacron 11
+KPX Tcommaaccent Oslash 11
+KPX Tcommaaccent Otilde 11
+KPX Tcommaaccent a -40
+KPX Tcommaaccent aacute -40
+KPX Tcommaaccent abreve -40
+KPX Tcommaaccent acircumflex -40
+KPX Tcommaaccent adieresis -40
+KPX Tcommaaccent agrave -40
+KPX Tcommaaccent amacron -40
+KPX Tcommaaccent aogonek -40
+KPX Tcommaaccent aring -40
+KPX Tcommaaccent atilde -40
+KPX Tcommaaccent comma -55
+KPX Tcommaaccent e -33
+KPX Tcommaaccent eacute -33
+KPX Tcommaaccent ecaron -33
+KPX Tcommaaccent ecircumflex -33
+KPX Tcommaaccent edieresis -33
+KPX Tcommaaccent edotaccent -33
+KPX Tcommaaccent egrave -33
+KPX Tcommaaccent emacron -33
+KPX Tcommaaccent eogonek -33
+KPX Tcommaaccent h -9
+KPX Tcommaaccent hyphen -75
+KPX Tcommaaccent i -22
+KPX Tcommaaccent iacute -22
+KPX Tcommaaccent icircumflex -22
+KPX Tcommaaccent idieresis -22
+KPX Tcommaaccent igrave -22
+KPX Tcommaaccent imacron -22
+KPX Tcommaaccent iogonek -22
+KPX Tcommaaccent o -40
+KPX Tcommaaccent oacute -40
+KPX Tcommaaccent ocircumflex -40
+KPX Tcommaaccent odieresis -40
+KPX Tcommaaccent ograve -40
+KPX Tcommaaccent ohungarumlaut -40
+KPX Tcommaaccent omacron -40
+KPX Tcommaaccent oslash -40
+KPX Tcommaaccent otilde -40
+KPX Tcommaaccent period -55
+KPX Tcommaaccent r -9
+KPX Tcommaaccent racute -9
+KPX Tcommaaccent rcaron -9
+KPX Tcommaaccent rcommaaccent -9
+KPX Tcommaaccent u -22
+KPX Tcommaaccent uacute -22
+KPX Tcommaaccent ucircumflex -22
+KPX Tcommaaccent udieresis -22
+KPX Tcommaaccent ugrave -22
+KPX Tcommaaccent uhungarumlaut -22
+KPX Tcommaaccent umacron -22
+KPX Tcommaaccent uogonek -22
+KPX Tcommaaccent uring -22
+KPX Tcommaaccent w -30
+KPX Tcommaaccent y -30
+KPX Tcommaaccent yacute -30
+KPX Tcommaaccent ydieresis -30
+KPX U A -42
+KPX U Aacute -42
+KPX U Abreve -42
+KPX U Acircumflex -42
+KPX U Adieresis -42
+KPX U Agrave -42
+KPX U Amacron -42
+KPX U Aogonek -42
+KPX U Aring -42
+KPX U Atilde -42
+KPX U comma -25
+KPX U period -25
+KPX Uacute A -42
+KPX Uacute Aacute -42
+KPX Uacute Abreve -42
+KPX Uacute Acircumflex -42
+KPX Uacute Adieresis -42
+KPX Uacute Agrave -42
+KPX Uacute Amacron -42
+KPX Uacute Aogonek -42
+KPX Uacute Aring -42
+KPX Uacute Atilde -42
+KPX Uacute comma -25
+KPX Uacute period -25
+KPX Ucircumflex A -42
+KPX Ucircumflex Aacute -42
+KPX Ucircumflex Abreve -42
+KPX Ucircumflex Acircumflex -42
+KPX Ucircumflex Adieresis -42
+KPX Ucircumflex Agrave -42
+KPX Ucircumflex Amacron -42
+KPX Ucircumflex Aogonek -42
+KPX Ucircumflex Aring -42
+KPX Ucircumflex Atilde -42
+KPX Ucircumflex comma -25
+KPX Ucircumflex period -25
+KPX Udieresis A -42
+KPX Udieresis Aacute -42
+KPX Udieresis Abreve -42
+KPX Udieresis Acircumflex -42
+KPX Udieresis Adieresis -42
+KPX Udieresis Agrave -42
+KPX Udieresis Amacron -42
+KPX Udieresis Aogonek -42
+KPX Udieresis Aring -42
+KPX Udieresis Atilde -42
+KPX Udieresis comma -25
+KPX Udieresis period -25
+KPX Ugrave A -42
+KPX Ugrave Aacute -42
+KPX Ugrave Abreve -42
+KPX Ugrave Acircumflex -42
+KPX Ugrave Adieresis -42
+KPX Ugrave Agrave -42
+KPX Ugrave Amacron -42
+KPX Ugrave Aogonek -42
+KPX Ugrave Aring -42
+KPX Ugrave Atilde -42
+KPX Ugrave comma -25
+KPX Ugrave period -25
+KPX Uhungarumlaut A -42
+KPX Uhungarumlaut Aacute -42
+KPX Uhungarumlaut Abreve -42
+KPX Uhungarumlaut Acircumflex -42
+KPX Uhungarumlaut Adieresis -42
+KPX Uhungarumlaut Agrave -42
+KPX Uhungarumlaut Amacron -42
+KPX Uhungarumlaut Aogonek -42
+KPX Uhungarumlaut Aring -42
+KPX Uhungarumlaut Atilde -42
+KPX Uhungarumlaut comma -25
+KPX Uhungarumlaut period -25
+KPX Umacron A -42
+KPX Umacron Aacute -42
+KPX Umacron Abreve -42
+KPX Umacron Acircumflex -42
+KPX Umacron Adieresis -42
+KPX Umacron Agrave -42
+KPX Umacron Amacron -42
+KPX Umacron Aogonek -42
+KPX Umacron Aring -42
+KPX Umacron Atilde -42
+KPX Umacron comma -25
+KPX Umacron period -25
+KPX Uogonek A -42
+KPX Uogonek Aacute -42
+KPX Uogonek Abreve -42
+KPX Uogonek Acircumflex -42
+KPX Uogonek Adieresis -42
+KPX Uogonek Agrave -42
+KPX Uogonek Amacron -42
+KPX Uogonek Aogonek -42
+KPX Uogonek Aring -42
+KPX Uogonek Atilde -42
+KPX Uogonek comma -25
+KPX Uogonek period -25
+KPX Uring A -42
+KPX Uring Aacute -42
+KPX Uring Abreve -42
+KPX Uring Acircumflex -42
+KPX Uring Adieresis -42
+KPX Uring Agrave -42
+KPX Uring Amacron -42
+KPX Uring Aogonek -42
+KPX Uring Aring -42
+KPX Uring Atilde -42
+KPX Uring comma -25
+KPX Uring period -25
+KPX V A -100
+KPX V Aacute -100
+KPX V Abreve -100
+KPX V Acircumflex -100
+KPX V Adieresis -100
+KPX V Agrave -100
+KPX V Amacron -100
+KPX V Aogonek -100
+KPX V Aring -100
+KPX V Atilde -100
+KPX V G -12
+KPX V Gbreve -12
+KPX V Gcommaaccent -12
+KPX V O -19
+KPX V Oacute -19
+KPX V Ocircumflex -19
+KPX V Odieresis -19
+KPX V Ograve -19
+KPX V Ohungarumlaut -19
+KPX V Omacron -19
+KPX V Oslash -19
+KPX V Otilde -19
+KPX V a -55
+KPX V aacute -55
+KPX V abreve -55
+KPX V acircumflex -55
+KPX V adieresis -55
+KPX V agrave -55
+KPX V amacron -55
+KPX V aogonek -55
+KPX V aring -55
+KPX V atilde -55
+KPX V colon -49
+KPX V comma -94
+KPX V e -66
+KPX V eacute -66
+KPX V ecaron -66
+KPX V ecircumflex -66
+KPX V edieresis -66
+KPX V edotaccent -66
+KPX V egrave -66
+KPX V emacron -66
+KPX V eogonek -66
+KPX V hyphen -94
+KPX V i -35
+KPX V iacute -35
+KPX V iogonek -35
+KPX V o -71
+KPX V oacute -71
+KPX V ocircumflex -71
+KPX V odieresis -71
+KPX V ograve -71
+KPX V ohungarumlaut -71
+KPX V omacron -71
+KPX V oslash -71
+KPX V otilde -71
+KPX V period -94
+KPX V semicolon 6
+KPX V u -70
+KPX V uacute -70
+KPX V ucircumflex -70
+KPX V udieresis -70
+KPX V ugrave -70
+KPX V uhungarumlaut -70
+KPX V umacron -70
+KPX V uogonek -70
+KPX V uring -70
+KPX W A -66
+KPX W Aacute -66
+KPX W Abreve -66
+KPX W Acircumflex -66
+KPX W Adieresis -66
+KPX W Agrave -66
+KPX W Amacron -66
+KPX W Aogonek -66
+KPX W Aring -66
+KPX W Atilde -66
+KPX W O -11
+KPX W Oacute -11
+KPX W Ocircumflex -11
+KPX W Odieresis -11
+KPX W Ograve -11
+KPX W Ohungarumlaut -11
+KPX W Omacron -11
+KPX W Oslash -11
+KPX W Otilde -11
+KPX W a -33
+KPX W aacute -33
+KPX W abreve -33
+KPX W acircumflex -33
+KPX W adieresis -33
+KPX W agrave -33
+KPX W amacron -33
+KPX W aogonek -33
+KPX W aring -33
+KPX W atilde -33
+KPX W colon -22
+KPX W comma -86
+KPX W e -39
+KPX W eacute -39
+KPX W ecaron -39
+KPX W ecircumflex -39
+KPX W edieresis -39
+KPX W edotaccent -39
+KPX W egrave -39
+KPX W emacron -39
+KPX W eogonek -39
+KPX W h 5
+KPX W hyphen -61
+KPX W i -27
+KPX W iacute -27
+KPX W iogonek -27
+KPX W o -33
+KPX W oacute -33
+KPX W ocircumflex -33
+KPX W odieresis -33
+KPX W ograve -33
+KPX W ohungarumlaut -33
+KPX W omacron -33
+KPX W oslash -33
+KPX W otilde -33
+KPX W period -86
+KPX W semicolon -22
+KPX W u -25
+KPX W uacute -25
+KPX W ucircumflex -25
+KPX W udieresis -25
+KPX W ugrave -25
+KPX W uhungarumlaut -25
+KPX W umacron -25
+KPX W uogonek -25
+KPX W uring -25
+KPX W y -41
+KPX W yacute -41
+KPX W ydieresis -41
+KPX Y A -79
+KPX Y Aacute -79
+KPX Y Abreve -79
+KPX Y Acircumflex -79
+KPX Y Adieresis -79
+KPX Y Agrave -79
+KPX Y Amacron -79
+KPX Y Aogonek -79
+KPX Y Aring -79
+KPX Y Atilde -79
+KPX Y a -77
+KPX Y aacute -77
+KPX Y abreve -77
+KPX Y acircumflex -77
+KPX Y adieresis -77
+KPX Y agrave -77
+KPX Y amacron -77
+KPX Y aogonek -77
+KPX Y aring -77
+KPX Y atilde -77
+KPX Y colon -55
+KPX Y comma -91
+KPX Y e -71
+KPX Y eacute -71
+KPX Y ecaron -71
+KPX Y ecircumflex -71
+KPX Y edieresis -31
+KPX Y edotaccent -71
+KPX Y egrave -31
+KPX Y emacron -71
+KPX Y eogonek -71
+KPX Y hyphen -91
+KPX Y i -22
+KPX Y iacute -22
+KPX Y icircumflex -22
+KPX Y iogonek -22
+KPX Y o -77
+KPX Y oacute -77
+KPX Y ocircumflex -77
+KPX Y odieresis -77
+KPX Y ograve -77
+KPX Y ohungarumlaut -77
+KPX Y omacron -77
+KPX Y oslash -77
+KPX Y otilde -77
+KPX Y period -91
+KPX Y semicolon -55
+KPX Y u -58
+KPX Y uacute -58
+KPX Y ucircumflex -58
+KPX Y udieresis -58
+KPX Y ugrave -58
+KPX Y uhungarumlaut -58
+KPX Y umacron -58
+KPX Y uogonek -58
+KPX Y uring -58
+KPX Yacute A -79
+KPX Yacute Aacute -79
+KPX Yacute Abreve -79
+KPX Yacute Acircumflex -79
+KPX Yacute Adieresis -79
+KPX Yacute Agrave -79
+KPX Yacute Amacron -79
+KPX Yacute Aogonek -79
+KPX Yacute Aring -79
+KPX Yacute Atilde -79
+KPX Yacute a -77
+KPX Yacute aacute -77
+KPX Yacute abreve -77
+KPX Yacute acircumflex -77
+KPX Yacute adieresis -77
+KPX Yacute agrave -77
+KPX Yacute amacron -77
+KPX Yacute aogonek -77
+KPX Yacute aring -77
+KPX Yacute atilde -77
+KPX Yacute colon -55
+KPX Yacute comma -91
+KPX Yacute e -71
+KPX Yacute eacute -71
+KPX Yacute ecaron -71
+KPX Yacute ecircumflex -71
+KPX Yacute edieresis -31
+KPX Yacute edotaccent -71
+KPX Yacute egrave -31
+KPX Yacute emacron -71
+KPX Yacute eogonek -71
+KPX Yacute hyphen -91
+KPX Yacute i -22
+KPX Yacute iacute -22
+KPX Yacute icircumflex -22
+KPX Yacute iogonek -22
+KPX Yacute o -77
+KPX Yacute oacute -77
+KPX Yacute ocircumflex -77
+KPX Yacute odieresis -77
+KPX Yacute ograve -77
+KPX Yacute ohungarumlaut -77
+KPX Yacute omacron -77
+KPX Yacute oslash -77
+KPX Yacute otilde -77
+KPX Yacute period -91
+KPX Yacute semicolon -55
+KPX Yacute u -58
+KPX Yacute uacute -58
+KPX Yacute ucircumflex -58
+KPX Yacute udieresis -58
+KPX Yacute ugrave -58
+KPX Yacute uhungarumlaut -58
+KPX Yacute umacron -58
+KPX Yacute uogonek -58
+KPX Yacute uring -58
+KPX Ydieresis A -79
+KPX Ydieresis Aacute -79
+KPX Ydieresis Abreve -79
+KPX Ydieresis Acircumflex -79
+KPX Ydieresis Adieresis -79
+KPX Ydieresis Agrave -79
+KPX Ydieresis Amacron -79
+KPX Ydieresis Aogonek -79
+KPX Ydieresis Aring -79
+KPX Ydieresis Atilde -79
+KPX Ydieresis a -77
+KPX Ydieresis aacute -77
+KPX Ydieresis abreve -77
+KPX Ydieresis acircumflex -77
+KPX Ydieresis adieresis -77
+KPX Ydieresis agrave -77
+KPX Ydieresis amacron -77
+KPX Ydieresis aogonek -77
+KPX Ydieresis aring -77
+KPX Ydieresis atilde -77
+KPX Ydieresis colon -55
+KPX Ydieresis comma -91
+KPX Ydieresis e -71
+KPX Ydieresis eacute -71
+KPX Ydieresis ecaron -71
+KPX Ydieresis ecircumflex -71
+KPX Ydieresis edieresis -31
+KPX Ydieresis edotaccent -71
+KPX Ydieresis egrave -31
+KPX Ydieresis emacron -71
+KPX Ydieresis eogonek -71
+KPX Ydieresis hyphen -91
+KPX Ydieresis i -22
+KPX Ydieresis iacute -22
+KPX Ydieresis icircumflex -22
+KPX Ydieresis iogonek -22
+KPX Ydieresis o -77
+KPX Ydieresis oacute -77
+KPX Ydieresis ocircumflex -77
+KPX Ydieresis odieresis -77
+KPX Ydieresis ograve -77
+KPX Ydieresis ohungarumlaut -77
+KPX Ydieresis omacron -77
+KPX Ydieresis oslash -77
+KPX Ydieresis otilde -77
+KPX Ydieresis period -91
+KPX Ydieresis semicolon -55
+KPX Ydieresis u -58
+KPX Ydieresis uacute -58
+KPX Ydieresis ucircumflex -58
+KPX Ydieresis udieresis -58
+KPX Ydieresis ugrave -58
+KPX Ydieresis uhungarumlaut -58
+KPX Ydieresis umacron -58
+KPX Ydieresis uogonek -58
+KPX Ydieresis uring -58
+KPX a v 6
+KPX a w -8
+KPX a y -8
+KPX a yacute -8
+KPX a ydieresis -8
+KPX aacute v 6
+KPX aacute w -8
+KPX aacute y -8
+KPX aacute yacute -8
+KPX aacute ydieresis -8
+KPX abreve v 6
+KPX abreve w -8
+KPX abreve y -8
+KPX abreve yacute -8
+KPX abreve ydieresis -8
+KPX acircumflex v 6
+KPX acircumflex w -8
+KPX acircumflex y -8
+KPX acircumflex yacute -8
+KPX acircumflex ydieresis -8
+KPX adieresis v 6
+KPX adieresis w -8
+KPX adieresis y -8
+KPX adieresis yacute -8
+KPX adieresis ydieresis -8
+KPX agrave v 6
+KPX agrave w -8
+KPX agrave y -8
+KPX agrave yacute -8
+KPX agrave ydieresis -8
+KPX amacron v 6
+KPX amacron w -8
+KPX amacron y -8
+KPX amacron yacute -8
+KPX amacron ydieresis -8
+KPX aogonek v 6
+KPX aogonek w -8
+KPX aogonek y 18
+KPX aogonek yacute 18
+KPX aogonek ydieresis 18
+KPX aring v 6
+KPX aring w -8
+KPX aring y -8
+KPX aring yacute -8
+KPX aring ydieresis -8
+KPX atilde v 6
+KPX atilde w -8
+KPX atilde y -8
+KPX atilde yacute -8
+KPX atilde ydieresis -8
+KPX b comma 6
+KPX b period 6
+KPX b v 8
+KPX b y -6
+KPX b yacute -6
+KPX b ydieresis -6
+KPX c comma -8
+KPX c h -18
+KPX c k -8
+KPX c kcommaaccent -8
+KPX c l -13
+KPX c lacute -13
+KPX c lcommaaccent -13
+KPX c lslash -13
+KPX c period -8
+KPX c y -20
+KPX c yacute -20
+KPX c ydieresis -20
+KPX cacute comma -8
+KPX cacute h -18
+KPX cacute k -8
+KPX cacute kcommaaccent -8
+KPX cacute l -13
+KPX cacute lacute -13
+KPX cacute lcommaaccent -13
+KPX cacute lslash -13
+KPX cacute period -8
+KPX cacute y -20
+KPX cacute yacute -20
+KPX cacute ydieresis -20
+KPX ccaron comma -8
+KPX ccaron h -18
+KPX ccaron k -8
+KPX ccaron kcommaaccent -8
+KPX ccaron l -13
+KPX ccaron lacute -13
+KPX ccaron lcommaaccent -13
+KPX ccaron lslash -13
+KPX ccaron period -8
+KPX ccaron y -20
+KPX ccaron yacute -20
+KPX ccaron ydieresis -20
+KPX ccedilla comma -8
+KPX ccedilla h -18
+KPX ccedilla k -8
+KPX ccedilla kcommaaccent -8
+KPX ccedilla l -13
+KPX ccedilla lacute -13
+KPX ccedilla lcommaaccent -13
+KPX ccedilla lslash -13
+KPX ccedilla period -8
+KPX ccedilla y -20
+KPX ccedilla yacute -20
+KPX ccedilla ydieresis -20
+KPX colon space -18
+KPX comma quotedblright -18
+KPX comma quoteright -18
+KPX comma space -18
+KPX d w -15
+KPX d y -15
+KPX d yacute -15
+KPX d ydieresis -15
+KPX dcroat w -15
+KPX dcroat y -15
+KPX dcroat yacute -15
+KPX dcroat ydieresis -15
+KPX e b -8
+KPX e g -4
+KPX e gbreve -4
+KPX e gcommaaccent -4
+KPX e p -11
+KPX e w -15
+KPX e x -5
+KPX e y -15
+KPX e yacute -15
+KPX e ydieresis -15
+KPX eacute b -8
+KPX eacute g -4
+KPX eacute gbreve -4
+KPX eacute gcommaaccent -4
+KPX eacute p -11
+KPX eacute w -15
+KPX eacute x -5
+KPX eacute y -15
+KPX eacute yacute -15
+KPX eacute ydieresis -15
+KPX ecaron b -8
+KPX ecaron g -4
+KPX ecaron gbreve -4
+KPX ecaron gcommaaccent -4
+KPX ecaron p -11
+KPX ecaron w -15
+KPX ecaron x -5
+KPX ecaron y -15
+KPX ecaron yacute -15
+KPX ecaron ydieresis -15
+KPX ecircumflex b -8
+KPX ecircumflex g -4
+KPX ecircumflex gbreve -4
+KPX ecircumflex gcommaaccent -4
+KPX ecircumflex p -11
+KPX ecircumflex w -15
+KPX ecircumflex x -5
+KPX ecircumflex y -15
+KPX ecircumflex yacute -15
+KPX ecircumflex ydieresis -15
+KPX edieresis b -8
+KPX edieresis g -4
+KPX edieresis gbreve -4
+KPX edieresis gcommaaccent -4
+KPX edieresis p -11
+KPX edieresis w -15
+KPX edieresis x -5
+KPX edieresis y -15
+KPX edieresis yacute -15
+KPX edieresis ydieresis -15
+KPX edotaccent b -8
+KPX edotaccent g -4
+KPX edotaccent gbreve -4
+KPX edotaccent gcommaaccent -4
+KPX edotaccent p -11
+KPX edotaccent w -15
+KPX edotaccent x -5
+KPX edotaccent y -15
+KPX edotaccent yacute -15
+KPX edotaccent ydieresis -15
+KPX egrave b -8
+KPX egrave g -4
+KPX egrave gbreve -4
+KPX egrave gcommaaccent -4
+KPX egrave p -11
+KPX egrave w -15
+KPX egrave x -5
+KPX egrave y -15
+KPX egrave yacute -15
+KPX egrave ydieresis -15
+KPX emacron b -8
+KPX emacron g -4
+KPX emacron gbreve -4
+KPX emacron gcommaaccent -4
+KPX emacron p -11
+KPX emacron w -15
+KPX emacron x -5
+KPX emacron y -15
+KPX emacron yacute -15
+KPX emacron ydieresis -15
+KPX eogonek b -8
+KPX eogonek g -4
+KPX eogonek gbreve -4
+KPX eogonek gcommaaccent -4
+KPX eogonek p -11
+KPX eogonek w -15
+KPX eogonek x -5
+KPX eogonek y -15
+KPX eogonek yacute -15
+KPX eogonek ydieresis -15
+KPX f a 8
+KPX f aacute 8
+KPX f abreve 8
+KPX f acircumflex 8
+KPX f adieresis 8
+KPX f agrave 8
+KPX f amacron 8
+KPX f aogonek 8
+KPX f aring 8
+KPX f atilde 8
+KPX f comma -28
+KPX f dotlessi 7
+KPX f e 14
+KPX f eacute 14
+KPX f ecaron 34
+KPX f ecircumflex 34
+KPX f edieresis 34
+KPX f edotaccent 14
+KPX f egrave 34
+KPX f emacron 34
+KPX f eogonek 14
+KPX f i 7
+KPX f iacute 27
+KPX f icircumflex 27
+KPX f idieresis 27
+KPX f igrave 27
+KPX f imacron 27
+KPX f iogonek 7
+KPX f l 7
+KPX f lacute 7
+KPX f lcommaaccent 7
+KPX f lslash 7
+KPX f o 7
+KPX f oacute 7
+KPX f ocircumflex 7
+KPX f odieresis 7
+KPX f ograve 7
+KPX f ohungarumlaut 7
+KPX f omacron 7
+KPX f oslash 7
+KPX f otilde 7
+KPX f period -28
+KPX f quotedblright 105
+KPX f quoteright 105
+KPX g comma -5
+KPX g period -5
+KPX g r 11
+KPX g racute 11
+KPX g rcaron 11
+KPX g rcommaaccent 11
+KPX g y -11
+KPX g yacute -11
+KPX g ydieresis -11
+KPX gbreve comma -5
+KPX gbreve period -5
+KPX gbreve r 11
+KPX gbreve racute 11
+KPX gbreve rcaron 11
+KPX gbreve rcommaaccent 11
+KPX gbreve y -11
+KPX gbreve yacute -11
+KPX gbreve ydieresis -11
+KPX gcommaaccent comma -5
+KPX gcommaaccent period -5
+KPX gcommaaccent r 11
+KPX gcommaaccent racute 11
+KPX gcommaaccent rcaron 11
+KPX gcommaaccent rcommaaccent 11
+KPX gcommaaccent y -11
+KPX gcommaaccent yacute -11
+KPX gcommaaccent ydieresis -11
+KPX h y -20
+KPX h yacute -20
+KPX h ydieresis -20
+KPX i v 7
+KPX iacute v 7
+KPX icircumflex v 7
+KPX idieresis v 7
+KPX igrave v 7
+KPX imacron v 7
+KPX iogonek v 7
+KPX k e -16
+KPX k eacute -16
+KPX k ecaron -16
+KPX k ecircumflex -16
+KPX k edieresis -16
+KPX k edotaccent -16
+KPX k egrave -16
+KPX k emacron -16
+KPX k eogonek -16
+KPX k o -22
+KPX k oacute -22
+KPX k ocircumflex -22
+KPX k odieresis -22
+KPX k ograve -22
+KPX k ohungarumlaut -22
+KPX k omacron -22
+KPX k oslash -22
+KPX k otilde -22
+KPX k y -15
+KPX k yacute -15
+KPX k ydieresis -15
+KPX kcommaaccent e -16
+KPX kcommaaccent eacute -16
+KPX kcommaaccent ecaron -16
+KPX kcommaaccent ecircumflex -16
+KPX kcommaaccent edieresis -16
+KPX kcommaaccent edotaccent -16
+KPX kcommaaccent egrave -16
+KPX kcommaaccent emacron -16
+KPX kcommaaccent eogonek -16
+KPX kcommaaccent o -22
+KPX kcommaaccent oacute -22
+KPX kcommaaccent ocircumflex -22
+KPX kcommaaccent odieresis -22
+KPX kcommaaccent ograve -22
+KPX kcommaaccent ohungarumlaut -22
+KPX kcommaaccent omacron -22
+KPX kcommaaccent oslash -22
+KPX kcommaaccent otilde -22
+KPX kcommaaccent y -15
+KPX kcommaaccent yacute -15
+KPX kcommaaccent ydieresis -15
+KPX l w -7
+KPX l y -7
+KPX l yacute -7
+KPX l ydieresis -7
+KPX lacute w -7
+KPX lacute y -7
+KPX lacute yacute -7
+KPX lacute ydieresis -7
+KPX lcommaaccent w -7
+KPX lcommaaccent y -7
+KPX lcommaaccent yacute -7
+KPX lcommaaccent ydieresis -7
+KPX lslash w -7
+KPX lslash y -7
+KPX lslash yacute -7
+KPX lslash ydieresis -7
+KPX m u -11
+KPX m uacute -11
+KPX m ucircumflex -11
+KPX m udieresis -11
+KPX m ugrave -11
+KPX m uhungarumlaut -11
+KPX m umacron -11
+KPX m uogonek -11
+KPX m uring -11
+KPX m y -20
+KPX m yacute -20
+KPX m ydieresis -20
+KPX n u -11
+KPX n uacute -11
+KPX n ucircumflex -11
+KPX n udieresis -11
+KPX n ugrave -11
+KPX n uhungarumlaut -11
+KPX n umacron -11
+KPX n uogonek -11
+KPX n uring -11
+KPX n v -7
+KPX n y -20
+KPX n yacute -20
+KPX n ydieresis -20
+KPX nacute u -11
+KPX nacute uacute -11
+KPX nacute ucircumflex -11
+KPX nacute udieresis -11
+KPX nacute ugrave -11
+KPX nacute uhungarumlaut -11
+KPX nacute umacron -11
+KPX nacute uogonek -11
+KPX nacute uring -11
+KPX nacute v -7
+KPX nacute y -20
+KPX nacute yacute -20
+KPX nacute ydieresis -20
+KPX ncaron u -11
+KPX ncaron uacute -11
+KPX ncaron ucircumflex -11
+KPX ncaron udieresis -11
+KPX ncaron ugrave -11
+KPX ncaron uhungarumlaut -11
+KPX ncaron umacron -11
+KPX ncaron uogonek -11
+KPX ncaron uring -11
+KPX ncaron v -7
+KPX ncaron y -20
+KPX ncaron yacute -20
+KPX ncaron ydieresis -20
+KPX ncommaaccent u -11
+KPX ncommaaccent uacute -11
+KPX ncommaaccent ucircumflex -11
+KPX ncommaaccent udieresis -11
+KPX ncommaaccent ugrave -11
+KPX ncommaaccent uhungarumlaut -11
+KPX ncommaaccent umacron -11
+KPX ncommaaccent uogonek -11
+KPX ncommaaccent uring -11
+KPX ncommaaccent v -7
+KPX ncommaaccent y -20
+KPX ncommaaccent yacute -20
+KPX ncommaaccent ydieresis -20
+KPX ntilde u -11
+KPX ntilde uacute -11
+KPX ntilde ucircumflex -11
+KPX ntilde udieresis -11
+KPX ntilde ugrave -11
+KPX ntilde uhungarumlaut -11
+KPX ntilde umacron -11
+KPX ntilde uogonek -11
+KPX ntilde uring -11
+KPX ntilde v -7
+KPX ntilde y -20
+KPX ntilde yacute -20
+KPX ntilde ydieresis -20
+KPX o v 6
+KPX o w -8
+KPX o y -11
+KPX o yacute -11
+KPX o ydieresis -11
+KPX oacute v 6
+KPX oacute w -8
+KPX oacute y -11
+KPX oacute yacute -11
+KPX oacute ydieresis -11
+KPX ocircumflex v 6
+KPX ocircumflex w -8
+KPX ocircumflex y -11
+KPX ocircumflex yacute -11
+KPX ocircumflex ydieresis -11
+KPX odieresis v 6
+KPX odieresis w -8
+KPX odieresis y -11
+KPX odieresis yacute -11
+KPX odieresis ydieresis -11
+KPX ograve v 6
+KPX ograve w -8
+KPX ograve y -11
+KPX ograve yacute -11
+KPX ograve ydieresis -11
+KPX ohungarumlaut v 6
+KPX ohungarumlaut w -8
+KPX ohungarumlaut y -11
+KPX ohungarumlaut yacute -11
+KPX ohungarumlaut ydieresis -11
+KPX omacron v 6
+KPX omacron w -8
+KPX omacron y -11
+KPX omacron yacute -11
+KPX omacron ydieresis -11
+KPX oslash v 6
+KPX oslash w -8
+KPX oslash y -11
+KPX oslash yacute -11
+KPX oslash ydieresis -11
+KPX otilde v 6
+KPX otilde w -8
+KPX otilde y -11
+KPX otilde yacute -11
+KPX otilde ydieresis -11
+KPX p comma 8
+KPX p period 8
+KPX p y -4
+KPX p yacute -4
+KPX p ydieresis -4
+KPX period quotedblright -18
+KPX period quoteright -18
+KPX period space -18
+KPX quotedblleft A -60
+KPX quotedblleft Aacute -60
+KPX quotedblleft Abreve -60
+KPX quotedblleft Acircumflex -60
+KPX quotedblleft Adieresis -60
+KPX quotedblleft Agrave -60
+KPX quotedblleft Amacron -60
+KPX quotedblleft Aogonek -60
+KPX quotedblleft Aring -60
+KPX quotedblleft Atilde -60
+KPX quotedblleft quoteleft 20
+KPX quotedblright space -18
+KPX quoteleft A -80
+KPX quoteleft Aacute -80
+KPX quoteleft Abreve -80
+KPX quoteleft Acircumflex -80
+KPX quoteleft Adieresis -80
+KPX quoteleft Agrave -80
+KPX quoteleft Amacron -80
+KPX quoteleft Aogonek -80
+KPX quoteleft Aring -80
+KPX quoteleft Atilde -80
+KPX quoteright d -41
+KPX quoteright dcroat -41
+KPX quoteright l -22
+KPX quoteright lacute -22
+KPX quoteright lcommaaccent -22
+KPX quoteright lslash -22
+KPX quoteright r -9
+KPX quoteright racute -9
+KPX quoteright rcaron -9
+KPX quoteright rcommaaccent -9
+KPX quoteright s -46
+KPX quoteright sacute -46
+KPX quoteright scaron -46
+KPX quoteright scedilla -46
+KPX quoteright scommaaccent -46
+KPX quoteright t -22
+KPX quoteright tcommaaccent -22
+KPX quoteright v -16
+KPX r a -11
+KPX r aacute -11
+KPX r abreve -11
+KPX r acircumflex -11
+KPX r adieresis -11
+KPX r agrave -11
+KPX r amacron -11
+KPX r aogonek -11
+KPX r aring -11
+KPX r atilde -11
+KPX r colon 9
+KPX r comma -90
+KPX r d -7
+KPX r dcroat -7
+KPX r e -7
+KPX r eacute -7
+KPX r ecaron -7
+KPX r ecircumflex -7
+KPX r edieresis -7
+KPX r edotaccent -7
+KPX r egrave -7
+KPX r emacron -7
+KPX r eogonek -7
+KPX r g -11
+KPX r gbreve -11
+KPX r gcommaaccent -11
+KPX r hyphen -16
+KPX r i -14
+KPX r iacute -14
+KPX r icircumflex -14
+KPX r idieresis -14
+KPX r igrave -14
+KPX r imacron -14
+KPX r iogonek -14
+KPX r k 9
+KPX r kcommaaccent 9
+KPX r l -14
+KPX r lacute -14
+KPX r lcommaaccent -14
+KPX r lslash -14
+KPX r o -11
+KPX r oacute -11
+KPX r ocircumflex -11
+KPX r odieresis -11
+KPX r ograve -11
+KPX r ohungarumlaut -11
+KPX r omacron -11
+KPX r oslash -11
+KPX r otilde -11
+KPX r p -17
+KPX r period -90
+KPX r quoteright 9
+KPX r s -20
+KPX r sacute -20
+KPX r scaron -20
+KPX r scedilla -20
+KPX r scommaaccent -20
+KPX r semicolon 9
+KPX r t -11
+KPX r tcommaaccent -11
+KPX r u -11
+KPX r uacute -11
+KPX r ucircumflex -11
+KPX r udieresis -11
+KPX r ugrave -11
+KPX r uhungarumlaut -11
+KPX r umacron -11
+KPX r uogonek -11
+KPX r uring -11
+KPX r v -7
+KPX r y -20
+KPX r yacute -20
+KPX r ydieresis -20
+KPX racute a -11
+KPX racute aacute -11
+KPX racute abreve -11
+KPX racute acircumflex -11
+KPX racute adieresis -11
+KPX racute agrave -11
+KPX racute amacron -11
+KPX racute aogonek -11
+KPX racute aring -11
+KPX racute atilde -11
+KPX racute colon 9
+KPX racute comma -90
+KPX racute d -7
+KPX racute dcroat -7
+KPX racute e -7
+KPX racute eacute -7
+KPX racute ecaron -7
+KPX racute ecircumflex -7
+KPX racute edieresis -7
+KPX racute edotaccent -7
+KPX racute egrave -7
+KPX racute emacron -7
+KPX racute eogonek -7
+KPX racute g -11
+KPX racute gbreve -11
+KPX racute gcommaaccent -11
+KPX racute hyphen -16
+KPX racute i -14
+KPX racute iacute -14
+KPX racute icircumflex -14
+KPX racute idieresis -14
+KPX racute igrave -14
+KPX racute imacron -14
+KPX racute iogonek -14
+KPX racute k 9
+KPX racute kcommaaccent 9
+KPX racute l -14
+KPX racute lacute -14
+KPX racute lcommaaccent -14
+KPX racute lslash -14
+KPX racute o -11
+KPX racute oacute -11
+KPX racute ocircumflex -11
+KPX racute odieresis -11
+KPX racute ograve -11
+KPX racute ohungarumlaut -11
+KPX racute omacron -11
+KPX racute oslash -11
+KPX racute otilde -11
+KPX racute p -17
+KPX racute period -90
+KPX racute quoteright 9
+KPX racute s -20
+KPX racute sacute -20
+KPX racute scaron -20
+KPX racute scedilla -20
+KPX racute scommaaccent -20
+KPX racute semicolon 9
+KPX racute t -11
+KPX racute tcommaaccent -11
+KPX racute u -11
+KPX racute uacute -11
+KPX racute ucircumflex -11
+KPX racute udieresis -11
+KPX racute ugrave -11
+KPX racute uhungarumlaut -11
+KPX racute umacron -11
+KPX racute uogonek -11
+KPX racute uring -11
+KPX racute v -7
+KPX racute y -20
+KPX racute yacute -20
+KPX racute ydieresis -20
+KPX rcaron a -11
+KPX rcaron aacute -11
+KPX rcaron abreve -11
+KPX rcaron acircumflex -11
+KPX rcaron adieresis -11
+KPX rcaron agrave -11
+KPX rcaron amacron -11
+KPX rcaron aogonek -11
+KPX rcaron aring -11
+KPX rcaron atilde -11
+KPX rcaron colon 9
+KPX rcaron comma -90
+KPX rcaron d -7
+KPX rcaron dcroat -7
+KPX rcaron e -7
+KPX rcaron eacute -7
+KPX rcaron ecaron -7
+KPX rcaron ecircumflex -7
+KPX rcaron edieresis -7
+KPX rcaron edotaccent -7
+KPX rcaron egrave -7
+KPX rcaron emacron -7
+KPX rcaron eogonek -7
+KPX rcaron g -11
+KPX rcaron gbreve -11
+KPX rcaron gcommaaccent -11
+KPX rcaron hyphen -16
+KPX rcaron i -14
+KPX rcaron iacute -14
+KPX rcaron icircumflex -14
+KPX rcaron idieresis -14
+KPX rcaron igrave -14
+KPX rcaron imacron -14
+KPX rcaron iogonek -14
+KPX rcaron k 9
+KPX rcaron kcommaaccent 9
+KPX rcaron l -14
+KPX rcaron lacute -14
+KPX rcaron lcommaaccent -14
+KPX rcaron lslash -14
+KPX rcaron o -11
+KPX rcaron oacute -11
+KPX rcaron ocircumflex -11
+KPX rcaron odieresis -11
+KPX rcaron ograve -11
+KPX rcaron ohungarumlaut -11
+KPX rcaron omacron -11
+KPX rcaron oslash -11
+KPX rcaron otilde -11
+KPX rcaron p -17
+KPX rcaron period -90
+KPX rcaron quoteright 9
+KPX rcaron s -20
+KPX rcaron sacute -20
+KPX rcaron scaron -20
+KPX rcaron scedilla -20
+KPX rcaron scommaaccent -20
+KPX rcaron semicolon 9
+KPX rcaron t -11
+KPX rcaron tcommaaccent -11
+KPX rcaron u -11
+KPX rcaron uacute -11
+KPX rcaron ucircumflex -11
+KPX rcaron udieresis -11
+KPX rcaron ugrave -11
+KPX rcaron uhungarumlaut -11
+KPX rcaron umacron -11
+KPX rcaron uogonek -11
+KPX rcaron uring -11
+KPX rcaron v -7
+KPX rcaron y -20
+KPX rcaron yacute -20
+KPX rcaron ydieresis -20
+KPX rcommaaccent a -11
+KPX rcommaaccent aacute -11
+KPX rcommaaccent abreve -11
+KPX rcommaaccent acircumflex -11
+KPX rcommaaccent adieresis -11
+KPX rcommaaccent agrave -11
+KPX rcommaaccent amacron -11
+KPX rcommaaccent aogonek -11
+KPX rcommaaccent aring -11
+KPX rcommaaccent atilde -11
+KPX rcommaaccent colon 9
+KPX rcommaaccent comma -90
+KPX rcommaaccent d -7
+KPX rcommaaccent dcroat -7
+KPX rcommaaccent e -7
+KPX rcommaaccent eacute -7
+KPX rcommaaccent ecaron -7
+KPX rcommaaccent ecircumflex -7
+KPX rcommaaccent edieresis -7
+KPX rcommaaccent edotaccent -7
+KPX rcommaaccent egrave -7
+KPX rcommaaccent emacron -7
+KPX rcommaaccent eogonek -7
+KPX rcommaaccent g -11
+KPX rcommaaccent gbreve -11
+KPX rcommaaccent gcommaaccent -11
+KPX rcommaaccent hyphen -16
+KPX rcommaaccent i -14
+KPX rcommaaccent iacute -14
+KPX rcommaaccent icircumflex -14
+KPX rcommaaccent idieresis -14
+KPX rcommaaccent igrave -14
+KPX rcommaaccent imacron -14
+KPX rcommaaccent iogonek -14
+KPX rcommaaccent k 9
+KPX rcommaaccent kcommaaccent 9
+KPX rcommaaccent l -14
+KPX rcommaaccent lacute -14
+KPX rcommaaccent lcommaaccent -14
+KPX rcommaaccent lslash -14
+KPX rcommaaccent o -11
+KPX rcommaaccent oacute -11
+KPX rcommaaccent ocircumflex -11
+KPX rcommaaccent odieresis -11
+KPX rcommaaccent ograve -11
+KPX rcommaaccent ohungarumlaut -11
+KPX rcommaaccent omacron -11
+KPX rcommaaccent oslash -11
+KPX rcommaaccent otilde -11
+KPX rcommaaccent p -17
+KPX rcommaaccent period -90
+KPX rcommaaccent quoteright 9
+KPX rcommaaccent s -20
+KPX rcommaaccent sacute -20
+KPX rcommaaccent scaron -20
+KPX rcommaaccent scedilla -20
+KPX rcommaaccent scommaaccent -20
+KPX rcommaaccent semicolon 9
+KPX rcommaaccent t -11
+KPX rcommaaccent tcommaaccent -11
+KPX rcommaaccent u -11
+KPX rcommaaccent uacute -11
+KPX rcommaaccent ucircumflex -11
+KPX rcommaaccent udieresis -11
+KPX rcommaaccent ugrave -11
+KPX rcommaaccent uhungarumlaut -11
+KPX rcommaaccent umacron -11
+KPX rcommaaccent uogonek -11
+KPX rcommaaccent uring -11
+KPX rcommaaccent v -7
+KPX rcommaaccent y -20
+KPX rcommaaccent yacute -20
+KPX rcommaaccent ydieresis -20
+KPX s comma 11
+KPX s period 11
+KPX sacute comma 11
+KPX sacute period 11
+KPX scaron comma 11
+KPX scaron period 11
+KPX scedilla comma 11
+KPX scedilla period 11
+KPX scommaaccent comma 11
+KPX scommaaccent period 11
+KPX semicolon space -18
+KPX space A -22
+KPX space Aacute -22
+KPX space Abreve -22
+KPX space Acircumflex -22
+KPX space Adieresis -22
+KPX space Agrave -22
+KPX space Amacron -22
+KPX space Aogonek -22
+KPX space Aring -22
+KPX space Atilde -22
+KPX space T -18
+KPX space Tcaron -18
+KPX space Tcommaaccent -18
+KPX space V -24
+KPX space W -33
+KPX space Y -18
+KPX space Yacute -18
+KPX space Ydieresis -18
+KPX space quotedblleft -18
+KPX v a -6
+KPX v aacute -6
+KPX v abreve -6
+KPX v acircumflex -6
+KPX v adieresis -6
+KPX v agrave -6
+KPX v amacron -6
+KPX v aogonek -6
+KPX v aring -6
+KPX v atilde -6
+KPX v comma -11
+KPX v o -6
+KPX v oacute -6
+KPX v ocircumflex -6
+KPX v odieresis -6
+KPX v ograve -6
+KPX v ohungarumlaut -6
+KPX v omacron -6
+KPX v oslash -6
+KPX v otilde -6
+KPX v period -11
+KPX w a -14
+KPX w aacute -14
+KPX w abreve -14
+KPX w acircumflex -14
+KPX w adieresis -14
+KPX w agrave -14
+KPX w amacron -14
+KPX w aogonek -14
+KPX w aring -14
+KPX w atilde -14
+KPX w comma -17
+KPX w e -8
+KPX w eacute -8
+KPX w ecaron -8
+KPX w ecircumflex -8
+KPX w edieresis -8
+KPX w edotaccent -8
+KPX w egrave -8
+KPX w emacron -8
+KPX w eogonek -8
+KPX w o -14
+KPX w oacute -14
+KPX w ocircumflex -14
+KPX w odieresis -14
+KPX w ograve -14
+KPX w ohungarumlaut -14
+KPX w omacron -14
+KPX w oslash -14
+KPX w otilde -14
+KPX w period -17
+KPX x e 5
+KPX x eacute 5
+KPX x ecaron 5
+KPX x ecircumflex 5
+KPX x edieresis 5
+KPX x edotaccent 5
+KPX x egrave 5
+KPX x emacron 5
+KPX x eogonek 5
+KPX y a 8
+KPX y aacute 8
+KPX y abreve 8
+KPX y acircumflex 8
+KPX y adieresis 8
+KPX y agrave 8
+KPX y amacron 8
+KPX y aogonek 8
+KPX y aring 8
+KPX y atilde 8
+KPX y comma -25
+KPX y e 15
+KPX y eacute 15
+KPX y ecaron 15
+KPX y ecircumflex 15
+KPX y edieresis 15
+KPX y edotaccent 15
+KPX y egrave 15
+KPX y emacron 15
+KPX y eogonek 15
+KPX y o 8
+KPX y oacute 8
+KPX y ocircumflex 8
+KPX y odieresis 8
+KPX y ograve 8
+KPX y ohungarumlaut 8
+KPX y omacron 8
+KPX y oslash 8
+KPX y otilde 8
+KPX y period -25
+KPX yacute a 8
+KPX yacute aacute 8
+KPX yacute abreve 8
+KPX yacute acircumflex 8
+KPX yacute adieresis 8
+KPX yacute agrave 8
+KPX yacute amacron 8
+KPX yacute aogonek 8
+KPX yacute aring 8
+KPX yacute atilde 8
+KPX yacute comma -25
+KPX yacute e 15
+KPX yacute eacute 15
+KPX yacute ecaron 15
+KPX yacute ecircumflex 15
+KPX yacute edieresis 15
+KPX yacute edotaccent 15
+KPX yacute egrave 15
+KPX yacute emacron 15
+KPX yacute eogonek 15
+KPX yacute o 8
+KPX yacute oacute 8
+KPX yacute ocircumflex 8
+KPX yacute odieresis 8
+KPX yacute ograve 8
+KPX yacute ohungarumlaut 8
+KPX yacute omacron 8
+KPX yacute oslash 8
+KPX yacute otilde 8
+KPX yacute period -25
+KPX ydieresis a 8
+KPX ydieresis aacute 8
+KPX ydieresis abreve 8
+KPX ydieresis acircumflex 8
+KPX ydieresis adieresis 8
+KPX ydieresis agrave 8
+KPX ydieresis amacron 8
+KPX ydieresis aogonek 8
+KPX ydieresis aring 8
+KPX ydieresis atilde 8
+KPX ydieresis comma -25
+KPX ydieresis e 15
+KPX ydieresis eacute 15
+KPX ydieresis ecaron 15
+KPX ydieresis ecircumflex 15
+KPX ydieresis edieresis 15
+KPX ydieresis edotaccent 15
+KPX ydieresis egrave 15
+KPX ydieresis emacron 15
+KPX ydieresis eogonek 15
+KPX ydieresis o 8
+KPX ydieresis oacute 8
+KPX ydieresis ocircumflex 8
+KPX ydieresis odieresis 8
+KPX ydieresis ograve 8
+KPX ydieresis ohungarumlaut 8
+KPX ydieresis omacron 8
+KPX ydieresis oslash 8
+KPX ydieresis otilde 8
+KPX ydieresis period -25
+KPX z e 4
+KPX z eacute 4
+KPX z ecaron 4
+KPX z ecircumflex 4
+KPX z edieresis 4
+KPX z edotaccent 4
+KPX z egrave 4
+KPX z emacron 4
+KPX z eogonek 4
+KPX zacute e 4
+KPX zacute eacute 4
+KPX zacute ecaron 4
+KPX zacute ecircumflex 4
+KPX zacute edieresis 4
+KPX zacute edotaccent 4
+KPX zacute egrave 4
+KPX zacute emacron 4
+KPX zacute eogonek 4
+KPX zcaron e 4
+KPX zcaron eacute 4
+KPX zcaron ecaron 4
+KPX zcaron ecircumflex 4
+KPX zcaron edieresis 4
+KPX zcaron edotaccent 4
+KPX zcaron egrave 4
+KPX zcaron emacron 4
+KPX zcaron eogonek 4
+KPX zdotaccent e 4
+KPX zdotaccent eacute 4
+KPX zdotaccent ecaron 4
+KPX zdotaccent ecircumflex 4
+KPX zdotaccent edieresis 4
+KPX zdotaccent edotaccent 4
+KPX zdotaccent egrave 4
+KPX zdotaccent emacron 4
+KPX zdotaccent eogonek 4
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/src/fonts/Adobe-Core35_AFMs-314/NewCenturySchlbk-Italic.afm b/src/fonts/Adobe-Core35_AFMs-314/NewCenturySchlbk-Italic.afm
new file mode 100644
index 0000000..699b02f
--- /dev/null
+++ b/src/fonts/Adobe-Core35_AFMs-314/NewCenturySchlbk-Italic.afm
@@ -0,0 +1,2040 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1985, 1987, 1989, 1991, 1992, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Mon Jun 23 16:46:15 1997
+Comment UniqueID 43093
+Comment VMusage 43675 54700
+FontName NewCenturySchlbk-Italic
+FullName New Century Schoolbook Italic
+FamilyName New Century Schoolbook
+Weight Medium
+ItalicAngle -16
+IsFixedPitch false
+FontBBox -166 -250 994 958
+UnderlinePosition -100
+UnderlineThickness 50
+Version 002.000
+Notice Copyright (c) 1985, 1987, 1989, 1991, 1992, 1997 Adobe Systems Incorporated. All Rights Reserved.
+EncodingScheme AdobeStandardEncoding
+CapHeight 722
+XHeight 466
+Ascender 737
+Descender -205
+StdHW 45
+StdVW 80
+StartCharMetrics 314
+C 32 ; WX 278 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 333 ; N exclam ; B 17 -15 303 737 ;
+C 34 ; WX 400 ; N quotedbl ; B 127 463 363 737 ;
+C 35 ; WX 556 ; N numbersign ; B 28 0 528 690 ;
+C 36 ; WX 556 ; N dollar ; B 4 -142 536 808 ;
+C 37 ; WX 833 ; N percent ; B 43 -15 790 705 ;
+C 38 ; WX 852 ; N ampersand ; B 24 -15 773 737 ;
+C 39 ; WX 204 ; N quoteright ; B 39 463 229 737 ;
+C 40 ; WX 333 ; N parenleft ; B 53 -117 411 745 ;
+C 41 ; WX 333 ; N parenright ; B -93 -117 265 745 ;
+C 42 ; WX 500 ; N asterisk ; B 80 318 500 737 ;
+C 43 ; WX 606 ; N plus ; B 50 0 556 506 ;
+C 44 ; WX 278 ; N comma ; B -39 -165 151 109 ;
+C 45 ; WX 333 ; N hyphen ; B 32 202 259 274 ;
+C 46 ; WX 278 ; N period ; B 17 -15 141 109 ;
+C 47 ; WX 606 ; N slash ; B 132 -15 474 737 ;
+C 48 ; WX 556 ; N zero ; B 30 -15 526 705 ;
+C 49 ; WX 556 ; N one ; B 50 0 459 705 ;
+C 50 ; WX 556 ; N two ; B -37 0 506 705 ;
+C 51 ; WX 556 ; N three ; B -2 -15 506 705 ;
+C 52 ; WX 556 ; N four ; B -8 0 512 705 ;
+C 53 ; WX 556 ; N five ; B 4 -15 540 705 ;
+C 54 ; WX 556 ; N six ; B 36 -15 548 705 ;
+C 55 ; WX 556 ; N seven ; B 69 -15 561 705 ;
+C 56 ; WX 556 ; N eight ; B 6 -15 526 705 ;
+C 57 ; WX 556 ; N nine ; B 8 -15 520 705 ;
+C 58 ; WX 278 ; N colon ; B 17 -15 229 466 ;
+C 59 ; WX 278 ; N semicolon ; B -39 -165 229 466 ;
+C 60 ; WX 606 ; N less ; B 36 -8 542 514 ;
+C 61 ; WX 606 ; N equal ; B 50 117 556 389 ;
+C 62 ; WX 606 ; N greater ; B 64 -8 570 514 ;
+C 63 ; WX 444 ; N question ; B 102 -15 417 737 ;
+C 64 ; WX 747 ; N at ; B -2 -15 750 737 ;
+C 65 ; WX 704 ; N A ; B -87 0 668 737 ;
+C 66 ; WX 722 ; N B ; B -33 0 670 722 ;
+C 67 ; WX 722 ; N C ; B 40 -15 712 737 ;
+C 68 ; WX 778 ; N D ; B -33 0 738 722 ;
+C 69 ; WX 722 ; N E ; B -33 0 700 722 ;
+C 70 ; WX 667 ; N F ; B -33 0 700 722 ;
+C 71 ; WX 778 ; N G ; B 40 -15 763 737 ;
+C 72 ; WX 833 ; N H ; B -33 0 866 722 ;
+C 73 ; WX 407 ; N I ; B -33 0 435 722 ;
+C 74 ; WX 611 ; N J ; B -14 -15 651 722 ;
+C 75 ; WX 741 ; N K ; B -33 0 816 722 ;
+C 76 ; WX 667 ; N L ; B -33 0 627 722 ;
+C 77 ; WX 944 ; N M ; B -33 0 977 722 ;
+C 78 ; WX 815 ; N N ; B -51 -15 866 722 ;
+C 79 ; WX 778 ; N O ; B 40 -15 738 737 ;
+C 80 ; WX 667 ; N P ; B -33 0 667 722 ;
+C 81 ; WX 778 ; N Q ; B 40 -190 738 737 ;
+C 82 ; WX 741 ; N R ; B -45 -15 692 722 ;
+C 83 ; WX 667 ; N S ; B -6 -15 638 737 ;
+C 84 ; WX 685 ; N T ; B 40 0 725 722 ;
+C 85 ; WX 815 ; N U ; B 93 -15 867 722 ;
+C 86 ; WX 704 ; N V ; B 36 -10 779 722 ;
+C 87 ; WX 926 ; N W ; B 53 -10 978 722 ;
+C 88 ; WX 704 ; N X ; B -75 0 779 722 ;
+C 89 ; WX 685 ; N Y ; B 31 0 760 722 ;
+C 90 ; WX 667 ; N Z ; B -25 0 667 722 ;
+C 91 ; WX 333 ; N bracketleft ; B -55 -109 388 737 ;
+C 92 ; WX 606 ; N backslash ; B 132 -15 474 737 ;
+C 93 ; WX 333 ; N bracketright ; B -77 -109 366 737 ;
+C 94 ; WX 606 ; N asciicircum ; B 89 325 517 690 ;
+C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;
+C 96 ; WX 204 ; N quoteleft ; B 39 463 229 737 ;
+C 97 ; WX 574 ; N a ; B 2 -15 524 466 ;
+C 98 ; WX 556 ; N b ; B 32 -15 488 737 ;
+C 99 ; WX 444 ; N c ; B 2 -15 394 466 ;
+C 100 ; WX 611 ; N d ; B 2 -15 585 737 ;
+C 101 ; WX 444 ; N e ; B -6 -15 388 466 ;
+C 102 ; WX 333 ; N f ; B -68 -205 470 737 ; L i fi ; L l fl ;
+C 103 ; WX 537 ; N g ; B -79 -205 523 497 ;
+C 104 ; WX 611 ; N h ; B 14 -15 562 737 ;
+C 105 ; WX 333 ; N i ; B 29 -15 282 715 ;
+C 106 ; WX 315 ; N j ; B -166 -205 318 715 ;
+C 107 ; WX 556 ; N k ; B 0 -15 497 737 ;
+C 108 ; WX 333 ; N l ; B 14 -15 292 737 ;
+C 109 ; WX 889 ; N m ; B 14 -15 840 466 ;
+C 110 ; WX 611 ; N n ; B 14 -15 562 466 ;
+C 111 ; WX 500 ; N o ; B 2 -15 450 466 ;
+C 112 ; WX 574 ; N p ; B -101 -205 506 466 ;
+C 113 ; WX 556 ; N q ; B 2 -205 500 466 ;
+C 114 ; WX 444 ; N r ; B 10 0 434 466 ;
+C 115 ; WX 444 ; N s ; B 2 -15 394 466 ;
+C 116 ; WX 352 ; N t ; B 24 -15 328 619 ;
+C 117 ; WX 611 ; N u ; B 44 -15 556 466 ;
+C 118 ; WX 519 ; N v ; B 31 -15 447 466 ;
+C 119 ; WX 778 ; N w ; B 31 -15 706 466 ;
+C 120 ; WX 500 ; N x ; B -33 -15 471 466 ;
+C 121 ; WX 500 ; N y ; B -83 -205 450 466 ;
+C 122 ; WX 463 ; N z ; B -33 -15 416 466 ;
+C 123 ; WX 333 ; N braceleft ; B 38 -109 394 737 ;
+C 124 ; WX 606 ; N bar ; B 267 -250 339 750 ;
+C 125 ; WX 333 ; N braceright ; B -87 -109 269 737 ;
+C 126 ; WX 606 ; N asciitilde ; B 72 184 534 322 ;
+C 161 ; WX 333 ; N exclamdown ; B -22 -205 264 547 ;
+C 162 ; WX 556 ; N cent ; B 62 -144 486 580 ;
+C 163 ; WX 556 ; N sterling ; B -13 -15 544 705 ;
+C 164 ; WX 167 ; N fraction ; B -134 -15 301 705 ;
+C 165 ; WX 556 ; N yen ; B 40 0 624 690 ;
+C 166 ; WX 556 ; N florin ; B -58 -205 569 737 ;
+C 167 ; WX 500 ; N section ; B -10 -147 480 737 ;
+C 168 ; WX 556 ; N currency ; B 26 93 530 597 ;
+C 169 ; WX 278 ; N quotesingle ; B 151 463 237 737 ;
+C 170 ; WX 389 ; N quotedblleft ; B 39 463 406 737 ;
+C 171 ; WX 426 ; N guillemotleft ; B -15 74 402 402 ;
+C 172 ; WX 333 ; N guilsinglleft ; B 40 74 259 402 ;
+C 173 ; WX 333 ; N guilsinglright ; B 40 74 259 402 ;
+C 174 ; WX 611 ; N fi ; B -68 -205 555 737 ;
+C 175 ; WX 611 ; N fl ; B -68 -205 587 737 ;
+C 177 ; WX 500 ; N endash ; B -27 208 487 268 ;
+C 178 ; WX 500 ; N dagger ; B 51 -147 506 737 ;
+C 179 ; WX 500 ; N daggerdbl ; B -54 -147 506 737 ;
+C 180 ; WX 278 ; N periodcentered ; B 71 238 207 374 ;
+C 182 ; WX 650 ; N paragraph ; B 48 -132 665 722 ;
+C 183 ; WX 606 ; N bullet ; B 122 180 484 542 ;
+C 184 ; WX 204 ; N quotesinglbase ; B -78 -165 112 109 ;
+C 185 ; WX 389 ; N quotedblbase ; B -78 -165 289 109 ;
+C 186 ; WX 389 ; N quotedblright ; B 39 463 406 737 ;
+C 187 ; WX 426 ; N guillemotright ; B -15 74 402 402 ;
+C 188 ; WX 1000 ; N ellipsis ; B 59 -15 849 109 ;
+C 189 ; WX 1000 ; N perthousand ; B 6 -15 994 705 ;
+C 191 ; WX 444 ; N questiondown ; B -3 -205 312 547 ;
+C 193 ; WX 333 ; N grave ; B 71 518 262 690 ;
+C 194 ; WX 333 ; N acute ; B 132 518 355 690 ;
+C 195 ; WX 333 ; N circumflex ; B 37 518 331 690 ;
+C 196 ; WX 333 ; N tilde ; B 52 547 383 649 ;
+C 197 ; WX 333 ; N macron ; B 52 560 363 610 ;
+C 198 ; WX 333 ; N breve ; B 69 518 370 677 ;
+C 199 ; WX 333 ; N dotaccent ; B 146 606 255 715 ;
+C 200 ; WX 333 ; N dieresis ; B 59 606 359 708 ;
+C 202 ; WX 333 ; N ring ; B 114 512 314 712 ;
+C 203 ; WX 333 ; N cedilla ; B 3 -215 215 0 ;
+C 205 ; WX 333 ; N hungarumlaut ; B 32 518 455 690 ;
+C 206 ; WX 333 ; N ogonek ; B 46 -220 334 4 ;
+C 207 ; WX 333 ; N caron ; B 73 518 378 690 ;
+C 208 ; WX 1000 ; N emdash ; B -27 208 987 268 ;
+C 225 ; WX 870 ; N AE ; B -87 0 888 722 ;
+C 227 ; WX 422 ; N ordfeminine ; B 72 416 420 705 ;
+C 232 ; WX 667 ; N Lslash ; B -33 0 627 722 ;
+C 233 ; WX 778 ; N Oslash ; B 16 -68 748 780 ;
+C 234 ; WX 981 ; N OE ; B 40 0 975 722 ;
+C 235 ; WX 372 ; N ordmasculine ; B 66 416 370 705 ;
+C 241 ; WX 722 ; N ae ; B -18 -15 666 466 ;
+C 245 ; WX 333 ; N dotlessi ; B 29 -15 282 466 ;
+C 248 ; WX 333 ; N lslash ; B -2 -15 294 737 ;
+C 249 ; WX 500 ; N oslash ; B 2 -121 450 549 ;
+C 250 ; WX 778 ; N oe ; B 2 -15 722 466 ;
+C 251 ; WX 556 ; N germandbls ; B -76 -205 525 737 ;
+C -1 ; WX 407 ; N Idieresis ; B -33 0 456 902 ;
+C -1 ; WX 444 ; N eacute ; B -6 -15 411 690 ;
+C -1 ; WX 574 ; N abreve ; B 2 -15 524 677 ;
+C -1 ; WX 611 ; N uhungarumlaut ; B 44 -15 594 690 ;
+C -1 ; WX 444 ; N ecaron ; B -6 -15 434 690 ;
+C -1 ; WX 685 ; N Ydieresis ; B 31 0 760 902 ;
+C -1 ; WX 606 ; N divide ; B 50 -22 556 528 ;
+C -1 ; WX 685 ; N Yacute ; B 31 0 760 946 ;
+C -1 ; WX 704 ; N Acircumflex ; B -87 0 668 946 ;
+C -1 ; WX 574 ; N aacute ; B 2 -15 524 690 ;
+C -1 ; WX 815 ; N Ucircumflex ; B 93 -15 867 946 ;
+C -1 ; WX 500 ; N yacute ; B -83 -205 450 690 ;
+C -1 ; WX 444 ; N scommaaccent ; B 2 -250 394 466 ;
+C -1 ; WX 444 ; N ecircumflex ; B -6 -15 388 690 ;
+C -1 ; WX 815 ; N Uring ; B 93 -15 867 958 ;
+C -1 ; WX 815 ; N Udieresis ; B 93 -15 867 902 ;
+C -1 ; WX 574 ; N aogonek ; B 2 -225 534 466 ;
+C -1 ; WX 815 ; N Uacute ; B 93 -15 867 946 ;
+C -1 ; WX 611 ; N uogonek ; B 44 -225 556 466 ;
+C -1 ; WX 722 ; N Edieresis ; B -33 0 700 902 ;
+C -1 ; WX 778 ; N Dcroat ; B -33 0 738 722 ;
+C -1 ; WX 250 ; N commaaccent ; B -24 -250 147 -50 ;
+C -1 ; WX 747 ; N copyright ; B -2 -15 750 737 ;
+C -1 ; WX 722 ; N Emacron ; B -33 0 700 866 ;
+C -1 ; WX 444 ; N ccaron ; B 2 -15 434 690 ;
+C -1 ; WX 574 ; N aring ; B 2 -15 524 712 ;
+C -1 ; WX 815 ; N Ncommaaccent ; B -51 -250 866 722 ;
+C -1 ; WX 333 ; N lacute ; B 14 -15 415 958 ;
+C -1 ; WX 574 ; N agrave ; B 2 -15 524 690 ;
+C -1 ; WX 685 ; N Tcommaaccent ; B 40 -250 725 722 ;
+C -1 ; WX 722 ; N Cacute ; B 40 -15 712 946 ;
+C -1 ; WX 574 ; N atilde ; B 2 -15 524 649 ;
+C -1 ; WX 722 ; N Edotaccent ; B -33 0 700 909 ;
+C -1 ; WX 444 ; N scaron ; B 2 -15 434 690 ;
+C -1 ; WX 444 ; N scedilla ; B 2 -215 394 466 ;
+C -1 ; WX 333 ; N iacute ; B 29 -15 355 690 ;
+C -1 ; WX 471 ; N lozenge ; B 10 0 462 728 ;
+C -1 ; WX 741 ; N Rcaron ; B -45 -15 692 946 ;
+C -1 ; WX 778 ; N Gcommaaccent ; B 40 -250 763 737 ;
+C -1 ; WX 611 ; N ucircumflex ; B 44 -15 556 690 ;
+C -1 ; WX 574 ; N acircumflex ; B 2 -15 524 690 ;
+C -1 ; WX 704 ; N Amacron ; B -87 0 668 866 ;
+C -1 ; WX 444 ; N rcaron ; B 10 0 434 690 ;
+C -1 ; WX 444 ; N ccedilla ; B 2 -215 394 466 ;
+C -1 ; WX 667 ; N Zdotaccent ; B -25 0 667 909 ;
+C -1 ; WX 667 ; N Thorn ; B -33 0 627 722 ;
+C -1 ; WX 778 ; N Omacron ; B 40 -15 738 866 ;
+C -1 ; WX 741 ; N Racute ; B -45 -15 692 946 ;
+C -1 ; WX 667 ; N Sacute ; B -6 -15 638 946 ;
+C -1 ; WX 651 ; N dcaron ; B 2 -15 729 737 ;
+C -1 ; WX 815 ; N Umacron ; B 93 -15 867 866 ;
+C -1 ; WX 611 ; N uring ; B 44 -15 556 712 ;
+C -1 ; WX 333 ; N threesuperior ; B 22 273 359 705 ;
+C -1 ; WX 778 ; N Ograve ; B 40 -15 738 946 ;
+C -1 ; WX 704 ; N Agrave ; B -87 0 668 946 ;
+C -1 ; WX 704 ; N Abreve ; B -87 0 668 933 ;
+C -1 ; WX 606 ; N multiply ; B 74 24 532 482 ;
+C -1 ; WX 611 ; N uacute ; B 44 -15 556 690 ;
+C -1 ; WX 685 ; N Tcaron ; B 40 0 725 946 ;
+C -1 ; WX 476 ; N partialdiff ; B 13 -38 463 714 ;
+C -1 ; WX 500 ; N ydieresis ; B -83 -205 450 646 ;
+C -1 ; WX 815 ; N Nacute ; B -51 -15 866 946 ;
+C -1 ; WX 333 ; N icircumflex ; B 29 -15 331 690 ;
+C -1 ; WX 722 ; N Ecircumflex ; B -33 0 700 946 ;
+C -1 ; WX 574 ; N adieresis ; B 2 -15 524 646 ;
+C -1 ; WX 444 ; N edieresis ; B -6 -15 415 646 ;
+C -1 ; WX 444 ; N cacute ; B 2 -15 411 690 ;
+C -1 ; WX 611 ; N nacute ; B 14 -15 562 690 ;
+C -1 ; WX 611 ; N umacron ; B 44 -15 556 610 ;
+C -1 ; WX 815 ; N Ncaron ; B -51 -15 866 946 ;
+C -1 ; WX 407 ; N Iacute ; B -33 0 452 946 ;
+C -1 ; WX 606 ; N plusminus ; B 50 0 556 506 ;
+C -1 ; WX 606 ; N brokenbar ; B 267 -175 339 675 ;
+C -1 ; WX 747 ; N registered ; B -2 -15 750 737 ;
+C -1 ; WX 778 ; N Gbreve ; B 40 -15 763 933 ;
+C -1 ; WX 407 ; N Idotaccent ; B -33 0 435 909 ;
+C -1 ; WX 600 ; N summation ; B 15 -10 586 706 ;
+C -1 ; WX 722 ; N Egrave ; B -33 0 700 946 ;
+C -1 ; WX 444 ; N racute ; B 10 0 434 690 ;
+C -1 ; WX 500 ; N omacron ; B 2 -15 450 610 ;
+C -1 ; WX 667 ; N Zacute ; B -25 0 667 946 ;
+C -1 ; WX 667 ; N Zcaron ; B -25 0 667 946 ;
+C -1 ; WX 549 ; N greaterequal ; B 26 0 523 674 ;
+C -1 ; WX 778 ; N Eth ; B -33 0 738 722 ;
+C -1 ; WX 722 ; N Ccedilla ; B 40 -215 712 737 ;
+C -1 ; WX 333 ; N lcommaaccent ; B -43 -250 292 737 ;
+C -1 ; WX 382 ; N tcaron ; B 24 -15 460 757 ;
+C -1 ; WX 444 ; N eogonek ; B -6 -225 388 466 ;
+C -1 ; WX 815 ; N Uogonek ; B 93 -225 867 722 ;
+C -1 ; WX 704 ; N Aacute ; B -87 0 668 946 ;
+C -1 ; WX 704 ; N Adieresis ; B -87 0 668 902 ;
+C -1 ; WX 444 ; N egrave ; B -6 -15 388 690 ;
+C -1 ; WX 463 ; N zacute ; B -33 -15 420 690 ;
+C -1 ; WX 333 ; N iogonek ; B -14 -225 282 715 ;
+C -1 ; WX 778 ; N Oacute ; B 40 -15 738 946 ;
+C -1 ; WX 500 ; N oacute ; B 2 -15 450 690 ;
+C -1 ; WX 574 ; N amacron ; B 2 -15 524 610 ;
+C -1 ; WX 444 ; N sacute ; B 2 -15 411 690 ;
+C -1 ; WX 333 ; N idieresis ; B 29 -15 359 646 ;
+C -1 ; WX 778 ; N Ocircumflex ; B 40 -15 738 946 ;
+C -1 ; WX 815 ; N Ugrave ; B 93 -15 867 946 ;
+C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ;
+C -1 ; WX 574 ; N thorn ; B -101 -205 506 737 ;
+C -1 ; WX 333 ; N twosuperior ; B 0 282 359 705 ;
+C -1 ; WX 778 ; N Odieresis ; B 40 -15 738 902 ;
+C -1 ; WX 611 ; N mu ; B -60 -205 556 466 ;
+C -1 ; WX 333 ; N igrave ; B 29 -15 282 690 ;
+C -1 ; WX 500 ; N ohungarumlaut ; B 2 -15 539 690 ;
+C -1 ; WX 722 ; N Eogonek ; B -33 -220 700 722 ;
+C -1 ; WX 611 ; N dcroat ; B 2 -15 636 737 ;
+C -1 ; WX 834 ; N threequarters ; B 22 -15 782 705 ;
+C -1 ; WX 667 ; N Scedilla ; B -6 -215 638 737 ;
+C -1 ; WX 363 ; N lcaron ; B 14 -15 436 737 ;
+C -1 ; WX 741 ; N Kcommaaccent ; B -33 -250 816 722 ;
+C -1 ; WX 667 ; N Lacute ; B -33 0 627 946 ;
+C -1 ; WX 950 ; N trademark ; B 32 318 968 722 ;
+C -1 ; WX 444 ; N edotaccent ; B -6 -15 388 653 ;
+C -1 ; WX 407 ; N Igrave ; B -33 0 435 946 ;
+C -1 ; WX 407 ; N Imacron ; B -33 0 460 866 ;
+C -1 ; WX 667 ; N Lcaron ; B -33 0 683 737 ;
+C -1 ; WX 834 ; N onehalf ; B 34 -15 776 705 ;
+C -1 ; WX 549 ; N lessequal ; B 26 0 523 674 ;
+C -1 ; WX 500 ; N ocircumflex ; B 2 -15 450 690 ;
+C -1 ; WX 611 ; N ntilde ; B 14 -15 562 649 ;
+C -1 ; WX 815 ; N Uhungarumlaut ; B 93 -15 867 946 ;
+C -1 ; WX 722 ; N Eacute ; B -33 0 700 946 ;
+C -1 ; WX 444 ; N emacron ; B -6 -15 419 610 ;
+C -1 ; WX 537 ; N gbreve ; B -79 -205 523 677 ;
+C -1 ; WX 834 ; N onequarter ; B 34 -15 782 705 ;
+C -1 ; WX 667 ; N Scaron ; B -6 -15 638 946 ;
+C -1 ; WX 667 ; N Scommaaccent ; B -6 -250 638 737 ;
+C -1 ; WX 778 ; N Ohungarumlaut ; B 40 -15 738 946 ;
+C -1 ; WX 400 ; N degree ; B 86 419 372 705 ;
+C -1 ; WX 500 ; N ograve ; B 2 -15 450 690 ;
+C -1 ; WX 722 ; N Ccaron ; B 40 -15 712 946 ;
+C -1 ; WX 611 ; N ugrave ; B 44 -15 556 690 ;
+C -1 ; WX 453 ; N radical ; B -4 -80 458 762 ;
+C -1 ; WX 778 ; N Dcaron ; B -33 0 738 946 ;
+C -1 ; WX 444 ; N rcommaaccent ; B -67 -250 434 466 ;
+C -1 ; WX 815 ; N Ntilde ; B -51 -15 866 905 ;
+C -1 ; WX 500 ; N otilde ; B 2 -15 467 649 ;
+C -1 ; WX 741 ; N Rcommaaccent ; B -45 -250 692 722 ;
+C -1 ; WX 667 ; N Lcommaaccent ; B -33 -250 627 722 ;
+C -1 ; WX 704 ; N Atilde ; B -87 0 668 905 ;
+C -1 ; WX 704 ; N Aogonek ; B -87 -220 734 737 ;
+C -1 ; WX 704 ; N Aring ; B -87 0 668 958 ;
+C -1 ; WX 778 ; N Otilde ; B 40 -15 738 905 ;
+C -1 ; WX 463 ; N zdotaccent ; B -33 -15 416 653 ;
+C -1 ; WX 722 ; N Ecaron ; B -33 0 700 946 ;
+C -1 ; WX 407 ; N Iogonek ; B -33 -220 435 722 ;
+C -1 ; WX 556 ; N kcommaaccent ; B 0 -250 497 737 ;
+C -1 ; WX 606 ; N minus ; B 50 217 556 289 ;
+C -1 ; WX 407 ; N Icircumflex ; B -33 0 435 946 ;
+C -1 ; WX 611 ; N ncaron ; B 14 -15 562 690 ;
+C -1 ; WX 352 ; N tcommaaccent ; B -33 -250 328 619 ;
+C -1 ; WX 606 ; N logicalnot ; B 50 108 556 389 ;
+C -1 ; WX 500 ; N odieresis ; B 2 -15 450 646 ;
+C -1 ; WX 611 ; N udieresis ; B 44 -15 556 646 ;
+C -1 ; WX 549 ; N notequal ; B 12 -35 537 551 ;
+C -1 ; WX 537 ; N gcommaaccent ; B -79 -205 523 805 ;
+C -1 ; WX 500 ; N eth ; B 2 -15 450 737 ;
+C -1 ; WX 463 ; N zcaron ; B -33 -15 443 690 ;
+C -1 ; WX 611 ; N ncommaaccent ; B 14 -250 562 466 ;
+C -1 ; WX 333 ; N onesuperior ; B 34 282 311 705 ;
+C -1 ; WX 333 ; N imacron ; B 29 -15 300 610 ;
+EndCharMetrics
+StartKernData
+StartKernPairs 1696
+KPX A C -18
+KPX A Cacute -18
+KPX A Ccaron -18
+KPX A Ccedilla -18
+KPX A G -18
+KPX A Gbreve -18
+KPX A Gcommaaccent -18
+KPX A O -18
+KPX A Oacute -18
+KPX A Ocircumflex -18
+KPX A Odieresis -18
+KPX A Ograve -18
+KPX A Ohungarumlaut -18
+KPX A Omacron -18
+KPX A Oslash -18
+KPX A Otilde -18
+KPX A Q -18
+KPX A T -30
+KPX A Tcaron -30
+KPX A Tcommaaccent -30
+KPX A U -37
+KPX A Uacute -37
+KPX A Ucircumflex -37
+KPX A Udieresis -37
+KPX A Ugrave -37
+KPX A Uhungarumlaut -37
+KPX A Umacron -37
+KPX A Uogonek -37
+KPX A Uring -37
+KPX A V -74
+KPX A W -74
+KPX A Y -55
+KPX A Yacute -55
+KPX A Ydieresis -55
+KPX A quotedblright -125
+KPX A quoteright -125
+KPX A u -18
+KPX A uacute -18
+KPX A ucircumflex -18
+KPX A udieresis -18
+KPX A ugrave -18
+KPX A uhungarumlaut -18
+KPX A umacron -18
+KPX A uogonek -18
+KPX A uring -18
+KPX A v -18
+KPX A w -18
+KPX A y -55
+KPX A yacute -55
+KPX A ydieresis -55
+KPX Aacute C -18
+KPX Aacute Cacute -18
+KPX Aacute Ccaron -18
+KPX Aacute Ccedilla -18
+KPX Aacute G -18
+KPX Aacute Gbreve -18
+KPX Aacute Gcommaaccent -18
+KPX Aacute O -18
+KPX Aacute Oacute -18
+KPX Aacute Ocircumflex -18
+KPX Aacute Odieresis -18
+KPX Aacute Ograve -18
+KPX Aacute Ohungarumlaut -18
+KPX Aacute Omacron -18
+KPX Aacute Oslash -18
+KPX Aacute Otilde -18
+KPX Aacute Q -18
+KPX Aacute T -30
+KPX Aacute Tcaron -30
+KPX Aacute Tcommaaccent -30
+KPX Aacute U -37
+KPX Aacute Uacute -37
+KPX Aacute Ucircumflex -37
+KPX Aacute Udieresis -37
+KPX Aacute Ugrave -37
+KPX Aacute Uhungarumlaut -37
+KPX Aacute Umacron -37
+KPX Aacute Uogonek -37
+KPX Aacute Uring -37
+KPX Aacute V -74
+KPX Aacute W -74
+KPX Aacute Y -55
+KPX Aacute Yacute -55
+KPX Aacute Ydieresis -55
+KPX Aacute quotedblright -125
+KPX Aacute quoteright -125
+KPX Aacute u -18
+KPX Aacute uacute -18
+KPX Aacute ucircumflex -18
+KPX Aacute udieresis -18
+KPX Aacute ugrave -18
+KPX Aacute uhungarumlaut -18
+KPX Aacute umacron -18
+KPX Aacute uogonek -18
+KPX Aacute uring -18
+KPX Aacute v -18
+KPX Aacute w -18
+KPX Aacute y -55
+KPX Aacute yacute -55
+KPX Aacute ydieresis -55
+KPX Abreve C -18
+KPX Abreve Cacute -18
+KPX Abreve Ccaron -18
+KPX Abreve Ccedilla -18
+KPX Abreve G -18
+KPX Abreve Gbreve -18
+KPX Abreve Gcommaaccent -18
+KPX Abreve O -18
+KPX Abreve Oacute -18
+KPX Abreve Ocircumflex -18
+KPX Abreve Odieresis -18
+KPX Abreve Ograve -18
+KPX Abreve Ohungarumlaut -18
+KPX Abreve Omacron -18
+KPX Abreve Oslash -18
+KPX Abreve Otilde -18
+KPX Abreve Q -18
+KPX Abreve T -30
+KPX Abreve Tcaron -30
+KPX Abreve Tcommaaccent -30
+KPX Abreve U -37
+KPX Abreve Uacute -37
+KPX Abreve Ucircumflex -37
+KPX Abreve Udieresis -37
+KPX Abreve Ugrave -37
+KPX Abreve Uhungarumlaut -37
+KPX Abreve Umacron -37
+KPX Abreve Uogonek -37
+KPX Abreve Uring -37
+KPX Abreve V -74
+KPX Abreve W -74
+KPX Abreve Y -55
+KPX Abreve Yacute -55
+KPX Abreve Ydieresis -55
+KPX Abreve quotedblright -125
+KPX Abreve quoteright -125
+KPX Abreve u -18
+KPX Abreve uacute -18
+KPX Abreve ucircumflex -18
+KPX Abreve udieresis -18
+KPX Abreve ugrave -18
+KPX Abreve uhungarumlaut -18
+KPX Abreve umacron -18
+KPX Abreve uogonek -18
+KPX Abreve uring -18
+KPX Abreve v -18
+KPX Abreve w -18
+KPX Abreve y -55
+KPX Abreve yacute -55
+KPX Abreve ydieresis -55
+KPX Acircumflex C -18
+KPX Acircumflex Cacute -18
+KPX Acircumflex Ccaron -18
+KPX Acircumflex Ccedilla -18
+KPX Acircumflex G -18
+KPX Acircumflex Gbreve -18
+KPX Acircumflex Gcommaaccent -18
+KPX Acircumflex O -18
+KPX Acircumflex Oacute -18
+KPX Acircumflex Ocircumflex -18
+KPX Acircumflex Odieresis -18
+KPX Acircumflex Ograve -18
+KPX Acircumflex Ohungarumlaut -18
+KPX Acircumflex Omacron -18
+KPX Acircumflex Oslash -18
+KPX Acircumflex Otilde -18
+KPX Acircumflex Q -18
+KPX Acircumflex T -30
+KPX Acircumflex Tcaron -30
+KPX Acircumflex Tcommaaccent -30
+KPX Acircumflex U -37
+KPX Acircumflex Uacute -37
+KPX Acircumflex Ucircumflex -37
+KPX Acircumflex Udieresis -37
+KPX Acircumflex Ugrave -37
+KPX Acircumflex Uhungarumlaut -37
+KPX Acircumflex Umacron -37
+KPX Acircumflex Uogonek -37
+KPX Acircumflex Uring -37
+KPX Acircumflex V -74
+KPX Acircumflex W -74
+KPX Acircumflex Y -55
+KPX Acircumflex Yacute -55
+KPX Acircumflex Ydieresis -55
+KPX Acircumflex quotedblright -125
+KPX Acircumflex quoteright -125
+KPX Acircumflex u -18
+KPX Acircumflex uacute -18
+KPX Acircumflex ucircumflex -18
+KPX Acircumflex udieresis -18
+KPX Acircumflex ugrave -18
+KPX Acircumflex uhungarumlaut -18
+KPX Acircumflex umacron -18
+KPX Acircumflex uogonek -18
+KPX Acircumflex uring -18
+KPX Acircumflex v -18
+KPX Acircumflex w -18
+KPX Acircumflex y -55
+KPX Acircumflex yacute -55
+KPX Acircumflex ydieresis -55
+KPX Adieresis C -18
+KPX Adieresis Cacute -18
+KPX Adieresis Ccaron -18
+KPX Adieresis Ccedilla -18
+KPX Adieresis G -18
+KPX Adieresis Gbreve -18
+KPX Adieresis Gcommaaccent -18
+KPX Adieresis O -18
+KPX Adieresis Oacute -18
+KPX Adieresis Ocircumflex -18
+KPX Adieresis Odieresis -18
+KPX Adieresis Ograve -18
+KPX Adieresis Ohungarumlaut -18
+KPX Adieresis Omacron -18
+KPX Adieresis Oslash -18
+KPX Adieresis Otilde -18
+KPX Adieresis Q -18
+KPX Adieresis T -30
+KPX Adieresis Tcaron -30
+KPX Adieresis Tcommaaccent -30
+KPX Adieresis U -37
+KPX Adieresis Uacute -37
+KPX Adieresis Ucircumflex -37
+KPX Adieresis Udieresis -37
+KPX Adieresis Ugrave -37
+KPX Adieresis Uhungarumlaut -37
+KPX Adieresis Umacron -37
+KPX Adieresis Uogonek -37
+KPX Adieresis Uring -37
+KPX Adieresis V -74
+KPX Adieresis W -74
+KPX Adieresis Y -55
+KPX Adieresis Yacute -55
+KPX Adieresis Ydieresis -55
+KPX Adieresis quotedblright -125
+KPX Adieresis quoteright -125
+KPX Adieresis u -18
+KPX Adieresis uacute -18
+KPX Adieresis ucircumflex -18
+KPX Adieresis udieresis -18
+KPX Adieresis ugrave -18
+KPX Adieresis uhungarumlaut -18
+KPX Adieresis umacron -18
+KPX Adieresis uogonek -18
+KPX Adieresis uring -18
+KPX Adieresis v -18
+KPX Adieresis w -18
+KPX Adieresis y -55
+KPX Adieresis yacute -55
+KPX Adieresis ydieresis -55
+KPX Agrave C -18
+KPX Agrave Cacute -18
+KPX Agrave Ccaron -18
+KPX Agrave Ccedilla -18
+KPX Agrave G -18
+KPX Agrave Gbreve -18
+KPX Agrave Gcommaaccent -18
+KPX Agrave O -18
+KPX Agrave Oacute -18
+KPX Agrave Ocircumflex -18
+KPX Agrave Odieresis -18
+KPX Agrave Ograve -18
+KPX Agrave Ohungarumlaut -18
+KPX Agrave Omacron -18
+KPX Agrave Oslash -18
+KPX Agrave Otilde -18
+KPX Agrave Q -18
+KPX Agrave T -30
+KPX Agrave Tcaron -30
+KPX Agrave Tcommaaccent -30
+KPX Agrave U -37
+KPX Agrave Uacute -37
+KPX Agrave Ucircumflex -37
+KPX Agrave Udieresis -37
+KPX Agrave Ugrave -37
+KPX Agrave Uhungarumlaut -37
+KPX Agrave Umacron -37
+KPX Agrave Uogonek -37
+KPX Agrave Uring -37
+KPX Agrave V -74
+KPX Agrave W -74
+KPX Agrave Y -55
+KPX Agrave Yacute -55
+KPX Agrave Ydieresis -55
+KPX Agrave quotedblright -125
+KPX Agrave quoteright -125
+KPX Agrave u -18
+KPX Agrave uacute -18
+KPX Agrave ucircumflex -18
+KPX Agrave udieresis -18
+KPX Agrave ugrave -18
+KPX Agrave uhungarumlaut -18
+KPX Agrave umacron -18
+KPX Agrave uogonek -18
+KPX Agrave uring -18
+KPX Agrave v -18
+KPX Agrave w -18
+KPX Agrave y -55
+KPX Agrave yacute -55
+KPX Agrave ydieresis -55
+KPX Amacron C -18
+KPX Amacron Cacute -18
+KPX Amacron Ccaron -18
+KPX Amacron Ccedilla -18
+KPX Amacron G -18
+KPX Amacron Gbreve -18
+KPX Amacron Gcommaaccent -18
+KPX Amacron O -18
+KPX Amacron Oacute -18
+KPX Amacron Ocircumflex -18
+KPX Amacron Odieresis -18
+KPX Amacron Ograve -18
+KPX Amacron Ohungarumlaut -18
+KPX Amacron Omacron -18
+KPX Amacron Oslash -18
+KPX Amacron Otilde -18
+KPX Amacron Q -18
+KPX Amacron T -30
+KPX Amacron Tcaron -30
+KPX Amacron Tcommaaccent -30
+KPX Amacron U -37
+KPX Amacron Uacute -37
+KPX Amacron Ucircumflex -37
+KPX Amacron Udieresis -37
+KPX Amacron Ugrave -37
+KPX Amacron Uhungarumlaut -37
+KPX Amacron Umacron -37
+KPX Amacron Uogonek -37
+KPX Amacron Uring -37
+KPX Amacron V -74
+KPX Amacron W -74
+KPX Amacron Y -55
+KPX Amacron Yacute -55
+KPX Amacron Ydieresis -55
+KPX Amacron quotedblright -125
+KPX Amacron quoteright -125
+KPX Amacron u -18
+KPX Amacron uacute -18
+KPX Amacron ucircumflex -18
+KPX Amacron udieresis -18
+KPX Amacron ugrave -18
+KPX Amacron uhungarumlaut -18
+KPX Amacron umacron -18
+KPX Amacron uogonek -18
+KPX Amacron uring -18
+KPX Amacron v -18
+KPX Amacron w -18
+KPX Amacron y -55
+KPX Amacron yacute -55
+KPX Amacron ydieresis -55
+KPX Aogonek C -18
+KPX Aogonek Cacute -18
+KPX Aogonek Ccaron -18
+KPX Aogonek Ccedilla -18
+KPX Aogonek G -18
+KPX Aogonek Gbreve -18
+KPX Aogonek Gcommaaccent -18
+KPX Aogonek O -18
+KPX Aogonek Oacute -18
+KPX Aogonek Ocircumflex -18
+KPX Aogonek Odieresis -18
+KPX Aogonek Ograve -18
+KPX Aogonek Ohungarumlaut -18
+KPX Aogonek Omacron -18
+KPX Aogonek Oslash -18
+KPX Aogonek Otilde -18
+KPX Aogonek Q -18
+KPX Aogonek T -30
+KPX Aogonek Tcaron -30
+KPX Aogonek Tcommaaccent -30
+KPX Aogonek U -37
+KPX Aogonek Uacute -37
+KPX Aogonek Ucircumflex -37
+KPX Aogonek Udieresis -37
+KPX Aogonek Ugrave -37
+KPX Aogonek Uhungarumlaut -37
+KPX Aogonek Umacron -37
+KPX Aogonek Uogonek -37
+KPX Aogonek Uring -37
+KPX Aogonek V -74
+KPX Aogonek W -74
+KPX Aogonek Y -55
+KPX Aogonek Yacute -55
+KPX Aogonek Ydieresis -55
+KPX Aogonek quotedblright -125
+KPX Aogonek quoteright -125
+KPX Aogonek u -18
+KPX Aogonek uacute -18
+KPX Aogonek ucircumflex -18
+KPX Aogonek udieresis -18
+KPX Aogonek ugrave -18
+KPX Aogonek uhungarumlaut -18
+KPX Aogonek umacron -18
+KPX Aogonek uogonek -18
+KPX Aogonek uring -18
+KPX Aogonek v -18
+KPX Aogonek w -18
+KPX Aring C -18
+KPX Aring Cacute -18
+KPX Aring Ccaron -18
+KPX Aring Ccedilla -18
+KPX Aring G -18
+KPX Aring Gbreve -18
+KPX Aring Gcommaaccent -18
+KPX Aring O -18
+KPX Aring Oacute -18
+KPX Aring Ocircumflex -18
+KPX Aring Odieresis -18
+KPX Aring Ograve -18
+KPX Aring Ohungarumlaut -18
+KPX Aring Omacron -18
+KPX Aring Oslash -18
+KPX Aring Otilde -18
+KPX Aring Q -18
+KPX Aring T -30
+KPX Aring Tcaron -30
+KPX Aring Tcommaaccent -30
+KPX Aring U -37
+KPX Aring Uacute -37
+KPX Aring Ucircumflex -37
+KPX Aring Udieresis -37
+KPX Aring Ugrave -37
+KPX Aring Uhungarumlaut -37
+KPX Aring Umacron -37
+KPX Aring Uogonek -37
+KPX Aring Uring -37
+KPX Aring V -74
+KPX Aring W -74
+KPX Aring Y -55
+KPX Aring Yacute -55
+KPX Aring Ydieresis -55
+KPX Aring quotedblright -125
+KPX Aring quoteright -125
+KPX Aring u -18
+KPX Aring uacute -18
+KPX Aring ucircumflex -18
+KPX Aring udieresis -18
+KPX Aring ugrave -18
+KPX Aring uhungarumlaut -18
+KPX Aring umacron -18
+KPX Aring uogonek -18
+KPX Aring uring -18
+KPX Aring v -18
+KPX Aring w -18
+KPX Aring y -55
+KPX Aring yacute -55
+KPX Aring ydieresis -55
+KPX Atilde C -18
+KPX Atilde Cacute -18
+KPX Atilde Ccaron -18
+KPX Atilde Ccedilla -18
+KPX Atilde G -18
+KPX Atilde Gbreve -18
+KPX Atilde Gcommaaccent -18
+KPX Atilde O -18
+KPX Atilde Oacute -18
+KPX Atilde Ocircumflex -18
+KPX Atilde Odieresis -18
+KPX Atilde Ograve -18
+KPX Atilde Ohungarumlaut -18
+KPX Atilde Omacron -18
+KPX Atilde Oslash -18
+KPX Atilde Otilde -18
+KPX Atilde Q -18
+KPX Atilde T -30
+KPX Atilde Tcaron -30
+KPX Atilde Tcommaaccent -30
+KPX Atilde U -37
+KPX Atilde Uacute -37
+KPX Atilde Ucircumflex -37
+KPX Atilde Udieresis -37
+KPX Atilde Ugrave -37
+KPX Atilde Uhungarumlaut -37
+KPX Atilde Umacron -37
+KPX Atilde Uogonek -37
+KPX Atilde Uring -37
+KPX Atilde V -74
+KPX Atilde W -74
+KPX Atilde Y -55
+KPX Atilde Yacute -55
+KPX Atilde Ydieresis -55
+KPX Atilde quotedblright -125
+KPX Atilde quoteright -125
+KPX Atilde u -18
+KPX Atilde uacute -18
+KPX Atilde ucircumflex -18
+KPX Atilde udieresis -18
+KPX Atilde ugrave -18
+KPX Atilde uhungarumlaut -18
+KPX Atilde umacron -18
+KPX Atilde uogonek -18
+KPX Atilde uring -18
+KPX Atilde v -18
+KPX Atilde w -18
+KPX Atilde y -55
+KPX Atilde yacute -55
+KPX Atilde ydieresis -55
+KPX B comma -50
+KPX B period -50
+KPX C comma -50
+KPX C period -50
+KPX Cacute comma -50
+KPX Cacute period -50
+KPX Ccaron comma -50
+KPX Ccaron period -50
+KPX Ccedilla comma -50
+KPX Ccedilla period -50
+KPX D V -18
+KPX D W -18
+KPX D Y -18
+KPX D Yacute -18
+KPX D Ydieresis -18
+KPX D comma -50
+KPX D period -50
+KPX Dcaron V -18
+KPX Dcaron W -18
+KPX Dcaron Y -18
+KPX Dcaron Yacute -18
+KPX Dcaron Ydieresis -18
+KPX Dcaron comma -50
+KPX Dcaron period -50
+KPX Dcroat V -18
+KPX Dcroat W -18
+KPX Dcroat Y -18
+KPX Dcroat Yacute -18
+KPX Dcroat Ydieresis -18
+KPX Dcroat comma -50
+KPX Dcroat period -50
+KPX F A -35
+KPX F Aacute -35
+KPX F Abreve -35
+KPX F Acircumflex -35
+KPX F Adieresis -35
+KPX F Agrave -35
+KPX F Amacron -35
+KPX F Aogonek -35
+KPX F Aring -35
+KPX F Atilde -35
+KPX F a -55
+KPX F aacute -55
+KPX F abreve -55
+KPX F acircumflex -55
+KPX F adieresis -55
+KPX F agrave -55
+KPX F amacron -55
+KPX F aogonek -55
+KPX F aring -55
+KPX F atilde -55
+KPX F comma -125
+KPX F e -55
+KPX F eacute -55
+KPX F ecaron -55
+KPX F ecircumflex -55
+KPX F edieresis -55
+KPX F edotaccent -55
+KPX F egrave -55
+KPX F emacron -55
+KPX F eogonek -55
+KPX F i -10
+KPX F iacute -10
+KPX F icircumflex -10
+KPX F idieresis -10
+KPX F igrave -10
+KPX F imacron -10
+KPX F iogonek -10
+KPX F o -55
+KPX F oacute -55
+KPX F ocircumflex -55
+KPX F odieresis -55
+KPX F ograve -55
+KPX F ohungarumlaut -55
+KPX F omacron -55
+KPX F oslash -55
+KPX F otilde -55
+KPX F period -125
+KPX F r -55
+KPX F racute -55
+KPX F rcaron -55
+KPX F rcommaaccent -55
+KPX G comma -50
+KPX G period -50
+KPX Gbreve comma -50
+KPX Gbreve period -50
+KPX Gcommaaccent comma -50
+KPX Gcommaaccent period -50
+KPX J A -18
+KPX J Aacute -18
+KPX J Abreve -18
+KPX J Acircumflex -18
+KPX J Adieresis -18
+KPX J Agrave -18
+KPX J Amacron -18
+KPX J Aogonek -18
+KPX J Aring -18
+KPX J Atilde -18
+KPX J a -37
+KPX J aacute -37
+KPX J abreve -37
+KPX J acircumflex -37
+KPX J adieresis -37
+KPX J agrave -37
+KPX J amacron -37
+KPX J aogonek -37
+KPX J aring -37
+KPX J atilde -37
+KPX J comma -100
+KPX J e -37
+KPX J eacute -37
+KPX J ecaron -37
+KPX J ecircumflex -37
+KPX J edieresis -37
+KPX J edotaccent -37
+KPX J egrave -37
+KPX J emacron -37
+KPX J eogonek -37
+KPX J o -37
+KPX J oacute -37
+KPX J ocircumflex -37
+KPX J odieresis -37
+KPX J ograve -37
+KPX J ohungarumlaut -37
+KPX J omacron -37
+KPX J oslash -37
+KPX J otilde -37
+KPX J period -100
+KPX J u -18
+KPX J uacute -18
+KPX J ucircumflex -18
+KPX J udieresis -18
+KPX J ugrave -18
+KPX J uhungarumlaut -18
+KPX J umacron -18
+KPX J uogonek -18
+KPX J uring -18
+KPX L T -100
+KPX L Tcaron -100
+KPX L Tcommaaccent -100
+KPX L V -100
+KPX L W -100
+KPX L Y -100
+KPX L Yacute -100
+KPX L Ydieresis -100
+KPX L quotedblright -125
+KPX L quoteright -125
+KPX L y -50
+KPX L yacute -50
+KPX L ydieresis -50
+KPX Lacute T -100
+KPX Lacute Tcaron -100
+KPX Lacute Tcommaaccent -100
+KPX Lacute V -100
+KPX Lacute W -100
+KPX Lacute Y -100
+KPX Lacute Yacute -100
+KPX Lacute Ydieresis -100
+KPX Lacute quotedblright -125
+KPX Lacute quoteright -125
+KPX Lacute y -50
+KPX Lacute yacute -50
+KPX Lacute ydieresis -50
+KPX Lcommaaccent T -100
+KPX Lcommaaccent Tcaron -100
+KPX Lcommaaccent Tcommaaccent -100
+KPX Lcommaaccent V -100
+KPX Lcommaaccent W -100
+KPX Lcommaaccent Y -100
+KPX Lcommaaccent Yacute -100
+KPX Lcommaaccent Ydieresis -100
+KPX Lcommaaccent quotedblright -125
+KPX Lcommaaccent quoteright -125
+KPX Lcommaaccent y -50
+KPX Lcommaaccent yacute -50
+KPX Lcommaaccent ydieresis -50
+KPX Lslash T -100
+KPX Lslash Tcaron -100
+KPX Lslash Tcommaaccent -100
+KPX Lslash V -100
+KPX Lslash W -100
+KPX Lslash Y -100
+KPX Lslash Yacute -100
+KPX Lslash Ydieresis -100
+KPX Lslash quotedblright -125
+KPX Lslash quoteright -125
+KPX Lslash y -50
+KPX Lslash yacute -50
+KPX Lslash ydieresis -50
+KPX N comma -60
+KPX N period -60
+KPX Nacute comma -60
+KPX Nacute period -60
+KPX Ncaron comma -60
+KPX Ncaron period -60
+KPX Ncommaaccent comma -60
+KPX Ncommaaccent period -60
+KPX Ntilde comma -60
+KPX Ntilde period -60
+KPX O T 18
+KPX O Tcaron 18
+KPX O Tcommaaccent 18
+KPX O V -18
+KPX O X -18
+KPX O Y -18
+KPX O Yacute -18
+KPX O Ydieresis -18
+KPX O comma -50
+KPX O period -50
+KPX Oacute T 18
+KPX Oacute Tcaron 18
+KPX Oacute Tcommaaccent 18
+KPX Oacute V -18
+KPX Oacute X -18
+KPX Oacute Y -18
+KPX Oacute Yacute -18
+KPX Oacute Ydieresis -18
+KPX Oacute comma -50
+KPX Oacute period -50
+KPX Ocircumflex T 18
+KPX Ocircumflex Tcaron 18
+KPX Ocircumflex Tcommaaccent 18
+KPX Ocircumflex V -18
+KPX Ocircumflex X -18
+KPX Ocircumflex Y -18
+KPX Ocircumflex Yacute -18
+KPX Ocircumflex Ydieresis -18
+KPX Ocircumflex comma -50
+KPX Ocircumflex period -50
+KPX Odieresis T 18
+KPX Odieresis Tcaron 18
+KPX Odieresis Tcommaaccent 18
+KPX Odieresis V -18
+KPX Odieresis X -18
+KPX Odieresis Y -18
+KPX Odieresis Yacute -18
+KPX Odieresis Ydieresis -18
+KPX Odieresis comma -50
+KPX Odieresis period -50
+KPX Ograve T 18
+KPX Ograve Tcaron 18
+KPX Ograve Tcommaaccent 18
+KPX Ograve V -18
+KPX Ograve X -18
+KPX Ograve Y -18
+KPX Ograve Yacute -18
+KPX Ograve Ydieresis -18
+KPX Ograve comma -50
+KPX Ograve period -50
+KPX Ohungarumlaut T 18
+KPX Ohungarumlaut Tcaron 18
+KPX Ohungarumlaut Tcommaaccent 18
+KPX Ohungarumlaut V -18
+KPX Ohungarumlaut X -18
+KPX Ohungarumlaut Y -18
+KPX Ohungarumlaut Yacute -18
+KPX Ohungarumlaut Ydieresis -18
+KPX Ohungarumlaut comma -50
+KPX Ohungarumlaut period -50
+KPX Omacron T 18
+KPX Omacron Tcaron 18
+KPX Omacron Tcommaaccent 18
+KPX Omacron V -18
+KPX Omacron X -18
+KPX Omacron Y -18
+KPX Omacron Yacute -18
+KPX Omacron Ydieresis -18
+KPX Omacron comma -50
+KPX Omacron period -50
+KPX Oslash T 18
+KPX Oslash Tcaron 18
+KPX Oslash Tcommaaccent 18
+KPX Oslash V -18
+KPX Oslash X -18
+KPX Oslash Y -18
+KPX Oslash Yacute -18
+KPX Oslash Ydieresis -18
+KPX Oslash comma -50
+KPX Oslash period -50
+KPX Otilde T 18
+KPX Otilde Tcaron 18
+KPX Otilde Tcommaaccent 18
+KPX Otilde V -18
+KPX Otilde X -18
+KPX Otilde Y -18
+KPX Otilde Yacute -18
+KPX Otilde Ydieresis -18
+KPX Otilde comma -50
+KPX Otilde period -50
+KPX P A -50
+KPX P Aacute -50
+KPX P Abreve -50
+KPX P Acircumflex -50
+KPX P Adieresis -50
+KPX P Agrave -50
+KPX P Amacron -50
+KPX P Aogonek -50
+KPX P Aring -50
+KPX P Atilde -50
+KPX P a -55
+KPX P aacute -55
+KPX P abreve -55
+KPX P acircumflex -55
+KPX P adieresis -55
+KPX P agrave -55
+KPX P amacron -55
+KPX P aogonek -55
+KPX P aring -55
+KPX P atilde -55
+KPX P comma -125
+KPX P e -55
+KPX P eacute -55
+KPX P ecaron -55
+KPX P ecircumflex -55
+KPX P edieresis -55
+KPX P edotaccent -55
+KPX P egrave -55
+KPX P emacron -55
+KPX P eogonek -55
+KPX P o -55
+KPX P oacute -55
+KPX P ocircumflex -55
+KPX P odieresis -55
+KPX P ograve -55
+KPX P ohungarumlaut -55
+KPX P omacron -55
+KPX P oslash -55
+KPX P otilde -55
+KPX P period -125
+KPX Q comma -20
+KPX Q period -20
+KPX R U -18
+KPX R Uacute -18
+KPX R Ucircumflex -18
+KPX R Udieresis -18
+KPX R Ugrave -18
+KPX R Uhungarumlaut -18
+KPX R Umacron -18
+KPX R Uogonek -18
+KPX R Uring -18
+KPX R V -18
+KPX R W -18
+KPX R Y -18
+KPX R Yacute -18
+KPX R Ydieresis -18
+KPX Racute U -18
+KPX Racute Uacute -18
+KPX Racute Ucircumflex -18
+KPX Racute Udieresis -18
+KPX Racute Ugrave -18
+KPX Racute Uhungarumlaut -18
+KPX Racute Umacron -18
+KPX Racute Uogonek -18
+KPX Racute Uring -18
+KPX Racute V -18
+KPX Racute W -18
+KPX Racute Y -18
+KPX Racute Yacute -18
+KPX Racute Ydieresis -18
+KPX Rcaron U -18
+KPX Rcaron Uacute -18
+KPX Rcaron Ucircumflex -18
+KPX Rcaron Udieresis -18
+KPX Rcaron Ugrave -18
+KPX Rcaron Uhungarumlaut -18
+KPX Rcaron Umacron -18
+KPX Rcaron Uogonek -18
+KPX Rcaron Uring -18
+KPX Rcaron V -18
+KPX Rcaron W -18
+KPX Rcaron Y -18
+KPX Rcaron Yacute -18
+KPX Rcaron Ydieresis -18
+KPX Rcommaaccent U -18
+KPX Rcommaaccent Uacute -18
+KPX Rcommaaccent Ucircumflex -18
+KPX Rcommaaccent Udieresis -18
+KPX Rcommaaccent Ugrave -18
+KPX Rcommaaccent Uhungarumlaut -18
+KPX Rcommaaccent Umacron -18
+KPX Rcommaaccent Uogonek -18
+KPX Rcommaaccent Uring -18
+KPX Rcommaaccent V -18
+KPX Rcommaaccent W -18
+KPX Rcommaaccent Y -18
+KPX Rcommaaccent Yacute -18
+KPX Rcommaaccent Ydieresis -18
+KPX S comma -50
+KPX S period -50
+KPX Sacute comma -50
+KPX Sacute period -50
+KPX Scaron comma -50
+KPX Scaron period -50
+KPX Scedilla comma -50
+KPX Scedilla period -50
+KPX Scommaaccent comma -50
+KPX Scommaaccent period -50
+KPX T O 18
+KPX T Oacute 18
+KPX T Ocircumflex 18
+KPX T Odieresis 18
+KPX T Ograve 18
+KPX T Ohungarumlaut 18
+KPX T Omacron 18
+KPX T Oslash 18
+KPX T Otilde 18
+KPX T a -74
+KPX T aacute -74
+KPX T abreve -74
+KPX T acircumflex -74
+KPX T adieresis -74
+KPX T agrave -74
+KPX T amacron -74
+KPX T aogonek -74
+KPX T aring -74
+KPX T atilde -74
+KPX T colon -50
+KPX T comma -100
+KPX T e -74
+KPX T eacute -74
+KPX T ecaron -34
+KPX T ecircumflex -34
+KPX T edieresis -34
+KPX T edotaccent -74
+KPX T egrave -34
+KPX T emacron -34
+KPX T eogonek -74
+KPX T h -25
+KPX T hyphen -100
+KPX T i -18
+KPX T iacute -18
+KPX T icircumflex -18
+KPX T iogonek -18
+KPX T o -74
+KPX T oacute -74
+KPX T ocircumflex -74
+KPX T odieresis -34
+KPX T ograve -34
+KPX T ohungarumlaut -34
+KPX T omacron -34
+KPX T oslash -74
+KPX T otilde -34
+KPX T period -100
+KPX T r -50
+KPX T racute -50
+KPX T rcaron -50
+KPX T rcommaaccent -50
+KPX T semicolon -50
+KPX T u -50
+KPX T uacute -50
+KPX T ucircumflex -50
+KPX T udieresis -50
+KPX T ugrave -50
+KPX T uhungarumlaut -50
+KPX T umacron -50
+KPX T uogonek -50
+KPX T uring -50
+KPX T w -50
+KPX T y -50
+KPX T yacute -50
+KPX T ydieresis -50
+KPX Tcaron O 18
+KPX Tcaron Oacute 18
+KPX Tcaron Ocircumflex 18
+KPX Tcaron Odieresis 18
+KPX Tcaron Ograve 18
+KPX Tcaron Ohungarumlaut 18
+KPX Tcaron Omacron 18
+KPX Tcaron Oslash 18
+KPX Tcaron Otilde 18
+KPX Tcaron a -74
+KPX Tcaron aacute -74
+KPX Tcaron abreve -74
+KPX Tcaron acircumflex -74
+KPX Tcaron adieresis -74
+KPX Tcaron agrave -74
+KPX Tcaron amacron -74
+KPX Tcaron aogonek -74
+KPX Tcaron aring -74
+KPX Tcaron atilde -74
+KPX Tcaron colon -50
+KPX Tcaron comma -100
+KPX Tcaron e -74
+KPX Tcaron eacute -74
+KPX Tcaron ecaron -34
+KPX Tcaron ecircumflex -34
+KPX Tcaron edieresis -34
+KPX Tcaron edotaccent -74
+KPX Tcaron egrave -34
+KPX Tcaron emacron -34
+KPX Tcaron eogonek -74
+KPX Tcaron h -25
+KPX Tcaron hyphen -100
+KPX Tcaron i -18
+KPX Tcaron iacute -18
+KPX Tcaron icircumflex -18
+KPX Tcaron iogonek -18
+KPX Tcaron o -74
+KPX Tcaron oacute -74
+KPX Tcaron ocircumflex -74
+KPX Tcaron odieresis -34
+KPX Tcaron ograve -34
+KPX Tcaron ohungarumlaut -34
+KPX Tcaron omacron -34
+KPX Tcaron oslash -74
+KPX Tcaron otilde -34
+KPX Tcaron period -100
+KPX Tcaron r -50
+KPX Tcaron racute -50
+KPX Tcaron rcaron -50
+KPX Tcaron rcommaaccent -50
+KPX Tcaron semicolon -50
+KPX Tcaron u -50
+KPX Tcaron uacute -50
+KPX Tcaron ucircumflex -50
+KPX Tcaron udieresis -50
+KPX Tcaron ugrave -50
+KPX Tcaron uhungarumlaut -50
+KPX Tcaron umacron -50
+KPX Tcaron uogonek -50
+KPX Tcaron uring -50
+KPX Tcaron w -50
+KPX Tcaron y -50
+KPX Tcaron yacute -50
+KPX Tcaron ydieresis -50
+KPX Tcommaaccent O 18
+KPX Tcommaaccent Oacute 18
+KPX Tcommaaccent Ocircumflex 18
+KPX Tcommaaccent Odieresis 18
+KPX Tcommaaccent Ograve 18
+KPX Tcommaaccent Ohungarumlaut 18
+KPX Tcommaaccent Omacron 18
+KPX Tcommaaccent Oslash 18
+KPX Tcommaaccent Otilde 18
+KPX Tcommaaccent a -74
+KPX Tcommaaccent aacute -74
+KPX Tcommaaccent abreve -74
+KPX Tcommaaccent acircumflex -74
+KPX Tcommaaccent adieresis -74
+KPX Tcommaaccent agrave -74
+KPX Tcommaaccent amacron -74
+KPX Tcommaaccent aogonek -74
+KPX Tcommaaccent aring -74
+KPX Tcommaaccent atilde -74
+KPX Tcommaaccent colon -50
+KPX Tcommaaccent comma -100
+KPX Tcommaaccent e -74
+KPX Tcommaaccent eacute -74
+KPX Tcommaaccent ecaron -34
+KPX Tcommaaccent ecircumflex -34
+KPX Tcommaaccent edieresis -34
+KPX Tcommaaccent edotaccent -74
+KPX Tcommaaccent egrave -34
+KPX Tcommaaccent emacron -34
+KPX Tcommaaccent eogonek -74
+KPX Tcommaaccent h -25
+KPX Tcommaaccent hyphen -100
+KPX Tcommaaccent i -18
+KPX Tcommaaccent iacute -18
+KPX Tcommaaccent icircumflex -18
+KPX Tcommaaccent iogonek -18
+KPX Tcommaaccent o -74
+KPX Tcommaaccent oacute -74
+KPX Tcommaaccent ocircumflex -74
+KPX Tcommaaccent odieresis -34
+KPX Tcommaaccent ograve -34
+KPX Tcommaaccent ohungarumlaut -34
+KPX Tcommaaccent omacron -34
+KPX Tcommaaccent oslash -74
+KPX Tcommaaccent otilde -34
+KPX Tcommaaccent period -100
+KPX Tcommaaccent r -50
+KPX Tcommaaccent racute -50
+KPX Tcommaaccent rcaron -50
+KPX Tcommaaccent rcommaaccent -50
+KPX Tcommaaccent semicolon -50
+KPX Tcommaaccent u -50
+KPX Tcommaaccent uacute -50
+KPX Tcommaaccent ucircumflex -50
+KPX Tcommaaccent udieresis -50
+KPX Tcommaaccent ugrave -50
+KPX Tcommaaccent uhungarumlaut -50
+KPX Tcommaaccent umacron -50
+KPX Tcommaaccent uogonek -50
+KPX Tcommaaccent uring -50
+KPX Tcommaaccent w -50
+KPX Tcommaaccent y -50
+KPX Tcommaaccent yacute -50
+KPX Tcommaaccent ydieresis -50
+KPX U A -18
+KPX U Aacute -18
+KPX U Abreve -18
+KPX U Acircumflex -18
+KPX U Adieresis -18
+KPX U Agrave -18
+KPX U Amacron -18
+KPX U Aogonek -18
+KPX U Aring -18
+KPX U Atilde -18
+KPX U comma -100
+KPX U period -100
+KPX Uacute A -18
+KPX Uacute Aacute -18
+KPX Uacute Abreve -18
+KPX Uacute Acircumflex -18
+KPX Uacute Adieresis -18
+KPX Uacute Agrave -18
+KPX Uacute Amacron -18
+KPX Uacute Aogonek -18
+KPX Uacute Aring -18
+KPX Uacute Atilde -18
+KPX Uacute comma -100
+KPX Uacute period -100
+KPX Ucircumflex A -18
+KPX Ucircumflex Aacute -18
+KPX Ucircumflex Abreve -18
+KPX Ucircumflex Acircumflex -18
+KPX Ucircumflex Adieresis -18
+KPX Ucircumflex Agrave -18
+KPX Ucircumflex Amacron -18
+KPX Ucircumflex Aogonek -18
+KPX Ucircumflex Aring -18
+KPX Ucircumflex Atilde -18
+KPX Ucircumflex comma -100
+KPX Ucircumflex period -100
+KPX Udieresis A -18
+KPX Udieresis Aacute -18
+KPX Udieresis Abreve -18
+KPX Udieresis Acircumflex -18
+KPX Udieresis Adieresis -18
+KPX Udieresis Agrave -18
+KPX Udieresis Amacron -18
+KPX Udieresis Aogonek -18
+KPX Udieresis Aring -18
+KPX Udieresis Atilde -18
+KPX Udieresis comma -100
+KPX Udieresis period -100
+KPX Ugrave A -18
+KPX Ugrave Aacute -18
+KPX Ugrave Abreve -18
+KPX Ugrave Acircumflex -18
+KPX Ugrave Adieresis -18
+KPX Ugrave Agrave -18
+KPX Ugrave Amacron -18
+KPX Ugrave Aogonek -18
+KPX Ugrave Aring -18
+KPX Ugrave Atilde -18
+KPX Ugrave comma -100
+KPX Ugrave period -100
+KPX Uhungarumlaut A -18
+KPX Uhungarumlaut Aacute -18
+KPX Uhungarumlaut Abreve -18
+KPX Uhungarumlaut Acircumflex -18
+KPX Uhungarumlaut Adieresis -18
+KPX Uhungarumlaut Agrave -18
+KPX Uhungarumlaut Amacron -18
+KPX Uhungarumlaut Aogonek -18
+KPX Uhungarumlaut Aring -18
+KPX Uhungarumlaut Atilde -18
+KPX Uhungarumlaut comma -100
+KPX Uhungarumlaut period -100
+KPX Umacron A -18
+KPX Umacron Aacute -18
+KPX Umacron Abreve -18
+KPX Umacron Acircumflex -18
+KPX Umacron Adieresis -18
+KPX Umacron Agrave -18
+KPX Umacron Amacron -18
+KPX Umacron Aogonek -18
+KPX Umacron Aring -18
+KPX Umacron Atilde -18
+KPX Umacron comma -100
+KPX Umacron period -100
+KPX Uogonek A -18
+KPX Uogonek Aacute -18
+KPX Uogonek Abreve -18
+KPX Uogonek Acircumflex -18
+KPX Uogonek Adieresis -18
+KPX Uogonek Agrave -18
+KPX Uogonek Amacron -18
+KPX Uogonek Aogonek -18
+KPX Uogonek Aring -18
+KPX Uogonek Atilde -18
+KPX Uogonek comma -100
+KPX Uogonek period -100
+KPX Uring A -18
+KPX Uring Aacute -18
+KPX Uring Abreve -18
+KPX Uring Acircumflex -18
+KPX Uring Adieresis -18
+KPX Uring Agrave -18
+KPX Uring Amacron -18
+KPX Uring Aogonek -18
+KPX Uring Aring -18
+KPX Uring Atilde -18
+KPX Uring comma -100
+KPX Uring period -100
+KPX V A -37
+KPX V Aacute -37
+KPX V Abreve -37
+KPX V Acircumflex -37
+KPX V Adieresis -37
+KPX V Agrave -37
+KPX V Amacron -37
+KPX V Aogonek -37
+KPX V Aring -37
+KPX V Atilde -37
+KPX V a -75
+KPX V aacute -75
+KPX V abreve -75
+KPX V acircumflex -75
+KPX V adieresis -75
+KPX V agrave -75
+KPX V amacron -75
+KPX V aogonek -75
+KPX V aring -75
+KPX V atilde -75
+KPX V colon -75
+KPX V comma -100
+KPX V e -75
+KPX V eacute -75
+KPX V ecaron -35
+KPX V ecircumflex -35
+KPX V edieresis -35
+KPX V edotaccent -35
+KPX V egrave -35
+KPX V emacron -35
+KPX V eogonek -75
+KPX V hyphen -100
+KPX V i -50
+KPX V iacute -50
+KPX V icircumflex -10
+KPX V idieresis -10
+KPX V igrave -10
+KPX V imacron -10
+KPX V iogonek -50
+KPX V o -75
+KPX V oacute -75
+KPX V ocircumflex -75
+KPX V odieresis -35
+KPX V ograve -35
+KPX V ohungarumlaut -75
+KPX V omacron -35
+KPX V oslash -75
+KPX V otilde -35
+KPX V period -100
+KPX V semicolon -75
+KPX V u -75
+KPX V uacute -75
+KPX V ucircumflex -75
+KPX V udieresis -75
+KPX V ugrave -75
+KPX V uhungarumlaut -75
+KPX V umacron -75
+KPX V uogonek -75
+KPX V uring -75
+KPX W A -55
+KPX W Aacute -55
+KPX W Abreve -55
+KPX W Acircumflex -55
+KPX W Adieresis -55
+KPX W Agrave -55
+KPX W Amacron -55
+KPX W Aogonek -55
+KPX W Aring -55
+KPX W Atilde -55
+KPX W a -55
+KPX W aacute -55
+KPX W abreve -55
+KPX W acircumflex -55
+KPX W adieresis -55
+KPX W agrave -55
+KPX W amacron -55
+KPX W aogonek -55
+KPX W aring -55
+KPX W atilde -55
+KPX W colon -75
+KPX W comma -100
+KPX W e -55
+KPX W eacute -55
+KPX W ecaron -55
+KPX W ecircumflex -55
+KPX W edieresis -35
+KPX W edotaccent -55
+KPX W egrave -35
+KPX W emacron -55
+KPX W eogonek -55
+KPX W h -20
+KPX W hyphen -75
+KPX W i -20
+KPX W iacute -20
+KPX W icircumflex -20
+KPX W iogonek -20
+KPX W o -55
+KPX W oacute -55
+KPX W ocircumflex -55
+KPX W odieresis -55
+KPX W ograve -55
+KPX W ohungarumlaut -55
+KPX W omacron -55
+KPX W oslash -55
+KPX W otilde -55
+KPX W period -100
+KPX W semicolon -75
+KPX W u -55
+KPX W uacute -55
+KPX W ucircumflex -55
+KPX W udieresis -55
+KPX W ugrave -55
+KPX W uhungarumlaut -55
+KPX W umacron -55
+KPX W uogonek -55
+KPX W uring -55
+KPX W y -55
+KPX W yacute -55
+KPX W ydieresis -55
+KPX Y A -55
+KPX Y Aacute -55
+KPX Y Abreve -55
+KPX Y Acircumflex -55
+KPX Y Adieresis -55
+KPX Y Agrave -55
+KPX Y Amacron -55
+KPX Y Aogonek -55
+KPX Y Aring -55
+KPX Y Atilde -55
+KPX Y a -100
+KPX Y aacute -100
+KPX Y abreve -60
+KPX Y acircumflex -100
+KPX Y adieresis -60
+KPX Y agrave -60
+KPX Y amacron -100
+KPX Y aogonek -100
+KPX Y aring -100
+KPX Y atilde -100
+KPX Y colon -75
+KPX Y comma -100
+KPX Y e -100
+KPX Y eacute -100
+KPX Y ecaron -60
+KPX Y ecircumflex -60
+KPX Y edieresis -60
+KPX Y edotaccent -100
+KPX Y egrave -60
+KPX Y emacron -60
+KPX Y eogonek -100
+KPX Y hyphen -100
+KPX Y i -25
+KPX Y iacute -25
+KPX Y iogonek -25
+KPX Y o -100
+KPX Y oacute -100
+KPX Y ocircumflex -100
+KPX Y odieresis -60
+KPX Y ograve -60
+KPX Y ohungarumlaut -100
+KPX Y omacron -60
+KPX Y oslash -100
+KPX Y otilde -60
+KPX Y period -100
+KPX Y semicolon -75
+KPX Y u -100
+KPX Y uacute -100
+KPX Y ucircumflex -100
+KPX Y udieresis -100
+KPX Y ugrave -100
+KPX Y uhungarumlaut -100
+KPX Y umacron -100
+KPX Y uogonek -100
+KPX Y uring -100
+KPX Yacute A -55
+KPX Yacute Aacute -55
+KPX Yacute Abreve -55
+KPX Yacute Acircumflex -55
+KPX Yacute Adieresis -55
+KPX Yacute Agrave -55
+KPX Yacute Amacron -55
+KPX Yacute Aogonek -55
+KPX Yacute Aring -55
+KPX Yacute Atilde -55
+KPX Yacute a -100
+KPX Yacute aacute -100
+KPX Yacute abreve -60
+KPX Yacute acircumflex -100
+KPX Yacute adieresis -60
+KPX Yacute agrave -60
+KPX Yacute amacron -60
+KPX Yacute aogonek -100
+KPX Yacute aring -100
+KPX Yacute atilde -100
+KPX Yacute colon -75
+KPX Yacute comma -100
+KPX Yacute e -100
+KPX Yacute eacute -100
+KPX Yacute ecaron -60
+KPX Yacute ecircumflex -60
+KPX Yacute edieresis -60
+KPX Yacute edotaccent -100
+KPX Yacute egrave -60
+KPX Yacute emacron -60
+KPX Yacute eogonek -100
+KPX Yacute hyphen -100
+KPX Yacute i -25
+KPX Yacute iacute -25
+KPX Yacute iogonek -25
+KPX Yacute o -100
+KPX Yacute oacute -100
+KPX Yacute ocircumflex -60
+KPX Yacute odieresis -60
+KPX Yacute ograve -60
+KPX Yacute ohungarumlaut -100
+KPX Yacute omacron -60
+KPX Yacute oslash -100
+KPX Yacute otilde -60
+KPX Yacute period -100
+KPX Yacute semicolon -75
+KPX Yacute u -100
+KPX Yacute uacute -100
+KPX Yacute ucircumflex -100
+KPX Yacute udieresis -100
+KPX Yacute ugrave -100
+KPX Yacute uhungarumlaut -100
+KPX Yacute umacron -100
+KPX Yacute uogonek -100
+KPX Yacute uring -100
+KPX Ydieresis A -55
+KPX Ydieresis Aacute -55
+KPX Ydieresis Abreve -55
+KPX Ydieresis Acircumflex -55
+KPX Ydieresis Adieresis -55
+KPX Ydieresis Agrave -55
+KPX Ydieresis Amacron -55
+KPX Ydieresis Aogonek -55
+KPX Ydieresis Aring -55
+KPX Ydieresis Atilde -55
+KPX Ydieresis a -100
+KPX Ydieresis aacute -100
+KPX Ydieresis abreve -60
+KPX Ydieresis acircumflex -100
+KPX Ydieresis adieresis -60
+KPX Ydieresis agrave -60
+KPX Ydieresis amacron -100
+KPX Ydieresis aogonek -100
+KPX Ydieresis aring -100
+KPX Ydieresis atilde -100
+KPX Ydieresis colon -75
+KPX Ydieresis comma -100
+KPX Ydieresis e -100
+KPX Ydieresis eacute -100
+KPX Ydieresis ecaron -60
+KPX Ydieresis ecircumflex -60
+KPX Ydieresis edieresis -60
+KPX Ydieresis edotaccent -100
+KPX Ydieresis egrave -60
+KPX Ydieresis emacron -60
+KPX Ydieresis eogonek -100
+KPX Ydieresis hyphen -100
+KPX Ydieresis i -25
+KPX Ydieresis iacute -25
+KPX Ydieresis iogonek -25
+KPX Ydieresis o -100
+KPX Ydieresis oacute -100
+KPX Ydieresis ocircumflex -100
+KPX Ydieresis odieresis -60
+KPX Ydieresis ograve -60
+KPX Ydieresis ohungarumlaut -100
+KPX Ydieresis omacron -60
+KPX Ydieresis oslash -100
+KPX Ydieresis otilde -60
+KPX Ydieresis period -100
+KPX Ydieresis semicolon -75
+KPX Ydieresis u -100
+KPX Ydieresis uacute -100
+KPX Ydieresis ucircumflex -100
+KPX Ydieresis udieresis -100
+KPX Ydieresis ugrave -100
+KPX Ydieresis uhungarumlaut -100
+KPX Ydieresis umacron -100
+KPX Ydieresis uogonek -100
+KPX Ydieresis uring -100
+KPX b b -10
+KPX b comma -50
+KPX b period -50
+KPX c comma -50
+KPX c h -18
+KPX c k -18
+KPX c kcommaaccent -18
+KPX c period -50
+KPX cacute comma -50
+KPX cacute h -18
+KPX cacute k -18
+KPX cacute kcommaaccent -18
+KPX cacute period -50
+KPX ccaron comma -50
+KPX ccaron h -18
+KPX ccaron k -18
+KPX ccaron kcommaaccent -18
+KPX ccaron period -50
+KPX ccedilla comma -50
+KPX ccedilla h -18
+KPX ccedilla k -18
+KPX ccedilla kcommaaccent -18
+KPX ccedilla period -50
+KPX colon space -37
+KPX comma quotedblright -37
+KPX comma quoteright -37
+KPX comma space -37
+KPX e comma -37
+KPX e period -37
+KPX eacute comma -37
+KPX eacute period -37
+KPX ecaron comma -37
+KPX ecaron period -37
+KPX ecircumflex comma -37
+KPX ecircumflex period -37
+KPX edieresis comma -37
+KPX edieresis period -37
+KPX edotaccent comma -37
+KPX edotaccent period -37
+KPX egrave comma -37
+KPX egrave period -37
+KPX emacron comma -37
+KPX emacron period -37
+KPX eogonek comma -37
+KPX eogonek period -37
+KPX f comma -75
+KPX f o -10
+KPX f oacute -10
+KPX f ocircumflex -10
+KPX f odieresis -10
+KPX f ograve -10
+KPX f ohungarumlaut -10
+KPX f omacron -10
+KPX f oslash -10
+KPX f otilde -10
+KPX f period -75
+KPX f quotedblright 75
+KPX f quoteright 75
+KPX g comma -50
+KPX g period -50
+KPX gbreve comma -50
+KPX gbreve period -50
+KPX gcommaaccent comma -50
+KPX gcommaaccent period -50
+KPX l y -10
+KPX l yacute -10
+KPX l ydieresis -10
+KPX lacute y -10
+KPX lacute yacute -10
+KPX lacute ydieresis -10
+KPX lcommaaccent y -10
+KPX lcommaaccent yacute -10
+KPX lcommaaccent ydieresis -10
+KPX lslash y -10
+KPX lslash yacute -10
+KPX lslash ydieresis -10
+KPX o comma -50
+KPX o period -50
+KPX oacute comma -50
+KPX oacute period -50
+KPX ocircumflex comma -50
+KPX ocircumflex period -50
+KPX odieresis comma -50
+KPX odieresis period -50
+KPX ograve comma -50
+KPX ograve period -50
+KPX ohungarumlaut comma -50
+KPX ohungarumlaut period -50
+KPX omacron comma -50
+KPX omacron period -50
+KPX oslash comma -50
+KPX oslash period -50
+KPX otilde comma -50
+KPX otilde period -50
+KPX p comma -50
+KPX p period -50
+KPX period quotedblright -37
+KPX period quoteright -37
+KPX period space -37
+KPX quotedblleft A -75
+KPX quotedblleft Aacute -75
+KPX quotedblleft Abreve -75
+KPX quotedblleft Acircumflex -75
+KPX quotedblleft Adieresis -75
+KPX quotedblleft Agrave -75
+KPX quotedblleft Amacron -75
+KPX quotedblleft Aogonek -75
+KPX quotedblleft Aring -75
+KPX quotedblleft Atilde -75
+KPX quotedblright space -37
+KPX quoteleft A -75
+KPX quoteleft Aacute -75
+KPX quoteleft Abreve -75
+KPX quoteleft Acircumflex -75
+KPX quoteleft Adieresis -75
+KPX quoteleft Agrave -75
+KPX quoteleft Amacron -75
+KPX quoteleft Aogonek -75
+KPX quoteleft Aring -75
+KPX quoteleft Atilde -75
+KPX quoteleft quoteleft -37
+KPX quoteright d -37
+KPX quoteright dcroat -37
+KPX quoteright quoteright -37
+KPX quoteright s -25
+KPX quoteright sacute -25
+KPX quoteright scaron -25
+KPX quoteright scedilla -25
+KPX quoteright scommaaccent -25
+KPX r colon -25
+KPX r comma -125
+KPX r hyphen -75
+KPX r k -18
+KPX r kcommaaccent -18
+KPX r period -125
+KPX r s -10
+KPX r sacute -10
+KPX r scaron -10
+KPX r scedilla -10
+KPX r scommaaccent -10
+KPX r semicolon -25
+KPX racute colon -25
+KPX racute comma -125
+KPX racute hyphen -75
+KPX racute k -18
+KPX racute kcommaaccent -18
+KPX racute period -125
+KPX racute s -10
+KPX racute sacute -10
+KPX racute scaron -10
+KPX racute scedilla -10
+KPX racute scommaaccent -10
+KPX racute semicolon -25
+KPX rcaron colon -25
+KPX rcaron comma -125
+KPX rcaron hyphen -75
+KPX rcaron k -18
+KPX rcaron kcommaaccent -18
+KPX rcaron period -125
+KPX rcaron s -10
+KPX rcaron sacute -10
+KPX rcaron scaron -10
+KPX rcaron scedilla -10
+KPX rcaron scommaaccent -10
+KPX rcaron semicolon -25
+KPX rcommaaccent colon -25
+KPX rcommaaccent comma -125
+KPX rcommaaccent hyphen -75
+KPX rcommaaccent k -18
+KPX rcommaaccent kcommaaccent -18
+KPX rcommaaccent period -125
+KPX rcommaaccent s -10
+KPX rcommaaccent sacute -10
+KPX rcommaaccent scaron -10
+KPX rcommaaccent scedilla -10
+KPX rcommaaccent scommaaccent -10
+KPX rcommaaccent semicolon -25
+KPX s comma -50
+KPX s period -50
+KPX sacute comma -50
+KPX sacute period -50
+KPX scaron comma -50
+KPX scaron period -50
+KPX scedilla comma -50
+KPX scedilla period -50
+KPX scommaaccent comma -50
+KPX scommaaccent period -50
+KPX semicolon space -37
+KPX space A -37
+KPX space Aacute -37
+KPX space Abreve -37
+KPX space Acircumflex -37
+KPX space Adieresis -37
+KPX space Agrave -37
+KPX space Amacron -37
+KPX space Aogonek -37
+KPX space Aring -37
+KPX space Atilde -37
+KPX space T -37
+KPX space Tcaron -37
+KPX space Tcommaaccent -37
+KPX space V -37
+KPX space W -37
+KPX space Y -37
+KPX space Yacute -37
+KPX space Ydieresis -37
+KPX space quotedblleft -37
+KPX space quoteleft -37
+KPX v comma -75
+KPX v period -75
+KPX w comma -75
+KPX w period -75
+KPX y comma -75
+KPX y period -75
+KPX yacute comma -75
+KPX yacute period -75
+KPX ydieresis comma -75
+KPX ydieresis period -75
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/src/fonts/Adobe-Core35_AFMs-314/NewCenturySchlbk-Roman.afm b/src/fonts/Adobe-Core35_AFMs-314/NewCenturySchlbk-Roman.afm
new file mode 100644
index 0000000..60895ea
--- /dev/null
+++ b/src/fonts/Adobe-Core35_AFMs-314/NewCenturySchlbk-Roman.afm
@@ -0,0 +1,1824 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1985, 1987, 1989, 1991, 1992, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Mon Jun 23 16:42:59 1997
+Comment UniqueID 43091
+Comment VMusage 42481 53506
+FontName NewCenturySchlbk-Roman
+FullName New Century Schoolbook Roman
+FamilyName New Century Schoolbook
+Weight Medium
+ItalicAngle 0
+IsFixedPitch false
+FontBBox -195 -250 1000 965
+UnderlinePosition -100
+UnderlineThickness 50
+Version 002.000
+Notice Copyright (c) 1985, 1987, 1989, 1991, 1992, 1997 Adobe Systems Incorporated. All Rights Reserved.
+EncodingScheme AdobeStandardEncoding
+CapHeight 722
+XHeight 464
+Ascender 737
+Descender -205
+StdHW 45
+StdVW 92
+StartCharMetrics 314
+C 32 ; WX 278 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 296 ; N exclam ; B 86 -15 210 737 ;
+C 34 ; WX 389 ; N quotedbl ; B 61 443 328 737 ;
+C 35 ; WX 556 ; N numbersign ; B 28 0 528 690 ;
+C 36 ; WX 556 ; N dollar ; B 45 -138 511 813 ;
+C 37 ; WX 833 ; N percent ; B 43 -15 790 705 ;
+C 38 ; WX 815 ; N ampersand ; B 51 -15 775 737 ;
+C 39 ; WX 204 ; N quoteright ; B 25 443 179 737 ;
+C 40 ; WX 333 ; N parenleft ; B 40 -117 279 745 ;
+C 41 ; WX 333 ; N parenright ; B 54 -117 293 745 ;
+C 42 ; WX 500 ; N asterisk ; B 57 306 443 737 ;
+C 43 ; WX 606 ; N plus ; B 50 0 556 506 ;
+C 44 ; WX 278 ; N comma ; B 62 -185 216 109 ;
+C 45 ; WX 333 ; N hyphen ; B 42 199 291 277 ;
+C 46 ; WX 278 ; N period ; B 77 -15 201 109 ;
+C 47 ; WX 278 ; N slash ; B -32 -15 310 737 ;
+C 48 ; WX 556 ; N zero ; B 42 -15 514 705 ;
+C 49 ; WX 556 ; N one ; B 100 0 496 705 ;
+C 50 ; WX 556 ; N two ; B 35 0 505 705 ;
+C 51 ; WX 556 ; N three ; B 42 -15 498 705 ;
+C 52 ; WX 556 ; N four ; B 28 0 528 705 ;
+C 53 ; WX 556 ; N five ; B 46 -15 502 705 ;
+C 54 ; WX 556 ; N six ; B 41 -15 515 705 ;
+C 55 ; WX 556 ; N seven ; B 59 -15 508 705 ;
+C 56 ; WX 556 ; N eight ; B 42 -15 514 705 ;
+C 57 ; WX 556 ; N nine ; B 41 -15 515 705 ;
+C 58 ; WX 278 ; N colon ; B 77 -15 201 474 ;
+C 59 ; WX 278 ; N semicolon ; B 62 -185 216 474 ;
+C 60 ; WX 606 ; N less ; B 50 -8 556 514 ;
+C 61 ; WX 606 ; N equal ; B 50 117 556 389 ;
+C 62 ; WX 606 ; N greater ; B 50 -8 556 514 ;
+C 63 ; WX 444 ; N question ; B 29 -15 415 737 ;
+C 64 ; WX 737 ; N at ; B -8 -15 744 737 ;
+C 65 ; WX 722 ; N A ; B -8 0 730 737 ;
+C 66 ; WX 722 ; N B ; B 29 0 669 722 ;
+C 67 ; WX 722 ; N C ; B 45 -15 668 737 ;
+C 68 ; WX 778 ; N D ; B 29 0 733 722 ;
+C 69 ; WX 722 ; N E ; B 29 0 663 722 ;
+C 70 ; WX 667 ; N F ; B 29 0 638 722 ;
+C 71 ; WX 778 ; N G ; B 45 -15 775 737 ;
+C 72 ; WX 833 ; N H ; B 29 0 804 722 ;
+C 73 ; WX 407 ; N I ; B 38 0 369 722 ;
+C 74 ; WX 556 ; N J ; B 5 -15 540 722 ;
+C 75 ; WX 778 ; N K ; B 29 0 803 722 ;
+C 76 ; WX 667 ; N L ; B 29 0 644 722 ;
+C 77 ; WX 944 ; N M ; B 29 0 915 722 ;
+C 78 ; WX 815 ; N N ; B 24 -15 791 722 ;
+C 79 ; WX 778 ; N O ; B 45 -15 733 737 ;
+C 80 ; WX 667 ; N P ; B 29 0 650 722 ;
+C 81 ; WX 778 ; N Q ; B 45 -190 748 737 ;
+C 82 ; WX 722 ; N R ; B 29 -15 713 722 ;
+C 83 ; WX 630 ; N S ; B 47 -15 583 737 ;
+C 84 ; WX 667 ; N T ; B 19 0 648 722 ;
+C 85 ; WX 815 ; N U ; B 16 -15 799 722 ;
+C 86 ; WX 722 ; N V ; B -8 -10 730 722 ;
+C 87 ; WX 981 ; N W ; B 5 -10 976 722 ;
+C 88 ; WX 704 ; N X ; B -8 0 712 722 ;
+C 89 ; WX 704 ; N Y ; B -11 0 715 722 ;
+C 90 ; WX 611 ; N Z ; B 24 0 576 722 ;
+C 91 ; WX 333 ; N bracketleft ; B 126 -109 315 737 ;
+C 92 ; WX 606 ; N backslash ; B 132 -15 474 737 ;
+C 93 ; WX 333 ; N bracketright ; B 18 -109 207 737 ;
+C 94 ; WX 606 ; N asciicircum ; B 89 325 517 690 ;
+C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;
+C 96 ; WX 204 ; N quoteleft ; B 25 443 179 737 ;
+C 97 ; WX 556 ; N a ; B 44 -15 542 479 ;
+C 98 ; WX 556 ; N b ; B 10 -15 522 737 ;
+C 99 ; WX 444 ; N c ; B 34 -15 426 479 ;
+C 100 ; WX 574 ; N d ; B 34 -15 552 737 ;
+C 101 ; WX 500 ; N e ; B 34 -15 466 479 ;
+C 102 ; WX 333 ; N f ; B 18 0 437 737 ; L i fi ; L l fl ;
+C 103 ; WX 537 ; N g ; B 23 -205 542 494 ;
+C 104 ; WX 611 ; N h ; B 7 0 592 737 ;
+C 105 ; WX 315 ; N i ; B 18 0 286 722 ;
+C 106 ; WX 296 ; N j ; B -86 -205 216 722 ;
+C 107 ; WX 593 ; N k ; B 10 0 589 737 ;
+C 108 ; WX 315 ; N l ; B 18 0 286 737 ;
+C 109 ; WX 889 ; N m ; B 26 0 863 479 ;
+C 110 ; WX 611 ; N n ; B 22 0 589 479 ;
+C 111 ; WX 500 ; N o ; B 34 -15 466 479 ;
+C 112 ; WX 574 ; N p ; B 22 -205 540 479 ;
+C 113 ; WX 556 ; N q ; B 34 -205 552 479 ;
+C 114 ; WX 444 ; N r ; B 18 0 434 479 ;
+C 115 ; WX 463 ; N s ; B 46 -15 417 479 ;
+C 116 ; WX 389 ; N t ; B 18 -15 371 666 ;
+C 117 ; WX 611 ; N u ; B 22 -15 589 464 ;
+C 118 ; WX 537 ; N v ; B -6 -10 515 464 ;
+C 119 ; WX 778 ; N w ; B 1 -10 749 464 ;
+C 120 ; WX 537 ; N x ; B 8 0 529 464 ;
+C 121 ; WX 537 ; N y ; B 4 -205 533 464 ;
+C 122 ; WX 481 ; N z ; B 42 0 439 464 ;
+C 123 ; WX 333 ; N braceleft ; B 54 -109 279 737 ;
+C 124 ; WX 606 ; N bar ; B 267 -250 339 750 ;
+C 125 ; WX 333 ; N braceright ; B 54 -109 279 737 ;
+C 126 ; WX 606 ; N asciitilde ; B 72 184 534 322 ;
+C 161 ; WX 296 ; N exclamdown ; B 86 -205 210 547 ;
+C 162 ; WX 556 ; N cent ; B 74 -141 482 584 ;
+C 163 ; WX 556 ; N sterling ; B 18 -15 538 705 ;
+C 164 ; WX 167 ; N fraction ; B -195 -15 362 705 ;
+C 165 ; WX 556 ; N yen ; B -1 0 557 690 ;
+C 166 ; WX 556 ; N florin ; B 0 -205 538 737 ;
+C 167 ; WX 500 ; N section ; B 55 -147 445 737 ;
+C 168 ; WX 556 ; N currency ; B 26 93 530 597 ;
+C 169 ; WX 204 ; N quotesingle ; B 59 443 145 737 ;
+C 170 ; WX 389 ; N quotedblleft ; B 25 443 364 737 ;
+C 171 ; WX 426 ; N guillemotleft ; B 39 78 387 398 ;
+C 172 ; WX 259 ; N guilsinglleft ; B 39 78 220 398 ;
+C 173 ; WX 259 ; N guilsinglright ; B 39 78 220 398 ;
+C 174 ; WX 611 ; N fi ; B 18 0 582 737 ;
+C 175 ; WX 611 ; N fl ; B 18 0 582 737 ;
+C 177 ; WX 556 ; N endash ; B 0 208 556 268 ;
+C 178 ; WX 500 ; N dagger ; B 42 -147 458 737 ;
+C 179 ; WX 500 ; N daggerdbl ; B 42 -149 458 737 ;
+C 180 ; WX 278 ; N periodcentered ; B 71 238 207 374 ;
+C 182 ; WX 606 ; N paragraph ; B 60 -132 546 722 ;
+C 183 ; WX 606 ; N bullet ; B 122 180 484 542 ;
+C 184 ; WX 204 ; N quotesinglbase ; B 25 -185 179 109 ;
+C 185 ; WX 389 ; N quotedblbase ; B 25 -185 364 109 ;
+C 186 ; WX 389 ; N quotedblright ; B 25 443 364 737 ;
+C 187 ; WX 426 ; N guillemotright ; B 39 78 387 398 ;
+C 188 ; WX 1000 ; N ellipsis ; B 105 -15 895 109 ;
+C 189 ; WX 1000 ; N perthousand ; B 6 -15 994 705 ;
+C 191 ; WX 444 ; N questiondown ; B 29 -205 415 547 ;
+C 193 ; WX 333 ; N grave ; B 17 528 242 699 ;
+C 194 ; WX 333 ; N acute ; B 91 528 316 699 ;
+C 195 ; WX 333 ; N circumflex ; B 10 528 323 695 ;
+C 196 ; WX 333 ; N tilde ; B 1 553 332 655 ;
+C 197 ; WX 333 ; N macron ; B 10 568 323 623 ;
+C 198 ; WX 333 ; N breve ; B 25 528 308 685 ;
+C 199 ; WX 333 ; N dotaccent ; B 116 602 218 704 ;
+C 200 ; WX 333 ; N dieresis ; B 16 602 317 704 ;
+C 202 ; WX 333 ; N ring ; B 66 522 266 722 ;
+C 203 ; WX 333 ; N cedilla ; B 29 -215 237 0 ;
+C 205 ; WX 333 ; N hungarumlaut ; B -9 528 416 699 ;
+C 206 ; WX 333 ; N ogonek ; B 81 -220 317 4 ;
+C 207 ; WX 333 ; N caron ; B 10 528 323 695 ;
+C 208 ; WX 1000 ; N emdash ; B 0 208 1000 268 ;
+C 225 ; WX 1000 ; N AE ; B 0 0 962 722 ;
+C 227 ; WX 334 ; N ordfeminine ; B -4 407 338 705 ;
+C 232 ; WX 667 ; N Lslash ; B 29 0 644 722 ;
+C 233 ; WX 778 ; N Oslash ; B 45 -56 733 778 ;
+C 234 ; WX 1000 ; N OE ; B 21 0 979 722 ;
+C 235 ; WX 300 ; N ordmasculine ; B 4 407 296 705 ;
+C 241 ; WX 796 ; N ae ; B 34 -15 762 479 ;
+C 245 ; WX 315 ; N dotlessi ; B 18 0 286 464 ;
+C 248 ; WX 315 ; N lslash ; B 18 0 294 737 ;
+C 249 ; WX 500 ; N oslash ; B 34 -97 466 561 ;
+C 250 ; WX 833 ; N oe ; B 34 -15 799 479 ;
+C 251 ; WX 574 ; N germandbls ; B 30 -15 537 737 ;
+C -1 ; WX 407 ; N Idieresis ; B 38 0 369 883 ;
+C -1 ; WX 500 ; N eacute ; B 34 -15 466 699 ;
+C -1 ; WX 556 ; N abreve ; B 44 -15 542 685 ;
+C -1 ; WX 611 ; N uhungarumlaut ; B 22 -15 595 699 ;
+C -1 ; WX 500 ; N ecaron ; B 34 -15 466 695 ;
+C -1 ; WX 704 ; N Ydieresis ; B -11 0 715 883 ;
+C -1 ; WX 606 ; N divide ; B 50 -22 556 528 ;
+C -1 ; WX 704 ; N Yacute ; B -11 0 715 937 ;
+C -1 ; WX 722 ; N Acircumflex ; B -8 0 730 933 ;
+C -1 ; WX 556 ; N aacute ; B 44 -15 542 699 ;
+C -1 ; WX 815 ; N Ucircumflex ; B 16 -15 799 933 ;
+C -1 ; WX 537 ; N yacute ; B 4 -205 533 699 ;
+C -1 ; WX 463 ; N scommaaccent ; B 46 -250 417 479 ;
+C -1 ; WX 500 ; N ecircumflex ; B 34 -15 466 695 ;
+C -1 ; WX 815 ; N Uring ; B 16 -15 799 965 ;
+C -1 ; WX 815 ; N Udieresis ; B 16 -15 799 883 ;
+C -1 ; WX 556 ; N aogonek ; B 44 -220 565 479 ;
+C -1 ; WX 815 ; N Uacute ; B 16 -15 799 937 ;
+C -1 ; WX 611 ; N uogonek ; B 22 -220 589 464 ;
+C -1 ; WX 722 ; N Edieresis ; B 29 0 663 883 ;
+C -1 ; WX 778 ; N Dcroat ; B 29 0 733 722 ;
+C -1 ; WX 250 ; N commaaccent ; B 66 -250 204 -50 ;
+C -1 ; WX 737 ; N copyright ; B -8 -15 744 737 ;
+C -1 ; WX 722 ; N Emacron ; B 29 0 663 861 ;
+C -1 ; WX 444 ; N ccaron ; B 34 -15 426 695 ;
+C -1 ; WX 556 ; N aring ; B 44 -15 542 732 ;
+C -1 ; WX 815 ; N Ncommaaccent ; B 24 -250 791 722 ;
+C -1 ; WX 315 ; N lacute ; B 18 0 297 957 ;
+C -1 ; WX 556 ; N agrave ; B 44 -15 542 699 ;
+C -1 ; WX 667 ; N Tcommaaccent ; B 19 -250 648 722 ;
+C -1 ; WX 722 ; N Cacute ; B 45 -15 668 937 ;
+C -1 ; WX 556 ; N atilde ; B 44 -15 542 655 ;
+C -1 ; WX 722 ; N Edotaccent ; B 29 0 663 883 ;
+C -1 ; WX 463 ; N scaron ; B 46 -15 417 695 ;
+C -1 ; WX 463 ; N scedilla ; B 46 -215 417 479 ;
+C -1 ; WX 315 ; N iacute ; B 18 0 307 699 ;
+C -1 ; WX 471 ; N lozenge ; B 10 0 462 728 ;
+C -1 ; WX 722 ; N Rcaron ; B 29 -15 713 933 ;
+C -1 ; WX 778 ; N Gcommaaccent ; B 45 -250 775 737 ;
+C -1 ; WX 611 ; N ucircumflex ; B 22 -15 589 695 ;
+C -1 ; WX 556 ; N acircumflex ; B 44 -15 542 695 ;
+C -1 ; WX 722 ; N Amacron ; B -8 0 730 861 ;
+C -1 ; WX 444 ; N rcaron ; B 18 0 434 695 ;
+C -1 ; WX 444 ; N ccedilla ; B 34 -215 426 479 ;
+C -1 ; WX 611 ; N Zdotaccent ; B 24 0 576 883 ;
+C -1 ; WX 667 ; N Thorn ; B 29 0 650 722 ;
+C -1 ; WX 778 ; N Omacron ; B 45 -15 733 861 ;
+C -1 ; WX 722 ; N Racute ; B 29 -15 713 937 ;
+C -1 ; WX 630 ; N Sacute ; B 47 -15 583 937 ;
+C -1 ; WX 639 ; N dcaron ; B 34 -15 643 737 ;
+C -1 ; WX 815 ; N Umacron ; B 16 -15 799 861 ;
+C -1 ; WX 611 ; N uring ; B 22 -15 589 722 ;
+C -1 ; WX 333 ; N threesuperior ; B 18 273 315 705 ;
+C -1 ; WX 778 ; N Ograve ; B 45 -15 733 937 ;
+C -1 ; WX 722 ; N Agrave ; B -8 0 730 937 ;
+C -1 ; WX 722 ; N Abreve ; B -8 0 730 923 ;
+C -1 ; WX 606 ; N multiply ; B 74 24 532 482 ;
+C -1 ; WX 611 ; N uacute ; B 22 -15 589 699 ;
+C -1 ; WX 667 ; N Tcaron ; B 19 0 648 933 ;
+C -1 ; WX 476 ; N partialdiff ; B 13 -38 463 714 ;
+C -1 ; WX 537 ; N ydieresis ; B 4 -205 533 645 ;
+C -1 ; WX 815 ; N Nacute ; B 24 -15 791 937 ;
+C -1 ; WX 315 ; N icircumflex ; B 1 0 314 695 ;
+C -1 ; WX 722 ; N Ecircumflex ; B 29 0 663 933 ;
+C -1 ; WX 556 ; N adieresis ; B 44 -15 542 645 ;
+C -1 ; WX 500 ; N edieresis ; B 34 -15 466 645 ;
+C -1 ; WX 444 ; N cacute ; B 34 -15 426 699 ;
+C -1 ; WX 611 ; N nacute ; B 22 0 589 699 ;
+C -1 ; WX 611 ; N umacron ; B 22 -15 589 623 ;
+C -1 ; WX 815 ; N Ncaron ; B 24 -15 791 933 ;
+C -1 ; WX 407 ; N Iacute ; B 38 0 369 937 ;
+C -1 ; WX 606 ; N plusminus ; B 50 0 556 506 ;
+C -1 ; WX 606 ; N brokenbar ; B 267 -175 339 675 ;
+C -1 ; WX 737 ; N registered ; B -8 -15 744 737 ;
+C -1 ; WX 778 ; N Gbreve ; B 45 -15 775 923 ;
+C -1 ; WX 407 ; N Idotaccent ; B 38 0 369 883 ;
+C -1 ; WX 600 ; N summation ; B 15 -10 586 706 ;
+C -1 ; WX 722 ; N Egrave ; B 29 0 663 937 ;
+C -1 ; WX 444 ; N racute ; B 18 0 434 699 ;
+C -1 ; WX 500 ; N omacron ; B 34 -15 466 623 ;
+C -1 ; WX 611 ; N Zacute ; B 24 0 576 937 ;
+C -1 ; WX 611 ; N Zcaron ; B 24 0 576 933 ;
+C -1 ; WX 549 ; N greaterequal ; B 26 0 523 674 ;
+C -1 ; WX 778 ; N Eth ; B 29 0 733 722 ;
+C -1 ; WX 722 ; N Ccedilla ; B 45 -215 668 737 ;
+C -1 ; WX 315 ; N lcommaaccent ; B 18 -250 286 737 ;
+C -1 ; WX 389 ; N tcaron ; B 18 -15 394 777 ;
+C -1 ; WX 500 ; N eogonek ; B 34 -220 466 479 ;
+C -1 ; WX 815 ; N Uogonek ; B 16 -220 799 722 ;
+C -1 ; WX 722 ; N Aacute ; B -8 0 730 937 ;
+C -1 ; WX 722 ; N Adieresis ; B -8 0 730 883 ;
+C -1 ; WX 500 ; N egrave ; B 34 -15 466 699 ;
+C -1 ; WX 481 ; N zacute ; B 42 0 439 699 ;
+C -1 ; WX 315 ; N iogonek ; B 18 -220 296 722 ;
+C -1 ; WX 778 ; N Oacute ; B 45 -15 733 937 ;
+C -1 ; WX 500 ; N oacute ; B 34 -15 466 699 ;
+C -1 ; WX 556 ; N amacron ; B 44 -15 542 623 ;
+C -1 ; WX 463 ; N sacute ; B 46 -15 417 699 ;
+C -1 ; WX 315 ; N idieresis ; B 7 0 308 645 ;
+C -1 ; WX 778 ; N Ocircumflex ; B 45 -15 733 933 ;
+C -1 ; WX 815 ; N Ugrave ; B 16 -15 799 937 ;
+C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ;
+C -1 ; WX 574 ; N thorn ; B 22 -205 540 737 ;
+C -1 ; WX 333 ; N twosuperior ; B 14 282 319 705 ;
+C -1 ; WX 778 ; N Odieresis ; B 45 -15 733 883 ;
+C -1 ; WX 611 ; N mu ; B 22 -205 589 464 ;
+C -1 ; WX 315 ; N igrave ; B 8 0 286 699 ;
+C -1 ; WX 500 ; N ohungarumlaut ; B 34 -15 540 699 ;
+C -1 ; WX 722 ; N Eogonek ; B 29 -220 663 722 ;
+C -1 ; WX 574 ; N dcroat ; B 34 -15 552 737 ;
+C -1 ; WX 834 ; N threequarters ; B 28 -15 795 705 ;
+C -1 ; WX 630 ; N Scedilla ; B 47 -215 583 737 ;
+C -1 ; WX 365 ; N lcaron ; B 18 0 377 737 ;
+C -1 ; WX 778 ; N Kcommaaccent ; B 29 -250 803 722 ;
+C -1 ; WX 667 ; N Lacute ; B 29 0 644 937 ;
+C -1 ; WX 1000 ; N trademark ; B 32 318 968 722 ;
+C -1 ; WX 500 ; N edotaccent ; B 34 -15 466 645 ;
+C -1 ; WX 407 ; N Igrave ; B 38 0 369 937 ;
+C -1 ; WX 407 ; N Imacron ; B 38 0 369 861 ;
+C -1 ; WX 667 ; N Lcaron ; B 29 0 644 737 ;
+C -1 ; WX 834 ; N onehalf ; B 39 -15 820 705 ;
+C -1 ; WX 549 ; N lessequal ; B 26 0 523 674 ;
+C -1 ; WX 500 ; N ocircumflex ; B 34 -15 466 695 ;
+C -1 ; WX 611 ; N ntilde ; B 22 0 589 655 ;
+C -1 ; WX 815 ; N Uhungarumlaut ; B 16 -15 799 937 ;
+C -1 ; WX 722 ; N Eacute ; B 29 0 663 937 ;
+C -1 ; WX 500 ; N emacron ; B 34 -15 466 623 ;
+C -1 ; WX 537 ; N gbreve ; B 23 -205 542 685 ;
+C -1 ; WX 834 ; N onequarter ; B 39 -15 795 705 ;
+C -1 ; WX 630 ; N Scaron ; B 47 -15 583 933 ;
+C -1 ; WX 630 ; N Scommaaccent ; B 47 -250 583 737 ;
+C -1 ; WX 778 ; N Ohungarumlaut ; B 45 -15 733 937 ;
+C -1 ; WX 400 ; N degree ; B 57 419 343 705 ;
+C -1 ; WX 500 ; N ograve ; B 34 -15 466 699 ;
+C -1 ; WX 722 ; N Ccaron ; B 45 -15 668 933 ;
+C -1 ; WX 611 ; N ugrave ; B 22 -15 589 699 ;
+C -1 ; WX 453 ; N radical ; B -4 -80 458 762 ;
+C -1 ; WX 778 ; N Dcaron ; B 29 0 733 933 ;
+C -1 ; WX 444 ; N rcommaaccent ; B 18 -250 434 479 ;
+C -1 ; WX 815 ; N Ntilde ; B 24 -15 791 893 ;
+C -1 ; WX 500 ; N otilde ; B 34 -15 466 655 ;
+C -1 ; WX 722 ; N Rcommaaccent ; B 29 -250 713 722 ;
+C -1 ; WX 667 ; N Lcommaaccent ; B 29 -250 644 722 ;
+C -1 ; WX 722 ; N Atilde ; B -8 0 730 893 ;
+C -1 ; WX 722 ; N Aogonek ; B -8 -220 730 737 ;
+C -1 ; WX 722 ; N Aring ; B -8 0 730 965 ;
+C -1 ; WX 778 ; N Otilde ; B 45 -15 733 893 ;
+C -1 ; WX 481 ; N zdotaccent ; B 42 0 439 645 ;
+C -1 ; WX 722 ; N Ecaron ; B 29 0 663 933 ;
+C -1 ; WX 407 ; N Iogonek ; B 38 -220 369 722 ;
+C -1 ; WX 593 ; N kcommaaccent ; B 10 -250 589 737 ;
+C -1 ; WX 606 ; N minus ; B 50 217 556 289 ;
+C -1 ; WX 407 ; N Icircumflex ; B 38 0 369 933 ;
+C -1 ; WX 611 ; N ncaron ; B 22 0 589 695 ;
+C -1 ; WX 389 ; N tcommaaccent ; B 18 -250 371 666 ;
+C -1 ; WX 606 ; N logicalnot ; B 50 108 556 389 ;
+C -1 ; WX 500 ; N odieresis ; B 34 -15 466 645 ;
+C -1 ; WX 611 ; N udieresis ; B 22 -15 589 645 ;
+C -1 ; WX 549 ; N notequal ; B 12 -35 537 551 ;
+C -1 ; WX 537 ; N gcommaaccent ; B 23 -205 542 807 ;
+C -1 ; WX 500 ; N eth ; B 34 -15 466 737 ;
+C -1 ; WX 481 ; N zcaron ; B 42 0 439 695 ;
+C -1 ; WX 611 ; N ncommaaccent ; B 22 -250 589 479 ;
+C -1 ; WX 333 ; N onesuperior ; B 39 282 294 705 ;
+C -1 ; WX 315 ; N imacron ; B 18 0 291 623 ;
+EndCharMetrics
+StartKernData
+StartKernPairs 1480
+KPX A T -18
+KPX A Tcaron -18
+KPX A Tcommaaccent -18
+KPX A U -30
+KPX A Uacute -30
+KPX A Ucircumflex -30
+KPX A Udieresis -30
+KPX A Ugrave -30
+KPX A Uhungarumlaut -30
+KPX A Umacron -30
+KPX A Uogonek -30
+KPX A Uring -30
+KPX A V -75
+KPX A W -50
+KPX A Y -75
+KPX A Yacute -75
+KPX A Ydieresis -75
+KPX A quotedblright -74
+KPX A quoteright -74
+KPX A v -37
+KPX A w -25
+KPX A y -37
+KPX A yacute -37
+KPX A ydieresis -37
+KPX Aacute T -18
+KPX Aacute Tcaron -18
+KPX Aacute Tcommaaccent -18
+KPX Aacute U -30
+KPX Aacute Uacute -30
+KPX Aacute Ucircumflex -30
+KPX Aacute Udieresis -30
+KPX Aacute Ugrave -30
+KPX Aacute Uhungarumlaut -30
+KPX Aacute Umacron -30
+KPX Aacute Uogonek -30
+KPX Aacute Uring -30
+KPX Aacute V -75
+KPX Aacute W -50
+KPX Aacute Y -75
+KPX Aacute Yacute -75
+KPX Aacute Ydieresis -75
+KPX Aacute quotedblright -74
+KPX Aacute quoteright -74
+KPX Aacute v -37
+KPX Aacute w -25
+KPX Aacute y -37
+KPX Aacute yacute -37
+KPX Aacute ydieresis -37
+KPX Abreve T -18
+KPX Abreve Tcaron -18
+KPX Abreve Tcommaaccent -18
+KPX Abreve U -30
+KPX Abreve Uacute -30
+KPX Abreve Ucircumflex -30
+KPX Abreve Udieresis -30
+KPX Abreve Ugrave -30
+KPX Abreve Uhungarumlaut -30
+KPX Abreve Umacron -30
+KPX Abreve Uogonek -30
+KPX Abreve Uring -30
+KPX Abreve V -75
+KPX Abreve W -50
+KPX Abreve Y -75
+KPX Abreve Yacute -75
+KPX Abreve Ydieresis -75
+KPX Abreve quotedblright -74
+KPX Abreve quoteright -74
+KPX Abreve v -37
+KPX Abreve w -25
+KPX Abreve y -37
+KPX Abreve yacute -37
+KPX Abreve ydieresis -37
+KPX Acircumflex T -18
+KPX Acircumflex Tcaron -18
+KPX Acircumflex Tcommaaccent -18
+KPX Acircumflex U -30
+KPX Acircumflex Uacute -30
+KPX Acircumflex Ucircumflex -30
+KPX Acircumflex Udieresis -30
+KPX Acircumflex Ugrave -30
+KPX Acircumflex Uhungarumlaut -30
+KPX Acircumflex Umacron -30
+KPX Acircumflex Uogonek -30
+KPX Acircumflex Uring -30
+KPX Acircumflex V -75
+KPX Acircumflex W -50
+KPX Acircumflex Y -75
+KPX Acircumflex Yacute -75
+KPX Acircumflex Ydieresis -75
+KPX Acircumflex quotedblright -74
+KPX Acircumflex quoteright -74
+KPX Acircumflex v -37
+KPX Acircumflex w -25
+KPX Acircumflex y -37
+KPX Acircumflex yacute -37
+KPX Acircumflex ydieresis -37
+KPX Adieresis T -18
+KPX Adieresis Tcaron -18
+KPX Adieresis Tcommaaccent -18
+KPX Adieresis U -30
+KPX Adieresis Uacute -30
+KPX Adieresis Ucircumflex -30
+KPX Adieresis Udieresis -30
+KPX Adieresis Ugrave -30
+KPX Adieresis Uhungarumlaut -30
+KPX Adieresis Umacron -30
+KPX Adieresis Uogonek -30
+KPX Adieresis Uring -30
+KPX Adieresis V -75
+KPX Adieresis W -50
+KPX Adieresis Y -75
+KPX Adieresis Yacute -75
+KPX Adieresis Ydieresis -75
+KPX Adieresis quotedblright -74
+KPX Adieresis quoteright -74
+KPX Adieresis v -37
+KPX Adieresis w -25
+KPX Adieresis y -37
+KPX Adieresis yacute -37
+KPX Adieresis ydieresis -37
+KPX Agrave T -18
+KPX Agrave Tcaron -18
+KPX Agrave Tcommaaccent -18
+KPX Agrave U -30
+KPX Agrave Uacute -30
+KPX Agrave Ucircumflex -30
+KPX Agrave Udieresis -30
+KPX Agrave Ugrave -30
+KPX Agrave Uhungarumlaut -30
+KPX Agrave Umacron -30
+KPX Agrave Uogonek -30
+KPX Agrave Uring -30
+KPX Agrave V -75
+KPX Agrave W -50
+KPX Agrave Y -75
+KPX Agrave Yacute -75
+KPX Agrave Ydieresis -75
+KPX Agrave quotedblright -74
+KPX Agrave quoteright -74
+KPX Agrave v -37
+KPX Agrave w -25
+KPX Agrave y -37
+KPX Agrave yacute -37
+KPX Agrave ydieresis -37
+KPX Amacron T -18
+KPX Amacron Tcaron -18
+KPX Amacron Tcommaaccent -18
+KPX Amacron U -30
+KPX Amacron Uacute -30
+KPX Amacron Ucircumflex -30
+KPX Amacron Udieresis -30
+KPX Amacron Ugrave -30
+KPX Amacron Uhungarumlaut -30
+KPX Amacron Umacron -30
+KPX Amacron Uogonek -30
+KPX Amacron Uring -30
+KPX Amacron V -75
+KPX Amacron W -50
+KPX Amacron Y -75
+KPX Amacron Yacute -75
+KPX Amacron Ydieresis -75
+KPX Amacron quotedblright -74
+KPX Amacron quoteright -74
+KPX Amacron v -37
+KPX Amacron w -25
+KPX Amacron y -37
+KPX Amacron yacute -37
+KPX Amacron ydieresis -37
+KPX Aogonek T -18
+KPX Aogonek Tcaron -18
+KPX Aogonek Tcommaaccent -18
+KPX Aogonek U -30
+KPX Aogonek Uacute -30
+KPX Aogonek Ucircumflex -30
+KPX Aogonek Udieresis -30
+KPX Aogonek Ugrave -30
+KPX Aogonek Uhungarumlaut -30
+KPX Aogonek Umacron -30
+KPX Aogonek Uogonek -30
+KPX Aogonek Uring -30
+KPX Aogonek V -75
+KPX Aogonek W -50
+KPX Aogonek Y -75
+KPX Aogonek Yacute -75
+KPX Aogonek Ydieresis -75
+KPX Aogonek quotedblright -74
+KPX Aogonek quoteright -74
+KPX Aogonek v -37
+KPX Aogonek w -25
+KPX Aogonek y -17
+KPX Aogonek yacute -17
+KPX Aogonek ydieresis -17
+KPX Aring T -18
+KPX Aring Tcaron -18
+KPX Aring Tcommaaccent -18
+KPX Aring U -30
+KPX Aring Uacute -30
+KPX Aring Ucircumflex -30
+KPX Aring Udieresis -30
+KPX Aring Ugrave -30
+KPX Aring Uhungarumlaut -30
+KPX Aring Umacron -30
+KPX Aring Uogonek -30
+KPX Aring Uring -30
+KPX Aring V -75
+KPX Aring W -50
+KPX Aring Y -75
+KPX Aring Yacute -75
+KPX Aring Ydieresis -75
+KPX Aring quotedblright -74
+KPX Aring quoteright -74
+KPX Aring v -37
+KPX Aring w -25
+KPX Aring y -37
+KPX Aring yacute -37
+KPX Aring ydieresis -37
+KPX Atilde T -18
+KPX Atilde Tcaron -18
+KPX Atilde Tcommaaccent -18
+KPX Atilde U -30
+KPX Atilde Uacute -30
+KPX Atilde Ucircumflex -30
+KPX Atilde Udieresis -30
+KPX Atilde Ugrave -30
+KPX Atilde Uhungarumlaut -30
+KPX Atilde Umacron -30
+KPX Atilde Uogonek -30
+KPX Atilde Uring -30
+KPX Atilde V -75
+KPX Atilde W -50
+KPX Atilde Y -75
+KPX Atilde Yacute -75
+KPX Atilde Ydieresis -75
+KPX Atilde quotedblright -74
+KPX Atilde quoteright -74
+KPX Atilde v -37
+KPX Atilde w -25
+KPX Atilde y -37
+KPX Atilde yacute -37
+KPX Atilde ydieresis -37
+KPX B A -18
+KPX B Aacute -18
+KPX B Abreve -18
+KPX B Acircumflex -18
+KPX B Adieresis -18
+KPX B Agrave -18
+KPX B Amacron -18
+KPX B Aogonek -18
+KPX B Aring -18
+KPX B Atilde -18
+KPX B comma -37
+KPX B period -37
+KPX C A -18
+KPX C Aacute -18
+KPX C Abreve -18
+KPX C Acircumflex -18
+KPX C Adieresis -18
+KPX C Agrave -18
+KPX C Amacron -18
+KPX C Aogonek -18
+KPX C Aring -18
+KPX C Atilde -18
+KPX C comma -37
+KPX C period -37
+KPX Cacute A -18
+KPX Cacute Aacute -18
+KPX Cacute Abreve -18
+KPX Cacute Acircumflex -18
+KPX Cacute Adieresis -18
+KPX Cacute Agrave -18
+KPX Cacute Amacron -18
+KPX Cacute Aogonek -18
+KPX Cacute Aring -18
+KPX Cacute Atilde -18
+KPX Cacute comma -37
+KPX Cacute period -37
+KPX Ccaron A -18
+KPX Ccaron Aacute -18
+KPX Ccaron Abreve -18
+KPX Ccaron Acircumflex -18
+KPX Ccaron Adieresis -18
+KPX Ccaron Agrave -18
+KPX Ccaron Amacron -18
+KPX Ccaron Aogonek -18
+KPX Ccaron Aring -18
+KPX Ccaron Atilde -18
+KPX Ccaron comma -37
+KPX Ccaron period -37
+KPX Ccedilla A -18
+KPX Ccedilla Aacute -18
+KPX Ccedilla Abreve -18
+KPX Ccedilla Acircumflex -18
+KPX Ccedilla Adieresis -18
+KPX Ccedilla Agrave -18
+KPX Ccedilla Amacron -18
+KPX Ccedilla Aogonek -18
+KPX Ccedilla Aring -18
+KPX Ccedilla Atilde -18
+KPX Ccedilla comma -37
+KPX Ccedilla period -37
+KPX D V -18
+KPX D Y -18
+KPX D Yacute -18
+KPX D Ydieresis -18
+KPX D comma -37
+KPX D period -37
+KPX Dcaron V -18
+KPX Dcaron Y -18
+KPX Dcaron Yacute -18
+KPX Dcaron Ydieresis -18
+KPX Dcaron comma -37
+KPX Dcaron period -37
+KPX Dcroat V -18
+KPX Dcroat Y -18
+KPX Dcroat Yacute -18
+KPX Dcroat Ydieresis -18
+KPX Dcroat comma -37
+KPX Dcroat period -37
+KPX F A -50
+KPX F Aacute -50
+KPX F Abreve -50
+KPX F Acircumflex -50
+KPX F Adieresis -50
+KPX F Agrave -50
+KPX F Amacron -50
+KPX F Aogonek -50
+KPX F Aring -50
+KPX F Atilde -50
+KPX F a -65
+KPX F aacute -65
+KPX F abreve -65
+KPX F acircumflex -65
+KPX F adieresis -65
+KPX F agrave -65
+KPX F amacron -65
+KPX F aogonek -65
+KPX F aring -65
+KPX F atilde -65
+KPX F comma -125
+KPX F e -55
+KPX F eacute -55
+KPX F ecaron -55
+KPX F ecircumflex -55
+KPX F edieresis -55
+KPX F edotaccent -55
+KPX F egrave -55
+KPX F emacron -55
+KPX F eogonek -55
+KPX F i -10
+KPX F iacute -10
+KPX F icircumflex -10
+KPX F idieresis -10
+KPX F igrave -10
+KPX F imacron -10
+KPX F iogonek -10
+KPX F o -55
+KPX F oacute -55
+KPX F ocircumflex -55
+KPX F odieresis -55
+KPX F ograve -55
+KPX F ohungarumlaut -55
+KPX F omacron -55
+KPX F oslash -55
+KPX F otilde -55
+KPX F period -125
+KPX F r -10
+KPX F racute -10
+KPX F rcaron -10
+KPX F rcommaaccent -10
+KPX G comma -37
+KPX G period -37
+KPX Gbreve comma -37
+KPX Gbreve period -37
+KPX Gcommaaccent comma -37
+KPX Gcommaaccent period -37
+KPX J A -18
+KPX J Aacute -18
+KPX J Abreve -18
+KPX J Acircumflex -18
+KPX J Adieresis -18
+KPX J Agrave -18
+KPX J Amacron -18
+KPX J Aogonek -18
+KPX J Aring -18
+KPX J Atilde -18
+KPX J a -25
+KPX J aacute -25
+KPX J abreve -25
+KPX J acircumflex -25
+KPX J adieresis -25
+KPX J agrave -25
+KPX J amacron -25
+KPX J aogonek -25
+KPX J aring -25
+KPX J atilde -25
+KPX J comma -74
+KPX J e -25
+KPX J eacute -25
+KPX J ecaron -25
+KPX J ecircumflex -25
+KPX J edieresis -25
+KPX J edotaccent -25
+KPX J egrave -25
+KPX J emacron -25
+KPX J eogonek -25
+KPX J o -25
+KPX J oacute -25
+KPX J ocircumflex -25
+KPX J odieresis -25
+KPX J ograve -25
+KPX J ohungarumlaut -25
+KPX J omacron -25
+KPX J oslash -25
+KPX J otilde -25
+KPX J period -74
+KPX J u -25
+KPX J uacute -25
+KPX J ucircumflex -25
+KPX J udieresis -25
+KPX J ugrave -25
+KPX J uhungarumlaut -25
+KPX J umacron -25
+KPX J uogonek -25
+KPX J uring -25
+KPX K e 10
+KPX K eacute 10
+KPX K ecaron 10
+KPX K ecircumflex 10
+KPX K edieresis 10
+KPX K edotaccent 10
+KPX K egrave 10
+KPX K emacron 10
+KPX K eogonek 10
+KPX K o 10
+KPX K oacute 10
+KPX K ocircumflex 10
+KPX K odieresis 10
+KPX K ograve 10
+KPX K ohungarumlaut 10
+KPX K omacron 10
+KPX K oslash 10
+KPX K otilde 10
+KPX K y -25
+KPX K yacute -25
+KPX K ydieresis -25
+KPX Kcommaaccent e 10
+KPX Kcommaaccent eacute 10
+KPX Kcommaaccent ecaron 10
+KPX Kcommaaccent ecircumflex 10
+KPX Kcommaaccent edieresis 10
+KPX Kcommaaccent edotaccent 10
+KPX Kcommaaccent egrave 10
+KPX Kcommaaccent emacron 10
+KPX Kcommaaccent eogonek 10
+KPX Kcommaaccent o 10
+KPX Kcommaaccent oacute 10
+KPX Kcommaaccent ocircumflex 10
+KPX Kcommaaccent odieresis 10
+KPX Kcommaaccent ograve 10
+KPX Kcommaaccent ohungarumlaut 10
+KPX Kcommaaccent omacron 10
+KPX Kcommaaccent oslash 10
+KPX Kcommaaccent otilde 10
+KPX Kcommaaccent y -25
+KPX Kcommaaccent yacute -25
+KPX Kcommaaccent ydieresis -25
+KPX L T -75
+KPX L Tcaron -75
+KPX L Tcommaaccent -75
+KPX L V -91
+KPX L W -74
+KPX L Y -74
+KPX L Yacute -74
+KPX L Ydieresis -74
+KPX L quotedblright -100
+KPX L quoteright -100
+KPX L y -25
+KPX L yacute -25
+KPX L ydieresis -25
+KPX Lacute T -75
+KPX Lacute Tcaron -75
+KPX Lacute Tcommaaccent -75
+KPX Lacute V -91
+KPX Lacute W -74
+KPX Lacute Y -74
+KPX Lacute Yacute -74
+KPX Lacute Ydieresis -74
+KPX Lacute quotedblright -100
+KPX Lacute quoteright -100
+KPX Lacute y -25
+KPX Lacute yacute -25
+KPX Lacute ydieresis -25
+KPX Lcommaaccent T -75
+KPX Lcommaaccent Tcaron -75
+KPX Lcommaaccent Tcommaaccent -75
+KPX Lcommaaccent V -91
+KPX Lcommaaccent W -74
+KPX Lcommaaccent Y -74
+KPX Lcommaaccent Yacute -74
+KPX Lcommaaccent Ydieresis -74
+KPX Lcommaaccent quotedblright -100
+KPX Lcommaaccent quoteright -100
+KPX Lcommaaccent y -25
+KPX Lcommaaccent yacute -25
+KPX Lcommaaccent ydieresis -25
+KPX Lslash T -75
+KPX Lslash Tcaron -75
+KPX Lslash Tcommaaccent -75
+KPX Lslash V -91
+KPX Lslash W -74
+KPX Lslash Y -74
+KPX Lslash Yacute -74
+KPX Lslash Ydieresis -74
+KPX Lslash quotedblright -100
+KPX Lslash quoteright -100
+KPX Lslash y -25
+KPX Lslash yacute -25
+KPX Lslash ydieresis -25
+KPX N comma -55
+KPX N period -55
+KPX Nacute comma -55
+KPX Nacute period -55
+KPX Ncaron comma -55
+KPX Ncaron period -55
+KPX Ncommaaccent comma -55
+KPX Ncommaaccent period -55
+KPX Ntilde comma -55
+KPX Ntilde period -55
+KPX O T 10
+KPX O Tcaron 10
+KPX O Tcommaaccent 10
+KPX O V -18
+KPX O Y -18
+KPX O Yacute -18
+KPX O Ydieresis -18
+KPX O comma -37
+KPX O period -37
+KPX Oacute T 10
+KPX Oacute Tcaron 10
+KPX Oacute Tcommaaccent 10
+KPX Oacute V -18
+KPX Oacute Y -18
+KPX Oacute Yacute -18
+KPX Oacute Ydieresis -18
+KPX Oacute comma -37
+KPX Oacute period -37
+KPX Ocircumflex T 10
+KPX Ocircumflex Tcaron 10
+KPX Ocircumflex Tcommaaccent 10
+KPX Ocircumflex V -18
+KPX Ocircumflex Y -18
+KPX Ocircumflex Yacute -18
+KPX Ocircumflex Ydieresis -18
+KPX Ocircumflex comma -37
+KPX Ocircumflex period -37
+KPX Odieresis T 10
+KPX Odieresis Tcaron 10
+KPX Odieresis Tcommaaccent 10
+KPX Odieresis V -18
+KPX Odieresis Y -18
+KPX Odieresis Yacute -18
+KPX Odieresis Ydieresis -18
+KPX Odieresis comma -37
+KPX Odieresis period -37
+KPX Ograve T 10
+KPX Ograve Tcaron 10
+KPX Ograve Tcommaaccent 10
+KPX Ograve V -18
+KPX Ograve Y -18
+KPX Ograve Yacute -18
+KPX Ograve Ydieresis -18
+KPX Ograve comma -37
+KPX Ograve period -37
+KPX Ohungarumlaut T 10
+KPX Ohungarumlaut Tcaron 10
+KPX Ohungarumlaut Tcommaaccent 10
+KPX Ohungarumlaut V -18
+KPX Ohungarumlaut Y -18
+KPX Ohungarumlaut Yacute -18
+KPX Ohungarumlaut Ydieresis -18
+KPX Ohungarumlaut comma -37
+KPX Ohungarumlaut period -37
+KPX Omacron T 10
+KPX Omacron Tcaron 10
+KPX Omacron Tcommaaccent 10
+KPX Omacron V -18
+KPX Omacron Y -18
+KPX Omacron Yacute -18
+KPX Omacron Ydieresis -18
+KPX Omacron comma -37
+KPX Omacron period -37
+KPX Oslash T 10
+KPX Oslash Tcaron 10
+KPX Oslash Tcommaaccent 10
+KPX Oslash V -18
+KPX Oslash Y -18
+KPX Oslash Yacute -18
+KPX Oslash Ydieresis -18
+KPX Oslash comma -37
+KPX Oslash period -37
+KPX Otilde T 10
+KPX Otilde Tcaron 10
+KPX Otilde Tcommaaccent 10
+KPX Otilde V -18
+KPX Otilde Y -18
+KPX Otilde Yacute -18
+KPX Otilde Ydieresis -18
+KPX Otilde comma -37
+KPX Otilde period -37
+KPX P A -55
+KPX P Aacute -55
+KPX P Abreve -55
+KPX P Acircumflex -55
+KPX P Adieresis -55
+KPX P Agrave -55
+KPX P Amacron -55
+KPX P Aogonek -55
+KPX P Aring -55
+KPX P Atilde -55
+KPX P a -37
+KPX P aacute -37
+KPX P abreve -37
+KPX P acircumflex -37
+KPX P adieresis -37
+KPX P agrave -37
+KPX P amacron -37
+KPX P aogonek -37
+KPX P aring -37
+KPX P atilde -37
+KPX P comma -125
+KPX P e -37
+KPX P eacute -37
+KPX P ecaron -37
+KPX P ecircumflex -37
+KPX P edieresis -37
+KPX P edotaccent -37
+KPX P egrave -37
+KPX P emacron -37
+KPX P eogonek -37
+KPX P o -37
+KPX P oacute -37
+KPX P ocircumflex -37
+KPX P odieresis -37
+KPX P ograve -37
+KPX P ohungarumlaut -37
+KPX P omacron -37
+KPX P oslash -37
+KPX P otilde -37
+KPX P period -125
+KPX Q comma -25
+KPX Q period -25
+KPX S comma -37
+KPX S period -37
+KPX Sacute comma -37
+KPX Sacute period -37
+KPX Scaron comma -37
+KPX Scaron period -37
+KPX Scedilla comma -37
+KPX Scedilla period -37
+KPX Scommaaccent comma -37
+KPX Scommaaccent period -37
+KPX T A -18
+KPX T Aacute -18
+KPX T Abreve -18
+KPX T Acircumflex -18
+KPX T Adieresis -18
+KPX T Agrave -18
+KPX T Amacron -18
+KPX T Aogonek -18
+KPX T Aring -18
+KPX T Atilde -18
+KPX T O 10
+KPX T Oacute 10
+KPX T Ocircumflex 10
+KPX T Odieresis 10
+KPX T Ograve 10
+KPX T Ohungarumlaut 10
+KPX T Omacron 10
+KPX T Oslash 10
+KPX T Otilde 10
+KPX T a -55
+KPX T aacute -55
+KPX T abreve -55
+KPX T acircumflex -55
+KPX T adieresis -55
+KPX T agrave -55
+KPX T amacron -55
+KPX T aogonek -55
+KPX T aring -55
+KPX T atilde -55
+KPX T colon -37
+KPX T comma -125
+KPX T e -55
+KPX T eacute -55
+KPX T ecaron -55
+KPX T ecircumflex -55
+KPX T edieresis -55
+KPX T edotaccent -55
+KPX T egrave -55
+KPX T emacron -55
+KPX T eogonek -55
+KPX T hyphen -100
+KPX T o -55
+KPX T oacute -55
+KPX T ocircumflex -55
+KPX T odieresis -55
+KPX T ograve -55
+KPX T ohungarumlaut -55
+KPX T omacron -55
+KPX T oslash -55
+KPX T otilde -55
+KPX T period -125
+KPX T semicolon -37
+KPX Tcaron A -18
+KPX Tcaron Aacute -18
+KPX Tcaron Abreve -18
+KPX Tcaron Acircumflex -18
+KPX Tcaron Adieresis -18
+KPX Tcaron Agrave -18
+KPX Tcaron Amacron -18
+KPX Tcaron Aogonek -18
+KPX Tcaron Aring -18
+KPX Tcaron Atilde -18
+KPX Tcaron O 10
+KPX Tcaron Oacute 10
+KPX Tcaron Ocircumflex 10
+KPX Tcaron Odieresis 10
+KPX Tcaron Ograve 10
+KPX Tcaron Ohungarumlaut 10
+KPX Tcaron Omacron 10
+KPX Tcaron Oslash 10
+KPX Tcaron Otilde 10
+KPX Tcaron a -55
+KPX Tcaron aacute -55
+KPX Tcaron abreve -55
+KPX Tcaron acircumflex -55
+KPX Tcaron adieresis -55
+KPX Tcaron agrave -55
+KPX Tcaron amacron -55
+KPX Tcaron aogonek -55
+KPX Tcaron aring -55
+KPX Tcaron atilde -55
+KPX Tcaron colon -37
+KPX Tcaron comma -125
+KPX Tcaron e -55
+KPX Tcaron eacute -55
+KPX Tcaron ecaron -55
+KPX Tcaron ecircumflex -55
+KPX Tcaron edieresis -55
+KPX Tcaron edotaccent -55
+KPX Tcaron egrave -55
+KPX Tcaron emacron -55
+KPX Tcaron eogonek -55
+KPX Tcaron hyphen -100
+KPX Tcaron o -55
+KPX Tcaron oacute -55
+KPX Tcaron ocircumflex -55
+KPX Tcaron odieresis -55
+KPX Tcaron ograve -55
+KPX Tcaron ohungarumlaut -55
+KPX Tcaron omacron -55
+KPX Tcaron oslash -55
+KPX Tcaron otilde -55
+KPX Tcaron period -125
+KPX Tcaron semicolon -37
+KPX Tcommaaccent A -18
+KPX Tcommaaccent Aacute -18
+KPX Tcommaaccent Abreve -18
+KPX Tcommaaccent Acircumflex -18
+KPX Tcommaaccent Adieresis -18
+KPX Tcommaaccent Agrave -18
+KPX Tcommaaccent Amacron -18
+KPX Tcommaaccent Aogonek -18
+KPX Tcommaaccent Aring -18
+KPX Tcommaaccent Atilde -18
+KPX Tcommaaccent O 10
+KPX Tcommaaccent Oacute 10
+KPX Tcommaaccent Ocircumflex 10
+KPX Tcommaaccent Odieresis 10
+KPX Tcommaaccent Ograve 10
+KPX Tcommaaccent Ohungarumlaut 10
+KPX Tcommaaccent Omacron 10
+KPX Tcommaaccent Oslash 10
+KPX Tcommaaccent Otilde 10
+KPX Tcommaaccent a -55
+KPX Tcommaaccent aacute -55
+KPX Tcommaaccent abreve -55
+KPX Tcommaaccent acircumflex -55
+KPX Tcommaaccent adieresis -55
+KPX Tcommaaccent agrave -55
+KPX Tcommaaccent amacron -55
+KPX Tcommaaccent aogonek -55
+KPX Tcommaaccent aring -55
+KPX Tcommaaccent atilde -55
+KPX Tcommaaccent colon -37
+KPX Tcommaaccent comma -125
+KPX Tcommaaccent e -55
+KPX Tcommaaccent eacute -55
+KPX Tcommaaccent ecaron -55
+KPX Tcommaaccent ecircumflex -55
+KPX Tcommaaccent edieresis -55
+KPX Tcommaaccent edotaccent -55
+KPX Tcommaaccent egrave -55
+KPX Tcommaaccent emacron -55
+KPX Tcommaaccent eogonek -55
+KPX Tcommaaccent hyphen -100
+KPX Tcommaaccent o -55
+KPX Tcommaaccent oacute -55
+KPX Tcommaaccent ocircumflex -55
+KPX Tcommaaccent odieresis -55
+KPX Tcommaaccent ograve -55
+KPX Tcommaaccent ohungarumlaut -55
+KPX Tcommaaccent omacron -55
+KPX Tcommaaccent oslash -55
+KPX Tcommaaccent otilde -55
+KPX Tcommaaccent period -125
+KPX Tcommaaccent semicolon -37
+KPX U A -30
+KPX U Aacute -30
+KPX U Abreve -30
+KPX U Acircumflex -30
+KPX U Adieresis -30
+KPX U Agrave -30
+KPX U Amacron -30
+KPX U Aogonek -30
+KPX U Aring -30
+KPX U Atilde -30
+KPX U comma -100
+KPX U period -100
+KPX Uacute A -30
+KPX Uacute Aacute -30
+KPX Uacute Abreve -30
+KPX Uacute Acircumflex -30
+KPX Uacute Adieresis -30
+KPX Uacute Agrave -30
+KPX Uacute Amacron -30
+KPX Uacute Aogonek -30
+KPX Uacute Aring -30
+KPX Uacute Atilde -30
+KPX Uacute comma -100
+KPX Uacute period -100
+KPX Ucircumflex A -30
+KPX Ucircumflex Aacute -30
+KPX Ucircumflex Abreve -30
+KPX Ucircumflex Acircumflex -30
+KPX Ucircumflex Adieresis -30
+KPX Ucircumflex Agrave -30
+KPX Ucircumflex Amacron -30
+KPX Ucircumflex Aogonek -30
+KPX Ucircumflex Aring -30
+KPX Ucircumflex Atilde -30
+KPX Ucircumflex comma -100
+KPX Ucircumflex period -100
+KPX Udieresis A -30
+KPX Udieresis Aacute -30
+KPX Udieresis Abreve -30
+KPX Udieresis Acircumflex -30
+KPX Udieresis Adieresis -30
+KPX Udieresis Agrave -30
+KPX Udieresis Amacron -30
+KPX Udieresis Aogonek -30
+KPX Udieresis Aring -30
+KPX Udieresis Atilde -30
+KPX Udieresis comma -100
+KPX Udieresis period -100
+KPX Ugrave A -30
+KPX Ugrave Aacute -30
+KPX Ugrave Abreve -30
+KPX Ugrave Acircumflex -30
+KPX Ugrave Adieresis -30
+KPX Ugrave Agrave -30
+KPX Ugrave Amacron -30
+KPX Ugrave Aogonek -30
+KPX Ugrave Aring -30
+KPX Ugrave Atilde -30
+KPX Ugrave comma -100
+KPX Ugrave period -100
+KPX Uhungarumlaut A -30
+KPX Uhungarumlaut Aacute -30
+KPX Uhungarumlaut Abreve -30
+KPX Uhungarumlaut Acircumflex -30
+KPX Uhungarumlaut Adieresis -30
+KPX Uhungarumlaut Agrave -30
+KPX Uhungarumlaut Amacron -30
+KPX Uhungarumlaut Aogonek -30
+KPX Uhungarumlaut Aring -30
+KPX Uhungarumlaut Atilde -30
+KPX Uhungarumlaut comma -100
+KPX Uhungarumlaut period -100
+KPX Umacron A -30
+KPX Umacron Aacute -30
+KPX Umacron Abreve -30
+KPX Umacron Acircumflex -30
+KPX Umacron Adieresis -30
+KPX Umacron Agrave -30
+KPX Umacron Amacron -30
+KPX Umacron Aogonek -30
+KPX Umacron Aring -30
+KPX Umacron Atilde -30
+KPX Umacron comma -100
+KPX Umacron period -100
+KPX Uogonek A -30
+KPX Uogonek Aacute -30
+KPX Uogonek Abreve -30
+KPX Uogonek Acircumflex -30
+KPX Uogonek Adieresis -30
+KPX Uogonek Agrave -30
+KPX Uogonek Amacron -30
+KPX Uogonek Aogonek -30
+KPX Uogonek Aring -30
+KPX Uogonek Atilde -30
+KPX Uogonek comma -100
+KPX Uogonek period -100
+KPX Uring A -30
+KPX Uring Aacute -30
+KPX Uring Abreve -30
+KPX Uring Acircumflex -30
+KPX Uring Adieresis -30
+KPX Uring Agrave -30
+KPX Uring Amacron -30
+KPX Uring Aogonek -30
+KPX Uring Aring -30
+KPX Uring Atilde -30
+KPX Uring comma -100
+KPX Uring period -100
+KPX V A -74
+KPX V Aacute -74
+KPX V Abreve -74
+KPX V Acircumflex -74
+KPX V Adieresis -74
+KPX V Agrave -74
+KPX V Amacron -74
+KPX V Aogonek -74
+KPX V Aring -74
+KPX V Atilde -74
+KPX V O -18
+KPX V Oacute -18
+KPX V Ocircumflex -18
+KPX V Odieresis -18
+KPX V Ograve -18
+KPX V Ohungarumlaut -18
+KPX V Omacron -18
+KPX V Oslash -18
+KPX V Otilde -18
+KPX V a -85
+KPX V aacute -85
+KPX V abreve -85
+KPX V acircumflex -85
+KPX V adieresis -85
+KPX V agrave -85
+KPX V amacron -85
+KPX V aogonek -85
+KPX V aring -85
+KPX V atilde -85
+KPX V colon -75
+KPX V comma -125
+KPX V e -75
+KPX V eacute -75
+KPX V ecaron -75
+KPX V ecircumflex -75
+KPX V edieresis -75
+KPX V edotaccent -75
+KPX V egrave -75
+KPX V emacron -75
+KPX V eogonek -75
+KPX V hyphen -100
+KPX V i -18
+KPX V iacute -18
+KPX V icircumflex -18
+KPX V iogonek -18
+KPX V o -75
+KPX V oacute -75
+KPX V ocircumflex -75
+KPX V odieresis -75
+KPX V ograve -75
+KPX V ohungarumlaut -75
+KPX V omacron -75
+KPX V oslash -75
+KPX V otilde -75
+KPX V period -125
+KPX V semicolon -75
+KPX V u -75
+KPX V uacute -75
+KPX V ucircumflex -75
+KPX V udieresis -75
+KPX V ugrave -75
+KPX V uhungarumlaut -75
+KPX V umacron -75
+KPX V uogonek -75
+KPX V uring -75
+KPX W A -50
+KPX W Aacute -50
+KPX W Abreve -50
+KPX W Acircumflex -50
+KPX W Adieresis -50
+KPX W Agrave -50
+KPX W Amacron -50
+KPX W Aogonek -50
+KPX W Aring -50
+KPX W Atilde -50
+KPX W a -75
+KPX W aacute -75
+KPX W abreve -75
+KPX W acircumflex -75
+KPX W adieresis -75
+KPX W agrave -75
+KPX W amacron -75
+KPX W aogonek -75
+KPX W aring -75
+KPX W atilde -75
+KPX W colon -100
+KPX W comma -125
+KPX W e -60
+KPX W eacute -60
+KPX W ecaron -60
+KPX W ecircumflex -60
+KPX W edieresis -60
+KPX W edotaccent -60
+KPX W egrave -60
+KPX W emacron -60
+KPX W eogonek -60
+KPX W hyphen -100
+KPX W i -18
+KPX W iacute -18
+KPX W icircumflex -18
+KPX W iogonek -18
+KPX W o -60
+KPX W oacute -60
+KPX W ocircumflex -60
+KPX W odieresis -60
+KPX W ograve -60
+KPX W ohungarumlaut -60
+KPX W omacron -60
+KPX W oslash -60
+KPX W otilde -60
+KPX W period -125
+KPX W semicolon -100
+KPX W u -55
+KPX W uacute -55
+KPX W ucircumflex -55
+KPX W udieresis -55
+KPX W ugrave -55
+KPX W uhungarumlaut -55
+KPX W umacron -55
+KPX W uogonek -55
+KPX W uring -55
+KPX W y -55
+KPX W yacute -55
+KPX W ydieresis -55
+KPX Y A -75
+KPX Y Aacute -75
+KPX Y Abreve -75
+KPX Y Acircumflex -75
+KPX Y Adieresis -75
+KPX Y Agrave -75
+KPX Y Amacron -75
+KPX Y Aogonek -75
+KPX Y Aring -75
+KPX Y Atilde -75
+KPX Y O -18
+KPX Y Oacute -18
+KPX Y Ocircumflex -18
+KPX Y Odieresis -18
+KPX Y Ograve -18
+KPX Y Ohungarumlaut -18
+KPX Y Omacron -18
+KPX Y Oslash -18
+KPX Y Otilde -18
+KPX Y a -100
+KPX Y aacute -100
+KPX Y abreve -60
+KPX Y acircumflex -100
+KPX Y adieresis -100
+KPX Y agrave -60
+KPX Y amacron -100
+KPX Y aogonek -100
+KPX Y aring -100
+KPX Y atilde -100
+KPX Y colon -75
+KPX Y comma -100
+KPX Y e -100
+KPX Y eacute -100
+KPX Y ecaron -60
+KPX Y ecircumflex -100
+KPX Y edieresis -60
+KPX Y edotaccent -100
+KPX Y egrave -60
+KPX Y emacron -100
+KPX Y eogonek -100
+KPX Y hyphen -125
+KPX Y i -18
+KPX Y iacute -18
+KPX Y icircumflex -18
+KPX Y imacron -18
+KPX Y iogonek -18
+KPX Y o -100
+KPX Y oacute -100
+KPX Y ocircumflex -100
+KPX Y odieresis -60
+KPX Y ograve -60
+KPX Y ohungarumlaut -100
+KPX Y omacron -100
+KPX Y oslash -100
+KPX Y otilde -100
+KPX Y period -100
+KPX Y semicolon -75
+KPX Y u -91
+KPX Y uacute -91
+KPX Y ucircumflex -91
+KPX Y udieresis -91
+KPX Y ugrave -91
+KPX Y uhungarumlaut -91
+KPX Y umacron -91
+KPX Y uogonek -91
+KPX Y uring -91
+KPX Yacute A -75
+KPX Yacute Aacute -75
+KPX Yacute Abreve -75
+KPX Yacute Acircumflex -75
+KPX Yacute Adieresis -75
+KPX Yacute Agrave -75
+KPX Yacute Amacron -75
+KPX Yacute Aogonek -75
+KPX Yacute Aring -75
+KPX Yacute Atilde -75
+KPX Yacute O -18
+KPX Yacute Oacute -18
+KPX Yacute Ocircumflex -18
+KPX Yacute Odieresis -18
+KPX Yacute Ograve -18
+KPX Yacute Ohungarumlaut -18
+KPX Yacute Omacron -18
+KPX Yacute Oslash -18
+KPX Yacute Otilde -18
+KPX Yacute a -100
+KPX Yacute aacute -100
+KPX Yacute abreve -60
+KPX Yacute acircumflex -100
+KPX Yacute adieresis -100
+KPX Yacute agrave -60
+KPX Yacute amacron -100
+KPX Yacute aogonek -100
+KPX Yacute aring -100
+KPX Yacute atilde -100
+KPX Yacute colon -75
+KPX Yacute comma -100
+KPX Yacute e -100
+KPX Yacute eacute -100
+KPX Yacute ecaron -60
+KPX Yacute ecircumflex -100
+KPX Yacute edieresis -60
+KPX Yacute edotaccent -100
+KPX Yacute egrave -60
+KPX Yacute emacron -100
+KPX Yacute eogonek -100
+KPX Yacute hyphen -125
+KPX Yacute i -18
+KPX Yacute iacute -18
+KPX Yacute icircumflex -18
+KPX Yacute imacron -18
+KPX Yacute iogonek -18
+KPX Yacute o -100
+KPX Yacute oacute -100
+KPX Yacute ocircumflex -100
+KPX Yacute odieresis -60
+KPX Yacute ograve -60
+KPX Yacute ohungarumlaut -100
+KPX Yacute omacron -100
+KPX Yacute oslash -100
+KPX Yacute otilde -100
+KPX Yacute period -100
+KPX Yacute semicolon -75
+KPX Yacute u -91
+KPX Yacute uacute -91
+KPX Yacute ucircumflex -91
+KPX Yacute udieresis -91
+KPX Yacute ugrave -91
+KPX Yacute uhungarumlaut -91
+KPX Yacute umacron -91
+KPX Yacute uogonek -91
+KPX Yacute uring -91
+KPX Ydieresis A -75
+KPX Ydieresis Aacute -75
+KPX Ydieresis Abreve -75
+KPX Ydieresis Acircumflex -75
+KPX Ydieresis Adieresis -75
+KPX Ydieresis Agrave -75
+KPX Ydieresis Amacron -75
+KPX Ydieresis Aogonek -75
+KPX Ydieresis Aring -75
+KPX Ydieresis Atilde -75
+KPX Ydieresis O -18
+KPX Ydieresis Oacute -18
+KPX Ydieresis Ocircumflex -18
+KPX Ydieresis Odieresis -18
+KPX Ydieresis Ograve -18
+KPX Ydieresis Ohungarumlaut -18
+KPX Ydieresis Omacron -18
+KPX Ydieresis Oslash -18
+KPX Ydieresis Otilde -18
+KPX Ydieresis a -100
+KPX Ydieresis aacute -100
+KPX Ydieresis abreve -60
+KPX Ydieresis acircumflex -100
+KPX Ydieresis adieresis -100
+KPX Ydieresis agrave -60
+KPX Ydieresis amacron -100
+KPX Ydieresis aogonek -100
+KPX Ydieresis aring -100
+KPX Ydieresis atilde -100
+KPX Ydieresis colon -75
+KPX Ydieresis comma -100
+KPX Ydieresis e -100
+KPX Ydieresis eacute -100
+KPX Ydieresis ecaron -60
+KPX Ydieresis ecircumflex -100
+KPX Ydieresis edieresis -60
+KPX Ydieresis edotaccent -100
+KPX Ydieresis egrave -60
+KPX Ydieresis emacron -100
+KPX Ydieresis eogonek -100
+KPX Ydieresis hyphen -125
+KPX Ydieresis i -18
+KPX Ydieresis iacute -18
+KPX Ydieresis icircumflex -18
+KPX Ydieresis imacron -18
+KPX Ydieresis iogonek -18
+KPX Ydieresis o -100
+KPX Ydieresis oacute -100
+KPX Ydieresis ocircumflex -100
+KPX Ydieresis odieresis -60
+KPX Ydieresis ograve -60
+KPX Ydieresis ohungarumlaut -100
+KPX Ydieresis omacron -100
+KPX Ydieresis oslash -100
+KPX Ydieresis otilde -100
+KPX Ydieresis period -100
+KPX Ydieresis semicolon -75
+KPX Ydieresis u -91
+KPX Ydieresis uacute -91
+KPX Ydieresis ucircumflex -91
+KPX Ydieresis udieresis -91
+KPX Ydieresis ugrave -91
+KPX Ydieresis uhungarumlaut -91
+KPX Ydieresis umacron -91
+KPX Ydieresis uogonek -91
+KPX Ydieresis uring -91
+KPX a v -10
+KPX a w -10
+KPX a y -10
+KPX a yacute -10
+KPX a ydieresis -10
+KPX aacute v -10
+KPX aacute w -10
+KPX aacute y -10
+KPX aacute yacute -10
+KPX aacute ydieresis -10
+KPX abreve v -10
+KPX abreve w -10
+KPX abreve y -10
+KPX abreve yacute -10
+KPX abreve ydieresis -10
+KPX acircumflex v -10
+KPX acircumflex w -10
+KPX acircumflex y -10
+KPX acircumflex yacute -10
+KPX acircumflex ydieresis -10
+KPX adieresis v -10
+KPX adieresis w -10
+KPX adieresis y -10
+KPX adieresis yacute -10
+KPX adieresis ydieresis -10
+KPX agrave v -10
+KPX agrave w -10
+KPX agrave y -10
+KPX agrave yacute -10
+KPX agrave ydieresis -10
+KPX amacron v -10
+KPX amacron w -10
+KPX amacron y -10
+KPX amacron yacute -10
+KPX amacron ydieresis -10
+KPX aogonek v -10
+KPX aogonek w -10
+KPX aring v -10
+KPX aring w -10
+KPX aring y -10
+KPX aring yacute -10
+KPX aring ydieresis -10
+KPX atilde v -10
+KPX atilde w -10
+KPX atilde y -10
+KPX atilde yacute -10
+KPX atilde ydieresis -10
+KPX b comma -18
+KPX b period -18
+KPX c comma -18
+KPX c h -7
+KPX c k -7
+KPX c kcommaaccent -7
+KPX c l -7
+KPX c lacute -7
+KPX c lcommaaccent -7
+KPX c lslash -7
+KPX c period -18
+KPX cacute comma -18
+KPX cacute h -7
+KPX cacute k -7
+KPX cacute kcommaaccent -7
+KPX cacute l -7
+KPX cacute lacute -7
+KPX cacute lcommaaccent -7
+KPX cacute lslash -7
+KPX cacute period -18
+KPX ccaron comma -18
+KPX ccaron h -7
+KPX ccaron k -7
+KPX ccaron kcommaaccent -7
+KPX ccaron l -7
+KPX ccaron lacute -7
+KPX ccaron lcommaaccent -7
+KPX ccaron lslash -7
+KPX ccaron period -18
+KPX ccedilla comma -18
+KPX ccedilla h -7
+KPX ccedilla k -7
+KPX ccedilla kcommaaccent -7
+KPX ccedilla l -7
+KPX ccedilla lacute -7
+KPX ccedilla lcommaaccent -7
+KPX ccedilla lslash -7
+KPX ccedilla period -18
+KPX colon space -37
+KPX comma quotedblright -37
+KPX comma quoteright -37
+KPX comma space -37
+KPX e comma -18
+KPX e period -18
+KPX eacute comma -18
+KPX eacute period -18
+KPX ecaron comma -18
+KPX ecaron period -18
+KPX ecircumflex comma -18
+KPX ecircumflex period -18
+KPX edieresis comma -18
+KPX edieresis period -18
+KPX edotaccent comma -18
+KPX edotaccent period -18
+KPX egrave comma -18
+KPX egrave period -18
+KPX emacron comma -18
+KPX emacron period -18
+KPX eogonek comma -18
+KPX eogonek period -18
+KPX f comma -37
+KPX f period -37
+KPX f quotedblright 100
+KPX f quoteright 100
+KPX g comma -25
+KPX g period -25
+KPX gbreve comma -25
+KPX gbreve period -25
+KPX gcommaaccent comma -25
+KPX gcommaaccent period -25
+KPX o comma -18
+KPX o period -18
+KPX oacute comma -18
+KPX oacute period -18
+KPX ocircumflex comma -18
+KPX ocircumflex period -18
+KPX odieresis comma -18
+KPX odieresis period -18
+KPX ograve comma -18
+KPX ograve period -18
+KPX ohungarumlaut comma -18
+KPX ohungarumlaut period -18
+KPX omacron comma -18
+KPX omacron period -18
+KPX oslash comma -18
+KPX oslash period -18
+KPX otilde comma -18
+KPX otilde period -18
+KPX p comma -18
+KPX p period -18
+KPX period quotedblright -37
+KPX period quoteright -37
+KPX period space -37
+KPX quotedblleft A -74
+KPX quotedblleft Aacute -74
+KPX quotedblleft Abreve -74
+KPX quotedblleft Acircumflex -74
+KPX quotedblleft Adieresis -74
+KPX quotedblleft Agrave -74
+KPX quotedblleft Amacron -74
+KPX quotedblleft Aogonek -74
+KPX quotedblleft Aring -74
+KPX quotedblleft Atilde -74
+KPX quotedblright space -37
+KPX quoteleft A -74
+KPX quoteleft Aacute -74
+KPX quoteleft Abreve -74
+KPX quoteleft Acircumflex -74
+KPX quoteleft Adieresis -74
+KPX quoteleft Agrave -74
+KPX quoteleft Amacron -74
+KPX quoteleft Aogonek -74
+KPX quoteleft Aring -74
+KPX quoteleft Atilde -74
+KPX quoteleft quoteleft -25
+KPX quoteright d -37
+KPX quoteright dcroat -37
+KPX quoteright quoteright -25
+KPX quoteright s -25
+KPX quoteright sacute -25
+KPX quoteright scaron -25
+KPX quoteright scedilla -25
+KPX quoteright scommaaccent -25
+KPX r comma -100
+KPX r hyphen -37
+KPX r period -100
+KPX racute comma -100
+KPX racute hyphen -37
+KPX racute period -100
+KPX rcaron comma -100
+KPX rcaron hyphen -37
+KPX rcaron period -100
+KPX rcommaaccent comma -100
+KPX rcommaaccent hyphen -37
+KPX rcommaaccent period -100
+KPX s comma -25
+KPX s period -25
+KPX sacute comma -25
+KPX sacute period -25
+KPX scaron comma -25
+KPX scaron period -25
+KPX scedilla comma -25
+KPX scedilla period -25
+KPX scommaaccent comma -25
+KPX scommaaccent period -25
+KPX semicolon space -37
+KPX space A -37
+KPX space Aacute -37
+KPX space Abreve -37
+KPX space Acircumflex -37
+KPX space Adieresis -37
+KPX space Agrave -37
+KPX space Amacron -37
+KPX space Aogonek -37
+KPX space Aring -37
+KPX space Atilde -37
+KPX space T -37
+KPX space Tcaron -37
+KPX space Tcommaaccent -37
+KPX space V -37
+KPX space W -37
+KPX space Y -37
+KPX space Yacute -37
+KPX space Ydieresis -37
+KPX space quotedblleft -37
+KPX space quoteleft -37
+KPX v comma -125
+KPX v period -125
+KPX w a -18
+KPX w aacute -18
+KPX w abreve -18
+KPX w acircumflex -18
+KPX w adieresis -18
+KPX w agrave -18
+KPX w amacron -18
+KPX w aogonek -18
+KPX w aring -18
+KPX w atilde -18
+KPX w comma -125
+KPX w period -125
+KPX y comma -125
+KPX y period -125
+KPX yacute comma -125
+KPX yacute period -125
+KPX ydieresis comma -125
+KPX ydieresis period -125
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/src/fonts/Adobe-Core35_AFMs-314/Palatino-Bold.afm b/src/fonts/Adobe-Core35_AFMs-314/Palatino-Bold.afm
new file mode 100644
index 0000000..846373d
--- /dev/null
+++ b/src/fonts/Adobe-Core35_AFMs-314/Palatino-Bold.afm
@@ -0,0 +1,1172 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1985, 1987, 1989, 1990, 1992, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Thu May 1 13:25:14 1997
+Comment UniqueID 43075
+Comment VMusage 51499 66524
+FontName Palatino-Bold
+FullName Palatino Bold
+FamilyName Palatino
+Weight Bold
+ItalicAngle 0
+IsFixedPitch false
+FontBBox -152 -266 1000 924
+UnderlinePosition -100
+UnderlineThickness 50
+Version 002.000
+Notice Copyright (c) 1985, 1987, 1989, 1990, 1992, 1997 Adobe Systems Incorporated. All Rights Reserved.Palatino is a trademark of Linotype-Hell AG and/or its subsidiaries.
+EncodingScheme AdobeStandardEncoding
+CapHeight 681
+XHeight 471
+Ascender 726
+Descender -281
+StdHW 55
+StdVW 122
+StartCharMetrics 314
+C 32 ; WX 250 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 278 ; N exclam ; B 63 -12 219 688 ;
+C 34 ; WX 402 ; N quotedbl ; B 22 376 380 695 ;
+C 35 ; WX 500 ; N numbersign ; B 4 0 496 673 ;
+C 36 ; WX 500 ; N dollar ; B 28 -114 472 721 ;
+C 37 ; WX 889 ; N percent ; B 61 -9 828 714 ;
+C 38 ; WX 833 ; N ampersand ; B 52 -17 813 684 ;
+C 39 ; WX 278 ; N quoteright ; B 29 405 249 695 ;
+C 40 ; WX 333 ; N parenleft ; B 65 -104 305 723 ;
+C 41 ; WX 333 ; N parenright ; B 28 -104 268 723 ;
+C 42 ; WX 444 ; N asterisk ; B 44 332 399 695 ;
+C 43 ; WX 606 ; N plus ; B 51 0 555 505 ;
+C 44 ; WX 250 ; N comma ; B -6 -166 227 141 ;
+C 45 ; WX 333 ; N hyphen ; B 16 195 317 305 ;
+C 46 ; WX 250 ; N period ; B 47 -12 203 144 ;
+C 47 ; WX 296 ; N slash ; B -9 -17 305 720 ;
+C 48 ; WX 500 ; N zero ; B 33 -17 468 660 ;
+C 49 ; WX 500 ; N one ; B 35 -3 455 670 ;
+C 50 ; WX 500 ; N two ; B 25 -3 472 660 ;
+C 51 ; WX 500 ; N three ; B 22 -17 458 660 ;
+C 52 ; WX 500 ; N four ; B 12 -3 473 672 ;
+C 53 ; WX 500 ; N five ; B 42 -17 472 656 ;
+C 54 ; WX 500 ; N six ; B 37 -17 469 660 ;
+C 55 ; WX 500 ; N seven ; B 46 -3 493 656 ;
+C 56 ; WX 500 ; N eight ; B 34 -17 467 660 ;
+C 57 ; WX 500 ; N nine ; B 31 -17 463 660 ;
+C 58 ; WX 250 ; N colon ; B 47 -12 203 454 ;
+C 59 ; WX 250 ; N semicolon ; B -6 -166 227 454 ;
+C 60 ; WX 606 ; N less ; B 49 -15 558 519 ;
+C 61 ; WX 606 ; N equal ; B 51 114 555 396 ;
+C 62 ; WX 606 ; N greater ; B 49 -15 558 519 ;
+C 63 ; WX 444 ; N question ; B 43 -12 411 687 ;
+C 64 ; WX 747 ; N at ; B 42 -12 704 681 ;
+C 65 ; WX 778 ; N A ; B 24 -3 757 686 ;
+C 66 ; WX 667 ; N B ; B 39 -3 611 681 ;
+C 67 ; WX 722 ; N C ; B 44 -17 695 695 ;
+C 68 ; WX 833 ; N D ; B 35 -3 786 681 ;
+C 69 ; WX 611 ; N E ; B 39 -4 577 681 ;
+C 70 ; WX 556 ; N F ; B 28 -3 539 681 ;
+C 71 ; WX 833 ; N G ; B 47 -17 776 695 ;
+C 72 ; WX 833 ; N H ; B 36 -3 796 681 ;
+C 73 ; WX 389 ; N I ; B 39 -3 350 681 ;
+C 74 ; WX 389 ; N J ; B -11 -213 350 681 ;
+C 75 ; WX 778 ; N K ; B 39 -3 763 681 ;
+C 76 ; WX 611 ; N L ; B 39 -4 577 681 ;
+C 77 ; WX 1000 ; N M ; B 32 -10 968 681 ;
+C 78 ; WX 833 ; N N ; B 35 -16 798 681 ;
+C 79 ; WX 833 ; N O ; B 47 -17 787 695 ;
+C 80 ; WX 611 ; N P ; B 39 -3 594 681 ;
+C 81 ; WX 833 ; N Q ; B 47 -184 787 695 ;
+C 82 ; WX 722 ; N R ; B 39 -3 708 681 ;
+C 83 ; WX 611 ; N S ; B 57 -17 559 695 ;
+C 84 ; WX 667 ; N T ; B 17 -3 650 681 ;
+C 85 ; WX 778 ; N U ; B 26 -17 760 681 ;
+C 86 ; WX 778 ; N V ; B 20 -3 763 681 ;
+C 87 ; WX 1000 ; N W ; B 17 -3 988 686 ;
+C 88 ; WX 667 ; N X ; B 17 -3 650 695 ;
+C 89 ; WX 667 ; N Y ; B 15 -3 660 695 ;
+C 90 ; WX 667 ; N Z ; B 24 -3 627 681 ;
+C 91 ; WX 333 ; N bracketleft ; B 73 -104 291 720 ;
+C 92 ; WX 606 ; N backslash ; B 72 0 534 720 ;
+C 93 ; WX 333 ; N bracketright ; B 42 -104 260 720 ;
+C 94 ; WX 606 ; N asciicircum ; B 52 275 554 678 ;
+C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;
+C 96 ; WX 278 ; N quoteleft ; B 29 405 249 695 ;
+C 97 ; WX 500 ; N a ; B 40 -17 478 471 ;
+C 98 ; WX 611 ; N b ; B 10 -17 556 720 ;
+C 99 ; WX 444 ; N c ; B 37 -17 414 471 ;
+C 100 ; WX 611 ; N d ; B 42 -17 577 720 ;
+C 101 ; WX 500 ; N e ; B 42 -17 461 471 ;
+C 102 ; WX 389 ; N f ; B 34 -3 381 720 ; L i fi ; L l fl ;
+C 103 ; WX 556 ; N g ; B 26 -266 535 471 ;
+C 104 ; WX 611 ; N h ; B 24 -3 587 720 ;
+C 105 ; WX 333 ; N i ; B 34 -3 298 706 ;
+C 106 ; WX 333 ; N j ; B 3 -266 241 706 ;
+C 107 ; WX 611 ; N k ; B 21 -3 597 720 ;
+C 108 ; WX 333 ; N l ; B 24 -3 296 720 ;
+C 109 ; WX 889 ; N m ; B 24 -3 864 471 ;
+C 110 ; WX 611 ; N n ; B 24 -3 587 471 ;
+C 111 ; WX 556 ; N o ; B 40 -17 517 471 ;
+C 112 ; WX 611 ; N p ; B 29 -258 567 471 ;
+C 113 ; WX 611 ; N q ; B 52 -258 589 471 ;
+C 114 ; WX 389 ; N r ; B 30 -3 389 471 ;
+C 115 ; WX 444 ; N s ; B 39 -17 405 471 ;
+C 116 ; WX 333 ; N t ; B 22 -17 324 632 ;
+C 117 ; WX 611 ; N u ; B 25 -17 583 471 ;
+C 118 ; WX 556 ; N v ; B 11 -3 545 459 ;
+C 119 ; WX 833 ; N w ; B 13 -3 820 471 ;
+C 120 ; WX 500 ; N x ; B 20 -3 483 471 ;
+C 121 ; WX 556 ; N y ; B 10 -266 546 459 ;
+C 122 ; WX 500 ; N z ; B 16 -3 464 459 ;
+C 123 ; WX 310 ; N braceleft ; B 5 -117 288 725 ;
+C 124 ; WX 606 ; N bar ; B 260 -250 346 750 ;
+C 125 ; WX 310 ; N braceright ; B 22 -117 305 725 ;
+C 126 ; WX 606 ; N asciitilde ; B 51 155 555 342 ;
+C 161 ; WX 278 ; N exclamdown ; B 59 -227 215 471 ;
+C 162 ; WX 500 ; N cent ; B 73 -106 450 554 ;
+C 163 ; WX 500 ; N sterling ; B -2 -19 501 676 ;
+C 164 ; WX 167 ; N fraction ; B -152 0 320 660 ;
+C 165 ; WX 500 ; N yen ; B 17 -3 483 695 ;
+C 166 ; WX 500 ; N florin ; B 11 -242 490 703 ;
+C 167 ; WX 500 ; N section ; B 30 -217 471 695 ;
+C 168 ; WX 500 ; N currency ; B 32 96 468 533 ;
+C 169 ; WX 227 ; N quotesingle ; B 45 376 181 695 ;
+C 170 ; WX 500 ; N quotedblleft ; B 34 405 466 695 ;
+C 171 ; WX 500 ; N guillemotleft ; B 36 44 463 438 ;
+C 172 ; WX 389 ; N guilsinglleft ; B 82 44 307 438 ;
+C 173 ; WX 389 ; N guilsinglright ; B 82 44 307 438 ;
+C 174 ; WX 611 ; N fi ; B 10 -3 595 720 ;
+C 175 ; WX 611 ; N fl ; B 17 -3 593 720 ;
+C 177 ; WX 500 ; N endash ; B 0 208 500 291 ;
+C 178 ; WX 500 ; N dagger ; B 29 -6 472 682 ;
+C 179 ; WX 500 ; N daggerdbl ; B 32 -245 468 682 ;
+C 180 ; WX 250 ; N periodcentered ; B 47 179 203 335 ;
+C 182 ; WX 641 ; N paragraph ; B 19 -161 599 683 ;
+C 183 ; WX 606 ; N bullet ; B 131 172 475 516 ;
+C 184 ; WX 333 ; N quotesinglbase ; B 56 -160 276 130 ;
+C 185 ; WX 500 ; N quotedblbase ; B 34 -160 466 130 ;
+C 186 ; WX 500 ; N quotedblright ; B 34 405 466 695 ;
+C 187 ; WX 500 ; N guillemotright ; B 37 44 464 438 ;
+C 188 ; WX 1000 ; N ellipsis ; B 89 -12 911 144 ;
+C 189 ; WX 1000 ; N perthousand ; B 33 -9 982 724 ;
+C 191 ; WX 444 ; N questiondown ; B 33 -231 401 471 ;
+C 193 ; WX 333 ; N grave ; B 18 506 256 691 ;
+C 194 ; WX 333 ; N acute ; B 78 506 316 691 ;
+C 195 ; WX 333 ; N circumflex ; B -2 506 335 681 ;
+C 196 ; WX 333 ; N tilde ; B -16 535 349 661 ;
+C 197 ; WX 333 ; N macron ; B 1 538 332 609 ;
+C 198 ; WX 333 ; N breve ; B 15 506 318 669 ;
+C 199 ; WX 333 ; N dotaccent ; B 92 556 242 706 ;
+C 200 ; WX 333 ; N dieresis ; B -8 556 341 690 ;
+C 202 ; WX 333 ; N ring ; B 67 500 267 700 ;
+C 203 ; WX 333 ; N cedilla ; B 73 -225 300 -7 ;
+C 205 ; WX 333 ; N hungarumlaut ; B -56 506 390 691 ;
+C 206 ; WX 333 ; N ogonek ; B 49 -225 287 -20 ;
+C 207 ; WX 333 ; N caron ; B -2 510 335 685 ;
+C 208 ; WX 1000 ; N emdash ; B 0 208 1000 291 ;
+C 225 ; WX 1000 ; N AE ; B 12 -4 954 681 ;
+C 227 ; WX 438 ; N ordfeminine ; B 77 367 361 660 ;
+C 232 ; WX 611 ; N Lslash ; B 16 -4 577 681 ;
+C 233 ; WX 833 ; N Oslash ; B 32 -20 808 698 ;
+C 234 ; WX 1000 ; N OE ; B 43 -17 985 695 ;
+C 235 ; WX 488 ; N ordmasculine ; B 89 367 399 660 ;
+C 241 ; WX 778 ; N ae ; B 46 -17 731 471 ;
+C 245 ; WX 333 ; N dotlessi ; B 34 -3 298 471 ;
+C 248 ; WX 333 ; N lslash ; B -4 -3 334 720 ;
+C 249 ; WX 556 ; N oslash ; B 23 -18 534 471 ;
+C 250 ; WX 833 ; N oe ; B 48 -17 799 471 ;
+C 251 ; WX 611 ; N germandbls ; B 30 -17 565 720 ;
+C -1 ; WX 389 ; N Idieresis ; B 20 -3 369 895 ;
+C -1 ; WX 500 ; N eacute ; B 42 -17 461 711 ;
+C -1 ; WX 500 ; N abreve ; B 40 -17 478 689 ;
+C -1 ; WX 611 ; N uhungarumlaut ; B 25 -17 583 711 ;
+C -1 ; WX 500 ; N ecaron ; B 42 -17 461 725 ;
+C -1 ; WX 667 ; N Ydieresis ; B 15 -3 660 895 ;
+C -1 ; WX 606 ; N divide ; B 51 0 555 510 ;
+C -1 ; WX 667 ; N Yacute ; B 15 -3 660 915 ;
+C -1 ; WX 778 ; N Acircumflex ; B 24 -3 757 905 ;
+C -1 ; WX 500 ; N aacute ; B 40 -17 478 711 ;
+C -1 ; WX 778 ; N Ucircumflex ; B 26 -17 760 905 ;
+C -1 ; WX 556 ; N yacute ; B 10 -266 546 711 ;
+C -1 ; WX 444 ; N scommaaccent ; B 39 -266 405 471 ;
+C -1 ; WX 500 ; N ecircumflex ; B 42 -17 461 721 ;
+C -1 ; WX 778 ; N Uring ; B 26 -17 760 924 ;
+C -1 ; WX 778 ; N Udieresis ; B 26 -17 760 895 ;
+C -1 ; WX 500 ; N aogonek ; B 40 -225 478 471 ;
+C -1 ; WX 778 ; N Uacute ; B 26 -17 760 915 ;
+C -1 ; WX 611 ; N uogonek ; B 25 -201 642 471 ;
+C -1 ; WX 611 ; N Edieresis ; B 39 -4 577 895 ;
+C -1 ; WX 833 ; N Dcroat ; B 10 -3 786 681 ;
+C -1 ; WX 250 ; N commaaccent ; B 48 -266 203 -50 ;
+C -1 ; WX 747 ; N copyright ; B 26 -17 720 695 ;
+C -1 ; WX 611 ; N Emacron ; B 39 -4 577 833 ;
+C -1 ; WX 444 ; N ccaron ; B 37 -17 421 705 ;
+C -1 ; WX 500 ; N aring ; B 40 -17 478 720 ;
+C -1 ; WX 833 ; N Ncommaaccent ; B 35 -266 798 681 ;
+C -1 ; WX 333 ; N lacute ; B 24 -3 336 924 ;
+C -1 ; WX 500 ; N agrave ; B 40 -17 478 711 ;
+C -1 ; WX 667 ; N Tcommaaccent ; B 17 -266 650 681 ;
+C -1 ; WX 722 ; N Cacute ; B 44 -17 695 915 ;
+C -1 ; WX 500 ; N atilde ; B 40 -17 478 693 ;
+C -1 ; WX 611 ; N Edotaccent ; B 39 -4 577 910 ;
+C -1 ; WX 444 ; N scaron ; B 39 -17 405 705 ;
+C -1 ; WX 444 ; N scedilla ; B 39 -225 405 471 ;
+C -1 ; WX 333 ; N iacute ; B 34 -3 316 711 ;
+C -1 ; WX 471 ; N lozenge ; B 7 0 465 732 ;
+C -1 ; WX 722 ; N Rcaron ; B 39 -3 708 909 ;
+C -1 ; WX 833 ; N Gcommaaccent ; B 47 -266 776 695 ;
+C -1 ; WX 611 ; N ucircumflex ; B 25 -17 583 701 ;
+C -1 ; WX 500 ; N acircumflex ; B 40 -17 478 701 ;
+C -1 ; WX 778 ; N Amacron ; B 24 -3 757 833 ;
+C -1 ; WX 389 ; N rcaron ; B 30 -3 389 705 ;
+C -1 ; WX 444 ; N ccedilla ; B 37 -225 414 471 ;
+C -1 ; WX 667 ; N Zdotaccent ; B 24 -3 627 910 ;
+C -1 ; WX 611 ; N Thorn ; B 39 -3 574 681 ;
+C -1 ; WX 833 ; N Omacron ; B 47 -17 787 833 ;
+C -1 ; WX 722 ; N Racute ; B 39 -3 708 915 ;
+C -1 ; WX 611 ; N Sacute ; B 57 -17 559 915 ;
+C -1 ; WX 675 ; N dcaron ; B 42 -17 698 724 ;
+C -1 ; WX 778 ; N Umacron ; B 26 -17 760 833 ;
+C -1 ; WX 611 ; N uring ; B 25 -17 583 720 ;
+C -1 ; WX 300 ; N threesuperior ; B 9 261 292 667 ;
+C -1 ; WX 833 ; N Ograve ; B 47 -17 787 915 ;
+C -1 ; WX 778 ; N Agrave ; B 24 -3 757 915 ;
+C -1 ; WX 778 ; N Abreve ; B 24 -3 757 893 ;
+C -1 ; WX 606 ; N multiply ; B 72 21 534 483 ;
+C -1 ; WX 611 ; N uacute ; B 25 -17 583 711 ;
+C -1 ; WX 667 ; N Tcaron ; B 17 -3 650 909 ;
+C -1 ; WX 476 ; N partialdiff ; B 9 -38 467 718 ;
+C -1 ; WX 556 ; N ydieresis ; B 10 -266 546 710 ;
+C -1 ; WX 833 ; N Nacute ; B 35 -16 798 915 ;
+C -1 ; WX 333 ; N icircumflex ; B -2 -3 335 701 ;
+C -1 ; WX 611 ; N Ecircumflex ; B 39 -4 577 905 ;
+C -1 ; WX 500 ; N adieresis ; B 40 -17 478 691 ;
+C -1 ; WX 500 ; N edieresis ; B 42 -17 461 691 ;
+C -1 ; WX 444 ; N cacute ; B 37 -17 414 731 ;
+C -1 ; WX 611 ; N nacute ; B 24 -3 587 711 ;
+C -1 ; WX 611 ; N umacron ; B 25 -17 583 609 ;
+C -1 ; WX 833 ; N Ncaron ; B 35 -16 798 909 ;
+C -1 ; WX 389 ; N Iacute ; B 39 -3 350 915 ;
+C -1 ; WX 606 ; N plusminus ; B 51 0 555 505 ;
+C -1 ; WX 606 ; N brokenbar ; B 260 -175 346 675 ;
+C -1 ; WX 747 ; N registered ; B 26 -17 720 695 ;
+C -1 ; WX 833 ; N Gbreve ; B 47 -17 776 893 ;
+C -1 ; WX 389 ; N Idotaccent ; B 39 -3 350 910 ;
+C -1 ; WX 600 ; N summation ; B 15 -10 586 706 ;
+C -1 ; WX 611 ; N Egrave ; B 39 -4 577 915 ;
+C -1 ; WX 389 ; N racute ; B 30 -3 404 711 ;
+C -1 ; WX 556 ; N omacron ; B 40 -17 517 609 ;
+C -1 ; WX 667 ; N Zacute ; B 24 -3 627 915 ;
+C -1 ; WX 667 ; N Zcaron ; B 24 -3 627 909 ;
+C -1 ; WX 549 ; N greaterequal ; B 26 0 523 682 ;
+C -1 ; WX 833 ; N Eth ; B 10 -3 786 681 ;
+C -1 ; WX 722 ; N Ccedilla ; B 44 -225 695 695 ;
+C -1 ; WX 333 ; N lcommaaccent ; B 24 -266 296 720 ;
+C -1 ; WX 403 ; N tcaron ; B 22 -17 430 741 ;
+C -1 ; WX 500 ; N eogonek ; B 42 -215 461 471 ;
+C -1 ; WX 778 ; N Uogonek ; B 26 -225 760 681 ;
+C -1 ; WX 778 ; N Aacute ; B 24 -3 757 915 ;
+C -1 ; WX 778 ; N Adieresis ; B 24 -3 757 895 ;
+C -1 ; WX 500 ; N egrave ; B 42 -17 461 711 ;
+C -1 ; WX 500 ; N zacute ; B 16 -3 464 711 ;
+C -1 ; WX 333 ; N iogonek ; B 34 -225 300 706 ;
+C -1 ; WX 833 ; N Oacute ; B 47 -17 787 915 ;
+C -1 ; WX 556 ; N oacute ; B 40 -17 517 711 ;
+C -1 ; WX 500 ; N amacron ; B 40 -17 478 609 ;
+C -1 ; WX 444 ; N sacute ; B 39 -17 405 711 ;
+C -1 ; WX 333 ; N idieresis ; B -8 -3 341 710 ;
+C -1 ; WX 833 ; N Ocircumflex ; B 47 -17 787 905 ;
+C -1 ; WX 778 ; N Ugrave ; B 26 -17 760 915 ;
+C -1 ; WX 614 ; N Delta ; B 6 0 608 688 ;
+C -1 ; WX 611 ; N thorn ; B 17 -258 563 720 ;
+C -1 ; WX 300 ; N twosuperior ; B 5 261 295 660 ;
+C -1 ; WX 833 ; N Odieresis ; B 47 -17 787 895 ;
+C -1 ; WX 611 ; N mu ; B 25 -225 583 471 ;
+C -1 ; WX 333 ; N igrave ; B 18 -3 298 711 ;
+C -1 ; WX 556 ; N ohungarumlaut ; B 40 -17 562 711 ;
+C -1 ; WX 611 ; N Eogonek ; B 39 -225 581 681 ;
+C -1 ; WX 611 ; N dcroat ; B 42 -17 607 720 ;
+C -1 ; WX 750 ; N threequarters ; B 15 -2 735 667 ;
+C -1 ; WX 611 ; N Scedilla ; B 57 -225 559 695 ;
+C -1 ; WX 393 ; N lcaron ; B 24 -3 415 724 ;
+C -1 ; WX 778 ; N Kcommaaccent ; B 39 -266 763 681 ;
+C -1 ; WX 611 ; N Lacute ; B 39 -4 577 915 ;
+C -1 ; WX 998 ; N trademark ; B 38 274 961 678 ;
+C -1 ; WX 500 ; N edotaccent ; B 42 -17 461 707 ;
+C -1 ; WX 389 ; N Igrave ; B 39 -3 350 915 ;
+C -1 ; WX 389 ; N Imacron ; B 29 -3 360 833 ;
+C -1 ; WX 611 ; N Lcaron ; B 39 -4 577 695 ;
+C -1 ; WX 750 ; N onehalf ; B 9 -2 745 665 ;
+C -1 ; WX 549 ; N lessequal ; B 26 0 523 682 ;
+C -1 ; WX 556 ; N ocircumflex ; B 40 -17 517 701 ;
+C -1 ; WX 611 ; N ntilde ; B 24 -3 587 693 ;
+C -1 ; WX 778 ; N Uhungarumlaut ; B 26 -17 760 915 ;
+C -1 ; WX 611 ; N Eacute ; B 39 -4 577 915 ;
+C -1 ; WX 500 ; N emacron ; B 42 -17 461 629 ;
+C -1 ; WX 556 ; N gbreve ; B 26 -266 535 689 ;
+C -1 ; WX 750 ; N onequarter ; B 19 -2 735 665 ;
+C -1 ; WX 611 ; N Scaron ; B 57 -17 559 909 ;
+C -1 ; WX 611 ; N Scommaaccent ; B 57 -266 559 695 ;
+C -1 ; WX 833 ; N Ohungarumlaut ; B 47 -17 787 915 ;
+C -1 ; WX 400 ; N degree ; B 50 360 350 660 ;
+C -1 ; WX 556 ; N ograve ; B 40 -17 517 711 ;
+C -1 ; WX 722 ; N Ccaron ; B 44 -17 695 909 ;
+C -1 ; WX 611 ; N ugrave ; B 25 -17 583 711 ;
+C -1 ; WX 453 ; N radical ; B -9 -91 463 765 ;
+C -1 ; WX 833 ; N Dcaron ; B 35 -3 786 909 ;
+C -1 ; WX 389 ; N rcommaaccent ; B 30 -266 389 471 ;
+C -1 ; WX 833 ; N Ntilde ; B 35 -16 798 885 ;
+C -1 ; WX 556 ; N otilde ; B 40 -17 517 693 ;
+C -1 ; WX 722 ; N Rcommaaccent ; B 39 -266 708 681 ;
+C -1 ; WX 611 ; N Lcommaaccent ; B 39 -266 577 681 ;
+C -1 ; WX 778 ; N Atilde ; B 24 -3 757 885 ;
+C -1 ; WX 778 ; N Aogonek ; B 24 -225 767 686 ;
+C -1 ; WX 778 ; N Aring ; B 24 -3 757 924 ;
+C -1 ; WX 833 ; N Otilde ; B 47 -17 787 885 ;
+C -1 ; WX 500 ; N zdotaccent ; B 16 -3 464 707 ;
+C -1 ; WX 611 ; N Ecaron ; B 39 -4 577 909 ;
+C -1 ; WX 389 ; N Iogonek ; B 39 -225 352 681 ;
+C -1 ; WX 611 ; N kcommaaccent ; B 21 -266 597 720 ;
+C -1 ; WX 606 ; N minus ; B 51 212 555 298 ;
+C -1 ; WX 389 ; N Icircumflex ; B 26 -3 363 905 ;
+C -1 ; WX 611 ; N ncaron ; B 24 -3 587 705 ;
+C -1 ; WX 333 ; N tcommaaccent ; B 22 -266 324 632 ;
+C -1 ; WX 606 ; N logicalnot ; B 51 114 555 396 ;
+C -1 ; WX 556 ; N odieresis ; B 40 -17 517 710 ;
+C -1 ; WX 611 ; N udieresis ; B 25 -17 583 710 ;
+C -1 ; WX 549 ; N notequal ; B 12 -40 537 554 ;
+C -1 ; WX 556 ; N gcommaaccent ; B 26 -266 535 740 ;
+C -1 ; WX 556 ; N eth ; B 40 -17 517 720 ;
+C -1 ; WX 500 ; N zcaron ; B 16 -3 464 705 ;
+C -1 ; WX 611 ; N ncommaaccent ; B 24 -266 587 471 ;
+C -1 ; WX 300 ; N onesuperior ; B 14 261 287 665 ;
+C -1 ; WX 333 ; N imacron ; B 34 -3 298 609 ;
+EndCharMetrics
+StartKernData
+StartKernPairs 828
+KPX A T -92
+KPX A Tcaron -92
+KPX A Tcommaaccent -92
+KPX A V -129
+KPX A W -90
+KPX A Y -111
+KPX A Yacute -111
+KPX A Ydieresis -111
+KPX A quoteright -92
+KPX A space -18
+KPX A v -70
+KPX A w -70
+KPX A y -70
+KPX A yacute -70
+KPX A ydieresis -70
+KPX Aacute T -92
+KPX Aacute Tcaron -92
+KPX Aacute Tcommaaccent -92
+KPX Aacute V -129
+KPX Aacute W -90
+KPX Aacute Y -111
+KPX Aacute Yacute -111
+KPX Aacute Ydieresis -111
+KPX Aacute quoteright -92
+KPX Aacute space -18
+KPX Aacute v -70
+KPX Aacute w -70
+KPX Aacute y -70
+KPX Aacute yacute -70
+KPX Aacute ydieresis -70
+KPX Abreve T -92
+KPX Abreve Tcaron -92
+KPX Abreve Tcommaaccent -92
+KPX Abreve V -129
+KPX Abreve W -90
+KPX Abreve Y -111
+KPX Abreve Yacute -111
+KPX Abreve Ydieresis -111
+KPX Abreve quoteright -92
+KPX Abreve space -18
+KPX Abreve v -70
+KPX Abreve w -70
+KPX Abreve y -70
+KPX Abreve yacute -70
+KPX Abreve ydieresis -70
+KPX Acircumflex T -92
+KPX Acircumflex Tcaron -92
+KPX Acircumflex Tcommaaccent -92
+KPX Acircumflex V -129
+KPX Acircumflex W -90
+KPX Acircumflex Y -111
+KPX Acircumflex Yacute -111
+KPX Acircumflex Ydieresis -111
+KPX Acircumflex quoteright -92
+KPX Acircumflex space -18
+KPX Acircumflex v -70
+KPX Acircumflex w -70
+KPX Acircumflex y -70
+KPX Acircumflex yacute -70
+KPX Acircumflex ydieresis -70
+KPX Adieresis T -92
+KPX Adieresis Tcaron -92
+KPX Adieresis Tcommaaccent -92
+KPX Adieresis V -129
+KPX Adieresis W -90
+KPX Adieresis Y -111
+KPX Adieresis Yacute -111
+KPX Adieresis Ydieresis -111
+KPX Adieresis quoteright -92
+KPX Adieresis space -18
+KPX Adieresis v -70
+KPX Adieresis w -70
+KPX Adieresis y -70
+KPX Adieresis yacute -70
+KPX Adieresis ydieresis -70
+KPX Agrave T -92
+KPX Agrave Tcaron -92
+KPX Agrave Tcommaaccent -92
+KPX Agrave V -129
+KPX Agrave W -90
+KPX Agrave Y -111
+KPX Agrave Yacute -111
+KPX Agrave Ydieresis -111
+KPX Agrave quoteright -92
+KPX Agrave space -18
+KPX Agrave v -70
+KPX Agrave w -70
+KPX Agrave y -70
+KPX Agrave yacute -70
+KPX Agrave ydieresis -70
+KPX Amacron T -92
+KPX Amacron Tcaron -92
+KPX Amacron Tcommaaccent -92
+KPX Amacron V -129
+KPX Amacron W -90
+KPX Amacron Y -111
+KPX Amacron Yacute -111
+KPX Amacron Ydieresis -111
+KPX Amacron quoteright -92
+KPX Amacron space -18
+KPX Amacron v -70
+KPX Amacron w -70
+KPX Amacron y -70
+KPX Amacron yacute -70
+KPX Amacron ydieresis -70
+KPX Aogonek T -92
+KPX Aogonek Tcaron -92
+KPX Aogonek Tcommaaccent -92
+KPX Aogonek V -129
+KPX Aogonek W -90
+KPX Aogonek Y -111
+KPX Aogonek Yacute -111
+KPX Aogonek Ydieresis -111
+KPX Aogonek quoteright -92
+KPX Aogonek space -18
+KPX Aogonek v -70
+KPX Aogonek w -70
+KPX Aogonek y -70
+KPX Aogonek yacute -70
+KPX Aogonek ydieresis -70
+KPX Aring T -92
+KPX Aring Tcaron -92
+KPX Aring Tcommaaccent -92
+KPX Aring V -129
+KPX Aring W -90
+KPX Aring Y -111
+KPX Aring Yacute -111
+KPX Aring Ydieresis -111
+KPX Aring quoteright -92
+KPX Aring space -18
+KPX Aring v -70
+KPX Aring w -70
+KPX Aring y -70
+KPX Aring yacute -70
+KPX Aring ydieresis -70
+KPX Atilde T -92
+KPX Atilde Tcaron -92
+KPX Atilde Tcommaaccent -92
+KPX Atilde V -129
+KPX Atilde W -90
+KPX Atilde Y -111
+KPX Atilde Yacute -111
+KPX Atilde Ydieresis -111
+KPX Atilde quoteright -92
+KPX Atilde space -18
+KPX Atilde v -70
+KPX Atilde w -70
+KPX Atilde y -70
+KPX Atilde yacute -70
+KPX Atilde ydieresis -70
+KPX F A -55
+KPX F Aacute -55
+KPX F Abreve -55
+KPX F Acircumflex -55
+KPX F Adieresis -55
+KPX F Agrave -55
+KPX F Amacron -55
+KPX F Aogonek -55
+KPX F Aring -55
+KPX F Atilde -55
+KPX F comma -111
+KPX F period -111
+KPX L T -74
+KPX L Tcaron -74
+KPX L Tcommaaccent -74
+KPX L V -92
+KPX L W -92
+KPX L Y -92
+KPX L Yacute -92
+KPX L Ydieresis -92
+KPX L quoteright -74
+KPX L space -18
+KPX L y -74
+KPX L yacute -74
+KPX L ydieresis -74
+KPX Lacute T -74
+KPX Lacute Tcaron -74
+KPX Lacute Tcommaaccent -74
+KPX Lacute V -92
+KPX Lacute W -92
+KPX Lacute Y -92
+KPX Lacute Yacute -92
+KPX Lacute Ydieresis -92
+KPX Lacute quoteright -74
+KPX Lacute space -18
+KPX Lacute y -74
+KPX Lacute yacute -74
+KPX Lacute ydieresis -74
+KPX Lcaron quoteright -74
+KPX Lcaron space -18
+KPX Lcaron y -74
+KPX Lcaron yacute -74
+KPX Lcaron ydieresis -74
+KPX Lcommaaccent T -74
+KPX Lcommaaccent Tcaron -74
+KPX Lcommaaccent Tcommaaccent -74
+KPX Lcommaaccent V -92
+KPX Lcommaaccent W -92
+KPX Lcommaaccent Y -92
+KPX Lcommaaccent Yacute -92
+KPX Lcommaaccent Ydieresis -92
+KPX Lcommaaccent quoteright -74
+KPX Lcommaaccent space -18
+KPX Lcommaaccent y -74
+KPX Lcommaaccent yacute -74
+KPX Lcommaaccent ydieresis -74
+KPX Lslash T -74
+KPX Lslash Tcaron -74
+KPX Lslash Tcommaaccent -74
+KPX Lslash V -92
+KPX Lslash W -92
+KPX Lslash Y -92
+KPX Lslash Yacute -92
+KPX Lslash Ydieresis -92
+KPX Lslash quoteright -74
+KPX Lslash space -18
+KPX Lslash y -74
+KPX Lslash yacute -74
+KPX Lslash ydieresis -74
+KPX P A -74
+KPX P Aacute -74
+KPX P Abreve -74
+KPX P Acircumflex -74
+KPX P Adieresis -74
+KPX P Agrave -74
+KPX P Amacron -74
+KPX P Aogonek -74
+KPX P Aring -74
+KPX P Atilde -74
+KPX P comma -129
+KPX P period -129
+KPX R T -55
+KPX R Tcaron -55
+KPX R Tcommaaccent -55
+KPX R V -74
+KPX R W -37
+KPX R Y -55
+KPX R Yacute -55
+KPX R Ydieresis -55
+KPX R y -30
+KPX R yacute -30
+KPX R ydieresis -30
+KPX Racute T -55
+KPX Racute Tcaron -55
+KPX Racute Tcommaaccent -55
+KPX Racute V -74
+KPX Racute W -37
+KPX Racute Y -55
+KPX Racute Yacute -55
+KPX Racute Ydieresis -55
+KPX Racute y -30
+KPX Racute yacute -30
+KPX Racute ydieresis -30
+KPX Rcaron T -55
+KPX Rcaron Tcaron -55
+KPX Rcaron Tcommaaccent -55
+KPX Rcaron V -74
+KPX Rcaron W -37
+KPX Rcaron Y -55
+KPX Rcaron Yacute -55
+KPX Rcaron Ydieresis -55
+KPX Rcaron y -30
+KPX Rcaron yacute -30
+KPX Rcaron ydieresis -30
+KPX Rcommaaccent T -55
+KPX Rcommaaccent Tcaron -55
+KPX Rcommaaccent Tcommaaccent -55
+KPX Rcommaaccent V -74
+KPX Rcommaaccent W -37
+KPX Rcommaaccent Y -55
+KPX Rcommaaccent Yacute -55
+KPX Rcommaaccent Ydieresis -55
+KPX Rcommaaccent y -30
+KPX Rcommaaccent yacute -30
+KPX Rcommaaccent ydieresis -30
+KPX T A -92
+KPX T Aacute -92
+KPX T Abreve -92
+KPX T Acircumflex -92
+KPX T Adieresis -92
+KPX T Agrave -92
+KPX T Amacron -92
+KPX T Aogonek -92
+KPX T Aring -92
+KPX T Atilde -92
+KPX T a -111
+KPX T aacute -111
+KPX T abreve -71
+KPX T acircumflex -71
+KPX T adieresis -71
+KPX T agrave -71
+KPX T amacron -71
+KPX T aogonek -111
+KPX T aring -111
+KPX T atilde -111
+KPX T c -129
+KPX T cacute -129
+KPX T ccaron -129
+KPX T ccedilla -129
+KPX T colon -74
+KPX T comma -92
+KPX T e -111
+KPX T eacute -111
+KPX T ecaron -111
+KPX T ecircumflex -71
+KPX T edieresis -71
+KPX T edotaccent -111
+KPX T egrave -71
+KPX T emacron -71
+KPX T eogonek -111
+KPX T hyphen -92
+KPX T i -55
+KPX T iacute -55
+KPX T iogonek -55
+KPX T o -111
+KPX T oacute -111
+KPX T ocircumflex -111
+KPX T odieresis -111
+KPX T ograve -111
+KPX T ohungarumlaut -111
+KPX T omacron -111
+KPX T oslash -111
+KPX T otilde -111
+KPX T period -92
+KPX T r -111
+KPX T racute -111
+KPX T rcaron -71
+KPX T rcommaaccent -111
+KPX T s -111
+KPX T sacute -111
+KPX T scaron -71
+KPX T scedilla -111
+KPX T scommaaccent -111
+KPX T semicolon -74
+KPX T u -129
+KPX T uacute -129
+KPX T ucircumflex -129
+KPX T udieresis -129
+KPX T ugrave -129
+KPX T uhungarumlaut -129
+KPX T umacron -129
+KPX T uogonek -129
+KPX T uring -129
+KPX T w -90
+KPX T y -90
+KPX T yacute -90
+KPX T ydieresis -90
+KPX Tcaron A -92
+KPX Tcaron Aacute -92
+KPX Tcaron Abreve -92
+KPX Tcaron Acircumflex -92
+KPX Tcaron Adieresis -92
+KPX Tcaron Agrave -92
+KPX Tcaron Amacron -92
+KPX Tcaron Aogonek -92
+KPX Tcaron Aring -92
+KPX Tcaron Atilde -92
+KPX Tcaron a -111
+KPX Tcaron aacute -111
+KPX Tcaron abreve -71
+KPX Tcaron acircumflex -71
+KPX Tcaron adieresis -71
+KPX Tcaron agrave -71
+KPX Tcaron amacron -71
+KPX Tcaron aogonek -111
+KPX Tcaron aring -111
+KPX Tcaron atilde -111
+KPX Tcaron c -129
+KPX Tcaron cacute -129
+KPX Tcaron ccaron -129
+KPX Tcaron ccedilla -129
+KPX Tcaron colon -74
+KPX Tcaron comma -92
+KPX Tcaron e -111
+KPX Tcaron eacute -111
+KPX Tcaron ecaron -111
+KPX Tcaron ecircumflex -71
+KPX Tcaron edieresis -71
+KPX Tcaron edotaccent -111
+KPX Tcaron egrave -71
+KPX Tcaron emacron -71
+KPX Tcaron eogonek -111
+KPX Tcaron hyphen -92
+KPX Tcaron i -55
+KPX Tcaron iacute -55
+KPX Tcaron iogonek -55
+KPX Tcaron o -111
+KPX Tcaron oacute -111
+KPX Tcaron ocircumflex -111
+KPX Tcaron odieresis -111
+KPX Tcaron ograve -111
+KPX Tcaron ohungarumlaut -111
+KPX Tcaron omacron -111
+KPX Tcaron oslash -111
+KPX Tcaron otilde -111
+KPX Tcaron period -92
+KPX Tcaron r -111
+KPX Tcaron racute -111
+KPX Tcaron rcaron -71
+KPX Tcaron rcommaaccent -111
+KPX Tcaron s -111
+KPX Tcaron sacute -111
+KPX Tcaron scaron -71
+KPX Tcaron scedilla -111
+KPX Tcaron scommaaccent -111
+KPX Tcaron semicolon -74
+KPX Tcaron u -129
+KPX Tcaron uacute -129
+KPX Tcaron ucircumflex -129
+KPX Tcaron udieresis -129
+KPX Tcaron ugrave -129
+KPX Tcaron uhungarumlaut -129
+KPX Tcaron umacron -129
+KPX Tcaron uogonek -129
+KPX Tcaron uring -129
+KPX Tcaron w -90
+KPX Tcaron y -90
+KPX Tcaron yacute -90
+KPX Tcaron ydieresis -90
+KPX Tcommaaccent A -92
+KPX Tcommaaccent Aacute -92
+KPX Tcommaaccent Abreve -92
+KPX Tcommaaccent Acircumflex -92
+KPX Tcommaaccent Adieresis -92
+KPX Tcommaaccent Agrave -92
+KPX Tcommaaccent Amacron -92
+KPX Tcommaaccent Aogonek -92
+KPX Tcommaaccent Aring -92
+KPX Tcommaaccent Atilde -92
+KPX Tcommaaccent a -111
+KPX Tcommaaccent aacute -111
+KPX Tcommaaccent abreve -71
+KPX Tcommaaccent acircumflex -71
+KPX Tcommaaccent adieresis -71
+KPX Tcommaaccent agrave -71
+KPX Tcommaaccent amacron -71
+KPX Tcommaaccent aogonek -111
+KPX Tcommaaccent aring -111
+KPX Tcommaaccent atilde -111
+KPX Tcommaaccent c -129
+KPX Tcommaaccent cacute -129
+KPX Tcommaaccent ccaron -129
+KPX Tcommaaccent ccedilla -129
+KPX Tcommaaccent colon -74
+KPX Tcommaaccent comma -92
+KPX Tcommaaccent e -111
+KPX Tcommaaccent eacute -111
+KPX Tcommaaccent ecaron -111
+KPX Tcommaaccent ecircumflex -71
+KPX Tcommaaccent edieresis -71
+KPX Tcommaaccent edotaccent -111
+KPX Tcommaaccent egrave -71
+KPX Tcommaaccent emacron -71
+KPX Tcommaaccent eogonek -111
+KPX Tcommaaccent hyphen -92
+KPX Tcommaaccent i -55
+KPX Tcommaaccent iacute -55
+KPX Tcommaaccent iogonek -55
+KPX Tcommaaccent o -111
+KPX Tcommaaccent oacute -111
+KPX Tcommaaccent ocircumflex -111
+KPX Tcommaaccent odieresis -111
+KPX Tcommaaccent ograve -111
+KPX Tcommaaccent ohungarumlaut -111
+KPX Tcommaaccent omacron -111
+KPX Tcommaaccent oslash -111
+KPX Tcommaaccent otilde -111
+KPX Tcommaaccent period -92
+KPX Tcommaaccent r -111
+KPX Tcommaaccent racute -111
+KPX Tcommaaccent rcaron -71
+KPX Tcommaaccent rcommaaccent -111
+KPX Tcommaaccent s -111
+KPX Tcommaaccent sacute -111
+KPX Tcommaaccent scaron -71
+KPX Tcommaaccent scedilla -111
+KPX Tcommaaccent scommaaccent -111
+KPX Tcommaaccent semicolon -74
+KPX Tcommaaccent u -129
+KPX Tcommaaccent uacute -129
+KPX Tcommaaccent ucircumflex -129
+KPX Tcommaaccent udieresis -129
+KPX Tcommaaccent ugrave -129
+KPX Tcommaaccent uhungarumlaut -129
+KPX Tcommaaccent umacron -129
+KPX Tcommaaccent uogonek -129
+KPX Tcommaaccent uring -129
+KPX Tcommaaccent w -90
+KPX Tcommaaccent y -90
+KPX Tcommaaccent yacute -90
+KPX Tcommaaccent ydieresis -90
+KPX V A -129
+KPX V Aacute -129
+KPX V Abreve -129
+KPX V Acircumflex -129
+KPX V Adieresis -129
+KPX V Agrave -129
+KPX V Amacron -129
+KPX V Aogonek -129
+KPX V Aring -129
+KPX V Atilde -129
+KPX V a -111
+KPX V aacute -111
+KPX V abreve -71
+KPX V acircumflex -111
+KPX V adieresis -111
+KPX V agrave -111
+KPX V amacron -111
+KPX V aogonek -111
+KPX V aring -111
+KPX V atilde -71
+KPX V colon -74
+KPX V comma -129
+KPX V e -111
+KPX V eacute -111
+KPX V ecaron -111
+KPX V ecircumflex -111
+KPX V edieresis -111
+KPX V edotaccent -111
+KPX V egrave -111
+KPX V emacron -111
+KPX V eogonek -111
+KPX V hyphen -92
+KPX V i -55
+KPX V iacute -55
+KPX V iogonek -55
+KPX V o -111
+KPX V oacute -111
+KPX V ocircumflex -111
+KPX V odieresis -111
+KPX V ograve -111
+KPX V ohungarumlaut -111
+KPX V omacron -111
+KPX V oslash -111
+KPX V otilde -111
+KPX V period -129
+KPX V r -111
+KPX V racute -111
+KPX V rcaron -71
+KPX V rcommaaccent -111
+KPX V semicolon -74
+KPX V u -92
+KPX V uacute -92
+KPX V ucircumflex -92
+KPX V udieresis -92
+KPX V ugrave -92
+KPX V uhungarumlaut -92
+KPX V umacron -92
+KPX V uogonek -92
+KPX V uring -92
+KPX V y -90
+KPX V yacute -90
+KPX V ydieresis -90
+KPX W A -90
+KPX W Aacute -90
+KPX W Abreve -90
+KPX W Acircumflex -90
+KPX W Adieresis -90
+KPX W Agrave -90
+KPX W Amacron -90
+KPX W Aogonek -90
+KPX W Aring -90
+KPX W Atilde -90
+KPX W a -74
+KPX W aacute -74
+KPX W abreve -74
+KPX W acircumflex -74
+KPX W adieresis -74
+KPX W agrave -74
+KPX W amacron -74
+KPX W aogonek -74
+KPX W aring -74
+KPX W atilde -74
+KPX W colon -37
+KPX W comma -92
+KPX W e -74
+KPX W eacute -74
+KPX W ecaron -74
+KPX W ecircumflex -74
+KPX W edieresis -74
+KPX W edotaccent -74
+KPX W egrave -74
+KPX W emacron -74
+KPX W eogonek -74
+KPX W hyphen -37
+KPX W i -37
+KPX W iacute -37
+KPX W iogonek -37
+KPX W o -74
+KPX W oacute -74
+KPX W ocircumflex -74
+KPX W odieresis -74
+KPX W ograve -74
+KPX W ohungarumlaut -74
+KPX W omacron -74
+KPX W oslash -74
+KPX W otilde -74
+KPX W period -37
+KPX W r -74
+KPX W racute -74
+KPX W rcaron -74
+KPX W rcommaaccent -74
+KPX W semicolon -37
+KPX W u -74
+KPX W uacute -74
+KPX W ucircumflex -74
+KPX W udieresis -74
+KPX W ugrave -74
+KPX W uhungarumlaut -74
+KPX W umacron -74
+KPX W uogonek -74
+KPX W uring -74
+KPX W y -74
+KPX W yacute -74
+KPX W ydieresis -74
+KPX Y A -55
+KPX Y Aacute -55
+KPX Y Abreve -55
+KPX Y Acircumflex -55
+KPX Y Adieresis -55
+KPX Y Agrave -55
+KPX Y Amacron -55
+KPX Y Aogonek -55
+KPX Y Aring -55
+KPX Y Atilde -55
+KPX Y a -74
+KPX Y aacute -74
+KPX Y abreve -74
+KPX Y acircumflex -74
+KPX Y adieresis -74
+KPX Y agrave -74
+KPX Y amacron -74
+KPX Y aogonek -74
+KPX Y aring -74
+KPX Y atilde -74
+KPX Y colon -55
+KPX Y comma -74
+KPX Y e -74
+KPX Y eacute -74
+KPX Y ecaron -74
+KPX Y ecircumflex -74
+KPX Y edieresis -74
+KPX Y edotaccent -74
+KPX Y egrave -74
+KPX Y emacron -74
+KPX Y eogonek -74
+KPX Y hyphen -74
+KPX Y i -55
+KPX Y iacute -55
+KPX Y iogonek -55
+KPX Y o -74
+KPX Y oacute -74
+KPX Y ocircumflex -74
+KPX Y odieresis -74
+KPX Y ograve -74
+KPX Y ohungarumlaut -74
+KPX Y omacron -74
+KPX Y oslash -74
+KPX Y otilde -74
+KPX Y p -74
+KPX Y period -74
+KPX Y q -92
+KPX Y semicolon -55
+KPX Y u -74
+KPX Y uacute -74
+KPX Y ucircumflex -74
+KPX Y udieresis -74
+KPX Y ugrave -74
+KPX Y uhungarumlaut -74
+KPX Y umacron -74
+KPX Y uogonek -74
+KPX Y uring -74
+KPX Y v -74
+KPX Yacute A -55
+KPX Yacute Aacute -55
+KPX Yacute Abreve -55
+KPX Yacute Acircumflex -55
+KPX Yacute Adieresis -55
+KPX Yacute Agrave -55
+KPX Yacute Amacron -55
+KPX Yacute Aogonek -55
+KPX Yacute Aring -55
+KPX Yacute Atilde -55
+KPX Yacute a -74
+KPX Yacute aacute -74
+KPX Yacute abreve -74
+KPX Yacute acircumflex -74
+KPX Yacute adieresis -74
+KPX Yacute agrave -74
+KPX Yacute amacron -74
+KPX Yacute aogonek -74
+KPX Yacute aring -74
+KPX Yacute atilde -74
+KPX Yacute colon -55
+KPX Yacute comma -74
+KPX Yacute e -74
+KPX Yacute eacute -74
+KPX Yacute ecaron -74
+KPX Yacute ecircumflex -74
+KPX Yacute edieresis -74
+KPX Yacute edotaccent -74
+KPX Yacute egrave -74
+KPX Yacute emacron -74
+KPX Yacute eogonek -74
+KPX Yacute hyphen -74
+KPX Yacute i -55
+KPX Yacute iacute -55
+KPX Yacute iogonek -55
+KPX Yacute o -74
+KPX Yacute oacute -74
+KPX Yacute ocircumflex -74
+KPX Yacute odieresis -74
+KPX Yacute ograve -74
+KPX Yacute ohungarumlaut -74
+KPX Yacute omacron -74
+KPX Yacute oslash -74
+KPX Yacute otilde -74
+KPX Yacute p -74
+KPX Yacute period -74
+KPX Yacute q -92
+KPX Yacute semicolon -55
+KPX Yacute u -74
+KPX Yacute uacute -74
+KPX Yacute ucircumflex -74
+KPX Yacute udieresis -74
+KPX Yacute ugrave -74
+KPX Yacute uhungarumlaut -74
+KPX Yacute umacron -74
+KPX Yacute uogonek -74
+KPX Yacute uring -74
+KPX Yacute v -74
+KPX Ydieresis A -55
+KPX Ydieresis Aacute -55
+KPX Ydieresis Abreve -55
+KPX Ydieresis Acircumflex -55
+KPX Ydieresis Adieresis -55
+KPX Ydieresis Agrave -55
+KPX Ydieresis Amacron -55
+KPX Ydieresis Aogonek -55
+KPX Ydieresis Aring -55
+KPX Ydieresis Atilde -55
+KPX Ydieresis a -74
+KPX Ydieresis aacute -74
+KPX Ydieresis abreve -74
+KPX Ydieresis acircumflex -74
+KPX Ydieresis adieresis -74
+KPX Ydieresis agrave -74
+KPX Ydieresis amacron -74
+KPX Ydieresis aogonek -74
+KPX Ydieresis aring -74
+KPX Ydieresis atilde -74
+KPX Ydieresis colon -55
+KPX Ydieresis comma -74
+KPX Ydieresis e -74
+KPX Ydieresis eacute -74
+KPX Ydieresis ecaron -74
+KPX Ydieresis ecircumflex -74
+KPX Ydieresis edieresis -74
+KPX Ydieresis edotaccent -74
+KPX Ydieresis egrave -74
+KPX Ydieresis emacron -74
+KPX Ydieresis eogonek -74
+KPX Ydieresis hyphen -74
+KPX Ydieresis i -55
+KPX Ydieresis iacute -55
+KPX Ydieresis iogonek -55
+KPX Ydieresis o -74
+KPX Ydieresis oacute -74
+KPX Ydieresis ocircumflex -74
+KPX Ydieresis odieresis -74
+KPX Ydieresis ograve -74
+KPX Ydieresis ohungarumlaut -74
+KPX Ydieresis omacron -74
+KPX Ydieresis oslash -74
+KPX Ydieresis otilde -74
+KPX Ydieresis p -74
+KPX Ydieresis period -74
+KPX Ydieresis q -92
+KPX Ydieresis semicolon -55
+KPX Ydieresis u -74
+KPX Ydieresis uacute -74
+KPX Ydieresis ucircumflex -74
+KPX Ydieresis udieresis -74
+KPX Ydieresis ugrave -74
+KPX Ydieresis uhungarumlaut -74
+KPX Ydieresis umacron -74
+KPX Ydieresis uogonek -74
+KPX Ydieresis uring -74
+KPX Ydieresis v -74
+KPX f f -18
+KPX f quoteright 37
+KPX one one -37
+KPX quoteleft quoteleft -55
+KPX quoteright quoteright -55
+KPX quoteright s -55
+KPX quoteright sacute -55
+KPX quoteright scaron -55
+KPX quoteright scedilla -55
+KPX quoteright scommaaccent -55
+KPX quoteright space -55
+KPX quoteright t -18
+KPX quoteright tcommaaccent -18
+KPX r comma -55
+KPX r hyphen -18
+KPX r period -55
+KPX r quoteright 55
+KPX racute comma -55
+KPX racute hyphen -18
+KPX racute period -55
+KPX racute quoteright 55
+KPX rcaron comma -55
+KPX rcaron hyphen -18
+KPX rcaron period -55
+KPX rcaron quoteright 55
+KPX rcommaaccent comma -55
+KPX rcommaaccent hyphen -18
+KPX rcommaaccent period -55
+KPX rcommaaccent quoteright 55
+KPX v comma -111
+KPX v period -111
+KPX w comma -92
+KPX w period -92
+KPX y comma -92
+KPX y period -92
+KPX yacute comma -92
+KPX yacute period -92
+KPX ydieresis comma -92
+KPX ydieresis period -92
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/src/fonts/Adobe-Core35_AFMs-314/Palatino-BoldItalic.afm b/src/fonts/Adobe-Core35_AFMs-314/Palatino-BoldItalic.afm
new file mode 100644
index 0000000..b52e44f
--- /dev/null
+++ b/src/fonts/Adobe-Core35_AFMs-314/Palatino-BoldItalic.afm
@@ -0,0 +1,1316 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1985, 1987, 1989, 1990, 1992, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Thu May 1 13:37:00 1997
+Comment UniqueID 43076
+Comment VMusage 51697 66722
+FontName Palatino-BoldItalic
+FullName Palatino Bold Italic
+FamilyName Palatino
+Weight Bold
+ItalicAngle -10
+IsFixedPitch false
+FontBBox -170 -271 1073 926
+UnderlinePosition -100
+UnderlineThickness 50
+Version 002.000
+Notice Copyright (c) 1985, 1987, 1989, 1990, 1992, 1997 Adobe Systems Incorporated. All Rights Reserved.Palatino is a trademark of Linotype-Hell AG and/or its subsidiaries.
+EncodingScheme AdobeStandardEncoding
+CapHeight 681
+XHeight 469
+Ascender 726
+Descender -281
+StdHW 55
+StdVW 122
+StartCharMetrics 314
+C 32 ; WX 250 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 333 ; N exclam ; B 58 -17 322 695 ;
+C 34 ; WX 500 ; N quotedbl ; B 137 467 493 720 ;
+C 35 ; WX 500 ; N numbersign ; B 4 0 496 673 ;
+C 36 ; WX 500 ; N dollar ; B 20 -108 477 737 ;
+C 37 ; WX 889 ; N percent ; B 56 -17 790 697 ;
+C 38 ; WX 833 ; N ampersand ; B 74 -17 811 695 ;
+C 39 ; WX 278 ; N quoteright ; B 76 431 302 720 ;
+C 40 ; WX 333 ; N parenleft ; B 58 -129 368 723 ;
+C 41 ; WX 333 ; N parenright ; B -12 -129 298 723 ;
+C 42 ; WX 444 ; N asterisk ; B 84 332 439 695 ;
+C 43 ; WX 606 ; N plus ; B 50 -5 556 501 ;
+C 44 ; WX 250 ; N comma ; B -33 -164 208 147 ;
+C 45 ; WX 389 ; N hyphen ; B 37 198 362 300 ;
+C 46 ; WX 250 ; N period ; B 48 -17 187 135 ;
+C 47 ; WX 315 ; N slash ; B 1 -17 315 720 ;
+C 48 ; WX 500 ; N zero ; B 42 -17 490 683 ;
+C 49 ; WX 500 ; N one ; B 41 -3 434 678 ;
+C 50 ; WX 500 ; N two ; B 1 -3 454 683 ;
+C 51 ; WX 500 ; N three ; B 8 -17 450 683 ;
+C 52 ; WX 500 ; N four ; B 3 -3 487 683 ;
+C 53 ; WX 500 ; N five ; B 14 -17 481 675 ;
+C 54 ; WX 500 ; N six ; B 39 -17 488 683 ;
+C 55 ; WX 500 ; N seven ; B 69 -3 544 674 ;
+C 56 ; WX 500 ; N eight ; B 26 -17 484 683 ;
+C 57 ; WX 500 ; N nine ; B 27 -17 491 683 ;
+C 58 ; WX 250 ; N colon ; B 38 -17 236 452 ;
+C 59 ; WX 250 ; N semicolon ; B -33 -164 247 452 ;
+C 60 ; WX 606 ; N less ; B 49 -21 558 517 ;
+C 61 ; WX 606 ; N equal ; B 51 106 555 390 ;
+C 62 ; WX 606 ; N greater ; B 48 -21 557 517 ;
+C 63 ; WX 444 ; N question ; B 91 -17 450 695 ;
+C 64 ; WX 833 ; N at ; B 82 -12 744 681 ;
+C 65 ; WX 722 ; N A ; B -35 -3 685 683 ;
+C 66 ; WX 667 ; N B ; B 8 -3 629 681 ;
+C 67 ; WX 685 ; N C ; B 69 -17 695 695 ;
+C 68 ; WX 778 ; N D ; B 0 -3 747 682 ;
+C 69 ; WX 611 ; N E ; B 11 -3 606 681 ;
+C 70 ; WX 556 ; N F ; B -6 -3 593 681 ;
+C 71 ; WX 778 ; N G ; B 72 -17 750 695 ;
+C 72 ; WX 778 ; N H ; B -12 -3 826 681 ;
+C 73 ; WX 389 ; N I ; B -1 -3 412 681 ;
+C 74 ; WX 389 ; N J ; B -29 -207 417 681 ;
+C 75 ; WX 722 ; N K ; B -10 -3 746 681 ;
+C 76 ; WX 611 ; N L ; B 26 -3 578 681 ;
+C 77 ; WX 944 ; N M ; B -23 -17 985 681 ;
+C 78 ; WX 778 ; N N ; B -2 -3 829 681 ;
+C 79 ; WX 833 ; N O ; B 76 -17 794 695 ;
+C 80 ; WX 667 ; N P ; B 11 -3 673 681 ;
+C 81 ; WX 833 ; N Q ; B 76 -222 794 695 ;
+C 82 ; WX 722 ; N R ; B 4 -3 697 681 ;
+C 83 ; WX 556 ; N S ; B 50 -17 517 695 ;
+C 84 ; WX 611 ; N T ; B 56 -3 674 681 ;
+C 85 ; WX 778 ; N U ; B 83 -17 825 681 ;
+C 86 ; WX 667 ; N V ; B 67 -3 745 681 ;
+C 87 ; WX 1000 ; N W ; B 67 -3 1073 689 ;
+C 88 ; WX 722 ; N X ; B -9 -3 772 681 ;
+C 89 ; WX 611 ; N Y ; B 54 -3 675 695 ;
+C 90 ; WX 667 ; N Z ; B 1 -3 676 681 ;
+C 91 ; WX 333 ; N bracketleft ; B 45 -102 381 723 ;
+C 92 ; WX 606 ; N backslash ; B 72 0 534 720 ;
+C 93 ; WX 333 ; N bracketright ; B -21 -102 315 723 ;
+C 94 ; WX 606 ; N asciicircum ; B 63 275 543 678 ;
+C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;
+C 96 ; WX 278 ; N quoteleft ; B 65 431 291 720 ;
+C 97 ; WX 556 ; N a ; B 44 -17 519 470 ;
+C 98 ; WX 537 ; N b ; B 44 -17 494 726 ;
+C 99 ; WX 444 ; N c ; B 32 -17 436 469 ;
+C 100 ; WX 556 ; N d ; B 38 -17 550 726 ;
+C 101 ; WX 444 ; N e ; B 28 -17 418 469 ;
+C 102 ; WX 333 ; N f ; B -130 -271 449 726 ; L i fi ; L l fl ;
+C 103 ; WX 500 ; N g ; B -50 -271 529 469 ;
+C 104 ; WX 556 ; N h ; B 22 -17 522 726 ;
+C 105 ; WX 333 ; N i ; B 26 -17 312 695 ;
+C 106 ; WX 333 ; N j ; B -64 -271 323 695 ;
+C 107 ; WX 556 ; N k ; B 34 -17 528 726 ;
+C 108 ; WX 333 ; N l ; B 64 -17 318 726 ;
+C 109 ; WX 833 ; N m ; B 19 -17 803 469 ;
+C 110 ; WX 556 ; N n ; B 17 -17 521 469 ;
+C 111 ; WX 556 ; N o ; B 48 -17 502 469 ;
+C 112 ; WX 556 ; N p ; B -21 -271 516 469 ;
+C 113 ; WX 537 ; N q ; B 32 -271 513 469 ;
+C 114 ; WX 389 ; N r ; B 20 -17 411 469 ;
+C 115 ; WX 444 ; N s ; B 25 -17 406 469 ;
+C 116 ; WX 389 ; N t ; B 42 -17 409 636 ;
+C 117 ; WX 556 ; N u ; B 22 -17 521 469 ;
+C 118 ; WX 556 ; N v ; B 19 -17 513 469 ;
+C 119 ; WX 833 ; N w ; B 27 -17 802 469 ;
+C 120 ; WX 500 ; N x ; B -8 -17 500 469 ;
+C 121 ; WX 556 ; N y ; B 13 -271 541 469 ;
+C 122 ; WX 500 ; N z ; B 31 -17 470 469 ;
+C 123 ; WX 333 ; N braceleft ; B 18 -105 334 720 ;
+C 124 ; WX 606 ; N bar ; B 259 -250 347 750 ;
+C 125 ; WX 333 ; N braceright ; B -1 -105 315 720 ;
+C 126 ; WX 606 ; N asciitilde ; B 51 151 555 346 ;
+C 161 ; WX 333 ; N exclamdown ; B 2 -225 259 479 ;
+C 162 ; WX 500 ; N cent ; B 52 -105 456 547 ;
+C 163 ; WX 500 ; N sterling ; B 21 -5 501 683 ;
+C 164 ; WX 167 ; N fraction ; B -170 0 338 683 ;
+C 165 ; WX 500 ; N yen ; B 11 -3 538 695 ;
+C 166 ; WX 500 ; N florin ; B 8 -242 479 690 ;
+C 167 ; WX 556 ; N section ; B 47 -151 497 695 ;
+C 168 ; WX 500 ; N currency ; B 32 96 468 533 ;
+C 169 ; WX 250 ; N quotesingle ; B 127 467 293 720 ;
+C 170 ; WX 500 ; N quotedblleft ; B 65 431 511 720 ;
+C 171 ; WX 500 ; N guillemotleft ; B 35 43 458 446 ;
+C 172 ; WX 333 ; N guilsinglleft ; B 60 43 292 446 ;
+C 173 ; WX 333 ; N guilsinglright ; B 35 40 267 443 ;
+C 174 ; WX 611 ; N fi ; B -130 -271 588 726 ;
+C 175 ; WX 611 ; N fl ; B -130 -271 631 726 ;
+C 177 ; WX 500 ; N endash ; B -12 214 512 282 ;
+C 178 ; WX 556 ; N dagger ; B 67 -3 499 685 ;
+C 179 ; WX 556 ; N daggerdbl ; B 33 -153 537 693 ;
+C 180 ; WX 250 ; N periodcentered ; B 67 172 206 324 ;
+C 182 ; WX 556 ; N paragraph ; B 14 -204 629 681 ;
+C 183 ; WX 606 ; N bullet ; B 131 172 475 516 ;
+C 184 ; WX 250 ; N quotesinglbase ; B -3 -144 220 145 ;
+C 185 ; WX 500 ; N quotedblbase ; B -18 -144 424 145 ;
+C 186 ; WX 500 ; N quotedblright ; B 73 431 519 720 ;
+C 187 ; WX 500 ; N guillemotright ; B 35 40 458 443 ;
+C 188 ; WX 1000 ; N ellipsis ; B 91 -17 896 135 ;
+C 189 ; WX 1000 ; N perthousand ; B 65 -17 912 691 ;
+C 191 ; WX 444 ; N questiondown ; B -12 -226 347 479 ;
+C 193 ; WX 333 ; N grave ; B 110 518 322 699 ;
+C 194 ; WX 333 ; N acute ; B 153 518 392 699 ;
+C 195 ; WX 333 ; N circumflex ; B 88 518 415 692 ;
+C 196 ; WX 333 ; N tilde ; B 82 537 441 656 ;
+C 197 ; WX 333 ; N macron ; B 76 538 418 608 ;
+C 198 ; WX 333 ; N breve ; B 96 518 412 680 ;
+C 199 ; WX 333 ; N dotaccent ; B 202 564 325 695 ;
+C 200 ; WX 333 ; N dieresis ; B 90 564 426 695 ;
+C 202 ; WX 556 ; N ring ; B 277 514 477 714 ;
+C 203 ; WX 333 ; N cedilla ; B 12 -218 248 5 ;
+C 205 ; WX 333 ; N hungarumlaut ; B -28 518 409 699 ;
+C 206 ; WX 333 ; N ogonek ; B 76 -226 260 -18 ;
+C 207 ; WX 333 ; N caron ; B 113 518 445 692 ;
+C 208 ; WX 1000 ; N emdash ; B -12 214 1012 282 ;
+C 225 ; WX 944 ; N AE ; B -29 -3 927 681 ;
+C 227 ; WX 333 ; N ordfeminine ; B 47 391 355 684 ;
+C 232 ; WX 611 ; N Lslash ; B 6 -3 578 681 ;
+C 233 ; WX 833 ; N Oslash ; B 57 -54 797 730 ;
+C 234 ; WX 944 ; N OE ; B 39 -17 961 695 ;
+C 235 ; WX 333 ; N ordmasculine ; B 51 391 346 683 ;
+C 241 ; WX 738 ; N ae ; B 44 -17 711 469 ;
+C 245 ; WX 333 ; N dotlessi ; B 26 -17 293 469 ;
+C 248 ; WX 333 ; N lslash ; B 13 -17 365 726 ;
+C 249 ; WX 556 ; N oslash ; B 14 -50 522 506 ;
+C 250 ; WX 778 ; N oe ; B 48 -17 755 469 ;
+C 251 ; WX 556 ; N germandbls ; B -131 -271 549 726 ;
+C -1 ; WX 389 ; N Idieresis ; B -1 -3 454 880 ;
+C -1 ; WX 444 ; N eacute ; B 28 -17 448 719 ;
+C -1 ; WX 556 ; N abreve ; B 44 -17 524 700 ;
+C -1 ; WX 556 ; N uhungarumlaut ; B 22 -17 621 719 ;
+C -1 ; WX 444 ; N ecaron ; B 28 -17 501 712 ;
+C -1 ; WX 611 ; N Ydieresis ; B 54 -3 675 880 ;
+C -1 ; WX 606 ; N divide ; B 50 -5 556 501 ;
+C -1 ; WX 611 ; N Yacute ; B 54 -3 675 911 ;
+C -1 ; WX 722 ; N Acircumflex ; B -35 -3 685 904 ;
+C -1 ; WX 556 ; N aacute ; B 44 -17 519 719 ;
+C -1 ; WX 778 ; N Ucircumflex ; B 83 -17 825 904 ;
+C -1 ; WX 556 ; N yacute ; B 13 -271 541 719 ;
+C -1 ; WX 444 ; N scommaaccent ; B 25 -271 406 469 ;
+C -1 ; WX 444 ; N ecircumflex ; B 28 -17 471 712 ;
+C -1 ; WX 778 ; N Uring ; B 83 -17 825 926 ;
+C -1 ; WX 778 ; N Udieresis ; B 83 -17 825 880 ;
+C -1 ; WX 556 ; N aogonek ; B 44 -216 519 470 ;
+C -1 ; WX 778 ; N Uacute ; B 83 -17 825 911 ;
+C -1 ; WX 556 ; N uogonek ; B 22 -210 521 469 ;
+C -1 ; WX 611 ; N Edieresis ; B 11 -3 606 880 ;
+C -1 ; WX 778 ; N Dcroat ; B 0 -3 747 682 ;
+C -1 ; WX 250 ; N commaaccent ; B -52 -271 102 -50 ;
+C -1 ; WX 747 ; N copyright ; B 26 -17 720 695 ;
+C -1 ; WX 611 ; N Emacron ; B 11 -3 606 820 ;
+C -1 ; WX 444 ; N ccaron ; B 32 -17 501 712 ;
+C -1 ; WX 556 ; N aring ; B 44 -17 519 734 ;
+C -1 ; WX 778 ; N Ncommaaccent ; B -2 -271 829 681 ;
+C -1 ; WX 333 ; N lacute ; B 64 -17 392 896 ;
+C -1 ; WX 556 ; N agrave ; B 44 -17 519 719 ;
+C -1 ; WX 611 ; N Tcommaaccent ; B 56 -271 674 681 ;
+C -1 ; WX 685 ; N Cacute ; B 69 -17 695 911 ;
+C -1 ; WX 556 ; N atilde ; B 44 -17 553 676 ;
+C -1 ; WX 611 ; N Edotaccent ; B 11 -3 606 880 ;
+C -1 ; WX 444 ; N scaron ; B 25 -17 489 712 ;
+C -1 ; WX 444 ; N scedilla ; B 25 -218 406 469 ;
+C -1 ; WX 333 ; N iacute ; B 26 -17 392 719 ;
+C -1 ; WX 471 ; N lozenge ; B 7 0 465 732 ;
+C -1 ; WX 722 ; N Rcaron ; B 4 -3 697 904 ;
+C -1 ; WX 778 ; N Gcommaaccent ; B 72 -271 750 695 ;
+C -1 ; WX 556 ; N ucircumflex ; B 22 -17 521 712 ;
+C -1 ; WX 556 ; N acircumflex ; B 44 -17 527 712 ;
+C -1 ; WX 722 ; N Amacron ; B -35 -3 685 820 ;
+C -1 ; WX 389 ; N rcaron ; B 20 -17 473 712 ;
+C -1 ; WX 444 ; N ccedilla ; B 27 -218 436 469 ;
+C -1 ; WX 667 ; N Zdotaccent ; B 1 -3 676 880 ;
+C -1 ; WX 667 ; N Thorn ; B 11 -3 644 681 ;
+C -1 ; WX 833 ; N Omacron ; B 76 -17 794 820 ;
+C -1 ; WX 722 ; N Racute ; B 4 -3 697 911 ;
+C -1 ; WX 556 ; N Sacute ; B 50 -17 517 911 ;
+C -1 ; WX 616 ; N dcaron ; B 38 -17 720 726 ;
+C -1 ; WX 778 ; N Umacron ; B 83 -17 825 820 ;
+C -1 ; WX 556 ; N uring ; B 22 -17 521 734 ;
+C -1 ; WX 300 ; N threesuperior ; B 23 263 310 683 ;
+C -1 ; WX 833 ; N Ograve ; B 76 -17 794 911 ;
+C -1 ; WX 722 ; N Agrave ; B -35 -3 685 911 ;
+C -1 ; WX 722 ; N Abreve ; B -35 -3 685 892 ;
+C -1 ; WX 606 ; N multiply ; B 72 17 534 479 ;
+C -1 ; WX 556 ; N uacute ; B 22 -17 521 719 ;
+C -1 ; WX 611 ; N Tcaron ; B 56 -3 674 904 ;
+C -1 ; WX 476 ; N partialdiff ; B 9 -38 467 718 ;
+C -1 ; WX 556 ; N ydieresis ; B 13 -271 541 668 ;
+C -1 ; WX 778 ; N Nacute ; B -2 -3 829 911 ;
+C -1 ; WX 333 ; N icircumflex ; B 26 -17 403 712 ;
+C -1 ; WX 611 ; N Ecircumflex ; B 11 -3 606 904 ;
+C -1 ; WX 556 ; N adieresis ; B 44 -17 538 688 ;
+C -1 ; WX 444 ; N edieresis ; B 28 -17 482 668 ;
+C -1 ; WX 444 ; N cacute ; B 32 -17 448 719 ;
+C -1 ; WX 556 ; N nacute ; B 17 -17 521 719 ;
+C -1 ; WX 556 ; N umacron ; B 22 -17 530 628 ;
+C -1 ; WX 778 ; N Ncaron ; B -2 -3 829 922 ;
+C -1 ; WX 389 ; N Iacute ; B -1 -3 420 911 ;
+C -1 ; WX 606 ; N plusminus ; B 50 0 556 501 ;
+C -1 ; WX 606 ; N brokenbar ; B 259 -175 347 675 ;
+C -1 ; WX 747 ; N registered ; B 26 -17 720 695 ;
+C -1 ; WX 778 ; N Gbreve ; B 72 -17 750 892 ;
+C -1 ; WX 389 ; N Idotaccent ; B -1 -3 412 880 ;
+C -1 ; WX 600 ; N summation ; B 15 -10 586 706 ;
+C -1 ; WX 611 ; N Egrave ; B 11 -3 606 911 ;
+C -1 ; WX 389 ; N racute ; B 20 -17 460 719 ;
+C -1 ; WX 556 ; N omacron ; B 48 -17 530 628 ;
+C -1 ; WX 667 ; N Zacute ; B 1 -3 676 911 ;
+C -1 ; WX 667 ; N Zcaron ; B 1 -3 676 904 ;
+C -1 ; WX 549 ; N greaterequal ; B 26 0 523 682 ;
+C -1 ; WX 778 ; N Eth ; B 0 -3 747 682 ;
+C -1 ; WX 685 ; N Ccedilla ; B 69 -218 695 695 ;
+C -1 ; WX 333 ; N lcommaaccent ; B 10 -271 318 726 ;
+C -1 ; WX 389 ; N tcaron ; B 42 -17 507 767 ;
+C -1 ; WX 444 ; N eogonek ; B 28 -216 418 469 ;
+C -1 ; WX 778 ; N Uogonek ; B 83 -210 825 681 ;
+C -1 ; WX 722 ; N Aacute ; B -35 -3 685 911 ;
+C -1 ; WX 722 ; N Adieresis ; B -35 -3 685 880 ;
+C -1 ; WX 444 ; N egrave ; B 28 -17 418 719 ;
+C -1 ; WX 500 ; N zacute ; B 31 -17 476 719 ;
+C -1 ; WX 333 ; N iogonek ; B 26 -214 312 695 ;
+C -1 ; WX 833 ; N Oacute ; B 76 -17 794 911 ;
+C -1 ; WX 556 ; N oacute ; B 48 -17 504 719 ;
+C -1 ; WX 556 ; N amacron ; B 44 -17 530 628 ;
+C -1 ; WX 444 ; N sacute ; B 25 -17 448 719 ;
+C -1 ; WX 333 ; N idieresis ; B 26 -17 426 668 ;
+C -1 ; WX 833 ; N Ocircumflex ; B 76 -17 794 904 ;
+C -1 ; WX 778 ; N Ugrave ; B 83 -17 825 911 ;
+C -1 ; WX 614 ; N Delta ; B 6 0 608 688 ;
+C -1 ; WX 556 ; N thorn ; B -21 -271 516 726 ;
+C -1 ; WX 300 ; N twosuperior ; B 26 271 321 683 ;
+C -1 ; WX 833 ; N Odieresis ; B 76 -17 794 880 ;
+C -1 ; WX 556 ; N mu ; B -15 -232 521 469 ;
+C -1 ; WX 333 ; N igrave ; B 26 -17 322 719 ;
+C -1 ; WX 556 ; N ohungarumlaut ; B 48 -17 631 719 ;
+C -1 ; WX 611 ; N Eogonek ; B 11 -207 606 681 ;
+C -1 ; WX 556 ; N dcroat ; B 38 -17 604 726 ;
+C -1 ; WX 750 ; N threequarters ; B 18 -2 732 683 ;
+C -1 ; WX 556 ; N Scedilla ; B 50 -218 517 695 ;
+C -1 ; WX 383 ; N lcaron ; B 64 -17 488 726 ;
+C -1 ; WX 722 ; N Kcommaaccent ; B -10 -271 746 681 ;
+C -1 ; WX 611 ; N Lacute ; B 26 -3 578 911 ;
+C -1 ; WX 1000 ; N trademark ; B 38 274 961 678 ;
+C -1 ; WX 444 ; N edotaccent ; B 28 -17 418 668 ;
+C -1 ; WX 389 ; N Igrave ; B -1 -3 412 911 ;
+C -1 ; WX 389 ; N Imacron ; B -1 -3 446 820 ;
+C -1 ; WX 611 ; N Lcaron ; B 26 -3 623 695 ;
+C -1 ; WX 750 ; N onehalf ; B 14 -2 736 683 ;
+C -1 ; WX 549 ; N lessequal ; B 26 0 523 682 ;
+C -1 ; WX 556 ; N ocircumflex ; B 48 -17 527 712 ;
+C -1 ; WX 556 ; N ntilde ; B 17 -17 553 676 ;
+C -1 ; WX 778 ; N Uhungarumlaut ; B 83 -17 825 911 ;
+C -1 ; WX 611 ; N Eacute ; B 11 -3 606 911 ;
+C -1 ; WX 444 ; N emacron ; B 28 -17 474 628 ;
+C -1 ; WX 500 ; N gbreve ; B -50 -271 529 700 ;
+C -1 ; WX 750 ; N onequarter ; B 18 -2 732 683 ;
+C -1 ; WX 556 ; N Scaron ; B 50 -17 557 904 ;
+C -1 ; WX 556 ; N Scommaaccent ; B 50 -271 517 695 ;
+C -1 ; WX 833 ; N Ohungarumlaut ; B 76 -17 794 911 ;
+C -1 ; WX 400 ; N degree ; B 50 383 350 683 ;
+C -1 ; WX 556 ; N ograve ; B 48 -17 502 719 ;
+C -1 ; WX 685 ; N Ccaron ; B 69 -17 695 904 ;
+C -1 ; WX 556 ; N ugrave ; B 22 -17 521 719 ;
+C -1 ; WX 453 ; N radical ; B -9 -91 463 765 ;
+C -1 ; WX 778 ; N Dcaron ; B 0 -3 747 904 ;
+C -1 ; WX 389 ; N rcommaaccent ; B -22 -271 411 469 ;
+C -1 ; WX 778 ; N Ntilde ; B -2 -3 829 868 ;
+C -1 ; WX 556 ; N otilde ; B 48 -17 553 676 ;
+C -1 ; WX 722 ; N Rcommaaccent ; B 4 -271 697 681 ;
+C -1 ; WX 611 ; N Lcommaaccent ; B 26 -271 578 681 ;
+C -1 ; WX 722 ; N Atilde ; B -35 -3 685 868 ;
+C -1 ; WX 722 ; N Aogonek ; B -35 -210 696 683 ;
+C -1 ; WX 722 ; N Aring ; B -35 -3 685 926 ;
+C -1 ; WX 833 ; N Otilde ; B 76 -17 794 868 ;
+C -1 ; WX 500 ; N zdotaccent ; B 31 -17 470 668 ;
+C -1 ; WX 611 ; N Ecaron ; B 11 -3 606 904 ;
+C -1 ; WX 389 ; N Iogonek ; B -1 -210 412 681 ;
+C -1 ; WX 556 ; N kcommaaccent ; B 34 -271 528 726 ;
+C -1 ; WX 606 ; N minus ; B 51 204 555 292 ;
+C -1 ; WX 389 ; N Icircumflex ; B -1 -3 443 904 ;
+C -1 ; WX 556 ; N ncaron ; B 17 -17 557 712 ;
+C -1 ; WX 389 ; N tcommaaccent ; B 18 -271 409 636 ;
+C -1 ; WX 606 ; N logicalnot ; B 51 107 555 390 ;
+C -1 ; WX 556 ; N odieresis ; B 48 -17 538 668 ;
+C -1 ; WX 556 ; N udieresis ; B 22 -17 538 668 ;
+C -1 ; WX 549 ; N notequal ; B 12 -40 537 554 ;
+C -1 ; WX 500 ; N gcommaaccent ; B -50 -271 529 719 ;
+C -1 ; WX 556 ; N eth ; B 48 -17 546 726 ;
+C -1 ; WX 500 ; N zcaron ; B 31 -17 517 712 ;
+C -1 ; WX 556 ; N ncommaaccent ; B 17 -271 521 469 ;
+C -1 ; WX 300 ; N onesuperior ; B 41 271 298 680 ;
+C -1 ; WX 333 ; N imacron ; B 26 -17 375 608 ;
+EndCharMetrics
+StartKernData
+StartKernPairs 972
+KPX A T -55
+KPX A Tcaron -55
+KPX A Tcommaaccent -55
+KPX A V -74
+KPX A W -74
+KPX A Y -74
+KPX A Yacute -74
+KPX A Ydieresis -74
+KPX A quoteright -55
+KPX A space -55
+KPX A v -55
+KPX A w -37
+KPX A y -55
+KPX A yacute -55
+KPX A ydieresis -55
+KPX Aacute T -55
+KPX Aacute Tcaron -55
+KPX Aacute Tcommaaccent -55
+KPX Aacute V -74
+KPX Aacute W -74
+KPX Aacute Y -74
+KPX Aacute Yacute -74
+KPX Aacute Ydieresis -74
+KPX Aacute quoteright -55
+KPX Aacute space -55
+KPX Aacute v -55
+KPX Aacute w -37
+KPX Aacute y -55
+KPX Aacute yacute -55
+KPX Aacute ydieresis -55
+KPX Abreve T -55
+KPX Abreve Tcaron -55
+KPX Abreve Tcommaaccent -55
+KPX Abreve V -74
+KPX Abreve W -74
+KPX Abreve Y -74
+KPX Abreve Yacute -74
+KPX Abreve Ydieresis -74
+KPX Abreve quoteright -55
+KPX Abreve space -55
+KPX Abreve v -55
+KPX Abreve w -37
+KPX Abreve y -55
+KPX Abreve yacute -55
+KPX Abreve ydieresis -55
+KPX Acircumflex T -55
+KPX Acircumflex Tcaron -55
+KPX Acircumflex Tcommaaccent -55
+KPX Acircumflex V -74
+KPX Acircumflex W -74
+KPX Acircumflex Y -74
+KPX Acircumflex Yacute -74
+KPX Acircumflex Ydieresis -74
+KPX Acircumflex quoteright -55
+KPX Acircumflex space -55
+KPX Acircumflex v -55
+KPX Acircumflex w -37
+KPX Acircumflex y -55
+KPX Acircumflex yacute -55
+KPX Acircumflex ydieresis -55
+KPX Adieresis T -55
+KPX Adieresis Tcaron -55
+KPX Adieresis Tcommaaccent -55
+KPX Adieresis V -74
+KPX Adieresis W -74
+KPX Adieresis Y -74
+KPX Adieresis Yacute -74
+KPX Adieresis Ydieresis -74
+KPX Adieresis quoteright -55
+KPX Adieresis space -55
+KPX Adieresis v -55
+KPX Adieresis w -37
+KPX Adieresis y -55
+KPX Adieresis yacute -55
+KPX Adieresis ydieresis -55
+KPX Agrave T -55
+KPX Agrave Tcaron -55
+KPX Agrave Tcommaaccent -55
+KPX Agrave V -74
+KPX Agrave W -74
+KPX Agrave Y -74
+KPX Agrave Yacute -74
+KPX Agrave Ydieresis -74
+KPX Agrave quoteright -55
+KPX Agrave space -55
+KPX Agrave v -55
+KPX Agrave w -37
+KPX Agrave y -55
+KPX Agrave yacute -55
+KPX Agrave ydieresis -55
+KPX Amacron T -55
+KPX Amacron Tcaron -55
+KPX Amacron Tcommaaccent -55
+KPX Amacron V -74
+KPX Amacron W -74
+KPX Amacron Y -74
+KPX Amacron Yacute -74
+KPX Amacron Ydieresis -74
+KPX Amacron quoteright -55
+KPX Amacron space -55
+KPX Amacron v -55
+KPX Amacron w -37
+KPX Amacron y -55
+KPX Amacron yacute -55
+KPX Amacron ydieresis -55
+KPX Aogonek T -55
+KPX Aogonek Tcaron -55
+KPX Aogonek Tcommaaccent -55
+KPX Aogonek V -74
+KPX Aogonek W -74
+KPX Aogonek Y -74
+KPX Aogonek Yacute -74
+KPX Aogonek Ydieresis -74
+KPX Aogonek quoteright -55
+KPX Aogonek space -55
+KPX Aogonek v -55
+KPX Aogonek w -37
+KPX Aogonek y -55
+KPX Aogonek yacute -55
+KPX Aogonek ydieresis -55
+KPX Aring T -55
+KPX Aring Tcaron -55
+KPX Aring Tcommaaccent -55
+KPX Aring V -74
+KPX Aring W -74
+KPX Aring Y -74
+KPX Aring Yacute -74
+KPX Aring Ydieresis -74
+KPX Aring quoteright -55
+KPX Aring space -55
+KPX Aring v -55
+KPX Aring w -37
+KPX Aring y -55
+KPX Aring yacute -55
+KPX Aring ydieresis -55
+KPX Atilde T -55
+KPX Atilde Tcaron -55
+KPX Atilde Tcommaaccent -55
+KPX Atilde V -74
+KPX Atilde W -74
+KPX Atilde Y -74
+KPX Atilde Yacute -74
+KPX Atilde Ydieresis -74
+KPX Atilde quoteright -55
+KPX Atilde space -55
+KPX Atilde v -55
+KPX Atilde w -37
+KPX Atilde y -55
+KPX Atilde yacute -55
+KPX Atilde ydieresis -55
+KPX F A -74
+KPX F Aacute -74
+KPX F Abreve -74
+KPX F Acircumflex -74
+KPX F Adieresis -74
+KPX F Agrave -74
+KPX F Amacron -74
+KPX F Aogonek -74
+KPX F Aring -74
+KPX F Atilde -74
+KPX F comma -111
+KPX F period -111
+KPX F space -18
+KPX L T -74
+KPX L Tcaron -74
+KPX L Tcommaaccent -74
+KPX L V -74
+KPX L W -74
+KPX L Y -74
+KPX L Yacute -74
+KPX L Ydieresis -74
+KPX L quoteright -55
+KPX L space -18
+KPX L y -37
+KPX L yacute -37
+KPX L ydieresis -37
+KPX Lacute T -74
+KPX Lacute Tcaron -74
+KPX Lacute Tcommaaccent -74
+KPX Lacute V -74
+KPX Lacute W -74
+KPX Lacute Y -74
+KPX Lacute Yacute -74
+KPX Lacute Ydieresis -74
+KPX Lacute quoteright -55
+KPX Lacute space -18
+KPX Lacute y -37
+KPX Lacute yacute -37
+KPX Lacute ydieresis -37
+KPX Lcaron quoteright -55
+KPX Lcaron space -18
+KPX Lcaron y -37
+KPX Lcaron yacute -37
+KPX Lcaron ydieresis -37
+KPX Lcommaaccent T -74
+KPX Lcommaaccent Tcaron -74
+KPX Lcommaaccent Tcommaaccent -74
+KPX Lcommaaccent V -74
+KPX Lcommaaccent W -74
+KPX Lcommaaccent Y -74
+KPX Lcommaaccent Yacute -74
+KPX Lcommaaccent Ydieresis -74
+KPX Lcommaaccent quoteright -55
+KPX Lcommaaccent space -18
+KPX Lcommaaccent y -37
+KPX Lcommaaccent yacute -37
+KPX Lcommaaccent ydieresis -37
+KPX Lslash T -74
+KPX Lslash Tcaron -74
+KPX Lslash Tcommaaccent -74
+KPX Lslash V -74
+KPX Lslash W -74
+KPX Lslash Y -74
+KPX Lslash Yacute -74
+KPX Lslash Ydieresis -74
+KPX Lslash quoteright -55
+KPX Lslash space -18
+KPX Lslash y -37
+KPX Lslash yacute -37
+KPX Lslash ydieresis -37
+KPX P A -92
+KPX P Aacute -92
+KPX P Abreve -92
+KPX P Acircumflex -92
+KPX P Adieresis -92
+KPX P Agrave -92
+KPX P Amacron -92
+KPX P Aogonek -92
+KPX P Aring -92
+KPX P Atilde -92
+KPX P comma -129
+KPX P period -129
+KPX P space -55
+KPX R T -37
+KPX R Tcaron -37
+KPX R Tcommaaccent -37
+KPX R V -55
+KPX R W -55
+KPX R Y -37
+KPX R Yacute -37
+KPX R Ydieresis -37
+KPX R y -20
+KPX R yacute -20
+KPX R ydieresis -20
+KPX Racute T -37
+KPX Racute Tcaron -37
+KPX Racute Tcommaaccent -37
+KPX Racute V -55
+KPX Racute W -55
+KPX Racute Y -37
+KPX Racute Yacute -37
+KPX Racute Ydieresis -37
+KPX Racute y -20
+KPX Racute yacute -20
+KPX Racute ydieresis -20
+KPX Rcaron T -37
+KPX Rcaron Tcaron -37
+KPX Rcaron Tcommaaccent -37
+KPX Rcaron V -55
+KPX Rcaron W -55
+KPX Rcaron Y -37
+KPX Rcaron Yacute -37
+KPX Rcaron Ydieresis -37
+KPX Rcaron y -20
+KPX Rcaron yacute -20
+KPX Rcaron ydieresis -20
+KPX Rcommaaccent T -37
+KPX Rcommaaccent Tcaron -37
+KPX Rcommaaccent Tcommaaccent -37
+KPX Rcommaaccent V -55
+KPX Rcommaaccent W -55
+KPX Rcommaaccent Y -37
+KPX Rcommaaccent Yacute -37
+KPX Rcommaaccent Ydieresis -37
+KPX Rcommaaccent y -20
+KPX Rcommaaccent yacute -20
+KPX Rcommaaccent ydieresis -20
+KPX T A -55
+KPX T Aacute -55
+KPX T Abreve -55
+KPX T Acircumflex -55
+KPX T Adieresis -55
+KPX T Agrave -55
+KPX T Amacron -55
+KPX T Aogonek -55
+KPX T Aring -55
+KPX T Atilde -55
+KPX T O -18
+KPX T Oacute -18
+KPX T Ocircumflex -18
+KPX T Odieresis -18
+KPX T Ograve -18
+KPX T Ohungarumlaut -18
+KPX T Omacron -18
+KPX T Oslash -18
+KPX T Otilde -18
+KPX T a -111
+KPX T aacute -111
+KPX T abreve -111
+KPX T acircumflex -111
+KPX T adieresis -111
+KPX T agrave -111
+KPX T amacron -111
+KPX T aogonek -111
+KPX T aring -111
+KPX T atilde -111
+KPX T c -92
+KPX T cacute -92
+KPX T ccaron -92
+KPX T ccedilla -92
+KPX T colon -55
+KPX T comma -55
+KPX T e -111
+KPX T eacute -111
+KPX T ecaron -111
+KPX T ecircumflex -71
+KPX T edieresis -71
+KPX T edotaccent -111
+KPX T egrave -71
+KPX T emacron -71
+KPX T eogonek -111
+KPX T hyphen -92
+KPX T i -74
+KPX T iacute -74
+KPX T icircumflex -34
+KPX T idieresis -34
+KPX T igrave -34
+KPX T imacron -34
+KPX T iogonek -74
+KPX T o -111
+KPX T oacute -111
+KPX T ocircumflex -111
+KPX T odieresis -111
+KPX T ograve -111
+KPX T ohungarumlaut -111
+KPX T omacron -111
+KPX T oslash -111
+KPX T otilde -111
+KPX T period -55
+KPX T r -92
+KPX T racute -92
+KPX T rcaron -92
+KPX T rcommaaccent -92
+KPX T s -92
+KPX T sacute -92
+KPX T scaron -92
+KPX T scedilla -92
+KPX T scommaaccent -92
+KPX T semicolon -55
+KPX T u -92
+KPX T uacute -92
+KPX T ucircumflex -92
+KPX T udieresis -92
+KPX T ugrave -92
+KPX T uhungarumlaut -92
+KPX T umacron -92
+KPX T uogonek -92
+KPX T uring -92
+KPX T w -50
+KPX T y -80
+KPX T yacute -80
+KPX T ydieresis -80
+KPX Tcaron A -55
+KPX Tcaron Aacute -55
+KPX Tcaron Abreve -55
+KPX Tcaron Acircumflex -55
+KPX Tcaron Adieresis -55
+KPX Tcaron Agrave -55
+KPX Tcaron Amacron -55
+KPX Tcaron Aogonek -55
+KPX Tcaron Aring -55
+KPX Tcaron Atilde -55
+KPX Tcaron O -18
+KPX Tcaron Oacute -18
+KPX Tcaron Ocircumflex -18
+KPX Tcaron Odieresis -18
+KPX Tcaron Ograve -18
+KPX Tcaron Ohungarumlaut -18
+KPX Tcaron Omacron -18
+KPX Tcaron Oslash -18
+KPX Tcaron Otilde -18
+KPX Tcaron a -111
+KPX Tcaron aacute -111
+KPX Tcaron abreve -111
+KPX Tcaron acircumflex -111
+KPX Tcaron adieresis -111
+KPX Tcaron agrave -111
+KPX Tcaron amacron -111
+KPX Tcaron aogonek -111
+KPX Tcaron aring -111
+KPX Tcaron atilde -111
+KPX Tcaron c -92
+KPX Tcaron cacute -92
+KPX Tcaron ccaron -92
+KPX Tcaron ccedilla -92
+KPX Tcaron colon -55
+KPX Tcaron comma -55
+KPX Tcaron e -111
+KPX Tcaron eacute -111
+KPX Tcaron ecaron -111
+KPX Tcaron ecircumflex -71
+KPX Tcaron edieresis -71
+KPX Tcaron edotaccent -111
+KPX Tcaron egrave -71
+KPX Tcaron emacron -71
+KPX Tcaron eogonek -111
+KPX Tcaron hyphen -92
+KPX Tcaron i -74
+KPX Tcaron iacute -74
+KPX Tcaron icircumflex -34
+KPX Tcaron idieresis -34
+KPX Tcaron igrave -34
+KPX Tcaron imacron -34
+KPX Tcaron iogonek -74
+KPX Tcaron o -111
+KPX Tcaron oacute -111
+KPX Tcaron ocircumflex -111
+KPX Tcaron odieresis -111
+KPX Tcaron ograve -111
+KPX Tcaron ohungarumlaut -111
+KPX Tcaron omacron -111
+KPX Tcaron oslash -111
+KPX Tcaron otilde -111
+KPX Tcaron period -55
+KPX Tcaron r -92
+KPX Tcaron racute -92
+KPX Tcaron rcaron -92
+KPX Tcaron rcommaaccent -92
+KPX Tcaron s -92
+KPX Tcaron sacute -92
+KPX Tcaron scaron -92
+KPX Tcaron scedilla -92
+KPX Tcaron scommaaccent -92
+KPX Tcaron semicolon -55
+KPX Tcaron u -92
+KPX Tcaron uacute -92
+KPX Tcaron ucircumflex -92
+KPX Tcaron udieresis -92
+KPX Tcaron ugrave -92
+KPX Tcaron uhungarumlaut -92
+KPX Tcaron umacron -92
+KPX Tcaron uogonek -92
+KPX Tcaron uring -92
+KPX Tcaron w -50
+KPX Tcaron y -80
+KPX Tcaron yacute -80
+KPX Tcaron ydieresis -80
+KPX Tcommaaccent A -55
+KPX Tcommaaccent Aacute -55
+KPX Tcommaaccent Abreve -55
+KPX Tcommaaccent Acircumflex -55
+KPX Tcommaaccent Adieresis -55
+KPX Tcommaaccent Agrave -55
+KPX Tcommaaccent Amacron -55
+KPX Tcommaaccent Aogonek -55
+KPX Tcommaaccent Aring -55
+KPX Tcommaaccent Atilde -55
+KPX Tcommaaccent O -18
+KPX Tcommaaccent Oacute -18
+KPX Tcommaaccent Ocircumflex -18
+KPX Tcommaaccent Odieresis -18
+KPX Tcommaaccent Ograve -18
+KPX Tcommaaccent Ohungarumlaut -18
+KPX Tcommaaccent Omacron -18
+KPX Tcommaaccent Oslash -18
+KPX Tcommaaccent Otilde -18
+KPX Tcommaaccent a -111
+KPX Tcommaaccent aacute -111
+KPX Tcommaaccent abreve -111
+KPX Tcommaaccent acircumflex -111
+KPX Tcommaaccent adieresis -111
+KPX Tcommaaccent agrave -111
+KPX Tcommaaccent amacron -111
+KPX Tcommaaccent aogonek -111
+KPX Tcommaaccent aring -111
+KPX Tcommaaccent atilde -111
+KPX Tcommaaccent c -92
+KPX Tcommaaccent cacute -92
+KPX Tcommaaccent ccaron -92
+KPX Tcommaaccent ccedilla -92
+KPX Tcommaaccent colon -55
+KPX Tcommaaccent comma -55
+KPX Tcommaaccent e -111
+KPX Tcommaaccent eacute -111
+KPX Tcommaaccent ecaron -111
+KPX Tcommaaccent ecircumflex -71
+KPX Tcommaaccent edieresis -71
+KPX Tcommaaccent edotaccent -111
+KPX Tcommaaccent egrave -71
+KPX Tcommaaccent emacron -71
+KPX Tcommaaccent eogonek -111
+KPX Tcommaaccent hyphen -92
+KPX Tcommaaccent i -74
+KPX Tcommaaccent iacute -74
+KPX Tcommaaccent icircumflex -34
+KPX Tcommaaccent idieresis -34
+KPX Tcommaaccent igrave -34
+KPX Tcommaaccent imacron -34
+KPX Tcommaaccent iogonek -74
+KPX Tcommaaccent o -111
+KPX Tcommaaccent oacute -111
+KPX Tcommaaccent ocircumflex -111
+KPX Tcommaaccent odieresis -111
+KPX Tcommaaccent ograve -111
+KPX Tcommaaccent ohungarumlaut -111
+KPX Tcommaaccent omacron -111
+KPX Tcommaaccent oslash -111
+KPX Tcommaaccent otilde -111
+KPX Tcommaaccent period -55
+KPX Tcommaaccent r -92
+KPX Tcommaaccent racute -92
+KPX Tcommaaccent rcaron -92
+KPX Tcommaaccent rcommaaccent -92
+KPX Tcommaaccent s -92
+KPX Tcommaaccent sacute -92
+KPX Tcommaaccent scaron -92
+KPX Tcommaaccent scedilla -92
+KPX Tcommaaccent scommaaccent -92
+KPX Tcommaaccent semicolon -55
+KPX Tcommaaccent u -92
+KPX Tcommaaccent uacute -92
+KPX Tcommaaccent ucircumflex -92
+KPX Tcommaaccent udieresis -92
+KPX Tcommaaccent ugrave -92
+KPX Tcommaaccent uhungarumlaut -92
+KPX Tcommaaccent umacron -92
+KPX Tcommaaccent uogonek -92
+KPX Tcommaaccent uring -92
+KPX Tcommaaccent w -50
+KPX Tcommaaccent y -80
+KPX Tcommaaccent yacute -80
+KPX Tcommaaccent ydieresis -80
+KPX V A -74
+KPX V Aacute -74
+KPX V Abreve -74
+KPX V Acircumflex -74
+KPX V Adieresis -74
+KPX V Agrave -74
+KPX V Amacron -74
+KPX V Aogonek -74
+KPX V Aring -74
+KPX V Atilde -74
+KPX V a -92
+KPX V aacute -92
+KPX V abreve -92
+KPX V acircumflex -92
+KPX V adieresis -92
+KPX V agrave -92
+KPX V amacron -92
+KPX V aogonek -92
+KPX V aring -92
+KPX V atilde -92
+KPX V colon -37
+KPX V comma -111
+KPX V e -74
+KPX V eacute -74
+KPX V ecaron -74
+KPX V ecircumflex -74
+KPX V edieresis -74
+KPX V edotaccent -74
+KPX V egrave -34
+KPX V emacron -34
+KPX V eogonek -74
+KPX V hyphen -37
+KPX V i -50
+KPX V iacute -50
+KPX V iogonek -50
+KPX V o -74
+KPX V oacute -74
+KPX V ocircumflex -74
+KPX V odieresis -74
+KPX V ograve -74
+KPX V ohungarumlaut -74
+KPX V omacron -74
+KPX V oslash -74
+KPX V otilde -74
+KPX V period -111
+KPX V r -74
+KPX V racute -74
+KPX V rcaron -74
+KPX V rcommaaccent -74
+KPX V semicolon -37
+KPX V u -50
+KPX V uacute -50
+KPX V ucircumflex -50
+KPX V udieresis -50
+KPX V ugrave -50
+KPX V uhungarumlaut -50
+KPX V umacron -50
+KPX V uogonek -50
+KPX V uring -50
+KPX V y -50
+KPX V yacute -50
+KPX V ydieresis -50
+KPX W A -74
+KPX W Aacute -74
+KPX W Abreve -74
+KPX W Acircumflex -74
+KPX W Adieresis -74
+KPX W Agrave -74
+KPX W Amacron -74
+KPX W Aogonek -74
+KPX W Aring -74
+KPX W Atilde -74
+KPX W a -74
+KPX W aacute -74
+KPX W abreve -74
+KPX W acircumflex -74
+KPX W adieresis -74
+KPX W agrave -74
+KPX W amacron -74
+KPX W aogonek -74
+KPX W aring -74
+KPX W atilde -74
+KPX W colon -28
+KPX W comma -55
+KPX W e -55
+KPX W eacute -55
+KPX W ecaron -55
+KPX W ecircumflex -55
+KPX W edieresis -55
+KPX W edotaccent -55
+KPX W egrave -55
+KPX W emacron -55
+KPX W eogonek -55
+KPX W i -30
+KPX W iacute -30
+KPX W iogonek -30
+KPX W o -55
+KPX W oacute -55
+KPX W ocircumflex -55
+KPX W odieresis -55
+KPX W ograve -55
+KPX W ohungarumlaut -55
+KPX W omacron -55
+KPX W oslash -55
+KPX W otilde -55
+KPX W period -55
+KPX W r -30
+KPX W racute -30
+KPX W rcaron -30
+KPX W rcommaaccent -30
+KPX W semicolon -18
+KPX W u -30
+KPX W uacute -30
+KPX W ucircumflex -30
+KPX W udieresis -30
+KPX W ugrave -30
+KPX W uhungarumlaut -30
+KPX W umacron -30
+KPX W uogonek -30
+KPX W uring -30
+KPX W y -30
+KPX W yacute -30
+KPX W ydieresis -30
+KPX Y A -55
+KPX Y Aacute -55
+KPX Y Abreve -55
+KPX Y Acircumflex -55
+KPX Y Adieresis -55
+KPX Y Agrave -55
+KPX Y Amacron -55
+KPX Y Aogonek -55
+KPX Y Aring -55
+KPX Y Atilde -55
+KPX Y a -111
+KPX Y aacute -111
+KPX Y abreve -111
+KPX Y acircumflex -111
+KPX Y adieresis -111
+KPX Y agrave -111
+KPX Y amacron -111
+KPX Y aogonek -111
+KPX Y aring -111
+KPX Y atilde -111
+KPX Y colon -55
+KPX Y comma -55
+KPX Y e -92
+KPX Y eacute -92
+KPX Y ecaron -92
+KPX Y ecircumflex -92
+KPX Y edieresis -92
+KPX Y edotaccent -92
+KPX Y egrave -92
+KPX Y emacron -92
+KPX Y eogonek -92
+KPX Y hyphen -55
+KPX Y i -54
+KPX Y iacute -54
+KPX Y iogonek -54
+KPX Y o -111
+KPX Y oacute -111
+KPX Y ocircumflex -111
+KPX Y odieresis -111
+KPX Y ograve -111
+KPX Y ohungarumlaut -111
+KPX Y omacron -111
+KPX Y oslash -111
+KPX Y otilde -111
+KPX Y p -74
+KPX Y period -55
+KPX Y q -92
+KPX Y semicolon -55
+KPX Y u -50
+KPX Y uacute -50
+KPX Y ucircumflex -50
+KPX Y udieresis -50
+KPX Y ugrave -50
+KPX Y uhungarumlaut -50
+KPX Y umacron -50
+KPX Y uogonek -50
+KPX Y uring -50
+KPX Y v -30
+KPX Yacute A -55
+KPX Yacute Aacute -55
+KPX Yacute Abreve -55
+KPX Yacute Acircumflex -55
+KPX Yacute Adieresis -55
+KPX Yacute Agrave -55
+KPX Yacute Amacron -55
+KPX Yacute Aogonek -55
+KPX Yacute Aring -55
+KPX Yacute Atilde -55
+KPX Yacute a -111
+KPX Yacute aacute -111
+KPX Yacute abreve -111
+KPX Yacute acircumflex -111
+KPX Yacute adieresis -111
+KPX Yacute agrave -111
+KPX Yacute amacron -111
+KPX Yacute aogonek -111
+KPX Yacute aring -111
+KPX Yacute atilde -111
+KPX Yacute colon -55
+KPX Yacute comma -55
+KPX Yacute e -92
+KPX Yacute eacute -92
+KPX Yacute ecaron -92
+KPX Yacute ecircumflex -92
+KPX Yacute edieresis -92
+KPX Yacute edotaccent -92
+KPX Yacute egrave -92
+KPX Yacute emacron -92
+KPX Yacute eogonek -92
+KPX Yacute hyphen -55
+KPX Yacute i -54
+KPX Yacute iacute -54
+KPX Yacute iogonek -54
+KPX Yacute o -111
+KPX Yacute oacute -111
+KPX Yacute ocircumflex -111
+KPX Yacute odieresis -111
+KPX Yacute ograve -111
+KPX Yacute ohungarumlaut -111
+KPX Yacute omacron -111
+KPX Yacute oslash -111
+KPX Yacute otilde -111
+KPX Yacute p -74
+KPX Yacute period -55
+KPX Yacute q -92
+KPX Yacute semicolon -55
+KPX Yacute u -50
+KPX Yacute uacute -50
+KPX Yacute ucircumflex -50
+KPX Yacute udieresis -50
+KPX Yacute ugrave -50
+KPX Yacute uhungarumlaut -50
+KPX Yacute umacron -50
+KPX Yacute uogonek -50
+KPX Yacute uring -50
+KPX Yacute v -30
+KPX Ydieresis A -55
+KPX Ydieresis Aacute -55
+KPX Ydieresis Abreve -55
+KPX Ydieresis Acircumflex -55
+KPX Ydieresis Adieresis -55
+KPX Ydieresis Agrave -55
+KPX Ydieresis Amacron -55
+KPX Ydieresis Aogonek -55
+KPX Ydieresis Aring -55
+KPX Ydieresis Atilde -55
+KPX Ydieresis a -111
+KPX Ydieresis aacute -111
+KPX Ydieresis abreve -111
+KPX Ydieresis acircumflex -111
+KPX Ydieresis adieresis -111
+KPX Ydieresis agrave -111
+KPX Ydieresis amacron -111
+KPX Ydieresis aogonek -111
+KPX Ydieresis aring -111
+KPX Ydieresis atilde -111
+KPX Ydieresis colon -55
+KPX Ydieresis comma -55
+KPX Ydieresis e -92
+KPX Ydieresis eacute -92
+KPX Ydieresis ecaron -92
+KPX Ydieresis ecircumflex -92
+KPX Ydieresis edieresis -92
+KPX Ydieresis edotaccent -92
+KPX Ydieresis egrave -92
+KPX Ydieresis emacron -92
+KPX Ydieresis eogonek -92
+KPX Ydieresis hyphen -55
+KPX Ydieresis i -54
+KPX Ydieresis iacute -54
+KPX Ydieresis iogonek -54
+KPX Ydieresis o -111
+KPX Ydieresis oacute -111
+KPX Ydieresis ocircumflex -111
+KPX Ydieresis odieresis -111
+KPX Ydieresis ograve -111
+KPX Ydieresis ohungarumlaut -111
+KPX Ydieresis omacron -111
+KPX Ydieresis oslash -111
+KPX Ydieresis otilde -111
+KPX Ydieresis p -74
+KPX Ydieresis period -55
+KPX Ydieresis q -92
+KPX Ydieresis semicolon -55
+KPX Ydieresis u -50
+KPX Ydieresis uacute -50
+KPX Ydieresis ucircumflex -50
+KPX Ydieresis udieresis -50
+KPX Ydieresis ugrave -50
+KPX Ydieresis uhungarumlaut -50
+KPX Ydieresis umacron -50
+KPX Ydieresis uogonek -50
+KPX Ydieresis uring -50
+KPX Ydieresis v -30
+KPX f f -37
+KPX f quoteright 37
+KPX one one -55
+KPX quoteleft quoteleft -55
+KPX quoteright quoteright -55
+KPX quoteright s -37
+KPX quoteright sacute -37
+KPX quoteright scaron -37
+KPX quoteright scedilla -37
+KPX quoteright scommaaccent -37
+KPX quoteright space -37
+KPX quoteright t -18
+KPX quoteright tcommaaccent -18
+KPX r c -18
+KPX r cacute -18
+KPX r ccaron -18
+KPX r ccedilla -18
+KPX r comma -55
+KPX r e -18
+KPX r eacute -18
+KPX r ecaron -18
+KPX r ecircumflex -18
+KPX r edieresis -18
+KPX r edotaccent -18
+KPX r egrave -18
+KPX r emacron -18
+KPX r eogonek -18
+KPX r g -18
+KPX r gbreve -18
+KPX r gcommaaccent -18
+KPX r h -18
+KPX r o -18
+KPX r oacute -18
+KPX r ocircumflex -18
+KPX r odieresis -18
+KPX r ograve -18
+KPX r ohungarumlaut -18
+KPX r omacron -18
+KPX r oslash -18
+KPX r otilde -18
+KPX r period -55
+KPX r q -18
+KPX r quoteright 55
+KPX racute c -18
+KPX racute cacute -18
+KPX racute ccaron -18
+KPX racute ccedilla -18
+KPX racute comma -55
+KPX racute e -18
+KPX racute eacute -18
+KPX racute ecaron -18
+KPX racute ecircumflex -18
+KPX racute edieresis -18
+KPX racute edotaccent -18
+KPX racute egrave -18
+KPX racute emacron -18
+KPX racute eogonek -18
+KPX racute g -18
+KPX racute gbreve -18
+KPX racute gcommaaccent -18
+KPX racute h -18
+KPX racute o -18
+KPX racute oacute -18
+KPX racute ocircumflex -18
+KPX racute odieresis -18
+KPX racute ograve -18
+KPX racute ohungarumlaut -18
+KPX racute omacron -18
+KPX racute oslash -18
+KPX racute otilde -18
+KPX racute period -55
+KPX racute q -18
+KPX racute quoteright 55
+KPX rcaron c -18
+KPX rcaron cacute -18
+KPX rcaron ccaron -18
+KPX rcaron ccedilla -18
+KPX rcaron comma -55
+KPX rcaron e -18
+KPX rcaron eacute -18
+KPX rcaron ecaron -18
+KPX rcaron ecircumflex -18
+KPX rcaron edieresis -18
+KPX rcaron edotaccent -18
+KPX rcaron egrave -18
+KPX rcaron emacron -18
+KPX rcaron eogonek -18
+KPX rcaron g -18
+KPX rcaron gbreve -18
+KPX rcaron gcommaaccent -18
+KPX rcaron h -18
+KPX rcaron o -18
+KPX rcaron oacute -18
+KPX rcaron ocircumflex -18
+KPX rcaron odieresis -18
+KPX rcaron ograve -18
+KPX rcaron ohungarumlaut -18
+KPX rcaron omacron -18
+KPX rcaron oslash -18
+KPX rcaron otilde -18
+KPX rcaron period -55
+KPX rcaron q -18
+KPX rcaron quoteright 55
+KPX rcommaaccent c -18
+KPX rcommaaccent cacute -18
+KPX rcommaaccent ccaron -18
+KPX rcommaaccent ccedilla -18
+KPX rcommaaccent comma -55
+KPX rcommaaccent e -18
+KPX rcommaaccent eacute -18
+KPX rcommaaccent ecaron -18
+KPX rcommaaccent ecircumflex -18
+KPX rcommaaccent edieresis -18
+KPX rcommaaccent edotaccent -18
+KPX rcommaaccent egrave -18
+KPX rcommaaccent emacron -18
+KPX rcommaaccent eogonek -18
+KPX rcommaaccent g -18
+KPX rcommaaccent gbreve -18
+KPX rcommaaccent gcommaaccent -18
+KPX rcommaaccent h -18
+KPX rcommaaccent o -18
+KPX rcommaaccent oacute -18
+KPX rcommaaccent ocircumflex -18
+KPX rcommaaccent odieresis -18
+KPX rcommaaccent ograve -18
+KPX rcommaaccent ohungarumlaut -18
+KPX rcommaaccent omacron -18
+KPX rcommaaccent oslash -18
+KPX rcommaaccent otilde -18
+KPX rcommaaccent period -55
+KPX rcommaaccent q -18
+KPX rcommaaccent quoteright 55
+KPX v comma -55
+KPX v period -55
+KPX w comma -55
+KPX w period -55
+KPX y comma -37
+KPX y period -37
+KPX yacute comma -37
+KPX yacute period -37
+KPX ydieresis comma -37
+KPX ydieresis period -37
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/src/fonts/Adobe-Core35_AFMs-314/Palatino-Italic.afm b/src/fonts/Adobe-Core35_AFMs-314/Palatino-Italic.afm
new file mode 100644
index 0000000..68e3c2f
--- /dev/null
+++ b/src/fonts/Adobe-Core35_AFMs-314/Palatino-Italic.afm
@@ -0,0 +1,1306 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1985, 1987, 1989, 1990, 1992, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Thu May 1 13:32:34 1997
+Comment UniqueID 43074
+Comment VMusage 54574 69599
+FontName Palatino-Italic
+FullName Palatino Italic
+FamilyName Palatino
+Weight Medium
+ItalicAngle -10
+IsFixedPitch false
+FontBBox -170 -276 1010 918
+UnderlinePosition -100
+UnderlineThickness 50
+Version 002.000
+Notice Copyright (c) 1985, 1987, 1989, 1990, 1992, 1997 Adobe Systems Incorporated. All Rights Reserved.Palatino is a trademark of Linotype-Hell AG and/or its subsidiaries.
+EncodingScheme AdobeStandardEncoding
+CapHeight 692
+XHeight 482
+Ascender 726
+Descender -281
+StdHW 42
+StdVW 84
+StartCharMetrics 314
+C 32 ; WX 250 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 333 ; N exclam ; B 76 -8 292 733 ;
+C 34 ; WX 500 ; N quotedbl ; B 140 508 455 733 ;
+C 35 ; WX 500 ; N numbersign ; B 4 0 495 692 ;
+C 36 ; WX 500 ; N dollar ; B 15 -113 452 733 ;
+C 37 ; WX 889 ; N percent ; B 74 -7 809 710 ;
+C 38 ; WX 778 ; N ampersand ; B 47 -18 766 692 ;
+C 39 ; WX 278 ; N quoteright ; B 78 488 258 733 ;
+C 40 ; WX 333 ; N parenleft ; B 54 -106 331 733 ;
+C 41 ; WX 333 ; N parenright ; B 2 -106 279 733 ;
+C 42 ; WX 389 ; N asterisk ; B 76 368 400 706 ;
+C 43 ; WX 606 ; N plus ; B 51 0 555 504 ;
+C 44 ; WX 250 ; N comma ; B 8 -143 203 123 ;
+C 45 ; WX 333 ; N hyphen ; B 19 223 304 281 ;
+C 46 ; WX 250 ; N period ; B 53 -5 158 112 ;
+C 47 ; WX 296 ; N slash ; B -40 -119 392 733 ;
+C 48 ; WX 500 ; N zero ; B 36 -11 480 699 ;
+C 49 ; WX 500 ; N one ; B 54 -3 398 699 ;
+C 50 ; WX 500 ; N two ; B 12 -3 437 699 ;
+C 51 ; WX 500 ; N three ; B 22 -11 447 699 ;
+C 52 ; WX 500 ; N four ; B 15 -3 478 699 ;
+C 53 ; WX 500 ; N five ; B 14 -11 491 693 ;
+C 54 ; WX 500 ; N six ; B 49 -11 469 699 ;
+C 55 ; WX 500 ; N seven ; B 53 -3 502 692 ;
+C 56 ; WX 500 ; N eight ; B 36 -11 469 699 ;
+C 57 ; WX 500 ; N nine ; B 32 -11 468 699 ;
+C 58 ; WX 250 ; N colon ; B 44 -5 207 458 ;
+C 59 ; WX 250 ; N semicolon ; B -9 -146 219 456 ;
+C 60 ; WX 606 ; N less ; B 53 -6 554 516 ;
+C 61 ; WX 606 ; N equal ; B 51 126 555 378 ;
+C 62 ; WX 606 ; N greater ; B 53 -6 554 516 ;
+C 63 ; WX 500 ; N question ; B 114 -8 427 706 ;
+C 64 ; WX 747 ; N at ; B 27 -18 718 706 ;
+C 65 ; WX 722 ; N A ; B -19 -3 677 705 ;
+C 66 ; WX 611 ; N B ; B 26 -6 559 692 ;
+C 67 ; WX 667 ; N C ; B 45 -18 651 706 ;
+C 68 ; WX 778 ; N D ; B 28 -3 741 692 ;
+C 69 ; WX 611 ; N E ; B 30 -3 570 692 ;
+C 70 ; WX 556 ; N F ; B 0 -3 548 692 ;
+C 71 ; WX 722 ; N G ; B 50 -18 694 706 ;
+C 72 ; WX 778 ; N H ; B -3 -3 800 692 ;
+C 73 ; WX 333 ; N I ; B 7 -3 354 692 ;
+C 74 ; WX 333 ; N J ; B -35 -206 358 692 ;
+C 75 ; WX 667 ; N K ; B 13 -3 683 692 ;
+C 76 ; WX 556 ; N L ; B 16 -3 523 692 ;
+C 77 ; WX 944 ; N M ; B -19 -18 940 692 ;
+C 78 ; WX 778 ; N N ; B 2 -11 804 692 ;
+C 79 ; WX 778 ; N O ; B 53 -18 748 706 ;
+C 80 ; WX 611 ; N P ; B 9 -3 594 692 ;
+C 81 ; WX 778 ; N Q ; B 53 -201 748 706 ;
+C 82 ; WX 667 ; N R ; B 9 -3 639 692 ;
+C 83 ; WX 556 ; N S ; B 42 -18 506 706 ;
+C 84 ; WX 611 ; N T ; B 53 -3 635 692 ;
+C 85 ; WX 778 ; N U ; B 88 -18 798 692 ;
+C 86 ; WX 722 ; N V ; B 75 -8 754 692 ;
+C 87 ; WX 944 ; N W ; B 71 -8 980 700 ;
+C 88 ; WX 722 ; N X ; B 20 -3 734 692 ;
+C 89 ; WX 667 ; N Y ; B 52 -3 675 705 ;
+C 90 ; WX 667 ; N Z ; B 20 -3 637 692 ;
+C 91 ; WX 333 ; N bracketleft ; B 18 -100 326 733 ;
+C 92 ; WX 606 ; N backslash ; B 81 0 513 733 ;
+C 93 ; WX 333 ; N bracketright ; B 7 -100 315 733 ;
+C 94 ; WX 606 ; N asciicircum ; B 51 283 554 689 ;
+C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;
+C 96 ; WX 278 ; N quoteleft ; B 78 488 258 733 ;
+C 97 ; WX 444 ; N a ; B 4 -11 406 482 ;
+C 98 ; WX 463 ; N b ; B 37 -11 433 733 ;
+C 99 ; WX 407 ; N c ; B 25 -11 389 482 ;
+C 100 ; WX 500 ; N d ; B 17 -11 483 733 ;
+C 101 ; WX 389 ; N e ; B 15 -11 374 482 ;
+C 102 ; WX 278 ; N f ; B -162 -276 413 733 ; L i fi ; L l fl ;
+C 103 ; WX 500 ; N g ; B -37 -276 498 482 ;
+C 104 ; WX 500 ; N h ; B 10 -9 471 733 ;
+C 105 ; WX 278 ; N i ; B 34 -9 264 712 ;
+C 106 ; WX 278 ; N j ; B -70 -276 265 712 ;
+C 107 ; WX 444 ; N k ; B 8 -9 449 733 ;
+C 108 ; WX 278 ; N l ; B 36 -9 251 733 ;
+C 109 ; WX 778 ; N m ; B 24 -9 740 482 ;
+C 110 ; WX 556 ; N n ; B 24 -9 514 482 ;
+C 111 ; WX 444 ; N o ; B 17 -11 411 482 ;
+C 112 ; WX 500 ; N p ; B -7 -276 465 482 ;
+C 113 ; WX 463 ; N q ; B 24 -276 432 482 ;
+C 114 ; WX 389 ; N r ; B 26 -9 384 482 ;
+C 115 ; WX 389 ; N s ; B 9 -11 345 482 ;
+C 116 ; WX 333 ; N t ; B 41 -9 310 646 ;
+C 117 ; WX 556 ; N u ; B 32 -11 512 482 ;
+C 118 ; WX 500 ; N v ; B 21 -11 477 482 ;
+C 119 ; WX 722 ; N w ; B 21 -11 699 482 ;
+C 120 ; WX 500 ; N x ; B 9 -11 484 482 ;
+C 121 ; WX 500 ; N y ; B -8 -276 490 482 ;
+C 122 ; WX 444 ; N z ; B -1 -11 416 482 ;
+C 123 ; WX 333 ; N braceleft ; B 15 -100 319 733 ;
+C 124 ; WX 606 ; N bar ; B 275 -250 331 750 ;
+C 125 ; WX 333 ; N braceright ; B 14 -100 318 733 ;
+C 126 ; WX 606 ; N asciitilde ; B 51 168 555 339 ;
+C 161 ; WX 333 ; N exclamdown ; B 15 -276 233 467 ;
+C 162 ; WX 500 ; N cent ; B 56 -96 418 551 ;
+C 163 ; WX 500 ; N sterling ; B 2 -18 479 708 ;
+C 164 ; WX 167 ; N fraction ; B -170 0 337 699 ;
+C 165 ; WX 500 ; N yen ; B 35 -3 512 699 ;
+C 166 ; WX 500 ; N florin ; B 5 -276 470 708 ;
+C 167 ; WX 500 ; N section ; B 14 -220 463 706 ;
+C 168 ; WX 500 ; N currency ; B 14 115 486 577 ;
+C 169 ; WX 333 ; N quotesingle ; B 140 508 288 733 ;
+C 170 ; WX 500 ; N quotedblleft ; B 98 488 475 733 ;
+C 171 ; WX 500 ; N guillemotleft ; B 57 70 437 440 ;
+C 172 ; WX 333 ; N guilsinglleft ; B 57 70 270 440 ;
+C 173 ; WX 333 ; N guilsinglright ; B 63 70 276 440 ;
+C 174 ; WX 528 ; N fi ; B -162 -276 502 733 ;
+C 175 ; WX 545 ; N fl ; B -162 -276 520 733 ;
+C 177 ; WX 500 ; N endash ; B -10 228 510 278 ;
+C 178 ; WX 500 ; N dagger ; B 48 0 469 692 ;
+C 179 ; WX 500 ; N daggerdbl ; B 10 -162 494 692 ;
+C 180 ; WX 250 ; N periodcentered ; B 53 195 158 312 ;
+C 182 ; WX 500 ; N paragraph ; B 33 -224 611 692 ;
+C 183 ; WX 500 ; N bullet ; B 86 182 430 526 ;
+C 184 ; WX 278 ; N quotesinglbase ; B 27 -122 211 120 ;
+C 185 ; WX 500 ; N quotedblbase ; B 43 -122 424 120 ;
+C 186 ; WX 500 ; N quotedblright ; B 98 488 475 733 ;
+C 187 ; WX 500 ; N guillemotright ; B 63 70 443 440 ;
+C 188 ; WX 1000 ; N ellipsis ; B 102 -5 873 112 ;
+C 189 ; WX 1000 ; N perthousand ; B 72 -6 929 717 ;
+C 191 ; WX 500 ; N questiondown ; B 57 -246 370 467 ;
+C 193 ; WX 333 ; N grave ; B 86 518 310 687 ;
+C 194 ; WX 333 ; N acute ; B 122 518 346 687 ;
+C 195 ; WX 333 ; N circumflex ; B 56 510 350 679 ;
+C 196 ; WX 333 ; N tilde ; B 63 535 390 638 ;
+C 197 ; WX 333 ; N macron ; B 74 538 386 589 ;
+C 198 ; WX 333 ; N breve ; B 92 518 393 677 ;
+C 199 ; WX 333 ; N dotaccent ; B 189 604 283 712 ;
+C 200 ; WX 333 ; N dieresis ; B 88 604 382 712 ;
+C 202 ; WX 333 ; N ring ; B 159 508 359 708 ;
+C 203 ; WX 333 ; N cedilla ; B -9 -216 202 0 ;
+C 205 ; WX 333 ; N hungarumlaut ; B 16 518 407 687 ;
+C 206 ; WX 333 ; N ogonek ; B 31 -226 213 -18 ;
+C 207 ; WX 333 ; N caron ; B 104 510 409 679 ;
+C 208 ; WX 1000 ; N emdash ; B -10 228 1010 278 ;
+C 225 ; WX 941 ; N AE ; B -4 -3 902 692 ;
+C 227 ; WX 333 ; N ordfeminine ; B 60 404 321 699 ;
+C 232 ; WX 556 ; N Lslash ; B -16 -3 523 692 ;
+C 233 ; WX 778 ; N Oslash ; B 32 -39 762 721 ;
+C 234 ; WX 1028 ; N OE ; B 56 -18 989 706 ;
+C 235 ; WX 333 ; N ordmasculine ; B 66 404 322 699 ;
+C 241 ; WX 638 ; N ae ; B 1 -11 623 482 ;
+C 245 ; WX 278 ; N dotlessi ; B 34 -9 241 482 ;
+C 248 ; WX 278 ; N lslash ; B -10 -9 302 733 ;
+C 249 ; WX 444 ; N oslash ; B -18 -24 460 510 ;
+C 250 ; WX 669 ; N oe ; B 17 -11 654 482 ;
+C 251 ; WX 500 ; N germandbls ; B -160 -276 488 733 ;
+C -1 ; WX 333 ; N Idieresis ; B 7 -3 422 847 ;
+C -1 ; WX 389 ; N eacute ; B 15 -11 394 707 ;
+C -1 ; WX 444 ; N abreve ; B 4 -11 461 697 ;
+C -1 ; WX 556 ; N uhungarumlaut ; B 32 -11 599 707 ;
+C -1 ; WX 389 ; N ecaron ; B 15 -11 437 699 ;
+C -1 ; WX 667 ; N Ydieresis ; B 52 -3 675 847 ;
+C -1 ; WX 606 ; N divide ; B 51 0 555 504 ;
+C -1 ; WX 667 ; N Yacute ; B 52 -3 675 897 ;
+C -1 ; WX 722 ; N Acircumflex ; B -19 -3 677 889 ;
+C -1 ; WX 444 ; N aacute ; B 4 -11 414 707 ;
+C -1 ; WX 778 ; N Ucircumflex ; B 88 -18 798 889 ;
+C -1 ; WX 500 ; N yacute ; B -8 -276 492 707 ;
+C -1 ; WX 389 ; N scommaaccent ; B 9 -276 345 482 ;
+C -1 ; WX 389 ; N ecircumflex ; B 15 -11 398 699 ;
+C -1 ; WX 778 ; N Uring ; B 88 -18 798 918 ;
+C -1 ; WX 778 ; N Udieresis ; B 88 -18 798 847 ;
+C -1 ; WX 444 ; N aogonek ; B 4 -226 406 482 ;
+C -1 ; WX 778 ; N Uacute ; B 88 -18 798 897 ;
+C -1 ; WX 556 ; N uogonek ; B 32 -212 512 482 ;
+C -1 ; WX 611 ; N Edieresis ; B 30 -3 570 847 ;
+C -1 ; WX 778 ; N Dcroat ; B 19 -3 741 692 ;
+C -1 ; WX 250 ; N commaaccent ; B 43 -276 188 -50 ;
+C -1 ; WX 747 ; N copyright ; B 11 -18 736 706 ;
+C -1 ; WX 611 ; N Emacron ; B 30 -3 570 799 ;
+C -1 ; WX 407 ; N ccaron ; B 25 -11 446 699 ;
+C -1 ; WX 444 ; N aring ; B 4 -11 406 728 ;
+C -1 ; WX 778 ; N Ncommaaccent ; B 2 -276 804 692 ;
+C -1 ; WX 278 ; N lacute ; B 36 -9 391 917 ;
+C -1 ; WX 444 ; N agrave ; B 4 -11 406 707 ;
+C -1 ; WX 611 ; N Tcommaaccent ; B 53 -276 635 692 ;
+C -1 ; WX 667 ; N Cacute ; B 45 -18 651 897 ;
+C -1 ; WX 444 ; N atilde ; B 4 -11 446 658 ;
+C -1 ; WX 611 ; N Edotaccent ; B 30 -3 570 847 ;
+C -1 ; WX 389 ; N scaron ; B 9 -11 389 699 ;
+C -1 ; WX 389 ; N scedilla ; B -4 -216 345 482 ;
+C -1 ; WX 278 ; N iacute ; B 34 -9 330 707 ;
+C -1 ; WX 471 ; N lozenge ; B 21 0 451 710 ;
+C -1 ; WX 667 ; N Rcaron ; B 9 -3 639 889 ;
+C -1 ; WX 722 ; N Gcommaaccent ; B 50 -276 694 706 ;
+C -1 ; WX 556 ; N ucircumflex ; B 32 -11 512 699 ;
+C -1 ; WX 444 ; N acircumflex ; B 4 -11 406 699 ;
+C -1 ; WX 722 ; N Amacron ; B -19 -3 677 799 ;
+C -1 ; WX 389 ; N rcaron ; B 26 -9 437 699 ;
+C -1 ; WX 407 ; N ccedilla ; B 19 -216 389 482 ;
+C -1 ; WX 667 ; N Zdotaccent ; B 20 -3 637 847 ;
+C -1 ; WX 611 ; N Thorn ; B 9 -3 570 692 ;
+C -1 ; WX 778 ; N Omacron ; B 53 -18 748 799 ;
+C -1 ; WX 667 ; N Racute ; B 9 -3 639 897 ;
+C -1 ; WX 556 ; N Sacute ; B 42 -18 556 897 ;
+C -1 ; WX 580 ; N dcaron ; B 17 -11 634 733 ;
+C -1 ; WX 778 ; N Umacron ; B 88 -18 798 799 ;
+C -1 ; WX 556 ; N uring ; B 32 -11 512 728 ;
+C -1 ; WX 300 ; N threesuperior ; B 28 273 304 699 ;
+C -1 ; WX 778 ; N Ograve ; B 53 -18 748 897 ;
+C -1 ; WX 722 ; N Agrave ; B -19 -3 677 897 ;
+C -1 ; WX 722 ; N Abreve ; B -19 -3 677 887 ;
+C -1 ; WX 606 ; N multiply ; B 83 36 523 474 ;
+C -1 ; WX 556 ; N uacute ; B 32 -11 520 707 ;
+C -1 ; WX 611 ; N Tcaron ; B 53 -3 635 889 ;
+C -1 ; WX 476 ; N partialdiff ; B 34 -21 450 711 ;
+C -1 ; WX 500 ; N ydieresis ; B -8 -276 490 657 ;
+C -1 ; WX 778 ; N Nacute ; B 2 -11 804 897 ;
+C -1 ; WX 278 ; N icircumflex ; B 29 -9 323 699 ;
+C -1 ; WX 611 ; N Ecircumflex ; B 30 -3 570 889 ;
+C -1 ; WX 444 ; N adieresis ; B 4 -11 438 657 ;
+C -1 ; WX 389 ; N edieresis ; B 15 -11 410 657 ;
+C -1 ; WX 407 ; N cacute ; B 25 -11 403 707 ;
+C -1 ; WX 556 ; N nacute ; B 24 -9 514 707 ;
+C -1 ; WX 556 ; N umacron ; B 32 -11 512 609 ;
+C -1 ; WX 778 ; N Ncaron ; B 2 -11 804 889 ;
+C -1 ; WX 333 ; N Iacute ; B 7 -3 406 897 ;
+C -1 ; WX 606 ; N plusminus ; B 51 0 555 504 ;
+C -1 ; WX 606 ; N brokenbar ; B 275 -175 331 675 ;
+C -1 ; WX 747 ; N registered ; B 11 -18 736 706 ;
+C -1 ; WX 722 ; N Gbreve ; B 50 -18 694 887 ;
+C -1 ; WX 333 ; N Idotaccent ; B 7 -3 354 847 ;
+C -1 ; WX 600 ; N summation ; B 15 -10 586 706 ;
+C -1 ; WX 611 ; N Egrave ; B 30 -3 570 897 ;
+C -1 ; WX 389 ; N racute ; B 26 -9 386 707 ;
+C -1 ; WX 444 ; N omacron ; B 17 -11 442 609 ;
+C -1 ; WX 667 ; N Zacute ; B 20 -3 637 897 ;
+C -1 ; WX 667 ; N Zcaron ; B 20 -3 637 889 ;
+C -1 ; WX 549 ; N greaterequal ; B 26 0 523 643 ;
+C -1 ; WX 778 ; N Eth ; B 19 -3 741 692 ;
+C -1 ; WX 667 ; N Ccedilla ; B 45 -216 651 706 ;
+C -1 ; WX 278 ; N lcommaaccent ; B -43 -276 251 733 ;
+C -1 ; WX 353 ; N tcaron ; B 41 -9 420 752 ;
+C -1 ; WX 389 ; N eogonek ; B 15 -226 374 482 ;
+C -1 ; WX 778 ; N Uogonek ; B 88 -226 798 692 ;
+C -1 ; WX 722 ; N Aacute ; B -19 -3 677 897 ;
+C -1 ; WX 722 ; N Adieresis ; B -19 -3 677 847 ;
+C -1 ; WX 389 ; N egrave ; B 15 -11 374 707 ;
+C -1 ; WX 444 ; N zacute ; B -1 -11 416 707 ;
+C -1 ; WX 278 ; N iogonek ; B 16 -212 264 712 ;
+C -1 ; WX 778 ; N Oacute ; B 53 -18 748 897 ;
+C -1 ; WX 444 ; N oacute ; B 17 -11 414 707 ;
+C -1 ; WX 444 ; N amacron ; B 4 -11 442 609 ;
+C -1 ; WX 389 ; N sacute ; B 9 -11 374 707 ;
+C -1 ; WX 278 ; N idieresis ; B 34 -9 355 657 ;
+C -1 ; WX 778 ; N Ocircumflex ; B 53 -18 748 889 ;
+C -1 ; WX 778 ; N Ugrave ; B 88 -18 798 897 ;
+C -1 ; WX 600 ; N Delta ; B 66 0 668 688 ;
+C -1 ; WX 500 ; N thorn ; B -39 -276 433 733 ;
+C -1 ; WX 300 ; N twosuperior ; B 13 278 290 699 ;
+C -1 ; WX 778 ; N Odieresis ; B 53 -18 748 847 ;
+C -1 ; WX 556 ; N mu ; B 15 -226 512 482 ;
+C -1 ; WX 278 ; N igrave ; B 34 -9 270 707 ;
+C -1 ; WX 444 ; N ohungarumlaut ; B 17 -11 523 707 ;
+C -1 ; WX 611 ; N Eogonek ; B 30 -207 570 692 ;
+C -1 ; WX 500 ; N dcroat ; B 17 -11 526 733 ;
+C -1 ; WX 750 ; N threequarters ; B 35 -2 715 699 ;
+C -1 ; WX 556 ; N Scedilla ; B 42 -216 506 706 ;
+C -1 ; WX 348 ; N lcaron ; B 36 -9 402 733 ;
+C -1 ; WX 667 ; N Kcommaaccent ; B 13 -276 683 692 ;
+C -1 ; WX 556 ; N Lacute ; B 16 -3 523 897 ;
+C -1 ; WX 1000 ; N trademark ; B 52 285 951 689 ;
+C -1 ; WX 389 ; N edotaccent ; B 15 -11 374 657 ;
+C -1 ; WX 333 ; N Igrave ; B 7 -3 354 897 ;
+C -1 ; WX 333 ; N Imacron ; B 7 -3 426 799 ;
+C -1 ; WX 556 ; N Lcaron ; B 16 -3 541 712 ;
+C -1 ; WX 750 ; N onehalf ; B 31 -2 721 699 ;
+C -1 ; WX 549 ; N lessequal ; B 26 0 523 642 ;
+C -1 ; WX 444 ; N ocircumflex ; B 17 -11 411 699 ;
+C -1 ; WX 556 ; N ntilde ; B 24 -9 514 658 ;
+C -1 ; WX 778 ; N Uhungarumlaut ; B 88 -18 798 897 ;
+C -1 ; WX 611 ; N Eacute ; B 30 -3 570 897 ;
+C -1 ; WX 389 ; N emacron ; B 15 -11 434 609 ;
+C -1 ; WX 500 ; N gbreve ; B -37 -276 498 697 ;
+C -1 ; WX 750 ; N onequarter ; B 31 -2 715 699 ;
+C -1 ; WX 556 ; N Scaron ; B 42 -18 539 889 ;
+C -1 ; WX 556 ; N Scommaaccent ; B 42 -276 506 706 ;
+C -1 ; WX 778 ; N Ohungarumlaut ; B 53 -18 748 897 ;
+C -1 ; WX 400 ; N degree ; B 90 389 390 689 ;
+C -1 ; WX 444 ; N ograve ; B 17 -11 411 707 ;
+C -1 ; WX 667 ; N Ccaron ; B 45 -18 651 889 ;
+C -1 ; WX 556 ; N ugrave ; B 32 -11 512 707 ;
+C -1 ; WX 453 ; N radical ; B 12 -55 442 747 ;
+C -1 ; WX 778 ; N Dcaron ; B 28 -3 741 889 ;
+C -1 ; WX 389 ; N rcommaaccent ; B -28 -276 384 482 ;
+C -1 ; WX 778 ; N Ntilde ; B 2 -11 804 848 ;
+C -1 ; WX 444 ; N otilde ; B 17 -11 446 658 ;
+C -1 ; WX 667 ; N Rcommaaccent ; B 9 -276 639 692 ;
+C -1 ; WX 556 ; N Lcommaaccent ; B 16 -276 523 692 ;
+C -1 ; WX 722 ; N Atilde ; B -19 -3 677 848 ;
+C -1 ; WX 722 ; N Aogonek ; B -19 -210 695 705 ;
+C -1 ; WX 722 ; N Aring ; B -19 -3 677 918 ;
+C -1 ; WX 778 ; N Otilde ; B 53 -18 748 848 ;
+C -1 ; WX 444 ; N zdotaccent ; B -1 -11 416 657 ;
+C -1 ; WX 611 ; N Ecaron ; B 30 -3 588 889 ;
+C -1 ; WX 333 ; N Iogonek ; B 7 -210 354 692 ;
+C -1 ; WX 444 ; N kcommaaccent ; B 8 -276 449 733 ;
+C -1 ; WX 606 ; N minus ; B 51 224 555 280 ;
+C -1 ; WX 333 ; N Icircumflex ; B 7 -3 390 889 ;
+C -1 ; WX 556 ; N ncaron ; B 24 -9 533 699 ;
+C -1 ; WX 333 ; N tcommaaccent ; B -16 -276 310 646 ;
+C -1 ; WX 606 ; N logicalnot ; B 51 118 555 378 ;
+C -1 ; WX 444 ; N odieresis ; B 17 -11 438 657 ;
+C -1 ; WX 556 ; N udieresis ; B 32 -11 512 657 ;
+C -1 ; WX 549 ; N notequal ; B 12 -16 537 538 ;
+C -1 ; WX 500 ; N gcommaaccent ; B -37 -276 498 761 ;
+C -1 ; WX 444 ; N eth ; B 17 -11 478 733 ;
+C -1 ; WX 444 ; N zcaron ; B -1 -11 447 699 ;
+C -1 ; WX 556 ; N ncommaaccent ; B 24 -276 514 482 ;
+C -1 ; WX 300 ; N onesuperior ; B 61 278 285 699 ;
+C -1 ; WX 278 ; N imacron ; B 34 -9 324 579 ;
+EndCharMetrics
+StartKernData
+StartKernPairs 962
+KPX A T -55
+KPX A Tcaron -55
+KPX A Tcommaaccent -55
+KPX A V -74
+KPX A W -55
+KPX A Y -55
+KPX A Yacute -55
+KPX A Ydieresis -55
+KPX A quoteright -55
+KPX A space -37
+KPX A v -37
+KPX A w -37
+KPX A y -55
+KPX A yacute -55
+KPX A ydieresis -55
+KPX Aacute T -55
+KPX Aacute Tcaron -55
+KPX Aacute Tcommaaccent -55
+KPX Aacute V -74
+KPX Aacute W -55
+KPX Aacute Y -55
+KPX Aacute Yacute -55
+KPX Aacute Ydieresis -55
+KPX Aacute quoteright -55
+KPX Aacute space -37
+KPX Aacute v -37
+KPX Aacute w -37
+KPX Aacute y -55
+KPX Aacute yacute -55
+KPX Aacute ydieresis -55
+KPX Abreve T -55
+KPX Abreve Tcaron -55
+KPX Abreve Tcommaaccent -55
+KPX Abreve V -74
+KPX Abreve W -55
+KPX Abreve Y -55
+KPX Abreve Yacute -55
+KPX Abreve Ydieresis -55
+KPX Abreve quoteright -55
+KPX Abreve space -37
+KPX Abreve v -37
+KPX Abreve w -37
+KPX Abreve y -55
+KPX Abreve yacute -55
+KPX Abreve ydieresis -55
+KPX Acircumflex T -55
+KPX Acircumflex Tcaron -55
+KPX Acircumflex Tcommaaccent -55
+KPX Acircumflex V -74
+KPX Acircumflex W -55
+KPX Acircumflex Y -55
+KPX Acircumflex Yacute -55
+KPX Acircumflex Ydieresis -55
+KPX Acircumflex quoteright -55
+KPX Acircumflex space -37
+KPX Acircumflex v -37
+KPX Acircumflex w -37
+KPX Acircumflex y -55
+KPX Acircumflex yacute -55
+KPX Acircumflex ydieresis -55
+KPX Adieresis T -55
+KPX Adieresis Tcaron -55
+KPX Adieresis Tcommaaccent -55
+KPX Adieresis V -74
+KPX Adieresis W -55
+KPX Adieresis Y -55
+KPX Adieresis Yacute -55
+KPX Adieresis Ydieresis -55
+KPX Adieresis quoteright -55
+KPX Adieresis space -37
+KPX Adieresis v -37
+KPX Adieresis w -37
+KPX Adieresis y -55
+KPX Adieresis yacute -55
+KPX Adieresis ydieresis -55
+KPX Agrave T -55
+KPX Agrave Tcaron -55
+KPX Agrave Tcommaaccent -55
+KPX Agrave V -74
+KPX Agrave W -55
+KPX Agrave Y -55
+KPX Agrave Yacute -55
+KPX Agrave Ydieresis -55
+KPX Agrave quoteright -55
+KPX Agrave space -37
+KPX Agrave v -37
+KPX Agrave w -37
+KPX Agrave y -55
+KPX Agrave yacute -55
+KPX Agrave ydieresis -55
+KPX Amacron T -55
+KPX Amacron Tcaron -55
+KPX Amacron Tcommaaccent -55
+KPX Amacron V -74
+KPX Amacron W -55
+KPX Amacron Y -55
+KPX Amacron Yacute -55
+KPX Amacron Ydieresis -55
+KPX Amacron quoteright -55
+KPX Amacron space -37
+KPX Amacron v -37
+KPX Amacron w -37
+KPX Amacron y -55
+KPX Amacron yacute -55
+KPX Amacron ydieresis -55
+KPX Aogonek T -55
+KPX Aogonek Tcaron -55
+KPX Aogonek Tcommaaccent -55
+KPX Aogonek V -74
+KPX Aogonek W -55
+KPX Aogonek Y -55
+KPX Aogonek Yacute -55
+KPX Aogonek Ydieresis -55
+KPX Aogonek quoteright -55
+KPX Aogonek space -37
+KPX Aogonek v -37
+KPX Aogonek w -37
+KPX Aogonek y -55
+KPX Aogonek yacute -55
+KPX Aogonek ydieresis -55
+KPX Aring T -55
+KPX Aring Tcaron -55
+KPX Aring Tcommaaccent -55
+KPX Aring V -74
+KPX Aring W -55
+KPX Aring Y -55
+KPX Aring Yacute -55
+KPX Aring Ydieresis -55
+KPX Aring quoteright -55
+KPX Aring space -37
+KPX Aring v -37
+KPX Aring w -37
+KPX Aring y -55
+KPX Aring yacute -55
+KPX Aring ydieresis -55
+KPX Atilde T -55
+KPX Atilde Tcaron -55
+KPX Atilde Tcommaaccent -55
+KPX Atilde V -74
+KPX Atilde W -55
+KPX Atilde Y -55
+KPX Atilde Yacute -55
+KPX Atilde Ydieresis -55
+KPX Atilde quoteright -55
+KPX Atilde space -37
+KPX Atilde v -37
+KPX Atilde w -37
+KPX Atilde y -55
+KPX Atilde yacute -55
+KPX Atilde ydieresis -55
+KPX F A -111
+KPX F Aacute -111
+KPX F Abreve -111
+KPX F Acircumflex -111
+KPX F Adieresis -111
+KPX F Agrave -111
+KPX F Amacron -111
+KPX F Aogonek -111
+KPX F Aring -111
+KPX F Atilde -111
+KPX F comma -111
+KPX F period -111
+KPX L T -74
+KPX L Tcaron -74
+KPX L Tcommaaccent -74
+KPX L V -74
+KPX L W -74
+KPX L Y -74
+KPX L Yacute -74
+KPX L Ydieresis -74
+KPX L quoteright -37
+KPX L space -18
+KPX L y -37
+KPX L yacute -37
+KPX L ydieresis -37
+KPX Lacute T -74
+KPX Lacute Tcaron -74
+KPX Lacute Tcommaaccent -74
+KPX Lacute V -74
+KPX Lacute W -74
+KPX Lacute Y -74
+KPX Lacute Yacute -74
+KPX Lacute Ydieresis -74
+KPX Lacute quoteright -37
+KPX Lacute space -18
+KPX Lacute y -37
+KPX Lacute yacute -37
+KPX Lacute ydieresis -37
+KPX Lcaron quoteright -37
+KPX Lcaron space -18
+KPX Lcaron y -37
+KPX Lcaron yacute -37
+KPX Lcaron ydieresis -37
+KPX Lcommaaccent T -74
+KPX Lcommaaccent Tcaron -74
+KPX Lcommaaccent Tcommaaccent -74
+KPX Lcommaaccent V -74
+KPX Lcommaaccent W -74
+KPX Lcommaaccent Y -74
+KPX Lcommaaccent Yacute -74
+KPX Lcommaaccent Ydieresis -74
+KPX Lcommaaccent quoteright -37
+KPX Lcommaaccent space -18
+KPX Lcommaaccent y -37
+KPX Lcommaaccent yacute -37
+KPX Lcommaaccent ydieresis -37
+KPX Lslash T -74
+KPX Lslash Tcaron -74
+KPX Lslash Tcommaaccent -74
+KPX Lslash V -74
+KPX Lslash W -74
+KPX Lslash Y -74
+KPX Lslash Yacute -74
+KPX Lslash Ydieresis -74
+KPX Lslash quoteright -37
+KPX Lslash space -18
+KPX Lslash y -37
+KPX Lslash yacute -37
+KPX Lslash ydieresis -37
+KPX P A -129
+KPX P Aacute -129
+KPX P Abreve -129
+KPX P Acircumflex -129
+KPX P Adieresis -129
+KPX P Agrave -129
+KPX P Amacron -129
+KPX P Aogonek -129
+KPX P Aring -129
+KPX P Atilde -129
+KPX P comma -129
+KPX P period -129
+KPX R T -55
+KPX R Tcaron -55
+KPX R Tcommaaccent -55
+KPX R V -74
+KPX R W -55
+KPX R Y -55
+KPX R Yacute -55
+KPX R Ydieresis -55
+KPX R y -37
+KPX R yacute -37
+KPX R ydieresis -37
+KPX Racute T -55
+KPX Racute Tcaron -55
+KPX Racute Tcommaaccent -55
+KPX Racute V -74
+KPX Racute W -55
+KPX Racute Y -55
+KPX Racute Yacute -55
+KPX Racute Ydieresis -55
+KPX Racute y -37
+KPX Racute yacute -37
+KPX Racute ydieresis -37
+KPX Rcaron T -55
+KPX Rcaron Tcaron -55
+KPX Rcaron Tcommaaccent -55
+KPX Rcaron V -74
+KPX Rcaron W -55
+KPX Rcaron Y -55
+KPX Rcaron Yacute -55
+KPX Rcaron Ydieresis -55
+KPX Rcaron y -37
+KPX Rcaron yacute -37
+KPX Rcaron ydieresis -37
+KPX Rcommaaccent T -55
+KPX Rcommaaccent Tcaron -55
+KPX Rcommaaccent Tcommaaccent -55
+KPX Rcommaaccent V -74
+KPX Rcommaaccent W -55
+KPX Rcommaaccent Y -55
+KPX Rcommaaccent Yacute -55
+KPX Rcommaaccent Ydieresis -55
+KPX Rcommaaccent y -37
+KPX Rcommaaccent yacute -37
+KPX Rcommaaccent ydieresis -37
+KPX T A -92
+KPX T Aacute -92
+KPX T Abreve -92
+KPX T Acircumflex -92
+KPX T Adieresis -92
+KPX T Agrave -92
+KPX T Amacron -92
+KPX T Aogonek -92
+KPX T Aring -92
+KPX T Atilde -92
+KPX T O -18
+KPX T Oacute -18
+KPX T Ocircumflex -18
+KPX T Odieresis -18
+KPX T Ograve -18
+KPX T Ohungarumlaut -18
+KPX T Omacron -18
+KPX T Oslash -18
+KPX T Otilde -18
+KPX T a -111
+KPX T aacute -111
+KPX T abreve -71
+KPX T acircumflex -71
+KPX T adieresis -71
+KPX T agrave -71
+KPX T amacron -71
+KPX T aogonek -111
+KPX T aring -71
+KPX T atilde -71
+KPX T c -111
+KPX T cacute -111
+KPX T ccaron -111
+KPX T ccedilla -111
+KPX T colon -74
+KPX T comma -74
+KPX T e -111
+KPX T eacute -111
+KPX T ecaron -111
+KPX T ecircumflex -71
+KPX T edieresis -71
+KPX T edotaccent -111
+KPX T egrave -71
+KPX T emacron -71
+KPX T eogonek -111
+KPX T hyphen -55
+KPX T i -55
+KPX T iacute -55
+KPX T iogonek -55
+KPX T o -111
+KPX T oacute -111
+KPX T ocircumflex -71
+KPX T odieresis -71
+KPX T ograve -71
+KPX T ohungarumlaut -111
+KPX T omacron -71
+KPX T oslash -111
+KPX T otilde -71
+KPX T period -74
+KPX T r -111
+KPX T racute -111
+KPX T rcaron -111
+KPX T rcommaaccent -111
+KPX T s -111
+KPX T sacute -111
+KPX T scaron -71
+KPX T scedilla -111
+KPX T scommaaccent -111
+KPX T semicolon -74
+KPX T u -111
+KPX T uacute -111
+KPX T ucircumflex -111
+KPX T udieresis -111
+KPX T ugrave -111
+KPX T uhungarumlaut -111
+KPX T umacron -111
+KPX T uogonek -111
+KPX T uring -111
+KPX T w -92
+KPX T y -92
+KPX T yacute -92
+KPX T ydieresis -92
+KPX Tcaron A -92
+KPX Tcaron Aacute -92
+KPX Tcaron Abreve -92
+KPX Tcaron Acircumflex -92
+KPX Tcaron Adieresis -92
+KPX Tcaron Agrave -92
+KPX Tcaron Amacron -92
+KPX Tcaron Aogonek -92
+KPX Tcaron Aring -92
+KPX Tcaron Atilde -92
+KPX Tcaron O -18
+KPX Tcaron Oacute -18
+KPX Tcaron Ocircumflex -18
+KPX Tcaron Odieresis -18
+KPX Tcaron Ograve -18
+KPX Tcaron Ohungarumlaut -18
+KPX Tcaron Omacron -18
+KPX Tcaron Oslash -18
+KPX Tcaron Otilde -18
+KPX Tcaron a -111
+KPX Tcaron aacute -111
+KPX Tcaron abreve -71
+KPX Tcaron acircumflex -71
+KPX Tcaron adieresis -71
+KPX Tcaron agrave -71
+KPX Tcaron amacron -71
+KPX Tcaron aogonek -111
+KPX Tcaron aring -71
+KPX Tcaron atilde -71
+KPX Tcaron c -111
+KPX Tcaron cacute -111
+KPX Tcaron ccaron -111
+KPX Tcaron ccedilla -111
+KPX Tcaron colon -74
+KPX Tcaron comma -74
+KPX Tcaron e -111
+KPX Tcaron eacute -111
+KPX Tcaron ecaron -111
+KPX Tcaron ecircumflex -71
+KPX Tcaron edieresis -71
+KPX Tcaron edotaccent -111
+KPX Tcaron egrave -71
+KPX Tcaron emacron -71
+KPX Tcaron eogonek -111
+KPX Tcaron hyphen -55
+KPX Tcaron i -55
+KPX Tcaron iacute -55
+KPX Tcaron iogonek -55
+KPX Tcaron o -111
+KPX Tcaron oacute -111
+KPX Tcaron ocircumflex -71
+KPX Tcaron odieresis -71
+KPX Tcaron ograve -71
+KPX Tcaron ohungarumlaut -111
+KPX Tcaron omacron -71
+KPX Tcaron oslash -111
+KPX Tcaron otilde -71
+KPX Tcaron period -74
+KPX Tcaron r -111
+KPX Tcaron racute -111
+KPX Tcaron rcaron -111
+KPX Tcaron rcommaaccent -111
+KPX Tcaron s -111
+KPX Tcaron sacute -111
+KPX Tcaron scaron -71
+KPX Tcaron scedilla -111
+KPX Tcaron scommaaccent -111
+KPX Tcaron semicolon -74
+KPX Tcaron u -111
+KPX Tcaron uacute -111
+KPX Tcaron ucircumflex -111
+KPX Tcaron udieresis -111
+KPX Tcaron ugrave -111
+KPX Tcaron uhungarumlaut -111
+KPX Tcaron umacron -111
+KPX Tcaron uogonek -111
+KPX Tcaron uring -111
+KPX Tcaron w -92
+KPX Tcaron y -92
+KPX Tcaron yacute -92
+KPX Tcaron ydieresis -92
+KPX Tcommaaccent A -92
+KPX Tcommaaccent Aacute -92
+KPX Tcommaaccent Abreve -92
+KPX Tcommaaccent Acircumflex -92
+KPX Tcommaaccent Adieresis -92
+KPX Tcommaaccent Agrave -92
+KPX Tcommaaccent Amacron -92
+KPX Tcommaaccent Aogonek -92
+KPX Tcommaaccent Aring -92
+KPX Tcommaaccent Atilde -92
+KPX Tcommaaccent O -18
+KPX Tcommaaccent Oacute -18
+KPX Tcommaaccent Ocircumflex -18
+KPX Tcommaaccent Odieresis -18
+KPX Tcommaaccent Ograve -18
+KPX Tcommaaccent Ohungarumlaut -18
+KPX Tcommaaccent Omacron -18
+KPX Tcommaaccent Oslash -18
+KPX Tcommaaccent Otilde -18
+KPX Tcommaaccent a -111
+KPX Tcommaaccent aacute -111
+KPX Tcommaaccent abreve -71
+KPX Tcommaaccent acircumflex -71
+KPX Tcommaaccent adieresis -71
+KPX Tcommaaccent agrave -71
+KPX Tcommaaccent amacron -71
+KPX Tcommaaccent aogonek -111
+KPX Tcommaaccent aring -71
+KPX Tcommaaccent atilde -71
+KPX Tcommaaccent c -111
+KPX Tcommaaccent cacute -111
+KPX Tcommaaccent ccaron -111
+KPX Tcommaaccent ccedilla -111
+KPX Tcommaaccent colon -74
+KPX Tcommaaccent comma -74
+KPX Tcommaaccent e -111
+KPX Tcommaaccent eacute -111
+KPX Tcommaaccent ecaron -111
+KPX Tcommaaccent ecircumflex -71
+KPX Tcommaaccent edieresis -71
+KPX Tcommaaccent edotaccent -111
+KPX Tcommaaccent egrave -71
+KPX Tcommaaccent emacron -71
+KPX Tcommaaccent eogonek -111
+KPX Tcommaaccent hyphen -55
+KPX Tcommaaccent i -55
+KPX Tcommaaccent iacute -55
+KPX Tcommaaccent iogonek -55
+KPX Tcommaaccent o -111
+KPX Tcommaaccent oacute -111
+KPX Tcommaaccent ocircumflex -111
+KPX Tcommaaccent odieresis -111
+KPX Tcommaaccent ograve -111
+KPX Tcommaaccent ohungarumlaut -111
+KPX Tcommaaccent omacron -111
+KPX Tcommaaccent oslash -111
+KPX Tcommaaccent otilde -111
+KPX Tcommaaccent period -74
+KPX Tcommaaccent r -111
+KPX Tcommaaccent racute -111
+KPX Tcommaaccent rcaron -111
+KPX Tcommaaccent rcommaaccent -111
+KPX Tcommaaccent s -111
+KPX Tcommaaccent sacute -111
+KPX Tcommaaccent scaron -71
+KPX Tcommaaccent scedilla -111
+KPX Tcommaaccent scommaaccent -111
+KPX Tcommaaccent semicolon -74
+KPX Tcommaaccent u -111
+KPX Tcommaaccent uacute -111
+KPX Tcommaaccent ucircumflex -111
+KPX Tcommaaccent udieresis -111
+KPX Tcommaaccent ugrave -111
+KPX Tcommaaccent uhungarumlaut -111
+KPX Tcommaaccent umacron -111
+KPX Tcommaaccent uogonek -111
+KPX Tcommaaccent uring -111
+KPX Tcommaaccent w -92
+KPX Tcommaaccent y -92
+KPX Tcommaaccent yacute -92
+KPX Tcommaaccent ydieresis -92
+KPX V A -210
+KPX V Aacute -210
+KPX V Abreve -210
+KPX V Acircumflex -210
+KPX V Adieresis -210
+KPX V Agrave -210
+KPX V Amacron -210
+KPX V Aogonek -210
+KPX V Aring -210
+KPX V Atilde -210
+KPX V a -74
+KPX V aacute -74
+KPX V abreve -74
+KPX V acircumflex -74
+KPX V adieresis -74
+KPX V agrave -74
+KPX V amacron -74
+KPX V aogonek -74
+KPX V aring -74
+KPX V atilde -74
+KPX V colon -37
+KPX V comma -129
+KPX V e -92
+KPX V eacute -92
+KPX V ecaron -92
+KPX V ecircumflex -52
+KPX V edieresis -52
+KPX V edotaccent -92
+KPX V egrave -52
+KPX V emacron -52
+KPX V eogonek -92
+KPX V hyphen -55
+KPX V i -74
+KPX V iacute -74
+KPX V icircumflex -34
+KPX V idieresis -34
+KPX V igrave -34
+KPX V imacron -34
+KPX V iogonek -74
+KPX V o -74
+KPX V oacute -74
+KPX V ocircumflex -74
+KPX V odieresis -74
+KPX V ograve -74
+KPX V ohungarumlaut -74
+KPX V omacron -74
+KPX V oslash -74
+KPX V otilde -74
+KPX V period -129
+KPX V r -92
+KPX V racute -92
+KPX V rcaron -92
+KPX V rcommaaccent -92
+KPX V semicolon -37
+KPX V u -74
+KPX V uacute -74
+KPX V ucircumflex -74
+KPX V udieresis -74
+KPX V ugrave -74
+KPX V uhungarumlaut -74
+KPX V umacron -74
+KPX V uogonek -74
+KPX V uring -74
+KPX V y -74
+KPX V yacute -74
+KPX V ydieresis -74
+KPX W A -92
+KPX W Aacute -92
+KPX W Abreve -92
+KPX W Acircumflex -92
+KPX W Adieresis -92
+KPX W Agrave -92
+KPX W Amacron -92
+KPX W Aogonek -92
+KPX W Aring -92
+KPX W Atilde -92
+KPX W a -20
+KPX W aacute -20
+KPX W abreve -20
+KPX W acircumflex -20
+KPX W adieresis -20
+KPX W agrave -20
+KPX W amacron -20
+KPX W aogonek -20
+KPX W aring -20
+KPX W atilde -20
+KPX W colon -18
+KPX W comma -55
+KPX W e -20
+KPX W eacute -20
+KPX W ecaron -20
+KPX W ecircumflex -20
+KPX W edieresis -20
+KPX W edotaccent -20
+KPX W egrave -20
+KPX W emacron -20
+KPX W eogonek -20
+KPX W hyphen -18
+KPX W i -20
+KPX W iacute -20
+KPX W iogonek -20
+KPX W o -20
+KPX W oacute -20
+KPX W ocircumflex -20
+KPX W odieresis -20
+KPX W ograve -20
+KPX W ohungarumlaut -20
+KPX W omacron -20
+KPX W oslash -20
+KPX W otilde -20
+KPX W period -55
+KPX W r -20
+KPX W racute -20
+KPX W rcaron -20
+KPX W rcommaaccent -20
+KPX W semicolon -18
+KPX W u -20
+KPX W uacute -20
+KPX W ucircumflex -20
+KPX W udieresis -20
+KPX W ugrave -20
+KPX W uhungarumlaut -20
+KPX W umacron -20
+KPX W uogonek -20
+KPX W uring -20
+KPX W y -20
+KPX W yacute -20
+KPX W ydieresis -20
+KPX Y A -92
+KPX Y Aacute -92
+KPX Y Abreve -92
+KPX Y Acircumflex -92
+KPX Y Adieresis -92
+KPX Y Agrave -92
+KPX Y Amacron -92
+KPX Y Aogonek -92
+KPX Y Aring -92
+KPX Y Atilde -92
+KPX Y a -92
+KPX Y aacute -92
+KPX Y abreve -92
+KPX Y acircumflex -92
+KPX Y adieresis -92
+KPX Y agrave -92
+KPX Y amacron -92
+KPX Y aogonek -92
+KPX Y aring -92
+KPX Y atilde -92
+KPX Y colon -74
+KPX Y comma -92
+KPX Y e -111
+KPX Y eacute -111
+KPX Y ecaron -111
+KPX Y ecircumflex -71
+KPX Y edieresis -71
+KPX Y edotaccent -111
+KPX Y egrave -71
+KPX Y emacron -71
+KPX Y eogonek -111
+KPX Y hyphen -74
+KPX Y i -55
+KPX Y iacute -55
+KPX Y iogonek -55
+KPX Y o -111
+KPX Y oacute -111
+KPX Y ocircumflex -111
+KPX Y odieresis -111
+KPX Y ograve -111
+KPX Y ohungarumlaut -111
+KPX Y omacron -111
+KPX Y oslash -111
+KPX Y otilde -111
+KPX Y p -74
+KPX Y period -92
+KPX Y q -92
+KPX Y semicolon -74
+KPX Y u -92
+KPX Y uacute -92
+KPX Y ucircumflex -92
+KPX Y udieresis -92
+KPX Y ugrave -92
+KPX Y uhungarumlaut -92
+KPX Y umacron -92
+KPX Y uogonek -92
+KPX Y uring -92
+KPX Y v -74
+KPX Yacute A -92
+KPX Yacute Aacute -92
+KPX Yacute Abreve -92
+KPX Yacute Acircumflex -92
+KPX Yacute Adieresis -92
+KPX Yacute Agrave -92
+KPX Yacute Amacron -92
+KPX Yacute Aogonek -92
+KPX Yacute Aring -92
+KPX Yacute Atilde -92
+KPX Yacute a -92
+KPX Yacute aacute -92
+KPX Yacute abreve -92
+KPX Yacute acircumflex -92
+KPX Yacute adieresis -92
+KPX Yacute agrave -92
+KPX Yacute amacron -92
+KPX Yacute aogonek -92
+KPX Yacute aring -92
+KPX Yacute atilde -92
+KPX Yacute colon -74
+KPX Yacute comma -92
+KPX Yacute e -111
+KPX Yacute eacute -111
+KPX Yacute ecaron -111
+KPX Yacute ecircumflex -71
+KPX Yacute edieresis -71
+KPX Yacute edotaccent -111
+KPX Yacute egrave -71
+KPX Yacute emacron -71
+KPX Yacute eogonek -111
+KPX Yacute hyphen -74
+KPX Yacute i -55
+KPX Yacute iacute -55
+KPX Yacute iogonek -55
+KPX Yacute o -111
+KPX Yacute oacute -111
+KPX Yacute ocircumflex -111
+KPX Yacute odieresis -111
+KPX Yacute ograve -111
+KPX Yacute ohungarumlaut -111
+KPX Yacute omacron -111
+KPX Yacute oslash -111
+KPX Yacute otilde -111
+KPX Yacute p -74
+KPX Yacute period -92
+KPX Yacute q -92
+KPX Yacute semicolon -74
+KPX Yacute u -92
+KPX Yacute uacute -92
+KPX Yacute ucircumflex -92
+KPX Yacute udieresis -92
+KPX Yacute ugrave -92
+KPX Yacute uhungarumlaut -92
+KPX Yacute umacron -92
+KPX Yacute uogonek -92
+KPX Yacute uring -92
+KPX Yacute v -74
+KPX Ydieresis A -92
+KPX Ydieresis Aacute -92
+KPX Ydieresis Abreve -92
+KPX Ydieresis Acircumflex -92
+KPX Ydieresis Adieresis -92
+KPX Ydieresis Agrave -92
+KPX Ydieresis Amacron -92
+KPX Ydieresis Aogonek -92
+KPX Ydieresis Aring -92
+KPX Ydieresis Atilde -92
+KPX Ydieresis a -92
+KPX Ydieresis aacute -92
+KPX Ydieresis abreve -92
+KPX Ydieresis acircumflex -92
+KPX Ydieresis adieresis -92
+KPX Ydieresis agrave -92
+KPX Ydieresis amacron -92
+KPX Ydieresis aogonek -92
+KPX Ydieresis aring -92
+KPX Ydieresis atilde -92
+KPX Ydieresis colon -74
+KPX Ydieresis comma -92
+KPX Ydieresis e -111
+KPX Ydieresis eacute -111
+KPX Ydieresis ecaron -111
+KPX Ydieresis ecircumflex -71
+KPX Ydieresis edieresis -71
+KPX Ydieresis edotaccent -111
+KPX Ydieresis egrave -71
+KPX Ydieresis emacron -71
+KPX Ydieresis eogonek -111
+KPX Ydieresis hyphen -74
+KPX Ydieresis i -55
+KPX Ydieresis iacute -55
+KPX Ydieresis iogonek -55
+KPX Ydieresis o -111
+KPX Ydieresis oacute -111
+KPX Ydieresis ocircumflex -111
+KPX Ydieresis odieresis -111
+KPX Ydieresis ograve -111
+KPX Ydieresis ohungarumlaut -111
+KPX Ydieresis omacron -111
+KPX Ydieresis oslash -111
+KPX Ydieresis otilde -111
+KPX Ydieresis p -74
+KPX Ydieresis period -92
+KPX Ydieresis q -92
+KPX Ydieresis semicolon -74
+KPX Ydieresis u -92
+KPX Ydieresis uacute -92
+KPX Ydieresis ucircumflex -92
+KPX Ydieresis udieresis -92
+KPX Ydieresis ugrave -92
+KPX Ydieresis uhungarumlaut -92
+KPX Ydieresis umacron -92
+KPX Ydieresis uogonek -92
+KPX Ydieresis uring -92
+KPX Ydieresis v -74
+KPX f quoteright 55
+KPX one one -55
+KPX quoteleft quoteleft -74
+KPX quoteright quoteright -74
+KPX quoteright s -55
+KPX quoteright sacute -55
+KPX quoteright scaron -55
+KPX quoteright scedilla -55
+KPX quoteright scommaaccent -55
+KPX quoteright space -55
+KPX quoteright t -37
+KPX quoteright tcommaaccent -37
+KPX r c -18
+KPX r cacute -18
+KPX r ccaron -18
+KPX r ccedilla -18
+KPX r comma -74
+KPX r e -18
+KPX r eacute -18
+KPX r ecaron -18
+KPX r ecircumflex -18
+KPX r edieresis -18
+KPX r edotaccent -18
+KPX r egrave -18
+KPX r emacron -18
+KPX r eogonek -18
+KPX r g -18
+KPX r gbreve -18
+KPX r gcommaaccent -18
+KPX r h -18
+KPX r o -18
+KPX r oacute -18
+KPX r ocircumflex -18
+KPX r odieresis -18
+KPX r ograve -18
+KPX r ohungarumlaut -18
+KPX r omacron -18
+KPX r oslash -18
+KPX r otilde -18
+KPX r period -74
+KPX r q -18
+KPX r quoteright 37
+KPX racute c -18
+KPX racute cacute -18
+KPX racute ccaron -18
+KPX racute ccedilla -18
+KPX racute comma -74
+KPX racute e -18
+KPX racute eacute -18
+KPX racute ecaron -18
+KPX racute ecircumflex -18
+KPX racute edieresis -18
+KPX racute edotaccent -18
+KPX racute egrave -18
+KPX racute emacron -18
+KPX racute eogonek -18
+KPX racute g -18
+KPX racute gbreve -18
+KPX racute gcommaaccent -18
+KPX racute h -18
+KPX racute o -18
+KPX racute oacute -18
+KPX racute ocircumflex -18
+KPX racute odieresis -18
+KPX racute ograve -18
+KPX racute ohungarumlaut -18
+KPX racute omacron -18
+KPX racute oslash -18
+KPX racute otilde -18
+KPX racute period -74
+KPX racute q -18
+KPX racute quoteright 37
+KPX rcaron c -18
+KPX rcaron cacute -18
+KPX rcaron ccaron -18
+KPX rcaron ccedilla -18
+KPX rcaron comma -74
+KPX rcaron e -18
+KPX rcaron eacute -18
+KPX rcaron ecaron -18
+KPX rcaron ecircumflex -18
+KPX rcaron edieresis -18
+KPX rcaron edotaccent -18
+KPX rcaron egrave -18
+KPX rcaron emacron -18
+KPX rcaron eogonek -18
+KPX rcaron g -18
+KPX rcaron gbreve -18
+KPX rcaron gcommaaccent -18
+KPX rcaron h -18
+KPX rcaron o -18
+KPX rcaron oacute -18
+KPX rcaron ocircumflex -18
+KPX rcaron odieresis -18
+KPX rcaron ograve -18
+KPX rcaron ohungarumlaut -18
+KPX rcaron omacron -18
+KPX rcaron oslash -18
+KPX rcaron otilde -18
+KPX rcaron period -74
+KPX rcaron q -18
+KPX rcaron quoteright 37
+KPX rcommaaccent c -18
+KPX rcommaaccent cacute -18
+KPX rcommaaccent ccaron -18
+KPX rcommaaccent ccedilla -18
+KPX rcommaaccent comma -74
+KPX rcommaaccent e -18
+KPX rcommaaccent eacute -18
+KPX rcommaaccent ecaron -18
+KPX rcommaaccent ecircumflex -18
+KPX rcommaaccent edieresis -18
+KPX rcommaaccent edotaccent -18
+KPX rcommaaccent egrave -18
+KPX rcommaaccent emacron -18
+KPX rcommaaccent eogonek -18
+KPX rcommaaccent g -18
+KPX rcommaaccent gbreve -18
+KPX rcommaaccent gcommaaccent -18
+KPX rcommaaccent h -18
+KPX rcommaaccent o -18
+KPX rcommaaccent oacute -18
+KPX rcommaaccent ocircumflex -18
+KPX rcommaaccent odieresis -18
+KPX rcommaaccent ograve -18
+KPX rcommaaccent ohungarumlaut -18
+KPX rcommaaccent omacron -18
+KPX rcommaaccent oslash -18
+KPX rcommaaccent otilde -18
+KPX rcommaaccent period -74
+KPX rcommaaccent q -18
+KPX rcommaaccent quoteright 37
+KPX v comma -55
+KPX v period -55
+KPX w comma -55
+KPX w period -55
+KPX y comma -37
+KPX y period -37
+KPX yacute comma -37
+KPX yacute period -37
+KPX ydieresis comma -37
+KPX ydieresis period -37
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/src/fonts/Adobe-Core35_AFMs-314/Palatino-Roman.afm b/src/fonts/Adobe-Core35_AFMs-314/Palatino-Roman.afm
new file mode 100644
index 0000000..4c5ec0a
--- /dev/null
+++ b/src/fonts/Adobe-Core35_AFMs-314/Palatino-Roman.afm
@@ -0,0 +1,1375 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1985, 1987, 1989, 1990, 1992, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Mon Jun 23 16:33:55 1997
+Comment UniqueID 43073
+Comment VMusage 50775 65800
+FontName Palatino-Roman
+FullName Palatino Roman
+FamilyName Palatino
+Weight Medium
+ItalicAngle 0
+IsFixedPitch false
+FontBBox -166 -283 1021 927
+UnderlinePosition -100
+UnderlineThickness 50
+Version 002.000
+Notice Copyright (c) 1985, 1987, 1989, 1990, 1992, 1997 Adobe Systems Incorporated. All Rights Reserved.Palatino is a trademark of Linotype-Hell AG and/or its subsidiaries.
+EncodingScheme AdobeStandardEncoding
+CapHeight 692
+XHeight 469
+Ascender 726
+Descender -281
+StdHW 51
+StdVW 84
+StartCharMetrics 314
+C 32 ; WX 250 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 278 ; N exclam ; B 81 -5 197 694 ;
+C 34 ; WX 371 ; N quotedbl ; B 51 469 320 709 ;
+C 35 ; WX 500 ; N numbersign ; B 4 0 495 684 ;
+C 36 ; WX 500 ; N dollar ; B 30 -116 471 731 ;
+C 37 ; WX 840 ; N percent ; B 39 -20 802 709 ;
+C 38 ; WX 778 ; N ampersand ; B 43 -20 753 689 ;
+C 39 ; WX 278 ; N quoteright ; B 45 446 233 709 ;
+C 40 ; WX 333 ; N parenleft ; B 60 -215 301 726 ;
+C 41 ; WX 333 ; N parenright ; B 32 -215 273 726 ;
+C 42 ; WX 389 ; N asterisk ; B 32 342 359 689 ;
+C 43 ; WX 606 ; N plus ; B 51 7 555 512 ;
+C 44 ; WX 250 ; N comma ; B 16 -155 218 123 ;
+C 45 ; WX 333 ; N hyphen ; B 17 215 312 287 ;
+C 46 ; WX 250 ; N period ; B 67 -5 183 111 ;
+C 47 ; WX 606 ; N slash ; B 87 -119 519 726 ;
+C 48 ; WX 500 ; N zero ; B 29 -20 465 689 ;
+C 49 ; WX 500 ; N one ; B 60 -3 418 694 ;
+C 50 ; WX 500 ; N two ; B 16 -3 468 689 ;
+C 51 ; WX 500 ; N three ; B 15 -20 462 689 ;
+C 52 ; WX 500 ; N four ; B 2 -3 472 694 ;
+C 53 ; WX 500 ; N five ; B 13 -20 459 689 ;
+C 54 ; WX 500 ; N six ; B 32 -20 468 689 ;
+C 55 ; WX 500 ; N seven ; B 44 -3 497 689 ;
+C 56 ; WX 500 ; N eight ; B 30 -20 464 689 ;
+C 57 ; WX 500 ; N nine ; B 20 -20 457 689 ;
+C 58 ; WX 250 ; N colon ; B 66 -5 182 456 ;
+C 59 ; WX 250 ; N semicolon ; B 16 -153 218 456 ;
+C 60 ; WX 606 ; N less ; B 57 0 558 522 ;
+C 61 ; WX 606 ; N equal ; B 51 136 555 386 ;
+C 62 ; WX 606 ; N greater ; B 48 0 549 522 ;
+C 63 ; WX 444 ; N question ; B 43 -5 395 694 ;
+C 64 ; WX 747 ; N at ; B 24 -20 724 694 ;
+C 65 ; WX 778 ; N A ; B 15 -3 756 700 ;
+C 66 ; WX 611 ; N B ; B 26 -3 576 692 ;
+C 67 ; WX 709 ; N C ; B 22 -20 670 709 ;
+C 68 ; WX 774 ; N D ; B 22 -4 751 692 ;
+C 69 ; WX 611 ; N E ; B 22 -4 572 692 ;
+C 70 ; WX 556 ; N F ; B 22 -3 536 692 ;
+C 71 ; WX 763 ; N G ; B 22 -20 728 709 ;
+C 72 ; WX 832 ; N H ; B 22 -3 810 692 ;
+C 73 ; WX 337 ; N I ; B 22 -3 315 692 ;
+C 74 ; WX 333 ; N J ; B -15 -194 311 692 ;
+C 75 ; WX 726 ; N K ; B 22 -3 719 692 ;
+C 76 ; WX 611 ; N L ; B 22 -4 586 692 ;
+C 77 ; WX 946 ; N M ; B 16 -13 926 692 ;
+C 78 ; WX 831 ; N N ; B 17 -20 813 692 ;
+C 79 ; WX 786 ; N O ; B 22 -20 764 709 ;
+C 80 ; WX 604 ; N P ; B 22 -3 580 692 ;
+C 81 ; WX 786 ; N Q ; B 22 -176 764 709 ;
+C 82 ; WX 668 ; N R ; B 22 -3 669 692 ;
+C 83 ; WX 525 ; N S ; B 24 -20 503 709 ;
+C 84 ; WX 613 ; N T ; B 18 -3 595 692 ;
+C 85 ; WX 778 ; N U ; B 12 -20 759 692 ;
+C 86 ; WX 722 ; N V ; B 8 -9 706 692 ;
+C 87 ; WX 1000 ; N W ; B 8 -9 984 700 ;
+C 88 ; WX 667 ; N X ; B 14 -3 648 700 ;
+C 89 ; WX 667 ; N Y ; B 9 -3 654 705 ;
+C 90 ; WX 667 ; N Z ; B 15 -3 638 692 ;
+C 91 ; WX 333 ; N bracketleft ; B 79 -184 288 726 ;
+C 92 ; WX 606 ; N backslash ; B 81 0 512 726 ;
+C 93 ; WX 333 ; N bracketright ; B 45 -184 254 726 ;
+C 94 ; WX 606 ; N asciicircum ; B 51 283 554 689 ;
+C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;
+C 96 ; WX 278 ; N quoteleft ; B 45 446 233 709 ;
+C 97 ; WX 500 ; N a ; B 32 -12 471 469 ;
+C 98 ; WX 553 ; N b ; B -15 -12 508 726 ;
+C 99 ; WX 444 ; N c ; B 26 -20 413 469 ;
+C 100 ; WX 611 ; N d ; B 35 -12 579 726 ;
+C 101 ; WX 479 ; N e ; B 26 -20 448 469 ;
+C 102 ; WX 333 ; N f ; B 23 -3 341 728 ; L i fi ; L l fl ;
+C 103 ; WX 556 ; N g ; B 32 -283 544 469 ;
+C 104 ; WX 582 ; N h ; B 6 -3 572 726 ;
+C 105 ; WX 291 ; N i ; B 21 -3 271 687 ;
+C 106 ; WX 234 ; N j ; B -40 -283 167 688 ;
+C 107 ; WX 556 ; N k ; B 21 -12 549 726 ;
+C 108 ; WX 291 ; N l ; B 21 -3 271 726 ;
+C 109 ; WX 883 ; N m ; B 16 -3 869 469 ;
+C 110 ; WX 582 ; N n ; B 6 -3 572 469 ;
+C 111 ; WX 546 ; N o ; B 32 -20 514 469 ;
+C 112 ; WX 601 ; N p ; B 8 -281 554 469 ;
+C 113 ; WX 560 ; N q ; B 35 -281 560 469 ;
+C 114 ; WX 395 ; N r ; B 21 -3 374 469 ;
+C 115 ; WX 424 ; N s ; B 30 -20 391 469 ;
+C 116 ; WX 326 ; N t ; B 22 -12 319 621 ;
+C 117 ; WX 603 ; N u ; B 18 -12 581 469 ;
+C 118 ; WX 565 ; N v ; B 6 -7 539 459 ;
+C 119 ; WX 834 ; N w ; B 6 -7 808 469 ;
+C 120 ; WX 516 ; N x ; B 20 -3 496 469 ;
+C 121 ; WX 556 ; N y ; B 12 -283 544 459 ;
+C 122 ; WX 500 ; N z ; B 16 -3 466 462 ;
+C 123 ; WX 333 ; N braceleft ; B 58 -175 289 726 ;
+C 124 ; WX 606 ; N bar ; B 275 -250 331 750 ;
+C 125 ; WX 333 ; N braceright ; B 44 -175 275 726 ;
+C 126 ; WX 606 ; N asciitilde ; B 51 176 555 347 ;
+C 161 ; WX 278 ; N exclamdown ; B 81 -225 197 469 ;
+C 162 ; WX 500 ; N cent ; B 61 -101 448 562 ;
+C 163 ; WX 500 ; N sterling ; B 12 -13 478 694 ;
+C 164 ; WX 167 ; N fraction ; B -166 0 337 689 ;
+C 165 ; WX 500 ; N yen ; B 5 -3 496 702 ;
+C 166 ; WX 500 ; N florin ; B 0 -262 473 706 ;
+C 167 ; WX 500 ; N section ; B 26 -219 465 709 ;
+C 168 ; WX 500 ; N currency ; B 30 96 470 531 ;
+C 169 ; WX 208 ; N quotesingle ; B 60 469 148 709 ;
+C 170 ; WX 500 ; N quotedblleft ; B 51 446 449 709 ;
+C 171 ; WX 500 ; N guillemotleft ; B 50 71 450 428 ;
+C 172 ; WX 331 ; N guilsinglleft ; B 66 71 265 428 ;
+C 173 ; WX 331 ; N guilsinglright ; B 66 71 265 428 ;
+C 174 ; WX 605 ; N fi ; B 23 -3 587 728 ;
+C 175 ; WX 608 ; N fl ; B 23 -3 590 728 ;
+C 177 ; WX 500 ; N endash ; B 0 219 500 277 ;
+C 178 ; WX 500 ; N dagger ; B 34 -5 466 694 ;
+C 179 ; WX 500 ; N daggerdbl ; B 34 -249 466 694 ;
+C 180 ; WX 250 ; N periodcentered ; B 67 203 183 319 ;
+C 182 ; WX 628 ; N paragraph ; B 39 -150 589 695 ;
+C 183 ; WX 606 ; N bullet ; B 131 172 475 516 ;
+C 184 ; WX 278 ; N quotesinglbase ; B 22 -153 210 110 ;
+C 185 ; WX 500 ; N quotedblbase ; B 51 -153 449 110 ;
+C 186 ; WX 500 ; N quotedblright ; B 51 446 449 709 ;
+C 187 ; WX 500 ; N guillemotright ; B 50 71 450 428 ;
+C 188 ; WX 1000 ; N ellipsis ; B 109 -5 891 111 ;
+C 189 ; WX 1144 ; N perthousand ; B 123 -20 1021 709 ;
+C 191 ; WX 444 ; N questiondown ; B 43 -231 395 469 ;
+C 193 ; WX 333 ; N grave ; B 31 506 255 677 ;
+C 194 ; WX 333 ; N acute ; B 78 506 302 677 ;
+C 195 ; WX 333 ; N circumflex ; B 11 510 323 677 ;
+C 196 ; WX 333 ; N tilde ; B 2 535 332 640 ;
+C 197 ; WX 333 ; N macron ; B 11 538 323 591 ;
+C 198 ; WX 333 ; N breve ; B 26 506 308 664 ;
+C 199 ; WX 250 ; N dotaccent ; B 70 576 181 687 ;
+C 200 ; WX 333 ; N dieresis ; B 12 576 322 687 ;
+C 202 ; WX 333 ; N ring ; B 67 496 267 696 ;
+C 203 ; WX 333 ; N cedilla ; B 96 -225 304 -10 ;
+C 205 ; WX 380 ; N hungarumlaut ; B 3 506 377 687 ;
+C 206 ; WX 313 ; N ogonek ; B 50 -225 288 -20 ;
+C 207 ; WX 333 ; N caron ; B 11 510 323 677 ;
+C 208 ; WX 1000 ; N emdash ; B 0 219 1000 277 ;
+C 225 ; WX 944 ; N AE ; B -10 -4 908 692 ;
+C 227 ; WX 333 ; N ordfeminine ; B 24 422 310 709 ;
+C 232 ; WX 611 ; N Lslash ; B 6 -4 586 692 ;
+C 233 ; WX 833 ; N Oslash ; B 30 -20 797 709 ;
+C 234 ; WX 998 ; N OE ; B 22 -20 962 709 ;
+C 235 ; WX 333 ; N ordmasculine ; B 10 416 323 709 ;
+C 241 ; WX 758 ; N ae ; B 30 -20 732 469 ;
+C 245 ; WX 287 ; N dotlessi ; B 21 -3 271 469 ;
+C 248 ; WX 291 ; N lslash ; B -14 -3 306 726 ;
+C 249 ; WX 556 ; N oslash ; B 16 -23 530 474 ;
+C 250 ; WX 827 ; N oe ; B 32 -20 800 469 ;
+C 251 ; WX 556 ; N germandbls ; B 23 -9 519 731 ;
+C -1 ; WX 337 ; N Idieresis ; B 14 -3 324 868 ;
+C -1 ; WX 479 ; N eacute ; B 26 -20 448 697 ;
+C -1 ; WX 500 ; N abreve ; B 32 -12 471 684 ;
+C -1 ; WX 603 ; N uhungarumlaut ; B 18 -12 581 707 ;
+C -1 ; WX 479 ; N ecaron ; B 26 -20 448 697 ;
+C -1 ; WX 667 ; N Ydieresis ; B 9 -3 654 868 ;
+C -1 ; WX 606 ; N divide ; B 51 10 555 512 ;
+C -1 ; WX 667 ; N Yacute ; B 9 -3 654 908 ;
+C -1 ; WX 778 ; N Acircumflex ; B 15 -3 756 908 ;
+C -1 ; WX 500 ; N aacute ; B 32 -12 471 697 ;
+C -1 ; WX 778 ; N Ucircumflex ; B 12 -20 759 908 ;
+C -1 ; WX 556 ; N yacute ; B 12 -283 544 697 ;
+C -1 ; WX 424 ; N scommaaccent ; B 30 -263 391 469 ;
+C -1 ; WX 479 ; N ecircumflex ; B 26 -20 448 697 ;
+C -1 ; WX 778 ; N Uring ; B 12 -20 759 927 ;
+C -1 ; WX 778 ; N Udieresis ; B 12 -20 759 868 ;
+C -1 ; WX 500 ; N aogonek ; B 32 -225 488 469 ;
+C -1 ; WX 778 ; N Uacute ; B 12 -20 759 908 ;
+C -1 ; WX 603 ; N uogonek ; B 18 -225 628 469 ;
+C -1 ; WX 611 ; N Edieresis ; B 22 -4 572 868 ;
+C -1 ; WX 774 ; N Dcroat ; B 14 -3 751 692 ;
+C -1 ; WX 250 ; N commaaccent ; B 53 -283 213 -50 ;
+C -1 ; WX 747 ; N copyright ; B 11 -18 736 706 ;
+C -1 ; WX 611 ; N Emacron ; B 22 -4 572 822 ;
+C -1 ; WX 444 ; N ccaron ; B 26 -20 413 697 ;
+C -1 ; WX 500 ; N aring ; B 32 -12 471 716 ;
+C -1 ; WX 831 ; N Ncommaaccent ; B 17 -283 813 692 ;
+C -1 ; WX 291 ; N lacute ; B 21 -3 321 927 ;
+C -1 ; WX 500 ; N agrave ; B 32 -12 471 697 ;
+C -1 ; WX 613 ; N Tcommaaccent ; B 18 -283 595 692 ;
+C -1 ; WX 709 ; N Cacute ; B 22 -20 670 908 ;
+C -1 ; WX 500 ; N atilde ; B 32 -12 471 672 ;
+C -1 ; WX 611 ; N Edotaccent ; B 22 -4 572 868 ;
+C -1 ; WX 424 ; N scaron ; B 30 -20 391 697 ;
+C -1 ; WX 424 ; N scedilla ; B 30 -225 391 469 ;
+C -1 ; WX 287 ; N iacute ; B 21 -3 279 697 ;
+C -1 ; WX 471 ; N lozenge ; B 21 0 451 710 ;
+C -1 ; WX 668 ; N Rcaron ; B 22 -3 669 908 ;
+C -1 ; WX 763 ; N Gcommaaccent ; B 22 -283 728 709 ;
+C -1 ; WX 603 ; N ucircumflex ; B 18 -12 581 697 ;
+C -1 ; WX 500 ; N acircumflex ; B 32 -12 471 697 ;
+C -1 ; WX 778 ; N Amacron ; B 15 -3 756 822 ;
+C -1 ; WX 395 ; N rcaron ; B 21 -3 374 697 ;
+C -1 ; WX 444 ; N ccedilla ; B 26 -225 413 469 ;
+C -1 ; WX 667 ; N Zdotaccent ; B 15 -3 638 868 ;
+C -1 ; WX 604 ; N Thorn ; B 32 -3 574 692 ;
+C -1 ; WX 786 ; N Omacron ; B 22 -20 764 822 ;
+C -1 ; WX 668 ; N Racute ; B 22 -3 669 908 ;
+C -1 ; WX 525 ; N Sacute ; B 24 -20 503 908 ;
+C -1 ; WX 671 ; N dcaron ; B 35 -12 684 736 ;
+C -1 ; WX 778 ; N Umacron ; B 12 -20 759 822 ;
+C -1 ; WX 603 ; N uring ; B 18 -12 581 716 ;
+C -1 ; WX 300 ; N threesuperior ; B 1 266 299 689 ;
+C -1 ; WX 786 ; N Ograve ; B 22 -20 764 908 ;
+C -1 ; WX 778 ; N Agrave ; B 15 -3 756 908 ;
+C -1 ; WX 778 ; N Abreve ; B 15 -3 756 915 ;
+C -1 ; WX 606 ; N multiply ; B 83 36 523 474 ;
+C -1 ; WX 603 ; N uacute ; B 18 -12 581 697 ;
+C -1 ; WX 613 ; N Tcaron ; B 18 -3 595 908 ;
+C -1 ; WX 476 ; N partialdiff ; B 34 -21 450 711 ;
+C -1 ; WX 556 ; N ydieresis ; B 12 -283 544 657 ;
+C -1 ; WX 831 ; N Nacute ; B 17 -20 813 908 ;
+C -1 ; WX 287 ; N icircumflex ; B -12 -3 300 697 ;
+C -1 ; WX 611 ; N Ecircumflex ; B 22 -4 572 908 ;
+C -1 ; WX 500 ; N adieresis ; B 32 -12 471 657 ;
+C -1 ; WX 479 ; N edieresis ; B 26 -20 448 657 ;
+C -1 ; WX 444 ; N cacute ; B 26 -20 413 697 ;
+C -1 ; WX 582 ; N nacute ; B 6 -3 572 697 ;
+C -1 ; WX 603 ; N umacron ; B 18 -12 581 611 ;
+C -1 ; WX 831 ; N Ncaron ; B 17 -20 813 908 ;
+C -1 ; WX 337 ; N Iacute ; B 22 -3 315 908 ;
+C -1 ; WX 606 ; N plusminus ; B 51 0 555 512 ;
+C -1 ; WX 606 ; N brokenbar ; B 275 -175 331 675 ;
+C -1 ; WX 747 ; N registered ; B 11 -18 736 706 ;
+C -1 ; WX 763 ; N Gbreve ; B 22 -20 728 915 ;
+C -1 ; WX 337 ; N Idotaccent ; B 22 -3 315 868 ;
+C -1 ; WX 600 ; N summation ; B 15 -10 586 706 ;
+C -1 ; WX 611 ; N Egrave ; B 22 -4 572 908 ;
+C -1 ; WX 395 ; N racute ; B 21 -3 374 697 ;
+C -1 ; WX 546 ; N omacron ; B 32 -20 514 611 ;
+C -1 ; WX 667 ; N Zacute ; B 15 -3 638 908 ;
+C -1 ; WX 667 ; N Zcaron ; B 15 -3 638 908 ;
+C -1 ; WX 549 ; N greaterequal ; B 26 0 523 643 ;
+C -1 ; WX 774 ; N Eth ; B 14 -3 751 692 ;
+C -1 ; WX 709 ; N Ccedilla ; B 22 -225 670 709 ;
+C -1 ; WX 291 ; N lcommaaccent ; B 21 -263 271 726 ;
+C -1 ; WX 386 ; N tcaron ; B 22 -12 401 746 ;
+C -1 ; WX 479 ; N eogonek ; B 26 -225 448 469 ;
+C -1 ; WX 778 ; N Uogonek ; B 12 -225 759 692 ;
+C -1 ; WX 778 ; N Aacute ; B 15 -3 756 908 ;
+C -1 ; WX 778 ; N Adieresis ; B 15 -3 756 868 ;
+C -1 ; WX 479 ; N egrave ; B 26 -20 448 697 ;
+C -1 ; WX 500 ; N zacute ; B 16 -3 466 697 ;
+C -1 ; WX 291 ; N iogonek ; B 21 -225 318 687 ;
+C -1 ; WX 786 ; N Oacute ; B 22 -20 764 908 ;
+C -1 ; WX 546 ; N oacute ; B 32 -20 514 697 ;
+C -1 ; WX 500 ; N amacron ; B 32 -12 471 611 ;
+C -1 ; WX 424 ; N sacute ; B 30 -20 391 697 ;
+C -1 ; WX 287 ; N idieresis ; B -11 -3 299 657 ;
+C -1 ; WX 786 ; N Ocircumflex ; B 22 -20 764 908 ;
+C -1 ; WX 778 ; N Ugrave ; B 12 -20 759 908 ;
+C -1 ; WX 600 ; N Delta ; B 6 0 608 688 ;
+C -1 ; WX 601 ; N thorn ; B -2 -281 544 726 ;
+C -1 ; WX 300 ; N twosuperior ; B 0 273 301 689 ;
+C -1 ; WX 786 ; N Odieresis ; B 22 -20 764 868 ;
+C -1 ; WX 603 ; N mu ; B 18 -236 581 469 ;
+C -1 ; WX 287 ; N igrave ; B 8 -3 271 697 ;
+C -1 ; WX 546 ; N ohungarumlaut ; B 32 -20 514 707 ;
+C -1 ; WX 611 ; N Eogonek ; B 22 -225 572 692 ;
+C -1 ; WX 611 ; N dcroat ; B 35 -12 579 726 ;
+C -1 ; WX 750 ; N threequarters ; B 15 -3 735 689 ;
+C -1 ; WX 525 ; N Scedilla ; B 24 -225 503 709 ;
+C -1 ; WX 371 ; N lcaron ; B 21 -3 376 726 ;
+C -1 ; WX 726 ; N Kcommaaccent ; B 22 -283 719 692 ;
+C -1 ; WX 611 ; N Lacute ; B 22 -4 586 908 ;
+C -1 ; WX 979 ; N trademark ; B 40 285 939 689 ;
+C -1 ; WX 479 ; N edotaccent ; B 26 -20 448 657 ;
+C -1 ; WX 337 ; N Igrave ; B 22 -3 315 908 ;
+C -1 ; WX 337 ; N Imacron ; B 13 -3 325 822 ;
+C -1 ; WX 611 ; N Lcaron ; B 22 -4 586 716 ;
+C -1 ; WX 750 ; N onehalf ; B 15 -3 735 692 ;
+C -1 ; WX 549 ; N lessequal ; B 26 0 523 642 ;
+C -1 ; WX 546 ; N ocircumflex ; B 32 -20 514 697 ;
+C -1 ; WX 582 ; N ntilde ; B 6 -3 572 672 ;
+C -1 ; WX 778 ; N Uhungarumlaut ; B 12 -20 759 918 ;
+C -1 ; WX 611 ; N Eacute ; B 22 -4 572 908 ;
+C -1 ; WX 479 ; N emacron ; B 26 -20 448 611 ;
+C -1 ; WX 556 ; N gbreve ; B 32 -283 544 724 ;
+C -1 ; WX 750 ; N onequarter ; B 30 -3 727 692 ;
+C -1 ; WX 525 ; N Scaron ; B 24 -20 503 908 ;
+C -1 ; WX 525 ; N Scommaaccent ; B 24 -283 503 709 ;
+C -1 ; WX 786 ; N Ohungarumlaut ; B 22 -20 764 918 ;
+C -1 ; WX 400 ; N degree ; B 50 389 350 689 ;
+C -1 ; WX 546 ; N ograve ; B 32 -20 514 697 ;
+C -1 ; WX 709 ; N Ccaron ; B 22 -20 670 908 ;
+C -1 ; WX 603 ; N ugrave ; B 18 -12 581 697 ;
+C -1 ; WX 453 ; N radical ; B 12 -55 442 747 ;
+C -1 ; WX 774 ; N Dcaron ; B 22 -4 751 908 ;
+C -1 ; WX 395 ; N rcommaaccent ; B 21 -263 374 469 ;
+C -1 ; WX 831 ; N Ntilde ; B 17 -20 813 871 ;
+C -1 ; WX 546 ; N otilde ; B 32 -20 514 672 ;
+C -1 ; WX 668 ; N Rcommaaccent ; B 22 -283 669 692 ;
+C -1 ; WX 611 ; N Lcommaaccent ; B 22 -283 586 692 ;
+C -1 ; WX 778 ; N Atilde ; B 15 -3 756 871 ;
+C -1 ; WX 778 ; N Aogonek ; B 15 -225 768 700 ;
+C -1 ; WX 778 ; N Aring ; B 15 -3 756 927 ;
+C -1 ; WX 786 ; N Otilde ; B 22 -20 764 883 ;
+C -1 ; WX 500 ; N zdotaccent ; B 16 -3 466 657 ;
+C -1 ; WX 611 ; N Ecaron ; B 22 -4 572 908 ;
+C -1 ; WX 337 ; N Iogonek ; B 22 -225 328 692 ;
+C -1 ; WX 556 ; N kcommaaccent ; B 21 -263 549 726 ;
+C -1 ; WX 606 ; N minus ; B 51 233 555 289 ;
+C -1 ; WX 337 ; N Icircumflex ; B 13 -3 325 908 ;
+C -1 ; WX 582 ; N ncaron ; B 6 -3 572 697 ;
+C -1 ; WX 326 ; N tcommaaccent ; B 22 -263 319 621 ;
+C -1 ; WX 606 ; N logicalnot ; B 51 120 551 386 ;
+C -1 ; WX 546 ; N odieresis ; B 32 -20 514 657 ;
+C -1 ; WX 603 ; N udieresis ; B 18 -12 581 657 ;
+C -1 ; WX 549 ; N notequal ; B 12 -16 537 538 ;
+C -1 ; WX 556 ; N gcommaaccent ; B 32 -283 544 773 ;
+C -1 ; WX 546 ; N eth ; B 32 -20 504 728 ;
+C -1 ; WX 500 ; N zcaron ; B 16 -3 466 697 ;
+C -1 ; WX 582 ; N ncommaaccent ; B 6 -263 572 469 ;
+C -1 ; WX 300 ; N onesuperior ; B 31 273 269 692 ;
+C -1 ; WX 291 ; N imacron ; B 21 -3 271 591 ;
+EndCharMetrics
+StartKernData
+StartKernPairs 1031
+KPX A T -74
+KPX A Tcaron -74
+KPX A Tcommaaccent -74
+KPX A V -111
+KPX A W -74
+KPX A Y -111
+KPX A Yacute -111
+KPX A Ydieresis -111
+KPX A quoteright -74
+KPX A space -55
+KPX A v -92
+KPX A w -74
+KPX A y -74
+KPX A yacute -74
+KPX A ydieresis -74
+KPX Aacute T -74
+KPX Aacute Tcaron -74
+KPX Aacute Tcommaaccent -74
+KPX Aacute V -111
+KPX Aacute W -74
+KPX Aacute Y -111
+KPX Aacute Yacute -111
+KPX Aacute Ydieresis -111
+KPX Aacute quoteright -74
+KPX Aacute space -55
+KPX Aacute v -92
+KPX Aacute w -74
+KPX Aacute y -74
+KPX Aacute yacute -74
+KPX Aacute ydieresis -74
+KPX Abreve T -74
+KPX Abreve Tcaron -74
+KPX Abreve Tcommaaccent -74
+KPX Abreve V -111
+KPX Abreve W -74
+KPX Abreve Y -111
+KPX Abreve Yacute -111
+KPX Abreve Ydieresis -111
+KPX Abreve quoteright -74
+KPX Abreve space -55
+KPX Abreve v -92
+KPX Abreve w -74
+KPX Abreve y -74
+KPX Abreve yacute -74
+KPX Abreve ydieresis -74
+KPX Acircumflex T -74
+KPX Acircumflex Tcaron -74
+KPX Acircumflex Tcommaaccent -74
+KPX Acircumflex V -111
+KPX Acircumflex W -74
+KPX Acircumflex Y -111
+KPX Acircumflex Yacute -111
+KPX Acircumflex Ydieresis -111
+KPX Acircumflex quoteright -74
+KPX Acircumflex space -55
+KPX Acircumflex v -92
+KPX Acircumflex w -74
+KPX Acircumflex y -74
+KPX Acircumflex yacute -74
+KPX Acircumflex ydieresis -74
+KPX Adieresis T -74
+KPX Adieresis Tcaron -74
+KPX Adieresis Tcommaaccent -74
+KPX Adieresis V -111
+KPX Adieresis W -74
+KPX Adieresis Y -111
+KPX Adieresis Yacute -111
+KPX Adieresis Ydieresis -111
+KPX Adieresis quoteright -74
+KPX Adieresis space -55
+KPX Adieresis v -92
+KPX Adieresis w -74
+KPX Adieresis y -74
+KPX Adieresis yacute -74
+KPX Adieresis ydieresis -74
+KPX Agrave T -74
+KPX Agrave Tcaron -74
+KPX Agrave Tcommaaccent -74
+KPX Agrave V -111
+KPX Agrave W -74
+KPX Agrave Y -111
+KPX Agrave Yacute -111
+KPX Agrave Ydieresis -111
+KPX Agrave quoteright -74
+KPX Agrave space -55
+KPX Agrave v -92
+KPX Agrave w -74
+KPX Agrave y -74
+KPX Agrave yacute -74
+KPX Agrave ydieresis -74
+KPX Amacron T -74
+KPX Amacron Tcaron -74
+KPX Amacron Tcommaaccent -74
+KPX Amacron V -111
+KPX Amacron W -74
+KPX Amacron Y -111
+KPX Amacron Yacute -111
+KPX Amacron Ydieresis -111
+KPX Amacron quoteright -74
+KPX Amacron space -55
+KPX Amacron v -92
+KPX Amacron w -74
+KPX Amacron y -74
+KPX Amacron yacute -74
+KPX Amacron ydieresis -74
+KPX Aogonek T -74
+KPX Aogonek Tcaron -74
+KPX Aogonek Tcommaaccent -74
+KPX Aogonek V -111
+KPX Aogonek W -74
+KPX Aogonek Y -111
+KPX Aogonek Yacute -111
+KPX Aogonek Ydieresis -111
+KPX Aogonek quoteright -74
+KPX Aogonek space -55
+KPX Aogonek v -92
+KPX Aogonek w -74
+KPX Aogonek y -74
+KPX Aogonek yacute -74
+KPX Aogonek ydieresis -74
+KPX Aring T -74
+KPX Aring Tcaron -74
+KPX Aring Tcommaaccent -74
+KPX Aring V -111
+KPX Aring W -74
+KPX Aring Y -111
+KPX Aring Yacute -111
+KPX Aring Ydieresis -111
+KPX Aring quoteright -74
+KPX Aring space -55
+KPX Aring v -92
+KPX Aring w -74
+KPX Aring y -74
+KPX Aring yacute -74
+KPX Aring ydieresis -74
+KPX Atilde T -74
+KPX Atilde Tcaron -74
+KPX Atilde Tcommaaccent -74
+KPX Atilde V -111
+KPX Atilde W -74
+KPX Atilde Y -111
+KPX Atilde Yacute -111
+KPX Atilde Ydieresis -111
+KPX Atilde quoteright -74
+KPX Atilde space -55
+KPX Atilde v -92
+KPX Atilde w -74
+KPX Atilde y -74
+KPX Atilde yacute -74
+KPX Atilde ydieresis -74
+KPX F A -74
+KPX F Aacute -74
+KPX F Abreve -74
+KPX F Acircumflex -74
+KPX F Adieresis -74
+KPX F Agrave -74
+KPX F Amacron -74
+KPX F Aogonek -74
+KPX F Aring -74
+KPX F Atilde -74
+KPX F comma -92
+KPX F period -92
+KPX L T -74
+KPX L Tcaron -74
+KPX L Tcommaaccent -74
+KPX L V -92
+KPX L W -74
+KPX L Y -92
+KPX L Yacute -92
+KPX L Ydieresis -92
+KPX L quoteright -74
+KPX L space -37
+KPX L y -55
+KPX L yacute -55
+KPX L ydieresis -55
+KPX Lacute T -74
+KPX Lacute Tcaron -74
+KPX Lacute Tcommaaccent -74
+KPX Lacute V -92
+KPX Lacute W -74
+KPX Lacute Y -92
+KPX Lacute Yacute -92
+KPX Lacute Ydieresis -92
+KPX Lacute quoteright -74
+KPX Lacute space -37
+KPX Lacute y -55
+KPX Lacute yacute -55
+KPX Lacute ydieresis -55
+KPX Lcaron T -74
+KPX Lcaron Tcaron -74
+KPX Lcaron Tcommaaccent -74
+KPX Lcaron V -92
+KPX Lcaron W -74
+KPX Lcaron Y -92
+KPX Lcaron Yacute -92
+KPX Lcaron Ydieresis -92
+KPX Lcaron quoteright -74
+KPX Lcaron space -37
+KPX Lcaron y -55
+KPX Lcaron yacute -55
+KPX Lcaron ydieresis -55
+KPX Lcommaaccent T -74
+KPX Lcommaaccent Tcaron -74
+KPX Lcommaaccent Tcommaaccent -74
+KPX Lcommaaccent V -92
+KPX Lcommaaccent W -74
+KPX Lcommaaccent Y -92
+KPX Lcommaaccent Yacute -92
+KPX Lcommaaccent Ydieresis -92
+KPX Lcommaaccent quoteright -74
+KPX Lcommaaccent space -37
+KPX Lcommaaccent y -55
+KPX Lcommaaccent yacute -55
+KPX Lcommaaccent ydieresis -55
+KPX Lslash T -74
+KPX Lslash Tcaron -74
+KPX Lslash Tcommaaccent -74
+KPX Lslash V -92
+KPX Lslash W -74
+KPX Lslash Y -92
+KPX Lslash Yacute -92
+KPX Lslash Ydieresis -92
+KPX Lslash quoteright -74
+KPX Lslash space -37
+KPX Lslash y -55
+KPX Lslash yacute -55
+KPX Lslash ydieresis -55
+KPX P A -92
+KPX P Aacute -92
+KPX P Abreve -92
+KPX P Acircumflex -92
+KPX P Adieresis -92
+KPX P Agrave -92
+KPX P Amacron -92
+KPX P Aogonek -92
+KPX P Aring -92
+KPX P Atilde -92
+KPX P comma -129
+KPX P period -129
+KPX P space -18
+KPX R T -37
+KPX R Tcaron -37
+KPX R Tcommaaccent -37
+KPX R V -55
+KPX R W -37
+KPX R Y -37
+KPX R Yacute -37
+KPX R Ydieresis -37
+KPX R y -37
+KPX R yacute -37
+KPX R ydieresis -37
+KPX Racute T -37
+KPX Racute Tcaron -37
+KPX Racute Tcommaaccent -37
+KPX Racute V -55
+KPX Racute W -37
+KPX Racute Y -37
+KPX Racute Yacute -37
+KPX Racute Ydieresis -37
+KPX Racute y -37
+KPX Racute yacute -37
+KPX Racute ydieresis -37
+KPX Rcaron T -37
+KPX Rcaron Tcaron -37
+KPX Rcaron Tcommaaccent -37
+KPX Rcaron V -55
+KPX Rcaron W -37
+KPX Rcaron Y -37
+KPX Rcaron Yacute -37
+KPX Rcaron Ydieresis -37
+KPX Rcaron y -37
+KPX Rcaron yacute -37
+KPX Rcaron ydieresis -37
+KPX Rcommaaccent T -37
+KPX Rcommaaccent Tcaron -37
+KPX Rcommaaccent Tcommaaccent -37
+KPX Rcommaaccent V -55
+KPX Rcommaaccent W -37
+KPX Rcommaaccent Y -37
+KPX Rcommaaccent Yacute -37
+KPX Rcommaaccent Ydieresis -37
+KPX Rcommaaccent y -37
+KPX Rcommaaccent yacute -37
+KPX Rcommaaccent ydieresis -37
+KPX T A -74
+KPX T Aacute -74
+KPX T Abreve -74
+KPX T Acircumflex -74
+KPX T Adieresis -74
+KPX T Agrave -74
+KPX T Amacron -74
+KPX T Aogonek -74
+KPX T Aring -74
+KPX T Atilde -74
+KPX T O -18
+KPX T Oacute -18
+KPX T Ocircumflex -18
+KPX T Odieresis -18
+KPX T Ograve -18
+KPX T Ohungarumlaut -18
+KPX T Omacron -18
+KPX T Oslash -18
+KPX T Otilde -18
+KPX T a -92
+KPX T aacute -92
+KPX T abreve -92
+KPX T acircumflex -92
+KPX T adieresis -52
+KPX T agrave -52
+KPX T amacron -52
+KPX T aogonek -92
+KPX T aring -92
+KPX T atilde -52
+KPX T c -111
+KPX T cacute -111
+KPX T ccaron -71
+KPX T ccedilla -111
+KPX T colon -55
+KPX T comma -74
+KPX T e -92
+KPX T eacute -92
+KPX T ecaron -92
+KPX T ecircumflex -92
+KPX T edieresis -52
+KPX T edotaccent -92
+KPX T egrave -92
+KPX T emacron -92
+KPX T eogonek -92
+KPX T hyphen -55
+KPX T i -55
+KPX T iacute -55
+KPX T iogonek -55
+KPX T o -92
+KPX T oacute -92
+KPX T ocircumflex -92
+KPX T odieresis -92
+KPX T ograve -92
+KPX T ohungarumlaut -92
+KPX T omacron -92
+KPX T oslash -92
+KPX T otilde -92
+KPX T period -74
+KPX T r -90
+KPX T racute -90
+KPX T rcaron -50
+KPX T rcommaaccent -90
+KPX T s -90
+KPX T sacute -90
+KPX T scaron -50
+KPX T scedilla -90
+KPX T scommaaccent -90
+KPX T semicolon -55
+KPX T u -90
+KPX T uacute -90
+KPX T ucircumflex -90
+KPX T udieresis -90
+KPX T ugrave -90
+KPX T uhungarumlaut -90
+KPX T umacron -90
+KPX T uogonek -90
+KPX T uring -90
+KPX T w -90
+KPX T y -90
+KPX T yacute -90
+KPX T ydieresis -90
+KPX Tcaron A -74
+KPX Tcaron Aacute -74
+KPX Tcaron Abreve -74
+KPX Tcaron Acircumflex -74
+KPX Tcaron Adieresis -74
+KPX Tcaron Agrave -74
+KPX Tcaron Amacron -74
+KPX Tcaron Aogonek -74
+KPX Tcaron Aring -74
+KPX Tcaron Atilde -74
+KPX Tcaron O -18
+KPX Tcaron Oacute -18
+KPX Tcaron Ocircumflex -18
+KPX Tcaron Odieresis -18
+KPX Tcaron Ograve -18
+KPX Tcaron Ohungarumlaut -18
+KPX Tcaron Omacron -18
+KPX Tcaron Oslash -18
+KPX Tcaron Otilde -18
+KPX Tcaron a -92
+KPX Tcaron aacute -92
+KPX Tcaron abreve -92
+KPX Tcaron acircumflex -92
+KPX Tcaron adieresis -52
+KPX Tcaron agrave -52
+KPX Tcaron amacron -52
+KPX Tcaron aogonek -92
+KPX Tcaron aring -92
+KPX Tcaron atilde -52
+KPX Tcaron c -111
+KPX Tcaron cacute -111
+KPX Tcaron ccaron -71
+KPX Tcaron ccedilla -111
+KPX Tcaron colon -55
+KPX Tcaron comma -74
+KPX Tcaron e -92
+KPX Tcaron eacute -92
+KPX Tcaron ecaron -92
+KPX Tcaron ecircumflex -92
+KPX Tcaron edieresis -52
+KPX Tcaron edotaccent -92
+KPX Tcaron egrave -92
+KPX Tcaron emacron -92
+KPX Tcaron eogonek -92
+KPX Tcaron hyphen -55
+KPX Tcaron i -55
+KPX Tcaron iacute -55
+KPX Tcaron iogonek -55
+KPX Tcaron o -92
+KPX Tcaron oacute -92
+KPX Tcaron ocircumflex -92
+KPX Tcaron odieresis -92
+KPX Tcaron ograve -92
+KPX Tcaron ohungarumlaut -92
+KPX Tcaron omacron -92
+KPX Tcaron oslash -92
+KPX Tcaron otilde -92
+KPX Tcaron period -74
+KPX Tcaron r -90
+KPX Tcaron racute -90
+KPX Tcaron rcaron -50
+KPX Tcaron rcommaaccent -90
+KPX Tcaron s -90
+KPX Tcaron sacute -90
+KPX Tcaron scaron -50
+KPX Tcaron scedilla -90
+KPX Tcaron scommaaccent -90
+KPX Tcaron semicolon -55
+KPX Tcaron u -90
+KPX Tcaron uacute -90
+KPX Tcaron ucircumflex -90
+KPX Tcaron udieresis -90
+KPX Tcaron ugrave -90
+KPX Tcaron uhungarumlaut -90
+KPX Tcaron umacron -90
+KPX Tcaron uogonek -90
+KPX Tcaron uring -90
+KPX Tcaron w -90
+KPX Tcaron y -90
+KPX Tcaron yacute -90
+KPX Tcaron ydieresis -90
+KPX Tcommaaccent A -74
+KPX Tcommaaccent Aacute -74
+KPX Tcommaaccent Abreve -74
+KPX Tcommaaccent Acircumflex -74
+KPX Tcommaaccent Adieresis -74
+KPX Tcommaaccent Agrave -74
+KPX Tcommaaccent Amacron -74
+KPX Tcommaaccent Aogonek -74
+KPX Tcommaaccent Aring -74
+KPX Tcommaaccent Atilde -74
+KPX Tcommaaccent O -18
+KPX Tcommaaccent Oacute -18
+KPX Tcommaaccent Ocircumflex -18
+KPX Tcommaaccent Odieresis -18
+KPX Tcommaaccent Ograve -18
+KPX Tcommaaccent Ohungarumlaut -18
+KPX Tcommaaccent Omacron -18
+KPX Tcommaaccent Oslash -18
+KPX Tcommaaccent Otilde -18
+KPX Tcommaaccent a -92
+KPX Tcommaaccent aacute -92
+KPX Tcommaaccent abreve -92
+KPX Tcommaaccent acircumflex -92
+KPX Tcommaaccent adieresis -52
+KPX Tcommaaccent agrave -52
+KPX Tcommaaccent amacron -52
+KPX Tcommaaccent aogonek -92
+KPX Tcommaaccent aring -92
+KPX Tcommaaccent atilde -52
+KPX Tcommaaccent c -111
+KPX Tcommaaccent cacute -111
+KPX Tcommaaccent ccaron -71
+KPX Tcommaaccent ccedilla -111
+KPX Tcommaaccent colon -55
+KPX Tcommaaccent comma -74
+KPX Tcommaaccent e -92
+KPX Tcommaaccent eacute -92
+KPX Tcommaaccent ecaron -92
+KPX Tcommaaccent ecircumflex -92
+KPX Tcommaaccent edieresis -52
+KPX Tcommaaccent edotaccent -92
+KPX Tcommaaccent egrave -92
+KPX Tcommaaccent emacron -92
+KPX Tcommaaccent eogonek -92
+KPX Tcommaaccent hyphen -55
+KPX Tcommaaccent i -55
+KPX Tcommaaccent iacute -55
+KPX Tcommaaccent iogonek -55
+KPX Tcommaaccent o -92
+KPX Tcommaaccent oacute -92
+KPX Tcommaaccent ocircumflex -92
+KPX Tcommaaccent odieresis -92
+KPX Tcommaaccent ograve -92
+KPX Tcommaaccent ohungarumlaut -92
+KPX Tcommaaccent omacron -92
+KPX Tcommaaccent oslash -92
+KPX Tcommaaccent otilde -92
+KPX Tcommaaccent period -74
+KPX Tcommaaccent r -90
+KPX Tcommaaccent racute -90
+KPX Tcommaaccent rcaron -50
+KPX Tcommaaccent rcommaaccent -90
+KPX Tcommaaccent s -90
+KPX Tcommaaccent sacute -90
+KPX Tcommaaccent scaron -50
+KPX Tcommaaccent scedilla -90
+KPX Tcommaaccent scommaaccent -90
+KPX Tcommaaccent semicolon -55
+KPX Tcommaaccent u -90
+KPX Tcommaaccent uacute -90
+KPX Tcommaaccent ucircumflex -90
+KPX Tcommaaccent udieresis -90
+KPX Tcommaaccent ugrave -90
+KPX Tcommaaccent uhungarumlaut -90
+KPX Tcommaaccent umacron -90
+KPX Tcommaaccent uogonek -90
+KPX Tcommaaccent uring -90
+KPX Tcommaaccent w -90
+KPX Tcommaaccent y -90
+KPX Tcommaaccent yacute -90
+KPX Tcommaaccent ydieresis -90
+KPX V A -111
+KPX V Aacute -111
+KPX V Abreve -111
+KPX V Acircumflex -111
+KPX V Adieresis -111
+KPX V Agrave -111
+KPX V Amacron -111
+KPX V Aogonek -111
+KPX V Aring -111
+KPX V Atilde -111
+KPX V a -92
+KPX V aacute -92
+KPX V abreve -92
+KPX V acircumflex -92
+KPX V adieresis -92
+KPX V agrave -92
+KPX V amacron -92
+KPX V aogonek -92
+KPX V aring -92
+KPX V atilde -92
+KPX V colon -55
+KPX V comma -129
+KPX V e -111
+KPX V eacute -111
+KPX V ecaron -111
+KPX V ecircumflex -111
+KPX V edieresis -71
+KPX V edotaccent -111
+KPX V egrave -71
+KPX V emacron -111
+KPX V eogonek -111
+KPX V hyphen -74
+KPX V i -55
+KPX V iacute -55
+KPX V iogonek -55
+KPX V o -111
+KPX V oacute -111
+KPX V ocircumflex -111
+KPX V odieresis -111
+KPX V ograve -71
+KPX V ohungarumlaut -111
+KPX V omacron -111
+KPX V oslash -111
+KPX V otilde -111
+KPX V period -129
+KPX V r -92
+KPX V racute -92
+KPX V rcaron -92
+KPX V rcommaaccent -92
+KPX V semicolon -55
+KPX V u -92
+KPX V uacute -92
+KPX V ucircumflex -92
+KPX V udieresis -92
+KPX V ugrave -92
+KPX V uhungarumlaut -92
+KPX V umacron -92
+KPX V uogonek -92
+KPX V uring -92
+KPX V y -92
+KPX V yacute -92
+KPX V ydieresis -92
+KPX W A -92
+KPX W Aacute -92
+KPX W Abreve -92
+KPX W Acircumflex -92
+KPX W Adieresis -92
+KPX W Agrave -92
+KPX W Amacron -92
+KPX W Aogonek -92
+KPX W Aring -92
+KPX W Atilde -92
+KPX W a -92
+KPX W aacute -92
+KPX W abreve -92
+KPX W acircumflex -92
+KPX W adieresis -92
+KPX W agrave -92
+KPX W amacron -92
+KPX W aogonek -92
+KPX W aring -92
+KPX W atilde -92
+KPX W colon -18
+KPX W comma -92
+KPX W e -92
+KPX W eacute -92
+KPX W ecaron -92
+KPX W ecircumflex -92
+KPX W edieresis -92
+KPX W edotaccent -92
+KPX W egrave -92
+KPX W emacron -92
+KPX W eogonek -92
+KPX W hyphen -55
+KPX W i -55
+KPX W iacute -55
+KPX W icircumflex -55
+KPX W idieresis -55
+KPX W igrave -55
+KPX W imacron -55
+KPX W iogonek -55
+KPX W o -92
+KPX W oacute -92
+KPX W ocircumflex -92
+KPX W odieresis -92
+KPX W ograve -92
+KPX W ohungarumlaut -92
+KPX W omacron -92
+KPX W oslash -92
+KPX W otilde -92
+KPX W period -92
+KPX W r -74
+KPX W racute -74
+KPX W rcaron -74
+KPX W rcommaaccent -74
+KPX W semicolon -18
+KPX W u -50
+KPX W uacute -50
+KPX W ucircumflex -50
+KPX W udieresis -50
+KPX W ugrave -50
+KPX W uhungarumlaut -50
+KPX W umacron -50
+KPX W uogonek -50
+KPX W uring -50
+KPX W y -50
+KPX W yacute -50
+KPX W ydieresis -50
+KPX Y A -92
+KPX Y Aacute -92
+KPX Y Abreve -92
+KPX Y Acircumflex -92
+KPX Y Adieresis -92
+KPX Y Agrave -92
+KPX Y Amacron -92
+KPX Y Aogonek -92
+KPX Y Aring -92
+KPX Y Atilde -92
+KPX Y a -92
+KPX Y aacute -92
+KPX Y abreve -92
+KPX Y acircumflex -92
+KPX Y adieresis -92
+KPX Y agrave -92
+KPX Y amacron -92
+KPX Y aogonek -92
+KPX Y aring -92
+KPX Y atilde -92
+KPX Y colon -74
+KPX Y comma -111
+KPX Y e -92
+KPX Y eacute -92
+KPX Y ecaron -92
+KPX Y ecircumflex -92
+KPX Y edieresis -92
+KPX Y edotaccent -92
+KPX Y egrave -92
+KPX Y emacron -92
+KPX Y eogonek -92
+KPX Y hyphen -92
+KPX Y i -55
+KPX Y iacute -55
+KPX Y imacron -55
+KPX Y iogonek -55
+KPX Y o -92
+KPX Y oacute -92
+KPX Y ocircumflex -92
+KPX Y odieresis -92
+KPX Y ograve -92
+KPX Y ohungarumlaut -92
+KPX Y omacron -92
+KPX Y oslash -92
+KPX Y otilde -92
+KPX Y p -111
+KPX Y period -111
+KPX Y q -90
+KPX Y semicolon -74
+KPX Y space -18
+KPX Y u -90
+KPX Y uacute -90
+KPX Y ucircumflex -90
+KPX Y udieresis -90
+KPX Y ugrave -90
+KPX Y uhungarumlaut -90
+KPX Y umacron -90
+KPX Y uogonek -90
+KPX Y uring -90
+KPX Y v -90
+KPX Yacute A -92
+KPX Yacute Aacute -92
+KPX Yacute Abreve -92
+KPX Yacute Acircumflex -92
+KPX Yacute Adieresis -92
+KPX Yacute Agrave -92
+KPX Yacute Amacron -92
+KPX Yacute Aogonek -92
+KPX Yacute Aring -92
+KPX Yacute Atilde -92
+KPX Yacute a -92
+KPX Yacute aacute -92
+KPX Yacute abreve -92
+KPX Yacute acircumflex -92
+KPX Yacute adieresis -92
+KPX Yacute agrave -92
+KPX Yacute amacron -92
+KPX Yacute aogonek -92
+KPX Yacute aring -92
+KPX Yacute atilde -92
+KPX Yacute colon -74
+KPX Yacute comma -111
+KPX Yacute e -92
+KPX Yacute eacute -92
+KPX Yacute ecaron -92
+KPX Yacute ecircumflex -92
+KPX Yacute edieresis -92
+KPX Yacute edotaccent -92
+KPX Yacute egrave -92
+KPX Yacute emacron -92
+KPX Yacute eogonek -92
+KPX Yacute hyphen -92
+KPX Yacute i -55
+KPX Yacute iacute -55
+KPX Yacute imacron -55
+KPX Yacute iogonek -55
+KPX Yacute o -92
+KPX Yacute oacute -92
+KPX Yacute ocircumflex -92
+KPX Yacute odieresis -92
+KPX Yacute ograve -92
+KPX Yacute ohungarumlaut -92
+KPX Yacute omacron -92
+KPX Yacute oslash -92
+KPX Yacute otilde -92
+KPX Yacute p -111
+KPX Yacute period -111
+KPX Yacute q -90
+KPX Yacute semicolon -74
+KPX Yacute space -18
+KPX Yacute u -90
+KPX Yacute uacute -90
+KPX Yacute ucircumflex -90
+KPX Yacute udieresis -90
+KPX Yacute ugrave -90
+KPX Yacute uhungarumlaut -90
+KPX Yacute umacron -90
+KPX Yacute uogonek -90
+KPX Yacute uring -90
+KPX Yacute v -90
+KPX Ydieresis A -92
+KPX Ydieresis Aacute -92
+KPX Ydieresis Abreve -92
+KPX Ydieresis Acircumflex -92
+KPX Ydieresis Adieresis -92
+KPX Ydieresis Agrave -92
+KPX Ydieresis Amacron -92
+KPX Ydieresis Aogonek -92
+KPX Ydieresis Aring -92
+KPX Ydieresis Atilde -92
+KPX Ydieresis a -92
+KPX Ydieresis aacute -92
+KPX Ydieresis abreve -92
+KPX Ydieresis acircumflex -92
+KPX Ydieresis adieresis -92
+KPX Ydieresis agrave -92
+KPX Ydieresis amacron -92
+KPX Ydieresis aogonek -92
+KPX Ydieresis aring -92
+KPX Ydieresis atilde -92
+KPX Ydieresis colon -74
+KPX Ydieresis comma -111
+KPX Ydieresis e -92
+KPX Ydieresis eacute -92
+KPX Ydieresis ecaron -92
+KPX Ydieresis ecircumflex -92
+KPX Ydieresis edieresis -92
+KPX Ydieresis edotaccent -92
+KPX Ydieresis egrave -92
+KPX Ydieresis emacron -92
+KPX Ydieresis eogonek -92
+KPX Ydieresis hyphen -92
+KPX Ydieresis i -55
+KPX Ydieresis iacute -55
+KPX Ydieresis imacron -55
+KPX Ydieresis iogonek -55
+KPX Ydieresis o -92
+KPX Ydieresis oacute -92
+KPX Ydieresis ocircumflex -92
+KPX Ydieresis odieresis -92
+KPX Ydieresis ograve -92
+KPX Ydieresis ohungarumlaut -92
+KPX Ydieresis omacron -92
+KPX Ydieresis oslash -92
+KPX Ydieresis otilde -92
+KPX Ydieresis p -111
+KPX Ydieresis period -111
+KPX Ydieresis q -90
+KPX Ydieresis semicolon -74
+KPX Ydieresis space -18
+KPX Ydieresis u -90
+KPX Ydieresis uacute -90
+KPX Ydieresis ucircumflex -90
+KPX Ydieresis udieresis -90
+KPX Ydieresis ugrave -90
+KPX Ydieresis uhungarumlaut -90
+KPX Ydieresis umacron -90
+KPX Ydieresis uogonek -90
+KPX Ydieresis uring -90
+KPX Ydieresis v -90
+KPX f f -18
+KPX f quoteright 55
+KPX one one -55
+KPX quoteleft quoteleft -37
+KPX quoteright quoteright -37
+KPX r c -18
+KPX r cacute -18
+KPX r ccaron -18
+KPX r ccedilla -18
+KPX r comma -74
+KPX r d -18
+KPX r dcroat -18
+KPX r e -18
+KPX r eacute -18
+KPX r ecaron -18
+KPX r ecircumflex -18
+KPX r edieresis -18
+KPX r edotaccent -18
+KPX r egrave -18
+KPX r emacron -18
+KPX r eogonek -18
+KPX r g -18
+KPX r gbreve -18
+KPX r gcommaaccent -18
+KPX r h -18
+KPX r hyphen -18
+KPX r o -18
+KPX r oacute -18
+KPX r ocircumflex -18
+KPX r odieresis -18
+KPX r ograve -18
+KPX r ohungarumlaut -18
+KPX r omacron -18
+KPX r oslash -18
+KPX r otilde -18
+KPX r period -74
+KPX r q -18
+KPX r quoteright 74
+KPX r u -8
+KPX r uacute -8
+KPX r ucircumflex -8
+KPX r udieresis -8
+KPX r ugrave -8
+KPX r uhungarumlaut -8
+KPX r umacron -8
+KPX r uogonek -8
+KPX r uring -8
+KPX racute c -18
+KPX racute cacute -18
+KPX racute ccaron -18
+KPX racute ccedilla -18
+KPX racute comma -74
+KPX racute d -18
+KPX racute dcroat -18
+KPX racute e -18
+KPX racute eacute -18
+KPX racute ecaron -18
+KPX racute ecircumflex -18
+KPX racute edieresis -18
+KPX racute edotaccent -18
+KPX racute egrave -18
+KPX racute emacron -18
+KPX racute eogonek -18
+KPX racute g -18
+KPX racute gbreve -18
+KPX racute gcommaaccent -18
+KPX racute h -18
+KPX racute hyphen -18
+KPX racute o -18
+KPX racute oacute -18
+KPX racute ocircumflex -18
+KPX racute odieresis -18
+KPX racute ograve -18
+KPX racute ohungarumlaut -18
+KPX racute omacron -18
+KPX racute oslash -18
+KPX racute otilde -18
+KPX racute period -74
+KPX racute q -18
+KPX racute quoteright 74
+KPX racute u -8
+KPX racute uacute -8
+KPX racute ucircumflex -8
+KPX racute udieresis -8
+KPX racute ugrave -8
+KPX racute uhungarumlaut -8
+KPX racute umacron -8
+KPX racute uogonek -8
+KPX racute uring -8
+KPX rcaron c -18
+KPX rcaron cacute -18
+KPX rcaron ccaron -18
+KPX rcaron ccedilla -18
+KPX rcaron comma -74
+KPX rcaron d -18
+KPX rcaron dcroat -18
+KPX rcaron e -18
+KPX rcaron eacute -18
+KPX rcaron ecaron -18
+KPX rcaron ecircumflex -18
+KPX rcaron edieresis -18
+KPX rcaron edotaccent -18
+KPX rcaron egrave -18
+KPX rcaron emacron -18
+KPX rcaron eogonek -18
+KPX rcaron g -18
+KPX rcaron gbreve -18
+KPX rcaron gcommaaccent -18
+KPX rcaron h -18
+KPX rcaron hyphen -18
+KPX rcaron o -18
+KPX rcaron oacute -18
+KPX rcaron ocircumflex -18
+KPX rcaron odieresis -18
+KPX rcaron ograve -18
+KPX rcaron ohungarumlaut -18
+KPX rcaron omacron -18
+KPX rcaron oslash -18
+KPX rcaron otilde -18
+KPX rcaron period -74
+KPX rcaron q -18
+KPX rcaron quoteright 74
+KPX rcaron u -8
+KPX rcaron uacute -8
+KPX rcaron ucircumflex -8
+KPX rcaron udieresis -8
+KPX rcaron ugrave -8
+KPX rcaron uhungarumlaut -8
+KPX rcaron umacron -8
+KPX rcaron uogonek -8
+KPX rcaron uring -8
+KPX rcommaaccent c -18
+KPX rcommaaccent cacute -18
+KPX rcommaaccent ccaron -18
+KPX rcommaaccent ccedilla -18
+KPX rcommaaccent comma -74
+KPX rcommaaccent d -18
+KPX rcommaaccent dcroat -18
+KPX rcommaaccent e -18
+KPX rcommaaccent eacute -18
+KPX rcommaaccent ecaron -18
+KPX rcommaaccent ecircumflex -18
+KPX rcommaaccent edieresis -18
+KPX rcommaaccent edotaccent -18
+KPX rcommaaccent egrave -18
+KPX rcommaaccent emacron -18
+KPX rcommaaccent eogonek -18
+KPX rcommaaccent g -18
+KPX rcommaaccent gbreve -18
+KPX rcommaaccent gcommaaccent -18
+KPX rcommaaccent h -18
+KPX rcommaaccent hyphen -18
+KPX rcommaaccent o -18
+KPX rcommaaccent oacute -18
+KPX rcommaaccent ocircumflex -18
+KPX rcommaaccent odieresis -18
+KPX rcommaaccent ograve -18
+KPX rcommaaccent ohungarumlaut -18
+KPX rcommaaccent omacron -18
+KPX rcommaaccent oslash -18
+KPX rcommaaccent otilde -18
+KPX rcommaaccent period -74
+KPX rcommaaccent q -18
+KPX rcommaaccent quoteright 74
+KPX rcommaaccent u -8
+KPX rcommaaccent uacute -8
+KPX rcommaaccent ucircumflex -8
+KPX rcommaaccent udieresis -8
+KPX rcommaaccent ugrave -8
+KPX rcommaaccent uhungarumlaut -8
+KPX rcommaaccent umacron -8
+KPX rcommaaccent uogonek -8
+KPX rcommaaccent uring -8
+KPX space A -37
+KPX space Aacute -37
+KPX space Abreve -37
+KPX space Acircumflex -37
+KPX space Adieresis -37
+KPX space Agrave -37
+KPX space Amacron -37
+KPX space Aogonek -37
+KPX space Aring -37
+KPX space Atilde -37
+KPX space Y -18
+KPX space Yacute -18
+KPX space Ydieresis -18
+KPX v comma -111
+KPX v period -111
+KPX w comma -92
+KPX w period -92
+KPX y comma -111
+KPX y period -111
+KPX yacute comma -111
+KPX yacute period -111
+KPX ydieresis comma -111
+KPX ydieresis period -111
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/src/fonts/Adobe-Core35_AFMs-314/Symbol.afm b/src/fonts/Adobe-Core35_AFMs-314/Symbol.afm
new file mode 100644
index 0000000..dd95148
--- /dev/null
+++ b/src/fonts/Adobe-Core35_AFMs-314/Symbol.afm
@@ -0,0 +1,212 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All rights reserved.
+Comment Creation Date: Thu May 1 15:12:25 1997
+Comment UniqueID 43064
+Comment VMusage 30820 39997
+FontName Symbol
+FullName Symbol
+FamilyName Symbol
+Weight Medium
+ItalicAngle 0
+IsFixedPitch false
+FontBBox -180 -293 1090 1010
+UnderlinePosition -100
+UnderlineThickness 50
+Version 001.008
+Notice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All rights reserved.
+EncodingScheme FontSpecific
+StdHW 92
+StdVW 85
+StartCharMetrics 190
+C 32 ; WX 250 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 333 ; N exclam ; B 128 -17 240 672 ;
+C 34 ; WX 713 ; N universal ; B 31 0 681 705 ;
+C 35 ; WX 500 ; N numbersign ; B 20 -16 481 673 ;
+C 36 ; WX 549 ; N existential ; B 25 0 478 707 ;
+C 37 ; WX 833 ; N percent ; B 63 -36 771 655 ;
+C 38 ; WX 778 ; N ampersand ; B 41 -18 750 661 ;
+C 39 ; WX 439 ; N suchthat ; B 48 -17 414 500 ;
+C 40 ; WX 333 ; N parenleft ; B 53 -191 300 673 ;
+C 41 ; WX 333 ; N parenright ; B 30 -191 277 673 ;
+C 42 ; WX 500 ; N asteriskmath ; B 65 134 427 551 ;
+C 43 ; WX 549 ; N plus ; B 10 0 539 533 ;
+C 44 ; WX 250 ; N comma ; B 56 -152 194 104 ;
+C 45 ; WX 549 ; N minus ; B 11 233 535 288 ;
+C 46 ; WX 250 ; N period ; B 69 -17 181 95 ;
+C 47 ; WX 278 ; N slash ; B 0 -18 254 646 ;
+C 48 ; WX 500 ; N zero ; B 24 -14 476 685 ;
+C 49 ; WX 500 ; N one ; B 117 0 390 673 ;
+C 50 ; WX 500 ; N two ; B 25 0 475 685 ;
+C 51 ; WX 500 ; N three ; B 43 -14 435 685 ;
+C 52 ; WX 500 ; N four ; B 15 0 469 685 ;
+C 53 ; WX 500 ; N five ; B 32 -14 445 690 ;
+C 54 ; WX 500 ; N six ; B 34 -14 468 685 ;
+C 55 ; WX 500 ; N seven ; B 24 -16 448 673 ;
+C 56 ; WX 500 ; N eight ; B 56 -14 445 685 ;
+C 57 ; WX 500 ; N nine ; B 30 -18 459 685 ;
+C 58 ; WX 278 ; N colon ; B 81 -17 193 460 ;
+C 59 ; WX 278 ; N semicolon ; B 83 -152 221 460 ;
+C 60 ; WX 549 ; N less ; B 26 0 523 522 ;
+C 61 ; WX 549 ; N equal ; B 11 141 537 390 ;
+C 62 ; WX 549 ; N greater ; B 26 0 523 522 ;
+C 63 ; WX 444 ; N question ; B 70 -17 412 686 ;
+C 64 ; WX 549 ; N congruent ; B 11 0 537 475 ;
+C 65 ; WX 722 ; N Alpha ; B 4 0 684 673 ;
+C 66 ; WX 667 ; N Beta ; B 29 0 592 673 ;
+C 67 ; WX 722 ; N Chi ; B -9 0 704 673 ;
+C 68 ; WX 612 ; N Delta ; B 6 0 608 688 ;
+C 69 ; WX 611 ; N Epsilon ; B 32 0 617 673 ;
+C 70 ; WX 763 ; N Phi ; B 26 0 741 673 ;
+C 71 ; WX 603 ; N Gamma ; B 24 0 609 673 ;
+C 72 ; WX 722 ; N Eta ; B 39 0 729 673 ;
+C 73 ; WX 333 ; N Iota ; B 32 0 316 673 ;
+C 74 ; WX 631 ; N theta1 ; B 18 -18 623 689 ;
+C 75 ; WX 722 ; N Kappa ; B 35 0 722 673 ;
+C 76 ; WX 686 ; N Lambda ; B 6 0 680 688 ;
+C 77 ; WX 889 ; N Mu ; B 28 0 887 673 ;
+C 78 ; WX 722 ; N Nu ; B 29 -8 720 673 ;
+C 79 ; WX 722 ; N Omicron ; B 41 -17 715 685 ;
+C 80 ; WX 768 ; N Pi ; B 25 0 745 673 ;
+C 81 ; WX 741 ; N Theta ; B 41 -17 715 685 ;
+C 82 ; WX 556 ; N Rho ; B 28 0 563 673 ;
+C 83 ; WX 592 ; N Sigma ; B 5 0 589 673 ;
+C 84 ; WX 611 ; N Tau ; B 33 0 607 673 ;
+C 85 ; WX 690 ; N Upsilon ; B -8 0 694 673 ;
+C 86 ; WX 439 ; N sigma1 ; B 40 -233 436 500 ;
+C 87 ; WX 768 ; N Omega ; B 34 0 736 688 ;
+C 88 ; WX 645 ; N Xi ; B 40 0 599 673 ;
+C 89 ; WX 795 ; N Psi ; B 15 0 781 684 ;
+C 90 ; WX 611 ; N Zeta ; B 44 0 636 673 ;
+C 91 ; WX 333 ; N bracketleft ; B 86 -155 299 674 ;
+C 92 ; WX 863 ; N therefore ; B 163 0 701 487 ;
+C 93 ; WX 333 ; N bracketright ; B 33 -155 246 674 ;
+C 94 ; WX 658 ; N perpendicular ; B 15 0 652 674 ;
+C 95 ; WX 500 ; N underscore ; B -2 -125 502 -75 ;
+C 96 ; WX 500 ; N radicalex ; B 480 881 1090 917 ;
+C 97 ; WX 631 ; N alpha ; B 41 -18 622 500 ;
+C 98 ; WX 549 ; N beta ; B 61 -223 515 741 ;
+C 99 ; WX 549 ; N chi ; B 12 -231 522 499 ;
+C 100 ; WX 494 ; N delta ; B 40 -19 481 740 ;
+C 101 ; WX 439 ; N epsilon ; B 22 -19 427 502 ;
+C 102 ; WX 521 ; N phi ; B 28 -224 492 673 ;
+C 103 ; WX 411 ; N gamma ; B 5 -225 484 499 ;
+C 104 ; WX 603 ; N eta ; B 0 -202 527 514 ;
+C 105 ; WX 329 ; N iota ; B 0 -17 301 503 ;
+C 106 ; WX 603 ; N phi1 ; B 36 -224 587 499 ;
+C 107 ; WX 549 ; N kappa ; B 33 0 558 501 ;
+C 108 ; WX 549 ; N lambda ; B 24 -17 548 739 ;
+C 109 ; WX 576 ; N mu ; B 33 -223 567 500 ;
+C 110 ; WX 521 ; N nu ; B -9 -16 475 507 ;
+C 111 ; WX 549 ; N omicron ; B 35 -19 501 499 ;
+C 112 ; WX 549 ; N pi ; B 10 -19 530 487 ;
+C 113 ; WX 521 ; N theta ; B 43 -17 485 690 ;
+C 114 ; WX 549 ; N rho ; B 50 -230 490 499 ;
+C 115 ; WX 603 ; N sigma ; B 30 -21 588 500 ;
+C 116 ; WX 439 ; N tau ; B 10 -19 418 500 ;
+C 117 ; WX 576 ; N upsilon ; B 7 -18 535 507 ;
+C 118 ; WX 713 ; N omega1 ; B 12 -18 671 583 ;
+C 119 ; WX 686 ; N omega ; B 42 -17 684 500 ;
+C 120 ; WX 493 ; N xi ; B 27 -224 469 766 ;
+C 121 ; WX 686 ; N psi ; B 12 -228 701 500 ;
+C 122 ; WX 494 ; N zeta ; B 60 -225 467 756 ;
+C 123 ; WX 480 ; N braceleft ; B 58 -183 397 673 ;
+C 124 ; WX 200 ; N bar ; B 65 -293 135 707 ;
+C 125 ; WX 480 ; N braceright ; B 79 -183 418 673 ;
+C 126 ; WX 549 ; N similar ; B 17 203 529 307 ;
+C 160 ; WX 750 ; N Euro ; B 20 -12 714 685 ;
+C 161 ; WX 620 ; N Upsilon1 ; B -2 0 610 685 ;
+C 162 ; WX 247 ; N minute ; B 27 459 228 735 ;
+C 163 ; WX 549 ; N lessequal ; B 29 0 526 639 ;
+C 164 ; WX 167 ; N fraction ; B -180 -12 340 677 ;
+C 165 ; WX 713 ; N infinity ; B 26 124 688 404 ;
+C 166 ; WX 500 ; N florin ; B 2 -193 494 686 ;
+C 167 ; WX 753 ; N club ; B 86 -26 660 533 ;
+C 168 ; WX 753 ; N diamond ; B 142 -36 600 550 ;
+C 169 ; WX 753 ; N heart ; B 117 -33 631 532 ;
+C 170 ; WX 753 ; N spade ; B 113 -36 629 548 ;
+C 171 ; WX 1042 ; N arrowboth ; B 24 -15 1024 511 ;
+C 172 ; WX 987 ; N arrowleft ; B 32 -15 942 511 ;
+C 173 ; WX 603 ; N arrowup ; B 45 0 571 910 ;
+C 174 ; WX 987 ; N arrowright ; B 49 -15 959 511 ;
+C 175 ; WX 603 ; N arrowdown ; B 45 -22 571 888 ;
+C 176 ; WX 400 ; N degree ; B 50 385 350 685 ;
+C 177 ; WX 549 ; N plusminus ; B 10 0 539 645 ;
+C 178 ; WX 411 ; N second ; B 20 459 413 737 ;
+C 179 ; WX 549 ; N greaterequal ; B 29 0 526 639 ;
+C 180 ; WX 549 ; N multiply ; B 17 8 533 524 ;
+C 181 ; WX 713 ; N proportional ; B 27 123 639 404 ;
+C 182 ; WX 494 ; N partialdiff ; B 26 -20 462 746 ;
+C 183 ; WX 460 ; N bullet ; B 50 113 410 473 ;
+C 184 ; WX 549 ; N divide ; B 10 71 536 456 ;
+C 185 ; WX 549 ; N notequal ; B 15 -25 540 549 ;
+C 186 ; WX 549 ; N equivalence ; B 14 82 538 443 ;
+C 187 ; WX 549 ; N approxequal ; B 14 135 527 394 ;
+C 188 ; WX 1000 ; N ellipsis ; B 111 -17 889 95 ;
+C 189 ; WX 603 ; N arrowvertex ; B 280 -120 336 1010 ;
+C 190 ; WX 1000 ; N arrowhorizex ; B -60 220 1050 276 ;
+C 191 ; WX 658 ; N carriagereturn ; B 15 -16 602 629 ;
+C 192 ; WX 823 ; N aleph ; B 175 -18 661 658 ;
+C 193 ; WX 686 ; N Ifraktur ; B 10 -53 578 740 ;
+C 194 ; WX 795 ; N Rfraktur ; B 26 -15 759 734 ;
+C 195 ; WX 987 ; N weierstrass ; B 159 -211 870 573 ;
+C 196 ; WX 768 ; N circlemultiply ; B 43 -17 733 673 ;
+C 197 ; WX 768 ; N circleplus ; B 43 -15 733 675 ;
+C 198 ; WX 823 ; N emptyset ; B 39 -24 781 719 ;
+C 199 ; WX 768 ; N intersection ; B 40 0 732 509 ;
+C 200 ; WX 768 ; N union ; B 40 -17 732 492 ;
+C 201 ; WX 713 ; N propersuperset ; B 20 0 673 470 ;
+C 202 ; WX 713 ; N reflexsuperset ; B 20 -125 673 470 ;
+C 203 ; WX 713 ; N notsubset ; B 36 -70 690 540 ;
+C 204 ; WX 713 ; N propersubset ; B 37 0 690 470 ;
+C 205 ; WX 713 ; N reflexsubset ; B 37 -125 690 470 ;
+C 206 ; WX 713 ; N element ; B 45 0 505 468 ;
+C 207 ; WX 713 ; N notelement ; B 45 -58 505 555 ;
+C 208 ; WX 768 ; N angle ; B 26 0 738 673 ;
+C 209 ; WX 713 ; N gradient ; B 36 -19 681 718 ;
+C 210 ; WX 790 ; N registerserif ; B 50 -17 740 673 ;
+C 211 ; WX 790 ; N copyrightserif ; B 51 -15 741 675 ;
+C 212 ; WX 890 ; N trademarkserif ; B 18 293 855 673 ;
+C 213 ; WX 823 ; N product ; B 25 -101 803 751 ;
+C 214 ; WX 549 ; N radical ; B 10 -38 515 917 ;
+C 215 ; WX 250 ; N dotmath ; B 69 210 169 310 ;
+C 216 ; WX 713 ; N logicalnot ; B 15 0 680 288 ;
+C 217 ; WX 603 ; N logicaland ; B 23 0 583 454 ;
+C 218 ; WX 603 ; N logicalor ; B 30 0 578 477 ;
+C 219 ; WX 1042 ; N arrowdblboth ; B 27 -20 1023 510 ;
+C 220 ; WX 987 ; N arrowdblleft ; B 30 -15 939 513 ;
+C 221 ; WX 603 ; N arrowdblup ; B 39 2 567 911 ;
+C 222 ; WX 987 ; N arrowdblright ; B 45 -20 954 508 ;
+C 223 ; WX 603 ; N arrowdbldown ; B 44 -19 572 890 ;
+C 224 ; WX 494 ; N lozenge ; B 18 0 466 745 ;
+C 225 ; WX 329 ; N angleleft ; B 25 -198 306 746 ;
+C 226 ; WX 790 ; N registersans ; B 50 -20 740 670 ;
+C 227 ; WX 790 ; N copyrightsans ; B 49 -15 739 675 ;
+C 228 ; WX 786 ; N trademarksans ; B 5 293 725 673 ;
+C 229 ; WX 713 ; N summation ; B 14 -108 695 752 ;
+C 230 ; WX 384 ; N parenlefttp ; B 24 -293 436 926 ;
+C 231 ; WX 384 ; N parenleftex ; B 24 -85 108 925 ;
+C 232 ; WX 384 ; N parenleftbt ; B 24 -293 436 926 ;
+C 233 ; WX 384 ; N bracketlefttp ; B 0 -80 349 926 ;
+C 234 ; WX 384 ; N bracketleftex ; B 0 -79 77 925 ;
+C 235 ; WX 384 ; N bracketleftbt ; B 0 -80 349 926 ;
+C 236 ; WX 494 ; N bracelefttp ; B 209 -85 445 925 ;
+C 237 ; WX 494 ; N braceleftmid ; B 20 -85 284 935 ;
+C 238 ; WX 494 ; N braceleftbt ; B 209 -75 445 935 ;
+C 239 ; WX 494 ; N braceex ; B 209 -85 284 935 ;
+C 241 ; WX 329 ; N angleright ; B 21 -198 302 746 ;
+C 242 ; WX 274 ; N integral ; B 2 -107 291 916 ;
+C 243 ; WX 686 ; N integraltp ; B 308 -88 675 920 ;
+C 244 ; WX 686 ; N integralex ; B 308 -88 378 975 ;
+C 245 ; WX 686 ; N integralbt ; B 11 -87 378 921 ;
+C 246 ; WX 384 ; N parenrighttp ; B 54 -293 466 926 ;
+C 247 ; WX 384 ; N parenrightex ; B 382 -85 466 925 ;
+C 248 ; WX 384 ; N parenrightbt ; B 54 -293 466 926 ;
+C 249 ; WX 384 ; N bracketrighttp ; B 22 -80 371 926 ;
+C 250 ; WX 384 ; N bracketrightex ; B 294 -79 371 925 ;
+C 251 ; WX 384 ; N bracketrightbt ; B 22 -80 371 926 ;
+C 252 ; WX 494 ; N bracerighttp ; B 48 -85 284 925 ;
+C 253 ; WX 494 ; N bracerightmid ; B 209 -85 473 935 ;
+C 254 ; WX 494 ; N bracerightbt ; B 48 -75 284 935 ;
+C -1 ; WX 790 ; N apple ; B 56 -3 733 808 ;
+EndCharMetrics
+EndFontMetrics
diff --git a/src/fonts/Adobe-Core35_AFMs-314/Times-Bold.afm b/src/fonts/Adobe-Core35_AFMs-314/Times-Bold.afm
new file mode 100644
index 0000000..e67efe8
--- /dev/null
+++ b/src/fonts/Adobe-Core35_AFMs-314/Times-Bold.afm
@@ -0,0 +1,2586 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Thu May 1 12:52:56 1997
+Comment UniqueID 43065
+Comment VMusage 41636 52661
+FontName Times-Bold
+FullName Times Bold
+FamilyName Times
+Weight Bold
+ItalicAngle 0
+IsFixedPitch false
+FontBBox -168 -218 1000 935
+UnderlinePosition -100
+UnderlineThickness 50
+Version 002.000
+Notice Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries.
+EncodingScheme AdobeStandardEncoding
+CapHeight 676
+XHeight 461
+Ascender 683
+Descender -217
+StdHW 44
+StdVW 139
+StartCharMetrics 314
+C 32 ; WX 250 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 333 ; N exclam ; B 81 -13 251 691 ;
+C 34 ; WX 555 ; N quotedbl ; B 83 404 472 691 ;
+C 35 ; WX 500 ; N numbersign ; B 4 0 496 700 ;
+C 36 ; WX 500 ; N dollar ; B 29 -99 472 750 ;
+C 37 ; WX 1000 ; N percent ; B 124 -14 877 692 ;
+C 38 ; WX 833 ; N ampersand ; B 62 -16 787 691 ;
+C 39 ; WX 333 ; N quoteright ; B 79 356 263 691 ;
+C 40 ; WX 333 ; N parenleft ; B 46 -168 306 694 ;
+C 41 ; WX 333 ; N parenright ; B 27 -168 287 694 ;
+C 42 ; WX 500 ; N asterisk ; B 56 255 447 691 ;
+C 43 ; WX 570 ; N plus ; B 33 0 537 506 ;
+C 44 ; WX 250 ; N comma ; B 39 -180 223 155 ;
+C 45 ; WX 333 ; N hyphen ; B 44 171 287 287 ;
+C 46 ; WX 250 ; N period ; B 41 -13 210 156 ;
+C 47 ; WX 278 ; N slash ; B -24 -19 302 691 ;
+C 48 ; WX 500 ; N zero ; B 24 -13 476 688 ;
+C 49 ; WX 500 ; N one ; B 65 0 442 688 ;
+C 50 ; WX 500 ; N two ; B 17 0 478 688 ;
+C 51 ; WX 500 ; N three ; B 16 -14 468 688 ;
+C 52 ; WX 500 ; N four ; B 19 0 475 688 ;
+C 53 ; WX 500 ; N five ; B 22 -8 470 676 ;
+C 54 ; WX 500 ; N six ; B 28 -13 475 688 ;
+C 55 ; WX 500 ; N seven ; B 17 0 477 676 ;
+C 56 ; WX 500 ; N eight ; B 28 -13 472 688 ;
+C 57 ; WX 500 ; N nine ; B 26 -13 473 688 ;
+C 58 ; WX 333 ; N colon ; B 82 -13 251 472 ;
+C 59 ; WX 333 ; N semicolon ; B 82 -180 266 472 ;
+C 60 ; WX 570 ; N less ; B 31 -8 539 514 ;
+C 61 ; WX 570 ; N equal ; B 33 107 537 399 ;
+C 62 ; WX 570 ; N greater ; B 31 -8 539 514 ;
+C 63 ; WX 500 ; N question ; B 57 -13 445 689 ;
+C 64 ; WX 930 ; N at ; B 108 -19 822 691 ;
+C 65 ; WX 722 ; N A ; B 9 0 689 690 ;
+C 66 ; WX 667 ; N B ; B 16 0 619 676 ;
+C 67 ; WX 722 ; N C ; B 49 -19 687 691 ;
+C 68 ; WX 722 ; N D ; B 14 0 690 676 ;
+C 69 ; WX 667 ; N E ; B 16 0 641 676 ;
+C 70 ; WX 611 ; N F ; B 16 0 583 676 ;
+C 71 ; WX 778 ; N G ; B 37 -19 755 691 ;
+C 72 ; WX 778 ; N H ; B 21 0 759 676 ;
+C 73 ; WX 389 ; N I ; B 20 0 370 676 ;
+C 74 ; WX 500 ; N J ; B 3 -96 479 676 ;
+C 75 ; WX 778 ; N K ; B 30 0 769 676 ;
+C 76 ; WX 667 ; N L ; B 19 0 638 676 ;
+C 77 ; WX 944 ; N M ; B 14 0 921 676 ;
+C 78 ; WX 722 ; N N ; B 16 -18 701 676 ;
+C 79 ; WX 778 ; N O ; B 35 -19 743 691 ;
+C 80 ; WX 611 ; N P ; B 16 0 600 676 ;
+C 81 ; WX 778 ; N Q ; B 35 -176 743 691 ;
+C 82 ; WX 722 ; N R ; B 26 0 715 676 ;
+C 83 ; WX 556 ; N S ; B 35 -19 513 692 ;
+C 84 ; WX 667 ; N T ; B 31 0 636 676 ;
+C 85 ; WX 722 ; N U ; B 16 -19 701 676 ;
+C 86 ; WX 722 ; N V ; B 16 -18 701 676 ;
+C 87 ; WX 1000 ; N W ; B 19 -15 981 676 ;
+C 88 ; WX 722 ; N X ; B 16 0 699 676 ;
+C 89 ; WX 722 ; N Y ; B 15 0 699 676 ;
+C 90 ; WX 667 ; N Z ; B 28 0 634 676 ;
+C 91 ; WX 333 ; N bracketleft ; B 67 -149 301 678 ;
+C 92 ; WX 278 ; N backslash ; B -25 -19 303 691 ;
+C 93 ; WX 333 ; N bracketright ; B 32 -149 266 678 ;
+C 94 ; WX 581 ; N asciicircum ; B 73 311 509 676 ;
+C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;
+C 96 ; WX 333 ; N quoteleft ; B 70 356 254 691 ;
+C 97 ; WX 500 ; N a ; B 25 -14 488 473 ;
+C 98 ; WX 556 ; N b ; B 17 -14 521 676 ;
+C 99 ; WX 444 ; N c ; B 25 -14 430 473 ;
+C 100 ; WX 556 ; N d ; B 25 -14 534 676 ;
+C 101 ; WX 444 ; N e ; B 25 -14 426 473 ;
+C 102 ; WX 333 ; N f ; B 14 0 389 691 ; L i fi ; L l fl ;
+C 103 ; WX 500 ; N g ; B 28 -206 483 473 ;
+C 104 ; WX 556 ; N h ; B 16 0 534 676 ;
+C 105 ; WX 278 ; N i ; B 16 0 255 691 ;
+C 106 ; WX 333 ; N j ; B -57 -203 263 691 ;
+C 107 ; WX 556 ; N k ; B 22 0 543 676 ;
+C 108 ; WX 278 ; N l ; B 16 0 255 676 ;
+C 109 ; WX 833 ; N m ; B 16 0 814 473 ;
+C 110 ; WX 556 ; N n ; B 21 0 539 473 ;
+C 111 ; WX 500 ; N o ; B 25 -14 476 473 ;
+C 112 ; WX 556 ; N p ; B 19 -205 524 473 ;
+C 113 ; WX 556 ; N q ; B 34 -205 536 473 ;
+C 114 ; WX 444 ; N r ; B 29 0 434 473 ;
+C 115 ; WX 389 ; N s ; B 25 -14 361 473 ;
+C 116 ; WX 333 ; N t ; B 20 -12 332 630 ;
+C 117 ; WX 556 ; N u ; B 16 -14 537 461 ;
+C 118 ; WX 500 ; N v ; B 21 -14 485 461 ;
+C 119 ; WX 722 ; N w ; B 23 -14 707 461 ;
+C 120 ; WX 500 ; N x ; B 12 0 484 461 ;
+C 121 ; WX 500 ; N y ; B 16 -205 480 461 ;
+C 122 ; WX 444 ; N z ; B 21 0 420 461 ;
+C 123 ; WX 394 ; N braceleft ; B 22 -175 340 698 ;
+C 124 ; WX 220 ; N bar ; B 66 -218 154 782 ;
+C 125 ; WX 394 ; N braceright ; B 54 -175 372 698 ;
+C 126 ; WX 520 ; N asciitilde ; B 29 173 491 333 ;
+C 161 ; WX 333 ; N exclamdown ; B 82 -203 252 501 ;
+C 162 ; WX 500 ; N cent ; B 53 -140 458 588 ;
+C 163 ; WX 500 ; N sterling ; B 21 -14 477 684 ;
+C 164 ; WX 167 ; N fraction ; B -168 -12 329 688 ;
+C 165 ; WX 500 ; N yen ; B -64 0 547 676 ;
+C 166 ; WX 500 ; N florin ; B 0 -155 498 706 ;
+C 167 ; WX 500 ; N section ; B 57 -132 443 691 ;
+C 168 ; WX 500 ; N currency ; B -26 61 526 613 ;
+C 169 ; WX 278 ; N quotesingle ; B 75 404 204 691 ;
+C 170 ; WX 500 ; N quotedblleft ; B 32 356 486 691 ;
+C 171 ; WX 500 ; N guillemotleft ; B 23 36 473 415 ;
+C 172 ; WX 333 ; N guilsinglleft ; B 51 36 305 415 ;
+C 173 ; WX 333 ; N guilsinglright ; B 28 36 282 415 ;
+C 174 ; WX 556 ; N fi ; B 14 0 536 691 ;
+C 175 ; WX 556 ; N fl ; B 14 0 536 691 ;
+C 177 ; WX 500 ; N endash ; B 0 181 500 271 ;
+C 178 ; WX 500 ; N dagger ; B 47 -134 453 691 ;
+C 179 ; WX 500 ; N daggerdbl ; B 45 -132 456 691 ;
+C 180 ; WX 250 ; N periodcentered ; B 41 248 210 417 ;
+C 182 ; WX 540 ; N paragraph ; B 0 -186 519 676 ;
+C 183 ; WX 350 ; N bullet ; B 35 198 315 478 ;
+C 184 ; WX 333 ; N quotesinglbase ; B 79 -180 263 155 ;
+C 185 ; WX 500 ; N quotedblbase ; B 14 -180 468 155 ;
+C 186 ; WX 500 ; N quotedblright ; B 14 356 468 691 ;
+C 187 ; WX 500 ; N guillemotright ; B 27 36 477 415 ;
+C 188 ; WX 1000 ; N ellipsis ; B 82 -13 917 156 ;
+C 189 ; WX 1000 ; N perthousand ; B 7 -29 995 706 ;
+C 191 ; WX 500 ; N questiondown ; B 55 -201 443 501 ;
+C 193 ; WX 333 ; N grave ; B 8 528 246 713 ;
+C 194 ; WX 333 ; N acute ; B 86 528 324 713 ;
+C 195 ; WX 333 ; N circumflex ; B -2 528 335 704 ;
+C 196 ; WX 333 ; N tilde ; B -16 547 349 674 ;
+C 197 ; WX 333 ; N macron ; B 1 565 331 637 ;
+C 198 ; WX 333 ; N breve ; B 15 528 318 691 ;
+C 199 ; WX 333 ; N dotaccent ; B 103 536 258 691 ;
+C 200 ; WX 333 ; N dieresis ; B -2 537 335 667 ;
+C 202 ; WX 333 ; N ring ; B 60 527 273 740 ;
+C 203 ; WX 333 ; N cedilla ; B 68 -218 294 0 ;
+C 205 ; WX 333 ; N hungarumlaut ; B -13 528 425 713 ;
+C 206 ; WX 333 ; N ogonek ; B 90 -193 319 24 ;
+C 207 ; WX 333 ; N caron ; B -2 528 335 704 ;
+C 208 ; WX 1000 ; N emdash ; B 0 181 1000 271 ;
+C 225 ; WX 1000 ; N AE ; B 4 0 951 676 ;
+C 227 ; WX 300 ; N ordfeminine ; B -1 397 301 688 ;
+C 232 ; WX 667 ; N Lslash ; B 19 0 638 676 ;
+C 233 ; WX 778 ; N Oslash ; B 35 -74 743 737 ;
+C 234 ; WX 1000 ; N OE ; B 22 -5 981 684 ;
+C 235 ; WX 330 ; N ordmasculine ; B 18 397 312 688 ;
+C 241 ; WX 722 ; N ae ; B 33 -14 693 473 ;
+C 245 ; WX 278 ; N dotlessi ; B 16 0 255 461 ;
+C 248 ; WX 278 ; N lslash ; B -22 0 303 676 ;
+C 249 ; WX 500 ; N oslash ; B 25 -92 476 549 ;
+C 250 ; WX 722 ; N oe ; B 22 -14 696 473 ;
+C 251 ; WX 556 ; N germandbls ; B 19 -12 517 691 ;
+C -1 ; WX 389 ; N Idieresis ; B 20 0 370 877 ;
+C -1 ; WX 444 ; N eacute ; B 25 -14 426 713 ;
+C -1 ; WX 500 ; N abreve ; B 25 -14 488 691 ;
+C -1 ; WX 556 ; N uhungarumlaut ; B 16 -14 557 713 ;
+C -1 ; WX 444 ; N ecaron ; B 25 -14 426 704 ;
+C -1 ; WX 722 ; N Ydieresis ; B 15 0 699 877 ;
+C -1 ; WX 570 ; N divide ; B 33 -31 537 537 ;
+C -1 ; WX 722 ; N Yacute ; B 15 0 699 923 ;
+C -1 ; WX 722 ; N Acircumflex ; B 9 0 689 914 ;
+C -1 ; WX 500 ; N aacute ; B 25 -14 488 713 ;
+C -1 ; WX 722 ; N Ucircumflex ; B 16 -19 701 914 ;
+C -1 ; WX 500 ; N yacute ; B 16 -205 480 713 ;
+C -1 ; WX 389 ; N scommaaccent ; B 25 -218 361 473 ;
+C -1 ; WX 444 ; N ecircumflex ; B 25 -14 426 704 ;
+C -1 ; WX 722 ; N Uring ; B 16 -19 701 935 ;
+C -1 ; WX 722 ; N Udieresis ; B 16 -19 701 877 ;
+C -1 ; WX 500 ; N aogonek ; B 25 -193 504 473 ;
+C -1 ; WX 722 ; N Uacute ; B 16 -19 701 923 ;
+C -1 ; WX 556 ; N uogonek ; B 16 -193 539 461 ;
+C -1 ; WX 667 ; N Edieresis ; B 16 0 641 877 ;
+C -1 ; WX 722 ; N Dcroat ; B 6 0 690 676 ;
+C -1 ; WX 250 ; N commaaccent ; B 47 -218 203 -50 ;
+C -1 ; WX 747 ; N copyright ; B 26 -19 721 691 ;
+C -1 ; WX 667 ; N Emacron ; B 16 0 641 847 ;
+C -1 ; WX 444 ; N ccaron ; B 25 -14 430 704 ;
+C -1 ; WX 500 ; N aring ; B 25 -14 488 740 ;
+C -1 ; WX 722 ; N Ncommaaccent ; B 16 -188 701 676 ;
+C -1 ; WX 278 ; N lacute ; B 16 0 297 923 ;
+C -1 ; WX 500 ; N agrave ; B 25 -14 488 713 ;
+C -1 ; WX 667 ; N Tcommaaccent ; B 31 -218 636 676 ;
+C -1 ; WX 722 ; N Cacute ; B 49 -19 687 923 ;
+C -1 ; WX 500 ; N atilde ; B 25 -14 488 674 ;
+C -1 ; WX 667 ; N Edotaccent ; B 16 0 641 901 ;
+C -1 ; WX 389 ; N scaron ; B 25 -14 363 704 ;
+C -1 ; WX 389 ; N scedilla ; B 25 -218 361 473 ;
+C -1 ; WX 278 ; N iacute ; B 16 0 289 713 ;
+C -1 ; WX 494 ; N lozenge ; B 10 0 484 745 ;
+C -1 ; WX 722 ; N Rcaron ; B 26 0 715 914 ;
+C -1 ; WX 778 ; N Gcommaaccent ; B 37 -218 755 691 ;
+C -1 ; WX 556 ; N ucircumflex ; B 16 -14 537 704 ;
+C -1 ; WX 500 ; N acircumflex ; B 25 -14 488 704 ;
+C -1 ; WX 722 ; N Amacron ; B 9 0 689 847 ;
+C -1 ; WX 444 ; N rcaron ; B 29 0 434 704 ;
+C -1 ; WX 444 ; N ccedilla ; B 25 -218 430 473 ;
+C -1 ; WX 667 ; N Zdotaccent ; B 28 0 634 901 ;
+C -1 ; WX 611 ; N Thorn ; B 16 0 600 676 ;
+C -1 ; WX 778 ; N Omacron ; B 35 -19 743 847 ;
+C -1 ; WX 722 ; N Racute ; B 26 0 715 923 ;
+C -1 ; WX 556 ; N Sacute ; B 35 -19 513 923 ;
+C -1 ; WX 672 ; N dcaron ; B 25 -14 681 682 ;
+C -1 ; WX 722 ; N Umacron ; B 16 -19 701 847 ;
+C -1 ; WX 556 ; N uring ; B 16 -14 537 740 ;
+C -1 ; WX 300 ; N threesuperior ; B 3 268 297 688 ;
+C -1 ; WX 778 ; N Ograve ; B 35 -19 743 923 ;
+C -1 ; WX 722 ; N Agrave ; B 9 0 689 923 ;
+C -1 ; WX 722 ; N Abreve ; B 9 0 689 901 ;
+C -1 ; WX 570 ; N multiply ; B 48 16 522 490 ;
+C -1 ; WX 556 ; N uacute ; B 16 -14 537 713 ;
+C -1 ; WX 667 ; N Tcaron ; B 31 0 636 914 ;
+C -1 ; WX 494 ; N partialdiff ; B 11 -21 494 750 ;
+C -1 ; WX 500 ; N ydieresis ; B 16 -205 480 667 ;
+C -1 ; WX 722 ; N Nacute ; B 16 -18 701 923 ;
+C -1 ; WX 278 ; N icircumflex ; B -37 0 300 704 ;
+C -1 ; WX 667 ; N Ecircumflex ; B 16 0 641 914 ;
+C -1 ; WX 500 ; N adieresis ; B 25 -14 488 667 ;
+C -1 ; WX 444 ; N edieresis ; B 25 -14 426 667 ;
+C -1 ; WX 444 ; N cacute ; B 25 -14 430 713 ;
+C -1 ; WX 556 ; N nacute ; B 21 0 539 713 ;
+C -1 ; WX 556 ; N umacron ; B 16 -14 537 637 ;
+C -1 ; WX 722 ; N Ncaron ; B 16 -18 701 914 ;
+C -1 ; WX 389 ; N Iacute ; B 20 0 370 923 ;
+C -1 ; WX 570 ; N plusminus ; B 33 0 537 506 ;
+C -1 ; WX 220 ; N brokenbar ; B 66 -143 154 707 ;
+C -1 ; WX 747 ; N registered ; B 26 -19 721 691 ;
+C -1 ; WX 778 ; N Gbreve ; B 37 -19 755 901 ;
+C -1 ; WX 389 ; N Idotaccent ; B 20 0 370 901 ;
+C -1 ; WX 600 ; N summation ; B 14 -10 585 706 ;
+C -1 ; WX 667 ; N Egrave ; B 16 0 641 923 ;
+C -1 ; WX 444 ; N racute ; B 29 0 434 713 ;
+C -1 ; WX 500 ; N omacron ; B 25 -14 476 637 ;
+C -1 ; WX 667 ; N Zacute ; B 28 0 634 923 ;
+C -1 ; WX 667 ; N Zcaron ; B 28 0 634 914 ;
+C -1 ; WX 549 ; N greaterequal ; B 26 0 523 704 ;
+C -1 ; WX 722 ; N Eth ; B 6 0 690 676 ;
+C -1 ; WX 722 ; N Ccedilla ; B 49 -218 687 691 ;
+C -1 ; WX 278 ; N lcommaaccent ; B 16 -218 255 676 ;
+C -1 ; WX 416 ; N tcaron ; B 20 -12 425 815 ;
+C -1 ; WX 444 ; N eogonek ; B 25 -193 426 473 ;
+C -1 ; WX 722 ; N Uogonek ; B 16 -193 701 676 ;
+C -1 ; WX 722 ; N Aacute ; B 9 0 689 923 ;
+C -1 ; WX 722 ; N Adieresis ; B 9 0 689 877 ;
+C -1 ; WX 444 ; N egrave ; B 25 -14 426 713 ;
+C -1 ; WX 444 ; N zacute ; B 21 0 420 713 ;
+C -1 ; WX 278 ; N iogonek ; B 16 -193 274 691 ;
+C -1 ; WX 778 ; N Oacute ; B 35 -19 743 923 ;
+C -1 ; WX 500 ; N oacute ; B 25 -14 476 713 ;
+C -1 ; WX 500 ; N amacron ; B 25 -14 488 637 ;
+C -1 ; WX 389 ; N sacute ; B 25 -14 361 713 ;
+C -1 ; WX 278 ; N idieresis ; B -37 0 300 667 ;
+C -1 ; WX 778 ; N Ocircumflex ; B 35 -19 743 914 ;
+C -1 ; WX 722 ; N Ugrave ; B 16 -19 701 923 ;
+C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ;
+C -1 ; WX 556 ; N thorn ; B 19 -205 524 676 ;
+C -1 ; WX 300 ; N twosuperior ; B 0 275 300 688 ;
+C -1 ; WX 778 ; N Odieresis ; B 35 -19 743 877 ;
+C -1 ; WX 556 ; N mu ; B 33 -206 536 461 ;
+C -1 ; WX 278 ; N igrave ; B -27 0 255 713 ;
+C -1 ; WX 500 ; N ohungarumlaut ; B 25 -14 529 713 ;
+C -1 ; WX 667 ; N Eogonek ; B 16 -193 644 676 ;
+C -1 ; WX 556 ; N dcroat ; B 25 -14 534 676 ;
+C -1 ; WX 750 ; N threequarters ; B 23 -12 733 688 ;
+C -1 ; WX 556 ; N Scedilla ; B 35 -218 513 692 ;
+C -1 ; WX 394 ; N lcaron ; B 16 0 412 682 ;
+C -1 ; WX 778 ; N Kcommaaccent ; B 30 -218 769 676 ;
+C -1 ; WX 667 ; N Lacute ; B 19 0 638 923 ;
+C -1 ; WX 1000 ; N trademark ; B 24 271 977 676 ;
+C -1 ; WX 444 ; N edotaccent ; B 25 -14 426 691 ;
+C -1 ; WX 389 ; N Igrave ; B 20 0 370 923 ;
+C -1 ; WX 389 ; N Imacron ; B 20 0 370 847 ;
+C -1 ; WX 667 ; N Lcaron ; B 19 0 652 682 ;
+C -1 ; WX 750 ; N onehalf ; B -7 -12 775 688 ;
+C -1 ; WX 549 ; N lessequal ; B 29 0 526 704 ;
+C -1 ; WX 500 ; N ocircumflex ; B 25 -14 476 704 ;
+C -1 ; WX 556 ; N ntilde ; B 21 0 539 674 ;
+C -1 ; WX 722 ; N Uhungarumlaut ; B 16 -19 701 923 ;
+C -1 ; WX 667 ; N Eacute ; B 16 0 641 923 ;
+C -1 ; WX 444 ; N emacron ; B 25 -14 426 637 ;
+C -1 ; WX 500 ; N gbreve ; B 28 -206 483 691 ;
+C -1 ; WX 750 ; N onequarter ; B 28 -12 743 688 ;
+C -1 ; WX 556 ; N Scaron ; B 35 -19 513 914 ;
+C -1 ; WX 556 ; N Scommaaccent ; B 35 -218 513 692 ;
+C -1 ; WX 778 ; N Ohungarumlaut ; B 35 -19 743 923 ;
+C -1 ; WX 400 ; N degree ; B 57 402 343 688 ;
+C -1 ; WX 500 ; N ograve ; B 25 -14 476 713 ;
+C -1 ; WX 722 ; N Ccaron ; B 49 -19 687 914 ;
+C -1 ; WX 556 ; N ugrave ; B 16 -14 537 713 ;
+C -1 ; WX 549 ; N radical ; B 10 -46 512 850 ;
+C -1 ; WX 722 ; N Dcaron ; B 14 0 690 914 ;
+C -1 ; WX 444 ; N rcommaaccent ; B 29 -218 434 473 ;
+C -1 ; WX 722 ; N Ntilde ; B 16 -18 701 884 ;
+C -1 ; WX 500 ; N otilde ; B 25 -14 476 674 ;
+C -1 ; WX 722 ; N Rcommaaccent ; B 26 -218 715 676 ;
+C -1 ; WX 667 ; N Lcommaaccent ; B 19 -218 638 676 ;
+C -1 ; WX 722 ; N Atilde ; B 9 0 689 884 ;
+C -1 ; WX 722 ; N Aogonek ; B 9 -193 699 690 ;
+C -1 ; WX 722 ; N Aring ; B 9 0 689 935 ;
+C -1 ; WX 778 ; N Otilde ; B 35 -19 743 884 ;
+C -1 ; WX 444 ; N zdotaccent ; B 21 0 420 691 ;
+C -1 ; WX 667 ; N Ecaron ; B 16 0 641 914 ;
+C -1 ; WX 389 ; N Iogonek ; B 20 -193 370 676 ;
+C -1 ; WX 556 ; N kcommaaccent ; B 22 -218 543 676 ;
+C -1 ; WX 570 ; N minus ; B 33 209 537 297 ;
+C -1 ; WX 389 ; N Icircumflex ; B 20 0 370 914 ;
+C -1 ; WX 556 ; N ncaron ; B 21 0 539 704 ;
+C -1 ; WX 333 ; N tcommaaccent ; B 20 -218 332 630 ;
+C -1 ; WX 570 ; N logicalnot ; B 33 108 537 399 ;
+C -1 ; WX 500 ; N odieresis ; B 25 -14 476 667 ;
+C -1 ; WX 556 ; N udieresis ; B 16 -14 537 667 ;
+C -1 ; WX 549 ; N notequal ; B 15 -49 540 570 ;
+C -1 ; WX 500 ; N gcommaaccent ; B 28 -206 483 829 ;
+C -1 ; WX 500 ; N eth ; B 25 -14 476 691 ;
+C -1 ; WX 444 ; N zcaron ; B 21 0 420 704 ;
+C -1 ; WX 556 ; N ncommaaccent ; B 21 -218 539 473 ;
+C -1 ; WX 300 ; N onesuperior ; B 28 275 273 688 ;
+C -1 ; WX 278 ; N imacron ; B -8 0 272 637 ;
+EndCharMetrics
+StartKernData
+StartKernPairs 2242
+KPX A C -55
+KPX A Cacute -55
+KPX A Ccaron -55
+KPX A Ccedilla -55
+KPX A G -55
+KPX A Gbreve -55
+KPX A Gcommaaccent -55
+KPX A O -45
+KPX A Oacute -45
+KPX A Ocircumflex -45
+KPX A Odieresis -45
+KPX A Ograve -45
+KPX A Ohungarumlaut -45
+KPX A Omacron -45
+KPX A Oslash -45
+KPX A Otilde -45
+KPX A Q -45
+KPX A T -95
+KPX A Tcaron -95
+KPX A Tcommaaccent -95
+KPX A U -50
+KPX A Uacute -50
+KPX A Ucircumflex -50
+KPX A Udieresis -50
+KPX A Ugrave -50
+KPX A Uhungarumlaut -50
+KPX A Umacron -50
+KPX A Uogonek -50
+KPX A Uring -50
+KPX A V -145
+KPX A W -130
+KPX A Y -100
+KPX A Yacute -100
+KPX A Ydieresis -100
+KPX A p -25
+KPX A quoteright -74
+KPX A u -50
+KPX A uacute -50
+KPX A ucircumflex -50
+KPX A udieresis -50
+KPX A ugrave -50
+KPX A uhungarumlaut -50
+KPX A umacron -50
+KPX A uogonek -50
+KPX A uring -50
+KPX A v -100
+KPX A w -90
+KPX A y -74
+KPX A yacute -74
+KPX A ydieresis -74
+KPX Aacute C -55
+KPX Aacute Cacute -55
+KPX Aacute Ccaron -55
+KPX Aacute Ccedilla -55
+KPX Aacute G -55
+KPX Aacute Gbreve -55
+KPX Aacute Gcommaaccent -55
+KPX Aacute O -45
+KPX Aacute Oacute -45
+KPX Aacute Ocircumflex -45
+KPX Aacute Odieresis -45
+KPX Aacute Ograve -45
+KPX Aacute Ohungarumlaut -45
+KPX Aacute Omacron -45
+KPX Aacute Oslash -45
+KPX Aacute Otilde -45
+KPX Aacute Q -45
+KPX Aacute T -95
+KPX Aacute Tcaron -95
+KPX Aacute Tcommaaccent -95
+KPX Aacute U -50
+KPX Aacute Uacute -50
+KPX Aacute Ucircumflex -50
+KPX Aacute Udieresis -50
+KPX Aacute Ugrave -50
+KPX Aacute Uhungarumlaut -50
+KPX Aacute Umacron -50
+KPX Aacute Uogonek -50
+KPX Aacute Uring -50
+KPX Aacute V -145
+KPX Aacute W -130
+KPX Aacute Y -100
+KPX Aacute Yacute -100
+KPX Aacute Ydieresis -100
+KPX Aacute p -25
+KPX Aacute quoteright -74
+KPX Aacute u -50
+KPX Aacute uacute -50
+KPX Aacute ucircumflex -50
+KPX Aacute udieresis -50
+KPX Aacute ugrave -50
+KPX Aacute uhungarumlaut -50
+KPX Aacute umacron -50
+KPX Aacute uogonek -50
+KPX Aacute uring -50
+KPX Aacute v -100
+KPX Aacute w -90
+KPX Aacute y -74
+KPX Aacute yacute -74
+KPX Aacute ydieresis -74
+KPX Abreve C -55
+KPX Abreve Cacute -55
+KPX Abreve Ccaron -55
+KPX Abreve Ccedilla -55
+KPX Abreve G -55
+KPX Abreve Gbreve -55
+KPX Abreve Gcommaaccent -55
+KPX Abreve O -45
+KPX Abreve Oacute -45
+KPX Abreve Ocircumflex -45
+KPX Abreve Odieresis -45
+KPX Abreve Ograve -45
+KPX Abreve Ohungarumlaut -45
+KPX Abreve Omacron -45
+KPX Abreve Oslash -45
+KPX Abreve Otilde -45
+KPX Abreve Q -45
+KPX Abreve T -95
+KPX Abreve Tcaron -95
+KPX Abreve Tcommaaccent -95
+KPX Abreve U -50
+KPX Abreve Uacute -50
+KPX Abreve Ucircumflex -50
+KPX Abreve Udieresis -50
+KPX Abreve Ugrave -50
+KPX Abreve Uhungarumlaut -50
+KPX Abreve Umacron -50
+KPX Abreve Uogonek -50
+KPX Abreve Uring -50
+KPX Abreve V -145
+KPX Abreve W -130
+KPX Abreve Y -100
+KPX Abreve Yacute -100
+KPX Abreve Ydieresis -100
+KPX Abreve p -25
+KPX Abreve quoteright -74
+KPX Abreve u -50
+KPX Abreve uacute -50
+KPX Abreve ucircumflex -50
+KPX Abreve udieresis -50
+KPX Abreve ugrave -50
+KPX Abreve uhungarumlaut -50
+KPX Abreve umacron -50
+KPX Abreve uogonek -50
+KPX Abreve uring -50
+KPX Abreve v -100
+KPX Abreve w -90
+KPX Abreve y -74
+KPX Abreve yacute -74
+KPX Abreve ydieresis -74
+KPX Acircumflex C -55
+KPX Acircumflex Cacute -55
+KPX Acircumflex Ccaron -55
+KPX Acircumflex Ccedilla -55
+KPX Acircumflex G -55
+KPX Acircumflex Gbreve -55
+KPX Acircumflex Gcommaaccent -55
+KPX Acircumflex O -45
+KPX Acircumflex Oacute -45
+KPX Acircumflex Ocircumflex -45
+KPX Acircumflex Odieresis -45
+KPX Acircumflex Ograve -45
+KPX Acircumflex Ohungarumlaut -45
+KPX Acircumflex Omacron -45
+KPX Acircumflex Oslash -45
+KPX Acircumflex Otilde -45
+KPX Acircumflex Q -45
+KPX Acircumflex T -95
+KPX Acircumflex Tcaron -95
+KPX Acircumflex Tcommaaccent -95
+KPX Acircumflex U -50
+KPX Acircumflex Uacute -50
+KPX Acircumflex Ucircumflex -50
+KPX Acircumflex Udieresis -50
+KPX Acircumflex Ugrave -50
+KPX Acircumflex Uhungarumlaut -50
+KPX Acircumflex Umacron -50
+KPX Acircumflex Uogonek -50
+KPX Acircumflex Uring -50
+KPX Acircumflex V -145
+KPX Acircumflex W -130
+KPX Acircumflex Y -100
+KPX Acircumflex Yacute -100
+KPX Acircumflex Ydieresis -100
+KPX Acircumflex p -25
+KPX Acircumflex quoteright -74
+KPX Acircumflex u -50
+KPX Acircumflex uacute -50
+KPX Acircumflex ucircumflex -50
+KPX Acircumflex udieresis -50
+KPX Acircumflex ugrave -50
+KPX Acircumflex uhungarumlaut -50
+KPX Acircumflex umacron -50
+KPX Acircumflex uogonek -50
+KPX Acircumflex uring -50
+KPX Acircumflex v -100
+KPX Acircumflex w -90
+KPX Acircumflex y -74
+KPX Acircumflex yacute -74
+KPX Acircumflex ydieresis -74
+KPX Adieresis C -55
+KPX Adieresis Cacute -55
+KPX Adieresis Ccaron -55
+KPX Adieresis Ccedilla -55
+KPX Adieresis G -55
+KPX Adieresis Gbreve -55
+KPX Adieresis Gcommaaccent -55
+KPX Adieresis O -45
+KPX Adieresis Oacute -45
+KPX Adieresis Ocircumflex -45
+KPX Adieresis Odieresis -45
+KPX Adieresis Ograve -45
+KPX Adieresis Ohungarumlaut -45
+KPX Adieresis Omacron -45
+KPX Adieresis Oslash -45
+KPX Adieresis Otilde -45
+KPX Adieresis Q -45
+KPX Adieresis T -95
+KPX Adieresis Tcaron -95
+KPX Adieresis Tcommaaccent -95
+KPX Adieresis U -50
+KPX Adieresis Uacute -50
+KPX Adieresis Ucircumflex -50
+KPX Adieresis Udieresis -50
+KPX Adieresis Ugrave -50
+KPX Adieresis Uhungarumlaut -50
+KPX Adieresis Umacron -50
+KPX Adieresis Uogonek -50
+KPX Adieresis Uring -50
+KPX Adieresis V -145
+KPX Adieresis W -130
+KPX Adieresis Y -100
+KPX Adieresis Yacute -100
+KPX Adieresis Ydieresis -100
+KPX Adieresis p -25
+KPX Adieresis quoteright -74
+KPX Adieresis u -50
+KPX Adieresis uacute -50
+KPX Adieresis ucircumflex -50
+KPX Adieresis udieresis -50
+KPX Adieresis ugrave -50
+KPX Adieresis uhungarumlaut -50
+KPX Adieresis umacron -50
+KPX Adieresis uogonek -50
+KPX Adieresis uring -50
+KPX Adieresis v -100
+KPX Adieresis w -90
+KPX Adieresis y -74
+KPX Adieresis yacute -74
+KPX Adieresis ydieresis -74
+KPX Agrave C -55
+KPX Agrave Cacute -55
+KPX Agrave Ccaron -55
+KPX Agrave Ccedilla -55
+KPX Agrave G -55
+KPX Agrave Gbreve -55
+KPX Agrave Gcommaaccent -55
+KPX Agrave O -45
+KPX Agrave Oacute -45
+KPX Agrave Ocircumflex -45
+KPX Agrave Odieresis -45
+KPX Agrave Ograve -45
+KPX Agrave Ohungarumlaut -45
+KPX Agrave Omacron -45
+KPX Agrave Oslash -45
+KPX Agrave Otilde -45
+KPX Agrave Q -45
+KPX Agrave T -95
+KPX Agrave Tcaron -95
+KPX Agrave Tcommaaccent -95
+KPX Agrave U -50
+KPX Agrave Uacute -50
+KPX Agrave Ucircumflex -50
+KPX Agrave Udieresis -50
+KPX Agrave Ugrave -50
+KPX Agrave Uhungarumlaut -50
+KPX Agrave Umacron -50
+KPX Agrave Uogonek -50
+KPX Agrave Uring -50
+KPX Agrave V -145
+KPX Agrave W -130
+KPX Agrave Y -100
+KPX Agrave Yacute -100
+KPX Agrave Ydieresis -100
+KPX Agrave p -25
+KPX Agrave quoteright -74
+KPX Agrave u -50
+KPX Agrave uacute -50
+KPX Agrave ucircumflex -50
+KPX Agrave udieresis -50
+KPX Agrave ugrave -50
+KPX Agrave uhungarumlaut -50
+KPX Agrave umacron -50
+KPX Agrave uogonek -50
+KPX Agrave uring -50
+KPX Agrave v -100
+KPX Agrave w -90
+KPX Agrave y -74
+KPX Agrave yacute -74
+KPX Agrave ydieresis -74
+KPX Amacron C -55
+KPX Amacron Cacute -55
+KPX Amacron Ccaron -55
+KPX Amacron Ccedilla -55
+KPX Amacron G -55
+KPX Amacron Gbreve -55
+KPX Amacron Gcommaaccent -55
+KPX Amacron O -45
+KPX Amacron Oacute -45
+KPX Amacron Ocircumflex -45
+KPX Amacron Odieresis -45
+KPX Amacron Ograve -45
+KPX Amacron Ohungarumlaut -45
+KPX Amacron Omacron -45
+KPX Amacron Oslash -45
+KPX Amacron Otilde -45
+KPX Amacron Q -45
+KPX Amacron T -95
+KPX Amacron Tcaron -95
+KPX Amacron Tcommaaccent -95
+KPX Amacron U -50
+KPX Amacron Uacute -50
+KPX Amacron Ucircumflex -50
+KPX Amacron Udieresis -50
+KPX Amacron Ugrave -50
+KPX Amacron Uhungarumlaut -50
+KPX Amacron Umacron -50
+KPX Amacron Uogonek -50
+KPX Amacron Uring -50
+KPX Amacron V -145
+KPX Amacron W -130
+KPX Amacron Y -100
+KPX Amacron Yacute -100
+KPX Amacron Ydieresis -100
+KPX Amacron p -25
+KPX Amacron quoteright -74
+KPX Amacron u -50
+KPX Amacron uacute -50
+KPX Amacron ucircumflex -50
+KPX Amacron udieresis -50
+KPX Amacron ugrave -50
+KPX Amacron uhungarumlaut -50
+KPX Amacron umacron -50
+KPX Amacron uogonek -50
+KPX Amacron uring -50
+KPX Amacron v -100
+KPX Amacron w -90
+KPX Amacron y -74
+KPX Amacron yacute -74
+KPX Amacron ydieresis -74
+KPX Aogonek C -55
+KPX Aogonek Cacute -55
+KPX Aogonek Ccaron -55
+KPX Aogonek Ccedilla -55
+KPX Aogonek G -55
+KPX Aogonek Gbreve -55
+KPX Aogonek Gcommaaccent -55
+KPX Aogonek O -45
+KPX Aogonek Oacute -45
+KPX Aogonek Ocircumflex -45
+KPX Aogonek Odieresis -45
+KPX Aogonek Ograve -45
+KPX Aogonek Ohungarumlaut -45
+KPX Aogonek Omacron -45
+KPX Aogonek Oslash -45
+KPX Aogonek Otilde -45
+KPX Aogonek Q -45
+KPX Aogonek T -95
+KPX Aogonek Tcaron -95
+KPX Aogonek Tcommaaccent -95
+KPX Aogonek U -50
+KPX Aogonek Uacute -50
+KPX Aogonek Ucircumflex -50
+KPX Aogonek Udieresis -50
+KPX Aogonek Ugrave -50
+KPX Aogonek Uhungarumlaut -50
+KPX Aogonek Umacron -50
+KPX Aogonek Uogonek -50
+KPX Aogonek Uring -50
+KPX Aogonek V -145
+KPX Aogonek W -130
+KPX Aogonek Y -100
+KPX Aogonek Yacute -100
+KPX Aogonek Ydieresis -100
+KPX Aogonek p -25
+KPX Aogonek quoteright -74
+KPX Aogonek u -50
+KPX Aogonek uacute -50
+KPX Aogonek ucircumflex -50
+KPX Aogonek udieresis -50
+KPX Aogonek ugrave -50
+KPX Aogonek uhungarumlaut -50
+KPX Aogonek umacron -50
+KPX Aogonek uogonek -50
+KPX Aogonek uring -50
+KPX Aogonek v -100
+KPX Aogonek w -90
+KPX Aogonek y -34
+KPX Aogonek yacute -34
+KPX Aogonek ydieresis -34
+KPX Aring C -55
+KPX Aring Cacute -55
+KPX Aring Ccaron -55
+KPX Aring Ccedilla -55
+KPX Aring G -55
+KPX Aring Gbreve -55
+KPX Aring Gcommaaccent -55
+KPX Aring O -45
+KPX Aring Oacute -45
+KPX Aring Ocircumflex -45
+KPX Aring Odieresis -45
+KPX Aring Ograve -45
+KPX Aring Ohungarumlaut -45
+KPX Aring Omacron -45
+KPX Aring Oslash -45
+KPX Aring Otilde -45
+KPX Aring Q -45
+KPX Aring T -95
+KPX Aring Tcaron -95
+KPX Aring Tcommaaccent -95
+KPX Aring U -50
+KPX Aring Uacute -50
+KPX Aring Ucircumflex -50
+KPX Aring Udieresis -50
+KPX Aring Ugrave -50
+KPX Aring Uhungarumlaut -50
+KPX Aring Umacron -50
+KPX Aring Uogonek -50
+KPX Aring Uring -50
+KPX Aring V -145
+KPX Aring W -130
+KPX Aring Y -100
+KPX Aring Yacute -100
+KPX Aring Ydieresis -100
+KPX Aring p -25
+KPX Aring quoteright -74
+KPX Aring u -50
+KPX Aring uacute -50
+KPX Aring ucircumflex -50
+KPX Aring udieresis -50
+KPX Aring ugrave -50
+KPX Aring uhungarumlaut -50
+KPX Aring umacron -50
+KPX Aring uogonek -50
+KPX Aring uring -50
+KPX Aring v -100
+KPX Aring w -90
+KPX Aring y -74
+KPX Aring yacute -74
+KPX Aring ydieresis -74
+KPX Atilde C -55
+KPX Atilde Cacute -55
+KPX Atilde Ccaron -55
+KPX Atilde Ccedilla -55
+KPX Atilde G -55
+KPX Atilde Gbreve -55
+KPX Atilde Gcommaaccent -55
+KPX Atilde O -45
+KPX Atilde Oacute -45
+KPX Atilde Ocircumflex -45
+KPX Atilde Odieresis -45
+KPX Atilde Ograve -45
+KPX Atilde Ohungarumlaut -45
+KPX Atilde Omacron -45
+KPX Atilde Oslash -45
+KPX Atilde Otilde -45
+KPX Atilde Q -45
+KPX Atilde T -95
+KPX Atilde Tcaron -95
+KPX Atilde Tcommaaccent -95
+KPX Atilde U -50
+KPX Atilde Uacute -50
+KPX Atilde Ucircumflex -50
+KPX Atilde Udieresis -50
+KPX Atilde Ugrave -50
+KPX Atilde Uhungarumlaut -50
+KPX Atilde Umacron -50
+KPX Atilde Uogonek -50
+KPX Atilde Uring -50
+KPX Atilde V -145
+KPX Atilde W -130
+KPX Atilde Y -100
+KPX Atilde Yacute -100
+KPX Atilde Ydieresis -100
+KPX Atilde p -25
+KPX Atilde quoteright -74
+KPX Atilde u -50
+KPX Atilde uacute -50
+KPX Atilde ucircumflex -50
+KPX Atilde udieresis -50
+KPX Atilde ugrave -50
+KPX Atilde uhungarumlaut -50
+KPX Atilde umacron -50
+KPX Atilde uogonek -50
+KPX Atilde uring -50
+KPX Atilde v -100
+KPX Atilde w -90
+KPX Atilde y -74
+KPX Atilde yacute -74
+KPX Atilde ydieresis -74
+KPX B A -30
+KPX B Aacute -30
+KPX B Abreve -30
+KPX B Acircumflex -30
+KPX B Adieresis -30
+KPX B Agrave -30
+KPX B Amacron -30
+KPX B Aogonek -30
+KPX B Aring -30
+KPX B Atilde -30
+KPX B U -10
+KPX B Uacute -10
+KPX B Ucircumflex -10
+KPX B Udieresis -10
+KPX B Ugrave -10
+KPX B Uhungarumlaut -10
+KPX B Umacron -10
+KPX B Uogonek -10
+KPX B Uring -10
+KPX D A -35
+KPX D Aacute -35
+KPX D Abreve -35
+KPX D Acircumflex -35
+KPX D Adieresis -35
+KPX D Agrave -35
+KPX D Amacron -35
+KPX D Aogonek -35
+KPX D Aring -35
+KPX D Atilde -35
+KPX D V -40
+KPX D W -40
+KPX D Y -40
+KPX D Yacute -40
+KPX D Ydieresis -40
+KPX D period -20
+KPX Dcaron A -35
+KPX Dcaron Aacute -35
+KPX Dcaron Abreve -35
+KPX Dcaron Acircumflex -35
+KPX Dcaron Adieresis -35
+KPX Dcaron Agrave -35
+KPX Dcaron Amacron -35
+KPX Dcaron Aogonek -35
+KPX Dcaron Aring -35
+KPX Dcaron Atilde -35
+KPX Dcaron V -40
+KPX Dcaron W -40
+KPX Dcaron Y -40
+KPX Dcaron Yacute -40
+KPX Dcaron Ydieresis -40
+KPX Dcaron period -20
+KPX Dcroat A -35
+KPX Dcroat Aacute -35
+KPX Dcroat Abreve -35
+KPX Dcroat Acircumflex -35
+KPX Dcroat Adieresis -35
+KPX Dcroat Agrave -35
+KPX Dcroat Amacron -35
+KPX Dcroat Aogonek -35
+KPX Dcroat Aring -35
+KPX Dcroat Atilde -35
+KPX Dcroat V -40
+KPX Dcroat W -40
+KPX Dcroat Y -40
+KPX Dcroat Yacute -40
+KPX Dcroat Ydieresis -40
+KPX Dcroat period -20
+KPX F A -90
+KPX F Aacute -90
+KPX F Abreve -90
+KPX F Acircumflex -90
+KPX F Adieresis -90
+KPX F Agrave -90
+KPX F Amacron -90
+KPX F Aogonek -90
+KPX F Aring -90
+KPX F Atilde -90
+KPX F a -25
+KPX F aacute -25
+KPX F abreve -25
+KPX F acircumflex -25
+KPX F adieresis -25
+KPX F agrave -25
+KPX F amacron -25
+KPX F aogonek -25
+KPX F aring -25
+KPX F atilde -25
+KPX F comma -92
+KPX F e -25
+KPX F eacute -25
+KPX F ecaron -25
+KPX F ecircumflex -25
+KPX F edieresis -25
+KPX F edotaccent -25
+KPX F egrave -25
+KPX F emacron -25
+KPX F eogonek -25
+KPX F o -25
+KPX F oacute -25
+KPX F ocircumflex -25
+KPX F odieresis -25
+KPX F ograve -25
+KPX F ohungarumlaut -25
+KPX F omacron -25
+KPX F oslash -25
+KPX F otilde -25
+KPX F period -110
+KPX J A -30
+KPX J Aacute -30
+KPX J Abreve -30
+KPX J Acircumflex -30
+KPX J Adieresis -30
+KPX J Agrave -30
+KPX J Amacron -30
+KPX J Aogonek -30
+KPX J Aring -30
+KPX J Atilde -30
+KPX J a -15
+KPX J aacute -15
+KPX J abreve -15
+KPX J acircumflex -15
+KPX J adieresis -15
+KPX J agrave -15
+KPX J amacron -15
+KPX J aogonek -15
+KPX J aring -15
+KPX J atilde -15
+KPX J e -15
+KPX J eacute -15
+KPX J ecaron -15
+KPX J ecircumflex -15
+KPX J edieresis -15
+KPX J edotaccent -15
+KPX J egrave -15
+KPX J emacron -15
+KPX J eogonek -15
+KPX J o -15
+KPX J oacute -15
+KPX J ocircumflex -15
+KPX J odieresis -15
+KPX J ograve -15
+KPX J ohungarumlaut -15
+KPX J omacron -15
+KPX J oslash -15
+KPX J otilde -15
+KPX J period -20
+KPX J u -15
+KPX J uacute -15
+KPX J ucircumflex -15
+KPX J udieresis -15
+KPX J ugrave -15
+KPX J uhungarumlaut -15
+KPX J umacron -15
+KPX J uogonek -15
+KPX J uring -15
+KPX K O -30
+KPX K Oacute -30
+KPX K Ocircumflex -30
+KPX K Odieresis -30
+KPX K Ograve -30
+KPX K Ohungarumlaut -30
+KPX K Omacron -30
+KPX K Oslash -30
+KPX K Otilde -30
+KPX K e -25
+KPX K eacute -25
+KPX K ecaron -25
+KPX K ecircumflex -25
+KPX K edieresis -25
+KPX K edotaccent -25
+KPX K egrave -25
+KPX K emacron -25
+KPX K eogonek -25
+KPX K o -25
+KPX K oacute -25
+KPX K ocircumflex -25
+KPX K odieresis -25
+KPX K ograve -25
+KPX K ohungarumlaut -25
+KPX K omacron -25
+KPX K oslash -25
+KPX K otilde -25
+KPX K u -15
+KPX K uacute -15
+KPX K ucircumflex -15
+KPX K udieresis -15
+KPX K ugrave -15
+KPX K uhungarumlaut -15
+KPX K umacron -15
+KPX K uogonek -15
+KPX K uring -15
+KPX K y -45
+KPX K yacute -45
+KPX K ydieresis -45
+KPX Kcommaaccent O -30
+KPX Kcommaaccent Oacute -30
+KPX Kcommaaccent Ocircumflex -30
+KPX Kcommaaccent Odieresis -30
+KPX Kcommaaccent Ograve -30
+KPX Kcommaaccent Ohungarumlaut -30
+KPX Kcommaaccent Omacron -30
+KPX Kcommaaccent Oslash -30
+KPX Kcommaaccent Otilde -30
+KPX Kcommaaccent e -25
+KPX Kcommaaccent eacute -25
+KPX Kcommaaccent ecaron -25
+KPX Kcommaaccent ecircumflex -25
+KPX Kcommaaccent edieresis -25
+KPX Kcommaaccent edotaccent -25
+KPX Kcommaaccent egrave -25
+KPX Kcommaaccent emacron -25
+KPX Kcommaaccent eogonek -25
+KPX Kcommaaccent o -25
+KPX Kcommaaccent oacute -25
+KPX Kcommaaccent ocircumflex -25
+KPX Kcommaaccent odieresis -25
+KPX Kcommaaccent ograve -25
+KPX Kcommaaccent ohungarumlaut -25
+KPX Kcommaaccent omacron -25
+KPX Kcommaaccent oslash -25
+KPX Kcommaaccent otilde -25
+KPX Kcommaaccent u -15
+KPX Kcommaaccent uacute -15
+KPX Kcommaaccent ucircumflex -15
+KPX Kcommaaccent udieresis -15
+KPX Kcommaaccent ugrave -15
+KPX Kcommaaccent uhungarumlaut -15
+KPX Kcommaaccent umacron -15
+KPX Kcommaaccent uogonek -15
+KPX Kcommaaccent uring -15
+KPX Kcommaaccent y -45
+KPX Kcommaaccent yacute -45
+KPX Kcommaaccent ydieresis -45
+KPX L T -92
+KPX L Tcaron -92
+KPX L Tcommaaccent -92
+KPX L V -92
+KPX L W -92
+KPX L Y -92
+KPX L Yacute -92
+KPX L Ydieresis -92
+KPX L quotedblright -20
+KPX L quoteright -110
+KPX L y -55
+KPX L yacute -55
+KPX L ydieresis -55
+KPX Lacute T -92
+KPX Lacute Tcaron -92
+KPX Lacute Tcommaaccent -92
+KPX Lacute V -92
+KPX Lacute W -92
+KPX Lacute Y -92
+KPX Lacute Yacute -92
+KPX Lacute Ydieresis -92
+KPX Lacute quotedblright -20
+KPX Lacute quoteright -110
+KPX Lacute y -55
+KPX Lacute yacute -55
+KPX Lacute ydieresis -55
+KPX Lcommaaccent T -92
+KPX Lcommaaccent Tcaron -92
+KPX Lcommaaccent Tcommaaccent -92
+KPX Lcommaaccent V -92
+KPX Lcommaaccent W -92
+KPX Lcommaaccent Y -92
+KPX Lcommaaccent Yacute -92
+KPX Lcommaaccent Ydieresis -92
+KPX Lcommaaccent quotedblright -20
+KPX Lcommaaccent quoteright -110
+KPX Lcommaaccent y -55
+KPX Lcommaaccent yacute -55
+KPX Lcommaaccent ydieresis -55
+KPX Lslash T -92
+KPX Lslash Tcaron -92
+KPX Lslash Tcommaaccent -92
+KPX Lslash V -92
+KPX Lslash W -92
+KPX Lslash Y -92
+KPX Lslash Yacute -92
+KPX Lslash Ydieresis -92
+KPX Lslash quotedblright -20
+KPX Lslash quoteright -110
+KPX Lslash y -55
+KPX Lslash yacute -55
+KPX Lslash ydieresis -55
+KPX N A -20
+KPX N Aacute -20
+KPX N Abreve -20
+KPX N Acircumflex -20
+KPX N Adieresis -20
+KPX N Agrave -20
+KPX N Amacron -20
+KPX N Aogonek -20
+KPX N Aring -20
+KPX N Atilde -20
+KPX Nacute A -20
+KPX Nacute Aacute -20
+KPX Nacute Abreve -20
+KPX Nacute Acircumflex -20
+KPX Nacute Adieresis -20
+KPX Nacute Agrave -20
+KPX Nacute Amacron -20
+KPX Nacute Aogonek -20
+KPX Nacute Aring -20
+KPX Nacute Atilde -20
+KPX Ncaron A -20
+KPX Ncaron Aacute -20
+KPX Ncaron Abreve -20
+KPX Ncaron Acircumflex -20
+KPX Ncaron Adieresis -20
+KPX Ncaron Agrave -20
+KPX Ncaron Amacron -20
+KPX Ncaron Aogonek -20
+KPX Ncaron Aring -20
+KPX Ncaron Atilde -20
+KPX Ncommaaccent A -20
+KPX Ncommaaccent Aacute -20
+KPX Ncommaaccent Abreve -20
+KPX Ncommaaccent Acircumflex -20
+KPX Ncommaaccent Adieresis -20
+KPX Ncommaaccent Agrave -20
+KPX Ncommaaccent Amacron -20
+KPX Ncommaaccent Aogonek -20
+KPX Ncommaaccent Aring -20
+KPX Ncommaaccent Atilde -20
+KPX Ntilde A -20
+KPX Ntilde Aacute -20
+KPX Ntilde Abreve -20
+KPX Ntilde Acircumflex -20
+KPX Ntilde Adieresis -20
+KPX Ntilde Agrave -20
+KPX Ntilde Amacron -20
+KPX Ntilde Aogonek -20
+KPX Ntilde Aring -20
+KPX Ntilde Atilde -20
+KPX O A -40
+KPX O Aacute -40
+KPX O Abreve -40
+KPX O Acircumflex -40
+KPX O Adieresis -40
+KPX O Agrave -40
+KPX O Amacron -40
+KPX O Aogonek -40
+KPX O Aring -40
+KPX O Atilde -40
+KPX O T -40
+KPX O Tcaron -40
+KPX O Tcommaaccent -40
+KPX O V -50
+KPX O W -50
+KPX O X -40
+KPX O Y -50
+KPX O Yacute -50
+KPX O Ydieresis -50
+KPX Oacute A -40
+KPX Oacute Aacute -40
+KPX Oacute Abreve -40
+KPX Oacute Acircumflex -40
+KPX Oacute Adieresis -40
+KPX Oacute Agrave -40
+KPX Oacute Amacron -40
+KPX Oacute Aogonek -40
+KPX Oacute Aring -40
+KPX Oacute Atilde -40
+KPX Oacute T -40
+KPX Oacute Tcaron -40
+KPX Oacute Tcommaaccent -40
+KPX Oacute V -50
+KPX Oacute W -50
+KPX Oacute X -40
+KPX Oacute Y -50
+KPX Oacute Yacute -50
+KPX Oacute Ydieresis -50
+KPX Ocircumflex A -40
+KPX Ocircumflex Aacute -40
+KPX Ocircumflex Abreve -40
+KPX Ocircumflex Acircumflex -40
+KPX Ocircumflex Adieresis -40
+KPX Ocircumflex Agrave -40
+KPX Ocircumflex Amacron -40
+KPX Ocircumflex Aogonek -40
+KPX Ocircumflex Aring -40
+KPX Ocircumflex Atilde -40
+KPX Ocircumflex T -40
+KPX Ocircumflex Tcaron -40
+KPX Ocircumflex Tcommaaccent -40
+KPX Ocircumflex V -50
+KPX Ocircumflex W -50
+KPX Ocircumflex X -40
+KPX Ocircumflex Y -50
+KPX Ocircumflex Yacute -50
+KPX Ocircumflex Ydieresis -50
+KPX Odieresis A -40
+KPX Odieresis Aacute -40
+KPX Odieresis Abreve -40
+KPX Odieresis Acircumflex -40
+KPX Odieresis Adieresis -40
+KPX Odieresis Agrave -40
+KPX Odieresis Amacron -40
+KPX Odieresis Aogonek -40
+KPX Odieresis Aring -40
+KPX Odieresis Atilde -40
+KPX Odieresis T -40
+KPX Odieresis Tcaron -40
+KPX Odieresis Tcommaaccent -40
+KPX Odieresis V -50
+KPX Odieresis W -50
+KPX Odieresis X -40
+KPX Odieresis Y -50
+KPX Odieresis Yacute -50
+KPX Odieresis Ydieresis -50
+KPX Ograve A -40
+KPX Ograve Aacute -40
+KPX Ograve Abreve -40
+KPX Ograve Acircumflex -40
+KPX Ograve Adieresis -40
+KPX Ograve Agrave -40
+KPX Ograve Amacron -40
+KPX Ograve Aogonek -40
+KPX Ograve Aring -40
+KPX Ograve Atilde -40
+KPX Ograve T -40
+KPX Ograve Tcaron -40
+KPX Ograve Tcommaaccent -40
+KPX Ograve V -50
+KPX Ograve W -50
+KPX Ograve X -40
+KPX Ograve Y -50
+KPX Ograve Yacute -50
+KPX Ograve Ydieresis -50
+KPX Ohungarumlaut A -40
+KPX Ohungarumlaut Aacute -40
+KPX Ohungarumlaut Abreve -40
+KPX Ohungarumlaut Acircumflex -40
+KPX Ohungarumlaut Adieresis -40
+KPX Ohungarumlaut Agrave -40
+KPX Ohungarumlaut Amacron -40
+KPX Ohungarumlaut Aogonek -40
+KPX Ohungarumlaut Aring -40
+KPX Ohungarumlaut Atilde -40
+KPX Ohungarumlaut T -40
+KPX Ohungarumlaut Tcaron -40
+KPX Ohungarumlaut Tcommaaccent -40
+KPX Ohungarumlaut V -50
+KPX Ohungarumlaut W -50
+KPX Ohungarumlaut X -40
+KPX Ohungarumlaut Y -50
+KPX Ohungarumlaut Yacute -50
+KPX Ohungarumlaut Ydieresis -50
+KPX Omacron A -40
+KPX Omacron Aacute -40
+KPX Omacron Abreve -40
+KPX Omacron Acircumflex -40
+KPX Omacron Adieresis -40
+KPX Omacron Agrave -40
+KPX Omacron Amacron -40
+KPX Omacron Aogonek -40
+KPX Omacron Aring -40
+KPX Omacron Atilde -40
+KPX Omacron T -40
+KPX Omacron Tcaron -40
+KPX Omacron Tcommaaccent -40
+KPX Omacron V -50
+KPX Omacron W -50
+KPX Omacron X -40
+KPX Omacron Y -50
+KPX Omacron Yacute -50
+KPX Omacron Ydieresis -50
+KPX Oslash A -40
+KPX Oslash Aacute -40
+KPX Oslash Abreve -40
+KPX Oslash Acircumflex -40
+KPX Oslash Adieresis -40
+KPX Oslash Agrave -40
+KPX Oslash Amacron -40
+KPX Oslash Aogonek -40
+KPX Oslash Aring -40
+KPX Oslash Atilde -40
+KPX Oslash T -40
+KPX Oslash Tcaron -40
+KPX Oslash Tcommaaccent -40
+KPX Oslash V -50
+KPX Oslash W -50
+KPX Oslash X -40
+KPX Oslash Y -50
+KPX Oslash Yacute -50
+KPX Oslash Ydieresis -50
+KPX Otilde A -40
+KPX Otilde Aacute -40
+KPX Otilde Abreve -40
+KPX Otilde Acircumflex -40
+KPX Otilde Adieresis -40
+KPX Otilde Agrave -40
+KPX Otilde Amacron -40
+KPX Otilde Aogonek -40
+KPX Otilde Aring -40
+KPX Otilde Atilde -40
+KPX Otilde T -40
+KPX Otilde Tcaron -40
+KPX Otilde Tcommaaccent -40
+KPX Otilde V -50
+KPX Otilde W -50
+KPX Otilde X -40
+KPX Otilde Y -50
+KPX Otilde Yacute -50
+KPX Otilde Ydieresis -50
+KPX P A -74
+KPX P Aacute -74
+KPX P Abreve -74
+KPX P Acircumflex -74
+KPX P Adieresis -74
+KPX P Agrave -74
+KPX P Amacron -74
+KPX P Aogonek -74
+KPX P Aring -74
+KPX P Atilde -74
+KPX P a -10
+KPX P aacute -10
+KPX P abreve -10
+KPX P acircumflex -10
+KPX P adieresis -10
+KPX P agrave -10
+KPX P amacron -10
+KPX P aogonek -10
+KPX P aring -10
+KPX P atilde -10
+KPX P comma -92
+KPX P e -20
+KPX P eacute -20
+KPX P ecaron -20
+KPX P ecircumflex -20
+KPX P edieresis -20
+KPX P edotaccent -20
+KPX P egrave -20
+KPX P emacron -20
+KPX P eogonek -20
+KPX P o -20
+KPX P oacute -20
+KPX P ocircumflex -20
+KPX P odieresis -20
+KPX P ograve -20
+KPX P ohungarumlaut -20
+KPX P omacron -20
+KPX P oslash -20
+KPX P otilde -20
+KPX P period -110
+KPX Q U -10
+KPX Q Uacute -10
+KPX Q Ucircumflex -10
+KPX Q Udieresis -10
+KPX Q Ugrave -10
+KPX Q Uhungarumlaut -10
+KPX Q Umacron -10
+KPX Q Uogonek -10
+KPX Q Uring -10
+KPX Q period -20
+KPX R O -30
+KPX R Oacute -30
+KPX R Ocircumflex -30
+KPX R Odieresis -30
+KPX R Ograve -30
+KPX R Ohungarumlaut -30
+KPX R Omacron -30
+KPX R Oslash -30
+KPX R Otilde -30
+KPX R T -40
+KPX R Tcaron -40
+KPX R Tcommaaccent -40
+KPX R U -30
+KPX R Uacute -30
+KPX R Ucircumflex -30
+KPX R Udieresis -30
+KPX R Ugrave -30
+KPX R Uhungarumlaut -30
+KPX R Umacron -30
+KPX R Uogonek -30
+KPX R Uring -30
+KPX R V -55
+KPX R W -35
+KPX R Y -35
+KPX R Yacute -35
+KPX R Ydieresis -35
+KPX Racute O -30
+KPX Racute Oacute -30
+KPX Racute Ocircumflex -30
+KPX Racute Odieresis -30
+KPX Racute Ograve -30
+KPX Racute Ohungarumlaut -30
+KPX Racute Omacron -30
+KPX Racute Oslash -30
+KPX Racute Otilde -30
+KPX Racute T -40
+KPX Racute Tcaron -40
+KPX Racute Tcommaaccent -40
+KPX Racute U -30
+KPX Racute Uacute -30
+KPX Racute Ucircumflex -30
+KPX Racute Udieresis -30
+KPX Racute Ugrave -30
+KPX Racute Uhungarumlaut -30
+KPX Racute Umacron -30
+KPX Racute Uogonek -30
+KPX Racute Uring -30
+KPX Racute V -55
+KPX Racute W -35
+KPX Racute Y -35
+KPX Racute Yacute -35
+KPX Racute Ydieresis -35
+KPX Rcaron O -30
+KPX Rcaron Oacute -30
+KPX Rcaron Ocircumflex -30
+KPX Rcaron Odieresis -30
+KPX Rcaron Ograve -30
+KPX Rcaron Ohungarumlaut -30
+KPX Rcaron Omacron -30
+KPX Rcaron Oslash -30
+KPX Rcaron Otilde -30
+KPX Rcaron T -40
+KPX Rcaron Tcaron -40
+KPX Rcaron Tcommaaccent -40
+KPX Rcaron U -30
+KPX Rcaron Uacute -30
+KPX Rcaron Ucircumflex -30
+KPX Rcaron Udieresis -30
+KPX Rcaron Ugrave -30
+KPX Rcaron Uhungarumlaut -30
+KPX Rcaron Umacron -30
+KPX Rcaron Uogonek -30
+KPX Rcaron Uring -30
+KPX Rcaron V -55
+KPX Rcaron W -35
+KPX Rcaron Y -35
+KPX Rcaron Yacute -35
+KPX Rcaron Ydieresis -35
+KPX Rcommaaccent O -30
+KPX Rcommaaccent Oacute -30
+KPX Rcommaaccent Ocircumflex -30
+KPX Rcommaaccent Odieresis -30
+KPX Rcommaaccent Ograve -30
+KPX Rcommaaccent Ohungarumlaut -30
+KPX Rcommaaccent Omacron -30
+KPX Rcommaaccent Oslash -30
+KPX Rcommaaccent Otilde -30
+KPX Rcommaaccent T -40
+KPX Rcommaaccent Tcaron -40
+KPX Rcommaaccent Tcommaaccent -40
+KPX Rcommaaccent U -30
+KPX Rcommaaccent Uacute -30
+KPX Rcommaaccent Ucircumflex -30
+KPX Rcommaaccent Udieresis -30
+KPX Rcommaaccent Ugrave -30
+KPX Rcommaaccent Uhungarumlaut -30
+KPX Rcommaaccent Umacron -30
+KPX Rcommaaccent Uogonek -30
+KPX Rcommaaccent Uring -30
+KPX Rcommaaccent V -55
+KPX Rcommaaccent W -35
+KPX Rcommaaccent Y -35
+KPX Rcommaaccent Yacute -35
+KPX Rcommaaccent Ydieresis -35
+KPX T A -90
+KPX T Aacute -90
+KPX T Abreve -90
+KPX T Acircumflex -90
+KPX T Adieresis -90
+KPX T Agrave -90
+KPX T Amacron -90
+KPX T Aogonek -90
+KPX T Aring -90
+KPX T Atilde -90
+KPX T O -18
+KPX T Oacute -18
+KPX T Ocircumflex -18
+KPX T Odieresis -18
+KPX T Ograve -18
+KPX T Ohungarumlaut -18
+KPX T Omacron -18
+KPX T Oslash -18
+KPX T Otilde -18
+KPX T a -92
+KPX T aacute -92
+KPX T abreve -52
+KPX T acircumflex -52
+KPX T adieresis -52
+KPX T agrave -52
+KPX T amacron -52
+KPX T aogonek -92
+KPX T aring -92
+KPX T atilde -52
+KPX T colon -74
+KPX T comma -74
+KPX T e -92
+KPX T eacute -92
+KPX T ecaron -92
+KPX T ecircumflex -92
+KPX T edieresis -52
+KPX T edotaccent -92
+KPX T egrave -52
+KPX T emacron -52
+KPX T eogonek -92
+KPX T hyphen -92
+KPX T i -18
+KPX T iacute -18
+KPX T iogonek -18
+KPX T o -92
+KPX T oacute -92
+KPX T ocircumflex -92
+KPX T odieresis -92
+KPX T ograve -92
+KPX T ohungarumlaut -92
+KPX T omacron -92
+KPX T oslash -92
+KPX T otilde -92
+KPX T period -90
+KPX T r -74
+KPX T racute -74
+KPX T rcaron -74
+KPX T rcommaaccent -74
+KPX T semicolon -74
+KPX T u -92
+KPX T uacute -92
+KPX T ucircumflex -92
+KPX T udieresis -92
+KPX T ugrave -92
+KPX T uhungarumlaut -92
+KPX T umacron -92
+KPX T uogonek -92
+KPX T uring -92
+KPX T w -74
+KPX T y -34
+KPX T yacute -34
+KPX T ydieresis -34
+KPX Tcaron A -90
+KPX Tcaron Aacute -90
+KPX Tcaron Abreve -90
+KPX Tcaron Acircumflex -90
+KPX Tcaron Adieresis -90
+KPX Tcaron Agrave -90
+KPX Tcaron Amacron -90
+KPX Tcaron Aogonek -90
+KPX Tcaron Aring -90
+KPX Tcaron Atilde -90
+KPX Tcaron O -18
+KPX Tcaron Oacute -18
+KPX Tcaron Ocircumflex -18
+KPX Tcaron Odieresis -18
+KPX Tcaron Ograve -18
+KPX Tcaron Ohungarumlaut -18
+KPX Tcaron Omacron -18
+KPX Tcaron Oslash -18
+KPX Tcaron Otilde -18
+KPX Tcaron a -92
+KPX Tcaron aacute -92
+KPX Tcaron abreve -52
+KPX Tcaron acircumflex -52
+KPX Tcaron adieresis -52
+KPX Tcaron agrave -52
+KPX Tcaron amacron -52
+KPX Tcaron aogonek -92
+KPX Tcaron aring -92
+KPX Tcaron atilde -52
+KPX Tcaron colon -74
+KPX Tcaron comma -74
+KPX Tcaron e -92
+KPX Tcaron eacute -92
+KPX Tcaron ecaron -92
+KPX Tcaron ecircumflex -92
+KPX Tcaron edieresis -52
+KPX Tcaron edotaccent -92
+KPX Tcaron egrave -52
+KPX Tcaron emacron -52
+KPX Tcaron eogonek -92
+KPX Tcaron hyphen -92
+KPX Tcaron i -18
+KPX Tcaron iacute -18
+KPX Tcaron iogonek -18
+KPX Tcaron o -92
+KPX Tcaron oacute -92
+KPX Tcaron ocircumflex -92
+KPX Tcaron odieresis -92
+KPX Tcaron ograve -92
+KPX Tcaron ohungarumlaut -92
+KPX Tcaron omacron -92
+KPX Tcaron oslash -92
+KPX Tcaron otilde -92
+KPX Tcaron period -90
+KPX Tcaron r -74
+KPX Tcaron racute -74
+KPX Tcaron rcaron -74
+KPX Tcaron rcommaaccent -74
+KPX Tcaron semicolon -74
+KPX Tcaron u -92
+KPX Tcaron uacute -92
+KPX Tcaron ucircumflex -92
+KPX Tcaron udieresis -92
+KPX Tcaron ugrave -92
+KPX Tcaron uhungarumlaut -92
+KPX Tcaron umacron -92
+KPX Tcaron uogonek -92
+KPX Tcaron uring -92
+KPX Tcaron w -74
+KPX Tcaron y -34
+KPX Tcaron yacute -34
+KPX Tcaron ydieresis -34
+KPX Tcommaaccent A -90
+KPX Tcommaaccent Aacute -90
+KPX Tcommaaccent Abreve -90
+KPX Tcommaaccent Acircumflex -90
+KPX Tcommaaccent Adieresis -90
+KPX Tcommaaccent Agrave -90
+KPX Tcommaaccent Amacron -90
+KPX Tcommaaccent Aogonek -90
+KPX Tcommaaccent Aring -90
+KPX Tcommaaccent Atilde -90
+KPX Tcommaaccent O -18
+KPX Tcommaaccent Oacute -18
+KPX Tcommaaccent Ocircumflex -18
+KPX Tcommaaccent Odieresis -18
+KPX Tcommaaccent Ograve -18
+KPX Tcommaaccent Ohungarumlaut -18
+KPX Tcommaaccent Omacron -18
+KPX Tcommaaccent Oslash -18
+KPX Tcommaaccent Otilde -18
+KPX Tcommaaccent a -92
+KPX Tcommaaccent aacute -92
+KPX Tcommaaccent abreve -52
+KPX Tcommaaccent acircumflex -52
+KPX Tcommaaccent adieresis -52
+KPX Tcommaaccent agrave -52
+KPX Tcommaaccent amacron -52
+KPX Tcommaaccent aogonek -92
+KPX Tcommaaccent aring -92
+KPX Tcommaaccent atilde -52
+KPX Tcommaaccent colon -74
+KPX Tcommaaccent comma -74
+KPX Tcommaaccent e -92
+KPX Tcommaaccent eacute -92
+KPX Tcommaaccent ecaron -92
+KPX Tcommaaccent ecircumflex -92
+KPX Tcommaaccent edieresis -52
+KPX Tcommaaccent edotaccent -92
+KPX Tcommaaccent egrave -52
+KPX Tcommaaccent emacron -52
+KPX Tcommaaccent eogonek -92
+KPX Tcommaaccent hyphen -92
+KPX Tcommaaccent i -18
+KPX Tcommaaccent iacute -18
+KPX Tcommaaccent iogonek -18
+KPX Tcommaaccent o -92
+KPX Tcommaaccent oacute -92
+KPX Tcommaaccent ocircumflex -92
+KPX Tcommaaccent odieresis -92
+KPX Tcommaaccent ograve -92
+KPX Tcommaaccent ohungarumlaut -92
+KPX Tcommaaccent omacron -92
+KPX Tcommaaccent oslash -92
+KPX Tcommaaccent otilde -92
+KPX Tcommaaccent period -90
+KPX Tcommaaccent r -74
+KPX Tcommaaccent racute -74
+KPX Tcommaaccent rcaron -74
+KPX Tcommaaccent rcommaaccent -74
+KPX Tcommaaccent semicolon -74
+KPX Tcommaaccent u -92
+KPX Tcommaaccent uacute -92
+KPX Tcommaaccent ucircumflex -92
+KPX Tcommaaccent udieresis -92
+KPX Tcommaaccent ugrave -92
+KPX Tcommaaccent uhungarumlaut -92
+KPX Tcommaaccent umacron -92
+KPX Tcommaaccent uogonek -92
+KPX Tcommaaccent uring -92
+KPX Tcommaaccent w -74
+KPX Tcommaaccent y -34
+KPX Tcommaaccent yacute -34
+KPX Tcommaaccent ydieresis -34
+KPX U A -60
+KPX U Aacute -60
+KPX U Abreve -60
+KPX U Acircumflex -60
+KPX U Adieresis -60
+KPX U Agrave -60
+KPX U Amacron -60
+KPX U Aogonek -60
+KPX U Aring -60
+KPX U Atilde -60
+KPX U comma -50
+KPX U period -50
+KPX Uacute A -60
+KPX Uacute Aacute -60
+KPX Uacute Abreve -60
+KPX Uacute Acircumflex -60
+KPX Uacute Adieresis -60
+KPX Uacute Agrave -60
+KPX Uacute Amacron -60
+KPX Uacute Aogonek -60
+KPX Uacute Aring -60
+KPX Uacute Atilde -60
+KPX Uacute comma -50
+KPX Uacute period -50
+KPX Ucircumflex A -60
+KPX Ucircumflex Aacute -60
+KPX Ucircumflex Abreve -60
+KPX Ucircumflex Acircumflex -60
+KPX Ucircumflex Adieresis -60
+KPX Ucircumflex Agrave -60
+KPX Ucircumflex Amacron -60
+KPX Ucircumflex Aogonek -60
+KPX Ucircumflex Aring -60
+KPX Ucircumflex Atilde -60
+KPX Ucircumflex comma -50
+KPX Ucircumflex period -50
+KPX Udieresis A -60
+KPX Udieresis Aacute -60
+KPX Udieresis Abreve -60
+KPX Udieresis Acircumflex -60
+KPX Udieresis Adieresis -60
+KPX Udieresis Agrave -60
+KPX Udieresis Amacron -60
+KPX Udieresis Aogonek -60
+KPX Udieresis Aring -60
+KPX Udieresis Atilde -60
+KPX Udieresis comma -50
+KPX Udieresis period -50
+KPX Ugrave A -60
+KPX Ugrave Aacute -60
+KPX Ugrave Abreve -60
+KPX Ugrave Acircumflex -60
+KPX Ugrave Adieresis -60
+KPX Ugrave Agrave -60
+KPX Ugrave Amacron -60
+KPX Ugrave Aogonek -60
+KPX Ugrave Aring -60
+KPX Ugrave Atilde -60
+KPX Ugrave comma -50
+KPX Ugrave period -50
+KPX Uhungarumlaut A -60
+KPX Uhungarumlaut Aacute -60
+KPX Uhungarumlaut Abreve -60
+KPX Uhungarumlaut Acircumflex -60
+KPX Uhungarumlaut Adieresis -60
+KPX Uhungarumlaut Agrave -60
+KPX Uhungarumlaut Amacron -60
+KPX Uhungarumlaut Aogonek -60
+KPX Uhungarumlaut Aring -60
+KPX Uhungarumlaut Atilde -60
+KPX Uhungarumlaut comma -50
+KPX Uhungarumlaut period -50
+KPX Umacron A -60
+KPX Umacron Aacute -60
+KPX Umacron Abreve -60
+KPX Umacron Acircumflex -60
+KPX Umacron Adieresis -60
+KPX Umacron Agrave -60
+KPX Umacron Amacron -60
+KPX Umacron Aogonek -60
+KPX Umacron Aring -60
+KPX Umacron Atilde -60
+KPX Umacron comma -50
+KPX Umacron period -50
+KPX Uogonek A -60
+KPX Uogonek Aacute -60
+KPX Uogonek Abreve -60
+KPX Uogonek Acircumflex -60
+KPX Uogonek Adieresis -60
+KPX Uogonek Agrave -60
+KPX Uogonek Amacron -60
+KPX Uogonek Aogonek -60
+KPX Uogonek Aring -60
+KPX Uogonek Atilde -60
+KPX Uogonek comma -50
+KPX Uogonek period -50
+KPX Uring A -60
+KPX Uring Aacute -60
+KPX Uring Abreve -60
+KPX Uring Acircumflex -60
+KPX Uring Adieresis -60
+KPX Uring Agrave -60
+KPX Uring Amacron -60
+KPX Uring Aogonek -60
+KPX Uring Aring -60
+KPX Uring Atilde -60
+KPX Uring comma -50
+KPX Uring period -50
+KPX V A -135
+KPX V Aacute -135
+KPX V Abreve -135
+KPX V Acircumflex -135
+KPX V Adieresis -135
+KPX V Agrave -135
+KPX V Amacron -135
+KPX V Aogonek -135
+KPX V Aring -135
+KPX V Atilde -135
+KPX V G -30
+KPX V Gbreve -30
+KPX V Gcommaaccent -30
+KPX V O -45
+KPX V Oacute -45
+KPX V Ocircumflex -45
+KPX V Odieresis -45
+KPX V Ograve -45
+KPX V Ohungarumlaut -45
+KPX V Omacron -45
+KPX V Oslash -45
+KPX V Otilde -45
+KPX V a -92
+KPX V aacute -92
+KPX V abreve -92
+KPX V acircumflex -92
+KPX V adieresis -92
+KPX V agrave -92
+KPX V amacron -92
+KPX V aogonek -92
+KPX V aring -92
+KPX V atilde -92
+KPX V colon -92
+KPX V comma -129
+KPX V e -100
+KPX V eacute -100
+KPX V ecaron -100
+KPX V ecircumflex -100
+KPX V edieresis -100
+KPX V edotaccent -100
+KPX V egrave -100
+KPX V emacron -100
+KPX V eogonek -100
+KPX V hyphen -74
+KPX V i -37
+KPX V iacute -37
+KPX V icircumflex -37
+KPX V idieresis -37
+KPX V igrave -37
+KPX V imacron -37
+KPX V iogonek -37
+KPX V o -100
+KPX V oacute -100
+KPX V ocircumflex -100
+KPX V odieresis -100
+KPX V ograve -100
+KPX V ohungarumlaut -100
+KPX V omacron -100
+KPX V oslash -100
+KPX V otilde -100
+KPX V period -145
+KPX V semicolon -92
+KPX V u -92
+KPX V uacute -92
+KPX V ucircumflex -92
+KPX V udieresis -92
+KPX V ugrave -92
+KPX V uhungarumlaut -92
+KPX V umacron -92
+KPX V uogonek -92
+KPX V uring -92
+KPX W A -120
+KPX W Aacute -120
+KPX W Abreve -120
+KPX W Acircumflex -120
+KPX W Adieresis -120
+KPX W Agrave -120
+KPX W Amacron -120
+KPX W Aogonek -120
+KPX W Aring -120
+KPX W Atilde -120
+KPX W O -10
+KPX W Oacute -10
+KPX W Ocircumflex -10
+KPX W Odieresis -10
+KPX W Ograve -10
+KPX W Ohungarumlaut -10
+KPX W Omacron -10
+KPX W Oslash -10
+KPX W Otilde -10
+KPX W a -65
+KPX W aacute -65
+KPX W abreve -65
+KPX W acircumflex -65
+KPX W adieresis -65
+KPX W agrave -65
+KPX W amacron -65
+KPX W aogonek -65
+KPX W aring -65
+KPX W atilde -65
+KPX W colon -55
+KPX W comma -92
+KPX W e -65
+KPX W eacute -65
+KPX W ecaron -65
+KPX W ecircumflex -65
+KPX W edieresis -65
+KPX W edotaccent -65
+KPX W egrave -65
+KPX W emacron -65
+KPX W eogonek -65
+KPX W hyphen -37
+KPX W i -18
+KPX W iacute -18
+KPX W iogonek -18
+KPX W o -75
+KPX W oacute -75
+KPX W ocircumflex -75
+KPX W odieresis -75
+KPX W ograve -75
+KPX W ohungarumlaut -75
+KPX W omacron -75
+KPX W oslash -75
+KPX W otilde -75
+KPX W period -92
+KPX W semicolon -55
+KPX W u -50
+KPX W uacute -50
+KPX W ucircumflex -50
+KPX W udieresis -50
+KPX W ugrave -50
+KPX W uhungarumlaut -50
+KPX W umacron -50
+KPX W uogonek -50
+KPX W uring -50
+KPX W y -60
+KPX W yacute -60
+KPX W ydieresis -60
+KPX Y A -110
+KPX Y Aacute -110
+KPX Y Abreve -110
+KPX Y Acircumflex -110
+KPX Y Adieresis -110
+KPX Y Agrave -110
+KPX Y Amacron -110
+KPX Y Aogonek -110
+KPX Y Aring -110
+KPX Y Atilde -110
+KPX Y O -35
+KPX Y Oacute -35
+KPX Y Ocircumflex -35
+KPX Y Odieresis -35
+KPX Y Ograve -35
+KPX Y Ohungarumlaut -35
+KPX Y Omacron -35
+KPX Y Oslash -35
+KPX Y Otilde -35
+KPX Y a -85
+KPX Y aacute -85
+KPX Y abreve -85
+KPX Y acircumflex -85
+KPX Y adieresis -85
+KPX Y agrave -85
+KPX Y amacron -85
+KPX Y aogonek -85
+KPX Y aring -85
+KPX Y atilde -85
+KPX Y colon -92
+KPX Y comma -92
+KPX Y e -111
+KPX Y eacute -111
+KPX Y ecaron -111
+KPX Y ecircumflex -111
+KPX Y edieresis -71
+KPX Y edotaccent -111
+KPX Y egrave -71
+KPX Y emacron -71
+KPX Y eogonek -111
+KPX Y hyphen -92
+KPX Y i -37
+KPX Y iacute -37
+KPX Y iogonek -37
+KPX Y o -111
+KPX Y oacute -111
+KPX Y ocircumflex -111
+KPX Y odieresis -111
+KPX Y ograve -111
+KPX Y ohungarumlaut -111
+KPX Y omacron -111
+KPX Y oslash -111
+KPX Y otilde -111
+KPX Y period -92
+KPX Y semicolon -92
+KPX Y u -92
+KPX Y uacute -92
+KPX Y ucircumflex -92
+KPX Y udieresis -92
+KPX Y ugrave -92
+KPX Y uhungarumlaut -92
+KPX Y umacron -92
+KPX Y uogonek -92
+KPX Y uring -92
+KPX Yacute A -110
+KPX Yacute Aacute -110
+KPX Yacute Abreve -110
+KPX Yacute Acircumflex -110
+KPX Yacute Adieresis -110
+KPX Yacute Agrave -110
+KPX Yacute Amacron -110
+KPX Yacute Aogonek -110
+KPX Yacute Aring -110
+KPX Yacute Atilde -110
+KPX Yacute O -35
+KPX Yacute Oacute -35
+KPX Yacute Ocircumflex -35
+KPX Yacute Odieresis -35
+KPX Yacute Ograve -35
+KPX Yacute Ohungarumlaut -35
+KPX Yacute Omacron -35
+KPX Yacute Oslash -35
+KPX Yacute Otilde -35
+KPX Yacute a -85
+KPX Yacute aacute -85
+KPX Yacute abreve -85
+KPX Yacute acircumflex -85
+KPX Yacute adieresis -85
+KPX Yacute agrave -85
+KPX Yacute amacron -85
+KPX Yacute aogonek -85
+KPX Yacute aring -85
+KPX Yacute atilde -85
+KPX Yacute colon -92
+KPX Yacute comma -92
+KPX Yacute e -111
+KPX Yacute eacute -111
+KPX Yacute ecaron -111
+KPX Yacute ecircumflex -111
+KPX Yacute edieresis -71
+KPX Yacute edotaccent -111
+KPX Yacute egrave -71
+KPX Yacute emacron -71
+KPX Yacute eogonek -111
+KPX Yacute hyphen -92
+KPX Yacute i -37
+KPX Yacute iacute -37
+KPX Yacute iogonek -37
+KPX Yacute o -111
+KPX Yacute oacute -111
+KPX Yacute ocircumflex -111
+KPX Yacute odieresis -111
+KPX Yacute ograve -111
+KPX Yacute ohungarumlaut -111
+KPX Yacute omacron -111
+KPX Yacute oslash -111
+KPX Yacute otilde -111
+KPX Yacute period -92
+KPX Yacute semicolon -92
+KPX Yacute u -92
+KPX Yacute uacute -92
+KPX Yacute ucircumflex -92
+KPX Yacute udieresis -92
+KPX Yacute ugrave -92
+KPX Yacute uhungarumlaut -92
+KPX Yacute umacron -92
+KPX Yacute uogonek -92
+KPX Yacute uring -92
+KPX Ydieresis A -110
+KPX Ydieresis Aacute -110
+KPX Ydieresis Abreve -110
+KPX Ydieresis Acircumflex -110
+KPX Ydieresis Adieresis -110
+KPX Ydieresis Agrave -110
+KPX Ydieresis Amacron -110
+KPX Ydieresis Aogonek -110
+KPX Ydieresis Aring -110
+KPX Ydieresis Atilde -110
+KPX Ydieresis O -35
+KPX Ydieresis Oacute -35
+KPX Ydieresis Ocircumflex -35
+KPX Ydieresis Odieresis -35
+KPX Ydieresis Ograve -35
+KPX Ydieresis Ohungarumlaut -35
+KPX Ydieresis Omacron -35
+KPX Ydieresis Oslash -35
+KPX Ydieresis Otilde -35
+KPX Ydieresis a -85
+KPX Ydieresis aacute -85
+KPX Ydieresis abreve -85
+KPX Ydieresis acircumflex -85
+KPX Ydieresis adieresis -85
+KPX Ydieresis agrave -85
+KPX Ydieresis amacron -85
+KPX Ydieresis aogonek -85
+KPX Ydieresis aring -85
+KPX Ydieresis atilde -85
+KPX Ydieresis colon -92
+KPX Ydieresis comma -92
+KPX Ydieresis e -111
+KPX Ydieresis eacute -111
+KPX Ydieresis ecaron -111
+KPX Ydieresis ecircumflex -111
+KPX Ydieresis edieresis -71
+KPX Ydieresis edotaccent -111
+KPX Ydieresis egrave -71
+KPX Ydieresis emacron -71
+KPX Ydieresis eogonek -111
+KPX Ydieresis hyphen -92
+KPX Ydieresis i -37
+KPX Ydieresis iacute -37
+KPX Ydieresis iogonek -37
+KPX Ydieresis o -111
+KPX Ydieresis oacute -111
+KPX Ydieresis ocircumflex -111
+KPX Ydieresis odieresis -111
+KPX Ydieresis ograve -111
+KPX Ydieresis ohungarumlaut -111
+KPX Ydieresis omacron -111
+KPX Ydieresis oslash -111
+KPX Ydieresis otilde -111
+KPX Ydieresis period -92
+KPX Ydieresis semicolon -92
+KPX Ydieresis u -92
+KPX Ydieresis uacute -92
+KPX Ydieresis ucircumflex -92
+KPX Ydieresis udieresis -92
+KPX Ydieresis ugrave -92
+KPX Ydieresis uhungarumlaut -92
+KPX Ydieresis umacron -92
+KPX Ydieresis uogonek -92
+KPX Ydieresis uring -92
+KPX a v -25
+KPX aacute v -25
+KPX abreve v -25
+KPX acircumflex v -25
+KPX adieresis v -25
+KPX agrave v -25
+KPX amacron v -25
+KPX aogonek v -25
+KPX aring v -25
+KPX atilde v -25
+KPX b b -10
+KPX b period -40
+KPX b u -20
+KPX b uacute -20
+KPX b ucircumflex -20
+KPX b udieresis -20
+KPX b ugrave -20
+KPX b uhungarumlaut -20
+KPX b umacron -20
+KPX b uogonek -20
+KPX b uring -20
+KPX b v -15
+KPX comma quotedblright -45
+KPX comma quoteright -55
+KPX d w -15
+KPX dcroat w -15
+KPX e v -15
+KPX eacute v -15
+KPX ecaron v -15
+KPX ecircumflex v -15
+KPX edieresis v -15
+KPX edotaccent v -15
+KPX egrave v -15
+KPX emacron v -15
+KPX eogonek v -15
+KPX f comma -15
+KPX f dotlessi -35
+KPX f i -25
+KPX f o -25
+KPX f oacute -25
+KPX f ocircumflex -25
+KPX f odieresis -25
+KPX f ograve -25
+KPX f ohungarumlaut -25
+KPX f omacron -25
+KPX f oslash -25
+KPX f otilde -25
+KPX f period -15
+KPX f quotedblright 50
+KPX f quoteright 55
+KPX g period -15
+KPX gbreve period -15
+KPX gcommaaccent period -15
+KPX h y -15
+KPX h yacute -15
+KPX h ydieresis -15
+KPX i v -10
+KPX iacute v -10
+KPX icircumflex v -10
+KPX idieresis v -10
+KPX igrave v -10
+KPX imacron v -10
+KPX iogonek v -10
+KPX k e -10
+KPX k eacute -10
+KPX k ecaron -10
+KPX k ecircumflex -10
+KPX k edieresis -10
+KPX k edotaccent -10
+KPX k egrave -10
+KPX k emacron -10
+KPX k eogonek -10
+KPX k o -15
+KPX k oacute -15
+KPX k ocircumflex -15
+KPX k odieresis -15
+KPX k ograve -15
+KPX k ohungarumlaut -15
+KPX k omacron -15
+KPX k oslash -15
+KPX k otilde -15
+KPX k y -15
+KPX k yacute -15
+KPX k ydieresis -15
+KPX kcommaaccent e -10
+KPX kcommaaccent eacute -10
+KPX kcommaaccent ecaron -10
+KPX kcommaaccent ecircumflex -10
+KPX kcommaaccent edieresis -10
+KPX kcommaaccent edotaccent -10
+KPX kcommaaccent egrave -10
+KPX kcommaaccent emacron -10
+KPX kcommaaccent eogonek -10
+KPX kcommaaccent o -15
+KPX kcommaaccent oacute -15
+KPX kcommaaccent ocircumflex -15
+KPX kcommaaccent odieresis -15
+KPX kcommaaccent ograve -15
+KPX kcommaaccent ohungarumlaut -15
+KPX kcommaaccent omacron -15
+KPX kcommaaccent oslash -15
+KPX kcommaaccent otilde -15
+KPX kcommaaccent y -15
+KPX kcommaaccent yacute -15
+KPX kcommaaccent ydieresis -15
+KPX n v -40
+KPX nacute v -40
+KPX ncaron v -40
+KPX ncommaaccent v -40
+KPX ntilde v -40
+KPX o v -10
+KPX o w -10
+KPX oacute v -10
+KPX oacute w -10
+KPX ocircumflex v -10
+KPX ocircumflex w -10
+KPX odieresis v -10
+KPX odieresis w -10
+KPX ograve v -10
+KPX ograve w -10
+KPX ohungarumlaut v -10
+KPX ohungarumlaut w -10
+KPX omacron v -10
+KPX omacron w -10
+KPX oslash v -10
+KPX oslash w -10
+KPX otilde v -10
+KPX otilde w -10
+KPX period quotedblright -55
+KPX period quoteright -55
+KPX quotedblleft A -10
+KPX quotedblleft Aacute -10
+KPX quotedblleft Abreve -10
+KPX quotedblleft Acircumflex -10
+KPX quotedblleft Adieresis -10
+KPX quotedblleft Agrave -10
+KPX quotedblleft Amacron -10
+KPX quotedblleft Aogonek -10
+KPX quotedblleft Aring -10
+KPX quotedblleft Atilde -10
+KPX quoteleft A -10
+KPX quoteleft Aacute -10
+KPX quoteleft Abreve -10
+KPX quoteleft Acircumflex -10
+KPX quoteleft Adieresis -10
+KPX quoteleft Agrave -10
+KPX quoteleft Amacron -10
+KPX quoteleft Aogonek -10
+KPX quoteleft Aring -10
+KPX quoteleft Atilde -10
+KPX quoteleft quoteleft -63
+KPX quoteright d -20
+KPX quoteright dcroat -20
+KPX quoteright quoteright -63
+KPX quoteright r -20
+KPX quoteright racute -20
+KPX quoteright rcaron -20
+KPX quoteright rcommaaccent -20
+KPX quoteright s -37
+KPX quoteright sacute -37
+KPX quoteright scaron -37
+KPX quoteright scedilla -37
+KPX quoteright scommaaccent -37
+KPX quoteright space -74
+KPX quoteright v -20
+KPX r c -18
+KPX r cacute -18
+KPX r ccaron -18
+KPX r ccedilla -18
+KPX r comma -92
+KPX r e -18
+KPX r eacute -18
+KPX r ecaron -18
+KPX r ecircumflex -18
+KPX r edieresis -18
+KPX r edotaccent -18
+KPX r egrave -18
+KPX r emacron -18
+KPX r eogonek -18
+KPX r g -10
+KPX r gbreve -10
+KPX r gcommaaccent -10
+KPX r hyphen -37
+KPX r n -15
+KPX r nacute -15
+KPX r ncaron -15
+KPX r ncommaaccent -15
+KPX r ntilde -15
+KPX r o -18
+KPX r oacute -18
+KPX r ocircumflex -18
+KPX r odieresis -18
+KPX r ograve -18
+KPX r ohungarumlaut -18
+KPX r omacron -18
+KPX r oslash -18
+KPX r otilde -18
+KPX r p -10
+KPX r period -100
+KPX r q -18
+KPX r v -10
+KPX racute c -18
+KPX racute cacute -18
+KPX racute ccaron -18
+KPX racute ccedilla -18
+KPX racute comma -92
+KPX racute e -18
+KPX racute eacute -18
+KPX racute ecaron -18
+KPX racute ecircumflex -18
+KPX racute edieresis -18
+KPX racute edotaccent -18
+KPX racute egrave -18
+KPX racute emacron -18
+KPX racute eogonek -18
+KPX racute g -10
+KPX racute gbreve -10
+KPX racute gcommaaccent -10
+KPX racute hyphen -37
+KPX racute n -15
+KPX racute nacute -15
+KPX racute ncaron -15
+KPX racute ncommaaccent -15
+KPX racute ntilde -15
+KPX racute o -18
+KPX racute oacute -18
+KPX racute ocircumflex -18
+KPX racute odieresis -18
+KPX racute ograve -18
+KPX racute ohungarumlaut -18
+KPX racute omacron -18
+KPX racute oslash -18
+KPX racute otilde -18
+KPX racute p -10
+KPX racute period -100
+KPX racute q -18
+KPX racute v -10
+KPX rcaron c -18
+KPX rcaron cacute -18
+KPX rcaron ccaron -18
+KPX rcaron ccedilla -18
+KPX rcaron comma -92
+KPX rcaron e -18
+KPX rcaron eacute -18
+KPX rcaron ecaron -18
+KPX rcaron ecircumflex -18
+KPX rcaron edieresis -18
+KPX rcaron edotaccent -18
+KPX rcaron egrave -18
+KPX rcaron emacron -18
+KPX rcaron eogonek -18
+KPX rcaron g -10
+KPX rcaron gbreve -10
+KPX rcaron gcommaaccent -10
+KPX rcaron hyphen -37
+KPX rcaron n -15
+KPX rcaron nacute -15
+KPX rcaron ncaron -15
+KPX rcaron ncommaaccent -15
+KPX rcaron ntilde -15
+KPX rcaron o -18
+KPX rcaron oacute -18
+KPX rcaron ocircumflex -18
+KPX rcaron odieresis -18
+KPX rcaron ograve -18
+KPX rcaron ohungarumlaut -18
+KPX rcaron omacron -18
+KPX rcaron oslash -18
+KPX rcaron otilde -18
+KPX rcaron p -10
+KPX rcaron period -100
+KPX rcaron q -18
+KPX rcaron v -10
+KPX rcommaaccent c -18
+KPX rcommaaccent cacute -18
+KPX rcommaaccent ccaron -18
+KPX rcommaaccent ccedilla -18
+KPX rcommaaccent comma -92
+KPX rcommaaccent e -18
+KPX rcommaaccent eacute -18
+KPX rcommaaccent ecaron -18
+KPX rcommaaccent ecircumflex -18
+KPX rcommaaccent edieresis -18
+KPX rcommaaccent edotaccent -18
+KPX rcommaaccent egrave -18
+KPX rcommaaccent emacron -18
+KPX rcommaaccent eogonek -18
+KPX rcommaaccent g -10
+KPX rcommaaccent gbreve -10
+KPX rcommaaccent gcommaaccent -10
+KPX rcommaaccent hyphen -37
+KPX rcommaaccent n -15
+KPX rcommaaccent nacute -15
+KPX rcommaaccent ncaron -15
+KPX rcommaaccent ncommaaccent -15
+KPX rcommaaccent ntilde -15
+KPX rcommaaccent o -18
+KPX rcommaaccent oacute -18
+KPX rcommaaccent ocircumflex -18
+KPX rcommaaccent odieresis -18
+KPX rcommaaccent ograve -18
+KPX rcommaaccent ohungarumlaut -18
+KPX rcommaaccent omacron -18
+KPX rcommaaccent oslash -18
+KPX rcommaaccent otilde -18
+KPX rcommaaccent p -10
+KPX rcommaaccent period -100
+KPX rcommaaccent q -18
+KPX rcommaaccent v -10
+KPX space A -55
+KPX space Aacute -55
+KPX space Abreve -55
+KPX space Acircumflex -55
+KPX space Adieresis -55
+KPX space Agrave -55
+KPX space Amacron -55
+KPX space Aogonek -55
+KPX space Aring -55
+KPX space Atilde -55
+KPX space T -30
+KPX space Tcaron -30
+KPX space Tcommaaccent -30
+KPX space V -45
+KPX space W -30
+KPX space Y -55
+KPX space Yacute -55
+KPX space Ydieresis -55
+KPX v a -10
+KPX v aacute -10
+KPX v abreve -10
+KPX v acircumflex -10
+KPX v adieresis -10
+KPX v agrave -10
+KPX v amacron -10
+KPX v aogonek -10
+KPX v aring -10
+KPX v atilde -10
+KPX v comma -55
+KPX v e -10
+KPX v eacute -10
+KPX v ecaron -10
+KPX v ecircumflex -10
+KPX v edieresis -10
+KPX v edotaccent -10
+KPX v egrave -10
+KPX v emacron -10
+KPX v eogonek -10
+KPX v o -10
+KPX v oacute -10
+KPX v ocircumflex -10
+KPX v odieresis -10
+KPX v ograve -10
+KPX v ohungarumlaut -10
+KPX v omacron -10
+KPX v oslash -10
+KPX v otilde -10
+KPX v period -70
+KPX w comma -55
+KPX w o -10
+KPX w oacute -10
+KPX w ocircumflex -10
+KPX w odieresis -10
+KPX w ograve -10
+KPX w ohungarumlaut -10
+KPX w omacron -10
+KPX w oslash -10
+KPX w otilde -10
+KPX w period -70
+KPX y comma -55
+KPX y e -10
+KPX y eacute -10
+KPX y ecaron -10
+KPX y ecircumflex -10
+KPX y edieresis -10
+KPX y edotaccent -10
+KPX y egrave -10
+KPX y emacron -10
+KPX y eogonek -10
+KPX y o -25
+KPX y oacute -25
+KPX y ocircumflex -25
+KPX y odieresis -25
+KPX y ograve -25
+KPX y ohungarumlaut -25
+KPX y omacron -25
+KPX y oslash -25
+KPX y otilde -25
+KPX y period -70
+KPX yacute comma -55
+KPX yacute e -10
+KPX yacute eacute -10
+KPX yacute ecaron -10
+KPX yacute ecircumflex -10
+KPX yacute edieresis -10
+KPX yacute edotaccent -10
+KPX yacute egrave -10
+KPX yacute emacron -10
+KPX yacute eogonek -10
+KPX yacute o -25
+KPX yacute oacute -25
+KPX yacute ocircumflex -25
+KPX yacute odieresis -25
+KPX yacute ograve -25
+KPX yacute ohungarumlaut -25
+KPX yacute omacron -25
+KPX yacute oslash -25
+KPX yacute otilde -25
+KPX yacute period -70
+KPX ydieresis comma -55
+KPX ydieresis e -10
+KPX ydieresis eacute -10
+KPX ydieresis ecaron -10
+KPX ydieresis ecircumflex -10
+KPX ydieresis edieresis -10
+KPX ydieresis edotaccent -10
+KPX ydieresis egrave -10
+KPX ydieresis emacron -10
+KPX ydieresis eogonek -10
+KPX ydieresis o -25
+KPX ydieresis oacute -25
+KPX ydieresis ocircumflex -25
+KPX ydieresis odieresis -25
+KPX ydieresis ograve -25
+KPX ydieresis ohungarumlaut -25
+KPX ydieresis omacron -25
+KPX ydieresis oslash -25
+KPX ydieresis otilde -25
+KPX ydieresis period -70
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/src/fonts/Adobe-Core35_AFMs-314/Times-BoldItalic.afm b/src/fonts/Adobe-Core35_AFMs-314/Times-BoldItalic.afm
new file mode 100644
index 0000000..01b7539
--- /dev/null
+++ b/src/fonts/Adobe-Core35_AFMs-314/Times-BoldItalic.afm
@@ -0,0 +1,2382 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Thu May 1 13:04:06 1997
+Comment UniqueID 43066
+Comment VMusage 45874 56899
+FontName Times-BoldItalic
+FullName Times Bold Italic
+FamilyName Times
+Weight Bold
+ItalicAngle -15
+IsFixedPitch false
+FontBBox -200 -218 996 921
+UnderlinePosition -100
+UnderlineThickness 50
+Version 002.000
+Notice Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries.
+EncodingScheme AdobeStandardEncoding
+CapHeight 669
+XHeight 462
+Ascender 683
+Descender -217
+StdHW 42
+StdVW 121
+StartCharMetrics 314
+C 32 ; WX 250 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 389 ; N exclam ; B 67 -13 370 684 ;
+C 34 ; WX 555 ; N quotedbl ; B 136 398 536 685 ;
+C 35 ; WX 500 ; N numbersign ; B -33 0 533 700 ;
+C 36 ; WX 500 ; N dollar ; B -20 -100 497 733 ;
+C 37 ; WX 833 ; N percent ; B 39 -10 793 692 ;
+C 38 ; WX 778 ; N ampersand ; B 5 -19 699 682 ;
+C 39 ; WX 333 ; N quoteright ; B 98 369 302 685 ;
+C 40 ; WX 333 ; N parenleft ; B 28 -179 344 685 ;
+C 41 ; WX 333 ; N parenright ; B -44 -179 271 685 ;
+C 42 ; WX 500 ; N asterisk ; B 65 249 456 685 ;
+C 43 ; WX 570 ; N plus ; B 33 0 537 506 ;
+C 44 ; WX 250 ; N comma ; B -60 -182 144 134 ;
+C 45 ; WX 333 ; N hyphen ; B 2 166 271 282 ;
+C 46 ; WX 250 ; N period ; B -9 -13 139 135 ;
+C 47 ; WX 278 ; N slash ; B -64 -18 342 685 ;
+C 48 ; WX 500 ; N zero ; B 17 -14 477 683 ;
+C 49 ; WX 500 ; N one ; B 5 0 419 683 ;
+C 50 ; WX 500 ; N two ; B -27 0 446 683 ;
+C 51 ; WX 500 ; N three ; B -15 -13 450 683 ;
+C 52 ; WX 500 ; N four ; B -15 0 503 683 ;
+C 53 ; WX 500 ; N five ; B -11 -13 487 669 ;
+C 54 ; WX 500 ; N six ; B 23 -15 509 679 ;
+C 55 ; WX 500 ; N seven ; B 52 0 525 669 ;
+C 56 ; WX 500 ; N eight ; B 3 -13 476 683 ;
+C 57 ; WX 500 ; N nine ; B -12 -10 475 683 ;
+C 58 ; WX 333 ; N colon ; B 23 -13 264 459 ;
+C 59 ; WX 333 ; N semicolon ; B -25 -183 264 459 ;
+C 60 ; WX 570 ; N less ; B 31 -8 539 514 ;
+C 61 ; WX 570 ; N equal ; B 33 107 537 399 ;
+C 62 ; WX 570 ; N greater ; B 31 -8 539 514 ;
+C 63 ; WX 500 ; N question ; B 79 -13 470 684 ;
+C 64 ; WX 832 ; N at ; B 63 -18 770 685 ;
+C 65 ; WX 667 ; N A ; B -67 0 593 683 ;
+C 66 ; WX 667 ; N B ; B -24 0 624 669 ;
+C 67 ; WX 667 ; N C ; B 32 -18 677 685 ;
+C 68 ; WX 722 ; N D ; B -46 0 685 669 ;
+C 69 ; WX 667 ; N E ; B -27 0 653 669 ;
+C 70 ; WX 667 ; N F ; B -13 0 660 669 ;
+C 71 ; WX 722 ; N G ; B 21 -18 706 685 ;
+C 72 ; WX 778 ; N H ; B -24 0 799 669 ;
+C 73 ; WX 389 ; N I ; B -32 0 406 669 ;
+C 74 ; WX 500 ; N J ; B -46 -99 524 669 ;
+C 75 ; WX 667 ; N K ; B -21 0 702 669 ;
+C 76 ; WX 611 ; N L ; B -22 0 590 669 ;
+C 77 ; WX 889 ; N M ; B -29 -12 917 669 ;
+C 78 ; WX 722 ; N N ; B -27 -15 748 669 ;
+C 79 ; WX 722 ; N O ; B 27 -18 691 685 ;
+C 80 ; WX 611 ; N P ; B -27 0 613 669 ;
+C 81 ; WX 722 ; N Q ; B 27 -208 691 685 ;
+C 82 ; WX 667 ; N R ; B -29 0 623 669 ;
+C 83 ; WX 556 ; N S ; B 2 -18 526 685 ;
+C 84 ; WX 611 ; N T ; B 50 0 650 669 ;
+C 85 ; WX 722 ; N U ; B 67 -18 744 669 ;
+C 86 ; WX 667 ; N V ; B 65 -18 715 669 ;
+C 87 ; WX 889 ; N W ; B 65 -18 940 669 ;
+C 88 ; WX 667 ; N X ; B -24 0 694 669 ;
+C 89 ; WX 611 ; N Y ; B 73 0 659 669 ;
+C 90 ; WX 611 ; N Z ; B -11 0 590 669 ;
+C 91 ; WX 333 ; N bracketleft ; B -37 -159 362 674 ;
+C 92 ; WX 278 ; N backslash ; B -1 -18 279 685 ;
+C 93 ; WX 333 ; N bracketright ; B -56 -157 343 674 ;
+C 94 ; WX 570 ; N asciicircum ; B 67 304 503 669 ;
+C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;
+C 96 ; WX 333 ; N quoteleft ; B 128 369 332 685 ;
+C 97 ; WX 500 ; N a ; B -21 -14 455 462 ;
+C 98 ; WX 500 ; N b ; B -14 -13 444 699 ;
+C 99 ; WX 444 ; N c ; B -5 -13 392 462 ;
+C 100 ; WX 500 ; N d ; B -21 -13 517 699 ;
+C 101 ; WX 444 ; N e ; B 5 -13 398 462 ;
+C 102 ; WX 333 ; N f ; B -169 -205 446 698 ; L i fi ; L l fl ;
+C 103 ; WX 500 ; N g ; B -52 -203 478 462 ;
+C 104 ; WX 556 ; N h ; B -13 -9 498 699 ;
+C 105 ; WX 278 ; N i ; B 2 -9 263 684 ;
+C 106 ; WX 278 ; N j ; B -189 -207 279 684 ;
+C 107 ; WX 500 ; N k ; B -23 -8 483 699 ;
+C 108 ; WX 278 ; N l ; B 2 -9 290 699 ;
+C 109 ; WX 778 ; N m ; B -14 -9 722 462 ;
+C 110 ; WX 556 ; N n ; B -6 -9 493 462 ;
+C 111 ; WX 500 ; N o ; B -3 -13 441 462 ;
+C 112 ; WX 500 ; N p ; B -120 -205 446 462 ;
+C 113 ; WX 500 ; N q ; B 1 -205 471 462 ;
+C 114 ; WX 389 ; N r ; B -21 0 389 462 ;
+C 115 ; WX 389 ; N s ; B -19 -13 333 462 ;
+C 116 ; WX 278 ; N t ; B -11 -9 281 594 ;
+C 117 ; WX 556 ; N u ; B 15 -9 492 462 ;
+C 118 ; WX 444 ; N v ; B 16 -13 401 462 ;
+C 119 ; WX 667 ; N w ; B 16 -13 614 462 ;
+C 120 ; WX 500 ; N x ; B -46 -13 469 462 ;
+C 121 ; WX 444 ; N y ; B -94 -205 392 462 ;
+C 122 ; WX 389 ; N z ; B -43 -78 368 449 ;
+C 123 ; WX 348 ; N braceleft ; B 5 -187 436 686 ;
+C 124 ; WX 220 ; N bar ; B 66 -218 154 782 ;
+C 125 ; WX 348 ; N braceright ; B -129 -187 302 686 ;
+C 126 ; WX 570 ; N asciitilde ; B 54 173 516 333 ;
+C 161 ; WX 389 ; N exclamdown ; B 19 -205 322 492 ;
+C 162 ; WX 500 ; N cent ; B 42 -143 439 576 ;
+C 163 ; WX 500 ; N sterling ; B -32 -12 510 683 ;
+C 164 ; WX 167 ; N fraction ; B -169 -14 324 683 ;
+C 165 ; WX 500 ; N yen ; B 33 0 628 669 ;
+C 166 ; WX 500 ; N florin ; B -87 -156 537 707 ;
+C 167 ; WX 500 ; N section ; B 36 -143 459 685 ;
+C 168 ; WX 500 ; N currency ; B -26 34 526 586 ;
+C 169 ; WX 278 ; N quotesingle ; B 128 398 268 685 ;
+C 170 ; WX 500 ; N quotedblleft ; B 53 369 513 685 ;
+C 171 ; WX 500 ; N guillemotleft ; B 12 32 468 415 ;
+C 172 ; WX 333 ; N guilsinglleft ; B 32 32 303 415 ;
+C 173 ; WX 333 ; N guilsinglright ; B 10 32 281 415 ;
+C 174 ; WX 556 ; N fi ; B -188 -205 514 703 ;
+C 175 ; WX 556 ; N fl ; B -186 -205 553 704 ;
+C 177 ; WX 500 ; N endash ; B -40 178 477 269 ;
+C 178 ; WX 500 ; N dagger ; B 91 -145 494 685 ;
+C 179 ; WX 500 ; N daggerdbl ; B 10 -139 493 685 ;
+C 180 ; WX 250 ; N periodcentered ; B 51 257 199 405 ;
+C 182 ; WX 500 ; N paragraph ; B -57 -193 562 669 ;
+C 183 ; WX 350 ; N bullet ; B 0 175 350 525 ;
+C 184 ; WX 333 ; N quotesinglbase ; B -5 -182 199 134 ;
+C 185 ; WX 500 ; N quotedblbase ; B -57 -182 403 134 ;
+C 186 ; WX 500 ; N quotedblright ; B 53 369 513 685 ;
+C 187 ; WX 500 ; N guillemotright ; B 12 32 468 415 ;
+C 188 ; WX 1000 ; N ellipsis ; B 40 -13 852 135 ;
+C 189 ; WX 1000 ; N perthousand ; B 7 -29 996 706 ;
+C 191 ; WX 500 ; N questiondown ; B 30 -205 421 492 ;
+C 193 ; WX 333 ; N grave ; B 85 516 297 697 ;
+C 194 ; WX 333 ; N acute ; B 139 516 379 697 ;
+C 195 ; WX 333 ; N circumflex ; B 40 516 367 690 ;
+C 196 ; WX 333 ; N tilde ; B 48 536 407 655 ;
+C 197 ; WX 333 ; N macron ; B 51 553 393 623 ;
+C 198 ; WX 333 ; N breve ; B 71 516 387 678 ;
+C 199 ; WX 333 ; N dotaccent ; B 163 550 298 684 ;
+C 200 ; WX 333 ; N dieresis ; B 55 550 402 684 ;
+C 202 ; WX 333 ; N ring ; B 127 516 340 729 ;
+C 203 ; WX 333 ; N cedilla ; B -80 -218 156 5 ;
+C 205 ; WX 333 ; N hungarumlaut ; B 69 516 498 697 ;
+C 206 ; WX 333 ; N ogonek ; B 15 -183 244 34 ;
+C 207 ; WX 333 ; N caron ; B 79 516 411 690 ;
+C 208 ; WX 1000 ; N emdash ; B -40 178 977 269 ;
+C 225 ; WX 944 ; N AE ; B -64 0 918 669 ;
+C 227 ; WX 266 ; N ordfeminine ; B 16 399 330 685 ;
+C 232 ; WX 611 ; N Lslash ; B -22 0 590 669 ;
+C 233 ; WX 722 ; N Oslash ; B 27 -125 691 764 ;
+C 234 ; WX 944 ; N OE ; B 23 -8 946 677 ;
+C 235 ; WX 300 ; N ordmasculine ; B 56 400 347 685 ;
+C 241 ; WX 722 ; N ae ; B -5 -13 673 462 ;
+C 245 ; WX 278 ; N dotlessi ; B 2 -9 238 462 ;
+C 248 ; WX 278 ; N lslash ; B -7 -9 307 699 ;
+C 249 ; WX 500 ; N oslash ; B -3 -119 441 560 ;
+C 250 ; WX 722 ; N oe ; B 6 -13 674 462 ;
+C 251 ; WX 500 ; N germandbls ; B -200 -200 473 705 ;
+C -1 ; WX 389 ; N Idieresis ; B -32 0 450 862 ;
+C -1 ; WX 444 ; N eacute ; B 5 -13 435 697 ;
+C -1 ; WX 500 ; N abreve ; B -21 -14 471 678 ;
+C -1 ; WX 556 ; N uhungarumlaut ; B 15 -9 610 697 ;
+C -1 ; WX 444 ; N ecaron ; B 5 -13 467 690 ;
+C -1 ; WX 611 ; N Ydieresis ; B 73 0 659 862 ;
+C -1 ; WX 570 ; N divide ; B 33 -29 537 535 ;
+C -1 ; WX 611 ; N Yacute ; B 73 0 659 904 ;
+C -1 ; WX 667 ; N Acircumflex ; B -67 0 593 897 ;
+C -1 ; WX 500 ; N aacute ; B -21 -14 463 697 ;
+C -1 ; WX 722 ; N Ucircumflex ; B 67 -18 744 897 ;
+C -1 ; WX 444 ; N yacute ; B -94 -205 435 697 ;
+C -1 ; WX 389 ; N scommaaccent ; B -19 -218 333 462 ;
+C -1 ; WX 444 ; N ecircumflex ; B 5 -13 423 690 ;
+C -1 ; WX 722 ; N Uring ; B 67 -18 744 921 ;
+C -1 ; WX 722 ; N Udieresis ; B 67 -18 744 862 ;
+C -1 ; WX 500 ; N aogonek ; B -21 -183 455 462 ;
+C -1 ; WX 722 ; N Uacute ; B 67 -18 744 904 ;
+C -1 ; WX 556 ; N uogonek ; B 15 -183 492 462 ;
+C -1 ; WX 667 ; N Edieresis ; B -27 0 653 862 ;
+C -1 ; WX 722 ; N Dcroat ; B -31 0 700 669 ;
+C -1 ; WX 250 ; N commaaccent ; B -36 -218 131 -50 ;
+C -1 ; WX 747 ; N copyright ; B 30 -18 718 685 ;
+C -1 ; WX 667 ; N Emacron ; B -27 0 653 830 ;
+C -1 ; WX 444 ; N ccaron ; B -5 -13 467 690 ;
+C -1 ; WX 500 ; N aring ; B -21 -14 455 729 ;
+C -1 ; WX 722 ; N Ncommaaccent ; B -27 -218 748 669 ;
+C -1 ; WX 278 ; N lacute ; B 2 -9 392 904 ;
+C -1 ; WX 500 ; N agrave ; B -21 -14 455 697 ;
+C -1 ; WX 611 ; N Tcommaaccent ; B 50 -218 650 669 ;
+C -1 ; WX 667 ; N Cacute ; B 32 -18 677 904 ;
+C -1 ; WX 500 ; N atilde ; B -21 -14 491 655 ;
+C -1 ; WX 667 ; N Edotaccent ; B -27 0 653 862 ;
+C -1 ; WX 389 ; N scaron ; B -19 -13 424 690 ;
+C -1 ; WX 389 ; N scedilla ; B -19 -218 333 462 ;
+C -1 ; WX 278 ; N iacute ; B 2 -9 352 697 ;
+C -1 ; WX 494 ; N lozenge ; B 10 0 484 745 ;
+C -1 ; WX 667 ; N Rcaron ; B -29 0 623 897 ;
+C -1 ; WX 722 ; N Gcommaaccent ; B 21 -218 706 685 ;
+C -1 ; WX 556 ; N ucircumflex ; B 15 -9 492 690 ;
+C -1 ; WX 500 ; N acircumflex ; B -21 -14 455 690 ;
+C -1 ; WX 667 ; N Amacron ; B -67 0 593 830 ;
+C -1 ; WX 389 ; N rcaron ; B -21 0 424 690 ;
+C -1 ; WX 444 ; N ccedilla ; B -5 -218 392 462 ;
+C -1 ; WX 611 ; N Zdotaccent ; B -11 0 590 862 ;
+C -1 ; WX 611 ; N Thorn ; B -27 0 573 669 ;
+C -1 ; WX 722 ; N Omacron ; B 27 -18 691 830 ;
+C -1 ; WX 667 ; N Racute ; B -29 0 623 904 ;
+C -1 ; WX 556 ; N Sacute ; B 2 -18 531 904 ;
+C -1 ; WX 608 ; N dcaron ; B -21 -13 675 708 ;
+C -1 ; WX 722 ; N Umacron ; B 67 -18 744 830 ;
+C -1 ; WX 556 ; N uring ; B 15 -9 492 729 ;
+C -1 ; WX 300 ; N threesuperior ; B 17 265 321 683 ;
+C -1 ; WX 722 ; N Ograve ; B 27 -18 691 904 ;
+C -1 ; WX 667 ; N Agrave ; B -67 0 593 904 ;
+C -1 ; WX 667 ; N Abreve ; B -67 0 593 885 ;
+C -1 ; WX 570 ; N multiply ; B 48 16 522 490 ;
+C -1 ; WX 556 ; N uacute ; B 15 -9 492 697 ;
+C -1 ; WX 611 ; N Tcaron ; B 50 0 650 897 ;
+C -1 ; WX 494 ; N partialdiff ; B 11 -21 494 750 ;
+C -1 ; WX 444 ; N ydieresis ; B -94 -205 443 655 ;
+C -1 ; WX 722 ; N Nacute ; B -27 -15 748 904 ;
+C -1 ; WX 278 ; N icircumflex ; B -3 -9 324 690 ;
+C -1 ; WX 667 ; N Ecircumflex ; B -27 0 653 897 ;
+C -1 ; WX 500 ; N adieresis ; B -21 -14 476 655 ;
+C -1 ; WX 444 ; N edieresis ; B 5 -13 448 655 ;
+C -1 ; WX 444 ; N cacute ; B -5 -13 435 697 ;
+C -1 ; WX 556 ; N nacute ; B -6 -9 493 697 ;
+C -1 ; WX 556 ; N umacron ; B 15 -9 492 623 ;
+C -1 ; WX 722 ; N Ncaron ; B -27 -15 748 897 ;
+C -1 ; WX 389 ; N Iacute ; B -32 0 432 904 ;
+C -1 ; WX 570 ; N plusminus ; B 33 0 537 506 ;
+C -1 ; WX 220 ; N brokenbar ; B 66 -143 154 707 ;
+C -1 ; WX 747 ; N registered ; B 30 -18 718 685 ;
+C -1 ; WX 722 ; N Gbreve ; B 21 -18 706 885 ;
+C -1 ; WX 389 ; N Idotaccent ; B -32 0 406 862 ;
+C -1 ; WX 600 ; N summation ; B 14 -10 585 706 ;
+C -1 ; WX 667 ; N Egrave ; B -27 0 653 904 ;
+C -1 ; WX 389 ; N racute ; B -21 0 407 697 ;
+C -1 ; WX 500 ; N omacron ; B -3 -13 462 623 ;
+C -1 ; WX 611 ; N Zacute ; B -11 0 590 904 ;
+C -1 ; WX 611 ; N Zcaron ; B -11 0 590 897 ;
+C -1 ; WX 549 ; N greaterequal ; B 26 0 523 704 ;
+C -1 ; WX 722 ; N Eth ; B -31 0 700 669 ;
+C -1 ; WX 667 ; N Ccedilla ; B 32 -218 677 685 ;
+C -1 ; WX 278 ; N lcommaaccent ; B -42 -218 290 699 ;
+C -1 ; WX 366 ; N tcaron ; B -11 -9 434 754 ;
+C -1 ; WX 444 ; N eogonek ; B 5 -183 398 462 ;
+C -1 ; WX 722 ; N Uogonek ; B 67 -183 744 669 ;
+C -1 ; WX 667 ; N Aacute ; B -67 0 593 904 ;
+C -1 ; WX 667 ; N Adieresis ; B -67 0 593 862 ;
+C -1 ; WX 444 ; N egrave ; B 5 -13 398 697 ;
+C -1 ; WX 389 ; N zacute ; B -43 -78 407 697 ;
+C -1 ; WX 278 ; N iogonek ; B -20 -183 263 684 ;
+C -1 ; WX 722 ; N Oacute ; B 27 -18 691 904 ;
+C -1 ; WX 500 ; N oacute ; B -3 -13 463 697 ;
+C -1 ; WX 500 ; N amacron ; B -21 -14 467 623 ;
+C -1 ; WX 389 ; N sacute ; B -19 -13 407 697 ;
+C -1 ; WX 278 ; N idieresis ; B 2 -9 364 655 ;
+C -1 ; WX 722 ; N Ocircumflex ; B 27 -18 691 897 ;
+C -1 ; WX 722 ; N Ugrave ; B 67 -18 744 904 ;
+C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ;
+C -1 ; WX 500 ; N thorn ; B -120 -205 446 699 ;
+C -1 ; WX 300 ; N twosuperior ; B 2 274 313 683 ;
+C -1 ; WX 722 ; N Odieresis ; B 27 -18 691 862 ;
+C -1 ; WX 576 ; N mu ; B -60 -207 516 449 ;
+C -1 ; WX 278 ; N igrave ; B 2 -9 259 697 ;
+C -1 ; WX 500 ; N ohungarumlaut ; B -3 -13 582 697 ;
+C -1 ; WX 667 ; N Eogonek ; B -27 -183 653 669 ;
+C -1 ; WX 500 ; N dcroat ; B -21 -13 552 699 ;
+C -1 ; WX 750 ; N threequarters ; B 7 -14 726 683 ;
+C -1 ; WX 556 ; N Scedilla ; B 2 -218 526 685 ;
+C -1 ; WX 382 ; N lcaron ; B 2 -9 448 708 ;
+C -1 ; WX 667 ; N Kcommaaccent ; B -21 -218 702 669 ;
+C -1 ; WX 611 ; N Lacute ; B -22 0 590 904 ;
+C -1 ; WX 1000 ; N trademark ; B 32 263 968 669 ;
+C -1 ; WX 444 ; N edotaccent ; B 5 -13 398 655 ;
+C -1 ; WX 389 ; N Igrave ; B -32 0 406 904 ;
+C -1 ; WX 389 ; N Imacron ; B -32 0 461 830 ;
+C -1 ; WX 611 ; N Lcaron ; B -22 0 671 718 ;
+C -1 ; WX 750 ; N onehalf ; B -9 -14 723 683 ;
+C -1 ; WX 549 ; N lessequal ; B 29 0 526 704 ;
+C -1 ; WX 500 ; N ocircumflex ; B -3 -13 451 690 ;
+C -1 ; WX 556 ; N ntilde ; B -6 -9 504 655 ;
+C -1 ; WX 722 ; N Uhungarumlaut ; B 67 -18 744 904 ;
+C -1 ; WX 667 ; N Eacute ; B -27 0 653 904 ;
+C -1 ; WX 444 ; N emacron ; B 5 -13 439 623 ;
+C -1 ; WX 500 ; N gbreve ; B -52 -203 478 678 ;
+C -1 ; WX 750 ; N onequarter ; B 7 -14 721 683 ;
+C -1 ; WX 556 ; N Scaron ; B 2 -18 553 897 ;
+C -1 ; WX 556 ; N Scommaaccent ; B 2 -218 526 685 ;
+C -1 ; WX 722 ; N Ohungarumlaut ; B 27 -18 723 904 ;
+C -1 ; WX 400 ; N degree ; B 83 397 369 683 ;
+C -1 ; WX 500 ; N ograve ; B -3 -13 441 697 ;
+C -1 ; WX 667 ; N Ccaron ; B 32 -18 677 897 ;
+C -1 ; WX 556 ; N ugrave ; B 15 -9 492 697 ;
+C -1 ; WX 549 ; N radical ; B 10 -46 512 850 ;
+C -1 ; WX 722 ; N Dcaron ; B -46 0 685 897 ;
+C -1 ; WX 389 ; N rcommaaccent ; B -67 -218 389 462 ;
+C -1 ; WX 722 ; N Ntilde ; B -27 -15 748 862 ;
+C -1 ; WX 500 ; N otilde ; B -3 -13 491 655 ;
+C -1 ; WX 667 ; N Rcommaaccent ; B -29 -218 623 669 ;
+C -1 ; WX 611 ; N Lcommaaccent ; B -22 -218 590 669 ;
+C -1 ; WX 667 ; N Atilde ; B -67 0 593 862 ;
+C -1 ; WX 667 ; N Aogonek ; B -67 -183 604 683 ;
+C -1 ; WX 667 ; N Aring ; B -67 0 593 921 ;
+C -1 ; WX 722 ; N Otilde ; B 27 -18 691 862 ;
+C -1 ; WX 389 ; N zdotaccent ; B -43 -78 368 655 ;
+C -1 ; WX 667 ; N Ecaron ; B -27 0 653 897 ;
+C -1 ; WX 389 ; N Iogonek ; B -32 -183 406 669 ;
+C -1 ; WX 500 ; N kcommaaccent ; B -23 -218 483 699 ;
+C -1 ; WX 606 ; N minus ; B 51 209 555 297 ;
+C -1 ; WX 389 ; N Icircumflex ; B -32 0 450 897 ;
+C -1 ; WX 556 ; N ncaron ; B -6 -9 523 690 ;
+C -1 ; WX 278 ; N tcommaaccent ; B -62 -218 281 594 ;
+C -1 ; WX 606 ; N logicalnot ; B 51 108 555 399 ;
+C -1 ; WX 500 ; N odieresis ; B -3 -13 471 655 ;
+C -1 ; WX 556 ; N udieresis ; B 15 -9 499 655 ;
+C -1 ; WX 549 ; N notequal ; B 15 -49 540 570 ;
+C -1 ; WX 500 ; N gcommaaccent ; B -52 -203 478 767 ;
+C -1 ; WX 500 ; N eth ; B -3 -13 454 699 ;
+C -1 ; WX 389 ; N zcaron ; B -43 -78 424 690 ;
+C -1 ; WX 556 ; N ncommaaccent ; B -6 -218 493 462 ;
+C -1 ; WX 300 ; N onesuperior ; B 30 274 301 683 ;
+C -1 ; WX 278 ; N imacron ; B 2 -9 294 623 ;
+EndCharMetrics
+StartKernData
+StartKernPairs 2038
+KPX A C -65
+KPX A Cacute -65
+KPX A Ccaron -65
+KPX A Ccedilla -65
+KPX A G -60
+KPX A Gbreve -60
+KPX A Gcommaaccent -60
+KPX A O -50
+KPX A Oacute -50
+KPX A Ocircumflex -50
+KPX A Odieresis -50
+KPX A Ograve -50
+KPX A Ohungarumlaut -50
+KPX A Omacron -50
+KPX A Oslash -50
+KPX A Otilde -50
+KPX A Q -55
+KPX A T -55
+KPX A Tcaron -55
+KPX A Tcommaaccent -55
+KPX A U -50
+KPX A Uacute -50
+KPX A Ucircumflex -50
+KPX A Udieresis -50
+KPX A Ugrave -50
+KPX A Uhungarumlaut -50
+KPX A Umacron -50
+KPX A Uogonek -50
+KPX A Uring -50
+KPX A V -95
+KPX A W -100
+KPX A Y -70
+KPX A Yacute -70
+KPX A Ydieresis -70
+KPX A quoteright -74
+KPX A u -30
+KPX A uacute -30
+KPX A ucircumflex -30
+KPX A udieresis -30
+KPX A ugrave -30
+KPX A uhungarumlaut -30
+KPX A umacron -30
+KPX A uogonek -30
+KPX A uring -30
+KPX A v -74
+KPX A w -74
+KPX A y -74
+KPX A yacute -74
+KPX A ydieresis -74
+KPX Aacute C -65
+KPX Aacute Cacute -65
+KPX Aacute Ccaron -65
+KPX Aacute Ccedilla -65
+KPX Aacute G -60
+KPX Aacute Gbreve -60
+KPX Aacute Gcommaaccent -60
+KPX Aacute O -50
+KPX Aacute Oacute -50
+KPX Aacute Ocircumflex -50
+KPX Aacute Odieresis -50
+KPX Aacute Ograve -50
+KPX Aacute Ohungarumlaut -50
+KPX Aacute Omacron -50
+KPX Aacute Oslash -50
+KPX Aacute Otilde -50
+KPX Aacute Q -55
+KPX Aacute T -55
+KPX Aacute Tcaron -55
+KPX Aacute Tcommaaccent -55
+KPX Aacute U -50
+KPX Aacute Uacute -50
+KPX Aacute Ucircumflex -50
+KPX Aacute Udieresis -50
+KPX Aacute Ugrave -50
+KPX Aacute Uhungarumlaut -50
+KPX Aacute Umacron -50
+KPX Aacute Uogonek -50
+KPX Aacute Uring -50
+KPX Aacute V -95
+KPX Aacute W -100
+KPX Aacute Y -70
+KPX Aacute Yacute -70
+KPX Aacute Ydieresis -70
+KPX Aacute quoteright -74
+KPX Aacute u -30
+KPX Aacute uacute -30
+KPX Aacute ucircumflex -30
+KPX Aacute udieresis -30
+KPX Aacute ugrave -30
+KPX Aacute uhungarumlaut -30
+KPX Aacute umacron -30
+KPX Aacute uogonek -30
+KPX Aacute uring -30
+KPX Aacute v -74
+KPX Aacute w -74
+KPX Aacute y -74
+KPX Aacute yacute -74
+KPX Aacute ydieresis -74
+KPX Abreve C -65
+KPX Abreve Cacute -65
+KPX Abreve Ccaron -65
+KPX Abreve Ccedilla -65
+KPX Abreve G -60
+KPX Abreve Gbreve -60
+KPX Abreve Gcommaaccent -60
+KPX Abreve O -50
+KPX Abreve Oacute -50
+KPX Abreve Ocircumflex -50
+KPX Abreve Odieresis -50
+KPX Abreve Ograve -50
+KPX Abreve Ohungarumlaut -50
+KPX Abreve Omacron -50
+KPX Abreve Oslash -50
+KPX Abreve Otilde -50
+KPX Abreve Q -55
+KPX Abreve T -55
+KPX Abreve Tcaron -55
+KPX Abreve Tcommaaccent -55
+KPX Abreve U -50
+KPX Abreve Uacute -50
+KPX Abreve Ucircumflex -50
+KPX Abreve Udieresis -50
+KPX Abreve Ugrave -50
+KPX Abreve Uhungarumlaut -50
+KPX Abreve Umacron -50
+KPX Abreve Uogonek -50
+KPX Abreve Uring -50
+KPX Abreve V -95
+KPX Abreve W -100
+KPX Abreve Y -70
+KPX Abreve Yacute -70
+KPX Abreve Ydieresis -70
+KPX Abreve quoteright -74
+KPX Abreve u -30
+KPX Abreve uacute -30
+KPX Abreve ucircumflex -30
+KPX Abreve udieresis -30
+KPX Abreve ugrave -30
+KPX Abreve uhungarumlaut -30
+KPX Abreve umacron -30
+KPX Abreve uogonek -30
+KPX Abreve uring -30
+KPX Abreve v -74
+KPX Abreve w -74
+KPX Abreve y -74
+KPX Abreve yacute -74
+KPX Abreve ydieresis -74
+KPX Acircumflex C -65
+KPX Acircumflex Cacute -65
+KPX Acircumflex Ccaron -65
+KPX Acircumflex Ccedilla -65
+KPX Acircumflex G -60
+KPX Acircumflex Gbreve -60
+KPX Acircumflex Gcommaaccent -60
+KPX Acircumflex O -50
+KPX Acircumflex Oacute -50
+KPX Acircumflex Ocircumflex -50
+KPX Acircumflex Odieresis -50
+KPX Acircumflex Ograve -50
+KPX Acircumflex Ohungarumlaut -50
+KPX Acircumflex Omacron -50
+KPX Acircumflex Oslash -50
+KPX Acircumflex Otilde -50
+KPX Acircumflex Q -55
+KPX Acircumflex T -55
+KPX Acircumflex Tcaron -55
+KPX Acircumflex Tcommaaccent -55
+KPX Acircumflex U -50
+KPX Acircumflex Uacute -50
+KPX Acircumflex Ucircumflex -50
+KPX Acircumflex Udieresis -50
+KPX Acircumflex Ugrave -50
+KPX Acircumflex Uhungarumlaut -50
+KPX Acircumflex Umacron -50
+KPX Acircumflex Uogonek -50
+KPX Acircumflex Uring -50
+KPX Acircumflex V -95
+KPX Acircumflex W -100
+KPX Acircumflex Y -70
+KPX Acircumflex Yacute -70
+KPX Acircumflex Ydieresis -70
+KPX Acircumflex quoteright -74
+KPX Acircumflex u -30
+KPX Acircumflex uacute -30
+KPX Acircumflex ucircumflex -30
+KPX Acircumflex udieresis -30
+KPX Acircumflex ugrave -30
+KPX Acircumflex uhungarumlaut -30
+KPX Acircumflex umacron -30
+KPX Acircumflex uogonek -30
+KPX Acircumflex uring -30
+KPX Acircumflex v -74
+KPX Acircumflex w -74
+KPX Acircumflex y -74
+KPX Acircumflex yacute -74
+KPX Acircumflex ydieresis -74
+KPX Adieresis C -65
+KPX Adieresis Cacute -65
+KPX Adieresis Ccaron -65
+KPX Adieresis Ccedilla -65
+KPX Adieresis G -60
+KPX Adieresis Gbreve -60
+KPX Adieresis Gcommaaccent -60
+KPX Adieresis O -50
+KPX Adieresis Oacute -50
+KPX Adieresis Ocircumflex -50
+KPX Adieresis Odieresis -50
+KPX Adieresis Ograve -50
+KPX Adieresis Ohungarumlaut -50
+KPX Adieresis Omacron -50
+KPX Adieresis Oslash -50
+KPX Adieresis Otilde -50
+KPX Adieresis Q -55
+KPX Adieresis T -55
+KPX Adieresis Tcaron -55
+KPX Adieresis Tcommaaccent -55
+KPX Adieresis U -50
+KPX Adieresis Uacute -50
+KPX Adieresis Ucircumflex -50
+KPX Adieresis Udieresis -50
+KPX Adieresis Ugrave -50
+KPX Adieresis Uhungarumlaut -50
+KPX Adieresis Umacron -50
+KPX Adieresis Uogonek -50
+KPX Adieresis Uring -50
+KPX Adieresis V -95
+KPX Adieresis W -100
+KPX Adieresis Y -70
+KPX Adieresis Yacute -70
+KPX Adieresis Ydieresis -70
+KPX Adieresis quoteright -74
+KPX Adieresis u -30
+KPX Adieresis uacute -30
+KPX Adieresis ucircumflex -30
+KPX Adieresis udieresis -30
+KPX Adieresis ugrave -30
+KPX Adieresis uhungarumlaut -30
+KPX Adieresis umacron -30
+KPX Adieresis uogonek -30
+KPX Adieresis uring -30
+KPX Adieresis v -74
+KPX Adieresis w -74
+KPX Adieresis y -74
+KPX Adieresis yacute -74
+KPX Adieresis ydieresis -74
+KPX Agrave C -65
+KPX Agrave Cacute -65
+KPX Agrave Ccaron -65
+KPX Agrave Ccedilla -65
+KPX Agrave G -60
+KPX Agrave Gbreve -60
+KPX Agrave Gcommaaccent -60
+KPX Agrave O -50
+KPX Agrave Oacute -50
+KPX Agrave Ocircumflex -50
+KPX Agrave Odieresis -50
+KPX Agrave Ograve -50
+KPX Agrave Ohungarumlaut -50
+KPX Agrave Omacron -50
+KPX Agrave Oslash -50
+KPX Agrave Otilde -50
+KPX Agrave Q -55
+KPX Agrave T -55
+KPX Agrave Tcaron -55
+KPX Agrave Tcommaaccent -55
+KPX Agrave U -50
+KPX Agrave Uacute -50
+KPX Agrave Ucircumflex -50
+KPX Agrave Udieresis -50
+KPX Agrave Ugrave -50
+KPX Agrave Uhungarumlaut -50
+KPX Agrave Umacron -50
+KPX Agrave Uogonek -50
+KPX Agrave Uring -50
+KPX Agrave V -95
+KPX Agrave W -100
+KPX Agrave Y -70
+KPX Agrave Yacute -70
+KPX Agrave Ydieresis -70
+KPX Agrave quoteright -74
+KPX Agrave u -30
+KPX Agrave uacute -30
+KPX Agrave ucircumflex -30
+KPX Agrave udieresis -30
+KPX Agrave ugrave -30
+KPX Agrave uhungarumlaut -30
+KPX Agrave umacron -30
+KPX Agrave uogonek -30
+KPX Agrave uring -30
+KPX Agrave v -74
+KPX Agrave w -74
+KPX Agrave y -74
+KPX Agrave yacute -74
+KPX Agrave ydieresis -74
+KPX Amacron C -65
+KPX Amacron Cacute -65
+KPX Amacron Ccaron -65
+KPX Amacron Ccedilla -65
+KPX Amacron G -60
+KPX Amacron Gbreve -60
+KPX Amacron Gcommaaccent -60
+KPX Amacron O -50
+KPX Amacron Oacute -50
+KPX Amacron Ocircumflex -50
+KPX Amacron Odieresis -50
+KPX Amacron Ograve -50
+KPX Amacron Ohungarumlaut -50
+KPX Amacron Omacron -50
+KPX Amacron Oslash -50
+KPX Amacron Otilde -50
+KPX Amacron Q -55
+KPX Amacron T -55
+KPX Amacron Tcaron -55
+KPX Amacron Tcommaaccent -55
+KPX Amacron U -50
+KPX Amacron Uacute -50
+KPX Amacron Ucircumflex -50
+KPX Amacron Udieresis -50
+KPX Amacron Ugrave -50
+KPX Amacron Uhungarumlaut -50
+KPX Amacron Umacron -50
+KPX Amacron Uogonek -50
+KPX Amacron Uring -50
+KPX Amacron V -95
+KPX Amacron W -100
+KPX Amacron Y -70
+KPX Amacron Yacute -70
+KPX Amacron Ydieresis -70
+KPX Amacron quoteright -74
+KPX Amacron u -30
+KPX Amacron uacute -30
+KPX Amacron ucircumflex -30
+KPX Amacron udieresis -30
+KPX Amacron ugrave -30
+KPX Amacron uhungarumlaut -30
+KPX Amacron umacron -30
+KPX Amacron uogonek -30
+KPX Amacron uring -30
+KPX Amacron v -74
+KPX Amacron w -74
+KPX Amacron y -74
+KPX Amacron yacute -74
+KPX Amacron ydieresis -74
+KPX Aogonek C -65
+KPX Aogonek Cacute -65
+KPX Aogonek Ccaron -65
+KPX Aogonek Ccedilla -65
+KPX Aogonek G -60
+KPX Aogonek Gbreve -60
+KPX Aogonek Gcommaaccent -60
+KPX Aogonek O -50
+KPX Aogonek Oacute -50
+KPX Aogonek Ocircumflex -50
+KPX Aogonek Odieresis -50
+KPX Aogonek Ograve -50
+KPX Aogonek Ohungarumlaut -50
+KPX Aogonek Omacron -50
+KPX Aogonek Oslash -50
+KPX Aogonek Otilde -50
+KPX Aogonek Q -55
+KPX Aogonek T -55
+KPX Aogonek Tcaron -55
+KPX Aogonek Tcommaaccent -55
+KPX Aogonek U -50
+KPX Aogonek Uacute -50
+KPX Aogonek Ucircumflex -50
+KPX Aogonek Udieresis -50
+KPX Aogonek Ugrave -50
+KPX Aogonek Uhungarumlaut -50
+KPX Aogonek Umacron -50
+KPX Aogonek Uogonek -50
+KPX Aogonek Uring -50
+KPX Aogonek V -95
+KPX Aogonek W -100
+KPX Aogonek Y -70
+KPX Aogonek Yacute -70
+KPX Aogonek Ydieresis -70
+KPX Aogonek quoteright -74
+KPX Aogonek u -30
+KPX Aogonek uacute -30
+KPX Aogonek ucircumflex -30
+KPX Aogonek udieresis -30
+KPX Aogonek ugrave -30
+KPX Aogonek uhungarumlaut -30
+KPX Aogonek umacron -30
+KPX Aogonek uogonek -30
+KPX Aogonek uring -30
+KPX Aogonek v -74
+KPX Aogonek w -74
+KPX Aogonek y -34
+KPX Aogonek yacute -34
+KPX Aogonek ydieresis -34
+KPX Aring C -65
+KPX Aring Cacute -65
+KPX Aring Ccaron -65
+KPX Aring Ccedilla -65
+KPX Aring G -60
+KPX Aring Gbreve -60
+KPX Aring Gcommaaccent -60
+KPX Aring O -50
+KPX Aring Oacute -50
+KPX Aring Ocircumflex -50
+KPX Aring Odieresis -50
+KPX Aring Ograve -50
+KPX Aring Ohungarumlaut -50
+KPX Aring Omacron -50
+KPX Aring Oslash -50
+KPX Aring Otilde -50
+KPX Aring Q -55
+KPX Aring T -55
+KPX Aring Tcaron -55
+KPX Aring Tcommaaccent -55
+KPX Aring U -50
+KPX Aring Uacute -50
+KPX Aring Ucircumflex -50
+KPX Aring Udieresis -50
+KPX Aring Ugrave -50
+KPX Aring Uhungarumlaut -50
+KPX Aring Umacron -50
+KPX Aring Uogonek -50
+KPX Aring Uring -50
+KPX Aring V -95
+KPX Aring W -100
+KPX Aring Y -70
+KPX Aring Yacute -70
+KPX Aring Ydieresis -70
+KPX Aring quoteright -74
+KPX Aring u -30
+KPX Aring uacute -30
+KPX Aring ucircumflex -30
+KPX Aring udieresis -30
+KPX Aring ugrave -30
+KPX Aring uhungarumlaut -30
+KPX Aring umacron -30
+KPX Aring uogonek -30
+KPX Aring uring -30
+KPX Aring v -74
+KPX Aring w -74
+KPX Aring y -74
+KPX Aring yacute -74
+KPX Aring ydieresis -74
+KPX Atilde C -65
+KPX Atilde Cacute -65
+KPX Atilde Ccaron -65
+KPX Atilde Ccedilla -65
+KPX Atilde G -60
+KPX Atilde Gbreve -60
+KPX Atilde Gcommaaccent -60
+KPX Atilde O -50
+KPX Atilde Oacute -50
+KPX Atilde Ocircumflex -50
+KPX Atilde Odieresis -50
+KPX Atilde Ograve -50
+KPX Atilde Ohungarumlaut -50
+KPX Atilde Omacron -50
+KPX Atilde Oslash -50
+KPX Atilde Otilde -50
+KPX Atilde Q -55
+KPX Atilde T -55
+KPX Atilde Tcaron -55
+KPX Atilde Tcommaaccent -55
+KPX Atilde U -50
+KPX Atilde Uacute -50
+KPX Atilde Ucircumflex -50
+KPX Atilde Udieresis -50
+KPX Atilde Ugrave -50
+KPX Atilde Uhungarumlaut -50
+KPX Atilde Umacron -50
+KPX Atilde Uogonek -50
+KPX Atilde Uring -50
+KPX Atilde V -95
+KPX Atilde W -100
+KPX Atilde Y -70
+KPX Atilde Yacute -70
+KPX Atilde Ydieresis -70
+KPX Atilde quoteright -74
+KPX Atilde u -30
+KPX Atilde uacute -30
+KPX Atilde ucircumflex -30
+KPX Atilde udieresis -30
+KPX Atilde ugrave -30
+KPX Atilde uhungarumlaut -30
+KPX Atilde umacron -30
+KPX Atilde uogonek -30
+KPX Atilde uring -30
+KPX Atilde v -74
+KPX Atilde w -74
+KPX Atilde y -74
+KPX Atilde yacute -74
+KPX Atilde ydieresis -74
+KPX B A -25
+KPX B Aacute -25
+KPX B Abreve -25
+KPX B Acircumflex -25
+KPX B Adieresis -25
+KPX B Agrave -25
+KPX B Amacron -25
+KPX B Aogonek -25
+KPX B Aring -25
+KPX B Atilde -25
+KPX B U -10
+KPX B Uacute -10
+KPX B Ucircumflex -10
+KPX B Udieresis -10
+KPX B Ugrave -10
+KPX B Uhungarumlaut -10
+KPX B Umacron -10
+KPX B Uogonek -10
+KPX B Uring -10
+KPX D A -25
+KPX D Aacute -25
+KPX D Abreve -25
+KPX D Acircumflex -25
+KPX D Adieresis -25
+KPX D Agrave -25
+KPX D Amacron -25
+KPX D Aogonek -25
+KPX D Aring -25
+KPX D Atilde -25
+KPX D V -50
+KPX D W -40
+KPX D Y -50
+KPX D Yacute -50
+KPX D Ydieresis -50
+KPX Dcaron A -25
+KPX Dcaron Aacute -25
+KPX Dcaron Abreve -25
+KPX Dcaron Acircumflex -25
+KPX Dcaron Adieresis -25
+KPX Dcaron Agrave -25
+KPX Dcaron Amacron -25
+KPX Dcaron Aogonek -25
+KPX Dcaron Aring -25
+KPX Dcaron Atilde -25
+KPX Dcaron V -50
+KPX Dcaron W -40
+KPX Dcaron Y -50
+KPX Dcaron Yacute -50
+KPX Dcaron Ydieresis -50
+KPX Dcroat A -25
+KPX Dcroat Aacute -25
+KPX Dcroat Abreve -25
+KPX Dcroat Acircumflex -25
+KPX Dcroat Adieresis -25
+KPX Dcroat Agrave -25
+KPX Dcroat Amacron -25
+KPX Dcroat Aogonek -25
+KPX Dcroat Aring -25
+KPX Dcroat Atilde -25
+KPX Dcroat V -50
+KPX Dcroat W -40
+KPX Dcroat Y -50
+KPX Dcroat Yacute -50
+KPX Dcroat Ydieresis -50
+KPX F A -100
+KPX F Aacute -100
+KPX F Abreve -100
+KPX F Acircumflex -100
+KPX F Adieresis -100
+KPX F Agrave -100
+KPX F Amacron -100
+KPX F Aogonek -100
+KPX F Aring -100
+KPX F Atilde -100
+KPX F a -95
+KPX F aacute -95
+KPX F abreve -95
+KPX F acircumflex -95
+KPX F adieresis -95
+KPX F agrave -95
+KPX F amacron -95
+KPX F aogonek -95
+KPX F aring -95
+KPX F atilde -95
+KPX F comma -129
+KPX F e -100
+KPX F eacute -100
+KPX F ecaron -100
+KPX F ecircumflex -100
+KPX F edieresis -100
+KPX F edotaccent -100
+KPX F egrave -100
+KPX F emacron -100
+KPX F eogonek -100
+KPX F i -40
+KPX F iacute -40
+KPX F icircumflex -40
+KPX F idieresis -40
+KPX F igrave -40
+KPX F imacron -40
+KPX F iogonek -40
+KPX F o -70
+KPX F oacute -70
+KPX F ocircumflex -70
+KPX F odieresis -70
+KPX F ograve -70
+KPX F ohungarumlaut -70
+KPX F omacron -70
+KPX F oslash -70
+KPX F otilde -70
+KPX F period -129
+KPX F r -50
+KPX F racute -50
+KPX F rcaron -50
+KPX F rcommaaccent -50
+KPX J A -25
+KPX J Aacute -25
+KPX J Abreve -25
+KPX J Acircumflex -25
+KPX J Adieresis -25
+KPX J Agrave -25
+KPX J Amacron -25
+KPX J Aogonek -25
+KPX J Aring -25
+KPX J Atilde -25
+KPX J a -40
+KPX J aacute -40
+KPX J abreve -40
+KPX J acircumflex -40
+KPX J adieresis -40
+KPX J agrave -40
+KPX J amacron -40
+KPX J aogonek -40
+KPX J aring -40
+KPX J atilde -40
+KPX J comma -10
+KPX J e -40
+KPX J eacute -40
+KPX J ecaron -40
+KPX J ecircumflex -40
+KPX J edieresis -40
+KPX J edotaccent -40
+KPX J egrave -40
+KPX J emacron -40
+KPX J eogonek -40
+KPX J o -40
+KPX J oacute -40
+KPX J ocircumflex -40
+KPX J odieresis -40
+KPX J ograve -40
+KPX J ohungarumlaut -40
+KPX J omacron -40
+KPX J oslash -40
+KPX J otilde -40
+KPX J period -10
+KPX J u -40
+KPX J uacute -40
+KPX J ucircumflex -40
+KPX J udieresis -40
+KPX J ugrave -40
+KPX J uhungarumlaut -40
+KPX J umacron -40
+KPX J uogonek -40
+KPX J uring -40
+KPX K O -30
+KPX K Oacute -30
+KPX K Ocircumflex -30
+KPX K Odieresis -30
+KPX K Ograve -30
+KPX K Ohungarumlaut -30
+KPX K Omacron -30
+KPX K Oslash -30
+KPX K Otilde -30
+KPX K e -25
+KPX K eacute -25
+KPX K ecaron -25
+KPX K ecircumflex -25
+KPX K edieresis -25
+KPX K edotaccent -25
+KPX K egrave -25
+KPX K emacron -25
+KPX K eogonek -25
+KPX K o -25
+KPX K oacute -25
+KPX K ocircumflex -25
+KPX K odieresis -25
+KPX K ograve -25
+KPX K ohungarumlaut -25
+KPX K omacron -25
+KPX K oslash -25
+KPX K otilde -25
+KPX K u -20
+KPX K uacute -20
+KPX K ucircumflex -20
+KPX K udieresis -20
+KPX K ugrave -20
+KPX K uhungarumlaut -20
+KPX K umacron -20
+KPX K uogonek -20
+KPX K uring -20
+KPX K y -20
+KPX K yacute -20
+KPX K ydieresis -20
+KPX Kcommaaccent O -30
+KPX Kcommaaccent Oacute -30
+KPX Kcommaaccent Ocircumflex -30
+KPX Kcommaaccent Odieresis -30
+KPX Kcommaaccent Ograve -30
+KPX Kcommaaccent Ohungarumlaut -30
+KPX Kcommaaccent Omacron -30
+KPX Kcommaaccent Oslash -30
+KPX Kcommaaccent Otilde -30
+KPX Kcommaaccent e -25
+KPX Kcommaaccent eacute -25
+KPX Kcommaaccent ecaron -25
+KPX Kcommaaccent ecircumflex -25
+KPX Kcommaaccent edieresis -25
+KPX Kcommaaccent edotaccent -25
+KPX Kcommaaccent egrave -25
+KPX Kcommaaccent emacron -25
+KPX Kcommaaccent eogonek -25
+KPX Kcommaaccent o -25
+KPX Kcommaaccent oacute -25
+KPX Kcommaaccent ocircumflex -25
+KPX Kcommaaccent odieresis -25
+KPX Kcommaaccent ograve -25
+KPX Kcommaaccent ohungarumlaut -25
+KPX Kcommaaccent omacron -25
+KPX Kcommaaccent oslash -25
+KPX Kcommaaccent otilde -25
+KPX Kcommaaccent u -20
+KPX Kcommaaccent uacute -20
+KPX Kcommaaccent ucircumflex -20
+KPX Kcommaaccent udieresis -20
+KPX Kcommaaccent ugrave -20
+KPX Kcommaaccent uhungarumlaut -20
+KPX Kcommaaccent umacron -20
+KPX Kcommaaccent uogonek -20
+KPX Kcommaaccent uring -20
+KPX Kcommaaccent y -20
+KPX Kcommaaccent yacute -20
+KPX Kcommaaccent ydieresis -20
+KPX L T -18
+KPX L Tcaron -18
+KPX L Tcommaaccent -18
+KPX L V -37
+KPX L W -37
+KPX L Y -37
+KPX L Yacute -37
+KPX L Ydieresis -37
+KPX L quoteright -55
+KPX L y -37
+KPX L yacute -37
+KPX L ydieresis -37
+KPX Lacute T -18
+KPX Lacute Tcaron -18
+KPX Lacute Tcommaaccent -18
+KPX Lacute V -37
+KPX Lacute W -37
+KPX Lacute Y -37
+KPX Lacute Yacute -37
+KPX Lacute Ydieresis -37
+KPX Lacute quoteright -55
+KPX Lacute y -37
+KPX Lacute yacute -37
+KPX Lacute ydieresis -37
+KPX Lcommaaccent T -18
+KPX Lcommaaccent Tcaron -18
+KPX Lcommaaccent Tcommaaccent -18
+KPX Lcommaaccent V -37
+KPX Lcommaaccent W -37
+KPX Lcommaaccent Y -37
+KPX Lcommaaccent Yacute -37
+KPX Lcommaaccent Ydieresis -37
+KPX Lcommaaccent quoteright -55
+KPX Lcommaaccent y -37
+KPX Lcommaaccent yacute -37
+KPX Lcommaaccent ydieresis -37
+KPX Lslash T -18
+KPX Lslash Tcaron -18
+KPX Lslash Tcommaaccent -18
+KPX Lslash V -37
+KPX Lslash W -37
+KPX Lslash Y -37
+KPX Lslash Yacute -37
+KPX Lslash Ydieresis -37
+KPX Lslash quoteright -55
+KPX Lslash y -37
+KPX Lslash yacute -37
+KPX Lslash ydieresis -37
+KPX N A -30
+KPX N Aacute -30
+KPX N Abreve -30
+KPX N Acircumflex -30
+KPX N Adieresis -30
+KPX N Agrave -30
+KPX N Amacron -30
+KPX N Aogonek -30
+KPX N Aring -30
+KPX N Atilde -30
+KPX Nacute A -30
+KPX Nacute Aacute -30
+KPX Nacute Abreve -30
+KPX Nacute Acircumflex -30
+KPX Nacute Adieresis -30
+KPX Nacute Agrave -30
+KPX Nacute Amacron -30
+KPX Nacute Aogonek -30
+KPX Nacute Aring -30
+KPX Nacute Atilde -30
+KPX Ncaron A -30
+KPX Ncaron Aacute -30
+KPX Ncaron Abreve -30
+KPX Ncaron Acircumflex -30
+KPX Ncaron Adieresis -30
+KPX Ncaron Agrave -30
+KPX Ncaron Amacron -30
+KPX Ncaron Aogonek -30
+KPX Ncaron Aring -30
+KPX Ncaron Atilde -30
+KPX Ncommaaccent A -30
+KPX Ncommaaccent Aacute -30
+KPX Ncommaaccent Abreve -30
+KPX Ncommaaccent Acircumflex -30
+KPX Ncommaaccent Adieresis -30
+KPX Ncommaaccent Agrave -30
+KPX Ncommaaccent Amacron -30
+KPX Ncommaaccent Aogonek -30
+KPX Ncommaaccent Aring -30
+KPX Ncommaaccent Atilde -30
+KPX Ntilde A -30
+KPX Ntilde Aacute -30
+KPX Ntilde Abreve -30
+KPX Ntilde Acircumflex -30
+KPX Ntilde Adieresis -30
+KPX Ntilde Agrave -30
+KPX Ntilde Amacron -30
+KPX Ntilde Aogonek -30
+KPX Ntilde Aring -30
+KPX Ntilde Atilde -30
+KPX O A -40
+KPX O Aacute -40
+KPX O Abreve -40
+KPX O Acircumflex -40
+KPX O Adieresis -40
+KPX O Agrave -40
+KPX O Amacron -40
+KPX O Aogonek -40
+KPX O Aring -40
+KPX O Atilde -40
+KPX O T -40
+KPX O Tcaron -40
+KPX O Tcommaaccent -40
+KPX O V -50
+KPX O W -50
+KPX O X -40
+KPX O Y -50
+KPX O Yacute -50
+KPX O Ydieresis -50
+KPX Oacute A -40
+KPX Oacute Aacute -40
+KPX Oacute Abreve -40
+KPX Oacute Acircumflex -40
+KPX Oacute Adieresis -40
+KPX Oacute Agrave -40
+KPX Oacute Amacron -40
+KPX Oacute Aogonek -40
+KPX Oacute Aring -40
+KPX Oacute Atilde -40
+KPX Oacute T -40
+KPX Oacute Tcaron -40
+KPX Oacute Tcommaaccent -40
+KPX Oacute V -50
+KPX Oacute W -50
+KPX Oacute X -40
+KPX Oacute Y -50
+KPX Oacute Yacute -50
+KPX Oacute Ydieresis -50
+KPX Ocircumflex A -40
+KPX Ocircumflex Aacute -40
+KPX Ocircumflex Abreve -40
+KPX Ocircumflex Acircumflex -40
+KPX Ocircumflex Adieresis -40
+KPX Ocircumflex Agrave -40
+KPX Ocircumflex Amacron -40
+KPX Ocircumflex Aogonek -40
+KPX Ocircumflex Aring -40
+KPX Ocircumflex Atilde -40
+KPX Ocircumflex T -40
+KPX Ocircumflex Tcaron -40
+KPX Ocircumflex Tcommaaccent -40
+KPX Ocircumflex V -50
+KPX Ocircumflex W -50
+KPX Ocircumflex X -40
+KPX Ocircumflex Y -50
+KPX Ocircumflex Yacute -50
+KPX Ocircumflex Ydieresis -50
+KPX Odieresis A -40
+KPX Odieresis Aacute -40
+KPX Odieresis Abreve -40
+KPX Odieresis Acircumflex -40
+KPX Odieresis Adieresis -40
+KPX Odieresis Agrave -40
+KPX Odieresis Amacron -40
+KPX Odieresis Aogonek -40
+KPX Odieresis Aring -40
+KPX Odieresis Atilde -40
+KPX Odieresis T -40
+KPX Odieresis Tcaron -40
+KPX Odieresis Tcommaaccent -40
+KPX Odieresis V -50
+KPX Odieresis W -50
+KPX Odieresis X -40
+KPX Odieresis Y -50
+KPX Odieresis Yacute -50
+KPX Odieresis Ydieresis -50
+KPX Ograve A -40
+KPX Ograve Aacute -40
+KPX Ograve Abreve -40
+KPX Ograve Acircumflex -40
+KPX Ograve Adieresis -40
+KPX Ograve Agrave -40
+KPX Ograve Amacron -40
+KPX Ograve Aogonek -40
+KPX Ograve Aring -40
+KPX Ograve Atilde -40
+KPX Ograve T -40
+KPX Ograve Tcaron -40
+KPX Ograve Tcommaaccent -40
+KPX Ograve V -50
+KPX Ograve W -50
+KPX Ograve X -40
+KPX Ograve Y -50
+KPX Ograve Yacute -50
+KPX Ograve Ydieresis -50
+KPX Ohungarumlaut A -40
+KPX Ohungarumlaut Aacute -40
+KPX Ohungarumlaut Abreve -40
+KPX Ohungarumlaut Acircumflex -40
+KPX Ohungarumlaut Adieresis -40
+KPX Ohungarumlaut Agrave -40
+KPX Ohungarumlaut Amacron -40
+KPX Ohungarumlaut Aogonek -40
+KPX Ohungarumlaut Aring -40
+KPX Ohungarumlaut Atilde -40
+KPX Ohungarumlaut T -40
+KPX Ohungarumlaut Tcaron -40
+KPX Ohungarumlaut Tcommaaccent -40
+KPX Ohungarumlaut V -50
+KPX Ohungarumlaut W -50
+KPX Ohungarumlaut X -40
+KPX Ohungarumlaut Y -50
+KPX Ohungarumlaut Yacute -50
+KPX Ohungarumlaut Ydieresis -50
+KPX Omacron A -40
+KPX Omacron Aacute -40
+KPX Omacron Abreve -40
+KPX Omacron Acircumflex -40
+KPX Omacron Adieresis -40
+KPX Omacron Agrave -40
+KPX Omacron Amacron -40
+KPX Omacron Aogonek -40
+KPX Omacron Aring -40
+KPX Omacron Atilde -40
+KPX Omacron T -40
+KPX Omacron Tcaron -40
+KPX Omacron Tcommaaccent -40
+KPX Omacron V -50
+KPX Omacron W -50
+KPX Omacron X -40
+KPX Omacron Y -50
+KPX Omacron Yacute -50
+KPX Omacron Ydieresis -50
+KPX Oslash A -40
+KPX Oslash Aacute -40
+KPX Oslash Abreve -40
+KPX Oslash Acircumflex -40
+KPX Oslash Adieresis -40
+KPX Oslash Agrave -40
+KPX Oslash Amacron -40
+KPX Oslash Aogonek -40
+KPX Oslash Aring -40
+KPX Oslash Atilde -40
+KPX Oslash T -40
+KPX Oslash Tcaron -40
+KPX Oslash Tcommaaccent -40
+KPX Oslash V -50
+KPX Oslash W -50
+KPX Oslash X -40
+KPX Oslash Y -50
+KPX Oslash Yacute -50
+KPX Oslash Ydieresis -50
+KPX Otilde A -40
+KPX Otilde Aacute -40
+KPX Otilde Abreve -40
+KPX Otilde Acircumflex -40
+KPX Otilde Adieresis -40
+KPX Otilde Agrave -40
+KPX Otilde Amacron -40
+KPX Otilde Aogonek -40
+KPX Otilde Aring -40
+KPX Otilde Atilde -40
+KPX Otilde T -40
+KPX Otilde Tcaron -40
+KPX Otilde Tcommaaccent -40
+KPX Otilde V -50
+KPX Otilde W -50
+KPX Otilde X -40
+KPX Otilde Y -50
+KPX Otilde Yacute -50
+KPX Otilde Ydieresis -50
+KPX P A -85
+KPX P Aacute -85
+KPX P Abreve -85
+KPX P Acircumflex -85
+KPX P Adieresis -85
+KPX P Agrave -85
+KPX P Amacron -85
+KPX P Aogonek -85
+KPX P Aring -85
+KPX P Atilde -85
+KPX P a -40
+KPX P aacute -40
+KPX P abreve -40
+KPX P acircumflex -40
+KPX P adieresis -40
+KPX P agrave -40
+KPX P amacron -40
+KPX P aogonek -40
+KPX P aring -40
+KPX P atilde -40
+KPX P comma -129
+KPX P e -50
+KPX P eacute -50
+KPX P ecaron -50
+KPX P ecircumflex -50
+KPX P edieresis -50
+KPX P edotaccent -50
+KPX P egrave -50
+KPX P emacron -50
+KPX P eogonek -50
+KPX P o -55
+KPX P oacute -55
+KPX P ocircumflex -55
+KPX P odieresis -55
+KPX P ograve -55
+KPX P ohungarumlaut -55
+KPX P omacron -55
+KPX P oslash -55
+KPX P otilde -55
+KPX P period -129
+KPX Q U -10
+KPX Q Uacute -10
+KPX Q Ucircumflex -10
+KPX Q Udieresis -10
+KPX Q Ugrave -10
+KPX Q Uhungarumlaut -10
+KPX Q Umacron -10
+KPX Q Uogonek -10
+KPX Q Uring -10
+KPX R O -40
+KPX R Oacute -40
+KPX R Ocircumflex -40
+KPX R Odieresis -40
+KPX R Ograve -40
+KPX R Ohungarumlaut -40
+KPX R Omacron -40
+KPX R Oslash -40
+KPX R Otilde -40
+KPX R T -30
+KPX R Tcaron -30
+KPX R Tcommaaccent -30
+KPX R U -40
+KPX R Uacute -40
+KPX R Ucircumflex -40
+KPX R Udieresis -40
+KPX R Ugrave -40
+KPX R Uhungarumlaut -40
+KPX R Umacron -40
+KPX R Uogonek -40
+KPX R Uring -40
+KPX R V -18
+KPX R W -18
+KPX R Y -18
+KPX R Yacute -18
+KPX R Ydieresis -18
+KPX Racute O -40
+KPX Racute Oacute -40
+KPX Racute Ocircumflex -40
+KPX Racute Odieresis -40
+KPX Racute Ograve -40
+KPX Racute Ohungarumlaut -40
+KPX Racute Omacron -40
+KPX Racute Oslash -40
+KPX Racute Otilde -40
+KPX Racute T -30
+KPX Racute Tcaron -30
+KPX Racute Tcommaaccent -30
+KPX Racute U -40
+KPX Racute Uacute -40
+KPX Racute Ucircumflex -40
+KPX Racute Udieresis -40
+KPX Racute Ugrave -40
+KPX Racute Uhungarumlaut -40
+KPX Racute Umacron -40
+KPX Racute Uogonek -40
+KPX Racute Uring -40
+KPX Racute V -18
+KPX Racute W -18
+KPX Racute Y -18
+KPX Racute Yacute -18
+KPX Racute Ydieresis -18
+KPX Rcaron O -40
+KPX Rcaron Oacute -40
+KPX Rcaron Ocircumflex -40
+KPX Rcaron Odieresis -40
+KPX Rcaron Ograve -40
+KPX Rcaron Ohungarumlaut -40
+KPX Rcaron Omacron -40
+KPX Rcaron Oslash -40
+KPX Rcaron Otilde -40
+KPX Rcaron T -30
+KPX Rcaron Tcaron -30
+KPX Rcaron Tcommaaccent -30
+KPX Rcaron U -40
+KPX Rcaron Uacute -40
+KPX Rcaron Ucircumflex -40
+KPX Rcaron Udieresis -40
+KPX Rcaron Ugrave -40
+KPX Rcaron Uhungarumlaut -40
+KPX Rcaron Umacron -40
+KPX Rcaron Uogonek -40
+KPX Rcaron Uring -40
+KPX Rcaron V -18
+KPX Rcaron W -18
+KPX Rcaron Y -18
+KPX Rcaron Yacute -18
+KPX Rcaron Ydieresis -18
+KPX Rcommaaccent O -40
+KPX Rcommaaccent Oacute -40
+KPX Rcommaaccent Ocircumflex -40
+KPX Rcommaaccent Odieresis -40
+KPX Rcommaaccent Ograve -40
+KPX Rcommaaccent Ohungarumlaut -40
+KPX Rcommaaccent Omacron -40
+KPX Rcommaaccent Oslash -40
+KPX Rcommaaccent Otilde -40
+KPX Rcommaaccent T -30
+KPX Rcommaaccent Tcaron -30
+KPX Rcommaaccent Tcommaaccent -30
+KPX Rcommaaccent U -40
+KPX Rcommaaccent Uacute -40
+KPX Rcommaaccent Ucircumflex -40
+KPX Rcommaaccent Udieresis -40
+KPX Rcommaaccent Ugrave -40
+KPX Rcommaaccent Uhungarumlaut -40
+KPX Rcommaaccent Umacron -40
+KPX Rcommaaccent Uogonek -40
+KPX Rcommaaccent Uring -40
+KPX Rcommaaccent V -18
+KPX Rcommaaccent W -18
+KPX Rcommaaccent Y -18
+KPX Rcommaaccent Yacute -18
+KPX Rcommaaccent Ydieresis -18
+KPX T A -55
+KPX T Aacute -55
+KPX T Abreve -55
+KPX T Acircumflex -55
+KPX T Adieresis -55
+KPX T Agrave -55
+KPX T Amacron -55
+KPX T Aogonek -55
+KPX T Aring -55
+KPX T Atilde -55
+KPX T O -18
+KPX T Oacute -18
+KPX T Ocircumflex -18
+KPX T Odieresis -18
+KPX T Ograve -18
+KPX T Ohungarumlaut -18
+KPX T Omacron -18
+KPX T Oslash -18
+KPX T Otilde -18
+KPX T a -92
+KPX T aacute -92
+KPX T abreve -92
+KPX T acircumflex -92
+KPX T adieresis -92
+KPX T agrave -92
+KPX T amacron -92
+KPX T aogonek -92
+KPX T aring -92
+KPX T atilde -92
+KPX T colon -74
+KPX T comma -92
+KPX T e -92
+KPX T eacute -92
+KPX T ecaron -92
+KPX T ecircumflex -92
+KPX T edieresis -52
+KPX T edotaccent -92
+KPX T egrave -52
+KPX T emacron -52
+KPX T eogonek -92
+KPX T hyphen -92
+KPX T i -37
+KPX T iacute -37
+KPX T iogonek -37
+KPX T o -95
+KPX T oacute -95
+KPX T ocircumflex -95
+KPX T odieresis -95
+KPX T ograve -95
+KPX T ohungarumlaut -95
+KPX T omacron -95
+KPX T oslash -95
+KPX T otilde -95
+KPX T period -92
+KPX T r -37
+KPX T racute -37
+KPX T rcaron -37
+KPX T rcommaaccent -37
+KPX T semicolon -74
+KPX T u -37
+KPX T uacute -37
+KPX T ucircumflex -37
+KPX T udieresis -37
+KPX T ugrave -37
+KPX T uhungarumlaut -37
+KPX T umacron -37
+KPX T uogonek -37
+KPX T uring -37
+KPX T w -37
+KPX T y -37
+KPX T yacute -37
+KPX T ydieresis -37
+KPX Tcaron A -55
+KPX Tcaron Aacute -55
+KPX Tcaron Abreve -55
+KPX Tcaron Acircumflex -55
+KPX Tcaron Adieresis -55
+KPX Tcaron Agrave -55
+KPX Tcaron Amacron -55
+KPX Tcaron Aogonek -55
+KPX Tcaron Aring -55
+KPX Tcaron Atilde -55
+KPX Tcaron O -18
+KPX Tcaron Oacute -18
+KPX Tcaron Ocircumflex -18
+KPX Tcaron Odieresis -18
+KPX Tcaron Ograve -18
+KPX Tcaron Ohungarumlaut -18
+KPX Tcaron Omacron -18
+KPX Tcaron Oslash -18
+KPX Tcaron Otilde -18
+KPX Tcaron a -92
+KPX Tcaron aacute -92
+KPX Tcaron abreve -92
+KPX Tcaron acircumflex -92
+KPX Tcaron adieresis -92
+KPX Tcaron agrave -92
+KPX Tcaron amacron -92
+KPX Tcaron aogonek -92
+KPX Tcaron aring -92
+KPX Tcaron atilde -92
+KPX Tcaron colon -74
+KPX Tcaron comma -92
+KPX Tcaron e -92
+KPX Tcaron eacute -92
+KPX Tcaron ecaron -92
+KPX Tcaron ecircumflex -92
+KPX Tcaron edieresis -52
+KPX Tcaron edotaccent -92
+KPX Tcaron egrave -52
+KPX Tcaron emacron -52
+KPX Tcaron eogonek -92
+KPX Tcaron hyphen -92
+KPX Tcaron i -37
+KPX Tcaron iacute -37
+KPX Tcaron iogonek -37
+KPX Tcaron o -95
+KPX Tcaron oacute -95
+KPX Tcaron ocircumflex -95
+KPX Tcaron odieresis -95
+KPX Tcaron ograve -95
+KPX Tcaron ohungarumlaut -95
+KPX Tcaron omacron -95
+KPX Tcaron oslash -95
+KPX Tcaron otilde -95
+KPX Tcaron period -92
+KPX Tcaron r -37
+KPX Tcaron racute -37
+KPX Tcaron rcaron -37
+KPX Tcaron rcommaaccent -37
+KPX Tcaron semicolon -74
+KPX Tcaron u -37
+KPX Tcaron uacute -37
+KPX Tcaron ucircumflex -37
+KPX Tcaron udieresis -37
+KPX Tcaron ugrave -37
+KPX Tcaron uhungarumlaut -37
+KPX Tcaron umacron -37
+KPX Tcaron uogonek -37
+KPX Tcaron uring -37
+KPX Tcaron w -37
+KPX Tcaron y -37
+KPX Tcaron yacute -37
+KPX Tcaron ydieresis -37
+KPX Tcommaaccent A -55
+KPX Tcommaaccent Aacute -55
+KPX Tcommaaccent Abreve -55
+KPX Tcommaaccent Acircumflex -55
+KPX Tcommaaccent Adieresis -55
+KPX Tcommaaccent Agrave -55
+KPX Tcommaaccent Amacron -55
+KPX Tcommaaccent Aogonek -55
+KPX Tcommaaccent Aring -55
+KPX Tcommaaccent Atilde -55
+KPX Tcommaaccent O -18
+KPX Tcommaaccent Oacute -18
+KPX Tcommaaccent Ocircumflex -18
+KPX Tcommaaccent Odieresis -18
+KPX Tcommaaccent Ograve -18
+KPX Tcommaaccent Ohungarumlaut -18
+KPX Tcommaaccent Omacron -18
+KPX Tcommaaccent Oslash -18
+KPX Tcommaaccent Otilde -18
+KPX Tcommaaccent a -92
+KPX Tcommaaccent aacute -92
+KPX Tcommaaccent abreve -92
+KPX Tcommaaccent acircumflex -92
+KPX Tcommaaccent adieresis -92
+KPX Tcommaaccent agrave -92
+KPX Tcommaaccent amacron -92
+KPX Tcommaaccent aogonek -92
+KPX Tcommaaccent aring -92
+KPX Tcommaaccent atilde -92
+KPX Tcommaaccent colon -74
+KPX Tcommaaccent comma -92
+KPX Tcommaaccent e -92
+KPX Tcommaaccent eacute -92
+KPX Tcommaaccent ecaron -92
+KPX Tcommaaccent ecircumflex -92
+KPX Tcommaaccent edieresis -52
+KPX Tcommaaccent edotaccent -92
+KPX Tcommaaccent egrave -52
+KPX Tcommaaccent emacron -52
+KPX Tcommaaccent eogonek -92
+KPX Tcommaaccent hyphen -92
+KPX Tcommaaccent i -37
+KPX Tcommaaccent iacute -37
+KPX Tcommaaccent iogonek -37
+KPX Tcommaaccent o -95
+KPX Tcommaaccent oacute -95
+KPX Tcommaaccent ocircumflex -95
+KPX Tcommaaccent odieresis -95
+KPX Tcommaaccent ograve -95
+KPX Tcommaaccent ohungarumlaut -95
+KPX Tcommaaccent omacron -95
+KPX Tcommaaccent oslash -95
+KPX Tcommaaccent otilde -95
+KPX Tcommaaccent period -92
+KPX Tcommaaccent r -37
+KPX Tcommaaccent racute -37
+KPX Tcommaaccent rcaron -37
+KPX Tcommaaccent rcommaaccent -37
+KPX Tcommaaccent semicolon -74
+KPX Tcommaaccent u -37
+KPX Tcommaaccent uacute -37
+KPX Tcommaaccent ucircumflex -37
+KPX Tcommaaccent udieresis -37
+KPX Tcommaaccent ugrave -37
+KPX Tcommaaccent uhungarumlaut -37
+KPX Tcommaaccent umacron -37
+KPX Tcommaaccent uogonek -37
+KPX Tcommaaccent uring -37
+KPX Tcommaaccent w -37
+KPX Tcommaaccent y -37
+KPX Tcommaaccent yacute -37
+KPX Tcommaaccent ydieresis -37
+KPX U A -45
+KPX U Aacute -45
+KPX U Abreve -45
+KPX U Acircumflex -45
+KPX U Adieresis -45
+KPX U Agrave -45
+KPX U Amacron -45
+KPX U Aogonek -45
+KPX U Aring -45
+KPX U Atilde -45
+KPX Uacute A -45
+KPX Uacute Aacute -45
+KPX Uacute Abreve -45
+KPX Uacute Acircumflex -45
+KPX Uacute Adieresis -45
+KPX Uacute Agrave -45
+KPX Uacute Amacron -45
+KPX Uacute Aogonek -45
+KPX Uacute Aring -45
+KPX Uacute Atilde -45
+KPX Ucircumflex A -45
+KPX Ucircumflex Aacute -45
+KPX Ucircumflex Abreve -45
+KPX Ucircumflex Acircumflex -45
+KPX Ucircumflex Adieresis -45
+KPX Ucircumflex Agrave -45
+KPX Ucircumflex Amacron -45
+KPX Ucircumflex Aogonek -45
+KPX Ucircumflex Aring -45
+KPX Ucircumflex Atilde -45
+KPX Udieresis A -45
+KPX Udieresis Aacute -45
+KPX Udieresis Abreve -45
+KPX Udieresis Acircumflex -45
+KPX Udieresis Adieresis -45
+KPX Udieresis Agrave -45
+KPX Udieresis Amacron -45
+KPX Udieresis Aogonek -45
+KPX Udieresis Aring -45
+KPX Udieresis Atilde -45
+KPX Ugrave A -45
+KPX Ugrave Aacute -45
+KPX Ugrave Abreve -45
+KPX Ugrave Acircumflex -45
+KPX Ugrave Adieresis -45
+KPX Ugrave Agrave -45
+KPX Ugrave Amacron -45
+KPX Ugrave Aogonek -45
+KPX Ugrave Aring -45
+KPX Ugrave Atilde -45
+KPX Uhungarumlaut A -45
+KPX Uhungarumlaut Aacute -45
+KPX Uhungarumlaut Abreve -45
+KPX Uhungarumlaut Acircumflex -45
+KPX Uhungarumlaut Adieresis -45
+KPX Uhungarumlaut Agrave -45
+KPX Uhungarumlaut Amacron -45
+KPX Uhungarumlaut Aogonek -45
+KPX Uhungarumlaut Aring -45
+KPX Uhungarumlaut Atilde -45
+KPX Umacron A -45
+KPX Umacron Aacute -45
+KPX Umacron Abreve -45
+KPX Umacron Acircumflex -45
+KPX Umacron Adieresis -45
+KPX Umacron Agrave -45
+KPX Umacron Amacron -45
+KPX Umacron Aogonek -45
+KPX Umacron Aring -45
+KPX Umacron Atilde -45
+KPX Uogonek A -45
+KPX Uogonek Aacute -45
+KPX Uogonek Abreve -45
+KPX Uogonek Acircumflex -45
+KPX Uogonek Adieresis -45
+KPX Uogonek Agrave -45
+KPX Uogonek Amacron -45
+KPX Uogonek Aogonek -45
+KPX Uogonek Aring -45
+KPX Uogonek Atilde -45
+KPX Uring A -45
+KPX Uring Aacute -45
+KPX Uring Abreve -45
+KPX Uring Acircumflex -45
+KPX Uring Adieresis -45
+KPX Uring Agrave -45
+KPX Uring Amacron -45
+KPX Uring Aogonek -45
+KPX Uring Aring -45
+KPX Uring Atilde -45
+KPX V A -85
+KPX V Aacute -85
+KPX V Abreve -85
+KPX V Acircumflex -85
+KPX V Adieresis -85
+KPX V Agrave -85
+KPX V Amacron -85
+KPX V Aogonek -85
+KPX V Aring -85
+KPX V Atilde -85
+KPX V G -10
+KPX V Gbreve -10
+KPX V Gcommaaccent -10
+KPX V O -30
+KPX V Oacute -30
+KPX V Ocircumflex -30
+KPX V Odieresis -30
+KPX V Ograve -30
+KPX V Ohungarumlaut -30
+KPX V Omacron -30
+KPX V Oslash -30
+KPX V Otilde -30
+KPX V a -111
+KPX V aacute -111
+KPX V abreve -111
+KPX V acircumflex -111
+KPX V adieresis -111
+KPX V agrave -111
+KPX V amacron -111
+KPX V aogonek -111
+KPX V aring -111
+KPX V atilde -111
+KPX V colon -74
+KPX V comma -129
+KPX V e -111
+KPX V eacute -111
+KPX V ecaron -111
+KPX V ecircumflex -111
+KPX V edieresis -71
+KPX V edotaccent -111
+KPX V egrave -71
+KPX V emacron -71
+KPX V eogonek -111
+KPX V hyphen -70
+KPX V i -55
+KPX V iacute -55
+KPX V iogonek -55
+KPX V o -111
+KPX V oacute -111
+KPX V ocircumflex -111
+KPX V odieresis -111
+KPX V ograve -111
+KPX V ohungarumlaut -111
+KPX V omacron -111
+KPX V oslash -111
+KPX V otilde -111
+KPX V period -129
+KPX V semicolon -74
+KPX V u -55
+KPX V uacute -55
+KPX V ucircumflex -55
+KPX V udieresis -55
+KPX V ugrave -55
+KPX V uhungarumlaut -55
+KPX V umacron -55
+KPX V uogonek -55
+KPX V uring -55
+KPX W A -74
+KPX W Aacute -74
+KPX W Abreve -74
+KPX W Acircumflex -74
+KPX W Adieresis -74
+KPX W Agrave -74
+KPX W Amacron -74
+KPX W Aogonek -74
+KPX W Aring -74
+KPX W Atilde -74
+KPX W O -15
+KPX W Oacute -15
+KPX W Ocircumflex -15
+KPX W Odieresis -15
+KPX W Ograve -15
+KPX W Ohungarumlaut -15
+KPX W Omacron -15
+KPX W Oslash -15
+KPX W Otilde -15
+KPX W a -85
+KPX W aacute -85
+KPX W abreve -85
+KPX W acircumflex -85
+KPX W adieresis -85
+KPX W agrave -85
+KPX W amacron -85
+KPX W aogonek -85
+KPX W aring -85
+KPX W atilde -85
+KPX W colon -55
+KPX W comma -74
+KPX W e -90
+KPX W eacute -90
+KPX W ecaron -90
+KPX W ecircumflex -90
+KPX W edieresis -50
+KPX W edotaccent -90
+KPX W egrave -50
+KPX W emacron -50
+KPX W eogonek -90
+KPX W hyphen -50
+KPX W i -37
+KPX W iacute -37
+KPX W iogonek -37
+KPX W o -80
+KPX W oacute -80
+KPX W ocircumflex -80
+KPX W odieresis -80
+KPX W ograve -80
+KPX W ohungarumlaut -80
+KPX W omacron -80
+KPX W oslash -80
+KPX W otilde -80
+KPX W period -74
+KPX W semicolon -55
+KPX W u -55
+KPX W uacute -55
+KPX W ucircumflex -55
+KPX W udieresis -55
+KPX W ugrave -55
+KPX W uhungarumlaut -55
+KPX W umacron -55
+KPX W uogonek -55
+KPX W uring -55
+KPX W y -55
+KPX W yacute -55
+KPX W ydieresis -55
+KPX Y A -74
+KPX Y Aacute -74
+KPX Y Abreve -74
+KPX Y Acircumflex -74
+KPX Y Adieresis -74
+KPX Y Agrave -74
+KPX Y Amacron -74
+KPX Y Aogonek -74
+KPX Y Aring -74
+KPX Y Atilde -74
+KPX Y O -25
+KPX Y Oacute -25
+KPX Y Ocircumflex -25
+KPX Y Odieresis -25
+KPX Y Ograve -25
+KPX Y Ohungarumlaut -25
+KPX Y Omacron -25
+KPX Y Oslash -25
+KPX Y Otilde -25
+KPX Y a -92
+KPX Y aacute -92
+KPX Y abreve -92
+KPX Y acircumflex -92
+KPX Y adieresis -92
+KPX Y agrave -92
+KPX Y amacron -92
+KPX Y aogonek -92
+KPX Y aring -92
+KPX Y atilde -92
+KPX Y colon -92
+KPX Y comma -92
+KPX Y e -111
+KPX Y eacute -111
+KPX Y ecaron -111
+KPX Y ecircumflex -71
+KPX Y edieresis -71
+KPX Y edotaccent -111
+KPX Y egrave -71
+KPX Y emacron -71
+KPX Y eogonek -111
+KPX Y hyphen -92
+KPX Y i -55
+KPX Y iacute -55
+KPX Y iogonek -55
+KPX Y o -111
+KPX Y oacute -111
+KPX Y ocircumflex -111
+KPX Y odieresis -111
+KPX Y ograve -111
+KPX Y ohungarumlaut -111
+KPX Y omacron -111
+KPX Y oslash -111
+KPX Y otilde -111
+KPX Y period -74
+KPX Y semicolon -92
+KPX Y u -92
+KPX Y uacute -92
+KPX Y ucircumflex -92
+KPX Y udieresis -92
+KPX Y ugrave -92
+KPX Y uhungarumlaut -92
+KPX Y umacron -92
+KPX Y uogonek -92
+KPX Y uring -92
+KPX Yacute A -74
+KPX Yacute Aacute -74
+KPX Yacute Abreve -74
+KPX Yacute Acircumflex -74
+KPX Yacute Adieresis -74
+KPX Yacute Agrave -74
+KPX Yacute Amacron -74
+KPX Yacute Aogonek -74
+KPX Yacute Aring -74
+KPX Yacute Atilde -74
+KPX Yacute O -25
+KPX Yacute Oacute -25
+KPX Yacute Ocircumflex -25
+KPX Yacute Odieresis -25
+KPX Yacute Ograve -25
+KPX Yacute Ohungarumlaut -25
+KPX Yacute Omacron -25
+KPX Yacute Oslash -25
+KPX Yacute Otilde -25
+KPX Yacute a -92
+KPX Yacute aacute -92
+KPX Yacute abreve -92
+KPX Yacute acircumflex -92
+KPX Yacute adieresis -92
+KPX Yacute agrave -92
+KPX Yacute amacron -92
+KPX Yacute aogonek -92
+KPX Yacute aring -92
+KPX Yacute atilde -92
+KPX Yacute colon -92
+KPX Yacute comma -92
+KPX Yacute e -111
+KPX Yacute eacute -111
+KPX Yacute ecaron -111
+KPX Yacute ecircumflex -71
+KPX Yacute edieresis -71
+KPX Yacute edotaccent -111
+KPX Yacute egrave -71
+KPX Yacute emacron -71
+KPX Yacute eogonek -111
+KPX Yacute hyphen -92
+KPX Yacute i -55
+KPX Yacute iacute -55
+KPX Yacute iogonek -55
+KPX Yacute o -111
+KPX Yacute oacute -111
+KPX Yacute ocircumflex -111
+KPX Yacute odieresis -111
+KPX Yacute ograve -111
+KPX Yacute ohungarumlaut -111
+KPX Yacute omacron -111
+KPX Yacute oslash -111
+KPX Yacute otilde -111
+KPX Yacute period -74
+KPX Yacute semicolon -92
+KPX Yacute u -92
+KPX Yacute uacute -92
+KPX Yacute ucircumflex -92
+KPX Yacute udieresis -92
+KPX Yacute ugrave -92
+KPX Yacute uhungarumlaut -92
+KPX Yacute umacron -92
+KPX Yacute uogonek -92
+KPX Yacute uring -92
+KPX Ydieresis A -74
+KPX Ydieresis Aacute -74
+KPX Ydieresis Abreve -74
+KPX Ydieresis Acircumflex -74
+KPX Ydieresis Adieresis -74
+KPX Ydieresis Agrave -74
+KPX Ydieresis Amacron -74
+KPX Ydieresis Aogonek -74
+KPX Ydieresis Aring -74
+KPX Ydieresis Atilde -74
+KPX Ydieresis O -25
+KPX Ydieresis Oacute -25
+KPX Ydieresis Ocircumflex -25
+KPX Ydieresis Odieresis -25
+KPX Ydieresis Ograve -25
+KPX Ydieresis Ohungarumlaut -25
+KPX Ydieresis Omacron -25
+KPX Ydieresis Oslash -25
+KPX Ydieresis Otilde -25
+KPX Ydieresis a -92
+KPX Ydieresis aacute -92
+KPX Ydieresis abreve -92
+KPX Ydieresis acircumflex -92
+KPX Ydieresis adieresis -92
+KPX Ydieresis agrave -92
+KPX Ydieresis amacron -92
+KPX Ydieresis aogonek -92
+KPX Ydieresis aring -92
+KPX Ydieresis atilde -92
+KPX Ydieresis colon -92
+KPX Ydieresis comma -92
+KPX Ydieresis e -111
+KPX Ydieresis eacute -111
+KPX Ydieresis ecaron -111
+KPX Ydieresis ecircumflex -71
+KPX Ydieresis edieresis -71
+KPX Ydieresis edotaccent -111
+KPX Ydieresis egrave -71
+KPX Ydieresis emacron -71
+KPX Ydieresis eogonek -111
+KPX Ydieresis hyphen -92
+KPX Ydieresis i -55
+KPX Ydieresis iacute -55
+KPX Ydieresis iogonek -55
+KPX Ydieresis o -111
+KPX Ydieresis oacute -111
+KPX Ydieresis ocircumflex -111
+KPX Ydieresis odieresis -111
+KPX Ydieresis ograve -111
+KPX Ydieresis ohungarumlaut -111
+KPX Ydieresis omacron -111
+KPX Ydieresis oslash -111
+KPX Ydieresis otilde -111
+KPX Ydieresis period -74
+KPX Ydieresis semicolon -92
+KPX Ydieresis u -92
+KPX Ydieresis uacute -92
+KPX Ydieresis ucircumflex -92
+KPX Ydieresis udieresis -92
+KPX Ydieresis ugrave -92
+KPX Ydieresis uhungarumlaut -92
+KPX Ydieresis umacron -92
+KPX Ydieresis uogonek -92
+KPX Ydieresis uring -92
+KPX b b -10
+KPX b period -40
+KPX b u -20
+KPX b uacute -20
+KPX b ucircumflex -20
+KPX b udieresis -20
+KPX b ugrave -20
+KPX b uhungarumlaut -20
+KPX b umacron -20
+KPX b uogonek -20
+KPX b uring -20
+KPX c h -10
+KPX c k -10
+KPX c kcommaaccent -10
+KPX cacute h -10
+KPX cacute k -10
+KPX cacute kcommaaccent -10
+KPX ccaron h -10
+KPX ccaron k -10
+KPX ccaron kcommaaccent -10
+KPX ccedilla h -10
+KPX ccedilla k -10
+KPX ccedilla kcommaaccent -10
+KPX comma quotedblright -95
+KPX comma quoteright -95
+KPX e b -10
+KPX eacute b -10
+KPX ecaron b -10
+KPX ecircumflex b -10
+KPX edieresis b -10
+KPX edotaccent b -10
+KPX egrave b -10
+KPX emacron b -10
+KPX eogonek b -10
+KPX f comma -10
+KPX f dotlessi -30
+KPX f e -10
+KPX f eacute -10
+KPX f edotaccent -10
+KPX f eogonek -10
+KPX f f -18
+KPX f o -10
+KPX f oacute -10
+KPX f ocircumflex -10
+KPX f ograve -10
+KPX f ohungarumlaut -10
+KPX f oslash -10
+KPX f otilde -10
+KPX f period -10
+KPX f quoteright 55
+KPX k e -30
+KPX k eacute -30
+KPX k ecaron -30
+KPX k ecircumflex -30
+KPX k edieresis -30
+KPX k edotaccent -30
+KPX k egrave -30
+KPX k emacron -30
+KPX k eogonek -30
+KPX k o -10
+KPX k oacute -10
+KPX k ocircumflex -10
+KPX k odieresis -10
+KPX k ograve -10
+KPX k ohungarumlaut -10
+KPX k omacron -10
+KPX k oslash -10
+KPX k otilde -10
+KPX kcommaaccent e -30
+KPX kcommaaccent eacute -30
+KPX kcommaaccent ecaron -30
+KPX kcommaaccent ecircumflex -30
+KPX kcommaaccent edieresis -30
+KPX kcommaaccent edotaccent -30
+KPX kcommaaccent egrave -30
+KPX kcommaaccent emacron -30
+KPX kcommaaccent eogonek -30
+KPX kcommaaccent o -10
+KPX kcommaaccent oacute -10
+KPX kcommaaccent ocircumflex -10
+KPX kcommaaccent odieresis -10
+KPX kcommaaccent ograve -10
+KPX kcommaaccent ohungarumlaut -10
+KPX kcommaaccent omacron -10
+KPX kcommaaccent oslash -10
+KPX kcommaaccent otilde -10
+KPX n v -40
+KPX nacute v -40
+KPX ncaron v -40
+KPX ncommaaccent v -40
+KPX ntilde v -40
+KPX o v -15
+KPX o w -25
+KPX o x -10
+KPX o y -10
+KPX o yacute -10
+KPX o ydieresis -10
+KPX oacute v -15
+KPX oacute w -25
+KPX oacute x -10
+KPX oacute y -10
+KPX oacute yacute -10
+KPX oacute ydieresis -10
+KPX ocircumflex v -15
+KPX ocircumflex w -25
+KPX ocircumflex x -10
+KPX ocircumflex y -10
+KPX ocircumflex yacute -10
+KPX ocircumflex ydieresis -10
+KPX odieresis v -15
+KPX odieresis w -25
+KPX odieresis x -10
+KPX odieresis y -10
+KPX odieresis yacute -10
+KPX odieresis ydieresis -10
+KPX ograve v -15
+KPX ograve w -25
+KPX ograve x -10
+KPX ograve y -10
+KPX ograve yacute -10
+KPX ograve ydieresis -10
+KPX ohungarumlaut v -15
+KPX ohungarumlaut w -25
+KPX ohungarumlaut x -10
+KPX ohungarumlaut y -10
+KPX ohungarumlaut yacute -10
+KPX ohungarumlaut ydieresis -10
+KPX omacron v -15
+KPX omacron w -25
+KPX omacron x -10
+KPX omacron y -10
+KPX omacron yacute -10
+KPX omacron ydieresis -10
+KPX oslash v -15
+KPX oslash w -25
+KPX oslash x -10
+KPX oslash y -10
+KPX oslash yacute -10
+KPX oslash ydieresis -10
+KPX otilde v -15
+KPX otilde w -25
+KPX otilde x -10
+KPX otilde y -10
+KPX otilde yacute -10
+KPX otilde ydieresis -10
+KPX period quotedblright -95
+KPX period quoteright -95
+KPX quoteleft quoteleft -74
+KPX quoteright d -15
+KPX quoteright dcroat -15
+KPX quoteright quoteright -74
+KPX quoteright r -15
+KPX quoteright racute -15
+KPX quoteright rcaron -15
+KPX quoteright rcommaaccent -15
+KPX quoteright s -74
+KPX quoteright sacute -74
+KPX quoteright scaron -74
+KPX quoteright scedilla -74
+KPX quoteright scommaaccent -74
+KPX quoteright space -74
+KPX quoteright t -37
+KPX quoteright tcommaaccent -37
+KPX quoteright v -15
+KPX r comma -65
+KPX r period -65
+KPX racute comma -65
+KPX racute period -65
+KPX rcaron comma -65
+KPX rcaron period -65
+KPX rcommaaccent comma -65
+KPX rcommaaccent period -65
+KPX space A -37
+KPX space Aacute -37
+KPX space Abreve -37
+KPX space Acircumflex -37
+KPX space Adieresis -37
+KPX space Agrave -37
+KPX space Amacron -37
+KPX space Aogonek -37
+KPX space Aring -37
+KPX space Atilde -37
+KPX space V -70
+KPX space W -70
+KPX space Y -70
+KPX space Yacute -70
+KPX space Ydieresis -70
+KPX v comma -37
+KPX v e -15
+KPX v eacute -15
+KPX v ecaron -15
+KPX v ecircumflex -15
+KPX v edieresis -15
+KPX v edotaccent -15
+KPX v egrave -15
+KPX v emacron -15
+KPX v eogonek -15
+KPX v o -15
+KPX v oacute -15
+KPX v ocircumflex -15
+KPX v odieresis -15
+KPX v ograve -15
+KPX v ohungarumlaut -15
+KPX v omacron -15
+KPX v oslash -15
+KPX v otilde -15
+KPX v period -37
+KPX w a -10
+KPX w aacute -10
+KPX w abreve -10
+KPX w acircumflex -10
+KPX w adieresis -10
+KPX w agrave -10
+KPX w amacron -10
+KPX w aogonek -10
+KPX w aring -10
+KPX w atilde -10
+KPX w comma -37
+KPX w e -10
+KPX w eacute -10
+KPX w ecaron -10
+KPX w ecircumflex -10
+KPX w edieresis -10
+KPX w edotaccent -10
+KPX w egrave -10
+KPX w emacron -10
+KPX w eogonek -10
+KPX w o -15
+KPX w oacute -15
+KPX w ocircumflex -15
+KPX w odieresis -15
+KPX w ograve -15
+KPX w ohungarumlaut -15
+KPX w omacron -15
+KPX w oslash -15
+KPX w otilde -15
+KPX w period -37
+KPX x e -10
+KPX x eacute -10
+KPX x ecaron -10
+KPX x ecircumflex -10
+KPX x edieresis -10
+KPX x edotaccent -10
+KPX x egrave -10
+KPX x emacron -10
+KPX x eogonek -10
+KPX y comma -37
+KPX y period -37
+KPX yacute comma -37
+KPX yacute period -37
+KPX ydieresis comma -37
+KPX ydieresis period -37
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/src/fonts/Adobe-Core35_AFMs-314/Times-Italic.afm b/src/fonts/Adobe-Core35_AFMs-314/Times-Italic.afm
new file mode 100644
index 0000000..8560884
--- /dev/null
+++ b/src/fonts/Adobe-Core35_AFMs-314/Times-Italic.afm
@@ -0,0 +1,2665 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Thu May 1 12:56:55 1997
+Comment UniqueID 43067
+Comment VMusage 47727 58752
+FontName Times-Italic
+FullName Times Italic
+FamilyName Times
+Weight Medium
+ItalicAngle -15.5
+IsFixedPitch false
+FontBBox -169 -217 1010 883
+UnderlinePosition -100
+UnderlineThickness 50
+Version 002.000
+Notice Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries.
+EncodingScheme AdobeStandardEncoding
+CapHeight 653
+XHeight 441
+Ascender 683
+Descender -217
+StdHW 32
+StdVW 76
+StartCharMetrics 314
+C 32 ; WX 250 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 333 ; N exclam ; B 39 -11 302 667 ;
+C 34 ; WX 420 ; N quotedbl ; B 144 421 432 666 ;
+C 35 ; WX 500 ; N numbersign ; B 2 0 540 676 ;
+C 36 ; WX 500 ; N dollar ; B 31 -89 497 731 ;
+C 37 ; WX 833 ; N percent ; B 79 -13 790 676 ;
+C 38 ; WX 778 ; N ampersand ; B 76 -18 723 666 ;
+C 39 ; WX 333 ; N quoteright ; B 151 436 290 666 ;
+C 40 ; WX 333 ; N parenleft ; B 42 -181 315 669 ;
+C 41 ; WX 333 ; N parenright ; B 16 -180 289 669 ;
+C 42 ; WX 500 ; N asterisk ; B 128 255 492 666 ;
+C 43 ; WX 675 ; N plus ; B 86 0 590 506 ;
+C 44 ; WX 250 ; N comma ; B -4 -129 135 101 ;
+C 45 ; WX 333 ; N hyphen ; B 49 192 282 255 ;
+C 46 ; WX 250 ; N period ; B 27 -11 138 100 ;
+C 47 ; WX 278 ; N slash ; B -65 -18 386 666 ;
+C 48 ; WX 500 ; N zero ; B 32 -7 497 676 ;
+C 49 ; WX 500 ; N one ; B 49 0 409 676 ;
+C 50 ; WX 500 ; N two ; B 12 0 452 676 ;
+C 51 ; WX 500 ; N three ; B 15 -7 465 676 ;
+C 52 ; WX 500 ; N four ; B 1 0 479 676 ;
+C 53 ; WX 500 ; N five ; B 15 -7 491 666 ;
+C 54 ; WX 500 ; N six ; B 30 -7 521 686 ;
+C 55 ; WX 500 ; N seven ; B 75 -8 537 666 ;
+C 56 ; WX 500 ; N eight ; B 30 -7 493 676 ;
+C 57 ; WX 500 ; N nine ; B 23 -17 492 676 ;
+C 58 ; WX 333 ; N colon ; B 50 -11 261 441 ;
+C 59 ; WX 333 ; N semicolon ; B 27 -129 261 441 ;
+C 60 ; WX 675 ; N less ; B 84 -8 592 514 ;
+C 61 ; WX 675 ; N equal ; B 86 120 590 386 ;
+C 62 ; WX 675 ; N greater ; B 84 -8 592 514 ;
+C 63 ; WX 500 ; N question ; B 132 -12 472 664 ;
+C 64 ; WX 920 ; N at ; B 118 -18 806 666 ;
+C 65 ; WX 611 ; N A ; B -51 0 564 668 ;
+C 66 ; WX 611 ; N B ; B -8 0 588 653 ;
+C 67 ; WX 667 ; N C ; B 66 -18 689 666 ;
+C 68 ; WX 722 ; N D ; B -8 0 700 653 ;
+C 69 ; WX 611 ; N E ; B -1 0 634 653 ;
+C 70 ; WX 611 ; N F ; B 8 0 645 653 ;
+C 71 ; WX 722 ; N G ; B 52 -18 722 666 ;
+C 72 ; WX 722 ; N H ; B -8 0 767 653 ;
+C 73 ; WX 333 ; N I ; B -8 0 384 653 ;
+C 74 ; WX 444 ; N J ; B -6 -18 491 653 ;
+C 75 ; WX 667 ; N K ; B 7 0 722 653 ;
+C 76 ; WX 556 ; N L ; B -8 0 559 653 ;
+C 77 ; WX 833 ; N M ; B -18 0 873 653 ;
+C 78 ; WX 667 ; N N ; B -20 -15 727 653 ;
+C 79 ; WX 722 ; N O ; B 60 -18 699 666 ;
+C 80 ; WX 611 ; N P ; B 0 0 605 653 ;
+C 81 ; WX 722 ; N Q ; B 59 -182 699 666 ;
+C 82 ; WX 611 ; N R ; B -13 0 588 653 ;
+C 83 ; WX 500 ; N S ; B 17 -18 508 667 ;
+C 84 ; WX 556 ; N T ; B 59 0 633 653 ;
+C 85 ; WX 722 ; N U ; B 102 -18 765 653 ;
+C 86 ; WX 611 ; N V ; B 76 -18 688 653 ;
+C 87 ; WX 833 ; N W ; B 71 -18 906 653 ;
+C 88 ; WX 611 ; N X ; B -29 0 655 653 ;
+C 89 ; WX 556 ; N Y ; B 78 0 633 653 ;
+C 90 ; WX 556 ; N Z ; B -6 0 606 653 ;
+C 91 ; WX 389 ; N bracketleft ; B 21 -153 391 663 ;
+C 92 ; WX 278 ; N backslash ; B -41 -18 319 666 ;
+C 93 ; WX 389 ; N bracketright ; B 12 -153 382 663 ;
+C 94 ; WX 422 ; N asciicircum ; B 0 301 422 666 ;
+C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;
+C 96 ; WX 333 ; N quoteleft ; B 171 436 310 666 ;
+C 97 ; WX 500 ; N a ; B 17 -11 476 441 ;
+C 98 ; WX 500 ; N b ; B 23 -11 473 683 ;
+C 99 ; WX 444 ; N c ; B 30 -11 425 441 ;
+C 100 ; WX 500 ; N d ; B 15 -13 527 683 ;
+C 101 ; WX 444 ; N e ; B 31 -11 412 441 ;
+C 102 ; WX 278 ; N f ; B -147 -207 424 678 ; L i fi ; L l fl ;
+C 103 ; WX 500 ; N g ; B 8 -206 472 441 ;
+C 104 ; WX 500 ; N h ; B 19 -9 478 683 ;
+C 105 ; WX 278 ; N i ; B 49 -11 264 654 ;
+C 106 ; WX 278 ; N j ; B -124 -207 276 654 ;
+C 107 ; WX 444 ; N k ; B 14 -11 461 683 ;
+C 108 ; WX 278 ; N l ; B 41 -11 279 683 ;
+C 109 ; WX 722 ; N m ; B 12 -9 704 441 ;
+C 110 ; WX 500 ; N n ; B 14 -9 474 441 ;
+C 111 ; WX 500 ; N o ; B 27 -11 468 441 ;
+C 112 ; WX 500 ; N p ; B -75 -205 469 441 ;
+C 113 ; WX 500 ; N q ; B 25 -209 483 441 ;
+C 114 ; WX 389 ; N r ; B 45 0 412 441 ;
+C 115 ; WX 389 ; N s ; B 16 -13 366 442 ;
+C 116 ; WX 278 ; N t ; B 37 -11 296 546 ;
+C 117 ; WX 500 ; N u ; B 42 -11 475 441 ;
+C 118 ; WX 444 ; N v ; B 21 -18 426 441 ;
+C 119 ; WX 667 ; N w ; B 16 -18 648 441 ;
+C 120 ; WX 444 ; N x ; B -27 -11 447 441 ;
+C 121 ; WX 444 ; N y ; B -24 -206 426 441 ;
+C 122 ; WX 389 ; N z ; B -2 -81 380 428 ;
+C 123 ; WX 400 ; N braceleft ; B 51 -177 407 687 ;
+C 124 ; WX 275 ; N bar ; B 105 -217 171 783 ;
+C 125 ; WX 400 ; N braceright ; B -7 -177 349 687 ;
+C 126 ; WX 541 ; N asciitilde ; B 40 183 502 323 ;
+C 161 ; WX 389 ; N exclamdown ; B 59 -205 322 473 ;
+C 162 ; WX 500 ; N cent ; B 77 -143 472 560 ;
+C 163 ; WX 500 ; N sterling ; B 10 -6 517 670 ;
+C 164 ; WX 167 ; N fraction ; B -169 -10 337 676 ;
+C 165 ; WX 500 ; N yen ; B 27 0 603 653 ;
+C 166 ; WX 500 ; N florin ; B 25 -182 507 682 ;
+C 167 ; WX 500 ; N section ; B 53 -162 461 666 ;
+C 168 ; WX 500 ; N currency ; B -22 53 522 597 ;
+C 169 ; WX 214 ; N quotesingle ; B 132 421 241 666 ;
+C 170 ; WX 556 ; N quotedblleft ; B 166 436 514 666 ;
+C 171 ; WX 500 ; N guillemotleft ; B 53 37 445 403 ;
+C 172 ; WX 333 ; N guilsinglleft ; B 51 37 281 403 ;
+C 173 ; WX 333 ; N guilsinglright ; B 52 37 282 403 ;
+C 174 ; WX 500 ; N fi ; B -141 -207 481 681 ;
+C 175 ; WX 500 ; N fl ; B -141 -204 518 682 ;
+C 177 ; WX 500 ; N endash ; B -6 197 505 243 ;
+C 178 ; WX 500 ; N dagger ; B 101 -159 488 666 ;
+C 179 ; WX 500 ; N daggerdbl ; B 22 -143 491 666 ;
+C 180 ; WX 250 ; N periodcentered ; B 70 199 181 310 ;
+C 182 ; WX 523 ; N paragraph ; B 55 -123 616 653 ;
+C 183 ; WX 350 ; N bullet ; B 40 191 310 461 ;
+C 184 ; WX 333 ; N quotesinglbase ; B 44 -129 183 101 ;
+C 185 ; WX 556 ; N quotedblbase ; B 57 -129 405 101 ;
+C 186 ; WX 556 ; N quotedblright ; B 151 436 499 666 ;
+C 187 ; WX 500 ; N guillemotright ; B 55 37 447 403 ;
+C 188 ; WX 889 ; N ellipsis ; B 57 -11 762 100 ;
+C 189 ; WX 1000 ; N perthousand ; B 25 -19 1010 706 ;
+C 191 ; WX 500 ; N questiondown ; B 28 -205 368 471 ;
+C 193 ; WX 333 ; N grave ; B 121 492 311 664 ;
+C 194 ; WX 333 ; N acute ; B 180 494 403 664 ;
+C 195 ; WX 333 ; N circumflex ; B 91 492 385 661 ;
+C 196 ; WX 333 ; N tilde ; B 100 517 427 624 ;
+C 197 ; WX 333 ; N macron ; B 99 532 411 583 ;
+C 198 ; WX 333 ; N breve ; B 117 492 418 650 ;
+C 199 ; WX 333 ; N dotaccent ; B 207 548 305 646 ;
+C 200 ; WX 333 ; N dieresis ; B 107 548 405 646 ;
+C 202 ; WX 333 ; N ring ; B 155 492 355 691 ;
+C 203 ; WX 333 ; N cedilla ; B -30 -217 182 0 ;
+C 205 ; WX 333 ; N hungarumlaut ; B 93 494 486 664 ;
+C 206 ; WX 333 ; N ogonek ; B 20 -169 203 40 ;
+C 207 ; WX 333 ; N caron ; B 121 492 426 661 ;
+C 208 ; WX 889 ; N emdash ; B -6 197 894 243 ;
+C 225 ; WX 889 ; N AE ; B -27 0 911 653 ;
+C 227 ; WX 276 ; N ordfeminine ; B 42 406 352 676 ;
+C 232 ; WX 556 ; N Lslash ; B -8 0 559 653 ;
+C 233 ; WX 722 ; N Oslash ; B 60 -105 699 722 ;
+C 234 ; WX 944 ; N OE ; B 49 -8 964 666 ;
+C 235 ; WX 310 ; N ordmasculine ; B 67 406 362 676 ;
+C 241 ; WX 667 ; N ae ; B 23 -11 640 441 ;
+C 245 ; WX 278 ; N dotlessi ; B 49 -11 235 441 ;
+C 248 ; WX 278 ; N lslash ; B 41 -11 312 683 ;
+C 249 ; WX 500 ; N oslash ; B 28 -135 469 554 ;
+C 250 ; WX 667 ; N oe ; B 20 -12 646 441 ;
+C 251 ; WX 500 ; N germandbls ; B -168 -207 493 679 ;
+C -1 ; WX 333 ; N Idieresis ; B -8 0 435 818 ;
+C -1 ; WX 444 ; N eacute ; B 31 -11 459 664 ;
+C -1 ; WX 500 ; N abreve ; B 17 -11 502 650 ;
+C -1 ; WX 500 ; N uhungarumlaut ; B 42 -11 580 664 ;
+C -1 ; WX 444 ; N ecaron ; B 31 -11 482 661 ;
+C -1 ; WX 556 ; N Ydieresis ; B 78 0 633 818 ;
+C -1 ; WX 675 ; N divide ; B 86 -11 590 517 ;
+C -1 ; WX 556 ; N Yacute ; B 78 0 633 876 ;
+C -1 ; WX 611 ; N Acircumflex ; B -51 0 564 873 ;
+C -1 ; WX 500 ; N aacute ; B 17 -11 487 664 ;
+C -1 ; WX 722 ; N Ucircumflex ; B 102 -18 765 873 ;
+C -1 ; WX 444 ; N yacute ; B -24 -206 459 664 ;
+C -1 ; WX 389 ; N scommaaccent ; B 16 -217 366 442 ;
+C -1 ; WX 444 ; N ecircumflex ; B 31 -11 441 661 ;
+C -1 ; WX 722 ; N Uring ; B 102 -18 765 883 ;
+C -1 ; WX 722 ; N Udieresis ; B 102 -18 765 818 ;
+C -1 ; WX 500 ; N aogonek ; B 17 -169 476 441 ;
+C -1 ; WX 722 ; N Uacute ; B 102 -18 765 876 ;
+C -1 ; WX 500 ; N uogonek ; B 42 -169 477 441 ;
+C -1 ; WX 611 ; N Edieresis ; B -1 0 634 818 ;
+C -1 ; WX 722 ; N Dcroat ; B -8 0 700 653 ;
+C -1 ; WX 250 ; N commaaccent ; B 8 -217 133 -50 ;
+C -1 ; WX 760 ; N copyright ; B 41 -18 719 666 ;
+C -1 ; WX 611 ; N Emacron ; B -1 0 634 795 ;
+C -1 ; WX 444 ; N ccaron ; B 30 -11 482 661 ;
+C -1 ; WX 500 ; N aring ; B 17 -11 476 691 ;
+C -1 ; WX 667 ; N Ncommaaccent ; B -20 -187 727 653 ;
+C -1 ; WX 278 ; N lacute ; B 41 -11 395 876 ;
+C -1 ; WX 500 ; N agrave ; B 17 -11 476 664 ;
+C -1 ; WX 556 ; N Tcommaaccent ; B 59 -217 633 653 ;
+C -1 ; WX 667 ; N Cacute ; B 66 -18 690 876 ;
+C -1 ; WX 500 ; N atilde ; B 17 -11 511 624 ;
+C -1 ; WX 611 ; N Edotaccent ; B -1 0 634 818 ;
+C -1 ; WX 389 ; N scaron ; B 16 -13 454 661 ;
+C -1 ; WX 389 ; N scedilla ; B 16 -217 366 442 ;
+C -1 ; WX 278 ; N iacute ; B 49 -11 355 664 ;
+C -1 ; WX 471 ; N lozenge ; B 13 0 459 724 ;
+C -1 ; WX 611 ; N Rcaron ; B -13 0 588 873 ;
+C -1 ; WX 722 ; N Gcommaaccent ; B 52 -217 722 666 ;
+C -1 ; WX 500 ; N ucircumflex ; B 42 -11 475 661 ;
+C -1 ; WX 500 ; N acircumflex ; B 17 -11 476 661 ;
+C -1 ; WX 611 ; N Amacron ; B -51 0 564 795 ;
+C -1 ; WX 389 ; N rcaron ; B 45 0 434 661 ;
+C -1 ; WX 444 ; N ccedilla ; B 30 -217 425 441 ;
+C -1 ; WX 556 ; N Zdotaccent ; B -6 0 606 818 ;
+C -1 ; WX 611 ; N Thorn ; B 0 0 569 653 ;
+C -1 ; WX 722 ; N Omacron ; B 60 -18 699 795 ;
+C -1 ; WX 611 ; N Racute ; B -13 0 588 876 ;
+C -1 ; WX 500 ; N Sacute ; B 17 -18 508 876 ;
+C -1 ; WX 544 ; N dcaron ; B 15 -13 658 683 ;
+C -1 ; WX 722 ; N Umacron ; B 102 -18 765 795 ;
+C -1 ; WX 500 ; N uring ; B 42 -11 475 691 ;
+C -1 ; WX 300 ; N threesuperior ; B 43 268 339 676 ;
+C -1 ; WX 722 ; N Ograve ; B 60 -18 699 876 ;
+C -1 ; WX 611 ; N Agrave ; B -51 0 564 876 ;
+C -1 ; WX 611 ; N Abreve ; B -51 0 564 862 ;
+C -1 ; WX 675 ; N multiply ; B 93 8 582 497 ;
+C -1 ; WX 500 ; N uacute ; B 42 -11 477 664 ;
+C -1 ; WX 556 ; N Tcaron ; B 59 0 633 873 ;
+C -1 ; WX 476 ; N partialdiff ; B 17 -38 459 710 ;
+C -1 ; WX 444 ; N ydieresis ; B -24 -206 441 606 ;
+C -1 ; WX 667 ; N Nacute ; B -20 -15 727 876 ;
+C -1 ; WX 278 ; N icircumflex ; B 33 -11 327 661 ;
+C -1 ; WX 611 ; N Ecircumflex ; B -1 0 634 873 ;
+C -1 ; WX 500 ; N adieresis ; B 17 -11 489 606 ;
+C -1 ; WX 444 ; N edieresis ; B 31 -11 451 606 ;
+C -1 ; WX 444 ; N cacute ; B 30 -11 459 664 ;
+C -1 ; WX 500 ; N nacute ; B 14 -9 477 664 ;
+C -1 ; WX 500 ; N umacron ; B 42 -11 485 583 ;
+C -1 ; WX 667 ; N Ncaron ; B -20 -15 727 873 ;
+C -1 ; WX 333 ; N Iacute ; B -8 0 433 876 ;
+C -1 ; WX 675 ; N plusminus ; B 86 0 590 506 ;
+C -1 ; WX 275 ; N brokenbar ; B 105 -142 171 708 ;
+C -1 ; WX 760 ; N registered ; B 41 -18 719 666 ;
+C -1 ; WX 722 ; N Gbreve ; B 52 -18 722 862 ;
+C -1 ; WX 333 ; N Idotaccent ; B -8 0 384 818 ;
+C -1 ; WX 600 ; N summation ; B 15 -10 585 706 ;
+C -1 ; WX 611 ; N Egrave ; B -1 0 634 876 ;
+C -1 ; WX 389 ; N racute ; B 45 0 431 664 ;
+C -1 ; WX 500 ; N omacron ; B 27 -11 495 583 ;
+C -1 ; WX 556 ; N Zacute ; B -6 0 606 876 ;
+C -1 ; WX 556 ; N Zcaron ; B -6 0 606 873 ;
+C -1 ; WX 549 ; N greaterequal ; B 26 0 523 658 ;
+C -1 ; WX 722 ; N Eth ; B -8 0 700 653 ;
+C -1 ; WX 667 ; N Ccedilla ; B 66 -217 689 666 ;
+C -1 ; WX 278 ; N lcommaaccent ; B 22 -217 279 683 ;
+C -1 ; WX 300 ; N tcaron ; B 37 -11 407 681 ;
+C -1 ; WX 444 ; N eogonek ; B 31 -169 412 441 ;
+C -1 ; WX 722 ; N Uogonek ; B 102 -184 765 653 ;
+C -1 ; WX 611 ; N Aacute ; B -51 0 564 876 ;
+C -1 ; WX 611 ; N Adieresis ; B -51 0 564 818 ;
+C -1 ; WX 444 ; N egrave ; B 31 -11 412 664 ;
+C -1 ; WX 389 ; N zacute ; B -2 -81 431 664 ;
+C -1 ; WX 278 ; N iogonek ; B 49 -169 264 654 ;
+C -1 ; WX 722 ; N Oacute ; B 60 -18 699 876 ;
+C -1 ; WX 500 ; N oacute ; B 27 -11 487 664 ;
+C -1 ; WX 500 ; N amacron ; B 17 -11 495 583 ;
+C -1 ; WX 389 ; N sacute ; B 16 -13 431 664 ;
+C -1 ; WX 278 ; N idieresis ; B 49 -11 352 606 ;
+C -1 ; WX 722 ; N Ocircumflex ; B 60 -18 699 873 ;
+C -1 ; WX 722 ; N Ugrave ; B 102 -18 765 876 ;
+C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ;
+C -1 ; WX 500 ; N thorn ; B -75 -205 469 683 ;
+C -1 ; WX 300 ; N twosuperior ; B 33 271 324 676 ;
+C -1 ; WX 722 ; N Odieresis ; B 60 -18 699 818 ;
+C -1 ; WX 500 ; N mu ; B -30 -209 497 428 ;
+C -1 ; WX 278 ; N igrave ; B 49 -11 284 664 ;
+C -1 ; WX 500 ; N ohungarumlaut ; B 27 -11 590 664 ;
+C -1 ; WX 611 ; N Eogonek ; B -1 -169 634 653 ;
+C -1 ; WX 500 ; N dcroat ; B 15 -13 572 683 ;
+C -1 ; WX 750 ; N threequarters ; B 23 -10 736 676 ;
+C -1 ; WX 500 ; N Scedilla ; B 17 -217 508 667 ;
+C -1 ; WX 300 ; N lcaron ; B 41 -11 407 683 ;
+C -1 ; WX 667 ; N Kcommaaccent ; B 7 -217 722 653 ;
+C -1 ; WX 556 ; N Lacute ; B -8 0 559 876 ;
+C -1 ; WX 980 ; N trademark ; B 30 247 957 653 ;
+C -1 ; WX 444 ; N edotaccent ; B 31 -11 412 606 ;
+C -1 ; WX 333 ; N Igrave ; B -8 0 384 876 ;
+C -1 ; WX 333 ; N Imacron ; B -8 0 441 795 ;
+C -1 ; WX 611 ; N Lcaron ; B -8 0 586 653 ;
+C -1 ; WX 750 ; N onehalf ; B 34 -10 749 676 ;
+C -1 ; WX 549 ; N lessequal ; B 26 0 523 658 ;
+C -1 ; WX 500 ; N ocircumflex ; B 27 -11 468 661 ;
+C -1 ; WX 500 ; N ntilde ; B 14 -9 476 624 ;
+C -1 ; WX 722 ; N Uhungarumlaut ; B 102 -18 765 876 ;
+C -1 ; WX 611 ; N Eacute ; B -1 0 634 876 ;
+C -1 ; WX 444 ; N emacron ; B 31 -11 457 583 ;
+C -1 ; WX 500 ; N gbreve ; B 8 -206 487 650 ;
+C -1 ; WX 750 ; N onequarter ; B 33 -10 736 676 ;
+C -1 ; WX 500 ; N Scaron ; B 17 -18 520 873 ;
+C -1 ; WX 500 ; N Scommaaccent ; B 17 -217 508 667 ;
+C -1 ; WX 722 ; N Ohungarumlaut ; B 60 -18 699 876 ;
+C -1 ; WX 400 ; N degree ; B 101 390 387 676 ;
+C -1 ; WX 500 ; N ograve ; B 27 -11 468 664 ;
+C -1 ; WX 667 ; N Ccaron ; B 66 -18 689 873 ;
+C -1 ; WX 500 ; N ugrave ; B 42 -11 475 664 ;
+C -1 ; WX 453 ; N radical ; B 2 -60 452 768 ;
+C -1 ; WX 722 ; N Dcaron ; B -8 0 700 873 ;
+C -1 ; WX 389 ; N rcommaaccent ; B -3 -217 412 441 ;
+C -1 ; WX 667 ; N Ntilde ; B -20 -15 727 836 ;
+C -1 ; WX 500 ; N otilde ; B 27 -11 496 624 ;
+C -1 ; WX 611 ; N Rcommaaccent ; B -13 -187 588 653 ;
+C -1 ; WX 556 ; N Lcommaaccent ; B -8 -217 559 653 ;
+C -1 ; WX 611 ; N Atilde ; B -51 0 566 836 ;
+C -1 ; WX 611 ; N Aogonek ; B -51 -169 566 668 ;
+C -1 ; WX 611 ; N Aring ; B -51 0 564 883 ;
+C -1 ; WX 722 ; N Otilde ; B 60 -18 699 836 ;
+C -1 ; WX 389 ; N zdotaccent ; B -2 -81 380 606 ;
+C -1 ; WX 611 ; N Ecaron ; B -1 0 634 873 ;
+C -1 ; WX 333 ; N Iogonek ; B -8 -169 384 653 ;
+C -1 ; WX 444 ; N kcommaaccent ; B 14 -187 461 683 ;
+C -1 ; WX 675 ; N minus ; B 86 220 590 286 ;
+C -1 ; WX 333 ; N Icircumflex ; B -8 0 425 873 ;
+C -1 ; WX 500 ; N ncaron ; B 14 -9 510 661 ;
+C -1 ; WX 278 ; N tcommaaccent ; B 2 -217 296 546 ;
+C -1 ; WX 675 ; N logicalnot ; B 86 108 590 386 ;
+C -1 ; WX 500 ; N odieresis ; B 27 -11 489 606 ;
+C -1 ; WX 500 ; N udieresis ; B 42 -11 479 606 ;
+C -1 ; WX 549 ; N notequal ; B 12 -29 537 541 ;
+C -1 ; WX 500 ; N gcommaaccent ; B 8 -206 472 706 ;
+C -1 ; WX 500 ; N eth ; B 27 -11 482 683 ;
+C -1 ; WX 389 ; N zcaron ; B -2 -81 434 661 ;
+C -1 ; WX 500 ; N ncommaaccent ; B 14 -187 474 441 ;
+C -1 ; WX 300 ; N onesuperior ; B 43 271 284 676 ;
+C -1 ; WX 278 ; N imacron ; B 46 -11 311 583 ;
+EndCharMetrics
+StartKernData
+StartKernPairs 2321
+KPX A C -30
+KPX A Cacute -30
+KPX A Ccaron -30
+KPX A Ccedilla -30
+KPX A G -35
+KPX A Gbreve -35
+KPX A Gcommaaccent -35
+KPX A O -40
+KPX A Oacute -40
+KPX A Ocircumflex -40
+KPX A Odieresis -40
+KPX A Ograve -40
+KPX A Ohungarumlaut -40
+KPX A Omacron -40
+KPX A Oslash -40
+KPX A Otilde -40
+KPX A Q -40
+KPX A T -37
+KPX A Tcaron -37
+KPX A Tcommaaccent -37
+KPX A U -50
+KPX A Uacute -50
+KPX A Ucircumflex -50
+KPX A Udieresis -50
+KPX A Ugrave -50
+KPX A Uhungarumlaut -50
+KPX A Umacron -50
+KPX A Uogonek -50
+KPX A Uring -50
+KPX A V -105
+KPX A W -95
+KPX A Y -55
+KPX A Yacute -55
+KPX A Ydieresis -55
+KPX A quoteright -37
+KPX A u -20
+KPX A uacute -20
+KPX A ucircumflex -20
+KPX A udieresis -20
+KPX A ugrave -20
+KPX A uhungarumlaut -20
+KPX A umacron -20
+KPX A uogonek -20
+KPX A uring -20
+KPX A v -55
+KPX A w -55
+KPX A y -55
+KPX A yacute -55
+KPX A ydieresis -55
+KPX Aacute C -30
+KPX Aacute Cacute -30
+KPX Aacute Ccaron -30
+KPX Aacute Ccedilla -30
+KPX Aacute G -35
+KPX Aacute Gbreve -35
+KPX Aacute Gcommaaccent -35
+KPX Aacute O -40
+KPX Aacute Oacute -40
+KPX Aacute Ocircumflex -40
+KPX Aacute Odieresis -40
+KPX Aacute Ograve -40
+KPX Aacute Ohungarumlaut -40
+KPX Aacute Omacron -40
+KPX Aacute Oslash -40
+KPX Aacute Otilde -40
+KPX Aacute Q -40
+KPX Aacute T -37
+KPX Aacute Tcaron -37
+KPX Aacute Tcommaaccent -37
+KPX Aacute U -50
+KPX Aacute Uacute -50
+KPX Aacute Ucircumflex -50
+KPX Aacute Udieresis -50
+KPX Aacute Ugrave -50
+KPX Aacute Uhungarumlaut -50
+KPX Aacute Umacron -50
+KPX Aacute Uogonek -50
+KPX Aacute Uring -50
+KPX Aacute V -105
+KPX Aacute W -95
+KPX Aacute Y -55
+KPX Aacute Yacute -55
+KPX Aacute Ydieresis -55
+KPX Aacute quoteright -37
+KPX Aacute u -20
+KPX Aacute uacute -20
+KPX Aacute ucircumflex -20
+KPX Aacute udieresis -20
+KPX Aacute ugrave -20
+KPX Aacute uhungarumlaut -20
+KPX Aacute umacron -20
+KPX Aacute uogonek -20
+KPX Aacute uring -20
+KPX Aacute v -55
+KPX Aacute w -55
+KPX Aacute y -55
+KPX Aacute yacute -55
+KPX Aacute ydieresis -55
+KPX Abreve C -30
+KPX Abreve Cacute -30
+KPX Abreve Ccaron -30
+KPX Abreve Ccedilla -30
+KPX Abreve G -35
+KPX Abreve Gbreve -35
+KPX Abreve Gcommaaccent -35
+KPX Abreve O -40
+KPX Abreve Oacute -40
+KPX Abreve Ocircumflex -40
+KPX Abreve Odieresis -40
+KPX Abreve Ograve -40
+KPX Abreve Ohungarumlaut -40
+KPX Abreve Omacron -40
+KPX Abreve Oslash -40
+KPX Abreve Otilde -40
+KPX Abreve Q -40
+KPX Abreve T -37
+KPX Abreve Tcaron -37
+KPX Abreve Tcommaaccent -37
+KPX Abreve U -50
+KPX Abreve Uacute -50
+KPX Abreve Ucircumflex -50
+KPX Abreve Udieresis -50
+KPX Abreve Ugrave -50
+KPX Abreve Uhungarumlaut -50
+KPX Abreve Umacron -50
+KPX Abreve Uogonek -50
+KPX Abreve Uring -50
+KPX Abreve V -105
+KPX Abreve W -95
+KPX Abreve Y -55
+KPX Abreve Yacute -55
+KPX Abreve Ydieresis -55
+KPX Abreve quoteright -37
+KPX Abreve u -20
+KPX Abreve uacute -20
+KPX Abreve ucircumflex -20
+KPX Abreve udieresis -20
+KPX Abreve ugrave -20
+KPX Abreve uhungarumlaut -20
+KPX Abreve umacron -20
+KPX Abreve uogonek -20
+KPX Abreve uring -20
+KPX Abreve v -55
+KPX Abreve w -55
+KPX Abreve y -55
+KPX Abreve yacute -55
+KPX Abreve ydieresis -55
+KPX Acircumflex C -30
+KPX Acircumflex Cacute -30
+KPX Acircumflex Ccaron -30
+KPX Acircumflex Ccedilla -30
+KPX Acircumflex G -35
+KPX Acircumflex Gbreve -35
+KPX Acircumflex Gcommaaccent -35
+KPX Acircumflex O -40
+KPX Acircumflex Oacute -40
+KPX Acircumflex Ocircumflex -40
+KPX Acircumflex Odieresis -40
+KPX Acircumflex Ograve -40
+KPX Acircumflex Ohungarumlaut -40
+KPX Acircumflex Omacron -40
+KPX Acircumflex Oslash -40
+KPX Acircumflex Otilde -40
+KPX Acircumflex Q -40
+KPX Acircumflex T -37
+KPX Acircumflex Tcaron -37
+KPX Acircumflex Tcommaaccent -37
+KPX Acircumflex U -50
+KPX Acircumflex Uacute -50
+KPX Acircumflex Ucircumflex -50
+KPX Acircumflex Udieresis -50
+KPX Acircumflex Ugrave -50
+KPX Acircumflex Uhungarumlaut -50
+KPX Acircumflex Umacron -50
+KPX Acircumflex Uogonek -50
+KPX Acircumflex Uring -50
+KPX Acircumflex V -105
+KPX Acircumflex W -95
+KPX Acircumflex Y -55
+KPX Acircumflex Yacute -55
+KPX Acircumflex Ydieresis -55
+KPX Acircumflex quoteright -37
+KPX Acircumflex u -20
+KPX Acircumflex uacute -20
+KPX Acircumflex ucircumflex -20
+KPX Acircumflex udieresis -20
+KPX Acircumflex ugrave -20
+KPX Acircumflex uhungarumlaut -20
+KPX Acircumflex umacron -20
+KPX Acircumflex uogonek -20
+KPX Acircumflex uring -20
+KPX Acircumflex v -55
+KPX Acircumflex w -55
+KPX Acircumflex y -55
+KPX Acircumflex yacute -55
+KPX Acircumflex ydieresis -55
+KPX Adieresis C -30
+KPX Adieresis Cacute -30
+KPX Adieresis Ccaron -30
+KPX Adieresis Ccedilla -30
+KPX Adieresis G -35
+KPX Adieresis Gbreve -35
+KPX Adieresis Gcommaaccent -35
+KPX Adieresis O -40
+KPX Adieresis Oacute -40
+KPX Adieresis Ocircumflex -40
+KPX Adieresis Odieresis -40
+KPX Adieresis Ograve -40
+KPX Adieresis Ohungarumlaut -40
+KPX Adieresis Omacron -40
+KPX Adieresis Oslash -40
+KPX Adieresis Otilde -40
+KPX Adieresis Q -40
+KPX Adieresis T -37
+KPX Adieresis Tcaron -37
+KPX Adieresis Tcommaaccent -37
+KPX Adieresis U -50
+KPX Adieresis Uacute -50
+KPX Adieresis Ucircumflex -50
+KPX Adieresis Udieresis -50
+KPX Adieresis Ugrave -50
+KPX Adieresis Uhungarumlaut -50
+KPX Adieresis Umacron -50
+KPX Adieresis Uogonek -50
+KPX Adieresis Uring -50
+KPX Adieresis V -105
+KPX Adieresis W -95
+KPX Adieresis Y -55
+KPX Adieresis Yacute -55
+KPX Adieresis Ydieresis -55
+KPX Adieresis quoteright -37
+KPX Adieresis u -20
+KPX Adieresis uacute -20
+KPX Adieresis ucircumflex -20
+KPX Adieresis udieresis -20
+KPX Adieresis ugrave -20
+KPX Adieresis uhungarumlaut -20
+KPX Adieresis umacron -20
+KPX Adieresis uogonek -20
+KPX Adieresis uring -20
+KPX Adieresis v -55
+KPX Adieresis w -55
+KPX Adieresis y -55
+KPX Adieresis yacute -55
+KPX Adieresis ydieresis -55
+KPX Agrave C -30
+KPX Agrave Cacute -30
+KPX Agrave Ccaron -30
+KPX Agrave Ccedilla -30
+KPX Agrave G -35
+KPX Agrave Gbreve -35
+KPX Agrave Gcommaaccent -35
+KPX Agrave O -40
+KPX Agrave Oacute -40
+KPX Agrave Ocircumflex -40
+KPX Agrave Odieresis -40
+KPX Agrave Ograve -40
+KPX Agrave Ohungarumlaut -40
+KPX Agrave Omacron -40
+KPX Agrave Oslash -40
+KPX Agrave Otilde -40
+KPX Agrave Q -40
+KPX Agrave T -37
+KPX Agrave Tcaron -37
+KPX Agrave Tcommaaccent -37
+KPX Agrave U -50
+KPX Agrave Uacute -50
+KPX Agrave Ucircumflex -50
+KPX Agrave Udieresis -50
+KPX Agrave Ugrave -50
+KPX Agrave Uhungarumlaut -50
+KPX Agrave Umacron -50
+KPX Agrave Uogonek -50
+KPX Agrave Uring -50
+KPX Agrave V -105
+KPX Agrave W -95
+KPX Agrave Y -55
+KPX Agrave Yacute -55
+KPX Agrave Ydieresis -55
+KPX Agrave quoteright -37
+KPX Agrave u -20
+KPX Agrave uacute -20
+KPX Agrave ucircumflex -20
+KPX Agrave udieresis -20
+KPX Agrave ugrave -20
+KPX Agrave uhungarumlaut -20
+KPX Agrave umacron -20
+KPX Agrave uogonek -20
+KPX Agrave uring -20
+KPX Agrave v -55
+KPX Agrave w -55
+KPX Agrave y -55
+KPX Agrave yacute -55
+KPX Agrave ydieresis -55
+KPX Amacron C -30
+KPX Amacron Cacute -30
+KPX Amacron Ccaron -30
+KPX Amacron Ccedilla -30
+KPX Amacron G -35
+KPX Amacron Gbreve -35
+KPX Amacron Gcommaaccent -35
+KPX Amacron O -40
+KPX Amacron Oacute -40
+KPX Amacron Ocircumflex -40
+KPX Amacron Odieresis -40
+KPX Amacron Ograve -40
+KPX Amacron Ohungarumlaut -40
+KPX Amacron Omacron -40
+KPX Amacron Oslash -40
+KPX Amacron Otilde -40
+KPX Amacron Q -40
+KPX Amacron T -37
+KPX Amacron Tcaron -37
+KPX Amacron Tcommaaccent -37
+KPX Amacron U -50
+KPX Amacron Uacute -50
+KPX Amacron Ucircumflex -50
+KPX Amacron Udieresis -50
+KPX Amacron Ugrave -50
+KPX Amacron Uhungarumlaut -50
+KPX Amacron Umacron -50
+KPX Amacron Uogonek -50
+KPX Amacron Uring -50
+KPX Amacron V -105
+KPX Amacron W -95
+KPX Amacron Y -55
+KPX Amacron Yacute -55
+KPX Amacron Ydieresis -55
+KPX Amacron quoteright -37
+KPX Amacron u -20
+KPX Amacron uacute -20
+KPX Amacron ucircumflex -20
+KPX Amacron udieresis -20
+KPX Amacron ugrave -20
+KPX Amacron uhungarumlaut -20
+KPX Amacron umacron -20
+KPX Amacron uogonek -20
+KPX Amacron uring -20
+KPX Amacron v -55
+KPX Amacron w -55
+KPX Amacron y -55
+KPX Amacron yacute -55
+KPX Amacron ydieresis -55
+KPX Aogonek C -30
+KPX Aogonek Cacute -30
+KPX Aogonek Ccaron -30
+KPX Aogonek Ccedilla -30
+KPX Aogonek G -35
+KPX Aogonek Gbreve -35
+KPX Aogonek Gcommaaccent -35
+KPX Aogonek O -40
+KPX Aogonek Oacute -40
+KPX Aogonek Ocircumflex -40
+KPX Aogonek Odieresis -40
+KPX Aogonek Ograve -40
+KPX Aogonek Ohungarumlaut -40
+KPX Aogonek Omacron -40
+KPX Aogonek Oslash -40
+KPX Aogonek Otilde -40
+KPX Aogonek Q -40
+KPX Aogonek T -37
+KPX Aogonek Tcaron -37
+KPX Aogonek Tcommaaccent -37
+KPX Aogonek U -50
+KPX Aogonek Uacute -50
+KPX Aogonek Ucircumflex -50
+KPX Aogonek Udieresis -50
+KPX Aogonek Ugrave -50
+KPX Aogonek Uhungarumlaut -50
+KPX Aogonek Umacron -50
+KPX Aogonek Uogonek -50
+KPX Aogonek Uring -50
+KPX Aogonek V -105
+KPX Aogonek W -95
+KPX Aogonek Y -55
+KPX Aogonek Yacute -55
+KPX Aogonek Ydieresis -55
+KPX Aogonek quoteright -37
+KPX Aogonek u -20
+KPX Aogonek uacute -20
+KPX Aogonek ucircumflex -20
+KPX Aogonek udieresis -20
+KPX Aogonek ugrave -20
+KPX Aogonek uhungarumlaut -20
+KPX Aogonek umacron -20
+KPX Aogonek uogonek -20
+KPX Aogonek uring -20
+KPX Aogonek v -55
+KPX Aogonek w -55
+KPX Aogonek y -55
+KPX Aogonek yacute -55
+KPX Aogonek ydieresis -55
+KPX Aring C -30
+KPX Aring Cacute -30
+KPX Aring Ccaron -30
+KPX Aring Ccedilla -30
+KPX Aring G -35
+KPX Aring Gbreve -35
+KPX Aring Gcommaaccent -35
+KPX Aring O -40
+KPX Aring Oacute -40
+KPX Aring Ocircumflex -40
+KPX Aring Odieresis -40
+KPX Aring Ograve -40
+KPX Aring Ohungarumlaut -40
+KPX Aring Omacron -40
+KPX Aring Oslash -40
+KPX Aring Otilde -40
+KPX Aring Q -40
+KPX Aring T -37
+KPX Aring Tcaron -37
+KPX Aring Tcommaaccent -37
+KPX Aring U -50
+KPX Aring Uacute -50
+KPX Aring Ucircumflex -50
+KPX Aring Udieresis -50
+KPX Aring Ugrave -50
+KPX Aring Uhungarumlaut -50
+KPX Aring Umacron -50
+KPX Aring Uogonek -50
+KPX Aring Uring -50
+KPX Aring V -105
+KPX Aring W -95
+KPX Aring Y -55
+KPX Aring Yacute -55
+KPX Aring Ydieresis -55
+KPX Aring quoteright -37
+KPX Aring u -20
+KPX Aring uacute -20
+KPX Aring ucircumflex -20
+KPX Aring udieresis -20
+KPX Aring ugrave -20
+KPX Aring uhungarumlaut -20
+KPX Aring umacron -20
+KPX Aring uogonek -20
+KPX Aring uring -20
+KPX Aring v -55
+KPX Aring w -55
+KPX Aring y -55
+KPX Aring yacute -55
+KPX Aring ydieresis -55
+KPX Atilde C -30
+KPX Atilde Cacute -30
+KPX Atilde Ccaron -30
+KPX Atilde Ccedilla -30
+KPX Atilde G -35
+KPX Atilde Gbreve -35
+KPX Atilde Gcommaaccent -35
+KPX Atilde O -40
+KPX Atilde Oacute -40
+KPX Atilde Ocircumflex -40
+KPX Atilde Odieresis -40
+KPX Atilde Ograve -40
+KPX Atilde Ohungarumlaut -40
+KPX Atilde Omacron -40
+KPX Atilde Oslash -40
+KPX Atilde Otilde -40
+KPX Atilde Q -40
+KPX Atilde T -37
+KPX Atilde Tcaron -37
+KPX Atilde Tcommaaccent -37
+KPX Atilde U -50
+KPX Atilde Uacute -50
+KPX Atilde Ucircumflex -50
+KPX Atilde Udieresis -50
+KPX Atilde Ugrave -50
+KPX Atilde Uhungarumlaut -50
+KPX Atilde Umacron -50
+KPX Atilde Uogonek -50
+KPX Atilde Uring -50
+KPX Atilde V -105
+KPX Atilde W -95
+KPX Atilde Y -55
+KPX Atilde Yacute -55
+KPX Atilde Ydieresis -55
+KPX Atilde quoteright -37
+KPX Atilde u -20
+KPX Atilde uacute -20
+KPX Atilde ucircumflex -20
+KPX Atilde udieresis -20
+KPX Atilde ugrave -20
+KPX Atilde uhungarumlaut -20
+KPX Atilde umacron -20
+KPX Atilde uogonek -20
+KPX Atilde uring -20
+KPX Atilde v -55
+KPX Atilde w -55
+KPX Atilde y -55
+KPX Atilde yacute -55
+KPX Atilde ydieresis -55
+KPX B A -25
+KPX B Aacute -25
+KPX B Abreve -25
+KPX B Acircumflex -25
+KPX B Adieresis -25
+KPX B Agrave -25
+KPX B Amacron -25
+KPX B Aogonek -25
+KPX B Aring -25
+KPX B Atilde -25
+KPX B U -10
+KPX B Uacute -10
+KPX B Ucircumflex -10
+KPX B Udieresis -10
+KPX B Ugrave -10
+KPX B Uhungarumlaut -10
+KPX B Umacron -10
+KPX B Uogonek -10
+KPX B Uring -10
+KPX D A -35
+KPX D Aacute -35
+KPX D Abreve -35
+KPX D Acircumflex -35
+KPX D Adieresis -35
+KPX D Agrave -35
+KPX D Amacron -35
+KPX D Aogonek -35
+KPX D Aring -35
+KPX D Atilde -35
+KPX D V -40
+KPX D W -40
+KPX D Y -40
+KPX D Yacute -40
+KPX D Ydieresis -40
+KPX Dcaron A -35
+KPX Dcaron Aacute -35
+KPX Dcaron Abreve -35
+KPX Dcaron Acircumflex -35
+KPX Dcaron Adieresis -35
+KPX Dcaron Agrave -35
+KPX Dcaron Amacron -35
+KPX Dcaron Aogonek -35
+KPX Dcaron Aring -35
+KPX Dcaron Atilde -35
+KPX Dcaron V -40
+KPX Dcaron W -40
+KPX Dcaron Y -40
+KPX Dcaron Yacute -40
+KPX Dcaron Ydieresis -40
+KPX Dcroat A -35
+KPX Dcroat Aacute -35
+KPX Dcroat Abreve -35
+KPX Dcroat Acircumflex -35
+KPX Dcroat Adieresis -35
+KPX Dcroat Agrave -35
+KPX Dcroat Amacron -35
+KPX Dcroat Aogonek -35
+KPX Dcroat Aring -35
+KPX Dcroat Atilde -35
+KPX Dcroat V -40
+KPX Dcroat W -40
+KPX Dcroat Y -40
+KPX Dcroat Yacute -40
+KPX Dcroat Ydieresis -40
+KPX F A -115
+KPX F Aacute -115
+KPX F Abreve -115
+KPX F Acircumflex -115
+KPX F Adieresis -115
+KPX F Agrave -115
+KPX F Amacron -115
+KPX F Aogonek -115
+KPX F Aring -115
+KPX F Atilde -115
+KPX F a -75
+KPX F aacute -75
+KPX F abreve -75
+KPX F acircumflex -75
+KPX F adieresis -75
+KPX F agrave -75
+KPX F amacron -75
+KPX F aogonek -75
+KPX F aring -75
+KPX F atilde -75
+KPX F comma -135
+KPX F e -75
+KPX F eacute -75
+KPX F ecaron -75
+KPX F ecircumflex -75
+KPX F edieresis -75
+KPX F edotaccent -75
+KPX F egrave -75
+KPX F emacron -75
+KPX F eogonek -75
+KPX F i -45
+KPX F iacute -45
+KPX F icircumflex -45
+KPX F idieresis -45
+KPX F igrave -45
+KPX F imacron -45
+KPX F iogonek -45
+KPX F o -105
+KPX F oacute -105
+KPX F ocircumflex -105
+KPX F odieresis -105
+KPX F ograve -105
+KPX F ohungarumlaut -105
+KPX F omacron -105
+KPX F oslash -105
+KPX F otilde -105
+KPX F period -135
+KPX F r -55
+KPX F racute -55
+KPX F rcaron -55
+KPX F rcommaaccent -55
+KPX J A -40
+KPX J Aacute -40
+KPX J Abreve -40
+KPX J Acircumflex -40
+KPX J Adieresis -40
+KPX J Agrave -40
+KPX J Amacron -40
+KPX J Aogonek -40
+KPX J Aring -40
+KPX J Atilde -40
+KPX J a -35
+KPX J aacute -35
+KPX J abreve -35
+KPX J acircumflex -35
+KPX J adieresis -35
+KPX J agrave -35
+KPX J amacron -35
+KPX J aogonek -35
+KPX J aring -35
+KPX J atilde -35
+KPX J comma -25
+KPX J e -25
+KPX J eacute -25
+KPX J ecaron -25
+KPX J ecircumflex -25
+KPX J edieresis -25
+KPX J edotaccent -25
+KPX J egrave -25
+KPX J emacron -25
+KPX J eogonek -25
+KPX J o -25
+KPX J oacute -25
+KPX J ocircumflex -25
+KPX J odieresis -25
+KPX J ograve -25
+KPX J ohungarumlaut -25
+KPX J omacron -25
+KPX J oslash -25
+KPX J otilde -25
+KPX J period -25
+KPX J u -35
+KPX J uacute -35
+KPX J ucircumflex -35
+KPX J udieresis -35
+KPX J ugrave -35
+KPX J uhungarumlaut -35
+KPX J umacron -35
+KPX J uogonek -35
+KPX J uring -35
+KPX K O -50
+KPX K Oacute -50
+KPX K Ocircumflex -50
+KPX K Odieresis -50
+KPX K Ograve -50
+KPX K Ohungarumlaut -50
+KPX K Omacron -50
+KPX K Oslash -50
+KPX K Otilde -50
+KPX K e -35
+KPX K eacute -35
+KPX K ecaron -35
+KPX K ecircumflex -35
+KPX K edieresis -35
+KPX K edotaccent -35
+KPX K egrave -35
+KPX K emacron -35
+KPX K eogonek -35
+KPX K o -40
+KPX K oacute -40
+KPX K ocircumflex -40
+KPX K odieresis -40
+KPX K ograve -40
+KPX K ohungarumlaut -40
+KPX K omacron -40
+KPX K oslash -40
+KPX K otilde -40
+KPX K u -40
+KPX K uacute -40
+KPX K ucircumflex -40
+KPX K udieresis -40
+KPX K ugrave -40
+KPX K uhungarumlaut -40
+KPX K umacron -40
+KPX K uogonek -40
+KPX K uring -40
+KPX K y -40
+KPX K yacute -40
+KPX K ydieresis -40
+KPX Kcommaaccent O -50
+KPX Kcommaaccent Oacute -50
+KPX Kcommaaccent Ocircumflex -50
+KPX Kcommaaccent Odieresis -50
+KPX Kcommaaccent Ograve -50
+KPX Kcommaaccent Ohungarumlaut -50
+KPX Kcommaaccent Omacron -50
+KPX Kcommaaccent Oslash -50
+KPX Kcommaaccent Otilde -50
+KPX Kcommaaccent e -35
+KPX Kcommaaccent eacute -35
+KPX Kcommaaccent ecaron -35
+KPX Kcommaaccent ecircumflex -35
+KPX Kcommaaccent edieresis -35
+KPX Kcommaaccent edotaccent -35
+KPX Kcommaaccent egrave -35
+KPX Kcommaaccent emacron -35
+KPX Kcommaaccent eogonek -35
+KPX Kcommaaccent o -40
+KPX Kcommaaccent oacute -40
+KPX Kcommaaccent ocircumflex -40
+KPX Kcommaaccent odieresis -40
+KPX Kcommaaccent ograve -40
+KPX Kcommaaccent ohungarumlaut -40
+KPX Kcommaaccent omacron -40
+KPX Kcommaaccent oslash -40
+KPX Kcommaaccent otilde -40
+KPX Kcommaaccent u -40
+KPX Kcommaaccent uacute -40
+KPX Kcommaaccent ucircumflex -40
+KPX Kcommaaccent udieresis -40
+KPX Kcommaaccent ugrave -40
+KPX Kcommaaccent uhungarumlaut -40
+KPX Kcommaaccent umacron -40
+KPX Kcommaaccent uogonek -40
+KPX Kcommaaccent uring -40
+KPX Kcommaaccent y -40
+KPX Kcommaaccent yacute -40
+KPX Kcommaaccent ydieresis -40
+KPX L T -20
+KPX L Tcaron -20
+KPX L Tcommaaccent -20
+KPX L V -55
+KPX L W -55
+KPX L Y -20
+KPX L Yacute -20
+KPX L Ydieresis -20
+KPX L quoteright -37
+KPX L y -30
+KPX L yacute -30
+KPX L ydieresis -30
+KPX Lacute T -20
+KPX Lacute Tcaron -20
+KPX Lacute Tcommaaccent -20
+KPX Lacute V -55
+KPX Lacute W -55
+KPX Lacute Y -20
+KPX Lacute Yacute -20
+KPX Lacute Ydieresis -20
+KPX Lacute quoteright -37
+KPX Lacute y -30
+KPX Lacute yacute -30
+KPX Lacute ydieresis -30
+KPX Lcommaaccent T -20
+KPX Lcommaaccent Tcaron -20
+KPX Lcommaaccent Tcommaaccent -20
+KPX Lcommaaccent V -55
+KPX Lcommaaccent W -55
+KPX Lcommaaccent Y -20
+KPX Lcommaaccent Yacute -20
+KPX Lcommaaccent Ydieresis -20
+KPX Lcommaaccent quoteright -37
+KPX Lcommaaccent y -30
+KPX Lcommaaccent yacute -30
+KPX Lcommaaccent ydieresis -30
+KPX Lslash T -20
+KPX Lslash Tcaron -20
+KPX Lslash Tcommaaccent -20
+KPX Lslash V -55
+KPX Lslash W -55
+KPX Lslash Y -20
+KPX Lslash Yacute -20
+KPX Lslash Ydieresis -20
+KPX Lslash quoteright -37
+KPX Lslash y -30
+KPX Lslash yacute -30
+KPX Lslash ydieresis -30
+KPX N A -27
+KPX N Aacute -27
+KPX N Abreve -27
+KPX N Acircumflex -27
+KPX N Adieresis -27
+KPX N Agrave -27
+KPX N Amacron -27
+KPX N Aogonek -27
+KPX N Aring -27
+KPX N Atilde -27
+KPX Nacute A -27
+KPX Nacute Aacute -27
+KPX Nacute Abreve -27
+KPX Nacute Acircumflex -27
+KPX Nacute Adieresis -27
+KPX Nacute Agrave -27
+KPX Nacute Amacron -27
+KPX Nacute Aogonek -27
+KPX Nacute Aring -27
+KPX Nacute Atilde -27
+KPX Ncaron A -27
+KPX Ncaron Aacute -27
+KPX Ncaron Abreve -27
+KPX Ncaron Acircumflex -27
+KPX Ncaron Adieresis -27
+KPX Ncaron Agrave -27
+KPX Ncaron Amacron -27
+KPX Ncaron Aogonek -27
+KPX Ncaron Aring -27
+KPX Ncaron Atilde -27
+KPX Ncommaaccent A -27
+KPX Ncommaaccent Aacute -27
+KPX Ncommaaccent Abreve -27
+KPX Ncommaaccent Acircumflex -27
+KPX Ncommaaccent Adieresis -27
+KPX Ncommaaccent Agrave -27
+KPX Ncommaaccent Amacron -27
+KPX Ncommaaccent Aogonek -27
+KPX Ncommaaccent Aring -27
+KPX Ncommaaccent Atilde -27
+KPX Ntilde A -27
+KPX Ntilde Aacute -27
+KPX Ntilde Abreve -27
+KPX Ntilde Acircumflex -27
+KPX Ntilde Adieresis -27
+KPX Ntilde Agrave -27
+KPX Ntilde Amacron -27
+KPX Ntilde Aogonek -27
+KPX Ntilde Aring -27
+KPX Ntilde Atilde -27
+KPX O A -55
+KPX O Aacute -55
+KPX O Abreve -55
+KPX O Acircumflex -55
+KPX O Adieresis -55
+KPX O Agrave -55
+KPX O Amacron -55
+KPX O Aogonek -55
+KPX O Aring -55
+KPX O Atilde -55
+KPX O T -40
+KPX O Tcaron -40
+KPX O Tcommaaccent -40
+KPX O V -50
+KPX O W -50
+KPX O X -40
+KPX O Y -50
+KPX O Yacute -50
+KPX O Ydieresis -50
+KPX Oacute A -55
+KPX Oacute Aacute -55
+KPX Oacute Abreve -55
+KPX Oacute Acircumflex -55
+KPX Oacute Adieresis -55
+KPX Oacute Agrave -55
+KPX Oacute Amacron -55
+KPX Oacute Aogonek -55
+KPX Oacute Aring -55
+KPX Oacute Atilde -55
+KPX Oacute T -40
+KPX Oacute Tcaron -40
+KPX Oacute Tcommaaccent -40
+KPX Oacute V -50
+KPX Oacute W -50
+KPX Oacute X -40
+KPX Oacute Y -50
+KPX Oacute Yacute -50
+KPX Oacute Ydieresis -50
+KPX Ocircumflex A -55
+KPX Ocircumflex Aacute -55
+KPX Ocircumflex Abreve -55
+KPX Ocircumflex Acircumflex -55
+KPX Ocircumflex Adieresis -55
+KPX Ocircumflex Agrave -55
+KPX Ocircumflex Amacron -55
+KPX Ocircumflex Aogonek -55
+KPX Ocircumflex Aring -55
+KPX Ocircumflex Atilde -55
+KPX Ocircumflex T -40
+KPX Ocircumflex Tcaron -40
+KPX Ocircumflex Tcommaaccent -40
+KPX Ocircumflex V -50
+KPX Ocircumflex W -50
+KPX Ocircumflex X -40
+KPX Ocircumflex Y -50
+KPX Ocircumflex Yacute -50
+KPX Ocircumflex Ydieresis -50
+KPX Odieresis A -55
+KPX Odieresis Aacute -55
+KPX Odieresis Abreve -55
+KPX Odieresis Acircumflex -55
+KPX Odieresis Adieresis -55
+KPX Odieresis Agrave -55
+KPX Odieresis Amacron -55
+KPX Odieresis Aogonek -55
+KPX Odieresis Aring -55
+KPX Odieresis Atilde -55
+KPX Odieresis T -40
+KPX Odieresis Tcaron -40
+KPX Odieresis Tcommaaccent -40
+KPX Odieresis V -50
+KPX Odieresis W -50
+KPX Odieresis X -40
+KPX Odieresis Y -50
+KPX Odieresis Yacute -50
+KPX Odieresis Ydieresis -50
+KPX Ograve A -55
+KPX Ograve Aacute -55
+KPX Ograve Abreve -55
+KPX Ograve Acircumflex -55
+KPX Ograve Adieresis -55
+KPX Ograve Agrave -55
+KPX Ograve Amacron -55
+KPX Ograve Aogonek -55
+KPX Ograve Aring -55
+KPX Ograve Atilde -55
+KPX Ograve T -40
+KPX Ograve Tcaron -40
+KPX Ograve Tcommaaccent -40
+KPX Ograve V -50
+KPX Ograve W -50
+KPX Ograve X -40
+KPX Ograve Y -50
+KPX Ograve Yacute -50
+KPX Ograve Ydieresis -50
+KPX Ohungarumlaut A -55
+KPX Ohungarumlaut Aacute -55
+KPX Ohungarumlaut Abreve -55
+KPX Ohungarumlaut Acircumflex -55
+KPX Ohungarumlaut Adieresis -55
+KPX Ohungarumlaut Agrave -55
+KPX Ohungarumlaut Amacron -55
+KPX Ohungarumlaut Aogonek -55
+KPX Ohungarumlaut Aring -55
+KPX Ohungarumlaut Atilde -55
+KPX Ohungarumlaut T -40
+KPX Ohungarumlaut Tcaron -40
+KPX Ohungarumlaut Tcommaaccent -40
+KPX Ohungarumlaut V -50
+KPX Ohungarumlaut W -50
+KPX Ohungarumlaut X -40
+KPX Ohungarumlaut Y -50
+KPX Ohungarumlaut Yacute -50
+KPX Ohungarumlaut Ydieresis -50
+KPX Omacron A -55
+KPX Omacron Aacute -55
+KPX Omacron Abreve -55
+KPX Omacron Acircumflex -55
+KPX Omacron Adieresis -55
+KPX Omacron Agrave -55
+KPX Omacron Amacron -55
+KPX Omacron Aogonek -55
+KPX Omacron Aring -55
+KPX Omacron Atilde -55
+KPX Omacron T -40
+KPX Omacron Tcaron -40
+KPX Omacron Tcommaaccent -40
+KPX Omacron V -50
+KPX Omacron W -50
+KPX Omacron X -40
+KPX Omacron Y -50
+KPX Omacron Yacute -50
+KPX Omacron Ydieresis -50
+KPX Oslash A -55
+KPX Oslash Aacute -55
+KPX Oslash Abreve -55
+KPX Oslash Acircumflex -55
+KPX Oslash Adieresis -55
+KPX Oslash Agrave -55
+KPX Oslash Amacron -55
+KPX Oslash Aogonek -55
+KPX Oslash Aring -55
+KPX Oslash Atilde -55
+KPX Oslash T -40
+KPX Oslash Tcaron -40
+KPX Oslash Tcommaaccent -40
+KPX Oslash V -50
+KPX Oslash W -50
+KPX Oslash X -40
+KPX Oslash Y -50
+KPX Oslash Yacute -50
+KPX Oslash Ydieresis -50
+KPX Otilde A -55
+KPX Otilde Aacute -55
+KPX Otilde Abreve -55
+KPX Otilde Acircumflex -55
+KPX Otilde Adieresis -55
+KPX Otilde Agrave -55
+KPX Otilde Amacron -55
+KPX Otilde Aogonek -55
+KPX Otilde Aring -55
+KPX Otilde Atilde -55
+KPX Otilde T -40
+KPX Otilde Tcaron -40
+KPX Otilde Tcommaaccent -40
+KPX Otilde V -50
+KPX Otilde W -50
+KPX Otilde X -40
+KPX Otilde Y -50
+KPX Otilde Yacute -50
+KPX Otilde Ydieresis -50
+KPX P A -90
+KPX P Aacute -90
+KPX P Abreve -90
+KPX P Acircumflex -90
+KPX P Adieresis -90
+KPX P Agrave -90
+KPX P Amacron -90
+KPX P Aogonek -90
+KPX P Aring -90
+KPX P Atilde -90
+KPX P a -80
+KPX P aacute -80
+KPX P abreve -80
+KPX P acircumflex -80
+KPX P adieresis -80
+KPX P agrave -80
+KPX P amacron -80
+KPX P aogonek -80
+KPX P aring -80
+KPX P atilde -80
+KPX P comma -135
+KPX P e -80
+KPX P eacute -80
+KPX P ecaron -80
+KPX P ecircumflex -80
+KPX P edieresis -80
+KPX P edotaccent -80
+KPX P egrave -80
+KPX P emacron -80
+KPX P eogonek -80
+KPX P o -80
+KPX P oacute -80
+KPX P ocircumflex -80
+KPX P odieresis -80
+KPX P ograve -80
+KPX P ohungarumlaut -80
+KPX P omacron -80
+KPX P oslash -80
+KPX P otilde -80
+KPX P period -135
+KPX Q U -10
+KPX Q Uacute -10
+KPX Q Ucircumflex -10
+KPX Q Udieresis -10
+KPX Q Ugrave -10
+KPX Q Uhungarumlaut -10
+KPX Q Umacron -10
+KPX Q Uogonek -10
+KPX Q Uring -10
+KPX R O -40
+KPX R Oacute -40
+KPX R Ocircumflex -40
+KPX R Odieresis -40
+KPX R Ograve -40
+KPX R Ohungarumlaut -40
+KPX R Omacron -40
+KPX R Oslash -40
+KPX R Otilde -40
+KPX R U -40
+KPX R Uacute -40
+KPX R Ucircumflex -40
+KPX R Udieresis -40
+KPX R Ugrave -40
+KPX R Uhungarumlaut -40
+KPX R Umacron -40
+KPX R Uogonek -40
+KPX R Uring -40
+KPX R V -18
+KPX R W -18
+KPX R Y -18
+KPX R Yacute -18
+KPX R Ydieresis -18
+KPX Racute O -40
+KPX Racute Oacute -40
+KPX Racute Ocircumflex -40
+KPX Racute Odieresis -40
+KPX Racute Ograve -40
+KPX Racute Ohungarumlaut -40
+KPX Racute Omacron -40
+KPX Racute Oslash -40
+KPX Racute Otilde -40
+KPX Racute U -40
+KPX Racute Uacute -40
+KPX Racute Ucircumflex -40
+KPX Racute Udieresis -40
+KPX Racute Ugrave -40
+KPX Racute Uhungarumlaut -40
+KPX Racute Umacron -40
+KPX Racute Uogonek -40
+KPX Racute Uring -40
+KPX Racute V -18
+KPX Racute W -18
+KPX Racute Y -18
+KPX Racute Yacute -18
+KPX Racute Ydieresis -18
+KPX Rcaron O -40
+KPX Rcaron Oacute -40
+KPX Rcaron Ocircumflex -40
+KPX Rcaron Odieresis -40
+KPX Rcaron Ograve -40
+KPX Rcaron Ohungarumlaut -40
+KPX Rcaron Omacron -40
+KPX Rcaron Oslash -40
+KPX Rcaron Otilde -40
+KPX Rcaron U -40
+KPX Rcaron Uacute -40
+KPX Rcaron Ucircumflex -40
+KPX Rcaron Udieresis -40
+KPX Rcaron Ugrave -40
+KPX Rcaron Uhungarumlaut -40
+KPX Rcaron Umacron -40
+KPX Rcaron Uogonek -40
+KPX Rcaron Uring -40
+KPX Rcaron V -18
+KPX Rcaron W -18
+KPX Rcaron Y -18
+KPX Rcaron Yacute -18
+KPX Rcaron Ydieresis -18
+KPX Rcommaaccent O -40
+KPX Rcommaaccent Oacute -40
+KPX Rcommaaccent Ocircumflex -40
+KPX Rcommaaccent Odieresis -40
+KPX Rcommaaccent Ograve -40
+KPX Rcommaaccent Ohungarumlaut -40
+KPX Rcommaaccent Omacron -40
+KPX Rcommaaccent Oslash -40
+KPX Rcommaaccent Otilde -40
+KPX Rcommaaccent U -40
+KPX Rcommaaccent Uacute -40
+KPX Rcommaaccent Ucircumflex -40
+KPX Rcommaaccent Udieresis -40
+KPX Rcommaaccent Ugrave -40
+KPX Rcommaaccent Uhungarumlaut -40
+KPX Rcommaaccent Umacron -40
+KPX Rcommaaccent Uogonek -40
+KPX Rcommaaccent Uring -40
+KPX Rcommaaccent V -18
+KPX Rcommaaccent W -18
+KPX Rcommaaccent Y -18
+KPX Rcommaaccent Yacute -18
+KPX Rcommaaccent Ydieresis -18
+KPX T A -50
+KPX T Aacute -50
+KPX T Abreve -50
+KPX T Acircumflex -50
+KPX T Adieresis -50
+KPX T Agrave -50
+KPX T Amacron -50
+KPX T Aogonek -50
+KPX T Aring -50
+KPX T Atilde -50
+KPX T O -18
+KPX T Oacute -18
+KPX T Ocircumflex -18
+KPX T Odieresis -18
+KPX T Ograve -18
+KPX T Ohungarumlaut -18
+KPX T Omacron -18
+KPX T Oslash -18
+KPX T Otilde -18
+KPX T a -92
+KPX T aacute -92
+KPX T abreve -92
+KPX T acircumflex -92
+KPX T adieresis -92
+KPX T agrave -92
+KPX T amacron -92
+KPX T aogonek -92
+KPX T aring -92
+KPX T atilde -92
+KPX T colon -55
+KPX T comma -74
+KPX T e -92
+KPX T eacute -92
+KPX T ecaron -92
+KPX T ecircumflex -52
+KPX T edieresis -52
+KPX T edotaccent -92
+KPX T egrave -52
+KPX T emacron -52
+KPX T eogonek -92
+KPX T hyphen -74
+KPX T i -55
+KPX T iacute -55
+KPX T iogonek -55
+KPX T o -92
+KPX T oacute -92
+KPX T ocircumflex -92
+KPX T odieresis -92
+KPX T ograve -92
+KPX T ohungarumlaut -92
+KPX T omacron -92
+KPX T oslash -92
+KPX T otilde -92
+KPX T period -74
+KPX T r -55
+KPX T racute -55
+KPX T rcaron -55
+KPX T rcommaaccent -55
+KPX T semicolon -65
+KPX T u -55
+KPX T uacute -55
+KPX T ucircumflex -55
+KPX T udieresis -55
+KPX T ugrave -55
+KPX T uhungarumlaut -55
+KPX T umacron -55
+KPX T uogonek -55
+KPX T uring -55
+KPX T w -74
+KPX T y -74
+KPX T yacute -74
+KPX T ydieresis -34
+KPX Tcaron A -50
+KPX Tcaron Aacute -50
+KPX Tcaron Abreve -50
+KPX Tcaron Acircumflex -50
+KPX Tcaron Adieresis -50
+KPX Tcaron Agrave -50
+KPX Tcaron Amacron -50
+KPX Tcaron Aogonek -50
+KPX Tcaron Aring -50
+KPX Tcaron Atilde -50
+KPX Tcaron O -18
+KPX Tcaron Oacute -18
+KPX Tcaron Ocircumflex -18
+KPX Tcaron Odieresis -18
+KPX Tcaron Ograve -18
+KPX Tcaron Ohungarumlaut -18
+KPX Tcaron Omacron -18
+KPX Tcaron Oslash -18
+KPX Tcaron Otilde -18
+KPX Tcaron a -92
+KPX Tcaron aacute -92
+KPX Tcaron abreve -92
+KPX Tcaron acircumflex -92
+KPX Tcaron adieresis -92
+KPX Tcaron agrave -92
+KPX Tcaron amacron -92
+KPX Tcaron aogonek -92
+KPX Tcaron aring -92
+KPX Tcaron atilde -92
+KPX Tcaron colon -55
+KPX Tcaron comma -74
+KPX Tcaron e -92
+KPX Tcaron eacute -92
+KPX Tcaron ecaron -92
+KPX Tcaron ecircumflex -52
+KPX Tcaron edieresis -52
+KPX Tcaron edotaccent -92
+KPX Tcaron egrave -52
+KPX Tcaron emacron -52
+KPX Tcaron eogonek -92
+KPX Tcaron hyphen -74
+KPX Tcaron i -55
+KPX Tcaron iacute -55
+KPX Tcaron iogonek -55
+KPX Tcaron o -92
+KPX Tcaron oacute -92
+KPX Tcaron ocircumflex -92
+KPX Tcaron odieresis -92
+KPX Tcaron ograve -92
+KPX Tcaron ohungarumlaut -92
+KPX Tcaron omacron -92
+KPX Tcaron oslash -92
+KPX Tcaron otilde -92
+KPX Tcaron period -74
+KPX Tcaron r -55
+KPX Tcaron racute -55
+KPX Tcaron rcaron -55
+KPX Tcaron rcommaaccent -55
+KPX Tcaron semicolon -65
+KPX Tcaron u -55
+KPX Tcaron uacute -55
+KPX Tcaron ucircumflex -55
+KPX Tcaron udieresis -55
+KPX Tcaron ugrave -55
+KPX Tcaron uhungarumlaut -55
+KPX Tcaron umacron -55
+KPX Tcaron uogonek -55
+KPX Tcaron uring -55
+KPX Tcaron w -74
+KPX Tcaron y -74
+KPX Tcaron yacute -74
+KPX Tcaron ydieresis -34
+KPX Tcommaaccent A -50
+KPX Tcommaaccent Aacute -50
+KPX Tcommaaccent Abreve -50
+KPX Tcommaaccent Acircumflex -50
+KPX Tcommaaccent Adieresis -50
+KPX Tcommaaccent Agrave -50
+KPX Tcommaaccent Amacron -50
+KPX Tcommaaccent Aogonek -50
+KPX Tcommaaccent Aring -50
+KPX Tcommaaccent Atilde -50
+KPX Tcommaaccent O -18
+KPX Tcommaaccent Oacute -18
+KPX Tcommaaccent Ocircumflex -18
+KPX Tcommaaccent Odieresis -18
+KPX Tcommaaccent Ograve -18
+KPX Tcommaaccent Ohungarumlaut -18
+KPX Tcommaaccent Omacron -18
+KPX Tcommaaccent Oslash -18
+KPX Tcommaaccent Otilde -18
+KPX Tcommaaccent a -92
+KPX Tcommaaccent aacute -92
+KPX Tcommaaccent abreve -92
+KPX Tcommaaccent acircumflex -92
+KPX Tcommaaccent adieresis -92
+KPX Tcommaaccent agrave -92
+KPX Tcommaaccent amacron -92
+KPX Tcommaaccent aogonek -92
+KPX Tcommaaccent aring -92
+KPX Tcommaaccent atilde -92
+KPX Tcommaaccent colon -55
+KPX Tcommaaccent comma -74
+KPX Tcommaaccent e -92
+KPX Tcommaaccent eacute -92
+KPX Tcommaaccent ecaron -92
+KPX Tcommaaccent ecircumflex -52
+KPX Tcommaaccent edieresis -52
+KPX Tcommaaccent edotaccent -92
+KPX Tcommaaccent egrave -52
+KPX Tcommaaccent emacron -52
+KPX Tcommaaccent eogonek -92
+KPX Tcommaaccent hyphen -74
+KPX Tcommaaccent i -55
+KPX Tcommaaccent iacute -55
+KPX Tcommaaccent iogonek -55
+KPX Tcommaaccent o -92
+KPX Tcommaaccent oacute -92
+KPX Tcommaaccent ocircumflex -92
+KPX Tcommaaccent odieresis -92
+KPX Tcommaaccent ograve -92
+KPX Tcommaaccent ohungarumlaut -92
+KPX Tcommaaccent omacron -92
+KPX Tcommaaccent oslash -92
+KPX Tcommaaccent otilde -92
+KPX Tcommaaccent period -74
+KPX Tcommaaccent r -55
+KPX Tcommaaccent racute -55
+KPX Tcommaaccent rcaron -55
+KPX Tcommaaccent rcommaaccent -55
+KPX Tcommaaccent semicolon -65
+KPX Tcommaaccent u -55
+KPX Tcommaaccent uacute -55
+KPX Tcommaaccent ucircumflex -55
+KPX Tcommaaccent udieresis -55
+KPX Tcommaaccent ugrave -55
+KPX Tcommaaccent uhungarumlaut -55
+KPX Tcommaaccent umacron -55
+KPX Tcommaaccent uogonek -55
+KPX Tcommaaccent uring -55
+KPX Tcommaaccent w -74
+KPX Tcommaaccent y -74
+KPX Tcommaaccent yacute -74
+KPX Tcommaaccent ydieresis -34
+KPX U A -40
+KPX U Aacute -40
+KPX U Abreve -40
+KPX U Acircumflex -40
+KPX U Adieresis -40
+KPX U Agrave -40
+KPX U Amacron -40
+KPX U Aogonek -40
+KPX U Aring -40
+KPX U Atilde -40
+KPX U comma -25
+KPX U period -25
+KPX Uacute A -40
+KPX Uacute Aacute -40
+KPX Uacute Abreve -40
+KPX Uacute Acircumflex -40
+KPX Uacute Adieresis -40
+KPX Uacute Agrave -40
+KPX Uacute Amacron -40
+KPX Uacute Aogonek -40
+KPX Uacute Aring -40
+KPX Uacute Atilde -40
+KPX Uacute comma -25
+KPX Uacute period -25
+KPX Ucircumflex A -40
+KPX Ucircumflex Aacute -40
+KPX Ucircumflex Abreve -40
+KPX Ucircumflex Acircumflex -40
+KPX Ucircumflex Adieresis -40
+KPX Ucircumflex Agrave -40
+KPX Ucircumflex Amacron -40
+KPX Ucircumflex Aogonek -40
+KPX Ucircumflex Aring -40
+KPX Ucircumflex Atilde -40
+KPX Ucircumflex comma -25
+KPX Ucircumflex period -25
+KPX Udieresis A -40
+KPX Udieresis Aacute -40
+KPX Udieresis Abreve -40
+KPX Udieresis Acircumflex -40
+KPX Udieresis Adieresis -40
+KPX Udieresis Agrave -40
+KPX Udieresis Amacron -40
+KPX Udieresis Aogonek -40
+KPX Udieresis Aring -40
+KPX Udieresis Atilde -40
+KPX Udieresis comma -25
+KPX Udieresis period -25
+KPX Ugrave A -40
+KPX Ugrave Aacute -40
+KPX Ugrave Abreve -40
+KPX Ugrave Acircumflex -40
+KPX Ugrave Adieresis -40
+KPX Ugrave Agrave -40
+KPX Ugrave Amacron -40
+KPX Ugrave Aogonek -40
+KPX Ugrave Aring -40
+KPX Ugrave Atilde -40
+KPX Ugrave comma -25
+KPX Ugrave period -25
+KPX Uhungarumlaut A -40
+KPX Uhungarumlaut Aacute -40
+KPX Uhungarumlaut Abreve -40
+KPX Uhungarumlaut Acircumflex -40
+KPX Uhungarumlaut Adieresis -40
+KPX Uhungarumlaut Agrave -40
+KPX Uhungarumlaut Amacron -40
+KPX Uhungarumlaut Aogonek -40
+KPX Uhungarumlaut Aring -40
+KPX Uhungarumlaut Atilde -40
+KPX Uhungarumlaut comma -25
+KPX Uhungarumlaut period -25
+KPX Umacron A -40
+KPX Umacron Aacute -40
+KPX Umacron Abreve -40
+KPX Umacron Acircumflex -40
+KPX Umacron Adieresis -40
+KPX Umacron Agrave -40
+KPX Umacron Amacron -40
+KPX Umacron Aogonek -40
+KPX Umacron Aring -40
+KPX Umacron Atilde -40
+KPX Umacron comma -25
+KPX Umacron period -25
+KPX Uogonek A -40
+KPX Uogonek Aacute -40
+KPX Uogonek Abreve -40
+KPX Uogonek Acircumflex -40
+KPX Uogonek Adieresis -40
+KPX Uogonek Agrave -40
+KPX Uogonek Amacron -40
+KPX Uogonek Aogonek -40
+KPX Uogonek Aring -40
+KPX Uogonek Atilde -40
+KPX Uogonek comma -25
+KPX Uogonek period -25
+KPX Uring A -40
+KPX Uring Aacute -40
+KPX Uring Abreve -40
+KPX Uring Acircumflex -40
+KPX Uring Adieresis -40
+KPX Uring Agrave -40
+KPX Uring Amacron -40
+KPX Uring Aogonek -40
+KPX Uring Aring -40
+KPX Uring Atilde -40
+KPX Uring comma -25
+KPX Uring period -25
+KPX V A -60
+KPX V Aacute -60
+KPX V Abreve -60
+KPX V Acircumflex -60
+KPX V Adieresis -60
+KPX V Agrave -60
+KPX V Amacron -60
+KPX V Aogonek -60
+KPX V Aring -60
+KPX V Atilde -60
+KPX V O -30
+KPX V Oacute -30
+KPX V Ocircumflex -30
+KPX V Odieresis -30
+KPX V Ograve -30
+KPX V Ohungarumlaut -30
+KPX V Omacron -30
+KPX V Oslash -30
+KPX V Otilde -30
+KPX V a -111
+KPX V aacute -111
+KPX V abreve -111
+KPX V acircumflex -111
+KPX V adieresis -111
+KPX V agrave -111
+KPX V amacron -111
+KPX V aogonek -111
+KPX V aring -111
+KPX V atilde -111
+KPX V colon -65
+KPX V comma -129
+KPX V e -111
+KPX V eacute -111
+KPX V ecaron -111
+KPX V ecircumflex -111
+KPX V edieresis -71
+KPX V edotaccent -111
+KPX V egrave -71
+KPX V emacron -71
+KPX V eogonek -111
+KPX V hyphen -55
+KPX V i -74
+KPX V iacute -74
+KPX V icircumflex -34
+KPX V idieresis -34
+KPX V igrave -34
+KPX V imacron -34
+KPX V iogonek -74
+KPX V o -111
+KPX V oacute -111
+KPX V ocircumflex -111
+KPX V odieresis -111
+KPX V ograve -111
+KPX V ohungarumlaut -111
+KPX V omacron -111
+KPX V oslash -111
+KPX V otilde -111
+KPX V period -129
+KPX V semicolon -74
+KPX V u -74
+KPX V uacute -74
+KPX V ucircumflex -74
+KPX V udieresis -74
+KPX V ugrave -74
+KPX V uhungarumlaut -74
+KPX V umacron -74
+KPX V uogonek -74
+KPX V uring -74
+KPX W A -60
+KPX W Aacute -60
+KPX W Abreve -60
+KPX W Acircumflex -60
+KPX W Adieresis -60
+KPX W Agrave -60
+KPX W Amacron -60
+KPX W Aogonek -60
+KPX W Aring -60
+KPX W Atilde -60
+KPX W O -25
+KPX W Oacute -25
+KPX W Ocircumflex -25
+KPX W Odieresis -25
+KPX W Ograve -25
+KPX W Ohungarumlaut -25
+KPX W Omacron -25
+KPX W Oslash -25
+KPX W Otilde -25
+KPX W a -92
+KPX W aacute -92
+KPX W abreve -92
+KPX W acircumflex -92
+KPX W adieresis -92
+KPX W agrave -92
+KPX W amacron -92
+KPX W aogonek -92
+KPX W aring -92
+KPX W atilde -92
+KPX W colon -65
+KPX W comma -92
+KPX W e -92
+KPX W eacute -92
+KPX W ecaron -92
+KPX W ecircumflex -92
+KPX W edieresis -52
+KPX W edotaccent -92
+KPX W egrave -52
+KPX W emacron -52
+KPX W eogonek -92
+KPX W hyphen -37
+KPX W i -55
+KPX W iacute -55
+KPX W iogonek -55
+KPX W o -92
+KPX W oacute -92
+KPX W ocircumflex -92
+KPX W odieresis -92
+KPX W ograve -92
+KPX W ohungarumlaut -92
+KPX W omacron -92
+KPX W oslash -92
+KPX W otilde -92
+KPX W period -92
+KPX W semicolon -65
+KPX W u -55
+KPX W uacute -55
+KPX W ucircumflex -55
+KPX W udieresis -55
+KPX W ugrave -55
+KPX W uhungarumlaut -55
+KPX W umacron -55
+KPX W uogonek -55
+KPX W uring -55
+KPX W y -70
+KPX W yacute -70
+KPX W ydieresis -70
+KPX Y A -50
+KPX Y Aacute -50
+KPX Y Abreve -50
+KPX Y Acircumflex -50
+KPX Y Adieresis -50
+KPX Y Agrave -50
+KPX Y Amacron -50
+KPX Y Aogonek -50
+KPX Y Aring -50
+KPX Y Atilde -50
+KPX Y O -15
+KPX Y Oacute -15
+KPX Y Ocircumflex -15
+KPX Y Odieresis -15
+KPX Y Ograve -15
+KPX Y Ohungarumlaut -15
+KPX Y Omacron -15
+KPX Y Oslash -15
+KPX Y Otilde -15
+KPX Y a -92
+KPX Y aacute -92
+KPX Y abreve -92
+KPX Y acircumflex -92
+KPX Y adieresis -92
+KPX Y agrave -92
+KPX Y amacron -92
+KPX Y aogonek -92
+KPX Y aring -92
+KPX Y atilde -92
+KPX Y colon -65
+KPX Y comma -92
+KPX Y e -92
+KPX Y eacute -92
+KPX Y ecaron -92
+KPX Y ecircumflex -92
+KPX Y edieresis -52
+KPX Y edotaccent -92
+KPX Y egrave -52
+KPX Y emacron -52
+KPX Y eogonek -92
+KPX Y hyphen -74
+KPX Y i -74
+KPX Y iacute -74
+KPX Y icircumflex -34
+KPX Y idieresis -34
+KPX Y igrave -34
+KPX Y imacron -34
+KPX Y iogonek -74
+KPX Y o -92
+KPX Y oacute -92
+KPX Y ocircumflex -92
+KPX Y odieresis -92
+KPX Y ograve -92
+KPX Y ohungarumlaut -92
+KPX Y omacron -92
+KPX Y oslash -92
+KPX Y otilde -92
+KPX Y period -92
+KPX Y semicolon -65
+KPX Y u -92
+KPX Y uacute -92
+KPX Y ucircumflex -92
+KPX Y udieresis -92
+KPX Y ugrave -92
+KPX Y uhungarumlaut -92
+KPX Y umacron -92
+KPX Y uogonek -92
+KPX Y uring -92
+KPX Yacute A -50
+KPX Yacute Aacute -50
+KPX Yacute Abreve -50
+KPX Yacute Acircumflex -50
+KPX Yacute Adieresis -50
+KPX Yacute Agrave -50
+KPX Yacute Amacron -50
+KPX Yacute Aogonek -50
+KPX Yacute Aring -50
+KPX Yacute Atilde -50
+KPX Yacute O -15
+KPX Yacute Oacute -15
+KPX Yacute Ocircumflex -15
+KPX Yacute Odieresis -15
+KPX Yacute Ograve -15
+KPX Yacute Ohungarumlaut -15
+KPX Yacute Omacron -15
+KPX Yacute Oslash -15
+KPX Yacute Otilde -15
+KPX Yacute a -92
+KPX Yacute aacute -92
+KPX Yacute abreve -92
+KPX Yacute acircumflex -92
+KPX Yacute adieresis -92
+KPX Yacute agrave -92
+KPX Yacute amacron -92
+KPX Yacute aogonek -92
+KPX Yacute aring -92
+KPX Yacute atilde -92
+KPX Yacute colon -65
+KPX Yacute comma -92
+KPX Yacute e -92
+KPX Yacute eacute -92
+KPX Yacute ecaron -92
+KPX Yacute ecircumflex -92
+KPX Yacute edieresis -52
+KPX Yacute edotaccent -92
+KPX Yacute egrave -52
+KPX Yacute emacron -52
+KPX Yacute eogonek -92
+KPX Yacute hyphen -74
+KPX Yacute i -74
+KPX Yacute iacute -74
+KPX Yacute icircumflex -34
+KPX Yacute idieresis -34
+KPX Yacute igrave -34
+KPX Yacute imacron -34
+KPX Yacute iogonek -74
+KPX Yacute o -92
+KPX Yacute oacute -92
+KPX Yacute ocircumflex -92
+KPX Yacute odieresis -92
+KPX Yacute ograve -92
+KPX Yacute ohungarumlaut -92
+KPX Yacute omacron -92
+KPX Yacute oslash -92
+KPX Yacute otilde -92
+KPX Yacute period -92
+KPX Yacute semicolon -65
+KPX Yacute u -92
+KPX Yacute uacute -92
+KPX Yacute ucircumflex -92
+KPX Yacute udieresis -92
+KPX Yacute ugrave -92
+KPX Yacute uhungarumlaut -92
+KPX Yacute umacron -92
+KPX Yacute uogonek -92
+KPX Yacute uring -92
+KPX Ydieresis A -50
+KPX Ydieresis Aacute -50
+KPX Ydieresis Abreve -50
+KPX Ydieresis Acircumflex -50
+KPX Ydieresis Adieresis -50
+KPX Ydieresis Agrave -50
+KPX Ydieresis Amacron -50
+KPX Ydieresis Aogonek -50
+KPX Ydieresis Aring -50
+KPX Ydieresis Atilde -50
+KPX Ydieresis O -15
+KPX Ydieresis Oacute -15
+KPX Ydieresis Ocircumflex -15
+KPX Ydieresis Odieresis -15
+KPX Ydieresis Ograve -15
+KPX Ydieresis Ohungarumlaut -15
+KPX Ydieresis Omacron -15
+KPX Ydieresis Oslash -15
+KPX Ydieresis Otilde -15
+KPX Ydieresis a -92
+KPX Ydieresis aacute -92
+KPX Ydieresis abreve -92
+KPX Ydieresis acircumflex -92
+KPX Ydieresis adieresis -92
+KPX Ydieresis agrave -92
+KPX Ydieresis amacron -92
+KPX Ydieresis aogonek -92
+KPX Ydieresis aring -92
+KPX Ydieresis atilde -92
+KPX Ydieresis colon -65
+KPX Ydieresis comma -92
+KPX Ydieresis e -92
+KPX Ydieresis eacute -92
+KPX Ydieresis ecaron -92
+KPX Ydieresis ecircumflex -92
+KPX Ydieresis edieresis -52
+KPX Ydieresis edotaccent -92
+KPX Ydieresis egrave -52
+KPX Ydieresis emacron -52
+KPX Ydieresis eogonek -92
+KPX Ydieresis hyphen -74
+KPX Ydieresis i -74
+KPX Ydieresis iacute -74
+KPX Ydieresis icircumflex -34
+KPX Ydieresis idieresis -34
+KPX Ydieresis igrave -34
+KPX Ydieresis imacron -34
+KPX Ydieresis iogonek -74
+KPX Ydieresis o -92
+KPX Ydieresis oacute -92
+KPX Ydieresis ocircumflex -92
+KPX Ydieresis odieresis -92
+KPX Ydieresis ograve -92
+KPX Ydieresis ohungarumlaut -92
+KPX Ydieresis omacron -92
+KPX Ydieresis oslash -92
+KPX Ydieresis otilde -92
+KPX Ydieresis period -92
+KPX Ydieresis semicolon -65
+KPX Ydieresis u -92
+KPX Ydieresis uacute -92
+KPX Ydieresis ucircumflex -92
+KPX Ydieresis udieresis -92
+KPX Ydieresis ugrave -92
+KPX Ydieresis uhungarumlaut -92
+KPX Ydieresis umacron -92
+KPX Ydieresis uogonek -92
+KPX Ydieresis uring -92
+KPX a g -10
+KPX a gbreve -10
+KPX a gcommaaccent -10
+KPX aacute g -10
+KPX aacute gbreve -10
+KPX aacute gcommaaccent -10
+KPX abreve g -10
+KPX abreve gbreve -10
+KPX abreve gcommaaccent -10
+KPX acircumflex g -10
+KPX acircumflex gbreve -10
+KPX acircumflex gcommaaccent -10
+KPX adieresis g -10
+KPX adieresis gbreve -10
+KPX adieresis gcommaaccent -10
+KPX agrave g -10
+KPX agrave gbreve -10
+KPX agrave gcommaaccent -10
+KPX amacron g -10
+KPX amacron gbreve -10
+KPX amacron gcommaaccent -10
+KPX aogonek g -10
+KPX aogonek gbreve -10
+KPX aogonek gcommaaccent -10
+KPX aring g -10
+KPX aring gbreve -10
+KPX aring gcommaaccent -10
+KPX atilde g -10
+KPX atilde gbreve -10
+KPX atilde gcommaaccent -10
+KPX b period -40
+KPX b u -20
+KPX b uacute -20
+KPX b ucircumflex -20
+KPX b udieresis -20
+KPX b ugrave -20
+KPX b uhungarumlaut -20
+KPX b umacron -20
+KPX b uogonek -20
+KPX b uring -20
+KPX c h -15
+KPX c k -20
+KPX c kcommaaccent -20
+KPX cacute h -15
+KPX cacute k -20
+KPX cacute kcommaaccent -20
+KPX ccaron h -15
+KPX ccaron k -20
+KPX ccaron kcommaaccent -20
+KPX ccedilla h -15
+KPX ccedilla k -20
+KPX ccedilla kcommaaccent -20
+KPX comma quotedblright -140
+KPX comma quoteright -140
+KPX e comma -10
+KPX e g -40
+KPX e gbreve -40
+KPX e gcommaaccent -40
+KPX e period -15
+KPX e v -15
+KPX e w -15
+KPX e x -20
+KPX e y -30
+KPX e yacute -30
+KPX e ydieresis -30
+KPX eacute comma -10
+KPX eacute g -40
+KPX eacute gbreve -40
+KPX eacute gcommaaccent -40
+KPX eacute period -15
+KPX eacute v -15
+KPX eacute w -15
+KPX eacute x -20
+KPX eacute y -30
+KPX eacute yacute -30
+KPX eacute ydieresis -30
+KPX ecaron comma -10
+KPX ecaron g -40
+KPX ecaron gbreve -40
+KPX ecaron gcommaaccent -40
+KPX ecaron period -15
+KPX ecaron v -15
+KPX ecaron w -15
+KPX ecaron x -20
+KPX ecaron y -30
+KPX ecaron yacute -30
+KPX ecaron ydieresis -30
+KPX ecircumflex comma -10
+KPX ecircumflex g -40
+KPX ecircumflex gbreve -40
+KPX ecircumflex gcommaaccent -40
+KPX ecircumflex period -15
+KPX ecircumflex v -15
+KPX ecircumflex w -15
+KPX ecircumflex x -20
+KPX ecircumflex y -30
+KPX ecircumflex yacute -30
+KPX ecircumflex ydieresis -30
+KPX edieresis comma -10
+KPX edieresis g -40
+KPX edieresis gbreve -40
+KPX edieresis gcommaaccent -40
+KPX edieresis period -15
+KPX edieresis v -15
+KPX edieresis w -15
+KPX edieresis x -20
+KPX edieresis y -30
+KPX edieresis yacute -30
+KPX edieresis ydieresis -30
+KPX edotaccent comma -10
+KPX edotaccent g -40
+KPX edotaccent gbreve -40
+KPX edotaccent gcommaaccent -40
+KPX edotaccent period -15
+KPX edotaccent v -15
+KPX edotaccent w -15
+KPX edotaccent x -20
+KPX edotaccent y -30
+KPX edotaccent yacute -30
+KPX edotaccent ydieresis -30
+KPX egrave comma -10
+KPX egrave g -40
+KPX egrave gbreve -40
+KPX egrave gcommaaccent -40
+KPX egrave period -15
+KPX egrave v -15
+KPX egrave w -15
+KPX egrave x -20
+KPX egrave y -30
+KPX egrave yacute -30
+KPX egrave ydieresis -30
+KPX emacron comma -10
+KPX emacron g -40
+KPX emacron gbreve -40
+KPX emacron gcommaaccent -40
+KPX emacron period -15
+KPX emacron v -15
+KPX emacron w -15
+KPX emacron x -20
+KPX emacron y -30
+KPX emacron yacute -30
+KPX emacron ydieresis -30
+KPX eogonek comma -10
+KPX eogonek g -40
+KPX eogonek gbreve -40
+KPX eogonek gcommaaccent -40
+KPX eogonek period -15
+KPX eogonek v -15
+KPX eogonek w -15
+KPX eogonek x -20
+KPX eogonek y -30
+KPX eogonek yacute -30
+KPX eogonek ydieresis -30
+KPX f comma -10
+KPX f dotlessi -60
+KPX f f -18
+KPX f i -20
+KPX f iogonek -20
+KPX f period -15
+KPX f quoteright 92
+KPX g comma -10
+KPX g e -10
+KPX g eacute -10
+KPX g ecaron -10
+KPX g ecircumflex -10
+KPX g edieresis -10
+KPX g edotaccent -10
+KPX g egrave -10
+KPX g emacron -10
+KPX g eogonek -10
+KPX g g -10
+KPX g gbreve -10
+KPX g gcommaaccent -10
+KPX g period -15
+KPX gbreve comma -10
+KPX gbreve e -10
+KPX gbreve eacute -10
+KPX gbreve ecaron -10
+KPX gbreve ecircumflex -10
+KPX gbreve edieresis -10
+KPX gbreve edotaccent -10
+KPX gbreve egrave -10
+KPX gbreve emacron -10
+KPX gbreve eogonek -10
+KPX gbreve g -10
+KPX gbreve gbreve -10
+KPX gbreve gcommaaccent -10
+KPX gbreve period -15
+KPX gcommaaccent comma -10
+KPX gcommaaccent e -10
+KPX gcommaaccent eacute -10
+KPX gcommaaccent ecaron -10
+KPX gcommaaccent ecircumflex -10
+KPX gcommaaccent edieresis -10
+KPX gcommaaccent edotaccent -10
+KPX gcommaaccent egrave -10
+KPX gcommaaccent emacron -10
+KPX gcommaaccent eogonek -10
+KPX gcommaaccent g -10
+KPX gcommaaccent gbreve -10
+KPX gcommaaccent gcommaaccent -10
+KPX gcommaaccent period -15
+KPX k e -10
+KPX k eacute -10
+KPX k ecaron -10
+KPX k ecircumflex -10
+KPX k edieresis -10
+KPX k edotaccent -10
+KPX k egrave -10
+KPX k emacron -10
+KPX k eogonek -10
+KPX k o -10
+KPX k oacute -10
+KPX k ocircumflex -10
+KPX k odieresis -10
+KPX k ograve -10
+KPX k ohungarumlaut -10
+KPX k omacron -10
+KPX k oslash -10
+KPX k otilde -10
+KPX k y -10
+KPX k yacute -10
+KPX k ydieresis -10
+KPX kcommaaccent e -10
+KPX kcommaaccent eacute -10
+KPX kcommaaccent ecaron -10
+KPX kcommaaccent ecircumflex -10
+KPX kcommaaccent edieresis -10
+KPX kcommaaccent edotaccent -10
+KPX kcommaaccent egrave -10
+KPX kcommaaccent emacron -10
+KPX kcommaaccent eogonek -10
+KPX kcommaaccent o -10
+KPX kcommaaccent oacute -10
+KPX kcommaaccent ocircumflex -10
+KPX kcommaaccent odieresis -10
+KPX kcommaaccent ograve -10
+KPX kcommaaccent ohungarumlaut -10
+KPX kcommaaccent omacron -10
+KPX kcommaaccent oslash -10
+KPX kcommaaccent otilde -10
+KPX kcommaaccent y -10
+KPX kcommaaccent yacute -10
+KPX kcommaaccent ydieresis -10
+KPX n v -40
+KPX nacute v -40
+KPX ncaron v -40
+KPX ncommaaccent v -40
+KPX ntilde v -40
+KPX o g -10
+KPX o gbreve -10
+KPX o gcommaaccent -10
+KPX o v -10
+KPX oacute g -10
+KPX oacute gbreve -10
+KPX oacute gcommaaccent -10
+KPX oacute v -10
+KPX ocircumflex g -10
+KPX ocircumflex gbreve -10
+KPX ocircumflex gcommaaccent -10
+KPX ocircumflex v -10
+KPX odieresis g -10
+KPX odieresis gbreve -10
+KPX odieresis gcommaaccent -10
+KPX odieresis v -10
+KPX ograve g -10
+KPX ograve gbreve -10
+KPX ograve gcommaaccent -10
+KPX ograve v -10
+KPX ohungarumlaut g -10
+KPX ohungarumlaut gbreve -10
+KPX ohungarumlaut gcommaaccent -10
+KPX ohungarumlaut v -10
+KPX omacron g -10
+KPX omacron gbreve -10
+KPX omacron gcommaaccent -10
+KPX omacron v -10
+KPX oslash g -10
+KPX oslash gbreve -10
+KPX oslash gcommaaccent -10
+KPX oslash v -10
+KPX otilde g -10
+KPX otilde gbreve -10
+KPX otilde gcommaaccent -10
+KPX otilde v -10
+KPX period quotedblright -140
+KPX period quoteright -140
+KPX quoteleft quoteleft -111
+KPX quoteright d -25
+KPX quoteright dcroat -25
+KPX quoteright quoteright -111
+KPX quoteright r -25
+KPX quoteright racute -25
+KPX quoteright rcaron -25
+KPX quoteright rcommaaccent -25
+KPX quoteright s -40
+KPX quoteright sacute -40
+KPX quoteright scaron -40
+KPX quoteright scedilla -40
+KPX quoteright scommaaccent -40
+KPX quoteright space -111
+KPX quoteright t -30
+KPX quoteright tcommaaccent -30
+KPX quoteright v -10
+KPX r a -15
+KPX r aacute -15
+KPX r abreve -15
+KPX r acircumflex -15
+KPX r adieresis -15
+KPX r agrave -15
+KPX r amacron -15
+KPX r aogonek -15
+KPX r aring -15
+KPX r atilde -15
+KPX r c -37
+KPX r cacute -37
+KPX r ccaron -37
+KPX r ccedilla -37
+KPX r comma -111
+KPX r d -37
+KPX r dcroat -37
+KPX r e -37
+KPX r eacute -37
+KPX r ecaron -37
+KPX r ecircumflex -37
+KPX r edieresis -37
+KPX r edotaccent -37
+KPX r egrave -37
+KPX r emacron -37
+KPX r eogonek -37
+KPX r g -37
+KPX r gbreve -37
+KPX r gcommaaccent -37
+KPX r hyphen -20
+KPX r o -45
+KPX r oacute -45
+KPX r ocircumflex -45
+KPX r odieresis -45
+KPX r ograve -45
+KPX r ohungarumlaut -45
+KPX r omacron -45
+KPX r oslash -45
+KPX r otilde -45
+KPX r period -111
+KPX r q -37
+KPX r s -10
+KPX r sacute -10
+KPX r scaron -10
+KPX r scedilla -10
+KPX r scommaaccent -10
+KPX racute a -15
+KPX racute aacute -15
+KPX racute abreve -15
+KPX racute acircumflex -15
+KPX racute adieresis -15
+KPX racute agrave -15
+KPX racute amacron -15
+KPX racute aogonek -15
+KPX racute aring -15
+KPX racute atilde -15
+KPX racute c -37
+KPX racute cacute -37
+KPX racute ccaron -37
+KPX racute ccedilla -37
+KPX racute comma -111
+KPX racute d -37
+KPX racute dcroat -37
+KPX racute e -37
+KPX racute eacute -37
+KPX racute ecaron -37
+KPX racute ecircumflex -37
+KPX racute edieresis -37
+KPX racute edotaccent -37
+KPX racute egrave -37
+KPX racute emacron -37
+KPX racute eogonek -37
+KPX racute g -37
+KPX racute gbreve -37
+KPX racute gcommaaccent -37
+KPX racute hyphen -20
+KPX racute o -45
+KPX racute oacute -45
+KPX racute ocircumflex -45
+KPX racute odieresis -45
+KPX racute ograve -45
+KPX racute ohungarumlaut -45
+KPX racute omacron -45
+KPX racute oslash -45
+KPX racute otilde -45
+KPX racute period -111
+KPX racute q -37
+KPX racute s -10
+KPX racute sacute -10
+KPX racute scaron -10
+KPX racute scedilla -10
+KPX racute scommaaccent -10
+KPX rcaron a -15
+KPX rcaron aacute -15
+KPX rcaron abreve -15
+KPX rcaron acircumflex -15
+KPX rcaron adieresis -15
+KPX rcaron agrave -15
+KPX rcaron amacron -15
+KPX rcaron aogonek -15
+KPX rcaron aring -15
+KPX rcaron atilde -15
+KPX rcaron c -37
+KPX rcaron cacute -37
+KPX rcaron ccaron -37
+KPX rcaron ccedilla -37
+KPX rcaron comma -111
+KPX rcaron d -37
+KPX rcaron dcroat -37
+KPX rcaron e -37
+KPX rcaron eacute -37
+KPX rcaron ecaron -37
+KPX rcaron ecircumflex -37
+KPX rcaron edieresis -37
+KPX rcaron edotaccent -37
+KPX rcaron egrave -37
+KPX rcaron emacron -37
+KPX rcaron eogonek -37
+KPX rcaron g -37
+KPX rcaron gbreve -37
+KPX rcaron gcommaaccent -37
+KPX rcaron hyphen -20
+KPX rcaron o -45
+KPX rcaron oacute -45
+KPX rcaron ocircumflex -45
+KPX rcaron odieresis -45
+KPX rcaron ograve -45
+KPX rcaron ohungarumlaut -45
+KPX rcaron omacron -45
+KPX rcaron oslash -45
+KPX rcaron otilde -45
+KPX rcaron period -111
+KPX rcaron q -37
+KPX rcaron s -10
+KPX rcaron sacute -10
+KPX rcaron scaron -10
+KPX rcaron scedilla -10
+KPX rcaron scommaaccent -10
+KPX rcommaaccent a -15
+KPX rcommaaccent aacute -15
+KPX rcommaaccent abreve -15
+KPX rcommaaccent acircumflex -15
+KPX rcommaaccent adieresis -15
+KPX rcommaaccent agrave -15
+KPX rcommaaccent amacron -15
+KPX rcommaaccent aogonek -15
+KPX rcommaaccent aring -15
+KPX rcommaaccent atilde -15
+KPX rcommaaccent c -37
+KPX rcommaaccent cacute -37
+KPX rcommaaccent ccaron -37
+KPX rcommaaccent ccedilla -37
+KPX rcommaaccent comma -111
+KPX rcommaaccent d -37
+KPX rcommaaccent dcroat -37
+KPX rcommaaccent e -37
+KPX rcommaaccent eacute -37
+KPX rcommaaccent ecaron -37
+KPX rcommaaccent ecircumflex -37
+KPX rcommaaccent edieresis -37
+KPX rcommaaccent edotaccent -37
+KPX rcommaaccent egrave -37
+KPX rcommaaccent emacron -37
+KPX rcommaaccent eogonek -37
+KPX rcommaaccent g -37
+KPX rcommaaccent gbreve -37
+KPX rcommaaccent gcommaaccent -37
+KPX rcommaaccent hyphen -20
+KPX rcommaaccent o -45
+KPX rcommaaccent oacute -45
+KPX rcommaaccent ocircumflex -45
+KPX rcommaaccent odieresis -45
+KPX rcommaaccent ograve -45
+KPX rcommaaccent ohungarumlaut -45
+KPX rcommaaccent omacron -45
+KPX rcommaaccent oslash -45
+KPX rcommaaccent otilde -45
+KPX rcommaaccent period -111
+KPX rcommaaccent q -37
+KPX rcommaaccent s -10
+KPX rcommaaccent sacute -10
+KPX rcommaaccent scaron -10
+KPX rcommaaccent scedilla -10
+KPX rcommaaccent scommaaccent -10
+KPX space A -18
+KPX space Aacute -18
+KPX space Abreve -18
+KPX space Acircumflex -18
+KPX space Adieresis -18
+KPX space Agrave -18
+KPX space Amacron -18
+KPX space Aogonek -18
+KPX space Aring -18
+KPX space Atilde -18
+KPX space T -18
+KPX space Tcaron -18
+KPX space Tcommaaccent -18
+KPX space V -35
+KPX space W -40
+KPX space Y -75
+KPX space Yacute -75
+KPX space Ydieresis -75
+KPX v comma -74
+KPX v period -74
+KPX w comma -74
+KPX w period -74
+KPX y comma -55
+KPX y period -55
+KPX yacute comma -55
+KPX yacute period -55
+KPX ydieresis comma -55
+KPX ydieresis period -55
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/src/fonts/Adobe-Core35_AFMs-314/Times-Roman.afm b/src/fonts/Adobe-Core35_AFMs-314/Times-Roman.afm
new file mode 100644
index 0000000..2ad7f7d
--- /dev/null
+++ b/src/fonts/Adobe-Core35_AFMs-314/Times-Roman.afm
@@ -0,0 +1,2417 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Thu May 1 12:49:17 1997
+Comment UniqueID 43068
+Comment VMusage 43909 54934
+FontName Times-Roman
+FullName Times Roman
+FamilyName Times
+Weight Roman
+ItalicAngle 0
+IsFixedPitch false
+FontBBox -168 -218 1000 898
+UnderlinePosition -100
+UnderlineThickness 50
+Version 002.000
+Notice Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries.
+EncodingScheme AdobeStandardEncoding
+CapHeight 662
+XHeight 450
+Ascender 683
+Descender -217
+StdHW 28
+StdVW 84
+StartCharMetrics 314
+C 32 ; WX 250 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 333 ; N exclam ; B 130 -9 238 676 ;
+C 34 ; WX 408 ; N quotedbl ; B 77 431 331 676 ;
+C 35 ; WX 500 ; N numbersign ; B 5 0 496 662 ;
+C 36 ; WX 500 ; N dollar ; B 44 -87 457 727 ;
+C 37 ; WX 833 ; N percent ; B 61 -13 772 676 ;
+C 38 ; WX 778 ; N ampersand ; B 42 -13 750 676 ;
+C 39 ; WX 333 ; N quoteright ; B 79 433 218 676 ;
+C 40 ; WX 333 ; N parenleft ; B 48 -177 304 676 ;
+C 41 ; WX 333 ; N parenright ; B 29 -177 285 676 ;
+C 42 ; WX 500 ; N asterisk ; B 69 265 432 676 ;
+C 43 ; WX 564 ; N plus ; B 30 0 534 506 ;
+C 44 ; WX 250 ; N comma ; B 56 -141 195 102 ;
+C 45 ; WX 333 ; N hyphen ; B 39 194 285 257 ;
+C 46 ; WX 250 ; N period ; B 70 -11 181 100 ;
+C 47 ; WX 278 ; N slash ; B -9 -14 287 676 ;
+C 48 ; WX 500 ; N zero ; B 24 -14 476 676 ;
+C 49 ; WX 500 ; N one ; B 111 0 394 676 ;
+C 50 ; WX 500 ; N two ; B 30 0 475 676 ;
+C 51 ; WX 500 ; N three ; B 43 -14 431 676 ;
+C 52 ; WX 500 ; N four ; B 12 0 472 676 ;
+C 53 ; WX 500 ; N five ; B 32 -14 438 688 ;
+C 54 ; WX 500 ; N six ; B 34 -14 468 684 ;
+C 55 ; WX 500 ; N seven ; B 20 -8 449 662 ;
+C 56 ; WX 500 ; N eight ; B 56 -14 445 676 ;
+C 57 ; WX 500 ; N nine ; B 30 -22 459 676 ;
+C 58 ; WX 278 ; N colon ; B 81 -11 192 459 ;
+C 59 ; WX 278 ; N semicolon ; B 80 -141 219 459 ;
+C 60 ; WX 564 ; N less ; B 28 -8 536 514 ;
+C 61 ; WX 564 ; N equal ; B 30 120 534 386 ;
+C 62 ; WX 564 ; N greater ; B 28 -8 536 514 ;
+C 63 ; WX 444 ; N question ; B 68 -8 414 676 ;
+C 64 ; WX 921 ; N at ; B 116 -14 809 676 ;
+C 65 ; WX 722 ; N A ; B 15 0 706 674 ;
+C 66 ; WX 667 ; N B ; B 17 0 593 662 ;
+C 67 ; WX 667 ; N C ; B 28 -14 633 676 ;
+C 68 ; WX 722 ; N D ; B 16 0 685 662 ;
+C 69 ; WX 611 ; N E ; B 12 0 597 662 ;
+C 70 ; WX 556 ; N F ; B 12 0 546 662 ;
+C 71 ; WX 722 ; N G ; B 32 -14 709 676 ;
+C 72 ; WX 722 ; N H ; B 19 0 702 662 ;
+C 73 ; WX 333 ; N I ; B 18 0 315 662 ;
+C 74 ; WX 389 ; N J ; B 10 -14 370 662 ;
+C 75 ; WX 722 ; N K ; B 34 0 723 662 ;
+C 76 ; WX 611 ; N L ; B 12 0 598 662 ;
+C 77 ; WX 889 ; N M ; B 12 0 863 662 ;
+C 78 ; WX 722 ; N N ; B 12 -11 707 662 ;
+C 79 ; WX 722 ; N O ; B 34 -14 688 676 ;
+C 80 ; WX 556 ; N P ; B 16 0 542 662 ;
+C 81 ; WX 722 ; N Q ; B 34 -178 701 676 ;
+C 82 ; WX 667 ; N R ; B 17 0 659 662 ;
+C 83 ; WX 556 ; N S ; B 42 -14 491 676 ;
+C 84 ; WX 611 ; N T ; B 17 0 593 662 ;
+C 85 ; WX 722 ; N U ; B 14 -14 705 662 ;
+C 86 ; WX 722 ; N V ; B 16 -11 697 662 ;
+C 87 ; WX 944 ; N W ; B 5 -11 932 662 ;
+C 88 ; WX 722 ; N X ; B 10 0 704 662 ;
+C 89 ; WX 722 ; N Y ; B 22 0 703 662 ;
+C 90 ; WX 611 ; N Z ; B 9 0 597 662 ;
+C 91 ; WX 333 ; N bracketleft ; B 88 -156 299 662 ;
+C 92 ; WX 278 ; N backslash ; B -9 -14 287 676 ;
+C 93 ; WX 333 ; N bracketright ; B 34 -156 245 662 ;
+C 94 ; WX 469 ; N asciicircum ; B 24 297 446 662 ;
+C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;
+C 96 ; WX 333 ; N quoteleft ; B 115 433 254 676 ;
+C 97 ; WX 444 ; N a ; B 37 -10 442 460 ;
+C 98 ; WX 500 ; N b ; B 3 -10 468 683 ;
+C 99 ; WX 444 ; N c ; B 25 -10 412 460 ;
+C 100 ; WX 500 ; N d ; B 27 -10 491 683 ;
+C 101 ; WX 444 ; N e ; B 25 -10 424 460 ;
+C 102 ; WX 333 ; N f ; B 20 0 383 683 ; L i fi ; L l fl ;
+C 103 ; WX 500 ; N g ; B 28 -218 470 460 ;
+C 104 ; WX 500 ; N h ; B 9 0 487 683 ;
+C 105 ; WX 278 ; N i ; B 16 0 253 683 ;
+C 106 ; WX 278 ; N j ; B -70 -218 194 683 ;
+C 107 ; WX 500 ; N k ; B 7 0 505 683 ;
+C 108 ; WX 278 ; N l ; B 19 0 257 683 ;
+C 109 ; WX 778 ; N m ; B 16 0 775 460 ;
+C 110 ; WX 500 ; N n ; B 16 0 485 460 ;
+C 111 ; WX 500 ; N o ; B 29 -10 470 460 ;
+C 112 ; WX 500 ; N p ; B 5 -217 470 460 ;
+C 113 ; WX 500 ; N q ; B 24 -217 488 460 ;
+C 114 ; WX 333 ; N r ; B 5 0 335 460 ;
+C 115 ; WX 389 ; N s ; B 51 -10 348 460 ;
+C 116 ; WX 278 ; N t ; B 13 -10 279 579 ;
+C 117 ; WX 500 ; N u ; B 9 -10 479 450 ;
+C 118 ; WX 500 ; N v ; B 19 -14 477 450 ;
+C 119 ; WX 722 ; N w ; B 21 -14 694 450 ;
+C 120 ; WX 500 ; N x ; B 17 0 479 450 ;
+C 121 ; WX 500 ; N y ; B 14 -218 475 450 ;
+C 122 ; WX 444 ; N z ; B 27 0 418 450 ;
+C 123 ; WX 480 ; N braceleft ; B 100 -181 350 680 ;
+C 124 ; WX 200 ; N bar ; B 67 -218 133 782 ;
+C 125 ; WX 480 ; N braceright ; B 130 -181 380 680 ;
+C 126 ; WX 541 ; N asciitilde ; B 40 183 502 323 ;
+C 161 ; WX 333 ; N exclamdown ; B 97 -218 205 467 ;
+C 162 ; WX 500 ; N cent ; B 53 -138 448 579 ;
+C 163 ; WX 500 ; N sterling ; B 12 -8 490 676 ;
+C 164 ; WX 167 ; N fraction ; B -168 -14 331 676 ;
+C 165 ; WX 500 ; N yen ; B -53 0 512 662 ;
+C 166 ; WX 500 ; N florin ; B 7 -189 490 676 ;
+C 167 ; WX 500 ; N section ; B 70 -148 426 676 ;
+C 168 ; WX 500 ; N currency ; B -22 58 522 602 ;
+C 169 ; WX 180 ; N quotesingle ; B 48 431 133 676 ;
+C 170 ; WX 444 ; N quotedblleft ; B 43 433 414 676 ;
+C 171 ; WX 500 ; N guillemotleft ; B 42 33 456 416 ;
+C 172 ; WX 333 ; N guilsinglleft ; B 63 33 285 416 ;
+C 173 ; WX 333 ; N guilsinglright ; B 48 33 270 416 ;
+C 174 ; WX 556 ; N fi ; B 31 0 521 683 ;
+C 175 ; WX 556 ; N fl ; B 32 0 521 683 ;
+C 177 ; WX 500 ; N endash ; B 0 201 500 250 ;
+C 178 ; WX 500 ; N dagger ; B 59 -149 442 676 ;
+C 179 ; WX 500 ; N daggerdbl ; B 58 -153 442 676 ;
+C 180 ; WX 250 ; N periodcentered ; B 70 199 181 310 ;
+C 182 ; WX 453 ; N paragraph ; B -22 -154 450 662 ;
+C 183 ; WX 350 ; N bullet ; B 40 196 310 466 ;
+C 184 ; WX 333 ; N quotesinglbase ; B 79 -141 218 102 ;
+C 185 ; WX 444 ; N quotedblbase ; B 45 -141 416 102 ;
+C 186 ; WX 444 ; N quotedblright ; B 30 433 401 676 ;
+C 187 ; WX 500 ; N guillemotright ; B 44 33 458 416 ;
+C 188 ; WX 1000 ; N ellipsis ; B 111 -11 888 100 ;
+C 189 ; WX 1000 ; N perthousand ; B 7 -19 994 706 ;
+C 191 ; WX 444 ; N questiondown ; B 30 -218 376 466 ;
+C 193 ; WX 333 ; N grave ; B 19 507 242 678 ;
+C 194 ; WX 333 ; N acute ; B 93 507 317 678 ;
+C 195 ; WX 333 ; N circumflex ; B 11 507 322 674 ;
+C 196 ; WX 333 ; N tilde ; B 1 532 331 638 ;
+C 197 ; WX 333 ; N macron ; B 11 547 322 601 ;
+C 198 ; WX 333 ; N breve ; B 26 507 307 664 ;
+C 199 ; WX 333 ; N dotaccent ; B 118 581 216 681 ;
+C 200 ; WX 333 ; N dieresis ; B 18 581 315 681 ;
+C 202 ; WX 333 ; N ring ; B 67 512 266 711 ;
+C 203 ; WX 333 ; N cedilla ; B 52 -215 261 0 ;
+C 205 ; WX 333 ; N hungarumlaut ; B -3 507 377 678 ;
+C 206 ; WX 333 ; N ogonek ; B 62 -165 243 0 ;
+C 207 ; WX 333 ; N caron ; B 11 507 322 674 ;
+C 208 ; WX 1000 ; N emdash ; B 0 201 1000 250 ;
+C 225 ; WX 889 ; N AE ; B 0 0 863 662 ;
+C 227 ; WX 276 ; N ordfeminine ; B 4 394 270 676 ;
+C 232 ; WX 611 ; N Lslash ; B 12 0 598 662 ;
+C 233 ; WX 722 ; N Oslash ; B 34 -80 688 734 ;
+C 234 ; WX 889 ; N OE ; B 30 -6 885 668 ;
+C 235 ; WX 310 ; N ordmasculine ; B 6 394 304 676 ;
+C 241 ; WX 667 ; N ae ; B 38 -10 632 460 ;
+C 245 ; WX 278 ; N dotlessi ; B 16 0 253 460 ;
+C 248 ; WX 278 ; N lslash ; B 19 0 259 683 ;
+C 249 ; WX 500 ; N oslash ; B 29 -112 470 551 ;
+C 250 ; WX 722 ; N oe ; B 30 -10 690 460 ;
+C 251 ; WX 500 ; N germandbls ; B 12 -9 468 683 ;
+C -1 ; WX 333 ; N Idieresis ; B 18 0 315 835 ;
+C -1 ; WX 444 ; N eacute ; B 25 -10 424 678 ;
+C -1 ; WX 444 ; N abreve ; B 37 -10 442 664 ;
+C -1 ; WX 500 ; N uhungarumlaut ; B 9 -10 501 678 ;
+C -1 ; WX 444 ; N ecaron ; B 25 -10 424 674 ;
+C -1 ; WX 722 ; N Ydieresis ; B 22 0 703 835 ;
+C -1 ; WX 564 ; N divide ; B 30 -10 534 516 ;
+C -1 ; WX 722 ; N Yacute ; B 22 0 703 890 ;
+C -1 ; WX 722 ; N Acircumflex ; B 15 0 706 886 ;
+C -1 ; WX 444 ; N aacute ; B 37 -10 442 678 ;
+C -1 ; WX 722 ; N Ucircumflex ; B 14 -14 705 886 ;
+C -1 ; WX 500 ; N yacute ; B 14 -218 475 678 ;
+C -1 ; WX 389 ; N scommaaccent ; B 51 -218 348 460 ;
+C -1 ; WX 444 ; N ecircumflex ; B 25 -10 424 674 ;
+C -1 ; WX 722 ; N Uring ; B 14 -14 705 898 ;
+C -1 ; WX 722 ; N Udieresis ; B 14 -14 705 835 ;
+C -1 ; WX 444 ; N aogonek ; B 37 -165 469 460 ;
+C -1 ; WX 722 ; N Uacute ; B 14 -14 705 890 ;
+C -1 ; WX 500 ; N uogonek ; B 9 -155 487 450 ;
+C -1 ; WX 611 ; N Edieresis ; B 12 0 597 835 ;
+C -1 ; WX 722 ; N Dcroat ; B 16 0 685 662 ;
+C -1 ; WX 250 ; N commaaccent ; B 59 -218 184 -50 ;
+C -1 ; WX 760 ; N copyright ; B 38 -14 722 676 ;
+C -1 ; WX 611 ; N Emacron ; B 12 0 597 813 ;
+C -1 ; WX 444 ; N ccaron ; B 25 -10 412 674 ;
+C -1 ; WX 444 ; N aring ; B 37 -10 442 711 ;
+C -1 ; WX 722 ; N Ncommaaccent ; B 12 -198 707 662 ;
+C -1 ; WX 278 ; N lacute ; B 19 0 290 890 ;
+C -1 ; WX 444 ; N agrave ; B 37 -10 442 678 ;
+C -1 ; WX 611 ; N Tcommaaccent ; B 17 -218 593 662 ;
+C -1 ; WX 667 ; N Cacute ; B 28 -14 633 890 ;
+C -1 ; WX 444 ; N atilde ; B 37 -10 442 638 ;
+C -1 ; WX 611 ; N Edotaccent ; B 12 0 597 835 ;
+C -1 ; WX 389 ; N scaron ; B 39 -10 350 674 ;
+C -1 ; WX 389 ; N scedilla ; B 51 -215 348 460 ;
+C -1 ; WX 278 ; N iacute ; B 16 0 290 678 ;
+C -1 ; WX 471 ; N lozenge ; B 13 0 459 724 ;
+C -1 ; WX 667 ; N Rcaron ; B 17 0 659 886 ;
+C -1 ; WX 722 ; N Gcommaaccent ; B 32 -218 709 676 ;
+C -1 ; WX 500 ; N ucircumflex ; B 9 -10 479 674 ;
+C -1 ; WX 444 ; N acircumflex ; B 37 -10 442 674 ;
+C -1 ; WX 722 ; N Amacron ; B 15 0 706 813 ;
+C -1 ; WX 333 ; N rcaron ; B 5 0 335 674 ;
+C -1 ; WX 444 ; N ccedilla ; B 25 -215 412 460 ;
+C -1 ; WX 611 ; N Zdotaccent ; B 9 0 597 835 ;
+C -1 ; WX 556 ; N Thorn ; B 16 0 542 662 ;
+C -1 ; WX 722 ; N Omacron ; B 34 -14 688 813 ;
+C -1 ; WX 667 ; N Racute ; B 17 0 659 890 ;
+C -1 ; WX 556 ; N Sacute ; B 42 -14 491 890 ;
+C -1 ; WX 588 ; N dcaron ; B 27 -10 589 695 ;
+C -1 ; WX 722 ; N Umacron ; B 14 -14 705 813 ;
+C -1 ; WX 500 ; N uring ; B 9 -10 479 711 ;
+C -1 ; WX 300 ; N threesuperior ; B 15 262 291 676 ;
+C -1 ; WX 722 ; N Ograve ; B 34 -14 688 890 ;
+C -1 ; WX 722 ; N Agrave ; B 15 0 706 890 ;
+C -1 ; WX 722 ; N Abreve ; B 15 0 706 876 ;
+C -1 ; WX 564 ; N multiply ; B 38 8 527 497 ;
+C -1 ; WX 500 ; N uacute ; B 9 -10 479 678 ;
+C -1 ; WX 611 ; N Tcaron ; B 17 0 593 886 ;
+C -1 ; WX 476 ; N partialdiff ; B 17 -38 459 710 ;
+C -1 ; WX 500 ; N ydieresis ; B 14 -218 475 623 ;
+C -1 ; WX 722 ; N Nacute ; B 12 -11 707 890 ;
+C -1 ; WX 278 ; N icircumflex ; B -16 0 295 674 ;
+C -1 ; WX 611 ; N Ecircumflex ; B 12 0 597 886 ;
+C -1 ; WX 444 ; N adieresis ; B 37 -10 442 623 ;
+C -1 ; WX 444 ; N edieresis ; B 25 -10 424 623 ;
+C -1 ; WX 444 ; N cacute ; B 25 -10 413 678 ;
+C -1 ; WX 500 ; N nacute ; B 16 0 485 678 ;
+C -1 ; WX 500 ; N umacron ; B 9 -10 479 601 ;
+C -1 ; WX 722 ; N Ncaron ; B 12 -11 707 886 ;
+C -1 ; WX 333 ; N Iacute ; B 18 0 317 890 ;
+C -1 ; WX 564 ; N plusminus ; B 30 0 534 506 ;
+C -1 ; WX 200 ; N brokenbar ; B 67 -143 133 707 ;
+C -1 ; WX 760 ; N registered ; B 38 -14 722 676 ;
+C -1 ; WX 722 ; N Gbreve ; B 32 -14 709 876 ;
+C -1 ; WX 333 ; N Idotaccent ; B 18 0 315 835 ;
+C -1 ; WX 600 ; N summation ; B 15 -10 585 706 ;
+C -1 ; WX 611 ; N Egrave ; B 12 0 597 890 ;
+C -1 ; WX 333 ; N racute ; B 5 0 335 678 ;
+C -1 ; WX 500 ; N omacron ; B 29 -10 470 601 ;
+C -1 ; WX 611 ; N Zacute ; B 9 0 597 890 ;
+C -1 ; WX 611 ; N Zcaron ; B 9 0 597 886 ;
+C -1 ; WX 549 ; N greaterequal ; B 26 0 523 666 ;
+C -1 ; WX 722 ; N Eth ; B 16 0 685 662 ;
+C -1 ; WX 667 ; N Ccedilla ; B 28 -215 633 676 ;
+C -1 ; WX 278 ; N lcommaaccent ; B 19 -218 257 683 ;
+C -1 ; WX 326 ; N tcaron ; B 13 -10 318 722 ;
+C -1 ; WX 444 ; N eogonek ; B 25 -165 424 460 ;
+C -1 ; WX 722 ; N Uogonek ; B 14 -165 705 662 ;
+C -1 ; WX 722 ; N Aacute ; B 15 0 706 890 ;
+C -1 ; WX 722 ; N Adieresis ; B 15 0 706 835 ;
+C -1 ; WX 444 ; N egrave ; B 25 -10 424 678 ;
+C -1 ; WX 444 ; N zacute ; B 27 0 418 678 ;
+C -1 ; WX 278 ; N iogonek ; B 16 -165 265 683 ;
+C -1 ; WX 722 ; N Oacute ; B 34 -14 688 890 ;
+C -1 ; WX 500 ; N oacute ; B 29 -10 470 678 ;
+C -1 ; WX 444 ; N amacron ; B 37 -10 442 601 ;
+C -1 ; WX 389 ; N sacute ; B 51 -10 348 678 ;
+C -1 ; WX 278 ; N idieresis ; B -9 0 288 623 ;
+C -1 ; WX 722 ; N Ocircumflex ; B 34 -14 688 886 ;
+C -1 ; WX 722 ; N Ugrave ; B 14 -14 705 890 ;
+C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ;
+C -1 ; WX 500 ; N thorn ; B 5 -217 470 683 ;
+C -1 ; WX 300 ; N twosuperior ; B 1 270 296 676 ;
+C -1 ; WX 722 ; N Odieresis ; B 34 -14 688 835 ;
+C -1 ; WX 500 ; N mu ; B 36 -218 512 450 ;
+C -1 ; WX 278 ; N igrave ; B -8 0 253 678 ;
+C -1 ; WX 500 ; N ohungarumlaut ; B 29 -10 491 678 ;
+C -1 ; WX 611 ; N Eogonek ; B 12 -165 597 662 ;
+C -1 ; WX 500 ; N dcroat ; B 27 -10 500 683 ;
+C -1 ; WX 750 ; N threequarters ; B 15 -14 718 676 ;
+C -1 ; WX 556 ; N Scedilla ; B 42 -215 491 676 ;
+C -1 ; WX 344 ; N lcaron ; B 19 0 347 695 ;
+C -1 ; WX 722 ; N Kcommaaccent ; B 34 -198 723 662 ;
+C -1 ; WX 611 ; N Lacute ; B 12 0 598 890 ;
+C -1 ; WX 980 ; N trademark ; B 30 256 957 662 ;
+C -1 ; WX 444 ; N edotaccent ; B 25 -10 424 623 ;
+C -1 ; WX 333 ; N Igrave ; B 18 0 315 890 ;
+C -1 ; WX 333 ; N Imacron ; B 11 0 322 813 ;
+C -1 ; WX 611 ; N Lcaron ; B 12 0 598 676 ;
+C -1 ; WX 750 ; N onehalf ; B 31 -14 746 676 ;
+C -1 ; WX 549 ; N lessequal ; B 26 0 523 666 ;
+C -1 ; WX 500 ; N ocircumflex ; B 29 -10 470 674 ;
+C -1 ; WX 500 ; N ntilde ; B 16 0 485 638 ;
+C -1 ; WX 722 ; N Uhungarumlaut ; B 14 -14 705 890 ;
+C -1 ; WX 611 ; N Eacute ; B 12 0 597 890 ;
+C -1 ; WX 444 ; N emacron ; B 25 -10 424 601 ;
+C -1 ; WX 500 ; N gbreve ; B 28 -218 470 664 ;
+C -1 ; WX 750 ; N onequarter ; B 37 -14 718 676 ;
+C -1 ; WX 556 ; N Scaron ; B 42 -14 491 886 ;
+C -1 ; WX 556 ; N Scommaaccent ; B 42 -218 491 676 ;
+C -1 ; WX 722 ; N Ohungarumlaut ; B 34 -14 688 890 ;
+C -1 ; WX 400 ; N degree ; B 57 390 343 676 ;
+C -1 ; WX 500 ; N ograve ; B 29 -10 470 678 ;
+C -1 ; WX 667 ; N Ccaron ; B 28 -14 633 886 ;
+C -1 ; WX 500 ; N ugrave ; B 9 -10 479 678 ;
+C -1 ; WX 453 ; N radical ; B 2 -60 452 768 ;
+C -1 ; WX 722 ; N Dcaron ; B 16 0 685 886 ;
+C -1 ; WX 333 ; N rcommaaccent ; B 5 -218 335 460 ;
+C -1 ; WX 722 ; N Ntilde ; B 12 -11 707 850 ;
+C -1 ; WX 500 ; N otilde ; B 29 -10 470 638 ;
+C -1 ; WX 667 ; N Rcommaaccent ; B 17 -198 659 662 ;
+C -1 ; WX 611 ; N Lcommaaccent ; B 12 -218 598 662 ;
+C -1 ; WX 722 ; N Atilde ; B 15 0 706 850 ;
+C -1 ; WX 722 ; N Aogonek ; B 15 -165 738 674 ;
+C -1 ; WX 722 ; N Aring ; B 15 0 706 898 ;
+C -1 ; WX 722 ; N Otilde ; B 34 -14 688 850 ;
+C -1 ; WX 444 ; N zdotaccent ; B 27 0 418 623 ;
+C -1 ; WX 611 ; N Ecaron ; B 12 0 597 886 ;
+C -1 ; WX 333 ; N Iogonek ; B 18 -165 315 662 ;
+C -1 ; WX 500 ; N kcommaaccent ; B 7 -218 505 683 ;
+C -1 ; WX 564 ; N minus ; B 30 220 534 286 ;
+C -1 ; WX 333 ; N Icircumflex ; B 11 0 322 886 ;
+C -1 ; WX 500 ; N ncaron ; B 16 0 485 674 ;
+C -1 ; WX 278 ; N tcommaaccent ; B 13 -218 279 579 ;
+C -1 ; WX 564 ; N logicalnot ; B 30 108 534 386 ;
+C -1 ; WX 500 ; N odieresis ; B 29 -10 470 623 ;
+C -1 ; WX 500 ; N udieresis ; B 9 -10 479 623 ;
+C -1 ; WX 549 ; N notequal ; B 12 -31 537 547 ;
+C -1 ; WX 500 ; N gcommaaccent ; B 28 -218 470 749 ;
+C -1 ; WX 500 ; N eth ; B 29 -10 471 686 ;
+C -1 ; WX 444 ; N zcaron ; B 27 0 418 674 ;
+C -1 ; WX 500 ; N ncommaaccent ; B 16 -218 485 460 ;
+C -1 ; WX 300 ; N onesuperior ; B 57 270 248 676 ;
+C -1 ; WX 278 ; N imacron ; B 6 0 271 601 ;
+EndCharMetrics
+StartKernData
+StartKernPairs 2073
+KPX A C -40
+KPX A Cacute -40
+KPX A Ccaron -40
+KPX A Ccedilla -40
+KPX A G -40
+KPX A Gbreve -40
+KPX A Gcommaaccent -40
+KPX A O -55
+KPX A Oacute -55
+KPX A Ocircumflex -55
+KPX A Odieresis -55
+KPX A Ograve -55
+KPX A Ohungarumlaut -55
+KPX A Omacron -55
+KPX A Oslash -55
+KPX A Otilde -55
+KPX A Q -55
+KPX A T -111
+KPX A Tcaron -111
+KPX A Tcommaaccent -111
+KPX A U -55
+KPX A Uacute -55
+KPX A Ucircumflex -55
+KPX A Udieresis -55
+KPX A Ugrave -55
+KPX A Uhungarumlaut -55
+KPX A Umacron -55
+KPX A Uogonek -55
+KPX A Uring -55
+KPX A V -135
+KPX A W -90
+KPX A Y -105
+KPX A Yacute -105
+KPX A Ydieresis -105
+KPX A quoteright -111
+KPX A v -74
+KPX A w -92
+KPX A y -92
+KPX A yacute -92
+KPX A ydieresis -92
+KPX Aacute C -40
+KPX Aacute Cacute -40
+KPX Aacute Ccaron -40
+KPX Aacute Ccedilla -40
+KPX Aacute G -40
+KPX Aacute Gbreve -40
+KPX Aacute Gcommaaccent -40
+KPX Aacute O -55
+KPX Aacute Oacute -55
+KPX Aacute Ocircumflex -55
+KPX Aacute Odieresis -55
+KPX Aacute Ograve -55
+KPX Aacute Ohungarumlaut -55
+KPX Aacute Omacron -55
+KPX Aacute Oslash -55
+KPX Aacute Otilde -55
+KPX Aacute Q -55
+KPX Aacute T -111
+KPX Aacute Tcaron -111
+KPX Aacute Tcommaaccent -111
+KPX Aacute U -55
+KPX Aacute Uacute -55
+KPX Aacute Ucircumflex -55
+KPX Aacute Udieresis -55
+KPX Aacute Ugrave -55
+KPX Aacute Uhungarumlaut -55
+KPX Aacute Umacron -55
+KPX Aacute Uogonek -55
+KPX Aacute Uring -55
+KPX Aacute V -135
+KPX Aacute W -90
+KPX Aacute Y -105
+KPX Aacute Yacute -105
+KPX Aacute Ydieresis -105
+KPX Aacute quoteright -111
+KPX Aacute v -74
+KPX Aacute w -92
+KPX Aacute y -92
+KPX Aacute yacute -92
+KPX Aacute ydieresis -92
+KPX Abreve C -40
+KPX Abreve Cacute -40
+KPX Abreve Ccaron -40
+KPX Abreve Ccedilla -40
+KPX Abreve G -40
+KPX Abreve Gbreve -40
+KPX Abreve Gcommaaccent -40
+KPX Abreve O -55
+KPX Abreve Oacute -55
+KPX Abreve Ocircumflex -55
+KPX Abreve Odieresis -55
+KPX Abreve Ograve -55
+KPX Abreve Ohungarumlaut -55
+KPX Abreve Omacron -55
+KPX Abreve Oslash -55
+KPX Abreve Otilde -55
+KPX Abreve Q -55
+KPX Abreve T -111
+KPX Abreve Tcaron -111
+KPX Abreve Tcommaaccent -111
+KPX Abreve U -55
+KPX Abreve Uacute -55
+KPX Abreve Ucircumflex -55
+KPX Abreve Udieresis -55
+KPX Abreve Ugrave -55
+KPX Abreve Uhungarumlaut -55
+KPX Abreve Umacron -55
+KPX Abreve Uogonek -55
+KPX Abreve Uring -55
+KPX Abreve V -135
+KPX Abreve W -90
+KPX Abreve Y -105
+KPX Abreve Yacute -105
+KPX Abreve Ydieresis -105
+KPX Abreve quoteright -111
+KPX Abreve v -74
+KPX Abreve w -92
+KPX Abreve y -92
+KPX Abreve yacute -92
+KPX Abreve ydieresis -92
+KPX Acircumflex C -40
+KPX Acircumflex Cacute -40
+KPX Acircumflex Ccaron -40
+KPX Acircumflex Ccedilla -40
+KPX Acircumflex G -40
+KPX Acircumflex Gbreve -40
+KPX Acircumflex Gcommaaccent -40
+KPX Acircumflex O -55
+KPX Acircumflex Oacute -55
+KPX Acircumflex Ocircumflex -55
+KPX Acircumflex Odieresis -55
+KPX Acircumflex Ograve -55
+KPX Acircumflex Ohungarumlaut -55
+KPX Acircumflex Omacron -55
+KPX Acircumflex Oslash -55
+KPX Acircumflex Otilde -55
+KPX Acircumflex Q -55
+KPX Acircumflex T -111
+KPX Acircumflex Tcaron -111
+KPX Acircumflex Tcommaaccent -111
+KPX Acircumflex U -55
+KPX Acircumflex Uacute -55
+KPX Acircumflex Ucircumflex -55
+KPX Acircumflex Udieresis -55
+KPX Acircumflex Ugrave -55
+KPX Acircumflex Uhungarumlaut -55
+KPX Acircumflex Umacron -55
+KPX Acircumflex Uogonek -55
+KPX Acircumflex Uring -55
+KPX Acircumflex V -135
+KPX Acircumflex W -90
+KPX Acircumflex Y -105
+KPX Acircumflex Yacute -105
+KPX Acircumflex Ydieresis -105
+KPX Acircumflex quoteright -111
+KPX Acircumflex v -74
+KPX Acircumflex w -92
+KPX Acircumflex y -92
+KPX Acircumflex yacute -92
+KPX Acircumflex ydieresis -92
+KPX Adieresis C -40
+KPX Adieresis Cacute -40
+KPX Adieresis Ccaron -40
+KPX Adieresis Ccedilla -40
+KPX Adieresis G -40
+KPX Adieresis Gbreve -40
+KPX Adieresis Gcommaaccent -40
+KPX Adieresis O -55
+KPX Adieresis Oacute -55
+KPX Adieresis Ocircumflex -55
+KPX Adieresis Odieresis -55
+KPX Adieresis Ograve -55
+KPX Adieresis Ohungarumlaut -55
+KPX Adieresis Omacron -55
+KPX Adieresis Oslash -55
+KPX Adieresis Otilde -55
+KPX Adieresis Q -55
+KPX Adieresis T -111
+KPX Adieresis Tcaron -111
+KPX Adieresis Tcommaaccent -111
+KPX Adieresis U -55
+KPX Adieresis Uacute -55
+KPX Adieresis Ucircumflex -55
+KPX Adieresis Udieresis -55
+KPX Adieresis Ugrave -55
+KPX Adieresis Uhungarumlaut -55
+KPX Adieresis Umacron -55
+KPX Adieresis Uogonek -55
+KPX Adieresis Uring -55
+KPX Adieresis V -135
+KPX Adieresis W -90
+KPX Adieresis Y -105
+KPX Adieresis Yacute -105
+KPX Adieresis Ydieresis -105
+KPX Adieresis quoteright -111
+KPX Adieresis v -74
+KPX Adieresis w -92
+KPX Adieresis y -92
+KPX Adieresis yacute -92
+KPX Adieresis ydieresis -92
+KPX Agrave C -40
+KPX Agrave Cacute -40
+KPX Agrave Ccaron -40
+KPX Agrave Ccedilla -40
+KPX Agrave G -40
+KPX Agrave Gbreve -40
+KPX Agrave Gcommaaccent -40
+KPX Agrave O -55
+KPX Agrave Oacute -55
+KPX Agrave Ocircumflex -55
+KPX Agrave Odieresis -55
+KPX Agrave Ograve -55
+KPX Agrave Ohungarumlaut -55
+KPX Agrave Omacron -55
+KPX Agrave Oslash -55
+KPX Agrave Otilde -55
+KPX Agrave Q -55
+KPX Agrave T -111
+KPX Agrave Tcaron -111
+KPX Agrave Tcommaaccent -111
+KPX Agrave U -55
+KPX Agrave Uacute -55
+KPX Agrave Ucircumflex -55
+KPX Agrave Udieresis -55
+KPX Agrave Ugrave -55
+KPX Agrave Uhungarumlaut -55
+KPX Agrave Umacron -55
+KPX Agrave Uogonek -55
+KPX Agrave Uring -55
+KPX Agrave V -135
+KPX Agrave W -90
+KPX Agrave Y -105
+KPX Agrave Yacute -105
+KPX Agrave Ydieresis -105
+KPX Agrave quoteright -111
+KPX Agrave v -74
+KPX Agrave w -92
+KPX Agrave y -92
+KPX Agrave yacute -92
+KPX Agrave ydieresis -92
+KPX Amacron C -40
+KPX Amacron Cacute -40
+KPX Amacron Ccaron -40
+KPX Amacron Ccedilla -40
+KPX Amacron G -40
+KPX Amacron Gbreve -40
+KPX Amacron Gcommaaccent -40
+KPX Amacron O -55
+KPX Amacron Oacute -55
+KPX Amacron Ocircumflex -55
+KPX Amacron Odieresis -55
+KPX Amacron Ograve -55
+KPX Amacron Ohungarumlaut -55
+KPX Amacron Omacron -55
+KPX Amacron Oslash -55
+KPX Amacron Otilde -55
+KPX Amacron Q -55
+KPX Amacron T -111
+KPX Amacron Tcaron -111
+KPX Amacron Tcommaaccent -111
+KPX Amacron U -55
+KPX Amacron Uacute -55
+KPX Amacron Ucircumflex -55
+KPX Amacron Udieresis -55
+KPX Amacron Ugrave -55
+KPX Amacron Uhungarumlaut -55
+KPX Amacron Umacron -55
+KPX Amacron Uogonek -55
+KPX Amacron Uring -55
+KPX Amacron V -135
+KPX Amacron W -90
+KPX Amacron Y -105
+KPX Amacron Yacute -105
+KPX Amacron Ydieresis -105
+KPX Amacron quoteright -111
+KPX Amacron v -74
+KPX Amacron w -92
+KPX Amacron y -92
+KPX Amacron yacute -92
+KPX Amacron ydieresis -92
+KPX Aogonek C -40
+KPX Aogonek Cacute -40
+KPX Aogonek Ccaron -40
+KPX Aogonek Ccedilla -40
+KPX Aogonek G -40
+KPX Aogonek Gbreve -40
+KPX Aogonek Gcommaaccent -40
+KPX Aogonek O -55
+KPX Aogonek Oacute -55
+KPX Aogonek Ocircumflex -55
+KPX Aogonek Odieresis -55
+KPX Aogonek Ograve -55
+KPX Aogonek Ohungarumlaut -55
+KPX Aogonek Omacron -55
+KPX Aogonek Oslash -55
+KPX Aogonek Otilde -55
+KPX Aogonek Q -55
+KPX Aogonek T -111
+KPX Aogonek Tcaron -111
+KPX Aogonek Tcommaaccent -111
+KPX Aogonek U -55
+KPX Aogonek Uacute -55
+KPX Aogonek Ucircumflex -55
+KPX Aogonek Udieresis -55
+KPX Aogonek Ugrave -55
+KPX Aogonek Uhungarumlaut -55
+KPX Aogonek Umacron -55
+KPX Aogonek Uogonek -55
+KPX Aogonek Uring -55
+KPX Aogonek V -135
+KPX Aogonek W -90
+KPX Aogonek Y -105
+KPX Aogonek Yacute -105
+KPX Aogonek Ydieresis -105
+KPX Aogonek quoteright -111
+KPX Aogonek v -74
+KPX Aogonek w -52
+KPX Aogonek y -52
+KPX Aogonek yacute -52
+KPX Aogonek ydieresis -52
+KPX Aring C -40
+KPX Aring Cacute -40
+KPX Aring Ccaron -40
+KPX Aring Ccedilla -40
+KPX Aring G -40
+KPX Aring Gbreve -40
+KPX Aring Gcommaaccent -40
+KPX Aring O -55
+KPX Aring Oacute -55
+KPX Aring Ocircumflex -55
+KPX Aring Odieresis -55
+KPX Aring Ograve -55
+KPX Aring Ohungarumlaut -55
+KPX Aring Omacron -55
+KPX Aring Oslash -55
+KPX Aring Otilde -55
+KPX Aring Q -55
+KPX Aring T -111
+KPX Aring Tcaron -111
+KPX Aring Tcommaaccent -111
+KPX Aring U -55
+KPX Aring Uacute -55
+KPX Aring Ucircumflex -55
+KPX Aring Udieresis -55
+KPX Aring Ugrave -55
+KPX Aring Uhungarumlaut -55
+KPX Aring Umacron -55
+KPX Aring Uogonek -55
+KPX Aring Uring -55
+KPX Aring V -135
+KPX Aring W -90
+KPX Aring Y -105
+KPX Aring Yacute -105
+KPX Aring Ydieresis -105
+KPX Aring quoteright -111
+KPX Aring v -74
+KPX Aring w -92
+KPX Aring y -92
+KPX Aring yacute -92
+KPX Aring ydieresis -92
+KPX Atilde C -40
+KPX Atilde Cacute -40
+KPX Atilde Ccaron -40
+KPX Atilde Ccedilla -40
+KPX Atilde G -40
+KPX Atilde Gbreve -40
+KPX Atilde Gcommaaccent -40
+KPX Atilde O -55
+KPX Atilde Oacute -55
+KPX Atilde Ocircumflex -55
+KPX Atilde Odieresis -55
+KPX Atilde Ograve -55
+KPX Atilde Ohungarumlaut -55
+KPX Atilde Omacron -55
+KPX Atilde Oslash -55
+KPX Atilde Otilde -55
+KPX Atilde Q -55
+KPX Atilde T -111
+KPX Atilde Tcaron -111
+KPX Atilde Tcommaaccent -111
+KPX Atilde U -55
+KPX Atilde Uacute -55
+KPX Atilde Ucircumflex -55
+KPX Atilde Udieresis -55
+KPX Atilde Ugrave -55
+KPX Atilde Uhungarumlaut -55
+KPX Atilde Umacron -55
+KPX Atilde Uogonek -55
+KPX Atilde Uring -55
+KPX Atilde V -135
+KPX Atilde W -90
+KPX Atilde Y -105
+KPX Atilde Yacute -105
+KPX Atilde Ydieresis -105
+KPX Atilde quoteright -111
+KPX Atilde v -74
+KPX Atilde w -92
+KPX Atilde y -92
+KPX Atilde yacute -92
+KPX Atilde ydieresis -92
+KPX B A -35
+KPX B Aacute -35
+KPX B Abreve -35
+KPX B Acircumflex -35
+KPX B Adieresis -35
+KPX B Agrave -35
+KPX B Amacron -35
+KPX B Aogonek -35
+KPX B Aring -35
+KPX B Atilde -35
+KPX B U -10
+KPX B Uacute -10
+KPX B Ucircumflex -10
+KPX B Udieresis -10
+KPX B Ugrave -10
+KPX B Uhungarumlaut -10
+KPX B Umacron -10
+KPX B Uogonek -10
+KPX B Uring -10
+KPX D A -40
+KPX D Aacute -40
+KPX D Abreve -40
+KPX D Acircumflex -40
+KPX D Adieresis -40
+KPX D Agrave -40
+KPX D Amacron -40
+KPX D Aogonek -40
+KPX D Aring -40
+KPX D Atilde -40
+KPX D V -40
+KPX D W -30
+KPX D Y -55
+KPX D Yacute -55
+KPX D Ydieresis -55
+KPX Dcaron A -40
+KPX Dcaron Aacute -40
+KPX Dcaron Abreve -40
+KPX Dcaron Acircumflex -40
+KPX Dcaron Adieresis -40
+KPX Dcaron Agrave -40
+KPX Dcaron Amacron -40
+KPX Dcaron Aogonek -40
+KPX Dcaron Aring -40
+KPX Dcaron Atilde -40
+KPX Dcaron V -40
+KPX Dcaron W -30
+KPX Dcaron Y -55
+KPX Dcaron Yacute -55
+KPX Dcaron Ydieresis -55
+KPX Dcroat A -40
+KPX Dcroat Aacute -40
+KPX Dcroat Abreve -40
+KPX Dcroat Acircumflex -40
+KPX Dcroat Adieresis -40
+KPX Dcroat Agrave -40
+KPX Dcroat Amacron -40
+KPX Dcroat Aogonek -40
+KPX Dcroat Aring -40
+KPX Dcroat Atilde -40
+KPX Dcroat V -40
+KPX Dcroat W -30
+KPX Dcroat Y -55
+KPX Dcroat Yacute -55
+KPX Dcroat Ydieresis -55
+KPX F A -74
+KPX F Aacute -74
+KPX F Abreve -74
+KPX F Acircumflex -74
+KPX F Adieresis -74
+KPX F Agrave -74
+KPX F Amacron -74
+KPX F Aogonek -74
+KPX F Aring -74
+KPX F Atilde -74
+KPX F a -15
+KPX F aacute -15
+KPX F abreve -15
+KPX F acircumflex -15
+KPX F adieresis -15
+KPX F agrave -15
+KPX F amacron -15
+KPX F aogonek -15
+KPX F aring -15
+KPX F atilde -15
+KPX F comma -80
+KPX F o -15
+KPX F oacute -15
+KPX F ocircumflex -15
+KPX F odieresis -15
+KPX F ograve -15
+KPX F ohungarumlaut -15
+KPX F omacron -15
+KPX F oslash -15
+KPX F otilde -15
+KPX F period -80
+KPX J A -60
+KPX J Aacute -60
+KPX J Abreve -60
+KPX J Acircumflex -60
+KPX J Adieresis -60
+KPX J Agrave -60
+KPX J Amacron -60
+KPX J Aogonek -60
+KPX J Aring -60
+KPX J Atilde -60
+KPX K O -30
+KPX K Oacute -30
+KPX K Ocircumflex -30
+KPX K Odieresis -30
+KPX K Ograve -30
+KPX K Ohungarumlaut -30
+KPX K Omacron -30
+KPX K Oslash -30
+KPX K Otilde -30
+KPX K e -25
+KPX K eacute -25
+KPX K ecaron -25
+KPX K ecircumflex -25
+KPX K edieresis -25
+KPX K edotaccent -25
+KPX K egrave -25
+KPX K emacron -25
+KPX K eogonek -25
+KPX K o -35
+KPX K oacute -35
+KPX K ocircumflex -35
+KPX K odieresis -35
+KPX K ograve -35
+KPX K ohungarumlaut -35
+KPX K omacron -35
+KPX K oslash -35
+KPX K otilde -35
+KPX K u -15
+KPX K uacute -15
+KPX K ucircumflex -15
+KPX K udieresis -15
+KPX K ugrave -15
+KPX K uhungarumlaut -15
+KPX K umacron -15
+KPX K uogonek -15
+KPX K uring -15
+KPX K y -25
+KPX K yacute -25
+KPX K ydieresis -25
+KPX Kcommaaccent O -30
+KPX Kcommaaccent Oacute -30
+KPX Kcommaaccent Ocircumflex -30
+KPX Kcommaaccent Odieresis -30
+KPX Kcommaaccent Ograve -30
+KPX Kcommaaccent Ohungarumlaut -30
+KPX Kcommaaccent Omacron -30
+KPX Kcommaaccent Oslash -30
+KPX Kcommaaccent Otilde -30
+KPX Kcommaaccent e -25
+KPX Kcommaaccent eacute -25
+KPX Kcommaaccent ecaron -25
+KPX Kcommaaccent ecircumflex -25
+KPX Kcommaaccent edieresis -25
+KPX Kcommaaccent edotaccent -25
+KPX Kcommaaccent egrave -25
+KPX Kcommaaccent emacron -25
+KPX Kcommaaccent eogonek -25
+KPX Kcommaaccent o -35
+KPX Kcommaaccent oacute -35
+KPX Kcommaaccent ocircumflex -35
+KPX Kcommaaccent odieresis -35
+KPX Kcommaaccent ograve -35
+KPX Kcommaaccent ohungarumlaut -35
+KPX Kcommaaccent omacron -35
+KPX Kcommaaccent oslash -35
+KPX Kcommaaccent otilde -35
+KPX Kcommaaccent u -15
+KPX Kcommaaccent uacute -15
+KPX Kcommaaccent ucircumflex -15
+KPX Kcommaaccent udieresis -15
+KPX Kcommaaccent ugrave -15
+KPX Kcommaaccent uhungarumlaut -15
+KPX Kcommaaccent umacron -15
+KPX Kcommaaccent uogonek -15
+KPX Kcommaaccent uring -15
+KPX Kcommaaccent y -25
+KPX Kcommaaccent yacute -25
+KPX Kcommaaccent ydieresis -25
+KPX L T -92
+KPX L Tcaron -92
+KPX L Tcommaaccent -92
+KPX L V -100
+KPX L W -74
+KPX L Y -100
+KPX L Yacute -100
+KPX L Ydieresis -100
+KPX L quoteright -92
+KPX L y -55
+KPX L yacute -55
+KPX L ydieresis -55
+KPX Lacute T -92
+KPX Lacute Tcaron -92
+KPX Lacute Tcommaaccent -92
+KPX Lacute V -100
+KPX Lacute W -74
+KPX Lacute Y -100
+KPX Lacute Yacute -100
+KPX Lacute Ydieresis -100
+KPX Lacute quoteright -92
+KPX Lacute y -55
+KPX Lacute yacute -55
+KPX Lacute ydieresis -55
+KPX Lcaron quoteright -92
+KPX Lcaron y -55
+KPX Lcaron yacute -55
+KPX Lcaron ydieresis -55
+KPX Lcommaaccent T -92
+KPX Lcommaaccent Tcaron -92
+KPX Lcommaaccent Tcommaaccent -92
+KPX Lcommaaccent V -100
+KPX Lcommaaccent W -74
+KPX Lcommaaccent Y -100
+KPX Lcommaaccent Yacute -100
+KPX Lcommaaccent Ydieresis -100
+KPX Lcommaaccent quoteright -92
+KPX Lcommaaccent y -55
+KPX Lcommaaccent yacute -55
+KPX Lcommaaccent ydieresis -55
+KPX Lslash T -92
+KPX Lslash Tcaron -92
+KPX Lslash Tcommaaccent -92
+KPX Lslash V -100
+KPX Lslash W -74
+KPX Lslash Y -100
+KPX Lslash Yacute -100
+KPX Lslash Ydieresis -100
+KPX Lslash quoteright -92
+KPX Lslash y -55
+KPX Lslash yacute -55
+KPX Lslash ydieresis -55
+KPX N A -35
+KPX N Aacute -35
+KPX N Abreve -35
+KPX N Acircumflex -35
+KPX N Adieresis -35
+KPX N Agrave -35
+KPX N Amacron -35
+KPX N Aogonek -35
+KPX N Aring -35
+KPX N Atilde -35
+KPX Nacute A -35
+KPX Nacute Aacute -35
+KPX Nacute Abreve -35
+KPX Nacute Acircumflex -35
+KPX Nacute Adieresis -35
+KPX Nacute Agrave -35
+KPX Nacute Amacron -35
+KPX Nacute Aogonek -35
+KPX Nacute Aring -35
+KPX Nacute Atilde -35
+KPX Ncaron A -35
+KPX Ncaron Aacute -35
+KPX Ncaron Abreve -35
+KPX Ncaron Acircumflex -35
+KPX Ncaron Adieresis -35
+KPX Ncaron Agrave -35
+KPX Ncaron Amacron -35
+KPX Ncaron Aogonek -35
+KPX Ncaron Aring -35
+KPX Ncaron Atilde -35
+KPX Ncommaaccent A -35
+KPX Ncommaaccent Aacute -35
+KPX Ncommaaccent Abreve -35
+KPX Ncommaaccent Acircumflex -35
+KPX Ncommaaccent Adieresis -35
+KPX Ncommaaccent Agrave -35
+KPX Ncommaaccent Amacron -35
+KPX Ncommaaccent Aogonek -35
+KPX Ncommaaccent Aring -35
+KPX Ncommaaccent Atilde -35
+KPX Ntilde A -35
+KPX Ntilde Aacute -35
+KPX Ntilde Abreve -35
+KPX Ntilde Acircumflex -35
+KPX Ntilde Adieresis -35
+KPX Ntilde Agrave -35
+KPX Ntilde Amacron -35
+KPX Ntilde Aogonek -35
+KPX Ntilde Aring -35
+KPX Ntilde Atilde -35
+KPX O A -35
+KPX O Aacute -35
+KPX O Abreve -35
+KPX O Acircumflex -35
+KPX O Adieresis -35
+KPX O Agrave -35
+KPX O Amacron -35
+KPX O Aogonek -35
+KPX O Aring -35
+KPX O Atilde -35
+KPX O T -40
+KPX O Tcaron -40
+KPX O Tcommaaccent -40
+KPX O V -50
+KPX O W -35
+KPX O X -40
+KPX O Y -50
+KPX O Yacute -50
+KPX O Ydieresis -50
+KPX Oacute A -35
+KPX Oacute Aacute -35
+KPX Oacute Abreve -35
+KPX Oacute Acircumflex -35
+KPX Oacute Adieresis -35
+KPX Oacute Agrave -35
+KPX Oacute Amacron -35
+KPX Oacute Aogonek -35
+KPX Oacute Aring -35
+KPX Oacute Atilde -35
+KPX Oacute T -40
+KPX Oacute Tcaron -40
+KPX Oacute Tcommaaccent -40
+KPX Oacute V -50
+KPX Oacute W -35
+KPX Oacute X -40
+KPX Oacute Y -50
+KPX Oacute Yacute -50
+KPX Oacute Ydieresis -50
+KPX Ocircumflex A -35
+KPX Ocircumflex Aacute -35
+KPX Ocircumflex Abreve -35
+KPX Ocircumflex Acircumflex -35
+KPX Ocircumflex Adieresis -35
+KPX Ocircumflex Agrave -35
+KPX Ocircumflex Amacron -35
+KPX Ocircumflex Aogonek -35
+KPX Ocircumflex Aring -35
+KPX Ocircumflex Atilde -35
+KPX Ocircumflex T -40
+KPX Ocircumflex Tcaron -40
+KPX Ocircumflex Tcommaaccent -40
+KPX Ocircumflex V -50
+KPX Ocircumflex W -35
+KPX Ocircumflex X -40
+KPX Ocircumflex Y -50
+KPX Ocircumflex Yacute -50
+KPX Ocircumflex Ydieresis -50
+KPX Odieresis A -35
+KPX Odieresis Aacute -35
+KPX Odieresis Abreve -35
+KPX Odieresis Acircumflex -35
+KPX Odieresis Adieresis -35
+KPX Odieresis Agrave -35
+KPX Odieresis Amacron -35
+KPX Odieresis Aogonek -35
+KPX Odieresis Aring -35
+KPX Odieresis Atilde -35
+KPX Odieresis T -40
+KPX Odieresis Tcaron -40
+KPX Odieresis Tcommaaccent -40
+KPX Odieresis V -50
+KPX Odieresis W -35
+KPX Odieresis X -40
+KPX Odieresis Y -50
+KPX Odieresis Yacute -50
+KPX Odieresis Ydieresis -50
+KPX Ograve A -35
+KPX Ograve Aacute -35
+KPX Ograve Abreve -35
+KPX Ograve Acircumflex -35
+KPX Ograve Adieresis -35
+KPX Ograve Agrave -35
+KPX Ograve Amacron -35
+KPX Ograve Aogonek -35
+KPX Ograve Aring -35
+KPX Ograve Atilde -35
+KPX Ograve T -40
+KPX Ograve Tcaron -40
+KPX Ograve Tcommaaccent -40
+KPX Ograve V -50
+KPX Ograve W -35
+KPX Ograve X -40
+KPX Ograve Y -50
+KPX Ograve Yacute -50
+KPX Ograve Ydieresis -50
+KPX Ohungarumlaut A -35
+KPX Ohungarumlaut Aacute -35
+KPX Ohungarumlaut Abreve -35
+KPX Ohungarumlaut Acircumflex -35
+KPX Ohungarumlaut Adieresis -35
+KPX Ohungarumlaut Agrave -35
+KPX Ohungarumlaut Amacron -35
+KPX Ohungarumlaut Aogonek -35
+KPX Ohungarumlaut Aring -35
+KPX Ohungarumlaut Atilde -35
+KPX Ohungarumlaut T -40
+KPX Ohungarumlaut Tcaron -40
+KPX Ohungarumlaut Tcommaaccent -40
+KPX Ohungarumlaut V -50
+KPX Ohungarumlaut W -35
+KPX Ohungarumlaut X -40
+KPX Ohungarumlaut Y -50
+KPX Ohungarumlaut Yacute -50
+KPX Ohungarumlaut Ydieresis -50
+KPX Omacron A -35
+KPX Omacron Aacute -35
+KPX Omacron Abreve -35
+KPX Omacron Acircumflex -35
+KPX Omacron Adieresis -35
+KPX Omacron Agrave -35
+KPX Omacron Amacron -35
+KPX Omacron Aogonek -35
+KPX Omacron Aring -35
+KPX Omacron Atilde -35
+KPX Omacron T -40
+KPX Omacron Tcaron -40
+KPX Omacron Tcommaaccent -40
+KPX Omacron V -50
+KPX Omacron W -35
+KPX Omacron X -40
+KPX Omacron Y -50
+KPX Omacron Yacute -50
+KPX Omacron Ydieresis -50
+KPX Oslash A -35
+KPX Oslash Aacute -35
+KPX Oslash Abreve -35
+KPX Oslash Acircumflex -35
+KPX Oslash Adieresis -35
+KPX Oslash Agrave -35
+KPX Oslash Amacron -35
+KPX Oslash Aogonek -35
+KPX Oslash Aring -35
+KPX Oslash Atilde -35
+KPX Oslash T -40
+KPX Oslash Tcaron -40
+KPX Oslash Tcommaaccent -40
+KPX Oslash V -50
+KPX Oslash W -35
+KPX Oslash X -40
+KPX Oslash Y -50
+KPX Oslash Yacute -50
+KPX Oslash Ydieresis -50
+KPX Otilde A -35
+KPX Otilde Aacute -35
+KPX Otilde Abreve -35
+KPX Otilde Acircumflex -35
+KPX Otilde Adieresis -35
+KPX Otilde Agrave -35
+KPX Otilde Amacron -35
+KPX Otilde Aogonek -35
+KPX Otilde Aring -35
+KPX Otilde Atilde -35
+KPX Otilde T -40
+KPX Otilde Tcaron -40
+KPX Otilde Tcommaaccent -40
+KPX Otilde V -50
+KPX Otilde W -35
+KPX Otilde X -40
+KPX Otilde Y -50
+KPX Otilde Yacute -50
+KPX Otilde Ydieresis -50
+KPX P A -92
+KPX P Aacute -92
+KPX P Abreve -92
+KPX P Acircumflex -92
+KPX P Adieresis -92
+KPX P Agrave -92
+KPX P Amacron -92
+KPX P Aogonek -92
+KPX P Aring -92
+KPX P Atilde -92
+KPX P a -15
+KPX P aacute -15
+KPX P abreve -15
+KPX P acircumflex -15
+KPX P adieresis -15
+KPX P agrave -15
+KPX P amacron -15
+KPX P aogonek -15
+KPX P aring -15
+KPX P atilde -15
+KPX P comma -111
+KPX P period -111
+KPX Q U -10
+KPX Q Uacute -10
+KPX Q Ucircumflex -10
+KPX Q Udieresis -10
+KPX Q Ugrave -10
+KPX Q Uhungarumlaut -10
+KPX Q Umacron -10
+KPX Q Uogonek -10
+KPX Q Uring -10
+KPX R O -40
+KPX R Oacute -40
+KPX R Ocircumflex -40
+KPX R Odieresis -40
+KPX R Ograve -40
+KPX R Ohungarumlaut -40
+KPX R Omacron -40
+KPX R Oslash -40
+KPX R Otilde -40
+KPX R T -60
+KPX R Tcaron -60
+KPX R Tcommaaccent -60
+KPX R U -40
+KPX R Uacute -40
+KPX R Ucircumflex -40
+KPX R Udieresis -40
+KPX R Ugrave -40
+KPX R Uhungarumlaut -40
+KPX R Umacron -40
+KPX R Uogonek -40
+KPX R Uring -40
+KPX R V -80
+KPX R W -55
+KPX R Y -65
+KPX R Yacute -65
+KPX R Ydieresis -65
+KPX Racute O -40
+KPX Racute Oacute -40
+KPX Racute Ocircumflex -40
+KPX Racute Odieresis -40
+KPX Racute Ograve -40
+KPX Racute Ohungarumlaut -40
+KPX Racute Omacron -40
+KPX Racute Oslash -40
+KPX Racute Otilde -40
+KPX Racute T -60
+KPX Racute Tcaron -60
+KPX Racute Tcommaaccent -60
+KPX Racute U -40
+KPX Racute Uacute -40
+KPX Racute Ucircumflex -40
+KPX Racute Udieresis -40
+KPX Racute Ugrave -40
+KPX Racute Uhungarumlaut -40
+KPX Racute Umacron -40
+KPX Racute Uogonek -40
+KPX Racute Uring -40
+KPX Racute V -80
+KPX Racute W -55
+KPX Racute Y -65
+KPX Racute Yacute -65
+KPX Racute Ydieresis -65
+KPX Rcaron O -40
+KPX Rcaron Oacute -40
+KPX Rcaron Ocircumflex -40
+KPX Rcaron Odieresis -40
+KPX Rcaron Ograve -40
+KPX Rcaron Ohungarumlaut -40
+KPX Rcaron Omacron -40
+KPX Rcaron Oslash -40
+KPX Rcaron Otilde -40
+KPX Rcaron T -60
+KPX Rcaron Tcaron -60
+KPX Rcaron Tcommaaccent -60
+KPX Rcaron U -40
+KPX Rcaron Uacute -40
+KPX Rcaron Ucircumflex -40
+KPX Rcaron Udieresis -40
+KPX Rcaron Ugrave -40
+KPX Rcaron Uhungarumlaut -40
+KPX Rcaron Umacron -40
+KPX Rcaron Uogonek -40
+KPX Rcaron Uring -40
+KPX Rcaron V -80
+KPX Rcaron W -55
+KPX Rcaron Y -65
+KPX Rcaron Yacute -65
+KPX Rcaron Ydieresis -65
+KPX Rcommaaccent O -40
+KPX Rcommaaccent Oacute -40
+KPX Rcommaaccent Ocircumflex -40
+KPX Rcommaaccent Odieresis -40
+KPX Rcommaaccent Ograve -40
+KPX Rcommaaccent Ohungarumlaut -40
+KPX Rcommaaccent Omacron -40
+KPX Rcommaaccent Oslash -40
+KPX Rcommaaccent Otilde -40
+KPX Rcommaaccent T -60
+KPX Rcommaaccent Tcaron -60
+KPX Rcommaaccent Tcommaaccent -60
+KPX Rcommaaccent U -40
+KPX Rcommaaccent Uacute -40
+KPX Rcommaaccent Ucircumflex -40
+KPX Rcommaaccent Udieresis -40
+KPX Rcommaaccent Ugrave -40
+KPX Rcommaaccent Uhungarumlaut -40
+KPX Rcommaaccent Umacron -40
+KPX Rcommaaccent Uogonek -40
+KPX Rcommaaccent Uring -40
+KPX Rcommaaccent V -80
+KPX Rcommaaccent W -55
+KPX Rcommaaccent Y -65
+KPX Rcommaaccent Yacute -65
+KPX Rcommaaccent Ydieresis -65
+KPX T A -93
+KPX T Aacute -93
+KPX T Abreve -93
+KPX T Acircumflex -93
+KPX T Adieresis -93
+KPX T Agrave -93
+KPX T Amacron -93
+KPX T Aogonek -93
+KPX T Aring -93
+KPX T Atilde -93
+KPX T O -18
+KPX T Oacute -18
+KPX T Ocircumflex -18
+KPX T Odieresis -18
+KPX T Ograve -18
+KPX T Ohungarumlaut -18
+KPX T Omacron -18
+KPX T Oslash -18
+KPX T Otilde -18
+KPX T a -80
+KPX T aacute -80
+KPX T abreve -80
+KPX T acircumflex -80
+KPX T adieresis -40
+KPX T agrave -40
+KPX T amacron -40
+KPX T aogonek -80
+KPX T aring -80
+KPX T atilde -40
+KPX T colon -50
+KPX T comma -74
+KPX T e -70
+KPX T eacute -70
+KPX T ecaron -70
+KPX T ecircumflex -70
+KPX T edieresis -30
+KPX T edotaccent -70
+KPX T egrave -70
+KPX T emacron -30
+KPX T eogonek -70
+KPX T hyphen -92
+KPX T i -35
+KPX T iacute -35
+KPX T iogonek -35
+KPX T o -80
+KPX T oacute -80
+KPX T ocircumflex -80
+KPX T odieresis -80
+KPX T ograve -80
+KPX T ohungarumlaut -80
+KPX T omacron -80
+KPX T oslash -80
+KPX T otilde -80
+KPX T period -74
+KPX T r -35
+KPX T racute -35
+KPX T rcaron -35
+KPX T rcommaaccent -35
+KPX T semicolon -55
+KPX T u -45
+KPX T uacute -45
+KPX T ucircumflex -45
+KPX T udieresis -45
+KPX T ugrave -45
+KPX T uhungarumlaut -45
+KPX T umacron -45
+KPX T uogonek -45
+KPX T uring -45
+KPX T w -80
+KPX T y -80
+KPX T yacute -80
+KPX T ydieresis -80
+KPX Tcaron A -93
+KPX Tcaron Aacute -93
+KPX Tcaron Abreve -93
+KPX Tcaron Acircumflex -93
+KPX Tcaron Adieresis -93
+KPX Tcaron Agrave -93
+KPX Tcaron Amacron -93
+KPX Tcaron Aogonek -93
+KPX Tcaron Aring -93
+KPX Tcaron Atilde -93
+KPX Tcaron O -18
+KPX Tcaron Oacute -18
+KPX Tcaron Ocircumflex -18
+KPX Tcaron Odieresis -18
+KPX Tcaron Ograve -18
+KPX Tcaron Ohungarumlaut -18
+KPX Tcaron Omacron -18
+KPX Tcaron Oslash -18
+KPX Tcaron Otilde -18
+KPX Tcaron a -80
+KPX Tcaron aacute -80
+KPX Tcaron abreve -80
+KPX Tcaron acircumflex -80
+KPX Tcaron adieresis -40
+KPX Tcaron agrave -40
+KPX Tcaron amacron -40
+KPX Tcaron aogonek -80
+KPX Tcaron aring -80
+KPX Tcaron atilde -40
+KPX Tcaron colon -50
+KPX Tcaron comma -74
+KPX Tcaron e -70
+KPX Tcaron eacute -70
+KPX Tcaron ecaron -70
+KPX Tcaron ecircumflex -30
+KPX Tcaron edieresis -30
+KPX Tcaron edotaccent -70
+KPX Tcaron egrave -70
+KPX Tcaron emacron -30
+KPX Tcaron eogonek -70
+KPX Tcaron hyphen -92
+KPX Tcaron i -35
+KPX Tcaron iacute -35
+KPX Tcaron iogonek -35
+KPX Tcaron o -80
+KPX Tcaron oacute -80
+KPX Tcaron ocircumflex -80
+KPX Tcaron odieresis -80
+KPX Tcaron ograve -80
+KPX Tcaron ohungarumlaut -80
+KPX Tcaron omacron -80
+KPX Tcaron oslash -80
+KPX Tcaron otilde -80
+KPX Tcaron period -74
+KPX Tcaron r -35
+KPX Tcaron racute -35
+KPX Tcaron rcaron -35
+KPX Tcaron rcommaaccent -35
+KPX Tcaron semicolon -55
+KPX Tcaron u -45
+KPX Tcaron uacute -45
+KPX Tcaron ucircumflex -45
+KPX Tcaron udieresis -45
+KPX Tcaron ugrave -45
+KPX Tcaron uhungarumlaut -45
+KPX Tcaron umacron -45
+KPX Tcaron uogonek -45
+KPX Tcaron uring -45
+KPX Tcaron w -80
+KPX Tcaron y -80
+KPX Tcaron yacute -80
+KPX Tcaron ydieresis -80
+KPX Tcommaaccent A -93
+KPX Tcommaaccent Aacute -93
+KPX Tcommaaccent Abreve -93
+KPX Tcommaaccent Acircumflex -93
+KPX Tcommaaccent Adieresis -93
+KPX Tcommaaccent Agrave -93
+KPX Tcommaaccent Amacron -93
+KPX Tcommaaccent Aogonek -93
+KPX Tcommaaccent Aring -93
+KPX Tcommaaccent Atilde -93
+KPX Tcommaaccent O -18
+KPX Tcommaaccent Oacute -18
+KPX Tcommaaccent Ocircumflex -18
+KPX Tcommaaccent Odieresis -18
+KPX Tcommaaccent Ograve -18
+KPX Tcommaaccent Ohungarumlaut -18
+KPX Tcommaaccent Omacron -18
+KPX Tcommaaccent Oslash -18
+KPX Tcommaaccent Otilde -18
+KPX Tcommaaccent a -80
+KPX Tcommaaccent aacute -80
+KPX Tcommaaccent abreve -80
+KPX Tcommaaccent acircumflex -80
+KPX Tcommaaccent adieresis -40
+KPX Tcommaaccent agrave -40
+KPX Tcommaaccent amacron -40
+KPX Tcommaaccent aogonek -80
+KPX Tcommaaccent aring -80
+KPX Tcommaaccent atilde -40
+KPX Tcommaaccent colon -50
+KPX Tcommaaccent comma -74
+KPX Tcommaaccent e -70
+KPX Tcommaaccent eacute -70
+KPX Tcommaaccent ecaron -70
+KPX Tcommaaccent ecircumflex -30
+KPX Tcommaaccent edieresis -30
+KPX Tcommaaccent edotaccent -70
+KPX Tcommaaccent egrave -30
+KPX Tcommaaccent emacron -70
+KPX Tcommaaccent eogonek -70
+KPX Tcommaaccent hyphen -92
+KPX Tcommaaccent i -35
+KPX Tcommaaccent iacute -35
+KPX Tcommaaccent iogonek -35
+KPX Tcommaaccent o -80
+KPX Tcommaaccent oacute -80
+KPX Tcommaaccent ocircumflex -80
+KPX Tcommaaccent odieresis -80
+KPX Tcommaaccent ograve -80
+KPX Tcommaaccent ohungarumlaut -80
+KPX Tcommaaccent omacron -80
+KPX Tcommaaccent oslash -80
+KPX Tcommaaccent otilde -80
+KPX Tcommaaccent period -74
+KPX Tcommaaccent r -35
+KPX Tcommaaccent racute -35
+KPX Tcommaaccent rcaron -35
+KPX Tcommaaccent rcommaaccent -35
+KPX Tcommaaccent semicolon -55
+KPX Tcommaaccent u -45
+KPX Tcommaaccent uacute -45
+KPX Tcommaaccent ucircumflex -45
+KPX Tcommaaccent udieresis -45
+KPX Tcommaaccent ugrave -45
+KPX Tcommaaccent uhungarumlaut -45
+KPX Tcommaaccent umacron -45
+KPX Tcommaaccent uogonek -45
+KPX Tcommaaccent uring -45
+KPX Tcommaaccent w -80
+KPX Tcommaaccent y -80
+KPX Tcommaaccent yacute -80
+KPX Tcommaaccent ydieresis -80
+KPX U A -40
+KPX U Aacute -40
+KPX U Abreve -40
+KPX U Acircumflex -40
+KPX U Adieresis -40
+KPX U Agrave -40
+KPX U Amacron -40
+KPX U Aogonek -40
+KPX U Aring -40
+KPX U Atilde -40
+KPX Uacute A -40
+KPX Uacute Aacute -40
+KPX Uacute Abreve -40
+KPX Uacute Acircumflex -40
+KPX Uacute Adieresis -40
+KPX Uacute Agrave -40
+KPX Uacute Amacron -40
+KPX Uacute Aogonek -40
+KPX Uacute Aring -40
+KPX Uacute Atilde -40
+KPX Ucircumflex A -40
+KPX Ucircumflex Aacute -40
+KPX Ucircumflex Abreve -40
+KPX Ucircumflex Acircumflex -40
+KPX Ucircumflex Adieresis -40
+KPX Ucircumflex Agrave -40
+KPX Ucircumflex Amacron -40
+KPX Ucircumflex Aogonek -40
+KPX Ucircumflex Aring -40
+KPX Ucircumflex Atilde -40
+KPX Udieresis A -40
+KPX Udieresis Aacute -40
+KPX Udieresis Abreve -40
+KPX Udieresis Acircumflex -40
+KPX Udieresis Adieresis -40
+KPX Udieresis Agrave -40
+KPX Udieresis Amacron -40
+KPX Udieresis Aogonek -40
+KPX Udieresis Aring -40
+KPX Udieresis Atilde -40
+KPX Ugrave A -40
+KPX Ugrave Aacute -40
+KPX Ugrave Abreve -40
+KPX Ugrave Acircumflex -40
+KPX Ugrave Adieresis -40
+KPX Ugrave Agrave -40
+KPX Ugrave Amacron -40
+KPX Ugrave Aogonek -40
+KPX Ugrave Aring -40
+KPX Ugrave Atilde -40
+KPX Uhungarumlaut A -40
+KPX Uhungarumlaut Aacute -40
+KPX Uhungarumlaut Abreve -40
+KPX Uhungarumlaut Acircumflex -40
+KPX Uhungarumlaut Adieresis -40
+KPX Uhungarumlaut Agrave -40
+KPX Uhungarumlaut Amacron -40
+KPX Uhungarumlaut Aogonek -40
+KPX Uhungarumlaut Aring -40
+KPX Uhungarumlaut Atilde -40
+KPX Umacron A -40
+KPX Umacron Aacute -40
+KPX Umacron Abreve -40
+KPX Umacron Acircumflex -40
+KPX Umacron Adieresis -40
+KPX Umacron Agrave -40
+KPX Umacron Amacron -40
+KPX Umacron Aogonek -40
+KPX Umacron Aring -40
+KPX Umacron Atilde -40
+KPX Uogonek A -40
+KPX Uogonek Aacute -40
+KPX Uogonek Abreve -40
+KPX Uogonek Acircumflex -40
+KPX Uogonek Adieresis -40
+KPX Uogonek Agrave -40
+KPX Uogonek Amacron -40
+KPX Uogonek Aogonek -40
+KPX Uogonek Aring -40
+KPX Uogonek Atilde -40
+KPX Uring A -40
+KPX Uring Aacute -40
+KPX Uring Abreve -40
+KPX Uring Acircumflex -40
+KPX Uring Adieresis -40
+KPX Uring Agrave -40
+KPX Uring Amacron -40
+KPX Uring Aogonek -40
+KPX Uring Aring -40
+KPX Uring Atilde -40
+KPX V A -135
+KPX V Aacute -135
+KPX V Abreve -135
+KPX V Acircumflex -135
+KPX V Adieresis -135
+KPX V Agrave -135
+KPX V Amacron -135
+KPX V Aogonek -135
+KPX V Aring -135
+KPX V Atilde -135
+KPX V G -15
+KPX V Gbreve -15
+KPX V Gcommaaccent -15
+KPX V O -40
+KPX V Oacute -40
+KPX V Ocircumflex -40
+KPX V Odieresis -40
+KPX V Ograve -40
+KPX V Ohungarumlaut -40
+KPX V Omacron -40
+KPX V Oslash -40
+KPX V Otilde -40
+KPX V a -111
+KPX V aacute -111
+KPX V abreve -111
+KPX V acircumflex -71
+KPX V adieresis -71
+KPX V agrave -71
+KPX V amacron -71
+KPX V aogonek -111
+KPX V aring -111
+KPX V atilde -71
+KPX V colon -74
+KPX V comma -129
+KPX V e -111
+KPX V eacute -111
+KPX V ecaron -71
+KPX V ecircumflex -71
+KPX V edieresis -71
+KPX V edotaccent -111
+KPX V egrave -71
+KPX V emacron -71
+KPX V eogonek -111
+KPX V hyphen -100
+KPX V i -60
+KPX V iacute -60
+KPX V icircumflex -20
+KPX V idieresis -20
+KPX V igrave -20
+KPX V imacron -20
+KPX V iogonek -60
+KPX V o -129
+KPX V oacute -129
+KPX V ocircumflex -129
+KPX V odieresis -89
+KPX V ograve -89
+KPX V ohungarumlaut -129
+KPX V omacron -89
+KPX V oslash -129
+KPX V otilde -89
+KPX V period -129
+KPX V semicolon -74
+KPX V u -75
+KPX V uacute -75
+KPX V ucircumflex -75
+KPX V udieresis -75
+KPX V ugrave -75
+KPX V uhungarumlaut -75
+KPX V umacron -75
+KPX V uogonek -75
+KPX V uring -75
+KPX W A -120
+KPX W Aacute -120
+KPX W Abreve -120
+KPX W Acircumflex -120
+KPX W Adieresis -120
+KPX W Agrave -120
+KPX W Amacron -120
+KPX W Aogonek -120
+KPX W Aring -120
+KPX W Atilde -120
+KPX W O -10
+KPX W Oacute -10
+KPX W Ocircumflex -10
+KPX W Odieresis -10
+KPX W Ograve -10
+KPX W Ohungarumlaut -10
+KPX W Omacron -10
+KPX W Oslash -10
+KPX W Otilde -10
+KPX W a -80
+KPX W aacute -80
+KPX W abreve -80
+KPX W acircumflex -80
+KPX W adieresis -80
+KPX W agrave -80
+KPX W amacron -80
+KPX W aogonek -80
+KPX W aring -80
+KPX W atilde -80
+KPX W colon -37
+KPX W comma -92
+KPX W e -80
+KPX W eacute -80
+KPX W ecaron -80
+KPX W ecircumflex -80
+KPX W edieresis -40
+KPX W edotaccent -80
+KPX W egrave -40
+KPX W emacron -40
+KPX W eogonek -80
+KPX W hyphen -65
+KPX W i -40
+KPX W iacute -40
+KPX W iogonek -40
+KPX W o -80
+KPX W oacute -80
+KPX W ocircumflex -80
+KPX W odieresis -80
+KPX W ograve -80
+KPX W ohungarumlaut -80
+KPX W omacron -80
+KPX W oslash -80
+KPX W otilde -80
+KPX W period -92
+KPX W semicolon -37
+KPX W u -50
+KPX W uacute -50
+KPX W ucircumflex -50
+KPX W udieresis -50
+KPX W ugrave -50
+KPX W uhungarumlaut -50
+KPX W umacron -50
+KPX W uogonek -50
+KPX W uring -50
+KPX W y -73
+KPX W yacute -73
+KPX W ydieresis -73
+KPX Y A -120
+KPX Y Aacute -120
+KPX Y Abreve -120
+KPX Y Acircumflex -120
+KPX Y Adieresis -120
+KPX Y Agrave -120
+KPX Y Amacron -120
+KPX Y Aogonek -120
+KPX Y Aring -120
+KPX Y Atilde -120
+KPX Y O -30
+KPX Y Oacute -30
+KPX Y Ocircumflex -30
+KPX Y Odieresis -30
+KPX Y Ograve -30
+KPX Y Ohungarumlaut -30
+KPX Y Omacron -30
+KPX Y Oslash -30
+KPX Y Otilde -30
+KPX Y a -100
+KPX Y aacute -100
+KPX Y abreve -100
+KPX Y acircumflex -100
+KPX Y adieresis -60
+KPX Y agrave -60
+KPX Y amacron -60
+KPX Y aogonek -100
+KPX Y aring -100
+KPX Y atilde -60
+KPX Y colon -92
+KPX Y comma -129
+KPX Y e -100
+KPX Y eacute -100
+KPX Y ecaron -100
+KPX Y ecircumflex -100
+KPX Y edieresis -60
+KPX Y edotaccent -100
+KPX Y egrave -60
+KPX Y emacron -60
+KPX Y eogonek -100
+KPX Y hyphen -111
+KPX Y i -55
+KPX Y iacute -55
+KPX Y iogonek -55
+KPX Y o -110
+KPX Y oacute -110
+KPX Y ocircumflex -110
+KPX Y odieresis -70
+KPX Y ograve -70
+KPX Y ohungarumlaut -110
+KPX Y omacron -70
+KPX Y oslash -110
+KPX Y otilde -70
+KPX Y period -129
+KPX Y semicolon -92
+KPX Y u -111
+KPX Y uacute -111
+KPX Y ucircumflex -111
+KPX Y udieresis -71
+KPX Y ugrave -71
+KPX Y uhungarumlaut -111
+KPX Y umacron -71
+KPX Y uogonek -111
+KPX Y uring -111
+KPX Yacute A -120
+KPX Yacute Aacute -120
+KPX Yacute Abreve -120
+KPX Yacute Acircumflex -120
+KPX Yacute Adieresis -120
+KPX Yacute Agrave -120
+KPX Yacute Amacron -120
+KPX Yacute Aogonek -120
+KPX Yacute Aring -120
+KPX Yacute Atilde -120
+KPX Yacute O -30
+KPX Yacute Oacute -30
+KPX Yacute Ocircumflex -30
+KPX Yacute Odieresis -30
+KPX Yacute Ograve -30
+KPX Yacute Ohungarumlaut -30
+KPX Yacute Omacron -30
+KPX Yacute Oslash -30
+KPX Yacute Otilde -30
+KPX Yacute a -100
+KPX Yacute aacute -100
+KPX Yacute abreve -100
+KPX Yacute acircumflex -100
+KPX Yacute adieresis -60
+KPX Yacute agrave -60
+KPX Yacute amacron -60
+KPX Yacute aogonek -100
+KPX Yacute aring -100
+KPX Yacute atilde -60
+KPX Yacute colon -92
+KPX Yacute comma -129
+KPX Yacute e -100
+KPX Yacute eacute -100
+KPX Yacute ecaron -100
+KPX Yacute ecircumflex -100
+KPX Yacute edieresis -60
+KPX Yacute edotaccent -100
+KPX Yacute egrave -60
+KPX Yacute emacron -60
+KPX Yacute eogonek -100
+KPX Yacute hyphen -111
+KPX Yacute i -55
+KPX Yacute iacute -55
+KPX Yacute iogonek -55
+KPX Yacute o -110
+KPX Yacute oacute -110
+KPX Yacute ocircumflex -110
+KPX Yacute odieresis -70
+KPX Yacute ograve -70
+KPX Yacute ohungarumlaut -110
+KPX Yacute omacron -70
+KPX Yacute oslash -110
+KPX Yacute otilde -70
+KPX Yacute period -129
+KPX Yacute semicolon -92
+KPX Yacute u -111
+KPX Yacute uacute -111
+KPX Yacute ucircumflex -111
+KPX Yacute udieresis -71
+KPX Yacute ugrave -71
+KPX Yacute uhungarumlaut -111
+KPX Yacute umacron -71
+KPX Yacute uogonek -111
+KPX Yacute uring -111
+KPX Ydieresis A -120
+KPX Ydieresis Aacute -120
+KPX Ydieresis Abreve -120
+KPX Ydieresis Acircumflex -120
+KPX Ydieresis Adieresis -120
+KPX Ydieresis Agrave -120
+KPX Ydieresis Amacron -120
+KPX Ydieresis Aogonek -120
+KPX Ydieresis Aring -120
+KPX Ydieresis Atilde -120
+KPX Ydieresis O -30
+KPX Ydieresis Oacute -30
+KPX Ydieresis Ocircumflex -30
+KPX Ydieresis Odieresis -30
+KPX Ydieresis Ograve -30
+KPX Ydieresis Ohungarumlaut -30
+KPX Ydieresis Omacron -30
+KPX Ydieresis Oslash -30
+KPX Ydieresis Otilde -30
+KPX Ydieresis a -100
+KPX Ydieresis aacute -100
+KPX Ydieresis abreve -100
+KPX Ydieresis acircumflex -100
+KPX Ydieresis adieresis -60
+KPX Ydieresis agrave -60
+KPX Ydieresis amacron -60
+KPX Ydieresis aogonek -100
+KPX Ydieresis aring -100
+KPX Ydieresis atilde -100
+KPX Ydieresis colon -92
+KPX Ydieresis comma -129
+KPX Ydieresis e -100
+KPX Ydieresis eacute -100
+KPX Ydieresis ecaron -100
+KPX Ydieresis ecircumflex -100
+KPX Ydieresis edieresis -60
+KPX Ydieresis edotaccent -100
+KPX Ydieresis egrave -60
+KPX Ydieresis emacron -60
+KPX Ydieresis eogonek -100
+KPX Ydieresis hyphen -111
+KPX Ydieresis i -55
+KPX Ydieresis iacute -55
+KPX Ydieresis iogonek -55
+KPX Ydieresis o -110
+KPX Ydieresis oacute -110
+KPX Ydieresis ocircumflex -110
+KPX Ydieresis odieresis -70
+KPX Ydieresis ograve -70
+KPX Ydieresis ohungarumlaut -110
+KPX Ydieresis omacron -70
+KPX Ydieresis oslash -110
+KPX Ydieresis otilde -70
+KPX Ydieresis period -129
+KPX Ydieresis semicolon -92
+KPX Ydieresis u -111
+KPX Ydieresis uacute -111
+KPX Ydieresis ucircumflex -111
+KPX Ydieresis udieresis -71
+KPX Ydieresis ugrave -71
+KPX Ydieresis uhungarumlaut -111
+KPX Ydieresis umacron -71
+KPX Ydieresis uogonek -111
+KPX Ydieresis uring -111
+KPX a v -20
+KPX a w -15
+KPX aacute v -20
+KPX aacute w -15
+KPX abreve v -20
+KPX abreve w -15
+KPX acircumflex v -20
+KPX acircumflex w -15
+KPX adieresis v -20
+KPX adieresis w -15
+KPX agrave v -20
+KPX agrave w -15
+KPX amacron v -20
+KPX amacron w -15
+KPX aogonek v -20
+KPX aogonek w -15
+KPX aring v -20
+KPX aring w -15
+KPX atilde v -20
+KPX atilde w -15
+KPX b period -40
+KPX b u -20
+KPX b uacute -20
+KPX b ucircumflex -20
+KPX b udieresis -20
+KPX b ugrave -20
+KPX b uhungarumlaut -20
+KPX b umacron -20
+KPX b uogonek -20
+KPX b uring -20
+KPX b v -15
+KPX c y -15
+KPX c yacute -15
+KPX c ydieresis -15
+KPX cacute y -15
+KPX cacute yacute -15
+KPX cacute ydieresis -15
+KPX ccaron y -15
+KPX ccaron yacute -15
+KPX ccaron ydieresis -15
+KPX ccedilla y -15
+KPX ccedilla yacute -15
+KPX ccedilla ydieresis -15
+KPX comma quotedblright -70
+KPX comma quoteright -70
+KPX e g -15
+KPX e gbreve -15
+KPX e gcommaaccent -15
+KPX e v -25
+KPX e w -25
+KPX e x -15
+KPX e y -15
+KPX e yacute -15
+KPX e ydieresis -15
+KPX eacute g -15
+KPX eacute gbreve -15
+KPX eacute gcommaaccent -15
+KPX eacute v -25
+KPX eacute w -25
+KPX eacute x -15
+KPX eacute y -15
+KPX eacute yacute -15
+KPX eacute ydieresis -15
+KPX ecaron g -15
+KPX ecaron gbreve -15
+KPX ecaron gcommaaccent -15
+KPX ecaron v -25
+KPX ecaron w -25
+KPX ecaron x -15
+KPX ecaron y -15
+KPX ecaron yacute -15
+KPX ecaron ydieresis -15
+KPX ecircumflex g -15
+KPX ecircumflex gbreve -15
+KPX ecircumflex gcommaaccent -15
+KPX ecircumflex v -25
+KPX ecircumflex w -25
+KPX ecircumflex x -15
+KPX ecircumflex y -15
+KPX ecircumflex yacute -15
+KPX ecircumflex ydieresis -15
+KPX edieresis g -15
+KPX edieresis gbreve -15
+KPX edieresis gcommaaccent -15
+KPX edieresis v -25
+KPX edieresis w -25
+KPX edieresis x -15
+KPX edieresis y -15
+KPX edieresis yacute -15
+KPX edieresis ydieresis -15
+KPX edotaccent g -15
+KPX edotaccent gbreve -15
+KPX edotaccent gcommaaccent -15
+KPX edotaccent v -25
+KPX edotaccent w -25
+KPX edotaccent x -15
+KPX edotaccent y -15
+KPX edotaccent yacute -15
+KPX edotaccent ydieresis -15
+KPX egrave g -15
+KPX egrave gbreve -15
+KPX egrave gcommaaccent -15
+KPX egrave v -25
+KPX egrave w -25
+KPX egrave x -15
+KPX egrave y -15
+KPX egrave yacute -15
+KPX egrave ydieresis -15
+KPX emacron g -15
+KPX emacron gbreve -15
+KPX emacron gcommaaccent -15
+KPX emacron v -25
+KPX emacron w -25
+KPX emacron x -15
+KPX emacron y -15
+KPX emacron yacute -15
+KPX emacron ydieresis -15
+KPX eogonek g -15
+KPX eogonek gbreve -15
+KPX eogonek gcommaaccent -15
+KPX eogonek v -25
+KPX eogonek w -25
+KPX eogonek x -15
+KPX eogonek y -15
+KPX eogonek yacute -15
+KPX eogonek ydieresis -15
+KPX f a -10
+KPX f aacute -10
+KPX f abreve -10
+KPX f acircumflex -10
+KPX f adieresis -10
+KPX f agrave -10
+KPX f amacron -10
+KPX f aogonek -10
+KPX f aring -10
+KPX f atilde -10
+KPX f dotlessi -50
+KPX f f -25
+KPX f i -20
+KPX f iacute -20
+KPX f quoteright 55
+KPX g a -5
+KPX g aacute -5
+KPX g abreve -5
+KPX g acircumflex -5
+KPX g adieresis -5
+KPX g agrave -5
+KPX g amacron -5
+KPX g aogonek -5
+KPX g aring -5
+KPX g atilde -5
+KPX gbreve a -5
+KPX gbreve aacute -5
+KPX gbreve abreve -5
+KPX gbreve acircumflex -5
+KPX gbreve adieresis -5
+KPX gbreve agrave -5
+KPX gbreve amacron -5
+KPX gbreve aogonek -5
+KPX gbreve aring -5
+KPX gbreve atilde -5
+KPX gcommaaccent a -5
+KPX gcommaaccent aacute -5
+KPX gcommaaccent abreve -5
+KPX gcommaaccent acircumflex -5
+KPX gcommaaccent adieresis -5
+KPX gcommaaccent agrave -5
+KPX gcommaaccent amacron -5
+KPX gcommaaccent aogonek -5
+KPX gcommaaccent aring -5
+KPX gcommaaccent atilde -5
+KPX h y -5
+KPX h yacute -5
+KPX h ydieresis -5
+KPX i v -25
+KPX iacute v -25
+KPX icircumflex v -25
+KPX idieresis v -25
+KPX igrave v -25
+KPX imacron v -25
+KPX iogonek v -25
+KPX k e -10
+KPX k eacute -10
+KPX k ecaron -10
+KPX k ecircumflex -10
+KPX k edieresis -10
+KPX k edotaccent -10
+KPX k egrave -10
+KPX k emacron -10
+KPX k eogonek -10
+KPX k o -10
+KPX k oacute -10
+KPX k ocircumflex -10
+KPX k odieresis -10
+KPX k ograve -10
+KPX k ohungarumlaut -10
+KPX k omacron -10
+KPX k oslash -10
+KPX k otilde -10
+KPX k y -15
+KPX k yacute -15
+KPX k ydieresis -15
+KPX kcommaaccent e -10
+KPX kcommaaccent eacute -10
+KPX kcommaaccent ecaron -10
+KPX kcommaaccent ecircumflex -10
+KPX kcommaaccent edieresis -10
+KPX kcommaaccent edotaccent -10
+KPX kcommaaccent egrave -10
+KPX kcommaaccent emacron -10
+KPX kcommaaccent eogonek -10
+KPX kcommaaccent o -10
+KPX kcommaaccent oacute -10
+KPX kcommaaccent ocircumflex -10
+KPX kcommaaccent odieresis -10
+KPX kcommaaccent ograve -10
+KPX kcommaaccent ohungarumlaut -10
+KPX kcommaaccent omacron -10
+KPX kcommaaccent oslash -10
+KPX kcommaaccent otilde -10
+KPX kcommaaccent y -15
+KPX kcommaaccent yacute -15
+KPX kcommaaccent ydieresis -15
+KPX l w -10
+KPX lacute w -10
+KPX lcommaaccent w -10
+KPX lslash w -10
+KPX n v -40
+KPX n y -15
+KPX n yacute -15
+KPX n ydieresis -15
+KPX nacute v -40
+KPX nacute y -15
+KPX nacute yacute -15
+KPX nacute ydieresis -15
+KPX ncaron v -40
+KPX ncaron y -15
+KPX ncaron yacute -15
+KPX ncaron ydieresis -15
+KPX ncommaaccent v -40
+KPX ncommaaccent y -15
+KPX ncommaaccent yacute -15
+KPX ncommaaccent ydieresis -15
+KPX ntilde v -40
+KPX ntilde y -15
+KPX ntilde yacute -15
+KPX ntilde ydieresis -15
+KPX o v -15
+KPX o w -25
+KPX o y -10
+KPX o yacute -10
+KPX o ydieresis -10
+KPX oacute v -15
+KPX oacute w -25
+KPX oacute y -10
+KPX oacute yacute -10
+KPX oacute ydieresis -10
+KPX ocircumflex v -15
+KPX ocircumflex w -25
+KPX ocircumflex y -10
+KPX ocircumflex yacute -10
+KPX ocircumflex ydieresis -10
+KPX odieresis v -15
+KPX odieresis w -25
+KPX odieresis y -10
+KPX odieresis yacute -10
+KPX odieresis ydieresis -10
+KPX ograve v -15
+KPX ograve w -25
+KPX ograve y -10
+KPX ograve yacute -10
+KPX ograve ydieresis -10
+KPX ohungarumlaut v -15
+KPX ohungarumlaut w -25
+KPX ohungarumlaut y -10
+KPX ohungarumlaut yacute -10
+KPX ohungarumlaut ydieresis -10
+KPX omacron v -15
+KPX omacron w -25
+KPX omacron y -10
+KPX omacron yacute -10
+KPX omacron ydieresis -10
+KPX oslash v -15
+KPX oslash w -25
+KPX oslash y -10
+KPX oslash yacute -10
+KPX oslash ydieresis -10
+KPX otilde v -15
+KPX otilde w -25
+KPX otilde y -10
+KPX otilde yacute -10
+KPX otilde ydieresis -10
+KPX p y -10
+KPX p yacute -10
+KPX p ydieresis -10
+KPX period quotedblright -70
+KPX period quoteright -70
+KPX quotedblleft A -80
+KPX quotedblleft Aacute -80
+KPX quotedblleft Abreve -80
+KPX quotedblleft Acircumflex -80
+KPX quotedblleft Adieresis -80
+KPX quotedblleft Agrave -80
+KPX quotedblleft Amacron -80
+KPX quotedblleft Aogonek -80
+KPX quotedblleft Aring -80
+KPX quotedblleft Atilde -80
+KPX quoteleft A -80
+KPX quoteleft Aacute -80
+KPX quoteleft Abreve -80
+KPX quoteleft Acircumflex -80
+KPX quoteleft Adieresis -80
+KPX quoteleft Agrave -80
+KPX quoteleft Amacron -80
+KPX quoteleft Aogonek -80
+KPX quoteleft Aring -80
+KPX quoteleft Atilde -80
+KPX quoteleft quoteleft -74
+KPX quoteright d -50
+KPX quoteright dcroat -50
+KPX quoteright l -10
+KPX quoteright lacute -10
+KPX quoteright lcommaaccent -10
+KPX quoteright lslash -10
+KPX quoteright quoteright -74
+KPX quoteright r -50
+KPX quoteright racute -50
+KPX quoteright rcaron -50
+KPX quoteright rcommaaccent -50
+KPX quoteright s -55
+KPX quoteright sacute -55
+KPX quoteright scaron -55
+KPX quoteright scedilla -55
+KPX quoteright scommaaccent -55
+KPX quoteright space -74
+KPX quoteright t -18
+KPX quoteright tcommaaccent -18
+KPX quoteright v -50
+KPX r comma -40
+KPX r g -18
+KPX r gbreve -18
+KPX r gcommaaccent -18
+KPX r hyphen -20
+KPX r period -55
+KPX racute comma -40
+KPX racute g -18
+KPX racute gbreve -18
+KPX racute gcommaaccent -18
+KPX racute hyphen -20
+KPX racute period -55
+KPX rcaron comma -40
+KPX rcaron g -18
+KPX rcaron gbreve -18
+KPX rcaron gcommaaccent -18
+KPX rcaron hyphen -20
+KPX rcaron period -55
+KPX rcommaaccent comma -40
+KPX rcommaaccent g -18
+KPX rcommaaccent gbreve -18
+KPX rcommaaccent gcommaaccent -18
+KPX rcommaaccent hyphen -20
+KPX rcommaaccent period -55
+KPX space A -55
+KPX space Aacute -55
+KPX space Abreve -55
+KPX space Acircumflex -55
+KPX space Adieresis -55
+KPX space Agrave -55
+KPX space Amacron -55
+KPX space Aogonek -55
+KPX space Aring -55
+KPX space Atilde -55
+KPX space T -18
+KPX space Tcaron -18
+KPX space Tcommaaccent -18
+KPX space V -50
+KPX space W -30
+KPX space Y -90
+KPX space Yacute -90
+KPX space Ydieresis -90
+KPX v a -25
+KPX v aacute -25
+KPX v abreve -25
+KPX v acircumflex -25
+KPX v adieresis -25
+KPX v agrave -25
+KPX v amacron -25
+KPX v aogonek -25
+KPX v aring -25
+KPX v atilde -25
+KPX v comma -65
+KPX v e -15
+KPX v eacute -15
+KPX v ecaron -15
+KPX v ecircumflex -15
+KPX v edieresis -15
+KPX v edotaccent -15
+KPX v egrave -15
+KPX v emacron -15
+KPX v eogonek -15
+KPX v o -20
+KPX v oacute -20
+KPX v ocircumflex -20
+KPX v odieresis -20
+KPX v ograve -20
+KPX v ohungarumlaut -20
+KPX v omacron -20
+KPX v oslash -20
+KPX v otilde -20
+KPX v period -65
+KPX w a -10
+KPX w aacute -10
+KPX w abreve -10
+KPX w acircumflex -10
+KPX w adieresis -10
+KPX w agrave -10
+KPX w amacron -10
+KPX w aogonek -10
+KPX w aring -10
+KPX w atilde -10
+KPX w comma -65
+KPX w o -10
+KPX w oacute -10
+KPX w ocircumflex -10
+KPX w odieresis -10
+KPX w ograve -10
+KPX w ohungarumlaut -10
+KPX w omacron -10
+KPX w oslash -10
+KPX w otilde -10
+KPX w period -65
+KPX x e -15
+KPX x eacute -15
+KPX x ecaron -15
+KPX x ecircumflex -15
+KPX x edieresis -15
+KPX x edotaccent -15
+KPX x egrave -15
+KPX x emacron -15
+KPX x eogonek -15
+KPX y comma -65
+KPX y period -65
+KPX yacute comma -65
+KPX yacute period -65
+KPX ydieresis comma -65
+KPX ydieresis period -65
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/src/fonts/Adobe-Core35_AFMs-314/ZapfDingbats.afm b/src/fonts/Adobe-Core35_AFMs-314/ZapfDingbats.afm
new file mode 100644
index 0000000..7695ff0
--- /dev/null
+++ b/src/fonts/Adobe-Core35_AFMs-314/ZapfDingbats.afm
@@ -0,0 +1,224 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1985, 1987, 1988, 1989, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Thu May 1 15:14:13 1997
+Comment UniqueID 43082
+Comment VMusage 45775 55535
+FontName ZapfDingbats
+FullName ITC Zapf Dingbats
+FamilyName ITC Zapf Dingbats
+Weight Medium
+ItalicAngle 0
+IsFixedPitch false
+FontBBox -1 -143 981 820
+UnderlinePosition -100
+UnderlineThickness 50
+Version 002.000
+Notice Copyright (c) 1985, 1987, 1988, 1989, 1997 Adobe Systems Incorporated. All Rights Reserved.ITC Zapf Dingbats is a registered trademark of International Typeface Corporation.
+EncodingScheme FontSpecific
+StdHW 28
+StdVW 90
+StartCharMetrics 202
+C 32 ; WX 278 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 974 ; N a1 ; B 35 72 939 621 ;
+C 34 ; WX 961 ; N a2 ; B 35 81 927 611 ;
+C 35 ; WX 974 ; N a202 ; B 35 72 939 621 ;
+C 36 ; WX 980 ; N a3 ; B 35 0 945 692 ;
+C 37 ; WX 719 ; N a4 ; B 34 139 685 566 ;
+C 38 ; WX 789 ; N a5 ; B 35 -14 755 705 ;
+C 39 ; WX 790 ; N a119 ; B 35 -14 755 705 ;
+C 40 ; WX 791 ; N a118 ; B 35 -13 761 705 ;
+C 41 ; WX 690 ; N a117 ; B 34 138 655 553 ;
+C 42 ; WX 960 ; N a11 ; B 35 123 925 568 ;
+C 43 ; WX 939 ; N a12 ; B 35 134 904 559 ;
+C 44 ; WX 549 ; N a13 ; B 29 -11 516 705 ;
+C 45 ; WX 855 ; N a14 ; B 34 59 820 632 ;
+C 46 ; WX 911 ; N a15 ; B 35 50 876 642 ;
+C 47 ; WX 933 ; N a16 ; B 35 139 899 550 ;
+C 48 ; WX 911 ; N a105 ; B 35 50 876 642 ;
+C 49 ; WX 945 ; N a17 ; B 35 139 909 553 ;
+C 50 ; WX 974 ; N a18 ; B 35 104 938 587 ;
+C 51 ; WX 755 ; N a19 ; B 34 -13 721 705 ;
+C 52 ; WX 846 ; N a20 ; B 36 -14 811 705 ;
+C 53 ; WX 762 ; N a21 ; B 35 0 727 692 ;
+C 54 ; WX 761 ; N a22 ; B 35 0 727 692 ;
+C 55 ; WX 571 ; N a23 ; B -1 -68 571 661 ;
+C 56 ; WX 677 ; N a24 ; B 36 -13 642 705 ;
+C 57 ; WX 763 ; N a25 ; B 35 0 728 692 ;
+C 58 ; WX 760 ; N a26 ; B 35 0 726 692 ;
+C 59 ; WX 759 ; N a27 ; B 35 0 725 692 ;
+C 60 ; WX 754 ; N a28 ; B 35 0 720 692 ;
+C 61 ; WX 494 ; N a6 ; B 35 0 460 692 ;
+C 62 ; WX 552 ; N a7 ; B 35 0 517 692 ;
+C 63 ; WX 537 ; N a8 ; B 35 0 503 692 ;
+C 64 ; WX 577 ; N a9 ; B 35 96 542 596 ;
+C 65 ; WX 692 ; N a10 ; B 35 -14 657 705 ;
+C 66 ; WX 786 ; N a29 ; B 35 -14 751 705 ;
+C 67 ; WX 788 ; N a30 ; B 35 -14 752 705 ;
+C 68 ; WX 788 ; N a31 ; B 35 -14 753 705 ;
+C 69 ; WX 790 ; N a32 ; B 35 -14 756 705 ;
+C 70 ; WX 793 ; N a33 ; B 35 -13 759 705 ;
+C 71 ; WX 794 ; N a34 ; B 35 -13 759 705 ;
+C 72 ; WX 816 ; N a35 ; B 35 -14 782 705 ;
+C 73 ; WX 823 ; N a36 ; B 35 -14 787 705 ;
+C 74 ; WX 789 ; N a37 ; B 35 -14 754 705 ;
+C 75 ; WX 841 ; N a38 ; B 35 -14 807 705 ;
+C 76 ; WX 823 ; N a39 ; B 35 -14 789 705 ;
+C 77 ; WX 833 ; N a40 ; B 35 -14 798 705 ;
+C 78 ; WX 816 ; N a41 ; B 35 -13 782 705 ;
+C 79 ; WX 831 ; N a42 ; B 35 -14 796 705 ;
+C 80 ; WX 923 ; N a43 ; B 35 -14 888 705 ;
+C 81 ; WX 744 ; N a44 ; B 35 0 710 692 ;
+C 82 ; WX 723 ; N a45 ; B 35 0 688 692 ;
+C 83 ; WX 749 ; N a46 ; B 35 0 714 692 ;
+C 84 ; WX 790 ; N a47 ; B 34 -14 756 705 ;
+C 85 ; WX 792 ; N a48 ; B 35 -14 758 705 ;
+C 86 ; WX 695 ; N a49 ; B 35 -14 661 706 ;
+C 87 ; WX 776 ; N a50 ; B 35 -6 741 699 ;
+C 88 ; WX 768 ; N a51 ; B 35 -7 734 699 ;
+C 89 ; WX 792 ; N a52 ; B 35 -14 757 705 ;
+C 90 ; WX 759 ; N a53 ; B 35 0 725 692 ;
+C 91 ; WX 707 ; N a54 ; B 35 -13 672 704 ;
+C 92 ; WX 708 ; N a55 ; B 35 -14 672 705 ;
+C 93 ; WX 682 ; N a56 ; B 35 -14 647 705 ;
+C 94 ; WX 701 ; N a57 ; B 35 -14 666 705 ;
+C 95 ; WX 826 ; N a58 ; B 35 -14 791 705 ;
+C 96 ; WX 815 ; N a59 ; B 35 -14 780 705 ;
+C 97 ; WX 789 ; N a60 ; B 35 -14 754 705 ;
+C 98 ; WX 789 ; N a61 ; B 35 -14 754 705 ;
+C 99 ; WX 707 ; N a62 ; B 34 -14 673 705 ;
+C 100 ; WX 687 ; N a63 ; B 36 0 651 692 ;
+C 101 ; WX 696 ; N a64 ; B 35 0 661 691 ;
+C 102 ; WX 689 ; N a65 ; B 35 0 655 692 ;
+C 103 ; WX 786 ; N a66 ; B 34 -14 751 705 ;
+C 104 ; WX 787 ; N a67 ; B 35 -14 752 705 ;
+C 105 ; WX 713 ; N a68 ; B 35 -14 678 705 ;
+C 106 ; WX 791 ; N a69 ; B 35 -14 756 705 ;
+C 107 ; WX 785 ; N a70 ; B 36 -14 751 705 ;
+C 108 ; WX 791 ; N a71 ; B 35 -14 757 705 ;
+C 109 ; WX 873 ; N a72 ; B 35 -14 838 705 ;
+C 110 ; WX 761 ; N a73 ; B 35 0 726 692 ;
+C 111 ; WX 762 ; N a74 ; B 35 0 727 692 ;
+C 112 ; WX 762 ; N a203 ; B 35 0 727 692 ;
+C 113 ; WX 759 ; N a75 ; B 35 0 725 692 ;
+C 114 ; WX 759 ; N a204 ; B 35 0 725 692 ;
+C 115 ; WX 892 ; N a76 ; B 35 0 858 705 ;
+C 116 ; WX 892 ; N a77 ; B 35 -14 858 692 ;
+C 117 ; WX 788 ; N a78 ; B 35 -14 754 705 ;
+C 118 ; WX 784 ; N a79 ; B 35 -14 749 705 ;
+C 119 ; WX 438 ; N a81 ; B 35 -14 403 705 ;
+C 120 ; WX 138 ; N a82 ; B 35 0 104 692 ;
+C 121 ; WX 277 ; N a83 ; B 35 0 242 692 ;
+C 122 ; WX 415 ; N a84 ; B 35 0 380 692 ;
+C 123 ; WX 392 ; N a97 ; B 35 263 357 705 ;
+C 124 ; WX 392 ; N a98 ; B 34 263 357 705 ;
+C 125 ; WX 668 ; N a99 ; B 35 263 633 705 ;
+C 126 ; WX 668 ; N a100 ; B 36 263 634 705 ;
+C 128 ; WX 390 ; N a89 ; B 35 -14 356 705 ;
+C 129 ; WX 390 ; N a90 ; B 35 -14 355 705 ;
+C 130 ; WX 317 ; N a93 ; B 35 0 283 692 ;
+C 131 ; WX 317 ; N a94 ; B 35 0 283 692 ;
+C 132 ; WX 276 ; N a91 ; B 35 0 242 692 ;
+C 133 ; WX 276 ; N a92 ; B 35 0 242 692 ;
+C 134 ; WX 509 ; N a205 ; B 35 0 475 692 ;
+C 135 ; WX 509 ; N a85 ; B 35 0 475 692 ;
+C 136 ; WX 410 ; N a206 ; B 35 0 375 692 ;
+C 137 ; WX 410 ; N a86 ; B 35 0 375 692 ;
+C 138 ; WX 234 ; N a87 ; B 35 -14 199 705 ;
+C 139 ; WX 234 ; N a88 ; B 35 -14 199 705 ;
+C 140 ; WX 334 ; N a95 ; B 35 0 299 692 ;
+C 141 ; WX 334 ; N a96 ; B 35 0 299 692 ;
+C 161 ; WX 732 ; N a101 ; B 35 -143 697 806 ;
+C 162 ; WX 544 ; N a102 ; B 56 -14 488 706 ;
+C 163 ; WX 544 ; N a103 ; B 34 -14 508 705 ;
+C 164 ; WX 910 ; N a104 ; B 35 40 875 651 ;
+C 165 ; WX 667 ; N a106 ; B 35 -14 633 705 ;
+C 166 ; WX 760 ; N a107 ; B 35 -14 726 705 ;
+C 167 ; WX 760 ; N a108 ; B 0 121 758 569 ;
+C 168 ; WX 776 ; N a112 ; B 35 0 741 705 ;
+C 169 ; WX 595 ; N a111 ; B 34 -14 560 705 ;
+C 170 ; WX 694 ; N a110 ; B 35 -14 659 705 ;
+C 171 ; WX 626 ; N a109 ; B 34 0 591 705 ;
+C 172 ; WX 788 ; N a120 ; B 35 -14 754 705 ;
+C 173 ; WX 788 ; N a121 ; B 35 -14 754 705 ;
+C 174 ; WX 788 ; N a122 ; B 35 -14 754 705 ;
+C 175 ; WX 788 ; N a123 ; B 35 -14 754 705 ;
+C 176 ; WX 788 ; N a124 ; B 35 -14 754 705 ;
+C 177 ; WX 788 ; N a125 ; B 35 -14 754 705 ;
+C 178 ; WX 788 ; N a126 ; B 35 -14 754 705 ;
+C 179 ; WX 788 ; N a127 ; B 35 -14 754 705 ;
+C 180 ; WX 788 ; N a128 ; B 35 -14 754 705 ;
+C 181 ; WX 788 ; N a129 ; B 35 -14 754 705 ;
+C 182 ; WX 788 ; N a130 ; B 35 -14 754 705 ;
+C 183 ; WX 788 ; N a131 ; B 35 -14 754 705 ;
+C 184 ; WX 788 ; N a132 ; B 35 -14 754 705 ;
+C 185 ; WX 788 ; N a133 ; B 35 -14 754 705 ;
+C 186 ; WX 788 ; N a134 ; B 35 -14 754 705 ;
+C 187 ; WX 788 ; N a135 ; B 35 -14 754 705 ;
+C 188 ; WX 788 ; N a136 ; B 35 -14 754 705 ;
+C 189 ; WX 788 ; N a137 ; B 35 -14 754 705 ;
+C 190 ; WX 788 ; N a138 ; B 35 -14 754 705 ;
+C 191 ; WX 788 ; N a139 ; B 35 -14 754 705 ;
+C 192 ; WX 788 ; N a140 ; B 35 -14 754 705 ;
+C 193 ; WX 788 ; N a141 ; B 35 -14 754 705 ;
+C 194 ; WX 788 ; N a142 ; B 35 -14 754 705 ;
+C 195 ; WX 788 ; N a143 ; B 35 -14 754 705 ;
+C 196 ; WX 788 ; N a144 ; B 35 -14 754 705 ;
+C 197 ; WX 788 ; N a145 ; B 35 -14 754 705 ;
+C 198 ; WX 788 ; N a146 ; B 35 -14 754 705 ;
+C 199 ; WX 788 ; N a147 ; B 35 -14 754 705 ;
+C 200 ; WX 788 ; N a148 ; B 35 -14 754 705 ;
+C 201 ; WX 788 ; N a149 ; B 35 -14 754 705 ;
+C 202 ; WX 788 ; N a150 ; B 35 -14 754 705 ;
+C 203 ; WX 788 ; N a151 ; B 35 -14 754 705 ;
+C 204 ; WX 788 ; N a152 ; B 35 -14 754 705 ;
+C 205 ; WX 788 ; N a153 ; B 35 -14 754 705 ;
+C 206 ; WX 788 ; N a154 ; B 35 -14 754 705 ;
+C 207 ; WX 788 ; N a155 ; B 35 -14 754 705 ;
+C 208 ; WX 788 ; N a156 ; B 35 -14 754 705 ;
+C 209 ; WX 788 ; N a157 ; B 35 -14 754 705 ;
+C 210 ; WX 788 ; N a158 ; B 35 -14 754 705 ;
+C 211 ; WX 788 ; N a159 ; B 35 -14 754 705 ;
+C 212 ; WX 894 ; N a160 ; B 35 58 860 634 ;
+C 213 ; WX 838 ; N a161 ; B 35 152 803 540 ;
+C 214 ; WX 1016 ; N a163 ; B 34 152 981 540 ;
+C 215 ; WX 458 ; N a164 ; B 35 -127 422 820 ;
+C 216 ; WX 748 ; N a196 ; B 35 94 698 597 ;
+C 217 ; WX 924 ; N a165 ; B 35 140 890 552 ;
+C 218 ; WX 748 ; N a192 ; B 35 94 698 597 ;
+C 219 ; WX 918 ; N a166 ; B 35 166 884 526 ;
+C 220 ; WX 927 ; N a167 ; B 35 32 892 660 ;
+C 221 ; WX 928 ; N a168 ; B 35 129 891 562 ;
+C 222 ; WX 928 ; N a169 ; B 35 128 893 563 ;
+C 223 ; WX 834 ; N a170 ; B 35 155 799 537 ;
+C 224 ; WX 873 ; N a171 ; B 35 93 838 599 ;
+C 225 ; WX 828 ; N a172 ; B 35 104 791 588 ;
+C 226 ; WX 924 ; N a173 ; B 35 98 889 594 ;
+C 227 ; WX 924 ; N a162 ; B 35 98 889 594 ;
+C 228 ; WX 917 ; N a174 ; B 35 0 882 692 ;
+C 229 ; WX 930 ; N a175 ; B 35 84 896 608 ;
+C 230 ; WX 931 ; N a176 ; B 35 84 896 608 ;
+C 231 ; WX 463 ; N a177 ; B 35 -99 429 791 ;
+C 232 ; WX 883 ; N a178 ; B 35 71 848 623 ;
+C 233 ; WX 836 ; N a179 ; B 35 44 802 648 ;
+C 234 ; WX 836 ; N a193 ; B 35 44 802 648 ;
+C 235 ; WX 867 ; N a180 ; B 35 101 832 591 ;
+C 236 ; WX 867 ; N a199 ; B 35 101 832 591 ;
+C 237 ; WX 696 ; N a181 ; B 35 44 661 648 ;
+C 238 ; WX 696 ; N a200 ; B 35 44 661 648 ;
+C 239 ; WX 874 ; N a182 ; B 35 77 840 619 ;
+C 241 ; WX 874 ; N a201 ; B 35 73 840 615 ;
+C 242 ; WX 760 ; N a183 ; B 35 0 725 692 ;
+C 243 ; WX 946 ; N a184 ; B 35 160 911 533 ;
+C 244 ; WX 771 ; N a197 ; B 34 37 736 655 ;
+C 245 ; WX 865 ; N a185 ; B 35 207 830 481 ;
+C 246 ; WX 771 ; N a194 ; B 34 37 736 655 ;
+C 247 ; WX 888 ; N a198 ; B 34 -19 853 712 ;
+C 248 ; WX 967 ; N a186 ; B 35 124 932 568 ;
+C 249 ; WX 888 ; N a195 ; B 34 -19 853 712 ;
+C 250 ; WX 831 ; N a187 ; B 35 113 796 579 ;
+C 251 ; WX 873 ; N a188 ; B 36 118 838 578 ;
+C 252 ; WX 927 ; N a189 ; B 35 150 891 542 ;
+C 253 ; WX 970 ; N a190 ; B 35 76 931 616 ;
+C 254 ; WX 918 ; N a191 ; B 34 99 884 593 ;
+EndCharMetrics
+EndFontMetrics
diff --git a/src/fonts/LICENSE-FONTS.txt b/src/fonts/LICENSE-FONTS.txt
new file mode 100644
index 0000000..9a24662
--- /dev/null
+++ b/src/fonts/LICENSE-FONTS.txt
@@ -0,0 +1,74 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+Missing: texcmsl
+texcmsl
+-> remove this? it has nog GLE file!
+
+Total: 68
+
+1 Marker Font
+-------------
+
+glemark
+
+-> License OK: AFM file says: "Gle Markers are free for all".
+ GLE file is Modified BSD
+
+11 TeX Fonts
+------------
+
+texcmb texcmex texcmitt texcmmi texcmr texcmss texcmssb texcmssi texcmsy texcmti texcmtt
+
+-> Created from TeX TFM files
+
+18 Plotter Fonts
+----------------
+
+plba plcc plcg plci plcr plcs pldr plge plgg plgi plsa plsg plsr plss plsym1 plsym2 plti pltr
+
+-> HERSHEY font file using SPLITFONT.BAS
+
+38 PostScript Fonts
+-------------------
+
+psagb psagbo psagd psagdo psbd psbdi psbli psc pscb pscbo psco psh pshb pshbo pshc pshcb pshcbo pshcdo pshn pshnb pshnbo pshno psho psncsb psncsbi psncsi psncsr pspb pspbi pspi pspr pssym pstb pstbi psti pstr pszcmi pszd
+
+-> Copyright (c) 1984 Adobe Systems Incorporated.
+
+
diff --git a/src/fonts/Makefile.gcc b/src/fonts/Makefile.gcc
new file mode 100644
index 0000000..c6eadcc
--- /dev/null
+++ b/src/fonts/Makefile.gcc
@@ -0,0 +1,253 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+# TODO: find free AFMs for these:
+# pshc.fmt
+# pshcb.fmt
+# pshcbo.fmt
+# pshcdo.fmt
+
+# FONT MAKEFILE
+# makes font files *.fmt from *.afm using makefmt
+# makes *.fve from *.gle using fbuild
+# also makes font.dat
+
+include ../../config.gcc
+
+ADOBE35 = Adobe-Core35_AFMs-314
+
+FVE_BASE = \
+ glemark.fve \
+ texcmb.fve texcmex.fve texcmitt.fve texcmmi.fve \
+ texcmr.fve texcmss.fve texcmssb.fve texcmssi.fve \
+ texcmsy.fve texcmti.fve texcmtt.fve
+
+FVE_EXTRA = \
+ plba.fve plcc.fve plcg.fve plci.fve \
+ plcr.fve plcs.fve pldr.fve plge.fve \
+ plgg.fve plgi.fve plsa.fve plsg.fve \
+ plsr.fve plss.fve plsym1.fve plsym2.fve \
+ plti.fve pltr.fve
+
+FMT_BASE = \
+ glemark.fmt \
+ texcmb.fmt texcmex.fmt texcmitt.fmt texcmmi.fmt texcmr.fmt \
+ texcmsl.fmt texcmssb.fmt texcmss.fmt texcmssi.fmt texcmsy.fmt \
+ texcmti.fmt texcmtt.fmt \
+ psagb.fmt psagbo.fmt psagd.fmt psagdo.fmt psbd.fmt psbdi.fmt \
+ psbl.fmt psbli.fmt pscb.fmt pscbo.fmt psc.fmt psco.fmt pshb.fmt \
+ pshbo.fmt psh.fmt pshnb.fmt pshnbo.fmt pshn.fmt pshno.fmt psho.fmt \
+ psncsb.fmt psncsbi.fmt psncsi.fmt psncsr.fmt pspb.fmt pspbi.fmt \
+ pspi.fmt pspr.fmt pssym.fmt pstb.fmt pstbi.fmt psti.fmt pstr.fmt \
+ pszcmi.fmt pszd.fmt
+
+FMT_EXTRA = \
+ plba.fmt plcc.fmt plcg.fmt plci.fmt plcr.fmt plcs.fmt pldr.fmt \
+ plge.fmt plgg.fmt plgi.fmt plsa.fmt plsg.fmt plsr.fmt plss.fmt \
+ plsym1.fmt plsym2.fmt plti.fmt pltr.fmt \
+ pshc.fmt pshcb.fmt pshcbo.fmt pshcdo.fmt
+
+FMT_KOI8 = arial8.fmt arialbd8.fmt arialbi8.fmt ariali8.fmt \
+ cour8.fmt courbd8.fmt courbi8.fmt couri8.fmt times8.fmt \
+ timesbd8.fmt timesbi8.fmt timesi8.fmt
+
+COMPILE_EXTRA_FONTS=
+ifeq ($(HAVE_EXTRA_FONTS),1)
+ COMPILE_EXTRA_FONTS=$(FVE_EXTRA) $(FMT_EXTRA) $(FMT_KOI8)
+endif
+
+all: $(FVE_BASE) $(FMT_BASE) $(COMPILE_EXTRA_FONTS) movefonts
+
+.SUFFIXES: .fve .fmt .afm .gle
+
+psagb.fmt: $(ADOBE35)/ITCAvantGarde-Book.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+psagbo.fmt: $(ADOBE35)/ITCAvantGarde-BookOblique.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+psagd.fmt: $(ADOBE35)/ITCAvantGarde-Demi.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+psagdo.fmt: $(ADOBE35)/ITCAvantGarde-DemiOblique.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+psbd.fmt: $(ADOBE35)/ITCBookman-Demi.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+psbdi.fmt: $(ADOBE35)/ITCBookman-DemiItalic.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+psbli.fmt: $(ADOBE35)/ITCBookman-LightItalic.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+psbl.fmt: $(ADOBE35)/ITCBookman-Light.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+psc.fmt: $(ADOBE35)/Courier.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+pscb.fmt: $(ADOBE35)/Courier-Bold.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+pscbo.fmt: $(ADOBE35)/Courier-BoldOblique.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+psco.fmt: $(ADOBE35)/Courier-Oblique.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+psh.fmt: $(ADOBE35)/Helvetica.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+pshb.fmt: $(ADOBE35)/Helvetica-Bold.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+pshbo.fmt: $(ADOBE35)/Helvetica-BoldOblique.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+pshn.fmt: $(ADOBE35)/Helvetica-Narrow.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+pshnb.fmt: $(ADOBE35)/Helvetica-NarrowBold.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+pshnbo.fmt: $(ADOBE35)/Helvetica-NarrowBoldOblique.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+pshno.fmt: $(ADOBE35)/Helvetica-NarrowOblique.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+psho.fmt: $(ADOBE35)/Helvetica-Oblique.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+psncsb.fmt: $(ADOBE35)/NewCenturySchlbk-Bold.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+psncsbi.fmt: $(ADOBE35)/NewCenturySchlbk-BoldItalic.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+psncsi.fmt: $(ADOBE35)/NewCenturySchlbk-Italic.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+psncsr.fmt: $(ADOBE35)/NewCenturySchlbk-Roman.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+pspb.fmt: $(ADOBE35)/Palatino-Bold.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+pspbi.fmt: $(ADOBE35)/Palatino-BoldItalic.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+pspi.fmt: $(ADOBE35)/Palatino-Italic.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+pspr.fmt: $(ADOBE35)/Palatino-Roman.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+pstb.fmt: $(ADOBE35)/Times-Bold.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+pstbi.fmt: $(ADOBE35)/Times-BoldItalic.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+psti.fmt: $(ADOBE35)/Times-Italic.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+pstr.fmt: $(ADOBE35)/Times-Roman.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+pszcmi.fmt: $(ADOBE35)/ITCZapfChancery-MediumItalic.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+pssym.fmt: $(ADOBE35)/Symbol.afm
+ $(PROJECT_BINDIR)/bin/makefmt -o $@ $<
+
+pszd.fmt: $(ADOBE35)/ZapfDingbats.afm
+ $(PROJECT_BINDIR)/bin/makefmt -o $@ $<
+
+arial8.fmt: cyrillic/arial8.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e koi8r.enc -o $@ $<
+
+arialbd8.fmt: cyrillic/arialbd8.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e koi8r.enc -o $@ $<
+
+arialbi8.fmt: cyrillic/arialbi8.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e koi8r.enc -o $@ $<
+
+ariali8.fmt: cyrillic/ariali8.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e koi8r.enc -o $@ $<
+
+cour8.fmt: cyrillic/cokoi8n.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e koi8r.enc -o $@ $<
+
+courbd8.fmt: cyrillic/cokoi8b.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e koi8r.enc -o $@ $<
+
+courbi8.fmt: cyrillic/cokoi8bi.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e koi8r.enc -o $@ $<
+
+couri8.fmt: cyrillic/cokoi8i.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e koi8r.enc -o $@ $<
+
+times8.fmt: cyrillic/times8.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e koi8r.enc -o $@ $<
+
+timesbd8.fmt: cyrillic/timesbd8.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e koi8r.enc -o $@ $<
+
+timesbi8.fmt: cyrillic/timesbi8.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e koi8r.enc -o $@ $<
+
+timesi8.fmt: cyrillic/timesi8.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e koi8r.enc -o $@ $<
+
+.afm.fmt:
+ $(PROJECT_BINDIR)/bin/makefmt $<
+
+.gle.fve:
+ $(PROJECT_BINDIR)/bin/fbuild $<
+
+clean:
+ -$(RM) *.fve *.fmt movefonts
+
+movefonts: $(FVE) $(FMT) $(PROJECT_BINDIR)/bin/makefmt $(PROJECT_BINDIR)/bin/fbuild
+ -mkdir -p $(PROJECT_BINDIR)/font
+ -cp -p *.fve *.fmt $(PROJECT_BINDIR)/font
+ -cp -p font.dat $(PROJECT_BINDIR)/font
+ -cp -p psfont.dat $(PROJECT_BINDIR)/font
+ touch movefonts
diff --git a/src/fonts/Makefile.os2 b/src/fonts/Makefile.os2
new file mode 100644
index 0000000..80fd5a5
--- /dev/null
+++ b/src/fonts/Makefile.os2
@@ -0,0 +1,91 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+# FONT MAKEFILE
+# makes font files *.fmt from *.afm using makefmt
+# makes *.fve fron *.gle using fbuild
+# also makes font.dat
+#
+include ../../config.os2
+
+FVE = \
+ glemark.fve plba.fve plcc.fve plcg.fve plci.fve \
+ plcr.fve plcs.fve pldr.fve plge.fve \
+ plgg.fve plgi.fve plsa.fve plsg.fve \
+ plsr.fve plss.fve plsym1.fve plsym2.fve \
+ plti.fve pltr.fve texcmb.fve texcmex.fve \
+ texcmitt.fve texcmmi.fve texcmr.fve texcmss.fve \
+ texcmssb.fve texcmssi.fve texcmsy.fve texcmti.fve \
+ texcmtt.fve
+
+FMT = \
+ glemark.fmt plba.fmt plcc.fmt plcg.fmt \
+ plci.fmt plcr.fmt plcs.fmt pldr.fmt \
+ plge.fmt plgg.fmt plgi.fmt plsa.fmt plsg.fmt \
+ plsr.fmt plss.fmt plsym1.fmt plsym2.fmt plti.fmt \
+ pltr.fmt psagb.fmt psagbo.fmt psagd.fmt psagdo.fmt \
+ psbd.fmt psbdi.fmt psbli.fmt psc.fmt pscb.fmt \
+ pscbo.fmt psco.fmt psh.fmt pshb.fmt pshbo.fmt \
+ pshc.fmt pshcb.fmt pshcbo.fmt pshcdo.fmt pshn.fmt \
+ pshnb.fmt pshnbo.fmt pshno.fmt psho.fmt psncsb.fmt \
+ psncsbi.fmt psncsi.fmt psncsr.fmt pspb.fmt pspbi.fmt \
+ pspi.fmt pspr.fmt pssym.fmt pstb.fmt pstbi.fmt \
+ psti.fmt pstr.fmt pszcmi.fmt pszd.fmt texcmb.fmt \
+ texcmex.fmt texcmitt.fmt texcmmi.fmt texcmr.fmt texcmsl.fmt \
+ texcmss.fmt texcmssb.fmt texcmssi.fmt texcmsy.fmt texcmti.fmt \
+ texcmtt.fmt
+
+all: $(FVE) $(FMT) movefonts
+
+.SUFFIXES: .fve .fmt .afm .gle
+
+.afm.fmt:
+ $(PROJECT_BINDIR)/bin/makefmt.exe $<
+
+.gle.fve:
+ $(PROJECT_BINDIR)/bin/fbuild.exe $<
+
+clean:
+ -$(RM) *.fve *.fmt
+
+movefonts: $(FVE) $(FMT) $(PROJECT_BINDIR)/bin/makefmt.exe $(PROJECT_BINDIR)/bin/fbuild.exe
+ -mkdir.exe $(PROJECT_BINDIR)/font
+ -cp.exe *.fve *.fmt $(PROJECT_BINDIR)/font
+ -cp.exe font.dat $(PROJECT_BINDIR)/font
+ -cp.exe psfont.dat $(PROJECT_BINDIR)/font
+
diff --git a/src/fonts/Makefile.vc b/src/fonts/Makefile.vc
new file mode 100644
index 0000000..f0a45e1
--- /dev/null
+++ b/src/fonts/Makefile.vc
@@ -0,0 +1,204 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+# FONT MAKEFILE
+# makes font files *.fmt from *.afm using makefmt
+# makes *.fve fron *.gle using fbuild
+# also makes font.dat
+#
+
+!include ..\..\config.vc
+
+RM = del
+
+ADOBE35 = Adobe-Core35_AFMs-314
+
+FVE = \
+ glemark.fve plba.fve plcc.fve plcg.fve plci.fve \
+ plcr.fve plcs.fve pldr.fve plge.fve \
+ plgg.fve plgi.fve plsa.fve plsg.fve \
+ plsr.fve plss.fve plsym1.fve plsym2.fve \
+ plti.fve pltr.fve texcmb.fve texcmex.fve \
+ texcmitt.fve texcmmi.fve texcmr.fve texcmss.fve \
+ texcmssb.fve texcmssi.fve texcmsy.fve texcmti.fve \
+ texcmtt.fve
+
+FMT = \
+ glemark.fmt \
+ texcmb.fmt texcmex.fmt texcmitt.fmt texcmmi.fmt texcmr.fmt \
+ texcmsl.fmt texcmssb.fmt texcmss.fmt texcmssi.fmt texcmsy.fmt \
+ texcmti.fmt texcmtt.fmt \
+ plba.fmt plcc.fmt plcg.fmt plci.fmt plcr.fmt plcs.fmt pldr.fmt \
+ plge.fmt plgg.fmt plgi.fmt plsa.fmt plsg.fmt plsr.fmt plss.fmt \
+ plsym1.fmt plsym2.fmt plti.fmt pltr.fmt \
+ psagb.fmt psagbo.fmt psagd.fmt psagdo.fmt psbd.fmt psbdi.fmt \
+ psbl.fmt psbli.fmt pscb.fmt pscbo.fmt psc.fmt psco.fmt pshb.fmt pshbo.fmt \
+ pshcb.fmt pshcbo.fmt pshcdo.fmt pshc.fmt psh.fmt pshnb.fmt \
+ pshnbo.fmt pshn.fmt pshno.fmt psho.fmt psncsb.fmt psncsbi.fmt \
+ psncsi.fmt psncsr.fmt pspb.fmt pspbi.fmt pspi.fmt pspr.fmt \
+ pssym.fmt pstb.fmt pstbi.fmt psti.fmt pstr.fmt pszcmi.fmt pszd.fmt
+
+all: $(FVE) $(FMT) movefonts
+
+.SUFFIXES: .fve .fmt .afm .gle
+
+psagb.fmt: $(ADOBE35)/ITCAvantGarde-Book.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+psagbo.fmt: $(ADOBE35)/ITCAvantGarde-BookOblique.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+psagd.fmt: $(ADOBE35)/ITCAvantGarde-Demi.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+psagdo.fmt: $(ADOBE35)/ITCAvantGarde-DemiOblique.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+psbd.fmt: $(ADOBE35)/ITCBookman-Demi.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+psbdi.fmt: $(ADOBE35)/ITCBookman-DemiItalic.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+psbli.fmt: $(ADOBE35)/ITCBookman-LightItalic.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+psbl.fmt: $(ADOBE35)/ITCBookman-Light.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+psc.fmt: $(ADOBE35)/Courier.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+pscb.fmt: $(ADOBE35)/Courier-Bold.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+pscbo.fmt: $(ADOBE35)/Courier-BoldOblique.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+psco.fmt: $(ADOBE35)/Courier-Oblique.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+psh.fmt: $(ADOBE35)/Helvetica.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+pshb.fmt: $(ADOBE35)/Helvetica-Bold.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+pshbo.fmt: $(ADOBE35)/Helvetica-BoldOblique.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+pshn.fmt: $(ADOBE35)/Helvetica-Narrow.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+pshnb.fmt: $(ADOBE35)/Helvetica-NarrowBold.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+pshnbo.fmt: $(ADOBE35)/Helvetica-NarrowBoldOblique.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+pshno.fmt: $(ADOBE35)/Helvetica-NarrowOblique.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+psho.fmt: $(ADOBE35)/Helvetica-Oblique.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+psncsb.fmt: $(ADOBE35)/NewCenturySchlbk-Bold.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+psncsbi.fmt: $(ADOBE35)/NewCenturySchlbk-BoldItalic.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+psncsi.fmt: $(ADOBE35)/NewCenturySchlbk-Italic.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+psncsr.fmt: $(ADOBE35)/NewCenturySchlbk-Roman.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+pspb.fmt: $(ADOBE35)/Palatino-Bold.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+pspbi.fmt: $(ADOBE35)/Palatino-BoldItalic.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+pspi.fmt: $(ADOBE35)/Palatino-Italic.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+pspr.fmt: $(ADOBE35)/Palatino-Roman.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+pstb.fmt: $(ADOBE35)/Times-Bold.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+pstbi.fmt: $(ADOBE35)/Times-BoldItalic.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+psti.fmt: $(ADOBE35)/Times-Italic.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+pstr.fmt: $(ADOBE35)/Times-Roman.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+pszcmi.fmt: $(ADOBE35)/ITCZapfChancery-MediumItalic.afm
+ $(PROJECT_BINDIR)/bin/makefmt -e adobestd.enc -o $@ $<
+
+pssym.fmt: $(ADOBE35)/Symbol.afm
+ $(PROJECT_BINDIR)/bin/makefmt -o $@ $<
+
+pszd.fmt: $(ADOBE35)/ZapfDingbats.afm
+ $(PROJECT_BINDIR)/bin/makefmt -o $@ $<
+
+.afm.fmt:
+ $(PROJECT_BINDIR)\bin\makefmt $<
+
+.gle.fve:
+ $(PROJECT_BINDIR)\bin\fbuild $<
+
+clean:
+ -$(RM) *.fve *.fmt
+
+movefonts:
+ -mkdir $(PROJECT_BINDIR)\font
+ -copy *.fve $(PROJECT_BINDIR)\font
+ -copy *.fmt $(PROJECT_BINDIR)\font
+ -copy font.dat $(PROJECT_BINDIR)\font
+ -copy psfont.dat $(PROJECT_BINDIR)\font
+
+d2u:
+ d2u -u -z $(AFM)
+
+
diff --git a/src/fonts/adobestd.enc b/src/fonts/adobestd.enc
new file mode 100644
index 0000000..a5e8ec3
--- /dev/null
+++ b/src/fonts/adobestd.enc
@@ -0,0 +1,356 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+!$FFFF, 45; hyphen
+!$FFFF, 164; fraction
+!$FFFF, 197; macron
+
+$0020, 32; space
+$0021, 33; exclam
+$0022, 34; quotedbl
+$0023, 35; numbersign
+$0024, 36; dollar
+$0025, 37; percent
+$0026, 38; ampersand
+$2019, 39; quoteright
+$0028, 40; parenleft
+$0029, 41; parenright
+$002A, 42; asterisk
+$002B, 43; plus
+$002C, 44; comma
+$FFFF, 45; hyphen
+$002E, 46; period
+$002F, 47; slash
+$0030, 48; zero
+$0031, 49; one
+$0032, 50; two
+$0033, 51; three
+$0034, 52; four
+$0035, 53; five
+$0036, 54; six
+$0037, 55; seven
+$0038, 56; eight
+$0039, 57; nine
+$003A, 58; colon
+$003B, 59; semicolon
+$003C, 60; less
+$003D, 61; equal
+$003E, 62; greater
+$003F, 63; question
+$0040, 64; at
+$0041, 65; A
+$0042, 66; B
+$0043, 67; C
+$0044, 68; D
+$0045, 69; E
+$0046, 70; F
+$0047, 71; G
+$0048, 72; H
+$0049, 73; I
+$004A, 74; J
+$004B, 75; K
+$004C, 76; L
+$004D, 77; M
+$004E, 78; N
+$004F, 79; O
+$0050, 80; P
+$0051, 81; Q
+$0052, 82; R
+$0053, 83; S
+$0054, 84; T
+$0055, 85; U
+$0056, 86; V
+$0057, 87; W
+$0058, 88; X
+$0059, 89; Y
+$005A, 90; Z
+$005B, 91; bracketleft
+$005C, 92; backslash
+$005D, 93; bracketright
+$005E, 94; asciicircum
+$005F, 95; underscore
+$2018, 96; quoteleft
+$0061, 97; a
+$0062, 98; b
+$0063, 99; c
+$0064, 100; d
+$0065, 101; e
+$0066, 102; f
+$0067, 103; g
+$0068, 104; h
+$0069, 105; i
+$006A, 106; j
+$006B, 107; k
+$006C, 108; l
+$006D, 109; m
+$006E, 110; n
+$006F, 111; o
+$0070, 112; p
+$0071, 113; q
+$0072, 114; r
+$0073, 115; s
+$0074, 116; t
+$0075, 117; u
+$0076, 118; v
+$0077, 119; w
+$0078, 120; x
+$0079, 121; y
+$007A, 122; z
+$007B, 123; braceleft
+$007C, 124; bar
+$007D, 125; braceright
+$007E, 126; asciitilde
+$00A1, 161; exclamdown
+$00A2, 162; cent
+$00A3, 163; sterling
+$FFFF, 164; fraction
+$00A5, 165; yen
+$0192, 166; florin
+$00A7, 167; section
+$00A4, 168; currency
+$0027, 169; quotesingle
+$201C, 170; quotedblleft
+$00AB, 171; guillemotleft
+$2039, 172; guilsinglleft
+$203A, 173; guilsinglright
+$FB01, 174; fi
+$FB02, 175; fl
+$2013, 177; endash
+$2020, 178; dagger
+$2021, 179; daggerdbl
+$2219, 180; periodcentered
+$00B6, 182; paragraph
+$2022, 183; bullet
+$201A, 184; quotesinglbase
+$201E, 185; quotedblbase
+$201D, 186; quotedblright
+$00BB, 187; guillemotright
+$2026, 188; ellipsis
+$2030, 189; perthousand
+$00BF, 191; questiondown
+$0060, 193; grave
+$00B4, 194; acute
+$02C6, 195; circumflex
+$02DC, 196; tilde
+$FFFF, 197; macron
+$02D8, 198; breve
+$02D9, 199; dotaccent
+$00A8, 200; dieresis
+$02DA, 202; ring
+$00B8, 203; cedilla
+$02DD, 205; hungarumlaut
+$02DB, 206; ogonek
+$02C7, 207; caron
+$2014, 208; emdash
+$00C6, 225; AE
+$00AA, 227; ordfeminine
+$0141, 232; Lslash
+$00D8, 233; Oslash
+$0152, 234; OE
+$00BA, 235; ordmasculine
+$00E6, 241; ae
+$0131, 245; dotlessi
+$0142, 248; lslash
+$00F8, 249; oslash
+$0153, 250; oe
+$00DF, 251; germandbls
+$00C1, 256; Aacute
+$0102, 257; Abreve
+$00C2, 258; Acircumflex
+$00C4, 259; Adieresis
+$00C0, 260; Agrave
+$0100, 261; Amacron
+$0104, 262; Aogonek
+$00C5, 263; Aring
+$00C3, 264; Atilde
+$0106, 265; Cacute
+$010C, 266; Ccaron
+$00C7, 267; Ccedilla
+$010E, 268; Dcaron
+$0110, 269; Dcroat
+$0394, 270; Delta
+$00C9, 271; Eacute
+$011A, 272; Ecaron
+$00CA, 273; Ecircumflex
+$00CB, 274; Edieresis
+$0116, 275; Edotaccent
+$00C8, 276; Egrave
+$0112, 277; Emacron
+$0118, 278; Eogonek
+$00D0, 279; Eth
+$011E, 280; Gbreve
+$0122, 281; Gcommaaccent
+$00CD, 282; Iacute
+$00CE, 283; Icircumflex
+$00CF, 284; Idieresis
+$0130, 285; Idotaccent
+$00CC, 286; Igrave
+$012A, 287; Imacron
+$012E, 288; Iogonek
+$0136, 289; Kcommaaccent
+$0139, 290; Lacute
+$013D, 291; Lcaron
+$013B, 292; Lcommaaccent
+$0143, 293; Nacute
+$0147, 294; Ncaron
+$0145, 295; Ncommaaccent
+$00D1, 296; Ntilde
+$00D3, 297; Oacute
+$00D4, 298; Ocircumflex
+$00D6, 299; Odieresis
+$00D2, 300; Ograve
+$0150, 301; Ohungarumlaut
+$014C, 302; Omacron
+$00D5, 303; Otilde
+$0154, 304; Racute
+$0158, 305; Rcaron
+$0156, 306; Rcommaaccent
+$015A, 307; Sacute
+$0160, 308; Scaron
+$015E, 309; Scedilla
+$0218, 310; Scommaaccent
+$0164, 311; Tcaron
+$016A, 312; Tcommaaccent
+$00DE, 313; Thorn
+$00DA, 314; Uacute
+$00DB, 315; Ucircumflex
+$00DC, 316; Udieresis
+$00D9, 317; Ugrave
+$0170, 318; Uhungarumlaut
+$016A, 319; Umacron
+$0172, 320; Uogonek
+$016E, 321; Uring
+$00DD, 322; Yacute
+$0178, 323; Ydieresis
+$0179, 324; Zacute
+$017D, 325; Zcaron
+$017B, 326; Zdotaccent
+$00E1, 327; aacute
+$0103, 328; abreve
+$00E2, 329; acircumflex
+$00E4, 330; adieresis
+$00E0, 331; agrave
+$0101, 332; amacron
+$0105, 333; aogonek
+$00E5, 334; aring
+$00E3, 335; atilde
+$00A6, 336; brokenbar
+$0107, 337; cacute
+$010D, 338; ccaron
+$00E7, 339; ccedilla
+$F6C3, 340; commaaccent
+$00A9, 341; copyright
+$010F, 342; dcaron
+$0111, 343; dcroat
+$00B0, 344; degree
+$00F7, 345; divide
+$00E9, 346; eacute
+$011B, 347; ecaron
+$00EA, 348; ecircumflex
+$00EB, 349; edieresis
+$0117, 350; edotaccent
+$00E8, 351; egrave
+$0113, 352; emacron
+$0119, 353; eogonek
+$00F0, 354; eth
+$011F, 355; gbreve
+$0123, 356; gcommaaccent
+$2265, 357; greaterequal
+$00ED, 358; iacute
+$00EE, 359; icircumflex
+$00EF, 360; idieresis
+$00EC, 361; igrave
+$012B, 362; imacron
+$012F, 363; iogonek
+$0137, 364; kcommaaccent
+$013A, 365; lacute
+$013E, 366; lcaron
+$013C, 367; lcommaaccent
+$2264, 368; lessequal
+$00AC, 369; logicalnot
+$25CA, 370; lozenge
+$2212, 371; minus
+$03BC, 372; mu
+$00D7, 373; multiply
+$0144, 374; nacute
+$0148, 375; ncaron
+$0146, 376; ncommaaccent
+$2260, 377; notequal
+$00F1, 378; ntilde
+$00F3, 379; oacute
+$00F4, 380; ocircumflex
+$00F6, 381; odieresis
+$00F2, 382; ograve
+$0151, 383; ohungarumlaut
+$014D, 384; omacron
+$00BD, 385; onehalf
+$00BC, 386; onequarter
+$00B9, 387; onesuperior
+$00F5, 388; otilde
+$2202, 389; partialdiff
+$00B1, 390; plusminus
+$0155, 391; racute
+$221A, 392; radical
+$0159, 393; rcaron
+$0157, 394; rcommaaccent
+$00AE, 395; registered
+$015B, 396; sacute
+$0161, 397; scaron
+$015F, 398; scedilla
+$0219, 399; scommaaccent
+$2211, 400; summation
+$0165, 401; tcaron
+$0163, 402; tcommaaccent
+$00FE, 403; thorn
+$00BE, 404; threequarters
+$00B3, 405; threesuperior
+$2122, 406; trademark
+$00B2, 407; twosuperior
+$00FA, 408; uacute
+$00FB, 409; ucircumflex
+$00FC, 410; udieresis
+$00F9, 411; ugrave
+$0171, 412; uhungarumlaut
+$016B, 413; umacron
+$0173, 414; uogonek
+$016F, 415; uring
+$00FD, 416; yacute
+$00FF, 417; ydieresis
+$017A, 418; zacute
+$017E, 419; zcaron
+$017C, 420; zdotaccent
diff --git a/src/fonts/checkfonts.pl b/src/fonts/checkfonts.pl
new file mode 100644
index 0000000..99d7afa
--- /dev/null
+++ b/src/fonts/checkfonts.pl
@@ -0,0 +1,83 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+$files1 = `/bin/ls *.gle`;
+$files2 = `/bin/ls *.afm`;
+
+$files = "$files1 $files2";
+$files =~ s/\.gle//g;
+$files =~ s/\.afm//g;
+
+ at LIST = split(/\s+/, $files);
+
+foreach $f (@LIST) {
+ $FONT{$f} = 1;
+}
+
+open(IN, "font.dat") || die "Can't open font.dat";
+while ($line = <IN>) {
+ chomp($line);
+ if (!($line =~ /^\s*\!/)) {
+ if ($line =~ /^([^\s]+)\s/) {
+ $HAS{$1} = 1;
+ }
+ }
+}
+close(IN);
+
+foreach $f (sort keys %FONT) {
+ if ($HAS{$f} != 1) {
+ print "Missing: $f\n";
+ }
+}
+
+ at AFM = split(/\s+/, $files2);
+
+$count = 0;
+foreach $afm (@AFM) {
+ $file = $afm;
+ $file =~ s/\.afm//g;
+ if (-f "$file.gle") {
+ print "$afm [GLE]\n";
+ } else {
+ print "$afm\n";
+ }
+ $count++;
+}
+
+print "Total: $count\n";
diff --git a/src/fonts/cyrillic/arial8.afm b/src/fonts/cyrillic/arial8.afm
new file mode 100644
index 0000000..f83c6f7
--- /dev/null
+++ b/src/fonts/cyrillic/arial8.afm
@@ -0,0 +1,244 @@
+StartFontMetrics 3.0
+FontName ArialCyrMT
+FullName Arial KOI 8
+FamilyName Arial KOI-8
+Weight Regular
+ItalicAngle 0
+IsFixedPitch false
+FontBBox -44 -210 981 881
+UnderlinePosition -217
+UnderlineThickness 150
+Version 1.1
+Notice Typeface <c> The Monotype Corporation plc. 1990-92. Changes <c> 1997 by Eugene V. Demidov
+EncodingScheme FontSpecific
+CapHeight 728
+XHeight 530
+Ascender 728
+Descender -210
+StartCharMetrics 224
+C 32 ; WX 278 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 279 ; N exclam ; B 84 0 193 716 ;
+C 34 ; WX 354 ; N quotedbl ; B 46 462 309 716 ;
+C 35 ; WX 556 ; N numbersign ; B 12 -12 545 728 ;
+C 36 ; WX 556 ; N dollar ; B 38 -103 511 782 ;
+C 37 ; WX 889 ; N percent ; B 60 -26 830 728 ;
+C 38 ; WX 667 ; N ampersand ; B 43 -17 644 728 ;
+C 39 ; WX 189 ; N quoteright ; B 45 462 145 716 ;
+C 40 ; WX 333 ; N parenleft ; B 61 -210 297 728 ;
+C 41 ; WX 333 ; N parenright ; B 36 -210 272 728 ;
+C 42 ; WX 389 ; N asterisk ; B 33 423 356 728 ;
+C 43 ; WX 584 ; N plus ; B 56 116 528 589 ;
+C 44 ; WX 279 ; N comma ; B 81 -142 187 100 ;
+C 45 ; WX 333 ; N hyphen ; B 32 215 302 303 ;
+C 46 ; WX 279 ; N period ; B 89 0 189 100 ;
+C 47 ; WX 278 ; N slash ; B 0 -12 278 728 ;
+C 48 ; WX 556 ; N zero ; B 44 -12 510 718 ;
+C 49 ; WX 556 ; N one ; B 111 0 375 719 ;
+C 50 ; WX 556 ; N two ; B 31 0 504 718 ;
+C 51 ; WX 556 ; N three ; B 44 -12 513 719 ;
+C 52 ; WX 556 ; N four ; B 15 0 510 716 ;
+C 53 ; WX 556 ; N five ; B 43 -12 518 706 ;
+C 54 ; WX 556 ; N six ; B 42 -12 514 719 ;
+C 55 ; WX 556 ; N seven ; B 50 0 513 706 ;
+C 56 ; WX 556 ; N eight ; B 43 -12 514 719 ;
+C 57 ; WX 556 ; N nine ; B 44 -12 514 718 ;
+C 58 ; WX 279 ; N colon ; B 89 0 189 519 ;
+C 59 ; WX 279 ; N semicolon ; B 81 -142 187 519 ;
+C 60 ; WX 584 ; N less ; B 55 110 529 595 ;
+C 61 ; WX 584 ; N equal ; B 55 204 528 503 ;
+C 62 ; WX 584 ; N greater ; B 55 110 529 595 ;
+C 63 ; WX 556 ; N question ; B 46 0 508 728 ;
+C 64 ; WX 1015 ; N at ; B 57 -210 981 729 ;
+C 65 ; WX 667 ; N A ; B -1 0 669 716 ;
+C 66 ; WX 667 ; N B ; B 74 0 614 716 ;
+C 67 ; WX 722 ; N C ; B 51 -12 684 728 ;
+C 68 ; WX 722 ; N D ; B 78 0 671 716 ;
+C 69 ; WX 667 ; N E ; B 79 0 613 716 ;
+C 70 ; WX 612 ; N F ; B 80 0 563 716 ;
+C 71 ; WX 778 ; N G ; B 52 -12 714 728 ;
+C 72 ; WX 722 ; N H ; B 80 0 642 716 ;
+C 73 ; WX 279 ; N I ; B 92 0 187 716 ;
+C 74 ; WX 500 ; N J ; B 29 -12 422 716 ;
+C 75 ; WX 667 ; N K ; B 74 0 666 716 ;
+C 76 ; WX 556 ; N L ; B 75 0 522 716 ;
+C 77 ; WX 833 ; N M ; B 75 0 758 716 ;
+C 78 ; WX 722 ; N N ; B 79 0 643 716 ;
+C 79 ; WX 778 ; N O ; B 47 -12 732 728 ;
+C 80 ; WX 667 ; N P ; B 77 0 624 716 ;
+C 81 ; WX 778 ; N Q ; B 47 -56 745 728 ;
+C 82 ; WX 722 ; N R ; B 80 0 711 716 ;
+C 83 ; WX 667 ; N S ; B 45 -12 615 728 ;
+C 84 ; WX 612 ; N T ; B 21 0 589 716 ;
+C 85 ; WX 722 ; N U ; B 79 -12 643 716 ;
+C 86 ; WX 667 ; N V ; B 5 0 660 716 ;
+C 87 ; WX 944 ; N W ; B 10 0 931 716 ;
+C 88 ; WX 667 ; N X ; B 5 0 661 716 ;
+C 89 ; WX 667 ; N Y ; B 3 0 659 716 ;
+C 90 ; WX 612 ; N Z ; B 18 0 584 716 ;
+C 91 ; WX 279 ; N bracketleft ; B 66 -198 260 715 ;
+C 92 ; WX 278 ; N backslash ; B 0 -12 278 728 ;
+C 93 ; WX 279 ; N bracketright ; B 18 -198 211 715 ;
+C 94 ; WX 469 ; N asciicircum ; B 26 337 443 728 ;
+C 95 ; WX 556 ; N underscore ; B -6 -198 562 -135 ;
+C 96 ; WX 333 ; N quoteleft ; B 43 583 227 719 ;
+C 97 ; WX 556 ; N a ; B 38 -12 516 530 ;
+C 98 ; WX 556 ; N b ; B 67 -12 517 716 ;
+C 99 ; WX 500 ; N c ; B 39 -12 491 530 ;
+C 100 ; WX 556 ; N d ; B 36 -12 486 716 ;
+C 101 ; WX 556 ; N e ; B 38 -12 517 530 ;
+C 102 ; WX 279 ; N f ; B 8 0 311 728 ;
+C 103 ; WX 556 ; N g ; B 34 -210 491 530 ;
+C 104 ; WX 556 ; N h ; B 67 0 490 716 ;
+C 105 ; WX 222 ; N i ; B 67 0 155 716 ;
+C 106 ; WX 222 ; N j ; B -44 -210 155 716 ;
+C 107 ; WX 500 ; N k ; B 66 0 496 716 ;
+C 108 ; WX 222 ; N l ; B 66 0 154 716 ;
+C 109 ; WX 833 ; N m ; B 65 0 768 530 ;
+C 110 ; WX 556 ; N n ; B 68 0 489 530 ;
+C 111 ; WX 556 ; N o ; B 35 -12 521 530 ;
+C 112 ; WX 556 ; N p ; B 68 -199 518 530 ;
+C 113 ; WX 556 ; N q ; B 37 -199 486 530 ;
+C 114 ; WX 333 ; N r ; B 65 0 347 530 ;
+C 115 ; WX 500 ; N s ; B 31 -12 461 530 ;
+C 116 ; WX 279 ; N t ; B 16 -7 269 700 ;
+C 117 ; WX 556 ; N u ; B 66 -11 486 519 ;
+C 118 ; WX 500 ; N v ; B 12 0 488 519 ;
+C 119 ; WX 722 ; N w ; B 5 0 717 519 ;
+C 120 ; WX 500 ; N x ; B 8 0 493 519 ;
+C 121 ; WX 500 ; N y ; B 16 -210 491 519 ;
+C 122 ; WX 500 ; N z ; B 20 0 479 518 ;
+C 123 ; WX 333 ; N braceleft ; B 28 -210 311 728 ;
+C 124 ; WX 260 ; N bar ; B 92 -210 169 728 ;
+C 125 ; WX 333 ; N braceright ; B 23 -210 306 728 ;
+C 126 ; WX 584 ; N asciitilde ; B 42 272 542 432 ;
+C 128 ; WX 278 ; N c128 ; B 0 0 0 0 ;
+C 129 ; WX 278 ; N c129 ; B 0 0 0 0 ;
+C 130 ; WX 278 ; N c130 ; B 0 0 0 0 ;
+C 131 ; WX 278 ; N c131 ; B 0 0 0 0 ;
+C 132 ; WX 278 ; N c132 ; B 0 0 0 0 ;
+C 133 ; WX 278 ; N c133 ; B 0 0 0 0 ;
+C 134 ; WX 278 ; N c134 ; B 0 0 0 0 ;
+C 135 ; WX 278 ; N c135 ; B 0 0 0 0 ;
+C 136 ; WX 278 ; N c136 ; B 0 0 0 0 ;
+C 137 ; WX 278 ; N c137 ; B 0 0 0 0 ;
+C 138 ; WX 278 ; N c138 ; B 0 0 0 0 ;
+C 139 ; WX 278 ; N c139 ; B 0 0 0 0 ;
+C 140 ; WX 278 ; N c140 ; B 0 0 0 0 ;
+C 141 ; WX 278 ; N c141 ; B 0 0 0 0 ;
+C 142 ; WX 278 ; N c142 ; B 0 0 0 0 ;
+C 143 ; WX 278 ; N c143 ; B 0 0 0 0 ;
+C 144 ; WX 278 ; N c144 ; B 0 0 0 0 ;
+C 145 ; WX 278 ; N c145 ; B 0 0 0 0 ;
+C 146 ; WX 278 ; N c146 ; B 0 0 0 0 ;
+C 147 ; WX 278 ; N c147 ; B 0 0 0 0 ;
+C 148 ; WX 278 ; N c148 ; B 0 0 0 0 ;
+C 149 ; WX 278 ; N c149 ; B 0 0 0 0 ;
+C 150 ; WX 278 ; N c150 ; B 0 0 0 0 ;
+C 151 ; WX 278 ; N c151 ; B 0 0 0 0 ;
+C 152 ; WX 278 ; N c152 ; B 0 0 0 0 ;
+C 153 ; WX 278 ; N c153 ; B 0 0 0 0 ;
+C 154 ; WX 278 ; N c154 ; B 0 0 0 0 ;
+C 155 ; WX 278 ; N c155 ; B 0 0 0 0 ;
+C 156 ; WX 278 ; N c156 ; B 0 0 0 0 ;
+C 157 ; WX 278 ; N c157 ; B 0 0 0 0 ;
+C 158 ; WX 278 ; N c158 ; B 0 0 0 0 ;
+C 159 ; WX 278 ; N c159 ; B 0 0 0 0 ;
+C 160 ; WX 278 ; N nbspace ; B 0 0 0 0 ;
+C 161 ; WX 278 ; N exclamdown ; B 0 0 0 0 ;
+C 162 ; WX 278 ; N cent ; B 0 0 0 0 ;
+C 163 ; WX 556 ; N sterling ; B 38 -12 517 720 ;
+C 164 ; WX 278 ; N currency ; B 0 0 0 0 ;
+C 165 ; WX 278 ; N yen ; B 0 0 0 0 ;
+C 166 ; WX 278 ; N brokenbar ; B 0 0 0 0 ;
+C 167 ; WX 278 ; N section ; B 0 0 0 0 ;
+C 168 ; WX 278 ; N dieresis ; B 0 0 0 0 ;
+C 169 ; WX 278 ; N copyright ; B 0 0 0 0 ;
+C 170 ; WX 278 ; N ordfeminine ; B 0 0 0 0 ;
+C 171 ; WX 278 ; N guillemotleft ; B 0 0 0 0 ;
+C 172 ; WX 278 ; N logicalnot ; B 0 0 0 0 ;
+C 173 ; WX 278 ; N softhyphen ; B 0 0 0 0 ;
+C 174 ; WX 278 ; N registered ; B 0 0 0 0 ;
+C 175 ; WX 278 ; N macron ; B 0 0 0 0 ;
+C 176 ; WX 278 ; N degree ; B 0 0 0 0 ;
+C 177 ; WX 278 ; N plusminus ; B 0 0 0 0 ;
+C 178 ; WX 278 ; N twosuperior ; B 0 0 0 0 ;
+C 179 ; WX 667 ; N threesuperior ; B 79 0 613 860 ;
+C 180 ; WX 278 ; N acute ; B 0 0 0 0 ;
+C 181 ; WX 278 ; N mu ; B 0 0 0 0 ;
+C 182 ; WX 278 ; N paragraph ; B 0 0 0 0 ;
+C 183 ; WX 278 ; N periodcentered ; B 0 0 0 0 ;
+C 184 ; WX 278 ; N cedilla ; B 0 0 0 0 ;
+C 185 ; WX 278 ; N onesuperior ; B 0 0 0 0 ;
+C 186 ; WX 278 ; N ordmasculine ; B 0 0 0 0 ;
+C 187 ; WX 278 ; N guillemotright ; B 0 0 0 0 ;
+C 188 ; WX 278 ; N onequarter ; B 0 0 0 0 ;
+C 189 ; WX 278 ; N onehalf ; B 0 0 0 0 ;
+C 190 ; WX 278 ; N threequarters ; B 0 0 0 0 ;
+C 191 ; WX 278 ; N questiondown ; B 0 0 0 0 ;
+C 192 ; WX 750 ; N Agrave ; B 67 -12 709 530 ;
+C 193 ; WX 556 ; N Aacute ; B 38 -12 516 530 ;
+C 194 ; WX 573 ; N Acircumflex ; B 45 -12 533 733 ;
+C 195 ; WX 573 ; N Atilde ; B 67 -199 543 519 ;
+C 196 ; WX 583 ; N Adieresis ; B 0 -147 553 518 ;
+C 197 ; WX 556 ; N Aring ; B 38 -12 517 530 ;
+C 198 ; WX 823 ; N AE ; B 37 -199 786 716 ;
+C 199 ; WX 365 ; N Ccedilla ; B 66 0 365 518 ;
+C 200 ; WX 500 ; N Egrave ; B 8 0 493 519 ;
+C 201 ; WX 559 ; N Eacute ; B 66 0 492 519 ;
+C 202 ; WX 559 ; N Ecircumflex ; B 66 0 492 716 ;
+C 203 ; WX 438 ; N Edieresis ; B 65 0 445 518 ;
+C 204 ; WX 583 ; N Igrave ; B 12 -3 517 518 ;
+C 205 ; WX 688 ; N Iacute ; B 68 0 619 519 ;
+C 206 ; WX 552 ; N Icircumflex ; B 66 0 486 519 ;
+C 207 ; WX 556 ; N Idieresis ; B 35 -12 521 530 ;
+C 208 ; WX 542 ; N Eth ; B 66 0 476 518 ;
+C 209 ; WX 542 ; N Ntilde ; B 15 0 474 518 ;
+C 210 ; WX 556 ; N Ograve ; B 68 -199 518 530 ;
+C 211 ; WX 500 ; N Oacute ; B 39 -12 491 530 ;
+C 212 ; WX 458 ; N Ocircumflex ; B 19 0 440 518 ;
+C 213 ; WX 500 ; N Otilde ; B 16 -210 491 519 ;
+C 214 ; WX 669 ; N Odieresis ; B -2 0 672 518 ;
+C 215 ; WX 531 ; N multiply ; B 66 0 492 518 ;
+C 216 ; WX 521 ; N Oslash ; B 64 0 490 519 ;
+C 217 ; WX 719 ; N Ugrave ; B 68 0 648 519 ;
+C 218 ; WX 458 ; N Uacute ; B 24 -12 423 530 ;
+C 219 ; WX 802 ; N Ucircumflex ; B 69 0 733 519 ;
+C 220 ; WX 510 ; N Udieresis ; B 24 -12 473 530 ;
+C 221 ; WX 823 ; N Yacute ; B 69 -199 791 519 ;
+C 222 ; WX 521 ; N Thorn ; B 34 0 455 519 ;
+C 223 ; WX 625 ; N germandbls ; B 0 0 589 518 ;
+C 224 ; WX 1010 ; N agrave ; B 80 -12 959 728 ;
+C 225 ; WX 667 ; N aacute ; B -1 0 669 716 ;
+C 226 ; WX 656 ; N acircumflex ; B 81 0 621 716 ;
+C 227 ; WX 740 ; N atilde ; B 77 -199 706 716 ;
+C 228 ; WX 677 ; N adieresis ; B 0 -167 642 716 ;
+C 229 ; WX 667 ; N aring ; B 79 0 613 716 ;
+C 230 ; WX 760 ; N ae ; B 40 0 720 722 ;
+C 231 ; WX 542 ; N ccedilla ; B 78 0 542 716 ;
+C 232 ; WX 667 ; N egrave ; B 5 0 661 716 ;
+C 233 ; WX 719 ; N eacute ; B 79 0 641 716 ;
+C 234 ; WX 719 ; N ecircumflex ; B 79 0 641 881 ;
+C 235 ; WX 583 ; N edieresis ; B 78 0 579 716 ;
+C 236 ; WX 656 ; N igrave ; B 9 -12 578 716 ;
+C 237 ; WX 833 ; N iacute ; B 75 0 758 716 ;
+C 238 ; WX 722 ; N icircumflex ; B 80 0 642 716 ;
+C 239 ; WX 778 ; N idieresis ; B 47 -12 732 728 ;
+C 240 ; WX 719 ; N eth ; B 78 0 641 716 ;
+C 241 ; WX 718 ; N ntilde ; B 9 0 640 716 ;
+C 242 ; WX 667 ; N ograve ; B 77 0 624 716 ;
+C 243 ; WX 722 ; N oacute ; B 51 -12 684 728 ;
+C 244 ; WX 613 ; N ocircumflex ; B 22 0 590 716 ;
+C 245 ; WX 635 ; N otilde ; B 5 -10 633 716 ;
+C 246 ; WX 923 ; N odieresis ; B 3 0 919 716 ;
+C 247 ; WX 667 ; N divide ; B 74 0 614 716 ;
+C 248 ; WX 656 ; N oslash ; B 80 0 620 716 ;
+C 249 ; WX 885 ; N ugrave ; B 82 0 802 716 ;
+C 250 ; WX 604 ; N uacute ; B 38 -12 564 728 ;
+C 251 ; WX 917 ; N ucircumflex ; B 78 0 839 716 ;
+C 252 ; WX 719 ; N udieresis ; B 42 -12 670 728 ;
+C 253 ; WX 938 ; N yacute ; B 78 -199 904 716 ;
+C 254 ; WX 667 ; N thorn ; B 42 0 588 716 ;
+C 255 ; WX 792 ; N ydieresis ; B 0 0 757 716 ;
+C -1 ; WX 333 ; N minus ; B 32 215 302 303 ;
+EndCharMetrics
+EndFontMetrics
diff --git a/src/fonts/cyrillic/arialbd8.afm b/src/fonts/cyrillic/arialbd8.afm
new file mode 100644
index 0000000..3f0b7eb
--- /dev/null
+++ b/src/fonts/cyrillic/arialbd8.afm
@@ -0,0 +1,244 @@
+StartFontMetrics 3.0
+FontName ArialCyrMT-Bold
+FullName Arial KOI 8 Bold
+FamilyName Arial KOI-8
+Weight Bold
+ItalicAngle 0
+IsFixedPitch false
+FontBBox -48 -211 993 892
+UnderlinePosition -217
+UnderlineThickness 215
+Version 1.1
+Notice Typeface <c> The Monotype Corporation plc. 1990-92. Changes <c> 1997 by Eugene V. Demidov
+EncodingScheme FontSpecific
+CapHeight 728
+XHeight 531
+Ascender 728
+Descender -211
+StartCharMetrics 224
+C 32 ; WX 278 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 333 ; N exclam ; B 89 0 238 716 ;
+C 34 ; WX 474 ; N quotedbl ; B 52 461 422 716 ;
+C 35 ; WX 556 ; N numbersign ; B 11 -12 547 728 ;
+C 36 ; WX 556 ; N dollar ; B 36 -100 514 773 ;
+C 37 ; WX 889 ; N percent ; B 45 -29 845 728 ;
+C 38 ; WX 722 ; N ampersand ; B 45 -19 708 728 ;
+C 39 ; WX 240 ; N quoteright ; B 45 461 195 716 ;
+C 40 ; WX 333 ; N parenleft ; B 52 -210 301 728 ;
+C 41 ; WX 333 ; N parenright ; B 33 -210 281 728 ;
+C 42 ; WX 389 ; N asterisk ; B 16 387 370 728 ;
+C 43 ; WX 584 ; N plus ; B 42 103 542 604 ;
+C 44 ; WX 276 ; N comma ; B 55 -160 204 138 ;
+C 45 ; WX 333 ; N hyphen ; B 32 191 302 329 ;
+C 46 ; WX 276 ; N period ; B 69 0 207 138 ;
+C 47 ; WX 278 ; N slash ; B -2 -12 279 728 ;
+C 48 ; WX 556 ; N zero ; B 44 -12 509 719 ;
+C 49 ; WX 556 ; N one ; B 81 0 396 719 ;
+C 50 ; WX 556 ; N two ; B 27 0 508 719 ;
+C 51 ; WX 556 ; N three ; B 40 -12 515 719 ;
+C 52 ; WX 556 ; N four ; B 21 0 535 719 ;
+C 53 ; WX 556 ; N five ; B 46 -12 528 706 ;
+C 54 ; WX 556 ; N six ; B 44 -12 523 719 ;
+C 55 ; WX 556 ; N seven ; B 44 0 514 706 ;
+C 56 ; WX 556 ; N eight ; B 42 -13 513 719 ;
+C 57 ; WX 556 ; N nine ; B 34 -13 512 719 ;
+C 58 ; WX 333 ; N colon ; B 97 0 235 519 ;
+C 59 ; WX 333 ; N semicolon ; B 83 -160 232 519 ;
+C 60 ; WX 584 ; N less ; B 47 82 538 625 ;
+C 61 ; WX 584 ; N equal ; B 41 181 542 524 ;
+C 62 ; WX 584 ; N greater ; B 46 81 538 625 ;
+C 63 ; WX 611 ; N question ; B 50 0 564 723 ;
+C 64 ; WX 975 ; N at ; B 28 -211 970 729 ;
+C 65 ; WX 722 ; N A ; B 2 0 721 716 ;
+C 66 ; WX 722 ; N B ; B 74 0 675 716 ;
+C 67 ; WX 722 ; N C ; B 49 -12 673 728 ;
+C 68 ; WX 722 ; N D ; B 74 0 675 716 ;
+C 69 ; WX 669 ; N E ; B 73 0 618 716 ;
+C 70 ; WX 611 ; N F ; B 72 0 563 716 ;
+C 71 ; WX 775 ; N G ; B 45 -12 714 728 ;
+C 72 ; WX 722 ; N H ; B 75 0 648 716 ;
+C 73 ; WX 276 ; N I ; B 66 0 211 716 ;
+C 74 ; WX 556 ; N J ; B 19 -12 478 716 ;
+C 75 ; WX 722 ; N K ; B 76 0 722 716 ;
+C 76 ; WX 611 ; N L ; B 75 0 579 710 ;
+C 77 ; WX 833 ; N M ; B 70 0 763 716 ;
+C 78 ; WX 722 ; N N ; B 76 0 644 716 ;
+C 79 ; WX 775 ; N O ; B 40 -12 735 728 ;
+C 80 ; WX 669 ; N P ; B 73 0 622 716 ;
+C 81 ; WX 775 ; N Q ; B 40 -72 761 728 ;
+C 82 ; WX 722 ; N R ; B 75 0 719 716 ;
+C 83 ; WX 669 ; N S ; B 38 -13 620 728 ;
+C 84 ; WX 611 ; N T ; B 20 0 588 716 ;
+C 85 ; WX 722 ; N U ; B 73 -12 645 716 ;
+C 86 ; WX 669 ; N V ; B 0 0 667 716 ;
+C 87 ; WX 945 ; N W ; B 2 0 942 716 ;
+C 88 ; WX 669 ; N X ; B 1 0 667 716 ;
+C 89 ; WX 669 ; N Y ; B 0 0 669 716 ;
+C 90 ; WX 611 ; N Z ; B 9 0 591 716 ;
+C 91 ; WX 333 ; N bracketleft ; B 71 -202 314 716 ;
+C 92 ; WX 278 ; N backslash ; B -2 -12 279 728 ;
+C 93 ; WX 333 ; N bracketright ; B 19 -202 262 716 ;
+C 94 ; WX 584 ; N asciicircum ; B 56 338 528 728 ;
+C 95 ; WX 556 ; N underscore ; B -6 -198 562 -109 ;
+C 96 ; WX 333 ; N quoteleft ; B 20 582 242 728 ;
+C 97 ; WX 556 ; N a ; B 38 -12 525 530 ;
+C 98 ; WX 611 ; N b ; B 64 -12 570 716 ;
+C 99 ; WX 556 ; N c ; B 43 -12 533 530 ;
+C 100 ; WX 611 ; N d ; B 39 -12 546 716 ;
+C 101 ; WX 556 ; N e ; B 33 -12 518 530 ;
+C 102 ; WX 333 ; N f ; B 12 0 362 728 ;
+C 103 ; WX 611 ; N g ; B 39 -210 546 530 ;
+C 104 ; WX 611 ; N h ; B 69 0 542 716 ;
+C 105 ; WX 276 ; N i ; B 69 0 207 716 ;
+C 106 ; WX 276 ; N j ; B -48 -210 204 716 ;
+C 107 ; WX 556 ; N k ; B 68 0 548 716 ;
+C 108 ; WX 276 ; N l ; B 69 0 207 716 ;
+C 109 ; WX 889 ; N m ; B 63 0 827 530 ;
+C 110 ; WX 611 ; N n ; B 69 0 542 530 ;
+C 111 ; WX 611 ; N o ; B 38 -12 574 530 ;
+C 112 ; WX 611 ; N p ; B 66 -197 572 531 ;
+C 113 ; WX 611 ; N q ; B 42 -197 546 531 ;
+C 114 ; WX 389 ; N r ; B 67 0 404 530 ;
+C 115 ; WX 556 ; N s ; B 26 -12 511 530 ;
+C 116 ; WX 333 ; N t ; B 15 -12 321 702 ;
+C 117 ; WX 611 ; N u ; B 66 -12 539 519 ;
+C 118 ; WX 556 ; N v ; B 7 0 546 519 ;
+C 119 ; WX 775 ; N w ; B 1 0 774 519 ;
+C 120 ; WX 556 ; N x ; B 8 0 549 519 ;
+C 121 ; WX 556 ; N y ; B 8 -211 542 519 ;
+C 122 ; WX 499 ; N z ; B 16 0 479 519 ;
+C 123 ; WX 389 ; N braceleft ; B 31 -211 365 728 ;
+C 124 ; WX 281 ; N bar ; B 86 -210 195 728 ;
+C 125 ; WX 389 ; N braceright ; B 24 -211 358 728 ;
+C 126 ; WX 584 ; N asciitilde ; B 32 253 551 451 ;
+C 128 ; WX 278 ; N c128 ; B 0 0 0 0 ;
+C 129 ; WX 278 ; N c129 ; B 0 0 0 0 ;
+C 130 ; WX 278 ; N c130 ; B 0 0 0 0 ;
+C 131 ; WX 278 ; N c131 ; B 0 0 0 0 ;
+C 132 ; WX 278 ; N c132 ; B 0 0 0 0 ;
+C 133 ; WX 278 ; N c133 ; B 0 0 0 0 ;
+C 134 ; WX 278 ; N c134 ; B 0 0 0 0 ;
+C 135 ; WX 278 ; N c135 ; B 0 0 0 0 ;
+C 136 ; WX 278 ; N c136 ; B 0 0 0 0 ;
+C 137 ; WX 278 ; N c137 ; B 0 0 0 0 ;
+C 138 ; WX 278 ; N c138 ; B 0 0 0 0 ;
+C 139 ; WX 278 ; N c139 ; B 0 0 0 0 ;
+C 140 ; WX 278 ; N c140 ; B 0 0 0 0 ;
+C 141 ; WX 278 ; N c141 ; B 0 0 0 0 ;
+C 142 ; WX 278 ; N c142 ; B 0 0 0 0 ;
+C 143 ; WX 278 ; N c143 ; B 0 0 0 0 ;
+C 144 ; WX 278 ; N c144 ; B 0 0 0 0 ;
+C 145 ; WX 278 ; N c145 ; B 0 0 0 0 ;
+C 146 ; WX 278 ; N c146 ; B 0 0 0 0 ;
+C 147 ; WX 278 ; N c147 ; B 0 0 0 0 ;
+C 148 ; WX 278 ; N c148 ; B 0 0 0 0 ;
+C 149 ; WX 278 ; N c149 ; B 0 0 0 0 ;
+C 150 ; WX 278 ; N c150 ; B 0 0 0 0 ;
+C 151 ; WX 278 ; N c151 ; B 0 0 0 0 ;
+C 152 ; WX 278 ; N c152 ; B 0 0 0 0 ;
+C 153 ; WX 278 ; N c153 ; B 0 0 0 0 ;
+C 154 ; WX 278 ; N c154 ; B 0 0 0 0 ;
+C 155 ; WX 278 ; N c155 ; B 0 0 0 0 ;
+C 156 ; WX 278 ; N c156 ; B 0 0 0 0 ;
+C 157 ; WX 278 ; N c157 ; B 0 0 0 0 ;
+C 158 ; WX 278 ; N c158 ; B 0 0 0 0 ;
+C 159 ; WX 278 ; N c159 ; B 0 0 0 0 ;
+C 160 ; WX 278 ; N nbspace ; B 0 0 0 0 ;
+C 161 ; WX 278 ; N exclamdown ; B 0 0 0 0 ;
+C 162 ; WX 278 ; N cent ; B 0 0 0 0 ;
+C 163 ; WX 556 ; N sterling ; B 34 -12 518 728 ;
+C 164 ; WX 278 ; N currency ; B 0 0 0 0 ;
+C 165 ; WX 278 ; N yen ; B 0 0 0 0 ;
+C 166 ; WX 278 ; N brokenbar ; B 0 0 0 0 ;
+C 167 ; WX 278 ; N section ; B 0 0 0 0 ;
+C 168 ; WX 278 ; N dieresis ; B 0 0 0 0 ;
+C 169 ; WX 278 ; N copyright ; B 0 0 0 0 ;
+C 170 ; WX 278 ; N ordfeminine ; B 0 0 0 0 ;
+C 171 ; WX 278 ; N guillemotleft ; B 0 0 0 0 ;
+C 172 ; WX 278 ; N logicalnot ; B 0 0 0 0 ;
+C 173 ; WX 278 ; N softhyphen ; B 0 0 0 0 ;
+C 174 ; WX 278 ; N registered ; B 0 0 0 0 ;
+C 175 ; WX 278 ; N macron ; B 0 0 0 0 ;
+C 176 ; WX 278 ; N degree ; B 0 0 0 0 ;
+C 177 ; WX 278 ; N plusminus ; B 0 0 0 0 ;
+C 178 ; WX 278 ; N twosuperior ; B 0 0 0 0 ;
+C 179 ; WX 669 ; N threesuperior ; B 73 0 618 871 ;
+C 180 ; WX 278 ; N acute ; B 0 0 0 0 ;
+C 181 ; WX 278 ; N mu ; B 0 0 0 0 ;
+C 182 ; WX 278 ; N paragraph ; B 0 0 0 0 ;
+C 183 ; WX 278 ; N periodcentered ; B 0 0 0 0 ;
+C 184 ; WX 278 ; N cedilla ; B 0 0 0 0 ;
+C 185 ; WX 278 ; N onesuperior ; B 0 0 0 0 ;
+C 186 ; WX 278 ; N ordmasculine ; B 0 0 0 0 ;
+C 187 ; WX 278 ; N guillemotright ; B 0 0 0 0 ;
+C 188 ; WX 278 ; N onequarter ; B 0 0 0 0 ;
+C 189 ; WX 278 ; N onehalf ; B 0 0 0 0 ;
+C 190 ; WX 278 ; N threequarters ; B 0 0 0 0 ;
+C 191 ; WX 278 ; N questiondown ; B 0 0 0 0 ;
+C 192 ; WX 854 ; N Agrave ; B 70 -12 815 530 ;
+C 193 ; WX 556 ; N Aacute ; B 38 -12 525 530 ;
+C 194 ; WX 618 ; N Acircumflex ; B 45 -12 575 732 ;
+C 195 ; WX 615 ; N Atilde ; B 66 -137 591 519 ;
+C 196 ; WX 635 ; N Adieresis ; B -4 -137 612 519 ;
+C 197 ; WX 556 ; N Aring ; B 33 -12 518 530 ;
+C 198 ; WX 875 ; N AE ; B 41 -197 835 716 ;
+C 199 ; WX 417 ; N Ccedilla ; B 66 0 417 519 ;
+C 200 ; WX 556 ; N Egrave ; B 8 0 549 519 ;
+C 201 ; WX 615 ; N Eacute ; B 68 0 546 519 ;
+C 202 ; WX 615 ; N Ecircumflex ; B 68 0 546 722 ;
+C 203 ; WX 500 ; N Edieresis ; B 66 0 501 522 ;
+C 204 ; WX 635 ; N Igrave ; B 12 -9 568 519 ;
+C 205 ; WX 740 ; N Iacute ; B 75 0 674 519 ;
+C 206 ; WX 604 ; N Icircumflex ; B 66 0 538 519 ;
+C 207 ; WX 611 ; N Idieresis ; B 38 -12 574 530 ;
+C 208 ; WX 604 ; N Eth ; B 66 0 527 519 ;
+C 209 ; WX 583 ; N Ntilde ; B -2 0 516 519 ;
+C 210 ; WX 611 ; N Ograve ; B 66 -197 572 531 ;
+C 211 ; WX 556 ; N Oacute ; B 43 -12 533 530 ;
+C 212 ; WX 490 ; N Ocircumflex ; B 10 0 479 519 ;
+C 213 ; WX 556 ; N Otilde ; B 8 -211 542 519 ;
+C 214 ; WX 709 ; N Odieresis ; B 0 0 710 522 ;
+C 215 ; WX 615 ; N multiply ; B 73 0 576 519 ;
+C 216 ; WX 615 ; N Oslash ; B 74 0 575 519 ;
+C 217 ; WX 854 ; N Ugrave ; B 72 0 789 519 ;
+C 218 ; WX 497 ; N Uacute ; B 12 -12 459 531 ;
+C 219 ; WX 833 ; N Ucircumflex ; B 68 0 765 519 ;
+C 220 ; WX 552 ; N Udieresis ; B 27 -12 512 531 ;
+C 221 ; WX 844 ; N Yacute ; B 69 -137 822 519 ;
+C 222 ; WX 581 ; N Thorn ; B 55 0 516 519 ;
+C 223 ; WX 729 ; N germandbls ; B 14 0 689 519 ;
+C 224 ; WX 1031 ; N agrave ; B 73 -12 985 728 ;
+C 225 ; WX 722 ; N aacute ; B 2 0 721 716 ;
+C 226 ; WX 719 ; N acircumflex ; B 75 0 674 716 ;
+C 227 ; WX 730 ; N atilde ; B 75 -156 704 716 ;
+C 228 ; WX 712 ; N adieresis ; B -3 -156 688 716 ;
+C 229 ; WX 669 ; N aring ; B 73 0 618 716 ;
+C 230 ; WX 854 ; N ae ; B 43 0 810 715 ;
+C 231 ; WX 567 ; N ccedilla ; B 80 0 565 716 ;
+C 232 ; WX 669 ; N egrave ; B 1 0 667 716 ;
+C 233 ; WX 719 ; N eacute ; B 74 0 644 716 ;
+C 234 ; WX 719 ; N ecircumflex ; B 74 0 644 892 ;
+C 235 ; WX 610 ; N edieresis ; B 75 0 602 721 ;
+C 236 ; WX 702 ; N igrave ; B 16 -4 626 716 ;
+C 237 ; WX 833 ; N iacute ; B 70 0 763 716 ;
+C 238 ; WX 722 ; N icircumflex ; B 75 0 648 716 ;
+C 239 ; WX 775 ; N idieresis ; B 40 -12 735 728 ;
+C 240 ; WX 719 ; N eth ; B 74 0 644 716 ;
+C 241 ; WX 719 ; N ntilde ; B 2 0 646 716 ;
+C 242 ; WX 669 ; N ograve ; B 73 0 622 716 ;
+C 243 ; WX 722 ; N oacute ; B 49 -12 673 728 ;
+C 244 ; WX 611 ; N ocircumflex ; B 20 0 588 716 ;
+C 245 ; WX 622 ; N otilde ; B 0 -9 623 716 ;
+C 246 ; WX 904 ; N odieresis ; B 11 0 893 721 ;
+C 247 ; WX 722 ; N divide ; B 74 0 675 716 ;
+C 248 ; WX 719 ; N oslash ; B 75 0 673 716 ;
+C 249 ; WX 979 ; N ugrave ; B 76 0 902 716 ;
+C 250 ; WX 626 ; N uacute ; B 21 -13 573 728 ;
+C 251 ; WX 1005 ; N ucircumflex ; B 75 0 930 716 ;
+C 252 ; WX 711 ; N udieresis ; B 42 -12 668 728 ;
+C 253 ; WX 1019 ; N yacute ; B 75 -156 993 716 ;
+C 254 ; WX 703 ; N thorn ; B 61 0 627 716 ;
+C 255 ; WX 870 ; N ydieresis ; B 13 0 824 716 ;
+C -1 ; WX 333 ; N minus ; B 32 191 302 329 ;
+EndCharMetrics
+EndFontMetrics
diff --git a/src/fonts/cyrillic/arialbi8.afm b/src/fonts/cyrillic/arialbi8.afm
new file mode 100644
index 0000000..fb622a0
--- /dev/null
+++ b/src/fonts/cyrillic/arialbi8.afm
@@ -0,0 +1,244 @@
+StartFontMetrics 3.0
+FontName ArialCyrMT-BoldItalic
+FullName Arial KOI 8 Bold Italic
+FamilyName Arial KOI-8
+Weight BoldItalic
+ItalicAngle 0
+IsFixedPitch false
+FontBBox -137 -211 1040 893
+UnderlinePosition -217
+UnderlineThickness 215
+Version 1.1
+Notice Typeface <c> The Monotype Corporation plc. 1990-92. Changes <c> 1997 by Eugene V. Demidov
+EncodingScheme FontSpecific
+CapHeight 728
+XHeight 531
+Ascender 728
+Descender -211
+StartCharMetrics 224
+C 32 ; WX 278 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 333 ; N exclam ; B 35 0 326 716 ;
+C 34 ; WX 474 ; N quotedbl ; B 120 461 517 716 ;
+C 35 ; WX 556 ; N numbersign ; B 29 -12 564 728 ;
+C 36 ; WX 556 ; N dollar ; B 20 -99 552 770 ;
+C 37 ; WX 889 ; N percent ; B 66 -31 840 728 ;
+C 38 ; WX 722 ; N ampersand ; B 59 -17 682 728 ;
+C 39 ; WX 238 ; N quoteright ; B 114 461 291 716 ;
+C 40 ; WX 333 ; N parenleft ; B 40 -210 409 728 ;
+C 41 ; WX 333 ; N parenright ; B -76 -210 293 728 ;
+C 42 ; WX 389 ; N asterisk ; B 68 341 421 681 ;
+C 43 ; WX 584 ; N plus ; B 60 103 560 604 ;
+C 44 ; WX 278 ; N comma ; B -18 -155 184 136 ;
+C 45 ; WX 333 ; N hyphen ; B 12 190 312 326 ;
+C 46 ; WX 278 ; N period ; B 16 0 183 136 ;
+C 47 ; WX 278 ; N slash ; B -70 -12 382 728 ;
+C 48 ; WX 556 ; N zero ; B 40 -13 547 719 ;
+C 49 ; WX 556 ; N one ; B 94 0 486 720 ;
+C 50 ; WX 556 ; N two ; B 30 0 540 719 ;
+C 51 ; WX 556 ; N three ; B 27 -13 536 719 ;
+C 52 ; WX 556 ; N four ; B 4 0 536 716 ;
+C 53 ; WX 556 ; N five ; B 27 -13 542 706 ;
+C 54 ; WX 556 ; N six ; B 57 -13 551 719 ;
+C 55 ; WX 556 ; N seven ; B 79 0 578 706 ;
+C 56 ; WX 556 ; N eight ; B 42 -13 543 719 ;
+C 57 ; WX 556 ; N nine ; B 39 -12 533 719 ;
+C 58 ; WX 333 ; N colon ; B 44 0 290 519 ;
+C 59 ; WX 333 ; N semicolon ; B 14 -155 293 519 ;
+C 60 ; WX 584 ; N less ; B 65 82 555 625 ;
+C 61 ; WX 584 ; N equal ; B 60 181 560 524 ;
+C 62 ; WX 584 ; N greater ; B 65 81 556 625 ;
+C 63 ; WX 611 ; N question ; B 95 0 590 728 ;
+C 64 ; WX 975 ; N at ; B 10 -211 952 728 ;
+C 65 ; WX 722 ; N A ; B -35 0 649 716 ;
+C 66 ; WX 722 ; N B ; B 16 0 686 716 ;
+C 67 ; WX 722 ; N C ; B 71 -12 721 728 ;
+C 68 ; WX 722 ; N D ; B 19 0 700 716 ;
+C 69 ; WX 667 ; N E ; B 15 0 695 716 ;
+C 70 ; WX 611 ; N F ; B 11 0 661 716 ;
+C 71 ; WX 778 ; N G ; B 61 -12 758 728 ;
+C 72 ; WX 722 ; N H ; B 19 0 740 716 ;
+C 73 ; WX 278 ; N I ; B 7 0 303 716 ;
+C 74 ; WX 556 ; N J ; B 5 -12 575 716 ;
+C 75 ; WX 722 ; N K ; B 15 0 776 716 ;
+C 76 ; WX 611 ; N L ; B 17 0 553 716 ;
+C 77 ; WX 833 ; N M ; B 15 0 852 716 ;
+C 78 ; WX 722 ; N N ; B 21 0 738 716 ;
+C 79 ; WX 778 ; N O ; B 60 -12 756 728 ;
+C 80 ; WX 667 ; N P ; B 15 0 676 716 ;
+C 81 ; WX 778 ; N Q ; B 60 -95 756 728 ;
+C 82 ; WX 722 ; N R ; B 20 0 716 716 ;
+C 83 ; WX 667 ; N S ; B 38 -12 651 728 ;
+C 84 ; WX 611 ; N T ; B 93 0 681 716 ;
+C 85 ; WX 722 ; N U ; B 67 -12 740 716 ;
+C 86 ; WX 667 ; N V ; B 87 0 767 716 ;
+C 87 ; WX 944 ; N W ; B 90 0 1040 716 ;
+C 88 ; WX 667 ; N X ; B -56 0 757 716 ;
+C 89 ; WX 667 ; N Y ; B 89 0 758 716 ;
+C 90 ; WX 611 ; N Z ; B -3 0 640 716 ;
+C 91 ; WX 333 ; N bracketleft ; B -17 -198 412 716 ;
+C 92 ; WX 278 ; N backslash ; B 95 -12 232 728 ;
+C 93 ; WX 333 ; N bracketright ; B -82 -198 348 716 ;
+C 94 ; WX 584 ; N asciicircum ; B 74 338 545 728 ;
+C 95 ; WX 556 ; N underscore ; B -32 -198 535 -109 ;
+C 96 ; WX 333 ; N quoteleft ; B 112 586 309 732 ;
+C 97 ; WX 556 ; N a ; B 21 -12 509 530 ;
+C 98 ; WX 611 ; N b ; B 8 -12 573 716 ;
+C 99 ; WX 556 ; N c ; B 36 -12 540 530 ;
+C 100 ; WX 611 ; N d ; B 31 -12 641 716 ;
+C 101 ; WX 556 ; N e ; B 34 -12 530 530 ;
+C 102 ; WX 333 ; N f ; B 27 0 444 728 ;
+C 103 ; WX 611 ; N g ; B 3 -210 595 530 ;
+C 104 ; WX 611 ; N h ; B 15 0 563 716 ;
+C 105 ; WX 278 ; N i ; B 12 0 301 716 ;
+C 106 ; WX 278 ; N j ; B -137 -210 303 716 ;
+C 107 ; WX 556 ; N k ; B 14 0 590 716 ;
+C 108 ; WX 278 ; N l ; B 12 0 301 716 ;
+C 109 ; WX 889 ; N m ; B 11 0 844 530 ;
+C 110 ; WX 611 ; N n ; B 14 0 563 530 ;
+C 111 ; WX 611 ; N o ; B 33 -12 571 530 ;
+C 112 ; WX 611 ; N p ; B -33 -199 578 530 ;
+C 113 ; WX 611 ; N q ; B 32 -199 597 530 ;
+C 114 ; WX 389 ; N r ; B 8 0 449 530 ;
+C 115 ; WX 556 ; N s ; B -2 -12 527 531 ;
+C 116 ; WX 333 ; N t ; B 49 -12 364 698 ;
+C 117 ; WX 611 ; N u ; B 43 -12 591 519 ;
+C 118 ; WX 556 ; N v ; B 51 0 594 519 ;
+C 119 ; WX 778 ; N w ; B 44 0 812 519 ;
+C 120 ; WX 556 ; N x ; B -46 0 588 519 ;
+C 121 ; WX 556 ; N y ; B -17 -211 597 519 ;
+C 122 ; WX 500 ; N z ; B -9 0 492 519 ;
+C 123 ; WX 389 ; N braceleft ; B 24 -210 472 728 ;
+C 124 ; WX 280 ; N bar ; B 104 -210 212 728 ;
+C 125 ; WX 389 ; N braceright ; B -80 -211 368 728 ;
+C 126 ; WX 584 ; N asciitilde ; B 51 253 569 451 ;
+C 128 ; WX 278 ; N c128 ; B 0 0 0 0 ;
+C 129 ; WX 278 ; N c129 ; B 0 0 0 0 ;
+C 130 ; WX 278 ; N c130 ; B 0 0 0 0 ;
+C 131 ; WX 278 ; N c131 ; B 0 0 0 0 ;
+C 132 ; WX 278 ; N c132 ; B 0 0 0 0 ;
+C 133 ; WX 278 ; N c133 ; B 0 0 0 0 ;
+C 134 ; WX 278 ; N c134 ; B 0 0 0 0 ;
+C 135 ; WX 278 ; N c135 ; B 0 0 0 0 ;
+C 136 ; WX 278 ; N c136 ; B 0 0 0 0 ;
+C 137 ; WX 278 ; N c137 ; B 0 0 0 0 ;
+C 138 ; WX 278 ; N c138 ; B 0 0 0 0 ;
+C 139 ; WX 278 ; N c139 ; B 0 0 0 0 ;
+C 140 ; WX 278 ; N c140 ; B 0 0 0 0 ;
+C 141 ; WX 278 ; N c141 ; B 0 0 0 0 ;
+C 142 ; WX 278 ; N c142 ; B 0 0 0 0 ;
+C 143 ; WX 278 ; N c143 ; B 0 0 0 0 ;
+C 144 ; WX 278 ; N c144 ; B 0 0 0 0 ;
+C 145 ; WX 278 ; N c145 ; B 0 0 0 0 ;
+C 146 ; WX 278 ; N c146 ; B 0 0 0 0 ;
+C 147 ; WX 278 ; N c147 ; B 0 0 0 0 ;
+C 148 ; WX 278 ; N c148 ; B 0 0 0 0 ;
+C 149 ; WX 278 ; N c149 ; B 0 0 0 0 ;
+C 150 ; WX 278 ; N c150 ; B 0 0 0 0 ;
+C 151 ; WX 278 ; N c151 ; B 0 0 0 0 ;
+C 152 ; WX 278 ; N c152 ; B 0 0 0 0 ;
+C 153 ; WX 278 ; N c153 ; B 0 0 0 0 ;
+C 154 ; WX 278 ; N c154 ; B 0 0 0 0 ;
+C 155 ; WX 278 ; N c155 ; B 0 0 0 0 ;
+C 156 ; WX 278 ; N c156 ; B 0 0 0 0 ;
+C 157 ; WX 278 ; N c157 ; B 0 0 0 0 ;
+C 158 ; WX 278 ; N c158 ; B 0 0 0 0 ;
+C 159 ; WX 278 ; N c159 ; B 0 0 0 0 ;
+C 160 ; WX 278 ; N nbspace ; B 0 0 0 0 ;
+C 161 ; WX 278 ; N exclamdown ; B 0 0 0 0 ;
+C 162 ; WX 278 ; N cent ; B 0 0 0 0 ;
+C 163 ; WX 556 ; N sterling ; B 34 -12 530 716 ;
+C 164 ; WX 278 ; N currency ; B 0 0 0 0 ;
+C 165 ; WX 278 ; N yen ; B 0 0 0 0 ;
+C 166 ; WX 278 ; N brokenbar ; B 0 0 0 0 ;
+C 167 ; WX 278 ; N section ; B 0 0 0 0 ;
+C 168 ; WX 278 ; N dieresis ; B 0 0 0 0 ;
+C 169 ; WX 278 ; N copyright ; B 0 0 0 0 ;
+C 170 ; WX 278 ; N ordfeminine ; B 0 0 0 0 ;
+C 171 ; WX 278 ; N guillemotleft ; B 0 0 0 0 ;
+C 172 ; WX 278 ; N logicalnot ; B 0 0 0 0 ;
+C 173 ; WX 278 ; N softhyphen ; B 0 0 0 0 ;
+C 174 ; WX 278 ; N registered ; B 0 0 0 0 ;
+C 175 ; WX 278 ; N macron ; B 0 0 0 0 ;
+C 176 ; WX 278 ; N degree ; B 0 0 0 0 ;
+C 177 ; WX 278 ; N plusminus ; B 0 0 0 0 ;
+C 178 ; WX 278 ; N twosuperior ; B 0 0 0 0 ;
+C 179 ; WX 667 ; N threesuperior ; B 15 0 695 876 ;
+C 180 ; WX 278 ; N acute ; B 0 0 0 0 ;
+C 181 ; WX 278 ; N mu ; B 0 0 0 0 ;
+C 182 ; WX 278 ; N paragraph ; B 0 0 0 0 ;
+C 183 ; WX 278 ; N periodcentered ; B 0 0 0 0 ;
+C 184 ; WX 278 ; N cedilla ; B 0 0 0 0 ;
+C 185 ; WX 278 ; N onesuperior ; B 0 0 0 0 ;
+C 186 ; WX 278 ; N ordmasculine ; B 0 0 0 0 ;
+C 187 ; WX 278 ; N guillemotright ; B 0 0 0 0 ;
+C 188 ; WX 278 ; N onequarter ; B 0 0 0 0 ;
+C 189 ; WX 278 ; N onehalf ; B 0 0 0 0 ;
+C 190 ; WX 278 ; N threequarters ; B 0 0 0 0 ;
+C 191 ; WX 278 ; N questiondown ; B 0 0 0 0 ;
+C 192 ; WX 865 ; N Agrave ; B 15 -12 824 531 ;
+C 193 ; WX 556 ; N Aacute ; B 21 -12 509 530 ;
+C 194 ; WX 619 ; N Acircumflex ; B 40 -12 630 748 ;
+C 195 ; WX 646 ; N Atilde ; B 36 -161 593 519 ;
+C 196 ; WX 618 ; N Adieresis ; B 35 -12 601 748 ;
+C 197 ; WX 556 ; N Aring ; B 34 -12 530 530 ;
+C 198 ; WX 885 ; N AE ; B 39 -203 851 728 ;
+C 199 ; WX 534 ; N Ccedilla ; B 8 -12 490 530 ;
+C 200 ; WX 556 ; N Egrave ; B -46 0 588 519 ;
+C 201 ; WX 611 ; N Eacute ; B 43 -12 591 519 ;
+C 202 ; WX 611 ; N Ecircumflex ; B 43 -12 591 728 ;
+C 203 ; WX 507 ; N Edieresis ; B 10 0 540 519 ;
+C 204 ; WX 622 ; N Igrave ; B -49 -12 608 519 ;
+C 205 ; WX 740 ; N Iacute ; B 14 0 723 519 ;
+C 206 ; WX 604 ; N Icircumflex ; B 11 0 591 519 ;
+C 207 ; WX 611 ; N Idieresis ; B 33 -12 571 530 ;
+C 208 ; WX 611 ; N Eth ; B 14 0 563 530 ;
+C 209 ; WX 589 ; N Ntilde ; B -44 0 574 519 ;
+C 210 ; WX 611 ; N Ograve ; B -33 -199 578 530 ;
+C 211 ; WX 556 ; N Oacute ; B 36 -12 540 530 ;
+C 212 ; WX 889 ; N Ocircumflex ; B 11 0 844 530 ;
+C 213 ; WX 556 ; N Otilde ; B -17 -211 597 519 ;
+C 214 ; WX 736 ; N Odieresis ; B -48 0 765 519 ;
+C 215 ; WX 604 ; N multiply ; B 39 -12 542 530 ;
+C 216 ; WX 594 ; N Oslash ; B 8 0 543 519 ;
+C 217 ; WX 854 ; N Ugrave ; B 14 0 841 519 ;
+C 218 ; WX 510 ; N Uacute ; B -7 -12 468 530 ;
+C 219 ; WX 889 ; N Ucircumflex ; B 45 -12 875 519 ;
+C 220 ; WX 552 ; N Udieresis ; B 6 -12 509 530 ;
+C 221 ; WX 935 ; N Yacute ; B 44 -159 885 519 ;
+C 222 ; WX 583 ; N Thorn ; B 74 0 569 519 ;
+C 223 ; WX 707 ; N germandbls ; B 43 0 654 519 ;
+C 224 ; WX 1042 ; N agrave ; B 16 -12 1017 728 ;
+C 225 ; WX 722 ; N aacute ; B -35 0 649 716 ;
+C 226 ; WX 708 ; N acircumflex ; B 21 0 685 716 ;
+C 227 ; WX 729 ; N atilde ; B 14 -198 736 716 ;
+C 228 ; WX 722 ; N adieresis ; B -101 -198 730 716 ;
+C 229 ; WX 667 ; N aring ; B 15 0 695 716 ;
+C 230 ; WX 781 ; N ae ; B 59 -6 764 716 ;
+C 231 ; WX 614 ; N ccedilla ; B 21 0 699 716 ;
+C 232 ; WX 667 ; N egrave ; B -56 0 757 716 ;
+C 233 ; WX 719 ; N eacute ; B 17 0 738 716 ;
+C 234 ; WX 719 ; N ecircumflex ; B 17 0 738 893 ;
+C 235 ; WX 615 ; N edieresis ; B 19 0 676 716 ;
+C 236 ; WX 687 ; N igrave ; B -52 -11 698 716 ;
+C 237 ; WX 833 ; N iacute ; B 15 0 852 716 ;
+C 238 ; WX 722 ; N icircumflex ; B 19 0 740 716 ;
+C 239 ; WX 778 ; N idieresis ; B 60 -12 756 728 ;
+C 240 ; WX 719 ; N eth ; B 19 0 739 716 ;
+C 241 ; WX 729 ; N ntilde ; B -47 0 748 716 ;
+C 242 ; WX 667 ; N ograve ; B 15 0 676 716 ;
+C 243 ; WX 722 ; N oacute ; B 71 -12 721 728 ;
+C 244 ; WX 611 ; N ocircumflex ; B 93 0 681 716 ;
+C 245 ; WX 677 ; N otilde ; B 51 -11 769 716 ;
+C 246 ; WX 927 ; N odieresis ; B -41 0 989 720 ;
+C 247 ; WX 722 ; N divide ; B 16 0 686 716 ;
+C 248 ; WX 708 ; N oslash ; B 21 0 662 716 ;
+C 249 ; WX 1000 ; N ugrave ; B 18 0 1014 716 ;
+C 250 ; WX 643 ; N uacute ; B 12 -12 624 728 ;
+C 251 ; WX 979 ; N ucircumflex ; B 19 0 997 716 ;
+C 252 ; WX 719 ; N udieresis ; B 42 -12 694 728 ;
+C 253 ; WX 989 ; N yacute ; B 19 -198 997 716 ;
+C 254 ; WX 708 ; N thorn ; B 103 0 726 716 ;
+C 255 ; WX 854 ; N ydieresis ; B 81 0 808 716 ;
+C -1 ; WX 333 ; N minus ; B 12 190 312 326 ;
+EndCharMetrics
+EndFontMetrics
diff --git a/src/fonts/cyrillic/ariali8.afm b/src/fonts/cyrillic/ariali8.afm
new file mode 100644
index 0000000..63d6820
--- /dev/null
+++ b/src/fonts/cyrillic/ariali8.afm
@@ -0,0 +1,244 @@
+StartFontMetrics 3.0
+FontName ArialCyrMT-Italic
+FullName Arial KOI 8 Italic
+FamilyName Arial KOI-8
+Weight Italic
+ItalicAngle 0
+IsFixedPitch false
+FontBBox -138 -211 1041 877
+UnderlinePosition -217
+UnderlineThickness 150
+Version 1.1
+Notice Typeface <c> The Monotype Corporation plc. 1990-92. Changes <c> 1997 by Eugene V. Demidov
+EncodingScheme FontSpecific
+CapHeight 728
+XHeight 530
+Ascender 728
+Descender -208
+StartCharMetrics 224
+C 32 ; WX 278 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 278 ; N exclam ; B 38 0 285 716 ;
+C 34 ; WX 355 ; N quotedbl ; B 112 462 404 716 ;
+C 35 ; WX 556 ; N numbersign ; B 32 -12 565 728 ;
+C 36 ; WX 556 ; N dollar ; B 34 -96 556 764 ;
+C 37 ; WX 889 ; N percent ; B 86 -27 841 728 ;
+C 38 ; WX 667 ; N ampersand ; B 52 -17 624 728 ;
+C 39 ; WX 191 ; N quoteright ; B 110 462 241 716 ;
+C 40 ; WX 333 ; N parenleft ; B 66 -210 394 728 ;
+C 41 ; WX 333 ; N parenright ; B -62 -210 267 728 ;
+C 42 ; WX 389 ; N asterisk ; B 102 423 424 728 ;
+C 43 ; WX 584 ; N plus ; B 75 116 548 589 ;
+C 44 ; WX 278 ; N comma ; B 5 -145 156 100 ;
+C 45 ; WX 333 ; N hyphen ; B 23 215 311 303 ;
+C 46 ; WX 278 ; N period ; B 35 0 156 100 ;
+C 47 ; WX 278 ; N slash ; B -71 -12 390 728 ;
+C 48 ; WX 556 ; N zero ; B 51 -12 545 719 ;
+C 49 ; WX 556 ; N one ; B 128 0 459 719 ;
+C 50 ; WX 556 ; N two ; B 39 0 542 719 ;
+C 51 ; WX 556 ; N three ; B 35 -12 537 719 ;
+C 52 ; WX 556 ; N four ; B 25 0 522 716 ;
+C 53 ; WX 556 ; N five ; B 38 -12 541 706 ;
+C 54 ; WX 556 ; N six ; B 63 -12 547 719 ;
+C 55 ; WX 556 ; N seven ; B 101 0 575 706 ;
+C 56 ; WX 556 ; N eight ; B 55 -12 544 719 ;
+C 57 ; WX 556 ; N nine ; B 47 -12 531 719 ;
+C 58 ; WX 278 ; N colon ; B 37 0 245 519 ;
+C 59 ; WX 278 ; N semicolon ; B 6 -145 244 519 ;
+C 60 ; WX 584 ; N less ; B 78 110 552 595 ;
+C 61 ; WX 584 ; N equal ; B 76 204 548 503 ;
+C 62 ; WX 584 ; N greater ; B 78 110 552 595 ;
+C 63 ; WX 556 ; N question ; B 119 0 553 728 ;
+C 64 ; WX 1015 ; N at ; B 38 -210 962 729 ;
+C 65 ; WX 667 ; N A ; B -38 0 598 716 ;
+C 66 ; WX 667 ; N B ; B 25 0 636 716 ;
+C 67 ; WX 722 ; N C ; B 74 -12 713 728 ;
+C 68 ; WX 722 ; N D ; B 27 0 695 716 ;
+C 69 ; WX 667 ; N E ; B 26 0 692 716 ;
+C 70 ; WX 611 ; N F ; B 25 0 639 716 ;
+C 71 ; WX 778 ; N G ; B 77 -12 746 728 ;
+C 72 ; WX 722 ; N H ; B 25 0 737 716 ;
+C 73 ; WX 278 ; N I ; B 37 0 282 716 ;
+C 74 ; WX 500 ; N J ; B 14 -12 517 716 ;
+C 75 ; WX 667 ; N K ; B 26 0 722 716 ;
+C 76 ; WX 556 ; N L ; B 23 0 507 716 ;
+C 77 ; WX 833 ; N M ; B 23 0 851 716 ;
+C 78 ; WX 722 ; N N ; B 28 0 736 716 ;
+C 79 ; WX 778 ; N O ; B 69 -12 750 728 ;
+C 80 ; WX 667 ; N P ; B 24 0 679 716 ;
+C 81 ; WX 778 ; N Q ; B 69 -82 750 728 ;
+C 82 ; WX 722 ; N R ; B 30 0 713 716 ;
+C 83 ; WX 667 ; N S ; B 45 -12 646 728 ;
+C 84 ; WX 611 ; N T ; B 103 0 683 716 ;
+C 85 ; WX 722 ; N U ; B 77 -12 734 716 ;
+C 86 ; WX 667 ; N V ; B 105 0 737 716 ;
+C 87 ; WX 944 ; N W ; B 105 0 1041 716 ;
+C 88 ; WX 667 ; N X ; B -47 0 753 716 ;
+C 89 ; WX 667 ; N Y ; B 98 0 754 716 ;
+C 90 ; WX 611 ; N Z ; B 4 0 616 716 ;
+C 91 ; WX 278 ; N bracketleft ; B -17 -196 367 716 ;
+C 92 ; WX 278 ; N backslash ; B 84 -12 236 728 ;
+C 93 ; WX 278 ; N bracketright ; B -89 -196 298 716 ;
+C 94 ; WX 469 ; N asciicircum ; B 49 337 465 728 ;
+C 95 ; WX 556 ; N underscore ; B -60 -198 507 -135 ;
+C 96 ; WX 333 ; N quoteleft ; B 127 582 291 716 ;
+C 97 ; WX 556 ; N a ; B 27 -12 509 530 ;
+C 98 ; WX 556 ; N b ; B 17 -12 519 716 ;
+C 99 ; WX 500 ; N c ; B 38 -12 492 530 ;
+C 100 ; WX 556 ; N d ; B 36 -12 581 716 ;
+C 101 ; WX 556 ; N e ; B 35 -12 515 530 ;
+C 102 ; WX 278 ; N f ; B 26 0 388 728 ;
+C 103 ; WX 556 ; N g ; B 9 -208 548 530 ;
+C 104 ; WX 556 ; N h ; B 17 0 512 716 ;
+C 105 ; WX 222 ; N i ; B 13 0 250 716 ;
+C 106 ; WX 222 ; N j ; B -138 -208 250 716 ;
+C 107 ; WX 500 ; N k ; B 15 0 534 716 ;
+C 108 ; WX 222 ; N l ; B 13 0 250 716 ;
+C 109 ; WX 833 ; N m ; B 14 0 793 530 ;
+C 110 ; WX 556 ; N n ; B 17 0 511 530 ;
+C 111 ; WX 556 ; N o ; B 32 -12 523 530 ;
+C 112 ; WX 556 ; N p ; B -27 -199 518 530 ;
+C 113 ; WX 556 ; N q ; B 35 -199 536 530 ;
+C 114 ; WX 333 ; N r ; B 15 0 401 530 ;
+C 115 ; WX 500 ; N s ; B 10 -12 470 530 ;
+C 116 ; WX 278 ; N t ; B 36 -9 300 707 ;
+C 117 ; WX 556 ; N u ; B 44 -12 539 519 ;
+C 118 ; WX 500 ; N v ; B 60 0 540 519 ;
+C 119 ; WX 722 ; N w ; B 61 0 760 519 ;
+C 120 ; WX 500 ; N x ; B -20 0 519 519 ;
+C 121 ; WX 500 ; N y ; B -19 -208 542 519 ;
+C 122 ; WX 500 ; N z ; B 1 0 493 519 ;
+C 123 ; WX 334 ; N braceleft ; B 34 -211 427 728 ;
+C 124 ; WX 260 ; N bar ; B 115 -210 191 728 ;
+C 125 ; WX 334 ; N braceright ; B -92 -211 301 728 ;
+C 126 ; WX 584 ; N asciitilde ; B 61 272 560 432 ;
+C 128 ; WX 278 ; N c128 ; B 0 0 0 0 ;
+C 129 ; WX 278 ; N c129 ; B 0 0 0 0 ;
+C 130 ; WX 278 ; N c130 ; B 0 0 0 0 ;
+C 131 ; WX 278 ; N c131 ; B 0 0 0 0 ;
+C 132 ; WX 278 ; N c132 ; B 0 0 0 0 ;
+C 133 ; WX 278 ; N c133 ; B 0 0 0 0 ;
+C 134 ; WX 278 ; N c134 ; B 0 0 0 0 ;
+C 135 ; WX 278 ; N c135 ; B 0 0 0 0 ;
+C 136 ; WX 278 ; N c136 ; B 0 0 0 0 ;
+C 137 ; WX 278 ; N c137 ; B 0 0 0 0 ;
+C 138 ; WX 278 ; N c138 ; B 0 0 0 0 ;
+C 139 ; WX 278 ; N c139 ; B 0 0 0 0 ;
+C 140 ; WX 278 ; N c140 ; B 0 0 0 0 ;
+C 141 ; WX 278 ; N c141 ; B 0 0 0 0 ;
+C 142 ; WX 278 ; N c142 ; B 0 0 0 0 ;
+C 143 ; WX 278 ; N c143 ; B 0 0 0 0 ;
+C 144 ; WX 278 ; N c144 ; B 0 0 0 0 ;
+C 145 ; WX 278 ; N c145 ; B 0 0 0 0 ;
+C 146 ; WX 278 ; N c146 ; B 0 0 0 0 ;
+C 147 ; WX 278 ; N c147 ; B 0 0 0 0 ;
+C 148 ; WX 278 ; N c148 ; B 0 0 0 0 ;
+C 149 ; WX 278 ; N c149 ; B 0 0 0 0 ;
+C 150 ; WX 278 ; N c150 ; B 0 0 0 0 ;
+C 151 ; WX 278 ; N c151 ; B 0 0 0 0 ;
+C 152 ; WX 278 ; N c152 ; B 0 0 0 0 ;
+C 153 ; WX 278 ; N c153 ; B 0 0 0 0 ;
+C 154 ; WX 278 ; N c154 ; B 0 0 0 0 ;
+C 155 ; WX 278 ; N c155 ; B 0 0 0 0 ;
+C 156 ; WX 278 ; N c156 ; B 0 0 0 0 ;
+C 157 ; WX 278 ; N c157 ; B 0 0 0 0 ;
+C 158 ; WX 278 ; N c158 ; B 0 0 0 0 ;
+C 159 ; WX 278 ; N c159 ; B 0 0 0 0 ;
+C 160 ; WX 278 ; N nbspace ; B 0 0 0 0 ;
+C 161 ; WX 278 ; N exclamdown ; B 0 0 0 0 ;
+C 162 ; WX 278 ; N cent ; B 0 0 0 0 ;
+C 163 ; WX 556 ; N sterling ; B 35 -12 515 699 ;
+C 164 ; WX 278 ; N currency ; B 0 0 0 0 ;
+C 165 ; WX 278 ; N yen ; B 0 0 0 0 ;
+C 166 ; WX 278 ; N brokenbar ; B 0 0 0 0 ;
+C 167 ; WX 278 ; N section ; B 0 0 0 0 ;
+C 168 ; WX 278 ; N dieresis ; B 0 0 0 0 ;
+C 169 ; WX 278 ; N copyright ; B 0 0 0 0 ;
+C 170 ; WX 278 ; N ordfeminine ; B 0 0 0 0 ;
+C 171 ; WX 278 ; N guillemotleft ; B 0 0 0 0 ;
+C 172 ; WX 278 ; N logicalnot ; B 0 0 0 0 ;
+C 173 ; WX 278 ; N softhyphen ; B 0 0 0 0 ;
+C 174 ; WX 278 ; N registered ; B 0 0 0 0 ;
+C 175 ; WX 278 ; N macron ; B 0 0 0 0 ;
+C 176 ; WX 278 ; N degree ; B 0 0 0 0 ;
+C 177 ; WX 278 ; N plusminus ; B 0 0 0 0 ;
+C 178 ; WX 278 ; N twosuperior ; B 0 0 0 0 ;
+C 179 ; WX 667 ; N threesuperior ; B 26 0 692 859 ;
+C 180 ; WX 278 ; N acute ; B 0 0 0 0 ;
+C 181 ; WX 278 ; N mu ; B 0 0 0 0 ;
+C 182 ; WX 278 ; N paragraph ; B 0 0 0 0 ;
+C 183 ; WX 278 ; N periodcentered ; B 0 0 0 0 ;
+C 184 ; WX 278 ; N cedilla ; B 0 0 0 0 ;
+C 185 ; WX 278 ; N onesuperior ; B 0 0 0 0 ;
+C 186 ; WX 278 ; N ordmasculine ; B 0 0 0 0 ;
+C 187 ; WX 278 ; N guillemotright ; B 0 0 0 0 ;
+C 188 ; WX 278 ; N onequarter ; B 0 0 0 0 ;
+C 189 ; WX 278 ; N onehalf ; B 0 0 0 0 ;
+C 190 ; WX 278 ; N threequarters ; B 0 0 0 0 ;
+C 191 ; WX 278 ; N questiondown ; B 0 0 0 0 ;
+C 192 ; WX 752 ; N Agrave ; B 14 -12 722 530 ;
+C 193 ; WX 556 ; N Aacute ; B 27 -12 509 530 ;
+C 194 ; WX 563 ; N Acircumflex ; B 41 -12 579 728 ;
+C 195 ; WX 572 ; N Atilde ; B 44 -151 538 519 ;
+C 196 ; WX 553 ; N Adieresis ; B 32 -12 530 728 ;
+C 197 ; WX 556 ; N Aring ; B 35 -12 515 530 ;
+C 198 ; WX 835 ; N AE ; B 30 -199 806 716 ;
+C 199 ; WX 493 ; N Ccedilla ; B 16 -12 458 530 ;
+C 200 ; WX 500 ; N Egrave ; B -20 0 519 519 ;
+C 201 ; WX 556 ; N Eacute ; B 44 -12 539 519 ;
+C 202 ; WX 556 ; N Ecircumflex ; B 44 -12 539 719 ;
+C 203 ; WX 472 ; N Edieresis ; B 14 0 503 519 ;
+C 204 ; WX 564 ; N Igrave ; B -36 -7 553 519 ;
+C 205 ; WX 686 ; N Iacute ; B 14 0 675 519 ;
+C 206 ; WX 550 ; N Icircumflex ; B 14 0 538 519 ;
+C 207 ; WX 556 ; N Idieresis ; B 32 -12 523 530 ;
+C 208 ; WX 550 ; N Eth ; B 14 0 538 518 ;
+C 209 ; WX 534 ; N Ntilde ; B -29 0 525 519 ;
+C 210 ; WX 556 ; N Ograve ; B -27 -199 518 530 ;
+C 211 ; WX 500 ; N Oacute ; B 38 -12 492 530 ;
+C 212 ; WX 833 ; N Ocircumflex ; B 14 0 793 530 ;
+C 213 ; WX 500 ; N Otilde ; B -19 -208 542 519 ;
+C 214 ; WX 688 ; N Odieresis ; B -46 0 724 519 ;
+C 215 ; WX 522 ; N multiply ; B 28 -12 488 530 ;
+C 216 ; WX 526 ; N Oslash ; B 14 0 475 519 ;
+C 217 ; WX 736 ; N Ugrave ; B 14 0 726 519 ;
+C 218 ; WX 465 ; N Uacute ; B -7 -12 433 530 ;
+C 219 ; WX 830 ; N Ucircumflex ; B 42 -12 818 519 ;
+C 220 ; WX 492 ; N Udieresis ; B 9 -12 461 530 ;
+C 221 ; WX 851 ; N Yacute ; B 42 -151 818 519 ;
+C 222 ; WX 518 ; N Thorn ; B 57 0 506 519 ;
+C 223 ; WX 621 ; N germandbls ; B 42 0 571 519 ;
+C 224 ; WX 1022 ; N agrave ; B 25 -12 995 728 ;
+C 225 ; WX 667 ; N aacute ; B -38 0 598 716 ;
+C 226 ; WX 651 ; N acircumflex ; B 25 0 640 716 ;
+C 227 ; WX 727 ; N atilde ; B 26 -143 742 716 ;
+C 228 ; WX 704 ; N adieresis ; B -80 -143 716 716 ;
+C 229 ; WX 667 ; N aring ; B 26 0 692 716 ;
+C 230 ; WX 795 ; N ae ; B 63 0 776 716 ;
+C 231 ; WX 544 ; N ccedilla ; B 26 0 639 716 ;
+C 232 ; WX 667 ; N egrave ; B -47 0 753 716 ;
+C 233 ; WX 715 ; N eacute ; B 25 0 734 716 ;
+C 234 ; WX 715 ; N ecircumflex ; B 25 0 734 877 ;
+C 235 ; WX 589 ; N edieresis ; B 26 0 657 721 ;
+C 236 ; WX 686 ; N igrave ; B -27 -8 706 716 ;
+C 237 ; WX 833 ; N iacute ; B 23 0 851 716 ;
+C 238 ; WX 722 ; N icircumflex ; B 25 0 737 716 ;
+C 239 ; WX 778 ; N idieresis ; B 69 -12 750 728 ;
+C 240 ; WX 723 ; N eth ; B 26 0 743 716 ;
+C 241 ; WX 682 ; N ntilde ; B -43 0 703 716 ;
+C 242 ; WX 667 ; N ograve ; B 24 0 679 716 ;
+C 243 ; WX 722 ; N oacute ; B 74 -12 713 728 ;
+C 244 ; WX 611 ; N ocircumflex ; B 103 0 683 716 ;
+C 245 ; WX 639 ; N otilde ; B 96 -10 734 716 ;
+C 246 ; WX 917 ; N odieresis ; B -52 0 985 721 ;
+C 247 ; WX 667 ; N divide ; B 25 0 636 716 ;
+C 248 ; WX 651 ; N oslash ; B 25 0 609 716 ;
+C 249 ; WX 886 ; N ugrave ; B 25 0 904 716 ;
+C 250 ; WX 614 ; N uacute ; B 24 -12 589 728 ;
+C 251 ; WX 920 ; N ucircumflex ; B 26 0 939 716 ;
+C 252 ; WX 694 ; N udieresis ; B 27 -12 670 728 ;
+C 253 ; WX 923 ; N yacute ; B 26 -143 939 716 ;
+C 254 ; WX 673 ; N thorn ; B 90 0 692 716 ;
+C 255 ; WX 805 ; N ydieresis ; B 96 0 764 716 ;
+C -1 ; WX 333 ; N minus ; B 23 215 311 303 ;
+EndCharMetrics
+EndFontMetrics
diff --git a/src/fonts/cyrillic/cokoi8b.afm b/src/fonts/cyrillic/cokoi8b.afm
new file mode 100644
index 0000000..d8e02c1
--- /dev/null
+++ b/src/fonts/cyrillic/cokoi8b.afm
@@ -0,0 +1,244 @@
+StartFontMetrics 3.0
+FontName ERKurierKOI8RBold
+FullName ER Kurier KOI8 R Bold
+FamilyName ER Kurier KOI8-R
+Weight Bold
+ItalicAngle 0
+IsFixedPitch false
+FontBBox -49 -323 650 801
+UnderlinePosition -475
+UnderlineThickness 132
+Version 5.0
+Notice <c> Gavin Helf, 1995. Changes <c> 1996 by Andrey A.Chernov. Changes <c> 1997 by E.V.Demidov
+EncodingScheme FontSpecific
+CapHeight 621
+XHeight 475
+Ascender 670
+Descender -225
+StartCharMetrics 224
+C 32 ; WX 600 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 600 ; N exclam ; B 203 -51 397 664 ;
+C 34 ; WX 600 ; N quotedbl ; B 102 307 497 627 ;
+C 35 ; WX 600 ; N numbersign ; B 55 -100 545 695 ;
+C 36 ; WX 600 ; N dollar ; B 75 -130 525 701 ;
+C 37 ; WX 600 ; N percent ; B 55 -48 546 659 ;
+C 38 ; WX 600 ; N ampersand ; B 88 -53 536 563 ;
+C 39 ; WX 600 ; N quoteright ; B 207 295 393 637 ;
+C 40 ; WX 600 ; N parenleft ; B 202 -164 440 649 ;
+C 41 ; WX 600 ; N parenright ; B 160 -164 398 649 ;
+C 42 ; WX 600 ; N asterisk ; B 76 217 524 649 ;
+C 43 ; WX 600 ; N plus ; B 34 -4 566 574 ;
+C 44 ; WX 600 ; N comma ; B 122 -171 393 172 ;
+C 45 ; WX 600 ; N hyphen ; B 55 217 546 349 ;
+C 46 ; WX 600 ; N period ; B 201 -39 400 142 ;
+C 47 ; WX 600 ; N slash ; B 76 -119 526 715 ;
+C 48 ; WX 600 ; N zero ; B 76 -51 525 664 ;
+C 49 ; WX 600 ; N one ; B 75 -36 525 671 ;
+C 50 ; WX 600 ; N two ; B 47 -36 516 664 ;
+C 51 ; WX 600 ; N three ; B 59 -51 537 664 ;
+C 52 ; WX 600 ; N four ; B 68 -36 519 649 ;
+C 53 ; WX 600 ; N five ; B 59 -51 537 649 ;
+C 54 ; WX 600 ; N six ; B 97 -51 549 664 ;
+C 55 ; WX 600 ; N seven ; B 67 -38 516 649 ;
+C 56 ; WX 600 ; N eight ; B 76 -51 524 664 ;
+C 57 ; WX 600 ; N nine ; B 98 -51 548 664 ;
+C 58 ; WX 600 ; N colon ; B 201 -39 400 447 ;
+C 59 ; WX 600 ; N semicolon ; B 128 -129 399 447 ;
+C 60 ; WX 600 ; N less ; B -17 -5 575 574 ;
+C 61 ; WX 600 ; N equal ; B 13 156 588 417 ;
+C 62 ; WX 600 ; N greater ; B 12 -5 605 574 ;
+C 63 ; WX 600 ; N question ; B 95 -39 524 622 ;
+C 64 ; WX 600 ; N at ; B 68 -100 517 670 ;
+C 65 ; WX 600 ; N A ; B -28 -37 630 608 ;
+C 66 ; WX 600 ; N B ; B 6 -36 580 608 ;
+C 67 ; WX 600 ; N C ; B 26 -53 574 621 ;
+C 68 ; WX 600 ; N D ; B 41 -36 594 608 ;
+C 69 ; WX 600 ; N E ; B 6 -36 559 608 ;
+C 70 ; WX 600 ; N F ; B 41 -36 593 608 ;
+C 71 ; WX 600 ; N G ; B 26 -53 602 621 ;
+C 72 ; WX 600 ; N H ; B 16 -37 591 608 ;
+C 73 ; WX 600 ; N I ; B 75 -36 525 608 ;
+C 74 ; WX 600 ; N J ; B 33 -53 607 608 ;
+C 75 ; WX 600 ; N K ; B 7 -36 611 608 ;
+C 76 ; WX 600 ; N L ; B 26 -36 579 608 ;
+C 77 ; WX 600 ; N M ; B -25 -36 630 608 ;
+C 78 ; WX 600 ; N N ; B -14 -36 600 608 ;
+C 79 ; WX 600 ; N O ; B 13 -53 586 621 ;
+C 80 ; WX 600 ; N P ; B 51 -36 581 608 ;
+C 81 ; WX 600 ; N Q ; B 14 -153 587 621 ;
+C 82 ; WX 600 ; N R ; B 6 -36 629 608 ;
+C 83 ; WX 600 ; N S ; B 54 -53 546 621 ;
+C 84 ; WX 600 ; N T ; B 33 -36 566 608 ;
+C 85 ; WX 600 ; N U ; B 4 -53 597 608 ;
+C 86 ; WX 600 ; N V ; B -29 -37 629 608 ;
+C 87 ; WX 600 ; N W ; B -16 -37 619 608 ;
+C 88 ; WX 600 ; N X ; B 3 -37 599 608 ;
+C 89 ; WX 600 ; N Y ; B 12 -36 587 608 ;
+C 90 ; WX 600 ; N Z ; B 67 -36 536 608 ;
+C 91 ; WX 600 ; N bracketleft ; B 210 -163 451 649 ;
+C 92 ; WX 600 ; N backslash ; B 61 -122 511 712 ;
+C 93 ; WX 600 ; N bracketright ; B 149 -163 390 649 ;
+C 94 ; WX 600 ; N asciicircum ; B 75 323 525 685 ;
+C 95 ; WX 600 ; N underscore ; B -49 -323 650 -209 ;
+C 96 ; WX 600 ; N quoteleft ; B 180 462 420 686 ;
+C 97 ; WX 600 ; N a ; B 34 -53 579 474 ;
+C 98 ; WX 600 ; N b ; B -15 -53 579 649 ;
+C 99 ; WX 600 ; N c ; B 47 -53 573 474 ;
+C 100 ; WX 600 ; N d ; B 25 -53 620 649 ;
+C 101 ; WX 600 ; N e ; B 26 -53 559 474 ;
+C 102 ; WX 600 ; N f ; B 68 -36 581 649 ;
+C 103 ; WX 600 ; N g ; B 25 -225 598 474 ;
+C 104 ; WX 600 ; N h ; B 5 -37 590 649 ;
+C 105 ; WX 600 ; N i ; B 56 -36 547 670 ;
+C 106 ; WX 600 ; N j ; B 51 -225 439 670 ;
+C 107 ; WX 600 ; N k ; B 57 -36 608 649 ;
+C 108 ; WX 600 ; N l ; B 55 -36 546 649 ;
+C 109 ; WX 600 ; N m ; B -26 -37 630 475 ;
+C 110 ; WX 600 ; N n ; B 16 -37 579 474 ;
+C 111 ; WX 600 ; N o ; B 34 -53 566 474 ;
+C 112 ; WX 600 ; N p ; B -15 -225 579 474 ;
+C 113 ; WX 600 ; N q ; B 26 -225 620 474 ;
+C 114 ; WX 600 ; N r ; B 47 -36 581 470 ;
+C 115 ; WX 600 ; N s ; B 65 -53 536 474 ;
+C 116 ; WX 600 ; N t ; B 35 -53 565 608 ;
+C 117 ; WX 600 ; N u ; B 8 -53 580 459 ;
+C 118 ; WX 600 ; N v ; B -7 -37 608 459 ;
+C 119 ; WX 600 ; N w ; B -9 -38 609 459 ;
+C 120 ; WX 600 ; N x ; B 13 -37 588 459 ;
+C 121 ; WX 600 ; N y ; B 36 -225 610 459 ;
+C 122 ; WX 600 ; N z ; B 79 -36 527 459 ;
+C 123 ; WX 600 ; N braceleft ; B 166 -160 444 652 ;
+C 124 ; WX 600 ; N bar ; B 243 -163 357 649 ;
+C 125 ; WX 600 ; N braceright ; B 156 -164 435 649 ;
+C 126 ; WX 600 ; N asciitilde ; B 55 174 546 396 ;
+C 128 ; WX 600 ; N c128 ; B -49 104 622 167 ;
+C 129 ; WX 600 ; N c129 ; B 254 -220 318 684 ;
+C 130 ; WX 600 ; N c130 ; B 255 -220 622 167 ;
+C 131 ; WX 600 ; N c131 ; B -49 -220 318 167 ;
+C 132 ; WX 600 ; N c132 ; B 255 104 622 684 ;
+C 133 ; WX 600 ; N c133 ; B -49 104 318 684 ;
+C 134 ; WX 600 ; N c134 ; B 255 -220 622 684 ;
+C 135 ; WX 600 ; N c135 ; B -49 -220 318 684 ;
+C 136 ; WX 600 ; N c136 ; B -49 -220 622 167 ;
+C 137 ; WX 600 ; N c137 ; B -49 104 622 684 ;
+C 138 ; WX 600 ; N c138 ; B -49 -220 622 684 ;
+C 139 ; WX 600 ; N c139 ; B -48 232 649 684 ;
+C 140 ; WX 600 ; N c140 ; B -48 -220 649 232 ;
+C 141 ; WX 600 ; N c141 ; B -48 -220 649 684 ;
+C 142 ; WX 600 ; N c142 ; B -49 -220 300 684 ;
+C 143 ; WX 600 ; N c143 ; B 300 -220 649 684 ;
+C 144 ; WX 600 ; N c144 ; B 75 -220 601 682 ;
+C 145 ; WX 600 ; N c145 ; B 0 -220 601 682 ;
+C 146 ; WX 600 ; N c146 ; B 0 -220 601 682 ;
+C 147 ; WX 600 ; N c147 ; B 249 -245 481 801 ;
+C 148 ; WX 600 ; N c148 ; B 76 -37 530 608 ;
+C 149 ; WX 600 ; N c149 ; B 155 166 445 456 ;
+C 150 ; WX 600 ; N c150 ; B 17 -127 629 715 ;
+C 151 ; WX 600 ; N c151 ; B 55 96 546 479 ;
+C 152 ; WX 600 ; N c152 ; B -25 -36 567 643 ;
+C 153 ; WX 600 ; N c153 ; B 32 -36 624 643 ;
+C 154 ; WX 600 ; N c154 ; B 0 0 0 0 ;
+C 155 ; WX 600 ; N c155 ; B 132 -244 364 801 ;
+C 156 ; WX 600 ; N c156 ; B 128 420 472 765 ;
+C 157 ; WX 600 ; N c157 ; B 130 323 449 723 ;
+C 158 ; WX 600 ; N c158 ; B 201 220 400 401 ;
+C 159 ; WX 600 ; N c159 ; B 54 39 546 525 ;
+C 160 ; WX 600 ; N nbspace ; B -7 141 607 369 ;
+C 161 ; WX 600 ; N exclamdown ; B 186 -255 414 766 ;
+C 162 ; WX 600 ; N cent ; B 264 -255 607 369 ;
+C 163 ; WX 600 ; N sterling ; B 26 -53 560 669 ;
+C 164 ; WX 600 ; N currency ; B 186 -255 607 291 ;
+C 165 ; WX 600 ; N yen ; B 186 -255 607 369 ;
+C 166 ; WX 600 ; N brokenbar ; B -7 -255 336 369 ;
+C 167 ; WX 600 ; N section ; B -7 -255 414 291 ;
+C 168 ; WX 600 ; N dieresis ; B -7 -255 414 369 ;
+C 169 ; WX 600 ; N copyright ; B 264 141 607 766 ;
+C 170 ; WX 600 ; N ordfeminine ; B 186 219 607 766 ;
+C 171 ; WX 600 ; N guillemotleft ; B 186 141 607 766 ;
+C 172 ; WX 600 ; N logicalnot ; B -7 141 336 766 ;
+C 173 ; WX 600 ; N softhyphen ; B -7 219 414 766 ;
+C 174 ; WX 600 ; N registered ; B -7 141 414 766 ;
+C 175 ; WX 600 ; N macron ; B 264 -255 607 766 ;
+C 176 ; WX 600 ; N degree ; B -7 -255 414 766 ;
+C 177 ; WX 600 ; N plusminus ; B -7 -255 414 766 ;
+C 178 ; WX 600 ; N twosuperior ; B -7 -255 607 369 ;
+C 179 ; WX 600 ; N threesuperior ; B 6 -36 559 801 ;
+C 180 ; WX 600 ; N acute ; B -7 -255 414 766 ;
+C 181 ; WX 600 ; N mu ; B -7 -255 414 766 ;
+C 182 ; WX 600 ; N paragraph ; B -7 -255 607 369 ;
+C 183 ; WX 600 ; N periodcentered ; B -7 -255 607 291 ;
+C 184 ; WX 600 ; N cedilla ; B -7 -255 607 369 ;
+C 185 ; WX 600 ; N onesuperior ; B -7 141 607 766 ;
+C 186 ; WX 600 ; N ordmasculine ; B -7 219 607 766 ;
+C 187 ; WX 600 ; N guillemotright ; B -7 141 607 766 ;
+C 188 ; WX 600 ; N onequarter ; B -7 -255 607 766 ;
+C 189 ; WX 600 ; N onehalf ; B -7 -255 607 766 ;
+C 190 ; WX 600 ; N threequarters ; B -7 -255 607 766 ;
+C 191 ; WX 600 ; N questiondown ; B -37 -50 634 620 ;
+C 192 ; WX 600 ; N Agrave ; B -20 -51 616 473 ;
+C 193 ; WX 600 ; N Aacute ; B 34 -53 579 474 ;
+C 194 ; WX 600 ; N Acircumflex ; B 43 -53 554 727 ;
+C 195 ; WX 600 ; N Atilde ; B 16 -163 590 459 ;
+C 196 ; WX 600 ; N Adieresis ; B 4 -164 584 459 ;
+C 197 ; WX 600 ; N Aring ; B 26 -53 559 474 ;
+C 198 ; WX 600 ; N AE ; B 20 -225 587 654 ;
+C 199 ; WX 600 ; N Ccedilla ; B 36 -37 536 459 ;
+C 200 ; WX 600 ; N Egrave ; B 13 -37 588 459 ;
+C 201 ; WX 600 ; N Eacute ; B 16 -37 590 459 ;
+C 202 ; WX 600 ; N Ecircumflex ; B 16 -37 590 654 ;
+C 203 ; WX 600 ; N Edieresis ; B 57 -36 608 459 ;
+C 204 ; WX 600 ; N Igrave ; B -8 -37 610 459 ;
+C 205 ; WX 600 ; N Iacute ; B -25 -37 629 459 ;
+C 206 ; WX 600 ; N Icircumflex ; B 16 -37 590 459 ;
+C 207 ; WX 600 ; N Idieresis ; B 34 -53 566 474 ;
+C 208 ; WX 600 ; N Eth ; B 16 -37 590 459 ;
+C 209 ; WX 600 ; N Ntilde ; B 18 -37 576 460 ;
+C 210 ; WX 600 ; N Ograve ; B -15 -225 579 474 ;
+C 211 ; WX 600 ; N Oacute ; B 47 -53 573 474 ;
+C 212 ; WX 600 ; N Ocircumflex ; B 33 -36 566 459 ;
+C 213 ; WX 600 ; N Otilde ; B 36 -225 610 459 ;
+C 214 ; WX 600 ; N Odieresis ; B -33 -37 627 464 ;
+C 215 ; WX 600 ; N multiply ; B 48 -36 569 459 ;
+C 216 ; WX 600 ; N Oslash ; B 48 -36 569 459 ;
+C 217 ; WX 600 ; N Ugrave ; B -21 -36 623 459 ;
+C 218 ; WX 600 ; N Uacute ; B 65 -53 536 474 ;
+C 219 ; WX 600 ; N Ucircumflex ; B 3 -36 603 459 ;
+C 220 ; WX 600 ; N Udieresis ; B 38 -53 564 474 ;
+C 221 ; WX 600 ; N Yacute ; B 3 -163 603 459 ;
+C 222 ; WX 600 ; N Thorn ; B 8 -37 593 459 ;
+C 223 ; WX 600 ; N germandbls ; B 10 -36 598 459 ;
+C 224 ; WX 600 ; N agrave ; B -20 -51 618 622 ;
+C 225 ; WX 600 ; N aacute ; B -28 -37 630 608 ;
+C 226 ; WX 600 ; N acircumflex ; B 6 -36 580 608 ;
+C 227 ; WX 600 ; N atilde ; B 6 -227 581 608 ;
+C 228 ; WX 600 ; N adieresis ; B 4 -227 584 608 ;
+C 229 ; WX 600 ; N aring ; B 6 -36 559 608 ;
+C 230 ; WX 600 ; N ae ; B -21 -37 621 608 ;
+C 231 ; WX 600 ; N ccedilla ; B 26 -36 579 608 ;
+C 232 ; WX 600 ; N egrave ; B 3 -37 599 608 ;
+C 233 ; WX 600 ; N eacute ; B -5 -36 611 608 ;
+C 234 ; WX 600 ; N ecircumflex ; B -5 -36 611 768 ;
+C 235 ; WX 600 ; N edieresis ; B 7 -36 611 608 ;
+C 236 ; WX 600 ; N igrave ; B -27 -37 591 608 ;
+C 237 ; WX 600 ; N iacute ; B -25 -36 630 608 ;
+C 238 ; WX 600 ; N icircumflex ; B 16 -37 591 608 ;
+C 239 ; WX 600 ; N idieresis ; B 13 -53 586 621 ;
+C 240 ; WX 600 ; N eth ; B 16 -37 591 608 ;
+C 241 ; WX 600 ; N ntilde ; B -19 -36 604 608 ;
+C 242 ; WX 600 ; N ograve ; B 51 -36 581 608 ;
+C 243 ; WX 600 ; N oacute ; B 26 -53 574 621 ;
+C 244 ; WX 600 ; N ocircumflex ; B 33 -36 566 608 ;
+C 245 ; WX 600 ; N otilde ; B 8 -54 601 611 ;
+C 246 ; WX 600 ; N odieresis ; B -30 -37 625 610 ;
+C 247 ; WX 600 ; N divide ; B 6 -36 580 608 ;
+C 248 ; WX 600 ; N oslash ; B 51 -36 581 608 ;
+C 249 ; WX 600 ; N ugrave ; B -18 -36 613 608 ;
+C 250 ; WX 600 ; N uacute ; B 54 -41 552 610 ;
+C 251 ; WX 600 ; N ucircumflex ; B -22 -36 614 608 ;
+C 252 ; WX 600 ; N udieresis ; B 29 -53 577 621 ;
+C 253 ; WX 600 ; N yacute ; B -22 -227 617 608 ;
+C 254 ; WX 600 ; N thorn ; B 10 -36 595 607 ;
+C 255 ; WX 600 ; N ydieresis ; B 6 -36 601 608 ;
+C -1 ; WX 600 ; N minus ; B 55 217 546 349 ;
+EndCharMetrics
+EndFontMetrics
diff --git a/src/fonts/cyrillic/cokoi8bi.afm b/src/fonts/cyrillic/cokoi8bi.afm
new file mode 100644
index 0000000..b985fad
--- /dev/null
+++ b/src/fonts/cyrillic/cokoi8bi.afm
@@ -0,0 +1,244 @@
+StartFontMetrics 3.0
+FontName ERKurierKOI8RBoldItalic
+FullName ER Kurier KOI8 R Bold Italic
+FamilyName ER Kurier KOI8-R
+Weight BoldItalic
+ItalicAngle 0
+IsFixedPitch false
+FontBBox -108 -323 747 801
+UnderlinePosition -475
+UnderlineThickness 132
+Version 5.0
+Notice <c> Gavin Helf, 1995. Changes <c> 1996 by Andrey A.Chernov. Changes <c> 1997 by E.V.Demidov
+EncodingScheme FontSpecific
+CapHeight 621
+XHeight 475
+Ascender 670
+Descender -225
+StartCharMetrics 224
+C 32 ; WX 600 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 600 ; N exclam ; B 208 -51 504 664 ;
+C 34 ; WX 600 ; N quotedbl ; B 217 307 631 627 ;
+C 35 ; WX 600 ; N numbersign ; B 99 -100 628 695 ;
+C 36 ; WX 600 ; N dollar ; B 93 -130 622 701 ;
+C 37 ; WX 600 ; N percent ; B 106 -48 626 659 ;
+C 38 ; WX 600 ; N ampersand ; B 113 -53 586 563 ;
+C 39 ; WX 600 ; N quoteright ; B 320 295 529 637 ;
+C 40 ; WX 600 ; N parenleft ; B 242 -164 567 649 ;
+C 41 ; WX 600 ; N parenright ; B 135 -164 461 649 ;
+C 42 ; WX 600 ; N asterisk ; B 176 217 627 649 ;
+C 43 ; WX 600 ; N plus ; B 94 -4 629 574 ;
+C 44 ; WX 600 ; N comma ; B 96 -171 430 172 ;
+C 45 ; WX 600 ; N hyphen ; B 101 217 621 349 ;
+C 46 ; WX 600 ; N period ; B 209 -39 413 142 ;
+C 47 ; WX 600 ; N slash ; B 61 -119 667 715 ;
+C 48 ; WX 600 ; N zero ; B 120 -51 613 664 ;
+C 49 ; WX 600 ; N one ; B 78 -36 530 671 ;
+C 50 ; WX 600 ; N two ; B 39 -36 618 664 ;
+C 51 ; WX 600 ; N three ; B 72 -51 620 664 ;
+C 52 ; WX 600 ; N four ; B 96 -36 593 649 ;
+C 53 ; WX 600 ; N five ; B 76 -51 624 649 ;
+C 54 ; WX 600 ; N six ; B 149 -51 675 664 ;
+C 55 ; WX 600 ; N seven ; B 179 -38 655 649 ;
+C 56 ; WX 600 ; N eight ; B 107 -51 617 664 ;
+C 57 ; WX 600 ; N nine ; B 103 -51 627 664 ;
+C 58 ; WX 600 ; N colon ; B 209 -39 478 447 ;
+C 59 ; WX 600 ; N semicolon ; B 110 -129 478 447 ;
+C 60 ; WX 600 ; N less ; B 44 -5 687 574 ;
+C 61 ; WX 600 ; N equal ; B 58 156 666 417 ;
+C 62 ; WX 600 ; N greater ; B 22 -5 666 574 ;
+C 63 ; WX 600 ; N question ; B 193 -39 618 623 ;
+C 64 ; WX 600 ; N at ; B 102 -100 602 670 ;
+C 65 ; WX 600 ; N A ; B -25 -37 635 608 ;
+C 66 ; WX 600 ; N B ; B 10 -36 632 608 ;
+C 67 ; WX 600 ; N C ; B 71 -53 676 621 ;
+C 68 ; WX 600 ; N D ; B 44 -36 669 608 ;
+C 69 ; WX 600 ; N E ; B 10 -36 668 608 ;
+C 70 ; WX 600 ; N F ; B 45 -36 723 608 ;
+C 71 ; WX 600 ; N G ; B 69 -53 678 621 ;
+C 72 ; WX 600 ; N H ; B 19 -37 689 608 ;
+C 73 ; WX 600 ; N I ; B 79 -36 644 608 ;
+C 74 ; WX 600 ; N J ; B 45 -53 726 608 ;
+C 75 ; WX 600 ; N K ; B 11 -36 709 608 ;
+C 76 ; WX 600 ; N L ; B 30 -36 625 608 ;
+C 77 ; WX 600 ; N M ; B -21 -36 740 608 ;
+C 78 ; WX 600 ; N N ; B 10 -36 719 608 ;
+C 79 ; WX 600 ; N O ; B 64 -53 657 621 ;
+C 80 ; WX 600 ; N P ; B 55 -36 672 608 ;
+C 81 ; WX 600 ; N Q ; B 65 -153 658 621 ;
+C 82 ; WX 600 ; N R ; B 10 -36 635 608 ;
+C 83 ; WX 600 ; N S ; B 58 -53 643 621 ;
+C 84 ; WX 600 ; N T ; B 112 -36 696 608 ;
+C 85 ; WX 600 ; N U ; B 100 -53 716 608 ;
+C 86 ; WX 600 ; N V ; B 87 -37 747 608 ;
+C 87 ; WX 600 ; N W ; B 82 -37 737 608 ;
+C 88 ; WX 600 ; N X ; B 6 -37 705 608 ;
+C 89 ; WX 600 ; N Y ; B 113 -36 706 608 ;
+C 90 ; WX 600 ; N Z ; B 59 -36 643 608 ;
+C 91 ; WX 600 ; N bracketleft ; B 175 -163 579 649 ;
+C 92 ; WX 600 ; N backslash ; B 201 -122 498 712 ;
+C 93 ; WX 600 ; N bracketright ; B 125 -163 529 649 ;
+C 94 ; WX 600 ; N asciicircum ; B 154 323 607 685 ;
+C 95 ; WX 600 ; N underscore ; B -108 -323 594 -209 ;
+C 96 ; WX 600 ; N quoteleft ; B 313 462 532 686 ;
+C 97 ; WX 600 ; N a ; B 54 -53 584 474 ;
+C 98 ; WX 600 ; N b ; B -11 -53 631 649 ;
+C 99 ; WX 600 ; N c ; B 85 -53 636 474 ;
+C 100 ; WX 600 ; N d ; B 64 -53 677 649 ;
+C 101 ; WX 600 ; N e ; B 66 -53 607 474 ;
+C 102 ; WX 600 ; N f ; B 72 -36 705 649 ;
+C 103 ; WX 600 ; N g ; B 66 -225 685 474 ;
+C 104 ; WX 600 ; N h ; B 17 -37 595 649 ;
+C 105 ; WX 600 ; N i ; B 60 -36 553 670 ;
+C 106 ; WX 600 ; N j ; B 15 -225 539 670 ;
+C 107 ; WX 600 ; N k ; B 60 -36 642 649 ;
+C 108 ; WX 600 ; N l ; B 59 -36 552 649 ;
+C 109 ; WX 600 ; N m ; B -23 -37 644 475 ;
+C 110 ; WX 600 ; N n ; B 20 -37 585 474 ;
+C 111 ; WX 600 ; N o ; B 72 -53 617 474 ;
+C 112 ; WX 600 ; N p ; B -51 -225 633 474 ;
+C 113 ; WX 600 ; N q ; B 68 -225 707 474 ;
+C 114 ; WX 600 ; N r ; B 51 -36 661 470 ;
+C 115 ; WX 600 ; N s ; B 68 -53 600 474 ;
+C 116 ; WX 600 ; N t ; B 119 -53 589 608 ;
+C 117 ; WX 600 ; N u ; B 92 -53 616 459 ;
+C 118 ; WX 600 ; N v ; B 77 -37 695 459 ;
+C 119 ; WX 600 ; N w ; B 76 -38 696 459 ;
+C 120 ; WX 600 ; N x ; B 16 -37 653 459 ;
+C 121 ; WX 600 ; N y ; B 1 -225 698 459 ;
+C 122 ; WX 600 ; N z ; B 71 -36 614 459 ;
+C 123 ; WX 600 ; N braceleft ; B 217 -160 572 652 ;
+C 124 ; WX 600 ; N bar ; B 220 -163 485 649 ;
+C 125 ; WX 600 ; N braceright ; B 132 -164 489 649 ;
+C 126 ; WX 600 ; N asciitilde ; B 110 174 613 396 ;
+C 128 ; WX 600 ; N c128 ; B -49 104 622 167 ;
+C 129 ; WX 600 ; N c129 ; B 254 -220 318 684 ;
+C 130 ; WX 600 ; N c130 ; B 255 -220 622 167 ;
+C 131 ; WX 600 ; N c131 ; B -49 -220 318 167 ;
+C 132 ; WX 600 ; N c132 ; B 255 104 622 684 ;
+C 133 ; WX 600 ; N c133 ; B -49 104 319 684 ;
+C 134 ; WX 600 ; N c134 ; B 255 -220 622 684 ;
+C 135 ; WX 600 ; N c135 ; B -49 -220 319 684 ;
+C 136 ; WX 600 ; N c136 ; B -49 -220 622 167 ;
+C 137 ; WX 600 ; N c137 ; B -49 104 622 684 ;
+C 138 ; WX 600 ; N c138 ; B -49 -220 622 684 ;
+C 139 ; WX 600 ; N c139 ; B -49 232 649 684 ;
+C 140 ; WX 600 ; N c140 ; B -49 -220 649 232 ;
+C 141 ; WX 600 ; N c141 ; B -49 -220 649 684 ;
+C 142 ; WX 600 ; N c142 ; B -49 -220 300 684 ;
+C 143 ; WX 600 ; N c143 ; B 300 -220 649 684 ;
+C 144 ; WX 600 ; N c144 ; B 75 -220 601 682 ;
+C 145 ; WX 600 ; N c145 ; B 0 -220 602 682 ;
+C 146 ; WX 600 ; N c146 ; B 0 -220 602 682 ;
+C 147 ; WX 600 ; N c147 ; B 249 -245 481 801 ;
+C 148 ; WX 600 ; N c148 ; B 76 -37 530 608 ;
+C 149 ; WX 600 ; N c149 ; B 155 166 446 456 ;
+C 150 ; WX 600 ; N c150 ; B 17 -127 629 715 ;
+C 151 ; WX 600 ; N c151 ; B 55 96 546 479 ;
+C 152 ; WX 600 ; N c152 ; B -26 -36 567 643 ;
+C 153 ; WX 600 ; N c153 ; B 31 -36 624 643 ;
+C 154 ; WX 600 ; N c154 ; B 0 0 0 0 ;
+C 155 ; WX 600 ; N c155 ; B 132 -244 364 801 ;
+C 156 ; WX 600 ; N c156 ; B 128 420 472 765 ;
+C 157 ; WX 600 ; N c157 ; B 130 323 449 723 ;
+C 158 ; WX 600 ; N c158 ; B 201 220 400 401 ;
+C 159 ; WX 600 ; N c159 ; B 54 39 546 525 ;
+C 160 ; WX 600 ; N nbspace ; B -7 141 608 369 ;
+C 161 ; WX 600 ; N exclamdown ; B 186 -255 414 766 ;
+C 162 ; WX 600 ; N cent ; B 264 -255 607 369 ;
+C 163 ; WX 600 ; N sterling ; B 66 -53 607 669 ;
+C 164 ; WX 600 ; N currency ; B 186 -255 607 291 ;
+C 165 ; WX 600 ; N yen ; B 186 -255 607 369 ;
+C 166 ; WX 600 ; N brokenbar ; B -7 -255 336 369 ;
+C 167 ; WX 600 ; N section ; B -7 -255 414 291 ;
+C 168 ; WX 600 ; N dieresis ; B -7 -255 414 369 ;
+C 169 ; WX 600 ; N copyright ; B 264 141 607 766 ;
+C 170 ; WX 600 ; N ordfeminine ; B 186 219 607 766 ;
+C 171 ; WX 600 ; N guillemotleft ; B 186 141 607 766 ;
+C 172 ; WX 600 ; N logicalnot ; B -7 141 336 766 ;
+C 173 ; WX 600 ; N softhyphen ; B -7 219 414 766 ;
+C 174 ; WX 600 ; N registered ; B -7 141 414 766 ;
+C 175 ; WX 600 ; N macron ; B 264 -255 607 766 ;
+C 176 ; WX 600 ; N degree ; B -7 -255 414 766 ;
+C 177 ; WX 600 ; N plusminus ; B -7 -255 414 766 ;
+C 178 ; WX 600 ; N twosuperior ; B -7 -255 607 369 ;
+C 179 ; WX 600 ; N threesuperior ; B 10 -36 668 801 ;
+C 180 ; WX 600 ; N acute ; B -7 -255 414 766 ;
+C 181 ; WX 600 ; N mu ; B -7 -255 414 766 ;
+C 182 ; WX 600 ; N paragraph ; B -7 -255 607 369 ;
+C 183 ; WX 600 ; N periodcentered ; B -7 -255 607 291 ;
+C 184 ; WX 600 ; N cedilla ; B -7 -255 607 369 ;
+C 185 ; WX 600 ; N onesuperior ; B -7 141 607 766 ;
+C 186 ; WX 600 ; N ordmasculine ; B -7 219 607 766 ;
+C 187 ; WX 600 ; N guillemotright ; B -7 141 607 766 ;
+C 188 ; WX 600 ; N onequarter ; B -7 -255 607 766 ;
+C 189 ; WX 600 ; N onehalf ; B -7 -255 607 766 ;
+C 190 ; WX 600 ; N threequarters ; B -7 -255 607 766 ;
+C 191 ; WX 600 ; N questiondown ; B 16 -50 703 620 ;
+C 192 ; WX 600 ; N Agrave ; B -16 -51 668 473 ;
+C 193 ; WX 600 ; N Aacute ; B 54 -53 584 474 ;
+C 194 ; WX 600 ; N Acircumflex ; B 81 -53 660 727 ;
+C 195 ; WX 600 ; N Atilde ; B 94 -163 617 459 ;
+C 196 ; WX 600 ; N Adieresis ; B 87 -53 639 727 ;
+C 197 ; WX 600 ; N Aring ; B 66 -53 607 474 ;
+C 198 ; WX 600 ; N AE ; B 58 -225 639 654 ;
+C 199 ; WX 600 ; N Ccedilla ; B 68 -53 568 474 ;
+C 200 ; WX 600 ; N Egrave ; B 16 -37 653 459 ;
+C 201 ; WX 600 ; N Eacute ; B 94 -53 617 459 ;
+C 202 ; WX 600 ; N Ecircumflex ; B 94 -53 617 654 ;
+C 203 ; WX 600 ; N Edieresis ; B 60 -36 642 459 ;
+C 204 ; WX 600 ; N Igrave ; B -5 -37 685 459 ;
+C 205 ; WX 600 ; N Iacute ; B -22 -37 716 459 ;
+C 206 ; WX 600 ; N Icircumflex ; B 20 -37 677 459 ;
+C 207 ; WX 600 ; N Idieresis ; B 72 -53 617 474 ;
+C 208 ; WX 600 ; N Eth ; B 20 -37 585 474 ;
+C 209 ; WX 600 ; N Ntilde ; B 21 -37 663 460 ;
+C 210 ; WX 600 ; N Ograve ; B -51 -225 633 474 ;
+C 211 ; WX 600 ; N Oacute ; B 85 -53 636 474 ;
+C 212 ; WX 600 ; N Ocircumflex ; B -23 -37 644 475 ;
+C 213 ; WX 600 ; N Otilde ; B 1 -225 698 459 ;
+C 214 ; WX 600 ; N Odieresis ; B -29 -37 675 464 ;
+C 215 ; WX 600 ; N multiply ; B 52 -36 598 459 ;
+C 216 ; WX 600 ; N Oslash ; B 52 -36 598 459 ;
+C 217 ; WX 600 ; N Ugrave ; B -18 -36 710 459 ;
+C 218 ; WX 600 ; N Uacute ; B 86 -53 584 474 ;
+C 219 ; WX 600 ; N Ucircumflex ; B -32 -56 635 456 ;
+C 220 ; WX 600 ; N Udieresis ; B 56 -53 616 474 ;
+C 221 ; WX 600 ; N Yacute ; B -32 -167 635 456 ;
+C 222 ; WX 600 ; N Thorn ; B 93 -37 671 459 ;
+C 223 ; WX 600 ; N germandbls ; B 68 -36 627 459 ;
+C 224 ; WX 600 ; N agrave ; B -16 -51 696 622 ;
+C 225 ; WX 600 ; N aacute ; B -25 -37 635 608 ;
+C 226 ; WX 600 ; N acircumflex ; B 10 -36 668 608 ;
+C 227 ; WX 600 ; N atilde ; B 29 -227 700 608 ;
+C 228 ; WX 600 ; N adieresis ; B -33 -227 689 608 ;
+C 229 ; WX 600 ; N aring ; B 10 -36 668 608 ;
+C 230 ; WX 600 ; N ae ; B 35 -37 687 608 ;
+C 231 ; WX 600 ; N ccedilla ; B 29 -36 710 608 ;
+C 232 ; WX 600 ; N egrave ; B 6 -37 705 608 ;
+C 233 ; WX 600 ; N eacute ; B -2 -36 730 608 ;
+C 234 ; WX 600 ; N ecircumflex ; B -2 -36 730 768 ;
+C 235 ; WX 600 ; N edieresis ; B 11 -36 709 608 ;
+C 236 ; WX 600 ; N igrave ; B -24 -37 689 608 ;
+C 237 ; WX 600 ; N iacute ; B -21 -36 740 608 ;
+C 238 ; WX 600 ; N icircumflex ; B 19 -37 689 608 ;
+C 239 ; WX 600 ; N idieresis ; B 64 -53 657 621 ;
+C 240 ; WX 600 ; N eth ; B 19 -37 689 608 ;
+C 241 ; WX 600 ; N ntilde ; B -16 -36 723 608 ;
+C 242 ; WX 600 ; N ograve ; B 55 -36 672 608 ;
+C 243 ; WX 600 ; N oacute ; B 71 -53 676 621 ;
+C 244 ; WX 600 ; N ocircumflex ; B 112 -36 696 608 ;
+C 245 ; WX 600 ; N otilde ; B 8 -54 720 611 ;
+C 246 ; WX 600 ; N odieresis ; B -26 -37 729 610 ;
+C 247 ; WX 600 ; N divide ; B 10 -36 632 608 ;
+C 248 ; WX 600 ; N oslash ; B 53 -36 621 608 ;
+C 249 ; WX 600 ; N ugrave ; B -15 -36 732 608 ;
+C 250 ; WX 600 ; N uacute ; B 79 -41 604 610 ;
+C 251 ; WX 600 ; N ucircumflex ; B -15 -36 733 608 ;
+C 252 ; WX 600 ; N udieresis ; B 51 -53 654 621 ;
+C 253 ; WX 600 ; N yacute ; B -15 -227 733 608 ;
+C 254 ; WX 600 ; N thorn ; B 127 -36 705 607 ;
+C 255 ; WX 600 ; N ydieresis ; B 73 -36 641 608 ;
+C -1 ; WX 600 ; N minus ; B 101 217 621 349 ;
+EndCharMetrics
+EndFontMetrics
diff --git a/src/fonts/cyrillic/cokoi8i.afm b/src/fonts/cyrillic/cokoi8i.afm
new file mode 100644
index 0000000..01ebc82
--- /dev/null
+++ b/src/fonts/cyrillic/cokoi8i.afm
@@ -0,0 +1,244 @@
+StartFontMetrics 3.0
+FontName ERKurierKOI8RItalic
+FullName ER Kurier KOI8 R Italic
+FamilyName ER Kurier KOI8-R
+Weight Italic
+ItalicAngle 0
+IsFixedPitch false
+FontBBox -83 -298 723 777
+UnderlinePosition -475
+UnderlineThickness 132
+Version 5.0
+Notice <c> Gavin Helf, 1995. Changes <c> 1996 by Andrey A.Chernov. Changes <c> 1997 by E.V.Demidov
+EncodingScheme FontSpecific
+CapHeight 596
+XHeight 450
+Ascender 645
+Descender -200
+StartCharMetrics 224
+C 32 ; WX 600 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 600 ; N exclam ; B 233 -27 479 640 ;
+C 34 ; WX 600 ; N quotedbl ; B 242 332 598 603 ;
+C 35 ; WX 600 ; N numbersign ; B 124 -75 603 670 ;
+C 36 ; WX 600 ; N dollar ; B 117 -105 597 677 ;
+C 37 ; WX 600 ; N percent ; B 131 -24 602 634 ;
+C 38 ; WX 600 ; N ampersand ; B 138 -28 562 539 ;
+C 39 ; WX 600 ; N quoteright ; B 345 320 496 613 ;
+C 40 ; WX 600 ; N parenleft ; B 267 -139 543 625 ;
+C 41 ; WX 600 ; N parenright ; B 160 -139 437 625 ;
+C 42 ; WX 600 ; N asterisk ; B 200 241 602 625 ;
+C 43 ; WX 600 ; N plus ; B 119 21 604 550 ;
+C 44 ; WX 600 ; N comma ; B 121 -146 384 147 ;
+C 45 ; WX 600 ; N hyphen ; B 130 241 591 324 ;
+C 46 ; WX 600 ; N period ; B 234 -15 388 118 ;
+C 47 ; WX 600 ; N slash ; B 86 -95 642 690 ;
+C 48 ; WX 600 ; N zero ; B 145 -27 588 639 ;
+C 49 ; WX 600 ; N one ; B 103 -12 506 638 ;
+C 50 ; WX 600 ; N two ; B 69 -12 593 639 ;
+C 51 ; WX 600 ; N three ; B 97 -27 595 639 ;
+C 52 ; WX 600 ; N four ; B 126 -12 564 625 ;
+C 53 ; WX 600 ; N five ; B 101 -27 599 625 ;
+C 54 ; WX 600 ; N six ; B 174 -27 650 639 ;
+C 55 ; WX 600 ; N seven ; B 204 -13 626 625 ;
+C 56 ; WX 600 ; N eight ; B 131 -27 592 639 ;
+C 57 ; WX 600 ; N nine ; B 128 -27 602 639 ;
+C 58 ; WX 600 ; N colon ; B 234 -15 453 423 ;
+C 59 ; WX 600 ; N semicolon ; B 135 -104 453 423 ;
+C 60 ; WX 600 ; N less ; B 94 20 662 550 ;
+C 61 ; WX 600 ; N equal ; B 82 180 641 393 ;
+C 62 ; WX 600 ; N greater ; B 47 20 616 550 ;
+C 63 ; WX 600 ; N question ; B 218 -15 593 598 ;
+C 64 ; WX 600 ; N at ; B 126 -75 577 645 ;
+C 65 ; WX 600 ; N A ; B 0 -12 611 583 ;
+C 66 ; WX 600 ; N B ; B 34 -12 606 583 ;
+C 67 ; WX 600 ; N C ; B 96 -28 651 596 ;
+C 68 ; WX 600 ; N D ; B 69 -12 644 583 ;
+C 69 ; WX 600 ; N E ; B 34 -12 638 583 ;
+C 70 ; WX 600 ; N F ; B 69 -12 693 583 ;
+C 71 ; WX 600 ; N G ; B 94 -28 653 596 ;
+C 72 ; WX 600 ; N H ; B 44 -12 664 583 ;
+C 73 ; WX 600 ; N I ; B 103 -12 619 583 ;
+C 74 ; WX 600 ; N J ; B 71 -28 701 583 ;
+C 75 ; WX 600 ; N K ; B 35 -12 684 583 ;
+C 76 ; WX 600 ; N L ; B 54 -12 601 583 ;
+C 77 ; WX 600 ; N M ; B 3 -12 715 583 ;
+C 78 ; WX 600 ; N N ; B 35 -12 694 583 ;
+C 79 ; WX 600 ; N O ; B 89 -28 632 596 ;
+C 80 ; WX 600 ; N P ; B 79 -12 647 583 ;
+C 81 ; WX 600 ; N Q ; B 90 -129 633 596 ;
+C 82 ; WX 600 ; N R ; B 35 -12 610 583 ;
+C 83 ; WX 600 ; N S ; B 83 -28 618 596 ;
+C 84 ; WX 600 ; N T ; B 136 -12 666 583 ;
+C 85 ; WX 600 ; N U ; B 125 -28 691 583 ;
+C 86 ; WX 600 ; N V ; B 112 -12 723 583 ;
+C 87 ; WX 600 ; N W ; B 110 -12 713 583 ;
+C 88 ; WX 600 ; N X ; B 31 -12 681 583 ;
+C 89 ; WX 600 ; N Y ; B 138 -12 681 583 ;
+C 90 ; WX 600 ; N Z ; B 89 -12 613 583 ;
+C 91 ; WX 600 ; N bracketleft ; B 205 -138 554 625 ;
+C 92 ; WX 600 ; N backslash ; B 225 -98 474 688 ;
+C 93 ; WX 600 ; N bracketright ; B 150 -138 500 625 ;
+C 94 ; WX 600 ; N asciicircum ; B 179 347 583 645 ;
+C 95 ; WX 600 ; N underscore ; B -83 -298 569 -233 ;
+C 96 ; WX 600 ; N quoteleft ; B 338 486 508 661 ;
+C 97 ; WX 600 ; N a ; B 79 -28 559 449 ;
+C 98 ; WX 600 ; N b ; B 14 -28 606 625 ;
+C 99 ; WX 600 ; N c ; B 109 -28 611 449 ;
+C 100 ; WX 600 ; N d ; B 89 -28 647 625 ;
+C 101 ; WX 600 ; N e ; B 91 -28 583 449 ;
+C 102 ; WX 600 ; N f ; B 96 -12 680 625 ;
+C 103 ; WX 600 ; N g ; B 91 -200 660 449 ;
+C 104 ; WX 600 ; N h ; B 42 -12 571 625 ;
+C 105 ; WX 600 ; N i ; B 84 -12 528 645 ;
+C 106 ; WX 600 ; N j ; B 39 -200 509 645 ;
+C 107 ; WX 600 ; N k ; B 85 -12 618 625 ;
+C 108 ; WX 600 ; N l ; B 83 -12 527 625 ;
+C 109 ; WX 600 ; N m ; B 2 -12 616 450 ;
+C 110 ; WX 600 ; N n ; B 45 -12 560 449 ;
+C 111 ; WX 600 ; N o ; B 98 -28 593 449 ;
+C 112 ; WX 600 ; N p ; B -27 -200 608 449 ;
+C 113 ; WX 600 ; N q ; B 93 -200 682 449 ;
+C 114 ; WX 600 ; N r ; B 75 -12 636 445 ;
+C 115 ; WX 600 ; N s ; B 93 -28 576 449 ;
+C 116 ; WX 600 ; N t ; B 144 -28 564 583 ;
+C 117 ; WX 600 ; N u ; B 118 -28 587 435 ;
+C 118 ; WX 600 ; N v ; B 102 -12 670 435 ;
+C 119 ; WX 600 ; N w ; B 101 -13 671 435 ;
+C 120 ; WX 600 ; N x ; B 41 -12 629 435 ;
+C 121 ; WX 600 ; N y ; B 26 -200 673 435 ;
+C 122 ; WX 600 ; N z ; B 101 -12 585 435 ;
+C 123 ; WX 600 ; N braceleft ; B 242 -136 548 628 ;
+C 124 ; WX 600 ; N bar ; B 244 -139 460 625 ;
+C 125 ; WX 600 ; N braceright ; B 157 -139 463 625 ;
+C 126 ; WX 600 ; N asciitilde ; B 135 199 588 371 ;
+C 128 ; WX 600 ; N c128 ; B -49 104 622 167 ;
+C 129 ; WX 600 ; N c129 ; B 254 -220 318 684 ;
+C 130 ; WX 600 ; N c130 ; B 255 -220 622 167 ;
+C 131 ; WX 600 ; N c131 ; B -49 -220 318 167 ;
+C 132 ; WX 600 ; N c132 ; B 255 104 622 684 ;
+C 133 ; WX 600 ; N c133 ; B -49 104 319 684 ;
+C 134 ; WX 600 ; N c134 ; B 255 -220 622 684 ;
+C 135 ; WX 600 ; N c135 ; B -49 -220 319 684 ;
+C 136 ; WX 600 ; N c136 ; B -49 -220 622 167 ;
+C 137 ; WX 600 ; N c137 ; B -49 104 622 684 ;
+C 138 ; WX 600 ; N c138 ; B -49 -220 622 684 ;
+C 139 ; WX 600 ; N c139 ; B -49 232 649 684 ;
+C 140 ; WX 600 ; N c140 ; B -49 -220 649 232 ;
+C 141 ; WX 600 ; N c141 ; B -49 -220 649 684 ;
+C 142 ; WX 600 ; N c142 ; B -49 -220 300 684 ;
+C 143 ; WX 600 ; N c143 ; B 300 -220 649 684 ;
+C 144 ; WX 600 ; N c144 ; B 75 -220 601 682 ;
+C 145 ; WX 600 ; N c145 ; B 0 -220 602 682 ;
+C 146 ; WX 600 ; N c146 ; B 0 -220 602 682 ;
+C 147 ; WX 600 ; N c147 ; B 273 -220 457 777 ;
+C 148 ; WX 600 ; N c148 ; B 101 -12 506 583 ;
+C 149 ; WX 600 ; N c149 ; B 179 190 421 431 ;
+C 150 ; WX 600 ; N c150 ; B 41 -95 604 690 ;
+C 151 ; WX 600 ; N c151 ; B 79 121 522 454 ;
+C 152 ; WX 600 ; N c152 ; B 25 -12 543 618 ;
+C 153 ; WX 600 ; N c153 ; B 56 -12 574 618 ;
+C 154 ; WX 600 ; N c154 ; B 0 0 0 0 ;
+C 155 ; WX 600 ; N c155 ; B 157 -220 340 777 ;
+C 156 ; WX 600 ; N c156 ; B 152 445 448 740 ;
+C 157 ; WX 600 ; N c157 ; B 154 347 424 698 ;
+C 158 ; WX 600 ; N c158 ; B 225 245 376 377 ;
+C 159 ; WX 600 ; N c159 ; B 79 63 522 501 ;
+C 160 ; WX 600 ; N nbspace ; B -7 141 608 369 ;
+C 161 ; WX 600 ; N exclamdown ; B 186 -255 414 766 ;
+C 162 ; WX 600 ; N cent ; B 264 -255 607 369 ;
+C 163 ; WX 600 ; N sterling ; B 91 -28 583 645 ;
+C 164 ; WX 600 ; N currency ; B 186 -255 607 291 ;
+C 165 ; WX 600 ; N yen ; B 186 -255 607 369 ;
+C 166 ; WX 600 ; N brokenbar ; B -7 -255 336 369 ;
+C 167 ; WX 600 ; N section ; B -7 -255 414 291 ;
+C 168 ; WX 600 ; N dieresis ; B -7 -255 414 369 ;
+C 169 ; WX 600 ; N copyright ; B 264 141 607 766 ;
+C 170 ; WX 600 ; N ordfeminine ; B 186 219 607 766 ;
+C 171 ; WX 600 ; N guillemotleft ; B 186 141 607 766 ;
+C 172 ; WX 600 ; N logicalnot ; B -7 141 336 766 ;
+C 173 ; WX 600 ; N softhyphen ; B -7 219 414 766 ;
+C 174 ; WX 600 ; N registered ; B -7 141 414 766 ;
+C 175 ; WX 600 ; N macron ; B 264 -255 607 766 ;
+C 176 ; WX 600 ; N degree ; B 186 -255 607 766 ;
+C 177 ; WX 600 ; N plusminus ; B 186 -255 607 766 ;
+C 178 ; WX 600 ; N twosuperior ; B -7 -255 336 766 ;
+C 179 ; WX 600 ; N threesuperior ; B 34 -12 638 777 ;
+C 180 ; WX 600 ; N acute ; B -7 -255 414 766 ;
+C 181 ; WX 600 ; N mu ; B -7 -255 414 766 ;
+C 182 ; WX 600 ; N paragraph ; B -7 -255 607 369 ;
+C 183 ; WX 600 ; N periodcentered ; B -7 -255 607 291 ;
+C 184 ; WX 600 ; N cedilla ; B -7 -255 607 369 ;
+C 185 ; WX 600 ; N onesuperior ; B -7 141 607 766 ;
+C 186 ; WX 600 ; N ordmasculine ; B -7 219 607 766 ;
+C 187 ; WX 600 ; N guillemotright ; B -7 141 607 766 ;
+C 188 ; WX 600 ; N onequarter ; B -7 -255 607 766 ;
+C 189 ; WX 600 ; N onehalf ; B -7 -255 607 766 ;
+C 190 ; WX 600 ; N threequarters ; B -7 -255 607 766 ;
+C 191 ; WX 600 ; N questiondown ; B 42 -25 678 596 ;
+C 192 ; WX 600 ; N Agrave ; B 8 -26 643 449 ;
+C 193 ; WX 600 ; N Aacute ; B 79 -28 559 449 ;
+C 194 ; WX 600 ; N Acircumflex ; B 106 -28 635 703 ;
+C 195 ; WX 600 ; N Atilde ; B 118 -139 587 435 ;
+C 196 ; WX 600 ; N Adieresis ; B 111 -28 615 703 ;
+C 197 ; WX 600 ; N Aring ; B 91 -28 583 449 ;
+C 198 ; WX 600 ; N AE ; B 82 -201 614 630 ;
+C 199 ; WX 600 ; N Ccedilla ; B 92 -28 543 449 ;
+C 200 ; WX 600 ; N Egrave ; B 41 -12 629 435 ;
+C 201 ; WX 600 ; N Eacute ; B 118 -28 587 435 ;
+C 202 ; WX 600 ; N Ecircumflex ; B 118 -28 587 630 ;
+C 203 ; WX 600 ; N Edieresis ; B 85 -12 618 434 ;
+C 204 ; WX 600 ; N Igrave ; B 21 -12 661 435 ;
+C 205 ; WX 600 ; N Iacute ; B 3 -12 692 435 ;
+C 206 ; WX 600 ; N Icircumflex ; B 44 -12 652 434 ;
+C 207 ; WX 600 ; N Idieresis ; B 98 -28 593 449 ;
+C 208 ; WX 600 ; N Eth ; B 45 -12 560 449 ;
+C 209 ; WX 600 ; N Ntilde ; B 46 -12 638 435 ;
+C 210 ; WX 600 ; N Ograve ; B -27 -200 608 449 ;
+C 211 ; WX 600 ; N Oacute ; B 109 -28 611 449 ;
+C 212 ; WX 600 ; N Ocircumflex ; B 2 -12 616 450 ;
+C 213 ; WX 600 ; N Otilde ; B 26 -200 673 435 ;
+C 214 ; WX 600 ; N Odieresis ; B -5 -12 650 440 ;
+C 215 ; WX 600 ; N multiply ; B 77 -12 573 435 ;
+C 216 ; WX 600 ; N Oslash ; B 76 -12 572 435 ;
+C 217 ; WX 600 ; N Ugrave ; B 7 -12 685 435 ;
+C 218 ; WX 600 ; N Uacute ; B 111 -28 560 450 ;
+C 219 ; WX 600 ; N Ucircumflex ; B 14 -30 628 432 ;
+C 220 ; WX 600 ; N Udieresis ; B 81 -28 591 449 ;
+C 221 ; WX 600 ; N Yacute ; B 14 -141 628 432 ;
+C 222 ; WX 600 ; N Thorn ; B 117 -12 646 435 ;
+C 223 ; WX 600 ; N germandbls ; B 93 -12 602 435 ;
+C 224 ; WX 600 ; N agrave ; B 8 -27 671 598 ;
+C 225 ; WX 600 ; N aacute ; B 0 -12 611 583 ;
+C 226 ; WX 600 ; N acircumflex ; B 34 -12 638 583 ;
+C 227 ; WX 600 ; N atilde ; B 54 -203 675 583 ;
+C 228 ; WX 600 ; N adieresis ; B -9 -203 664 583 ;
+C 229 ; WX 600 ; N aring ; B 34 -12 638 583 ;
+C 230 ; WX 600 ; N ae ; B 60 -12 662 583 ;
+C 231 ; WX 600 ; N ccedilla ; B 54 -12 680 583 ;
+C 232 ; WX 600 ; N egrave ; B 31 -12 681 583 ;
+C 233 ; WX 600 ; N eacute ; B 23 -12 705 583 ;
+C 234 ; WX 600 ; N ecircumflex ; B 23 -12 705 720 ;
+C 235 ; WX 600 ; N edieresis ; B 35 -12 684 583 ;
+C 236 ; WX 600 ; N igrave ; B 1 -12 664 583 ;
+C 237 ; WX 600 ; N iacute ; B 3 -12 715 583 ;
+C 238 ; WX 600 ; N icircumflex ; B 44 -12 664 583 ;
+C 239 ; WX 600 ; N idieresis ; B 89 -28 632 596 ;
+C 240 ; WX 600 ; N eth ; B 44 -12 664 583 ;
+C 241 ; WX 600 ; N ntilde ; B 9 -12 699 583 ;
+C 242 ; WX 600 ; N ograve ; B 79 -12 647 583 ;
+C 243 ; WX 600 ; N oacute ; B 96 -28 651 596 ;
+C 244 ; WX 600 ; N ocircumflex ; B 136 -12 666 583 ;
+C 245 ; WX 600 ; N otilde ; B 33 -29 695 586 ;
+C 246 ; WX 600 ; N odieresis ; B -2 -12 705 585 ;
+C 247 ; WX 600 ; N divide ; B 34 -12 606 583 ;
+C 248 ; WX 600 ; N oslash ; B 78 -12 596 583 ;
+C 249 ; WX 600 ; N ugrave ; B 10 -12 707 583 ;
+C 250 ; WX 600 ; N uacute ; B 104 -16 579 585 ;
+C 251 ; WX 600 ; N ucircumflex ; B 10 -12 708 583 ;
+C 252 ; WX 600 ; N udieresis ; B 76 -28 628 596 ;
+C 253 ; WX 600 ; N yacute ; B 10 -203 709 583 ;
+C 254 ; WX 600 ; N thorn ; B 151 -12 680 582 ;
+C 255 ; WX 600 ; N ydieresis ; B 98 -12 616 583 ;
+C -1 ; WX 600 ; N minus ; B 130 241 591 324 ;
+EndCharMetrics
+EndFontMetrics
diff --git a/src/fonts/cyrillic/cokoi8n.afm b/src/fonts/cyrillic/cokoi8n.afm
new file mode 100644
index 0000000..41ee875
--- /dev/null
+++ b/src/fonts/cyrillic/cokoi8n.afm
@@ -0,0 +1,244 @@
+StartFontMetrics 3.0
+FontName ERKurierKOI8RRegular
+FullName ER Kurier KOI8 R
+FamilyName ER Kurier KOI8-R
+Weight Regular
+ItalicAngle 0
+IsFixedPitch false
+FontBBox -49 -298 649 777
+UnderlinePosition -475
+UnderlineThickness 132
+Version 5.0
+Notice <c> Gavin Helf, 1995. Changes <c> 1996 by Andrey A.Chernov. Changes <c> 1997 by E.V.Demidov
+EncodingScheme FontSpecific
+CapHeight 596
+XHeight 450
+Ascender 645
+Descender -200
+StartCharMetrics 224
+C 32 ; WX 600 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 600 ; N exclam ; B 228 -27 373 640 ;
+C 34 ; WX 600 ; N quotedbl ; B 130 332 469 603 ;
+C 35 ; WX 600 ; N numbersign ; B 79 -75 520 670 ;
+C 36 ; WX 600 ; N dollar ; B 99 -105 500 677 ;
+C 37 ; WX 600 ; N percent ; B 79 -24 522 634 ;
+C 38 ; WX 600 ; N ampersand ; B 112 -28 511 539 ;
+C 39 ; WX 600 ; N quoteright ; B 235 320 364 613 ;
+C 40 ; WX 600 ; N parenleft ; B 226 -139 416 625 ;
+C 41 ; WX 600 ; N parenright ; B 184 -139 373 625 ;
+C 42 ; WX 600 ; N asterisk ; B 100 241 500 625 ;
+C 43 ; WX 600 ; N plus ; B 58 21 542 550 ;
+C 44 ; WX 600 ; N comma ; B 146 -146 352 147 ;
+C 45 ; WX 600 ; N hyphen ; B 79 241 521 324 ;
+C 46 ; WX 600 ; N period ; B 225 -15 375 118 ;
+C 47 ; WX 600 ; N slash ; B 100 -95 501 690 ;
+C 48 ; WX 600 ; N zero ; B 100 -27 501 639 ;
+C 49 ; WX 600 ; N one ; B 99 -12 500 638 ;
+C 50 ; WX 600 ; N two ; B 71 -12 492 639 ;
+C 51 ; WX 600 ; N three ; B 83 -27 512 639 ;
+C 52 ; WX 600 ; N four ; B 92 -12 492 625 ;
+C 53 ; WX 600 ; N five ; B 83 -27 512 625 ;
+C 54 ; WX 600 ; N six ; B 122 -27 525 639 ;
+C 55 ; WX 600 ; N seven ; B 91 -13 491 625 ;
+C 56 ; WX 600 ; N eight ; B 101 -27 500 639 ;
+C 57 ; WX 600 ; N nine ; B 122 -27 523 639 ;
+C 58 ; WX 600 ; N colon ; B 225 -15 375 423 ;
+C 59 ; WX 600 ; N semicolon ; B 153 -104 375 423 ;
+C 60 ; WX 600 ; N less ; B 33 20 550 550 ;
+C 61 ; WX 600 ; N equal ; B 37 180 563 393 ;
+C 62 ; WX 600 ; N greater ; B 37 20 554 550 ;
+C 63 ; WX 600 ; N question ; B 120 -15 499 598 ;
+C 64 ; WX 600 ; N at ; B 93 -75 492 645 ;
+C 65 ; WX 600 ; N A ; B -4 -12 605 583 ;
+C 66 ; WX 600 ; N B ; B 30 -12 556 583 ;
+C 67 ; WX 600 ; N C ; B 50 -28 549 596 ;
+C 68 ; WX 600 ; N D ; B 65 -12 570 583 ;
+C 69 ; WX 600 ; N E ; B 31 -12 535 583 ;
+C 70 ; WX 600 ; N F ; B 65 -12 568 583 ;
+C 71 ; WX 600 ; N G ; B 51 -28 577 596 ;
+C 72 ; WX 600 ; N H ; B 40 -12 566 583 ;
+C 73 ; WX 600 ; N I ; B 100 -12 501 583 ;
+C 74 ; WX 600 ; N J ; B 57 -28 583 583 ;
+C 75 ; WX 600 ; N K ; B 31 -12 587 583 ;
+C 76 ; WX 600 ; N L ; B 50 -12 555 583 ;
+C 77 ; WX 600 ; N M ; B 0 -12 606 583 ;
+C 78 ; WX 600 ; N N ; B 10 -12 575 583 ;
+C 79 ; WX 600 ; N O ; B 38 -28 562 596 ;
+C 80 ; WX 600 ; N P ; B 75 -12 556 583 ;
+C 81 ; WX 600 ; N Q ; B 39 -129 563 596 ;
+C 82 ; WX 600 ; N R ; B 31 -12 605 583 ;
+C 83 ; WX 600 ; N S ; B 78 -28 522 596 ;
+C 84 ; WX 600 ; N T ; B 58 -12 541 583 ;
+C 85 ; WX 600 ; N U ; B 28 -28 573 583 ;
+C 86 ; WX 600 ; N V ; B -4 -12 605 583 ;
+C 87 ; WX 600 ; N W ; B 8 -12 594 583 ;
+C 88 ; WX 600 ; N X ; B 27 -12 574 583 ;
+C 89 ; WX 600 ; N Y ; B 36 -12 563 583 ;
+C 90 ; WX 600 ; N Z ; B 92 -12 511 583 ;
+C 91 ; WX 600 ; N bracketleft ; B 235 -138 427 625 ;
+C 92 ; WX 600 ; N backslash ; B 86 -98 487 688 ;
+C 93 ; WX 600 ; N bracketright ; B 173 -138 365 625 ;
+C 94 ; WX 600 ; N asciicircum ; B 100 347 501 645 ;
+C 95 ; WX 600 ; N underscore ; B -25 -298 625 -233 ;
+C 96 ; WX 600 ; N quoteleft ; B 205 486 396 661 ;
+C 97 ; WX 600 ; N a ; B 58 -28 554 449 ;
+C 98 ; WX 600 ; N b ; B 10 -28 554 625 ;
+C 99 ; WX 600 ; N c ; B 72 -28 549 449 ;
+C 100 ; WX 600 ; N d ; B 50 -28 596 625 ;
+C 101 ; WX 600 ; N e ; B 51 -28 535 449 ;
+C 102 ; WX 600 ; N f ; B 93 -12 556 625 ;
+C 103 ; WX 600 ; N g ; B 49 -200 574 449 ;
+C 104 ; WX 600 ; N h ; B 29 -12 565 625 ;
+C 105 ; WX 600 ; N i ; B 80 -12 523 645 ;
+C 106 ; WX 600 ; N j ; B 76 -200 414 645 ;
+C 107 ; WX 600 ; N k ; B 81 -12 584 625 ;
+C 108 ; WX 600 ; N l ; B 79 -12 522 625 ;
+C 109 ; WX 600 ; N m ; B -2 -12 605 450 ;
+C 110 ; WX 600 ; N n ; B 41 -12 555 449 ;
+C 111 ; WX 600 ; N o ; B 59 -28 541 449 ;
+C 112 ; WX 600 ; N p ; B 10 -200 554 449 ;
+C 113 ; WX 600 ; N q ; B 51 -200 595 449 ;
+C 114 ; WX 600 ; N r ; B 71 -12 556 445 ;
+C 115 ; WX 600 ; N s ; B 89 -28 511 449 ;
+C 116 ; WX 600 ; N t ; B 59 -28 541 583 ;
+C 117 ; WX 600 ; N u ; B 32 -28 556 435 ;
+C 118 ; WX 600 ; N v ; B 17 -12 583 435 ;
+C 119 ; WX 600 ; N w ; B 15 -13 584 435 ;
+C 120 ; WX 600 ; N x ; B 38 -12 564 435 ;
+C 121 ; WX 600 ; N y ; B 61 -200 586 435 ;
+C 122 ; WX 600 ; N z ; B 104 -12 503 435 ;
+C 123 ; WX 600 ; N braceleft ; B 190 -136 420 628 ;
+C 124 ; WX 600 ; N bar ; B 268 -139 333 625 ;
+C 125 ; WX 600 ; N braceright ; B 180 -139 410 625 ;
+C 126 ; WX 600 ; N asciitilde ; B 79 199 521 371 ;
+C 128 ; WX 600 ; N c128 ; B -48 104 622 167 ;
+C 129 ; WX 600 ; N c129 ; B 254 -220 318 684 ;
+C 130 ; WX 600 ; N c130 ; B 255 -220 622 167 ;
+C 131 ; WX 600 ; N c131 ; B -49 -220 318 167 ;
+C 132 ; WX 600 ; N c132 ; B 255 104 622 684 ;
+C 133 ; WX 600 ; N c133 ; B -49 104 318 684 ;
+C 134 ; WX 600 ; N c134 ; B 255 -220 622 684 ;
+C 135 ; WX 600 ; N c135 ; B -49 -220 318 684 ;
+C 136 ; WX 600 ; N c136 ; B -49 -220 622 167 ;
+C 137 ; WX 600 ; N c137 ; B -49 104 622 684 ;
+C 138 ; WX 600 ; N c138 ; B -49 -220 622 684 ;
+C 139 ; WX 600 ; N c139 ; B -48 232 649 684 ;
+C 140 ; WX 600 ; N c140 ; B -48 -220 649 232 ;
+C 141 ; WX 600 ; N c141 ; B -48 -220 649 684 ;
+C 142 ; WX 600 ; N c142 ; B -49 -220 300 684 ;
+C 143 ; WX 600 ; N c143 ; B 300 -220 649 684 ;
+C 144 ; WX 600 ; N c144 ; B 75 -220 601 682 ;
+C 145 ; WX 600 ; N c145 ; B 0 -220 601 682 ;
+C 146 ; WX 600 ; N c146 ; B 0 -220 601 682 ;
+C 147 ; WX 600 ; N c147 ; B 273 -220 457 777 ;
+C 148 ; WX 600 ; N c148 ; B 101 -12 506 583 ;
+C 149 ; WX 600 ; N c149 ; B 180 190 421 431 ;
+C 150 ; WX 600 ; N c150 ; B 41 -95 604 690 ;
+C 151 ; WX 600 ; N c151 ; B 79 121 521 454 ;
+C 152 ; WX 600 ; N c152 ; B 25 -12 542 618 ;
+C 153 ; WX 600 ; N c153 ; B 56 -12 573 618 ;
+C 154 ; WX 600 ; N c154 ; B 0 0 0 0 ;
+C 155 ; WX 600 ; N c155 ; B 157 -220 339 777 ;
+C 156 ; WX 600 ; N c156 ; B 153 445 448 740 ;
+C 157 ; WX 600 ; N c157 ; B 154 347 424 698 ;
+C 158 ; WX 600 ; N c158 ; B 225 245 375 377 ;
+C 159 ; WX 600 ; N c159 ; B 79 63 521 501 ;
+C 160 ; WX 600 ; N nbspace ; B -7 141 607 369 ;
+C 161 ; WX 600 ; N exclamdown ; B 186 -255 414 766 ;
+C 162 ; WX 600 ; N cent ; B 265 -255 607 369 ;
+C 163 ; WX 600 ; N sterling ; B 51 -28 535 645 ;
+C 164 ; WX 600 ; N currency ; B 186 -255 607 291 ;
+C 165 ; WX 600 ; N yen ; B 186 -255 607 369 ;
+C 166 ; WX 600 ; N brokenbar ; B -7 -255 336 369 ;
+C 167 ; WX 600 ; N section ; B -7 -255 414 291 ;
+C 168 ; WX 600 ; N dieresis ; B -7 -255 414 369 ;
+C 169 ; WX 600 ; N copyright ; B 265 141 607 766 ;
+C 170 ; WX 600 ; N ordfeminine ; B 186 219 607 766 ;
+C 171 ; WX 600 ; N guillemotleft ; B 186 141 607 766 ;
+C 172 ; WX 600 ; N logicalnot ; B -7 141 336 766 ;
+C 173 ; WX 600 ; N softhyphen ; B -7 219 414 766 ;
+C 174 ; WX 600 ; N registered ; B -7 141 414 766 ;
+C 175 ; WX 600 ; N macron ; B 265 -255 607 766 ;
+C 176 ; WX 600 ; N degree ; B 186 -255 607 766 ;
+C 177 ; WX 600 ; N plusminus ; B 186 -255 607 766 ;
+C 178 ; WX 600 ; N twosuperior ; B -7 -255 336 766 ;
+C 179 ; WX 600 ; N threesuperior ; B 31 -12 535 777 ;
+C 180 ; WX 600 ; N acute ; B -7 -255 414 766 ;
+C 181 ; WX 600 ; N mu ; B -7 -255 414 766 ;
+C 182 ; WX 600 ; N paragraph ; B -7 -255 607 369 ;
+C 183 ; WX 600 ; N periodcentered ; B -7 -255 607 291 ;
+C 184 ; WX 600 ; N cedilla ; B -7 -255 607 369 ;
+C 185 ; WX 600 ; N onesuperior ; B -7 141 607 766 ;
+C 186 ; WX 600 ; N ordmasculine ; B -7 219 607 766 ;
+C 187 ; WX 600 ; N guillemotright ; B -7 141 607 766 ;
+C 188 ; WX 600 ; N onequarter ; B -7 -255 607 766 ;
+C 189 ; WX 600 ; N onehalf ; B -7 -255 607 766 ;
+C 190 ; WX 600 ; N threequarters ; B -7 -255 607 766 ;
+C 191 ; WX 600 ; N questiondown ; B -12 -25 609 596 ;
+C 192 ; WX 600 ; N Agrave ; B 4 -26 591 448 ;
+C 193 ; WX 600 ; N Aacute ; B 58 -28 554 449 ;
+C 194 ; WX 600 ; N Acircumflex ; B 68 -28 530 703 ;
+C 195 ; WX 600 ; N Atilde ; B 41 -139 566 435 ;
+C 196 ; WX 600 ; N Adieresis ; B 28 -139 559 435 ;
+C 197 ; WX 600 ; N Aring ; B 51 -28 535 449 ;
+C 198 ; WX 600 ; N AE ; B 45 -201 563 630 ;
+C 199 ; WX 600 ; N Ccedilla ; B 60 -12 512 435 ;
+C 200 ; WX 600 ; N Egrave ; B 38 -12 564 435 ;
+C 201 ; WX 600 ; N Eacute ; B 41 -12 566 434 ;
+C 202 ; WX 600 ; N Ecircumflex ; B 41 -12 566 630 ;
+C 203 ; WX 600 ; N Edieresis ; B 81 -12 584 434 ;
+C 204 ; WX 600 ; N Igrave ; B 17 -12 585 435 ;
+C 205 ; WX 600 ; N Iacute ; B -1 -12 605 435 ;
+C 206 ; WX 600 ; N Icircumflex ; B 41 -12 566 434 ;
+C 207 ; WX 600 ; N Idieresis ; B 59 -28 541 449 ;
+C 208 ; WX 600 ; N Eth ; B 41 -12 566 435 ;
+C 209 ; WX 600 ; N Ntilde ; B 42 -12 551 435 ;
+C 210 ; WX 600 ; N Ograve ; B 10 -200 554 449 ;
+C 211 ; WX 600 ; N Oacute ; B 72 -28 549 449 ;
+C 212 ; WX 600 ; N Ocircumflex ; B 58 -12 541 435 ;
+C 213 ; WX 600 ; N Otilde ; B 61 -200 586 435 ;
+C 214 ; WX 600 ; N Odieresis ; B -8 -12 603 440 ;
+C 215 ; WX 600 ; N multiply ; B 73 -12 544 435 ;
+C 216 ; WX 600 ; N Oslash ; B 73 -12 544 435 ;
+C 217 ; WX 600 ; N Ugrave ; B 3 -12 599 435 ;
+C 218 ; WX 600 ; N Uacute ; B 89 -28 511 450 ;
+C 219 ; WX 600 ; N Ucircumflex ; B 28 -12 579 435 ;
+C 220 ; WX 600 ; N Udieresis ; B 63 -28 540 449 ;
+C 221 ; WX 600 ; N Yacute ; B 28 -139 578 435 ;
+C 222 ; WX 600 ; N Thorn ; B 32 -12 568 435 ;
+C 223 ; WX 600 ; N germandbls ; B 35 -12 574 435 ;
+C 224 ; WX 600 ; N agrave ; B 4 -27 593 598 ;
+C 225 ; WX 600 ; N aacute ; B -4 -12 605 583 ;
+C 226 ; WX 600 ; N acircumflex ; B 30 -12 556 583 ;
+C 227 ; WX 600 ; N atilde ; B 30 -203 557 583 ;
+C 228 ; WX 600 ; N adieresis ; B 28 -203 559 583 ;
+C 229 ; WX 600 ; N aring ; B 31 -12 535 583 ;
+C 230 ; WX 600 ; N ae ; B 4 -12 596 583 ;
+C 231 ; WX 600 ; N ccedilla ; B 50 -12 555 583 ;
+C 232 ; WX 600 ; N egrave ; B 27 -12 574 583 ;
+C 233 ; WX 600 ; N eacute ; B 19 -12 587 583 ;
+C 234 ; WX 600 ; N ecircumflex ; B 19 -12 587 720 ;
+C 235 ; WX 600 ; N edieresis ; B 31 -12 587 583 ;
+C 236 ; WX 600 ; N igrave ; B -3 -12 566 583 ;
+C 237 ; WX 600 ; N iacute ; B 0 -12 606 583 ;
+C 238 ; WX 600 ; N icircumflex ; B 40 -12 566 583 ;
+C 239 ; WX 600 ; N idieresis ; B 38 -28 562 596 ;
+C 240 ; WX 600 ; N eth ; B 40 -12 566 583 ;
+C 241 ; WX 600 ; N ntilde ; B 5 -12 580 583 ;
+C 242 ; WX 600 ; N ograve ; B 75 -12 556 583 ;
+C 243 ; WX 600 ; N oacute ; B 50 -28 549 596 ;
+C 244 ; WX 600 ; N ocircumflex ; B 58 -12 541 583 ;
+C 245 ; WX 600 ; N otilde ; B 32 -29 576 586 ;
+C 246 ; WX 600 ; N odieresis ; B -5 -12 601 585 ;
+C 247 ; WX 600 ; N divide ; B 30 -12 556 583 ;
+C 248 ; WX 600 ; N oslash ; B 75 -12 556 583 ;
+C 249 ; WX 600 ; N ugrave ; B 7 -12 589 583 ;
+C 250 ; WX 600 ; N uacute ; B 79 -16 528 585 ;
+C 251 ; WX 600 ; N ucircumflex ; B 2 -12 590 583 ;
+C 252 ; WX 600 ; N udieresis ; B 53 -28 552 596 ;
+C 253 ; WX 600 ; N yacute ; B 2 -203 592 583 ;
+C 254 ; WX 600 ; N thorn ; B 34 -12 570 582 ;
+C 255 ; WX 600 ; N ydieresis ; B 30 -12 576 583 ;
+C -1 ; WX 600 ; N minus ; B 79 241 521 324 ;
+EndCharMetrics
+EndFontMetrics
diff --git a/src/fonts/cyrillic/times8.afm b/src/fonts/cyrillic/times8.afm
new file mode 100644
index 0000000..76aea00
--- /dev/null
+++ b/src/fonts/cyrillic/times8.afm
@@ -0,0 +1,244 @@
+StartFontMetrics 3.0
+FontName TimesNRCyrMT
+FullName Times New Roman KOI 8
+FamilyName Times New Roman KOI-8
+Weight Regular
+ItalicAngle 0
+IsFixedPitch false
+FontBBox -73 -212 1086 887
+UnderlinePosition -205
+UnderlineThickness 102
+Version 1.0
+Notice Typeface <c> The Monotype Corporation plc. 1990-92. Changes <c> 1997 by Eugene V. Demidov
+EncodingScheme FontSpecific
+CapHeight 703
+XHeight 475
+Ascender 720
+Descender -212
+StartCharMetrics 224
+C 32 ; WX 250 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 271 ; N exclam ; B 83 -14 197 702 ;
+C 34 ; WX 406 ; N quotedbl ; B 64 417 341 702 ;
+C 35 ; WX 667 ; N numbersign ; B 43 0 623 695 ;
+C 36 ; WX 500 ; N dollar ; B 52 -70 456 729 ;
+C 37 ; WX 823 ; N percent ; B 21 -28 802 701 ;
+C 38 ; WX 771 ; N ampersand ; B 33 -15 754 702 ;
+C 39 ; WX 177 ; N quoteright ; B 40 417 138 702 ;
+C 40 ; WX 333 ; N parenleft ; B 45 -211 317 717 ;
+C 41 ; WX 333 ; N parenright ; B 16 -211 288 717 ;
+C 42 ; WX 500 ; N asterisk ; B 71 310 429 721 ;
+C 43 ; WX 667 ; N plus ; B 68 79 599 608 ;
+C 44 ; WX 271 ; N comma ; B 63 -167 207 100 ;
+C 45 ; WX 333 ; N hyphen ; B 43 193 291 272 ;
+C 46 ; WX 271 ; N period ; B 80 -14 190 97 ;
+C 47 ; WX 281 ; N slash ; B 0 -15 280 717 ;
+C 48 ; WX 500 ; N zero ; B 33 -12 467 698 ;
+C 49 ; WX 500 ; N one ; B 116 0 380 698 ;
+C 50 ; WX 500 ; N two ; B 28 0 474 698 ;
+C 51 ; WX 500 ; N three ; B 58 -11 434 698 ;
+C 52 ; WX 500 ; N four ; B 22 0 478 698 ;
+C 53 ; WX 500 ; N five ; B 62 -12 451 687 ;
+C 54 ; WX 500 ; N six ; B 47 -12 467 697 ;
+C 55 ; WX 500 ; N seven ; B 42 -12 461 686 ;
+C 56 ; WX 500 ; N eight ; B 58 -12 440 698 ;
+C 57 ; WX 500 ; N nine ; B 37 -12 455 698 ;
+C 58 ; WX 271 ; N colon ; B 81 -14 191 475 ;
+C 59 ; WX 271 ; N semicolon ; B 63 -167 207 475 ;
+C 60 ; WX 667 ; N less ; B 69 91 598 594 ;
+C 61 ; WX 667 ; N equal ; B 69 197 598 489 ;
+C 62 ; WX 667 ; N greater ; B 69 91 598 594 ;
+C 63 ; WX 385 ; N question ; B 22 -14 364 702 ;
+C 64 ; WX 917 ; N at ; B 48 -208 896 702 ;
+C 65 ; WX 771 ; N A ; B 13 0 756 717 ;
+C 66 ; WX 667 ; N B ; B 43 0 624 686 ;
+C 67 ; WX 719 ; N C ; B 41 -15 695 703 ;
+C 68 ; WX 823 ; N D ; B 32 0 783 686 ;
+C 69 ; WX 667 ; N E ; B 36 0 645 686 ;
+C 70 ; WX 667 ; N F ; B 43 0 633 686 ;
+C 71 ; WX 823 ; N G ; B 43 -15 813 702 ;
+C 72 ; WX 823 ; N H ; B 35 0 788 687 ;
+C 73 ; WX 385 ; N I ; B 35 0 351 687 ;
+C 74 ; WX 438 ; N J ; B 17 -15 412 687 ;
+C 75 ; WX 823 ; N K ; B 40 0 818 686 ;
+C 76 ; WX 667 ; N L ; B 42 0 649 687 ;
+C 77 ; WX 990 ; N M ; B 43 0 946 687 ;
+C 78 ; WX 823 ; N N ; B 12 -8 809 686 ;
+C 79 ; WX 771 ; N O ; B 37 -15 734 702 ;
+C 80 ; WX 604 ; N P ; B 24 0 585 687 ;
+C 81 ; WX 771 ; N Q ; B 39 -197 736 702 ;
+C 82 ; WX 771 ; N R ; B 34 0 741 687 ;
+C 83 ; WX 552 ; N S ; B 51 -15 501 702 ;
+C 84 ; WX 667 ; N T ; B 23 0 645 686 ;
+C 85 ; WX 823 ; N U ; B 32 -15 804 687 ;
+C 86 ; WX 719 ; N V ; B 13 -15 708 686 ;
+C 87 ; WX 990 ; N W ; B 9 -15 984 686 ;
+C 88 ; WX 771 ; N X ; B 14 0 758 686 ;
+C 89 ; WX 771 ; N Y ; B 11 0 757 686 ;
+C 90 ; WX 667 ; N Z ; B 22 0 647 687 ;
+C 91 ; WX 271 ; N bracketleft ; B 59 -199 257 704 ;
+C 92 ; WX 281 ; N backslash ; B 0 -15 280 717 ;
+C 93 ; WX 271 ; N bracketright ; B 14 -199 212 704 ;
+C 94 ; WX 583 ; N asciicircum ; B 73 336 511 687 ;
+C 95 ; WX 500 ; N underscore ; B -5 -125 506 -75 ;
+C 96 ; WX 333 ; N quoteleft ; B 85 549 248 717 ;
+C 97 ; WX 500 ; N a ; B 40 -14 483 474 ;
+C 98 ; WX 552 ; N b ; B 21 -14 517 717 ;
+C 99 ; WX 438 ; N c ; B 26 -14 427 474 ;
+C 100 ; WX 552 ; N d ; B 33 -14 534 717 ;
+C 101 ; WX 438 ; N e ; B 32 -14 414 475 ;
+C 102 ; WX 333 ; N f ; B 24 0 410 717 ;
+C 103 ; WX 500 ; N g ; B 32 -212 484 474 ;
+C 104 ; WX 552 ; N h ; B 20 0 536 717 ;
+C 105 ; WX 271 ; N i ; B 23 0 249 720 ;
+C 106 ; WX 271 ; N j ; B -73 -212 199 720 ;
+C 107 ; WX 552 ; N k ; B 26 0 535 717 ;
+C 108 ; WX 271 ; N l ; B 22 0 248 717 ;
+C 109 ; WX 823 ; N m ; B 8 0 811 475 ;
+C 110 ; WX 552 ; N n ; B 19 0 530 475 ;
+C 111 ; WX 552 ; N o ; B 45 -14 507 475 ;
+C 112 ; WX 552 ; N p ; B 17 -211 522 475 ;
+C 113 ; WX 552 ; N q ; B 37 -211 532 475 ;
+C 114 ; WX 385 ; N r ; B 27 0 373 475 ;
+C 115 ; WX 385 ; N s ; B 41 -14 344 475 ;
+C 116 ; WX 333 ; N t ; B 29 -14 321 611 ;
+C 117 ; WX 552 ; N u ; B 18 -13 539 464 ;
+C 118 ; WX 500 ; N v ; B 14 -14 488 464 ;
+C 119 ; WX 719 ; N w ; B 15 -14 709 464 ;
+C 120 ; WX 500 ; N x ; B 17 0 483 464 ;
+C 121 ; WX 500 ; N y ; B 17 -212 484 464 ;
+C 122 ; WX 437 ; N z ; B 15 0 419 464 ;
+C 123 ; WX 479 ; N braceleft ; B 138 -193 410 717 ;
+C 124 ; WX 198 ; N bar ; B 66 -212 131 717 ;
+C 125 ; WX 479 ; N braceright ; B 86 -193 359 717 ;
+C 126 ; WX 667 ; N asciitilde ; B 70 269 596 417 ;
+C 128 ; WX 250 ; N c128 ; B 0 0 0 0 ;
+C 129 ; WX 250 ; N c129 ; B 0 0 0 0 ;
+C 130 ; WX 250 ; N c130 ; B 0 0 0 0 ;
+C 131 ; WX 250 ; N c131 ; B 0 0 0 0 ;
+C 132 ; WX 250 ; N c132 ; B 0 0 0 0 ;
+C 133 ; WX 250 ; N c133 ; B 0 0 0 0 ;
+C 134 ; WX 250 ; N c134 ; B 0 0 0 0 ;
+C 135 ; WX 250 ; N c135 ; B 0 0 0 0 ;
+C 136 ; WX 250 ; N c136 ; B 0 0 0 0 ;
+C 137 ; WX 250 ; N c137 ; B 0 0 0 0 ;
+C 138 ; WX 250 ; N c138 ; B 0 0 0 0 ;
+C 139 ; WX 250 ; N c139 ; B 0 0 0 0 ;
+C 140 ; WX 250 ; N c140 ; B 0 0 0 0 ;
+C 141 ; WX 250 ; N c141 ; B 0 0 0 0 ;
+C 142 ; WX 250 ; N c142 ; B 0 0 0 0 ;
+C 143 ; WX 250 ; N c143 ; B 0 0 0 0 ;
+C 144 ; WX 250 ; N c144 ; B 0 0 0 0 ;
+C 145 ; WX 250 ; N c145 ; B 0 0 0 0 ;
+C 146 ; WX 250 ; N c146 ; B 0 0 0 0 ;
+C 147 ; WX 250 ; N c147 ; B 0 0 0 0 ;
+C 148 ; WX 250 ; N c148 ; B 0 0 0 0 ;
+C 149 ; WX 250 ; N c149 ; B 0 0 0 0 ;
+C 150 ; WX 250 ; N c150 ; B 0 0 0 0 ;
+C 151 ; WX 250 ; N c151 ; B 0 0 0 0 ;
+C 152 ; WX 250 ; N c152 ; B 0 0 0 0 ;
+C 153 ; WX 250 ; N c153 ; B 0 0 0 0 ;
+C 154 ; WX 250 ; N c154 ; B 0 0 0 0 ;
+C 155 ; WX 250 ; N c155 ; B 0 0 0 0 ;
+C 156 ; WX 250 ; N c156 ; B 0 0 0 0 ;
+C 157 ; WX 250 ; N c157 ; B 0 0 0 0 ;
+C 158 ; WX 250 ; N c158 ; B 0 0 0 0 ;
+C 159 ; WX 250 ; N c159 ; B 0 0 0 0 ;
+C 160 ; WX 250 ; N nbspace ; B 0 0 0 0 ;
+C 161 ; WX 250 ; N exclamdown ; B 0 0 0 0 ;
+C 162 ; WX 250 ; N cent ; B 0 0 0 0 ;
+C 163 ; WX 438 ; N sterling ; B 32 -14 414 689 ;
+C 164 ; WX 250 ; N currency ; B 0 0 0 0 ;
+C 165 ; WX 250 ; N yen ; B 0 0 0 0 ;
+C 166 ; WX 250 ; N brokenbar ; B 0 0 0 0 ;
+C 167 ; WX 250 ; N section ; B 0 0 0 0 ;
+C 168 ; WX 250 ; N dieresis ; B 0 0 0 0 ;
+C 169 ; WX 250 ; N copyright ; B 0 0 0 0 ;
+C 170 ; WX 250 ; N ordfeminine ; B 0 0 0 0 ;
+C 171 ; WX 250 ; N guillemotleft ; B 0 0 0 0 ;
+C 172 ; WX 250 ; N logicalnot ; B 0 0 0 0 ;
+C 173 ; WX 250 ; N softhyphen ; B 0 0 0 0 ;
+C 174 ; WX 250 ; N registered ; B 0 0 0 0 ;
+C 175 ; WX 250 ; N macron ; B 0 0 0 0 ;
+C 176 ; WX 250 ; N degree ; B 0 0 0 0 ;
+C 177 ; WX 250 ; N plusminus ; B 0 0 0 0 ;
+C 178 ; WX 250 ; N twosuperior ; B 0 0 0 0 ;
+C 179 ; WX 667 ; N threesuperior ; B 36 0 645 870 ;
+C 180 ; WX 250 ; N acute ; B 0 0 0 0 ;
+C 181 ; WX 250 ; N mu ; B 0 0 0 0 ;
+C 182 ; WX 250 ; N paragraph ; B 0 0 0 0 ;
+C 183 ; WX 250 ; N periodcentered ; B 0 0 0 0 ;
+C 184 ; WX 250 ; N cedilla ; B 0 0 0 0 ;
+C 185 ; WX 250 ; N onesuperior ; B 0 0 0 0 ;
+C 186 ; WX 250 ; N ordmasculine ; B 0 0 0 0 ;
+C 187 ; WX 250 ; N guillemotright ; B 0 0 0 0 ;
+C 188 ; WX 250 ; N onequarter ; B 0 0 0 0 ;
+C 189 ; WX 250 ; N onehalf ; B 0 0 0 0 ;
+C 190 ; WX 250 ; N threequarters ; B 0 0 0 0 ;
+C 191 ; WX 250 ; N questiondown ; B 0 0 0 0 ;
+C 192 ; WX 783 ; N Agrave ; B 26 -14 752 474 ;
+C 193 ; WX 500 ; N Aacute ; B 40 -14 483 474 ;
+C 194 ; WX 552 ; N Acircumflex ; B 49 -14 507 711 ;
+C 195 ; WX 567 ; N Atilde ; B 27 -124 539 464 ;
+C 196 ; WX 531 ; N Adieresis ; B 5 -124 506 464 ;
+C 197 ; WX 438 ; N Aring ; B 32 -14 414 475 ;
+C 198 ; WX 667 ; N AE ; B 36 -211 631 717 ;
+C 199 ; WX 443 ; N Ccedilla ; B 25 0 430 464 ;
+C 200 ; WX 500 ; N Egrave ; B 17 0 483 464 ;
+C 201 ; WX 565 ; N Eacute ; B 25 0 539 464 ;
+C 202 ; WX 565 ; N Ecircumflex ; B 25 0 539 680 ;
+C 203 ; WX 525 ; N Edieresis ; B 27 0 502 469 ;
+C 204 ; WX 530 ; N Igrave ; B 4 -14 503 464 ;
+C 205 ; WX 666 ; N Iacute ; B 25 0 640 464 ;
+C 206 ; WX 565 ; N Icircumflex ; B 25 0 539 464 ;
+C 207 ; WX 552 ; N Idieresis ; B 45 -14 507 475 ;
+C 208 ; WX 565 ; N Eth ; B 25 0 539 464 ;
+C 209 ; WX 487 ; N Ntilde ; B 13 0 462 464 ;
+C 210 ; WX 552 ; N Ograve ; B 17 -211 522 475 ;
+C 211 ; WX 438 ; N Oacute ; B 26 -14 427 474 ;
+C 212 ; WX 476 ; N Ocircumflex ; B 16 0 460 464 ;
+C 213 ; WX 500 ; N Otilde ; B 17 -212 484 464 ;
+C 214 ; WX 716 ; N Odieresis ; B 21 0 696 468 ;
+C 215 ; WX 500 ; N multiply ; B 29 0 461 464 ;
+C 216 ; WX 491 ; N Oslash ; B 27 0 454 464 ;
+C 217 ; WX 719 ; N Ugrave ; B 25 0 693 464 ;
+C 218 ; WX 417 ; N Uacute ; B 16 -14 385 475 ;
+C 219 ; WX 810 ; N Ucircumflex ; B 25 0 784 464 ;
+C 220 ; WX 445 ; N Udieresis ; B 21 -14 413 475 ;
+C 221 ; WX 810 ; N Yacute ; B 25 -124 784 464 ;
+C 222 ; WX 531 ; N Thorn ; B 19 0 506 464 ;
+C 223 ; WX 556 ; N germandbls ; B 21 0 526 464 ;
+C 224 ; WX 1104 ; N agrave ; B 38 -15 1068 702 ;
+C 225 ; WX 771 ; N aacute ; B 13 0 756 717 ;
+C 226 ; WX 646 ; N acircumflex ; B 39 0 608 686 ;
+C 227 ; WX 823 ; N atilde ; B 37 -192 782 686 ;
+C 228 ; WX 747 ; N adieresis ; B 13 -192 714 686 ;
+C 229 ; WX 667 ; N aring ; B 36 0 645 686 ;
+C 230 ; WX 869 ; N ae ; B 39 0 831 686 ;
+C 231 ; WX 626 ; N ccedilla ; B 42 0 607 686 ;
+C 232 ; WX 771 ; N egrave ; B 14 0 758 686 ;
+C 233 ; WX 824 ; N eacute ; B 35 0 789 686 ;
+C 234 ; WX 824 ; N ecircumflex ; B 35 0 789 887 ;
+C 235 ; WX 750 ; N edieresis ; B 35 0 742 693 ;
+C 236 ; WX 750 ; N igrave ; B 21 -7 714 686 ;
+C 237 ; WX 990 ; N iacute ; B 43 0 946 687 ;
+C 238 ; WX 823 ; N icircumflex ; B 35 0 788 687 ;
+C 239 ; WX 771 ; N idieresis ; B 37 -15 734 702 ;
+C 240 ; WX 818 ; N eth ; B 35 0 783 686 ;
+C 241 ; WX 749 ; N ntilde ; B 7 0 714 687 ;
+C 242 ; WX 604 ; N ograve ; B 24 0 585 687 ;
+C 243 ; WX 719 ; N oacute ; B 41 -15 695 703 ;
+C 244 ; WX 667 ; N ocircumflex ; B 23 0 645 686 ;
+C 245 ; WX 731 ; N otilde ; B 3 -15 728 686 ;
+C 246 ; WX 997 ; N odieresis ; B 22 0 975 693 ;
+C 247 ; WX 667 ; N divide ; B 43 0 624 686 ;
+C 248 ; WX 646 ; N oslash ; B 35 0 604 686 ;
+C 249 ; WX 981 ; N ugrave ; B 38 0 948 686 ;
+C 250 ; WX 532 ; N uacute ; B 32 -15 488 702 ;
+C 251 ; WX 1122 ; N ucircumflex ; B 36 0 1086 686 ;
+C 252 ; WX 698 ; N udieresis ; B 22 -15 662 702 ;
+C 253 ; WX 1122 ; N yacute ; B 36 -192 1086 686 ;
+C 254 ; WX 747 ; N thorn ; B 18 0 712 687 ;
+C 255 ; WX 757 ; N ydieresis ; B 19 0 718 686 ;
+C -1 ; WX 333 ; N minus ; B 43 193 291 272 ;
+EndCharMetrics
+EndFontMetrics
diff --git a/src/fonts/cyrillic/timesbd8.afm b/src/fonts/cyrillic/timesbd8.afm
new file mode 100644
index 0000000..be84075
--- /dev/null
+++ b/src/fonts/cyrillic/timesbd8.afm
@@ -0,0 +1,244 @@
+StartFontMetrics 3.0
+FontName TimesNRCyrMT-Bold
+FullName Times New Roman KOI 8 Bold
+FamilyName Times New Roman KOI-8
+Weight Bold
+ItalicAngle 0
+IsFixedPitch false
+FontBBox -20 -224 1115 878
+UnderlinePosition -205
+UnderlineThickness 102
+Version 1.0
+Notice Typeface <c> The Monotype Corporation plc. 1990-92. Changes <c> 1997 by Eugene V. Demidov
+EncodingScheme FontSpecific
+CapHeight 702
+XHeight 475
+Ascender 702
+Descender -212
+StartCharMetrics 224
+C 32 ; WX 250 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 271 ; N exclam ; B 54 -14 217 702 ;
+C 34 ; WX 552 ; N quotedbl ; B 86 376 466 702 ;
+C 35 ; WX 667 ; N numbersign ; B 38 0 628 704 ;
+C 36 ; WX 500 ; N dollar ; B 24 -68 475 698 ;
+C 37 ; WX 875 ; N percent ; B 48 -27 828 703 ;
+C 38 ; WX 771 ; N ampersand ; B 29 -14 716 702 ;
+C 39 ; WX 281 ; N quoteright ; B 69 377 213 702 ;
+C 40 ; WX 333 ; N parenleft ; B 33 -196 317 704 ;
+C 41 ; WX 333 ; N parenright ; B 16 -196 300 704 ;
+C 42 ; WX 500 ; N asterisk ; B 56 325 445 702 ;
+C 43 ; WX 667 ; N plus ; B 62 72 605 615 ;
+C 44 ; WX 271 ; N comma ; B 45 -179 229 149 ;
+C 45 ; WX 333 ; N hyphen ; B 24 180 310 283 ;
+C 46 ; WX 271 ; N period ; B 55 -14 215 148 ;
+C 47 ; WX 281 ; N slash ; B 0 -14 281 702 ;
+C 48 ; WX 500 ; N zero ; B 23 -12 477 698 ;
+C 49 ; WX 500 ; N one ; B 61 0 425 698 ;
+C 50 ; WX 500 ; N two ; B 20 0 477 698 ;
+C 51 ; WX 500 ; N three ; B 21 -12 475 698 ;
+C 52 ; WX 500 ; N four ; B 15 0 480 698 ;
+C 53 ; WX 500 ; N five ; B 23 -12 475 687 ;
+C 54 ; WX 500 ; N six ; B 26 -12 481 698 ;
+C 55 ; WX 500 ; N seven ; B 14 -12 482 686 ;
+C 56 ; WX 500 ; N eight ; B 23 -12 477 698 ;
+C 57 ; WX 500 ; N nine ; B 19 -12 475 698 ;
+C 58 ; WX 271 ; N colon ; B 55 -14 215 475 ;
+C 59 ; WX 271 ; N semicolon ; B 45 -179 229 475 ;
+C 60 ; WX 667 ; N less ; B 62 71 604 616 ;
+C 61 ; WX 667 ; N equal ; B 62 176 605 510 ;
+C 62 ; WX 667 ; N greater ; B 62 71 604 616 ;
+C 63 ; WX 385 ; N question ; B 14 -14 368 702 ;
+C 64 ; WX 958 ; N at ; B 45 -224 940 702 ;
+C 65 ; WX 719 ; N A ; B 14 0 704 698 ;
+C 66 ; WX 667 ; N B ; B 12 0 640 686 ;
+C 67 ; WX 719 ; N C ; B 46 -14 679 702 ;
+C 68 ; WX 771 ; N D ; B 18 0 736 687 ;
+C 69 ; WX 667 ; N E ; B 18 0 646 687 ;
+C 70 ; WX 604 ; N F ; B 12 0 582 686 ;
+C 71 ; WX 771 ; N G ; B 43 -14 757 702 ;
+C 72 ; WX 823 ; N H ; B 17 0 806 686 ;
+C 73 ; WX 385 ; N I ; B 17 0 369 686 ;
+C 74 ; WX 552 ; N J ; B 22 -14 536 686 ;
+C 75 ; WX 719 ; N K ; B 14 0 706 686 ;
+C 76 ; WX 667 ; N L ; B 16 0 644 686 ;
+C 77 ; WX 990 ; N M ; B 14 0 976 686 ;
+C 78 ; WX 771 ; N N ; B 15 -10 757 686 ;
+C 79 ; WX 823 ; N O ; B 41 -14 781 702 ;
+C 80 ; WX 667 ; N P ; B 18 0 643 686 ;
+C 81 ; WX 823 ; N Q ; B 41 -189 781 702 ;
+C 82 ; WX 719 ; N R ; B 19 0 701 686 ;
+C 83 ; WX 604 ; N S ; B 34 -14 570 702 ;
+C 84 ; WX 667 ; N T ; B 24 0 643 686 ;
+C 85 ; WX 771 ; N U ; B 14 -13 757 687 ;
+C 86 ; WX 719 ; N V ; B 17 -16 703 686 ;
+C 87 ; WX 990 ; N W ; B 12 -15 980 686 ;
+C 88 ; WX 719 ; N X ; B 17 0 702 686 ;
+C 89 ; WX 719 ; N Y ; B 14 0 705 686 ;
+C 90 ; WX 719 ; N Z ; B 32 0 687 686 ;
+C 91 ; WX 271 ; N bracketleft ; B 63 -179 256 687 ;
+C 92 ; WX 281 ; N backslash ; B 0 -14 281 702 ;
+C 93 ; WX 271 ; N bracketright ; B 15 -179 208 687 ;
+C 94 ; WX 510 ; N asciicircum ; B 38 337 471 687 ;
+C 95 ; WX 500 ; N underscore ; B -6 -125 506 -75 ;
+C 96 ; WX 333 ; N quoteleft ; B 51 533 255 704 ;
+C 97 ; WX 500 ; N a ; B 40 -14 486 475 ;
+C 98 ; WX 500 ; N b ; B 14 -14 481 687 ;
+C 99 ; WX 437 ; N c ; B 24 -14 425 475 ;
+C 100 ; WX 500 ; N d ; B 23 -14 486 687 ;
+C 101 ; WX 437 ; N e ; B 23 -14 418 475 ;
+C 102 ; WX 333 ; N f ; B 20 0 392 698 ;
+C 103 ; WX 500 ; N g ; B 31 -212 478 475 ;
+C 104 ; WX 500 ; N h ; B 17 0 489 687 ;
+C 105 ; WX 271 ; N i ; B 13 0 257 702 ;
+C 106 ; WX 271 ; N j ; B -20 -212 214 702 ;
+C 107 ; WX 552 ; N k ; B 14 0 538 687 ;
+C 108 ; WX 271 ; N l ; B 13 0 260 687 ;
+C 109 ; WX 771 ; N m ; B 13 0 757 475 ;
+C 110 ; WX 500 ; N n ; B 20 0 486 475 ;
+C 111 ; WX 500 ; N o ; B 28 -14 471 475 ;
+C 112 ; WX 500 ; N p ; B 14 -211 476 475 ;
+C 113 ; WX 505 ; N q ; B 24 -211 489 475 ;
+C 114 ; WX 385 ; N r ; B 11 0 364 475 ;
+C 115 ; WX 385 ; N s ; B 21 -14 370 475 ;
+C 116 ; WX 333 ; N t ; B 17 -14 316 631 ;
+C 117 ; WX 500 ; N u ; B 14 -14 483 464 ;
+C 118 ; WX 437 ; N v ; B 10 -13 428 464 ;
+C 119 ; WX 667 ; N w ; B 20 -12 647 464 ;
+C 120 ; WX 552 ; N x ; B 20 0 533 464 ;
+C 121 ; WX 500 ; N y ; B 17 -212 483 464 ;
+C 122 ; WX 437 ; N z ; B 13 0 422 464 ;
+C 123 ; WX 396 ; N braceleft ; B 81 -175 352 704 ;
+C 124 ; WX 219 ; N bar ; B 57 -212 163 702 ;
+C 125 ; WX 396 ; N braceright ; B 44 -176 315 704 ;
+C 126 ; WX 667 ; N asciitilde ; B 63 255 604 431 ;
+C 128 ; WX 250 ; N c128 ; B 0 0 0 0 ;
+C 129 ; WX 250 ; N c129 ; B 0 0 0 0 ;
+C 130 ; WX 250 ; N c130 ; B 0 0 0 0 ;
+C 131 ; WX 250 ; N c131 ; B 0 0 0 0 ;
+C 132 ; WX 250 ; N c132 ; B 0 0 0 0 ;
+C 133 ; WX 250 ; N c133 ; B 0 0 0 0 ;
+C 134 ; WX 250 ; N c134 ; B 0 0 0 0 ;
+C 135 ; WX 250 ; N c135 ; B 0 0 0 0 ;
+C 136 ; WX 250 ; N c136 ; B 0 0 0 0 ;
+C 137 ; WX 250 ; N c137 ; B 0 0 0 0 ;
+C 138 ; WX 250 ; N c138 ; B 0 0 0 0 ;
+C 139 ; WX 250 ; N c139 ; B 0 0 0 0 ;
+C 140 ; WX 250 ; N c140 ; B 0 0 0 0 ;
+C 141 ; WX 250 ; N c141 ; B 0 0 0 0 ;
+C 142 ; WX 250 ; N c142 ; B 0 0 0 0 ;
+C 143 ; WX 250 ; N c143 ; B 0 0 0 0 ;
+C 144 ; WX 250 ; N c144 ; B 0 0 0 0 ;
+C 145 ; WX 250 ; N c145 ; B 0 0 0 0 ;
+C 146 ; WX 250 ; N c146 ; B 0 0 0 0 ;
+C 147 ; WX 250 ; N c147 ; B 0 0 0 0 ;
+C 148 ; WX 250 ; N c148 ; B 0 0 0 0 ;
+C 149 ; WX 250 ; N c149 ; B 0 0 0 0 ;
+C 150 ; WX 250 ; N c150 ; B 0 0 0 0 ;
+C 151 ; WX 250 ; N c151 ; B 0 0 0 0 ;
+C 152 ; WX 250 ; N c152 ; B 0 0 0 0 ;
+C 153 ; WX 250 ; N c153 ; B 0 0 0 0 ;
+C 154 ; WX 250 ; N c154 ; B 0 0 0 0 ;
+C 155 ; WX 250 ; N c155 ; B 0 0 0 0 ;
+C 156 ; WX 250 ; N c156 ; B 0 0 0 0 ;
+C 157 ; WX 250 ; N c157 ; B 0 0 0 0 ;
+C 158 ; WX 250 ; N c158 ; B 0 0 0 0 ;
+C 159 ; WX 250 ; N c159 ; B 0 0 0 0 ;
+C 160 ; WX 250 ; N nbspace ; B 0 0 0 0 ;
+C 161 ; WX 250 ; N exclamdown ; B 0 0 0 0 ;
+C 162 ; WX 250 ; N cent ; B 0 0 0 0 ;
+C 163 ; WX 437 ; N sterling ; B 23 -14 418 676 ;
+C 164 ; WX 250 ; N currency ; B 0 0 0 0 ;
+C 165 ; WX 250 ; N yen ; B 0 0 0 0 ;
+C 166 ; WX 250 ; N brokenbar ; B 0 0 0 0 ;
+C 167 ; WX 250 ; N section ; B 0 0 0 0 ;
+C 168 ; WX 250 ; N dieresis ; B 0 0 0 0 ;
+C 169 ; WX 250 ; N copyright ; B 0 0 0 0 ;
+C 170 ; WX 250 ; N ordfeminine ; B 0 0 0 0 ;
+C 171 ; WX 250 ; N guillemotleft ; B 0 0 0 0 ;
+C 172 ; WX 250 ; N logicalnot ; B 0 0 0 0 ;
+C 173 ; WX 250 ; N softhyphen ; B 0 0 0 0 ;
+C 174 ; WX 250 ; N registered ; B 0 0 0 0 ;
+C 175 ; WX 250 ; N macron ; B 0 0 0 0 ;
+C 176 ; WX 250 ; N degree ; B 0 0 0 0 ;
+C 177 ; WX 250 ; N plusminus ; B 0 0 0 0 ;
+C 178 ; WX 250 ; N twosuperior ; B 0 0 0 0 ;
+C 179 ; WX 667 ; N threesuperior ; B 18 0 646 878 ;
+C 180 ; WX 250 ; N acute ; B 0 0 0 0 ;
+C 181 ; WX 250 ; N mu ; B 0 0 0 0 ;
+C 182 ; WX 250 ; N paragraph ; B 0 0 0 0 ;
+C 183 ; WX 250 ; N periodcentered ; B 0 0 0 0 ;
+C 184 ; WX 250 ; N cedilla ; B 0 0 0 0 ;
+C 185 ; WX 250 ; N onesuperior ; B 0 0 0 0 ;
+C 186 ; WX 250 ; N ordmasculine ; B 0 0 0 0 ;
+C 187 ; WX 250 ; N guillemotright ; B 0 0 0 0 ;
+C 188 ; WX 250 ; N onequarter ; B 0 0 0 0 ;
+C 189 ; WX 250 ; N onehalf ; B 0 0 0 0 ;
+C 190 ; WX 250 ; N threequarters ; B 0 0 0 0 ;
+C 191 ; WX 250 ; N questiondown ; B 0 0 0 0 ;
+C 192 ; WX 771 ; N Agrave ; B 21 -14 743 474 ;
+C 193 ; WX 500 ; N Aacute ; B 40 -14 486 475 ;
+C 194 ; WX 500 ; N Acircumflex ; B 27 -14 474 702 ;
+C 195 ; WX 552 ; N Atilde ; B 33 -122 530 464 ;
+C 196 ; WX 515 ; N Adieresis ; B 0 -122 494 464 ;
+C 197 ; WX 437 ; N Aring ; B 23 -14 418 475 ;
+C 198 ; WX 667 ; N AE ; B 29 -211 638 687 ;
+C 199 ; WX 423 ; N Ccedilla ; B 34 0 416 464 ;
+C 200 ; WX 552 ; N Egrave ; B 20 0 533 464 ;
+C 201 ; WX 545 ; N Eacute ; B 33 0 512 464 ;
+C 202 ; WX 545 ; N Ecircumflex ; B 33 0 512 677 ;
+C 203 ; WX 560 ; N Edieresis ; B 25 0 543 468 ;
+C 204 ; WX 542 ; N Igrave ; B 4 -4 521 464 ;
+C 205 ; WX 647 ; N Iacute ; B 21 0 625 464 ;
+C 206 ; WX 543 ; N Icircumflex ; B 33 0 511 464 ;
+C 207 ; WX 500 ; N Idieresis ; B 28 -14 471 475 ;
+C 208 ; WX 549 ; N Eth ; B 36 0 514 464 ;
+C 209 ; WX 499 ; N Ntilde ; B 16 0 482 464 ;
+C 210 ; WX 500 ; N Ograve ; B 14 -211 476 475 ;
+C 211 ; WX 437 ; N Oacute ; B 24 -14 425 475 ;
+C 212 ; WX 490 ; N Ocircumflex ; B 22 0 468 464 ;
+C 213 ; WX 500 ; N Otilde ; B 17 -212 483 464 ;
+C 214 ; WX 719 ; N Odieresis ; B 19 0 701 468 ;
+C 215 ; WX 507 ; N multiply ; B 27 0 475 464 ;
+C 216 ; WX 501 ; N Oslash ; B 26 0 475 464 ;
+C 217 ; WX 734 ; N Ugrave ; B 26 0 713 464 ;
+C 218 ; WX 417 ; N Uacute ; B 11 -14 388 475 ;
+C 219 ; WX 814 ; N Ucircumflex ; B 33 0 781 464 ;
+C 220 ; WX 437 ; N Udieresis ; B 20 -14 409 475 ;
+C 221 ; WX 816 ; N Yacute ; B 32 -122 796 464 ;
+C 222 ; WX 515 ; N Thorn ; B 14 0 482 464 ;
+C 223 ; WX 552 ; N germandbls ; B 17 0 526 464 ;
+C 224 ; WX 1152 ; N agrave ; B 17 -14 1115 702 ;
+C 225 ; WX 719 ; N aacute ; B 14 0 704 698 ;
+C 226 ; WX 668 ; N acircumflex ; B 19 0 640 687 ;
+C 227 ; WX 833 ; N atilde ; B 29 -192 804 687 ;
+C 228 ; WX 719 ; N adieresis ; B 1 -192 701 687 ;
+C 229 ; WX 667 ; N aring ; B 18 0 646 687 ;
+C 230 ; WX 878 ; N ae ; B 39 0 840 686 ;
+C 231 ; WX 646 ; N ccedilla ; B 18 0 636 687 ;
+C 232 ; WX 719 ; N egrave ; B 17 0 702 686 ;
+C 233 ; WX 833 ; N eacute ; B 18 0 815 686 ;
+C 234 ; WX 833 ; N ecircumflex ; B 18 0 815 877 ;
+C 235 ; WX 756 ; N edieresis ; B 18 0 740 695 ;
+C 236 ; WX 720 ; N igrave ; B -1 -8 703 687 ;
+C 237 ; WX 990 ; N iacute ; B 14 0 976 686 ;
+C 238 ; WX 823 ; N icircumflex ; B 17 0 806 686 ;
+C 239 ; WX 823 ; N idieresis ; B 41 -14 781 702 ;
+C 240 ; WX 833 ; N eth ; B 19 0 814 687 ;
+C 241 ; WX 719 ; N ntilde ; B 20 0 702 686 ;
+C 242 ; WX 667 ; N ograve ; B 18 0 643 686 ;
+C 243 ; WX 719 ; N oacute ; B 46 -14 679 702 ;
+C 244 ; WX 667 ; N ocircumflex ; B 24 0 643 686 ;
+C 245 ; WX 760 ; N otilde ; B 12 -14 747 686 ;
+C 246 ; WX 980 ; N odieresis ; B 15 0 965 694 ;
+C 247 ; WX 667 ; N divide ; B 12 0 640 686 ;
+C 248 ; WX 667 ; N oslash ; B 17 0 641 686 ;
+C 249 ; WX 1000 ; N ugrave ; B 19 0 982 686 ;
+C 250 ; WX 546 ; N uacute ; B 24 -14 511 702 ;
+C 251 ; WX 1096 ; N ucircumflex ; B 18 0 1079 687 ;
+C 252 ; WX 698 ; N udieresis ; B 30 -14 661 702 ;
+C 253 ; WX 1096 ; N yacute ; B 18 -192 1079 687 ;
+C 254 ; WX 771 ; N thorn ; B 12 0 756 687 ;
+C 255 ; WX 771 ; N ydieresis ; B 17 0 738 687 ;
+C -1 ; WX 333 ; N minus ; B 24 180 310 283 ;
+EndCharMetrics
+EndFontMetrics
diff --git a/src/fonts/cyrillic/timesbi8.afm b/src/fonts/cyrillic/timesbi8.afm
new file mode 100644
index 0000000..8da7d4b
--- /dev/null
+++ b/src/fonts/cyrillic/timesbi8.afm
@@ -0,0 +1,244 @@
+StartFontMetrics 3.0
+FontName TimesNRCyrMT-BoldInclined
+FullName Times New Roman KOI 8 Bold Italic
+FamilyName Times New Roman KOI-8
+Weight BoldItalic
+ItalicAngle -1
+IsFixedPitch false
+FontBBox -164 -215 1236 877
+UnderlinePosition -205
+UnderlineThickness 102
+Version 1.0
+Notice Typeface <c> The Monotype Corporation plc. 1990-92. Changes <c> 1997 by Eugene V. Demidov
+EncodingScheme FontSpecific
+CapHeight 702
+XHeight 458
+Ascender 705
+Descender -212
+StartCharMetrics 224
+C 32 ; WX 250 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 271 ; N exclam ; B 12 -12 315 705 ;
+C 34 ; WX 552 ; N quotedbl ; B 182 376 577 702 ;
+C 35 ; WX 667 ; N numbersign ; B 75 0 666 704 ;
+C 36 ; WX 500 ; N dollar ; B 24 -76 500 740 ;
+C 37 ; WX 875 ; N percent ; B 64 -28 878 702 ;
+C 38 ; WX 719 ; N ampersand ; B 17 -15 679 702 ;
+C 39 ; WX 281 ; N quoteright ; B 173 377 332 702 ;
+C 40 ; WX 500 ; N parenleft ; B 137 -187 524 692 ;
+C 41 ; WX 500 ; N parenright ; B -7 -187 380 692 ;
+C 42 ; WX 500 ; N asterisk ; B 142 325 532 705 ;
+C 43 ; WX 667 ; N plus ; B 97 72 640 615 ;
+C 44 ; WX 271 ; N comma ; B -43 -187 162 121 ;
+C 45 ; WX 333 ; N hyphen ; B 26 180 312 283 ;
+C 46 ; WX 271 ; N period ; B 11 -12 172 148 ;
+C 47 ; WX 281 ; N slash ; B -69 -15 419 705 ;
+C 48 ; WX 500 ; N zero ; B 52 -12 516 698 ;
+C 49 ; WX 500 ; N one ; B 37 0 463 698 ;
+C 50 ; WX 500 ; N two ; B 33 0 482 702 ;
+C 51 ; WX 500 ; N three ; B 35 -12 484 702 ;
+C 52 ; WX 500 ; N four ; B 36 -15 518 698 ;
+C 53 ; WX 500 ; N five ; B 37 -12 510 687 ;
+C 54 ; WX 500 ; N six ; B 40 -12 549 698 ;
+C 55 ; WX 500 ; N seven ; B 99 -15 555 687 ;
+C 56 ; WX 500 ; N eight ; B 37 -12 513 702 ;
+C 57 ; WX 500 ; N nine ; B 26 -16 512 698 ;
+C 58 ; WX 333 ; N colon ; B 42 -12 291 457 ;
+C 59 ; WX 333 ; N semicolon ; B -4 -187 299 457 ;
+C 60 ; WX 667 ; N less ; B 75 71 617 616 ;
+C 61 ; WX 667 ; N equal ; B 97 176 640 510 ;
+C 62 ; WX 667 ; N greater ; B 119 71 661 616 ;
+C 63 ; WX 385 ; N question ; B 68 -12 448 705 ;
+C 64 ; WX 958 ; N at ; B 44 -215 934 705 ;
+C 65 ; WX 719 ; N A ; B -10 0 616 702 ;
+C 66 ; WX 667 ; N B ; B -5 0 666 686 ;
+C 67 ; WX 719 ; N C ; B 67 -15 785 702 ;
+C 68 ; WX 771 ; N D ; B -6 0 738 686 ;
+C 69 ; WX 667 ; N E ; B 7 0 697 687 ;
+C 70 ; WX 604 ; N F ; B 4 0 661 686 ;
+C 71 ; WX 719 ; N G ; B 39 -15 752 702 ;
+C 72 ; WX 823 ; N H ; B 4 0 893 686 ;
+C 73 ; WX 385 ; N I ; B -2 0 461 686 ;
+C 74 ; WX 500 ; N J ; B 2 -15 563 686 ;
+C 75 ; WX 719 ; N K ; B -6 0 786 686 ;
+C 76 ; WX 667 ; N L ; B -5 0 616 686 ;
+C 77 ; WX 990 ; N M ; B -7 0 1056 686 ;
+C 78 ; WX 771 ; N N ; B -5 -6 849 687 ;
+C 79 ; WX 771 ; N O ; B 70 -15 768 702 ;
+C 80 ; WX 667 ; N P ; B 4 0 674 686 ;
+C 81 ; WX 771 ; N Q ; B 71 -209 770 702 ;
+C 82 ; WX 719 ; N R ; B -1 0 679 686 ;
+C 83 ; WX 604 ; N S ; B 0 -15 632 702 ;
+C 84 ; WX 667 ; N T ; B 90 0 754 686 ;
+C 85 ; WX 771 ; N U ; B 115 -15 844 686 ;
+C 86 ; WX 719 ; N V ; B 166 -15 787 687 ;
+C 87 ; WX 990 ; N W ; B 139 -15 1071 687 ;
+C 88 ; WX 719 ; N X ; B -13 0 780 687 ;
+C 89 ; WX 719 ; N Y ; B 124 0 781 686 ;
+C 90 ; WX 719 ; N Z ; B 7 0 770 686 ;
+C 91 ; WX 500 ; N bracketleft ; B 52 -180 543 686 ;
+C 92 ; WX 281 ; N backslash ; B 107 -15 243 705 ;
+C 93 ; WX 500 ; N bracketright ; B -26 -181 465 686 ;
+C 94 ; WX 510 ; N asciicircum ; B 81 337 515 687 ;
+C 95 ; WX 500 ; N underscore ; B -26 -125 486 -75 ;
+C 96 ; WX 333 ; N quoteleft ; B 130 521 330 693 ;
+C 97 ; WX 500 ; N a ; B 20 -12 484 458 ;
+C 98 ; WX 500 ; N b ; B 21 -12 475 702 ;
+C 99 ; WX 437 ; N c ; B 27 -12 419 458 ;
+C 100 ; WX 500 ; N d ; B 19 -12 560 702 ;
+C 101 ; WX 437 ; N e ; B 23 -12 416 458 ;
+C 102 ; WX 333 ; N f ; B -159 -212 509 705 ;
+C 103 ; WX 500 ; N g ; B -43 -212 503 453 ;
+C 104 ; WX 500 ; N h ; B -12 -5 459 702 ;
+C 105 ; WX 271 ; N i ; B 18 -12 304 705 ;
+C 106 ; WX 271 ; N j ; B -164 -209 291 705 ;
+C 107 ; WX 552 ; N k ; B 7 -6 534 702 ;
+C 108 ; WX 271 ; N l ; B 13 -12 328 702 ;
+C 109 ; WX 771 ; N m ; B -3 -6 745 458 ;
+C 110 ; WX 500 ; N n ; B -4 -6 467 458 ;
+C 111 ; WX 500 ; N o ; B 26 -12 474 457 ;
+C 112 ; WX 500 ; N p ; B -117 -211 462 458 ;
+C 113 ; WX 500 ; N q ; B 19 -211 485 458 ;
+C 114 ; WX 385 ; N r ; B 17 0 383 458 ;
+C 115 ; WX 385 ; N s ; B 2 -6 357 458 ;
+C 116 ; WX 333 ; N t ; B 28 -12 323 572 ;
+C 117 ; WX 500 ; N u ; B 17 -12 488 458 ;
+C 118 ; WX 438 ; N v ; B 46 -11 405 458 ;
+C 119 ; WX 667 ; N w ; B 49 -12 631 458 ;
+C 120 ; WX 552 ; N x ; B 2 -12 514 458 ;
+C 121 ; WX 500 ; N y ; B -66 -212 472 458 ;
+C 122 ; WX 437 ; N z ; B -2 -89 421 446 ;
+C 123 ; WX 396 ; N braceleft ; B 64 -187 335 692 ;
+C 124 ; WX 219 ; N bar ; B 58 -211 164 705 ;
+C 125 ; WX 396 ; N braceright ; B 64 -187 335 692 ;
+C 126 ; WX 667 ; N asciitilde ; B 98 255 639 431 ;
+C 128 ; WX 250 ; N c128 ; B 0 0 0 0 ;
+C 129 ; WX 250 ; N c129 ; B 0 0 0 0 ;
+C 130 ; WX 250 ; N c130 ; B 0 0 0 0 ;
+C 131 ; WX 250 ; N c131 ; B 0 0 0 0 ;
+C 132 ; WX 250 ; N c132 ; B 0 0 0 0 ;
+C 133 ; WX 250 ; N c133 ; B 0 0 0 0 ;
+C 134 ; WX 250 ; N c134 ; B 0 0 0 0 ;
+C 135 ; WX 250 ; N c135 ; B 0 0 0 0 ;
+C 136 ; WX 250 ; N c136 ; B 0 0 0 0 ;
+C 137 ; WX 250 ; N c137 ; B 0 0 0 0 ;
+C 138 ; WX 250 ; N c138 ; B 0 0 0 0 ;
+C 139 ; WX 250 ; N c139 ; B 0 0 0 0 ;
+C 140 ; WX 250 ; N c140 ; B 0 0 0 0 ;
+C 141 ; WX 250 ; N c141 ; B 0 0 0 0 ;
+C 142 ; WX 250 ; N c142 ; B 0 0 0 0 ;
+C 143 ; WX 250 ; N c143 ; B 0 0 0 0 ;
+C 144 ; WX 250 ; N c144 ; B 0 0 0 0 ;
+C 145 ; WX 250 ; N c145 ; B 0 0 0 0 ;
+C 146 ; WX 250 ; N c146 ; B 0 0 0 0 ;
+C 147 ; WX 250 ; N c147 ; B 0 0 0 0 ;
+C 148 ; WX 250 ; N c148 ; B 0 0 0 0 ;
+C 149 ; WX 250 ; N c149 ; B 0 0 0 0 ;
+C 150 ; WX 250 ; N c150 ; B 0 0 0 0 ;
+C 151 ; WX 250 ; N c151 ; B 0 0 0 0 ;
+C 152 ; WX 250 ; N c152 ; B 0 0 0 0 ;
+C 153 ; WX 250 ; N c153 ; B 0 0 0 0 ;
+C 154 ; WX 250 ; N c154 ; B 0 0 0 0 ;
+C 155 ; WX 250 ; N c155 ; B 0 0 0 0 ;
+C 156 ; WX 250 ; N c156 ; B 0 0 0 0 ;
+C 157 ; WX 250 ; N c157 ; B 0 0 0 0 ;
+C 158 ; WX 250 ; N c158 ; B 0 0 0 0 ;
+C 159 ; WX 250 ; N c159 ; B 0 0 0 0 ;
+C 160 ; WX 250 ; N nbspace ; B 0 0 0 0 ;
+C 161 ; WX 250 ; N exclamdown ; B 0 0 0 0 ;
+C 162 ; WX 250 ; N cent ; B 0 0 0 0 ;
+C 163 ; WX 437 ; N sterling ; B 21 -12 473 672 ;
+C 164 ; WX 250 ; N currency ; B 0 0 0 0 ;
+C 165 ; WX 250 ; N yen ; B 0 0 0 0 ;
+C 166 ; WX 250 ; N brokenbar ; B 0 0 0 0 ;
+C 167 ; WX 250 ; N section ; B 0 0 0 0 ;
+C 168 ; WX 250 ; N dieresis ; B 0 0 0 0 ;
+C 169 ; WX 250 ; N copyright ; B 0 0 0 0 ;
+C 170 ; WX 250 ; N ordfeminine ; B 0 0 0 0 ;
+C 171 ; WX 250 ; N guillemotleft ; B 0 0 0 0 ;
+C 172 ; WX 250 ; N logicalnot ; B 0 0 0 0 ;
+C 173 ; WX 250 ; N softhyphen ; B 0 0 0 0 ;
+C 174 ; WX 250 ; N registered ; B 0 0 0 0 ;
+C 175 ; WX 250 ; N macron ; B 0 0 0 0 ;
+C 176 ; WX 250 ; N degree ; B 0 0 0 0 ;
+C 177 ; WX 250 ; N plusminus ; B 0 0 0 0 ;
+C 178 ; WX 250 ; N twosuperior ; B 0 0 0 0 ;
+C 179 ; WX 667 ; N threesuperior ; B -1 0 689 877 ;
+C 180 ; WX 250 ; N acute ; B 0 0 0 0 ;
+C 181 ; WX 250 ; N mu ; B 0 0 0 0 ;
+C 182 ; WX 250 ; N paragraph ; B 0 0 0 0 ;
+C 183 ; WX 250 ; N periodcentered ; B 0 0 0 0 ;
+C 184 ; WX 250 ; N cedilla ; B 0 0 0 0 ;
+C 185 ; WX 250 ; N onesuperior ; B 0 0 0 0 ;
+C 186 ; WX 250 ; N ordmasculine ; B 0 0 0 0 ;
+C 187 ; WX 250 ; N guillemotright ; B 0 0 0 0 ;
+C 188 ; WX 250 ; N onequarter ; B 0 0 0 0 ;
+C 189 ; WX 250 ; N onehalf ; B 0 0 0 0 ;
+C 190 ; WX 250 ; N threequarters ; B 0 0 0 0 ;
+C 191 ; WX 250 ; N questiondown ; B 0 0 0 0 ;
+C 192 ; WX 693 ; N Agrave ; B -3 -6 668 457 ;
+C 193 ; WX 500 ; N Aacute ; B 20 -12 484 458 ;
+C 194 ; WX 495 ; N Acircumflex ; B 30 -12 523 702 ;
+C 195 ; WX 500 ; N Atilde ; B 18 -188 487 458 ;
+C 196 ; WX 497 ; N Adieresis ; B 21 -12 471 702 ;
+C 197 ; WX 437 ; N Aring ; B 23 -12 416 458 ;
+C 198 ; WX 714 ; N AE ; B 26 -211 688 702 ;
+C 199 ; WX 397 ; N Ccedilla ; B -1 -12 388 457 ;
+C 200 ; WX 552 ; N Egrave ; B 2 -12 514 458 ;
+C 201 ; WX 500 ; N Eacute ; B 17 -12 488 458 ;
+C 202 ; WX 500 ; N Ecircumflex ; B 17 -12 488 638 ;
+C 203 ; WX 493 ; N Edieresis ; B -3 0 482 458 ;
+C 204 ; WX 481 ; N Igrave ; B -43 -12 474 446 ;
+C 205 ; WX 652 ; N Iacute ; B -43 -12 640 458 ;
+C 206 ; WX 512 ; N Icircumflex ; B -4 -6 501 458 ;
+C 207 ; WX 500 ; N Idieresis ; B 26 -12 474 457 ;
+C 208 ; WX 500 ; N Eth ; B -4 -6 467 458 ;
+C 209 ; WX 494 ; N Ntilde ; B -53 -12 481 446 ;
+C 210 ; WX 500 ; N Ograve ; B -117 -211 462 458 ;
+C 211 ; WX 437 ; N Oacute ; B 27 -12 419 458 ;
+C 212 ; WX 771 ; N Ocircumflex ; B -3 -6 745 458 ;
+C 213 ; WX 500 ; N Otilde ; B -66 -212 472 458 ;
+C 214 ; WX 982 ; N Odieresis ; B 6 -12 968 458 ;
+C 215 ; WX 458 ; N multiply ; B 31 -12 433 458 ;
+C 216 ; WX 449 ; N Oslash ; B 30 -12 399 458 ;
+C 217 ; WX 667 ; N Ugrave ; B 30 -12 660 458 ;
+C 218 ; WX 416 ; N Uacute ; B -8 -12 382 458 ;
+C 219 ; WX 776 ; N Ucircumflex ; B 19 -12 764 458 ;
+C 220 ; WX 415 ; N Udieresis ; B -3 -12 388 458 ;
+C 221 ; WX 776 ; N Yacute ; B 19 -188 764 458 ;
+C 222 ; WX 485 ; N Thorn ; B 54 -12 474 458 ;
+C 223 ; WX 522 ; N germandbls ; B 32 -12 473 446 ;
+C 224 ; WX 1118 ; N agrave ; B 0 -15 1118 702 ;
+C 225 ; WX 719 ; N aacute ; B -10 0 616 702 ;
+C 226 ; WX 667 ; N acircumflex ; B -4 0 694 687 ;
+C 227 ; WX 808 ; N atilde ; B -2 -192 884 686 ;
+C 228 ; WX 708 ; N adieresis ; B -100 -192 786 687 ;
+C 229 ; WX 667 ; N aring ; B 7 0 697 687 ;
+C 230 ; WX 862 ; N ae ; B 76 0 856 686 ;
+C 231 ; WX 619 ; N ccedilla ; B -1 0 723 687 ;
+C 232 ; WX 721 ; N egrave ; B -13 0 780 687 ;
+C 233 ; WX 812 ; N eacute ; B -2 0 892 686 ;
+C 234 ; WX 812 ; N ecircumflex ; B -2 0 892 875 ;
+C 235 ; WX 717 ; N edieresis ; B -2 0 771 694 ;
+C 236 ; WX 724 ; N igrave ; B -33 -8 803 687 ;
+C 237 ; WX 990 ; N iacute ; B -7 0 1056 686 ;
+C 238 ; WX 823 ; N icircumflex ; B 4 0 893 686 ;
+C 239 ; WX 771 ; N idieresis ; B 70 -15 768 702 ;
+C 240 ; WX 811 ; N eth ; B -1 0 893 687 ;
+C 241 ; WX 708 ; N ntilde ; B -52 0 785 686 ;
+C 242 ; WX 667 ; N ograve ; B 4 0 674 686 ;
+C 243 ; WX 719 ; N oacute ; B 67 -15 785 702 ;
+C 244 ; WX 688 ; N ocircumflex ; B 90 0 754 686 ;
+C 245 ; WX 711 ; N otilde ; B 106 -15 832 686 ;
+C 246 ; WX 953 ; N odieresis ; B -49 0 1007 694 ;
+C 247 ; WX 667 ; N divide ; B -5 0 666 686 ;
+C 248 ; WX 662 ; N oslash ; B -4 0 609 686 ;
+C 249 ; WX 998 ; N ugrave ; B -4 0 1063 686 ;
+C 250 ; WX 538 ; N uacute ; B -11 -15 538 702 ;
+C 251 ; WX 1162 ; N ucircumflex ; B -1 0 1236 686 ;
+C 252 ; WX 693 ; N udieresis ; B 29 -15 682 702 ;
+C 253 ; WX 1162 ; N yacute ; B -1 -194 1236 686 ;
+C 254 ; WX 749 ; N thorn ; B 117 0 828 686 ;
+C 255 ; WX 738 ; N ydieresis ; B 69 0 689 686 ;
+C -1 ; WX 333 ; N minus ; B 26 180 312 283 ;
+EndCharMetrics
+EndFontMetrics
diff --git a/src/fonts/cyrillic/timesi8.afm b/src/fonts/cyrillic/timesi8.afm
new file mode 100644
index 0000000..b3ae02e
--- /dev/null
+++ b/src/fonts/cyrillic/timesi8.afm
@@ -0,0 +1,244 @@
+StartFontMetrics 3.0
+FontName TimesNRCyrMT-Inclined
+FullName Times New Roman KOI 8 Italic
+FamilyName Times New Roman KOI-8
+Weight Italic
+ItalicAngle -1
+IsFixedPitch false
+FontBBox -159 -220 1179 871
+UnderlinePosition -205
+UnderlineThickness 102
+Version 1.0
+Notice Typeface <c> The Monotype Corporation plc. 1990-92. Changes <c> 1997 by Eugene V. Demidov
+EncodingScheme FontSpecific
+CapHeight 691
+XHeight 458
+Ascender 717
+Descender -214
+StartCharMetrics 224
+C 32 ; WX 250 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 271 ; N exclam ; B 47 -12 291 687 ;
+C 34 ; WX 417 ; N quotedbl ; B 161 405 469 690 ;
+C 35 ; WX 667 ; N numbersign ; B 78 -9 658 686 ;
+C 36 ; WX 500 ; N dollar ; B 32 -69 484 717 ;
+C 37 ; WX 823 ; N percent ; B 55 -26 838 691 ;
+C 38 ; WX 719 ; N ampersand ; B 42 -15 692 690 ;
+C 39 ; WX 219 ; N quoteright ; B 152 405 282 690 ;
+C 40 ; WX 500 ; N parenleft ; B 157 -205 499 717 ;
+C 41 ; WX 500 ; N parenright ; B 24 -205 365 717 ;
+C 42 ; WX 500 ; N asterisk ; B 152 309 510 717 ;
+C 43 ; WX 667 ; N plus ; B 103 72 633 603 ;
+C 44 ; WX 267 ; N comma ; B -12 -128 131 88 ;
+C 45 ; WX 333 ; N hyphen ; B 47 193 295 272 ;
+C 46 ; WX 271 ; N period ; B 34 -12 135 89 ;
+C 47 ; WX 281 ; N slash ; B -66 -15 425 717 ;
+C 48 ; WX 500 ; N zero ; B 58 -15 510 690 ;
+C 49 ; WX 500 ; N one ; B 67 0 434 690 ;
+C 50 ; WX 500 ; N two ; B 8 0 479 690 ;
+C 51 ; WX 500 ; N three ; B 36 -15 485 690 ;
+C 52 ; WX 500 ; N four ; B 43 -16 514 686 ;
+C 53 ; WX 500 ; N five ; B 30 -15 492 675 ;
+C 54 ; WX 500 ; N six ; B 57 -15 538 690 ;
+C 55 ; WX 500 ; N seven ; B 126 -14 551 675 ;
+C 56 ; WX 500 ; N eight ; B 40 -15 505 690 ;
+C 57 ; WX 500 ; N nine ; B 44 -15 509 690 ;
+C 58 ; WX 333 ; N colon ; B 52 -12 266 458 ;
+C 59 ; WX 333 ; N semicolon ; B 35 -128 286 458 ;
+C 60 ; WX 667 ; N less ; B 103 86 633 589 ;
+C 61 ; WX 667 ; N equal ; B 103 192 633 483 ;
+C 62 ; WX 667 ; N greater ; B 103 86 633 589 ;
+C 63 ; WX 385 ; N question ; B 92 -12 437 691 ;
+C 64 ; WX 917 ; N at ; B 56 -220 905 690 ;
+C 65 ; WX 719 ; N A ; B -15 0 629 690 ;
+C 66 ; WX 667 ; N B ; B 0 0 655 675 ;
+C 67 ; WX 719 ; N C ; B 85 -15 749 691 ;
+C 68 ; WX 771 ; N D ; B 5 0 737 675 ;
+C 69 ; WX 667 ; N E ; B 0 0 696 675 ;
+C 70 ; WX 604 ; N F ; B 2 0 691 675 ;
+C 71 ; WX 719 ; N G ; B 75 -15 722 691 ;
+C 72 ; WX 823 ; N H ; B 13 0 881 675 ;
+C 73 ; WX 385 ; N I ; B 1 0 461 675 ;
+C 74 ; WX 500 ; N J ; B 10 -15 564 675 ;
+C 75 ; WX 719 ; N K ; B 10 0 794 675 ;
+C 76 ; WX 667 ; N L ; B 8 0 648 675 ;
+C 77 ; WX 990 ; N M ; B 20 0 1036 675 ;
+C 78 ; WX 771 ; N N ; B 10 -16 831 675 ;
+C 79 ; WX 771 ; N O ; B 90 -15 751 690 ;
+C 80 ; WX 667 ; N P ; B 22 0 672 675 ;
+C 81 ; WX 771 ; N Q ; B 90 -211 750 691 ;
+C 82 ; WX 719 ; N R ; B -1 0 681 675 ;
+C 83 ; WX 604 ; N S ; B 35 -15 619 691 ;
+C 84 ; WX 667 ; N T ; B 102 0 755 675 ;
+C 85 ; WX 771 ; N U ; B 142 -15 841 675 ;
+C 86 ; WX 719 ; N V ; B 162 -16 821 675 ;
+C 87 ; WX 990 ; N W ; B 164 -15 1100 675 ;
+C 88 ; WX 719 ; N X ; B 5 0 797 675 ;
+C 89 ; WX 719 ; N Y ; B 163 0 809 675 ;
+C 90 ; WX 719 ; N Z ; B 20 0 741 675 ;
+C 91 ; WX 500 ; N bracketleft ; B 55 -199 499 704 ;
+C 92 ; WX 281 ; N backslash ; B 144 -15 214 717 ;
+C 93 ; WX 500 ; N bracketright ; B 21 -199 465 704 ;
+C 94 ; WX 583 ; N asciicircum ; B 161 324 599 675 ;
+C 95 ; WX 500 ; N underscore ; B -5 -125 506 -75 ;
+C 96 ; WX 333 ; N quoteleft ; B 140 520 303 690 ;
+C 97 ; WX 500 ; N a ; B 17 -12 474 458 ;
+C 98 ; WX 500 ; N b ; B 22 -12 468 717 ;
+C 99 ; WX 438 ; N c ; B 36 -11 413 457 ;
+C 100 ; WX 500 ; N d ; B 23 -12 559 717 ;
+C 101 ; WX 438 ; N e ; B 27 -12 418 458 ;
+C 102 ; WX 333 ; N f ; B -159 -214 494 717 ;
+C 103 ; WX 500 ; N g ; B -27 -205 493 457 ;
+C 104 ; WX 500 ; N h ; B 8 -12 462 717 ;
+C 105 ; WX 271 ; N i ; B 47 -12 279 657 ;
+C 106 ; WX 271 ; N j ; B -148 -214 297 657 ;
+C 107 ; WX 531 ; N k ; B 8 -12 533 717 ;
+C 108 ; WX 271 ; N l ; B 40 -12 306 717 ;
+C 109 ; WX 771 ; N m ; B 11 -12 745 457 ;
+C 110 ; WX 500 ; N n ; B 13 -12 472 458 ;
+C 111 ; WX 500 ; N o ; B 37 -12 461 457 ;
+C 112 ; WX 500 ; N p ; B -101 -211 459 457 ;
+C 113 ; WX 500 ; N q ; B 30 -211 483 457 ;
+C 114 ; WX 385 ; N r ; B 29 0 369 458 ;
+C 115 ; WX 385 ; N s ; B 2 -12 371 457 ;
+C 116 ; WX 333 ; N t ; B 62 -12 314 568 ;
+C 117 ; WX 500 ; N u ; B 27 -12 482 452 ;
+C 118 ; WX 438 ; N v ; B 58 -12 417 458 ;
+C 119 ; WX 667 ; N w ; B 47 -12 642 458 ;
+C 120 ; WX 552 ; N x ; B 4 -12 526 458 ;
+C 121 ; WX 500 ; N y ; B -38 -214 472 458 ;
+C 122 ; WX 438 ; N z ; B -1 0 430 446 ;
+C 123 ; WX 479 ; N braceleft ; B 172 -196 445 714 ;
+C 124 ; WX 271 ; N bar ; B 137 -212 202 717 ;
+C 125 ; WX 479 ; N braceright ; B 121 -196 393 714 ;
+C 126 ; WX 667 ; N asciitilde ; B 104 263 631 412 ;
+C 128 ; WX 250 ; N c128 ; B 0 0 0 0 ;
+C 129 ; WX 250 ; N c129 ; B 0 0 0 0 ;
+C 130 ; WX 250 ; N c130 ; B 0 0 0 0 ;
+C 131 ; WX 250 ; N c131 ; B 0 0 0 0 ;
+C 132 ; WX 250 ; N c132 ; B 0 0 0 0 ;
+C 133 ; WX 250 ; N c133 ; B 0 0 0 0 ;
+C 134 ; WX 250 ; N c134 ; B 0 0 0 0 ;
+C 135 ; WX 250 ; N c135 ; B 0 0 0 0 ;
+C 136 ; WX 250 ; N c136 ; B 0 0 0 0 ;
+C 137 ; WX 250 ; N c137 ; B 0 0 0 0 ;
+C 138 ; WX 250 ; N c138 ; B 0 0 0 0 ;
+C 139 ; WX 250 ; N c139 ; B 0 0 0 0 ;
+C 140 ; WX 250 ; N c140 ; B 0 0 0 0 ;
+C 141 ; WX 250 ; N c141 ; B 0 0 0 0 ;
+C 142 ; WX 250 ; N c142 ; B 0 0 0 0 ;
+C 143 ; WX 250 ; N c143 ; B 0 0 0 0 ;
+C 144 ; WX 250 ; N c144 ; B 0 0 0 0 ;
+C 145 ; WX 250 ; N c145 ; B 0 0 0 0 ;
+C 146 ; WX 250 ; N c146 ; B 0 0 0 0 ;
+C 147 ; WX 250 ; N c147 ; B 0 0 0 0 ;
+C 148 ; WX 250 ; N c148 ; B 0 0 0 0 ;
+C 149 ; WX 250 ; N c149 ; B 0 0 0 0 ;
+C 150 ; WX 250 ; N c150 ; B 0 0 0 0 ;
+C 151 ; WX 250 ; N c151 ; B 0 0 0 0 ;
+C 152 ; WX 250 ; N c152 ; B 0 0 0 0 ;
+C 153 ; WX 250 ; N c153 ; B 0 0 0 0 ;
+C 154 ; WX 250 ; N c154 ; B 0 0 0 0 ;
+C 155 ; WX 250 ; N c155 ; B 0 0 0 0 ;
+C 156 ; WX 250 ; N c156 ; B 0 0 0 0 ;
+C 157 ; WX 250 ; N c157 ; B 0 0 0 0 ;
+C 158 ; WX 250 ; N c158 ; B 0 0 0 0 ;
+C 159 ; WX 250 ; N c159 ; B 0 0 0 0 ;
+C 160 ; WX 250 ; N nbspace ; B 0 0 0 0 ;
+C 161 ; WX 250 ; N exclamdown ; B 0 0 0 0 ;
+C 162 ; WX 250 ; N cent ; B 0 0 0 0 ;
+C 163 ; WX 438 ; N sterling ; B 27 -12 472 658 ;
+C 164 ; WX 250 ; N currency ; B 0 0 0 0 ;
+C 165 ; WX 250 ; N yen ; B 0 0 0 0 ;
+C 166 ; WX 250 ; N brokenbar ; B 0 0 0 0 ;
+C 167 ; WX 250 ; N section ; B 0 0 0 0 ;
+C 168 ; WX 250 ; N dieresis ; B 0 0 0 0 ;
+C 169 ; WX 250 ; N copyright ; B 0 0 0 0 ;
+C 170 ; WX 250 ; N ordfeminine ; B 0 0 0 0 ;
+C 171 ; WX 250 ; N guillemotleft ; B 0 0 0 0 ;
+C 172 ; WX 250 ; N logicalnot ; B 0 0 0 0 ;
+C 173 ; WX 250 ; N softhyphen ; B 0 0 0 0 ;
+C 174 ; WX 250 ; N registered ; B 0 0 0 0 ;
+C 175 ; WX 250 ; N macron ; B 0 0 0 0 ;
+C 176 ; WX 250 ; N degree ; B 0 0 0 0 ;
+C 177 ; WX 250 ; N plusminus ; B 0 0 0 0 ;
+C 178 ; WX 250 ; N twosuperior ; B 0 0 0 0 ;
+C 179 ; WX 667 ; N threesuperior ; B 0 0 696 871 ;
+C 180 ; WX 250 ; N acute ; B 0 0 0 0 ;
+C 181 ; WX 250 ; N mu ; B 0 0 0 0 ;
+C 182 ; WX 250 ; N paragraph ; B 0 0 0 0 ;
+C 183 ; WX 250 ; N periodcentered ; B 0 0 0 0 ;
+C 184 ; WX 250 ; N cedilla ; B 0 0 0 0 ;
+C 185 ; WX 250 ; N onesuperior ; B 0 0 0 0 ;
+C 186 ; WX 250 ; N ordmasculine ; B 0 0 0 0 ;
+C 187 ; WX 250 ; N guillemotright ; B 0 0 0 0 ;
+C 188 ; WX 250 ; N onequarter ; B 0 0 0 0 ;
+C 189 ; WX 250 ; N onehalf ; B 0 0 0 0 ;
+C 190 ; WX 250 ; N threequarters ; B 0 0 0 0 ;
+C 191 ; WX 250 ; N questiondown ; B 0 0 0 0 ;
+C 192 ; WX 706 ; N Agrave ; B 17 -12 664 457 ;
+C 193 ; WX 500 ; N Aacute ; B 17 -12 474 458 ;
+C 194 ; WX 507 ; N Acircumflex ; B 47 -11 525 717 ;
+C 195 ; WX 500 ; N Atilde ; B 27 -192 482 452 ;
+C 196 ; WX 500 ; N Adieresis ; B 37 -12 473 717 ;
+C 197 ; WX 438 ; N Aring ; B 27 -12 418 458 ;
+C 198 ; WX 704 ; N AE ; B 35 -211 669 717 ;
+C 199 ; WX 406 ; N Ccedilla ; B 16 -12 386 458 ;
+C 200 ; WX 552 ; N Egrave ; B 4 -12 526 458 ;
+C 201 ; WX 500 ; N Eacute ; B 27 -12 482 452 ;
+C 202 ; WX 500 ; N Ecircumflex ; B 27 -12 482 639 ;
+C 203 ; WX 498 ; N Edieresis ; B 18 0 483 458 ;
+C 204 ; WX 454 ; N Igrave ; B -34 -12 430 446 ;
+C 205 ; WX 655 ; N Iacute ; B -34 -12 632 458 ;
+C 206 ; WX 505 ; N Icircumflex ; B 17 -6 477 458 ;
+C 207 ; WX 500 ; N Idieresis ; B 37 -12 461 457 ;
+C 208 ; WX 500 ; N Eth ; B 13 -12 472 458 ;
+C 209 ; WX 474 ; N Ntilde ; B -49 -12 447 446 ;
+C 210 ; WX 500 ; N Ograve ; B -101 -211 459 457 ;
+C 211 ; WX 438 ; N Oacute ; B 36 -11 413 457 ;
+C 212 ; WX 771 ; N Ocircumflex ; B 11 -12 745 457 ;
+C 213 ; WX 500 ; N Otilde ; B -38 -214 472 458 ;
+C 214 ; WX 998 ; N Odieresis ; B 22 -12 974 458 ;
+C 215 ; WX 438 ; N multiply ; B 39 -12 418 458 ;
+C 216 ; WX 440 ; N Oslash ; B 44 -11 391 458 ;
+C 217 ; WX 648 ; N Ugrave ; B 44 -11 625 458 ;
+C 218 ; WX 404 ; N Uacute ; B 0 -12 381 457 ;
+C 219 ; WX 756 ; N Ucircumflex ; B 29 -12 738 458 ;
+C 220 ; WX 437 ; N Udieresis ; B 17 -12 392 457 ;
+C 221 ; WX 756 ; N Yacute ; B 28 -189 737 458 ;
+C 222 ; WX 471 ; N Thorn ; B 28 -12 448 458 ;
+C 223 ; WX 509 ; N germandbls ; B 33 -11 459 446 ;
+C 224 ; WX 1106 ; N agrave ; B -6 -15 1084 690 ;
+C 225 ; WX 719 ; N aacute ; B -15 0 629 690 ;
+C 226 ; WX 655 ; N acircumflex ; B -2 0 697 675 ;
+C 227 ; WX 804 ; N atilde ; B 2 -192 867 675 ;
+C 228 ; WX 675 ; N adieresis ; B -99 -192 738 675 ;
+C 229 ; WX 667 ; N aring ; B 0 0 696 675 ;
+C 230 ; WX 796 ; N ae ; B 75 0 787 675 ;
+C 231 ; WX 631 ; N ccedilla ; B -7 0 718 675 ;
+C 232 ; WX 719 ; N egrave ; B 5 0 797 675 ;
+C 233 ; WX 805 ; N eacute ; B 1 0 868 675 ;
+C 234 ; WX 805 ; N ecircumflex ; B 1 0 868 848 ;
+C 235 ; WX 713 ; N edieresis ; B 5 0 773 683 ;
+C 236 ; WX 714 ; N igrave ; B -35 -8 782 675 ;
+C 237 ; WX 990 ; N iacute ; B 20 0 1036 675 ;
+C 238 ; WX 823 ; N icircumflex ; B 13 0 881 675 ;
+C 239 ; WX 771 ; N idieresis ; B 90 -15 751 690 ;
+C 240 ; WX 805 ; N eth ; B 4 0 868 675 ;
+C 241 ; WX 709 ; N ntilde ; B -40 0 773 675 ;
+C 242 ; WX 667 ; N ograve ; B 22 0 672 675 ;
+C 243 ; WX 719 ; N oacute ; B 85 -15 749 691 ;
+C 244 ; WX 667 ; N ocircumflex ; B 102 0 755 675 ;
+C 245 ; WX 688 ; N otilde ; B 107 -15 822 675 ;
+C 246 ; WX 947 ; N odieresis ; B -36 0 1003 683 ;
+C 247 ; WX 667 ; N divide ; B 0 0 655 675 ;
+C 248 ; WX 655 ; N oslash ; B -5 0 590 675 ;
+C 249 ; WX 964 ; N ugrave ; B -5 0 1038 675 ;
+C 250 ; WX 527 ; N uacute ; B -1 -15 514 690 ;
+C 251 ; WX 1125 ; N ucircumflex ; B 10 0 1179 675 ;
+C 252 ; WX 704 ; N udieresis ; B 41 -15 670 690 ;
+C 253 ; WX 1125 ; N yacute ; B 10 -192 1179 675 ;
+C 254 ; WX 727 ; N thorn ; B 101 0 789 675 ;
+C 255 ; WX 729 ; N ydieresis ; B 70 0 665 675 ;
+C -1 ; WX 333 ; N minus ; B 47 193 295 272 ;
+EndCharMetrics
+EndFontMetrics
diff --git a/src/fonts/font.dat b/src/fonts/font.dat
new file mode 100644
index 0000000..a6616b8
--- /dev/null
+++ b/src/fonts/font.dat
@@ -0,0 +1,99 @@
+! font number metricfile vectorfile bitmapfile name
+rm 1 pstr.fmt texcmr.fve tr.fmt % Times
+rmb 3 pstb.fmt texcmb.fve tb.fmt - B(rm)
+rmi 2 psti.fmt texcmmi.fve ti.fmt - I(rm)
+rmbi 4 pstbi.fmt texcmb.fve tbi.fmt - BI(rm)
+ss 5 psh.fmt texcmitt.fve h.fmt % Sans Serif
+ssb 7 pshb.fmt texcmitt.fve hb.fmt - B(ss)
+ssi 6 psho.fmt texcmitt.fve hi.fmt - I(ss)
+ssbi 8 pshbo.fmt texcmitt.fve hbi.fmt - BI(ss)
+tt 82 psc.fmt texcmr.fve tr.fmt % Typewriter
+ttb 84 pscb.fmt texcmb.fve tb.fmt - B(tt)
+tti 83 psco.fmt texcmmi.fve ti.fmt - I(tt)
+ttbi 85 pscbo.fmt texcmb.fve tbi.fmt - BI(tt)
+pstr 59 pstr.fmt pstr.fve pstr.fmt % PS Times
+pstb 56 pstb.fmt pstb.fve pstb.fmt - B(pstr)
+psti 58 psti.fmt psti.fve psti.fmt - I(pstr)
+pstbi 57 pstbi.fmt pstbi.fve pstbi.fmt - BI(pstr)
+psh 35 psh.fmt psh.fve psh.fmt % PS Helvetica
+pshb 36 pshb.fmt pshb.fve pshb.fmt - B(psh)
+psho 42 psho.fmt psho.fve psho.fmt - I(psh)
+pshbo 37 pshbo.fmt pshbo.fve pshbo.fmt - BI(psh)
+pshc 38 pshc.fmt pshc.fve pshc.fmt % PS Helvetica Condensed
+pshcb 39 pshcb.fmt pshcb.fve pshcb.fmt - B(pshc)
+pshcdo 41 pshcdo.fmt pshcdo.fve pshcdo.fmt - I(pshc)
+pshcbo 40 pshcbo.fmt pshcbo.fve pshcbo.fmt - BI(pshc)
+pshn 43 pshn.fmt pshn.fve pshn.fmt % PS Helvetica Narrow
+pshnb 44 pshnb.fmt pshnb.fve pshnb.fmt - B(pshn)
+pshno 46 pshno.fmt pshno.fve pshno.fmt - I(pshn)
+pshnbo 45 pshnbo.fmt pshnbo.fve pshnbo.fmt - BI(pshn)
+psncsr 50 psncsr.fmt psncsr.fve psncsr.fmt % PS New Century Schoolbook
+psncsb 47 psncsb.fmt psncsb.fve psncsb.fmt - B(psncsr)
+psncsi 49 psncsi.fmt psncsi.fve psncsi.fmt - I(psncsr)
+psncsbi 48 psncsbi.fmt psncsbi.fve psncsbi.fmt - BI(psncsr)
+pspr 54 pspr.fmt pspr.fve pspr.fmt % PS Palatino
+pspb 51 pspb.fmt pspb.fve pspb.fmt - B(pspr)
+pspi 53 pspi.fmt pspi.fve pspi.fmt - I(pspr)
+pspbi 52 pspbi.fmt pspbi.fve pspbi.fmt - BI(pspr)
+psagb 24 psagb.fmt psagb.fve psagb.fmt % PS AvantGarde
+psagd 26 psagd.fmt psagd.fve psagd.fmt - B(psagb)
+psagbo 25 psagbo.fmt psagbo.fve psagbo.fmt - I(psagb)
+psagdo 27 psagdo.fmt psagdo.fve psagdo.fmt - BI(psagb)
+psbl 86 psbl.fmt psbl.fve psbl.fmt % PS Bookman
+psbd 28 psbd.fmt psbd.fve psbd.fmt - B(psbl)
+psbli 30 psbli.fmt psbli.fve psbli.fmt - I(psbl)
+psbdi 29 psbdi.fmt psbdi.fve psbdi.fmt - BI(psbl)
+psc 31 psc.fmt psc.fve psc.fmt % PS Courier
+pscb 32 pscb.fmt pscb.fve pscb.fmt - B(psc)
+psco 34 psco.fmt psco.fve psco.fmt - I(psc)
+pscbo 33 pscbo.fmt pscbo.fve pscbo.fmt - BI(psc)
+pssym 55 pssym.fmt pssym.fve pssym.fmt % PS Symbol
+pszcmi 60 pszcmi.fmt pszcmi.fve pszcmi.fmt % PS ZapfChancery
+pszd 61 pszd.fmt pszd.fve pszd.fmt % PS ZapfDingbats
+glemark 12 glemark.fmt glemark.fve glemark.fmt % GLE Marker
+texcmr 17 texcmr.fmt texcmr.fve texcmr.fmt % TeX CM
+texcmb 13 texcmb.fmt texcmb.fve texcmb.fmt - B(texcmr)
+texcmti 22 texcmti.fmt texcmti.fve texcmti.fmt - I(texcmr)
+texcmss 18 texcmss.fmt texcmss.fve texcmss.fmt % TeX CM Sans Serif
+texcmssb 19 texcmssb.fmt texcmssb.fve texcmssb.fmt - B(texcmss)
+texcmssi 20 texcmssi.fmt texcmssi.fve texcmssi.fmt - I(texcmss)
+texcmtt 23 texcmtt.fmt texcmtt.fve texcmtt.fmt % TeX CM Typewriter
+texcmitt 15 texcmitt.fmt texcmitt.fve texcmitt.fmt - I(texcmtt)
+texcmsy 21 texcmsy.fmt texcmsy.fve texcmsy.fmt % TeX CM Symbol
+texcmex 14 texcmex.fmt texcmex.fve texcmex.fmt % TeX CM Extensible
+texcmmi 16 texcmmi.fmt texcmmi.fve texcmmi.fmt % TeX CM Maths Italic
+texmi 9 texcmmi.fmt texcmmi.fve texcmmi.fmt % TeX Math Italic
+texsy 10 texcmsy.fmt texcmsy.fve texcmsy.fmt % TeX Math Greek Symbols
+texex 11 texcmex.fmt texcmex.fve texcmex.fmt % TeX Math Extensible Characters
+plba 62 plba.fmt plba.fve plba.fmt % Plotter Block Ascii
+plcr 66 plcr.fmt plcr.fve plcr.fmt % Plotter Complex
+plci 65 plci.fmt plci.fve plci.fmt - I(plcr)
+plcc 63 plcc.fmt plcc.fve plcc.fmt % Plotter Complex Cartographic
+plcg 64 plcg.fmt plcg.fve plcg.fmt % Plotter Complex Gothic
+plcs 67 plcs.fmt plcs.fve plcs.fmt % Plotter Complex Script
+pldr 68 pldr.fmt pldr.fve pldr.fmt % Plotter Duplex
+plge 69 plge.fmt plge.fve plge.fmt % Plotter Gothic English
+plgg 70 plgg.fmt plgg.fve plgg.fmt % Plotter Gothic German
+plgi 71 plgi.fmt plgi.fve plgi.fmt % Plotter Gothic Italian
+plsa 72 plsa.fmt plsa.fve plsa.fmt % Plotter Simplex Ascii
+plsg 73 plsg.fmt plsg.fve plsg.fmt % Plotter Simplex German
+plsr 74 plsr.fmt plsr.fve plsr.fmt % Plotter Simplex
+plss 75 plss.fmt plss.fve plss.fmt % Plotter Simplex Script
+plsym1 76 plsym1.fmt plsym1.fve plsym1.fmt % Plotter Symbols One
+plsym2 77 plsym2.fmt plsym2.fve plsym2.fmt % Plotter Symbols Two
+pltr 79 pltr.fmt pltr.fve pltr.fmt % Plotter Triplex
+plti 78 plti.fmt plti.fve plti.fmt - I(pltr)
+plba 80 plba.fmt plba.fve plba.fmt % Plotter Block Ascii
+plsa 81 plsa.fmt plsa.fve plsa.fmt % Plotter Simplex Ascii
+arial8 87 arial8.fmt arial8.fve arial8.fmt % Arial Cyrillic
+arial8b 88 arialbd8.fmt arialbd8.fve arialbd8.fmt - B(arial8)
+arial8i 89 ariali8.fmt ariali8.fve ariali8.fmt - I(arial8)
+arial8bi 90 arialbi8.fmt arialbi8.fve arialbi8.fmt - BI(arial8)
+cour8 91 cour8.fmt cour8.fve cour8.fmt % Courier Cyrillic
+cour8b 92 courbd8.fmt courbd8.fve courbd8.fmt - B(cour8)
+cour8i 93 couri8.fmt couri8.fve couri8.fmt - I(cour8)
+cour8bi 94 courbi8.fmt courbi8.fve courbi8.fmt - BI(cour8)
+times8 95 times8.fmt times8.fve times8.fmt % Times Cyrillic
+times8b 96 timesbd8.fmt timesbd8.fve timesbd8.fmt - B(times8)
+times8i 97 timesi8.fmt timesi8.fve timesi8.fmt - I(times8)
+times8bi 98 timesbi8.fmt timesbi8.fve timesbi8.fmt - BI(times8)
diff --git a/src/fonts/glemark.afm b/src/fonts/glemark.afm
new file mode 100644
index 0000000..d5803b1
--- /dev/null
+++ b/src/fonts/glemark.afm
@@ -0,0 +1,34 @@
+StartFontMetrics 2.0
+FontName GleMarkers
+EncodingScheme GLEMARK
+FullName Gle Markers
+FamilyName GLE
+Weight Roman
+ItalicAngle 0.0
+IsFixedPitch false
+UnderlinePosition -109
+UnderlineThickness 49
+Version 001.002
+Notice The GLE marker font is licensed under the Modified BSD license.
+FontBBox -170 -223 1024 896
+CapHeight 662
+XHeight 448
+Descender -217
+Ascender 682
+StartCharMetrics 14
+C 1; WX 1000; N C1 ; B 0 0 1000 1000 ;
+C 2; WX 1000; N C2 ; B 0 0 1000 1000 ;
+C 3; WX 1000; N C3 ; B 0 0 1000 1000 ;
+C 4; WX 1000; N C4 ; B 0 0 1000 1000 ;
+C 5; WX 1000; N C5 ; B 0 0 1000 1000 ;
+C 6; WX 1000; N C6 ; B 0 0 1000 1000 ;
+C 7; WX 1000; N C7 ; B 0 0 1000 1000 ;
+C 8; WX 1000; N C8 ; B 0 0 1000 1000 ;
+C 9; WX 1000; N C9 ; B 0 0 1000 1000 ;
+C 10; WX 1000; N C10 ; B 0 0 1000 1000 ;
+C 11; WX 1000; N C11 ; B 0 0 1000 1000 ;
+C 12; WX 1000; N C12 ; B 0 0 1000 1000 ;
+C 13; WX 1000; N C13 ; B 0 0 1000 1000 ;
+C 14; WX 1000; N C14 ; B 0 0 1000 1000 ;
+EndCharMetrics
+EndFontMetrics
diff --git a/src/fonts/glemark.gle b/src/fonts/glemark.gle
new file mode 100644
index 0000000..363e550
--- /dev/null
+++ b/src/fonts/glemark.gle
@@ -0,0 +1,204 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+!1 Triangle
+!2 Filled Triangle
+!3 White Triangle
+!4 Square
+!5 Filled Square
+!6 White Square
+!7 Circle
+!8 Filled Circle
+!9 White Circle
+!10 Diamond
+!11 Filled Diamond
+!12 White Diamond
+!13 Cross
+!14 Plus
+!15 Minus
+dfont file_name="GLEMARK"
+dfont font_name="GLEMARK"
+dfont design= 10
+dfont x_hei= 5
+dfont quad= 5
+dfont paint="FILL"
+!------------------ end of main parameters
+dfont char=1
+dfont wid=10 hei=10
+size 20 20
+ amove 0 0
+ rline 10 0
+ rline -5 10
+ closepath
+stroke
+dfont endchar
+dfont char=2
+dfont wid=10 hei=10
+size 20 20
+ amove 0 0
+ rline 10 0
+ rline -5 10
+ closepath
+fill
+stroke
+dfont endchar
+dfont char=3
+dfont wid=10 hei=10
+size 20 20
+ amove 0 0
+ rline 10 0
+ rline -5 10
+ closepath
+fillwhite
+stroke
+dfont endchar
+dfont char=4
+dfont wid=10 hei=10
+size 20 20
+ amove 0 0
+ rline 10 0
+ rline 0 10
+ rline -10 0
+ closepath
+stroke
+dfont endchar
+dfont char=5
+dfont wid=10 hei=10
+size 20 20
+ amove 0 0
+ rline 10 0
+ rline 0 10
+ rline -10 0
+ closepath
+fill
+stroke
+dfont endchar
+dfont char=6
+dfont wid=10 hei=10
+size 20 20
+ amove 0 0
+ rline 10 0
+ rline 0 10
+ rline -10 0
+ closepath
+fillwhite
+stroke
+dfont endchar
+dfont char=7
+dfont wid=10 hei=10
+size 20 20
+ asetpos 5 5
+ circle 5
+ closepath
+stroke
+dfont endchar
+dfont char=8
+dfont wid=10 hei=10
+size 20 20
+ asetpos 5 5
+ circle 5
+ closepath
+fill
+stroke
+dfont endchar
+dfont char=9
+dfont wid=10 hei=10
+size 20 20
+ asetpos 5 5
+ circle 5
+ closepath
+fillwhite
+stroke
+dfont endchar
+dfont char=10
+dfont wid=10 hei=10
+size 20 20
+ amove 5 0
+ rline 5 5
+ rline -5 5
+ rline -5 -5
+ closepath
+stroke
+dfont endchar
+dfont char=11
+dfont wid=10 hei=10
+size 20 20
+ amove 5 0
+ rline 5 5
+ rline -5 5
+ rline -5 -5
+ closepath
+fill
+stroke
+dfont endchar
+dfont char=12
+dfont wid=10 hei=10
+size 20 20
+ amove 5 0
+ rline 5 5
+ rline -5 5
+ rline -5 -5
+ closepath
+fillwhite
+stroke
+dfont endchar
+dfont char=13
+dfont wid=10 hei=10
+size 20 20
+ amove 0 0
+ aline 10 10
+ amove 0 10
+ aline 10 0
+stroke
+dfont endchar
+dfont char=14
+dfont wid=10 hei=10
+size 20 20
+ amove 5 0
+ aline 5 10
+ amove 0 5
+ aline 10 5
+stroke
+dfont endchar
+dfont char=15
+dfont wid=10 hei=10
+size 20 20
+ amove 0 5
+ rline 10 0
+stroke
+dfont endchar
diff --git a/src/fonts/koi8r.enc b/src/fonts/koi8r.enc
new file mode 100755
index 0000000..1f4e0d6
--- /dev/null
+++ b/src/fonts/koi8r.enc
@@ -0,0 +1,261 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+$0020, 32; space
+$0021, 33; exclam
+$0022, 34; quotedbl
+$0023, 35; numbersign
+$0024, 36; dollar
+$0025, 37; percent
+$0026, 38; ampersand
+$2019, 39; quoteright
+$0028, 40; parenleft
+$0029, 41; parenright
+$002A, 42; asterisk
+$002B, 43; plus
+$002C, 44; comma
+$FFFF, 45; hyphen
+$002E, 46; period
+$002F, 47; slash
+$0030, 48; zero
+$0031, 49; one
+$0032, 50; two
+$0033, 51; three
+$0034, 52; four
+$0035, 53; five
+$0036, 54; six
+$0037, 55; seven
+$0038, 56; eight
+$0039, 57; nine
+$003A, 58; colon
+$003B, 59; semicolon
+$003C, 60; less
+$003D, 61; equal
+$003E, 62; greater
+$003F, 63; question
+$0040, 64; at
+$0041, 65; A
+$0042, 66; B
+$0043, 67; C
+$0044, 68; D
+$0045, 69; E
+$0046, 70; F
+$0047, 71; G
+$0048, 72; H
+$0049, 73; I
+$004A, 74; J
+$004B, 75; K
+$004C, 76; L
+$004D, 77; M
+$004E, 78; N
+$004F, 79; O
+$0050, 80; P
+$0051, 81; Q
+$0052, 82; R
+$0053, 83; S
+$0054, 84; T
+$0055, 85; U
+$0056, 86; V
+$0057, 87; W
+$0058, 88; X
+$0059, 89; Y
+$005A, 90; Z
+$005B, 91; bracketleft
+$005C, 92; backslash
+$005D, 93; bracketright
+$005E, 94; asciicircum
+$005F, 95; underscore
+$2018, 96; quoteleft
+$0061, 97; a
+$0062, 98; b
+$0063, 99; c
+$0064, 100; d
+$0065, 101; e
+$0066, 102; f
+$0067, 103; g
+$0068, 104; h
+$0069, 105; i
+$006A, 106; j
+$006B, 107; k
+$006C, 108; l
+$006D, 109; m
+$006E, 110; n
+$006F, 111; o
+$0070, 112; p
+$0071, 113; q
+$0072, 114; r
+$0073, 115; s
+$0074, 116; t
+$0075, 117; u
+$0076, 118; v
+$0077, 119; w
+$0078, 120; x
+$0079, 121; y
+$007A, 122; z
+$007B, 123; braceleft
+$007C, 124; bar
+$007D, 125; braceright
+$007E, 126; asciitilde
+$2500, 128; u2500
+$2502, 129; u2502
+$250c, 130; u250c
+$2510, 131; u2510
+$2514, 132; u2514
+$2518, 133; u2518
+$251c, 134; u251c
+$2524, 135; u2524
+$252c, 136; u252c
+$2534, 137; u2534
+$253c, 138; u253c
+$2580, 139; u2580
+$2584, 140; u2584
+$2588, 141; u2588
+$258c, 142; u258c
+$2590, 143; u2590
+$2591, 144; u2591
+$2592, 145; u2592
+$2593, 146; u2593
+$2320, 147; u2320
+$25a0, 148; u25a0
+$2219, 149; u2219
+$221a, 150; u221a
+$2248, 151; u2248
+$2264, 152; u2264
+$2265, 153; u2265
+$00a0, 154; u00a0
+$2321, 155; u2321
+$00b0, 156; u00b0
+$00b2, 157; u00b2
+$00b7, 158; u00b7
+$00f7, 159; u00f7
+$2550, 160; u2550
+$2551, 161; u2551
+$2552, 162; u2552
+$0451, 163; u0451
+$2553, 164; u2553
+$2554, 165; u2554
+$2555, 166; u2555
+$2556, 167; u2556
+$2557, 168; u2557
+$2558, 169; u2558
+$2559, 170; u2559
+$255a, 171; u255a
+$255b, 172; u255b
+$255c, 173; u255c
+$255d, 174; u255d
+$255e, 175; u255e
+$255f, 176; u255f
+$2560, 177; u2560
+$2561, 178; u2561
+$0401, 179; u0401
+$2562, 180; u2562
+$2563, 181; u2563
+$2564, 182; u2564
+$2565, 183; u2565
+$2566, 184; u2566
+$2567, 185; u2567
+$2568, 186; u2568
+$2569, 187; u2569
+$256a, 188; u256a
+$256b, 189; u256b
+$256c, 190; u256c
+$00a9, 191; u00a9
+$044e, 192; u044e
+$0430, 193; u0430
+$0431, 194; u0431
+$0446, 195; u0446
+$0434, 196; u0434
+$0435, 197; u0435
+$0444, 198; u0444
+$0433, 199; u0433
+$0445, 200; u0445
+$0438, 201; u0438
+$0439, 202; u0439
+$043a, 203; u043a
+$043b, 204; u043b
+$043c, 205; u043c
+$043d, 206; u043d
+$043e, 207; u043e
+$043f, 208; u043f
+$044f, 209; u044f
+$0440, 210; u0440
+$0441, 211; u0441
+$0442, 212; u0442
+$0443, 213; u0443
+$0436, 214; u0436
+$0432, 215; u0432
+$044c, 216; u044c
+$044b, 217; u044b
+$0437, 218; u0437
+$0448, 219; u0448
+$044d, 220; u044d
+$0449, 221; u0449
+$0447, 222; u0447
+$044a, 223; u044a
+$042e, 224; u042e
+$0410, 225; u0410
+$0411, 226; u0411
+$0426, 227; u0426
+$0414, 228; u0414
+$0415, 229; u0415
+$0424, 230; u0424
+$0413, 231; u0413
+$0425, 232; u0425
+$0418, 233; u0418
+$0419, 234; u0419
+$041a, 235; u041a
+$041b, 236; u041b
+$041c, 237; u041c
+$041d, 238; u041d
+$041e, 239; u041e
+$041f, 240; u041f
+$042f, 241; u042f
+$0420, 242; u0420
+$0421, 243; u0421
+$0422, 244; u0422
+$0423, 245; u0423
+$0416, 246; u0416
+$0412, 247; u0412
+$042c, 248; u042c
+$042b, 249; u042b
+$0417, 250; u0417
+$0428, 251; u0428
+$042d, 252; u042d
+$0429, 253; u0429
+$0427, 254; u0427
+$042a, 255; u042a
diff --git a/src/fonts/mkencoding.pl b/src/fonts/mkencoding.pl
new file mode 100755
index 0000000..675a118
--- /dev/null
+++ b/src/fonts/mkencoding.pl
@@ -0,0 +1,58 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+open(FILE, "<:utf8", $ARGV[0]);
+open(OUT, ">:utf8", "$ARGV[0].2");
+while ($line = <FILE>) {
+ $line =~ s/[\n\r]+$//g;
+ $x = sprintf("%04x",ord($line));
+ print OUT "\$$x, ; cyr$x ! $line\n";
+}
+close(OUT);
+close(FILE);
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/fonts/plba.afm b/src/fonts/plba.afm
new file mode 100644
index 0000000..0ba035f
--- /dev/null
+++ b/src/fonts/plba.afm
@@ -0,0 +1,116 @@
+StartFontMetrics 2.0
+Comment Made from HERSHEY font file using SPLITFONT.BAS
+FontName plBA
+EncodingScheme TEXENCODING
+FullName plBA
+FamilyName plBA
+Weight Medium
+ItalicAngle 0
+IsFixedPitch false
+UnderlinePosition -97
+UnderlineThickness 73
+FontBBox 0 -400 1001 1001
+CapHeight 729
+XHeight 151
+Descender -219
+Ascender 729
+StartCharMetrics 96
+C 32 ; WX 400 ; N C32 ; B 0 0 0 0 ;
+C 33 ; WX 430 ; N C33 ; B 126 0 254 636 ;
+C 34 ; WX 430 ; N C34 ; B 63 509 317 636 ;
+C 35 ; WX 430 ; N C35 ; B 0 63 381 572 ;
+C 36 ; WX 430 ; N C36 ; B 0 0 381 636 ;
+C 37 ; WX 430 ; N C37 ; B 0 0 445 636 ;
+C 38 ; WX 430 ; N C38 ; B 0 0 381 572 ;
+C 39 ; WX 430 ; N C39 ; B 190 445 254 636 ;
+C 40 ; WX 430 ; N C40 ; B 126 0 317 636 ;
+C 41 ; WX 430 ; N C41 ; B 63 0 254 636 ;
+C 42 ; WX 430 ; N C42 ; B 0 126 381 445 ;
+C 43 ; WX 430 ; N C43 ; B 0 126 381 509 ;
+C 44 ; WX 430 ; N C44 ; B 63 -63 254 126 ;
+C 45 ; WX 430 ; N C45 ; B 0 254 381 381 ;
+C 46 ; WX 430 ; N C46 ; B 126 0 254 126 ;
+C 47 ; WX 430 ; N C47 ; B 0 0 381 636 ;
+C 48 ; WX 430 ; N C48 ; B 0 0 381 636 ;
+C 49 ; WX 430 ; N C49 ; B 63 0 254 636 ;
+C 50 ; WX 430 ; N C50 ; B 0 0 381 636 ;
+C 51 ; WX 430 ; N C51 ; B 0 0 381 636 ;
+C 52 ; WX 430 ; N C52 ; B 0 0 381 636 ;
+C 53 ; WX 430 ; N C53 ; B 0 0 381 636 ;
+C 54 ; WX 430 ; N C54 ; B 0 0 381 636 ;
+C 55 ; WX 430 ; N C55 ; B 0 0 381 636 ;
+C 56 ; WX 430 ; N C56 ; B 0 0 381 636 ;
+C 57 ; WX 430 ; N C57 ; B 0 0 381 636 ;
+C 58 ; WX 430 ; N C58 ; B 126 0 254 381 ;
+C 59 ; WX 430 ; N C59 ; B 63 -63 254 381 ;
+C 60 ; WX 430 ; N C60 ; B 0 0 317 636 ;
+C 61 ; WX 430 ; N C61 ; B 0 190 381 445 ;
+C 62 ; WX 430 ; N C62 ; B 63 0 381 636 ;
+C 63 ; WX 430 ; N C63 ; B 0 0 381 636 ;
+C 64 ; WX 430 ; N C64 ; B 63 126 381 509 ;
+C 65 ; WX 430 ; N C65 ; B 0 0 381 636 ;
+C 66 ; WX 430 ; N C66 ; B 0 0 381 636 ;
+C 67 ; WX 430 ; N C67 ; B 0 0 381 636 ;
+C 68 ; WX 430 ; N C68 ; B 0 0 381 636 ;
+C 69 ; WX 430 ; N C69 ; B 0 0 381 636 ;
+C 70 ; WX 430 ; N C70 ; B 0 0 381 636 ;
+C 71 ; WX 430 ; N C71 ; B 0 0 381 636 ;
+C 72 ; WX 430 ; N C72 ; B 0 0 381 636 ;
+C 73 ; WX 430 ; N C73 ; B 126 0 254 636 ;
+C 74 ; WX 430 ; N C74 ; B 0 0 381 636 ;
+C 75 ; WX 430 ; N C75 ; B 0 0 381 636 ;
+C 76 ; WX 430 ; N C76 ; B 0 0 381 636 ;
+C 77 ; WX 430 ; N C77 ; B 0 0 381 636 ;
+C 78 ; WX 430 ; N C78 ; B 0 0 381 636 ;
+C 79 ; WX 430 ; N C79 ; B 0 0 381 636 ;
+C 80 ; WX 430 ; N C80 ; B 0 0 381 636 ;
+C 81 ; WX 430 ; N C81 ; B 0 -63 445 636 ;
+C 82 ; WX 430 ; N C82 ; B 0 0 381 636 ;
+C 83 ; WX 430 ; N C83 ; B 0 0 381 636 ;
+C 84 ; WX 430 ; N C84 ; B 0 0 381 636 ;
+C 85 ; WX 430 ; N C85 ; B 0 0 381 636 ;
+C 86 ; WX 430 ; N C86 ; B 0 0 381 636 ;
+C 87 ; WX 430 ; N C87 ; B 0 0 381 636 ;
+C 88 ; WX 430 ; N C88 ; B 0 0 381 636 ;
+C 89 ; WX 430 ; N C89 ; B 0 0 381 636 ;
+C 90 ; WX 430 ; N C90 ; B 0 0 381 636 ;
+C 91 ; WX 430 ; N C91 ; B 63 0 254 636 ;
+C 92 ; WX 430 ; N C92 ; B 0 0 381 636 ;
+C 93 ; WX 430 ; N C93 ; B 126 0 317 636 ;
+C 94 ; WX 430 ; N C94 ; B 0 190 381 445 ;
+C 95 ; WX 430 ; N C95 ; B 0 0 381 126 ;
+C 96 ; WX 430 ; N C96 ; B 63 509 254 636 ;
+C 97 ; WX 430 ; N C97 ; B 0 0 381 445 ;
+C 98 ; WX 430 ; N C98 ; B 0 0 381 636 ;
+C 99 ; WX 430 ; N C99 ; B 0 0 381 445 ;
+C 100 ; WX 430 ; N C100 ; B 0 0 381 636 ;
+C 101 ; WX 430 ; N C101 ; B 0 0 381 445 ;
+C 102 ; WX 430 ; N C102 ; B 63 0 381 636 ;
+C 103 ; WX 430 ; N C103 ; B 0 -191 381 445 ;
+C 104 ; WX 430 ; N C104 ; B 0 0 381 636 ;
+C 105 ; WX 430 ; N C105 ; B 126 0 254 636 ;
+C 106 ; WX 430 ; N C106 ; B 0 -191 381 636 ;
+C 107 ; WX 430 ; N C107 ; B 0 0 381 636 ;
+C 108 ; WX 430 ; N C108 ; B 126 0 317 636 ;
+C 109 ; WX 430 ; N C109 ; B 0 0 381 445 ;
+C 110 ; WX 430 ; N C110 ; B 0 0 381 445 ;
+C 111 ; WX 430 ; N C111 ; B 0 0 381 445 ;
+C 112 ; WX 430 ; N C112 ; B 0 -191 381 445 ;
+C 113 ; WX 430 ; N C113 ; B 0 -191 445 445 ;
+C 114 ; WX 430 ; N C114 ; B 0 0 317 445 ;
+C 115 ; WX 430 ; N C115 ; B 0 0 381 445 ;
+C 116 ; WX 430 ; N C116 ; B 63 0 317 636 ;
+C 117 ; WX 430 ; N C117 ; B 0 0 381 445 ;
+C 118 ; WX 430 ; N C118 ; B 0 0 381 445 ;
+C 119 ; WX 430 ; N C119 ; B 0 0 381 445 ;
+C 120 ; WX 430 ; N C120 ; B 0 0 381 445 ;
+C 121 ; WX 430 ; N C121 ; B 0 -191 381 445 ;
+C 122 ; WX 430 ; N C122 ; B 0 0 381 445 ;
+C 123 ; WX 430 ; N C123 ; B 0 0 317 636 ;
+C 124 ; WX 430 ; N C124 ; B 126 0 254 636 ;
+C 125 ; WX 430 ; N C125 ; B 63 0 381 636 ;
+C 126 ; WX 430 ; N C126 ; B 0 190 381 445 ;
+C 127 ; WX 430 ; N C127 ; B 0 126 381 509 ;
+EndCharMetrics
+
+EndFontMetrics
diff --git a/src/fonts/plba.gle b/src/fonts/plba.gle
new file mode 100644
index 0000000..c9337f4
--- /dev/null
+++ b/src/fonts/plba.gle
@@ -0,0 +1,1646 @@
+dfont design= 1428
+dfont char=33
+amove 181 0
+aline 181 181
+aline 363 181
+aline 363 0
+aline 181 0
+amove 181 272
+aline 181 909
+aline 363 909
+aline 363 272
+aline 181 272
+stroke
+dfont endchar
+dfont char=34
+amove 90 727
+aline 90 909
+aline 181 909
+aline 181 727
+aline 90 727
+amove 363 727
+aline 363 909
+aline 454 909
+aline 454 727
+aline 363 727
+stroke
+dfont endchar
+dfont char=35
+amove 90 90
+aline 90 272
+aline 0 272
+aline 0 363
+aline 90 363
+aline 90 545
+aline 0 545
+aline 0 636
+aline 90 636
+aline 90 818
+aline 181 818
+aline 181 636
+aline 363 636
+aline 363 818
+aline 454 818
+aline 454 636
+aline 545 636
+aline 545 545
+aline 454 545
+aline 454 363
+aline 545 363
+aline 545 272
+aline 454 272
+aline 454 90
+aline 363 90
+aline 363 272
+aline 181 272
+aline 181 90
+aline 90 90
+amove 181 363
+aline 181 545
+aline 363 545
+aline 363 363
+aline 181 363
+stroke
+dfont endchar
+dfont char=36
+amove 0 90
+aline 0 272
+aline 181 272
+aline 181 181
+aline 363 181
+aline 363 363
+aline 90 363
+aline -1 454
+aline -1 818
+aline 90 909
+aline 454 909
+aline 545 818
+aline 545 636
+aline 363 636
+aline 363 727
+aline 181 727
+aline 181 545
+aline 454 545
+aline 545 454
+aline 545 90
+aline 454 0
+aline 90 0
+aline 0 90
+amove 272 0
+aline 272 909
+stroke
+dfont endchar
+dfont char=37
+amove 0 636
+aline 0 909
+aline 272 909
+aline 272 636
+aline 0 636
+amove 90 727
+aline 90 818
+aline 181 818
+aline 181 727
+aline 90 727
+amove 90 90
+aline 454 909
+aline 545 909
+aline 545 818
+aline 181 0
+aline 90 0
+aline 90 90
+amove 363 0
+aline 363 272
+aline 636 272
+aline 636 0
+aline 363 0
+amove 454 90
+aline 454 181
+aline 545 181
+aline 545 90
+aline 454 90
+stroke
+dfont endchar
+dfont char=38
+amove 181 454
+aline 90 545
+aline 90 727
+aline 181 818
+aline 363 818
+aline 454 727
+aline 454 545
+aline 181 272
+aline 181 181
+aline 363 181
+aline 363 272
+aline 545 272
+aline 545 90
+aline 454 0
+aline 90 0
+aline 0 90
+aline 0 272
+aline 272 545
+aline 272 727
+amove 363 454
+aline 454 363
+aline 363 272
+aline 272 363
+stroke
+dfont endchar
+dfont char=39
+amove 272 636
+aline 272 909
+aline 363 909
+aline 363 636
+aline 272 636
+stroke
+dfont endchar
+dfont char=40
+amove 181 90
+aline 181 818
+aline 272 909
+aline 454 909
+aline 454 727
+aline 363 727
+aline 363 181
+aline 454 181
+aline 454 0
+aline 272 0
+aline 181 90
+stroke
+dfont endchar
+dfont char=41
+amove 90 0
+aline 90 181
+aline 181 181
+aline 181 727
+aline 90 727
+aline 90 909
+aline 272 909
+aline 363 818
+aline 363 90
+aline 272 0
+aline 90 0
+stroke
+dfont endchar
+dfont char=42
+amove 90 272
+aline 181 363
+aline 0 363
+aline 0 454
+aline 181 454
+aline 90 545
+aline 181 636
+aline 272 454
+aline 363 636
+aline 454 545
+aline 363 454
+aline 545 454
+aline 545 363
+aline 363 363
+aline 454 272
+aline 363 181
+aline 272 363
+aline 181 181
+aline 90 272
+stroke
+dfont endchar
+dfont char=43
+amove 0 363
+aline 0 545
+aline 181 545
+aline 181 727
+aline 363 727
+aline 363 545
+aline 545 545
+aline 545 363
+aline 363 363
+aline 363 181
+aline 181 181
+aline 181 363
+aline 0 363
+stroke
+dfont endchar
+dfont char=44
+amove 90 0
+aline 181 0
+aline 181 181
+aline 363 181
+aline 363 -91
+aline 90 -91
+aline 90 -1
+stroke
+dfont endchar
+dfont char=45
+amove 0 363
+aline 0 545
+aline 545 545
+aline 545 363
+aline 0 363
+stroke
+dfont endchar
+dfont char=46
+amove 181 0
+aline 181 181
+aline 363 181
+aline 363 0
+aline 181 0
+stroke
+dfont endchar
+dfont char=47
+amove 0 0
+aline 0 90
+aline 363 909
+aline 545 909
+aline 545 818
+aline 181 0
+aline -1 0
+stroke
+dfont endchar
+dfont char=48
+amove 0 90
+aline 0 818
+aline 90 909
+aline 454 909
+aline 545 818
+aline 545 90
+aline 454 0
+aline 90 0
+aline 0 90
+amove 181 181
+aline 181 727
+aline 363 727
+aline 363 181
+aline 181 181
+stroke
+dfont endchar
+dfont char=49
+amove 181 0
+aline 181 727
+aline 90 727
+aline 90 909
+aline 363 909
+aline 363 0
+aline 181 0
+stroke
+dfont endchar
+dfont char=50
+amove 0 0
+aline 0 181
+aline 363 545
+aline 363 727
+aline 181 727
+aline 181 545
+aline 0 545
+aline 0 818
+aline 90 909
+aline 454 909
+aline 545 818
+aline 545 454
+aline 272 181
+aline 545 181
+aline 545 -1
+aline 0 -1
+stroke
+dfont endchar
+dfont char=51
+amove 0 90
+aline 0 272
+aline 181 272
+aline 181 181
+aline 363 181
+aline 363 363
+aline 181 363
+aline 181 545
+aline 363 545
+aline 363 727
+aline 181 727
+aline 181 636
+aline 0 636
+aline 0 818
+aline 90 909
+aline 454 909
+aline 545 818
+aline 545 545
+aline 454 454
+aline 545 363
+aline 545 90
+aline 454 0
+aline 90 0
+aline 0 90
+stroke
+dfont endchar
+dfont char=52
+amove 0 181
+aline 0 454
+aline 181 909
+aline 454 909
+aline 454 363
+aline 545 363
+aline 545 181
+aline 454 181
+aline 454 0
+aline 272 0
+aline 272 181
+aline 0 181
+amove 181 363
+aline 272 636
+aline 272 363
+aline 181 363
+stroke
+dfont endchar
+dfont char=53
+amove 0 90
+aline 0 272
+aline 181 272
+aline 181 181
+aline 363 181
+aline 363 454
+aline 0 454
+aline 0 909
+aline 545 909
+aline 545 727
+aline 181 727
+aline 181 636
+aline 454 636
+aline 545 545
+aline 545 90
+aline 454 0
+aline 90 0
+aline 0 90
+stroke
+dfont endchar
+dfont char=54
+amove 0 90
+aline 0 818
+aline 90 909
+aline 454 909
+aline 545 818
+aline 545 636
+aline 363 636
+aline 363 727
+aline 181 727
+aline 181 545
+aline 454 545
+aline 545 454
+aline 545 90
+aline 454 0
+aline 90 0
+aline 0 90
+amove 181 181
+aline 181 363
+aline 363 363
+aline 363 181
+aline 181 181
+stroke
+dfont endchar
+dfont char=55
+amove 90 0
+aline 363 727
+aline 0 727
+aline 0 909
+aline 545 909
+aline 545 727
+aline 272 0
+aline 90 0
+stroke
+dfont endchar
+dfont char=56
+amove 0 90
+aline 0 363
+aline 90 454
+aline 0 545
+aline 0 818
+aline 90 909
+aline 454 909
+aline 545 818
+aline 545 545
+aline 454 454
+aline 545 363
+aline 545 90
+aline 454 0
+aline 90 0
+aline 0 90
+amove 181 181
+aline 181 363
+aline 363 363
+aline 363 181
+aline 181 181
+amove 181 545
+aline 181 727
+aline 363 727
+aline 363 545
+aline 181 545
+stroke
+dfont endchar
+dfont char=57
+amove 0 90
+aline 0 272
+aline 181 272
+aline 181 181
+aline 363 181
+aline 363 363
+aline 90 363
+aline -1 454
+aline -1 818
+aline 90 909
+aline 454 909
+aline 545 818
+aline 545 90
+aline 454 0
+aline 90 0
+aline 0 90
+amove 181 545
+aline 181 727
+aline 363 727
+aline 363 545
+aline 181 545
+stroke
+dfont endchar
+dfont char=58
+amove 181 0
+aline 181 181
+aline 363 181
+aline 363 0
+aline 181 0
+amove 181 363
+aline 181 545
+aline 363 545
+aline 363 363
+aline 181 363
+stroke
+dfont endchar
+dfont char=59
+amove 90 0
+aline 181 0
+aline 181 181
+aline 363 181
+aline 363 -91
+aline 90 -91
+aline 90 -1
+amove 181 363
+aline 181 545
+aline 363 545
+aline 363 363
+aline 181 363
+stroke
+dfont endchar
+dfont char=60
+amove 454 0
+aline 0 454
+aline 454 909
+aline 454 727
+aline 181 454
+aline 454 181
+aline 454 -1
+stroke
+dfont endchar
+dfont char=61
+amove 0 272
+aline 0 363
+aline 545 363
+aline 545 272
+aline 0 272
+amove 0 545
+aline 0 636
+aline 545 636
+aline 545 545
+aline 0 545
+stroke
+dfont endchar
+dfont char=62
+amove 90 0
+aline 90 181
+aline 363 454
+aline 90 727
+aline 90 909
+aline 545 454
+aline 90 0
+stroke
+dfont endchar
+dfont char=63
+amove 181 0
+aline 181 181
+aline 363 181
+aline 363 0
+aline 181 0
+amove 181 272
+aline 181 363
+aline 363 545
+aline 363 727
+aline 181 727
+aline 181 636
+aline 0 636
+aline 0 818
+aline 90 909
+aline 454 909
+aline 545 818
+aline 545 545
+aline 363 272
+aline 181 272
+stroke
+dfont endchar
+dfont char=64
+amove 272 363
+aline 272 545
+aline 363 545
+aline 363 363
+aline 272 363
+amove 545 363
+aline 454 363
+aline 454 545
+aline 363 636
+aline 272 636
+aline 181 545
+aline 181 363
+aline 272 272
+aline 545 272
+aline 545 636
+aline 454 727
+aline 181 727
+aline 90 636
+aline 90 272
+aline 181 181
+aline 545 181
+stroke
+dfont endchar
+dfont char=65
+amove 0 0
+aline 0 818
+aline 90 909
+aline 454 909
+aline 545 818
+aline 545 0
+aline 363 0
+aline 363 363
+aline 181 363
+aline 181 0
+aline 0 0
+amove 181 545
+aline 181 727
+aline 363 727
+aline 363 545
+aline 181 545
+stroke
+dfont endchar
+dfont char=66
+amove 0 0
+aline 0 909
+aline 454 909
+aline 545 818
+aline 545 545
+aline 454 454
+aline 545 363
+aline 545 90
+aline 454 -1
+aline 0 -1
+amove 181 181
+aline 181 363
+aline 363 363
+aline 363 181
+aline 181 181
+amove 181 545
+aline 181 727
+aline 363 727
+aline 363 545
+aline 181 545
+stroke
+dfont endchar
+dfont char=67
+amove 0 90
+aline 0 818
+aline 90 909
+aline 454 909
+aline 545 818
+aline 545 636
+aline 363 636
+aline 363 727
+aline 181 727
+aline 181 181
+aline 363 181
+aline 363 272
+aline 545 272
+aline 545 90
+aline 454 0
+aline 90 0
+aline 0 90
+stroke
+dfont endchar
+dfont char=68
+amove 0 0
+aline 0 909
+aline 454 909
+aline 545 818
+aline 545 90
+aline 454 0
+aline 0 0
+amove 181 181
+aline 181 727
+aline 363 727
+aline 363 181
+aline 181 181
+stroke
+dfont endchar
+dfont char=69
+amove 0 0
+aline 0 909
+aline 545 909
+aline 545 727
+aline 181 727
+aline 181 545
+aline 363 545
+aline 363 363
+aline 181 363
+aline 181 181
+aline 545 181
+aline 545 0
+aline 0 0
+stroke
+dfont endchar
+dfont char=70
+amove 0 0
+aline 0 909
+aline 545 909
+aline 545 727
+aline 181 727
+aline 181 545
+aline 363 545
+aline 363 363
+aline 181 363
+aline 181 0
+aline 0 0
+stroke
+dfont endchar
+dfont char=71
+amove 0 90
+aline 0 818
+aline 90 909
+aline 454 909
+aline 545 818
+aline 545 636
+aline 363 636
+aline 363 727
+aline 181 727
+aline 181 181
+aline 363 181
+aline 363 363
+aline 272 363
+aline 272 545
+aline 545 545
+aline 545 90
+aline 454 0
+aline 90 0
+aline 0 90
+stroke
+dfont endchar
+dfont char=72
+amove 0 0
+aline 0 909
+aline 181 909
+aline 181 545
+aline 363 545
+aline 363 909
+aline 545 909
+aline 545 0
+aline 363 0
+aline 363 363
+aline 181 363
+aline 181 0
+aline 0 0
+stroke
+dfont endchar
+dfont char=73
+amove 181 0
+aline 181 909
+aline 363 909
+aline 363 0
+aline 181 0
+stroke
+dfont endchar
+dfont char=74
+amove 0 90
+aline 0 272
+aline 181 272
+aline 181 181
+aline 363 181
+aline 363 909
+aline 545 909
+aline 545 90
+aline 454 0
+aline 90 0
+aline 0 90
+stroke
+dfont endchar
+dfont char=75
+amove 0 0
+aline 0 909
+aline 181 909
+aline 181 545
+aline 363 727
+aline 363 909
+aline 545 909
+aline 545 636
+aline 363 454
+aline 545 272
+aline 545 0
+aline 363 0
+aline 363 181
+aline 181 363
+aline 181 0
+aline 0 0
+stroke
+dfont endchar
+dfont char=76
+amove 0 0
+aline 0 909
+aline 181 909
+aline 181 181
+aline 545 181
+aline 545 0
+aline 0 0
+stroke
+dfont endchar
+dfont char=77
+amove 0 0
+aline 0 909
+aline 181 909
+aline 272 636
+aline 363 909
+aline 545 909
+aline 545 0
+aline 363 0
+aline 363 545
+aline 272 363
+aline 181 545
+aline 181 0
+aline 0 0
+stroke
+dfont endchar
+dfont char=78
+amove 0 0
+aline 0 909
+aline 181 909
+aline 363 454
+aline 363 909
+aline 545 909
+aline 545 0
+aline 363 0
+aline 181 454
+aline 181 0
+aline 0 0
+stroke
+dfont endchar
+dfont char=79
+amove 0 90
+aline 0 818
+aline 90 909
+aline 454 909
+aline 545 818
+aline 545 90
+aline 454 0
+aline 90 0
+aline 0 90
+amove 181 181
+aline 181 727
+aline 363 727
+aline 363 181
+aline 181 181
+stroke
+dfont endchar
+dfont char=80
+amove 0 0
+aline 0 909
+aline 454 909
+aline 545 818
+aline 545 454
+aline 454 363
+aline 181 363
+aline 181 0
+aline -1 0
+amove 181 545
+aline 181 727
+aline 363 727
+aline 363 545
+aline 181 545
+stroke
+dfont endchar
+dfont char=81
+amove 181 181
+aline 181 727
+aline 363 727
+aline 363 181
+aline 181 181
+amove 454 0
+aline 90 0
+aline 0 90
+aline 0 818
+aline 90 909
+aline 454 909
+aline 545 818
+aline 545 90
+aline 636 0
+aline 545 -91
+aline 363 90
+aline 454 181
+aline 545 90
+stroke
+dfont endchar
+dfont char=82
+amove 0 0
+aline 0 909
+aline 454 909
+aline 545 818
+aline 545 545
+aline 454 454
+aline 545 363
+aline 545 0
+aline 363 0
+aline 363 272
+aline 272 363
+aline 181 363
+aline 181 0
+aline 0 0
+amove 181 545
+aline 181 727
+aline 363 727
+aline 363 545
+aline 181 545
+stroke
+dfont endchar
+dfont char=83
+amove 0 90
+aline 0 272
+aline 181 272
+aline 181 181
+aline 363 181
+aline 363 363
+aline 90 363
+aline -1 454
+aline -1 818
+aline 90 909
+aline 454 909
+aline 545 818
+aline 545 636
+aline 363 636
+aline 363 727
+aline 181 727
+aline 181 545
+aline 454 545
+aline 545 454
+aline 545 90
+aline 454 0
+aline 90 0
+aline 0 90
+stroke
+dfont endchar
+dfont char=84
+amove 181 0
+aline 181 727
+aline 0 727
+aline 0 909
+aline 545 909
+aline 545 727
+aline 363 727
+aline 363 0
+aline 181 0
+stroke
+dfont endchar
+dfont char=85
+amove 0 90
+aline 0 909
+aline 181 909
+aline 181 181
+aline 363 181
+aline 363 909
+aline 545 909
+aline 545 90
+aline 454 0
+aline 90 0
+aline 0 90
+stroke
+dfont endchar
+dfont char=86
+amove 181 0
+aline 0 272
+aline 0 909
+aline 181 909
+aline 181 363
+aline 272 181
+aline 363 363
+aline 363 909
+aline 545 909
+aline 545 272
+aline 363 0
+aline 181 0
+stroke
+dfont endchar
+dfont char=87
+amove 90 0
+aline 0 272
+aline 0 909
+aline 181 909
+aline 181 363
+aline 272 454
+aline 363 363
+aline 363 909
+aline 545 909
+aline 545 272
+aline 454 0
+aline 363 0
+aline 272 181
+aline 181 0
+aline 90 0
+stroke
+dfont endchar
+dfont char=88
+amove 0 0
+aline 0 272
+aline 181 454
+aline 0 636
+aline 0 909
+aline 181 909
+aline 181 727
+aline 272 636
+aline 363 727
+aline 363 909
+aline 545 909
+aline 545 636
+aline 363 454
+aline 545 272
+aline 545 0
+aline 363 0
+aline 363 181
+aline 272 272
+aline 181 181
+aline 181 0
+aline 0 0
+stroke
+dfont endchar
+dfont char=89
+amove 181 0
+aline 181 363
+aline 0 636
+aline 0 909
+aline 181 909
+aline 181 727
+aline 272 545
+aline 363 727
+aline 363 909
+aline 545 909
+aline 545 636
+aline 363 363
+aline 363 0
+aline 181 0
+stroke
+dfont endchar
+dfont char=90
+amove 0 0
+aline 0 272
+aline 363 727
+aline 0 727
+aline 0 909
+aline 545 909
+aline 545 636
+aline 181 181
+aline 545 181
+aline 545 0
+aline 0 0
+stroke
+dfont endchar
+dfont char=91
+amove 90 0
+aline 90 909
+aline 363 909
+aline 363 818
+aline 272 818
+aline 272 90
+aline 363 90
+aline 363 0
+aline 90 0
+stroke
+dfont endchar
+dfont char=92
+amove 363 0
+aline 0 818
+aline 0 909
+aline 181 909
+aline 545 90
+aline 545 0
+aline 363 0
+stroke
+dfont endchar
+dfont char=93
+amove 181 0
+aline 181 90
+aline 272 90
+aline 272 818
+aline 181 818
+aline 181 909
+aline 454 909
+aline 454 0
+aline 181 0
+stroke
+dfont endchar
+dfont char=94
+amove 0 272
+aline 272 636
+aline 545 272
+aline 363 272
+aline 272 363
+aline 181 272
+aline 0 272
+stroke
+dfont endchar
+dfont char=95
+amove 0 0
+aline 0 181
+aline 545 181
+aline 545 0
+aline 0 0
+stroke
+dfont endchar
+dfont char=96
+amove 272 727
+aline 90 909
+aline 181 909
+aline 363 727
+aline 272 727
+stroke
+dfont endchar
+dfont char=97
+amove 0 90
+aline 0 272
+aline 90 363
+aline 363 363
+aline 363 454
+aline 0 454
+aline 0 545
+aline 90 636
+aline 454 636
+aline 545 545
+aline 545 0
+aline 90 0
+aline 0 90
+amove 181 181
+aline 181 272
+aline 363 272
+aline 363 181
+aline 181 181
+stroke
+dfont endchar
+dfont char=98
+amove 0 0
+aline 0 909
+aline 181 909
+aline 181 545
+aline 272 636
+aline 454 636
+aline 545 545
+aline 545 90
+aline 454 0
+aline 272 0
+aline 181 90
+aline 181 0
+aline 0 0
+amove 181 181
+aline 181 454
+aline 363 454
+aline 363 181
+aline 181 181
+stroke
+dfont endchar
+dfont char=99
+amove 0 90
+aline 0 545
+aline 90 636
+aline 454 636
+aline 545 545
+aline 545 363
+aline 363 363
+aline 363 454
+aline 181 454
+aline 181 181
+aline 363 181
+aline 363 272
+aline 545 272
+aline 545 90
+aline 454 0
+aline 90 0
+aline 0 90
+stroke
+dfont endchar
+dfont char=100
+amove 0 90
+aline 0 545
+aline 90 636
+aline 272 636
+aline 363 545
+aline 363 909
+aline 545 909
+aline 545 0
+aline 363 0
+aline 363 90
+aline 272 0
+aline 90 0
+aline -1 90
+amove 181 181
+aline 181 454
+aline 363 454
+aline 363 181
+aline 181 181
+stroke
+dfont endchar
+dfont char=101
+amove 0 90
+aline 0 545
+aline 90 636
+aline 454 636
+aline 545 545
+aline 545 363
+aline 454 272
+aline 181 272
+aline 181 181
+aline 545 181
+aline 545 90
+aline 454 0
+aline 90 0
+aline 0 90
+amove 181 363
+aline 181 454
+aline 363 454
+aline 363 363
+aline 181 363
+stroke
+dfont endchar
+dfont char=102
+amove 181 0
+aline 181 545
+aline 90 545
+aline 90 636
+aline 181 636
+aline 181 818
+aline 272 909
+aline 545 909
+aline 545 818
+aline 454 818
+aline 363 727
+aline 363 636
+aline 454 636
+aline 454 545
+aline 363 545
+aline 363 0
+aline 181 0
+stroke
+dfont endchar
+dfont char=103
+amove 0 90
+aline 0 545
+aline 90 636
+aline 272 636
+aline 363 545
+aline 363 636
+aline 545 636
+aline 545 -91
+aline 363 -273
+aline 90 -273
+aline -1 -182
+aline -1 0
+aline 90 -91
+aline 272 -91
+aline 363 0
+aline 363 90
+aline 272 0
+aline 90 0
+aline -1 90
+amove 181 181
+aline 181 454
+aline 363 454
+aline 363 181
+aline 181 181
+stroke
+dfont endchar
+dfont char=104
+amove 0 0
+aline 0 909
+aline 181 909
+aline 181 545
+aline 272 636
+aline 454 636
+aline 545 545
+aline 545 0
+aline 363 0
+aline 363 454
+aline 272 454
+aline 181 363
+aline 181 0
+aline 0 0
+stroke
+dfont endchar
+dfont char=105
+amove 181 0
+aline 181 636
+aline 363 636
+aline 363 0
+aline 181 0
+amove 181 727
+aline 181 909
+aline 363 909
+aline 363 727
+aline 181 727
+stroke
+dfont endchar
+dfont char=106
+amove 0 0
+aline 90 -91
+aline 272 -91
+aline 363 0
+aline 363 636
+aline 545 636
+aline 545 -91
+aline 363 -273
+aline 90 -273
+aline -1 -182
+aline -1 -1
+amove 363 727
+aline 363 909
+aline 545 909
+aline 545 727
+aline 363 727
+stroke
+dfont endchar
+dfont char=107
+amove 0 0
+aline 0 909
+aline 181 909
+aline 181 545
+aline 272 636
+aline 454 636
+aline 545 545
+aline 545 363
+aline 454 272
+aline 545 0
+aline 363 0
+aline 272 272
+aline 181 272
+aline 181 0
+aline 0 0
+amove 181 363
+aline 181 454
+aline 363 454
+aline 363 363
+aline 181 363
+stroke
+dfont endchar
+dfont char=108
+amove 181 90
+aline 181 909
+aline 363 909
+aline 363 90
+aline 454 90
+aline 454 0
+aline 272 0
+aline 181 90
+stroke
+dfont endchar
+dfont char=109
+amove 0 0
+aline 0 636
+aline 181 636
+aline 181 545
+aline 272 636
+aline 363 545
+aline 454 636
+aline 545 636
+aline 545 0
+aline 363 0
+aline 363 454
+amove 181 454
+aline 181 0
+aline 0 0
+amove 181 0
+aline 363 0
+stroke
+dfont endchar
+dfont char=110
+amove 0 0
+aline 0 636
+aline 181 636
+aline 181 545
+aline 272 636
+aline 454 636
+aline 545 545
+aline 545 0
+aline 363 0
+aline 363 454
+aline 181 454
+aline 181 0
+aline 0 0
+stroke
+dfont endchar
+dfont char=111
+amove 0 90
+aline 0 545
+aline 90 636
+aline 454 636
+aline 545 545
+aline 545 90
+aline 454 0
+aline 90 0
+aline 0 90
+amove 181 181
+aline 181 454
+aline 363 454
+aline 363 181
+aline 181 181
+stroke
+dfont endchar
+dfont char=112
+amove 181 90
+aline 181 -273
+aline 0 -273
+aline 0 636
+aline 181 636
+aline 181 545
+aline 272 636
+aline 454 636
+aline 545 545
+aline 545 90
+aline 454 0
+aline 272 0
+aline 181 90
+amove 181 181
+aline 181 454
+aline 363 454
+aline 363 181
+aline 181 181
+stroke
+dfont endchar
+dfont char=113
+amove 0 90
+aline 0 545
+aline 90 636
+aline 272 636
+aline 363 545
+aline 363 636
+aline 545 636
+aline 545 -91
+aline 636 -91
+aline 636 -182
+aline 545 -182
+aline 545 -273
+aline 363 -273
+aline 363 -182
+aline 272 -182
+aline 272 -91
+aline 363 -91
+aline 363 90
+aline 272 0
+aline 90 0
+aline -1 90
+amove 181 181
+aline 181 454
+aline 363 454
+aline 363 181
+aline 181 181
+stroke
+dfont endchar
+dfont char=114
+amove 0 0
+aline 0 636
+aline 181 636
+aline 181 545
+aline 272 636
+aline 454 636
+aline 454 454
+aline 272 454
+aline 181 363
+aline 181 0
+aline 0 0
+stroke
+dfont endchar
+dfont char=115
+amove 0 90
+aline 0 181
+aline 363 181
+aline 363 272
+aline 90 272
+aline -1 363
+aline -1 545
+aline 90 636
+aline 454 636
+aline 545 545
+aline 545 454
+aline 181 454
+aline 181 363
+aline 454 363
+aline 545 272
+aline 545 90
+aline 454 0
+aline 90 0
+aline 0 90
+stroke
+dfont endchar
+dfont char=116
+amove 181 90
+aline 181 636
+aline 90 636
+aline 90 727
+aline 181 727
+aline 181 909
+aline 363 909
+aline 363 727
+aline 454 727
+aline 454 636
+aline 363 636
+aline 363 90
+aline 454 90
+aline 454 0
+aline 272 0
+aline 181 90
+stroke
+dfont endchar
+dfont char=117
+amove 0 90
+aline 0 636
+aline 181 636
+aline 181 181
+aline 363 181
+aline 363 636
+aline 545 636
+aline 545 0
+aline 363 0
+aline 363 90
+aline 272 0
+aline 90 0
+aline -1 90
+stroke
+dfont endchar
+dfont char=118
+amove 272 0
+aline 0 272
+aline 0 636
+aline 181 636
+aline 181 363
+aline 272 272
+aline 363 363
+aline 363 636
+aline 545 636
+aline 545 272
+aline 272 0
+stroke
+dfont endchar
+dfont char=119
+amove 181 0
+aline 0 272
+aline 0 636
+aline 181 636
+aline 181 272
+aline 272 363
+aline 363 272
+aline 363 636
+aline 545 636
+aline 545 272
+aline 363 0
+aline 272 181
+aline 181 0
+stroke
+dfont endchar
+dfont char=120
+amove 0 0
+aline 0 181
+aline 90 272
+aline 90 363
+aline 0 454
+aline 0 636
+aline 181 636
+aline 181 454
+aline 272 363
+aline 363 454
+aline 363 636
+aline 545 636
+aline 545 454
+aline 454 363
+aline 454 272
+aline 545 181
+aline 545 0
+aline 363 0
+aline 363 181
+aline 272 272
+aline 181 181
+aline 181 0
+aline 0 0
+stroke
+dfont endchar
+dfont char=121
+amove 0 0
+aline 90 -91
+aline 272 -91
+aline 363 0
+aline 363 90
+aline 272 0
+aline 90 0
+aline -1 90
+aline -1 636
+aline 181 636
+aline 181 181
+aline 363 181
+aline 363 636
+aline 545 636
+aline 545 -91
+aline 363 -273
+aline 90 -273
+aline -1 -182
+aline -1 -1
+stroke
+dfont endchar
+dfont char=122
+amove 0 0
+aline 0 181
+aline 272 454
+aline 0 454
+aline 0 636
+aline 545 636
+aline 545 454
+aline 272 181
+aline 545 181
+aline 545 0
+aline 0 0
+stroke
+dfont endchar
+dfont char=123
+amove 272 0
+aline 181 90
+aline 181 363
+aline 0 454
+aline 181 545
+aline 181 818
+aline 272 909
+aline 454 909
+aline 454 818
+aline 363 818
+aline 272 727
+aline 272 181
+aline 363 90
+aline 454 90
+aline 454 0
+aline 272 0
+stroke
+dfont endchar
+dfont char=124
+amove 181 0
+aline 181 363
+aline 363 363
+aline 363 0
+aline 181 0
+amove 181 545
+aline 181 909
+aline 363 909
+aline 363 545
+aline 181 545
+stroke
+dfont endchar
+dfont char=125
+amove 90 0
+aline 90 90
+aline 181 90
+aline 272 181
+aline 272 727
+aline 181 818
+aline 90 818
+aline 90 909
+aline 272 909
+aline 363 818
+aline 363 545
+aline 545 454
+aline 363 363
+aline 363 90
+aline 272 -1
+aline 90 -1
+stroke
+dfont endchar
+dfont char=126
+amove 0 363
+aline 0 545
+aline 90 636
+aline 181 636
+aline 363 454
+aline 454 454
+aline 545 545
+aline 545 363
+aline 454 272
+aline 363 272
+aline 181 454
+aline 90 454
+aline 0 363
+stroke
+dfont endchar
+dfont char=127
+amove 272 181
+aline 0 454
+aline 272 727
+aline 272 545
+aline 545 545
+aline 545 363
+aline 272 363
+aline 272 181
+stroke
+dfont endchar
diff --git a/src/fonts/plcc.afm b/src/fonts/plcc.afm
new file mode 100644
index 0000000..1876352
--- /dev/null
+++ b/src/fonts/plcc.afm
@@ -0,0 +1,115 @@
+StartFontMetrics 2.0
+Comment Made from HERSHEY font file using SPLITFONT.BAS
+FontName plCC
+EncodingScheme TEXENCODING
+FullName plCC
+FamilyName plCC
+Weight Medium
+ItalicAngle 0
+IsFixedPitch false
+UnderlinePosition -97
+UnderlineThickness 73
+FontBBox 0 -400 1001 1001
+CapHeight 729
+XHeight 151
+Descender -219
+Ascender 729
+StartCharMetrics 95
+C 32 ; WX 400 ; N C32 ; B 0 0 0 0 ;
+C 33 ; WX 318 ; N C33 ; B 133 0 199 700 ;
+C 34 ; WX 518 ; N C34 ; B 99 466 433 700 ;
+C 35 ; WX 784 ; N C35 ; B 133 0 666 566 ;
+C 36 ; WX 518 ; N C36 ; B 99 299 433 700 ;
+C 37 ; WX 784 ; N C37 ; B 99 0 700 700 ;
+C 38 ; WX 784 ; N C38 ; B 133 0 666 566 ;
+C 39 ; WX 251 ; N C39 ; B 99 466 166 700 ;
+C 40 ; WX 451 ; N C40 ; B 133 -233 366 833 ;
+C 41 ; WX 451 ; N C41 ; B 99 -233 333 833 ;
+C 42 ; WX 451 ; N C42 ; B 133 -233 366 833 ;
+C 43 ; WX 485 ; N C43 ; B 166 -233 333 833 ;
+C 44 ; WX 318 ; N C44 ; B 133 -133 199 66 ;
+C 45 ; WX 451 ; N C45 ; B 99 -233 333 833 ;
+C 46 ; WX 318 ; N C46 ; B 133 0 199 66 ;
+C 47 ; WX 718 ; N C47 ; B 66 -233 666 833 ;
+C 48 ; WX 651 ; N C48 ; B 99 0 566 700 ;
+C 49 ; WX 651 ; N C49 ; B 199 0 500 700 ;
+C 50 ; WX 651 ; N C50 ; B 99 0 566 700 ;
+C 51 ; WX 651 ; N C51 ; B 99 0 566 700 ;
+C 52 ; WX 651 ; N C52 ; B 66 0 600 700 ;
+C 53 ; WX 651 ; N C53 ; B 99 0 566 700 ;
+C 54 ; WX 651 ; N C54 ; B 99 0 566 700 ;
+C 55 ; WX 651 ; N C55 ; B 99 0 566 699 ;
+C 56 ; WX 651 ; N C56 ; B 99 0 566 700 ;
+C 57 ; WX 651 ; N C57 ; B 99 0 566 700 ;
+C 58 ; WX 318 ; N C58 ; B 133 0 199 466 ;
+C 59 ; WX 318 ; N C59 ; B 133 -133 199 466 ;
+C 60 ; WX 784 ; N C60 ; B 133 0 666 600 ;
+C 61 ; WX 485 ; N C61 ; B 166 -233 333 833 ;
+C 62 ; WX 784 ; N C62 ; B 133 0 666 600 ;
+C 63 ; WX 585 ; N C63 ; B 99 0 500 700 ;
+C 64 ; WX 884 ; N C64 ; B 99 0 799 700 ;
+C 65 ; WX 651 ; N C65 ; B 32 0 633 700 ;
+C 66 ; WX 718 ; N C66 ; B 66 0 633 700 ;
+C 67 ; WX 718 ; N C67 ; B 66 0 633 700 ;
+C 68 ; WX 585 ; N C68 ; B 66 0 566 700 ;
+C 69 ; WX 784 ; N C69 ; B 32 -233 733 700 ;
+C 70 ; WX 685 ; N C70 ; B 66 0 600 700 ;
+C 71 ; WX 1018 ; N C71 ; B 66 0 966 700 ;
+C 72 ; WX 651 ; N C72 ; B 99 0 566 700 ;
+C 73 ; WX 784 ; N C73 ; B 66 0 733 700 ;
+C 74 ; WX 784 ; N C74 ; B 66 0 733 933 ;
+C 75 ; WX 784 ; N C75 ; B 66 0 733 700 ;
+C 76 ; WX 818 ; N C76 ; B 66 0 766 700 ;
+C 77 ; WX 818 ; N C77 ; B 66 0 766 700 ;
+C 78 ; WX 784 ; N C78 ; B 66 0 733 700 ;
+C 79 ; WX 718 ; N C79 ; B 99 0 633 700 ;
+C 80 ; WX 784 ; N C80 ; B 66 0 733 700 ;
+C 81 ; WX 718 ; N C81 ; B 66 0 633 700 ;
+C 82 ; WX 685 ; N C82 ; B 99 0 600 700 ;
+C 83 ; WX 618 ; N C83 ; B 66 0 566 700 ;
+C 84 ; WX 685 ; N C84 ; B 32 0 666 700 ;
+C 85 ; WX 818 ; N C85 ; B 99 0 733 700 ;
+C 86 ; WX 651 ; N C86 ; B 32 0 633 700 ;
+C 87 ; WX 784 ; N C87 ; B 66 -233 733 700 ;
+C 88 ; WX 751 ; N C88 ; B 66 0 700 700 ;
+C 89 ; WX 1085 ; N C89 ; B 66 0 1033 700 ;
+C 90 ; WX 1085 ; N C90 ; B 66 -233 1033 700 ;
+C 91 ; WX 451 ; N C91 ; B 133 -233 366 833 ;
+C 92 ; WX 300 ; N C92 ; B 0 0 0 0 ;
+C 93 ; WX 451 ; N C93 ; B 99 -233 333 833 ;
+C 94 ; WX 300 ; N C94 ; B 0 0 0 0 ;
+C 95 ; WX 300 ; N C95 ; B 0 0 0 0 ;
+C 96 ; WX 318 ; N C96 ; B 133 500 199 700 ;
+C 97 ; WX 651 ; N C97 ; B 99 0 600 466 ;
+C 98 ; WX 651 ; N C98 ; B 99 0 566 700 ;
+C 99 ; WX 651 ; N C99 ; B 66 0 566 466 ;
+C 100 ; WX 585 ; N C100 ; B 66 0 532 466 ;
+C 101 ; WX 751 ; N C101 ; B 66 -167 700 466 ;
+C 102 ; WX 618 ; N C102 ; B 99 0 532 466 ;
+C 103 ; WX 884 ; N C103 ; B 66 0 833 466 ;
+C 104 ; WX 585 ; N C104 ; B 99 0 500 466 ;
+C 105 ; WX 718 ; N C105 ; B 66 0 666 466 ;
+C 106 ; WX 718 ; N C106 ; B 66 0 666 700 ;
+C 107 ; WX 651 ; N C107 ; B 66 0 600 466 ;
+C 108 ; WX 718 ; N C108 ; B 66 0 666 466 ;
+C 109 ; WX 751 ; N C109 ; B 66 0 700 466 ;
+C 110 ; WX 718 ; N C110 ; B 66 0 666 466 ;
+C 111 ; WX 651 ; N C111 ; B 99 0 566 466 ;
+C 112 ; WX 718 ; N C112 ; B 66 0 666 466 ;
+C 113 ; WX 685 ; N C113 ; B 66 -233 600 466 ;
+C 114 ; WX 618 ; N C114 ; B 99 0 532 466 ;
+C 115 ; WX 618 ; N C115 ; B 99 0 532 466 ;
+C 116 ; WX 585 ; N C116 ; B 32 -233 566 466 ;
+C 117 ; WX 685 ; N C117 ; B 99 -233 600 700 ;
+C 118 ; WX 651 ; N C118 ; B 66 0 600 466 ;
+C 119 ; WX 718 ; N C119 ; B 66 -167 666 466 ;
+C 120 ; WX 718 ; N C120 ; B 66 0 666 466 ;
+C 121 ; WX 1018 ; N C121 ; B 66 0 966 466 ;
+C 122 ; WX 1018 ; N C122 ; B 66 -167 966 466 ;
+C 123 ; WX 485 ; N C123 ; B 166 -233 333 833 ;
+C 124 ; WX 451 ; N C124 ; B 133 -233 366 833 ;
+C 125 ; WX 485 ; N C125 ; B 166 -233 333 833 ;
+C 126 ; WX 451 ; N C126 ; B 99 433 366 700 ;
+EndCharMetrics
+
+EndFontMetrics
diff --git a/src/fonts/plcc.gle b/src/fonts/plcc.gle
new file mode 100644
index 0000000..e2adbc8
--- /dev/null
+++ b/src/fonts/plcc.gle
@@ -0,0 +1,2257 @@
+dfont design= 1428
+dfont char=33
+amove 238 1000
+aline 190 904
+aline 238 333
+aline 285 904
+aline 238 1000
+amove 238 904
+aline 238 619
+amove 238 95
+aline 190 47
+aline 238 0
+aline 285 47
+aline 238 95
+stroke
+dfont endchar
+dfont char=34
+amove 142 666
+aline 190 1000
+amove 238 1000
+aline 142 666
+amove 523 666
+aline 571 1000
+amove 619 1000
+aline 523 666
+stroke
+dfont endchar
+dfont char=35
+amove 190 0
+aline 952 0
+amove 571 0
+aline 571 809
+amove 190 428
+aline 952 428
+stroke
+dfont endchar
+dfont char=36
+amove 380 428
+aline 380 1000
+amove 142 857
+aline 619 571
+amove 619 857
+aline 142 571
+stroke
+dfont endchar
+dfont char=37
+amove 142 0
+aline 1000 1000
+aline 904 952
+aline 761 904
+aline 619 904
+aline 476 952
+aline 380 1000
+aline 285 1000
+aline 190 952
+aline 142 857
+aline 142 761
+aline 238 666
+aline 333 666
+aline 428 714
+aline 476 809
+aline 476 904
+aline 380 1000
+amove 809 333
+aline 714 285
+aline 666 190
+aline 666 95
+aline 761 0
+aline 857 0
+aline 952 47
+aline 1000 142
+aline 1000 238
+aline 904 333
+aline 809 333
+stroke
+dfont endchar
+dfont char=38
+amove 190 428
+aline 952 428
+amove 952 809
+aline 190 809
+amove 571 809
+aline 571 0
+stroke
+dfont endchar
+dfont char=39
+amove 142 666
+aline 190 1000
+amove 238 1000
+aline 142 666
+stroke
+dfont endchar
+dfont char=40
+amove 428 -239
+aline 333 -48
+aline 285 95
+aline 238 333
+aline 238 523
+aline 285 761
+aline 333 904
+aline 428 1095
+amove 523 1190
+aline 428 1095
+aline 333 952
+aline 238 761
+aline 190 523
+aline 190 333
+aline 238 95
+aline 333 -96
+aline 428 -239
+aline 523 -334
+stroke
+dfont endchar
+dfont char=41
+amove 238 -239
+aline 333 -48
+aline 380 95
+aline 428 333
+aline 428 523
+aline 380 761
+aline 333 904
+aline 238 1095
+amove 142 1190
+aline 238 1095
+aline 333 952
+aline 428 761
+aline 476 523
+aline 476 333
+aline 428 95
+aline 333 -96
+aline 238 -239
+aline 142 -334
+stroke
+dfont endchar
+dfont char=42
+amove 190 -334
+aline 523 428
+aline 190 1190
+stroke
+dfont endchar
+dfont char=43
+amove 380 238
+aline 333 95
+aline 333 -96
+aline 380 -239
+amove 476 -334
+aline 333 -191
+aline 285 -48
+aline 285 47
+aline 333 190
+aline 428 285
+aline 428 333
+aline 238 428
+aline 428 523
+aline 428 571
+aline 333 666
+aline 285 809
+aline 285 904
+aline 333 1047
+aline 476 1190
+amove 380 1095
+aline 333 952
+aline 333 761
+aline 380 619
+stroke
+dfont endchar
+dfont char=44
+amove 238 0
+aline 190 47
+aline 238 95
+aline 285 47
+aline 285 -48
+aline 238 -143
+aline 190 -191
+stroke
+dfont endchar
+dfont char=45
+amove 142 -334
+aline 476 -334
+aline 476 1190
+aline 142 1190
+amove 428 1190
+aline 428 -334
+stroke
+dfont endchar
+dfont char=46
+amove 238 95
+aline 190 47
+aline 238 0
+aline 285 47
+aline 238 95
+stroke
+dfont endchar
+dfont char=47
+amove 95 -334
+aline 952 1190
+stroke
+dfont endchar
+dfont char=48
+amove 428 0
+aline 333 47
+aline 285 95
+aline 238 190
+aline 190 428
+aline 190 571
+aline 238 809
+aline 285 904
+aline 333 952
+aline 428 1000
+aline 523 1000
+aline 666 952
+aline 761 809
+aline 809 571
+aline 809 428
+aline 761 190
+aline 666 47
+aline 523 0
+aline 428 0
+aline 285 47
+aline 190 190
+aline 142 428
+aline 142 571
+aline 190 809
+aline 285 952
+aline 428 1000
+amove 523 1000
+aline 619 952
+aline 666 904
+aline 714 809
+aline 761 571
+aline 761 428
+aline 714 190
+aline 666 95
+aline 619 47
+aline 523 0
+stroke
+dfont endchar
+dfont char=49
+amove 285 0
+aline 714 0
+amove 523 0
+aline 523 1000
+aline 380 857
+aline 285 809
+amove 476 952
+aline 476 0
+stroke
+dfont endchar
+dfont char=50
+amove 142 0
+aline 142 142
+aline 190 285
+aline 285 380
+aline 380 428
+aline 619 523
+aline 761 619
+aline 809 714
+aline 809 809
+aline 761 904
+aline 714 952
+aline 571 1000
+aline 380 1000
+aline 238 952
+aline 190 904
+aline 142 809
+aline 142 761
+aline 190 714
+aline 238 761
+aline 190 809
+amove 571 1000
+aline 666 952
+aline 714 904
+aline 761 809
+aline 761 714
+aline 714 619
+aline 571 523
+aline 380 428
+amove 285 142
+aline 523 0
+aline 714 0
+aline 761 47
+aline 809 142
+aline 809 238
+amove 809 142
+aline 761 95
+aline 666 47
+aline 523 47
+aline 285 142
+aline 190 142
+aline 142 95
+stroke
+dfont endchar
+dfont char=51
+amove 190 190
+aline 238 238
+aline 190 285
+aline 142 238
+aline 142 190
+aline 190 95
+aline 238 47
+aline 380 0
+aline 571 0
+aline 714 47
+aline 761 95
+aline 809 190
+aline 809 333
+aline 761 428
+aline 666 523
+aline 571 571
+aline 666 619
+aline 714 714
+aline 714 857
+aline 666 952
+aline 571 1000
+amove 190 809
+aline 238 761
+aline 190 714
+aline 142 761
+aline 142 809
+aline 190 904
+aline 238 952
+aline 380 1000
+aline 571 1000
+aline 714 952
+aline 761 857
+aline 761 714
+aline 714 619
+aline 571 571
+aline 428 571
+amove 714 476
+aline 761 333
+aline 761 190
+aline 714 95
+aline 666 47
+aline 571 -1
+stroke
+dfont endchar
+dfont char=52
+amove 428 0
+aline 761 0
+amove 619 0
+aline 619 1000
+aline 95 285
+aline 857 285
+amove 571 0
+aline 571 904
+stroke
+dfont endchar
+dfont char=53
+amove 190 190
+aline 238 238
+aline 190 285
+aline 142 238
+aline 142 190
+aline 190 95
+aline 238 47
+aline 380 0
+aline 523 0
+aline 666 47
+aline 761 142
+aline 809 285
+aline 809 380
+aline 761 523
+aline 666 619
+aline 523 666
+aline 380 666
+aline 238 619
+aline 142 523
+aline 238 1000
+aline 714 1000
+aline 476 952
+aline 238 952
+amove 523 666
+aline 619 619
+aline 714 523
+aline 761 380
+aline 761 285
+aline 714 142
+aline 619 47
+aline 523 0
+stroke
+dfont endchar
+dfont char=54
+amove 190 333
+aline 238 476
+aline 333 571
+aline 476 619
+aline 523 619
+aline 666 571
+aline 761 476
+aline 809 333
+aline 809 285
+aline 761 142
+aline 666 47
+aline 523 -1
+aline 428 -1
+aline 285 47
+aline 190 142
+aline 142 285
+aline 142 571
+aline 190 761
+aline 238 857
+aline 333 952
+aline 476 1000
+aline 619 1000
+aline 714 952
+aline 761 857
+aline 761 809
+aline 714 761
+aline 666 809
+aline 714 857
+amove 476 1000
+aline 380 952
+aline 285 857
+aline 238 761
+aline 190 571
+aline 190 285
+aline 238 142
+aline 333 47
+aline 428 0
+amove 523 0
+aline 619 47
+aline 714 142
+aline 761 285
+aline 761 333
+aline 714 476
+aline 619 571
+aline 523 619
+stroke
+dfont endchar
+dfont char=55
+amove 428 0
+aline 428 238
+aline 476 380
+aline 523 476
+aline 761 714
+amove 619 857
+aline 380 952
+aline 285 952
+aline 190 904
+amove 142 999
+aline 142 714
+amove 142 809
+aline 190 904
+aline 285 999
+aline 380 999
+aline 619 857
+aline 714 857
+aline 761 904
+aline 809 999
+aline 809 857
+aline 761 714
+aline 571 476
+aline 523 380
+aline 476 238
+aline 476 -1
+stroke
+dfont endchar
+dfont char=56
+amove 380 0
+aline 285 47
+aline 238 95
+aline 190 190
+aline 190 380
+aline 238 476
+aline 285 523
+aline 380 571
+aline 285 619
+aline 238 714
+aline 238 857
+aline 285 952
+aline 380 1000
+aline 571 1000
+aline 714 952
+aline 761 857
+aline 761 714
+aline 714 619
+aline 571 571
+aline 380 571
+aline 238 619
+aline 190 714
+aline 190 857
+aline 238 952
+aline 380 1000
+amove 571 1000
+aline 666 952
+aline 714 857
+aline 714 714
+aline 666 619
+aline 571 571
+aline 714 523
+aline 761 476
+aline 809 380
+aline 809 190
+aline 761 95
+aline 714 47
+aline 571 -1
+aline 380 -1
+aline 238 47
+aline 190 95
+aline 142 190
+aline 142 380
+aline 190 476
+aline 238 523
+aline 380 571
+amove 571 571
+aline 666 523
+aline 714 476
+aline 761 380
+aline 761 190
+aline 714 95
+aline 666 47
+aline 571 -1
+stroke
+dfont endchar
+dfont char=57
+amove 761 666
+aline 714 523
+aline 619 428
+aline 476 380
+aline 428 380
+aline 285 428
+aline 190 523
+aline 142 666
+aline 142 714
+aline 190 857
+aline 285 952
+aline 428 1000
+aline 523 1000
+aline 666 952
+aline 761 857
+aline 809 714
+aline 809 428
+aline 761 238
+aline 714 142
+aline 619 47
+aline 476 0
+aline 333 0
+aline 238 47
+aline 190 142
+aline 190 190
+aline 238 238
+aline 285 190
+aline 238 142
+amove 428 380
+aline 333 428
+aline 238 523
+aline 190 666
+aline 190 714
+aline 238 857
+aline 333 952
+aline 428 1000
+amove 523 1000
+aline 619 952
+aline 714 857
+aline 761 714
+aline 761 428
+aline 714 238
+aline 666 142
+aline 571 47
+aline 476 0
+stroke
+dfont endchar
+dfont char=58
+amove 238 666
+aline 190 619
+aline 238 571
+aline 285 619
+aline 238 666
+amove 238 95
+aline 190 47
+aline 238 -1
+aline 285 47
+aline 238 95
+stroke
+dfont endchar
+dfont char=59
+amove 238 666
+aline 190 619
+aline 238 571
+aline 285 619
+aline 238 666
+amove 238 0
+aline 190 47
+aline 238 95
+aline 285 47
+aline 285 -48
+aline 238 -143
+aline 190 -191
+stroke
+dfont endchar
+dfont char=60
+amove 952 857
+aline 190 428
+aline 952 0
+stroke
+dfont endchar
+dfont char=61
+amove 238 -334
+aline 380 -191
+aline 428 -48
+aline 428 47
+aline 380 190
+aline 285 285
+aline 285 333
+aline 476 428
+aline 285 523
+aline 285 571
+aline 380 666
+aline 428 809
+aline 428 904
+aline 380 1047
+aline 238 1190
+amove 333 1095
+aline 380 952
+aline 380 761
+aline 333 619
+amove 333 238
+aline 380 95
+aline 380 -96
+aline 333 -239
+stroke
+dfont endchar
+dfont char=62
+amove 190 0
+aline 952 428
+aline 190 857
+stroke
+dfont endchar
+dfont char=63
+amove 428 95
+aline 380 47
+aline 428 0
+aline 476 47
+aline 428 95
+amove 428 333
+aline 428 476
+aline 619 571
+aline 666 619
+aline 714 714
+aline 714 809
+aline 666 904
+aline 619 952
+aline 476 1000
+aline 333 1000
+aline 238 952
+aline 190 904
+aline 142 809
+aline 142 761
+aline 190 714
+aline 238 761
+aline 190 809
+amove 476 1000
+aline 571 952
+aline 619 904
+aline 666 809
+aline 666 714
+aline 619 619
+aline 523 523
+stroke
+dfont endchar
+dfont char=64
+amove 523 238
+aline 476 285
+aline 428 380
+aline 428 523
+aline 476 666
+aline 571 761
+amove 857 761
+aline 809 380
+aline 809 285
+aline 904 238
+aline 999 238
+aline 1095 333
+aline 1142 476
+aline 1142 571
+aline 1095 714
+aline 1047 809
+aline 952 904
+aline 857 952
+aline 714 1000
+aline 571 1000
+aline 428 952
+aline 333 904
+aline 238 809
+aline 190 714
+aline 142 571
+aline 142 428
+aline 190 285
+aline 238 190
+aline 333 95
+aline 428 47
+aline 571 0
+aline 714 0
+aline 857 47
+aline 952 95
+aline 1000 142
+amove 904 238
+aline 857 285
+aline 857 380
+aline 904 761
+amove 857 619
+aline 809 714
+aline 714 761
+aline 571 761
+aline 476 714
+aline 428 666
+aline 380 523
+aline 380 380
+aline 428 285
+aline 523 238
+aline 666 238
+aline 761 285
+aline 809 380
+stroke
+dfont endchar
+dfont char=65
+amove 47 0
+aline 333 0
+amove 142 0
+aline 476 1000
+aline 809 0
+amove 761 0
+aline 476 857
+amove 666 285
+aline 238 285
+amove 619 0
+aline 904 0
+stroke
+dfont endchar
+dfont char=66
+amove 95 0
+aline 666 0
+aline 809 47
+aline 857 95
+aline 904 190
+aline 904 333
+aline 857 428
+aline 809 476
+aline 666 523
+aline 285 523
+amove 666 523
+aline 761 476
+aline 809 428
+aline 857 333
+aline 857 190
+aline 809 95
+aline 761 47
+aline 666 0
+amove 285 0
+aline 285 1000
+amove 238 1000
+aline 238 0
+amove 95 1000
+aline 857 1000
+aline 857 714
+aline 809 1000
+stroke
+dfont endchar
+dfont char=67
+amove 95 0
+aline 666 0
+aline 809 47
+aline 857 95
+aline 904 190
+aline 904 333
+aline 857 428
+aline 809 476
+aline 666 523
+aline 285 523
+amove 666 523
+aline 809 571
+aline 857 619
+aline 904 714
+aline 904 809
+aline 857 904
+aline 809 952
+aline 666 1000
+aline 95 1000
+amove 238 1000
+aline 238 0
+amove 285 0
+aline 285 1000
+amove 666 1000
+aline 761 952
+aline 809 904
+aline 857 809
+aline 857 714
+aline 809 619
+aline 761 571
+aline 666 523
+aline 761 476
+aline 809 428
+aline 857 333
+aline 857 190
+aline 809 95
+aline 761 47
+aline 666 0
+stroke
+dfont endchar
+dfont char=68
+amove 95 0
+aline 428 0
+amove 285 0
+aline 285 1000
+amove 238 1000
+aline 238 0
+amove 95 1000
+aline 809 1000
+aline 809 714
+aline 761 1000
+stroke
+dfont endchar
+dfont char=69
+amove 47 0
+aline 47 -334
+aline 95 0
+amove 47 0
+aline 1047 0
+aline 1047 -334
+aline 1000 0
+amove 904 0
+aline 904 1000
+amove 857 1000
+aline 857 0
+amove 190 0
+aline 238 47
+aline 285 142
+aline 333 333
+aline 380 714
+aline 380 1000
+amove 238 1000
+aline 1047 1000
+stroke
+dfont endchar
+dfont char=70
+amove 95 0
+aline 857 0
+aline 857 285
+aline 809 0
+amove 571 333
+aline 571 714
+amove 571 523
+aline 285 523
+amove 285 1000
+aline 285 0
+amove 238 0
+aline 238 1000
+amove 95 1000
+aline 857 1000
+aline 857 714
+aline 809 1000
+stroke
+dfont endchar
+dfont char=71
+amove 95 142
+aline 142 47
+aline 190 0
+aline 285 0
+aline 333 47
+aline 380 142
+aline 428 380
+aline 476 476
+aline 523 523
+aline 428 476
+aline 380 380
+aline 333 142
+aline 285 47
+aline 238 0
+amove 571 0
+aline 904 0
+amove 761 0
+aline 761 1000
+amove 714 1000
+aline 714 0
+amove 1238 0
+aline 1190 47
+aline 1142 142
+aline 1095 380
+aline 1047 476
+aline 952 523
+aline 1000 476
+aline 1047 380
+aline 1095 142
+aline 1142 47
+aline 1190 0
+aline 1285 0
+aline 1333 47
+aline 1380 142
+amove 1285 952
+aline 1238 904
+aline 1285 857
+aline 1333 904
+aline 1333 952
+aline 1285 1000
+aline 1238 1000
+aline 1190 952
+aline 1142 857
+aline 1095 666
+aline 1047 571
+aline 952 523
+aline 523 523
+aline 428 571
+aline 380 666
+aline 333 857
+aline 285 952
+aline 238 1000
+aline 190 1000
+aline 142 952
+aline 142 904
+aline 190 857
+aline 238 904
+aline 190 952
+amove 571 1000
+aline 904 1000
+stroke
+dfont endchar
+dfont char=72
+amove 190 190
+aline 238 238
+aline 190 285
+aline 142 238
+aline 142 190
+aline 190 95
+aline 238 47
+aline 333 0
+aline 571 0
+aline 714 47
+aline 761 95
+aline 809 190
+aline 809 333
+aline 761 428
+aline 666 523
+aline 571 571
+aline 666 619
+aline 714 714
+aline 714 857
+aline 666 952
+aline 571 1000
+amove 190 857
+aline 142 1000
+aline 142 714
+aline 190 857
+aline 285 952
+aline 380 1000
+aline 571 1000
+aline 714 952
+aline 761 857
+aline 761 714
+aline 714 619
+aline 571 571
+aline 428 571
+amove 714 476
+aline 761 333
+aline 761 190
+aline 714 95
+aline 666 47
+aline 571 -1
+stroke
+dfont endchar
+dfont char=73
+amove 95 0
+aline 428 0
+amove 285 0
+aline 285 1000
+amove 238 1000
+aline 238 0
+amove 285 95
+aline 857 904
+amove 857 1000
+aline 857 0
+amove 904 0
+aline 904 1000
+amove 1047 1000
+aline 714 1000
+amove 428 1000
+aline 95 1000
+amove 714 0
+aline 1047 0
+stroke
+dfont endchar
+dfont char=74
+amove 95 0
+aline 428 0
+amove 285 0
+aline 285 1000
+amove 238 1000
+aline 238 0
+amove 285 95
+aline 857 904
+amove 857 1000
+aline 857 0
+amove 904 0
+aline 904 1000
+amove 1047 1000
+aline 714 1000
+amove 428 1000
+aline 95 1000
+amove 380 1285
+aline 380 1333
+aline 333 1333
+aline 333 1285
+aline 380 1190
+aline 476 1142
+aline 666 1142
+aline 761 1190
+aline 809 1285
+amove 714 0
+aline 1047 0
+stroke
+dfont endchar
+dfont char=75
+amove 95 0
+aline 428 0
+amove 285 0
+aline 285 1000
+amove 238 1000
+aline 238 0
+amove 285 523
+aline 619 523
+aline 714 571
+aline 761 666
+aline 809 857
+aline 857 952
+aline 904 1000
+aline 952 1000
+aline 1000 952
+aline 1000 904
+aline 952 857
+aline 904 904
+aline 952 952
+amove 428 1000
+aline 95 1000
+amove 619 523
+aline 714 476
+aline 761 380
+aline 809 142
+aline 857 47
+aline 904 0
+amove 1047 142
+aline 1000 47
+aline 952 0
+aline 857 0
+aline 809 47
+aline 761 142
+aline 714 380
+aline 666 476
+aline 619 523
+stroke
+dfont endchar
+dfont char=76
+amove 142 47
+aline 190 95
+aline 142 142
+aline 95 95
+aline 95 47
+aline 142 0
+aline 190 0
+aline 238 47
+aline 285 142
+aline 333 333
+aline 380 714
+aline 380 1000
+amove 238 1000
+aline 1095 1000
+amove 952 1000
+aline 952 0
+amove 904 0
+aline 904 1000
+amove 761 0
+aline 1095 0
+stroke
+dfont endchar
+dfont char=77
+amove 95 0
+aline 380 0
+amove 238 0
+aline 238 1000
+aline 571 0
+aline 904 1000
+aline 904 0
+amove 952 0
+aline 952 1000
+amove 904 1000
+aline 1095 1000
+amove 285 1000
+aline 571 142
+amove 761 0
+aline 1095 0
+amove 285 1000
+aline 95 1000
+stroke
+dfont endchar
+dfont char=78
+amove 95 0
+aline 428 0
+amove 285 0
+aline 285 1000
+amove 238 1000
+aline 238 0
+amove 714 0
+aline 1047 0
+amove 904 0
+aline 904 1000
+amove 857 1000
+aline 857 0
+amove 857 523
+aline 285 523
+amove 428 1000
+aline 95 1000
+amove 714 1000
+aline 1047 1000
+stroke
+dfont endchar
+dfont char=79
+amove 476 0
+aline 380 47
+aline 285 142
+aline 238 238
+aline 190 428
+aline 190 571
+aline 238 761
+aline 285 857
+aline 380 952
+aline 476 1000
+aline 571 1000
+aline 714 952
+aline 809 857
+aline 857 761
+aline 904 571
+aline 904 428
+aline 857 238
+aline 809 142
+aline 714 47
+aline 571 0
+aline 476 0
+aline 333 47
+aline 238 142
+aline 190 238
+aline 142 428
+aline 142 571
+aline 190 761
+aline 238 857
+aline 333 952
+aline 476 1000
+amove 571 1000
+aline 666 952
+aline 761 857
+aline 809 761
+aline 857 571
+aline 857 428
+aline 809 238
+aline 761 142
+aline 666 47
+aline 571 0
+stroke
+dfont endchar
+dfont char=80
+amove 95 0
+aline 428 0
+amove 285 0
+aline 285 1000
+amove 238 1000
+aline 238 0
+amove 714 0
+aline 1047 0
+amove 904 0
+aline 904 1000
+amove 857 1000
+aline 857 0
+amove 1047 1000
+aline 95 1000
+stroke
+dfont endchar
+dfont char=81
+amove 95 0
+aline 428 0
+amove 285 0
+aline 285 1000
+amove 238 1000
+aline 238 0
+amove 285 476
+aline 666 476
+aline 809 523
+aline 857 571
+aline 904 666
+aline 904 809
+aline 857 904
+aline 809 952
+aline 666 1000
+aline 95 1000
+amove 666 1000
+aline 761 952
+aline 809 904
+aline 857 809
+aline 857 666
+aline 809 571
+aline 761 523
+aline 666 476
+stroke
+dfont endchar
+dfont char=82
+amove 476 0
+aline 380 47
+aline 285 142
+aline 238 238
+aline 190 380
+aline 190 619
+aline 238 761
+aline 285 857
+aline 380 952
+aline 476 1000
+amove 809 857
+aline 857 714
+aline 857 1000
+aline 809 857
+aline 714 952
+aline 571 1000
+aline 476 1000
+aline 333 952
+aline 238 857
+aline 190 761
+aline 142 619
+aline 142 380
+aline 190 238
+aline 238 142
+aline 333 47
+aline 476 0
+aline 571 0
+aline 714 47
+aline 809 142
+aline 857 238
+stroke
+dfont endchar
+dfont char=83
+amove 285 0
+aline 619 0
+amove 476 0
+aline 476 1000
+amove 428 1000
+aline 428 0
+amove 142 1000
+aline 95 714
+aline 95 1000
+aline 809 1000
+aline 809 714
+aline 761 1000
+stroke
+dfont endchar
+dfont char=84
+amove 238 47
+aline 285 95
+aline 238 142
+aline 190 95
+aline 190 47
+aline 238 0
+aline 285 0
+aline 380 47
+aline 428 95
+aline 523 238
+aline 857 1000
+amove 952 1000
+aline 666 1000
+amove 333 1000
+aline 47 1000
+amove 142 1000
+aline 476 238
+amove 523 238
+aline 190 1000
+stroke
+dfont endchar
+dfont char=85
+amove 428 0
+aline 761 0
+amove 619 0
+aline 619 1000
+amove 571 1000
+aline 571 0
+amove 476 142
+aline 333 190
+aline 238 285
+aline 190 428
+aline 190 571
+aline 238 714
+aline 333 809
+aline 476 857
+aline 714 857
+aline 904 809
+aline 1000 714
+aline 1047 571
+aline 1047 428
+aline 1000 285
+aline 904 190
+aline 714 142
+aline 476 142
+aline 285 190
+aline 190 285
+aline 142 428
+aline 142 571
+aline 190 714
+aline 285 809
+aline 476 857
+amove 428 1000
+aline 761 1000
+amove 714 857
+aline 857 809
+aline 952 714
+aline 1000 571
+aline 1000 428
+aline 952 285
+aline 857 190
+aline 714 142
+stroke
+dfont endchar
+dfont char=86
+amove 47 0
+aline 333 0
+amove 142 0
+aline 809 1000
+amove 904 1000
+aline 619 1000
+amove 333 1000
+aline 47 1000
+amove 142 1000
+aline 761 0
+amove 809 0
+aline 190 1000
+amove 619 0
+aline 904 0
+stroke
+dfont endchar
+dfont char=87
+amove 95 0
+aline 1047 0
+aline 1047 -334
+aline 1000 0
+amove 904 0
+aline 904 1000
+amove 857 1000
+aline 857 0
+amove 285 0
+aline 285 1000
+amove 238 1000
+aline 238 0
+amove 95 1000
+aline 428 1000
+amove 714 1000
+aline 1047 1000
+stroke
+dfont endchar
+dfont char=88
+amove 428 333
+aline 333 380
+aline 285 476
+aline 285 1000
+amove 238 1000
+aline 238 476
+aline 285 380
+aline 428 333
+aline 571 333
+aline 714 380
+aline 809 476
+amove 809 0
+aline 809 1000
+amove 857 1000
+aline 857 0
+amove 1000 0
+aline 666 0
+amove 666 1000
+aline 1000 1000
+amove 428 1000
+aline 95 1000
+stroke
+dfont endchar
+dfont char=89
+amove 95 0
+aline 1476 0
+amove 1333 0
+aline 1333 1000
+amove 1285 1000
+aline 1285 0
+amove 809 0
+aline 809 1000
+amove 761 1000
+aline 761 0
+amove 285 0
+aline 285 1000
+amove 238 1000
+aline 238 0
+amove 95 1000
+aline 428 1000
+amove 619 1000
+aline 952 1000
+amove 1142 1000
+aline 1476 1000
+stroke
+dfont endchar
+dfont char=90
+amove 95 0
+aline 1476 0
+aline 1476 -334
+aline 1428 0
+amove 1333 0
+aline 1333 1000
+amove 1285 1000
+aline 1285 0
+amove 809 0
+aline 809 1000
+amove 761 1000
+aline 761 0
+amove 285 0
+aline 285 1000
+amove 238 1000
+aline 238 0
+amove 95 1000
+aline 428 1000
+amove 619 1000
+aline 952 1000
+amove 1142 1000
+aline 1476 1000
+stroke
+dfont endchar
+dfont char=91
+amove 190 -334
+aline 190 1190
+aline 523 1190
+amove 238 1190
+aline 238 -334
+amove 190 -334
+aline 523 -334
+stroke
+dfont endchar
+stroke
+dfont endchar
+dfont char=93
+amove 142 -334
+aline 476 -334
+aline 476 1190
+aline 142 1190
+amove 428 1190
+aline 428 -334
+stroke
+dfont endchar
+stroke
+dfont endchar
+stroke
+dfont endchar
+dfont char=96
+amove 238 904
+aline 285 952
+aline 238 1000
+aline 190 952
+aline 190 857
+aline 238 761
+aline 285 714
+stroke
+dfont endchar
+dfont char=97
+amove 333 0
+aline 238 47
+aline 190 142
+aline 190 238
+aline 238 333
+aline 333 380
+amove 238 571
+aline 238 523
+aline 190 523
+aline 190 571
+aline 238 619
+aline 333 666
+aline 523 666
+aline 619 619
+aline 666 571
+aline 714 476
+aline 714 142
+aline 761 47
+aline 809 0
+amove 857 0
+aline 809 0
+aline 714 47
+aline 666 142
+aline 666 571
+amove 666 476
+aline 619 428
+aline 333 380
+aline 190 333
+aline 142 238
+aline 142 142
+aline 190 47
+aline 333 -1
+aline 476 -1
+aline 571 47
+aline 666 142
+stroke
+dfont endchar
+dfont char=98
+amove 142 380
+aline 190 523
+aline 285 619
+aline 428 666
+aline 523 666
+aline 666 619
+aline 761 523
+aline 809 380
+aline 809 285
+aline 761 142
+aline 666 47
+aline 523 0
+aline 428 0
+aline 285 47
+aline 190 142
+aline 142 285
+aline 142 476
+aline 190 619
+aline 285 761
+aline 428 857
+aline 714 952
+aline 761 1000
+aline 714 904
+aline 619 857
+aline 428 809
+aline 285 714
+aline 190 619
+amove 428 666
+aline 333 619
+aline 238 523
+aline 190 380
+aline 190 285
+aline 238 142
+aline 333 47
+aline 428 0
+amove 523 0
+aline 619 47
+aline 714 142
+aline 761 285
+aline 761 380
+aline 714 523
+aline 619 619
+aline 523 666
+stroke
+dfont endchar
+dfont char=99
+amove 95 0
+aline 619 0
+aline 761 47
+aline 809 142
+aline 809 190
+aline 761 285
+aline 619 333
+aline 285 333
+amove 285 666
+aline 285 0
+amove 238 0
+aline 238 666
+amove 95 666
+aline 619 666
+aline 761 619
+aline 809 523
+aline 809 476
+aline 761 380
+aline 619 333
+aline 714 380
+aline 761 476
+aline 761 523
+aline 714 619
+aline 619 666
+amove 619 333
+aline 714 285
+aline 761 190
+aline 761 142
+aline 714 47
+aline 619 0
+stroke
+dfont endchar
+dfont char=100
+amove 95 0
+aline 428 0
+amove 285 0
+aline 285 666
+amove 238 666
+aline 238 0
+amove 95 666
+aline 761 666
+aline 761 428
+aline 714 666
+stroke
+dfont endchar
+dfont char=101
+amove 142 0
+aline 95 -239
+aline 95 0
+aline 1000 0
+aline 1000 -239
+aline 952 0
+amove 857 0
+aline 857 666
+amove 809 666
+aline 809 0
+amove 238 0
+aline 285 47
+aline 333 190
+aline 380 476
+aline 380 666
+amove 238 666
+aline 999 666
+stroke
+dfont endchar
+dfont char=102
+amove 190 380
+aline 761 380
+aline 761 476
+aline 714 571
+aline 666 619
+aline 571 666
+aline 428 666
+aline 285 619
+aline 190 523
+aline 142 380
+aline 142 285
+aline 190 142
+aline 285 47
+aline 428 0
+aline 523 0
+aline 666 47
+aline 761 142
+amove 714 380
+aline 714 523
+aline 666 619
+amove 428 666
+aline 333 619
+aline 238 523
+aline 190 380
+aline 190 285
+aline 238 142
+aline 333 47
+aline 428 0
+stroke
+dfont endchar
+dfont char=103
+amove 95 142
+aline 142 47
+aline 190 0
+aline 285 0
+aline 333 47
+aline 428 238
+aline 523 333
+aline 428 285
+aline 380 238
+aline 285 47
+aline 238 0
+amove 476 0
+aline 809 0
+amove 666 0
+aline 666 666
+amove 619 666
+aline 619 0
+amove 761 333
+aline 857 285
+aline 904 238
+aline 999 47
+aline 1047 -1
+amove 1190 142
+aline 1142 47
+aline 1095 -1
+aline 999 -1
+aline 952 47
+aline 857 238
+aline 761 333
+amove 809 666
+aline 476 666
+amove 238 619
+aline 190 571
+aline 142 619
+aline 190 666
+aline 238 666
+aline 285 619
+aline 380 428
+aline 428 380
+aline 523 333
+aline 761 333
+aline 857 380
+aline 904 428
+aline 1000 619
+aline 1047 666
+aline 1095 666
+aline 1142 619
+aline 1095 571
+aline 1047 619
+stroke
+dfont endchar
+dfont char=104
+amove 190 142
+aline 238 190
+aline 190 238
+aline 142 190
+aline 142 142
+aline 190 47
+aline 333 0
+aline 523 0
+aline 666 47
+aline 714 142
+aline 714 190
+aline 666 285
+aline 523 333
+aline 380 333
+amove 523 333
+aline 666 380
+aline 714 476
+aline 714 523
+aline 666 619
+aline 523 666
+aline 333 666
+aline 238 619
+aline 190 571
+aline 142 476
+aline 142 666
+aline 190 571
+amove 523 666
+aline 619 619
+aline 666 523
+aline 666 476
+aline 619 380
+aline 523 333
+aline 619 285
+aline 666 190
+aline 666 142
+aline 619 47
+aline 523 -1
+stroke
+dfont endchar
+dfont char=105
+amove 95 0
+aline 428 0
+amove 285 0
+aline 285 666
+amove 238 666
+aline 238 0
+amove 285 47
+aline 761 619
+amove 761 666
+aline 761 0
+amove 809 0
+aline 809 666
+amove 952 666
+aline 619 666
+amove 428 666
+aline 95 666
+amove 619 0
+aline 952 0
+stroke
+dfont endchar
+dfont char=106
+amove 95 0
+aline 428 0
+amove 285 0
+aline 285 666
+amove 238 666
+aline 238 0
+amove 285 47
+aline 761 619
+amove 761 666
+aline 761 0
+amove 809 0
+aline 809 666
+amove 952 666
+aline 619 666
+amove 428 666
+aline 95 666
+amove 380 952
+aline 380 1000
+aline 333 1000
+aline 333 952
+aline 380 857
+aline 476 809
+aline 571 809
+aline 666 857
+aline 714 952
+amove 619 0
+aline 952 0
+stroke
+dfont endchar
+dfont char=107
+amove 95 0
+aline 428 0
+amove 285 0
+aline 285 666
+amove 238 666
+aline 238 0
+amove 285 333
+aline 380 333
+aline 523 380
+aline 571 428
+aline 666 619
+aline 714 666
+aline 761 666
+aline 809 619
+aline 761 571
+aline 714 619
+amove 428 666
+aline 95 666
+amove 380 333
+aline 523 285
+aline 571 238
+aline 666 47
+aline 714 0
+amove 857 142
+aline 809 47
+aline 761 0
+aline 666 0
+aline 619 47
+aline 523 238
+aline 476 285
+aline 380 333
+stroke
+dfont endchar
+dfont char=108
+amove 190 47
+aline 142 95
+aline 95 47
+aline 142 0
+aline 190 0
+aline 238 47
+aline 285 190
+aline 333 476
+aline 333 666
+amove 190 666
+aline 952 666
+amove 809 666
+aline 809 0
+amove 761 0
+aline 761 666
+amove 619 0
+aline 952 0
+stroke
+dfont endchar
+dfont char=109
+amove 95 0
+aline 380 0
+amove 238 0
+aline 238 666
+aline 523 0
+aline 809 666
+aline 809 0
+amove 857 0
+aline 857 666
+amove 809 666
+aline 1000 666
+amove 1000 0
+aline 666 0
+amove 523 95
+aline 285 666
+aline 95 666
+stroke
+dfont endchar
+dfont char=110
+amove 95 0
+aline 428 0
+amove 285 0
+aline 285 666
+amove 238 666
+aline 238 0
+amove 285 333
+aline 761 333
+amove 761 666
+aline 761 0
+amove 809 0
+aline 809 666
+amove 952 666
+aline 619 666
+amove 428 666
+aline 95 666
+amove 619 0
+aline 952 0
+stroke
+dfont endchar
+dfont char=111
+amove 428 0
+aline 333 47
+aline 238 142
+aline 190 285
+aline 190 380
+aline 238 523
+aline 333 619
+aline 428 666
+aline 523 666
+aline 666 619
+aline 761 523
+aline 809 380
+aline 809 285
+aline 761 142
+aline 666 47
+aline 523 0
+aline 428 0
+aline 285 47
+aline 190 142
+aline 142 285
+aline 142 380
+aline 190 523
+aline 285 619
+aline 428 666
+amove 523 666
+aline 619 619
+aline 714 523
+aline 761 380
+aline 761 285
+aline 714 142
+aline 619 47
+aline 523 0
+stroke
+dfont endchar
+dfont char=112
+amove 95 0
+aline 428 0
+amove 285 0
+aline 285 666
+amove 238 666
+aline 238 0
+amove 619 0
+aline 952 0
+amove 809 0
+aline 809 666
+amove 761 666
+aline 761 0
+amove 952 666
+aline 95 666
+stroke
+dfont endchar
+dfont char=113
+amove 285 142
+aline 380 47
+aline 476 0
+aline 571 0
+aline 714 47
+aline 809 142
+aline 857 285
+aline 857 380
+aline 809 523
+aline 714 619
+aline 571 666
+aline 476 666
+aline 380 619
+aline 285 523
+amove 285 666
+aline 285 -334
+amove 238 -334
+aline 238 666
+amove 285 666
+aline 95 666
+amove 571 666
+aline 666 619
+aline 761 523
+aline 809 380
+aline 809 285
+aline 761 142
+aline 666 47
+aline 571 0
+amove 428 -334
+aline 95 -334
+stroke
+dfont endchar
+dfont char=114
+amove 428 0
+aline 333 47
+aline 238 142
+aline 190 285
+aline 190 380
+aline 238 523
+aline 333 619
+aline 428 666
+amove 714 523
+aline 666 476
+aline 714 428
+aline 761 476
+aline 761 523
+aline 666 619
+aline 571 666
+aline 428 666
+aline 285 619
+aline 190 523
+aline 142 380
+aline 142 285
+aline 190 142
+aline 285 47
+aline 428 0
+aline 523 0
+aline 666 47
+aline 761 142
+stroke
+dfont endchar
+dfont char=115
+amove 285 0
+aline 619 0
+amove 476 0
+aline 476 666
+amove 428 666
+aline 428 0
+amove 190 666
+aline 142 428
+aline 142 666
+aline 761 666
+aline 761 428
+aline 714 666
+stroke
+dfont endchar
+dfont char=116
+amove 142 -286
+aline 95 -239
+aline 47 -286
+aline 95 -334
+aline 142 -334
+aline 238 -286
+aline 333 -191
+aline 428 0
+aline 714 666
+amove 809 666
+aline 523 666
+amove 333 666
+aline 47 666
+amove 142 666
+aline 428 0
+amove 428 95
+aline 190 666
+stroke
+dfont endchar
+dfont char=117
+amove 285 0
+aline 238 47
+aline 190 190
+aline 190 476
+aline 238 619
+aline 285 666
+amove 476 523
+aline 428 619
+aline 380 666
+aline 285 666
+aline 190 619
+aline 142 476
+aline 142 190
+aline 190 47
+aline 285 0
+aline 380 0
+aline 428 47
+aline 476 142
+amove 523 142
+aline 571 47
+aline 619 0
+aline 714 0
+aline 809 47
+aline 857 190
+aline 857 476
+aline 809 619
+aline 714 666
+aline 619 666
+aline 571 619
+aline 523 523
+amove 714 666
+aline 761 619
+aline 809 476
+aline 809 190
+aline 761 47
+aline 714 0
+amove 666 -334
+aline 333 -334
+amove 476 -334
+aline 476 1000
+amove 523 1000
+aline 523 -334
+amove 523 1000
+aline 333 1000
+stroke
+dfont endchar
+dfont char=118
+amove 95 0
+aline 380 0
+amove 190 0
+aline 761 666
+amove 857 666
+aline 571 666
+amove 380 666
+aline 95 666
+amove 190 666
+aline 714 0
+amove 761 0
+aline 238 666
+amove 571 0
+aline 857 0
+stroke
+dfont endchar
+dfont char=119
+amove 95 0
+aline 952 0
+aline 952 -239
+aline 904 0
+amove 809 0
+aline 809 666
+amove 761 666
+aline 761 0
+amove 285 0
+aline 285 666
+amove 238 666
+aline 238 0
+amove 95 666
+aline 428 666
+amove 619 666
+aline 952 666
+stroke
+dfont endchar
+dfont char=120
+amove 428 190
+aline 333 238
+aline 285 333
+aline 285 666
+amove 238 666
+aline 238 333
+aline 285 238
+aline 428 190
+aline 523 190
+aline 666 238
+aline 761 333
+amove 761 666
+aline 761 0
+amove 809 0
+aline 809 666
+amove 952 666
+aline 619 666
+amove 428 666
+aline 95 666
+amove 619 0
+aline 952 0
+stroke
+dfont endchar
+dfont char=121
+amove 95 0
+aline 1380 0
+amove 1238 0
+aline 1238 666
+amove 1190 666
+aline 1190 0
+amove 761 0
+aline 761 666
+amove 714 666
+aline 714 0
+amove 285 0
+aline 285 666
+amove 238 666
+aline 238 0
+amove 95 666
+aline 428 666
+amove 571 666
+aline 904 666
+amove 1047 666
+aline 1380 666
+stroke
+dfont endchar
+dfont char=122
+amove 95 0
+aline 1380 0
+aline 1380 -239
+aline 1333 0
+amove 1238 0
+aline 1238 666
+amove 1190 666
+aline 1190 0
+amove 761 0
+aline 761 666
+amove 714 666
+aline 714 0
+amove 285 0
+aline 285 666
+amove 238 666
+aline 238 0
+amove 95 666
+aline 428 666
+amove 571 666
+aline 904 666
+amove 1047 666
+aline 1380 666
+stroke
+dfont endchar
+dfont char=123
+amove 380 238
+aline 333 95
+aline 333 -96
+aline 380 -239
+amove 476 -334
+aline 333 -191
+aline 285 -48
+aline 285 47
+aline 333 190
+aline 428 285
+aline 428 333
+aline 238 428
+aline 428 523
+aline 428 571
+aline 333 666
+aline 285 809
+aline 285 904
+aline 333 1047
+aline 476 1190
+amove 380 1095
+aline 333 952
+aline 333 761
+aline 380 619
+stroke
+dfont endchar
+dfont char=124
+amove 190 -334
+aline 190 1190
+aline 523 1190
+amove 238 1190
+aline 238 -334
+amove 190 -334
+aline 523 -334
+stroke
+dfont endchar
+dfont char=125
+amove 238 -334
+aline 380 -191
+aline 428 -48
+aline 428 47
+aline 380 190
+aline 285 285
+aline 285 333
+aline 476 428
+aline 285 523
+aline 285 571
+aline 380 666
+aline 428 809
+aline 428 904
+aline 380 1047
+aline 238 1190
+amove 333 1095
+aline 380 952
+aline 380 761
+aline 333 619
+amove 333 238
+aline 380 95
+aline 380 -96
+aline 333 -239
+stroke
+dfont endchar
+dfont char=126
+amove 285 1000
+aline 190 952
+aline 142 857
+aline 142 761
+aline 190 666
+aline 285 619
+aline 380 619
+aline 476 666
+aline 523 761
+aline 523 857
+aline 476 952
+aline 380 1000
+aline 285 1000
+stroke
+dfont endchar
diff --git a/src/fonts/plcg.afm b/src/fonts/plcg.afm
new file mode 100644
index 0000000..a3d5394
--- /dev/null
+++ b/src/fonts/plcg.afm
@@ -0,0 +1,115 @@
+StartFontMetrics 2.0
+Comment Made from HERSHEY font file using SPLITFONT.BAS
+FontName plCG
+EncodingScheme TEXENCODING
+FullName plCG
+FamilyName plCG
+Weight Medium
+ItalicAngle 0
+IsFixedPitch false
+UnderlinePosition -97
+UnderlineThickness 73
+FontBBox 0 -400 1001 1001
+CapHeight 729
+XHeight 151
+Descender -219
+Ascender 729
+StartCharMetrics 95
+C 32 ; WX 400 ; N C32 ; B 0 0 0 0 ;
+C 33 ; WX 415 ; N C33 ; B 161 0 268 700 ;
+C 34 ; WX 631 ; N C34 ; B 161 430 538 700 ;
+C 35 ; WX 846 ; N C35 ; B 161 0 699 592 ;
+C 36 ; WX 523 ; N C36 ; B 107 430 430 753 ;
+C 37 ; WX 784 ; N C37 ; B 99 0 700 700 ;
+C 38 ; WX 846 ; N C38 ; B 161 0 699 592 ;
+C 39 ; WX 361 ; N C39 ; B 161 430 214 700 ;
+C 40 ; WX 523 ; N C40 ; B 161 -215 430 861 ;
+C 41 ; WX 523 ; N C41 ; B 107 -215 376 861 ;
+C 42 ; WX 523 ; N C42 ; B 161 -215 376 861 ;
+C 43 ; WX 577 ; N C43 ; B 214 -215 376 861 ;
+C 44 ; WX 415 ; N C44 ; B 161 -161 268 107 ;
+C 45 ; WX 523 ; N C45 ; B 107 -215 376 861 ;
+C 46 ; WX 415 ; N C46 ; B 161 0 268 107 ;
+C 47 ; WX 792 ; N C47 ; B 107 -215 700 861 ;
+C 48 ; WX 685 ; N C48 ; B 107 0 592 700 ;
+C 49 ; WX 685 ; N C49 ; B 161 0 538 700 ;
+C 50 ; WX 685 ; N C50 ; B 107 0 592 700 ;
+C 51 ; WX 685 ; N C51 ; B 107 0 592 700 ;
+C 52 ; WX 685 ; N C52 ; B 53 0 646 700 ;
+C 53 ; WX 685 ; N C53 ; B 107 0 592 700 ;
+C 54 ; WX 685 ; N C54 ; B 107 0 592 700 ;
+C 55 ; WX 685 ; N C55 ; B 107 0 592 700 ;
+C 56 ; WX 685 ; N C56 ; B 107 0 592 700 ;
+C 57 ; WX 685 ; N C57 ; B 107 0 592 700 ;
+C 58 ; WX 415 ; N C58 ; B 161 0 268 484 ;
+C 59 ; WX 415 ; N C59 ; B 161 -161 268 484 ;
+C 60 ; WX 784 ; N C60 ; B 133 0 666 600 ;
+C 61 ; WX 577 ; N C61 ; B 214 -215 376 861 ;
+C 62 ; WX 784 ; N C62 ; B 133 0 666 600 ;
+C 63 ; WX 685 ; N C63 ; B 107 0 592 700 ;
+C 64 ; WX 884 ; N C64 ; B 99 0 799 700 ;
+C 65 ; WX 739 ; N C65 ; B 0 0 753 700 ;
+C 66 ; WX 846 ; N C66 ; B 107 0 700 700 ;
+C 67 ; WX 685 ; N C67 ; B 107 0 646 700 ;
+C 68 ; WX 739 ; N C68 ; B 53 0 700 700 ;
+C 69 ; WX 792 ; N C69 ; B 107 0 646 700 ;
+C 70 ; WX 685 ; N C70 ; B 107 0 592 700 ;
+C 71 ; WX 900 ; N C71 ; B 107 0 807 700 ;
+C 72 ; WX 792 ; N C72 ; B 107 0 700 700 ;
+C 73 ; WX 469 ; N C73 ; B 107 0 376 700 ;
+C 74 ; WX 846 ; N C74 ; B 107 0 807 700 ;
+C 75 ; WX 739 ; N C75 ; B 0 0 753 700 ;
+C 76 ; WX 1008 ; N C76 ; B 107 0 915 700 ;
+C 77 ; WX 846 ; N C77 ; B 107 0 753 700 ;
+C 78 ; WX 846 ; N C78 ; B 107 -53 753 753 ;
+C 79 ; WX 792 ; N C79 ; B 107 0 700 700 ;
+C 80 ; WX 900 ; N C80 ; B 107 0 807 700 ;
+C 81 ; WX 792 ; N C81 ; B 107 0 700 700 ;
+C 82 ; WX 846 ; N C82 ; B 107 0 700 700 ;
+C 83 ; WX 792 ; N C83 ; B 107 0 699 700 ;
+C 84 ; WX 792 ; N C84 ; B 107 0 700 700 ;
+C 85 ; WX 792 ; N C85 ; B 107 0 700 700 ;
+C 86 ; WX 792 ; N C86 ; B 53 0 753 700 ;
+C 87 ; WX 900 ; N C87 ; B 107 0 807 700 ;
+C 88 ; WX 792 ; N C88 ; B 107 0 700 700 ;
+C 89 ; WX 739 ; N C89 ; B -107 0 646 700 ;
+C 90 ; WX 792 ; N C90 ; B 0 0 700 700 ;
+C 91 ; WX 451 ; N C91 ; B 133 -233 366 833 ;
+C 92 ; WX 300 ; N C92 ; B 0 0 0 0 ;
+C 93 ; WX 451 ; N C93 ; B 99 -233 333 833 ;
+C 94 ; WX 300 ; N C94 ; B 0 0 0 0 ;
+C 95 ; WX 300 ; N C95 ; B 0 0 0 0 ;
+C 96 ; WX 318 ; N C96 ; B 133 500 199 700 ;
+C 97 ; WX 846 ; N C97 ; B 107 0 753 484 ;
+C 98 ; WX 685 ; N C98 ; B 0 -215 592 700 ;
+C 99 ; WX 739 ; N C99 ; B 53 -215 646 484 ;
+C 100 ; WX 739 ; N C100 ; B 107 0 592 753 ;
+C 101 ; WX 631 ; N C101 ; B 107 0 538 484 ;
+C 102 ; WX 577 ; N C102 ; B 107 -215 538 700 ;
+C 103 ; WX 846 ; N C103 ; B 53 -215 699 484 ;
+C 104 ; WX 846 ; N C104 ; B 53 0 753 700 ;
+C 105 ; WX 469 ; N C105 ; B 107 0 430 484 ;
+C 106 ; WX 739 ; N C106 ; B 53 0 646 484 ;
+C 107 ; WX 631 ; N C107 ; B 0 0 592 700 ;
+C 108 ; WX 792 ; N C108 ; B 0 -215 753 484 ;
+C 109 ; WX 792 ; N C109 ; B 107 0 700 484 ;
+C 110 ; WX 577 ; N C110 ; B 107 -215 484 700 ;
+C 111 ; WX 685 ; N C111 ; B 107 0 592 484 ;
+C 112 ; WX 900 ; N C112 ; B 107 0 807 484 ;
+C 113 ; WX 739 ; N C113 ; B 0 -215 646 484 ;
+C 114 ; WX 846 ; N C114 ; B 107 0 753 484 ;
+C 115 ; WX 792 ; N C115 ; B 107 0 699 484 ;
+C 116 ; WX 739 ; N C116 ; B 53 0 646 484 ;
+C 117 ; WX 792 ; N C117 ; B 107 -215 700 484 ;
+C 118 ; WX 685 ; N C118 ; B 53 -215 592 484 ;
+C 119 ; WX 954 ; N C119 ; B 53 -215 861 700 ;
+C 120 ; WX 846 ; N C120 ; B 107 0 753 484 ;
+C 121 ; WX 792 ; N C121 ; B 107 0 753 484 ;
+C 122 ; WX 739 ; N C122 ; B 161 0 646 700 ;
+C 123 ; WX 485 ; N C123 ; B 166 -233 333 833 ;
+C 124 ; WX 523 ; N C124 ; B 161 -215 430 861 ;
+C 125 ; WX 485 ; N C125 ; B 166 -233 333 833 ;
+C 126 ; WX 523 ; N C126 ; B 161 484 376 700 ;
+EndCharMetrics
+
+EndFontMetrics
diff --git a/src/fonts/plcg.gle b/src/fonts/plcg.gle
new file mode 100644
index 0000000..fa90f52
--- /dev/null
+++ b/src/fonts/plcg.gle
@@ -0,0 +1,1954 @@
+dfont design= 1428
+dfont char=33
+amove 307 1000
+aline 230 923
+aline 307 384
+aline 384 923
+aline 307 1000
+amove 307 923
+aline 307 692
+amove 307 153
+aline 230 76
+aline 307 0
+aline 384 76
+aline 307 153
+stroke
+dfont endchar
+dfont char=34
+amove 230 615
+aline 230 1000
+amove 307 1000
+aline 230 615
+amove 692 615
+aline 692 1000
+amove 769 1000
+aline 692 615
+stroke
+dfont endchar
+dfont char=35
+amove 230 0
+aline 999 0
+amove 615 0
+aline 615 846
+amove 230 461
+aline 999 461
+stroke
+dfont endchar
+dfont char=36
+amove 153 692
+aline 615 1000
+amove 384 1076
+aline 384 615
+amove 615 692
+aline 153 1000
+stroke
+dfont endchar
+dfont char=37
+amove 142 0
+aline 1000 1000
+aline 904 952
+aline 761 904
+aline 619 904
+aline 476 952
+aline 380 1000
+aline 285 1000
+aline 190 952
+aline 142 857
+aline 142 761
+aline 238 666
+aline 333 666
+aline 428 714
+aline 476 809
+aline 476 904
+aline 380 1000
+amove 809 333
+aline 714 285
+aline 666 190
+aline 666 95
+aline 761 0
+aline 857 0
+aline 952 47
+aline 1000 142
+aline 1000 238
+aline 904 333
+aline 809 333
+stroke
+dfont endchar
+dfont char=38
+amove 230 461
+aline 999 461
+amove 999 846
+aline 230 846
+amove 615 846
+aline 615 -1
+stroke
+dfont endchar
+dfont char=39
+amove 230 615
+aline 230 1000
+amove 307 1000
+aline 230 615
+stroke
+dfont endchar
+dfont char=40
+amove 461 -154
+aline 384 0
+aline 307 307
+aline 307 615
+aline 384 923
+aline 461 1076
+amove 615 1230
+aline 461 1076
+aline 307 846
+aline 230 615
+aline 230 307
+aline 307 76
+aline 461 -154
+aline 615 -308
+stroke
+dfont endchar
+dfont char=41
+amove 153 -308
+aline 307 -154
+aline 461 76
+aline 538 307
+aline 538 615
+aline 461 846
+aline 307 1076
+aline 153 1230
+amove 307 1076
+aline 384 923
+aline 461 615
+aline 461 307
+aline 384 0
+aline 307 -154
+stroke
+dfont endchar
+dfont char=42
+amove 230 -308
+aline 538 461
+aline 230 1230
+stroke
+dfont endchar
+dfont char=43
+amove 384 -77
+aline 461 230
+amove 384 76
+aline 461 -231
+amove 538 -308
+aline 461 -231
+aline 384 -77
+aline 384 76
+aline 461 230
+aline 461 307
+aline 307 461
+aline 461 615
+aline 461 692
+aline 384 846
+aline 384 999
+aline 461 1153
+aline 538 1230
+amove 461 1153
+aline 384 846
+amove 384 999
+aline 461 692
+stroke
+dfont endchar
+dfont char=44
+amove 230 -231
+aline 384 -77
+aline 384 76
+aline 307 153
+aline 230 76
+aline 307 -1
+aline 384 76
+stroke
+dfont endchar
+dfont char=45
+amove 153 -308
+aline 538 -308
+aline 538 1230
+aline 153 1230
+amove 461 1230
+aline 461 -308
+stroke
+dfont endchar
+dfont char=46
+amove 307 153
+aline 230 76
+aline 307 -1
+aline 384 76
+aline 307 153
+stroke
+dfont endchar
+dfont char=47
+amove 153 -308
+aline 1000 1230
+stroke
+dfont endchar
+dfont char=48
+amove 384 0
+aline 307 76
+aline 230 307
+aline 230 692
+aline 307 923
+aline 384 1000
+aline 615 1000
+aline 769 923
+aline 846 692
+aline 846 307
+aline 769 76
+aline 615 0
+aline 384 0
+aline 230 76
+aline 153 307
+aline 153 692
+aline 230 923
+aline 384 1000
+amove 615 1000
+aline 692 923
+aline 769 692
+aline 769 307
+aline 692 76
+aline 615 0
+stroke
+dfont endchar
+dfont char=49
+amove 230 0
+aline 769 0
+amove 538 0
+aline 538 1000
+aline 307 769
+amove 461 923
+aline 461 0
+stroke
+dfont endchar
+dfont char=50
+amove 153 0
+aline 153 230
+aline 230 384
+aline 384 461
+aline 615 538
+aline 769 615
+aline 846 769
+aline 769 923
+aline 615 1000
+aline 384 1000
+aline 230 923
+aline 153 846
+aline 153 769
+aline 230 769
+aline 230 846
+amove 615 1000
+aline 692 923
+aline 769 769
+aline 692 615
+aline 615 538
+amove 846 230
+aline 846 153
+aline 769 0
+aline 538 0
+aline 307 153
+amove 153 76
+aline 230 153
+aline 307 153
+aline 538 76
+aline 769 76
+aline 846 153
+stroke
+dfont endchar
+dfont char=51
+amove 230 153
+aline 230 230
+aline 153 230
+aline 153 153
+aline 230 76
+aline 384 -1
+aline 615 -1
+aline 769 76
+aline 846 230
+aline 846 307
+aline 769 461
+aline 615 538
+aline 461 538
+amove 615 538
+aline 769 615
+aline 846 769
+aline 769 923
+aline 615 1000
+aline 384 1000
+aline 230 923
+aline 153 846
+aline 153 769
+aline 230 769
+aline 230 846
+amove 615 1000
+aline 692 923
+aline 769 769
+aline 692 615
+aline 615 538
+aline 692 461
+aline 769 307
+aline 769 230
+aline 692 76
+aline 615 0
+stroke
+dfont endchar
+dfont char=52
+amove 384 0
+aline 769 0
+amove 615 0
+aline 615 1000
+aline 76 307
+aline 923 307
+amove 538 0
+aline 538 846
+stroke
+dfont endchar
+dfont char=53
+amove 230 153
+aline 230 230
+aline 153 230
+aline 153 153
+aline 230 76
+aline 384 -1
+aline 615 -1
+aline 769 76
+aline 846 230
+aline 846 461
+aline 769 615
+aline 615 692
+aline 384 692
+aline 230 615
+aline 153 538
+aline 230 1000
+aline 769 1000
+aline 538 923
+aline 230 923
+amove 615 692
+aline 692 615
+aline 769 461
+aline 769 230
+aline 692 76
+aline 615 0
+stroke
+dfont endchar
+dfont char=54
+amove 384 0
+aline 307 76
+aline 230 230
+aline 230 615
+aline 307 846
+aline 461 1000
+amove 769 846
+aline 769 769
+aline 846 769
+aline 846 846
+aline 769 923
+aline 615 1000
+aline 461 1000
+aline 307 923
+aline 230 846
+aline 153 615
+aline 153 230
+aline 230 76
+aline 384 0
+aline 615 0
+aline 769 76
+aline 846 230
+aline 846 384
+aline 769 538
+aline 615 615
+aline 384 615
+aline 153 461
+amove 615 615
+aline 692 538
+aline 769 384
+aline 769 230
+aline 692 76
+aline 615 0
+stroke
+dfont endchar
+dfont char=55
+amove 307 0
+aline 461 307
+aline 769 846
+aline 692 846
+aline 461 923
+aline 307 923
+aline 153 846
+aline 307 999
+aline 461 999
+aline 692 846
+amove 846 1000
+aline 615 538
+aline 384 0
+amove 153 692
+aline 153 1000
+stroke
+dfont endchar
+dfont char=56
+amove 384 0
+aline 307 76
+aline 230 230
+aline 230 307
+aline 307 461
+aline 384 538
+aline 307 615
+aline 230 769
+aline 307 923
+aline 384 1000
+aline 615 1000
+aline 769 923
+aline 846 769
+aline 769 615
+aline 615 538
+aline 384 538
+aline 230 615
+aline 153 769
+aline 230 923
+aline 384 1000
+amove 615 1000
+aline 692 923
+aline 769 769
+aline 692 615
+aline 615 538
+aline 769 461
+aline 846 307
+aline 846 230
+aline 769 76
+aline 615 0
+aline 384 0
+aline 230 76
+aline 153 230
+aline 153 307
+aline 230 461
+aline 384 538
+amove 615 538
+aline 692 461
+aline 769 307
+aline 769 230
+aline 692 76
+aline 615 0
+stroke
+dfont endchar
+dfont char=57
+amove 230 153
+aline 230 230
+aline 153 230
+aline 153 153
+aline 230 76
+aline 384 -1
+aline 538 -1
+aline 692 76
+aline 769 153
+aline 846 384
+aline 846 769
+aline 769 923
+aline 615 1000
+aline 384 1000
+aline 230 923
+aline 153 769
+aline 153 615
+aline 230 461
+aline 384 384
+aline 615 384
+aline 846 538
+amove 384 384
+aline 307 461
+aline 230 615
+aline 230 769
+aline 307 923
+aline 384 1000
+amove 615 1000
+aline 692 923
+aline 769 769
+aline 769 384
+aline 692 153
+aline 538 0
+stroke
+dfont endchar
+dfont char=58
+amove 307 692
+aline 230 615
+aline 307 538
+aline 384 615
+aline 307 692
+amove 307 153
+aline 230 76
+aline 307 0
+aline 384 76
+aline 307 153
+stroke
+dfont endchar
+dfont char=59
+amove 230 -231
+aline 384 -77
+aline 384 76
+aline 307 153
+aline 230 76
+aline 307 -1
+aline 384 76
+amove 307 692
+aline 230 615
+aline 307 538
+aline 384 615
+aline 307 692
+stroke
+dfont endchar
+dfont char=60
+amove 952 857
+aline 190 428
+aline 952 0
+stroke
+dfont endchar
+dfont char=61
+amove 307 -308
+aline 384 -231
+aline 461 -77
+aline 461 76
+aline 384 230
+aline 384 307
+aline 538 461
+aline 384 615
+aline 384 692
+aline 461 846
+aline 461 999
+aline 384 1153
+aline 307 1230
+amove 384 1153
+aline 461 846
+amove 461 1000
+aline 384 692
+amove 384 230
+aline 461 -77
+amove 461 76
+aline 384 -231
+stroke
+dfont endchar
+dfont char=62
+amove 190 0
+aline 952 428
+aline 190 857
+stroke
+dfont endchar
+dfont char=63
+amove 461 76
+aline 461 -1
+aline 538 -1
+aline 538 76
+aline 461 76
+amove 538 307
+aline 461 307
+aline 461 384
+aline 538 461
+aline 769 538
+aline 846 692
+aline 846 769
+aline 769 923
+aline 615 1000
+aline 384 1000
+aline 230 923
+aline 153 769
+aline 153 692
+aline 230 692
+aline 230 769
+aline 153 769
+amove 538 461
+aline 692 538
+aline 769 615
+aline 769 846
+aline 615 1000
+stroke
+dfont endchar
+dfont char=64
+amove 523 238
+aline 476 285
+aline 428 380
+aline 428 523
+aline 476 666
+aline 571 761
+amove 857 761
+aline 809 380
+aline 809 285
+aline 904 238
+aline 999 238
+aline 1095 333
+aline 1142 476
+aline 1142 571
+aline 1095 714
+aline 1047 809
+aline 952 904
+aline 857 952
+aline 714 1000
+aline 571 1000
+aline 428 952
+aline 333 904
+aline 238 809
+aline 190 714
+aline 142 571
+aline 142 428
+aline 190 285
+aline 238 190
+aline 333 95
+aline 428 47
+aline 571 0
+aline 714 0
+aline 857 47
+aline 952 95
+aline 1000 142
+amove 904 238
+aline 857 285
+aline 857 380
+aline 904 761
+amove 857 619
+aline 809 714
+aline 714 761
+aline 571 761
+aline 476 714
+aline 428 666
+aline 380 523
+aline 380 380
+aline 428 285
+aline 523 238
+aline 666 238
+aline 761 285
+aline 809 380
+stroke
+dfont endchar
+dfont char=65
+amove 0 0
+aline 384 0
+amove 153 0
+aline 538 1000
+aline 923 0
+amove 846 0
+aline 538 769
+amove 692 307
+aline 307 307
+amove 692 0
+aline 1076 0
+stroke
+dfont endchar
+dfont char=66
+amove 153 0
+aline 692 0
+aline 923 76
+aline 1000 230
+aline 1000 307
+aline 923 461
+aline 692 538
+aline 384 538
+amove 692 538
+aline 923 615
+aline 1000 769
+aline 923 923
+aline 692 1000
+aline 153 1000
+amove 307 1000
+aline 307 0
+amove 384 0
+aline 384 1000
+amove 692 1000
+aline 846 923
+aline 923 769
+aline 846 615
+aline 692 538
+aline 846 461
+aline 923 307
+aline 923 230
+aline 846 76
+aline 692 0
+stroke
+dfont endchar
+dfont char=67
+amove 153 0
+aline 538 0
+amove 384 0
+aline 384 1000
+amove 307 1000
+aline 307 0
+amove 153 1000
+aline 923 1000
+aline 923 692
+aline 846 1000
+stroke
+dfont endchar
+dfont char=68
+amove 76 0
+aline 538 1000
+aline 1000 0
+aline 76 0
+amove 153 76
+aline 846 76
+amove 923 0
+aline 538 846
+stroke
+dfont endchar
+dfont char=69
+amove 153 0
+aline 923 0
+aline 923 307
+aline 846 0
+amove 692 384
+aline 692 692
+amove 692 538
+aline 384 538
+amove 384 1000
+aline 384 0
+amove 307 0
+aline 307 1000
+amove 153 1000
+aline 923 1000
+aline 923 692
+aline 846 1000
+stroke
+dfont endchar
+dfont char=70
+amove 153 0
+aline 769 1000
+amove 846 1000
+aline 230 0
+amove 153 0
+aline 846 0
+aline 846 307
+aline 769 0
+amove 846 1000
+aline 153 1000
+aline 153 692
+aline 230 1000
+stroke
+dfont endchar
+dfont char=71
+amove 153 0
+aline 538 0
+amove 384 0
+aline 384 1000
+amove 307 1000
+aline 307 0
+amove 769 0
+aline 1153 0
+amove 1000 0
+aline 1000 1000
+amove 923 1000
+aline 923 0
+amove 923 538
+aline 384 538
+amove 538 1000
+aline 153 1000
+amove 769 1000
+aline 1153 1000
+stroke
+dfont endchar
+dfont char=72
+amove 461 0
+aline 307 153
+aline 230 384
+aline 230 615
+aline 307 846
+aline 461 1000
+aline 692 1000
+aline 846 923
+aline 923 846
+aline 1000 615
+aline 1000 384
+aline 923 153
+aline 846 76
+aline 692 -1
+aline 461 -1
+aline 307 76
+aline 230 153
+aline 153 384
+aline 153 615
+aline 230 846
+aline 307 923
+aline 461 1000
+amove 692 1000
+aline 846 846
+aline 923 615
+aline 923 384
+aline 846 153
+aline 692 0
+amove 692 307
+aline 692 692
+amove 692 538
+aline 461 538
+amove 461 461
+aline 692 461
+amove 461 307
+aline 461 692
+stroke
+dfont endchar
+dfont char=73
+amove 153 0
+aline 538 0
+amove 384 0
+aline 384 1000
+amove 307 1000
+aline 307 0
+amove 153 1000
+aline 538 1000
+stroke
+dfont endchar
+dfont char=74
+amove 153 0
+aline 538 0
+amove 384 0
+aline 384 1000
+amove 307 1000
+aline 307 0
+amove 384 384
+aline 1000 1000
+amove 1153 1000
+aline 769 1000
+amove 538 1000
+aline 153 1000
+amove 538 538
+aline 923 0
+amove 1000 0
+aline 615 538
+amove 769 0
+aline 1153 0
+stroke
+dfont endchar
+dfont char=75
+amove 0 0
+aline 384 0
+amove 153 0
+aline 538 1000
+aline 923 0
+amove 846 0
+aline 538 769
+amove 692 0
+aline 1076 0
+stroke
+dfont endchar
+dfont char=76
+amove 153 0
+aline 461 0
+amove 307 0
+aline 307 1000
+amove 384 1000
+aline 692 230
+amove 692 0
+aline 384 769
+amove 384 1000
+aline 153 1000
+amove 1076 1000
+aline 692 0
+amove 923 0
+aline 1307 0
+amove 1153 0
+aline 1153 1000
+amove 1076 1000
+aline 1076 0
+amove 1076 1000
+aline 1307 1000
+stroke
+dfont endchar
+dfont char=77
+amove 153 0
+aline 461 0
+amove 307 0
+aline 307 1000
+amove 384 1000
+aline 923 153
+amove 923 -1
+aline 384 846
+amove 384 1000
+aline 153 1000
+amove 769 1000
+aline 1076 1000
+amove 923 1000
+aline 923 0
+stroke
+dfont endchar
+dfont char=78
+amove 153 -77
+aline 230 153
+amove 230 76
+aline 1000 76
+amove 1000 0
+aline 230 0
+amove 384 384
+aline 461 615
+amove 461 538
+aline 769 538
+amove 769 461
+aline 461 461
+amove 769 384
+aline 846 615
+amove 1000 846
+aline 1076 1076
+amove 1000 1000
+aline 230 1000
+amove 230 1076
+aline 153 846
+amove 230 923
+aline 1000 923
+amove 1076 153
+aline 1000 -77
+stroke
+dfont endchar
+dfont char=79
+amove 461 0
+aline 307 153
+aline 230 384
+aline 230 615
+aline 307 846
+aline 461 1000
+aline 692 1000
+aline 846 923
+aline 923 846
+aline 1000 615
+aline 1000 384
+aline 923 153
+aline 846 76
+aline 692 -1
+aline 461 -1
+aline 307 76
+aline 230 153
+aline 153 384
+aline 153 615
+aline 230 846
+aline 307 923
+aline 461 1000
+amove 692 1000
+aline 846 846
+aline 923 615
+aline 923 384
+aline 846 153
+aline 692 0
+stroke
+dfont endchar
+dfont char=80
+amove 153 0
+aline 538 0
+amove 384 0
+aline 384 1000
+amove 307 1000
+aline 307 0
+amove 769 0
+aline 1153 0
+amove 1000 0
+aline 1000 1000
+amove 923 1000
+aline 923 0
+amove 1153 1000
+aline 153 1000
+stroke
+dfont endchar
+dfont char=81
+amove 153 0
+aline 538 0
+amove 384 0
+aline 384 1000
+amove 307 1000
+aline 307 0
+amove 384 461
+aline 692 461
+aline 923 538
+aline 1000 692
+aline 1000 769
+aline 923 923
+aline 692 1000
+aline 153 1000
+amove 692 1000
+aline 846 923
+aline 923 769
+aline 923 692
+aline 846 538
+aline 692 461
+stroke
+dfont endchar
+dfont char=82
+amove 153 0
+aline 615 538
+aline 230 1000
+amove 153 1000
+aline 538 538
+amove 846 1000
+aline 1000 692
+aline 923 1000
+aline 153 1000
+amove 230 76
+aline 923 76
+amove 846 -1
+aline 1000 307
+aline 923 -1
+aline 153 -1
+stroke
+dfont endchar
+dfont char=83
+amove 384 0
+aline 769 0
+amove 615 0
+aline 615 1000
+amove 538 1000
+aline 538 0
+amove 230 1000
+aline 153 692
+aline 153 1000
+aline 999 1000
+aline 999 692
+aline 923 1000
+stroke
+dfont endchar
+dfont char=84
+amove 384 0
+aline 769 0
+amove 615 0
+aline 615 692
+aline 692 923
+aline 769 1000
+aline 846 1000
+aline 923 923
+aline 1000 692
+aline 923 846
+aline 846 923
+aline 769 923
+aline 692 846
+aline 615 692
+amove 538 692
+aline 461 846
+aline 384 923
+aline 307 923
+aline 230 846
+aline 153 692
+aline 230 923
+aline 307 1000
+aline 384 1000
+aline 461 923
+aline 538 692
+aline 538 0
+stroke
+dfont endchar
+dfont char=85
+amove 384 0
+aline 769 0
+amove 615 0
+aline 615 1000
+amove 538 1000
+aline 538 0
+amove 461 230
+aline 307 307
+aline 230 461
+aline 230 538
+aline 307 692
+aline 461 769
+aline 692 769
+aline 923 692
+aline 1000 538
+aline 1000 461
+aline 923 307
+aline 692 230
+aline 461 230
+aline 230 307
+aline 153 461
+aline 153 538
+aline 230 692
+aline 461 769
+amove 692 769
+aline 846 692
+aline 923 538
+aline 923 461
+aline 846 307
+aline 692 230
+amove 769 1000
+aline 384 1000
+stroke
+dfont endchar
+dfont char=86
+amove 76 0
+aline 461 0
+amove 230 0
+aline 923 1000
+amove 1076 1000
+aline 692 1000
+amove 461 1000
+aline 76 1000
+amove 230 1000
+aline 846 0
+amove 923 0
+aline 307 1000
+amove 692 0
+aline 1076 0
+stroke
+dfont endchar
+dfont char=87
+amove 461 0
+aline 846 0
+amove 692 0
+aline 692 1000
+amove 615 1000
+aline 615 0
+amove 538 230
+aline 384 384
+aline 307 692
+aline 230 692
+aline 153 615
+amove 230 692
+aline 307 461
+aline 384 307
+aline 538 230
+aline 769 230
+aline 923 307
+aline 1000 461
+aline 1076 692
+amove 1153 615
+aline 1076 692
+aline 1000 692
+aline 923 384
+aline 769 230
+amove 846 1000
+aline 461 1000
+stroke
+dfont endchar
+dfont char=88
+amove 153 153
+aline 230 -1
+aline 461 -1
+aline 153 461
+aline 153 692
+aline 230 846
+aline 307 923
+aline 461 1000
+aline 692 1000
+aline 846 923
+aline 923 846
+aline 1000 692
+aline 1000 461
+aline 692 0
+aline 923 0
+aline 1000 153
+amove 923 76
+aline 769 76
+amove 846 230
+aline 923 461
+aline 923 692
+aline 846 846
+aline 692 1000
+amove 461 1000
+aline 307 846
+aline 230 692
+aline 230 461
+aline 307 230
+amove 230 76
+aline 384 76
+stroke
+dfont endchar
+dfont char=89
+amove 0 0
+aline 692 1000
+aline 769 0
+amove 692 0
+aline 615 846
+amove 692 307
+aline 230 307
+amove 230 0
+aline -154 0
+amove 538 0
+aline 923 0
+stroke
+dfont endchar
+dfont char=90
+amove 0 0
+aline 538 0
+aline 769 76
+aline 846 230
+aline 846 384
+aline 769 461
+aline 615 538
+aline 384 538
+amove 615 538
+aline 769 384
+aline 769 230
+aline 692 76
+aline 538 0
+amove 230 0
+aline 538 1000
+amove 461 1000
+aline 153 0
+amove 692 538
+aline 923 615
+aline 1000 769
+aline 1000 923
+aline 846 1000
+aline 307 1000
+amove 846 1000
+aline 923 923
+aline 923 769
+aline 846 615
+aline 692 538
+stroke
+dfont endchar
+dfont char=91
+amove 190 -334
+aline 190 1190
+aline 523 1190
+amove 238 1190
+aline 238 -334
+amove 190 -334
+aline 523 -334
+stroke
+dfont endchar
+stroke
+dfont endchar
+dfont char=93
+amove 142 -334
+aline 476 -334
+aline 476 1190
+aline 142 1190
+amove 428 1190
+aline 428 -334
+stroke
+dfont endchar
+stroke
+dfont endchar
+stroke
+dfont endchar
+dfont char=96
+amove 238 904
+aline 285 952
+aline 238 1000
+aline 190 952
+aline 190 857
+aline 238 761
+aline 285 714
+stroke
+dfont endchar
+dfont char=97
+amove 384 0
+aline 307 76
+aline 230 230
+aline 230 384
+aline 307 538
+aline 461 692
+aline 307 615
+aline 230 538
+aline 153 384
+aline 153 230
+aline 230 76
+aline 384 0
+aline 461 0
+aline 615 76
+aline 769 230
+aline 923 461
+aline 1000 692
+amove 615 692
+aline 692 615
+aline 846 76
+aline 999 0
+aline 1076 0
+amove 1000 0
+aline 923 76
+aline 769 615
+aline 615 692
+aline 461 692
+stroke
+dfont endchar
+dfont char=98
+amove 0 -308
+aline 153 230
+aline 307 692
+aline 384 846
+aline 538 1000
+aline 692 1000
+aline 846 923
+aline 846 769
+aline 769 615
+aline 538 538
+aline 692 615
+aline 769 769
+aline 769 923
+aline 692 1000
+amove 461 923
+aline 384 769
+aline 230 307
+aline 76 -308
+amove 538 0
+aline 692 153
+aline 692 307
+aline 615 461
+aline 538 538
+aline 692 461
+aline 769 307
+aline 769 153
+aline 692 76
+aline 538 0
+aline 461 0
+aline 307 76
+aline 230 307
+stroke
+dfont endchar
+dfont char=99
+amove 76 538
+aline 230 692
+aline 384 692
+aline 538 615
+aline 615 384
+aline 615 0
+aline 538 -308
+amove 461 -308
+aline 615 0
+aline 846 461
+aline 923 692
+amove 615 384
+aline 538 538
+aline 384 615
+aline 230 615
+aline 76 538
+stroke
+dfont endchar
+dfont char=100
+amove 384 0
+aline 230 153
+aline 230 384
+aline 307 538
+aline 461 692
+amove 615 692
+aline 769 538
+aline 769 307
+aline 692 153
+aline 538 0
+amove 615 692
+aline 461 692
+aline 307 615
+aline 230 538
+aline 153 384
+aline 153 230
+aline 230 76
+aline 384 0
+aline 538 0
+aline 692 76
+aline 769 153
+aline 846 307
+aline 846 461
+aline 769 615
+aline 538 769
+aline 461 923
+aline 461 1000
+aline 538 1076
+aline 692 1076
+aline 769 1000
+aline 846 846
+aline 692 1000
+aline 538 1000
+aline 461 923
+stroke
+dfont endchar
+dfont char=101
+amove 307 0
+aline 230 76
+aline 230 230
+aline 307 307
+aline 461 384
+aline 307 461
+aline 230 538
+aline 230 615
+aline 384 692
+aline 615 692
+aline 769 615
+amove 461 384
+aline 307 538
+aline 307 615
+aline 384 692
+amove 461 384
+aline 230 307
+aline 153 230
+aline 153 76
+aline 307 0
+aline 538 0
+aline 692 76
+stroke
+dfont endchar
+dfont char=102
+amove 230 -231
+aline 307 -308
+aline 461 -308
+aline 538 -231
+aline 538 -77
+aline 461 -1
+aline 307 76
+aline 230 153
+aline 153 307
+aline 153 461
+aline 230 615
+aline 307 692
+aline 538 769
+aline 769 846
+aline 769 769
+aline 538 769
+aline 384 846
+aline 384 923
+aline 461 1000
+amove 538 769
+aline 384 692
+aline 307 615
+aline 230 461
+aline 230 307
+aline 307 153
+aline 461 0
+stroke
+dfont endchar
+dfont char=103
+amove 230 0
+aline 384 538
+aline 384 615
+aline 307 692
+amove 461 538
+aline 538 615
+aline 692 692
+aline 846 692
+aline 999 615
+aline 999 461
+aline 769 -308
+amove 692 -308
+aline 923 461
+aline 923 615
+aline 846 692
+amove 76 461
+aline 153 615
+aline 230 692
+aline 384 692
+aline 461 615
+aline 461 538
+aline 307 0
+stroke
+dfont endchar
+dfont char=104
+amove 76 384
+aline 153 538
+aline 230 615
+aline 384 615
+aline 461 538
+aline 461 153
+aline 538 -1
+amove 615 -1
+aline 769 153
+aline 846 307
+aline 923 538
+aline 923 769
+aline 846 999
+amove 1076 384
+aline 923 461
+aline 692 615
+aline 615 769
+aline 615 923
+aline 692 1000
+aline 846 1000
+aline 923 923
+aline 1000 769
+aline 1000 538
+aline 923 307
+aline 846 153
+aline 769 76
+aline 615 0
+aline 538 0
+aline 461 76
+aline 384 230
+aline 384 538
+aline 307 615
+stroke
+dfont endchar
+dfont char=105
+amove 307 0
+aline 230 76
+aline 230 153
+aline 384 692
+amove 307 692
+aline 153 153
+aline 153 76
+aline 230 -1
+aline 384 -1
+aline 538 76
+aline 615 230
+stroke
+dfont endchar
+dfont char=106
+amove 76 0
+aline 307 692
+amove 384 692
+aline 153 0
+amove 307 461
+aline 538 538
+aline 692 692
+aline 846 692
+aline 923 615
+aline 846 615
+aline 769 692
+amove 923 230
+aline 846 76
+aline 692 -1
+aline 538 76
+aline 384 384
+aline 307 461
+aline 461 384
+aline 615 76
+aline 692 0
+stroke
+dfont endchar
+dfont char=107
+amove 76 0
+aline 461 615
+aline 153 0
+amove 769 0
+aline 230 923
+aline 153 1000
+amove 0 1000
+aline 153 1000
+aline 307 923
+aline 846 0
+stroke
+dfont endchar
+dfont char=108
+amove 0 -308
+aline 307 692
+amove 384 692
+aline 76 -308
+amove 230 230
+aline 230 76
+aline 307 -1
+aline 461 -1
+aline 615 76
+aline 692 153
+amove 846 -1
+aline 769 76
+aline 769 153
+aline 923 692
+amove 846 692
+aline 692 153
+aline 692 76
+aline 769 -1
+aline 923 -1
+aline 1000 76
+aline 1076 230
+stroke
+dfont endchar
+dfont char=109
+amove 230 0
+aline 307 692
+amove 384 692
+aline 307 230
+aline 230 -1
+aline 307 -1
+aline 538 76
+aline 769 230
+aline 923 461
+aline 1000 692
+aline 923 692
+aline 923 461
+amove 384 692
+aline 153 692
+stroke
+dfont endchar
+dfont char=110
+amove 307 0
+aline 230 76
+aline 230 230
+aline 307 307
+aline 461 384
+aline 230 307
+aline 153 230
+aline 153 76
+aline 307 0
+aline 461 -77
+aline 538 -154
+aline 538 -231
+aline 461 -308
+aline 307 -308
+amove 384 384
+aline 307 461
+aline 307 615
+aline 384 692
+aline 538 769
+aline 307 692
+aline 230 615
+aline 230 461
+aline 384 384
+aline 615 384
+amove 692 769
+aline 461 769
+aline 307 846
+aline 307 923
+aline 384 1000
+stroke
+dfont endchar
+dfont char=111
+amove 384 0
+aline 230 153
+aline 230 384
+aline 307 538
+aline 461 692
+aline 615 692
+aline 769 615
+aline 846 461
+aline 846 307
+aline 769 153
+aline 692 76
+aline 538 0
+aline 384 0
+aline 230 76
+aline 153 230
+aline 153 384
+aline 230 538
+aline 307 615
+aline 461 692
+amove 615 692
+aline 769 538
+aline 769 307
+aline 692 153
+aline 538 0
+stroke
+dfont endchar
+dfont char=112
+amove 307 0
+aline 538 615
+aline 384 0
+amove 769 0
+aline 846 615
+aline 846 0
+amove 1153 615
+aline 307 615
+aline 153 538
+aline 307 692
+aline 1153 692
+stroke
+dfont endchar
+dfont char=113
+amove 0 -308
+aline 230 384
+aline 307 538
+aline 384 615
+aline 538 692
+aline 692 692
+aline 846 615
+aline 923 461
+aline 923 307
+aline 846 153
+aline 769 76
+aline 615 0
+aline 461 0
+aline 307 76
+aline 230 230
+amove 615 0
+aline 769 153
+aline 846 307
+aline 846 538
+aline 692 692
+amove 538 692
+aline 384 538
+aline 307 384
+aline 76 -308
+stroke
+dfont endchar
+dfont char=114
+amove 384 0
+aline 230 153
+aline 230 384
+aline 307 538
+aline 461 692
+amove 615 692
+aline 769 538
+aline 769 307
+aline 692 153
+aline 538 0
+amove 1076 615
+aline 769 615
+aline 846 461
+aline 846 307
+aline 769 153
+aline 692 76
+aline 538 0
+aline 384 0
+aline 230 76
+aline 153 230
+aline 153 384
+aline 230 538
+aline 307 615
+aline 461 692
+aline 1076 692
+stroke
+dfont endchar
+dfont char=115
+amove 461 0
+aline 615 615
+aline 538 0
+amove 153 538
+aline 307 692
+aline 999 692
+amove 999 615
+aline 307 615
+aline 153 538
+stroke
+dfont endchar
+dfont char=116
+amove 461 0
+aline 384 76
+aline 384 230
+aline 461 461
+aline 461 615
+aline 384 692
+aline 230 692
+aline 153 615
+aline 76 461
+amove 307 692
+aline 384 615
+aline 384 461
+aline 307 230
+aline 307 76
+aline 461 0
+aline 538 0
+aline 692 76
+aline 846 230
+aline 923 461
+aline 923 692
+aline 846 692
+aline 923 615
+stroke
+dfont endchar
+dfont char=117
+amove 153 230
+aline 230 153
+aline 384 76
+aline 538 76
+aline 769 153
+aline 923 307
+aline 1000 461
+amove 1000 538
+aline 923 615
+aline 769 615
+aline 615 461
+amove 538 230
+aline 461 0
+aline 384 -308
+amove 307 -308
+aline 538 230
+aline 615 461
+aline 692 615
+aline 769 692
+aline 923 692
+aline 1000 615
+aline 1000 461
+aline 923 230
+aline 769 76
+aline 538 0
+aline 384 0
+aline 230 76
+aline 153 230
+aline 153 384
+aline 230 538
+aline 307 615
+stroke
+dfont endchar
+dfont char=118
+amove 76 -308
+aline 230 -77
+aline 692 461
+aline 846 692
+amove 230 692
+aline 307 615
+aline 538 -231
+aline 692 -308
+aline 769 -308
+amove 692 -308
+aline 615 -231
+aline 384 615
+aline 230 692
+aline 153 692
+stroke
+dfont endchar
+dfont char=119
+amove 76 461
+aline 153 615
+aline 230 692
+aline 384 692
+aline 461 615
+aline 461 153
+aline 538 76
+aline 769 76
+aline 923 153
+aline 1076 307
+amove 1230 692
+aline 1153 461
+aline 1076 307
+aline 923 76
+aline 769 -1
+aline 538 -1
+aline 461 76
+aline 384 307
+aline 384 615
+aline 307 692
+amove 846 1000
+aline 615 -308
+amove 538 -308
+aline 923 1000
+stroke
+dfont endchar
+dfont char=120
+amove 153 230
+aline 307 76
+aline 461 76
+aline 615 230
+aline 692 76
+aline 846 76
+aline 999 153
+amove 692 461
+aline 615 230
+aline 538 76
+aline 461 -1
+aline 307 -1
+aline 230 76
+aline 153 230
+aline 153 384
+aline 230 538
+aline 307 615
+aline 461 692
+aline 461 615
+aline 307 615
+amove 615 461
+aline 615 76
+aline 692 0
+aline 846 0
+aline 999 153
+aline 1076 307
+aline 1076 461
+aline 999 615
+aline 923 692
+aline 923 615
+aline 999 615
+stroke
+dfont endchar
+dfont char=121
+amove 384 0
+aline 230 153
+aline 230 384
+aline 307 538
+aline 461 692
+amove 846 692
+aline 692 153
+aline 692 76
+aline 769 -1
+aline 923 -1
+aline 1000 76
+aline 1076 230
+amove 846 -1
+aline 769 76
+aline 769 153
+aline 923 692
+amove 769 384
+aline 769 538
+aline 615 692
+aline 461 692
+aline 307 615
+aline 230 538
+aline 153 384
+aline 153 230
+aline 230 76
+aline 384 0
+aline 538 0
+aline 692 153
+stroke
+dfont endchar
+dfont char=122
+amove 461 0
+aline 307 153
+aline 307 461
+aline 461 1000
+aline 230 1000
+amove 384 1000
+aline 230 461
+aline 230 230
+aline 307 76
+aline 461 0
+aline 615 0
+aline 769 76
+aline 846 153
+aline 923 307
+aline 923 461
+aline 846 615
+aline 692 692
+aline 538 692
+aline 384 615
+aline 307 461
+amove 692 692
+aline 846 538
+aline 846 307
+aline 769 153
+aline 615 0
+stroke
+dfont endchar
+dfont char=123
+amove 380 238
+aline 333 95
+aline 333 -96
+aline 380 -239
+amove 476 -334
+aline 333 -191
+aline 285 -48
+aline 285 47
+aline 333 190
+aline 428 285
+aline 428 333
+aline 238 428
+aline 428 523
+aline 428 571
+aline 333 666
+aline 285 809
+aline 285 904
+aline 333 1047
+aline 476 1190
+amove 380 1095
+aline 333 952
+aline 333 761
+aline 380 619
+stroke
+dfont endchar
+dfont char=124
+amove 230 -308
+aline 230 1230
+aline 615 1230
+amove 307 1230
+aline 307 -308
+amove 230 -308
+aline 615 -308
+stroke
+dfont endchar
+dfont char=125
+amove 238 -334
+aline 380 -191
+aline 428 -48
+aline 428 47
+aline 380 190
+aline 285 285
+aline 285 333
+aline 476 428
+aline 285 523
+aline 285 571
+aline 380 666
+aline 428 809
+aline 428 904
+aline 380 1047
+aline 238 1190
+amove 333 1095
+aline 380 952
+aline 380 761
+aline 333 619
+amove 333 238
+aline 380 95
+aline 380 -96
+aline 333 -239
+stroke
+dfont endchar
+dfont char=126
+amove 307 1000
+aline 230 923
+aline 230 769
+aline 307 692
+aline 461 692
+aline 538 769
+aline 538 923
+aline 461 1000
+aline 307 1000
+stroke
+dfont endchar
diff --git a/src/fonts/plci.afm b/src/fonts/plci.afm
new file mode 100644
index 0000000..6c2d9ac
--- /dev/null
+++ b/src/fonts/plci.afm
@@ -0,0 +1,115 @@
+StartFontMetrics 2.0
+Comment Made from HERSHEY font file using SPLITFONT.BAS
+FontName plCI
+EncodingScheme TEXENCODING
+FullName plCI
+FamilyName plCI
+Weight Medium
+ItalicAngle 0
+IsFixedPitch false
+UnderlinePosition -97
+UnderlineThickness 73
+FontBBox 0 -400 1001 1001
+CapHeight 729
+XHeight 151
+Descender -219
+Ascender 729
+StartCharMetrics 95
+C 32 ; WX 400 ; N C32 ; B 0 0 0 0 ;
+C 33 ; WX 415 ; N C33 ; B 161 0 268 700 ;
+C 34 ; WX 631 ; N C34 ; B 161 430 538 700 ;
+C 35 ; WX 846 ; N C35 ; B 161 0 699 592 ;
+C 36 ; WX 523 ; N C36 ; B 107 430 430 753 ;
+C 37 ; WX 784 ; N C37 ; B 99 0 700 700 ;
+C 38 ; WX 846 ; N C38 ; B 161 0 699 592 ;
+C 39 ; WX 361 ; N C39 ; B 161 430 214 700 ;
+C 40 ; WX 523 ; N C40 ; B 161 -215 430 861 ;
+C 41 ; WX 523 ; N C41 ; B 107 -215 376 861 ;
+C 42 ; WX 523 ; N C42 ; B 161 -215 376 861 ;
+C 43 ; WX 577 ; N C43 ; B 214 -215 376 861 ;
+C 44 ; WX 415 ; N C44 ; B 161 -161 268 107 ;
+C 45 ; WX 523 ; N C45 ; B 107 -215 376 861 ;
+C 46 ; WX 415 ; N C46 ; B 161 0 268 107 ;
+C 47 ; WX 792 ; N C47 ; B 107 -215 700 861 ;
+C 48 ; WX 685 ; N C48 ; B 107 0 592 700 ;
+C 49 ; WX 685 ; N C49 ; B 161 0 538 700 ;
+C 50 ; WX 685 ; N C50 ; B 107 0 592 700 ;
+C 51 ; WX 685 ; N C51 ; B 107 0 592 700 ;
+C 52 ; WX 685 ; N C52 ; B 53 0 646 700 ;
+C 53 ; WX 685 ; N C53 ; B 107 0 592 700 ;
+C 54 ; WX 685 ; N C54 ; B 107 0 592 700 ;
+C 55 ; WX 685 ; N C55 ; B 107 0 592 700 ;
+C 56 ; WX 685 ; N C56 ; B 107 0 592 700 ;
+C 57 ; WX 685 ; N C57 ; B 107 0 592 700 ;
+C 58 ; WX 415 ; N C58 ; B 161 0 268 484 ;
+C 59 ; WX 415 ; N C59 ; B 161 -161 268 484 ;
+C 60 ; WX 784 ; N C60 ; B 133 0 666 600 ;
+C 61 ; WX 577 ; N C61 ; B 214 -215 376 861 ;
+C 62 ; WX 784 ; N C62 ; B 133 0 666 600 ;
+C 63 ; WX 685 ; N C63 ; B 107 0 592 700 ;
+C 64 ; WX 884 ; N C64 ; B 99 0 799 700 ;
+C 65 ; WX 739 ; N C65 ; B -107 0 646 700 ;
+C 66 ; WX 792 ; N C66 ; B 0 0 700 700 ;
+C 67 ; WX 685 ; N C67 ; B 107 0 700 700 ;
+C 68 ; WX 792 ; N C68 ; B 0 0 700 700 ;
+C 69 ; WX 792 ; N C69 ; B 0 0 753 700 ;
+C 70 ; WX 739 ; N C70 ; B 0 0 753 700 ;
+C 71 ; WX 739 ; N C71 ; B 107 0 700 700 ;
+C 72 ; WX 900 ; N C72 ; B 0 0 915 700 ;
+C 73 ; WX 469 ; N C73 ; B 0 0 484 700 ;
+C 74 ; WX 631 ; N C74 ; B 0 0 646 700 ;
+C 75 ; WX 846 ; N C75 ; B 0 0 915 700 ;
+C 76 ; WX 685 ; N C76 ; B 0 0 592 700 ;
+C 77 ; WX 1008 ; N C77 ; B 0 0 1023 700 ;
+C 78 ; WX 846 ; N C78 ; B 0 0 861 700 ;
+C 79 ; WX 739 ; N C79 ; B 107 0 646 700 ;
+C 80 ; WX 792 ; N C80 ; B 0 0 753 700 ;
+C 81 ; WX 739 ; N C81 ; B 107 -161 646 700 ;
+C 82 ; WX 846 ; N C82 ; B 0 0 753 700 ;
+C 83 ; WX 792 ; N C83 ; B 53 0 753 700 ;
+C 84 ; WX 792 ; N C84 ; B 161 0 807 700 ;
+C 85 ; WX 900 ; N C85 ; B 161 0 915 700 ;
+C 86 ; WX 739 ; N C86 ; B 107 0 861 700 ;
+C 87 ; WX 954 ; N C87 ; B 161 0 1023 700 ;
+C 88 ; WX 792 ; N C88 ; B -53 0 861 700 ;
+C 89 ; WX 685 ; N C89 ; B 107 0 807 700 ;
+C 90 ; WX 685 ; N C90 ; B 0 0 700 700 ;
+C 91 ; WX 451 ; N C91 ; B 133 -233 366 833 ;
+C 92 ; WX 300 ; N C92 ; B 0 0 0 0 ;
+C 93 ; WX 451 ; N C93 ; B 99 -233 333 833 ;
+C 94 ; WX 300 ; N C94 ; B 0 0 0 0 ;
+C 95 ; WX 300 ; N C95 ; B 0 0 0 0 ;
+C 96 ; WX 318 ; N C96 ; B 133 500 199 700 ;
+C 97 ; WX 792 ; N C97 ; B 107 0 753 484 ;
+C 98 ; WX 739 ; N C98 ; B 161 0 646 700 ;
+C 99 ; WX 685 ; N C99 ; B 107 0 592 484 ;
+C 100 ; WX 792 ; N C100 ; B 107 0 753 700 ;
+C 101 ; WX 631 ; N C101 ; B 107 0 538 484 ;
+C 102 ; WX 577 ; N C102 ; B -53 -215 592 700 ;
+C 103 ; WX 739 ; N C103 ; B 53 -215 646 484 ;
+C 104 ; WX 792 ; N C104 ; B 53 0 753 700 ;
+C 105 ; WX 523 ; N C105 ; B 53 0 484 700 ;
+C 106 ; WX 523 ; N C106 ; B 0 -215 430 700 ;
+C 107 ; WX 685 ; N C107 ; B 53 0 592 700 ;
+C 108 ; WX 415 ; N C108 ; B 107 0 376 700 ;
+C 109 ; WX 1277 ; N C109 ; B 53 0 1238 484 ;
+C 110 ; WX 900 ; N C110 ; B 53 0 861 484 ;
+C 111 ; WX 685 ; N C111 ; B 107 0 592 484 ;
+C 112 ; WX 792 ; N C112 ; B 0 -215 700 484 ;
+C 113 ; WX 739 ; N C113 ; B 107 -215 646 484 ;
+C 114 ; WX 631 ; N C114 ; B 53 0 592 484 ;
+C 115 ; WX 685 ; N C115 ; B 107 0 592 484 ;
+C 116 ; WX 469 ; N C116 ; B 107 0 376 700 ;
+C 117 ; WX 900 ; N C117 ; B 53 0 861 484 ;
+C 118 ; WX 739 ; N C118 ; B 53 0 646 484 ;
+C 119 ; WX 1062 ; N C119 ; B 53 0 969 484 ;
+C 120 ; WX 846 ; N C120 ; B 107 0 753 484 ;
+C 121 ; WX 846 ; N C121 ; B 53 -215 753 484 ;
+C 122 ; WX 739 ; N C122 ; B 107 0 646 484 ;
+C 123 ; WX 485 ; N C123 ; B 166 -233 333 833 ;
+C 124 ; WX 523 ; N C124 ; B 161 -215 430 861 ;
+C 125 ; WX 485 ; N C125 ; B 166 -233 333 833 ;
+C 126 ; WX 523 ; N C126 ; B 161 484 376 700 ;
+EndCharMetrics
+
+EndFontMetrics
diff --git a/src/fonts/plci.gle b/src/fonts/plci.gle
new file mode 100644
index 0000000..b8765dc
--- /dev/null
+++ b/src/fonts/plci.gle
@@ -0,0 +1,2012 @@
+dfont design= 1428
+dfont char=33
+amove 307 1000
+aline 230 923
+aline 307 384
+aline 384 923
+aline 307 1000
+amove 307 923
+aline 307 692
+amove 307 153
+aline 230 76
+aline 307 0
+aline 384 76
+aline 307 153
+stroke
+dfont endchar
+dfont char=34
+amove 230 615
+aline 230 1000
+amove 307 1000
+aline 230 615
+amove 692 615
+aline 692 1000
+amove 769 1000
+aline 692 615
+stroke
+dfont endchar
+dfont char=35
+amove 230 0
+aline 999 0
+amove 615 0
+aline 615 846
+amove 230 461
+aline 999 461
+stroke
+dfont endchar
+dfont char=36
+amove 153 692
+aline 615 1000
+amove 384 1076
+aline 384 615
+amove 615 692
+aline 153 1000
+stroke
+dfont endchar
+dfont char=37
+amove 142 0
+aline 1000 1000
+aline 904 952
+aline 761 904
+aline 619 904
+aline 476 952
+aline 380 1000
+aline 285 1000
+aline 190 952
+aline 142 857
+aline 142 761
+aline 238 666
+aline 333 666
+aline 428 714
+aline 476 809
+aline 476 904
+aline 380 1000
+amove 809 333
+aline 714 285
+aline 666 190
+aline 666 95
+aline 761 0
+aline 857 0
+aline 952 47
+aline 1000 142
+aline 1000 238
+aline 904 333
+aline 809 333
+stroke
+dfont endchar
+dfont char=38
+amove 230 461
+aline 999 461
+amove 999 846
+aline 230 846
+amove 615 846
+aline 615 -1
+stroke
+dfont endchar
+dfont char=39
+amove 230 615
+aline 230 1000
+amove 307 1000
+aline 230 615
+stroke
+dfont endchar
+dfont char=40
+amove 461 -154
+aline 384 0
+aline 307 307
+aline 307 615
+aline 384 923
+aline 461 1076
+amove 615 1230
+aline 461 1076
+aline 307 846
+aline 230 615
+aline 230 307
+aline 307 76
+aline 461 -154
+aline 615 -308
+stroke
+dfont endchar
+dfont char=41
+amove 153 -308
+aline 307 -154
+aline 461 76
+aline 538 307
+aline 538 615
+aline 461 846
+aline 307 1076
+aline 153 1230
+amove 307 1076
+aline 384 923
+aline 461 615
+aline 461 307
+aline 384 0
+aline 307 -154
+stroke
+dfont endchar
+dfont char=42
+amove 230 -308
+aline 538 461
+aline 230 1230
+stroke
+dfont endchar
+dfont char=43
+amove 384 -77
+aline 461 230
+amove 384 76
+aline 461 -231
+amove 538 -308
+aline 461 -231
+aline 384 -77
+aline 384 76
+aline 461 230
+aline 461 307
+aline 307 461
+aline 461 615
+aline 461 692
+aline 384 846
+aline 384 999
+aline 461 1153
+aline 538 1230
+amove 461 1153
+aline 384 846
+amove 384 999
+aline 461 692
+stroke
+dfont endchar
+dfont char=44
+amove 230 -231
+aline 384 -77
+aline 384 76
+aline 307 153
+aline 230 76
+aline 307 -1
+aline 384 76
+stroke
+dfont endchar
+dfont char=45
+amove 153 -308
+aline 538 -308
+aline 538 1230
+aline 153 1230
+amove 461 1230
+aline 461 -308
+stroke
+dfont endchar
+dfont char=46
+amove 307 153
+aline 230 76
+aline 307 -1
+aline 384 76
+aline 307 153
+stroke
+dfont endchar
+dfont char=47
+amove 153 -308
+aline 1000 1230
+stroke
+dfont endchar
+dfont char=48
+amove 384 0
+aline 307 76
+aline 230 307
+aline 230 692
+aline 307 923
+aline 384 1000
+aline 615 1000
+aline 769 923
+aline 846 692
+aline 846 307
+aline 769 76
+aline 615 0
+aline 384 0
+aline 230 76
+aline 153 307
+aline 153 692
+aline 230 923
+aline 384 1000
+amove 615 1000
+aline 692 923
+aline 769 692
+aline 769 307
+aline 692 76
+aline 615 0
+stroke
+dfont endchar
+dfont char=49
+amove 230 0
+aline 769 0
+amove 538 0
+aline 538 1000
+aline 307 769
+amove 461 923
+aline 461 0
+stroke
+dfont endchar
+dfont char=50
+amove 153 0
+aline 153 230
+aline 230 384
+aline 384 461
+aline 615 538
+aline 769 615
+aline 846 769
+aline 769 923
+aline 615 1000
+aline 384 1000
+aline 230 923
+aline 153 846
+aline 153 769
+aline 230 769
+aline 230 846
+amove 615 1000
+aline 692 923
+aline 769 769
+aline 692 615
+aline 615 538
+amove 846 230
+aline 846 153
+aline 769 0
+aline 538 0
+aline 307 153
+amove 153 76
+aline 230 153
+aline 307 153
+aline 538 76
+aline 769 76
+aline 846 153
+stroke
+dfont endchar
+dfont char=51
+amove 230 153
+aline 230 230
+aline 153 230
+aline 153 153
+aline 230 76
+aline 384 -1
+aline 615 -1
+aline 769 76
+aline 846 230
+aline 846 307
+aline 769 461
+aline 615 538
+aline 461 538
+amove 615 538
+aline 769 615
+aline 846 769
+aline 769 923
+aline 615 1000
+aline 384 1000
+aline 230 923
+aline 153 846
+aline 153 769
+aline 230 769
+aline 230 846
+amove 615 1000
+aline 692 923
+aline 769 769
+aline 692 615
+aline 615 538
+aline 692 461
+aline 769 307
+aline 769 230
+aline 692 76
+aline 615 0
+stroke
+dfont endchar
+dfont char=52
+amove 384 0
+aline 769 0
+amove 615 0
+aline 615 1000
+aline 76 307
+aline 923 307
+amove 538 0
+aline 538 846
+stroke
+dfont endchar
+dfont char=53
+amove 230 153
+aline 230 230
+aline 153 230
+aline 153 153
+aline 230 76
+aline 384 -1
+aline 615 -1
+aline 769 76
+aline 846 230
+aline 846 461
+aline 769 615
+aline 615 692
+aline 384 692
+aline 230 615
+aline 153 538
+aline 230 1000
+aline 769 1000
+aline 538 923
+aline 230 923
+amove 615 692
+aline 692 615
+aline 769 461
+aline 769 230
+aline 692 76
+aline 615 0
+stroke
+dfont endchar
+dfont char=54
+amove 384 0
+aline 307 76
+aline 230 230
+aline 230 615
+aline 307 846
+aline 461 1000
+amove 769 846
+aline 769 769
+aline 846 769
+aline 846 846
+aline 769 923
+aline 615 1000
+aline 461 1000
+aline 307 923
+aline 230 846
+aline 153 615
+aline 153 230
+aline 230 76
+aline 384 0
+aline 615 0
+aline 769 76
+aline 846 230
+aline 846 384
+aline 769 538
+aline 615 615
+aline 384 615
+aline 153 461
+amove 615 615
+aline 692 538
+aline 769 384
+aline 769 230
+aline 692 76
+aline 615 0
+stroke
+dfont endchar
+dfont char=55
+amove 307 0
+aline 461 307
+aline 769 846
+aline 692 846
+aline 461 923
+aline 307 923
+aline 153 846
+aline 307 999
+aline 461 999
+aline 692 846
+amove 846 1000
+aline 615 538
+aline 384 0
+amove 153 692
+aline 153 1000
+stroke
+dfont endchar
+dfont char=56
+amove 384 0
+aline 307 76
+aline 230 230
+aline 230 307
+aline 307 461
+aline 384 538
+aline 307 615
+aline 230 769
+aline 307 923
+aline 384 1000
+aline 615 1000
+aline 769 923
+aline 846 769
+aline 769 615
+aline 615 538
+aline 384 538
+aline 230 615
+aline 153 769
+aline 230 923
+aline 384 1000
+amove 615 1000
+aline 692 923
+aline 769 769
+aline 692 615
+aline 615 538
+aline 769 461
+aline 846 307
+aline 846 230
+aline 769 76
+aline 615 0
+aline 384 0
+aline 230 76
+aline 153 230
+aline 153 307
+aline 230 461
+aline 384 538
+amove 615 538
+aline 692 461
+aline 769 307
+aline 769 230
+aline 692 76
+aline 615 0
+stroke
+dfont endchar
+dfont char=57
+amove 230 153
+aline 230 230
+aline 153 230
+aline 153 153
+aline 230 76
+aline 384 -1
+aline 538 -1
+aline 692 76
+aline 769 153
+aline 846 384
+aline 846 769
+aline 769 923
+aline 615 1000
+aline 384 1000
+aline 230 923
+aline 153 769
+aline 153 615
+aline 230 461
+aline 384 384
+aline 615 384
+aline 846 538
+amove 384 384
+aline 307 461
+aline 230 615
+aline 230 769
+aline 307 923
+aline 384 1000
+amove 615 1000
+aline 692 923
+aline 769 769
+aline 769 384
+aline 692 153
+aline 538 0
+stroke
+dfont endchar
+dfont char=58
+amove 307 692
+aline 230 615
+aline 307 538
+aline 384 615
+aline 307 692
+amove 307 153
+aline 230 76
+aline 307 0
+aline 384 76
+aline 307 153
+stroke
+dfont endchar
+dfont char=59
+amove 230 -231
+aline 384 -77
+aline 384 76
+aline 307 153
+aline 230 76
+aline 307 -1
+aline 384 76
+amove 307 692
+aline 230 615
+aline 307 538
+aline 384 615
+aline 307 692
+stroke
+dfont endchar
+dfont char=60
+amove 952 857
+aline 190 428
+aline 952 0
+stroke
+dfont endchar
+dfont char=61
+amove 307 -308
+aline 384 -231
+aline 461 -77
+aline 461 76
+aline 384 230
+aline 384 307
+aline 538 461
+aline 384 615
+aline 384 692
+aline 461 846
+aline 461 999
+aline 384 1153
+aline 307 1230
+amove 384 1153
+aline 461 846
+amove 461 1000
+aline 384 692
+amove 384 230
+aline 461 -77
+amove 461 76
+aline 384 -231
+stroke
+dfont endchar
+dfont char=62
+amove 190 0
+aline 952 428
+aline 190 857
+stroke
+dfont endchar
+dfont char=63
+amove 461 76
+aline 461 -1
+aline 538 -1
+aline 538 76
+aline 461 76
+amove 538 307
+aline 461 307
+aline 461 384
+aline 538 461
+aline 769 538
+aline 846 692
+aline 846 769
+aline 769 923
+aline 615 1000
+aline 384 1000
+aline 230 923
+aline 153 769
+aline 153 692
+aline 230 692
+aline 230 769
+aline 153 769
+amove 538 461
+aline 692 538
+aline 769 615
+aline 769 846
+aline 615 1000
+stroke
+dfont endchar
+dfont char=64
+amove 523 238
+aline 476 285
+aline 428 380
+aline 428 523
+aline 476 666
+aline 571 761
+amove 857 761
+aline 809 380
+aline 809 285
+aline 904 238
+aline 999 238
+aline 1095 333
+aline 1142 476
+aline 1142 571
+aline 1095 714
+aline 1047 809
+aline 952 904
+aline 857 952
+aline 714 1000
+aline 571 1000
+aline 428 952
+aline 333 904
+aline 238 809
+aline 190 714
+aline 142 571
+aline 142 428
+aline 190 285
+aline 238 190
+aline 333 95
+aline 428 47
+aline 571 0
+aline 714 0
+aline 857 47
+aline 952 95
+aline 1000 142
+amove 904 238
+aline 857 285
+aline 857 380
+aline 904 761
+amove 857 619
+aline 809 714
+aline 714 761
+aline 571 761
+aline 476 714
+aline 428 666
+aline 380 523
+aline 380 380
+aline 428 285
+aline 523 238
+aline 666 238
+aline 761 285
+aline 809 380
+stroke
+dfont endchar
+dfont char=65
+amove 0 0
+aline 692 1000
+aline 769 0
+amove 692 0
+aline 615 846
+amove 692 307
+aline 230 307
+amove 230 0
+aline -154 0
+amove 538 0
+aline 923 0
+stroke
+dfont endchar
+dfont char=66
+amove 0 0
+aline 538 0
+aline 769 76
+aline 846 230
+aline 846 384
+aline 769 461
+aline 615 538
+aline 384 538
+amove 615 538
+aline 769 384
+aline 769 230
+aline 692 76
+aline 538 0
+amove 230 0
+aline 538 1000
+amove 461 1000
+aline 153 0
+amove 692 538
+aline 923 615
+aline 1000 769
+aline 1000 923
+aline 846 1000
+aline 307 1000
+amove 846 1000
+aline 923 923
+aline 923 769
+aline 846 615
+aline 692 538
+stroke
+dfont endchar
+dfont char=67
+amove 384 0
+aline 230 153
+aline 230 461
+aline 307 692
+aline 384 846
+aline 538 1000
+amove 846 923
+aline 923 923
+aline 1000 1000
+aline 923 769
+aline 846 923
+aline 692 1000
+aline 538 1000
+aline 384 923
+aline 307 846
+aline 230 692
+aline 153 461
+aline 153 230
+aline 230 76
+aline 384 -1
+aline 538 -1
+aline 692 76
+aline 769 230
+stroke
+dfont endchar
+dfont char=68
+amove 0 0
+aline 538 0
+aline 769 76
+aline 846 153
+aline 923 307
+aline 1000 538
+aline 1000 769
+aline 923 923
+aline 769 1000
+aline 307 1000
+amove 461 1000
+aline 153 0
+amove 230 0
+aline 538 1000
+amove 769 1000
+aline 846 923
+aline 923 769
+aline 923 538
+aline 846 307
+aline 769 153
+aline 692 76
+aline 538 0
+stroke
+dfont endchar
+dfont char=69
+amove 0 0
+aline 769 0
+aline 846 230
+aline 692 0
+amove 615 384
+aline 692 692
+amove 615 538
+aline 384 538
+amove 461 1000
+aline 153 0
+amove 230 0
+aline 538 1000
+amove 307 1000
+aline 1076 1000
+aline 1000 769
+aline 1000 1000
+stroke
+dfont endchar
+dfont char=70
+amove 0 0
+aline 384 0
+amove 230 0
+aline 538 1000
+amove 461 1000
+aline 153 0
+amove 384 538
+aline 615 538
+amove 615 384
+aline 692 692
+amove 1000 1000
+aline 1000 769
+aline 1076 1000
+aline 307 1000
+stroke
+dfont endchar
+dfont char=71
+amove 384 0
+aline 230 153
+aline 230 461
+aline 307 692
+aline 384 846
+aline 538 1000
+amove 846 923
+aline 923 923
+aline 1000 1000
+aline 923 769
+aline 846 923
+aline 692 1000
+aline 538 1000
+aline 384 923
+aline 307 846
+aline 230 692
+aline 153 461
+aline 153 230
+aline 230 76
+aline 384 -1
+aline 538 -1
+aline 692 76
+aline 769 153
+aline 846 384
+amove 769 384
+aline 692 153
+aline 538 -1
+amove 615 384
+aline 1000 384
+stroke
+dfont endchar
+dfont char=72
+amove 0 0
+aline 384 0
+amove 230 0
+aline 538 1000
+amove 461 1000
+aline 153 0
+amove 615 0
+aline 1000 0
+amove 846 0
+aline 1153 1000
+amove 1076 1000
+aline 769 0
+amove 923 538
+aline 384 538
+amove 307 1000
+aline 692 1000
+amove 923 1000
+aline 1307 1000
+stroke
+dfont endchar
+dfont char=73
+amove 0 0
+aline 384 0
+amove 230 0
+aline 538 1000
+amove 461 1000
+aline 153 0
+amove 307 1000
+aline 692 1000
+stroke
+dfont endchar
+dfont char=74
+amove 76 153
+aline 153 230
+aline 76 307
+aline -1 230
+aline 76 76
+aline 230 -1
+aline 307 -1
+aline 461 76
+aline 538 230
+aline 769 1000
+amove 692 1000
+aline 461 230
+aline 384 76
+aline 307 0
+amove 538 1000
+aline 923 1000
+stroke
+dfont endchar
+dfont char=75
+amove 0 0
+aline 384 0
+amove 230 0
+aline 538 1000
+amove 461 1000
+aline 153 0
+amove 615 0
+aline 1000 0
+amove 846 0
+aline 692 615
+amove 615 615
+aline 769 0
+amove 384 461
+aline 1153 1000
+amove 1307 1000
+aline 923 1000
+amove 692 1000
+aline 307 1000
+stroke
+dfont endchar
+dfont char=76
+amove 0 0
+aline 769 0
+aline 846 230
+aline 692 0
+amove 230 0
+aline 538 1000
+amove 461 1000
+aline 153 0
+amove 307 1000
+aline 692 1000
+stroke
+dfont endchar
+dfont char=77
+amove 0 0
+aline 307 0
+amove 153 0
+aline 461 1000
+amove 538 1000
+aline 615 153
+amove 538 -1
+aline 461 846
+amove 538 1000
+aline 307 1000
+amove 1230 1000
+aline 538 0
+amove 769 0
+aline 1153 0
+amove 1000 0
+aline 1307 1000
+amove 1230 1000
+aline 923 0
+amove 1230 1000
+aline 1461 1000
+stroke
+dfont endchar
+dfont char=78
+amove 0 0
+aline 307 0
+amove 153 0
+aline 461 1000
+aline 769 0
+aline 1076 1000
+amove 923 1000
+aline 1230 1000
+amove 538 1000
+aline 769 230
+amove 538 1000
+aline 307 1000
+stroke
+dfont endchar
+dfont char=79
+amove 384 0
+aline 230 153
+aline 230 461
+aline 307 692
+aline 384 846
+aline 538 1000
+aline 692 1000
+aline 846 923
+aline 923 769
+aline 923 538
+aline 846 307
+aline 769 153
+aline 692 76
+aline 538 0
+aline 384 0
+aline 230 76
+aline 153 230
+aline 153 461
+aline 230 692
+aline 307 846
+aline 384 923
+aline 538 1000
+amove 692 1000
+aline 846 846
+aline 846 538
+aline 769 307
+aline 692 153
+aline 538 0
+stroke
+dfont endchar
+dfont char=80
+amove 0 0
+aline 384 0
+amove 230 0
+aline 538 1000
+amove 461 1000
+aline 153 0
+amove 384 461
+aline 769 461
+aline 1000 538
+aline 1076 692
+aline 1076 846
+aline 1000 923
+aline 846 1000
+aline 307 1000
+amove 846 1000
+aline 1000 846
+aline 1000 692
+aline 923 538
+aline 769 461
+stroke
+dfont endchar
+dfont char=81
+amove 307 76
+aline 307 153
+aline 384 230
+aline 461 230
+aline 538 153
+aline 538 -154
+aline 615 -231
+aline 692 -231
+aline 769 -154
+amove 692 -231
+aline 615 -154
+aline 538 153
+amove 538 -1
+aline 692 153
+aline 769 307
+aline 846 538
+aline 846 846
+aline 692 999
+amove 538 999
+aline 692 999
+aline 846 923
+aline 923 769
+aline 923 538
+aline 846 307
+aline 769 153
+aline 692 76
+aline 538 0
+aline 384 0
+aline 230 76
+aline 153 230
+aline 153 461
+aline 230 692
+aline 307 846
+aline 384 923
+aline 538 1000
+aline 384 846
+aline 307 692
+aline 230 461
+aline 230 153
+aline 384 0
+stroke
+dfont endchar
+dfont char=82
+amove 0 0
+aline 384 0
+amove 230 0
+aline 538 1000
+amove 461 1000
+aline 153 0
+amove 384 461
+aline 769 461
+aline 1000 538
+aline 1076 692
+aline 1076 846
+aline 1000 923
+aline 846 1000
+aline 307 1000
+amove 846 1000
+aline 1000 846
+aline 1000 692
+aline 923 538
+aline 769 461
+amove 692 461
+aline 769 76
+aline 846 0
+aline 923 0
+aline 1000 76
+amove 923 0
+aline 846 76
+aline 769 384
+aline 692 461
+stroke
+dfont endchar
+dfont char=83
+amove 230 76
+aline 153 76
+aline 76 -1
+aline 153 230
+aline 230 76
+aline 384 -1
+aline 615 -1
+aline 769 76
+aline 846 153
+aline 846 384
+aline 769 461
+aline 384 692
+aline 307 769
+amove 923 923
+aline 1000 923
+aline 1076 1000
+aline 1000 769
+aline 923 923
+aline 769 1000
+aline 538 1000
+aline 384 923
+aline 307 846
+aline 307 692
+aline 384 615
+aline 769 384
+aline 846 307
+stroke
+dfont endchar
+dfont char=84
+amove 230 0
+aline 615 0
+amove 461 0
+aline 769 1000
+amove 692 1000
+aline 384 0
+amove 384 1000
+aline 230 769
+aline 307 1000
+aline 1153 1000
+aline 1076 769
+aline 1076 1000
+stroke
+dfont endchar
+dfont char=85
+amove 384 0
+aline 307 76
+aline 307 230
+aline 538 1000
+amove 461 1000
+aline 230 230
+aline 230 76
+aline 384 0
+aline 692 0
+aline 846 76
+aline 923 230
+aline 1153 1000
+amove 999 1000
+aline 1307 1000
+amove 692 1000
+aline 307 1000
+stroke
+dfont endchar
+dfont char=86
+amove 384 0
+aline 307 1000
+amove 384 1000
+aline 461 153
+amove 384 -1
+aline 1076 1000
+amove 1230 1000
+aline 846 1000
+amove 538 1000
+aline 153 1000
+stroke
+dfont endchar
+dfont char=87
+amove 307 0
+aline 384 1000
+amove 461 1000
+aline 384 153
+amove 307 -1
+aline 846 1000
+aline 769 0
+aline 1307 1000
+amove 1153 1000
+aline 1461 1000
+amove 923 1000
+aline 846 153
+amove 615 1000
+aline 230 1000
+stroke
+dfont endchar
+dfont char=88
+amove 76 0
+aline 1076 1000
+amove 1230 1000
+aline 846 1000
+amove 615 1000
+aline 230 1000
+amove 384 1000
+aline 692 0
+amove 769 0
+aline 461 1000
+amove 538 0
+aline 923 0
+amove 307 0
+aline -77 0
+stroke
+dfont endchar
+dfont char=89
+amove 153 0
+aline 538 0
+amove 384 0
+aline 538 538
+aline 1000 1000
+amove 1153 1000
+aline 769 1000
+amove 538 1000
+aline 153 1000
+amove 307 1000
+aline 461 538
+aline 307 0
+amove 538 538
+aline 384 1000
+stroke
+dfont endchar
+dfont char=90
+amove 0 0
+aline 923 1000
+amove 1000 1000
+aline 76 0
+amove -1 0
+aline 692 0
+aline 769 230
+aline 615 0
+amove 384 1000
+aline 230 769
+aline 307 1000
+aline 1000 1000
+stroke
+dfont endchar
+dfont char=91
+amove 190 -334
+aline 190 1190
+aline 523 1190
+amove 238 1190
+aline 238 -334
+amove 190 -334
+aline 523 -334
+stroke
+dfont endchar
+stroke
+dfont endchar
+dfont char=93
+amove 142 -334
+aline 476 -334
+aline 476 1190
+aline 142 1190
+amove 428 1190
+aline 428 -334
+stroke
+dfont endchar
+stroke
+dfont endchar
+stroke
+dfont endchar
+dfont char=96
+amove 238 904
+aline 285 952
+aline 238 1000
+aline 190 952
+aline 190 857
+aline 238 761
+aline 285 714
+stroke
+dfont endchar
+dfont char=97
+amove 384 0
+aline 230 153
+aline 230 384
+aline 307 538
+aline 461 692
+amove 846 692
+aline 692 153
+aline 692 76
+aline 769 -1
+aline 923 -1
+aline 1000 76
+aline 1076 230
+amove 846 -1
+aline 769 76
+aline 769 153
+aline 923 692
+amove 769 384
+aline 769 538
+aline 615 692
+aline 461 692
+aline 307 615
+aline 230 538
+aline 153 384
+aline 153 230
+aline 230 76
+aline 384 0
+aline 538 0
+aline 692 153
+stroke
+dfont endchar
+dfont char=98
+amove 461 0
+aline 307 153
+aline 307 461
+aline 461 1000
+aline 230 1000
+amove 384 1000
+aline 230 461
+aline 230 230
+aline 307 76
+aline 461 0
+aline 615 0
+aline 769 76
+aline 846 153
+aline 923 307
+aline 923 461
+aline 846 615
+aline 692 692
+aline 538 692
+aline 384 615
+aline 307 461
+amove 692 692
+aline 846 538
+aline 846 307
+aline 769 153
+aline 615 0
+stroke
+dfont endchar
+dfont char=99
+amove 384 0
+aline 230 153
+aline 230 384
+aline 307 538
+aline 461 692
+amove 769 615
+aline 769 538
+aline 846 538
+aline 769 615
+aline 615 692
+aline 461 692
+aline 307 615
+aline 230 538
+aline 153 384
+aline 153 230
+aline 230 76
+aline 384 0
+aline 538 0
+aline 692 76
+aline 769 153
+stroke
+dfont endchar
+dfont char=100
+amove 384 0
+aline 230 153
+aline 230 384
+aline 307 538
+aline 461 692
+amove 769 1000
+aline 1000 1000
+aline 769 153
+aline 769 76
+aline 846 -1
+amove 692 153
+aline 538 -1
+aline 384 -1
+aline 230 76
+aline 153 230
+aline 153 384
+aline 230 538
+aline 307 615
+aline 461 692
+aline 615 692
+aline 769 538
+aline 769 384
+amove 1076 230
+aline 1000 76
+aline 923 0
+aline 769 0
+aline 692 76
+aline 692 153
+aline 923 1000
+stroke
+dfont endchar
+dfont char=101
+amove 230 230
+aline 538 307
+aline 692 384
+aline 769 461
+aline 769 615
+aline 615 692
+aline 461 692
+aline 307 615
+aline 230 538
+aline 153 384
+aline 153 230
+aline 230 76
+aline 384 0
+aline 538 0
+aline 692 76
+aline 769 153
+amove 461 692
+aline 307 538
+aline 230 384
+aline 230 153
+aline 384 0
+stroke
+dfont endchar
+dfont char=102
+amove 0 -308
+aline -77 -231
+aline -77 -308
+aline 76 -308
+aline 230 -231
+aline 307 -77
+aline 538 769
+aline 615 923
+aline 692 1000
+amove 769 1000
+aline 846 923
+aline 846 1000
+aline 692 1000
+aline 538 923
+aline 461 769
+aline 230 -77
+aline 153 -231
+aline 76 -308
+amove 230 692
+aline 692 692
+stroke
+dfont endchar
+dfont char=103
+amove 230 -308
+aline 153 -231
+aline 76 -231
+aline 153 -308
+aline 384 -308
+aline 538 -231
+aline 692 -77
+aline 769 153
+aline 923 692
+amove 846 692
+aline 692 153
+aline 615 -77
+aline 538 -231
+amove 384 0
+aline 230 153
+aline 230 384
+aline 307 538
+aline 461 692
+amove 769 384
+aline 769 538
+aline 615 692
+aline 461 692
+aline 307 615
+aline 230 538
+aline 153 384
+aline 153 230
+aline 230 76
+aline 384 0
+aline 538 0
+aline 692 153
+stroke
+dfont endchar
+dfont char=104
+amove 76 0
+aline 384 1000
+amove 461 1000
+aline 153 0
+amove 307 538
+aline 384 615
+aline 538 692
+aline 692 692
+aline 846 615
+aline 846 461
+aline 769 230
+aline 769 76
+aline 846 0
+amove 1076 230
+aline 1000 76
+aline 923 0
+aline 769 0
+aline 692 76
+aline 692 230
+aline 769 461
+aline 769 615
+aline 692 692
+amove 461 1000
+aline 230 1000
+stroke
+dfont endchar
+dfont char=105
+amove 461 0
+aline 384 76
+aline 384 230
+aline 461 461
+aline 461 615
+aline 384 692
+aline 230 692
+aline 153 615
+aline 76 461
+amove 307 692
+aline 384 615
+aline 384 461
+aline 307 230
+aline 307 76
+aline 384 0
+aline 538 0
+aline 615 76
+aline 692 230
+amove 461 1000
+aline 461 923
+aline 538 923
+aline 538 1000
+aline 461 1000
+stroke
+dfont endchar
+dfont char=106
+amove 76 -308
+aline -1 -231
+aline -1 -308
+aline 153 -308
+aline 307 -231
+aline 384 -77
+aline 538 461
+aline 538 615
+aline 461 692
+aline 307 692
+aline 230 615
+aline 153 461
+amove 384 692
+aline 461 615
+aline 461 461
+aline 307 -77
+aline 230 -231
+aline 153 -308
+amove 538 1000
+aline 538 923
+aline 615 923
+aline 615 1000
+aline 538 1000
+stroke
+dfont endchar
+dfont char=107
+amove 76 0
+aline 384 1000
+amove 461 1000
+aline 153 0
+amove 615 0
+aline 538 76
+aline 461 384
+aline 307 461
+aline 384 461
+aline 538 538
+aline 692 692
+aline 769 692
+aline 846 615
+aline 846 538
+aline 769 538
+aline 846 615
+amove 846 230
+aline 769 76
+aline 692 0
+aline 538 0
+aline 461 76
+aline 384 384
+aline 307 461
+amove 230 1000
+aline 461 1000
+stroke
+dfont endchar
+dfont char=108
+amove 307 0
+aline 230 76
+aline 230 153
+aline 461 1000
+aline 230 1000
+amove 384 1000
+aline 153 153
+aline 153 76
+aline 230 -1
+aline 384 -1
+aline 461 76
+aline 538 230
+stroke
+dfont endchar
+dfont char=109
+amove 76 461
+aline 153 615
+aline 230 692
+aline 384 692
+aline 461 615
+aline 461 538
+aline 307 0
+amove 307 692
+aline 384 615
+aline 384 538
+aline 230 0
+amove 461 538
+aline 538 615
+aline 692 692
+aline 846 692
+aline 1000 615
+aline 1000 538
+aline 846 0
+amove 846 692
+aline 923 615
+aline 923 538
+aline 769 0
+amove 1000 538
+aline 1076 615
+aline 1230 692
+aline 1384 692
+aline 1538 615
+aline 1538 461
+aline 1461 230
+aline 1461 76
+aline 1538 0
+amove 1384 692
+aline 1461 615
+aline 1461 461
+aline 1384 230
+aline 1384 76
+aline 1461 0
+aline 1615 0
+aline 1692 76
+aline 1769 230
+stroke
+dfont endchar
+dfont char=110
+amove 230 0
+aline 384 538
+aline 384 615
+aline 307 692
+amove 461 538
+aline 538 615
+aline 692 692
+aline 846 692
+aline 999 615
+aline 999 461
+aline 923 230
+aline 923 76
+aline 999 0
+amove 1230 230
+aline 1153 76
+aline 1076 0
+aline 923 0
+aline 846 76
+aline 846 230
+aline 923 461
+aline 923 615
+aline 846 692
+amove 76 461
+aline 153 615
+aline 230 692
+aline 384 692
+aline 461 615
+aline 461 538
+aline 307 0
+stroke
+dfont endchar
+dfont char=111
+amove 384 0
+aline 230 153
+aline 230 384
+aline 307 538
+aline 461 692
+aline 615 692
+aline 769 615
+aline 846 461
+aline 846 307
+aline 769 153
+aline 692 76
+aline 538 0
+aline 384 0
+aline 230 76
+aline 153 230
+aline 153 384
+aline 230 538
+aline 307 615
+aline 461 692
+amove 615 692
+aline 769 538
+aline 769 307
+aline 692 153
+aline 538 0
+stroke
+dfont endchar
+dfont char=112
+amove 0 -308
+aline 384 -308
+amove 230 -308
+aline 461 538
+aline 461 615
+aline 384 692
+aline 230 692
+aline 153 615
+aline 76 461
+amove 307 692
+aline 384 615
+aline 384 538
+aline 153 -308
+amove 692 0
+aline 846 153
+aline 923 307
+aline 923 538
+aline 769 692
+amove 461 538
+aline 615 692
+aline 769 692
+aline 923 615
+aline 1000 461
+aline 1000 307
+aline 923 153
+aline 846 76
+aline 692 0
+aline 538 0
+aline 384 153
+aline 384 307
+stroke
+dfont endchar
+dfont char=113
+amove 384 0
+aline 230 153
+aline 230 384
+aline 307 538
+aline 461 692
+amove 846 692
+aline 538 -308
+amove 615 -308
+aline 923 692
+amove 769 384
+aline 769 538
+aline 615 692
+aline 461 692
+aline 307 615
+aline 230 538
+aline 153 384
+aline 153 230
+aline 230 76
+aline 384 0
+aline 538 0
+aline 692 153
+amove 769 -308
+aline 384 -308
+stroke
+dfont endchar
+dfont char=114
+amove 230 0
+aline 384 538
+aline 384 615
+aline 307 692
+amove 461 538
+aline 538 615
+aline 692 692
+aline 769 692
+aline 846 615
+aline 846 538
+aline 769 538
+aline 846 615
+amove 76 461
+aline 153 615
+aline 230 692
+aline 384 692
+aline 461 615
+aline 461 538
+aline 307 0
+stroke
+dfont endchar
+dfont char=115
+amove 230 76
+aline 230 153
+aline 153 153
+aline 230 76
+aline 384 -1
+aline 615 -1
+aline 769 76
+aline 769 307
+aline 615 384
+aline 384 461
+aline 230 538
+amove 769 615
+aline 769 538
+aline 846 538
+aline 769 615
+aline 615 692
+aline 384 692
+aline 230 615
+aline 230 461
+aline 384 384
+aline 615 307
+aline 769 230
+stroke
+dfont endchar
+dfont char=116
+amove 307 0
+aline 230 76
+aline 230 153
+aline 461 1000
+amove 384 1000
+aline 153 153
+aline 153 76
+aline 230 -1
+aline 384 -1
+aline 461 76
+aline 538 230
+amove 538 692
+aline 153 692
+stroke
+dfont endchar
+dfont char=117
+amove 461 0
+aline 384 76
+aline 384 230
+aline 461 461
+aline 461 615
+aline 384 692
+aline 230 692
+aline 153 615
+aline 76 461
+amove 307 692
+aline 384 615
+aline 384 461
+aline 307 230
+aline 307 76
+aline 461 0
+aline 615 0
+aline 769 76
+aline 846 153
+amove 1000 0
+aline 923 76
+aline 923 153
+aline 1076 692
+amove 1000 692
+aline 846 153
+aline 846 76
+aline 923 0
+aline 1076 0
+aline 1153 76
+aline 1230 230
+stroke
+dfont endchar
+dfont char=118
+amove 461 0
+aline 384 76
+aline 384 230
+aline 461 461
+aline 461 615
+aline 384 692
+aline 230 692
+aline 153 615
+aline 76 461
+amove 307 692
+aline 384 615
+aline 384 461
+aline 307 230
+aline 307 76
+aline 461 0
+aline 538 0
+aline 692 76
+aline 846 230
+aline 923 461
+aline 923 692
+aline 846 692
+aline 923 615
+stroke
+dfont endchar
+dfont char=119
+amove 461 0
+aline 384 76
+aline 384 230
+aline 461 461
+aline 461 615
+aline 384 692
+aline 230 692
+aline 153 615
+aline 76 461
+amove 307 692
+aline 384 615
+aline 384 461
+aline 307 230
+aline 307 76
+aline 461 0
+aline 538 0
+aline 692 76
+aline 769 153
+amove 923 0
+aline 769 76
+aline 769 153
+aline 923 692
+amove 1000 692
+aline 846 153
+aline 846 76
+aline 923 0
+aline 1000 0
+aline 1153 76
+aline 1307 230
+aline 1384 461
+aline 1384 692
+aline 1307 692
+aline 1384 615
+stroke
+dfont endchar
+dfont char=120
+amove 153 76
+aline 230 153
+aline 153 153
+aline 153 76
+aline 230 -1
+aline 307 -1
+aline 461 76
+aline 538 230
+aline 615 461
+aline 615 615
+aline 538 692
+amove 692 461
+aline 692 615
+aline 615 692
+aline 461 692
+aline 307 615
+aline 230 461
+amove 538 230
+aline 538 76
+aline 615 -1
+aline 769 -1
+aline 923 76
+aline 1000 230
+amove 692 -1
+aline 615 76
+aline 615 230
+aline 692 461
+aline 769 615
+aline 923 692
+aline 1000 692
+aline 1076 615
+aline 1076 538
+aline 1000 538
+aline 1076 615
+stroke
+dfont endchar
+dfont char=121
+amove 461 0
+aline 384 76
+aline 384 230
+aline 461 461
+aline 461 615
+aline 384 692
+aline 230 692
+aline 153 615
+aline 76 461
+amove 307 692
+aline 384 615
+aline 384 461
+aline 307 230
+aline 307 76
+aline 461 0
+aline 615 0
+aline 769 76
+aline 846 153
+amove 692 -231
+aline 769 -77
+aline 846 153
+aline 1000 692
+amove 1076 692
+aline 923 153
+aline 846 -77
+aline 692 -231
+aline 538 -308
+aline 307 -308
+aline 230 -231
+aline 307 -231
+aline 384 -308
+stroke
+dfont endchar
+dfont char=122
+amove 153 0
+aline 153 76
+aline 230 153
+aline 846 538
+aline 923 615
+aline 923 692
+amove 846 538
+aline 769 538
+aline 538 615
+aline 307 615
+amove 230 538
+aline 307 692
+aline 538 692
+aline 769 538
+amove 846 153
+aline 769 0
+aline 538 0
+aline 307 153
+amove 230 153
+aline 307 153
+aline 538 76
+aline 769 76
+stroke
+dfont endchar
+dfont char=123
+amove 380 238
+aline 333 95
+aline 333 -96
+aline 380 -239
+amove 476 -334
+aline 333 -191
+aline 285 -48
+aline 285 47
+aline 333 190
+aline 428 285
+aline 428 333
+aline 238 428
+aline 428 523
+aline 428 571
+aline 333 666
+aline 285 809
+aline 285 904
+aline 333 1047
+aline 476 1190
+amove 380 1095
+aline 333 952
+aline 333 761
+aline 380 619
+stroke
+dfont endchar
+dfont char=124
+amove 230 -308
+aline 230 1230
+aline 615 1230
+amove 307 1230
+aline 307 -308
+amove 230 -308
+aline 615 -308
+stroke
+dfont endchar
+dfont char=125
+amove 238 -334
+aline 380 -191
+aline 428 -48
+aline 428 47
+aline 380 190
+aline 285 285
+aline 285 333
+aline 476 428
+aline 285 523
+aline 285 571
+aline 380 666
+aline 428 809
+aline 428 904
+aline 380 1047
+aline 238 1190
+amove 333 1095
+aline 380 952
+aline 380 761
+aline 333 619
+amove 333 238
+aline 380 95
+aline 380 -96
+aline 333 -239
+stroke
+dfont endchar
+dfont char=126
+amove 307 1000
+aline 230 923
+aline 230 769
+aline 307 692
+aline 461 692
+aline 538 769
+aline 538 923
+aline 461 1000
+aline 307 1000
+stroke
+dfont endchar
diff --git a/src/fonts/plcr.afm b/src/fonts/plcr.afm
new file mode 100644
index 0000000..ae2249a
--- /dev/null
+++ b/src/fonts/plcr.afm
@@ -0,0 +1,115 @@
+StartFontMetrics 2.0
+Comment Made from HERSHEY font file using SPLITFONT.BAS
+FontName plCR
+EncodingScheme TEXENCODING
+FullName plCR
+FamilyName plCR
+Weight Medium
+ItalicAngle 0
+IsFixedPitch false
+UnderlinePosition -97
+UnderlineThickness 73
+FontBBox 0 -400 1001 1001
+CapHeight 729
+XHeight 151
+Descender -219
+Ascender 729
+StartCharMetrics 95
+C 32 ; WX 400 ; N C32 ; B 0 0 0 0 ;
+C 33 ; WX 415 ; N C33 ; B 161 0 268 700 ;
+C 34 ; WX 631 ; N C34 ; B 161 430 538 700 ;
+C 35 ; WX 846 ; N C35 ; B 161 0 699 592 ;
+C 36 ; WX 523 ; N C36 ; B 107 430 430 753 ;
+C 37 ; WX 784 ; N C37 ; B 99 0 700 700 ;
+C 38 ; WX 846 ; N C38 ; B 161 0 699 592 ;
+C 39 ; WX 361 ; N C39 ; B 161 430 214 700 ;
+C 40 ; WX 523 ; N C40 ; B 161 -215 430 861 ;
+C 41 ; WX 523 ; N C41 ; B 107 -215 376 861 ;
+C 42 ; WX 523 ; N C42 ; B 161 -215 376 861 ;
+C 43 ; WX 577 ; N C43 ; B 214 -215 376 861 ;
+C 44 ; WX 415 ; N C44 ; B 161 -161 268 107 ;
+C 45 ; WX 523 ; N C45 ; B 107 -215 376 861 ;
+C 46 ; WX 415 ; N C46 ; B 161 0 268 107 ;
+C 47 ; WX 792 ; N C47 ; B 107 -215 700 861 ;
+C 48 ; WX 685 ; N C48 ; B 107 0 592 700 ;
+C 49 ; WX 685 ; N C49 ; B 161 0 538 700 ;
+C 50 ; WX 685 ; N C50 ; B 107 0 592 700 ;
+C 51 ; WX 685 ; N C51 ; B 107 0 592 700 ;
+C 52 ; WX 685 ; N C52 ; B 53 0 646 700 ;
+C 53 ; WX 685 ; N C53 ; B 107 0 592 700 ;
+C 54 ; WX 685 ; N C54 ; B 107 0 592 700 ;
+C 55 ; WX 685 ; N C55 ; B 107 0 592 700 ;
+C 56 ; WX 685 ; N C56 ; B 107 0 592 700 ;
+C 57 ; WX 685 ; N C57 ; B 107 0 592 700 ;
+C 58 ; WX 415 ; N C58 ; B 161 0 268 484 ;
+C 59 ; WX 415 ; N C59 ; B 161 -161 268 484 ;
+C 60 ; WX 784 ; N C60 ; B 133 0 666 600 ;
+C 61 ; WX 577 ; N C61 ; B 214 -215 376 861 ;
+C 62 ; WX 784 ; N C62 ; B 133 0 666 600 ;
+C 63 ; WX 685 ; N C63 ; B 107 0 592 700 ;
+C 64 ; WX 884 ; N C64 ; B 99 0 799 700 ;
+C 65 ; WX 739 ; N C65 ; B 0 0 753 700 ;
+C 66 ; WX 846 ; N C66 ; B 107 0 700 700 ;
+C 67 ; WX 739 ; N C67 ; B 107 0 646 700 ;
+C 68 ; WX 846 ; N C68 ; B 107 0 753 700 ;
+C 69 ; WX 792 ; N C69 ; B 107 0 646 700 ;
+C 70 ; WX 739 ; N C70 ; B 107 0 646 700 ;
+C 71 ; WX 846 ; N C71 ; B 107 0 753 700 ;
+C 72 ; WX 900 ; N C72 ; B 107 0 807 700 ;
+C 73 ; WX 469 ; N C73 ; B 107 0 376 700 ;
+C 74 ; WX 631 ; N C74 ; B 53 0 538 700 ;
+C 75 ; WX 846 ; N C75 ; B 107 0 807 700 ;
+C 76 ; WX 685 ; N C76 ; B 107 0 646 700 ;
+C 77 ; WX 1008 ; N C77 ; B 107 0 915 700 ;
+C 78 ; WX 846 ; N C78 ; B 107 0 753 700 ;
+C 79 ; WX 792 ; N C79 ; B 107 0 700 700 ;
+C 80 ; WX 792 ; N C80 ; B 107 0 700 700 ;
+C 81 ; WX 792 ; N C81 ; B 107 -161 700 700 ;
+C 82 ; WX 846 ; N C82 ; B 107 0 753 700 ;
+C 83 ; WX 792 ; N C83 ; B 161 0 646 700 ;
+C 84 ; WX 792 ; N C84 ; B 107 0 699 700 ;
+C 85 ; WX 900 ; N C85 ; B 107 0 807 700 ;
+C 86 ; WX 739 ; N C86 ; B 0 0 753 700 ;
+C 87 ; WX 954 ; N C87 ; B 53 0 915 700 ;
+C 88 ; WX 792 ; N C88 ; B 53 0 753 700 ;
+C 89 ; WX 685 ; N C89 ; B 0 0 700 700 ;
+C 90 ; WX 685 ; N C90 ; B 107 0 592 700 ;
+C 91 ; WX 451 ; N C91 ; B 133 -233 366 833 ;
+C 92 ; WX 300 ; N C92 ; B 0 0 0 0 ;
+C 93 ; WX 451 ; N C93 ; B 99 -233 333 833 ;
+C 94 ; WX 300 ; N C94 ; B 0 0 0 0 ;
+C 95 ; WX 300 ; N C95 ; B 0 0 0 0 ;
+C 96 ; WX 318 ; N C96 ; B 133 500 199 700 ;
+C 97 ; WX 739 ; N C97 ; B 161 0 646 484 ;
+C 98 ; WX 792 ; N C98 ; B 107 0 700 700 ;
+C 99 ; WX 631 ; N C99 ; B 107 0 538 484 ;
+C 100 ; WX 792 ; N C100 ; B 107 0 700 700 ;
+C 101 ; WX 631 ; N C101 ; B 107 0 538 484 ;
+C 102 ; WX 577 ; N C102 ; B 107 0 538 700 ;
+C 103 ; WX 685 ; N C103 ; B 107 -215 538 484 ;
+C 104 ; WX 900 ; N C104 ; B 107 0 807 700 ;
+C 105 ; WX 469 ; N C105 ; B 107 0 376 700 ;
+C 106 ; WX 469 ; N C106 ; B 53 -215 322 700 ;
+C 107 ; WX 846 ; N C107 ; B 107 0 807 700 ;
+C 108 ; WX 469 ; N C108 ; B 107 0 376 700 ;
+C 109 ; WX 1331 ; N C109 ; B 107 0 1238 484 ;
+C 110 ; WX 900 ; N C110 ; B 107 0 807 484 ;
+C 111 ; WX 685 ; N C111 ; B 107 0 592 484 ;
+C 112 ; WX 792 ; N C112 ; B 107 -215 700 484 ;
+C 113 ; WX 739 ; N C113 ; B 107 -215 700 484 ;
+C 114 ; WX 685 ; N C114 ; B 107 0 592 484 ;
+C 115 ; WX 685 ; N C115 ; B 161 0 538 484 ;
+C 116 ; WX 577 ; N C116 ; B 107 0 484 700 ;
+C 117 ; WX 900 ; N C117 ; B 107 0 807 484 ;
+C 118 ; WX 739 ; N C118 ; B 53 0 700 484 ;
+C 119 ; WX 954 ; N C119 ; B 53 0 915 484 ;
+C 120 ; WX 739 ; N C120 ; B 53 0 700 484 ;
+C 121 ; WX 739 ; N C121 ; B 53 -215 700 484 ;
+C 122 ; WX 631 ; N C122 ; B 107 0 538 484 ;
+C 123 ; WX 485 ; N C123 ; B 166 -233 333 833 ;
+C 124 ; WX 523 ; N C124 ; B 161 -215 430 861 ;
+C 125 ; WX 485 ; N C125 ; B 166 -233 333 833 ;
+C 126 ; WX 523 ; N C126 ; B 161 484 376 700 ;
+EndCharMetrics
+
+EndFontMetrics
diff --git a/src/fonts/plcr.gle b/src/fonts/plcr.gle
new file mode 100644
index 0000000..f99578a
--- /dev/null
+++ b/src/fonts/plcr.gle
@@ -0,0 +1,1882 @@
+dfont design= 1428
+dfont char=33
+amove 307 1000
+aline 230 923
+aline 307 384
+aline 384 923
+aline 307 1000
+amove 307 923
+aline 307 692
+amove 307 153
+aline 230 76
+aline 307 0
+aline 384 76
+aline 307 153
+stroke
+dfont endchar
+dfont char=34
+amove 230 615
+aline 230 1000
+amove 307 1000
+aline 230 615
+amove 692 615
+aline 692 1000
+amove 769 1000
+aline 692 615
+stroke
+dfont endchar
+dfont char=35
+amove 230 0
+aline 999 0
+amove 615 0
+aline 615 846
+amove 230 461
+aline 999 461
+stroke
+dfont endchar
+dfont char=36
+amove 153 692
+aline 615 1000
+amove 384 1076
+aline 384 615
+amove 615 692
+aline 153 1000
+stroke
+dfont endchar
+dfont char=37
+amove 142 0
+aline 1000 1000
+aline 904 952
+aline 761 904
+aline 619 904
+aline 476 952
+aline 380 1000
+aline 285 1000
+aline 190 952
+aline 142 857
+aline 142 761
+aline 238 666
+aline 333 666
+aline 428 714
+aline 476 809
+aline 476 904
+aline 380 1000
+amove 809 333
+aline 714 285
+aline 666 190
+aline 666 95
+aline 761 0
+aline 857 0
+aline 952 47
+aline 1000 142
+aline 1000 238
+aline 904 333
+aline 809 333
+stroke
+dfont endchar
+dfont char=38
+amove 230 461
+aline 999 461
+amove 999 846
+aline 230 846
+amove 615 846
+aline 615 -1
+stroke
+dfont endchar
+dfont char=39
+amove 230 615
+aline 230 1000
+amove 307 1000
+aline 230 615
+stroke
+dfont endchar
+dfont char=40
+amove 461 -154
+aline 384 0
+aline 307 307
+aline 307 615
+aline 384 923
+aline 461 1076
+amove 615 1230
+aline 461 1076
+aline 307 846
+aline 230 615
+aline 230 307
+aline 307 76
+aline 461 -154
+aline 615 -308
+stroke
+dfont endchar
+dfont char=41
+amove 153 -308
+aline 307 -154
+aline 461 76
+aline 538 307
+aline 538 615
+aline 461 846
+aline 307 1076
+aline 153 1230
+amove 307 1076
+aline 384 923
+aline 461 615
+aline 461 307
+aline 384 0
+aline 307 -154
+stroke
+dfont endchar
+dfont char=42
+amove 230 -308
+aline 538 461
+aline 230 1230
+stroke
+dfont endchar
+dfont char=43
+amove 384 -77
+aline 461 230
+amove 384 76
+aline 461 -231
+amove 538 -308
+aline 461 -231
+aline 384 -77
+aline 384 76
+aline 461 230
+aline 461 307
+aline 307 461
+aline 461 615
+aline 461 692
+aline 384 846
+aline 384 999
+aline 461 1153
+aline 538 1230
+amove 461 1153
+aline 384 846
+amove 384 999
+aline 461 692
+stroke
+dfont endchar
+dfont char=44
+amove 230 -231
+aline 384 -77
+aline 384 76
+aline 307 153
+aline 230 76
+aline 307 -1
+aline 384 76
+stroke
+dfont endchar
+dfont char=45
+amove 153 -308
+aline 538 -308
+aline 538 1230
+aline 153 1230
+amove 461 1230
+aline 461 -308
+stroke
+dfont endchar
+dfont char=46
+amove 307 153
+aline 230 76
+aline 307 -1
+aline 384 76
+aline 307 153
+stroke
+dfont endchar
+dfont char=47
+amove 153 -308
+aline 1000 1230
+stroke
+dfont endchar
+dfont char=48
+amove 384 0
+aline 307 76
+aline 230 307
+aline 230 692
+aline 307 923
+aline 384 1000
+aline 615 1000
+aline 769 923
+aline 846 692
+aline 846 307
+aline 769 76
+aline 615 0
+aline 384 0
+aline 230 76
+aline 153 307
+aline 153 692
+aline 230 923
+aline 384 1000
+amove 615 1000
+aline 692 923
+aline 769 692
+aline 769 307
+aline 692 76
+aline 615 0
+stroke
+dfont endchar
+dfont char=49
+amove 230 0
+aline 769 0
+amove 538 0
+aline 538 1000
+aline 307 769
+amove 461 923
+aline 461 0
+stroke
+dfont endchar
+dfont char=50
+amove 153 0
+aline 153 230
+aline 230 384
+aline 384 461
+aline 615 538
+aline 769 615
+aline 846 769
+aline 769 923
+aline 615 1000
+aline 384 1000
+aline 230 923
+aline 153 846
+aline 153 769
+aline 230 769
+aline 230 846
+amove 615 1000
+aline 692 923
+aline 769 769
+aline 692 615
+aline 615 538
+amove 846 230
+aline 846 153
+aline 769 0
+aline 538 0
+aline 307 153
+amove 153 76
+aline 230 153
+aline 307 153
+aline 538 76
+aline 769 76
+aline 846 153
+stroke
+dfont endchar
+dfont char=51
+amove 230 153
+aline 230 230
+aline 153 230
+aline 153 153
+aline 230 76
+aline 384 -1
+aline 615 -1
+aline 769 76
+aline 846 230
+aline 846 307
+aline 769 461
+aline 615 538
+aline 461 538
+amove 615 538
+aline 769 615
+aline 846 769
+aline 769 923
+aline 615 1000
+aline 384 1000
+aline 230 923
+aline 153 846
+aline 153 769
+aline 230 769
+aline 230 846
+amove 615 1000
+aline 692 923
+aline 769 769
+aline 692 615
+aline 615 538
+aline 692 461
+aline 769 307
+aline 769 230
+aline 692 76
+aline 615 0
+stroke
+dfont endchar
+dfont char=52
+amove 384 0
+aline 769 0
+amove 615 0
+aline 615 1000
+aline 76 307
+aline 923 307
+amove 538 0
+aline 538 846
+stroke
+dfont endchar
+dfont char=53
+amove 230 153
+aline 230 230
+aline 153 230
+aline 153 153
+aline 230 76
+aline 384 -1
+aline 615 -1
+aline 769 76
+aline 846 230
+aline 846 461
+aline 769 615
+aline 615 692
+aline 384 692
+aline 230 615
+aline 153 538
+aline 230 1000
+aline 769 1000
+aline 538 923
+aline 230 923
+amove 615 692
+aline 692 615
+aline 769 461
+aline 769 230
+aline 692 76
+aline 615 0
+stroke
+dfont endchar
+dfont char=54
+amove 384 0
+aline 307 76
+aline 230 230
+aline 230 615
+aline 307 846
+aline 461 1000
+amove 769 846
+aline 769 769
+aline 846 769
+aline 846 846
+aline 769 923
+aline 615 1000
+aline 461 1000
+aline 307 923
+aline 230 846
+aline 153 615
+aline 153 230
+aline 230 76
+aline 384 0
+aline 615 0
+aline 769 76
+aline 846 230
+aline 846 384
+aline 769 538
+aline 615 615
+aline 384 615
+aline 153 461
+amove 615 615
+aline 692 538
+aline 769 384
+aline 769 230
+aline 692 76
+aline 615 0
+stroke
+dfont endchar
+dfont char=55
+amove 307 0
+aline 461 307
+aline 769 846
+aline 692 846
+aline 461 923
+aline 307 923
+aline 153 846
+aline 307 999
+aline 461 999
+aline 692 846
+amove 846 1000
+aline 615 538
+aline 384 0
+amove 153 692
+aline 153 1000
+stroke
+dfont endchar
+dfont char=56
+amove 384 0
+aline 307 76
+aline 230 230
+aline 230 307
+aline 307 461
+aline 384 538
+aline 307 615
+aline 230 769
+aline 307 923
+aline 384 1000
+aline 615 1000
+aline 769 923
+aline 846 769
+aline 769 615
+aline 615 538
+aline 384 538
+aline 230 615
+aline 153 769
+aline 230 923
+aline 384 1000
+amove 615 1000
+aline 692 923
+aline 769 769
+aline 692 615
+aline 615 538
+aline 769 461
+aline 846 307
+aline 846 230
+aline 769 76
+aline 615 0
+aline 384 0
+aline 230 76
+aline 153 230
+aline 153 307
+aline 230 461
+aline 384 538
+amove 615 538
+aline 692 461
+aline 769 307
+aline 769 230
+aline 692 76
+aline 615 0
+stroke
+dfont endchar
+dfont char=57
+amove 230 153
+aline 230 230
+aline 153 230
+aline 153 153
+aline 230 76
+aline 384 -1
+aline 538 -1
+aline 692 76
+aline 769 153
+aline 846 384
+aline 846 769
+aline 769 923
+aline 615 1000
+aline 384 1000
+aline 230 923
+aline 153 769
+aline 153 615
+aline 230 461
+aline 384 384
+aline 615 384
+aline 846 538
+amove 384 384
+aline 307 461
+aline 230 615
+aline 230 769
+aline 307 923
+aline 384 1000
+amove 615 1000
+aline 692 923
+aline 769 769
+aline 769 384
+aline 692 153
+aline 538 0
+stroke
+dfont endchar
+dfont char=58
+amove 307 692
+aline 230 615
+aline 307 538
+aline 384 615
+aline 307 692
+amove 307 153
+aline 230 76
+aline 307 0
+aline 384 76
+aline 307 153
+stroke
+dfont endchar
+dfont char=59
+amove 230 -231
+aline 384 -77
+aline 384 76
+aline 307 153
+aline 230 76
+aline 307 -1
+aline 384 76
+amove 307 692
+aline 230 615
+aline 307 538
+aline 384 615
+aline 307 692
+stroke
+dfont endchar
+dfont char=60
+amove 952 857
+aline 190 428
+aline 952 0
+stroke
+dfont endchar
+dfont char=61
+amove 307 -308
+aline 384 -231
+aline 461 -77
+aline 461 76
+aline 384 230
+aline 384 307
+aline 538 461
+aline 384 615
+aline 384 692
+aline 461 846
+aline 461 999
+aline 384 1153
+aline 307 1230
+amove 384 1153
+aline 461 846
+amove 461 1000
+aline 384 692
+amove 384 230
+aline 461 -77
+amove 461 76
+aline 384 -231
+stroke
+dfont endchar
+dfont char=62
+amove 190 0
+aline 952 428
+aline 190 857
+stroke
+dfont endchar
+dfont char=63
+amove 461 76
+aline 461 -1
+aline 538 -1
+aline 538 76
+aline 461 76
+amove 538 307
+aline 461 307
+aline 461 384
+aline 538 461
+aline 769 538
+aline 846 692
+aline 846 769
+aline 769 923
+aline 615 1000
+aline 384 1000
+aline 230 923
+aline 153 769
+aline 153 692
+aline 230 692
+aline 230 769
+aline 153 769
+amove 538 461
+aline 692 538
+aline 769 615
+aline 769 846
+aline 615 1000
+stroke
+dfont endchar
+dfont char=64
+amove 523 238
+aline 476 285
+aline 428 380
+aline 428 523
+aline 476 666
+aline 571 761
+amove 857 761
+aline 809 380
+aline 809 285
+aline 904 238
+aline 999 238
+aline 1095 333
+aline 1142 476
+aline 1142 571
+aline 1095 714
+aline 1047 809
+aline 952 904
+aline 857 952
+aline 714 1000
+aline 571 1000
+aline 428 952
+aline 333 904
+aline 238 809
+aline 190 714
+aline 142 571
+aline 142 428
+aline 190 285
+aline 238 190
+aline 333 95
+aline 428 47
+aline 571 0
+aline 714 0
+aline 857 47
+aline 952 95
+aline 1000 142
+amove 904 238
+aline 857 285
+aline 857 380
+aline 904 761
+amove 857 619
+aline 809 714
+aline 714 761
+aline 571 761
+aline 476 714
+aline 428 666
+aline 380 523
+aline 380 380
+aline 428 285
+aline 523 238
+aline 666 238
+aline 761 285
+aline 809 380
+stroke
+dfont endchar
+dfont char=65
+amove 0 0
+aline 384 0
+amove 153 0
+aline 538 1000
+aline 923 0
+amove 846 0
+aline 538 769
+amove 692 307
+aline 307 307
+amove 692 0
+aline 1076 0
+stroke
+dfont endchar
+dfont char=66
+amove 153 0
+aline 692 0
+aline 923 76
+aline 1000 230
+aline 1000 307
+aline 923 461
+aline 692 538
+aline 384 538
+amove 692 538
+aline 923 615
+aline 1000 769
+aline 923 923
+aline 692 1000
+aline 153 1000
+amove 307 1000
+aline 307 0
+amove 384 0
+aline 384 1000
+amove 692 1000
+aline 846 923
+aline 923 769
+aline 846 615
+aline 692 538
+aline 846 461
+aline 923 307
+aline 923 230
+aline 846 76
+aline 692 0
+stroke
+dfont endchar
+dfont char=67
+amove 461 0
+aline 307 153
+aline 230 384
+aline 230 615
+aline 307 846
+aline 461 1000
+amove 846 923
+aline 923 1000
+aline 923 692
+aline 846 923
+aline 692 1000
+aline 461 1000
+aline 307 923
+aline 230 846
+aline 153 615
+aline 153 384
+aline 230 153
+aline 307 76
+aline 461 -1
+aline 692 -1
+aline 846 76
+aline 923 230
+stroke
+dfont endchar
+dfont char=68
+amove 153 0
+aline 692 0
+aline 923 76
+aline 1000 153
+aline 1076 384
+aline 1076 615
+aline 1000 846
+aline 923 923
+aline 692 1000
+aline 153 1000
+amove 307 1000
+aline 307 0
+amove 384 0
+aline 384 1000
+amove 692 1000
+aline 846 923
+aline 923 846
+aline 1000 615
+aline 1000 384
+aline 923 153
+aline 846 76
+aline 692 0
+stroke
+dfont endchar
+dfont char=69
+amove 153 0
+aline 923 0
+aline 923 307
+aline 846 0
+amove 692 384
+aline 692 692
+amove 692 538
+aline 384 538
+amove 384 1000
+aline 384 0
+amove 307 0
+aline 307 1000
+amove 153 1000
+aline 923 1000
+aline 923 692
+aline 846 1000
+stroke
+dfont endchar
+dfont char=70
+amove 153 0
+aline 538 0
+amove 384 0
+aline 384 1000
+amove 307 1000
+aline 307 0
+amove 692 384
+aline 692 692
+amove 692 538
+aline 384 538
+amove 153 1000
+aline 923 1000
+aline 923 692
+aline 846 1000
+stroke
+dfont endchar
+dfont char=71
+amove 461 0
+aline 307 153
+aline 230 384
+aline 230 615
+aline 307 846
+aline 461 1000
+amove 846 923
+aline 923 1000
+aline 923 692
+aline 846 923
+aline 692 1000
+aline 461 1000
+aline 307 923
+aline 230 846
+aline 153 615
+aline 153 384
+aline 230 153
+aline 307 76
+aline 461 -1
+aline 692 -1
+aline 846 76
+amove 846 -1
+aline 846 384
+amove 923 384
+aline 923 -1
+amove 692 -1
+aline 769 76
+aline 846 230
+amove 692 384
+aline 1076 384
+stroke
+dfont endchar
+dfont char=72
+amove 153 0
+aline 538 0
+amove 384 0
+aline 384 1000
+amove 307 1000
+aline 307 0
+amove 769 0
+aline 1153 0
+amove 1000 0
+aline 1000 1000
+amove 923 1000
+aline 923 0
+amove 923 538
+aline 384 538
+amove 538 1000
+aline 153 1000
+amove 769 1000
+aline 1153 1000
+stroke
+dfont endchar
+dfont char=73
+amove 153 0
+aline 538 0
+amove 384 0
+aline 384 1000
+amove 307 1000
+aline 307 0
+amove 153 1000
+aline 538 1000
+stroke
+dfont endchar
+dfont char=74
+amove 153 153
+aline 230 230
+aline 153 307
+aline 76 230
+aline 153 76
+aline 307 -1
+aline 384 -1
+aline 538 76
+aline 615 230
+aline 615 1000
+amove 538 1000
+aline 538 230
+aline 461 76
+aline 384 0
+amove 384 1000
+aline 769 1000
+stroke
+dfont endchar
+dfont char=75
+amove 153 0
+aline 538 0
+amove 384 0
+aline 384 1000
+amove 307 1000
+aline 307 0
+amove 384 384
+aline 1000 1000
+amove 1153 1000
+aline 769 1000
+amove 538 1000
+aline 153 1000
+amove 538 538
+aline 923 0
+amove 1000 0
+aline 615 538
+amove 769 0
+aline 1153 0
+stroke
+dfont endchar
+dfont char=76
+amove 153 0
+aline 923 0
+aline 923 307
+aline 846 0
+amove 384 0
+aline 384 1000
+amove 307 1000
+aline 307 0
+amove 153 1000
+aline 538 1000
+stroke
+dfont endchar
+dfont char=77
+amove 153 0
+aline 461 0
+amove 307 0
+aline 307 1000
+amove 384 1000
+aline 692 230
+amove 692 0
+aline 384 769
+amove 384 1000
+aline 153 1000
+amove 1076 1000
+aline 692 0
+amove 923 0
+aline 1307 0
+amove 1153 0
+aline 1153 1000
+amove 1076 1000
+aline 1076 0
+amove 1076 1000
+aline 1307 1000
+stroke
+dfont endchar
+dfont char=78
+amove 153 0
+aline 461 0
+amove 307 0
+aline 307 1000
+amove 384 1000
+aline 923 153
+amove 923 -1
+aline 384 846
+amove 384 1000
+aline 153 1000
+amove 769 1000
+aline 1076 1000
+amove 923 1000
+aline 923 0
+stroke
+dfont endchar
+dfont char=79
+amove 461 0
+aline 307 153
+aline 230 384
+aline 230 615
+aline 307 846
+aline 461 1000
+aline 692 1000
+aline 846 923
+aline 923 846
+aline 1000 615
+aline 1000 384
+aline 923 153
+aline 846 76
+aline 692 -1
+aline 461 -1
+aline 307 76
+aline 230 153
+aline 153 384
+aline 153 615
+aline 230 846
+aline 307 923
+aline 461 1000
+amove 692 1000
+aline 846 846
+aline 923 615
+aline 923 384
+aline 846 153
+aline 692 0
+stroke
+dfont endchar
+dfont char=80
+amove 153 0
+aline 538 0
+amove 384 0
+aline 384 1000
+amove 307 1000
+aline 307 0
+amove 384 461
+aline 692 461
+aline 923 538
+aline 1000 692
+aline 1000 769
+aline 923 923
+aline 692 1000
+aline 153 1000
+amove 692 1000
+aline 846 923
+aline 923 769
+aline 923 692
+aline 846 538
+aline 692 461
+stroke
+dfont endchar
+dfont char=81
+amove 384 76
+aline 384 230
+aline 461 307
+aline 615 307
+aline 692 230
+aline 769 -154
+aline 846 -231
+aline 923 -231
+aline 1000 -154
+amove 923 -231
+aline 846 -154
+aline 769 0
+aline 692 230
+amove 692 0
+aline 846 153
+aline 923 384
+aline 923 615
+aline 846 846
+aline 692 1000
+amove 461 1000
+aline 692 1000
+aline 846 923
+aline 923 846
+aline 1000 615
+aline 1000 384
+aline 923 153
+aline 846 76
+aline 692 0
+aline 461 0
+aline 307 76
+aline 230 153
+aline 153 384
+aline 153 615
+aline 230 846
+aline 307 923
+aline 461 1000
+aline 307 846
+aline 230 615
+aline 230 384
+aline 307 153
+aline 461 0
+stroke
+dfont endchar
+dfont char=82
+amove 153 0
+aline 538 0
+amove 384 0
+aline 384 1000
+amove 307 1000
+aline 307 0
+amove 384 461
+aline 692 461
+aline 923 538
+aline 1000 692
+aline 1000 769
+aline 923 923
+aline 692 1000
+aline 153 1000
+amove 692 1000
+aline 846 923
+aline 923 769
+aline 923 692
+aline 846 538
+aline 692 461
+aline 769 384
+aline 846 76
+aline 923 0
+aline 1000 0
+aline 1076 76
+amove 1000 0
+aline 923 76
+aline 846 384
+aline 692 461
+stroke
+dfont endchar
+dfont char=83
+amove 307 153
+aline 230 -1
+aline 230 307
+aline 307 153
+aline 384 76
+aline 538 0
+aline 692 0
+aline 846 76
+aline 923 153
+aline 923 384
+aline 846 461
+aline 692 538
+aline 461 615
+aline 307 692
+aline 230 769
+amove 846 846
+aline 923 1000
+aline 923 692
+aline 846 846
+aline 769 923
+aline 615 1000
+aline 461 1000
+aline 307 923
+aline 230 846
+aline 230 692
+aline 307 615
+aline 461 538
+aline 692 461
+aline 846 384
+aline 923 307
+stroke
+dfont endchar
+dfont char=84
+amove 384 0
+aline 769 0
+amove 615 0
+aline 615 1000
+amove 538 1000
+aline 538 0
+amove 230 1000
+aline 153 692
+aline 153 1000
+aline 999 1000
+aline 999 692
+aline 923 1000
+stroke
+dfont endchar
+dfont char=85
+amove 538 0
+aline 461 76
+aline 384 230
+aline 384 1000
+amove 307 1000
+aline 307 230
+aline 384 76
+aline 538 0
+aline 769 0
+aline 923 76
+aline 1000 230
+aline 1000 1000
+amove 846 1000
+aline 1153 1000
+amove 538 1000
+aline 153 1000
+stroke
+dfont endchar
+dfont char=86
+amove 538 0
+aline 153 1000
+amove 230 1000
+aline 538 230
+amove 538 0
+aline 923 1000
+amove 1076 1000
+aline 692 1000
+amove 384 1000
+aline 0 1000
+stroke
+dfont endchar
+dfont char=87
+amove 461 0
+aline 230 1000
+amove 307 1000
+aline 461 307
+amove 461 0
+aline 692 1000
+aline 923 0
+aline 1153 1000
+amove 1000 1000
+aline 1307 1000
+amove 769 1000
+aline 923 307
+amove 461 1000
+aline 76 1000
+stroke
+dfont endchar
+dfont char=88
+amove 76 0
+aline 461 0
+amove 230 0
+aline 923 1000
+amove 1076 1000
+aline 692 1000
+amove 461 1000
+aline 76 1000
+amove 230 1000
+aline 846 0
+amove 923 0
+aline 307 1000
+amove 692 0
+aline 1076 0
+stroke
+dfont endchar
+dfont char=89
+amove 307 0
+aline 692 0
+amove 538 0
+aline 538 461
+aline 846 1000
+amove 1000 1000
+aline 615 1000
+amove 384 1000
+aline 0 1000
+amove 153 1000
+aline 461 461
+aline 461 0
+amove 538 461
+aline 230 1000
+stroke
+dfont endchar
+dfont char=90
+amove 153 0
+aline 769 1000
+amove 846 1000
+aline 230 0
+amove 153 0
+aline 846 0
+aline 846 307
+aline 769 0
+amove 846 1000
+aline 153 1000
+aline 153 692
+aline 230 1000
+stroke
+dfont endchar
+dfont char=91
+amove 190 -334
+aline 190 1190
+aline 523 1190
+amove 238 1190
+aline 238 -334
+amove 190 -334
+aline 523 -334
+stroke
+dfont endchar
+stroke
+dfont endchar
+dfont char=93
+amove 142 -334
+aline 476 -334
+aline 476 1190
+aline 142 1190
+amove 428 1190
+aline 428 -334
+stroke
+dfont endchar
+stroke
+dfont endchar
+stroke
+dfont endchar
+dfont char=96
+amove 238 904
+aline 285 952
+aline 238 1000
+aline 190 952
+aline 190 857
+aline 238 761
+aline 285 714
+stroke
+dfont endchar
+dfont char=97
+amove 384 0
+aline 307 76
+aline 307 230
+aline 461 384
+amove 692 461
+aline 461 384
+aline 307 307
+aline 230 230
+aline 230 76
+aline 307 -1
+aline 538 -1
+aline 615 76
+aline 692 230
+amove 846 -1
+aline 692 76
+aline 692 538
+aline 615 692
+amove 384 692
+aline 307 615
+aline 307 538
+aline 230 538
+aline 230 615
+aline 384 692
+aline 615 692
+aline 769 538
+aline 769 76
+aline 846 -1
+aline 923 -1
+stroke
+dfont endchar
+dfont char=98
+amove 307 0
+aline 307 1000
+amove 384 1000
+aline 384 0
+amove 384 230
+aline 461 76
+aline 615 0
+aline 769 0
+aline 923 76
+aline 1000 230
+aline 1000 461
+aline 923 615
+aline 769 692
+aline 615 692
+aline 461 615
+aline 384 461
+amove 769 692
+aline 846 615
+aline 923 461
+aline 923 230
+aline 846 76
+aline 769 0
+amove 384 1000
+aline 153 1000
+stroke
+dfont endchar
+dfont char=99
+amove 384 0
+aline 307 76
+aline 230 230
+aline 230 461
+aline 307 615
+aline 384 692
+amove 769 538
+aline 692 538
+aline 692 461
+aline 769 461
+aline 769 538
+aline 692 615
+aline 538 692
+aline 384 692
+aline 230 615
+aline 153 461
+aline 153 230
+aline 230 76
+aline 384 0
+aline 538 0
+aline 692 76
+aline 769 153
+stroke
+dfont endchar
+dfont char=100
+amove 384 0
+aline 307 76
+aline 230 230
+aline 230 461
+aline 307 615
+aline 384 692
+amove 615 1000
+aline 846 1000
+aline 846 0
+amove 769 0
+aline 769 1000
+amove 769 461
+aline 692 615
+aline 538 692
+aline 384 692
+aline 230 615
+aline 153 461
+aline 153 230
+aline 230 76
+aline 384 0
+aline 538 0
+aline 692 76
+aline 769 230
+amove 769 0
+aline 1000 0
+stroke
+dfont endchar
+dfont char=101
+amove 230 384
+aline 769 384
+aline 769 461
+aline 692 615
+aline 538 692
+aline 384 692
+aline 230 615
+aline 153 461
+aline 153 230
+aline 230 76
+aline 384 0
+aline 538 0
+aline 692 76
+aline 769 153
+amove 692 384
+aline 692 538
+aline 538 692
+amove 384 692
+aline 307 615
+aline 230 461
+aline 230 230
+aline 307 76
+aline 384 0
+stroke
+dfont endchar
+dfont char=102
+amove 153 0
+aline 538 0
+amove 384 0
+aline 384 846
+aline 461 1000
+amove 615 1000
+aline 692 923
+aline 692 846
+aline 769 846
+aline 769 923
+aline 615 1000
+aline 461 1000
+aline 307 846
+aline 307 0
+amove 153 692
+aline 538 692
+stroke
+dfont endchar
+dfont char=103
+amove 230 76
+aline 307 -1
+aline 615 -1
+aline 769 -77
+aline 769 -231
+aline 615 -308
+aline 307 -308
+aline 153 -231
+aline 153 -77
+aline 307 -1
+amove 384 230
+aline 307 384
+aline 307 538
+aline 384 692
+aline 538 692
+aline 692 538
+aline 692 384
+aline 538 230
+aline 384 230
+aline 230 384
+aline 230 538
+aline 384 692
+amove 538 692
+aline 615 538
+aline 615 384
+aline 538 230
+amove 307 307
+aline 230 230
+aline 230 0
+aline 307 -77
+aline 615 -77
+aline 769 -154
+amove 615 615
+aline 692 692
+aline 769 692
+stroke
+dfont endchar
+dfont char=104
+amove 153 0
+aline 538 0
+amove 384 0
+aline 384 1000
+aline 153 1000
+amove 307 1000
+aline 307 0
+amove 769 0
+aline 1153 0
+amove 1000 0
+aline 1000 461
+aline 923 615
+aline 769 692
+aline 615 692
+aline 461 615
+aline 384 461
+amove 769 692
+aline 846 615
+aline 923 461
+aline 923 0
+stroke
+dfont endchar
+dfont char=105
+amove 153 0
+aline 538 0
+amove 384 0
+aline 384 692
+aline 153 692
+amove 307 692
+aline 307 0
+amove 307 1000
+aline 307 923
+aline 384 923
+aline 384 1000
+aline 307 1000
+stroke
+dfont endchar
+dfont char=106
+amove 76 -231
+aline 153 -231
+aline 153 -154
+aline 76 -154
+aline 76 -231
+aline 153 -308
+aline 307 -308
+aline 461 -154
+aline 461 692
+aline 230 692
+amove 384 692
+aline 384 -154
+aline 307 -308
+amove 384 999
+aline 384 923
+aline 461 923
+aline 461 1000
+aline 384 1000
+stroke
+dfont endchar
+dfont char=107
+amove 153 0
+aline 538 0
+amove 384 0
+aline 384 1000
+aline 153 1000
+amove 307 1000
+aline 307 0
+amove 384 230
+aline 1000 692
+amove 1153 692
+aline 769 692
+amove 692 384
+aline 1000 0
+amove 923 0
+aline 615 384
+amove 769 0
+aline 1153 0
+stroke
+dfont endchar
+dfont char=108
+amove 153 0
+aline 538 0
+amove 384 0
+aline 384 1000
+aline 153 1000
+amove 307 1000
+aline 307 0
+stroke
+dfont endchar
+dfont char=109
+amove 153 0
+aline 538 0
+amove 384 0
+aline 384 692
+aline 153 692
+amove 307 692
+aline 307 0
+amove 769 0
+aline 1153 0
+amove 1000 0
+aline 1000 461
+aline 923 615
+aline 769 692
+aline 615 692
+aline 461 615
+aline 384 461
+amove 769 692
+aline 846 615
+aline 923 461
+aline 923 0
+amove 1384 0
+aline 1769 0
+amove 1615 0
+aline 1615 461
+aline 1538 615
+aline 1384 692
+aline 1230 692
+aline 1076 615
+aline 1000 461
+amove 1384 692
+aline 1461 615
+aline 1538 461
+aline 1538 0
+stroke
+dfont endchar
+dfont char=110
+amove 153 0
+aline 538 0
+amove 384 0
+aline 384 692
+aline 153 692
+amove 307 692
+aline 307 0
+amove 769 0
+aline 1153 0
+amove 1000 0
+aline 1000 461
+aline 923 615
+aline 769 692
+aline 615 692
+aline 461 615
+aline 384 461
+amove 769 692
+aline 846 615
+aline 923 461
+aline 923 0
+stroke
+dfont endchar
+dfont char=111
+amove 384 0
+aline 307 76
+aline 230 230
+aline 230 461
+aline 307 615
+aline 384 692
+aline 615 692
+aline 769 615
+aline 846 461
+aline 846 230
+aline 769 76
+aline 615 0
+aline 384 0
+aline 230 76
+aline 153 230
+aline 153 461
+aline 230 615
+aline 384 692
+amove 615 692
+aline 692 615
+aline 769 461
+aline 769 230
+aline 692 76
+aline 615 0
+stroke
+dfont endchar
+dfont char=112
+amove 153 -308
+aline 538 -308
+amove 384 -308
+aline 384 692
+aline 153 692
+amove 307 692
+aline 307 -308
+amove 384 230
+aline 461 76
+aline 615 -1
+aline 769 -1
+aline 923 76
+aline 1000 230
+aline 1000 461
+aline 923 615
+aline 769 692
+aline 615 692
+aline 461 615
+aline 384 461
+amove 769 692
+aline 846 615
+aline 923 461
+aline 923 230
+aline 846 76
+aline 769 0
+stroke
+dfont endchar
+dfont char=113
+amove 384 0
+aline 307 76
+aline 230 230
+aline 230 461
+aline 307 615
+aline 384 692
+amove 769 692
+aline 769 -308
+amove 846 -308
+aline 846 692
+amove 769 461
+aline 692 615
+aline 538 692
+aline 384 692
+aline 230 615
+aline 153 461
+aline 153 230
+aline 230 76
+aline 384 -1
+aline 538 -1
+aline 692 76
+aline 769 230
+amove 615 -308
+aline 1000 -308
+stroke
+dfont endchar
+dfont char=114
+amove 153 0
+aline 538 0
+amove 384 0
+aline 384 692
+aline 153 692
+amove 307 692
+aline 307 0
+amove 384 461
+aline 461 615
+aline 615 692
+aline 769 692
+aline 846 615
+aline 846 538
+aline 769 538
+aline 769 615
+aline 846 615
+stroke
+dfont endchar
+dfont char=115
+amove 384 0
+aline 307 76
+aline 307 153
+aline 230 153
+aline 230 76
+aline 384 0
+aline 615 0
+aline 769 76
+aline 769 307
+aline 615 384
+aline 384 461
+aline 230 538
+amove 615 692
+aline 692 615
+aline 692 538
+aline 769 538
+aline 769 615
+aline 615 692
+aline 384 692
+aline 230 615
+aline 230 461
+aline 384 384
+aline 615 307
+aline 769 230
+stroke
+dfont endchar
+dfont char=116
+amove 461 0
+aline 384 153
+aline 384 1000
+amove 307 1000
+aline 307 153
+aline 461 -1
+aline 615 -1
+aline 692 76
+aline 692 153
+amove 615 692
+aline 153 692
+stroke
+dfont endchar
+dfont char=117
+amove 538 0
+aline 461 76
+aline 384 230
+aline 384 692
+aline 153 692
+amove 307 692
+aline 307 230
+aline 384 76
+aline 538 -1
+aline 692 -1
+aline 846 76
+aline 923 230
+amove 923 -1
+aline 923 692
+amove 999 692
+aline 999 0
+amove 923 0
+aline 1153 0
+amove 1000 692
+aline 769 692
+stroke
+dfont endchar
+dfont char=118
+amove 538 0
+aline 230 692
+amove 307 692
+aline 538 153
+amove 538 0
+aline 846 692
+amove 692 692
+aline 1000 692
+amove 461 692
+aline 76 692
+stroke
+dfont endchar
+dfont char=119
+amove 461 0
+aline 230 692
+amove 307 692
+aline 461 230
+amove 461 -1
+aline 692 692
+aline 923 -1
+aline 1153 692
+amove 1000 692
+aline 1307 692
+amove 769 692
+aline 923 230
+amove 461 692
+aline 76 692
+stroke
+dfont endchar
+dfont char=120
+amove 76 0
+aline 384 0
+amove 230 0
+aline 846 692
+amove 692 692
+aline 1000 692
+amove 461 692
+aline 76 692
+amove 230 692
+aline 769 0
+amove 846 0
+aline 307 692
+amove 615 0
+aline 1000 0
+stroke
+dfont endchar
+dfont char=121
+amove 76 -231
+aline 153 -231
+aline 153 -154
+aline 76 -154
+aline 76 -231
+aline 153 -308
+aline 230 -308
+aline 384 -231
+aline 538 -1
+aline 846 692
+amove 692 692
+aline 1000 692
+amove 461 692
+aline 76 692
+amove 230 692
+aline 538 0
+amove 538 153
+aline 307 692
+stroke
+dfont endchar
+dfont char=122
+amove 153 0
+aline 692 692
+amove 769 692
+aline 230 0
+amove 153 0
+aline 769 0
+aline 769 153
+aline 692 0
+amove 769 692
+aline 153 692
+aline 153 538
+aline 230 692
+stroke
+dfont endchar
+dfont char=123
+amove 380 238
+aline 333 95
+aline 333 -96
+aline 380 -239
+amove 476 -334
+aline 333 -191
+aline 285 -48
+aline 285 47
+aline 333 190
+aline 428 285
+aline 428 333
+aline 238 428
+aline 428 523
+aline 428 571
+aline 333 666
+aline 285 809
+aline 285 904
+aline 333 1047
+aline 476 1190
+amove 380 1095
+aline 333 952
+aline 333 761
+aline 380 619
+stroke
+dfont endchar
+dfont char=124
+amove 230 -308
+aline 230 1230
+aline 615 1230
+amove 307 1230
+aline 307 -308
+amove 230 -308
+aline 615 -308
+stroke
+dfont endchar
+dfont char=125
+amove 238 -334
+aline 380 -191
+aline 428 -48
+aline 428 47
+aline 380 190
+aline 285 285
+aline 285 333
+aline 476 428
+aline 285 523
+aline 285 571
+aline 380 666
+aline 428 809
+aline 428 904
+aline 380 1047
+aline 238 1190
+amove 333 1095
+aline 380 952
+aline 380 761
+aline 333 619
+amove 333 238
+aline 380 95
+aline 380 -96
+aline 333 -239
+stroke
+dfont endchar
+dfont char=126
+amove 307 1000
+aline 230 923
+aline 230 769
+aline 307 692
+aline 461 692
+aline 538 769
+aline 538 923
+aline 461 1000
+aline 307 1000
+stroke
+dfont endchar
diff --git a/src/fonts/plcs.afm b/src/fonts/plcs.afm
new file mode 100644
index 0000000..4c49289
--- /dev/null
+++ b/src/fonts/plcs.afm
@@ -0,0 +1,115 @@
+StartFontMetrics 2.0
+Comment Made from HERSHEY font file using SPLITFONT.BAS
+FontName plCS
+EncodingScheme TEXENCODING
+FullName plCS
+FamilyName plCS
+Weight Medium
+ItalicAngle 0
+IsFixedPitch false
+UnderlinePosition -97
+UnderlineThickness 73
+FontBBox 0 -400 1001 1001
+CapHeight 729
+XHeight 151
+Descender -219
+Ascender 729
+StartCharMetrics 95
+C 32 ; WX 400 ; N C32 ; B 0 0 0 0 ;
+C 33 ; WX 318 ; N C33 ; B 133 0 199 700 ;
+C 34 ; WX 518 ; N C34 ; B 99 466 433 700 ;
+C 35 ; WX 784 ; N C35 ; B 133 0 666 566 ;
+C 36 ; WX 518 ; N C36 ; B 99 299 433 700 ;
+C 37 ; WX 784 ; N C37 ; B 99 0 700 700 ;
+C 38 ; WX 784 ; N C38 ; B 133 0 666 566 ;
+C 39 ; WX 251 ; N C39 ; B 99 466 166 700 ;
+C 40 ; WX 451 ; N C40 ; B 133 -233 366 833 ;
+C 41 ; WX 451 ; N C41 ; B 99 -233 333 833 ;
+C 42 ; WX 451 ; N C42 ; B 133 -233 366 833 ;
+C 43 ; WX 485 ; N C43 ; B 166 -233 333 833 ;
+C 44 ; WX 318 ; N C44 ; B 133 -133 199 66 ;
+C 45 ; WX 451 ; N C45 ; B 99 -233 333 833 ;
+C 46 ; WX 318 ; N C46 ; B 133 0 199 66 ;
+C 47 ; WX 718 ; N C47 ; B 66 -233 666 833 ;
+C 48 ; WX 651 ; N C48 ; B 99 0 566 700 ;
+C 49 ; WX 651 ; N C49 ; B 199 0 500 700 ;
+C 50 ; WX 651 ; N C50 ; B 99 0 566 700 ;
+C 51 ; WX 651 ; N C51 ; B 99 0 566 700 ;
+C 52 ; WX 651 ; N C52 ; B 66 0 600 700 ;
+C 53 ; WX 651 ; N C53 ; B 99 0 566 700 ;
+C 54 ; WX 651 ; N C54 ; B 99 0 566 700 ;
+C 55 ; WX 651 ; N C55 ; B 99 0 566 699 ;
+C 56 ; WX 651 ; N C56 ; B 99 0 566 700 ;
+C 57 ; WX 651 ; N C57 ; B 99 0 566 700 ;
+C 58 ; WX 318 ; N C58 ; B 133 0 199 466 ;
+C 59 ; WX 318 ; N C59 ; B 133 -133 199 466 ;
+C 60 ; WX 784 ; N C60 ; B 133 0 666 600 ;
+C 61 ; WX 485 ; N C61 ; B 166 -233 333 833 ;
+C 62 ; WX 784 ; N C62 ; B 133 0 666 600 ;
+C 63 ; WX 585 ; N C63 ; B 99 0 500 700 ;
+C 64 ; WX 884 ; N C64 ; B 99 0 799 700 ;
+C 65 ; WX 751 ; N C65 ; B -33 0 633 700 ;
+C 66 ; WX 784 ; N C66 ; B 32 0 700 700 ;
+C 67 ; WX 685 ; N C67 ; B 66 0 600 700 ;
+C 68 ; WX 751 ; N C68 ; B 32 0 666 700 ;
+C 69 ; WX 618 ; N C69 ; B 66 0 566 700 ;
+C 70 ; WX 685 ; N C70 ; B 32 0 666 700 ;
+C 71 ; WX 718 ; N C71 ; B 66 0 633 700 ;
+C 72 ; WX 784 ; N C72 ; B 0 0 799 700 ;
+C 73 ; WX 518 ; N C73 ; B 0 0 532 700 ;
+C 74 ; WX 551 ; N C74 ; B 32 -133 532 700 ;
+C 75 ; WX 784 ; N C75 ; B 0 0 799 700 ;
+C 76 ; WX 585 ; N C76 ; B -33 0 600 700 ;
+C 77 ; WX 918 ; N C77 ; B -67 0 866 700 ;
+C 78 ; WX 751 ; N C78 ; B -67 0 866 700 ;
+C 79 ; WX 685 ; N C79 ; B 99 0 600 700 ;
+C 80 ; WX 751 ; N C80 ; B 32 0 700 700 ;
+C 81 ; WX 685 ; N C81 ; B 0 0 600 700 ;
+C 82 ; WX 784 ; N C82 ; B 32 0 766 700 ;
+C 83 ; WX 651 ; N C83 ; B 0 0 666 700 ;
+C 84 ; WX 585 ; N C84 ; B 32 0 633 700 ;
+C 85 ; WX 718 ; N C85 ; B 32 0 700 700 ;
+C 86 ; WX 685 ; N C86 ; B 32 0 733 700 ;
+C 87 ; WX 751 ; N C87 ; B 32 0 866 700 ;
+C 88 ; WX 651 ; N C88 ; B -33 0 733 700 ;
+C 89 ; WX 718 ; N C89 ; B 66 0 733 700 ;
+C 90 ; WX 685 ; N C90 ; B 0 0 733 700 ;
+C 91 ; WX 451 ; N C91 ; B 133 -233 366 833 ;
+C 92 ; WX 300 ; N C92 ; B 0 0 0 0 ;
+C 93 ; WX 451 ; N C93 ; B 99 -233 333 833 ;
+C 94 ; WX 300 ; N C94 ; B 0 0 0 0 ;
+C 95 ; WX 300 ; N C95 ; B 0 0 0 0 ;
+C 96 ; WX 318 ; N C96 ; B 133 500 199 700 ;
+C 97 ; WX 518 ; N C97 ; B 32 0 532 299 ;
+C 98 ; WX 451 ; N C98 ; B 0 0 466 700 ;
+C 99 ; WX 384 ; N C99 ; B 32 0 399 299 ;
+C 100 ; WX 518 ; N C100 ; B 32 0 532 700 ;
+C 101 ; WX 384 ; N C101 ; B 32 0 399 299 ;
+C 102 ; WX 284 ; N C102 ; B -133 -400 299 700 ;
+C 103 ; WX 518 ; N C103 ; B 32 -400 532 299 ;
+C 104 ; WX 485 ; N C104 ; B 0 0 500 700 ;
+C 105 ; WX 251 ; N C105 ; B 32 0 266 500 ;
+C 106 ; WX 251 ; N C106 ; B -233 -400 266 500 ;
+C 107 ; WX 451 ; N C107 ; B 0 0 466 700 ;
+C 108 ; WX 251 ; N C108 ; B 0 0 266 700 ;
+C 109 ; WX 818 ; N C109 ; B 0 0 833 299 ;
+C 110 ; WX 585 ; N C110 ; B 0 0 600 299 ;
+C 111 ; WX 451 ; N C111 ; B 32 0 466 299 ;
+C 112 ; WX 485 ; N C112 ; B -133 -400 500 500 ;
+C 113 ; WX 518 ; N C113 ; B 32 -400 532 299 ;
+C 114 ; WX 451 ; N C114 ; B 0 0 466 299 ;
+C 115 ; WX 384 ; N C115 ; B 0 0 399 333 ;
+C 116 ; WX 251 ; N C116 ; B 0 0 266 700 ;
+C 117 ; WX 518 ; N C117 ; B 32 0 532 299 ;
+C 118 ; WX 485 ; N C118 ; B 32 0 500 299 ;
+C 119 ; WX 685 ; N C119 ; B 32 0 700 299 ;
+C 120 ; WX 518 ; N C120 ; B 0 0 532 299 ;
+C 121 ; WX 518 ; N C121 ; B 32 -400 532 299 ;
+C 122 ; WX 418 ; N C122 ; B -33 -400 433 299 ;
+C 123 ; WX 485 ; N C123 ; B 166 -233 333 833 ;
+C 124 ; WX 451 ; N C124 ; B 133 -233 366 833 ;
+C 125 ; WX 485 ; N C125 ; B 166 -233 333 833 ;
+C 126 ; WX 451 ; N C126 ; B 99 433 366 700 ;
+EndCharMetrics
+
+EndFontMetrics
diff --git a/src/fonts/plcs.gle b/src/fonts/plcs.gle
new file mode 100644
index 0000000..7fe562b
--- /dev/null
+++ b/src/fonts/plcs.gle
@@ -0,0 +1,2702 @@
+dfont design= 1428
+dfont char=33
+amove 238 1000
+aline 190 904
+aline 238 333
+aline 285 904
+aline 238 1000
+amove 238 904
+aline 238 619
+amove 238 95
+aline 190 47
+aline 238 0
+aline 285 47
+aline 238 95
+stroke
+dfont endchar
+dfont char=34
+amove 142 666
+aline 190 1000
+amove 238 1000
+aline 142 666
+amove 523 666
+aline 571 1000
+amove 619 1000
+aline 523 666
+stroke
+dfont endchar
+dfont char=35
+amove 190 0
+aline 952 0
+amove 571 0
+aline 571 809
+amove 190 428
+aline 952 428
+stroke
+dfont endchar
+dfont char=36
+amove 380 428
+aline 380 1000
+amove 142 857
+aline 619 571
+amove 619 857
+aline 142 571
+stroke
+dfont endchar
+dfont char=37
+amove 142 0
+aline 1000 1000
+aline 904 952
+aline 761 904
+aline 619 904
+aline 476 952
+aline 380 1000
+aline 285 1000
+aline 190 952
+aline 142 857
+aline 142 761
+aline 238 666
+aline 333 666
+aline 428 714
+aline 476 809
+aline 476 904
+aline 380 1000
+amove 809 333
+aline 714 285
+aline 666 190
+aline 666 95
+aline 761 0
+aline 857 0
+aline 952 47
+aline 1000 142
+aline 1000 238
+aline 904 333
+aline 809 333
+stroke
+dfont endchar
+dfont char=38
+amove 190 428
+aline 952 428
+amove 952 809
+aline 190 809
+amove 571 809
+aline 571 0
+stroke
+dfont endchar
+dfont char=39
+amove 142 666
+aline 190 1000
+amove 238 1000
+aline 142 666
+stroke
+dfont endchar
+dfont char=40
+amove 428 -239
+aline 333 -48
+aline 285 95
+aline 238 333
+aline 238 523
+aline 285 761
+aline 333 904
+aline 428 1095
+amove 523 1190
+aline 428 1095
+aline 333 952
+aline 238 761
+aline 190 523
+aline 190 333
+aline 238 95
+aline 333 -96
+aline 428 -239
+aline 523 -334
+stroke
+dfont endchar
+dfont char=41
+amove 238 -239
+aline 333 -48
+aline 380 95
+aline 428 333
+aline 428 523
+aline 380 761
+aline 333 904
+aline 238 1095
+amove 142 1190
+aline 238 1095
+aline 333 952
+aline 428 761
+aline 476 523
+aline 476 333
+aline 428 95
+aline 333 -96
+aline 238 -239
+aline 142 -334
+stroke
+dfont endchar
+dfont char=42
+amove 190 -334
+aline 523 428
+aline 190 1190
+stroke
+dfont endchar
+dfont char=43
+amove 380 238
+aline 333 95
+aline 333 -96
+aline 380 -239
+amove 476 -334
+aline 333 -191
+aline 285 -48
+aline 285 47
+aline 333 190
+aline 428 285
+aline 428 333
+aline 238 428
+aline 428 523
+aline 428 571
+aline 333 666
+aline 285 809
+aline 285 904
+aline 333 1047
+aline 476 1190
+amove 380 1095
+aline 333 952
+aline 333 761
+aline 380 619
+stroke
+dfont endchar
+dfont char=44
+amove 238 0
+aline 190 47
+aline 238 95
+aline 285 47
+aline 285 -48
+aline 238 -143
+aline 190 -191
+stroke
+dfont endchar
+dfont char=45
+amove 142 -334
+aline 476 -334
+aline 476 1190
+aline 142 1190
+amove 428 1190
+aline 428 -334
+stroke
+dfont endchar
+dfont char=46
+amove 238 95
+aline 190 47
+aline 238 0
+aline 285 47
+aline 238 95
+stroke
+dfont endchar
+dfont char=47
+amove 95 -334
+aline 952 1190
+stroke
+dfont endchar
+dfont char=48
+amove 428 0
+aline 333 47
+aline 285 95
+aline 238 190
+aline 190 428
+aline 190 571
+aline 238 809
+aline 285 904
+aline 333 952
+aline 428 1000
+aline 523 1000
+aline 666 952
+aline 761 809
+aline 809 571
+aline 809 428
+aline 761 190
+aline 666 47
+aline 523 0
+aline 428 0
+aline 285 47
+aline 190 190
+aline 142 428
+aline 142 571
+aline 190 809
+aline 285 952
+aline 428 1000
+amove 523 1000
+aline 619 952
+aline 666 904
+aline 714 809
+aline 761 571
+aline 761 428
+aline 714 190
+aline 666 95
+aline 619 47
+aline 523 0
+stroke
+dfont endchar
+dfont char=49
+amove 285 0
+aline 714 0
+amove 523 0
+aline 523 1000
+aline 380 857
+aline 285 809
+amove 476 952
+aline 476 0
+stroke
+dfont endchar
+dfont char=50
+amove 142 0
+aline 142 142
+aline 190 285
+aline 285 380
+aline 380 428
+aline 619 523
+aline 761 619
+aline 809 714
+aline 809 809
+aline 761 904
+aline 714 952
+aline 571 1000
+aline 380 1000
+aline 238 952
+aline 190 904
+aline 142 809
+aline 142 761
+aline 190 714
+aline 238 761
+aline 190 809
+amove 571 1000
+aline 666 952
+aline 714 904
+aline 761 809
+aline 761 714
+aline 714 619
+aline 571 523
+aline 380 428
+amove 285 142
+aline 523 0
+aline 714 0
+aline 761 47
+aline 809 142
+aline 809 238
+amove 809 142
+aline 761 95
+aline 666 47
+aline 523 47
+aline 285 142
+aline 190 142
+aline 142 95
+stroke
+dfont endchar
+dfont char=51
+amove 190 190
+aline 238 238
+aline 190 285
+aline 142 238
+aline 142 190
+aline 190 95
+aline 238 47
+aline 380 0
+aline 571 0
+aline 714 47
+aline 761 95
+aline 809 190
+aline 809 333
+aline 761 428
+aline 666 523
+aline 571 571
+aline 666 619
+aline 714 714
+aline 714 857
+aline 666 952
+aline 571 1000
+amove 190 809
+aline 238 761
+aline 190 714
+aline 142 761
+aline 142 809
+aline 190 904
+aline 238 952
+aline 380 1000
+aline 571 1000
+aline 714 952
+aline 761 857
+aline 761 714
+aline 714 619
+aline 571 571
+aline 428 571
+amove 714 476
+aline 761 333
+aline 761 190
+aline 714 95
+aline 666 47
+aline 571 -1
+stroke
+dfont endchar
+dfont char=52
+amove 428 0
+aline 761 0
+amove 619 0
+aline 619 1000
+aline 95 285
+aline 857 285
+amove 571 0
+aline 571 904
+stroke
+dfont endchar
+dfont char=53
+amove 190 190
+aline 238 238
+aline 190 285
+aline 142 238
+aline 142 190
+aline 190 95
+aline 238 47
+aline 380 0
+aline 523 0
+aline 666 47
+aline 761 142
+aline 809 285
+aline 809 380
+aline 761 523
+aline 666 619
+aline 523 666
+aline 380 666
+aline 238 619
+aline 142 523
+aline 238 1000
+aline 714 1000
+aline 476 952
+aline 238 952
+amove 523 666
+aline 619 619
+aline 714 523
+aline 761 380
+aline 761 285
+aline 714 142
+aline 619 47
+aline 523 0
+stroke
+dfont endchar
+dfont char=54
+amove 190 333
+aline 238 476
+aline 333 571
+aline 476 619
+aline 523 619
+aline 666 571
+aline 761 476
+aline 809 333
+aline 809 285
+aline 761 142
+aline 666 47
+aline 523 -1
+aline 428 -1
+aline 285 47
+aline 190 142
+aline 142 285
+aline 142 571
+aline 190 761
+aline 238 857
+aline 333 952
+aline 476 1000
+aline 619 1000
+aline 714 952
+aline 761 857
+aline 761 809
+aline 714 761
+aline 666 809
+aline 714 857
+amove 476 1000
+aline 380 952
+aline 285 857
+aline 238 761
+aline 190 571
+aline 190 285
+aline 238 142
+aline 333 47
+aline 428 0
+amove 523 0
+aline 619 47
+aline 714 142
+aline 761 285
+aline 761 333
+aline 714 476
+aline 619 571
+aline 523 619
+stroke
+dfont endchar
+dfont char=55
+amove 428 0
+aline 428 238
+aline 476 380
+aline 523 476
+aline 761 714
+amove 619 857
+aline 380 952
+aline 285 952
+aline 190 904
+amove 142 999
+aline 142 714
+amove 142 809
+aline 190 904
+aline 285 999
+aline 380 999
+aline 619 857
+aline 714 857
+aline 761 904
+aline 809 999
+aline 809 857
+aline 761 714
+aline 571 476
+aline 523 380
+aline 476 238
+aline 476 -1
+stroke
+dfont endchar
+dfont char=56
+amove 380 0
+aline 285 47
+aline 238 95
+aline 190 190
+aline 190 380
+aline 238 476
+aline 285 523
+aline 380 571
+aline 285 619
+aline 238 714
+aline 238 857
+aline 285 952
+aline 380 1000
+aline 571 1000
+aline 714 952
+aline 761 857
+aline 761 714
+aline 714 619
+aline 571 571
+aline 380 571
+aline 238 619
+aline 190 714
+aline 190 857
+aline 238 952
+aline 380 1000
+amove 571 1000
+aline 666 952
+aline 714 857
+aline 714 714
+aline 666 619
+aline 571 571
+aline 714 523
+aline 761 476
+aline 809 380
+aline 809 190
+aline 761 95
+aline 714 47
+aline 571 -1
+aline 380 -1
+aline 238 47
+aline 190 95
+aline 142 190
+aline 142 380
+aline 190 476
+aline 238 523
+aline 380 571
+amove 571 571
+aline 666 523
+aline 714 476
+aline 761 380
+aline 761 190
+aline 714 95
+aline 666 47
+aline 571 -1
+stroke
+dfont endchar
+dfont char=57
+amove 761 666
+aline 714 523
+aline 619 428
+aline 476 380
+aline 428 380
+aline 285 428
+aline 190 523
+aline 142 666
+aline 142 714
+aline 190 857
+aline 285 952
+aline 428 1000
+aline 523 1000
+aline 666 952
+aline 761 857
+aline 809 714
+aline 809 428
+aline 761 238
+aline 714 142
+aline 619 47
+aline 476 0
+aline 333 0
+aline 238 47
+aline 190 142
+aline 190 190
+aline 238 238
+aline 285 190
+aline 238 142
+amove 428 380
+aline 333 428
+aline 238 523
+aline 190 666
+aline 190 714
+aline 238 857
+aline 333 952
+aline 428 1000
+amove 523 1000
+aline 619 952
+aline 714 857
+aline 761 714
+aline 761 428
+aline 714 238
+aline 666 142
+aline 571 47
+aline 476 0
+stroke
+dfont endchar
+dfont char=58
+amove 238 666
+aline 190 619
+aline 238 571
+aline 285 619
+aline 238 666
+amove 238 95
+aline 190 47
+aline 238 -1
+aline 285 47
+aline 238 95
+stroke
+dfont endchar
+dfont char=59
+amove 238 666
+aline 190 619
+aline 238 571
+aline 285 619
+aline 238 666
+amove 238 0
+aline 190 47
+aline 238 95
+aline 285 47
+aline 285 -48
+aline 238 -143
+aline 190 -191
+stroke
+dfont endchar
+dfont char=60
+amove 952 857
+aline 190 428
+aline 952 0
+stroke
+dfont endchar
+dfont char=61
+amove 238 -334
+aline 380 -191
+aline 428 -48
+aline 428 47
+aline 380 190
+aline 285 285
+aline 285 333
+aline 476 428
+aline 285 523
+aline 285 571
+aline 380 666
+aline 428 809
+aline 428 904
+aline 380 1047
+aline 238 1190
+amove 333 1095
+aline 380 952
+aline 380 761
+aline 333 619
+amove 333 238
+aline 380 95
+aline 380 -96
+aline 333 -239
+stroke
+dfont endchar
+dfont char=62
+amove 190 0
+aline 952 428
+aline 190 857
+stroke
+dfont endchar
+dfont char=63
+amove 428 95
+aline 380 47
+aline 428 0
+aline 476 47
+aline 428 95
+amove 428 333
+aline 428 476
+aline 619 571
+aline 666 619
+aline 714 714
+aline 714 809
+aline 666 904
+aline 619 952
+aline 476 1000
+aline 333 1000
+aline 238 952
+aline 190 904
+aline 142 809
+aline 142 761
+aline 190 714
+aline 238 761
+aline 190 809
+amove 476 1000
+aline 571 952
+aline 619 904
+aline 666 809
+aline 666 714
+aline 619 619
+aline 523 523
+stroke
+dfont endchar
+dfont char=64
+amove 523 238
+aline 476 285
+aline 428 380
+aline 428 523
+aline 476 666
+aline 571 761
+amove 857 761
+aline 809 380
+aline 809 285
+aline 904 238
+aline 999 238
+aline 1095 333
+aline 1142 476
+aline 1142 571
+aline 1095 714
+aline 1047 809
+aline 952 904
+aline 857 952
+aline 714 1000
+aline 571 1000
+aline 428 952
+aline 333 904
+aline 238 809
+aline 190 714
+aline 142 571
+aline 142 428
+aline 190 285
+aline 238 190
+aline 333 95
+aline 428 47
+aline 571 0
+aline 714 0
+aline 857 47
+aline 952 95
+aline 1000 142
+amove 904 238
+aline 857 285
+aline 857 380
+aline 904 761
+amove 857 619
+aline 809 714
+aline 714 761
+aline 571 761
+aline 476 714
+aline 428 666
+aline 380 523
+aline 380 380
+aline 428 285
+aline 523 238
+aline 666 238
+aline 761 285
+aline 809 380
+stroke
+dfont endchar
+dfont char=65
+amove 0 95
+aline 47 142
+aline 0 190
+aline -48 142
+aline -48 47
+aline 0 0
+aline 95 0
+aline 190 47
+aline 333 190
+aline 476 380
+aline 571 523
+aline 714 761
+aline 809 904
+aline 904 1000
+aline 857 809
+aline 761 333
+aline 714 0
+aline 714 95
+aline 666 238
+aline 619 333
+aline 523 428
+aline 428 476
+aline 333 476
+aline 285 428
+aline 285 333
+aline 333 190
+aline 476 47
+aline 619 0
+aline 809 0
+aline 904 47
+amove 761 0
+aline 904 1000
+stroke
+dfont endchar
+dfont char=66
+amove 95 95
+aline 142 142
+aline 95 190
+aline 47 142
+aline 47 47
+aline 95 0
+aline 190 0
+aline 333 47
+aline 428 142
+aline 476 238
+aline 523 380
+aline 619 761
+aline 666 904
+amove 714 952
+aline 666 904
+aline 619 809
+aline 523 571
+aline 428 285
+aline 380 190
+aline 285 47
+aline 190 0
+amove 619 285
+aline 571 142
+aline 571 47
+aline 619 0
+aline 714 0
+aline 809 47
+aline 857 95
+aline 904 238
+aline 904 380
+aline 857 476
+aline 809 523
+aline 666 571
+aline 761 523
+aline 809 476
+aline 857 380
+aline 857 238
+aline 809 95
+aline 714 0
+amove 571 571
+aline 666 571
+aline 857 619
+aline 952 666
+aline 1000 761
+aline 1000 857
+aline 952 952
+aline 857 1000
+aline 571 1000
+aline 428 952
+aline 333 904
+aline 238 809
+aline 190 714
+aline 190 619
+aline 238 571
+aline 333 571
+aline 380 619
+aline 428 714
+amove 857 619
+aline 904 666
+aline 952 761
+aline 952 857
+aline 904 952
+aline 857 1000
+stroke
+dfont endchar
+dfont char=67
+amove 380 0
+aline 285 47
+aline 238 142
+aline 238 285
+aline 285 476
+aline 380 666
+aline 476 809
+aline 619 952
+aline 714 1000
+amove 142 904
+aline 95 809
+aline 95 714
+aline 142 619
+aline 285 571
+aline 428 571
+aline 619 619
+aline 714 666
+aline 809 761
+aline 857 857
+aline 857 952
+aline 809 1000
+aline 714 1000
+aline 571 952
+aline 428 809
+aline 333 666
+aline 238 476
+aline 190 285
+aline 190 142
+aline 238 47
+aline 380 0
+aline 476 0
+aline 619 47
+aline 714 142
+aline 761 238
+aline 761 333
+aline 714 428
+aline 619 428
+aline 523 380
+aline 476 285
+stroke
+dfont endchar
+dfont char=68
+amove 190 0
+aline 285 47
+aline 380 190
+aline 428 285
+aline 523 571
+aline 619 809
+aline 666 904
+aline 714 952
+amove 666 904
+aline 619 761
+aline 523 380
+aline 476 238
+aline 428 142
+aline 333 47
+aline 190 0
+aline 95 0
+aline 47 47
+aline 47 142
+aline 95 190
+aline 190 190
+aline 285 142
+aline 380 47
+aline 476 0
+aline 619 0
+aline 714 47
+aline 809 142
+aline 904 333
+aline 952 571
+aline 952 714
+aline 904 857
+aline 809 952
+aline 714 1000
+aline 476 1000
+aline 333 952
+aline 238 857
+aline 190 761
+aline 190 666
+aline 238 619
+aline 333 619
+aline 380 666
+aline 428 761
+stroke
+dfont endchar
+dfont char=69
+amove 190 47
+aline 142 142
+aline 142 333
+aline 190 428
+aline 285 523
+aline 380 571
+amove 476 571
+aline 380 619
+aline 333 714
+aline 333 809
+aline 380 904
+aline 428 952
+aline 523 1000
+aline 666 1000
+aline 761 952
+aline 809 857
+aline 809 761
+aline 761 666
+aline 666 666
+aline 619 714
+aline 619 809
+aline 666 857
+amove 523 1000
+aline 428 904
+aline 380 809
+aline 380 666
+aline 476 571
+aline 380 571
+aline 238 523
+aline 142 428
+aline 95 333
+aline 95 190
+aline 142 95
+aline 190 47
+aline 285 0
+aline 428 0
+aline 571 47
+aline 666 142
+aline 714 238
+aline 714 333
+aline 666 428
+aline 571 428
+aline 476 380
+aline 428 285
+stroke
+dfont endchar
+dfont char=70
+amove 95 95
+aline 142 142
+aline 95 190
+aline 47 142
+aline 47 95
+aline 95 47
+aline 190 0
+aline 285 0
+aline 428 47
+aline 523 142
+aline 571 238
+aline 619 380
+aline 714 761
+aline 761 904
+aline 809 952
+aline 952 1000
+aline 476 1000
+aline 333 952
+aline 238 857
+aline 190 761
+aline 190 666
+aline 238 571
+aline 333 571
+aline 428 619
+aline 476 714
+amove 571 1000
+aline 761 952
+aline 809 952
+amove 761 904
+aline 714 809
+aline 619 571
+aline 523 285
+aline 476 190
+aline 380 47
+aline 285 0
+amove 380 380
+aline 428 428
+aline 523 476
+aline 714 476
+aline 809 523
+aline 904 666
+aline 809 333
+stroke
+dfont endchar
+dfont char=71
+amove 142 142
+aline 190 190
+aline 142 238
+aline 95 190
+aline 95 142
+aline 142 47
+aline 238 0
+aline 380 0
+aline 571 47
+aline 666 95
+aline 761 190
+aline 857 380
+aline 904 571
+aline 857 476
+aline 761 380
+aline 666 333
+aline 571 333
+aline 476 380
+aline 428 476
+aline 428 619
+aline 476 761
+aline 523 857
+aline 619 952
+aline 714 1000
+aline 761 1000
+aline 809 952
+aline 809 904
+aline 761 761
+aline 619 619
+aline 523 571
+aline 380 523
+aline 238 523
+aline 142 571
+aline 95 666
+aline 95 761
+aline 142 857
+amove 761 1000
+aline 666 952
+aline 571 857
+aline 523 761
+aline 476 619
+aline 476 428
+aline 571 333
+amove 857 380
+aline 761 238
+aline 666 142
+aline 523 47
+aline 380 0
+stroke
+dfont endchar
+dfont char=72
+amove 47 95
+aline 95 142
+aline 47 190
+aline 0 142
+aline 0 47
+aline 47 0
+aline 142 0
+aline 238 47
+aline 285 95
+aline 333 190
+aline 428 476
+aline 571 1000
+aline 428 1000
+aline 285 952
+aline 238 857
+aline 238 761
+aline 285 714
+amove 190 333
+aline 238 380
+aline 333 428
+aline 761 571
+aline 857 619
+aline 1000 714
+aline 1095 809
+aline 1142 904
+aline 1142 952
+aline 1095 1000
+aline 1047 1000
+aline 952 952
+aline 857 809
+aline 809 714
+aline 714 428
+aline 666 238
+aline 666 95
+aline 761 0
+aline 809 0
+aline 904 47
+aline 1000 142
+amove 761 0
+aline 714 95
+aline 714 238
+aline 761 428
+aline 857 714
+aline 952 904
+aline 1047 1000
+amove 571 1000
+aline 428 571
+aline 380 428
+aline 285 190
+aline 238 95
+aline 142 0
+stroke
+dfont endchar
+dfont char=73
+amove 47 95
+aline 95 142
+aline 47 190
+aline 0 142
+aline 0 47
+aline 47 0
+aline 142 0
+aline 285 47
+aline 380 142
+aline 428 238
+aline 523 523
+aline 619 809
+aline 666 904
+aline 761 1000
+aline 571 1000
+aline 380 952
+aline 285 904
+aline 238 809
+aline 238 714
+aline 285 619
+aline 380 571
+aline 523 571
+aline 666 619
+aline 761 714
+amove 666 904
+aline 571 761
+aline 476 523
+aline 380 285
+aline 333 190
+aline 238 47
+aline 142 0
+stroke
+dfont endchar
+dfont char=74
+amove 238 -96
+aline 333 95
+aline 476 523
+aline 571 761
+aline 666 904
+aline 761 1000
+amove 761 666
+aline 666 571
+aline 523 523
+aline 380 523
+aline 285 571
+aline 238 666
+aline 238 761
+aline 285 857
+aline 380 952
+aline 571 1000
+aline 761 1000
+aline 666 857
+aline 619 761
+aline 476 333
+aline 380 142
+aline 333 47
+aline 238 -96
+aline 190 -143
+aline 95 -191
+aline 47 -143
+aline 47 -48
+aline 95 47
+aline 190 142
+aline 285 190
+aline 428 238
+aline 619 285
+stroke
+dfont endchar
+dfont char=75
+amove 47 95
+aline 95 142
+aline 47 190
+aline 0 142
+aline 0 47
+aline 47 0
+aline 142 0
+aline 238 47
+aline 285 95
+aline 333 190
+aline 428 476
+aline 571 1000
+aline 476 1000
+aline 333 952
+aline 238 857
+aline 238 761
+aline 285 714
+amove 476 571
+aline 619 619
+aline 714 666
+aline 809 761
+aline 952 952
+amove 1095 952
+aline 1047 904
+aline 1095 857
+aline 1142 904
+aline 1142 952
+aline 1095 1000
+aline 1047 1000
+aline 952 952
+aline 809 714
+aline 761 666
+aline 666 619
+aline 476 571
+aline 619 523
+aline 666 428
+aline 714 95
+aline 761 0
+amove 1000 142
+aline 904 47
+aline 809 0
+aline 761 0
+aline 666 95
+aline 619 428
+aline 571 523
+aline 476 571
+amove 571 1000
+aline 428 571
+aline 380 428
+aline 285 190
+aline 238 95
+aline 142 0
+stroke
+dfont endchar
+dfont char=76
+amove 95 0
+aline 190 47
+aline 285 190
+aline 333 285
+aline 523 761
+aline 619 904
+aline 666 952
+aline 761 1000
+aline 809 1000
+aline 857 952
+aline 857 904
+aline 809 761
+aline 666 619
+aline 571 571
+aline 428 523
+aline 285 523
+aline 190 571
+aline 142 666
+aline 142 761
+aline 190 857
+amove 619 904
+aline 523 714
+aline 428 380
+aline 380 238
+aline 333 142
+aline 238 47
+aline 95 -1
+aline 0 -1
+aline -48 47
+aline -48 142
+aline 0 190
+aline 95 190
+aline 190 142
+aline 333 47
+aline 428 -1
+aline 571 -1
+aline 666 47
+aline 761 142
+stroke
+dfont endchar
+dfont char=77
+amove -48 95
+aline -1 142
+aline -48 190
+aline -96 142
+aline -96 47
+aline -48 0
+aline 47 0
+aline 142 47
+aline 238 142
+aline 333 285
+aline 476 571
+aline 666 1000
+aline 571 666
+aline 523 476
+aline 476 238
+aline 476 47
+aline 571 0
+aline 523 47
+aline 523 238
+aline 571 571
+aline 619 809
+aline 666 1000
+amove 1095 1000
+aline 904 571
+aline 666 142
+aline 571 0
+amove 1000 0
+aline 952 47
+aline 952 238
+aline 1000 571
+aline 1047 809
+aline 1095 1000
+aline 1000 666
+aline 952 476
+aline 904 238
+aline 904 47
+aline 1000 0
+aline 1047 0
+aline 1142 47
+aline 1238 142
+stroke
+dfont endchar
+dfont char=78
+amove -48 95
+aline -1 142
+aline -48 190
+aline -96 142
+aline -96 47
+aline -48 0
+aline 47 0
+aline 142 47
+aline 238 190
+aline 285 285
+aline 380 523
+aline 476 809
+aline 523 1000
+aline 523 761
+aline 571 238
+aline 619 0
+aline 619 238
+aline 571 761
+aline 523 1000
+amove 1190 952
+aline 1142 904
+aline 1190 857
+aline 1238 904
+aline 1238 952
+aline 1190 1000
+aline 1095 1000
+aline 1000 952
+aline 904 809
+aline 857 714
+aline 761 476
+aline 666 190
+aline 619 0
+stroke
+dfont endchar
+dfont char=79
+amove 333 0
+aline 238 95
+aline 190 238
+aline 190 428
+aline 238 619
+aline 333 809
+aline 428 952
+amove 523 1000
+aline 428 952
+aline 333 857
+aline 238 714
+aline 190 619
+aline 142 428
+aline 142 238
+aline 190 95
+aline 238 47
+aline 333 0
+aline 428 0
+aline 571 47
+aline 666 142
+aline 761 285
+aline 809 380
+aline 857 571
+aline 857 761
+aline 809 904
+aline 761 952
+aline 714 952
+aline 619 904
+aline 523 809
+aline 428 619
+aline 380 380
+aline 380 238
+stroke
+dfont endchar
+dfont char=80
+amove 95 95
+aline 142 142
+aline 95 190
+aline 47 142
+aline 47 47
+aline 95 0
+aline 190 0
+aline 333 47
+aline 428 142
+aline 476 238
+aline 523 380
+aline 619 761
+aline 666 904
+amove 714 952
+aline 666 904
+aline 619 809
+aline 523 571
+aline 428 285
+aline 380 190
+aline 285 47
+aline 190 0
+amove 571 523
+aline 666 476
+aline 761 476
+aline 904 523
+aline 952 571
+aline 1000 666
+aline 1000 809
+aline 952 904
+aline 904 952
+aline 761 1000
+aline 571 1000
+aline 428 952
+aline 333 904
+aline 238 809
+aline 190 714
+aline 190 619
+aline 238 571
+aline 333 571
+aline 380 619
+aline 428 714
+amove 761 476
+aline 857 523
+aline 904 571
+aline 952 666
+aline 952 809
+aline 904 904
+aline 857 952
+aline 761 1000
+stroke
+dfont endchar
+dfont char=81
+amove 142 0
+aline 333 95
+aline 523 238
+aline 666 380
+aline 761 523
+aline 809 666
+aline 809 857
+aline 761 952
+aline 714 1000
+amove 619 809
+aline 619 714
+aline 571 619
+aline 523 571
+aline 428 523
+aline 333 523
+aline 285 619
+aline 285 714
+aline 333 857
+aline 428 952
+aline 571 1000
+aline 714 1000
+aline 809 952
+aline 857 857
+aline 857 666
+aline 809 523
+aline 714 380
+aline 523 190
+aline 380 95
+aline 285 47
+aline 142 0
+aline 47 0
+aline 0 47
+aline 0 142
+aline 47 190
+aline 142 190
+aline 238 142
+aline 380 47
+aline 523 0
+aline 666 0
+aline 761 47
+aline 857 142
+stroke
+dfont endchar
+dfont char=82
+amove 95 95
+aline 142 142
+aline 95 190
+aline 47 142
+aline 47 47
+aline 95 0
+aline 190 0
+aline 333 47
+aline 428 142
+aline 476 238
+aline 523 380
+aline 619 761
+aline 666 904
+amove 714 952
+aline 666 904
+aline 619 809
+aline 523 571
+aline 428 285
+aline 380 190
+aline 285 47
+aline 190 0
+amove 857 0
+aline 809 95
+aline 761 428
+aline 714 523
+aline 571 571
+aline 761 571
+aline 904 619
+aline 952 666
+aline 1000 761
+aline 1000 857
+aline 952 952
+aline 809 1000
+aline 571 1000
+aline 428 952
+aline 333 904
+aline 238 809
+aline 190 714
+aline 190 619
+aline 238 571
+aline 333 571
+aline 380 619
+aline 428 714
+amove 571 571
+aline 666 523
+aline 714 428
+aline 761 95
+aline 857 0
+aline 904 0
+aline 1000 47
+aline 1095 142
+amove 761 571
+aline 857 619
+aline 904 666
+aline 952 761
+aline 952 857
+aline 904 952
+aline 809 1000
+stroke
+dfont endchar
+dfont char=83
+amove 47 142
+aline 95 190
+aline 47 238
+aline 0 190
+aline 0 142
+aline 47 47
+aline 142 0
+aline 285 0
+aline 428 47
+aline 523 142
+aline 571 285
+aline 619 619
+aline 666 809
+amove 285 857
+aline 238 761
+aline 238 666
+aline 285 571
+aline 380 523
+aline 523 523
+aline 666 571
+aline 761 619
+aline 904 761
+aline 952 904
+aline 952 952
+aline 904 1000
+aline 857 1000
+aline 761 952
+aline 714 904
+aline 666 809
+aline 619 666
+aline 523 333
+aline 476 190
+aline 380 47
+aline 285 -1
+stroke
+dfont endchar
+dfont char=84
+amove 95 95
+aline 142 142
+aline 95 190
+aline 47 142
+aline 47 95
+aline 95 47
+aline 190 0
+aline 285 0
+aline 428 47
+aline 523 142
+aline 571 238
+aline 619 380
+aline 714 761
+aline 761 904
+aline 809 952
+aline 904 1000
+aline 476 1000
+aline 333 952
+aline 238 857
+aline 190 761
+aline 190 666
+aline 238 571
+aline 333 571
+aline 428 619
+aline 476 714
+amove 571 1000
+aline 761 952
+aline 809 952
+amove 761 904
+aline 714 809
+aline 619 571
+aline 523 285
+aline 476 190
+aline 380 47
+aline 285 0
+stroke
+dfont endchar
+dfont char=85
+amove 238 0
+aline 190 95
+aline 190 238
+aline 333 619
+aline 380 761
+aline 380 904
+aline 285 1000
+aline 238 1000
+aline 142 952
+aline 47 809
+amove 285 1000
+aline 333 904
+aline 333 761
+aline 190 380
+aline 142 238
+aline 142 95
+aline 238 0
+aline 333 0
+aline 428 47
+aline 571 190
+aline 666 333
+aline 714 428
+amove 1000 142
+aline 904 47
+aline 809 0
+aline 761 0
+aline 666 95
+aline 666 238
+aline 714 428
+aline 904 1000
+amove 952 1000
+aline 761 428
+aline 714 238
+aline 714 95
+aline 761 0
+stroke
+dfont endchar
+dfont char=86
+amove 285 0
+aline 238 95
+aline 238 238
+aline 333 571
+aline 380 761
+aline 380 904
+aline 285 1000
+aline 238 1000
+aline 142 952
+aline 47 809
+amove 285 1000
+aline 333 904
+aline 333 761
+aline 238 428
+aline 190 238
+aline 190 95
+aline 285 0
+aline 333 0
+aline 476 47
+aline 619 190
+aline 714 333
+aline 809 523
+aline 857 666
+aline 904 857
+aline 904 952
+aline 857 1000
+aline 809 1000
+aline 761 952
+aline 714 857
+aline 714 714
+aline 761 619
+aline 857 523
+aline 952 476
+aline 1047 476
+stroke
+dfont endchar
+dfont char=87
+amove 190 0
+aline 238 285
+aline 285 714
+aline 333 904
+aline 380 1000
+aline 190 1000
+aline 95 952
+aline 47 857
+aline 47 761
+aline 95 714
+aline 142 714
+amove 285 714
+aline 285 285
+aline 238 0
+aline 333 95
+aline 428 285
+aline 571 714
+aline 666 904
+aline 761 1000
+aline 714 904
+aline 666 714
+aline 619 285
+aline 571 0
+amove 619 0
+aline 666 285
+aline 666 714
+amove 1238 1000
+aline 1142 952
+aline 1047 857
+aline 952 714
+aline 809 285
+aline 714 95
+aline 619 0
+stroke
+dfont endchar
+dfont char=88
+amove 0 95
+aline 47 142
+aline 0 190
+aline -48 142
+aline -48 47
+aline 0 0
+aline 95 0
+aline 238 47
+aline 333 142
+aline 428 285
+aline 523 523
+aline 571 714
+aline 571 857
+aline 523 952
+aline 428 1000
+aline 333 1000
+aline 238 952
+aline 190 857
+aline 190 761
+aline 238 714
+aline 333 714
+aline 380 761
+amove 428 1000
+aline 476 952
+aline 523 857
+aline 523 714
+aline 476 523
+aline 380 285
+aline 285 142
+aline 190 47
+aline 95 0
+amove 809 142
+aline 714 47
+aline 619 0
+aline 571 0
+aline 523 47
+aline 476 142
+aline 476 285
+aline 523 523
+aline 619 714
+aline 714 857
+aline 809 952
+aline 904 1000
+aline 1000 1000
+aline 1047 952
+aline 1047 904
+aline 1000 857
+aline 952 904
+aline 1000 952
+stroke
+dfont endchar
+dfont char=89
+amove 142 142
+aline 190 190
+aline 142 238
+aline 95 190
+aline 95 142
+aline 142 47
+aline 238 0
+aline 428 0
+aline 571 47
+aline 666 142
+aline 761 285
+aline 857 476
+aline 952 714
+aline 1047 1000
+amove 1000 1000
+aline 904 714
+aline 761 333
+aline 666 142
+amove 428 333
+aline 380 428
+aline 380 571
+aline 476 857
+aline 476 952
+aline 380 1000
+aline 333 1000
+aline 238 952
+aline 142 809
+amove 380 1000
+aline 428 952
+aline 428 857
+aline 333 571
+aline 333 428
+aline 428 333
+aline 523 333
+aline 666 380
+aline 761 476
+aline 857 619
+aline 904 714
+stroke
+dfont endchar
+dfont char=90
+amove 238 0
+aline 380 47
+aline 476 95
+aline 571 190
+aline 666 333
+aline 714 428
+aline 761 571
+aline 857 809
+aline 904 904
+amove 952 952
+aline 904 952
+aline 714 1000
+amove 571 714
+aline 523 619
+aline 428 571
+aline 333 571
+aline 285 666
+aline 285 761
+aline 333 857
+aline 428 952
+aline 571 1000
+aline 1047 1000
+aline 952 952
+aline 904 904
+aline 857 761
+aline 809 571
+aline 714 285
+aline 619 142
+aline 476 47
+aline 238 0
+aline 47 0
+aline 0 47
+aline 0 142
+aline 47 190
+aline 142 190
+aline 238 142
+aline 380 47
+aline 476 0
+aline 619 0
+aline 761 47
+aline 857 142
+stroke
+dfont endchar
+dfont char=91
+amove 190 -334
+aline 190 1190
+aline 523 1190
+amove 238 1190
+aline 238 -334
+amove 190 -334
+aline 523 -334
+stroke
+dfont endchar
+stroke
+dfont endchar
+dfont char=93
+amove 142 -334
+aline 476 -334
+aline 476 1190
+aline 142 1190
+amove 428 1190
+aline 428 -334
+stroke
+dfont endchar
+stroke
+dfont endchar
+stroke
+dfont endchar
+dfont char=96
+amove 238 904
+aline 285 952
+aline 238 1000
+aline 190 952
+aline 190 857
+aline 238 761
+aline 285 714
+stroke
+dfont endchar
+dfont char=97
+amove 190 0
+aline 95 95
+aline 95 238
+aline 142 333
+aline 238 428
+amove 476 285
+aline 428 380
+aline 333 428
+aline 238 428
+aline 142 380
+aline 95 333
+aline 47 238
+aline 47 142
+aline 95 47
+aline 190 0
+aline 285 0
+aline 380 47
+aline 428 142
+amove 523 0
+aline 476 47
+aline 476 142
+aline 571 428
+amove 523 428
+aline 428 142
+aline 428 47
+aline 523 0
+aline 619 47
+aline 666 95
+aline 761 238
+stroke
+dfont endchar
+dfont char=98
+amove 142 0
+aline 95 47
+aline 95 142
+aline 380 1000
+amove 333 1000
+aline 47 142
+aline 47 47
+aline 142 0
+aline 190 0
+aline 285 47
+aline 380 142
+aline 428 285
+aline 428 428
+aline 476 238
+aline 523 190
+aline 571 190
+aline 666 238
+amove 190 571
+aline 95 380
+aline 0 238
+stroke
+dfont endchar
+dfont char=99
+amove 190 0
+aline 95 95
+aline 95 238
+aline 142 333
+aline 238 428
+amove 380 380
+aline 333 333
+aline 380 333
+aline 380 380
+aline 333 428
+aline 238 428
+aline 142 380
+aline 95 333
+aline 47 238
+aline 47 142
+aline 95 47
+aline 190 0
+aline 333 0
+aline 476 95
+aline 571 238
+stroke
+dfont endchar
+dfont char=100
+amove 190 0
+aline 95 95
+aline 95 238
+aline 142 333
+aline 238 428
+amove 476 285
+aline 428 380
+aline 333 428
+aline 238 428
+aline 142 380
+aline 95 333
+aline 47 238
+aline 47 142
+aline 95 47
+aline 190 0
+aline 285 0
+aline 380 47
+aline 428 142
+amove 523 0
+aline 476 47
+aline 476 142
+aline 761 1000
+amove 714 1000
+aline 428 142
+aline 428 47
+aline 523 0
+aline 619 47
+aline 666 95
+aline 761 238
+stroke
+dfont endchar
+dfont char=101
+amove 142 95
+aline 238 142
+aline 285 190
+aline 333 285
+aline 333 380
+aline 285 428
+aline 238 428
+aline 142 380
+aline 95 333
+aline 47 238
+aline 47 142
+aline 95 47
+aline 190 0
+aline 333 0
+aline 476 95
+aline 571 238
+amove 238 428
+aline 142 333
+aline 95 238
+aline 95 95
+aline 190 0
+stroke
+dfont endchar
+dfont char=102
+amove 142 428
+aline 285 571
+aline 380 714
+aline 428 857
+aline 428 952
+aline 380 1000
+aline 285 952
+aline 238 857
+aline -191 -429
+aline -191 -524
+aline -143 -572
+aline -48 -524
+aline 0 -381
+aline 47 47
+aline 95 0
+aline 190 0
+aline 285 47
+aline 333 95
+aline 428 238
+amove 238 857
+aline 190 619
+aline 142 428
+aline 0 0
+aline -96 -239
+aline -191 -429
+stroke
+dfont endchar
+dfont char=103
+amove 190 0
+aline 95 95
+aline 95 238
+aline 142 333
+aline 238 428
+amove 476 285
+aline 428 380
+aline 333 428
+aline 238 428
+aline 142 380
+aline 95 333
+aline 47 238
+aline 47 142
+aline 95 47
+aline 190 0
+aline 285 0
+aline 380 47
+aline 428 142
+amove 523 428
+aline 238 -429
+amove 761 238
+aline 666 95
+aline 523 0
+aline 333 -96
+aline 190 -191
+aline 95 -286
+aline 47 -429
+aline 47 -524
+aline 95 -572
+aline 190 -524
+aline 238 -429
+aline 333 -239
+aline 428 0
+aline 571 428
+stroke
+dfont endchar
+dfont char=104
+amove 0 0
+aline 333 1000
+amove 380 1000
+aline 47 0
+amove -1 238
+aline 95 380
+aline 190 571
+amove 380 428
+aline 428 380
+aline 428 285
+aline 380 142
+aline 380 47
+aline 476 0
+aline 571 47
+aline 619 95
+aline 714 238
+amove 476 0
+aline 428 47
+aline 428 142
+aline 476 285
+aline 476 380
+aline 380 428
+aline 333 428
+aline 238 380
+aline 142 285
+stroke
+dfont endchar
+dfont char=105
+amove 142 0
+aline 95 47
+aline 95 142
+aline 190 428
+amove 142 428
+aline 47 142
+aline 47 47
+aline 142 0
+aline 238 47
+aline 285 95
+aline 380 238
+amove 238 714
+aline 190 666
+aline 238 619
+aline 285 666
+aline 238 714
+stroke
+dfont endchar
+dfont char=106
+amove 238 714
+aline 190 666
+aline 238 619
+aline 285 666
+aline 238 714
+amove 142 428
+aline -143 -429
+amove 190 428
+aline 47 0
+aline -48 -239
+aline -143 -429
+aline -191 -524
+aline -286 -572
+aline -334 -524
+aline -334 -429
+aline -286 -286
+aline -191 -191
+aline -48 -96
+aline 142 -1
+aline 285 95
+aline 380 238
+stroke
+dfont endchar
+dfont char=107
+amove 0 0
+aline 333 1000
+amove 380 1000
+aline 47 0
+amove -1 238
+aline 95 380
+aline 190 571
+amove 428 428
+aline 428 380
+aline 476 380
+aline 428 428
+aline 380 428
+aline 285 333
+aline 142 285
+aline 285 238
+aline 333 47
+aline 380 0
+amove 142 285
+aline 238 238
+aline 285 47
+aline 380 0
+aline 428 0
+aline 571 95
+aline 666 238
+stroke
+dfont endchar
+dfont char=108
+amove 142 0
+aline 95 47
+aline 95 142
+aline 380 1000
+amove 333 1000
+aline 47 142
+aline 47 47
+aline 142 0
+aline 238 47
+aline 285 95
+aline 380 238
+amove 0 238
+aline 95 380
+aline 190 571
+stroke
+dfont endchar
+dfont char=109
+amove 0 238
+aline 95 380
+aline 190 428
+aline 285 380
+aline 285 285
+aline 190 0
+amove 190 428
+aline 238 380
+aline 238 285
+aline 142 0
+amove 285 285
+aline 380 380
+aline 476 428
+aline 523 428
+aline 619 380
+aline 619 285
+aline 523 0
+amove 523 428
+aline 571 380
+aline 571 285
+aline 476 0
+amove 619 285
+aline 714 380
+aline 809 428
+aline 857 428
+aline 952 380
+aline 952 285
+aline 904 142
+aline 904 47
+aline 952 0
+amove 857 428
+aline 904 380
+aline 904 285
+aline 857 142
+aline 857 47
+aline 952 0
+aline 1047 47
+aline 1095 95
+aline 1190 238
+stroke
+dfont endchar
+dfont char=110
+amove 0 238
+aline 95 380
+aline 190 428
+aline 285 380
+aline 285 285
+aline 190 0
+amove 190 428
+aline 238 380
+aline 238 285
+aline 142 0
+amove 285 285
+aline 380 380
+aline 476 428
+aline 523 428
+aline 619 380
+aline 619 285
+aline 571 142
+aline 571 47
+aline 619 0
+amove 523 428
+aline 571 380
+aline 571 285
+aline 523 142
+aline 523 47
+aline 619 0
+aline 714 47
+aline 761 95
+aline 857 238
+stroke
+dfont endchar
+dfont char=111
+amove 190 0
+aline 95 95
+aline 95 238
+aline 142 333
+aline 238 428
+amove 333 428
+aline 238 428
+aline 142 380
+aline 95 333
+aline 47 238
+aline 47 142
+aline 95 47
+aline 190 0
+aline 285 0
+aline 380 47
+aline 428 95
+aline 476 190
+aline 476 285
+aline 428 380
+aline 333 428
+aline 285 380
+aline 285 285
+aline 333 190
+aline 428 142
+aline 523 142
+aline 619 190
+aline 666 238
+stroke
+dfont endchar
+dfont char=112
+amove 0 238
+aline 95 380
+aline 190 571
+amove 238 714
+aline -191 -572
+amove -143 -572
+aline 285 714
+amove 380 428
+aline 428 380
+aline 428 285
+aline 380 142
+aline 380 47
+aline 476 0
+aline 571 47
+aline 619 95
+aline 714 238
+amove 476 0
+aline 428 47
+aline 428 142
+aline 476 285
+aline 476 380
+aline 380 428
+aline 333 428
+aline 238 380
+aline 142 285
+stroke
+dfont endchar
+dfont char=113
+amove 190 0
+aline 95 95
+aline 95 238
+aline 142 333
+aline 238 428
+amove 476 285
+aline 428 380
+aline 333 428
+aline 238 428
+aline 142 380
+aline 95 333
+aline 47 238
+aline 47 142
+aline 95 47
+aline 190 0
+aline 285 0
+aline 380 47
+amove 523 428
+aline 238 -429
+aline 238 -524
+aline 285 -572
+aline 380 -524
+aline 428 -381
+aline 428 0
+aline 523 0
+aline 666 95
+aline 761 238
+amove 571 428
+aline 428 0
+aline 333 -239
+aline 238 -429
+stroke
+dfont endchar
+dfont char=114
+amove 0 238
+aline 95 380
+aline 190 428
+aline 285 380
+aline 285 285
+aline 190 0
+amove 190 428
+aline 238 380
+aline 238 285
+aline 142 0
+amove 285 285
+aline 380 380
+aline 476 428
+aline 523 428
+aline 476 285
+amove 476 428
+aline 476 285
+aline 523 190
+aline 571 190
+aline 666 238
+stroke
+dfont endchar
+dfont char=115
+amove 0 238
+aline 95 380
+aline 142 476
+aline 142 380
+aline 285 285
+aline 333 190
+aline 333 95
+aline 285 47
+aline 190 0
+amove 142 380
+aline 238 285
+aline 285 190
+aline 285 95
+aline 190 0
+amove 0 47
+aline 95 0
+aline 333 0
+aline 476 95
+aline 571 238
+stroke
+dfont endchar
+dfont char=116
+amove 142 0
+aline 95 47
+aline 95 142
+aline 380 1000
+amove 333 1000
+aline 47 142
+aline 47 47
+aline 142 0
+aline 238 47
+aline 285 95
+aline 380 238
+amove 0 238
+aline 95 380
+aline 190 571
+amove 95 619
+aline 380 619
+stroke
+dfont endchar
+dfont char=117
+amove 142 0
+aline 95 47
+aline 95 142
+aline 190 428
+amove 142 428
+aline 47 142
+aline 47 47
+aline 142 0
+aline 190 0
+aline 285 47
+aline 380 142
+aline 476 285
+amove 523 428
+aline 428 142
+aline 428 47
+aline 523 0
+aline 619 47
+aline 666 95
+aline 761 238
+amove 571 428
+aline 476 142
+aline 476 47
+aline 523 0
+stroke
+dfont endchar
+dfont char=118
+amove 142 0
+aline 95 47
+aline 95 190
+aline 142 333
+aline 190 428
+amove 142 428
+aline 95 333
+aline 47 190
+aline 47 47
+aline 142 0
+aline 190 0
+aline 333 47
+aline 428 142
+aline 476 285
+aline 476 428
+aline 523 238
+aline 571 190
+aline 619 190
+aline 714 238
+stroke
+dfont endchar
+dfont char=119
+amove 142 0
+aline 95 47
+aline 95 190
+aline 142 333
+aline 238 428
+amove 190 428
+aline 95 333
+aline 47 190
+aline 47 47
+aline 142 0
+aline 190 0
+aline 285 47
+aline 380 142
+amove 476 0
+aline 428 47
+aline 428 142
+aline 523 428
+amove 476 428
+aline 380 142
+aline 380 47
+aline 476 0
+aline 523 0
+aline 619 47
+aline 714 142
+aline 761 285
+aline 761 428
+aline 809 238
+aline 857 190
+aline 904 190
+aline 1000 238
+stroke
+dfont endchar
+dfont char=120
+amove 47 47
+aline 95 95
+aline 47 95
+aline 47 47
+aline 95 0
+aline 142 0
+aline 238 47
+aline 285 142
+aline 333 285
+aline 333 380
+aline 285 428
+aline 190 428
+aline 95 380
+aline 0 238
+amove 285 142
+aline 333 47
+amove 333 142
+aline 238 47
+amove 333 285
+aline 428 380
+amove 333 380
+aline 380 285
+amove 619 380
+aline 571 333
+aline 619 333
+aline 619 380
+aline 571 428
+aline 523 428
+aline 428 380
+aline 380 285
+aline 333 142
+aline 333 47
+aline 380 0
+aline 523 0
+aline 666 95
+aline 761 238
+stroke
+dfont endchar
+dfont char=121
+amove 142 0
+aline 95 47
+aline 95 142
+aline 190 428
+amove 142 428
+aline 47 142
+aline 47 47
+aline 142 0
+aline 190 0
+aline 285 47
+aline 380 142
+aline 476 285
+amove 523 428
+aline 238 -429
+amove 761 238
+aline 666 95
+aline 523 -1
+aline 333 -96
+aline 190 -191
+aline 95 -286
+aline 47 -429
+aline 47 -524
+aline 95 -572
+aline 190 -524
+aline 238 -429
+aline 333 -239
+aline 428 -1
+aline 571 428
+stroke
+dfont endchar
+dfont char=122
+amove 95 0
+aline 190 47
+aline 333 142
+aline 380 238
+aline 380 380
+aline 285 428
+aline 190 428
+aline 95 380
+aline 0 238
+amove 95 0
+aline 190 -48
+aline 238 -143
+aline 238 -286
+aline 190 -429
+aline 95 -524
+aline 0 -572
+aline -48 -524
+aline -48 -429
+aline 0 -286
+aline 142 -143
+aline 285 -48
+aline 476 95
+aline 619 238
+amove 285 428
+aline 333 380
+aline 333 238
+aline 285 142
+aline 190 47
+amove 95 -1
+aline 142 -48
+aline 190 -143
+aline 190 -286
+aline 142 -429
+aline 95 -524
+stroke
+dfont endchar
+dfont char=123
+amove 380 238
+aline 333 95
+aline 333 -96
+aline 380 -239
+amove 476 -334
+aline 333 -191
+aline 285 -48
+aline 285 47
+aline 333 190
+aline 428 285
+aline 428 333
+aline 238 428
+aline 428 523
+aline 428 571
+aline 333 666
+aline 285 809
+aline 285 904
+aline 333 1047
+aline 476 1190
+amove 380 1095
+aline 333 952
+aline 333 761
+aline 380 619
+stroke
+dfont endchar
+dfont char=124
+amove 190 -334
+aline 190 1190
+aline 523 1190
+amove 238 1190
+aline 238 -334
+amove 190 -334
+aline 523 -334
+stroke
+dfont endchar
+dfont char=125
+amove 238 -334
+aline 380 -191
+aline 428 -48
+aline 428 47
+aline 380 190
+aline 285 285
+aline 285 333
+aline 476 428
+aline 285 523
+aline 285 571
+aline 380 666
+aline 428 809
+aline 428 904
+aline 380 1047
+aline 238 1190
+amove 333 1095
+aline 380 952
+aline 380 761
+aline 333 619
+amove 333 238
+aline 380 95
+aline 380 -96
+aline 333 -239
+stroke
+dfont endchar
+dfont char=126
+amove 285 1000
+aline 190 952
+aline 142 857
+aline 142 761
+aline 190 666
+aline 285 619
+aline 380 619
+aline 476 666
+aline 523 761
+aline 523 857
+aline 476 952
+aline 380 1000
+aline 285 1000
+stroke
+dfont endchar
diff --git a/src/fonts/pldr.afm b/src/fonts/pldr.afm
new file mode 100644
index 0000000..4e1ee7f
--- /dev/null
+++ b/src/fonts/pldr.afm
@@ -0,0 +1,115 @@
+StartFontMetrics 2.0
+Comment Made from HERSHEY font file using SPLITFONT.BAS
+FontName plDR
+EncodingScheme TEXENCODING
+FullName plDR
+FamilyName plDR
+Weight Medium
+ItalicAngle 0
+IsFixedPitch false
+UnderlinePosition -97
+UnderlineThickness 73
+FontBBox 0 -400 1001 1001
+CapHeight 729
+XHeight 151
+Descender -219
+Ascender 729
+StartCharMetrics 95
+C 32 ; WX 400 ; N C32 ; B 0 0 0 0 ;
+C 33 ; WX 351 ; N C33 ; B 133 0 233 700 ;
+C 34 ; WX 351 ; N C34 ; B 133 466 233 700 ;
+C 35 ; WX 300 ; N C35 ; B 0 0 0 0 ;
+C 36 ; WX 618 ; N C36 ; B 99 -133 532 833 ;
+C 37 ; WX 784 ; N C37 ; B 99 0 700 700 ;
+C 38 ; WX 300 ; N C38 ; B 0 0 0 0 ;
+C 39 ; WX 351 ; N C39 ; B 133 466 233 700 ;
+C 40 ; WX 451 ; N C40 ; B 99 -233 366 833 ;
+C 41 ; WX 451 ; N C41 ; B 99 -233 366 833 ;
+C 42 ; WX 585 ; N C42 ; B 133 466 500 700 ;
+C 43 ; WX 818 ; N C43 ; B 133 32 700 600 ;
+C 44 ; WX 351 ; N C44 ; B 133 -133 233 99 ;
+C 45 ; WX 818 ; N C45 ; B 133 299 700 333 ;
+C 46 ; WX 351 ; N C46 ; B 133 0 233 99 ;
+C 47 ; WX 751 ; N C47 ; B 66 -233 700 833 ;
+C 48 ; WX 651 ; N C48 ; B 99 0 566 700 ;
+C 49 ; WX 651 ; N C49 ; B 199 0 366 700 ;
+C 50 ; WX 651 ; N C50 ; B 99 0 566 700 ;
+C 51 ; WX 651 ; N C51 ; B 99 0 566 700 ;
+C 52 ; WX 651 ; N C52 ; B 99 0 600 700 ;
+C 53 ; WX 651 ; N C53 ; B 99 0 566 700 ;
+C 54 ; WX 651 ; N C54 ; B 133 0 566 700 ;
+C 55 ; WX 651 ; N C55 ; B 99 0 566 700 ;
+C 56 ; WX 651 ; N C56 ; B 99 0 566 700 ;
+C 57 ; WX 651 ; N C57 ; B 99 0 532 700 ;
+C 58 ; WX 351 ; N C58 ; B 133 0 233 466 ;
+C 59 ; WX 351 ; N C59 ; B 133 -133 233 466 ;
+C 60 ; WX 784 ; N C60 ; B 133 0 666 600 ;
+C 61 ; WX 818 ; N C61 ; B 133 166 700 466 ;
+C 62 ; WX 784 ; N C62 ; B 133 0 666 600 ;
+C 63 ; WX 618 ; N C63 ; B 99 0 532 700 ;
+C 64 ; WX 884 ; N C64 ; B 99 0 799 700 ;
+C 65 ; WX 651 ; N C65 ; B 66 0 600 700 ;
+C 66 ; WX 651 ; N C66 ; B 133 0 566 700 ;
+C 67 ; WX 685 ; N C67 ; B 99 0 600 700 ;
+C 68 ; WX 685 ; N C68 ; B 133 0 600 700 ;
+C 69 ; WX 618 ; N C69 ; B 133 0 532 700 ;
+C 70 ; WX 585 ; N C70 ; B 133 0 532 700 ;
+C 71 ; WX 685 ; N C71 ; B 99 0 600 700 ;
+C 72 ; WX 718 ; N C72 ; B 133 0 600 700 ;
+C 73 ; WX 284 ; N C73 ; B 133 0 166 700 ;
+C 74 ; WX 551 ; N C74 ; B 99 0 433 700 ;
+C 75 ; WX 685 ; N C75 ; B 133 0 600 700 ;
+C 76 ; WX 551 ; N C76 ; B 133 0 532 700 ;
+C 77 ; WX 784 ; N C77 ; B 133 0 666 700 ;
+C 78 ; WX 718 ; N C78 ; B 133 0 600 700 ;
+C 79 ; WX 718 ; N C79 ; B 99 0 633 700 ;
+C 80 ; WX 651 ; N C80 ; B 133 0 566 700 ;
+C 81 ; WX 718 ; N C81 ; B 99 -67 633 700 ;
+C 82 ; WX 651 ; N C82 ; B 133 0 566 700 ;
+C 83 ; WX 651 ; N C83 ; B 99 0 566 700 ;
+C 84 ; WX 551 ; N C84 ; B 66 0 500 700 ;
+C 85 ; WX 718 ; N C85 ; B 133 0 600 700 ;
+C 86 ; WX 651 ; N C86 ; B 66 0 600 700 ;
+C 87 ; WX 851 ; N C87 ; B 66 0 799 700 ;
+C 88 ; WX 651 ; N C88 ; B 99 0 566 700 ;
+C 89 ; WX 618 ; N C89 ; B 66 0 566 700 ;
+C 90 ; WX 651 ; N C90 ; B 99 0 566 700 ;
+C 91 ; WX 451 ; N C91 ; B 133 -233 366 833 ;
+C 92 ; WX 300 ; N C92 ; B 0 0 0 0 ;
+C 93 ; WX 451 ; N C93 ; B 99 -233 333 833 ;
+C 94 ; WX 300 ; N C94 ; B 0 0 0 0 ;
+C 95 ; WX 300 ; N C95 ; B 0 0 0 0 ;
+C 96 ; WX 318 ; N C96 ; B 133 500 199 700 ;
+C 97 ; WX 651 ; N C97 ; B 99 0 532 466 ;
+C 98 ; WX 651 ; N C98 ; B 133 0 566 700 ;
+C 99 ; WX 585 ; N C99 ; B 99 0 500 466 ;
+C 100 ; WX 651 ; N C100 ; B 99 0 532 700 ;
+C 101 ; WX 585 ; N C101 ; B 99 0 500 466 ;
+C 102 ; WX 451 ; N C102 ; B 99 0 366 700 ;
+C 103 ; WX 651 ; N C103 ; B 99 -233 532 466 ;
+C 104 ; WX 651 ; N C104 ; B 133 0 532 700 ;
+C 105 ; WX 284 ; N C105 ; B 99 0 199 700 ;
+C 106 ; WX 284 ; N C106 ; B 99 -233 199 700 ;
+C 107 ; WX 618 ; N C107 ; B 133 0 532 700 ;
+C 108 ; WX 284 ; N C108 ; B 133 0 166 700 ;
+C 109 ; WX 1018 ; N C109 ; B 133 0 899 466 ;
+C 110 ; WX 651 ; N C110 ; B 133 0 532 466 ;
+C 111 ; WX 618 ; N C111 ; B 99 0 532 466 ;
+C 112 ; WX 651 ; N C112 ; B 133 -233 566 466 ;
+C 113 ; WX 651 ; N C113 ; B 99 -233 532 466 ;
+C 114 ; WX 451 ; N C114 ; B 133 0 433 466 ;
+C 115 ; WX 551 ; N C115 ; B 99 0 466 466 ;
+C 116 ; WX 351 ; N C116 ; B 66 0 299 700 ;
+C 117 ; WX 651 ; N C117 ; B 133 0 532 466 ;
+C 118 ; WX 518 ; N C118 ; B 66 0 466 466 ;
+C 119 ; WX 784 ; N C119 ; B 99 0 700 466 ;
+C 120 ; WX 585 ; N C120 ; B 99 0 500 466 ;
+C 121 ; WX 518 ; N C121 ; B 66 -233 466 466 ;
+C 122 ; WX 585 ; N C122 ; B 99 0 500 466 ;
+C 123 ; WX 485 ; N C123 ; B 166 -233 333 833 ;
+C 124 ; WX 518 ; N C124 ; B 99 299 433 700 ;
+C 125 ; WX 485 ; N C125 ; B 166 -233 333 833 ;
+C 126 ; WX 818 ; N C126 ; B 99 0 733 700 ;
+EndCharMetrics
+
+EndFontMetrics
diff --git a/src/fonts/pldr.gle b/src/fonts/pldr.gle
new file mode 100644
index 0000000..070928f
--- /dev/null
+++ b/src/fonts/pldr.gle
@@ -0,0 +1,2254 @@
+dfont design= 1428
+dfont char=33
+amove 238 95
+aline 238 47
+aline 285 47
+aline 285 95
+aline 238 95
+amove 238 142
+aline 190 95
+aline 190 47
+aline 238 0
+aline 285 0
+aline 333 47
+aline 333 95
+aline 285 142
+aline 238 142
+amove 285 333
+aline 238 333
+aline 238 1000
+aline 285 1000
+aline 285 333
+stroke
+dfont endchar
+dfont char=34
+amove 190 666
+aline 285 714
+aline 333 809
+aline 333 952
+aline 285 1000
+aline 238 1000
+aline 190 952
+aline 190 904
+aline 238 857
+aline 285 857
+aline 333 904
+aline 285 714
+amove 333 809
+aline 285 857
+amove 238 952
+aline 238 904
+aline 285 904
+aline 285 952
+aline 238 952
+stroke
+dfont endchar
+stroke
+dfont endchar
+dfont char=36
+amove 238 142
+aline 285 95
+aline 380 47
+aline 523 47
+aline 666 95
+aline 714 190
+aline 714 285
+aline 666 380
+aline 619 428
+aline 238 619
+aline 190 666
+aline 142 761
+aline 142 857
+aline 238 952
+aline 380 1000
+aline 523 1000
+aline 666 952
+aline 761 857
+aline 666 857
+aline 619 904
+aline 523 952
+aline 380 952
+aline 238 904
+aline 190 857
+aline 190 761
+aline 238 666
+aline 619 476
+aline 714 380
+aline 761 285
+aline 761 190
+aline 714 95
+aline 666 47
+aline 523 0
+aline 380 0
+aline 238 47
+aline 142 142
+aline 238 142
+amove 571 47
+aline 714 142
+amove 476 -191
+aline 428 -191
+aline 428 1190
+aline 476 1190
+aline 476 -191
+stroke
+dfont endchar
+dfont char=37
+amove 142 0
+aline 1000 1000
+aline 904 952
+aline 761 904
+aline 619 904
+aline 476 952
+aline 380 1000
+aline 285 1000
+aline 190 952
+aline 142 857
+aline 142 761
+aline 238 666
+aline 333 666
+aline 428 714
+aline 476 809
+aline 476 904
+aline 380 1000
+amove 809 333
+aline 714 285
+aline 666 190
+aline 666 95
+aline 761 0
+aline 857 0
+aline 952 47
+aline 1000 142
+aline 1000 238
+aline 904 333
+aline 809 333
+stroke
+dfont endchar
+stroke
+dfont endchar
+dfont char=39
+amove 190 761
+aline 238 809
+aline 285 809
+aline 333 761
+aline 333 714
+aline 285 666
+aline 238 666
+aline 190 714
+aline 190 857
+aline 238 952
+aline 333 1000
+amove 238 952
+aline 190 761
+amove 238 761
+aline 238 714
+aline 285 714
+aline 285 761
+aline 238 761
+amove 238 809
+aline 190 857
+stroke
+dfont endchar
+dfont char=40
+amove 523 -334
+aline 476 -334
+aline 380 -239
+aline 285 -96
+aline 190 95
+aline 142 333
+aline 142 523
+aline 190 761
+aline 285 952
+aline 380 1095
+aline 476 1190
+aline 523 1190
+aline 428 1095
+aline 333 952
+aline 238 761
+aline 190 523
+aline 190 333
+aline 238 95
+aline 333 -96
+aline 428 -239
+aline 523 -334
+stroke
+dfont endchar
+dfont char=41
+amove 190 -334
+aline 142 -334
+aline 238 -239
+aline 333 -96
+aline 428 95
+aline 476 333
+aline 476 523
+aline 428 761
+aline 333 952
+aline 238 1095
+aline 142 1190
+aline 190 1190
+aline 285 1095
+aline 380 952
+aline 476 761
+aline 523 523
+aline 523 333
+aline 476 95
+aline 380 -96
+aline 285 -239
+aline 190 -334
+stroke
+dfont endchar
+dfont char=42
+amove 190 666
+aline 238 952
+amove 238 1000
+aline 190 952
+aline 190 666
+aline 285 952
+aline 238 1000
+amove 666 1000
+aline 619 952
+aline 619 666
+aline 666 952
+amove 666 1000
+aline 714 952
+aline 619 666
+stroke
+dfont endchar
+dfont char=43
+amove 190 476
+aline 1000 476
+aline 1000 428
+aline 190 428
+aline 190 476
+amove 571 857
+aline 571 47
+aline 619 47
+aline 619 857
+aline 571 857
+stroke
+dfont endchar
+dfont char=44
+amove 238 95
+aline 238 47
+aline 285 47
+aline 285 95
+aline 238 95
+amove 333 47
+aline 285 0
+aline 238 0
+aline 190 47
+aline 190 95
+aline 238 142
+aline 285 142
+aline 333 95
+aline 333 -48
+aline 285 -143
+aline 190 -191
+amove 285 -143
+aline 333 47
+amove 285 0
+aline 333 -48
+stroke
+dfont endchar
+dfont char=45
+amove 190 476
+aline 1000 476
+aline 1000 428
+aline 190 428
+aline 190 476
+stroke
+dfont endchar
+dfont char=46
+amove 238 95
+aline 238 47
+aline 285 47
+aline 285 95
+aline 238 95
+amove 238 142
+aline 190 95
+aline 190 47
+aline 238 0
+aline 285 0
+aline 333 47
+aline 333 95
+aline 285 142
+aline 238 142
+stroke
+dfont endchar
+dfont char=47
+amove 142 -334
+aline 95 -334
+aline 952 1190
+aline 1000 1190
+aline 142 -334
+stroke
+dfont endchar
+dfont char=48
+amove 428 1000
+aline 285 952
+aline 190 809
+aline 142 571
+aline 142 428
+aline 190 190
+aline 285 47
+aline 428 0
+aline 523 0
+aline 666 47
+aline 761 190
+aline 809 428
+aline 809 571
+aline 761 809
+aline 666 952
+aline 523 1000
+aline 428 1000
+amove 333 952
+aline 238 809
+aline 190 571
+aline 190 428
+aline 238 190
+aline 333 47
+amove 285 95
+aline 428 47
+aline 523 47
+aline 666 95
+amove 619 47
+aline 714 190
+aline 761 428
+aline 761 571
+aline 714 809
+aline 619 952
+amove 666 904
+aline 523 952
+aline 428 952
+aline 285 904
+stroke
+dfont endchar
+dfont char=49
+amove 523 0
+aline 523 1000
+aline 380 857
+aline 285 809
+aline 285 761
+aline 380 809
+aline 476 904
+aline 476 -1
+aline 523 -1
+stroke
+dfont endchar
+dfont char=50
+amove 142 0
+aline 571 476
+aline 666 619
+aline 714 714
+aline 714 809
+aline 666 904
+aline 571 952
+aline 380 952
+aline 285 904
+aline 238 809
+aline 238 761
+aline 190 761
+aline 190 809
+aline 238 904
+aline 285 952
+aline 380 1000
+aline 571 1000
+aline 666 952
+aline 714 904
+aline 761 809
+aline 761 714
+aline 714 619
+aline 619 476
+aline 190 0
+amove 142 0
+aline 809 0
+aline 809 47
+aline 190 47
+stroke
+dfont endchar
+dfont char=51
+amove 190 142
+aline 333 47
+amove 190 190
+aline 142 190
+aline 190 95
+aline 238 47
+aline 380 0
+aline 523 0
+aline 666 47
+aline 761 142
+aline 809 285
+aline 809 333
+aline 761 476
+aline 666 571
+aline 523 619
+aline 428 619
+amove 428 571
+aline 761 1000
+aline 238 1000
+aline 238 952
+aline 714 952
+amove 714 1000
+aline 380 571
+aline 523 571
+aline 666 523
+aline 761 380
+amove 761 238
+aline 666 95
+aline 523 47
+aline 380 47
+aline 238 95
+aline 190 190
+amove 571 47
+aline 714 142
+aline 761 285
+aline 761 333
+aline 714 476
+aline 571 571
+stroke
+dfont endchar
+dfont char=52
+amove 190 238
+aline 619 857
+aline 619 0
+aline 666 0
+aline 666 1000
+aline 142 238
+aline 857 238
+aline 857 285
+aline 190 285
+stroke
+dfont endchar
+dfont char=53
+amove 190 142
+aline 333 47
+amove 190 190
+aline 142 190
+aline 190 95
+aline 238 47
+aline 380 0
+aline 523 0
+aline 666 47
+aline 761 142
+aline 809 285
+aline 809 380
+aline 761 523
+aline 666 619
+aline 523 666
+aline 380 666
+aline 238 619
+aline 285 952
+aline 714 952
+aline 714 1000
+aline 238 1000
+aline 190 571
+aline 238 571
+aline 333 619
+aline 523 619
+aline 666 571
+aline 761 428
+amove 761 238
+aline 666 95
+aline 523 47
+aline 380 47
+aline 238 95
+aline 190 190
+amove 571 47
+aline 714 142
+aline 761 285
+aline 761 380
+aline 714 523
+aline 571 619
+stroke
+dfont endchar
+dfont char=54
+amove 238 238
+aline 333 95
+aline 476 47
+aline 523 47
+aline 666 95
+aline 761 238
+amove 761 380
+aline 666 523
+aline 523 571
+aline 476 571
+aline 333 523
+aline 238 380
+amove 238 333
+aline 285 476
+aline 428 571
+amove 571 571
+aline 714 476
+aline 761 333
+aline 761 285
+aline 714 142
+aline 571 47
+amove 428 47
+aline 285 142
+aline 238 333
+aline 238 571
+aline 285 809
+aline 380 952
+amove 333 904
+aline 476 952
+aline 571 952
+aline 714 904
+amove 666 952
+aline 714 857
+aline 761 857
+aline 714 952
+aline 571 1000
+aline 476 1000
+aline 333 952
+aline 238 809
+aline 190 571
+aline 190 333
+aline 238 142
+aline 333 47
+aline 476 0
+aline 523 0
+aline 666 47
+aline 761 142
+aline 809 285
+aline 809 333
+aline 761 476
+aline 666 571
+aline 523 619
+aline 476 619
+aline 333 571
+aline 238 476
+stroke
+dfont endchar
+dfont char=55
+amove 333 0
+aline 809 1000
+aline 142 1000
+aline 142 952
+aline 761 952
+amove 761 1000
+aline 285 0
+aline 333 0
+stroke
+dfont endchar
+dfont char=56
+amove 380 1000
+aline 238 952
+aline 190 857
+aline 190 761
+aline 238 666
+aline 285 619
+aline 380 571
+aline 571 523
+aline 666 476
+aline 714 428
+aline 761 333
+aline 761 190
+aline 714 95
+aline 571 47
+aline 380 47
+aline 238 95
+aline 190 190
+aline 190 333
+aline 238 428
+aline 285 476
+aline 380 523
+aline 571 571
+aline 666 619
+aline 714 666
+aline 761 761
+aline 761 857
+aline 714 952
+aline 571 1000
+aline 380 1000
+amove 285 952
+aline 238 857
+aline 238 761
+aline 285 666
+aline 380 619
+aline 571 571
+aline 666 523
+aline 761 428
+aline 809 333
+aline 809 190
+aline 761 95
+aline 714 47
+aline 571 0
+aline 380 0
+aline 238 47
+aline 190 95
+aline 142 190
+aline 142 333
+aline 190 428
+aline 285 523
+aline 380 571
+aline 571 619
+aline 666 666
+aline 714 761
+aline 714 857
+aline 666 952
+amove 714 904
+aline 571 952
+aline 380 952
+aline 238 904
+amove 190 142
+aline 333 47
+amove 619 47
+aline 761 142
+stroke
+dfont endchar
+dfont char=57
+amove 238 95
+aline 380 47
+aline 476 47
+aline 619 95
+amove 571 47
+aline 666 190
+aline 714 428
+aline 714 666
+aline 666 857
+aline 523 952
+amove 380 952
+aline 238 857
+aline 190 714
+aline 190 666
+aline 238 523
+aline 380 428
+amove 523 428
+aline 666 523
+aline 714 666
+amove 714 619
+aline 619 476
+aline 476 428
+aline 428 428
+aline 285 476
+aline 190 619
+amove 190 761
+aline 285 904
+aline 428 952
+aline 476 952
+aline 619 904
+aline 714 761
+amove 714 523
+aline 619 428
+aline 476 380
+aline 428 380
+aline 285 428
+aline 190 523
+aline 142 666
+aline 142 714
+aline 190 857
+aline 285 952
+aline 428 1000
+aline 476 1000
+aline 619 952
+aline 714 857
+aline 761 666
+aline 761 428
+aline 714 190
+aline 619 47
+aline 476 0
+aline 380 0
+aline 238 47
+aline 190 142
+aline 238 142
+aline 285 47
+stroke
+dfont endchar
+dfont char=58
+amove 238 95
+aline 238 47
+aline 285 47
+aline 285 95
+aline 238 95
+amove 238 142
+aline 190 95
+aline 190 47
+aline 238 0
+aline 285 0
+aline 333 47
+aline 333 95
+aline 285 142
+aline 238 142
+amove 238 619
+aline 238 571
+aline 285 571
+aline 285 619
+aline 238 619
+amove 238 666
+aline 190 619
+aline 190 571
+aline 238 523
+aline 285 523
+aline 333 571
+aline 333 619
+aline 285 666
+aline 238 666
+stroke
+dfont endchar
+dfont char=59
+amove 238 95
+aline 238 47
+aline 285 47
+aline 285 95
+aline 238 95
+amove 333 47
+aline 285 0
+aline 238 0
+aline 190 47
+aline 190 95
+aline 238 142
+aline 285 142
+aline 333 95
+aline 333 -48
+aline 285 -143
+aline 190 -191
+amove 285 -143
+aline 333 47
+amove 285 0
+aline 333 -48
+amove 238 619
+aline 238 571
+aline 285 571
+aline 285 619
+aline 238 619
+amove 238 666
+aline 190 619
+aline 190 571
+aline 238 523
+aline 285 523
+aline 333 571
+aline 333 619
+aline 285 666
+aline 238 666
+stroke
+dfont endchar
+dfont char=60
+amove 952 857
+aline 190 428
+aline 952 0
+stroke
+dfont endchar
+dfont char=61
+amove 190 285
+aline 1000 285
+aline 1000 238
+aline 190 238
+aline 190 285
+amove 190 666
+aline 1000 666
+aline 1000 619
+aline 190 619
+aline 190 666
+stroke
+dfont endchar
+dfont char=62
+amove 190 0
+aline 952 428
+aline 190 857
+stroke
+dfont endchar
+dfont char=63
+amove 428 95
+aline 428 47
+aline 476 47
+aline 476 95
+aline 428 95
+amove 428 142
+aline 380 95
+aline 380 47
+aline 428 0
+aline 476 0
+aline 523 47
+aline 523 95
+aline 476 142
+aline 428 142
+amove 428 476
+aline 571 523
+aline 666 571
+aline 714 619
+aline 761 714
+aline 761 809
+aline 714 904
+aline 666 952
+aline 523 1000
+aline 380 1000
+aline 238 952
+aline 190 904
+aline 142 809
+aline 142 761
+aline 190 761
+aline 190 809
+aline 238 904
+aline 380 952
+aline 523 952
+aline 666 904
+aline 714 809
+aline 714 714
+aline 666 619
+aline 571 571
+aline 428 523
+aline 428 333
+aline 476 333
+aline 476 523
+amove 523 523
+aline 714 666
+amove 714 857
+aline 571 952
+amove 333 952
+aline 190 857
+stroke
+dfont endchar
+dfont char=64
+amove 523 238
+aline 476 285
+aline 428 380
+aline 428 523
+aline 476 666
+aline 571 761
+amove 857 761
+aline 809 380
+aline 809 285
+aline 904 238
+aline 999 238
+aline 1095 333
+aline 1142 476
+aline 1142 571
+aline 1095 714
+aline 1047 809
+aline 952 904
+aline 857 952
+aline 714 1000
+aline 571 1000
+aline 428 952
+aline 333 904
+aline 238 809
+aline 190 714
+aline 142 571
+aline 142 428
+aline 190 285
+aline 238 190
+aline 333 95
+aline 428 47
+aline 571 0
+aline 714 0
+aline 857 47
+aline 952 95
+aline 1000 142
+amove 904 238
+aline 857 285
+aline 857 380
+aline 904 761
+amove 857 619
+aline 809 714
+aline 714 761
+aline 571 761
+aline 476 714
+aline 428 666
+aline 380 523
+aline 380 380
+aline 428 285
+aline 523 238
+aline 666 238
+aline 761 285
+aline 809 380
+stroke
+dfont endchar
+dfont char=65
+amove 95 0
+aline 142 0
+aline 476 857
+aline 809 0
+aline 857 0
+aline 476 1000
+aline 95 0
+amove 190 238
+aline 761 238
+amove 714 285
+aline 238 285
+stroke
+dfont endchar
+dfont char=66
+amove 190 0
+aline 190 1000
+aline 571 1000
+aline 714 952
+aline 761 904
+aline 809 809
+aline 809 666
+aline 761 571
+aline 714 523
+aline 571 476
+amove 571 523
+aline 714 571
+aline 761 666
+aline 761 809
+aline 714 904
+aline 571 952
+aline 238 952
+aline 238 47
+aline 571 47
+aline 714 95
+aline 761 190
+aline 761 333
+aline 714 428
+aline 571 476
+aline 238 476
+amove 238 523
+aline 571 523
+aline 714 476
+aline 761 428
+aline 809 333
+aline 809 190
+aline 761 95
+aline 714 47
+aline 571 -1
+aline 190 -1
+stroke
+dfont endchar
+dfont char=67
+amove 857 238
+aline 809 142
+aline 714 47
+aline 619 -1
+aline 428 -1
+aline 333 47
+aline 238 142
+aline 190 238
+aline 142 380
+aline 142 619
+aline 190 761
+aline 238 857
+aline 333 952
+aline 428 1000
+aline 619 1000
+aline 714 952
+aline 809 857
+aline 857 761
+aline 809 761
+aline 761 857
+aline 714 904
+aline 619 952
+aline 428 952
+aline 333 904
+aline 238 761
+aline 190 619
+aline 190 380
+aline 238 238
+aline 333 95
+aline 428 47
+aline 619 47
+aline 714 95
+aline 761 142
+aline 809 238
+aline 857 238
+stroke
+dfont endchar
+dfont char=68
+amove 190 0
+aline 190 1000
+aline 523 1000
+aline 666 952
+aline 761 857
+aline 809 761
+aline 857 619
+aline 857 380
+aline 809 238
+aline 761 142
+aline 666 47
+aline 523 0
+aline 190 0
+amove 238 47
+aline 238 952
+aline 523 952
+aline 666 904
+aline 714 857
+aline 761 761
+aline 809 619
+aline 809 380
+aline 761 238
+aline 714 142
+aline 666 95
+aline 523 47
+aline 238 47
+stroke
+dfont endchar
+dfont char=69
+amove 190 0
+aline 190 1000
+aline 761 1000
+aline 761 952
+aline 238 952
+aline 238 47
+aline 761 47
+aline 761 -1
+aline 190 -1
+amove 238 476
+aline 523 476
+aline 523 523
+aline 238 523
+stroke
+dfont endchar
+dfont char=70
+amove 190 0
+aline 190 1000
+aline 761 1000
+aline 761 952
+aline 238 952
+aline 238 0
+aline 190 0
+amove 238 476
+aline 523 476
+aline 523 523
+aline 238 523
+stroke
+dfont endchar
+dfont char=71
+amove 619 428
+aline 857 428
+aline 857 238
+aline 809 142
+aline 714 47
+aline 619 0
+aline 428 0
+aline 333 47
+aline 238 142
+aline 190 238
+aline 142 380
+aline 142 619
+aline 190 761
+aline 238 857
+aline 333 952
+aline 428 1000
+aline 619 1000
+aline 714 952
+aline 809 857
+aline 857 761
+aline 809 761
+aline 761 857
+aline 714 904
+aline 619 952
+aline 428 952
+aline 333 904
+aline 285 857
+aline 238 761
+aline 190 619
+aline 190 380
+aline 238 238
+aline 285 142
+aline 333 95
+aline 428 47
+aline 619 47
+aline 714 95
+aline 761 142
+aline 809 238
+aline 809 380
+aline 619 380
+aline 619 428
+stroke
+dfont endchar
+dfont char=72
+amove 190 0
+aline 190 1000
+aline 238 1000
+aline 238 0
+aline 190 0
+amove 238 476
+aline 809 476
+amove 809 523
+aline 238 523
+amove 857 1000
+aline 809 1000
+aline 809 0
+aline 857 0
+aline 857 1000
+stroke
+dfont endchar
+dfont char=73
+amove 238 0
+aline 190 0
+aline 190 1000
+aline 238 1000
+aline 238 0
+stroke
+dfont endchar
+dfont char=74
+amove 142 238
+aline 190 238
+aline 238 95
+aline 333 47
+aline 428 47
+aline 523 95
+aline 571 238
+aline 571 1000
+aline 619 1000
+aline 619 238
+aline 571 95
+aline 523 47
+aline 428 -1
+aline 333 -1
+aline 238 47
+aline 190 95
+aline 142 238
+stroke
+dfont endchar
+dfont char=75
+amove 238 0
+aline 190 0
+aline 190 1000
+aline 238 1000
+aline 238 0
+amove 238 380
+aline 857 1000
+aline 809 1000
+aline 238 428
+amove 380 571
+aline 809 0
+aline 857 0
+aline 428 571
+stroke
+dfont endchar
+dfont char=76
+amove 190 0
+aline 190 1000
+aline 238 1000
+aline 238 47
+aline 761 47
+aline 761 0
+aline 190 0
+stroke
+dfont endchar
+dfont char=77
+amove 190 0
+aline 238 0
+aline 238 761
+aline 571 0
+aline 904 761
+aline 904 0
+aline 952 0
+aline 952 1000
+aline 571 142
+aline 190 1000
+aline 190 0
+stroke
+dfont endchar
+dfont char=78
+amove 190 0
+aline 190 1000
+aline 809 142
+aline 809 1000
+aline 857 1000
+aline 857 0
+aline 238 857
+aline 238 0
+aline 190 0
+stroke
+dfont endchar
+dfont char=79
+amove 428 1000
+aline 333 952
+aline 238 857
+aline 190 761
+aline 142 619
+aline 142 380
+aline 190 238
+aline 238 142
+aline 333 47
+aline 428 0
+aline 619 0
+aline 714 47
+aline 809 142
+aline 857 238
+aline 904 380
+aline 904 619
+aline 857 761
+aline 809 857
+aline 714 952
+aline 619 1000
+aline 428 1000
+amove 476 952
+aline 333 904
+aline 238 761
+aline 190 619
+aline 190 380
+aline 238 238
+aline 333 95
+aline 476 47
+aline 571 47
+aline 714 95
+aline 809 238
+aline 857 380
+aline 857 619
+aline 809 761
+aline 714 904
+aline 571 952
+aline 476 952
+stroke
+dfont endchar
+dfont char=80
+amove 190 0
+aline 190 1000
+aline 619 1000
+aline 714 952
+aline 761 904
+aline 809 809
+aline 809 666
+aline 761 571
+aline 714 523
+aline 619 476
+aline 238 476
+amove 238 523
+aline 619 523
+aline 714 571
+aline 761 666
+aline 761 809
+aline 714 904
+aline 619 952
+aline 238 952
+aline 238 0
+aline 190 0
+stroke
+dfont endchar
+dfont char=81
+amove 571 142
+aline 809 -96
+aline 857 -96
+aline 619 142
+aline 571 142
+amove 476 952
+aline 333 904
+aline 238 761
+aline 190 619
+aline 190 380
+aline 238 238
+aline 333 95
+aline 476 47
+aline 571 47
+aline 714 95
+aline 809 238
+aline 857 380
+aline 857 619
+aline 809 761
+aline 714 904
+aline 571 952
+aline 476 952
+amove 428 1000
+aline 333 952
+aline 238 857
+aline 190 761
+aline 142 619
+aline 142 380
+aline 190 238
+aline 238 142
+aline 333 47
+aline 428 0
+aline 619 0
+aline 714 47
+aline 809 142
+aline 857 238
+aline 904 380
+aline 904 619
+aline 857 761
+aline 809 857
+aline 714 952
+aline 619 1000
+aline 428 1000
+stroke
+dfont endchar
+dfont char=82
+amove 190 0
+aline 190 1000
+aline 571 1000
+aline 714 952
+aline 761 904
+aline 809 809
+aline 809 666
+aline 761 571
+aline 714 523
+aline 571 476
+aline 238 476
+amove 238 523
+aline 571 523
+aline 714 571
+aline 761 666
+aline 761 809
+aline 714 904
+aline 571 952
+aline 238 952
+aline 238 0
+aline 190 0
+amove 476 476
+aline 761 0
+aline 809 0
+aline 523 476
+stroke
+dfont endchar
+dfont char=83
+amove 142 142
+aline 238 142
+aline 285 95
+aline 380 47
+aline 571 47
+aline 714 95
+aline 761 142
+aline 761 285
+aline 714 380
+aline 666 428
+aline 571 476
+aline 333 571
+aline 238 619
+aline 190 666
+aline 142 761
+aline 142 857
+aline 238 952
+aline 380 1000
+aline 571 1000
+aline 714 952
+aline 809 857
+aline 714 857
+aline 666 904
+aline 571 952
+aline 380 952
+aline 238 904
+aline 190 857
+aline 190 761
+aline 238 666
+aline 333 619
+aline 571 523
+aline 666 476
+aline 761 380
+aline 809 285
+aline 809 142
+aline 714 47
+aline 571 0
+aline 380 0
+aline 238 47
+aline 142 142
+stroke
+dfont endchar
+dfont char=84
+amove 380 0
+aline 380 952
+amove 428 952
+aline 428 0
+aline 380 0
+amove 714 952
+aline 714 1000
+aline 95 1000
+aline 95 952
+aline 714 952
+stroke
+dfont endchar
+dfont char=85
+amove 190 1000
+aline 190 285
+aline 238 142
+aline 333 47
+aline 476 0
+aline 571 0
+aline 714 47
+aline 809 142
+aline 857 285
+aline 857 1000
+aline 809 1000
+aline 809 285
+aline 761 142
+aline 714 95
+aline 571 47
+aline 476 47
+aline 333 95
+aline 285 142
+aline 238 285
+aline 238 1000
+aline 190 1000
+stroke
+dfont endchar
+dfont char=86
+amove 476 0
+aline 95 1000
+aline 142 1000
+aline 476 142
+aline 809 1000
+aline 857 1000
+aline 476 0
+stroke
+dfont endchar
+dfont char=87
+amove 380 0
+aline 95 1000
+aline 142 1000
+aline 380 142
+aline 619 1000
+aline 857 142
+aline 1095 1000
+aline 1142 1000
+aline 857 0
+aline 619 857
+aline 380 0
+stroke
+dfont endchar
+dfont char=88
+amove 142 0
+aline 761 1000
+aline 809 1000
+aline 190 0
+aline 142 0
+amove 809 0
+aline 761 0
+aline 142 1000
+aline 190 1000
+aline 809 0
+stroke
+dfont endchar
+dfont char=89
+amove 476 0
+aline 428 0
+aline 428 523
+aline 95 1000
+aline 142 1000
+aline 476 523
+amove 428 523
+aline 761 1000
+aline 809 1000
+aline 476 523
+aline 476 0
+stroke
+dfont endchar
+dfont char=90
+amove 142 0
+aline 761 1000
+amove 809 1000
+aline 190 0
+amove 142 0
+aline 809 0
+aline 809 47
+aline 190 47
+amove 142 1000
+aline 809 1000
+amove 761 952
+aline 142 952
+aline 142 1000
+stroke
+dfont endchar
+dfont char=91
+amove 190 -334
+aline 190 1190
+aline 523 1190
+amove 238 1190
+aline 238 -334
+amove 190 -334
+aline 523 -334
+stroke
+dfont endchar
+stroke
+dfont endchar
+dfont char=93
+amove 142 -334
+aline 476 -334
+aline 476 1190
+aline 142 1190
+amove 428 1190
+aline 428 -334
+stroke
+dfont endchar
+stroke
+dfont endchar
+stroke
+dfont endchar
+dfont char=96
+amove 238 904
+aline 285 952
+aline 238 1000
+aline 190 952
+aline 190 857
+aline 238 761
+aline 285 714
+stroke
+dfont endchar
+dfont char=97
+amove 714 142
+aline 619 47
+aline 523 0
+aline 380 0
+aline 285 47
+aline 190 142
+aline 142 285
+aline 142 380
+aline 190 523
+aline 285 619
+aline 380 666
+aline 523 666
+aline 619 619
+aline 714 523
+aline 523 619
+aline 380 619
+aline 285 571
+aline 238 523
+aline 190 380
+aline 190 285
+aline 238 142
+aline 285 95
+aline 380 47
+aline 523 47
+aline 714 142
+amove 761 0
+aline 714 0
+aline 714 666
+aline 761 666
+aline 761 0
+stroke
+dfont endchar
+dfont char=98
+amove 238 0
+aline 190 0
+aline 190 1000
+aline 238 1000
+aline 238 0
+amove 238 142
+aline 333 47
+aline 428 0
+aline 571 0
+aline 666 47
+aline 761 142
+aline 809 285
+aline 809 380
+aline 761 523
+aline 666 619
+aline 571 666
+aline 428 666
+aline 333 619
+aline 238 523
+aline 428 619
+aline 571 619
+aline 666 571
+aline 714 523
+aline 761 380
+aline 761 285
+aline 714 142
+aline 666 95
+aline 571 47
+aline 428 47
+aline 238 142
+stroke
+dfont endchar
+dfont char=99
+amove 714 142
+aline 619 47
+aline 523 0
+aline 380 0
+aline 285 47
+aline 190 142
+aline 142 285
+aline 142 380
+aline 190 523
+aline 285 619
+aline 380 666
+aline 523 666
+aline 619 619
+aline 714 523
+aline 666 476
+aline 619 571
+aline 523 619
+aline 380 619
+aline 285 571
+aline 238 523
+aline 190 380
+aline 190 285
+aline 238 142
+aline 285 95
+aline 380 47
+aline 523 47
+aline 619 95
+aline 666 190
+aline 714 142
+stroke
+dfont endchar
+dfont char=100
+amove 714 142
+aline 619 47
+aline 523 0
+aline 380 0
+aline 285 47
+aline 190 142
+aline 142 285
+aline 142 380
+aline 190 523
+aline 285 619
+aline 380 666
+aline 523 666
+aline 619 619
+aline 714 523
+aline 523 619
+aline 380 619
+aline 285 571
+aline 238 523
+aline 190 380
+aline 190 285
+aline 238 142
+aline 285 95
+aline 380 47
+aline 523 47
+aline 714 142
+amove 761 0
+aline 714 0
+aline 714 1000
+aline 761 1000
+aline 761 0
+stroke
+dfont endchar
+dfont char=101
+amove 190 333
+aline 714 333
+aline 714 476
+aline 666 571
+aline 619 619
+aline 523 666
+aline 380 666
+aline 285 619
+aline 190 523
+aline 142 380
+aline 142 285
+aline 190 142
+aline 285 47
+aline 380 0
+aline 523 0
+aline 619 47
+aline 714 142
+aline 666 190
+aline 619 95
+aline 523 47
+aline 380 47
+aline 285 95
+aline 238 142
+aline 190 285
+aline 190 380
+aline 238 523
+aline 285 571
+aline 380 619
+aline 523 619
+aline 619 571
+aline 666 476
+aline 666 380
+aline 190 380
+stroke
+dfont endchar
+dfont char=102
+amove 333 0
+aline 285 0
+aline 285 809
+aline 333 952
+aline 428 1000
+aline 523 1000
+aline 523 952
+aline 428 952
+aline 333 904
+amove 380 952
+aline 333 809
+aline 333 0
+amove 476 619
+aline 476 666
+aline 142 666
+aline 142 619
+aline 476 619
+stroke
+dfont endchar
+dfont char=103
+amove 190 -191
+aline 285 -191
+aline 333 -239
+aline 428 -286
+aline 523 -286
+aline 619 -239
+aline 666 -191
+aline 714 -48
+aline 714 666
+aline 761 666
+aline 761 -48
+aline 714 -191
+aline 619 -286
+aline 523 -334
+aline 380 -334
+aline 285 -286
+aline 190 -191
+amove 714 142
+aline 619 47
+aline 523 -1
+aline 380 -1
+aline 285 47
+aline 190 142
+aline 142 285
+aline 142 380
+aline 190 523
+aline 285 619
+aline 380 666
+aline 523 666
+aline 619 619
+aline 714 523
+aline 523 619
+aline 380 619
+aline 285 571
+aline 238 523
+aline 190 380
+aline 190 285
+aline 238 142
+aline 285 95
+aline 380 47
+aline 523 47
+aline 714 142
+stroke
+dfont endchar
+dfont char=104
+amove 238 0
+aline 190 0
+aline 190 1000
+aline 238 1000
+aline 238 0
+amove 238 476
+aline 380 619
+aline 476 666
+aline 619 666
+aline 714 619
+aline 761 476
+aline 761 0
+aline 714 0
+aline 714 476
+aline 666 571
+aline 571 619
+aline 476 619
+aline 380 571
+aline 238 476
+stroke
+dfont endchar
+dfont char=105
+amove 238 0
+aline 190 0
+aline 190 666
+aline 238 666
+aline 238 0
+amove 190 952
+aline 190 904
+aline 238 904
+aline 238 952
+aline 190 952
+amove 190 1000
+aline 142 952
+aline 142 904
+aline 190 857
+aline 238 857
+aline 285 904
+aline 285 952
+aline 238 1000
+aline 190 1000
+stroke
+dfont endchar
+dfont char=106
+amove 238 -334
+aline 190 -334
+aline 190 666
+aline 238 666
+aline 238 -334
+amove 190 952
+aline 190 904
+aline 238 904
+aline 238 952
+aline 190 952
+amove 190 1000
+aline 142 952
+aline 142 904
+aline 190 857
+aline 238 857
+aline 285 904
+aline 285 952
+aline 238 1000
+aline 190 1000
+stroke
+dfont endchar
+dfont char=107
+amove 238 0
+aline 190 0
+aline 190 1000
+aline 238 1000
+aline 238 0
+amove 238 142
+aline 761 666
+aline 714 666
+aline 238 190
+amove 380 333
+aline 666 0
+aline 761 0
+aline 428 380
+stroke
+dfont endchar
+dfont char=108
+amove 238 0
+aline 190 0
+aline 190 1000
+aline 238 1000
+aline 238 0
+stroke
+dfont endchar
+dfont char=109
+amove 238 0
+aline 190 0
+aline 190 666
+aline 238 666
+aline 238 0
+amove 238 476
+aline 380 619
+aline 476 666
+aline 619 666
+aline 714 619
+aline 761 476
+aline 761 0
+aline 714 0
+aline 714 476
+aline 666 571
+aline 571 619
+aline 476 619
+aline 380 571
+aline 238 476
+amove 761 476
+aline 904 619
+aline 999 666
+aline 1142 666
+aline 1238 619
+aline 1285 476
+aline 1285 0
+aline 1238 0
+aline 1238 476
+aline 1190 571
+aline 1095 619
+aline 1000 619
+aline 904 571
+aline 761 476
+stroke
+dfont endchar
+dfont char=110
+amove 238 0
+aline 190 0
+aline 190 666
+aline 238 666
+aline 238 0
+amove 238 476
+aline 380 619
+aline 476 666
+aline 619 666
+aline 714 619
+aline 761 476
+aline 761 0
+aline 714 0
+aline 714 476
+aline 666 571
+aline 571 619
+aline 476 619
+aline 380 571
+aline 238 476
+stroke
+dfont endchar
+dfont char=111
+amove 380 619
+aline 285 571
+aline 238 523
+aline 190 380
+aline 190 285
+aline 238 142
+aline 285 95
+aline 380 47
+aline 523 47
+aline 619 95
+aline 666 142
+aline 714 285
+aline 714 380
+aline 666 523
+aline 619 571
+aline 523 619
+aline 380 619
+amove 380 666
+aline 285 619
+aline 190 523
+aline 142 380
+aline 142 285
+aline 190 142
+aline 285 47
+aline 380 0
+aline 523 0
+aline 619 47
+aline 714 142
+aline 761 285
+aline 761 380
+aline 714 523
+aline 619 619
+aline 523 666
+aline 380 666
+stroke
+dfont endchar
+dfont char=112
+amove 238 142
+aline 333 47
+aline 428 0
+aline 571 0
+aline 666 47
+aline 761 142
+aline 809 285
+aline 809 380
+aline 761 523
+aline 666 619
+aline 571 666
+aline 428 666
+aline 333 619
+aline 238 523
+aline 428 619
+aline 571 619
+aline 666 571
+aline 714 523
+aline 761 380
+aline 761 285
+aline 714 142
+aline 666 95
+aline 571 47
+aline 428 47
+aline 238 142
+amove 238 -334
+aline 190 -334
+aline 190 666
+aline 238 666
+aline 238 -334
+stroke
+dfont endchar
+dfont char=113
+amove 714 142
+aline 619 47
+aline 523 0
+aline 380 0
+aline 285 47
+aline 190 142
+aline 142 285
+aline 142 380
+aline 190 523
+aline 285 619
+aline 380 666
+aline 523 666
+aline 619 619
+aline 714 523
+aline 523 619
+aline 380 619
+aline 285 571
+aline 238 523
+aline 190 380
+aline 190 285
+aline 238 142
+aline 285 95
+aline 380 47
+aline 523 47
+aline 714 142
+amove 761 -334
+aline 714 -334
+aline 714 666
+aline 761 666
+aline 761 -334
+stroke
+dfont endchar
+dfont char=114
+amove 238 0
+aline 190 0
+aline 190 666
+aline 238 666
+aline 238 0
+amove 238 380
+aline 285 523
+aline 380 619
+aline 476 666
+aline 619 666
+aline 619 619
+aline 476 619
+aline 380 571
+aline 285 476
+aline 238 380
+stroke
+dfont endchar
+dfont char=115
+amove 142 142
+aline 190 142
+aline 238 47
+amove 190 95
+aline 333 47
+aline 476 47
+aline 619 95
+amove 571 47
+aline 619 142
+aline 619 190
+aline 571 285
+amove 619 238
+aline 523 285
+aline 285 380
+aline 190 428
+aline 142 523
+aline 190 619
+aline 333 666
+aline 476 666
+aline 619 619
+aline 666 523
+aline 619 523
+aline 571 619
+amove 619 571
+aline 476 619
+aline 333 619
+aline 190 571
+amove 238 619
+aline 190 523
+aline 238 428
+amove 190 476
+aline 285 428
+aline 523 333
+aline 619 285
+aline 666 190
+aline 666 142
+aline 619 47
+aline 476 0
+aline 333 0
+aline 190 47
+aline 142 142
+stroke
+dfont endchar
+dfont char=116
+amove 285 0
+aline 238 0
+aline 238 1000
+aline 285 1000
+aline 285 0
+amove 428 619
+aline 428 666
+aline 95 666
+aline 95 619
+aline 428 619
+stroke
+dfont endchar
+dfont char=117
+amove 190 666
+aline 190 190
+aline 238 47
+aline 333 -1
+aline 476 -1
+aline 571 47
+aline 714 190
+aline 571 95
+aline 476 47
+aline 380 47
+aline 285 95
+aline 238 190
+aline 238 666
+aline 190 666
+amove 714 666
+aline 714 0
+aline 761 0
+aline 761 666
+aline 714 666
+stroke
+dfont endchar
+dfont char=118
+amove 380 0
+aline 95 666
+aline 142 666
+aline 380 95
+aline 619 666
+aline 666 666
+aline 380 0
+stroke
+dfont endchar
+dfont char=119
+amove 380 0
+aline 142 666
+aline 190 666
+aline 380 142
+aline 571 666
+aline 761 142
+aline 952 666
+aline 1000 666
+aline 761 0
+aline 571 523
+aline 380 0
+stroke
+dfont endchar
+dfont char=120
+amove 142 0
+aline 666 666
+aline 714 666
+aline 190 0
+aline 142 0
+amove 714 0
+aline 666 0
+aline 142 666
+aline 190 666
+aline 714 0
+stroke
+dfont endchar
+dfont char=121
+amove 380 0
+aline 95 666
+aline 142 666
+aline 380 95
+amove 190 -334
+aline 380 95
+aline 619 666
+aline 666 666
+aline 380 0
+aline 238 -334
+aline 190 -334
+stroke
+dfont endchar
+dfont char=122
+amove 142 0
+aline 619 619
+aline 142 619
+aline 142 666
+aline 714 666
+aline 238 47
+aline 714 47
+aline 714 0
+aline 142 0
+stroke
+dfont endchar
+dfont char=123
+amove 380 238
+aline 333 95
+aline 333 -96
+aline 380 -239
+amove 476 -334
+aline 333 -191
+aline 285 -48
+aline 285 47
+aline 333 190
+aline 428 285
+aline 428 333
+aline 238 428
+aline 428 523
+aline 428 571
+aline 333 666
+aline 285 809
+aline 285 904
+aline 333 1047
+aline 476 1190
+amove 380 1095
+aline 333 952
+aline 333 761
+aline 380 619
+stroke
+dfont endchar
+dfont char=124
+amove 380 428
+aline 380 1000
+aline 333 952
+aline 428 476
+aline 380 428
+aline 333 476
+aline 428 952
+aline 380 1000
+amove 142 857
+aline 619 571
+aline 571 571
+aline 190 857
+aline 142 857
+aline 142 809
+aline 619 619
+aline 619 571
+amove 619 857
+aline 142 571
+aline 190 571
+aline 571 857
+aline 619 857
+aline 619 809
+aline 142 619
+aline 142 571
+stroke
+dfont endchar
+dfont char=125
+amove 238 -334
+aline 380 -191
+aline 428 -48
+aline 428 47
+aline 380 190
+aline 285 285
+aline 285 333
+aline 476 428
+aline 285 523
+aline 285 571
+aline 380 666
+aline 428 809
+aline 428 904
+aline 380 1047
+aline 238 1190
+amove 333 1095
+aline 380 952
+aline 380 761
+aline 333 619
+amove 333 238
+aline 380 95
+aline 380 -96
+aline 333 -239
+stroke
+dfont endchar
+dfont char=126
+amove 380 904
+aline 476 952
+aline 523 952
+aline 619 904
+amove 571 952
+aline 619 857
+aline 619 761
+aline 571 666
+aline 523 619
+aline 285 476
+aline 190 380
+aline 142 285
+aline 142 190
+aline 190 95
+aline 238 47
+aline 333 0
+aline 523 0
+aline 619 47
+aline 714 142
+aline 761 238
+aline 857 523
+aline 904 619
+amove 857 571
+aline 952 619
+aline 1047 619
+aline 1047 666
+aline 952 666
+aline 857 619
+aline 809 523
+aline 714 238
+aline 666 142
+aline 619 95
+aline 523 47
+aline 333 47
+aline 238 95
+aline 190 190
+aline 190 285
+aline 238 380
+aline 285 428
+aline 523 571
+aline 619 666
+aline 666 761
+aline 666 857
+aline 619 952
+aline 523 1000
+aline 476 1000
+aline 380 952
+aline 333 857
+aline 333 761
+aline 380 619
+aline 476 476
+aline 714 190
+aline 857 47
+aline 952 0
+aline 1047 0
+aline 1047 47
+aline 952 47
+aline 857 95
+aline 761 190
+aline 523 476
+aline 428 619
+aline 380 761
+aline 380 857
+aline 428 952
+stroke
+dfont endchar
diff --git a/src/fonts/plge.afm b/src/fonts/plge.afm
new file mode 100644
index 0000000..1f8a398
--- /dev/null
+++ b/src/fonts/plge.afm
@@ -0,0 +1,115 @@
+StartFontMetrics 2.0
+Comment Made from HERSHEY font file using SPLITFONT.BAS
+FontName plGE
+EncodingScheme TEXENCODING
+FullName plGE
+FamilyName plGE
+Weight Medium
+ItalicAngle 0
+IsFixedPitch false
+UnderlinePosition -97
+UnderlineThickness 73
+FontBBox 0 -400 1001 1001
+CapHeight 729
+XHeight 151
+Descender -219
+Ascender 729
+StartCharMetrics 95
+C 32 ; WX 400 ; N C32 ; B 0 0 0 0 ;
+C 33 ; WX 384 ; N C33 ; B 99 0 299 700 ;
+C 34 ; WX 384 ; N C34 ; B 133 466 233 700 ;
+C 35 ; WX 300 ; N C35 ; B 0 0 0 0 ;
+C 36 ; WX 651 ; N C36 ; B 99 -133 566 833 ;
+C 37 ; WX 784 ; N C37 ; B 99 0 700 700 ;
+C 38 ; WX 300 ; N C38 ; B 0 0 0 0 ;
+C 39 ; WX 384 ; N C39 ; B 166 466 266 700 ;
+C 40 ; WX 451 ; N C40 ; B 99 -233 333 833 ;
+C 41 ; WX 451 ; N C41 ; B 133 -233 366 833 ;
+C 42 ; WX 585 ; N C42 ; B 133 466 500 700 ;
+C 43 ; WX 818 ; N C43 ; B 133 32 700 600 ;
+C 44 ; WX 384 ; N C44 ; B 133 -133 233 99 ;
+C 45 ; WX 818 ; N C45 ; B 133 299 700 333 ;
+C 46 ; WX 384 ; N C46 ; B 133 0 266 99 ;
+C 47 ; WX 751 ; N C47 ; B 66 -233 700 833 ;
+C 48 ; WX 651 ; N C48 ; B 66 0 600 700 ;
+C 49 ; WX 651 ; N C49 ; B 233 0 466 700 ;
+C 50 ; WX 651 ; N C50 ; B 99 0 600 700 ;
+C 51 ; WX 651 ; N C51 ; B 99 0 532 700 ;
+C 52 ; WX 651 ; N C52 ; B 99 0 633 700 ;
+C 53 ; WX 651 ; N C53 ; B 99 0 600 700 ;
+C 54 ; WX 651 ; N C54 ; B 66 0 600 700 ;
+C 55 ; WX 651 ; N C55 ; B 99 0 600 700 ;
+C 56 ; WX 651 ; N C56 ; B 66 0 600 700 ;
+C 57 ; WX 651 ; N C57 ; B 66 0 600 700 ;
+C 58 ; WX 384 ; N C58 ; B 133 0 266 466 ;
+C 59 ; WX 384 ; N C59 ; B 133 -133 266 466 ;
+C 60 ; WX 784 ; N C60 ; B 133 0 666 600 ;
+C 61 ; WX 818 ; N C61 ; B 133 166 700 466 ;
+C 62 ; WX 784 ; N C62 ; B 133 0 666 600 ;
+C 63 ; WX 585 ; N C63 ; B 99 0 500 700 ;
+C 64 ; WX 884 ; N C64 ; B 99 0 799 700 ;
+C 65 ; WX 718 ; N C65 ; B 0 0 733 700 ;
+C 66 ; WX 784 ; N C66 ; B 66 0 700 700 ;
+C 67 ; WX 784 ; N C67 ; B 99 0 733 700 ;
+C 68 ; WX 751 ; N C68 ; B 66 0 633 700 ;
+C 69 ; WX 718 ; N C69 ; B 66 0 666 700 ;
+C 70 ; WX 751 ; N C70 ; B 32 0 766 700 ;
+C 71 ; WX 818 ; N C71 ; B 99 0 733 700 ;
+C 72 ; WX 784 ; N C72 ; B 66 0 700 700 ;
+C 73 ; WX 618 ; N C73 ; B 0 0 532 700 ;
+C 74 ; WX 651 ; N C74 ; B 66 0 566 700 ;
+C 75 ; WX 784 ; N C75 ; B 66 0 733 700 ;
+C 76 ; WX 718 ; N C76 ; B 66 0 666 700 ;
+C 77 ; WX 918 ; N C77 ; B 32 0 866 700 ;
+C 78 ; WX 818 ; N C78 ; B 66 0 799 700 ;
+C 79 ; WX 851 ; N C79 ; B 99 0 766 700 ;
+C 80 ; WX 718 ; N C80 ; B 66 -233 600 700 ;
+C 81 ; WX 851 ; N C81 ; B 99 -233 766 700 ;
+C 82 ; WX 784 ; N C82 ; B 66 0 733 700 ;
+C 83 ; WX 751 ; N C83 ; B 66 0 700 700 ;
+C 84 ; WX 784 ; N C84 ; B 99 0 733 699 ;
+C 85 ; WX 784 ; N C85 ; B 66 0 733 700 ;
+C 86 ; WX 751 ; N C86 ; B 66 0 700 700 ;
+C 87 ; WX 884 ; N C87 ; B 66 0 766 700 ;
+C 88 ; WX 718 ; N C88 ; B 32 0 700 700 ;
+C 89 ; WX 751 ; N C89 ; B 66 -233 700 700 ;
+C 90 ; WX 651 ; N C90 ; B 66 0 600 699 ;
+C 91 ; WX 451 ; N C91 ; B 133 -233 366 833 ;
+C 92 ; WX 300 ; N C92 ; B 0 0 0 0 ;
+C 93 ; WX 451 ; N C93 ; B 99 -233 333 833 ;
+C 94 ; WX 300 ; N C94 ; B 0 0 0 0 ;
+C 95 ; WX 300 ; N C95 ; B 0 0 0 0 ;
+C 96 ; WX 318 ; N C96 ; B 133 500 199 700 ;
+C 97 ; WX 551 ; N C97 ; B 99 0 500 466 ;
+C 98 ; WX 585 ; N C98 ; B 66 0 532 700 ;
+C 99 ; WX 451 ; N C99 ; B 66 0 466 466 ;
+C 100 ; WX 551 ; N C100 ; B 66 0 466 700 ;
+C 101 ; WX 451 ; N C101 ; B 66 0 433 466 ;
+C 102 ; WX 418 ; N C102 ; B 32 0 433 700 ;
+C 103 ; WX 585 ; N C103 ; B 66 -233 532 466 ;
+C 104 ; WX 585 ; N C104 ; B 66 -233 532 699 ;
+C 105 ; WX 318 ; N C105 ; B 66 0 266 700 ;
+C 106 ; WX 318 ; N C106 ; B 66 -233 266 700 ;
+C 107 ; WX 551 ; N C107 ; B 66 0 500 699 ;
+C 108 ; WX 318 ; N C108 ; B 66 0 299 699 ;
+C 109 ; WX 851 ; N C109 ; B 66 0 799 466 ;
+C 110 ; WX 585 ; N C110 ; B 66 0 532 466 ;
+C 111 ; WX 585 ; N C111 ; B 66 0 532 466 ;
+C 112 ; WX 585 ; N C112 ; B 66 -233 532 466 ;
+C 113 ; WX 585 ; N C113 ; B 66 -233 532 466 ;
+C 114 ; WX 451 ; N C114 ; B 66 0 466 466 ;
+C 115 ; WX 518 ; N C115 ; B 66 0 433 466 ;
+C 116 ; WX 318 ; N C116 ; B 32 0 299 699 ;
+C 117 ; WX 585 ; N C117 ; B 66 0 532 466 ;
+C 118 ; WX 585 ; N C118 ; B 99 0 532 466 ;
+C 119 ; WX 851 ; N C119 ; B 99 0 799 466 ;
+C 120 ; WX 618 ; N C120 ; B 66 0 566 466 ;
+C 121 ; WX 585 ; N C121 ; B 66 -233 532 466 ;
+C 122 ; WX 585 ; N C122 ; B 99 0 500 466 ;
+C 123 ; WX 485 ; N C123 ; B 166 -233 333 833 ;
+C 124 ; WX 518 ; N C124 ; B 99 299 433 700 ;
+C 125 ; WX 485 ; N C125 ; B 166 -233 333 833 ;
+C 126 ; WX 851 ; N C126 ; B 99 0 766 700 ;
+EndCharMetrics
+
+EndFontMetrics
diff --git a/src/fonts/plge.gle b/src/fonts/plge.gle
new file mode 100644
index 0000000..295a95d
--- /dev/null
+++ b/src/fonts/plge.gle
@@ -0,0 +1,3798 @@
+dfont design= 1428
+dfont char=33
+amove 285 95
+aline 238 47
+aline 333 47
+aline 285 95
+amove 285 142
+aline 190 47
+aline 285 0
+aline 380 47
+aline 285 142
+amove 285 333
+aline 285 857
+aline 238 904
+aline 285 952
+aline 333 904
+aline 285 857
+amove 285 1000
+aline 238 952
+aline 142 904
+aline 238 857
+aline 285 333
+aline 333 857
+aline 428 904
+aline 333 952
+aline 285 1000
+stroke
+dfont endchar
+dfont char=34
+amove 190 666
+aline 285 714
+aline 333 809
+aline 333 904
+aline 285 1000
+aline 190 904
+aline 285 809
+aline 285 714
+amove 285 952
+aline 238 904
+aline 285 857
+aline 285 952
+stroke
+dfont endchar
+stroke
+dfont endchar
+dfont char=36
+amove 238 95
+aline 190 190
+amove 380 0
+aline 285 47
+aline 238 142
+aline 238 238
+aline 142 190
+aline 190 95
+aline 238 47
+aline 380 0
+aline 571 0
+aline 714 47
+aline 761 95
+aline 809 190
+aline 809 333
+aline 761 428
+aline 619 523
+aline 333 619
+aline 238 666
+aline 190 761
+aline 190 857
+aline 238 952
+amove 190 714
+aline 238 619
+aline 333 571
+aline 619 476
+aline 714 428
+aline 761 333
+amove 714 47
+aline 761 142
+aline 761 285
+aline 714 380
+aline 619 428
+aline 333 523
+aline 190 619
+aline 142 714
+aline 142 857
+aline 238 952
+aline 380 1000
+aline 571 1000
+aline 714 952
+aline 761 904
+aline 809 809
+aline 714 761
+aline 714 857
+aline 666 952
+aline 571 1000
+amove 714 904
+aline 761 809
+amove 571 1190
+aline 571 -191
+amove 380 -191
+aline 380 1190
+stroke
+dfont endchar
+dfont char=37
+amove 142 0
+aline 1000 1000
+aline 904 952
+aline 761 904
+aline 619 904
+aline 476 952
+aline 380 1000
+aline 285 1000
+aline 190 952
+aline 142 857
+aline 142 761
+aline 238 666
+aline 333 666
+aline 428 714
+aline 476 809
+aline 476 904
+aline 380 1000
+amove 809 333
+aline 714 285
+aline 666 190
+aline 666 95
+aline 761 0
+aline 857 0
+aline 952 47
+aline 1000 142
+aline 1000 238
+aline 904 333
+aline 809 333
+stroke
+dfont endchar
+stroke
+dfont endchar
+dfont char=39
+amove 285 809
+aline 285 714
+aline 333 761
+aline 285 809
+amove 285 952
+aline 285 857
+aline 380 761
+aline 285 666
+aline 238 761
+aline 238 857
+aline 285 952
+aline 380 1000
+stroke
+dfont endchar
+dfont char=40
+amove 285 -48
+aline 238 95
+aline 190 285
+aline 190 571
+aline 238 761
+aline 285 904
+amove 380 1095
+aline 333 1000
+aline 285 857
+aline 238 571
+aline 238 285
+aline 285 0
+aline 333 -143
+aline 380 -239
+amove 476 -334
+aline 380 -239
+aline 285 -96
+aline 190 95
+aline 142 333
+aline 142 523
+aline 190 761
+aline 285 952
+aline 380 1095
+aline 476 1190
+stroke
+dfont endchar
+dfont char=41
+amove 285 -239
+aline 333 -143
+aline 380 0
+aline 428 285
+aline 428 571
+aline 380 857
+aline 333 1000
+aline 285 1095
+amove 190 1190
+aline 285 1095
+aline 380 952
+aline 476 761
+aline 523 523
+aline 523 333
+aline 476 95
+aline 380 -96
+aline 285 -239
+aline 190 -334
+amove 380 -48
+aline 428 95
+aline 476 285
+aline 476 571
+aline 428 761
+aline 380 904
+stroke
+dfont endchar
+dfont char=42
+amove 190 666
+aline 238 952
+amove 238 1000
+aline 190 952
+aline 190 666
+aline 285 952
+aline 238 1000
+amove 666 1000
+aline 619 952
+aline 619 666
+aline 666 952
+amove 666 1000
+aline 714 952
+aline 619 666
+stroke
+dfont endchar
+dfont char=43
+amove 190 476
+aline 1000 476
+aline 1000 428
+aline 190 428
+aline 190 476
+amove 571 857
+aline 571 47
+aline 619 47
+aline 619 857
+aline 571 857
+stroke
+dfont endchar
+dfont char=44
+amove 190 -191
+aline 285 -143
+aline 333 -48
+aline 333 47
+aline 285 142
+aline 190 47
+aline 285 -48
+aline 285 -143
+amove 285 95
+aline 238 47
+aline 285 0
+aline 285 95
+stroke
+dfont endchar
+dfont char=45
+amove 190 476
+aline 1000 476
+aline 1000 428
+aline 190 428
+aline 190 476
+stroke
+dfont endchar
+dfont char=46
+amove 285 142
+aline 190 47
+aline 285 0
+aline 380 47
+aline 285 142
+amove 285 95
+aline 238 47
+aline 333 47
+aline 285 95
+stroke
+dfont endchar
+dfont char=47
+amove 142 -334
+aline 95 -334
+aline 952 1190
+aline 1000 1190
+aline 142 -334
+stroke
+dfont endchar
+dfont char=48
+amove 95 95
+aline 190 142
+aline 190 904
+aline 285 904
+aline 523 952
+aline 619 1000
+aline 666 952
+aline 761 904
+aline 857 904
+aline 761 857
+aline 761 95
+aline 666 95
+aline 428 47
+aline 333 0
+aline 285 47
+aline 190 95
+aline 95 95
+amove 380 47
+aline 238 142
+aline 238 857
+amove 285 904
+aline 285 142
+aline 380 95
+aline 428 47
+amove 666 95
+aline 666 857
+aline 571 904
+aline 523 952
+amove 571 952
+aline 714 857
+aline 714 142
+stroke
+dfont endchar
+dfont char=49
+amove 333 95
+aline 428 142
+aline 428 761
+aline 380 857
+aline 333 904
+aline 476 1000
+aline 523 904
+aline 523 142
+aline 619 95
+aline 666 95
+aline 571 47
+aline 523 0
+aline 476 47
+aline 380 95
+aline 333 95
+amove 571 47
+aline 476 95
+aline 476 857
+aline 428 952
+aline 380 904
+aline 428 857
+stroke
+dfont endchar
+dfont char=50
+amove 142 0
+aline 142 238
+aline 190 380
+aline 285 476
+aline 428 523
+aline 761 523
+aline 761 904
+aline 666 904
+aline 523 952
+aline 428 1000
+aline 380 952
+aline 285 904
+aline 190 904
+aline 285 857
+aline 380 857
+aline 476 904
+aline 523 952
+amove 476 952
+aline 380 904
+amove 666 904
+aline 666 523
+amove 714 571
+aline 714 857
+amove 857 95
+aline 666 142
+aline 523 142
+aline 333 95
+aline 142 -1
+aline 380 47
+aline 619 47
+aline 761 -1
+aline 857 95
+amove 809 47
+aline 666 95
+aline 428 95
+aline 285 47
+stroke
+dfont endchar
+dfont char=51
+amove 142 95
+aline 238 95
+aline 333 47
+aline 380 0
+aline 476 47
+aline 666 95
+aline 761 95
+aline 761 428
+aline 666 428
+aline 523 476
+aline 428 523
+amove 428 476
+aline 523 523
+aline 666 571
+aline 761 571
+aline 761 904
+aline 666 904
+aline 476 952
+aline 380 1000
+aline 333 952
+aline 238 904
+aline 190 904
+aline 285 857
+aline 380 857
+aline 476 952
+amove 428 952
+aline 333 904
+amove 666 904
+aline 666 571
+amove 714 619
+aline 714 857
+amove 666 428
+aline 666 95
+amove 714 142
+aline 714 380
+amove 476 47
+aline 428 95
+aline 333 142
+aline 238 142
+aline 142 95
+amove 333 95
+aline 428 47
+stroke
+dfont endchar
+dfont char=52
+amove 238 285
+aline 238 619
+amove 190 523
+aline 190 333
+amove 476 95
+aline 523 95
+aline 619 47
+aline 666 0
+aline 714 47
+aline 809 95
+aline 761 95
+aline 666 142
+aline 666 809
+aline 714 904
+aline 619 1000
+aline 142 523
+aline 142 285
+aline 571 285
+amove 666 285
+aline 857 285
+aline 904 238
+aline 904 333
+aline 857 285
+amove 714 47
+aline 619 95
+aline 619 952
+aline 666 904
+aline 619 809
+amove 571 952
+aline 571 142
+aline 476 95
+stroke
+dfont endchar
+dfont char=53
+amove 142 95
+aline 238 95
+aline 333 47
+aline 380 0
+aline 476 47
+aline 666 95
+aline 761 95
+aline 761 571
+aline 857 619
+aline 809 619
+aline 714 666
+aline 666 714
+aline 619 666
+aline 523 619
+aline 333 571
+aline 190 571
+aline 190 1000
+aline 761 1000
+aline 714 952
+aline 619 904
+aline 190 904
+amove 238 952
+aline 666 952
+amove 619 666
+aline 714 619
+aline 714 142
+amove 666 95
+aline 666 571
+aline 571 619
+aline 523 619
+amove 333 95
+aline 428 47
+amove 476 47
+aline 428 95
+aline 333 142
+aline 238 142
+aline 142 95
+stroke
+dfont endchar
+dfont char=54
+amove 95 95
+aline 190 142
+aline 190 904
+aline 285 904
+aline 476 952
+aline 571 1000
+aline 619 952
+aline 714 904
+aline 761 904
+aline 666 857
+aline 571 857
+aline 476 952
+amove 523 952
+aline 619 904
+amove 666 666
+aline 714 619
+aline 809 571
+aline 857 571
+aline 761 523
+aline 761 95
+aline 666 95
+aline 428 47
+aline 333 0
+aline 285 47
+aline 190 95
+aline 95 95
+amove 380 47
+aline 238 142
+aline 238 857
+amove 285 904
+aline 285 142
+aline 380 95
+aline 428 47
+amove 666 95
+aline 666 523
+aline 571 571
+aline 523 571
+amove 619 619
+aline 714 523
+aline 714 142
+amove 666 666
+aline 619 619
+aline 523 571
+aline 333 523
+aline 285 523
+stroke
+dfont endchar
+dfont char=55
+amove 428 0
+aline 380 142
+aline 380 285
+aline 428 428
+aline 523 571
+aline 714 761
+aline 809 904
+aline 857 1000
+aline 666 904
+aline 476 857
+aline 333 857
+aline 142 904
+aline 238 1000
+aline 380 952
+aline 619 952
+aline 857 1000
+amove 714 952
+aline 571 904
+aline 333 904
+aline 190 952
+amove 619 666
+aline 523 523
+aline 476 380
+aline 476 238
+aline 523 95
+aline 428 -1
+amove 476 47
+aline 428 190
+aline 428 333
+aline 476 476
+stroke
+dfont endchar
+dfont char=56
+amove 95 95
+aline 190 142
+aline 190 428
+aline 285 428
+aline 666 571
+aline 761 571
+aline 761 857
+aline 857 904
+aline 809 904
+aline 714 952
+aline 666 1000
+aline 619 952
+aline 523 904
+aline 285 857
+aline 190 857
+aline 190 571
+aline 285 571
+aline 666 428
+aline 761 428
+aline 761 95
+aline 666 95
+aline 428 47
+aline 333 0
+aline 285 47
+aline 190 95
+aline 95 95
+amove 380 47
+aline 238 142
+aline 238 380
+amove 285 428
+aline 285 142
+aline 380 95
+aline 428 47
+amove 666 95
+aline 666 428
+amove 714 380
+aline 714 142
+amove 666 571
+aline 666 857
+aline 571 904
+aline 523 904
+amove 619 952
+aline 714 904
+aline 714 619
+amove 285 571
+aline 285 857
+amove 238 809
+aline 238 619
+stroke
+dfont endchar
+dfont char=57
+amove 142 95
+aline 238 95
+aline 333 47
+aline 380 0
+aline 476 47
+aline 666 95
+aline 761 95
+aline 761 857
+aline 857 904
+aline 761 904
+aline 666 952
+aline 619 1000
+aline 523 952
+aline 285 904
+aline 190 904
+aline 190 476
+aline 95 428
+aline 142 428
+aline 238 380
+aline 285 333
+aline 333 380
+aline 428 428
+aline 619 476
+aline 666 476
+amove 428 428
+aline 380 428
+aline 285 476
+aline 285 904
+amove 238 857
+aline 238 428
+aline 333 380
+amove 333 95
+aline 428 47
+amove 476 47
+aline 428 95
+aline 333 142
+aline 238 142
+aline 142 95
+amove 666 95
+aline 666 857
+aline 571 904
+aline 523 952
+amove 571 952
+aline 714 857
+aline 714 142
+stroke
+dfont endchar
+dfont char=58
+amove 285 666
+aline 190 571
+aline 285 523
+aline 380 571
+aline 285 666
+amove 285 619
+aline 238 571
+aline 333 571
+aline 285 619
+amove 285 142
+aline 190 47
+aline 285 -1
+aline 380 47
+aline 285 142
+amove 285 95
+aline 238 47
+aline 333 47
+aline 285 95
+stroke
+dfont endchar
+dfont char=59
+amove 190 -191
+aline 285 -143
+aline 333 -48
+aline 333 47
+aline 285 142
+aline 190 47
+aline 285 -48
+aline 285 -143
+amove 285 95
+aline 238 47
+aline 285 0
+aline 285 95
+amove 285 619
+aline 238 571
+aline 333 571
+aline 285 619
+amove 285 666
+aline 190 571
+aline 285 523
+aline 380 571
+aline 285 666
+stroke
+dfont endchar
+dfont char=60
+amove 952 857
+aline 190 428
+aline 952 0
+stroke
+dfont endchar
+dfont char=61
+amove 190 285
+aline 1000 285
+aline 1000 238
+aline 190 238
+aline 190 285
+amove 190 666
+aline 1000 666
+aline 1000 619
+aline 190 619
+aline 190 666
+stroke
+dfont endchar
+dfont char=62
+amove 190 0
+aline 952 428
+aline 190 857
+stroke
+dfont endchar
+dfont char=63
+amove 428 95
+aline 380 47
+aline 476 47
+aline 428 95
+amove 428 142
+aline 333 47
+aline 428 0
+aline 523 47
+aline 428 142
+amove 428 333
+aline 380 476
+aline 476 476
+aline 428 333
+aline 428 476
+amove 476 476
+aline 571 523
+aline 666 619
+aline 714 714
+aline 714 809
+aline 666 904
+aline 619 952
+aline 476 1000
+aline 380 1000
+aline 238 952
+aline 190 904
+aline 142 809
+aline 238 761
+aline 238 857
+aline 285 952
+aline 380 1000
+amove 476 1000
+aline 571 952
+aline 619 857
+aline 619 666
+aline 571 571
+aline 476 476
+amove 619 619
+aline 666 666
+aline 666 857
+aline 619 904
+amove 238 904
+aline 190 809
+stroke
+dfont endchar
+dfont char=64
+amove 523 238
+aline 476 285
+aline 428 380
+aline 428 523
+aline 476 666
+aline 571 761
+amove 857 761
+aline 809 380
+aline 809 285
+aline 904 238
+aline 999 238
+aline 1095 333
+aline 1142 476
+aline 1142 571
+aline 1095 714
+aline 1047 809
+aline 952 904
+aline 857 952
+aline 714 1000
+aline 571 1000
+aline 428 952
+aline 333 904
+aline 238 809
+aline 190 714
+aline 142 571
+aline 142 428
+aline 190 285
+aline 238 190
+aline 333 95
+aline 428 47
+aline 571 0
+aline 714 0
+aline 857 47
+aline 952 95
+aline 1000 142
+amove 904 238
+aline 857 285
+aline 857 380
+aline 904 761
+amove 857 619
+aline 809 714
+aline 714 761
+aline 571 761
+aline 476 714
+aline 428 666
+aline 380 523
+aline 380 380
+aline 428 285
+aline 523 238
+aline 666 238
+aline 761 285
+aline 809 380
+stroke
+dfont endchar
+dfont char=65
+amove 0 0
+aline 95 95
+aline 190 142
+aline 333 142
+aline 428 95
+aline 333 0
+aline 285 47
+aline 142 47
+aline 0 0
+amove 142 95
+aline 333 95
+aline 380 47
+amove 238 142
+aline 523 809
+amove 476 714
+aline 428 761
+aline 380 761
+aline 285 714
+aline 238 666
+amove 285 714
+aline 380 714
+aline 428 619
+amove 428 666
+aline 428 714
+amove 238 857
+aline 333 952
+aline 428 1000
+aline 523 1000
+aline 571 952
+aline 904 190
+aline 952 142
+aline 1047 142
+aline 952 -1
+aline 904 -1
+aline 857 47
+aline 809 142
+aline 476 904
+aline 428 952
+aline 333 952
+amove 476 952
+aline 523 904
+aline 857 142
+aline 904 47
+aline 952 95
+aline 857 142
+amove 714 380
+aline 333 380
+stroke
+dfont endchar
+dfont char=66
+amove 190 0
+aline 380 47
+aline 619 47
+aline 714 0
+aline 809 95
+aline 904 142
+aline 1000 142
+aline 1000 428
+aline 952 523
+aline 809 619
+aline 904 714
+aline 904 857
+aline 857 904
+aline 761 952
+amove 857 952
+aline 952 857
+aline 952 761
+amove 809 619
+aline 857 571
+aline 904 476
+aline 904 142
+amove 952 190
+aline 952 428
+aline 904 523
+amove 904 428
+aline 714 428
+amove 714 571
+aline 904 666
+aline 1000 761
+aline 1000 857
+aline 952 952
+aline 857 1000
+aline 571 857
+aline 523 809
+aline 476 714
+aline 476 285
+aline 523 333
+aline 571 428
+aline 571 857
+amove 523 761
+aline 523 380
+amove 714 285
+aline 904 285
+amove 809 95
+aline 666 142
+aline 476 142
+aline 333 95
+aline 190 0
+amove 285 47
+aline 428 95
+aline 666 95
+aline 761 47
+amove 714 142
+aline 714 571
+amove 333 761
+aline 285 714
+aline 238 619
+aline 238 571
+aline 142 571
+aline 95 523
+aline 95 428
+aline 142 476
+aline 238 476
+aline 238 190
+aline 285 238
+aline 333 333
+aline 333 761
+amove 285 666
+aline 285 285
+amove 285 523
+aline 142 523
+amove 95 904
+aline 190 1000
+aline 333 1000
+aline 428 952
+aline 523 1000
+aline 428 904
+aline 285 904
+aline 190 952
+aline 95 904
+amove 238 952
+aline 380 952
+stroke
+dfont endchar
+dfont char=67
+amove 523 238
+aline 571 285
+aline 619 380
+aline 619 857
+amove 666 904
+aline 761 857
+aline 857 857
+aline 952 904
+aline 1000 1000
+aline 952 952
+aline 857 952
+aline 761 1000
+aline 619 857
+aline 523 809
+aline 523 238
+amove 571 333
+aline 571 809
+amove 428 952
+aline 333 904
+aline 238 809
+aline 190 714
+aline 142 571
+aline 142 380
+aline 190 238
+aline 238 142
+aline 380 47
+aline 523 0
+aline 666 0
+aline 809 47
+aline 904 95
+aline 1000 190
+aline 1047 285
+aline 952 190
+aline 857 142
+aline 714 95
+aline 571 95
+aline 428 142
+aline 285 285
+aline 238 428
+aline 238 619
+aline 285 761
+aline 333 857
+aline 428 952
+amove 238 761
+aline 190 619
+aline 190 380
+aline 285 190
+aline 428 95
+aline 571 47
+aline 714 47
+aline 857 95
+amove 857 142
+aline 857 857
+amove 904 904
+aline 809 904
+aline 714 952
+stroke
+dfont endchar
+dfont char=68
+amove 95 0
+aline 285 47
+aline 523 47
+aline 619 0
+aline 714 95
+aline 809 142
+aline 904 142
+aline 904 857
+aline 857 952
+aline 761 1000
+aline 95 1000
+aline 142 952
+aline 238 904
+aline 761 904
+aline 809 857
+aline 809 142
+amove 857 190
+aline 857 857
+aline 761 952
+aline 190 952
+amove 380 761
+aline 333 714
+aline 285 619
+aline 285 571
+aline 190 571
+aline 142 523
+aline 142 428
+aline 190 476
+aline 285 476
+aline 285 238
+aline 333 285
+aline 380 380
+aline 380 761
+amove 333 666
+aline 333 333
+amove 333 523
+aline 190 523
+amove 523 666
+aline 619 619
+aline 714 619
+aline 809 666
+amove 809 380
+aline 714 428
+aline 619 428
+aline 523 380
+amove 523 142
+aline 523 904
+amove 714 95
+aline 571 142
+aline 380 142
+aline 238 95
+aline 95 -1
+amove 190 47
+aline 333 95
+aline 571 95
+aline 666 47
+stroke
+dfont endchar
+dfont char=69
+amove 190 0
+aline 333 95
+aline 523 142
+aline 761 142
+aline 952 95
+aline 857 0
+aline 714 47
+aline 380 47
+aline 190 0
+amove 285 47
+aline 428 95
+aline 761 95
+aline 904 47
+amove 476 142
+aline 476 666
+aline 523 809
+aline 571 904
+aline 619 952
+aline 714 1000
+aline 809 1000
+aline 952 952
+aline 857 857
+aline 761 904
+aline 666 904
+aline 571 857
+aline 523 809
+amove 619 904
+aline 714 952
+aline 809 952
+aline 904 904
+amove 809 523
+aline 714 571
+aline 619 571
+aline 571 523
+aline 523 428
+aline 476 285
+amove 523 428
+aline 571 476
+aline 666 476
+aline 714 428
+aline 809 523
+amove 761 476
+aline 714 523
+aline 619 523
+amove 285 523
+aline 142 523
+amove 285 666
+aline 285 285
+amove 238 190
+aline 238 476
+aline 142 476
+aline 95 428
+aline 95 523
+aline 142 571
+aline 238 571
+aline 238 619
+aline 285 714
+aline 333 761
+aline 333 333
+aline 285 238
+aline 238 190
+amove 95 904
+aline 190 1000
+aline 285 1000
+aline 380 952
+aline 476 1000
+aline 380 904
+aline 285 904
+aline 190 952
+aline 95 904
+amove 238 952
+aline 333 952
+stroke
+dfont endchar
+dfont char=70
+amove 47 0
+aline 190 47
+aline 285 47
+aline 380 0
+aline 476 0
+aline 666 95
+aline 714 190
+aline 714 476
+aline 857 476
+amove 857 523
+aline 666 523
+amove 857 571
+aline 714 571
+aline 714 857
+amove 761 904
+aline 857 857
+aline 952 857
+aline 1047 904
+aline 1095 1000
+aline 1047 952
+aline 952 952
+aline 857 1000
+aline 714 857
+aline 619 809
+aline 619 95
+aline 571 47
+aline 523 47
+aline 333 142
+aline 238 142
+aline 142 95
+aline 47 -1
+amove 190 95
+aline 333 95
+aline 428 47
+aline 476 47
+amove 380 238
+aline 380 476
+aline 285 476
+aline 238 428
+aline 238 523
+aline 285 571
+aline 380 571
+aline 380 619
+aline 428 714
+aline 476 761
+aline 476 380
+aline 428 285
+aline 380 238
+amove 428 333
+aline 428 666
+amove 428 523
+aline 285 523
+amove 190 904
+aline 285 1000
+aline 428 1000
+aline 523 952
+aline 619 1000
+aline 523 904
+aline 380 904
+aline 285 952
+aline 190 904
+amove 333 952
+aline 476 952
+amove 666 809
+aline 666 142
+amove 857 190
+aline 857 857
+amove 809 952
+aline 904 904
+aline 1000 904
+stroke
+dfont endchar
+dfont char=71
+amove 238 238
+aline 190 380
+aline 190 619
+aline 238 761
+amove 428 952
+aline 333 857
+aline 285 761
+aline 238 619
+aline 238 380
+aline 285 238
+aline 333 142
+aline 428 47
+amove 523 190
+aline 571 238
+aline 619 333
+aline 619 857
+amove 666 904
+aline 761 857
+aline 857 857
+aline 952 904
+aline 1000 1000
+aline 952 952
+aline 857 952
+aline 761 1000
+aline 619 857
+aline 523 809
+aline 523 190
+amove 571 285
+aline 571 809
+amove 428 952
+aline 333 904
+aline 238 809
+aline 190 714
+aline 142 571
+aline 142 428
+aline 190 285
+aline 238 190
+aline 333 95
+aline 428 47
+aline 571 0
+aline 761 0
+aline 904 47
+aline 1000 142
+aline 1047 238
+aline 1047 380
+aline 1000 476
+aline 952 523
+aline 857 571
+aline 761 571
+aline 857 523
+aline 904 476
+aline 952 380
+aline 952 190
+aline 904 95
+aline 857 47
+aline 761 0
+aline 761 571
+aline 952 904
+amove 904 904
+aline 809 904
+aline 714 952
+amove 952 476
+aline 1000 380
+aline 1000 190
+aline 952 142
+amove 952 238
+aline 761 238
+amove 761 380
+aline 952 380
+stroke
+dfont endchar
+dfont char=72
+amove 190 0
+aline 380 47
+aline 523 47
+aline 619 0
+aline 714 95
+aline 619 142
+aline 476 142
+aline 333 95
+aline 190 0
+amove 285 47
+aline 428 95
+aline 571 95
+aline 666 47
+amove 714 95
+aline 714 571
+aline 809 619
+aline 904 714
+aline 952 666
+aline 1000 523
+aline 1000 333
+aline 952 142
+aline 857 -1
+aline 904 285
+aline 904 523
+aline 857 619
+aline 809 619
+amove 857 666
+aline 904 619
+aline 952 523
+aline 952 285
+aline 904 142
+amove 904 285
+aline 714 285
+amove 714 428
+aline 904 428
+amove 523 380
+aline 523 761
+amove 571 857
+aline 523 809
+aline 476 714
+aline 476 285
+aline 523 333
+aline 571 428
+aline 571 857
+aline 666 952
+aline 761 1000
+aline 857 1000
+aline 952 952
+aline 857 857
+aline 761 952
+aline 666 952
+amove 809 952
+aline 857 952
+aline 904 904
+amove 523 1000
+aline 428 952
+aline 333 1000
+aline 190 1000
+aline 95 904
+aline 190 952
+aline 285 904
+aline 428 904
+aline 523 1000
+amove 380 952
+aline 238 952
+amove 333 761
+aline 285 714
+aline 238 619
+aline 238 571
+aline 142 571
+aline 95 523
+aline 95 428
+aline 142 476
+aline 238 476
+aline 238 190
+aline 285 238
+aline 333 333
+aline 333 761
+amove 285 666
+aline 285 285
+amove 285 523
+aline 142 523
+stroke
+dfont endchar
+dfont char=73
+amove 0 0
+aline 95 95
+aline 190 142
+aline 285 142
+aline 476 47
+aline 571 47
+aline 619 142
+aline 619 666
+aline 666 809
+aline 761 904
+aline 714 809
+aline 714 238
+aline 666 142
+aline 571 47
+aline 476 -1
+aline 333 -1
+aline 238 47
+aline 95 47
+aline 0 -1
+amove 142 95
+aline 285 95
+aline 380 47
+aline 428 47
+amove 380 238
+aline 380 476
+aline 285 476
+aline 238 428
+aline 238 523
+aline 285 571
+aline 380 571
+aline 380 619
+aline 428 714
+aline 476 761
+aline 476 380
+aline 428 285
+aline 380 238
+amove 428 333
+aline 428 666
+amove 428 523
+aline 285 523
+amove 142 904
+aline 238 1000
+aline 380 1000
+aline 523 952
+aline 619 1000
+aline 523 904
+aline 380 904
+aline 238 952
+aline 142 904
+amove 285 952
+aline 476 952
+amove 666 761
+aline 666 190
+stroke
+dfont endchar
+dfont char=74
+amove 142 190
+aline 190 190
+aline 238 238
+aline 190 285
+aline 142 285
+aline 95 238
+aline 95 142
+aline 190 47
+aline 333 0
+aline 476 0
+aline 619 47
+aline 714 142
+aline 761 238
+aline 761 809
+aline 809 904
+aline 714 809
+aline 666 666
+aline 666 142
+aline 619 47
+amove 714 190
+aline 714 761
+amove 523 761
+aline 476 714
+aline 428 619
+aline 428 571
+aline 333 571
+aline 285 523
+aline 285 428
+aline 333 476
+aline 428 476
+aline 428 238
+aline 476 285
+aline 523 380
+aline 523 761
+amove 476 666
+aline 476 333
+amove 476 523
+aline 333 523
+amove 238 238
+aline 95 238
+amove 190 904
+aline 285 1000
+aline 428 1000
+aline 571 952
+aline 666 1000
+aline 571 904
+aline 428 904
+aline 285 952
+aline 190 904
+amove 333 952
+aline 523 952
+stroke
+dfont endchar
+dfont char=75
+amove 190 0
+aline 380 47
+aline 523 47
+aline 619 0
+aline 714 95
+aline 619 142
+aline 476 142
+aline 333 95
+aline 190 0
+amove 285 47
+aline 380 95
+aline 571 95
+aline 666 47
+amove 714 95
+aline 714 571
+aline 857 714
+aline 904 666
+aline 1000 619
+aline 904 619
+aline 809 666
+amove 1000 619
+aline 904 476
+aline 809 380
+aline 714 285
+amove 809 380
+aline 904 333
+aline 952 142
+aline 1000 47
+aline 1047 47
+aline 1000 -1
+aline 952 -1
+aline 904 47
+aline 857 333
+aline 809 380
+amove 904 238
+aline 952 47
+amove 476 285
+aline 476 714
+aline 523 809
+aline 571 857
+aline 571 428
+aline 523 333
+aline 476 285
+amove 523 380
+aline 523 761
+amove 571 857
+aline 666 952
+aline 761 1000
+aline 857 1000
+aline 952 952
+aline 857 857
+aline 761 952
+aline 666 952
+amove 809 952
+aline 857 952
+aline 904 904
+amove 523 1000
+aline 428 952
+aline 333 1000
+aline 190 1000
+aline 95 904
+aline 190 952
+aline 285 904
+aline 428 904
+aline 523 1000
+amove 380 952
+aline 238 952
+amove 333 761
+aline 285 714
+aline 238 619
+aline 238 571
+aline 142 571
+aline 95 523
+aline 95 428
+aline 142 476
+aline 238 476
+aline 238 190
+aline 285 238
+aline 333 333
+aline 333 761
+amove 285 666
+aline 285 285
+amove 285 523
+aline 142 523
+stroke
+dfont endchar
+dfont char=76
+amove 190 0
+aline 333 95
+aline 523 142
+aline 761 142
+aline 952 95
+aline 857 0
+aline 714 47
+aline 380 47
+aline 190 0
+amove 285 47
+aline 428 95
+aline 761 95
+aline 904 47
+amove 761 142
+aline 761 952
+amove 809 952
+aline 857 952
+aline 904 904
+amove 952 952
+aline 857 1000
+aline 761 1000
+aline 666 952
+aline 571 857
+aline 523 809
+aline 476 714
+aline 476 285
+aline 523 333
+aline 571 428
+aline 571 857
+amove 523 761
+aline 523 380
+amove 285 285
+aline 285 666
+amove 333 761
+aline 285 714
+aline 238 619
+aline 238 571
+aline 142 571
+aline 95 523
+aline 95 428
+aline 142 476
+aline 238 476
+aline 238 190
+aline 285 238
+aline 333 333
+aline 333 761
+amove 380 952
+aline 238 952
+amove 95 904
+aline 190 1000
+aline 333 1000
+aline 428 952
+aline 523 1000
+aline 428 904
+aline 285 904
+aline 190 952
+aline 95 904
+amove 142 523
+aline 285 523
+amove 666 952
+aline 761 952
+aline 857 857
+aline 952 952
+stroke
+dfont endchar
+dfont char=77
+amove 47 0
+aline 142 47
+aline 285 47
+aline 380 0
+aline 428 0
+aline 476 47
+aline 523 142
+aline 476 95
+aline 428 95
+aline 333 142
+aline 238 142
+aline 142 95
+aline 47 0
+amove 190 95
+aline 333 95
+aline 428 47
+amove 523 142
+aline 523 904
+amove 476 904
+aline 523 904
+aline 666 761
+aline 666 571
+aline 523 571
+amove 571 523
+aline 714 523
+amove 523 476
+aline 666 476
+aline 666 142
+aline 619 95
+aline 714 -1
+aline 857 95
+aline 904 142
+aline 904 904
+amove 857 904
+aline 904 904
+aline 1047 761
+aline 1047 571
+aline 904 571
+amove 952 523
+aline 1095 523
+amove 904 476
+aline 1047 476
+aline 1047 95
+aline 1142 -1
+aline 1238 95
+aline 1190 95
+aline 1142 190
+aline 1142 809
+aline 952 1000
+aline 761 809
+amove 571 952
+aline 714 809
+aline 714 142
+aline 666 95
+aline 714 47
+aline 761 95
+aline 714 142
+amove 857 95
+aline 809 95
+aline 761 190
+aline 761 809
+aline 571 1000
+aline 380 809
+aline 333 761
+aline 285 666
+aline 285 571
+aline 190 571
+aline 142 523
+aline 142 428
+aline 190 476
+aline 285 476
+aline 285 285
+aline 333 333
+aline 380 428
+aline 380 809
+amove 333 714
+aline 333 380
+amove 333 523
+aline 190 523
+amove 952 952
+aline 1095 809
+aline 1095 142
+aline 1190 47
+stroke
+dfont endchar
+dfont char=78
+amove 95 0
+aline 190 95
+aline 285 142
+aline 428 142
+aline 523 95
+aline 428 0
+aline 380 47
+aline 238 47
+aline 95 0
+amove 238 95
+aline 380 95
+aline 476 47
+amove 285 142
+aline 285 952
+amove 380 952
+aline 476 857
+aline 523 761
+aline 809 190
+aline 952 47
+amove 952 95
+aline 904 142
+aline 809 285
+aline 571 809
+aline 476 952
+aline 380 1000
+aline 285 1000
+aline 190 952
+aline 95 857
+amove 190 952
+aline 285 952
+aline 380 904
+aline 476 761
+aline 714 238
+aline 809 95
+aline 857 47
+aline 952 0
+aline 952 857
+amove 1047 904
+aline 952 904
+aline 857 952
+amove 809 904
+aline 904 857
+aline 1000 857
+aline 1095 904
+aline 1142 1000
+aline 1095 952
+aline 1000 952
+aline 904 1000
+aline 809 904
+amove 619 714
+aline 666 666
+aline 761 619
+aline 857 619
+aline 952 666
+amove 666 333
+aline 571 380
+aline 380 380
+aline 285 333
+amove 285 476
+aline 190 476
+aline 142 428
+aline 142 523
+aline 190 571
+aline 285 571
+amove 285 523
+aline 190 523
+stroke
+dfont endchar
+dfont char=79
+amove 238 238
+aline 190 380
+aline 190 666
+aline 238 809
+amove 476 809
+aline 619 857
+aline 761 952
+aline 809 1000
+aline 904 952
+aline 1000 857
+aline 1047 761
+aline 1095 619
+aline 1095 428
+aline 1047 285
+aline 1000 190
+aline 904 95
+aline 809 47
+aline 666 0
+aline 571 0
+aline 428 47
+aline 333 95
+aline 238 190
+aline 190 285
+aline 142 428
+aline 142 619
+aline 190 761
+aline 238 857
+aline 333 952
+aline 428 1000
+aline 333 904
+aline 285 809
+aline 238 666
+aline 238 380
+aline 285 238
+aline 333 142
+aline 428 47
+amove 476 190
+aline 476 809
+amove 523 809
+aline 523 285
+amove 476 190
+aline 523 238
+aline 571 333
+aline 571 809
+amove 761 952
+aline 857 904
+aline 952 761
+aline 1000 666
+aline 1000 380
+aline 952 238
+aline 904 142
+aline 809 47
+amove 761 47
+aline 761 952
+amove 904 904
+aline 952 857
+aline 1047 666
+aline 1047 380
+aline 1000 238
+amove 1000 380
+aline 904 428
+aline 857 428
+aline 761 380
+amove 761 666
+aline 857 619
+aline 904 619
+aline 1000 666
+stroke
+dfont endchar
+dfont char=80
+amove 285 -239
+aline 285 809
+aline 238 904
+amove 142 1000
+aline 190 952
+aline 238 857
+aline 238 571
+aline 142 571
+aline 95 523
+aline 95 428
+aline 142 476
+aline 238 476
+aline 238 95
+aline 95 -1
+aline 238 47
+aline 238 -334
+aline 333 -239
+aline 333 809
+aline 285 904
+aline 238 952
+aline 142 1000
+amove 333 761
+aline 476 857
+aline 666 1000
+aline 857 809
+aline 857 142
+aline 761 95
+aline 666 0
+aline 571 47
+aline 476 47
+amove 523 95
+aline 619 95
+aline 714 47
+amove 761 95
+aline 761 761
+aline 619 904
+aline 571 904
+amove 666 952
+aline 809 809
+aline 809 142
+amove 761 95
+aline 619 142
+aline 476 142
+amove 476 380
+aline 571 428
+aline 666 428
+aline 761 380
+amove 761 666
+aline 666 619
+aline 571 619
+aline 476 666
+amove 476 857
+aline 476 -191
+amove 285 523
+aline 142 523
+stroke
+dfont endchar
+dfont char=81
+amove 238 238
+aline 190 380
+aline 190 666
+aline 238 809
+amove 476 809
+aline 619 857
+aline 761 952
+aline 809 1000
+aline 904 952
+aline 1000 857
+aline 1047 761
+aline 1095 619
+aline 1095 428
+aline 1047 285
+aline 1000 190
+aline 904 95
+aline 809 47
+aline 714 0
+aline 523 0
+aline 428 47
+aline 333 95
+aline 238 190
+aline 190 285
+aline 142 428
+aline 142 619
+aline 190 761
+aline 238 857
+aline 333 952
+aline 428 1000
+aline 333 904
+aline 285 809
+aline 238 666
+aline 238 380
+aline 285 238
+aline 333 142
+aline 428 47
+amove 523 0
+aline 571 47
+aline 619 47
+aline 714 0
+aline 904 -239
+aline 1000 -286
+aline 1047 -286
+aline 1000 -334
+aline 904 -334
+aline 809 -286
+aline 666 -1
+aline 619 47
+amove 714 -48
+aline 809 -191
+aline 904 -286
+aline 952 -286
+amove 809 47
+aline 904 142
+aline 952 238
+aline 1000 380
+aline 1000 666
+aline 952 761
+aline 857 904
+aline 761 952
+aline 761 47
+amove 1000 238
+aline 1047 380
+aline 1047 666
+aline 952 857
+aline 904 904
+amove 1000 666
+aline 904 619
+aline 857 619
+aline 761 666
+amove 571 809
+aline 571 333
+aline 523 238
+aline 476 190
+aline 476 809
+amove 523 809
+aline 523 285
+amove 761 380
+aline 857 428
+aline 904 428
+aline 1000 380
+stroke
+dfont endchar
+dfont char=82
+amove 190 0
+aline 333 95
+aline 476 142
+aline 571 142
+aline 714 95
+aline 619 0
+aline 523 47
+aline 380 47
+aline 190 0
+amove 285 47
+aline 380 95
+aline 571 95
+aline 666 47
+amove 476 285
+aline 476 714
+aline 523 809
+aline 571 857
+aline 571 428
+aline 523 333
+aline 476 285
+amove 523 380
+aline 523 761
+amove 571 857
+aline 714 952
+aline 809 1000
+aline 904 952
+aline 952 857
+aline 952 714
+aline 904 619
+aline 857 571
+aline 666 476
+aline 571 428
+amove 666 476
+aline 809 571
+aline 857 666
+aline 857 809
+aline 809 904
+aline 714 952
+amove 809 952
+aline 857 952
+aline 904 857
+aline 904 666
+aline 857 619
+amove 666 476
+aline 761 428
+aline 809 380
+aline 952 142
+aline 1000 95
+aline 1047 95
+aline 952 0
+aline 857 95
+aline 761 380
+aline 666 476
+amove 809 333
+aline 904 142
+aline 1000 47
+amove 285 285
+aline 285 666
+amove 333 761
+aline 285 714
+aline 238 619
+aline 238 571
+aline 142 571
+aline 95 523
+aline 95 428
+aline 142 476
+aline 238 476
+aline 238 190
+aline 285 238
+aline 333 333
+aline 333 761
+amove 380 952
+aline 238 952
+amove 95 904
+aline 190 1000
+aline 333 1000
+aline 428 952
+aline 523 1000
+aline 428 904
+aline 285 904
+aline 190 952
+aline 95 904
+amove 142 523
+aline 285 523
+stroke
+dfont endchar
+dfont char=83
+amove 95 0
+aline 285 47
+aline 523 47
+aline 666 0
+aline 857 285
+aline 1000 476
+aline 1000 571
+aline 952 666
+aline 857 714
+aline 380 714
+aline 238 761
+aline 190 809
+aline 190 904
+amove 190 761
+aline 238 714
+aline 380 666
+aline 809 666
+aline 904 619
+aline 952 571
+aline 952 476
+aline 904 380
+amove 857 285
+aline 904 428
+aline 904 523
+aline 857 571
+aline 761 619
+aline 380 619
+aline 238 666
+aline 190 714
+aline 142 809
+aline 190 904
+aline 238 952
+aline 380 1000
+aline 571 1000
+aline 761 952
+aline 666 857
+aline 571 714
+amove 523 619
+aline 428 476
+amove 380 380
+aline 285 285
+aline 190 238
+aline 142 238
+aline 142 285
+aline 190 238
+amove 190 47
+aline 333 95
+aline 523 95
+aline 666 47
+amove 714 95
+aline 571 142
+aline 428 142
+aline 238 95
+aline 95 0
+amove 142 476
+aline 238 428
+aline 619 428
+aline 666 380
+amove 666 285
+aline 714 380
+aline 714 428
+aline 666 476
+aline 238 476
+aline 142 523
+aline 95 571
+aline 95 523
+aline 142 428
+aline 238 380
+aline 571 380
+aline 666 333
+aline 666 285
+amove 666 857
+aline 619 904
+aline 523 952
+aline 380 1000
+amove 619 952
+aline 714 904
+stroke
+dfont endchar
+dfont char=84
+amove 190 380
+aline 238 238
+aline 333 142
+aline 428 95
+aline 571 47
+aline 714 47
+aline 857 95
+amove 857 142
+aline 857 857
+amove 904 904
+aline 714 904
+aline 523 952
+amove 666 857
+aline 619 809
+aline 523 761
+aline 523 238
+aline 571 285
+aline 619 380
+aline 619 809
+amove 571 761
+aline 571 333
+amove 1047 285
+aline 1000 190
+aline 904 95
+aline 809 47
+aline 666 -1
+aline 523 -1
+aline 380 47
+aline 285 95
+aline 190 238
+aline 142 380
+aline 142 571
+aline 190 714
+aline 238 809
+aline 190 666
+aline 190 476
+aline 238 333
+aline 333 190
+aline 428 142
+aline 571 95
+aline 714 95
+aline 857 142
+aline 952 190
+aline 1047 285
+amove 1047 999
+aline 952 952
+aline 761 952
+aline 476 999
+aline 285 999
+aline 190 952
+aline 142 857
+aline 190 904
+aline 285 952
+aline 428 952
+aline 714 857
+aline 857 857
+aline 952 904
+aline 1047 999
+stroke
+dfont endchar
+dfont char=85
+amove 190 380
+aline 238 238
+aline 380 95
+aline 523 47
+aline 666 47
+amove 714 95
+aline 714 857
+aline 523 809
+aline 476 714
+aline 476 238
+aline 523 285
+aline 571 380
+aline 571 809
+amove 523 761
+aline 523 333
+amove 714 428
+aline 857 428
+amove 857 619
+aline 714 619
+amove 714 857
+aline 809 904
+aline 904 1000
+aline 952 952
+aline 1047 904
+aline 952 857
+aline 952 190
+aline 1000 95
+aline 1047 95
+aline 952 0
+aline 857 95
+aline 761 47
+aline 619 0
+aline 476 0
+aline 333 47
+aline 238 142
+aline 190 238
+aline 142 380
+aline 142 571
+aline 190 714
+aline 238 809
+aline 190 619
+aline 190 476
+aline 238 333
+aline 285 238
+aline 380 142
+aline 523 95
+aline 714 95
+aline 857 142
+aline 857 857
+aline 809 904
+amove 904 857
+aline 952 904
+aline 904 952
+aline 857 904
+aline 904 857
+aline 904 142
+aline 1000 47
+amove 523 1000
+aline 428 952
+aline 285 1000
+aline 190 1000
+aline 95 904
+aline 190 952
+aline 333 904
+aline 428 904
+aline 523 1000
+amove 380 952
+aline 238 952
+stroke
+dfont endchar
+dfont char=86
+amove 142 95
+aline 238 142
+aline 238 476
+aline 142 476
+aline 95 428
+aline 95 523
+aline 142 571
+aline 238 571
+aline 238 857
+aline 190 952
+aline 142 1000
+aline 238 952
+aline 285 904
+aline 333 809
+aline 333 142
+aline 523 142
+aline 666 95
+amove 571 47
+aline 476 95
+aline 333 95
+amove 285 142
+aline 285 809
+aline 238 904
+amove 523 809
+aline 666 857
+aline 761 904
+aline 857 999
+aline 904 952
+aline 1000 904
+aline 904 857
+aline 904 142
+aline 809 142
+aline 666 95
+aline 523 -1
+aline 428 47
+aline 285 95
+aline 142 95
+amove 523 142
+aline 523 809
+amove 523 666
+aline 619 619
+aline 714 619
+aline 809 666
+amove 857 857
+aline 904 904
+aline 857 952
+aline 809 904
+aline 857 857
+aline 857 190
+amove 809 142
+aline 809 857
+aline 761 904
+amove 809 380
+aline 714 428
+aline 619 428
+aline 523 380
+amove 285 523
+aline 142 523
+stroke
+dfont endchar
+dfont char=87
+amove 142 95
+aline 238 142
+aline 238 476
+aline 142 476
+aline 95 428
+aline 95 523
+aline 142 571
+aline 238 571
+aline 238 857
+aline 190 952
+aline 142 1000
+aline 238 952
+aline 285 904
+aline 333 809
+aline 333 142
+aline 476 142
+aline 571 95
+aline 619 142
+aline 619 857
+aline 571 904
+aline 476 904
+aline 619 999
+aline 714 904
+aline 714 142
+aline 857 142
+aline 952 95
+aline 1000 142
+aline 1000 857
+aline 952 904
+aline 857 904
+aline 1000 999
+aline 1095 904
+aline 1095 142
+aline 952 95
+aline 857 -1
+aline 809 95
+aline 714 142
+aline 571 95
+aline 476 -1
+aline 428 47
+aline 285 95
+aline 142 95
+amove 285 142
+aline 285 809
+aline 238 904
+amove 476 904
+aline 476 142
+amove 523 47
+aline 428 95
+aline 333 95
+amove 666 142
+aline 666 904
+aline 619 952
+amove 857 904
+aline 857 142
+amove 857 95
+aline 904 47
+amove 1047 142
+aline 1047 904
+aline 1000 952
+amove 1000 619
+aline 857 619
+amove 857 428
+aline 1000 428
+amove 619 428
+aline 476 428
+amove 476 619
+aline 619 619
+amove 285 523
+aline 142 523
+stroke
+dfont endchar
+dfont char=88
+amove 47 0
+aline 95 95
+aline 190 142
+aline 285 142
+aline 333 95
+amove 285 47
+aline 238 95
+aline 142 95
+amove 47 0
+aline 95 47
+aline 190 47
+aline 285 0
+aline 476 428
+amove 428 523
+aline 238 523
+amove 571 523
+aline 809 523
+amove 571 571
+aline 761 1000
+aline 857 952
+aline 952 952
+aline 1000 1000
+aline 952 904
+aline 857 857
+aline 761 857
+aline 714 904
+amove 761 952
+aline 809 904
+aline 904 904
+amove 285 952
+aline 333 904
+aline 714 95
+aline 761 47
+amove 904 47
+aline 809 47
+aline 761 95
+aline 380 952
+aline 333 1000
+aline 238 1000
+aline 142 952
+aline 47 857
+amove 142 952
+aline 238 952
+aline 285 904
+aline 666 47
+aline 714 0
+aline 809 0
+aline 904 47
+aline 1000 142
+stroke
+dfont endchar
+dfont char=89
+amove 142 95
+aline 238 142
+aline 238 476
+aline 142 476
+aline 95 428
+aline 95 523
+aline 142 571
+aline 238 571
+aline 238 857
+aline 190 952
+aline 142 1000
+aline 238 952
+aline 285 904
+aline 333 809
+aline 333 142
+aline 523 142
+aline 666 95
+amove 571 47
+aline 476 95
+aline 333 95
+amove 285 142
+aline 285 809
+aline 238 904
+amove 523 809
+aline 666 857
+aline 761 904
+aline 857 999
+aline 904 952
+aline 1000 904
+aline 904 857
+aline 904 -143
+aline 857 -239
+aline 761 -334
+aline 666 -286
+aline 476 -239
+aline 238 -239
+aline 428 -191
+aline 714 -191
+aline 857 -239
+amove 809 -286
+aline 714 -239
+aline 571 -239
+amove 523 142
+aline 523 809
+amove 523 666
+aline 619 619
+aline 714 619
+aline 809 666
+amove 857 857
+aline 904 904
+aline 857 952
+aline 809 904
+aline 857 857
+aline 857 95
+amove 809 142
+aline 666 95
+aline 523 -1
+aline 428 47
+aline 285 95
+aline 142 95
+amove 142 523
+aline 285 523
+amove 523 380
+aline 619 428
+aline 714 428
+aline 809 380
+amove 904 0
+aline 809 142
+aline 809 857
+aline 761 904
+stroke
+dfont endchar
+dfont char=90
+amove 95 0
+aline 238 190
+aline 333 380
+aline 476 571
+aline 714 857
+aline 761 952
+aline 666 904
+aline 476 857
+aline 285 857
+aline 95 904
+aline 190 999
+aline 333 952
+aline 619 952
+aline 857 999
+aline 714 809
+aline 619 619
+aline 476 428
+aline 238 142
+aline 190 47
+aline 285 95
+aline 476 142
+aline 666 142
+aline 857 95
+aline 761 -1
+aline 619 47
+aline 333 47
+aline 95 -1
+amove 238 47
+aline 428 95
+aline 619 95
+aline 809 47
+amove 761 523
+aline 571 523
+amove 428 523
+aline 238 523
+amove 285 238
+aline 666 761
+amove 714 952
+aline 523 904
+aline 333 904
+aline 142 952
+stroke
+dfont endchar
+dfont char=91
+amove 190 -334
+aline 190 1190
+aline 523 1190
+amove 238 1190
+aline 238 -334
+amove 190 -334
+aline 523 -334
+stroke
+dfont endchar
+stroke
+dfont endchar
+dfont char=93
+amove 142 -334
+aline 476 -334
+aline 476 1190
+aline 142 1190
+amove 428 1190
+aline 428 -334
+stroke
+dfont endchar
+stroke
+dfont endchar
+stroke
+dfont endchar
+dfont char=96
+amove 238 904
+aline 285 952
+aline 238 1000
+aline 190 952
+aline 190 857
+aline 238 761
+aline 285 714
+stroke
+dfont endchar
+dfont char=97
+amove 142 238
+aline 190 142
+aline 238 95
+aline 333 47
+amove 380 95
+aline 333 95
+aline 238 142
+aline 190 238
+aline 190 333
+amove 285 428
+aline 190 333
+aline 142 238
+aline 142 142
+aline 190 47
+aline 285 0
+aline 380 95
+aline 523 142
+amove 619 47
+aline 571 95
+aline 571 619
+aline 619 571
+aline 476 571
+amove 333 571
+aline 190 571
+aline 238 619
+amove 190 523
+aline 285 523
+aline 428 571
+aline 523 619
+aline 571 666
+aline 666 571
+aline 619 523
+aline 619 142
+aline 666 95
+aline 714 95
+aline 619 0
+aline 523 95
+aline 523 523
+aline 380 571
+aline 285 619
+aline 238 666
+aline 142 571
+aline 380 333
+stroke
+dfont endchar
+dfont char=98
+amove 95 95
+aline 190 142
+aline 190 809
+aline 142 904
+aline 285 1000
+aline 285 142
+aline 380 95
+aline 428 47
+amove 380 47
+aline 238 142
+aline 238 952
+aline 190 904
+aline 238 809
+amove 285 523
+aline 428 571
+aline 523 619
+aline 571 666
+aline 619 619
+aline 714 571
+aline 761 571
+aline 666 523
+aline 666 95
+aline 571 95
+aline 428 47
+aline 333 0
+aline 285 47
+aline 190 95
+aline 95 95
+amove 571 95
+aline 571 523
+aline 476 571
+aline 428 571
+amove 523 619
+aline 619 571
+aline 619 142
+stroke
+dfont endchar
+dfont char=99
+amove 285 0
+aline 238 47
+aline 142 95
+aline 95 95
+aline 190 142
+aline 190 571
+aline 380 619
+aline 476 666
+aline 523 619
+aline 619 571
+aline 666 571
+aline 571 523
+aline 476 523
+aline 380 619
+aline 285 571
+aline 285 142
+aline 380 95
+aline 428 95
+aline 333 47
+aline 285 -1
+amove 333 47
+aline 238 95
+aline 238 571
+amove 428 619
+aline 476 571
+aline 571 571
+stroke
+dfont endchar
+dfont char=100
+amove 95 95
+aline 190 142
+aline 190 571
+aline 333 619
+aline 428 666
+aline 285 571
+aline 285 142
+aline 380 95
+aline 428 47
+amove 380 47
+aline 238 142
+aline 238 571
+amove 333 857
+aline 238 904
+aline 285 952
+aline 333 857
+aline 619 571
+aline 619 142
+amove 666 95
+aline 571 95
+aline 428 47
+aline 333 0
+aline 285 47
+aline 190 95
+aline 95 95
+amove 571 95
+aline 571 523
+aline 190 904
+aline 333 1000
+aline 380 857
+aline 666 571
+aline 666 95
+stroke
+dfont endchar
+dfont char=101
+amove 285 0
+aline 238 47
+aline 142 95
+aline 95 95
+aline 190 142
+aline 190 571
+aline 380 619
+aline 476 666
+aline 619 476
+aline 523 428
+aline 285 285
+amove 333 47
+aline 238 95
+aline 238 571
+amove 285 571
+aline 285 142
+aline 380 95
+aline 428 95
+aline 333 47
+aline 285 0
+amove 523 428
+aline 380 619
+aline 285 571
+amove 428 619
+aline 571 476
+stroke
+dfont endchar
+dfont char=102
+amove 285 0
+aline 238 47
+aline 142 95
+aline 95 95
+aline 190 142
+aline 190 904
+aline 333 952
+aline 428 1000
+aline 476 952
+aline 571 904
+aline 619 904
+aline 523 857
+aline 428 857
+aline 333 952
+aline 285 904
+aline 285 142
+aline 380 95
+aline 428 95
+aline 333 47
+aline 285 -1
+amove 333 47
+aline 238 95
+aline 238 904
+amove 380 952
+aline 428 904
+aline 523 904
+amove 476 666
+aline 285 666
+amove 190 666
+aline 47 666
+stroke
+dfont endchar
+dfont char=103
+amove 190 -239
+aline 285 -239
+aline 380 -286
+aline 428 -334
+aline 523 -286
+aline 619 -191
+aline 666 -48
+aline 666 523
+aline 761 571
+aline 666 571
+aline 571 619
+aline 523 666
+aline 428 619
+aline 285 571
+aline 190 571
+aline 190 142
+aline 95 95
+aline 142 95
+aline 238 47
+aline 285 0
+aline 333 47
+aline 428 95
+aline 571 142
+amove 428 95
+aline 380 95
+aline 285 142
+aline 285 571
+amove 238 523
+aline 238 95
+aline 333 47
+amove 333 -239
+aline 380 -239
+aline 476 -286
+amove 523 -286
+aline 476 -239
+aline 380 -191
+aline 285 -191
+aline 190 -239
+amove 619 -191
+aline 619 -96
+aline 571 47
+aline 571 523
+aline 476 571
+aline 428 619
+amove 476 619
+aline 619 523
+aline 619 -48
+stroke
+dfont endchar
+dfont char=104
+amove 285 0
+aline 238 47
+aline 142 95
+aline 95 95
+aline 190 142
+aline 190 809
+aline 142 904
+aline 285 999
+aline 285 142
+aline 380 95
+aline 285 -1
+amove 333 47
+aline 238 95
+aline 238 952
+aline 190 904
+aline 238 809
+amove 285 523
+aline 428 571
+aline 523 619
+aline 571 666
+aline 619 619
+aline 714 571
+aline 761 571
+aline 666 523
+aline 666 95
+aline 571 -1
+aline 523 -96
+amove 571 -1
+aline 619 95
+aline 619 571
+aline 523 619
+amove 428 571
+aline 476 571
+aline 571 523
+aline 571 95
+aline 523 -96
+aline 523 -239
+aline 571 -334
+aline 619 -334
+aline 523 -239
+stroke
+dfont endchar
+dfont char=105
+amove 285 47
+aline 238 95
+aline 238 523
+aline 190 571
+aline 238 619
+aline 285 571
+aline 238 523
+amove 238 666
+aline 190 619
+aline 95 571
+aline 190 523
+aline 190 95
+aline 285 -1
+aline 380 95
+aline 333 95
+aline 285 142
+aline 285 523
+aline 380 571
+aline 285 619
+aline 238 666
+amove 238 952
+aline 190 904
+aline 285 904
+aline 238 952
+amove 238 1000
+aline 142 904
+aline 238 857
+aline 333 904
+aline 238 1000
+stroke
+dfont endchar
+dfont char=106
+amove 285 0
+aline 238 95
+aline 238 523
+aline 190 571
+aline 238 619
+aline 285 571
+aline 238 523
+amove 238 666
+aline 190 619
+aline 95 571
+aline 190 523
+aline 190 95
+aline 285 -1
+aline 333 -96
+amove 238 -334
+aline 142 -286
+aline 142 -334
+aline 238 -334
+aline 333 -239
+aline 333 -96
+aline 285 95
+aline 285 523
+aline 380 571
+aline 285 619
+aline 238 666
+amove 238 952
+aline 190 904
+aline 285 904
+aline 238 952
+amove 238 1000
+aline 142 904
+aline 238 857
+aline 333 904
+aline 238 1000
+stroke
+dfont endchar
+dfont char=107
+amove 285 0
+aline 238 47
+aline 142 95
+aline 95 95
+aline 190 142
+aline 190 809
+aline 142 904
+aline 285 999
+aline 285 142
+aline 380 95
+aline 285 -1
+amove 333 47
+aline 238 95
+aline 238 952
+aline 190 904
+aline 238 809
+amove 428 619
+aline 523 476
+amove 571 523
+aline 476 619
+amove 476 428
+aline 523 380
+aline 619 142
+aline 666 95
+aline 714 95
+aline 619 -1
+aline 523 95
+aline 476 333
+aline 428 380
+amove 476 380
+aline 523 333
+aline 571 95
+aline 619 47
+amove 285 285
+aline 476 428
+aline 619 523
+aline 523 666
+aline 428 619
+aline 285 523
+stroke
+dfont endchar
+dfont char=108
+amove 285 0
+aline 238 47
+aline 142 95
+aline 95 95
+aline 190 142
+aline 190 809
+aline 142 904
+aline 285 999
+aline 285 142
+aline 380 95
+aline 428 95
+aline 333 47
+aline 285 -1
+amove 333 47
+aline 238 95
+aline 238 952
+aline 190 904
+aline 238 809
+stroke
+dfont endchar
+dfont char=109
+amove 285 0
+aline 238 47
+aline 142 95
+aline 95 95
+aline 190 142
+aline 190 523
+aline 142 571
+aline 95 571
+aline 190 666
+aline 285 571
+aline 285 142
+aline 380 95
+aline 285 0
+amove 333 47
+aline 238 95
+aline 238 571
+aline 190 619
+amove 285 523
+aline 428 571
+aline 523 619
+aline 571 666
+aline 666 571
+aline 666 142
+aline 761 95
+aline 666 0
+aline 619 47
+aline 523 95
+aline 571 142
+aline 571 523
+aline 476 571
+aline 428 571
+amove 523 619
+aline 619 571
+aline 619 95
+aline 714 47
+amove 1047 47
+aline 1000 95
+aline 1000 571
+aline 904 619
+amove 809 571
+aline 857 571
+aline 952 523
+aline 952 95
+aline 1047 0
+aline 1142 95
+aline 1095 95
+aline 1047 142
+aline 1047 523
+aline 1142 571
+aline 1095 571
+aline 1000 619
+aline 952 666
+aline 904 619
+aline 809 571
+aline 666 523
+stroke
+dfont endchar
+dfont char=110
+amove 285 0
+aline 238 47
+aline 142 95
+aline 95 95
+aline 190 142
+aline 190 523
+aline 142 571
+aline 95 571
+aline 190 666
+aline 285 571
+aline 285 142
+aline 380 95
+aline 285 0
+amove 333 47
+aline 238 95
+aline 238 571
+aline 190 619
+amove 285 523
+aline 428 571
+aline 523 619
+aline 571 666
+aline 619 619
+aline 714 571
+aline 761 571
+aline 666 523
+aline 666 142
+aline 714 95
+aline 761 95
+aline 666 0
+aline 571 95
+aline 571 523
+aline 476 571
+aline 428 571
+amove 523 619
+aline 619 571
+aline 619 95
+aline 666 47
+stroke
+dfont endchar
+dfont char=111
+amove 95 95
+aline 190 95
+aline 285 47
+aline 333 0
+aline 428 47
+aline 571 95
+aline 666 95
+aline 666 523
+aline 761 571
+aline 666 571
+aline 571 619
+aline 523 666
+aline 428 619
+aline 285 571
+aline 190 571
+aline 190 142
+aline 95 95
+amove 380 47
+aline 238 142
+aline 238 523
+amove 285 571
+aline 285 142
+aline 380 95
+aline 428 47
+amove 571 95
+aline 571 523
+aline 476 571
+aline 428 619
+amove 476 619
+aline 619 523
+aline 619 142
+stroke
+dfont endchar
+dfont char=112
+amove 238 95
+aline 285 95
+aline 380 47
+amove 428 47
+aline 380 95
+aline 285 142
+aline 285 571
+aline 238 619
+aline 142 666
+aline 190 571
+aline 190 142
+aline 95 95
+aline 190 95
+aline 190 -334
+aline 333 -239
+aline 285 -143
+aline 285 47
+aline 333 0
+aline 428 47
+aline 571 95
+aline 666 95
+aline 666 523
+aline 761 571
+aline 714 571
+aline 619 619
+aline 571 666
+aline 523 619
+aline 428 571
+aline 285 523
+amove 190 619
+aline 238 571
+aline 238 -286
+aline 285 -239
+aline 238 -143
+amove 571 95
+aline 571 523
+aline 476 571
+aline 428 571
+amove 523 619
+aline 619 571
+aline 619 142
+stroke
+dfont endchar
+dfont char=113
+amove 95 95
+aline 142 95
+aline 238 47
+aline 285 0
+aline 333 47
+aline 428 95
+aline 571 142
+amove 428 95
+aline 380 95
+aline 285 142
+aline 285 571
+amove 238 523
+aline 238 95
+aline 333 47
+amove 95 95
+aline 190 142
+aline 190 571
+aline 285 571
+aline 428 619
+aline 523 666
+aline 571 619
+aline 666 571
+aline 761 571
+aline 666 523
+aline 666 -334
+aline 523 -239
+aline 571 -143
+aline 571 523
+aline 476 571
+aline 428 619
+amove 476 619
+aline 619 523
+aline 619 -286
+aline 571 -239
+aline 619 -143
+stroke
+dfont endchar
+dfont char=114
+amove 285 0
+aline 238 47
+aline 142 95
+aline 95 95
+aline 190 142
+aline 190 523
+aline 142 571
+aline 95 571
+aline 190 666
+aline 285 571
+aline 285 142
+aline 380 95
+aline 428 95
+aline 333 47
+aline 285 0
+amove 333 47
+aline 238 95
+aline 238 571
+aline 142 619
+amove 285 571
+aline 476 666
+aline 523 619
+aline 619 571
+aline 666 571
+aline 571 523
+aline 476 523
+aline 380 619
+amove 428 619
+aline 476 571
+aline 571 571
+stroke
+dfont endchar
+dfont char=115
+amove 95 0
+aline 238 95
+aline 380 95
+aline 476 47
+aline 523 95
+aline 523 285
+aline 428 333
+amove 333 333
+aline 238 380
+aline 238 571
+aline 285 619
+aline 380 571
+aline 476 571
+aline 571 619
+amove 619 666
+aline 571 619
+aline 476 619
+aline 380 666
+aline 285 619
+aline 142 571
+aline 142 380
+aline 238 333
+aline 523 333
+aline 619 285
+aline 619 95
+aline 476 47
+aline 380 0
+aline 285 47
+aline 190 47
+aline 95 0
+aline 238 190
+aline 476 428
+aline 571 571
+aline 619 666
+amove 428 619
+aline 333 619
+amove 190 571
+aline 190 380
+amove 333 47
+aline 428 47
+amove 571 95
+aline 571 285
+stroke
+dfont endchar
+dfont char=116
+amove 285 0
+aline 238 47
+aline 142 95
+aline 95 95
+aline 190 142
+aline 190 809
+aline 142 904
+aline 285 999
+aline 285 142
+aline 380 95
+aline 428 95
+aline 333 47
+aline 285 -1
+amove 333 47
+aline 238 95
+aline 238 952
+aline 190 904
+aline 238 809
+amove 190 666
+aline 47 666
+amove 285 666
+aline 428 666
+stroke
+dfont endchar
+dfont char=117
+amove 95 95
+aline 190 142
+aline 190 523
+aline 142 571
+aline 95 571
+aline 190 666
+aline 285 571
+aline 285 142
+aline 380 95
+aline 428 95
+amove 333 47
+aline 238 95
+aline 238 571
+aline 142 619
+amove 523 619
+aline 619 571
+aline 619 95
+aline 666 47
+amove 761 95
+aline 714 95
+aline 666 142
+aline 666 523
+aline 761 571
+aline 714 571
+aline 619 619
+aline 571 666
+aline 476 571
+aline 571 523
+aline 571 95
+aline 666 0
+aline 761 95
+amove 571 142
+aline 428 95
+aline 333 47
+aline 285 0
+aline 238 47
+aline 142 95
+aline 95 95
+stroke
+dfont endchar
+dfont char=118
+amove 380 47
+aline 238 142
+aline 238 571
+aline 190 619
+amove 142 666
+aline 238 619
+aline 285 571
+aline 285 190
+aline 333 142
+aline 428 95
+amove 571 142
+aline 571 523
+aline 476 571
+aline 571 666
+aline 619 619
+aline 714 571
+aline 761 571
+aline 666 523
+aline 666 142
+aline 571 142
+aline 428 95
+aline 333 -1
+aline 190 142
+aline 190 571
+aline 142 666
+amove 523 619
+aline 619 571
+aline 619 190
+stroke
+dfont endchar
+dfont char=119
+amove 380 47
+aline 238 142
+aline 238 571
+aline 190 619
+amove 142 666
+aline 190 571
+aline 190 142
+aline 333 0
+aline 428 95
+aline 571 142
+amove 428 95
+aline 333 142
+aline 285 190
+aline 285 571
+aline 238 619
+aline 142 666
+amove 523 619
+aline 619 571
+aline 619 142
+aline 761 47
+amove 809 95
+aline 714 142
+aline 666 190
+aline 666 523
+aline 714 571
+aline 619 619
+aline 571 666
+aline 476 571
+aline 571 523
+aline 571 142
+aline 714 0
+aline 809 95
+aline 952 142
+aline 1047 142
+aline 1047 523
+aline 1142 571
+aline 1095 571
+aline 1000 619
+aline 952 666
+aline 857 571
+aline 952 523
+aline 952 142
+amove 1000 190
+aline 1000 571
+aline 904 619
+stroke
+dfont endchar
+dfont char=120
+amove 95 0
+aline 142 47
+aline 238 47
+aline 285 0
+aline 428 285
+amove 380 333
+aline 238 333
+amove 476 380
+aline 619 666
+aline 666 619
+aline 761 619
+aline 809 666
+aline 761 571
+aline 666 523
+aline 571 571
+amove 619 619
+aline 666 571
+aline 714 571
+amove 666 333
+aline 523 333
+amove 333 95
+aline 238 142
+aline 142 95
+aline 95 0
+amove 190 95
+aline 238 95
+aline 285 47
+amove 666 47
+aline 571 95
+aline 333 571
+aline 238 619
+amove 142 571
+aline 190 571
+aline 285 523
+aline 333 476
+aline 523 95
+aline 571 47
+aline 666 0
+aline 761 95
+aline 714 95
+aline 619 142
+aline 571 190
+aline 380 571
+aline 333 619
+aline 238 666
+aline 142 571
+stroke
+dfont endchar
+dfont char=121
+amove 95 95
+aline 190 142
+aline 190 523
+aline 142 571
+aline 95 571
+aline 190 666
+aline 285 571
+aline 285 142
+aline 380 95
+aline 428 95
+amove 333 47
+aline 238 95
+aline 238 571
+aline 142 619
+amove 523 619
+aline 619 571
+aline 619 -48
+amove 619 -191
+aline 619 -96
+aline 571 47
+aline 571 523
+aline 476 571
+aline 571 666
+aline 619 619
+aline 714 571
+aline 761 571
+aline 666 523
+aline 666 -48
+aline 619 -191
+aline 523 -286
+aline 428 -334
+aline 380 -286
+aline 285 -239
+aline 190 -239
+aline 285 -191
+aline 380 -191
+aline 476 -239
+aline 523 -286
+amove 476 -286
+aline 380 -239
+aline 333 -239
+amove 95 95
+aline 142 95
+aline 238 47
+aline 285 -1
+aline 333 47
+aline 428 95
+aline 571 142
+stroke
+dfont endchar
+dfont char=122
+amove 142 0
+aline 714 666
+aline 523 619
+aline 333 619
+aline 238 666
+aline 142 571
+aline 238 523
+aline 380 523
+aline 523 571
+aline 714 666
+amove 476 571
+aline 285 571
+aline 190 619
+amove 238 333
+aline 619 333
+amove 714 95
+aline 619 142
+aline 476 142
+aline 333 95
+aline 142 0
+aline 333 47
+aline 523 47
+aline 619 0
+aline 714 95
+amove 666 47
+aline 571 95
+aline 380 95
+stroke
+dfont endchar
+dfont char=123
+amove 380 238
+aline 333 95
+aline 333 -96
+aline 380 -239
+amove 476 -334
+aline 333 -191
+aline 285 -48
+aline 285 47
+aline 333 190
+aline 428 285
+aline 428 333
+aline 238 428
+aline 428 523
+aline 428 571
+aline 333 666
+aline 285 809
+aline 285 904
+aline 333 1047
+aline 476 1190
+amove 380 1095
+aline 333 952
+aline 333 761
+aline 380 619
+stroke
+dfont endchar
+dfont char=124
+amove 380 428
+aline 380 1000
+aline 333 952
+aline 428 476
+aline 380 428
+aline 333 476
+aline 428 952
+aline 380 1000
+amove 142 857
+aline 619 571
+aline 571 571
+aline 190 857
+aline 142 857
+aline 142 809
+aline 619 619
+aline 619 571
+amove 619 857
+aline 142 571
+aline 190 571
+aline 571 857
+aline 619 857
+aline 619 809
+aline 142 619
+aline 142 571
+stroke
+dfont endchar
+dfont char=125
+amove 238 -334
+aline 380 -191
+aline 428 -48
+aline 428 47
+aline 380 190
+aline 285 285
+aline 285 333
+aline 476 428
+aline 285 523
+aline 285 571
+aline 380 666
+aline 428 809
+aline 428 904
+aline 380 1047
+aline 238 1190
+amove 333 1095
+aline 380 952
+aline 380 761
+aline 333 619
+amove 333 238
+aline 380 95
+aline 380 -96
+aline 333 -239
+stroke
+dfont endchar
+dfont char=126
+amove 190 238
+aline 333 47
+amove 380 47
+aline 190 285
+amove 428 523
+aline 142 238
+aline 333 0
+aline 619 285
+amove 666 333
+aline 952 619
+aline 1000 571
+aline 1047 571
+aline 1095 619
+aline 1047 523
+aline 1000 476
+aline 952 476
+aline 904 523
+amove 904 571
+aline 952 523
+aline 1047 523
+amove 1095 142
+aline 1047 47
+aline 1000 0
+aline 904 0
+aline 809 47
+aline 714 142
+aline 523 428
+aline 238 714
+aline 476 1000
+aline 666 761
+aline 476 571
+amove 619 714
+aline 428 952
+amove 476 952
+aline 619 761
+amove 285 761
+aline 571 476
+aline 761 190
+aline 809 142
+aline 904 95
+aline 1047 95
+aline 1095 142
+amove 1047 47
+aline 904 47
+aline 809 95
+aline 714 190
+aline 523 476
+aline 285 714
+stroke
+dfont endchar
diff --git a/src/fonts/plgg.afm b/src/fonts/plgg.afm
new file mode 100644
index 0000000..394beb0
--- /dev/null
+++ b/src/fonts/plgg.afm
@@ -0,0 +1,115 @@
+StartFontMetrics 2.0
+Comment Made from HERSHEY font file using SPLITFONT.BAS
+FontName plGG
+EncodingScheme TEXENCODING
+FullName plGG
+FamilyName plGG
+Weight Medium
+ItalicAngle 0
+IsFixedPitch false
+UnderlinePosition -97
+UnderlineThickness 73
+FontBBox 0 -400 1001 1001
+CapHeight 729
+XHeight 151
+Descender -219
+Ascender 729
+StartCharMetrics 95
+C 32 ; WX 400 ; N C32 ; B 0 0 0 0 ;
+C 33 ; WX 384 ; N C33 ; B 99 0 299 700 ;
+C 34 ; WX 384 ; N C34 ; B 133 466 233 700 ;
+C 35 ; WX 300 ; N C35 ; B 0 0 0 0 ;
+C 36 ; WX 651 ; N C36 ; B 99 -133 566 833 ;
+C 37 ; WX 784 ; N C37 ; B 99 0 700 700 ;
+C 38 ; WX 300 ; N C38 ; B 0 0 0 0 ;
+C 39 ; WX 384 ; N C39 ; B 166 466 266 700 ;
+C 40 ; WX 451 ; N C40 ; B 99 -233 333 833 ;
+C 41 ; WX 451 ; N C41 ; B 133 -233 366 833 ;
+C 42 ; WX 585 ; N C42 ; B 133 466 500 700 ;
+C 43 ; WX 818 ; N C43 ; B 133 32 700 600 ;
+C 44 ; WX 384 ; N C44 ; B 133 -133 233 99 ;
+C 45 ; WX 818 ; N C45 ; B 133 299 700 333 ;
+C 46 ; WX 384 ; N C46 ; B 133 0 266 99 ;
+C 47 ; WX 751 ; N C47 ; B 66 -233 700 833 ;
+C 48 ; WX 651 ; N C48 ; B 66 0 600 700 ;
+C 49 ; WX 651 ; N C49 ; B 233 0 466 700 ;
+C 50 ; WX 651 ; N C50 ; B 99 0 600 700 ;
+C 51 ; WX 651 ; N C51 ; B 99 0 532 700 ;
+C 52 ; WX 651 ; N C52 ; B 99 0 633 700 ;
+C 53 ; WX 651 ; N C53 ; B 99 0 600 700 ;
+C 54 ; WX 651 ; N C54 ; B 66 0 600 700 ;
+C 55 ; WX 651 ; N C55 ; B 99 0 600 700 ;
+C 56 ; WX 651 ; N C56 ; B 66 0 600 700 ;
+C 57 ; WX 651 ; N C57 ; B 66 0 600 700 ;
+C 58 ; WX 384 ; N C58 ; B 133 0 266 466 ;
+C 59 ; WX 384 ; N C59 ; B 133 -133 266 466 ;
+C 60 ; WX 784 ; N C60 ; B 133 0 666 600 ;
+C 61 ; WX 818 ; N C61 ; B 133 166 700 466 ;
+C 62 ; WX 784 ; N C62 ; B 133 0 666 600 ;
+C 63 ; WX 585 ; N C63 ; B 99 0 500 700 ;
+C 64 ; WX 884 ; N C64 ; B 99 0 799 700 ;
+C 65 ; WX 784 ; N C65 ; B 66 0 733 700 ;
+C 66 ; WX 851 ; N C66 ; B 66 0 766 700 ;
+C 67 ; WX 784 ; N C67 ; B 99 0 700 700 ;
+C 68 ; WX 851 ; N C68 ; B 99 0 766 700 ;
+C 69 ; WX 784 ; N C69 ; B 99 0 733 700 ;
+C 70 ; WX 784 ; N C70 ; B 99 -100 733 700 ;
+C 71 ; WX 851 ; N C71 ; B 99 0 799 700 ;
+C 72 ; WX 818 ; N C72 ; B 66 -133 733 700 ;
+C 73 ; WX 818 ; N C73 ; B 99 -100 733 700 ;
+C 74 ; WX 818 ; N C74 ; B 99 -100 733 700 ;
+C 75 ; WX 851 ; N C75 ; B 66 0 766 700 ;
+C 76 ; WX 751 ; N C76 ; B 99 0 666 700 ;
+C 77 ; WX 1051 ; N C77 ; B 99 0 1000 700 ;
+C 78 ; WX 918 ; N C78 ; B 99 0 833 700 ;
+C 79 ; WX 918 ; N C79 ; B 99 0 799 700 ;
+C 80 ; WX 884 ; N C80 ; B 99 -133 766 700 ;
+C 81 ; WX 918 ; N C81 ; B 99 0 866 700 ;
+C 82 ; WX 918 ; N C82 ; B 66 0 833 700 ;
+C 83 ; WX 884 ; N C83 ; B 99 0 799 700 ;
+C 84 ; WX 818 ; N C84 ; B 99 0 733 700 ;
+C 85 ; WX 718 ; N C85 ; B 66 0 666 699 ;
+C 86 ; WX 918 ; N C86 ; B 99 0 799 700 ;
+C 87 ; WX 1085 ; N C87 ; B 99 0 966 700 ;
+C 88 ; WX 784 ; N C88 ; B 99 0 700 700 ;
+C 89 ; WX 851 ; N C89 ; B 99 -133 733 700 ;
+C 90 ; WX 784 ; N C90 ; B 66 -133 666 700 ;
+C 91 ; WX 451 ; N C91 ; B 133 -233 366 833 ;
+C 92 ; WX 300 ; N C92 ; B 0 0 0 0 ;
+C 93 ; WX 451 ; N C93 ; B 99 -233 333 833 ;
+C 94 ; WX 300 ; N C94 ; B 0 0 0 0 ;
+C 95 ; WX 300 ; N C95 ; B 0 0 0 0 ;
+C 96 ; WX 318 ; N C96 ; B 133 500 199 700 ;
+C 97 ; WX 551 ; N C97 ; B 99 0 532 466 ;
+C 98 ; WX 551 ; N C98 ; B 66 0 466 700 ;
+C 99 ; WX 418 ; N C99 ; B 99 0 366 466 ;
+C 100 ; WX 551 ; N C100 ; B 99 0 466 700 ;
+C 101 ; WX 418 ; N C101 ; B 99 0 366 466 ;
+C 102 ; WX 418 ; N C102 ; B 66 -167 399 700 ;
+C 103 ; WX 551 ; N C103 ; B 99 -167 466 466 ;
+C 104 ; WX 551 ; N C104 ; B 66 -167 466 700 ;
+C 105 ; WX 318 ; N C105 ; B 32 0 299 700 ;
+C 106 ; WX 318 ; N C106 ; B 0 -167 266 700 ;
+C 107 ; WX 451 ; N C107 ; B 99 0 399 700 ;
+C 108 ; WX 318 ; N C108 ; B 66 0 333 700 ;
+C 109 ; WX 851 ; N C109 ; B 32 0 833 466 ;
+C 110 ; WX 585 ; N C110 ; B 32 0 566 466 ;
+C 111 ; WX 551 ; N C111 ; B 99 0 466 466 ;
+C 112 ; WX 551 ; N C112 ; B 66 -167 466 566 ;
+C 113 ; WX 551 ; N C113 ; B 99 -167 466 466 ;
+C 114 ; WX 451 ; N C114 ; B 66 0 399 466 ;
+C 115 ; WX 351 ; N C115 ; B 66 -167 399 700 ;
+C 116 ; WX 384 ; N C116 ; B 66 0 333 600 ;
+C 117 ; WX 585 ; N C117 ; B 32 0 566 466 ;
+C 118 ; WX 551 ; N C118 ; B 99 0 466 532 ;
+C 119 ; WX 818 ; N C119 ; B 99 0 733 532 ;
+C 120 ; WX 485 ; N C120 ; B 66 -167 433 466 ;
+C 121 ; WX 551 ; N C121 ; B 99 -167 466 532 ;
+C 122 ; WX 451 ; N C122 ; B 99 -167 399 466 ;
+C 123 ; WX 485 ; N C123 ; B 166 -233 333 833 ;
+C 124 ; WX 518 ; N C124 ; B 99 299 433 700 ;
+C 125 ; WX 485 ; N C125 ; B 166 -233 333 833 ;
+C 126 ; WX 851 ; N C126 ; B 99 0 766 700 ;
+EndCharMetrics
+
+EndFontMetrics
diff --git a/src/fonts/plgg.gle b/src/fonts/plgg.gle
new file mode 100644
index 0000000..5c6a9ee
--- /dev/null
+++ b/src/fonts/plgg.gle
@@ -0,0 +1,4055 @@
+dfont design= 1428
+dfont char=33
+amove 285 95
+aline 238 47
+aline 333 47
+aline 285 95
+amove 285 142
+aline 190 47
+aline 285 0
+aline 380 47
+aline 285 142
+amove 285 333
+aline 285 857
+aline 238 904
+aline 285 952
+aline 333 904
+aline 285 857
+amove 285 1000
+aline 238 952
+aline 142 904
+aline 238 857
+aline 285 333
+aline 333 857
+aline 428 904
+aline 333 952
+aline 285 1000
+stroke
+dfont endchar
+dfont char=34
+amove 190 666
+aline 285 714
+aline 333 809
+aline 333 904
+aline 285 1000
+aline 190 904
+aline 285 809
+aline 285 714
+amove 285 952
+aline 238 904
+aline 285 857
+aline 285 952
+stroke
+dfont endchar
+stroke
+dfont endchar
+dfont char=36
+amove 238 95
+aline 190 190
+amove 380 0
+aline 285 47
+aline 238 142
+aline 238 238
+aline 142 190
+aline 190 95
+aline 238 47
+aline 380 0
+aline 571 0
+aline 714 47
+aline 761 95
+aline 809 190
+aline 809 333
+aline 761 428
+aline 619 523
+aline 333 619
+aline 238 666
+aline 190 761
+aline 190 857
+aline 238 952
+amove 190 714
+aline 238 619
+aline 333 571
+aline 619 476
+aline 714 428
+aline 761 333
+amove 714 47
+aline 761 142
+aline 761 285
+aline 714 380
+aline 619 428
+aline 333 523
+aline 190 619
+aline 142 714
+aline 142 857
+aline 238 952
+aline 380 1000
+aline 571 1000
+aline 714 952
+aline 761 904
+aline 809 809
+aline 714 761
+aline 714 857
+aline 666 952
+aline 571 1000
+amove 714 904
+aline 761 809
+amove 571 1190
+aline 571 -191
+amove 380 -191
+aline 380 1190
+stroke
+dfont endchar
+dfont char=37
+amove 142 0
+aline 1000 1000
+aline 904 952
+aline 761 904
+aline 619 904
+aline 476 952
+aline 380 1000
+aline 285 1000
+aline 190 952
+aline 142 857
+aline 142 761
+aline 238 666
+aline 333 666
+aline 428 714
+aline 476 809
+aline 476 904
+aline 380 1000
+amove 809 333
+aline 714 285
+aline 666 190
+aline 666 95
+aline 761 0
+aline 857 0
+aline 952 47
+aline 1000 142
+aline 1000 238
+aline 904 333
+aline 809 333
+stroke
+dfont endchar
+stroke
+dfont endchar
+dfont char=39
+amove 285 809
+aline 285 714
+aline 333 761
+aline 285 809
+amove 285 952
+aline 285 857
+aline 380 761
+aline 285 666
+aline 238 761
+aline 238 857
+aline 285 952
+aline 380 1000
+stroke
+dfont endchar
+dfont char=40
+amove 285 -48
+aline 238 95
+aline 190 285
+aline 190 571
+aline 238 761
+aline 285 904
+amove 380 1095
+aline 333 1000
+aline 285 857
+aline 238 571
+aline 238 285
+aline 285 0
+aline 333 -143
+aline 380 -239
+amove 476 -334
+aline 380 -239
+aline 285 -96
+aline 190 95
+aline 142 333
+aline 142 523
+aline 190 761
+aline 285 952
+aline 380 1095
+aline 476 1190
+stroke
+dfont endchar
+dfont char=41
+amove 285 -239
+aline 333 -143
+aline 380 0
+aline 428 285
+aline 428 571
+aline 380 857
+aline 333 1000
+aline 285 1095
+amove 190 1190
+aline 285 1095
+aline 380 952
+aline 476 761
+aline 523 523
+aline 523 333
+aline 476 95
+aline 380 -96
+aline 285 -239
+aline 190 -334
+amove 380 -48
+aline 428 95
+aline 476 285
+aline 476 571
+aline 428 761
+aline 380 904
+stroke
+dfont endchar
+dfont char=42
+amove 190 666
+aline 238 952
+amove 238 1000
+aline 190 952
+aline 190 666
+aline 285 952
+aline 238 1000
+amove 666 1000
+aline 619 952
+aline 619 666
+aline 666 952
+amove 666 1000
+aline 714 952
+aline 619 666
+stroke
+dfont endchar
+dfont char=43
+amove 190 476
+aline 1000 476
+aline 1000 428
+aline 190 428
+aline 190 476
+amove 571 857
+aline 571 47
+aline 619 47
+aline 619 857
+aline 571 857
+stroke
+dfont endchar
+dfont char=44
+amove 190 -191
+aline 285 -143
+aline 333 -48
+aline 333 47
+aline 285 142
+aline 190 47
+aline 285 -48
+aline 285 -143
+amove 285 95
+aline 238 47
+aline 285 0
+aline 285 95
+stroke
+dfont endchar
+dfont char=45
+amove 190 476
+aline 1000 476
+aline 1000 428
+aline 190 428
+aline 190 476
+stroke
+dfont endchar
+dfont char=46
+amove 285 142
+aline 190 47
+aline 285 0
+aline 380 47
+aline 285 142
+amove 285 95
+aline 238 47
+aline 333 47
+aline 285 95
+stroke
+dfont endchar
+dfont char=47
+amove 142 -334
+aline 95 -334
+aline 952 1190
+aline 1000 1190
+aline 142 -334
+stroke
+dfont endchar
+dfont char=48
+amove 95 95
+aline 190 142
+aline 190 904
+aline 285 904
+aline 523 952
+aline 619 1000
+aline 666 952
+aline 761 904
+aline 857 904
+aline 761 857
+aline 761 95
+aline 666 95
+aline 428 47
+aline 333 0
+aline 285 47
+aline 190 95
+aline 95 95
+amove 380 47
+aline 238 142
+aline 238 857
+amove 285 904
+aline 285 142
+aline 380 95
+aline 428 47
+amove 666 95
+aline 666 857
+aline 571 904
+aline 523 952
+amove 571 952
+aline 714 857
+aline 714 142
+stroke
+dfont endchar
+dfont char=49
+amove 333 95
+aline 428 142
+aline 428 761
+aline 380 857
+aline 333 904
+aline 476 1000
+aline 523 904
+aline 523 142
+aline 619 95
+aline 666 95
+aline 571 47
+aline 523 0
+aline 476 47
+aline 380 95
+aline 333 95
+amove 571 47
+aline 476 95
+aline 476 857
+aline 428 952
+aline 380 904
+aline 428 857
+stroke
+dfont endchar
+dfont char=50
+amove 142 0
+aline 142 238
+aline 190 380
+aline 285 476
+aline 428 523
+aline 761 523
+aline 761 904
+aline 666 904
+aline 523 952
+aline 428 1000
+aline 380 952
+aline 285 904
+aline 190 904
+aline 285 857
+aline 380 857
+aline 476 904
+aline 523 952
+amove 476 952
+aline 380 904
+amove 666 904
+aline 666 523
+amove 714 571
+aline 714 857
+amove 857 95
+aline 666 142
+aline 523 142
+aline 333 95
+aline 142 -1
+aline 380 47
+aline 619 47
+aline 761 -1
+aline 857 95
+amove 809 47
+aline 666 95
+aline 428 95
+aline 285 47
+stroke
+dfont endchar
+dfont char=51
+amove 142 95
+aline 238 95
+aline 333 47
+aline 380 0
+aline 476 47
+aline 666 95
+aline 761 95
+aline 761 428
+aline 666 428
+aline 523 476
+aline 428 523
+amove 428 476
+aline 523 523
+aline 666 571
+aline 761 571
+aline 761 904
+aline 666 904
+aline 476 952
+aline 380 1000
+aline 333 952
+aline 238 904
+aline 190 904
+aline 285 857
+aline 380 857
+aline 476 952
+amove 428 952
+aline 333 904
+amove 666 904
+aline 666 571
+amove 714 619
+aline 714 857
+amove 666 428
+aline 666 95
+amove 714 142
+aline 714 380
+amove 476 47
+aline 428 95
+aline 333 142
+aline 238 142
+aline 142 95
+amove 333 95
+aline 428 47
+stroke
+dfont endchar
+dfont char=52
+amove 238 285
+aline 238 619
+amove 190 523
+aline 190 333
+amove 476 95
+aline 523 95
+aline 619 47
+aline 666 0
+aline 714 47
+aline 809 95
+aline 761 95
+aline 666 142
+aline 666 809
+aline 714 904
+aline 619 1000
+aline 142 523
+aline 142 285
+aline 571 285
+amove 666 285
+aline 857 285
+aline 904 238
+aline 904 333
+aline 857 285
+amove 714 47
+aline 619 95
+aline 619 952
+aline 666 904
+aline 619 809
+amove 571 952
+aline 571 142
+aline 476 95
+stroke
+dfont endchar
+dfont char=53
+amove 142 95
+aline 238 95
+aline 333 47
+aline 380 0
+aline 476 47
+aline 666 95
+aline 761 95
+aline 761 571
+aline 857 619
+aline 809 619
+aline 714 666
+aline 666 714
+aline 619 666
+aline 523 619
+aline 333 571
+aline 190 571
+aline 190 1000
+aline 761 1000
+aline 714 952
+aline 619 904
+aline 190 904
+amove 238 952
+aline 666 952
+amove 619 666
+aline 714 619
+aline 714 142
+amove 666 95
+aline 666 571
+aline 571 619
+aline 523 619
+amove 333 95
+aline 428 47
+amove 476 47
+aline 428 95
+aline 333 142
+aline 238 142
+aline 142 95
+stroke
+dfont endchar
+dfont char=54
+amove 95 95
+aline 190 142
+aline 190 904
+aline 285 904
+aline 476 952
+aline 571 1000
+aline 619 952
+aline 714 904
+aline 761 904
+aline 666 857
+aline 571 857
+aline 476 952
+amove 523 952
+aline 619 904
+amove 666 666
+aline 714 619
+aline 809 571
+aline 857 571
+aline 761 523
+aline 761 95
+aline 666 95
+aline 428 47
+aline 333 0
+aline 285 47
+aline 190 95
+aline 95 95
+amove 380 47
+aline 238 142
+aline 238 857
+amove 285 904
+aline 285 142
+aline 380 95
+aline 428 47
+amove 666 95
+aline 666 523
+aline 571 571
+aline 523 571
+amove 619 619
+aline 714 523
+aline 714 142
+amove 666 666
+aline 619 619
+aline 523 571
+aline 333 523
+aline 285 523
+stroke
+dfont endchar
+dfont char=55
+amove 428 0
+aline 380 142
+aline 380 285
+aline 428 428
+aline 523 571
+aline 714 761
+aline 809 904
+aline 857 1000
+aline 666 904
+aline 476 857
+aline 333 857
+aline 142 904
+aline 238 1000
+aline 380 952
+aline 619 952
+aline 857 1000
+amove 714 952
+aline 571 904
+aline 333 904
+aline 190 952
+amove 619 666
+aline 523 523
+aline 476 380
+aline 476 238
+aline 523 95
+aline 428 -1
+amove 476 47
+aline 428 190
+aline 428 333
+aline 476 476
+stroke
+dfont endchar
+dfont char=56
+amove 95 95
+aline 190 142
+aline 190 428
+aline 285 428
+aline 666 571
+aline 761 571
+aline 761 857
+aline 857 904
+aline 809 904
+aline 714 952
+aline 666 1000
+aline 619 952
+aline 523 904
+aline 285 857
+aline 190 857
+aline 190 571
+aline 285 571
+aline 666 428
+aline 761 428
+aline 761 95
+aline 666 95
+aline 428 47
+aline 333 0
+aline 285 47
+aline 190 95
+aline 95 95
+amove 380 47
+aline 238 142
+aline 238 380
+amove 285 428
+aline 285 142
+aline 380 95
+aline 428 47
+amove 666 95
+aline 666 428
+amove 714 380
+aline 714 142
+amove 666 571
+aline 666 857
+aline 571 904
+aline 523 904
+amove 619 952
+aline 714 904
+aline 714 619
+amove 285 571
+aline 285 857
+amove 238 809
+aline 238 619
+stroke
+dfont endchar
+dfont char=57
+amove 142 95
+aline 238 95
+aline 333 47
+aline 380 0
+aline 476 47
+aline 666 95
+aline 761 95
+aline 761 857
+aline 857 904
+aline 761 904
+aline 666 952
+aline 619 1000
+aline 523 952
+aline 285 904
+aline 190 904
+aline 190 476
+aline 95 428
+aline 142 428
+aline 238 380
+aline 285 333
+aline 333 380
+aline 428 428
+aline 619 476
+aline 666 476
+amove 428 428
+aline 380 428
+aline 285 476
+aline 285 904
+amove 238 857
+aline 238 428
+aline 333 380
+amove 333 95
+aline 428 47
+amove 476 47
+aline 428 95
+aline 333 142
+aline 238 142
+aline 142 95
+amove 666 95
+aline 666 857
+aline 571 904
+aline 523 952
+amove 571 952
+aline 714 857
+aline 714 142
+stroke
+dfont endchar
+dfont char=58
+amove 285 666
+aline 190 571
+aline 285 523
+aline 380 571
+aline 285 666
+amove 285 619
+aline 238 571
+aline 333 571
+aline 285 619
+amove 285 142
+aline 190 47
+aline 285 -1
+aline 380 47
+aline 285 142
+amove 285 95
+aline 238 47
+aline 333 47
+aline 285 95
+stroke
+dfont endchar
+dfont char=59
+amove 190 -191
+aline 285 -143
+aline 333 -48
+aline 333 47
+aline 285 142
+aline 190 47
+aline 285 -48
+aline 285 -143
+amove 285 95
+aline 238 47
+aline 285 0
+aline 285 95
+amove 285 619
+aline 238 571
+aline 333 571
+aline 285 619
+amove 285 666
+aline 190 571
+aline 285 523
+aline 380 571
+aline 285 666
+stroke
+dfont endchar
+dfont char=60
+amove 952 857
+aline 190 428
+aline 952 0
+stroke
+dfont endchar
+dfont char=61
+amove 190 285
+aline 1000 285
+aline 1000 238
+aline 190 238
+aline 190 285
+amove 190 666
+aline 1000 666
+aline 1000 619
+aline 190 619
+aline 190 666
+stroke
+dfont endchar
+dfont char=62
+amove 190 0
+aline 952 428
+aline 190 857
+stroke
+dfont endchar
+dfont char=63
+amove 428 95
+aline 380 47
+aline 476 47
+aline 428 95
+amove 428 142
+aline 333 47
+aline 428 0
+aline 523 47
+aline 428 142
+amove 428 333
+aline 380 476
+aline 476 476
+aline 428 333
+aline 428 476
+amove 476 476
+aline 571 523
+aline 666 619
+aline 714 714
+aline 714 809
+aline 666 904
+aline 619 952
+aline 476 1000
+aline 380 1000
+aline 238 952
+aline 190 904
+aline 142 809
+aline 238 761
+aline 238 857
+aline 285 952
+aline 380 1000
+amove 476 1000
+aline 571 952
+aline 619 857
+aline 619 666
+aline 571 571
+aline 476 476
+amove 619 619
+aline 666 666
+aline 666 857
+aline 619 904
+amove 238 904
+aline 190 809
+stroke
+dfont endchar
+dfont char=64
+amove 523 238
+aline 476 285
+aline 428 380
+aline 428 523
+aline 476 666
+aline 571 761
+amove 857 761
+aline 809 380
+aline 809 285
+aline 904 238
+aline 999 238
+aline 1095 333
+aline 1142 476
+aline 1142 571
+aline 1095 714
+aline 1047 809
+aline 952 904
+aline 857 952
+aline 714 1000
+aline 571 1000
+aline 428 952
+aline 333 904
+aline 238 809
+aline 190 714
+aline 142 571
+aline 142 428
+aline 190 285
+aline 238 190
+aline 333 95
+aline 428 47
+aline 571 0
+aline 714 0
+aline 857 47
+aline 952 95
+aline 1000 142
+amove 904 238
+aline 857 285
+aline 857 380
+aline 904 761
+amove 857 619
+aline 809 714
+aline 714 761
+aline 571 761
+aline 476 714
+aline 428 666
+aline 380 523
+aline 380 380
+aline 428 285
+aline 523 238
+aline 666 238
+aline 761 285
+aline 809 380
+stroke
+dfont endchar
+dfont char=65
+amove 142 238
+aline 285 285
+aline 380 333
+aline 476 428
+aline 523 571
+aline 523 761
+aline 476 904
+aline 428 952
+aline 333 1000
+aline 238 1000
+aline 142 952
+aline 95 857
+aline 142 809
+aline 190 857
+aline 142 904
+amove 333 999
+aline 380 952
+aline 428 809
+aline 428 523
+aline 380 380
+aline 285 285
+amove 285 238
+aline 428 95
+amove 428 47
+aline 238 238
+amove 142 238
+aline 380 -1
+aline 714 238
+amove 857 47
+aline 761 142
+aline 761 809
+aline 809 904
+amove 904 999
+aline 857 952
+aline 809 809
+aline 809 190
+aline 904 95
+amove 1000 190
+aline 809 -1
+aline 714 95
+aline 714 809
+aline 761 904
+aline 809 952
+aline 904 999
+aline 1000 999
+aline 1047 952
+aline 1047 904
+aline 1000 904
+aline 1047 952
+amove 428 904
+aline 476 761
+aline 476 523
+aline 428 428
+stroke
+dfont endchar
+dfont char=66
+amove 142 142
+aline 190 190
+aline 238 190
+aline 523 47
+aline 666 0
+aline 809 0
+aline 952 47
+aline 1047 142
+aline 1095 285
+aline 1095 428
+aline 1047 571
+aline 952 666
+amove 904 619
+aline 952 619
+aline 1047 523
+amove 1095 380
+aline 1047 476
+aline 952 571
+aline 809 619
+amove 619 523
+aline 1095 761
+aline 1047 809
+aline 1000 904
+aline 952 952
+aline 857 1000
+aline 761 1000
+aline 666 952
+aline 619 857
+amove 523 904
+aline 571 809
+aline 571 333
+amove 476 190
+aline 571 285
+aline 619 428
+aline 619 809
+aline 571 904
+aline 523 952
+aline 428 1000
+aline 285 1000
+aline 190 952
+aline 142 857
+aline 142 761
+aline 190 666
+aline 285 523
+aline 285 428
+aline 238 380
+amove 95 476
+aline 95 428
+aline 142 380
+aline 238 380
+aline 333 428
+aline 333 571
+aline 285 666
+aline 190 809
+aline 190 904
+aline 285 1000
+amove 428 1000
+aline 476 952
+aline 523 809
+aline 523 285
+aline 476 190
+amove 285 190
+aline 333 190
+aline 619 47
+aline 714 47
+amove 1000 95
+aline 904 47
+aline 761 47
+aline 619 95
+aline 428 190
+aline 285 238
+aline 190 238
+aline 142 142
+aline 142 47
+aline 190 0
+aline 238 47
+aline 190 95
+amove 285 571
+aline 190 761
+amove 857 1000
+aline 904 952
+aline 952 809
+aline 1000 761
+aline 1095 761
+amove 1000 809
+aline 952 904
+stroke
+dfont endchar
+dfont char=67
+amove 476 47
+aline 333 95
+aline 238 238
+aline 190 428
+aline 190 666
+aline 238 809
+aline 285 904
+amove 380 1000
+aline 333 952
+aline 285 857
+aline 238 666
+aline 238 476
+aline 285 285
+aline 333 190
+aline 428 95
+aline 571 47
+aline 714 47
+aline 857 95
+aline 1000 190
+aline 904 95
+aline 809 47
+aline 666 0
+aline 523 0
+aline 380 47
+aline 285 95
+aline 190 238
+aline 142 428
+aline 142 619
+aline 190 809
+aline 285 952
+aline 380 1000
+aline 476 1000
+aline 571 904
+amove 523 857
+aline 523 809
+aline 571 714
+aline 714 619
+aline 761 523
+aline 761 428
+aline 714 333
+aline 619 285
+aline 571 285
+aline 476 333
+aline 428 428
+amove 714 476
+aline 714 523
+aline 523 714
+aline 523 761
+amove 666 952
+aline 761 857
+aline 857 857
+aline 952 904
+aline 1000 952
+amove 952 904
+aline 857 904
+aline 761 952
+aline 714 1000
+aline 571 904
+aline 523 857
+aline 476 761
+aline 476 714
+aline 523 619
+aline 666 523
+aline 714 428
+aline 714 333
+amove 809 904
+aline 761 904
+aline 714 952
+stroke
+dfont endchar
+dfont char=68
+amove 142 142
+aline 190 190
+aline 238 190
+aline 523 47
+aline 666 0
+aline 809 0
+aline 952 47
+aline 1047 142
+aline 1095 285
+aline 1095 476
+aline 1047 666
+aline 952 809
+aline 857 904
+aline 761 952
+aline 619 1000
+aline 428 1000
+aline 285 952
+aline 190 857
+aline 142 761
+aline 142 714
+amove 142 761
+aline 238 857
+aline 380 904
+aline 619 904
+aline 761 857
+aline 857 809
+aline 952 714
+aline 1047 571
+aline 1095 428
+amove 1047 619
+aline 952 761
+aline 857 857
+aline 761 904
+aline 619 952
+aline 380 952
+aline 285 904
+amove 380 761
+aline 380 666
+aline 476 476
+aline 476 380
+aline 428 285
+aline 380 238
+aline 285 238
+aline 238 285
+aline 238 333
+amove 285 190
+aline 333 190
+aline 619 47
+aline 714 47
+amove 1000 95
+aline 904 47
+aline 761 47
+aline 619 95
+aline 428 190
+aline 285 238
+aline 190 238
+aline 142 142
+aline 142 47
+aline 190 0
+aline 238 47
+aline 190 95
+amove 428 285
+aline 428 380
+aline 333 571
+aline 333 666
+aline 380 761
+aline 523 904
+amove 380 619
+aline 380 571
+aline 428 476
+aline 428 428
+stroke
+dfont endchar
+dfont char=69
+amove 476 47
+aline 333 95
+aline 238 238
+aline 190 428
+aline 190 666
+aline 238 809
+aline 285 904
+amove 380 1000
+aline 333 952
+aline 285 857
+aline 238 666
+aline 238 476
+aline 285 285
+aline 333 190
+aline 428 95
+aline 571 47
+aline 714 47
+aline 857 95
+aline 1000 190
+aline 904 95
+aline 809 47
+aline 666 0
+aline 523 0
+aline 380 47
+aline 285 95
+aline 190 238
+aline 142 428
+aline 142 619
+aline 190 809
+aline 285 952
+aline 380 1000
+aline 476 1000
+aline 571 904
+amove 523 857
+aline 523 809
+aline 571 714
+aline 714 619
+aline 761 523
+aline 761 428
+aline 714 333
+aline 619 285
+aline 571 285
+aline 476 333
+aline 428 428
+amove 714 476
+aline 714 523
+aline 523 714
+aline 523 761
+amove 666 952
+aline 761 857
+aline 857 857
+aline 952 904
+aline 1000 952
+amove 952 904
+aline 857 904
+aline 761 952
+aline 714 1000
+aline 571 904
+aline 523 857
+aline 476 761
+aline 476 714
+aline 523 619
+aline 666 523
+aline 714 428
+aline 714 333
+amove 714 619
+aline 904 761
+aline 952 714
+aline 1047 714
+aline 952 619
+aline 857 619
+aline 809 666
+amove 857 714
+aline 904 666
+aline 952 666
+amove 809 904
+aline 761 904
+aline 714 952
+stroke
+dfont endchar
+dfont char=70
+amove 285 -48
+aline 238 -1
+aline 238 190
+aline 285 285
+amove 142 380
+aline 142 428
+aline 190 476
+aline 285 476
+aline 333 428
+aline 333 333
+aline 285 190
+aline 285 0
+aline 333 -96
+aline 428 -143
+amove 619 -143
+aline 714 -96
+aline 761 -48
+aline 809 95
+aline 809 238
+aline 761 380
+aline 571 571
+aline 523 666
+aline 523 761
+aline 571 857
+aline 619 904
+amove 714 904
+aline 571 952
+aline 333 952
+aline 238 904
+amove 190 761
+aline 238 857
+aline 333 904
+aline 571 904
+aline 857 857
+aline 952 857
+aline 1000 904
+aline 1000 952
+aline 952 1000
+aline 904 1000
+amove 857 857
+aline 666 952
+aline 523 1000
+aline 380 1000
+aline 238 952
+aline 190 857
+aline 190 761
+aline 238 666
+aline 333 619
+amove 238 476
+aline 285 428
+aline 285 333
+aline 190 190
+aline 190 47
+aline 238 -48
+aline 285 -96
+aline 428 -143
+aline 619 -143
+aline 761 -96
+aline 857 0
+aline 904 95
+aline 904 238
+aline 857 380
+aline 761 476
+aline 619 571
+aline 523 666
+amove 666 523
+aline 809 380
+aline 857 238
+aline 857 95
+aline 809 0
+amove 714 523
+aline 904 714
+aline 952 666
+aline 1047 666
+aline 952 571
+aline 857 571
+aline 809 619
+amove 857 666
+aline 904 619
+aline 952 619
+stroke
+dfont endchar
+dfont char=71
+amove 285 190
+aline 238 285
+aline 190 428
+aline 190 666
+aline 238 809
+aline 285 904
+amove 428 1000
+aline 333 952
+aline 285 857
+aline 238 666
+aline 238 428
+aline 285 238
+aline 333 142
+aline 428 47
+amove 428 380
+aline 476 285
+aline 571 238
+aline 619 238
+aline 714 285
+aline 761 380
+aline 761 476
+aline 714 571
+aline 571 666
+aline 523 761
+aline 523 809
+amove 523 714
+aline 523 666
+aline 714 476
+aline 714 428
+amove 714 285
+aline 714 380
+aline 666 476
+aline 523 571
+aline 476 666
+aline 476 714
+aline 523 809
+aline 619 904
+aline 761 1000
+amove 761 809
+aline 714 904
+aline 666 952
+aline 571 1000
+aline 428 1000
+aline 285 952
+aline 190 809
+aline 142 619
+aline 142 428
+aline 190 285
+aline 238 190
+aline 333 95
+aline 428 47
+aline 571 0
+aline 714 0
+aline 857 47
+aline 952 95
+aline 1047 190
+aline 1095 333
+aline 1095 476
+aline 1047 619
+aline 952 714
+amove 952 666
+aline 1000 619
+aline 1047 476
+aline 1047 285
+aline 1000 190
+amove 857 47
+aline 952 142
+aline 1000 285
+aline 1000 476
+aline 952 571
+aline 857 666
+amove 714 571
+aline 952 714
+aline 1000 809
+aline 1095 1000
+aline 1047 952
+aline 952 952
+aline 1000 904
+aline 1000 809
+aline 1047 857
+aline 1142 857
+aline 1095 904
+aline 1095 1000
+amove 952 952
+aline 1142 857
+stroke
+dfont endchar
+dfont char=72
+amove 380 47
+aline 476 47
+aline 571 0
+aline 761 47
+aline 904 95
+aline 1000 190
+aline 1047 333
+aline 1047 476
+aline 1000 619
+aline 904 761
+aline 571 523
+amove 523 428
+aline 523 476
+aline 380 666
+aline 380 714
+amove 380 857
+aline 380 761
+aline 428 666
+aline 523 571
+aline 571 476
+aline 571 380
+aline 523 285
+aline 476 238
+aline 380 190
+aline 285 190
+aline 190 238
+aline 142 285
+aline 95 380
+aline 95 476
+aline 142 523
+aline 190 476
+aline 142 428
+amove 523 285
+aline 523 380
+aline 476 476
+aline 380 571
+aline 333 666
+aline 333 761
+aline 380 857
+aline 476 952
+aline 571 1000
+aline 666 904
+aline 761 904
+aline 857 952
+aline 714 857
+aline 619 857
+aline 523 904
+aline 476 952
+amove 523 952
+aline 619 904
+amove 761 666
+aline 809 666
+aline 904 571
+aline 952 428
+aline 952 238
+aline 904 142
+aline 857 95
+aline 761 47
+aline 666 47
+aline 571 95
+aline 476 95
+aline 380 47
+aline 333 -48
+aline 380 -143
+aline 476 -191
+aline 571 -191
+aline 666 -143
+amove 619 47
+aline 523 47
+amove 952 190
+aline 1000 285
+aline 1000 476
+aline 952 619
+aline 857 714
+stroke
+dfont endchar
+dfont char=73
+amove 190 142
+aline 238 95
+aline 190 47
+aline 142 95
+aline 142 190
+aline 190 238
+aline 285 238
+aline 380 190
+aline 476 95
+aline 571 -48
+aline 666 -143
+amove 571 -96
+aline 523 -48
+aline 428 95
+aline 380 142
+amove 285 238
+aline 333 190
+aline 380 95
+aline 476 -48
+aline 523 -96
+aline 619 -143
+aline 761 -143
+aline 857 -96
+aline 904 -48
+aline 952 47
+aline 952 190
+aline 904 285
+aline 809 428
+aline 761 523
+aline 761 571
+amove 761 476
+aline 761 428
+aline 904 190
+aline 904 142
+amove 857 -96
+aline 904 0
+aline 904 95
+aline 857 190
+aline 761 333
+aline 714 428
+aline 714 523
+aline 809 619
+aline 904 619
+aline 952 571
+aline 952 523
+amove 904 761
+aline 809 809
+aline 666 952
+aline 523 1000
+aline 428 1000
+aline 285 952
+aline 238 904
+aline 190 809
+aline 190 714
+aline 238 619
+aline 285 571
+aline 380 523
+aline 476 523
+amove 190 809
+aline 238 857
+aline 333 904
+aline 523 904
+aline 666 857
+aline 761 809
+aline 904 761
+aline 1000 761
+aline 1047 809
+aline 1047 904
+aline 1000 952
+aline 904 952
+amove 714 857
+aline 666 904
+aline 571 952
+aline 380 952
+aline 285 904
+stroke
+dfont endchar
+dfont char=74
+amove 190 142
+aline 238 95
+aline 190 47
+aline 142 95
+aline 142 190
+aline 190 238
+aline 285 238
+aline 380 190
+aline 476 95
+aline 571 -48
+aline 666 -143
+amove 571 -96
+aline 523 -48
+aline 428 95
+aline 380 142
+amove 285 238
+aline 333 190
+aline 380 95
+aline 476 -48
+aline 523 -96
+aline 619 -143
+aline 761 -143
+aline 857 -96
+aline 904 -48
+aline 952 47
+aline 952 190
+aline 904 285
+aline 809 428
+aline 761 523
+aline 761 571
+amove 761 476
+aline 761 428
+aline 904 190
+aline 904 142
+amove 857 -96
+aline 904 0
+aline 904 95
+aline 857 190
+aline 761 333
+aline 714 428
+aline 714 523
+aline 809 619
+aline 904 619
+aline 952 571
+aline 952 523
+amove 904 761
+aline 809 809
+aline 666 952
+aline 523 1000
+aline 428 1000
+aline 285 952
+aline 238 904
+aline 190 809
+aline 190 714
+aline 238 619
+aline 285 571
+aline 380 523
+aline 476 523
+amove 190 809
+aline 238 857
+aline 333 904
+aline 523 904
+aline 666 857
+aline 761 809
+aline 904 761
+aline 1000 761
+aline 1047 809
+aline 1047 904
+aline 1000 952
+aline 904 952
+amove 714 857
+aline 666 904
+aline 571 952
+aline 380 952
+aline 285 904
+stroke
+dfont endchar
+dfont char=75
+amove 95 95
+aline 285 190
+amove 238 47
+aline 333 0
+aline 428 0
+aline 523 47
+aline 571 142
+aline 571 238
+aline 523 380
+aline 428 571
+aline 380 666
+aline 380 809
+aline 428 904
+amove 619 809
+aline 714 761
+aline 761 714
+aline 809 619
+amove 857 666
+aline 761 761
+amove 761 571
+aline 952 142
+aline 1000 95
+aline 1047 95
+amove 1000 47
+aline 904 142
+aline 714 523
+amove 666 523
+aline 857 95
+aline 952 0
+aline 1095 142
+amove 952 666
+aline 904 666
+aline 809 761
+aline 714 809
+aline 571 809
+aline 476 761
+aline 428 666
+aline 428 571
+amove 380 619
+aline 380 571
+aline 523 285
+aline 523 238
+amove 523 476
+aline 952 666
+amove 1047 761
+aline 1000 857
+aline 904 952
+aline 761 1000
+aline 619 1000
+aline 476 952
+aline 380 857
+aline 333 761
+aline 333 619
+aline 380 476
+aline 523 190
+aline 523 95
+aline 428 0
+amove 238 47
+aline 142 238
+aline 142 142
+aline 95 95
+aline 190 95
+aline 238 47
+aline 238 142
+aline 285 190
+aline 190 190
+aline 142 238
+stroke
+dfont endchar
+dfont char=76
+amove 142 95
+aline 285 190
+aline 380 285
+aline 428 380
+aline 428 476
+aline 380 571
+aline 285 714
+aline 238 809
+aline 238 904
+amove 238 761
+aline 238 714
+aline 380 476
+aline 380 428
+amove 333 238
+aline 380 333
+aline 380 380
+aline 333 476
+aline 238 619
+aline 190 714
+aline 190 809
+aline 238 904
+aline 285 952
+aline 428 1000
+aline 666 1000
+aline 809 952
+aline 857 904
+aline 904 809
+aline 904 714
+aline 857 619
+aline 761 523
+aline 714 428
+aline 714 380
+aline 761 333
+amove 904 380
+aline 857 333
+aline 714 333
+aline 666 380
+aline 666 476
+aline 714 571
+aline 809 714
+aline 857 809
+aline 857 904
+amove 857 761
+aline 857 714
+aline 714 523
+aline 714 476
+amove 952 190
+aline 904 95
+aline 857 47
+aline 714 0
+aline 619 0
+aline 476 47
+aline 285 142
+aline 238 142
+aline 142 95
+amove 285 190
+aline 380 190
+aline 523 95
+aline 666 47
+aline 809 47
+aline 904 95
+amove 619 47
+aline 571 47
+aline 380 142
+aline 333 142
+stroke
+dfont endchar
+dfont char=77
+amove 190 0
+aline 333 142
+aline 380 142
+aline 428 95
+aline 476 142
+aline 523 238
+aline 571 428
+aline 571 761
+aline 523 904
+aline 428 1000
+amove 333 1000
+aline 238 904
+aline 238 809
+aline 333 666
+aline 380 571
+aline 380 428
+aline 285 380
+aline 190 380
+aline 142 428
+aline 142 476
+amove 285 380
+aline 333 428
+aline 333 523
+aline 238 666
+aline 190 761
+aline 190 857
+aline 238 952
+aline 333 1000
+aline 428 1000
+aline 523 952
+aline 619 857
+aline 666 714
+aline 666 428
+aline 619 285
+aline 571 190
+aline 476 95
+aline 333 0
+aline 285 47
+aline 238 47
+amove 285 95
+aline 333 95
+aline 380 47
+amove 571 0
+aline 714 142
+aline 761 142
+aline 809 95
+aline 857 190
+aline 904 380
+aline 904 761
+aline 857 904
+aline 761 1000
+amove 904 904
+aline 952 952
+aline 1047 1000
+aline 1142 1000
+aline 1238 952
+aline 1285 904
+aline 1333 809
+aline 1380 761
+aline 1285 761
+aline 1238 809
+aline 1190 952
+aline 1142 1000
+amove 1238 904
+aline 1285 809
+amove 1380 761
+aline 1238 666
+aline 1190 619
+aline 1142 476
+aline 1142 333
+aline 1190 142
+aline 1285 0
+aline 1428 142
+amove 1380 95
+aline 1285 190
+aline 1238 380
+aline 1238 571
+aline 1285 666
+aline 1380 761
+amove 1238 619
+aline 1190 523
+aline 1190 333
+aline 1238 190
+aline 1333 47
+amove 904 238
+aline 952 428
+aline 952 714
+aline 904 857
+amove 571 857
+aline 619 714
+aline 619 428
+aline 571 285
+aline 523 190
+amove 619 47
+aline 666 47
+aline 714 0
+aline 809 95
+aline 904 190
+aline 952 285
+aline 1000 428
+aline 1000 714
+aline 952 857
+aline 857 952
+aline 761 1000
+aline 666 1000
+aline 571 952
+amove 238 761
+aline 333 571
+amove 666 95
+aline 714 95
+aline 761 47
+stroke
+dfont endchar
+dfont char=78
+amove 142 0
+aline 238 47
+aline 333 47
+aline 380 0
+aline 523 95
+aline 619 190
+aline 666 285
+aline 714 428
+aline 714 714
+aline 666 857
+aline 571 952
+aline 476 1000
+aline 333 1000
+aline 238 952
+aline 190 857
+aline 190 761
+aline 238 666
+aline 333 523
+aline 333 428
+aline 285 380
+amove 142 476
+aline 142 428
+aline 190 380
+aline 285 380
+aline 380 428
+aline 380 571
+aline 333 666
+aline 238 809
+aline 238 904
+aline 333 1000
+amove 476 1000
+aline 571 904
+aline 619 761
+aline 619 428
+aline 571 238
+aline 476 95
+aline 380 142
+aline 285 142
+aline 142 0
+amove 238 95
+aline 333 95
+aline 428 47
+amove 523 142
+aline 571 190
+aline 619 285
+aline 666 428
+aline 666 761
+aline 619 857
+amove 666 904
+aline 714 952
+aline 809 1000
+aline 904 1000
+aline 1000 952
+aline 1047 904
+aline 1095 809
+aline 1142 761
+aline 1047 761
+aline 1000 809
+aline 952 952
+aline 904 1000
+amove 1000 904
+aline 1047 809
+amove 1142 761
+aline 1000 666
+aline 952 619
+aline 904 476
+aline 904 333
+aline 952 142
+aline 1047 0
+aline 1190 142
+amove 1142 95
+aline 1047 190
+aline 1000 380
+aline 1000 571
+aline 1047 666
+aline 1142 761
+amove 1000 619
+aline 952 523
+aline 952 333
+aline 1000 190
+aline 1095 47
+amove 333 571
+aline 238 761
+stroke
+dfont endchar
+dfont char=79
+amove 142 142
+aline 190 190
+aline 238 190
+aline 523 47
+aline 666 0
+aline 809 0
+aline 952 47
+aline 1047 142
+aline 1095 238
+aline 1142 380
+aline 1142 523
+aline 1095 666
+aline 1047 761
+aline 904 857
+aline 619 952
+aline 571 1000
+aline 476 952
+aline 380 857
+aline 333 761
+aline 333 666
+aline 428 476
+aline 428 380
+amove 428 523
+aline 428 571
+aline 380 666
+aline 380 714
+amove 380 857
+aline 380 761
+aline 476 571
+aline 476 476
+aline 428 380
+aline 380 333
+aline 285 333
+aline 238 380
+aline 238 428
+amove 285 190
+aline 333 190
+aline 619 47
+aline 714 47
+amove 1000 95
+aline 904 47
+aline 761 47
+aline 619 95
+aline 428 190
+aline 285 238
+aline 190 238
+aline 142 142
+aline 142 47
+aline 190 0
+aline 238 47
+aline 190 95
+amove 571 952
+aline 619 904
+aline 904 809
+aline 1000 761
+aline 1047 714
+amove 1142 523
+aline 1095 619
+aline 1000 714
+aline 904 761
+aline 619 857
+aline 571 904
+aline 571 1000
+stroke
+dfont endchar
+dfont char=80
+amove 380 -96
+aline 428 -48
+aline 380 0
+aline 333 -48
+aline 333 -143
+aline 380 -191
+aline 523 -191
+aline 619 -143
+aline 666 -48
+aline 666 190
+aline 714 142
+aline 809 0
+aline 952 142
+aline 1047 285
+aline 1095 428
+aline 1095 571
+aline 1047 761
+aline 1000 857
+aline 904 1000
+aline 666 809
+amove 571 904
+aline 619 809
+aline 619 -48
+aline 571 -143
+amove 476 -191
+aline 523 -143
+aline 571 -48
+aline 571 190
+aline 476 190
+aline 380 142
+aline 476 238
+aline 571 285
+aline 571 809
+aline 523 952
+aline 476 1000
+amove 333 1000
+aline 238 904
+aline 238 809
+aline 333 666
+aline 380 571
+aline 380 428
+aline 285 380
+aline 190 380
+aline 142 428
+aline 142 476
+amove 285 380
+aline 333 428
+aline 333 523
+aline 238 666
+aline 190 761
+aline 190 857
+aline 238 952
+aline 333 1000
+aline 476 1000
+aline 571 952
+aline 619 904
+aline 666 809
+aline 666 285
+aline 761 238
+aline 857 95
+amove 857 47
+aline 761 190
+aline 666 238
+aline 523 238
+amove 333 571
+aline 238 761
+amove 809 904
+aline 904 809
+aline 1000 666
+aline 1047 523
+aline 1047 380
+aline 1000 238
+aline 952 142
+amove 1047 571
+aline 1047 619
+aline 1000 761
+aline 857 952
+stroke
+dfont endchar
+dfont char=81
+amove 142 142
+aline 190 190
+aline 238 190
+aline 523 47
+aline 666 0
+aline 809 0
+aline 952 47
+aline 761 47
+aline 619 95
+aline 428 190
+aline 285 238
+aline 190 238
+aline 142 142
+aline 142 47
+aline 190 0
+aline 238 47
+aline 190 95
+amove 285 190
+aline 333 190
+aline 619 47
+aline 714 47
+amove 761 142
+aline 857 238
+aline 952 238
+aline 1142 47
+aline 1190 47
+amove 1238 95
+aline 1142 0
+aline 1047 0
+aline 857 190
+aline 809 190
+amove 904 190
+aline 952 190
+aline 1095 47
+amove 1047 142
+aline 1095 238
+aline 1142 380
+aline 1142 523
+aline 1095 666
+aline 1047 761
+aline 904 857
+aline 619 952
+aline 571 1000
+aline 476 952
+aline 380 857
+aline 333 761
+aline 333 666
+aline 428 476
+aline 428 380
+amove 428 523
+aline 428 571
+aline 380 666
+aline 380 714
+amove 380 857
+aline 380 761
+aline 476 571
+aline 476 476
+aline 428 380
+aline 380 333
+aline 285 333
+aline 238 380
+aline 238 428
+amove 571 952
+aline 619 904
+aline 904 809
+aline 1000 761
+aline 1047 714
+amove 1142 523
+aline 1095 619
+aline 1000 714
+aline 904 761
+aline 619 857
+aline 571 904
+aline 571 1000
+stroke
+dfont endchar
+dfont char=82
+amove 95 95
+aline 285 190
+amove 238 47
+aline 333 0
+aline 428 0
+aline 523 47
+aline 619 142
+aline 666 238
+aline 666 809
+aline 619 904
+aline 571 952
+aline 476 1000
+aline 333 1000
+aline 238 952
+aline 190 857
+aline 190 761
+aline 238 666
+aline 333 523
+aline 333 428
+aline 285 380
+amove 142 476
+aline 142 428
+aline 190 380
+aline 285 380
+aline 380 428
+aline 380 571
+aline 333 666
+aline 238 809
+aline 238 904
+aline 333 1000
+amove 476 1000
+aline 523 952
+aline 571 809
+aline 571 238
+aline 523 95
+aline 428 0
+amove 238 47
+aline 142 238
+aline 142 142
+aline 95 95
+aline 190 95
+aline 238 47
+aline 238 142
+aline 285 190
+aline 190 190
+aline 142 238
+amove 333 571
+aline 238 761
+amove 571 904
+aline 619 809
+aline 619 238
+aline 571 142
+amove 666 523
+aline 1142 761
+aline 1095 809
+aline 1047 904
+aline 1000 952
+aline 904 1000
+aline 809 1000
+aline 714 952
+aline 666 857
+amove 904 1000
+aline 952 952
+aline 1000 809
+aline 1047 761
+aline 1142 761
+amove 1047 809
+aline 1000 904
+amove 857 619
+aline 1047 142
+aline 1095 95
+aline 1142 95
+amove 1190 142
+aline 1047 -1
+aline 952 95
+aline 761 571
+amove 809 571
+aline 1000 142
+aline 1095 47
+stroke
+dfont endchar
+dfont char=83
+amove 190 285
+aline 285 190
+aline 380 142
+aline 523 95
+aline 761 95
+aline 952 142
+aline 1047 190
+aline 1095 238
+aline 1142 333
+amove 1142 476
+aline 1047 571
+aline 952 571
+aline 857 523
+aline 761 380
+aline 666 333
+aline 571 333
+aline 476 380
+aline 428 476
+aline 428 571
+aline 476 666
+aline 571 714
+amove 333 904
+aline 476 952
+aline 666 952
+aline 809 904
+aline 952 809
+amove 1095 904
+aline 1047 952
+aline 1095 1000
+aline 1142 952
+aline 1142 857
+aline 1095 761
+aline 1000 761
+aline 809 857
+aline 666 904
+aline 476 904
+aline 285 857
+aline 190 761
+amove 476 380
+aline 571 380
+aline 666 428
+aline 761 571
+aline 857 619
+aline 1000 619
+aline 1095 571
+aline 1142 476
+aline 1142 333
+aline 1095 190
+aline 1000 95
+aline 904 47
+aline 761 0
+aline 571 0
+aline 428 47
+aline 333 95
+aline 238 190
+aline 190 285
+aline 142 428
+aline 142 619
+aline 190 761
+aline 238 857
+aline 333 952
+aline 476 1000
+aline 666 1000
+aline 809 952
+aline 1000 809
+aline 1095 809
+aline 1142 857
+amove 904 571
+aline 857 571
+aline 666 380
+aline 619 380
+amove 333 142
+aline 428 95
+aline 571 47
+aline 761 47
+aline 952 95
+stroke
+dfont endchar
+dfont char=84
+amove 142 142
+aline 190 190
+aline 238 190
+aline 333 142
+aline 523 47
+aline 666 0
+aline 809 0
+aline 952 47
+aline 1047 142
+amove 1000 95
+aline 904 47
+aline 761 47
+aline 619 95
+aline 428 190
+aline 285 238
+aline 190 238
+aline 142 142
+aline 142 47
+aline 190 0
+aline 238 47
+aline 190 95
+amove 285 190
+aline 333 190
+aline 619 47
+aline 714 47
+amove 619 238
+aline 619 333
+aline 523 523
+aline 523 619
+aline 571 714
+aline 714 857
+amove 857 809
+aline 714 904
+aline 571 952
+aline 285 952
+aline 190 904
+amove 142 761
+aline 190 857
+aline 285 904
+aline 571 904
+aline 714 857
+aline 904 761
+aline 1000 761
+aline 1047 857
+aline 1047 952
+aline 1000 1000
+aline 952 952
+aline 1000 904
+amove 1047 857
+aline 1000 809
+aline 904 809
+aline 714 952
+aline 571 1000
+aline 333 1000
+aline 190 952
+aline 142 857
+aline 142 761
+aline 190 666
+aline 285 619
+amove 571 571
+aline 571 523
+aline 619 428
+aline 619 380
+amove 428 333
+aline 428 238
+aline 476 190
+aline 571 190
+aline 619 238
+aline 666 333
+aline 666 428
+aline 571 619
+aline 571 714
+stroke
+dfont endchar
+dfont char=85
+amove 142 142
+aline 238 190
+aline 238 857
+aline 190 904
+aline 142 904
+amove 190 952
+aline 285 904
+aline 285 142
+aline 428 47
+amove 523 95
+aline 428 95
+aline 333 190
+aline 333 904
+aline 238 999
+aline 95 857
+amove 571 857
+aline 714 999
+aline 857 904
+aline 809 857
+aline 809 142
+aline 857 95
+aline 904 95
+amove 952 142
+aline 809 0
+aline 714 95
+aline 714 857
+aline 666 904
+aline 619 904
+amove 666 952
+aline 761 904
+aline 761 95
+aline 857 47
+amove 714 238
+aline 523 95
+aline 380 0
+aline 285 95
+aline 190 142
+aline 142 142
+stroke
+dfont endchar
+dfont char=86
+amove 190 142
+aline 238 190
+aline 285 190
+aline 571 47
+aline 714 0
+aline 904 0
+aline 1000 47
+aline 1095 142
+aline 1142 238
+aline 1142 428
+aline 1095 523
+aline 952 619
+aline 904 666
+amove 952 571
+aline 1095 476
+amove 1142 333
+aline 1095 428
+aline 952 523
+aline 904 619
+aline 904 714
+aline 952 761
+aline 1047 761
+amove 1047 809
+aline 1000 904
+amove 904 1000
+aline 952 952
+aline 1000 809
+aline 1047 761
+aline 1142 761
+aline 1095 809
+aline 1000 952
+aline 904 1000
+aline 809 1000
+aline 714 952
+aline 666 857
+amove 571 904
+aline 619 809
+aline 619 333
+amove 523 190
+aline 619 285
+aline 666 428
+aline 666 809
+aline 619 904
+aline 571 952
+aline 476 1000
+aline 333 1000
+aline 238 952
+aline 190 857
+aline 190 761
+aline 238 666
+aline 333 523
+aline 333 428
+aline 285 380
+amove 142 476
+aline 142 428
+aline 190 380
+aline 285 380
+aline 380 428
+aline 380 571
+aline 333 666
+aline 238 809
+aline 238 904
+aline 333 1000
+amove 476 1000
+aline 523 952
+aline 571 809
+aline 571 285
+aline 523 190
+amove 333 190
+aline 380 190
+aline 666 47
+aline 761 47
+amove 1047 95
+aline 952 47
+aline 809 47
+aline 666 95
+aline 476 190
+aline 333 238
+aline 238 238
+aline 190 142
+aline 190 47
+aline 238 0
+aline 285 47
+aline 238 95
+amove 333 571
+aline 238 761
+stroke
+dfont endchar
+dfont char=87
+amove 190 142
+aline 238 190
+aline 333 190
+aline 428 142
+aline 523 47
+aline 619 0
+aline 809 0
+aline 904 47
+aline 1000 142
+aline 1047 238
+aline 1047 333
+aline 1000 476
+aline 904 619
+aline 857 714
+aline 857 857
+aline 904 952
+aline 1000 1000
+aline 857 952
+aline 809 857
+aline 809 666
+aline 857 523
+aline 952 380
+aline 1000 285
+aline 1000 190
+aline 952 95
+aline 1047 47
+aline 1095 47
+amove 1000 142
+aline 1047 95
+aline 1142 47
+aline 1238 47
+aline 1333 95
+amove 1380 333
+aline 1333 428
+aline 1190 523
+aline 1142 619
+aline 1142 714
+aline 1190 761
+aline 1285 761
+amove 1285 809
+aline 1238 904
+amove 1142 999
+aline 1190 952
+aline 1238 809
+aline 1285 761
+aline 1380 761
+aline 1333 809
+aline 1238 952
+aline 1142 999
+aline 1000 999
+amove 904 952
+aline 809 999
+aline 666 999
+aline 571 952
+amove 571 904
+aline 619 809
+aline 619 571
+aline 571 428
+amove 428 238
+aline 523 333
+aline 619 476
+aline 666 619
+aline 666 809
+aline 619 904
+aline 571 952
+aline 476 1000
+aline 333 1000
+aline 238 952
+aline 190 857
+aline 190 761
+aline 238 666
+aline 333 523
+aline 333 428
+aline 285 380
+amove 142 476
+aline 142 428
+aline 190 380
+aline 285 380
+aline 380 428
+aline 380 571
+aline 333 666
+aline 238 809
+aline 238 904
+aline 333 1000
+amove 476 1000
+aline 523 952
+aline 571 809
+aline 571 571
+aline 523 380
+aline 428 238
+amove 380 190
+aline 428 190
+aline 571 47
+amove 714 0
+aline 619 47
+aline 476 190
+aline 380 238
+aline 238 238
+aline 190 142
+aline 190 47
+aline 238 0
+aline 285 47
+aline 238 95
+amove 333 571
+aline 238 761
+amove 857 666
+aline 857 619
+aline 1000 380
+aline 1000 333
+amove 904 47
+aline 1047 0
+aline 1190 0
+aline 1285 47
+aline 1333 95
+aline 1380 190
+aline 1380 428
+aline 1333 523
+aline 1190 619
+aline 1142 666
+amove 1190 571
+aline 1333 476
+stroke
+dfont endchar
+dfont char=88
+amove 142 0
+aline 238 47
+aline 333 0
+aline 476 142
+aline 523 285
+aline 523 476
+aline 333 476
+aline 238 380
+aline 333 571
+aline 523 571
+aline 523 666
+aline 476 809
+aline 428 857
+aline 333 904
+aline 238 904
+amove 333 952
+aline 476 904
+aline 523 857
+aline 571 714
+aline 571 285
+aline 619 190
+aline 714 95
+aline 809 47
+amove 904 95
+aline 809 95
+aline 714 142
+aline 666 190
+aline 619 333
+aline 619 476
+aline 809 476
+aline 904 666
+aline 809 571
+aline 619 571
+aline 619 714
+aline 571 857
+aline 476 952
+aline 380 1000
+aline 142 857
+amove 333 523
+aline 809 523
+amove 619 714
+aline 666 857
+aline 809 1000
+aline 904 952
+aline 1000 1000
+aline 857 857
+aline 761 904
+aline 714 904
+amove 761 952
+aline 857 904
+aline 904 904
+amove 523 285
+aline 571 142
+aline 666 47
+aline 761 0
+aline 1000 142
+amove 428 95
+aline 380 95
+aline 285 142
+aline 142 0
+amove 238 95
+aline 285 95
+aline 380 47
+stroke
+dfont endchar
+dfont char=89
+amove 285 0
+aline 333 47
+aline 285 95
+aline 238 47
+aline 285 -48
+aline 380 -143
+aline 523 -191
+aline 714 -191
+aline 857 -143
+aline 952 -48
+aline 1000 47
+aline 1047 238
+aline 1047 1000
+aline 666 809
+amove 571 904
+aline 619 809
+aline 619 523
+aline 571 380
+aline 523 285
+aline 666 142
+amove 714 190
+aline 666 190
+aline 571 285
+aline 571 333
+aline 619 428
+aline 666 571
+aline 666 809
+aline 619 904
+aline 571 952
+aline 476 1000
+aline 333 1000
+aline 238 952
+aline 190 857
+aline 190 761
+aline 238 666
+aline 333 523
+aline 333 428
+aline 285 380
+amove 142 476
+aline 142 428
+aline 190 380
+aline 285 380
+aline 380 428
+aline 380 571
+aline 333 666
+aline 238 809
+aline 238 904
+aline 333 1000
+amove 476 1000
+aline 523 952
+aline 571 809
+aline 571 523
+aline 523 333
+aline 476 238
+aline 619 95
+aline 761 238
+amove 952 0
+aline 1000 142
+aline 1000 952
+amove 952 952
+aline 952 47
+aline 904 -96
+amove 333 571
+aline 238 761
+stroke
+dfont endchar
+dfont char=90
+amove 190 95
+aline 238 47
+aline 380 -143
+aline 476 -191
+aline 666 -191
+aline 809 -143
+aline 904 -48
+aline 952 47
+aline 952 238
+aline 904 333
+aline 809 428
+aline 666 476
+aline 523 476
+aline 428 428
+aline 380 380
+aline 333 285
+amove 238 95
+aline 285 47
+aline 380 -96
+aline 428 -143
+amove 571 -191
+aline 476 -143
+aline 428 -96
+aline 333 47
+aline 285 95
+aline 142 95
+aline 95 47
+aline 95 -48
+aline 142 -96
+aline 190 -96
+amove 666 -191
+aline 761 -143
+aline 809 -96
+aline 857 -1
+aline 857 285
+aline 809 380
+aline 666 476
+aline 761 523
+aline 809 571
+aline 857 666
+aline 857 809
+aline 809 904
+aline 761 952
+aline 666 1000
+aline 523 1000
+aline 428 952
+aline 380 857
+amove 380 619
+aline 428 523
+aline 523 476
+amove 666 476
+aline 714 523
+aline 761 619
+aline 761 857
+aline 714 952
+aline 666 1000
+amove 761 904
+aline 809 857
+aline 809 619
+aline 761 571
+amove 857 333
+aline 904 238
+aline 904 47
+aline 857 -48
+stroke
+dfont endchar
+dfont char=91
+amove 190 -334
+aline 190 1190
+aline 523 1190
+amove 238 1190
+aline 238 -334
+amove 190 -334
+aline 523 -334
+stroke
+dfont endchar
+stroke
+dfont endchar
+dfont char=93
+amove 142 -334
+aline 476 -334
+aline 476 1190
+aline 142 1190
+amove 428 1190
+aline 428 -334
+stroke
+dfont endchar
+stroke
+dfont endchar
+stroke
+dfont endchar
+dfont char=96
+amove 238 904
+aline 285 952
+aline 238 1000
+aline 190 952
+aline 190 857
+aline 238 761
+aline 285 714
+stroke
+dfont endchar
+dfont char=97
+amove 285 47
+aline 238 95
+aline 190 238
+amove 333 47
+aline 238 142
+aline 190 285
+aline 190 380
+aline 238 523
+aline 333 619
+amove 380 619
+aline 428 571
+aline 523 523
+aline 523 95
+aline 619 -1
+aline 761 142
+amove 714 95
+aline 666 95
+aline 619 142
+aline 619 523
+aline 666 571
+aline 619 571
+aline 523 619
+aline 476 666
+aline 333 619
+aline 238 571
+aline 190 523
+aline 142 380
+aline 142 238
+aline 190 95
+aline 238 -1
+aline 523 142
+amove 666 47
+aline 571 142
+aline 571 523
+aline 428 619
+stroke
+dfont endchar
+dfont char=98
+amove 142 95
+aline 190 142
+aline 190 761
+aline 238 857
+aline 333 952
+aline 476 1000
+aline 380 952
+aline 333 904
+aline 285 761
+aline 285 142
+aline 380 95
+aline 428 47
+amove 476 47
+aline 333 0
+aline 285 47
+aline 190 95
+aline 142 95
+amove 380 47
+aline 238 142
+aline 238 761
+aline 285 857
+amove 190 761
+aline 142 857
+aline 95 904
+amove 285 523
+aline 571 666
+aline 619 571
+aline 666 428
+aline 666 285
+aline 619 142
+aline 571 95
+aline 476 47
+aline 571 142
+aline 619 285
+aline 619 380
+aline 571 523
+aline 476 619
+amove 523 619
+aline 571 571
+aline 619 476
+stroke
+dfont endchar
+dfont char=99
+amove 285 47
+aline 238 95
+aline 190 190
+aline 190 428
+aline 238 523
+amove 285 571
+aline 238 476
+aline 238 238
+aline 285 142
+aline 380 47
+amove 476 95
+aline 285 0
+aline 190 95
+aline 142 190
+aline 142 428
+aline 190 523
+aline 333 619
+aline 428 666
+aline 523 571
+aline 428 523
+aline 333 619
+amove 380 619
+aline 476 571
+stroke
+dfont endchar
+dfont char=100
+amove 142 95
+aline 190 95
+aline 285 47
+aline 333 0
+aline 476 47
+aline 619 142
+aline 666 285
+aline 666 428
+aline 619 571
+aline 523 666
+aline 285 809
+aline 238 857
+aline 238 904
+amove 238 809
+aline 238 761
+aline 428 666
+aline 571 571
+aline 619 523
+amove 380 619
+aline 190 523
+aline 190 142
+aline 142 95
+amove 380 47
+aline 238 142
+aline 238 523
+amove 285 571
+aline 285 142
+aline 380 95
+aline 428 47
+amove 476 47
+aline 571 142
+aline 619 285
+aline 619 428
+aline 571 523
+aline 428 619
+aline 238 714
+aline 190 761
+aline 190 857
+aline 333 1000
+stroke
+dfont endchar
+dfont char=101
+amove 285 47
+aline 238 95
+aline 190 190
+aline 190 428
+aline 238 523
+amove 333 619
+aline 476 476
+amove 428 428
+aline 333 571
+aline 285 571
+aline 238 476
+aline 238 238
+aline 285 142
+aline 380 47
+amove 476 95
+aline 285 0
+aline 190 95
+aline 142 190
+aline 142 428
+aline 190 523
+aline 380 666
+aline 523 476
+aline 238 285
+stroke
+dfont endchar
+dfont char=102
+amove 238 0
+aline 238 619
+aline 190 571
+aline 333 571
+amove 285 523
+aline 285 333
+aline 238 -239
+aline 190 333
+aline 190 523
+aline 95 523
+aline 142 571
+aline 190 666
+aline 190 904
+aline 238 1000
+aline 333 1000
+aline 428 952
+aline 523 952
+aline 571 1000
+aline 523 904
+aline 476 857
+aline 380 857
+aline 285 904
+aline 238 904
+aline 190 857
+amove 190 761
+aline 238 666
+aline 285 619
+aline 380 571
+aline 476 571
+aline 476 523
+aline 285 523
+amove 476 904
+aline 380 904
+aline 285 952
+aline 238 952
+stroke
+dfont endchar
+dfont char=103
+amove 190 -143
+aline 190 -96
+aline 142 -96
+aline 142 -143
+aline 190 -191
+aline 285 -239
+aline 428 -239
+aline 523 -191
+aline 571 -143
+aline 619 -48
+aline 619 523
+aline 666 571
+aline 619 571
+aline 523 619
+aline 476 666
+aline 333 619
+aline 238 571
+aline 190 523
+aline 142 380
+aline 142 238
+aline 190 95
+aline 238 -1
+aline 523 142
+amove 571 47
+aline 571 523
+aline 428 619
+amove 380 619
+aline 428 571
+aline 523 523
+aline 523 142
+aline 571 -1
+aline 571 -96
+aline 523 -191
+amove 333 47
+aline 238 142
+aline 190 285
+aline 190 380
+aline 238 523
+aline 333 619
+amove 190 190
+aline 238 95
+aline 285 47
+stroke
+dfont endchar
+dfont char=104
+amove 142 95
+aline 190 142
+aline 190 761
+aline 238 857
+aline 333 952
+aline 476 1000
+aline 380 952
+aline 333 904
+aline 285 761
+aline 285 142
+aline 333 95
+aline 380 95
+amove 428 142
+aline 285 0
+aline 238 47
+aline 142 95
+amove 285 47
+aline 238 95
+aline 238 761
+aline 285 857
+amove 190 761
+aline 142 857
+aline 95 904
+amove 285 523
+aline 571 666
+aline 619 571
+aline 666 380
+aline 666 190
+aline 619 47
+aline 571 -48
+aline 476 -143
+aline 333 -239
+amove 476 -143
+aline 571 0
+aline 619 190
+aline 619 333
+aline 571 476
+aline 476 619
+amove 523 619
+aline 571 571
+aline 619 428
+stroke
+dfont endchar
+dfont char=105
+amove 333 47
+aline 238 142
+aline 238 571
+aline 142 619
+amove 95 571
+aline 142 571
+aline 190 523
+aline 190 95
+aline 285 -1
+aline 428 142
+amove 380 95
+aline 333 95
+aline 285 142
+aline 285 523
+aline 333 571
+aline 238 619
+aline 190 666
+aline 47 523
+amove 190 904
+aline 285 952
+amove 285 904
+aline 190 952
+amove 238 1000
+aline 190 952
+aline 190 904
+aline 238 857
+aline 285 904
+aline 285 952
+aline 238 1000
+stroke
+dfont endchar
+dfont char=106
+amove 190 -96
+aline 238 0
+aline 238 571
+aline 142 619
+amove 95 571
+aline 142 571
+aline 190 523
+aline 190 0
+aline 142 -143
+aline 95 -191
+aline 0 -239
+aline 142 -191
+aline 238 -96
+aline 285 -1
+aline 285 523
+aline 333 571
+aline 238 619
+aline 190 666
+aline 47 523
+amove 190 904
+aline 285 952
+amove 285 904
+aline 190 952
+amove 238 1000
+aline 190 952
+aline 190 904
+aline 238 857
+aline 285 904
+aline 285 952
+aline 238 1000
+amove 285 0
+aline 333 -96
+aline 380 -143
+stroke
+dfont endchar
+dfont char=107
+amove 190 95
+aline 285 47
+aline 333 0
+aline 476 142
+amove 428 95
+aline 380 95
+aline 333 142
+aline 333 523
+aline 571 523
+aline 571 571
+aline 333 571
+aline 333 761
+aline 380 904
+aline 476 1000
+aline 380 952
+aline 285 857
+aline 238 761
+aline 238 666
+aline 190 571
+aline 142 523
+aline 238 523
+aline 238 142
+aline 190 95
+amove 380 47
+aline 285 142
+aline 285 666
+aline 238 571
+aline 285 571
+amove 285 666
+aline 285 761
+aline 333 857
+amove 238 761
+aline 190 857
+aline 142 904
+amove 333 714
+aline 523 857
+aline 571 809
+aline 571 714
+aline 476 619
+aline 380 571
+amove 476 619
+aline 523 714
+aline 523 761
+aline 476 809
+stroke
+dfont endchar
+dfont char=108
+amove 142 95
+aline 190 142
+aline 190 761
+aline 238 857
+aline 333 952
+aline 476 1000
+aline 380 952
+aline 333 904
+aline 285 761
+aline 285 142
+aline 333 95
+aline 380 95
+amove 428 142
+aline 285 0
+aline 238 47
+aline 142 95
+amove 333 47
+aline 238 95
+aline 238 761
+aline 285 857
+amove 190 761
+aline 142 857
+aline 95 904
+stroke
+dfont endchar
+dfont char=109
+amove 238 0
+aline 142 95
+aline 190 142
+aline 190 523
+aline 142 571
+aline 95 571
+amove 47 523
+aline 190 666
+aline 285 571
+aline 285 142
+aline 333 95
+aline 238 0
+amove 238 142
+aline 285 95
+aline 238 47
+aline 190 95
+aline 238 142
+aline 238 523
+aline 142 619
+amove 285 523
+aline 428 619
+aline 523 666
+aline 619 619
+aline 666 523
+aline 666 142
+aline 714 95
+aline 619 0
+aline 523 95
+aline 571 142
+aline 571 476
+aline 523 571
+aline 428 619
+amove 523 619
+aline 571 571
+aline 619 476
+aline 619 142
+aline 571 95
+aline 619 47
+aline 666 95
+aline 619 142
+amove 666 523
+aline 809 619
+aline 904 666
+aline 952 619
+aline 1047 571
+aline 1095 571
+aline 1047 523
+aline 1047 142
+aline 1095 95
+aline 1142 95
+amove 1190 142
+aline 1047 0
+aline 952 95
+aline 952 523
+aline 857 571
+aline 809 619
+amove 857 619
+aline 1000 523
+aline 1000 142
+aline 1095 47
+stroke
+dfont endchar
+dfont char=110
+amove 238 0
+aline 142 95
+aline 190 142
+aline 190 523
+aline 142 571
+aline 95 571
+amove 47 523
+aline 190 666
+aline 285 571
+aline 285 142
+aline 333 95
+aline 238 0
+amove 238 142
+aline 285 95
+aline 238 47
+aline 190 95
+aline 238 142
+aline 238 523
+aline 142 619
+amove 285 523
+aline 428 619
+aline 523 666
+aline 571 619
+aline 666 571
+aline 714 571
+aline 666 523
+aline 666 142
+aline 714 95
+aline 761 95
+amove 809 142
+aline 666 0
+aline 571 95
+aline 571 523
+aline 476 571
+aline 428 619
+amove 476 619
+aline 619 523
+aline 619 142
+aline 714 47
+stroke
+dfont endchar
+dfont char=111
+amove 142 95
+aline 190 142
+aline 190 523
+aline 333 571
+aline 571 666
+aline 619 571
+aline 666 428
+aline 666 285
+aline 619 142
+aline 571 95
+aline 476 47
+aline 333 0
+aline 285 47
+aline 190 95
+aline 142 95
+amove 380 47
+aline 238 142
+aline 238 523
+amove 333 571
+aline 285 523
+aline 285 142
+aline 380 95
+aline 428 47
+amove 476 47
+aline 571 142
+aline 619 285
+aline 619 380
+aline 571 523
+aline 476 619
+amove 523 619
+aline 571 571
+aline 619 476
+stroke
+dfont endchar
+dfont char=112
+amove 95 47
+aline 190 142
+aline 190 476
+aline 142 619
+aline 142 714
+aline 238 809
+amove 190 761
+aline 190 714
+aline 238 619
+aline 285 476
+aline 285 142
+aline 333 142
+aline 428 95
+aline 476 47
+aline 380 0
+aline 285 95
+aline 238 -239
+aline 190 95
+aline 95 47
+amove 238 0
+aline 238 476
+aline 190 619
+aline 190 666
+amove 285 523
+aline 571 666
+aline 619 571
+aline 666 428
+aline 666 285
+aline 619 142
+aline 571 95
+aline 476 47
+aline 571 142
+aline 619 285
+aline 619 380
+aline 571 523
+aline 476 619
+amove 523 619
+aline 571 571
+aline 619 476
+amove 428 47
+aline 333 95
+stroke
+dfont endchar
+dfont char=113
+amove 190 190
+aline 238 95
+aline 285 47
+amove 333 47
+aline 238 142
+aline 190 285
+aline 190 380
+aline 238 523
+aline 333 619
+amove 380 619
+aline 428 571
+aline 523 523
+aline 523 142
+aline 571 -239
+aline 619 142
+aline 619 523
+aline 666 571
+aline 619 571
+aline 523 619
+aline 476 666
+aline 333 619
+aline 238 571
+aline 190 523
+aline 142 380
+aline 142 238
+aline 190 95
+aline 238 -1
+aline 523 142
+amove 571 -1
+aline 571 523
+aline 428 619
+stroke
+dfont endchar
+dfont char=114
+amove 190 95
+aline 238 142
+aline 238 523
+aline 190 571
+aline 142 571
+amove 190 619
+aline 285 523
+aline 285 95
+aline 380 47
+amove 428 95
+aline 380 95
+aline 333 142
+aline 333 571
+aline 238 666
+aline 95 523
+amove 333 571
+aline 523 666
+aline 571 571
+aline 476 523
+aline 428 619
+amove 476 619
+aline 523 571
+amove 476 142
+aline 333 0
+aline 285 47
+aline 190 95
+stroke
+dfont endchar
+dfont char=115
+amove 238 0
+aline 238 619
+aline 190 571
+aline 238 571
+amove 190 523
+aline 95 523
+aline 142 571
+aline 190 666
+aline 190 904
+aline 238 1000
+aline 333 1000
+aline 428 952
+aline 523 952
+aline 571 1000
+aline 523 904
+aline 476 857
+aline 380 857
+aline 285 904
+aline 238 904
+aline 190 857
+amove 190 761
+aline 285 523
+aline 285 333
+aline 238 -239
+aline 190 333
+aline 190 523
+amove 238 952
+aline 285 952
+aline 380 904
+aline 476 904
+stroke
+dfont endchar
+dfont char=116
+amove 190 95
+aline 238 142
+aline 238 523
+aline 95 523
+aline 190 571
+aline 238 619
+aline 285 714
+aline 333 857
+aline 333 571
+aline 476 571
+aline 476 523
+aline 333 523
+aline 333 142
+aline 380 95
+aline 428 95
+amove 476 142
+aline 333 0
+aline 285 47
+aline 190 95
+amove 380 47
+aline 285 142
+aline 285 666
+aline 238 571
+aline 285 571
+stroke
+dfont endchar
+dfont char=117
+amove 142 95
+aline 190 142
+aline 190 523
+aline 142 571
+aline 95 571
+amove 142 619
+aline 238 523
+aline 238 142
+aline 333 47
+amove 428 47
+aline 380 95
+aline 285 142
+aline 285 571
+aline 190 666
+aline 47 523
+amove 142 95
+aline 190 95
+aline 285 47
+aline 333 0
+aline 428 47
+aline 571 142
+amove 714 47
+aline 619 142
+aline 619 523
+aline 571 571
+aline 619 619
+aline 666 571
+aline 619 523
+amove 619 666
+aline 523 571
+aline 571 523
+aline 571 95
+aline 666 0
+aline 809 142
+amove 761 95
+aline 714 95
+aline 666 142
+aline 666 523
+aline 714 571
+aline 619 666
+stroke
+dfont endchar
+dfont char=118
+amove 142 95
+aline 190 142
+aline 190 428
+aline 142 571
+aline 142 666
+aline 238 761
+amove 190 714
+aline 190 666
+aline 238 571
+aline 285 428
+aline 285 142
+aline 380 95
+aline 428 47
+amove 476 47
+aline 333 0
+aline 285 47
+aline 190 95
+aline 142 95
+amove 380 47
+aline 238 142
+aline 238 428
+aline 190 571
+aline 190 619
+amove 285 523
+aline 571 666
+aline 619 571
+aline 666 428
+aline 666 285
+aline 619 142
+aline 571 95
+aline 476 47
+aline 571 142
+aline 619 285
+aline 619 380
+aline 571 523
+aline 476 619
+amove 523 619
+aline 571 571
+aline 619 476
+stroke
+dfont endchar
+dfont char=119
+amove 238 0
+aline 142 95
+aline 190 142
+aline 190 428
+aline 142 571
+aline 142 666
+aline 238 761
+amove 190 714
+aline 190 666
+aline 238 571
+aline 285 428
+aline 285 142
+aline 333 95
+aline 238 0
+amove 238 142
+aline 285 95
+aline 238 47
+aline 190 95
+aline 238 142
+aline 238 428
+aline 190 571
+aline 190 619
+amove 285 523
+aline 428 619
+aline 523 666
+aline 619 619
+aline 666 523
+aline 666 142
+aline 761 95
+aline 809 47
+amove 857 47
+aline 714 0
+aline 666 47
+aline 571 95
+aline 523 95
+aline 571 142
+aline 571 476
+aline 523 571
+aline 428 619
+amove 523 619
+aline 571 571
+aline 619 476
+aline 619 142
+aline 761 47
+amove 857 47
+aline 952 95
+aline 1000 142
+aline 1047 333
+aline 1047 428
+aline 1000 571
+aline 952 666
+aline 666 523
+amove 857 619
+aline 952 523
+aline 1000 380
+aline 1000 285
+aline 952 142
+aline 857 47
+amove 1000 476
+aline 952 571
+aline 904 619
+stroke
+dfont endchar
+dfont char=120
+amove 95 0
+aline 190 95
+aline 285 95
+aline 380 47
+aline 428 0
+aline 619 95
+amove 523 47
+aline 476 95
+aline 380 142
+aline 380 571
+aline 285 666
+aline 142 523
+amove 190 571
+aline 238 571
+aline 285 523
+aline 285 142
+aline 238 142
+aline 142 95
+aline 95 -1
+aline 95 -96
+aline 142 -191
+aline 238 -239
+aline 380 -239
+aline 523 -191
+aline 523 -143
+aline 476 -143
+aline 476 -191
+amove 476 47
+aline 333 142
+aline 333 523
+aline 238 619
+amove 380 571
+aline 571 666
+aline 619 571
+aline 523 523
+aline 476 619
+amove 523 619
+aline 571 571
+stroke
+dfont endchar
+dfont char=121
+amove 142 95
+aline 190 142
+aline 190 428
+aline 142 571
+aline 142 666
+aline 238 761
+amove 190 714
+aline 190 666
+aline 238 571
+aline 285 428
+aline 285 142
+aline 333 95
+aline 380 95
+amove 428 142
+aline 285 0
+aline 238 47
+aline 142 95
+amove 333 47
+aline 238 95
+aline 238 428
+aline 190 571
+aline 190 619
+amove 285 523
+aline 571 666
+aline 619 571
+aline 666 380
+aline 666 190
+aline 619 47
+aline 571 -48
+aline 476 -143
+aline 333 -239
+amove 476 -143
+aline 571 0
+aline 619 190
+aline 619 333
+aline 571 476
+aline 476 619
+amove 523 619
+aline 571 571
+aline 619 428
+stroke
+dfont endchar
+dfont char=122
+amove 142 523
+aline 380 666
+aline 476 619
+aline 523 523
+aline 523 428
+aline 476 333
+aline 285 238
+amove 380 619
+aline 476 571
+amove 333 619
+aline 428 571
+aline 476 476
+aline 476 428
+aline 428 333
+aline 380 285
+aline 476 190
+aline 523 95
+aline 523 -96
+aline 476 -191
+aline 380 -239
+aline 285 -239
+aline 190 -191
+aline 142 -96
+aline 142 -1
+aline 190 95
+aline 285 142
+aline 571 238
+amove 333 238
+aline 428 190
+aline 476 95
+amove 285 238
+aline 428 142
+aline 476 47
+aline 476 -96
+aline 428 -191
+aline 380 -239
+stroke
+dfont endchar
+dfont char=123
+amove 380 238
+aline 333 95
+aline 333 -96
+aline 380 -239
+amove 476 -334
+aline 333 -191
+aline 285 -48
+aline 285 47
+aline 333 190
+aline 428 285
+aline 428 333
+aline 238 428
+aline 428 523
+aline 428 571
+aline 333 666
+aline 285 809
+aline 285 904
+aline 333 1047
+aline 476 1190
+amove 380 1095
+aline 333 952
+aline 333 761
+aline 380 619
+stroke
+dfont endchar
+dfont char=124
+amove 380 428
+aline 380 1000
+aline 333 952
+aline 428 476
+aline 380 428
+aline 333 476
+aline 428 952
+aline 380 1000
+amove 142 857
+aline 619 571
+aline 571 571
+aline 190 857
+aline 142 857
+aline 142 809
+aline 619 619
+aline 619 571
+amove 619 857
+aline 142 571
+aline 190 571
+aline 571 857
+aline 619 857
+aline 619 809
+aline 142 619
+aline 142 571
+stroke
+dfont endchar
+dfont char=125
+amove 238 -334
+aline 380 -191
+aline 428 -48
+aline 428 47
+aline 380 190
+aline 285 285
+aline 285 333
+aline 476 428
+aline 285 523
+aline 285 571
+aline 380 666
+aline 428 809
+aline 428 904
+aline 380 1047
+aline 238 1190
+amove 333 1095
+aline 380 952
+aline 380 761
+aline 333 619
+amove 333 238
+aline 380 95
+aline 380 -96
+aline 333 -239
+stroke
+dfont endchar
+dfont char=126
+amove 190 238
+aline 333 47
+amove 380 47
+aline 190 285
+amove 428 523
+aline 142 238
+aline 333 0
+aline 619 285
+amove 666 333
+aline 952 619
+aline 1000 571
+aline 1047 571
+aline 1095 619
+aline 1047 523
+aline 1000 476
+aline 952 476
+aline 904 523
+amove 904 571
+aline 952 523
+aline 1047 523
+amove 1095 142
+aline 1047 47
+aline 1000 0
+aline 904 0
+aline 809 47
+aline 714 142
+aline 523 428
+aline 238 714
+aline 476 1000
+aline 666 761
+aline 476 571
+amove 619 714
+aline 428 952
+amove 476 952
+aline 619 761
+amove 285 761
+aline 571 476
+aline 761 190
+aline 809 142
+aline 904 95
+aline 1047 95
+aline 1095 142
+amove 1047 47
+aline 904 47
+aline 809 95
+aline 714 190
+aline 523 476
+aline 285 714
+stroke
+dfont endchar
diff --git a/src/fonts/plgi.afm b/src/fonts/plgi.afm
new file mode 100644
index 0000000..692990d
--- /dev/null
+++ b/src/fonts/plgi.afm
@@ -0,0 +1,115 @@
+StartFontMetrics 2.0
+Comment Made from HERSHEY font file using SPLITFONT.BAS
+FontName plGI
+EncodingScheme TEXENCODING
+FullName plGI
+FamilyName plGI
+Weight Medium
+ItalicAngle 0
+IsFixedPitch false
+UnderlinePosition -97
+UnderlineThickness 73
+FontBBox 0 -400 1001 1001
+CapHeight 729
+XHeight 151
+Descender -219
+Ascender 729
+StartCharMetrics 95
+C 32 ; WX 400 ; N C32 ; B 0 0 0 0 ;
+C 33 ; WX 384 ; N C33 ; B 99 0 299 700 ;
+C 34 ; WX 384 ; N C34 ; B 133 466 233 700 ;
+C 35 ; WX 300 ; N C35 ; B 0 0 0 0 ;
+C 36 ; WX 651 ; N C36 ; B 99 -133 566 833 ;
+C 37 ; WX 784 ; N C37 ; B 99 0 700 700 ;
+C 38 ; WX 300 ; N C38 ; B 0 0 0 0 ;
+C 39 ; WX 384 ; N C39 ; B 166 466 266 700 ;
+C 40 ; WX 451 ; N C40 ; B 99 -233 333 833 ;
+C 41 ; WX 451 ; N C41 ; B 133 -233 366 833 ;
+C 42 ; WX 585 ; N C42 ; B 133 466 500 700 ;
+C 43 ; WX 818 ; N C43 ; B 133 32 700 600 ;
+C 44 ; WX 384 ; N C44 ; B 133 -133 233 99 ;
+C 45 ; WX 818 ; N C45 ; B 133 299 700 333 ;
+C 46 ; WX 384 ; N C46 ; B 133 0 266 99 ;
+C 47 ; WX 751 ; N C47 ; B 66 -233 700 833 ;
+C 48 ; WX 651 ; N C48 ; B 66 0 600 700 ;
+C 49 ; WX 651 ; N C49 ; B 233 0 466 700 ;
+C 50 ; WX 651 ; N C50 ; B 99 0 600 700 ;
+C 51 ; WX 651 ; N C51 ; B 99 0 532 700 ;
+C 52 ; WX 651 ; N C52 ; B 99 0 633 700 ;
+C 53 ; WX 651 ; N C53 ; B 99 0 600 700 ;
+C 54 ; WX 651 ; N C54 ; B 66 0 600 700 ;
+C 55 ; WX 651 ; N C55 ; B 99 0 600 700 ;
+C 56 ; WX 651 ; N C56 ; B 66 0 600 700 ;
+C 57 ; WX 651 ; N C57 ; B 66 0 600 700 ;
+C 58 ; WX 384 ; N C58 ; B 133 0 266 466 ;
+C 59 ; WX 384 ; N C59 ; B 133 -133 266 466 ;
+C 60 ; WX 784 ; N C60 ; B 133 0 666 600 ;
+C 61 ; WX 818 ; N C61 ; B 133 166 700 466 ;
+C 62 ; WX 784 ; N C62 ; B 133 0 666 600 ;
+C 63 ; WX 585 ; N C63 ; B 99 0 500 700 ;
+C 64 ; WX 884 ; N C64 ; B 99 0 799 700 ;
+C 65 ; WX 851 ; N C65 ; B 99 0 766 700 ;
+C 66 ; WX 851 ; N C66 ; B 99 0 766 700 ;
+C 67 ; WX 851 ; N C67 ; B 99 0 766 700 ;
+C 68 ; WX 851 ; N C68 ; B 99 0 766 700 ;
+C 69 ; WX 851 ; N C69 ; B 99 0 766 700 ;
+C 70 ; WX 851 ; N C70 ; B 99 0 766 700 ;
+C 71 ; WX 851 ; N C71 ; B 99 0 766 700 ;
+C 72 ; WX 851 ; N C72 ; B 99 0 766 700 ;
+C 73 ; WX 851 ; N C73 ; B 99 0 766 700 ;
+C 74 ; WX 851 ; N C74 ; B 99 0 766 700 ;
+C 75 ; WX 851 ; N C75 ; B 99 0 766 700 ;
+C 76 ; WX 851 ; N C76 ; B 99 0 766 700 ;
+C 77 ; WX 851 ; N C77 ; B 99 0 766 700 ;
+C 78 ; WX 851 ; N C78 ; B 99 0 766 700 ;
+C 79 ; WX 851 ; N C79 ; B 99 0 766 700 ;
+C 80 ; WX 851 ; N C80 ; B 99 0 766 700 ;
+C 81 ; WX 851 ; N C81 ; B 99 0 766 700 ;
+C 82 ; WX 851 ; N C82 ; B 99 0 766 700 ;
+C 83 ; WX 851 ; N C83 ; B 99 0 766 700 ;
+C 84 ; WX 851 ; N C84 ; B 99 0 766 700 ;
+C 85 ; WX 851 ; N C85 ; B 99 0 766 700 ;
+C 86 ; WX 851 ; N C86 ; B 99 0 766 700 ;
+C 87 ; WX 851 ; N C87 ; B 99 0 766 700 ;
+C 88 ; WX 851 ; N C88 ; B 99 0 766 700 ;
+C 89 ; WX 851 ; N C89 ; B 99 0 766 700 ;
+C 90 ; WX 851 ; N C90 ; B 99 0 766 700 ;
+C 91 ; WX 451 ; N C91 ; B 133 -233 366 833 ;
+C 92 ; WX 300 ; N C92 ; B 0 0 0 0 ;
+C 93 ; WX 451 ; N C93 ; B 99 -233 333 833 ;
+C 94 ; WX 300 ; N C94 ; B 0 0 0 0 ;
+C 95 ; WX 300 ; N C95 ; B 0 0 0 0 ;
+C 96 ; WX 318 ; N C96 ; B 133 500 199 700 ;
+C 97 ; WX 551 ; N C97 ; B 99 0 466 466 ;
+C 98 ; WX 551 ; N C98 ; B 99 0 466 700 ;
+C 99 ; WX 384 ; N C99 ; B 99 0 366 466 ;
+C 100 ; WX 518 ; N C100 ; B 99 0 433 700 ;
+C 101 ; WX 418 ; N C101 ; B 99 0 399 466 ;
+C 102 ; WX 384 ; N C102 ; B 32 0 399 700 ;
+C 103 ; WX 551 ; N C103 ; B 99 -233 433 466 ;
+C 104 ; WX 585 ; N C104 ; B 99 -233 466 700 ;
+C 105 ; WX 318 ; N C105 ; B 99 0 233 700 ;
+C 106 ; WX 318 ; N C106 ; B 99 -233 233 700 ;
+C 107 ; WX 551 ; N C107 ; B 99 0 500 700 ;
+C 108 ; WX 318 ; N C108 ; B 99 0 233 700 ;
+C 109 ; WX 851 ; N C109 ; B 66 0 766 466 ;
+C 110 ; WX 585 ; N C110 ; B 66 0 500 466 ;
+C 111 ; WX 518 ; N C111 ; B 99 0 433 466 ;
+C 112 ; WX 551 ; N C112 ; B 66 -233 466 466 ;
+C 113 ; WX 551 ; N C113 ; B 99 -233 466 466 ;
+C 114 ; WX 418 ; N C114 ; B 66 0 399 466 ;
+C 115 ; WX 518 ; N C115 ; B 99 0 433 466 ;
+C 116 ; WX 318 ; N C116 ; B 32 0 299 700 ;
+C 117 ; WX 585 ; N C117 ; B 66 0 532 466 ;
+C 118 ; WX 585 ; N C118 ; B 99 0 500 466 ;
+C 119 ; WX 851 ; N C119 ; B 99 0 766 466 ;
+C 120 ; WX 585 ; N C120 ; B 99 0 500 466 ;
+C 121 ; WX 585 ; N C121 ; B 66 -233 500 466 ;
+C 122 ; WX 485 ; N C122 ; B 32 -233 366 466 ;
+C 123 ; WX 485 ; N C123 ; B 166 -233 333 833 ;
+C 124 ; WX 518 ; N C124 ; B 99 299 433 700 ;
+C 125 ; WX 485 ; N C125 ; B 166 -233 333 833 ;
+C 126 ; WX 851 ; N C126 ; B 99 0 766 700 ;
+EndCharMetrics
+
+EndFontMetrics
diff --git a/src/fonts/plgi.gle b/src/fonts/plgi.gle
new file mode 100644
index 0000000..68ecd58
--- /dev/null
+++ b/src/fonts/plgi.gle
@@ -0,0 +1,3252 @@
+dfont design= 1428
+dfont char=33
+amove 285 95
+aline 238 47
+aline 333 47
+aline 285 95
+amove 285 142
+aline 190 47
+aline 285 0
+aline 380 47
+aline 285 142
+amove 285 333
+aline 285 857
+aline 238 904
+aline 285 952
+aline 333 904
+aline 285 857
+amove 285 1000
+aline 238 952
+aline 142 904
+aline 238 857
+aline 285 333
+aline 333 857
+aline 428 904
+aline 333 952
+aline 285 1000
+stroke
+dfont endchar
+dfont char=34
+amove 190 666
+aline 285 714
+aline 333 809
+aline 333 904
+aline 285 1000
+aline 190 904
+aline 285 809
+aline 285 714
+amove 285 952
+aline 238 904
+aline 285 857
+aline 285 952
+stroke
+dfont endchar
+stroke
+dfont endchar
+dfont char=36
+amove 238 95
+aline 190 190
+amove 380 0
+aline 285 47
+aline 238 142
+aline 238 238
+aline 142 190
+aline 190 95
+aline 238 47
+aline 380 0
+aline 571 0
+aline 714 47
+aline 761 95
+aline 809 190
+aline 809 333
+aline 761 428
+aline 619 523
+aline 333 619
+aline 238 666
+aline 190 761
+aline 190 857
+aline 238 952
+amove 190 714
+aline 238 619
+aline 333 571
+aline 619 476
+aline 714 428
+aline 761 333
+amove 714 47
+aline 761 142
+aline 761 285
+aline 714 380
+aline 619 428
+aline 333 523
+aline 190 619
+aline 142 714
+aline 142 857
+aline 238 952
+aline 380 1000
+aline 571 1000
+aline 714 952
+aline 761 904
+aline 809 809
+aline 714 761
+aline 714 857
+aline 666 952
+aline 571 1000
+amove 714 904
+aline 761 809
+amove 571 1190
+aline 571 -191
+amove 380 -191
+aline 380 1190
+stroke
+dfont endchar
+dfont char=37
+amove 142 0
+aline 1000 1000
+aline 904 952
+aline 761 904
+aline 619 904
+aline 476 952
+aline 380 1000
+aline 285 1000
+aline 190 952
+aline 142 857
+aline 142 761
+aline 238 666
+aline 333 666
+aline 428 714
+aline 476 809
+aline 476 904
+aline 380 1000
+amove 809 333
+aline 714 285
+aline 666 190
+aline 666 95
+aline 761 0
+aline 857 0
+aline 952 47
+aline 1000 142
+aline 1000 238
+aline 904 333
+aline 809 333
+stroke
+dfont endchar
+stroke
+dfont endchar
+dfont char=39
+amove 285 809
+aline 285 714
+aline 333 761
+aline 285 809
+amove 285 952
+aline 285 857
+aline 380 761
+aline 285 666
+aline 238 761
+aline 238 857
+aline 285 952
+aline 380 1000
+stroke
+dfont endchar
+dfont char=40
+amove 285 -48
+aline 238 95
+aline 190 285
+aline 190 571
+aline 238 761
+aline 285 904
+amove 380 1095
+aline 333 1000
+aline 285 857
+aline 238 571
+aline 238 285
+aline 285 0
+aline 333 -143
+aline 380 -239
+amove 476 -334
+aline 380 -239
+aline 285 -96
+aline 190 95
+aline 142 333
+aline 142 523
+aline 190 761
+aline 285 952
+aline 380 1095
+aline 476 1190
+stroke
+dfont endchar
+dfont char=41
+amove 285 -239
+aline 333 -143
+aline 380 0
+aline 428 285
+aline 428 571
+aline 380 857
+aline 333 1000
+aline 285 1095
+amove 190 1190
+aline 285 1095
+aline 380 952
+aline 476 761
+aline 523 523
+aline 523 333
+aline 476 95
+aline 380 -96
+aline 285 -239
+aline 190 -334
+amove 380 -48
+aline 428 95
+aline 476 285
+aline 476 571
+aline 428 761
+aline 380 904
+stroke
+dfont endchar
+dfont char=42
+amove 190 666
+aline 238 952
+amove 238 1000
+aline 190 952
+aline 190 666
+aline 285 952
+aline 238 1000
+amove 666 1000
+aline 619 952
+aline 619 666
+aline 666 952
+amove 666 1000
+aline 714 952
+aline 619 666
+stroke
+dfont endchar
+dfont char=43
+amove 190 476
+aline 1000 476
+aline 1000 428
+aline 190 428
+aline 190 476
+amove 571 857
+aline 571 47
+aline 619 47
+aline 619 857
+aline 571 857
+stroke
+dfont endchar
+dfont char=44
+amove 190 -191
+aline 285 -143
+aline 333 -48
+aline 333 47
+aline 285 142
+aline 190 47
+aline 285 -48
+aline 285 -143
+amove 285 95
+aline 238 47
+aline 285 0
+aline 285 95
+stroke
+dfont endchar
+dfont char=45
+amove 190 476
+aline 1000 476
+aline 1000 428
+aline 190 428
+aline 190 476
+stroke
+dfont endchar
+dfont char=46
+amove 285 142
+aline 190 47
+aline 285 0
+aline 380 47
+aline 285 142
+amove 285 95
+aline 238 47
+aline 333 47
+aline 285 95
+stroke
+dfont endchar
+dfont char=47
+amove 142 -334
+aline 95 -334
+aline 952 1190
+aline 1000 1190
+aline 142 -334
+stroke
+dfont endchar
+dfont char=48
+amove 95 95
+aline 190 142
+aline 190 904
+aline 285 904
+aline 523 952
+aline 619 1000
+aline 666 952
+aline 761 904
+aline 857 904
+aline 761 857
+aline 761 95
+aline 666 95
+aline 428 47
+aline 333 0
+aline 285 47
+aline 190 95
+aline 95 95
+amove 380 47
+aline 238 142
+aline 238 857
+amove 285 904
+aline 285 142
+aline 380 95
+aline 428 47
+amove 666 95
+aline 666 857
+aline 571 904
+aline 523 952
+amove 571 952
+aline 714 857
+aline 714 142
+stroke
+dfont endchar
+dfont char=49
+amove 333 95
+aline 428 142
+aline 428 761
+aline 380 857
+aline 333 904
+aline 476 1000
+aline 523 904
+aline 523 142
+aline 619 95
+aline 666 95
+aline 571 47
+aline 523 0
+aline 476 47
+aline 380 95
+aline 333 95
+amove 571 47
+aline 476 95
+aline 476 857
+aline 428 952
+aline 380 904
+aline 428 857
+stroke
+dfont endchar
+dfont char=50
+amove 142 0
+aline 142 238
+aline 190 380
+aline 285 476
+aline 428 523
+aline 761 523
+aline 761 904
+aline 666 904
+aline 523 952
+aline 428 1000
+aline 380 952
+aline 285 904
+aline 190 904
+aline 285 857
+aline 380 857
+aline 476 904
+aline 523 952
+amove 476 952
+aline 380 904
+amove 666 904
+aline 666 523
+amove 714 571
+aline 714 857
+amove 857 95
+aline 666 142
+aline 523 142
+aline 333 95
+aline 142 -1
+aline 380 47
+aline 619 47
+aline 761 -1
+aline 857 95
+amove 809 47
+aline 666 95
+aline 428 95
+aline 285 47
+stroke
+dfont endchar
+dfont char=51
+amove 142 95
+aline 238 95
+aline 333 47
+aline 380 0
+aline 476 47
+aline 666 95
+aline 761 95
+aline 761 428
+aline 666 428
+aline 523 476
+aline 428 523
+amove 428 476
+aline 523 523
+aline 666 571
+aline 761 571
+aline 761 904
+aline 666 904
+aline 476 952
+aline 380 1000
+aline 333 952
+aline 238 904
+aline 190 904
+aline 285 857
+aline 380 857
+aline 476 952
+amove 428 952
+aline 333 904
+amove 666 904
+aline 666 571
+amove 714 619
+aline 714 857
+amove 666 428
+aline 666 95
+amove 714 142
+aline 714 380
+amove 476 47
+aline 428 95
+aline 333 142
+aline 238 142
+aline 142 95
+amove 333 95
+aline 428 47
+stroke
+dfont endchar
+dfont char=52
+amove 238 285
+aline 238 619
+amove 190 523
+aline 190 333
+amove 476 95
+aline 523 95
+aline 619 47
+aline 666 0
+aline 714 47
+aline 809 95
+aline 761 95
+aline 666 142
+aline 666 809
+aline 714 904
+aline 619 1000
+aline 142 523
+aline 142 285
+aline 571 285
+amove 666 285
+aline 857 285
+aline 904 238
+aline 904 333
+aline 857 285
+amove 714 47
+aline 619 95
+aline 619 952
+aline 666 904
+aline 619 809
+amove 571 952
+aline 571 142
+aline 476 95
+stroke
+dfont endchar
+dfont char=53
+amove 142 95
+aline 238 95
+aline 333 47
+aline 380 0
+aline 476 47
+aline 666 95
+aline 761 95
+aline 761 571
+aline 857 619
+aline 809 619
+aline 714 666
+aline 666 714
+aline 619 666
+aline 523 619
+aline 333 571
+aline 190 571
+aline 190 1000
+aline 761 1000
+aline 714 952
+aline 619 904
+aline 190 904
+amove 238 952
+aline 666 952
+amove 619 666
+aline 714 619
+aline 714 142
+amove 666 95
+aline 666 571
+aline 571 619
+aline 523 619
+amove 333 95
+aline 428 47
+amove 476 47
+aline 428 95
+aline 333 142
+aline 238 142
+aline 142 95
+stroke
+dfont endchar
+dfont char=54
+amove 95 95
+aline 190 142
+aline 190 904
+aline 285 904
+aline 476 952
+aline 571 1000
+aline 619 952
+aline 714 904
+aline 761 904
+aline 666 857
+aline 571 857
+aline 476 952
+amove 523 952
+aline 619 904
+amove 666 666
+aline 714 619
+aline 809 571
+aline 857 571
+aline 761 523
+aline 761 95
+aline 666 95
+aline 428 47
+aline 333 0
+aline 285 47
+aline 190 95
+aline 95 95
+amove 380 47
+aline 238 142
+aline 238 857
+amove 285 904
+aline 285 142
+aline 380 95
+aline 428 47
+amove 666 95
+aline 666 523
+aline 571 571
+aline 523 571
+amove 619 619
+aline 714 523
+aline 714 142
+amove 666 666
+aline 619 619
+aline 523 571
+aline 333 523
+aline 285 523
+stroke
+dfont endchar
+dfont char=55
+amove 428 0
+aline 380 142
+aline 380 285
+aline 428 428
+aline 523 571
+aline 714 761
+aline 809 904
+aline 857 1000
+aline 666 904
+aline 476 857
+aline 333 857
+aline 142 904
+aline 238 1000
+aline 380 952
+aline 619 952
+aline 857 1000
+amove 714 952
+aline 571 904
+aline 333 904
+aline 190 952
+amove 619 666
+aline 523 523
+aline 476 380
+aline 476 238
+aline 523 95
+aline 428 -1
+amove 476 47
+aline 428 190
+aline 428 333
+aline 476 476
+stroke
+dfont endchar
+dfont char=56
+amove 95 95
+aline 190 142
+aline 190 428
+aline 285 428
+aline 666 571
+aline 761 571
+aline 761 857
+aline 857 904
+aline 809 904
+aline 714 952
+aline 666 1000
+aline 619 952
+aline 523 904
+aline 285 857
+aline 190 857
+aline 190 571
+aline 285 571
+aline 666 428
+aline 761 428
+aline 761 95
+aline 666 95
+aline 428 47
+aline 333 0
+aline 285 47
+aline 190 95
+aline 95 95
+amove 380 47
+aline 238 142
+aline 238 380
+amove 285 428
+aline 285 142
+aline 380 95
+aline 428 47
+amove 666 95
+aline 666 428
+amove 714 380
+aline 714 142
+amove 666 571
+aline 666 857
+aline 571 904
+aline 523 904
+amove 619 952
+aline 714 904
+aline 714 619
+amove 285 571
+aline 285 857
+amove 238 809
+aline 238 619
+stroke
+dfont endchar
+dfont char=57
+amove 142 95
+aline 238 95
+aline 333 47
+aline 380 0
+aline 476 47
+aline 666 95
+aline 761 95
+aline 761 857
+aline 857 904
+aline 761 904
+aline 666 952
+aline 619 1000
+aline 523 952
+aline 285 904
+aline 190 904
+aline 190 476
+aline 95 428
+aline 142 428
+aline 238 380
+aline 285 333
+aline 333 380
+aline 428 428
+aline 619 476
+aline 666 476
+amove 428 428
+aline 380 428
+aline 285 476
+aline 285 904
+amove 238 857
+aline 238 428
+aline 333 380
+amove 333 95
+aline 428 47
+amove 476 47
+aline 428 95
+aline 333 142
+aline 238 142
+aline 142 95
+amove 666 95
+aline 666 857
+aline 571 904
+aline 523 952
+amove 571 952
+aline 714 857
+aline 714 142
+stroke
+dfont endchar
+dfont char=58
+amove 285 666
+aline 190 571
+aline 285 523
+aline 380 571
+aline 285 666
+amove 285 619
+aline 238 571
+aline 333 571
+aline 285 619
+amove 285 142
+aline 190 47
+aline 285 -1
+aline 380 47
+aline 285 142
+amove 285 95
+aline 238 47
+aline 333 47
+aline 285 95
+stroke
+dfont endchar
+dfont char=59
+amove 190 -191
+aline 285 -143
+aline 333 -48
+aline 333 47
+aline 285 142
+aline 190 47
+aline 285 -48
+aline 285 -143
+amove 285 95
+aline 238 47
+aline 285 0
+aline 285 95
+amove 285 619
+aline 238 571
+aline 333 571
+aline 285 619
+amove 285 666
+aline 190 571
+aline 285 523
+aline 380 571
+aline 285 666
+stroke
+dfont endchar
+dfont char=60
+amove 952 857
+aline 190 428
+aline 952 0
+stroke
+dfont endchar
+dfont char=61
+amove 190 285
+aline 1000 285
+aline 1000 238
+aline 190 238
+aline 190 285
+amove 190 666
+aline 1000 666
+aline 1000 619
+aline 190 619
+aline 190 666
+stroke
+dfont endchar
+dfont char=62
+amove 190 0
+aline 952 428
+aline 190 857
+stroke
+dfont endchar
+dfont char=63
+amove 428 95
+aline 380 47
+aline 476 47
+aline 428 95
+amove 428 142
+aline 333 47
+aline 428 0
+aline 523 47
+aline 428 142
+amove 428 333
+aline 380 476
+aline 476 476
+aline 428 333
+aline 428 476
+amove 476 476
+aline 571 523
+aline 666 619
+aline 714 714
+aline 714 809
+aline 666 904
+aline 619 952
+aline 476 1000
+aline 380 1000
+aline 238 952
+aline 190 904
+aline 142 809
+aline 238 761
+aline 238 857
+aline 285 952
+aline 380 1000
+amove 476 1000
+aline 571 952
+aline 619 857
+aline 619 666
+aline 571 571
+aline 476 476
+amove 619 619
+aline 666 666
+aline 666 857
+aline 619 904
+amove 238 904
+aline 190 809
+stroke
+dfont endchar
+dfont char=64
+amove 523 238
+aline 476 285
+aline 428 380
+aline 428 523
+aline 476 666
+aline 571 761
+amove 857 761
+aline 809 380
+aline 809 285
+aline 904 238
+aline 999 238
+aline 1095 333
+aline 1142 476
+aline 1142 571
+aline 1095 714
+aline 1047 809
+aline 952 904
+aline 857 952
+aline 714 1000
+aline 571 1000
+aline 428 952
+aline 333 904
+aline 238 809
+aline 190 714
+aline 142 571
+aline 142 428
+aline 190 285
+aline 238 190
+aline 333 95
+aline 428 47
+aline 571 0
+aline 714 0
+aline 857 47
+aline 952 95
+aline 1000 142
+amove 904 238
+aline 857 285
+aline 857 380
+aline 904 761
+amove 857 619
+aline 809 714
+aline 714 761
+aline 571 761
+aline 476 714
+aline 428 666
+aline 380 523
+aline 380 380
+aline 428 285
+aline 523 238
+aline 666 238
+aline 761 285
+aline 809 380
+stroke
+dfont endchar
+dfont char=65
+amove 142 0
+aline 238 47
+aline 285 142
+aline 285 238
+aline 238 428
+aline 238 571
+aline 285 714
+aline 333 809
+aline 428 904
+aline 333 857
+aline 238 761
+aline 190 666
+aline 142 523
+aline 142 380
+aline 190 285
+aline 285 238
+amove 238 285
+aline 190 380
+aline 190 571
+aline 238 714
+amove 238 523
+aline 904 523
+amove 952 904
+aline 952 95
+amove 1000 47
+aline 1000 952
+amove 1095 1000
+aline 1000 952
+aline 809 904
+aline 571 904
+aline 285 952
+aline 142 1000
+amove 809 904
+aline 904 904
+aline 904 95
+aline 809 95
+amove 1095 0
+aline 1000 47
+aline 809 95
+aline 571 95
+aline 285 47
+aline 142 0
+stroke
+dfont endchar
+dfont char=66
+amove 142 190
+aline 238 95
+aline 333 47
+aline 523 0
+aline 714 0
+aline 857 47
+aline 952 95
+aline 1047 190
+aline 1095 333
+aline 1095 476
+aline 1047 571
+aline 952 666
+aline 809 714
+aline 666 714
+aline 523 666
+aline 476 619
+aline 428 523
+aline 428 428
+aline 476 333
+aline 571 285
+amove 523 -1
+aline 428 47
+aline 428 952
+aline 523 1000
+amove 380 952
+aline 380 47
+amove 333 47
+aline 333 952
+amove 142 809
+aline 238 904
+aline 333 952
+aline 523 1000
+aline 761 1000
+aline 904 952
+aline 999 857
+aline 999 761
+aline 952 666
+amove 904 666
+aline 952 761
+aline 952 857
+aline 904 904
+amove 761 1000
+aline 857 952
+aline 904 857
+aline 904 761
+aline 857 714
+amove 809 714
+aline 952 619
+aline 999 476
+aline 999 285
+aline 952 142
+aline 857 47
+amove 999 190
+aline 1047 285
+aline 1047 476
+aline 999 571
+stroke
+dfont endchar
+dfont char=67
+amove 238 238
+aline 190 380
+aline 190 619
+aline 238 761
+amove 428 952
+aline 333 857
+aline 285 761
+aline 238 619
+aline 238 380
+aline 285 238
+aline 333 142
+aline 428 47
+amove 809 47
+aline 904 142
+aline 952 238
+aline 1000 380
+amove 1000 238
+aline 952 190
+amove 1047 95
+aline 1000 333
+aline 1000 666
+aline 1047 904
+amove 1095 1000
+aline 1047 904
+aline 1000 809
+aline 904 904
+aline 809 952
+aline 666 1000
+aline 571 1000
+aline 428 952
+aline 333 904
+aline 238 809
+aline 190 714
+aline 142 571
+aline 142 428
+aline 190 285
+aline 238 190
+aline 333 95
+aline 428 47
+aline 571 0
+aline 666 0
+aline 809 47
+aline 904 95
+aline 1000 190
+aline 1047 95
+aline 1095 0
+amove 1000 619
+aline 952 761
+aline 904 857
+aline 809 952
+amove 952 809
+aline 1000 761
+stroke
+dfont endchar
+dfont char=68
+amove 142 238
+aline 190 142
+aline 285 47
+aline 428 -1
+aline 666 -1
+aline 809 47
+aline 904 95
+aline 1000 190
+aline 1047 285
+aline 1095 428
+aline 1095 571
+aline 1047 714
+aline 1000 809
+aline 904 904
+aline 809 952
+aline 666 1000
+aline 428 1000
+aline 285 952
+aline 190 857
+aline 142 761
+amove 285 952
+aline 285 47
+amove 333 47
+aline 333 952
+amove 428 1000
+aline 380 952
+aline 380 47
+aline 428 -1
+amove 809 47
+aline 904 142
+aline 952 238
+aline 1000 380
+aline 1000 619
+aline 952 761
+aline 904 857
+aline 809 952
+amove 1000 761
+aline 1047 619
+aline 1047 380
+aline 1000 238
+stroke
+dfont endchar
+dfont char=69
+amove 238 238
+aline 190 380
+aline 190 619
+aline 238 761
+amove 238 523
+aline 285 571
+aline 428 571
+aline 761 476
+aline 904 476
+aline 999 523
+aline 952 428
+aline 857 380
+aline 761 380
+aline 619 428
+aline 380 571
+amove 523 523
+aline 619 476
+aline 761 428
+aline 857 428
+aline 952 476
+amove 1000 380
+aline 952 238
+aline 904 142
+aline 809 47
+amove 952 190
+aline 1000 238
+amove 1047 95
+aline 1000 333
+aline 1000 666
+aline 1047 904
+amove 1095 1000
+aline 1047 904
+aline 1000 809
+aline 904 904
+aline 809 952
+aline 666 1000
+aline 571 1000
+aline 428 952
+aline 333 904
+aline 238 809
+aline 190 714
+aline 142 571
+aline 142 428
+aline 190 285
+aline 238 190
+aline 333 95
+aline 428 47
+aline 571 0
+aline 666 0
+aline 809 47
+aline 904 95
+aline 1000 190
+aline 1047 95
+aline 1095 0
+amove 428 47
+aline 333 142
+aline 285 238
+aline 238 380
+aline 238 619
+aline 285 761
+aline 333 857
+aline 428 952
+amove 809 952
+aline 904 857
+aline 1000 666
+aline 952 714
+aline 904 714
+aline 857 666
+aline 904 619
+aline 952 666
+amove 1000 761
+aline 952 809
+stroke
+dfont endchar
+dfont char=70
+amove 142 0
+aline 238 47
+aline 428 95
+aline 666 95
+aline 952 47
+aline 1095 0
+amove 1095 285
+aline 1047 380
+aline 1000 571
+aline 1000 714
+aline 1047 904
+aline 1095 1000
+aline 952 857
+aline 904 904
+aline 809 952
+aline 666 1000
+aline 476 1000
+aline 333 952
+aline 238 904
+aline 142 809
+amove 238 904
+aline 238 47
+amove 285 95
+aline 285 904
+aline 380 952
+amove 476 1000
+aline 380 952
+aline 333 857
+aline 333 95
+aline 428 95
+amove 333 523
+aline 380 571
+aline 476 571
+aline 714 523
+aline 857 523
+aline 952 571
+amove 1000 571
+aline 952 714
+aline 904 857
+aline 809 952
+amove 1000 857
+aline 952 761
+amove 904 714
+aline 857 666
+aline 809 714
+aline 857 761
+aline 904 761
+aline 952 714
+aline 952 571
+aline 904 476
+aline 809 428
+aline 714 428
+aline 428 571
+amove 571 523
+aline 714 476
+aline 809 476
+aline 904 523
+stroke
+dfont endchar
+dfont char=71
+amove 238 238
+aline 190 380
+aline 190 619
+aline 238 761
+amove 285 571
+aline 380 619
+aline 476 619
+aline 619 571
+aline 714 523
+amove 857 476
+aline 761 523
+aline 619 619
+aline 476 666
+aline 380 666
+aline 285 619
+aline 238 523
+aline 333 571
+aline 476 571
+aline 761 476
+aline 952 476
+aline 1000 523
+amove 1000 619
+aline 952 761
+aline 904 857
+aline 809 952
+amove 952 809
+aline 1000 761
+amove 1047 904
+aline 1000 666
+aline 1000 333
+aline 1047 95
+amove 1095 -1
+aline 1047 95
+aline 1000 238
+aline 952 142
+aline 904 95
+aline 809 47
+aline 714 -1
+aline 571 -1
+aline 428 47
+aline 333 95
+aline 238 190
+aline 190 285
+aline 142 428
+aline 142 571
+aline 190 714
+aline 238 809
+aline 333 904
+aline 428 952
+aline 571 1000
+aline 666 1000
+aline 809 952
+aline 904 904
+aline 1000 809
+aline 1047 904
+aline 1095 999
+amove 904 476
+aline 904 238
+aline 857 95
+aline 809 47
+amove 904 142
+aline 952 238
+aline 952 428
+amove 428 47
+aline 333 142
+aline 285 238
+aline 238 380
+aline 238 619
+aline 285 761
+aline 333 857
+aline 428 952
+amove 285 380
+aline 333 428
+aline 380 380
+aline 333 333
+aline 285 333
+aline 238 380
+stroke
+dfont endchar
+dfont char=72
+amove 142 0
+aline 238 47
+aline 238 952
+amove 285 904
+aline 285 47
+amove 333 47
+aline 333 904
+aline 428 904
+amove 142 1000
+aline 238 952
+aline 428 904
+aline 666 904
+aline 952 952
+aline 1095 1000
+amove 809 761
+aline 904 714
+aline 952 666
+aline 1000 571
+aline 1000 380
+aline 952 238
+aline 952 142
+aline 1000 47
+aline 1095 0
+amove 952 238
+aline 1047 285
+aline 1095 333
+aline 1095 476
+aline 1047 619
+aline 952 714
+aline 809 761
+aline 619 761
+aline 476 714
+aline 380 619
+aline 333 523
+amove 142 0
+aline 333 47
+aline 523 47
+aline 761 0
+amove 1000 285
+aline 1047 380
+aline 1047 523
+aline 1000 619
+stroke
+dfont endchar
+dfont char=73
+amove 142 0
+aline 285 47
+aline 476 95
+aline 761 95
+aline 952 47
+aline 1095 0
+amove 666 95
+aline 666 857
+amove 619 809
+aline 619 142
+amove 571 95
+aline 571 857
+amove 142 1000
+aline 333 904
+aline 523 857
+aline 714 857
+aline 904 904
+aline 1095 1000
+stroke
+dfont endchar
+dfont char=74
+amove 285 95
+aline 238 142
+aline 190 285
+amove 142 380
+aline 238 285
+aline 285 142
+aline 333 47
+aline 428 0
+amove 666 0
+aline 761 47
+aline 809 142
+aline 809 857
+aline 714 857
+amove 857 857
+aline 857 142
+aline 809 95
+amove 904 95
+aline 904 904
+amove 1095 1000
+aline 904 904
+aline 714 857
+aline 523 857
+aline 333 904
+aline 142 1000
+amove 190 571
+aline 142 476
+aline 142 285
+aline 190 142
+aline 285 47
+aline 428 0
+aline 666 0
+aline 809 47
+aline 904 95
+aline 1000 190
+aline 1095 333
+stroke
+dfont endchar
+dfont char=75
+amove 142 0
+aline 238 47
+aline 238 952
+amove 285 904
+aline 285 47
+amove 333 47
+aline 333 904
+aline 428 904
+amove 142 1000
+aline 238 952
+aline 428 904
+aline 666 904
+aline 952 952
+aline 1095 1000
+amove 857 714
+aline 904 666
+aline 904 571
+aline 857 523
+amove 857 380
+aline 952 285
+aline 952 190
+amove 952 142
+aline 1000 190
+aline 1000 285
+aline 952 380
+aline 809 428
+aline 666 428
+aline 809 523
+aline 857 571
+aline 857 666
+aline 761 761
+amove 666 428
+aline 809 380
+aline 904 285
+aline 952 142
+aline 1000 47
+aline 1047 0
+aline 1095 0
+amove 761 0
+aline 523 47
+aline 333 47
+aline 142 0
+amove 571 333
+aline 619 285
+aline 571 238
+aline 523 285
+aline 523 333
+aline 571 380
+aline 666 428
+aline 904 523
+aline 952 571
+aline 952 666
+aline 904 714
+aline 761 761
+aline 619 761
+aline 476 714
+aline 380 619
+aline 333 523
+stroke
+dfont endchar
+dfont char=76
+amove 142 0
+aline 238 47
+aline 428 95
+aline 666 95
+aline 952 47
+aline 1095 0
+aline 1047 142
+aline 1000 333
+aline 1000 476
+aline 1047 666
+aline 1095 761
+aline 1000 619
+aline 952 523
+aline 904 380
+aline 904 285
+aline 952 190
+aline 1047 142
+amove 1000 190
+aline 952 285
+aline 952 428
+aline 1000 571
+amove 1095 1000
+aline 952 952
+aline 666 904
+aline 428 904
+aline 238 952
+aline 142 1000
+amove 238 952
+aline 238 47
+amove 285 95
+aline 285 904
+amove 428 904
+aline 333 904
+aline 333 95
+aline 428 95
+stroke
+dfont endchar
+dfont char=77
+amove 142 0
+aline 285 47
+aline 476 95
+aline 761 95
+aline 952 47
+aline 1095 0
+amove 904 190
+aline 952 285
+aline 1000 428
+aline 1000 714
+aline 952 857
+aline 857 952
+amove 1000 809
+aline 1047 666
+aline 1047 428
+aline 1000 285
+amove 809 95
+aline 904 190
+aline 1000 238
+aline 1047 285
+aline 1095 428
+aline 1095 666
+aline 1047 809
+aline 952 904
+aline 857 952
+aline 714 1000
+aline 523 1000
+aline 380 952
+aline 285 904
+aline 190 809
+aline 142 666
+aline 142 428
+aline 190 285
+aline 238 238
+aline 333 190
+aline 428 95
+amove 333 190
+aline 285 285
+aline 238 428
+aline 238 714
+aline 285 857
+aline 380 952
+amove 238 809
+aline 190 666
+aline 190 428
+aline 238 285
+amove 571 95
+aline 571 857
+amove 619 809
+aline 619 142
+amove 666 95
+aline 666 857
+amove 1095 999
+aline 904 904
+aline 714 857
+aline 523 857
+aline 333 904
+aline 142 999
+stroke
+dfont endchar
+dfont char=78
+amove 142 0
+aline 238 47
+aline 238 904
+amove 333 904
+aline 285 857
+aline 285 47
+amove 333 47
+aline 333 857
+aline 380 952
+aline 476 1000
+amove 809 952
+aline 904 857
+aline 952 761
+aline 1000 619
+aline 1000 428
+aline 952 238
+aline 952 142
+aline 1000 47
+aline 1047 0
+aline 1095 0
+amove 952 238
+aline 1047 285
+aline 1095 380
+aline 1095 571
+aline 1047 714
+aline 1000 809
+aline 904 904
+aline 809 952
+aline 666 1000
+aline 476 1000
+aline 333 952
+aline 238 904
+aline 142 809
+amove 142 0
+aline 333 47
+aline 523 47
+aline 761 0
+amove 999 285
+aline 1047 428
+aline 1047 619
+aline 999 761
+stroke
+dfont endchar
+dfont char=79
+amove 238 238
+aline 190 380
+aline 190 619
+aline 238 761
+amove 428 952
+aline 333 857
+aline 285 761
+aline 238 619
+aline 238 380
+aline 285 238
+aline 333 142
+aline 428 47
+amove 809 47
+aline 904 142
+aline 952 238
+aline 1000 380
+aline 1000 619
+aline 952 761
+aline 904 857
+aline 809 952
+amove 571 1000
+aline 428 952
+aline 333 904
+aline 238 809
+aline 190 714
+aline 142 571
+aline 142 428
+aline 190 285
+aline 238 190
+aline 333 95
+aline 428 47
+aline 571 0
+aline 666 0
+aline 809 47
+aline 904 95
+aline 1000 190
+aline 1047 285
+aline 1095 428
+aline 1095 571
+aline 1047 714
+aline 1000 809
+aline 904 904
+aline 809 952
+aline 666 1000
+aline 571 1000
+amove 1000 761
+aline 1047 619
+aline 1047 380
+aline 1000 238
+stroke
+dfont endchar
+dfont char=80
+amove 142 0
+aline 238 47
+aline 428 95
+aline 666 95
+aline 952 47
+aline 1095 0
+amove 809 285
+aline 952 380
+aline 1000 523
+aline 1000 714
+aline 952 857
+aline 857 952
+amove 1000 809
+aline 1047 714
+aline 1047 523
+aline 1000 428
+amove 428 95
+aline 333 95
+aline 333 761
+aline 380 857
+aline 476 952
+aline 571 1000
+amove 380 904
+aline 285 809
+aline 285 95
+amove 238 47
+aline 238 857
+amove 142 761
+aline 238 857
+aline 428 952
+aline 571 1000
+aline 714 1000
+aline 857 952
+aline 952 904
+aline 1047 809
+aline 1095 666
+aline 1095 571
+aline 1047 428
+aline 952 333
+aline 809 285
+aline 619 285
+aline 476 333
+aline 380 428
+aline 333 571
+stroke
+dfont endchar
+dfont char=81
+amove 238 238
+aline 190 380
+aline 190 619
+aline 238 761
+amove 428 952
+aline 333 857
+aline 285 761
+aline 238 619
+aline 238 380
+aline 285 238
+aline 333 142
+aline 428 47
+amove 523 190
+aline 619 190
+amove 714 190
+aline 666 142
+aline 571 142
+aline 428 190
+aline 285 285
+amove 238 380
+aline 285 285
+aline 428 238
+aline 714 190
+aline 1047 190
+aline 1095 142
+aline 1095 47
+aline 1047 0
+aline 1047 47
+aline 1095 95
+amove 1000 238
+aline 1047 380
+aline 1047 619
+aline 1000 761
+amove 809 952
+aline 904 857
+aline 952 761
+aline 1000 619
+aline 1000 380
+aline 952 238
+aline 904 142
+aline 809 47
+amove 571 1000
+aline 428 952
+aline 333 904
+aline 238 809
+aline 190 714
+aline 142 571
+aline 142 428
+aline 190 285
+aline 238 190
+aline 333 95
+aline 428 47
+aline 571 0
+aline 666 0
+aline 809 47
+aline 904 95
+aline 1000 190
+aline 1047 285
+aline 1095 428
+aline 1095 571
+aline 1047 714
+aline 1000 809
+aline 904 904
+aline 809 952
+aline 666 1000
+aline 571 1000
+stroke
+dfont endchar
+dfont char=82
+amove 142 0
+aline 238 47
+aline 238 857
+amove 285 857
+aline 285 47
+amove 333 47
+aline 333 904
+amove 142 761
+aline 238 857
+aline 333 904
+aline 428 952
+aline 571 1000
+aline 761 1000
+aline 952 952
+aline 1047 857
+aline 1095 761
+aline 1095 619
+aline 1047 523
+aline 1000 476
+amove 1000 523
+aline 1047 619
+aline 1047 761
+aline 1000 857
+aline 952 904
+amove 761 1000
+aline 857 952
+aline 952 857
+aline 1000 761
+aline 1000 571
+aline 952 476
+amove 904 476
+aline 952 428
+aline 1047 238
+aline 1047 190
+aline 1000 333
+amove 904 428
+aline 761 380
+aline 619 380
+aline 523 428
+aline 523 523
+aline 619 571
+aline 761 571
+aline 904 523
+aline 1000 428
+aline 1095 285
+aline 1095 190
+aline 1047 142
+aline 1000 142
+amove 1095 0
+aline 1047 47
+aline 1000 142
+aline 952 333
+aline 904 428
+aline 809 523
+aline 714 571
+amove 761 0
+aline 523 47
+aline 333 47
+aline 142 0
+stroke
+dfont endchar
+dfont char=83
+amove 190 47
+aline 238 95
+aline 190 190
+amove 333 476
+aline 380 476
+aline 428 523
+aline 523 619
+aline 619 666
+aline 761 666
+aline 857 619
+aline 952 523
+aline 1000 428
+aline 1000 285
+aline 952 142
+aline 857 47
+amove 1000 190
+aline 1047 285
+aline 1047 428
+aline 1000 571
+aline 904 666
+aline 761 714
+aline 619 714
+aline 523 666
+amove 428 523
+aline 428 571
+aline 476 666
+aline 523 714
+aline 619 761
+aline 761 761
+aline 904 714
+aline 1047 571
+aline 1095 428
+aline 1095 333
+aline 1047 190
+aline 952 95
+aline 857 47
+aline 714 0
+aline 523 0
+aline 380 47
+aline 285 95
+aline 190 190
+aline 190 95
+aline 142 0
+aline 238 47
+aline 523 0
+amove 714 380
+aline 619 333
+aline 476 333
+aline 333 380
+aline 285 428
+aline 238 523
+amove 285 857
+aline 238 761
+aline 238 619
+aline 285 523
+aline 380 428
+aline 523 380
+aline 619 380
+aline 714 428
+aline 809 523
+aline 857 571
+aline 904 571
+amove 809 523
+aline 809 476
+aline 761 380
+aline 714 333
+aline 619 285
+aline 476 285
+aline 333 333
+aline 238 428
+aline 190 571
+aline 190 666
+aline 238 809
+aline 380 952
+aline 523 1000
+aline 714 1000
+aline 857 952
+aline 952 904
+aline 1047 809
+aline 1047 904
+aline 1095 1000
+aline 1000 952
+aline 714 1000
+amove 1047 952
+aline 1000 904
+aline 1047 809
+stroke
+dfont endchar
+dfont char=84
+amove 190 380
+aline 238 238
+aline 333 142
+aline 428 95
+aline 571 47
+aline 714 47
+aline 857 95
+amove 1095 428
+aline 1047 333
+aline 952 190
+aline 857 142
+aline 714 95
+aline 571 95
+aline 428 142
+aline 333 190
+aline 238 333
+aline 190 476
+aline 190 619
+aline 238 809
+amove 285 857
+aline 142 1000
+amove 190 952
+aline 238 952
+aline 285 1000
+aline 380 952
+aline 571 904
+aline 857 904
+aline 1000 952
+aline 1095 1000
+amove 857 904
+aline 952 857
+aline 1047 761
+aline 1095 619
+aline 1095 428
+aline 1047 285
+aline 1000 190
+aline 904 95
+aline 809 47
+aline 666 0
+aline 523 0
+aline 380 47
+aline 285 95
+aline 238 142
+aline 190 238
+aline 142 380
+aline 142 571
+aline 190 714
+aline 238 809
+aline 285 857
+aline 380 904
+aline 571 904
+amove 761 904
+aline 714 857
+aline 714 761
+aline 761 714
+aline 809 761
+aline 761 809
+amove 333 952
+aline 285 904
+stroke
+dfont endchar
+dfont char=85
+amove 238 238
+aline 190 380
+aline 190 571
+aline 238 714
+aline 285 809
+amove 285 857
+aline 333 809
+aline 333 761
+aline 285 666
+aline 238 523
+aline 238 380
+aline 285 238
+aline 333 142
+aline 428 47
+amove 761 0
+aline 857 47
+aline 904 142
+aline 904 904
+aline 809 904
+amove 952 904
+aline 952 142
+aline 904 95
+amove 1000 95
+aline 904 47
+aline 761 0
+aline 571 0
+aline 428 47
+aline 333 95
+aline 238 190
+aline 190 285
+aline 142 428
+aline 142 571
+aline 190 714
+aline 238 809
+aline 333 904
+amove 142 1000
+aline 285 952
+aline 571 904
+aline 809 904
+aline 1000 952
+aline 1095 1000
+amove 1000 952
+aline 1000 95
+aline 1095 0
+stroke
+dfont endchar
+dfont char=86
+amove 619 0
+aline 1095 1000
+aline 1000 952
+aline 761 904
+aline 476 904
+aline 238 952
+aline 142 1000
+aline 619 0
+amove 619 95
+aline 571 190
+aline 238 904
+aline 190 952
+amove 238 952
+aline 285 904
+aline 619 190
+aline 666 142
+amove 714 238
+aline 714 333
+aline 761 476
+aline 952 714
+amove 857 619
+aline 761 380
+stroke
+dfont endchar
+dfont char=87
+amove 285 190
+aline 238 285
+aline 190 428
+aline 190 571
+aline 238 714
+amove 238 809
+aline 285 761
+aline 285 714
+aline 238 571
+aline 238 428
+aline 285 238
+aline 333 142
+aline 428 47
+amove 571 0
+aline 571 857
+amove 619 809
+aline 619 47
+amove 666 0
+aline 666 857
+amove 904 904
+aline 1000 809
+aline 1047 714
+aline 1095 571
+aline 1095 428
+aline 1047 285
+aline 1000 190
+aline 904 95
+aline 809 47
+aline 666 0
+aline 571 0
+aline 428 47
+aline 333 95
+aline 238 190
+aline 190 285
+aline 142 428
+aline 142 571
+aline 190 714
+aline 238 809
+aline 333 904
+amove 142 1000
+aline 333 904
+aline 523 857
+aline 714 857
+aline 904 904
+aline 1095 1000
+amove 1000 809
+aline 952 761
+aline 952 714
+aline 1000 571
+aline 1000 428
+aline 952 238
+aline 904 142
+aline 809 47
+amove 952 190
+aline 1000 285
+aline 1047 428
+aline 1047 571
+aline 1000 714
+stroke
+dfont endchar
+dfont char=88
+amove 142 0
+aline 238 47
+aline 428 95
+aline 666 95
+aline 952 47
+aline 1095 0
+aline 333 904
+amove 190 952
+aline 285 904
+aline 1000 47
+amove 952 47
+aline 904 95
+aline 142 1000
+aline 333 904
+aline 523 857
+aline 714 857
+aline 904 904
+aline 1095 1000
+aline 666 523
+amove 571 428
+aline 238 47
+amove 285 95
+aline 285 190
+aline 333 285
+aline 380 333
+aline 571 428
+amove 523 380
+aline 380 285
+aline 333 190
+stroke
+dfont endchar
+dfont char=89
+amove 142 190
+aline 238 95
+aline 333 47
+aline 523 0
+aline 714 0
+aline 904 47
+aline 1095 142
+amove 1000 95
+aline 1000 952
+amove 952 904
+aline 952 95
+amove 904 47
+aline 904 904
+amove 1095 1000
+aline 904 904
+aline 714 857
+aline 523 857
+aline 333 904
+aline 142 1000
+amove 285 904
+aline 190 809
+aline 142 666
+aline 142 523
+aline 190 380
+aline 285 285
+aline 380 238
+aline 523 190
+aline 666 190
+aline 809 238
+aline 904 285
+amove 809 238
+aline 714 285
+aline 428 285
+aline 285 333
+aline 190 428
+aline 142 523
+amove 333 285
+aline 476 238
+aline 761 238
+stroke
+dfont endchar
+dfont char=90
+amove 476 571
+aline 428 523
+aline 476 476
+aline 523 523
+aline 523 619
+aline 428 666
+aline 333 666
+aline 238 619
+aline 190 571
+aline 142 428
+aline 142 333
+aline 190 190
+aline 285 95
+aline 380 47
+aline 523 -1
+aline 714 -1
+aline 857 47
+aline 952 95
+aline 1047 190
+aline 1095 333
+aline 1095 428
+aline 1047 571
+aline 952 666
+aline 1000 761
+aline 1000 857
+aline 952 952
+aline 809 1000
+aline 666 1000
+aline 428 904
+aline 285 904
+aline 190 952
+aline 142 1000
+amove 714 761
+aline 809 714
+aline 857 666
+aline 809 619
+aline 714 571
+amove 904 619
+aline 714 571
+aline 619 571
+aline 523 619
+aline 523 714
+aline 619 761
+aline 714 761
+aline 904 714
+aline 904 857
+aline 857 952
+aline 809 999
+amove 904 952
+aline 952 857
+aline 952 761
+aline 904 666
+aline 1000 571
+aline 1047 476
+aline 1047 285
+aline 1000 190
+amove 857 47
+aline 952 142
+aline 1000 285
+aline 1000 476
+aline 952 571
+aline 904 619
+stroke
+dfont endchar
+dfont char=91
+amove 190 -334
+aline 190 1190
+aline 523 1190
+amove 238 1190
+aline 238 -334
+amove 190 -334
+aline 523 -334
+stroke
+dfont endchar
+stroke
+dfont endchar
+dfont char=93
+amove 142 -334
+aline 476 -334
+aline 476 1190
+aline 142 1190
+amove 428 1190
+aline 428 -334
+stroke
+dfont endchar
+stroke
+dfont endchar
+stroke
+dfont endchar
+dfont char=96
+amove 238 904
+aline 285 952
+aline 238 1000
+aline 190 952
+aline 190 857
+aline 238 761
+aline 285 714
+stroke
+dfont endchar
+dfont char=97
+amove 285 47
+aline 190 142
+aline 190 333
+amove 238 428
+aline 238 190
+aline 380 47
+amove 476 95
+aline 285 0
+aline 142 142
+aline 142 333
+aline 285 476
+amove 380 380
+aline 142 619
+aline 190 666
+aline 238 619
+aline 190 571
+amove 238 619
+aline 428 619
+aline 523 666
+aline 619 571
+aline 619 142
+aline 666 95
+aline 571 0
+aline 476 95
+aline 523 142
+aline 523 523
+aline 428 619
+amove 523 619
+aline 571 571
+aline 571 142
+aline 523 95
+aline 571 47
+aline 619 95
+aline 571 142
+stroke
+dfont endchar
+dfont char=98
+amove 333 47
+aline 238 142
+aline 238 904
+aline 142 1000
+aline 190 809
+aline 190 142
+aline 333 0
+aline 571 95
+aline 666 142
+aline 666 523
+aline 523 666
+aline 285 571
+amove 428 619
+aline 571 476
+aline 571 95
+amove 619 142
+aline 619 523
+aline 523 619
+amove 238 904
+aline 333 1000
+aline 285 809
+aline 285 190
+aline 428 47
+stroke
+dfont endchar
+dfont char=99
+amove 238 47
+aline 190 95
+aline 190 523
+amove 142 523
+aline 142 95
+aline 238 0
+aline 333 95
+aline 285 95
+aline 238 142
+aline 238 571
+amove 142 523
+aline 428 666
+aline 523 571
+aline 428 523
+aline 333 619
+amove 380 619
+aline 476 571
+stroke
+dfont endchar
+dfont char=100
+amove 285 47
+aline 190 142
+aline 190 523
+amove 238 571
+aline 238 190
+aline 380 47
+amove 523 95
+aline 523 523
+aline 285 809
+aline 142 857
+aline 285 857
+aline 285 1000
+aline 333 857
+aline 619 523
+aline 619 95
+aline 523 95
+aline 380 47
+aline 285 0
+aline 142 142
+aline 142 523
+aline 380 666
+amove 285 857
+aline 571 523
+aline 571 142
+stroke
+dfont endchar
+dfont char=101
+amove 238 47
+aline 190 95
+aline 190 523
+amove 142 523
+aline 142 95
+aline 238 0
+aline 333 95
+aline 285 95
+aline 238 142
+aline 238 571
+amove 142 523
+aline 428 666
+aline 571 476
+aline 238 285
+amove 476 428
+aline 333 619
+amove 380 619
+aline 523 476
+stroke
+dfont endchar
+dfont char=102
+amove 238 0
+aline 333 95
+aline 285 142
+aline 285 904
+amove 238 857
+aline 238 142
+aline 190 95
+aline 238 47
+aline 285 95
+aline 238 142
+amove 238 0
+aline 142 95
+aline 190 142
+aline 190 857
+aline 476 1000
+aline 571 904
+aline 476 857
+aline 380 952
+amove 428 952
+aline 523 904
+amove 476 666
+aline 285 666
+amove 190 666
+aline 47 666
+stroke
+dfont endchar
+dfont char=103
+amove 285 47
+aline 190 142
+aline 190 523
+amove 142 523
+aline 142 142
+aline 285 0
+aline 523 95
+amove 380 47
+aline 238 190
+aline 238 571
+amove 142 523
+aline 238 571
+aline 476 666
+aline 619 523
+aline 619 -96
+aline 571 -191
+aline 523 -239
+aline 428 -286
+aline 333 -286
+aline 238 -239
+aline 142 -286
+aline 238 -334
+aline 333 -286
+amove 285 -286
+aline 190 -286
+amove 428 -286
+aline 476 -239
+aline 523 -143
+aline 523 476
+aline 380 619
+amove 476 619
+aline 571 523
+aline 571 -96
+aline 523 -191
+stroke
+dfont endchar
+dfont char=104
+amove 238 0
+aline 142 95
+aline 190 142
+aline 190 809
+aline 142 1000
+aline 238 904
+aline 238 142
+aline 190 95
+aline 238 47
+aline 285 95
+aline 238 142
+amove 238 0
+aline 333 95
+aline 285 142
+aline 285 809
+aline 333 1000
+aline 238 904
+amove 285 571
+aline 428 619
+aline 523 666
+aline 666 523
+aline 666 95
+aline 523 -96
+aline 523 -239
+aline 571 -334
+aline 619 -334
+aline 523 -239
+amove 523 -96
+aline 571 47
+aline 571 476
+aline 428 619
+amove 523 619
+aline 619 523
+aline 619 95
+aline 571 0
+stroke
+dfont endchar
+dfont char=105
+amove 238 0
+aline 142 95
+aline 190 142
+aline 190 523
+aline 142 571
+aline 238 666
+aline 333 571
+aline 285 523
+aline 285 142
+aline 333 95
+aline 238 0
+amove 238 142
+aline 285 95
+aline 238 47
+aline 190 95
+aline 238 142
+aline 238 523
+aline 190 571
+aline 238 619
+aline 285 571
+aline 238 523
+amove 238 952
+aline 190 904
+aline 238 857
+aline 285 904
+aline 238 952
+amove 238 1000
+aline 142 904
+aline 238 809
+aline 333 904
+aline 238 1000
+stroke
+dfont endchar
+dfont char=106
+amove 285 0
+aline 238 95
+aline 238 523
+aline 190 571
+aline 238 619
+aline 285 571
+aline 238 523
+amove 238 666
+aline 142 571
+aline 190 523
+aline 190 95
+aline 333 -96
+amove 238 -334
+aline 142 -334
+aline 142 -286
+aline 238 -334
+aline 333 -239
+aline 333 -96
+aline 285 47
+aline 285 523
+aline 333 571
+aline 238 666
+amove 238 952
+aline 190 904
+aline 238 857
+aline 285 904
+aline 238 952
+amove 238 1000
+aline 142 904
+aline 238 809
+aline 333 904
+aline 238 1000
+stroke
+dfont endchar
+dfont char=107
+amove 238 0
+aline 142 95
+aline 190 142
+aline 190 809
+aline 142 1000
+aline 238 904
+aline 238 142
+aline 190 95
+aline 238 47
+aline 285 95
+aline 238 142
+amove 238 0
+aline 333 95
+aline 285 142
+aline 285 809
+aline 333 1000
+aline 238 904
+amove 428 619
+aline 523 476
+amove 571 523
+aline 476 619
+amove 476 428
+aline 523 380
+aline 619 142
+aline 666 95
+aline 714 95
+aline 619 0
+aline 523 95
+aline 476 333
+aline 428 380
+amove 476 380
+aline 523 285
+aline 571 95
+aline 619 47
+amove 285 285
+aline 476 428
+aline 619 523
+aline 523 666
+aline 428 619
+aline 285 523
+stroke
+dfont endchar
+dfont char=108
+amove 238 0
+aline 142 95
+aline 190 142
+aline 190 809
+aline 142 1000
+aline 238 904
+aline 238 142
+aline 190 95
+aline 238 47
+aline 285 95
+aline 238 142
+amove 238 0
+aline 333 95
+aline 285 142
+aline 285 809
+aline 333 1000
+aline 238 904
+stroke
+dfont endchar
+dfont char=109
+amove 238 0
+aline 142 95
+aline 190 142
+aline 190 523
+aline 142 571
+aline 95 571
+aline 190 666
+aline 285 571
+aline 285 142
+aline 333 95
+aline 238 0
+amove 238 142
+aline 285 95
+aline 238 47
+aline 190 95
+aline 238 142
+aline 238 571
+aline 190 619
+amove 285 571
+aline 428 619
+aline 523 666
+aline 666 571
+aline 666 142
+aline 714 95
+aline 619 0
+aline 523 95
+aline 571 142
+aline 571 523
+aline 428 619
+amove 523 619
+aline 619 571
+aline 619 142
+aline 571 95
+aline 619 47
+aline 666 95
+aline 619 142
+amove 1000 142
+aline 1047 95
+aline 1000 47
+aline 952 95
+aline 1000 142
+aline 1000 571
+aline 904 619
+amove 809 619
+aline 952 523
+aline 952 142
+aline 904 95
+aline 1000 0
+aline 1095 95
+aline 1047 142
+aline 1047 571
+aline 904 666
+aline 809 619
+aline 666 571
+stroke
+dfont endchar
+dfont char=110
+amove 238 0
+aline 142 95
+aline 190 142
+aline 190 523
+aline 142 571
+aline 95 571
+aline 190 666
+aline 285 571
+aline 285 142
+aline 333 95
+aline 238 0
+amove 238 142
+aline 285 95
+aline 238 47
+aline 190 95
+aline 238 142
+aline 238 571
+aline 190 619
+amove 285 571
+aline 428 619
+aline 523 666
+aline 666 571
+aline 666 142
+aline 714 95
+aline 619 0
+aline 523 95
+aline 571 142
+aline 571 523
+aline 428 619
+amove 523 619
+aline 619 571
+aline 619 142
+aline 571 95
+aline 619 47
+aline 666 95
+aline 619 142
+stroke
+dfont endchar
+dfont char=111
+amove 285 47
+aline 190 142
+aline 190 523
+amove 142 523
+aline 142 142
+aline 285 0
+aline 523 95
+aline 619 142
+aline 619 523
+aline 476 666
+aline 238 571
+aline 142 523
+amove 238 571
+aline 238 190
+aline 380 47
+amove 523 95
+aline 523 476
+aline 380 619
+amove 476 619
+aline 571 523
+aline 571 142
+stroke
+dfont endchar
+dfont char=112
+amove 238 95
+aline 285 95
+aline 380 47
+amove 428 47
+aline 380 95
+aline 285 142
+aline 285 571
+aline 238 619
+aline 142 666
+aline 190 571
+aline 190 142
+aline 95 95
+aline 190 95
+aline 190 -191
+aline 142 -334
+aline 238 -239
+aline 238 571
+amove 285 571
+aline 428 619
+aline 523 666
+aline 666 523
+aline 666 142
+aline 571 95
+aline 333 0
+aline 285 47
+aline 285 -191
+aline 333 -334
+aline 238 -239
+amove 571 95
+aline 571 476
+aline 428 619
+amove 523 619
+aline 619 523
+aline 619 142
+stroke
+dfont endchar
+dfont char=113
+amove 285 47
+aline 190 142
+aline 190 523
+amove 142 523
+aline 142 142
+aline 285 0
+aline 523 95
+amove 380 47
+aline 238 190
+aline 238 571
+amove 142 523
+aline 238 571
+aline 476 666
+aline 619 523
+aline 619 -191
+aline 666 -334
+aline 571 -239
+aline 571 523
+aline 476 619
+amove 380 619
+aline 523 476
+aline 523 -191
+aline 476 -334
+aline 571 -239
+stroke
+dfont endchar
+dfont char=114
+amove 238 0
+aline 142 95
+aline 190 142
+aline 190 523
+aline 142 571
+aline 95 571
+aline 190 666
+aline 285 571
+aline 285 142
+aline 333 95
+aline 238 0
+amove 238 142
+aline 285 95
+aline 238 47
+aline 190 95
+aline 238 142
+aline 238 571
+aline 190 619
+amove 285 571
+aline 476 666
+aline 571 571
+aline 476 523
+aline 380 619
+amove 428 619
+aline 523 571
+stroke
+dfont endchar
+dfont char=115
+amove 238 95
+aline 333 47
+amove 428 47
+aline 238 142
+aline 142 95
+aline 333 0
+aline 619 142
+aline 619 333
+aline 523 428
+aline 238 285
+aline 142 380
+aline 142 523
+aline 428 666
+aline 571 619
+aline 476 571
+aline 333 619
+amove 380 619
+aline 523 619
+amove 523 380
+aline 571 333
+aline 571 142
+amove 523 95
+aline 523 333
+aline 476 380
+amove 285 333
+aline 238 380
+aline 238 571
+amove 190 523
+aline 190 380
+aline 238 333
+stroke
+dfont endchar
+dfont char=116
+amove 238 0
+aline 142 95
+aline 190 142
+aline 190 809
+aline 142 1000
+aline 238 904
+aline 238 142
+aline 190 95
+aline 238 47
+aline 285 95
+aline 238 142
+amove 238 0
+aline 333 95
+aline 285 142
+aline 285 809
+aline 333 1000
+aline 238 904
+amove 190 666
+aline 47 666
+amove 285 666
+aline 428 666
+stroke
+dfont endchar
+dfont char=117
+amove 333 47
+aline 238 95
+aline 238 571
+aline 190 619
+amove 95 571
+aline 142 571
+aline 190 523
+aline 190 95
+aline 333 -1
+aline 571 95
+amove 666 47
+aline 619 95
+aline 619 523
+aline 571 571
+aline 619 619
+aline 666 571
+aline 619 523
+amove 619 666
+aline 714 571
+aline 666 523
+aline 666 142
+aline 714 95
+aline 761 95
+aline 666 -1
+aline 571 95
+aline 571 523
+aline 523 571
+aline 619 666
+amove 95 571
+aline 190 666
+aline 285 571
+aline 285 142
+aline 428 47
+stroke
+dfont endchar
+dfont char=118
+amove 380 47
+aline 238 142
+aline 238 571
+aline 190 619
+amove 142 666
+aline 238 619
+aline 285 571
+aline 285 190
+aline 428 95
+aline 476 95
+amove 571 142
+aline 571 523
+aline 523 571
+aline 619 666
+aline 714 571
+aline 666 523
+aline 666 190
+aline 476 95
+aline 380 -1
+aline 190 142
+aline 190 571
+aline 142 666
+amove 619 523
+aline 666 571
+aline 619 619
+aline 571 571
+aline 619 523
+aline 619 190
+stroke
+dfont endchar
+dfont char=119
+amove 380 47
+aline 238 142
+aline 238 571
+aline 190 619
+amove 142 666
+aline 190 571
+aline 190 142
+aline 380 0
+aline 476 95
+aline 571 142
+amove 476 95
+aline 428 95
+aline 285 190
+aline 285 571
+aline 238 619
+aline 142 666
+amove 619 666
+aline 714 571
+aline 666 523
+aline 666 190
+aline 809 95
+aline 857 95
+amove 952 142
+aline 952 523
+aline 904 571
+aline 1000 666
+aline 1095 571
+aline 1047 523
+aline 1047 190
+aline 857 95
+aline 761 0
+aline 571 142
+aline 571 523
+aline 523 571
+aline 619 666
+amove 619 523
+aline 666 571
+aline 619 619
+aline 571 571
+aline 619 523
+aline 619 142
+aline 761 47
+amove 1000 190
+aline 1000 523
+aline 952 571
+aline 1000 619
+aline 1047 571
+aline 1000 523
+stroke
+dfont endchar
+dfont char=120
+amove 142 0
+aline 142 95
+aline 238 95
+aline 238 0
+aline 142 0
+aline 238 95
+aline 380 285
+amove 380 333
+aline 238 333
+amove 476 333
+aline 619 333
+amove 476 380
+aline 619 571
+aline 714 666
+aline 714 571
+aline 619 571
+aline 619 666
+aline 714 666
+amove 190 619
+aline 285 571
+aline 571 95
+aline 666 47
+amove 714 95
+aline 619 -1
+aline 571 47
+aline 238 523
+aline 142 571
+aline 238 666
+aline 285 619
+aline 619 142
+aline 714 95
+stroke
+dfont endchar
+dfont char=121
+amove 333 47
+aline 238 95
+aline 238 571
+aline 190 619
+amove 95 571
+aline 142 571
+aline 190 523
+aline 190 95
+aline 333 -1
+aline 571 95
+amove 428 47
+aline 285 142
+aline 285 571
+aline 190 666
+aline 95 571
+amove 619 523
+aline 666 571
+aline 619 619
+aline 571 571
+aline 619 523
+aline 619 -143
+aline 571 -191
+amove 476 -286
+aline 523 -239
+aline 571 -143
+aline 571 523
+aline 523 571
+aline 619 666
+aline 714 571
+aline 666 523
+aline 666 -96
+aline 619 -191
+aline 571 -239
+aline 476 -286
+aline 380 -286
+aline 285 -239
+aline 190 -286
+aline 285 -334
+aline 380 -286
+amove 333 -286
+aline 238 -286
+stroke
+dfont endchar
+dfont char=122
+amove 95 -286
+aline 190 -286
+amove 238 -286
+aline 142 -334
+aline 47 -286
+aline 142 -239
+aline 238 -286
+aline 333 -286
+aline 428 -239
+aline 476 -191
+aline 523 -96
+aline 523 190
+aline 285 285
+aline 523 380
+aline 523 571
+aline 380 666
+aline 285 619
+aline 142 571
+aline 142 523
+aline 285 619
+aline 428 523
+aline 428 380
+aline 380 333
+amove 380 238
+aline 428 190
+aline 428 -143
+aline 380 -239
+aline 333 -286
+amove 428 -191
+aline 476 -143
+aline 476 190
+amove 476 380
+aline 476 571
+aline 380 619
+stroke
+dfont endchar
+dfont char=123
+amove 380 238
+aline 333 95
+aline 333 -96
+aline 380 -239
+amove 476 -334
+aline 333 -191
+aline 285 -48
+aline 285 47
+aline 333 190
+aline 428 285
+aline 428 333
+aline 238 428
+aline 428 523
+aline 428 571
+aline 333 666
+aline 285 809
+aline 285 904
+aline 333 1047
+aline 476 1190
+amove 380 1095
+aline 333 952
+aline 333 761
+aline 380 619
+stroke
+dfont endchar
+dfont char=124
+amove 380 428
+aline 380 1000
+aline 333 952
+aline 428 476
+aline 380 428
+aline 333 476
+aline 428 952
+aline 380 1000
+amove 142 857
+aline 619 571
+aline 571 571
+aline 190 857
+aline 142 857
+aline 142 809
+aline 619 619
+aline 619 571
+amove 619 857
+aline 142 571
+aline 190 571
+aline 571 857
+aline 619 857
+aline 619 809
+aline 142 619
+aline 142 571
+stroke
+dfont endchar
+dfont char=125
+amove 238 -334
+aline 380 -191
+aline 428 -48
+aline 428 47
+aline 380 190
+aline 285 285
+aline 285 333
+aline 476 428
+aline 285 523
+aline 285 571
+aline 380 666
+aline 428 809
+aline 428 904
+aline 380 1047
+aline 238 1190
+amove 333 1095
+aline 380 952
+aline 380 761
+aline 333 619
+amove 333 238
+aline 380 95
+aline 380 -96
+aline 333 -239
+stroke
+dfont endchar
+dfont char=126
+amove 190 238
+aline 333 47
+amove 380 47
+aline 190 285
+amove 428 523
+aline 142 238
+aline 333 0
+aline 619 285
+amove 666 333
+aline 952 619
+aline 1000 571
+aline 1047 571
+aline 1095 619
+aline 1047 523
+aline 1000 476
+aline 952 476
+aline 904 523
+amove 904 571
+aline 952 523
+aline 1047 523
+amove 1095 142
+aline 1047 47
+aline 1000 0
+aline 904 0
+aline 809 47
+aline 714 142
+aline 523 428
+aline 238 714
+aline 476 1000
+aline 666 761
+aline 476 571
+amove 619 714
+aline 428 952
+amove 476 952
+aline 619 761
+amove 285 761
+aline 571 476
+aline 761 190
+aline 809 142
+aline 904 95
+aline 1047 95
+aline 1095 142
+amove 1047 47
+aline 904 47
+aline 809 95
+aline 714 190
+aline 523 476
+aline 285 714
+stroke
+dfont endchar
diff --git a/src/fonts/plsa.afm b/src/fonts/plsa.afm
new file mode 100644
index 0000000..c1c7520
--- /dev/null
+++ b/src/fonts/plsa.afm
@@ -0,0 +1,116 @@
+StartFontMetrics 2.0
+Comment Made from HERSHEY font file using SPLITFONT.BAS
+FontName plSA
+EncodingScheme TEXENCODING
+FullName plSA
+FamilyName plSA
+Weight Medium
+ItalicAngle 0
+IsFixedPitch false
+UnderlinePosition -97
+UnderlineThickness 73
+FontBBox 0 -400 1001 1001
+CapHeight 729
+XHeight 151
+Descender -219
+Ascender 729
+StartCharMetrics 96
+C 32 ; WX 400 ; N C32 ; B 0 0 0 0 ;
+C 33 ; WX 430 ; N C33 ; B 126 0 190 636 ;
+C 34 ; WX 430 ; N C34 ; B 63 509 317 636 ;
+C 35 ; WX 430 ; N C35 ; B 0 126 381 509 ;
+C 36 ; WX 430 ; N C36 ; B 0 0 381 636 ;
+C 37 ; WX 430 ; N C37 ; B 0 0 381 636 ;
+C 38 ; WX 430 ; N C38 ; B 0 0 381 636 ;
+C 39 ; WX 430 ; N C39 ; B 126 509 190 636 ;
+C 40 ; WX 430 ; N C40 ; B 126 0 254 636 ;
+C 41 ; WX 430 ; N C41 ; B 126 0 254 636 ;
+C 42 ; WX 430 ; N C42 ; B 0 126 381 509 ;
+C 43 ; WX 430 ; N C43 ; B 0 126 381 509 ;
+C 44 ; WX 430 ; N C44 ; B 126 -127 190 63 ;
+C 45 ; WX 430 ; N C45 ; B 63 317 317 317 ;
+C 46 ; WX 430 ; N C46 ; B 126 0 190 63 ;
+C 47 ; WX 430 ; N C47 ; B 63 0 317 636 ;
+C 48 ; WX 430 ; N C48 ; B 63 0 317 636 ;
+C 49 ; WX 430 ; N C49 ; B 126 0 254 636 ;
+C 50 ; WX 430 ; N C50 ; B 0 0 381 636 ;
+C 51 ; WX 430 ; N C51 ; B 0 0 381 636 ;
+C 52 ; WX 430 ; N C52 ; B 0 0 317 636 ;
+C 53 ; WX 430 ; N C53 ; B 0 0 381 636 ;
+C 54 ; WX 430 ; N C54 ; B 0 0 381 636 ;
+C 55 ; WX 430 ; N C55 ; B 0 0 381 636 ;
+C 56 ; WX 430 ; N C56 ; B 0 0 381 636 ;
+C 57 ; WX 430 ; N C57 ; B 0 0 381 636 ;
+C 58 ; WX 430 ; N C58 ; B 126 0 190 254 ;
+C 59 ; WX 430 ; N C59 ; B 126 -127 190 254 ;
+C 60 ; WX 430 ; N C60 ; B 0 63 254 572 ;
+C 61 ; WX 430 ; N C61 ; B 63 254 317 381 ;
+C 62 ; WX 430 ; N C62 ; B 0 63 254 572 ;
+C 63 ; WX 430 ; N C63 ; B 63 0 317 636 ;
+C 64 ; WX 430 ; N C64 ; B 63 63 317 572 ;
+C 65 ; WX 430 ; N C65 ; B 0 0 381 636 ;
+C 66 ; WX 430 ; N C66 ; B 0 0 381 636 ;
+C 67 ; WX 430 ; N C67 ; B 0 0 381 636 ;
+C 68 ; WX 430 ; N C68 ; B 0 0 381 636 ;
+C 69 ; WX 430 ; N C69 ; B 0 0 381 636 ;
+C 70 ; WX 430 ; N C70 ; B 0 0 381 636 ;
+C 71 ; WX 430 ; N C71 ; B 0 0 381 636 ;
+C 72 ; WX 430 ; N C72 ; B 0 0 381 636 ;
+C 73 ; WX 430 ; N C73 ; B 126 0 254 636 ;
+C 74 ; WX 430 ; N C74 ; B 0 0 317 636 ;
+C 75 ; WX 430 ; N C75 ; B 0 0 381 636 ;
+C 76 ; WX 430 ; N C76 ; B 0 0 381 636 ;
+C 77 ; WX 430 ; N C77 ; B 0 0 381 636 ;
+C 78 ; WX 430 ; N C78 ; B 0 0 381 636 ;
+C 79 ; WX 430 ; N C79 ; B 0 0 381 636 ;
+C 80 ; WX 430 ; N C80 ; B 0 0 381 636 ;
+C 81 ; WX 430 ; N C81 ; B 0 0 381 636 ;
+C 82 ; WX 430 ; N C82 ; B 0 0 381 636 ;
+C 83 ; WX 430 ; N C83 ; B 0 0 381 636 ;
+C 84 ; WX 430 ; N C84 ; B 0 0 381 636 ;
+C 85 ; WX 430 ; N C85 ; B 0 0 381 636 ;
+C 86 ; WX 430 ; N C86 ; B 0 0 381 636 ;
+C 87 ; WX 430 ; N C87 ; B 0 0 381 636 ;
+C 88 ; WX 430 ; N C88 ; B 0 0 381 636 ;
+C 89 ; WX 430 ; N C89 ; B 0 0 381 636 ;
+C 90 ; WX 430 ; N C90 ; B 0 0 381 636 ;
+C 91 ; WX 430 ; N C91 ; B 126 0 254 636 ;
+C 92 ; WX 430 ; N C92 ; B 0 0 381 636 ;
+C 93 ; WX 430 ; N C93 ; B 126 0 254 636 ;
+C 94 ; WX 430 ; N C94 ; B 63 317 317 509 ;
+C 95 ; WX 430 ; N C95 ; B 0 -63 381 -63 ;
+C 96 ; WX 430 ; N C96 ; B 126 572 254 636 ;
+C 97 ; WX 430 ; N C97 ; B 0 0 381 445 ;
+C 98 ; WX 430 ; N C98 ; B 0 0 381 636 ;
+C 99 ; WX 430 ; N C99 ; B 0 0 381 445 ;
+C 100 ; WX 430 ; N C100 ; B 0 0 381 636 ;
+C 101 ; WX 430 ; N C101 ; B 0 0 381 445 ;
+C 102 ; WX 430 ; N C102 ; B 63 0 381 636 ;
+C 103 ; WX 430 ; N C103 ; B 0 -191 381 445 ;
+C 104 ; WX 430 ; N C104 ; B 0 0 381 636 ;
+C 105 ; WX 430 ; N C105 ; B 126 0 254 572 ;
+C 106 ; WX 430 ; N C106 ; B 0 -191 254 572 ;
+C 107 ; WX 430 ; N C107 ; B 0 0 381 636 ;
+C 108 ; WX 430 ; N C108 ; B 126 0 254 636 ;
+C 109 ; WX 430 ; N C109 ; B 0 0 381 445 ;
+C 110 ; WX 430 ; N C110 ; B 0 0 381 445 ;
+C 111 ; WX 430 ; N C111 ; B 0 0 381 445 ;
+C 112 ; WX 430 ; N C112 ; B 0 -191 381 445 ;
+C 113 ; WX 430 ; N C113 ; B 0 -191 381 445 ;
+C 114 ; WX 430 ; N C114 ; B 0 0 381 445 ;
+C 115 ; WX 430 ; N C115 ; B 0 0 381 445 ;
+C 116 ; WX 430 ; N C116 ; B 126 0 381 636 ;
+C 117 ; WX 430 ; N C117 ; B 0 0 381 445 ;
+C 118 ; WX 430 ; N C118 ; B 0 0 381 445 ;
+C 119 ; WX 430 ; N C119 ; B 0 0 381 445 ;
+C 120 ; WX 430 ; N C120 ; B 0 0 381 445 ;
+C 121 ; WX 430 ; N C121 ; B 0 -191 381 445 ;
+C 122 ; WX 430 ; N C122 ; B 0 0 381 445 ;
+C 123 ; WX 430 ; N C123 ; B 126 0 254 636 ;
+C 124 ; WX 430 ; N C124 ; B 190 0 190 636 ;
+C 125 ; WX 430 ; N C125 ; B 126 0 254 636 ;
+C 126 ; WX 430 ; N C126 ; B 63 254 381 445 ;
+C 127 ; WX 430 ; N C127 ; B 63 190 381 445 ;
+EndCharMetrics
+
+EndFontMetrics
diff --git a/src/fonts/plsa.gle b/src/fonts/plsa.gle
new file mode 100644
index 0000000..8ece51b
--- /dev/null
+++ b/src/fonts/plsa.gle
@@ -0,0 +1,1025 @@
+dfont design= 1428
+dfont char=33
+amove 181 0
+aline 272 0
+aline 272 90
+aline 181 90
+aline 181 0
+amove 181 272
+aline 272 272
+aline 272 909
+aline 181 909
+aline 181 272
+stroke
+dfont endchar
+dfont char=34
+amove 90 727
+aline 181 727
+aline 181 909
+aline 90 909
+aline 90 727
+amove 363 727
+aline 454 727
+aline 454 909
+aline 363 909
+aline 363 727
+stroke
+dfont endchar
+dfont char=35
+amove 90 181
+aline 181 727
+amove 454 727
+aline 363 181
+amove 545 363
+aline 0 363
+amove 0 545
+aline 545 545
+stroke
+dfont endchar
+dfont char=36
+amove 0 181
+aline 90 90
+aline 454 90
+aline 545 181
+aline 545 363
+aline 454 454
+aline 90 454
+aline 0 545
+aline 0 727
+aline 90 818
+aline 454 818
+aline 545 727
+amove 454 818
+aline 363 818
+amove 363 909
+aline 363 0
+amove 363 90
+aline 181 90
+amove 181 0
+aline 181 909
+stroke
+dfont endchar
+dfont char=37
+amove 181 818
+aline 90 909
+aline 0 818
+aline 0 636
+aline 90 545
+aline 181 636
+aline 181 818
+aline 545 909
+aline 0 0
+aline 363 90
+aline 363 272
+aline 454 363
+aline 545 272
+aline 545 90
+aline 454 -1
+aline 363 90
+stroke
+dfont endchar
+dfont char=38
+amove 272 181
+aline 454 363
+aline 545 272
+aline 545 181
+aline 454 0
+aline 90 0
+aline 0 90
+aline 0 363
+aline 363 636
+aline 363 818
+aline 272 909
+aline 181 909
+aline 90 818
+aline 90 636
+aline 545 0
+stroke
+dfont endchar
+dfont char=39
+amove 181 727
+aline 272 727
+aline 272 909
+aline 181 909
+aline 181 727
+stroke
+dfont endchar
+dfont char=40
+amove 363 0
+aline 181 181
+aline 181 727
+aline 363 909
+stroke
+dfont endchar
+dfont char=41
+amove 181 0
+aline 363 181
+aline 363 727
+aline 181 909
+stroke
+dfont endchar
+dfont char=42
+amove 90 181
+aline 454 727
+amove 272 727
+aline 272 181
+amove 454 181
+aline 90 727
+amove 0 454
+aline 545 454
+stroke
+dfont endchar
+dfont char=43
+amove 272 181
+aline 272 727
+amove 0 454
+aline 545 454
+stroke
+dfont endchar
+dfont char=44
+amove 181 -182
+aline 272 -91
+aline 272 90
+aline 181 90
+aline 181 -1
+aline 272 -1
+stroke
+dfont endchar
+dfont char=45
+amove 90 454
+aline 454 454
+stroke
+dfont endchar
+dfont char=46
+amove 181 0
+aline 272 0
+aline 272 90
+aline 181 90
+aline 181 0
+stroke
+dfont endchar
+dfont char=47
+amove 90 0
+aline 454 909
+stroke
+dfont endchar
+dfont char=48
+amove 181 0
+aline 90 90
+aline 90 818
+aline 181 909
+aline 363 909
+aline 454 818
+aline 454 90
+aline 363 0
+aline 181 0
+stroke
+dfont endchar
+dfont char=49
+amove 181 0
+aline 363 0
+amove 272 0
+aline 272 909
+aline 181 818
+stroke
+dfont endchar
+dfont char=50
+amove 0 818
+aline 90 909
+aline 363 909
+aline 454 818
+aline 454 545
+aline 0 181
+aline 0 -1
+aline 545 -1
+stroke
+dfont endchar
+dfont char=51
+amove 0 181
+aline 181 0
+aline 363 0
+aline 545 181
+aline 545 363
+aline 363 454
+aline 545 545
+aline 545 727
+aline 363 909
+aline 181 909
+aline 0 727
+stroke
+dfont endchar
+dfont char=52
+amove 272 0
+aline 454 0
+amove 363 0
+aline 363 909
+aline 0 272
+aline 454 272
+stroke
+dfont endchar
+dfont char=53
+amove 0 90
+aline 90 0
+aline 363 0
+aline 545 181
+aline 545 363
+aline 363 545
+aline 0 545
+aline 0 909
+aline 545 909
+stroke
+dfont endchar
+dfont char=54
+amove 0 363
+aline 90 545
+aline 454 545
+aline 545 363
+aline 545 90
+aline 454 0
+aline 90 0
+aline 0 90
+aline 0 818
+aline 90 909
+aline 454 909
+aline 545 818
+stroke
+dfont endchar
+dfont char=55
+amove 90 0
+aline 90 90
+aline 545 909
+aline 0 909
+stroke
+dfont endchar
+dfont char=56
+amove 181 454
+aline 0 545
+aline 0 818
+aline 90 909
+aline 454 909
+aline 545 818
+aline 545 545
+aline 363 454
+aline 181 454
+aline 0 363
+aline 0 90
+aline 90 0
+aline 454 0
+aline 545 90
+aline 545 363
+aline 363 454
+stroke
+dfont endchar
+dfont char=57
+amove 0 90
+aline 90 0
+aline 454 0
+aline 545 90
+aline 545 818
+aline 454 909
+aline 90 909
+aline 0 818
+aline 0 545
+aline 90 363
+aline 454 363
+aline 545 454
+stroke
+dfont endchar
+dfont char=58
+amove 181 0
+aline 272 0
+aline 272 90
+aline 181 90
+aline 181 0
+amove 181 272
+aline 272 272
+aline 272 363
+aline 181 363
+aline 181 272
+stroke
+dfont endchar
+dfont char=59
+amove 181 -182
+aline 272 -91
+aline 272 90
+aline 181 90
+aline 181 -1
+aline 272 -1
+amove 272 272
+aline 272 363
+aline 181 363
+aline 181 272
+aline 272 272
+stroke
+dfont endchar
+dfont char=60
+amove 363 818
+aline 0 454
+aline 363 90
+stroke
+dfont endchar
+dfont char=61
+amove 90 363
+aline 454 363
+amove 454 545
+aline 90 545
+stroke
+dfont endchar
+dfont char=62
+amove 0 90
+aline 363 454
+aline 0 818
+stroke
+dfont endchar
+dfont char=63
+amove 181 0
+aline 272 0
+aline 272 90
+aline 181 90
+aline 181 0
+amove 181 181
+aline 181 272
+aline 454 454
+aline 454 818
+aline 363 909
+aline 181 909
+aline 90 818
+aline 90 727
+stroke
+dfont endchar
+dfont char=64
+amove 363 363
+aline 363 545
+aline 272 636
+aline 181 545
+aline 181 363
+aline 272 272
+aline 363 363
+aline 454 272
+aline 454 727
+aline 363 818
+aline 181 818
+aline 90 727
+aline 90 181
+aline 181 90
+aline 363 90
+aline 454 181
+stroke
+dfont endchar
+dfont char=65
+amove 0 0
+aline 0 454
+aline 545 454
+amove 0 454
+aline 0 727
+aline 181 909
+aline 363 909
+aline 545 727
+aline 545 0
+stroke
+dfont endchar
+dfont char=66
+amove 0 0
+aline 0 909
+aline 454 909
+aline 545 818
+aline 545 545
+aline 454 454
+aline 0 454
+amove 0 0
+aline 454 0
+aline 545 90
+aline 545 363
+aline 454 454
+stroke
+dfont endchar
+dfont char=67
+amove 545 818
+aline 454 909
+aline 90 909
+aline 0 727
+aline 0 181
+aline 90 0
+aline 454 0
+aline 545 90
+stroke
+dfont endchar
+dfont char=68
+amove 0 0
+aline 363 0
+aline 545 181
+aline 545 727
+aline 363 909
+aline 0 909
+aline 0 0
+stroke
+dfont endchar
+dfont char=69
+amove 545 909
+aline 0 909
+aline 0 454
+aline 363 454
+amove 0 454
+aline 0 0
+aline 545 0
+stroke
+dfont endchar
+dfont char=70
+amove 0 0
+aline 0 454
+amove 363 454
+aline 0 454
+aline 0 909
+aline 545 909
+stroke
+dfont endchar
+dfont char=71
+amove 181 272
+aline 181 363
+aline 545 363
+aline 545 181
+aline 454 0
+aline 90 0
+aline 0 181
+aline 0 727
+aline 90 909
+aline 454 909
+aline 545 818
+aline 545 727
+stroke
+dfont endchar
+dfont char=72
+amove 0 0
+aline 0 909
+amove 0 454
+aline 545 454
+amove 545 909
+aline 545 0
+stroke
+dfont endchar
+dfont char=73
+amove 181 0
+aline 363 0
+amove 272 0
+aline 272 909
+amove 181 909
+aline 363 909
+stroke
+dfont endchar
+dfont char=74
+amove 0 181
+aline 90 0
+aline 272 0
+aline 363 181
+aline 363 909
+amove 272 909
+aline 454 909
+stroke
+dfont endchar
+dfont char=75
+amove 0 0
+aline 0 909
+amove 0 454
+aline 181 454
+aline 545 909
+amove 181 454
+aline 545 0
+stroke
+dfont endchar
+dfont char=76
+amove 0 909
+aline 0 0
+aline 545 0
+stroke
+dfont endchar
+dfont char=77
+amove 0 0
+aline 0 909
+aline 272 454
+aline 545 909
+aline 545 0
+stroke
+dfont endchar
+dfont char=78
+amove 0 0
+aline 0 909
+aline 545 0
+aline 545 909
+stroke
+dfont endchar
+dfont char=79
+amove 0 90
+aline 0 818
+aline 90 909
+aline 454 909
+aline 545 818
+aline 545 90
+aline 454 0
+aline 90 0
+aline 0 90
+stroke
+dfont endchar
+dfont char=80
+amove 0 0
+aline 0 909
+aline 454 909
+aline 545 818
+aline 545 545
+aline 454 454
+aline 0 454
+stroke
+dfont endchar
+dfont char=81
+amove 0 181
+aline 0 727
+aline 181 909
+aline 363 909
+aline 545 727
+aline 545 181
+aline 454 90
+aline 363 0
+aline 181 0
+aline 0 181
+amove 363 181
+aline 545 0
+stroke
+dfont endchar
+dfont char=82
+amove 0 0
+aline 0 909
+aline 454 909
+aline 545 818
+aline 545 545
+aline 454 454
+aline 363 454
+aline 545 0
+amove 363 454
+aline 0 454
+stroke
+dfont endchar
+dfont char=83
+amove 0 90
+aline 90 0
+aline 454 0
+aline 545 90
+aline 545 363
+aline 454 454
+aline 90 454
+aline 0 545
+aline 0 818
+aline 90 909
+aline 454 909
+aline 545 818
+stroke
+dfont endchar
+dfont char=84
+amove 272 0
+aline 272 909
+amove 0 909
+aline 545 909
+stroke
+dfont endchar
+dfont char=85
+amove 0 909
+aline 0 181
+aline 90 0
+aline 454 0
+aline 545 181
+aline 545 909
+stroke
+dfont endchar
+dfont char=86
+amove 0 909
+aline 272 0
+aline 545 909
+stroke
+dfont endchar
+dfont char=87
+amove 0 909
+aline 181 0
+aline 272 545
+aline 363 0
+aline 545 909
+stroke
+dfont endchar
+dfont char=88
+amove 0 0
+aline 0 90
+aline 545 818
+aline 545 909
+amove 0 909
+aline 0 818
+aline 545 90
+aline 545 0
+stroke
+dfont endchar
+dfont char=89
+amove 272 454
+aline 545 818
+aline 545 909
+amove 0 909
+aline 0 818
+aline 272 454
+aline 272 0
+stroke
+dfont endchar
+dfont char=90
+amove 0 909
+aline 545 909
+aline 272 454
+amove 181 454
+aline 363 454
+amove 272 454
+aline -1 0
+aline 545 0
+stroke
+dfont endchar
+dfont char=91
+amove 363 909
+aline 181 909
+aline 181 0
+aline 363 0
+stroke
+dfont endchar
+dfont char=92
+amove 0 909
+aline 545 0
+stroke
+dfont endchar
+dfont char=93
+amove 181 0
+aline 363 0
+aline 363 909
+aline 181 909
+stroke
+dfont endchar
+dfont char=94
+amove 90 454
+aline 272 727
+aline 454 454
+stroke
+dfont endchar
+dfont char=95
+amove 0 -91
+aline 545 -91
+stroke
+dfont endchar
+dfont char=96
+amove 181 909
+aline 363 818
+stroke
+dfont endchar
+dfont char=97
+amove 0 454
+aline 90 636
+aline 454 636
+aline 545 454
+aline 545 90
+aline 454 0
+aline 90 0
+aline 0 90
+aline 0 272
+aline 90 363
+aline 454 363
+aline 545 272
+aline 545 0
+stroke
+dfont endchar
+dfont char=98
+amove 0 0
+aline 0 454
+aline 90 636
+aline 454 636
+aline 545 454
+aline 545 181
+aline 454 -1
+aline 90 -1
+aline 0 181
+aline 0 909
+stroke
+dfont endchar
+dfont char=99
+amove 545 454
+aline 454 636
+aline 90 636
+aline 0 545
+aline 0 90
+aline 90 0
+aline 454 0
+aline 545 181
+stroke
+dfont endchar
+dfont char=100
+amove 545 909
+aline 545 181
+aline 454 0
+aline 90 0
+aline 0 181
+aline 0 454
+aline 90 636
+aline 454 636
+aline 545 454
+aline 545 0
+stroke
+dfont endchar
+dfont char=101
+amove 0 363
+aline 545 363
+aline 545 545
+aline 454 636
+aline 90 636
+aline 0 545
+aline 0 181
+aline 90 0
+aline 454 0
+aline 545 90
+stroke
+dfont endchar
+dfont char=102
+amove 181 0
+aline 181 454
+amove 90 454
+aline 272 454
+amove 181 454
+aline 181 727
+aline 272 909
+aline 454 909
+aline 545 818
+stroke
+dfont endchar
+dfont char=103
+amove 0 -91
+aline 90 -273
+aline 454 -273
+aline 545 -91
+aline 545 454
+aline 454 636
+aline 90 636
+aline 0 454
+aline 0 181
+aline 90 0
+aline 454 0
+aline 545 181
+aline 545 636
+stroke
+dfont endchar
+dfont char=104
+amove 0 0
+aline 0 909
+amove 0 454
+aline 90 636
+aline 454 636
+aline 545 454
+aline 545 0
+stroke
+dfont endchar
+dfont char=105
+amove 181 0
+aline 363 0
+amove 272 0
+aline 272 636
+aline 181 636
+amove 181 727
+aline 181 818
+aline 272 818
+aline 272 727
+aline 181 727
+stroke
+dfont endchar
+dfont char=106
+amove 0 0
+aline 90 -273
+aline 272 -273
+aline 363 0
+aline 363 636
+aline 272 636
+amove 272 727
+aline 272 818
+aline 363 818
+aline 363 727
+aline 272 727
+stroke
+dfont endchar
+dfont char=107
+amove 0 0
+aline 0 909
+amove 0 454
+aline 181 636
+aline 363 636
+aline 363 454
+aline 272 363
+aline 90 363
+aline -1 454
+aline 545 0
+stroke
+dfont endchar
+dfont char=108
+amove 181 0
+aline 363 0
+amove 272 0
+aline 272 909
+aline 181 909
+stroke
+dfont endchar
+dfont char=109
+amove 0 0
+aline 0 636
+amove 0 454
+aline 90 636
+aline 181 636
+aline 272 545
+aline 272 0
+amove 272 545
+aline 363 636
+aline 454 636
+aline 545 454
+aline 545 0
+stroke
+dfont endchar
+dfont char=110
+amove 0 0
+aline 0 636
+amove 0 454
+aline 181 636
+aline 363 636
+aline 545 454
+aline 545 0
+stroke
+dfont endchar
+dfont char=111
+amove 0 181
+aline 0 454
+aline 90 636
+aline 454 636
+aline 545 454
+aline 545 181
+aline 454 0
+aline 90 0
+aline 0 181
+stroke
+dfont endchar
+dfont char=112
+amove 0 -273
+aline 0 454
+aline 90 636
+aline 454 636
+aline 545 454
+aline 545 181
+aline 454 -1
+aline 90 -1
+aline 0 181
+aline 0 636
+stroke
+dfont endchar
+dfont char=113
+amove 454 90
+aline 363 0
+aline 90 0
+aline 0 181
+aline 0 454
+aline 90 636
+aline 363 636
+aline 454 454
+aline 454 -182
+amove 363 -182
+aline 545 -182
+amove 454 -182
+aline 454 -273
+stroke
+dfont endchar
+dfont char=114
+amove 0 0
+aline 0 636
+amove 0 454
+aline 90 636
+aline 454 636
+aline 545 454
+stroke
+dfont endchar
+dfont char=115
+amove 0 90
+aline 90 0
+aline 454 0
+aline 545 90
+aline 545 181
+aline 454 363
+aline 90 363
+aline 0 454
+aline 0 545
+aline 90 636
+aline 454 636
+aline 545 545
+stroke
+dfont endchar
+dfont char=116
+amove 272 909
+aline 272 636
+amove 181 636
+aline 363 636
+amove 272 636
+aline 272 90
+aline 363 0
+aline 454 0
+aline 545 90
+aline 545 181
+stroke
+dfont endchar
+dfont char=117
+amove 0 0
+aline 0 636
+amove 0 181
+aline 90 -1
+aline 454 -1
+aline 545 181
+aline 545 636
+stroke
+dfont endchar
+dfont char=118
+amove 0 636
+aline 272 0
+aline 545 636
+stroke
+dfont endchar
+dfont char=119
+amove 0 636
+aline 181 0
+aline 272 454
+aline 363 0
+aline 545 636
+stroke
+dfont endchar
+dfont char=120
+amove 0 0
+aline 0 90
+aline 545 545
+aline 545 636
+amove 0 636
+aline 0 545
+aline 545 90
+aline 545 -1
+stroke
+dfont endchar
+dfont char=121
+amove 0 -182
+aline 90 -273
+aline 454 -273
+aline 545 -182
+aline 545 636
+amove 545 181
+aline 454 -1
+aline 90 -1
+aline 0 181
+aline 0 636
+stroke
+dfont endchar
+dfont char=122
+amove 0 636
+aline 545 636
+aline 0 0
+aline 545 0
+amove 181 363
+aline 363 363
+stroke
+dfont endchar
+dfont char=123
+amove 363 909
+aline 272 909
+aline 272 545
+aline 181 454
+aline 272 363
+aline 272 90
+aline 363 0
+stroke
+dfont endchar
+dfont char=124
+amove 272 0
+aline 272 909
+stroke
+dfont endchar
+dfont char=125
+amove 181 0
+aline 272 90
+aline 272 363
+aline 363 454
+aline 272 545
+aline 272 818
+aline 181 909
+stroke
+dfont endchar
+dfont char=126
+amove 90 454
+aline 90 545
+aline 181 636
+aline 454 363
+aline 545 454
+aline 545 545
+stroke
+dfont endchar
+dfont char=127
+amove 272 272
+aline 90 454
+aline 272 636
+amove 90 454
+aline 545 454
+stroke
+dfont endchar
diff --git a/src/fonts/plsg.afm b/src/fonts/plsg.afm
new file mode 100644
index 0000000..f0a2749
--- /dev/null
+++ b/src/fonts/plsg.afm
@@ -0,0 +1,115 @@
+StartFontMetrics 2.0
+Comment Made from HERSHEY font file using SPLITFONT.BAS
+FontName plSG
+EncodingScheme TEXENCODING
+FullName plSG
+FamilyName plSG
+Weight Medium
+ItalicAngle 0
+IsFixedPitch false
+UnderlinePosition -97
+UnderlineThickness 73
+FontBBox 0 -400 1001 1001
+CapHeight 729
+XHeight 151
+Descender -219
+Ascender 729
+StartCharMetrics 95
+C 32 ; WX 400 ; N C32 ; B 0 0 0 0 ;
+C 33 ; WX 318 ; N C33 ; B 133 0 199 700 ;
+C 34 ; WX 518 ; N C34 ; B 133 466 399 700 ;
+C 35 ; WX 685 ; N C35 ; B 99 -233 600 833 ;
+C 36 ; WX 651 ; N C36 ; B 99 -133 566 833 ;
+C 37 ; WX 784 ; N C37 ; B 99 0 700 700 ;
+C 38 ; WX 851 ; N C38 ; B 99 0 766 700 ;
+C 39 ; WX 251 ; N C39 ; B 133 466 133 700 ;
+C 40 ; WX 451 ; N C40 ; B 133 -233 366 833 ;
+C 41 ; WX 451 ; N C41 ; B 99 -233 333 833 ;
+C 42 ; WX 518 ; N C42 ; B 99 99 433 500 ;
+C 43 ; WX 851 ; N C43 ; B 133 0 733 600 ;
+C 44 ; WX 318 ; N C44 ; B 133 -133 199 66 ;
+C 45 ; WX 851 ; N C45 ; B 133 299 733 299 ;
+C 46 ; WX 318 ; N C46 ; B 133 0 199 66 ;
+C 47 ; WX 718 ; N C47 ; B 66 -233 666 833 ;
+C 48 ; WX 651 ; N C48 ; B 99 0 566 700 ;
+C 49 ; WX 651 ; N C49 ; B 199 0 366 700 ;
+C 50 ; WX 651 ; N C50 ; B 99 0 566 700 ;
+C 51 ; WX 651 ; N C51 ; B 99 0 566 700 ;
+C 52 ; WX 651 ; N C52 ; B 99 0 600 700 ;
+C 53 ; WX 651 ; N C53 ; B 99 0 566 700 ;
+C 54 ; WX 651 ; N C54 ; B 133 0 566 700 ;
+C 55 ; WX 651 ; N C55 ; B 99 0 566 700 ;
+C 56 ; WX 651 ; N C56 ; B 99 0 566 700 ;
+C 57 ; WX 651 ; N C57 ; B 99 0 532 700 ;
+C 58 ; WX 318 ; N C58 ; B 133 0 199 466 ;
+C 59 ; WX 318 ; N C59 ; B 133 -133 199 466 ;
+C 60 ; WX 784 ; N C60 ; B 133 0 666 600 ;
+C 61 ; WX 851 ; N C61 ; B 133 199 733 399 ;
+C 62 ; WX 784 ; N C62 ; B 133 0 666 600 ;
+C 63 ; WX 585 ; N C63 ; B 99 0 500 700 ;
+C 64 ; WX 884 ; N C64 ; B 99 0 799 700 ;
+C 65 ; WX 585 ; N C65 ; B 32 0 566 700 ;
+C 66 ; WX 685 ; N C66 ; B 133 0 600 700 ;
+C 67 ; WX 551 ; N C67 ; B 133 0 532 700 ;
+C 68 ; WX 585 ; N C68 ; B 32 0 566 700 ;
+C 69 ; WX 618 ; N C69 ; B 133 0 566 700 ;
+C 70 ; WX 651 ; N C70 ; B 99 0 566 700 ;
+C 71 ; WX 718 ; N C71 ; B 133 0 600 700 ;
+C 72 ; WX 718 ; N C72 ; B 99 0 633 700 ;
+C 73 ; WX 251 ; N C73 ; B 133 0 133 700 ;
+C 74 ; WX 685 ; N C74 ; B 133 0 600 700 ;
+C 75 ; WX 585 ; N C75 ; B 32 0 566 700 ;
+C 76 ; WX 784 ; N C76 ; B 133 0 666 700 ;
+C 77 ; WX 718 ; N C77 ; B 133 0 600 700 ;
+C 78 ; WX 585 ; N C78 ; B 66 0 532 700 ;
+C 79 ; WX 718 ; N C79 ; B 99 0 633 700 ;
+C 80 ; WX 718 ; N C80 ; B 133 0 600 700 ;
+C 81 ; WX 685 ; N C81 ; B 133 0 600 700 ;
+C 82 ; WX 585 ; N C82 ; B 66 0 532 700 ;
+C 83 ; WX 518 ; N C83 ; B 32 0 500 700 ;
+C 84 ; WX 585 ; N C84 ; B 66 0 532 700 ;
+C 85 ; WX 651 ; N C85 ; B 99 0 566 700 ;
+C 86 ; WX 651 ; N C86 ; B 99 0 566 700 ;
+C 87 ; WX 718 ; N C87 ; B 66 0 666 700 ;
+C 88 ; WX 651 ; N C88 ; B 99 0 566 700 ;
+C 89 ; WX 651 ; N C89 ; B 0 0 600 700 ;
+C 90 ; WX 751 ; N C90 ; B 99 0 700 700 ;
+C 91 ; WX 451 ; N C91 ; B 133 -233 366 833 ;
+C 92 ; WX 300 ; N C92 ; B 0 0 0 0 ;
+C 93 ; WX 451 ; N C93 ; B 99 -233 333 833 ;
+C 94 ; WX 300 ; N C94 ; B 0 0 0 0 ;
+C 95 ; WX 300 ; N C95 ; B 0 0 0 0 ;
+C 96 ; WX 318 ; N C96 ; B 133 500 199 700 ;
+C 97 ; WX 685 ; N C97 ; B 99 0 600 466 ;
+C 98 ; WX 618 ; N C98 ; B 66 -233 532 700 ;
+C 99 ; WX 618 ; N C99 ; B 32 -233 566 466 ;
+C 100 ; WX 585 ; N C100 ; B 99 0 500 700 ;
+C 101 ; WX 518 ; N C101 ; B 99 0 433 466 ;
+C 102 ; WX 485 ; N C102 ; B 99 -233 466 700 ;
+C 103 ; WX 651 ; N C103 ; B 32 -233 532 466 ;
+C 104 ; WX 685 ; N C104 ; B 32 0 633 700 ;
+C 105 ; WX 351 ; N C105 ; B 99 0 299 466 ;
+C 106 ; WX 585 ; N C106 ; B 66 0 532 466 ;
+C 107 ; WX 518 ; N C107 ; B 32 0 466 700 ;
+C 108 ; WX 685 ; N C108 ; B 32 -233 666 466 ;
+C 109 ; WX 585 ; N C109 ; B 99 0 532 466 ;
+C 110 ; WX 518 ; N C110 ; B 99 -233 466 700 ;
+C 111 ; WX 551 ; N C111 ; B 99 0 466 466 ;
+C 112 ; WX 718 ; N C112 ; B 66 0 666 466 ;
+C 113 ; WX 585 ; N C113 ; B 0 -233 500 466 ;
+C 114 ; WX 651 ; N C114 ; B 99 0 600 466 ;
+C 115 ; WX 651 ; N C115 ; B 66 0 600 466 ;
+C 116 ; WX 651 ; N C116 ; B 32 0 566 466 ;
+C 117 ; WX 718 ; N C117 ; B 99 -233 633 466 ;
+C 118 ; WX 585 ; N C118 ; B 32 -233 566 466 ;
+C 119 ; WX 751 ; N C119 ; B 32 -233 700 700 ;
+C 120 ; WX 751 ; N C120 ; B 99 0 666 466 ;
+C 121 ; WX 518 ; N C121 ; B 0 0 532 299 ;
+C 122 ; WX 451 ; N C122 ; B 0 0 466 700 ;
+C 123 ; WX 485 ; N C123 ; B 166 -233 333 833 ;
+C 124 ; WX 251 ; N C124 ; B 133 -233 133 833 ;
+C 125 ; WX 485 ; N C125 ; B 166 -233 333 833 ;
+C 126 ; WX 451 ; N C126 ; B 99 433 366 700 ;
+EndCharMetrics
+
+EndFontMetrics
diff --git a/src/fonts/plsg.gle b/src/fonts/plsg.gle
new file mode 100644
index 0000000..fd140b0
--- /dev/null
+++ b/src/fonts/plsg.gle
@@ -0,0 +1,1492 @@
+dfont design= 1428
+dfont char=33
+amove 238 1000
+aline 238 333
+amove 238 95
+aline 190 47
+aline 238 0
+aline 285 47
+aline 238 95
+stroke
+dfont endchar
+dfont char=34
+amove 190 666
+aline 190 1000
+amove 571 1000
+aline 571 666
+stroke
+dfont endchar
+dfont char=35
+amove 142 285
+aline 809 285
+amove 857 571
+aline 190 571
+amove 523 1190
+aline 190 -334
+amove 476 -334
+aline 809 1190
+stroke
+dfont endchar
+dfont char=36
+amove 142 142
+aline 238 47
+aline 380 0
+aline 571 0
+aline 714 47
+aline 809 142
+aline 809 285
+aline 761 380
+aline 714 428
+aline 619 476
+aline 333 571
+aline 238 619
+aline 190 666
+aline 142 761
+aline 142 857
+aline 238 952
+aline 380 1000
+aline 571 1000
+aline 714 952
+aline 809 857
+amove 571 1190
+aline 571 -191
+amove 380 -191
+aline 380 1190
+stroke
+dfont endchar
+dfont char=37
+amove 142 0
+aline 1000 1000
+aline 904 952
+aline 761 904
+aline 619 904
+aline 476 952
+aline 380 1000
+aline 285 1000
+aline 190 952
+aline 142 857
+aline 142 761
+aline 238 666
+aline 333 666
+aline 428 714
+aline 476 809
+aline 476 904
+aline 380 1000
+amove 809 333
+aline 714 285
+aline 666 190
+aline 666 95
+aline 761 0
+aline 857 0
+aline 952 47
+aline 1000 142
+aline 1000 238
+aline 904 333
+aline 809 333
+stroke
+dfont endchar
+dfont char=38
+amove 1095 571
+aline 1095 619
+aline 1047 666
+aline 1000 666
+aline 952 619
+aline 904 523
+aline 809 285
+aline 714 142
+aline 619 47
+aline 523 0
+aline 333 0
+aline 238 47
+aline 190 95
+aline 142 190
+aline 142 285
+aline 190 380
+aline 238 428
+aline 571 619
+aline 619 666
+aline 666 761
+aline 666 857
+aline 619 952
+aline 523 1000
+aline 428 952
+aline 380 857
+aline 380 761
+aline 428 619
+aline 523 476
+aline 761 142
+aline 857 47
+aline 952 0
+aline 1047 0
+aline 1095 47
+aline 1095 95
+stroke
+dfont endchar
+dfont char=39
+amove 190 1000
+aline 190 666
+stroke
+dfont endchar
+dfont char=40
+amove 523 1190
+aline 428 1095
+aline 333 952
+aline 238 761
+aline 190 523
+aline 190 333
+aline 238 95
+aline 333 -96
+aline 428 -239
+aline 523 -334
+stroke
+dfont endchar
+dfont char=41
+amove 142 -334
+aline 238 -239
+aline 333 -96
+aline 428 95
+aline 476 333
+aline 476 523
+aline 428 761
+aline 333 952
+aline 238 1095
+aline 142 1190
+stroke
+dfont endchar
+dfont char=42
+amove 142 285
+aline 619 571
+amove 380 714
+aline 380 142
+amove 619 285
+aline 142 571
+stroke
+dfont endchar
+dfont char=43
+amove 190 428
+aline 1047 428
+amove 619 857
+aline 619 0
+stroke
+dfont endchar
+dfont char=44
+amove 190 -191
+aline 238 -143
+aline 285 -48
+aline 285 47
+aline 238 95
+aline 190 47
+aline 238 0
+aline 285 47
+stroke
+dfont endchar
+dfont char=45
+amove 190 428
+aline 1047 428
+stroke
+dfont endchar
+dfont char=46
+amove 238 95
+aline 190 47
+aline 238 0
+aline 285 47
+aline 238 95
+stroke
+dfont endchar
+dfont char=47
+amove 95 -334
+aline 952 1190
+stroke
+dfont endchar
+dfont char=48
+amove 428 1000
+aline 285 952
+aline 190 809
+aline 142 571
+aline 142 428
+aline 190 190
+aline 285 47
+aline 428 0
+aline 523 0
+aline 666 47
+aline 761 190
+aline 809 428
+aline 809 571
+aline 761 809
+aline 666 952
+aline 523 1000
+aline 428 1000
+stroke
+dfont endchar
+dfont char=49
+amove 285 809
+aline 380 857
+aline 523 1000
+aline 523 0
+stroke
+dfont endchar
+dfont char=50
+amove 190 761
+aline 190 809
+aline 238 904
+aline 285 952
+aline 380 1000
+aline 571 1000
+aline 666 952
+aline 714 904
+aline 761 809
+aline 761 714
+aline 714 619
+aline 619 476
+aline 142 0
+aline 809 0
+stroke
+dfont endchar
+dfont char=51
+amove 142 190
+aline 190 95
+aline 238 47
+aline 380 0
+aline 523 0
+aline 666 47
+aline 761 142
+aline 809 285
+aline 809 380
+aline 761 523
+aline 714 571
+aline 619 619
+aline 476 619
+aline 761 1000
+aline 238 1000
+stroke
+dfont endchar
+dfont char=52
+amove 619 0
+aline 619 1000
+aline 142 333
+aline 857 333
+stroke
+dfont endchar
+dfont char=53
+amove 142 190
+aline 190 95
+aline 238 47
+aline 380 0
+aline 523 0
+aline 666 47
+aline 761 142
+aline 809 285
+aline 809 380
+aline 761 523
+aline 666 619
+aline 523 666
+aline 380 666
+aline 238 619
+aline 190 571
+aline 238 1000
+aline 714 1000
+stroke
+dfont endchar
+dfont char=54
+amove 190 333
+aline 238 476
+aline 333 571
+aline 476 619
+aline 523 619
+aline 666 571
+aline 761 476
+aline 809 333
+aline 809 285
+aline 761 142
+aline 666 47
+aline 523 -1
+aline 476 -1
+aline 333 47
+aline 238 142
+aline 190 333
+aline 190 571
+aline 238 809
+aline 333 952
+aline 476 1000
+aline 571 1000
+aline 714 952
+aline 761 857
+stroke
+dfont endchar
+dfont char=55
+amove 333 0
+aline 809 1000
+aline 142 1000
+stroke
+dfont endchar
+dfont char=56
+amove 380 1000
+aline 238 952
+aline 190 857
+aline 190 761
+aline 238 666
+aline 333 619
+aline 523 571
+aline 666 523
+aline 761 428
+aline 809 333
+aline 809 190
+aline 761 95
+aline 714 47
+aline 571 -1
+aline 380 -1
+aline 238 47
+aline 190 95
+aline 142 190
+aline 142 333
+aline 190 428
+aline 285 523
+aline 428 571
+aline 619 619
+aline 714 666
+aline 761 761
+aline 761 857
+aline 714 952
+aline 571 1000
+aline 380 1000
+stroke
+dfont endchar
+dfont char=57
+amove 190 142
+aline 238 47
+aline 380 0
+aline 476 0
+aline 619 47
+aline 714 190
+aline 761 428
+aline 761 666
+aline 714 857
+aline 619 952
+aline 476 1000
+aline 428 1000
+aline 285 952
+aline 190 857
+aline 142 714
+aline 142 666
+aline 190 523
+aline 285 428
+aline 428 380
+aline 476 380
+aline 619 428
+aline 714 523
+aline 761 666
+stroke
+dfont endchar
+dfont char=58
+amove 238 666
+aline 190 619
+aline 238 571
+aline 285 619
+aline 238 666
+amove 238 95
+aline 190 47
+aline 238 -1
+aline 285 47
+aline 238 95
+stroke
+dfont endchar
+dfont char=59
+amove 190 -191
+aline 238 -143
+aline 285 -48
+aline 285 47
+aline 238 95
+aline 190 47
+aline 238 0
+aline 285 47
+amove 238 666
+aline 190 619
+aline 238 571
+aline 285 619
+aline 238 666
+stroke
+dfont endchar
+dfont char=60
+amove 952 857
+aline 190 428
+aline 952 0
+stroke
+dfont endchar
+dfont char=61
+amove 190 285
+aline 1047 285
+amove 1047 571
+aline 190 571
+stroke
+dfont endchar
+dfont char=62
+amove 190 0
+aline 952 428
+aline 190 857
+stroke
+dfont endchar
+dfont char=63
+amove 142 761
+aline 142 809
+aline 190 904
+aline 238 952
+aline 333 1000
+aline 523 1000
+aline 619 952
+aline 666 904
+aline 714 809
+aline 714 714
+aline 666 619
+aline 619 571
+aline 428 476
+aline 428 333
+amove 428 95
+aline 380 47
+aline 428 -1
+aline 476 47
+aline 428 95
+stroke
+dfont endchar
+dfont char=64
+amove 523 238
+aline 476 285
+aline 428 380
+aline 428 523
+aline 476 666
+aline 571 761
+amove 857 761
+aline 809 380
+aline 809 285
+aline 904 238
+aline 999 238
+aline 1095 333
+aline 1142 476
+aline 1142 571
+aline 1095 714
+aline 1047 809
+aline 952 904
+aline 857 952
+aline 714 1000
+aline 571 1000
+aline 428 952
+aline 333 904
+aline 238 809
+aline 190 714
+aline 142 571
+aline 142 428
+aline 190 285
+aline 238 190
+aline 333 95
+aline 428 47
+aline 571 0
+aline 714 0
+aline 857 47
+aline 952 95
+aline 1000 142
+amove 904 238
+aline 857 285
+aline 857 380
+aline 904 761
+amove 857 619
+aline 809 714
+aline 714 761
+aline 571 761
+aline 476 714
+aline 428 666
+aline 380 523
+aline 380 380
+aline 428 285
+aline 523 238
+aline 666 238
+aline 761 285
+aline 809 380
+stroke
+dfont endchar
+dfont char=65
+amove 47 0
+aline 428 1000
+aline 809 0
+amove 666 333
+aline 190 333
+stroke
+dfont endchar
+dfont char=66
+amove 190 0
+aline 190 1000
+aline 619 1000
+aline 761 952
+aline 809 904
+aline 857 809
+aline 857 714
+aline 809 619
+aline 761 571
+aline 619 523
+amove 190 523
+aline 619 523
+aline 761 476
+aline 809 428
+aline 857 333
+aline 857 190
+aline 809 95
+aline 761 47
+aline 619 -1
+aline 190 -1
+stroke
+dfont endchar
+dfont char=67
+amove 190 0
+aline 190 1000
+aline 761 1000
+stroke
+dfont endchar
+dfont char=68
+amove 47 0
+aline 428 1000
+aline 809 0
+aline 47 0
+stroke
+dfont endchar
+dfont char=69
+amove 190 0
+aline 190 1000
+aline 809 1000
+amove 571 523
+aline 190 523
+amove 190 0
+aline 809 0
+stroke
+dfont endchar
+dfont char=70
+amove 142 0
+aline 809 1000
+aline 142 1000
+amove 142 0
+aline 809 0
+stroke
+dfont endchar
+dfont char=71
+amove 190 0
+aline 190 1000
+amove 190 523
+aline 857 523
+amove 857 1000
+aline 857 0
+stroke
+dfont endchar
+dfont char=72
+amove 428 1000
+aline 333 952
+aline 238 857
+aline 190 761
+aline 142 619
+aline 142 380
+aline 190 238
+aline 238 142
+aline 333 47
+aline 428 0
+aline 619 0
+aline 714 47
+aline 809 142
+aline 857 238
+aline 904 380
+aline 904 619
+aline 857 761
+aline 809 857
+aline 714 952
+aline 619 1000
+aline 428 1000
+amove 380 523
+aline 666 523
+stroke
+dfont endchar
+dfont char=73
+amove 190 1000
+aline 190 0
+stroke
+dfont endchar
+dfont char=74
+amove 190 0
+aline 190 1000
+amove 428 571
+aline 857 0
+amove 190 333
+aline 857 1000
+stroke
+dfont endchar
+dfont char=75
+amove 47 0
+aline 428 1000
+aline 809 0
+stroke
+dfont endchar
+dfont char=76
+amove 190 0
+aline 190 1000
+aline 571 0
+aline 952 1000
+aline 952 0
+stroke
+dfont endchar
+dfont char=77
+amove 190 0
+aline 190 1000
+aline 857 0
+aline 857 1000
+stroke
+dfont endchar
+dfont char=78
+amove 95 0
+aline 761 0
+amove 571 523
+aline 285 523
+amove 95 1000
+aline 761 1000
+stroke
+dfont endchar
+dfont char=79
+amove 428 1000
+aline 333 952
+aline 238 857
+aline 190 761
+aline 142 619
+aline 142 380
+aline 190 238
+aline 238 142
+aline 333 47
+aline 428 0
+aline 619 0
+aline 714 47
+aline 809 142
+aline 857 238
+aline 904 380
+aline 904 619
+aline 857 761
+aline 809 857
+aline 714 952
+aline 619 1000
+aline 428 1000
+stroke
+dfont endchar
+dfont char=80
+amove 190 0
+aline 190 1000
+aline 857 1000
+aline 857 0
+stroke
+dfont endchar
+dfont char=81
+amove 190 0
+aline 190 1000
+aline 619 1000
+aline 761 952
+aline 809 904
+aline 857 809
+aline 857 666
+aline 809 571
+aline 761 523
+aline 619 476
+aline 190 476
+stroke
+dfont endchar
+dfont char=82
+amove 95 0
+aline 428 523
+aline 95 1000
+aline 761 1000
+amove 761 0
+aline 95 0
+stroke
+dfont endchar
+dfont char=83
+amove 380 0
+aline 380 1000
+amove 47 1000
+aline 714 1000
+stroke
+dfont endchar
+dfont char=84
+amove 428 0
+aline 428 666
+aline 380 857
+aline 333 952
+aline 285 1000
+aline 190 1000
+aline 142 952
+aline 95 857
+aline 95 761
+amove 428 666
+aline 476 857
+aline 523 952
+aline 571 1000
+aline 666 1000
+aline 714 952
+aline 761 857
+aline 761 761
+stroke
+dfont endchar
+dfont char=85
+amove 476 0
+aline 476 1000
+amove 380 761
+aline 238 714
+aline 190 666
+aline 142 571
+aline 142 428
+aline 190 333
+aline 238 285
+aline 380 238
+aline 571 238
+aline 714 285
+aline 761 333
+aline 809 428
+aline 809 571
+aline 761 666
+aline 714 714
+aline 571 761
+aline 380 761
+stroke
+dfont endchar
+dfont char=86
+amove 142 0
+aline 809 1000
+amove 142 1000
+aline 809 0
+stroke
+dfont endchar
+dfont char=87
+amove 523 0
+aline 523 1000
+amove 95 714
+aline 142 714
+aline 190 666
+aline 238 476
+aline 285 380
+aline 333 333
+aline 476 285
+aline 571 285
+aline 714 333
+aline 761 380
+aline 809 476
+aline 857 666
+aline 904 714
+aline 952 714
+stroke
+dfont endchar
+dfont char=88
+amove 142 0
+aline 333 0
+aline 190 333
+aline 142 523
+aline 142 714
+aline 190 857
+aline 285 952
+aline 428 1000
+aline 523 1000
+aline 666 952
+aline 761 857
+aline 809 714
+aline 809 523
+aline 761 333
+aline 619 0
+aline 809 0
+stroke
+dfont endchar
+dfont char=89
+amove 0 0
+aline 95 47
+aline 238 190
+aline 380 380
+aline 571 714
+aline 714 1000
+aline 714 0
+aline 666 142
+aline 571 285
+aline 476 380
+aline 333 476
+aline 238 476
+aline 190 428
+aline 190 333
+aline 238 238
+aline 333 142
+aline 476 47
+aline 619 0
+aline 857 0
+stroke
+dfont endchar
+dfont char=90
+amove 428 142
+aline 476 47
+aline 571 0
+aline 714 0
+aline 809 47
+aline 857 95
+aline 904 190
+aline 904 333
+aline 857 428
+aline 809 476
+aline 666 523
+aline 619 523
+amove 666 523
+aline 809 571
+aline 904 619
+aline 952 666
+aline 1000 761
+aline 1000 857
+aline 952 952
+aline 857 1000
+aline 714 1000
+aline 571 952
+aline 476 904
+aline 380 809
+aline 285 666
+aline 238 571
+aline 190 428
+aline 142 190
+aline 142 47
+aline 190 0
+aline 238 0
+aline 333 47
+aline 428 142
+aline 523 285
+aline 571 380
+aline 619 523
+aline 666 714
+aline 666 857
+aline 619 904
+stroke
+dfont endchar
+dfont char=91
+amove 190 -334
+aline 190 1190
+aline 523 1190
+amove 238 1190
+aline 238 -334
+amove 190 -334
+aline 523 -334
+stroke
+dfont endchar
+stroke
+dfont endchar
+dfont char=93
+amove 142 -334
+aline 476 -334
+aline 476 1190
+aline 142 1190
+amove 428 1190
+aline 428 -334
+stroke
+dfont endchar
+stroke
+dfont endchar
+stroke
+dfont endchar
+dfont char=96
+amove 238 904
+aline 285 952
+aline 238 1000
+aline 190 952
+aline 190 857
+aline 238 761
+aline 285 714
+stroke
+dfont endchar
+dfont char=97
+amove 428 666
+aline 333 619
+aline 238 523
+aline 190 428
+aline 142 285
+aline 142 142
+aline 190 47
+aline 285 -1
+aline 380 -1
+aline 476 47
+aline 619 190
+aline 714 333
+aline 809 523
+aline 857 666
+amove 428 666
+aline 523 666
+aline 571 619
+aline 619 523
+aline 714 142
+aline 761 47
+aline 809 -1
+aline 857 -1
+stroke
+dfont endchar
+dfont char=98
+amove 190 238
+aline 238 95
+aline 285 47
+aline 380 -1
+aline 476 -1
+aline 571 47
+aline 619 95
+aline 666 190
+aline 666 333
+aline 619 428
+aline 523 523
+aline 428 571
+aline 571 571
+aline 666 619
+aline 714 666
+aline 761 761
+aline 761 904
+aline 666 1000
+aline 571 1000
+aline 476 952
+aline 380 857
+aline 285 666
+aline 238 523
+aline 190 333
+aline 142 47
+aline 95 -334
+stroke
+dfont endchar
+dfont char=99
+amove 428 0
+aline 476 238
+aline 476 428
+aline 428 571
+aline 380 619
+aline 285 666
+aline 238 666
+aline 142 619
+aline 47 523
+amove 809 666
+aline 761 523
+aline 714 428
+aline 428 0
+aline 333 -191
+aline 285 -334
+stroke
+dfont endchar
+dfont char=100
+amove 523 666
+aline 380 666
+aline 285 619
+aline 190 523
+aline 142 380
+aline 142 238
+aline 190 95
+aline 238 47
+aline 333 -1
+aline 428 -1
+aline 523 47
+aline 619 142
+aline 666 285
+aline 666 428
+aline 619 571
+aline 523 666
+aline 428 761
+aline 380 857
+aline 380 952
+aline 428 1000
+aline 523 1000
+aline 619 952
+aline 714 857
+stroke
+dfont endchar
+dfont char=101
+amove 619 571
+aline 571 619
+aline 476 666
+aline 333 666
+aline 238 619
+aline 238 523
+aline 285 428
+aline 428 380
+aline 238 333
+aline 142 238
+aline 142 142
+aline 190 47
+aline 285 0
+aline 428 0
+aline 523 47
+aline 619 142
+stroke
+dfont endchar
+dfont char=102
+amove 285 -239
+aline 333 -334
+aline 428 -334
+aline 476 -286
+aline 476 -191
+aline 428 -96
+aline 285 0
+aline 190 95
+aline 142 190
+aline 142 285
+aline 190 428
+aline 333 571
+aline 476 666
+aline 666 761
+aline 523 761
+aline 380 809
+aline 333 857
+aline 333 904
+aline 380 952
+aline 476 1000
+stroke
+dfont endchar
+dfont char=103
+amove 190 0
+aline 285 333
+aline 333 523
+aline 333 619
+aline 285 666
+aline 190 666
+aline 95 571
+aline 47 476
+amove 285 333
+aline 380 523
+aline 476 619
+aline 571 666
+aline 666 666
+aline 761 571
+aline 761 428
+aline 714 190
+aline 571 -334
+stroke
+dfont endchar
+dfont char=104
+amove 47 476
+aline 95 571
+aline 190 666
+aline 285 666
+aline 333 619
+aline 333 523
+aline 285 285
+aline 285 142
+aline 333 47
+aline 380 -1
+aline 476 -1
+aline 571 47
+aline 666 190
+aline 714 285
+aline 761 428
+aline 809 666
+aline 809 809
+aline 761 952
+aline 666 1000
+aline 571 1000
+aline 523 904
+aline 523 809
+aline 571 666
+aline 666 523
+aline 761 428
+aline 904 333
+stroke
+dfont endchar
+dfont char=105
+amove 285 666
+aline 190 333
+aline 142 142
+aline 142 47
+aline 190 -1
+aline 285 -1
+aline 380 95
+aline 428 190
+stroke
+dfont endchar
+dfont char=106
+amove 95 0
+aline 285 666
+amove 238 380
+aline 285 380
+aline 380 428
+aline 571 619
+aline 666 666
+aline 714 666
+aline 761 619
+amove 238 380
+aline 333 333
+aline 380 285
+aline 476 47
+aline 523 0
+aline 571 0
+aline 619 47
+stroke
+dfont endchar
+dfont char=107
+amove 95 0
+aline 380 666
+amove 47 1000
+aline 142 1000
+aline 238 952
+aline 285 904
+aline 666 -1
+stroke
+dfont endchar
+dfont char=108
+amove 47 -334
+aline 333 666
+amove 285 476
+aline 238 238
+aline 238 95
+aline 333 -1
+aline 428 -1
+aline 523 47
+aline 619 142
+aline 714 333
+amove 952 190
+aline 904 95
+aline 809 -1
+aline 714 -1
+aline 666 47
+aline 666 142
+aline 714 333
+aline 809 666
+stroke
+dfont endchar
+dfont char=109
+amove 142 0
+aline 190 142
+aline 238 380
+aline 285 666
+aline 142 666
+amove 761 666
+aline 714 523
+aline 666 428
+aline 571 285
+aline 428 142
+aline 285 47
+aline 142 0
+stroke
+dfont endchar
+dfont char=110
+amove 285 -334
+aline 380 -334
+aline 476 -286
+aline 476 -191
+aline 428 -143
+aline 238 -48
+aline 142 47
+aline 142 142
+aline 190 238
+aline 285 285
+aline 476 333
+amove 571 333
+aline 476 333
+aline 333 380
+aline 238 476
+aline 238 571
+aline 285 666
+aline 380 714
+aline 523 761
+amove 666 761
+aline 523 761
+aline 380 809
+aline 333 857
+aline 333 904
+aline 380 952
+aline 476 1000
+stroke
+dfont endchar
+dfont char=111
+amove 380 666
+aline 285 619
+aline 190 523
+aline 142 380
+aline 142 238
+aline 190 95
+aline 238 47
+aline 333 -1
+aline 428 -1
+aline 523 47
+aline 619 142
+aline 666 285
+aline 666 428
+aline 619 571
+aline 571 619
+aline 476 666
+aline 380 666
+stroke
+dfont endchar
+dfont char=112
+amove 238 0
+aline 428 666
+amove 666 666
+aline 714 380
+aline 761 142
+aline 809 -1
+amove 952 666
+aline 333 666
+aline 190 619
+aline 95 523
+stroke
+dfont endchar
+dfont char=113
+amove 0 -334
+aline 190 380
+aline 238 523
+aline 333 619
+aline 428 666
+aline 523 666
+aline 619 619
+aline 666 571
+aline 714 428
+aline 714 285
+aline 666 142
+aline 571 47
+aline 476 -1
+aline 380 -1
+aline 285 47
+aline 238 95
+aline 190 238
+aline 190 380
+stroke
+dfont endchar
+dfont char=114
+amove 476 666
+aline 571 619
+aline 619 571
+aline 666 428
+aline 666 285
+aline 619 142
+aline 523 47
+aline 428 -1
+aline 333 -1
+aline 238 47
+aline 190 95
+aline 142 238
+aline 142 380
+aline 190 523
+aline 285 619
+aline 380 666
+aline 857 666
+stroke
+dfont endchar
+dfont char=115
+amove 380 0
+aline 523 666
+amove 857 666
+aline 333 666
+aline 190 619
+aline 95 523
+stroke
+dfont endchar
+dfont char=116
+amove 47 476
+aline 95 571
+aline 190 666
+aline 285 666
+aline 333 619
+aline 333 523
+aline 238 238
+aline 238 95
+aline 333 -1
+aline 428 -1
+aline 571 47
+aline 666 142
+aline 761 333
+aline 809 523
+aline 809 666
+stroke
+dfont endchar
+dfont char=117
+amove 285 -334
+aline 428 142
+aline 523 380
+aline 619 571
+aline 714 666
+aline 809 666
+aline 904 571
+aline 904 428
+aline 857 285
+aline 761 142
+aline 619 47
+aline 476 0
+aline 333 0
+aline 238 47
+aline 190 95
+aline 142 190
+aline 142 333
+aline 190 476
+aline 285 571
+aline 380 619
+stroke
+dfont endchar
+dfont char=118
+amove 47 -334
+aline 95 -239
+aline 190 -96
+aline 666 428
+aline 761 571
+aline 809 666
+amove 95 666
+aline 190 666
+aline 285 571
+aline 571 -239
+aline 666 -334
+aline 761 -334
+stroke
+dfont endchar
+dfont char=119
+amove 47 476
+aline 95 571
+aline 190 666
+aline 285 666
+aline 333 619
+aline 333 523
+aline 285 285
+aline 285 142
+aline 333 47
+aline 428 -1
+aline 523 -1
+aline 666 47
+aline 761 142
+aline 857 285
+aline 952 523
+aline 1000 666
+amove 761 1000
+aline 380 -334
+stroke
+dfont endchar
+dfont char=120
+amove 523 190
+aline 428 47
+aline 333 0
+aline 238 0
+aline 190 47
+aline 142 190
+aline 142 333
+aline 190 476
+aline 285 619
+aline 380 666
+amove 571 380
+aline 523 190
+aline 571 47
+aline 619 0
+aline 714 0
+aline 809 47
+aline 904 190
+aline 952 333
+aline 952 476
+aline 904 619
+aline 857 666
+stroke
+dfont endchar
+dfont char=121
+amove 428 285
+aline 380 380
+aline 285 428
+aline 190 428
+aline 95 380
+aline 47 333
+aline 0 238
+aline 0 142
+aline 47 47
+aline 142 0
+aline 238 0
+aline 333 47
+aline 380 142
+aline 476 428
+aline 428 190
+aline 428 47
+aline 476 0
+aline 523 0
+aline 619 47
+aline 666 95
+aline 761 238
+stroke
+dfont endchar
+dfont char=122
+amove 0 238
+aline 95 380
+aline 238 619
+aline 285 714
+aline 333 857
+aline 333 952
+aline 285 1000
+aline 190 952
+aline 142 857
+aline 95 666
+aline 47 333
+aline 47 47
+aline 95 -1
+aline 142 -1
+aline 238 47
+aline 333 142
+aline 380 285
+aline 380 428
+aline 428 238
+aline 476 190
+aline 571 190
+aline 666 238
+stroke
+dfont endchar
+dfont char=123
+amove 380 238
+aline 333 95
+aline 333 -96
+aline 380 -239
+amove 476 -334
+aline 333 -191
+aline 285 -48
+aline 285 47
+aline 333 190
+aline 428 285
+aline 428 333
+aline 238 428
+aline 428 523
+aline 428 571
+aline 333 666
+aline 285 809
+aline 285 904
+aline 333 1047
+aline 476 1190
+amove 380 1095
+aline 333 952
+aline 333 761
+aline 380 619
+stroke
+dfont endchar
+dfont char=124
+amove 190 1190
+aline 190 -334
+stroke
+dfont endchar
+dfont char=125
+amove 238 -334
+aline 380 -191
+aline 428 -48
+aline 428 47
+aline 380 190
+aline 285 285
+aline 285 333
+aline 476 428
+aline 285 523
+aline 285 571
+aline 380 666
+aline 428 809
+aline 428 904
+aline 380 1047
+aline 238 1190
+amove 333 1095
+aline 380 952
+aline 380 761
+aline 333 619
+amove 333 238
+aline 380 95
+aline 380 -96
+aline 333 -239
+stroke
+dfont endchar
+dfont char=126
+amove 285 1000
+aline 190 952
+aline 142 857
+aline 142 761
+aline 190 666
+aline 285 619
+aline 380 619
+aline 476 666
+aline 523 761
+aline 523 857
+aline 476 952
+aline 380 1000
+aline 285 1000
+stroke
+dfont endchar
diff --git a/src/fonts/plsr.afm b/src/fonts/plsr.afm
new file mode 100644
index 0000000..0c17979
--- /dev/null
+++ b/src/fonts/plsr.afm
@@ -0,0 +1,115 @@
+StartFontMetrics 2.0
+Comment Made from HERSHEY font file using SPLITFONT.BAS
+FontName plSR
+EncodingScheme TEXENCODING
+FullName plSR
+FamilyName plSR
+Weight Medium
+ItalicAngle 0
+IsFixedPitch false
+UnderlinePosition -97
+UnderlineThickness 73
+FontBBox 0 -400 1001 1001
+CapHeight 729
+XHeight 151
+Descender -219
+Ascender 729
+StartCharMetrics 95
+C 32 ; WX 400 ; N C32 ; B 0 0 0 0 ;
+C 33 ; WX 318 ; N C33 ; B 133 0 199 700 ;
+C 34 ; WX 518 ; N C34 ; B 133 466 399 700 ;
+C 35 ; WX 685 ; N C35 ; B 99 -233 600 833 ;
+C 36 ; WX 651 ; N C36 ; B 99 -133 566 833 ;
+C 37 ; WX 784 ; N C37 ; B 99 0 700 700 ;
+C 38 ; WX 851 ; N C38 ; B 99 0 766 700 ;
+C 39 ; WX 251 ; N C39 ; B 133 466 133 700 ;
+C 40 ; WX 451 ; N C40 ; B 133 -233 366 833 ;
+C 41 ; WX 451 ; N C41 ; B 99 -233 333 833 ;
+C 42 ; WX 518 ; N C42 ; B 99 99 433 500 ;
+C 43 ; WX 851 ; N C43 ; B 133 0 733 600 ;
+C 44 ; WX 318 ; N C44 ; B 133 -133 199 66 ;
+C 45 ; WX 851 ; N C45 ; B 133 299 733 299 ;
+C 46 ; WX 318 ; N C46 ; B 133 0 199 66 ;
+C 47 ; WX 718 ; N C47 ; B 66 -233 666 833 ;
+C 48 ; WX 651 ; N C48 ; B 99 0 566 700 ;
+C 49 ; WX 651 ; N C49 ; B 199 0 366 700 ;
+C 50 ; WX 651 ; N C50 ; B 99 0 566 700 ;
+C 51 ; WX 651 ; N C51 ; B 99 0 566 700 ;
+C 52 ; WX 651 ; N C52 ; B 99 0 600 700 ;
+C 53 ; WX 651 ; N C53 ; B 99 0 566 700 ;
+C 54 ; WX 651 ; N C54 ; B 133 0 566 700 ;
+C 55 ; WX 651 ; N C55 ; B 99 0 566 700 ;
+C 56 ; WX 651 ; N C56 ; B 99 0 566 700 ;
+C 57 ; WX 651 ; N C57 ; B 99 0 532 700 ;
+C 58 ; WX 318 ; N C58 ; B 133 0 199 466 ;
+C 59 ; WX 318 ; N C59 ; B 133 -133 199 466 ;
+C 60 ; WX 784 ; N C60 ; B 133 0 666 600 ;
+C 61 ; WX 851 ; N C61 ; B 133 199 733 399 ;
+C 62 ; WX 784 ; N C62 ; B 133 0 666 600 ;
+C 63 ; WX 585 ; N C63 ; B 99 0 500 700 ;
+C 64 ; WX 884 ; N C64 ; B 99 0 799 700 ;
+C 65 ; WX 585 ; N C65 ; B 32 0 566 700 ;
+C 66 ; WX 685 ; N C66 ; B 133 0 600 700 ;
+C 67 ; WX 685 ; N C67 ; B 99 0 600 700 ;
+C 68 ; WX 685 ; N C68 ; B 133 0 600 700 ;
+C 69 ; WX 618 ; N C69 ; B 133 0 566 700 ;
+C 70 ; WX 585 ; N C70 ; B 133 0 566 700 ;
+C 71 ; WX 685 ; N C71 ; B 99 0 600 700 ;
+C 72 ; WX 718 ; N C72 ; B 133 0 600 700 ;
+C 73 ; WX 251 ; N C73 ; B 133 0 133 700 ;
+C 74 ; WX 518 ; N C74 ; B 66 0 399 700 ;
+C 75 ; WX 685 ; N C75 ; B 133 0 600 700 ;
+C 76 ; WX 551 ; N C76 ; B 133 0 532 700 ;
+C 77 ; WX 784 ; N C77 ; B 133 0 666 700 ;
+C 78 ; WX 718 ; N C78 ; B 133 0 600 700 ;
+C 79 ; WX 718 ; N C79 ; B 99 0 633 700 ;
+C 80 ; WX 685 ; N C80 ; B 133 0 600 700 ;
+C 81 ; WX 718 ; N C81 ; B 99 -67 633 700 ;
+C 82 ; WX 685 ; N C82 ; B 133 0 600 700 ;
+C 83 ; WX 651 ; N C83 ; B 99 0 566 700 ;
+C 84 ; WX 518 ; N C84 ; B 32 0 500 700 ;
+C 85 ; WX 718 ; N C85 ; B 133 0 600 700 ;
+C 86 ; WX 585 ; N C86 ; B 32 0 566 700 ;
+C 87 ; WX 784 ; N C87 ; B 66 0 733 700 ;
+C 88 ; WX 651 ; N C88 ; B 99 0 566 700 ;
+C 89 ; WX 585 ; N C89 ; B 32 0 566 700 ;
+C 90 ; WX 651 ; N C90 ; B 99 0 566 700 ;
+C 91 ; WX 451 ; N C91 ; B 133 -233 366 833 ;
+C 92 ; WX 300 ; N C92 ; B 0 0 0 0 ;
+C 93 ; WX 451 ; N C93 ; B 99 -233 333 833 ;
+C 94 ; WX 300 ; N C94 ; B 0 0 0 0 ;
+C 95 ; WX 300 ; N C95 ; B 0 0 0 0 ;
+C 96 ; WX 318 ; N C96 ; B 133 500 199 700 ;
+C 97 ; WX 618 ; N C97 ; B 99 0 500 466 ;
+C 98 ; WX 618 ; N C98 ; B 133 0 532 700 ;
+C 99 ; WX 585 ; N C99 ; B 99 0 500 466 ;
+C 100 ; WX 618 ; N C100 ; B 99 0 500 700 ;
+C 101 ; WX 585 ; N C101 ; B 99 0 500 466 ;
+C 102 ; WX 384 ; N C102 ; B 66 0 333 700 ;
+C 103 ; WX 618 ; N C103 ; B 99 -233 500 466 ;
+C 104 ; WX 618 ; N C104 ; B 133 0 500 700 ;
+C 105 ; WX 251 ; N C105 ; B 99 0 166 733 ;
+C 106 ; WX 318 ; N C106 ; B 32 -233 233 733 ;
+C 107 ; WX 551 ; N C107 ; B 133 0 500 700 ;
+C 108 ; WX 251 ; N C108 ; B 133 0 133 700 ;
+C 109 ; WX 985 ; N C109 ; B 133 0 866 466 ;
+C 110 ; WX 618 ; N C110 ; B 133 0 500 466 ;
+C 111 ; WX 618 ; N C111 ; B 99 0 532 466 ;
+C 112 ; WX 618 ; N C112 ; B 133 -233 532 466 ;
+C 113 ; WX 618 ; N C113 ; B 99 -233 500 466 ;
+C 114 ; WX 418 ; N C114 ; B 133 0 399 466 ;
+C 115 ; WX 551 ; N C115 ; B 99 0 466 466 ;
+C 116 ; WX 384 ; N C116 ; B 66 0 333 700 ;
+C 117 ; WX 618 ; N C117 ; B 133 0 500 466 ;
+C 118 ; WX 518 ; N C118 ; B 66 0 466 466 ;
+C 119 ; WX 718 ; N C119 ; B 99 0 633 466 ;
+C 120 ; WX 551 ; N C120 ; B 99 0 466 466 ;
+C 121 ; WX 518 ; N C121 ; B 32 -233 466 466 ;
+C 122 ; WX 551 ; N C122 ; B 99 0 466 466 ;
+C 123 ; WX 485 ; N C123 ; B 166 -233 333 833 ;
+C 124 ; WX 251 ; N C124 ; B 133 -233 133 833 ;
+C 125 ; WX 485 ; N C125 ; B 166 -233 333 833 ;
+C 126 ; WX 451 ; N C126 ; B 99 433 366 700 ;
+EndCharMetrics
+
+EndFontMetrics
diff --git a/src/fonts/plsr.gle b/src/fonts/plsr.gle
new file mode 100644
index 0000000..bce9cab
--- /dev/null
+++ b/src/fonts/plsr.gle
@@ -0,0 +1,1304 @@
+dfont design= 1428
+dfont char=33
+amove 238 1000
+aline 238 333
+amove 238 95
+aline 190 47
+aline 238 0
+aline 285 47
+aline 238 95
+stroke
+dfont endchar
+dfont char=34
+amove 190 666
+aline 190 1000
+amove 571 1000
+aline 571 666
+stroke
+dfont endchar
+dfont char=35
+amove 142 285
+aline 809 285
+amove 857 571
+aline 190 571
+amove 523 1190
+aline 190 -334
+amove 476 -334
+aline 809 1190
+stroke
+dfont endchar
+dfont char=36
+amove 142 142
+aline 238 47
+aline 380 0
+aline 571 0
+aline 714 47
+aline 809 142
+aline 809 285
+aline 761 380
+aline 714 428
+aline 619 476
+aline 333 571
+aline 238 619
+aline 190 666
+aline 142 761
+aline 142 857
+aline 238 952
+aline 380 1000
+aline 571 1000
+aline 714 952
+aline 809 857
+amove 571 1190
+aline 571 -191
+amove 380 -191
+aline 380 1190
+stroke
+dfont endchar
+dfont char=37
+amove 142 0
+aline 1000 1000
+aline 904 952
+aline 761 904
+aline 619 904
+aline 476 952
+aline 380 1000
+aline 285 1000
+aline 190 952
+aline 142 857
+aline 142 761
+aline 238 666
+aline 333 666
+aline 428 714
+aline 476 809
+aline 476 904
+aline 380 1000
+amove 809 333
+aline 714 285
+aline 666 190
+aline 666 95
+aline 761 0
+aline 857 0
+aline 952 47
+aline 1000 142
+aline 1000 238
+aline 904 333
+aline 809 333
+stroke
+dfont endchar
+dfont char=38
+amove 1095 571
+aline 1095 619
+aline 1047 666
+aline 1000 666
+aline 952 619
+aline 904 523
+aline 809 285
+aline 714 142
+aline 619 47
+aline 523 0
+aline 333 0
+aline 238 47
+aline 190 95
+aline 142 190
+aline 142 285
+aline 190 380
+aline 238 428
+aline 571 619
+aline 619 666
+aline 666 761
+aline 666 857
+aline 619 952
+aline 523 1000
+aline 428 952
+aline 380 857
+aline 380 761
+aline 428 619
+aline 523 476
+aline 761 142
+aline 857 47
+aline 952 0
+aline 1047 0
+aline 1095 47
+aline 1095 95
+stroke
+dfont endchar
+dfont char=39
+amove 190 1000
+aline 190 666
+stroke
+dfont endchar
+dfont char=40
+amove 523 1190
+aline 428 1095
+aline 333 952
+aline 238 761
+aline 190 523
+aline 190 333
+aline 238 95
+aline 333 -96
+aline 428 -239
+aline 523 -334
+stroke
+dfont endchar
+dfont char=41
+amove 142 -334
+aline 238 -239
+aline 333 -96
+aline 428 95
+aline 476 333
+aline 476 523
+aline 428 761
+aline 333 952
+aline 238 1095
+aline 142 1190
+stroke
+dfont endchar
+dfont char=42
+amove 142 285
+aline 619 571
+amove 380 714
+aline 380 142
+amove 619 285
+aline 142 571
+stroke
+dfont endchar
+dfont char=43
+amove 190 428
+aline 1047 428
+amove 619 857
+aline 619 0
+stroke
+dfont endchar
+dfont char=44
+amove 190 -191
+aline 238 -143
+aline 285 -48
+aline 285 47
+aline 238 95
+aline 190 47
+aline 238 0
+aline 285 47
+stroke
+dfont endchar
+dfont char=45
+amove 190 428
+aline 1047 428
+stroke
+dfont endchar
+dfont char=46
+amove 238 95
+aline 190 47
+aline 238 0
+aline 285 47
+aline 238 95
+stroke
+dfont endchar
+dfont char=47
+amove 95 -334
+aline 952 1190
+stroke
+dfont endchar
+dfont char=48
+amove 428 1000
+aline 285 952
+aline 190 809
+aline 142 571
+aline 142 428
+aline 190 190
+aline 285 47
+aline 428 0
+aline 523 0
+aline 666 47
+aline 761 190
+aline 809 428
+aline 809 571
+aline 761 809
+aline 666 952
+aline 523 1000
+aline 428 1000
+stroke
+dfont endchar
+dfont char=49
+amove 285 809
+aline 380 857
+aline 523 1000
+aline 523 0
+stroke
+dfont endchar
+dfont char=50
+amove 190 761
+aline 190 809
+aline 238 904
+aline 285 952
+aline 380 1000
+aline 571 1000
+aline 666 952
+aline 714 904
+aline 761 809
+aline 761 714
+aline 714 619
+aline 619 476
+aline 142 0
+aline 809 0
+stroke
+dfont endchar
+dfont char=51
+amove 142 190
+aline 190 95
+aline 238 47
+aline 380 0
+aline 523 0
+aline 666 47
+aline 761 142
+aline 809 285
+aline 809 380
+aline 761 523
+aline 714 571
+aline 619 619
+aline 476 619
+aline 761 1000
+aline 238 1000
+stroke
+dfont endchar
+dfont char=52
+amove 619 0
+aline 619 1000
+aline 142 333
+aline 857 333
+stroke
+dfont endchar
+dfont char=53
+amove 142 190
+aline 190 95
+aline 238 47
+aline 380 0
+aline 523 0
+aline 666 47
+aline 761 142
+aline 809 285
+aline 809 380
+aline 761 523
+aline 666 619
+aline 523 666
+aline 380 666
+aline 238 619
+aline 190 571
+aline 238 1000
+aline 714 1000
+stroke
+dfont endchar
+dfont char=54
+amove 190 333
+aline 238 476
+aline 333 571
+aline 476 619
+aline 523 619
+aline 666 571
+aline 761 476
+aline 809 333
+aline 809 285
+aline 761 142
+aline 666 47
+aline 523 -1
+aline 476 -1
+aline 333 47
+aline 238 142
+aline 190 333
+aline 190 571
+aline 238 809
+aline 333 952
+aline 476 1000
+aline 571 1000
+aline 714 952
+aline 761 857
+stroke
+dfont endchar
+dfont char=55
+amove 333 0
+aline 809 1000
+aline 142 1000
+stroke
+dfont endchar
+dfont char=56
+amove 380 1000
+aline 238 952
+aline 190 857
+aline 190 761
+aline 238 666
+aline 333 619
+aline 523 571
+aline 666 523
+aline 761 428
+aline 809 333
+aline 809 190
+aline 761 95
+aline 714 47
+aline 571 -1
+aline 380 -1
+aline 238 47
+aline 190 95
+aline 142 190
+aline 142 333
+aline 190 428
+aline 285 523
+aline 428 571
+aline 619 619
+aline 714 666
+aline 761 761
+aline 761 857
+aline 714 952
+aline 571 1000
+aline 380 1000
+stroke
+dfont endchar
+dfont char=57
+amove 190 142
+aline 238 47
+aline 380 0
+aline 476 0
+aline 619 47
+aline 714 190
+aline 761 428
+aline 761 666
+aline 714 857
+aline 619 952
+aline 476 1000
+aline 428 1000
+aline 285 952
+aline 190 857
+aline 142 714
+aline 142 666
+aline 190 523
+aline 285 428
+aline 428 380
+aline 476 380
+aline 619 428
+aline 714 523
+aline 761 666
+stroke
+dfont endchar
+dfont char=58
+amove 238 666
+aline 190 619
+aline 238 571
+aline 285 619
+aline 238 666
+amove 238 95
+aline 190 47
+aline 238 -1
+aline 285 47
+aline 238 95
+stroke
+dfont endchar
+dfont char=59
+amove 190 -191
+aline 238 -143
+aline 285 -48
+aline 285 47
+aline 238 95
+aline 190 47
+aline 238 0
+aline 285 47
+amove 238 666
+aline 190 619
+aline 238 571
+aline 285 619
+aline 238 666
+stroke
+dfont endchar
+dfont char=60
+amove 952 857
+aline 190 428
+aline 952 0
+stroke
+dfont endchar
+dfont char=61
+amove 190 285
+aline 1047 285
+amove 1047 571
+aline 190 571
+stroke
+dfont endchar
+dfont char=62
+amove 190 0
+aline 952 428
+aline 190 857
+stroke
+dfont endchar
+dfont char=63
+amove 142 761
+aline 142 809
+aline 190 904
+aline 238 952
+aline 333 1000
+aline 523 1000
+aline 619 952
+aline 666 904
+aline 714 809
+aline 714 714
+aline 666 619
+aline 619 571
+aline 428 476
+aline 428 333
+amove 428 95
+aline 380 47
+aline 428 -1
+aline 476 47
+aline 428 95
+stroke
+dfont endchar
+dfont char=64
+amove 523 238
+aline 476 285
+aline 428 380
+aline 428 523
+aline 476 666
+aline 571 761
+amove 857 761
+aline 809 380
+aline 809 285
+aline 904 238
+aline 999 238
+aline 1095 333
+aline 1142 476
+aline 1142 571
+aline 1095 714
+aline 1047 809
+aline 952 904
+aline 857 952
+aline 714 1000
+aline 571 1000
+aline 428 952
+aline 333 904
+aline 238 809
+aline 190 714
+aline 142 571
+aline 142 428
+aline 190 285
+aline 238 190
+aline 333 95
+aline 428 47
+aline 571 0
+aline 714 0
+aline 857 47
+aline 952 95
+aline 1000 142
+amove 904 238
+aline 857 285
+aline 857 380
+aline 904 761
+amove 857 619
+aline 809 714
+aline 714 761
+aline 571 761
+aline 476 714
+aline 428 666
+aline 380 523
+aline 380 380
+aline 428 285
+aline 523 238
+aline 666 238
+aline 761 285
+aline 809 380
+stroke
+dfont endchar
+dfont char=65
+amove 47 0
+aline 428 1000
+aline 809 0
+amove 666 333
+aline 190 333
+stroke
+dfont endchar
+dfont char=66
+amove 190 0
+aline 190 1000
+aline 619 1000
+aline 761 952
+aline 809 904
+aline 857 809
+aline 857 714
+aline 809 619
+aline 761 571
+aline 619 523
+amove 190 523
+aline 619 523
+aline 761 476
+aline 809 428
+aline 857 333
+aline 857 190
+aline 809 95
+aline 761 47
+aline 619 -1
+aline 190 -1
+stroke
+dfont endchar
+dfont char=67
+amove 857 761
+aline 809 857
+aline 714 952
+aline 619 1000
+aline 428 1000
+aline 333 952
+aline 238 857
+aline 190 761
+aline 142 619
+aline 142 380
+aline 190 238
+aline 238 142
+aline 333 47
+aline 428 0
+aline 619 0
+aline 714 47
+aline 809 142
+aline 857 238
+stroke
+dfont endchar
+dfont char=68
+amove 190 0
+aline 190 1000
+aline 523 1000
+aline 666 952
+aline 761 857
+aline 809 761
+aline 857 619
+aline 857 380
+aline 809 238
+aline 761 142
+aline 666 47
+aline 523 0
+aline 190 0
+stroke
+dfont endchar
+dfont char=69
+amove 190 0
+aline 190 1000
+aline 809 1000
+amove 571 523
+aline 190 523
+amove 190 0
+aline 809 0
+stroke
+dfont endchar
+dfont char=70
+amove 190 0
+aline 190 1000
+aline 809 1000
+amove 571 523
+aline 190 523
+stroke
+dfont endchar
+dfont char=71
+amove 619 380
+aline 857 380
+aline 857 238
+aline 809 142
+aline 714 47
+aline 619 -1
+aline 428 -1
+aline 333 47
+aline 238 142
+aline 190 238
+aline 142 380
+aline 142 619
+aline 190 761
+aline 238 857
+aline 333 952
+aline 428 1000
+aline 619 1000
+aline 714 952
+aline 809 857
+aline 857 761
+stroke
+dfont endchar
+dfont char=72
+amove 190 0
+aline 190 1000
+amove 190 523
+aline 857 523
+amove 857 1000
+aline 857 0
+stroke
+dfont endchar
+dfont char=73
+amove 190 1000
+aline 190 0
+stroke
+dfont endchar
+dfont char=74
+amove 95 333
+aline 95 238
+aline 142 95
+aline 190 47
+aline 285 0
+aline 380 0
+aline 476 47
+aline 523 95
+aline 571 238
+aline 571 1000
+stroke
+dfont endchar
+dfont char=75
+amove 190 0
+aline 190 1000
+amove 428 571
+aline 857 0
+amove 190 333
+aline 857 1000
+stroke
+dfont endchar
+dfont char=76
+amove 190 1000
+aline 190 0
+aline 761 0
+stroke
+dfont endchar
+dfont char=77
+amove 190 0
+aline 190 1000
+aline 571 0
+aline 952 1000
+aline 952 0
+stroke
+dfont endchar
+dfont char=78
+amove 190 0
+aline 190 1000
+aline 857 0
+aline 857 1000
+stroke
+dfont endchar
+dfont char=79
+amove 428 1000
+aline 333 952
+aline 238 857
+aline 190 761
+aline 142 619
+aline 142 380
+aline 190 238
+aline 238 142
+aline 333 47
+aline 428 0
+aline 619 0
+aline 714 47
+aline 809 142
+aline 857 238
+aline 904 380
+aline 904 619
+aline 857 761
+aline 809 857
+aline 714 952
+aline 619 1000
+aline 428 1000
+stroke
+dfont endchar
+dfont char=80
+amove 190 0
+aline 190 1000
+aline 619 1000
+aline 761 952
+aline 809 904
+aline 857 809
+aline 857 666
+aline 809 571
+aline 761 523
+aline 619 476
+aline 190 476
+stroke
+dfont endchar
+dfont char=81
+amove 428 1000
+aline 333 952
+aline 238 857
+aline 190 761
+aline 142 619
+aline 142 380
+aline 190 238
+aline 238 142
+aline 333 47
+aline 428 0
+aline 619 0
+aline 714 47
+aline 809 142
+aline 857 238
+aline 904 380
+aline 904 619
+aline 857 761
+aline 809 857
+aline 714 952
+aline 619 1000
+aline 428 1000
+amove 571 190
+aline 857 -96
+stroke
+dfont endchar
+dfont char=82
+amove 190 0
+aline 190 1000
+aline 619 1000
+aline 761 952
+aline 809 904
+aline 857 809
+aline 857 714
+aline 809 619
+aline 761 571
+aline 619 523
+aline 190 523
+amove 523 523
+aline 857 0
+stroke
+dfont endchar
+dfont char=83
+amove 142 142
+aline 238 47
+aline 380 0
+aline 571 0
+aline 714 47
+aline 809 142
+aline 809 285
+aline 761 380
+aline 714 428
+aline 619 476
+aline 333 571
+aline 238 619
+aline 190 666
+aline 142 761
+aline 142 857
+aline 238 952
+aline 380 1000
+aline 571 1000
+aline 714 952
+aline 809 857
+stroke
+dfont endchar
+dfont char=84
+amove 380 0
+aline 380 1000
+amove 47 1000
+aline 714 1000
+stroke
+dfont endchar
+dfont char=85
+amove 190 1000
+aline 190 285
+aline 238 142
+aline 333 47
+aline 476 0
+aline 571 0
+aline 714 47
+aline 809 142
+aline 857 285
+aline 857 1000
+stroke
+dfont endchar
+dfont char=86
+amove 428 0
+aline 47 1000
+amove 809 1000
+aline 428 0
+stroke
+dfont endchar
+dfont char=87
+amove 333 0
+aline 95 1000
+amove 571 1000
+aline 333 0
+amove 809 0
+aline 571 1000
+amove 1047 1000
+aline 809 0
+stroke
+dfont endchar
+dfont char=88
+amove 142 0
+aline 809 1000
+amove 142 1000
+aline 809 0
+stroke
+dfont endchar
+dfont char=89
+amove 428 0
+aline 428 523
+aline 47 1000
+amove 428 523
+aline 809 1000
+stroke
+dfont endchar
+dfont char=90
+amove 142 0
+aline 809 1000
+aline 142 1000
+amove 142 0
+aline 809 0
+stroke
+dfont endchar
+dfont char=91
+amove 190 -334
+aline 190 1190
+aline 523 1190
+amove 238 1190
+aline 238 -334
+amove 190 -334
+aline 523 -334
+stroke
+dfont endchar
+stroke
+dfont endchar
+dfont char=93
+amove 142 -334
+aline 476 -334
+aline 476 1190
+aline 142 1190
+amove 428 1190
+aline 428 -334
+stroke
+dfont endchar
+stroke
+dfont endchar
+stroke
+dfont endchar
+dfont char=96
+amove 238 904
+aline 285 952
+aline 238 1000
+aline 190 952
+aline 190 857
+aline 238 761
+aline 285 714
+stroke
+dfont endchar
+dfont char=97
+amove 714 0
+aline 714 666
+amove 714 523
+aline 619 619
+aline 523 666
+aline 380 666
+aline 285 619
+aline 190 523
+aline 142 380
+aline 142 285
+aline 190 142
+aline 285 47
+aline 380 0
+aline 523 0
+aline 619 47
+aline 714 142
+stroke
+dfont endchar
+dfont char=98
+amove 190 0
+aline 190 1000
+amove 190 523
+aline 285 619
+aline 380 666
+aline 523 666
+aline 619 619
+aline 714 523
+aline 761 380
+aline 761 285
+aline 714 142
+aline 619 47
+aline 523 0
+aline 380 0
+aline 285 47
+aline 190 142
+stroke
+dfont endchar
+dfont char=99
+amove 714 523
+aline 619 619
+aline 523 666
+aline 380 666
+aline 285 619
+aline 190 523
+aline 142 380
+aline 142 285
+aline 190 142
+aline 285 47
+aline 380 0
+aline 523 0
+aline 619 47
+aline 714 142
+stroke
+dfont endchar
+dfont char=100
+amove 714 0
+aline 714 1000
+amove 714 523
+aline 619 619
+aline 523 666
+aline 380 666
+aline 285 619
+aline 190 523
+aline 142 380
+aline 142 285
+aline 190 142
+aline 285 47
+aline 380 0
+aline 523 0
+aline 619 47
+aline 714 142
+stroke
+dfont endchar
+dfont char=101
+amove 142 380
+aline 714 380
+aline 714 476
+aline 666 571
+aline 619 619
+aline 523 666
+aline 380 666
+aline 285 619
+aline 190 523
+aline 142 380
+aline 142 285
+aline 190 142
+aline 285 47
+aline 380 0
+aline 523 0
+aline 619 47
+aline 714 142
+stroke
+dfont endchar
+dfont char=102
+amove 238 0
+aline 238 809
+aline 285 952
+aline 380 1000
+aline 476 1000
+amove 428 666
+aline 95 666
+stroke
+dfont endchar
+dfont char=103
+amove 285 -286
+aline 380 -334
+aline 523 -334
+aline 619 -286
+aline 666 -239
+aline 714 -96
+aline 714 666
+amove 714 523
+aline 619 619
+aline 523 666
+aline 380 666
+aline 285 619
+aline 190 523
+aline 142 380
+aline 142 285
+aline 190 142
+aline 285 47
+aline 380 0
+aline 523 0
+aline 619 47
+aline 714 142
+stroke
+dfont endchar
+dfont char=104
+amove 190 0
+aline 190 1000
+amove 190 476
+aline 333 619
+aline 428 666
+aline 571 666
+aline 666 619
+aline 714 476
+aline 714 0
+stroke
+dfont endchar
+dfont char=105
+amove 142 1000
+aline 190 952
+aline 238 1000
+aline 190 1047
+aline 142 1000
+amove 190 666
+aline 190 0
+stroke
+dfont endchar
+dfont char=106
+amove 47 -334
+aline 142 -334
+aline 238 -286
+aline 285 -143
+aline 285 666
+amove 238 1000
+aline 285 952
+aline 333 1000
+aline 285 1047
+aline 238 1000
+stroke
+dfont endchar
+dfont char=107
+amove 190 0
+aline 190 1000
+amove 666 666
+aline 190 190
+amove 380 380
+aline 714 0
+stroke
+dfont endchar
+dfont char=108
+amove 190 1000
+aline 190 0
+stroke
+dfont endchar
+dfont char=109
+amove 190 0
+aline 190 666
+amove 190 476
+aline 333 619
+aline 428 666
+aline 571 666
+aline 666 619
+aline 714 476
+aline 714 0
+amove 714 476
+aline 857 619
+aline 952 666
+aline 1095 666
+aline 1190 619
+aline 1238 476
+aline 1238 0
+stroke
+dfont endchar
+dfont char=110
+amove 190 0
+aline 190 666
+amove 190 476
+aline 333 619
+aline 428 666
+aline 571 666
+aline 666 619
+aline 714 476
+aline 714 0
+stroke
+dfont endchar
+dfont char=111
+amove 380 666
+aline 285 619
+aline 190 523
+aline 142 380
+aline 142 285
+aline 190 142
+aline 285 47
+aline 380 0
+aline 523 0
+aline 619 47
+aline 714 142
+aline 761 285
+aline 761 380
+aline 714 523
+aline 619 619
+aline 523 666
+aline 380 666
+stroke
+dfont endchar
+dfont char=112
+amove 190 142
+aline 285 47
+aline 380 0
+aline 523 0
+aline 619 47
+aline 714 142
+aline 761 285
+aline 761 380
+aline 714 523
+aline 619 619
+aline 523 666
+aline 380 666
+aline 285 619
+aline 190 523
+amove 190 666
+aline 190 -334
+stroke
+dfont endchar
+dfont char=113
+amove 714 142
+aline 619 47
+aline 523 0
+aline 380 0
+aline 285 47
+aline 190 142
+aline 142 285
+aline 142 380
+aline 190 523
+aline 285 619
+aline 380 666
+aline 523 666
+aline 619 619
+aline 714 523
+amove 714 666
+aline 714 -334
+stroke
+dfont endchar
+dfont char=114
+amove 190 0
+aline 190 666
+amove 190 380
+aline 238 523
+aline 333 619
+aline 428 666
+aline 571 666
+stroke
+dfont endchar
+dfont char=115
+amove 142 142
+aline 190 47
+aline 333 0
+aline 476 0
+aline 619 47
+aline 666 142
+aline 666 190
+aline 619 285
+aline 523 333
+aline 285 380
+aline 190 428
+aline 142 523
+aline 190 619
+aline 333 666
+aline 476 666
+aline 619 619
+aline 666 523
+stroke
+dfont endchar
+dfont char=116
+amove 476 0
+aline 380 0
+aline 285 47
+aline 238 190
+aline 238 1000
+amove 95 666
+aline 428 666
+stroke
+dfont endchar
+dfont char=117
+amove 190 666
+aline 190 190
+aline 238 47
+aline 333 -1
+aline 476 -1
+aline 571 47
+aline 714 190
+amove 714 666
+aline 714 0
+stroke
+dfont endchar
+dfont char=118
+amove 380 0
+aline 95 666
+amove 666 666
+aline 380 0
+stroke
+dfont endchar
+dfont char=119
+amove 333 0
+aline 142 666
+amove 523 666
+aline 333 0
+amove 714 0
+aline 523 666
+amove 904 666
+aline 714 0
+stroke
+dfont endchar
+dfont char=120
+amove 142 0
+aline 666 666
+amove 142 666
+aline 666 0
+stroke
+dfont endchar
+dfont char=121
+amove 47 -334
+aline 95 -334
+aline 190 -286
+aline 285 -191
+aline 380 -1
+aline 666 666
+amove 95 666
+aline 380 0
+stroke
+dfont endchar
+dfont char=122
+amove 142 0
+aline 666 666
+aline 142 666
+amove 142 0
+aline 666 0
+stroke
+dfont endchar
+dfont char=123
+amove 380 238
+aline 333 95
+aline 333 -96
+aline 380 -239
+amove 476 -334
+aline 333 -191
+aline 285 -48
+aline 285 47
+aline 333 190
+aline 428 285
+aline 428 333
+aline 238 428
+aline 428 523
+aline 428 571
+aline 333 666
+aline 285 809
+aline 285 904
+aline 333 1047
+aline 476 1190
+amove 380 1095
+aline 333 952
+aline 333 761
+aline 380 619
+stroke
+dfont endchar
+dfont char=124
+amove 190 1190
+aline 190 -334
+stroke
+dfont endchar
+dfont char=125
+amove 238 -334
+aline 380 -191
+aline 428 -48
+aline 428 47
+aline 380 190
+aline 285 285
+aline 285 333
+aline 476 428
+aline 285 523
+aline 285 571
+aline 380 666
+aline 428 809
+aline 428 904
+aline 380 1047
+aline 238 1190
+amove 333 1095
+aline 380 952
+aline 380 761
+aline 333 619
+amove 333 238
+aline 380 95
+aline 380 -96
+aline 333 -239
+stroke
+dfont endchar
+dfont char=126
+amove 285 1000
+aline 190 952
+aline 142 857
+aline 142 761
+aline 190 666
+aline 285 619
+aline 380 619
+aline 476 666
+aline 523 761
+aline 523 857
+aline 476 952
+aline 380 1000
+aline 285 1000
+stroke
+dfont endchar
diff --git a/src/fonts/plss.afm b/src/fonts/plss.afm
new file mode 100644
index 0000000..02dbe70
--- /dev/null
+++ b/src/fonts/plss.afm
@@ -0,0 +1,115 @@
+StartFontMetrics 2.0
+Comment Made from HERSHEY font file using SPLITFONT.BAS
+FontName plSS
+EncodingScheme TEXENCODING
+FullName plSS
+FamilyName plSS
+Weight Medium
+ItalicAngle 0
+IsFixedPitch false
+UnderlinePosition -97
+UnderlineThickness 73
+FontBBox 0 -400 1001 1001
+CapHeight 729
+XHeight 151
+Descender -219
+Ascender 729
+StartCharMetrics 95
+C 32 ; WX 400 ; N C32 ; B 0 0 0 0 ;
+C 33 ; WX 318 ; N C33 ; B 133 0 199 700 ;
+C 34 ; WX 518 ; N C34 ; B 133 466 399 700 ;
+C 35 ; WX 685 ; N C35 ; B 99 -233 600 833 ;
+C 36 ; WX 651 ; N C36 ; B 99 -133 566 833 ;
+C 37 ; WX 784 ; N C37 ; B 99 0 700 700 ;
+C 38 ; WX 851 ; N C38 ; B 99 0 766 700 ;
+C 39 ; WX 251 ; N C39 ; B 133 466 133 700 ;
+C 40 ; WX 451 ; N C40 ; B 133 -233 366 833 ;
+C 41 ; WX 451 ; N C41 ; B 99 -233 333 833 ;
+C 42 ; WX 518 ; N C42 ; B 99 99 433 500 ;
+C 43 ; WX 851 ; N C43 ; B 133 0 733 600 ;
+C 44 ; WX 318 ; N C44 ; B 133 -133 199 66 ;
+C 45 ; WX 851 ; N C45 ; B 133 299 733 299 ;
+C 46 ; WX 318 ; N C46 ; B 133 0 199 66 ;
+C 47 ; WX 718 ; N C47 ; B 66 -233 666 833 ;
+C 48 ; WX 651 ; N C48 ; B 99 0 566 700 ;
+C 49 ; WX 651 ; N C49 ; B 199 0 366 700 ;
+C 50 ; WX 651 ; N C50 ; B 99 0 566 700 ;
+C 51 ; WX 651 ; N C51 ; B 99 0 566 700 ;
+C 52 ; WX 651 ; N C52 ; B 99 0 600 700 ;
+C 53 ; WX 651 ; N C53 ; B 99 0 566 700 ;
+C 54 ; WX 651 ; N C54 ; B 133 0 566 700 ;
+C 55 ; WX 651 ; N C55 ; B 99 0 566 700 ;
+C 56 ; WX 651 ; N C56 ; B 99 0 566 700 ;
+C 57 ; WX 651 ; N C57 ; B 99 0 532 700 ;
+C 58 ; WX 318 ; N C58 ; B 133 0 199 466 ;
+C 59 ; WX 318 ; N C59 ; B 133 -133 199 466 ;
+C 60 ; WX 784 ; N C60 ; B 133 0 666 600 ;
+C 61 ; WX 851 ; N C61 ; B 133 199 733 399 ;
+C 62 ; WX 784 ; N C62 ; B 133 0 666 600 ;
+C 63 ; WX 585 ; N C63 ; B 99 0 500 700 ;
+C 64 ; WX 884 ; N C64 ; B 99 0 799 700 ;
+C 65 ; WX 651 ; N C65 ; B 0 0 600 700 ;
+C 66 ; WX 751 ; N C66 ; B 99 0 700 700 ;
+C 67 ; WX 651 ; N C67 ; B 99 0 600 700 ;
+C 68 ; WX 751 ; N C68 ; B -33 0 700 700 ;
+C 69 ; WX 651 ; N C69 ; B 99 0 600 700 ;
+C 70 ; WX 651 ; N C70 ; B 32 0 700 700 ;
+C 71 ; WX 751 ; N C71 ; B 0 0 633 700 ;
+C 72 ; WX 784 ; N C72 ; B 32 0 799 700 ;
+C 73 ; WX 551 ; N C73 ; B 32 0 466 700 ;
+C 74 ; WX 485 ; N C74 ; B 32 -400 433 700 ;
+C 75 ; WX 784 ; N C75 ; B 32 0 799 700 ;
+C 76 ; WX 618 ; N C76 ; B 0 0 600 700 ;
+C 77 ; WX 1085 ; N C77 ; B 66 0 1100 700 ;
+C 78 ; WX 784 ; N C78 ; B 66 0 799 700 ;
+C 79 ; WX 685 ; N C79 ; B 99 0 666 700 ;
+C 80 ; WX 818 ; N C80 ; B 99 0 799 700 ;
+C 81 ; WX 718 ; N C81 ; B 0 0 633 699 ;
+C 82 ; WX 818 ; N C82 ; B 99 0 766 700 ;
+C 83 ; WX 651 ; N C83 ; B 0 0 566 700 ;
+C 84 ; WX 618 ; N C84 ; B 32 0 700 700 ;
+C 85 ; WX 784 ; N C85 ; B 66 0 799 700 ;
+C 86 ; WX 751 ; N C86 ; B 66 0 700 700 ;
+C 87 ; WX 918 ; N C87 ; B 66 0 1000 700 ;
+C 88 ; WX 784 ; N C88 ; B 32 0 766 700 ;
+C 89 ; WX 751 ; N C89 ; B 66 -400 700 700 ;
+C 90 ; WX 685 ; N C90 ; B 66 -400 600 699 ;
+C 91 ; WX 451 ; N C91 ; B 133 -233 366 833 ;
+C 92 ; WX 300 ; N C92 ; B 0 0 0 0 ;
+C 93 ; WX 451 ; N C93 ; B 99 -233 333 833 ;
+C 94 ; WX 300 ; N C94 ; B 0 0 0 0 ;
+C 95 ; WX 300 ; N C95 ; B 0 0 0 0 ;
+C 96 ; WX 318 ; N C96 ; B 133 500 199 700 ;
+C 97 ; WX 518 ; N C97 ; B 0 0 532 299 ;
+C 98 ; WX 451 ; N C98 ; B 0 0 466 700 ;
+C 99 ; WX 351 ; N C99 ; B 0 0 366 299 ;
+C 100 ; WX 518 ; N C100 ; B 0 0 532 700 ;
+C 101 ; WX 318 ; N C101 ; B 0 0 333 299 ;
+C 102 ; WX 251 ; N C102 ; B -167 -400 266 700 ;
+C 103 ; WX 485 ; N C103 ; B 0 -400 500 299 ;
+C 104 ; WX 485 ; N C104 ; B 0 0 500 700 ;
+C 105 ; WX 218 ; N C105 ; B 0 0 233 466 ;
+C 106 ; WX 218 ; N C106 ; B -266 -400 233 466 ;
+C 107 ; WX 451 ; N C107 ; B 0 0 466 700 ;
+C 108 ; WX 251 ; N C108 ; B 0 0 266 700 ;
+C 109 ; WX 818 ; N C109 ; B 0 0 833 299 ;
+C 110 ; WX 585 ; N C110 ; B 0 0 600 299 ;
+C 111 ; WX 451 ; N C111 ; B 0 0 466 299 ;
+C 112 ; WX 485 ; N C112 ; B -133 -400 500 333 ;
+C 113 ; WX 485 ; N C113 ; B 0 -400 500 299 ;
+C 114 ; WX 418 ; N C114 ; B 0 0 433 333 ;
+C 115 ; WX 351 ; N C115 ; B 0 0 366 333 ;
+C 116 ; WX 284 ; N C116 ; B 0 0 299 700 ;
+C 117 ; WX 485 ; N C117 ; B 0 0 500 299 ;
+C 118 ; WX 485 ; N C118 ; B 0 0 500 299 ;
+C 119 ; WX 685 ; N C119 ; B 0 0 700 299 ;
+C 120 ; WX 518 ; N C120 ; B 0 0 532 299 ;
+C 121 ; WX 485 ; N C121 ; B 0 -400 500 299 ;
+C 122 ; WX 451 ; N C122 ; B 0 -400 466 299 ;
+C 123 ; WX 485 ; N C123 ; B 166 -233 333 833 ;
+C 124 ; WX 251 ; N C124 ; B 133 -233 133 833 ;
+C 125 ; WX 485 ; N C125 ; B 166 -233 333 833 ;
+C 126 ; WX 451 ; N C126 ; B 99 433 366 700 ;
+EndCharMetrics
+
+EndFontMetrics
diff --git a/src/fonts/plss.gle b/src/fonts/plss.gle
new file mode 100644
index 0000000..87720f5
--- /dev/null
+++ b/src/fonts/plss.gle
@@ -0,0 +1,2068 @@
+dfont design= 1428
+dfont char=33
+amove 238 1000
+aline 238 333
+amove 238 95
+aline 190 47
+aline 238 0
+aline 285 47
+aline 238 95
+stroke
+dfont endchar
+dfont char=34
+amove 190 666
+aline 190 1000
+amove 571 1000
+aline 571 666
+stroke
+dfont endchar
+dfont char=35
+amove 142 285
+aline 809 285
+amove 857 571
+aline 190 571
+amove 523 1190
+aline 190 -334
+amove 476 -334
+aline 809 1190
+stroke
+dfont endchar
+dfont char=36
+amove 142 142
+aline 238 47
+aline 380 0
+aline 571 0
+aline 714 47
+aline 809 142
+aline 809 285
+aline 761 380
+aline 714 428
+aline 619 476
+aline 333 571
+aline 238 619
+aline 190 666
+aline 142 761
+aline 142 857
+aline 238 952
+aline 380 1000
+aline 571 1000
+aline 714 952
+aline 809 857
+amove 571 1190
+aline 571 -191
+amove 380 -191
+aline 380 1190
+stroke
+dfont endchar
+dfont char=37
+amove 142 0
+aline 1000 1000
+aline 904 952
+aline 761 904
+aline 619 904
+aline 476 952
+aline 380 1000
+aline 285 1000
+aline 190 952
+aline 142 857
+aline 142 761
+aline 238 666
+aline 333 666
+aline 428 714
+aline 476 809
+aline 476 904
+aline 380 1000
+amove 809 333
+aline 714 285
+aline 666 190
+aline 666 95
+aline 761 0
+aline 857 0
+aline 952 47
+aline 1000 142
+aline 1000 238
+aline 904 333
+aline 809 333
+stroke
+dfont endchar
+dfont char=38
+amove 1095 571
+aline 1095 619
+aline 1047 666
+aline 1000 666
+aline 952 619
+aline 904 523
+aline 809 285
+aline 714 142
+aline 619 47
+aline 523 0
+aline 333 0
+aline 238 47
+aline 190 95
+aline 142 190
+aline 142 285
+aline 190 380
+aline 238 428
+aline 571 619
+aline 619 666
+aline 666 761
+aline 666 857
+aline 619 952
+aline 523 1000
+aline 428 952
+aline 380 857
+aline 380 761
+aline 428 619
+aline 523 476
+aline 761 142
+aline 857 47
+aline 952 0
+aline 1047 0
+aline 1095 47
+aline 1095 95
+stroke
+dfont endchar
+dfont char=39
+amove 190 1000
+aline 190 666
+stroke
+dfont endchar
+dfont char=40
+amove 523 1190
+aline 428 1095
+aline 333 952
+aline 238 761
+aline 190 523
+aline 190 333
+aline 238 95
+aline 333 -96
+aline 428 -239
+aline 523 -334
+stroke
+dfont endchar
+dfont char=41
+amove 142 -334
+aline 238 -239
+aline 333 -96
+aline 428 95
+aline 476 333
+aline 476 523
+aline 428 761
+aline 333 952
+aline 238 1095
+aline 142 1190
+stroke
+dfont endchar
+dfont char=42
+amove 142 285
+aline 619 571
+amove 380 714
+aline 380 142
+amove 619 285
+aline 142 571
+stroke
+dfont endchar
+dfont char=43
+amove 190 428
+aline 1047 428
+amove 619 857
+aline 619 0
+stroke
+dfont endchar
+dfont char=44
+amove 190 -191
+aline 238 -143
+aline 285 -48
+aline 285 47
+aline 238 95
+aline 190 47
+aline 238 0
+aline 285 47
+stroke
+dfont endchar
+dfont char=45
+amove 190 428
+aline 1047 428
+stroke
+dfont endchar
+dfont char=46
+amove 238 95
+aline 190 47
+aline 238 0
+aline 285 47
+aline 238 95
+stroke
+dfont endchar
+dfont char=47
+amove 95 -334
+aline 952 1190
+stroke
+dfont endchar
+dfont char=48
+amove 428 1000
+aline 285 952
+aline 190 809
+aline 142 571
+aline 142 428
+aline 190 190
+aline 285 47
+aline 428 0
+aline 523 0
+aline 666 47
+aline 761 190
+aline 809 428
+aline 809 571
+aline 761 809
+aline 666 952
+aline 523 1000
+aline 428 1000
+stroke
+dfont endchar
+dfont char=49
+amove 285 809
+aline 380 857
+aline 523 1000
+aline 523 0
+stroke
+dfont endchar
+dfont char=50
+amove 190 761
+aline 190 809
+aline 238 904
+aline 285 952
+aline 380 1000
+aline 571 1000
+aline 666 952
+aline 714 904
+aline 761 809
+aline 761 714
+aline 714 619
+aline 619 476
+aline 142 0
+aline 809 0
+stroke
+dfont endchar
+dfont char=51
+amove 142 190
+aline 190 95
+aline 238 47
+aline 380 0
+aline 523 0
+aline 666 47
+aline 761 142
+aline 809 285
+aline 809 380
+aline 761 523
+aline 714 571
+aline 619 619
+aline 476 619
+aline 761 1000
+aline 238 1000
+stroke
+dfont endchar
+dfont char=52
+amove 619 0
+aline 619 1000
+aline 142 333
+aline 857 333
+stroke
+dfont endchar
+dfont char=53
+amove 142 190
+aline 190 95
+aline 238 47
+aline 380 0
+aline 523 0
+aline 666 47
+aline 761 142
+aline 809 285
+aline 809 380
+aline 761 523
+aline 666 619
+aline 523 666
+aline 380 666
+aline 238 619
+aline 190 571
+aline 238 1000
+aline 714 1000
+stroke
+dfont endchar
+dfont char=54
+amove 190 333
+aline 238 476
+aline 333 571
+aline 476 619
+aline 523 619
+aline 666 571
+aline 761 476
+aline 809 333
+aline 809 285
+aline 761 142
+aline 666 47
+aline 523 -1
+aline 476 -1
+aline 333 47
+aline 238 142
+aline 190 333
+aline 190 571
+aline 238 809
+aline 333 952
+aline 476 1000
+aline 571 1000
+aline 714 952
+aline 761 857
+stroke
+dfont endchar
+dfont char=55
+amove 333 0
+aline 809 1000
+aline 142 1000
+stroke
+dfont endchar
+dfont char=56
+amove 380 1000
+aline 238 952
+aline 190 857
+aline 190 761
+aline 238 666
+aline 333 619
+aline 523 571
+aline 666 523
+aline 761 428
+aline 809 333
+aline 809 190
+aline 761 95
+aline 714 47
+aline 571 -1
+aline 380 -1
+aline 238 47
+aline 190 95
+aline 142 190
+aline 142 333
+aline 190 428
+aline 285 523
+aline 428 571
+aline 619 619
+aline 714 666
+aline 761 761
+aline 761 857
+aline 714 952
+aline 571 1000
+aline 380 1000
+stroke
+dfont endchar
+dfont char=57
+amove 190 142
+aline 238 47
+aline 380 0
+aline 476 0
+aline 619 47
+aline 714 190
+aline 761 428
+aline 761 666
+aline 714 857
+aline 619 952
+aline 476 1000
+aline 428 1000
+aline 285 952
+aline 190 857
+aline 142 714
+aline 142 666
+aline 190 523
+aline 285 428
+aline 428 380
+aline 476 380
+aline 619 428
+aline 714 523
+aline 761 666
+stroke
+dfont endchar
+dfont char=58
+amove 238 666
+aline 190 619
+aline 238 571
+aline 285 619
+aline 238 666
+amove 238 95
+aline 190 47
+aline 238 -1
+aline 285 47
+aline 238 95
+stroke
+dfont endchar
+dfont char=59
+amove 190 -191
+aline 238 -143
+aline 285 -48
+aline 285 47
+aline 238 95
+aline 190 47
+aline 238 0
+aline 285 47
+amove 238 666
+aline 190 619
+aline 238 571
+aline 285 619
+aline 238 666
+stroke
+dfont endchar
+dfont char=60
+amove 952 857
+aline 190 428
+aline 952 0
+stroke
+dfont endchar
+dfont char=61
+amove 190 285
+aline 1047 285
+amove 1047 571
+aline 190 571
+stroke
+dfont endchar
+dfont char=62
+amove 190 0
+aline 952 428
+aline 190 857
+stroke
+dfont endchar
+dfont char=63
+amove 142 761
+aline 142 809
+aline 190 904
+aline 238 952
+aline 333 1000
+aline 523 1000
+aline 619 952
+aline 666 904
+aline 714 809
+aline 714 714
+aline 666 619
+aline 619 571
+aline 428 476
+aline 428 333
+amove 428 95
+aline 380 47
+aline 428 -1
+aline 476 47
+aline 428 95
+stroke
+dfont endchar
+dfont char=64
+amove 523 238
+aline 476 285
+aline 428 380
+aline 428 523
+aline 476 666
+aline 571 761
+amove 857 761
+aline 809 380
+aline 809 285
+aline 904 238
+aline 999 238
+aline 1095 333
+aline 1142 476
+aline 1142 571
+aline 1095 714
+aline 1047 809
+aline 952 904
+aline 857 952
+aline 714 1000
+aline 571 1000
+aline 428 952
+aline 333 904
+aline 238 809
+aline 190 714
+aline 142 571
+aline 142 428
+aline 190 285
+aline 238 190
+aline 333 95
+aline 428 47
+aline 571 0
+aline 714 0
+aline 857 47
+aline 952 95
+aline 1000 142
+amove 904 238
+aline 857 285
+aline 857 380
+aline 904 761
+amove 857 619
+aline 809 714
+aline 714 761
+aline 571 761
+aline 476 714
+aline 428 666
+aline 380 523
+aline 380 380
+aline 428 285
+aline 523 238
+aline 666 238
+aline 761 285
+aline 809 380
+stroke
+dfont endchar
+dfont char=65
+amove 0 0
+aline 95 47
+aline 238 190
+aline 380 380
+aline 571 714
+aline 714 1000
+aline 714 0
+aline 666 142
+aline 571 285
+aline 476 380
+aline 333 476
+aline 238 476
+aline 190 428
+aline 190 333
+aline 238 238
+aline 333 142
+aline 476 47
+aline 619 0
+aline 857 0
+stroke
+dfont endchar
+dfont char=66
+amove 428 142
+aline 476 47
+aline 571 0
+aline 714 0
+aline 809 47
+aline 857 95
+aline 904 190
+aline 904 333
+aline 857 428
+aline 809 476
+aline 666 523
+aline 619 523
+amove 666 523
+aline 809 571
+aline 904 619
+aline 952 666
+aline 1000 761
+aline 1000 857
+aline 952 952
+aline 857 1000
+aline 714 1000
+aline 571 952
+aline 476 904
+aline 380 809
+aline 285 666
+aline 238 571
+aline 190 428
+aline 142 190
+aline 142 47
+aline 190 0
+aline 238 0
+aline 333 47
+aline 428 142
+aline 523 285
+aline 571 380
+aline 619 523
+aline 666 714
+aline 666 857
+aline 619 904
+stroke
+dfont endchar
+dfont char=67
+amove 571 714
+aline 571 666
+aline 619 619
+aline 714 619
+aline 809 666
+aline 857 761
+aline 857 857
+aline 809 952
+aline 714 1000
+aline 571 1000
+aline 428 952
+aline 333 857
+aline 238 714
+aline 190 619
+aline 142 428
+aline 142 238
+aline 190 95
+aline 238 47
+aline 333 0
+aline 428 0
+aline 571 47
+aline 666 142
+aline 714 238
+stroke
+dfont endchar
+dfont char=68
+amove 619 1000
+aline 523 952
+aline 476 857
+aline 428 666
+aline 380 380
+aline 333 238
+aline 285 142
+aline 190 47
+aline 95 -1
+aline 0 -1
+aline -48 47
+aline -48 142
+aline 0 190
+aline 95 190
+aline 190 142
+aline 285 47
+aline 428 -1
+aline 571 -1
+aline 714 47
+aline 809 142
+aline 904 333
+aline 952 571
+aline 952 761
+aline 904 904
+aline 857 952
+aline 761 1000
+aline 619 1000
+aline 523 904
+aline 523 809
+aline 571 666
+aline 666 523
+aline 761 428
+aline 904 333
+aline 1000 285
+stroke
+dfont endchar
+dfont char=69
+amove 666 809
+aline 666 761
+aline 714 714
+aline 809 714
+aline 857 761
+aline 857 857
+aline 809 952
+aline 666 1000
+aline 476 1000
+aline 333 952
+aline 285 857
+aline 285 714
+aline 333 619
+aline 380 571
+aline 523 523
+aline 380 523
+aline 238 476
+aline 190 428
+aline 142 333
+aline 142 190
+aline 190 95
+aline 238 47
+aline 380 -1
+aline 523 -1
+aline 666 47
+aline 761 142
+aline 809 238
+stroke
+dfont endchar
+dfont char=70
+amove 285 238
+aline 190 285
+aline 95 285
+aline 47 238
+aline 47 142
+aline 95 47
+aline 190 -1
+aline 285 -1
+aline 380 47
+aline 476 142
+aline 571 333
+aline 666 619
+aline 761 952
+amove 1000 1000
+aline 904 952
+aline 761 952
+aline 571 1000
+aline 428 1000
+aline 285 952
+aline 238 857
+aline 285 761
+aline 380 714
+aline 476 714
+amove 428 523
+aline 857 523
+stroke
+dfont endchar
+dfont char=71
+amove 0 0
+aline 95 47
+aline 285 238
+aline 428 476
+aline 476 619
+aline 523 809
+aline 523 952
+aline 476 1000
+aline 428 1000
+aline 380 952
+aline 333 857
+aline 333 714
+aline 380 619
+aline 476 571
+aline 666 571
+aline 809 619
+aline 857 666
+aline 904 761
+aline 904 476
+aline 857 238
+aline 809 142
+aline 714 47
+aline 571 0
+aline 380 0
+aline 238 47
+aline 142 142
+aline 95 238
+aline 95 333
+stroke
+dfont endchar
+dfont char=72
+amove 47 142
+aline 47 47
+aline 95 0
+aline 190 0
+aline 285 95
+aline 380 285
+aline 476 571
+aline 523 761
+aline 523 857
+aline 476 952
+aline 380 1000
+aline 333 1000
+aline 238 952
+aline 190 857
+aline 190 809
+aline 238 714
+aline 333 666
+amove 333 428
+aline 761 571
+aline 857 619
+aline 1000 714
+aline 1095 809
+aline 1142 904
+aline 1142 952
+aline 1095 1000
+aline 1047 1000
+aline 952 904
+aline 857 714
+aline 761 428
+aline 714 190
+aline 714 47
+aline 761 0
+aline 809 0
+aline 904 47
+aline 952 95
+aline 1047 238
+stroke
+dfont endchar
+dfont char=73
+amove 285 238
+aline 190 285
+aline 95 285
+aline 47 238
+aline 47 142
+aline 95 47
+aline 190 -1
+aline 285 -1
+aline 380 47
+aline 476 142
+aline 523 238
+aline 619 476
+aline 666 714
+aline 666 857
+aline 619 952
+aline 571 1000
+aline 476 1000
+aline 428 952
+aline 380 857
+aline 380 714
+aline 428 571
+aline 476 476
+aline 571 333
+aline 666 238
+stroke
+dfont endchar
+dfont char=74
+amove 476 -143
+aline 380 -1
+aline 285 238
+aline 238 523
+aline 238 809
+aline 285 952
+aline 380 1000
+aline 476 1000
+aline 523 952
+aline 571 809
+aline 571 666
+aline 523 428
+aline 380 -1
+aline 285 -286
+aline 238 -429
+aline 190 -524
+aline 95 -572
+aline 47 -524
+aline 47 -429
+aline 95 -286
+aline 190 -143
+aline 285 -48
+aline 428 47
+aline 619 142
+stroke
+dfont endchar
+dfont char=75
+amove 47 142
+aline 47 47
+aline 95 0
+aline 190 0
+aline 285 95
+aline 380 285
+aline 476 571
+aline 523 761
+aline 523 857
+aline 476 952
+aline 380 1000
+aline 333 1000
+aline 238 952
+aline 190 857
+aline 190 809
+aline 238 714
+aline 333 666
+amove 476 571
+aline 571 571
+aline 666 619
+aline 761 714
+aline 857 857
+aline 952 952
+aline 1047 1000
+aline 1095 1000
+aline 1142 952
+aline 1142 857
+amove 1000 238
+aline 904 95
+aline 857 47
+aline 761 -1
+aline 714 -1
+aline 666 47
+aline 619 142
+aline 619 476
+aline 571 571
+stroke
+dfont endchar
+dfont char=76
+amove 190 428
+aline 285 428
+aline 476 476
+aline 619 571
+aline 714 666
+aline 761 761
+aline 761 904
+aline 714 1000
+aline 619 1000
+aline 571 952
+aline 523 857
+aline 476 619
+aline 428 380
+aline 380 238
+aline 333 142
+aline 238 47
+aline 142 0
+aline 47 0
+aline 0 47
+aline 0 142
+aline 47 190
+aline 142 190
+aline 238 142
+aline 380 47
+aline 523 0
+aline 619 0
+aline 761 47
+aline 857 142
+stroke
+dfont endchar
+dfont char=77
+amove 238 0
+aline 333 333
+aline 380 523
+aline 428 761
+aline 428 857
+aline 380 952
+aline 285 1000
+aline 238 1000
+aline 142 952
+aline 95 857
+aline 95 809
+aline 142 714
+aline 238 666
+amove 333 333
+aline 476 714
+aline 571 904
+aline 619 952
+aline 714 1000
+aline 761 1000
+aline 857 952
+aline 904 857
+aline 904 761
+aline 857 523
+aline 809 333
+aline 714 0
+amove 809 333
+aline 952 714
+aline 1047 904
+aline 1095 952
+aline 1190 1000
+aline 1238 1000
+aline 1333 952
+aline 1380 857
+aline 1380 761
+aline 1333 523
+aline 1238 190
+aline 1238 47
+aline 1285 0
+aline 1333 0
+aline 1428 47
+aline 1476 95
+aline 1571 238
+stroke
+dfont endchar
+dfont char=78
+amove 238 0
+aline 333 333
+aline 380 523
+aline 428 761
+aline 428 857
+aline 380 952
+aline 285 1000
+aline 238 1000
+aline 142 952
+aline 95 857
+aline 95 809
+aline 142 714
+aline 238 666
+amove 333 333
+aline 476 714
+aline 571 904
+aline 619 952
+aline 714 1000
+aline 809 1000
+aline 904 952
+aline 952 857
+aline 952 761
+aline 904 523
+aline 809 190
+aline 809 47
+aline 857 0
+aline 904 0
+aline 1000 47
+aline 1047 95
+aline 1142 238
+stroke
+dfont endchar
+dfont char=79
+amove 571 1000
+aline 428 952
+aline 333 857
+aline 238 714
+aline 190 619
+aline 142 428
+aline 142 238
+aline 190 95
+aline 238 47
+aline 333 0
+aline 428 0
+aline 571 47
+aline 666 142
+aline 761 285
+aline 809 380
+aline 857 571
+aline 857 761
+aline 809 904
+aline 761 952
+aline 666 1000
+aline 571 1000
+aline 476 904
+aline 476 761
+aline 523 619
+aline 619 476
+aline 714 380
+aline 857 285
+aline 952 238
+stroke
+dfont endchar
+dfont char=80
+amove 619 904
+aline 666 857
+aline 666 714
+aline 619 523
+aline 571 380
+aline 523 285
+aline 428 142
+aline 333 47
+aline 238 0
+aline 190 0
+aline 142 47
+aline 142 190
+aline 190 428
+aline 238 571
+aline 285 666
+aline 380 809
+aline 476 904
+aline 571 952
+aline 714 1000
+aline 952 1000
+aline 1047 952
+aline 1095 904
+aline 1142 809
+aline 1142 666
+aline 1095 571
+aline 1047 523
+aline 952 476
+aline 809 476
+aline 714 523
+aline 666 571
+stroke
+dfont endchar
+dfont char=81
+amove 619 714
+aline 571 619
+aline 523 571
+aline 428 523
+aline 333 523
+aline 285 619
+aline 285 714
+aline 333 857
+aline 428 952
+aline 571 999
+aline 714 999
+aline 809 952
+aline 857 857
+aline 857 666
+aline 809 523
+aline 714 380
+aline 523 190
+aline 380 95
+aline 285 47
+aline 142 -1
+aline 47 -1
+aline 0 47
+aline 0 142
+aline 47 190
+aline 142 190
+aline 238 142
+aline 380 47
+aline 523 -1
+aline 666 -1
+aline 809 47
+aline 904 142
+stroke
+dfont endchar
+dfont char=82
+amove 619 904
+aline 666 857
+aline 666 714
+aline 619 523
+aline 571 380
+aline 523 285
+aline 428 142
+aline 333 47
+aline 238 0
+aline 190 0
+aline 142 47
+aline 142 190
+aline 190 428
+aline 238 571
+aline 285 666
+aline 380 809
+aline 476 904
+aline 571 952
+aline 714 1000
+aline 904 1000
+aline 1000 952
+aline 1047 904
+aline 1095 809
+aline 1095 666
+aline 1047 571
+aline 1000 523
+aline 904 476
+aline 761 476
+aline 619 523
+aline 666 476
+aline 714 380
+aline 714 142
+aline 761 47
+aline 857 0
+aline 952 47
+aline 1000 95
+aline 1095 238
+stroke
+dfont endchar
+dfont char=83
+amove 0 0
+aline 95 47
+aline 190 142
+aline 333 333
+aline 428 476
+aline 523 666
+aline 571 809
+aline 571 952
+aline 523 1000
+aline 476 1000
+aline 428 952
+aline 380 857
+aline 380 761
+aline 428 666
+aline 523 571
+aline 666 476
+aline 761 380
+aline 809 285
+aline 809 190
+aline 761 95
+aline 714 47
+aline 571 0
+aline 380 0
+aline 238 47
+aline 142 142
+aline 95 238
+aline 95 333
+stroke
+dfont endchar
+dfont char=84
+amove 285 238
+aline 190 285
+aline 95 285
+aline 47 238
+aline 47 142
+aline 95 47
+aline 190 -1
+aline 285 -1
+aline 380 47
+aline 476 142
+aline 571 333
+aline 666 619
+aline 761 952
+amove 1000 1000
+aline 904 952
+aline 761 952
+aline 571 1000
+aline 428 1000
+aline 285 952
+aline 238 857
+aline 285 761
+aline 380 714
+aline 476 714
+stroke
+dfont endchar
+dfont char=85
+amove 238 666
+aline 142 714
+aline 95 809
+aline 95 857
+aline 142 952
+aline 238 1000
+aline 285 1000
+aline 380 952
+aline 428 857
+aline 428 761
+aline 380 571
+aline 333 428
+aline 285 238
+aline 285 142
+aline 333 47
+aline 428 0
+aline 523 0
+aline 619 47
+aline 666 95
+aline 761 285
+aline 904 666
+aline 1000 1000
+amove 904 666
+aline 857 476
+aline 809 190
+aline 809 47
+aline 857 0
+aline 904 0
+aline 1000 47
+aline 1047 95
+aline 1142 238
+stroke
+dfont endchar
+dfont char=86
+amove 238 666
+aline 142 714
+aline 95 809
+aline 95 857
+aline 142 952
+aline 238 1000
+aline 285 1000
+aline 380 952
+aline 428 857
+aline 428 761
+aline 380 571
+aline 333 428
+aline 285 238
+aline 285 95
+aline 333 0
+aline 428 0
+aline 523 47
+aline 666 190
+aline 761 333
+aline 857 523
+aline 904 666
+aline 952 857
+aline 952 952
+aline 904 1000
+aline 857 1000
+aline 809 952
+aline 761 857
+aline 761 761
+aline 809 619
+aline 904 523
+aline 1000 476
+stroke
+dfont endchar
+dfont char=87
+amove 380 0
+aline 428 714
+aline 428 857
+aline 380 952
+aline 285 1000
+aline 238 1000
+aline 142 952
+aline 95 857
+aline 95 809
+aline 142 714
+aline 238 666
+amove 380 0
+aline 857 1000
+aline 761 0
+aline 904 333
+aline 1047 619
+aline 1190 809
+aline 1333 952
+aline 1428 1000
+stroke
+dfont endchar
+dfont char=88
+amove 47 142
+aline 47 47
+aline 95 0
+aline 190 0
+aline 285 47
+aline 380 142
+aline 476 285
+aline 666 714
+aline 761 857
+aline 857 952
+aline 952 1000
+aline 1047 1000
+aline 1095 952
+aline 1095 857
+amove 761 285
+aline 857 285
+aline 904 238
+aline 904 142
+aline 857 47
+aline 761 0
+aline 666 0
+aline 571 47
+aline 523 142
+aline 523 285
+aline 619 714
+aline 619 857
+aline 571 952
+aline 476 1000
+aline 380 1000
+aline 285 952
+aline 238 857
+aline 238 761
+aline 285 714
+aline 380 714
+stroke
+dfont endchar
+dfont char=89
+amove 238 666
+aline 142 714
+aline 95 809
+aline 95 857
+aline 142 952
+aline 238 1000
+aline 285 1000
+aline 380 952
+aline 428 857
+aline 428 761
+aline 380 571
+aline 333 428
+aline 285 238
+aline 285 142
+aline 333 47
+aline 380 0
+aline 476 0
+aline 571 47
+aline 666 142
+aline 761 285
+aline 809 380
+aline 904 666
+amove 1000 1000
+aline 904 666
+aline 761 190
+aline 666 -96
+aline 571 -334
+aline 476 -524
+aline 380 -572
+aline 333 -524
+aline 333 -429
+aline 380 -286
+aline 476 -143
+aline 619 0
+aline 761 95
+aline 1000 238
+stroke
+dfont endchar
+dfont char=90
+amove 619 714
+aline 571 619
+aline 523 571
+aline 428 523
+aline 333 523
+aline 285 619
+aline 285 714
+aline 333 857
+aline 428 952
+aline 571 999
+aline 714 999
+aline 809 952
+aline 857 857
+aline 857 666
+aline 809 523
+aline 714 333
+aline 571 190
+aline 380 47
+aline 285 -1
+aline 142 -1
+aline 95 47
+aline 95 142
+aline 142 190
+aline 285 190
+aline 380 142
+aline 428 95
+aline 476 -1
+aline 476 -143
+aline 428 -286
+aline 380 -381
+aline 285 -524
+aline 190 -572
+aline 142 -524
+aline 142 -429
+aline 190 -286
+aline 285 -143
+aline 428 -1
+aline 571 95
+aline 857 238
+stroke
+dfont endchar
+dfont char=91
+amove 190 -334
+aline 190 1190
+aline 523 1190
+amove 238 1190
+aline 238 -334
+amove 190 -334
+aline 523 -334
+stroke
+dfont endchar
+stroke
+dfont endchar
+dfont char=93
+amove 142 -334
+aline 476 -334
+aline 476 1190
+aline 142 1190
+amove 428 1190
+aline 428 -334
+stroke
+dfont endchar
+stroke
+dfont endchar
+stroke
+dfont endchar
+dfont char=96
+amove 238 904
+aline 285 952
+aline 238 1000
+aline 190 952
+aline 190 857
+aline 238 761
+aline 285 714
+stroke
+dfont endchar
+dfont char=97
+amove 428 285
+aline 380 380
+aline 285 428
+aline 190 428
+aline 95 380
+aline 47 333
+aline 0 238
+aline 0 142
+aline 47 47
+aline 142 0
+aline 238 0
+aline 333 47
+aline 380 142
+aline 476 428
+aline 428 190
+aline 428 47
+aline 476 0
+aline 523 0
+aline 619 47
+aline 666 95
+aline 761 238
+stroke
+dfont endchar
+dfont char=98
+amove 0 238
+aline 95 380
+aline 238 619
+aline 285 714
+aline 333 857
+aline 333 952
+aline 285 1000
+aline 190 952
+aline 142 857
+aline 95 666
+aline 47 333
+aline 47 47
+aline 95 -1
+aline 142 -1
+aline 238 47
+aline 333 142
+aline 380 285
+aline 380 428
+aline 428 238
+aline 476 190
+aline 571 190
+aline 666 238
+stroke
+dfont endchar
+dfont char=99
+amove 333 333
+aline 333 380
+aline 285 428
+aline 190 428
+aline 95 380
+aline 47 333
+aline 0 238
+aline 0 142
+aline 47 47
+aline 142 0
+aline 285 0
+aline 428 95
+aline 523 238
+stroke
+dfont endchar
+dfont char=100
+amove 428 285
+aline 380 380
+aline 285 428
+aline 190 428
+aline 95 380
+aline 47 333
+aline 0 238
+aline 0 142
+aline 47 47
+aline 142 0
+aline 238 0
+aline 333 47
+aline 380 142
+aline 666 1000
+amove 476 428
+aline 428 190
+aline 428 47
+aline 476 0
+aline 523 0
+aline 619 47
+aline 666 95
+aline 761 238
+stroke
+dfont endchar
+dfont char=101
+amove 47 95
+aline 142 142
+aline 190 190
+aline 238 285
+aline 238 380
+aline 190 428
+aline 142 428
+aline 47 380
+aline 0 285
+aline 0 142
+aline 47 47
+aline 142 0
+aline 238 0
+aline 333 47
+aline 380 95
+aline 476 238
+stroke
+dfont endchar
+dfont char=102
+amove 0 238
+aline 190 476
+aline 285 619
+aline 333 714
+aline 380 857
+aline 380 952
+aline 333 1000
+aline 238 952
+aline 190 857
+aline 95 476
+aline -48 47
+aline -191 -286
+aline -239 -429
+aline -239 -524
+aline -191 -572
+aline -96 -524
+aline -48 -381
+aline 0 47
+aline 47 -1
+aline 142 -1
+aline 238 47
+aline 285 95
+aline 380 238
+stroke
+dfont endchar
+dfont char=103
+amove 380 95
+aline 333 47
+aline 238 0
+aline 142 0
+aline 47 47
+aline -1 142
+aline -1 238
+aline 47 333
+aline 95 380
+aline 190 428
+aline 285 428
+aline 380 380
+aline 428 285
+amove 476 428
+aline 380 95
+aline 190 -429
+aline 142 -524
+aline 47 -572
+aline 0 -524
+aline 0 -429
+aline 47 -286
+aline 190 -143
+aline 333 -48
+aline 428 0
+aline 571 95
+aline 714 238
+stroke
+dfont endchar
+dfont char=104
+amove 0 238
+aline 95 380
+aline 238 619
+aline 285 714
+aline 333 857
+aline 333 952
+aline 285 1000
+aline 190 952
+aline 142 857
+aline 95 666
+aline 47 380
+aline 0 -1
+aline 47 142
+aline 95 238
+aline 190 380
+aline 285 428
+aline 380 428
+aline 428 380
+aline 428 285
+aline 380 142
+aline 380 47
+aline 428 -1
+aline 476 -1
+aline 571 47
+aline 619 95
+aline 714 238
+stroke
+dfont endchar
+dfont char=105
+amove 142 666
+aline 142 619
+aline 190 619
+aline 190 666
+aline 142 666
+amove 0 238
+aline 95 428
+aline 0 142
+aline 0 47
+aline 47 0
+aline 95 0
+aline 190 47
+aline 238 95
+aline 333 238
+stroke
+dfont endchar
+dfont char=106
+amove 142 666
+aline 142 619
+aline 190 619
+aline 190 666
+aline 142 666
+amove 0 238
+aline 95 428
+aline -191 -429
+aline -239 -524
+aline -334 -572
+aline -381 -524
+aline -381 -429
+aline -334 -286
+aline -191 -143
+aline -48 -48
+aline 47 0
+aline 190 95
+aline 333 238
+stroke
+dfont endchar
+dfont char=107
+amove 0 238
+aline 95 380
+aline 238 619
+aline 285 714
+aline 333 857
+aline 333 952
+aline 285 1000
+aline 190 952
+aline 142 857
+aline 95 666
+aline 47 380
+aline 0 -1
+aline 47 142
+aline 95 238
+aline 190 380
+aline 285 428
+aline 380 428
+aline 428 380
+aline 428 285
+aline 333 238
+aline 190 238
+aline 285 190
+aline 333 47
+aline 380 -1
+aline 428 -1
+aline 523 47
+aline 571 95
+aline 666 238
+stroke
+dfont endchar
+dfont char=108
+amove 0 238
+aline 95 380
+aline 238 619
+aline 285 714
+aline 333 857
+aline 333 952
+aline 285 1000
+aline 190 952
+aline 142 857
+aline 95 666
+aline 47 333
+aline 47 47
+aline 95 -1
+aline 142 -1
+aline 238 47
+aline 285 95
+aline 380 238
+stroke
+dfont endchar
+dfont char=109
+amove 142 0
+aline 190 142
+aline 238 333
+aline 238 380
+aline 190 428
+aline 95 380
+aline 0 238
+amove 190 142
+aline 238 238
+aline 333 380
+aline 428 428
+aline 523 428
+aline 571 380
+aline 571 333
+aline 523 142
+aline 476 0
+amove 523 142
+aline 571 238
+aline 666 380
+aline 761 428
+aline 857 428
+aline 904 380
+aline 904 285
+aline 857 142
+aline 857 47
+aline 904 0
+aline 952 0
+aline 1047 47
+aline 1095 95
+aline 1190 238
+stroke
+dfont endchar
+dfont char=110
+amove 142 0
+aline 190 142
+aline 238 333
+aline 238 380
+aline 190 428
+aline 95 380
+aline 0 238
+amove 190 142
+aline 238 238
+aline 333 380
+aline 428 428
+aline 523 428
+aline 571 380
+aline 571 285
+aline 523 142
+aline 523 47
+aline 571 0
+aline 619 0
+aline 714 47
+aline 761 95
+aline 857 238
+stroke
+dfont endchar
+dfont char=111
+amove 285 428
+aline 190 428
+aline 95 380
+aline 47 333
+aline 0 238
+aline 0 142
+aline 47 47
+aline 142 -1
+aline 238 -1
+aline 333 47
+aline 380 95
+aline 428 190
+aline 428 285
+aline 380 380
+aline 285 428
+aline 238 380
+aline 238 285
+aline 285 190
+aline 380 142
+aline 523 142
+aline 619 190
+aline 666 238
+stroke
+dfont endchar
+dfont char=112
+amove 0 238
+aline 95 380
+aline 142 476
+aline 95 285
+aline -191 -572
+amove 95 285
+aline 142 380
+aline 238 428
+aline 333 428
+aline 428 380
+aline 476 285
+aline 476 190
+aline 428 95
+aline 380 47
+aline 285 0
+amove 95 47
+aline 190 0
+aline 333 0
+aline 476 47
+aline 571 95
+aline 714 238
+stroke
+dfont endchar
+dfont char=113
+amove 333 47
+aline 238 0
+aline 142 0
+aline 47 47
+aline 0 142
+aline 0 238
+aline 47 333
+aline 95 380
+aline 190 428
+aline 285 428
+aline 380 380
+aline 428 285
+amove 476 428
+aline 428 285
+aline 333 47
+aline 190 -286
+aline 142 -429
+aline 142 -524
+aline 190 -572
+aline 285 -524
+aline 333 -381
+aline 333 -48
+aline 428 0
+aline 571 95
+aline 714 238
+stroke
+dfont endchar
+dfont char=114
+amove 0 238
+aline 95 380
+aline 142 476
+aline 142 380
+aline 285 380
+aline 333 333
+aline 333 238
+aline 285 95
+aline 285 47
+aline 333 -1
+aline 380 -1
+aline 476 47
+aline 523 95
+aline 619 238
+stroke
+dfont endchar
+dfont char=115
+amove 0 238
+aline 95 380
+aline 142 476
+aline 142 380
+aline 238 238
+aline 285 142
+aline 285 47
+aline 190 -1
+amove 0 47
+aline 95 -1
+aline 285 -1
+aline 380 47
+aline 428 95
+aline 523 238
+stroke
+dfont endchar
+dfont char=116
+amove 0 238
+aline 95 380
+aline 190 571
+amove 47 619
+aline 380 619
+amove 333 1000
+aline 47 142
+aline 47 47
+aline 95 0
+aline 190 0
+aline 285 47
+aline 333 95
+aline 428 238
+stroke
+dfont endchar
+dfont char=117
+amove 0 238
+aline 95 428
+aline 0 142
+aline 0 47
+aline 47 0
+aline 142 0
+aline 238 47
+aline 333 142
+aline 428 285
+amove 476 428
+aline 380 142
+aline 380 47
+aline 428 0
+aline 476 0
+aline 571 47
+aline 619 95
+aline 714 238
+stroke
+dfont endchar
+dfont char=118
+amove 0 238
+aline 95 428
+aline 47 190
+aline 47 47
+aline 95 0
+aline 142 0
+aline 285 47
+aline 380 142
+aline 428 285
+aline 428 428
+aline 476 238
+aline 523 190
+aline 619 190
+aline 714 238
+stroke
+dfont endchar
+dfont char=119
+amove 333 142
+aline 238 47
+aline 142 0
+aline 47 0
+aline 0 95
+aline 0 190
+aline 47 333
+aline 142 428
+amove 428 428
+aline 333 142
+aline 333 47
+aline 380 0
+aline 476 0
+aline 571 47
+aline 666 142
+aline 714 285
+aline 714 428
+aline 761 238
+aline 809 190
+aline 904 190
+aline 1000 238
+stroke
+dfont endchar
+dfont char=120
+amove 47 47
+aline 95 0
+aline 190 0
+aline 238 47
+aline 428 380
+aline 476 428
+aline 571 428
+aline 619 380
+amove 761 238
+aline 666 95
+aline 523 0
+aline 380 0
+aline 333 47
+aline 333 380
+aline 285 428
+aline 190 428
+aline 95 380
+aline 0 238
+stroke
+dfont endchar
+dfont char=121
+amove 0 238
+aline 95 428
+aline 0 142
+aline 0 47
+aline 47 0
+aline 142 0
+aline 238 47
+aline 333 142
+aline 428 285
+amove 476 428
+aline 190 -429
+aline 142 -524
+aline 47 -572
+aline 0 -524
+aline 0 -429
+aline 47 -286
+aline 190 -143
+aline 333 -48
+aline 428 0
+aline 571 95
+aline 714 238
+stroke
+dfont endchar
+dfont char=122
+amove 0 238
+aline 95 380
+aline 190 428
+aline 285 428
+aline 380 333
+aline 380 238
+aline 333 142
+aline 238 47
+aline 95 0
+aline 190 -48
+aline 238 -143
+aline 238 -286
+aline 190 -429
+aline 142 -524
+aline 47 -572
+aline 0 -524
+aline 0 -429
+aline 47 -286
+aline 190 -143
+aline 333 -48
+aline 523 95
+aline 666 238
+stroke
+dfont endchar
+dfont char=123
+amove 380 238
+aline 333 95
+aline 333 -96
+aline 380 -239
+amove 476 -334
+aline 333 -191
+aline 285 -48
+aline 285 47
+aline 333 190
+aline 428 285
+aline 428 333
+aline 238 428
+aline 428 523
+aline 428 571
+aline 333 666
+aline 285 809
+aline 285 904
+aline 333 1047
+aline 476 1190
+amove 380 1095
+aline 333 952
+aline 333 761
+aline 380 619
+stroke
+dfont endchar
+dfont char=124
+amove 190 1190
+aline 190 -334
+stroke
+dfont endchar
+dfont char=125
+amove 238 -334
+aline 380 -191
+aline 428 -48
+aline 428 47
+aline 380 190
+aline 285 285
+aline 285 333
+aline 476 428
+aline 285 523
+aline 285 571
+aline 380 666
+aline 428 809
+aline 428 904
+aline 380 1047
+aline 238 1190
+amove 333 1095
+aline 380 952
+aline 380 761
+aline 333 619
+amove 333 238
+aline 380 95
+aline 380 -96
+aline 333 -239
+stroke
+dfont endchar
+dfont char=126
+amove 285 1000
+aline 190 952
+aline 142 857
+aline 142 761
+aline 190 666
+aline 285 619
+aline 380 619
+aline 476 666
+aline 523 761
+aline 523 857
+aline 476 952
+aline 380 1000
+aline 285 1000
+stroke
+dfont endchar
diff --git a/src/fonts/plsym1.afm b/src/fonts/plsym1.afm
new file mode 100644
index 0000000..745842c
--- /dev/null
+++ b/src/fonts/plsym1.afm
@@ -0,0 +1,174 @@
+StartFontMetrics 2.0
+Comment Made from HERSHEY font file using SPLITFONT.BAS
+FontName PLSYM1
+EncodingScheme TEXENCODING
+FullName PLSYM1
+FamilyName PLSYM1
+Weight Medium
+ItalicAngle 0
+IsFixedPitch false
+UnderlinePosition -97
+UnderlineThickness 73
+FontBBox 0 -400 1001 1001
+CapHeight 729
+XHeight 151
+Descender -219
+Ascender 729
+StartCharMetrics 154
+C 32 ; WX 400 ; N C32 ; B 0 0 0 0 ;
+C 1 ; WX 784 ; N C1 ; B 99 0 700 399 ;
+C 2 ; WX 784 ; N C2 ; B 99 0 700 399 ;
+C 3 ; WX 985 ; N C3 ; B 133 0 866 600 ;
+C 4 ; WX 918 ; N C4 ; B 66 -100 866 699 ;
+C 5 ; WX 451 ; N C5 ; B 99 166 366 433 ;
+C 6 ; WX 418 ; N C6 ; B 32 -200 399 799 ;
+C 7 ; WX 418 ; N C7 ; B 32 -200 399 799 ;
+C 8 ; WX 418 ; N C8 ; B 32 -200 399 799 ;
+C 9 ; WX 418 ; N C9 ; B 32 -200 399 799 ;
+C 10 ; WX 418 ; N C10 ; B 32 -200 399 799 ;
+C 11 ; WX 418 ; N C11 ; B 32 -200 399 799 ;
+C 12 ; WX 418 ; N C12 ; B 32 -200 399 799 ;
+C 13 ; WX 418 ; N C13 ; B 32 -200 399 799 ;
+C 14 ; WX 418 ; N C14 ; B 32 -200 399 799 ;
+C 15 ; WX 418 ; N C15 ; B 32 -200 399 799 ;
+C 16 ; WX 418 ; N C16 ; B 32 -200 399 799 ;
+C 17 ; WX 418 ; N C17 ; B 32 -200 399 799 ;
+C 18 ; WX 784 ; N C18 ; B 66 0 733 700 ;
+C 19 ; WX 818 ; N C19 ; B 66 0 766 700 ;
+C 20 ; WX 818 ; N C20 ; B 66 0 766 700 ;
+C 21 ; WX 851 ; N C21 ; B 133 0 733 600 ;
+C 22 ; WX 985 ; N C22 ; B 133 266 866 333 ;
+C 23 ; WX 851 ; N C23 ; B 133 133 733 466 ;
+C 24 ; WX 518 ; N C24 ; B 99 0 433 600 ;
+C 25 ; WX 784 ; N C25 ; B 133 -100 666 699 ;
+C 26 ; WX 784 ; N C26 ; B 133 -100 666 700 ;
+C 27 ; WX 784 ; N C27 ; B 133 32 666 566 ;
+C 28 ; WX 651 ; N C28 ; B 133 0 532 833 ;
+C 29 ; WX 451 ; N C29 ; B 133 0 333 833 ;
+C 30 ; WX 784 ; N C30 ; B 99 0 700 833 ;
+C 31 ; WX 784 ; N C31 ; B 99 0 700 833 ;
+C 32 ; WX 851 ; N C32 ; B 99 0 766 600 ;
+C 33 ; WX 784 ; N C33 ; B 133 -33 666 633 ;
+C 34 ; WX 784 ; N C34 ; B 133 -33 666 633 ;
+C 35 ; WX 784 ; N C35 ; B 99 -67 700 666 ;
+C 36 ; WX 784 ; N C36 ; B 99 -33 700 633 ;
+C 37 ; WX 784 ; N C37 ; B 99 -33 700 633 ;
+C 38 ; WX 784 ; N C38 ; B 99 -33 699 666 ;
+C 39 ; WX 318 ; N C39 ; B 0 -33 333 700 ;
+C 40 ; WX 718 ; N C40 ; B 0 133 733 466 ;
+C 41 ; WX 718 ; N C41 ; B 0 133 733 466 ;
+C 42 ; WX 651 ; N C42 ; B 0 0 666 700 ;
+C 43 ; WX 451 ; N C43 ; B 0 -200 466 866 ;
+C 44 ; WX 1318 ; N C44 ; B 0 299 1333 299 ;
+C 45 ; WX 918 ; N C45 ; B 0 -167 933 766 ;
+C 46 ; WX -15 ; N C46 ; B 0 -366 0 966 ;
+C 47 ; WX 918 ; N C47 ; B 0 -167 933 766 ;
+C 48 ; WX 918 ; N C48 ; B 0 299 933 299 ;
+C 49 ; WX 784 ; N C49 ; B 0 66 799 532 ;
+C 50 ; WX 451 ; N C50 ; B 0 -100 466 699 ;
+C 51 ; WX -15 ; N C51 ; B 0 -167 0 766 ;
+C 52 ; WX 451 ; N C52 ; B 0 -100 466 700 ;
+C 53 ; WX 784 ; N C53 ; B 0 66 799 532 ;
+C 54 ; WX 451 ; N C54 ; B 0 299 466 299 ;
+C 55 ; WX 318 ; N C55 ; B 0 133 333 466 ;
+C 56 ; WX -15 ; N C56 ; B 0 66 0 532 ;
+C 57 ; WX 318 ; N C57 ; B 0 133 333 466 ;
+C 58 ; WX 351 ; N C58 ; B 0 299 366 666 ;
+C 59 ; WX 351 ; N C59 ; B 0 -67 366 299 ;
+C 60 ; WX 351 ; N C60 ; B 0 -67 366 299 ;
+C 61 ; WX 351 ; N C61 ; B 0 299 366 666 ;
+C 62 ; WX 918 ; N C62 ; B 0 233 933 399 ;
+C 63 ; WX 151 ; N C63 ; B 0 -167 166 766 ;
+C 64 ; WX 151 ; N C64 ; B 0 -167 166 766 ;
+C 65 ; WX 918 ; N C65 ; B 0 199 933 366 ;
+C 66 ; WX 451 ; N C66 ; B 0 32 466 566 ;
+C 67 ; WX 518 ; N C67 ; B 0 66 532 532 ;
+C 68 ; WX 451 ; N C68 ; B 0 166 466 433 ;
+C 69 ; WX 518 ; N C69 ; B 0 99 532 500 ;
+C 70 ; WX 518 ; N C70 ; B 0 -67 532 600 ;
+C 71 ; WX 651 ; N C71 ; B 0 32 666 566 ;
+C 72 ; WX 518 ; N C72 ; B 0 0 532 666 ;
+C 73 ; WX 651 ; N C73 ; B 0 32 666 566 ;
+C 74 ; WX 718 ; N C74 ; B 0 -100 733 500 ;
+C 75 ; WX 651 ; N C75 ; B 0 -133 666 532 ;
+C 76 ; WX 184 ; N C76 ; B 0 199 199 399 ;
+C 77 ; WX 151 ; N C77 ; B 0 133 166 466 ;
+C 78 ; WX 918 ; N C78 ; B 0 299 933 299 ;
+C 79 ; WX 918 ; N C79 ; B 0 199 933 399 ;
+C 80 ; WX 518 ; N C80 ; B 0 299 532 766 ;
+C 81 ; WX 918 ; N C81 ; B 0 -167 933 299 ;
+C 82 ; WX 918 ; N C82 ; B 0 -233 933 299 ;
+C 83 ; WX 451 ; N C83 ; B 0 66 466 532 ;
+C 84 ; WX 384 ; N C84 ; B 0 99 399 500 ;
+C 85 ; WX 451 ; N C85 ; B 0 166 466 566 ;
+C 86 ; WX 384 ; N C86 ; B 0 -33 399 633 ;
+C 87 ; WX 518 ; N C87 ; B 0 66 532 600 ;
+C 88 ; WX 451 ; N C88 ; B 0 66 466 532 ;
+C 89 ; WX 318 ; N C89 ; B 0 133 333 466 ;
+C 90 ; WX 318 ; N C90 ; B 0 99 333 500 ;
+C 91 ; WX 251 ; N C91 ; B 0 166 266 433 ;
+C 92 ; WX 251 ; N C92 ; B 0 166 266 433 ;
+C 93 ; WX 318 ; N C93 ; B 0 199 333 500 ;
+C 94 ; WX 284 ; N C94 ; B 0 133 299 466 ;
+C 95 ; WX 318 ; N C95 ; B 0 99 333 399 ;
+C 96 ; WX 284 ; N C96 ; B 0 133 299 466 ;
+C 97 ; WX 384 ; N C97 ; B 0 133 399 500 ;
+C 98 ; WX 218 ; N C98 ; B 0 66 233 532 ;
+C 99 ; WX 318 ; N C99 ; B 0 99 333 500 ;
+C 100 ; WX 384 ; N C100 ; B 0 99 399 500 ;
+C 101 ; WX 451 ; N C101 ; B 0 99 466 500 ;
+C 102 ; WX 585 ; N C102 ; B 0 0 600 600 ;
+C 103 ; WX 585 ; N C103 ; B 0 -33 600 666 ;
+C 104 ; WX 651 ; N C104 ; B 0 -33 666 566 ;
+C 105 ; WX 384 ; N C105 ; B 0 99 399 500 ;
+C 106 ; WX 451 ; N C106 ; B 0 66 466 532 ;
+C 107 ; WX 451 ; N C107 ; B 0 32 466 566 ;
+C 108 ; WX 718 ; N C108 ; B 0 -33 733 700 ;
+C 109 ; WX 518 ; N C109 ; B 0 -33 532 666 ;
+C 110 ; WX 518 ; N C110 ; B 0 -33 532 666 ;
+C 111 ; WX 518 ; N C111 ; B 0 -33 532 666 ;
+C 112 ; WX 518 ; N C112 ; B 0 -33 532 666 ;
+C 113 ; WX 585 ; N C113 ; B 0 299 600 666 ;
+C 114 ; WX 1318 ; N C114 ; B 0 -266 1333 866 ;
+C 115 ; WX 1118 ; N C115 ; B 0 -266 1133 866 ;
+C 116 ; WX 618 ; N C116 ; B 99 -233 532 700 ;
+C 117 ; WX 523 ; N C117 ; B 161 484 376 700 ;
+C 118 ; WX 523 ; N C118 ; B 107 430 430 753 ;
+C 119 ; WX 792 ; N C119 ; B 107 -215 700 861 ;
+C 120 ; WX 523 ; N C120 ; B 161 -215 430 861 ;
+C 121 ; WX 523 ; N C121 ; B 107 -215 376 861 ;
+C 122 ; WX 523 ; N C122 ; B 161 -215 430 861 ;
+C 123 ; WX 523 ; N C123 ; B 107 -215 376 861 ;
+C 124 ; WX 577 ; N C124 ; B 214 -215 376 861 ;
+C 125 ; WX 577 ; N C125 ; B 214 -215 376 861 ;
+C 126 ; WX 523 ; N C126 ; B 161 -215 376 861 ;
+C 127 ; WX 523 ; N C127 ; B 161 -215 376 861 ;
+C 128 ; WX 307 ; N C128 ; B 161 -215 161 861 ;
+C 129 ; WX 523 ; N C129 ; B 161 -215 376 861 ;
+C 130 ; WX 954 ; N C130 ; B 161 322 807 322 ;
+C 131 ; WX 954 ; N C131 ; B 161 0 807 646 ;
+C 132 ; WX 846 ; N C132 ; B 161 0 699 592 ;
+C 133 ; WX 846 ; N C133 ; B 161 0 699 592 ;
+C 134 ; WX 846 ; N C134 ; B 161 53 699 592 ;
+C 135 ; WX 415 ; N C135 ; B 161 268 268 376 ;
+C 136 ; WX 954 ; N C136 ; B 161 0 807 646 ;
+C 137 ; WX 954 ; N C137 ; B 161 214 807 430 ;
+C 138 ; WX 954 ; N C138 ; B 161 0 807 646 ;
+C 139 ; WX 954 ; N C139 ; B 161 107 807 538 ;
+C 140 ; WX 846 ; N C140 ; B 161 0 700 646 ;
+C 141 ; WX 846 ; N C141 ; B 161 0 699 646 ;
+C 142 ; WX 846 ; N C142 ; B 161 0 699 700 ;
+C 143 ; WX 846 ; N C143 ; B 161 0 699 700 ;
+C 144 ; WX 1008 ; N C144 ; B 161 161 915 538 ;
+C 145 ; WX 846 ; N C145 ; B 107 214 753 430 ;
+C 146 ; WX 846 ; N C146 ; B 161 268 700 430 ;
+C 147 ; WX 415 ; N C147 ; B 107 484 322 700 ;
+C 148 ; WX 415 ; N C148 ; B 107 484 322 700 ;
+C 149 ; WX 631 ; N C149 ; B 107 484 538 700 ;
+C 150 ; WX 415 ; N C150 ; B 161 430 268 700 ;
+C 151 ; WX 415 ; N C151 ; B 161 430 268 700 ;
+C 152 ; WX 415 ; N C152 ; B 161 430 268 700 ;
+C 153 ; WX 415 ; N C153 ; B 161 430 268 700 ;
+EndCharMetrics
+
+EndFontMetrics
diff --git a/src/fonts/plsym1.gle b/src/fonts/plsym1.gle
new file mode 100644
index 0000000..481b0bf
--- /dev/null
+++ b/src/fonts/plsym1.gle
@@ -0,0 +1,2868 @@
+dfont design= 1428
+dfont char=1
+amove 142 95
+aline 190 190
+aline 285 238
+aline 380 238
+aline 476 190
+aline 666 47
+aline 761 0
+aline 857 0
+aline 952 47
+aline 1000 190
+aline 952 95
+aline 857 47
+aline 761 47
+aline 666 95
+aline 476 238
+aline 380 285
+aline 285 285
+aline 190 238
+aline 142 95
+amove 142 380
+aline 190 476
+aline 285 523
+aline 380 523
+aline 476 476
+aline 666 333
+aline 761 285
+aline 857 285
+aline 952 333
+aline 1000 476
+aline 952 380
+aline 857 333
+aline 761 333
+aline 666 380
+aline 476 523
+aline 380 571
+aline 285 571
+aline 190 523
+aline 142 380
+stroke
+dfont endchar
+dfont char=2
+amove 142 0
+aline 1000 0
+amove 1000 190
+aline 142 190
+amove 142 380
+aline 190 476
+aline 285 523
+aline 380 523
+aline 476 476
+aline 666 333
+aline 761 285
+aline 857 285
+aline 952 333
+aline 1000 476
+aline 952 380
+aline 857 333
+aline 761 333
+aline 666 380
+aline 476 523
+aline 380 571
+aline 285 571
+aline 190 523
+aline 142 380
+stroke
+dfont endchar
+dfont char=3
+amove 190 571
+aline 1238 571
+aline 1000 857
+amove 428 0
+aline 190 285
+aline 1238 285
+stroke
+dfont endchar
+dfont char=4
+amove 95 -143
+aline 1238 -143
+aline 1238 999
+aline 95 999
+aline 95 -143
+stroke
+dfont endchar
+dfont char=5
+amove 190 285
+aline 476 571
+amove 523 476
+aline 285 238
+aline 380 238
+aline 476 285
+aline 523 380
+aline 523 476
+aline 476 571
+aline 380 619
+aline 285 619
+aline 190 571
+aline 142 476
+aline 142 380
+aline 190 285
+aline 285 238
+amove 380 238
+aline 523 380
+amove 380 619
+aline 142 380
+amove 142 476
+aline 285 619
+stroke
+dfont endchar
+dfont char=6
+amove 95 0
+aline 238 95
+aline 380 95
+aline 476 47
+aline 523 -48
+aline 523 -143
+aline 476 -239
+aline 380 -286
+aline 238 -286
+aline 142 -239
+aline 95 -143
+aline 95 95
+aline 142 238
+aline 190 285
+aline 285 333
+aline 380 333
+aline 476 285
+aline 523 238
+aline 523 190
+aline 476 190
+aline 476 238
+amove 380 95
+aline 428 47
+aline 476 -48
+aline 476 -143
+aline 428 -239
+aline 380 -286
+amove 238 -286
+aline 190 -239
+aline 142 -143
+aline 142 95
+aline 190 238
+aline 285 333
+amove 380 523
+aline 428 571
+aline 476 666
+aline 476 809
+aline 428 904
+aline 380 952
+amove 476 1142
+aline 333 1095
+aline 142 1095
+amove 142 1142
+aline 476 1142
+amove 142 1142
+aline 95 857
+aline 142 904
+aline 238 952
+aline 380 952
+aline 476 904
+aline 523 809
+aline 523 666
+aline 476 571
+aline 380 523
+aline 238 523
+aline 142 571
+aline 95 619
+aline 95 666
+aline 142 666
+aline 142 619
+amove 47 428
+aline 571 428
+stroke
+dfont endchar
+dfont char=7
+amove 95 -239
+aline 142 -191
+aline 190 -191
+aline 333 -239
+aline 476 -239
+aline 523 -191
+amove 523 -143
+aline 523 -191
+aline 476 -286
+aline 333 -286
+aline 190 -191
+amove 95 -286
+aline 95 -143
+aline 142 -48
+aline 238 0
+aline 380 47
+aline 476 95
+aline 523 190
+aline 476 285
+aline 380 333
+aline 238 333
+aline 142 285
+aline 95 238
+aline 95 190
+aline 142 190
+aline 142 238
+amove 47 428
+aline 571 428
+amove 476 523
+aline 142 523
+amove 285 523
+aline 285 1095
+amove 190 1000
+aline 333 1142
+aline 333 523
+amove 380 333
+aline 428 285
+aline 476 190
+aline 428 95
+aline 380 47
+stroke
+dfont endchar
+dfont char=8
+amove 142 -191
+aline 142 -143
+aline 95 -143
+aline 95 -191
+aline 142 -239
+aline 238 -286
+aline 380 -286
+aline 476 -239
+aline 523 -143
+aline 523 -96
+aline 476 -1
+aline 380 47
+aline 285 47
+amove 380 47
+aline 476 95
+aline 523 190
+aline 476 285
+aline 380 333
+aline 238 333
+aline 142 285
+aline 95 238
+aline 95 190
+aline 142 190
+aline 142 238
+amove 47 428
+aline 571 428
+amove 476 523
+aline 142 523
+amove 285 523
+aline 285 1095
+amove 190 999
+aline 333 1142
+aline 333 523
+amove 380 333
+aline 428 285
+aline 476 190
+aline 428 95
+aline 380 47
+aline 428 0
+aline 476 -96
+aline 476 -143
+aline 428 -239
+aline 380 -286
+stroke
+dfont endchar
+dfont char=9
+amove 95 0
+aline 238 95
+aline 380 95
+aline 476 47
+aline 523 -48
+aline 523 -143
+aline 476 -239
+aline 380 -286
+aline 238 -286
+aline 142 -239
+aline 95 -143
+aline 95 95
+aline 142 238
+aline 190 285
+aline 285 333
+aline 380 333
+aline 476 285
+aline 523 238
+aline 523 190
+aline 476 190
+aline 476 238
+amove 380 95
+aline 428 47
+aline 476 -48
+aline 476 -143
+aline 428 -239
+aline 380 -286
+amove 238 -286
+aline 190 -239
+aline 142 -143
+aline 142 95
+aline 190 238
+aline 285 333
+amove 285 523
+aline 285 1095
+amove 190 1000
+aline 333 1142
+aline 333 523
+amove 476 523
+aline 142 523
+amove 47 428
+aline 571 428
+stroke
+dfont endchar
+dfont char=10
+amove 238 47
+aline 190 95
+aline 142 190
+aline 190 285
+aline 238 333
+aline 380 333
+aline 476 285
+aline 523 190
+aline 476 95
+aline 380 47
+aline 238 47
+aline 142 95
+aline 95 190
+aline 142 285
+aline 238 333
+amove 380 333
+aline 428 285
+aline 476 190
+aline 428 95
+aline 380 47
+aline 476 0
+aline 523 -96
+aline 523 -143
+aline 476 -239
+aline 380 -286
+aline 238 -286
+aline 142 -239
+aline 95 -143
+aline 95 -96
+aline 142 0
+aline 238 47
+aline 190 0
+aline 142 -96
+aline 142 -143
+aline 190 -239
+aline 238 -286
+amove 380 -286
+aline 428 -239
+aline 476 -143
+aline 476 -96
+aline 428 0
+aline 380 47
+amove 571 428
+aline 47 428
+amove 142 523
+aline 476 523
+amove 333 523
+aline 333 1142
+aline 190 1000
+amove 285 1095
+aline 285 523
+stroke
+dfont endchar
+dfont char=11
+amove 142 -191
+aline 142 -143
+aline 95 -143
+aline 95 -191
+aline 142 -239
+aline 238 -286
+aline 380 -286
+aline 476 -239
+aline 523 -143
+aline 523 -96
+aline 476 -1
+aline 380 47
+aline 285 47
+amove 380 47
+aline 476 95
+aline 523 190
+aline 476 285
+aline 380 333
+aline 238 333
+aline 142 285
+aline 95 238
+aline 95 190
+aline 142 190
+aline 142 238
+amove 47 428
+aline 571 428
+amove 523 619
+aline 476 571
+aline 333 571
+aline 190 619
+aline 142 619
+aline 95 571
+amove 95 523
+aline 95 666
+aline 142 761
+aline 238 809
+aline 380 857
+aline 476 904
+aline 523 999
+aline 476 1095
+aline 380 1142
+aline 238 1142
+aline 142 1095
+aline 95 1047
+aline 95 999
+aline 142 999
+aline 142 1047
+amove 380 1142
+aline 428 1095
+aline 476 999
+aline 428 904
+aline 380 857
+amove 523 666
+aline 523 619
+aline 476 523
+aline 333 523
+aline 190 619
+amove 380 333
+aline 428 285
+aline 476 190
+aline 428 95
+aline 380 47
+aline 428 -1
+aline 476 -96
+aline 476 -143
+aline 428 -239
+aline 380 -286
+stroke
+dfont endchar
+dfont char=12
+amove 238 47
+aline 190 95
+aline 142 190
+aline 190 285
+aline 238 333
+aline 380 333
+aline 476 285
+aline 523 190
+aline 476 95
+aline 380 47
+aline 238 47
+aline 142 95
+aline 95 190
+aline 142 285
+aline 238 333
+amove 380 333
+aline 428 285
+aline 476 190
+aline 428 95
+aline 380 47
+aline 476 0
+aline 523 -96
+aline 523 -143
+aline 476 -239
+aline 380 -286
+aline 238 -286
+aline 142 -239
+aline 95 -143
+aline 95 -96
+aline 142 0
+aline 238 47
+aline 190 0
+aline 142 -96
+aline 142 -143
+aline 190 -239
+aline 238 -286
+amove 380 -286
+aline 428 -239
+aline 476 -143
+aline 476 -96
+aline 428 0
+aline 380 47
+amove 571 428
+aline 47 428
+amove 142 619
+aline 142 666
+aline 95 666
+aline 95 619
+aline 142 571
+aline 238 523
+aline 380 523
+aline 476 571
+aline 523 666
+aline 523 714
+aline 476 809
+aline 380 857
+aline 285 857
+amove 380 857
+aline 476 904
+aline 523 1000
+aline 476 1095
+aline 380 1142
+aline 238 1142
+aline 142 1095
+aline 95 1047
+aline 95 1000
+aline 142 1000
+aline 142 1047
+amove 380 1142
+aline 428 1095
+aline 476 1000
+aline 428 904
+aline 380 857
+aline 428 809
+aline 476 714
+aline 476 666
+aline 428 571
+aline 380 523
+stroke
+dfont endchar
+dfont char=13
+amove 238 47
+aline 190 95
+aline 142 190
+aline 190 285
+aline 238 333
+aline 380 333
+aline 476 285
+aline 523 190
+aline 476 95
+aline 380 47
+aline 238 47
+aline 142 95
+aline 95 190
+aline 142 285
+aline 238 333
+amove 380 333
+aline 428 285
+aline 476 190
+aline 428 95
+aline 380 47
+aline 476 0
+aline 523 -96
+aline 523 -143
+aline 476 -239
+aline 380 -286
+aline 238 -286
+aline 142 -239
+aline 95 -143
+aline 95 -96
+aline 142 0
+aline 238 47
+aline 190 0
+aline 142 -96
+aline 142 -143
+aline 190 -239
+aline 238 -286
+amove 380 -286
+aline 428 -239
+aline 476 -143
+aline 476 -96
+aline 428 0
+aline 380 47
+amove 571 428
+aline 47 428
+amove 142 619
+aline 142 666
+aline 95 666
+aline 95 619
+aline 142 571
+aline 238 523
+aline 380 523
+aline 476 571
+aline 523 666
+aline 523 809
+aline 476 904
+aline 380 952
+aline 238 952
+aline 142 904
+aline 95 857
+aline 142 1142
+aline 476 1142
+aline 333 1095
+aline 142 1095
+amove 380 952
+aline 428 904
+aline 476 809
+aline 476 666
+aline 428 571
+aline 380 523
+stroke
+dfont endchar
+dfont char=14
+amove 238 47
+aline 190 95
+aline 142 190
+aline 190 285
+aline 238 333
+aline 380 333
+aline 476 285
+aline 523 190
+aline 476 95
+aline 380 47
+aline 238 47
+aline 142 95
+aline 95 190
+aline 142 285
+aline 238 333
+amove 380 333
+aline 428 285
+aline 476 190
+aline 428 95
+aline 380 47
+aline 476 0
+aline 523 -96
+aline 523 -143
+aline 476 -239
+aline 380 -286
+aline 238 -286
+aline 142 -239
+aline 95 -143
+aline 95 -96
+aline 142 0
+aline 238 47
+aline 190 0
+aline 142 -96
+aline 142 -143
+aline 190 -239
+aline 238 -286
+amove 380 -286
+aline 428 -239
+aline 476 -143
+aline 476 -96
+aline 428 0
+aline 380 47
+amove 571 428
+aline 47 428
+amove 190 523
+aline 285 714
+aline 476 1047
+aline 428 1047
+aline 285 1095
+aline 190 1095
+aline 95 1047
+aline 190 1142
+aline 285 1142
+aline 428 1047
+amove 523 1142
+aline 380 857
+aline 238 523
+amove 95 952
+aline 95 1142
+stroke
+dfont endchar
+dfont char=15
+amove 95 0
+aline 238 95
+aline 380 95
+aline 476 47
+aline 523 -48
+aline 523 -143
+aline 476 -239
+aline 380 -286
+aline 238 -286
+aline 142 -239
+aline 95 -143
+aline 95 95
+aline 142 238
+aline 190 285
+aline 285 333
+aline 380 333
+aline 476 285
+aline 523 238
+aline 523 190
+aline 476 190
+aline 476 238
+amove 380 95
+aline 428 47
+aline 476 -48
+aline 476 -143
+aline 428 -239
+aline 380 -286
+amove 238 -286
+aline 190 -239
+aline 142 -143
+aline 142 95
+aline 190 238
+aline 285 333
+amove 380 523
+aline 428 571
+aline 476 666
+aline 476 809
+aline 428 904
+aline 380 952
+amove 476 1142
+aline 333 1095
+aline 142 1095
+amove 142 1142
+aline 476 1142
+amove 142 1142
+aline 95 857
+aline 142 904
+aline 238 952
+aline 380 952
+aline 476 904
+aline 523 809
+aline 523 666
+aline 476 571
+aline 380 523
+aline 238 523
+aline 142 571
+aline 95 619
+aline 95 666
+aline 142 666
+aline 142 619
+amove 47 428
+aline 571 428
+stroke
+dfont endchar
+dfont char=16
+amove 238 -286
+aline 476 -286
+amove 380 -286
+aline 380 333
+aline 47 -96
+aline 571 -96
+amove 333 -286
+aline 333 238
+amove 333 523
+aline 333 1142
+aline 190 1000
+amove 285 1095
+aline 285 523
+amove 142 523
+aline 476 523
+amove 571 428
+aline 47 428
+stroke
+dfont endchar
+dfont char=17
+amove 238 -286
+aline 476 -286
+amove 380 -286
+aline 380 333
+aline 47 -96
+aline 571 -96
+amove 333 -286
+aline 333 238
+amove 380 523
+aline 428 571
+aline 476 666
+aline 476 714
+aline 428 809
+aline 380 857
+aline 476 904
+aline 523 1000
+aline 476 1095
+aline 380 1142
+aline 238 1142
+aline 142 1095
+aline 95 1047
+aline 95 1000
+aline 142 1000
+aline 142 1047
+amove 285 857
+aline 380 857
+aline 476 809
+aline 523 714
+aline 523 666
+aline 476 571
+aline 380 523
+aline 238 523
+aline 142 571
+aline 95 619
+aline 95 666
+aline 142 666
+aline 142 619
+amove 47 428
+aline 571 428
+amove 380 857
+aline 428 904
+aline 476 1000
+aline 428 1095
+aline 380 1142
+stroke
+dfont endchar
+dfont char=18
+amove 333 47
+aline 380 47
+aline 476 238
+aline 571 523
+aline 666 714
+aline 761 904
+aline 809 952
+aline 904 1000
+aline 952 1000
+aline 1000 1000
+aline 1000 952
+aline 952 904
+aline 1000 857
+aline 1047 904
+aline 1000 952
+aline 952 1000
+aline 904 1000
+aline 809 952
+aline 666 761
+aline 571 476
+aline 476 285
+aline 428 190
+aline 333 47
+aline 238 0
+aline 142 0
+aline 95 47
+aline 95 142
+aline 142 190
+aline 238 190
+aline 333 142
+aline 476 47
+aline 571 0
+aline 714 0
+aline 809 47
+aline 904 142
+amove 714 523
+aline 428 523
+stroke
+dfont endchar
+dfont char=19
+amove 333 190
+aline 571 190
+amove 476 190
+aline 476 809
+amove 428 809
+aline 428 190
+amove 523 0
+aline 380 47
+aline 238 142
+aline 142 285
+aline 95 428
+aline 95 571
+aline 142 714
+aline 238 857
+aline 380 952
+aline 523 1000
+aline 714 1000
+aline 857 952
+aline 952 857
+aline 1047 714
+aline 1095 571
+aline 1095 428
+aline 1047 285
+aline 952 142
+aline 809 47
+aline 666 0
+aline 523 0
+amove 857 190
+aline 809 238
+aline 761 428
+aline 666 476
+aline 761 523
+aline 809 619
+aline 809 666
+aline 761 761
+aline 666 809
+amove 333 809
+aline 666 809
+aline 809 761
+aline 857 666
+aline 857 619
+aline 809 523
+aline 666 476
+aline 476 476
+amove 666 476
+aline 714 428
+aline 761 238
+aline 809 190
+aline 857 190
+aline 904 238
+stroke
+dfont endchar
+dfont char=20
+amove 523 0
+aline 380 47
+aline 238 142
+aline 142 285
+aline 95 428
+aline 95 571
+aline 142 714
+aline 238 857
+aline 380 952
+aline 523 1000
+aline 714 1000
+aline 857 952
+aline 952 857
+aline 1047 714
+aline 1095 571
+aline 1095 428
+aline 1047 285
+aline 952 142
+aline 809 47
+aline 666 0
+aline 523 0
+amove 523 190
+aline 428 285
+aline 380 428
+aline 380 571
+aline 428 714
+aline 523 809
+amove 761 761
+aline 809 809
+aline 809 619
+aline 761 761
+aline 666 809
+aline 523 809
+aline 428 761
+aline 380 714
+aline 333 571
+aline 333 428
+aline 380 285
+aline 428 238
+aline 523 190
+aline 666 190
+aline 761 238
+aline 809 333
+stroke
+dfont endchar
+dfont char=21
+amove 190 190
+aline 1047 190
+amove 1047 428
+aline 190 428
+amove 190 666
+aline 1047 666
+amove 952 857
+aline 285 0
+stroke
+dfont endchar
+dfont char=22
+amove 238 476
+aline 190 428
+aline 238 380
+aline 285 428
+aline 238 476
+amove 714 476
+aline 666 428
+aline 714 380
+aline 761 428
+aline 714 476
+amove 1190 476
+aline 1142 428
+aline 1190 380
+aline 1238 428
+aline 1190 476
+stroke
+dfont endchar
+dfont char=23
+amove 428 190
+aline 333 333
+aline 190 428
+aline 333 523
+aline 428 666
+amove 333 523
+aline 238 428
+aline 333 333
+amove 238 428
+aline 1000 428
+amove 809 190
+aline 904 333
+aline 1047 428
+aline 904 523
+aline 809 666
+amove 904 523
+aline 1000 428
+aline 904 333
+stroke
+dfont endchar
+dfont char=24
+amove 142 238
+aline 285 142
+aline 380 -1
+aline 476 142
+aline 619 238
+amove 476 142
+aline 380 47
+aline 285 142
+amove 380 47
+aline 380 809
+amove 285 714
+aline 380 809
+aline 476 714
+amove 619 619
+aline 476 714
+aline 380 857
+aline 285 714
+aline 142 619
+stroke
+dfont endchar
+dfont char=25
+amove 619 -143
+aline 619 999
+amove 952 809
+aline 619 809
+aline 428 761
+aline 333 714
+aline 238 619
+aline 190 476
+aline 190 380
+aline 238 238
+aline 333 142
+aline 428 95
+aline 619 47
+aline 952 47
+stroke
+dfont endchar
+dfont char=26
+amove 190 47
+aline 523 47
+aline 714 95
+aline 809 142
+aline 904 238
+aline 952 380
+aline 952 476
+aline 904 619
+aline 809 714
+aline 714 761
+aline 523 809
+aline 190 809
+amove 523 1000
+aline 523 -143
+stroke
+dfont endchar
+dfont char=27
+amove 190 47
+aline 523 47
+aline 714 95
+aline 809 142
+aline 904 238
+aline 952 380
+aline 952 476
+aline 904 619
+aline 809 714
+aline 714 761
+aline 523 809
+aline 190 809
+amove 428 428
+aline 952 428
+stroke
+dfont endchar
+dfont char=28
+amove 190 0
+aline 190 1190
+amove 476 1190
+aline 476 0
+amove 761 0
+aline 761 1190
+stroke
+dfont endchar
+dfont char=29
+amove 190 0
+aline 190 1190
+amove 476 1190
+aline 476 0
+stroke
+dfont endchar
+dfont char=30
+amove 571 1190
+aline 571 0
+amove 142 0
+aline 1000 0
+stroke
+dfont endchar
+dfont char=31
+amove 1000 1190
+aline 142 0
+aline 1000 0
+stroke
+dfont endchar
+dfont char=32
+amove 619 857
+aline 571 809
+aline 619 761
+aline 666 809
+aline 619 857
+amove 190 95
+aline 142 47
+aline 190 0
+aline 238 47
+aline 190 95
+amove 1047 95
+aline 1000 47
+aline 1047 0
+aline 1095 47
+aline 1047 95
+stroke
+dfont endchar
+dfont char=33
+amove 476 -48
+aline 523 95
+aline 571 285
+aline 619 95
+aline 666 -48
+aline 476 -48
+amove 571 285
+aline 619 190
+aline 714 142
+aline 809 142
+aline 904 190
+aline 952 285
+aline 952 380
+aline 904 523
+aline 761 714
+aline 571 904
+aline 380 714
+aline 238 523
+aline 190 380
+aline 190 285
+aline 238 190
+aline 333 142
+aline 428 142
+aline 523 190
+aline 571 285
+stroke
+dfont endchar
+dfont char=34
+amove 571 -48
+aline 380 190
+aline 285 333
+aline 238 428
+aline 190 571
+aline 190 761
+aline 238 857
+aline 333 904
+aline 380 904
+aline 476 857
+aline 523 761
+aline 571 619
+aline 619 761
+aline 666 857
+aline 761 904
+aline 809 904
+aline 904 857
+aline 952 761
+aline 952 571
+aline 904 428
+aline 857 333
+aline 761 190
+aline 571 -48
+stroke
+dfont endchar
+dfont char=35
+amove 142 428
+aline 285 285
+aline 476 47
+aline 571 -96
+aline 666 47
+aline 857 285
+aline 1000 428
+aline 857 571
+aline 666 809
+aline 571 952
+aline 476 809
+aline 285 571
+aline 142 428
+stroke
+dfont endchar
+dfont char=36
+amove 476 -48
+aline 523 95
+aline 571 333
+aline 666 190
+aline 761 142
+aline 857 142
+aline 952 190
+aline 1000 285
+aline 1000 380
+aline 952 476
+aline 857 523
+aline 761 523
+aline 619 476
+aline 714 571
+aline 761 666
+aline 761 761
+aline 714 857
+aline 619 904
+aline 523 904
+aline 428 857
+aline 380 761
+aline 380 666
+aline 428 571
+aline 523 476
+aline 380 523
+aline 285 523
+aline 190 476
+aline 142 380
+aline 142 285
+aline 190 190
+aline 285 142
+aline 380 142
+aline 476 190
+aline 571 333
+aline 619 95
+aline 666 -48
+aline 476 -48
+stroke
+dfont endchar
+dfont char=37
+amove 190 428
+aline 142 476
+aline 142 571
+aline 190 619
+aline 285 619
+aline 380 571
+aline 571 428
+aline 571 0
+aline 523 -48
+aline 571 238
+amove 571 428
+aline 428 619
+aline 380 761
+aline 380 857
+aline 428 904
+aline 523 904
+aline 571 857
+aline 619 904
+aline 714 904
+aline 761 857
+aline 761 761
+aline 714 619
+aline 571 428
+aline 380 285
+aline 285 238
+aline 190 238
+aline 142 285
+aline 142 380
+aline 190 428
+amove 571 428
+aline 761 571
+aline 857 619
+aline 952 619
+aline 1000 571
+aline 1000 476
+aline 952 428
+aline 1000 380
+aline 1000 285
+aline 952 238
+aline 857 238
+aline 761 285
+aline 571 428
+stroke
+dfont endchar
+dfont char=38
+amove 285 47
+aline 333 142
+aline 333 238
+aline 285 333
+aline 190 380
+aline 142 380
+aline 142 428
+aline 190 476
+aline 285 476
+aline 333 428
+aline 380 333
+aline 380 190
+aline 333 95
+aline 285 47
+amove 238 238
+aline 904 238
+amove 999 380
+aline 999 428
+aline 952 476
+aline 857 476
+aline 809 428
+aline 761 333
+aline 761 190
+aline 809 95
+aline 857 47
+aline 809 142
+aline 809 238
+aline 857 333
+aline 952 380
+aline 999 380
+amove 571 -48
+aline 476 47
+aline 523 142
+aline 523 285
+aline 428 571
+aline 428 714
+aline 476 857
+aline 571 952
+aline 666 857
+aline 714 714
+aline 714 571
+aline 619 285
+aline 619 142
+aline 666 47
+aline 571 -48
+stroke
+dfont endchar
+dfont char=39
+amove 0 47
+aline 47 0
+aline 142 -48
+aline 285 -48
+aline 380 0
+aline 428 47
+aline 476 142
+aline 476 238
+aline 428 333
+aline 380 380
+aline 95 571
+aline 47 619
+aline 0 714
+aline 0 809
+aline 47 904
+aline 95 952
+aline 190 1000
+aline 333 1000
+aline 428 952
+aline 476 904
+stroke
+dfont endchar
+dfont char=40
+amove 95 190
+aline 47 238
+aline 0 333
+aline 0 476
+aline 47 571
+aline 95 619
+aline 190 666
+aline 285 666
+aline 380 619
+aline 428 571
+aline 619 285
+aline 666 238
+aline 761 190
+aline 857 190
+aline 952 238
+aline 1000 285
+aline 1047 380
+aline 1047 523
+aline 1000 619
+aline 952 666
+stroke
+dfont endchar
+dfont char=41
+amove 523 428
+aline 619 285
+aline 666 238
+aline 761 190
+aline 857 190
+aline 952 238
+aline 1000 285
+aline 1047 380
+aline 1047 476
+aline 1000 571
+aline 952 619
+aline 857 666
+aline 761 666
+aline 666 619
+aline 619 571
+aline 428 285
+aline 380 238
+aline 285 190
+aline 190 190
+aline 95 238
+aline 47 285
+aline 0 380
+aline 0 476
+aline 47 571
+aline 95 619
+aline 190 666
+aline 285 666
+aline 380 619
+aline 428 571
+aline 523 428
+stroke
+dfont endchar
+dfont char=42
+amove 142 0
+aline 142 1000
+amove 0 1000
+aline 904 1000
+aline 428 523
+aline 904 47
+amove 857 95
+aline 714 95
+aline 857 47
+aline 952 0
+aline 904 95
+aline 857 238
+aline 857 95
+stroke
+dfont endchar
+dfont char=43
+amove 190 -286
+aline 333 -239
+aline 428 -191
+aline 523 -96
+aline 619 47
+aline 666 238
+aline 666 523
+aline 619 666
+aline 523 761
+aline 380 809
+aline 285 809
+aline 142 761
+aline 47 666
+aline 0 523
+amove 666 428
+aline 619 285
+aline 523 190
+aline 380 142
+aline 285 142
+aline 142 190
+aline 47 285
+aline 0 428
+aline 0 714
+aline 47 904
+aline 142 1047
+aline 238 1142
+aline 333 1190
+aline 476 1238
+stroke
+dfont endchar
+dfont char=44
+amove 0 428
+aline 1904 428
+stroke
+dfont endchar
+dfont char=45
+amove 0 -239
+aline 1333 1095
+stroke
+dfont endchar
+dfont char=46
+amove 0 1380
+aline 0 -524
+stroke
+dfont endchar
+dfont char=47
+amove 0 1095
+aline 1333 -239
+stroke
+dfont endchar
+dfont char=48
+amove 0 428
+aline 1333 428
+stroke
+dfont endchar
+dfont char=49
+amove 0 95
+aline 1142 761
+stroke
+dfont endchar
+dfont char=50
+amove 0 -143
+aline 666 999
+stroke
+dfont endchar
+dfont char=51
+amove 0 1095
+aline 0 -239
+stroke
+dfont endchar
+dfont char=52
+amove 0 1000
+aline 666 -143
+stroke
+dfont endchar
+dfont char=53
+amove 0 761
+aline 1142 95
+stroke
+dfont endchar
+dfont char=54
+amove 0 428
+aline 666 428
+stroke
+dfont endchar
+dfont char=55
+amove 0 190
+aline 476 666
+stroke
+dfont endchar
+dfont char=56
+amove 0 761
+aline 0 95
+stroke
+dfont endchar
+dfont char=57
+amove 0 666
+aline 476 190
+stroke
+dfont endchar
+dfont char=58
+amove 0 428
+aline 0 523
+aline 47 666
+aline 142 809
+aline 285 904
+aline 428 952
+aline 523 952
+stroke
+dfont endchar
+dfont char=59
+amove 0 428
+aline 0 333
+aline 47 190
+aline 142 47
+aline 285 -48
+aline 428 -96
+aline 523 -96
+stroke
+dfont endchar
+dfont char=60
+amove 0 -96
+aline 95 -96
+aline 238 -48
+aline 380 47
+aline 476 190
+aline 523 333
+aline 523 428
+stroke
+dfont endchar
+dfont char=61
+amove 523 428
+aline 523 523
+aline 476 666
+aline 380 809
+aline 238 904
+aline 95 952
+aline 0 952
+stroke
+dfont endchar
+dfont char=62
+amove 0 571
+aline 142 476
+aline 333 380
+aline 571 333
+aline 761 333
+aline 1000 380
+aline 1190 476
+aline 1333 571
+stroke
+dfont endchar
+dfont char=63
+amove 238 1095
+aline 142 952
+aline 47 761
+aline -1 523
+aline -1 333
+aline 47 95
+aline 142 -96
+aline 238 -239
+stroke
+dfont endchar
+dfont char=64
+amove 0 -239
+aline 95 -96
+aline 190 95
+aline 238 333
+aline 238 523
+aline 190 761
+aline 95 952
+aline 0 1095
+stroke
+dfont endchar
+dfont char=65
+amove 0 285
+aline 142 380
+aline 333 476
+aline 571 523
+aline 761 523
+aline 1000 476
+aline 1190 380
+aline 1333 285
+stroke
+dfont endchar
+dfont char=66
+amove 333 809
+aline 666 619
+aline 0 238
+aline 333 47
+stroke
+dfont endchar
+dfont char=67
+amove 0 428
+aline 190 761
+aline 571 95
+aline 761 428
+stroke
+dfont endchar
+dfont char=68
+amove 0 238
+aline 0 619
+aline 666 238
+aline 666 619
+stroke
+dfont endchar
+dfont char=69
+amove 95 142
+aline 0 523
+aline 761 333
+aline 666 714
+stroke
+dfont endchar
+dfont char=70
+amove 0 -96
+aline 95 -96
+aline 238 -48
+aline 333 0
+aline 476 142
+aline 523 238
+aline 571 380
+aline 571 571
+aline 523 714
+aline 476 809
+aline 428 857
+aline 333 857
+aline 285 809
+aline 238 714
+aline 190 571
+aline 190 380
+aline 238 238
+aline 285 142
+aline 428 0
+aline 523 -48
+aline 666 -96
+aline 761 -96
+stroke
+dfont endchar
+dfont char=71
+amove 952 47
+aline 952 142
+aline 904 285
+aline 857 380
+aline 714 523
+aline 619 571
+aline 476 619
+aline 285 619
+aline 142 571
+aline 47 523
+aline 0 476
+aline 0 380
+aline 47 333
+aline 142 285
+aline 285 238
+aline 476 238
+aline 619 285
+aline 714 333
+aline 857 476
+aline 904 571
+aline 952 714
+aline 952 809
+stroke
+dfont endchar
+dfont char=72
+amove 0 952
+aline 95 952
+aline 238 904
+aline 333 857
+aline 476 714
+aline 523 619
+aline 571 476
+aline 571 285
+aline 523 142
+aline 476 47
+aline 428 0
+aline 333 0
+aline 285 47
+aline 238 142
+aline 190 285
+aline 190 476
+aline 238 619
+aline 285 714
+aline 428 857
+aline 523 904
+aline 666 952
+aline 761 952
+stroke
+dfont endchar
+dfont char=73
+amove 0 47
+aline 0 142
+aline 47 285
+aline 95 380
+aline 238 523
+aline 333 571
+aline 476 619
+aline 666 619
+aline 809 571
+aline 904 523
+aline 952 476
+aline 952 380
+aline 904 333
+aline 809 285
+aline 666 238
+aline 476 238
+aline 333 285
+aline 238 333
+aline 95 476
+aline 47 571
+aline 0 714
+aline 0 809
+stroke
+dfont endchar
+dfont char=74
+amove 0 523
+aline 47 428
+aline 142 333
+aline 238 285
+aline 380 238
+aline 571 238
+aline 761 285
+aline 904 380
+aline 1000 523
+aline 1047 619
+aline 1000 714
+aline 857 714
+aline 666 666
+aline 571 619
+aline 428 523
+aline 333 380
+aline 285 238
+aline 285 95
+aline 333 -48
+aline 380 -143
+stroke
+dfont endchar
+dfont char=75
+amove 0 333
+aline 142 238
+aline 285 190
+aline 523 190
+aline 666 238
+aline 809 333
+aline 904 476
+aline 952 619
+aline 952 714
+aline 904 761
+aline 809 761
+aline 666 714
+aline 523 619
+aline 428 476
+aline 380 333
+aline 380 95
+aline 428 -48
+aline 523 -191
+stroke
+dfont endchar
+dfont char=76
+amove 95 571
+aline 0 476
+aline 0 380
+aline 95 285
+aline 190 285
+aline 285 380
+aline 285 476
+aline 190 571
+aline 95 571
+amove 95 523
+aline 47 476
+aline 47 380
+aline 95 333
+aline 190 333
+aline 238 380
+aline 238 476
+aline 190 523
+aline 95 523
+amove 142 476
+aline 95 428
+aline 142 380
+aline 190 428
+aline 142 476
+stroke
+dfont endchar
+dfont char=77
+amove 0 190
+aline 47 190
+aline 142 238
+aline 190 285
+aline 238 380
+aline 238 476
+aline 190 571
+aline 142 619
+aline 47 666
+aline 0 666
+stroke
+dfont endchar
+dfont char=78
+amove 0 428
+aline 285 428
+amove 523 428
+aline 809 428
+amove 1047 428
+aline 1333 428
+stroke
+dfont endchar
+dfont char=79
+amove 0 285
+aline 0 571
+aline 1333 571
+aline 1333 285
+stroke
+dfont endchar
+dfont char=80
+amove 0 428
+aline 380 1095
+aline 761 428
+stroke
+dfont endchar
+dfont char=81
+amove 285 95
+aline 1047 95
+amove 1333 428
+aline 0 428
+amove 571 -239
+aline 761 -239
+stroke
+dfont endchar
+dfont char=82
+amove 0 428
+aline 666 -334
+aline 1333 428
+aline 0 428
+stroke
+dfont endchar
+dfont char=83
+amove 285 761
+aline 142 714
+aline 47 619
+aline 0 476
+aline 0 380
+aline 47 238
+aline 142 142
+aline 285 95
+aline 380 95
+aline 523 142
+aline 619 238
+aline 666 380
+aline 666 476
+aline 619 619
+aline 523 714
+aline 380 761
+aline 285 761
+stroke
+dfont endchar
+dfont char=84
+amove 0 714
+aline 0 142
+aline 571 142
+aline 571 714
+aline 0 714
+stroke
+dfont endchar
+dfont char=85
+amove 333 809
+aline 0 238
+aline 666 238
+aline 333 809
+stroke
+dfont endchar
+dfont char=86
+amove 285 904
+aline 0 428
+aline 285 -48
+aline 571 428
+aline 285 904
+stroke
+dfont endchar
+dfont char=87
+amove 380 857
+aline 285 571
+aline 0 571
+aline 238 380
+aline 142 95
+aline 380 285
+aline 619 95
+aline 523 380
+aline 761 571
+aline 476 571
+aline 380 857
+stroke
+dfont endchar
+dfont char=88
+amove 333 95
+aline 333 761
+amove 0 428
+aline 666 428
+stroke
+dfont endchar
+dfont char=89
+amove 0 190
+aline 476 666
+amove 0 666
+aline 476 190
+stroke
+dfont endchar
+dfont char=90
+amove 238 142
+aline 238 714
+amove -1 571
+aline 476 285
+amove 476 571
+aline 0 285
+stroke
+dfont endchar
+dfont char=91
+amove 142 285
+aline 142 571
+amove 142 619
+aline 47 571
+aline 0 476
+aline 0 380
+aline 47 285
+aline 142 238
+aline 238 238
+aline 333 285
+aline 380 380
+aline 380 476
+aline 333 571
+aline 238 619
+aline 142 619
+amove 190 571
+aline 190 285
+amove 238 285
+aline 238 571
+amove 285 523
+aline 285 333
+amove 333 380
+aline 333 476
+amove 95 523
+aline 95 333
+amove 47 380
+aline 47 476
+stroke
+dfont endchar
+dfont char=92
+amove 47 285
+aline 47 571
+amove 95 571
+aline 95 285
+amove 142 285
+aline 142 571
+amove 190 571
+aline 190 285
+amove 238 285
+aline 238 571
+amove 285 571
+aline 285 285
+amove 333 285
+aline 333 571
+amove 0 619
+aline 0 238
+aline 380 238
+aline 380 619
+aline 0 619
+stroke
+dfont endchar
+dfont char=93
+amove 95 333
+aline 238 571
+aline 380 333
+amove 285 333
+aline 238 428
+aline 190 333
+amove 238 714
+aline 0 285
+aline 476 285
+aline 238 714
+stroke
+dfont endchar
+dfont char=94
+amove 0 428
+aline 428 190
+aline 428 666
+aline 0 428
+amove 142 428
+aline 380 285
+amove 380 380
+aline 285 428
+aline 380 476
+amove 380 571
+aline 142 428
+stroke
+dfont endchar
+dfont char=95
+amove 238 142
+aline 476 571
+aline 0 571
+aline 238 142
+amove 238 285
+aline 380 523
+amove 285 523
+aline 238 428
+aline 190 523
+amove 95 523
+aline 238 285
+stroke
+dfont endchar
+dfont char=96
+amove 47 285
+aline 285 428
+aline 47 571
+amove 47 476
+aline 142 428
+aline 47 380
+amove 428 428
+aline 0 666
+aline 0 190
+aline 428 428
+stroke
+dfont endchar
+dfont char=97
+amove 95 190
+aline 285 428
+aline 285 714
+aline 476 190
+aline 0 523
+aline 571 523
+aline 95 190
+aline 285 714
+amove 285 428
+aline 0 523
+amove 285 428
+aline 476 190
+amove 285 428
+aline 571 523
+stroke
+dfont endchar
+dfont char=98
+amove 0 95
+aline 0 761
+aline 333 619
+aline 0 476
+amove 47 571
+aline 190 619
+aline 47 666
+stroke
+dfont endchar
+dfont char=99
+amove 238 142
+aline 238 714
+amove 95 571
+aline 380 571
+amove 476 285
+aline 380 190
+aline 285 142
+aline 190 142
+aline 95 190
+aline 0 285
+stroke
+dfont endchar
+dfont char=100
+amove 190 190
+aline 380 190
+amove 285 142
+aline 285 714
+amove 0 476
+aline 47 571
+aline 523 571
+aline 571 476
+stroke
+dfont endchar
+dfont char=101
+amove 95 142
+aline 571 619
+amove 476 714
+aline 619 571
+aline 666 476
+amove 571 142
+aline 95 619
+amove 190 714
+aline 47 571
+aline 0 476
+stroke
+dfont endchar
+dfont char=102
+amove 0 0
+aline 238 857
+aline 619 857
+aline 857 0
+aline 190 666
+aline 666 666
+aline 0 0
+stroke
+dfont endchar
+dfont char=103
+amove 142 -48
+aline 0 238
+aline 857 238
+aline 714 -48
+aline 142 -48
+amove 428 238
+aline 428 952
+amove 190 809
+aline 666 523
+amove 666 809
+aline 190 523
+stroke
+dfont endchar
+dfont char=104
+amove 0 -48
+aline 952 -48
+aline 952 428
+aline 0 -48
+amove 190 523
+aline 571 714
+amove 285 809
+aline 571 238
+stroke
+dfont endchar
+dfont char=105
+amove 190 714
+aline 190 523
+aline 0 523
+aline 0 333
+aline 190 333
+aline 190 142
+aline 380 142
+aline 380 333
+aline 571 333
+aline 571 523
+aline 380 523
+aline 380 714
+aline 190 714
+stroke
+dfont endchar
+dfont char=106
+amove 666 333
+aline 619 238
+aline 523 142
+aline 380 95
+aline 285 95
+aline 142 142
+aline 47 238
+aline 0 380
+aline 0 476
+aline 47 619
+aline 142 714
+aline 285 761
+aline 380 761
+aline 523 714
+aline 619 619
+aline 666 523
+aline 571 619
+aline 476 666
+aline 380 666
+aline 285 619
+aline 238 571
+aline 190 476
+aline 190 380
+aline 238 285
+aline 285 238
+aline 380 190
+aline 476 190
+aline 571 238
+aline 666 333
+stroke
+dfont endchar
+dfont char=107
+amove 333 809
+aline 0 238
+aline 666 238
+aline 333 809
+amove 333 47
+aline 666 619
+aline 0 619
+aline 333 47
+stroke
+dfont endchar
+dfont char=108
+amove 0 47
+aline 47 142
+aline 142 238
+aline 190 333
+aline 238 523
+aline 238 761
+aline 285 809
+aline 380 857
+aline 666 857
+aline 761 809
+aline 809 761
+aline 809 523
+aline 857 333
+aline 904 238
+aline 1000 142
+aline 1047 47
+aline 0 47
+amove 476 47
+aline 428 0
+aline 476 -48
+aline 571 -48
+aline 619 0
+aline 571 47
+amove 619 857
+aline 619 952
+aline 571 1000
+aline 476 1000
+aline 428 952
+aline 428 857
+stroke
+dfont endchar
+dfont char=109
+amove 333 -48
+aline 428 -48
+aline 380 380
+aline 333 -48
+amove 380 380
+aline 380 666
+aline 333 809
+aline 285 904
+aline 190 952
+aline 333 809
+amove 428 809
+aline 571 952
+aline 476 904
+aline 428 809
+aline 380 666
+aline 190 761
+aline 95 761
+aline 0 666
+aline 95 714
+aline 285 714
+amove 380 666
+aline 571 761
+aline 666 761
+aline 761 666
+aline 666 714
+aline 476 714
+amove 380 666
+aline 285 619
+aline 238 571
+aline 238 428
+aline 285 571
+aline 380 666
+aline 476 619
+aline 523 571
+aline 523 428
+aline 476 571
+aline 380 666
+stroke
+dfont endchar
+dfont char=110
+amove 95 47
+aline 0 95
+aline 0 190
+aline 47 95
+aline 95 47
+aline 142 47
+aline 238 95
+aline 285 142
+aline 380 285
+aline 380 380
+amove 380 285
+aline 476 142
+aline 523 95
+aline 619 47
+aline 666 47
+aline 714 95
+aline 761 190
+aline 761 95
+aline 666 47
+amove 619 47
+aline 523 47
+aline 380 95
+aline 238 47
+aline 142 47
+amove 333 -48
+aline 380 95
+aline 428 -48
+aline 333 -48
+amove 190 333
+aline 285 333
+aline 380 380
+aline 476 333
+aline 571 333
+amove 666 333
+aline 714 380
+aline 714 428
+aline 666 333
+aline 571 333
+aline 476 380
+aline 380 523
+aline 380 619
+amove 380 523
+aline 285 380
+aline 190 333
+aline 95 333
+aline 47 428
+aline 47 380
+aline 95 333
+amove 190 571
+aline 285 571
+aline 380 619
+aline 476 571
+aline 571 571
+amove 619 619
+aline 571 571
+aline 476 619
+aline 380 761
+aline 380 857
+amove 380 761
+aline 285 619
+aline 190 571
+aline 142 619
+amove 285 809
+aline 333 857
+aline 380 952
+aline 428 857
+aline 476 809
+aline 380 857
+aline 285 809
+stroke
+dfont endchar
+dfont char=111
+amove 333 -48
+aline 380 95
+aline 428 -48
+aline 333 -48
+amove 380 95
+aline 523 47
+aline 666 47
+aline 761 142
+aline 761 285
+aline 714 333
+aline 619 333
+aline 714 428
+aline 761 571
+aline 714 666
+aline 619 714
+aline 523 666
+aline 571 809
+aline 523 904
+aline 428 952
+aline 333 952
+aline 238 904
+aline 190 809
+aline 238 666
+aline 142 714
+aline 47 666
+aline 0 571
+aline 47 428
+aline 142 333
+aline 47 333
+aline 0 285
+aline 0 142
+aline 95 47
+aline 238 47
+aline 380 95
+stroke
+dfont endchar
+dfont char=112
+amove 333 -48
+aline 380 95
+aline 428 -48
+aline 333 -48
+amove 380 95
+aline 571 142
+aline 571 238
+aline 666 285
+aline 666 428
+aline 761 476
+aline 761 714
+aline 714 857
+aline 666 904
+aline 571 904
+aline 476 952
+aline 285 952
+aline 190 904
+aline 95 904
+aline 47 857
+aline 0 714
+aline 0 476
+aline 95 428
+aline 95 285
+aline 190 238
+aline 190 142
+aline 380 95
+stroke
+dfont endchar
+dfont char=113
+amove 95 428
+aline 0 523
+amove 238 523
+aline 142 761
+amove 428 952
+aline 428 571
+amove 619 523
+aline 714 761
+amove 857 523
+aline 761 428
+stroke
+dfont endchar
+dfont char=114
+amove 952 -381
+aline 857 -286
+aline 714 -239
+aline 428 -239
+aline 285 -191
+aline 190 -96
+aline 142 47
+aline 142 666
+aline 95 809
+aline 0 904
+aline 333 1238
+aline 428 1142
+aline 571 1095
+aline 714 1095
+aline 857 1142
+aline 952 1238
+aline 1047 1142
+aline 1190 1095
+aline 1333 1095
+aline 1476 1142
+aline 1571 1238
+aline 1904 904
+aline 1809 809
+aline 1761 666
+aline 1761 47
+aline 1714 -96
+aline 1619 -191
+aline 1476 -239
+aline 1190 -239
+aline 1047 -286
+aline 952 -381
+stroke
+dfont endchar
+dfont char=115
+amove 809 -381
+aline 523 -239
+aline 285 -48
+aline 142 142
+aline 47 333
+aline 0 523
+aline 0 761
+aline 47 952
+aline 190 1238
+aline 285 1142
+aline 428 1095
+aline 571 1095
+aline 714 1142
+aline 809 1238
+aline 904 1142
+aline 1047 1095
+aline 1190 1095
+aline 1333 1142
+aline 1428 1238
+aline 1571 952
+aline 1619 761
+aline 1619 523
+aline 1571 333
+aline 1476 142
+aline 1333 -48
+aline 1095 -239
+aline 809 -381
+amove 47 904
+aline 1571 904
+stroke
+dfont endchar
+dfont char=116
+amove 190 -334
+aline 761 1000
+amove 428 666
+aline 333 619
+aline 238 523
+aline 190 380
+aline 190 285
+aline 238 142
+aline 333 47
+aline 428 0
+amove 761 142
+aline 666 47
+aline 523 0
+aline 428 0
+aline 285 47
+aline 190 142
+aline 142 285
+aline 142 380
+aline 190 523
+aline 285 619
+aline 428 666
+aline 571 666
+aline 666 619
+aline 761 523
+aline 761 476
+aline 714 428
+aline 666 476
+aline 714 523
+stroke
+dfont endchar
+dfont char=117
+amove 307 1000
+aline 230 923
+aline 230 769
+aline 307 692
+aline 461 692
+aline 538 769
+aline 538 923
+aline 461 1000
+aline 307 1000
+stroke
+dfont endchar
+dfont char=118
+amove 153 692
+aline 615 1000
+amove 384 1076
+aline 384 615
+amove 615 692
+aline 153 1000
+stroke
+dfont endchar
+dfont char=119
+amove 153 -308
+aline 1000 1230
+stroke
+dfont endchar
+dfont char=120
+amove 461 -154
+aline 384 0
+aline 307 307
+aline 307 615
+aline 384 923
+aline 461 1076
+amove 615 1230
+aline 461 1076
+aline 307 846
+aline 230 615
+aline 230 307
+aline 307 76
+aline 461 -154
+aline 615 -308
+stroke
+dfont endchar
+dfont char=121
+amove 153 -308
+aline 307 -154
+aline 461 76
+aline 538 307
+aline 538 615
+aline 461 846
+aline 307 1076
+aline 153 1230
+amove 307 1076
+aline 384 923
+aline 461 615
+aline 461 307
+aline 384 0
+aline 307 -154
+stroke
+dfont endchar
+dfont char=122
+amove 230 -308
+aline 230 1230
+aline 615 1230
+amove 307 1230
+aline 307 -308
+amove 230 -308
+aline 615 -308
+stroke
+dfont endchar
+dfont char=123
+amove 153 -308
+aline 538 -308
+aline 538 1230
+aline 153 1230
+amove 461 1230
+aline 461 -308
+stroke
+dfont endchar
+dfont char=124
+amove 384 -77
+aline 461 230
+amove 384 76
+aline 461 -231
+amove 538 -308
+aline 461 -231
+aline 384 -77
+aline 384 76
+aline 461 230
+aline 461 307
+aline 307 461
+aline 461 615
+aline 461 692
+aline 384 846
+aline 384 999
+aline 461 1153
+aline 538 1230
+amove 461 1153
+aline 384 846
+amove 384 999
+aline 461 692
+stroke
+dfont endchar
+dfont char=125
+amove 307 -308
+aline 384 -231
+aline 461 -77
+aline 461 76
+aline 384 230
+aline 384 307
+aline 538 461
+aline 384 615
+aline 384 692
+aline 461 846
+aline 461 999
+aline 384 1153
+aline 307 1230
+amove 384 1153
+aline 461 846
+amove 461 1000
+aline 384 692
+amove 384 230
+aline 461 -77
+amove 461 76
+aline 384 -231
+stroke
+dfont endchar
+dfont char=126
+amove 538 1230
+aline 230 461
+aline 538 -308
+stroke
+dfont endchar
+dfont char=127
+amove 230 -308
+aline 538 461
+aline 230 1230
+stroke
+dfont endchar
+dfont char=128
+amove 230 1230
+aline 230 -308
+stroke
+dfont endchar
+dfont char=129
+amove 230 -308
+aline 230 1230
+amove 538 1230
+aline 538 -308
+stroke
+dfont endchar
+dfont char=130
+amove 230 461
+aline 1153 461
+stroke
+dfont endchar
+dfont char=131
+amove 230 461
+aline 1153 461
+amove 692 923
+aline 692 0
+stroke
+dfont endchar
+dfont char=132
+amove 230 0
+aline 999 0
+amove 615 0
+aline 615 846
+amove 230 461
+aline 999 461
+stroke
+dfont endchar
+dfont char=133
+amove 230 461
+aline 999 461
+amove 999 846
+aline 230 846
+amove 615 846
+aline 615 -1
+stroke
+dfont endchar
+dfont char=134
+amove 230 76
+aline 999 846
+amove 230 846
+aline 999 76
+stroke
+dfont endchar
+dfont char=135
+amove 307 538
+aline 230 461
+aline 307 384
+aline 384 461
+aline 307 538
+stroke
+dfont endchar
+dfont char=136
+amove 230 461
+aline 1153 461
+amove 692 153
+aline 615 76
+aline 692 -1
+aline 769 76
+aline 692 153
+amove 692 923
+aline 615 846
+aline 692 769
+aline 769 846
+aline 692 923
+stroke
+dfont endchar
+dfont char=137
+amove 230 307
+aline 1153 307
+amove 1153 615
+aline 230 615
+stroke
+dfont endchar
+dfont char=138
+amove 307 0
+aline 1076 923
+amove 1153 615
+aline 230 615
+amove 230 307
+aline 1153 307
+stroke
+dfont endchar
+dfont char=139
+amove 230 153
+aline 1153 153
+amove 1153 461
+aline 230 461
+amove 230 769
+aline 1153 769
+stroke
+dfont endchar
+dfont char=140
+amove 1000 923
+aline 230 461
+aline 1000 -1
+stroke
+dfont endchar
+dfont char=141
+amove 230 0
+aline 999 461
+aline 230 923
+stroke
+dfont endchar
+dfont char=142
+amove 230 0
+aline 999 0
+amove 999 307
+aline 230 307
+amove 999 384
+aline 230 692
+aline 999 1000
+stroke
+dfont endchar
+dfont char=143
+amove 230 0
+aline 999 0
+amove 999 307
+aline 230 307
+amove 230 384
+aline 999 692
+aline 230 1000
+stroke
+dfont endchar
+dfont char=144
+amove 1307 230
+aline 1153 230
+aline 1000 307
+aline 923 384
+aline 769 615
+aline 692 692
+aline 538 769
+aline 461 769
+aline 307 692
+aline 230 538
+aline 230 461
+aline 307 307
+aline 461 230
+aline 538 230
+aline 692 307
+aline 769 384
+aline 923 615
+aline 1000 692
+aline 1153 769
+aline 1307 769
+stroke
+dfont endchar
+dfont char=145
+amove 153 307
+aline 153 461
+aline 230 615
+aline 384 615
+aline 846 384
+aline 1000 384
+aline 1076 461
+amove 1076 615
+aline 1076 461
+aline 1000 307
+aline 846 307
+aline 384 538
+aline 230 538
+aline 153 461
+stroke
+dfont endchar
+dfont char=146
+amove 230 384
+aline 615 615
+aline 1000 384
+aline 615 538
+aline 230 384
+stroke
+dfont endchar
+dfont char=147
+amove 153 692
+aline 384 1000
+aline 461 923
+aline 153 692
+stroke
+dfont endchar
+dfont char=148
+amove 461 692
+aline 230 1000
+aline 153 923
+aline 461 692
+stroke
+dfont endchar
+dfont char=149
+amove 153 1000
+aline 230 846
+aline 384 769
+aline 538 769
+aline 692 846
+aline 769 1000
+aline 692 769
+aline 538 692
+aline 384 692
+aline 230 769
+aline 153 1000
+stroke
+dfont endchar
+dfont char=150
+amove 230 615
+aline 384 769
+aline 384 923
+aline 307 1000
+aline 230 923
+aline 307 846
+aline 384 923
+stroke
+dfont endchar
+dfont char=151
+amove 230 692
+aline 307 769
+aline 384 692
+aline 307 615
+aline 230 692
+aline 230 846
+aline 384 1000
+stroke
+dfont endchar
+dfont char=152
+amove 230 923
+aline 307 846
+aline 384 923
+aline 307 1000
+aline 230 923
+aline 230 769
+aline 384 615
+stroke
+dfont endchar
+dfont char=153
+amove 230 1000
+aline 384 846
+aline 384 692
+aline 307 615
+aline 230 692
+aline 307 769
+aline 384 692
+stroke
+dfont endchar
diff --git a/src/fonts/plsym2.afm b/src/fonts/plsym2.afm
new file mode 100644
index 0000000..5ec8a95
--- /dev/null
+++ b/src/fonts/plsym2.afm
@@ -0,0 +1,162 @@
+StartFontMetrics 2.0
+Comment Made from HERSHEY font file using SPLITFONT.BAS
+FontName PLSYM2
+EncodingScheme TEXENCODING
+FullName PLSYM2
+FamilyName PLSYM2
+Weight Medium
+ItalicAngle 0
+IsFixedPitch false
+UnderlinePosition -97
+UnderlineThickness 73
+FontBBox 0 -400 1001 1001
+CapHeight 729
+XHeight 151
+Descender -219
+Ascender 729
+StartCharMetrics 142
+C 32 ; WX 400 ; N C32 ; B 0 0 0 0 ;
+C 1 ; WX 846 ; N C1 ; B 161 53 700 592 ;
+C 2 ; WX 846 ; N C2 ; B 161 53 700 592 ;
+C 3 ; WX 846 ; N C3 ; B 161 53 700 592 ;
+C 4 ; WX 846 ; N C4 ; B 161 53 700 592 ;
+C 5 ; WX 846 ; N C5 ; B 161 53 700 592 ;
+C 6 ; WX 954 ; N C6 ; B 161 161 807 484 ;
+C 7 ; WX 523 ; N C7 ; B 107 0 430 646 ;
+C 8 ; WX 954 ; N C8 ; B 161 161 807 484 ;
+C 9 ; WX 523 ; N C9 ; B 107 0 430 646 ;
+C 10 ; WX 739 ; N C10 ; B 107 0 646 700 ;
+C 11 ; WX 846 ; N C11 ; B 107 0 753 700 ;
+C 12 ; WX 1062 ; N C12 ; B 107 0 1077 969 ;
+C 13 ; WX 954 ; N C13 ; B 107 -215 861 861 ;
+C 14 ; WX 954 ; N C14 ; B 107 -215 861 861 ;
+C 15 ; WX 1062 ; N C15 ; B 107 161 969 538 ;
+C 16 ; WX 846 ; N C16 ; B 107 0 753 700 ;
+C 17 ; WX 900 ; N C17 ; B 107 0 807 700 ;
+C 18 ; WX 900 ; N C18 ; B 107 0 807 700 ;
+C 19 ; WX 792 ; N C19 ; B 161 -215 646 861 ;
+C 20 ; WX 739 ; N C20 ; B 107 -215 646 700 ;
+C 21 ; WX 631 ; N C21 ; B 161 -215 484 700 ;
+C 22 ; WX 631 ; N C22 ; B 107 -215 538 700 ;
+C 23 ; WX 631 ; N C23 ; B 107 -215 538 700 ;
+C 24 ; WX 685 ; N C24 ; B 107 0 538 700 ;
+C 25 ; WX 1062 ; N C25 ; B 161 -53 915 700 ;
+C 26 ; WX 685 ; N C26 ; B 161 -53 538 700 ;
+C 27 ; WX 685 ; N C27 ; B 161 0 538 700 ;
+C 28 ; WX 1062 ; N C28 ; B 161 -53 915 700 ;
+C 29 ; WX 792 ; N C29 ; B 107 0 700 592 ;
+C 30 ; WX 846 ; N C30 ; B 107 0 753 700 ;
+C 31 ; WX 792 ; N C31 ; B 107 -53 700 700 ;
+C 32 ; WX 685 ; N C32 ; B 161 0 538 700 ;
+C 33 ; WX 846 ; N C33 ; B 107 -53 753 700 ;
+C 34 ; WX 792 ; N C34 ; B 107 0 699 700 ;
+C 35 ; WX 685 ; N C35 ; B 107 -53 592 700 ;
+C 36 ; WX 846 ; N C36 ; B 107 0 753 646 ;
+C 37 ; WX 739 ; N C37 ; B 107 53 646 592 ;
+C 38 ; WX 900 ; N C38 ; B 107 -53 807 700 ;
+C 39 ; WX 900 ; N C39 ; B 107 -53 807 700 ;
+C 40 ; WX 1277 ; N C40 ; B 107 -215 1184 861 ;
+C 41 ; WX 1115 ; N C41 ; B 107 -215 969 861 ;
+C 42 ; WX 739 ; N C42 ; B 214 -539 592 1184 ;
+C 43 ; WX 739 ; N C43 ; B 161 -539 538 1184 ;
+C 44 ; WX 739 ; N C44 ; B 214 -539 592 1184 ;
+C 45 ; WX 739 ; N C45 ; B 161 -539 538 1184 ;
+C 46 ; WX 792 ; N C46 ; B 268 -539 538 1184 ;
+C 47 ; WX 792 ; N C47 ; B 268 -539 538 1184 ;
+C 48 ; WX 739 ; N C48 ; B 214 -647 538 1292 ;
+C 49 ; WX 739 ; N C49 ; B 214 -647 538 1292 ;
+C 50 ; WX 1223 ; N C50 ; B 107 -539 1238 1615 ;
+C 51 ; WX 1277 ; N C51 ; B 107 -539 1184 1184 ;
+C 52 ; WX 851 ; N C52 ; B 133 133 733 466 ;
+C 53 ; WX 518 ; N C53 ; B 99 0 433 600 ;
+C 54 ; WX 851 ; N C54 ; B 133 133 733 466 ;
+C 55 ; WX 518 ; N C55 ; B 99 0 433 600 ;
+C 56 ; WX 618 ; N C56 ; B 99 0 532 700 ;
+C 57 ; WX 651 ; N C57 ; B 66 0 600 700 ;
+C 58 ; WX 1085 ; N C58 ; B 99 0 1100 1100 ;
+C 59 ; WX 784 ; N C59 ; B 66 -233 733 833 ;
+C 60 ; WX 784 ; N C60 ; B 66 -233 733 833 ;
+C 61 ; WX 818 ; N C61 ; B 99 166 733 433 ;
+C 62 ; WX 784 ; N C62 ; B 99 0 700 700 ;
+C 63 ; WX 818 ; N C63 ; B 99 0 733 700 ;
+C 64 ; WX 884 ; N C64 ; B 99 0 799 700 ;
+C 65 ; WX 651 ; N C65 ; B 99 -133 566 833 ;
+C 66 ; WX 685 ; N C66 ; B 99 -233 600 700 ;
+C 67 ; WX 518 ; N C67 ; B 99 -233 433 700 ;
+C 68 ; WX 518 ; N C68 ; B 66 -233 466 700 ;
+C 69 ; WX 518 ; N C69 ; B 66 -233 466 699 ;
+C 70 ; WX 618 ; N C70 ; B 66 0 500 700 ;
+C 71 ; WX 884 ; N C71 ; B 99 0 799 700 ;
+C 72 ; WX 551 ; N C72 ; B 99 0 466 700 ;
+C 73 ; WX 618 ; N C73 ; B 99 0 532 700 ;
+C 74 ; WX 918 ; N C74 ; B 99 -33 833 700 ;
+C 75 ; WX 818 ; N C75 ; B 99 32 733 666 ;
+C 76 ; WX 718 ; N C76 ; B 99 0 633 700 ;
+C 77 ; WX 618 ; N C77 ; B 66 0 532 700 ;
+C 78 ; WX 618 ; N C78 ; B 99 0 532 700 ;
+C 79 ; WX 751 ; N C79 ; B 99 0 666 700 ;
+C 80 ; WX 718 ; N C80 ; B 66 0 633 700 ;
+C 81 ; WX 618 ; N C81 ; B 99 -33 566 666 ;
+C 82 ; WX 818 ; N C82 ; B 99 0 733 633 ;
+C 83 ; WX 651 ; N C83 ; B 99 66 566 532 ;
+C 84 ; WX 784 ; N C84 ; B 66 -33 733 666 ;
+C 85 ; WX 784 ; N C85 ; B 66 -33 733 666 ;
+C 86 ; WX 585 ; N C86 ; B 66 66 532 532 ;
+C 87 ; WX 585 ; N C87 ; B 66 66 532 532 ;
+C 88 ; WX 585 ; N C88 ; B 66 66 532 532 ;
+C 89 ; WX 585 ; N C89 ; B 66 66 532 532 ;
+C 90 ; WX 818 ; N C90 ; B 99 0 733 666 ;
+C 91 ; WX 784 ; N C91 ; B 99 0 700 666 ;
+C 92 ; WX 784 ; N C92 ; B 99 66 700 666 ;
+C 93 ; WX 784 ; N C93 ; B 99 99 700 600 ;
+C 94 ; WX 751 ; N C94 ; B 99 0 666 666 ;
+C 95 ; WX 784 ; N C95 ; B 32 0 700 633 ;
+C 96 ; WX 784 ; N C96 ; B 99 66 700 666 ;
+C 97 ; WX 818 ; N C97 ; B 32 32 766 600 ;
+C 98 ; WX 718 ; N C98 ; B 99 66 633 600 ;
+C 99 ; WX 784 ; N C99 ; B 66 32 700 633 ;
+C 100 ; WX 784 ; N C100 ; B 99 199 700 500 ;
+C 101 ; WX 784 ; N C101 ; B 99 66 700 633 ;
+C 102 ; WX 251 ; N C102 ; B 99 266 166 333 ;
+C 103 ; WX 518 ; N C103 ; B 99 -100 433 366 ;
+C 104 ; WX 518 ; N C104 ; B 99 233 433 700 ;
+C 105 ; WX 651 ; N C105 ; B 99 133 566 466 ;
+C 106 ; WX 651 ; N C106 ; B 99 133 566 466 ;
+C 107 ; WX 551 ; N C107 ; B 99 133 466 466 ;
+C 108 ; WX 518 ; N C108 ; B 99 -100 433 700 ;
+C 109 ; WX 518 ; N C109 ; B 133 -100 399 700 ;
+C 110 ; WX 518 ; N C110 ; B 133 133 433 833 ;
+C 111 ; WX 851 ; N C111 ; B 99 500 766 600 ;
+C 112 ; WX 518 ; N C112 ; B 99 333 433 433 ;
+C 113 ; WX 518 ; N C113 ; B 99 66 433 532 ;
+C 114 ; WX 518 ; N C114 ; B 99 66 433 532 ;
+C 115 ; WX 952 ; N C115 ; B 99 -467 866 1567 ;
+C 116 ; WX 1085 ; N C116 ; B 99 -366 1000 633 ;
+C 117 ; WX 918 ; N C117 ; B 133 -300 799 899 ;
+C 118 ; WX 651 ; N C118 ; B 99 133 566 466 ;
+C 119 ; WX 651 ; N C119 ; B 99 133 566 466 ;
+C 120 ; WX 551 ; N C120 ; B 99 133 466 466 ;
+C 121 ; WX 518 ; N C121 ; B 99 -100 433 700 ;
+C 122 ; WX 518 ; N C122 ; B 133 -100 399 700 ;
+C 123 ; WX 518 ; N C123 ; B 133 133 433 833 ;
+C 124 ; WX 851 ; N C124 ; B 99 500 766 600 ;
+C 125 ; WX 518 ; N C125 ; B 99 333 433 433 ;
+C 126 ; WX 518 ; N C126 ; B 133 -200 433 799 ;
+C 127 ; WX 518 ; N C127 ; B 99 66 433 532 ;
+C 128 ; WX 1085 ; N C128 ; B 133 -533 1000 633 ;
+C 129 ; WX 918 ; N C129 ; B 133 -366 799 966 ;
+C 130 ; WX 1118 ; N C130 ; B 99 -233 1033 833 ;
+C 131 ; WX 1018 ; N C131 ; B 99 -233 933 833 ;
+C 132 ; WX 585 ; N C132 ; B 133 -1000 500 1600 ;
+C 133 ; WX 585 ; N C133 ; B 99 -1000 466 1600 ;
+C 134 ; WX 585 ; N C134 ; B 133 -1000 500 1600 ;
+C 135 ; WX 585 ; N C135 ; B 99 -1000 466 1600 ;
+C 136 ; WX 618 ; N C136 ; B 166 -1000 466 1600 ;
+C 137 ; WX 618 ; N C137 ; B 166 -1000 466 1600 ;
+C 138 ; WX 585 ; N C138 ; B 166 -900 433 1500 ;
+C 139 ; WX 585 ; N C139 ; B 166 -900 433 1500 ;
+C 140 ; WX 1151 ; N C140 ; B 99 -767 1166 1900 ;
+C 141 ; WX 985 ; N C141 ; B 99 -1000 899 1600 ;
+EndCharMetrics
+
+EndFontMetrics
diff --git a/src/fonts/plsym2.gle b/src/fonts/plsym2.gle
new file mode 100644
index 0000000..9fdb2e5
--- /dev/null
+++ b/src/fonts/plsym2.gle
@@ -0,0 +1,3802 @@
+dfont design= 1428
+dfont char=1
+amove 1000 846
+aline 538 846
+aline 384 769
+aline 307 692
+aline 230 538
+aline 230 384
+aline 307 230
+aline 384 153
+aline 538 76
+aline 1000 76
+stroke
+dfont endchar
+dfont char=2
+amove 230 846
+aline 230 384
+aline 307 230
+aline 384 153
+aline 538 76
+aline 692 76
+aline 846 153
+aline 923 230
+aline 1000 384
+aline 1000 846
+stroke
+dfont endchar
+dfont char=3
+amove 230 76
+aline 692 76
+aline 846 153
+aline 923 230
+aline 1000 384
+aline 1000 538
+aline 923 692
+aline 846 769
+aline 692 846
+aline 230 846
+stroke
+dfont endchar
+dfont char=4
+amove 230 76
+aline 230 538
+aline 307 692
+aline 384 769
+aline 538 846
+aline 692 846
+aline 846 769
+aline 923 692
+aline 1000 538
+aline 1000 76
+stroke
+dfont endchar
+dfont char=5
+amove 230 461
+aline 846 461
+amove 1000 846
+aline 538 846
+aline 384 769
+aline 307 692
+aline 230 538
+aline 230 384
+aline 307 230
+aline 384 153
+aline 538 76
+aline 1000 76
+stroke
+dfont endchar
+dfont char=6
+amove 230 461
+aline 1076 461
+amove 923 615
+aline 1076 461
+aline 923 307
+amove 846 230
+aline 923 307
+aline 1153 461
+aline 923 615
+aline 846 692
+stroke
+dfont endchar
+dfont char=7
+amove 384 0
+aline 384 846
+amove 230 692
+aline 384 846
+aline 538 692
+amove 615 615
+aline 538 692
+aline 384 923
+aline 230 692
+aline 153 615
+stroke
+dfont endchar
+dfont char=8
+amove 461 307
+aline 307 461
+aline 461 615
+amove 538 692
+aline 461 615
+aline 230 461
+aline 461 307
+aline 538 230
+amove 307 461
+aline 1153 461
+stroke
+dfont endchar
+dfont char=9
+amove 230 230
+aline 384 76
+aline 538 230
+amove 615 307
+aline 538 230
+aline 384 -1
+aline 230 230
+aline 153 307
+amove 384 76
+aline 384 923
+stroke
+dfont endchar
+dfont char=10
+amove 384 0
+aline 230 153
+aline 230 384
+aline 307 538
+aline 461 692
+amove 538 1000
+aline 461 923
+aline 384 923
+aline 461 1000
+aline 692 1000
+aline 846 923
+aline 923 769
+aline 923 538
+aline 846 307
+aline 769 153
+aline 692 76
+aline 538 0
+aline 384 0
+aline 230 76
+aline 153 230
+aline 153 384
+aline 230 538
+aline 307 615
+aline 461 692
+aline 615 692
+aline 769 615
+aline 846 384
+amove 538 0
+aline 692 153
+aline 769 307
+aline 846 538
+aline 846 769
+aline 769 923
+aline 692 1000
+stroke
+dfont endchar
+dfont char=11
+amove 615 0
+aline 1076 1000
+aline 153 1000
+aline 615 0
+amove 615 153
+aline 230 1000
+amove 307 923
+aline 1000 923
+stroke
+dfont endchar
+dfont char=12
+amove 153 692
+aline 384 692
+aline 846 76
+amove 846 -1
+aline 307 692
+amove 846 -1
+aline 1538 1384
+stroke
+dfont endchar
+dfont char=13
+amove 230 -231
+aline 230 -154
+aline 153 -154
+aline 153 -231
+aline 230 -308
+aline 384 -308
+aline 538 -154
+aline 615 -1
+aline 692 230
+aline 769 692
+aline 846 1000
+aline 923 1153
+amove 1153 1153
+aline 1153 1076
+aline 1230 1076
+aline 1230 1153
+aline 1153 1230
+aline 1000 1230
+aline 846 1076
+aline 769 923
+aline 692 692
+aline 615 230
+aline 538 -77
+aline 461 -231
+stroke
+dfont endchar
+dfont char=14
+amove 230 -231
+aline 230 -154
+aline 153 -154
+aline 153 -231
+aline 230 -308
+aline 384 -308
+aline 538 -154
+aline 615 -1
+aline 692 230
+aline 769 692
+aline 846 1000
+aline 923 1153
+amove 1153 1153
+aline 1153 1076
+aline 1230 1076
+aline 1230 1153
+aline 1153 1230
+aline 1000 1230
+aline 846 1076
+aline 769 923
+aline 692 692
+aline 615 230
+aline 538 -77
+aline 461 -231
+amove 615 769
+aline 461 692
+aline 384 538
+aline 384 384
+aline 461 230
+aline 615 153
+aline 769 153
+aline 923 230
+aline 1000 384
+aline 1000 538
+aline 923 692
+aline 769 769
+aline 615 769
+stroke
+dfont endchar
+dfont char=15
+amove 1384 461
+aline 1307 307
+aline 1153 230
+aline 1076 230
+aline 923 307
+aline 846 384
+aline 692 615
+aline 615 692
+aline 461 769
+aline 384 769
+aline 230 692
+aline 153 538
+aline 153 461
+aline 230 307
+aline 384 230
+aline 461 230
+aline 615 307
+aline 692 384
+aline 846 615
+aline 923 692
+aline 1076 769
+aline 1153 769
+aline 1307 692
+aline 1384 538
+aline 1384 461
+stroke
+dfont endchar
+dfont char=16
+amove 153 0
+aline 1076 1000
+aline 923 923
+aline 692 923
+aline 384 1000
+aline 230 1000
+aline 153 923
+aline 153 769
+aline 230 692
+aline 384 692
+aline 461 769
+aline 461 923
+aline 384 1000
+amove 846 307
+aline 769 230
+aline 769 76
+aline 846 0
+aline 1000 0
+aline 1076 76
+aline 1076 230
+aline 1000 307
+aline 846 307
+stroke
+dfont endchar
+dfont char=17
+amove 384 0
+aline 230 153
+aline 230 307
+aline 384 461
+amove 384 769
+aline 461 615
+aline 923 76
+aline 1000 -1
+amove 1153 76
+aline 1076 -1
+aline 1000 -1
+aline 846 76
+aline 461 538
+aline 384 769
+aline 384 923
+aline 461 1000
+aline 615 1000
+aline 692 923
+aline 692 769
+aline 615 615
+aline 384 461
+aline 230 384
+aline 153 307
+aline 153 153
+aline 230 76
+aline 384 0
+aline 538 0
+aline 692 76
+aline 769 153
+aline 846 307
+aline 923 615
+aline 1000 692
+aline 1076 692
+aline 1153 615
+aline 1153 538
+aline 1076 538
+aline 1076 615
+aline 1153 615
+stroke
+dfont endchar
+dfont char=18
+amove 923 76
+aline 692 -1
+aline 615 -1
+aline 384 76
+aline 230 230
+aline 153 461
+aline 153 538
+aline 230 769
+aline 384 923
+aline 615 1000
+aline 692 1000
+aline 923 923
+aline 1076 769
+aline 1153 538
+aline 1153 461
+aline 1076 307
+aline 923 307
+aline 846 384
+aline 846 692
+amove 846 615
+aline 692 692
+aline 538 692
+aline 461 538
+aline 461 461
+aline 538 307
+aline 692 307
+aline 846 384
+stroke
+dfont endchar
+dfont char=19
+amove 230 153
+aline 307 153
+aline 307 230
+aline 230 230
+aline 230 153
+aline 307 76
+aline 461 -1
+aline 692 -1
+aline 846 76
+aline 923 153
+aline 923 307
+aline 846 461
+aline 307 692
+aline 230 769
+amove 461 1230
+aline 461 -308
+amove 692 -308
+aline 692 1230
+amove 923 923
+aline 846 923
+aline 846 846
+aline 923 846
+aline 923 923
+aline 769 1000
+aline 384 1000
+aline 230 923
+aline 230 769
+aline 307 615
+aline 846 384
+aline 923 307
+stroke
+dfont endchar
+dfont char=20
+amove 153 153
+aline 846 153
+amove 923 538
+aline 230 538
+amove 538 1000
+aline 230 -308
+amove 538 -308
+aline 846 1000
+stroke
+dfont endchar
+dfont char=21
+amove 230 307
+aline 307 230
+aline 538 76
+aline 615 -77
+aline 615 -231
+aline 538 -308
+aline 384 -308
+aline 307 -231
+aline 307 -154
+aline 384 -154
+aline 384 -231
+aline 307 -231
+amove 615 -77
+aline 538 0
+aline 307 153
+aline 230 307
+aline 230 461
+aline 384 615
+amove 307 769
+aline 384 692
+aline 615 538
+aline 692 384
+aline 692 230
+aline 538 76
+amove 692 384
+aline 615 461
+aline 384 615
+aline 307 769
+aline 307 923
+aline 384 1000
+aline 538 1000
+aline 615 923
+aline 615 846
+aline 538 846
+aline 538 923
+aline 615 923
+stroke
+dfont endchar
+dfont char=22
+amove 461 153
+aline 461 -308
+amove 461 538
+aline 461 846
+amove 461 1000
+aline 384 923
+aline 461 846
+aline 538 923
+aline 461 1000
+amove 307 692
+aline 230 769
+aline 153 692
+aline 230 615
+aline 307 692
+aline 615 692
+aline 692 769
+aline 769 692
+aline 692 615
+aline 615 692
+amove 461 538
+aline 384 384
+aline 461 153
+aline 538 384
+aline 461 538
+stroke
+dfont endchar
+dfont char=23
+amove 307 0
+aline 230 76
+aline 153 0
+aline 230 -77
+aline 307 0
+aline 615 0
+aline 692 76
+aline 769 0
+aline 692 -77
+aline 615 0
+amove 461 153
+aline 538 230
+aline 384 461
+aline 461 538
+aline 461 846
+aline 384 923
+aline 461 1000
+aline 538 923
+aline 461 846
+amove 307 692
+aline 230 769
+aline 153 692
+aline 230 615
+aline 307 692
+aline 615 692
+aline 692 769
+aline 769 692
+aline 692 615
+aline 615 692
+amove 461 538
+aline 538 461
+aline 384 230
+aline 461 153
+aline 461 -154
+aline 384 -231
+aline 461 -308
+aline 538 -231
+aline 461 -154
+stroke
+dfont endchar
+dfont char=24
+amove 153 0
+aline 769 0
+aline 769 1000
+aline 153 1000
+amove 384 538
+aline 769 538
+stroke
+dfont endchar
+dfont char=25
+amove 692 1000
+aline 461 923
+aline 307 769
+aline 230 538
+aline 230 384
+aline 307 153
+aline 461 0
+aline 692 -77
+aline 846 -77
+aline 1076 0
+aline 1230 153
+aline 1307 384
+aline 1307 538
+aline 1230 769
+aline 1076 923
+aline 846 1000
+aline 692 1000
+amove 769 538
+aline 692 461
+aline 769 384
+aline 846 461
+aline 769 538
+stroke
+dfont endchar
+dfont char=26
+amove 230 76
+aline 769 76
+amove 538 230
+aline 538 -77
+amove 461 -77
+aline 461 230
+amove 461 769
+aline 307 692
+aline 230 538
+aline 230 461
+aline 307 307
+aline 461 230
+aline 538 230
+aline 692 307
+aline 769 461
+aline 769 538
+aline 692 692
+aline 538 769
+aline 461 769
+amove 384 769
+aline 307 846
+aline 307 923
+aline 384 1000
+amove 615 1000
+aline 692 923
+aline 692 846
+aline 615 769
+stroke
+dfont endchar
+dfont char=27
+amove 230 230
+aline 769 230
+amove 538 461
+aline 538 -1
+amove 461 -1
+aline 461 461
+amove 461 999
+aline 307 923
+aline 230 769
+aline 230 692
+aline 307 538
+aline 461 461
+aline 538 461
+aline 692 538
+aline 769 692
+aline 769 769
+aline 692 923
+aline 538 1000
+aline 461 1000
+stroke
+dfont endchar
+dfont char=28
+amove 692 1000
+aline 461 923
+aline 307 769
+aline 230 538
+aline 230 384
+aline 307 153
+aline 461 0
+aline 692 -77
+aline 846 -77
+aline 1076 0
+aline 1230 153
+aline 1307 384
+aline 1307 538
+aline 1230 769
+aline 1076 923
+aline 846 1000
+aline 692 1000
+amove 769 1000
+aline 769 -77
+amove 230 461
+aline 1307 461
+stroke
+dfont endchar
+dfont char=29
+amove 615 461
+aline 692 307
+aline 692 230
+aline 615 76
+aline 461 -1
+aline 384 -1
+aline 230 76
+aline 153 230
+aline 153 307
+aline 230 461
+aline 384 538
+aline 461 538
+aline 615 461
+aline 1000 846
+amove 1000 461
+aline 1000 846
+aline 615 846
+aline 923 769
+aline 1000 461
+stroke
+dfont endchar
+dfont char=30
+amove 307 307
+aline 461 384
+aline 538 461
+aline 615 615
+aline 615 769
+aline 538 923
+aline 384 1000
+aline 230 1000
+aline 153 923
+amove 384 1000
+aline 461 923
+aline 538 769
+aline 538 538
+aline 461 384
+amove 307 307
+aline 1076 307
+amove 846 0
+aline 923 1000
+amove 1000 1000
+aline 769 0
+stroke
+dfont endchar
+dfont char=31
+amove 307 230
+aline 307 999
+amove 384 999
+aline 307 461
+aline 384 615
+aline 538 692
+aline 692 692
+aline 846 615
+aline 923 538
+aline 923 307
+aline 769 153
+aline 769 0
+aline 846 -77
+aline 923 -77
+aline 1000 0
+amove 769 153
+aline 846 307
+aline 846 538
+aline 692 692
+amove 384 1000
+aline 153 1000
+stroke
+dfont endchar
+dfont char=32
+amove 461 307
+aline 461 230
+aline 538 230
+aline 538 307
+aline 461 307
+amove 461 538
+aline 461 1000
+aline 230 769
+amove 461 538
+aline 307 461
+aline 230 307
+aline 230 230
+aline 307 76
+aline 461 -1
+aline 538 -1
+aline 692 76
+aline 769 230
+aline 769 307
+aline 692 461
+aline 538 538
+aline 538 1000
+aline 769 769
+stroke
+dfont endchar
+dfont char=33
+amove 384 153
+aline 846 153
+amove 615 -77
+aline 615 999
+amove 538 846
+aline 615 1000
+aline 692 846
+amove 923 846
+aline 1000 1000
+aline 1076 846
+amove 1000 1000
+aline 1000 615
+aline 923 461
+aline 769 384
+aline 461 384
+aline 307 461
+aline 230 615
+aline 230 1000
+amove 153 846
+aline 230 1000
+aline 307 846
+stroke
+dfont endchar
+dfont char=34
+amove 153 0
+aline 923 0
+aline 923 230
+aline 846 0
+amove 384 0
+aline 384 1000
+amove 307 1000
+aline 307 0
+amove 384 461
+aline 692 461
+aline 923 538
+aline 999 692
+aline 999 769
+aline 923 923
+aline 692 1000
+aline 153 1000
+amove 692 1000
+aline 846 923
+aline 923 769
+aline 923 692
+aline 846 538
+aline 692 461
+stroke
+dfont endchar
+dfont char=35
+amove 846 -77
+aline 615 -77
+aline 384 0
+aline 230 153
+aline 153 384
+aline 153 538
+aline 230 769
+aline 384 923
+aline 615 1000
+aline 846 1000
+aline 615 923
+aline 461 769
+aline 384 538
+aline 384 384
+aline 461 153
+aline 615 0
+aline 846 -77
+stroke
+dfont endchar
+dfont char=36
+amove 538 538
+aline 692 923
+amove 1000 846
+aline 615 461
+aline 692 307
+aline 692 230
+aline 615 76
+aline 461 -1
+aline 384 -1
+aline 230 76
+aline 153 230
+aline 153 307
+aline 230 461
+aline 384 538
+aline 461 538
+aline 615 461
+amove 692 384
+aline 1076 538
+stroke
+dfont endchar
+dfont char=37
+amove 153 307
+aline 923 615
+amove 923 307
+aline 153 615
+amove 384 846
+aline 692 76
+amove 384 76
+aline 692 846
+stroke
+dfont endchar
+dfont char=38
+amove 384 230
+aline 230 230
+aline 153 153
+aline 153 -1
+aline 230 -77
+aline 384 -77
+aline 461 -1
+aline 461 153
+aline 307 307
+aline 230 461
+aline 230 692
+aline 307 846
+aline 384 923
+aline 538 1000
+aline 769 1000
+aline 923 923
+aline 1000 846
+aline 1076 692
+aline 1076 461
+aline 1000 307
+aline 846 153
+aline 846 0
+aline 923 -77
+aline 1076 -77
+aline 1153 0
+aline 1153 153
+aline 1076 230
+aline 923 230
+amove 307 846
+aline 461 923
+aline 846 923
+aline 1000 846
+stroke
+dfont endchar
+dfont char=39
+amove 384 692
+aline 230 692
+aline 153 769
+aline 153 923
+aline 230 1000
+aline 384 1000
+aline 461 923
+aline 461 769
+aline 307 615
+aline 230 461
+aline 230 230
+aline 307 76
+aline 384 0
+aline 538 -77
+aline 769 -77
+aline 923 0
+aline 1000 76
+aline 1076 230
+aline 1076 461
+aline 1000 615
+aline 846 769
+aline 846 923
+aline 923 1000
+aline 1076 1000
+aline 1153 923
+aline 1153 769
+aline 1076 692
+aline 923 692
+amove 307 76
+aline 461 0
+aline 846 0
+aline 1000 76
+stroke
+dfont endchar
+dfont char=40
+amove 153 -308
+aline 692 -308
+amove 461 -308
+aline 461 1230
+amove 384 1230
+aline 384 -308
+amove 1153 -308
+aline 1692 -308
+amove 1461 -308
+aline 1461 1230
+amove 1384 1230
+aline 1384 -308
+amove 1692 1230
+aline 153 1230
+stroke
+dfont endchar
+dfont char=41
+amove 230 -231
+aline 1230 -231
+amove 1230 -308
+aline 1384 76
+aline 1307 -308
+aline 153 -308
+aline 769 538
+aline 230 1230
+amove 153 1230
+aline 692 538
+amove 153 1230
+aline 1307 1230
+aline 1384 846
+aline 1230 1230
+stroke
+dfont endchar
+dfont char=42
+amove 692 -616
+aline 538 -308
+aline 461 -77
+aline 384 307
+aline 384 615
+aline 461 1000
+aline 538 1230
+aline 692 1538
+amove 846 1692
+aline 692 1538
+aline 538 1307
+aline 384 1000
+aline 307 615
+aline 307 307
+aline 384 -77
+aline 538 -385
+aline 692 -616
+aline 846 -770
+stroke
+dfont endchar
+dfont char=43
+amove 384 -616
+aline 538 -308
+aline 615 -77
+aline 692 307
+aline 692 615
+aline 615 1000
+aline 538 1230
+aline 384 1538
+amove 230 1692
+aline 384 1538
+aline 538 1307
+aline 692 1000
+aline 769 615
+aline 769 307
+aline 692 -77
+aline 538 -385
+aline 384 -616
+aline 230 -770
+stroke
+dfont endchar
+dfont char=44
+amove 307 -770
+aline 307 1692
+aline 846 1692
+amove 384 1692
+aline 384 -770
+amove 307 -770
+aline 846 -770
+stroke
+dfont endchar
+dfont char=45
+amove 230 -770
+aline 769 -770
+aline 769 1692
+aline 230 1692
+amove 692 1692
+aline 692 -770
+stroke
+dfont endchar
+dfont char=46
+amove 615 153
+aline 538 -77
+aline 538 -385
+aline 615 -616
+amove 769 -770
+aline 538 -539
+aline 461 -308
+aline 461 -154
+aline 538 76
+aline 692 230
+aline 692 307
+aline 384 461
+aline 692 615
+aline 692 692
+aline 538 846
+aline 461 1076
+aline 461 1230
+aline 538 1461
+aline 769 1692
+amove 615 1538
+aline 538 1307
+aline 538 1000
+aline 615 769
+stroke
+dfont endchar
+dfont char=47
+amove 538 153
+aline 615 -77
+aline 615 -385
+aline 538 -616
+amove 384 -770
+aline 615 -539
+aline 692 -308
+aline 692 -154
+aline 615 76
+aline 461 230
+aline 461 307
+aline 769 461
+aline 461 615
+aline 461 692
+aline 615 846
+aline 692 1076
+aline 692 1230
+aline 615 1461
+aline 384 1692
+amove 538 1538
+aline 615 1307
+aline 615 1000
+aline 538 769
+stroke
+dfont endchar
+dfont char=48
+amove 538 -693
+aline 615 -539
+aline 692 -308
+aline 692 -77
+aline 615 153
+aline 384 692
+aline 307 923
+aline 307 1153
+aline 384 1384
+aline 538 1615
+aline 769 1846
+amove 538 1615
+aline 461 1461
+aline 384 1230
+aline 384 999
+aline 461 769
+aline 692 230
+aline 769 -1
+aline 769 -231
+aline 692 -462
+aline 538 -693
+aline 307 -924
+stroke
+dfont endchar
+dfont char=49
+amove 538 -693
+aline 461 -539
+aline 384 -308
+aline 384 -77
+aline 461 153
+aline 692 692
+aline 769 923
+aline 769 1153
+aline 692 1384
+aline 538 1615
+aline 307 1846
+amove 538 1615
+aline 615 1461
+aline 692 1230
+aline 692 999
+aline 615 769
+aline 384 230
+aline 307 -1
+aline 307 -231
+aline 384 -462
+aline 538 -693
+aline 769 -924
+stroke
+dfont endchar
+dfont char=50
+amove 153 461
+aline 461 461
+aline 1307 -616
+amove 1307 -693
+aline 461 384
+amove 384 384
+aline 1307 -770
+aline 1769 2307
+stroke
+dfont endchar
+dfont char=51
+amove 230 -693
+aline 307 -616
+aline 230 -539
+aline 153 -616
+aline 153 -693
+aline 230 -770
+aline 384 -770
+aline 538 -693
+aline 692 -539
+aline 769 -385
+aline 846 -154
+aline 923 153
+aline 1076 1076
+aline 1153 1384
+aline 1230 1538
+amove 1615 1615
+aline 1538 1538
+aline 1615 1461
+aline 1692 1538
+aline 1692 1615
+aline 1615 1692
+aline 1461 1692
+aline 1307 1615
+aline 1153 1461
+aline 1076 1307
+aline 1000 1076
+aline 923 769
+aline 769 -154
+aline 692 -462
+aline 615 -616
+stroke
+dfont endchar
+dfont char=52
+amove 190 428
+aline 1000 428
+amove 904 523
+aline 1047 428
+aline 904 333
+amove 761 190
+aline 1000 428
+aline 761 666
+stroke
+dfont endchar
+dfont char=53
+amove 380 0
+aline 380 809
+amove 285 714
+aline 380 857
+aline 476 714
+amove 619 571
+aline 380 809
+aline 142 571
+stroke
+dfont endchar
+dfont char=54
+amove 333 523
+aline 190 428
+aline 333 333
+amove 476 666
+aline 238 428
+aline 476 190
+amove 238 428
+aline 1047 428
+stroke
+dfont endchar
+dfont char=55
+amove 285 142
+aline 380 0
+aline 476 142
+amove 380 47
+aline 380 857
+amove 142 285
+aline 380 47
+aline 619 285
+stroke
+dfont endchar
+dfont char=56
+amove 238 47
+aline 190 142
+aline 190 333
+aline 238 476
+aline 333 619
+aline 428 666
+amove 333 904
+aline 333 857
+aline 285 857
+aline 285 904
+aline 333 952
+aline 428 1000
+aline 571 1000
+aline 666 952
+aline 714 904
+aline 761 761
+aline 761 523
+aline 714 285
+aline 666 142
+aline 571 47
+aline 428 0
+aline 333 0
+aline 238 47
+aline 190 95
+aline 142 190
+aline 142 333
+aline 190 476
+aline 285 619
+aline 428 666
+aline 523 666
+aline 619 619
+aline 666 571
+aline 714 428
+amove 428 0
+aline 523 47
+aline 619 142
+aline 666 285
+aline 714 523
+aline 714 761
+aline 666 904
+aline 571 1000
+stroke
+dfont endchar
+dfont char=57
+amove 476 0
+aline 857 1000
+aline 95 1000
+aline 476 0
+amove 476 95
+aline 142 1000
+amove 142 952
+aline 809 952
+stroke
+dfont endchar
+dfont char=58
+amove 142 666
+aline 380 666
+aline 809 95
+amove 809 -1
+aline 333 619
+amove 809 0
+aline 1571 1571
+stroke
+dfont endchar
+dfont char=59
+amove 142 -286
+aline 190 -239
+aline 142 -191
+aline 95 -239
+aline 95 -286
+aline 142 -334
+aline 238 -334
+aline 333 -286
+aline 428 -191
+aline 476 -96
+aline 523 47
+aline 571 238
+aline 666 809
+aline 714 1000
+aline 761 1095
+amove 1000 1142
+aline 952 1095
+aline 1000 1047
+aline 1047 1095
+aline 1047 1142
+aline 1000 1190
+aline 904 1190
+aline 809 1142
+aline 714 1047
+aline 666 952
+aline 619 809
+aline 571 619
+aline 476 47
+aline 428 -143
+aline 380 -239
+stroke
+dfont endchar
+dfont char=60
+amove 142 -286
+aline 190 -239
+aline 142 -191
+aline 95 -239
+aline 95 -286
+aline 142 -334
+aline 238 -334
+aline 333 -286
+aline 428 -191
+aline 476 -96
+aline 523 47
+aline 571 238
+aline 666 809
+aline 714 1000
+aline 761 1095
+amove 1000 1142
+aline 952 1095
+aline 1000 1047
+aline 1047 1095
+aline 1047 1142
+aline 1000 1190
+aline 904 1190
+aline 809 1142
+aline 714 1047
+aline 666 952
+aline 619 809
+aline 571 619
+aline 476 47
+aline 428 -143
+aline 380 -239
+amove 523 761
+aline 380 714
+aline 285 619
+aline 238 476
+aline 238 380
+aline 285 238
+aline 380 142
+aline 523 95
+aline 619 95
+aline 761 142
+aline 857 238
+aline 904 380
+aline 904 476
+aline 857 619
+aline 761 714
+aline 619 761
+aline 523 761
+stroke
+dfont endchar
+dfont char=61
+amove 1047 380
+aline 1000 285
+aline 904 238
+aline 809 238
+aline 714 285
+aline 666 333
+aline 523 523
+aline 476 571
+aline 380 619
+aline 285 619
+aline 190 571
+aline 142 476
+aline 142 380
+aline 190 285
+aline 285 238
+aline 380 238
+aline 476 285
+aline 523 333
+aline 666 523
+aline 714 571
+aline 809 619
+aline 904 619
+aline 1000 571
+aline 1047 476
+aline 1047 380
+stroke
+dfont endchar
+dfont char=62
+amove 142 0
+aline 1000 1000
+aline 904 952
+aline 761 904
+aline 619 904
+aline 476 952
+aline 380 1000
+aline 285 1000
+aline 190 952
+aline 142 857
+aline 142 761
+aline 238 666
+aline 333 666
+aline 428 714
+aline 476 809
+aline 476 904
+aline 380 1000
+amove 809 333
+aline 714 285
+aline 666 190
+aline 666 95
+aline 761 0
+aline 857 0
+aline 952 47
+aline 1000 142
+aline 1000 238
+aline 904 333
+aline 809 333
+stroke
+dfont endchar
+dfont char=63
+amove 333 0
+aline 238 47
+aline 190 142
+aline 190 285
+aline 238 380
+aline 333 476
+amove 333 761
+aline 380 666
+aline 761 142
+aline 857 47
+aline 952 0
+amove 1047 95
+aline 1047 47
+aline 1000 0
+aline 952 0
+aline 809 47
+aline 714 142
+aline 476 476
+aline 380 619
+aline 333 761
+aline 333 857
+aline 380 952
+aline 476 1000
+aline 571 952
+aline 619 857
+aline 619 761
+aline 571 666
+aline 476 571
+aline 190 380
+aline 142 285
+aline 142 142
+aline 190 47
+aline 333 0
+aline 476 0
+aline 571 47
+aline 666 142
+aline 761 285
+aline 857 523
+aline 904 619
+aline 952 666
+aline 1000 666
+aline 1047 619
+aline 1047 571
+aline 1000 523
+aline 952 571
+aline 1000 619
+stroke
+dfont endchar
+dfont char=64
+amove 523 238
+aline 476 285
+aline 428 380
+aline 428 523
+aline 476 666
+aline 571 761
+amove 857 761
+aline 809 380
+aline 809 285
+aline 904 238
+aline 999 238
+aline 1095 333
+aline 1142 476
+aline 1142 571
+aline 1095 714
+aline 1047 809
+aline 952 904
+aline 857 952
+aline 714 1000
+aline 571 1000
+aline 428 952
+aline 333 904
+aline 238 809
+aline 190 714
+aline 142 571
+aline 142 428
+aline 190 285
+aline 238 190
+aline 333 95
+aline 428 47
+aline 571 0
+aline 714 0
+aline 857 47
+aline 952 95
+aline 1000 142
+amove 904 238
+aline 857 285
+aline 857 380
+aline 904 761
+amove 857 619
+aline 809 714
+aline 714 761
+aline 571 761
+aline 476 714
+aline 428 666
+aline 380 523
+aline 380 380
+aline 428 285
+aline 523 238
+aline 666 238
+aline 761 285
+aline 809 380
+stroke
+dfont endchar
+dfont char=65
+amove 190 142
+aline 238 190
+aline 190 238
+aline 142 190
+aline 142 142
+aline 238 47
+aline 380 0
+aline 571 0
+aline 714 47
+aline 809 142
+aline 809 333
+aline 761 428
+aline 714 476
+aline 619 523
+aline 333 619
+aline 238 666
+aline 142 761
+amove 380 1190
+aline 380 -191
+amove 571 -191
+aline 571 1190
+amove 761 857
+aline 714 809
+aline 761 761
+aline 809 809
+aline 809 857
+aline 714 952
+aline 571 1000
+aline 380 1000
+aline 238 952
+aline 142 857
+aline 142 761
+aline 190 666
+aline 238 619
+aline 333 571
+aline 619 476
+aline 714 428
+aline 809 333
+stroke
+dfont endchar
+dfont char=66
+amove 142 190
+aline 809 190
+amove 857 476
+aline 190 476
+amove 523 1000
+aline 190 -334
+amove 476 -334
+aline 809 1000
+stroke
+dfont endchar
+dfont char=67
+amove 190 238
+aline 428 95
+aline 523 -1
+aline 571 -96
+aline 571 -191
+aline 523 -286
+aline 428 -334
+aline 333 -334
+aline 238 -286
+aline 190 -191
+aline 190 -143
+aline 238 -96
+aline 285 -143
+aline 238 -191
+amove 476 47
+aline 571 142
+aline 619 238
+aline 619 333
+aline 571 428
+aline 476 523
+aline 238 666
+amove 285 619
+aline 190 523
+aline 142 428
+aline 142 333
+aline 190 238
+aline 285 142
+aline 523 0
+amove 571 428
+aline 333 571
+aline 238 666
+aline 190 761
+aline 190 857
+aline 238 952
+aline 333 1000
+aline 428 1000
+aline 523 952
+aline 571 857
+aline 571 809
+aline 523 761
+aline 476 809
+aline 523 857
+stroke
+dfont endchar
+dfont char=68
+amove 380 -334
+aline 380 1000
+aline 428 904
+aline 380 809
+aline 333 904
+aline 380 1000
+amove 476 666
+aline 571 619
+aline 666 666
+aline 571 714
+aline 476 666
+amove 666 666
+aline 95 666
+aline 190 714
+aline 285 666
+aline 190 619
+aline 95 666
+amove 380 476
+aline 333 333
+aline 380 -334
+aline 428 333
+aline 380 476
+stroke
+dfont endchar
+dfont char=69
+amove 95 0
+aline 190 47
+aline 285 0
+aline 190 -48
+aline 95 0
+aline 666 0
+amove 476 0
+aline 571 -48
+aline 666 0
+aline 571 47
+aline 476 0
+amove 380 -143
+aline 333 -239
+aline 380 -334
+aline 428 -239
+aline 380 -143
+amove 380 -334
+aline 380 333
+aline 380 999
+aline 428 904
+aline 380 809
+aline 333 904
+aline 380 999
+amove 476 666
+aline 571 619
+aline 666 666
+aline 571 714
+aline 476 666
+amove 380 523
+aline 333 428
+aline 428 238
+aline 380 142
+aline 333 238
+aline 428 428
+aline 380 523
+amove 95 666
+aline 190 714
+aline 285 666
+aline 190 619
+aline 95 666
+aline 666 666
+stroke
+dfont endchar
+dfont char=70
+amove 95 0
+aline 714 0
+aline 714 1000
+aline 95 1000
+amove 333 523
+aline 714 523
+stroke
+dfont endchar
+dfont char=71
+amove 571 1000
+aline 428 952
+aline 285 857
+aline 190 714
+aline 142 571
+aline 142 428
+aline 190 285
+aline 285 142
+aline 428 47
+aline 571 0
+aline 714 0
+aline 857 47
+aline 1000 142
+aline 1095 285
+aline 1142 428
+aline 1142 571
+aline 1095 714
+aline 1000 857
+aline 857 952
+aline 714 1000
+aline 571 1000
+amove 619 571
+aline 571 523
+aline 571 476
+aline 619 428
+aline 666 428
+aline 714 476
+aline 714 523
+aline 666 571
+aline 619 571
+amove 619 523
+aline 619 476
+aline 666 476
+aline 666 523
+aline 619 523
+stroke
+dfont endchar
+dfont char=72
+amove 190 142
+aline 619 142
+amove 428 285
+aline 428 0
+amove 380 0
+aline 380 285
+amove 333 809
+aline 238 857
+aline 190 952
+aline 285 1000
+aline 238 952
+aline 238 857
+amove 333 809
+aline 238 761
+aline 190 714
+aline 142 619
+aline 142 476
+aline 190 380
+aline 238 333
+aline 333 285
+aline 476 285
+aline 571 333
+aline 619 380
+aline 666 476
+aline 666 619
+aline 619 714
+aline 571 761
+aline 476 809
+aline 333 809
+amove 476 809
+aline 571 857
+aline 619 952
+aline 523 1000
+aline 571 952
+aline 571 857
+stroke
+dfont endchar
+dfont char=73
+amove 238 190
+aline 666 190
+amove 476 380
+aline 476 0
+amove 428 0
+aline 428 380
+amove 428 1000
+aline 285 952
+aline 190 857
+aline 142 714
+aline 142 666
+aline 190 523
+aline 285 428
+aline 428 380
+aline 476 380
+aline 619 428
+aline 714 523
+aline 761 666
+aline 761 714
+aline 714 857
+aline 619 952
+aline 476 1000
+aline 428 1000
+stroke
+dfont endchar
+dfont char=74
+amove 571 1000
+aline 428 952
+aline 285 857
+aline 190 714
+aline 142 571
+aline 142 380
+aline 190 238
+aline 285 95
+aline 428 0
+aline 571 -48
+aline 761 -48
+aline 904 0
+aline 1047 95
+aline 1142 238
+aline 1190 380
+aline 1190 571
+aline 1142 714
+aline 1047 857
+aline 904 952
+aline 761 1000
+aline 571 1000
+amove 666 1000
+aline 666 -48
+amove 142 476
+aline 1190 476
+stroke
+dfont endchar
+dfont char=75
+amove 428 666
+aline 285 619
+aline 190 523
+aline 142 380
+aline 142 333
+aline 190 190
+aline 285 95
+aline 428 47
+aline 476 47
+aline 619 95
+aline 714 190
+aline 761 333
+aline 761 380
+aline 714 523
+aline 619 619
+aline 476 666
+aline 428 666
+amove 666 619
+aline 952 904
+aline 761 952
+aline 1047 952
+aline 1047 666
+aline 1000 857
+aline 714 571
+amove 714 619
+aline 1000 904
+stroke
+dfont endchar
+dfont char=76
+amove 238 285
+aline 380 380
+aline 476 476
+aline 523 571
+aline 571 714
+aline 571 857
+aline 523 952
+aline 428 1000
+aline 285 1000
+aline 190 952
+aline 142 857
+amove 428 1000
+aline 476 952
+aline 523 857
+aline 523 666
+aline 476 523
+aline 380 380
+amove 238 285
+aline 904 285
+amove 666 -1
+aline 761 999
+amove 809 999
+aline 619 -1
+stroke
+dfont endchar
+dfont char=77
+amove 190 285
+aline 190 1000
+amove 238 1000
+aline 190 476
+aline 238 571
+aline 285 619
+aline 380 666
+aline 523 666
+aline 666 619
+aline 714 523
+aline 714 428
+aline 666 333
+aline 571 238
+amove 761 95
+aline 666 0
+aline 571 0
+aline 523 47
+aline 523 142
+aline 666 428
+aline 666 523
+aline 619 619
+aline 523 666
+amove 238 1000
+aline 95 1000
+stroke
+dfont endchar
+dfont char=78
+amove 428 333
+aline 428 285
+aline 476 285
+aline 476 333
+aline 428 333
+amove 428 380
+aline 380 333
+aline 380 285
+aline 428 238
+aline 476 238
+aline 523 285
+aline 523 333
+aline 476 380
+aline 428 380
+amove 428 619
+aline 476 619
+aline 619 571
+aline 714 476
+aline 761 333
+aline 761 285
+aline 714 142
+aline 619 47
+aline 476 -1
+aline 428 -1
+aline 285 47
+aline 190 142
+aline 142 285
+aline 142 333
+aline 190 476
+aline 285 571
+aline 428 619
+aline 428 1000
+aline 238 809
+aline 428 904
+amove 476 904
+aline 666 809
+aline 476 1000
+aline 476 619
+stroke
+dfont endchar
+dfont char=79
+amove 333 190
+aline 761 190
+amove 571 0
+aline 571 1000
+aline 619 904
+amove 476 904
+aline 523 1000
+aline 523 0
+amove 523 380
+aline 476 380
+aline 333 428
+aline 238 523
+aline 190 666
+aline 190 1000
+aline 142 904
+amove 285 904
+aline 238 1000
+aline 238 619
+aline 285 476
+amove 571 380
+aline 619 380
+aline 761 428
+aline 857 523
+aline 904 666
+aline 904 1000
+aline 952 904
+amove 809 904
+aline 857 1000
+aline 857 619
+aline 809 476
+stroke
+dfont endchar
+dfont char=80
+amove 95 0
+aline 857 0
+aline 857 238
+aline 809 0
+amove 666 476
+aline 761 523
+aline 809 571
+aline 857 666
+aline 857 809
+aline 809 904
+aline 761 952
+aline 666 1000
+amove 285 1000
+aline 285 0
+amove 238 0
+aline 238 1000
+amove 95 1000
+aline 666 1000
+aline 809 952
+aline 857 904
+aline 904 809
+aline 904 666
+aline 857 571
+aline 809 523
+aline 666 476
+aline 285 476
+stroke
+dfont endchar
+dfont char=81
+amove 809 -48
+aline 619 -48
+aline 428 -1
+aline 285 95
+aline 190 238
+aline 142 380
+aline 142 523
+aline 190 666
+aline 285 809
+aline 428 904
+aline 619 952
+aline 809 952
+aline 666 904
+aline 523 809
+aline 428 666
+aline 380 523
+aline 380 380
+aline 428 238
+aline 523 95
+aline 666 -1
+aline 809 -48
+stroke
+dfont endchar
+dfont char=82
+amove 428 476
+aline 333 476
+aline 238 428
+aline 190 380
+aline 142 285
+aline 142 190
+aline 190 95
+aline 238 47
+aline 333 0
+aline 428 0
+aline 523 47
+aline 571 95
+aline 619 190
+aline 619 285
+aline 571 380
+aline 523 428
+aline 428 476
+amove 476 476
+aline 619 904
+amove 952 809
+aline 571 428
+amove 619 333
+aline 1047 476
+stroke
+dfont endchar
+dfont char=83
+amove 142 285
+aline 809 571
+amove 619 761
+aline 333 95
+amove 619 95
+aline 333 761
+amove 142 571
+aline 809 285
+stroke
+dfont endchar
+dfont char=84
+amove 380 238
+aline 285 285
+aline 238 285
+aline 142 238
+aline 95 142
+aline 95 95
+aline 142 -1
+aline 238 -48
+aline 285 -48
+aline 380 -1
+aline 428 95
+aline 428 142
+aline 380 238
+aline 238 428
+aline 190 571
+aline 190 666
+aline 238 809
+aline 333 904
+aline 476 952
+aline 666 952
+aline 809 904
+aline 904 809
+aline 952 666
+aline 952 571
+aline 904 428
+aline 761 238
+aline 714 142
+aline 714 95
+aline 761 0
+aline 857 -48
+aline 904 -48
+aline 1000 0
+aline 1047 95
+aline 1047 142
+aline 1000 238
+aline 904 285
+aline 857 285
+aline 761 238
+amove 190 666
+aline 238 761
+aline 333 857
+aline 476 904
+aline 666 904
+aline 809 857
+aline 904 761
+aline 952 666
+stroke
+dfont endchar
+dfont char=85
+amove 190 238
+aline 238 142
+aline 333 47
+aline 476 -1
+aline 666 -1
+aline 809 47
+aline 904 142
+aline 952 238
+amove 761 666
+aline 857 619
+aline 904 619
+aline 1000 666
+aline 1047 761
+aline 1047 809
+aline 1000 904
+aline 904 952
+aline 857 952
+aline 761 904
+aline 714 809
+aline 714 761
+aline 761 666
+aline 904 476
+aline 952 333
+aline 952 238
+aline 904 95
+aline 809 0
+aline 666 -48
+aline 476 -48
+aline 333 0
+aline 238 95
+aline 190 238
+aline 190 333
+aline 238 476
+aline 380 666
+aline 428 761
+aline 428 809
+aline 380 904
+aline 285 952
+aline 238 952
+aline 142 904
+aline 95 809
+aline 95 761
+aline 142 666
+aline 238 619
+aline 285 619
+aline 380 666
+stroke
+dfont endchar
+dfont char=86
+amove 95 95
+aline 761 761
+amove 571 714
+aline 714 714
+aline 714 571
+amove 714 380
+aline 714 571
+aline 761 761
+aline 571 714
+aline 380 714
+stroke
+dfont endchar
+dfont char=87
+amove 95 95
+aline 761 761
+amove 142 476
+aline 142 285
+aline 95 95
+aline 285 142
+aline 476 142
+amove 285 142
+aline 142 142
+aline 142 285
+stroke
+dfont endchar
+dfont char=88
+amove 142 380
+aline 142 571
+aline 95 761
+aline 285 714
+aline 476 714
+amove 285 714
+aline 142 714
+aline 142 571
+amove 95 761
+aline 761 95
+stroke
+dfont endchar
+dfont char=89
+amove 95 761
+aline 761 95
+amove 380 142
+aline 571 142
+aline 761 95
+aline 714 285
+aline 714 476
+amove 571 142
+aline 714 142
+aline 714 285
+stroke
+dfont endchar
+dfont char=90
+amove 571 0
+aline 571 523
+aline 523 714
+aline 476 809
+aline 428 857
+aline 333 904
+aline 238 904
+aline 142 809
+amove 190 666
+aline 142 714
+aline 142 809
+aline 190 904
+aline 285 952
+aline 380 952
+aline 476 904
+aline 523 857
+aline 571 761
+aline 619 523
+amove 571 523
+aline 619 761
+aline 666 857
+aline 714 904
+aline 809 952
+aline 904 952
+aline 1000 904
+aline 1047 809
+aline 1047 714
+aline 1000 666
+amove 1047 809
+aline 952 904
+aline 857 904
+aline 761 857
+aline 714 809
+aline 666 714
+aline 619 523
+aline 619 0
+stroke
+dfont endchar
+dfont char=91
+amove 380 95
+aline 333 238
+aline 333 380
+aline 380 476
+aline 476 523
+amove 476 571
+aline 380 523
+aline 333 476
+aline 285 380
+aline 285 238
+aline 333 142
+aline 428 47
+aline 523 0
+aline 619 0
+aline 714 47
+aline 809 142
+aline 857 238
+aline 857 380
+aline 809 476
+aline 761 523
+aline 666 571
+amove 666 523
+aline 761 476
+aline 809 380
+aline 809 238
+aline 761 95
+amove 1000 952
+aline 952 761
+aline 904 666
+aline 809 571
+aline 666 523
+aline 476 523
+aline 333 571
+aline 238 666
+aline 190 761
+aline 142 952
+aline 190 809
+aline 238 714
+aline 333 619
+aline 476 571
+aline 666 571
+aline 809 619
+aline 904 714
+aline 952 809
+aline 1000 952
+stroke
+dfont endchar
+dfont char=92
+amove 142 95
+aline 238 190
+aline 333 238
+aline 476 285
+aline 666 285
+aline 809 238
+aline 904 190
+aline 1000 95
+amove 809 238
+aline 809 809
+amove 761 761
+aline 761 285
+amove 380 285
+aline 380 761
+amove 333 809
+aline 333 238
+amove 142 952
+aline 238 857
+aline 333 809
+aline 476 761
+aline 666 761
+aline 809 809
+aline 904 857
+aline 1000 952
+stroke
+dfont endchar
+dfont char=93
+amove 142 142
+aline 857 142
+aline 952 190
+aline 1000 285
+aline 1000 380
+aline 952 476
+aline 857 523
+aline 761 523
+aline 666 476
+aline 619 380
+aline 619 285
+aline 666 190
+aline 142 190
+amove 333 476
+aline 238 523
+aline 190 571
+aline 142 666
+amove 333 857
+aline 428 809
+aline 476 761
+aline 523 666
+amove 809 523
+aline 904 476
+aline 952 428
+aline 1000 333
+amove 809 142
+aline 714 190
+aline 666 238
+aline 619 333
+amove 1000 809
+aline 476 809
+aline 523 714
+aline 523 619
+aline 476 523
+aline 380 476
+aline 285 476
+aline 190 523
+aline 142 619
+aline 142 714
+aline 190 809
+aline 285 857
+aline 1000 857
+stroke
+dfont endchar
+dfont char=94
+amove 333 380
+aline 238 523
+aline 190 619
+aline 190 761
+aline 238 857
+aline 285 904
+amove 619 952
+aline 761 904
+aline 857 809
+aline 904 714
+aline 904 571
+aline 857 428
+aline 761 285
+amove 952 142
+aline 904 47
+aline 857 0
+aline 761 0
+aline 714 95
+aline 714 190
+aline 761 285
+aline 904 428
+aline 952 571
+aline 952 714
+aline 904 809
+aline 809 904
+aline 619 952
+aline 428 952
+aline 285 904
+aline 190 857
+aline 142 761
+aline 142 619
+aline 190 523
+aline 428 285
+aline 476 190
+aline 476 142
+aline 428 47
+aline 333 0
+aline 285 0
+aline 190 47
+aline 142 142
+aline 142 190
+aline 190 285
+aline 285 333
+aline 333 333
+aline 428 285
+stroke
+dfont endchar
+dfont char=95
+amove 238 238
+aline 238 714
+aline 142 857
+amove 47 761
+aline 190 904
+aline 285 761
+aline 285 238
+amove 476 285
+aline 476 714
+aline 380 857
+amove 285 761
+aline 428 904
+aline 523 761
+aline 523 285
+amove 428 0
+aline 666 95
+aline 809 190
+aline 904 285
+aline 952 380
+aline 1000 523
+aline 1000 666
+aline 952 809
+aline 904 904
+aline 761 761
+amove 857 857
+aline 904 809
+aline 952 666
+aline 952 523
+aline 904 380
+aline 857 285
+aline 761 190
+aline 619 95
+aline 428 0
+amove 714 0
+aline 714 714
+aline 619 857
+amove 523 761
+aline 666 904
+aline 761 761
+aline 761 0
+stroke
+dfont endchar
+dfont char=96
+amove 238 95
+aline 904 95
+amove 904 142
+aline 238 142
+amove 142 333
+aline 428 333
+aline 333 428
+aline 285 571
+aline 285 666
+aline 333 809
+aline 428 904
+aline 523 952
+amove 619 952
+aline 714 904
+aline 809 809
+aline 857 666
+aline 857 571
+aline 809 428
+aline 714 333
+aline 1000 333
+amove 1000 380
+aline 809 380
+aline 857 428
+aline 904 571
+aline 904 666
+aline 857 809
+aline 761 904
+aline 619 952
+aline 523 952
+aline 380 904
+aline 285 809
+aline 238 666
+aline 238 571
+aline 285 428
+aline 333 380
+aline 142 380
+stroke
+dfont endchar
+dfont char=97
+amove 285 142
+aline 285 666
+aline 142 809
+amove 47 714
+aline 190 857
+aline 333 714
+aline 333 142
+amove 571 142
+aline 571 666
+aline 428 809
+amove 333 714
+aline 476 857
+aline 619 714
+aline 619 142
+amove 1000 95
+aline 904 190
+aline 904 714
+aline 761 857
+aline 619 714
+amove 714 809
+aline 857 666
+aline 857 142
+aline 952 47
+aline 1095 190
+stroke
+dfont endchar
+dfont char=98
+amove 142 95
+aline 904 857
+aline 761 809
+aline 476 809
+aline 666 761
+aline 809 761
+aline 809 619
+aline 857 428
+aline 857 714
+aline 904 857
+amove 476 428
+aline 476 95
+aline 428 238
+aline 428 380
+aline 285 380
+aline 142 428
+aline 476 428
+stroke
+dfont endchar
+dfont char=99
+amove 428 285
+aline 190 761
+aline 95 571
+amove 190 666
+aline 428 190
+aline 571 523
+aline 809 523
+aline 952 571
+aline 1000 666
+aline 1000 761
+aline 952 857
+aline 857 904
+aline 809 904
+aline 714 857
+aline 666 761
+aline 666 666
+aline 714 523
+aline 761 428
+aline 809 285
+aline 809 142
+aline 714 47
+aline 809 95
+aline 857 190
+aline 857 333
+aline 809 476
+aline 714 666
+aline 714 761
+aline 761 857
+aline 809 904
+stroke
+dfont endchar
+dfont char=100
+amove 142 285
+aline 285 428
+aline 476 333
+amove 523 380
+aline 666 285
+aline 809 428
+aline 904 333
+amove 1000 428
+aline 857 285
+aline 761 380
+amove 714 333
+aline 571 428
+aline 428 285
+aline 238 380
+amove 142 571
+aline 285 714
+aline 476 619
+amove 523 666
+aline 666 571
+aline 809 714
+aline 904 619
+amove 1000 714
+aline 857 571
+aline 761 666
+amove 714 619
+aline 571 714
+aline 428 571
+aline 238 666
+stroke
+dfont endchar
+dfont char=101
+amove 190 95
+aline 333 142
+aline 428 190
+aline 523 285
+aline 571 428
+aline 619 285
+aline 714 190
+aline 809 142
+aline 952 95
+aline 761 190
+aline 666 285
+aline 619 428
+aline 619 571
+aline 666 714
+aline 761 809
+aline 952 904
+aline 809 857
+aline 714 809
+aline 619 714
+aline 571 571
+aline 523 714
+aline 428 809
+aline 333 857
+aline 190 904
+aline 380 809
+aline 476 714
+aline 523 571
+aline 523 428
+aline 476 285
+aline 380 190
+aline 190 95
+amove 142 476
+aline 1000 476
+amove 1000 523
+aline 142 523
+stroke
+dfont endchar
+dfont char=102
+amove 142 380
+aline 238 476
+amove 142 476
+aline 238 476
+aline 238 380
+aline 142 380
+aline 142 476
+aline 238 380
+stroke
+dfont endchar
+dfont char=103
+amove 142 428
+aline 285 380
+aline 476 285
+aline 571 190
+aline 619 95
+amove 523 -143
+aline 571 -96
+aline 619 -1
+aline 619 95
+aline 571 238
+aline 476 333
+aline 333 428
+aline 142 523
+amove 142 476
+aline 428 333
+stroke
+dfont endchar
+dfont char=104
+amove 142 333
+aline 333 428
+aline 476 523
+aline 571 619
+aline 619 761
+aline 619 857
+aline 571 952
+aline 523 1000
+amove 619 761
+aline 571 666
+aline 476 571
+aline 285 476
+aline 142 428
+amove 142 380
+aline 428 523
+stroke
+dfont endchar
+dfont char=105
+amove 190 238
+aline 428 190
+amove 285 190
+aline 523 238
+aline 761 333
+amove 809 428
+aline 619 238
+amove 761 619
+aline 523 666
+aline 666 666
+aline 761 619
+aline 809 523
+aline 809 428
+aline 761 333
+aline 619 238
+aline 428 190
+aline 285 190
+aline 190 238
+aline 142 333
+aline 142 428
+aline 190 523
+aline 333 619
+aline 523 666
+amove 666 666
+aline 428 619
+aline 190 523
+amove 142 428
+aline 333 619
+stroke
+dfont endchar
+dfont char=106
+amove 190 238
+aline 428 190
+amove 285 190
+aline 523 238
+aline 761 333
+amove 809 428
+aline 619 238
+amove 761 619
+aline 523 666
+aline 666 666
+aline 761 619
+aline 809 523
+aline 809 428
+aline 761 333
+aline 619 238
+aline 428 190
+aline 285 190
+aline 190 238
+aline 142 333
+aline 142 428
+aline 190 523
+aline 333 619
+aline 523 666
+amove 666 666
+aline 428 619
+aline 190 523
+amove 142 428
+aline 333 619
+stroke
+dfont endchar
+dfont char=107
+amove 238 238
+aline 619 428
+amove 666 523
+aline 190 285
+amove 142 333
+aline 619 571
+amove 571 619
+aline 190 428
+amove 238 523
+aline 523 666
+amove 428 666
+aline 285 619
+aline 190 523
+aline 142 428
+aline 142 333
+aline 190 238
+aline 285 190
+aline 380 190
+aline 523 238
+aline 619 333
+aline 666 428
+aline 666 523
+aline 619 619
+aline 523 666
+aline 428 666
+amove 571 333
+aline 285 190
+stroke
+dfont endchar
+dfont char=108
+amove 142 142
+aline 619 238
+amove 619 285
+aline 142 190
+amove 238 -143
+aline 238 952
+amove 523 1000
+aline 523 -96
+amove 142 571
+aline 619 666
+amove 619 714
+aline 142 619
+stroke
+dfont endchar
+dfont char=109
+amove 190 142
+aline 190 1000
+amove 190 619
+aline 571 714
+aline 571 -143
+amove 571 238
+aline 190 142
+amove 190 190
+aline 571 285
+amove 571 666
+aline 190 571
+stroke
+dfont endchar
+dfont char=110
+amove 190 190
+aline 190 1190
+amove 190 619
+aline 333 714
+aline 476 714
+aline 571 666
+aline 619 571
+aline 619 476
+aline 571 380
+aline 428 285
+aline 333 238
+aline 190 190
+amove 428 285
+aline 523 380
+aline 571 476
+aline 571 571
+aline 523 666
+amove 571 619
+aline 476 666
+aline 333 666
+aline 190 619
+stroke
+dfont endchar
+dfont char=111
+amove 142 714
+aline 142 857
+aline 1095 857
+aline 1095 714
+aline 142 714
+amove 142 761
+aline 1095 761
+amove 1095 809
+aline 142 809
+stroke
+dfont endchar
+dfont char=112
+amove 142 476
+aline 142 619
+aline 619 619
+aline 619 476
+aline 142 476
+amove 142 523
+aline 619 523
+amove 619 571
+aline 142 571
+stroke
+dfont endchar
+dfont char=113
+amove 142 142
+aline 238 142
+amove 190 95
+aline 190 238
+amove 142 190
+aline 428 285
+amove 523 238
+aline 285 285
+aline 238 190
+aline 238 95
+aline 142 95
+aline 142 190
+aline 190 238
+aline 285 285
+aline 428 285
+aline 523 238
+aline 619 142
+aline 142 714
+aline 238 619
+aline 333 571
+aline 476 571
+aline 571 619
+aline 619 666
+aline 619 761
+aline 523 761
+aline 523 666
+aline 476 571
+aline 238 619
+amove 333 571
+aline 619 666
+amove 619 714
+aline 523 714
+amove 571 761
+aline 571 619
+stroke
+dfont endchar
+dfont char=114
+amove 619 95
+aline 619 714
+aline 523 619
+aline 428 571
+aline 285 571
+aline 190 619
+aline 142 666
+aline 142 761
+aline 238 761
+aline 238 666
+aline 285 571
+aline 523 619
+amove 428 571
+aline 142 666
+amove 142 714
+aline 238 714
+amove 190 761
+aline 190 619
+stroke
+dfont endchar
+dfont char=115
+amove 428 0
+aline 285 142
+aline 238 238
+aline 190 428
+aline 190 619
+aline 238 761
+aline 285 857
+aline 380 1000
+aline 523 1142
+aline 761 1333
+aline 952 1523
+amove 904 904
+aline 1000 857
+aline 1095 761
+aline 1142 666
+aline 1190 523
+aline 1190 333
+aline 1142 190
+aline 1047 47
+aline 952 0
+aline 809 -48
+amove 571 190
+aline 476 285
+aline 428 428
+aline 428 619
+aline 476 761
+aline 571 857
+aline 714 904
+aline 904 904
+aline 1047 857
+aline 1142 761
+aline 1190 666
+aline 1238 523
+aline 1238 333
+aline 1190 190
+aline 1095 47
+aline 1000 0
+aline 809 -48
+aline 619 -48
+aline 428 0
+aline 285 95
+aline 190 238
+aline 142 428
+aline 142 619
+aline 190 809
+aline 238 904
+aline 333 1047
+aline 428 1142
+aline 714 1333
+aline 952 1523
+aline 1047 1666
+aline 1095 1761
+aline 1142 1904
+aline 1142 2095
+aline 1095 2190
+aline 1000 2238
+aline 952 2238
+aline 857 2190
+aline 809 2095
+aline 761 1857
+aline 761 1523
+aline 809 285
+aline 809 -239
+aline 761 -429
+aline 714 -524
+aline 619 -620
+aline 476 -667
+aline 380 -667
+aline 285 -620
+aline 238 -524
+aline 238 -429
+aline 285 -381
+aline 333 -381
+aline 380 -429
+aline 380 -477
+aline 333 -524
+aline 285 -524
+amove 285 -429
+aline 285 -477
+aline 333 -477
+aline 333 -429
+aline 285 -429
+stroke
+dfont endchar
+dfont char=116
+amove 428 380
+aline 476 285
+aline 571 238
+aline 666 238
+aline 761 285
+aline 809 380
+aline 809 476
+aline 761 571
+aline 666 619
+aline 571 619
+aline 476 571
+aline 428 523
+aline 380 380
+aline 380 238
+aline 428 95
+aline 523 -1
+aline 666 -48
+aline 809 -48
+aline 952 -1
+aline 1047 95
+aline 1095 190
+aline 1142 333
+aline 1142 523
+aline 1095 666
+aline 1000 809
+aline 904 857
+aline 761 904
+aline 619 904
+aline 476 857
+aline 380 809
+aline 285 714
+aline 190 571
+aline 142 380
+aline 142 142
+aline 190 -96
+aline 285 -286
+aline 380 -381
+aline 523 -477
+aline 714 -524
+aline 952 -524
+aline 1142 -477
+aline 1285 -381
+aline 1380 -286
+aline 1238 -381
+aline 1142 -429
+aline 952 -477
+aline 761 -477
+aline 571 -429
+aline 428 -334
+aline 333 -239
+aline 238 -48
+aline 190 142
+aline 190 428
+aline 238 619
+aline 285 714
+amove 476 523
+aline 761 523
+amove 714 571
+aline 523 571
+amove 428 476
+aline 809 476
+amove 809 428
+aline 428 428
+amove 428 380
+aline 809 380
+amove 761 333
+aline 476 333
+amove 523 285
+aline 714 285
+amove 1333 238
+aline 1333 142
+aline 1428 142
+aline 1428 238
+aline 1333 238
+amove 1380 238
+aline 1380 142
+amove 1333 190
+aline 1428 190
+amove 1380 619
+aline 1380 714
+amove 1333 714
+aline 1333 619
+aline 1428 619
+aline 1428 714
+aline 1333 714
+amove 1333 666
+aline 1428 666
+stroke
+dfont endchar
+dfont char=117
+amove 428 95
+aline 904 190
+amove 904 238
+aline 428 142
+amove 428 190
+aline 904 285
+amove 904 666
+aline 428 571
+amove 428 619
+aline 904 714
+amove 904 761
+aline 428 666
+amove 428 1285
+aline 428 -429
+amove 190 -429
+aline 190 1285
+amove 904 1285
+aline 904 -429
+amove 1142 -429
+aline 1142 1285
+stroke
+dfont endchar
+dfont char=118
+amove 380 190
+aline 285 238
+aline 238 285
+aline 190 380
+aline 190 523
+aline 238 619
+amove 380 666
+aline 238 619
+aline 190 571
+aline 142 476
+aline 142 380
+aline 190 285
+aline 238 238
+aline 380 190
+aline 571 190
+aline 714 238
+aline 761 285
+aline 809 380
+aline 809 476
+aline 761 571
+aline 714 619
+aline 571 666
+aline 380 666
+amove 571 666
+aline 666 619
+aline 714 571
+aline 761 476
+aline 761 333
+aline 714 238
+stroke
+dfont endchar
+dfont char=119
+amove 190 238
+aline 428 190
+amove 285 190
+aline 523 238
+aline 761 333
+amove 809 428
+aline 619 238
+amove 761 619
+aline 523 666
+aline 666 666
+aline 761 619
+aline 809 523
+aline 809 428
+aline 761 333
+aline 619 238
+aline 428 190
+aline 285 190
+aline 190 238
+aline 142 333
+aline 142 428
+aline 190 523
+aline 333 619
+aline 523 666
+amove 666 666
+aline 428 619
+aline 190 523
+amove 142 428
+aline 333 619
+stroke
+dfont endchar
+dfont char=120
+amove 238 238
+aline 619 428
+amove 666 523
+aline 190 285
+amove 142 333
+aline 619 571
+amove 571 619
+aline 190 428
+amove 238 523
+aline 523 666
+amove 428 666
+aline 285 619
+aline 190 523
+aline 142 428
+aline 142 333
+aline 190 238
+aline 285 190
+aline 380 190
+aline 523 238
+aline 619 333
+aline 666 428
+aline 666 523
+aline 619 619
+aline 523 666
+aline 428 666
+amove 571 333
+aline 285 190
+stroke
+dfont endchar
+dfont char=121
+amove 142 142
+aline 619 238
+amove 619 285
+aline 142 190
+amove 238 -143
+aline 238 952
+amove 523 1000
+aline 523 -96
+amove 142 571
+aline 619 666
+amove 619 714
+aline 142 619
+stroke
+dfont endchar
+dfont char=122
+amove 190 142
+aline 190 1000
+amove 190 619
+aline 571 714
+aline 571 -143
+amove 571 238
+aline 190 142
+amove 190 190
+aline 571 285
+amove 571 666
+aline 190 571
+stroke
+dfont endchar
+dfont char=123
+amove 190 190
+aline 190 1190
+amove 190 619
+aline 333 714
+aline 476 714
+aline 571 666
+aline 619 571
+aline 619 476
+aline 571 380
+aline 428 285
+aline 333 238
+aline 190 190
+amove 428 285
+aline 523 380
+aline 571 476
+aline 571 571
+aline 523 666
+amove 571 619
+aline 476 666
+aline 333 666
+aline 190 619
+stroke
+dfont endchar
+dfont char=124
+amove 142 714
+aline 142 857
+aline 1095 857
+aline 1095 714
+aline 142 714
+amove 142 761
+aline 1095 761
+amove 1095 809
+aline 142 809
+stroke
+dfont endchar
+dfont char=125
+amove 142 476
+aline 142 619
+aline 619 619
+aline 619 476
+aline 142 476
+amove 142 523
+aline 619 523
+amove 619 571
+aline 142 571
+stroke
+dfont endchar
+dfont char=126
+amove 190 -96
+aline 285 47
+aline 428 142
+amove 523 95
+aline 380 285
+aline 285 428
+aline 476 761
+aline 476 857
+amove 523 714
+aline 333 380
+amove 380 285
+aline 380 333
+aline 571 666
+aline 333 1142
+amove 619 -48
+aline 523 95
+aline 428 142
+aline 333 142
+aline 238 95
+aline 190 0
+aline 190 -96
+aline 238 -191
+aline 380 -286
+aline 285 -191
+aline 238 -96
+aline 238 95
+aline 428 95
+aline 523 47
+aline 619 -48
+stroke
+dfont endchar
+dfont char=127
+amove 428 95
+aline 619 714
+aline 523 619
+aline 428 571
+aline 285 571
+aline 190 619
+aline 142 666
+aline 142 761
+aline 238 761
+aline 238 666
+aline 285 571
+aline 523 619
+amove 428 571
+aline 142 666
+amove 142 714
+aline 238 714
+amove 190 761
+aline 190 619
+stroke
+dfont endchar
+dfont char=128
+amove 285 333
+aline 571 333
+amove 619 380
+aline 238 380
+amove 238 428
+aline 619 428
+amove 619 476
+aline 238 476
+aline 285 571
+aline 380 619
+aline 476 619
+aline 571 571
+aline 619 476
+aline 619 380
+aline 571 285
+aline 476 238
+aline 380 238
+aline 285 285
+aline 238 333
+aline 190 476
+aline 190 619
+aline 238 761
+aline 333 857
+aline 476 904
+aline 666 904
+aline 857 857
+aline 1000 761
+aline 1095 619
+aline 1142 428
+aline 1142 190
+aline 1095 0
+aline 1047 -96
+aline 952 -239
+aline 809 -381
+aline 619 -524
+aline 380 -667
+aline 190 -762
+amove 380 -667
+aline 523 -572
+aline 761 -381
+aline 904 -239
+aline 1000 -96
+aline 1047 -1
+aline 1095 190
+aline 1095 428
+aline 1047 619
+aline 952 761
+aline 809 857
+aline 666 904
+amove 523 571
+aline 333 571
+amove 285 523
+aline 571 523
+amove 523 285
+aline 333 285
+amove 1333 238
+aline 1333 142
+aline 1428 142
+aline 1428 238
+aline 1333 238
+amove 1380 238
+aline 1380 142
+amove 1333 190
+aline 1428 190
+amove 1380 619
+aline 1380 714
+amove 1333 714
+aline 1333 619
+aline 1428 619
+aline 1428 714
+aline 1333 714
+amove 1333 666
+aline 1428 666
+stroke
+dfont endchar
+dfont char=129
+amove 190 -524
+aline 190 1380
+amove 238 1380
+aline 238 -524
+amove 428 -524
+aline 428 1380
+amove 619 1190
+aline 714 1190
+aline 714 1095
+aline 619 1095
+aline 619 1238
+aline 666 1333
+aline 761 1380
+aline 904 1380
+aline 1000 1333
+aline 1095 1238
+aline 1142 1095
+aline 1142 857
+aline 1095 714
+aline 1000 619
+aline 904 571
+aline 809 571
+aline 714 619
+aline 666 714
+aline 619 619
+aline 523 476
+aline 476 428
+aline 523 380
+aline 619 238
+aline 666 142
+aline 714 238
+aline 809 285
+aline 904 285
+aline 1000 238
+aline 1095 142
+aline 1142 0
+aline 1142 -239
+aline 1095 -381
+aline 1000 -477
+aline 904 -524
+aline 761 -524
+aline 666 -477
+aline 619 -381
+aline 619 -239
+aline 714 -239
+aline 714 -334
+aline 619 -334
+amove 666 -334
+aline 666 -239
+amove 619 -286
+aline 714 -286
+amove 1000 -477
+aline 1047 -381
+aline 1095 -239
+aline 1095 0
+aline 1047 142
+aline 1000 238
+amove 666 142
+aline 666 238
+aline 571 380
+aline 476 428
+aline 571 476
+aline 666 619
+aline 666 714
+amove 1000 619
+aline 1047 714
+aline 1095 857
+aline 1095 1095
+aline 1047 1238
+aline 1000 1333
+amove 714 1142
+aline 619 1142
+amove 666 1190
+aline 666 1095
+stroke
+dfont endchar
+dfont char=130
+amove 142 -334
+aline 571 -334
+amove 380 -334
+aline 380 1190
+amove 333 1190
+aline 333 -334
+amove 1047 -334
+aline 1476 -334
+amove 1285 -334
+aline 1285 1190
+amove 1238 1190
+aline 1238 -334
+amove 1476 1190
+aline 142 1190
+stroke
+dfont endchar
+dfont char=131
+amove 238 -286
+aline 1238 -286
+amove 1190 -334
+aline 1333 0
+aline 1238 -334
+aline 190 -334
+aline 714 523
+aline 238 1190
+amove 190 1190
+aline 666 523
+amove 666 476
+aline 142 1190
+aline 1238 1190
+aline 1333 857
+aline 1190 1190
+stroke
+dfont endchar
+dfont char=132
+amove 571 -1143
+aline 476 -905
+aline 380 -620
+aline 333 -429
+aline 285 -143
+aline 238 238
+aline 238 619
+aline 285 1000
+aline 333 1285
+aline 380 1476
+aline 476 1761
+aline 571 2000
+amove 714 2285
+aline 571 2000
+aline 428 1666
+aline 333 1428
+aline 285 1238
+aline 238 1000
+aline 190 619
+aline 190 238
+aline 238 -143
+aline 285 -381
+aline 333 -572
+aline 428 -810
+aline 571 -1143
+aline 714 -1429
+stroke
+dfont endchar
+dfont char=133
+amove 285 -1143
+aline 380 -905
+aline 476 -620
+aline 523 -429
+aline 571 -143
+aline 619 238
+aline 619 619
+aline 571 1000
+aline 523 1285
+aline 476 1476
+aline 380 1761
+aline 285 2000
+amove 142 2285
+aline 285 2000
+aline 428 1666
+aline 523 1428
+aline 571 1238
+aline 619 1000
+aline 666 619
+aline 666 238
+aline 619 -143
+aline 571 -381
+aline 523 -572
+aline 428 -810
+aline 285 -1143
+aline 142 -1429
+stroke
+dfont endchar
+dfont char=134
+amove 190 -1429
+aline 190 428
+aline 190 2285
+aline 714 2285
+amove 238 2285
+aline 238 428
+aline 238 -1429
+amove 190 -1429
+aline 714 -1429
+stroke
+dfont endchar
+dfont char=135
+amove 142 -1429
+aline 666 -1429
+aline 666 428
+aline 666 2285
+aline 142 2285
+amove 619 2285
+aline 619 428
+aline 619 -1429
+stroke
+dfont endchar
+dfont char=136
+amove 476 -143
+aline 428 -286
+aline 380 -524
+aline 380 -715
+aline 428 -953
+aline 476 -1096
+aline 571 -1286
+amove 666 -1429
+aline 476 -1143
+aline 380 -953
+aline 333 -715
+aline 333 -524
+aline 380 -334
+aline 571 47
+aline 571 142
+aline 523 238
+aline 476 285
+aline 238 428
+aline 476 571
+aline 523 619
+aline 571 714
+aline 571 809
+aline 380 1190
+aline 333 1380
+aline 333 1571
+aline 380 1809
+aline 476 2000
+aline 666 2285
+amove 571 2142
+aline 476 1952
+aline 428 1809
+aline 380 1571
+aline 380 1380
+aline 428 1142
+aline 476 999
+stroke
+dfont endchar
+dfont char=137
+amove 428 -143
+aline 476 -286
+aline 523 -524
+aline 523 -715
+aline 476 -953
+aline 428 -1096
+aline 333 -1286
+amove 238 -1429
+aline 428 -1143
+aline 523 -953
+aline 571 -715
+aline 571 -524
+aline 523 -334
+aline 333 47
+aline 333 142
+aline 380 238
+aline 428 285
+aline 666 428
+aline 428 571
+aline 380 619
+aline 333 714
+aline 333 809
+aline 523 1190
+aline 571 1380
+aline 571 1571
+aline 523 1809
+aline 428 2000
+aline 238 2285
+amove 333 2142
+aline 428 1952
+aline 476 1809
+aline 523 1571
+aline 523 1380
+aline 476 1142
+aline 428 999
+stroke
+dfont endchar
+dfont char=138
+amove 380 -1143
+aline 476 -953
+aline 523 -810
+aline 571 -572
+aline 571 -334
+aline 523 -48
+aline 476 142
+aline 333 666
+aline 285 857
+aline 238 1142
+aline 238 1428
+aline 285 1666
+aline 380 1857
+aline 476 2000
+aline 619 2142
+amove 476 2000
+aline 380 1809
+aline 333 1666
+aline 285 1428
+aline 285 1190
+aline 333 904
+aline 380 714
+aline 523 190
+aline 571 0
+aline 619 -286
+aline 619 -572
+aline 571 -810
+aline 476 -1000
+aline 380 -1143
+aline 238 -1286
+stroke
+dfont endchar
+dfont char=139
+amove 476 -1143
+aline 380 -953
+aline 333 -810
+aline 285 -572
+aline 285 -334
+aline 333 -48
+aline 380 142
+aline 523 666
+aline 571 857
+aline 619 1142
+aline 619 1428
+aline 571 1666
+aline 476 1857
+aline 380 2000
+aline 238 2142
+amove 380 2000
+aline 476 1809
+aline 523 1666
+aline 571 1428
+aline 571 1190
+aline 523 904
+aline 476 714
+aline 333 190
+aline 285 0
+aline 238 -286
+aline 238 -572
+aline 285 -810
+aline 380 -1000
+aline 476 -1143
+aline 619 -1286
+stroke
+dfont endchar
+dfont char=140
+amove 142 428
+aline 476 428
+aline 1285 -953
+amove 1238 -953
+aline 428 428
+amove 380 428
+aline 1285 -1096
+aline 1476 809
+aline 1666 2714
+stroke
+dfont endchar
+dfont char=141
+amove 714 -715
+aline 714 1571
+amove 857 2142
+aline 809 2000
+aline 761 1571
+aline 761 47
+aline 714 -715
+aline 666 -1048
+aline 619 -1191
+aline 571 -1286
+aline 476 -1381
+aline 380 -1429
+aline 285 -1429
+aline 190 -1381
+aline 142 -1286
+aline 142 -1191
+aline 190 -1143
+aline 238 -1143
+aline 285 -1191
+aline 285 -1239
+aline 238 -1286
+aline 190 -1286
+amove 190 -1191
+aline 190 -1239
+aline 238 -1239
+aline 238 -1191
+aline 190 -1191
+amove 571 -1286
+aline 619 -1143
+aline 666 -715
+aline 666 809
+aline 714 1571
+aline 761 1904
+aline 809 2047
+aline 857 2142
+aline 952 2238
+aline 1047 2285
+aline 1142 2285
+aline 1238 2238
+aline 1285 2142
+aline 1285 2047
+aline 1238 2000
+aline 1190 2000
+aline 1142 2047
+aline 1142 2095
+aline 1190 2142
+aline 1238 2142
+amove 1190 2095
+aline 1190 2047
+aline 1238 2047
+aline 1238 2095
+aline 1190 2095
+stroke
+dfont endchar
diff --git a/src/fonts/plti.afm b/src/fonts/plti.afm
new file mode 100644
index 0000000..e4f6ae2
--- /dev/null
+++ b/src/fonts/plti.afm
@@ -0,0 +1,115 @@
+StartFontMetrics 2.0
+Comment Made from HERSHEY font file using SPLITFONT.BAS
+FontName plTI
+EncodingScheme TEXENCODING
+FullName plTI
+FamilyName plTI
+Weight Medium
+ItalicAngle 0
+IsFixedPitch false
+UnderlinePosition -97
+UnderlineThickness 73
+FontBBox 0 -400 1001 1001
+CapHeight 729
+XHeight 151
+Descender -219
+Ascender 729
+StartCharMetrics 95
+C 32 ; WX 400 ; N C32 ; B 0 0 0 0 ;
+C 33 ; WX 351 ; N C33 ; B 66 0 333 700 ;
+C 34 ; WX 351 ; N C34 ; B 199 466 333 700 ;
+C 35 ; WX 300 ; N C35 ; B 0 0 0 0 ;
+C 36 ; WX 685 ; N C36 ; B 66 -133 633 833 ;
+C 37 ; WX 784 ; N C37 ; B 99 0 700 700 ;
+C 38 ; WX 300 ; N C38 ; B 0 0 0 0 ;
+C 39 ; WX 351 ; N C39 ; B 199 466 333 700 ;
+C 40 ; WX 518 ; N C40 ; B 99 -233 532 833 ;
+C 41 ; WX 518 ; N C41 ; B 0 -233 433 833 ;
+C 42 ; WX 651 ; N C42 ; B 166 466 633 700 ;
+C 43 ; WX 818 ; N C43 ; B 133 32 700 600 ;
+C 44 ; WX 351 ; N C44 ; B 32 -133 166 99 ;
+C 45 ; WX 818 ; N C45 ; B 133 299 700 333 ;
+C 46 ; WX 351 ; N C46 ; B 66 0 166 99 ;
+C 47 ; WX 751 ; N C47 ; B -67 -233 833 833 ;
+C 48 ; WX 685 ; N C48 ; B 99 0 600 700 ;
+C 49 ; WX 685 ; N C49 ; B 233 0 500 700 ;
+C 50 ; WX 685 ; N C50 ; B 32 0 600 700 ;
+C 51 ; WX 685 ; N C51 ; B 66 0 600 700 ;
+C 52 ; WX 685 ; N C52 ; B 66 0 600 700 ;
+C 53 ; WX 685 ; N C53 ; B 66 0 633 700 ;
+C 54 ; WX 685 ; N C54 ; B 99 0 600 700 ;
+C 55 ; WX 685 ; N C55 ; B 133 0 633 700 ;
+C 56 ; WX 685 ; N C56 ; B 66 0 600 700 ;
+C 57 ; WX 685 ; N C57 ; B 99 0 600 700 ;
+C 58 ; WX 351 ; N C58 ; B 66 0 266 466 ;
+C 59 ; WX 351 ; N C59 ; B 32 -133 266 466 ;
+C 60 ; WX 784 ; N C60 ; B 133 0 666 600 ;
+C 61 ; WX 818 ; N C61 ; B 133 166 700 466 ;
+C 62 ; WX 784 ; N C62 ; B 133 0 666 600 ;
+C 63 ; WX 685 ; N C63 ; B 199 0 633 700 ;
+C 64 ; WX 884 ; N C64 ; B 99 0 799 700 ;
+C 65 ; WX 651 ; N C65 ; B -67 0 532 700 ;
+C 66 ; WX 784 ; N C66 ; B 0 0 700 700 ;
+C 67 ; WX 685 ; N C67 ; B 99 0 666 700 ;
+C 68 ; WX 751 ; N C68 ; B 0 0 666 700 ;
+C 69 ; WX 751 ; N C69 ; B 0 0 699 700 ;
+C 70 ; WX 718 ; N C70 ; B 0 0 699 700 ;
+C 71 ; WX 718 ; N C71 ; B 99 0 666 700 ;
+C 72 ; WX 851 ; N C72 ; B 0 0 866 700 ;
+C 73 ; WX 418 ; N C73 ; B 0 0 433 700 ;
+C 74 ; WX 585 ; N C74 ; B 32 0 600 700 ;
+C 75 ; WX 751 ; N C75 ; B 0 0 833 700 ;
+C 76 ; WX 651 ; N C76 ; B 0 0 566 700 ;
+C 77 ; WX 884 ; N C77 ; B 0 0 899 700 ;
+C 78 ; WX 818 ; N C78 ; B 0 0 833 700 ;
+C 79 ; WX 718 ; N C79 ; B 99 0 633 700 ;
+C 80 ; WX 751 ; N C80 ; B 0 0 733 700 ;
+C 81 ; WX 718 ; N C81 ; B 99 -167 633 700 ;
+C 82 ; WX 784 ; N C82 ; B 0 0 700 700 ;
+C 83 ; WX 751 ; N C83 ; B 66 0 700 700 ;
+C 84 ; WX 685 ; N C84 ; B 133 0 700 700 ;
+C 85 ; WX 818 ; N C85 ; B 133 0 833 700 ;
+C 86 ; WX 651 ; N C86 ; B 133 0 733 700 ;
+C 87 ; WX 851 ; N C87 ; B 166 0 899 700 ;
+C 88 ; WX 718 ; N C88 ; B -33 0 766 700 ;
+C 89 ; WX 685 ; N C89 ; B 133 0 766 700 ;
+C 90 ; WX 718 ; N C90 ; B 32 0 700 700 ;
+C 91 ; WX 451 ; N C91 ; B 133 -233 366 833 ;
+C 92 ; WX 300 ; N C92 ; B 0 0 0 0 ;
+C 93 ; WX 451 ; N C93 ; B 99 -233 333 833 ;
+C 94 ; WX 300 ; N C94 ; B 0 0 0 0 ;
+C 95 ; WX 300 ; N C95 ; B 0 0 0 0 ;
+C 96 ; WX 318 ; N C96 ; B 133 500 199 700 ;
+C 97 ; WX 685 ; N C97 ; B 99 0 666 466 ;
+C 98 ; WX 618 ; N C98 ; B 133 0 532 700 ;
+C 99 ; WX 585 ; N C99 ; B 99 0 500 466 ;
+C 100 ; WX 685 ; N C100 ; B 99 0 666 700 ;
+C 101 ; WX 585 ; N C101 ; B 99 0 500 466 ;
+C 102 ; WX 485 ; N C102 ; B -67 -233 532 700 ;
+C 103 ; WX 651 ; N C103 ; B 32 -233 566 466 ;
+C 104 ; WX 685 ; N C104 ; B 66 0 666 700 ;
+C 105 ; WX 418 ; N C105 ; B 32 0 399 700 ;
+C 106 ; WX 418 ; N C106 ; B -67 -233 366 700 ;
+C 107 ; WX 651 ; N C107 ; B 66 0 566 700 ;
+C 108 ; WX 384 ; N C108 ; B 99 0 333 700 ;
+C 109 ; WX 1085 ; N C109 ; B 32 0 1066 466 ;
+C 110 ; WX 751 ; N C110 ; B 32 0 733 466 ;
+C 111 ; WX 585 ; N C111 ; B 99 0 500 466 ;
+C 112 ; WX 685 ; N C112 ; B -33 -233 600 466 ;
+C 113 ; WX 651 ; N C113 ; B 99 -233 566 466 ;
+C 114 ; WX 551 ; N C114 ; B 32 0 532 466 ;
+C 115 ; WX 551 ; N C115 ; B 66 0 500 466 ;
+C 116 ; WX 451 ; N C116 ; B 99 0 399 700 ;
+C 117 ; WX 751 ; N C117 ; B 32 0 733 466 ;
+C 118 ; WX 651 ; N C118 ; B 32 0 566 466 ;
+C 119 ; WX 952 ; N C119 ; B 32 0 866 466 ;
+C 120 ; WX 651 ; N C120 ; B 66 0 600 466 ;
+C 121 ; WX 685 ; N C121 ; B 32 -233 633 466 ;
+C 122 ; WX 651 ; N C122 ; B 99 0 566 466 ;
+C 123 ; WX 485 ; N C123 ; B 166 -233 333 833 ;
+C 124 ; WX 551 ; N C124 ; B 166 299 500 700 ;
+C 125 ; WX 485 ; N C125 ; B 166 -233 333 833 ;
+C 126 ; WX 851 ; N C126 ; B 66 0 799 700 ;
+EndCharMetrics
+
+EndFontMetrics
diff --git a/src/fonts/plti.gle b/src/fonts/plti.gle
new file mode 100644
index 0000000..fbb6eb0
--- /dev/null
+++ b/src/fonts/plti.gle
@@ -0,0 +1,2636 @@
+dfont design= 1428
+dfont char=33
+amove 142 95
+aline 142 47
+aline 190 47
+aline 190 95
+aline 142 95
+amove 142 142
+aline 95 95
+aline 95 47
+aline 142 0
+aline 190 0
+aline 238 47
+aline 238 95
+aline 190 142
+aline 142 142
+amove 238 333
+aline 428 904
+aline 428 952
+aline 380 952
+aline 238 333
+aline 333 952
+aline 380 1000
+aline 428 1000
+aline 476 952
+aline 476 904
+aline 238 333
+stroke
+dfont endchar
+dfont char=34
+amove 285 666
+aline 380 714
+aline 428 761
+aline 476 857
+aline 476 952
+aline 428 1000
+aline 380 1000
+aline 333 952
+aline 333 904
+aline 380 857
+aline 428 857
+aline 428 809
+aline 380 714
+amove 380 952
+aline 380 904
+aline 428 904
+aline 428 952
+aline 380 952
+stroke
+dfont endchar
+stroke
+dfont endchar
+dfont char=36
+amove 190 -191
+aline 571 1190
+amove 809 1190
+aline 428 -191
+amove 666 47
+aline 714 142
+aline 714 285
+aline 666 380
+aline 380 523
+aline 285 619
+aline 238 714
+aline 238 857
+aline 333 952
+aline 476 1000
+aline 666 1000
+aline 809 952
+aline 857 904
+aline 904 809
+aline 904 714
+aline 809 714
+aline 809 809
+aline 857 809
+aline 857 761
+amove 714 333
+aline 666 428
+aline 333 619
+aline 285 714
+amove 333 952
+aline 285 857
+aline 285 761
+aline 333 666
+aline 619 523
+aline 714 428
+aline 761 333
+aline 761 190
+aline 714 95
+aline 666 47
+aline 523 0
+aline 333 0
+aline 190 47
+aline 142 95
+aline 95 190
+aline 95 285
+aline 190 285
+aline 190 190
+aline 142 190
+aline 142 238
+stroke
+dfont endchar
+dfont char=37
+amove 142 0
+aline 1000 1000
+aline 904 952
+aline 761 904
+aline 619 904
+aline 476 952
+aline 380 1000
+aline 285 1000
+aline 190 952
+aline 142 857
+aline 142 761
+aline 238 666
+aline 333 666
+aline 428 714
+aline 476 809
+aline 476 904
+aline 380 1000
+amove 809 333
+aline 714 285
+aline 666 190
+aline 666 95
+aline 761 0
+aline 857 0
+aline 952 47
+aline 1000 142
+aline 1000 238
+aline 904 333
+aline 809 333
+stroke
+dfont endchar
+stroke
+dfont endchar
+dfont char=39
+amove 333 761
+aline 333 714
+aline 380 714
+aline 380 761
+aline 333 761
+amove 333 809
+aline 380 809
+aline 428 761
+aline 428 714
+aline 380 666
+aline 333 666
+aline 285 714
+aline 285 809
+aline 333 904
+aline 380 952
+aline 476 1000
+amove 380 952
+aline 333 857
+aline 333 809
+stroke
+dfont endchar
+dfont char=40
+amove 190 -48
+aline 190 333
+aline 238 571
+aline 333 761
+aline 428 904
+amove 761 1190
+aline 619 1095
+aline 476 952
+aline 380 809
+aline 333 714
+aline 285 571
+aline 238 380
+aline 190 -48
+amove 333 -334
+aline 238 -191
+aline 190 -48
+aline 142 142
+aline 142 380
+aline 190 571
+aline 285 761
+aline 380 904
+aline 523 1047
+aline 666 1142
+aline 761 1190
+amove 190 333
+aline 238 -96
+aline 285 -239
+aline 333 -334
+stroke
+dfont endchar
+dfont char=41
+amove 0 -334
+aline 95 -286
+aline 238 -191
+aline 380 -48
+aline 476 95
+aline 571 285
+aline 619 476
+aline 619 714
+aline 571 904
+aline 523 1047
+aline 428 1190
+aline 476 1095
+aline 523 952
+aline 571 523
+amove 571 904
+aline 523 476
+aline 476 285
+aline 428 142
+aline 380 47
+aline 285 -96
+aline 142 -239
+aline -1 -334
+amove 333 -48
+aline 428 95
+aline 523 285
+aline 571 523
+aline 571 904
+stroke
+dfont endchar
+dfont char=42
+amove 238 666
+aline 380 952
+amove 380 1000
+aline 333 952
+aline 238 666
+aline 428 952
+aline 380 1000
+amove 714 666
+aline 857 952
+amove 857 1000
+aline 809 952
+aline 714 666
+aline 904 952
+aline 857 1000
+stroke
+dfont endchar
+dfont char=43
+amove 190 476
+aline 1000 476
+aline 1000 428
+aline 190 428
+aline 190 476
+amove 571 857
+aline 571 47
+aline 619 47
+aline 619 857
+aline 571 857
+stroke
+dfont endchar
+dfont char=44
+amove 142 95
+aline 142 47
+aline 190 47
+aline 190 95
+aline 142 95
+amove 190 0
+aline 142 0
+aline 95 47
+aline 95 95
+aline 142 142
+aline 190 142
+aline 238 95
+aline 238 0
+aline 190 -96
+aline 142 -143
+aline 47 -191
+amove 142 -143
+aline 190 -48
+aline 190 0
+stroke
+dfont endchar
+dfont char=45
+amove 190 476
+aline 1000 476
+aline 1000 428
+aline 190 428
+aline 190 476
+stroke
+dfont endchar
+dfont char=46
+amove 142 95
+aline 142 47
+aline 190 47
+aline 190 95
+aline 142 95
+amove 142 142
+aline 95 95
+aline 95 47
+aline 142 0
+aline 190 0
+aline 238 47
+aline 238 95
+aline 190 142
+aline 142 142
+stroke
+dfont endchar
+dfont char=47
+amove -48 -334
+aline -96 -334
+aline 1142 1190
+aline 1190 1190
+aline -48 -334
+stroke
+dfont endchar
+dfont char=48
+amove 238 95
+aline 190 190
+aline 190 380
+aline 238 571
+aline 285 714
+aline 333 809
+aline 428 904
+amove 571 1000
+aline 666 1000
+aline 761 952
+aline 809 904
+aline 857 761
+aline 857 619
+aline 809 428
+aline 761 285
+aline 666 142
+aline 571 47
+aline 428 0
+aline 333 0
+aline 238 47
+aline 190 95
+aline 142 238
+aline 142 380
+aline 190 571
+aline 238 714
+aline 333 857
+aline 428 952
+aline 571 1000
+aline 476 952
+aline 380 809
+aline 333 714
+aline 285 571
+aline 238 380
+aline 238 142
+aline 285 47
+aline 333 0
+amove 428 0
+aline 523 47
+aline 619 190
+aline 666 285
+aline 714 428
+aline 761 619
+aline 761 857
+aline 714 952
+aline 666 1000
+amove 761 904
+aline 809 809
+aline 809 619
+aline 761 428
+aline 714 285
+aline 666 190
+aline 571 95
+stroke
+dfont endchar
+dfont char=49
+amove 380 0
+aline 619 809
+aline 714 1000
+aline 428 0
+aline 333 0
+aline 571 809
+aline 476 761
+aline 333 714
+aline 428 761
+aline 571 857
+aline 714 1000
+stroke
+dfont endchar
+dfont char=50
+amove 47 0
+aline 142 190
+aline 238 285
+aline 714 571
+aline 809 666
+aline 857 761
+aline 857 857
+aline 809 952
+aline 666 1000
+aline 523 1000
+aline 380 952
+aline 333 904
+aline 285 809
+aline 285 714
+aline 380 714
+aline 380 809
+aline 333 809
+aline 333 761
+amove 523 476
+aline 666 571
+aline 761 666
+aline 809 761
+aline 809 857
+aline 761 952
+amove 666 1000
+aline 714 952
+aline 761 857
+aline 761 761
+aline 714 666
+aline 619 571
+aline 238 285
+amove 238 142
+aline 476 47
+aline 714 47
+amove 761 142
+aline 714 95
+aline 476 95
+aline 238 142
+aline 142 142
+aline 95 95
+amove 238 142
+aline 476 0
+aline 619 0
+aline 714 47
+aline 761 142
+aline 761 190
+stroke
+dfont endchar
+dfont char=51
+amove 142 238
+aline 142 190
+aline 190 190
+aline 190 285
+aline 95 285
+aline 95 190
+aline 142 95
+aline 190 47
+aline 333 0
+aline 476 0
+aline 619 47
+aline 714 95
+aline 761 190
+aline 761 333
+aline 714 428
+aline 666 476
+aline 523 523
+aline 428 523
+amove 523 523
+aline 666 571
+aline 761 619
+aline 809 666
+aline 857 761
+aline 857 857
+aline 809 952
+aline 666 1000
+aline 523 1000
+aline 380 952
+aline 333 904
+aline 285 809
+aline 285 714
+aline 380 714
+aline 380 809
+aline 333 809
+aline 333 761
+amove 523 523
+aline 619 571
+aline 714 666
+aline 761 761
+aline 761 857
+aline 714 952
+aline 666 1000
+amove 761 952
+aline 809 857
+aline 809 761
+aline 761 666
+aline 714 619
+amove 666 428
+aline 714 333
+aline 714 190
+aline 666 95
+amove 476 0
+aline 571 47
+aline 619 95
+aline 666 190
+aline 666 380
+aline 619 476
+aline 523 523
+stroke
+dfont endchar
+dfont char=52
+amove 523 0
+aline 761 809
+aline 857 1000
+aline 571 0
+aline 476 0
+aline 714 809
+amove 857 1000
+aline 95 285
+aline 857 285
+stroke
+dfont endchar
+dfont char=53
+amove 142 238
+aline 142 190
+aline 190 190
+aline 190 285
+aline 95 285
+aline 95 190
+aline 142 95
+aline 190 47
+aline 285 0
+aline 428 0
+aline 619 47
+aline 714 142
+aline 761 285
+aline 761 428
+aline 714 523
+aline 666 571
+aline 523 619
+aline 380 619
+aline 238 571
+aline 190 523
+aline 428 1000
+aline 904 1000
+aline 809 952
+aline 619 904
+aline 380 904
+amove 428 952
+aline 809 952
+amove 523 619
+aline 619 571
+aline 666 476
+aline 666 285
+aline 619 142
+aline 523 47
+aline 428 0
+amove 571 47
+aline 666 142
+aline 714 285
+aline 714 428
+aline 666 523
+stroke
+dfont endchar
+dfont char=54
+amove 238 95
+aline 190 190
+aline 190 380
+aline 238 571
+aline 285 714
+aline 380 857
+amove 571 1000
+aline 476 952
+aline 380 809
+aline 333 714
+aline 285 571
+aline 238 380
+aline 238 142
+aline 285 47
+aline 333 0
+amove 476 0
+aline 571 47
+aline 619 95
+aline 666 238
+aline 666 428
+aline 619 523
+aline 571 571
+amove 666 476
+aline 714 380
+aline 714 238
+aline 666 142
+amove 238 380
+aline 285 476
+aline 333 523
+aline 428 571
+aline 571 571
+aline 666 523
+aline 714 476
+aline 761 380
+aline 761 238
+aline 714 142
+aline 619 47
+aline 476 0
+aline 333 0
+aline 238 47
+aline 190 95
+aline 142 238
+aline 142 380
+aline 190 571
+aline 238 714
+aline 333 857
+aline 428 952
+aline 571 1000
+aline 714 1000
+aline 809 952
+aline 857 857
+aline 857 761
+aline 761 761
+aline 761 857
+aline 809 857
+aline 809 809
+stroke
+dfont endchar
+dfont char=55
+amove 333 0
+aline 380 190
+aline 476 380
+amove 380 0
+aline 285 0
+aline 333 190
+aline 380 285
+aline 476 428
+aline 761 714
+amove 714 857
+aline 476 1000
+aline 380 1000
+aline 238 857
+aline 333 904
+aline 476 904
+aline 714 857
+aline 809 857
+aline 857 904
+aline 904 999
+aline 857 857
+aline 761 714
+aline 571 476
+aline 476 333
+aline 428 190
+aline 380 -1
+amove 190 714
+aline 285 999
+amove 333 952
+aline 476 952
+aline 714 857
+stroke
+dfont endchar
+dfont char=56
+amove 142 47
+aline 380 0
+aline 666 47
+amove 666 95
+aline 714 190
+aline 714 333
+aline 666 428
+amove 666 476
+aline 523 523
+aline 714 571
+amove 761 619
+aline 809 714
+aline 809 857
+aline 761 952
+amove 809 952
+aline 619 1000
+aline 380 952
+amove 380 904
+aline 333 809
+aline 333 619
+aline 380 571
+amove 333 571
+aline 476 523
+aline 238 476
+amove 285 476
+aline 190 380
+aline 142 285
+aline 142 142
+aline 190 47
+amove 285 -1
+aline 238 47
+aline 190 142
+aline 190 285
+aline 238 380
+aline 333 476
+aline 428 523
+aline 380 619
+aline 380 809
+aline 428 904
+aline 523 999
+aline 714 999
+aline 809 952
+aline 857 857
+aline 857 714
+aline 809 619
+aline 714 571
+aline 571 523
+aline 428 523
+aline 333 571
+aline 285 666
+aline 285 809
+aline 333 904
+aline 380 952
+aline 523 1000
+amove 714 1000
+aline 761 904
+aline 761 714
+aline 714 619
+aline 666 571
+aline 571 523
+aline 666 476
+aline 714 428
+aline 761 333
+aline 761 190
+aline 714 95
+aline 666 47
+aline 476 -1
+aline 285 -1
+aline 142 47
+aline 95 142
+aline 95 285
+aline 142 380
+aline 238 476
+aline 428 523
+amove 571 523
+aline 619 476
+aline 666 380
+aline 666 190
+aline 619 95
+aline 571 47
+aline 476 0
+stroke
+dfont endchar
+dfont char=57
+amove 190 190
+aline 190 142
+aline 238 142
+aline 238 238
+aline 142 238
+aline 142 142
+aline 190 47
+aline 285 0
+aline 428 0
+aline 571 47
+aline 666 142
+aline 761 285
+aline 809 428
+aline 857 619
+aline 857 761
+aline 809 904
+aline 761 952
+aline 666 1000
+aline 523 1000
+aline 380 952
+aline 285 857
+aline 238 761
+aline 238 619
+aline 285 523
+aline 333 476
+aline 428 428
+aline 571 428
+aline 666 476
+aline 714 523
+aline 761 619
+amove 761 904
+aline 809 809
+aline 809 619
+aline 761 428
+aline 714 285
+aline 619 142
+amove 428 0
+aline 523 47
+aline 619 190
+aline 666 285
+aline 714 428
+aline 761 619
+aline 761 857
+aline 714 952
+aline 666 1000
+amove 523 1000
+aline 428 952
+aline 380 904
+aline 333 761
+aline 333 571
+aline 380 476
+aline 428 428
+amove 333 523
+aline 285 619
+aline 285 761
+aline 333 857
+stroke
+dfont endchar
+dfont char=58
+amove 142 95
+aline 142 47
+aline 190 47
+aline 190 95
+aline 142 95
+amove 142 142
+aline 95 95
+aline 95 47
+aline 142 0
+aline 190 0
+aline 238 47
+aline 238 95
+aline 190 142
+aline 142 142
+amove 285 619
+aline 285 571
+aline 333 571
+aline 333 619
+aline 285 619
+amove 285 666
+aline 238 619
+aline 238 571
+aline 285 523
+aline 333 523
+aline 380 571
+aline 380 619
+aline 333 666
+aline 285 666
+stroke
+dfont endchar
+dfont char=59
+amove 142 95
+aline 142 47
+aline 190 47
+aline 190 95
+aline 142 95
+amove 190 0
+aline 142 0
+aline 95 47
+aline 95 95
+aline 142 142
+aline 190 142
+aline 238 95
+aline 238 0
+aline 190 -96
+aline 142 -143
+aline 47 -191
+amove 142 -143
+aline 190 -48
+aline 190 0
+amove 285 619
+aline 285 571
+aline 333 571
+aline 333 619
+aline 285 619
+amove 285 666
+aline 238 619
+aline 238 571
+aline 285 523
+aline 333 523
+aline 380 571
+aline 380 619
+aline 333 666
+aline 285 666
+stroke
+dfont endchar
+dfont char=60
+amove 952 857
+aline 190 428
+aline 952 0
+stroke
+dfont endchar
+dfont char=61
+amove 190 285
+aline 1000 285
+aline 1000 238
+aline 190 238
+aline 190 285
+amove 190 666
+aline 1000 666
+aline 1000 619
+aline 190 619
+aline 190 666
+stroke
+dfont endchar
+dfont char=62
+amove 190 0
+aline 952 428
+aline 190 857
+stroke
+dfont endchar
+dfont char=63
+amove 380 95
+aline 380 47
+aline 428 47
+aline 428 95
+aline 380 95
+amove 380 142
+aline 333 95
+aline 333 47
+aline 380 0
+aline 428 0
+aline 476 47
+aline 476 95
+aline 428 142
+aline 380 142
+amove 523 333
+aline 476 380
+aline 476 476
+aline 523 523
+aline 714 619
+aline 761 666
+aline 809 761
+aline 809 857
+aline 761 952
+aline 714 1000
+amove 619 1000
+aline 857 952
+amove 809 952
+aline 857 857
+aline 857 761
+aline 809 666
+aline 761 619
+aline 666 571
+amove 571 333
+aline 523 333
+aline 428 380
+aline 428 476
+aline 523 523
+aline 714 571
+aline 809 619
+aline 857 666
+aline 904 761
+aline 904 857
+aline 857 952
+aline 714 1000
+aline 523 1000
+aline 380 952
+aline 333 904
+aline 285 809
+aline 285 714
+aline 380 714
+aline 380 809
+aline 333 809
+aline 333 761
+stroke
+dfont endchar
+dfont char=64
+amove 523 238
+aline 476 285
+aline 428 380
+aline 428 523
+aline 476 666
+aline 571 761
+amove 857 761
+aline 809 380
+aline 809 285
+aline 904 238
+aline 999 238
+aline 1095 333
+aline 1142 476
+aline 1142 571
+aline 1095 714
+aline 1047 809
+aline 952 904
+aline 857 952
+aline 714 1000
+aline 571 1000
+aline 428 952
+aline 333 904
+aline 238 809
+aline 190 714
+aline 142 571
+aline 142 428
+aline 190 285
+aline 238 190
+aline 333 95
+aline 428 47
+aline 571 0
+aline 714 0
+aline 857 47
+aline 952 95
+aline 1000 142
+amove 904 238
+aline 857 285
+aline 857 380
+aline 904 761
+amove 857 619
+aline 809 714
+aline 714 761
+aline 571 761
+aline 476 714
+aline 428 666
+aline 380 523
+aline 380 380
+aline 428 285
+aline 523 238
+aline 666 238
+aline 761 285
+aline 809 380
+stroke
+dfont endchar
+dfont char=65
+amove 0 0
+aline 619 1000
+aline 666 0
+amove 619 0
+aline 571 904
+amove 619 285
+aline 190 285
+amove 190 0
+aline -96 0
+amove 476 0
+aline 761 0
+stroke
+dfont endchar
+dfont char=66
+amove 0 0
+aline 571 0
+aline 761 47
+aline 857 142
+aline 904 285
+aline 904 380
+aline 857 476
+aline 761 523
+aline 333 523
+amove 761 523
+aline 904 571
+aline 952 619
+aline 1000 761
+aline 1000 857
+aline 952 952
+aline 809 1000
+aline 285 1000
+amove 428 1000
+aline 142 0
+amove 190 0
+aline 476 1000
+amove 809 1000
+aline 904 952
+aline 952 857
+aline 952 761
+aline 904 619
+aline 857 571
+aline 761 523
+aline 809 476
+aline 857 380
+aline 857 285
+aline 809 142
+aline 714 47
+aline 571 0
+stroke
+dfont endchar
+dfont char=67
+amove 380 0
+aline 285 47
+aline 238 95
+aline 190 238
+aline 190 380
+aline 238 571
+aline 285 714
+aline 380 857
+aline 476 952
+aline 571 1000
+amove 857 904
+aline 904 904
+aline 952 1000
+aline 904 714
+aline 904 809
+aline 857 904
+aline 809 952
+aline 714 1000
+aline 571 1000
+aline 428 952
+aline 333 857
+aline 238 714
+aline 190 571
+aline 142 380
+aline 142 238
+aline 190 95
+aline 238 47
+aline 380 0
+aline 523 0
+aline 619 47
+aline 714 142
+aline 761 238
+stroke
+dfont endchar
+dfont char=68
+amove 0 0
+aline 428 0
+aline 619 47
+aline 714 95
+aline 809 190
+aline 904 380
+aline 952 571
+aline 952 761
+aline 904 904
+aline 857 952
+aline 714 1000
+aline 285 1000
+amove 428 1000
+aline 142 0
+amove 190 0
+aline 476 1000
+amove 714 1000
+aline 809 952
+aline 857 904
+aline 904 761
+aline 904 571
+aline 857 380
+aline 761 190
+aline 666 95
+aline 571 47
+aline 428 -1
+stroke
+dfont endchar
+dfont char=69
+amove 0 0
+aline 714 0
+aline 809 238
+aline 666 0
+amove 571 333
+aline 666 714
+amove 619 523
+aline 333 523
+amove 285 1000
+aline 999 1000
+aline 952 714
+aline 952 1000
+amove 476 1000
+aline 190 0
+amove 142 0
+aline 428 1000
+stroke
+dfont endchar
+dfont char=70
+amove 0 0
+aline 333 0
+amove 190 0
+aline 476 1000
+amove 428 1000
+aline 142 0
+amove 571 333
+aline 666 714
+amove 619 523
+aline 333 523
+amove 285 1000
+aline 999 1000
+aline 952 714
+aline 952 1000
+stroke
+dfont endchar
+dfont char=71
+amove 380 0
+aline 285 47
+aline 238 95
+aline 190 238
+aline 190 380
+aline 238 571
+aline 285 714
+aline 380 857
+aline 476 952
+aline 571 1000
+amove 857 904
+aline 904 904
+aline 952 1000
+aline 904 714
+aline 904 809
+aline 857 904
+aline 809 952
+aline 714 1000
+aline 571 1000
+aline 428 952
+aline 333 857
+aline 238 714
+aline 190 571
+aline 142 380
+aline 142 238
+aline 190 95
+aline 238 47
+aline 380 0
+aline 476 0
+aline 619 47
+aline 714 142
+aline 809 333
+amove 761 333
+aline 666 142
+aline 571 47
+aline 476 0
+amove 619 333
+aline 952 333
+stroke
+dfont endchar
+dfont char=72
+amove 0 0
+aline 333 0
+amove 190 0
+aline 476 1000
+amove 428 1000
+aline 142 0
+amove 619 0
+aline 952 0
+amove 809 0
+aline 1095 1000
+amove 1047 1000
+aline 761 0
+amove 904 523
+aline 333 523
+amove 285 1000
+aline 619 1000
+amove 904 1000
+aline 1238 1000
+stroke
+dfont endchar
+dfont char=73
+amove 0 0
+aline 333 0
+amove 190 0
+aline 476 1000
+amove 428 1000
+aline 142 0
+amove 285 1000
+aline 619 1000
+stroke
+dfont endchar
+dfont char=74
+amove 95 190
+aline 142 238
+aline 95 285
+aline 47 238
+aline 47 142
+aline 95 47
+aline 190 0
+aline 285 0
+aline 380 47
+aline 428 95
+aline 476 190
+aline 714 1000
+amove 666 1000
+aline 428 190
+aline 380 95
+aline 285 0
+amove 523 1000
+aline 857 1000
+stroke
+dfont endchar
+dfont char=75
+amove 0 0
+aline 333 0
+amove 190 0
+aline 476 1000
+amove 428 1000
+aline 142 0
+amove 285 380
+aline 1095 1000
+amove 1190 1000
+aline 904 1000
+amove 619 1000
+aline 285 1000
+amove 571 571
+aline 761 0
+amove 809 0
+aline 619 571
+amove 619 0
+aline 904 0
+stroke
+dfont endchar
+dfont char=76
+amove 0 0
+aline 714 0
+aline 809 285
+aline 666 0
+amove 190 0
+aline 476 1000
+amove 428 1000
+aline 142 0
+amove 285 1000
+aline 619 1000
+stroke
+dfont endchar
+dfont char=77
+amove 0 0
+aline 285 0
+amove 142 0
+aline 428 1000
+aline 476 0
+aline 1095 1000
+aline 809 0
+amove 857 0
+aline 1142 1000
+amove 1095 1000
+aline 1285 1000
+amove 476 1000
+aline 523 95
+amove 666 -1
+aline 1000 -1
+amove 476 1000
+aline 285 1000
+stroke
+dfont endchar
+dfont char=78
+amove 0 0
+aline 285 0
+amove 142 0
+aline 428 1000
+aline 761 142
+amove 761 0
+aline 428 857
+amove 428 1000
+aline 285 1000
+amove 904 1000
+aline 1190 1000
+amove 1047 1000
+aline 761 0
+stroke
+dfont endchar
+dfont char=79
+amove 333 0
+aline 238 95
+aline 190 238
+aline 190 380
+aline 238 571
+aline 285 714
+aline 380 857
+aline 476 952
+aline 571 1000
+aline 714 1000
+aline 809 952
+aline 857 904
+aline 904 761
+aline 904 619
+aline 857 428
+aline 809 285
+aline 714 142
+aline 619 47
+aline 476 -1
+aline 333 -1
+aline 238 47
+aline 190 95
+aline 142 238
+aline 142 380
+aline 190 571
+aline 238 714
+aline 333 857
+aline 428 952
+aline 571 1000
+amove 714 1000
+aline 809 904
+aline 857 761
+aline 857 619
+aline 809 428
+aline 761 285
+aline 666 142
+aline 571 47
+aline 476 0
+stroke
+dfont endchar
+dfont char=80
+amove 0 0
+aline 333 0
+amove 190 0
+aline 476 1000
+amove 428 1000
+aline 142 0
+amove 333 476
+aline 714 476
+aline 904 523
+aline 1000 619
+aline 1047 761
+aline 1047 857
+aline 1000 952
+aline 857 1000
+aline 285 1000
+amove 857 1000
+aline 952 952
+aline 1000 857
+aline 1000 761
+aline 952 619
+aline 857 523
+aline 714 476
+stroke
+dfont endchar
+dfont char=81
+amove 238 95
+aline 238 142
+aline 285 238
+aline 380 285
+aline 428 285
+aline 523 238
+aline 571 142
+aline 571 -191
+aline 619 -239
+aline 714 -239
+aline 761 -143
+aline 761 -96
+amove 761 -143
+aline 714 -191
+aline 666 -191
+aline 619 -143
+aline 571 142
+amove 476 0
+aline 571 47
+aline 666 142
+aline 761 285
+aline 809 428
+aline 857 619
+aline 857 761
+aline 809 904
+aline 714 1000
+amove 571 1000
+aline 714 1000
+aline 809 952
+aline 857 904
+aline 904 761
+aline 904 619
+aline 857 428
+aline 809 285
+aline 714 142
+aline 619 47
+aline 476 -1
+aline 333 -1
+aline 238 47
+aline 190 95
+aline 142 238
+aline 142 380
+aline 190 571
+aline 238 714
+aline 333 857
+aline 428 952
+aline 571 1000
+aline 476 952
+aline 380 857
+aline 285 714
+aline 238 571
+aline 190 380
+aline 190 238
+aline 238 95
+aline 333 0
+stroke
+dfont endchar
+dfont char=82
+amove 0 0
+aline 333 0
+amove 190 0
+aline 476 1000
+amove 428 1000
+aline 142 0
+amove 333 523
+aline 761 523
+aline 904 571
+aline 952 619
+aline 1000 761
+aline 1000 857
+aline 952 952
+aline 809 1000
+aline 285 1000
+amove 809 1000
+aline 904 952
+aline 952 857
+aline 952 761
+aline 904 619
+aline 857 571
+aline 761 523
+amove 714 428
+aline 809 95
+aline 857 47
+aline 904 47
+aline 952 95
+amove 952 142
+aline 952 95
+aline 904 -1
+aline 809 -1
+aline 761 47
+aline 714 428
+aline 666 476
+aline 571 523
+stroke
+dfont endchar
+dfont char=83
+amove 190 95
+aline 142 95
+aline 95 0
+aline 142 285
+aline 142 190
+aline 190 95
+aline 238 47
+aline 380 0
+aline 571 0
+aline 714 47
+aline 761 95
+aline 809 190
+aline 809 333
+aline 761 428
+aline 714 476
+aline 380 666
+aline 285 761
+amove 904 904
+aline 952 904
+aline 1000 1000
+aline 952 714
+aline 952 809
+aline 904 904
+aline 857 952
+aline 714 1000
+aline 523 1000
+aline 380 952
+aline 285 857
+aline 285 761
+aline 333 666
+aline 380 619
+aline 714 428
+aline 809 333
+stroke
+dfont endchar
+dfont char=84
+amove 190 0
+aline 523 0
+amove 380 0
+aline 666 1000
+amove 619 1000
+aline 333 0
+amove 333 1000
+aline 190 714
+aline 285 1000
+aline 1000 1000
+aline 952 714
+aline 952 1000
+stroke
+dfont endchar
+dfont char=85
+amove 380 0
+aline 285 47
+aline 238 142
+aline 238 285
+aline 285 476
+aline 428 1000
+amove 380 1000
+aline 238 476
+aline 190 285
+aline 190 142
+aline 238 47
+aline 380 0
+aline 571 0
+aline 714 47
+aline 809 142
+aline 857 285
+aline 1047 1000
+amove 904 1000
+aline 1190 1000
+amove 571 1000
+aline 238 1000
+stroke
+dfont endchar
+dfont char=86
+amove 333 0
+aline 285 1000
+amove 333 1000
+aline 380 95
+amove 333 -1
+aline 952 1000
+amove 1047 1000
+aline 761 1000
+amove 476 1000
+aline 190 1000
+stroke
+dfont endchar
+dfont char=87
+amove 285 0
+aline 380 1000
+amove 428 1000
+aline 333 95
+amove 285 -1
+aline 761 1000
+aline 666 0
+aline 1142 1000
+amove 1000 1000
+aline 1285 1000
+amove 809 1000
+aline 714 95
+amove 571 1000
+aline 238 1000
+stroke
+dfont endchar
+dfont char=88
+amove 47 0
+aline 1000 1000
+amove 1095 1000
+aline 809 1000
+amove 523 1000
+aline 238 1000
+amove 333 1000
+aline 666 0
+amove 714 0
+aline 380 1000
+amove 238 0
+aline -48 0
+amove 523 0
+aline 809 0
+stroke
+dfont endchar
+dfont char=89
+amove 190 0
+aline 523 0
+amove 380 0
+aline 523 523
+aline 333 1000
+amove 285 1000
+aline 476 523
+aline 333 0
+amove 523 523
+aline 1000 1000
+amove 1095 1000
+aline 809 1000
+amove 476 1000
+aline 190 1000
+stroke
+dfont endchar
+dfont char=90
+amove 47 0
+aline 952 1000
+amove 1000 1000
+aline 95 0
+amove 47 0
+aline 714 0
+aline 809 285
+aline 666 0
+amove 380 1000
+aline 238 714
+aline 333 1000
+aline 999 1000
+stroke
+dfont endchar
+dfont char=91
+amove 190 -334
+aline 190 1190
+aline 523 1190
+amove 238 1190
+aline 238 -334
+amove 190 -334
+aline 523 -334
+stroke
+dfont endchar
+stroke
+dfont endchar
+dfont char=93
+amove 142 -334
+aline 476 -334
+aline 476 1190
+aline 142 1190
+amove 428 1190
+aline 428 -334
+stroke
+dfont endchar
+stroke
+dfont endchar
+stroke
+dfont endchar
+dfont char=96
+amove 238 904
+aline 285 952
+aline 238 1000
+aline 190 952
+aline 190 857
+aline 238 761
+aline 285 714
+stroke
+dfont endchar
+dfont char=97
+amove 238 47
+aline 190 142
+aline 190 333
+aline 238 476
+aline 333 619
+aline 428 666
+amove 761 666
+aline 666 333
+aline 619 142
+aline 619 47
+aline 666 0
+aline 809 0
+aline 904 95
+aline 952 190
+amove 714 0
+aline 666 47
+aline 666 142
+aline 714 333
+aline 809 666
+amove 666 333
+aline 666 476
+aline 619 619
+aline 523 666
+aline 428 666
+aline 285 619
+aline 190 476
+aline 142 333
+aline 142 190
+aline 190 95
+aline 238 47
+aline 333 0
+aline 428 0
+aline 523 47
+aline 619 190
+aline 666 333
+stroke
+dfont endchar
+dfont char=98
+amove 285 47
+aline 238 95
+aline 190 238
+aline 190 380
+aline 380 1000
+amove 428 1000
+aline 238 380
+aline 238 190
+aline 285 47
+aline 380 0
+aline 476 0
+aline 619 47
+aline 714 190
+aline 761 333
+aline 761 476
+aline 714 571
+aline 666 619
+aline 571 666
+aline 476 666
+aline 380 619
+aline 285 523
+aline 238 380
+amove 476 0
+aline 571 47
+aline 666 190
+aline 714 333
+aline 714 523
+aline 666 619
+amove 428 1000
+aline 238 1000
+stroke
+dfont endchar
+dfont char=99
+amove 238 47
+aline 190 142
+aline 190 333
+aline 238 476
+aline 333 619
+aline 428 666
+amove 666 523
+aline 666 476
+aline 714 476
+aline 714 523
+aline 666 619
+aline 571 666
+aline 428 666
+aline 285 619
+aline 190 476
+aline 142 333
+aline 142 190
+aline 190 95
+aline 238 47
+aline 333 0
+aline 428 0
+aline 571 47
+aline 666 190
+stroke
+dfont endchar
+dfont char=100
+amove 238 47
+aline 190 142
+aline 190 333
+aline 238 476
+aline 333 619
+aline 428 666
+amove 666 333
+aline 666 476
+aline 619 619
+aline 523 666
+aline 428 666
+aline 285 619
+aline 190 476
+aline 142 333
+aline 142 190
+aline 190 95
+aline 238 47
+aline 333 0
+aline 428 0
+aline 523 47
+aline 619 190
+aline 666 333
+amove 952 190
+aline 904 95
+aline 809 0
+aline 666 0
+aline 619 47
+aline 619 142
+aline 666 333
+aline 857 1000
+amove 904 1000
+aline 714 333
+aline 666 142
+aline 666 47
+aline 714 0
+amove 714 1000
+aline 904 1000
+stroke
+dfont endchar
+dfont char=101
+amove 238 47
+aline 190 142
+aline 190 333
+aline 238 476
+aline 333 619
+aline 428 666
+amove 190 238
+aline 380 285
+aline 523 333
+aline 666 428
+aline 714 523
+aline 666 619
+aline 571 666
+aline 428 666
+aline 285 619
+aline 190 476
+aline 142 333
+aline 142 190
+aline 190 95
+aline 238 47
+aline 333 0
+aline 428 0
+aline 571 47
+aline 666 142
+stroke
+dfont endchar
+dfont char=102
+amove -48 -286
+aline -1 -239
+aline -48 -191
+aline -96 -239
+aline -96 -286
+aline -48 -334
+aline 47 -334
+aline 142 -286
+aline 190 -239
+aline 238 -143
+aline 285 0
+aline 333 190
+aline 428 619
+aline 476 809
+aline 523 904
+aline 619 1000
+amove 714 952
+aline 666 904
+aline 714 857
+aline 761 904
+aline 761 952
+aline 714 1000
+aline 619 1000
+aline 523 952
+aline 476 904
+aline 428 809
+aline 380 666
+aline 238 0
+aline 190 -191
+aline 142 -286
+amove 190 666
+aline 666 666
+stroke
+dfont endchar
+dfont char=103
+amove 238 47
+aline 190 142
+aline 190 333
+aline 238 476
+aline 333 619
+aline 428 666
+amove 761 666
+aline 571 0
+aline 523 -143
+aline 428 -286
+aline 333 -334
+amove 95 -239
+aline 142 -191
+aline 95 -143
+aline 47 -191
+aline 47 -239
+aline 95 -286
+aline 190 -334
+aline 333 -334
+aline 476 -286
+aline 571 -143
+aline 619 -1
+aline 809 666
+amove 666 333
+aline 666 476
+aline 619 619
+aline 523 666
+aline 428 666
+aline 285 619
+aline 190 476
+aline 142 333
+aline 142 190
+aline 190 95
+aline 238 47
+aline 333 -1
+aline 428 -1
+aline 523 47
+aline 619 190
+aline 666 333
+stroke
+dfont endchar
+dfont char=104
+amove 95 0
+aline 380 1000
+amove 428 1000
+aline 142 0
+amove 238 333
+aline 333 523
+aline 428 619
+aline 523 666
+aline 619 666
+aline 714 619
+aline 761 571
+aline 761 476
+aline 666 190
+aline 666 47
+aline 714 -1
+amove 952 190
+aline 904 95
+aline 809 -1
+aline 666 -1
+aline 619 47
+aline 619 190
+aline 714 476
+aline 714 571
+aline 619 666
+amove 428 999
+aline 238 999
+stroke
+dfont endchar
+dfont char=105
+amove 333 0
+aline 285 47
+aline 285 190
+aline 380 476
+aline 380 619
+aline 333 666
+aline 190 666
+aline 95 571
+aline 47 476
+amove 285 666
+aline 333 619
+aline 333 476
+aline 238 190
+aline 238 47
+aline 285 0
+aline 428 0
+aline 523 95
+aline 571 190
+amove 428 1000
+aline 380 952
+aline 428 904
+aline 476 952
+aline 428 1000
+stroke
+dfont endchar
+dfont char=106
+amove -48 -286
+aline -1 -239
+aline -48 -191
+aline -96 -239
+aline -96 -286
+aline -48 -334
+aline 47 -334
+aline 142 -286
+aline 190 -239
+aline 238 -143
+aline 285 0
+aline 428 476
+aline 428 619
+aline 380 666
+aline 238 666
+aline 142 571
+aline 95 476
+amove 333 666
+aline 380 619
+aline 380 476
+aline 238 0
+aline 190 -143
+aline 142 -239
+aline 47 -334
+amove 476 1000
+aline 428 952
+aline 476 904
+aline 523 952
+aline 476 1000
+stroke
+dfont endchar
+dfont char=107
+amove 95 0
+aline 380 1000
+amove 428 1000
+aline 142 0
+amove 238 380
+aline 333 380
+aline 428 428
+aline 619 619
+aline 714 666
+aline 761 666
+aline 809 619
+aline 809 571
+aline 761 523
+aline 714 571
+aline 761 619
+amove 809 190
+aline 714 47
+aline 619 0
+aline 523 0
+aline 476 47
+aline 380 333
+aline 333 380
+aline 428 333
+aline 523 47
+aline 571 0
+amove 428 1000
+aline 238 1000
+stroke
+dfont endchar
+dfont char=108
+amove 238 0
+aline 190 47
+aline 190 142
+aline 238 333
+aline 428 1000
+aline 238 1000
+amove 380 1000
+aline 190 333
+aline 142 142
+aline 142 47
+aline 190 0
+aline 333 0
+aline 428 95
+aline 476 190
+stroke
+dfont endchar
+dfont char=109
+amove 190 0
+aline 285 333
+aline 333 523
+aline 333 619
+aline 285 666
+amove 47 476
+aline 95 571
+aline 190 666
+aline 333 666
+aline 380 619
+aline 380 523
+aline 333 333
+aline 238 0
+amove 333 333
+aline 428 523
+aline 523 619
+aline 619 666
+aline 714 666
+aline 809 619
+aline 857 571
+aline 857 476
+aline 714 -1
+amove 666 -1
+aline 809 476
+aline 809 571
+aline 714 666
+amove 809 333
+aline 904 523
+aline 1000 619
+aline 1095 666
+aline 1190 666
+aline 1285 619
+aline 1333 571
+aline 1333 476
+aline 1238 190
+aline 1238 47
+aline 1285 -1
+amove 1523 190
+aline 1476 95
+aline 1380 -1
+aline 1238 -1
+aline 1190 47
+aline 1190 190
+aline 1285 476
+aline 1285 571
+aline 1190 666
+stroke
+dfont endchar
+dfont char=110
+amove 190 0
+aline 285 333
+aline 333 523
+aline 333 619
+aline 285 666
+amove 47 476
+aline 95 571
+aline 190 666
+aline 333 666
+aline 380 619
+aline 380 523
+aline 333 333
+aline 238 0
+amove 333 333
+aline 428 523
+aline 523 619
+aline 619 666
+aline 714 666
+aline 809 619
+aline 857 571
+aline 857 476
+aline 761 190
+aline 761 47
+aline 809 -1
+amove 1047 190
+aline 1000 95
+aline 904 -1
+aline 761 -1
+aline 714 47
+aline 714 190
+aline 809 476
+aline 809 571
+aline 714 666
+stroke
+dfont endchar
+dfont char=111
+amove 238 47
+aline 190 142
+aline 190 333
+aline 238 476
+aline 333 619
+aline 428 666
+aline 523 666
+aline 619 619
+aline 666 571
+aline 714 476
+aline 714 333
+aline 666 190
+aline 571 47
+aline 428 -1
+aline 333 -1
+aline 238 47
+aline 190 95
+aline 142 190
+aline 142 333
+aline 190 476
+aline 285 619
+aline 428 666
+amove 619 619
+aline 666 523
+aline 666 333
+aline 619 190
+aline 523 47
+aline 428 0
+stroke
+dfont endchar
+dfont char=112
+amove -48 -334
+aline 285 -334
+amove 142 -334
+aline 333 333
+aline 380 523
+aline 380 619
+aline 333 666
+aline 190 666
+aline 95 571
+aline 47 476
+amove 285 666
+aline 333 619
+aline 333 523
+aline 285 333
+aline 95 -334
+amove 571 0
+aline 666 47
+aline 761 190
+aline 809 333
+aline 809 523
+aline 761 619
+amove 333 333
+aline 380 476
+aline 476 619
+aline 571 666
+aline 666 666
+aline 761 619
+aline 809 571
+aline 857 476
+aline 857 333
+aline 809 190
+aline 714 47
+aline 571 -1
+aline 476 -1
+aline 380 47
+aline 333 190
+aline 333 333
+stroke
+dfont endchar
+dfont char=113
+amove 238 47
+aline 190 142
+aline 190 333
+aline 238 476
+aline 333 619
+aline 428 666
+amove 761 666
+aline 476 -334
+amove 523 -334
+aline 809 666
+amove 666 333
+aline 666 476
+aline 619 619
+aline 523 666
+aline 428 666
+aline 285 619
+aline 190 476
+aline 142 333
+aline 142 190
+aline 190 95
+aline 238 47
+aline 333 0
+aline 428 0
+aline 523 47
+aline 619 190
+aline 666 333
+amove 666 -334
+aline 333 -334
+stroke
+dfont endchar
+dfont char=114
+amove 190 0
+aline 285 333
+aline 333 523
+aline 333 619
+aline 285 666
+amove 47 476
+aline 95 571
+aline 190 666
+aline 333 666
+aline 380 619
+aline 380 523
+aline 333 333
+aline 238 0
+amove 333 333
+aline 428 523
+aline 523 619
+aline 619 666
+aline 714 666
+aline 761 619
+aline 761 571
+aline 714 523
+aline 666 571
+aline 714 619
+stroke
+dfont endchar
+dfont char=115
+amove 142 95
+aline 142 142
+aline 95 142
+aline 95 95
+aline 142 47
+aline 285 0
+aline 428 0
+aline 571 47
+aline 619 95
+aline 619 238
+aline 571 285
+aline 238 476
+aline 190 523
+amove 666 571
+aline 666 523
+aline 714 523
+aline 714 571
+aline 666 619
+aline 523 666
+aline 380 666
+aline 238 619
+aline 190 571
+aline 190 476
+aline 238 428
+aline 571 238
+aline 619 190
+stroke
+dfont endchar
+dfont char=116
+amove 285 0
+aline 238 47
+aline 238 142
+aline 285 333
+aline 476 1000
+amove 428 1000
+aline 238 333
+aline 190 142
+aline 190 47
+aline 238 0
+aline 380 0
+aline 476 95
+aline 523 190
+amove 571 666
+aline 142 666
+stroke
+dfont endchar
+dfont char=117
+amove 380 0
+aline 285 95
+aline 285 190
+aline 380 476
+aline 380 619
+aline 333 666
+aline 190 666
+aline 95 571
+aline 47 476
+amove 285 666
+aline 333 619
+aline 333 476
+aline 238 190
+aline 238 95
+aline 285 47
+aline 380 0
+aline 476 0
+aline 571 47
+aline 666 142
+aline 761 333
+amove 1047 190
+aline 1000 95
+aline 904 0
+aline 761 0
+aline 714 47
+aline 714 142
+aline 761 333
+aline 857 666
+amove 904 666
+aline 809 333
+aline 761 142
+aline 761 47
+aline 809 0
+stroke
+dfont endchar
+dfont char=118
+amove 380 0
+aline 285 95
+aline 285 190
+aline 380 476
+aline 380 619
+aline 333 666
+aline 190 666
+aline 95 571
+aline 47 476
+amove 285 666
+aline 333 619
+aline 333 476
+aline 238 190
+aline 238 95
+aline 285 47
+aline 380 0
+aline 428 0
+aline 571 47
+aline 666 142
+aline 761 285
+aline 809 476
+aline 809 666
+aline 761 666
+aline 809 571
+stroke
+dfont endchar
+dfont char=119
+amove 380 0
+aline 285 95
+aline 285 190
+aline 380 476
+aline 380 619
+aline 333 666
+aline 190 666
+aline 95 571
+aline 47 476
+amove 285 666
+aline 333 619
+aline 333 476
+aline 238 190
+aline 238 95
+aline 285 47
+aline 380 0
+aline 476 0
+aline 571 47
+aline 666 142
+aline 714 238
+amove 857 0
+aline 761 95
+aline 761 238
+aline 857 666
+amove 809 666
+aline 714 238
+aline 714 95
+aline 761 47
+aline 857 0
+aline 952 0
+aline 1047 47
+aline 1142 142
+aline 1190 238
+aline 1238 428
+aline 1238 666
+aline 1190 666
+aline 1238 571
+stroke
+dfont endchar
+dfont char=120
+amove 142 47
+aline 190 95
+aline 142 142
+aline 95 95
+aline 95 47
+aline 142 0
+aline 190 0
+aline 285 47
+aline 380 142
+aline 428 238
+aline 476 428
+aline 476 571
+aline 428 666
+amove 523 428
+aline 523 571
+aline 476 666
+aline 333 666
+aline 238 619
+aline 142 476
+amove 428 238
+aline 428 95
+aline 476 0
+aline 619 0
+aline 714 47
+aline 809 190
+amove 523 0
+aline 476 95
+aline 476 238
+aline 523 428
+aline 571 523
+aline 666 619
+aline 761 666
+aline 809 666
+aline 857 619
+aline 857 571
+aline 809 523
+aline 761 571
+aline 809 619
+stroke
+dfont endchar
+dfont char=121
+amove 190 -239
+aline 238 -191
+aline 190 -143
+aline 142 -191
+aline 142 -239
+aline 190 -286
+aline 285 -334
+aline 428 -334
+aline 571 -286
+aline 666 -143
+aline 714 0
+aline 904 666
+amove 857 666
+aline 666 0
+aline 619 -143
+aline 523 -286
+aline 428 -334
+amove 380 -1
+aline 285 95
+aline 285 190
+aline 380 476
+aline 380 619
+aline 333 666
+aline 190 666
+aline 95 571
+aline 47 476
+amove 285 666
+aline 333 619
+aline 333 476
+aline 238 190
+aline 238 95
+aline 285 47
+aline 380 -1
+aline 476 -1
+aline 571 47
+aline 666 142
+aline 761 333
+stroke
+dfont endchar
+dfont char=122
+amove 142 0
+aline 190 95
+aline 285 190
+aline 666 476
+aline 761 571
+aline 809 666
+amove 761 571
+aline 666 571
+aline 476 619
+aline 333 619
+aline 238 571
+amove 190 476
+aline 238 571
+aline 333 666
+aline 476 666
+aline 666 571
+amove 761 190
+aline 714 95
+aline 619 -1
+aline 476 -1
+aline 285 95
+amove 190 95
+aline 285 95
+aline 476 47
+aline 619 47
+aline 714 95
+stroke
+dfont endchar
+dfont char=123
+amove 380 238
+aline 333 95
+aline 333 -96
+aline 380 -239
+amove 476 -334
+aline 333 -191
+aline 285 -48
+aline 285 47
+aline 333 190
+aline 428 285
+aline 428 333
+aline 238 428
+aline 428 523
+aline 428 571
+aline 333 666
+aline 285 809
+aline 285 904
+aline 333 1047
+aline 476 1190
+amove 380 1095
+aline 333 952
+aline 333 761
+aline 380 619
+stroke
+dfont endchar
+dfont char=124
+amove 238 571
+aline 714 857
+aline 666 857
+aline 285 571
+aline 238 571
+aline 238 619
+aline 714 809
+aline 714 857
+amove 476 1000
+aline 476 428
+aline 523 476
+aline 428 952
+aline 476 1000
+aline 523 952
+aline 428 476
+aline 476 428
+amove 714 571
+aline 238 857
+aline 285 857
+aline 666 571
+aline 714 571
+aline 714 619
+aline 238 809
+aline 238 857
+stroke
+dfont endchar
+dfont char=125
+amove 238 -334
+aline 380 -191
+aline 428 -48
+aline 428 47
+aline 380 190
+aline 285 285
+aline 285 333
+aline 476 428
+aline 285 523
+aline 285 571
+aline 380 666
+aline 428 809
+aline 428 904
+aline 380 1047
+aline 238 1190
+amove 333 1095
+aline 380 952
+aline 380 761
+aline 333 619
+amove 333 238
+aline 380 95
+aline 380 -96
+aline 333 -239
+stroke
+dfont endchar
+dfont char=126
+amove 142 47
+aline 333 0
+amove 285 0
+aline 238 47
+aline 190 142
+aline 190 238
+aline 238 333
+aline 285 380
+aline 380 428
+aline 619 571
+amove 523 523
+aline 571 380
+aline 714 95
+aline 809 47
+amove 952 95
+aline 904 47
+aline 857 47
+aline 761 95
+aline 666 238
+aline 571 428
+aline 523 571
+aline 476 714
+amove 333 428
+aline 238 380
+aline 190 333
+aline 142 238
+aline 142 142
+aline 190 47
+amove 952 142
+aline 952 95
+aline 904 0
+aline 809 0
+aline 714 47
+aline 619 190
+aline 571 285
+aline 523 428
+aline 476 714
+aline 476 857
+aline 523 952
+aline 619 1000
+aline 714 952
+aline 761 857
+aline 761 761
+aline 714 666
+aline 619 571
+aline 523 523
+aline 285 428
+aline 190 380
+aline 142 333
+aline 95 238
+aline 95 142
+aline 142 47
+aline 285 0
+aline 428 0
+aline 523 47
+aline 619 142
+aline 857 523
+aline 952 619
+aline 1047 666
+aline 1095 666
+aline 1142 619
+aline 1142 523
+aline 1047 523
+aline 1047 619
+aline 1095 619
+aline 1095 571
+stroke
+dfont endchar
diff --git a/src/fonts/pltr.afm b/src/fonts/pltr.afm
new file mode 100644
index 0000000..1a906cd
--- /dev/null
+++ b/src/fonts/pltr.afm
@@ -0,0 +1,115 @@
+StartFontMetrics 2.0
+Comment Made from HERSHEY font file using SPLITFONT.BAS
+FontName plTR
+EncodingScheme TEXENCODING
+FullName plTR
+FamilyName plTR
+Weight Medium
+ItalicAngle 0
+IsFixedPitch false
+UnderlinePosition -97
+UnderlineThickness 73
+FontBBox 0 -400 1001 1001
+CapHeight 729
+XHeight 151
+Descender -219
+Ascender 729
+StartCharMetrics 95
+C 32 ; WX 400 ; N C32 ; B 0 0 0 0 ;
+C 33 ; WX 351 ; N C33 ; B 133 0 233 700 ;
+C 34 ; WX 351 ; N C34 ; B 133 466 233 700 ;
+C 35 ; WX 300 ; N C35 ; B 0 0 0 0 ;
+C 36 ; WX 651 ; N C36 ; B 99 -133 566 833 ;
+C 37 ; WX 784 ; N C37 ; B 99 0 700 700 ;
+C 38 ; WX 300 ; N C38 ; B 0 0 0 0 ;
+C 39 ; WX 351 ; N C39 ; B 133 466 233 700 ;
+C 40 ; WX 451 ; N C40 ; B 99 -233 333 833 ;
+C 41 ; WX 451 ; N C41 ; B 133 -233 366 833 ;
+C 42 ; WX 585 ; N C42 ; B 133 466 500 700 ;
+C 43 ; WX 818 ; N C43 ; B 133 32 700 600 ;
+C 44 ; WX 351 ; N C44 ; B 133 -133 233 99 ;
+C 45 ; WX 818 ; N C45 ; B 133 299 700 333 ;
+C 46 ; WX 351 ; N C46 ; B 133 0 233 99 ;
+C 47 ; WX 751 ; N C47 ; B 66 -233 700 833 ;
+C 48 ; WX 651 ; N C48 ; B 99 0 566 700 ;
+C 49 ; WX 651 ; N C49 ; B 166 0 500 700 ;
+C 50 ; WX 651 ; N C50 ; B 99 0 566 700 ;
+C 51 ; WX 651 ; N C51 ; B 99 0 566 700 ;
+C 52 ; WX 651 ; N C52 ; B 66 0 600 700 ;
+C 53 ; WX 651 ; N C53 ; B 99 0 566 700 ;
+C 54 ; WX 651 ; N C54 ; B 99 0 566 700 ;
+C 55 ; WX 651 ; N C55 ; B 99 0 566 700 ;
+C 56 ; WX 651 ; N C56 ; B 99 0 566 700 ;
+C 57 ; WX 651 ; N C57 ; B 99 0 566 700 ;
+C 58 ; WX 351 ; N C58 ; B 133 0 233 466 ;
+C 59 ; WX 351 ; N C59 ; B 133 -133 233 466 ;
+C 60 ; WX 784 ; N C60 ; B 133 0 666 600 ;
+C 61 ; WX 818 ; N C61 ; B 133 166 700 466 ;
+C 62 ; WX 784 ; N C62 ; B 133 0 666 600 ;
+C 63 ; WX 618 ; N C63 ; B 99 0 532 700 ;
+C 64 ; WX 884 ; N C64 ; B 99 0 799 700 ;
+C 65 ; WX 651 ; N C65 ; B 32 0 633 700 ;
+C 66 ; WX 718 ; N C66 ; B 66 0 633 700 ;
+C 67 ; WX 685 ; N C67 ; B 99 0 600 700 ;
+C 68 ; WX 718 ; N C68 ; B 66 0 633 700 ;
+C 69 ; WX 685 ; N C69 ; B 66 0 600 700 ;
+C 70 ; WX 651 ; N C70 ; B 66 0 600 700 ;
+C 71 ; WX 751 ; N C71 ; B 99 0 700 700 ;
+C 72 ; WX 784 ; N C72 ; B 66 0 733 700 ;
+C 73 ; WX 384 ; N C73 ; B 66 0 333 700 ;
+C 74 ; WX 518 ; N C74 ; B 66 0 466 700 ;
+C 75 ; WX 718 ; N C75 ; B 66 0 700 700 ;
+C 76 ; WX 585 ; N C76 ; B 66 0 566 700 ;
+C 77 ; WX 851 ; N C77 ; B 66 0 799 700 ;
+C 78 ; WX 784 ; N C78 ; B 66 0 733 700 ;
+C 79 ; WX 718 ; N C79 ; B 99 0 633 700 ;
+C 80 ; WX 718 ; N C80 ; B 66 0 633 700 ;
+C 81 ; WX 718 ; N C81 ; B 99 -167 633 700 ;
+C 82 ; WX 718 ; N C82 ; B 66 0 666 700 ;
+C 83 ; WX 651 ; N C83 ; B 99 0 566 700 ;
+C 84 ; WX 651 ; N C84 ; B 66 0 600 700 ;
+C 85 ; WX 784 ; N C85 ; B 66 0 733 700 ;
+C 86 ; WX 651 ; N C86 ; B 32 0 633 700 ;
+C 87 ; WX 784 ; N C87 ; B 32 0 766 700 ;
+C 88 ; WX 651 ; N C88 ; B 32 0 633 700 ;
+C 89 ; WX 718 ; N C89 ; B 32 0 700 700 ;
+C 90 ; WX 651 ; N C90 ; B 99 0 566 700 ;
+C 91 ; WX 451 ; N C91 ; B 133 -233 366 833 ;
+C 92 ; WX 300 ; N C92 ; B 0 0 0 0 ;
+C 93 ; WX 451 ; N C93 ; B 99 -233 333 833 ;
+C 94 ; WX 300 ; N C94 ; B 0 0 0 0 ;
+C 95 ; WX 300 ; N C95 ; B 0 0 0 0 ;
+C 96 ; WX 318 ; N C96 ; B 133 500 199 700 ;
+C 97 ; WX 651 ; N C97 ; B 99 0 600 466 ;
+C 98 ; WX 685 ; N C98 ; B 66 0 600 700 ;
+C 99 ; WX 618 ; N C99 ; B 99 0 532 466 ;
+C 100 ; WX 685 ; N C100 ; B 99 0 633 700 ;
+C 101 ; WX 618 ; N C101 ; B 99 0 532 466 ;
+C 102 ; WX 451 ; N C102 ; B 66 0 433 700 ;
+C 103 ; WX 618 ; N C103 ; B 66 -233 566 466 ;
+C 104 ; WX 751 ; N C104 ; B 66 0 700 700 ;
+C 105 ; WX 384 ; N C105 ; B 66 0 333 700 ;
+C 106 ; WX 418 ; N C106 ; B 32 -233 299 700 ;
+C 107 ; WX 718 ; N C107 ; B 66 0 666 700 ;
+C 108 ; WX 384 ; N C108 ; B 66 0 333 700 ;
+C 109 ; WX 1118 ; N C109 ; B 66 0 1066 466 ;
+C 110 ; WX 751 ; N C110 ; B 66 0 700 466 ;
+C 111 ; WX 651 ; N C111 ; B 99 0 566 466 ;
+C 112 ; WX 685 ; N C112 ; B 66 -233 600 466 ;
+C 113 ; WX 651 ; N C113 ; B 99 -233 633 466 ;
+C 114 ; WX 551 ; N C114 ; B 66 0 500 466 ;
+C 115 ; WX 551 ; N C115 ; B 99 0 466 466 ;
+C 116 ; WX 485 ; N C116 ; B 66 0 466 700 ;
+C 117 ; WX 751 ; N C117 ; B 66 0 700 466 ;
+C 118 ; WX 585 ; N C118 ; B 32 0 566 466 ;
+C 119 ; WX 784 ; N C119 ; B 32 0 766 466 ;
+C 120 ; WX 651 ; N C120 ; B 66 0 600 466 ;
+C 121 ; WX 618 ; N C121 ; B 32 -233 600 466 ;
+C 122 ; WX 585 ; N C122 ; B 99 0 500 466 ;
+C 123 ; WX 485 ; N C123 ; B 166 -233 333 833 ;
+C 124 ; WX 518 ; N C124 ; B 99 299 433 700 ;
+C 125 ; WX 485 ; N C125 ; B 166 -233 333 833 ;
+C 126 ; WX 851 ; N C126 ; B 133 0 766 700 ;
+EndCharMetrics
+
+EndFontMetrics
diff --git a/src/fonts/pltr.gle b/src/fonts/pltr.gle
new file mode 100644
index 0000000..86022b6
--- /dev/null
+++ b/src/fonts/pltr.gle
@@ -0,0 +1,3368 @@
+dfont design= 1428
+dfont char=33
+amove 238 95
+aline 238 47
+aline 285 47
+aline 285 95
+aline 238 95
+amove 238 142
+aline 190 95
+aline 190 47
+aline 238 0
+aline 285 0
+aline 333 47
+aline 333 95
+aline 285 142
+aline 238 142
+amove 285 333
+aline 238 333
+aline 238 1000
+aline 190 952
+aline 190 857
+aline 238 476
+amove 285 476
+aline 333 857
+aline 333 952
+aline 285 1000
+amove 238 1000
+aline 285 1000
+aline 285 333
+stroke
+dfont endchar
+dfont char=34
+amove 190 666
+aline 285 714
+aline 333 809
+aline 333 952
+aline 285 1000
+aline 238 1000
+aline 190 952
+aline 190 904
+aline 238 857
+aline 285 857
+aline 333 904
+aline 285 714
+amove 333 809
+aline 285 857
+amove 238 952
+aline 238 904
+aline 285 904
+aline 285 952
+aline 238 952
+stroke
+dfont endchar
+stroke
+dfont endchar
+dfont char=36
+amove 190 238
+aline 190 190
+aline 238 190
+aline 238 285
+aline 142 285
+aline 142 190
+aline 190 95
+aline 238 47
+aline 380 0
+aline 571 0
+aline 714 47
+aline 761 95
+aline 809 190
+aline 809 333
+aline 761 428
+aline 619 523
+aline 333 619
+aline 238 666
+aline 190 761
+aline 190 857
+aline 238 952
+amove 190 714
+aline 238 619
+aline 333 571
+aline 619 476
+aline 714 428
+aline 761 333
+amove 714 47
+aline 761 142
+aline 761 285
+aline 714 380
+aline 619 428
+aline 333 523
+aline 190 619
+aline 142 714
+aline 142 857
+aline 238 952
+aline 380 1000
+aline 571 1000
+aline 714 952
+aline 761 904
+aline 809 809
+aline 809 714
+aline 714 714
+aline 714 809
+aline 761 809
+aline 761 761
+amove 571 1190
+aline 571 -191
+amove 380 -191
+aline 380 1190
+stroke
+dfont endchar
+dfont char=37
+amove 142 0
+aline 1000 1000
+aline 904 952
+aline 761 904
+aline 619 904
+aline 476 952
+aline 380 1000
+aline 285 1000
+aline 190 952
+aline 142 857
+aline 142 761
+aline 238 666
+aline 333 666
+aline 428 714
+aline 476 809
+aline 476 904
+aline 380 1000
+amove 809 333
+aline 714 285
+aline 666 190
+aline 666 95
+aline 761 0
+aline 857 0
+aline 952 47
+aline 1000 142
+aline 1000 238
+aline 904 333
+aline 809 333
+stroke
+dfont endchar
+stroke
+dfont endchar
+dfont char=39
+amove 190 761
+aline 238 809
+aline 285 809
+aline 333 761
+aline 333 714
+aline 285 666
+aline 238 666
+aline 190 714
+aline 190 857
+aline 238 952
+aline 333 1000
+amove 238 952
+aline 190 761
+amove 238 761
+aline 238 714
+aline 285 714
+aline 285 761
+aline 238 761
+amove 238 809
+aline 190 857
+stroke
+dfont endchar
+dfont char=40
+amove 285 -48
+aline 238 95
+aline 190 285
+aline 190 571
+aline 238 761
+aline 285 904
+amove 380 1095
+aline 333 1000
+aline 285 857
+aline 238 571
+aline 238 285
+aline 285 0
+aline 333 -143
+aline 380 -239
+amove 476 -334
+aline 380 -239
+aline 285 -96
+aline 190 95
+aline 142 333
+aline 142 523
+aline 190 761
+aline 285 952
+aline 380 1095
+aline 476 1190
+stroke
+dfont endchar
+dfont char=41
+amove 285 -239
+aline 333 -143
+aline 380 0
+aline 428 285
+aline 428 571
+aline 380 857
+aline 333 1000
+aline 285 1095
+amove 190 1190
+aline 285 1095
+aline 380 952
+aline 476 761
+aline 523 523
+aline 523 333
+aline 476 95
+aline 380 -96
+aline 285 -239
+aline 190 -334
+amove 380 -48
+aline 428 95
+aline 476 285
+aline 476 571
+aline 428 761
+aline 380 904
+stroke
+dfont endchar
+dfont char=42
+amove 190 666
+aline 238 952
+amove 238 1000
+aline 190 952
+aline 190 666
+aline 285 952
+aline 238 1000
+amove 666 1000
+aline 619 952
+aline 619 666
+aline 666 952
+amove 666 1000
+aline 714 952
+aline 619 666
+stroke
+dfont endchar
+dfont char=43
+amove 190 476
+aline 1000 476
+aline 1000 428
+aline 190 428
+aline 190 476
+amove 571 857
+aline 571 47
+aline 619 47
+aline 619 857
+aline 571 857
+stroke
+dfont endchar
+dfont char=44
+amove 238 95
+aline 238 47
+aline 285 47
+aline 285 95
+aline 238 95
+amove 333 47
+aline 285 0
+aline 238 0
+aline 190 47
+aline 190 95
+aline 238 142
+aline 285 142
+aline 333 95
+aline 333 -48
+aline 285 -143
+aline 190 -191
+amove 285 -143
+aline 333 47
+amove 285 0
+aline 333 -48
+stroke
+dfont endchar
+dfont char=45
+amove 190 476
+aline 1000 476
+aline 1000 428
+aline 190 428
+aline 190 476
+stroke
+dfont endchar
+dfont char=46
+amove 238 95
+aline 238 47
+aline 285 47
+aline 285 95
+aline 238 95
+amove 238 142
+aline 190 95
+aline 190 47
+aline 238 0
+aline 285 0
+aline 333 47
+aline 333 95
+aline 285 142
+aline 238 142
+stroke
+dfont endchar
+dfont char=47
+amove 142 -334
+aline 95 -334
+aline 952 1190
+aline 1000 1190
+aline 142 -334
+stroke
+dfont endchar
+dfont char=48
+amove 285 95
+aline 238 190
+aline 190 380
+aline 190 619
+aline 238 809
+aline 285 904
+amove 428 1000
+aline 523 1000
+aline 666 952
+aline 761 809
+aline 809 571
+aline 809 428
+aline 761 190
+aline 666 47
+aline 523 0
+aline 428 0
+aline 285 47
+aline 190 190
+aline 142 428
+aline 142 571
+aline 190 809
+aline 285 952
+aline 428 1000
+aline 333 952
+aline 285 857
+aline 238 619
+aline 238 380
+aline 285 142
+aline 333 47
+aline 428 0
+amove 523 0
+aline 619 47
+aline 666 142
+aline 714 380
+aline 714 619
+aline 666 857
+aline 619 952
+aline 523 1000
+amove 666 904
+aline 714 809
+aline 761 619
+aline 761 380
+aline 714 190
+aline 666 95
+stroke
+dfont endchar
+dfont char=49
+amove 238 0
+aline 714 0
+amove 619 0
+aline 523 47
+amove 476 47
+aline 476 904
+amove 428 904
+aline 428 0
+amove 428 47
+aline 333 0
+amove 380 0
+aline 428 95
+amove 523 95
+aline 571 0
+amove 523 0
+aline 523 1000
+aline 380 857
+aline 285 809
+stroke
+dfont endchar
+dfont char=50
+amove 142 0
+aline 142 142
+aline 190 285
+aline 285 380
+aline 380 428
+aline 619 523
+aline 761 619
+aline 809 714
+aline 809 809
+aline 761 904
+aline 714 952
+aline 571 1000
+aline 380 1000
+aline 238 952
+aline 190 904
+aline 142 809
+aline 142 761
+aline 190 714
+aline 238 714
+aline 285 761
+aline 285 809
+aline 238 857
+aline 190 857
+amove 190 809
+aline 190 761
+aline 238 761
+aline 238 809
+aline 190 809
+amove 571 1000
+aline 666 952
+aline 714 809
+aline 714 714
+aline 666 619
+aline 571 523
+aline 380 428
+amove 285 142
+aline 523 47
+aline 714 47
+aline 761 95
+amove 809 142
+aline 714 95
+aline 523 95
+aline 285 142
+aline 190 142
+aline 142 95
+amove 285 142
+aline 523 0
+aline 714 0
+aline 761 47
+aline 809 142
+aline 809 238
+amove 714 619
+aline 761 714
+aline 761 809
+aline 714 904
+stroke
+dfont endchar
+dfont char=51
+amove 190 142
+aline 238 142
+aline 285 190
+aline 285 238
+aline 238 285
+aline 190 285
+aline 142 238
+aline 142 190
+aline 190 95
+aline 238 47
+aline 380 0
+aline 571 0
+aline 714 47
+aline 761 95
+aline 809 190
+aline 809 333
+aline 761 428
+aline 666 523
+aline 571 571
+aline 428 571
+amove 523 571
+aline 619 619
+aline 666 714
+aline 666 857
+aline 619 952
+aline 523 1000
+amove 666 952
+aline 714 857
+aline 714 714
+aline 666 619
+amove 571 571
+aline 714 619
+aline 761 714
+aline 761 857
+aline 714 952
+aline 571 1000
+aline 380 1000
+aline 238 952
+aline 190 904
+aline 142 809
+aline 142 761
+aline 190 714
+aline 238 714
+aline 285 761
+aline 285 809
+aline 238 857
+aline 190 857
+amove 190 809
+aline 190 761
+aline 238 761
+aline 238 809
+aline 190 809
+amove 523 571
+aline 619 523
+aline 666 476
+aline 714 333
+aline 714 190
+aline 666 47
+aline 571 -1
+amove 714 95
+aline 761 190
+aline 761 333
+aline 714 428
+amove 190 238
+aline 190 190
+aline 238 190
+aline 238 238
+aline 190 238
+stroke
+dfont endchar
+dfont char=52
+amove 380 0
+aline 761 0
+amove 714 0
+aline 619 47
+amove 571 47
+aline 571 904
+amove 523 857
+aline 523 0
+amove 523 47
+aline 428 0
+amove 476 0
+aline 523 95
+amove 619 95
+aline 666 0
+amove 619 0
+aline 619 1000
+aline 95 285
+aline 857 285
+stroke
+dfont endchar
+dfont char=53
+amove 190 142
+aline 238 142
+aline 285 190
+aline 285 238
+aline 238 285
+aline 190 285
+aline 142 238
+aline 142 190
+aline 190 95
+aline 238 47
+aline 380 0
+aline 523 0
+aline 666 47
+aline 761 142
+aline 809 285
+aline 809 380
+aline 761 523
+aline 666 619
+aline 523 666
+aline 380 666
+aline 238 619
+aline 142 523
+aline 238 1000
+aline 714 1000
+aline 619 952
+aline 428 904
+aline 238 904
+amove 238 952
+aline 619 952
+amove 523 666
+aline 619 619
+aline 666 571
+aline 714 428
+aline 714 238
+aline 666 95
+aline 619 47
+aline 523 -1
+amove 714 142
+aline 761 238
+aline 761 428
+aline 714 523
+amove 190 238
+aline 190 190
+aline 238 190
+aline 238 238
+aline 190 238
+stroke
+dfont endchar
+dfont char=54
+amove 285 95
+aline 238 142
+aline 190 285
+aline 190 571
+aline 238 761
+aline 285 857
+amove 476 1000
+aline 380 952
+aline 333 904
+aline 285 809
+aline 238 619
+aline 238 285
+aline 285 142
+aline 333 47
+aline 428 0
+amove 523 0
+aline 619 47
+aline 666 95
+aline 714 238
+aline 714 380
+aline 666 523
+aline 619 571
+aline 523 619
+amove 714 476
+aline 761 380
+aline 761 238
+aline 714 142
+amove 238 428
+aline 285 523
+aline 333 571
+aline 428 619
+aline 523 619
+aline 666 571
+aline 761 476
+aline 809 333
+aline 809 285
+aline 761 142
+aline 666 47
+aline 523 0
+aline 428 0
+aline 285 47
+aline 190 142
+aline 142 285
+aline 142 571
+aline 190 761
+aline 238 857
+aline 333 952
+aline 476 1000
+aline 619 1000
+aline 714 952
+aline 761 857
+aline 761 809
+aline 714 761
+aline 666 761
+aline 619 809
+aline 619 857
+aline 666 904
+aline 714 904
+amove 666 857
+aline 666 809
+aline 714 809
+aline 714 857
+aline 666 857
+stroke
+dfont endchar
+dfont char=55
+amove 428 0
+aline 428 190
+aline 476 333
+aline 523 428
+amove 761 714
+aline 523 476
+aline 428 333
+aline 380 190
+aline 380 0
+aline 476 0
+aline 476 190
+aline 523 380
+aline 571 476
+aline 761 714
+aline 809 857
+aline 809 1000
+aline 761 904
+aline 714 857
+aline 619 857
+aline 380 1000
+aline 285 1000
+aline 190 904
+aline 142 809
+aline 190 857
+aline 285 904
+aline 380 904
+aline 619 857
+amove 476 904
+aline 380 952
+aline 285 952
+aline 238 904
+amove 142 1000
+aline 142 714
+stroke
+dfont endchar
+dfont char=56
+amove 238 95
+aline 190 190
+aline 190 380
+aline 238 476
+amove 285 619
+aline 238 714
+aline 238 857
+aline 285 952
+amove 380 1000
+aline 571 1000
+aline 714 952
+aline 761 857
+aline 761 714
+aline 714 619
+aline 571 571
+aline 380 571
+aline 238 619
+aline 190 714
+aline 190 857
+aline 238 952
+aline 380 1000
+aline 333 952
+aline 285 857
+aline 285 714
+aline 333 619
+aline 380 571
+aline 238 523
+aline 190 476
+aline 142 380
+aline 142 190
+aline 190 95
+aline 238 47
+aline 380 -1
+aline 571 -1
+aline 714 47
+aline 761 95
+aline 809 190
+aline 809 380
+aline 761 476
+aline 714 523
+aline 571 571
+aline 619 619
+aline 666 714
+aline 666 857
+aline 619 952
+aline 571 1000
+amove 666 952
+aline 714 857
+aline 714 714
+aline 666 619
+amove 571 571
+aline 666 523
+aline 714 380
+aline 714 190
+aline 666 47
+aline 571 -1
+amove 714 95
+aline 761 190
+aline 761 380
+aline 714 476
+amove 380 571
+aline 285 523
+aline 238 380
+aline 238 190
+aline 285 47
+aline 380 -1
+stroke
+dfont endchar
+dfont char=57
+amove 238 95
+aline 285 95
+aline 333 142
+aline 333 190
+aline 285 238
+aline 238 238
+aline 190 190
+aline 190 142
+aline 238 47
+aline 333 0
+aline 476 0
+aline 619 47
+aline 714 142
+aline 761 238
+aline 809 428
+aline 809 714
+aline 761 857
+aline 666 952
+aline 523 1000
+aline 428 1000
+aline 285 952
+aline 190 857
+aline 142 714
+aline 142 666
+aline 190 523
+aline 285 428
+aline 428 380
+aline 523 380
+aline 619 428
+aline 666 476
+aline 714 571
+amove 666 904
+aline 714 857
+aline 761 714
+aline 761 428
+aline 714 238
+aline 666 142
+amove 476 0
+aline 571 47
+aline 619 95
+aline 666 190
+aline 714 380
+aline 714 714
+aline 666 857
+aline 619 952
+aline 523 1000
+amove 428 1000
+aline 333 952
+aline 285 904
+aline 238 761
+aline 238 619
+aline 285 476
+aline 333 428
+aline 428 380
+amove 238 523
+aline 190 619
+aline 190 761
+aline 238 857
+amove 238 190
+aline 238 142
+aline 285 142
+aline 285 190
+aline 238 190
+stroke
+dfont endchar
+dfont char=58
+amove 238 95
+aline 238 47
+aline 285 47
+aline 285 95
+aline 238 95
+amove 238 142
+aline 190 95
+aline 190 47
+aline 238 0
+aline 285 0
+aline 333 47
+aline 333 95
+aline 285 142
+aline 238 142
+amove 238 619
+aline 238 571
+aline 285 571
+aline 285 619
+aline 238 619
+amove 238 666
+aline 190 619
+aline 190 571
+aline 238 523
+aline 285 523
+aline 333 571
+aline 333 619
+aline 285 666
+aline 238 666
+stroke
+dfont endchar
+dfont char=59
+amove 238 95
+aline 238 47
+aline 285 47
+aline 285 95
+aline 238 95
+amove 333 47
+aline 285 0
+aline 238 0
+aline 190 47
+aline 190 95
+aline 238 142
+aline 285 142
+aline 333 95
+aline 333 -48
+aline 285 -143
+aline 190 -191
+amove 285 -143
+aline 333 47
+amove 285 0
+aline 333 -48
+amove 238 619
+aline 238 571
+aline 285 571
+aline 285 619
+aline 238 619
+amove 238 666
+aline 190 619
+aline 190 571
+aline 238 523
+aline 285 523
+aline 333 571
+aline 333 619
+aline 285 666
+aline 238 666
+stroke
+dfont endchar
+dfont char=60
+amove 952 857
+aline 190 428
+aline 952 0
+stroke
+dfont endchar
+dfont char=61
+amove 190 285
+aline 1000 285
+aline 1000 238
+aline 190 238
+aline 190 285
+amove 190 666
+aline 1000 666
+aline 1000 619
+aline 190 619
+aline 190 666
+stroke
+dfont endchar
+dfont char=62
+amove 190 0
+aline 952 428
+aline 190 857
+stroke
+dfont endchar
+dfont char=63
+amove 428 95
+aline 428 47
+aline 476 47
+aline 476 95
+aline 428 95
+amove 428 142
+aline 380 95
+aline 380 47
+aline 428 0
+aline 476 0
+aline 523 47
+aline 523 95
+aline 476 142
+aline 428 142
+amove 428 476
+aline 428 333
+aline 476 333
+aline 476 476
+aline 428 476
+amove 476 476
+aline 666 571
+aline 714 619
+aline 761 714
+aline 761 809
+aline 714 904
+aline 666 952
+aline 523 1000
+aline 333 1000
+aline 238 952
+aline 190 904
+aline 142 809
+aline 142 714
+aline 238 714
+aline 238 809
+aline 190 809
+aline 190 761
+amove 523 1000
+aline 619 952
+aline 666 857
+aline 666 666
+aline 619 571
+aline 571 523
+amove 666 619
+aline 714 666
+aline 714 857
+aline 666 904
+stroke
+dfont endchar
+dfont char=64
+amove 523 238
+aline 476 285
+aline 428 380
+aline 428 523
+aline 476 666
+aline 571 761
+amove 857 761
+aline 809 380
+aline 809 285
+aline 904 238
+aline 999 238
+aline 1095 333
+aline 1142 476
+aline 1142 571
+aline 1095 714
+aline 1047 809
+aline 952 904
+aline 857 952
+aline 714 1000
+aline 571 1000
+aline 428 952
+aline 333 904
+aline 238 809
+aline 190 714
+aline 142 571
+aline 142 428
+aline 190 285
+aline 238 190
+aline 333 95
+aline 428 47
+aline 571 0
+aline 714 0
+aline 857 47
+aline 952 95
+aline 1000 142
+amove 904 238
+aline 857 285
+aline 857 380
+aline 904 761
+amove 857 619
+aline 809 714
+aline 714 761
+aline 571 761
+aline 476 714
+aline 428 666
+aline 380 523
+aline 380 380
+aline 428 285
+aline 523 238
+aline 666 238
+aline 761 285
+aline 809 380
+stroke
+dfont endchar
+dfont char=65
+amove 47 0
+aline 333 0
+amove 238 0
+aline 142 47
+aline 476 1000
+aline 809 0
+amove 761 0
+aline 476 857
+amove 428 857
+aline 714 0
+amove 714 47
+aline 619 0
+amove 571 0
+aline 904 0
+amove 857 0
+aline 761 95
+amove 714 95
+aline 666 0
+amove 666 285
+aline 238 285
+amove 142 47
+aline 95 0
+stroke
+dfont endchar
+dfont char=66
+amove 95 0
+aline 666 0
+aline 809 47
+aline 857 95
+aline 904 190
+aline 904 333
+aline 857 428
+aline 809 476
+aline 666 523
+aline 333 523
+amove 666 523
+aline 809 571
+aline 857 619
+aline 904 714
+aline 904 809
+aline 857 904
+aline 809 952
+aline 666 1000
+aline 95 1000
+amove 142 1000
+aline 238 952
+amove 238 1000
+aline 238 0
+amove 238 47
+aline 142 0
+amove 190 0
+aline 238 95
+amove 285 47
+aline 285 952
+amove 333 952
+aline 428 1000
+amove 380 1000
+aline 333 904
+amove 333 1000
+aline 333 0
+amove 380 0
+aline 333 95
+amove 333 47
+aline 428 0
+amove 666 0
+aline 761 47
+aline 809 142
+aline 809 380
+aline 761 476
+aline 666 523
+aline 761 571
+aline 809 666
+aline 809 857
+aline 761 952
+aline 666 1000
+amove 809 904
+aline 857 809
+aline 857 714
+aline 809 619
+amove 809 428
+aline 857 333
+aline 857 190
+aline 809 95
+amove 238 904
+aline 190 1000
+stroke
+dfont endchar
+dfont char=67
+amove 285 142
+aline 238 238
+aline 190 380
+aline 190 619
+aline 238 761
+aline 285 857
+amove 476 1000
+aline 380 952
+aline 285 809
+aline 238 619
+aline 238 380
+aline 285 190
+aline 380 47
+aline 476 -1
+amove 857 238
+aline 809 142
+aline 714 47
+aline 619 -1
+aline 476 -1
+aline 333 47
+aline 238 142
+aline 190 238
+aline 142 380
+aline 142 619
+aline 190 761
+aline 238 857
+aline 333 952
+aline 476 1000
+aline 619 1000
+aline 714 952
+aline 809 857
+aline 857 714
+aline 857 1000
+aline 809 857
+stroke
+dfont endchar
+dfont char=68
+amove 95 0
+aline 571 0
+aline 714 47
+aline 809 142
+aline 857 238
+aline 904 380
+aline 904 619
+aline 857 761
+aline 809 857
+aline 714 952
+aline 571 1000
+aline 95 1000
+amove 142 1000
+aline 238 952
+amove 238 1000
+aline 238 0
+amove 238 47
+aline 142 0
+amove 190 0
+aline 238 95
+amove 285 47
+aline 285 952
+amove 333 952
+aline 428 1000
+amove 380 1000
+aline 333 904
+amove 333 1000
+aline 333 0
+amove 380 0
+aline 333 95
+amove 333 47
+aline 428 0
+amove 571 0
+aline 666 47
+aline 761 190
+aline 809 380
+aline 809 619
+aline 761 809
+aline 666 952
+aline 571 1000
+amove 761 857
+aline 809 761
+aline 857 619
+aline 857 380
+aline 809 238
+aline 761 142
+amove 238 904
+aline 190 1000
+stroke
+dfont endchar
+dfont char=69
+amove 95 0
+aline 857 0
+aline 857 285
+aline 809 0
+amove 761 0
+aline 857 142
+amove 857 95
+aline 714 0
+amove 619 0
+aline 857 47
+amove 619 333
+aline 619 714
+aline 571 523
+aline 619 333
+amove 619 428
+aline 523 523
+aline 619 619
+amove 619 571
+aline 428 523
+aline 619 476
+amove 619 523
+aline 333 523
+amove 333 904
+aline 380 1000
+amove 333 1000
+aline 333 0
+amove 380 0
+aline 333 95
+amove 333 47
+aline 428 0
+amove 285 47
+aline 285 952
+amove 238 952
+aline 142 1000
+amove 95 1000
+aline 857 1000
+aline 857 714
+aline 809 1000
+amove 761 1000
+aline 857 857
+amove 857 904
+aline 714 999
+amove 619 999
+aline 857 952
+amove 428 999
+aline 333 952
+amove 238 999
+aline 238 -1
+amove 238 47
+aline 142 -1
+amove 190 -1
+aline 238 95
+amove 238 904
+aline 190 999
+stroke
+dfont endchar
+dfont char=70
+amove 95 0
+aline 476 0
+amove 428 0
+aline 333 47
+amove 285 47
+aline 285 952
+amove 238 952
+aline 142 1000
+amove 95 1000
+aline 857 1000
+aline 857 714
+aline 809 1000
+amove 761 1000
+aline 857 857
+amove 857 904
+aline 714 999
+amove 619 999
+aline 857 952
+amove 619 714
+aline 619 333
+aline 571 523
+aline 619 714
+amove 619 619
+aline 523 523
+aline 619 428
+amove 619 476
+aline 428 523
+aline 619 571
+amove 619 523
+aline 333 523
+amove 333 904
+aline 380 1000
+amove 333 1000
+aline 333 0
+amove 380 0
+aline 333 95
+amove 238 95
+aline 190 0
+amove 238 0
+aline 238 1000
+amove 190 1000
+aline 238 904
+amove 333 952
+aline 428 1000
+amove 238 47
+aline 142 0
+stroke
+dfont endchar
+dfont char=71
+amove 285 142
+aline 238 238
+aline 190 380
+aline 190 619
+aline 238 761
+aline 285 857
+amove 476 1000
+aline 380 952
+aline 285 809
+aline 238 619
+aline 238 380
+aline 285 190
+aline 380 47
+aline 476 -1
+amove 714 47
+aline 761 95
+aline 761 380
+amove 761 333
+aline 666 380
+amove 619 380
+aline 1000 380
+amove 952 380
+aline 857 333
+amove 857 380
+aline 857 -1
+aline 809 47
+aline 714 47
+aline 619 -1
+aline 476 -1
+aline 333 47
+aline 238 142
+aline 190 238
+aline 142 380
+aline 142 619
+aline 190 761
+aline 238 857
+aline 333 952
+aline 476 1000
+aline 619 1000
+aline 714 952
+aline 809 857
+aline 857 714
+aline 857 1000
+aline 809 857
+amove 714 380
+aline 761 285
+amove 809 333
+aline 809 95
+amove 857 285
+aline 904 380
+stroke
+dfont endchar
+dfont char=72
+amove 95 0
+aline 476 0
+amove 428 0
+aline 333 47
+amove 285 47
+aline 285 952
+amove 238 952
+aline 142 1000
+amove 95 1000
+aline 476 1000
+amove 428 1000
+aline 333 952
+amove 333 1000
+aline 333 0
+amove 380 0
+aline 333 95
+amove 238 95
+aline 190 0
+amove 238 0
+aline 238 1000
+amove 190 1000
+aline 238 904
+amove 333 904
+aline 380 1000
+amove 666 1000
+aline 1047 1000
+amove 1000 1000
+aline 904 952
+amove 857 952
+aline 857 47
+amove 809 47
+aline 714 -1
+amove 666 -1
+aline 1047 -1
+amove 1000 -1
+aline 904 47
+amove 904 -1
+aline 904 999
+amove 952 999
+aline 904 904
+amove 809 904
+aline 761 999
+amove 809 999
+aline 809 -1
+amove 761 -1
+aline 809 95
+amove 904 95
+aline 952 -1
+amove 809 523
+aline 333 523
+amove 238 47
+aline 142 -1
+amove 714 999
+aline 809 952
+stroke
+dfont endchar
+dfont char=73
+amove 95 0
+aline 476 0
+amove 428 0
+aline 333 47
+amove 285 47
+aline 285 952
+amove 238 952
+aline 142 1000
+amove 95 1000
+aline 476 1000
+amove 428 1000
+aline 333 952
+amove 333 1000
+aline 333 0
+amove 380 0
+aline 333 95
+amove 238 95
+aline 190 0
+amove 238 0
+aline 238 1000
+amove 190 1000
+aline 238 904
+amove 333 904
+aline 380 1000
+amove 238 47
+aline 142 0
+stroke
+dfont endchar
+dfont char=74
+amove 142 142
+aline 190 142
+aline 238 190
+aline 238 238
+aline 190 285
+aline 142 285
+aline 95 238
+aline 95 142
+aline 142 47
+aline 238 0
+aline 333 0
+aline 476 47
+aline 523 190
+aline 523 1000
+amove 571 1000
+aline 523 904
+amove 523 952
+aline 619 1000
+amove 666 1000
+aline 285 1000
+amove 333 1000
+aline 428 952
+amove 428 1000
+aline 428 190
+aline 380 47
+aline 333 0
+amove 428 47
+aline 476 190
+aline 476 952
+amove 428 904
+aline 380 1000
+amove 142 238
+aline 142 190
+aline 190 190
+aline 190 238
+aline 142 238
+stroke
+dfont endchar
+dfont char=75
+amove 95 0
+aline 476 0
+amove 428 0
+aline 333 47
+amove 285 47
+aline 285 952
+amove 238 952
+aline 142 1000
+amove 95 1000
+aline 476 1000
+amove 428 1000
+aline 333 952
+amove 333 1000
+aline 333 0
+amove 380 0
+aline 333 95
+amove 238 95
+aline 190 0
+amove 238 0
+aline 238 1000
+amove 190 1000
+aline 238 904
+amove 333 904
+aline 380 1000
+amove 714 1000
+aline 1000 1000
+amove 952 1000
+aline 857 952
+aline 333 428
+amove 476 523
+aline 809 0
+amove 857 0
+aline 523 523
+amove 523 619
+aline 904 0
+amove 952 0
+aline 809 95
+aline 714 0
+amove 666 0
+aline 1000 0
+amove 238 47
+aline 142 0
+amove 857 952
+aline 809 1000
+stroke
+dfont endchar
+dfont char=76
+amove 95 0
+aline 809 0
+aline 809 285
+aline 761 0
+amove 714 0
+aline 809 142
+amove 809 95
+aline 666 0
+amove 571 0
+aline 809 47
+amove 428 0
+aline 333 47
+amove 285 47
+aline 285 952
+amove 238 952
+aline 142 1000
+amove 95 1000
+aline 476 1000
+amove 428 1000
+aline 333 952
+amove 333 1000
+aline 333 0
+amove 380 0
+aline 333 95
+amove 238 95
+aline 190 0
+amove 238 0
+aline 238 1000
+amove 190 1000
+aline 238 904
+amove 333 904
+aline 380 1000
+amove 238 47
+aline 142 0
+stroke
+dfont endchar
+dfont char=77
+amove 95 0
+aline 380 0
+amove 333 0
+aline 238 47
+aline 238 1000
+aline 571 0
+aline 904 1000
+aline 904 0
+amove 904 47
+aline 809 0
+amove 761 0
+aline 1142 0
+amove 1095 0
+aline 1000 47
+amove 952 47
+aline 952 952
+amove 1000 952
+aline 1095 1000
+amove 1142 1000
+aline 904 1000
+amove 1000 1000
+aline 1000 0
+amove 1047 0
+aline 1000 95
+amove 904 95
+aline 857 0
+amove 619 142
+aline 333 1000
+aline 95 1000
+amove 142 1000
+aline 238 952
+amove 285 1000
+aline 571 142
+amove 238 47
+aline 142 0
+amove 1000 904
+aline 1047 1000
+stroke
+dfont endchar
+dfont char=78
+amove 95 0
+aline 380 0
+amove 333 0
+aline 238 47
+aline 238 1000
+aline 904 0
+aline 904 952
+aline 809 1000
+amove 761 1000
+aline 1047 1000
+amove 1000 1000
+aline 904 952
+amove 333 1000
+aline 904 142
+amove 857 142
+aline 285 1000
+amove 333 1000
+aline 95 1000
+amove 142 1000
+aline 238 952
+amove 238 47
+aline 142 -1
+stroke
+dfont endchar
+dfont char=79
+amove 285 142
+aline 238 238
+aline 190 380
+aline 190 619
+aline 238 761
+aline 285 857
+amove 476 1000
+aline 571 1000
+aline 714 952
+aline 809 857
+aline 857 761
+aline 904 571
+aline 904 428
+aline 857 238
+aline 809 142
+aline 714 47
+aline 571 0
+aline 476 0
+aline 333 47
+aline 238 142
+aline 190 238
+aline 142 428
+aline 142 571
+aline 190 761
+aline 238 857
+aline 333 952
+aline 476 1000
+aline 380 952
+aline 285 809
+aline 238 619
+aline 238 380
+aline 285 190
+aline 380 47
+aline 476 0
+amove 571 0
+aline 666 47
+aline 761 190
+aline 809 380
+aline 809 619
+aline 761 809
+aline 666 952
+aline 571 1000
+amove 761 857
+aline 809 761
+aline 857 619
+aline 857 380
+aline 809 238
+aline 761 142
+stroke
+dfont endchar
+dfont char=80
+amove 95 0
+aline 476 0
+amove 428 0
+aline 333 47
+amove 285 47
+aline 285 952
+amove 238 952
+aline 142 1000
+amove 95 1000
+aline 666 1000
+aline 809 952
+aline 857 904
+aline 904 809
+aline 904 666
+aline 857 571
+aline 809 523
+aline 666 476
+aline 333 476
+amove 666 476
+aline 761 523
+aline 809 619
+aline 809 857
+aline 761 952
+aline 666 999
+amove 809 904
+aline 857 809
+aline 857 666
+aline 809 571
+amove 428 999
+aline 333 952
+amove 333 999
+aline 333 -1
+amove 380 -1
+aline 333 95
+amove 238 95
+aline 190 -1
+amove 238 -1
+aline 238 999
+amove 190 999
+aline 238 904
+amove 333 904
+aline 380 999
+amove 238 47
+aline 142 -1
+stroke
+dfont endchar
+dfont char=81
+amove 285 142
+aline 238 238
+aline 190 380
+aline 190 619
+aline 238 761
+aline 285 857
+amove 476 1000
+aline 571 1000
+aline 714 952
+aline 809 857
+aline 857 761
+aline 904 571
+aline 904 428
+aline 857 238
+aline 809 142
+aline 714 47
+aline 571 0
+aline 476 0
+aline 333 47
+aline 238 142
+aline 190 238
+aline 142 428
+aline 142 571
+aline 190 761
+aline 238 857
+aline 333 952
+aline 476 1000
+aline 380 952
+aline 285 809
+aline 238 619
+aline 238 380
+aline 285 190
+aline 380 47
+aline 476 0
+amove 571 0
+aline 666 47
+aline 761 190
+aline 809 380
+aline 809 619
+aline 761 809
+aline 666 952
+aline 571 1000
+amove 761 857
+aline 809 761
+aline 857 619
+aline 857 380
+aline 809 238
+aline 761 142
+amove 666 142
+aline 761 -96
+aline 809 -143
+aline 857 -143
+aline 904 -96
+amove 904 -48
+aline 904 -143
+aline 857 -239
+aline 761 -239
+aline 714 -143
+aline 666 142
+aline 619 238
+aline 523 285
+aline 476 285
+aline 380 238
+aline 333 142
+amove 714 -48
+aline 761 -143
+aline 809 -191
+aline 857 -191
+stroke
+dfont endchar
+dfont char=82
+amove 95 0
+aline 476 0
+amove 428 0
+aline 333 47
+amove 285 47
+aline 285 952
+amove 238 952
+aline 142 1000
+amove 95 1000
+aline 666 1000
+aline 809 952
+aline 857 904
+aline 904 809
+aline 904 714
+aline 857 619
+aline 809 571
+aline 666 523
+aline 333 523
+amove 523 523
+aline 619 476
+aline 666 380
+aline 761 95
+aline 809 -1
+aline 904 -1
+aline 952 95
+aline 952 190
+amove 952 142
+aline 904 95
+aline 857 95
+aline 809 142
+aline 666 428
+aline 619 476
+amove 666 523
+aline 761 571
+aline 809 666
+aline 809 857
+aline 761 952
+aline 666 1000
+amove 809 904
+aline 857 809
+aline 857 714
+aline 809 619
+amove 761 190
+aline 809 95
+aline 857 47
+aline 904 47
+amove 380 0
+aline 333 95
+amove 333 0
+aline 333 1000
+amove 380 1000
+aline 333 904
+amove 333 952
+aline 428 1000
+amove 238 1000
+aline 238 0
+amove 238 47
+aline 142 0
+amove 190 0
+aline 238 95
+amove 238 904
+aline 190 1000
+stroke
+dfont endchar
+dfont char=83
+amove 190 142
+aline 142 0
+aline 142 285
+aline 190 142
+aline 285 47
+aline 428 0
+aline 571 0
+aline 714 47
+aline 761 95
+aline 809 190
+aline 809 333
+aline 761 428
+aline 619 523
+aline 333 619
+aline 238 666
+aline 190 761
+aline 190 857
+aline 238 952
+amove 190 714
+aline 238 619
+aline 333 571
+aline 619 476
+aline 714 428
+aline 761 333
+amove 714 47
+aline 761 142
+aline 761 285
+aline 714 380
+aline 619 428
+aline 333 523
+aline 190 619
+aline 142 714
+aline 142 857
+aline 238 952
+aline 380 1000
+aline 523 1000
+aline 666 952
+aline 761 857
+aline 809 714
+aline 809 1000
+aline 761 857
+stroke
+dfont endchar
+dfont char=84
+amove 285 0
+aline 666 0
+amove 619 0
+aline 523 47
+amove 476 47
+aline 476 952
+amove 428 1000
+aline 428 0
+amove 428 47
+aline 333 0
+amove 380 0
+aline 428 95
+amove 523 95
+aline 571 0
+amove 523 0
+aline 523 1000
+amove 619 1000
+aline 857 952
+amove 857 1000
+aline 95 1000
+aline 95 714
+aline 142 1000
+amove 190 1000
+aline 95 857
+amove 95 904
+aline 238 999
+amove 333 999
+aline 95 952
+amove 714 999
+aline 857 904
+amove 857 857
+aline 761 1000
+amove 809 1000
+aline 857 714
+aline 857 1000
+stroke
+dfont endchar
+dfont char=85
+amove 333 142
+aline 285 238
+aline 285 952
+amove 238 952
+aline 142 1000
+amove 95 1000
+aline 476 1000
+amove 428 1000
+aline 333 952
+amove 333 1000
+aline 333 238
+aline 380 95
+aline 428 47
+aline 523 0
+amove 333 904
+aline 380 1000
+amove 238 1000
+aline 238 285
+aline 285 142
+aline 380 47
+aline 523 0
+aline 619 0
+aline 761 47
+aline 857 142
+aline 904 285
+aline 904 952
+aline 809 1000
+amove 761 1000
+aline 1047 1000
+amove 1000 1000
+aline 904 952
+amove 238 904
+aline 190 1000
+stroke
+dfont endchar
+dfont char=86
+amove 476 0
+aline 142 1000
+amove 190 1000
+aline 476 142
+aline 476 0
+aline 809 952
+aline 714 1000
+amove 619 1000
+aline 904 1000
+amove 857 1000
+aline 809 952
+amove 380 1000
+aline 47 1000
+amove 95 1000
+aline 190 904
+amove 238 904
+aline 285 1000
+amove 238 1000
+aline 523 142
+amove 238 952
+aline 333 1000
+stroke
+dfont endchar
+dfont char=87
+amove 380 0
+aline 190 1000
+amove 238 1000
+aline 380 238
+aline 380 -1
+aline 428 238
+aline 571 1000
+aline 761 0
+aline 761 238
+aline 619 1000
+amove 666 1000
+aline 809 238
+amove 761 -1
+aline 809 238
+aline 952 952
+aline 857 1000
+amove 809 1000
+aline 1095 1000
+amove 1047 1000
+aline 952 952
+amove 666 1000
+aline 571 1000
+amove 428 1000
+aline 47 1000
+amove 95 1000
+aline 238 952
+amove 238 904
+aline 142 1000
+amove 285 1000
+aline 428 238
+amove 285 904
+aline 333 1000
+amove 380 1000
+aline 285 952
+stroke
+dfont endchar
+dfont char=88
+amove 47 0
+aline 333 0
+amove 285 0
+aline 190 47
+aline 761 952
+aline 666 1000
+amove 619 1000
+aline 904 1000
+amove 857 1000
+aline 761 952
+amove 380 1000
+aline 47 1000
+amove 95 1000
+aline 238 904
+aline 285 1000
+amove 238 1000
+aline 809 0
+amove 761 0
+aline 190 1000
+amove 142 1000
+aline 714 0
+amove 714 47
+aline 619 0
+amove 571 0
+aline 904 0
+amove 857 0
+aline 714 95
+aline 666 0
+amove 190 47
+aline 95 0
+amove 238 952
+aline 333 1000
+stroke
+dfont endchar
+dfont char=89
+amove 333 0
+aline 714 0
+amove 666 0
+aline 571 47
+amove 523 47
+aline 523 476
+aline 190 1000
+amove 142 1000
+aline 476 476
+aline 476 0
+amove 476 47
+aline 380 0
+amove 428 0
+aline 476 95
+amove 571 95
+aline 619 0
+amove 571 0
+aline 571 476
+aline 238 1000
+amove 238 952
+aline 333 1000
+amove 380 1000
+aline 47 1000
+amove 95 1000
+aline 190 952
+amove 714 1000
+aline 1000 1000
+amove 952 1000
+aline 857 952
+aline 571 476
+amove 857 952
+aline 761 1000
+stroke
+dfont endchar
+dfont char=90
+amove 142 0
+aline 714 1000
+amove 761 1000
+aline 190 0
+amove 238 0
+aline 809 1000
+aline 142 1000
+aline 142 714
+aline 190 1000
+amove 238 1000
+aline 142 857
+amove 142 904
+aline 285 999
+amove 380 999
+aline 142 952
+amove 809 285
+aline 809 -1
+aline 142 -1
+amove 571 -1
+aline 809 47
+amove 809 95
+aline 666 -1
+amove 714 -1
+aline 809 142
+amove 809 285
+aline 761 -1
+stroke
+dfont endchar
+dfont char=91
+amove 190 -334
+aline 190 1190
+aline 523 1190
+amove 238 1190
+aline 238 -334
+amove 190 -334
+aline 523 -334
+stroke
+dfont endchar
+stroke
+dfont endchar
+dfont char=93
+amove 142 -334
+aline 476 -334
+aline 476 1190
+aline 142 1190
+amove 428 1190
+aline 428 -334
+stroke
+dfont endchar
+stroke
+dfont endchar
+stroke
+dfont endchar
+dfont char=96
+amove 238 904
+aline 285 952
+aline 238 1000
+aline 190 952
+aline 190 857
+aline 238 761
+aline 285 714
+stroke
+dfont endchar
+dfont char=97
+amove 238 47
+aline 190 142
+aline 190 190
+aline 238 285
+amove 238 523
+aline 238 571
+aline 285 571
+aline 285 476
+aline 190 476
+aline 190 571
+aline 238 619
+aline 333 666
+aline 523 666
+aline 619 619
+aline 666 571
+aline 714 476
+aline 714 142
+aline 761 47
+aline 809 0
+amove 857 0
+aline 809 0
+aline 666 47
+aline 619 142
+aline 619 523
+aline 571 619
+aline 523 666
+amove 619 571
+aline 666 476
+aline 666 142
+aline 714 47
+amove 619 142
+aline 571 47
+aline 476 0
+aline 333 0
+aline 190 47
+aline 142 142
+aline 142 190
+aline 190 285
+aline 333 333
+aline 571 380
+aline 619 428
+amove 571 380
+aline 380 333
+aline 285 285
+aline 238 190
+aline 238 142
+aline 285 47
+aline 333 0
+stroke
+dfont endchar
+dfont char=98
+amove 285 95
+aline 285 952
+amove 238 952
+aline 142 1000
+amove 95 1000
+aline 333 1000
+aline 333 47
+amove 380 47
+aline 285 47
+aline 238 0
+aline 238 1000
+amove 190 1000
+aline 238 904
+amove 333 523
+aline 380 619
+aline 476 666
+aline 571 666
+aline 714 619
+aline 809 523
+aline 857 380
+aline 857 285
+aline 809 142
+aline 714 47
+aline 571 0
+aline 476 0
+aline 380 47
+aline 333 142
+amove 571 0
+aline 666 47
+aline 714 95
+aline 761 238
+aline 761 428
+aline 714 571
+aline 666 619
+aline 571 666
+amove 761 523
+aline 809 428
+aline 809 238
+aline 761 142
+stroke
+dfont endchar
+dfont char=99
+amove 238 142
+aline 190 238
+aline 190 428
+aline 238 523
+amove 428 666
+aline 333 619
+aline 285 571
+aline 238 428
+aline 238 238
+aline 285 95
+aline 333 47
+aline 428 0
+amove 761 142
+aline 666 47
+aline 523 0
+aline 428 0
+aline 285 47
+aline 190 142
+aline 142 285
+aline 142 380
+aline 190 523
+aline 285 619
+aline 428 666
+aline 571 666
+aline 666 619
+aline 761 523
+aline 761 428
+aline 666 428
+aline 666 523
+aline 714 523
+aline 714 476
+stroke
+dfont endchar
+dfont char=100
+amove 238 142
+aline 190 238
+aline 190 428
+aline 238 523
+amove 428 666
+aline 333 619
+aline 285 571
+aline 238 428
+aline 238 238
+aline 285 95
+aline 333 47
+aline 428 0
+amove 666 142
+aline 619 47
+aline 523 0
+aline 428 0
+aline 285 47
+aline 190 142
+aline 142 285
+aline 142 380
+aline 190 523
+aline 285 619
+aline 428 666
+aline 523 666
+aline 619 619
+aline 666 523
+amove 666 904
+aline 619 1000
+amove 666 1000
+aline 666 0
+aline 904 0
+amove 857 0
+aline 761 47
+amove 714 47
+aline 714 952
+amove 666 952
+aline 571 1000
+amove 523 1000
+aline 761 1000
+aline 761 0
+amove 809 0
+aline 761 95
+stroke
+dfont endchar
+dfont char=101
+amove 238 142
+aline 190 238
+aline 190 428
+aline 238 523
+amove 238 380
+aline 761 380
+aline 761 476
+aline 714 571
+aline 666 619
+aline 523 666
+aline 428 666
+aline 285 619
+aline 190 523
+aline 142 380
+aline 142 285
+aline 190 142
+aline 285 47
+aline 428 0
+aline 523 0
+aline 666 47
+aline 761 142
+amove 666 380
+aline 666 523
+aline 619 619
+aline 523 666
+amove 428 666
+aline 333 619
+aline 285 571
+aline 238 428
+aline 238 238
+aline 285 95
+aline 333 47
+aline 428 0
+amove 714 428
+aline 714 476
+aline 666 571
+stroke
+dfont endchar
+dfont char=102
+amove 95 0
+aline 476 0
+amove 428 0
+aline 333 47
+amove 285 47
+aline 285 761
+aline 333 904
+amove 428 1000
+aline 380 952
+aline 333 857
+aline 333 0
+amove 380 0
+aline 333 95
+amove 238 95
+aline 190 0
+amove 238 0
+aline 238 761
+aline 285 904
+aline 333 952
+aline 428 1000
+aline 571 1000
+aline 619 952
+aline 619 857
+aline 523 857
+aline 523 952
+aline 571 952
+aline 571 904
+amove 523 666
+aline 95 666
+amove 238 47
+aline 142 -1
+stroke
+dfont endchar
+dfont char=103
+amove 142 95
+aline 190 47
+aline 333 0
+aline 571 0
+aline 714 -48
+aline 761 -143
+aline 761 -191
+aline 714 -286
+aline 571 -334
+aline 285 -334
+aline 142 -286
+aline 95 -191
+aline 95 -143
+aline 142 -48
+aline 285 0
+aline 190 -48
+aline 142 -143
+aline 142 -191
+aline 190 -286
+aline 285 -334
+amove 238 -1
+aline 380 -48
+aline 571 -48
+aline 714 -96
+amove 761 -191
+aline 714 -143
+aline 571 -96
+aline 380 -96
+aline 238 -48
+aline 190 -1
+aline 142 95
+aline 142 142
+aline 190 238
+aline 238 285
+amove 285 285
+aline 238 380
+aline 238 476
+aline 285 571
+amove 380 666
+aline 476 666
+aline 571 619
+aline 619 571
+aline 666 476
+aline 666 380
+aline 619 285
+aline 571 238
+aline 476 190
+aline 380 190
+aline 285 238
+aline 238 285
+aline 190 380
+aline 190 476
+aline 238 571
+aline 285 619
+aline 380 666
+aline 333 619
+aline 285 523
+aline 285 333
+aline 333 238
+aline 380 190
+amove 476 190
+aline 523 238
+aline 571 333
+aline 571 523
+aline 523 619
+aline 476 666
+amove 571 571
+aline 619 619
+aline 714 666
+aline 761 666
+aline 809 619
+aline 761 571
+aline 714 619
+amove 571 571
+aline 619 476
+aline 619 380
+aline 571 285
+stroke
+dfont endchar
+dfont char=104
+amove 95 0
+aline 476 0
+amove 428 0
+aline 333 47
+amove 285 47
+aline 285 952
+amove 238 952
+aline 142 1000
+amove 95 1000
+aline 333 1000
+aline 333 0
+amove 380 0
+aline 333 95
+amove 238 95
+aline 190 0
+amove 238 0
+aline 238 1000
+amove 190 1000
+aline 238 904
+amove 333 476
+aline 380 571
+aline 428 619
+aline 523 666
+aline 666 666
+aline 761 619
+aline 809 571
+aline 857 428
+aline 857 0
+amove 904 0
+aline 857 95
+amove 857 47
+aline 952 0
+amove 1000 0
+aline 619 0
+amove 666 0
+aline 761 47
+amove 809 47
+aline 809 428
+aline 761 571
+amove 666 666
+aline 714 619
+aline 761 476
+aline 761 -1
+amove 714 -1
+aline 761 95
+amove 238 47
+aline 142 -1
+stroke
+dfont endchar
+dfont char=105
+amove 95 0
+aline 476 0
+amove 428 0
+aline 333 47
+amove 285 47
+aline 285 619
+amove 238 619
+aline 142 666
+amove 95 666
+aline 333 666
+aline 333 0
+amove 380 0
+aline 333 95
+amove 238 95
+aline 190 0
+amove 238 0
+aline 238 666
+amove 190 666
+aline 238 571
+amove 285 904
+aline 285 1000
+amove 238 1000
+aline 238 904
+aline 333 904
+aline 333 1000
+aline 238 1000
+amove 238 952
+aline 333 952
+amove 238 47
+aline 142 0
+stroke
+dfont endchar
+dfont char=106
+amove 95 -239
+aline 95 -286
+aline 142 -286
+aline 142 -191
+aline 47 -191
+aline 47 -286
+aline 95 -334
+aline 238 -334
+aline 333 -286
+aline 380 -239
+aline 428 -96
+aline 428 666
+aline 190 666
+amove 238 666
+aline 333 619
+amove 333 666
+aline 333 -143
+aline 285 -286
+aline 238 -334
+amove 333 -239
+aline 380 -96
+aline 380 619
+amove 333 571
+aline 285 666
+amove 380 904
+aline 380 1000
+amove 333 1000
+aline 333 904
+aline 428 904
+aline 428 1000
+aline 333 1000
+amove 333 952
+aline 428 952
+stroke
+dfont endchar
+dfont char=107
+amove 95 0
+aline 476 0
+amove 428 0
+aline 333 47
+amove 285 47
+aline 285 952
+amove 238 952
+aline 142 1000
+amove 95 1000
+aline 333 1000
+aline 333 0
+amove 380 0
+aline 333 95
+amove 333 190
+aline 761 619
+aline 666 666
+amove 619 666
+aline 952 666
+amove 904 666
+aline 761 619
+amove 523 380
+aline 857 0
+amove 809 0
+aline 523 333
+amove 476 333
+aline 761 0
+amove 761 95
+aline 666 0
+amove 619 0
+aline 952 0
+amove 904 0
+aline 714 95
+amove 238 95
+aline 190 0
+amove 238 0
+aline 238 1000
+amove 190 1000
+aline 238 904
+amove 238 47
+aline 142 0
+stroke
+dfont endchar
+dfont char=108
+amove 95 0
+aline 476 0
+amove 428 0
+aline 333 47
+amove 285 47
+aline 285 952
+amove 238 952
+aline 142 1000
+amove 95 1000
+aline 333 1000
+aline 333 0
+amove 380 0
+aline 333 95
+amove 238 95
+aline 190 0
+amove 238 0
+aline 238 1000
+amove 190 1000
+aline 238 904
+amove 238 47
+aline 142 0
+stroke
+dfont endchar
+dfont char=109
+amove 95 0
+aline 476 0
+amove 428 0
+aline 333 47
+amove 285 47
+aline 285 619
+amove 238 619
+aline 142 666
+amove 95 666
+aline 333 666
+aline 333 0
+amove 380 0
+aline 333 95
+amove 238 95
+aline 190 0
+amove 238 0
+aline 238 666
+amove 190 666
+aline 238 571
+amove 333 476
+aline 380 571
+aline 428 619
+aline 523 666
+aline 666 666
+aline 761 619
+aline 809 571
+aline 857 428
+aline 857 0
+amove 904 0
+aline 857 95
+amove 857 47
+aline 952 0
+amove 1000 0
+aline 619 0
+amove 666 0
+aline 761 47
+amove 809 47
+aline 809 428
+aline 761 571
+amove 666 666
+aline 714 619
+aline 761 476
+aline 761 0
+amove 714 0
+aline 761 95
+amove 857 476
+aline 904 571
+aline 952 619
+aline 1047 666
+aline 1190 666
+aline 1285 619
+aline 1333 571
+aline 1380 428
+aline 1380 0
+amove 1428 0
+aline 1380 95
+amove 1380 47
+aline 1476 0
+amove 1523 0
+aline 1142 0
+amove 1190 0
+aline 1285 47
+amove 1333 47
+aline 1333 428
+aline 1285 571
+amove 1190 666
+aline 1238 619
+aline 1285 476
+aline 1285 -1
+amove 1238 -1
+aline 1285 95
+amove 238 47
+aline 142 -1
+stroke
+dfont endchar
+dfont char=110
+amove 95 0
+aline 476 0
+amove 428 0
+aline 333 47
+amove 285 47
+aline 285 619
+amove 238 619
+aline 142 666
+amove 95 666
+aline 333 666
+aline 333 0
+amove 380 0
+aline 333 95
+amove 238 95
+aline 190 0
+amove 238 0
+aline 238 666
+amove 190 666
+aline 238 571
+amove 333 476
+aline 380 571
+aline 428 619
+aline 523 666
+aline 666 666
+aline 761 619
+aline 809 571
+aline 857 428
+aline 857 0
+amove 904 0
+aline 857 95
+amove 857 47
+aline 952 0
+amove 1000 0
+aline 619 0
+amove 666 0
+aline 761 47
+amove 809 47
+aline 809 428
+aline 761 571
+amove 666 666
+aline 714 619
+aline 761 476
+aline 761 0
+amove 714 0
+aline 761 95
+amove 238 47
+aline 142 0
+stroke
+dfont endchar
+dfont char=111
+amove 238 142
+aline 190 238
+aline 190 428
+aline 238 523
+amove 428 666
+aline 523 666
+aline 666 619
+aline 761 523
+aline 809 380
+aline 809 285
+aline 761 142
+aline 666 47
+aline 523 0
+aline 428 0
+aline 285 47
+aline 190 142
+aline 142 285
+aline 142 380
+aline 190 523
+aline 285 619
+aline 428 666
+aline 333 619
+aline 285 571
+aline 238 428
+aline 238 238
+aline 285 95
+aline 333 47
+aline 428 0
+amove 523 0
+aline 619 47
+aline 666 95
+aline 714 238
+aline 714 428
+aline 666 571
+aline 619 619
+aline 523 666
+amove 714 523
+aline 761 428
+aline 761 238
+aline 714 142
+stroke
+dfont endchar
+dfont char=112
+amove 238 -239
+aline 190 -334
+amove 238 -334
+aline 238 666
+amove 238 619
+aline 142 666
+amove 95 666
+aline 333 666
+aline 333 -334
+amove 380 -334
+aline 333 -239
+amove 333 -286
+aline 428 -334
+amove 476 -334
+aline 95 -334
+amove 142 -334
+aline 238 -286
+amove 285 -286
+aline 285 619
+amove 238 571
+aline 190 666
+amove 333 523
+aline 380 619
+aline 476 666
+aline 571 666
+aline 714 619
+aline 809 523
+aline 857 380
+aline 857 285
+aline 809 142
+aline 714 47
+aline 571 0
+aline 476 0
+aline 380 47
+aline 333 142
+amove 571 0
+aline 666 47
+aline 714 95
+aline 761 238
+aline 761 428
+aline 714 571
+aline 666 619
+aline 571 666
+amove 761 523
+aline 809 428
+aline 809 238
+aline 761 142
+stroke
+dfont endchar
+dfont char=113
+amove 238 142
+aline 190 238
+aline 190 428
+aline 238 523
+amove 428 666
+aline 333 619
+aline 285 571
+aline 238 428
+aline 238 238
+aline 285 95
+aline 333 47
+aline 428 0
+amove 666 142
+aline 619 47
+aline 523 0
+aline 428 0
+aline 285 47
+aline 190 142
+aline 142 285
+aline 142 380
+aline 190 523
+aline 285 619
+aline 428 666
+aline 523 666
+aline 619 619
+aline 666 523
+amove 714 571
+aline 714 -286
+amove 666 -286
+aline 571 -334
+amove 523 -334
+aline 904 -334
+amove 857 -334
+aline 761 -286
+amove 761 -334
+aline 761 666
+aline 714 619
+aline 619 619
+amove 666 619
+aline 666 -334
+amove 619 -334
+aline 666 -239
+amove 761 -239
+aline 809 -334
+stroke
+dfont endchar
+dfont char=114
+amove 95 0
+aline 476 0
+amove 428 0
+aline 333 47
+amove 285 47
+aline 285 619
+amove 238 619
+aline 142 666
+amove 95 666
+aline 333 666
+aline 333 0
+amove 380 0
+aline 333 95
+amove 238 95
+aline 190 0
+amove 238 0
+aline 238 666
+amove 190 666
+aline 238 571
+amove 333 380
+aline 380 523
+aline 476 619
+aline 571 666
+aline 666 666
+aline 714 619
+aline 714 523
+aline 619 523
+aline 619 619
+aline 666 619
+aline 666 571
+amove 238 47
+aline 142 0
+stroke
+dfont endchar
+dfont char=115
+amove 190 95
+aline 142 0
+aline 142 190
+aline 190 95
+aline 238 47
+aline 333 0
+aline 523 0
+aline 619 47
+aline 666 95
+aline 666 238
+aline 619 333
+aline 523 380
+aline 285 428
+aline 190 476
+aline 142 571
+amove 190 619
+aline 142 476
+amove 190 428
+aline 285 380
+aline 523 333
+aline 619 285
+amove 666 238
+aline 619 47
+amove 666 95
+aline 619 238
+aline 523 285
+aline 285 333
+aline 190 380
+aline 142 476
+aline 142 571
+aline 190 619
+aline 285 666
+aline 476 666
+aline 571 619
+aline 619 571
+aline 666 476
+aline 666 666
+aline 619 571
+stroke
+dfont endchar
+dfont char=116
+amove 333 95
+aline 285 190
+aline 285 904
+amove 238 904
+aline 238 238
+aline 285 95
+aline 333 47
+aline 428 0
+aline 523 0
+aline 619 47
+aline 666 142
+amove 428 0
+aline 380 47
+aline 333 190
+aline 333 1000
+aline 238 904
+amove 95 666
+aline 523 666
+stroke
+dfont endchar
+dfont char=117
+amove 333 95
+aline 285 190
+aline 285 619
+amove 238 619
+aline 142 666
+amove 95 666
+aline 333 666
+aline 333 190
+aline 380 47
+aline 428 0
+amove 761 190
+aline 714 95
+aline 666 47
+aline 571 0
+aline 428 0
+aline 333 47
+aline 285 95
+aline 238 238
+aline 238 666
+amove 190 666
+aline 238 571
+amove 619 666
+aline 857 666
+aline 857 0
+amove 904 0
+aline 857 95
+amove 857 47
+aline 952 0
+amove 1000 0
+aline 761 0
+aline 761 666
+amove 809 619
+aline 809 47
+stroke
+dfont endchar
+dfont char=118
+amove 428 0
+aline 142 666
+amove 190 666
+aline 428 95
+amove 476 95
+aline 238 666
+amove 238 619
+aline 333 666
+amove 380 666
+aline 47 666
+amove 95 666
+aline 238 571
+amove 523 666
+aline 809 666
+amove 761 666
+aline 714 619
+aline 476 95
+aline 428 -1
+amove 714 619
+aline 619 666
+stroke
+dfont endchar
+dfont char=119
+amove 380 0
+aline 190 666
+amove 238 666
+aline 380 142
+amove 428 142
+aline 285 666
+amove 285 619
+aline 380 666
+amove 428 666
+aline 47 666
+amove 95 666
+aline 238 619
+amove 571 666
+aline 428 142
+aline 380 0
+amove 761 0
+aline 571 666
+aline 666 666
+aline 809 142
+amove 761 142
+aline 619 666
+amove 809 666
+aline 1095 666
+amove 1047 666
+aline 952 619
+aline 809 142
+aline 761 -1
+amove 952 619
+aline 857 666
+stroke
+dfont endchar
+dfont char=120
+amove 95 0
+aline 380 0
+amove 333 0
+aline 238 47
+aline 714 619
+aline 619 666
+amove 571 666
+aline 857 666
+amove 809 666
+aline 714 619
+amove 428 666
+aline 95 666
+amove 142 666
+aline 238 619
+amove 238 666
+aline 714 0
+amove 666 0
+aline 190 666
+amove 285 666
+aline 761 0
+amove 809 0
+aline 714 47
+amove 666 47
+aline 571 0
+amove 523 0
+aline 857 0
+amove 238 47
+aline 142 0
+amove 285 619
+aline 380 666
+stroke
+dfont endchar
+dfont char=121
+amove 95 -239
+aline 95 -286
+aline 142 -286
+aline 142 -191
+aline 47 -191
+aline 47 -286
+aline 95 -334
+aline 190 -334
+aline 285 -286
+aline 380 -191
+aline 523 95
+aline 761 619
+aline 666 666
+amove 571 666
+aline 857 666
+amove 809 666
+aline 761 619
+amove 428 666
+aline 95 666
+amove 142 666
+aline 285 571
+amove 285 619
+aline 380 666
+amove 285 666
+aline 523 95
+amove 476 95
+aline 238 666
+amove 190 666
+aline 476 0
+stroke
+dfont endchar
+dfont char=122
+amove 142 0
+aline 619 666
+amove 666 666
+aline 190 0
+amove 142 0
+aline 714 0
+aline 714 190
+aline 666 0
+amove 619 0
+aline 714 142
+amove 714 95
+aline 571 0
+amove 476 0
+aline 714 47
+amove 238 0
+aline 714 666
+aline 142 666
+aline 142 476
+aline 190 666
+amove 238 666
+aline 142 523
+amove 142 571
+aline 285 666
+amove 380 666
+aline 142 619
+stroke
+dfont endchar
+dfont char=123
+amove 380 238
+aline 333 95
+aline 333 -96
+aline 380 -239
+amove 476 -334
+aline 333 -191
+aline 285 -48
+aline 285 47
+aline 333 190
+aline 428 285
+aline 428 333
+aline 238 428
+aline 428 523
+aline 428 571
+aline 333 666
+aline 285 809
+aline 285 904
+aline 333 1047
+aline 476 1190
+amove 380 1095
+aline 333 952
+aline 333 761
+aline 380 619
+stroke
+dfont endchar
+dfont char=124
+amove 380 428
+aline 380 1000
+aline 333 952
+aline 428 476
+aline 380 428
+aline 333 476
+aline 428 952
+aline 380 1000
+amove 142 857
+aline 619 571
+aline 571 571
+aline 190 857
+aline 142 857
+aline 142 809
+aline 619 619
+aline 619 571
+amove 619 857
+aline 142 571
+aline 190 571
+aline 571 857
+aline 619 857
+aline 619 809
+aline 142 619
+aline 142 571
+stroke
+dfont endchar
+dfont char=125
+amove 238 -334
+aline 380 -191
+aline 428 -48
+aline 428 47
+aline 380 190
+aline 285 285
+aline 285 333
+aline 476 428
+aline 285 523
+aline 285 571
+aline 380 666
+aline 428 809
+aline 428 904
+aline 380 1047
+aline 238 1190
+amove 333 1095
+aline 380 952
+aline 380 761
+aline 333 619
+amove 333 238
+aline 380 95
+aline 380 -96
+aline 333 -239
+stroke
+dfont endchar
+dfont char=126
+amove 285 47
+aline 238 142
+aline 238 285
+aline 285 380
+aline 333 428
+amove 428 619
+aline 523 476
+aline 714 238
+aline 857 95
+aline 952 47
+amove 1095 95
+aline 1047 47
+aline 1000 47
+aline 904 95
+aline 761 238
+aline 571 476
+aline 428 666
+aline 380 857
+amove 380 761
+aline 428 952
+amove 619 952
+aline 666 761
+amove 666 857
+aline 619 666
+amove 523 571
+aline 333 380
+aline 285 285
+aline 285 142
+aline 333 47
+aline 428 0
+amove 1095 142
+aline 1095 95
+aline 1047 0
+aline 952 0
+aline 857 47
+aline 714 190
+aline 523 428
+aline 428 571
+aline 380 714
+aline 380 857
+aline 428 952
+aline 523 1000
+aline 619 952
+aline 666 857
+aline 666 761
+aline 619 666
+aline 523 571
+aline 238 380
+aline 190 285
+aline 190 142
+aline 238 47
+aline 333 0
+aline 523 0
+aline 619 47
+aline 714 142
+aline 809 285
+aline 904 523
+aline 952 619
+aline 1000 666
+aline 1047 666
+aline 1095 619
+aline 1095 523
+aline 1000 523
+aline 1000 619
+aline 1047 619
+aline 1047 571
+stroke
+dfont endchar
diff --git a/src/fonts/psfont.dat b/src/fonts/psfont.dat
new file mode 100644
index 0000000..63fb24d
--- /dev/null
+++ b/src/fonts/psfont.dat
@@ -0,0 +1,20 @@
+PSHC Helvetica-Condensed
+PSHCB Helvetica-Condensed-Bold
+PSHCBO Helvetica-Condensed-BoldObl
+PSHCDO Helvetica-Condensed-Oblique
+PSHN Helvetica-Narrow
+PSHNB Helvetica-Narrow-Bold
+PSHNBO Helvetica-Narrow-BoldOblique
+PSHNO Helvetica-Narrow-Oblique
+ARIAL8 ArialCyrMT
+ARIAL8B ArialCyrMT-Bold
+ARIAL8I ArialCyrMT-Italic
+ARIAL8BI ArialCyrMT-BoldItalic
+COUR8 ERKurierKOI8RRegular
+COUR8B ERKurierKOI8RBold
+COUR8I ERKurierKOI8RItalic
+COUR8BI ERKurierKOI8RBoldItalic
+TIMES8 TimesNRCyrMT
+TIMES8B TimesNRCyrMT-Bold
+TIMES8I TimesNRCyrMT-Inclined
+TIMES8BI TimesNRCyrMT-BoldInclined
diff --git a/src/fonts/pshc.afm b/src/fonts/pshc.afm
new file mode 100644
index 0000000..826c4a4
--- /dev/null
+++ b/src/fonts/pshc.afm
@@ -0,0 +1,446 @@
+StartFontMetrics 2.0
+Comment Copyright (c) 1984 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date:Mon Mar 30 16:27:29 PST 1987
+FontName Helvetica-Condensed
+EncodingScheme AdobeStandardEncoding
+FullName Helvetica Condensed Medium
+FamilyName Helvetica
+Weight MediumCondensed
+ItalicAngle 0.0
+IsFixedPitch false
+UnderlinePosition -90
+UnderlineThickness 58
+Version 001.001
+Notice Helvetica is a trademark of Allied Corporation.
+FontBBox -174 -224 1071 990
+CapHeight 750
+XHeight 556
+Descender -188
+Ascender 750
+StartCharMetrics 228
+C 32 ; WX 250 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 333 ; N exclam ; B 121 0 212 750 ;
+C 34 ; WX 250 ; N quotedbl ; B 44 513 207 739 ;
+C 35 ; WX 500 ; N numbersign ; B 5 0 495 750 ;
+C 36 ; WX 500 ; N dollar ; B 35 -116 465 815 ;
+C 37 ; WX 833 ; N percent ; B 55 -15 756 750 ;
+C 38 ; WX 667 ; N ampersand ; B 75 -18 620 750 ;
+C 39 ; WX 222 ; N quoteright ; B 64 504 158 750 ;
+C 40 ; WX 333 ; N parenleft ; B 76 -215 289 750 ;
+C 41 ; WX 333 ; N parenright ; B 44 -215 257 750 ;
+C 42 ; WX 500 ; N asterisk ; B 96 455 405 750 ;
+C 43 ; WX 500 ; N plus ; B 44 0 457 505 ;
+C 44 ; WX 250 ; N comma ; B 80 -146 171 100 ;
+C 45 ; WX 333 ; N hyphen ; B 45 275 288 358 ;
+C 46 ; WX 250 ; N period ; B 80 0 171 100 ;
+C 47 ; WX 278 ; N slash ; B -13 -27 291 750 ;
+C 48 ; WX 500 ; N zero ; B 46 -15 455 750 ;
+C 49 ; WX 500 ; N one ; B 74 0 317 750 ;
+C 50 ; WX 500 ; N two ; B 44 0 447 750 ;
+C 51 ; WX 500 ; N three ; B 38 -15 447 750 ;
+C 52 ; WX 500 ; N four ; B 28 0 451 750 ;
+C 53 ; WX 500 ; N five ; B 43 -15 446 735 ;
+C 54 ; WX 500 ; N six ; B 43 -15 458 750 ;
+C 55 ; WX 500 ; N seven ; B 44 0 456 735 ;
+C 56 ; WX 500 ; N eight ; B 46 -15 454 750 ;
+C 57 ; WX 500 ; N nine ; B 43 -15 458 750 ;
+C 58 ; WX 250 ; N colon ; B 80 0 171 547 ;
+C 59 ; WX 250 ; N semicolon ; B 80 -146 171 547 ;
+C 60 ; WX 500 ; N less ; B 42 -10 459 518 ;
+C 61 ; WX 500 ; N equal ; B 44 124 457 384 ;
+C 62 ; WX 500 ; N greater ; B 42 -10 459 518 ;
+C 63 ; WX 500 ; N question ; B 60 0 462 750 ;
+C 64 ; WX 800 ; N at ; B 36 -15 764 750 ;
+C 65 ; WX 556 ; N A ; B 11 0 546 750 ;
+C 66 ; WX 556 ; N B ; B 80 0 503 750 ;
+C 67 ; WX 556 ; N C ; B 53 -18 503 765 ;
+C 68 ; WX 611 ; N D ; B 82 0 548 750 ;
+C 69 ; WX 500 ; N E ; B 74 0 451 750 ;
+C 70 ; WX 444 ; N F ; B 74 0 426 750 ;
+C 71 ; WX 611 ; N G ; B 54 -18 532 765 ;
+C 72 ; WX 611 ; N H ; B 79 0 532 750 ;
+C 73 ; WX 278 ; N I ; B 98 0 181 750 ;
+C 74 ; WX 444 ; N J ; B 21 -15 368 750 ;
+C 75 ; WX 556 ; N K ; B 79 0 546 750 ;
+C 76 ; WX 500 ; N L ; B 83 0 472 750 ;
+C 77 ; WX 778 ; N M ; B 76 0 702 750 ;
+C 78 ; WX 611 ; N N ; B 77 0 534 750 ;
+C 79 ; WX 611 ; N O ; B 59 -18 553 765 ;
+C 80 ; WX 556 ; N P ; B 86 0 519 750 ;
+C 81 ; WX 611 ; N Q ; B 59 -34 582 765 ;
+C 82 ; WX 611 ; N R ; B 86 0 565 750 ;
+C 83 ; WX 556 ; N S ; B 51 -18 505 765 ;
+C 84 ; WX 500 ; N T ; B 15 0 486 750 ;
+C 85 ; WX 611 ; N U ; B 81 -18 531 750 ;
+C 86 ; WX 556 ; N V ; B 11 0 545 750 ;
+C 87 ; WX 833 ; N W ; B 17 0 816 750 ;
+C 88 ; WX 556 ; N X ; B 17 0 539 750 ;
+C 89 ; WX 556 ; N Y ; B 11 0 546 750 ;
+C 90 ; WX 500 ; N Z ; B 28 0 473 750 ;
+C 91 ; WX 333 ; N bracketleft ; B 100 -209 275 750 ;
+C 92 ; WX 250 ; N backslash ; B -31 0 281 750 ;
+C 93 ; WX 333 ; N bracketright ; B 58 -209 233 750 ;
+C 94 ; WX 500 ; N asciicircum ; B 70 333 431 750 ;
+C 95 ; WX 500 ; N underscore ; B 0 -119 500 -61 ;
+C 96 ; WX 222 ; N quoteleft ; B 64 521 158 767 ;
+C 97 ; WX 444 ; N a ; B 31 -15 417 571 ;
+C 98 ; WX 500 ; N b ; B 75 -15 447 750 ;
+C 99 ; WX 444 ; N c ; B 44 -15 405 571 ;
+C 100 ; WX 500 ; N d ; B 48 -15 424 750 ;
+C 101 ; WX 444 ; N e ; B 43 -15 395 571 ;
+C 102 ; WX 278 ; N f ; B 12 0 259 752 ; L i fi ; L l fl ;
+C 103 ; WX 500 ; N g ; B 45 -189 426 571 ;
+C 104 ; WX 500 ; N h ; B 73 0 428 750 ;
+C 105 ; WX 222 ; N i ; B 72 0 151 750 ;
+C 106 ; WX 222 ; N j ; B 13 -190 154 750 ;
+C 107 ; WX 444 ; N k ; B 69 0 439 750 ;
+C 108 ; WX 222 ; N l ; B 72 0 151 750 ;
+C 109 ; WX 778 ; N m ; B 76 0 703 571 ;
+C 110 ; WX 500 ; N n ; B 73 0 428 571 ;
+C 111 ; WX 500 ; N o ; B 51 -15 449 571 ;
+C 112 ; WX 500 ; N p ; B 72 -188 447 571 ;
+C 113 ; WX 500 ; N q ; B 55 -184 426 571 ;
+C 114 ; WX 333 ; N r ; B 81 0 322 563 ;
+C 115 ; WX 444 ; N s ; B 43 -15 400 571 ;
+C 116 ; WX 278 ; N t ; B 9 0 257 707 ;
+C 117 ; WX 500 ; N u ; B 77 -15 424 556 ;
+C 118 ; WX 444 ; N v ; B 13 0 431 556 ;
+C 119 ; WX 667 ; N w ; B 19 0 649 556 ;
+C 120 ; WX 444 ; N x ; B 9 0 436 556 ;
+C 121 ; WX 444 ; N y ; B 5 -190 425 556 ;
+C 122 ; WX 389 ; N z ; B 24 0 366 556 ;
+C 123 ; WX 274 ; N braceleft ; B 7 -95 266 750 ;
+C 124 ; WX 250 ; N bar ; B 93 0 157 750 ;
+C 125 ; WX 274 ; N braceright ; B 8 -95 267 750 ;
+C 126 ; WX 500 ; N asciitilde ; B 44 166 457 345 ;
+C 161 ; WX 333 ; N exclamdown ; B 121 -179 212 571 ;
+C 162 ; WX 500 ; N cent ; B 58 -137 418 667 ;
+C 163 ; WX 500 ; N sterling ; B 30 -15 485 750 ;
+C 164 ; WX 167 ; N fraction ; B -174 0 341 750 ;
+C 165 ; WX 500 ; N yen ; B -17 0 518 750 ;
+C 166 ; WX 500 ; N florin ; B 10 -192 488 750 ;
+C 167 ; WX 500 ; N section ; B 35 -208 466 750 ;
+C 168 ; WX 500 ; N currency ; B 24 50 475 553 ;
+C 169 ; WX 250 ; N quotesingle ; B 99 513 151 739 ;
+C 170 ; WX 389 ; N quotedblleft ; B 62 521 327 767 ;
+C 171 ; WX 500 ; N guillemotleft ; B 85 125 415 495 ;
+C 172 ; WX 278 ; N guilsinglleft ; B 64 125 215 495 ;
+C 173 ; WX 278 ; N guilsinglright ; B 63 125 214 495 ;
+C 174 ; WX 500 ; N fi ; B 12 0 427 752 ;
+C 175 ; WX 500 ; N fl ; B 12 0 425 752 ;
+C 177 ; WX 500 ; N endash ; B 0 275 500 345 ;
+C 178 ; WX 500 ; N dagger ; B 40 -176 461 750 ;
+C 179 ; WX 500 ; N daggerdbl ; B 39 -176 462 750 ;
+C 180 ; WX 250 ; N periodcentered ; B 80 204 171 304 ;
+C 182 ; WX 440 ; N paragraph ; B 0 -116 391 750 ;
+C 183 ; WX 333 ; N bullet ; B 15 222 318 529 ;
+C 184 ; WX 222 ; N quotesinglbase ; B 64 -146 158 100 ;
+C 185 ; WX 389 ; N quotedblbase ; B 62 -146 327 100 ;
+C 186 ; WX 389 ; N quotedblright ; B 62 504 327 750 ;
+C 187 ; WX 500 ; N guillemotright ; B 85 125 415 495 ;
+C 188 ; WX 1000 ; N ellipsis ; B 121 0 878 100 ;
+C 189 ; WX 1111 ; N perthousand ; B 47 -16 1071 750 ;
+C 191 ; WX 500 ; N questiondown ; B 38 -190 440 559 ;
+C 193 ; WX 333 ; N grave ; B 35 624 233 765 ;
+C 194 ; WX 333 ; N acute ; B 100 624 298 765 ;
+C 195 ; WX 333 ; N circumflex ; B 21 624 313 765 ;
+C 196 ; WX 333 ; N tilde ; B -3 634 337 750 ;
+C 197 ; WX 333 ; N macron ; B 10 657 323 715 ;
+C 198 ; WX 333 ; N breve ; B 12 629 321 765 ;
+C 199 ; WX 250 ; N dotaccent ; B 86 650 165 750 ;
+C 200 ; WX 333 ; N dieresis ; B 52 650 281 750 ;
+C 202 ; WX 250 ; N ring ; B 23 593 227 796 ;
+C 203 ; WX 333 ; N cedilla ; B 66 -224 281 0 ;
+C 205 ; WX 333 ; N hungarumlaut ; B 61 624 440 765 ;
+C 206 ; WX 333 ; N ogonek ; B 0 -191 208 13 ;
+C 207 ; WX 333 ; N caron ; B 21 624 313 765 ;
+C 208 ; WX 1000 ; N emdash ; B 0 275 1000 345 ;
+C 225 ; WX 833 ; N AE ; B 0 0 785 750 ;
+C 227 ; WX 300 ; N ordfeminine ; B 25 305 276 765 ;
+C 232 ; WX 500 ; N Lslash ; B -13 0 472 750 ;
+C 233 ; WX 611 ; N Oslash ; B 29 -43 573 796 ;
+C 234 ; WX 833 ; N OE ; B 56 -18 787 765 ;
+C 235 ; WX 300 ; N ordmasculine ; B 20 305 279 765 ;
+C 241 ; WX 667 ; N ae ; B 26 -15 630 571 ;
+C 245 ; WX 222 ; N dotlessi ; B 72 0 151 556 ;
+C 248 ; WX 222 ; N lslash ; B -8 0 231 750 ;
+C 249 ; WX 500 ; N oslash ; B 25 -46 472 582 ;
+C 250 ; WX 722 ; N oe ; B 40 -15 676 571 ;
+C 251 ; WX 500 ; N germandbls ; B 71 -5 445 765 ;
+C -1 ; WX 556 ; N Aacute ; B 11 0 546 959 ;
+C -1 ; WX 556 ; N Acircumflex ; B 11 0 546 959 ;
+C -1 ; WX 556 ; N Adieresis ; B 11 0 546 944 ;
+C -1 ; WX 556 ; N Agrave ; B 11 0 546 959 ;
+C -1 ; WX 556 ; N Aring ; B 11 0 546 990 ;
+C -1 ; WX 556 ; N Atilde ; B 11 0 546 944 ;
+C -1 ; WX 556 ; N Ccedilla ; B 53 -224 503 765 ;
+C -1 ; WX 500 ; N Eacute ; B 74 0 451 959 ;
+C -1 ; WX 500 ; N Ecircumflex ; B 74 0 451 959 ;
+C -1 ; WX 500 ; N Edieresis ; B 74 0 451 944 ;
+C -1 ; WX 500 ; N Egrave ; B 74 0 451 959 ;
+C -1 ; WX 611 ; N Eth ; B -6 0 548 750 ;
+C -1 ; WX 278 ; N Iacute ; B 73 0 271 959 ;
+C -1 ; WX 278 ; N Icircumflex ; B -6 0 286 959 ;
+C -1 ; WX 278 ; N Idieresis ; B 25 0 254 944 ;
+C -1 ; WX 278 ; N Igrave ; B 8 0 206 959 ;
+C -1 ; WX 611 ; N Ntilde ; B 77 0 534 944 ;
+C -1 ; WX 611 ; N Oacute ; B 59 -18 553 959 ;
+C -1 ; WX 611 ; N Ocircumflex ; B 59 -18 553 959 ;
+C -1 ; WX 611 ; N Odieresis ; B 59 -18 553 944 ;
+C -1 ; WX 611 ; N Ograve ; B 59 -18 553 959 ;
+C -1 ; WX 611 ; N Otilde ; B 59 -18 553 944 ;
+C -1 ; WX 556 ; N Scaron ; B 51 -18 505 959 ;
+C -1 ; WX 556 ; N Thorn ; B 86 0 519 750 ;
+C -1 ; WX 611 ; N Uacute ; B 81 -18 531 959 ;
+C -1 ; WX 611 ; N Ucircumflex ; B 81 -18 531 959 ;
+C -1 ; WX 611 ; N Udieresis ; B 81 -18 531 944 ;
+C -1 ; WX 611 ; N Ugrave ; B 81 -18 531 959 ;
+C -1 ; WX 556 ; N Yacute ; B 11 0 546 959 ;
+C -1 ; WX 556 ; N Ydieresis ; B 11 0 546 944 ;
+C -1 ; WX 500 ; N Zcaron ; B 28 0 473 959 ;
+C -1 ; WX 444 ; N aacute ; B 31 -15 417 765 ;
+C -1 ; WX 444 ; N acircumflex ; B 31 -15 417 765 ;
+C -1 ; WX 444 ; N adieresis ; B 31 -15 417 750 ;
+C -1 ; WX 444 ; N agrave ; B 31 -15 417 765 ;
+C -1 ; WX 444 ; N aring ; B 31 -15 417 796 ;
+C -1 ; WX 444 ; N atilde ; B 31 -15 417 750 ;
+C -1 ; WX 250 ; N brokenbar ; B 93 0 157 750 ;
+C -1 ; WX 444 ; N ccedilla ; B 44 -224 405 571 ;
+C -1 ; WX 800 ; N copyright ; B 8 -18 792 765 ;
+C -1 ; WX 400 ; N degree ; B 50 450 350 750 ;
+C -1 ; WX 500 ; N divide ; B 44 3 457 505 ;
+C -1 ; WX 444 ; N eacute ; B 43 -15 395 765 ;
+C -1 ; WX 444 ; N ecircumflex ; B 43 -15 395 765 ;
+C -1 ; WX 444 ; N edieresis ; B 43 -15 395 750 ;
+C -1 ; WX 444 ; N egrave ; B 43 -15 395 765 ;
+C -1 ; WX 500 ; N eth ; B 42 -15 440 770 ;
+C -1 ; WX 222 ; N iacute ; B 45 0 243 765 ;
+C -1 ; WX 222 ; N icircumflex ; B -34 0 258 765 ;
+C -1 ; WX 222 ; N idieresis ; B -3 0 226 750 ;
+C -1 ; WX 222 ; N igrave ; B -20 0 178 765 ;
+C -1 ; WX 500 ; N logicalnot ; B 44 117 457 384 ;
+C -1 ; WX 500 ; N minus ; B 44 219 457 289 ;
+C -1 ; WX 500 ; N mu ; B 75 -189 422 556 ;
+C -1 ; WX 500 ; N multiply ; B 44 48 457 461 ;
+C -1 ; WX 500 ; N ntilde ; B 73 0 428 750 ;
+C -1 ; WX 500 ; N oacute ; B 51 -15 449 765 ;
+C -1 ; WX 500 ; N ocircumflex ; B 51 -15 449 765 ;
+C -1 ; WX 500 ; N odieresis ; B 51 -15 449 750 ;
+C -1 ; WX 500 ; N ograve ; B 51 -15 449 765 ;
+C -1 ; WX 750 ; N onehalf ; B 42 0 709 750 ;
+C -1 ; WX 750 ; N onequarter ; B 34 0 716 750 ;
+C -1 ; WX 300 ; N onesuperior ; B 67 300 233 750 ;
+C -1 ; WX 500 ; N otilde ; B 51 -15 449 750 ;
+C -1 ; WX 500 ; N plusminus ; B 44 0 457 505 ;
+C -1 ; WX 800 ; N registered ; B 8 -18 792 765 ;
+C -1 ; WX 444 ; N scaron ; B 43 -15 400 765 ;
+C -1 ; WX 500 ; N thorn ; B 72 -188 447 750 ;
+C -1 ; WX 750 ; N threequarters ; B 21 0 730 750 ;
+C -1 ; WX 300 ; N threesuperior ; B 17 291 283 750 ;
+C -1 ; WX 750 ; N trademark ; B 0 329 719 750 ;
+C -1 ; WX 300 ; N twosuperior ; B 19 300 281 750 ;
+C -1 ; WX 500 ; N uacute ; B 77 -15 424 765 ;
+C -1 ; WX 500 ; N ucircumflex ; B 77 -15 424 765 ;
+C -1 ; WX 500 ; N udieresis ; B 77 -15 424 750 ;
+C -1 ; WX 500 ; N ugrave ; B 77 -15 424 765 ;
+C -1 ; WX 444 ; N yacute ; B 5 -190 425 765 ;
+C -1 ; WX 444 ; N ydieresis ; B 5 -190 425 750 ;
+C -1 ; WX 389 ; N zcaron ; B 24 0 366 765 ;
+EndCharMetrics
+StartKernData
+StartKernPairs 115
+
+KPX A y -18
+KPX A w -18
+KPX A v -18
+KPX A quoteright -55
+KPX A Y -55
+KPX A W -37
+KPX A V -37
+KPX A T -55
+
+KPX F period -111
+KPX F comma -111
+KPX F A -37
+
+KPX L y -37
+KPX L quoteright -92
+KPX L Y -92
+KPX L W -74
+KPX L V -74
+KPX L T -74
+
+KPX P period -129
+KPX P comma -129
+KPX P A -37
+
+KPX R y 0
+KPX R Y -18
+KPX R W 0
+KPX R V 0
+KPX R T -18
+
+KPX T y -55
+KPX T w -74
+KPX T u -74
+KPX T semicolon -74
+KPX T s -74
+KPX T r -74
+KPX T period -92
+KPX T o -74
+KPX T i -18
+KPX T hyphen -55
+KPX T e -74
+KPX T comma -92
+KPX T colon -74
+KPX T c -74
+KPX T a -74
+KPX T A -55
+
+KPX V y 0
+KPX V u -18
+KPX V semicolon -18
+KPX V r -18
+KPX V period -92
+KPX V o -18
+KPX V i 0
+KPX V hyphen -18
+KPX V e -18
+KPX V comma -92
+KPX V colon -18
+KPX V a -18
+KPX V A -37
+
+KPX W y 0
+KPX W u 0
+KPX W semicolon 0
+KPX W r 0
+KPX W period -74
+KPX W o -18
+KPX W i 0
+KPX W hyphen -18
+KPX W e -18
+KPX W comma -74
+KPX W colon 0
+KPX W a -18
+KPX W A -18
+
+KPX Y v -18
+KPX Y u -37
+KPX Y semicolon -37
+KPX Y q -55
+KPX Y period -111
+KPX Y p -37
+KPX Y o -55
+KPX Y i -18
+KPX Y hyphen -74
+KPX Y e -55
+KPX Y comma -111
+KPX Y colon -37
+KPX Y a -55
+KPX Y A -55
+
+KPX f quoteright 18
+KPX f f 0
+
+KPX quoteleft quoteleft -18
+
+KPX quoteright t 0
+KPX quoteright s -55
+KPX quoteright quoteright -18
+
+KPX r z 20
+KPX r y 18
+KPX r x 20
+KPX r w 18
+KPX r v 18
+KPX r u 0
+KPX r t 0
+KPX r r 0
+KPX r quoteright 0
+KPX r q 0
+KPX r period -74
+KPX r o 0
+KPX r n 0
+KPX r m 0
+KPX r hyphen -37
+KPX r h 0
+KPX r g 0
+KPX r f 20
+KPX r e 0
+KPX r d 0
+KPX r comma -74
+KPX r c -20
+
+KPX v period -55
+KPX v comma -55
+
+KPX w period -37
+KPX w comma -37
+
+KPX y period -55
+KPX y comma -55
+EndKernPairs
+EndKernData
+StartComposites 58
+CC Zcaron 2 ; PCC Z 0 0 ; PCC caron 83 194 ;
+CC zcaron 2 ; PCC z 0 0 ; PCC caron 28 0 ;
+CC Scaron 2 ; PCC S 0 0 ; PCC caron 111 194 ;
+CC scaron 2 ; PCC s 0 0 ; PCC caron 55 0 ;
+CC Ccedilla 2 ; PCC C 0 0 ; PCC cedilla 111 0 ;
+CC ccedilla 2 ; PCC c 0 0 ; PCC cedilla 55 0 ;
+CC Yacute 2 ; PCC Y 0 0 ; PCC acute 111 194 ;
+CC yacute 2 ; PCC y 0 0 ; PCC acute 55 0 ;
+CC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 111 194 ;
+CC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 55 0 ;
+CC Uacute 2 ; PCC U 0 0 ; PCC acute 139 194 ;
+CC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 139 194 ;
+CC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 139 194 ;
+CC Ugrave 2 ; PCC U 0 0 ; PCC grave 139 194 ;
+CC uacute 2 ; PCC u 0 0 ; PCC acute 83 0 ;
+CC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 83 0 ;
+CC udieresis 2 ; PCC u 0 0 ; PCC dieresis 83 0 ;
+CC ugrave 2 ; PCC u 0 0 ; PCC grave 83 0 ;
+CC Iacute 2 ; PCC I 0 0 ; PCC acute -27 194 ;
+CC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex -27 194 ;
+CC Idieresis 2 ; PCC I 0 0 ; PCC dieresis -27 194 ;
+CC Igrave 2 ; PCC I 0 0 ; PCC grave -27 194 ;
+CC iacute 2 ; PCC dotlessi 0 0 ; PCC acute -55 0 ;
+CC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -55 0 ;
+CC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -55 0 ;
+CC igrave 2 ; PCC dotlessi 0 0 ; PCC grave -55 0 ;
+CC Eacute 2 ; PCC E 0 0 ; PCC acute 83 194 ;
+CC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 83 194 ;
+CC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 83 194 ;
+CC Egrave 2 ; PCC E 0 0 ; PCC grave 83 194 ;
+CC eacute 2 ; PCC e 0 0 ; PCC acute 55 0 ;
+CC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 55 0 ;
+CC edieresis 2 ; PCC e 0 0 ; PCC dieresis 55 0 ;
+CC egrave 2 ; PCC e 0 0 ; PCC grave 55 0 ;
+CC Aacute 2 ; PCC A 0 0 ; PCC acute 111 194 ;
+CC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 111 194 ;
+CC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 111 194 ;
+CC Agrave 2 ; PCC A 0 0 ; PCC grave 111 194 ;
+CC aacute 2 ; PCC a 0 0 ; PCC acute 55 0 ;
+CC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 55 0 ;
+CC adieresis 2 ; PCC a 0 0 ; PCC dieresis 55 0 ;
+CC agrave 2 ; PCC a 0 0 ; PCC grave 55 0 ;
+CC Oacute 2 ; PCC O 0 0 ; PCC acute 139 194 ;
+CC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 139 194 ;
+CC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 139 194 ;
+CC Ograve 2 ; PCC O 0 0 ; PCC grave 139 194 ;
+CC oacute 2 ; PCC o 0 0 ; PCC acute 83 0 ;
+CC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 83 0 ;
+CC odieresis 2 ; PCC o 0 0 ; PCC dieresis 83 0 ;
+CC ograve 2 ; PCC o 0 0 ; PCC grave 83 0 ;
+CC Atilde 2 ; PCC A 0 0 ; PCC tilde 111 194 ;
+CC atilde 2 ; PCC a 0 0 ; PCC tilde 55 0 ;
+CC Ntilde 2 ; PCC N 0 0 ; PCC tilde 139 194 ;
+CC ntilde 2 ; PCC n 0 0 ; PCC tilde 83 0 ;
+CC Otilde 2 ; PCC O 0 0 ; PCC tilde 139 194 ;
+CC otilde 2 ; PCC o 0 0 ; PCC tilde 83 0 ;
+CC Aring 2 ; PCC A 0 0 ; PCC ring 153 194 ;
+CC aring 2 ; PCC a 0 0 ; PCC ring 97 0 ;
+EndComposites
+EndFontMetrics
+
diff --git a/src/fonts/pshcb.afm b/src/fonts/pshcb.afm
new file mode 100644
index 0000000..09471c3
--- /dev/null
+++ b/src/fonts/pshcb.afm
@@ -0,0 +1,446 @@
+StartFontMetrics 2.0
+Comment Copyright (c) 1985, 1987 Adobe Systems Incorporated. All rights reserved.
+Comment Creation Date:Thu Aug 13 15:58:23 PDT 1987
+FontName Helvetica-Condensed-Bold
+EncodingScheme AdobeStandardEncoding
+FullName Helvetica Condensed Bold
+FamilyName Helvetica
+Weight BoldCondensed
+ItalicAngle 0.0
+IsFixedPitch false
+UnderlinePosition -90
+UnderlineThickness 58
+Version 001.002
+Notice Copyright (c) 1985, 1987 Adobe Systems Incorporated. All rights reserved. Helvetica is a trademark of Allied Corporation.
+FontBBox -169 -228 1091 971
+CapHeight 750
+XHeight 564
+Descender -189
+Ascender 750
+StartCharMetrics 228
+C 32 ; WX 250 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 333 ; N exclam ; B 101 0 232 750 ;
+C 34 ; WX 333 ; N quotedbl ; B 16 468 318 739 ;
+C 35 ; WX 500 ; N numbersign ; B 31 0 469 738 ;
+C 36 ; WX 500 ; N dollar ; B 34 -124 465 803 ;
+C 37 ; WX 833 ; N percent ; B 31 -15 803 750 ;
+C 38 ; WX 667 ; N ampersand ; B 63 -18 615 768 ;
+C 39 ; WX 278 ; N quoteright ; B 81 479 202 750 ;
+C 40 ; WX 333 ; N parenleft ; B 52 -198 281 768 ;
+C 41 ; WX 333 ; N parenright ; B 52 -198 281 768 ;
+C 42 ; WX 500 ; N asterisk ; B 79 412 422 738 ;
+C 43 ; WX 500 ; N plus ; B 26 0 475 492 ;
+C 44 ; WX 333 ; N comma ; B 101 -145 233 132 ;
+C 45 ; WX 333 ; N hyphen ; B 48 255 286 370 ;
+C 46 ; WX 333 ; N period ; B 101 0 233 132 ;
+C 47 ; WX 278 ; N slash ; B -11 -94 312 750 ;
+C 48 ; WX 500 ; N zero ; B 48 -15 453 753 ;
+C 49 ; WX 500 ; N one ; B 44 0 353 750 ;
+C 50 ; WX 500 ; N two ; B 32 0 453 753 ;
+C 51 ; WX 500 ; N three ; B 28 -15 453 753 ;
+C 52 ; WX 500 ; N four ; B 23 0 470 738 ;
+C 53 ; WX 500 ; N five ; B 37 -15 458 738 ;
+C 54 ; WX 500 ; N six ; B 42 -15 459 753 ;
+C 55 ; WX 500 ; N seven ; B 32 0 454 738 ;
+C 56 ; WX 500 ; N eight ; B 41 -15 460 753 ;
+C 57 ; WX 500 ; N nine ; B 42 -15 459 753 ;
+C 58 ; WX 278 ; N colon ; B 73 0 205 556 ;
+C 59 ; WX 278 ; N semicolon ; B 73 -145 205 556 ;
+C 60 ; WX 500 ; N less ; B 42 -24 459 527 ;
+C 61 ; WX 500 ; N equal ; B 26 96 475 401 ;
+C 62 ; WX 500 ; N greater ; B 42 -24 459 527 ;
+C 63 ; WX 500 ; N question ; B 51 0 440 768 ;
+C 64 ; WX 833 ; N at ; B 38 -18 795 768 ;
+C 65 ; WX 556 ; N A ; B 9 0 547 750 ;
+C 66 ; WX 556 ; N B ; B 65 0 506 750 ;
+C 67 ; WX 556 ; N C ; B 55 -18 512 768 ;
+C 68 ; WX 611 ; N D ; B 72 0 550 750 ;
+C 69 ; WX 500 ; N E ; B 64 0 458 750 ;
+C 70 ; WX 500 ; N F ; B 73 0 470 750 ;
+C 71 ; WX 611 ; N G ; B 55 -18 542 768 ;
+C 72 ; WX 611 ; N H ; B 68 0 544 750 ;
+C 73 ; WX 278 ; N I ; B 69 0 209 750 ;
+C 74 ; WX 444 ; N J ; B 7 -18 384 750 ;
+C 75 ; WX 556 ; N K ; B 68 0 547 750 ;
+C 76 ; WX 500 ; N L ; B 68 0 468 750 ;
+C 77 ; WX 778 ; N M ; B 67 0 712 750 ;
+C 78 ; WX 611 ; N N ; B 68 0 543 750 ;
+C 79 ; WX 611 ; N O ; B 61 -18 551 768 ;
+C 80 ; WX 556 ; N P ; B 68 0 529 750 ;
+C 81 ; WX 611 ; N Q ; B 61 -71 587 768 ;
+C 82 ; WX 611 ; N R ; B 66 0 567 750 ;
+C 83 ; WX 556 ; N S ; B 49 -18 508 768 ;
+C 84 ; WX 500 ; N T ; B 17 0 484 750 ;
+C 85 ; WX 611 ; N U ; B 68 -18 544 750 ;
+C 86 ; WX 556 ; N V ; B 21 0 536 750 ;
+C 87 ; WX 833 ; N W ; B 24 0 810 750 ;
+C 88 ; WX 556 ; N X ; B 11 0 545 750 ;
+C 89 ; WX 556 ; N Y ; B 12 0 545 750 ;
+C 90 ; WX 500 ; N Z ; B 33 0 468 750 ;
+C 91 ; WX 333 ; N bracketleft ; B 81 -94 280 750 ;
+C 92 ; WX 250 ; N backslash ; B -89 0 340 750 ;
+C 93 ; WX 333 ; N bracketright ; B 53 -94 252 750 ;
+C 94 ; WX 500 ; N asciicircum ; B 10 326 490 750 ;
+C 95 ; WX 500 ; N underscore ; B 0 -119 500 -61 ;
+C 96 ; WX 278 ; N quoteleft ; B 76 495 197 766 ;
+C 97 ; WX 500 ; N a ; B 42 -15 440 579 ;
+C 98 ; WX 500 ; N b ; B 64 -15 444 750 ;
+C 99 ; WX 444 ; N c ; B 48 -15 402 579 ;
+C 100 ; WX 500 ; N d ; B 53 -15 433 750 ;
+C 101 ; WX 500 ; N e ; B 52 -15 442 579 ;
+C 102 ; WX 278 ; N f ; B 21 0 257 750 ; L i fi ; L l fl ;
+C 103 ; WX 500 ; N g ; B 53 -190 433 579 ;
+C 104 ; WX 500 ; N h ; B 61 0 440 750 ;
+C 105 ; WX 278 ; N i ; B 74 0 204 750 ;
+C 106 ; WX 278 ; N j ; B 31 -192 210 750 ;
+C 107 ; WX 444 ; N k ; B 48 0 443 750 ;
+C 108 ; WX 278 ; N l ; B 74 0 204 750 ;
+C 109 ; WX 778 ; N m ; B 66 0 712 579 ;
+C 110 ; WX 500 ; N n ; B 61 0 440 579 ;
+C 111 ; WX 500 ; N o ; B 53 -15 447 579 ;
+C 112 ; WX 500 ; N p ; B 58 -189 438 579 ;
+C 113 ; WX 500 ; N q ; B 50 -188 430 579 ;
+C 114 ; WX 333 ; N r ; B 60 0 319 574 ;
+C 115 ; WX 444 ; N s ; B 27 -15 406 579 ;
+C 116 ; WX 278 ; N t ; B 14 -7 252 719 ;
+C 117 ; WX 500 ; N u ; B 58 -15 431 564 ;
+C 118 ; WX 444 ; N v ; B 10 0 434 564 ;
+C 119 ; WX 667 ; N w ; B 11 0 645 564 ;
+C 120 ; WX 444 ; N x ; B 8 0 436 564 ;
+C 121 ; WX 444 ; N y ; B 5 -195 429 564 ;
+C 122 ; WX 389 ; N z ; B 23 0 367 564 ;
+C 123 ; WX 274 ; N braceleft ; B -32 -92 240 750 ;
+C 124 ; WX 250 ; N bar ; B 75 0 175 750 ;
+C 125 ; WX 274 ; N braceright ; B 34 -94 306 750 ;
+C 126 ; WX 500 ; N asciitilde ; B 26 153 475 359 ;
+C 161 ; WX 333 ; N exclamdown ; B 101 -170 232 579 ;
+C 162 ; WX 500 ; N cent ; B 72 -122 428 671 ;
+C 163 ; WX 500 ; N sterling ; B 35 -15 487 768 ;
+C 164 ; WX 167 ; N fraction ; B -169 0 331 738 ;
+C 165 ; WX 500 ; N yen ; B -18 0 518 750 ;
+C 166 ; WX 500 ; N florin ; B 9 -185 492 763 ;
+C 167 ; WX 500 ; N section ; B 37 -183 463 768 ;
+C 168 ; WX 500 ; N currency ; B 9 58 492 560 ;
+C 169 ; WX 250 ; N quotesingle ; B 66 468 185 739 ;
+C 170 ; WX 500 ; N quotedblleft ; B 87 495 405 766 ;
+C 171 ; WX 500 ; N guillemotleft ; B 74 62 419 447 ;
+C 172 ; WX 278 ; N guilsinglleft ; B 58 62 215 447 ;
+C 173 ; WX 278 ; N guilsinglright ; B 63 62 220 447 ;
+C 174 ; WX 500 ; N fi ; B 10 0 446 750 ;
+C 175 ; WX 500 ; N fl ; B 10 0 443 750 ;
+C 177 ; WX 500 ; N endash ; B 0 259 500 369 ;
+C 178 ; WX 500 ; N dagger ; B 37 -155 463 768 ;
+C 179 ; WX 500 ; N daggerdbl ; B 35 -161 466 768 ;
+C 180 ; WX 333 ; N periodcentered ; B 101 183 233 315 ;
+C 182 ; WX 550 ; N paragraph ; B 23 -116 526 750 ;
+C 183 ; WX 420 ; N bullet ; B 22 186 398 562 ;
+C 184 ; WX 278 ; N quotesinglbase ; B 87 -138 207 132 ;
+C 185 ; WX 500 ; N quotedblbase ; B 96 -138 413 132 ;
+C 186 ; WX 500 ; N quotedblright ; B 95 479 413 750 ;
+C 187 ; WX 500 ; N guillemotright ; B 81 62 426 447 ;
+C 188 ; WX 1000 ; N ellipsis ; B 101 0 899 132 ;
+C 189 ; WX 1111 ; N perthousand ; B 21 -18 1091 748 ;
+C 191 ; WX 500 ; N questiondown ; B 60 -190 449 579 ;
+C 193 ; WX 333 ; N grave ; B 1 629 250 775 ;
+C 194 ; WX 333 ; N acute ; B 83 629 332 775 ;
+C 195 ; WX 333 ; N circumflex ; B -10 644 343 790 ;
+C 196 ; WX 333 ; N tilde ; B -16 636 350 764 ;
+C 197 ; WX 333 ; N macron ; B -6 666 340 740 ;
+C 198 ; WX 333 ; N breve ; B -1 635 335 780 ;
+C 199 ; WX 333 ; N dotaccent ; B 103 644 230 759 ;
+C 200 ; WX 333 ; N dieresis ; B 5 644 328 759 ;
+C 202 ; WX 333 ; N ring ; B 60 632 273 845 ;
+C 203 ; WX 333 ; N cedilla ; B 39 -228 275 0 ;
+C 205 ; WX 333 ; N hungarumlaut ; B -17 634 447 780 ;
+C 206 ; WX 333 ; N ogonek ; B 88 -205 278 0 ;
+C 207 ; WX 333 ; N caron ; B -10 634 343 780 ;
+C 208 ; WX 1000 ; N emdash ; B 0 259 1000 369 ;
+C 225 ; WX 778 ; N AE ; B -22 0 750 750 ;
+C 227 ; WX 300 ; N ordfeminine ; B 20 291 281 768 ;
+C 232 ; WX 500 ; N Lslash ; B 0 0 474 750 ;
+C 233 ; WX 611 ; N Oslash ; B 36 -38 578 779 ;
+C 234 ; WX 833 ; N OE ; B 60 -18 791 768 ;
+C 235 ; WX 300 ; N ordmasculine ; B 22 291 278 768 ;
+C 241 ; WX 722 ; N ae ; B 44 -15 672 579 ;
+C 245 ; WX 278 ; N dotlessi ; B 74 0 204 564 ;
+C 248 ; WX 278 ; N lslash ; B 2 0 272 750 ;
+C 249 ; WX 500 ; N oslash ; B 7 -58 492 617 ;
+C 250 ; WX 722 ; N oe ; B 46 -15 678 579 ;
+C 251 ; WX 500 ; N germandbls ; B 60 -15 445 768 ;
+C -1 ; WX 556 ; N Aacute ; B 9 0 547 961 ;
+C -1 ; WX 556 ; N Acircumflex ; B 9 0 547 956 ;
+C -1 ; WX 556 ; N Adieresis ; B 9 0 547 945 ;
+C -1 ; WX 556 ; N Agrave ; B 9 0 547 961 ;
+C -1 ; WX 556 ; N Aring ; B 9 0 547 971 ;
+C -1 ; WX 556 ; N Atilde ; B 9 0 547 930 ;
+C -1 ; WX 556 ; N Ccedilla ; B 55 -228 512 768 ;
+C -1 ; WX 500 ; N Eacute ; B 64 0 458 961 ;
+C -1 ; WX 500 ; N Ecircumflex ; B 64 0 458 956 ;
+C -1 ; WX 500 ; N Edieresis ; B 64 0 458 945 ;
+C -1 ; WX 500 ; N Egrave ; B 64 0 458 961 ;
+C -1 ; WX 611 ; N Eth ; B -6 0 550 750 ;
+C -1 ; WX 278 ; N Iacute ; B 56 0 305 961 ;
+C -1 ; WX 278 ; N Icircumflex ; B -37 0 316 956 ;
+C -1 ; WX 278 ; N Idieresis ; B -22 0 301 945 ;
+C -1 ; WX 278 ; N Igrave ; B -26 0 223 961 ;
+C -1 ; WX 611 ; N Ntilde ; B 68 0 543 930 ;
+C -1 ; WX 611 ; N Oacute ; B 61 -18 551 961 ;
+C -1 ; WX 611 ; N Ocircumflex ; B 61 -18 551 956 ;
+C -1 ; WX 611 ; N Odieresis ; B 61 -18 551 945 ;
+C -1 ; WX 611 ; N Ograve ; B 61 -18 551 961 ;
+C -1 ; WX 611 ; N Otilde ; B 61 -18 551 930 ;
+C -1 ; WX 556 ; N Scaron ; B 49 -18 508 946 ;
+C -1 ; WX 556 ; N Thorn ; B 68 0 529 750 ;
+C -1 ; WX 611 ; N Uacute ; B 68 -18 544 961 ;
+C -1 ; WX 611 ; N Ucircumflex ; B 68 -18 544 956 ;
+C -1 ; WX 611 ; N Udieresis ; B 68 -18 544 945 ;
+C -1 ; WX 611 ; N Ugrave ; B 68 -18 544 961 ;
+C -1 ; WX 556 ; N Yacute ; B 12 0 545 961 ;
+C -1 ; WX 556 ; N Ydieresis ; B 12 0 545 945 ;
+C -1 ; WX 500 ; N Zcaron ; B 33 0 468 946 ;
+C -1 ; WX 500 ; N aacute ; B 42 -15 440 775 ;
+C -1 ; WX 500 ; N acircumflex ; B 42 -15 440 770 ;
+C -1 ; WX 500 ; N adieresis ; B 42 -15 440 759 ;
+C -1 ; WX 500 ; N agrave ; B 42 -15 440 775 ;
+C -1 ; WX 500 ; N aring ; B 42 -15 440 845 ;
+C -1 ; WX 500 ; N atilde ; B 42 -15 440 744 ;
+C -1 ; WX 250 ; N brokenbar ; B 75 0 175 750 ;
+C -1 ; WX 444 ; N ccedilla ; B 48 -228 402 579 ;
+C -1 ; WX 830 ; N copyright ; B 22 -18 808 768 ;
+C -1 ; WX 400 ; N degree ; B 50 450 350 750 ;
+C -1 ; WX 500 ; N divide ; B 26 6 475 492 ;
+C -1 ; WX 500 ; N eacute ; B 52 -15 442 775 ;
+C -1 ; WX 500 ; N ecircumflex ; B 52 -15 442 770 ;
+C -1 ; WX 500 ; N edieresis ; B 52 -15 442 759 ;
+C -1 ; WX 500 ; N egrave ; B 52 -15 442 775 ;
+C -1 ; WX 500 ; N eth ; B 46 -15 443 777 ;
+C -1 ; WX 278 ; N iacute ; B 56 0 305 775 ;
+C -1 ; WX 278 ; N icircumflex ; B -47 0 306 770 ;
+C -1 ; WX 278 ; N idieresis ; B -22 0 301 759 ;
+C -1 ; WX 278 ; N igrave ; B -26 0 223 775 ;
+C -1 ; WX 500 ; N logicalnot ; B 26 105 475 401 ;
+C -1 ; WX 500 ; N minus ; B 26 194 475 304 ;
+C -1 ; WX 500 ; N mu ; B 58 -189 431 564 ;
+C -1 ; WX 500 ; N multiply ; B 26 22 475 476 ;
+C -1 ; WX 500 ; N ntilde ; B 61 0 440 744 ;
+C -1 ; WX 500 ; N oacute ; B 53 -15 447 775 ;
+C -1 ; WX 500 ; N ocircumflex ; B 53 -15 447 770 ;
+C -1 ; WX 500 ; N odieresis ; B 53 -15 447 759 ;
+C -1 ; WX 500 ; N ograve ; B 53 -15 447 775 ;
+C -1 ; WX 750 ; N onehalf ; B 12 0 739 750 ;
+C -1 ; WX 750 ; N onequarter ; B 20 0 729 750 ;
+C -1 ; WX 300 ; N onesuperior ; B 50 300 251 750 ;
+C -1 ; WX 500 ; N otilde ; B 53 -15 447 744 ;
+C -1 ; WX 500 ; N plusminus ; B 26 -15 475 513 ;
+C -1 ; WX 830 ; N registered ; B 22 -18 808 768 ;
+C -1 ; WX 444 ; N scaron ; B 27 -15 406 760 ;
+C -1 ; WX 500 ; N thorn ; B 58 -189 438 750 ;
+C -1 ; WX 750 ; N threequarters ; B 12 0 739 750 ;
+C -1 ; WX 300 ; N threesuperior ; B 12 290 288 750 ;
+C -1 ; WX 860 ; N trademark ; B 1 346 774 750 ;
+C -1 ; WX 300 ; N twosuperior ; B 13 300 287 752 ;
+C -1 ; WX 500 ; N uacute ; B 58 -15 431 775 ;
+C -1 ; WX 500 ; N ucircumflex ; B 58 -15 431 780 ;
+C -1 ; WX 500 ; N udieresis ; B 58 -15 431 759 ;
+C -1 ; WX 500 ; N ugrave ; B 58 -15 431 775 ;
+C -1 ; WX 444 ; N yacute ; B 5 -195 429 775 ;
+C -1 ; WX 444 ; N ydieresis ; B 5 -195 429 759 ;
+C -1 ; WX 389 ; N zcaron ; B 18 0 371 760 ;
+EndCharMetrics
+StartKernData
+StartKernPairs 115
+
+KPX A y -18
+KPX A w -18
+KPX A v -18
+KPX A quoteright -55
+KPX A Y -55
+KPX A W -37
+KPX A V -37
+KPX A T -55
+
+KPX F period -111
+KPX F comma -111
+KPX F A -37
+
+KPX L y -37
+KPX L quoteright -92
+KPX L Y -92
+KPX L W -74
+KPX L V -74
+KPX L T -74
+
+KPX P period -129
+KPX P comma -129
+KPX P A -37
+
+KPX R y 0
+KPX R Y -18
+KPX R W 0
+KPX R V 0
+KPX R T -18
+
+KPX T y -55
+KPX T w -74
+KPX T u -74
+KPX T semicolon -74
+KPX T s -74
+KPX T r -74
+KPX T period -92
+KPX T o -74
+KPX T i -18
+KPX T hyphen -55
+KPX T e -74
+KPX T comma -92
+KPX T colon -74
+KPX T c -74
+KPX T a -74
+KPX T A -55
+
+KPX V y 0
+KPX V u -18
+KPX V semicolon -18
+KPX V r -18
+KPX V period -92
+KPX V o -18
+KPX V i 0
+KPX V hyphen -18
+KPX V e -18
+KPX V comma -92
+KPX V colon -18
+KPX V a -18
+KPX V A -37
+
+KPX W y 0
+KPX W u 0
+KPX W semicolon 0
+KPX W r 0
+KPX W period -74
+KPX W o -18
+KPX W i 0
+KPX W hyphen -18
+KPX W e -18
+KPX W comma -74
+KPX W colon 0
+KPX W a -18
+KPX W A -18
+
+KPX Y v -18
+KPX Y u -37
+KPX Y semicolon -37
+KPX Y q -55
+KPX Y period -111
+KPX Y p -37
+KPX Y o -55
+KPX Y i -18
+KPX Y hyphen -74
+KPX Y e -55
+KPX Y comma -111
+KPX Y colon -37
+KPX Y a -55
+KPX Y A -55
+
+KPX f quoteright 18
+KPX f f 0
+
+KPX quoteleft quoteleft -18
+
+KPX quoteright t 0
+KPX quoteright s -55
+KPX quoteright quoteright -18
+
+KPX r z 20
+KPX r y 18
+KPX r x 20
+KPX r w 18
+KPX r v 18
+KPX r u 0
+KPX r t 0
+KPX r r 0
+KPX r quoteright 0
+KPX r q 0
+KPX r period -74
+KPX r o 0
+KPX r n 0
+KPX r m 0
+KPX r hyphen -37
+KPX r h 0
+KPX r g 0
+KPX r f 0
+KPX r e 0
+KPX r d 0
+KPX r comma -74
+KPX r c 0
+
+KPX v period -55
+KPX v comma -55
+
+KPX w period -37
+KPX w comma -37
+
+KPX y period -55
+KPX y comma -55
+EndKernPairs
+EndKernData
+StartComposites 58
+CC Zcaron 2 ; PCC Z 0 0 ; PCC caron 83 166 ;
+CC zcaron 2 ; PCC z 0 0 ; PCC caron 28 -20 ;
+CC Scaron 2 ; PCC S 0 0 ; PCC caron 111 166 ;
+CC scaron 2 ; PCC s 0 0 ; PCC caron 45 -20 ;
+CC Ccedilla 2 ; PCC C 0 0 ; PCC cedilla 111 0 ;
+CC ccedilla 2 ; PCC c 0 0 ; PCC cedilla 55 0 ;
+CC Yacute 2 ; PCC Y 0 0 ; PCC acute 111 186 ;
+CC yacute 2 ; PCC y 0 0 ; PCC acute 55 0 ;
+CC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 111 186 ;
+CC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 55 0 ;
+CC Uacute 2 ; PCC U 0 0 ; PCC acute 139 186 ;
+CC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 139 166 ;
+CC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 139 186 ;
+CC Ugrave 2 ; PCC U 0 0 ; PCC grave 139 186 ;
+CC uacute 2 ; PCC u 0 0 ; PCC acute 83 0 ;
+CC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 83 -10 ;
+CC udieresis 2 ; PCC u 0 0 ; PCC dieresis 83 0 ;
+CC ugrave 2 ; PCC u 0 0 ; PCC grave 83 0 ;
+CC Iacute 2 ; PCC I 0 0 ; PCC acute -27 186 ;
+CC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex -27 166 ;
+CC Idieresis 2 ; PCC I 0 0 ; PCC dieresis -27 186 ;
+CC Igrave 2 ; PCC I 0 0 ; PCC grave -27 186 ;
+CC iacute 2 ; PCC dotlessi 0 0 ; PCC acute -27 0 ;
+CC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -37 -20 ;
+CC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -27 0 ;
+CC igrave 2 ; PCC dotlessi 0 0 ; PCC grave -27 0 ;
+CC Eacute 2 ; PCC E 0 0 ; PCC acute 83 186 ;
+CC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 83 166 ;
+CC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 83 186 ;
+CC Egrave 2 ; PCC E 0 0 ; PCC grave 83 186 ;
+CC eacute 2 ; PCC e 0 0 ; PCC acute 83 0 ;
+CC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 83 -20 ;
+CC edieresis 2 ; PCC e 0 0 ; PCC dieresis 83 0 ;
+CC egrave 2 ; PCC e 0 0 ; PCC grave 83 0 ;
+CC Aacute 2 ; PCC A 0 0 ; PCC acute 111 186 ;
+CC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 101 166 ;
+CC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 111 186 ;
+CC Agrave 2 ; PCC A 0 0 ; PCC grave 111 186 ;
+CC aacute 2 ; PCC a 0 0 ; PCC acute 83 0 ;
+CC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 83 -20 ;
+CC adieresis 2 ; PCC a 0 0 ; PCC dieresis 83 0 ;
+CC agrave 2 ; PCC a 0 0 ; PCC grave 83 0 ;
+CC Oacute 2 ; PCC O 0 0 ; PCC acute 139 186 ;
+CC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 139 166 ;
+CC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 139 186 ;
+CC Ograve 2 ; PCC O 0 0 ; PCC grave 139 186 ;
+CC oacute 2 ; PCC o 0 0 ; PCC acute 83 0 ;
+CC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 83 -20 ;
+CC odieresis 2 ; PCC o 0 0 ; PCC dieresis 83 0 ;
+CC ograve 2 ; PCC o 0 0 ; PCC grave 83 0 ;
+CC Atilde 2 ; PCC A 0 0 ; PCC tilde 111 166 ;
+CC atilde 2 ; PCC a 0 0 ; PCC tilde 83 -20 ;
+CC Ntilde 2 ; PCC N 0 0 ; PCC tilde 139 166 ;
+CC ntilde 2 ; PCC n 0 0 ; PCC tilde 83 -20 ;
+CC Otilde 2 ; PCC O 0 0 ; PCC tilde 139 166 ;
+CC otilde 2 ; PCC o 0 0 ; PCC tilde 83 -20 ;
+CC Aring 2 ; PCC A 0 0 ; PCC ring 111 126 ;
+CC aring 2 ; PCC a 0 0 ; PCC ring 83 0 ;
+EndComposites
+EndFontMetrics
+
diff --git a/src/fonts/pshcbo.afm b/src/fonts/pshcbo.afm
new file mode 100644
index 0000000..9cea6a9
--- /dev/null
+++ b/src/fonts/pshcbo.afm
@@ -0,0 +1,446 @@
+StartFontMetrics 2.0
+Comment Copyright (c) 1985, 1987 Adobe Systems Incorporated. All rights reserved.
+Comment Creation Date:Thu Aug 13 17:42:03 PDT 1987
+FontName Helvetica-Condensed-BoldObl
+EncodingScheme AdobeStandardEncoding
+FullName Helvetica.Condensed Bold Oblique
+FamilyName Helvetica
+Weight BoldCondensed
+ItalicAngle -12.0
+IsFixedPitch false
+UnderlinePosition -90
+UnderlineThickness 58
+Version 001.002
+Notice Copyright (c) 1985, 1987 Adobe Systems Incorporated. All rights reserved. Helvetica is a trademark of Allied Corporation.
+FontBBox -169 -228 1141 971
+CapHeight 750
+XHeight 564
+Descender -189
+Ascender 750
+StartCharMetrics 228
+C 32 ; WX 250 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 333 ; N exclam ; B 102 0 390 750 ;
+C 34 ; WX 333 ; N quotedbl ; B 115 468 475 739 ;
+C 35 ; WX 500 ; N numbersign ; B 81 0 580 738 ;
+C 36 ; WX 500 ; N dollar ; B 67 -124 575 803 ;
+C 37 ; WX 833 ; N percent ; B 138 -15 853 750 ;
+C 38 ; WX 667 ; N ampersand ; B 101 -18 676 768 ;
+C 39 ; WX 278 ; N quoteright ; B 183 479 361 750 ;
+C 40 ; WX 333 ; N parenleft ; B 91 -198 442 768 ;
+C 41 ; WX 333 ; N parenright ; B 12 -198 363 768 ;
+C 42 ; WX 500 ; N asterisk ; B 203 412 546 738 ;
+C 43 ; WX 500 ; N plus ; B 67 0 540 492 ;
+C 44 ; WX 333 ; N comma ; B 70 -145 261 132 ;
+C 45 ; WX 333 ; N hyphen ; B 102 255 365 370 ;
+C 46 ; WX 333 ; N period ; B 101 0 261 132 ;
+C 47 ; WX 278 ; N slash ; B -31 -94 471 750 ;
+C 48 ; WX 500 ; N zero ; B 82 -15 576 753 ;
+C 49 ; WX 500 ; N one ; B 155 0 512 750 ;
+C 50 ; WX 500 ; N two ; B 32 0 577 753 ;
+C 51 ; WX 500 ; N three ; B 61 -15 563 753 ;
+C 52 ; WX 500 ; N four ; B 55 0 563 738 ;
+C 53 ; WX 500 ; N five ; B 72 -15 581 738 ;
+C 54 ; WX 500 ; N six ; B 83 -15 575 753 ;
+C 55 ; WX 500 ; N seven ; B 126 0 611 738 ;
+C 56 ; WX 500 ; N eight ; B 76 -15 570 753 ;
+C 57 ; WX 500 ; N nine ; B 84 -15 575 753 ;
+C 58 ; WX 278 ; N colon ; B 73 0 323 556 ;
+C 59 ; WX 278 ; N semicolon ; B 42 -145 323 556 ;
+C 60 ; WX 500 ; N less ; B 85 -24 571 527 ;
+C 61 ; WX 500 ; N equal ; B 46 96 560 401 ;
+C 62 ; WX 500 ; N greater ; B 37 -24 523 527 ;
+C 63 ; WX 500 ; N question ; B 147 0 569 768 ;
+C 64 ; WX 833 ; N at ; B 109 -18 897 768 ;
+C 65 ; WX 556 ; N A ; B 9 0 547 750 ;
+C 66 ; WX 556 ; N B ; B 65 0 615 750 ;
+C 67 ; WX 556 ; N C ; B 99 -18 630 768 ;
+C 68 ; WX 611 ; N D ; B 72 0 662 750 ;
+C 69 ; WX 500 ; N E ; B 64 0 617 750 ;
+C 70 ; WX 500 ; N F ; B 73 0 629 750 ;
+C 71 ; WX 611 ; N G ; B 99 -18 664 768 ;
+C 72 ; WX 611 ; N H ; B 68 0 703 750 ;
+C 73 ; WX 278 ; N I ; B 69 0 368 750 ;
+C 74 ; WX 444 ; N J ; B 36 -18 543 750 ;
+C 75 ; WX 556 ; N K ; B 68 0 697 750 ;
+C 76 ; WX 500 ; N L ; B 68 0 491 750 ;
+C 77 ; WX 778 ; N M ; B 67 0 871 750 ;
+C 78 ; WX 611 ; N N ; B 68 0 702 750 ;
+C 79 ; WX 611 ; N O ; B 105 -18 664 768 ;
+C 80 ; WX 556 ; N P ; B 68 0 651 750 ;
+C 81 ; WX 611 ; N Q ; B 105 -71 664 768 ;
+C 82 ; WX 611 ; N R ; B 66 0 671 750 ;
+C 83 ; WX 556 ; N S ; B 85 -18 613 768 ;
+C 84 ; WX 500 ; N T ; B 153 0 643 750 ;
+C 85 ; WX 611 ; N U ; B 105 -18 703 750 ;
+C 86 ; WX 556 ; N V ; B 180 0 695 750 ;
+C 87 ; WX 833 ; N W ; B 167 0 969 750 ;
+C 88 ; WX 556 ; N X ; B 11 0 698 750 ;
+C 89 ; WX 556 ; N Y ; B 171 0 704 750 ;
+C 90 ; WX 500 ; N Z ; B 33 0 618 750 ;
+C 91 ; WX 333 ; N bracketleft ; B 61 -94 439 750 ;
+C 92 ; WX 250 ; N backslash ; B 70 0 340 750 ;
+C 93 ; WX 333 ; N bracketright ; B 33 -94 411 750 ;
+C 94 ; WX 500 ; N asciicircum ; B 89 326 569 750 ;
+C 95 ; WX 500 ; N underscore ; B -25 -119 487 -61 ;
+C 96 ; WX 278 ; N quoteleft ; B 181 495 360 766 ;
+C 97 ; WX 500 ; N a ; B 68 -15 525 579 ;
+C 98 ; WX 500 ; N b ; B 64 -15 534 750 ;
+C 99 ; WX 444 ; N c ; B 78 -15 494 579 ;
+C 100 ; WX 500 ; N d ; B 83 -15 592 750 ;
+C 101 ; WX 500 ; N e ; B 87 -15 529 579 ;
+C 102 ; WX 278 ; N f ; B 71 0 416 750 ; L i fi ; L l fl ;
+C 103 ; WX 500 ; N g ; B 44 -190 553 579 ;
+C 104 ; WX 500 ; N h ; B 61 0 539 750 ;
+C 105 ; WX 278 ; N i ; B 74 0 363 750 ;
+C 106 ; WX 278 ; N j ; B -9 -192 368 750 ;
+C 107 ; WX 444 ; N k ; B 48 0 563 750 ;
+C 108 ; WX 278 ; N l ; B 74 0 363 750 ;
+C 109 ; WX 778 ; N m ; B 66 0 812 579 ;
+C 110 ; WX 500 ; N n ; B 61 0 539 579 ;
+C 111 ; WX 500 ; N o ; B 88 -15 531 579 ;
+C 112 ; WX 500 ; N p ; B 18 -189 528 579 ;
+C 113 ; WX 500 ; N q ; B 80 -188 550 579 ;
+C 114 ; WX 333 ; N r ; B 60 0 441 574 ;
+C 115 ; WX 444 ; N s ; B 55 -15 497 579 ;
+C 116 ; WX 278 ; N t ; B 83 -7 372 719 ;
+C 117 ; WX 500 ; N u ; B 78 -15 551 564 ;
+C 118 ; WX 444 ; N v ; B 130 0 554 564 ;
+C 119 ; WX 667 ; N w ; B 127 0 765 564 ;
+C 120 ; WX 444 ; N x ; B 8 0 553 564 ;
+C 121 ; WX 444 ; N y ; B 36 -195 549 564 ;
+C 122 ; WX 389 ; N z ; B 23 0 487 564 ;
+C 123 ; WX 274 ; N braceleft ; B 37 -92 399 750 ;
+C 124 ; WX 250 ; N bar ; B 75 0 334 750 ;
+C 125 ; WX 274 ; N braceright ; B 14 -94 375 750 ;
+C 126 ; WX 500 ; N asciitilde ; B 74 153 536 359 ;
+C 161 ; WX 333 ; N exclamdown ; B 66 -170 355 579 ;
+C 162 ; WX 500 ; N cent ; B 103 -122 521 671 ;
+C 163 ; WX 500 ; N sterling ; B 52 -15 603 768 ;
+C 164 ; WX 167 ; N fraction ; B -169 0 488 738 ;
+C 165 ; WX 500 ; N yen ; B 89 0 677 750 ;
+C 166 ; WX 500 ; N florin ; B -28 -185 651 763 ;
+C 167 ; WX 500 ; N section ; B 48 -183 572 768 ;
+C 168 ; WX 500 ; N currency ; B 38 58 594 560 ;
+C 169 ; WX 250 ; N quotesingle ; B 165 468 342 739 ;
+C 170 ; WX 500 ; N quotedblleft ; B 192 495 568 766 ;
+C 171 ; WX 500 ; N guillemotleft ; B 117 62 514 447 ;
+C 172 ; WX 278 ; N guilsinglleft ; B 101 62 310 447 ;
+C 173 ; WX 278 ; N guilsinglright ; B 76 62 285 447 ;
+C 174 ; WX 500 ; N fi ; B 60 0 605 750 ;
+C 175 ; WX 500 ; N fl ; B 60 0 602 750 ;
+C 177 ; WX 500 ; N endash ; B 55 259 578 369 ;
+C 178 ; WX 500 ; N dagger ; B 127 -155 577 768 ;
+C 179 ; WX 500 ; N daggerdbl ; B 51 -161 579 768 ;
+C 180 ; WX 333 ; N periodcentered ; B 140 183 300 315 ;
+C 182 ; WX 550 ; N paragraph ; B 139 -116 685 750 ;
+C 183 ; WX 420 ; N bullet ; B 97 186 482 562 ;
+C 184 ; WX 278 ; N quotesinglbase ; B 58 -138 235 132 ;
+C 185 ; WX 500 ; N quotedblbase ; B 67 -138 441 132 ;
+C 186 ; WX 500 ; N quotedblright ; B 197 479 572 750 ;
+C 187 ; WX 500 ; N guillemotright ; B 94 62 491 447 ;
+C 188 ; WX 1000 ; N ellipsis ; B 101 0 927 132 ;
+C 189 ; WX 1111 ; N perthousand ; B 128 -18 1141 748 ;
+C 191 ; WX 500 ; N questiondown ; B 54 -190 476 579 ;
+C 193 ; WX 333 ; N grave ; B 166 629 384 775 ;
+C 194 ; WX 333 ; N acute ; B 217 629 497 775 ;
+C 195 ; WX 333 ; N circumflex ; B 127 644 480 790 ;
+C 196 ; WX 333 ; N tilde ; B 119 636 512 764 ;
+C 197 ; WX 333 ; N macron ; B 136 666 497 740 ;
+C 198 ; WX 333 ; N breve ; B 161 635 501 780 ;
+C 199 ; WX 333 ; N dotaccent ; B 240 644 391 759 ;
+C 200 ; WX 333 ; N dieresis ; B 142 644 489 759 ;
+C 202 ; WX 333 ; N ring ; B 215 632 432 845 ;
+C 203 ; WX 333 ; N cedilla ; B -4 -228 248 0 ;
+C 205 ; WX 333 ; N hungarumlaut ; B 118 634 613 780 ;
+C 206 ; WX 333 ; N ogonek ; B 63 -205 256 0 ;
+C 207 ; WX 333 ; N caron ; B 156 634 509 780 ;
+C 208 ; WX 1000 ; N emdash ; B 55 259 1078 369 ;
+C 225 ; WX 778 ; N AE ; B -22 0 909 750 ;
+C 227 ; WX 300 ; N ordfeminine ; B 82 291 421 768 ;
+C 232 ; WX 500 ; N Lslash ; B 49 0 497 750 ;
+C 233 ; WX 611 ; N Oslash ; B 34 -38 736 779 ;
+C 234 ; WX 833 ; N OE ; B 110 -18 950 768 ;
+C 235 ; WX 300 ; N ordmasculine ; B 84 291 417 768 ;
+C 241 ; WX 722 ; N ae ; B 69 -15 762 579 ;
+C 245 ; WX 278 ; N dotlessi ; B 74 0 324 564 ;
+C 248 ; WX 278 ; N lslash ; B 68 0 391 750 ;
+C 249 ; WX 500 ; N oslash ; B 2 -58 616 617 ;
+C 250 ; WX 722 ; N oe ; B 81 -15 763 579 ;
+C 251 ; WX 500 ; N germandbls ; B 60 -15 561 768 ;
+C -1 ; WX 556 ; N Aacute ; B 9 0 649 961 ;
+C -1 ; WX 556 ; N Acircumflex ; B 9 0 617 956 ;
+C -1 ; WX 556 ; N Adieresis ; B 9 0 641 945 ;
+C -1 ; WX 556 ; N Agrave ; B 9 0 547 961 ;
+C -1 ; WX 556 ; N Aring ; B 9 0 571 971 ;
+C -1 ; WX 556 ; N Atilde ; B 9 0 659 930 ;
+C -1 ; WX 556 ; N Ccedilla ; B 99 -228 630 768 ;
+C -1 ; WX 500 ; N Eacute ; B 64 0 621 961 ;
+C -1 ; WX 500 ; N Ecircumflex ; B 64 0 617 956 ;
+C -1 ; WX 500 ; N Edieresis ; B 64 0 617 945 ;
+C -1 ; WX 500 ; N Egrave ; B 64 0 617 961 ;
+C -1 ; WX 611 ; N Eth ; B 64 0 662 750 ;
+C -1 ; WX 278 ; N Iacute ; B 69 0 510 961 ;
+C -1 ; WX 278 ; N Icircumflex ; B 69 0 488 956 ;
+C -1 ; WX 278 ; N Idieresis ; B 69 0 502 945 ;
+C -1 ; WX 278 ; N Igrave ; B 69 0 397 961 ;
+C -1 ; WX 611 ; N Ntilde ; B 68 0 702 930 ;
+C -1 ; WX 611 ; N Oacute ; B 105 -18 676 961 ;
+C -1 ; WX 611 ; N Ocircumflex ; B 105 -18 664 956 ;
+C -1 ; WX 611 ; N Odieresis ; B 105 -18 668 945 ;
+C -1 ; WX 611 ; N Ograve ; B 105 -18 664 961 ;
+C -1 ; WX 611 ; N Otilde ; B 105 -18 686 930 ;
+C -1 ; WX 556 ; N Scaron ; B 85 -18 656 946 ;
+C -1 ; WX 556 ; N Thorn ; B 68 0 618 750 ;
+C -1 ; WX 611 ; N Uacute ; B 105 -18 703 961 ;
+C -1 ; WX 611 ; N Ucircumflex ; B 105 -18 703 956 ;
+C -1 ; WX 611 ; N Udieresis ; B 105 -18 703 945 ;
+C -1 ; WX 611 ; N Ugrave ; B 105 -18 703 961 ;
+C -1 ; WX 556 ; N Yacute ; B 171 0 704 961 ;
+C -1 ; WX 556 ; N Ydieresis ; B 171 0 704 945 ;
+C -1 ; WX 500 ; N Zcaron ; B 33 0 628 946 ;
+C -1 ; WX 500 ; N aacute ; B 68 -15 581 775 ;
+C -1 ; WX 500 ; N acircumflex ; B 68 -15 560 770 ;
+C -1 ; WX 500 ; N adieresis ; B 68 -15 573 759 ;
+C -1 ; WX 500 ; N agrave ; B 68 -15 525 775 ;
+C -1 ; WX 500 ; N aring ; B 68 -15 525 845 ;
+C -1 ; WX 500 ; N atilde ; B 68 -15 592 744 ;
+C -1 ; WX 250 ; N brokenbar ; B 75 0 334 750 ;
+C -1 ; WX 444 ; N ccedilla ; B 52 -228 494 579 ;
+C -1 ; WX 830 ; N copyright ; B 93 -18 897 768 ;
+C -1 ; WX 400 ; N degree ; B 174 450 481 750 ;
+C -1 ; WX 500 ; N divide ; B 67 6 540 492 ;
+C -1 ; WX 500 ; N eacute ; B 87 -15 581 775 ;
+C -1 ; WX 500 ; N ecircumflex ; B 87 -15 560 770 ;
+C -1 ; WX 500 ; N edieresis ; B 87 -15 573 759 ;
+C -1 ; WX 500 ; N egrave ; B 87 -15 529 775 ;
+C -1 ; WX 500 ; N eth ; B 81 -15 538 777 ;
+C -1 ; WX 278 ; N iacute ; B 74 0 470 775 ;
+C -1 ; WX 278 ; N icircumflex ; B 74 0 439 770 ;
+C -1 ; WX 278 ; N idieresis ; B 74 0 462 759 ;
+C -1 ; WX 278 ; N igrave ; B 74 0 357 775 ;
+C -1 ; WX 500 ; N logicalnot ; B 88 105 560 401 ;
+C -1 ; WX 500 ; N minus ; B 67 194 540 304 ;
+C -1 ; WX 500 ; N mu ; B 18 -189 551 564 ;
+C -1 ; WX 500 ; N multiply ; B 48 22 560 476 ;
+C -1 ; WX 500 ; N ntilde ; B 61 0 592 744 ;
+C -1 ; WX 500 ; N oacute ; B 88 -15 581 775 ;
+C -1 ; WX 500 ; N ocircumflex ; B 88 -15 560 770 ;
+C -1 ; WX 500 ; N odieresis ; B 88 -15 573 759 ;
+C -1 ; WX 500 ; N ograve ; B 88 -15 531 775 ;
+C -1 ; WX 750 ; N onehalf ; B 108 0 813 750 ;
+C -1 ; WX 750 ; N onequarter ; B 131 0 788 750 ;
+C -1 ; WX 300 ; N onesuperior ; B 180 300 410 750 ;
+C -1 ; WX 500 ; N otilde ; B 88 -15 592 744 ;
+C -1 ; WX 500 ; N plusminus ; B 23 -15 556 513 ;
+C -1 ; WX 830 ; N registered ; B 93 -18 897 768 ;
+C -1 ; WX 444 ; N scaron ; B 55 -15 551 760 ;
+C -1 ; WX 500 ; N thorn ; B 18 -189 528 750 ;
+C -1 ; WX 750 ; N threequarters ; B 96 0 816 750 ;
+C -1 ; WX 300 ; N threesuperior ; B 96 290 416 750 ;
+C -1 ; WX 860 ; N trademark ; B 144 346 933 750 ;
+C -1 ; WX 300 ; N twosuperior ; B 77 300 425 752 ;
+C -1 ; WX 500 ; N uacute ; B 78 -15 581 775 ;
+C -1 ; WX 500 ; N ucircumflex ; B 78 -15 562 780 ;
+C -1 ; WX 500 ; N udieresis ; B 78 -15 573 759 ;
+C -1 ; WX 500 ; N ugrave ; B 78 -15 551 775 ;
+C -1 ; WX 444 ; N yacute ; B 36 -195 553 775 ;
+C -1 ; WX 444 ; N ydieresis ; B 36 -195 549 759 ;
+C -1 ; WX 389 ; N zcaron ; B 23 0 533 760 ;
+EndCharMetrics
+StartKernData
+StartKernPairs 115
+
+KPX A y -18
+KPX A w -18
+KPX A v -18
+KPX A quoteright -55
+KPX A Y -55
+KPX A W -37
+KPX A V -37
+KPX A T -55
+
+KPX F period -111
+KPX F comma -111
+KPX F A -37
+
+KPX L y -37
+KPX L quoteright -92
+KPX L Y -92
+KPX L W -74
+KPX L V -74
+KPX L T -74
+
+KPX P period -129
+KPX P comma -129
+KPX P A -37
+
+KPX R y 0
+KPX R Y -18
+KPX R W 0
+KPX R V 0
+KPX R T -18
+
+KPX T y -55
+KPX T w -74
+KPX T u -74
+KPX T semicolon -74
+KPX T s -74
+KPX T r -74
+KPX T period -92
+KPX T o -74
+KPX T i -18
+KPX T hyphen -55
+KPX T e -74
+KPX T comma -92
+KPX T colon -74
+KPX T c -74
+KPX T a -74
+KPX T A -55
+
+KPX V y 0
+KPX V u -18
+KPX V semicolon -18
+KPX V r -18
+KPX V period -92
+KPX V o -18
+KPX V i 0
+KPX V hyphen -18
+KPX V e -18
+KPX V comma -92
+KPX V colon -18
+KPX V a -18
+KPX V A -37
+
+KPX W y 0
+KPX W u 0
+KPX W semicolon 0
+KPX W r 0
+KPX W period -74
+KPX W o -18
+KPX W i 0
+KPX W hyphen -18
+KPX W e -18
+KPX W comma -74
+KPX W colon 0
+KPX W a -18
+KPX W A -18
+
+KPX Y v -18
+KPX Y u -37
+KPX Y semicolon -37
+KPX Y q -55
+KPX Y period -111
+KPX Y p -37
+KPX Y o -55
+KPX Y i -18
+KPX Y hyphen -74
+KPX Y e -55
+KPX Y comma -111
+KPX Y colon -37
+KPX Y a -55
+KPX Y A -55
+
+KPX f quoteright 18
+KPX f f 0
+
+KPX quoteleft quoteleft -18
+
+KPX quoteright t 0
+KPX quoteright s -55
+KPX quoteright quoteright -18
+
+KPX r z 20
+KPX r y 18
+KPX r x 20
+KPX r w 18
+KPX r v 18
+KPX r u 0
+KPX r t 0
+KPX r r 0
+KPX r quoteright 0
+KPX r q 0
+KPX r period -74
+KPX r o 0
+KPX r n 0
+KPX r m 0
+KPX r hyphen -37
+KPX r h 0
+KPX r g 0
+KPX r f 0
+KPX r e 0
+KPX r d 0
+KPX r comma -74
+KPX r c 0
+
+KPX v period -55
+KPX v comma -55
+
+KPX w period -37
+KPX w comma -37
+
+KPX y period -55
+KPX y comma -55
+EndKernPairs
+EndKernData
+StartComposites 58
+CC Zcaron 2 ; PCC Z 0 0 ; PCC caron 83 190 ;
+CC zcaron 2 ; PCC z 0 0 ; PCC caron 28 0 ;
+CC Scaron 2 ; PCC S 0 0 ; PCC caron 111 190 ;
+CC scaron 2 ; PCC s 0 0 ; PCC caron 55 0 ;
+CC Ccedilla 2 ; PCC C 0 0 ; PCC cedilla 124 0 ;
+CC ccedilla 2 ; PCC c 0 0 ; PCC cedilla 61 0 ;
+CC Yacute 2 ; PCC Y 0 0 ; PCC acute 111 186 ;
+CC yacute 2 ; PCC y 0 0 ; PCC acute 55 0 ;
+CC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 111 190 ;
+CC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 55 0 ;
+CC Uacute 2 ; PCC U 0 0 ; PCC acute 142 190 ;
+CC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 142 190 ;
+CC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 142 190 ;
+CC Ugrave 2 ; PCC U 0 0 ; PCC grave 142 190 ;
+CC uacute 2 ; PCC u 0 0 ; PCC acute 83 0 ;
+CC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 83 0 ;
+CC udieresis 2 ; PCC u 0 0 ; PCC dieresis 83 0 ;
+CC ugrave 2 ; PCC u 0 0 ; PCC grave 83 0 ;
+CC Iacute 2 ; PCC I 0 0 ; PCC acute -27 190 ;
+CC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex -27 190 ;
+CC Idieresis 2 ; PCC I 0 0 ; PCC dieresis -27 190 ;
+CC Igrave 2 ; PCC I 0 0 ; PCC grave -27 190 ;
+CC iacute 2 ; PCC dotlessi 0 0 ; PCC acute -27 0 ;
+CC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -27 0 ;
+CC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -27 0 ;
+CC igrave 2 ; PCC dotlessi 0 0 ; PCC grave -27 0 ;
+CC Eacute 2 ; PCC E 0 0 ; PCC acute 104 190 ;
+CC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 104 190 ;
+CC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 104 190 ;
+CC Egrave 2 ; PCC E 0 0 ; PCC grave 104 190 ;
+CC eacute 2 ; PCC e 0 0 ; PCC acute 83 0 ;
+CC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 83 0 ;
+CC edieresis 2 ; PCC e 0 0 ; PCC dieresis 83 0 ;
+CC egrave 2 ; PCC e 0 0 ; PCC grave 83 0 ;
+CC Aacute 2 ; PCC A 0 0 ; PCC acute 114 190 ;
+CC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 114 190 ;
+CC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 114 190 ;
+CC Agrave 2 ; PCC A 0 0 ; PCC grave 114 190 ;
+CC aacute 2 ; PCC a 0 0 ; PCC acute 83 0 ;
+CC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 83 0 ;
+CC adieresis 2 ; PCC a 0 0 ; PCC dieresis 83 0 ;
+CC agrave 2 ; PCC a 0 0 ; PCC grave 83 0 ;
+CC Oacute 2 ; PCC O 0 0 ; PCC acute 139 190 ;
+CC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 139 190 ;
+CC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 139 190 ;
+CC Ograve 2 ; PCC O 0 0 ; PCC grave 139 190 ;
+CC oacute 2 ; PCC o 0 0 ; PCC acute 83 0 ;
+CC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 83 0 ;
+CC odieresis 2 ; PCC o 0 0 ; PCC dieresis 83 0 ;
+CC ograve 2 ; PCC o 0 0 ; PCC grave 83 0 ;
+CC Atilde 2 ; PCC A 0 0 ; PCC tilde 114 190 ;
+CC atilde 2 ; PCC a 0 0 ; PCC tilde 83 0 ;
+CC Ntilde 2 ; PCC N 0 0 ; PCC tilde 145 190 ;
+CC ntilde 2 ; PCC n 0 0 ; PCC tilde 90 0 ;
+CC Otilde 2 ; PCC O 0 0 ; PCC tilde 139 190 ;
+CC otilde 2 ; PCC o 0 0 ; PCC tilde 83 0 ;
+CC Aring 2 ; PCC A 0 0 ; PCC ring 114 190 ;
+CC aring 2 ; PCC a 0 0 ; PCC ring 83 0 ;
+EndComposites
+EndFontMetrics
+
diff --git a/src/fonts/pshcdo.afm b/src/fonts/pshcdo.afm
new file mode 100644
index 0000000..c393586
--- /dev/null
+++ b/src/fonts/pshcdo.afm
@@ -0,0 +1,446 @@
+StartFontMetrics 2.0
+Comment Copyright (c) 1984 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date:Mon Mar 30 17:13:40 PST 1987
+FontName Helvetica-Condensed-Oblique
+EncodingScheme AdobeStandardEncoding
+FullName Helvetica.Condensed Oblique
+FamilyName Helvetica
+Weight MediumCondensed
+ItalicAngle -12.0
+IsFixedPitch false
+UnderlinePosition -90
+UnderlineThickness 58
+Version 001.001
+Notice Helvetica is a trademark of Allied Corporation.
+FontBBox -174 -224 1118 990
+CapHeight 750
+XHeight 556
+Descender -188
+Ascender 750
+StartCharMetrics 228
+C 32 ; WX 250 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 333 ; N exclam ; B 121 0 371 750 ;
+C 34 ; WX 250 ; N quotedbl ; B 153 513 364 739 ;
+C 35 ; WX 500 ; N numbersign ; B 33 0 621 750 ;
+C 36 ; WX 500 ; N dollar ; B 69 -116 569 815 ;
+C 37 ; WX 833 ; N percent ; B 164 -15 803 750 ;
+C 38 ; WX 667 ; N ampersand ; B 111 -18 648 750 ;
+C 39 ; WX 222 ; N quoteright ; B 171 504 317 750 ;
+C 40 ; WX 333 ; N parenleft ; B 116 -215 443 750 ;
+C 41 ; WX 333 ; N parenright ; B 3 -215 331 750 ;
+C 42 ; WX 500 ; N asterisk ; B 229 455 537 750 ;
+C 43 ; WX 500 ; N plus ; B 91 0 518 505 ;
+C 44 ; WX 250 ; N comma ; B 49 -146 192 100 ;
+C 45 ; WX 333 ; N hyphen ; B 103 275 364 358 ;
+C 46 ; WX 250 ; N period ; B 80 0 192 100 ;
+C 47 ; WX 278 ; N slash ; B -19 -27 450 750 ;
+C 48 ; WX 500 ; N zero ; B 98 -15 563 750 ;
+C 49 ; WX 500 ; N one ; B 190 0 476 750 ;
+C 50 ; WX 500 ; N two ; B 44 0 562 750 ;
+C 51 ; WX 500 ; N three ; B 73 -15 552 750 ;
+C 52 ; WX 500 ; N four ; B 68 0 543 750 ;
+C 53 ; WX 500 ; N five ; B 75 -15 575 735 ;
+C 54 ; WX 500 ; N six ; B 91 -15 566 750 ;
+C 55 ; WX 500 ; N seven ; B 116 0 612 735 ;
+C 56 ; WX 500 ; N eight ; B 83 -15 559 750 ;
+C 57 ; WX 500 ; N nine ; B 91 -15 566 750 ;
+C 58 ; WX 250 ; N colon ; B 80 0 287 547 ;
+C 59 ; WX 250 ; N semicolon ; B 49 -146 287 547 ;
+C 60 ; WX 500 ; N less ; B 89 -10 569 518 ;
+C 61 ; WX 500 ; N equal ; B 70 124 539 384 ;
+C 62 ; WX 500 ; N greater ; B 40 -10 520 518 ;
+C 63 ; WX 500 ; N question ; B 169 0 586 750 ;
+C 64 ; WX 800 ; N at ; B 106 -15 863 750 ;
+C 65 ; WX 556 ; N A ; B 11 0 546 750 ;
+C 66 ; WX 556 ; N B ; B 80 0 610 750 ;
+C 67 ; WX 556 ; N C ; B 106 -18 624 765 ;
+C 68 ; WX 611 ; N D ; B 82 0 653 750 ;
+C 69 ; WX 500 ; N E ; B 74 0 608 750 ;
+C 70 ; WX 444 ; N F ; B 74 0 585 750 ;
+C 71 ; WX 611 ; N G ; B 109 -18 646 765 ;
+C 72 ; WX 611 ; N H ; B 79 0 691 750 ;
+C 73 ; WX 278 ; N I ; B 98 0 340 750 ;
+C 74 ; WX 444 ; N J ; B 52 -15 527 750 ;
+C 75 ; WX 556 ; N K ; B 79 0 698 750 ;
+C 76 ; WX 500 ; N L ; B 83 0 488 750 ;
+C 77 ; WX 778 ; N M ; B 76 0 861 750 ;
+C 78 ; WX 611 ; N N ; B 77 0 693 750 ;
+C 79 ; WX 611 ; N O ; B 116 -18 658 765 ;
+C 80 ; WX 556 ; N P ; B 86 0 641 750 ;
+C 81 ; WX 611 ; N Q ; B 116 -34 659 765 ;
+C 82 ; WX 611 ; N R ; B 86 0 655 750 ;
+C 83 ; WX 556 ; N S ; B 86 -18 611 765 ;
+C 84 ; WX 500 ; N T ; B 158 0 645 750 ;
+C 85 ; WX 611 ; N U ; B 114 -18 690 750 ;
+C 86 ; WX 556 ; N V ; B 170 0 704 750 ;
+C 87 ; WX 833 ; N W ; B 176 0 975 750 ;
+C 88 ; WX 556 ; N X ; B 17 0 692 750 ;
+C 89 ; WX 556 ; N Y ; B 170 0 705 750 ;
+C 90 ; WX 500 ; N Z ; B 28 0 627 750 ;
+C 91 ; WX 333 ; N bracketleft ; B 56 -209 434 750 ;
+C 92 ; WX 250 ; N backslash ; B 128 0 281 750 ;
+C 93 ; WX 333 ; N bracketright ; B 14 -209 392 750 ;
+C 94 ; WX 500 ; N asciicircum ; B 141 333 502 750 ;
+C 95 ; WX 500 ; N underscore ; B -25 -119 487 -61 ;
+C 96 ; WX 222 ; N quoteleft ; B 175 521 321 767 ;
+C 97 ; WX 444 ; N a ; B 55 -15 465 571 ;
+C 98 ; WX 500 ; N b ; B 75 -15 525 750 ;
+C 99 ; WX 444 ; N c ; B 85 -15 488 571 ;
+C 100 ; WX 500 ; N d ; B 88 -15 583 750 ;
+C 101 ; WX 444 ; N e ; B 86 -15 476 571 ;
+C 102 ; WX 278 ; N f ; B 93 0 418 752 ; L i fi ; L l fl ;
+C 103 ; WX 500 ; N g ; B 53 -189 544 571 ;
+C 104 ; WX 500 ; N h ; B 73 0 524 750 ;
+C 105 ; WX 222 ; N i ; B 72 0 310 750 ;
+C 106 ; WX 222 ; N j ; B -27 -190 313 750 ;
+C 107 ; WX 444 ; N k ; B 69 0 552 750 ;
+C 108 ; WX 222 ; N l ; B 72 0 310 750 ;
+C 109 ; WX 778 ; N m ; B 76 0 799 571 ;
+C 110 ; WX 500 ; N n ; B 73 0 524 571 ;
+C 111 ; WX 500 ; N o ; B 96 -15 524 571 ;
+C 112 ; WX 500 ; N p ; B 32 -188 524 571 ;
+C 113 ; WX 500 ; N q ; B 100 -184 544 571 ;
+C 114 ; WX 333 ; N r ; B 81 0 441 563 ;
+C 115 ; WX 444 ; N s ; B 68 -15 473 571 ;
+C 116 ; WX 278 ; N t ; B 101 0 375 707 ;
+C 117 ; WX 500 ; N u ; B 99 -15 542 556 ;
+C 118 ; WX 444 ; N v ; B 131 0 549 556 ;
+C 119 ; WX 667 ; N w ; B 137 0 767 556 ;
+C 120 ; WX 444 ; N x ; B 9 0 548 556 ;
+C 121 ; WX 444 ; N y ; B -13 -190 543 556 ;
+C 122 ; WX 389 ; N z ; B 24 0 482 556 ;
+C 123 ; WX 274 ; N braceleft ; B 77 -95 425 750 ;
+C 124 ; WX 250 ; N bar ; B 93 0 316 750 ;
+C 125 ; WX 274 ; N braceright ; B -12 -95 337 750 ;
+C 126 ; WX 500 ; N asciitilde ; B 89 166 520 345 ;
+C 161 ; WX 333 ; N exclamdown ; B 83 -179 333 571 ;
+C 162 ; WX 500 ; N cent ; B 94 -137 499 667 ;
+C 163 ; WX 500 ; N sterling ; B 40 -15 589 750 ;
+C 164 ; WX 167 ; N fraction ; B -174 0 500 750 ;
+C 165 ; WX 500 ; N yen ; B 88 0 677 750 ;
+C 166 ; WX 500 ; N florin ; B -28 -192 645 750 ;
+C 167 ; WX 500 ; N section ; B 51 -208 552 750 ;
+C 168 ; WX 500 ; N currency ; B 51 50 576 553 ;
+C 169 ; WX 250 ; N quotesingle ; B 208 513 308 739 ;
+C 170 ; WX 389 ; N quotedblleft ; B 173 521 490 767 ;
+C 171 ; WX 500 ; N guillemotleft ; B 145 125 520 495 ;
+C 172 ; WX 278 ; N guilsinglleft ; B 124 125 320 495 ;
+C 173 ; WX 278 ; N guilsinglright ; B 90 125 286 495 ;
+C 174 ; WX 500 ; N fi ; B 93 0 584 752 ;
+C 175 ; WX 500 ; N fl ; B 93 0 584 752 ;
+C 177 ; WX 500 ; N endash ; B 58 275 573 345 ;
+C 178 ; WX 500 ; N dagger ; B 137 -176 573 750 ;
+C 179 ; WX 500 ; N daggerdbl ; B 50 -176 572 750 ;
+C 180 ; WX 250 ; N periodcentered ; B 123 204 236 304 ;
+C 182 ; WX 440 ; N paragraph ; B 113 -116 550 750 ;
+C 183 ; WX 333 ; N bullet ; B 91 222 401 529 ;
+C 184 ; WX 222 ; N quotesinglbase ; B 33 -146 179 100 ;
+C 185 ; WX 389 ; N quotedblbase ; B 31 -146 348 100 ;
+C 186 ; WX 389 ; N quotedblright ; B 169 504 486 750 ;
+C 187 ; WX 500 ; N guillemotright ; B 112 125 487 495 ;
+C 188 ; WX 1000 ; N ellipsis ; B 121 0 899 100 ;
+C 189 ; WX 1111 ; N perthousand ; B 157 -16 1118 750 ;
+C 191 ; WX 500 ; N questiondown ; B 33 -190 450 559 ;
+C 193 ; WX 333 ; N grave ; B 198 624 366 765 ;
+C 194 ; WX 333 ; N acute ; B 233 624 461 765 ;
+C 195 ; WX 333 ; N circumflex ; B 154 624 446 765 ;
+C 196 ; WX 333 ; N tilde ; B 132 634 496 750 ;
+C 197 ; WX 333 ; N macron ; B 150 657 475 715 ;
+C 198 ; WX 333 ; N breve ; B 172 629 484 765 ;
+C 199 ; WX 250 ; N dotaccent ; B 224 650 324 750 ;
+C 200 ; WX 333 ; N dieresis ; B 190 650 440 750 ;
+C 202 ; WX 250 ; N ring ; B 168 593 377 796 ;
+C 203 ; WX 333 ; N cedilla ; B 23 -224 255 0 ;
+C 205 ; WX 333 ; N hungarumlaut ; B 194 624 603 765 ;
+C 206 ; WX 333 ; N ogonek ; B -23 -191 188 13 ;
+C 207 ; WX 333 ; N caron ; B 184 624 476 765 ;
+C 208 ; WX 1000 ; N emdash ; B 58 275 1073 345 ;
+C 225 ; WX 833 ; N AE ; B 0 0 944 750 ;
+C 227 ; WX 300 ; N ordfeminine ; B 90 305 392 765 ;
+C 232 ; WX 500 ; N Lslash ; B 39 0 488 750 ;
+C 233 ; WX 611 ; N Oslash ; B 25 -43 738 796 ;
+C 234 ; WX 833 ; N OE ; B 113 -18 946 765 ;
+C 235 ; WX 300 ; N ordmasculine ; B 85 305 413 765 ;
+C 241 ; WX 667 ; N ae ; B 50 -15 711 571 ;
+C 245 ; WX 222 ; N dotlessi ; B 72 0 269 556 ;
+C 248 ; WX 222 ; N lslash ; B 59 0 347 750 ;
+C 249 ; WX 500 ; N oslash ; B 19 -46 591 582 ;
+C 250 ; WX 722 ; N oe ; B 81 -15 758 571 ;
+C 251 ; WX 500 ; N germandbls ; B 71 -5 548 765 ;
+C -1 ; WX 556 ; N Aacute ; B 11 0 614 959 ;
+C -1 ; WX 556 ; N Acircumflex ; B 11 0 599 959 ;
+C -1 ; WX 556 ; N Adieresis ; B 11 0 593 944 ;
+C -1 ; WX 556 ; N Agrave ; B 11 0 546 959 ;
+C -1 ; WX 556 ; N Aring ; B 11 0 571 990 ;
+C -1 ; WX 556 ; N Atilde ; B 11 0 649 944 ;
+C -1 ; WX 556 ; N Ccedilla ; B 106 -224 624 765 ;
+C -1 ; WX 500 ; N Eacute ; B 74 0 608 959 ;
+C -1 ; WX 500 ; N Ecircumflex ; B 74 0 608 959 ;
+C -1 ; WX 500 ; N Edieresis ; B 74 0 608 944 ;
+C -1 ; WX 500 ; N Egrave ; B 74 0 608 959 ;
+C -1 ; WX 611 ; N Eth ; B 67 0 653 750 ;
+C -1 ; WX 278 ; N Iacute ; B 98 0 475 959 ;
+C -1 ; WX 278 ; N Icircumflex ; B 98 0 460 959 ;
+C -1 ; WX 278 ; N Idieresis ; B 98 0 454 944 ;
+C -1 ; WX 278 ; N Igrave ; B 98 0 380 959 ;
+C -1 ; WX 611 ; N Ntilde ; B 77 0 693 944 ;
+C -1 ; WX 611 ; N Oacute ; B 116 -18 658 959 ;
+C -1 ; WX 611 ; N Ocircumflex ; B 116 -18 658 959 ;
+C -1 ; WX 611 ; N Odieresis ; B 116 -18 658 944 ;
+C -1 ; WX 611 ; N Ograve ; B 116 -18 658 959 ;
+C -1 ; WX 611 ; N Otilde ; B 116 -18 676 944 ;
+C -1 ; WX 556 ; N Scaron ; B 86 -18 629 959 ;
+C -1 ; WX 556 ; N Thorn ; B 86 0 607 750 ;
+C -1 ; WX 611 ; N Uacute ; B 114 -18 690 959 ;
+C -1 ; WX 611 ; N Ucircumflex ; B 114 -18 690 959 ;
+C -1 ; WX 611 ; N Udieresis ; B 114 -18 690 944 ;
+C -1 ; WX 611 ; N Ugrave ; B 114 -18 690 959 ;
+C -1 ; WX 556 ; N Yacute ; B 170 0 705 959 ;
+C -1 ; WX 556 ; N Ydieresis ; B 170 0 705 944 ;
+C -1 ; WX 500 ; N Zcaron ; B 28 0 627 959 ;
+C -1 ; WX 444 ; N aacute ; B 55 -15 517 765 ;
+C -1 ; WX 444 ; N acircumflex ; B 55 -15 502 765 ;
+C -1 ; WX 444 ; N adieresis ; B 55 -15 496 750 ;
+C -1 ; WX 444 ; N agrave ; B 55 -15 465 765 ;
+C -1 ; WX 444 ; N aring ; B 55 -15 474 796 ;
+C -1 ; WX 444 ; N atilde ; B 55 -15 552 750 ;
+C -1 ; WX 250 ; N brokenbar ; B 93 0 316 750 ;
+C -1 ; WX 444 ; N ccedilla ; B 79 -224 488 571 ;
+C -1 ; WX 800 ; N copyright ; B 79 -18 880 765 ;
+C -1 ; WX 400 ; N degree ; B 174 450 481 750 ;
+C -1 ; WX 500 ; N divide ; B 91 3 518 505 ;
+C -1 ; WX 444 ; N eacute ; B 86 -15 517 765 ;
+C -1 ; WX 444 ; N ecircumflex ; B 86 -15 502 765 ;
+C -1 ; WX 444 ; N edieresis ; B 86 -15 496 750 ;
+C -1 ; WX 444 ; N egrave ; B 86 -15 476 765 ;
+C -1 ; WX 500 ; N eth ; B 87 -15 548 770 ;
+C -1 ; WX 222 ; N iacute ; B 72 0 406 765 ;
+C -1 ; WX 222 ; N icircumflex ; B 72 0 391 765 ;
+C -1 ; WX 222 ; N idieresis ; B 72 0 385 750 ;
+C -1 ; WX 222 ; N igrave ; B 72 0 311 765 ;
+C -1 ; WX 500 ; N logicalnot ; B 111 117 539 384 ;
+C -1 ; WX 500 ; N minus ; B 91 219 518 289 ;
+C -1 ; WX 500 ; N mu ; B 35 -189 540 556 ;
+C -1 ; WX 500 ; N multiply ; B 65 48 544 461 ;
+C -1 ; WX 500 ; N ntilde ; B 73 0 580 750 ;
+C -1 ; WX 500 ; N oacute ; B 96 -15 545 765 ;
+C -1 ; WX 500 ; N ocircumflex ; B 96 -15 530 765 ;
+C -1 ; WX 500 ; N odieresis ; B 96 -15 524 750 ;
+C -1 ; WX 500 ; N ograve ; B 96 -15 524 765 ;
+C -1 ; WX 750 ; N onehalf ; B 91 0 777 750 ;
+C -1 ; WX 750 ; N onequarter ; B 143 0 817 750 ;
+C -1 ; WX 300 ; N onesuperior ; B 200 300 392 750 ;
+C -1 ; WX 500 ; N otilde ; B 96 -15 580 750 ;
+C -1 ; WX 500 ; N plusminus ; B 44 0 531 505 ;
+C -1 ; WX 800 ; N registered ; B 79 -18 881 765 ;
+C -1 ; WX 444 ; N scaron ; B 68 -15 532 765 ;
+C -1 ; WX 500 ; N thorn ; B 32 -188 524 750 ;
+C -1 ; WX 750 ; N threequarters ; B 106 0 831 750 ;
+C -1 ; WX 300 ; N threesuperior ; B 102 291 409 750 ;
+C -1 ; WX 750 ; N trademark ; B 147 329 878 750 ;
+C -1 ; WX 300 ; N twosuperior ; B 83 300 413 750 ;
+C -1 ; WX 500 ; N uacute ; B 99 -15 545 765 ;
+C -1 ; WX 500 ; N ucircumflex ; B 99 -15 542 765 ;
+C -1 ; WX 500 ; N udieresis ; B 99 -15 542 750 ;
+C -1 ; WX 500 ; N ugrave ; B 99 -15 542 765 ;
+C -1 ; WX 444 ; N yacute ; B -13 -190 543 765 ;
+C -1 ; WX 444 ; N ydieresis ; B -13 -190 543 750 ;
+C -1 ; WX 389 ; N zcaron ; B 24 0 504 765 ;
+EndCharMetrics
+StartKernData
+StartKernPairs 115
+
+KPX A y -18
+KPX A w -18
+KPX A v -18
+KPX A quoteright -55
+KPX A Y -55
+KPX A W -37
+KPX A V -37
+KPX A T -55
+
+KPX F period -111
+KPX F comma -111
+KPX F A -37
+
+KPX L y -37
+KPX L quoteright -92
+KPX L Y -92
+KPX L W -74
+KPX L V -74
+KPX L T -74
+
+KPX P period -129
+KPX P comma -129
+KPX P A -37
+
+KPX R y 0
+KPX R Y -18
+KPX R W 0
+KPX R V 0
+KPX R T -18
+
+KPX T y -55
+KPX T w -74
+KPX T u -74
+KPX T semicolon -74
+KPX T s -74
+KPX T r -74
+KPX T period -92
+KPX T o -74
+KPX T i -18
+KPX T hyphen -55
+KPX T e -74
+KPX T comma -92
+KPX T colon -74
+KPX T c -74
+KPX T a -74
+KPX T A -55
+
+KPX V y 0
+KPX V u -18
+KPX V semicolon -18
+KPX V r -18
+KPX V period -92
+KPX V o -18
+KPX V i 0
+KPX V hyphen -18
+KPX V e -18
+KPX V comma -92
+KPX V colon -18
+KPX V a -18
+KPX V A -37
+
+KPX W y 0
+KPX W u 0
+KPX W semicolon 0
+KPX W r 0
+KPX W period -74
+KPX W o -18
+KPX W i 0
+KPX W hyphen -18
+KPX W e -18
+KPX W comma -74
+KPX W colon 0
+KPX W a -18
+KPX W A -18
+
+KPX Y v -18
+KPX Y u -37
+KPX Y semicolon -37
+KPX Y q -55
+KPX Y period -111
+KPX Y p -37
+KPX Y o -55
+KPX Y i -18
+KPX Y hyphen -74
+KPX Y e -55
+KPX Y comma -111
+KPX Y colon -37
+KPX Y a -55
+KPX Y A -55
+
+KPX f quoteright 18
+KPX f f 0
+
+KPX quoteleft quoteleft -18
+
+KPX quoteright t 0
+KPX quoteright s -55
+KPX quoteright quoteright -18
+
+KPX r z 20
+KPX r y 18
+KPX r x 20
+KPX r w 18
+KPX r v 18
+KPX r u 0
+KPX r t 0
+KPX r r 0
+KPX r quoteright 0
+KPX r q 0
+KPX r period -74
+KPX r o 0
+KPX r n 0
+KPX r m 0
+KPX r hyphen -37
+KPX r h 0
+KPX r g 0
+KPX r f 20
+KPX r e 0
+KPX r d 0
+KPX r comma -74
+KPX r c -20
+
+KPX v period -55
+KPX v comma -55
+
+KPX w period -37
+KPX w comma -37
+
+KPX y period -55
+KPX y comma -55
+EndKernPairs
+EndKernData
+StartComposites 58
+CC Zcaron 2 ; PCC Z 0 0 ; PCC caron 83 194 ;
+CC zcaron 2 ; PCC z 0 0 ; PCC caron 28 0 ;
+CC Scaron 2 ; PCC S 0 0 ; PCC caron 111 194 ;
+CC scaron 2 ; PCC s 0 0 ; PCC caron 55 0 ;
+CC Ccedilla 2 ; PCC C 0 0 ; PCC cedilla 111 0 ;
+CC ccedilla 2 ; PCC c 0 0 ; PCC cedilla 55 0 ;
+CC Yacute 2 ; PCC Y 0 0 ; PCC acute 111 194 ;
+CC yacute 2 ; PCC y 0 0 ; PCC acute 55 0 ;
+CC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 111 194 ;
+CC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 55 0 ;
+CC Uacute 2 ; PCC U 0 0 ; PCC acute 139 194 ;
+CC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 139 194 ;
+CC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 139 194 ;
+CC Ugrave 2 ; PCC U 0 0 ; PCC grave 139 194 ;
+CC uacute 2 ; PCC u 0 0 ; PCC acute 83 0 ;
+CC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 83 0 ;
+CC udieresis 2 ; PCC u 0 0 ; PCC dieresis 83 0 ;
+CC ugrave 2 ; PCC u 0 0 ; PCC grave 83 0 ;
+CC Iacute 2 ; PCC I 0 0 ; PCC acute -27 194 ;
+CC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex -27 194 ;
+CC Idieresis 2 ; PCC I 0 0 ; PCC dieresis -27 194 ;
+CC Igrave 2 ; PCC I 0 0 ; PCC grave -27 194 ;
+CC iacute 2 ; PCC dotlessi 0 0 ; PCC acute -55 0 ;
+CC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -55 0 ;
+CC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -55 0 ;
+CC igrave 2 ; PCC dotlessi 0 0 ; PCC grave -55 0 ;
+CC Eacute 2 ; PCC E 0 0 ; PCC acute 83 194 ;
+CC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 83 194 ;
+CC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 83 194 ;
+CC Egrave 2 ; PCC E 0 0 ; PCC grave 83 194 ;
+CC eacute 2 ; PCC e 0 0 ; PCC acute 55 0 ;
+CC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 55 0 ;
+CC edieresis 2 ; PCC e 0 0 ; PCC dieresis 55 0 ;
+CC egrave 2 ; PCC e 0 0 ; PCC grave 55 0 ;
+CC Aacute 2 ; PCC A 0 0 ; PCC acute 111 194 ;
+CC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 111 194 ;
+CC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 111 194 ;
+CC Agrave 2 ; PCC A 0 0 ; PCC grave 111 194 ;
+CC aacute 2 ; PCC a 0 0 ; PCC acute 55 0 ;
+CC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 55 0 ;
+CC adieresis 2 ; PCC a 0 0 ; PCC dieresis 55 0 ;
+CC agrave 2 ; PCC a 0 0 ; PCC grave 55 0 ;
+CC Oacute 2 ; PCC O 0 0 ; PCC acute 139 194 ;
+CC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 139 194 ;
+CC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 139 194 ;
+CC Ograve 2 ; PCC O 0 0 ; PCC grave 139 194 ;
+CC oacute 2 ; PCC o 0 0 ; PCC acute 83 0 ;
+CC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 83 0 ;
+CC odieresis 2 ; PCC o 0 0 ; PCC dieresis 83 0 ;
+CC ograve 2 ; PCC o 0 0 ; PCC grave 83 0 ;
+CC Atilde 2 ; PCC A 0 0 ; PCC tilde 111 194 ;
+CC atilde 2 ; PCC a 0 0 ; PCC tilde 55 0 ;
+CC Ntilde 2 ; PCC N 0 0 ; PCC tilde 139 194 ;
+CC ntilde 2 ; PCC n 0 0 ; PCC tilde 83 0 ;
+CC Otilde 2 ; PCC O 0 0 ; PCC tilde 139 194 ;
+CC otilde 2 ; PCC o 0 0 ; PCC tilde 83 0 ;
+CC Aring 2 ; PCC A 0 0 ; PCC ring 153 194 ;
+CC aring 2 ; PCC a 0 0 ; PCC ring 97 0 ;
+EndComposites
+EndFontMetrics
+
diff --git a/src/fonts/texcmb.afm b/src/fonts/texcmb.afm
new file mode 100644
index 0000000..91d3d67
--- /dev/null
+++ b/src/fonts/texcmb.afm
@@ -0,0 +1,332 @@
+StartFontMetrics 2.0
+Comment Made from TEX tfm file using TFMTOAFM.bas
+FontName CMB10
+EncodingScheme TEXENCODING
+FullName CMB10
+FamilyName CMB10
+Weight Medium
+ItalicAngle 0
+IsFixedPitch false
+UnderlinePosition -97
+UnderlineThickness 73
+FontBBox 0 -300 1001 1001
+CapHeight 729
+XHeight 156
+Descender -219
+Ascender 729
+StartCharMetrics 127
+C 1 ; WX 833 ; N C1 ; B 0 0 833 686 ;
+C 2 ; WX 777 ; N C2 ; B 0 0 777 686 ;
+C 3 ; WX 700 ; N C3 ; B 0 0 700 686 ;
+C 4 ; WX 666 ; N C4 ; B 0 0 666 686 ;
+C 5 ; WX 783 ; N C5 ; B 0 0 783 686 ;
+C 6 ; WX 722 ; N C6 ; B 0 0 722 686 ;
+C 7 ; WX 777 ; N C7 ; B 0 0 777 686 ;
+C 8 ; WX 722 ; N C8 ; B 0 0 722 686 ;
+C 9 ; WX 777 ; N C9 ; B 0 0 777 686 ;
+C 10 ; WX 722 ; N C10 ; B 0 0 722 686 ;
+C 11 ; WX 583 ; N C11 ; B 0 0 583 694 ; L i C14 L l C15
+C 12 ; WX 555 ; N C12 ; B 0 0 555 694 ;
+C 13 ; WX 555 ; N C13 ; B 0 0 555 694 ;
+C 14 ; WX 833 ; N C14 ; B 0 0 833 694 ;
+C 15 ; WX 833 ; N C15 ; B 0 0 833 694 ;
+C 16 ; WX 277 ; N C16 ; B 0 0 277 444 ;
+C 17 ; WX 305 ; N C17 ; B 0 -194 305 444 ;
+C 18 ; WX 500 ; N C18 ; B 0 0 500 694 ;
+C 19 ; WX 500 ; N C19 ; B 0 0 500 694 ;
+C 20 ; WX 500 ; N C20 ; B 0 0 500 631 ;
+C 21 ; WX 500 ; N C21 ; B 0 0 500 694 ;
+C 22 ; WX 500 ; N C22 ; B 0 0 500 596 ;
+C 23 ; WX 755 ; N C23 ; B 0 0 755 694 ;
+C 24 ; WX 444 ; N C24 ; B 0 -170 444 0 ;
+C 25 ; WX 559 ; N C25 ; B 0 0 559 694 ;
+C 26 ; WX 722 ; N C26 ; B 0 0 722 444 ;
+C 27 ; WX 777 ; N C27 ; B 0 0 777 444 ;
+C 28 ; WX 500 ; N C28 ; B 0 -97 500 541 ;
+C 29 ; WX 905 ; N C29 ; B 0 0 905 686 ;
+C 30 ; WX 1016 ; N C30 ; B 0 0 1016 686 ;
+C 31 ; WX 777 ; N C31 ; B 0 -48 777 734 ;
+C 32 ; WX 234 ; N C32 ; B 0 0 234 444 ;
+C 33 ; WX 305 ; N C33 ; B 0 0 305 694 ;
+C 34 ; WX 544 ; N C34 ; B 0 0 544 694 ;
+C 35 ; WX 833 ; N C35 ; B 0 -194 833 694 ;
+C 36 ; WX 500 ; N C36 ; B 0 -55 500 750 ;
+C 37 ; WX 833 ; N C37 ; B 0 -55 833 750 ;
+C 38 ; WX 777 ; N C38 ; B 0 0 777 694 ;
+C 39 ; WX 277 ; N C39 ; B 0 0 277 694 ; L C39 C34
+C 40 ; WX 388 ; N C40 ; B 0 -250 388 750 ;
+C 41 ; WX 388 ; N C41 ; B 0 -250 388 750 ;
+C 42 ; WX 500 ; N C42 ; B 0 0 500 750 ;
+C 43 ; WX 777 ; N C43 ; B 0 -83 777 583 ;
+C 44 ; WX 277 ; N C44 ; B 0 -194 277 155 ;
+C 45 ; WX 333 ; N C45 ; B 0 0 333 444 ;
+C 46 ; WX 277 ; N C46 ; B 0 0 277 155 ;
+C 47 ; WX 500 ; N C47 ; B 0 -250 500 750 ;
+C 48 ; WX 500 ; N C48 ; B 0 0 500 644 ;
+C 49 ; WX 500 ; N C49 ; B 0 0 500 644 ;
+C 50 ; WX 500 ; N C50 ; B 0 0 500 644 ;
+C 51 ; WX 500 ; N C51 ; B 0 0 500 644 ;
+C 52 ; WX 500 ; N C52 ; B 0 0 500 644 ;
+C 53 ; WX 500 ; N C53 ; B 0 0 500 644 ;
+C 54 ; WX 500 ; N C54 ; B 0 0 500 644 ;
+C 55 ; WX 500 ; N C55 ; B 0 0 500 644 ;
+C 56 ; WX 500 ; N C56 ; B 0 0 500 644 ;
+C 57 ; WX 500 ; N C57 ; B 0 0 500 644 ;
+C 58 ; WX 277 ; N C58 ; B 0 0 277 444 ;
+C 59 ; WX 277 ; N C59 ; B 0 -194 277 444 ;
+C 60 ; WX 305 ; N C60 ; B 0 -194 305 500 ;
+C 61 ; WX 777 ; N C61 ; B 0 109 777 391 ;
+C 62 ; WX 472 ; N C62 ; B 0 -194 472 500 ;
+C 63 ; WX 472 ; N C63 ; B 0 0 472 694 ;
+C 64 ; WX 777 ; N C64 ; B 0 0 777 694 ;
+C 65 ; WX 755 ; N A ; B 0 0 755 686 ;
+C 66 ; WX 711 ; N B ; B 0 0 711 686 ;
+C 67 ; WX 722 ; N C ; B 0 0 722 686 ;
+C 68 ; WX 766 ; N D ; B 0 0 766 686 ;
+C 69 ; WX 655 ; N E ; B 0 0 655 686 ;
+C 70 ; WX 627 ; N F ; B 0 0 627 686 ;
+C 71 ; WX 786 ; N G ; B 0 0 786 686 ;
+C 72 ; WX 783 ; N H ; B 0 0 783 686 ;
+C 73 ; WX 397 ; N I ; B 0 0 397 686 ;
+C 74 ; WX 516 ; N J ; B 0 0 516 686 ;
+C 75 ; WX 783 ; N K ; B 0 0 783 686 ;
+C 76 ; WX 600 ; N L ; B 0 0 600 686 ;
+C 77 ; WX 950 ; N M ; B 0 0 950 686 ;
+C 78 ; WX 783 ; N N ; B 0 0 783 686 ;
+C 79 ; WX 750 ; N O ; B 0 0 750 686 ;
+C 80 ; WX 683 ; N P ; B 0 0 683 686 ;
+C 81 ; WX 750 ; N Q ; B 0 -194 750 686 ;
+C 82 ; WX 759 ; N R ; B 0 0 759 686 ;
+C 83 ; WX 555 ; N S ; B 0 0 555 686 ;
+C 84 ; WX 694 ; N T ; B 0 0 694 686 ;
+C 85 ; WX 769 ; N U ; B 0 0 769 686 ;
+C 86 ; WX 755 ; N V ; B 0 0 755 686 ;
+C 87 ; WX 1033 ; N W ; B 0 0 1033 686 ;
+C 88 ; WX 755 ; N X ; B 0 0 755 686 ;
+C 89 ; WX 755 ; N Y ; B 0 0 755 686 ;
+C 90 ; WX 611 ; N Z ; B 0 0 611 686 ;
+C 91 ; WX 280 ; N C91 ; B 0 -250 280 750 ;
+C 92 ; WX 544 ; N C92 ; B 0 0 544 694 ;
+C 93 ; WX 280 ; N C93 ; B 0 -250 280 750 ;
+C 94 ; WX 500 ; N C94 ; B 0 0 500 694 ;
+C 95 ; WX 277 ; N C95 ; B 0 0 277 694 ;
+C 96 ; WX 277 ; N C96 ; B 0 0 277 694 ;
+C 97 ; WX 486 ; N a ; B 0 0 486 444 ;
+C 98 ; WX 555 ; N b ; B 0 0 555 694 ;
+C 99 ; WX 444 ; N c ; B 0 0 444 444 ;
+C 100 ; WX 555 ; N d ; B 0 0 555 694 ;
+C 101 ; WX 466 ; N e ; B 0 0 466 444 ;
+C 102 ; WX 305 ; N f ; B 0 0 305 694 ; L f C11 L i C12 L l C13
+C 103 ; WX 500 ; N g ; B 0 -194 500 444 ;
+C 104 ; WX 555 ; N h ; B 0 0 555 694 ;
+C 105 ; WX 277 ; N i ; B 0 0 277 694 ;
+C 106 ; WX 305 ; N j ; B 0 -194 305 694 ;
+C 107 ; WX 527 ; N k ; B 0 0 527 694 ;
+C 108 ; WX 277 ; N l ; B 0 0 277 694 ;
+C 109 ; WX 833 ; N m ; B 0 0 833 444 ;
+C 110 ; WX 555 ; N n ; B 0 0 555 444 ;
+C 111 ; WX 500 ; N o ; B 0 0 500 444 ;
+C 112 ; WX 555 ; N p ; B 0 -194 555 444 ;
+C 113 ; WX 527 ; N q ; B 0 -194 527 444 ;
+C 114 ; WX 427 ; N r ; B 0 0 427 444 ;
+C 115 ; WX 394 ; N s ; B 0 0 394 444 ;
+C 116 ; WX 390 ; N t ; B 0 0 390 634 ;
+C 117 ; WX 555 ; N u ; B 0 0 555 444 ;
+C 118 ; WX 527 ; N v ; B 0 0 527 444 ;
+C 119 ; WX 722 ; N w ; B 0 0 722 444 ;
+C 120 ; WX 527 ; N x ; B 0 0 527 444 ;
+C 121 ; WX 527 ; N y ; B 0 -194 527 444 ;
+C 122 ; WX 444 ; N z ; B 0 0 444 444 ;
+C 123 ; WX 500 ; N C123 ; B 0 0 500 444 ;
+C 124 ; WX 1000 ; N C124 ; B 0 0 1000 444 ;
+C 125 ; WX 500 ; N C125 ; B 0 0 500 694 ;
+C 126 ; WX 500 ; N C126 ; B 0 0 500 694 ;
+C 127 ; WX 500 ; N C127 ; B 0 0 500 694 ;
+EndCharMetrics
+
+StartKernData
+StartKernPairs 181
+KPX C11 C33 111
+KPX C11 C39 111
+KPX C11 C41 111
+KPX C11 C63 111
+KPX C11 C93 111
+KPX C32 L -338
+KPX C32 l -278
+KPX C39 C33 111
+KPX C39 C63 111
+KPX A C -28
+KPX A G -28
+KPX A O -28
+KPX A Q -28
+KPX A T -84
+KPX A U -28
+KPX A V -112
+KPX A W -112
+KPX A Y -84
+KPX A t -28
+KPX D A -28
+KPX D V -28
+KPX D W -28
+KPX D X -28
+KPX D Y -28
+KPX F A -112
+KPX F C -28
+KPX F G -28
+KPX F O -28
+KPX F Q -28
+KPX F a -84
+KPX F e -84
+KPX F o -84
+KPX F r -84
+KPX F u -84
+KPX I I 27
+KPX K C -28
+KPX K G -28
+KPX K O -28
+KPX K Q -28
+KPX L T -84
+KPX L V -112
+KPX L W -112
+KPX L Y -84
+KPX O A -28
+KPX O V -28
+KPX O W -28
+KPX O X -28
+KPX O Y -28
+KPX P C44 -84
+KPX P C46 -84
+KPX P A -84
+KPX P a -28
+KPX P e -28
+KPX P o -28
+KPX R C -28
+KPX R G -28
+KPX R O -28
+KPX R Q -28
+KPX R T -84
+KPX R U -28
+KPX R V -112
+KPX R W -112
+KPX R Y -84
+KPX R t -28
+KPX T A -84
+KPX T a -84
+KPX T e -84
+KPX T o -84
+KPX T r -84
+KPX T u -84
+KPX T y -28
+KPX V A -112
+KPX V C -28
+KPX V G -28
+KPX V O -28
+KPX V Q -28
+KPX V a -84
+KPX V e -84
+KPX V o -84
+KPX V r -84
+KPX V u -84
+KPX W A -112
+KPX W C -28
+KPX W G -28
+KPX W O -28
+KPX W Q -28
+KPX W a -84
+KPX W e -84
+KPX W o -84
+KPX W r -84
+KPX W u -84
+KPX X C -28
+KPX X G -28
+KPX X O -28
+KPX X Q -28
+KPX Y A -84
+KPX Y a -84
+KPX Y e -84
+KPX Y o -84
+KPX Y r -84
+KPX Y u -84
+KPX a j 55
+KPX a v -28
+KPX a w -28
+KPX a y -28
+KPX b c 27
+KPX b d 27
+KPX b e 27
+KPX b j 55
+KPX b o 27
+KPX b q 27
+KPX b v -28
+KPX b w -28
+KPX b x -28
+KPX b y -28
+KPX c h -28
+KPX c k -28
+KPX f C33 111
+KPX f C39 111
+KPX f C41 111
+KPX f C63 111
+KPX f C93 111
+KPX g j 27
+KPX h b -28
+KPX h t -28
+KPX h u -28
+KPX h v -28
+KPX h w -28
+KPX h y -28
+KPX k a -56
+KPX k c -28
+KPX k e -28
+KPX k o -28
+KPX m b -28
+KPX m t -28
+KPX m u -28
+KPX m v -28
+KPX m w -28
+KPX m y -28
+KPX n b -28
+KPX n t -28
+KPX n u -28
+KPX n v -28
+KPX n w -28
+KPX n y -28
+KPX o c 27
+KPX o d 27
+KPX o e 27
+KPX o j 55
+KPX o o 27
+KPX o q 27
+KPX o v -28
+KPX o w -28
+KPX o x -28
+KPX o y -28
+KPX p c 27
+KPX p d 27
+KPX p e 27
+KPX p j 55
+KPX p o 27
+KPX p q 27
+KPX p v -28
+KPX p w -28
+KPX p x -28
+KPX p y -28
+KPX t w -28
+KPX t y -28
+KPX u w -28
+KPX v a -56
+KPX v c -28
+KPX v e -28
+KPX v o -28
+KPX w a -28
+KPX w c -28
+KPX w e -28
+KPX w o -28
+KPX y C44 -84
+KPX y C46 -84
+KPX y a -28
+KPX y e -28
+KPX y o -28
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/src/fonts/texcmb.gle b/src/fonts/texcmb.gle
new file mode 100644
index 0000000..514a3d5
--- /dev/null
+++ b/src/fonts/texcmb.gle
@@ -0,0 +1,6832 @@
+dfont file_name="CMB10"
+dfont font_name="CMB10"
+dfont design= .35146
+dfont slant= 0
+dfont space= .117153
+dfont stretch= .585767E-01
+dfont shrink= .390513E-01
+dfont x_hei= .156204
+dfont quad= .351461
+dfont extra_space= .390513E-01
+dfont paint="FILL"
+!------------------ end of main parameters
+dfont char=0 !-------------- Beginning of new char.
+dfont wid=.600003 hei=.686111 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .184785 .238125
+bezier .188533 .209668 .191873 .181837 .19558 .15367
+aline .179705 .15367
+bezier .176329 .175441 .174891 .205841 .150495 .216535
+aline .14859 .21717
+aline .14732 .217805
+aline .14351 .219075
+aline .13843 .220345
+aline .137795 .22098
+aline .13462 .22098
+aline .133985 .221615
+aline .128905 .221615
+aline .12827 .22225
+aline .094615 .22225
+aline .09398 .221615
+aline .09398 .015875
+aline .094615 .01524
+aline .135255 .01524
+aline .135255 -.000635
+aline .12446 -.000635
+aline .123825 0
+aline .08001 0
+aline .079375 .000635
+aline .06096 .000635
+aline .060325 0
+aline .022225 0
+aline .02159 -.000635
+aline .012065 -.000635
+aline .012065 .01524
+aline .04445 .01524
+aline .045085 .015875
+aline .045085 .221615
+aline .04445 .22225
+aline .012065 .22225
+aline .012065 .238125
+aline .184785 .238125
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=1 !-------------- Beginning of new char.
+dfont wid=.833336 hei=.686111 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .151765 .244475
+aline .15367 .24384
+aline .15621 .24257
+aline .15875 .24003
+aline .174625 .20828
+aline .17526 .206375
+aline .19685 .163195
+aline .197485 .16129
+aline .219075 .11811
+aline .21971 .116205
+aline .2413 .073025
+aline .241935 .07112
+aline .263525 .02794
+aline .26416 .026035
+aline .274955 .004445
+aline .274955 .00254
+aline .27432 .00127
+aline .27305 0
+aline .27178 -.000635
+aline .020955 -.000635
+aline .019685 0
+aline .018415 .00127
+aline .01778 .00254
+aline .01778 .004445
+aline .028575 .026035
+aline .02921 .02794
+aline .0508 .07112
+aline .051435 .073025
+aline .073025 .116205
+aline .07366 .11811
+aline .09525 .16129
+aline .095885 .163195
+aline .117475 .206375
+aline .11811 .20828
+aline .133985 .24003
+aline .136525 .24257
+aline .139065 .24384
+aline .14097 .244475
+closepath
+! end of curve
+
+! start of curve
+amove .12827 .187325
+aline .127635 .186055
+aline .108585 .147955
+aline .10795 .14605
+aline .08636 .10287
+aline .085725 .100965
+aline .064135 .057785
+aline .0635 .05588
+aline .056515 .04191
+aline .05588 .041275
+aline .056515 .04064
+aline .201295 .04064
+aline .201771 .415925E-01
+aline .188595 .067945
+aline .18796 .06985
+aline .16637 .11303
+aline .165735 .114935
+aline .144145 .158115
+aline .14351 .16002
+aline .12954 .18796
+aline .128905 .188595
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=2 !-------------- Beginning of new char.
+dfont wid=.777781 hei=.686111 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .145415 .24384
+bezier .191579 .242292 .23606 .208937 .247015 .16256
+bezier .260303 .112819 .252527 .515453E-01 .208915 .01778
+bezier .15669 -.198473E-01 .725122E-01 -.010447 .0381 .04699
+bezier .134625E-01 .918691E-01 .141189E-01 .14742 .038735 .192405
+bezier .600919E-01 .229006 .104473 .246915 .145415 .24384
+closepath
+! end of curve
+
+! start of curve
+amove .130175 .23114
+bezier .932229E-01 .227681 .737376E-01 .187663 .071755 .15494
+aline .07112 .154305
+aline .07112 .147955
+aline .070485 .14732
+aline .070485 .137795
+aline .06985 .13716
+aline .06985 .10033
+bezier .709243E-01 .665934E-01 .820983E-01 .214749E-01 .12065 .010795
+bezier .154893 -.893961E-03 .190999 .278425E-01 .197485 .06223
+bezier .201478 .749662E-01 .201783 .874041E-01 .2032 .10033
+aline .2032 .13716
+bezier .201851 .171432 .191448 .217659 .1524 .229235
+aline .14986 .22987
+aline .146685 .230505
+aline .14605 .23114
+aline .142875 .23114
+aline .14224 .231775
+aline .13081 .231775
+aline .130175 .23114
+closepath
+! end of curve
+
+! start of curve
+amove .10668 .153035
+aline .10668 .141605
+aline .107315 .14097
+aline .165735 .14097
+aline .16637 .141605
+aline .16637 .153035
+aline .182245 .153035
+aline .182245 .08763
+aline .16637 .08763
+aline .16637 .09906
+aline .165735 .099695
+aline .107315 .099695
+aline .10668 .09906
+aline .10668 .08763
+aline .090805 .08763
+aline .090805 .153035
+aline .10668 .153035
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=3 !-------------- Beginning of new char.
+dfont wid=.700003 hei=.686111 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .12827 .244475
+aline .12954 .24384
+aline .13081 .243205
+aline .13335 .240665
+bezier .158671 .165838 .182418 .903551E-01 .20701 .01524
+aline .233045 .01524
+aline .233045 -.000635
+aline .22479 -.000635
+aline .224155 0
+aline .192405 0
+aline .19177 .000635
+aline .17526 .000635
+aline .174625 0
+aline .136525 0
+aline .13589 -.000635
+aline .12573 -.000635
+aline .12573 .01524
+aline .154305 .01524
+bezier .140217 .650097E-01 .122244 .114715 .10668 .164465
+bezier .907142E-01 .116414 .741186E-01 .672202E-01 .05969 .01905
+aline .060325 .018415
+aline .06223 .01778
+aline .065405 .017145
+aline .06604 .01651
+aline .06985 .01651
+aline .070485 .015875
+aline .0762 .015875
+aline .076835 .01524
+aline .086995 .01524
+aline .086995 -.000635
+aline .080645 -.000635
+aline .08001 0
+aline .05207 0
+aline .051435 .000635
+aline .040005 .000635
+aline .03937 0
+aline .018415 0
+aline .01778 -.000635
+aline .0127 -.000635
+aline .0127 .01524
+aline .024765 .01524
+aline .0254 .015875
+aline .031115 .015875
+aline .03175 .01651
+aline .034925 .01651
+aline .03556 .017145
+aline .03937 .018415
+bezier .644139E-01 .920493E-01 .871759E-01 .166967 .112395 .240665
+aline .114935 .243205
+aline .116205 .24384
+aline .117475 .244475
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=4 !-------------- Beginning of new char.
+dfont wid=.666669 hei=.686111 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .213995 .23622
+bezier .215068 .213155 .216097 .19007 .21717 .167005
+aline .201295 .167005
+bezier .199861 .176751 .202513 .189088 .19431 .196215
+aline .191135 .196215
+aline .1905 .19685
+aline .182245 .19685
+aline .18161 .197485
+aline .052705 .197485
+aline .05207 .19685
+aline .043815 .19685
+bezier .329937E-01 .195862 .341064E-01 .181688 .033655 .173355
+aline .03302 .17272
+aline .03302 .167005
+aline .017145 .167005
+bezier .182183E-01 .19007 .192468E-01 .213155 .02032 .23622
+aline .213995 .23622
+closepath
+! end of curve
+
+! start of curve
+amove .065405 .158115
+aline .065405 .14224
+aline .06604 .141605
+aline .168275 .141605
+aline .16891 .14224
+aline .16891 .158115
+aline .184785 .158115
+aline .184785 .08636
+aline .16891 .08636
+aline .16891 .102235
+aline .168275 .10287
+aline .06604 .10287
+aline .065405 .102235
+aline .065405 .08636
+aline .04953 .08636
+aline .04953 .158115
+aline .065405 .158115
+closepath
+! end of curve
+
+! start of curve
+amove .031115 .07239
+bezier .323048E-01 .615719E-01 .303724E-01 .497252E-01 .03683 .04064
+aline .038735 .040005
+aline .03937 .03937
+aline .042545 .03937
+aline .04318 .038735
+aline .051435 .038735
+aline .05207 .0381
+aline .182245 .0381
+aline .18288 .038735
+aline .191135 .038735
+bezier .201075 .385175E-01 .201375 .501171E-01 .202565 .05715
+aline .202565 .065405
+aline .2032 .06604
+aline .2032 .07239
+aline .219075 .07239
+bezier .218101 .480135E-01 .216874 .237415E-01 .2159 -.000635
+aline .018415 -.000635
+bezier .174408E-01 .237415E-01 .162142E-01 .480135E-01 .01524 .07239
+aline .031115 .07239
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=5 !-------------- Beginning of new char.
+dfont wid=.783336 hei=.686111 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .263525 .238125
+aline .263525 .22225
+aline .23114 .22225
+aline .230505 .221615
+aline .230505 .015875
+aline .23114 .01524
+aline .263525 .01524
+aline .263525 -.000635
+aline .254 -.000635
+aline .253365 0
+aline .215265 0
+aline .21463 .000635
+aline .197485 .000635
+aline .19685 0
+aline .15875 0
+aline .158115 -.000635
+aline .14859 -.000635
+aline .14859 .01524
+aline .180975 .01524
+aline .18161 .015875
+aline .18161 .221615
+aline .180975 .22225
+aline .094615 .22225
+aline .09398 .221615
+aline .09398 .015875
+aline .094615 .01524
+aline .127 .01524
+aline .127 -.000635
+aline .117475 -.000635
+aline .11684 0
+aline .07874 0
+aline .078105 .000635
+aline .06096 .000635
+aline .060325 0
+aline .022225 0
+aline .02159 -.000635
+aline .012065 -.000635
+aline .012065 .01524
+aline .04445 .01524
+aline .045085 .015875
+aline .045085 .221615
+aline .04445 .22225
+aline .012065 .22225
+aline .012065 .238125
+aline .263525 .238125
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=6 !-------------- Beginning of new char.
+dfont wid=.722224 hei=.686111 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .222885 .24003
+bezier .226633 .211573 .229973 .183742 .23368 .155575
+aline .217805 .155575
+bezier .215055 .181109 .205012 .213325 .175895 .21971
+aline .170815 .22098
+aline .16764 .221615
+aline .167005 .22225
+aline .16383 .22225
+aline .163195 .222885
+aline .158115 .222885
+aline .15748 .22352
+aline .149225 .22352
+aline .14859 .224155
+aline .084455 .224155
+bezier .105727 .189297 .133183 .15571 .155575 .12065
+aline .155575 .118745
+aline .15494 .11684
+aline .06731 .02921
+aline .06604 .028575
+aline .05969 .022225
+aline .060325 .02159
+aline .14732 .02159
+bezier .17099 .222254E-01 .201081 .301688E-01 .20955 .056515
+bezier .214292 .675763E-01 .216241 .078885 .217805 .09017
+aline .23368 .09017
+bezier .230043 .598574E-01 .226548 .299744E-01 .222885 -.000635
+aline .024765 -.000635
+aline .023495 0
+aline .020955 .00254
+aline .02032 .00381
+aline .02032 .006985
+aline .020955 .008255
+aline .11049 .09779
+bezier .103855 .112842 .907891E-01 .126339 .081915 .14097
+bezier .612084E-01 .170054 .404099E-01 .199072 .02032 .2286
+aline .02032 .235585
+aline .020955 .236855
+aline .023495 .239395
+aline .024765 .24003
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=7 !-------------- Beginning of new char.
+dfont wid=.777781 hei=.686111 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .07239 .24384
+bezier .109524 .240682 .129754 .202806 .136525 .169545
+bezier .144391 .201515 .162547 .240844 .200025 .243205
+bezier .229563 .249835 .259324 .215354 .250825 .187325
+aline .248285 .186055
+aline .239395 .186055
+bezier .232186 .188554 .236831 .199247 .2286 .201295
+bezier .210019 .207631 .18467 .204256 .174625 .184785
+bezier .16542 .16796 .162726 .149211 .16129 .131445
+aline .16129 .015875
+aline .161925 .01524
+aline .202565 .01524
+aline .202565 -.000635
+aline .19177 -.000635
+aline .191135 0
+aline .14732 0
+aline .146685 .000635
+aline .127 .000635
+aline .126365 0
+aline .08255 0
+aline .081915 -.000635
+aline .07112 -.000635
+aline .07112 .01524
+aline .11176 .01524
+aline .112395 .015875
+aline .112395 .131445
+bezier .109815 .156418 .105637 .193214 .0762 .202565
+bezier .642431E-01 .204296 .482673E-01 .206631 .03937 .19685
+aline .038735 .194945
+aline .0381 .19431
+aline .0381 .1905
+aline .03683 .18796
+aline .036195 .187325
+aline .033655 .186055
+aline .024765 .186055
+aline .022225 .187325
+bezier .149018E-01 .211537 .363015E-01 .241226 .061595 .24384
+aline .07239 .24384
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=8 !-------------- Beginning of new char.
+dfont wid=.722224 hei=.686111 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .07239 .24003
+aline .073025 .239395
+aline .114935 .239395
+aline .11557 .23876
+aline .135255 .23876
+aline .13589 .239395
+aline .1778 .239395
+aline .178435 .24003
+aline .18923 .24003
+aline .18923 .224155
+aline .14859 .224155
+aline .147955 .22352
+aline .147955 .187325
+bezier .179978 .183341 .22106 .170234 .231775 .13462
+bezier .241751 .102352 .21636 .070708 .186055 .06096
+bezier .173719 .557187E-01 .159727 .549785E-01 .147955 .05207
+aline .147955 .015875
+aline .14859 .01524
+aline .18923 .01524
+aline .18923 -.000635
+aline .178435 -.000635
+aline .1778 0
+aline .13589 0
+aline .135255 .000635
+aline .11557 .000635
+aline .114935 0
+aline .073025 0
+aline .07239 -.000635
+aline .061595 -.000635
+aline .061595 .01524
+aline .102235 .01524
+aline .10287 .015875
+aline .10287 .052705
+bezier .06875 .564214E-01 .247601E-01 .741264E-01 .020955 .113665
+bezier .154389E-01 .148263 .048515 .175324 .08001 .182245
+aline .08509 .183515
+aline .09144 .184785
+aline .094615 .184785
+aline .09525 .18542
+aline .09906 .18542
+aline .099695 .186055
+aline .10287 .18669
+aline .10287 .22352
+aline .102235 .224155
+aline .061595 .224155
+aline .061595 .24003
+aline .07239 .24003
+closepath
+! end of curve
+
+! start of curve
+amove .147955 .17272
+aline .147955 .066675
+bezier .167045 .679805E-01 .183007 .864501E-01 .18161 .10541
+bezier .182758 .126639 .185677 .154033 .164465 .167005
+aline .158115 .17018
+aline .1524 .172085
+aline .14986 .17272
+aline .148908 .173196
+aline .147955 .17272
+closepath
+! end of curve
+
+! start of curve
+amove .1016 .172085
+bezier .832027E-01 .168471 .718039E-01 .150482 .071755 .13335
+bezier .720507E-01 .111811 .681957E-01 .853213E-01 .089535 .07239
+aline .095885 .069215
+aline .1016 .06731
+aline .102235 .066675
+aline .10287 .06731
+aline .10287 .172085
+aline .102235 .17272
+aline .1016 .172085
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=9 !-------------- Beginning of new char.
+dfont wid=.777781 hei=.686111 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .081915 .24003
+aline .08255 .239395
+aline .12446 .239395
+aline .125095 .23876
+aline .14478 .23876
+aline .145415 .239395
+aline .187325 .239395
+aline .18796 .24003
+aline .198755 .24003
+aline .198755 .224155
+aline .158115 .224155
+aline .15748 .22352
+aline .15748 .069215
+bezier .181978 .764639E-01 .190864 .108318 .191135 .131445
+bezier .194089 .150875 .185841 .177239 .20574 .189865
+aline .207645 .1905
+aline .210185 .191135
+aline .248285 .191135
+aline .250825 .189865
+aline .25146 .18923
+aline .25273 .18669
+bezier .254644 .176951 .241976 .181309 .24003 .17399
+bezier .233376 .150496 .240793 .12425 .229235 .100965
+bezier .217691 .719308E-01 .187042 .561961E-01 .15748 .052705
+aline .15748 .015875
+aline .158115 .01524
+aline .198755 .01524
+aline .198755 -.000635
+aline .18796 -.000635
+aline .187325 0
+aline .145415 0
+aline .14478 .000635
+aline .125095 .000635
+aline .12446 0
+aline .08255 0
+aline .081915 -.000635
+aline .07112 -.000635
+aline .07112 .01524
+aline .11176 .01524
+aline .112395 .015875
+aline .112395 .052705
+bezier .789662E-01 .566172E-01 .463469E-01 .07894 .03937 .113665
+bezier .032452 .134551 .414495E-01 .158622 .03048 .1778
+aline .028575 .178435
+aline .02794 .17907
+aline .024765 .17907
+aline .022225 .18034
+aline .02159 .180975
+aline .02032 .183515
+aline .02032 .18669
+aline .020955 .18796
+aline .023495 .1905
+aline .024765 .191135
+aline .062865 .191135
+bezier .07734 .188591 .805712E-01 .171679 .08128 .16002
+bezier .811646E-01 .129886 .797095E-01 .966908E-01 .103505 .074295
+aline .104775 .07366
+aline .10541 .073025
+aline .10668 .07239
+aline .107315 .071755
+aline .111125 .06985
+aline .11176 .069215
+aline .112395 .06985
+aline .112395 .22352
+aline .11176 .224155
+aline .07112 .224155
+aline .07112 .24003
+aline .081915 .24003
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=10 !-------------- Beginning of new char.
+dfont wid=.722224 hei=.686111 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .13843 .24384
+bezier .178816 .243063 .22745 .218001 .23241 .17272
+bezier .240618 .130958 .210149 .941563E-01 .18923 .06096
+bezier .184641 .525663E-01 .178454 .428667E-01 .17653 .03429
+aline .20193 .03429
+aline .202565 .034925
+aline .20701 .034925
+bezier .218264 .372302E-01 .217227 .516934E-01 .21971 .060325
+aline .22098 .066675
+aline .221615 .06858
+aline .23749 .06858
+bezier .233299 .453962E-01 .229373 .226191E-01 .22479 -.000635
+aline .16256 -.000635
+aline .16129 0
+aline .15875 .00254
+bezier .154705 .686869E-01 .195719 .135108 .17399 .20066
+bezier .160602 .237713 .104954 .242332 .084455 .20955
+bezier .657507E-01 .173257 .748488E-01 .132703 .08255 .09525
+bezier .891647E-01 .638824E-01 .962024E-01 .349834E-01 .095885 .00381
+aline .094615 .00127
+aline .09398 .000635
+aline .09144 -.000635
+aline .02921 -.000635
+bezier .246265E-01 .226191E-01 .207014E-01 .453962E-01 .01651 .06858
+aline .032385 .06858
+aline .03302 .066675
+aline .03429 .060325
+bezier .367732E-01 .516934E-01 .357359E-01 .372304E-01 .04699 .034925
+aline .051435 .034925
+aline .05207 .03429
+aline .07747 .03429
+bezier .615858E-01 .787823E-01 .153054E-01 .115316 .02032 .16764
+bezier .233105E-01 .208474 .626956E-01 .239293 .102235 .241935
+aline .10287 .24257
+aline .107315 .24257
+aline .10795 .243205
+aline .114935 .243205
+aline .11557 .24384
+aline .13843 .24384
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=11 !-------------- Beginning of new char.
+dfont wid=.583336 hei=.694445 dep=0 italic=.111112
+dfont fby=33 kadd=.111112
+dfont fby=39 kadd=.111112
+dfont fby=")" kadd=.111112
+dfont fby="?" kadd=.111112
+dfont fby="]" kadd=.111112
+dfont fby="i" ligrep=14
+dfont fby="l" ligrep=15
+set path ! start of curve
+newpath
+! start of curve
+amove .12319 .244475
+bezier .133263 .244044 .143628 .237811 .151765 .23368
+bezier .171508 .244367 .195969 .248787 .21717 .24003
+bezier .232883 .232194 .240131 .207654 .224155 .196215
+bezier .208868 .185753 .186233 .199891 .1905 .21844
+aline .191135 .22098
+aline .19177 .222885
+aline .19304 .225425
+aline .193675 .22606
+aline .19431 .22733
+aline .198755 .231775
+bezier .180356 .235517 .163742 .21734 .16383 .19939
+aline .163195 .198755
+aline .163195 .155575
+aline .16383 .15494
+aline .19812 .15494
+aline .19812 .139065
+aline .165735 .139065
+aline .1651 .13843
+aline .1651 .015875
+aline .165735 .01524
+aline .19558 .01524
+aline .19558 -.000635
+aline .187325 -.000635
+aline .18669 0
+aline .154305 0
+aline .15367 .000635
+aline .1397 .000635
+aline .139065 0
+aline .111125 0
+aline .11049 -.000635
+aline .103505 -.000635
+aline .103505 .01524
+aline .127 .01524
+aline .127635 .015875
+aline .127635 .13843
+aline .127 .139065
+aline .06858 .139065
+aline .067945 .13843
+aline .067945 .015875
+aline .06858 .01524
+aline .092075 .01524
+aline .092075 -.000635
+aline .08509 -.000635
+aline .084455 0
+aline .056515 0
+aline .05588 .000635
+aline .042545 .000635
+aline .04191 0
+aline .01397 0
+aline .013335 -.000635
+aline .00635 -.000635
+aline .00635 .01524
+aline .029845 .01524
+aline .03048 .015875
+aline .03048 .13843
+aline .029845 .139065
+aline .009525 .139065
+aline .009525 .15494
+aline .029845 .15494
+aline .03048 .155575
+aline .03048 .197485
+bezier .363559E-01 .231524 .758723E-01 .243122 .104775 .244475
+aline .12319 .244475
+closepath
+! end of curve
+
+! start of curve
+amove .10668 .231775
+bezier .087526 .231979 .680903E-01 .21705 .06604 .197485
+aline .06604 .155575
+aline .066675 .15494
+aline .127 .15494
+aline .127635 .155575
+aline .127635 .19177
+bezier .114668 .200585 .116026 .221745 .12954 .229235
+aline .12573 .230505
+aline .12319 .23114
+aline .122555 .231775
+aline .118745 .231775
+aline .11811 .23241
+aline .107315 .23241
+aline .10668 .231775
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=12 !-------------- Beginning of new char.
+dfont wid=.555557 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .123825 .244475
+bezier .14932 .243189 .173627 .212536 .158115 .18923
+bezier .145515 .173286 .116126 .183427 .117475 .203835
+aline .117475 .20447
+aline .11811 .205105
+aline .11811 .20955
+aline .118745 .21209
+aline .121285 .21717
+aline .127 .222885
+aline .13208 .225425
+aline .13462 .22606
+bezier .110905 .241472 .694717E-01 .228239 .066675 .197485
+aline .06604 .19685
+aline .06604 .155575
+aline .066675 .15494
+aline .102235 .15494
+aline .10287 .156845
+aline .122555 .156845
+aline .12319 .15748
+aline .14351 .15748
+aline .144145 .158115
+aline .164465 .158115
+aline .164465 .015875
+aline .1651 .01524
+aline .188595 .01524
+aline .188595 -.000635
+aline .18161 -.000635
+aline .180975 0
+aline .153035 0
+aline .1524 .000635
+aline .139065 .000635
+aline .13843 0
+aline .11049 0
+aline .109855 -.000635
+aline .10287 -.000635
+aline .10287 .01524
+aline .126365 .01524
+aline .127 .015875
+aline .127 .13335
+aline .126365 .133985
+aline .12573 .13589
+aline .125095 .13716
+aline .12319 .139065
+aline .06858 .139065
+aline .067945 .13843
+aline .067945 .015875
+aline .06858 .01524
+aline .092075 .01524
+aline .092075 -.000635
+aline .08509 -.000635
+aline .084455 0
+aline .056515 0
+aline .05588 .000635
+aline .042545 .000635
+aline .04191 0
+aline .01397 0
+aline .013335 -.000635
+aline .00635 -.000635
+aline .00635 .01524
+aline .029845 .01524
+aline .03048 .015875
+aline .03048 .13843
+aline .029845 .139065
+aline .009525 .139065
+aline .009525 .15494
+aline .029845 .15494
+aline .03048 .155575
+aline .03048 .197485
+bezier .365782E-01 .231941 .768268E-01 .243102 .106045 .244475
+aline .123825 .244475
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=13 !-------------- Beginning of new char.
+dfont wid=.555557 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .123825 .244475
+aline .12446 .24384
+aline .128905 .24384
+aline .13208 .243205
+bezier .142673 .238377 .153621 .242414 .164465 .24257
+aline .164465 .015875
+aline .1651 .01524
+aline .188595 .01524
+aline .188595 -.000635
+aline .18161 -.000635
+aline .180975 0
+aline .153035 0
+aline .1524 .000635
+aline .139065 .000635
+aline .13843 0
+aline .11049 0
+aline .109855 -.000635
+aline .10287 -.000635
+aline .10287 .01524
+aline .126365 .01524
+aline .127 .015875
+aline .127 .13843
+aline .126365 .139065
+aline .06858 .139065
+aline .067945 .13843
+aline .067945 .015875
+aline .06858 .01524
+aline .092075 .01524
+aline .092075 -.000635
+aline .08509 -.000635
+aline .084455 0
+aline .056515 0
+aline .05588 .000635
+aline .042545 .000635
+aline .04191 0
+aline .01397 0
+aline .013335 -.000635
+aline .00635 -.000635
+aline .00635 .01524
+aline .029845 .01524
+aline .03048 .015875
+aline .03048 .13843
+aline .029845 .139065
+aline .009525 .139065
+aline .009525 .15494
+aline .029845 .15494
+aline .03048 .155575
+aline .03048 .197485
+bezier .362676E-01 .231432 .758412E-01 .243231 .104775 .244475
+aline .123825 .244475
+closepath
+! end of curve
+
+! start of curve
+amove .106045 .231775
+bezier .868606E-01 .231496 .680343E-01 .21687 .06604 .197485
+aline .06604 .155575
+aline .066675 .15494
+aline .126365 .15494
+aline .127 .155575
+aline .127 .196215
+bezier .11614 .204458 .115156 .221318 .125095 .230505
+aline .123825 .231775
+aline .11938 .231775
+aline .118745 .23241
+aline .10668 .23241
+aline .106045 .231775
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=14 !-------------- Beginning of new char.
+dfont wid=.833336 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .12319 .244475
+bezier .133484 .243149 .143828 .237921 .151448 .230664
+bezier .175297 .24359 .201977 .246401 .227965 .243205
+bezier .252458 .238831 .272537 .205559 .25273 .186055
+bezier .238524 .17452 .214199 .185348 .215265 .203835
+aline .215265 .20447
+aline .2159 .205105
+aline .2159 .20955
+aline .216535 .21209
+aline .219075 .21717
+aline .22479 .222885
+aline .22987 .225425
+aline .23241 .22606
+bezier .207922 .24162 .16662 .227833 .163195 .19685
+aline .163195 .155575
+aline .16383 .15494
+aline .200025 .15494
+aline .20066 .156845
+aline .220345 .156845
+aline .22098 .15748
+aline .2413 .15748
+aline .241935 .158115
+aline .262255 .158115
+aline .262255 .015875
+aline .26289 .01524
+aline .286385 .01524
+aline .286385 -.000635
+aline .2794 -.000635
+aline .278765 0
+aline .250825 0
+aline .25019 .000635
+aline .236855 .000635
+aline .23622 0
+aline .20828 0
+aline .207645 -.000635
+aline .20066 -.000635
+aline .20066 .01524
+aline .224155 .01524
+aline .22479 .015875
+aline .22479 .13335
+aline .224155 .133985
+aline .22352 .13589
+aline .222885 .13716
+aline .22098 .139065
+aline .165735 .139065
+aline .1651 .13843
+aline .1651 .015875
+aline .165735 .01524
+aline .18923 .01524
+aline .18923 -.000635
+aline .182245 -.000635
+aline .18161 0
+aline .15367 0
+aline .153035 .000635
+aline .1397 .000635
+aline .139065 0
+aline .111125 0
+aline .11049 -.000635
+aline .103505 -.000635
+aline .103505 .01524
+aline .127 .01524
+aline .127635 .015875
+aline .127635 .13843
+aline .127 .139065
+aline .06858 .139065
+aline .067945 .13843
+aline .067945 .015875
+aline .06858 .01524
+aline .092075 .01524
+aline .092075 -.000635
+aline .08509 -.000635
+aline .084455 0
+aline .056515 0
+aline .05588 .000635
+aline .042545 .000635
+aline .04191 0
+aline .01397 0
+aline .013335 -.000635
+aline .00635 -.000635
+aline .00635 .01524
+aline .029845 .01524
+aline .03048 .015875
+aline .03048 .13843
+aline .029845 .139065
+aline .009525 .139065
+aline .009525 .15494
+aline .029845 .15494
+aline .03048 .155575
+aline .03048 .197485
+bezier .363972E-01 .231505 .758727E-01 .243073 .104775 .244475
+aline .12319 .244475
+closepath
+! end of curve
+
+! start of curve
+amove .10668 .231775
+bezier .087302 .231631 .680926E-01 .217124 .06604 .197485
+aline .06604 .155575
+aline .066675 .15494
+aline .127 .15494
+aline .127635 .155575
+aline .127635 .18415
+bezier .110105 .193178 .114005 .221187 .132556 .226378
+aline .132292 .226907
+aline .126365 .22987
+aline .12446 .230505
+aline .12192 .23114
+aline .121285 .231775
+aline .11811 .231775
+aline .117475 .23241
+aline .107315 .23241
+aline .10668 .231775
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=15 !-------------- Beginning of new char.
+dfont wid=.833336 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .12319 .244475
+bezier .133878 .243527 .144542 .23852 .153035 .231987
+bezier .179129 .244379 .20842 .248056 .23622 .2413
+aline .236855 .240665
+aline .243205 .240665
+aline .24384 .2413
+aline .250825 .2413
+aline .25146 .241935
+aline .258445 .241935
+aline .25908 .24257
+aline .262255 .24257
+aline .262255 .015875
+aline .26289 .01524
+aline .286385 .01524
+aline .286385 -.000635
+aline .2794 -.000635
+aline .278765 0
+aline .250825 0
+aline .25019 .000635
+aline .236855 .000635
+aline .23622 0
+aline .20828 0
+aline .207645 -.000635
+aline .20066 -.000635
+aline .20066 .01524
+aline .224155 .01524
+aline .22479 .015875
+aline .22479 .13843
+aline .224155 .139065
+aline .165735 .139065
+aline .1651 .13843
+aline .1651 .015875
+aline .165735 .01524
+aline .18923 .01524
+aline .18923 -.000635
+aline .182245 -.000635
+aline .18161 0
+aline .15367 0
+aline .153035 .000635
+aline .1397 .000635
+aline .139065 0
+aline .111125 0
+aline .11049 -.000635
+aline .103505 -.000635
+aline .103505 .01524
+aline .127 .01524
+aline .127635 .015875
+aline .127635 .13843
+aline .127 .139065
+aline .06858 .139065
+aline .067945 .13843
+aline .067945 .015875
+aline .06858 .01524
+aline .092075 .01524
+aline .092075 -.000635
+aline .08509 -.000635
+aline .084455 0
+aline .056515 0
+aline .05588 .000635
+aline .042545 .000635
+aline .04191 0
+aline .01397 0
+aline .013335 -.000635
+aline .00635 -.000635
+aline .00635 .01524
+aline .029845 .01524
+aline .03048 .015875
+aline .03048 .13843
+aline .029845 .139065
+aline .009525 .139065
+aline .009525 .15494
+aline .029845 .15494
+aline .03048 .155575
+aline .03048 .197485
+bezier .363972E-01 .231505 .758727E-01 .243073 .104775 .244475
+aline .12319 .244475
+closepath
+! end of curve
+
+! start of curve
+amove .10668 .231775
+bezier .087302 .231631 .680926E-01 .217124 .06604 .197485
+aline .06604 .155575
+aline .066675 .15494
+aline .127 .15494
+aline .127635 .155575
+aline .127635 .19177
+bezier .11519 .200995 .116252 .221111 .129381 .228918
+aline .129117 .229447
+aline .12827 .22987
+aline .12319 .23114
+aline .122555 .231775
+aline .118745 .231775
+aline .11811 .23241
+aline .107315 .23241
+aline .10668 .231775
+closepath
+! end of curve
+
+! start of curve
+amove .203835 .231775
+bezier .184457 .231631 .165248 .217124 .163195 .197485
+aline .163195 .155575
+aline .16383 .15494
+aline .224155 .15494
+aline .22479 .155575
+aline .22479 .196215
+bezier .21393 .204458 .212946 .221318 .222885 .230505
+aline .221615 .23114
+aline .22098 .231775
+aline .21717 .231775
+aline .216535 .23241
+aline .20447 .23241
+aline .203835 .231775
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=16 !-------------- Beginning of new char.
+dfont wid=.277779 hei=.444445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .07112 .156845
+aline .07112 .015875
+aline .071755 .01524
+aline .093345 .01524
+aline .093345 -.000635
+aline .08636 -.000635
+aline .085725 0
+aline .059055 0
+aline .05842 .000635
+aline .04572 .000635
+aline .045085 0
+aline .017145 0
+aline .01651 -.000635
+aline .009525 -.000635
+aline .009525 .01524
+aline .03302 .01524
+aline .033655 .015875
+aline .033655 .13081
+bezier .300035E-01 .140014 .183886E-01 .137192 .01016 .137795
+aline .01016 .15367
+bezier .304434E-01 .154817 .508366E-01 .155698 .07112 .156845
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=17 !-------------- Beginning of new char.
+dfont wid=.305557 hei=.444445 dep=.194445 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .08509 .156845
+aline .08509 -.023495
+bezier .797119E-01 -.069003 .136792E-01 -.087991 -.01651 -.05461
+bezier -.262001E-01 -.419392E-01 -.202401E-01 -.199059E-01 -.003175 -.01778
+bezier .163139E-01 -.135618E-01 .302654E-01 -.385963E-01 .01778 -.05334
+aline .014605 -.056515
+aline .013335 -.05715
+bezier .240753E-01 -.618603E-01 .387581E-01 -.584335E-01 .042545 -.04572
+aline .04445 -.040005
+aline .045085 -.037465
+aline .04572 -.03429
+aline .046355 -.033655
+aline .046355 -.03048
+aline .04699 -.029845
+aline .04699 -.024765
+aline .047625 -.02413
+aline .047625 .130175
+bezier .043431 .140692 .301892E-01 .13695 .020955 .137795
+aline .020955 .15367
+bezier .422675E-01 .154887 .637539E-01 .155685 .08509 .156845
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=18 !-------------- Beginning of new char.
+dfont wid=.500002 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .05842 .247015
+bezier .748909E-01 .24334 .790862E-01 .22409 .0889 .212725
+bezier .931858E-01 .20492 .991964E-01 .197655 .10287 .189865
+aline .092075 .17907
+bezier .740975E-01 .190708 .541323E-01 .201014 .0381 .215265
+bezier .290265E-01 .227788 .407545E-01 .24526 .05461 .247015
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=19 !-------------- Beginning of new char.
+dfont wid=.500002 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .121285 .247015
+bezier .137487 .245536 .148794 .222007 .133985 .211455
+bezier .117761 .200032 .100774 .189162 .08382 .17907
+aline .073025 .189865
+bezier .843721E-01 .207826 .949322E-01 .227541 .10922 .24384
+aline .11049 .244475
+aline .111125 .24511
+aline .112395 .245745
+aline .1143 .24638
+aline .117475 .247015
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=20 !-------------- Beginning of new char.
+dfont wid=.500002 hei=.631945 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .048895 .227965
+bezier .619339E-01 .221931 .749782E-01 .215911 .879475E-01 .209709
+bezier .101147 .215826 .114266 .222459 .127635 .227965
+bezier .129626 .223141 .135306 .218168 .13462 .21336
+bezier .118758 .203114 .103671 .19129 .08763 .18161
+bezier .072186 .192847 .542234E-01 .202901 .04064 .215265
+aline .041275 .2159
+aline .042545 .21844
+aline .04318 .219075
+aline .045085 .222885
+aline .04572 .22352
+aline .04699 .22606
+aline .047625 .226695
+aline .04826 .227965
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=21 !-------------- Beginning of new char.
+dfont wid=.500002 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .045085 .24257
+bezier .439232E-01 .213876 .770345E-01 .189495 .103505 .20193
+bezier .120015 .208202 .130742 .225631 .13081 .24257
+aline .142875 .24257
+bezier .144778 .210231 .117073 .172244 .081915 .178435
+bezier .510624E-01 .181108 .322219E-01 .214434 .03302 .24257
+aline .045085 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=22 !-------------- Beginning of new char.
+dfont wid=.500002 hei=.596109 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .15113 .21209
+aline .15113 .19431
+aline .024765 .19431
+aline .024765 .21209
+aline .15113 .21209
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=23 !-------------- Beginning of new char.
+dfont wid=.755559 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .139065 .245745
+bezier .158218 .245806 .177211 .225964 .168275 .206375
+bezier .156937 .183965 .124337 .183256 .10541 .19558
+bezier .871056E-01 .208814 .951741E-01 .239673 .11684 .24384
+aline .12192 .24511
+aline .12573 .24511
+aline .126365 .245745
+aline .139065 .245745
+closepath
+! end of curve
+
+! start of curve
+amove .123825 .233045
+bezier .106403 .232619 .106403 .201086 .123825 .20066
+bezier .134368 .19916 .152073 .198057 .154305 .21209
+aline .154305 .221615
+aline .15367 .22225
+aline .153035 .225425
+aline .15113 .229235
+aline .150495 .22987
+aline .146685 .231775
+aline .14478 .23241
+aline .141605 .233045
+aline .14097 .23368
+aline .12446 .23368
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=24 !-------------- Beginning of new char.
+dfont wid=.444446 hei=0 dep=.170138 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .107315 -.00508
+aline .107315 -.012065
+bezier .119521 -.148888E-01 .133614 -.207268E-01 .136525 -.03429
+bezier .140289 -.507765E-01 .12576 -.623879E-01 .111125 -.065405
+bezier .873879E-01 -.706419E-01 .637032E-01 -.705102E-01 .038735 -.070485
+aline .038735 -.05842
+bezier .580959E-01 -.576465E-01 .785725E-01 -.607335E-01 .094615 -.04826
+bezier .103092 -.365716E-01 .905264E-01 -.023483 .078105 -.02286
+aline .07747 -.022225
+aline .074295 -.022225
+aline .07366 -.02159
+aline .067945 -.02159
+aline .067945 -.00508
+aline .107315 -.00508
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=25 !-------------- Beginning of new char.
+dfont wid=.559723 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .11303 .244475
+bezier .138394 .243333 .171795 .231481 .17653 .20193
+bezier .179653 .175656 .157404 .154338 .13335 .147955
+bezier .179856 .129843 .202449 .661056E-01 .17526 .02413
+bezier .15666 .202754E-03 .120684 -.946224E-02 .093345 .00254
+bezier .782019E-01 .968174E-02 .712102E-01 .370492E-01 .09017 .043815
+bezier .106129 .499622E-01 .120127 .295313E-01 .109855 .01651
+aline .10668 .013335
+aline .10541 .0127
+bezier .108363 .820007E-02 .11906 .878874E-02 .12446 .012065
+bezier .139791 .177725E-01 .144141 .362776E-01 .145415 .050165
+bezier .145894 .798207E-01 .145376 .113609 .120015 .133985
+bezier .110989 .140167 .100412 .142609 .09017 .14351
+aline .088265 .145415
+aline .088265 .151765
+aline .0889 .153035
+bezier .967946E-01 .156822 .106548 .154718 .114935 .159385
+bezier .137799 .169902 .139867 .20114 .12954 .22098
+bezier .112345 .241794 .690014E-01 .233778 .06858 .203835
+aline .067945 .2032
+aline .067945 -.000635
+aline .065405 -.000635
+aline .06477 0
+aline .052705 0
+aline .05207 .000635
+aline .042545 .000635
+aline .04191 0
+aline .01397 0
+aline .013335 -.000635
+aline .00635 -.000635
+aline .00635 .01524
+aline .029845 .01524
+aline .03048 .015875
+aline .03048 .13843
+aline .029845 .139065
+aline .00635 .139065
+aline .00635 .15494
+aline .029845 .15494
+aline .03048 .155575
+aline .03048 .20193
+bezier .347251E-01 .231012 .671143E-01 .243249 .092075 .244475
+aline .11303 .244475
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=26 !-------------- Beginning of new char.
+dfont wid=.722224 hei=.444445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .08763 .158115
+bezier .102903 .156653 .120767 .152335 .13208 .140335
+bezier .162374 .168367 .222981 .164938 .238125 .12192
+bezier .242476 .107457 .245651 .928198E-01 .24257 .078105
+aline .241935 .07747
+aline .239395 .0762
+aline .14732 .0762
+bezier .145039 .523822E-01 .151756 .017955 .18034 .012065
+bezier .201109 .598934E-02 .224222 .226067E-01 .229235 .043815
+aline .22987 .04445
+aline .23241 .04572
+aline .239395 .04572
+bezier .249035 .408329E-01 .240184 .283939E-01 .23622 .022225
+bezier .212074 -.012731 .158535 -.817815E-02 .129858 .182563E-01
+bezier .10453 -.539687E-02 .663278E-01 -.691825E-02 .034925 .003175
+bezier .137885E-01 .938777E-02 .209809E-02 .361212E-01 .015875 .05461
+bezier .340363E-01 .799681E-01 .696708E-01 .082938 .097155 .085725
+aline .10668 .085725
+bezier .108416 .106256 .109771 .136265 .085725 .14478
+bezier .760253E-01 .147285 .650038E-01 .146108 .560388E-01 .143193
+bezier .705511E-01 .131978 .630811E-01 .104205 .043815 .104775
+bezier .283067E-01 .101398 .148977E-01 .120479 .02159 .135255
+bezier .289796E-01 .153628 .516085E-01 .156364 .067945 .158115
+aline .08763 .158115
+closepath
+! end of curve
+
+! start of curve
+amove .178435 .145415
+bezier .154654 .142713 .147368 .114604 .146685 .09525
+aline .146685 .08763
+aline .14732 .086995
+aline .210185 .086995
+bezier .21109 .105007 .209018 .126424 .19558 .14097
+aline .19431 .141605
+aline .193675 .14224
+aline .188595 .14478
+aline .18542 .145415
+aline .184785 .14605
+aline .17907 .14605
+aline .178435 .145415
+closepath
+! end of curve
+
+! start of curve
+amove .10033 .07366
+bezier .777245E-01 .725582E-01 .484262E-01 .587042E-01 .0508 .03175
+bezier .527407E-01 .187516E-01 .652705E-01 .631411E-02 .07874 .01016
+bezier .982988E-01 .108258E-01 .121562 .319435E-01 .11049 .05207
+aline .10922 .05715
+aline .108585 .060325
+aline .108585 .0635
+aline .10795 .064135
+aline .10795 .069215
+aline .107315 .06985
+aline .107315 .07366
+aline .10668 .074295
+aline .100965 .074295
+aline .10033 .07366
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=27 !-------------- Beginning of new char.
+dfont wid=.777781 hei=.444445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .095885 .158115
+bezier .11381 .156535 .133026 .149248 .145733 .135414
+bezier .17396 .1667 .235949 .168229 .25527 .126365
+bezier .261438 .110781 .264709 .943009E-01 .26162 .078105
+aline .260985 .07747
+aline .258445 .0762
+aline .16637 .0762
+bezier .164089 .523822E-01 .170806 .017955 .19939 .012065
+bezier .220159 .598934E-02 .243272 .226067E-01 .248285 .043815
+aline .24892 .04445
+aline .25146 .04572
+aline .258445 .04572
+bezier .268085 .408329E-01 .259234 .283939E-01 .25527 .022225
+bezier .230338 -.013701 .1745 -.803978E-02 .146368 .207963E-01
+bezier .110104 -.177819E-01 .346914E-01 -.82877E-02 .015875 .043815
+bezier .146551E-02 .082209 .126131E-01 .134675 .053975 .151765
+aline .065405 .155575
+aline .067945 .15621
+aline .07112 .156845
+aline .074295 .156845
+aline .07493 .15748
+aline .079375 .15748
+aline .08001 .158115
+aline .095885 .158115
+closepath
+! end of curve
+
+! start of curve
+amove .08382 .145415
+bezier .609028E-01 .143538 .504302E-01 .117582 .051435 .09779
+aline .0508 .097155
+aline .0508 .06223
+bezier .515568E-01 .424869E-01 .577475E-01 .163271E-01 .080645 .01016
+bezier .101498 .529072E-02 .121758 .232673E-01 .123825 .04445
+aline .12446 .045085
+aline .12446 .04826
+aline .125095 .048895
+aline .125095 .05334
+aline .12573 .053975
+aline .12573 .061595
+aline .126365 .06223
+aline .126365 .097155
+bezier .125688 .11615 .117897 .140578 .095885 .145415
+aline .09271 .145415
+aline .092075 .14605
+aline .084455 .14605
+aline .08382 .145415
+closepath
+! end of curve
+
+! start of curve
+amove .197485 .145415
+bezier .173704 .142713 .166418 .114604 .165735 .09525
+aline .165735 .08763
+aline .16637 .086995
+aline .229235 .086995
+bezier .23014 .105007 .228068 .126424 .21463 .14097
+aline .21336 .141605
+aline .212725 .14224
+aline .207645 .14478
+aline .20447 .145415
+aline .203835 .14605
+aline .19812 .14605
+aline .197485 .145415
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=28 !-------------- Beginning of new char.
+dfont wid=.500002 hei=.541667 dep=.0972233 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .141605 .19177
+aline .142875 .191135
+aline .145415 .189865
+aline .14605 .18923
+aline .15113 .18669
+aline .15113 .186055
+aline .14351 .170815
+aline .142875 .17018
+aline .133985 .1524
+aline .13335 .151765
+aline .131445 .147955
+bezier .137733 .140956 .149634 .13298 .154305 .122555
+bezier .172596 .887449E-01 .170568 .416004E-01 .140335 .014605
+bezier .116633 -.506619E-02 .837265E-01 -.560607E-02 .05588 .001905
+aline .04699 -.015875
+aline .046355 -.01651
+aline .037465 -.03429
+aline .03683 -.034925
+aline .03556 -.037465
+aline .03429 -.037465
+aline .03048 -.03556
+aline .029845 -.034925
+aline .024765 -.032385
+aline .024765 -.03175
+aline .032385 -.01651
+aline .03302 -.015875
+aline .04191 .001905
+aline .042545 .00254
+bezier .482819E-01 .867884E-02 .393564E-01 .011022 .03556 .014605
+bezier .275415E-02 .442783E-01 .248622E-02 .980652E-01 .02794 .13208
+bezier .502862E-01 .159336 .892597E-01 .163252 .120269 .152908
+aline .128905 .17018
+aline .12954 .170815
+aline .13843 .188595
+aline .139065 .18923
+aline .1397 .1905
+aline .140335 .19177
+closepath
+! end of curve
+
+! start of curve
+amove .08255 .145415
+bezier .583764E-01 .143188 .488686E-01 .117032 .050165 .09652
+aline .04953 .095885
+aline .04953 .05715
+bezier .507877E-01 .475693E-01 .508139E-01 .375888E-01 .05588 .028575
+bezier .738751E-01 .650466E-01 .949931E-01 .101176 .111125 .137795
+aline .109855 .139065
+aline .108585 .1397
+aline .10795 .140335
+aline .10287 .142875
+aline .09906 .144145
+aline .09652 .14478
+aline .093345 .145415
+aline .09271 .14605
+aline .083185 .14605
+closepath
+! end of curve
+
+! start of curve
+amove .11938 .12446
+bezier .101479 .886984E-01 .812018E-01 .528221E-01 .06477 .017145
+bezier .849664E-01 .907311E-03 .120643 .116817E-01 .123825 .03937
+aline .12446 .040005
+aline .12446 .04318
+aline .125095 .043815
+aline .125095 .047625
+aline .12573 .04826
+aline .12573 .056515
+aline .126365 .05715
+aline .126365 .095885
+bezier .12503 .105863 .125211 .116314 .120015 .12573
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=29 !-------------- Beginning of new char.
+dfont wid=.905559 hei=.686111 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .28702 .24003
+bezier .290768 .211573 .294108 .183742 .297815 .155575
+aline .28194 .155575
+bezier .278536 .178268 .276198 .211528 .24892 .21971
+aline .24765 .220345
+aline .24511 .22098
+aline .243205 .221615
+aline .24003 .22225
+aline .239395 .222885
+aline .23622 .222885
+aline .235585 .22352
+aline .230505 .22352
+aline .22987 .224155
+aline .193675 .224155
+aline .19304 .22352
+aline .19304 .123825
+bezier .208679 .1218 .233021 .122284 .236855 .14224
+aline .23749 .145415
+aline .238125 .14605
+aline .238125 .15113
+aline .23876 .151765
+aline .23876 .164465
+aline .254635 .164465
+aline .254635 .06604
+aline .23876 .06604
+bezier .239929 .818267E-01 .237098 .10419 .21717 .106045
+aline .216535 .10668
+aline .212725 .10668
+aline .21209 .107315
+aline .193675 .107315
+aline .19304 .10668
+aline .19304 .015875
+aline .193675 .01524
+aline .231775 .01524
+bezier .251937 .169945E-01 .275194 .276772E-01 .281305 .04953
+bezier .28669 .645094E-01 .289435 .804733E-01 .2921 .09525
+aline .307975 .09525
+bezier .302669 .632412E-01 .297447 .316234E-01 .2921 -.000635
+aline .122555 -.000635
+aline .122555 .01524
+aline .146685 .01524
+aline .14732 .015875
+aline .14732 .10668
+aline .146685 .107315
+aline .09525 .107315
+bezier .851842E-01 .777456E-01 .729667E-01 .484151E-01 .064008 .018796
+aline .06477 .018415
+aline .066675 .01778
+aline .06985 .017145
+aline .070485 .01651
+aline .07366 .01651
+aline .074295 .015875
+aline .08001 .015875
+aline .080645 .01524
+aline .090805 .01524
+aline .090805 -.000635
+aline .08382 -.000635
+aline .083185 0
+aline .05588 0
+aline .055245 .000635
+aline .04318 .000635
+aline .042545 0
+aline .019685 0
+aline .01905 -.000635
+aline .013335 -.000635
+aline .013335 .01524
+bezier .240241E-01 .015901 .361736E-01 .136368E-01 .04445 .02032
+bezier .685415E-01 .882521E-01 .947504E-01 .156241 .117475 .224155
+aline .094615 .224155
+aline .094615 .24003
+closepath
+! end of curve
+
+! start of curve
+amove .13716 .222885
+bezier .125541 .189778 .11212 .155637 .1016 .12319
+aline .146685 .12319
+aline .14732 .123825
+aline .14732 .22352
+aline .146685 .224155
+aline .137795 .224155
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=30 !-------------- Beginning of new char.
+dfont wid=1.01667 hei=.686111 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .153035 .24384
+bezier .166227 .242225 .179848 .241645 .19304 .24003
+aline .32639 .24003
+bezier .330138 .211573 .333478 .183742 .337185 .155575
+aline .32131 .155575
+bezier .318088 .178012 .315405 .209546 .28956 .219075
+aline .283845 .22098
+aline .281305 .221615
+aline .27813 .22225
+aline .277495 .222885
+aline .27432 .222885
+aline .273685 .22352
+aline .26797 .22352
+aline .267335 .224155
+aline .225425 .224155
+aline .22479 .22352
+aline .22479 .132715
+bezier .24285 .132307 .268308 .127442 .278765 .146685
+aline .2794 .14859
+aline .280035 .14986
+aline .28067 .1524
+aline .281305 .155575
+aline .28194 .15621
+aline .28194 .16129
+aline .282575 .161925
+aline .282575 .173355
+aline .29845 .173355
+aline .29845 .07493
+aline .282575 .07493
+bezier .284032 .910609E-01 .279475 .112938 .259715 .114935
+aline .25908 .11557
+aline .254 .11557
+aline .253365 .116205
+aline .225425 .116205
+aline .22479 .11557
+aline .22479 .015875
+aline .225425 .01524
+aline .26924 .01524
+bezier .290786 .168903E-01 .3156 .284035E-01 .32131 .05207
+bezier .326598 .661547E-01 .328819 .813255E-01 .33147 .09525
+aline .347345 .09525
+bezier .342039 .632412E-01 .336817 .316234E-01 .33147 -.000635
+aline .19304 -.000635
+bezier .152759 -.552177E-02 .105839 -.100807E-01 .070485 .01778
+bezier .279703E-01 .490571E-01 .195704E-01 .107739 .029845 .155575
+bezier .390638E-01 .204086 .835968E-01 .242845 .132715 .243205
+aline .13335 .24384
+aline .153035 .24384
+closepath
+! end of curve
+
+! start of curve
+amove .136525 .23114
+bezier .096927 .225801 .813777E-01 .179996 .078105 .146685
+bezier .760105E-01 .105318 .077635 .612441E-01 .10414 .02667
+bezier .120803 .635487E-02 .156467 -.125236E-02 .174625 .02032
+bezier .18371 .391498E-01 .180507 .597878E-01 .182245 .08001
+aline .182245 .159385
+bezier .179653 .181644 .186022 .207663 .16891 .225425
+aline .16764 .22606
+aline .167005 .226695
+aline .164465 .227965
+aline .15875 .22987
+aline .155575 .230505
+aline .15494 .23114
+aline .150495 .23114
+aline .14986 .231775
+aline .13716 .231775
+aline .136525 .23114
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=31 !-------------- Beginning of new char.
+dfont wid=.777781 hei=.734723 dep=.0486116 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .210185 .26035
+aline .211455 .259715
+aline .212725 .25908
+aline .21336 .258445
+aline .21717 .25654
+aline .217805 .255905
+aline .221615 .254
+bezier .216217 .243979 .208478 .23386 .205105 .22352
+bezier .251245 .191358 .260363 .127122 .24765 .076835
+bezier .23666 .307608E-01 .192721 -.354135E-02 .14605 -.00381
+bezier .123852 -.640886E-02 .999657E-01 -.124779E-02 .08001 .00762
+bezier .742106E-01 -.174604E-02 .695095E-01 -.127207E-01 .062865 -.020955
+aline .060325 -.019685
+aline .05969 -.01905
+aline .05588 -.017145
+aline .055245 -.01651
+aline .051435 -.014605
+bezier .574074E-01 -.505383E-02 .625749E-01 .507741E-02 .06858 .014605
+bezier .023275 .452804E-01 .133106E-01 .106185 .02413 .155575
+bezier .333101E-01 .204217 .777597E-01 .242883 .127 .243205
+bezier .149291 .245957 .172427 .240372 .19304 .231775
+bezier .198535 .241306 .203748 .251041 .20955 .26035
+closepath
+! end of curve
+
+! start of curve
+amove .12954 .23114
+bezier .982673E-01 .228966 .755054E-01 .200467 .07239 .17018
+aline .071755 .169545
+aline .071755 .16637
+aline .07112 .165735
+aline .07112 .16129
+aline .070485 .160655
+aline .070485 .154305
+aline .06985 .15367
+aline .06985 .14351
+aline .069215 .142875
+aline .069215 .09398
+bezier .705289E-01 .754861E-01 .725995E-01 .562734E-01 .081915 .038735
+bezier .11541 .962613E-01 .148588 .15416 .181398 .21209
+bezier .169369 .22673 .14767 .233719 .12954 .23114
+closepath
+! end of curve
+
+! start of curve
+amove .189865 .198755
+bezier .156628 .14155 .124174 .837802E-01 .090805 .02667
+bezier .120794 -.589873E-02 .18137 .540439E-02 .19558 .04826
+bezier .201175 .635838E-01 .202751 .785514E-01 .203835 .09398
+aline .203835 .142875
+bezier .202303 .161925 .200885 .18233 .1905 .200025
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=32 !-------------- Beginning of new char.
+dfont wid=.277779 hei=.444445 dep=0 italic=0
+dfont fby="L" kadd=-.337503
+dfont fby="l" kadd=-.277779
+set path ! start of curve
+newpath
+! start of curve
+amove .09779 .1397
+aline .098425 .137795
+aline .09906 .135255
+aline .099695 .13335
+aline .10033 .13081
+aline .100965 .128905
+aline .1016 .126365
+aline .102235 .12446
+bezier .706768E-01 .115427 .391999E-01 .106114 .00762 .097155
+aline .006985 .099695
+aline .00635 .1016
+aline .005715 .10414
+aline .00508 .106045
+aline .004445 .108585
+aline .00381 .11049
+aline .00381 .11303
+bezier .351828E-01 .121673 .663296E-01 .131802 .09779 .1397
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=33 !-------------- Beginning of new char.
+dfont wid=.305555 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .057785 .24638
+bezier .746695E-01 .24495 .853706E-01 .226381 .079375 .211455
+bezier .735929E-01 .167603 .677528E-01 .1246 .06096 .080645
+aline .05969 .079375
+aline .05842 .07874
+aline .048895 .07874
+bezier .424459E-01 .833225E-01 .459369E-01 .928866E-01 .04318 .09906
+bezier .384748E-01 .141936 .300285E-01 .183262 .02667 .226695
+bezier .291753E-01 .237387 .389007E-01 .244826 .04953 .24638
+closepath
+! end of curve
+
+! start of curve
+amove .057785 .05334
+bezier .814791E-01 .506557E-01 .893029E-01 .158582E-01 .06858 .00381
+bezier .04954 -.106106E-01 .202531E-01 .102563E-01 .027305 .03302
+aline .028575 .03683
+aline .03048 .04064
+aline .031115 .041275
+aline .03175 .042545
+aline .037465 .04826
+aline .038735 .048895
+aline .03937 .04953
+aline .04318 .051435
+aline .04699 .052705
+aline .04953 .05334
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=34 !-------------- Beginning of new char.
+dfont wid=.544446 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .04318 .24257
+bezier .683164E-01 .237347 .747374E-01 .206255 .06985 .18542
+bezier .675523E-01 .159341 .521829E-01 .135567 .03175 .120015
+aline .02921 .120015
+aline .02794 .12065
+aline .02413 .12446
+aline .023495 .12573
+aline .023495 .127635
+bezier .431338E-01 .144741 .589787E-01 .169713 .05842 .196215
+bezier .441879E-01 .180568 .138132E-01 .189663 .012065 .211455
+bezier .984302E-02 .225767 .196989E-01 .240624 .03429 .24257
+closepath
+! end of curve
+
+! start of curve
+amove .127 .24257
+bezier .152136 .237347 .158557 .206255 .15367 .18542
+bezier .151372 .159341 .136003 .135567 .11557 .120015
+aline .11303 .120015
+aline .11176 .12065
+aline .10795 .12446
+aline .107315 .12573
+aline .107315 .127635
+bezier .126954 .144741 .142799 .169713 .14224 .196215
+bezier .128008 .180568 .976332E-01 .189663 .095885 .211455
+bezier .093663 .225767 .103519 .240624 .11811 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=35 !-------------- Beginning of new char.
+dfont wid=.833336 hei=.694445 dep=.194443 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .14859 .24257
+aline .150495 .241935
+aline .153035 .240665
+aline .154305 .239395
+aline .15494 .238125
+aline .155575 .23749
+aline .156845 .23495
+bezier .15148 .202193 .140386 .170224 .132715 .137795
+aline .13208 .13716
+aline .132715 .136525
+aline .18669 .136525
+bezier .19706 .170465 .203379 .206164 .215265 .239395
+bezier .222168 .247202 .236248 .240096 .23368 .22987
+bezier .225938 .198865 .216702 .166703 .20955 .136525
+aline .26289 .136525
+bezier .273984 .135748 .276125 .118866 .26543 .11557
+aline .2032 .11557
+aline .19558 .08509
+aline .194945 .083185
+aline .18923 .060325
+aline .188807 .059055
+aline .18923 .057785
+aline .26543 .057785
+bezier .276125 .544892E-01 .273984 .376074E-01 .26289 .03683
+aline .18288 .03683
+bezier .17251 .289037E-02 .166191 -.328087E-01 .154305 -.06604
+bezier .147403 -.738469E-01 .133322 -.667406E-01 .13589 -.056515
+bezier .143632 -.255104E-01 .152868 .665201E-02 .16002 .03683
+aline .106045 .03683
+bezier .956754E-01 .289038E-02 .893563E-01 -.328087E-01 .07747 -.06604
+bezier .705675E-01 -.738469E-01 .564867E-01 -.667406E-01 .059055 -.056515
+bezier .667966E-01 -.255104E-01 .076033 .665201E-02 .083185 .03683
+aline .029845 .03683
+bezier .187505E-01 .376074E-01 .166104E-01 .544892E-01 .027305 .057785
+aline .089535 .057785
+aline .097155 .088265
+aline .09779 .09017
+aline .103505 .11303
+aline .103928 .1143
+aline .103505 .11557
+aline .027305 .11557
+bezier .166104E-01 .118866 .187505E-01 .135748 .029845 .136525
+aline .109855 .136525
+bezier .120225 .170465 .126544 .206164 .13843 .239395
+aline .1397 .240665
+aline .14224 .241935
+aline .144145 .24257
+closepath
+! end of curve
+
+! start of curve
+amove .12573 .11303
+aline .125095 .11049
+aline .118745 .08509
+aline .11811 .083185
+aline .112395 .060325
+aline .111972 .059055
+aline .112395 .057785
+aline .16637 .057785
+aline .17399 .088265
+aline .174625 .09017
+aline .18034 .11303
+aline .180763 .1143
+aline .18034 .11557
+aline .126365 .11557
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=36 !-------------- Beginning of new char.
+dfont wid=.500002 hei=.75 dep=.0555553 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .095885 .262255
+aline .095885 .244475
+bezier .125433 .243734 .154542 .219464 .155575 .188595
+bezier .158971 .17357 .147803 .157035 .131445 .159385
+bezier .10985 .160365 .105079 .193837 .125095 .201295
+aline .128905 .202565
+aline .13462 .202565
+bezier .130281 .217171 .110884 .227918 .095885 .22733
+aline .095885 .14986
+bezier .128826 .143809 .153653 .113579 .155575 .080645
+bezier .15894 .476489E-01 .142804 .908103E-02 .10795 0
+aline .10287 -.00127
+aline .099695 -.001905
+aline .09652 -.001905
+aline .095885 -.00254
+aline .095885 -.02032
+aline .08001 -.02032
+aline .08001 -.00254
+bezier .494031E-01 -.148379E-02 .207067E-01 .256461E-01 .020955 .05715
+bezier .173795E-01 .690444E-01 .233735E-01 .844275E-01 .03683 .086995
+bezier .053802 .911794E-01 .692004E-01 .732249E-01 .06223 .05715
+bezier .590111E-01 .047786 .488691E-01 .437081E-01 .040005 .04318
+bezier .460653E-01 .269223E-01 .624758E-01 .147301E-01 .08001 .014605
+aline .08001 .102235
+bezier .424417E-01 .107501 .148584E-01 .145906 .020955 .182245
+bezier .208878E-01 .214082 .483957E-01 .242554 .08001 .244475
+aline .08001 .262255
+aline .095885 .262255
+closepath
+! end of curve
+
+! start of curve
+amove .07747 .22733
+bezier .455637E-01 .223439 .372442E-01 .176987 .0635 .160655
+aline .06477 .159385
+aline .06858 .15748
+aline .069215 .156845
+aline .07112 .15621
+aline .07366 .15494
+aline .07874 .15367
+aline .079375 .153035
+aline .08001 .15367
+aline .08001 .22733
+aline .07874 .227753
+aline .07747 .22733
+closepath
+! end of curve
+
+! start of curve
+amove .095885 .09779
+aline .095885 .014605
+bezier .123374 .168748E-01 .135095 .518947E-01 .12446 .074295
+bezier .119566 .859988E-01 .108637 .965252E-01 .095885 .09779
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=37 !-------------- Beginning of new char.
+dfont wid=.833336 hei=.75 dep=.0555553 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .078105 .262255
+bezier .965322E-01 .258942 .106399 .240679 .123825 .23495
+bezier .156704 .21802 .202308 .224693 .22352 .257175
+bezier .229543 .267705 .246473 .26053 .243205 .24892
+bezier .184826 .159474 .126018 .703362E-01 .066675 -.018415
+bezier .559093E-01 -.264992E-01 .431672E-01 -.010288 .052705 -.00127
+bezier .101871 .724066E-01 .150224 .146668 .19939 .220345
+bezier .171619 .210406 .140489 .212484 .113574 .225697
+bezier .118719 .193586 .121631 .153754 .09525 .128905
+bezier .701608E-01 .109462 .335669E-01 .129465 .0254 .15748
+bezier .163093E-01 .188372 .169091E-01 .226891 .04191 .250825
+bezier .517745E-01 .259492 .652391E-01 .263115 .078105 .262255
+closepath
+! end of curve
+
+! start of curve
+amove .070485 .249555
+bezier .566069E-01 .243018 .575255E-01 .225652 .05588 .21336
+aline .05588 .17018
+bezier .057282 .157446 .570024E-01 .140099 .07112 .13335
+bezier .919083E-01 .133088 .974779E-01 .158738 .10033 .174625
+bezier .101525 .198967 .102793 .227849 .08382 .24638
+aline .08255 .247015
+aline .081915 .24765
+aline .079375 .24892
+aline .076835 .249555
+aline .0762 .25019
+aline .07112 .25019
+aline .070485 .249555
+closepath
+! end of curve
+
+! start of curve
+amove .112395 .22606
+aline .11303 .225425
+aline .113665 .22606
+aline .11303 .226695
+aline .112395 .22606
+closepath
+! end of curve
+
+! start of curve
+amove .198755 .22098
+aline .19939 .220345
+aline .200025 .22098
+aline .19939 .221615
+aline .198755 .22098
+closepath
+! end of curve
+
+! start of curve
+amove .23368 .12065
+bezier .260954 .115854 .27116 .845731E-01 .272415 .06096
+bezier .273447 .331158E-01 .271022 -.16946E-02 .24384 -.017145
+bezier .213597 -.301832E-01 .181722 -.291739E-02 .1778 .027305
+bezier .172199 .587384E-01 .176361 .101158 .20955 .11684
+aline .21717 .11938
+aline .21971 .120015
+aline .222885 .120015
+aline .22352 .12065
+closepath
+! end of curve
+
+! start of curve
+amove .22606 .10795
+bezier .212182 .101413 .213101 .840473E-01 .211455 .071755
+aline .211455 .028575
+bezier .212857 .158407E-01 .212577 -.150608E-02 .226695 -.008255
+bezier .247483 -.85166E-02 .253053 .171334E-01 .255905 .03302
+bezier .2571 .573619E-01 .258368 .862439E-01 .239395 .104775
+aline .238125 .10541
+aline .23749 .106045
+aline .23495 .107315
+aline .23241 .10795
+aline .231775 .108585
+aline .226695 .108585
+aline .22606 .10795
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=38 !-------------- Beginning of new char.
+dfont wid=.777781 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .113665 .24638
+bezier .143069 .239532 .15102 .197747 .13462 .17526
+bezier .12575 .159377 .112026 .146993 .100489 .133033
+bezier .113311 .102817 .133402 .775099E-01 .153035 .05207
+bezier .173047 .777276E-01 .189752 .106781 .204682 .135467
+aline .202565 .136525
+aline .19939 .13716
+aline .198755 .137795
+aline .194945 .137795
+aline .19431 .13843
+aline .188595 .13843
+aline .18796 .139065
+aline .1778 .139065
+aline .1778 .15494
+aline .18542 .15494
+aline .186055 .154305
+aline .215265 .154305
+aline .2159 .15367
+aline .22733 .15367
+aline .227965 .154305
+aline .24892 .154305
+aline .249555 .15494
+aline .254635 .15494
+aline .254635 .139065
+bezier .243516 .138275 .230758 .140902 .22225 .13335
+bezier .204149 .101237 .186289 .689506E-01 .163354 .403225E-01
+bezier .176888 .236927E-01 .199097 .267823E-02 .221615 .015875
+bezier .230386 .206457E-01 .236383 .301455E-01 .236855 .040005
+aline .25273 .040005
+bezier .253572 .114955E-01 .22194 -.960581E-02 .19558 -.00381
+bezier .175033 -.399793E-02 .155386 .836559E-02 .13843 .017145
+bezier .105774 -.112412E-01 .466016E-01 -.148388E-01 .020955 .024765
+bezier .925783E-02 .446487E-01 .158867E-01 .716831E-01 .03429 .08509
+aline .064135 .114935
+bezier .602034E-01 .131834 .522422E-01 .149587 .05207 .167005
+bezier .453172E-01 .195474 .057762 .229697 .08636 .241935
+aline .095885 .24511
+aline .09906 .245745
+aline .102235 .245745
+aline .10287 .24638
+closepath
+! end of curve
+
+! start of curve
+amove .106045 .23368
+bezier .892354E-01 .22931 .851525E-01 .207329 .086995 .19304
+bezier .871687E-01 .177298 .904431E-01 .16196 .095885 .146685
+bezier .113702 .165666 .134419 .191059 .12446 .21844
+aline .12319 .22225
+aline .120015 .2286
+aline .11684 .231775
+aline .1143 .233045
+aline .112395 .23368
+aline .11176 .234315
+aline .10668 .234315
+aline .106045 .23368
+closepath
+! end of curve
+
+! start of curve
+amove .06985 .10287
+bezier .558182E-01 .792783E-01 .577598E-01 .501871E-01 .06477 .024765
+bezier .067351 .147226E-01 .078203 .891143E-02 .08763 .012065
+bezier .101453 .131293E-01 .116118 .188723E-01 .126841 .276225E-01
+bezier .103875 .495857E-01 .845472E-01 .748387E-01 .070485 .103505
+aline .06985 .10287
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=39 !-------------- Beginning of new char.
+dfont wid=.277779 hei=.694445 dep=0 italic=0
+dfont fby=33 kadd=.111112
+dfont fby=39 ligrep=34
+dfont fby="?" kadd=.111112
+set path ! start of curve
+newpath
+! start of curve
+amove .05334 .24257
+bezier .784765E-01 .237347 .848974E-01 .206255 .08001 .18542
+bezier .777123E-01 .159341 .623429E-01 .135567 .04191 .120015
+aline .03937 .120015
+aline .0381 .12065
+aline .03429 .12446
+aline .033655 .12573
+aline .033655 .127635
+bezier .532938E-01 .144741 .691387E-01 .169713 .06858 .196215
+bezier .543479E-01 .180568 .239732E-01 .189663 .022225 .211455
+bezier .020003 .225767 .298589E-01 .240624 .04445 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=40 !-------------- Beginning of new char.
+dfont wid=.38889 hei=.75 dep=.25 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .11303 .262255
+bezier .12154 .257097 .109611 .249786 .10668 .244475
+bezier .777676E-01 .204779 .685149E-01 .154471 .06604 .108585
+aline .06604 .06477
+bezier .686287E-01 .144762E-01 .798793E-01 -.424546E-01 .116205 -.08255
+aline .116205 -.08636
+aline .1143 -.088265
+aline .11303 -.0889
+aline .107315 -.0889
+bezier .573033E-01 -.518587E-01 .349235E-01 .013956 .032385 .07239
+bezier .304417E-01 .127177 .411213E-01 .184286 .07493 .22987
+bezier .844788E-01 .241508 .949671E-01 .253469 .107315 .262255
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=")" !-------------- Beginning of new char.
+dfont wid=.38889 hei=.75 dep=.25 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .02921 .262255
+bezier .792217E-01 .225214 .101602 .159399 .10414 .100965
+bezier .106083 .461781E-01 .954037E-01 -.010931 .061595 -.056515
+bezier .520462E-01 -.068153 .415579E-01 -.801135E-01 .02921 -.0889
+aline .023495 -.0889
+bezier .151658E-01 -.841361E-01 .261049E-01 -.773516E-01 .028575 -.07239
+bezier .587649E-01 -.329163E-01 .678682E-01 .184509E-01 .070485 .06477
+aline .070485 .108585
+bezier .681279E-01 .159203 .560967E-01 .215853 .02032 .25654
+aline .02032 .25908
+aline .020955 .26035
+aline .022225 .26162
+aline .023495 .262255
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="*" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.75 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .090805 .262255
+bezier .102198 .261298 .106228 .248041 .1016 .239395
+bezier .100151 .225004 .960755E-01 .211136 .09525 .19685
+bezier .108357 .208303 .120314 .221351 .13462 .23114
+bezier .151852 .235529 .162292 .206465 .144145 .201295
+bezier .130388 .195476 .113872 .190994 .102023 .183938
+bezier .118169 .176644 .136225 .172624 .15113 .163195
+bezier .160533 .150981 .144448 .130873 .13081 .1397
+bezier .119065 .150645 .106895 .161001 .09525 .172085
+bezier .965891E-01 .153937 .101767 .136571 .103505 .11811
+bezier .100895 .100622 .691214E-01 .104405 .073025 .12192
+bezier .747042E-01 .138756 .794263E-01 .155277 .080645 .172085
+bezier .675381E-01 .160632 .555814E-01 .147584 .041275 .137795
+bezier .024043 .133406 .136033E-01 .16247 .03175 .16764
+bezier .455063E-01 .173459 .620239E-01 .177941 .738717E-01 .184997
+bezier .577262E-01 .192291 .396703E-01 .196311 .024765 .20574
+bezier .015362 .217954 .314468E-01 .238062 .045085 .229235
+bezier .568305E-01 .21829 .689999E-01 .207934 .080645 .19685
+bezier .792145E-01 .214939 .742169E-01 .232742 .07239 .250825
+aline .07366 .254635
+aline .074295 .25527
+aline .07493 .25654
+aline .07747 .25908
+aline .07874 .259715
+aline .079375 .26035
+aline .080645 .260985
+aline .08255 .26162
+aline .08509 .262255
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="+" !-------------- Beginning of new char.
+dfont wid=.777781 hei=.583334 dep=.083334 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .139065 .203835
+aline .14097 .2032
+aline .14351 .20193
+aline .14478 .20066
+aline .145415 .19939
+aline .14605 .198755
+aline .14732 .196215
+aline .14732 .09779
+aline .147955 .097155
+aline .244475 .097155
+bezier .255487 .955195E-01 .255487 .778354E-01 .244475 .0762
+aline .147955 .0762
+aline .14732 .075565
+aline .14732 -.02286
+bezier .144704 -.329683E-01 .128981 -.329683E-01 .126365 -.02286
+aline .126365 .075565
+aline .12573 .0762
+aline .028575 .0762
+bezier .175626E-01 .778354E-01 .175626E-01 .955195E-01 .028575 .097155
+aline .12573 .097155
+aline .126365 .09779
+aline .126365 .196215
+aline .127635 .198755
+aline .12827 .19939
+aline .128905 .20066
+aline .130175 .20193
+aline .132715 .2032
+aline .13462 .203835
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="," !-------------- Beginning of new char.
+dfont wid=.277779 hei=.155556 dep=.194445 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .05334 .05334
+bezier .799179E-01 .469771E-01 .827695E-01 .140048E-01 .07874 -.00762
+bezier .742245E-01 -.318291E-01 .613707E-01 -.544106E-01 .04191 -.069215
+aline .03937 -.069215
+aline .0381 -.06858
+aline .03429 -.06477
+aline .033655 -.0635
+aline .033655 -.061595
+bezier .052587 -.446682E-01 .671559E-01 -.197832E-01 .06731 .005715
+bezier .524954E-01 -.82227E-02 .239695E-01 .114251E-02 .022225 .022225
+bezier .190755E-01 .04003 .354887E-01 .566721E-01 .05334 .05334
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="-" !-------------- Beginning of new char.
+dfont wid=.333334 hei=.444445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .09652 .09398
+aline .09652 .060325
+aline .004445 .060325
+aline .004445 .09398
+aline .09652 .09398
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="." !-------------- Beginning of new char.
+dfont wid=.277779 hei=.155556 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .05334 .05334
+bezier .770409E-01 .506488E-01 .849186E-01 .158493E-01 .064135 .00381
+bezier .045972 -.982129E-02 .179452E-01 .830744E-02 .022225 .03048
+aline .023495 .03556
+aline .026035 .04064
+aline .02667 .041275
+aline .027305 .042545
+aline .03302 .04826
+aline .03429 .048895
+aline .034925 .04953
+aline .038735 .051435
+aline .042545 .052705
+aline .045085 .05334
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="/" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.75 dep=.25 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .14732 .262255
+aline .149225 .26162
+aline .151765 .26035
+aline .153035 .25908
+aline .15367 .25781
+aline .154305 .257175
+aline .155575 .254635
+bezier .151571 .23103 .140423 .208503 .13335 .18542
+bezier .101733 .953065E-01 .717542E-01 .432363E-02 .038735 -.08509
+bezier .311266E-01 -.937709E-01 .160104E-01 -.840792E-01 .020955 -.07366
+bezier .591797E-01 .366543E-01 .097135 .14708 .13589 .257175
+aline .1397 .260985
+aline .14097 .26162
+aline .142875 .262255
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="0" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.644444 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .094615 .229235
+bezier .125388 .227775 .149656 .20243 .155575 .17272
+bezier .15969 .158585 .159751 .144901 .16129 .13081
+aline .16129 .092075
+bezier .160093 .588015E-01 .152139 .151123E-01 .116205 .000635
+bezier .825477E-01 -.133075E-01 .372894E-01 .5111E-03 .024765 .037465
+bezier .170704E-01 .551617E-01 .161458E-01 .740667E-01 .014605 .092075
+aline .014605 .13081
+bezier .159858E-01 .164538 .236073E-01 .209576 .060325 .224155
+aline .06223 .22479
+aline .0635 .225425
+aline .065405 .22606
+aline .067945 .226695
+aline .06985 .22733
+aline .0762 .2286
+aline .080645 .2286
+aline .08128 .229235
+aline .094615 .229235
+closepath
+! end of curve
+
+! start of curve
+amove .08382 .216535
+bezier .662406E-01 .213163 .059852 .193486 .05969 .178435
+aline .05969 .16129
+aline .059055 .160655
+aline .059055 .069215
+bezier .607635E-01 .494562E-01 .570182E-01 .250666E-01 .075565 .01143
+bezier .923056E-01 -.415749E-04 .112099 .016559 .1143 .03429
+aline .114935 .034925
+aline .114935 .03937
+aline .11557 .040005
+aline .11557 .048895
+aline .116205 .04953
+aline .116205 .06858
+aline .11684 .069215
+aline .11684 .160655
+bezier .115358 .178594 .118244 .200333 .1016 .212725
+aline .09652 .215265
+aline .094615 .2159
+aline .092075 .216535
+aline .09144 .21717
+aline .084455 .21717
+aline .08382 .216535
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="1" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.644444 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .106045 .229235
+aline .107315 .2286
+aline .108585 .227965
+aline .10922 .22733
+aline .11049 .22479
+aline .11049 .015875
+aline .111125 .01524
+aline .15113 .01524
+aline .15113 -.000635
+aline .140335 -.000635
+aline .1397 0
+aline .099695 0
+aline .09906 .000635
+aline .080645 .000635
+aline .08001 0
+aline .04064 0
+aline .040005 -.000635
+aline .029845 -.000635
+aline .029845 .01524
+aline .06858 .01524
+aline .069215 .015875
+aline .069215 .196215
+bezier .545745E-01 .192657 .399877E-01 .190653 .024765 .1905
+aline .024765 .206375
+bezier .498385E-01 .206663 .773685E-01 .211223 .097155 .229235
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="2" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.644444 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .09144 .229235
+bezier .123133 .22772 .155293 .202902 .15748 .169545
+bezier .161703 .130496 .12674 .104793 .10033 .08255
+aline .094615 .076835
+aline .093345 .0762
+aline .079375 .06223
+aline .078105 .061595
+aline .0635 .04699
+aline .06223 .046355
+aline .059055 .04318
+aline .05969 .042545
+aline .1143 .042545
+aline .114935 .04318
+aline .127 .04318
+bezier .138604 .429059E-01 .137276 .589799E-01 .140335 .066675
+aline .140335 .06985
+aline .14097 .070485
+aline .14097 .074295
+aline .141605 .076835
+aline .15748 .076835
+bezier .153857 .509622E-01 .150306 .255461E-01 .146685 -.000635
+aline .018415 -.000635
+aline .018415 .012065
+bezier .047635 .544679E-01 .890473E-01 .894077E-01 .106045 .1397
+bezier .112031 .162554 .111535 .192763 .09144 .208915
+bezier .772157E-01 .217993 .055743 .212046 .04699 .200025
+bezier .709929E-01 .198216 .758594E-01 .161215 .053975 .1524
+bezier .395792E-01 .145903 .204594E-01 .154579 .018415 .170815
+bezier .146789E-01 .203158 .467809E-01 .227725 .0762 .229235
+aline .09144 .229235
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="3" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.644444 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .09144 .229235
+bezier .116346 .228345 .147092 .214898 .15113 .18669
+bezier .154413 .157618 .131975 .131558 .10541 .122555
+bezier .137408 .118429 .16632 .088065 .16002 .055245
+bezier .158788 .198287E-01 .122747 -.372376E-02 .090805 -.004445
+bezier .594638E-01 -.776959E-02 .196377E-01 .837024E-02 .01524 .04318
+bezier .113842E-01 .605394E-01 .281778E-01 .785369E-01 .045085 .074295
+bezier .711248E-01 .740049E-01 .766447E-01 .325218E-01 .052705 .02413
+aline .051435 .023495
+aline .04953 .02286
+aline .473529E-01 .223157E-01
+bezier .574121E-01 .127809E-01 .745309E-01 .798488E-02 .088265 .01143
+bezier .103405 .016624 .105905 .346731E-01 .107315 .047625
+aline .107315 .078105
+bezier .106275 .923873E-01 .101662 .112195 .084455 .11557
+aline .06223 .11557
+aline .06096 .116205
+aline .059055 .11811
+aline .059055 .125095
+bezier .689505E-01 .131649 .844043E-01 .124829 .09271 .136525
+bezier .104711 .1572 .105991 .181936 .10033 .20447
+bezier .910277E-01 .224837 .605128E-01 .215909 .0508 .202565
+bezier .750217E-01 .202736 .807472E-01 .16643 .05969 .156845
+bezier .456938E-01 .150445 .266168E-01 .158549 .024765 .174625
+bezier .214861E-01 .203359 .483563E-01 .227487 .075565 .229235
+aline .09144 .229235
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="4" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.644444 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .133985 .22987
+aline .135255 .229235
+aline .136525 .2286
+aline .13716 .227965
+aline .13843 .225425
+aline .13843 .07112
+aline .139065 .070485
+aline .165735 .070485
+aline .165735 .05461
+aline .139065 .05461
+aline .13843 .053975
+aline .13843 .015875
+aline .139065 .01524
+aline .165735 .01524
+aline .165735 -.000635
+aline .15748 -.000635
+aline .156845 0
+aline .12446 0
+aline .123825 .000635
+aline .108585 .000635
+aline .10795 0
+aline .07112 0
+aline .070485 -.000635
+aline .06096 -.000635
+aline .06096 .01524
+aline .094615 .01524
+aline .09525 .015875
+aline .09525 .053975
+aline .094615 .05461
+aline .01016 .05461
+bezier .967684E-02 .064241 .924806E-02 .739444E-01 .017145 .080645
+bezier .521138E-01 .130084 .857687E-01 .180943 .12192 .229235
+aline .12319 .22987
+closepath
+! end of curve
+
+! start of curve
+amove .09779 .172085
+bezier .749632E-01 .138117 .04897 .104604 .02794 .070485
+aline .098425 .070485
+aline .09906 .07112
+aline .09906 .172085
+aline .098425 .17272
+aline .09779 .172085
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="5" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.644444 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .0381 .229235
+bezier .703482E-01 .214118 .106189 .21401 .13843 .229235
+bezier .148005 .229517 .144055 .216912 .1397 .212725
+bezier .121125 .183907 .841349E-01 .169491 .517525E-01 .176292
+aline .050165 .175895
+aline .050165 .132715
+bezier .589105E-01 .136609 .696162E-01 .142494 .08001 .142875
+bezier .115631 .14754 .154107 .121547 .15621 .08382
+bezier .164272 .489459E-01 .142427 .828723E-02 .106045 -.000635
+bezier .790454E-01 -.927936E-02 .444656E-01 -.487298E-02 .028575 .02159
+bezier .181498E-01 .373194E-01 .107673E-01 .651863E-01 .03048 .076835
+bezier .437089E-01 .831512E-01 .623507E-01 .763126E-01 .06477 .060325
+bezier .676487E-01 .461058E-01 .559905E-01 .320735E-01 .04191 .032385
+bezier .041076 .280759E-01 .488798E-01 .212882E-01 .05334 .01778
+bezier .708182E-01 .327459E-02 .102549 .101814E-01 .106045 .034925
+aline .10668 .0381
+aline .107315 .038735
+aline .107315 .04318
+aline .10795 .043815
+aline .10795 .051435
+aline .108585 .05207
+aline .108585 .093345
+bezier .107862 .107099 .10637 .126609 .089535 .13081
+bezier .071705 .131965 .539848E-01 .122637 .04445 .107315
+aline .04318 .10668
+aline .03683 .10668
+aline .03556 .107315
+aline .03302 .109855
+aline .032385 .111125
+aline .032385 .22606
+aline .03302 .22733
+aline .03429 .2286
+aline .03556 .229235
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="6" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.644444 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .113665 .229235
+bezier .140247 .228379 .160345 .196899 .14859 .17272
+bezier .138492 .157454 .111165 .162232 .108585 .180975
+bezier .105897 .194084 .116715 .206956 .12954 .20701
+bezier .107833 .230189 .705665E-01 .207141 .06731 .17907
+bezier .637123E-01 .163093 .624958E-01 .145582 .0635 .128905
+bezier .688462E-01 .139416 .813996E-01 .147421 .09271 .145415
+bezier .128543 .149036 .159811 .115412 .160655 .08128
+bezier .161744 .594961E-01 .159509 .365049E-01 .144145 .019685
+bezier .115296 -.169011E-01 .501414E-01 -.117682E-01 .029845 .031115
+bezier .128043E-01 .660364E-01 .138213E-01 .105156 .017145 .14224
+bezier .221042E-01 .18421 .543519E-01 .226771 .09906 .2286
+aline .099695 .229235
+aline .113665 .229235
+closepath
+! end of curve
+
+! start of curve
+amove .084455 .132715
+bezier .676553E-01 .127829 .659814E-01 .106384 .0635 .09271
+aline .0635 .083185
+aline .062865 .08255
+aline .062865 .06223
+bezier .640496E-01 .457242E-01 .616375E-01 .254589E-01 .076835 .01397
+bezier .915683E-01 .322026E-02 .112843 .165579E-01 .112395 .033655
+aline .112395 .043815
+aline .11303 .04445
+aline .11303 .1016
+bezier .113 .113542 .110587 .129776 .095885 .132715
+aline .09525 .13335
+aline .08509 .13335
+aline .084455 .132715
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="7" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.644444 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .04826 .236855
+bezier .508014E-01 .226363 .640013E-01 .227839 .071755 .22606
+aline .08255 .22606
+aline .083185 .225425
+aline .17018 .225425
+aline .17018 .213995
+bezier .151691 .185158 .127102 .160512 .11176 .12954
+bezier .102231 .103297 .101236 .776587E-01 .099695 .0508
+aline .099695 .013335
+bezier .974842E-01 -.87296E-02 .619135E-01 -.107614E-01 .05715 .010795
+bezier .524063E-01 .729287E-01 .859474E-01 .132767 .12446 .179705
+aline .125095 .180975
+aline .12573 .18161
+aline .125095 .182245
+aline .065405 .182245
+aline .06477 .18161
+aline .051435 .18161
+bezier .396342E-01 .182022 .404717E-01 .165959 .037465 .158115
+aline .037465 .15494
+aline .03683 .154305
+aline .03683 .150495
+aline .036195 .147955
+aline .02032 .147955
+bezier .242835E-01 .177612 .288432E-01 .207023 .032385 .236855
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="8" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.644444 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .09652 .229235
+bezier .121495 .228227 .149512 .210865 .15113 .183515
+bezier .154276 .160993 .139662 .140429 .120809 .129858
+bezier .146069 .116258 .165187 .869822E-01 .16002 .057785
+bezier .159904 .237473E-01 .128135 -.345663E-02 .095885 -.004445
+bezier .063764 -.738005E-02 .237693E-01 .634637E-02 .01651 .04191
+bezier .938626E-02 .06954 .251364E-01 .988529E-01 .050165 .11176
+aline .0508 .112395
+aline .529167E-01 .113453
+bezier .401218E-01 .124712 .025467 .14064 .0254 .16002
+bezier .191687E-01 .192599 .452293E-01 .228655 .08001 .2286
+aline .080645 .229235
+aline .09652 .229235
+closepath
+! end of curve
+
+! start of curve
+amove .08128 .2159
+bezier .637857E-01 .216365 .448361E-01 .199812 .051435 .18161
+bezier .585498E-01 .163787 .794459E-01 .15862 .093345 .14732
+bezier .983115E-01 .145292 .103132 .1381 .108585 .140335
+bezier .132419 .159151 .132728 .205015 .10033 .21463
+aline .09779 .215265
+aline .097155 .2159
+aline .093345 .2159
+aline .09271 .216535
+aline .081915 .216535
+aline .08128 .2159
+closepath
+! end of curve
+
+! start of curve
+amove .067945 .10414
+bezier .394968E-01 .837444E-01 .348556E-01 .308763E-01 .069215 .01397
+bezier .921089E-01 .352878E-02 .127466 .013962 .13081 .04191
+bezier .133627 .626271E-01 .115064 .761853E-01 .09906 .08509
+bezier .886467E-01 .909804E-01 .778955E-01 .997168E-01 .067945 .10414
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="9" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.644444 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .09652 .229235
+bezier .133623 .226095 .155861 .187807 .158115 .15367
+aline .15875 .153035
+aline .15875 .14859
+aline .159385 .147955
+aline .159385 .141605
+aline .16002 .14097
+aline .16002 .131445
+aline .160655 .13081
+aline .160655 .10033
+bezier .159597 .574329E-01 .136578 .57239E-02 .0889 -.003175
+bezier .653913E-01 -.841316E-02 .342123E-01 -.116784E-02 .026035 .024765
+bezier .211821E-01 .381392E-01 .239968E-01 .576285E-01 .04064 .06096
+aline .0508 .06096
+bezier .727734E-01 .572213E-01 .726591E-01 .022054 .0508 .018415
+aline .04953 .01778
+bezier .684223E-01 .214724E-02 .979374E-01 .01206 .106045 .034925
+bezier .112667 .546514E-01 .113141 .753392E-01 .112395 .095885
+bezier .107078 .853345E-01 .944973E-01 .773662E-01 .083185 .079375
+bezier .471599E-01 .758143E-01 .158421E-01 .109817 .01524 .144145
+bezier .143055E-01 .164661 .160594E-01 .186138 .029845 .202565
+bezier .423331E-01 .21806 .612253E-01 .228546 .080645 .229235
+aline .09652 .229235
+closepath
+! end of curve
+
+! start of curve
+amove .08509 .2159
+bezier .677484E-01 .214749 .061803 .195057 .0635 .18034
+aline .062865 .179705
+aline .062865 .123825
+bezier .630176E-01 .111851 .065123 .950494E-01 .08001 .092075
+bezier .947489E-01 .870841E-01 .106884 .101131 .10922 .114935
+bezier .114842 .14028 .113496 .168518 .111125 .19431
+bezier .10858 .206134 .980761E-01 .219738 .08509 .2159
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=":" !-------------- Beginning of new char.
+dfont wid=.277779 hei=.444445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .05334 .15494
+bezier .770409E-01 .152249 .849186E-01 .117449 .064135 .10541
+bezier .459719E-01 .917788E-01 .179451E-01 .109908 .022225 .13208
+aline .023495 .13716
+aline .026035 .14224
+aline .02667 .142875
+aline .027305 .144145
+aline .03302 .14986
+aline .03429 .150495
+aline .034925 .15113
+aline .038735 .153035
+aline .042545 .154305
+aline .045085 .15494
+closepath
+! end of curve
+
+! start of curve
+amove .05334 .05334
+bezier .770409E-01 .506488E-01 .849186E-01 .158493E-01 .064135 .00381
+bezier .045972 -.982129E-02 .179452E-01 .830744E-02 .022225 .03048
+aline .023495 .03556
+aline .026035 .04064
+aline .02667 .041275
+aline .027305 .042545
+aline .03302 .04826
+aline .03429 .048895
+aline .034925 .04953
+aline .038735 .051435
+aline .042545 .052705
+aline .045085 .05334
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=";" !-------------- Beginning of new char.
+dfont wid=.277779 hei=.444445 dep=.194445 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .05334 .15494
+bezier .770409E-01 .152249 .849186E-01 .117449 .064135 .10541
+bezier .459719E-01 .917788E-01 .179451E-01 .109908 .022225 .13208
+aline .023495 .13716
+aline .026035 .14224
+aline .02667 .142875
+aline .027305 .144145
+aline .03302 .14986
+aline .03429 .150495
+aline .034925 .15113
+aline .038735 .153035
+aline .042545 .154305
+aline .045085 .15494
+closepath
+! end of curve
+
+! start of curve
+amove .05334 .05334
+bezier .777064E-01 .468942E-01 .798007E-01 .154784E-01 .0762 -.004445
+bezier .738788E-01 -.294697E-01 .607157E-01 -.530992E-01 .04191 -.069215
+aline .03937 -.069215
+aline .0381 -.06858
+aline .03429 -.06477
+aline .033655 -.0635
+bezier .372713E-01 -.543919E-01 .475585E-01 -.483403E-01 .051435 -.038735
+bezier .584409E-01 -.262993E-01 .656491E-01 -.101382E-01 .638175E-01 .301625E-02
+bezier .480683E-01 -.691842E-02 .239977E-01 .285771E-02 .022225 .022225
+bezier .020003 .365366E-01 .298589E-01 .513937E-01 .04445 .05334
+closepath
+! end of curve
+
+! start of curve
+amove .064135 .003175
+aline .06477 .00254
+aline .065405 .003175
+aline .06477 .00381
+aline .064135 .003175
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="<" !-------------- Beginning of new char.
+dfont wid=.305555 hei=.5 dep=.194445 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .057785 .174625
+bezier .814791E-01 .171941 .893029E-01 .137143 .06858 .125095
+bezier .495399E-01 .110674 .202531E-01 .131541 .027305 .154305
+aline .028575 .158115
+aline .03048 .161925
+aline .031115 .16256
+aline .03175 .16383
+aline .037465 .169545
+aline .038735 .17018
+aline .03937 .170815
+aline .04318 .17272
+aline .04699 .17399
+aline .04953 .174625
+closepath
+! end of curve
+
+! start of curve
+amove .05842 .09525
+bezier .648691E-01 .906675E-01 .613781E-01 .811034E-01 .064135 .07493
+bezier .688432E-01 .031844 .772571E-01 -.970708E-02 .080645 -.05334
+bezier .748989E-01 -.07942 .324161E-01 -.07942 .02667 -.05334
+bezier .312892E-01 -.353842E-02 .393032E-01 .440297E-01 .046355 .093345
+aline .047625 .094615
+aline .048895 .09525
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="=" !-------------- Beginning of new char.
+dfont wid=.777781 hei=.391111 dep=-.108889 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .243205 .136525
+bezier .254299 .135748 .25644 .118866 .245745 .11557
+aline .027305 .11557
+aline .024765 .11684
+aline .02159 .120015
+aline .020955 .121285
+aline .02032 .12319
+aline .02032 .12827
+aline .020955 .130175
+aline .02159 .131445
+aline .024765 .13462
+aline .027305 .13589
+aline .029845 .136525
+closepath
+! end of curve
+
+! start of curve
+amove .245745 .057785
+bezier .25644 .544892E-01 .254299 .376074E-01 .243205 .03683
+aline .029845 .03683
+bezier .187505E-01 .376074E-01 .166104E-01 .544892E-01 .027305 .057785
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=">" !-------------- Beginning of new char.
+dfont wid=.472224 hei=.5 dep=.194445 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .081915 .174625
+bezier .105609 .171941 .113433 .137143 .09271 .125095
+bezier .736699E-01 .110674 .443831E-01 .131541 .051435 .154305
+aline .052705 .158115
+aline .05461 .161925
+aline .055245 .16256
+aline .05588 .16383
+aline .061595 .169545
+aline .062865 .17018
+aline .0635 .170815
+aline .06731 .17272
+aline .07112 .17399
+aline .07366 .174625
+closepath
+! end of curve
+
+! start of curve
+amove .08255 .09525
+aline .08382 .094615
+aline .08509 .093345
+bezier .886776E-01 .587602E-01 .809424E-01 .251157E-01 .066675 -.006985
+aline .06604 -.01016
+aline .065405 -.010795
+aline .065405 -.015875
+aline .06477 -.01651
+aline .06477 -.04699
+aline .065405 -.047625
+bezier .635118E-01 -.581064E-01 .777563E-01 -.606838E-01 .08509 -.05842
+bezier .958027E-01 -.579743E-01 .110775 -.541614E-01 .117475 -.04699
+bezier .954749E-01 -.421935E-01 .981053E-01 -.610557E-02 .12065 -.004445
+bezier .138619 -.138435E-02 .15057 -.021091 .144145 -.03683
+bezier .136424 -.606783E-01 .108363 -.694726E-01 .08636 -.07112
+bezier .626669E-01 -.072576 .324773E-01 -.688764E-01 .02286 -.04318
+bezier .163679E-01 -.238716E-01 .213437E-01 .376733E-03 .040005 .01143
+bezier .633093E-01 .315141E-01 .727066E-01 .622611E-01 .06985 .092075
+aline .070485 .093345
+aline .071755 .094615
+aline .073025 .09525
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="?" !-------------- Beginning of new char.
+dfont wid=.472224 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .09017 .244475
+bezier .113105 .243927 .142795 .232307 .145415 .205105
+bezier .148411 .185474 .135465 .168059 .118745 .159385
+bezier .943458E-01 .141862 .822545E-01 .111468 .085725 .081915
+aline .08509 .080645
+aline .08382 .079375
+aline .08255 .07874
+aline .073025 .07874
+aline .071755 .079375
+aline .070485 .080645
+bezier .662734E-01 .115126 .757877E-01 .150619 .097155 .178435
+bezier .102336 .193291 .102807 .210607 .09779 .225425
+bezier .835881E-01 .237854 .605534E-01 .23271 .471488E-01 .221298
+bezier .665831E-01 .217291 .697902E-01 .186768 .0508 .179705
+bezier .354998E-01 .171769 .151556E-01 .188153 .020955 .205105
+bezier .230566E-01 .229139 .049306 .242599 .070485 .244475
+aline .09017 .244475
+closepath
+! end of curve
+
+! start of curve
+amove .081915 .05334
+bezier .105609 .506557E-01 .113433 .158581E-01 .09271 .00381
+bezier .736699E-01 -.106106E-01 .443831E-01 .102563E-01 .051435 .03302
+aline .052705 .03683
+aline .05461 .04064
+aline .055245 .041275
+aline .05588 .042545
+aline .061595 .04826
+aline .062865 .048895
+aline .0635 .04953
+aline .06731 .051435
+aline .07112 .052705
+aline .07366 .05334
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="@" !-------------- Beginning of new char.
+dfont wid=.777781 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .14605 .244475
+bezier .192702 .242819 .236733 .209022 .24765 .16256
+bezier .254856 .131789 .255127 .991158E-01 .245745 .06858
+bezier .240163 .520376E-01 .222228 .403574E-01 .205105 .045085
+aline .200025 .045085
+aline .19939 .04572
+aline .196215 .04572
+aline .191135 .04699
+aline .18542 .048895
+aline .17907 .05207
+aline .178435 .052705
+aline .177165 .05334
+aline .172085 .05842
+bezier .138307 .266684E-01 .774585E-01 .520652E-01 .06985 .09652
+bezier .614009E-01 .131512 .713101E-01 .177302 .108585 .192405
+bezier .135614 .20449 .171123 .195739 .18415 .16764
+aline .202565 .16764
+aline .203835 .167005
+aline .20574 .1651
+aline .20574 .06985
+bezier .206216 .624886E-01 .21238 .526436E-01 .22098 .057785
+bezier .233499 .631769E-01 .233881 .794699E-01 .23622 .09017
+aline .23622 .09906
+aline .236855 .099695
+aline .236855 .130175
+bezier .23514 .170632 .211839 .216364 .16891 .22733
+bezier .122194 .24369 .619047E-01 .221199 .045085 .17145
+bezier .028505 .125092 .334514E-01 .671597E-01 .071755 .03175
+bezier .107271 .300923E-02 .154948 .62928E-02 .19558 .018415
+bezier .206788 .02154 .217533 .260214E-01 .227965 .031115
+aline .249555 .031115
+aline .250825 .03048
+aline .25273 .028575
+bezier .252888 .192262E-01 .239483 .019151 .233045 .01524
+bezier .189499 -.595613E-03 .144077 -.852965E-02 .09906 .00254
+bezier .511515E-01 .148059E-01 .214675E-01 .641817E-01 .02032 .11049
+bezier .170668E-01 .155733 .340885E-01 .20674 .0762 .22987
+bezier .977818E-01 .241856 .122005 .245492 .14605 .244475
+closepath
+! end of curve
+
+! start of curve
+amove .13335 .184785
+bezier .111774 .1781 .109315 .150126 .10668 .13208
+bezier .106474 .107077 .106305 .788531E-01 .12573 .060325
+bezier .139644 .508899E-01 .157992 .610271E-01 .16637 .07366
+aline .16637 .1651
+bezier .168095 .169615 .160544 .175084 .156845 .178435
+aline .155575 .17907
+aline .15494 .179705
+aline .14859 .18288
+aline .14478 .18415
+aline .144145 .184785
+aline .14097 .184785
+aline .140335 .18542
+aline .133985 .18542
+aline .13335 .184785
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="A" !-------------- Beginning of new char.
+dfont wid=.755559 hei=.686111 dep=0 italic=0
+dfont fby="C" kadd=-.0277786
+dfont fby="G" kadd=-.0277786
+dfont fby="O" kadd=-.0277786
+dfont fby="Q" kadd=-.0277786
+dfont fby="T" kadd=-.083334
+dfont fby="U" kadd=-.0277786
+dfont fby="V" kadd=-.111112
+dfont fby="W" kadd=-.111112
+dfont fby="Y" kadd=-.083334
+dfont fby="t" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .137795 .244475
+aline .1397 .24384
+aline .14097 .243205
+bezier .150886 .227708 .153925 .208162 .16129 .191135
+bezier .181638 .132427 .202587 .739686E-01 .222885 .01524
+aline .25273 .01524
+aline .25273 -.000635
+aline .24384 -.000635
+aline .243205 0
+aline .20955 0
+aline .208915 .000635
+aline .192405 .000635
+aline .19177 0
+aline .154305 0
+aline .15367 -.000635
+aline .14351 -.000635
+aline .14351 .01524
+aline .172085 .01524
+bezier .16797 .031118 .161292 .476294E-01 .155575 .0635
+aline .07874 .0635
+bezier .732505E-01 .049 .068877 .338496E-01 .062865 .019685
+aline .064135 .018415
+aline .06604 .01778
+aline .069215 .017145
+aline .06985 .01651
+aline .07366 .01651
+aline .074295 .015875
+aline .08001 .015875
+aline .080645 .01524
+aline .090805 .01524
+aline .090805 -.000635
+aline .08382 -.000635
+aline .083185 0
+aline .055245 0
+aline .05461 .000635
+aline .04318 .000635
+aline .042545 0
+aline .019685 0
+aline .01905 -.000635
+aline .0127 -.000635
+aline .0127 .01524
+aline .027305 .01524
+aline .02794 .015875
+aline .033655 .015875
+aline .03429 .01651
+aline .0381 .01651
+aline .038735 .017145
+aline .041275 .01778
+aline .043815 .01905
+bezier .698468E-01 .092923 .953892E-01 .166999 .12192 .240665
+aline .12446 .243205
+aline .12573 .24384
+aline .127635 .244475
+closepath
+! end of curve
+
+! start of curve
+amove .11684 .172085
+bezier .106503 .141196 .094001 .110271 .08509 .079375
+aline .14986 .079375
+bezier .140197 .109623 .12808 .141748 .117475 .17272
+aline .11684 .172085
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="B" !-------------- Beginning of new char.
+dfont wid=.711115 hei=.686111 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .153035 .24003
+bezier .18358 .23958 .218148 .218769 .220345 .18542
+bezier .224306 .154812 .198102 .130301 .169545 .125095
+bezier .198566 .122847 .227921 .10105 .22987 .070485
+bezier .234369 .349891E-01 .204496 .17178E-02 .16891 .000635
+aline .168275 0
+aline .163195 0
+aline .16256 -.000635
+aline .012065 -.000635
+aline .012065 .01524
+aline .04445 .01524
+aline .045085 .015875
+aline .045085 .22352
+aline .04445 .224155
+aline .012065 .224155
+aline .012065 .24003
+aline .153035 .24003
+closepath
+! end of curve
+
+! start of curve
+amove .09017 .22352
+aline .09017 .131445
+aline .090805 .13081
+aline .140335 .13081
+bezier .165835 .136621 .173829 .166905 .17018 .18923
+bezier .169375 .203348 .162582 .220493 .14732 .224155
+aline .090805 .224155
+aline .09017 .22352
+closepath
+! end of curve
+
+! start of curve
+amove .09017 .11811
+aline .09017 .015875
+aline .090805 .01524
+aline .147955 .01524
+bezier .167599 .183067E-01 .176872 .394778E-01 .178435 .056515
+bezier .178776 .775566E-01 .177975 .103667 .158115 .116205
+aline .154305 .117475
+aline .15113 .11811
+aline .150495 .118745
+aline .090805 .118745
+aline .09017 .11811
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="C" !-------------- Beginning of new char.
+dfont wid=.722224 hei=.686111 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .1524 .24384
+bezier .169811 .242131 .187363 .234296 .200343 .222409
+bezier .209103 .228999 .216482 .237505 .225425 .24384
+aline .230505 .24384
+aline .231775 .243205
+aline .23368 .2413
+aline .23368 .151765
+aline .231775 .14986
+aline .230505 .149225
+aline .219075 .149225
+aline .217805 .14986
+bezier .214005 .156362 .215407 .164636 .21209 .172085
+bezier .205029 .202975 .176553 .232829 .14351 .22733
+bezier .109313 .226155 .080424 .197984 .076835 .16383
+aline .0762 .163195
+aline .0762 .16002
+aline .075565 .159385
+aline .075565 .155575
+aline .07493 .15494
+aline .07493 .149225
+aline .074295 .14859
+aline .074295 .139065
+aline .07366 .13843
+aline .07366 .1016
+bezier .074309 .698649E-01 .853683E-01 .304641E-01 .11938 .01778
+bezier .149639 .379292E-02 .189439 .132981E-01 .20701 .04318
+aline .21209 .05334
+aline .215265 .062865
+aline .216535 .069215
+aline .21717 .06985
+aline .21717 .074295
+aline .217805 .07493
+aline .217805 .083185
+aline .21971 .08509
+aline .22098 .085725
+aline .230505 .085725
+aline .231775 .08509
+aline .23368 .083185
+bezier .23637 .380516E-01 .196021 -.183149E-02 .1524 -.004445
+bezier .104957 -.799339E-02 .521115E-01 .148979E-01 .032385 .06096
+bezier .954297E-02 .112892 .174942E-01 .180995 .0635 .21844
+bezier .889374E-01 .238088 .121284 .245166 .1524 .24384
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="D" !-------------- Beginning of new char.
+dfont wid=.76667 hei=.686111 dep=0 italic=0
+dfont fby="A" kadd=-.0277786
+dfont fby="V" kadd=-.0277786
+dfont fby="W" kadd=-.0277786
+dfont fby="X" kadd=-.0277786
+dfont fby="Y" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .150495 .24003
+bezier .196627 .238408 .2368 .201102 .24511 .155575
+bezier .255105 .107956 .247832 .484135E-01 .20447 .01778
+bezier .189037 .663919E-02 .169144 .91642E-03 .15113 -.000635
+aline .012065 -.000635
+aline .012065 .01524
+aline .04445 .01524
+aline .045085 .015875
+aline .045085 .22352
+aline .04445 .224155
+aline .012065 .224155
+aline .012065 .24003
+aline .150495 .24003
+closepath
+! end of curve
+
+! start of curve
+amove .092075 .22352
+aline .092075 .015875
+aline .09271 .01524
+aline .13589 .01524
+bezier .160839 .174222E-01 .186989 .343235E-01 .192405 .06096
+bezier .195918 .718277E-01 .196276 .823736E-01 .197485 .093345
+aline .197485 .14224
+bezier .196716 .171131 .18775 .208459 .155575 .219075
+aline .14986 .22098
+aline .14478 .22225
+aline .144145 .222885
+aline .14097 .222885
+aline .140335 .22352
+aline .13589 .22352
+aline .135255 .224155
+aline .09271 .224155
+aline .092075 .22352
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="E" !-------------- Beginning of new char.
+dfont wid=.655559 hei=.686111 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .19939 .238125
+bezier .203138 .209668 .206478 .181837 .210185 .15367
+aline .19431 .15367
+bezier .191436 .176506 .187486 .208118 .16129 .21717
+aline .155575 .219075
+aline .149225 .220345
+aline .14859 .22098
+aline .145415 .22098
+aline .14478 .221615
+aline .13843 .221615
+aline .137795 .22225
+aline .094615 .22225
+aline .09398 .221615
+aline .09398 .13208
+bezier .109874 .129007 .133976 .133081 .135255 .15367
+aline .13589 .154305
+aline .13589 .159385
+aline .136525 .16002
+aline .136525 .17272
+aline .1524 .17272
+aline .1524 .074295
+aline .136525 .074295
+bezier .137035 .889867E-01 .136117 .109816 .11811 .113665
+aline .11557 .1143
+aline .114935 .114935
+aline .111125 .114935
+aline .11049 .11557
+aline .094615 .11557
+aline .09398 .114935
+aline .09398 .015875
+aline .094615 .01524
+aline .1397 .01524
+bezier .161779 .164696E-01 .187624 .279508E-01 .19431 .05207
+bezier .199236 .662982E-01 .202007 .812739E-01 .20447 .09525
+aline .220345 .09525
+bezier .215039 .632412E-01 .209817 .316234E-01 .20447 -.000635
+aline .012065 -.000635
+aline .012065 .01524
+aline .04445 .01524
+aline .045085 .015875
+aline .045085 .221615
+aline .04445 .22225
+aline .012065 .22225
+aline .012065 .238125
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="F" !-------------- Beginning of new char.
+dfont wid=.627782 hei=.686111 dep=0 italic=0
+dfont fby="A" kadd=-.111112
+dfont fby="C" kadd=-.0277786
+dfont fby="G" kadd=-.0277786
+dfont fby="O" kadd=-.0277786
+dfont fby="Q" kadd=-.0277786
+dfont fby="a" kadd=-.083334
+dfont fby="e" kadd=-.083334
+dfont fby="o" kadd=-.083334
+dfont fby="r" kadd=-.083334
+dfont fby="u" kadd=-.083334
+set path ! start of curve
+newpath
+! start of curve
+amove .19431 .238125
+bezier .198058 .209668 .201398 .181837 .205105 .15367
+aline .18923 .15367
+bezier .186128 .175812 .183284 .206249 .15875 .216535
+aline .15113 .219075
+aline .14859 .21971
+aline .145415 .220345
+aline .14478 .22098
+aline .141605 .22098
+aline .14097 .221615
+aline .135255 .221615
+aline .13462 .22225
+aline .094615 .22225
+aline .09398 .221615
+aline .09398 .127635
+bezier .109298 .124172 .132217 .129995 .132715 .149225
+aline .13335 .14986
+aline .13335 .15494
+aline .133985 .155575
+aline .133985 .168275
+aline .14986 .168275
+aline .14986 .06985
+aline .133985 .06985
+bezier .134823 .853755E-01 .133156 .107021 .113665 .109855
+aline .11303 .11049
+aline .10922 .11049
+aline .108585 .111125
+aline .094615 .111125
+aline .09398 .11049
+aline .09398 .015875
+aline .094615 .01524
+aline .135255 .01524
+aline .135255 -.000635
+aline .12446 -.000635
+aline .123825 0
+aline .08001 0
+aline .079375 .000635
+aline .06096 .000635
+aline .060325 0
+aline .022225 0
+aline .02159 -.000635
+aline .012065 -.000635
+aline .012065 .01524
+aline .04445 .01524
+aline .045085 .015875
+aline .045085 .221615
+aline .04445 .22225
+aline .012065 .22225
+aline .012065 .238125
+aline .19431 .238125
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="G" !-------------- Beginning of new char.
+dfont wid=.786115 hei=.686111 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .1524 .24384
+bezier .169811 .242131 .187363 .234296 .200343 .222409
+bezier .209103 .228999 .216482 .237505 .225425 .24384
+aline .230505 .24384
+aline .231775 .243205
+aline .23368 .2413
+aline .23368 .151765
+aline .231775 .14986
+aline .230505 .149225
+aline .219075 .149225
+aline .217805 .14986
+bezier .214005 .156362 .215407 .164636 .21209 .172085
+bezier .205029 .202975 .176553 .232829 .14351 .22733
+bezier .109313 .226155 .080424 .197984 .076835 .16383
+aline .0762 .163195
+aline .0762 .16002
+aline .075565 .159385
+aline .075565 .155575
+aline .07493 .15494
+aline .07493 .149225
+aline .074295 .14859
+aline .074295 .139065
+aline .07366 .13843
+aline .07366 .1016
+bezier .748853E-01 .734327E-01 .822882E-01 .388509E-01 .109855 .02286
+bezier .13121 .111916E-01 .161879 .361979E-02 .179705 .024765
+aline .18288 .031115
+aline .183515 .03302
+aline .18415 .036195
+aline .184785 .03683
+aline .184785 .079375
+aline .18415 .08001
+aline .14097 .08001
+aline .14097 .095885
+aline .1524 .095885
+aline .153035 .09525
+aline .19812 .09525
+aline .198755 .094615
+aline .216535 .094615
+aline .21717 .09525
+aline .249555 .09525
+aline .25019 .095885
+aline .25781 .095885
+aline .25781 .08001
+aline .234315 .08001
+aline .23368 .079375
+aline .23368 .001905
+aline .231775 0
+aline .230505 -.000635
+bezier .217897 .244457E-02 .205342 .919413E-02 .19558 .01778
+bezier .173838 -.973189E-02 .134565 -.702413E-02 .104775 .000635
+bezier .553171E-01 .120634E-01 .021819 .607217E-01 .02032 .10922
+bezier .159575E-01 .159269 .040493 .215076 .09017 .23368
+bezier .110487 .242352 .13076 .244264 .1524 .24384
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="H" !-------------- Beginning of new char.
+dfont wid=.783336 hei=.686111 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .02159 .24003
+aline .022225 .239395
+aline .060325 .239395
+aline .06096 .23876
+aline .078105 .23876
+aline .07874 .239395
+aline .11684 .239395
+aline .117475 .24003
+aline .127 .24003
+aline .127 .224155
+aline .094615 .224155
+aline .09398 .22352
+aline .09398 .13335
+aline .094615 .132715
+aline .180975 .132715
+aline .18161 .13335
+aline .18161 .22352
+aline .180975 .224155
+aline .14859 .224155
+aline .14859 .24003
+aline .158115 .24003
+aline .15875 .239395
+aline .19685 .239395
+aline .197485 .23876
+aline .21463 .23876
+aline .215265 .239395
+aline .253365 .239395
+aline .254 .24003
+aline .263525 .24003
+aline .263525 .224155
+aline .23114 .224155
+aline .230505 .22352
+aline .230505 .015875
+aline .23114 .01524
+aline .263525 .01524
+aline .263525 -.000635
+aline .254 -.000635
+aline .253365 0
+aline .215265 0
+aline .21463 .000635
+aline .197485 .000635
+aline .19685 0
+aline .15875 0
+aline .158115 -.000635
+aline .14859 -.000635
+aline .14859 .01524
+aline .180975 .01524
+aline .18161 .015875
+aline .18161 .116205
+aline .180975 .11684
+aline .094615 .11684
+aline .09398 .116205
+aline .09398 .015875
+aline .094615 .01524
+aline .127 .01524
+aline .127 -.000635
+aline .117475 -.000635
+aline .11684 0
+aline .07874 0
+aline .078105 .000635
+aline .06096 .000635
+aline .060325 0
+aline .022225 0
+aline .02159 -.000635
+aline .012065 -.000635
+aline .012065 .01524
+aline .04445 .01524
+aline .045085 .015875
+aline .045085 .22352
+aline .04445 .224155
+aline .012065 .224155
+aline .012065 .24003
+aline .02159 .24003
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="I" !-------------- Beginning of new char.
+dfont wid=.397224 hei=.686111 dep=0 italic=0
+dfont fby="I" kadd=.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .020955 .24003
+aline .02159 .239395
+aline .060325 .239395
+aline .06096 .23876
+aline .079375 .23876
+aline .08001 .239395
+aline .118745 .239395
+aline .11938 .24003
+aline .12954 .24003
+aline .12954 .224155
+aline .09525 .224155
+aline .094615 .22352
+aline .094615 .015875
+aline .09525 .01524
+aline .12954 .01524
+aline .12954 -.000635
+aline .11938 -.000635
+aline .118745 0
+aline .08001 0
+aline .079375 .000635
+aline .06096 .000635
+aline .060325 0
+aline .02159 0
+aline .020955 -.000635
+aline .010795 -.000635
+aline .010795 .01524
+aline .045085 .01524
+aline .04572 .015875
+aline .04572 .22352
+aline .045085 .224155
+aline .010795 .224155
+aline .010795 .24003
+aline .020955 .24003
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="J" !-------------- Beginning of new char.
+dfont wid=.516668 hei=.686111 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .057785 .24003
+aline .05842 .239395
+aline .102235 .239395
+aline .10287 .23876
+aline .120015 .23876
+aline .12065 .239395
+aline .153035 .239395
+aline .15367 .24003
+aline .16129 .24003
+aline .16129 .224155
+aline .13716 .224155
+aline .136525 .22352
+aline .136525 .043815
+bezier .132669 .126538E-01 .995445E-01 -.339899E-02 .071755 -.004445
+bezier .450271E-01 -.662634E-02 .100156E-01 .154643E-02 .001905 .031115
+bezier -.211066E-02 .458126E-01 .662133E-02 .628421E-01 .022225 .065405
+bezier .414967E-01 .696873E-01 .590457E-01 .505728E-01 .05334 .03175
+aline .05207 .02794
+aline .0508 .0254
+aline .050165 .024765
+aline .04953 .023495
+aline .043815 .01778
+aline .042545 .017145
+aline .04191 .01651
+aline .0381 .014605
+aline .036195 .01397
+bezier .050689 .646865E-02 .715991E-01 .319041E-02 .081915 .01905
+aline .085725 .02667
+aline .08636 .028575
+aline .08763 .033655
+aline .088265 .03683
+aline .0889 .037465
+aline .0889 .042545
+aline .089535 .04318
+aline .089535 .22352
+aline .0889 .224155
+aline .046355 .224155
+aline .046355 .24003
+aline .057785 .24003
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="K" !-------------- Beginning of new char.
+dfont wid=.783338 hei=.686111 dep=0 italic=0
+dfont fby="C" kadd=-.0277786
+dfont fby="G" kadd=-.0277786
+dfont fby="O" kadd=-.0277786
+dfont fby="Q" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .02159 .24003
+aline .022225 .239395
+aline .060325 .239395
+aline .06096 .23876
+aline .078105 .23876
+aline .07874 .239395
+aline .11684 .239395
+aline .117475 .24003
+aline .127 .24003
+aline .127 .224155
+aline .094615 .224155
+aline .09398 .22352
+aline .09398 .116205
+aline .094615 .11557
+aline .09652 .117475
+aline .09779 .11811
+aline .132715 .153035
+aline .133985 .15367
+aline .168275 .18796
+aline .169545 .188595
+aline .200025 .219075
+aline .200501 .220028
+aline .200025 .22098
+aline .19812 .221615
+aline .19177 .222885
+aline .191135 .22352
+aline .186055 .22352
+aline .18542 .224155
+aline .178435 .224155
+aline .178435 .24003
+aline .186055 .24003
+aline .18669 .239395
+aline .219075 .239395
+aline .21971 .23876
+aline .23114 .23876
+aline .231775 .239395
+aline .25019 .239395
+aline .250825 .24003
+aline .25527 .24003
+aline .25527 .224155
+aline .24257 .224155
+aline .241935 .22352
+aline .235585 .22352
+aline .23495 .222885
+aline .23114 .222885
+aline .230505 .22225
+aline .227965 .221615
+aline .22606 .22098
+aline .22352 .21971
+aline .19812 .19431
+aline .19685 .193675
+aline .161925 .15875
+aline .160655 .158115
+aline .15113 .14859
+bezier .176638 .105122 .206398 .617481E-01 .23368 .018415
+aline .23622 .017145
+aline .238125 .01651
+aline .23876 .015875
+aline .243205 .015875
+aline .24384 .01524
+aline .26035 .01524
+aline .26035 -.000635
+aline .253365 -.000635
+aline .25273 0
+aline .22352 0
+aline .222885 .000635
+aline .207645 .000635
+aline .20701 0
+aline .16891 0
+aline .168275 -.000635
+aline .15875 -.000635
+aline .15875 .01524
+aline .17018 .01524
+aline .170815 .015875
+aline .17526 .015875
+aline .175895 .01651
+aline .17907 .017145
+bezier .184439 .203011E-01 .175933 .025855 .174625 .029845
+bezier .156239 .590166E-01 .137599 .880056E-01 .118745 .11684
+aline .09398 .092075
+aline .09398 .015875
+aline .094615 .01524
+aline .127 .01524
+aline .127 -.000635
+aline .117475 -.000635
+aline .11684 0
+aline .07874 0
+aline .078105 .000635
+aline .06096 .000635
+aline .060325 0
+aline .022225 0
+aline .02159 -.000635
+aline .012065 -.000635
+aline .012065 .01524
+aline .04445 .01524
+aline .045085 .015875
+aline .045085 .22352
+aline .04445 .224155
+aline .012065 .224155
+aline .012065 .24003
+aline .02159 .24003
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="L" !-------------- Beginning of new char.
+dfont wid=.600003 hei=.686111 dep=0 italic=0
+dfont fby="T" kadd=-.083334
+dfont fby="V" kadd=-.111112
+dfont fby="W" kadd=-.111112
+dfont fby="Y" kadd=-.083334
+set path ! start of curve
+newpath
+! start of curve
+amove .02159 .24003
+aline .022225 .239395
+aline .060325 .239395
+aline .06096 .23876
+aline .079375 .23876
+aline .08001 .239395
+aline .123825 .239395
+aline .12446 .24003
+aline .135255 .24003
+aline .135255 .224155
+aline .094615 .224155
+aline .09398 .22352
+aline .09398 .015875
+aline .094615 .01524
+aline .125095 .01524
+bezier .152435 .181008E-01 .172347 .430369E-01 .175895 .06985
+bezier .178169 .779418E-01 .178338 .864593E-01 .179705 .09525
+aline .19558 .09525
+bezier .191915 .632554E-01 .188516 .316396E-01 .184785 -.000635
+aline .012065 -.000635
+aline .012065 .01524
+aline .04445 .01524
+aline .045085 .015875
+aline .045085 .22352
+aline .04445 .224155
+aline .012065 .224155
+aline .012065 .24003
+aline .02159 .24003
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="M" !-------------- Beginning of new char.
+dfont wid=.950003 hei=.686111 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .09144 .24003
+bezier .10223 .234664 .101744 .219825 .107315 .210185
+bezier .127106 .15786 .147322 .10571 .167005 .05334
+bezier .191149 .114771 .212599 .177887 .23876 .238125
+aline .24257 .24003
+aline .321945 .24003
+aline .321945 .224155
+aline .28956 .224155
+aline .288925 .22352
+aline .288925 .015875
+aline .28956 .01524
+aline .321945 .01524
+aline .321945 -.000635
+aline .313055 -.000635
+aline .31242 0
+aline .276225 0
+aline .27559 .000635
+aline .25908 .000635
+aline .258445 0
+aline .22225 0
+aline .221615 -.000635
+aline .212725 -.000635
+aline .212725 .01524
+aline .24511 .01524
+aline .245745 .015875
+aline .245745 .220345
+bezier .240005 .210068 .235369 .193582 .22987 .180975
+bezier .206369 .121234 .185484 .598407E-01 .16002 .00127
+aline .15621 -.000635
+bezier .141819 -.293321E-02 .141491 .149574E-01 .136525 .02413
+bezier .112363 .881275E-01 .876625E-01 .151902 .0635 .2159
+aline .062865 .215265
+aline .062865 .019685
+aline .064135 .018415
+aline .065405 .01778
+aline .067945 .017145
+aline .06858 .01651
+aline .07239 .01651
+aline .073025 .015875
+aline .08001 .015875
+aline .080645 .01524
+aline .095885 .01524
+aline .095885 -.000635
+aline .0889 -.000635
+aline .088265 0
+aline .06096 0
+aline .060325 .000635
+aline .047625 .000635
+aline .04699 0
+aline .019685 0
+aline .01905 -.000635
+aline .012065 -.000635
+aline .012065 .01524
+aline .027305 .01524
+aline .02794 .015875
+aline .034925 .015875
+aline .03556 .01651
+aline .03937 .01651
+aline .040005 .017145
+aline .042545 .01778
+aline .043815 .018415
+aline .045085 .019685
+aline .045085 .22352
+aline .04445 .224155
+aline .012065 .224155
+aline .012065 .24003
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="N" !-------------- Beginning of new char.
+dfont wid=.783336 hei=.686111 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .090805 .24003
+bezier .103718 .228664 .111849 .211979 .12319 .198755
+bezier .152644 .158198 .182341 .117815 .21209 .07747
+aline .212725 .078105
+aline .212725 .21971
+aline .211455 .22098
+aline .210185 .221615
+aline .207645 .22225
+aline .20701 .222885
+aline .2032 .222885
+aline .202565 .22352
+aline .19558 .22352
+aline .194945 .224155
+aline .179705 .224155
+aline .179705 .24003
+aline .18669 .24003
+aline .187325 .239395
+aline .21463 .239395
+aline .215265 .23876
+aline .227965 .23876
+aline .2286 .239395
+aline .255905 .239395
+aline .25654 .24003
+aline .263525 .24003
+aline .263525 .224155
+aline .248285 .224155
+aline .24765 .22352
+aline .240665 .22352
+aline .24003 .222885
+aline .23622 .222885
+aline .235585 .22225
+aline .233045 .221615
+aline .231775 .22098
+aline .230505 .21971
+aline .230505 .00381
+aline .229235 .00127
+bezier .22232 -.342299E-02 .212398 -.422742E-03 .20955 .00762
+bezier .160704 .737543E-01 .112485 .140341 .0635 .206375
+aline .062865 .20574
+aline .062865 .019685
+aline .064135 .018415
+aline .065405 .01778
+aline .067945 .017145
+aline .06858 .01651
+aline .07239 .01651
+aline .073025 .015875
+aline .08001 .015875
+aline .080645 .01524
+aline .095885 .01524
+aline .095885 -.000635
+aline .0889 -.000635
+aline .088265 0
+aline .06096 0
+aline .060325 .000635
+aline .047625 .000635
+aline .04699 0
+aline .019685 0
+aline .01905 -.000635
+aline .012065 -.000635
+aline .012065 .01524
+aline .027305 .01524
+aline .02794 .015875
+aline .034925 .015875
+aline .03556 .01651
+aline .03937 .01651
+aline .040005 .017145
+aline .042545 .01778
+aline .043815 .018415
+aline .045085 .019685
+aline .045085 .22352
+aline .04445 .224155
+aline .012065 .224155
+aline .012065 .24003
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="O" !-------------- Beginning of new char.
+dfont wid=.750003 hei=.686111 dep=0 italic=0
+dfont fby="A" kadd=-.0277786
+dfont fby="V" kadd=-.0277786
+dfont fby="W" kadd=-.0277786
+dfont fby="X" kadd=-.0277786
+dfont fby="Y" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .140335 .24384
+bezier .183602 .242088 .224884 .21061 .23622 .16764
+bezier .25022 .118701 .245589 .587566E-01 .20574 .02159
+bezier .154119 -.237174E-01 .601019E-01 -.927484E-02 .032385 .056515
+bezier .143016E-01 .101327 .153768E-01 .153083 .040005 .19558
+bezier .603281E-01 .22976 .1019 .24676 .140335 .24384
+closepath
+! end of curve
+
+! start of curve
+amove .126365 .22987
+bezier .915218E-01 .226105 .758236E-01 .186452 .07493 .15621
+aline .074295 .155575
+aline .074295 .14605
+aline .07366 .145415
+aline .07366 .100965
+bezier .755603E-01 .699557E-01 .814593E-01 .028699 .1143 .013335
+bezier .142092 .160402E-03 .173182 .230804E-01 .180975 .0508
+bezier .186913 .677207E-01 .188703 .839231E-01 .189865 .100965
+aline .189865 .145415
+bezier .188653 .176964 .178827 .220674 .141605 .229235
+aline .14097 .22987
+aline .13716 .22987
+aline .136525 .230505
+aline .127 .230505
+aline .126365 .22987
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="P" !-------------- Beginning of new char.
+dfont wid=.683336 hei=.686111 dep=0 italic=0
+dfont fby="," kadd=-.083334
+dfont fby="." kadd=-.083334
+dfont fby="A" kadd=-.083334
+dfont fby="a" kadd=-.0277786
+dfont fby="e" kadd=-.0277786
+dfont fby="o" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .146685 .24003
+bezier .179752 .239352 .217903 .21607 .219075 .17907
+bezier .225117 .145547 .197479 .113393 .164465 .10795
+aline .158115 .10668
+aline .154305 .10668
+aline .15367 .106045
+aline .14732 .106045
+aline .146685 .10541
+aline .094615 .10541
+aline .09398 .104775
+aline .09398 .015875
+aline .094615 .01524
+aline .127 .01524
+aline .127 -.000635
+aline .117475 -.000635
+aline .11684 0
+aline .07874 0
+aline .078105 .000635
+aline .06096 .000635
+aline .060325 0
+aline .022225 0
+aline .02159 -.000635
+aline .012065 -.000635
+aline .012065 .01524
+aline .04445 .01524
+aline .045085 .015875
+aline .045085 .22352
+aline .04445 .224155
+aline .012065 .224155
+aline .012065 .24003
+aline .146685 .24003
+closepath
+! end of curve
+
+! start of curve
+amove .092075 .22352
+aline .092075 .120015
+aline .09271 .11938
+aline .131445 .11938
+bezier .146609 .120621 .165892 .12981 .1651 .147955
+aline .165735 .14859
+aline .165735 .15494
+aline .16637 .155575
+aline .16637 .18796
+bezier .165729 .200411 .161819 .216173 .14732 .220345
+aline .14351 .221615
+aline .14097 .22225
+aline .137795 .222885
+aline .13716 .22352
+aline .13208 .22352
+aline .131445 .224155
+aline .09271 .224155
+aline .092075 .22352
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="Q" !-------------- Beginning of new char.
+dfont wid=.750003 hei=.686111 dep=.194445 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .140335 .24384
+bezier .183602 .242088 .224884 .21061 .23622 .16764
+bezier .25022 .118701 .245589 .587566E-01 .20574 .02159
+bezier .198187 .148436E-01 .188897 .100306E-01 .180499 .47625E-02
+bezier .186593 -.925699E-02 .202136 -.205783E-01 .21717 -.014605
+aline .21971 -.01397
+aline .22352 -.0127
+aline .22733 -.010795
+aline .23114 -.006985
+aline .231775 -.005715
+aline .23241 -.00381
+aline .233045 -.003175
+aline .233045 .000635
+aline .234315 .003175
+aline .23495 .00381
+aline .23749 .00508
+aline .240665 .00508
+aline .243205 .00381
+bezier .247841 -.762985E-02 .243317 -.199737E-01 .241935 -.03175
+bezier .237849 -.537358E-01 .218341 -.748414E-01 .19431 -.06858
+bezier .165747 -.616972E-01 .164116 -.268019E-01 .160655 -.004445
+aline .160111 -.172362E-02
+bezier .114509 -.122989E-01 .589251E-01 .479106E-02 .036195 .048895
+bezier .143563E-01 .930931E-01 .148047E-01 .144951 .036195 .18923
+bezier .553832E-01 .226994 .992945E-01 .247245 .140335 .24384
+closepath
+! end of curve
+
+! start of curve
+amove .126365 .22987
+bezier .893978E-01 .225592 .742429E-01 .182984 .073025 .15113
+aline .07239 .150495
+aline .07239 .140335
+aline .071755 .1397
+aline .071755 .09779
+bezier .736909E-01 .713827E-01 .077823 .390901E-01 .100648 .204788E-01
+aline .1016 .020955
+bezier .974911E-01 .476543E-01 .132846 .632353E-01 .1524 .04699
+bezier .159103 .410803E-01 .164566 .340869E-01 .169228 .268288E-01
+bezier .186743 .458286E-01 .189949 .740173E-01 .19177 .09779
+aline .19177 .1397
+bezier .190172 .172368 .181708 .217561 .144145 .2286
+aline .141605 .229235
+aline .14097 .22987
+aline .13716 .22987
+aline .136525 .230505
+aline .127 .230505
+aline .126365 .22987
+closepath
+! end of curve
+
+! start of curve
+amove .12827 .04064
+bezier .111086 .039294 .10878 .132953E-01 .12573 .009525
+bezier .136557 .705594E-02 .14774 .111391E-01 .15748 .01651
+bezier .15438 .027569 .147921 .403984E-01 .135255 .041275
+aline .128905 .041275
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="R" !-------------- Beginning of new char.
+dfont wid=.759725 hei=.686111 dep=0 italic=0
+dfont fby="C" kadd=-.0277786
+dfont fby="G" kadd=-.0277786
+dfont fby="O" kadd=-.0277786
+dfont fby="Q" kadd=-.0277786
+dfont fby="T" kadd=-.083334
+dfont fby="U" kadd=-.0277786
+dfont fby="V" kadd=-.111112
+dfont fby="W" kadd=-.111112
+dfont fby="Y" kadd=-.083334
+dfont fby="t" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .137795 .24003
+bezier .171282 .238854 .21441 .223156 .221615 .184785
+bezier .228284 .152816 .200003 .125224 .17018 .118745
+aline .168275 .11811
+bezier .190646 .110143 .207166 .876042E-01 .206375 .064135
+bezier .210669 .469781E-01 .208537 .026359 .22098 .010795
+bezier .232238 .213868E-02 .246611 .125338E-01 .24765 .0254
+aline .248285 .026035
+aline .248285 .02921
+aline .24892 .029845
+aline .24892 .03556
+aline .25019 .0381
+aline .250825 .038735
+aline .253365 .040005
+aline .26035 .040005
+aline .26289 .038735
+bezier .269718 .211492E-01 .25438 -.155656E-02 .235585 -.004445
+bezier .209755 -.463456E-02 .178351 -.335309E-02 .161925 .02032
+aline .159385 .0254
+aline .15748 .031115
+aline .156845 .033655
+aline .156845 .03683
+aline .15621 .037465
+aline .15621 .07874
+bezier .154361 .093409 .146012 .110812 .12954 .113665
+aline .09271 .113665
+aline .092075 .11303
+aline .092075 .015875
+aline .09271 .01524
+aline .125095 .01524
+aline .125095 -.000635
+aline .11557 -.000635
+aline .114935 0
+aline .07747 0
+aline .076835 .000635
+aline .060325 .000635
+aline .05969 0
+aline .022225 0
+aline .02159 -.000635
+aline .012065 -.000635
+aline .012065 .01524
+aline .04445 .01524
+aline .045085 .015875
+aline .045085 .22352
+aline .04445 .224155
+aline .012065 .224155
+aline .012065 .24003
+aline .137795 .24003
+closepath
+! end of curve
+
+! start of curve
+amove .092075 .22352
+aline .092075 .126365
+aline .09271 .12573
+aline .128905 .12573
+bezier .145244 .126774 .167135 .135366 .16764 .15494
+bezier .169332 .173145 .171757 .194249 .161925 .21082
+bezier .153684 .220017 .140649 .222969 .12954 .224155
+aline .09271 .224155
+aline .092075 .22352
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="S" !-------------- Beginning of new char.
+dfont wid=.555557 hei=.686111 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .095885 .24384
+bezier .110743 .242273 .127073 .236867 .13843 .22606
+aline .155575 .243205
+aline .156845 .24384
+aline .161925 .24384
+aline .163195 .243205
+aline .1651 .2413
+aline .1651 .163195
+aline .163195 .16129
+aline .161925 .160655
+aline .1524 .160655
+aline .15113 .16129
+aline .149225 .163195
+bezier .148046 .191253 .131287 .224289 .099695 .227965
+bezier .814633E-01 .233759 .577543E-01 .223124 .055245 .20193
+bezier .502726E-01 .184349 .595458E-01 .161246 .07874 .155575
+bezier .108489 .147487 .145258 .145228 .161925 .11557
+bezier .18554 .790539E-01 .177471 .194716E-01 .13462 .000635
+bezier .106044 -.960871E-02 .725074E-01 -.450755E-02 .473075E-01 .131763E-01
+aline .046355 .0127
+aline .029845 -.00381
+aline .028575 -.004445
+aline .023495 -.004445
+aline .022225 -.00381
+aline .02032 -.001905
+aline .02032 .075565
+aline .020955 .076835
+aline .022225 .078105
+aline .023495 .07874
+aline .03302 .07874
+aline .03429 .078105
+aline .036195 .0762
+bezier .339198E-01 .471657E-01 .552404E-01 .185881E-01 .08509 .01397
+bezier .10303 .84413E-02 .129857 .102659E-01 .13716 .032385
+bezier .147929 .566573E-01 .136499 .935981E-01 .106045 .095885
+aline .070485 .104775
+bezier .156412E-01 .118451 .237621E-02 .199656 .04699 .231775
+bezier .611651E-01 .242402 .788048E-01 .244549 .095885 .24384
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="T" !-------------- Beginning of new char.
+dfont wid=.694448 hei=.686111 dep=0 italic=0
+dfont fby="A" kadd=-.083334
+dfont fby="a" kadd=-.083334
+dfont fby="e" kadd=-.083334
+dfont fby="o" kadd=-.083334
+dfont fby="r" kadd=-.083334
+dfont fby="u" kadd=-.083334
+dfont fby="y" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .222885 .23622
+bezier .225478 .20809 .227912 .179895 .230505 .151765
+aline .21463 .151765
+bezier .211799 .171544 .213039 .196661 .19558 .211455
+bezier .181119 .221328 .1632 .221396 .146685 .21971
+aline .146685 .015875
+aline .14732 .01524
+aline .193675 .01524
+aline .193675 -.000635
+aline .18161 -.000635
+aline .180975 0
+aline .133985 0
+aline .13335 .000635
+aline .111125 .000635
+aline .11049 0
+aline .0635 0
+aline .062865 -.000635
+aline .0508 -.000635
+aline .0508 .01524
+aline .097155 .01524
+aline .09779 .015875
+aline .09779 .21971
+bezier .759467E-01 .22243 .454985E-01 .22027 .03683 .19558
+bezier .317525E-01 .180757 .306453E-01 .166608 .02921 .151765
+aline .013335 .151765
+bezier .159284E-01 .179895 .183616E-01 .20809 .020955 .23622
+aline .222885 .23622
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="U" !-------------- Beginning of new char.
+dfont wid=.769447 hei=.686111 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .02159 .24003
+aline .022225 .239395
+aline .060325 .239395
+aline .06096 .23876
+aline .078105 .23876
+aline .07874 .239395
+aline .11684 .239395
+aline .117475 .24003
+aline .127 .24003
+aline .127 .224155
+aline .094615 .224155
+aline .09398 .22352
+aline .09398 .06477
+bezier .942283E-01 .433689E-01 .104963 .171398E-01 .12954 .013335
+bezier .160504 .487917E-02 .199819 .236337E-01 .205105 .05842
+aline .20574 .061595
+aline .206375 .06223
+aline .206375 .065405
+aline .20701 .06604
+aline .20701 .071755
+aline .207645 .07239
+aline .207645 .21971
+aline .206375 .22098
+aline .205105 .221615
+aline .202565 .22225
+aline .20193 .222885
+aline .19812 .222885
+aline .197485 .22352
+aline .1905 .22352
+aline .189865 .224155
+aline .174625 .224155
+aline .174625 .24003
+aline .18161 .24003
+aline .182245 .239395
+aline .20955 .239395
+aline .210185 .23876
+aline .222885 .23876
+aline .22352 .239395
+aline .250825 .239395
+aline .25146 .24003
+aline .258445 .24003
+aline .258445 .224155
+aline .243205 .224155
+aline .24257 .22352
+aline .235585 .22352
+aline .23495 .222885
+aline .23114 .222885
+aline .230505 .22225
+aline .227965 .221615
+aline .226695 .22098
+aline .225425 .21971
+aline .225425 .070485
+bezier .223948 .345184E-01 .19513 -.612162E-03 .15748 -.003175
+bezier .114247 -.108416E-01 .587227E-01 .994717E-02 .047625 .057785
+aline .04699 .05969
+aline .046355 .062865
+aline .046355 .06604
+aline .04572 .066675
+aline .04572 .07112
+aline .045085 .071755
+aline .045085 .22352
+aline .04445 .224155
+aline .012065 .224155
+aline .012065 .24003
+aline .02159 .24003
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="V" !-------------- Beginning of new char.
+dfont wid=.755559 hei=.686111 dep=0 italic=.0138884
+dfont fby="A" kadd=-.111112
+dfont fby="C" kadd=-.0277786
+dfont fby="G" kadd=-.0277786
+dfont fby="O" kadd=-.0277786
+dfont fby="Q" kadd=-.0277786
+dfont fby="a" kadd=-.083334
+dfont fby="e" kadd=-.083334
+dfont fby="o" kadd=-.083334
+dfont fby="r" kadd=-.083334
+dfont fby="u" kadd=-.083334
+set path ! start of curve
+newpath
+! start of curve
+amove .01651 .24003
+aline .017145 .239395
+aline .050165 .239395
+aline .0508 .23876
+aline .066675 .23876
+aline .06731 .239395
+aline .10541 .239395
+aline .106045 .24003
+aline .11557 .24003
+aline .11557 .224155
+aline .08763 .224155
+bezier .106621 .170981 .127721 .116626 .148273 .636588E-01
+bezier .169008 .115039 .187624 .168158 .20828 .21971
+aline .20701 .22098
+aline .205105 .221615
+aline .20193 .22225
+aline .201295 .222885
+aline .19812 .222885
+aline .197485 .22352
+aline .191135 .22352
+aline .1905 .224155
+aline .180975 .224155
+aline .180975 .24003
+aline .18796 .24003
+aline .188595 .239395
+aline .2159 .239395
+aline .216535 .23876
+aline .227965 .23876
+aline .2286 .239395
+aline .250825 .239395
+aline .25146 .24003
+aline .257175 .24003
+aline .257175 .224155
+aline .24384 .224155
+bezier .237912 .222483 .228247 .22461 .22606 .216535
+bezier .198925 .144498 .171591 .725433E-01 .144145 .000635
+bezier .13797 -.702725E-02 .121544 -.583633E-02 .11938 .00508
+bezier .918133E-01 .781719E-01 .641787E-01 .151236 .036195 .224155
+aline .008255 .224155
+aline .008255 .24003
+aline .01651 .24003
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="W" !-------------- Beginning of new char.
+dfont wid=1.03334 hei=.686111 dep=0 italic=.0138884
+dfont fby="A" kadd=-.111112
+dfont fby="C" kadd=-.0277786
+dfont fby="G" kadd=-.0277786
+dfont fby="O" kadd=-.0277786
+dfont fby="Q" kadd=-.0277786
+dfont fby="a" kadd=-.083334
+dfont fby="e" kadd=-.083334
+dfont fby="o" kadd=-.083334
+dfont fby="r" kadd=-.083334
+dfont fby="u" kadd=-.083334
+set path ! start of curve
+newpath
+! start of curve
+amove .015875 .24003
+aline .01651 .239395
+aline .047625 .239395
+aline .04826 .23876
+aline .064135 .23876
+aline .06477 .239395
+aline .10287 .239395
+aline .103505 .24003
+aline .11303 .24003
+aline .11303 .224155
+aline .084455 .224155
+aline .08382 .22352
+aline .084455 .222885
+aline .10033 .17526
+aline .100965 .17399
+aline .123825 .10541
+aline .12446 .10414
+aline .135255 .071755
+aline .13589 .070485
+aline .149225 .11049
+aline .14986 .11176
+aline .17272 .18034
+aline .173355 .180975
+aline .17272 .18161
+aline .15875 .22352
+aline .158115 .224155
+aline .132715 .224155
+aline .132715 .24003
+aline .140335 .24003
+aline .14097 .239395
+aline .172085 .239395
+aline .17272 .23876
+aline .188595 .23876
+aline .18923 .239395
+aline .22733 .239395
+aline .227965 .24003
+aline .23749 .24003
+aline .23749 .224155
+aline .208915 .224155
+aline .20828 .22352
+aline .208915 .222885
+aline .22479 .17526
+aline .225425 .17399
+aline .248285 .10541
+aline .24892 .10414
+aline .259715 .071755
+aline .26035 .070485
+aline .273685 .11049
+aline .27432 .11176
+aline .29718 .18034
+aline .297815 .18161
+aline .30988 .217805
+aline .310277 .219393
+bezier .305805 .224568 .297026 .222184 .29083 .224155
+aline .2794 .224155
+aline .2794 .24003
+aline .28702 .24003
+aline .287655 .239395
+aline .316865 .239395
+aline .3175 .23876
+aline .328295 .23876
+aline .32893 .239395
+aline .349885 .239395
+aline .35052 .24003
+aline .354965 .24003
+aline .354965 .224155
+aline .3429 .224155
+aline .342265 .22352
+aline .33655 .22352
+aline .335915 .222885
+aline .33274 .22225
+aline .3302 .221615
+aline .32893 .22098
+aline .32766 .21971
+aline .307975 .160655
+aline .30734 .159385
+aline .28448 .090805
+aline .283845 .089535
+aline .260985 .020955
+aline .26035 .019685
+aline .254635 .00254
+aline .253365 0
+aline .250825 -.00254
+aline .249555 -.003175
+aline .24765 -.00381
+aline .24003 -.00381
+aline .238125 -.003175
+aline .236855 -.00254
+aline .234315 0
+aline .233045 .00254
+aline .22733 .019685
+aline .226695 .020955
+aline .203835 .089535
+aline .2032 .090805
+aline .18161 .155575
+aline .16002 .090805
+aline .159385 .089535
+aline .136525 .020955
+aline .13589 .019685
+aline .130175 .00254
+aline .128905 0
+aline .126365 -.00254
+aline .125095 -.003175
+aline .12319 -.00381
+aline .11557 -.00381
+aline .113665 -.003175
+aline .112395 -.00254
+aline .109855 0
+aline .108585 .00254
+aline .10287 .019685
+aline .102235 .020955
+aline .079375 .089535
+aline .07874 .090805
+aline .05588 .159385
+aline .055245 .160655
+aline .03429 .22352
+aline .033655 .224155
+aline .008255 .224155
+aline .008255 .24003
+aline .015875 .24003
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="X" !-------------- Beginning of new char.
+dfont wid=.755559 hei=.686111 dep=0 italic=0
+dfont fby="C" kadd=-.0277786
+dfont fby="G" kadd=-.0277786
+dfont fby="O" kadd=-.0277786
+dfont fby="Q" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .023495 .24003
+aline .02413 .239395
+aline .05715 .239395
+aline .057785 .23876
+aline .074295 .23876
+aline .07493 .239395
+aline .113665 .239395
+aline .1143 .24003
+aline .123825 .24003
+aline .123825 .224155
+aline .09906 .224155
+bezier .110525 .201951 .125526 .179332 .139065 .15748
+bezier .151765 .178439 .167303 .19978 .178435 .220345
+bezier .169066 .223812 .159447 .223909 .149225 .224155
+aline .149225 .24003
+aline .15748 .24003
+aline .158115 .239395
+aline .1905 .239395
+aline .191135 .23876
+aline .205105 .23876
+aline .20574 .239395
+aline .23241 .239395
+aline .233045 .24003
+aline .24003 .24003
+aline .24003 .224155
+bezier .226282 .22346 .211942 .22593 .200025 .219075
+bezier .183153 .192716 .165949 .166597 .149384 .140018
+bezier .174632 .098354 .199891 .566981E-01 .225425 .01524
+aline .25527 .01524
+aline .25527 -.000635
+aline .24638 -.000635
+aline .245745 0
+aline .212725 0
+aline .21209 .000635
+aline .196215 .000635
+aline .19558 0
+aline .156845 0
+aline .15621 -.000635
+aline .14605 -.000635
+aline .14605 .01524
+aline .17145 .01524
+bezier .156812 .422781E-01 .138198 .070409 .12192 .09779
+bezier .105853 .715269E-01 .868102E-01 .449753E-01 .07239 .01905
+bezier .817591E-01 .155829E-01 .913783E-01 .154857E-01 .1016 .01524
+aline .1016 -.000635
+aline .093345 -.000635
+aline .09271 0
+aline .05969 0
+aline .059055 .000635
+aline .04572 .000635
+aline .045085 0
+aline .018415 0
+aline .01778 -.000635
+aline .010795 -.000635
+aline .010795 .01524
+bezier .245429E-01 .015935 .388833E-01 .134646E-01 .0508 .02032
+bezier .706466E-01 .519551E-01 .929133E-01 .842815E-01 .111125 .11557
+bezier .891648E-01 .151803 .670301E-01 .187911 .045085 .224155
+aline .01524 .224155
+aline .01524 .24003
+aline .023495 .24003
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="Y" !-------------- Beginning of new char.
+dfont wid=.755559 hei=.686111 dep=0 italic=.0249996
+dfont fby="A" kadd=-.083334
+dfont fby="a" kadd=-.083334
+dfont fby="e" kadd=-.083334
+dfont fby="o" kadd=-.083334
+dfont fby="r" kadd=-.083334
+dfont fby="u" kadd=-.083334
+set path ! start of curve
+newpath
+! start of curve
+amove .014605 .24003
+aline .01524 .239395
+aline .048895 .239395
+aline .04953 .23876
+aline .06604 .23876
+aline .066675 .239395
+aline .106045 .239395
+aline .10668 .24003
+aline .11684 .24003
+aline .11684 .224155
+aline .090805 .224155
+bezier .10865 .19031 .129685 .154604 .149543 .120809
+bezier .168802 .153332 .187622 .186636 .206163 .21971
+aline .20574 .22098
+aline .203835 .221615
+aline .201295 .22225
+aline .19812 .222885
+aline .197485 .22352
+aline .192405 .22352
+aline .19177 .224155
+aline .182245 .224155
+aline .182245 .24003
+aline .18923 .24003
+aline .189865 .239395
+aline .217805 .239395
+aline .21844 .23876
+aline .22987 .23876
+aline .230505 .239395
+aline .253365 .239395
+aline .254 .24003
+aline .25908 .24003
+aline .25908 .224155
+aline .24511 .224155
+bezier .237079 .22309 .226491 .223354 .22352 .21336
+bezier .201205 .174114 .17906 .134745 .15621 .095885
+aline .15621 .015875
+aline .156845 .01524
+aline .18923 .01524
+aline .18923 -.000635
+aline .179705 -.000635
+aline .17907 0
+aline .141605 0
+aline .14097 .000635
+aline .12446 .000635
+aline .123825 0
+aline .08636 0
+aline .085725 -.000635
+aline .0762 -.000635
+aline .0762 .01524
+aline .108585 .01524
+aline .10922 .015875
+aline .10922 .095885
+bezier .842067E-01 .13831 .602521E-01 .181498 .03556 .224155
+aline .00635 .224155
+aline .00635 .24003
+aline .014605 .24003
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="Z" !-------------- Beginning of new char.
+dfont wid=.611113 hei=.686111 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .189865 .24003
+aline .191135 .239395
+bezier .198975 .232814 .191657 .22198 .187325 .215265
+bezier .150552 .148971 .110959 .822722E-01 .075565 .01651
+aline .118745 .01651
+bezier .142764 .178709E-01 .169533 .032259 .174625 .05842
+bezier .178882 .716885E-01 .179384 .846433E-01 .18034 .098425
+aline .196215 .098425
+bezier .194114 .653987E-01 .191966 .323913E-01 .189865 -.000635
+aline .024765 -.000635
+aline .022225 .000635
+bezier .152142E-01 .133847E-01 .287727E-01 .250506E-01 .033655 .036195
+bezier .06828 .989891E-01 .105939 .161424 .139065 .224155
+aline .09906 .224155
+bezier .758049E-01 .222963 .503079E-01 .20863 .045085 .183515
+aline .043815 .178435
+aline .042545 .172085
+aline .04191 .17145
+aline .04191 .167005
+aline .041275 .16637
+aline .041275 .160655
+aline .04064 .16002
+aline .04064 .155575
+aline .024765 .155575
+bezier .262534E-01 .183724 .277216E-01 .211881 .02921 .24003
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="[" !-------------- Beginning of new char.
+dfont wid=.280002 hei=.75 dep=.25 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .09017 .262255
+aline .09017 .2413
+aline .05969 .2413
+aline .059055 .240665
+aline .059055 -.066675
+aline .05969 -.06731
+aline .09017 -.06731
+aline .09017 -.088265
+aline .0381 -.088265
+aline .0381 .262255
+aline .09017 .262255
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="\" !-------------- Beginning of new char.
+dfont wid=.544446 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .078105 .24257
+aline .079375 .241935
+aline .083185 .238125
+aline .08382 .236855
+aline .08382 .23495
+bezier .641812E-01 .217844 .483363E-01 .192872 .048895 .16637
+bezier .631271E-01 .182017 .935017E-01 .172922 .09525 .15113
+bezier .992144E-01 .130619 .766177E-01 .113158 .057785 .12192
+bezier .324914E-01 .134814 .333716E-01 .1679 .040005 .191135
+bezier .457634E-01 .211715 .586297E-01 .229831 .075565 .24257
+closepath
+! end of curve
+
+! start of curve
+amove .161925 .24257
+aline .163195 .241935
+aline .167005 .238125
+aline .16764 .236855
+aline .16764 .23495
+bezier .148001 .217844 .132156 .192872 .132715 .16637
+bezier .146947 .182017 .177322 .172922 .17907 .15113
+bezier .183034 .130619 .160438 .113158 .141605 .12192
+bezier .116311 .134814 .117192 .1679 .123825 .191135
+bezier .129583 .211715 .14245 .229831 .159385 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="]" !-------------- Beginning of new char.
+dfont wid=.280002 hei=.75 dep=.25 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .060325 .262255
+aline .060325 -.088265
+aline .008255 -.088265
+aline .008255 -.06731
+aline .038735 -.06731
+aline .03937 -.066675
+aline .03937 .240665
+aline .038735 .2413
+aline .008255 .2413
+aline .008255 .262255
+aline .060325 .262255
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="^" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .088265 .24257
+bezier .104097 .2274 .120693 .21329 .136525 .19812
+bezier .132353 .194344 .127845 .181769 .12192 .18923
+bezier .110421 .19719 .996806E-01 .206201 .879475E-01 .213836
+bezier .747387E-01 .205135 .626046E-01 .194942 .04953 .186055
+aline .046355 .18923
+aline .04572 .1905
+aline .04318 .19304
+aline .042545 .19431
+aline .040005 .19685
+aline .03937 .19812
+bezier .055483 .213131 .718754E-01 .228261 .088265 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="_" !-------------- Beginning of new char.
+dfont wid=.277779 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .05334 .243205
+bezier .781244E-01 .239726 .841801E-01 .203845 .06223 .192405
+bezier .445296E-01 .181258 .188738E-01 .198185 .022225 .217805
+bezier .217271E-01 .230335 .325661E-01 .241029 .04445 .243205
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="`" !-------------- Beginning of new char.
+dfont wid=.277779 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .059055 .24257
+aline .060325 .241935
+aline .064135 .238125
+aline .06477 .236855
+aline .06477 .23495
+bezier .451312E-01 .217844 .292863E-01 .192872 .029845 .16637
+bezier .440771E-01 .182017 .744517E-01 .172922 .0762 .15113
+bezier .801644E-01 .130619 .575677E-01 .113158 .038735 .12192
+bezier .134414E-01 .134814 .143216E-01 .1679 .020955 .191135
+bezier .267134E-01 .211715 .395797E-01 .229831 .056515 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="a" !-------------- Beginning of new char.
+dfont wid=.486113 hei=.444445 dep=0 italic=0
+dfont fby="j" kadd=.0555553
+dfont fby="v" kadd=-.0277786
+dfont fby="w" kadd=-.0277786
+dfont fby="y" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .08763 .158115
+bezier .113587 .157279 .144103 .140391 .146685 .11176
+aline .146685 .022225
+bezier .151486 .138875E-01 .161979 .172256E-01 .16891 .013335
+aline .17018 .010795
+aline .17018 .00381
+aline .16891 .00127
+aline .168275 .000635
+aline .165735 -.000635
+bezier .148155 .10832E-03 .124478 -.532892E-02 .1143 .013335
+aline .11303 .017145
+aline .11303 .024765
+bezier .107669 .167917E-01 .990665E-01 .459897E-02 .08763 .000635
+bezier .063546 -.666958E-02 .328373E-01 -.190427E-02 .015875 .018415
+bezier -.104288E-02 .433205E-01 .212872E-01 .743737E-01 .04699 .08128
+bezier .666851E-01 .895455E-01 .874659E-01 .089983 .107315 .092075
+bezier .108176 .111292 .107576 .137421 .085725 .14478
+bezier .760253E-01 .147285 .650038E-01 .146108 .560388E-01 .143193
+bezier .705511E-01 .131978 .630811E-01 .104205 .043815 .104775
+bezier .283067E-01 .101398 .148977E-01 .120479 .02159 .135255
+bezier .287949E-01 .153229 .509728E-01 .156516 .06731 .158115
+aline .08763 .158115
+closepath
+! end of curve
+
+! start of curve
+amove .104775 .080645
+bezier .824822E-01 .795682E-01 .531612E-01 .678701E-01 .051435 .04191
+bezier .471605E-01 .255997E-01 .631893E-01 .33291E-02 .08128 .010795
+bezier .956628E-01 .135915E-01 .105015 .274554E-01 .107315 .04064
+aline .107315 .080645
+aline .106045 .810684E-01
+aline .104775 .080645
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="b" !-------------- Beginning of new char.
+dfont wid=.555557 hei=.694445 dep=0 italic=0
+dfont fby="c" kadd=.0277786
+dfont fby="d" kadd=.0277786
+dfont fby="e" kadd=.0277786
+dfont fby="j" kadd=.0555553
+dfont fby="o" kadd=.0277786
+dfont fby="q" kadd=.0277786
+dfont fby="v" kadd=-.0277786
+dfont fby="w" kadd=-.0277786
+dfont fby="x" kadd=-.0277786
+dfont fby="y" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .067945 .24257
+aline .067945 .142875
+bezier .097599 .16616 .149476 .160254 .17018 .12573
+bezier .192728 .884301E-01 .186796 .316399E-01 .14732 .00762
+bezier .120988 -.670755E-02 .852766E-01 -.779596E-02 .638175E-01 .157163E-01
+aline .062865 .01524
+aline .04699 -.000635
+aline .03048 -.000635
+aline .03048 .2159
+aline .029845 .216535
+aline .02921 .219075
+aline .027305 .22098
+aline .026035 .221615
+aline .02413 .22225
+aline .023495 .222885
+aline .01905 .222885
+aline .018415 .22352
+aline .00635 .22352
+aline .00635 .239395
+bezier .268337E-01 .240569 .474571E-01 .241406 .067945 .24257
+closepath
+! end of curve
+
+! start of curve
+amove .102235 .144145
+bezier .893283E-01 .143122 .773816E-01 .134734 .06985 .12446
+aline .06985 .03048
+bezier .08073 .936776E-02 .111291 .146251E-02 .127635 .020955
+bezier .136138 .318459E-01 .13708 .045888 .13843 .05842
+aline .13843 .097155
+bezier .13776 .114956 .133479 .140599 .111125 .144145
+aline .11049 .14478
+aline .10287 .14478
+aline .102235 .144145
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="c" !-------------- Beginning of new char.
+dfont wid=.444446 hei=.444445 dep=0 italic=0
+dfont fby="h" kadd=-.0277786
+dfont fby="k" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .097155 .158115
+bezier .114187 .156685 .13817 .150733 .141605 .130175
+bezier .145792 .110981 .122285 .971749E-01 .107315 .10795
+bezier .960101E-01 .115699 .952542E-01 .133577 .105251 .142558
+bezier .901799E-01 .149 .675697E-01 .142853 .06223 .12446
+bezier .583667E-01 .114681 .575981E-01 .10506 .056515 .09525
+aline .056515 .062865
+bezier .573158E-01 .424916E-01 .652723E-01 .148994E-01 .089535 .010795
+bezier .108464 .87129E-02 .126541 .229846E-01 .130175 .04191
+aline .13208 .043815
+aline .13335 .04445
+aline .142875 .04445
+bezier .150596 .391013E-01 .141665 .283088E-01 .13843 .022225
+bezier .108089 -.211804E-01 .323585E-01 -.475652E-02 .017145 .04445
+bezier .382147E-02 .830907E-01 .014837 .135824 .056515 .1524
+aline .06604 .155575
+aline .07112 .156845
+aline .074295 .156845
+aline .07493 .15748
+aline .079375 .15748
+aline .08001 .158115
+aline .097155 .158115
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="d" !-------------- Beginning of new char.
+dfont wid=.555557 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .164465 .24257
+aline .164465 .02286
+aline .1651 .022225
+aline .165735 .019685
+aline .16764 .01778
+aline .16891 .017145
+aline .170815 .01651
+aline .17145 .015875
+aline .175895 .015875
+aline .17653 .01524
+aline .188595 .01524
+aline .188595 -.000635
+aline .17907 -.000635
+aline .178435 -.00127
+aline .15748 -.00127
+aline .156845 -.001905
+aline .13589 -.001905
+aline .135255 -.00254
+aline .125095 -.00254
+aline .125095 .010795
+bezier .115907 .553851E-02 .103436 -.199209E-02 .09144 -.00254
+bezier .533793E-01 -.722371E-02 .154143E-01 .227268E-01 .013335 .061595
+bezier .572101E-02 .982203E-01 .245207E-01 .14371 .064135 .15367
+bezier .846686E-01 .159269 .108529 .158456 .126048 .144304
+aline .127 .14478
+aline .127 .2159
+aline .126365 .216535
+aline .12573 .219075
+aline .123825 .22098
+aline .122555 .221615
+aline .12065 .22225
+aline .120015 .222885
+aline .11557 .222885
+aline .114935 .22352
+aline .10287 .22352
+aline .10287 .239395
+bezier .123354 .240569 .143977 .241406 .164465 .24257
+closepath
+! end of curve
+
+! start of curve
+amove .086995 .144145
+bezier .641927E-01 .141164 .563637E-01 .115742 .05715 .09652
+aline .056515 .095885
+aline .056515 .05715
+bezier .057209 .393762E-01 .614859E-01 .136904E-01 .08382 .01016
+bezier .099898 .718833E-02 .116715 .185216E-01 .125095 .032385
+aline .125095 .12573
+bezier .117019 .137944 .101325 .147082 .086995 .144145
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="e" !-------------- Beginning of new char.
+dfont wid=.466667 hei=.444445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .09525 .158115
+bezier .125539 .15717 .151575 .130898 .1524 .10033
+aline .153035 .099695
+aline .153035 .093345
+aline .15367 .09271
+aline .15367 .080645
+aline .1524 .078105
+aline .151765 .07747
+aline .149225 .0762
+aline .055245 .0762
+bezier .532426E-01 .535146E-01 .562373E-01 .212052E-01 .08255 .0127
+bezier .105491 .535381E-02 .132846 .207321E-01 .1397 .04445
+aline .14224 .04572
+aline .149225 .04572
+bezier .159253 .404783E-01 .149262 .028053 .145415 .02159
+bezier .108617 -.232575E-01 .245194E-01 -.303839E-02 .0127 .05461
+bezier .309229E-02 .915401E-01 .171968E-01 .138903 .056515 .153035
+aline .06223 .15494
+aline .06477 .155575
+aline .066675 .15621
+aline .06985 .156845
+aline .073025 .156845
+aline .07366 .15748
+aline .078105 .15748
+aline .07874 .158115
+aline .09525 .158115
+closepath
+! end of curve
+
+! start of curve
+amove .083185 .145415
+bezier .600298E-01 .141889 .556278E-01 .114778 .05461 .09652
+aline .05461 .08763
+aline .055245 .086995
+aline .120015 .086995
+bezier .121413 .105202 .118275 .128079 .10287 .14097
+aline .09652 .144145
+aline .09398 .14478
+aline .090805 .145415
+aline .09017 .14605
+aline .08382 .14605
+aline .083185 .145415
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="f" !-------------- Beginning of new char.
+dfont wid=.305557 hei=.694445 dep=0 italic=.111112
+dfont fby=33 kadd=.111112
+dfont fby=39 kadd=.111112
+dfont fby=")" kadd=.111112
+dfont fby="?" kadd=.111112
+dfont fby="]" kadd=.111112
+dfont fby="f" ligrep=11
+dfont fby="i" ligrep=12
+dfont fby="l" ligrep=13
+set path ! start of curve
+newpath
+! start of curve
+amove .10922 .244475
+bezier .128792 .243508 .147875 .21978 .135255 .201295
+bezier .12508 .186572 .989513E-01 .192201 .09652 .210185
+aline .09652 .21844
+aline .097155 .22098
+aline .09779 .222885
+aline .09906 .225425
+aline .099695 .22606
+aline .10033 .22733
+aline .104775 .231775
+bezier .866626E-01 .235764 .703501E-01 .2171 .070485 .19939
+aline .06985 .198755
+aline .06985 .155575
+aline .070485 .15494
+aline .10414 .15494
+aline .10414 .139065
+aline .07239 .139065
+aline .071755 .13843
+aline .071755 .015875
+aline .07239 .01524
+aline .102235 .01524
+aline .102235 -.000635
+aline .09398 -.000635
+aline .093345 0
+aline .06096 0
+aline .060325 .000635
+aline .046355 .000635
+aline .04572 0
+aline .01778 0
+aline .017145 -.000635
+aline .01016 -.000635
+aline .01016 .01524
+aline .033655 .01524
+aline .03429 .015875
+aline .03429 .13843
+aline .033655 .139065
+aline .013335 .139065
+aline .013335 .15494
+aline .033655 .15494
+aline .03429 .155575
+aline .03429 .19812
+bezier .372167E-01 .22717 .682962E-01 .243656 .094615 .244475
+aline .10922 .244475
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="g" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.444445 dep=.194445 italic=.0138884
+dfont fby="j" kadd=.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .15494 .15875
+bezier .171474 .156179 .177224 .127899 .15875 .123825
+bezier .146628 .120922 .137079 .133607 .141393 .144145
+aline .141097 .145034
+aline .140653 .145256
+aline .1397 .14478
+aline .13589 .14351
+aline .12954 .140335
+aline .128905 .1397
+aline .127635 .139065
+bezier .152305 .115218 .141361 .690175E-01 .108585 .05842
+bezier .861515E-01 .050063 .615387E-01 .522658E-01 .039751 .061087
+bezier .320645E-01 .488778E-01 .395544E-01 .305603E-01 .053975 .02794
+aline .104775 .02794
+bezier .128295 .273101E-01 .15855 .175106E-01 .164465 -.009525
+bezier .169587 -.262878E-01 .165794 -.466472E-01 .14986 -.056515
+bezier .120493 -.758593E-01 .834214E-01 -.737701E-01 .0508 -.067945
+bezier .280374E-01 -.632092E-01 .180463E-02 -.042227 .01143 -.01651
+bezier .159511E-01 -.712055E-02 .248261E-01 -.901161E-04 .034925 .00254
+bezier .159229E-01 .186525E-01 .160878E-01 .494249E-01 .032385 .06731
+bezier .421619E-02 .895458E-01 .012153 .138545 .04572 .15113
+bezier .697591E-01 .159652 .981349E-01 .160137 .120015 .145415
+aline .12446 .14986
+aline .12573 .150495
+aline .126365 .15113
+aline .127635 .151765
+aline .12827 .1524
+aline .13462 .155575
+aline .140335 .15748
+aline .142875 .158115
+aline .14605 .158115
+aline .146685 .15875
+closepath
+! end of curve
+
+! start of curve
+amove .07366 .144145
+bezier .600229E-01 .143211 .543898E-01 .129227 .053975 .11811
+bezier .551543E-01 .100424 .488859E-01 .760693E-01 .06858 .06731
+bezier .824849E-01 .607597E-01 .100856 .709078E-01 .1016 .08636
+bezier .10123 .104277 .107143 .12676 .09271 .140335
+aline .08763 .142875
+aline .085725 .14351
+aline .08255 .144145
+aline .081915 .14478
+aline .074295 .14478
+closepath
+! end of curve
+
+! start of curve
+amove .05334 -.005715
+bezier .318149E-01 -.012429 .037484 -.452411E-01 .05588 -.052705
+bezier .797382E-01 -.634065E-01 .111441 -.636242E-01 .13081 -.043815
+bezier .140121 -.324787E-01 .137793 -.127509E-01 .12192 -.00889
+aline .120015 -.008255
+aline .117475 -.00762
+aline .1143 -.006985
+aline .113665 -.00635
+aline .11049 -.00635
+aline .109855 -.005715
+aline .103505 -.005715
+aline .10287 -.00508
+aline .053975 -.00508
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="h" !-------------- Beginning of new char.
+dfont wid=.555557 hei=.694445 dep=0 italic=0
+dfont fby="b" kadd=-.0277786
+dfont fby="t" kadd=-.0277786
+dfont fby="u" kadd=-.0277786
+dfont fby="v" kadd=-.0277786
+dfont fby="w" kadd=-.0277786
+dfont fby="y" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .070485 .24257
+aline .070485 .125095
+bezier .775885E-01 .134443 .873402E-01 .148414 .100965 .153035
+bezier .124122 .161862 .159346 .157525 .167005 .12954
+aline .16764 .127635
+aline .168275 .125095
+aline .168275 .12192
+aline .16891 .121285
+aline .16891 .11684
+aline .169545 .116205
+aline .169545 .015875
+aline .17018 .01524
+aline .193675 .01524
+aline .193675 -.000635
+aline .18669 -.000635
+aline .186055 0
+aline .156845 0
+aline .15621 .000635
+aline .14351 .000635
+aline .142875 0
+aline .11557 0
+aline .114935 -.000635
+aline .10795 -.000635
+aline .10795 .01524
+aline .12954 .01524
+aline .130175 .015875
+aline .130175 .12065
+bezier .128814 .129545 .127919 .146865 .1143 .14478
+bezier .908506E-01 .142186 .745135E-01 .118678 .07239 .09652
+aline .07239 .015875
+aline .073025 .01524
+aline .09652 .01524
+aline .09652 -.000635
+aline .089535 -.000635
+aline .0889 0
+aline .05969 0
+aline .059055 .000635
+aline .046355 .000635
+aline .04572 0
+aline .01651 0
+aline .015875 -.000635
+aline .00889 -.000635
+aline .00889 .01524
+aline .032385 .01524
+aline .03302 .015875
+aline .03302 .2159
+aline .032385 .216535
+aline .03175 .219075
+aline .029845 .22098
+aline .028575 .221615
+aline .02667 .22225
+aline .026035 .222885
+aline .02159 .222885
+aline .020955 .22352
+aline .00889 .22352
+aline .00889 .239395
+bezier .293737E-01 .240569 .499971E-01 .241406 .070485 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="i" !-------------- Beginning of new char.
+dfont wid=.277779 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .05207 .243205
+bezier .709024E-01 .240223 .812516E-01 .21616 .06985 .20066
+bezier .574887E-01 .181409 .251073E-01 .187888 .020955 .210185
+bezier .171817E-01 .225066 .282497E-01 .240806 .04318 .243205
+closepath
+! end of curve
+
+! start of curve
+amove .07112 .156845
+aline .07112 .015875
+aline .071755 .01524
+aline .093345 .01524
+aline .093345 -.000635
+aline .08636 -.000635
+aline .085725 0
+aline .059055 0
+aline .05842 .000635
+aline .04572 .000635
+aline .045085 0
+aline .017145 0
+aline .01651 -.000635
+aline .009525 -.000635
+aline .009525 .01524
+aline .03302 .01524
+aline .033655 .015875
+aline .033655 .13081
+bezier .300035E-01 .140014 .183886E-01 .137192 .01016 .137795
+aline .01016 .15367
+bezier .304434E-01 .154817 .508366E-01 .155698 .07112 .156845
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="j" !-------------- Beginning of new char.
+dfont wid=.305557 hei=.694445 dep=.194445 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .06223 .243205
+bezier .859241E-01 .240521 .937479E-01 .205723 .073025 .193675
+bezier .053985 .179254 .246981E-01 .200121 .03175 .222885
+aline .03302 .226695
+aline .034925 .230505
+aline .03556 .23114
+aline .036195 .23241
+aline .04191 .238125
+aline .04318 .23876
+aline .043815 .239395
+aline .047625 .2413
+aline .051435 .24257
+aline .053975 .243205
+closepath
+! end of curve
+
+! start of curve
+amove .08509 .156845
+aline .08509 -.023495
+bezier .797119E-01 -.069003 .136792E-01 -.087991 -.01651 -.05461
+bezier -.262001E-01 -.419392E-01 -.202401E-01 -.199059E-01 -.003175 -.01778
+bezier .163139E-01 -.135618E-01 .302654E-01 -.385963E-01 .01778 -.05334
+aline .014605 -.056515
+aline .013335 -.05715
+bezier .240753E-01 -.618603E-01 .387581E-01 -.584335E-01 .042545 -.04572
+aline .04445 -.040005
+aline .045085 -.037465
+aline .04572 -.03429
+aline .046355 -.033655
+aline .046355 -.03048
+aline .04699 -.029845
+aline .04699 -.024765
+aline .047625 -.02413
+aline .047625 .130175
+bezier .043431 .140692 .301892E-01 .13695 .020955 .137795
+aline .020955 .15367
+bezier .422675E-01 .154887 .637539E-01 .155685 .08509 .156845
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="k" !-------------- Beginning of new char.
+dfont wid=.527781 hei=.694445 dep=0 italic=0
+dfont fby="a" kadd=-.0555553
+dfont fby="c" kadd=-.0277786
+dfont fby="e" kadd=-.0277786
+dfont fby="o" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .067945 .24257
+aline .067945 .086995
+aline .06858 .08636
+bezier .856364E-01 .102407 .103821 .118165 .119777 .134937
+aline .119471 .136162
+aline .118745 .136525
+aline .11684 .13716
+aline .1143 .137795
+aline .113665 .13843
+aline .11049 .13843
+aline .109855 .139065
+aline .10414 .139065
+aline .10414 .15494
+aline .11176 .15494
+aline .112395 .154305
+aline .140335 .154305
+aline .14097 .15367
+aline .150495 .15367
+aline .15113 .154305
+aline .16637 .154305
+aline .167005 .15494
+aline .170815 .15494
+aline .170815 .139065
+bezier .157183 .139695 .143194 .138057 .13462 .12573
+aline .13335 .125095
+aline .125095 .11684
+aline .123825 .116205
+aline .11557 .10795
+aline .1143 .107315
+aline .10541 .098425
+bezier .104093 .933541E-01 .112019 .878596E-01 .1143 .08255
+bezier .12867 .607908E-01 .142925 .389481E-01 .158115 .01778
+aline .160655 .01651
+aline .16129 .015875
+aline .1651 .015875
+aline .165735 .01524
+aline .17907 .01524
+aline .17907 -.000635
+aline .17399 -.000635
+aline .173355 0
+aline .15113 0
+aline .150495 .000635
+aline .139065 .000635
+aline .13843 0
+aline .109855 0
+aline .10922 -.000635
+aline .102235 -.000635
+aline .102235 .01524
+aline .10922 .01524
+aline .109855 .015875
+aline .11303 .01651
+bezier .118683 .204417E-01 .109475 .266063E-01 .10795 .031115
+bezier .980867E-01 .450522E-01 .889256E-01 .596905E-01 .790575E-01 .735013E-01
+aline .078105 .073025
+aline .0762 .07112
+aline .07493 .070485
+aline .06604 .061595
+aline .06604 .015875
+aline .066675 .01524
+aline .09017 .01524
+aline .09017 -.000635
+aline .083185 -.000635
+aline .08255 0
+aline .055245 0
+aline .05461 .000635
+aline .04191 .000635
+aline .041275 0
+aline .01397 0
+aline .013335 -.000635
+aline .00635 -.000635
+aline .00635 .01524
+aline .029845 .01524
+aline .03048 .015875
+aline .03048 .2159
+aline .029845 .216535
+aline .02921 .219075
+aline .027305 .22098
+aline .026035 .221615
+aline .02413 .22225
+aline .023495 .222885
+aline .01905 .222885
+aline .018415 .22352
+aline .00635 .22352
+aline .00635 .239395
+bezier .268337E-01 .240569 .474571E-01 .241406 .067945 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="l" !-------------- Beginning of new char.
+dfont wid=.277779 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .07112 .24257
+aline .07112 .015875
+aline .071755 .01524
+aline .09525 .01524
+aline .09525 -.000635
+aline .088265 -.000635
+aline .08763 0
+aline .05969 0
+aline .059055 .000635
+aline .04572 .000635
+aline .045085 0
+aline .017145 0
+aline .01651 -.000635
+aline .009525 -.000635
+aline .009525 .01524
+aline .03302 .01524
+aline .033655 .015875
+aline .033655 .2159
+aline .03302 .216535
+aline .032385 .219075
+aline .03048 .22098
+aline .02921 .221615
+aline .027305 .22225
+aline .02667 .222885
+aline .022225 .222885
+aline .02159 .22352
+aline .009525 .22352
+aline .009525 .239395
+bezier .300087E-01 .240569 .506321E-01 .241406 .07112 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="m" !-------------- Beginning of new char.
+dfont wid=.833336 hei=.444445 dep=0 italic=0
+dfont fby="b" kadd=-.0277786
+dfont fby="t" kadd=-.0277786
+dfont fby="u" kadd=-.0277786
+dfont fby="v" kadd=-.0277786
+dfont fby="w" kadd=-.0277786
+dfont fby="y" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .06858 .156845
+aline .06858 .121285
+bezier .741076E-01 .128451 .805465E-01 .140896 .09017 .146685
+bezier .10865 .160302 .13563 .160436 .15494 .14859
+aline .16129 .14224
+aline .161925 .14097
+aline .16256 .140335
+aline .163195 .139065
+aline .16383 .13843
+aline .16637 .13335
+aline .168275 .127635
+aline .16891 .125095
+bezier .18022 .146117 .204575 .161232 .2286 .15621
+bezier .250908 .157697 .267973 .136652 .26797 .116205
+aline .26797 .015875
+aline .268605 .01524
+aline .2921 .01524
+aline .2921 -.000635
+aline .285115 -.000635
+aline .28448 0
+aline .25527 0
+aline .254635 .000635
+aline .241935 .000635
+aline .2413 0
+aline .21336 0
+aline .212725 -.000635
+aline .20574 -.000635
+aline .20574 .01524
+aline .227965 .01524
+aline .2286 .015875
+aline .2286 .120015
+bezier .227418 .129254 .22623 .147303 .21209 .14478
+bezier .188734 .141973 .172343 .118755 .17018 .09652
+aline .17018 .015875
+aline .170815 .01524
+aline .19431 .01524
+aline .19431 -.000635
+aline .187325 -.000635
+aline .18669 0
+aline .15748 0
+aline .156845 .000635
+aline .144145 .000635
+aline .14351 0
+aline .11557 0
+aline .114935 -.000635
+aline .10795 -.000635
+aline .10795 .01524
+aline .130175 .01524
+aline .13081 .015875
+aline .13081 .120015
+bezier .129628 .129254 .12844 .147303 .1143 .14478
+bezier .090944 .141973 .745528E-01 .118755 .07239 .09652
+aline .07239 .015875
+aline .073025 .01524
+aline .09652 .01524
+aline .09652 -.000635
+aline .089535 -.000635
+aline .0889 0
+aline .05969 0
+aline .059055 .000635
+aline .046355 .000635
+aline .04572 0
+aline .01651 0
+aline .015875 -.000635
+aline .00889 -.000635
+aline .00889 .01524
+aline .032385 .01524
+aline .03302 .015875
+aline .03302 .130175
+aline .032385 .13081
+aline .03175 .13335
+aline .029845 .135255
+aline .028575 .13589
+aline .02667 .136525
+aline .026035 .13716
+aline .02159 .13716
+aline .020955 .137795
+aline .00889 .137795
+aline .00889 .15367
+bezier .287642E-01 .154783 .486867E-01 .155779 .06858 .156845
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="n" !-------------- Beginning of new char.
+dfont wid=.555557 hei=.444445 dep=0 italic=0
+dfont fby="b" kadd=-.0277786
+dfont fby="t" kadd=-.0277786
+dfont fby="u" kadd=-.0277786
+dfont fby="v" kadd=-.0277786
+dfont fby="w" kadd=-.0277786
+dfont fby="y" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .06858 .156845
+aline .06858 .121285
+bezier .745586E-01 .129748 .822936E-01 .143097 .093345 .149225
+bezier .114016 .160628 .144084 .16114 .160655 .14224
+bezier .166748 .134879 .168275 .124763 .169545 .116205
+aline .169545 .015875
+aline .17018 .01524
+aline .193675 .01524
+aline .193675 -.000635
+aline .18669 -.000635
+aline .186055 0
+aline .156845 0
+aline .15621 .000635
+aline .14351 .000635
+aline .142875 0
+aline .11557 0
+aline .114935 -.000635
+aline .10795 -.000635
+aline .10795 .01524
+aline .12954 .01524
+aline .130175 .015875
+aline .130175 .12065
+bezier .128814 .129545 .127919 .146865 .1143 .14478
+bezier .908506E-01 .142186 .745135E-01 .118678 .07239 .09652
+aline .07239 .015875
+aline .073025 .01524
+aline .09652 .01524
+aline .09652 -.000635
+aline .089535 -.000635
+aline .0889 0
+aline .05969 0
+aline .059055 .000635
+aline .046355 .000635
+aline .04572 0
+aline .01651 0
+aline .015875 -.000635
+aline .00889 -.000635
+aline .00889 .01524
+aline .032385 .01524
+aline .03302 .015875
+aline .03302 .130175
+aline .032385 .13081
+aline .03175 .13335
+aline .029845 .135255
+aline .028575 .13589
+aline .02667 .136525
+aline .026035 .13716
+aline .02159 .13716
+aline .020955 .137795
+aline .00889 .137795
+aline .00889 .15367
+bezier .287642E-01 .154783 .486867E-01 .155779 .06858 .156845
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="o" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.444445 dep=0 italic=0
+dfont fby="c" kadd=.0277786
+dfont fby="d" kadd=.0277786
+dfont fby="e" kadd=.0277786
+dfont fby="j" kadd=.0555553
+dfont fby="o" kadd=.0277786
+dfont fby="q" kadd=.0277786
+dfont fby="v" kadd=-.0277786
+dfont fby="w" kadd=-.0277786
+dfont fby="x" kadd=-.0277786
+dfont fby="y" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .09525 .158115
+bezier .130437 .157141 .162867 .126542 .164465 .090805
+bezier .172371 .537964E-01 .151592 .825272E-02 .111125 0
+bezier .747944E-01 -.969592E-02 .277633E-01 .507691E-02 .01524 .04445
+bezier .15877E-02 .832999E-01 .013893 .135928 .05588 .1524
+bezier .687113E-01 .157694 .816226E-01 .158347 .09525 .158115
+closepath
+! end of curve
+
+! start of curve
+amove .083185 .145415
+bezier .617539E-01 .143346 .536945E-01 .120434 .055245 .102235
+aline .05461 .1016
+aline .05461 .057785
+bezier .055348 .041206 .057696 .186011E-01 .07747 .0127
+bezier .970443E-01 .461586E-02 .119344 .217159E-01 .120015 .04191
+aline .120015 .04699
+aline .12065 .047625
+aline .12065 .05715
+aline .121285 .057785
+aline .121285 .1016
+bezier .120717 .117616 .117365 .138855 .098425 .144145
+aline .095885 .14478
+aline .09271 .145415
+aline .092075 .14605
+aline .08382 .14605
+aline .083185 .145415
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="p" !-------------- Beginning of new char.
+dfont wid=.555557 hei=.444445 dep=.194445 italic=0
+dfont fby="c" kadd=.0277786
+dfont fby="d" kadd=.0277786
+dfont fby="e" kadd=.0277786
+dfont fby="j" kadd=.0555553
+dfont fby="o" kadd=.0277786
+dfont fby="q" kadd=.0277786
+dfont fby="v" kadd=-.0277786
+dfont fby="w" kadd=-.0277786
+dfont fby="x" kadd=-.0277786
+dfont fby="y" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .067945 .156845
+aline .067945 .142875
+bezier .818709E-01 .151796 .101745 .159782 .11938 .15621
+bezier .155937 .155339 .182158 .119678 .18288 .085725
+bezier .18618 .527338E-01 .170799 .01544 .137795 .003175
+bezier .115965 -.487218E-02 .890026E-01 -.643711E-02 .070485 .01016
+aline .06985 .009525
+aline .06985 -.052705
+aline .070485 -.05334
+aline .09398 -.05334
+aline .09398 -.069215
+aline .086995 -.069215
+aline .08636 -.06858
+aline .05715 -.06858
+aline .056515 -.067945
+aline .043815 -.067945
+aline .04318 -.06858
+aline .01397 -.06858
+aline .013335 -.069215
+aline .00635 -.069215
+aline .00635 -.05334
+aline .029845 -.05334
+aline .03048 -.052705
+aline .03048 .132715
+aline .029845 .13335
+aline .02921 .13462
+aline .02794 .13589
+aline .026035 .136525
+aline .0254 .13716
+aline .020955 .13716
+aline .02032 .137795
+aline .00635 .137795
+aline .00635 .15367
+bezier .268337E-01 .154844 .474571E-01 .155681 .067945 .156845
+closepath
+! end of curve
+
+! start of curve
+amove .102235 .142875
+bezier .893977E-01 .142064 .077691 .133863 .06985 .123825
+aline .06985 .03048
+bezier .797742E-01 .106901E-01 .110375 .383055E-03 .12446 .02159
+bezier .141904 .049029 .140954 .083756 .133985 .113665
+bezier .130319 .128188 .119151 .146795 .102235 .142875
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="q" !-------------- Beginning of new char.
+dfont wid=.527779 hei=.444445 dep=.194445 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .094615 .156845
+bezier .109858 .155109 .123276 .145126 .13208 .132715
+bezier .138255 .140732 .143966 .149084 .150495 .156845
+aline .164465 .156845
+aline .164465 -.052705
+aline .1651 -.05334
+aline .188595 -.05334
+aline .188595 -.069215
+aline .18161 -.069215
+aline .180975 -.06858
+aline .151765 -.06858
+aline .15113 -.067945
+aline .13843 -.067945
+aline .137795 -.06858
+aline .108585 -.06858
+aline .10795 -.069215
+aline .100965 -.069215
+aline .100965 -.05334
+aline .12446 -.05334
+aline .125095 -.052705
+aline .125095 .012065
+bezier .1163 .594874E-02 .103641 -.185515E-02 .09144 -.00254
+bezier .534515E-01 -.716484E-02 .149872E-01 .229659E-01 .013335 .06223
+bezier .574832E-02 .986399E-01 .247243E-01 .143878 .064135 .15367
+aline .071755 .155575
+aline .07493 .155575
+aline .075565 .15621
+aline .08001 .15621
+aline .080645 .156845
+aline .094615 .156845
+closepath
+! end of curve
+
+! start of curve
+amove .08763 .142875
+bezier .637136E-01 .136823 .587067E-01 .107444 .056515 .08763
+bezier .056294 .622018E-01 .563952E-01 .344369E-01 .07493 .014605
+bezier .094473 .567153E-03 .11933 .193068E-01 .127 .038735
+aline .127 .108585
+bezier .122113 .126332 .108731 .145855 .088265 .14351
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="r" !-------------- Beginning of new char.
+dfont wid=.42778 hei=.444445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .064135 .156845
+aline .064135 .125095
+bezier .670816E-01 .128869 .697793E-01 .138465 .074295 .14351
+bezier .907395E-01 .165804 .133667 .159744 .140335 .13208
+bezier .144153 .113547 .122324 .100297 .107315 .109855
+bezier .945617E-01 .11692 .096076 .13595 .103505 .14478
+bezier .778892E-01 .145484 .711398E-01 .1145 .06858 .09525
+aline .06858 .088265
+aline .067945 .08763
+aline .067945 .015875
+aline .06858 .01524
+aline .098425 .01524
+aline .098425 -.000635
+aline .09017 -.000635
+aline .089535 0
+aline .05715 0
+aline .056515 .000635
+aline .042545 .000635
+aline .04191 0
+aline .01397 0
+aline .013335 -.000635
+aline .00635 -.000635
+aline .00635 .01524
+aline .029845 .01524
+aline .03048 .015875
+aline .03048 .130175
+aline .029845 .13081
+aline .02921 .13335
+aline .027305 .135255
+aline .026035 .13589
+aline .02413 .136525
+aline .023495 .13716
+aline .01905 .13716
+aline .018415 .137795
+aline .00635 .137795
+aline .00635 .15367
+bezier .255708E-01 .154827 .448854E-01 .155757 .064135 .156845
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="s" !-------------- Beginning of new char.
+dfont wid=.394445 hei=.444445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .0762 .158115
+bezier .831986E-01 .157669 .917896E-01 .15417 .09779 .1524
+aline .10287 .15494
+aline .103505 .155575
+aline .107315 .15748
+aline .10922 .158115
+aline .1143 .158115
+aline .11557 .15748
+aline .117475 .155575
+aline .117475 .113665
+aline .11557 .11176
+aline .1143 .111125
+aline .104775 .111125
+aline .103505 .11176
+aline .1016 .113665
+bezier .103527 .130251 .902334E-01 .146276 .07366 .14732
+bezier .591977E-01 .148298 .391453E-01 .14565 .036195 .12827
+bezier .345013E-01 .115862 .460494E-01 .106698 .05715 .10414
+bezier .829123E-01 .100564 .112561 .932392E-01 .12319 .066675
+bezier .133621 .401207E-01 .12033 .463799E-02 .09017 -.000635
+bezier .719336E-01 -.476942E-02 .505781E-01 -.296216E-02 .03556 .006985
+bezier .286003E-01 .351201E-02 .197764E-01 -.752415E-02 .012065 0
+aline .012065 .05207
+aline .0127 .05334
+aline .01397 .05461
+aline .01524 .055245
+aline .024765 .055245
+aline .026035 .05461
+bezier .322474E-01 .039688 .358725E-01 .194631E-01 .05334 .0127
+bezier .069808 .617535E-02 .957841E-01 .834068E-02 .1016 .028575
+bezier .105848 .438137E-01 .935486E-01 .596583E-01 .078105 .06223
+bezier .526045E-01 .658284E-01 .021735 .731784E-01 .013335 .100965
+bezier .546231E-02 .127053 .252937E-01 .156712 .05334 .156845
+aline .053975 .15748
+aline .059055 .15748
+aline .05969 .158115
+aline .0762 .158115
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="t" !-------------- Beginning of new char.
+dfont wid=.390279 hei=.634921 dep=0 italic=0
+dfont fby="w" kadd=-.0277786
+dfont fby="y" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .06858 .221615
+aline .06858 .155575
+aline .069215 .15494
+aline .111125 .15494
+aline .111125 .139065
+aline .069215 .139065
+aline .06858 .13843
+aline .06858 .03302
+bezier .691051E-01 .233765E-01 .753568E-01 .784675E-02 .08763 .01143
+aline .089535 .012065
+aline .092075 .013335
+aline .094615 .015875
+aline .09779 .022225
+aline .098425 .02413
+aline .099695 .02921
+aline .10033 .029845
+aline .10033 .03429
+aline .100965 .034925
+aline .100965 .06096
+aline .11684 .06096
+bezier .117715 .039871 .118246 .149229E-01 .098425 .001905
+bezier .807754E-01 -.677226E-02 .591116E-01 -.272877E-02 .04318 .00762
+bezier .035119 .144346E-01 .300778E-01 .247496E-01 .02921 .034925
+aline .02921 .13843
+aline .028575 .139065
+aline .006985 .139065
+aline .006985 .15113
+bezier .383294E-01 .151647 .507527E-01 .188195 .052705 .21336
+aline .052705 .221615
+aline .06858 .221615
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="u" !-------------- Beginning of new char.
+dfont wid=.555557 hei=.444445 dep=0 italic=0
+dfont fby="w" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .07239 .156845
+aline .07239 .027305
+bezier .729021E-01 .203731E-01 .754435E-01 .112219E-01 .084455 .010795
+bezier .104174 .386205E-02 .125461 .200319E-01 .12827 .04064
+aline .128905 .043815
+aline .12954 .04445
+aline .12954 .04826
+aline .130175 .048895
+aline .130175 .130175
+aline .12954 .13081
+aline .128905 .13335
+aline .127 .135255
+aline .12573 .13589
+aline .123825 .136525
+aline .12319 .13716
+aline .118745 .13716
+aline .11811 .137795
+aline .106045 .137795
+aline .106045 .15367
+bezier .127138 .154906 .148436 .155647 .169545 .156845
+aline .169545 .02286
+aline .17018 .022225
+aline .170815 .019685
+aline .17272 .01778
+aline .17399 .017145
+aline .175895 .01651
+aline .17653 .015875
+aline .180975 .015875
+aline .18161 .01524
+aline .193675 .01524
+aline .193675 -.000635
+aline .18415 -.000635
+aline .183515 -.00127
+aline .163195 -.00127
+aline .16256 -.001905
+aline .14224 -.001905
+aline .141605 -.00254
+aline .13208 -.00254
+aline .13208 .020955
+bezier .125394 .012784 .115691 -.13623E-03 .102235 -.001905
+bezier .787711E-01 -.389599E-02 .477735E-01 -.003282 .036195 .02159
+aline .034925 .0254
+aline .033655 .03048
+aline .033655 .033655
+aline .03302 .03429
+aline .03302 .130175
+aline .032385 .13081
+aline .03175 .13335
+aline .029845 .135255
+aline .028575 .13589
+aline .02667 .136525
+aline .026035 .13716
+aline .02159 .13716
+aline .020955 .137795
+aline .00889 .137795
+aline .00889 .15367
+bezier .299832E-01 .154906 .512813E-01 .155647 .07239 .156845
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="v" !-------------- Beginning of new char.
+dfont wid=.527781 hei=.444445 dep=0 italic=.0138884
+dfont fby="a" kadd=-.0555553
+dfont fby="c" kadd=-.0277786
+dfont fby="e" kadd=-.0277786
+dfont fby="o" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .014605 .15494
+aline .01524 .154305
+aline .040005 .154305
+aline .04064 .15367
+aline .052705 .15367
+aline .05334 .154305
+aline .08255 .154305
+aline .083185 .15494
+aline .09017 .15494
+aline .09017 .139065
+aline .07112 .139065
+bezier .805104E-01 .109761 .934485E-01 .802217E-01 .10414 .0508
+bezier .114707 .790542E-01 .127275 .107411 .13589 .13589
+aline .13462 .136525
+aline .132715 .13716
+aline .130175 .137795
+aline .12954 .13843
+aline .12573 .13843
+aline .125095 .139065
+aline .11811 .139065
+aline .11811 .15494
+aline .12319 .15494
+aline .123825 .154305
+aline .145415 .154305
+aline .14605 .15367
+aline .154305 .15367
+aline .15494 .154305
+aline .172085 .154305
+aline .17272 .15494
+aline .177165 .15494
+aline .177165 .139065
+bezier .16739 .13885 .153054 .14045 .15113 .127635
+bezier .134194 .852492E-01 .119776 .041252 .100965 0
+aline .097155 -.001905
+aline .088265 -.001905
+bezier .775167E-01 .34785E-02 .780089E-01 .183202E-01 .07239 .02794
+bezier .582855E-01 .650136E-01 .439962E-01 .102011 .029845 .139065
+aline .008255 .139065
+aline .008255 .15494
+aline .014605 .15494
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="w" !-------------- Beginning of new char.
+dfont wid=.722224 hei=.444445 dep=0 italic=.0138884
+dfont fby="a" kadd=-.0277786
+dfont fby="c" kadd=-.0277786
+dfont fby="e" kadd=-.0277786
+dfont fby="o" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .01397 .15494
+aline .014605 .154305
+aline .038735 .154305
+aline .03937 .15367
+aline .050165 .15367
+aline .0508 .154305
+aline .0762 .154305
+aline .076835 .15494
+aline .083185 .15494
+aline .083185 .139065
+aline .06858 .139065
+bezier .769149E-01 .112179 .878335E-01 .834716E-01 .097155 .05588
+bezier .104631 .075423 .112315 .969607E-01 .11811 .116205
+aline .116205 .12192
+aline .11557 .12319
+aline .11176 .13462
+aline .111125 .13589
+aline .11049 .137795
+aline .109855 .139065
+aline .09398 .139065
+aline .09398 .15494
+aline .09906 .15494
+aline .099695 .154305
+aline .118745 .154305
+aline .11938 .15367
+aline .12954 .15367
+aline .130175 .154305
+aline .156845 .154305
+aline .15748 .15494
+aline .164465 .15494
+aline .164465 .139065
+aline .14478 .139065
+bezier .153898 .108577 .165548 .772433E-01 .17653 .04699
+bezier .186184 .076627 .198717 .106024 .206375 .13589
+aline .205105 .136525
+aline .202565 .13716
+aline .19939 .137795
+aline .198755 .13843
+aline .19431 .13843
+aline .193675 .139065
+aline .186055 .139065
+aline .186055 .15494
+aline .19177 .15494
+aline .192405 .154305
+aline .215265 .154305
+aline .2159 .15367
+aline .224155 .15367
+aline .22479 .154305
+aline .2413 .154305
+aline .241935 .15494
+aline .245745 .15494
+aline .245745 .139065
+aline .236855 .139065
+aline .23622 .13843
+aline .231775 .13843
+aline .23114 .137795
+aline .227965 .13716
+aline .225425 .13589
+bezier .208502 .918056E-01 .194373 .462539E-01 .1778 .001905
+bezier .173014 -.388495E-02 .161149 -.385219E-02 .15748 .003175
+bezier .147427 .324294E-01 .137053 .615506E-01 .127 .090805
+bezier .115717 .607203E-01 .107234 .289115E-01 .09398 0
+aline .09271 -.000635
+aline .092075 -.00127
+aline .09017 -.001905
+aline .081915 -.001905
+aline .08001 -.00127
+aline .07874 -.000635
+aline .0762 .001905
+bezier .595259E-01 .473817E-01 .443104E-01 .934625E-01 .02794 .139065
+aline .008255 .139065
+aline .008255 .15494
+aline .01397 .15494
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="x" !-------------- Beginning of new char.
+dfont wid=.527781 hei=.444445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .01397 .15494
+aline .014605 .154305
+aline .038735 .154305
+aline .03937 .15367
+aline .0508 .15367
+aline .051435 .154305
+aline .079375 .154305
+aline .08001 .15494
+aline .086995 .15494
+aline .086995 .139065
+aline .071755 .139065
+bezier .077837 .126162 .885931E-01 .113487 .968375E-01 .101124
+bezier .105101 .112146 .115468 .124025 .121285 .13589
+aline .117475 .13716
+aline .114935 .137795
+aline .1143 .13843
+aline .111125 .13843
+aline .11049 .139065
+aline .10541 .139065
+aline .10541 .15494
+aline .111125 .15494
+aline .11176 .154305
+aline .13589 .154305
+aline .136525 .15367
+aline .146685 .15367
+aline .14732 .154305
+aline .167005 .154305
+aline .16764 .15494
+aline .17272 .15494
+aline .17272 .139065
+bezier .15927 .138624 .142161 .141297 .13589 .126365
+bezier .125991 .113291 .116372 .100015 .106839 .866775E-01
+bezier .122581 .625021E-01 .139287 .390219E-01 .155575 .01524
+aline .17907 .01524
+aline .17907 -.000635
+aline .173355 -.000635
+aline .17272 0
+aline .14859 0
+aline .147955 .000635
+aline .136525 .000635
+aline .13589 0
+aline .10795 0
+aline .107315 -.000635
+aline .100965 -.000635
+aline .100965 .01524
+aline .116205 .01524
+bezier .107819 .288395E-01 .965032E-01 .460545E-01 .861484E-01 .586317E-01
+bezier .774875E-01 .450291E-01 .650181E-01 .323624E-01 .05842 .018415
+aline .05969 .01778
+aline .06477 .01651
+aline .065405 .015875
+aline .06858 .015875
+aline .069215 .01524
+aline .074295 .01524
+aline .074295 -.000635
+aline .067945 -.000635
+aline .06731 0
+aline .04318 0
+aline .042545 .000635
+aline .03302 .000635
+aline .032385 0
+aline .012065 0
+aline .01143 -.000635
+aline .006985 -.000635
+aline .006985 .01524
+bezier .200771E-01 .015923 .369465E-01 .128061E-01 .04318 .027305
+bezier .545518E-01 .425021E-01 .659262E-01 .576973E-01 .766763E-01 .733425E-01
+bezier .062077 .955211E-01 .468797E-01 .117269 .03175 .139065
+aline .008255 .139065
+aline .008255 .15494
+aline .01397 .15494
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="y" !-------------- Beginning of new char.
+dfont wid=.527781 hei=.444445 dep=.194445 italic=.0138884
+dfont fby="," kadd=-.083334
+dfont fby="." kadd=-.083334
+dfont fby="a" kadd=-.0277786
+dfont fby="e" kadd=-.0277786
+dfont fby="o" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .014605 .15494
+aline .01524 .154305
+aline .040005 .154305
+aline .04064 .15367
+aline .052705 .15367
+aline .05334 .154305
+aline .08255 .154305
+aline .083185 .15494
+aline .09017 .15494
+aline .09017 .139065
+aline .07112 .139065
+bezier .806995E-01 .110263 .931984E-01 .809648E-01 .10414 .05207
+bezier .114932 .796649E-01 .127118 .107923 .13589 .13589
+aline .13462 .136525
+aline .132715 .13716
+aline .12954 .137795
+aline .128905 .13843
+aline .12573 .13843
+aline .125095 .139065
+aline .11811 .139065
+aline .11811 .15494
+aline .12319 .15494
+aline .123825 .154305
+aline .145415 .154305
+aline .14605 .15367
+aline .154305 .15367
+aline .15494 .154305
+aline .172085 .154305
+aline .17272 .15494
+aline .177165 .15494
+aline .177165 .139065
+bezier .168143 .138493 .154572 .140891 .151765 .12954
+bezier .128637 .718897E-01 .108802 .012685 .083185 -.043815
+bezier .711474E-01 -.653569E-01 .400734E-01 -.08147 .018415 -.0635
+bezier .004119 -.525149E-01 .217139E-02 -.228609E-01 .023495 -.01905
+bezier .392996E-01 -.154146E-01 .528978E-01 -.322488E-01 .046355 -.04699
+aline .04445 -.0508
+aline .040005 -.055245
+aline .038735 -.05588
+aline .0381 -.056515
+aline .03556 -.057785
+bezier .480808E-01 -.622288E-01 .061601 -.506983E-01 .067945 -.040005
+bezier .074268 -.269709E-01 .08005 -.129242E-01 .08382 .000635
+bezier .650904E-01 .463297E-01 .480321E-01 .930264E-01 .029845 .139065
+aline .008255 .139065
+aline .008255 .15494
+aline .014605 .15494
+closepath
+! end of curve
+
+! start of curve
+amove .02921 -.05461
+aline .029845 -.055245
+aline .03048 -.05461
+aline .029845 -.053975
+aline .02921 -.05461
+closepath
+! end of curve
+
+! start of curve
+amove .03048 -.05461
+aline .029845 -.055245
+aline .03048 -.05588
+aline .031115 -.055245
+aline .03048 -.05461
+closepath
+! end of curve
+
+! start of curve
+amove .031115 -.05588
+aline .03175 -.056515
+aline .032385 -.05588
+aline .03175 -.055245
+aline .031115 -.05588
+closepath
+! end of curve
+
+! start of curve
+amove .032385 -.05588
+aline .03175 -.056515
+aline .032385 -.05715
+aline .03302 -.056515
+aline .032385 -.05588
+closepath
+! end of curve
+
+! start of curve
+amove .03302 -.05715
+aline .033655 -.057785
+aline .03429 -.05715
+aline .033655 -.056515
+aline .03302 -.05715
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="z" !-------------- Beginning of new char.
+dfont wid=.444446 hei=.444445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .135255 .15494
+bezier .145634 .149542 .135685 .138317 .131445 .13208
+bezier .107058 .920894E-01 .793918E-01 .052635 .056515 .0127
+bezier .783323E-01 .124209E-01 .107307 .101079E-01 .11811 .033655
+bezier .122672 .457448E-01 .124132 .577205E-01 .125095 .06985
+aline .14097 .06985
+bezier .138776 .463871E-01 .136814 .022828 .13462 -.000635
+aline .014605 -.000635
+bezier .594376E-02 .317248E-02 .111641E-01 .141069E-01 .015875 .01905
+bezier .413314E-01 .604379E-01 .697602E-01 .102121 .09398 .142875
+bezier .738625E-01 .142814 .472071E-01 .146103 .03683 .12446
+bezier .327509E-01 .114301 .317885E-01 .104444 .031115 .09398
+aline .01524 .09398
+bezier .166348E-01 .114336 .182902E-01 .134584 .019685 .15494
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="{" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.444445 dep=0 italic=.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .17526 .1016
+aline .17526 .089535
+aline .000635 .089535
+aline .000635 .1016
+aline .17526 .1016
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="|" !-------------- Beginning of new char.
+dfont wid=1 hei=.444445 dep=0 italic=.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .35052 .1016
+aline .35052 .089535
+aline .000635 .089535
+aline .000635 .1016
+aline .35052 .1016
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="}" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .070485 .24892
+bezier .863024E-01 .248515 .992382E-01 .228591 .086995 .2159
+bezier .771467E-01 .204034 .664705E-01 .192764 .056515 .180975
+aline .042545 .18796
+bezier .441274E-01 .203612 .480847E-01 .220633 .051435 .236855
+aline .05334 .240665
+aline .05461 .241935
+aline .055245 .243205
+aline .056515 .244475
+aline .057785 .24511
+aline .059055 .24638
+aline .061595 .24765
+aline .0635 .248285
+aline .066675 .24892
+aline .070485 .24892
+closepath
+! end of curve
+
+! start of curve
+amove .128905 .24892
+bezier .144722 .248515 .157658 .228591 .145415 .2159
+bezier .135567 .204034 .124891 .192764 .114935 .180975
+aline .100965 .18796
+bezier .102547 .203612 .106505 .220633 .109855 .236855
+aline .11176 .240665
+aline .11303 .241935
+aline .113665 .243205
+aline .114935 .244475
+aline .116205 .24511
+aline .117475 .24638
+aline .120015 .24765
+aline .12192 .248285
+aline .125095 .24892
+aline .128905 .24892
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="~" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .070485 .24257
+bezier .901844E-01 .24026 .11179 .223447 .13081 .236855
+aline .136525 .24257
+bezier .139613 .23889 .149907 .235931 .142875 .23114
+bezier .133854 .219135 .122449 .201235 .104775 .206375
+bezier .848434E-01 .207793 .639514E-01 .225028 .045085 .211455
+aline .03937 .20574
+bezier .362824E-01 .20942 .025988 .212379 .03302 .21717
+bezier .421172E-01 .229219 .525571E-01 .245905 .070485 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=127 !-------------- Beginning of new char.
+dfont wid=.500002 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .05842 .243205
+bezier .080425 .239483 .870531E-01 .207904 .06731 .19685
+bezier .049749 .184272 .241172E-01 .20277 .02921 .22352
+aline .03048 .22733
+aline .032385 .23114
+aline .03302 .231775
+aline .033655 .233045
+aline .03937 .23876
+aline .04064 .239395
+aline .041275 .24003
+aline .043815 .2413
+aline .047625 .24257
+aline .050165 .243205
+closepath
+! end of curve
+
+! start of curve
+amove .12573 .243205
+bezier .148397 .240458 .154753 .207045 .13462 .196215
+bezier .115007 .183591 .887446E-01 .207072 .098425 .22733
+aline .09906 .229235
+aline .099695 .230505
+aline .10033 .23114
+aline .100965 .23241
+aline .107315 .23876
+aline .108585 .239395
+aline .10922 .24003
+aline .11176 .2413
+aline .11557 .24257
+aline .117475 .243205
+closepath
+! end of curve
+
+fill
+dfont endchar
diff --git a/src/fonts/texcmex.afm b/src/fonts/texcmex.afm
new file mode 100644
index 0000000..1649877
--- /dev/null
+++ b/src/fonts/texcmex.afm
@@ -0,0 +1,151 @@
+StartFontMetrics 2.0
+Comment Made from TEX tfm file using TFMTOAFM.bas
+FontName CMEX10
+EncodingScheme TEXENCODING
+FullName CMEX10
+FamilyName CMEX10
+Weight Medium
+ItalicAngle 0
+IsFixedPitch false
+UnderlinePosition -97
+UnderlineThickness 73
+FontBBox 0 -300 1001 1001
+CapHeight 729
+XHeight 151
+Descender -219
+Ascender 729
+StartCharMetrics 127
+C 1 ; WX 458 ; N C1 ; B 0 -1160 458 39 ;
+C 2 ; WX 416 ; N C2 ; B 0 -1160 416 39 ;
+C 3 ; WX 416 ; N C3 ; B 0 -1160 416 39 ;
+C 4 ; WX 472 ; N C4 ; B 0 -1160 472 39 ;
+C 5 ; WX 472 ; N C5 ; B 0 -1160 472 39 ;
+C 6 ; WX 472 ; N C6 ; B 0 -1160 472 39 ;
+C 7 ; WX 472 ; N C7 ; B 0 -1160 472 39 ;
+C 8 ; WX 583 ; N C8 ; B 0 -1160 583 39 ;
+C 9 ; WX 583 ; N C9 ; B 0 -1160 583 39 ;
+C 10 ; WX 472 ; N C10 ; B 0 -1160 472 39 ;
+C 11 ; WX 472 ; N C11 ; B 0 -1160 472 39 ;
+C 12 ; WX 333 ; N C12 ; B 0 -600 333 0 ;
+C 13 ; WX 555 ; N C13 ; B 0 -600 555 0 ;
+C 14 ; WX 577 ; N C14 ; B 0 -1160 577 39 ;
+C 15 ; WX 577 ; N C15 ; B 0 -1160 577 39 ;
+C 16 ; WX 597 ; N C16 ; B 0 -1760 597 39 ;
+C 17 ; WX 597 ; N C17 ; B 0 -1760 597 39 ;
+C 18 ; WX 736 ; N C18 ; B 0 -2360 736 39 ;
+C 19 ; WX 736 ; N C19 ; B 0 -2360 736 39 ;
+C 20 ; WX 527 ; N C20 ; B 0 -2360 527 39 ;
+C 21 ; WX 527 ; N C21 ; B 0 -2360 527 39 ;
+C 22 ; WX 583 ; N C22 ; B 0 -2360 583 39 ;
+C 23 ; WX 583 ; N C23 ; B 0 -2360 583 39 ;
+C 24 ; WX 583 ; N C24 ; B 0 -2360 583 39 ;
+C 25 ; WX 583 ; N C25 ; B 0 -2360 583 39 ;
+C 26 ; WX 750 ; N C26 ; B 0 -2360 750 39 ;
+C 27 ; WX 750 ; N C27 ; B 0 -2360 750 39 ;
+C 28 ; WX 750 ; N C28 ; B 0 -2360 750 39 ;
+C 29 ; WX 750 ; N C29 ; B 0 -2360 750 39 ;
+C 30 ; WX 1044 ; N C30 ; B 0 -2360 1044 39 ;
+C 31 ; WX 1044 ; N C31 ; B 0 -2360 1044 39 ;
+C 32 ; WX 0 ; N C32 ; B 0 -2960 0 39 ;
+C 33 ; WX 791 ; N C33 ; B 0 -2960 791 39 ;
+C 34 ; WX 583 ; N C34 ; B 0 -2960 583 39 ;
+C 35 ; WX 583 ; N C35 ; B 0 -2960 583 39 ;
+C 36 ; WX 638 ; N C36 ; B 0 -2960 638 39 ;
+C 37 ; WX 638 ; N C37 ; B 0 -2960 638 39 ;
+C 38 ; WX 638 ; N C38 ; B 0 -2960 638 39 ;
+C 39 ; WX 638 ; N C39 ; B 0 -2960 638 39 ;
+C 40 ; WX 805 ; N C40 ; B 0 -2960 805 39 ;
+C 41 ; WX 805 ; N C41 ; B 0 -2960 805 39 ;
+C 42 ; WX 805 ; N C42 ; B 0 -2960 805 39 ;
+C 43 ; WX 805 ; N C43 ; B 0 -2960 805 39 ;
+C 44 ; WX 1277 ; N C44 ; B 0 -2960 1277 39 ;
+C 45 ; WX 1277 ; N C45 ; B 0 -2960 1277 39 ;
+C 46 ; WX 811 ; N C46 ; B 0 -1760 811 39 ;
+C 47 ; WX 811 ; N C47 ; B 0 -1760 811 39 ;
+C 48 ; WX 875 ; N C48 ; B 0 -1760 875 39 ;
+C 49 ; WX 875 ; N C49 ; B 0 -1760 875 39 ;
+C 50 ; WX 666 ; N C50 ; B 0 -1760 666 39 ;
+C 51 ; WX 666 ; N C51 ; B 0 -1760 666 39 ;
+C 52 ; WX 666 ; N C52 ; B 0 -1760 666 39 ;
+C 53 ; WX 666 ; N C53 ; B 0 -1760 666 39 ;
+C 54 ; WX 666 ; N C54 ; B 0 -600 666 0 ;
+C 55 ; WX 666 ; N C55 ; B 0 -600 666 0 ;
+C 56 ; WX 888 ; N C56 ; B 0 -900 888 0 ;
+C 57 ; WX 888 ; N C57 ; B 0 -900 888 0 ;
+C 58 ; WX 888 ; N C58 ; B 0 -900 888 0 ;
+C 59 ; WX 888 ; N C59 ; B 0 -900 888 0 ;
+C 60 ; WX 888 ; N C60 ; B 0 -1800 888 0 ;
+C 61 ; WX 888 ; N C61 ; B 0 -1800 888 0 ;
+C 62 ; WX 888 ; N C62 ; B 0 -300 888 0 ;
+C 63 ; WX 666 ; N C63 ; B 0 -600 666 0 ;
+C 64 ; WX 875 ; N C64 ; B 0 -1760 875 39 ;
+C 65 ; WX 875 ; N A ; B 0 -1760 875 39 ;
+C 66 ; WX 875 ; N B ; B 0 -600 875 0 ;
+C 67 ; WX 875 ; N C ; B 0 -600 875 0 ;
+C 68 ; WX 611 ; N D ; B 0 -1760 611 39 ;
+C 69 ; WX 611 ; N E ; B 0 -1760 611 39 ;
+C 70 ; WX 833 ; N F ; B 0 -1000 833 0 ;
+C 71 ; WX 1111 ; N G ; B 0 -1500 1111 100 ;
+C 72 ; WX 472 ; N H ; B 0 -1111 472 0 ;
+C 73 ; WX 555 ; N I ; B 0 -2222 555 0 ;
+C 74 ; WX 1111 ; N J ; B 0 -1000 1111 0 ;
+C 75 ; WX 1511 ; N K ; B 0 -1500 1511 100 ;
+C 76 ; WX 1111 ; N L ; B 0 -1000 1111 0 ;
+C 77 ; WX 1511 ; N M ; B 0 -1500 1511 100 ;
+C 78 ; WX 1111 ; N N ; B 0 -1000 1111 0 ;
+C 79 ; WX 1511 ; N O ; B 0 -1500 1511 100 ;
+C 80 ; WX 1055 ; N P ; B 0 -1000 1055 0 ;
+C 81 ; WX 944 ; N Q ; B 0 -1000 944 0 ;
+C 82 ; WX 472 ; N R ; B 0 -1111 472 0 ;
+C 83 ; WX 833 ; N S ; B 0 -1000 833 0 ;
+C 84 ; WX 833 ; N T ; B 0 -1000 833 0 ;
+C 85 ; WX 833 ; N U ; B 0 -1000 833 0 ;
+C 86 ; WX 833 ; N V ; B 0 -1000 833 0 ;
+C 87 ; WX 833 ; N W ; B 0 -1000 833 0 ;
+C 88 ; WX 1444 ; N X ; B 0 -1500 1444 100 ;
+C 89 ; WX 1277 ; N Y ; B 0 -1500 1277 100 ;
+C 90 ; WX 555 ; N Z ; B 0 -2222 555 0 ;
+C 91 ; WX 1111 ; N C91 ; B 0 -1500 1111 100 ;
+C 92 ; WX 1111 ; N C92 ; B 0 -1500 1111 100 ;
+C 93 ; WX 1111 ; N C93 ; B 0 -1500 1111 100 ;
+C 94 ; WX 1111 ; N C94 ; B 0 -1500 1111 100 ;
+C 95 ; WX 1111 ; N C95 ; B 0 -1500 1111 100 ;
+C 96 ; WX 944 ; N C96 ; B 0 -1000 944 0 ;
+C 97 ; WX 1277 ; N a ; B 0 -1500 1277 100 ;
+C 98 ; WX 555 ; N b ; B 0 0 555 722 ;
+C 99 ; WX 1000 ; N c ; B 0 0 1000 750 ;
+C 100 ; WX 1444 ; N d ; B 0 0 1444 750 ;
+C 101 ; WX 555 ; N e ; B 0 0 555 722 ;
+C 102 ; WX 1000 ; N f ; B 0 0 1000 750 ;
+C 103 ; WX 1444 ; N g ; B 0 0 1444 750 ;
+C 104 ; WX 472 ; N h ; B 0 -1760 472 39 ;
+C 105 ; WX 472 ; N i ; B 0 -1760 472 39 ;
+C 106 ; WX 527 ; N j ; B 0 -1760 527 39 ;
+C 107 ; WX 527 ; N k ; B 0 -1760 527 39 ;
+C 108 ; WX 527 ; N l ; B 0 -1760 527 39 ;
+C 109 ; WX 527 ; N m ; B 0 -1760 527 39 ;
+C 110 ; WX 666 ; N n ; B 0 -1760 666 39 ;
+C 111 ; WX 666 ; N o ; B 0 -1760 666 39 ;
+C 112 ; WX 1000 ; N p ; B 0 -1160 1000 39 ;
+C 113 ; WX 1000 ; N q ; B 0 -1760 1000 39 ;
+C 114 ; WX 1000 ; N r ; B 0 -2360 1000 39 ;
+C 115 ; WX 1000 ; N s ; B 0 -2960 1000 39 ;
+C 116 ; WX 1055 ; N t ; B 0 -1800 1055 0 ;
+C 117 ; WX 1055 ; N u ; B 0 -600 1055 0 ;
+C 118 ; WX 1055 ; N v ; B 0 -560 1055 39 ;
+C 119 ; WX 777 ; N w ; B 0 -600 777 0 ;
+C 120 ; WX 666 ; N x ; B 0 -600 666 0 ;
+C 121 ; WX 666 ; N y ; B 0 -600 666 0 ;
+C 122 ; WX 450 ; N z ; B 0 0 450 119 ;
+C 123 ; WX 450 ; N C123 ; B 0 0 450 119 ;
+C 124 ; WX 450 ; N C124 ; B 0 0 450 119 ;
+C 125 ; WX 450 ; N C125 ; B 0 0 450 119 ;
+C 126 ; WX 777 ; N C126 ; B 0 -600 777 0 ;
+C 127 ; WX 777 ; N C127 ; B 0 -600 777 0 ;
+EndCharMetrics
+
+StartKernData
+StartKernPairs 0
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/src/fonts/texcmex.gle b/src/fonts/texcmex.gle
new file mode 100644
index 0000000..9d0f156
--- /dev/null
+++ b/src/fonts/texcmex.gle
@@ -0,0 +1,5630 @@
+dfont file_name="CMEX10"
+dfont font_name="CMEX10"
+dfont design= .35146
+dfont slant= 0
+dfont space= 0
+dfont stretch= 0
+dfont shrink= 0
+dfont x_hei= .151323
+dfont quad= .351461
+dfont extra_space= 0
+dfont rulethickness= .039999
+dfont bigop1= .111112
+dfont bigop2= .166667
+dfont bigop3= .2
+dfont bigop4= .6
+dfont bigop5= .1
+dfont paint="FILL"
+!------------------ end of main parameters
+dfont char=0 !-------------- Beginning of new char.
+dfont wid=.458336 hei=.039999 dep=1.16001 italic=0
+dfont next_char=16
+set path ! start of curve
+newpath
+! start of curve
+amove .14351 .01143
+aline .14478 .01016
+aline .14478 .00762
+bezier .112221 -.253104E-01 .934872E-01 -.698839E-01 .08509 -.11557
+aline .08382 -.11684
+aline .08382 -.12319
+aline .08255 -.12446
+aline .08255 -.13081
+aline .08128 -.13208
+aline .08128 -.14097
+aline .08001 -.14224
+aline .08001 -.15367
+aline .07874 -.15494
+aline .07874 -.17145
+aline .07747 -.17272
+aline .07747 -.22352
+aline .07874 -.22479
+aline .07874 -.2413
+aline .08001 -.24257
+bezier .808793E-01 -.272449 .891178E-01 -.301709 .09906 -.33147
+bezier .109521 -.358549 .124779 -.383166 .14478 -.40386
+aline .14478 -.4064
+aline .14351 -.40767
+aline .13843 -.40767
+bezier .840611E-01 -.363178 .573401E-01 -.289813 .05588 -.22225
+aline .05461 -.22098
+aline .05461 -.17526
+aline .05588 -.17399
+bezier .573401E-01 -.106427 .840611E-01 -.330615E-01 .13843 .01143
+aline .14351 .01143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=1 !-------------- Beginning of new char.
+dfont wid=.458336 hei=.039999 dep=1.16001 italic=0
+dfont next_char=17
+set path ! start of curve
+newpath
+! start of curve
+amove .02286 .01143
+bezier .772289E-01 -.330615E-01 .10395 -.106427 .10541 -.17399
+aline .10668 -.17526
+aline .10668 -.22098
+aline .10541 -.22225
+bezier .10395 -.289813 .077229 -.363179 .02286 -.40767
+aline .01778 -.40767
+aline .01651 -.4064
+aline .01651 -.40386
+bezier .490686E-01 -.37093 .678028E-01 -.326356 .0762 -.28067
+aline .07747 -.2794
+aline .07747 -.27305
+aline .07874 -.27178
+aline .07874 -.26543
+aline .08001 -.26416
+aline .08001 -.25527
+aline .08128 -.254
+aline .08128 -.24257
+aline .08255 -.2413
+aline .08255 -.22479
+aline .08382 -.22352
+aline .08382 -.17272
+aline .08255 -.17145
+aline .08255 -.15494
+aline .08128 -.15367
+bezier .804107E-01 -.123791 .721722E-01 -.094531 .06223 -.06477
+bezier .517689E-01 -.376913E-01 .365112E-01 -.130745E-01 .01651 .00762
+aline .01651 .01016
+aline .01778 .01143
+aline .02286 .01143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=2 !-------------- Beginning of new char.
+dfont wid=.416669 hei=.039999 dep=1.16001 italic=0
+dfont next_char="h"
+set path ! start of curve
+newpath
+! start of curve
+amove .13716 .01143
+aline .13716 -.00254
+aline .08636 -.00254
+aline .08509 -.00381
+aline .08509 -.39243
+aline .08636 -.3937
+aline .13716 -.3937
+aline .13716 -.40767
+aline .07112 -.40767
+aline .07112 .01143
+aline .13716 .01143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=3 !-------------- Beginning of new char.
+dfont wid=.416669 hei=.039999 dep=1.16001 italic=0
+dfont next_char="i"
+set path ! start of curve
+newpath
+! start of curve
+amove .07493 .01143
+aline .07493 -.40767
+aline .00889 -.40767
+aline .00889 -.3937
+aline .05969 -.3937
+aline .06096 -.39243
+aline .06096 -.00381
+aline .05969 -.00254
+aline .00889 -.00254
+aline .00889 .01143
+aline .07493 .01143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=4 !-------------- Beginning of new char.
+dfont wid=.472224 hei=.039999 dep=1.16001 italic=0
+dfont next_char="j"
+set path ! start of curve
+newpath
+! start of curve
+amove .08509 .01143
+aline .08509 -.39243
+aline .08636 -.3937
+aline .15748 -.3937
+aline .15748 -.40767
+aline .07112 -.40767
+aline .07112 .01143
+aline .08509 .01143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=5 !-------------- Beginning of new char.
+dfont wid=.472224 hei=.039999 dep=1.16001 italic=0
+dfont next_char="k"
+set path ! start of curve
+newpath
+! start of curve
+amove .09525 .01143
+aline .09525 -.40767
+aline .00889 -.40767
+aline .00889 -.3937
+aline .08001 -.3937
+aline .08128 -.39243
+aline .08128 .01143
+aline .09525 .01143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=6 !-------------- Beginning of new char.
+dfont wid=.472224 hei=.039999 dep=1.16001 italic=0
+dfont next_char="l"
+set path ! start of curve
+newpath
+! start of curve
+amove .15748 .01143
+aline .15748 -.00254
+aline .08636 -.00254
+aline .08509 -.00381
+aline .08509 -.40767
+aline .07112 -.40767
+aline .07112 .01143
+aline .15748 .01143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=7 !-------------- Beginning of new char.
+dfont wid=.472224 hei=.039999 dep=1.16001 italic=0
+dfont next_char="m"
+set path ! start of curve
+newpath
+! start of curve
+amove .09525 .01143
+aline .09525 -.40767
+aline .08128 -.40767
+aline .08128 -.00381
+aline .08001 -.00254
+aline .00889 -.00254
+aline .00889 .01143
+aline .09525 .01143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=8 !-------------- Beginning of new char.
+dfont wid=.583336 hei=.039999 dep=1.16001 italic=0
+dfont next_char="n"
+set path ! start of curve
+newpath
+! start of curve
+amove .16129 .01143
+aline .16256 .01016
+aline .16256 .00508
+bezier .143782 -.346585E-02 .120125 -.126029E-01 .11557 -.03556
+aline .1143 -.03683
+aline .1143 -.1524
+bezier .108626 -.178806 .814177E-01 -.190065 .05842 -.19812
+bezier .814177E-01 -.206175 .108626 -.217434 .1143 -.24384
+aline .1143 -.35941
+bezier .120173 -.381093 .140935 -.39338 .16129 -.40005
+aline .16256 -.40132
+aline .16256 -.4064
+aline .16129 -.40767
+bezier .137568 -.405256 .11361 -.394104 .09779 -.37592
+aline .09271 -.36576
+aline .09144 -.36068
+aline .09144 -.24511
+bezier .873988E-01 -.233039 .805679E-01 -.220699 .06858 -.21463
+aline .06731 -.21336
+aline .06477 -.21209
+aline .0635 -.21082
+aline .05334 -.20574
+aline .04572 -.2032
+aline .04318 -.20193
+aline .04191 -.20066
+aline .04191 -.19558
+aline .04318 -.19431
+bezier .632452E-01 -.187029 .858397E-01 -.175268 .09017 -.1524
+aline .09144 -.15113
+aline .09144 -.03556
+bezier .985938E-01 -.710893E-02 .129576 .408575E-02 .15494 .01143
+aline .16129 .01143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=9 !-------------- Beginning of new char.
+dfont wid=.583336 hei=.039999 dep=1.16001 italic=0
+dfont next_char="o"
+set path ! start of curve
+newpath
+! start of curve
+amove .04953 .01143
+bezier .752947E-01 .415885E-02 .106963 -.665241E-02 .1143 -.03556
+aline .1143 -.15113
+bezier .119586 -.172253 .138609 -.186575 .15875 -.19304
+aline .16129 -.19431
+aline .16256 -.19558
+aline .16256 -.20066
+bezier .143311 -.209552 .119563 -.220138 .11557 -.24384
+aline .1143 -.24511
+aline .1143 -.36068
+bezier .106963 -.389588 .752947E-01 -.400399 .04953 -.40767
+aline .04318 -.40767
+aline .04191 -.4064
+aline .04191 -.40132
+bezier .607427E-01 -.392297 .856622E-01 -.384241 .09017 -.36068
+aline .09144 -.35941
+aline .09144 -.24384
+bezier .973389E-01 -.217681 .123888 -.205339 .14732 -.19812
+bezier .123888 -.190901 .973389E-01 -.178559 .09144 -.1524
+aline .09144 -.03683
+aline .09017 -.03556
+bezier .856622E-01 -.119992E-01 .607427E-01 -.394333E-02 .04191 .00508
+aline .04191 .01016
+aline .04318 .01143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=10 !-------------- Beginning of new char.
+dfont wid=.472224 hei=.039999 dep=1.16001 italic=0
+dfont next_char="D"
+set path ! start of curve
+newpath
+! start of curve
+amove .13462 .01143
+aline .13843 .00762
+aline .13843 .00127
+bezier .109164 -.653061E-01 .791816E-01 -.131665 .512763E-01 -.198755
+bezier .791816E-01 -.265845 .109164 -.332204 .13843 -.39878
+aline .13843 -.40513
+aline .13462 -.40894
+aline .12827 -.40894
+bezier .112248 -.382344 .102986 -.351723 .0889 -.32385
+bezier .071457 -.28307 .536771E-01 -.24243 .03556 -.20193
+aline .03556 -.19558
+bezier .660384E-01 -.127598 .949745E-01 -.589772E-01 .12573 .00889
+aline .12827 .01143
+aline .13462 .01143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=11 !-------------- Beginning of new char.
+dfont wid=.472224 hei=.039999 dep=1.16001 italic=0
+dfont next_char="E"
+set path ! start of curve
+newpath
+! start of curve
+amove .0381 .01143
+bezier .541224E-01 -.151657E-01 .633837E-01 -.457868E-01 .07747 -.07366
+bezier .094913 -.11444 .112693 -.15508 .13081 -.19558
+aline .13081 -.20193
+bezier .100332 -.269912 .713953E-01 -.338533 .04064 -.4064
+aline .0381 -.40894
+aline .03175 -.40894
+aline .02794 -.40513
+aline .02794 -.39878
+bezier .572066E-01 -.332204 .087188 -.265845 .115094 -.198755
+bezier .087188 -.131665 .572066E-01 -.065306 .02794 .00127
+aline .02794 .00762
+aline .03175 .01143
+aline .0381 .01143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=12 !-------------- Beginning of new char.
+dfont wid=.333334 hei=0 dep=.600006 italic=0
+dfont ext_top=0 ext_mid=0 ext_bot=0 ext_rep=12
+set path ! start of curve
+newpath
+! start of curve
+amove .06223 .00508
+aline .06604 .00127
+aline .06604 -.2159
+aline .06223 -.21971
+aline .05842 -.22098
+aline .05461 -.21971
+aline .0508 -.2159
+aline .0508 .00127
+aline .05461 .00508
+aline .05842 .00635
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=13 !-------------- Beginning of new char.
+dfont wid=.555557 hei=0 dep=.600006 italic=0
+dfont ext_top=0 ext_mid=0 ext_bot=0 ext_rep=13
+set path ! start of curve
+newpath
+! start of curve
+amove .06223 .00508
+aline .06604 .00127
+aline .06604 -.2159
+aline .06223 -.21971
+aline .05842 -.22098
+aline .05461 -.21971
+aline .0508 -.2159
+aline .0508 .00127
+aline .05461 .00508
+aline .05842 .00635
+closepath
+! end of curve
+
+! start of curve
+amove .14097 .00508
+aline .14478 .00127
+aline .14478 -.2159
+aline .14097 -.21971
+aline .13716 -.22098
+aline .13335 -.21971
+aline .12954 -.2159
+aline .12954 .00127
+aline .13335 .00508
+aline .13716 .00635
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=14 !-------------- Beginning of new char.
+dfont wid=.577779 hei=.039999 dep=1.16001 italic=0
+dfont next_char="."
+set path ! start of curve
+newpath
+! start of curve
+amove .1778 .01143
+aline .18034 .01016
+aline .18161 .00889
+aline .18288 .00635
+bezier .179005 -.158341E-01 .167699 -.366185E-01 .16129 -.05842
+bezier .117854 -.174084 .777851E-01 -.291525 .03302 -.4064
+aline .03048 -.40767
+aline .0254 -.40767
+aline .02286 -.4064
+aline .02159 -.40513
+aline .02032 -.40259
+bezier .241949E-01 -.380406 .355008E-01 -.359621 .04191 -.33782
+bezier .853465E-01 -.222156 .125415 -.104715 .17018 .01016
+aline .17272 .01143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=15 !-------------- Beginning of new char.
+dfont wid=.577779 hei=.039999 dep=1.16001 italic=0
+dfont next_char="/"
+set path ! start of curve
+newpath
+! start of curve
+amove .03048 .01143
+aline .03302 .01016
+bezier .849072E-01 -.124643 .132583 -.26181 .18288 -.39751
+aline .18288 -.40259
+aline .18161 -.40513
+aline .18034 -.4064
+aline .1778 -.40767
+aline .17272 -.40767
+aline .17018 -.4064
+bezier .118293 -.271597 .706167E-01 -.13443 .02032 .00127
+aline .02032 .00635
+aline .02159 .00889
+aline .02286 .01016
+aline .0254 .01143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=16 !-------------- Beginning of new char.
+dfont wid=.597224 hei=.039999 dep=1.76002 italic=0
+dfont next_char=18
+set path ! start of curve
+newpath
+! start of curve
+amove .19558 .01143
+aline .19685 .01016
+aline .19685 .00762
+bezier .176055 -.123387E-01 .159431 -.353033E-01 .14478 -.05969
+aline .12954 -.09017
+bezier .109044 -.137089 .986175E-01 -.188782 .09271 -.23622
+aline .09271 -.25019
+aline .09144 -.25146
+aline .09144 -.27178
+aline .09017 -.27305
+aline .09017 -.33401
+aline .09144 -.33528
+aline .09144 -.3556
+aline .09271 -.35687
+aline .09271 -.37084
+aline .09398 -.37211
+aline .09398 -.38227
+aline .09525 -.38354
+aline .09525 -.39243
+aline .09652 -.3937
+bezier .101061 -.434451 .112964 -.477558 .12954 -.51689
+aline .14478 -.54737
+bezier .159431 -.571757 .176055 -.594721 .19685 -.61468
+aline .19685 -.61722
+aline .19558 -.61849
+aline .18415 -.61849
+bezier .156719 -.594749 .134783 -.56581 .11684 -.53467
+aline .10287 -.50673
+bezier .837178E-01 -.462489 .716478E-01 -.414141 .06858 -.3683
+aline .06731 -.36703
+aline .06731 -.35433
+aline .06604 -.35306
+aline .06604 -.33401
+aline .06477 -.33274
+aline .06477 -.27432
+aline .06604 -.27305
+aline .06604 -.254
+aline .06731 -.25273
+bezier .673749E-01 -.233159 .712749E-01 -.216112 .07366 -.19685
+bezier .794096E-01 -.164474 .896033E-01 -.131086 .10287 -.10033
+aline .11684 -.07239
+bezier .134783 -.412503E-01 .156719 -.012311 .18415 .01143
+aline .19558 .01143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=17 !-------------- Beginning of new char.
+dfont wid=.597224 hei=.039999 dep=1.76002 italic=0
+dfont next_char=19
+set path ! start of curve
+newpath
+! start of curve
+amove .0254 .01143
+bezier .528311E-01 -.012311 .747671E-01 -.412503E-01 .09271 -.07239
+aline .10668 -.10033
+bezier .125832 -.144571 .137902 -.192919 .14097 -.23876
+aline .14224 -.24003
+aline .14224 -.25273
+aline .14351 -.254
+aline .14351 -.27305
+aline .14478 -.27432
+aline .14478 -.33274
+aline .14351 -.33401
+aline .14351 -.35306
+aline .14224 -.35433
+bezier .142175 -.373901 .138275 -.390948 .13589 -.41021
+bezier .13014 -.442586 .119947 -.475974 .10668 -.50673
+aline .09271 -.53467
+bezier .747671E-01 -.56581 .528311E-01 -.594749 .0254 -.61849
+aline .01397 -.61849
+aline .0127 -.61722
+aline .0127 -.61468
+bezier .334946E-01 -.594721 .501188E-01 -.571757 .06477 -.54737
+aline .08001 -.51689
+bezier .100506 -.469971 .110932 -.418278 .11684 -.37084
+aline .11684 -.35687
+aline .11811 -.3556
+aline .11811 -.33528
+aline .11938 -.33401
+aline .11938 -.27305
+aline .11811 -.27178
+aline .11811 -.25146
+aline .11684 -.25019
+aline .11684 -.23622
+aline .11557 -.23495
+aline .11557 -.22479
+aline .1143 -.22352
+aline .1143 -.21463
+aline .11303 -.21336
+bezier .108489 -.172609 .965863E-01 -.129502 .08001 -.09017
+aline .06477 -.05969
+bezier .501188E-01 -.353033E-01 .334946E-01 -.123387E-01 .0127 .00762
+aline .0127 .01016
+aline .01397 .01143
+aline .0254 .01143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=18 !-------------- Beginning of new char.
+dfont wid=.736115 hei=.039999 dep=2.36003 italic=0
+dfont next_char=32
+set path ! start of curve
+newpath
+! start of curve
+amove .24511 .01143
+aline .24638 .01016
+aline .24638 .00762
+bezier .199181 -.375081E-01 .165164 -.935676E-01 .14224 -.15494
+aline .13208 -.18542
+aline .13081 -.1905
+aline .12954 -.19431
+aline .12827 -.19939
+aline .127 -.2032
+aline .12065 -.2286
+aline .1143 -.26035
+aline .11303 -.26162
+aline .11303 -.26797
+aline .11176 -.26924
+aline .11176 -.27686
+aline .11049 -.27813
+aline .11049 -.28448
+aline .10922 -.28575
+aline .10922 -.29464
+aline .10795 -.29591
+aline .10795 -.3048
+aline .10668 -.30607
+aline .10668 -.31623
+aline .10541 -.3175
+aline .10541 -.3302
+aline .10414 -.33147
+aline .10414 -.34798
+aline .10287 -.34925
+aline .10287 -.37338
+aline .1016 -.37465
+aline .1016 -.44323
+aline .10287 -.4445
+aline .10287 -.46863
+aline .10414 -.4699
+aline .10414 -.48641
+aline .10541 -.48768
+aline .10541 -.50038
+aline .10668 -.50165
+aline .10668 -.51181
+aline .10795 -.51308
+aline .10795 -.52197
+aline .10922 -.52324
+aline .10922 -.53213
+aline .11049 -.5334
+aline .11049 -.53975
+aline .11176 -.54102
+aline .11176 -.54864
+aline .11303 -.54991
+aline .11303 -.55626
+aline .1143 -.55753
+aline .12065 -.58928
+aline .127 -.61468
+aline .12827 -.61849
+aline .12954 -.62357
+aline .13081 -.62738
+aline .13208 -.63246
+aline .14224 -.66294
+bezier .165164 -.724312 .199181 -.780372 .24638 -.8255
+aline .24638 -.82804
+aline .24511 -.82931
+aline .23241 -.82931
+aline .22733 -.82423
+aline .22479 -.82296
+aline .2032 -.80137
+bezier .127949 -.719718 .869018E-01 -.604203 .07874 -.49657
+aline .07747 -.4953
+aline .07747 -.48387
+aline .0762 -.4826
+aline .0762 -.46736
+aline .07493 -.46609
+aline .07493 -.44323
+aline .07366 -.44196
+aline .07366 -.37592
+aline .07493 -.37465
+aline .07493 -.35179
+aline .0762 -.35052
+aline .0762 -.33528
+aline .07747 -.33401
+aline .07747 -.32258
+aline .07874 -.32131
+bezier .792591E-01 -.303203 .828745E-01 -.287295 .08509 -.26924
+bezier .101107 -.17698 .139958 -.854838E-01 .2032 -.01651
+aline .22479 .00508
+aline .22733 .00635
+aline .23241 .01143
+aline .24511 .01143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=19 !-------------- Beginning of new char.
+dfont wid=.736115 hei=.039999 dep=2.36003 italic=0
+dfont next_char=33
+set path ! start of curve
+newpath
+! start of curve
+amove .02667 .01143
+aline .03175 .00635
+aline .03429 .00508
+aline .05588 -.01651
+bezier .131131 -.981623E-01 .172178 -.213677 .18034 -.32131
+aline .18161 -.32258
+aline .18161 -.33401
+aline .18288 -.33528
+aline .18288 -.35052
+aline .18415 -.35179
+aline .18415 -.37465
+aline .18542 -.37592
+aline .18542 -.44196
+aline .18415 -.44323
+aline .18415 -.46609
+aline .18288 -.46736
+aline .18288 -.4826
+aline .18161 -.48387
+aline .18161 -.4953
+aline .18034 -.49657
+bezier .179821 -.514678 .176205 -.530585 .17399 -.54864
+bezier .157973 -.6409 .119122 -.732396 .05588 -.80137
+aline .03429 -.82296
+aline .03175 -.82423
+aline .02667 -.82931
+aline .01397 -.82931
+aline .0127 -.82804
+aline .0127 -.8255
+bezier .598985E-01 -.780372 .939161E-01 -.724312 .11684 -.66294
+aline .127 -.63246
+aline .12827 -.62738
+aline .12954 -.62357
+aline .13081 -.61849
+aline .13208 -.61468
+aline .13843 -.58928
+aline .14478 -.55753
+aline .14605 -.55626
+aline .14605 -.54991
+aline .14732 -.54864
+aline .14732 -.54102
+aline .14859 -.53975
+aline .14859 -.5334
+aline .14986 -.53213
+aline .14986 -.52324
+aline .15113 -.52197
+aline .15113 -.51308
+aline .1524 -.51181
+aline .1524 -.50165
+aline .15367 -.50038
+aline .15367 -.48768
+aline .15494 -.48641
+aline .15494 -.4699
+aline .15621 -.46863
+aline .15621 -.4445
+aline .15748 -.44323
+aline .15748 -.37465
+aline .15621 -.37338
+aline .15621 -.34925
+aline .15494 -.34798
+aline .15494 -.33147
+aline .15367 -.3302
+aline .15367 -.3175
+aline .1524 -.31623
+aline .1524 -.30607
+aline .15113 -.3048
+aline .15113 -.29591
+aline .14986 -.29464
+aline .14986 -.28575
+aline .14859 -.28448
+aline .14859 -.27813
+aline .14732 -.27686
+aline .14732 -.26924
+aline .14605 -.26797
+aline .14605 -.26162
+aline .14478 -.26035
+aline .13843 -.2286
+aline .13208 -.2032
+aline .13081 -.19939
+aline .12954 -.19431
+aline .12827 -.1905
+aline .127 -.18542
+aline .11684 -.15494
+bezier .939163E-01 -.935675E-01 .598985E-01 -.375082E-01 .0127 .00762
+aline .0127 .01016
+aline .01397 .01143
+aline .02667 .01143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=20 !-------------- Beginning of new char.
+dfont wid=.527781 hei=.039999 dep=2.36003 italic=0
+dfont next_char=34
+set path ! start of curve
+newpath
+! start of curve
+amove .17907 .01143
+aline .17907 -.00762
+aline .10795 -.00762
+aline .10668 -.00889
+aline .10668 -.80899
+aline .10795 -.81026
+aline .17907 -.81026
+aline .17907 -.82931
+aline .08763 -.82931
+aline .08763 .01143
+aline .17907 .01143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=21 !-------------- Beginning of new char.
+dfont wid=.527781 hei=.039999 dep=2.36003 italic=0
+dfont next_char=35
+set path ! start of curve
+newpath
+! start of curve
+amove .09779 .01143
+aline .09779 -.82931
+aline .00635 -.82931
+aline .00635 -.81026
+aline .07747 -.81026
+aline .07874 -.80899
+aline .07874 -.00889
+aline .07747 -.00762
+aline .00635 -.00762
+aline .00635 .01143
+aline .09779 .01143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=22 !-------------- Beginning of new char.
+dfont wid=.583336 hei=.039999 dep=2.36003 italic=0
+dfont next_char=36
+set path ! start of curve
+newpath
+! start of curve
+amove .10668 .01143
+aline .10668 -.80899
+aline .10795 -.81026
+aline .19812 -.81026
+aline .19812 -.82931
+aline .08763 -.82931
+aline .08763 .01143
+aline .10668 .01143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=23 !-------------- Beginning of new char.
+dfont wid=.583336 hei=.039999 dep=2.36003 italic=0
+dfont next_char=37
+set path ! start of curve
+newpath
+! start of curve
+amove .11684 .01143
+aline .11684 -.82931
+aline .00635 -.82931
+aline .00635 -.81026
+aline .09652 -.81026
+aline .09779 -.80899
+aline .09779 .01143
+aline .11684 .01143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=24 !-------------- Beginning of new char.
+dfont wid=.583336 hei=.039999 dep=2.36003 italic=0
+dfont next_char=38
+set path ! start of curve
+newpath
+! start of curve
+amove .19812 .01143
+aline .19812 -.00762
+aline .10795 -.00762
+aline .10668 -.00889
+aline .10668 -.82931
+aline .08763 -.82931
+aline .08763 .01143
+aline .19812 .01143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=25 !-------------- Beginning of new char.
+dfont wid=.583336 hei=.039999 dep=2.36003 italic=0
+dfont next_char=39
+set path ! start of curve
+newpath
+! start of curve
+amove .11684 .01143
+aline .11684 -.82931
+aline .09779 -.82931
+aline .09779 -.00889
+aline .09652 -.00762
+aline .00635 -.00762
+aline .00635 .01143
+aline .11684 .01143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=26 !-------------- Beginning of new char.
+dfont wid=.750002 hei=.039999 dep=2.36003 italic=0
+dfont next_char=40
+set path ! start of curve
+newpath
+! start of curve
+amove .2159 .01143
+aline .21717 .01016
+aline .21717 -.00254
+bezier .186223 -.017221 .156359 -.409045E-01 .14859 -.0762
+aline .14732 -.07747
+aline .14732 -.08382
+aline .14605 -.08509
+aline .14605 -.31115
+bezier .14375 -.327652 .137779 -.345813 .127 -.35941
+bezier .111701 -.38102 .901568E-01 -.398344 .06604 -.40894
+bezier .105437 -.426471 .141039 -.462721 .14605 -.50673
+aline .14605 -.73279
+bezier .151044 -.762452 .171726 -.789835 .19812 -.80518
+aline .2159 -.81407
+aline .21717 -.81534
+aline .21717 -.82804
+aline .2159 -.82931
+aline .2032 -.82931
+bezier .1648 -.813499 .128942 -.78397 .11938 -.74168
+aline .11938 -.73533
+aline .11811 -.73406
+aline .11811 -.50673
+bezier .112642 -.478367 .977194E-01 -.448447 .07239 -.4318
+aline .06985 -.42926
+aline .06731 -.42799
+aline .06604 -.42672
+aline .0635 -.42545
+aline .06223 -.42418
+aline .05969 -.42291
+aline .05842 -.42164
+aline .04826 -.41656
+aline .04699 -.41529
+aline .04699 -.40259
+bezier .797296E-01 -.385903 .108619 -.357725 .11557 -.32004
+aline .11684 -.31877
+aline .11684 -.31242
+aline .11811 -.31115
+aline .11811 -.08382
+bezier .122763 -.460093E-01 .151886 -.153988E-01 .18415 .00254
+aline .19939 .01016
+aline .2032 .01143
+aline .2159 .01143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=27 !-------------- Beginning of new char.
+dfont wid=.750002 hei=.039999 dep=2.36003 italic=0
+dfont next_char=")"
+set path ! start of curve
+newpath
+! start of curve
+amove .06096 .01143
+bezier .993603E-01 -.43809E-02 .135218 -.339097E-01 .14478 -.0762
+aline .14478 -.08255
+aline .14605 -.08382
+aline .14605 -.31115
+bezier .151518 -.339513 .166441 -.369433 .19177 -.38608
+aline .19431 -.38862
+aline .19685 -.38989
+aline .19812 -.39116
+aline .20066 -.39243
+aline .20193 -.3937
+aline .20447 -.39497
+aline .20574 -.39624
+aline .2159 -.40132
+aline .21717 -.40259
+aline .21717 -.41529
+bezier .18443 -.431977 .155541 -.460155 .14859 -.49784
+aline .14732 -.49911
+aline .14732 -.50546
+aline .14605 -.50673
+aline .14605 -.73406
+bezier .141397 -.771871 .112274 -.802481 .08001 -.82042
+aline .06477 -.82804
+aline .06096 -.82931
+aline .04826 -.82931
+aline .04699 -.82804
+aline .04699 -.81534
+bezier .779367E-01 -.800659 .107801 -.776975 .11557 -.74168
+aline .11684 -.74041
+aline .11684 -.73406
+aline .11811 -.73279
+aline .11811 -.50673
+bezier .12041 -.490228 .126381 -.472067 .13716 -.45847
+bezier .152459 -.43686 .174003 -.419536 .19812 -.40894
+bezier .158723 -.391409 .123121 -.355159 .11811 -.31115
+aline .11811 -.08509
+bezier .113116 -.554283E-01 .924342E-01 -.280453E-01 .06604 -.0127
+aline .04826 -.00381
+aline .04699 -.00254
+aline .04699 .01016
+aline .04826 .01143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=28 !-------------- Beginning of new char.
+dfont wid=.750002 hei=.039999 dep=2.36003 italic=0
+dfont next_char="*"
+set path ! start of curve
+newpath
+! start of curve
+amove .22225 .01143
+aline .22479 .01016
+aline .22733 .00889
+aline .2286 .00635
+aline .22987 .00508
+bezier .229107 -.918131E-02 .2198 -.217874E-01 .2159 -.03556
+bezier .165578 -.160179 .114312 -.284485 .652462E-01 -.409575
+bezier .118958 -.546099 .174755 -.681888 .22987 -.81788
+aline .22987 -.82423
+aline .2286 -.8255
+aline .22733 -.82804
+aline .22225 -.83058
+aline .21844 -.83058
+bezier .205822 -.822387 .205119 -.80488 .19812 -.79248
+bezier .147027 -.665849 .961179E-01 -.539142 .04445 -.41275
+bezier .452125E-01 -.398489 .05452 -.385883 .05842 -.37211
+bezier .110067 -.246132 .159963 -.119429 .21209 .00635
+aline .2159 .01016
+aline .21844 .01143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=29 !-------------- Beginning of new char.
+dfont wid=.750002 hei=.039999 dep=2.36003 italic=0
+dfont next_char="+"
+set path ! start of curve
+newpath
+! start of curve
+amove .04572 .01143
+aline .04826 .01016
+bezier .578837E-01 .856617E-03 .597147E-01 -.147728E-01 .06604 -.02667
+bezier .117133 -.153301 .168042 -.280007 .21971 -.4064
+bezier .218947 -.420661 .20964 -.433267 .20574 -.44704
+bezier .153601 -.573836 .103815 -.701607 .0508 -.82804
+aline .04572 -.83058
+aline .04191 -.83058
+aline .03683 -.82804
+aline .03556 -.8255
+aline .03429 -.82423
+bezier .350525E-01 -.809969 .04436 -.797363 .04826 -.78359
+bezier .985824E-01 -.658971 .149848 -.534665 .198914 -.409575
+bezier .145202 -.273051 .894052E-01 -.137262 .03429 -.00127
+aline .03429 .00508
+aline .03556 .00635
+aline .03683 .00889
+aline .03937 .01016
+aline .04191 .01143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=30 !-------------- Beginning of new char.
+dfont wid=1.04445 hei=.039999 dep=2.36003 italic=0
+dfont next_char=","
+set path ! start of curve
+newpath
+! start of curve
+amove .34036 .01143
+aline .3429 .01016
+aline .34544 .00762
+aline .34671 .00508
+bezier .343011 -.181968E-01 .33069 -.395863E-01 .32385 -.06223
+bezier .228203 -.316489 .133612 -.571185 .0381 -.8255
+aline .03556 -.82804
+aline .03302 -.82931
+aline .02667 -.82931
+aline .02413 -.82804
+aline .02159 -.8255
+aline .02032 -.82296
+bezier .240191E-01 -.799683 .363405E-01 -.778294 .04318 -.75565
+bezier .138827 -.501391 .233418 -.246695 .32893 .00762
+aline .33147 .01016
+aline .33401 .01143
+aline .34036 .01143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=31 !-------------- Beginning of new char.
+dfont wid=1.04445 hei=.039999 dep=2.36003 italic=0
+dfont next_char="-"
+set path ! start of curve
+newpath
+! start of curve
+amove .03302 .01143
+aline .03556 .01016
+bezier .450574E-01 -.466537E-02 .483408E-01 -.232608E-01 .05588 -.03937
+bezier .152497 -.299008 .250259 -.558173 .34671 -.81788
+aline .34671 -.82296
+aline .34544 -.8255
+aline .3429 -.82804
+aline .34036 -.82931
+aline .33401 -.82931
+aline .33147 -.82804
+bezier .321973 -.813215 .318689 -.794619 .31115 -.77851
+bezier .214533 -.518872 .116771 -.259707 .02032 0
+aline .02032 .00508
+aline .02159 .00762
+aline .02413 .01016
+aline .02667 .01143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=32 !-------------- Beginning of new char.
+dfont wid=.79167 hei=.039999 dep=2.96003 italic=0
+dfont next_char="0"
+set path ! start of curve
+newpath
+! start of curve
+amove .26543 .01143
+aline .2667 .01016
+aline .2667 .00762
+bezier .243254 -.193372E-01 .223609 -.490334E-01 .20574 -.08001
+aline .18669 -.11811
+bezier .154111 -.189884 .136194 -.271011 .12573 -.34417
+aline .12573 -.35433
+aline .12446 -.3556
+aline .12446 -.36576
+aline .12319 -.36703
+aline .12319 -.37846
+aline .12192 -.37973
+aline .12192 -.3937
+aline .12065 -.39497
+aline .12065 -.41148
+aline .11938 -.41275
+aline .11938 -.43307
+aline .11811 -.43434
+aline .11811 -.46609
+aline .11684 -.46736
+aline .11684 -.56134
+aline .11811 -.56261
+aline .11811 -.59436
+aline .11938 -.59563
+aline .11938 -.61595
+aline .12065 -.61722
+aline .12065 -.63373
+aline .12192 -.635
+aline .12192 -.64897
+aline .12319 -.65024
+aline .12319 -.66167
+aline .12446 -.66294
+aline .12446 -.6731
+aline .12573 -.67437
+aline .12573 -.68453
+aline .127 -.6858
+aline .127 -.69342
+aline .12827 -.69469
+aline .12827 -.70358
+aline .12954 -.70485
+aline .12954 -.7112
+aline .13081 -.71247
+aline .13081 -.72009
+aline .13208 -.72136
+bezier .141653 -.784333 .160014 -.850692 .18669 -.91059
+aline .20574 -.94869
+bezier .223609 -.979667 .243254 -1.00936 .2667 -1.03632
+aline .2667 -1.03886
+aline .26543 -1.04013
+aline .25146 -1.04013
+bezier .220185 -1.00819 .194836 -.971987 .17272 -.93345
+aline .15113 -.89027
+bezier .137561 -.859389 .126089 -.827556 .11684 -.79502
+aline .10795 -.75946
+bezier .10129 -.733403 .991904E-01 -.707293 .09398 -.68326
+aline .09398 -.67437
+aline .09271 -.6731
+aline .09271 -.66421
+aline .09144 -.66294
+aline .09144 -.65278
+aline .09017 -.65151
+aline .09017 -.64008
+aline .0889 -.63881
+aline .0889 -.62611
+aline .08763 -.62484
+aline .08763 -.6096
+aline .08636 -.60833
+aline .08636 -.58928
+aline .08509 -.58801
+aline .08509 -.5588
+aline .08382 -.55753
+aline .08382 -.47117
+aline .08509 -.4699
+aline .08509 -.44069
+aline .08636 -.43942
+aline .08636 -.42037
+aline .08763 -.4191
+aline .08763 -.40386
+aline .0889 -.40259
+aline .0889 -.38989
+aline .09017 -.38862
+aline .09017 -.37719
+aline .09144 -.37592
+aline .09144 -.36576
+aline .09271 -.36449
+aline .09271 -.3556
+aline .09398 -.35433
+aline .09398 -.34544
+aline .09525 -.34417
+bezier .979774E-01 -.319738 .102117 -.294958 .10795 -.26924
+aline .11684 -.23368
+bezier .126089 -.201144 .137561 -.169311 .15113 -.13843
+aline .17272 -.09525
+bezier .194836 -.567128E-01 .220185 -.205061E-01 .25146 .01143
+aline .26543 .01143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=33 !-------------- Beginning of new char.
+dfont wid=.79167 hei=.039999 dep=2.96003 italic=0
+dfont next_char="1"
+set path ! start of curve
+newpath
+! start of curve
+amove .02667 .01143
+bezier .579446E-01 -.205061E-01 .083294 -.567128E-01 .10541 -.09525
+aline .127 -.13843
+bezier .140569 -.169311 .152041 -.201144 .16129 -.23368
+aline .17018 -.26924
+bezier .17684 -.295297 .17894 -.321407 .18415 -.34544
+aline .18415 -.35433
+aline .18542 -.3556
+aline .18542 -.36449
+aline .18669 -.36576
+aline .18669 -.37592
+aline .18796 -.37719
+aline .18796 -.38862
+aline .18923 -.38989
+aline .18923 -.40259
+aline .1905 -.40386
+aline .1905 -.4191
+aline .19177 -.42037
+aline .19177 -.43942
+aline .19304 -.44069
+aline .19304 -.4699
+aline .19431 -.47117
+aline .19431 -.55753
+aline .19304 -.5588
+aline .19304 -.58801
+aline .19177 -.58928
+aline .19177 -.60833
+aline .1905 -.6096
+aline .1905 -.62484
+aline .18923 -.62611
+aline .18923 -.63881
+aline .18796 -.64008
+aline .18796 -.65151
+aline .18669 -.65278
+aline .18669 -.66294
+aline .18542 -.66421
+aline .18542 -.6731
+aline .18415 -.67437
+aline .18415 -.68326
+aline .18288 -.68453
+bezier .180153 -.708962 .176013 -.733742 .17018 -.75946
+aline .16129 -.79502
+bezier .152041 -.827556 .140569 -.859389 .127 -.89027
+aline .10541 -.93345
+bezier .832939E-01 -.971987 .579446E-01 -1.00819 .02667 -1.04013
+aline .0127 -1.04013
+aline .01143 -1.03886
+aline .01143 -1.03632
+bezier .348756E-01 -1.00936 .545211E-01 -.979667 .07239 -.94869
+aline .09144 -.91059
+bezier .124019 -.838816 .141936 -.757689 .1524 -.68453
+aline .1524 -.67437
+aline .15367 -.6731
+aline .15367 -.66294
+aline .15494 -.66167
+aline .15494 -.65024
+aline .15621 -.64897
+aline .15621 -.635
+aline .15748 -.63373
+aline .15748 -.61722
+aline .15875 -.61595
+aline .15875 -.59563
+aline .16002 -.59436
+aline .16002 -.56261
+aline .16129 -.56134
+aline .16129 -.46736
+aline .16002 -.46609
+aline .16002 -.43434
+aline .15875 -.43307
+aline .15875 -.41275
+aline .15748 -.41148
+aline .15748 -.39497
+aline .15621 -.3937
+aline .15621 -.37973
+aline .15494 -.37846
+aline .15494 -.36703
+aline .15367 -.36576
+aline .15367 -.3556
+aline .1524 -.35433
+aline .1524 -.34417
+aline .15113 -.3429
+aline .15113 -.33528
+aline .14986 -.33401
+aline .14986 -.32512
+aline .14859 -.32385
+aline .14859 -.3175
+aline .14732 -.31623
+aline .14732 -.30861
+aline .14605 -.30734
+bezier .136477 -.244367 .118116 -.178008 .09144 -.11811
+aline .07239 -.08001
+bezier .545211E-01 -.490334E-01 .348756E-01 -.193372E-01 .01143 .00762
+aline .01143 .01016
+aline .0127 .01143
+aline .02667 .01143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=34 !-------------- Beginning of new char.
+dfont wid=.583336 hei=.039999 dep=2.96003 italic=0
+dfont next_char="2"
+set path ! start of curve
+newpath
+! start of curve
+amove .19939 .01143
+aline .19939 -.00889
+aline .11938 -.00889
+aline .11811 -.01016
+aline .11811 -1.01854
+aline .11938 -1.01981
+aline .19939 -1.01981
+aline .19939 -1.04013
+aline .09779 -1.04013
+aline .09779 .01143
+aline .19939 .01143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=35 !-------------- Beginning of new char.
+dfont wid=.583336 hei=.039999 dep=2.96003 italic=0
+dfont next_char="3"
+set path ! start of curve
+newpath
+! start of curve
+amove .10668 .01143
+aline .10668 -1.04013
+aline .00508 -1.04013
+aline .00508 -1.01981
+aline .08509 -1.01981
+aline .08636 -1.01854
+aline .08636 -.01016
+aline .08509 -.00889
+aline .00508 -.00889
+aline .00508 .01143
+aline .10668 .01143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=36 !-------------- Beginning of new char.
+dfont wid=.638891 hei=.039999 dep=2.96003 italic=0
+dfont next_char="4"
+set path ! start of curve
+newpath
+! start of curve
+amove .11811 .01143
+aline .11811 -1.01854
+aline .11938 -1.01981
+aline .21971 -1.01981
+aline .21971 -1.04013
+aline .09779 -1.04013
+aline .09779 .01143
+aline .11811 .01143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=37 !-------------- Beginning of new char.
+dfont wid=.638891 hei=.039999 dep=2.96003 italic=0
+dfont next_char="5"
+set path ! start of curve
+newpath
+! start of curve
+amove .127 .01143
+aline .127 -1.04013
+aline .00508 -1.04013
+aline .00508 -1.01981
+aline .10541 -1.01981
+aline .10668 -1.01854
+aline .10668 .01143
+aline .127 .01143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=38 !-------------- Beginning of new char.
+dfont wid=.638891 hei=.039999 dep=2.96003 italic=0
+dfont next_char="6"
+set path ! start of curve
+newpath
+! start of curve
+amove .21971 .01143
+aline .21971 -.00889
+aline .11938 -.00889
+aline .11811 -.01016
+aline .11811 -1.04013
+aline .09779 -1.04013
+aline .09779 .01143
+aline .21971 .01143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=39 !-------------- Beginning of new char.
+dfont wid=.638891 hei=.039999 dep=2.96003 italic=0
+dfont next_char="7"
+set path ! start of curve
+newpath
+! start of curve
+amove .127 .01143
+aline .127 -1.04013
+aline .10668 -1.04013
+aline .10668 -.01016
+aline .10541 -.00889
+aline .00508 -.00889
+aline .00508 .01143
+aline .127 .01143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=40 !-------------- Beginning of new char.
+dfont wid=.80556 hei=.039999 dep=2.96003 italic=0
+dfont next_char="8"
+set path ! start of curve
+newpath
+! start of curve
+amove .23114 .01143
+aline .23241 .01016
+aline .23241 -.00381
+bezier .196627 -.233359E-01 .16778 -.575996E-01 .16129 -.09906
+aline .16002 -.10033
+aline .16002 -.10795
+aline .15875 -.10922
+aline .15875 -.39243
+bezier .153515 -.444567 .116916 -.490509 .07112 -.51435
+bezier .116916 -.538191 .153515 -.584133 .15875 -.63627
+aline .15875 -.91948
+bezier .163247 -.943512 .171593 -.970474 .18923 -.98933
+bezier .200265 -1.00488 .216799 -1.01488 .23241 -1.02489
+aline .23241 -1.03886
+aline .23114 -1.04013
+bezier .210394 -1.04301 .194688 -1.02655 .17907 -1.016
+aline .15748 -.99441
+bezier .140742 -.973664 .128404 -.947094 .12573 -.92075
+aline .12573 -.63754
+bezier .120662 -.592799 .945538E-01 -.546133 .05334 -.52324
+aline .0508 -.5207
+aline .0508 -.508
+bezier .858286E-01 -.486252 .113618 -.45171 .12192 -.41021
+aline .12319 -.40894
+aline .12319 -.40259
+aline .12446 -.40132
+aline .12446 -.39243
+aline .12573 -.39116
+aline .12573 -.10795
+bezier .128404 -.816058E-01 .140742 -.550356E-01 .15748 -.03429
+aline .17907 -.0127
+bezier .194688 -.214517E-02 .210394 .143096E-01 .23114 .01143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=")" !-------------- Beginning of new char.
+dfont wid=.80556 hei=.039999 dep=2.96003 italic=0
+dfont next_char="9"
+set path ! start of curve
+newpath
+! start of curve
+amove .06604 .01143
+bezier .113376 -.103682E-01 .153135 -.551009E-01 .15875 -.10795
+aline .15875 -.39243
+bezier .163925 -.421432 .173704 -.454168 .19558 -.47625
+bezier .205155 -.489197 .218718 -.498681 .23241 -.50673
+aline .23241 -.52197
+bezier .191415 -.54413 .164069 -.589002 .16002 -.635
+aline .15875 -.63627
+aline .15875 -.92075
+bezier .155796 -.947196 .143953 -.974484 .12573 -.99441
+bezier .109971 -1.01442 .088793 -1.02901 .06604 -1.04013
+aline .05207 -1.04013
+aline .0508 -1.03886
+aline .0508 -1.02489
+bezier .866336E-01 -1.0053 .116422 -.971322 .12319 -.92964
+aline .12446 -.92837
+aline .12446 -.92075
+aline .12573 -.91948
+aline .12573 -.63627
+aline .127 -.635
+bezier .127577 -.606373 .142732 -.578611 .16002 -.55626
+aline .18161 -.53467
+bezier .191346 -.527309 .201347 -.520314 .21209 -.51435
+bezier .201347 -.508386 .191346 -.501391 .18161 -.49403
+aline .16002 -.47244
+bezier .142732 -.450089 .127577 -.422327 .127 -.3937
+aline .12573 -.39243
+aline .12573 -.10922
+bezier .121584 -.856774E-01 .112373 -.599335E-01 .09652 -.04064
+bezier .830903E-01 -.258517E-01 .679869E-01 -.133855E-01 .0508 -.00381
+aline .0508 .01016
+aline .05207 .01143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="*" !-------------- Beginning of new char.
+dfont wid=.80556 hei=.039999 dep=2.96003 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .23749 .01143
+aline .24003 .01016
+aline .24257 .00762
+aline .24384 .00508
+aline .24384 -.00254
+aline .22733 -.05207
+aline .22606 -.05461
+aline .19177 -.15748
+aline .1905 -.16002
+aline .15748 -.25908
+aline .15621 -.26162
+aline .12319 -.36068
+aline .12192 -.36322
+aline .08763 -.46609
+aline .08636 -.46863
+aline .07239 -.51054
+aline .071628 -.51435
+aline .07239 -.51816
+aline .08636 -.56007
+aline .08763 -.56261
+aline .12192 -.66548
+aline .12319 -.66802
+aline .15621 -.76708
+aline .15748 -.76962
+aline .1905 -.86868
+aline .19177 -.87122
+aline .22606 -.97409
+aline .22733 -.97663
+aline .24384 -1.02616
+aline .24384 -1.03378
+aline .24257 -1.03632
+aline .24003 -1.03886
+aline .23749 -1.04013
+aline .22987 -1.04013
+aline .22352 -1.03378
+aline .20701 -.98425
+aline .20574 -.98171
+aline .17145 -.87884
+aline .17018 -.8763
+aline .13716 -.77724
+aline .13589 -.7747
+aline .10287 -.67564
+aline .1016 -.6731
+aline .06731 -.57023
+aline .06604 -.56769
+aline .04953 -.51816
+aline .04953 -.51054
+aline .06604 -.46101
+aline .06731 -.45847
+aline .1016 -.3556
+aline .10287 -.35306
+aline .13589 -.254
+aline .13716 -.25146
+aline .17018 -.1524
+aline .17145 -.14986
+aline .20574 -.04699
+aline .20701 -.04445
+aline .22352 .00508
+aline .22987 .01143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="+" !-------------- Beginning of new char.
+dfont wid=.80556 hei=.039999 dep=2.96003 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .05334 .01143
+aline .05588 .01016
+aline .05715 .00889
+aline .05842 .00635
+aline .05969 .00508
+aline .0762 -.04445
+aline .07747 -.04699
+aline .11176 -.14986
+aline .11303 -.1524
+aline .14605 -.25146
+aline .14732 -.254
+aline .18034 -.35306
+aline .18161 -.3556
+aline .2159 -.45847
+aline .21717 -.46101
+aline .23368 -.51054
+aline .23368 -.51816
+aline .21717 -.56769
+aline .2159 -.57023
+aline .18161 -.6731
+aline .18034 -.67564
+aline .14732 -.7747
+aline .14605 -.77724
+aline .11303 -.8763
+aline .11176 -.87884
+aline .07747 -.98171
+aline .0762 -.98425
+aline .05969 -1.03378
+aline .05842 -1.03505
+aline .05715 -1.03759
+aline .05588 -1.03886
+aline .05334 -1.04013
+aline .04572 -1.04013
+aline .04318 -1.03886
+aline .04064 -1.03632
+aline .03937 -1.03378
+aline .03937 -1.02616
+aline .05588 -.97663
+aline .05715 -.97409
+aline .09144 -.87122
+aline .09271 -.86868
+aline .12573 -.76962
+aline .127 -.76708
+aline .16002 -.66802
+aline .16129 -.66548
+aline .19558 -.56261
+aline .19685 -.56007
+aline .21082 -.51816
+aline .211582 -.51435
+aline .21082 -.51054
+aline .19685 -.46863
+aline .19558 -.46609
+aline .16129 -.36322
+aline .16002 -.36068
+aline .127 -.26162
+aline .12573 -.25908
+aline .09271 -.16002
+aline .09144 -.15748
+aline .05715 -.05461
+aline .05588 -.05207
+aline .03937 -.00254
+aline .03937 .00508
+aline .04064 .00762
+aline .04318 .01016
+aline .04572 .01143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="," !-------------- Beginning of new char.
+dfont wid=1.27778 hei=.039999 dep=2.96003 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .42164 .01143
+aline .42418 .01016
+aline .42799 .00635
+aline .42926 .00381
+bezier .425561 -.194668E-01 .41324 -.408563E-01 .4064 -.0635
+bezier .284061 -.387176 .162886 -.711335 .04064 -1.03505
+aline .03683 -1.03886
+aline .03429 -1.04013
+aline .02794 -1.04013
+aline .0254 -1.03886
+aline .02159 -1.03505
+aline .02032 -1.03251
+bezier .240191E-01 -1.00923 .363405E-01 -.987844 .04318 -.9652
+bezier .165516 -.641522 .286693 -.317364 .40894 .00635
+aline .41275 .01016
+aline .41529 .01143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="-" !-------------- Beginning of new char.
+dfont wid=1.27778 hei=.039999 dep=2.96003 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .03429 .01143
+aline .03683 .01016
+aline .04064 .00635
+bezier .170339 -.338178 .300244 -.68262 .42926 -1.02743
+aline .42926 -1.03251
+aline .42799 -1.03505
+aline .42418 -1.03886
+aline .42164 -1.04013
+aline .41529 -1.04013
+aline .41275 -1.03886
+aline .40894 -1.03505
+bezier .279228 -.690528 .149323 -.346086 .02032 -.00127
+aline .02032 .00381
+aline .02159 .00635
+aline .0254 .01016
+aline .02794 .01143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="." !-------------- Beginning of new char.
+dfont wid=.811114 hei=.039999 dep=1.76002 italic=0
+dfont next_char=30
+set path ! start of curve
+newpath
+! start of curve
+amove .25908 .01143
+aline .26162 .01016
+aline .26289 .00889
+aline .26416 .00635
+aline .26416 0
+bezier .18723 -.205566 .112767 -.412534 .03429 -.61722
+aline .03175 -.61849
+aline .0254 -.61849
+aline .02286 -.61722
+aline .02159 -.61595
+aline .02032 -.61341
+aline .02032 -.60706
+bezier .972496E-01 -.401494 .171713 -.194526 .25019 .01016
+aline .25273 .01143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="/" !-------------- Beginning of new char.
+dfont wid=.811114 hei=.039999 dep=1.76002 italic=0
+dfont next_char=31
+set path ! start of curve
+newpath
+! start of curve
+amove .03175 .01143
+aline .03429 .01016
+bezier .112767 -.194526 .18723 -.401494 .26416 -.60706
+aline .26416 -.61341
+aline .26289 -.61595
+aline .26162 -.61722
+aline .25908 -.61849
+aline .25273 -.61849
+aline .25019 -.61722
+bezier .171713 -.412534 .972498E-01 -.205565 .02032 0
+aline .02032 .00635
+aline .02159 .00889
+aline .02286 .01016
+aline .0254 .01143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="0" !-------------- Beginning of new char.
+dfont wid=.875003 hei=.039999 dep=1.76002 italic=0
+dfont ext_top="0" ext_mid=0 ext_bot="@" ext_rep="B"
+set path ! start of curve
+newpath
+! start of curve
+amove .29464 .01016
+aline .29591 .00889
+aline .29591 .00635
+bezier .276799 -.187505E-01 .26078 -.460797E-01 .24511 -.07366
+aline .22987 -.10414
+bezier .187595 -.194523 .164628 -.297075 .1524 -.38989
+aline .1524 -.40005
+aline .15113 -.40132
+aline .15113 -.41148
+aline .14986 -.41275
+aline .14986 -.42418
+aline .14859 -.42545
+aline .14859 -.43815
+aline .14732 -.43942
+aline .14732 -.45339
+aline .14605 -.45466
+aline .14605 -.47117
+aline .14478 -.47244
+aline .14478 -.49276
+aline .14351 -.49403
+aline .14351 -.51943
+aline .14224 -.5207
+aline .14224 -.56007
+aline .14097 -.56134
+aline .14097 -.6223
+aline .13843 -.62357
+aline .10541 -.62357
+aline .10287 -.6223
+aline .10287 -.56769
+aline .10414 -.56642
+aline .10414 -.52959
+aline .10541 -.52832
+aline .10541 -.50546
+aline .10668 -.50419
+aline .10668 -.48514
+aline .10795 -.48387
+aline .10795 -.46863
+aline .10922 -.46736
+aline .10922 -.45466
+aline .11049 -.45339
+aline .11049 -.44069
+aline .11176 -.43942
+aline .11176 -.42926
+aline .11303 -.42799
+aline .11303 -.41783
+aline .1143 -.41656
+aline .1143 -.40767
+aline .11557 -.4064
+aline .11557 -.39751
+aline .11684 -.39624
+bezier .11787 -.380047 .121265 -.365719 .12319 -.34925
+aline .12446 -.34798
+aline .12446 -.34163
+aline .13081 -.30988
+aline .13208 -.3048
+aline .13335 -.29845
+aline .14351 -.25781
+bezier .154673 -.217866 .168654 -.178788 .18542 -.14097
+aline .20955 -.09271
+bezier .230441 -.563905E-01 .253145 -.213782E-01 .28067 .01016
+aline .29464 .01016
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="1" !-------------- Beginning of new char.
+dfont wid=.875003 hei=.039999 dep=1.76002 italic=0
+dfont ext_top="1" ext_mid=0 ext_bot="A" ext_rep="C"
+set path ! start of curve
+newpath
+! start of curve
+amove .02667 .01016
+bezier .541946E-01 -.213782E-01 .768991E-01 -.563905E-01 .09779 -.09271
+aline .12192 -.14097
+bezier .138686 -.178788 .152667 -.217866 .16383 -.25781
+aline .17399 -.29845
+aline .17526 -.3048
+aline .17653 -.30988
+aline .18288 -.34163
+aline .18288 -.34798
+aline .18415 -.34925
+bezier .186075 -.365719 .18947 -.380047 .1905 -.39624
+aline .19177 -.39751
+aline .19177 -.4064
+aline .19304 -.40767
+aline .19304 -.41656
+aline .19431 -.41783
+aline .19431 -.42799
+aline .19558 -.42926
+aline .19558 -.43942
+aline .19685 -.44069
+aline .19685 -.45339
+aline .19812 -.45466
+aline .19812 -.46736
+aline .19939 -.46863
+aline .19939 -.48387
+aline .20066 -.48514
+aline .20066 -.50419
+aline .20193 -.50546
+aline .20193 -.52832
+aline .2032 -.52959
+aline .2032 -.56642
+aline .20447 -.56769
+aline .20447 -.6223
+aline .20193 -.62357
+aline .16891 -.62357
+aline .16637 -.6223
+aline .16637 -.56134
+aline .1651 -.56007
+aline .1651 -.5207
+aline .16383 -.51943
+aline .16383 -.49403
+aline .16256 -.49276
+aline .16256 -.47244
+aline .16129 -.47117
+aline .16129 -.45466
+aline .16002 -.45339
+aline .16002 -.43942
+aline .15875 -.43815
+aline .15875 -.42545
+aline .15748 -.42418
+aline .15748 -.41275
+aline .15621 -.41148
+aline .15621 -.40132
+aline .15494 -.40005
+aline .15494 -.38989
+aline .15367 -.38862
+aline .15367 -.37973
+aline .1524 -.37846
+aline .1524 -.36957
+aline .15113 -.3683
+aline .15113 -.36068
+aline .14986 -.35941
+aline .14986 -.35306
+aline .14859 -.35179
+aline .14859 -.34417
+aline .14732 -.3429
+bezier .135429 -.263496 .112224 -.179337 .07747 -.10414
+aline .06223 -.07366
+bezier .465597E-01 -.460797E-01 .305409E-01 -.187505E-01 .01143 .00635
+aline .01143 .00889
+aline .0127 .01016
+aline .02667 .01016
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="2" !-------------- Beginning of new char.
+dfont wid=.666669 hei=.039999 dep=1.76002 italic=0
+dfont ext_top="2" ext_mid=0 ext_bot="4" ext_rep="6"
+set path ! start of curve
+newpath
+! start of curve
+amove .22987 .01016
+aline .22987 -.0127
+aline .1397 -.0127
+aline .13843 -.01397
+aline .13843 -.61976
+aline .11557 -.61976
+aline .11557 .01016
+aline .22987 .01016
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="3" !-------------- Beginning of new char.
+dfont wid=.666669 hei=.039999 dep=1.76002 italic=0
+dfont ext_top="3" ext_mid=0 ext_bot="5" ext_rep="7"
+set path ! start of curve
+newpath
+! start of curve
+amove .11811 .01016
+aline .11811 -.61976
+aline .09525 -.61976
+aline .09525 -.01397
+aline .09398 -.0127
+aline .00381 -.0127
+aline .00381 .01016
+aline .11811 .01016
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="4" !-------------- Beginning of new char.
+dfont wid=.666669 hei=.039999 dep=1.76002 italic=0
+dfont ext_top=0 ext_mid=0 ext_bot="4" ext_rep="6"
+set path ! start of curve
+newpath
+! start of curve
+amove .13843 .01143
+aline .13843 -.59436
+aline .1397 -.59563
+aline .22987 -.59563
+aline .22987 -.61849
+aline .11557 -.61849
+aline .11557 .01143
+aline .13843 .01143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="5" !-------------- Beginning of new char.
+dfont wid=.666669 hei=.039999 dep=1.76002 italic=0
+dfont ext_top=0 ext_mid=0 ext_bot="5" ext_rep="7"
+set path ! start of curve
+newpath
+! start of curve
+amove .11811 .01143
+aline .11811 -.61849
+aline .00381 -.61849
+aline .00381 -.59563
+aline .09398 -.59563
+aline .09525 -.59436
+aline .09525 .01143
+aline .11811 .01143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="6" !-------------- Beginning of new char.
+dfont wid=.666669 hei=0 dep=.600006 italic=0
+dfont ext_top="2" ext_mid=0 ext_bot=0 ext_rep="6"
+set path ! start of curve
+newpath
+! start of curve
+amove .13843 -.00127
+aline .13843 -.21336
+aline .11557 -.21336
+aline .11557 -.00127
+aline .13843 -.00127
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="7" !-------------- Beginning of new char.
+dfont wid=.666669 hei=0 dep=.600006 italic=0
+dfont ext_top="3" ext_mid=0 ext_bot=0 ext_rep="7"
+set path ! start of curve
+newpath
+! start of curve
+amove .11811 -.00127
+aline .11811 -.21336
+aline .09525 -.21336
+aline .09525 -.00127
+aline .11811 -.00127
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="8" !-------------- Beginning of new char.
+dfont wid=.888891 hei=0 dep=.900009 italic=0
+dfont ext_top="8" ext_mid="<" ext_bot=":" ext_rep=">"
+set path ! start of curve
+newpath
+! start of curve
+amove .25019 -.00381
+aline .25146 -.00508
+aline .25146 -.01905
+bezier .214525 -.430454E-01 .189516 -.831672E-01 .18161 -.127
+aline .18034 -.12827
+aline .18034 -.13462
+aline .17907 -.13589
+aline .17907 -.14605
+aline .1778 -.14732
+aline .1778 -.32004
+aline .17526 -.32131
+aline .13843 -.32131
+aline .13589 -.32004
+aline .13589 -.14732
+bezier .141365 -.864963E-01 .182415 -.313985E-01 .23622 -.00381
+aline .25019 -.00381
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="9" !-------------- Beginning of new char.
+dfont wid=.888891 hei=0 dep=.900009 italic=0
+dfont ext_top="9" ext_mid="=" ext_bot=";" ext_rep=">"
+set path ! start of curve
+newpath
+! start of curve
+amove .0762 -.00381
+bezier .08962 -.102671E-01 .101268 -.019182 .11303 -.02794
+aline .13716 -.05207
+bezier .158973 -.787028E-01 .174663 -.113062 .1778 -.14732
+aline .1778 -.32004
+aline .17526 -.32131
+aline .13843 -.32131
+aline .13589 -.32004
+aline .13589 -.14859
+aline .13462 -.14732
+bezier .131703 -.972799E-01 .104314 -.462951E-01 .06096 -.01905
+aline .06096 -.00508
+aline .06223 -.00381
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=":" !-------------- Beginning of new char.
+dfont wid=.888891 hei=0 dep=.900009 italic=0
+dfont ext_top="8" ext_mid=0 ext_bot=":" ext_rep=">"
+set path ! start of curve
+newpath
+! start of curve
+amove .17526 .00127
+aline .1778 0
+aline .1778 -.17272
+bezier .183215 -.218407 .204454 -.269181 .24511 -.29591
+aline .24765 -.29845
+aline .25019 -.29972
+aline .25146 -.30099
+aline .25146 -.31496
+aline .25019 -.31623
+aline .23622 -.31623
+bezier .182415 -.288642 .141365 -.233544 .13589 -.17272
+aline .13589 0
+aline .13843 .00127
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=";" !-------------- Beginning of new char.
+dfont wid=.888891 hei=0 dep=.900009 italic=0
+dfont ext_top="9" ext_mid=0 ext_bot=";" ext_rep=">"
+set path ! start of curve
+newpath
+! start of curve
+amove .17526 .00127
+aline .1778 0
+aline .1778 -.17272
+bezier .174663 -.206978 .158973 -.241337 .13716 -.26797
+aline .11303 -.2921
+bezier .974874E-01 -.302214 .827745E-01 -.319352 .06223 -.31623
+aline .06096 -.31496
+aline .06096 -.30099
+bezier .986355E-01 -.276844 .124522 -.236319 .13208 -.19177
+aline .13335 -.1905
+aline .13335 -.18415
+aline .13462 -.18288
+aline .13462 -.17272
+aline .13589 -.17145
+aline .13589 0
+aline .13843 .00127
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="<" !-------------- Beginning of new char.
+dfont wid=.888891 hei=0 dep=1.80002 italic=0
+dfont ext_top=0 ext_mid=0 ext_bot=0 ext_rep="?"
+set path ! start of curve
+newpath
+! start of curve
+amove .17526 .00127
+aline .1778 0
+aline .1778 -.16891
+aline .17653 -.17018
+bezier .174257 -.231629 .132661 -.287226 .815975E-01 -.318135
+bezier .132661 -.349044 .174257 -.404641 .17653 -.46609
+aline .1778 -.46736
+aline .1778 -.63627
+aline .17526 -.63754
+aline .13843 -.63754
+aline .13589 -.63627
+aline .13589 -.46609
+aline .13462 -.46482
+bezier .131819 -.411685 .105915 -.356056 .06096 -.32512
+aline .06096 -.31115
+bezier .998492E-01 -.284127 .124303 -.239965 .13208 -.19304
+aline .13335 -.19177
+aline .13335 -.18415
+aline .13462 -.18288
+aline .13462 -.17145
+aline .13589 -.17018
+aline .13589 0
+aline .13843 .00127
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="=" !-------------- Beginning of new char.
+dfont wid=.888891 hei=0 dep=1.80002 italic=0
+dfont ext_top=0 ext_mid=0 ext_bot=0 ext_rep="w"
+set path ! start of curve
+newpath
+! start of curve
+amove .17526 .00127
+aline .1778 0
+aline .1778 -.17018
+aline .17907 -.17145
+bezier .181879 -.224211 .206928 -.279714 .25146 -.31115
+aline .25146 -.32512
+bezier .213022 -.352559 .189161 -.396604 .18161 -.44323
+aline .18034 -.4445
+aline .18034 -.45212
+aline .17907 -.45339
+aline .17907 -.46482
+aline .1778 -.46609
+aline .1778 -.63627
+aline .17526 -.63754
+aline .13843 -.63754
+aline .13589 -.63627
+aline .13589 -.46736
+aline .13716 -.46609
+bezier .13924 -.405048 .180191 -.349278 .230823 -.318135
+bezier .180191 -.286993 .13924 -.231222 .13716 -.17018
+aline .13589 -.16891
+aline .13589 0
+aline .13843 .00127
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=">" !-------------- Beginning of new char.
+dfont wid=.888891 hei=0 dep=.300003 italic=0
+dfont ext_top=0 ext_mid=0 ext_bot=0 ext_rep=">"
+set path ! start of curve
+newpath
+! start of curve
+amove .17526 .00127
+aline .1778 0
+aline .1778 -.10922
+aline .17526 -.11049
+aline .13843 -.11049
+aline .13589 -.10922
+aline .13589 0
+aline .13843 .00127
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="?" !-------------- Beginning of new char.
+dfont wid=.666669 hei=0 dep=.600006 italic=0
+dfont ext_top="x" ext_mid=0 ext_bot="y" ext_rep="?"
+set path ! start of curve
+newpath
+! start of curve
+amove .12446 -.00127
+aline .12446 -.21336
+aline .10922 -.21336
+aline .10922 -.00127
+aline .12446 -.00127
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="@" !-------------- Beginning of new char.
+dfont wid=.875003 hei=.039999 dep=1.76002 italic=0
+dfont ext_top="8" ext_mid=0 ext_bot=";" ext_rep=">"
+set path ! start of curve
+newpath
+! start of curve
+amove .13843 .01524
+aline .14097 .01397
+aline .14097 -.04699
+aline .14224 -.04826
+aline .14224 -.08763
+aline .14351 -.0889
+aline .14351 -.1143
+aline .14478 -.11557
+aline .14478 -.13589
+aline .14605 -.13716
+aline .14605 -.15367
+aline .14732 -.15494
+aline .14732 -.16891
+aline .14859 -.17018
+aline .14859 -.18288
+aline .14986 -.18415
+aline .14986 -.19558
+aline .15113 -.19685
+aline .15113 -.20701
+aline .1524 -.20828
+aline .1524 -.21844
+aline .15367 -.21971
+aline .15367 -.2286
+aline .15494 -.22987
+aline .15494 -.23876
+aline .15621 -.24003
+aline .15621 -.24765
+aline .15748 -.24892
+aline .15748 -.25527
+aline .15875 -.25654
+aline .15875 -.26416
+aline .16002 -.26543
+bezier .171911 -.344834 .195116 -.428993 .22987 -.50419
+aline .24511 -.53467
+bezier .26078 -.56225 .276799 -.58958 .29591 -.61468
+aline .29591 -.61722
+aline .29464 -.61849
+aline .28067 -.61849
+bezier .253145 -.586952 .230441 -.55194 .20955 -.51562
+aline .18542 -.46736
+bezier .168654 -.429542 .154673 -.390464 .14351 -.35052
+aline .13335 -.30988
+aline .13208 -.30353
+aline .13081 -.29845
+aline .12446 -.2667
+aline .12446 -.26035
+aline .12319 -.25908
+bezier .121265 -.242611 .11787 -.228283 .11684 -.21209
+aline .11557 -.21082
+aline .11557 -.20193
+aline .1143 -.20066
+aline .1143 -.19177
+aline .11303 -.1905
+aline .11303 -.18034
+aline .11176 -.17907
+aline .11176 -.16891
+aline .11049 -.16764
+aline .11049 -.15494
+aline .10922 -.15367
+aline .10922 -.14097
+aline .10795 -.1397
+aline .10795 -.12446
+aline .10668 -.12319
+aline .10668 -.10414
+aline .10541 -.10287
+aline .10541 -.08001
+aline .10414 -.07874
+aline .10414 -.04191
+aline .10287 -.04064
+aline .10287 .01397
+aline .10541 .01524
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="A" !-------------- Beginning of new char.
+dfont wid=.875003 hei=.039999 dep=1.76002 italic=0
+dfont ext_top="9" ext_mid=0 ext_bot=":" ext_rep=">"
+set path ! start of curve
+newpath
+! start of curve
+amove .20193 .01524
+aline .20447 .01397
+aline .20447 -.04064
+aline .2032 -.04191
+aline .2032 -.07874
+aline .20193 -.08001
+aline .20193 -.10287
+aline .20066 -.10414
+aline .20066 -.12319
+aline .19939 -.12446
+aline .19939 -.1397
+aline .19812 -.14097
+aline .19812 -.15367
+aline .19685 -.15494
+aline .19685 -.16764
+aline .19558 -.16891
+aline .19558 -.17907
+aline .19431 -.18034
+aline .19431 -.1905
+aline .19304 -.19177
+aline .19304 -.20066
+aline .19177 -.20193
+aline .19177 -.21082
+aline .1905 -.21209
+bezier .18947 -.228283 .186075 -.242611 .18415 -.25908
+aline .18288 -.26035
+aline .18288 -.2667
+aline .17653 -.29845
+aline .17526 -.30353
+aline .17399 -.30988
+aline .16383 -.35052
+bezier .152667 -.390464 .138686 -.429542 .12192 -.46736
+aline .09779 -.51562
+bezier .768991E-01 -.551939 .541946E-01 -.586952 .02667 -.61849
+aline .0127 -.61849
+aline .01143 -.61722
+aline .01143 -.61468
+bezier .305409E-01 -.58958 .465597E-01 -.56225 .06223 -.53467
+aline .07747 -.50419
+bezier .119745 -.413807 .142712 -.311255 .15494 -.21844
+aline .15494 -.20828
+aline .15621 -.20701
+aline .15621 -.19685
+aline .15748 -.19558
+aline .15748 -.18415
+aline .15875 -.18288
+aline .15875 -.17018
+aline .16002 -.16891
+aline .16002 -.15494
+aline .16129 -.15367
+aline .16129 -.13716
+aline .16256 -.13589
+aline .16256 -.11557
+aline .16383 -.1143
+aline .16383 -.0889
+aline .1651 -.08763
+aline .1651 -.04826
+aline .16637 -.04699
+aline .16637 .01397
+aline .16891 .01524
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="B" !-------------- Beginning of new char.
+dfont wid=.875003 hei=0 dep=.600006 italic=0
+dfont ext_top=0 ext_mid=0 ext_bot=0 ext_rep="B"
+set path ! start of curve
+newpath
+! start of curve
+amove .13843 .00127
+aline .14097 0
+aline .14097 -.21463
+aline .13843 -.2159
+aline .10541 -.2159
+aline .10287 -.21463
+aline .10287 0
+aline .10541 .00127
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="C" !-------------- Beginning of new char.
+dfont wid=.875003 hei=0 dep=.600006 italic=0
+dfont ext_top=0 ext_mid=0 ext_bot=0 ext_rep="C"
+set path ! start of curve
+newpath
+! start of curve
+amove .20193 .00127
+aline .20447 0
+aline .20447 -.21463
+aline .20193 -.2159
+aline .16891 -.2159
+aline .16637 -.21463
+aline .16637 0
+aline .16891 .00127
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="D" !-------------- Beginning of new char.
+dfont wid=.611113 hei=.039999 dep=1.76002 italic=0
+dfont next_char=28
+set path ! start of curve
+newpath
+! start of curve
+amove .17907 .01143
+aline .18415 .00635
+aline .18415 0
+bezier .141726 -.101275 .986786E-01 -.202371 .576263E-01 -.304165
+bezier .986786E-01 -.405959 .141726 -.507055 .18415 -.60833
+aline .18415 -.61468
+aline .17907 -.61976
+aline .17272 -.61976
+bezier .160749 -.605265 .157367 -.58548 .14859 -.56896
+bezier .112517 -.481615 .761569E-01 -.394389 .03937 -.30734
+aline .03937 -.30099
+bezier .831485E-01 -.198368 .124832 -.094878 .16891 .00762
+aline .17272 .01143
+aline .17907 .01143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="E" !-------------- Beginning of new char.
+dfont wid=.611113 hei=.039999 dep=1.76002 italic=0
+dfont next_char=29
+set path ! start of curve
+newpath
+! start of curve
+amove .04191 .01143
+bezier .538811E-01 -.306466E-02 .572631E-01 -.228496E-01 .06604 -.03937
+bezier .102113 -.126715 .138473 -.213941 .17526 -.30099
+aline .17526 -.30734
+bezier .131482 -.409962 .897979E-01 -.513452 .04572 -.61595
+aline .04191 -.61976
+aline .03556 -.61976
+aline .03048 -.61468
+aline .03048 -.60833
+bezier .729039E-01 -.507055 .115951 -.405959 .157004 -.304165
+bezier .115951 -.202371 .729039E-01 -.101275 .03048 0
+aline .03048 .00635
+aline .03556 .01143
+aline .04191 .01143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="F" !-------------- Beginning of new char.
+dfont wid=.833336 hei=0 dep=1.00001 italic=0
+dfont next_char="G"
+set path ! start of curve
+newpath
+! start of curve
+amove .03556 -.00254
+aline .0381 -.00381
+aline .04191 -.00762
+aline .04318 -.01016
+aline .04318 -.32893
+aline .04445 -.3302
+aline .24892 -.3302
+aline .25019 -.32893
+aline .25019 -.01016
+aline .25146 -.00762
+aline .25527 -.00381
+aline .25781 -.00254
+aline .26543 -.00254
+aline .26797 -.00381
+aline .27178 -.00762
+aline .27305 -.01016
+aline .27305 -.34544
+aline .27178 -.34798
+aline .26797 -.35179
+aline .26543 -.35306
+aline .02921 -.35306
+aline .0254 -.35179
+aline .02159 -.34798
+aline .02032 -.34417
+aline .02032 -.01016
+aline .02159 -.00762
+aline .0254 -.00381
+aline .02794 -.00254
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="G" !-------------- Beginning of new char.
+dfont wid=1.11111 hei=.100001 dep=1.50001 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .0381 -.00254
+aline .04064 -.00381
+aline .04318 -.00508
+aline .04572 -.00762
+aline .04826 -.0127
+aline .04826 -.46355
+aline .04953 -.46482
+aline .34036 -.46482
+aline .34163 -.46355
+aline .34163 -.0127
+aline .34417 -.00762
+aline .34671 -.00508
+aline .35179 -.00254
+aline .35941 -.00254
+aline .36449 -.00508
+aline .36703 -.00762
+aline .36957 -.0127
+aline .36957 -.4826
+aline .36703 -.48768
+aline .36449 -.49022
+aline .35941 -.49276
+aline .03048 -.49276
+aline .0254 -.49022
+aline .02286 -.48768
+aline .02032 -.4826
+aline .02032 -.0127
+aline .02286 -.00762
+aline .0254 -.00508
+aline .02794 -.00381
+aline .03048 -.00254
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="H" !-------------- Beginning of new char.
+dfont wid=.472223 hei=0 dep=1.11112 italic=.194446
+dfont next_char="I"
+set path ! start of curve
+newpath
+! start of curve
+amove .18415 -.00254
+bezier .201588 -.433652E-02 .222238 -.222577E-01 .21209 -.04064
+aline .20955 -.04318
+aline .20447 -.04572
+aline .19685 -.04572
+aline .19177 -.04318
+aline .18923 -.04064
+aline .18669 -.03556
+aline .18669 -.02794
+aline .18923 -.02286
+aline .19177 -.02032
+aline .19939 -.01651
+bezier .1872 -.841974E-02 .168923 -.428659E-02 .15875 -.01778
+aline .15748 -.02032
+aline .15621 -.02159
+bezier .148599 -.040614 .144757 -.058896 .14478 -.07874
+aline .14351 -.08001
+aline .14351 -.09271
+aline .14224 -.09398
+aline .14224 -.10922
+aline .14097 -.11049
+aline .14097 -.12827
+aline .140123 -.13081
+aline .14097 -.13335
+bezier .180524 -.144639 .201063 -.197048 .17653 -.23114
+bezier .166631 -.248632 .147448 -.258811 .128039 -.262544
+aline .127 -.2667
+aline .12573 -.26797
+aline .12573 -.27686
+aline .12446 -.27813
+bezier .122785 -.296734 .120634 -.313823 .11684 -.33274
+bezier .109622 -.357809 .951289E-01 -.385601 .06731 -.39116
+aline .0508 -.39116
+bezier .333615E-01 -.389363 .012712 -.371442 .02286 -.35306
+aline .0254 -.35052
+aline .03048 -.34798
+aline .0381 -.34798
+aline .04318 -.35052
+aline .04572 -.35306
+aline .04826 -.35814
+aline .04826 -.36576
+aline .04572 -.37084
+aline .04318 -.37338
+aline .03556 -.37719
+bezier .476832E-01 -.385049 .643506E-01 -.388761 .0762 -.37846
+bezier .091144 -.366196 .917805E-01 -.342939 .09652 -.32639
+aline .09652 -.31496
+aline .09779 -.31369
+aline .09779 -.30099
+aline .09906 -.29972
+aline .09906 -.28448
+aline .10033 -.28321
+aline .10033 -.26543
+aline .101092 -.26162
+aline .100511 -.258717
+bezier .0616 -.246861 .417784E-01 -.195019 .06604 -.16129
+bezier .756876E-01 -.144116 .944397E-01 -.134117 .113284 -.130048
+aline .1143 -.127
+aline .11557 -.12573
+aline .11557 -.11684
+aline .11684 -.11557
+aline .11684 -.10795
+aline .11811 -.10668
+aline .11811 -.09779
+aline .11938 -.09652
+bezier .122007 -.067302 .126544 -.318595E-01 .15113 -.01016
+aline .15367 -.00889
+aline .15494 -.00762
+aline .16002 -.00508
+aline .16383 -.00381
+aline .16891 -.00254
+closepath
+! end of curve
+
+! start of curve
+amove .10668 -.14732
+bezier .880609E-01 -.152569 .738285E-01 -.168765 .07112 -.18796
+aline .06985 -.18923
+bezier .678547E-01 -.211601 .805919E-01 -.234793 .1016 -.24384
+aline .10287 -.24257
+aline .10287 -.23114
+aline .10414 -.22987
+aline .10414 -.21717
+aline .10541 -.2159
+aline .10541 -.2032
+aline .10668 -.20193
+aline .10668 -.1905
+aline .10795 -.18923
+aline .10795 -.17907
+aline .10922 -.1778
+aline .10922 -.16764
+aline .11049 -.16637
+aline .11049 -.15748
+aline .11176 -.15621
+aline .11176 -.14732
+aline .10922 -.146473
+closepath
+! end of curve
+
+! start of curve
+amove .13843 -.14986
+aline .13843 -.16256
+aline .13716 -.16383
+aline .13716 -.17653
+aline .13589 -.1778
+aline .13589 -.1905
+aline .13462 -.19177
+aline .13462 -.2032
+aline .13335 -.20447
+aline .13335 -.21463
+aline .13208 -.2159
+aline .13208 -.22606
+aline .13081 -.22733
+aline .13081 -.23622
+aline .12954 -.23749
+aline .12954 -.24511
+bezier .150804 -.245206 .16859 -.225045 .17145 -.20447
+aline .17272 -.2032
+bezier .174514 -.181011 .162287 -.156812 .140335 -.148907
+aline .13843 -.14986
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="I" !-------------- Beginning of new char.
+dfont wid=.555557 hei=0 dep=2.22225 italic=.444446
+set path ! start of curve
+newpath
+! start of curve
+amove .29972 -.00254
+bezier .319306 -.50209E-02 .339266 -.258595E-01 .32893 -.04572
+aline .32512 -.04953
+aline .32258 -.0508
+aline .31877 -.05207
+aline .31115 -.05207
+aline .30734 -.0508
+aline .3048 -.04953
+aline .30099 -.04572
+aline .29845 -.04064
+aline .29845 -.03048
+aline .30099 -.0254
+aline .3048 -.02159
+aline .30734 -.02032
+aline .31115 -.01905
+aline .31623 -.01778
+aline .31369 -.01651
+aline .31242 -.01524
+aline .3048 -.01143
+aline .29972 -.01016
+aline .29845 -.00889
+aline .29083 -.00889
+aline .28575 -.01397
+aline .28448 -.01651
+aline .28321 -.01778
+aline .2794 -.0254
+aline .27813 -.02921
+aline .27686 -.03175
+aline .27051 -.0508
+aline .26924 -.05588
+aline .26797 -.05969
+aline .25908 -.09525
+aline .25781 -.1016
+aline .25654 -.10668
+aline .25273 -.12573
+aline .25146 -.13081
+aline .24511 -.16256
+aline .24384 -.16383
+aline .24384 -.17018
+aline .24003 -.18923
+aline .23876 -.1905
+aline .23876 -.19685
+aline .23749 -.19812
+aline .23749 -.20447
+aline .23622 -.21082
+aline .23495 -.21209
+bezier .234659 -.22703 .229082 -.240623 .2286 -.25527
+aline .22733 -.25654
+aline .22733 -.26289
+aline .22606 -.26416
+aline .22606 -.27051
+aline .22479 -.27178
+aline .22479 -.27813
+aline .22352 -.2794
+aline .22352 -.28575
+aline .22225 -.28702
+aline .22225 -.29337
+aline .22098 -.29464
+aline .22098 -.30099
+aline .21971 -.30226
+bezier .249936 -.316303 .276819 -.344762 .27813 -.37973
+bezier .287987 -.428128 .247766 -.482689 .19685 -.48514
+aline .19558 -.48641
+aline .18415 -.48641
+bezier .176731 -.521687 .168125 -.556697 .16002 -.59182
+aline .14224 -.66294
+bezier .130805 -.702405 .119511 -.745436 .08763 -.77343
+bezier .664332E-01 -.790143 .280531E-01 -.783655 .02032 -.75565
+aline .02032 -.74422
+aline .02286 -.73914
+aline .02667 -.73533
+aline .02921 -.73406
+aline .03302 -.73279
+aline .04064 -.73279
+aline .04445 -.73406
+aline .04699 -.73533
+aline .0508 -.73914
+aline .05334 -.74422
+aline .05334 -.75438
+aline .0508 -.75946
+aline .04699 -.76327
+aline .04445 -.76454
+aline .04064 -.76581
+aline .03556 -.76708
+bezier .464052E-01 -.774551 .061195 -.78058 .07239 -.77089
+bezier .099427 -.743064 .104667 -.701757 .1143 -.66548
+bezier .122341 -.626825 .130243 -.589861 .13589 -.55245
+aline .13716 -.55118
+aline .13716 -.54483
+aline .13843 -.54356
+aline .13843 -.53721
+aline .1397 -.53594
+aline .1397 -.52959
+aline .14097 -.52832
+aline .14097 -.52197
+aline .14224 -.5207
+aline .14224 -.51435
+aline .14351 -.51308
+aline .14351 -.50673
+aline .14478 -.50546
+aline .14478 -.49911
+aline .14605 -.49784
+aline .14605 -.49149
+aline .14732 -.49022
+aline .14732 -.48387
+aline .148167 -.48133
+aline .147574 -.479552
+bezier .109191 -.463944 .083453 -.419866 .09144 -.37973
+bezier .938447E-01 -.333469 .139016 -.295377 .18415 -.29718
+bezier .192098 -.262445 .200104 -.227723 .20828 -.19304
+aline .22733 -.11684
+aline .2286 -.11303
+aline .23114 -.10287
+aline .23241 -.09906
+aline .23368 -.09398
+aline .24511 -.05969
+bezier .254408 -.380447E-01 .263711 -.120501E-01 .28702 -.00254
+closepath
+! end of curve
+
+! start of curve
+amove .17526 -.31242
+bezier .142715 -.314707 .11311 -.340741 .10668 -.37338
+bezier .967953E-01 -.407471 .116325 -.449263 .14986 -.46482
+aline .15113 -.46228
+aline .1524 -.45593
+aline .15367 -.45466
+aline .15367 -.44831
+aline .15494 -.44196
+aline .15621 -.44069
+aline .15621 -.43434
+aline .16129 -.40894
+aline .16256 -.40767
+aline .16256 -.40132
+aline .16383 -.39497
+aline .1651 -.38989
+aline .17399 -.34544
+aline .17526 -.34036
+aline .17907 -.32131
+aline .18034 -.31623
+aline .181187 -.31369
+aline .180686 -.312189
+aline .178435 -.311626
+aline .17526 -.31242
+closepath
+! end of curve
+
+! start of curve
+amove .21717 -.32258
+aline .2159 -.32893
+aline .21463 -.3302
+aline .21463 -.33655
+aline .21336 -.3429
+aline .21209 -.34417
+aline .21209 -.35052
+aline .20701 -.37592
+aline .20574 -.37719
+aline .20574 -.38354
+aline .20447 -.38989
+aline .2032 -.39497
+aline .19431 -.43942
+aline .19304 -.4445
+aline .18923 -.46355
+aline .18796 -.46863
+aline .187008 -.470535
+bezier .202174 -.474086 .21888 -.465125 .23241 -.4572
+bezier .262078 -.435348 .27373 -.39368 .25908 -.36068
+bezier .251357 -.342521 .23697 -.325316 .218186 -.319532
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="J" !-------------- Beginning of new char.
+dfont wid=1.11111 hei=0 dep=1.00001 italic=0
+dfont next_char="K"
+set path ! start of curve
+newpath
+! start of curve
+amove .20955 -.00254
+bezier .262415 -.69685E-02 .313831 -.037051 .34163 -.08255
+bezier .358471 -.105544 .366023 -.135818 .36957 -.16256
+aline .36957 -.19304
+bezier .365833 -.223429 .35589 -.257316 .33528 -.28194
+bezier .2853 -.355472 .175523 -.375364 .1016 -.32639
+bezier .568989E-01 -.298201 .241629E-01 -.247569 .02159 -.19431
+aline .02032 -.19304
+aline .02032 -.16256
+bezier .240566E-01 -.132171 .340003E-01 -.982838E-01 .05461 -.07366
+bezier .883196E-01 -.243524E-01 .150417 .205938E-02 .20955 -.00254
+closepath
+! end of curve
+
+! start of curve
+amove .18161 -.02667
+bezier .116984 -.310367E-01 .596078E-01 -.820279E-01 .04699 -.14605
+aline .04572 -.14732
+aline .04572 -.15367
+aline .04445 -.15494
+aline .04445 -.16383
+aline .04318 -.1651
+bezier .392916E-01 -.222952 .700253E-01 -.284407 .12319 -.31115
+bezier .148848 -.326028 .178004 -.331355 .20701 -.3302
+bezier .232895 -.32641 .261584 -.317887 .28321 -.30099
+bezier .334699 -.265176 .359379 -.194138 .34036 -.13589
+bezier .322416 -.673181E-01 .252251 -.202933E-01 .18288 -.0254
+aline .18161 -.02667
+closepath
+! end of curve
+
+! start of curve
+amove .19812 -.15367
+aline .2032 -.15494
+aline .20828 -.15748
+aline .21463 -.16383
+aline .21844 -.17145
+aline .21844 -.18415
+aline .21463 -.19177
+aline .20828 -.19812
+aline .2032 -.20066
+aline .19812 -.20193
+aline .19177 -.20193
+aline .18669 -.20066
+aline .18161 -.19812
+aline .17526 -.19177
+aline .17145 -.18415
+aline .17145 -.17145
+aline .17526 -.16383
+aline .18161 -.15748
+aline .18669 -.15494
+aline .19177 -.15367
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="K" !-------------- Beginning of new char.
+dfont wid=1.51112 hei=.100001 dep=1.50001 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .28321 -.00254
+aline .28448 -.00381
+bezier .336317 -.513615E-02 .387406 -.294289E-01 .42672 -.06223
+aline .45212 -.08763
+bezier .485568 -.126751 .50673 -.179333 .51054 -.22987
+aline .51054 -.26543
+aline .50927 -.2667
+bezier .507799 -.317801 .484399 -.368665 .45212 -.40767
+aline .42672 -.43307
+bezier .387406 -.465871 .336317 -.490164 .28448 -.49149
+aline .28321 -.49276
+aline .24765 -.49276
+aline .24638 -.49149
+bezier .194543 -.490164 .143454 -.465871 .10414 -.43307
+aline .07874 -.40767
+bezier .452921E-01 -.368549 .241299E-01 -.315967 .02032 -.26543
+aline .02032 -.22987
+aline .02159 -.2286
+bezier .230615E-01 -.177499 .464611E-01 -.126635 .07874 -.08763
+aline .10414 -.06223
+bezier .143454 -.294289E-01 .194543 -.513612E-02 .24638 -.00381
+aline .24765 -.00254
+aline .28321 -.00254
+closepath
+! end of curve
+
+! start of curve
+amove .24892 -.03175
+bezier .205071 -.034103 .160057 -.532248E-01 .12573 -.08128
+aline .1016 -.10541
+bezier .764442E-01 -.134669 .589721E-01 -.170906 .05207 -.20955
+aline .0508 -.21082
+aline .0508 -.21844
+aline .04953 -.21971
+aline .04953 -.23114
+aline .04826 -.23241
+aline .04826 -.26289
+aline .04953 -.26416
+bezier .506581E-01 -.293899 .612195E-01 -.324394 .07493 -.35179
+bezier .828213E-01 -.36521 .918006E-01 -.377845 .1016 -.38989
+aline .12573 -.41402
+bezier .154638 -.437711 .189922 -.454263 .22733 -.46101
+aline .2286 -.46228
+aline .23622 -.46228
+aline .23749 -.46355
+aline .24892 -.46355
+aline .25019 -.46482
+aline .28067 -.46482
+aline .28194 -.46355
+bezier .325789 -.461197 .370803 -.442075 .40513 -.41402
+aline .42926 -.38989
+bezier .454416 -.360631 .471888 -.324394 .47879 -.28575
+aline .48006 -.28448
+aline .48006 -.27686
+aline .48133 -.27559
+aline .48133 -.26416
+aline .4826 -.26289
+aline .4826 -.23241
+aline .48133 -.23114
+bezier .480202 -.201401 .46964 -.170906 .45593 -.14351
+bezier .448039 -.13009 .439059 -.117455 .42926 -.10541
+aline .40513 -.08128
+bezier .376222 -.575889E-01 .340938 -.410372E-01 .30353 -.03429
+aline .30226 -.03302
+aline .29464 -.03302
+aline .29337 -.03175
+aline .28194 -.03175
+aline .28067 -.03048
+aline .25019 -.03048
+aline .24892 -.03175
+closepath
+! end of curve
+
+! start of curve
+amove .2667 -.21844
+bezier .288622 -.219122 .302325 -.246176 .28956 -.26416
+bezier .276629 -.284129 .242727 -.278585 .23749 -.25527
+aline .23622 -.24892
+aline .23622 -.24638
+aline .23749 -.24003
+aline .23876 -.23622
+aline .2413 -.23114
+aline .24892 -.22352
+aline .254 -.22098
+aline .25781 -.21971
+aline .26416 -.21844
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="L" !-------------- Beginning of new char.
+dfont wid=1.11111 hei=0 dep=1.00001 italic=0
+dfont next_char="M"
+set path ! start of curve
+newpath
+! start of curve
+amove .20955 -.00254
+bezier .262415 -.69685E-02 .313831 -.037051 .34163 -.08255
+bezier .358471 -.105544 .366023 -.135818 .36957 -.16256
+aline .36957 -.19304
+bezier .365833 -.223429 .35589 -.257316 .33528 -.28194
+bezier .2853 -.355472 .175523 -.375364 .1016 -.32639
+bezier .568989E-01 -.298201 .241629E-01 -.247569 .02159 -.19431
+aline .02032 -.19304
+aline .02032 -.16256
+bezier .240566E-01 -.132171 .340003E-01 -.982838E-01 .05461 -.07366
+bezier .883196E-01 -.243524E-01 .150417 .205938E-02 .20955 -.00254
+closepath
+! end of curve
+
+! start of curve
+amove .18161 -.02667
+bezier .116984 -.310367E-01 .596078E-01 -.820279E-01 .04699 -.14605
+aline .04572 -.14732
+aline .04572 -.15367
+aline .04445 -.15494
+aline .04445 -.16383
+aline .04318 -.1651
+aline .04445 -.16637
+aline .18288 -.16637
+aline .18415 -.1651
+aline .18415 -.02667
+aline .18288 -.0254
+aline .18161 -.02667
+closepath
+! end of curve
+
+! start of curve
+amove .20701 -.02794
+aline .20701 -.1651
+aline .20828 -.16637
+aline .34544 -.16637
+bezier .346126 -.147817 .337543 -.125545 .32893 -.10668
+bezier .305679 -.623357E-01 .258549 -.300535E-01 .20828 -.02667
+aline .20701 -.02794
+closepath
+! end of curve
+
+! start of curve
+amove .04318 -.1905
+bezier .477442E-01 -.222425 .605691E-01 -.258026 .08509 -.28194
+bezier .106809 -.305862 .137588 -.32239 .17018 -.32766
+aline .17145 -.32893
+aline .18161 -.32893
+aline .18288 -.3302
+aline .18415 -.32893
+aline .18415 -.1905
+aline .18288 -.18923
+aline .04445 -.18923
+aline .04318 -.1905
+closepath
+! end of curve
+
+! start of curve
+amove .20701 -.1905
+aline .20701 -.32766
+aline .20828 -.32893
+bezier .272905 -.324563 .330282 -.273572 .3429 -.20955
+aline .34417 -.20828
+aline .34417 -.20193
+aline .34544 -.20066
+aline .34544 -.19177
+aline .34671 -.1905
+aline .34544 -.18923
+aline .20828 -.18923
+aline .20701 -.1905
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="M" !-------------- Beginning of new char.
+dfont wid=1.51112 hei=.100001 dep=1.50001 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .28321 -.00254
+aline .28448 -.00381
+bezier .336317 -.513615E-02 .387406 -.294289E-01 .42672 -.06223
+aline .45212 -.08763
+bezier .485568 -.126751 .50673 -.179333 .51054 -.22987
+aline .51054 -.26543
+aline .50927 -.2667
+bezier .507799 -.317801 .484399 -.368665 .45212 -.40767
+aline .42672 -.43307
+bezier .387406 -.465871 .336317 -.490164 .28448 -.49149
+aline .28321 -.49276
+aline .24765 -.49276
+aline .24638 -.49149
+bezier .194543 -.490164 .143454 -.465871 .10414 -.43307
+aline .07874 -.40767
+bezier .452921E-01 -.368549 .241299E-01 -.315967 .02032 -.26543
+aline .02032 -.22987
+aline .02159 -.2286
+bezier .230615E-01 -.177499 .464611E-01 -.126635 .07874 -.08763
+aline .10414 -.06223
+bezier .143454 -.294289E-01 .194543 -.513612E-02 .24638 -.00381
+aline .24765 -.00254
+aline .28321 -.00254
+closepath
+! end of curve
+
+! start of curve
+amove .24892 -.03175
+bezier .205071 -.034103 .160057 -.532248E-01 .12573 -.08128
+aline .1016 -.10541
+bezier .764442E-01 -.134669 .589721E-01 -.170906 .05207 -.20955
+aline .0508 -.21082
+aline .0508 -.21844
+aline .04953 -.21971
+aline .04953 -.23114
+aline .04826 -.23241
+aline .04953 -.23368
+aline .25019 -.23368
+aline .25146 -.23241
+aline .25146 -.03175
+aline .25019 -.03048
+aline .24892 -.03175
+closepath
+! end of curve
+
+! start of curve
+amove .2794 -.03175
+aline .2794 -.23241
+aline .28067 -.23368
+aline .48133 -.23368
+aline .4826 -.23241
+aline .48133 -.23114
+bezier .480202 -.201401 .46964 -.170906 .45593 -.14351
+bezier .448039 -.13009 .439059 -.117455 .42926 -.10541
+aline .40513 -.08128
+bezier .376222 -.575889E-01 .340938 -.410372E-01 .30353 -.03429
+aline .30226 -.03302
+aline .29464 -.03302
+aline .29337 -.03175
+aline .28194 -.03175
+aline .28067 -.03048
+aline .2794 -.03175
+closepath
+! end of curve
+
+! start of curve
+amove .04826 -.26289
+aline .04953 -.26416
+bezier .506581E-01 -.293899 .612195E-01 -.324394 .07493 -.35179
+bezier .828213E-01 -.36521 .918006E-01 -.377845 .1016 -.38989
+aline .12573 -.41402
+bezier .154638 -.437711 .189922 -.454263 .22733 -.46101
+aline .2286 -.46228
+aline .23622 -.46228
+aline .23749 -.46355
+aline .24892 -.46355
+aline .25019 -.46482
+aline .25146 -.46355
+aline .25146 -.26289
+aline .25019 -.26162
+aline .04953 -.26162
+aline .04826 -.26289
+closepath
+! end of curve
+
+! start of curve
+amove .2794 -.26289
+aline .2794 -.46355
+aline .28067 -.46482
+aline .28194 -.46355
+bezier .325789 -.461197 .370803 -.442075 .40513 -.41402
+aline .42926 -.38989
+bezier .454416 -.360631 .471888 -.324394 .47879 -.28575
+aline .48006 -.28448
+aline .48006 -.27686
+aline .48133 -.27559
+aline .48133 -.26416
+aline .4826 -.26289
+aline .48133 -.26162
+aline .28067 -.26162
+aline .2794 -.26289
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="N" !-------------- Beginning of new char.
+dfont wid=1.11111 hei=0 dep=1.00001 italic=0
+dfont next_char="O"
+set path ! start of curve
+newpath
+! start of curve
+amove .20955 -.00254
+bezier .262415 -.69685E-02 .313831 -.037051 .34163 -.08255
+bezier .358471 -.105544 .366023 -.135818 .36957 -.16256
+aline .36957 -.19304
+bezier .365833 -.223429 .35589 -.257316 .33528 -.28194
+bezier .2853 -.355472 .175523 -.375364 .1016 -.32639
+bezier .568989E-01 -.298201 .241629E-01 -.247569 .02159 -.19431
+aline .02032 -.19304
+aline .02032 -.16256
+bezier .240566E-01 -.132171 .340003E-01 -.982838E-01 .05461 -.07366
+bezier .883196E-01 -.243524E-01 .150417 .205938E-02 .20955 -.00254
+closepath
+! end of curve
+
+! start of curve
+amove .18161 -.02667
+bezier .150791 -.283082E-01 .120145 -.425394E-01 .09652 -.06223
+aline .19304 -.15875
+aline .194945 -.159702
+aline .19685 -.15875
+aline .29337 -.06223
+bezier .26295 -.363519E-01 .222337 -.230958E-01 .18288 -.0254
+aline .18161 -.02667
+closepath
+! end of curve
+
+! start of curve
+amove .07747 -.08128
+bezier .630994E-01 -.100285 .519763E-01 -.122223 .04699 -.14605
+aline .04572 -.14732
+aline .04572 -.15367
+aline .04445 -.15494
+aline .04445 -.16383
+aline .04318 -.1651
+bezier .407351E-01 -.205057 .538905E-01 -.245711 .08001 -.27686
+aline .17907 -.1778
+aline .08001 -.07874
+aline .07747 -.08128
+closepath
+! end of curve
+
+! start of curve
+amove .21082 -.1778
+aline .30988 -.27686
+bezier .342394 -.237889 .355849 -.183233 .34036 -.13589
+bezier .334298 -.11476 .323786 -.952872E-01 .30988 -.07874
+aline .21082 -.1778
+closepath
+! end of curve
+
+! start of curve
+amove .09652 -.29337
+bezier .136263 -.326982 .19243 -.339694 .2413 -.32258
+bezier .260547 -.31637 .278001 -.305929 .29337 -.29337
+aline .19685 -.19685
+aline .194945 -.195898
+aline .19304 -.19685
+aline .09652 -.29337
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="O" !-------------- Beginning of new char.
+dfont wid=1.51112 hei=.100001 dep=1.50001 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .28321 -.00254
+aline .28448 -.00381
+bezier .336317 -.513615E-02 .387406 -.294289E-01 .42672 -.06223
+aline .45212 -.08763
+bezier .485568 -.126751 .50673 -.179333 .51054 -.22987
+aline .51054 -.26543
+aline .50927 -.2667
+bezier .507799 -.317801 .484399 -.368665 .45212 -.40767
+aline .42672 -.43307
+bezier .387406 -.465871 .336317 -.490164 .28448 -.49149
+aline .28321 -.49276
+aline .24765 -.49276
+aline .24638 -.49149
+bezier .194543 -.490164 .143454 -.465871 .10414 -.43307
+aline .07874 -.40767
+bezier .452921E-01 -.368549 .241299E-01 -.315967 .02032 -.26543
+aline .02032 -.22987
+aline .02159 -.2286
+bezier .230615E-01 -.177499 .464611E-01 -.126635 .07874 -.08763
+aline .10414 -.06223
+bezier .143454 -.294289E-01 .194543 -.513612E-02 .24638 -.00381
+aline .24765 -.00254
+aline .28321 -.00254
+closepath
+! end of curve
+
+! start of curve
+amove .24892 -.03175
+bezier .204525 -.342209E-01 .158794 -.053545 .12446 -.08255
+aline .123507 -.084455
+aline .12446 -.08636
+aline .26543 -.22733
+aline .4064 -.08636
+aline .407353 -.084455
+bezier .377382 -.549832E-01 .333559 -.394757E-01 .29337 -.03175
+aline .28194 -.03175
+aline .28067 -.03048
+aline .25019 -.03048
+aline .24892 -.03175
+closepath
+! end of curve
+
+! start of curve
+amove .10033 -.10795
+bezier .692145E-01 -.141326 .533466E-01 -.189127 .04826 -.23241
+aline .04826 -.26289
+aline .04953 -.26416
+bezier .506581E-01 -.293899 .612195E-01 -.324394 .07493 -.35179
+bezier .831517E-01 -.364971 .912892E-01 -.3786 .102235 -.389573
+aline .10414 -.38862
+aline .24511 -.24765
+aline .10414 -.10668
+aline .102235 -.105728
+aline .101177 -.106257
+aline .10033 -.10795
+closepath
+! end of curve
+
+! start of curve
+amove .28575 -.24765
+aline .42672 -.38862
+aline .428625 -.389573
+bezier .460702 -.356051 .477521 -.307156 .4826 -.26289
+aline .4826 -.23241
+aline .48133 -.23114
+bezier .480202 -.201401 .46964 -.170906 .45593 -.14351
+bezier .447708 -.13033 .439571 -.116699 .428625 -.105728
+aline .42672 -.10668
+aline .28575 -.24765
+closepath
+! end of curve
+
+! start of curve
+amove .12446 -.40894
+aline .123507 -.410845
+bezier .153478 -.440317 .197301 -.455824 .23749 -.46355
+aline .24892 -.46355
+aline .25019 -.46482
+aline .28067 -.46482
+aline .28194 -.46355
+bezier .326335 -.461079 .372066 -.441755 .4064 -.41275
+aline .407353 -.410845
+aline .4064 -.40894
+aline .26543 -.26797
+aline .12446 -.40894
+aline .123507 -.410845
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="P" !-------------- Beginning of new char.
+dfont wid=1.05556 hei=0 dep=1.00001 italic=0
+dfont next_char="X"
+set path ! start of curve
+newpath
+! start of curve
+amove .32004 -.00254
+bezier .331167 -.293707E-01 .340486 -.575683E-01 .35052 -.08509
+aline .3429 -.08509
+bezier .327846 -.467952E-01 .287111 -.237107E-01 .24765 -.02032
+aline .24638 -.01905
+aline .23749 -.01905
+aline .23622 -.01778
+aline .21844 -.01778
+aline .21717 -.01651
+aline .05969 -.01651
+aline .587375E-01 -.018415
+bezier .967926E-01 -.713812E-01 .135737 -.123707 .17399 -.17653
+aline .17399 -.17907
+bezier .133655 -.230225 .925389E-01 -.280817 .523875E-01 -.332105
+aline .05334 -.33401
+aline .21971 -.33401
+aline .22098 -.33274
+bezier .248131 -.333169 .274455 -.327201 .29972 -.31496
+bezier .319072 -.303747 .334729 -.286411 .3429 -.26543
+aline .35052 -.26543
+aline .33655 -.30734
+aline .33528 -.30988
+aline .32131 -.35179
+aline .32004 -.35306
+aline .02286 -.35306
+aline .02032 -.35179
+aline .02032 -.34798
+bezier .624737E-01 -.294798 .105225 -.242048 .147003 -.188595
+bezier .104772 -.130812 .625499E-01 -.730234E-01 .02032 -.01524
+aline .02032 -.00381
+aline .02286 -.00254
+aline .32004 -.00254
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="Q" !-------------- Beginning of new char.
+dfont wid=.944448 hei=0 dep=1.00001 italic=0
+dfont next_char="Y"
+set path ! start of curve
+newpath
+! start of curve
+amove .31115 -.00254
+aline .31115 -.01651
+aline .30099 -.01651
+aline .29972 -.01778
+aline .29337 -.01905
+aline .28956 -.02032
+aline .28448 -.02286
+aline .2794 -.02794
+aline .27813 -.03048
+aline .27686 -.03429
+aline .27559 -.03556
+aline .27559 -.32004
+aline .27686 -.32131
+aline .27813 -.32512
+aline .2794 -.32766
+aline .28448 -.33274
+aline .28956 -.33528
+aline .29337 -.33655
+aline .29972 -.33782
+aline .30099 -.33909
+aline .31115 -.33909
+aline .31115 -.35306
+aline .20701 -.35306
+aline .20701 -.33909
+aline .21717 -.33909
+aline .21844 -.33782
+aline .22479 -.33655
+aline .2286 -.33528
+aline .23368 -.33274
+aline .23876 -.32766
+aline .24003 -.32512
+aline .2413 -.32131
+aline .24257 -.32004
+aline .24257 -.01778
+aline .2413 -.01651
+aline .09017 -.01651
+aline .0889 -.01778
+aline .0889 -.32004
+aline .09017 -.32131
+aline .09144 -.32512
+aline .09271 -.32766
+aline .09779 -.33274
+aline .10287 -.33528
+aline .10668 -.33655
+aline .11303 -.33782
+aline .1143 -.33909
+aline .12446 -.33909
+aline .12446 -.35306
+aline .02032 -.35306
+aline .02032 -.33909
+aline .03048 -.33909
+aline .03175 -.33782
+aline .0381 -.33655
+aline .04191 -.33528
+aline .04699 -.33274
+aline .05207 -.32766
+aline .05334 -.32512
+aline .05461 -.32131
+aline .05588 -.32004
+aline .05588 -.03556
+aline .05461 -.03429
+aline .05334 -.03048
+aline .05207 -.02794
+aline .04699 -.02286
+aline .04191 -.02032
+aline .0381 -.01905
+aline .03175 -.01778
+aline .03048 -.01651
+aline .02032 -.01651
+aline .02032 -.00254
+aline .31115 -.00254
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="R" !-------------- Beginning of new char.
+dfont wid=.472223 hei=0 dep=1.11112 italic=.194446
+dfont next_char="Z"
+set path ! start of curve
+newpath
+! start of curve
+amove .18415 -.00254
+bezier .201588 -.433652E-02 .222238 -.222577E-01 .21209 -.04064
+aline .20955 -.04318
+aline .20447 -.04572
+aline .19685 -.04572
+aline .19177 -.04318
+aline .18923 -.04064
+aline .18669 -.03556
+aline .18669 -.02794
+aline .18923 -.02286
+aline .19177 -.02032
+aline .19939 -.01651
+bezier .1872 -.841974E-02 .168923 -.428659E-02 .15875 -.01778
+aline .15748 -.02032
+aline .15621 -.02159
+bezier .148599 -.040614 .144757 -.058896 .14478 -.07874
+aline .14351 -.08001
+aline .14351 -.09271
+aline .14224 -.09398
+aline .14224 -.10922
+aline .14097 -.11049
+aline .14097 -.12827
+aline .1397 -.12954
+aline .1397 -.14605
+aline .13843 -.14732
+aline .13843 -.16256
+aline .13716 -.16383
+aline .13716 -.17653
+aline .13589 -.1778
+aline .13589 -.1905
+aline .13462 -.19177
+aline .13462 -.2032
+aline .13335 -.20447
+aline .13335 -.21463
+aline .13208 -.2159
+aline .13208 -.22606
+aline .13081 -.22733
+aline .13081 -.23622
+aline .12954 -.23749
+aline .12954 -.24765
+aline .12827 -.24892
+aline .12827 -.25781
+aline .127 -.25908
+aline .127 -.2667
+aline .12573 -.26797
+aline .12573 -.27686
+aline .12446 -.27813
+bezier .122785 -.296734 .120634 -.313823 .11684 -.33274
+bezier .109622 -.357809 .951289E-01 -.385601 .06731 -.39116
+aline .0508 -.39116
+bezier .333615E-01 -.389363 .012712 -.371442 .02286 -.35306
+aline .0254 -.35052
+aline .03048 -.34798
+aline .0381 -.34798
+aline .04318 -.35052
+aline .04572 -.35306
+aline .04826 -.35814
+aline .04826 -.36576
+aline .04572 -.37084
+aline .04318 -.37338
+aline .03556 -.37719
+bezier .476832E-01 -.385049 .643506E-01 -.388761 .0762 -.37846
+bezier .091144 -.366196 .917805E-01 -.342939 .09652 -.32639
+aline .09652 -.31496
+aline .09779 -.31369
+aline .09779 -.30099
+aline .09906 -.29972
+aline .09906 -.28448
+aline .10033 -.28321
+aline .10033 -.26543
+aline .1016 -.26416
+aline .1016 -.24765
+aline .10287 -.24638
+aline .10287 -.23114
+aline .10414 -.22987
+aline .10414 -.21717
+aline .10541 -.2159
+aline .10541 -.2032
+aline .10668 -.20193
+aline .10668 -.1905
+aline .10795 -.18923
+aline .10795 -.17907
+aline .10922 -.1778
+aline .10922 -.16764
+aline .11049 -.16637
+aline .11049 -.15748
+aline .11176 -.15621
+aline .11176 -.14605
+aline .11303 -.14478
+aline .11303 -.13589
+aline .1143 -.13462
+aline .1143 -.127
+aline .11557 -.12573
+aline .11557 -.11684
+aline .11684 -.11557
+aline .11684 -.10795
+aline .11811 -.10668
+aline .11811 -.09779
+aline .11938 -.09652
+bezier .122007 -.067302 .126544 -.318595E-01 .15113 -.01016
+aline .15367 -.00889
+aline .15494 -.00762
+aline .16002 -.00508
+aline .16383 -.00381
+aline .16891 -.00254
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="S" !-------------- Beginning of new char.
+dfont wid=.833336 hei=0 dep=1.00001 italic=0
+dfont next_char="["
+set path ! start of curve
+newpath
+! start of curve
+amove .03556 -.00254
+aline .0381 -.00381
+aline .04191 -.00762
+aline .04318 -.01016
+aline .04318 -.24257
+bezier .480384E-01 -.27207 .066433 -.301589 .09398 -.31623
+bezier .131384 -.337421 .178287 -.334193 .21209 -.30734
+bezier .233608 -.292569 .245558 -.266577 .25019 -.24257
+aline .25019 -.01016
+aline .25146 -.00762
+aline .25527 -.00381
+aline .25781 -.00254
+aline .26543 -.00254
+aline .26797 -.00381
+aline .27178 -.00762
+aline .27305 -.01016
+aline .27305 -.24511
+bezier .270427 -.266675 .261323 -.288759 .24765 -.30607
+bezier .225953 -.331442 .195299 -.350399 .16129 -.35179
+bezier .099453 -.36232 .317767E-01 -.316349 .02159 -.25273
+aline .02159 -.24638
+aline .02032 -.24511
+aline .02032 -.01016
+aline .02159 -.00762
+aline .0254 -.00381
+aline .02794 -.00254
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="T" !-------------- Beginning of new char.
+dfont wid=.833336 hei=0 dep=1.00001 italic=0
+dfont next_char="\"
+set path ! start of curve
+newpath
+! start of curve
+amove .16002 -.00254
+bezier .213142 -.737457E-02 .262857 -.488454E-01 .27178 -.10287
+aline .27178 -.10922
+aline .27305 -.11049
+aline .27305 -.34544
+aline .27178 -.34798
+aline .26797 -.35179
+aline .26543 -.35306
+aline .25781 -.35306
+aline .25527 -.35179
+aline .25146 -.34798
+aline .25019 -.34544
+aline .25019 -.11303
+bezier .245332 -.835304E-01 .226937 -.540111E-01 .19939 -.03937
+bezier .161986 -.181788E-01 .115083 -.214068E-01 .08128 -.04826
+bezier .597623E-01 -.063031 .478122E-01 -.890231E-01 .04318 -.11303
+aline .04318 -.34544
+aline .04191 -.34798
+aline .0381 -.35179
+aline .03556 -.35306
+aline .02794 -.35306
+aline .0254 -.35179
+aline .02159 -.34798
+aline .02032 -.34544
+aline .02032 -.11049
+bezier .229428E-01 -.889245E-01 .320465E-01 -.668413E-01 .04572 -.04953
+bezier .674174E-01 -.241585E-01 .980707E-01 -.520053E-02 .13208 -.00381
+aline .13335 -.00254
+aline .16002 -.00254
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="U" !-------------- Beginning of new char.
+dfont wid=.833336 hei=0 dep=1.00001 italic=0
+dfont next_char="]"
+set path ! start of curve
+newpath
+! start of curve
+amove .03556 -.00254
+aline .0381 -.00381
+aline .04191 -.00762
+aline .04318 -.01016
+aline .04318 -.24257
+bezier .480384E-01 -.27207 .066433 -.301589 .09398 -.31623
+bezier .131384 -.337421 .178287 -.334193 .21209 -.30734
+bezier .233608 -.292569 .245558 -.266577 .25019 -.24257
+aline .25019 -.01016
+aline .25146 -.00762
+aline .25527 -.00381
+aline .25781 -.00254
+aline .26543 -.00254
+aline .26797 -.00381
+aline .27178 -.00762
+aline .27305 -.01016
+aline .27305 -.24511
+bezier .270427 -.266675 .261323 -.288759 .24765 -.30607
+bezier .225953 -.331442 .195299 -.350399 .16129 -.35179
+bezier .099453 -.36232 .317767E-01 -.316349 .02159 -.25273
+aline .02159 -.24638
+aline .02032 -.24511
+aline .02032 -.01016
+aline .02159 -.00762
+aline .0254 -.00381
+aline .02794 -.00254
+closepath
+! end of curve
+
+! start of curve
+amove .15113 -.09017
+aline .15367 -.09144
+aline .15621 -.09398
+aline .15748 -.09652
+aline .15875 -.10033
+aline .15875 -.15494
+aline .16002 -.15621
+aline .21463 -.15621
+aline .21844 -.15748
+aline .22098 -.15875
+aline .22225 -.16002
+aline .22479 -.1651
+aline .22479 -.17145
+aline .22352 -.17399
+aline .21971 -.1778
+aline .21717 -.17907
+aline .16002 -.17907
+aline .15875 -.18034
+aline .15875 -.23495
+aline .15748 -.24003
+aline .1524 -.24511
+aline .14859 -.24638
+aline .14478 -.24638
+aline .14097 -.24511
+aline .13589 -.24003
+aline .13589 -.18034
+aline .13462 -.17907
+aline .0762 -.17907
+aline .07366 -.1778
+aline .06985 -.17399
+aline .06858 -.17145
+aline .06858 -.1651
+aline .07112 -.16002
+aline .07239 -.15875
+aline .07493 -.15748
+aline .07874 -.15621
+aline .13462 -.15621
+aline .13589 -.15494
+aline .13589 -.09652
+aline .13716 -.09398
+aline .1397 -.09144
+aline .14224 -.09017
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="V" !-------------- Beginning of new char.
+dfont wid=.833336 hei=0 dep=1.00001 italic=0
+dfont next_char="^"
+set path ! start of curve
+newpath
+! start of curve
+amove .14986 -.00254
+aline .15367 -.00381
+aline .15494 -.00508
+bezier .19638 -.11485 .233019 -.227228 .27305 -.33782
+aline .27305 -.34544
+aline .27178 -.34798
+aline .26797 -.35179
+aline .26543 -.35306
+aline .25781 -.35306
+aline .25527 -.35179
+aline .25146 -.34798
+bezier .216 -.249757 .183053 -.1498 .146685 -.523875E-01
+bezier .110317 -.1498 .773703E-01 -.249757 .04191 -.34798
+aline .0381 -.35179
+aline .03556 -.35306
+aline .02794 -.35306
+aline .0254 -.35179
+aline .02159 -.34798
+aline .02032 -.34544
+aline .02032 -.33782
+bezier .591661E-01 -.22831 .973132E-01 -.118511 .13589 -.00889
+aline .14097 -.00381
+aline .14351 -.00254
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="W" !-------------- Beginning of new char.
+dfont wid=.833336 hei=0 dep=1.00001 italic=0
+dfont next_char="_"
+set path ! start of curve
+newpath
+! start of curve
+amove .03556 -.00254
+aline .0381 -.00381
+aline .04191 -.00762
+bezier .773705E-01 -.105842 .110317 -.2058 .146685 -.303212
+bezier .183053 -.2058 .215999 -.105842 .25146 -.00762
+aline .25527 -.00381
+aline .25781 -.00254
+aline .26543 -.00254
+aline .26797 -.00381
+aline .27178 -.00762
+aline .27305 -.01016
+aline .27305 -.01778
+bezier .233019 -.128372 .19638 -.24075 .15494 -.35052
+aline .15367 -.35179
+aline .14986 -.35306
+aline .14351 -.35306
+aline .14097 -.35179
+aline .13589 -.34671
+bezier .973133E-01 -.237089 .591661E-01 -.12729 .02032 -.01778
+aline .02032 -.01016
+aline .02159 -.00762
+aline .0254 -.00381
+aline .02794 -.00254
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="X" !-------------- Beginning of new char.
+dfont wid=1.44445 hei=.100001 dep=1.50001 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .4445 -.00254
+bezier .460021 -.034807 .473101 -.687042E-01 .48768 -.1016
+aline .48006 -.1016
+bezier .459583 -.581153E-01 .41298 -.346533E-01 .36703 -.02667
+aline .36576 -.0254
+aline .35941 -.0254
+aline .35814 -.02413
+aline .35052 -.02413
+aline .34925 -.02286
+aline .34036 -.02286
+aline .33909 -.02159
+aline .32512 -.02159
+aline .32385 -.02032
+aline .30099 -.02032
+aline .29972 -.01905
+aline .08382 -.01905
+aline .08255 -.02032
+bezier .137492 -.953157E-01 .192252 -.170443 .24765 -.24511
+aline .24765 -.25019
+bezier .186937 -.320454 .128125 -.392089 .06731 -.46228
+aline .06858 -.46355
+aline .30353 -.46355
+aline .3048 -.46228
+aline .32766 -.46228
+aline .32893 -.46101
+bezier .366017 -.460038 .40469 -.450662 .43815 -.43053
+bezier .456365 -.418217 .471287 -.401252 .48006 -.381
+aline .48768 -.381
+bezier .473352 -.418233 .459878 -.456201 .4445 -.49276
+aline .02286 -.49276
+aline .02032 -.49149
+aline .02032 -.48768
+bezier .081271 -.414692 .144356 -.342957 .204047 -.26924
+bezier .143961 -.184801 .813591E-01 -.101711 .02032 -.01778
+aline .02032 -.00381
+aline .02286 -.00254
+aline .4445 -.00254
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="Y" !-------------- Beginning of new char.
+dfont wid=1.27778 hei=.100001 dep=1.50001 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .42926 -.00254
+aline .42926 -.02159
+bezier .410814 -.211433E-01 .390838 -.239701E-01 .37719 -.0381
+aline .37338 -.04572
+aline .37211 -.0508
+aline .37084 -.05207
+aline .37084 -.44323
+aline .37211 -.4445
+bezier .374826 -.46498 .398127 -.470638 .41402 -.47371
+aline .42926 -.47371
+aline .42926 -.49276
+aline .26035 -.49276
+aline .26035 -.47371
+bezier .278796 -.474157 .298772 -.47133 .31242 -.4572
+aline .31623 -.44958
+aline .3175 -.4445
+aline .31877 -.44323
+aline .31877 -.02286
+aline .3175 -.02159
+aline .13208 -.02159
+aline .13081 -.02286
+aline .13081 -.44323
+aline .13208 -.4445
+bezier .134796 -.46498 .158097 -.470638 .17399 -.47371
+aline .18923 -.47371
+aline .18923 -.49276
+aline .02032 -.49276
+aline .02032 -.47371
+bezier .038766 -.474157 .058742 -.47133 .07239 -.4572
+aline .0762 -.44958
+aline .07747 -.4445
+aline .07874 -.44323
+aline .07874 -.05207
+aline .07747 -.0508
+bezier .747541E-01 -.303196E-01 .514532E-01 -.246616E-01 .03556 -.02159
+aline .02032 -.02159
+aline .02032 -.00254
+aline .42926 -.00254
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="Z" !-------------- Beginning of new char.
+dfont wid=.555557 hei=0 dep=2.22225 italic=.444446
+set path ! start of curve
+newpath
+! start of curve
+amove .29972 -.00254
+bezier .319306 -.50209E-02 .339266 -.258595E-01 .32893 -.04572
+aline .32512 -.04953
+aline .32258 -.0508
+aline .31877 -.05207
+aline .31115 -.05207
+aline .30734 -.0508
+aline .3048 -.04953
+aline .30099 -.04572
+aline .29845 -.04064
+aline .29845 -.03048
+aline .30099 -.0254
+aline .3048 -.02159
+aline .30734 -.02032
+aline .31115 -.01905
+aline .31623 -.01778
+aline .31369 -.01651
+aline .31242 -.01524
+aline .3048 -.01143
+aline .29972 -.01016
+aline .29845 -.00889
+aline .29083 -.00889
+aline .28575 -.01397
+aline .28448 -.01651
+aline .28321 -.01778
+aline .2794 -.0254
+aline .27813 -.02921
+aline .27686 -.03175
+aline .27051 -.0508
+aline .26924 -.05588
+aline .26797 -.05969
+aline .25908 -.09525
+aline .25781 -.1016
+aline .25654 -.10668
+aline .25273 -.12573
+aline .25146 -.13081
+aline .24511 -.16256
+aline .24384 -.16383
+aline .24384 -.17018
+aline .24003 -.18923
+aline .23876 -.1905
+aline .23876 -.19685
+aline .23749 -.19812
+aline .23749 -.20447
+aline .23622 -.21082
+aline .23495 -.21209
+bezier .234659 -.22703 .229082 -.240623 .2286 -.25527
+aline .22733 -.25654
+aline .22733 -.26289
+aline .22606 -.26416
+bezier .224858 -.279005 .22144 -.29207 .21971 -.30734
+aline .21844 -.30861
+aline .21844 -.31496
+aline .21717 -.31623
+aline .21717 -.32258
+aline .2159 -.32893
+aline .21463 -.3302
+aline .21463 -.33655
+aline .21336 -.3429
+aline .21209 -.34417
+aline .21209 -.35052
+aline .20701 -.37592
+aline .20574 -.37719
+aline .20574 -.38354
+aline .20447 -.38989
+aline .2032 -.39497
+aline .19431 -.43942
+bezier .183628 -.490388 .172052 -.541155 .16002 -.59182
+aline .14224 -.66294
+bezier .130805 -.702405 .119511 -.745436 .08763 -.77343
+bezier .664332E-01 -.790143 .280531E-01 -.783655 .02032 -.75565
+aline .02032 -.74422
+aline .02286 -.73914
+aline .02667 -.73533
+aline .02921 -.73406
+aline .03302 -.73279
+aline .04064 -.73279
+aline .04445 -.73406
+aline .04699 -.73533
+aline .0508 -.73914
+aline .05334 -.74422
+aline .05334 -.75438
+aline .0508 -.75946
+aline .04699 -.76327
+aline .04445 -.76454
+aline .04064 -.76581
+aline .03556 -.76708
+bezier .464052E-01 -.774551 .061195 -.78058 .07239 -.77089
+bezier .099427 -.743064 .104667 -.701757 .1143 -.66548
+bezier .122341 -.626825 .130243 -.589861 .13589 -.55245
+aline .13716 -.55118
+aline .13716 -.54483
+aline .13843 -.54356
+aline .13843 -.53721
+aline .1397 -.53594
+aline .1397 -.52959
+aline .14097 -.52832
+aline .14097 -.52197
+aline .14224 -.5207
+bezier .143442 -.505855 .14686 -.49279 .14859 -.47752
+aline .14986 -.47625
+aline .14986 -.4699
+aline .15113 -.46863
+aline .15113 -.46228
+aline .1524 -.45593
+aline .15367 -.45466
+aline .15367 -.44831
+aline .15494 -.44196
+aline .15621 -.44069
+aline .15621 -.43434
+aline .16129 -.40894
+aline .16256 -.40767
+aline .16256 -.40132
+aline .16383 -.39497
+aline .1651 -.38989
+aline .17399 -.34544
+bezier .184672 -.294472 .196248 -.243705 .20828 -.19304
+aline .22733 -.11684
+aline .2286 -.11303
+aline .23114 -.10287
+aline .23241 -.09906
+aline .23368 -.09398
+aline .24511 -.05969
+bezier .254408 -.380447E-01 .263711 -.120501E-01 .28702 -.00254
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="[" !-------------- Beginning of new char.
+dfont wid=1.11111 hei=.100001 dep=1.50001 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .0381 -.00254
+aline .04064 -.00381
+aline .04318 -.00508
+aline .04572 -.00762
+aline .04826 -.0127
+aline .04826 -.33655
+bezier .522095E-01 -.362459 .622264E-01 -.390723 .08001 -.41148
+bezier .10149 -.436478 .130173 -.454006 .16256 -.46101
+aline .16383 -.46228
+aline .17018 -.46228
+aline .17145 -.46355
+aline .18034 -.46355
+aline .18161 -.46482
+bezier .220062 -.467419 .258444 -.455441 .28956 -.4318
+bezier .314557 -.409889 .333976 -.381487 .33909 -.34798
+aline .34036 -.34671
+aline .34036 -.33782
+aline .34163 -.33655
+aline .34163 -.0127
+aline .34417 -.00762
+aline .34671 -.00508
+aline .35179 -.00254
+aline .35941 -.00254
+aline .36449 -.00508
+aline .36703 -.00762
+aline .36957 -.0127
+aline .36957 -.33909
+aline .3683 -.34036
+bezier .367792 -.37302 .351669 -.403941 .33274 -.42926
+aline .31115 -.45085
+bezier .28342 -.473139 .248054 -.490602 .21209 -.49149
+aline .21082 -.49276
+aline .17907 -.49276
+bezier .163854 -.489921 .146119 -.488555 .13081 -.48133
+bezier .111646 -.474249 .944905E-01 -.463302 .07874 -.45085
+aline .05715 -.42926
+bezier .370618E-01 -.403829 .231467E-01 -.371175 .02032 -.33909
+aline .02032 -.0127
+aline .02286 -.00762
+aline .0254 -.00508
+aline .02794 -.00381
+aline .03048 -.00254
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="\" !-------------- Beginning of new char.
+dfont wid=1.11111 hei=.100001 dep=1.50001 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .21082 -.00254
+bezier .226036 -.537887E-02 .243771 -.674519E-02 .25908 -.01397
+bezier .278244 -.210505E-01 .2954 -.319981E-01 .31115 -.04445
+aline .33274 -.06604
+bezier .352828 -.914708E-01 .366743 -.124125 .36957 -.15621
+aline .36957 -.4826
+aline .36703 -.48768
+aline .36449 -.49022
+aline .35941 -.49276
+aline .35179 -.49276
+aline .34671 -.49022
+aline .34417 -.48768
+aline .34163 -.4826
+aline .34163 -.15875
+bezier .33768 -.132841 .327664 -.104577 .30988 -.08382
+bezier .2884 -.588224E-01 .259717 -.412944E-01 .22733 -.03429
+aline .22606 -.03302
+aline .21971 -.03302
+aline .21844 -.03175
+aline .20955 -.03175
+aline .20828 -.03048
+bezier .169828 -.278812E-01 .131446 -.398589E-01 .10033 -.0635
+bezier .075333 -.854105E-01 .559145E-01 -.113813 .0508 -.14732
+aline .04953 -.14859
+aline .04953 -.15748
+aline .04826 -.15875
+aline .04826 -.4826
+aline .04572 -.48768
+aline .04318 -.49022
+aline .0381 -.49276
+aline .03048 -.49276
+aline .0254 -.49022
+aline .02286 -.48768
+aline .02032 -.4826
+aline .02032 -.15621
+aline .02159 -.15494
+bezier .220979E-01 -.12228 .382209E-01 -.913587E-01 .05715 -.06604
+aline .07874 -.04445
+bezier .10647 -.022161 .141836 -.469761E-02 .1778 -.00381
+aline .17907 -.00254
+aline .21082 -.00254
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="]" !-------------- Beginning of new char.
+dfont wid=1.11111 hei=.100001 dep=1.50001 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .0381 -.00254
+aline .04064 -.00381
+aline .04318 -.00508
+aline .04572 -.00762
+aline .04826 -.0127
+aline .04826 -.33655
+bezier .522095E-01 -.362459 .622264E-01 -.390723 .08001 -.41148
+bezier .10149 -.436478 .130173 -.454006 .16256 -.46101
+aline .16383 -.46228
+aline .17018 -.46228
+aline .17145 -.46355
+aline .18034 -.46355
+aline .18161 -.46482
+bezier .220062 -.467419 .258444 -.455441 .28956 -.4318
+bezier .314557 -.409889 .333976 -.381487 .33909 -.34798
+aline .34036 -.34671
+aline .34036 -.33782
+aline .34163 -.33655
+aline .34163 -.0127
+aline .34417 -.00762
+aline .34671 -.00508
+aline .35179 -.00254
+aline .35941 -.00254
+aline .36449 -.00508
+aline .36703 -.00762
+aline .36957 -.0127
+aline .36957 -.33909
+aline .3683 -.34036
+bezier .367792 -.37302 .351669 -.403941 .33274 -.42926
+aline .31115 -.45085
+bezier .28342 -.473139 .248054 -.490602 .21209 -.49149
+aline .21082 -.49276
+aline .17907 -.49276
+bezier .163854 -.489921 .146119 -.488555 .13081 -.48133
+bezier .111646 -.474249 .944905E-01 -.463302 .07874 -.45085
+aline .05715 -.42926
+bezier .370618E-01 -.403829 .231467E-01 -.371175 .02032 -.33909
+aline .02032 -.0127
+aline .02286 -.00762
+aline .0254 -.00508
+aline .02794 -.00381
+aline .03048 -.00254
+closepath
+! end of curve
+
+! start of curve
+amove .19939 -.11811
+aline .20193 -.11938
+aline .20447 -.12065
+aline .20574 -.12192
+aline .20828 -.127
+aline .20955 -.13081
+aline .20955 -.21844
+aline .21082 -.21971
+aline .30099 -.21971
+aline .30607 -.22225
+aline .30861 -.22479
+aline .31115 -.22987
+aline .31115 -.23749
+aline .30861 -.24257
+aline .30607 -.24511
+aline .30099 -.24765
+aline .21082 -.24765
+aline .20955 -.24892
+aline .20955 -.33655
+bezier .209348 -.351404 .186861 -.355534 .18161 -.34163
+aline .18161 -.24892
+aline .18034 -.24765
+aline .0889 -.24765
+aline .08382 -.24511
+aline .08128 -.24257
+aline .07874 -.23749
+aline .07874 -.22987
+aline .08128 -.22479
+aline .08382 -.22225
+aline .0889 -.21971
+aline .18034 -.21971
+aline .18161 -.21844
+aline .18161 -.127
+aline .18415 -.12192
+aline .18542 -.12065
+aline .18796 -.11938
+aline .1905 -.11811
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="^" !-------------- Beginning of new char.
+dfont wid=1.11111 hei=.100001 dep=1.50001 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .19939 -.00254
+aline .20193 -.00381
+aline .20701 -.00889
+aline .20955 -.01397
+aline .21844 -.04064
+aline .21971 -.04318
+aline .2286 -.06985
+aline .22987 -.07239
+aline .23876 -.09906
+aline .24003 -.1016
+aline .25019 -.13208
+bezier .267956 -.18144 .284494 -.23131 .30226 -.28067
+aline .31242 -.31115
+bezier .3318 -.365623 .350513 -.420373 .36957 -.47498
+aline .36957 -.4826
+aline .36703 -.48768
+aline .36449 -.49022
+aline .35941 -.49276
+aline .35179 -.49276
+aline .34671 -.49022
+aline .34417 -.48768
+bezier .322927 -.431934 .304921 -.374848 .28448 -.31877
+aline .27432 -.28829
+bezier .256554 -.23893 .240016 -.18906 .22225 -.1397
+aline .21209 -.10922
+aline .21082 -.10668
+aline .20193 -.08001
+aline .20066 -.07747
+aline .195834 -.062992
+aline .194945 -.625475E-01
+aline .194056 -.062992
+aline .18923 -.07747
+aline .18796 -.08001
+aline .17907 -.10668
+aline .1778 -.10922
+aline .16764 -.1397
+bezier .149874 -.18906 .133336 -.23893 .11557 -.28829
+aline .10541 -.31877
+bezier .849689E-01 -.374848 .669625E-01 -.431934 .04572 -.48768
+aline .04318 -.49022
+aline .0381 -.49276
+aline .03048 -.49276
+aline .0254 -.49022
+aline .02286 -.48768
+aline .02032 -.4826
+aline .02032 -.47498
+bezier .393772E-01 -.420373 .580895E-01 -.365623 .07747 -.31115
+aline .08763 -.28067
+bezier .105396 -.23131 .121934 -.18144 .1397 -.13208
+aline .14986 -.1016
+aline .15113 -.09906
+aline .16002 -.07239
+aline .16129 -.06985
+aline .17018 -.04318
+aline .17145 -.04064
+aline .18034 -.01397
+aline .18288 -.00889
+aline .18669 -.00508
+aline .18923 -.00381
+aline .19177 -.00254
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="_" !-------------- Beginning of new char.
+dfont wid=1.11111 hei=.100001 dep=1.50001 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .0381 -.00254
+aline .04064 -.00381
+aline .04318 -.00508
+aline .04572 -.00762
+bezier .669625E-01 -.633659E-01 .849689E-01 -.120452 .10541 -.17653
+aline .11557 -.20701
+bezier .133336 -.25637 .149874 -.30624 .16764 -.3556
+aline .1778 -.38608
+aline .17907 -.38862
+aline .18796 -.41529
+aline .18923 -.41783
+aline .194056 -.432308
+aline .194945 -.432752
+aline .195834 -.432308
+aline .20066 -.41783
+aline .20193 -.41529
+aline .21082 -.38862
+aline .21209 -.38608
+aline .22225 -.3556
+bezier .240016 -.30624 .256554 -.25637 .27432 -.20701
+aline .28448 -.17653
+bezier .304921 -.120452 .322928 -.633659E-01 .34417 -.00762
+aline .34671 -.00508
+aline .35179 -.00254
+aline .35941 -.00254
+aline .36449 -.00508
+aline .36703 -.00762
+aline .36957 -.0127
+aline .36957 -.02032
+bezier .350513 -.074927 .3318 -.129677 .31242 -.18415
+aline .30226 -.21463
+bezier .284494 -.26399 .267956 -.313859 .25019 -.36322
+aline .24003 -.3937
+aline .23876 -.39624
+aline .22987 -.42291
+aline .2286 -.42545
+aline .21971 -.45212
+aline .21844 -.45466
+aline .20955 -.48133
+aline .20701 -.48641
+aline .20193 -.49149
+aline .19939 -.49276
+aline .19177 -.49276
+aline .18669 -.49022
+aline .18288 -.48641
+aline .18034 -.48133
+aline .17145 -.45466
+aline .17018 -.45212
+aline .16129 -.42545
+aline .16002 -.42291
+aline .15113 -.39624
+aline .14986 -.3937
+aline .1397 -.36322
+bezier .121934 -.31386 .105396 -.26399 .08763 -.21463
+aline .07747 -.18415
+bezier .580896E-01 -.129677 .393771E-01 -.074927 .02032 -.02032
+aline .02032 -.0127
+aline .02286 -.00762
+aline .0254 -.00508
+aline .02794 -.00381
+aline .03048 -.00254
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="`" !-------------- Beginning of new char.
+dfont wid=.944448 hei=0 dep=1.00001 italic=0
+dfont next_char="a"
+set path ! start of curve
+newpath
+! start of curve
+amove .12446 -.00254
+aline .12446 -.01651
+aline .1143 -.01651
+aline .11303 -.01778
+aline .10668 -.01905
+aline .10287 -.02032
+aline .09779 -.02286
+aline .09271 -.02794
+aline .09144 -.03048
+aline .09017 -.03429
+aline .0889 -.03556
+aline .0889 -.33782
+aline .09017 -.33909
+aline .2413 -.33909
+aline .24257 -.33782
+aline .24257 -.03556
+aline .2413 -.03429
+aline .24003 -.03048
+aline .23876 -.02794
+aline .23368 -.02286
+aline .2286 -.02032
+aline .22479 -.01905
+aline .21844 -.01778
+aline .21717 -.01651
+aline .20701 -.01651
+aline .20701 -.00254
+aline .31115 -.00254
+aline .31115 -.01651
+aline .30099 -.01651
+aline .29972 -.01778
+aline .29337 -.01905
+aline .28956 -.02032
+aline .28448 -.02286
+aline .2794 -.02794
+aline .27813 -.03048
+aline .27686 -.03429
+aline .27559 -.03556
+aline .27559 -.32004
+aline .27686 -.32131
+aline .27813 -.32512
+aline .2794 -.32766
+aline .28448 -.33274
+aline .28956 -.33528
+aline .29337 -.33655
+aline .29972 -.33782
+aline .30099 -.33909
+aline .31115 -.33909
+aline .31115 -.35306
+aline .02032 -.35306
+aline .02032 -.33909
+aline .03048 -.33909
+aline .03175 -.33782
+aline .0381 -.33655
+aline .04191 -.33528
+aline .04699 -.33274
+aline .05207 -.32766
+aline .05334 -.32512
+aline .05461 -.32131
+aline .05588 -.32004
+aline .05588 -.03556
+aline .05461 -.03429
+aline .05334 -.03048
+aline .05207 -.02794
+aline .04699 -.02286
+aline .04191 -.02032
+aline .0381 -.01905
+aline .03175 -.01778
+aline .03048 -.01651
+aline .02032 -.01651
+aline .02032 -.00254
+aline .12446 -.00254
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="a" !-------------- Beginning of new char.
+dfont wid=1.27778 hei=.100001 dep=1.50001 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .14351 -.00254
+aline .14351 -.02159
+bezier .12785 -.209458E-01 .110341 -.308322E-01 .10922 -.04826
+aline .10795 -.04953
+aline .10795 -.47244
+aline .10922 -.47371
+aline .34036 -.47371
+aline .34163 -.47244
+aline .34163 -.04953
+aline .34036 -.04826
+bezier .339239 -.308322E-01 .32173 -.209458E-01 .30607 -.02159
+aline .30607 -.00254
+aline .42926 -.00254
+aline .42926 -.02159
+bezier .413599 -.209458E-01 .396091 -.308322E-01 .39497 -.04826
+aline .3937 -.04953
+aline .3937 -.44577
+aline .39497 -.44704
+bezier .396091 -.464468 .4136 -.474354 .42926 -.47371
+aline .42926 -.49276
+aline .02032 -.49276
+aline .02032 -.47371
+bezier .359805E-01 -.474354 .534888E-01 -.464468 .05461 -.44704
+aline .05588 -.44577
+aline .05588 -.04953
+aline .05461 -.04826
+bezier .534888E-01 -.308322E-01 .359805E-01 -.209458E-01 .02032 -.02159
+aline .02032 -.00254
+aline .14351 -.00254
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="b" !-------------- Beginning of new char.
+dfont wid=.555557 hei=.722223 dep=0 italic=0
+dfont next_char="c"
+set path ! start of curve
+newpath
+! start of curve
+amove .10033 .25781
+bezier .132646 .239805 .164463 .221108 .19685 .2032
+aline .19431 .19812
+aline .19304 .19685
+bezier .161168 .208529 .13054 .225321 .09906 .23876
+aline .09779 .24003
+bezier .675255E-01 .224784 .359422E-01 .211228 .00508 .19685
+aline .00254 .19685
+aline .00127 .19812
+aline -.00127 .2032
+bezier .319931E-01 .221489 .644478E-01 .2409 .09779 .25908
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="c" !-------------- Beginning of new char.
+dfont wid=1 hei=.75 dep=0 italic=0
+dfont next_char="d"
+set path ! start of curve
+newpath
+! start of curve
+amove .17653 .26924
+aline .18034 .26797
+aline .20701 .25908
+aline .20955 .25781
+aline .23622 .24892
+aline .23876 .24765
+aline .26924 .23749
+aline .27178 .23622
+aline .30226 .22606
+aline .3048 .22479
+aline .33147 .2159
+aline .33401 .21463
+aline .34925 .20955
+aline .35179 .20828
+aline .35179 .20701
+aline .35052 .2032
+aline .34925 .20066
+bezier .291419 .216867 .233424 .232825 .175895 .249873
+bezier .118366 .232825 .603711E-01 .216867 .00254 .20066
+aline .00127 .2032
+aline 0 .20701
+aline 0 .20828
+aline .00254 .20955
+aline .01778 .21463
+aline .02032 .2159
+aline .04699 .22479
+aline .04953 .22606
+aline .08001 .23622
+aline .08255 .23749
+aline .11303 .24765
+aline .11557 .24892
+aline .14224 .25781
+aline .14478 .25908
+aline .17145 .26797
+aline .17526 .26924
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="d" !-------------- Beginning of new char.
+dfont wid=1.44445 hei=.75 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .25654 .26924
+aline .26162 .26797
+aline .28194 .26289
+aline .28829 .26162
+aline .31369 .25527
+aline .32004 .254
+aline .35052 .24638
+aline .35687 .24511
+aline .38227 .23876
+aline .38862 .23749
+aline .41402 .23114
+aline .42037 .22987
+aline .44577 .22352
+aline .45212 .22225
+aline .4826 .21463
+aline .48895 .21336
+aline .50419 .20955
+aline .508 .20828
+aline .50673 .20193
+aline .50546 .20066
+aline .50419 .20066
+aline .49149 .2032
+aline .49022 .20447
+aline .48387 .20447
+aline .43942 .21336
+aline .43815 .21463
+aline .4318 .21463
+aline .38735 .22352
+aline .38608 .22479
+aline .37973 .22479
+aline .33528 .23368
+aline .33401 .23495
+aline .32766 .23495
+aline .28321 .24384
+aline .28194 .24511
+aline .27559 .24511
+aline .25654 .24892
+aline .254 .249767
+aline .25146 .24892
+aline .23241 .24511
+aline .22606 .24511
+aline .22479 .24384
+aline .18034 .23495
+aline .17399 .23495
+aline .17272 .23368
+aline .12827 .22479
+aline .12192 .22479
+aline .12065 .22352
+aline .0762 .21463
+aline .06985 .21463
+aline .06858 .21336
+aline .02413 .20447
+aline .01778 .20447
+aline .01651 .2032
+aline .00381 .20066
+aline .00254 .20066
+aline .00127 .20193
+aline 0 .20828
+aline .00381 .20955
+aline .01905 .21336
+aline .0254 .21463
+aline .05588 .22225
+aline .06223 .22352
+aline .08763 .22987
+aline .09398 .23114
+aline .11938 .23749
+aline .12573 .23876
+aline .15113 .24511
+aline .15748 .24638
+aline .18796 .254
+aline .19431 .25527
+aline .21971 .26162
+aline .22606 .26289
+aline .24638 .26797
+aline .25146 .26924
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="e" !-------------- Beginning of new char.
+dfont wid=.555557 hei=.722223 dep=0 italic=0
+dfont next_char="f"
+set path ! start of curve
+newpath
+! start of curve
+amove .07239 .25146
+bezier .981741E-01 .246366 .116939 .221186 .14478 .22606
+bezier .160354 .231324 .175654 .239057 .18796 .25019
+aline .1905 .25146
+aline .19177 .24892
+aline .19431 .24638
+bezier .172074 .226873 .142284 .202245 .11049 .2159
+bezier .913637E-01 .225446 .735719E-01 .24113 .0508 .23749
+bezier .035226 .232226 .199264E-01 .224493 .00762 .21336
+aline .00508 .21209
+aline .00381 .21463
+aline .00127 .21717
+bezier .181195E-01 .231696 .358379E-01 .246656 .05842 .25146
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="f" !-------------- Beginning of new char.
+dfont wid=1 hei=.75 dep=0 italic=0
+dfont next_char="g"
+set path ! start of curve
+newpath
+! start of curve
+amove .13081 .26162
+aline .13208 .26035
+bezier .16428 .259651 .190699 .237019 .22225 .23241
+aline .22352 .23114
+aline .23495 .23114
+aline .23622 .22987
+bezier .274574 .229471 .312528 .245416 .34798 .26162
+aline .35052 .25654
+aline .35052 .25527
+bezier .297829 .228146 .234489 .202003 .1778 .23114
+bezier .158085 .238712 .137988 .249124 .11684 .24892
+aline .11557 .25019
+bezier .772164E-01 .250589 .039262 .234645 .00381 .21844
+aline .00127 .22352
+aline .00127 .22479
+bezier .416726E-01 .244947 .085064 .264901 .13081 .26162
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="g" !-------------- Beginning of new char.
+dfont wid=1.44445 hei=.75 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .18923 .26162
+aline .1905 .26035
+bezier .239727 .259865 .286381 .229367 .33528 .22987
+aline .33655 .2286
+aline .35814 .2286
+aline .35941 .22987
+aline .37592 .22987
+aline .37719 .23114
+aline .38608 .23114
+aline .38735 .23241
+bezier .425768 .23677 .465802 .249405 .50419 .26162
+aline .50546 .26035
+aline .50673 .25654
+aline .50673 .25527
+aline .50419 .254
+aline .47371 .24384
+bezier .434744 .232319 .394732 .220848 .3556 .21971
+aline .35433 .21844
+aline .31877 .21844
+aline .3175 .21971
+bezier .268273 .220195 .221619 .250693 .17272 .25019
+aline .17145 .25146
+aline .14986 .25146
+aline .14859 .25019
+aline .13208 .25019
+aline .13081 .24892
+aline .12192 .24892
+aline .12065 .24765
+bezier .822316E-01 .24329 .421976E-01 .230655 .00381 .21844
+aline .00254 .21971
+aline .00127 .22352
+aline .00127 .22479
+aline .00381 .22606
+aline .03429 .23622
+bezier .073256 .247741 .113268 .259212 .1524 .26035
+aline .15367 .26162
+aline .18923 .26162
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="h" !-------------- Beginning of new char.
+dfont wid=.472224 hei=.039999 dep=1.76002 italic=0
+dfont next_char=20
+set path ! start of curve
+newpath
+! start of curve
+amove .15875 .01143
+aline .15875 -.00508
+aline .09779 -.00508
+aline .09652 -.00635
+aline .09652 -.60071
+aline .09779 -.60198
+aline .15875 -.60198
+aline .15875 -.61849
+aline .08001 -.61849
+aline .08001 .01143
+aline .15875 .01143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="i" !-------------- Beginning of new char.
+dfont wid=.472224 hei=.039999 dep=1.76002 italic=0
+dfont next_char=21
+set path ! start of curve
+newpath
+! start of curve
+amove .08636 .01143
+aline .08636 -.61849
+aline .00762 -.61849
+aline .00762 -.60198
+aline .06858 -.60198
+aline .06985 -.60071
+aline .06985 -.00635
+aline .06858 -.00508
+aline .00762 -.00508
+aline .00762 .01143
+aline .08636 .01143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="j" !-------------- Beginning of new char.
+dfont wid=.527781 hei=.039999 dep=1.76002 italic=0
+dfont next_char=22
+set path ! start of curve
+newpath
+! start of curve
+amove .09652 .01143
+aline .09652 -.60071
+aline .09779 -.60198
+aline .1778 -.60198
+aline .1778 -.61849
+aline .08001 -.61849
+aline .08001 .01143
+aline .09652 .01143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="k" !-------------- Beginning of new char.
+dfont wid=.527781 hei=.039999 dep=1.76002 italic=0
+dfont next_char=23
+set path ! start of curve
+newpath
+! start of curve
+amove .10541 .01143
+aline .10541 -.61849
+aline .00762 -.61849
+aline .00762 -.60198
+aline .08763 -.60198
+aline .0889 -.60071
+aline .0889 .01143
+aline .10541 .01143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="l" !-------------- Beginning of new char.
+dfont wid=.527781 hei=.039999 dep=1.76002 italic=0
+dfont next_char=24
+set path ! start of curve
+newpath
+! start of curve
+amove .1778 .01143
+aline .1778 -.00508
+aline .09779 -.00508
+aline .09652 -.00635
+aline .09652 -.61849
+aline .08001 -.61849
+aline .08001 .01143
+aline .1778 .01143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="m" !-------------- Beginning of new char.
+dfont wid=.527781 hei=.039999 dep=1.76002 italic=0
+dfont next_char=25
+set path ! start of curve
+newpath
+! start of curve
+amove .10541 .01143
+aline .10541 -.61849
+aline .0889 -.61849
+aline .0889 -.00635
+aline .08763 -.00508
+aline .00762 -.00508
+aline .00762 .01143
+aline .10541 .01143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="n" !-------------- Beginning of new char.
+dfont wid=.666669 hei=.039999 dep=1.76002 italic=0
+dfont next_char=26
+set path ! start of curve
+newpath
+! start of curve
+amove .1905 .01143
+aline .19177 .01016
+aline .19177 -.00127
+bezier .165642 -.125172E-01 .135868 -.285902E-01 .13081 -.05969
+aline .12954 -.06096
+aline .12954 -.23114
+bezier .123774 -.266767 .926722E-01 -.290934 .06096 -.30353
+bezier .926722E-01 -.316126 .123774 -.340293 .12954 -.37592
+aline .12954 -.5461
+bezier .134678 -.567001 .149377 -.585011 .16891 -.59436
+aline .17018 -.59563
+aline .1778 -.59944
+aline .18161 -.60071
+aline .18415 -.60198
+aline .18796 -.60325
+aline .1905 -.60452
+aline .19177 -.60579
+aline .19177 -.61722
+aline .1905 -.61849
+bezier .168902 -.619814 .150239 -.605568 .13335 -.59436
+aline .11811 -.57912
+aline .11684 -.57658
+aline .1143 -.57404
+aline .10795 -.56134
+aline .10541 -.55372
+aline .10414 -.54737
+aline .10414 -.37719
+aline .10287 -.37592
+bezier .986504E-01 -.344613 .718324E-01 -.32257 .04445 -.31115
+aline .04191 -.30861
+aline .04191 -.29845
+bezier .669456E-01 -.285187 .950131E-01 -.267737 .1016 -.23749
+aline .10287 -.23114
+aline .10414 -.22987
+aline .10414 -.05969
+bezier .110792 -.225651E-01 .145809 .131119E-03 .17907 .01143
+aline .1905 .01143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="o" !-------------- Beginning of new char.
+dfont wid=.666669 hei=.039999 dep=1.76002 italic=0
+dfont next_char=27
+set path ! start of curve
+newpath
+! start of curve
+amove .05461 .01143
+bezier .878714E-01 .131294E-03 .122888 -.225652E-01 .12954 -.05969
+aline .12954 -.22987
+aline .13081 -.23114
+bezier .135178 -.263579 .163478 -.285545 .19177 -.29718
+aline .19177 -.30988
+bezier .163478 -.321515 .135178 -.343481 .13081 -.37592
+aline .12954 -.37719
+aline .12954 -.54737
+bezier .122889 -.584495 .878715E-01 -.607191 .05461 -.61849
+aline .04318 -.61849
+aline .04191 -.61722
+aline .04191 -.60579
+bezier .680377E-01 -.594543 .978124E-01 -.57847 .10287 -.54737
+aline .10414 -.5461
+aline .10414 -.37592
+bezier .109906 -.340293 .141008 -.316126 .17272 -.30353
+bezier .141008 -.290934 .109906 -.266767 .10414 -.23114
+aline .10414 -.06096
+bezier .990024E-01 -.400586E-01 .084303 -.220493E-01 .06477 -.0127
+aline .0635 -.01143
+aline .05588 -.00762
+aline .05207 -.00635
+aline .04953 -.00508
+aline .04572 -.00381
+aline .04318 -.00254
+aline .04191 -.00127
+aline .04191 .01016
+aline .04318 .01143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="p" !-------------- Beginning of new char.
+dfont wid=1 hei=.039999 dep=1.16001 italic=0
+dfont next_char="q"
+set path ! start of curve
+newpath
+! start of curve
+amove .3556 .0127
+aline .35941 .00889
+aline .35941 .00254
+aline .34544 -.0254
+aline .34417 -.02921
+aline .3302 -.05715
+aline .32893 -.06096
+aline .31496 -.0889
+aline .31369 -.09271
+aline .29972 -.12065
+aline .29845 -.12446
+aline .28448 -.1524
+aline .28321 -.15621
+aline .26924 -.18415
+aline .26797 -.18796
+aline .25527 -.21336
+aline .254 -.21717
+aline .24003 -.24511
+aline .23876 -.24892
+aline .22479 -.27686
+aline .22352 -.28067
+aline .20955 -.30861
+aline .20828 -.31242
+aline .19431 -.34036
+aline .19304 -.34417
+aline .17907 -.37211
+aline .1778 -.37592
+aline .1651 -.40132
+aline .16383 -.40513
+aline .16002 -.40894
+aline .14986 -.40894
+bezier .121915 -.347628 .969334E-01 -.283777 .069215 -.222567
+bezier .608265E-01 -.227616 .535604E-01 -.234221 .04572 -.24003
+aline .04064 -.23495
+bezier .566868E-01 -.223629 .716597E-01 -.210817 .08763 -.19939
+bezier .113996 -.256525 .137612 -.315419 .16256 -.37338
+aline .16383 -.37084
+aline .1651 -.36703
+aline .17907 -.33909
+aline .18034 -.33528
+aline .19431 -.30734
+aline .19558 -.30353
+aline .20955 -.27559
+aline .21082 -.27178
+aline .22479 -.24384
+aline .22606 -.24003
+aline .24003 -.21209
+aline .2413 -.20828
+aline .254 -.18288
+aline .25527 -.17907
+aline .26924 -.15113
+aline .27051 -.14732
+aline .28448 -.11938
+aline .28575 -.11557
+aline .29972 -.08763
+aline .30099 -.08382
+aline .31496 -.05588
+aline .31623 -.05207
+aline .3302 -.02413
+aline .33147 -.02032
+aline .34671 .01016
+aline .34798 .01143
+aline .35052 .0127
+aline .3556 .0127
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="q" !-------------- Beginning of new char.
+dfont wid=1 hei=.039999 dep=1.76002 italic=0
+dfont next_char="r"
+set path ! start of curve
+newpath
+! start of curve
+amove .3556 .0127
+aline .35941 .00889
+aline .35941 .00254
+bezier .293982 -.203555 .228753 -.409708 .16383 -.61595
+aline .16002 -.61976
+aline .14986 -.61976
+bezier .121484 -.52626 .096597 -.431424 .06858 -.33782
+aline .06477 -.34163
+aline .0635 -.34417
+aline .05715 -.35052
+aline .05588 -.35306
+aline .04953 -.35941
+aline .04826 -.36195
+aline .04572 -.36449
+aline .04064 -.35941
+bezier .569221E-01 -.341653 .071848 -.322918 .08763 -.3048
+bezier .114648 -.391001 .136642 -.480269 .16383 -.56642
+bezier .224735 -.374226 .284541 -.18159 .34671 .01016
+aline .34798 .01143
+aline .35052 .0127
+aline .3556 .0127
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="r" !-------------- Beginning of new char.
+dfont wid=1 hei=.039999 dep=2.36003 italic=0
+dfont next_char="s"
+set path ! start of curve
+newpath
+! start of curve
+amove .3556 .0127
+aline .35941 .00889
+bezier .352726 -.350906E-01 .339191 -.781982E-01 .3302 -.12192
+bezier .274517 -.356819 .219399 -.591845 .16383 -.82677
+aline .16002 -.83058
+aline .14986 -.83058
+bezier .121554 -.705291 .960622E-01 -.579005 .06858 -.45339
+bezier .06004 -.464683 .536973E-01 -.479214 .04445 -.48895
+aline .04064 -.48514
+bezier .553777E-01 -.460046 .724324E-01 -.435431 .08763 -.41021
+bezier .114632 -.526515 .137099 -.644257 .16383 -.76073
+bezier .225199 -.503893 .283901 -.24618 .34671 .01016
+aline .34798 .01143
+aline .35052 .0127
+aline .3556 .0127
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="s" !-------------- Beginning of new char.
+dfont wid=1 hei=.039999 dep=2.96003 italic=0
+dfont next_char="t"
+set path ! start of curve
+newpath
+! start of curve
+amove .3556 .0127
+aline .35941 .00889
+aline .35941 .00127
+bezier .353676 -.255267E-01 .349466 -.515193E-01 .34417 -.07874
+aline .3429 -.08001
+aline .3429 -.08636
+bezier .337673 -.111071 .333528 -.135049 .32893 -.16002
+aline .32766 -.16129
+aline .32766 -.16764
+bezier .322102 -.194327 .317484 -.22066 .31242 -.24765
+aline .31115 -.24892
+aline .31115 -.25527
+bezier .305923 -.279981 .301778 -.303959 .29718 -.32893
+aline .29591 -.3302
+aline .29591 -.33655
+bezier .290418 -.363363 .285539 -.389587 .28067 -.41656
+aline .2794 -.41783
+aline .2794 -.42418
+bezier .274173 -.448891 .270028 -.472869 .26543 -.49784
+aline .26416 -.49911
+aline .26416 -.50546
+bezier .258456 -.532512 .253868 -.558348 .24892 -.58547
+aline .24765 -.58674
+aline .24765 -.59309
+bezier .241916 -.619887 .237706 -.645879 .23241 -.6731
+aline .23114 -.67437
+aline .23114 -.68072
+bezier .225913 -.705431 .221768 -.729409 .21717 -.75438
+aline .2159 -.75565
+aline .2159 -.762
+bezier .210342 -.788687 .205724 -.81502 .20066 -.84201
+aline .19939 -.84328
+aline .19939 -.84963
+bezier .194163 -.874341 .190018 -.898319 .18542 -.92329
+aline .18415 -.92456
+aline .18415 -.93091
+bezier .178658 -.957723 .173779 -.983947 .16891 -1.01092
+aline .16764 -1.01219
+aline .16764 -1.01854
+aline .16383 -1.03759
+aline .16002 -1.0414
+aline .14986 -1.0414
+aline .14859 -1.03759
+aline .14859 -1.03124
+aline .14732 -1.02997
+aline .14732 -1.02362
+aline .14605 -1.02235
+bezier .14432 -1.00708 .140902 -.994015 .1397 -.97917
+aline .13843 -.9779
+aline .13843 -.97155
+aline .13716 -.97028
+bezier .13543 -.95501 .132012 -.941945 .13081 -.9271
+aline .12954 -.92583
+aline .12954 -.91948
+aline .12827 -.91821
+bezier .12654 -.90294 .123122 -.889875 .12192 -.87503
+aline .12065 -.87376
+aline .12065 -.86741
+aline .11938 -.86614
+bezier .11765 -.85087 .114232 -.837805 .11303 -.82296
+aline .11176 -.82169
+bezier .11003 -.80642 .106612 -.793355 .10541 -.77851
+aline .10414 -.77724
+aline .10414 -.77089
+aline .10287 -.76962
+bezier .10114 -.75435 .977224E-01 -.741285 .09652 -.72644
+aline .09525 -.72517
+aline .09525 -.71882
+aline .09398 -.71755
+bezier .922501E-01 -.70228 .888324E-01 -.689215 .08763 -.67437
+aline .08636 -.6731
+aline .08636 -.66675
+aline .08509 -.66548
+bezier .833601E-01 -.65021 .799424E-01 -.637145 .07874 -.6223
+aline .07747 -.62103
+bezier .757401E-01 -.60576 .723224E-01 -.592695 .07112 -.57785
+aline .06985 -.57658
+aline .06985 -.57023
+aline .06858 -.56896
+aline .06477 -.57658
+aline .0635 -.57785
+aline .04572 -.61341
+aline .04445 -.61341
+aline .04064 -.6096
+aline .04064 -.60833
+aline .04699 -.59563
+aline .04826 -.59436
+aline .08763 -.51562
+aline .0889 -.51816
+aline .0889 -.52451
+aline .09017 -.52578
+aline .09017 -.53213
+aline .09144 -.5334
+aline .09144 -.53975
+aline .09271 -.54102
+bezier .931916E-01 -.555667 .098769 -.56926 .09906 -.5842
+aline .10033 -.58547
+aline .10033 -.59182
+aline .1016 -.59309
+bezier .102082 -.607737 .107659 -.62133 .10795 -.63627
+aline .10922 -.63754
+bezier .109702 -.652187 .115279 -.66578 .11557 -.68072
+aline .11684 -.68199
+aline .11684 -.68834
+aline .11811 -.68961
+bezier .118592 -.704257 .124169 -.71785 .12446 -.73279
+aline .12573 -.73406
+aline .12573 -.74041
+aline .127 -.74168
+bezier .127482 -.756327 .133059 -.76992 .13335 -.78486
+aline .13462 -.78613
+aline .13462 -.79248
+aline .13589 -.79375
+bezier .136372 -.808397 .141949 -.82199 .14224 -.83693
+aline .14351 -.8382
+bezier .143992 -.852847 .149569 -.86644 .14986 -.88138
+aline .15113 -.88265
+aline .15113 -.889
+aline .1524 -.89027
+bezier .152882 -.904917 .158459 -.91851 .15875 -.93345
+aline .16002 -.93472
+aline .16002 -.94107
+aline .16129 -.94234
+aline .16129 -.94869
+aline .16256 -.94996
+aline .16383 -.95631
+aline .1651 -.94996
+aline .16637 -.94869
+aline .16637 -.94234
+bezier .171597 -.917629 .175742 -.893651 .18034 -.86868
+aline .18161 -.86741
+aline .18161 -.86106
+bezier .187168 -.834373 .191786 -.80804 .19685 -.78105
+aline .19812 -.77978
+aline .19812 -.77343
+bezier .203347 -.748719 .207492 -.724741 .21209 -.69977
+aline .21336 -.6985
+aline .21336 -.69215
+bezier .218852 -.665337 .223731 -.639113 .2286 -.61214
+aline .22987 -.61087
+aline .22987 -.60452
+bezier .235097 -.579809 .239242 -.555831 .24384 -.53086
+aline .24511 -.52959
+aline .24511 -.52324
+bezier .250814 -.496188 .255402 -.470352 .26035 -.44323
+aline .26162 -.44196
+aline .26162 -.43561
+bezier .267354 -.408813 .271564 -.382821 .27686 -.3556
+aline .27813 -.35433
+aline .27813 -.34798
+bezier .283357 -.323269 .287502 -.299291 .2921 -.27432
+aline .29337 -.27305
+aline .29337 -.2667
+bezier .298928 -.240013 .303546 -.21368 .30861 -.18669
+aline .30988 -.18542
+aline .30988 -.17907
+bezier .315107 -.154359 .319252 -.130381 .32385 -.10541
+aline .32512 -.10414
+aline .32512 -.09779
+bezier .330612 -.709775E-01 .335491 -.447527E-01 .34036 -.01778
+aline .34163 -.01651
+aline .34163 -.01016
+aline .34417 .00254
+aline .34544 .00762
+aline .34671 .01016
+aline .34798 .01143
+aline .35052 .0127
+aline .3556 .0127
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="t" !-------------- Beginning of new char.
+dfont wid=1.05556 hei=0 dep=1.80002 italic=0
+dfont ext_top="v" ext_mid=0 ext_bot="t" ext_rep="u"
+set path ! start of curve
+newpath
+! start of curve
+amove .25654 .00508
+aline .26035 .00127
+aline .26035 -.62865
+aline .25654 -.63246
+aline .25273 -.63373
+aline .24638 -.63373
+aline .24511 -.63119
+aline .22225 -.56261
+aline .22098 -.55753
+aline .19939 -.49276
+aline .19812 -.48768
+aline .17526 -.4191
+aline .17399 -.41402
+aline .1524 -.34925
+aline .15113 -.34417
+aline .12827 -.27559
+aline .127 -.27051
+aline .10414 -.20193
+aline .10287 -.19685
+aline .08128 -.13208
+aline .08001 -.127
+aline .07366 -.10795
+aline .04572 -.16383
+aline .04445 -.16383
+aline .04064 -.16002
+aline .04064 -.15875
+aline .05334 -.13335
+aline .05461 -.13208
+aline .08763 -.06604
+aline .0889 -.06731
+aline .10922 -.12827
+aline .11049 -.13335
+aline .13208 -.19812
+aline .13335 -.2032
+aline .15621 -.27178
+aline .15748 -.27686
+aline .18034 -.34544
+aline .18161 -.35052
+aline .2032 -.41529
+aline .20447 -.42037
+aline .22733 -.48895
+aline .2286 -.49403
+aline .24511 -.54356
+aline .24638 -.54229
+aline .24638 .00127
+aline .25019 .00508
+aline .25654 .00508
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="u" !-------------- Beginning of new char.
+dfont wid=1.05556 hei=0 dep=.600006 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .25654 .00508
+aline .26035 .00127
+aline .26035 -.2159
+aline .25654 -.21971
+aline .25019 -.21971
+aline .24638 -.2159
+aline .24638 .00127
+aline .25019 .00508
+aline .25654 .00508
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="v" !-------------- Beginning of new char.
+dfont wid=1.05556 hei=.039999 dep=.560007 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .37465 .0127
+aline .37846 .00889
+aline .37846 .00254
+aline .37465 -.00127
+aline .26162 -.00127
+aline .26035 -.00254
+aline .26035 -.20193
+aline .25654 -.20574
+aline .25019 -.20574
+aline .24638 -.20193
+aline .24638 .00762
+aline .24765 .01016
+aline .24892 .01143
+aline .25146 .0127
+aline .37465 .0127
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="w" !-------------- Beginning of new char.
+dfont wid=.777781 hei=0 dep=.600006 italic=0
+dfont ext_top="~" ext_mid=0 ext_bot=127 ext_rep="w"
+set path ! start of curve
+newpath
+! start of curve
+amove .10541 -.00127
+aline .10541 -.21336
+aline .09017 -.21336
+aline .09017 -.00127
+aline .10541 -.00127
+closepath
+! end of curve
+
+! start of curve
+amove .18288 -.00127
+aline .18288 -.21336
+aline .16764 -.21336
+aline .16764 -.00127
+aline .18288 -.00127
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="x" !-------------- Beginning of new char.
+dfont wid=.666669 hei=0 dep=.600006 italic=0
+dfont ext_top="x" ext_mid=0 ext_bot=0 ext_rep="?"
+set path ! start of curve
+newpath
+! start of curve
+amove .11811 -.00508
+bezier .135818 -.331878E-01 .162984 -.545625E-01 .19431 -.06604
+aline .19431 -.07874
+bezier .167998 -.701929E-01 .144587 -.545091E-01 .12573 -.03429
+aline .12446 -.03556
+aline .12446 -.21209
+aline .10922 -.21209
+aline .10922 -.03556
+aline .10795 -.03429
+bezier .890933E-01 -.545091E-01 .656818E-01 -.701929E-01 .03937 -.07874
+aline .03937 -.06604
+bezier .714599E-01 -.541661E-01 .996334E-01 -.320883E-01 .11684 -.00254
+aline .11811 -.00508
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="y" !-------------- Beginning of new char.
+dfont wid=.666669 hei=0 dep=.600006 italic=0
+dfont ext_top=0 ext_mid=0 ext_bot="y" ext_rep="?"
+set path ! start of curve
+newpath
+! start of curve
+amove .12446 -.00254
+aline .12446 -.17907
+aline .12573 -.18034
+bezier .144587 -.160121 .167998 -.144437 .19431 -.13589
+aline .19431 -.14859
+bezier .16222 -.160464 .134047 -.182542 .11684 -.21209
+bezier .996335E-01 -.182542 .714599E-01 -.160464 .03937 -.14859
+aline .03937 -.13589
+bezier .656818E-01 -.144437 .890933E-01 -.160121 .10795 -.18034
+aline .10922 -.17907
+aline .10922 -.00254
+aline .12446 -.00254
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="z" !-------------- Beginning of new char.
+dfont wid=.450005 hei=.119998 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .16129 .04064
+aline .16256 .0381
+aline .16256 .00127
+aline .16129 -.00127
+bezier .126233 -.938642E-03 .920463E-01 -.866703E-02 .05969 -.0254
+bezier .382511E-01 -.374545E-01 .203628E-01 -.552295E-01 .00762 -.0762
+aline -.00635 -.0762
+aline -.00762 -.07493
+aline -.00762 -.06096
+bezier .220424E-01 -.626363E-02 .802905E-01 .366667E-01 .14351 .03937
+aline .14478 .04064
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="{" !-------------- Beginning of new char.
+dfont wid=.450005 hei=.119998 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .01524 .04064
+aline .01651 .03937
+bezier .797295E-01 .366667E-01 .137978 -.626374E-02 .16764 -.06096
+aline .16764 -.07493
+aline .16637 -.0762
+aline .1524 -.0762
+bezier .130448 -.382398E-01 .899792E-01 -.145135E-01 .04699 -.00635
+aline .04572 -.00508
+aline .03937 -.00508
+aline .0381 -.00381
+aline .03048 -.00381
+aline .02921 -.00254
+aline .01778 -.00254
+aline .01651 -.00127
+aline -.00127 -.00127
+aline -.00254 .00127
+aline -.00254 .0381
+aline -.00127 .04064
+aline .01524 .04064
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="|" !-------------- Beginning of new char.
+dfont wid=.450005 hei=.119998 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .00762 .11557
+bezier .295721E-01 .776098E-01 .700408E-01 .538836E-01 .11303 .04572
+aline .1143 .04445
+aline .12065 .04445
+aline .12192 .04318
+aline .12954 .04318
+aline .13081 .04191
+aline .14224 .04191
+aline .14351 .04064
+aline .16129 .04064
+aline .16256 .0381
+aline .16256 .00127
+aline .16129 -.00127
+bezier .923623E-01 -.369561E-02 .245748E-01 .396255E-01 -.00762 .10033
+aline -.00762 .1143
+aline -.00635 .11557
+aline .00762 .11557
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="}" !-------------- Beginning of new char.
+dfont wid=.450005 hei=.119998 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .16637 .11557
+aline .16764 .1143
+aline .16764 .10033
+bezier .137978 .456337E-01 .797295E-01 .270328E-02 .01651 0
+aline .01524 -.00127
+aline -.00127 -.00127
+aline -.00254 .00127
+aline -.00254 .0381
+aline -.00127 .04064
+bezier .337872E-01 .403086E-01 .679737E-01 .048037 .10033 .06477
+bezier .121769 .768245E-01 .139657 .945995E-01 .1524 .11557
+aline .16637 .11557
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="~" !-------------- Beginning of new char.
+dfont wid=.777781 hei=0 dep=.600006 italic=0
+dfont ext_top="~" ext_mid=0 ext_bot=0 ext_rep="w"
+set path ! start of curve
+newpath
+! start of curve
+amove .13716 -.00381
+bezier .160073 -.526748E-01 .201859 -.916838E-01 .25273 -.11049
+aline .25273 -.12573
+bezier .227426 -.117899 .20458 -.102579 .18415 -.08636
+aline .18288 -.08763
+aline .18288 -.21209
+aline .16764 -.21209
+aline .16764 -.07112
+bezier .155878 -.595761E-01 .146176 -.461581E-01 .136525 -.333375E-01
+bezier .126874 -.461581E-01 .117172 -.595761E-01 .10541 -.07112
+aline .10541 -.21209
+aline .09017 -.21209
+aline .09017 -.08763
+aline .0889 -.08636
+bezier .684697E-01 -.102579 .456245E-01 -.117899 .02032 -.12573
+aline .02032 -.11049
+bezier .711908E-01 -.916837E-01 .112977 -.526748E-01 .13589 -.00381
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=127 !-------------- Beginning of new char.
+dfont wid=.777781 hei=0 dep=.600006 italic=0
+dfont ext_top=0 ext_mid=0 ext_bot=127 ext_rep="w"
+set path ! start of curve
+newpath
+! start of curve
+amove .10541 -.00254
+aline .10541 -.14351
+bezier .117172 -.155054 .126875 -.168471 .136525 -.181293
+bezier .146175 -.168471 .155878 -.155054 .16764 -.14351
+aline .16764 -.00254
+aline .18288 -.00254
+aline .18288 -.127
+aline .18415 -.12827
+bezier .204679 -.112188 .227366 -.966484E-01 .25273 -.0889
+aline .25273 -.10414
+bezier .201859 -.122946 .160073 -.161955 .13716 -.21082
+aline .13589 -.21082
+bezier .112977 -.161955 .711908E-01 -.122946 .02032 -.10414
+aline .02032 -.0889
+bezier .045684 -.966484E-01 .683712E-01 -.112188 .0889 -.12827
+aline .09017 -.127
+aline .09017 -.00254
+aline .10541 -.00254
+closepath
+! end of curve
+
+fill
+dfont endchar
diff --git a/src/fonts/texcmitt.afm b/src/fonts/texcmitt.afm
new file mode 100644
index 0000000..d825f8c
--- /dev/null
+++ b/src/fonts/texcmitt.afm
@@ -0,0 +1,151 @@
+StartFontMetrics 2.0
+Comment Made from TEX tfm file using TFMTOAFM.bas
+FontName CMITT10
+EncodingScheme TEXENCODING
+FullName CMITT10
+FamilyName CMITT10
+Weight Medium
+ItalicAngle 14.0363
+IsFixedPitch false
+UnderlinePosition -97
+UnderlineThickness 73
+FontBBox 0 -300 1001 1001
+CapHeight 729
+XHeight 151
+Descender -219
+Ascender 729
+StartCharMetrics 127
+C 1 ; WX 524 ; N C1 ; B 0 0 524 611 ;
+C 2 ; WX 524 ; N C2 ; B 0 0 524 611 ;
+C 3 ; WX 524 ; N C3 ; B 0 0 524 611 ;
+C 4 ; WX 524 ; N C4 ; B 0 0 524 611 ;
+C 5 ; WX 524 ; N C5 ; B 0 0 524 611 ;
+C 6 ; WX 524 ; N C6 ; B 0 0 524 611 ;
+C 7 ; WX 524 ; N C7 ; B 0 0 524 611 ;
+C 8 ; WX 524 ; N C8 ; B 0 0 524 611 ;
+C 9 ; WX 524 ; N C9 ; B 0 0 524 611 ;
+C 10 ; WX 524 ; N C10 ; B 0 0 524 611 ;
+C 11 ; WX 524 ; N C11 ; B 0 0 524 611 ;
+C 12 ; WX 524 ; N C12 ; B 0 0 524 611 ;
+C 13 ; WX 524 ; N C13 ; B 0 0 524 611 ;
+C 14 ; WX 524 ; N C14 ; B 0 -222 524 388 ;
+C 15 ; WX 524 ; N C15 ; B 0 -222 524 388 ;
+C 16 ; WX 524 ; N C16 ; B 0 0 524 430 ;
+C 17 ; WX 524 ; N C17 ; B 0 -222 524 430 ;
+C 18 ; WX 524 ; N C18 ; B 0 0 524 611 ;
+C 19 ; WX 524 ; N C19 ; B 0 0 524 611 ;
+C 20 ; WX 524 ; N C20 ; B 0 0 524 565 ;
+C 21 ; WX 524 ; N C21 ; B 0 0 524 611 ;
+C 22 ; WX 524 ; N C22 ; B 0 0 524 565 ;
+C 23 ; WX 524 ; N C23 ; B 0 0 524 611 ;
+C 24 ; WX 524 ; N C24 ; B 0 -194 524 0 ;
+C 25 ; WX 524 ; N C25 ; B 0 -222 524 611 ;
+C 26 ; WX 524 ; N C26 ; B 0 0 524 430 ;
+C 27 ; WX 524 ; N C27 ; B 0 0 524 430 ;
+C 28 ; WX 524 ; N C28 ; B 0 -111 524 541 ;
+C 29 ; WX 524 ; N C29 ; B 0 0 524 611 ;
+C 30 ; WX 524 ; N C30 ; B 0 0 524 611 ;
+C 31 ; WX 524 ; N C31 ; B 0 -55 524 666 ;
+C 32 ; WX 369 ; N C32 ; B 0 -111 369 219 ;
+C 33 ; WX 524 ; N C33 ; B 0 0 524 611 ;
+C 34 ; WX 524 ; N C34 ; B 0 0 524 611 ;
+C 35 ; WX 524 ; N C35 ; B 0 0 524 611 ;
+C 36 ; WX 524 ; N C36 ; B 0 0 524 611 ;
+C 37 ; WX 524 ; N C37 ; B 0 -83 524 694 ;
+C 38 ; WX 524 ; N C38 ; B 0 0 524 611 ;
+C 39 ; WX 524 ; N C39 ; B 0 0 524 611 ;
+C 40 ; WX 524 ; N C40 ; B 0 -83 524 694 ;
+C 41 ; WX 524 ; N C41 ; B 0 -83 524 694 ;
+C 42 ; WX 524 ; N C42 ; B 0 0 524 520 ;
+C 43 ; WX 524 ; N C43 ; B 0 81 524 530 ;
+C 44 ; WX 524 ; N C44 ; B 0 -138 524 125 ;
+C 45 ; WX 524 ; N C45 ; B 0 81 524 530 ;
+C 46 ; WX 524 ; N C46 ; B 0 0 524 125 ;
+C 47 ; WX 524 ; N C47 ; B 0 -83 524 694 ;
+C 48 ; WX 524 ; N C48 ; B 0 0 524 611 ;
+C 49 ; WX 524 ; N C49 ; B 0 0 524 611 ;
+C 50 ; WX 524 ; N C50 ; B 0 0 524 611 ;
+C 51 ; WX 524 ; N C51 ; B 0 0 524 611 ;
+C 52 ; WX 524 ; N C52 ; B 0 -222 524 611 ;
+C 53 ; WX 524 ; N C53 ; B 0 0 524 611 ;
+C 54 ; WX 524 ; N C54 ; B 0 0 524 611 ;
+C 55 ; WX 524 ; N C55 ; B 0 -222 524 611 ;
+C 56 ; WX 524 ; N C56 ; B 0 0 524 611 ;
+C 57 ; WX 524 ; N C57 ; B 0 0 524 611 ;
+C 58 ; WX 524 ; N C58 ; B 0 0 524 430 ;
+C 59 ; WX 524 ; N C59 ; B 0 -138 524 430 ;
+C 60 ; WX 524 ; N C60 ; B 0 56 524 555 ;
+C 61 ; WX 524 ; N C61 ; B 0 196 524 415 ;
+C 62 ; WX 524 ; N C62 ; B 0 56 524 555 ;
+C 63 ; WX 524 ; N C63 ; B 0 0 524 611 ;
+C 64 ; WX 524 ; N C64 ; B 0 0 524 611 ;
+C 65 ; WX 524 ; N A ; B 0 0 524 611 ;
+C 66 ; WX 524 ; N B ; B 0 0 524 611 ;
+C 67 ; WX 524 ; N C ; B 0 0 524 611 ;
+C 68 ; WX 524 ; N D ; B 0 0 524 611 ;
+C 69 ; WX 524 ; N E ; B 0 0 524 611 ;
+C 70 ; WX 524 ; N F ; B 0 0 524 611 ;
+C 71 ; WX 524 ; N G ; B 0 0 524 611 ;
+C 72 ; WX 524 ; N H ; B 0 0 524 611 ;
+C 73 ; WX 524 ; N I ; B 0 0 524 611 ;
+C 74 ; WX 524 ; N J ; B 0 0 524 611 ;
+C 75 ; WX 524 ; N K ; B 0 0 524 611 ;
+C 76 ; WX 524 ; N L ; B 0 0 524 611 ;
+C 77 ; WX 524 ; N M ; B 0 0 524 611 ;
+C 78 ; WX 524 ; N N ; B 0 0 524 611 ;
+C 79 ; WX 524 ; N O ; B 0 0 524 611 ;
+C 80 ; WX 524 ; N P ; B 0 0 524 611 ;
+C 81 ; WX 524 ; N Q ; B 0 -138 524 611 ;
+C 82 ; WX 524 ; N R ; B 0 0 524 611 ;
+C 83 ; WX 524 ; N S ; B 0 0 524 611 ;
+C 84 ; WX 524 ; N T ; B 0 0 524 611 ;
+C 85 ; WX 524 ; N U ; B 0 0 524 611 ;
+C 86 ; WX 524 ; N V ; B 0 0 524 611 ;
+C 87 ; WX 524 ; N W ; B 0 0 524 611 ;
+C 88 ; WX 524 ; N X ; B 0 0 524 611 ;
+C 89 ; WX 524 ; N Y ; B 0 0 524 611 ;
+C 90 ; WX 524 ; N Z ; B 0 0 524 611 ;
+C 91 ; WX 524 ; N C91 ; B 0 -83 524 694 ;
+C 92 ; WX 524 ; N C92 ; B 0 -83 524 694 ;
+C 93 ; WX 524 ; N C93 ; B 0 -83 524 694 ;
+C 94 ; WX 524 ; N C94 ; B 0 0 524 611 ;
+C 95 ; WX 524 ; N C95 ; B 0 -95 524 0 ;
+C 96 ; WX 524 ; N C96 ; B 0 0 524 611 ;
+C 97 ; WX 524 ; N a ; B 0 0 524 430 ;
+C 98 ; WX 524 ; N b ; B 0 0 524 611 ;
+C 99 ; WX 524 ; N c ; B 0 0 524 430 ;
+C 100 ; WX 524 ; N d ; B 0 0 524 611 ;
+C 101 ; WX 524 ; N e ; B 0 0 524 430 ;
+C 102 ; WX 524 ; N f ; B 0 -222 524 611 ;
+C 103 ; WX 524 ; N g ; B 0 -222 524 430 ;
+C 104 ; WX 524 ; N h ; B 0 0 524 611 ;
+C 105 ; WX 524 ; N i ; B 0 0 524 611 ;
+C 106 ; WX 524 ; N j ; B 0 -222 524 611 ;
+C 107 ; WX 524 ; N k ; B 0 0 524 611 ;
+C 108 ; WX 524 ; N l ; B 0 0 524 611 ;
+C 109 ; WX 524 ; N m ; B 0 0 524 430 ;
+C 110 ; WX 524 ; N n ; B 0 0 524 430 ;
+C 111 ; WX 524 ; N o ; B 0 0 524 430 ;
+C 112 ; WX 524 ; N p ; B 0 -222 524 430 ;
+C 113 ; WX 524 ; N q ; B 0 -222 524 430 ;
+C 114 ; WX 524 ; N r ; B 0 0 524 430 ;
+C 115 ; WX 524 ; N s ; B 0 0 524 430 ;
+C 116 ; WX 524 ; N t ; B 0 0 524 611 ;
+C 117 ; WX 524 ; N u ; B 0 0 524 430 ;
+C 118 ; WX 524 ; N v ; B 0 0 524 430 ;
+C 119 ; WX 524 ; N w ; B 0 0 524 430 ;
+C 120 ; WX 524 ; N x ; B 0 0 524 430 ;
+C 121 ; WX 524 ; N y ; B 0 -222 524 430 ;
+C 122 ; WX 524 ; N z ; B 0 0 524 430 ;
+C 123 ; WX 524 ; N C123 ; B 0 -83 524 694 ;
+C 124 ; WX 524 ; N C124 ; B 0 -83 524 694 ;
+C 125 ; WX 524 ; N C125 ; B 0 -83 524 694 ;
+C 126 ; WX 524 ; N C126 ; B 0 0 524 611 ;
+C 127 ; WX 524 ; N C127 ; B 0 0 524 611 ;
+EndCharMetrics
+
+StartKernData
+StartKernPairs 0
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/src/fonts/texcmitt.gle b/src/fonts/texcmitt.gle
new file mode 100644
index 0000000..cf22413
--- /dev/null
+++ b/src/fonts/texcmitt.gle
@@ -0,0 +1,5209 @@
+dfont file_name="CMITT10"
+dfont font_name="CMITT10"
+dfont design= .35146
+dfont slant= .25
+dfont space= .184515
+dfont stretch= 0
+dfont shrink= 0
+dfont x_hei= .151323
+dfont quad= .369029
+dfont extra_space= .184515
+dfont paint="FILL"
+!------------------ end of main parameters
+dfont char=0 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .215265 .21336
+aline .21717 .212725
+aline .21844 .21209
+aline .22098 .20955
+aline .22225 .20701
+aline .222885 .205105
+aline .222885 .202565
+aline .213995 .167005
+bezier .211028 .154375 .187171 .157427 .1905 .17145
+aline .195342 .190818
+aline .194945 .192405
+aline .111125 .192405
+aline .070485 .029845
+aline .06858 .022225
+aline .681038E-01 .212725E-01
+aline .06858 .02032
+aline .092075 .02032
+bezier .101952 .175784E-01 .101131 .187479E-02 .09144 -.000635
+aline .02159 -.000635
+bezier .110784E-01 .152463E-02 .119106E-01 .176645E-01 .02159 .02032
+aline .04318 .02032
+aline .043815 .02159
+aline .084455 .18415
+aline .861219E-01 .190818
+aline .085725 .192405
+aline .06985 .192405
+bezier .593384E-01 .194565 .601706E-01 .210704 .06985 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=1 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .15494 .217805
+aline .156845 .21717
+aline .159385 .2159
+aline .160655 .21463
+aline .16129 .21336
+aline .161925 .212725
+bezier .167768 .144429 .169756 .075823 .174625 .00762
+aline .17399 .005715
+aline .17272 .003175
+aline .170815 .00127
+aline .167005 -.000635
+aline .01778 -.000635
+bezier .847396E-02 .575257E-02 .020652 .155104E-01 .02286 .02286
+bezier .577559E-01 .849585E-01 .922782E-01 .147326 .127 .20955
+aline .13208 .21463
+aline .13335 .215265
+aline .133985 .2159
+aline .135255 .216535
+aline .13716 .21717
+aline .139065 .217805
+closepath
+! end of curve
+
+! start of curve
+amove .139065 .188595
+bezier .110207 .132587 .767644E-01 .770967E-01 .04826 .022225
+aline .14859 .022225
+bezier .146078 .778428E-01 .142829 .134128 .1397 .189865
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=2 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .1651 .21717
+bezier .180275 .216521 .203174 .212589 .205105 .19304
+bezier .206389 .170307 .201506 .148244 .196215 .125095
+aline .187325 .089535
+bezier .17809 .600817E-01 .173112 .247563E-01 .14732 .00508
+bezier .135764 -.200282E-02 .122221 -.322117E-02 .109855 -.004445
+aline .07366 -.004445
+bezier .580568E-01 -.405504E-02 .329561E-01 .620246E-03 .033655 .02159
+bezier .316413E-01 .442339E-01 .376464E-01 .659244E-01 .042545 .0889
+aline .051435 .12446
+bezier .610258E-01 .154019 .657024E-01 .190805 .093345 .208915
+bezier .104486 .215211 .117247 .215803 .128905 .21717
+aline .1651 .21717
+closepath
+! end of curve
+
+! start of curve
+amove .12954 .19558
+bezier .110777 .19646 .935045E-01 .1835 .088265 .1651
+bezier .826887E-01 .151316 .788497E-01 .136891 .07493 .122555
+aline .066675 .089535
+bezier .063174 .682156E-01 .536119E-01 .471876E-01 .061595 .02667
+bezier .749363E-01 .122374E-01 .973009E-01 .017154 .114935 .017145
+bezier .130654 .195195E-01 .144724 .299157E-01 .149225 .04572
+bezier .155278 .595902E-01 .159109 .074349 .163195 .0889
+aline .17145 .12192
+bezier .175132 .143756 .185016 .165402 .17653 .18669
+bezier .164226 .199019 .145344 .196277 .12954 .19558
+closepath
+! end of curve
+
+! start of curve
+amove .10287 .128905
+aline .10541 .12827
+aline .10795 .127
+aline .11049 .12446
+aline .11176 .12192
+aline .11176 .118745
+aline .112395 .11811
+aline .13208 .11811
+bezier .132061 .133657 .159919 .13204 .15621 .116205
+aline .14986 .090805
+bezier .145675 .796238E-01 .125859 .819819E-01 .12573 .094615
+aline .10668 .094615
+bezier .106024 .800371E-01 .080287 .800168E-01 .081915 .09525
+aline .088265 .12065
+aline .0889 .122555
+aline .09017 .125095
+aline .09144 .126365
+aline .09271 .127
+aline .093345 .127635
+aline .094615 .12827
+aline .097155 .128905
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=3 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .155575 .217805
+aline .15748 .21717
+aline .15875 .216535
+aline .16129 .213995
+aline .16256 .211455
+aline .16256 .18161
+aline .161925 .180975
+aline .161925 .145415
+aline .16129 .14478
+aline .16129 .10922
+aline .160655 .108585
+aline .160655 .073025
+aline .16002 .07239
+aline .16002 .037465
+aline .159385 .03683
+aline .159385 .020955
+aline .16002 .02032
+aline .169545 .02032
+bezier .180056 .180742E-01 .178954 .143102E-02 .16891 -.000635
+aline .117475 -.000635
+bezier .107572 .210012E-02 .108518 .017779 .11811 .02032
+aline .13462 .02032
+aline .135255 .020955
+aline .135255 .03683
+aline .13589 .037465
+aline .13589 .06985
+bezier .137192 .109667 .13815 .151027 .1397 .189865
+bezier .115987 .132523 .857899E-01 .760844E-01 .06096 .02032
+aline .07239 .02032
+bezier .829013E-01 .180742E-01 .817994E-01 .143102E-02 .071755 -.000635
+aline .02032 -.000635
+bezier .010417 .210012E-02 .113629E-01 .017779 .020955 .02032
+aline .03556 .02032
+bezier .681124E-01 .843087E-01 .966727E-01 .15102 .13081 .213995
+aline .13208 .21463
+aline .132715 .215265
+aline .136525 .21717
+aline .13843 .217805
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=4 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .21463 .21336
+aline .216535 .212725
+aline .217805 .21209
+aline .220345 .20955
+aline .221615 .20701
+aline .22225 .205105
+aline .22225 .202565
+aline .21844 .187325
+bezier .21605 .173006 .189184 .177849 .195421 .192723
+aline .194945 .193675
+aline .086995 .193675
+aline .08636 .192405
+aline .08509 .187325
+bezier .828264E-01 .173672 .572572E-01 .177127 .061595 .19177
+aline .065405 .20701
+aline .06604 .20828
+aline .066675 .208915
+aline .06731 .210185
+aline .06858 .211455
+aline .07112 .212725
+aline .07239 .21336
+closepath
+! end of curve
+
+! start of curve
+amove .085725 .13335
+aline .08763 .132715
+aline .09017 .131445
+aline .09271 .128905
+aline .093345 .127635
+aline .09398 .12573
+aline .09398 .121285
+aline .094615 .12065
+aline .151765 .12065
+bezier .150685 .134474 .17268 .138702 .17653 .12573
+aline .17653 .121285
+aline .17018 .095885
+bezier .16719 .834602E-01 .143637 .865307E-01 .146685 .10033
+aline .14605 .100965
+aline .0889 .100965
+bezier .08998 .871405E-01 .679852E-01 .829125E-01 .064135 .095885
+aline .064135 .10033
+aline .070485 .12573
+aline .07112 .127635
+aline .071755 .128905
+aline .074295 .131445
+aline .076835 .132715
+aline .079375 .13335
+closepath
+! end of curve
+
+! start of curve
+amove .034925 .03556
+aline .03683 .034925
+aline .0381 .03429
+aline .04064 .03175
+aline .04191 .02921
+aline .042545 .027305
+aline .042545 .024765
+aline .415131E-01 .206375E-01
+aline .04191 .01905
+aline .15367 .01905
+aline .15621 .02921
+bezier .160281 .397945E-01 .181057 .375471E-01 .179705 .024765
+aline .17526 .006985
+aline .174625 .00508
+aline .17399 .00381
+aline .170815 .000635
+aline .169545 0
+aline .16764 -.000635
+aline .02159 -.000635
+aline .01905 .000635
+aline .018415 .00127
+aline .017145 .001905
+aline .01651 .003175
+aline .015875 .00381
+aline .014605 .00635
+aline .014605 .01143
+aline .01905 .02921
+aline .02032 .03175
+aline .022225 .033655
+aline .024765 .034925
+aline .026035 .03556
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=5 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .220345 .21336
+bezier .230945 .211137 .229872 .19517 .220345 .192405
+aline .202565 .192405
+aline .161925 .029845
+aline .16002 .022225
+aline .159544 .212725E-01
+aline .16002 .02032
+aline .172085 .02032
+bezier .182685 .180967E-01 .181612 .213014E-02 .172085 -.000635
+aline .11684 -.000635
+bezier .106672 .171945E-02 .10781 .182009E-01 .117475 .02032
+aline .13462 .02032
+aline .135255 .02159
+aline .175895 .18415
+aline .177562 .190818
+aline .177165 .192405
+aline .103505 .192405
+aline .062865 .029845
+aline .06096 .022225
+aline .604838E-01 .212725E-01
+aline .06096 .02032
+aline .073025 .02032
+bezier .836249E-01 .180967E-01 .825523E-01 .213014E-02 .073025 -.000635
+aline .01778 -.000635
+bezier .761161E-02 .171945E-02 .875022E-02 .182009E-01 .018415 .02032
+aline .03556 .02032
+aline .036195 .02159
+aline .076835 .18415
+aline .785019E-01 .190818
+aline .078105 .192405
+aline .06604 .192405
+bezier .558716E-01 .194759 .570102E-01 .211241 .066675 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=6 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .213995 .21336
+aline .2159 .212725
+aline .21717 .21209
+aline .21971 .20955
+aline .22098 .20701
+aline .221615 .205105
+aline .221615 .202565
+aline .212725 .167005
+bezier .209758 .154375 .185901 .157427 .18923 .17145
+aline .194072 .190818
+aline .193675 .192405
+aline .09398 .192405
+bezier .102135 .164232 .114792 .134567 .122555 .10541
+bezier .111854 .869502E-01 .952364E-01 .071951 .08255 .05461
+bezier .735159E-01 .436368E-01 .622772E-01 .318493E-01 .055245 .020955
+aline .15113 .020955
+aline .151765 .02159
+aline .158115 .04699
+bezier .161486 .058643 .18396 .558878E-01 .18161 .042545
+aline .17272 .006985
+aline .172085 .00508
+aline .17145 .00381
+aline .168275 .000635
+aline .167005 0
+aline .1651 -.000635
+aline .02413 -.000635
+bezier .149956E-01 .217101E-02 .156059E-01 .138416E-01 .022225 .01905
+bezier .470109E-01 .488897E-01 .727545E-01 .783521E-01 .962819E-01 .108903
+bezier .086255 .139146 .756913E-01 .16923 .065405 .19939
+aline .065405 .20447
+aline .06604 .20701
+aline .066675 .20828
+aline .06731 .208915
+aline .067945 .210185
+aline .069215 .211455
+aline .071755 .212725
+aline .073025 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=7 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .11303 .21717
+bezier .12601 .216296 .133915 .203381 .13462 .19177
+aline .13462 .170815
+aline .134239 .16891
+aline .13462 .167005
+bezier .143404 .191634 .162375 .222774 .19304 .216535
+bezier .215113 .211445 .221439 .181265 .210185 .164465
+aline .208915 .16383
+aline .20828 .163195
+aline .20447 .16129
+aline .194945 .16129
+bezier .185442 .165154 .192318 .176217 .192405 .18288
+aline .192405 .186055
+bezier .192592 .194688 .183997 .202744 .17526 .198755
+bezier .150513 .1869 .145864 .155868 .137795 .13208
+aline .136525 .127
+aline .13589 .125095
+aline .131445 .107315
+aline .13081 .10668
+aline .13081 .103505
+aline .11049 .022225
+aline .110014 .212725E-01
+aline .11049 .02032
+aline .126365 .02032
+bezier .136927 .180564E-01 .135797 .145934E-02 .12573 -.000635
+aline .0635 -.000635
+bezier .536187E-01 .19719E-02 .543336E-01 .179667E-01 .064135 .02032
+aline .08509 .02032
+aline .085725 .02159
+aline .107315 .10795
+bezier .113468 .135735 .124579 .163133 .117475 .1905
+bezier .111958 .204765 .933291E-01 .200512 .08763 .188595
+bezier .811375E-01 .179861 .830535E-01 .165102 .07112 .16129
+aline .061595 .16129
+aline .059055 .16256
+bezier .521756E-01 .172244 .625065E-01 .184451 .06731 .19304
+bezier .759078E-01 .205222 .892896E-01 .21525 .10414 .21717
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=8 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .17653 .21336
+bezier .18713 .211137 .186057 .19517 .17653 .192405
+aline .153035 .192405
+aline .145018 .160338
+bezier .151139 .156313 .161596 .157284 .16891 .153035
+bezier .189627 .145413 .20584 .121423 .194945 .099695
+bezier .181072 .711322E-01 .147952 .574262E-01 .118473 .534307E-01
+aline .11811 .052705
+aline .11049 .022225
+aline .110014 .212725E-01
+aline .11049 .02032
+aline .12827 .02032
+bezier .13887 .180967E-01 .137797 .213014E-02 .12827 -.000635
+aline .061595 -.000635
+bezier .514052E-01 .17173E-02 .525643E-01 .181649E-01 .06223 .02032
+aline .08509 .02032
+aline .085725 .02159
+aline .093345 .05207
+aline .938213E-01 .530225E-01
+bezier .714423E-01 .564847E-01 .411911E-01 .687861E-01 .04064 .095885
+bezier .393444E-01 .122852 .662199E-01 .14256 .089535 .151765
+aline .09906 .15494
+aline .1016 .155575
+aline .103505 .15621
+aline .11303 .158115
+aline .11684 .158115
+aline .117475 .15875
+aline .120149 .159285
+aline .128032 .190818
+aline .127635 .192405
+aline .109855 .192405
+bezier .996652E-01 .194757 .100824 .211205 .11049 .21336
+closepath
+! end of curve
+
+! start of curve
+amove .11303 .13716
+bezier .928148E-01 .134066 .655199E-01 .12345 .064135 .099695
+bezier .676984E-01 .841125E-01 .850834E-01 .769593E-01 .991507E-01 .752929E-01
+aline .1143 .13589
+aline .114776 .136843
+aline .114512 .137372
+aline .113983 .137636
+aline .11303 .13716
+closepath
+! end of curve
+
+! start of curve
+amove .139065 .136525
+aline .13843 .133985
+aline .124063 .765175E-01
+aline .12446 .07493
+bezier .144837 .788164E-01 .17508 .893183E-01 .17399 .114935
+bezier .169052 .129128 .153177 .13557 .139488 .137372
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=9 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .174625 .21336
+bezier .185187 .211096 .184057 .194499 .17399 .192405
+aline .153035 .192405
+aline .12446 .078105
+aline .123825 .07747
+bezier .150193 .837484E-01 .16233 .113083 .16764 .137795
+bezier .171369 .154809 .185666 .173474 .205105 .16764
+bezier .215531 .163348 .210545 .145269 .19939 .14732
+bezier .186552 .13299 .1884 .110849 .177165 .09525
+bezier .165834 .072969 .143065 .570576E-01 .118491 .053467
+aline .11811 .052705
+aline .11049 .022225
+aline .110014 .212725E-01
+aline .11049 .02032
+aline .126365 .02032
+bezier .136927 .180564E-01 .135797 .145934E-02 .12573 -.000635
+aline .0635 -.000635
+bezier .536187E-01 .19719E-02 .543336E-01 .179667E-01 .064135 .02032
+aline .08509 .02032
+aline .085725 .02159
+aline .937419E-01 .536575E-01
+bezier .765339E-01 .587007E-01 .583468E-01 .731985E-01 .057785 .093345
+bezier .537709E-01 .110776 .612915E-01 .128715 .062865 .14605
+bezier .531049E-01 .147964 .496302E-01 .161614 .05842 .167005
+bezier .694784E-01 .171648 .845666E-01 .165984 .08636 .153035
+bezier .089321 .127939 .696337E-01 .1022 .088265 .080645
+aline .089535 .08001
+aline .09017 .079375
+aline .09144 .07874
+aline .092075 .078105
+aline .09398 .07747
+aline .09525 .076835
+aline .098425 .757767E-01
+aline .992188E-01 .760413E-01
+aline .099695 .07747
+aline .128032 .190818
+aline .127635 .192405
+aline .11176 .192405
+bezier .101879 .195012 .102594 .211007 .112395 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=10 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .151765 .21717
+bezier .179156 .215575 .204834 .193527 .207645 .165735
+bezier .211176 .11312 .167107 .076501 .144145 .03429
+aline .14351 .033655
+aline .13843 .023495
+aline .137795 .02159
+aline .13716 .020955
+aline .137795 .02032
+aline .158115 .02032
+aline .15875 .02159
+aline .160655 .02921
+bezier .163137 .417949E-01 .183121 .372156E-01 .179705 .024765
+aline .17526 .006985
+aline .174625 .00508
+aline .17399 .00381
+aline .170815 .000635
+aline .169545 0
+aline .16764 -.000635
+aline .118745 -.000635
+bezier .105911 .449189E-02 .11439 .194278E-01 .117475 .028575
+bezier .135611 .716887E-01 .173717 .104196 .18415 .150495
+bezier .18703 .170231 .175156 .191795 .154305 .194945
+bezier .114914 .202502 .741224E-01 .166084 .07112 .127
+bezier .686348E-01 .847179E-01 .898733E-01 .455328E-01 .076835 .00381
+aline .07366 .000635
+aline .07239 0
+aline .070485 -.000635
+aline .02159 -.000635
+aline .01905 .000635
+aline .018415 .00127
+aline .017145 .001905
+aline .01651 .003175
+aline .015875 .00381
+aline .014605 .00635
+aline .014605 .01143
+aline .01905 .02921
+bezier .215323E-01 .417949E-01 .415162E-01 .372156E-01 .0381 .024765
+aline .037465 .022225
+aline .369888E-01 .212725E-01
+aline .037465 .02032
+aline .05842 .02032
+bezier .646012E-01 .567435E-01 .430165E-01 .923437E-01 .04826 .128905
+bezier .508831E-01 .179776 .101912 .221035 .151765 .21717
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=11 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .14605 .21336
+bezier .156694 .208758 .155288 .193715 .163195 .186055
+bezier .172044 .174373 .1844 .166278 .19812 .16129
+bezier .209521 .153789 .196605 .135119 .18542 .14351
+bezier .171065 .149274 .158367 .158271 .14859 .17018
+aline .147955 .169545
+aline .10795 .009525
+bezier .105874 -.236343E-02 .871594E-01 -.469159E-02 .08382 .00762
+aline .08382 .01397
+aline .121682 .165418
+aline .121285 .167005
+bezier .105665 .155477 .873826E-01 .145206 .067945 .141605
+bezier .549885E-01 .143956 .586441E-01 .164023 .07112 .16383
+bezier .990512E-01 .172437 .120905 .19222 .140335 .212725
+aline .141605 .21336
+closepath
+! end of curve
+
+! start of curve
+amove .121285 .167005
+aline .12192 .16637
+aline .122555 .167005
+aline .12192 .16764
+aline .121285 .167005
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=12 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .146685 .21336
+aline .14859 .212725
+aline .14986 .21209
+aline .150495 .211455
+aline .151765 .21082
+aline .153035 .20955
+aline .15494 .20574
+aline .155575 .203835
+aline .155575 .200025
+aline .117475 .047625
+aline .116999 .466725E-01
+bezier .125487 .498609E-01 .136085 .593226E-01 .146685 .062865
+bezier .155958 .659523E-01 .167076 .748263E-01 .17653 .06858
+bezier .181336 .629647E-01 .17966 .524179E-01 .172085 .050165
+bezier .142549 .419234E-01 .118952 .221179E-01 .09906 0
+bezier .859786E-01 -.464024E-02 .850948E-01 .121665E-01 .08001 .019685
+bezier .721284E-01 .368923E-01 .544817E-01 .452743E-01 .038735 .05334
+bezier .316036E-01 .622062E-01 .434681E-01 .076606 .05334 .069215
+bezier .680136E-01 .634437E-01 .810385E-01 .542676E-01 .090805 .04191
+aline .131445 .20447
+aline .13335 .20828
+aline .13589 .21082
+aline .13716 .211455
+aline .137795 .21209
+aline .139065 .212725
+aline .141605 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=13 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .14732 .21717
+bezier .160276 .215117 .160532 .199967 .155575 .1905
+bezier .147687 .166674 .141167 .14233 .132715 .118745
+bezier .125914 .10773 .107251 .118301 .1143 .12954
+bezier .118112 .155277 .123718 .1802 .12827 .20574
+aline .130175 .20955
+aline .13081 .210185
+aline .131445 .211455
+aline .13335 .21336
+aline .13462 .213995
+aline .135255 .21463
+aline .139065 .216535
+aline .141605 .21717
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=14 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.388888 dep=.222223 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .127635 .135255
+bezier .145405 .13173 .142099 .105789 .126365 .1016
+bezier .113591 .967676E-01 .100953 .110019 .106045 .122555
+aline .10795 .126365
+aline .10922 .127635
+aline .109855 .128905
+aline .111125 .130175
+aline .112395 .13081
+aline .113665 .13208
+aline .118745 .13462
+aline .121285 .135255
+closepath
+! end of curve
+
+! start of curve
+amove .114935 .070485
+bezier .128199 .651473E-01 .118393 .493547E-01 .117475 .03937
+bezier .108237 .161246E-02 .102325 -.373302E-01 .090805 -.074295
+bezier .832559E-01 -.086359 .614752E-01 -.852886E-01 .059055 -.06985
+bezier .681814E-01 -.250165E-01 .831697E-01 .189975E-01 .094615 .0635
+aline .09652 .06731
+aline .09779 .06858
+aline .09906 .069215
+aline .099695 .06985
+aline .1016 .070485
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=15 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.388888 dep=.222223 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .127635 .135255
+bezier .145405 .13173 .142099 .105789 .126365 .1016
+bezier .113591 .967676E-01 .100953 .110019 .106045 .122555
+aline .10795 .126365
+aline .10922 .127635
+aline .109855 .128905
+aline .111125 .130175
+aline .112395 .13081
+aline .113665 .13208
+aline .118745 .13462
+aline .121285 .135255
+closepath
+! end of curve
+
+! start of curve
+amove .11303 .070485
+bezier .135037 .669201E-01 .139052 .377435E-01 .12573 .02286
+bezier .103974 .651787E-03 .698233E-01 -.00499 .048895 -.02794
+bezier .388532E-01 -.396914E-01 .468123E-01 -.572033E-01 .061595 -.05969
+bezier .841443E-01 -.650654E-01 .111287 -.581457E-01 .127635 -.040005
+bezier .117462 -.244422E-01 .143087 -.60301E-02 .154305 -.02159
+bezier .161544 -.411751E-01 .143008 -.597768E-01 .127635 -.069215
+bezier .998472E-01 -.837461E-01 .638541E-01 -.899257E-01 .03683 -.07112
+bezier .176049E-01 -.568907E-01 .018112 -.274085E-01 .033655 -.010795
+bezier .543332E-01 .118919E-01 .870748E-01 .018493 .10922 .038735
+aline .109855 .040005
+aline .11049 .04191
+aline .111125 .042545
+aline .111125 .047625
+bezier .103497 .524738E-01 .091807 .046828 .085725 .04064
+aline .08509 .03937
+aline .084455 .038735
+bezier .837372E-01 .247202E-01 .585604E-01 .246576E-01 .05969 .03937
+bezier .639043E-01 .578684E-01 .829596E-01 .683214E-01 .10033 .070485
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=16 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.430555 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .111125 .151765
+bezier .13167 .150651 .146866 .127092 .13716 .10795
+bezier .12714 .811876E-01 .115141 .550932E-01 .106299 .02794
+bezier .108091 .133058E-01 .126845 .183745E-01 .133985 .026035
+bezier .142969 .341022E-01 .146182 .460031E-01 .15113 .056515
+bezier .159243 .634464E-01 .176437 .573677E-01 .17145 .045085
+bezier .163568 .148859E-01 .129476 -.141159E-01 .09779 .001905
+bezier .809662E-01 .109433E-01 .788893E-01 .329164E-01 .088265 .04826
+bezier .974537E-01 .715714E-01 .106359 .09519 .116205 .11811
+bezier .119072 .130387 .10299 .134153 .09525 .127635
+bezier .824621E-01 .120959 .768811E-01 .106952 .07239 .09398
+bezier .647063E-01 .848771E-01 .455547E-01 .918013E-01 .051435 .104775
+bezier .589129E-01 .130644 .828085E-01 .154333 .111125 .151765
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=17 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.430555 dep=.222223 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .139065 .151765
+bezier .158572 .149873 .174022 .130687 .16891 .111125
+aline .13589 -.020955
+bezier .126902 -.056228 .929988E-01 -.877506E-01 .055245 -.08001
+bezier .406822E-01 -.793536E-01 .270961E-01 -.065594 .033655 -.0508
+bezier .387224E-01 -.354078E-01 .656182E-01 -.382475E-01 .0635 -.05588
+aline .631031E-01 -.574675E-01
+aline .0635 -.059055
+bezier .880638E-01 -.632937E-01 .106604 -.380947E-01 .112395 -.01651
+aline .145415 .11557
+bezier .14945 .126501 .134883 .134479 .12573 .12954
+bezier .107254 .125 .979306E-01 .107251 .089535 .092075
+bezier .809939E-01 .861242E-01 .653823E-01 .925319E-01 .070485 .10414
+bezier .801745E-01 .128024 .101701 .148263 .127635 .151765
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=18 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .107315 .21336
+bezier .124644 .204311 .143797 .196661 .159385 .18542
+bezier .165178 .177572 .154631 .16363 .145415 .167005
+aline .125095 .177165
+aline .12446 .1778
+aline .1016 .18923
+aline .100965 .189865
+aline .097155 .19177
+aline .09398 .194945
+aline .09271 .197485
+aline .09271 .20447
+aline .094615 .20828
+aline .09779 .211455
+aline .10033 .212725
+aline .102235 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=19 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .184785 .21336
+bezier .19825 .21051 .194968 .19052 .182245 .18923
+bezier .162563 .181771 .143427 .171584 .12319 .16637
+bezier .110565 .169288 .111571 .190115 .125095 .191135
+bezier .14329 .198564 .161433 .206117 .179705 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=20 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.565973 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .09779 .19939
+bezier .110565 .193864 .124327 .186479 .136525 .182245
+bezier .153783 .187437 .170122 .197201 .18796 .19939
+bezier .197308 .196288 .198828 .179632 .188595 .17653
+aline .180975 .17399
+aline .179705 .173355
+aline .160655 .167005
+bezier .148441 .163585 .135356 .154083 .12319 .16256
+bezier .110271 .168973 .950247E-01 .171835 .08382 .180975
+aline .083185 .182245
+aline .08255 .184785
+aline .08255 .187325
+aline .083185 .18923
+aline .084455 .19177
+aline .08509 .192405
+aline .08636 .194945
+aline .089535 .19812
+aline .090805 .198755
+aline .092075 .19939
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=21 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .095885 .21336
+aline .09779 .212725
+aline .09906 .21209
+aline .1016 .20955
+aline .10287 .20701
+aline .103505 .205105
+aline .103505 .202565
+aline .103108 .200978
+aline .103414 .199753
+aline .10541 .198755
+aline .107315 .19812
+aline .109855 .197485
+aline .11049 .19685
+aline .1143 .19685
+aline .114935 .196215
+aline .12192 .196215
+aline .122555 .19558
+aline .15621 .19558
+bezier .166213 .197377 .182499 .196243 .18542 .20955
+bezier .192914 .219442 .210525 .209716 .203835 .19812
+bezier .197003 .179258 .174465 .174943 .15748 .17399
+aline .120015 .17399
+bezier .106078 .175034 .854501E-01 .177551 .081915 .194945
+aline .081915 .20447
+aline .08255 .20701
+aline .083185 .20828
+aline .08382 .208915
+aline .084455 .210185
+aline .085725 .211455
+aline .088265 .212725
+aline .089535 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=22 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.565555 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .19939 .201295
+bezier .210301 .19904 .208886 .181936 .198755 .179705
+aline .080645 .179705
+bezier .706391E-01 .182607 .717049E-01 .198475 .08128 .201295
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=23 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .15113 .216535
+bezier .165331 .216209 .173934 .198973 .164465 .18796
+bezier .153365 .172827 .123677 .16743 .114935 .187325
+bezier .11242 .203257 .128041 .214529 .14224 .216535
+closepath
+! end of curve
+
+! start of curve
+amove .140335 .20574
+bezier .130628 .205226 .121769 .190754 .13335 .186055
+bezier .143105 .180392 .161941 .192931 .1524 .203835
+aline .14986 .205105
+aline .147955 .20574
+aline .14732 .206375
+aline .14097 .206375
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=24 !-------------- Beginning of new char.
+dfont wid=.524996 hei=0 dep=.194446 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .109855 .014605
+aline .11176 .01397
+aline .11303 .013335
+aline .11557 .010795
+aline .11684 .008255
+aline .117475 .005715
+aline .117475 .004445
+aline .11684 .00127
+aline .11557 -.00381
+aline .114935 -.004445
+bezier .13109 -.797551E-02 .145886 -.235617E-01 .14097 -.04064
+bezier .134568 -.665845E-01 .103757 -.072273 .081915 -.07366
+aline .055245 -.07366
+bezier .427369E-01 -.788439E-01 .360757E-01 -.577806E-01 .04826 -.05334
+bezier .709643E-01 -.507929E-01 .970762E-01 -.571632E-01 .11557 -.04064
+bezier .121093 -.337197E-01 .115031 -.259315E-01 .107315 -.0254
+aline .10668 -.024765
+aline .103505 -.024765
+aline .10287 -.02413
+aline .095885 -.02413
+aline .092075 -.022225
+aline .090805 -.020955
+aline .0889 -.017145
+aline .0889 -.012065
+aline .09398 .008255
+aline .09525 .010795
+aline .097155 .0127
+aline .099695 .01397
+aline .100965 .014605
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=25 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=.222223 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .158115 .215265
+bezier .176212 .214865 .199073 .200945 .19304 .179705
+bezier .1871 .158391 .183138 .133429 .164465 .11938
+bezier .155675 .112085 .145945 .100589 .154305 .089535
+bezier .161453 .789589E-01 .171633 .694602E-01 .173355 .05588
+bezier .177123 .249841E-01 .147261 -.129725E-01 .1143 0
+bezier .965674E-01 .47639E-02 .089803 .350119E-01 .10922 .04191
+aline .116205 .04191
+aline .11811 .041275
+aline .12065 .040005
+aline .123825 .03683
+aline .12573 .03302
+aline .12573 .026035
+aline .125095 .02413
+aline .123349 .206375E-01
+bezier .133821 .131739E-01 .144269 .028696 .14732 .0381
+bezier .157346 .564573E-01 .13553 .682153E-01 .130175 .08382
+bezier .124621 .975886E-01 .127445 .11446 .137795 .125095
+bezier .14937 .135813 .160946 .146939 .16383 .163195
+aline .1651 .167005
+aline .16637 .172085
+aline .167005 .17399
+aline .169545 .18415
+bezier .171217 .192055 .159975 .192984 .15494 .19431
+aline .1397 .19431
+aline .139065 .193675
+aline .13462 .193675
+aline .133985 .19304
+aline .13081 .192405
+aline .128905 .19177
+aline .126365 .1905
+aline .12192 .186055
+aline .11938 .180975
+aline .117475 .17526
+aline .116205 .17018
+aline .095885 .06858
+aline .09525 .067945
+aline .09525 .06477
+aline .08763 .02667
+bezier .786166E-01 -.719332E-02 .774981E-01 -.465471E-01 .05334 -.07366
+bezier .406466E-01 -.866844E-01 .147891E-01 -.809867E-01 .0127 -.061595
+bezier .950916E-02 -.484025E-01 .206356E-01 -.032809 .034925 -.037465
+aline .038735 -.03937
+aline .041275 -.04191
+aline .04191 -.04318
+aline .042545 -.043815
+aline .04318 -.045085
+aline .043688 -.046609
+bezier .551408E-01 -.144534E-01 .622248E-01 .229252E-01 .069215 .05715
+aline .083185 .127
+aline .836613E-01 .127953
+aline .083185 .128905
+aline .06477 .128905
+bezier .548887E-01 .131512 .556036E-01 .147507 .065405 .14986
+aline .08763 .14986
+bezier .923398E-01 .1726 .948931E-01 .202038 .120015 .211455
+aline .12573 .21336
+aline .12827 .213995
+aline .131445 .213995
+aline .13208 .21463
+aline .136525 .21463
+aline .13716 .215265
+aline .158115 .215265
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=26 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.430555 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .130175 .1524
+aline .13208 .151765
+aline .13335 .15113
+aline .136525 .147955
+aline .13843 .144145
+aline .13843 .1397
+bezier .151701 .149377 .175203 .158781 .1905 .14478
+bezier .212226 .122556 .197525 .831676E-01 .169545 .074295
+bezier .153768 .671896E-01 .136102 .653514E-01 .120015 .06604
+bezier .116409 .507469E-01 .116787 .296613E-01 .131445 .019685
+bezier .148576 .154845E-01 .167249 .246563E-01 .179705 .03683
+aline .18161 .037465
+aline .186055 .037465
+aline .189865 .03556
+bezier .199862 .251192E-01 .184806 .146615E-01 .17653 .009525
+bezier .156555 -.415304E-02 .122374 -.106966E-01 .10795 .01397
+aline .106998 .144463E-01
+aline .106589 .142421E-01
+aline .10414 .004445
+bezier .101039 -.674075E-02 .847571E-01 -.312356E-02 .841375E-01 .746125E-02
+bezier .654716E-01 -.113803E-01 .299041E-01 -.218483E-02 .02286 .023495
+bezier .148021E-01 .601019E-01 .410971E-01 .949359E-01 .06731 .11811
+bezier .846917E-01 .132388 .104356 .144196 .12573 .1524
+closepath
+! end of curve
+
+! start of curve
+amove .16637 .130175
+bezier .146439 .124781 .132405 .105219 .126365 .086995
+bezier .144659 .874902E-01 .167801 .895252E-01 .17907 .10668
+bezier .184863 .116261 .180561 .133174 .167005 .13081
+closepath
+! end of curve
+
+! start of curve
+amove .11176 .122555
+bezier .789024E-01 .104369 .469369E-01 .728992E-01 .04445 .033655
+bezier .453556E-01 .230047E-01 .577591E-01 .136372E-01 .06731 .020955
+bezier .857604E-01 .329279E-01 .955683E-01 .542333E-01 .1016 .07493
+aline .11303 .12065
+aline .113453 .12192
+aline .113157 .122809
+aline .112713 .123031
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=27 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.430555 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .09398 .153035
+bezier .110084 .153107 .120161 .137328 .123825 .12319
+bezier .137353 .142301 .164758 .161304 .18796 .146685
+bezier .213208 .126204 .198613 .831115E-01 .169545 .074295
+bezier .153768 .671896E-01 .136102 .653514E-01 .120015 .06604
+bezier .116409 .507469E-01 .116787 .296613E-01 .131445 .019685
+bezier .148576 .154845E-01 .167249 .246563E-01 .179705 .03683
+aline .18161 .037465
+aline .186055 .037465
+aline .189865 .03556
+bezier .199862 .251192E-01 .184806 .146615E-01 .17653 .009525
+bezier .156263 -.445088E-02 .121711 -.105444E-01 .107315 .014605
+aline .103505 .022225
+aline .102235 .026035
+aline .1016 .02667
+bezier .895564E-01 .770991E-02 .652522E-01 -.132552E-01 .042545 .00127
+bezier .198781E-01 .206825E-01 .237534E-01 .054425 .029845 .08001
+bezier .387346E-01 .10982 .553121E-01 .142703 .086995 .1524
+aline .092075 .1524
+aline .09271 .153035
+aline .09398 .153035
+closepath
+! end of curve
+
+! start of curve
+amove .0889 .13081
+bezier .06329 .115762 .541677E-01 .827006E-01 .048895 .05588
+bezier .484569E-01 .429354E-01 .470557E-01 .276808E-01 .05715 .01778
+bezier .076352 .187776E-01 .863488E-01 .394456E-01 .094615 .05461
+bezier .103578 .788211E-01 .113485 .107204 .09779 .130175
+aline .09652 .13081
+aline .095885 .131445
+aline .089535 .131445
+closepath
+! end of curve
+
+! start of curve
+amove .16637 .130175
+bezier .146439 .124781 .132405 .105219 .126365 .086995
+bezier .144659 .874902E-01 .167801 .895252E-01 .17907 .10668
+bezier .184863 .116261 .180561 .133174 .167005 .13081
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=28 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.541667 dep=.111112 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .193675 .19939
+bezier .204391 .196841 .203705 .183542 .196215 .1778
+bezier .186651 .16264 .173704 .147501 .165735 .132715
+bezier .191758 .852827E-01 .161751 .020421 .113665 0
+bezier .100178 -.546239E-02 .846596E-01 -.416298E-02 .07239 .00127
+bezier .060506 -.151608E-01 .498425E-01 -.329374E-01 .03683 -.04826
+bezier .268125E-01 -.543869E-01 .150992E-01 -.403739E-01 .023495 -.03175
+bezier .348474E-01 -.159039E-01 .461576E-01 -.274235E-04 .569913E-01 .161925E-01
+bezier .302306E-01 .644019E-01 .617691E-01 .131897 .112395 .150495
+bezier .124925 .154432 .138801 .153 .14986 .147955
+bezier .161347 .164576 .172804 .18122 .184785 .197485
+aline .187325 .198755
+aline .188595 .19939
+closepath
+! end of curve
+
+! start of curve
+amove .121285 .13081
+bezier .827826E-01 .120237 .580593E-01 .726496E-01 .06985 .03556
+bezier .838949E-01 .518712E-01 .970778E-01 .742858E-01 .111125 .09271
+bezier .119144 .105226 .129856 .118208 .136525 .130175
+aline .133985 .13081
+aline .13335 .131445
+aline .12192 .131445
+closepath
+! end of curve
+
+! start of curve
+amove .15113 .11303
+bezier .128789 .821512E-01 .107649 .504064E-01 .08509 .019685
+bezier .109059 .117671E-01 .132239 .332041E-01 .14351 .052705
+bezier .154045 .713658E-01 .161173 .943711E-01 .152083 .114141
+aline .151553 .113877
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=29 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .216535 .21336
+aline .21844 .212725
+aline .21971 .21209
+aline .22225 .20955
+aline .22352 .20701
+aline .224155 .205105
+aline .224155 .202565
+aline .215265 .167005
+bezier .212783 .15442 .192799 .158999 .196215 .17145
+aline .201057 .190818
+aline .20066 .192405
+aline .16129 .192405
+aline .143748 .122238
+aline .144145 .12065
+aline .18796 .12065
+bezier .197841 .118043 .197126 .102048 .187325 .099695
+aline .13843 .099695
+aline .137795 .098425
+aline .118745 .022225
+aline .118269 .212725E-01
+aline .118745 .02032
+aline .160655 .02032
+aline .16129 .02159
+aline .16891 .05207
+bezier .171702 .637039E-01 .190546 .594047E-01 .18796 .047625
+aline .1778 .006985
+aline .177165 .00508
+aline .17653 .00381
+aline .173355 .000635
+aline .172085 0
+aline .17018 -.000635
+aline .0889 -.000635
+aline .08509 .00127
+aline .08382 .00254
+aline .081915 .00635
+aline .081915 .01143
+aline .08255 .01397
+aline .08382 .01651
+aline .085725 .018415
+aline .089535 .02032
+aline .09779 .02032
+aline .098425 .02159
+aline .108585 .06223
+aline .10922 .062865
+aline .108585 .0635
+aline .070485 .0635
+bezier .637552E-01 .495335E-01 .561463E-01 .345854E-01 .051435 .02032
+bezier .064946 .240999E-01 .691326E-01 .272448E-02 .056515 -.000635
+aline .018415 -.000635
+bezier .785331E-02 .162863E-02 .898264E-02 .182257E-01 .01905 .02032
+aline .03048 .02032
+bezier .565005E-01 .772347E-01 .083453 .135855 .10795 .192405
+aline .10414 .192405
+aline .10033 .19431
+aline .098425 .196215
+aline .097155 .198755
+aline .097155 .205105
+aline .09779 .20701
+aline .09906 .20955
+aline .1016 .21209
+aline .10287 .212725
+aline .104775 .21336
+closepath
+! end of curve
+
+! start of curve
+amove .127635 .191135
+bezier .112054 .155675 .945439E-01 .119234 .08001 .084455
+aline .113665 .084455
+aline .1143 .08509
+aline .140732 .190818
+aline .140335 .192405
+aline .12827 .192405
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=30 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .131445 .21717
+aline .13208 .216535
+aline .13589 .216535
+aline .14224 .215265
+aline .142875 .21463
+aline .14605 .21463
+aline .146685 .213995
+aline .150495 .213995
+aline .15113 .21336
+aline .217805 .21336
+aline .21971 .212725
+aline .22098 .21209
+aline .22352 .20955
+aline .22479 .20701
+aline .225425 .205105
+aline .225425 .202565
+aline .216535 .167005
+bezier .214053 .15442 .194069 .158999 .197485 .17145
+aline .202327 .190818
+aline .20193 .192405
+aline .160655 .192405
+aline .143113 .122238
+aline .14351 .12065
+aline .189865 .12065
+bezier .199746 .118043 .199031 .102048 .18923 .099695
+aline .137795 .099695
+aline .13716 .098425
+aline .11811 .022225
+aline .117634 .212725E-01
+aline .11811 .02032
+aline .161925 .02032
+aline .16256 .02159
+aline .17018 .05207
+bezier .172972 .637039E-01 .191816 .594047E-01 .18923 .047625
+aline .17907 .006985
+aline .178435 .00508
+aline .1778 .00381
+aline .174625 .000635
+aline .173355 0
+aline .17145 -.000635
+aline .097155 -.000635
+bezier .762916E-01 -.475196E-02 .051484 -.833415E-02 .031115 .00254
+bezier .174706E-01 .014421 .234508E-01 .035683 .0254 .050165
+bezier .262569E-01 .620624E-01 .299073E-01 .743578E-01 .032385 .08636
+aline .04191 .12446
+bezier .509309E-01 .152856 .552684E-01 .186255 .078105 .20701
+bezier .940382E-01 .218073 .112882 .217039 .131445 .21717
+closepath
+! end of curve
+
+! start of curve
+amove .111125 .19558
+bezier .931724E-01 .196361 .782774E-01 .182216 .07366 .1651
+aline .06731 .14605
+aline .066675 .14351
+aline .06604 .141605
+aline .065405 .139065
+aline .06477 .13716
+aline .062865 .12954
+aline .06223 .127635
+aline .05334 .092075
+bezier .497415E-01 .696827E-01 .395558E-01 .478313E-01 .04699 .026035
+bezier .594778E-01 .140729E-01 .828554E-01 .120483E-01 .09525 .0254
+aline .099695 .03429
+aline .10033 .036195
+aline .100965 .037465
+aline .103505 .045085
+aline .10414 .047625
+aline .104775 .04953
+aline .13335 .16383
+bezier .135115 .173555 .141005 .190513 .127635 .194945
+aline .125095 .19558
+aline .12446 .196215
+aline .11176 .196215
+aline .111125 .19558
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=31 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.666667 dep=.0555553 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .19304 .243205
+bezier .201586 .242381 .205576 .231444 .19939 .225425
+aline .197485 .221615
+aline .19685 .22098
+aline .194945 .21717
+aline .19431 .216535
+aline .191929 .211773
+bezier .20271 .206803 .20691 .193268 .205105 .18288
+bezier .205097 .163407 .200585 .144778 .196215 .125095
+aline .187325 .089535
+bezier .17809 .600817E-01 .173112 .247563E-01 .14732 .00508
+bezier .135764 -.200282E-02 .122221 -.322117E-02 .109855 -.004445
+aline .07366 -.004445
+bezier .651352E-01 -.127407E-02 .638921E-01 -.148203E-01 .059055 -.019685
+bezier .570998E-01 -.297457E-01 .043435 -.348951E-01 .037465 -.0254
+bezier .03151 -.153886E-01 .467206E-01 -.665457E-02 .045085 .001905
+bezier .274214E-01 .125122E-01 .033271 .367903E-01 .03556 .052705
+aline .03556 .05588
+aline .036195 .056515
+aline .036195 .05969
+aline .0381 .069215
+aline .038735 .071755
+aline .040005 .078105
+aline .04191 .085725
+aline .042545 .0889
+aline .051435 .12446
+bezier .610258E-01 .154019 .657024E-01 .190805 .093345 .208915
+bezier .104486 .215211 .117247 .215803 .128905 .21717
+aline .1651 .21717
+aline .165735 .216535
+aline .17018 .216535
+bezier .176653 .225208 .178971 .238522 .18923 .243205
+closepath
+! end of curve
+
+! start of curve
+amove .127 .19558
+bezier .106206 .196969 .879079E-01 .181286 .08255 .16129
+aline .081915 .159385
+aline .08128 .158115
+aline .0762 .142875
+aline .075565 .140335
+aline .074295 .136525
+aline .07366 .133985
+aline .073025 .13208
+aline .07112 .12446
+aline .070485 .122555
+aline .062865 .092075
+bezier .591738E-01 .698584E-01 .487698E-01 .474539E-01 .05842 .026035
+aline .059055 .0254
+bezier .647443E-01 .284435E-01 .670945E-01 .387486E-01 .071755 .04445
+bezier .100356 .947489E-01 .128916 .145077 .158115 .194945
+aline .15621 .19558
+aline .155575 .196215
+aline .127635 .196215
+aline .127 .19558
+closepath
+! end of curve
+
+! start of curve
+amove .1778 .187325
+bezier .145639 .130807 .112287 .741304E-01 .810683E-01 .175683E-01
+bezier .103287 .154927E-01 .131106 .134204E-01 .146685 .03302
+bezier .157357 .499083E-01 .162159 .697857E-01 .16764 .0889
+aline .175895 .12192
+bezier .179628 .143062 .188261 .163532 .18161 .18415
+aline .180975 .184785
+aline .18034 .186055
+aline .179705 .18669
+aline .17907 .18796
+aline .178435 .188595
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=32 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.219444 dep=.111112 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .046355 .083185
+aline .047625 .08255
+aline .04953 .080645
+aline .050165 .07874
+aline .050165 .076835
+aline .023495 -.029845
+aline .230717E-01 -.031115
+aline .023495 -.032385
+aline .14605 -.032385
+aline .146685 -.03048
+aline .173355 .0762
+bezier .174611 .838656E-01 .189131 .866612E-01 .188595 .076835
+aline .159385 -.040005
+aline .158115 -.042545
+aline .15494 -.04572
+aline .15367 -.046355
+aline .151765 -.04699
+aline .009525 -.04699
+aline .008255 -.046355
+aline .006985 -.045085
+aline .005715 -.042545
+aline .005715 -.04064
+aline .034925 .0762
+aline .036195 .07874
+aline .03683 .079375
+aline .037465 .080645
+aline .038735 .08128
+aline .03937 .081915
+aline .04064 .08255
+aline .042545 .083185
+aline .046355 .083185
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=33 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .147955 .21717
+bezier .161392 .21476 .162873 .19885 .15748 .188595
+bezier .145647 .148063 .136164 .106422 .122555 .066675
+aline .121285 .06604
+aline .12065 .065405
+aline .11811 .064135
+aline .104775 .064135
+bezier .092032 .686328E-01 .10034 .839706E-01 .1016 .093345
+bezier .110717 .131327 .117215 .170439 .12827 .207645
+aline .128905 .208915
+aline .133985 .213995
+aline .139065 .216535
+aline .141605 .21717
+closepath
+! end of curve
+
+! start of curve
+amove .102235 .033655
+bezier .119268 .304102E-01 .117201 .546543E-02 .102235 .000635
+bezier .894218E-01 -.57657E-02 .752648E-01 .789297E-02 .080645 .020955
+aline .08255 .024765
+aline .08382 .026035
+aline .084455 .027305
+aline .085725 .028575
+aline .086995 .02921
+aline .088265 .03048
+aline .093345 .03302
+aline .095885 .033655
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=34 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .116205 .21717
+bezier .129194 .214756 .128765 .199233 .123825 .189865
+bezier .116219 .165957 .109638 .141631 .100965 .11811
+bezier .942869E-01 .109615 .787749E-01 .115868 .081915 .127
+bezier .878585E-01 .154113 .910124E-01 .182011 .098425 .208915
+aline .09906 .20955
+aline .099695 .21082
+aline .10287 .213995
+aline .10414 .21463
+aline .104775 .215265
+aline .106045 .2159
+aline .10795 .216535
+aline .109855 .21717
+closepath
+! end of curve
+
+! start of curve
+amove .17907 .21717
+aline .180975 .216535
+aline .184785 .21463
+bezier .196716 .203805 .184187 .187921 .182245 .17526
+bezier .174839 .155878 .171779 .134229 .161925 .116205
+bezier .153798 .110316 .1417 .1175 .14478 .127635
+bezier .151121 .154996 .153393 .183385 .161925 .210185
+aline .165735 .213995
+aline .167005 .21463
+aline .16764 .215265
+aline .16891 .2159
+aline .170815 .216535
+aline .17272 .21717
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=35 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .127 .21336
+bezier .138142 .210647 .138032 .197243 .132715 .18923
+bezier .1292 .178523 .123683 .166904 .121285 .156845
+aline .15621 .156845
+bezier .162489 .173808 .168595 .190842 .17526 .207645
+bezier .18236 .219812 .202379 .210755 .197485 .197485
+bezier .192797 .184078 .186317 .169657 .18288 .156845
+aline .198755 .156845
+bezier .211487 .154665 .211487 .134895 .198755 .132715
+aline .17272 .132715
+bezier .166789 .115401 .15899 .978194E-01 .154305 .080645
+aline .179705 .080645
+bezier .192437 .784655E-01 .192437 .586945E-01 .179705 .056515
+aline .144145 .056515
+bezier .137447 .392149E-01 .131436 .216302E-01 .12446 .004445
+bezier .117486 -.641372E-02 .099198 .142742E-02 .102235 .01397
+bezier .106864 .028123 .113615 .431561E-01 .117475 .056515
+aline .08255 .056515
+bezier .758517E-01 .392149E-01 .698405E-01 .216302E-01 .062865 .004445
+bezier .558912E-01 -.641372E-02 .037603 .142742E-02 .04064 .01397
+bezier .452689E-01 .028123 .520205E-01 .431561E-01 .05588 .056515
+aline .03937 .056515
+bezier .027043 .589457E-01 .027043 .782143E-01 .03937 .080645
+aline .065405 .080645
+bezier .723402E-01 .973987E-01 .079305 .116216 .084455 .132715
+aline .05842 .132715
+bezier .046093 .135146 .046093 .154414 .05842 .156845
+aline .094615 .156845
+bezier .100894 .173808 .107 .190842 .113665 .207645
+aline .117475 .211455
+aline .120015 .212725
+aline .12192 .21336
+closepath
+! end of curve
+
+! start of curve
+amove .11049 .13081
+bezier .104654 .114179 .972093E-01 .971731E-01 .09271 .080645
+aline .127 .080645
+bezier .133935 .973987E-01 .1409 .116216 .14605 .132715
+aline .111125 .132715
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=36 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .155575 .216535
+bezier .172264 .216759 .18526 .200621 .186055 .184785
+aline .186055 .170815
+aline .18542 .17018
+bezier .18772 .155965 .174349 .13833 .159385 .146685
+bezier .148769 .152872 .152513 .169355 .16256 .17399
+aline .16256 .1778
+aline .162941 .179705
+aline .16256 .18161
+aline .16256 .18669
+aline .161925 .187325
+bezier .159903 .200678 .143761 .193944 .137795 .187325
+bezier .129253 .180386 .123797 .170024 .12065 .159385
+aline .11049 .118745
+aline .110014 .117793
+aline .11049 .11684
+aline .13208 .11684
+bezier .141983 .114105 .141037 .098426 .131445 .095885
+aline .104775 .095885
+aline .09271 .047625
+aline .090805 .04191
+aline .09017 .04064
+aline .089535 .038735
+aline .08636 .032385
+aline .085725 .03175
+bezier .100206 .238788E-01 .122128 .104235E-01 .133985 .028575
+bezier .141151 .348158E-01 .139063 .477684E-01 .14859 .051435
+aline .15748 .051435
+bezier .171487 .466769E-01 .162497 .297072E-01 .156845 .02159
+bezier .144346 -.844801E-03 .115345 -.896388E-02 .09271 .00254
+aline .07366 .012065
+aline .073025 .0127
+bezier .063826 .810832E-02 .541578E-01 -.228656E-02 .04191 -.001905
+bezier .277083E-01 -.715707E-02 .134878E-01 .912228E-02 .02032 .02286
+bezier .270212E-01 .394743E-01 .485081E-01 .458248E-01 .064135 .040005
+aline .066675 .045085
+aline .06731 .04699
+aline .067945 .04826
+aline .069215 .05207
+aline .797719E-01 .942975E-01
+aline .079375 .095885
+aline .06604 .095885
+bezier .555284E-01 .980446E-01 .563606E-01 .114184 .06604 .11684
+aline .08509 .11684
+aline .085725 .11811
+aline .097155 .16383
+bezier .104511 .190308 .126874 .215881 .155575 .216535
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=37 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.694445 dep=.083333 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .104775 .24257
+bezier .125873 .238036 .127433 .21187 .12319 .194945
+bezier .117946 .17442 .104365 .148434 .08001 .149225
+bezier .589117E-01 .153759 .573516E-01 .179925 .061595 .19685
+bezier .665364E-01 .216077 .776529E-01 .237599 .098425 .24257
+closepath
+! end of curve
+
+! start of curve
+amove .20193 .24257
+bezier .213894 .239956 .213498 .224693 .20574 .217805
+bezier .152232 .136011 .100773 .527405E-01 .04572 -.02794
+bezier .344036E-01 -.362682E-01 .201136E-01 -.019454 .029845 -.009525
+bezier .841891E-01 .737582E-01 .136839 .158263 .192405 .240665
+aline .194945 .241935
+aline .19685 .24257
+aline .20193 .24257
+closepath
+! end of curve
+
+! start of curve
+amove .09906 .22098
+bezier .083818 .211306 .756424E-01 .189126 .08128 .172085
+bezier .880799E-01 .167589 .940807E-01 .178107 .09779 .18288
+bezier .103342 .194377 .109693 .209425 .102235 .22098
+aline .100648 .221377
+closepath
+! end of curve
+
+! start of curve
+amove .15875 .062865
+bezier .180622 .574799E-01 .181107 .295252E-01 .175895 .012065
+bezier .170077 -.826194E-02 .153663 -.354408E-01 .128905 -.028575
+bezier .107661 -.166115E-01 .111762 .126619E-01 .120015 .03175
+bezier .125977 .454199E-01 .136271 .596192E-01 .151765 .062865
+closepath
+! end of curve
+
+! start of curve
+amove .153035 .041275
+bezier .137268 .319716E-01 .1286 .931286E-02 .135255 -.00762
+bezier .142067 -.105301E-01 .147385 -.147278E-02 .15113 .003175
+bezier .157081 .150716E-01 .162874 .291892E-01 .15621 .041275
+aline .154623 .416719E-01
+aline .153035 .041275
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=38 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .114935 .21717
+bezier .133866 .216431 .153645 .198003 .14605 .1778
+bezier .141753 .164424 .120517 .162256 .116205 .17653
+aline .116205 .18415
+aline .11684 .186055
+aline .118745 .189865
+aline .120015 .191135
+aline .120491 .192088
+bezier .103596 .204072 .834209E-01 .186308 .07493 .17145
+bezier .704022E-01 .162123 .649601E-01 .151451 .066675 .141605
+bezier .808302E-01 .151555 .107436 .155899 .1143 .135255
+bezier .120931 .111994 .969055E-01 .866285E-01 .07366 .09525
+bezier .674089E-01 .961758E-01 .623071E-01 .101559 .05715 .10287
+bezier .427523E-01 .829963E-01 .318492E-01 .503466E-01 .05461 .032385
+bezier .856082E-01 .811481E-02 .131768 .012731 .16256 .03556
+bezier .187184 .584287E-01 .200032 .968338E-01 .18542 .127635
+aline .184785 .12827
+bezier .175018 .124834 .15804 .116673 .161925 .103505
+bezier .164977 .937325E-01 .178181 .104828 .182245 .09525
+bezier .19059 .854062E-01 .176715 .717727E-01 .16637 .076835
+bezier .142458 .770156E-01 .128845 .107806 .14351 .126365
+bezier .158905 .147115 .189216 .151771 .20066 .17653
+aline .20574 .18669
+aline .206375 .188595
+aline .20701 .189865
+aline .210185 .19939
+bezier .209652 .212327 .229004 .219526 .234315 .206375
+bezier .235306 .18833 .224532 .170989 .215265 .15621
+aline .213995 .15494
+aline .21336 .15367
+aline .211455 .151765
+aline .21082 .150495
+aline .203835 .14351
+bezier .223293 .114134 .216072 .760935E-01 .20066 .046355
+bezier .173527 -.196683E-02 .10842 -.152086E-01 .05969 .003175
+bezier .295673E-01 .141598E-01 .925212E-02 .480092E-01 .02032 .079375
+bezier .244795E-01 .962899E-01 .346885E-01 .110859 .044196 .12446
+bezier .337074E-01 .167314 .684538E-01 .219933 .114935 .21717
+closepath
+! end of curve
+
+! start of curve
+amove .09017 .12827
+aline .086995 .127635
+aline .083185 .126365
+aline .078105 .123825
+aline .07747 .12319
+aline .0762 .122555
+bezier .688831E-01 .119205 .793968E-01 .116301 .08255 .114935
+bezier .890387E-01 .114289 .922903E-01 .124334 .911225E-01 .128746
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=39 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .14732 .21336
+bezier .167568 .209615 .16804 .185156 .163195 .169545
+bezier .154695 .140913 .133289 .117069 .106045 .10541
+bezier .956347E-01 .102916 .881842E-01 .119009 .09779 .12446
+bezier .119695 .134651 .13923 .15466 .142875 .17907
+bezier .128123 .17588 .118577 .195001 .12827 .20574
+aline .13208 .20955
+aline .13335 .210185
+aline .133985 .21082
+aline .136525 .21209
+aline .13843 .212725
+aline .14097 .21336
+aline .14732 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=40 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.694445 dep=.0833311 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .205105 .24257
+bezier .215 .23985 .213896 .225424 .20447 .222885
+bezier .140548 .188097 .928257E-01 .108954 .11176 .03683
+bezier .117289 .160529E-01 .130441 -.139502E-02 .14732 -.01397
+bezier .154888 -.242376E-01 .13893 -.348167E-01 .13081 -.02667
+bezier .085059 .494394E-02 .746799E-01 .676528E-01 .090805 .117475
+bezier .108066 .171789 .147915 .217798 .198755 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=")" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.694445 dep=.0833311 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .103505 .24257
+bezier .148824 .215605 .162628 .155961 .15113 .108585
+bezier .13685 .486416E-01 .944292E-01 -.230614E-02 .040005 -.02921
+bezier .029731 -.325667E-01 .215241E-01 -.190278E-01 .029845 -.012065
+bezier .989772E-01 .239689E-01 .15167 .110618 .12319 .187325
+bezier .116903 .204651 .103073 .217033 .09017 .229235
+aline .089535 .23114
+aline .089535 .23495
+aline .09017 .236855
+aline .090805 .238125
+aline .09398 .2413
+aline .09525 .241935
+aline .097155 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="*" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.520834 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .140335 .18161
+aline .14224 .180975
+aline .14351 .18034
+aline .145415 .178435
+bezier .148906 .166736 .140956 .154602 .139065 .142875
+aline .13716 .135255
+aline .136525 .13335
+aline .135255 .12827
+aline .13462 .126365
+aline .134144 .125413
+aline .134408 .124883
+aline .134938 .124619
+aline .14478 .12954
+aline .145415 .130175
+aline .163195 .139065
+aline .16383 .1397
+aline .18288 .149225
+bezier .193667 .153838 .200014 .138656 .19177 .13208
+bezier .176069 .121776 .157291 .115782 .141129 .106363
+bezier .152714 .966194E-01 .168878 .911814E-01 .17907 .08001
+bezier .182127 .669757E-01 .16338 .056553 .15494 .067945
+bezier .144752 .741786E-01 .135389 .825689E-01 .125024 .879122E-01
+bezier .120621 .711755E-01 .118427 .536271E-01 .112395 .037465
+aline .108585 .033655
+aline .104775 .03175
+aline .10287 .031115
+aline .09779 .031115
+bezier .871373E-01 .350108E-01 .933093E-01 .469633E-01 .09525 .05461
+aline .097155 .06223
+aline .09779 .064135
+aline .09906 .069215
+aline .099695 .07112
+aline .100965 .0762
+aline .1016 .078105
+aline .103505 .085725
+aline .103928 .086995
+aline .103505 .088265
+aline .10287 .08763
+aline .08382 .078105
+aline .083185 .07747
+aline .065405 .06858
+bezier .592591E-01 .637583E-01 .463785E-01 .586657E-01 .04318 .069215
+bezier .414654E-01 .837289E-01 .587426E-01 .086745 .06858 .092075
+aline .08128 .098425
+aline .083185 .09906
+aline .094615 .104775
+bezier .101442 .10659 .910863E-01 .110079 .0889 .112395
+bezier .792212E-01 .11896 .677331E-01 .123654 .05969 .13208
+bezier .552749E-01 .1455 .749913E-01 .156213 .08382 .14478
+bezier .935964E-01 .138271 .103254 .130221 .113242 .124883
+bezier .118447 .141829 .119451 .160522 .127 .17653
+aline .12827 .1778
+aline .12954 .178435
+aline .13081 .179705
+aline .13335 .180975
+aline .13589 .18161
+closepath
+! end of curve
+
+! start of curve
+amove .103505 .088265
+aline .10414 .08763
+aline .104775 .088265
+aline .10414 .0889
+aline .103505 .088265
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="+" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.530554 dep=-.0805569 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .139065 .18542
+aline .14097 .184785
+aline .14224 .18415
+aline .142875 .183515
+aline .144145 .18288
+aline .14605 .180975
+aline .147955 .177165
+aline .14859 .174625
+aline .14859 .172085
+aline .13589 .121285
+aline .135467 .120015
+aline .13589 .118745
+aline .18796 .118745
+bezier .200692 .116565 .200692 .967945E-01 .18796 .094615
+aline .12954 .094615
+aline .128905 .093345
+aline .114935 .037465
+bezier .112278 .224085E-01 .877709E-01 .267634E-01 .090805 .04191
+aline .09144 .045085
+aline .103505 .093345
+aline .10414 .09398
+aline .103505 .094615
+aline .050165 .094615
+bezier .037838 .970457E-01 .037838 .116314 .050165 .118745
+aline .109855 .118745
+aline .123825 .174625
+aline .125095 .178435
+aline .12573 .179705
+aline .12954 .183515
+aline .13208 .184785
+aline .133985 .18542
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="," !-------------- Beginning of new char.
+dfont wid=.524996 hei=.125 dep=.138888 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .104775 .042545
+bezier .125888 .039478 .1294 .130641E-01 .121285 -.003175
+bezier .11086 -.265706E-01 .891051E-01 -.468057E-01 .062865 -.04953
+bezier .051723 -.467854E-01 .522053E-01 -.293604E-01 .064135 -.028575
+bezier .786387E-01 -.246772E-01 .929107E-01 -.133569E-01 .098425 -.000635
+bezier .834411E-01 -.391467E-02 .713229E-01 .124046E-01 .07747 .026035
+aline .08001 .031115
+aline .08128 .032385
+aline .081915 .033655
+aline .085725 .037465
+aline .086995 .0381
+aline .08763 .038735
+aline .09271 .041275
+aline .094615 .04191
+aline .097155 .042545
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="-" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.530554 dep=-.0805569 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .18161 .118745
+bezier .194342 .116565 .194342 .967945E-01 .18161 .094615
+aline .056515 .094615
+bezier .044188 .970457E-01 .044188 .116314 .056515 .118745
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="." !-------------- Beginning of new char.
+dfont wid=.524996 hei=.125 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .104775 .042545
+bezier .123495 .397733E-01 .124661 .130704E-01 .109855 .004445
+bezier .097428 -.772765E-02 .726477E-01 .266889E-02 .0762 .020955
+bezier .779278E-01 .318713E-01 .869448E-01 .406536E-01 .09779 .042545
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="/" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.694445 dep=.0833311 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .21209 .24257
+bezier .224146 .239979 .223853 .224165 .215265 .217805
+bezier .15546 .135821 .966447E-01 .531223E-01 .03556 -.02794
+bezier .023858 -.365534E-01 .942968E-02 -.018414 .02032 -.00889
+bezier .809997E-01 .743445E-01 .141046 .158036 .202565 .240665
+aline .205105 .241935
+aline .20701 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="0" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .1524 .21717
+bezier .180597 .214064 .195602 .183252 .197485 .158115
+bezier .20072 .968069E-01 .171002 .280489E-01 .113665 0
+bezier .910231E-01 -.010821 .619654E-01 -.204014E-02 .0508 .020955
+bezier .286524E-01 .689797E-01 .453156E-01 .124857 .073025 .16764
+bezier .915582E-01 .192912 .118554 .219448 .1524 .21717
+closepath
+! end of curve
+
+! start of curve
+amove .13716 .19558
+bezier .102525 .187218 .836468E-01 .151177 .073025 .11938
+bezier .641982E-01 .877334E-01 .579775E-01 .516165E-01 .079375 .023495
+bezier .978143E-01 .704362E-02 .123036 .023634 .135255 .040005
+bezier .161969 .725108E-01 .177367 .116843 .17399 .158115
+bezier .1714 .175997 .159439 .198957 .137795 .196215
+aline .13716 .19558
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="1" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .15367 .216535
+aline .155575 .2159
+aline .156845 .215265
+aline .16002 .21209
+aline .160655 .21082
+aline .16129 .208915
+aline .16129 .205105
+aline .12065 .042545
+aline .11557 .022225
+aline .115094 .212725E-01
+aline .11557 .02032
+aline .15113 .02032
+bezier .161298 .179655E-01 .16016 .148407E-02 .150495 -.000635
+aline .04953 -.000635
+bezier .389962E-01 .157444E-02 .400413E-01 .175777E-01 .04953 .02032
+aline .09017 .02032
+aline .090805 .02159
+aline .126365 .16383
+aline .126841 .164783
+bezier .118983 .162534 .109528 .154879 .099695 .15367
+bezier .918675E-01 .152055 .797039E-01 .15045 .078105 .16129
+bezier .077143 .171381 .087047 .175207 .09525 .17399
+bezier .117288 .179772 .13253 .197758 .145415 .215265
+aline .146685 .2159
+aline .14859 .216535
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="2" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .14224 .21717
+bezier .17059 .215406 .198081 .194043 .201295 .164465
+bezier .205965 .130677 .180987 .10205 .1524 .088265
+bezier .121942 .070639 .848434E-01 .636871E-01 .061595 .03556
+bezier .879073E-01 .349216E-01 .113735 .164359E-01 .1397 .01905
+bezier .161239 .227681E-01 .172836 .439982E-01 .17907 .062865
+aline .18034 .064135
+aline .18415 .06604
+aline .19304 .06604
+aline .19685 .064135
+aline .198755 .06223
+bezier .203704 .496893E-01 .193143 .366211E-01 .187325 .026035
+bezier .170894 .632695E-03 .137835 -.116306E-01 .10922 -.000635
+bezier .909611E-01 .458497E-02 .728178E-01 .162953E-01 .053975 .013335
+aline .050165 .01143
+aline .04572 .006985
+aline .04445 .004445
+bezier .429644E-01 -.101907E-01 .153739E-01 -.63069E-02 .020955 .00889
+bezier .340105E-01 .056407 .787107E-01 .835691E-01 .122555 .09906
+bezier .145236 .110085 .173315 .123262 .1778 .150495
+bezier .181318 .173298 .162636 .195376 .1397 .19558
+bezier .107964 .199353 .758822E-01 .174522 .067945 .14351
+aline .06731 .142875
+aline .06604 .14224
+aline .065405 .141605
+aline .064135 .14097
+aline .05334 .14097
+aline .0508 .14224
+bezier .412476E-01 .152244 .052235 .167043 .057785 .17653
+bezier .076297 .203669 .109738 .21969 .14224 .21717
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="3" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .1524 .21717
+bezier .179486 .216179 .209251 .192786 .20447 .16383
+bezier .202799 .138224 .181379 .118748 .159385 .108585
+bezier .190557 .847306E-01 .182759 .325798E-01 .149225 .014605
+bezier .118702 -.479531E-02 .773354E-01 -.131498E-01 .045085 .00635
+bezier .276652E-01 .176922E-01 .191113E-01 .047676 .036195 .06223
+bezier .464256E-01 .069891 .622763E-01 .604576E-01 .059055 .047625
+aline .057785 .043815
+aline .05715 .042545
+aline .056515 .04191
+aline .05588 .04064
+aline .052705 .037465
+aline .519995E-01 .371122E-01
+bezier .522678E-01 .023838 .681987E-01 .183393E-01 .07874 .01651
+bezier .106753 .015746 .142148 .257936E-01 .15367 .05461
+bezier .161634 .741936E-01 .146288 .100126 .123825 .099695
+aline .12319 .10033
+aline .097155 .10033
+bezier .086656 .102602 .883392E-01 .119726 .098425 .121285
+bezier .125956 .119087 .1573 .123406 .17399 .147955
+bezier .186493 .16216 .18248 .185543 .16383 .192405
+bezier .139676 .200923 .109329 .194607 .09144 .17526
+bezier .862803E-01 .17002 .876307E-01 .159741 .079375 .15748
+aline .06985 .15748
+bezier .557175E-01 .163786 .669233E-01 .180848 .073025 .18923
+bezier .926998E-01 .211616 .124069 .218407 .1524 .21717
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="4" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=.222223 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .156845 .21717
+bezier .172124 .212845 .16366 .195129 .160655 .184785
+bezier .142577 .123649 .105682 .681865E-01 .060325 .02667
+bezier .786034E-01 .270868E-01 .969857E-01 .210698E-01 .1143 .014605
+aline .114935 .01651
+aline .127635 .06731
+bezier .131133 .805048E-01 .153521 .771758E-01 .15113 .062865
+aline .13843 .012065
+aline .138007 .010795
+bezier .148364 .575531E-02 .160638 .149356E-01 .172085 .01524
+bezier .182942 .128499E-01 .183078 -.438893E-02 .17145 -.005715
+aline .17018 -.00635
+aline .16256 -.00889
+aline .15748 -.01016
+aline .154305 -.010795
+aline .150495 -.010795
+aline .14986 -.01143
+aline .135255 -.01143
+aline .133668 -.110331E-01
+aline .132588 -.011303
+aline .11811 -.069215
+bezier .115926 -.080803 .977778E-01 -.823353E-01 .094615 -.070485
+aline .094615 -.06477
+aline .108982 -.73025E-02
+aline .108585 -.005715
+bezier .825073E-01 .430755E-02 .546733E-01 .962691E-02 .02794 .003175
+bezier .197151E-01 -.70695E-02 .257494E-02 .497555E-02 .01016 .015875
+bezier .776198E-01 .593892E-01 .123766 .130635 .142875 .208915
+aline .144145 .211455
+aline .14478 .21209
+aline .145415 .21336
+aline .146685 .21463
+aline .150495 .216535
+aline .1524 .21717
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="5" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .197485 .21336
+bezier .208047 .211096 .206917 .194499 .19685 .192405
+aline .10414 .192405
+aline .103505 .1905
+aline .878681E-01 .127953
+aline .088265 .126365
+bezier .116345 .139878 .156981 .14104 .175895 .11176
+bezier .197979 .753095E-01 .174195 .284035E-01 .1397 .009525
+bezier .109124 -.814438E-02 .653796E-01 -.125518E-01 .03937 .01524
+bezier .281173E-01 .288288E-01 .247223E-01 .569015E-01 .043815 .06477
+bezier .572559E-01 .698379E-01 .680248E-01 .527442E-01 .05969 .04191
+bezier .487874E-01 .349483E-01 .619225E-01 .231981E-01 .06985 .02032
+bezier .113394 .274388E-02 .174683 .049245 .15748 .097155
+bezier .147985 .11797 .122128 .116494 .10414 .11049
+bezier .913226E-01 .107563 .822863E-01 .978867E-01 .071755 .09144
+aline .064135 .09144
+aline .061595 .09271
+aline .06096 .093345
+aline .05969 .09398
+aline .059055 .09525
+aline .05842 .095885
+aline .05715 .098425
+aline .05715 .103505
+aline .08255 .205105
+aline .083185 .20701
+aline .084455 .20955
+aline .086995 .21209
+aline .088265 .212725
+aline .09017 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="6" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .17272 .21717
+bezier .190349 .216772 .209381 .202563 .20574 .18288
+bezier .205917 .168408 .186095 .158953 .17653 .170815
+aline .174625 .174625
+aline .17399 .177165
+aline .17399 .18161
+aline .174625 .18415
+aline .17653 .18796
+aline .177165 .188595
+aline .1778 .189865
+aline .17907 .191135
+aline .179546 .192088
+bezier .158306 .203329 .131542 .188967 .113665 .17526
+bezier .967649E-01 .1607 .809157E-01 .140352 .752475E-01 .120174
+bezier .10296 .139631 .146738 .147653 .17145 .11938
+bezier .200152 .857349E-01 .179169 .329639E-01 .14478 .012065
+bezier .11686 -.010051 .675616E-01 -.013182 .047625 .020955
+bezier .319209E-01 .550014E-01 .404652E-01 .921862E-01 .051435 .126365
+bezier .706827E-01 .175357 .117062 .220135 .17272 .21717
+closepath
+! end of curve
+
+! start of curve
+amove .117475 .11557
+bezier .908507E-01 .112265 .634561E-01 .905003E-01 .0635 .06223
+aline .06223 .06096
+bezier .619763E-01 .435839E-01 .068256 .188785E-01 .089535 .017145
+bezier .12929 .012212 .172306 .057428 .158115 .097155
+bezier .151634 .113099 .133097 .119237 .117475 .11557
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="7" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=.222223 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .083185 .21717
+aline .08509 .216535
+aline .08636 .2159
+aline .0889 .21336
+aline .09017 .21082
+aline .091313 .207391
+bezier .109297 .214022 .131814 .223408 .14986 .21209
+bezier .15865 .206274 .16192 .188842 .174625 .19304
+bezier .190887 .194301 .204208 .205287 .215265 .216535
+aline .21717 .21717
+aline .22606 .21717
+bezier .236748 .213812 .233466 .200645 .22606 .19558
+bezier .20394 .167337 .183833 .137644 .16637 .106045
+aline .1524 .078105
+bezier .140652 .532526E-01 .132705 .267461E-01 .12446 .000635
+bezier .118081 -.955246E-02 .100111 -.342537E-02 .10287 .00889
+bezier .116937 .679377E-01 .147468 .122826 .17907 .172085
+bezier .165305 .168558 .149949 .174596 .142875 .187325
+bezier .133631 .200653 .117155 .191563 .104775 .18796
+bezier .832964E-01 .179266 .678403E-01 .16083 .05588 .14224
+aline .055245 .141605
+aline .053975 .14097
+aline .04318 .14097
+aline .04064 .14224
+aline .0381 .14478
+aline .03683 .14732
+aline .03683 .153035
+bezier .478854E-01 .173896 .582474E-01 .195256 .070485 .215265
+aline .073025 .216535
+aline .074295 .21717
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="8" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .154305 .21717
+bezier .180251 .216753 .210229 .19516 .205105 .167005
+bezier .2023 .138787 .174097 .12237 .149225 .114935
+bezier .172831 .108435 .191904 .840769E-01 .18415 .059055
+bezier .166941 .532584E-02 .926085E-01 -.241987E-01 .046355 .01016
+bezier .238227E-01 .283491E-01 .251542E-01 .642604E-01 .043815 .084455
+bezier .571235E-01 .993397E-01 .747264E-01 .109543 .09398 .114935
+bezier .704244E-01 .120266 .514269E-01 .146322 .064135 .169545
+bezier .804025E-01 .202297 .118989 .219559 .154305 .21717
+closepath
+! end of curve
+
+! start of curve
+amove .13462 .19558
+bezier .111064 .193979 .801085E-01 .175237 .08509 .14859
+bezier .093101 .124113 .124851 .121945 .145415 .128905
+bezier .166684 .134667 .191223 .158298 .177165 .180975
+bezier .16736 .193616 .149504 .198004 .13462 .19558
+closepath
+! end of curve
+
+! start of curve
+amove .11684 .10414
+bezier .086426 .104288 .492945E-01 .784116E-01 .05461 .045085
+bezier .605745E-01 .179664E-01 .945014E-01 .011647 .11684 .019685
+bezier .144979 .267564E-01 .174002 .592534E-01 .15621 .08763
+bezier .147332 .996552E-01 .131219 .105161 .11684 .10414
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="9" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .153035 .21717
+bezier .17943 .215105 .199132 .18953 .198755 .16383
+bezier .204072 .944619E-01 .163751 .118896E-01 .09017 -.00381
+bezier .703898E-01 -.564448E-02 .042211 -.547653E-02 .033655 .017145
+aline .03302 .019685
+aline .03302 .031115
+bezier .331162E-01 .474209E-01 .590211E-01 .540178E-01 .064135 .037465
+aline .064135 .029845
+aline .0635 .02794
+aline .061595 .02413
+aline .05842 .020955
+bezier .930403E-01 .563648E-02 .130132 .344191E-01 .14859 .062865
+bezier .154428 .719741E-01 .161408 .820651E-01 .163195 .09271
+bezier .135869 .733995E-01 .940872E-01 .655912E-01 .06858 .09144
+bezier .371904E-01 .125152 .589633E-01 .180494 .09525 .201295
+bezier .111898 .213772 .132719 .218402 .153035 .21717
+closepath
+! end of curve
+
+! start of curve
+amove .139065 .19558
+bezier .102767 .19213 .674801E-01 .152272 .08001 .116205
+bezier .846533E-01 .106407 .933771E-01 .983953E-01 .10414 .09652
+bezier .136423 .929414E-01 .174418 .116038 .17526 .150495
+bezier .178466 .168294 .170711 .19378 .14986 .196215
+aline .1397 .196215
+aline .139065 .19558
+closepath
+! end of curve
+
+! start of curve
+amove .163195 .09271
+aline .16383 .092075
+aline .164465 .09271
+aline .16383 .093345
+aline .163195 .09271
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=":" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.430555 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .131445 .14986
+bezier .151166 .147067 .15106 .118653 .135255 .11049
+bezier .121155 .993014E-01 .975742E-01 .112672 .103505 .13081
+aline .10414 .132715
+aline .10668 .137795
+aline .107315 .13843
+aline .10795 .1397
+aline .11303 .14478
+aline .1143 .145415
+aline .114935 .14605
+aline .120015 .14859
+aline .12192 .149225
+aline .12446 .14986
+closepath
+! end of curve
+
+! start of curve
+amove .104775 .042545
+bezier .123495 .397733E-01 .124661 .130704E-01 .109855 .004445
+bezier .097428 -.772765E-02 .726477E-01 .266889E-02 .0762 .020955
+bezier .779278E-01 .318713E-01 .869448E-01 .406536E-01 .09779 .042545
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=";" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.430555 dep=.138888 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .131445 .14986
+bezier .151166 .147067 .15106 .118653 .135255 .11049
+bezier .121155 .993014E-01 .975742E-01 .112672 .103505 .13081
+aline .10414 .132715
+aline .10668 .137795
+aline .107315 .13843
+aline .10795 .1397
+aline .11303 .14478
+aline .1143 .145415
+aline .114935 .14605
+aline .120015 .14859
+aline .12192 .149225
+aline .12446 .14986
+closepath
+! end of curve
+
+! start of curve
+amove .104775 .042545
+bezier .125012 .376187E-01 .121715 .117065E-01 .11557 -.003175
+bezier .105889 -.249458E-01 .870062E-01 -.455993E-01 .062865 -.04953
+bezier .524656E-01 -.468964E-01 .051747 -.307599E-01 .062865 -.028575
+bezier .758889E-01 -.234606E-01 .862307E-01 -.130371E-01 .093345 -.00127
+bezier .761767E-01 -.504371E-04 .708703E-01 .022252 .081915 .033655
+aline .085725 .037465
+aline .086995 .0381
+aline .08763 .038735
+aline .09271 .041275
+aline .094615 .04191
+aline .097155 .042545
+aline .104775 .042545
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="<" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.555555 dep=-.0555553 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .198755 .194945
+bezier .211823 .194769 .214509 .175064 .202565 .170815
+bezier .162554 .149024 .122089 .12759 .827088E-01 .105093
+bezier .111153 .810017E-01 .143711 .611624E-01 .17145 .036195
+bezier .178301 .02306 .158211 .116841E-01 .14986 .023495
+bezier .116279 .484923E-01 .826374E-01 .734056E-01 .04953 .09906
+bezier .424007E-01 .108433 .513832E-01 .118308 .060325 .121285
+bezier .106279 .145392 .151015 .172175 .197485 .194945
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="=" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.415624 dep=-.195488 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .194945 .145415
+bezier .207475 .143244 .207475 .123456 .194945 .121285
+aline .05715 .121285
+bezier .445824E-01 .12348 .445824E-01 .143219 .05715 .145415
+closepath
+! end of curve
+
+! start of curve
+amove .18161 .092075
+bezier .19414 .089904 .19414 .070116 .18161 .067945
+aline .043815 .067945
+bezier .312474E-01 .701405E-01 .312474E-01 .898795E-01 .043815 .092075
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=">" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.555555 dep=-.0555553 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .07874 .194945
+bezier .965071E-01 .187398 .110084 .172239 .126365 .161925
+bezier .14731 .144684 .171086 .130716 .1905 .11176
+bezier .195639 .978639E-01 .179102 .931736E-01 .17018 .08763
+bezier .126906 .650682E-01 .850646E-01 .398267E-01 .041275 .018415
+bezier .283154E-01 .170746E-01 .228385E-01 .365936E-01 .034925 .04191
+bezier .754018E-01 .638541E-01 .116113 .857489E-01 .156051 .108268
+bezier .127532 .131621 .963319E-01 .152052 .067945 .175895
+aline .066675 .178435
+aline .06604 .180975
+aline .06604 .18415
+aline .066675 .18669
+aline .067945 .18923
+aline .071755 .19304
+aline .073025 .193675
+aline .07493 .19431
+aline .07747 .194945
+aline .07874 .194945
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="?" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .151765 .21717
+bezier .177659 .216473 .204301 .19209 .19558 .164465
+bezier .184668 .130626 .146639 .121906 .120015 .10414
+aline .116205 .102235
+aline .11557 .1016
+aline .1143 .100965
+aline .11049 .097155
+aline .108585 .093345
+aline .10795 .09271
+aline .10795 .086995
+bezier .115679 .820324E-01 .127099 .880434E-01 .13335 .09398
+aline .135255 .09779
+bezier .137519 .111443 .163088 .107988 .15875 .093345
+bezier .150837 .069297 .118741 .573326E-01 .09652 .067945
+bezier .756886E-01 .826052E-01 .874158E-01 .115929 .108585 .123825
+bezier .128592 .136899 .152924 .144554 .169545 .161925
+bezier .179555 .172854 .173516 .190164 .159385 .193675
+bezier .136492 .200241 .10748 .193355 .915988E-01 .174308
+bezier .101017 .158938 .763378E-01 .141157 .065405 .155575
+bezier .573724E-01 .166119 .669917E-01 .179576 .073025 .188595
+bezier .925659E-01 .21072 .123496 .218599 .151765 .21717
+closepath
+! end of curve
+
+! start of curve
+amove .102235 .033655
+bezier .119268 .304102E-01 .117201 .546543E-02 .102235 .000635
+bezier .894218E-01 -.57657E-02 .752648E-01 .789297E-02 .080645 .020955
+aline .08255 .024765
+aline .08382 .026035
+aline .084455 .027305
+aline .085725 .028575
+aline .086995 .02921
+aline .088265 .03048
+aline .093345 .03302
+aline .095885 .033655
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="@" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .1651 .215265
+bezier .187178 .213707 .203294 .192305 .203835 .17145
+bezier .204346 .137239 .198597 .101667 .180975 .07112
+bezier .167193 .048521 .136861 .258511E-01 .11049 .042545
+bezier .845883E-01 .632783E-01 .896963E-01 .101169 .1016 .12827
+bezier .113749 .154132 .14027 .183465 .172085 .17399
+aline .178435 .170815
+aline .17907 .17018
+aline .18034 .169545
+aline .182245 .16764
+aline .183198 .167164
+bezier .186295 .178642 .175253 .193418 .16256 .19431
+bezier .995865E-01 .193104 .506824E-01 .123451 .05969 .064135
+bezier .624636E-01 .033392 .951418E-01 .109258E-01 .123825 .02032
+bezier .136332 .228064E-01 .146494 .030247 .156845 .03683
+aline .168275 .03683
+bezier .17853 .338005E-01 .176544 .198655E-01 .16764 .01651
+bezier .134935 -.79115E-02 .809946E-01 -.012296 .055245 .02413
+bezier .226314E-01 .705402E-01 .426764E-01 .134275 .07747 .17399
+bezier .997585E-01 .1984 .1314 .217444 .1651 .215265
+closepath
+! end of curve
+
+! start of curve
+amove .155575 .154305
+bezier .124561 .144673 .107748 .106216 .112395 .076835
+bezier .113586 .632317E-01 .127854 .525858E-01 .140335 .060325
+bezier .169096 .752141E-01 .186123 .114565 .174625 .14478
+aline .17399 .145415
+aline .17272 .147955
+aline .16891 .151765
+aline .16764 .1524
+aline .167005 .153035
+aline .163195 .154305
+aline .16256 .15494
+aline .15621 .15494
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="A" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .15494 .217805
+aline .156845 .21717
+aline .159385 .2159
+aline .160655 .21463
+aline .161925 .21209
+aline .16256 .210185
+aline .16256 .19812
+aline .161925 .197485
+aline .161925 .16256
+aline .16129 .161925
+aline .16129 .127635
+aline .160655 .127
+aline .160655 .092075
+aline .16002 .09144
+aline .16002 .05715
+aline .159385 .056515
+aline .159385 .02159
+aline .15875 .020955
+aline .159385 .02032
+aline .17018 .02032
+aline .17399 .018415
+aline .175895 .01651
+aline .177165 .01397
+aline .177165 .00762
+aline .17653 .005715
+aline .17526 .003175
+aline .17272 .000635
+aline .17145 0
+aline .169545 -.000635
+aline .11938 -.000635
+bezier .108818 .162863E-02 .109948 .182257E-01 .120015 .02032
+aline .133985 .02032
+aline .135255 .02159
+aline .135255 .05461
+aline .135678 .05588
+aline .135255 .05715
+aline .07874 .05715
+aline .078105 .056515
+aline .074295 .048895
+aline .07366 .04699
+aline .06604 .03175
+aline .065405 .029845
+aline .611188E-01 .212725E-01
+aline .061595 .02032
+aline .07112 .02032
+bezier .810013E-01 .177131E-01 .802864E-01 .171829E-02 .070485 -.000635
+aline .02032 -.000635
+bezier .98688E-02 .144085E-02 .105489E-01 .177918E-01 .02032 .02032
+aline .036195 .02032
+bezier .669623E-01 .837649E-01 .972312E-01 .147607 .12827 .21082
+aline .13208 .21463
+aline .13335 .215265
+aline .133985 .2159
+aline .136525 .21717
+aline .139065 .217805
+closepath
+! end of curve
+
+! start of curve
+amove .139065 .18796
+bezier .124144 .150818 .104569 .113823 .0889 .078105
+aline .135255 .078105
+bezier .138142 .114652 .136716 .152986 .140335 .18923
+aline .1397 .189865
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="B" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .163195 .21336
+bezier .181997 .211982 .200379 .198075 .2032 .178435
+bezier .207261 .147187 .181443 .120284 .153035 .11176
+bezier .177573 .106487 .191955 .796643E-01 .18415 .056515
+bezier .175267 .265325E-01 .147685 .296997E-02 .11684 -.000635
+aline .01905 -.000635
+bezier .851618E-02 .157444E-02 .956134E-02 .175777E-01 .01905 .02032
+aline .037465 .02032
+aline .0381 .02159
+aline .07874 .18415
+aline .804069E-01 .190818
+aline .08001 .192405
+aline .06731 .192405
+bezier .567762E-01 .194614 .578213E-01 .210618 .06731 .21336
+aline .163195 .21336
+closepath
+! end of curve
+
+! start of curve
+amove .104775 .189865
+aline .10414 .187325
+aline .088265 .123825
+aline .878417E-01 .122555
+aline .088265 .121285
+aline .13335 .121285
+bezier .158942 .124787 .188829 .152183 .175895 .179705
+bezier .172088 .187168 .163735 .190397 .15621 .192405
+aline .10541 .192405
+closepath
+! end of curve
+
+! start of curve
+amove .081915 .098425
+aline .08128 .095885
+aline .062865 .022225
+aline .623888E-01 .212725E-01
+aline .062865 .02032
+aline .1143 .02032
+bezier .143424 .232006E-01 .17226 .546685E-01 .15875 .084455
+bezier .15439 .934448E-01 .144486 .990461E-01 .135255 .10033
+aline .08255 .10033
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="C" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .158115 .21717
+bezier .171255 .215616 .184773 .209761 .193675 .19939
+bezier .199638 .206853 .205643 .222161 .217805 .2159
+aline .21844 .215265
+aline .21971 .21463
+aline .220345 .213995
+aline .22225 .210185
+aline .22225 .205105
+aline .207645 .146685
+bezier .204217 .134133 .179544 .138854 .184785 .1524
+bezier .187637 .171264 .177283 .193959 .156845 .196215
+bezier .115341 .195953 .848515E-01 .157888 .070485 .12192
+bezier .587552E-01 .906143E-01 .533123E-01 .505995E-01 .079375 .024765
+bezier .110461 .227539E-02 .155398 .03086 .163195 .065405
+bezier .16942 .742669E-01 .18833 .704035E-01 .18542 .057785
+bezier .172608 .891635E-02 .106199 -.236426E-01 .0635 .008255
+bezier .296932E-01 .384353E-01 .032984 .894434E-01 .047625 .12827
+bezier .065501 .173637 .105485 .219532 .158115 .21717
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="D" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .15494 .21336
+bezier .183847 .210337 .199881 .179002 .201295 .153035
+bezier .20451 .927669E-01 .172791 .247552E-01 .113665 .001905
+aline .108585 .000635
+aline .10541 0
+aline .102235 0
+aline .1016 -.000635
+aline .01778 -.000635
+bezier .732881E-02 .144085E-02 .800887E-02 .177918E-01 .01778 .02032
+aline .03429 .02032
+aline .034925 .02159
+aline .075565 .18415
+aline .772319E-01 .190818
+aline .076835 .192405
+aline .06604 .192405
+bezier .555888E-01 .194481 .562689E-01 .210832 .06604 .21336
+aline .15494 .21336
+closepath
+! end of curve
+
+! start of curve
+amove .1016 .189865
+aline .100965 .187325
+aline .060325 .024765
+aline .05969 .022225
+aline .592138E-01 .212725E-01
+aline .05969 .02032
+aline .099695 .02032
+bezier .146759 .308403E-01 .171977 .830449E-01 .177165 .127
+bezier .178693 .151422 .172838 .183103 .14605 .19177
+aline .142875 .19177
+aline .14224 .192405
+aline .102235 .192405
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="E" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .212725 .21336
+aline .21463 .212725
+aline .2159 .21209
+aline .21844 .20955
+aline .21971 .20701
+aline .220345 .205105
+aline .220345 .202565
+aline .211455 .167005
+bezier .208488 .154375 .184631 .157427 .18796 .17145
+aline .192802 .190818
+aline .192405 .192405
+aline .107315 .192405
+aline .897731E-01 .122238
+aline .09017 .12065
+aline .13462 .12065
+aline .137795 .13335
+bezier .141166 .145003 .16364 .142248 .16129 .128905
+aline .15113 .088265
+bezier .148866 .746115E-01 .123297 .780672E-01 .127635 .09271
+aline .128905 .09779
+aline .129381 .987425E-01
+aline .128905 .099695
+aline .084455 .099695
+aline .08382 .098425
+aline .06477 .022225
+aline .642938E-01 .212725E-01
+aline .06477 .02032
+aline .15748 .02032
+aline .158115 .02159
+aline .165735 .05207
+bezier .169106 .063723 .19158 .609678E-01 .18923 .047625
+aline .17907 .006985
+aline .178435 .00508
+aline .1778 .00381
+aline .174625 .000635
+aline .173355 0
+aline .17145 -.000635
+aline .019685 -.000635
+bezier .951661E-02 .171945E-02 .106552E-01 .182009E-01 .02032 .02032
+aline .03937 .02032
+aline .040005 .02159
+aline .080645 .18415
+aline .823119E-01 .190818
+aline .081915 .192405
+aline .067945 .192405
+bezier .577766E-01 .194759 .589152E-01 .211241 .06858 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="F" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .2159 .21336
+aline .217805 .212725
+aline .219075 .21209
+aline .221615 .20955
+aline .222885 .20701
+aline .22352 .205105
+aline .22352 .202565
+aline .21463 .167005
+bezier .211663 .154375 .187806 .157427 .191135 .17145
+aline .195977 .190818
+aline .19558 .192405
+aline .10922 .192405
+aline .090805 .118745
+aline .903288E-01 .117793
+aline .090805 .11684
+aline .13716 .11684
+aline .137795 .11811
+aline .140335 .12827
+bezier .142599 .141923 .168168 .138468 .16383 .123825
+aline .15367 .083185
+bezier .150299 .071532 .127825 .742872E-01 .130175 .08763
+aline .131842 .942975E-01
+aline .131445 .095885
+aline .08509 .095885
+aline .066675 .022225
+aline .661988E-01 .212725E-01
+aline .066675 .02032
+aline .088265 .02032
+bezier .987988E-01 .181106E-01 .977537E-01 .210732E-02 .088265 -.000635
+aline .02032 -.000635
+bezier .010417 .210012E-02 .113629E-01 .017779 .020955 .02032
+aline .041275 .02032
+aline .04191 .02159
+aline .08255 .18415
+aline .842169E-01 .190818
+aline .08382 .192405
+aline .06858 .192405
+bezier .058677 .19514 .596229E-01 .210819 .069215 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="G" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .14986 .21717
+bezier .161666 .215984 .173494 .210027 .181928 .201454
+bezier .187931 .207942 .19367 .222192 .205105 .2159
+aline .20574 .215265
+aline .20701 .21463
+aline .207645 .213995
+aline .20955 .210185
+aline .20955 .205105
+aline .194945 .146685
+bezier .191517 .134133 .166844 .138854 .172085 .1524
+bezier .174301 .168617 .169897 .192363 .14986 .19558
+bezier .121969 .19828 .989973E-01 .173389 .084455 .151765
+bezier .632607E-01 .115342 .483835E-01 .683002E-01 .070485 .029845
+bezier .082315 .116623E-01 .107434 .140889E-01 .12192 .027305
+bezier .135179 .396436E-01 .146108 .557938E-01 .150495 .073025
+aline .132715 .073025
+bezier .122115 .752483E-01 .123188 .912149E-01 .132715 .09398
+aline .18796 .09398
+bezier .198471 .917342E-01 .197369 .075091 .187325 .073025
+aline .17653 .073025
+aline .16002 .006985
+bezier .15726 -.530607E-02 .133768 -.286312E-02 .136525 .010795
+bezier .119896 -.376595E-03 .956868E-01 -.101447E-01 .07493 -.00127
+bezier .375052E-01 .140291E-01 .320251E-01 .618181E-01 .0381 .095885
+bezier .479306E-01 .147936 .797046E-01 .203073 .133985 .216535
+aline .13716 .216535
+aline .137795 .21717
+aline .14986 .21717
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="H" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .121285 .21336
+bezier .131885 .211137 .130812 .19517 .121285 .192405
+aline .103505 .192405
+aline .08636 .123825
+aline .859367E-01 .122555
+aline .08636 .121285
+aline .16002 .121285
+aline .160655 .12319
+aline .177562 .190818
+aline .177165 .192405
+aline .1651 .192405
+bezier .154932 .194759 .15607 .211241 .165735 .21336
+aline .220345 .21336
+bezier .230945 .211137 .229872 .19517 .220345 .192405
+aline .202565 .192405
+aline .161925 .029845
+aline .16002 .022225
+aline .159544 .212725E-01
+aline .16002 .02032
+aline .172085 .02032
+bezier .182685 .180967E-01 .181612 .213014E-02 .172085 -.000635
+aline .11684 -.000635
+bezier .106672 .171945E-02 .10781 .182009E-01 .117475 .02032
+aline .13462 .02032
+aline .135255 .02159
+aline .154305 .09779
+aline .154728 .09906
+aline .154305 .10033
+aline .080645 .10033
+aline .08001 .098425
+aline .06096 .022225
+aline .604838E-01 .212725E-01
+aline .06096 .02032
+aline .073025 .02032
+bezier .836249E-01 .180967E-01 .825523E-01 .213014E-02 .073025 -.000635
+aline .01778 -.000635
+bezier .761161E-02 .171945E-02 .875022E-02 .182009E-01 .018415 .02032
+aline .03556 .02032
+aline .036195 .02159
+aline .076835 .18415
+aline .785019E-01 .190818
+aline .078105 .192405
+aline .06604 .192405
+bezier .558716E-01 .194759 .570102E-01 .211241 .066675 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="I" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .200025 .21336
+bezier .210476 .211284 .209796 .194933 .200025 .192405
+aline .153035 .192405
+aline .112395 .029845
+aline .11049 .022225
+aline .110014 .212725E-01
+aline .11049 .02032
+aline .151765 .02032
+bezier .162216 .182441E-01 .161536 .189322E-02 .151765 -.000635
+aline .0381 -.000635
+aline .03429 .00127
+aline .032385 .003175
+aline .031115 .005715
+aline .031115 .012065
+aline .03175 .01397
+aline .03302 .01651
+aline .03556 .01905
+aline .03683 .019685
+aline .038735 .02032
+aline .08509 .02032
+aline .085725 .02159
+aline .126365 .18415
+aline .128032 .190818
+aline .127635 .192405
+aline .08636 .192405
+aline .08255 .19431
+aline .080645 .196215
+aline .079375 .198755
+aline .079375 .205105
+aline .08001 .20701
+aline .08128 .20955
+aline .08382 .21209
+aline .08509 .212725
+aline .086995 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="J" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .211455 .21336
+bezier .222055 .211137 .220982 .19517 .211455 .192405
+aline .19177 .192405
+aline .15367 .040005
+bezier .138443 -.402868E-02 .738174E-01 -.197646E-01 .040005 .01143
+bezier .286965E-01 .239807E-01 .334686E-01 .523293E-01 .053975 .050165
+bezier .674098E-01 .485853E-01 .681902E-01 .309994E-01 .607483E-01 .232833E-01
+bezier .837035E-01 .86695E-02 .119438 .183746E-01 .130175 .04445
+aline .166767 .190818
+aline .16637 .192405
+aline .133985 .192405
+bezier .124082 .19514 .125028 .210819 .13462 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="K" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .11684 .21336
+bezier .127099 .211058 .125831 .194531 .116205 .192405
+aline .099695 .192405
+aline .076835 .100965
+aline .763588E-01 .100013
+aline .076835 .09906
+bezier .109117 .130106 .141751 .160664 .17399 .19177
+bezier .163782 .190957 .158403 .204646 .16637 .211455
+aline .17018 .21336
+aline .21463 .21336
+bezier .225141 .211114 .224039 .194471 .213995 .192405
+aline .19939 .192405
+bezier .175936 .169435 .151348 .147548 .128429 .124143
+bezier .139807 .896931E-01 .150107 .548553E-01 .16129 .02032
+aline .169545 .02032
+bezier .180056 .180742E-01 .178954 .143102E-02 .16891 -.000635
+aline .12954 -.000635
+bezier .119089 .144085E-02 .119769 .177918E-01 .12954 .02032
+aline .13843 .02032
+bezier .130367 .488476E-01 .120075 .793174E-01 .111125 .108585
+aline .099695 .097155
+aline .098425 .09652
+aline .08636 .084455
+aline .08509 .08382
+aline .073025 .071755
+aline .071755 .07112
+aline .06858 .067945
+aline .05715 .022225
+aline .566738E-01 .212725E-01
+aline .05715 .02032
+aline .06858 .02032
+aline .07239 .018415
+aline .074295 .01651
+aline .075565 .01397
+aline .075565 .00762
+aline .07493 .005715
+aline .07366 .003175
+aline .07112 .000635
+aline .06985 0
+aline .067945 -.000635
+aline .019685 -.000635
+bezier .923381E-02 .144085E-02 .991387E-02 .177918E-01 .019685 .02032
+aline .036195 .02032
+aline .03683 .02159
+aline .07747 .18415
+aline .791369E-01 .190818
+aline .07874 .192405
+aline .067945 .192405
+bezier .574938E-01 .194481 .581739E-01 .210832 .067945 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="L" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .140335 .21336
+bezier .150212 .210618 .149391 .194915 .1397 .192405
+aline .111125 .192405
+aline .070485 .029845
+aline .06858 .022225
+aline .681038E-01 .212725E-01
+aline .06858 .02032
+aline .1524 .02032
+aline .153035 .02159
+aline .160655 .05207
+bezier .164122 .063654 .186435 .610147E-01 .18415 .047625
+aline .17399 .006985
+aline .173355 .00508
+aline .17272 .00381
+aline .169545 .000635
+aline .168275 0
+aline .16637 -.000635
+aline .02159 -.000635
+bezier .110784E-01 .152463E-02 .119106E-01 .176645E-01 .02159 .02032
+aline .04318 .02032
+aline .043815 .02159
+aline .084455 .18415
+aline .861219E-01 .190818
+aline .085725 .192405
+aline .06985 .192405
+bezier .593384E-01 .194565 .601706E-01 .210704 .06985 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="M" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .10033 .21336
+bezier .112934 .210256 .107712 .195428 .11049 .18669
+bezier .112567 .156194 .114914 .125809 .11684 .09525
+bezier .136011 .132842 .158095 .168679 .17907 .205105
+aline .18415 .210185
+aline .18542 .21082
+aline .186055 .211455
+aline .187325 .21209
+aline .191135 .21336
+aline .22225 .21336
+bezier .232153 .210625 .231207 .194946 .221615 .192405
+aline .20828 .192405
+aline .16764 .029845
+aline .165735 .022225
+aline .165259 .212725E-01
+aline .165735 .02032
+aline .17399 .02032
+bezier .183893 .175849E-01 .182947 .001906 .173355 -.000635
+aline .131445 -.000635
+bezier .120934 .161081E-02 .122036 .018254 .13208 .02032
+aline .14478 .02032
+aline .145415 .02159
+aline .186055 .18415
+aline .186452 .185738
+aline .186055 .187325
+bezier .167163 .150312 .1455 .115297 .125095 .079375
+aline .120015 .074295
+aline .114935 .071755
+aline .112395 .07112
+aline .10795 .07112
+aline .106045 .071755
+bezier .952321E-01 .787212E-01 .101234 .935332E-01 .09779 .103505
+bezier .958994E-01 .131451 .940944E-01 .159432 .092075 .187325
+aline .051435 .024765
+aline .0508 .022225
+aline .503238E-01 .212725E-01
+aline .0508 .02032
+aline .059055 .02032
+bezier .068958 .175849E-01 .680121E-01 .001906 .05842 -.000635
+aline .01651 -.000635
+bezier .599875E-02 .161081E-02 .710057E-02 .018254 .017145 .02032
+aline .029845 .02032
+aline .03048 .02159
+aline .07112 .18415
+aline .727869E-01 .190818
+aline .07239 .192405
+aline .06477 .192405
+bezier .542588E-01 .194651 .553606E-01 .211294 .065405 .21336
+closepath
+! end of curve
+
+! start of curve
+amove .923131E-01 .188278
+aline .09271 .18669
+aline .931069E-01 .188278
+aline .09271 .189865
+closepath
+! end of curve
+
+! start of curve
+amove .186214 .187643
+aline .18669 .18669
+aline .187166 .187643
+aline .18669 .188595
+closepath
+! end of curve
+
+! start of curve
+amove .116205 .094615
+aline .11684 .09525
+aline .116205 .095885
+aline .11557 .09525
+aline .116205 .094615
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="N" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .108585 .21336
+bezier .120596 .210666 .116821 .196784 .11938 .188595
+bezier .125436 .133673 .131555 .793088E-01 .137795 .02413
+aline .178435 .18669
+aline .179467 .190818
+aline .17907 .192405
+aline .167005 .192405
+bezier .156837 .194759 .157975 .211241 .16764 .21336
+aline .217805 .21336
+bezier .228405 .211137 .227332 .19517 .217805 .192405
+aline .200025 .192405
+aline .159385 .029845
+aline .15367 .006985
+aline .153035 .00508
+aline .1524 .00381
+aline .149225 .000635
+bezier .14063 -.893041E-03 .12754 -.367638E-02 .12192 .00508
+bezier .113861 .669475E-01 .107276 .127873 .100965 .189865
+aline .060325 .027305
+aline .059055 .022225
+aline .585788E-01 .212725E-01
+aline .059055 .02032
+aline .07112 .02032
+bezier .817199E-01 .180967E-01 .806473E-01 .213014E-02 .07112 -.000635
+aline .02032 -.000635
+bezier .101516E-01 .171945E-02 .112902E-01 .182009E-01 .020955 .02032
+aline .0381 .02032
+aline .038735 .02159
+aline .079375 .18415
+aline .810419E-01 .190818
+aline .080645 .192405
+aline .06858 .192405
+bezier .584116E-01 .194759 .595502E-01 .211241 .069215 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="O" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .1651 .21717
+bezier .180275 .216521 .203174 .212589 .205105 .19304
+bezier .206389 .170307 .201506 .148244 .196215 .125095
+aline .187325 .089535
+bezier .17809 .600817E-01 .173112 .247563E-01 .14732 .00508
+bezier .135764 -.200282E-02 .122221 -.322117E-02 .109855 -.004445
+aline .07366 -.004445
+bezier .580568E-01 -.405504E-02 .329561E-01 .620246E-03 .033655 .02159
+bezier .316413E-01 .442339E-01 .376464E-01 .659244E-01 .042545 .0889
+aline .051435 .12446
+bezier .610258E-01 .154019 .657024E-01 .190805 .093345 .208915
+bezier .104486 .215211 .117247 .215803 .128905 .21717
+aline .1651 .21717
+closepath
+! end of curve
+
+! start of curve
+amove .12827 .19558
+bezier .109029 .196438 .924885E-01 .182213 .08763 .16383
+bezier .827046E-01 .152165 .797412E-01 .139774 .0762 .127635
+aline .067945 .094615
+bezier .063944 .071745 .543139E-01 .498522E-01 .061595 .027305
+bezier .074447 .01262 .970958E-01 .163898E-01 .1143 .01778
+bezier .133333 .184968E-01 .146565 .348031E-01 .151765 .05207
+bezier .156359 .650079E-01 .160256 .781761E-01 .16383 .09144
+aline .17272 .127
+bezier .175913 .147474 .185691 .167893 .17653 .187325
+aline .173355 .1905
+aline .168275 .19304
+aline .16637 .193675
+aline .16383 .19431
+aline .160655 .194945
+aline .16002 .19558
+aline .15494 .19558
+aline .154305 .196215
+aline .128905 .196215
+aline .12827 .19558
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="P" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .16383 .21336
+bezier .185946 .212063 .206301 .193805 .20828 .17145
+bezier .211857 .128133 .173023 .893587E-01 .131445 .08509
+aline .080645 .08509
+aline .08001 .083185
+aline .06477 .022225
+aline .642938E-01 .212725E-01
+aline .06477 .02032
+aline .07874 .02032
+bezier .893399E-01 .180967E-01 .882673E-01 .213014E-02 .07874 -.000635
+aline .019685 -.000635
+bezier .951661E-02 .171945E-02 .106552E-01 .182009E-01 .02032 .02032
+aline .03937 .02032
+aline .040005 .02159
+aline .080645 .18415
+aline .823119E-01 .190818
+aline .081915 .192405
+aline .067945 .192405
+bezier .577766E-01 .194759 .589152E-01 .211241 .06858 .21336
+aline .16383 .21336
+closepath
+! end of curve
+
+! start of curve
+amove .10668 .189865
+aline .106045 .187325
+aline .08636 .108585
+aline .859367E-01 .107315
+aline .08636 .106045
+aline .130175 .106045
+bezier .160417 .109324 .194093 .140707 .180975 .17272
+bezier .175963 .18437 .163149 .190386 .151765 .192405
+aline .107315 .192405
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="Q" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=.138888 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .1651 .21717
+bezier .180275 .216521 .203174 .212589 .205105 .19304
+bezier .206389 .170307 .201506 .148244 .196215 .125095
+aline .187325 .089535
+bezier .17809 .600817E-01 .173112 .247563E-01 .14732 .00508
+aline .1397 .00127
+aline .138271 .793731E-03
+bezier .140778 -.141794E-01 .148951 -.293124E-01 .149225 -.04445
+aline .14859 -.04572
+aline .14605 -.04826
+aline .14351 -.04953
+aline .127 -.04953
+bezier .118606 -.043957 .12002 -.310511E-01 .116205 -.022225
+aline .11557 -.02032
+aline .1143 -.01524
+aline .113665 -.013335
+aline .112395 -.008255
+aline .11176 -.00635
+aline .111216 -.417287E-02
+aline .110808 -.396875E-02
+aline .109855 -.004445
+aline .07366 -.004445
+bezier .580568E-01 -.405504E-02 .329561E-01 .620246E-03 .033655 .02159
+bezier .316413E-01 .442339E-01 .376464E-01 .659244E-01 .042545 .0889
+aline .051435 .12446
+bezier .610258E-01 .154019 .657024E-01 .190805 .093345 .208915
+bezier .104486 .215211 .117247 .215803 .128905 .21717
+aline .1651 .21717
+closepath
+! end of curve
+
+! start of curve
+amove .12954 .19558
+bezier .110777 .19646 .935045E-01 .1835 .088265 .1651
+bezier .826887E-01 .151316 .788497E-01 .136891 .07493 .122555
+aline .066675 .089535
+bezier .063174 .682156E-01 .536119E-01 .471876E-01 .061595 .02667
+bezier .721201E-01 .142054E-01 .899242E-01 .169443E-01 .104775 .01651
+bezier .10379 .285981E-01 .973986E-01 .404144E-01 .09652 .052705
+aline .09779 .055245
+aline .10033 .057785
+aline .10287 .059055
+aline .11938 .059055
+bezier .12596 .507452E-01 .126069 .379807E-01 .130175 .02794
+bezier .130654 .181433E-01 .139466 .285742E-01 .14224 .032385
+bezier .15306 .493929E-01 .157568 .696648E-01 .163195 .0889
+aline .17145 .12192
+bezier .175132 .143756 .185016 .165402 .17653 .18669
+bezier .164226 .199019 .145344 .196277 .12954 .19558
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="R" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .145415 .21336
+bezier .170841 .212831 .197165 .189667 .192405 .163195
+bezier .190959 .136818 .169929 .116319 .147955 .104775
+bezier .159658 .952534E-01 .163423 .793023E-01 .16002 .065405
+aline .153035 .037465
+bezier .151901 .303272E-01 .148314 .218622E-01 .15367 .01651
+bezier .16782 .169877E-01 .164304 .374746E-01 .17526 .042545
+aline .18542 .042545
+bezier .198593 .359789E-01 .188336 .190189E-01 .182245 .010795
+bezier .171279 -.845894E-02 .13771 -.108468E-01 .12954 .012065
+bezier .121474 .350505E-01 .138837 .587952E-01 .136525 .08128
+bezier .134145 .090439 .124085 .941985E-01 .116205 .095885
+aline .079375 .095885
+aline .06096 .022225
+aline .604838E-01 .212725E-01
+aline .06096 .02032
+aline .073025 .02032
+bezier .836249E-01 .180967E-01 .825523E-01 .213014E-02 .073025 -.000635
+aline .01778 -.000635
+bezier .761161E-02 .171945E-02 .875022E-02 .182009E-01 .018415 .02032
+aline .03556 .02032
+aline .036195 .02159
+aline .076835 .18415
+aline .785019E-01 .190818
+aline .078105 .192405
+aline .06604 .192405
+bezier .558716E-01 .194759 .570102E-01 .211241 .066675 .21336
+aline .145415 .21336
+closepath
+! end of curve
+
+! start of curve
+amove .10287 .189865
+aline .102235 .187325
+aline .08509 .118745
+aline .846138E-01 .117793
+aline .08509 .11684
+aline .117475 .11684
+bezier .142466 .119496 .172553 .140468 .168275 .168275
+bezier .164475 .182611 .149905 .190422 .136525 .192405
+aline .103505 .192405
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="S" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .14351 .21717
+bezier .156947 .21584 .1719 .211066 .181928 .200819
+bezier .187159 .207186 .190118 .21991 .201295 .21717
+aline .203835 .2159
+aline .20447 .215265
+aline .20574 .21463
+aline .206375 .213995
+aline .20828 .210185
+aline .20828 .205105
+aline .19431 .149225
+bezier .190406 .13803 .167751 .141636 .17145 .154305
+bezier .173853 .170676 .167938 .191139 .149225 .19431
+bezier .120246 .203039 .079954 .181197 .080645 .147955
+bezier .830083E-01 .138707 .900579E-01 .13063 .099695 .12827
+aline .135255 .11938
+bezier .15784 .116666 .178516 .100128 .18161 .076835
+bezier .186824 .265804E-01 .132072 -.139127E-01 .085725 -.003175
+bezier .713069E-01 -.310195E-02 .573617E-01 .434367E-02 .461433E-01 .116417E-01
+bezier .424934E-01 .317628E-02 .035836 -.913171E-02 .024765 -.003175
+aline .022225 -.000635
+aline .020955 .001905
+aline .02032 .00381
+aline .02032 .00635
+aline .03429 .06223
+bezier .372566E-01 .748604E-01 .061114 .718081E-01 .057785 .057785
+bezier .509065E-01 .418776E-01 .615891E-01 .226616E-01 .079375 .019685
+bezier .111933 .710874E-02 .155164 .291162E-01 .159385 .065405
+bezier .159726 .774156E-01 .152239 .902153E-01 .1397 .093345
+aline .10668 .1016
+bezier .801302E-01 .10398 .548019E-01 .125672 .057785 .15367
+bezier .625017E-01 .193541 .104815 .221014 .14351 .21717
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="T" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .21844 .21336
+aline .220345 .212725
+aline .221615 .21209
+aline .224155 .20955
+aline .225425 .20701
+aline .22606 .205105
+aline .22606 .202565
+aline .21717 .167005
+bezier .214203 .154375 .190346 .157427 .193675 .17145
+aline .198517 .190818
+aline .19812 .192405
+aline .153035 .192405
+aline .112395 .029845
+aline .11049 .022225
+aline .110014 .212725E-01
+aline .11049 .02032
+aline .13208 .02032
+bezier .142614 .181106E-01 .141569 .210732E-02 .13208 -.000635
+aline .057785 -.000635
+bezier .476166E-01 .171945E-02 .487552E-01 .182009E-01 .05842 .02032
+aline .08509 .02032
+aline .085725 .02159
+aline .126365 .18415
+aline .128032 .190818
+aline .127635 .192405
+aline .08255 .192405
+aline .0762 .167005
+bezier .732334E-01 .154375 .049376 .157427 .052705 .17145
+aline .061595 .20701
+aline .06223 .20828
+aline .062865 .208915
+aline .0635 .210185
+aline .06477 .211455
+aline .06731 .212725
+aline .06858 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="U" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .11938 .21336
+bezier .12998 .211137 .128907 .19517 .11938 .192405
+aline .099695 .192405
+aline .067945 .065405
+bezier .624976E-01 .476881E-01 .686696E-01 .02034 .090805 .01651
+bezier .120204 .162068E-01 .143234 .430189E-01 .15113 .06985
+aline .181372 .190818
+aline .180975 .192405
+aline .167005 .192405
+bezier .156837 .194759 .157975 .211241 .16764 .21336
+aline .22606 .21336
+bezier .23666 .211137 .235587 .19517 .22606 .192405
+aline .206375 .192405
+aline .174625 .065405
+bezier .163312 .244998E-01 .121026 -.145808E-01 .076835 -.001905
+bezier .475879E-01 .808567E-02 .037823 .430874E-01 .04445 .06985
+aline .746919E-01 .190818
+aline .074295 .192405
+aline .060325 .192405
+bezier .501566E-01 .194759 .512952E-01 .211241 .06096 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="V" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .114935 .21336
+aline .116205 .212725
+aline .118745 .211455
+aline .120015 .210185
+aline .12192 .206375
+aline .12192 .201295
+aline .121285 .198755
+aline .120015 .196215
+aline .11811 .19431
+aline .1143 .192405
+aline .10033 .192405
+aline .099695 .19177
+aline .099695 .0635
+aline .09906 .062865
+aline .09906 .034925
+aline .098425 .03429
+aline .098425 .0254
+aline .980017E-01 .02413
+aline .098425 .02286
+bezier .106959 .042868 .117163 .621838E-01 .126365 .081915
+aline .167005 .163195
+aline .169545 .168275
+aline .17018 .16891
+aline .181451 .191453
+aline .180975 .192405
+aline .172085 .192405
+bezier .161523 .194669 .162653 .211266 .17272 .21336
+aline .221615 .21336
+bezier .232126 .211114 .231024 .194471 .22098 .192405
+aline .206375 .192405
+aline .18161 .142875
+aline .180975 .14224
+aline .14732 .07493
+aline .146685 .074295
+aline .112395 .005715
+aline .11176 .00508
+aline .111125 .00381
+aline .106045 -.00127
+aline .102235 -.003175
+aline .099695 -.00381
+aline .083185 -.00381
+aline .08128 -.003175
+aline .080645 -.00254
+aline .079375 -.001905
+aline .07747 0
+aline .0762 .00254
+aline .0762 .03937
+aline .075565 .040005
+aline .075565 .17653
+aline .07493 .177165
+aline .07493 .19177
+aline .074295 .192405
+aline .06477 .192405
+bezier .548934E-01 .195147 .557142E-01 .21085 .065405 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="W" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .10414 .21336
+bezier .114399 .211058 .113131 .194531 .103505 .192405
+aline .085725 .192405
+bezier .788443E-01 .136179 .725648E-01 .794421E-01 .065405 .023495
+bezier .077213 .567392E-01 .934883E-01 .088133 .108585 .120015
+aline .113665 .125095
+aline .117475 .127
+aline .11938 .127635
+aline .12954 .127635
+aline .131445 .127
+aline .132715 .126365
+aline .135255 .123825
+aline .13589 .122555
+bezier .137229 .890082E-01 .134652 .552332E-01 .13208 .02286
+bezier .150827 .801263E-01 .175631 .135918 .194945 .192405
+aline .18288 .192405
+bezier .172429 .194481 .173109 .210832 .18288 .21336
+aline .224155 .21336
+bezier .234323 .211006 .233185 .194524 .22352 .192405
+aline .2159 .192405
+bezier .189909 .129193 .167082 .641695E-01 .140335 .00127
+bezier .134202 -.55531E-02 .118196 -.722787E-02 .114935 .003175
+bezier .115399 .366903E-01 .116842 .711991E-01 .11811 .103505
+bezier .104469 .069335 .879076E-01 .361854E-01 .071755 .003175
+aline .06731 -.00127
+aline .0635 -.003175
+aline .06096 -.00381
+aline .051435 -.00381
+bezier .400335E-01 .116249E-02 .482144E-01 .139038E-01 .04699 .02286
+bezier .535378E-01 .079036 .602767E-01 .135191 .655108E-01 .191876
+bezier .532076E-01 .191778 .519528E-01 .210173 .062865 .21336
+closepath
+! end of curve
+
+! start of curve
+amove .11811 .103505
+aline .118745 .10287
+aline .11938 .103505
+aline .118745 .10414
+aline .11811 .103505
+closepath
+! end of curve
+
+! start of curve
+amove .06477 .02286
+aline .065405 .023495
+aline .06477 .02413
+aline .064135 .023495
+aline .06477 .02286
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="X" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .122555 .21336
+bezier .132458 .210625 .131512 .194946 .12192 .192405
+aline .11176 .192405
+bezier .11581 .176251 .120702 .15746 .126365 .14097
+bezier .138183 .158145 .153302 .175366 .163195 .192405
+bezier .149789 .188796 .145604 .210005 .158115 .21336
+aline .207645 .21336
+bezier .218096 .211284 .217416 .194933 .207645 .192405
+aline .1905 .192405
+bezier .17111 .165749 .148876 .139319 .131445 .112395
+bezier .139919 .816438E-01 .148996 .510682E-01 .15748 .02032
+aline .169545 .02032
+bezier .179996 .182441E-01 .179316 .189322E-02 .169545 -.000635
+aline .120015 -.000635
+bezier .109564 .144085E-02 .110244 .177918E-01 .120015 .02032
+aline .130175 .02032
+bezier .126086 .431924E-01 .1183 .659866E-01 .11303 .0889
+bezier .968142E-01 .662828E-01 .078326 .428719E-01 .064135 .02032
+bezier .767943E-01 .240823E-01 .082546 .503287E-02 .07112 0
+aline .069215 -.000635
+aline .019685 -.000635
+aline .015875 .00127
+aline .014605 .00254
+aline .0127 .00635
+aline .0127 .01143
+aline .013335 .01397
+aline .014605 .01651
+aline .01651 .018415
+aline .02032 .02032
+aline .037465 .02032
+bezier .603014E-01 .516883E-01 .084524 .822009E-01 .107103 .113665
+bezier .993444E-01 .139851 .092121 .166192 .084455 .192405
+aline .07239 .192405
+bezier .618784E-01 .194565 .627106E-01 .210704 .07239 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="Y" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .11557 .21336
+bezier .125473 .210625 .124527 .194946 .114935 .192405
+aline .10414 .192405
+bezier .108983 .164931 .11731 .136065 .120015 .10922
+bezier .137067 .138085 .159792 .165296 .177165 .192405
+bezier .164513 .188618 .158808 .207706 .17018 .212725
+aline .172085 .21336
+aline .221615 .21336
+bezier .231783 .211006 .230645 .194524 .22098 .192405
+aline .20447 .192405
+bezier .178178 .156455 .151521 .120767 .12573 .084455
+aline .110093 .219075E-01
+aline .11049 .02032
+aline .122555 .02032
+bezier .133155 .180967E-01 .132082 .213014E-02 .122555 -.000635
+aline .06731 -.000635
+bezier .571416E-01 .171945E-02 .582802E-01 .182009E-01 .067945 .02032
+aline .085725 .02032
+aline .1016 .08382
+bezier .944058E-01 .1197 .850889E-01 .156302 .076835 .192405
+aline .065405 .192405
+bezier .548051E-01 .194628 .558777E-01 .210595 .065405 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="Z" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .213995 .21336
+aline .215265 .212725
+aline .216535 .21209
+aline .217805 .21082
+aline .219075 .20828
+aline .219075 .203835
+aline .217805 .198755
+bezier .164751 .138214 .108248 .801593E-01 .05334 .020955
+aline .053975 .02032
+aline .14986 .02032
+aline .150495 .02159
+aline .158115 .05207
+bezier .160379 .657235E-01 .185948 .622678E-01 .18161 .047625
+aline .17145 .006985
+aline .170815 .00508
+aline .17018 .00381
+aline .167005 .000635
+aline .165735 0
+aline .16383 -.000635
+aline .024765 -.000635
+bezier .153119E-01 .255122E-02 .197647E-01 .01505 .024765 .02032
+bezier .078457 .772163E-01 .131363 .134679 .184785 .19177
+aline .18415 .192405
+aline .09398 .192405
+aline .08763 .167005
+bezier .846634E-01 .154375 .060806 .157427 .064135 .17145
+aline .073025 .20701
+aline .07366 .20828
+aline .074295 .208915
+aline .07493 .210185
+aline .0762 .211455
+aline .07874 .212725
+aline .08001 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="[" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.694445 dep=.0833311 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .221615 .24257
+bezier .231496 .239963 .230781 .223968 .22098 .221615
+aline .15875 .221615
+aline .158115 .220345
+aline .117475 .057785
+aline .101203 -.73025E-02
+aline .1016 -.00889
+aline .15875 -.00889
+bezier .168631 -.114969E-01 .167916 -.274917E-01 .158115 -.029845
+aline .08128 -.029845
+aline .079375 -.02921
+aline .078105 -.028575
+aline .075565 -.026035
+aline .074295 -.023495
+aline .07366 -.02159
+aline .07366 -.01905
+aline .1143 .14351
+aline .13716 .23495
+aline .137795 .236855
+aline .13843 .238125
+aline .141605 .2413
+aline .142875 .241935
+aline .14478 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="\" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.694445 dep=.0833311 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .093345 .24257
+bezier .106443 .238324 .104087 .221522 .10795 .21082
+bezier .125239 .135922 .142132 .609357E-01 .159385 -.01397
+bezier .16371 -.271398E-01 .143721 -.364447E-01 .13716 -.02413
+bezier .11624 .596195E-01 .983247E-01 .14441 .07874 .2286
+aline .07874 .23241
+aline .079375 .23495
+aline .080645 .23749
+aline .08382 .240665
+aline .08636 .241935
+aline .088265 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="]" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.694445 dep=.0833311 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .15748 .24257
+aline .15875 .241935
+aline .16002 .2413
+aline .160655 .240665
+aline .161925 .24003
+aline .16256 .239395
+aline .164465 .235585
+aline .164465 .230505
+aline .123825 .067945
+aline .100965 -.023495
+aline .099695 -.026035
+aline .09779 -.02794
+aline .09398 -.029845
+aline .017145 -.029845
+bezier .658331E-02 -.275814E-01 .771263E-02 -.109843E-01 .01778 -.00889
+aline .08001 -.00889
+aline .12065 .15367
+aline .13716 .21971
+aline .137636 .220663
+aline .13716 .221615
+aline .08001 .221615
+bezier .694483E-01 .223879 .705776E-01 .240476 .080645 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="^" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .14605 .21336
+bezier .161711 .203702 .177822 .194669 .192405 .183515
+bezier .198958 .172239 .180927 .157311 .172085 .16891
+bezier .161188 .174699 .151815 .185468 .140335 .188595
+aline .131445 .18415
+aline .13081 .183515
+aline .10541 .170815
+aline .104775 .17018
+aline .094615 .1651
+bezier .832739E-01 .160931 .753177E-01 .179544 .084455 .186055
+aline .098425 .19304
+aline .10033 .193675
+aline .1143 .20066
+aline .116205 .201295
+aline .130175 .20828
+aline .13208 .208915
+aline .1397 .212725
+aline .141605 .21336
+aline .14605 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="_" !-------------- Beginning of new char.
+dfont wid=.524996 hei=0 dep=.0951357 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .14986 -.01016
+bezier .162187 -.125907E-01 .162187 -.318593E-01 .14986 -.03429
+aline .024765 -.03429
+bezier .012033 -.321105E-01 .012033 -.123395E-01 .024765 -.01016
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="`" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .17018 .238125
+bezier .178344 .236047 .181899 .223574 .17399 .219075
+bezier .152085 .208884 .13255 .188875 .128905 .164465
+bezier .143657 .167655 .153203 .148534 .14351 .137795
+bezier .132169 .121901 .105103 .132675 .10668 .151765
+bezier .104318 .188699 .132461 .223888 .165735 .238125
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="a" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.430555 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .12446 .151765
+bezier .134384 .151246 .143281 .143298 .149225 .13843
+bezier .153304 .151343 .174593 .148135 .17272 .133985
+aline .147955 .034925
+bezier .144259 .288956E-01 .149289 .142637E-01 .158115 .019685
+bezier .168782 .297495E-01 .165733 .477222E-01 .17526 .057785
+aline .17653 .05842
+aline .178435 .059055
+aline .18669 .059055
+bezier .200654 .542706E-01 .191171 .381719E-01 .188595 .028575
+bezier .183207 .946608E-02 .16399 -.959545E-02 .142875 -.000635
+bezier .1345 .107606E-02 .128981 .107861E-01 .125095 .01524
+bezier .107877 -.270819E-02 .749059E-01 -.114648E-01 .05715 .010795
+bezier .332757E-01 .450645E-01 .472892E-01 .920718E-01 .070485 .12319
+bezier .818606E-01 .136712 .961728E-01 .149007 .1143 .151765
+closepath
+! end of curve
+
+! start of curve
+amove .11557 .130175
+bezier .863156E-01 .120269 .737992E-01 .865881E-01 .06858 .059055
+bezier .680344E-01 .444267E-01 .680458E-01 .246312E-01 .08382 .018415
+bezier .110421 .208976E-01 .125175 .492328E-01 .132715 .07239
+bezier .137799 .907012E-01 .141348 .112861 .127 .12827
+aline .12446 .12954
+aline .122555 .130175
+aline .12192 .13081
+aline .116205 .13081
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="b" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .099695 .21336
+aline .1016 .212725
+aline .10287 .21209
+aline .10541 .20955
+aline .10668 .20701
+aline .107315 .205105
+aline .107315 .202565
+aline .092075 .141605
+aline .916517E-01 .140335
+aline .091948 .139446
+bezier .112413 .154666 .146261 .158309 .16256 .13462
+bezier .187829 .967491E-01 .168855 .044777 .137795 .015875
+bezier .118093 -.34451E-02 .807413E-01 -.119809E-01 .061595 .0127
+bezier .467966E-01 .299224E-01 .463465E-01 .054282 .0508 .07493
+aline .797719E-01 .190818
+aline .079375 .192405
+aline .05334 .192405
+bezier .431716E-01 .194759 .443102E-01 .211241 .053975 .21336
+closepath
+! end of curve
+
+! start of curve
+amove .123825 .130175
+bezier .876503E-01 .120099 .692805E-01 .766966E-01 .07239 .042545
+bezier .074494 .300234E-01 .849053E-01 .149519E-01 .09906 .01905
+bezier .13416 .294036E-01 .152216 .702355E-01 .150495 .10414
+bezier .149025 .116852 .139791 .1331 .12446 .13081
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="c" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.430555 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .144145 .151765
+bezier .16477 .151127 .185762 .131037 .1778 .10922
+bezier .174218 .956249E-01 .151673 .932316E-01 .147955 .10795
+aline .147955 .11557
+aline .14859 .117475
+aline .150495 .121285
+aline .15367 .12446
+bezier .135427 .1398 .109776 .124153 .09525 .109855
+bezier .748466E-01 .877147E-01 .603607E-01 .470818E-01 .08636 .02413
+bezier .102691 .142921E-01 .12336 .187513E-01 .140335 .02159
+bezier .152565 .231627E-01 .161578 .315902E-01 .17145 .037465
+bezier .183097 .392103E-01 .191406 .215308E-01 .179705 .01524
+bezier .153454 -.458694E-02 .119289 -.454757E-02 .088265 -.000635
+bezier .539583E-01 .826745E-02 .418846E-01 .493931E-01 .05207 .08001
+bezier .638439E-01 .119594 .101211 .154498 .144145 .151765
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="d" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .182245 .21336
+aline .18415 .212725
+aline .18542 .21209
+aline .18796 .20955
+aline .18923 .20701
+aline .189865 .205105
+aline .189865 .202565
+aline .149225 .040005
+bezier .146752 .032799 .144441 .224201E-01 .153035 .018415
+bezier .163696 .192867E-01 .165045 .335909E-01 .168275 .04191
+aline .170815 .05207
+bezier .174306 .636286E-01 .196618 .610104E-01 .19431 .047625
+bezier .189141 .276886E-01 .181715 .224816E-02 .15875 -.00254
+bezier .145102 -.435084E-02 .130801 .287499E-02 .12573 .015875
+bezier .109773 -.270513E-03 .817265E-01 -.108276E-01 .06223 .005715
+bezier .371494E-01 .029829 .430757E-01 .686866E-01 .055245 .09779
+bezier .06821 .12606 .095398 .15809 .130175 .150495
+bezier .137866 .149075 .144393 .141701 .149225 .13843
+aline .162322 .190818
+aline .161925 .192405
+aline .140335 .192405
+bezier .129735 .194628 .130808 .210595 .140335 .21336
+closepath
+! end of curve
+
+! start of curve
+amove .11557 .130175
+bezier .863156E-01 .120269 .737992E-01 .865881E-01 .06858 .059055
+bezier .680344E-01 .444267E-01 .680458E-01 .246312E-01 .08382 .018415
+bezier .110421 .208976E-01 .125175 .492328E-01 .132715 .07239
+bezier .137799 .907012E-01 .141348 .112861 .127 .12827
+aline .12446 .12954
+aline .122555 .130175
+aline .12192 .13081
+aline .116205 .13081
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="e" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.430555 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .144145 .151765
+bezier .166472 .150826 .187069 .128499 .179705 .106045
+bezier .172087 .748607E-01 .135494 .675778E-01 .10922 .06604
+aline .08763 .06604
+aline .086995 .065405
+aline .074295 .065405
+aline .07366 .06604
+bezier .691688E-01 .475963E-01 .783946E-01 .021523 .10033 .018415
+bezier .124735 .178786E-01 .150603 .191801E-01 .169545 .03683
+bezier .181676 .415297E-01 .192294 .021844 .179705 .01524
+bezier .153454 -.458694E-02 .119289 -.454757E-02 .088265 -.000635
+bezier .575527E-01 .755481E-02 .443284E-01 .043248 .050165 .07112
+bezier .576753E-01 .115219 .981695E-01 .154615 .144145 .151765
+closepath
+! end of curve
+
+! start of curve
+amove .132715 .130175
+bezier .109163 .127315 .877773E-01 .107308 .08001 .08636
+bezier .104553 .08833 .132506 .841035E-01 .1524 .102235
+bezier .160383 .111757 .157776 .126869 .14478 .130175
+aline .141605 .130175
+aline .14097 .13081
+aline .13335 .13081
+aline .132715 .130175
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="f" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=.222223 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .16764 .215265
+bezier .183575 .215294 .205418 .204145 .200025 .184785
+bezier .197727 .170157 .17451 .165864 .169545 .180975
+aline .169545 .18923
+aline .17018 .191135
+aline .170656 .192088
+bezier .162108 .196593 .143932 .195615 .14224 .182245
+bezier .139777 .171113 .136926 .160957 .136525 .14986
+aline .17018 .14986
+aline .17399 .147955
+aline .17526 .146685
+aline .177165 .142875
+aline .177165 .137795
+aline .17653 .135255
+aline .17526 .132715
+aline .173355 .13081
+aline .169545 .128905
+aline .132715 .128905
+bezier .120023 .715857E-01 .115969 .136621E-01 .09779 -.04572
+bezier .894041E-01 -.652267E-01 .699788E-01 -.085445 .04699 -.08001
+bezier .288649E-01 -.816599E-01 .868394E-02 -.634123E-01 .01905 -.045085
+bezier .248008E-01 -.338699E-01 .443779E-01 -.337639E-01 .047625 -.04699
+aline .047625 -.053975
+aline .04699 -.05588
+aline .046355 -.05715
+aline .04572 -.057785
+bezier .580542E-01 -.653328E-01 .698008E-01 -.517124E-01 .074295 -.04064
+bezier .917276E-01 .163896E-01 .972372E-01 .715083E-01 .107696 .127
+aline .107315 .128905
+aline .08128 .128905
+bezier .706801E-01 .131128 .717527E-01 .147095 .08128 .14986
+aline .111125 .14986
+bezier .117628 .170043 .11437 .203021 .140335 .21209
+aline .141605 .212725
+aline .14351 .21336
+aline .14859 .21463
+aline .1524 .21463
+aline .153035 .215265
+aline .16764 .215265
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="g" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.430555 dep=.222223 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .13335 .151765
+bezier .144716 .151095 .154693 .143234 .162651 .136253
+bezier .164221 .149323 .185668 .150554 .18669 .136525
+aline .18669 .133985
+aline .14605 -.028575
+bezier .138783 -.057623 .110518 -.772638E-01 .081915 -.080645
+bezier .630187E-01 -.795602E-01 .398293E-01 -.847718E-01 .02667 -.067945
+bezier .181059E-01 -.537245E-01 .034155 -.336147E-01 .04953 -.042545
+bezier .551422E-01 -.460112E-01 .564112E-01 -.529564E-01 .05588 -.059055
+bezier .814369E-01 -.638647E-01 .112958 -.536898E-01 .12192 -.02667
+aline .131207 .104775E-01
+aline .13081 .012065
+bezier .108552 -.686319E-02 .698469E-01 -.531006E-02 .05588 .02286
+bezier .339038E-01 .719014E-01 .666115E-01 .13762 .118745 .15113
+aline .12192 .15113
+aline .122555 .151765
+aline .13335 .151765
+closepath
+! end of curve
+
+! start of curve
+amove .123825 .130175
+bezier .933191E-01 .122869 .768013E-01 .895516E-01 .07239 .061595
+bezier .709207E-01 .458417E-01 .745008E-01 .251768E-01 .092075 .02032
+bezier .12593 .218901E-01 .145415 .586246E-01 .150495 .088265
+bezier .152283 .103773 .149133 .126162 .13081 .13081
+aline .12446 .13081
+closepath
+! end of curve
+
+! start of curve
+amove .13081 .012065
+aline .131445 .01143
+aline .13208 .012065
+aline .131445 .0127
+aline .13081 .012065
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="h" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .09652 .21336
+aline .098425 .212725
+aline .099695 .21209
+aline .102235 .20955
+aline .103505 .20701
+aline .10414 .205105
+aline .10414 .202565
+aline .885031E-01 .140018
+aline .888093E-01 .138793
+bezier .108546 .153552 .143421 .159815 .16002 .136525
+bezier .173995 .107185 .15633 .756568E-01 .147955 .04699
+aline .145415 .03937
+aline .14478 .0381
+aline .142875 .032385
+aline .14224 .029845
+aline .141605 .02921
+aline .141605 .022225
+bezier .147127 .128618E-01 .158284 .023649 .161925 .029845
+bezier .169643 .038384 .166814 .546119E-01 .178435 .059055
+aline .18669 .059055
+bezier .199931 .549091E-01 .192123 .039757 .188595 .031115
+bezier .179791 .976037E-02 .154646 -.118507E-01 .13081 .00127
+bezier .116077 .106706E-01 .115166 .312287E-01 .122555 .04572
+bezier .129992 .704053E-01 .142355 .949989E-01 .141605 .12065
+bezier .13655 .136552 .115618 .131027 .10541 .12319
+bezier .709149E-01 .929336E-01 .675717E-01 .427791E-01 .052705 .001905
+bezier .457011E-01 -.787094E-02 .286258E-01 -.559024E-03 .03175 .01143
+aline .07239 .17399
+aline .765969E-01 .190818
+aline .0762 .192405
+aline .05461 .192405
+bezier .440101E-01 .194628 .450827E-01 .210595 .05461 .21336
+closepath
+! end of curve
+
+! start of curve
+amove .088265 .137795
+aline .0889 .13843
+aline .088265 .139065
+aline .08763 .13843
+aline .088265 .137795
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="i" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .146685 .213995
+bezier .163478 .210599 .159381 .184916 .14351 .183515
+bezier .128156 .180098 .120757 .202491 .13335 .210185
+aline .13462 .211455
+aline .13843 .21336
+aline .14097 .213995
+closepath
+! end of curve
+
+! start of curve
+amove .111125 .151765
+bezier .13167 .150651 .146866 .127092 .13716 .10795
+bezier .12714 .811876E-01 .115141 .550932E-01 .106299 .02794
+bezier .108091 .133058E-01 .126845 .183745E-01 .133985 .026035
+bezier .142969 .341022E-01 .146182 .460031E-01 .15113 .056515
+bezier .159243 .634464E-01 .176437 .573677E-01 .17145 .045085
+bezier .163568 .148859E-01 .129476 -.141159E-01 .09779 .001905
+bezier .809662E-01 .109433E-01 .788893E-01 .329164E-01 .088265 .04826
+bezier .974537E-01 .715714E-01 .106359 .09519 .116205 .11811
+bezier .119072 .130387 .10299 .134153 .09525 .127635
+bezier .824621E-01 .120959 .768811E-01 .106952 .07239 .09398
+bezier .647063E-01 .848771E-01 .455547E-01 .918013E-01 .051435 .104775
+bezier .589129E-01 .130644 .828085E-01 .154333 .111125 .151765
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="j" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=.222223 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .17907 .213995
+bezier .196219 .211242 .192346 .18539 .17653 .183515
+aline .170815 .183515
+bezier .154871 .18631 .157028 .210018 .17145 .21336
+aline .173355 .213995
+closepath
+! end of curve
+
+! start of curve
+amove .139065 .151765
+bezier .158572 .149873 .174022 .130687 .16891 .111125
+aline .13589 -.020955
+bezier .126077 -.606005E-01 .803741E-01 -.951512E-01 .04064 -.07493
+bezier .248082E-01 -.065543 .329383E-01 -.371319E-01 .05207 -.04064
+bezier .611542E-01 -.041954 .647084E-01 -.515947E-01 .0635 -.05969
+bezier .877061E-01 -.603938E-01 .106138 -.383496E-01 .112395 -.01651
+aline .145415 .11557
+bezier .14945 .126501 .134883 .134479 .12573 .12954
+bezier .107254 .125 .979306E-01 .107251 .089535 .092075
+bezier .809939E-01 .861242E-01 .653823E-01 .925319E-01 .070485 .10414
+bezier .801745E-01 .128024 .101701 .148263 .127635 .151765
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="k" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .099695 .21336
+aline .1016 .212725
+aline .10287 .21209
+aline .10541 .20955
+aline .10668 .20701
+aline .107315 .205105
+aline .107315 .202565
+aline .08001 .093345
+aline .795338E-01 .923925E-01
+bezier .874838E-01 .947094E-01 .967961E-01 .104662 .103505 .11176
+bezier .122694 .13104 .145233 .157551 .17526 .150495
+bezier .193334 .14232 .192343 .118029 .18542 .10287
+bezier .179562 .924189E-01 .161316 .924411E-01 .15748 .104775
+aline .15748 .11303
+bezier .157867 .120857 .170852 .122927 .165735 .13081
+bezier .138505 .126742 .123242 .996658E-01 .103664 .828675E-01
+bezier .12223 .078284 .143423 .620771E-01 .13843 .04064
+bezier .136858 .033121 .135188 .213462E-01 .145415 .01905
+bezier .157014 .158261E-01 .163449 .303235E-01 .167005 .03937
+aline .169545 .04699
+bezier .168846 .606305E-01 .190637 .642709E-01 .19431 .051435
+bezier .191259 .260057E-01 .172869 -.539573E-02 .14351 -.00254
+bezier .123626 -.122449E-02 .107868 .207905E-01 .114935 .040005
+bezier .119257 .552874E-01 .100599 .619108E-01 .088265 .0635
+aline .08763 .064135
+aline .08382 .064135
+aline .083185 .06477
+aline .07747 .06477
+aline .076835 .065405
+aline .073025 .065405
+aline .05842 .006985
+bezier .562363E-01 -.460297E-02 .380878E-01 -.613532E-02 .034925 .005715
+aline .034925 .01143
+aline .075565 .17399
+aline .797719E-01 .190818
+aline .079375 .192405
+aline .05334 .192405
+bezier .431716E-01 .194759 .443102E-01 .211241 .053975 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="l" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .135255 .21336
+aline .13716 .212725
+aline .13843 .21209
+aline .14097 .20955
+aline .14224 .20701
+aline .142875 .205105
+aline .142875 .202565
+aline .102235 .040005
+bezier .098132 .323098E-01 .100716 .225917E-01 .109855 .02032
+bezier .119863 .152868E-01 .131512 .204067E-01 .136525 .03048
+bezier .143664 .390994E-01 .140994 .547846E-01 .1524 .059055
+aline .160655 .059055
+bezier .17341 .552585E-01 .166543 .407853E-01 .163195 .032385
+bezier .155185 .127454E-01 .135888 -.711897E-02 .11303 -.001905
+bezier .919877E-01 -.20964E-02 .710813E-01 .174063E-01 .07747 .03937
+aline .115332 .190818
+aline .114935 .192405
+aline .076835 .192405
+bezier .662733E-01 .194669 .674026E-01 .211266 .07747 .21336
+aline .135255 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="m" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.430555 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .10922 .151765
+bezier .120421 .150022 .128815 .141381 .13208 .13081
+bezier .145099 .148544 .176035 .161812 .19304 .14224
+bezier .206509 .124368 .198934 .101734 .193675 .081915
+aline .18415 .05334
+bezier .180844 .425913E-01 .174743 .309729E-01 .179705 .02032
+bezier .192791 .228119E-01 .195013 .17371E-02 .18288 -.000635
+bezier .165426 -.343828E-02 .154677 .166691E-01 .15875 .031115
+bezier .161327 .623529E-01 .182993 .915345E-01 .18034 .122555
+bezier .178957 .134458 .164692 .1313 .158115 .12573
+bezier .131844 .995127E-01 .125328 .605406E-01 .114935 .026035
+aline .109855 .005715
+bezier .107591 -.793846E-02 .820222E-01 -.448279E-02 .08636 .01016
+bezier .938155E-01 .441756E-01 .106475 .776854E-01 .113665 .111125
+aline .113665 .12192
+bezier .111832 .133785 .979108E-01 .131957 .090805 .12573
+bezier .645337E-01 .995127E-01 .580182E-01 .605406E-01 .047625 .026035
+aline .042545 .005715
+bezier .402815E-01 -.793846E-02 .147122E-01 -.448279E-02 .01905 .01016
+bezier .248649E-01 .336608E-01 .309376E-01 .570865E-01 .038735 .08001
+aline .05461 .14351
+bezier .583036E-01 .153609 .732572E-01 .150725 .074295 .140335
+bezier .813069E-01 .146127 .898592E-01 .150421 .09906 .151765
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="n" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.430555 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .070485 .151765
+aline .07366 .15113
+aline .07747 .14986
+aline .08128 .147955
+aline .081915 .14732
+aline .083185 .146685
+aline .0889 .14097
+aline .089535 .1397
+aline .09017 .139065
+aline .093345 .132715
+bezier .110538 .152267 .147015 .161594 .164465 .137795
+bezier .177153 .115087 .165589 .899934E-01 .159385 .066675
+aline .151765 .043815
+aline .15113 .042545
+aline .14732 .031115
+bezier .144748 .263535E-01 .14568 .144287E-01 .15367 .019685
+bezier .167573 .277913E-01 .165823 .470838E-01 .17526 .057785
+bezier .183879 .627112E-01 .198284 .563439E-01 .193675 .045085
+bezier .187776 .209736E-01 .168402 -.913795E-02 .1397 -.00127
+bezier .118759 .65336E-02 .120454 .334988E-01 .128905 .050165
+bezier .135449 .732873E-01 .147191 .972337E-01 .14605 .12065
+bezier .14477 .13586 .125533 .131261 .117475 .12446
+bezier .900366E-01 .100157 .832377E-01 .061239 .073025 .027305
+bezier .069296 .161935E-01 .699667E-01 -.439223E-02 .05334 -.00254
+aline .051435 -.001905
+aline .048895 -.000635
+aline .046355 .001905
+aline .04445 .005715
+aline .04445 .01143
+aline .070485 .11557
+aline .07112 .116205
+aline .07112 .12573
+aline .070485 .126365
+aline .06985 .12827
+bezier .064215 .135001 .594783E-01 .12351 .057785 .118745
+bezier .529233E-01 .109488 .556013E-01 .939233E-01 .043815 .09017
+bezier .355906E-01 .882085E-01 .261907E-01 .935076E-01 .028575 .10287
+bezier .334733E-01 .122074 .039693 .147451 .06223 .151765
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="o" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.430555 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .133985 .151765
+bezier .164003 .148816 .181629 .115113 .17653 .08763
+bezier .173453 .043178 .136518 -.445267E-02 .0889 -.00254
+bezier .572619E-01 .274436E-03 .403877E-01 .363429E-01 .046355 .06477
+bezier .050875 .108508 .874425E-01 .153759 .133985 .151765
+closepath
+! end of curve
+
+! start of curve
+amove .12319 .130175
+bezier .854742E-01 .120528 .626861E-01 .749408E-01 .07112 .038735
+bezier .745846E-01 .218997E-01 .938172E-01 .133124E-01 .108585 .02159
+bezier .141259 .379061E-01 .16192 .805174E-01 .14986 .114935
+bezier .146083 .125586 .134775 .132049 .123825 .13081
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="p" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.430555 dep=.222223 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .073025 .151765
+bezier .836812E-01 .150277 .924811E-01 .142678 .097155 .13335
+bezier .113422 .151567 .147222 .160936 .164465 .139065
+bezier .189245 .106844 .176146 .610502E-01 .15494 .029845
+bezier .139613 .772598E-02 .108223 -.137261E-01 .081915 .00381
+aline .080645 .00508
+aline .079375 .005715
+aline .074295 .010795
+aline .07366 .012065
+aline .056515 -.056515
+aline .05588 -.05715
+aline .056515 -.057785
+aline .07874 -.057785
+bezier .893017E-01 -.600486E-01 .881724E-01 -.766457E-01 .078105 -.07874
+aline .012065 -.07874
+bezier .150331E-02 -.764764E-01 .263263E-02 -.598793E-01 .0127 -.057785
+aline .031115 -.057785
+aline .03175 -.05715
+aline .07239 .10541
+aline .07493 .11557
+bezier .785316E-01 .122247 .714692E-01 .135852 .0635 .128905
+bezier .546722E-01 .118431 .560363E-01 .102787 .04826 .092075
+bezier .401111E-01 .867306E-01 .255771E-01 .913764E-01 .028575 .10287
+bezier .338036E-01 .122439 .041328 .147634 .064135 .151765
+closepath
+! end of curve
+
+! start of curve
+amove .132715 .130175
+bezier .103461 .120269 .909442E-01 .865881E-01 .085725 .059055
+bezier .851794E-01 .444267E-01 .851908E-01 .246312E-01 .100965 .018415
+bezier .127566 .208976E-01 .14232 .492328E-01 .14986 .07239
+bezier .154944 .907012E-01 .158493 .112861 .144145 .12827
+aline .141605 .12954
+aline .1397 .130175
+aline .139065 .13081
+aline .13335 .13081
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="q" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.430555 dep=.222223 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .13335 .151765
+bezier .145353 .150479 .156686 .143279 .16383 .13335
+aline .164465 .133985
+aline .1651 .13589
+aline .16637 .13843
+aline .167005 .140335
+aline .170815 .147955
+aline .173355 .150495
+aline .174625 .15113
+aline .17653 .151765
+aline .180975 .151765
+aline .184785 .14986
+aline .18669 .147955
+aline .18796 .145415
+aline .18796 .139065
+aline .14732 -.023495
+aline .139065 -.056515
+aline .13843 -.05715
+aline .139065 -.057785
+aline .165735 -.057785
+bezier .175638 -.605201E-01 .174692 -.076199 .1651 -.07874
+aline .081915 -.07874
+bezier .072012 -.760049E-01 .729579E-01 -.060326 .08255 -.057785
+aline .113665 -.057785
+aline .1143 -.05715
+aline .13081 .00889
+aline .131286 .98425E-02
+bezier .123241 .666564E-02 .11174 -.265944E-02 .10033 -.001905
+bezier .714158E-01 -.806935E-02 .481289E-01 .214798E-01 .04826 .04826
+bezier .468917E-01 .092822 .763632E-01 .143154 .122555 .151765
+aline .13335 .151765
+closepath
+! end of curve
+
+! start of curve
+amove .123825 .130175
+bezier .876503E-01 .120099 .692805E-01 .766966E-01 .07239 .042545
+bezier .074494 .300234E-01 .849053E-01 .149519E-01 .09906 .01905
+bezier .13416 .294036E-01 .152216 .702355E-01 .150495 .10414
+bezier .149025 .116852 .139791 .1331 .12446 .13081
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="r" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.430555 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .08001 .151765
+bezier .092025 .150202 .102812 .142716 .107315 .131445
+bezier .12964 .157135 .17524 .159904 .19812 .133985
+bezier .208783 .120827 .203638 .924497E-01 .18288 .09525
+bezier .170333 .974611E-01 .168414 .114896 .1778 .12192
+bezier .160024 .138654 .129677 .130323 .118745 .10922
+bezier .973313E-01 .773305E-01 .924671E-01 .374559E-01 .08001 .001905
+bezier .730061E-01 -.787094E-02 .559308E-01 -.559023E-03 .059055 .01143
+aline .08509 .11557
+bezier .905594E-01 .126555 .721969E-01 .137922 .066675 .125095
+bezier .592625E-01 .115435 .606362E-01 .101489 .05334 .092075
+bezier .451911E-01 .867306E-01 .306571E-01 .913764E-01 .033655 .10287
+bezier .388973E-01 .122878 .479091E-01 .147017 .070485 .151765
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="s" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.430555 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .13716 .151765
+bezier .152314 .150446 .17356 .14511 .177165 .127
+bezier .17847 .117412 .17593 .105365 .1651 .10287
+bezier .152087 .993038E-01 .142612 .115181 .150971 .125413
+bezier .133361 .134505 .109668 .132568 .093345 .12065
+bezier .868302E-01 .114308 .081414 .101787 .092075 .09652
+bezier .115587 .859768E-01 .147158 .921611E-01 .164465 .06858
+bezier .182476 .434928E-01 .158508 .107001E-01 .132715 .003175
+bezier .107123 -.502202E-02 .079194 -.498265E-02 .053975 .00381
+bezier .359819E-01 .944779E-02 .273168E-01 .355387E-01 .04191 .048895
+bezier .052854 .581468E-01 .712423E-01 .470028E-01 .065405 .03302
+aline .0635 .02921
+aline .062865 .028575
+aline .06223 .027305
+aline .06096 .026035
+bezier .813671E-01 .014685 .106674 .167857E-01 .12827 .02413
+bezier .141502 .287185E-01 .157953 .476806E-01 .144145 .05969
+bezier .121006 .748646E-01 .872598E-01 .644021E-01 .069215 .089535
+bezier .540984E-01 .11604 .801725E-01 .145931 .10668 .14986
+aline .11303 .15113
+aline .11811 .15113
+aline .118745 .151765
+aline .13716 .151765
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="t" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .131445 .215265
+aline .13335 .21463
+aline .13462 .213995
+aline .135255 .21336
+aline .136525 .212725
+aline .137795 .211455
+aline .1397 .207645
+aline .140335 .205105
+aline .140335 .202565
+aline .127635 .151765
+aline .127159 .150813
+aline .127635 .14986
+aline .16129 .14986
+bezier .171852 .147596 .170722 .130999 .160655 .128905
+aline .12192 .128905
+aline .098425 .034925
+bezier .934124E-01 .023296 .108257 .145347E-01 .11811 .019685
+bezier .136419 .246013E-01 .144799 .427954E-01 .15367 .05715
+bezier .161983 .636682E-01 .178594 .557941E-01 .172085 .04445
+bezier .160207 .125555E-01 .120282 -.015671 .08763 .00381
+bezier .759893E-01 .113603E-01 .719809E-01 .262002E-01 .07493 .03937
+aline .969169E-01 .127318
+aline .09652 .128905
+aline .062865 .128905
+bezier .528926E-01 .131578 .538625E-01 .147389 .0635 .14986
+aline .102235 .14986
+aline .10287 .15113
+aline .11684 .20701
+aline .11811 .20955
+aline .12192 .21336
+aline .12446 .21463
+aline .126365 .215265
+aline .131445 .215265
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="u" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.430555 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .079375 .151765
+bezier .100053 .148995 .106779 .123405 .098425 .10668
+bezier .910349E-01 .808875E-01 .754393E-01 .540238E-01 .08128 .02794
+bezier .879311E-01 .107747E-01 .111672 .199479E-01 .11811 .03302
+bezier .127758 .469428E-01 .132552 .637574E-01 .13716 .08001
+aline .1524 .14097
+bezier .155664 .154961 .178959 .151245 .175895 .136525
+aline .150495 .034925
+bezier .14738 .294818E-01 .149584 .154318E-01 .15875 .019685
+bezier .168579 .301554E-01 .16583 .477414E-01 .17526 .057785
+aline .17653 .05842
+aline .178435 .059055
+aline .18669 .059055
+aline .188595 .05842
+aline .189865 .057785
+aline .19304 .05461
+aline .193675 .05334
+bezier .194006 .362659E-01 .186317 .180355E-01 .17526 .00508
+bezier .162088 -.807309E-02 .137612 -.363734E-02 .129223 .125413E-01
+bezier .110951 -.858436E-02 .696332E-01 -.883867E-02 .059055 .02032
+bezier .497661E-01 .539234E-01 .675832E-01 .875865E-01 .078105 .11938
+aline .078105 .12827
+bezier .729548E-01 .135222 .640026E-01 .12594 .06096 .12065
+bezier .535323E-01 .111973 .557158E-01 .969643E-01 .04572 .090805
+bezier .374035E-01 .875252E-01 .025897 .926187E-01 .028575 .10287
+bezier .343649E-01 .124072 .470811E-01 .147425 .070485 .151765
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="v" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.430555 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .084455 .151765
+bezier .106528 .149507 .116375 .123027 .106045 .104775
+bezier .988966E-01 .807763E-01 .083184 .561682E-01 .09017 .031115
+bezier .989603E-01 .130358E-01 .127132 .150927E-01 .13589 .032385
+bezier .15271 .565754E-01 .15829 .881037E-01 .164465 .11557
+aline .164465 .130175
+bezier .156923 .139696 .166025 .156056 .178435 .15113
+bezier .192011 .142051 .188299 .122687 .187325 .10922
+bezier .178818 .694504E-01 .168639 .199964E-01 .128905 0
+bezier .103274 -.924287E-02 .673446E-01 .450716E-02 .06477 .034925
+bezier .625728E-01 .642693E-01 .765187E-01 .918142E-01 .08636 .118745
+aline .08636 .12573
+bezier .788056E-01 .138022 .636448E-01 .124486 .059055 .11557
+bezier .526101E-01 .107813 .548495E-01 .933554E-01 .043815 .09017
+bezier .355906E-01 .882085E-01 .261907E-01 .935076E-01 .028575 .10287
+bezier .345189E-01 .125452 .510483E-01 .147793 .07493 .151765
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="w" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.430555 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .196215 .151765
+bezier .211833 .145487 .206504 .12432 .20574 .11176
+bezier .19798 .783863E-01 .192427 .416362E-01 .17272 .0127
+bezier .157414 -.964196E-02 .119741 -.688826E-02 .10795 .017145
+bezier .940945E-01 -.110818E-01 .483589E-01 -.799131E-02 .037465 .020955
+bezier .264324E-01 .051879 .456053E-01 .824163E-01 .053975 .11176
+aline .053975 .12319
+bezier .522017E-01 .131846 .397976E-01 .126555 .0381 .13589
+bezier .353781E-01 .147203 .480041E-01 .153295 .05715 .14859
+bezier .784217E-01 .139723 .759537E-01 .111645 .06858 .09398
+bezier .624734E-01 .715823E-01 .045884 .480837E-01 .057785 .026035
+bezier .672608E-01 .150188E-01 .862849E-01 .161334E-01 .09271 .029845
+bezier .10041 .429256E-01 .104476 .578138E-01 .108585 .07239
+aline .126365 .14351
+bezier .129782 .154165 .147072 .15028 .145415 .139065
+aline .125095 .057785
+bezier .120731 .440832E-01 .12002 .213911E-01 .139065 .01905
+bezier .155501 .150797E-01 .163969 .03483 .16891 .047625
+bezier .176294 .737444E-01 .187405 .100467 .184785 .127
+aline .18415 .12954
+aline .18288 .13335
+aline .182245 .13462
+aline .18161 .136525
+aline .18161 .142875
+aline .183515 .146685
+aline .18669 .14986
+aline .18923 .15113
+aline .191135 .151765
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="x" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.430555 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .09525 .151765
+bezier .105871 .15063 .115017 .144721 .122238 .137319
+bezier .139829 .15396 .172397 .159148 .18796 .13716
+bezier .196202 .124204 .196668 .993771E-01 .178435 .09525
+bezier .164882 .922645E-01 .156464 .109583 .1651 .11938
+aline .168275 .122555
+bezier .167095 .133491 .151556 .132021 .14478 .126365
+aline .14351 .12573
+aline .14224 .12446
+aline .14097 .123825
+aline .137795 .12065
+aline .13716 .11938
+aline .13589 .11811
+aline .13335 .11303
+aline .132715 .111125
+aline .11684 .047625
+bezier .111113 .341355E-01 .120962 .154362E-01 .13716 .018415
+bezier .155493 .220808E-01 .167409 .383177E-01 .17272 .055245
+bezier .179384 .642582E-01 .199135 .577985E-01 .193675 .045085
+bezier .184209 .942095E-02 .137218 -.178125E-01 .10541 .006985
+aline .100965 .01143
+aline .10033 .0127
+bezier .822987E-01 -.835048E-02 .394082E-01 -.933389E-02 .03048 .020955
+bezier .257726E-01 .345794E-01 .031581 .563175E-01 .04953 .053975
+bezier .633567E-01 .520714E-01 .644413E-01 .322679E-01 .05334 .026035
+bezier .622102E-01 .975232E-02 .849283E-01 .232598E-01 .089535 .03683
+aline .106045 .10287
+bezier .111691 .115492 .100222 .134955 .08509 .130175
+bezier .668273E-01 .127337 .551122E-01 .110635 .050165 .09398
+bezier .431606E-01 .858191E-01 .252001E-01 .903554E-01 .028575 .10287
+bezier .035587 .127988 .580385E-01 .148536 .08382 .151765
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="y" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.430555 dep=.222223 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .08255 .151765
+bezier .10441 .149459 .113271 .12301 .103505 .10541
+bezier .960337E-01 .080412 .804883E-01 .546079E-01 .086995 .028575
+bezier .958129E-01 .106425E-01 .121189 .193736E-01 .12954 .033655
+bezier .140658 .476602E-01 .146155 .654215E-01 .15113 .08255
+aline .165735 .14097
+bezier .168999 .154961 .192294 .151245 .18923 .136525
+aline .15367 -.005715
+bezier .143179 -.043416 .112446 -.830797E-01 .06985 -.080645
+bezier .451393E-01 -.799852E-01 .280628E-01 -.448099E-01 .047625 -.027305
+bezier .059316 -.185046E-01 .769347E-01 -.315718E-01 .06985 -.045085
+aline .06858 -.047625
+aline .06731 -.048895
+aline .066675 -.050165
+aline .06604 -.0508
+aline .06477 -.051435
+bezier .652192E-01 -.612124E-01 .788425E-01 -.608214E-01 .085725 -.057785
+bezier .111411 -.482078E-01 .127103 -.194953E-01 .131128 .555625E-02
+bezier .107662 -.114249E-01 .666176E-01 -.193297E-02 .06223 .029845
+bezier .569533E-01 .630054E-01 .781045E-01 .941358E-01 .08382 .12573
+bezier .782486E-01 .137385 .064413 .125633 .060325 .11811
+bezier .052721 .109987 .555708E-01 .939833E-01 .043815 .09017
+bezier .355906E-01 .882085E-01 .261907E-01 .935076E-01 .028575 .10287
+bezier .346637E-01 .124954 .495327E-01 .147741 .07366 .151765
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="z" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.430555 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .113665 .151765
+bezier .129326 .150885 .139602 .133173 .15494 .135255
+bezier .161296 .139722 .162296 .149386 .17018 .151765
+aline .17907 .151765
+bezier .190868 .148156 .185443 .134306 .17907 .12827
+bezier .153963 .915169E-01 .115365 .675899E-01 .084455 .036195
+bezier .103331 .033877 .120234 .121018E-01 .139065 .0254
+bezier .152596 .328603E-01 .159808 .472338E-01 .164465 .061595
+bezier .17148 .069767 .189316 .065215 .186055 .052705
+bezier .17781 .200196E-01 .143209 -.128605E-01 .10795 .000635
+bezier .957002E-01 .652116E-02 .083657 .203147E-01 .069215 .0127
+bezier .605609E-01 .104177E-01 .058315 .91491E-03 .0508 -.00254
+aline .04191 -.00254
+bezier .318829E-01 -.188043E-03 .330288E-01 .121714E-01 .03937 .01778
+bezier .439641E-01 .252678E-01 .498415E-01 .318306E-01 .055245 .038735
+aline .078105 .061595
+bezier .978683E-01 .796389E-01 .120741 .957241E-01 .138049 .115697
+bezier .124188 .121241 .108804 .135398 .094615 .12319
+aline .0889 .117475
+aline .088265 .116205
+aline .08763 .11557
+aline .086995 .1143
+aline .08636 .113665
+aline .084455 .109855
+aline .08255 .10414
+aline .08128 .1016
+aline .07874 .09906
+aline .0762 .09779
+aline .06604 .09779
+aline .0635 .09906
+bezier .538308E-01 .108811 .649118E-01 .123403 .07112 .13208
+bezier .789738E-01 .142304 .906254E-01 .149598 .103505 .151765
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="{" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.694445 dep=.0833311 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .2159 .24257
+bezier .225781 .239963 .225066 .223968 .215265 .221615
+bezier .195355 .22104 .172201 .221659 .15748 .20574
+aline .155575 .20193
+aline .15494 .200025
+aline .139065 .136525
+bezier .13607 .12139 .122163 .11148 .110913 .104563
+bezier .121496 .983324E-01 .12593 .844615E-01 .12319 .073025
+aline .107315 .009525
+aline .10668 .00889
+aline .10668 .001905
+bezier .119901 -.111913E-01 .139344 -.665063E-02 .155575 -.01016
+aline .15621 -.010795
+aline .15748 -.01143
+aline .158115 -.012065
+aline .16002 -.015875
+aline .16002 -.020955
+aline .159385 -.023495
+aline .158115 -.026035
+aline .15621 -.02794
+aline .1524 -.029845
+bezier .130103 -.294211E-01 .103413 -.304129E-01 .08763 -.01143
+bezier .826525E-01 -.46849E-02 .819832E-01 .37555E-02 .083185 .01143
+aline .09906 .07493
+bezier .105035 .881442E-01 .866477E-01 .928189E-01 .07747 .094615
+aline .07366 .094615
+aline .073025 .09525
+aline .066675 .09525
+aline .06604 .095885
+aline .053975 .095885
+bezier .440937E-01 .984919E-01 .448086E-01 .114487 .05461 .11684
+bezier .748316E-01 .117244 .985976E-01 .117813 .11303 .13462
+aline .1143 .13716
+aline .11557 .14097
+aline .131445 .20447
+bezier .139201 .233508 .173622 .241126 .198755 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="|" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.694445 dep=.0833311 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .153035 .24257
+aline .15494 .241935
+aline .15748 .240665
+aline .160655 .23749
+aline .161925 .23495
+aline .16256 .233045
+aline .16256 .227965
+aline .12192 .065405
+aline .10033 -.020955
+bezier .969199E-01 -.350066E-01 .742703E-01 -.310227E-01 .0762 -.01651
+aline .076835 -.013335
+aline .117475 .149225
+aline .13843 .233045
+aline .139065 .23495
+aline .140335 .23749
+aline .14351 .240665
+aline .14605 .241935
+aline .147955 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="}" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.694445 dep=.0833311 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .10287 .24257
+bezier .122366 .241212 .150964 .236575 .155575 .212725
+aline .155575 .2032
+aline .15494 .200025
+aline .139065 .136525
+bezier .134875 .122711 .154549 .119154 .164465 .11811
+aline .1651 .117475
+aline .172085 .117475
+aline .17272 .11684
+aline .18415 .11684
+bezier .194712 .114576 .193582 .979793E-01 .183515 .095885
+bezier .163322 .953817E-01 .139187 .948924E-01 .125095 .07747
+aline .123825 .07493
+aline .12319 .073025
+aline .10668 .006985
+bezier .097977 -.213708E-01 .641996E-01 -.284018E-01 .03937 -.029845
+aline .02286 -.029845
+bezier .122983E-01 -.275814E-01 .134276E-01 -.109843E-01 .023495 -.00889
+bezier .432021E-01 -.837794E-02 .653535E-01 -.867733E-02 .080645 .00635
+aline .083185 .01143
+aline .099695 .07747
+bezier .103486 .916226E-01 .115106 .101365 .127476 .107633
+bezier .117013 .11501 .1124 .12842 .11557 .14097
+aline .131445 .20447
+bezier .135093 .215876 .118692 .218322 .111125 .220345
+aline .10668 .220345
+aline .106045 .22098
+aline .09906 .22098
+aline .098425 .221615
+aline .085725 .221615
+bezier .751633E-01 .223879 .762926E-01 .240476 .08636 .24257
+aline .10287 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="~" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .13081 .21336
+bezier .143175 .212336 .14717 .199185 .15621 .193887
+bezier .170094 .196422 .17994 .206868 .19177 .21336
+bezier .204186 .216114 .209719 .196363 .197485 .192405
+bezier .182122 .180991 .160997 .163888 .14097 .17526
+bezier .133407 .178948 .131459 .193712 .121285 .189865
+bezier .109133 .186357 .100258 .17712 .089535 .17145
+bezier .779041E-01 .168807 .715571E-01 .187665 .083185 .19177
+bezier .949653E-01 .20103 .107952 .210324 .12319 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=127 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=.173612
+set path ! start of curve
+newpath
+! start of curve
+amove .111125 .213995
+bezier .126424 .211515 .127373 .189699 .114935 .18288
+bezier .102864 .173213 .834799E-01 .185705 .089535 .20066
+aline .092075 .20574
+aline .097155 .21082
+aline .100965 .212725
+aline .10287 .21336
+aline .104775 .213995
+closepath
+! end of curve
+
+! start of curve
+amove .182245 .213995
+bezier .200572 .211006 .197455 .183701 .180975 .18034
+bezier .166219 .174331 .152928 .194497 .16383 .20574
+aline .164465 .20701
+aline .167005 .20955
+aline .168275 .210185
+aline .169545 .211455
+aline .172085 .212725
+aline .17399 .21336
+aline .17653 .213995
+closepath
+! end of curve
+
+fill
+dfont endchar
diff --git a/src/fonts/texcmmi.afm b/src/fonts/texcmmi.afm
new file mode 100644
index 0000000..d7a44a6
--- /dev/null
+++ b/src/fonts/texcmmi.afm
@@ -0,0 +1,232 @@
+StartFontMetrics 2.0
+Comment Made from TEX tfm file using TFMTOAFM.bas
+FontName CMMI10
+EncodingScheme TEXENCODING
+FullName CMMI10
+FamilyName CMMI10
+Weight Medium
+ItalicAngle 14.0363
+IsFixedPitch false
+UnderlinePosition -97
+UnderlineThickness 73
+FontBBox 0 -300 1001 1001
+CapHeight 729
+XHeight 151
+Descender -219
+Ascender 729
+StartCharMetrics 127
+C 1 ; WX 833 ; N C1 ; B 0 0 833 683 ;
+C 2 ; WX 762 ; N C2 ; B 0 0 762 683 ;
+C 3 ; WX 694 ; N C3 ; B 0 0 694 683 ;
+C 4 ; WX 742 ; N C4 ; B 0 0 742 683 ;
+C 5 ; WX 831 ; N C5 ; B 0 0 831 683 ;
+C 6 ; WX 779 ; N C6 ; B 0 0 779 683 ;
+C 7 ; WX 583 ; N C7 ; B 0 0 583 683 ;
+C 8 ; WX 666 ; N C8 ; B 0 0 666 683 ;
+C 9 ; WX 612 ; N C9 ; B 0 0 612 683 ;
+C 10 ; WX 772 ; N C10 ; B 0 0 772 683 ;
+C 11 ; WX 639 ; N C11 ; B 0 0 639 430 ;
+C 12 ; WX 565 ; N C12 ; B 0 -194 565 694 ;
+C 13 ; WX 517 ; N C13 ; B 0 -194 517 430 ;
+C 14 ; WX 444 ; N C14 ; B 0 0 444 694 ;
+C 15 ; WX 405 ; N C15 ; B 0 0 405 430 ;
+C 16 ; WX 437 ; N C16 ; B 0 -194 437 694 ;
+C 17 ; WX 496 ; N C17 ; B 0 -194 496 430 ;
+C 18 ; WX 469 ; N C18 ; B 0 0 469 694 ;
+C 19 ; WX 353 ; N C19 ; B 0 0 353 430 ;
+C 20 ; WX 576 ; N C20 ; B 0 0 576 430 ;
+C 21 ; WX 583 ; N C21 ; B 0 0 583 694 ;
+C 22 ; WX 602 ; N C22 ; B 0 -194 602 430 ;
+C 23 ; WX 493 ; N C23 ; B 0 0 493 430 ;
+C 24 ; WX 437 ; N C24 ; B 0 -194 437 694 ;
+C 25 ; WX 570 ; N C25 ; B 0 0 570 430 ;
+C 26 ; WX 517 ; N C26 ; B 0 -194 517 430 ;
+C 27 ; WX 571 ; N C27 ; B 0 0 571 430 ;
+C 28 ; WX 437 ; N C28 ; B 0 0 437 430 ;
+C 29 ; WX 540 ; N C29 ; B 0 0 540 430 ;
+C 30 ; WX 595 ; N C30 ; B 0 -194 595 694 ;
+C 31 ; WX 625 ; N C31 ; B 0 -194 625 430 ;
+C 32 ; WX 0 ; N C32 ; B 0 -194 0 694 ;
+C 33 ; WX 622 ; N C33 ; B 0 0 622 430 ;
+C 34 ; WX 466 ; N C34 ; B 0 0 466 430 ;
+C 35 ; WX 591 ; N C35 ; B 0 0 591 694 ;
+C 36 ; WX 828 ; N C36 ; B 0 0 828 430 ;
+C 37 ; WX 517 ; N C37 ; B 0 -194 517 430 ;
+C 38 ; WX 362 ; N C38 ; B 0 -97 362 430 ;
+C 39 ; WX 654 ; N C39 ; B 0 -194 654 430 ;
+C 40 ; WX 1000 ; N C40 ; B 0 134 1000 366 ;
+C 41 ; WX 1000 ; N C41 ; B 0 134 1000 366 ;
+C 42 ; WX 1000 ; N C42 ; B 0 134 1000 366 ;
+C 43 ; WX 1000 ; N C43 ; B 0 134 1000 366 ;
+C 44 ; WX 277 ; N C44 ; B 0 37 277 463 ;
+C 45 ; WX 277 ; N C45 ; B 0 37 277 463 ;
+C 46 ; WX 500 ; N C46 ; B 0 35 500 465 ;
+C 47 ; WX 500 ; N C47 ; B 0 35 500 465 ;
+C 48 ; WX 500 ; N C48 ; B 0 0 500 430 ;
+C 49 ; WX 500 ; N C49 ; B 0 0 500 430 ;
+C 50 ; WX 500 ; N C50 ; B 0 0 500 430 ;
+C 51 ; WX 500 ; N C51 ; B 0 -194 500 430 ;
+C 52 ; WX 500 ; N C52 ; B 0 -194 500 430 ;
+C 53 ; WX 500 ; N C53 ; B 0 -194 500 430 ;
+C 54 ; WX 500 ; N C54 ; B 0 0 500 644 ;
+C 55 ; WX 500 ; N C55 ; B 0 -194 500 430 ;
+C 56 ; WX 500 ; N C56 ; B 0 0 500 644 ;
+C 57 ; WX 500 ; N C57 ; B 0 -194 500 430 ;
+C 58 ; WX 277 ; N C58 ; B 0 0 277 105 ;
+C 59 ; WX 277 ; N C59 ; B 0 -194 277 105 ;
+C 60 ; WX 777 ; N C60 ; B 0 -39 777 539 ;
+C 61 ; WX 500 ; N C61 ; B 0 -250 500 750 ;
+C 62 ; WX 777 ; N C62 ; B 0 -39 777 539 ;
+C 63 ; WX 500 ; N C63 ; B 0 35 500 465 ;
+C 64 ; WX 530 ; N C64 ; B 0 0 530 694 ;
+C 65 ; WX 750 ; N A ; B 0 0 750 683 ;
+C 66 ; WX 758 ; N B ; B 0 0 758 683 ;
+C 67 ; WX 714 ; N C ; B 0 0 714 683 ;
+C 68 ; WX 827 ; N D ; B 0 0 827 683 ;
+C 69 ; WX 738 ; N E ; B 0 0 738 683 ;
+C 70 ; WX 643 ; N F ; B 0 0 643 683 ;
+C 71 ; WX 786 ; N G ; B 0 0 786 683 ;
+C 72 ; WX 831 ; N H ; B 0 0 831 683 ;
+C 73 ; WX 439 ; N I ; B 0 0 439 683 ;
+C 74 ; WX 554 ; N J ; B 0 0 554 683 ;
+C 75 ; WX 849 ; N K ; B 0 0 849 683 ;
+C 76 ; WX 680 ; N L ; B 0 0 680 683 ;
+C 77 ; WX 970 ; N M ; B 0 0 970 683 ;
+C 78 ; WX 803 ; N N ; B 0 0 803 683 ;
+C 79 ; WX 762 ; N O ; B 0 0 762 683 ;
+C 80 ; WX 642 ; N P ; B 0 0 642 683 ;
+C 81 ; WX 790 ; N Q ; B 0 -194 790 683 ;
+C 82 ; WX 759 ; N R ; B 0 0 759 683 ;
+C 83 ; WX 613 ; N S ; B 0 0 613 683 ;
+C 84 ; WX 584 ; N T ; B 0 0 584 683 ;
+C 85 ; WX 682 ; N U ; B 0 0 682 683 ;
+C 86 ; WX 583 ; N V ; B 0 0 583 683 ;
+C 87 ; WX 944 ; N W ; B 0 0 944 683 ;
+C 88 ; WX 828 ; N X ; B 0 0 828 683 ;
+C 89 ; WX 580 ; N Y ; B 0 0 580 683 ;
+C 90 ; WX 682 ; N Z ; B 0 0 682 683 ;
+C 91 ; WX 388 ; N C91 ; B 0 0 388 750 ;
+C 92 ; WX 388 ; N C92 ; B 0 -194 388 694 ;
+C 93 ; WX 388 ; N C93 ; B 0 -194 388 694 ;
+C 94 ; WX 1000 ; N C94 ; B 0 143 1000 357 ;
+C 95 ; WX 1000 ; N C95 ; B 0 143 1000 357 ;
+C 96 ; WX 416 ; N C96 ; B 0 0 416 694 ;
+C 97 ; WX 528 ; N a ; B 0 0 528 430 ;
+C 98 ; WX 429 ; N b ; B 0 0 429 694 ;
+C 99 ; WX 432 ; N c ; B 0 0 432 430 ;
+C 100 ; WX 520 ; N d ; B 0 0 520 694 ;
+C 101 ; WX 465 ; N e ; B 0 0 465 430 ;
+C 102 ; WX 489 ; N f ; B 0 -194 489 694 ;
+C 103 ; WX 476 ; N g ; B 0 -194 476 430 ;
+C 104 ; WX 576 ; N h ; B 0 0 576 694 ;
+C 105 ; WX 344 ; N i ; B 0 0 344 659 ;
+C 106 ; WX 411 ; N j ; B 0 -194 411 659 ;
+C 107 ; WX 520 ; N k ; B 0 0 520 694 ;
+C 108 ; WX 298 ; N l ; B 0 0 298 694 ;
+C 109 ; WX 878 ; N m ; B 0 0 878 430 ;
+C 110 ; WX 600 ; N n ; B 0 0 600 430 ;
+C 111 ; WX 484 ; N o ; B 0 0 484 430 ;
+C 112 ; WX 503 ; N p ; B 0 -194 503 430 ;
+C 113 ; WX 446 ; N q ; B 0 -194 446 430 ;
+C 114 ; WX 451 ; N r ; B 0 0 451 430 ;
+C 115 ; WX 468 ; N s ; B 0 0 468 430 ;
+C 116 ; WX 361 ; N t ; B 0 0 361 615 ;
+C 117 ; WX 572 ; N u ; B 0 0 572 430 ;
+C 118 ; WX 484 ; N v ; B 0 0 484 430 ;
+C 119 ; WX 715 ; N w ; B 0 0 715 430 ;
+C 120 ; WX 571 ; N x ; B 0 0 571 430 ;
+C 121 ; WX 490 ; N y ; B 0 -194 490 430 ;
+C 122 ; WX 465 ; N z ; B 0 0 465 430 ;
+C 123 ; WX 322 ; N C123 ; B 0 0 322 430 ;
+C 124 ; WX 384 ; N C124 ; B 0 -194 384 430 ;
+C 125 ; WX 636 ; N C125 ; B 0 -194 636 430 ;
+C 126 ; WX 500 ; N C126 ; B 0 0 500 714 ;
+C 127 ; WX 277 ; N C127 ; B 0 0 277 694 ;
+EndCharMetrics
+
+StartKernData
+StartKernPairs 81
+KPX C5 C58 -56
+KPX C5 C59 -56
+KPX C5 C61 -56
+KPX C7 C58 -112
+KPX C7 C59 -112
+KPX C7 C61 -56
+KPX C9 C58 -56
+KPX C9 C59 -56
+KPX C9 C61 -56
+KPX C14 C58 -56
+KPX C14 C59 -56
+KPX C23 C58 -56
+KPX C23 C59 -56
+KPX C27 C58 -56
+KPX C27 C59 -56
+KPX C28 C58 -56
+KPX C28 C59 -56
+KPX C61 C1 -56
+KPX C61 A -56
+KPX C61 M -56
+KPX C61 N -56
+KPX C61 Y 55
+KPX C61 Z -56
+KPX C C58 -56
+KPX C C59 -56
+KPX C C61 -28
+KPX F C58 -112
+KPX F C59 -112
+KPX F C61 -56
+KPX H C58 -56
+KPX H C59 -56
+KPX H C61 -56
+KPX J C58 -112
+KPX J C59 -112
+KPX J C61 -56
+KPX K C58 -56
+KPX K C59 -56
+KPX K C61 -56
+KPX M C58 -56
+KPX M C59 -56
+KPX M C61 -56
+KPX N C58 -56
+KPX N C59 -56
+KPX N C61 -84
+KPX P C58 -112
+KPX P C59 -112
+KPX P C61 -56
+KPX S C58 -56
+KPX S C59 -56
+KPX S C61 -56
+KPX T C58 -56
+KPX T C59 -56
+KPX T C61 -28
+KPX U C58 -112
+KPX U C59 -112
+KPX U C61 -56
+KPX V C58 -167
+KPX V C59 -167
+KPX V C61 -112
+KPX W C58 -167
+KPX W C59 -167
+KPX W C61 -112
+KPX X C58 -56
+KPX X C59 -56
+KPX X C61 -84
+KPX Y C58 -167
+KPX Y C59 -167
+KPX Y C61 -112
+KPX Z C58 -56
+KPX Z C59 -56
+KPX Z C61 -56
+KPX d Y 55
+KPX d Z -56
+KPX d f -167
+KPX d j -112
+KPX f C58 -56
+KPX f C59 -56
+KPX j C58 -56
+KPX j C59 -56
+KPX r C58 -56
+KPX r C59 -56
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/src/fonts/texcmmi.gle b/src/fonts/texcmmi.gle
new file mode 100644
index 0000000..7655624
--- /dev/null
+++ b/src/fonts/texcmmi.gle
@@ -0,0 +1,6870 @@
+dfont file_name="CMMI10"
+dfont font_name="CMMI10"
+dfont design= .35146
+dfont slant= .25
+dfont space= 0
+dfont stretch= 0
+dfont shrink= 0
+dfont x_hei= .151323
+dfont quad= .351461
+dfont extra_space= 0
+dfont paint="FILL"
+!------------------ end of main parameters
+dfont char=0 !-------------- Beginning of new char.
+dfont wid=.615278 hei=.683332 dep=0 italic=.13889
+dfont fby=":" kadd=-.111112
+dfont fby=";" kadd=-.111112
+dfont fby="=" kadd=-.0555553
+dfont fby=127 kadd=.0833359
+set path ! start of curve
+newpath
+! start of curve
+amove .25146 .23749
+aline .25273 .236855
+bezier .253911 .218241 .248392 .198892 .24765 .179705
+aline .247015 .17907
+aline .247015 .17399
+aline .24638 .173355
+aline .24638 .16891
+aline .245745 .168275
+aline .245745 .163195
+aline .24511 .160655
+aline .243205 .15875
+aline .239395 .15875
+aline .238125 .159385
+aline .23749 .16002
+bezier .236957 .179059 .245947 .204422 .2286 .21971
+bezier .22032 .225149 .210283 .226156 .201295 .22733
+aline .14351 .22733
+aline .142875 .226695
+aline .1397 .226695
+aline .139065 .22606
+aline .136525 .22479
+aline .13589 .224155
+aline .133985 .220345
+aline .13335 .21844
+aline .09271 .05588
+aline .084455 .02286
+bezier .804174E-01 .016341 .086146 .943981E-02 .093345 .010795
+aline .09398 .01016
+aline .1016 .01016
+aline .102235 .009525
+aline .122555 .009525
+aline .123825 .00889
+aline .12446 .008255
+aline .125095 .006985
+aline .125095 .00508
+aline .12446 .00254
+aline .12319 0
+aline .12192 -.000635
+aline .109855 -.000635
+aline .10922 0
+aline .073025 0
+aline .07239 .000635
+aline .05715 .000635
+aline .056515 0
+aline .0254 0
+aline .024765 -.000635
+aline .01651 -.000635
+aline .014605 .00127
+aline .014605 .005715
+aline .01524 .00762
+aline .017145 .009525
+aline .03429 .009525
+bezier .418056E-01 .104407E-01 .528688E-01 .108563E-01 .05461 .020955
+aline .09525 .183515
+aline .103505 .216535
+aline .10414 .21717
+aline .10414 .22352
+aline .10287 .22479
+aline .100965 .225425
+aline .10033 .22606
+aline .097155 .22606
+aline .09652 .226695
+aline .090805 .226695
+aline .09017 .22733
+aline .07366 .22733
+aline .07239 .227965
+aline .07112 .230505
+aline .07112 .231775
+aline .071755 .234315
+aline .07239 .235585
+aline .074295 .23749
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=1 !-------------- Beginning of new char.
+dfont wid=.833336 hei=.683332 dep=0 italic=0
+dfont fby=127 kadd=.166672
+set path ! start of curve
+newpath
+! start of curve
+amove .212725 .25019
+aline .213995 .249555
+aline .215265 .248285
+aline .2159 .247015
+aline .216535 .24511
+aline .2286 .19685
+aline .229235 .193675
+aline .25654 .084455
+aline .257175 .08128
+aline .27686 .00254
+aline .276225 .000635
+aline .27559 0
+aline .27432 -.000635
+aline .018415 -.000635
+bezier .175593E-01 .692703E-02 .272109E-01 .127106E-01 .03048 .019685
+bezier .887211E-01 .959207E-01 .144728 .174239 .203835 .249555
+aline .20574 .25019
+closepath
+! end of curve
+
+! start of curve
+amove .189865 .21717
+bezier .142716 .152345 .918106E-01 .883973E-01 .046355 .023495
+aline .23876 .023495
+aline .239395 .02413
+aline .23876 .024765
+aline .235585 .037465
+aline .23495 .04064
+aline .207645 .14986
+aline .20701 .153035
+aline .191135 .216535
+aline .1905 .217805
+aline .189865 .21717
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=2 !-------------- Beginning of new char.
+dfont wid=.762776 hei=.683332 dep=0 italic=.0277786
+dfont fby=127 kadd=.0833359
+set path ! start of curve
+newpath
+! start of curve
+amove .178435 .24638
+bezier .22258 .244767 .259602 .203036 .258445 .159385
+bezier .263292 .751295E-01 .186191 -.114417E-01 .09906 -.008255
+bezier .581274E-01 -.680577E-02 .209248E-01 .290856E-01 .01905 .070485
+bezier .980682E-02 .152672 .800858E-01 .238076 .16256 .24638
+aline .178435 .24638
+closepath
+! end of curve
+
+! start of curve
+amove .161925 .23876
+bezier .104624 .230654 .686806E-01 .175276 .055245 .122555
+bezier .457319E-01 .088211 .415545E-01 .486592E-01 .065405 .018415
+bezier .916676E-01 -.112125E-01 .136994 -.21687E-02 .164465 .020955
+bezier .209514 .564662E-01 .229331 .117907 .229235 .17272
+bezier .2275 .200687 .211051 .233618 .179705 .238125
+aline .17907 .23876
+aline .17526 .23876
+aline .174625 .239395
+aline .16256 .239395
+aline .161925 .23876
+closepath
+! end of curve
+
+! start of curve
+amove .08636 .14351
+aline .08763 .142875
+aline .0889 .140335
+aline .0889 .1397
+aline .872331E-01 .133033
+aline .08763 .131445
+aline .196215 .131445
+aline .19685 .132715
+aline .198755 .140335
+aline .200025 .142875
+aline .201295 .14351
+aline .205105 .14351
+aline .206375 .142875
+aline .207645 .140335
+aline .207645 .1397
+aline .197485 .09906
+aline .19685 .097155
+aline .194945 .09525
+aline .191135 .09525
+aline .189865 .095885
+aline .18923 .09652
+aline .188595 .09779
+aline .188595 .099695
+aline .189865 .104775
+aline .190288 .106045
+aline .189865 .107315
+aline .08128 .107315
+aline .080645 .10668
+aline .07874 .09906
+aline .078105 .097155
+aline .0762 .09525
+aline .07239 .09525
+aline .07112 .095885
+aline .070485 .09652
+aline .06985 .09779
+aline .06985 .099695
+aline .08001 .140335
+aline .08128 .142875
+aline .08255 .14351
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=3 !-------------- Beginning of new char.
+dfont wid=.694446 hei=.683332 dep=0 italic=0
+dfont fby=127 kadd=.166672
+set path ! start of curve
+newpath
+! start of curve
+amove .18796 .25019
+aline .18923 .249555
+bezier .196906 .17627 .199821 .101502 .206375 .02794
+bezier .205127 .194262E-01 .207779 .860123E-02 .21844 .01016
+aline .219075 .009525
+aline .231775 .009525
+aline .23368 .00762
+aline .23368 .00381
+aline .233045 .001905
+aline .23241 .000635
+aline .231775 0
+aline .230505 -.000635
+aline .22225 -.000635
+aline .221615 0
+aline .19812 0
+aline .197485 .000635
+aline .184785 .000635
+aline .18415 0
+aline .153035 0
+aline .1524 -.000635
+aline .144145 -.000635
+aline .142875 0
+aline .141605 .00254
+aline .141605 .003175
+aline .14224 .005715
+aline .142875 .00762
+aline .14478 .009525
+bezier .155863 .964854E-02 .170044 .888723E-02 .17653 .019685
+bezier .172171 .808923E-01 .16816 .142244 .163195 .2032
+bezier .130248 .14439 .955228E-01 .866468E-01 .0635 .027305
+bezier .585488E-01 .150453E-01 .073392 .845924E-02 .083185 .009525
+aline .08509 .00762
+aline .08509 .00381
+aline .084455 .00127
+aline .08255 -.000635
+bezier .596185E-01 .611983E-03 .364639E-01 .138827E-03 .01397 0
+aline .013335 .000635
+aline .0127 .001905
+aline .0127 .004445
+aline .013335 .00635
+aline .014605 .00889
+bezier .336373E-01 .862413E-02 .506773E-01 .220121E-01 .05842 .03937
+bezier .991125E-01 .108877 .137838 .179802 .17907 .24892
+aline .18034 .249555
+aline .18161 .25019
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=4 !-------------- Beginning of new char.
+dfont wid=.742363 hei=.683332 dep=0 italic=.0756941
+dfont fby=127 kadd=.0833359
+set path ! start of curve
+newpath
+! start of curve
+amove .27051 .236855
+aline .272415 .23495
+bezier .270852 .218398 .266931 .202355 .26416 .186055
+aline .262255 .18415
+bezier .253392 .182387 .256373 .192346 .25781 .19685
+aline .25781 .20066
+aline .258445 .201295
+aline .258445 .206375
+aline .25908 .20701
+aline .25908 .211455
+aline .258445 .21209
+aline .258082 .212816
+aline .255905 .21336
+aline .25527 .213995
+aline .245745 .213995
+aline .24511 .21463
+aline .098425 .21463
+aline .09779 .213995
+aline .088265 .213995
+bezier .808567E-01 .214357 .796782E-01 .204927 .076835 .19939
+aline .07239 .186055
+aline .070485 .18415
+aline .066675 .18415
+aline .065405 .184785
+aline .06477 .18542
+aline .064135 .18669
+bezier .685444E-01 .203258 .738423E-01 .220264 .08001 .23622
+aline .08128 .236855
+aline .27051 .236855
+closepath
+! end of curve
+
+! start of curve
+amove .093345 .151765
+aline .09525 .14986
+aline .09525 .14732
+aline .923131E-01 .135573
+aline .09271 .133985
+aline .20955 .133985
+aline .210185 .135255
+aline .21336 .147955
+aline .213995 .14986
+aline .21463 .15113
+aline .2159 .151765
+aline .220345 .151765
+aline .22225 .14986
+aline .22225 .14732
+aline .20955 .09652
+aline .208915 .09525
+aline .207645 .09398
+aline .202565 .09398
+aline .20193 .094615
+aline .201295 .095885
+aline .201295 .099695
+aline .203835 .109855
+aline .204311 .110808
+aline .203835 .11176
+aline .08636 .11176
+aline .08255 .09652
+aline .081915 .09525
+aline .080645 .09398
+aline .075565 .09398
+aline .07493 .094615
+aline .074295 .095885
+aline .074295 .099695
+aline .08636 .147955
+aline .086995 .14986
+aline .08763 .15113
+aline .0889 .151765
+aline .093345 .151765
+closepath
+! end of curve
+
+! start of curve
+amove .034925 .05588
+aline .03683 .053975
+bezier .366622E-01 .432137E-01 .316534E-01 .033138 .03429 .02286
+aline .037465 .02286
+aline .0381 .022225
+aline .047625 .022225
+aline .04826 .02159
+aline .19558 .02159
+bezier .202896 .232273E-01 .214203 .198548E-01 .2159 .03048
+aline .21717 .03302
+aline .21844 .03683
+aline .219075 .0381
+aline .22352 .051435
+aline .224155 .053975
+aline .22606 .05588
+aline .230505 .05588
+aline .23241 .053975
+bezier .228515 .357825E-01 .221958 .177011E-01 .2159 0
+aline .21463 -.000635
+aline .02159 -.000635
+aline .019685 .00127
+bezier .211037E-01 .190033E-01 .258028E-01 .360828E-01 .028575 .053975
+aline .03048 .05588
+aline .034925 .05588
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=5 !-------------- Beginning of new char.
+dfont wid=.831251 hei=.683332 dep=0 italic=.0812483
+dfont fby=":" kadd=-.0555553
+dfont fby=";" kadd=-.0555553
+dfont fby="=" kadd=-.0555553
+dfont fby=127 kadd=.0555573
+set path ! start of curve
+newpath
+! start of curve
+amove .306705 .23749
+aline .30861 .235585
+aline .30861 .23114
+aline .307975 .229235
+aline .30607 .22733
+aline .288925 .22733
+bezier .281409 .226414 .270346 .225999 .268605 .2159
+aline .227965 .05334
+aline .21971 .02032
+aline .219075 .019685
+aline .219075 .013335
+aline .220345 .012065
+aline .22225 .01143
+aline .222885 .010795
+aline .22606 .010795
+aline .226695 .01016
+aline .23241 .01016
+aline .233045 .009525
+aline .249555 .009525
+aline .250825 .00889
+aline .252095 .00635
+aline .252095 .00508
+aline .25146 .00254
+aline .250825 .00127
+aline .24892 -.000635
+aline .23876 -.000635
+aline .238125 0
+aline .207645 0
+aline .20701 .000635
+aline .19304 .000635
+aline .192405 0
+aline .16129 0
+aline .160655 -.000635
+aline .1524 -.000635
+aline .150495 .00127
+aline .150495 .005715
+aline .15113 .00762
+aline .153035 .009525
+aline .17018 .009525
+bezier .177696 .104407E-01 .188759 .108563E-01 .1905 .020955
+aline .23114 .183515
+aline .241697 .225743
+aline .2413 .22733
+aline .13589 .22733
+aline .135255 .22606
+aline .094615 .0635
+aline .08382 .02032
+aline .083185 .019685
+aline .083185 .013335
+aline .084455 .012065
+aline .08636 .01143
+aline .086995 .010795
+aline .09017 .010795
+aline .090805 .01016
+aline .09652 .01016
+aline .097155 .009525
+aline .113665 .009525
+aline .114935 .00889
+aline .116205 .00635
+aline .116205 .00508
+aline .11557 .00254
+aline .114935 .00127
+aline .11303 -.000635
+aline .10287 -.000635
+aline .102235 0
+aline .071755 0
+aline .07112 .000635
+aline .05715 .000635
+aline .056515 0
+aline .0254 0
+aline .024765 -.000635
+aline .01651 -.000635
+aline .014605 .00127
+aline .014605 .005715
+aline .01524 .00762
+aline .017145 .009525
+aline .03429 .009525
+bezier .418056E-01 .104407E-01 .528688E-01 .108563E-01 .05461 .020955
+aline .09525 .183515
+aline .103505 .216535
+aline .10414 .21717
+aline .10414 .22352
+aline .10287 .22479
+aline .100965 .225425
+aline .10033 .22606
+aline .097155 .22606
+aline .09652 .226695
+aline .090805 .226695
+aline .09017 .22733
+aline .07366 .22733
+aline .07239 .227965
+aline .07112 .230505
+aline .07112 .231775
+aline .071755 .234315
+aline .07239 .235585
+aline .074295 .23749
+aline .306705 .23749
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=6 !-------------- Beginning of new char.
+dfont wid=.779863 hei=.683332 dep=0 italic=.0576382
+dfont fby=127 kadd=.0833359
+set path ! start of curve
+newpath
+! start of curve
+amove .281305 .23876
+aline .28321 .236855
+bezier .280245 .211331 .278415 .185636 .273685 .160655
+aline .272415 .16002
+aline .268605 .16002
+aline .2667 .161925
+bezier .268082 .18147 .271417 .205585 .254 .21971
+bezier .239928 .227051 .224996 .227196 .210185 .2286
+aline .114935 .2286
+bezier .128338 .192468 .146236 .156682 .16129 .12065
+aline .16129 .117475
+bezier .123499 .825448E-01 .847849E-01 .488949E-01 .04699 .01397
+aline .047625 .013335
+aline .153035 .013335
+bezier .178804 .145244E-01 .210089 .176796E-01 .22606 .042545
+bezier .236116 .537035E-01 .239501 .700601E-01 .24765 .081915
+aline .25146 .081915
+aline .253365 .08001
+bezier .245714 .529769E-01 .234224 .264519E-01 .224155 0
+aline .222885 -.000635
+aline .023495 -.000635
+aline .02159 .00127
+aline .02159 .004445
+bezier .581702E-01 .390339E-01 .097462 .715221E-01 .133112 .106362
+bezier .115285 .147836 .967851E-01 .189096 .07874 .230505
+aline .07874 .234315
+aline .079375 .23622
+aline .08001 .23749
+aline .080645 .238125
+aline .081915 .23876
+aline .281305 .23876
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=7 !-------------- Beginning of new char.
+dfont wid=.583333 hei=.683332 dep=0 italic=.13889
+dfont fby=":" kadd=-.111112
+dfont fby=";" kadd=-.111112
+dfont fby="=" kadd=-.0555553
+dfont fby=127 kadd=.0555573
+set path ! start of curve
+newpath
+! start of curve
+amove .0762 .24638
+bezier .10345 .245059 .118521 .215825 .11938 .19177
+aline .11938 .182245
+aline .120015 .18161
+aline .120015 .174625
+aline .11938 .17399
+aline .11938 .16256
+aline .118957 .16129
+aline .11938 .16002
+bezier .135247 .197892 .160849 .240546 .205105 .24638
+bezier .22497 .250186 .244984 .233954 .244475 .21336
+aline .24511 .212725
+aline .24511 .20193
+aline .244475 .201295
+aline .244475 .197485
+aline .24384 .19685
+bezier .246546 .189846 .235163 .182744 .23241 .1905
+bezier .238744 .206558 .221669 .22263 .20574 .22098
+bezier .178913 .222156 .156746 .198476 .14478 .175895
+bezier .135073 .157249 .127761 .137383 .12319 .11684
+aline .099695 .02286
+bezier .956574E-01 .016341 .101386 .943981E-02 .108585 .010795
+aline .10922 .01016
+aline .11684 .01016
+aline .117475 .009525
+aline .137795 .009525
+aline .139065 .00889
+aline .1397 .008255
+aline .140335 .006985
+aline .140335 .00508
+aline .1397 .00254
+aline .13843 0
+aline .13716 -.000635
+aline .125095 -.000635
+aline .12446 0
+aline .088265 0
+aline .08763 .000635
+aline .07112 .000635
+aline .070485 0
+aline .033655 0
+aline .03302 -.000635
+aline .02286 -.000635
+aline .02159 0
+aline .02032 .00254
+aline .02032 .003175
+aline .020955 .005715
+aline .02159 .00762
+aline .023495 .009525
+bezier .383129E-01 .103562E-01 .539729E-01 .717217E-02 .066675 .01524
+aline .06731 .01651
+aline .067945 .017145
+aline .06985 .020955
+aline .094615 .120015
+bezier .1015 .149277 .1084 .18237 .090805 .20955
+bezier .701805E-01 .23262 .278862E-01 .218995 .02032 .189865
+aline .018415 .18796
+aline .01651 .187325
+aline .0127 .187325
+aline .01143 .18796
+aline .010795 .188595
+bezier .142857E-01 .214346 .350393E-01 .239059 .06096 .245745
+aline .064135 .245745
+aline .06477 .24638
+aline .0762 .24638
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=8 !-------------- Beginning of new char.
+dfont wid=.666667 hei=.683332 dep=0 italic=0
+dfont fby=127 kadd=.0833359
+set path ! start of curve
+newpath
+! start of curve
+amove .100965 .23876
+aline .1016 .238125
+aline .13716 .238125
+aline .137795 .23749
+aline .154305 .23749
+aline .15494 .238125
+aline .191135 .238125
+aline .19177 .23876
+aline .20193 .23876
+aline .203835 .236855
+aline .203835 .23368
+aline .2032 .23114
+aline .202565 .22987
+bezier .188727 .226604 .173352 .230658 .16002 .22479
+aline .156845 .221615
+aline .15494 .217805
+aline .154305 .2159
+aline .14859 .19304
+aline .148114 .192088
+bezier .178252 .188848 .218272 .17427 .22479 .139065
+bezier .229582 .101399 .194572 .721713E-01 .16256 .059055
+bezier .14663 .050854 .127097 .493721E-01 .11176 .04572
+aline .106045 .02286
+bezier .102007 .016341 .107736 .943981E-02 .114935 .010795
+aline .11557 .01016
+aline .12319 .01016
+aline .123825 .009525
+aline .144145 .009525
+aline .145415 .00889
+aline .14605 .008255
+aline .146685 .006985
+aline .146685 .00508
+aline .14605 .00254
+aline .14478 0
+aline .14351 -.000635
+aline .13208 -.000635
+aline .131445 0
+aline .09525 0
+aline .094615 .000635
+aline .078105 .000635
+aline .07747 0
+aline .041275 0
+aline .04064 -.000635
+aline .031115 -.000635
+aline .029845 0
+aline .028575 .00254
+aline .028575 .003175
+aline .02921 .005715
+aline .029845 .00762
+aline .03175 .009525
+bezier .465679E-01 .103562E-01 .622279E-01 .717217E-02 .07493 .01524
+aline .075565 .01651
+aline .0762 .017145
+aline .078105 .020955
+aline .842169E-01 .454025E-01
+bezier .743061E-01 .499934E-01 .600713E-01 .491837E-01 .048895 .055245
+bezier .212979E-01 .652182E-01 -.288244E-03 .962826E-01 .012065 .125095
+bezier .030089 .166662 .780774E-01 .187626 .12065 .191135
+aline .127 .216535
+aline .127635 .21717
+aline .127635 .22352
+aline .127 .224155
+aline .126365 .225425
+aline .12446 .22606
+aline .12192 .226695
+aline .121285 .22733
+aline .11811 .22733
+aline .117475 .227965
+aline .10922 .227965
+aline .108585 .2286
+aline .088265 .2286
+aline .08636 .230505
+aline .08636 .234315
+aline .086995 .236855
+aline .0889 .23876
+aline .100965 .23876
+closepath
+! end of curve
+
+! start of curve
+amove .117475 .183515
+bezier .815288E-01 .180442 .487513E-01 .154101 .042545 .117475
+bezier .367737E-01 .986564E-01 .397289E-01 .745972E-01 .05842 .0635
+aline .06731 .059055
+aline .073025 .05715
+aline .078105 .05588
+aline .08128 .055245
+aline .081915 .05461
+aline .08509 .05461
+aline .860425E-01 .541338E-01
+aline .864507E-01 .543379E-01
+aline .118507 .182563
+aline .11811 .18415
+aline .117475 .183515
+closepath
+! end of curve
+
+! start of curve
+amove .14605 .18288
+aline .145415 .18034
+aline .1143 .05588
+aline .113824 .549275E-01
+bezier .147233 .555245E-01 .18236 .801278E-01 .189865 .114935
+bezier .197604 .135875 .19594 .16431 .173355 .175895
+aline .169545 .1778
+aline .16764 .178435
+aline .16637 .17907
+aline .15875 .18161
+aline .1524 .18288
+aline .151765 .183515
+aline .14859 .183515
+aline .14732 .183938
+aline .146431 .183642
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=9 !-------------- Beginning of new char.
+dfont wid=.612223 hei=.683332 dep=0 italic=.110001
+dfont fby=":" kadd=-.0555553
+dfont fby=";" kadd=-.0555553
+dfont fby="=" kadd=-.0555553
+dfont fby=127 kadd=.0555573
+set path ! start of curve
+newpath
+! start of curve
+amove .09271 .23876
+aline .093345 .238125
+aline .128905 .238125
+aline .12954 .23749
+aline .14605 .23749
+aline .146685 .238125
+aline .18288 .238125
+aline .183515 .23876
+aline .193675 .23876
+aline .19558 .236855
+aline .19558 .23368
+aline .194945 .23114
+aline .19431 .22987
+bezier .180472 .226604 .165097 .230658 .151765 .22479
+aline .14859 .221615
+aline .146685 .217805
+aline .14605 .2159
+aline .106283 .568325E-01
+aline .106589 .556078E-01
+bezier .149171 .646628E-01 .171149 .108433 .179705 .147955
+bezier .185482 .166668 .194358 .18871 .215265 .193675
+aline .240665 .193675
+aline .24257 .19177
+aline .24257 .188595
+aline .240665 .18669
+bezier .216948 .185207 .209825 .157167 .20447 .137795
+bezier .193411 .901883E-01 .153316 .506054E-01 .103858 .464256E-01
+aline .103505 .04572
+aline .09779 .02286
+bezier .937524E-01 .016341 .099481 .943981E-02 .10668 .010795
+aline .107315 .01016
+aline .114935 .01016
+aline .11557 .009525
+aline .13589 .009525
+aline .13716 .00889
+aline .137795 .008255
+aline .13843 .006985
+aline .13843 .00508
+aline .137795 .00254
+aline .136525 0
+aline .135255 -.000635
+aline .123825 -.000635
+aline .12319 0
+aline .086995 0
+aline .08636 .000635
+aline .06985 .000635
+aline .069215 0
+aline .03302 0
+aline .032385 -.000635
+aline .02286 -.000635
+aline .02159 0
+aline .02032 .00254
+aline .02032 .003175
+aline .020955 .005715
+aline .02159 .00762
+aline .023495 .009525
+bezier .383129E-01 .103562E-01 .539729E-01 .717217E-02 .066675 .01524
+aline .06731 .01651
+aline .067945 .017145
+aline .06985 .020955
+aline .759619E-01 .454025E-01
+aline .075565 .04699
+bezier .476635E-01 .492439E-01 .205134E-01 .716947E-01 .02032 .100965
+bezier .015019 .126454 .308559E-01 .151899 .026035 .17653
+bezier .250389E-01 .184751 .168146E-01 .186168 .010795 .18796
+aline .01016 .18923
+aline .01016 .191135
+aline .010795 .192405
+aline .01143 .19304
+bezier .248738E-01 .193432 .441325E-01 .198091 .051435 .18288
+bezier .613712E-01 .149348 .357321E-01 .116002 .04826 .08255
+bezier .517548E-01 .680605E-01 .642743E-01 .582393E-01 .078105 .05461
+aline .07874 .056515
+aline .118745 .216535
+aline .11938 .21717
+aline .11938 .22352
+aline .118745 .224155
+aline .11811 .225425
+aline .116205 .22606
+aline .113665 .226695
+aline .11303 .22733
+aline .109855 .22733
+aline .10922 .227965
+aline .100965 .227965
+aline .10033 .2286
+aline .08001 .2286
+aline .078105 .230505
+aline .078105 .234315
+aline .07874 .236855
+aline .080645 .23876
+aline .09271 .23876
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=10 !-------------- Beginning of new char.
+dfont wid=.772398 hei=.683332 dep=0 italic=.0501728
+dfont fby=127 kadd=.0833359
+set path ! start of curve
+newpath
+! start of curve
+amove .197485 .24638
+bezier .232549 .2451 .271666 .221258 .27559 .183515
+bezier .279262 .136109 .241036 .101779 .212725 .069215
+bezier .199538 .542551E-01 .184447 .388515E-01 .1778 .02032
+aline .21336 .02032
+bezier .219908 .210496E-01 .228321 .218646E-01 .230505 .029845
+aline .23114 .03048
+aline .23368 .03556
+aline .234315 .036195
+aline .243205 .053975
+aline .244475 .05461
+aline .248285 .05461
+aline .249555 .053975
+aline .250825 .051435
+aline .250825 .0508
+aline .25019 .048895
+aline .23876 .026035
+aline .238125 .02413
+aline .22606 0
+aline .22479 -.000635
+aline .1651 -.000635
+aline .163195 .00127
+bezier .175354 .613574E-01 .226967 .103235 .240665 .163195
+bezier .249088 .189933 .238978 .227857 .207645 .23622
+bezier .158743 .250239 .107225 .210297 .09525 .16256
+bezier .786395E-01 .10836 .108395 .541772E-01 .092075 0
+aline .090805 -.000635
+aline .031115 -.000635
+aline .02921 .00127
+aline .02921 .051435
+aline .03048 .053975
+aline .03175 .05461
+aline .03556 .05461
+aline .03683 .053975
+aline .0381 .051435
+aline .0381 .0508
+aline .037465 .050165
+aline .037465 .036195
+aline .0381 .03556
+aline .0381 .026035
+aline .038735 .0254
+aline .392994E-01 .225778E-01
+aline .040005 .022225
+aline .04318 .02159
+aline .043815 .020955
+aline .048895 .020955
+aline .04953 .02032
+aline .08763 .02032
+bezier .090907 .637735E-01 .518651E-01 .102663 .05842 .146685
+bezier .636253E-01 .202564 .120045 .239213 .17145 .245745
+aline .1778 .245745
+aline .178435 .24638
+aline .197485 .24638
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=11 !-------------- Beginning of new char.
+dfont wid=.639702 hei=.430555 dep=0 italic=.00370216
+dfont fby=127 kadd=.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .11557 .15367
+bezier .144311 .151704 .165269 .124019 .167005 .09652
+aline .167005 .06858
+aline .16764 .067945
+aline .16764 .061595
+bezier .176589 .698188E-01 .183465 .849824E-01 .189865 .097155
+bezier .196081 .109399 .199126 .124006 .20447 .13589
+aline .205105 .136525
+aline .20955 .136525
+aline .211455 .13462
+bezier .205005 .102219 .188925 .716129E-01 .16764 .04699
+bezier .168391 .316432E-01 .164874 .140432E-01 .17653 .00254
+bezier .188508 .16991E-02 .196185 .129719E-01 .200025 .02286
+aline .201295 .023495
+aline .205105 .023495
+aline .206375 .02286
+bezier .208205 .413503E-02 .183494 -.103441E-01 .16637 -.00254
+bezier .154914 .002069 .148622 .133954E-01 .145415 .024765
+bezier .116319 .211778E-03 .692248E-01 -.176854E-01 .03556 .00762
+bezier .149712E-02 .379491E-01 .151301E-01 .938598E-01 .04445 .122555
+bezier .620637E-01 .142096 .886632E-01 .155768 .11557 .15367
+closepath
+! end of curve
+
+! start of curve
+amove .10414 .14605
+bezier .649127E-01 .138438 .497289E-01 .949403E-01 .04318 .05969
+bezier .374916E-01 .394322E-01 .415503E-01 .722037E-02 .06731 .00254
+bezier .953796E-01 .140341E-02 .123371 .149234E-01 .144145 .033655
+aline .144145 .08763
+bezier .142427 .106913 .141372 .133408 .121285 .144145
+aline .117475 .145415
+aline .1143 .14605
+aline .113665 .146685
+aline .104775 .146685
+aline .10414 .14605
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=12 !-------------- Beginning of new char.
+dfont wid=.565626 hei=.694445 dep=.194445 italic=.0527782
+dfont fby=127 kadd=.0833359
+set path ! start of curve
+newpath
+! start of curve
+amove .16637 .24638
+bezier .191532 .245102 .211681 .21908 .20574 .19431
+bezier .204031 .171268 .187438 .152258 .16891 .140335
+bezier .202673 .116795 .19626 .668614E-01 .17399 .037465
+bezier .150211 .260483E-02 .098155 -.202257E-01 .061595 .00762
+bezier .528548E-01 .150909E-01 .046553 .245696E-01 .04318 .03556
+aline .01778 -.06604
+aline .017145 -.067945
+aline .01651 -.06858
+aline .01524 -.069215
+aline .010795 -.069215
+aline .009525 -.067945
+aline .00889 -.066675
+aline .00889 -.065405
+aline .04953 .097155
+aline .064135 .155575
+bezier .076512 .197951 .108346 .240315 .154305 .24638
+aline .16637 .24638
+closepath
+! end of curve
+
+! start of curve
+amove .154305 .23876
+bezier .111356 .232954 .840186E-01 .191397 .07239 .1524
+aline .051435 .06858
+bezier .434694E-01 .423637E-01 .594218E-01 .647945E-02 .09017 .003175
+bezier .124159 -.267707E-02 .150005 .030338 .158115 .060325
+bezier .164571 .848857E-01 .175125 .113323 .15621 .13462
+bezier .141718 .128791 .124717 .1286 .109855 .132715
+aline .10668 .13589
+aline .106045 .137795
+aline .106045 .140335
+aline .10668 .14224
+aline .107315 .14351
+aline .109855 .14605
+bezier .12472 .151938 .142575 .151337 .15748 .14605
+bezier .177739 .164019 .186409 .19364 .184785 .219075
+bezier .181868 .232552 .167709 .242533 .154305 .23876
+closepath
+! end of curve
+
+! start of curve
+amove .12446 .14224
+aline .120015 .14224
+aline .11938 .141605
+aline .11557 .140335
+aline .115094 .139382
+bezier .12452 .13592 .137124 .135908 .146685 .140335
+aline .14605 .14097
+aline .144145 .141605
+aline .14097 .14224
+aline .140335 .142875
+aline .125095 .142875
+aline .12446 .14224
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=13 !-------------- Beginning of new char.
+dfont wid=.517731 hei=.430555 dep=.194445 italic=.0555553
+set path ! start of curve
+newpath
+! start of curve
+amove .080645 .15367
+bezier .112542 .149654 .124088 .114272 .13081 .086995
+bezier .134435 .729655E-01 .134275 .059192 .136525 .04572
+bezier .145353 .701025E-01 .155611 .938923E-01 .16637 .117475
+aline .18161 .147955
+aline .183515 .14986
+aline .18796 .14986
+aline .188595 .149225
+aline .189865 .14859
+aline .189865 .14478
+aline .17526 .11557
+bezier .159272 .805675E-01 .143729 .441664E-01 .13335 .00762
+bezier .130545 -.019007 .124102 -.476872E-01 .1143 -.07366
+aline .11176 -.0762
+aline .11049 -.076835
+aline .10795 -.076835
+aline .10668 -.0762
+aline .10541 -.07493
+bezier .105178 -.047673 .116472 -.203452E-01 .12319 .00635
+bezier .130493 .301357E-01 .127884 .566141E-01 .12319 .08001
+bezier .11971 .10911 .922819E-01 .134576 .062865 .12827
+bezier .410147E-01 .125461 .205958E-01 .10943 .014605 .08763
+aline .012065 .08636
+aline .009525 .08636
+aline .008255 .086995
+bezier .478553E-02 .950657E-01 .118511E-01 .104828 .01524 .112395
+bezier .279067E-01 .135776 .526554E-01 .156317 .080645 .15367
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=14 !-------------- Beginning of new char.
+dfont wid=.444445 hei=.694445 dep=0 italic=.0378466
+dfont fby=":" kadd=-.0555553
+dfont fby=";" kadd=-.0555553
+dfont fby=127 kadd=.0555573
+set path ! start of curve
+newpath
+! start of curve
+amove .127635 .24638
+bezier .142445 .245015 .160656 .232024 .15875 .2159
+bezier .149402 .211929 .150041 .225567 .14478 .22987
+bezier .119723 .257118 .703353E-01 .220347 .08509 .188595
+bezier .104742 .165977 .139115 .15158 .14224 .117475
+bezier .144496 .772869E-01 .130812 .302707E-01 .09779 .00381
+bezier .669887E-01 -.190468E-01 .171682E-01 .563626E-02 .01651 .04445
+bezier .102405E-01 .909222E-01 .448721E-01 .136523 .088265 .15113
+bezier .077845 .160726 .623718E-01 .16902 .061595 .184785
+bezier .590741E-01 .219353 .939133E-01 .249597 .127635 .24638
+closepath
+! end of curve
+
+! start of curve
+amove .094615 .14351
+bezier .058301 .128581 .047886 .849969E-01 .041275 .0508
+bezier .387732E-01 .03256 .444769E-01 .788831E-02 .065405 .00254
+bezier .938122E-01 -.109356E-02 .10985 .027473 .118745 .050165
+bezier .127614 .738079E-01 .1359 .101123 .11811 .122555
+aline .117475 .123825
+aline .11557 .12573
+aline .114935 .127
+aline .102235 .1397
+aline .100965 .140335
+aline .09779 .14351
+aline .962025E-01 .143907
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=15 !-------------- Beginning of new char.
+dfont wid=.405904 hei=.430555 dep=0 italic=0
+dfont fby=127 kadd=.0555573
+set path ! start of curve
+newpath
+! start of curve
+amove .12954 .14986
+aline .13081 .149225
+aline .13208 .147955
+aline .132715 .14605
+aline .132715 .14478
+aline .13208 .14224
+aline .13081 .14097
+aline .12827 .1397
+bezier .105114 .141599 .793519E-01 .138338 .06477 .11811
+bezier .579977E-01 .109909 .526483E-01 .099081 .0508 .0889
+aline .114935 .0889
+aline .11684 .086995
+aline .117475 .08509
+aline .117475 .08382
+aline .11684 .08128
+aline .116205 .080645
+aline .114935 .08001
+aline .1143 .079375
+aline .112395 .07874
+aline .047625 .07874
+bezier .410875E-01 .554671E-01 .391631E-01 .244902E-01 .061595 .008255
+bezier .820062E-01 -.52692E-02 .105317 .808357E-02 .123825 .018415
+bezier .131211 .144186E-01 .123587 .81937E-02 .118745 .00635
+bezier .847418E-01 -.167793E-01 .305554E-01 -.197764E-02 .02032 .040005
+bezier .102294E-01 .762567E-01 .271311E-01 .117582 .060325 .13589
+bezier .072253 .143846 .870892E-01 .14818 .100965 .14986
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=16 !-------------- Beginning of new char.
+dfont wid=.437502 hei=.694445 dep=.194445 italic=.0737839
+dfont fby=127 kadd=.0833359
+set path ! start of curve
+newpath
+! start of curve
+amove .11176 .24384
+aline .113665 .243205
+aline .114935 .241935
+bezier .114992 .232761 .111293 .222625 .116205 .21336
+aline .11684 .21209
+bezier .130714 .218119 .147424 .216726 .161925 .21336
+bezier .171317 .208816 .163703 .197595 .155575 .197485
+bezier .142315 .196909 .124981 .192158 .113665 .202565
+bezier .679772E-01 .172827 .369005E-01 .117981 .034925 .064135
+bezier .355765E-01 .446742E-01 .469818E-01 .233404E-01 .06731 .017145
+bezier .871295E-01 .865681E-02 .110878 .671831E-02 .127 -.008255
+bezier .149887 -.348953E-01 .119939 -.083055 .085725 -.071755
+bezier .770491E-01 -.686745E-01 .657893E-01 -.642625E-01 .062865 -.055245
+bezier .678251E-01 -.479555E-01 .734631E-01 -.593486E-01 .07874 -.06096
+bezier .891846E-01 -.672802E-01 .10448 -.691553E-01 .11176 -.05715
+bezier .12197 -.441577E-01 .115276 -.246037E-01 .099695 -.019685
+aline .05969 -.00635
+bezier .350027E-01 .118747E-02 .169729E-01 .248459E-01 .01651 .050165
+bezier .144111E-01 .114518 .553441E-01 .176117 .108373 .20955
+aline .10668 .21463
+aline .10541 .22098
+aline .10541 .231775
+aline .106045 .23241
+aline .106045 .23622
+aline .10668 .239395
+aline .107315 .2413
+aline .10922 .243205
+aline .111125 .24384
+closepath
+! end of curve
+
+! start of curve
+amove .12954 .20828
+aline .126365 .207645
+aline .123825 .20701
+aline .122555 .206375
+aline .12192 .20574
+bezier .133027 .201038 .14641 .202757 .15748 .206375
+aline .15621 .20701
+aline .15367 .207645
+aline .153035 .20828
+aline .14859 .20828
+aline .147955 .208915
+aline .130175 .208915
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=17 !-------------- Beginning of new char.
+dfont wid=.496531 hei=.430555 dep=.194445 italic=.0358791
+dfont fby=127 kadd=.0555573
+set path ! start of curve
+newpath
+! start of curve
+amove .051435 .15367
+bezier .066738 .152215 .789739E-01 .138745 .079375 .123825
+bezier .097342 .150876 .139489 .165803 .165735 .14224
+bezier .176117 .130022 .174611 .113335 .172085 .09906
+aline .131445 -.0635
+bezier .131875 -.757851E-01 .111366 -.830871E-01 .107315 -.06985
+aline .107315 -.06604
+aline .10795 -.062865
+aline .14859 .099695
+bezier .152229 .11448 .156831 .136518 .140335 .145415
+bezier .111648 .151797 .864019E-01 .1264 .075565 .1016
+aline .051435 .00508
+bezier .490482E-01 -.465312E-02 .330649E-01 -.872363E-02 .028575 .00127
+aline .028575 .008255
+aline .05588 .117475
+bezier .578901E-01 .12689 .603257E-01 .141668 .048895 .146685
+bezier .302423E-01 .146642 .262901E-01 .12357 .02159 .10922
+aline .01905 .09906
+aline .018415 .09779
+aline .01778 .097155
+aline .01651 .09652
+aline .0127 .09652
+aline .012065 .097155
+aline .010795 .09779
+bezier .139408E-01 .118027 .190329E-01 .144216 .040005 .153035
+aline .04318 .15367
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=18 !-------------- Beginning of new char.
+dfont wid=.469444 hei=.694445 dep=0 italic=.0277786
+dfont fby=127 kadd=.0833359
+set path ! start of curve
+newpath
+! start of curve
+amove .122555 .24638
+bezier .153077 .241326 .158658 .204311 .16002 .179705
+bezier .158709 .116423 .136162 .442332E-01 .083185 .00381
+bezier .658983E-01 -.912086E-02 .384446E-01 -.724123E-02 .027305 .0127
+bezier .549045E-02 .582043E-01 .170862E-01 .107532 .032385 .15367
+bezier .477702E-01 .190171 .068487 .230065 .107315 .24511
+aline .109855 .245745
+aline .11303 .245745
+aline .113665 .24638
+closepath
+! end of curve
+
+! start of curve
+amove .1143 .23876
+bezier .091371 .231122 .820256E-01 .205943 .071755 .186055
+bezier .636349E-01 .166994 .566589E-01 .146636 .05334 .126365
+aline .125095 .126365
+bezier .133759 .159956 .142986 .193703 .132715 .22733
+aline .12954 .23368
+aline .126365 .236855
+aline .123825 .238125
+aline .12192 .23876
+aline .121285 .239395
+aline .114935 .239395
+closepath
+! end of curve
+
+! start of curve
+amove .04953 .1143
+bezier .416219E-01 .789975E-01 .299045E-01 .425835E-01 .04572 .008255
+bezier .591466E-01 -.634746E-02 .780457E-01 .109953E-01 .085725 .023495
+bezier .10406 .508098E-01 .115941 .833195E-01 .12192 .11557
+aline .050165 .11557
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=19 !-------------- Beginning of new char.
+dfont wid=.353937 hei=.430555 dep=0 italic=0
+dfont fby=127 kadd=.0555573
+set path ! start of curve
+newpath
+! start of curve
+amove .06985 .15367
+aline .07239 .153035
+aline .073025 .1524
+aline .074295 .151765
+aline .0762 .14986
+aline .076835 .14859
+bezier .771868E-01 .129935 .068446 .111709 .06477 .093345
+bezier .585278E-01 .660092E-01 .445874E-01 .397811E-01 .04064 .0127
+bezier .407145E-01 .585842E-02 .478255E-01 -.136884E-03 .05461 .003175
+bezier .793936E-01 .61114E-02 .995015E-01 .270028E-01 .106045 .0508
+aline .10795 .052705
+aline .11176 .052705
+aline .11303 .05207
+aline .1143 .0508
+bezier .108405 .172291E-01 .716426E-01 -.116233E-01 .037465 -.00254
+bezier .166277E-01 .568216E-02 .017692 .314312E-01 .02667 .04826
+bezier .038944 .809739E-01 .045852 .115674 .056515 .14859
+aline .057785 .14986
+aline .059055 .150495
+aline .060325 .151765
+aline .062865 .153035
+aline .065405 .15367
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=20 !-------------- Beginning of new char.
+dfont wid=.576159 hei=.430555 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .06985 .15367
+aline .07239 .153035
+aline .073025 .1524
+aline .074295 .151765
+aline .0762 .14986
+aline .076835 .14859
+aline .07747 .146685
+aline .07747 .142875
+aline .076835 .1397
+aline .06477 .09144
+aline .642937E-01 .904875E-01
+bezier .850555E-01 .095473 .102225 .115321 .120015 .12827
+bezier .134767 .140711 .154547 .153726 .174625 .14859
+bezier .191041 .137255 .169956 .111002 .154305 .121285
+aline .153035 .12192
+aline .150495 .12446
+aline .14986 .12573
+aline .149225 .127635
+aline .149225 .135255
+aline .14986 .137795
+aline .150495 .13843
+bezier .122775 .128378 .104233 .101476 .078105 .08763
+bezier .10017 .844535E-01 .133256 .857353E-01 .144145 .060325
+bezier .149958 .420668E-01 .132384 .210972E-01 .14605 .004445
+bezier .161963 -.311202E-02 .173477 .167002E-01 .1778 .029845
+aline .180975 .03937
+aline .18161 .04191
+aline .182245 .043815
+aline .183515 .048895
+aline .18415 .0508
+aline .186055 .052705
+aline .189865 .052705
+aline .191135 .05207
+aline .192405 .0508
+bezier .188227 .293148E-01 .180057 .170539E-02 .15621 -.004445
+bezier .134828 -.82978E-02 .115828 .130552E-01 .120015 .03302
+bezier .12025 .439734E-01 .125556 .540793E-01 .117475 .0635
+bezier .102655 .776628E-01 .811115E-01 .793072E-01 .06223 .08001
+aline .061595 .07874
+aline .04318 .00508
+bezier .407932E-01 -.465312E-02 .248099E-01 -.872363E-02 .02032 .00127
+aline .02032 .008255
+aline .05461 .145415
+aline .055245 .146685
+aline .05588 .14732
+aline .056515 .14859
+aline .057785 .14986
+aline .059055 .150495
+aline .060325 .151765
+aline .062865 .153035
+aline .065405 .15367
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=21 !-------------- Beginning of new char.
+dfont wid=.583336 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .07366 .24257
+bezier .089147 .241631 .107858 .233878 .11176 .216535
+bezier .137804 .145742 .161025 .735896E-01 .18923 .00381
+aline .192405 .000635
+aline .192405 -.003175
+aline .191135 -.00381
+aline .1905 -.004445
+aline .17145 -.004445
+bezier .155642 .458488E-02 .155231 .250015E-01 .147955 .040005
+bezier .140613 .603289E-01 .133888 .810982E-01 .12573 .100965
+bezier .956445E-01 .664814E-01 .669724E-01 .305153E-01 .036195 -.003175
+bezier .026448 -.106401E-01 .133257E-01 .272517E-02 .02159 .012065
+aline .046355 .03683
+aline .047625 .037465
+aline .09652 .08636
+aline .09779 .086995
+aline .12192 .111125
+bezier .109311 .148913 .958862E-01 .18807 .080645 .225425
+aline .08001 .22606
+aline .079375 .22733
+aline .07874 .227965
+aline .078105 .229235
+aline .074295 .233045
+aline .073025 .23368
+aline .069215 .23495
+aline .06858 .235585
+aline .064135 .235585
+aline .06223 .23749
+aline .06223 .240665
+aline .0635 .241935
+aline .06477 .24257
+aline .07366 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=22 !-------------- Beginning of new char.
+dfont wid=.60255 hei=.430555 dep=.194445 italic=0
+dfont fby=127 kadd=.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .079375 .15367
+aline .081915 .153035
+aline .08255 .1524
+aline .08382 .151765
+aline .085725 .14986
+aline .08636 .14859
+aline .086995 .146685
+aline .086995 .142875
+aline .08636 .1397
+aline .06477 .05334
+bezier .601495E-01 .369133E-01 .592114E-01 .101717E-01 .08001 .00381
+bezier .102904 -.251776E-02 .123852 .170917E-01 .133985 .036195
+aline .16002 .140335
+bezier .162407 .150068 .17839 .154139 .18288 .144145
+aline .18288 .13716
+aline .156845 .03302
+bezier .154214 .233029E-01 .152189 .008314 .163195 .00254
+bezier .181558 .208581E-02 .185823 .247136E-01 .1905 .038735
+aline .19304 .048895
+aline .193675 .0508
+aline .19558 .052705
+aline .19939 .052705
+aline .20066 .05207
+aline .20193 .0508
+bezier .197638 .303008E-01 .192991 .173118E-02 .169545 -.004445
+bezier .153263 -.672397E-02 .1367 .413634E-02 .13335 .02032
+bezier .116148 -.401479E-02 .813321E-01 -.125595E-01 .05588 .00381
+aline .05334 .00635
+aline .052705 .00508
+aline .03429 -.06858
+bezier .306754E-01 -.796373E-01 .94732E-02 -.800786E-01 .01143 -.06604
+aline .012065 -.062865
+aline .052705 .099695
+aline .064135 .145415
+aline .06477 .146685
+aline .065405 .14732
+aline .06604 .14859
+aline .06731 .14986
+aline .06858 .150495
+aline .06985 .151765
+aline .07239 .153035
+aline .07493 .15367
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=23 !-------------- Beginning of new char.
+dfont wid=.493983 hei=.430555 dep=0 italic=.0636578
+dfont fby=":" kadd=-.0555553
+dfont fby=";" kadd=-.0555553
+dfont fby=127 kadd=.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .076835 .15367
+aline .078105 .153035
+aline .079375 .150495
+aline .079375 .14986
+aline .045085 .0127
+aline .446617E-01 .01143
+aline .045085 .01016
+bezier .105941 .311224E-01 .146008 .883086E-01 .16256 .14859
+bezier .168301 .156873 .185548 .155011 .183515 .142875
+bezier .165533 .706047E-01 .102037 .130029E-01 .02921 -.000635
+aline .276225E-01 -.238125E-03
+aline .026035 -.000635
+aline .02159 -.000635
+aline .02032 0
+aline .01905 .00254
+aline .01905 .003175
+aline .050165 .127635
+aline .0508 .12827
+aline .0508 .131445
+aline .051181 .13335
+aline .0508 .135255
+aline .050165 .13716
+aline .04826 .137795
+aline .04572 .13843
+aline .045085 .139065
+aline .04064 .139065
+aline .040005 .1397
+aline .027305 .1397
+aline .0254 .141605
+aline .0254 .145415
+aline .026035 .147955
+aline .02794 .14986
+bezier .423685E-01 .151045 .569465E-01 .151869 .07112 .15367
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=24 !-------------- Beginning of new char.
+dfont wid=.437502 hei=.694445 dep=.194445 italic=.0460072
+dfont fby=127 kadd=.111115
+set path ! start of curve
+newpath
+! start of curve
+amove .1016 .24384
+aline .103505 .243205
+aline .104775 .241935
+bezier .10508 .23304 .100768 .222857 .106045 .213995
+bezier .120811 .216351 .139053 .218229 .15367 .21209
+bezier .161333 .204973 .14986 .196133 .14224 .197485
+bezier .1296 .195711 .113037 .193505 .102235 .202988
+bezier .723902E-01 .188709 .500411E-01 .143898 .07493 .116205
+bezier .919293E-01 .122254 .111671 .122497 .128905 .117475
+aline .13208 .1143
+aline .13208 .10922
+aline .131445 .10795
+aline .12827 .104775
+bezier .108846 .097808 .873217E-01 .100994 .067945 .104775
+bezier .452029E-01 .917603E-01 .260311E-01 .670244E-01 .026035 .040005
+bezier .345822E-01 .122141E-01 .681507E-01 .99431E-02 .090805 -.00127
+bezier .106519 -.823251E-02 .130143 -.110696E-01 .132715 -.03175
+bezier .135823 -.563031E-01 .110703 -.787371E-01 .086995 -.07239
+bezier .762526E-01 -.705373E-01 .666021E-01 -.651766E-01 .05842 -.05842
+aline .05842 -.05461
+aline .060325 -.052705
+aline .062865 -.052705
+bezier .756189E-01 -.621392E-01 .976793E-01 -.741005E-01 .109855 -.05842
+bezier .117826 -.493319E-01 .113605 -.347494E-01 .1016 -.03175
+bezier .758751E-01 -.205185E-01 .470251E-01 -.144783E-01 .02413 .001905
+bezier -.317748E-02 .238831E-01 .996212E-02 .634619E-01 .029845 .085725
+bezier .385928E-01 .951403E-01 .048207 .103354 .059055 .109855
+bezier .320323E-01 .123082 .300805E-01 .160647 .048895 .18161
+bezier .060349 .197609 .794868E-01 .206433 .969433E-01 .21336
+aline .09652 .21463
+aline .09525 .22098
+aline .09525 .231775
+aline .095885 .23241
+aline .095885 .23622
+aline .09652 .239395
+aline .097155 .2413
+aline .09906 .243205
+aline .100965 .24384
+closepath
+! end of curve
+
+! start of curve
+amove .11811 .20828
+aline .114935 .20828
+aline .1143 .207645
+aline .11176 .20701
+aline .111125 .206375
+bezier .122014 .200609 .136096 .20281 .14732 .206375
+aline .14605 .20701
+aline .14351 .207645
+aline .142875 .20828
+aline .13843 .20828
+aline .137795 .208915
+aline .118745 .208915
+aline .11811 .20828
+closepath
+! end of curve
+
+! start of curve
+amove .09398 .11303
+aline .089535 .11303
+aline .0889 .112395
+aline .085725 .11176
+aline .084201 .111252
+bezier .939685E-01 .105655 .109372 .107733 .12065 .109855
+aline .12319 .111125
+aline .122555 .11176
+aline .120015 .112395
+aline .11938 .11303
+aline .1143 .11303
+aline .113665 .113665
+aline .094615 .113665
+aline .09398 .11303
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=25 !-------------- Beginning of new char.
+dfont wid=.570027 hei=.430555 dep=0 italic=.0358791
+set path ! start of curve
+newpath
+! start of curve
+amove .192405 .14986
+bezier .203162 .147338 .198735 .131254 .18923 .130175
+aline .14224 .130175
+bezier .132447 .917811E-01 .13072 .502539E-01 .14732 .012065
+bezier .151557 -.153208E-02 .128807 -.120418E-01 .123825 .00254
+bezier .110017 .452952E-01 .124236 .873628E-01 .13208 .130175
+aline .09398 .130175
+aline .093345 .12827
+aline .080645 .07747
+bezier .073069 .519025E-01 .686975E-01 .249268E-01 .057785 .000635
+bezier .051374 -.914225E-02 .322556E-01 -.39131E-02 .037465 .00889
+bezier .554488E-01 .048146 .743028E-01 .881198E-01 .08382 .130175
+bezier .662861E-01 .130681 .476292E-01 .131605 .033655 .11938
+bezier .267465E-01 .113467 .218637E-01 .106094 .01651 .09906
+aline .01143 .09906
+bezier .736483E-02 .106158 .017015 .112933 .019685 .11938
+bezier .029685 .13283 .420568E-01 .147052 .05969 .14986
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=26 !-------------- Beginning of new char.
+dfont wid=.517015 hei=.430555 dep=.194445 italic=0
+dfont fby=127 kadd=.0833359
+set path ! start of curve
+newpath
+! start of curve
+amove .13335 .15367
+bezier .157198 .151706 .175233 .129155 .17653 .106045
+bezier .18065 .056991 .145929 .371194E-02 .095885 -.004445
+bezier .793344E-01 -.687639E-02 .636254E-01 .318636E-02 .561975E-01 .176213E-01
+aline .557893E-01 .174171E-01
+aline .03429 -.06858
+bezier .306754E-01 -.796373E-01 .94732E-02 -.800786E-01 .01143 -.06604
+aline .012065 -.062865
+aline .047625 .079375
+bezier .586095E-01 .117176 .912615E-01 .15538 .13335 .15367
+closepath
+! end of curve
+
+! start of curve
+amove .123825 .14605
+bezier .935099E-01 .139266 .786505E-01 .106618 .07112 .07874
+aline .060325 .03556
+bezier .604678E-01 .150247E-01 .826534E-01 -.579146E-02 .10287 .005715
+bezier .137579 .240459E-01 .144255 .686419E-01 .151765 .10287
+bezier .153241 .119438 .150079 .141783 .131445 .146685
+aline .12446 .146685
+aline .123825 .14605
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=27 !-------------- Beginning of new char.
+dfont wid=.571414 hei=.430555 dep=0 italic=.0358791
+dfont fby=":" kadd=-.0555553
+dfont fby=";" kadd=-.0555553
+set path ! start of curve
+newpath
+! start of curve
+amove .19304 .14986
+bezier .203797 .147338 .19937 .131254 .189865 .130175
+aline .14478 .130175
+bezier .148402 .121534 .153626 .111004 .154305 .100965
+bezier .16055 .472817E-01 .112134 -.106537E-01 .056515 -.00381
+bezier .277005E-01 .179345E-03 .988068E-02 .315368E-01 .01524 .05842
+bezier .193121E-01 .102032 .541804E-01 .143274 .09779 .14986
+closepath
+! end of curve
+
+! start of curve
+amove .094615 .12954
+bezier .549753E-01 .125023 .397084E-01 .799286E-01 .03556 .046355
+bezier .033495 .280886E-01 .042881 .523325E-02 .062865 .00254
+bezier .100534 .202773E-02 .123107 .408095E-01 .12954 .074295
+bezier .134715 .919726E-01 .135551 .117452 .11557 .127
+aline .109855 .128905
+aline .10922 .12954
+aline .10541 .12954
+aline .104775 .130175
+aline .09525 .130175
+aline .094615 .12954
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=28 !-------------- Beginning of new char.
+dfont wid=.437155 hei=.430555 dep=0 italic=.113195
+dfont fby=":" kadd=-.0555553
+dfont fby=";" kadd=-.0555553
+dfont fby=127 kadd=.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .173355 .14986
+bezier .184112 .147338 .179685 .131254 .17018 .130175
+aline .10414 .130175
+bezier .942745E-01 .874796E-01 .884107E-01 .432972E-01 .07747 .000635
+bezier .719872E-01 -.777113E-02 .548311E-01 -.696022E-02 .05588 .00508
+bezier .675672E-01 .467928E-01 .818952E-01 .089375 .093345 .130175
+aline .056515 .130175
+bezier .391263E-01 .126678 .257526E-01 .113521 .01651 .09906
+aline .01143 .09906
+bezier .736483E-02 .106158 .017015 .112933 .019685 .11938
+bezier .029685 .13283 .420568E-01 .147052 .05969 .14986
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=29 !-------------- Beginning of new char.
+dfont wid=.54028 hei=.430555 dep=0 italic=.0358791
+dfont fby=127 kadd=.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .06096 .15367
+bezier .814682E-01 .151967 .906419E-01 .127755 .08255 .11049
+bezier .736226E-01 .081387 .545639E-01 .504129E-01 .06477 .02032
+bezier .762984E-01 -.341415E-02 .109539 -.11262E-02 .127 .014605
+bezier .151157 .375039E-01 .169235 .708396E-01 .169545 .104775
+bezier .16696 .115564 .160194 .124424 .1524 .13208
+bezier .146152 .147744 .170897 .162708 .18034 .14732
+bezier .18966 .125026 .179889 .101605 .17526 .07874
+bezier .164128 .437642E-01 .143176 .600616E-02 .10541 -.00381
+bezier .802315E-01 -.751263E-02 .447627E-01 .936834E-03 .040005 .031115
+bezier .356206E-01 .654265E-01 .569333E-01 .978862E-01 .06477 .130175
+aline .06477 .139065
+bezier .620633E-01 .150388 .488735E-01 .14689 .04191 .141605
+bezier .285146E-01 .130325 .235381E-01 .11289 .01778 .097155
+aline .01651 .09652
+aline .0127 .09652
+aline .012065 .097155
+aline .010795 .09779
+bezier .138195E-01 .121109 .274305E-01 .147868 .05207 .15367
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=30 !-------------- Beginning of new char.
+dfont wid=.595835 hei=.694445 dep=.194445 italic=0
+dfont fby=127 kadd=.0833359
+set path ! start of curve
+newpath
+! start of curve
+amove .153035 .24257
+aline .15367 .241935
+aline .15494 .2413
+aline .15494 .23749
+aline .13462 .15621
+aline .134197 .15494
+bezier .147097 .152023 .165082 .15006 .17653 .1397
+bezier .212022 .116296 .206223 .627463E-01 .178435 .03556
+bezier .15777 .117827E-01 .126038 -.413177E-02 .094615 -.004445
+aline .09398 -.00635
+aline .078105 -.06985
+aline .07747 -.071755
+aline .076835 -.07239
+aline .075565 -.073025
+aline .07112 -.073025
+aline .06985 -.071755
+aline .069215 -.070485
+aline .069215 -.069215
+aline .08509 -.005715
+aline .085725 -.00508
+bezier .551721E-01 -.444619E-02 .021633 .016797 .018415 .04953
+bezier .130742E-01 .107566 .717871E-01 .152238 .125095 .154305
+aline .146685 .240665
+aline .14859 .24257
+aline .153035 .24257
+closepath
+! end of curve
+
+! start of curve
+amove .118745 .14605
+bezier .067541 .139859 .314035E-01 .816569E-01 .04318 .033655
+bezier .486905E-01 .014727 .683684E-01 .28541E-02 .086995 .00254
+aline .08763 .004445
+aline .122555 .144145
+aline .122978 .145415
+aline .122555 .146685
+aline .11938 .146685
+aline .118745 .14605
+closepath
+! end of curve
+
+! start of curve
+amove .13208 .14605
+aline .131445 .14351
+aline .09652 .00381
+aline .095885 .003175
+bezier .129944 .410676E-02 .161265 .314482E-01 .172085 .064135
+bezier .181947 .887898E-01 .183727 .121905 .15875 .13843
+bezier .150736 .143068 .140794 .147565 .13208 .14605
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=31 !-------------- Beginning of new char.
+dfont wid=.625692 hei=.430555 dep=.194445 italic=0
+dfont fby=127 kadd=.0555573
+set path ! start of curve
+newpath
+! start of curve
+amove .05715 .15367
+bezier .756828E-01 .152852 .923515E-01 .139846 .09652 .121285
+bezier .105682 .100414 .111382 .778911E-01 .118745 .056515
+bezier .147105 .874212E-01 .174108 .119777 .2032 .14986
+aline .20574 .14986
+aline .20701 .149225
+aline .20828 .147955
+aline .20828 .14351
+bezier .179326 .110872 .148868 .790049E-01 .121523 .454025E-01
+bezier .131998 .945768E-02 .142158 -.274645E-01 .16129 -.05969
+bezier .170032 -.734471E-01 .188343 -.608922E-01 .1905 -.04826
+aline .19304 -.04699
+bezier .203087 -.464033E-01 .196628 -.582556E-01 .19304 -.06223
+bezier .173488 -.833189E-01 .132159 -.724391E-01 .125095 -.04445
+bezier .115341 -.221351E-01 .108364 .135777E-02 .1016 .024765
+bezier .736359E-01 -.663835E-02 .457958E-01 -.386019E-01 .017145 -.069215
+aline .01397 -.069215
+aline .013335 -.06858
+aline .012065 -.067945
+aline .01143 -.066675
+bezier .138651E-01 -.566633E-01 .249175E-01 -.505754E-01 .03048 -.04191
+bezier .535242E-01 -.165751E-01 .763777E-01 .889729E-02 .989012E-01 .346075E-01
+bezier .866599E-01 .072041 .783043E-01 .112932 .05461 .14478
+bezier .434433E-01 .15106 .032114 .138126 .028575 .12827
+aline .027305 .127635
+bezier .179045E-01 .126287 .223591E-01 .137798 .026035 .141605
+aline .031115 .146685
+aline .032385 .14732
+aline .033655 .14859
+aline .034925 .149225
+aline .03556 .14986
+aline .03937 .151765
+aline .04318 .153035
+aline .046355 .15367
+aline .05715 .15367
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=32 !-------------- Beginning of new char.
+dfont wid=.651392 hei=.694445 dep=.194445 italic=.0358791
+dfont fby=127 kadd=.111115
+set path ! start of curve
+newpath
+! start of curve
+amove .168275 .24257
+aline .169545 .241935
+aline .17018 .2413
+aline .17018 .236855
+aline .12954 .074295
+aline .111998 .41275E-02
+aline .112395 .00254
+bezier .160116 .302543E-02 .197271 .468836E-01 .20828 .090805
+bezier .210603 .106814 .202762 .121625 .191135 .13208
+bezier .184887 .147744 .209632 .162708 .219075 .14732
+bezier .228193 .125854 .219118 .103293 .21463 .08128
+bezier .2021 .407765E-01 .169317 .532459E-02 .127 -.00381
+aline .122555 -.00381
+aline .12192 -.004445
+aline .109855 -.004445
+aline .093345 -.070485
+aline .09271 -.071755
+aline .09144 -.073025
+aline .086995 -.073025
+aline .085725 -.07239
+aline .08509 -.071755
+aline .08509 -.06731
+aline .10033 -.00635
+aline .100753 -.507998E-02
+bezier .905825E-01 -.160046E-02 .754618E-01 -.202557E-02 .06477 .00508
+bezier .384726E-01 .160804E-01 .350796E-01 .488995E-01 .045085 .07239
+bezier .501037E-01 .951397E-01 .660661E-01 .116773 .064135 .1397
+bezier .617788E-01 .150876 .483608E-01 .146316 .04191 .141605
+bezier .285146E-01 .130325 .235381E-01 .11289 .01778 .097155
+aline .01651 .09652
+aline .0127 .09652
+aline .012065 .097155
+aline .010795 .09779
+bezier .138195E-01 .121109 .274305E-01 .147868 .05207 .15367
+bezier .713621E-01 .157231 .890996E-01 .139317 .08509 .120015
+bezier .785851E-01 .901372E-01 .571799E-01 .606993E-01 .064135 .03048
+bezier .682101E-01 .131687E-01 .871307E-01 .449135E-02 .10287 .00381
+aline .14351 .16637
+aline .161925 .24003
+aline .16256 .2413
+aline .16383 .24257
+aline .168275 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=33 !-------------- Beginning of new char.
+dfont wid=.622455 hei=.430555 dep=0 italic=.0358791
+set path ! start of curve
+newpath
+! start of curve
+amove .20066 .15367
+bezier .217795 .145738 .212298 .123439 .21082 .10922
+bezier .202828 .652785E-01 .185775 .140153E-01 .140335 -.00254
+bezier .122366 -.910085E-02 .098348 -.116255E-02 .094615 .019685
+aline .093345 .026035
+aline .09271 .027305
+bezier .785581E-01 .459549E-02 .481572E-01 -.141722E-01 .022225 .000635
+bezier .799023E-03 .164862E-01 .44269E-02 .468446E-01 .006985 .069215
+bezier .118412E-01 .987013E-01 .240932E-01 .127312 .04318 .14986
+aline .046355 .14986
+bezier .534369E-01 .144596 .042642 .1376 .04064 .13208
+bezier .229449E-01 .101919 .405965E-02 .623505E-01 .024765 .029845
+bezier .442733E-01 .883318E-02 .768336E-01 .261069E-01 .089535 .046355
+bezier .960659E-01 .053223 .933997E-01 .632857E-01 .095885 .071755
+bezier .992158E-01 .820209E-01 .982569E-01 .101369 .11303 .100965
+bezier .123128 .953661E-01 .11496 .819328E-01 .113665 .073025
+bezier .111132 .605754E-01 .100255 .489453E-01 .107315 .036195
+bezier .114248 .158367E-01 .140075 .174949E-01 .15494 .027305
+bezier .180657 .425815E-01 .19841 .730691E-01 .19812 .10287
+bezier .195916 .114261 .189164 .124053 .180975 .13208
+aline .18034 .133985
+aline .18034 .140335
+aline .18161 .144145
+aline .182245 .14478
+aline .18288 .14605
+aline .18669 .14986
+aline .18796 .150495
+aline .18923 .151765
+aline .19177 .153035
+aline .19431 .15367
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=34 !-------------- Beginning of new char.
+dfont wid=.466318 hei=.430555 dep=0 italic=0
+dfont fby=127 kadd=.0833359
+set path ! start of curve
+newpath
+! start of curve
+amove .112395 .15748
+bezier .125901 .155511 .143181 .150765 .150495 .13843
+bezier .150812 .129241 .138735 .125841 .13335 .132715
+bezier .107504 .149631 .737488E-01 .14234 .04826 .127635
+bezier .371871E-01 .120638 .319061E-01 .105156 .041275 .094615
+aline .04572 .09017
+bezier .530868E-01 .845804E-01 .614701E-01 .943713E-01 .06985 .09271
+aline .070485 .093345
+aline .075565 .093345
+aline .0762 .09398
+aline .090805 .09398
+aline .09144 .093345
+aline .097155 .093345
+aline .10033 .09271
+aline .102235 .092075
+aline .104775 .090805
+aline .107315 .088265
+aline .10795 .085725
+aline .10795 .084455
+aline .107315 .08128
+aline .103505 .07747
+bezier .858312E-01 .710969E-01 .661127E-01 .747384E-01 .04826 .078105
+bezier .294512E-01 .681479E-01 .915287E-02 .420564E-01 .024765 .02159
+bezier .436624E-01 .296806E-02 .733974E-01 .57992E-02 .09652 .009525
+bezier .109182 .118504E-01 .121291 .187242E-01 .127 .03048
+aline .12827 .031115
+aline .13081 .031115
+aline .132715 .02921
+bezier .127484 .82058E-02 .103882 -.295678E-02 .08382 -.006985
+bezier .566989E-01 -.124666E-01 .174703E-01 -.414888E-02 .010795 .02794
+bezier .632807E-02 .506572E-01 .226299E-01 .724673E-01 .04191 .083185
+bezier .259319E-01 .924726E-01 .234471E-01 .115507 .03556 .128905
+bezier .545927E-01 .150587 .847067E-01 .158765 .112395 .15748
+closepath
+! end of curve
+
+! start of curve
+amove .0762 .08636
+aline .07112 .08636
+aline .070485 .085725
+aline .06731 .085725
+aline .066675 .08509
+aline .064135 .084455
+aline .06223 .08382
+aline .061595 .083185
+bezier .732581E-01 .080755 .880814E-01 .791318E-01 .09906 .084455
+aline .098425 .08509
+aline .09652 .085725
+aline .095885 .08636
+aline .09017 .08636
+aline .089535 .086995
+aline .076835 .086995
+aline .0762 .08636
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=35 !-------------- Beginning of new char.
+dfont wid=.59144 hei=.694445 dep=0 italic=0
+dfont fby=127 kadd=.0833359
+set path ! start of curve
+newpath
+! start of curve
+amove .1524 .24638
+bezier .178555 .241698 .183932 .210366 .186055 .18923
+bezier .187301 .166263 .183555 .145954 .18034 .123825
+aline .18288 .12319
+aline .19558 .12065
+aline .197485 .118745
+aline .197485 .11557
+aline .19558 .113665
+aline .192405 .113665
+aline .19177 .1143
+aline .188595 .1143
+aline .186055 .114935
+aline .179705 .116205
+aline .178435 .116628
+bezier .164174 .720304E-01 .144734 .212659E-01 .100965 -.001905
+bezier .793925E-01 -.829516E-02 .482356E-01 -.397855E-02 .040005 .02032
+bezier .367051E-01 .325125E-01 .038377 .443559E-01 .04064 .056515
+aline .05588 .117475
+bezier .578901E-01 .12689 .603257E-01 .141668 .048895 .146685
+bezier .302423E-01 .146642 .262901E-01 .12357 .02159 .10922
+aline .01905 .09906
+aline .018415 .09779
+aline .01778 .097155
+aline .01651 .09652
+aline .0127 .09652
+aline .012065 .097155
+aline .010795 .09779
+bezier .139408E-01 .118027 .190329E-01 .144216 .040005 .153035
+bezier .598446E-01 .158557 .821931E-01 .140608 .07874 .12065
+aline .07874 .114935
+aline .078105 .11176
+aline .0635 .05334
+bezier .593946E-01 .379934E-01 .555218E-01 .136354E-01 .07366 .00508
+bezier .920586E-01 -.447552E-02 .109603 .129107E-01 .117475 .028575
+bezier .136303 .568408E-01 .144573 .909029E-01 .15367 .12319
+bezier .128824 .131879 .999106E-01 .147237 .09652 .175895
+bezier .942107E-01 .205707 .112304 .240251 .14351 .24638
+closepath
+! end of curve
+
+! start of curve
+amove .14351 .23876
+bezier .117215 .232245 .104003 .201361 .104775 .17653
+bezier .109519 .152092 .133122 .138085 .155067 .131191
+bezier .162947 .164923 .172499 .199226 .159385 .23241
+aline .15875 .233045
+aline .158115 .234315
+aline .155575 .236855
+aline .153035 .238125
+aline .15113 .23876
+aline .150495 .239395
+aline .144145 .239395
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=36 !-------------- Beginning of new char.
+dfont wid=.82813 hei=.430555 dep=0 italic=.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .28067 .14986
+bezier .291427 .147338 .287 .131254 .277495 .130175
+aline .26162 .130175
+bezier .273056 .860353E-01 .251451 .323074E-01 .213995 .00508
+bezier .194557 -.90695E-02 .160031 -.953773E-02 .150495 .01651
+bezier .146362 .285813E-01 .1467 .408326E-01 .146685 .05334
+bezier .13032 .217881E-01 .974459E-01 -.124497E-01 .05842 -.00254
+bezier .359245E-01 .846655E-02 .394451E-01 .372959E-01 .04191 .05715
+bezier .458589E-01 .841491E-01 .593521E-01 .108621 .760413E-01 .129222
+bezier .538242E-01 .135134 .290597E-01 .121382 .018415 .100965
+aline .01651 .09906
+aline .01143 .09906
+bezier .736483E-02 .106158 .017015 .112933 .019685 .11938
+bezier .029685 .13283 .420568E-01 .147052 .05969 .14986
+closepath
+! end of curve
+
+! start of curve
+amove .084455 .126365
+bezier .639253E-01 .996553E-01 .04253 .638801E-01 .05334 .029845
+bezier .598203E-01 .111787E-01 .821456E-01 .013525 .09652 .02032
+bezier .129278 .352794E-01 .145695 .700709E-01 .156845 .102235
+aline .16129 .102235
+aline .16256 .1016
+bezier .163866 .895072E-01 .157111 .781737E-01 .158115 .06604
+bezier .155286 .474077E-01 .158841 .194215E-01 .18161 .01524
+bezier .223642 .140713E-01 .249998 .585791E-01 .25654 .09525
+aline .25654 .112395
+aline .255905 .11303
+aline .255905 .11684
+aline .25527 .117475
+aline .254 .123825
+aline .253365 .12573
+aline .25273 .12827
+aline .252095 .130175
+aline .088265 .130175
+aline .084455 .126365
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=37 !-------------- Beginning of new char.
+dfont wid=.517015 hei=.430555 dep=.194445 italic=0
+dfont fby=127 kadd=.0833359
+set path ! start of curve
+newpath
+! start of curve
+amove .13335 .15367
+bezier .157198 .151706 .175233 .129155 .17653 .106045
+bezier .18065 .056991 .145929 .371194E-02 .095885 -.004445
+bezier .726281E-01 -.767892E-02 .050394 .957328E-02 .04572 .032385
+bezier .410452E-01 .115038E-01 .349426E-01 -.806637E-02 .038735 -.02921
+bezier .428721E-01 -.403305E-01 .056546 -.412378E-01 .06604 -.042545
+aline .103505 -.042545
+bezier .11418 -.444668E-01 .133133 -.410743E-01 .135255 -.056515
+aline .135255 -.06223
+aline .13462 -.062865
+aline .13462 -.06604
+aline .133985 -.067945
+aline .13335 -.06858
+aline .13208 -.069215
+aline .127635 -.069215
+aline .126365 -.067945
+aline .12573 -.066675
+aline .12573 -.065405
+aline .126365 -.06477
+aline .12573 -.064135
+aline .125095 -.062865
+bezier .960347E-01 -.557769E-01 .627138E-01 -.714053E-01 .036195 -.052705
+bezier .208029E-01 -.377082E-01 .292599E-01 -.148846E-01 .03048 .003175
+bezier .390566E-01 .398916E-01 .425663E-01 .817371E-01 .064135 .1143
+bezier .080166 .136048 .104788 .15605 .13335 .15367
+closepath
+! end of curve
+
+! start of curve
+amove .123825 .14605
+bezier .877428E-01 .137194 .743571E-01 .958517E-01 .06731 .062865
+bezier .624812E-01 .440924E-01 .611578E-01 .017847 .08001 .00508
+bezier .101824 -.407904E-02 .121692 .174231E-01 .131445 .034925
+bezier .143647 .061994 .15248 .091378 .151765 .12065
+bezier .149637 .133996 .13897 .150175 .123825 .14605
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=38 !-------------- Beginning of new char.
+dfont wid=.362848 hei=.430555 dep=.0972233 italic=.0798597
+dfont fby=127 kadd=.0833359
+set path ! start of curve
+newpath
+! start of curve
+amove .11684 .15367
+bezier .125308 .152043 .136916 .152531 .14351 .145415
+aline .14351 .14224
+aline .142875 .14097
+aline .140335 .13843
+bezier .130443 .138711 .121258 .14577 .11176 .146685
+bezier .739076E-01 .148804 .281872E-01 .12128 .029845 .079375
+bezier .330663E-01 .613577E-01 .490593E-01 .507398E-01 .06477 .043815
+bezier .804085E-01 .328662E-01 .101912 .283283E-01 .112395 .01143
+bezier .12384 -.151346E-01 .945063E-01 -.484617E-01 .06604 -.03683
+bezier .611933E-01 -.365086E-01 .537135E-01 -.305872E-01 .06096 -.027305
+bezier .709551E-01 -.310202E-01 .838464E-01 -.358013E-01 .09144 -.024765
+bezier .993694E-01 -.145569E-01 .948555E-01 .388729E-04 .083185 .00508
+bezier .596453E-01 .202206E-01 .275506E-01 .276783E-01 .01524 .055245
+bezier .100325E-02 .958794E-01 .359245E-01 .135414 .073025 .147955
+aline .076835 .149225
+aline .079375 .14986
+aline .08128 .150495
+aline .08382 .15113
+aline .09017 .1524
+aline .093345 .1524
+aline .09398 .153035
+aline .09906 .153035
+aline .099695 .15367
+aline .11684 .15367
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=39 !-------------- Beginning of new char.
+dfont wid=.654167 hei=.430555 dep=.194445 italic=0
+dfont fby=127 kadd=.0833359
+set path ! start of curve
+newpath
+! start of curve
+amove .18288 .15367
+bezier .211426 .150806 .221636 .116735 .2159 .093345
+bezier .208684 .356887E-01 .150579 -.978807E-02 .093345 -.004445
+bezier .884657E-01 -.264866E-01 .085948 -.492587E-01 .08001 -.07112
+bezier .744709E-01 -.812236E-01 .551583E-01 -.078821 .05842 -.065405
+bezier .651525E-01 -.442641E-01 .711329E-01 -.226002E-01 .07874 -.001905
+bezier .049269 .44045E-02 .208937E-01 .265255E-01 .01778 .057785
+bezier .171476E-01 .907687E-01 .289279E-01 .125938 .05207 .14986
+aline .056515 .14986
+aline .05715 .149225
+aline .05842 .14859
+bezier .581496E-01 .140754 .488451E-01 .136453 .046355 .128905
+bezier .035125 .108759 .247401E-01 .842789E-01 .027305 .061595
+bezier .320559E-01 .348823E-01 .608861E-01 .211236E-01 .084455 .01778
+bezier .999091E-01 .633687E-01 .109622 .117562 .15113 .146685
+aline .15748 .14986
+aline .159385 .150495
+aline .160655 .15113
+aline .16256 .151765
+aline .1651 .1524
+aline .168275 .153035
+aline .17145 .153035
+aline .172085 .15367
+closepath
+! end of curve
+
+! start of curve
+amove .16891 .13335
+bezier .129709 .126751 .111798 .084195 .10287 .04953
+bezier .102181 .381489E-01 .980361E-01 .274711E-01 .976745E-01 .163368E-01
+bezier .148107 .891949E-02 .209885 .497747E-01 .207645 .104775
+bezier .204974 .122904 .186849 .137726 .16891 .13335
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=40 !-------------- Beginning of new char.
+dfont wid=1 hei=.366875 dep=-.133125 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .084455 .149225
+aline .085725 .14859
+aline .086995 .14732
+bezier .087044 .137055 .779994E-01 .128115 .073025 .11938
+bezier .665192E-01 .109954 .556879E-01 .10098 .048895 .09398
+aline .325755 .09398
+aline .328295 .09271
+aline .329565 .09144
+aline .330835 .0889
+aline .330835 .08509
+aline .329565 .08255
+aline .328295 .08128
+aline .325755 .08001
+aline .022225 .08001
+aline .02032 .081915
+bezier .017833 .092962 .322109E-01 .936654E-01 .0381 .099695
+bezier .559295E-01 .111896 .689018E-01 .129581 .07874 .14859
+aline .08001 .149225
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=")" !-------------- Beginning of new char.
+dfont wid=1 hei=.366875 dep=-.133125 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .325755 .09398
+aline .327025 .093345
+aline .328295 .09271
+aline .329565 .09144
+aline .330835 .0889
+aline .330835 .08509
+aline .329565 .08255
+aline .328295 .08128
+aline .325755 .08001
+aline .048895 .08001
+bezier .634228E-01 .666223E-01 .809431E-01 .487375E-01 .08763 .02794
+aline .086995 .02667
+aline .085725 .0254
+bezier .748564E-01 .213421E-01 .745644E-01 .372003E-01 .06858 .042545
+bezier .573908E-01 .616762E-01 .386394E-01 .743294E-01 .02032 .085725
+aline .02032 .092075
+aline .022225 .09398
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="*" !-------------- Beginning of new char.
+dfont wid=1 hei=.366875 dep=-.133125 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .271145 .149225
+bezier .279414 .139249 .283845 .125748 .294005 .11684
+bezier .303697 .104298 .318367 .969565E-01 .330835 .088265
+aline .330835 .081915
+aline .32893 .08001
+aline .0254 .08001
+aline .02286 .08128
+aline .02159 .08255
+aline .02032 .08509
+aline .02032 .0889
+aline .02159 .09144
+aline .02286 .09271
+aline .0254 .09398
+aline .30226 .09398
+bezier .287732 .107368 .270212 .125253 .263525 .14605
+aline .26416 .14732
+aline .26543 .14859
+aline .2667 .149225
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="+" !-------------- Beginning of new char.
+dfont wid=1 hei=.366875 dep=-.133125 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .32893 .09398
+aline .330835 .092075
+bezier .333607 .813754E-01 .319957 .807863E-01 .314325 .07493
+bezier .295608 .631569E-01 .282589 .446583E-01 .272415 .0254
+aline .271145 .024765
+aline .2667 .024765
+aline .26543 .0254
+aline .26416 .02667
+bezier .264111 .369346E-01 .273156 .458754E-01 .27813 .05461
+bezier .284636 .640365E-01 .295467 .730102E-01 .30226 .08001
+aline .0254 .08001
+aline .02286 .08128
+aline .02159 .08255
+aline .02032 .08509
+aline .02032 .0889
+aline .02159 .09144
+aline .02286 .09271
+aline .0254 .09398
+aline .32893 .09398
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="," !-------------- Beginning of new char.
+dfont wid=.277779 hei=.463748 dep=-.036252 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .07239 .16256
+aline .07366 .161925
+aline .07493 .16129
+aline .0762 .16002
+aline .07747 .15748
+aline .07747 .15367
+aline .0762 .15113
+aline .07493 .14986
+bezier .596532E-01 .148005 .386496E-01 .143703 .034925 .125095
+bezier .313015E-01 .105342 .551975E-01 .925006E-01 .07239 .09398
+aline .07493 .09271
+aline .0762 .09144
+aline .07747 .0889
+aline .07747 .08509
+aline .0762 .08255
+bezier .658715E-01 .764109E-01 .522578E-01 .082226 .04191 .086995
+bezier .176304E-01 .977631E-01 .120825E-01 .13521 .034925 .150495
+bezier .427505E-01 .157781 .539979E-01 .161115 .064135 .16256
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="-" !-------------- Beginning of new char.
+dfont wid=.277779 hei=.463748 dep=-.036252 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .033655 .16256
+bezier .583849E-01 .161128 .845221E-01 .137901 .0762 .111125
+bezier .695855E-01 .897737E-01 .438244E-01 .764987E-01 .02286 .08128
+aline .02159 .08255
+aline .02032 .08509
+aline .02032 .0889
+aline .02159 .09144
+aline .02286 .09271
+bezier .381368E-01 .945649E-01 .591404E-01 .988671E-01 .062865 .117475
+bezier .664885E-01 .137228 .425925E-01 .150069 .0254 .14859
+aline .02286 .14986
+aline .02159 .15113
+aline .02032 .15367
+aline .02032 .15748
+aline .02159 .16002
+aline .02286 .16129
+aline .0254 .16256
+aline .033655 .16256
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="." !-------------- Beginning of new char.
+dfont wid=.500002 hei=.465279 dep=-.0347214 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .01905 .175895
+bezier .675907E-01 .147839 .116455 .120232 .164465 .09144
+bezier .17025 .803774E-01 .154181 .776083E-01 .147955 .07239
+bezier .104825 .478497E-01 .621981E-01 .226105E-01 .01905 -.001905
+aline .01524 -.001905
+aline .0127 -.000635
+aline .01143 .000635
+aline .01016 .003175
+aline .01016 .170815
+aline .01143 .173355
+aline .0127 .174625
+aline .01397 .17526
+aline .01524 .175895
+closepath
+! end of curve
+
+! start of curve
+amove .02413 .155575
+aline .02413 .018415
+bezier .064475 .391934E-01 .104387 .646958E-01 .14478 .086995
+bezier .104387 .109294 .644754E-01 .134796 .02413 .155575
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="/" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.465279 dep=-.0347214 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .160655 .175895
+aline .161925 .17526
+aline .163195 .174625
+aline .164465 .173355
+aline .165735 .170815
+aline .165735 .003175
+bezier .161597 -.714534E-02 .150596 .118654E-02 .14478 .00508
+bezier .100251 .307943E-01 .554143E-01 .560805E-01 .01143 .08255
+bezier .564523E-02 .936126E-01 .217143E-01 .963817E-01 .02794 .1016
+bezier .710588E-01 .126156 .113696 .15138 .156845 .175895
+closepath
+! end of curve
+
+! start of curve
+amove .14986 .155575
+bezier .1103 .132685 .070844 .109651 .031115 .086995
+bezier .715051E-01 .064692 .111417 .391885E-01 .151765 .018415
+aline .151765 .155575
+aline .150813 .156051
+aline .14986 .155575
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="0" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.430555 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .095885 .15748
+bezier .123821 .156757 .151372 .137245 .15748 .108585
+bezier .164316 .740132E-01 .165533 .302314E-01 .135255 .00508
+bezier .108481 -.126279E-01 .722984E-01 -.128579E-01 .04445 .00254
+bezier .011625 .245912E-01 .118136E-01 .693526E-01 .017145 .103505
+bezier .219565E-01 .133507 .490635E-01 .157417 .079375 .156845
+aline .08001 .15748
+aline .095885 .15748
+closepath
+! end of curve
+
+! start of curve
+amove .08128 .14986
+bezier .617412E-01 .149524 .448656E-01 .132553 .04445 .11303
+aline .043815 .112395
+aline .043815 .107315
+aline .04318 .10668
+aline .04318 .098425
+aline .042545 .09779
+aline .042545 .05588
+bezier .437693E-01 .367419E-01 .04615 .100493E-01 .06858 .00254
+bezier .930377E-01 -.879315E-02 .129195 .457794E-02 .13081 .034925
+aline .131445 .03556
+aline .131445 .03937
+aline .13208 .040005
+aline .13208 .045085
+aline .132715 .04572
+aline .132715 .055245
+aline .13335 .05588
+aline .13335 .09779
+bezier .132218 .115104 .12935 .13829 .109855 .14605
+aline .102235 .14859
+aline .09906 .149225
+aline .098425 .14986
+aline .094615 .14986
+aline .09398 .150495
+aline .081915 .150495
+aline .08128 .14986
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="1" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.430555 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .1016 .15748
+aline .103505 .155575
+aline .103505 .019685
+bezier .105362 .908545E-02 .117444 .109744E-01 .125095 .009525
+aline .145415 .009525
+aline .14732 .00762
+aline .14732 .00127
+aline .145415 -.000635
+aline .13462 -.000635
+aline .133985 0
+aline .099695 0
+aline .09906 .000635
+aline .08382 .000635
+aline .083185 0
+aline .048895 0
+aline .04826 -.000635
+aline .037465 -.000635
+aline .03556 .00127
+aline .03556 .00762
+aline .037465 .009525
+aline .057785 .009525
+bezier .654365E-01 .109744E-01 .775182E-01 .908545E-02 .079375 .019685
+aline .079375 .136525
+bezier .065475 .133906 .499807E-01 .13098 .034925 .132715
+aline .033655 .133985
+aline .033655 .140335
+aline .03556 .14224
+bezier .574027E-01 .142319 .796362E-01 .144275 .098425 .15748
+aline .1016 .15748
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="2" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.430555 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .09271 .15748
+bezier .11883 .156327 .154584 .144464 .15748 .113665
+bezier .161164 .897151E-01 .140519 .072463 .121285 .062865
+bezier .969026E-01 .515602E-01 .746181E-01 .373448E-01 .05207 .023495
+aline .052705 .02286
+aline .12954 .02286
+aline .130175 .023495
+aline .141605 .023495
+aline .142875 .024765
+aline .14478 .028575
+aline .145415 .03048
+aline .14605 .03175
+aline .146685 .03429
+aline .14732 .036195
+aline .149225 .043815
+aline .15113 .04572
+aline .155575 .04572
+aline .15748 .043815
+aline .15748 .04064
+aline .155575 .03302
+aline .15494 .029845
+aline .15113 .014605
+aline .150495 .01143
+aline .147955 .00127
+aline .14605 -.000635
+aline .01905 -.000635
+aline .01778 0
+bezier .117445E-01 .108209E-01 .280411E-01 .140369E-01 .033655 .02032
+bezier .618288E-01 .413786E-01 .940876E-01 .574101E-01 .11811 .08382
+bezier .135057 .102756 .126521 .135736 .1016 .142875
+bezier .792063E-01 .15171 .490735E-01 .147995 .03429 .127
+bezier .473049E-01 .125848 .514534E-01 .105995 .038735 .100965
+aline .03683 .10033
+aline .029845 .10033
+bezier .01336 .106093 .020798 .129042 .029845 .13843
+bezier .462629E-01 .155023 .705314E-01 .158469 .09271 .15748
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="3" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.430555 dep=.194445 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .094615 .15748
+bezier .121073 .155848 .155101 .136835 .15113 .10541
+bezier .148991 .792567E-01 .12717 .585854E-01 .10287 .0508
+bezier .139016 .457103E-01 .169947 .920999E-02 .15875 -.027305
+bezier .146823 -.686709E-01 .968375E-01 -.857063E-01 .059055 -.073025
+bezier .330113E-01 -.664245E-01 .695335E-02 -.393661E-01 .01778 -.01143
+bezier .263837E-01 .121467E-02 .494007E-01 -.258037E-02 .051435 -.018415
+bezier .539922E-01 -.304666E-01 .434817E-01 -.422933E-01 .031115 -.040005
+bezier .383705E-01 -.576468E-01 .622754E-01 -.657148E-01 .08001 -.067945
+bezier .106773 -.721265E-01 .126792 -.446674E-01 .126365 -.02032
+bezier .130368 .531857E-02 .120434 .401948E-01 .090805 .04572
+aline .06096 .04572
+aline .060325 .046355
+aline .059055 .04699
+aline .059055 .0508
+bezier .687905E-01 .559453E-01 .816135E-01 .517764E-01 .092075 .056515
+bezier .116919 .683057E-01 .124515 .101055 .118745 .125095
+bezier .11298 .148769 .846019E-01 .1537 .065405 .14605
+bezier .554778E-01 .142767 .426466E-01 .13763 .03937 .127635
+bezier .580338E-01 .131461 .655864E-01 .102919 .048895 .095885
+bezier .357652E-01 .897068E-01 .210174E-01 .102167 .024765 .116205
+bezier .295969E-01 .148186 .667464E-01 .15985 .094615 .15748
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="4" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.430555 dep=.194445 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .127 .16129
+aline .12827 .160655
+aline .128905 .16002
+aline .12954 .15875
+aline .12954 .01016
+aline .130175 .009525
+aline .16383 .009525
+aline .165735 .00762
+aline .165735 .00127
+aline .16383 -.000635
+aline .130175 -.000635
+aline .12954 -.00127
+aline .12954 -.050165
+bezier .130794 -.586412E-01 .139869 -.578791E-01 .14605 -.059055
+aline .16129 -.059055
+aline .16256 -.05969
+aline .163195 -.060325
+aline .16383 -.061595
+aline .16383 -.066675
+aline .163195 -.067945
+aline .16256 -.06858
+bezier .132756 -.689096E-01 .102408 -.674972E-01 .07239 -.069215
+aline .07112 -.06858
+aline .070485 -.067945
+aline .06985 -.066675
+aline .06985 -.061595
+aline .070485 -.060325
+bezier .803959E-01 -.570464E-01 .922394E-01 -.611105E-01 .1016 -.05588
+aline .10287 -.05334
+aline .103505 -.0508
+aline .10414 -.050165
+aline .10414 -.00127
+aline .103505 -.000635
+aline .0127 -.000635
+bezier .56924E-02 .54409E-02 .013186 .149151E-01 .01778 .02032
+bezier .520764E-01 .672465E-01 .854563E-01 .115306 .12065 .16129
+closepath
+! end of curve
+
+! start of curve
+amove .104775 .127
+bezier .766677E-01 .881139E-01 .464683E-01 .482979E-01 .02032 .009525
+aline .10541 .009525
+aline .106045 .01016
+aline .106045 .127635
+aline .10541 .12827
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="5" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.430555 dep=.194445 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .04064 .15748
+bezier .734602E-01 .141994 .109234 .144554 .14224 .15748
+aline .142875 .156845
+aline .144145 .15621
+bezier .143745 .14609 .131969 .140292 .125095 .133985
+bezier .101947 .117139 .714895E-01 .117078 .046355 .123825
+aline .046355 .056515
+bezier .562004E-01 .644637E-01 .708473E-01 .732033E-01 .08509 .07366
+bezier .123387 .783979E-01 .156028 .424717E-01 .15748 .00635
+bezier .163486 -.387802E-01 .12009 -.830294E-01 .07493 -.0762
+bezier .406557E-01 -.747282E-01 .011103 -.378071E-01 .02032 -.004445
+bezier .292889E-01 .100007E-01 .549122E-01 .148746E-02 .0508 -.01651
+bezier .499552E-01 -.276165E-01 .364101E-01 -.306783E-01 .293688E-01 -.295275E-01
+bezier .391456E-01 -.660935E-01 .927008E-01 -.829128E-01 .116205 -.050165
+bezier .132943 -.251762E-01 .130852 .69751E-02 .125095 .034925
+bezier .120869 .523953E-01 .104844 .705516E-01 .085725 .06604
+bezier .678662E-01 .655686E-01 .520469E-01 .536311E-01 .042545 .03937
+aline .038735 .03937
+aline .037465 .040005
+aline .03683 .04064
+aline .036195 .04191
+aline .036195 .155575
+aline .0381 .15748
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="6" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.644444 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .1143 .233045
+bezier .13688 .232969 .159211 .209746 .14986 .18669
+bezier .141243 .173394 .11726 .181668 .121285 .19812
+bezier .122059 .206959 .131712 .211278 .139065 .21082
+bezier .12098 .234193 .829417E-01 .22607 .06731 .2032
+bezier .047453 .177901 .440262E-01 .144563 .04572 .1143
+bezier .521618E-01 .133266 .712394E-01 .150267 .09144 .147955
+bezier .128145 .149889 .158713 .113787 .160655 .079375
+bezier .163902 .500085E-01 .151521 .196206E-01 .126365 .003175
+bezier .968359E-01 -.191429E-01 .504478E-01 -.797223E-02 .03302 .024765
+bezier .128575E-01 .633217E-01 .012186 .107275 .01905 .14859
+bezier .281635E-01 .19309 .661614E-01 .237024 .1143 .233045
+closepath
+! end of curve
+
+! start of curve
+amove .08255 .140335
+bezier .526249E-01 .132736 .436607E-01 .959504E-01 .046355 .06985
+bezier .460354E-01 .449147E-01 .051714 .108155E-01 .08001 .001905
+bezier .105613 -.607152E-02 .128776 .199535E-01 .12954 .04445
+aline .130175 .045085
+aline .130175 .05207
+aline .13081 .052705
+aline .13081 .0889
+bezier .130143 .10952 .120216 .135714 .097155 .14097
+aline .083185 .14097
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="7" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.430555 dep=.194445 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .0381 .16129
+aline .040005 .159385
+aline .040005 .15621
+bezier .483444E-01 .148503 .603689E-01 .151875 .070485 .14986
+aline .168275 .14986
+bezier .17485 .141377 .162574 .1336 .15875 .126365
+bezier .134788 .09175 .102022 .591949E-01 .09779 .014605
+bezier .094483 .544396E-03 .947141E-01 -.149817E-01 .093345 -.029845
+aline .093345 -.06477
+bezier .911414E-01 -.807776E-01 .650686E-01 -.807776E-01 .062865 -.06477
+bezier .604808E-01 -.343782E-02 .912567E-01 .561655E-01 .12954 .10287
+bezier .133926 .11014 .141601 .117378 .144145 .12446
+aline .05588 .12446
+aline .055245 .123825
+aline .041275 .123825
+aline .04064 .12319
+aline .03683 .12319
+aline .03556 .12065
+aline .034925 .118745
+aline .03429 .117475
+aline .033655 .11557
+aline .03175 .10795
+aline .028575 .092075
+aline .02667 .09017
+aline .022225 .09017
+aline .02032 .092075
+bezier .239132E-01 .115236 .273543E-01 .138073 .03302 .160655
+aline .03429 .16129
+aline .0381 .16129
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="8" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.644444 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .094615 .233045
+bezier .123367 .231818 .156809 .207043 .150495 .17526
+bezier .149585 .150886 .125165 .13695 .108373 .125518
+bezier .131316 .1118 .159139 .094476 .16002 .064135
+bezier .166369 .269397E-01 .13099 -.617849E-02 .09525 -.008255
+bezier .607597E-01 -.117001E-01 .191293E-01 .906415E-02 .01524 .046355
+bezier .113795E-01 .796438E-01 .392891E-01 .105225 .06731 .117475
+bezier .474222E-01 .128527 .264836E-01 .144939 .024765 .169545
+bezier .200308E-01 .207467 .587102E-01 .237627 .094615 .233045
+closepath
+! end of curve
+
+! start of curve
+amove .08128 .224155
+bezier .573463E-01 .224021 .302026E-01 .199299 .042545 .174625
+bezier .536233E-01 .154965 .770569E-01 .148111 .09398 .13462
+aline .09652 .13335
+bezier .101608 .128117 .108042 .137 .11303 .1397
+bezier .134401 .154132 .14529 .185775 .127 .20701
+bezier .115806 .219963 .976209E-01 .226956 .08128 .224155
+closepath
+! end of curve
+
+! start of curve
+amove .074295 .11176
+bezier .401579E-01 .978032E-01 .165498E-01 .509473E-01 .043815 .02032
+bezier .706216E-01 -.117723E-01 .131352 -.332983E-02 .14351 .0381
+bezier .148272 .060778 .129752 .804403E-01 .11049 .089535
+bezier .988068E-01 .971912E-01 .872458E-01 .105017 .752475E-01 .112236
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="9" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.430555 dep=.194445 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .095885 .15748
+bezier .136243 .153196 .1572 .109607 .15875 .073025
+bezier .166319 .239542E-01 .155885 -.361759E-01 .11049 -.06604
+bezier .855894E-01 -.811401E-01 .479415E-01 -.828748E-01 .028575 -.05842
+bezier .227313E-01 -.478067E-01 .202019E-01 -.292217E-01 .034925 -.024765
+aline .043815 -.024765
+bezier .602217E-01 -.028216 .571536E-01 -.562868E-01 .040005 -.05461
+bezier .345827E-01 -.553217E-01 .440239E-01 -.613247E-01 .04699 -.062865
+bezier .718067E-01 -.755221E-01 .104154 -.645576E-01 .116205 -.038735
+bezier .129697 -.145658E-01 .131763 .121565E-01 .130175 .038735
+bezier .12345 .201478E-01 .104447 .340625E-02 .084455 .005715
+bezier .482196E-01 .370338E-02 .169987E-01 .386191E-01 .01524 .073025
+bezier .124758E-01 .996572E-01 .230864E-01 .127401 .04572 .142875
+bezier .594839E-01 .155194 .781682E-01 .158395 .095885 .15748
+closepath
+! end of curve
+
+! start of curve
+amove .08382 .14859
+bezier .591694E-01 .147148 .458656E-01 .119745 .045085 .098425
+aline .045085 .062865
+bezier .459563E-01 .427623E-01 .560754E-01 .172344E-01 .07874 .0127
+bezier .105405 .817973E-02 .124877 .328589E-01 .12827 .05715
+bezier .131666 .081242 .131349 .107206 .11938 .130175
+bezier .112661 .142517 .977223E-01 .151923 .08382 .14859
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=":" !-------------- Beginning of new char.
+dfont wid=.277779 hei=.105556 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .05207 .03556
+bezier .707024E-01 .033691 .728738E-01 .436431E-02 .05461 0
+bezier .370705E-01 -.636072E-02 .226261E-01 .181321E-01 .036195 .03048
+aline .037465 .031115
+aline .03937 .03302
+aline .04191 .03429
+aline .043815 .034925
+aline .046355 .03556
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=";" !-------------- Beginning of new char.
+dfont wid=.277779 hei=.105556 dep=.194445 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .052705 .03556
+bezier .744693E-01 .286338E-01 .719298E-01 .35721E-03 .06985 -.017145
+bezier .06628 -.372217E-01 .563972E-01 -.563946E-01 .04064 -.069215
+aline .0381 -.069215
+aline .036195 -.06731
+bezier .038064 -.588526E-01 .476945E-01 -.533093E-01 .051435 -.045085
+bezier .600433E-01 -.294045E-01 .660684E-01 -.116185E-01 .0635 .005715
+bezier .525706E-01 -.884516E-02 .265468E-01 .276842E-02 .031115 .020955
+aline .03175 .023495
+aline .032385 .0254
+aline .033655 .02794
+aline .0381 .032385
+aline .03937 .03302
+aline .040005 .033655
+aline .041275 .03429
+aline .04318 .034925
+aline .04572 .03556
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="<" !-------------- Beginning of new char.
+dfont wid=.777781 hei=.539098 dep=.0390978 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .238125 .188595
+aline .239395 .18796
+aline .240665 .187325
+aline .241935 .186055
+aline .243205 .183515
+aline .243205 .179705
+aline .241935 .177165
+bezier .179806 .146022 .116122 .117138 .05334 .086995
+bezier .116122 .568521E-01 .179806 .279675E-01 .241935 -.003175
+aline .243205 -.005715
+aline .243205 -.009525
+aline .241935 -.012065
+aline .240665 -.013335
+aline .238125 -.014605
+aline .234315 -.014605
+bezier .166699 .017949 .981046E-01 .490599E-01 .031115 .08255
+aline .029845 .08509
+aline .029845 .0889
+aline .031115 .09144
+bezier .981046E-01 .12493 .166699 .156041 .234315 .188595
+aline .238125 .188595
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="=" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.75 dep=.25 italic=0
+dfont fby=1 kadd=-.0555553
+dfont fby="A" kadd=-.0555553
+dfont fby="M" kadd=-.0555553
+dfont fby="N" kadd=-.0555553
+dfont fby="Y" kadd=.0555553
+dfont fby="Z" kadd=-.0555553
+set path ! start of curve
+newpath
+! start of curve
+amove .150495 .262255
+aline .151765 .26162
+aline .153035 .260985
+aline .154305 .259715
+aline .155575 .257175
+bezier .13148 .181361 .101704 .106588 .075565 .031115
+bezier .604949E-01 -.801486E-02 .483176E-01 -.487238E-01 .03175 -.086995
+aline .02921 -.088265
+aline .0254 -.088265
+aline .02286 -.086995
+aline .02159 -.085725
+aline .02032 -.083185
+bezier .444152E-01 -.737131E-02 .741909E-01 .674023E-01 .10033 .142875
+bezier .1154 .182005 .127577 .222714 .144145 .260985
+aline .145415 .26162
+aline .146685 .262255
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=">" !-------------- Beginning of new char.
+dfont wid=.777781 hei=.539098 dep=.0390978 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .038735 .188595
+bezier .106351 .156041 .174945 .12493 .241935 .09144
+aline .243205 .0889
+aline .243205 .08509
+aline .241935 .08255
+bezier .174945 .04906 .106351 .179489E-01 .038735 -.014605
+aline .034925 -.014605
+aline .032385 -.013335
+aline .031115 -.012065
+aline .029845 -.009525
+aline .029845 -.005715
+aline .031115 -.003175
+bezier .932442E-01 .279675E-01 .156928 .056852 .21971 .086995
+bezier .156928 .117138 .932442E-01 .146022 .031115 .177165
+aline .029845 .179705
+aline .029845 .183515
+aline .031115 .186055
+aline .032385 .187325
+aline .033655 .18796
+aline .034925 .188595
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="?" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.465279 dep=-.0347214 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .089535 .169545
+aline .09144 .16764
+bezier .939498E-01 .143833 .973184E-01 .120382 .099695 .09652
+aline .1016 .096139
+aline .13208 .102235
+aline .135255 .102235
+aline .13589 .10287
+aline .16764 .10922
+aline .172085 .10922
+aline .173355 .108585
+aline .17399 .107315
+aline .17399 .10414
+bezier .152554 .092341 .12937 .083271 .107315 .07239
+bezier .11961 .051401 .131967 .298809E-01 .142875 .008255
+aline .14224 .006985
+aline .140335 .00508
+aline .137795 .00508
+bezier .120682 .221932E-01 .105365 .409541E-01 .879475E-01 .576263E-01
+bezier .705296E-01 .409541E-01 .552132E-01 .221932E-01 .0381 .00508
+aline .03556 .00508
+aline .033655 .006985
+bezier .340515E-01 .158687E-01 .423783E-01 .237539E-01 .04572 .032385
+bezier .535788E-01 .455479E-01 .602767E-01 .595475E-01 .06858 .07239
+bezier .465254E-01 .083271 .233411E-01 .092341 .001905 .10414
+aline .001905 .107315
+aline .00254 .108585
+aline .00381 .10922
+aline .008255 .10922
+aline .040005 .10287
+aline .04064 .102235
+aline .043815 .102235
+aline .074295 .096139
+aline .0762 .09652
+bezier .078941 .120625 .812774E-01 .144095 .08509 .168275
+aline .085725 .16891
+aline .086995 .169545
+aline .089535 .169545
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="@" !-------------- Beginning of new char.
+dfont wid=.530904 hei=.694445 dep=0 italic=.0555553
+dfont fby=127 kadd=.0833359
+set path ! start of curve
+newpath
+! start of curve
+amove .130175 .25019
+bezier .170307 .247593 .198794 .207306 .19812 .16891
+bezier .200545 .123799 .184158 .757381E-01 .15875 .037465
+bezier .134863 .183219E-02 .849479E-01 -.221272E-01 .04445 0
+bezier .196285E-01 .153259E-01 .933448E-02 .472712E-01 .017145 .074295
+bezier .254922E-01 .114763 .592772E-01 .146836 .098425 .15748
+bezier .117558 .161188 .14197 .159864 .154305 .14097
+bezier .158887 .133993 .161483 .125407 .16256 .117475
+bezier .171455 .152915 .182037 .192416 .15875 .22479
+bezier .136592 .253193 .890275E-01 .243925 .07239 .213995
+aline .739775E-01 .213598
+bezier .838195E-01 .21591 .916338E-01 .204934 .08763 .19558
+bezier .841548E-01 .182854 .061949 .177442 .05715 .19177
+bezier .576241E-01 .228376 .959067E-01 .254417 .130175 .25019
+closepath
+! end of curve
+
+! start of curve
+amove .108585 .15113
+bezier .772805E-01 .145228 .578608E-01 .115514 .0508 .08636
+bezier .448611E-01 .618125E-01 .339612E-01 .343602E-01 .051435 .012065
+bezier .772908E-01 -.137413E-01 .119348 .821643E-02 .133985 .036195
+bezier .14749 .618984E-01 .160613 .922914E-01 .15494 .12065
+bezier .152094 .135935 .140472 .149065 .125095 .151765
+aline .10922 .151765
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="A" !-------------- Beginning of new char.
+dfont wid=.750002 hei=.683332 dep=0 italic=0
+dfont fby=127 kadd=.138893
+set path ! start of curve
+newpath
+! start of curve
+amove .197485 .25019
+aline .198755 .249555
+bezier .20288 .240718 .200839 .229733 .2032 .220345
+bezier .209719 .151818 .215192 .832839E-01 .22352 .01524
+bezier .23031 .618401E-02 .243572 .119618E-01 .25273 .008255
+aline .253365 .006985
+aline .253365 .004445
+aline .25273 .001905
+aline .252095 .000635
+aline .25146 0
+aline .25019 -.000635
+aline .2413 -.000635
+aline .240665 0
+aline .215265 0
+aline .21463 .000635
+aline .201295 .000635
+aline .20066 0
+aline .17018 0
+aline .169545 -.000635
+aline .160655 -.000635
+aline .15875 .00127
+aline .15875 .004445
+aline .159385 .006985
+aline .16002 .008255
+aline .160655 .00889
+bezier .171257 .108125E-01 .186963 .765091E-02 .192405 .019685
+bezier .191437 .401916E-01 .18932 .606621E-01 .18669 .080645
+aline .09906 .080645
+bezier .881582E-01 .621392E-01 .759745E-01 .441604E-01 .066675 .024765
+bezier .646882E-01 .134126E-01 .07805 .893388E-02 .086995 .009525
+aline .0889 .00762
+aline .0889 .00381
+aline .088265 .001905
+aline .08763 .000635
+aline .086995 0
+bezier .632716E-01 -.619741E-03 .390362E-01 .001362 .01524 -.000635
+aline .01397 0
+aline .013335 .000635
+aline .0127 .001905
+aline .0127 .00381
+aline .013335 .00635
+aline .01397 .00762
+aline .015875 .009525
+bezier .398841E-01 .762221E-02 .586873E-01 .270918E-01 .067945 .047625
+bezier .109131 .114482 .147472 .183863 .189865 .249555
+aline .191135 .25019
+closepath
+! end of curve
+
+! start of curve
+amove .17399 .206375
+bezier .151468 .167988 .126605 .129462 .106045 .090805
+aline .18542 .090805
+bezier .183233 .129285 .178534 .169002 .174625 .207645
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="B" !-------------- Beginning of new char.
+dfont wid=.75851 hei=.683332 dep=0 italic=.0501728
+dfont fby=127 kadd=.0833359
+set path ! start of curve
+newpath
+! start of curve
+amove .20955 .23876
+bezier .233529 .237604 .26216 .222513 .26543 .196215
+bezier .26839 .157589 .229074 .131722 .194945 .125095
+aline .192405 .12446
+bezier .219363 .123433 .250202 .100907 .245745 .071755
+bezier .241326 .298269E-01 .197447 .251882E-02 .15875 -.000635
+aline .01778 -.000635
+aline .015875 .00127
+aline .015875 .005715
+aline .01651 .00762
+aline .018415 .009525
+aline .03556 .009525
+bezier .430756E-01 .104407E-01 .541388E-01 .108563E-01 .05588 .020955
+aline .09652 .183515
+aline .104775 .216535
+aline .10541 .21971
+bezier .108713 .228048 .965141E-01 .227643 .09144 .2286
+aline .07493 .2286
+aline .073025 .230505
+aline .073025 .234315
+aline .07366 .23622
+aline .074295 .23749
+aline .07493 .238125
+aline .0762 .23876
+aline .20955 .23876
+closepath
+! end of curve
+
+! start of curve
+amove .14224 .227965
+aline .139065 .22733
+aline .13716 .226695
+aline .135255 .22479
+aline .133985 .22225
+aline .132715 .21844
+aline .11049 .12954
+aline .110014 .128587
+aline .11049 .127635
+aline .172085 .127635
+bezier .208104 .132405 .244285 .17057 .23114 .207645
+bezier .226909 .21932 .215192 .226625 .203835 .2286
+aline .142875 .2286
+closepath
+! end of curve
+
+! start of curve
+amove .10795 .11938
+aline .107315 .11684
+aline .083185 .02032
+aline .08255 .017145
+aline .081915 .01651
+aline .081915 .01143
+aline .08255 .010795
+aline .085725 .01016
+aline .08636 .009525
+aline .14986 .009525
+bezier .192514 .137577E-01 .230815 .655957E-01 .206375 .10541
+bezier .200273 .114756 .188642 .119433 .178435 .12065
+aline .108585 .12065
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="C" !-------------- Beginning of new char.
+dfont wid=.714722 hei=.683332 dep=0 italic=.0715275
+dfont fby=":" kadd=-.0555553
+dfont fby=";" kadd=-.0555553
+dfont fby="=" kadd=-.0277786
+dfont fby=127 kadd=.0833359
+set path ! start of curve
+newpath
+! start of curve
+amove .18288 .24638
+bezier .202672 .244768 .222739 .232903 .233045 .215265
+bezier .242098 .225825 .251372 .236225 .260985 .24638
+aline .264795 .24638
+aline .26543 .245745
+aline .2667 .24511
+aline .2667 .2413
+aline .24384 .14986
+aline .243205 .147955
+aline .24257 .14732
+aline .2413 .146685
+aline .23495 .146685
+aline .23368 .147955
+bezier .237289 .175024 .233472 .210307 .207645 .227965
+bezier .168565 .249372 .121095 .224709 .093345 .19431
+bezier .637048E-01 .157998 .485834E-01 .109524 .050165 .0635
+bezier .529668E-01 .361955E-01 .725991E-01 .881618E-02 .1016 .00381
+bezier .152996 -.694141E-02 .206286 .353618E-01 .219075 .085725
+aline .220345 .086995
+aline .22479 .086995
+aline .22606 .08636
+bezier .226896 .070126 .215683 .544857E-01 .20701 .041275
+bezier .17345 -.447942E-02 .104681 -.258845E-01 .056515 .00889
+bezier .186745E-01 .338823E-01 .117624E-01 .849759E-01 .023495 .125095
+bezier .436636E-01 .193454 .110802 .249124 .18288 .24638
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="D" !-------------- Beginning of new char.
+dfont wid=.827917 hei=.683332 dep=0 italic=.0277786
+dfont fby=127 kadd=.0555573
+set path ! start of curve
+newpath
+! start of curve
+amove .208915 .23876
+bezier .249235 .23712 .280384 .199345 .28194 .160655
+bezier .287204 .084597 .22565 .74528E-02 .149225 -.000635
+aline .017145 -.000635
+aline .01524 .00127
+aline .01524 .005715
+aline .015875 .00762
+aline .01778 .009525
+aline .034925 .009525
+bezier .424406E-01 .104407E-01 .535038E-01 .108563E-01 .055245 .020955
+aline .095885 .183515
+aline .10414 .216535
+aline .104775 .21971
+bezier .108078 .228048 .958791E-01 .227643 .090805 .2286
+aline .074295 .2286
+aline .07239 .230505
+aline .07239 .234315
+aline .073025 .23622
+aline .07366 .23749
+aline .074295 .238125
+aline .075565 .23876
+aline .208915 .23876
+closepath
+! end of curve
+
+! start of curve
+amove .14224 .227965
+aline .139065 .22733
+aline .13716 .226695
+aline .135255 .22479
+aline .133985 .22225
+aline .132715 .21844
+aline .092075 .05588
+aline .083185 .02032
+aline .08255 .017145
+aline .081915 .01651
+aline .081915 .01143
+aline .08255 .010795
+aline .085725 .01016
+aline .08636 .009525
+aline .142875 .009525
+bezier .185769 .140076E-01 .222744 .471249E-01 .23622 .088265
+bezier .24785 .126752 .263418 .169303 .24003 .20574
+bezier .230077 .219587 .21253 .22654 .19685 .2286
+aline .142875 .2286
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="E" !-------------- Beginning of new char.
+dfont wid=.738195 hei=.683332 dep=0 italic=.0576382
+dfont fby=127 kadd=.0833359
+set path ! start of curve
+newpath
+! start of curve
+amove .266065 .23749
+aline .267335 .236855
+bezier .268516 .218241 .262997 .198892 .262255 .179705
+aline .26162 .17907
+aline .26162 .17399
+aline .260985 .173355
+aline .260985 .16891
+aline .26035 .168275
+aline .26035 .163195
+aline .259715 .160655
+aline .25781 .15875
+aline .254 .15875
+aline .25273 .159385
+aline .252095 .16002
+bezier .25179 .179075 .259749 .203455 .24257 .219075
+bezier .232677 .225167 .220863 .226141 .210185 .22733
+aline .14351 .22733
+aline .142875 .226695
+aline .1397 .226695
+aline .139065 .22606
+aline .136525 .22479
+aline .13589 .224155
+aline .133985 .220345
+aline .13335 .21844
+aline .111125 .12954
+aline .11049 .128905
+aline .111125 .12827
+aline .153035 .12827
+bezier .166642 .128874 .18221 .135581 .186055 .150495
+aline .18796 .15621
+aline .188595 .15875
+aline .18923 .160655
+aline .1905 .165735
+aline .191135 .16764
+aline .19304 .169545
+aline .19685 .169545
+aline .19812 .16891
+aline .198755 .168275
+aline .19939 .167005
+aline .19939 .1651
+aline .1778 .07874
+aline .175895 .076835
+aline .17145 .076835
+aline .169545 .07874
+bezier .170039 .906976E-01 .1789 .105025 .16764 .1143
+aline .165735 .114935
+aline .164465 .11557
+aline .161925 .116205
+aline .15875 .11684
+aline .158115 .117475
+aline .1524 .117475
+aline .151765 .11811
+aline .108585 .11811
+aline .10795 .11684
+aline .08382 .02032
+aline .083185 .017145
+aline .08255 .01651
+aline .08255 .01143
+aline .083185 .010795
+aline .08636 .01016
+aline .086995 .009525
+aline .15621 .009525
+bezier .182126 .101701E-01 .211406 .022216 .22352 .047625
+bezier .232518 .604511E-01 .236392 .771005E-01 .24511 .089535
+aline .24892 .089535
+bezier .25405 .835625E-01 .245605 .758355E-01 .244475 .069215
+bezier .233593 .462654E-01 .225657 .021109 .21336 -.000635
+aline .01651 -.000635
+aline .014605 .00127
+aline .014605 .005715
+aline .01524 .00762
+aline .017145 .009525
+aline .03429 .009525
+bezier .418056E-01 .104407E-01 .528688E-01 .108563E-01 .05461 .020955
+aline .09525 .183515
+aline .103505 .216535
+aline .10414 .21717
+aline .10414 .22352
+aline .10287 .22479
+aline .100965 .225425
+aline .10033 .22606
+aline .097155 .22606
+aline .09652 .226695
+aline .090805 .226695
+aline .09017 .22733
+aline .07366 .22733
+aline .07239 .227965
+aline .07112 .230505
+aline .07112 .231775
+aline .071755 .234315
+aline .07239 .235585
+aline .074295 .23749
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="F" !-------------- Beginning of new char.
+dfont wid=.643057 hei=.683332 dep=0 italic=.13889
+dfont fby=":" kadd=-.111112
+dfont fby=";" kadd=-.111112
+dfont fby="=" kadd=-.0555553
+dfont fby=127 kadd=.0833359
+set path ! start of curve
+newpath
+! start of curve
+amove .260985 .23749
+aline .262255 .236855
+bezier .263436 .218241 .257917 .198892 .257175 .179705
+aline .25654 .17907
+aline .25654 .17399
+aline .255905 .173355
+aline .255905 .16891
+aline .25527 .168275
+aline .25527 .163195
+aline .254635 .160655
+aline .25273 .15875
+aline .24892 .15875
+aline .24765 .159385
+aline .247015 .16002
+bezier .246577 .179208 .254905 .203332 .238125 .219075
+bezier .228644 .225048 .217311 .22626 .20701 .22733
+aline .14351 .22733
+aline .142875 .226695
+aline .1397 .226695
+aline .139065 .22606
+aline .136525 .22479
+aline .13589 .224155
+aline .133985 .220345
+aline .13335 .21844
+aline .110093 .125412
+aline .11049 .123825
+aline .14986 .123825
+bezier .163208 .124105 .178109 .13085 .182245 .145415
+aline .18415 .15113
+aline .184785 .15367
+aline .18542 .155575
+aline .187325 .163195
+aline .18923 .1651
+aline .193675 .1651
+aline .19558 .163195
+aline .19558 .16002
+aline .174625 .0762
+aline .17399 .074295
+aline .172085 .07239
+aline .168275 .07239
+aline .167005 .073025
+bezier .16389 .825758E-01 .172518 .930781E-01 .16891 .10287
+aline .16764 .10668
+aline .1651 .10922
+aline .16129 .111125
+aline .15875 .11176
+aline .155575 .112395
+aline .15494 .11303
+aline .14986 .11303
+aline .149225 .113665
+aline .107315 .113665
+aline .10668 .11176
+aline .084455 .02286
+bezier .804174E-01 .016341 .086146 .943981E-02 .093345 .010795
+aline .09398 .01016
+aline .1016 .01016
+aline .102235 .009525
+aline .122555 .009525
+aline .123825 .00889
+aline .12446 .008255
+aline .125095 .006985
+aline .125095 .00508
+aline .12446 .00254
+aline .12319 0
+aline .12192 -.000635
+aline .109855 -.000635
+aline .10922 0
+aline .073025 0
+aline .07239 .000635
+aline .05715 .000635
+aline .056515 0
+aline .0254 0
+aline .024765 -.000635
+aline .01651 -.000635
+aline .014605 .00127
+aline .014605 .005715
+aline .01524 .00762
+aline .017145 .009525
+aline .03429 .009525
+bezier .418056E-01 .104407E-01 .528688E-01 .108563E-01 .05461 .020955
+aline .09525 .183515
+aline .103505 .216535
+aline .10414 .21717
+aline .10414 .22352
+aline .10287 .22479
+aline .100965 .225425
+aline .10033 .22606
+aline .097155 .22606
+aline .09652 .226695
+aline .090805 .226695
+aline .09017 .22733
+aline .07366 .22733
+aline .07239 .227965
+aline .07112 .230505
+aline .07112 .231775
+aline .071755 .234315
+aline .07239 .235585
+aline .074295 .23749
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="G" !-------------- Beginning of new char.
+dfont wid=.786249 hei=.683332 dep=0 italic=0
+dfont fby=127 kadd=.0833359
+set path ! start of curve
+newpath
+! start of curve
+amove .18288 .24638
+bezier .202672 .244768 .222739 .232903 .233045 .215265
+bezier .242098 .225825 .251372 .236225 .260985 .24638
+aline .264795 .24638
+aline .26543 .245745
+aline .2667 .24511
+aline .2667 .2413
+aline .24384 .14986
+aline .243205 .147955
+aline .24257 .14732
+aline .2413 .146685
+aline .23495 .146685
+aline .23368 .147955
+bezier .237289 .175024 .233472 .210307 .207645 .227965
+bezier .168565 .249372 .121095 .224709 .093345 .19431
+bezier .631073E-01 .15701 .472097E-01 .106599 .0508 .05969
+bezier .552772E-01 .293871E-01 .812839E-01 .340961E-02 .112395 .00254
+bezier .140404 -.218167E-03 .177297 .112349E-01 .187325 .041275
+aline .194945 .071755
+aline .19558 .07239
+aline .19558 .075565
+bezier .196771 .854785E-01 .1837 .826136E-01 .1778 .084455
+aline .15748 .084455
+aline .155575 .08636
+aline .155575 .09017
+aline .15621 .092075
+aline .156845 .093345
+aline .15748 .09398
+aline .15875 .094615
+aline .17018 .094615
+aline .170815 .09398
+aline .206375 .09398
+aline .20701 .093345
+aline .220345 .093345
+aline .22098 .09398
+aline .24384 .09398
+aline .244475 .094615
+aline .250825 .094615
+aline .252095 .09398
+aline .25273 .093345
+aline .253365 .092075
+aline .253365 .09017
+aline .25273 .08763
+aline .252095 .08636
+aline .25019 .084455
+aline .23876 .084455
+aline .238125 .08382
+aline .234315 .08382
+aline .23368 .083185
+aline .23114 .08255
+aline .229235 .081915
+aline .22733 .08001
+aline .22606 .07747
+aline .22479 .07366
+aline .20701 .00254
+aline .206375 .000635
+bezier .19973 -.376517E-02 .196046 .746579E-02 .192405 .01143
+aline .189865 .01651
+aline .18923 .018415
+aline .18796 .020955
+bezier .160106 -.947009E-02 .113256 -.145341E-01 .0762 -.001905
+bezier .338427E-01 .129812E-01 .116275E-01 .617597E-01 .019685 .103505
+bezier .289148E-01 .181728 .1039 .249236 .18288 .24638
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="H" !-------------- Beginning of new char.
+dfont wid=.831251 hei=.683332 dep=0 italic=.0812483
+dfont fby=":" kadd=-.0555553
+dfont fby=";" kadd=-.0555553
+dfont fby="=" kadd=-.0555553
+dfont fby=127 kadd=.0555573
+set path ! start of curve
+newpath
+! start of curve
+amove .08509 .23876
+aline .085725 .238125
+aline .116205 .238125
+aline .11684 .23749
+aline .13081 .23749
+aline .131445 .238125
+aline .161925 .238125
+aline .16256 .23876
+aline .170815 .23876
+aline .172085 .238125
+aline .17272 .23749
+aline .173355 .23622
+aline .173355 .23368
+aline .17272 .231775
+aline .17145 .229235
+bezier .158896 .226456 .141345 .232837 .133985 .21971
+aline .132715 .2159
+aline .111363 .130492
+aline .11176 .128905
+aline .21717 .128905
+aline .217805 .130175
+aline .239395 .216535
+aline .24003 .21971
+bezier .243333 .228048 .231134 .227643 .22606 .2286
+aline .20955 .2286
+aline .207645 .230505
+aline .207645 .234315
+aline .20828 .23622
+aline .208915 .23749
+aline .20955 .238125
+aline .21082 .23876
+aline .22098 .23876
+aline .221615 .238125
+aline .252095 .238125
+aline .25273 .23749
+aline .2667 .23749
+aline .267335 .238125
+aline .297815 .238125
+aline .29845 .23876
+aline .306705 .23876
+aline .307975 .238125
+aline .30861 .23749
+aline .309245 .23622
+aline .309245 .23368
+aline .30861 .231775
+aline .30734 .229235
+bezier .294786 .226456 .277235 .232837 .269875 .21971
+aline .268605 .2159
+aline .227965 .05334
+aline .21971 .02032
+aline .219075 .019685
+aline .219075 .013335
+aline .220345 .012065
+aline .22225 .01143
+aline .222885 .010795
+aline .22606 .010795
+aline .226695 .01016
+aline .23241 .01016
+aline .233045 .009525
+aline .249555 .009525
+aline .250825 .00889
+aline .252095 .00635
+aline .252095 .00508
+aline .25146 .00254
+aline .250825 .00127
+aline .24892 -.000635
+aline .23876 -.000635
+aline .238125 0
+aline .207645 0
+aline .20701 .000635
+aline .19304 .000635
+aline .192405 0
+aline .16129 0
+aline .160655 -.000635
+aline .1524 -.000635
+aline .150495 .00127
+aline .150495 .005715
+aline .15113 .00762
+aline .153035 .009525
+aline .17018 .009525
+bezier .177696 .104407E-01 .188759 .108563E-01 .1905 .020955
+aline .21463 .117475
+aline .215265 .11811
+aline .21463 .118745
+aline .108585 .118745
+aline .10795 .11684
+aline .08382 .02032
+aline .083185 .019685
+aline .083185 .013335
+aline .084455 .012065
+aline .08636 .01143
+aline .086995 .010795
+aline .09017 .010795
+aline .090805 .01016
+aline .09652 .01016
+aline .097155 .009525
+aline .113665 .009525
+aline .114935 .00889
+aline .116205 .00635
+aline .116205 .00508
+aline .11557 .00254
+aline .114935 .00127
+aline .11303 -.000635
+aline .10287 -.000635
+aline .102235 0
+aline .071755 0
+aline .07112 .000635
+aline .05715 .000635
+aline .056515 0
+aline .0254 0
+aline .024765 -.000635
+aline .01651 -.000635
+aline .014605 .00127
+aline .014605 .005715
+aline .01524 .00762
+aline .017145 .009525
+aline .03429 .009525
+bezier .418056E-01 .104407E-01 .528688E-01 .108563E-01 .05461 .020955
+aline .09525 .183515
+aline .103505 .216535
+aline .10414 .21971
+bezier .107443 .228048 .952441E-01 .227643 .09017 .2286
+aline .07366 .2286
+aline .071755 .230505
+aline .071755 .234315
+aline .07239 .23622
+aline .073025 .23749
+aline .07366 .238125
+aline .07493 .23876
+aline .08509 .23876
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="I" !-------------- Beginning of new char.
+dfont wid=.439585 hei=.683332 dep=0 italic=.0784712
+dfont fby=127 kadd=.111115
+set path ! start of curve
+newpath
+! start of curve
+amove .083185 .23876
+aline .08382 .238125
+aline .11557 .238125
+aline .116205 .23749
+aline .13081 .23749
+aline .131445 .238125
+aline .163195 .238125
+aline .16383 .23876
+aline .17272 .23876
+aline .17399 .238125
+aline .174625 .23749
+aline .17526 .23622
+aline .17526 .234315
+aline .174625 .231775
+aline .17399 .230505
+aline .172085 .2286
+aline .15494 .2286
+bezier .146641 .227668 .134181 .227325 .132715 .2159
+aline .092075 .05334
+aline .08382 .02032
+bezier .795771E-01 .112493E-01 .911492E-01 .941954E-02 .09779 .01016
+aline .098425 .009525
+aline .11557 .009525
+aline .117475 .00762
+aline .117475 .003175
+aline .11684 .00127
+aline .114935 -.000635
+aline .10414 -.000635
+aline .103505 0
+aline .071755 0
+aline .07112 .000635
+aline .056515 .000635
+aline .05588 0
+aline .02413 0
+aline .023495 -.000635
+aline .014605 -.000635
+aline .0127 .00127
+aline .0127 .00508
+aline .013335 .006985
+aline .01397 .008255
+bezier .260339E-01 .119568E-01 .407595E-01 .647941E-02 .051435 .014605
+aline .05207 .015875
+aline .052705 .01651
+aline .053975 .01905
+aline .05461 .020955
+aline .09525 .183515
+aline .103505 .216535
+aline .10414 .21717
+aline .10414 .220345
+aline .104537 .221933
+aline .10414 .22352
+aline .103505 .225425
+aline .10287 .22606
+aline .10033 .226695
+aline .097155 .22733
+aline .09652 .227965
+aline .09017 .227965
+aline .089535 .2286
+aline .07239 .2286
+aline .07112 .229235
+aline .070485 .22987
+aline .06985 .23114
+aline .06985 .23368
+aline .070485 .23622
+aline .07112 .23749
+aline .071755 .238125
+aline .073025 .23876
+aline .083185 .23876
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="J" !-------------- Beginning of new char.
+dfont wid=.554514 hei=.683332 dep=0 italic=.0961809
+dfont fby=":" kadd=-.111112
+dfont fby=";" kadd=-.111112
+dfont fby="=" kadd=-.0555553
+dfont fby=127 kadd=.166672
+set path ! start of curve
+newpath
+! start of curve
+amove .13462 .23876
+aline .135255 .238125
+aline .17272 .238125
+aline .173355 .23749
+aline .187325 .23749
+aline .18796 .238125
+aline .212725 .238125
+aline .21336 .23876
+aline .21971 .23876
+aline .22098 .238125
+aline .22225 .235585
+aline .22225 .234315
+aline .221615 .231775
+aline .22098 .230505
+aline .219075 .2286
+aline .206375 .2286
+aline .20574 .227965
+aline .201295 .227965
+aline .20066 .22733
+aline .197485 .226695
+aline .194945 .225425
+aline .193675 .224155
+aline .19177 .220345
+aline .191135 .21844
+aline .150495 .05588
+bezier .14268 .812086E-02 .809716E-01 -.263554E-01 .03937 .001905
+bezier .212267E-01 .015222 .210091E-01 .515773E-01 .04572 .05715
+bezier .588813E-01 .604876E-01 .697719E-01 .460063E-01 .062865 .03429
+bezier .586183E-01 .253389E-01 .048834 .193951E-01 .038735 .020955
+bezier .424622E-01 .191326E-02 .068098 -.61187E-02 .084455 .001905
+bezier .102276 .104136E-01 .114185 .276551E-01 .120015 .046355
+aline .160655 .208915
+aline .16256 .216535
+aline .163195 .21717
+aline .163195 .22352
+aline .16129 .225425
+aline .16002 .22606
+aline .156845 .226695
+aline .15621 .22733
+aline .1524 .22733
+aline .151765 .227965
+aline .144145 .227965
+aline .14351 .2286
+aline .12192 .2286
+aline .120015 .230505
+aline .120015 .234315
+aline .12065 .23622
+aline .121285 .23749
+aline .12192 .238125
+aline .12319 .23876
+aline .13462 .23876
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="K" !-------------- Beginning of new char.
+dfont wid=.849307 hei=.683332 dep=0 italic=.0715275
+dfont fby=":" kadd=-.0555553
+dfont fby=";" kadd=-.0555553
+dfont fby="=" kadd=-.0555553
+dfont fby=127 kadd=.0555573
+set path ! start of curve
+newpath
+! start of curve
+amove .08509 .23876
+aline .085725 .238125
+aline .116205 .238125
+aline .11684 .23749
+aline .13081 .23749
+aline .131445 .238125
+aline .161925 .238125
+aline .16256 .23876
+aline .170815 .23876
+aline .172085 .238125
+aline .17272 .23749
+aline .173355 .23622
+aline .173355 .23368
+aline .17272 .231775
+aline .17145 .229235
+bezier .158896 .226456 .141345 .232837 .133985 .21971
+aline .132715 .2159
+aline .10414 .1016
+aline .103664 .100648
+bezier .109707 .101559 .115542 .109792 .12192 .11303
+bezier .164045 .147057 .208311 .178111 .249555 .21336
+bezier .255193 .218441 .252752 .228055 .244475 .227965
+aline .24384 .2286
+aline .239395 .2286
+aline .23749 .230505
+aline .23749 .23495
+aline .238125 .236855
+aline .24003 .23876
+aline .25019 .23876
+aline .250825 .238125
+aline .2794 .238125
+aline .280035 .23749
+aline .28956 .23749
+aline .290195 .238125
+aline .3048 .238125
+aline .305435 .23876
+aline .30988 .23876
+aline .311785 .236855
+aline .311785 .233045
+aline .31115 .23114
+aline .310515 .22987
+bezier .270192 .225485 .240034 .193325 .20828 .170815
+bezier .198517 .162067 .184897 .154053 .177165 .145415
+bezier .196123 .10233 .213144 .580684E-01 .23368 .015875
+aline .23622 .013335
+aline .24003 .01143
+aline .24257 .010795
+aline .243205 .01016
+aline .247015 .01016
+aline .24765 .009525
+aline .257175 .009525
+aline .258445 .00889
+aline .25908 .008255
+aline .259715 .006985
+aline .259715 .004445
+aline .25908 .00254
+aline .25781 0
+aline .25654 -.000635
+aline .24892 -.000635
+aline .248285 0
+aline .22733 0
+aline .226695 .000635
+aline .21463 .000635
+aline .213995 0
+aline .18288 0
+aline .182245 -.000635
+aline .17399 -.000635
+aline .17272 0
+aline .172085 .000635
+aline .17145 .001905
+aline .17145 .004445
+aline .172085 .00635
+aline .173355 .00889
+bezier .182684 .969321E-02 .198787 .942543E-02 .19812 .02286
+bezier .182911 .574597E-01 .168692 .932933E-01 .152718 .127476
+bezier .135272 .113829 .116904 .100809 .10033 .08636
+aline .08382 .02032
+aline .083185 .019685
+aline .083185 .013335
+aline .084455 .012065
+aline .08636 .01143
+aline .086995 .010795
+aline .09017 .010795
+aline .090805 .01016
+aline .09652 .01016
+aline .097155 .009525
+aline .113665 .009525
+aline .114935 .00889
+aline .116205 .00635
+aline .116205 .00508
+aline .11557 .00254
+aline .114935 .00127
+aline .11303 -.000635
+aline .10287 -.000635
+aline .102235 0
+aline .071755 0
+aline .07112 .000635
+aline .05715 .000635
+aline .056515 0
+aline .0254 0
+aline .024765 -.000635
+aline .01651 -.000635
+aline .014605 .00127
+aline .014605 .005715
+aline .01524 .00762
+aline .017145 .009525
+aline .03429 .009525
+bezier .418056E-01 .104407E-01 .528688E-01 .108563E-01 .05461 .020955
+aline .09525 .183515
+aline .103505 .216535
+aline .10414 .21971
+bezier .107443 .228048 .952441E-01 .227643 .09017 .2286
+aline .07366 .2286
+aline .071755 .230505
+aline .071755 .234315
+aline .07239 .23622
+aline .073025 .23749
+aline .07366 .238125
+aline .07493 .23876
+aline .08509 .23876
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="L" !-------------- Beginning of new char.
+dfont wid=.680557 hei=.683332 dep=0 italic=0
+dfont fby=127 kadd=.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .08509 .23876
+aline .085725 .238125
+aline .116205 .238125
+aline .11684 .23749
+aline .13208 .23749
+aline .132715 .238125
+aline .169545 .238125
+aline .17018 .23876
+aline .18034 .23876
+aline .182245 .236855
+aline .182245 .23368
+aline .18161 .23114
+aline .180975 .22987
+bezier .167137 .226604 .151762 .230658 .13843 .22479
+aline .135255 .221615
+aline .13335 .217805
+aline .132715 .2159
+aline .092075 .05334
+aline .08382 .02032
+aline .083185 .017145
+aline .08255 .01651
+aline .08255 .01143
+aline .083185 .010795
+aline .08636 .01016
+aline .086995 .009525
+aline .136525 .009525
+bezier .162345 .112164E-01 .189642 .253082E-01 .20193 .04953
+bezier .209376 .619603E-01 .212797 .766038E-01 .21971 .0889
+aline .22098 .089535
+aline .222885 .089535
+aline .225425 .088265
+bezier .225812 .761688E-01 .217499 .646531E-01 .21463 .052705
+bezier .207207 .352276E-01 .20283 .155057E-01 .193675 -.000635
+aline .01651 -.000635
+aline .014605 .00127
+aline .014605 .005715
+aline .01524 .00762
+aline .017145 .009525
+aline .03429 .009525
+bezier .418056E-01 .104407E-01 .528688E-01 .108563E-01 .05461 .020955
+aline .09525 .183515
+aline .103505 .216535
+aline .10414 .21971
+bezier .107443 .228048 .952441E-01 .227643 .09017 .2286
+aline .07366 .2286
+aline .071755 .230505
+aline .071755 .234315
+aline .07239 .23622
+aline .073025 .23749
+aline .07366 .238125
+aline .07493 .23876
+aline .08509 .23876
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="M" !-------------- Beginning of new char.
+dfont wid=.97014 hei=.683332 dep=0 italic=.109027
+dfont fby=":" kadd=-.0555553
+dfont fby=";" kadd=-.0555553
+dfont fby="=" kadd=-.0555553
+dfont fby=127 kadd=.0833359
+set path ! start of curve
+newpath
+! start of curve
+amove .139065 .23876
+bezier .144682 .234278 .141645 .225551 .144145 .21971
+bezier .152213 .156892 .160647 .942245E-01 .169545 .03175
+bezier .213816 .100365 .256168 .170364 .301625 .238125
+aline .30353 .23876
+aline .36322 .23876
+aline .36449 .238125
+aline .365125 .23749
+aline .36576 .23622
+aline .36576 .23368
+aline .365125 .231775
+aline .363855 .229235
+bezier .351301 .226456 .33375 .232837 .32639 .21971
+aline .32512 .2159
+aline .28448 .05334
+aline .276225 .02032
+aline .27559 .019685
+aline .27559 .013335
+aline .27686 .012065
+aline .278765 .01143
+aline .2794 .010795
+aline .282575 .010795
+aline .28321 .01016
+aline .288925 .01016
+aline .28956 .009525
+aline .30607 .009525
+aline .30734 .00889
+aline .30861 .00635
+aline .30861 .00508
+aline .307975 .00254
+aline .30734 .00127
+aline .305435 -.000635
+aline .295275 -.000635
+aline .29464 0
+aline .26543 0
+aline .264795 .000635
+aline .25146 .000635
+aline .250825 0
+aline .22098 0
+aline .220345 -.000635
+aline .21209 -.000635
+aline .210185 .00127
+aline .210185 .005715
+aline .21082 .00762
+aline .212725 .009525
+aline .22987 .009525
+bezier .237386 .104407E-01 .248449 .108563E-01 .25019 .020955
+aline .29083 .183515
+aline .301387 .225743
+aline .30099 .22733
+bezier .252224 .151766 .20548 .747438E-01 .155575 0
+bezier .146458 -.003832 .148267 .866967E-02 .146685 .013335
+bezier .137647 .842332E-01 .128013 .154885 .11811 .225425
+aline .117475 .22352
+aline .076835 .06096
+aline .069215 .03048
+bezier .655973E-01 .213902E-01 .725829E-01 .114003E-01 .08255 .010795
+aline .083185 .01016
+aline .08763 .01016
+aline .088265 .009525
+aline .09652 .009525
+aline .09779 .00889
+aline .09906 .00635
+aline .09906 .00508
+aline .098425 .00254
+aline .09779 .00127
+aline .095885 -.000635
+aline .086995 -.000635
+aline .08636 0
+aline .062865 0
+aline .06223 .000635
+aline .0508 .000635
+aline .050165 0
+aline .026035 0
+aline .0254 -.000635
+aline .018415 -.000635
+aline .01651 .00127
+aline .01651 .005715
+aline .017145 .00762
+aline .01905 .009525
+bezier .346174E-01 .873193E-02 .542618E-01 .138957E-01 .059055 .031115
+aline .099695 .193675
+aline .10541 .216535
+aline .106045 .21971
+bezier .109348 .228048 .971491E-01 .227643 .092075 .2286
+aline .075565 .2286
+aline .07366 .230505
+aline .07366 .234315
+aline .074295 .23622
+aline .07493 .23749
+aline .075565 .238125
+aline .076835 .23876
+closepath
+! end of curve
+
+! start of curve
+amove .301149 .227647
+aline .301625 .226695
+aline .302101 .227647
+aline .301625 .2286
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="N" !-------------- Beginning of new char.
+dfont wid=.803473 hei=.683332 dep=0 italic=.109027
+dfont fby=":" kadd=-.0555553
+dfont fby=";" kadd=-.0555553
+dfont fby="=" kadd=-.083334
+dfont fby=127 kadd=.0833359
+set path ! start of curve
+newpath
+! start of curve
+amove .13589 .23876
+bezier .164702 .176724 .188768 .111602 .216535 .048895
+aline .255905 .206375
+bezier .261593 .21797 .249618 .229002 .238125 .227965
+aline .23749 .2286
+aline .2286 .2286
+aline .226695 .230505
+aline .226695 .234315
+aline .22733 .23622
+aline .227965 .23749
+aline .2286 .238125
+bezier .25441 .23854 .2807 .236984 .306705 .23876
+aline .307975 .238125
+aline .30861 .23749
+aline .309245 .23622
+aline .309245 .23368
+aline .30861 .231775
+aline .30734 .229235
+bezier .291488 .228733 .270144 .224712 .266065 .20574
+aline .225425 .04318
+aline .215265 .00254
+aline .213995 0
+bezier .203794 -.440722E-02 .203135 .970594E-02 .19939 .015875
+bezier .170889 .830041E-01 .143778 .152529 .114209 .218077
+aline .07366 .05588
+aline .06731 .03048
+bezier .636923E-01 .213902E-01 .706779E-01 .114002E-01 .080645 .010795
+aline .08128 .01016
+aline .085725 .01016
+aline .08636 .009525
+aline .094615 .009525
+aline .095885 .00889
+aline .097155 .00635
+aline .097155 .00508
+aline .09652 .00254
+aline .095885 .00127
+aline .09398 -.000635
+aline .08509 -.000635
+aline .084455 0
+aline .06096 0
+aline .060325 .000635
+aline .048895 .000635
+aline .04826 0
+aline .02413 0
+aline .023495 -.000635
+aline .01651 -.000635
+aline .014605 .00127
+aline .014605 .005715
+aline .01524 .00762
+aline .017145 .009525
+bezier .327124E-01 .873193E-02 .523568E-01 .138957E-01 .05715 .031115
+aline .09779 .193675
+aline .10541 .224155
+aline .105833 .225425
+aline .105583 .226175
+aline .103505 .226695
+aline .10287 .22733
+aline .099695 .22733
+aline .09906 .227965
+aline .092075 .227965
+aline .09144 .2286
+aline .07366 .2286
+aline .071755 .230505
+aline .071755 .234315
+aline .07239 .23622
+aline .073025 .23749
+aline .07366 .238125
+aline .07493 .23876
+aline .13589 .23876
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="O" !-------------- Beginning of new char.
+dfont wid=.762776 hei=.683332 dep=0 italic=.0277786
+dfont fby=127 kadd=.0833359
+set path ! start of curve
+newpath
+! start of curve
+amove .178435 .24638
+bezier .22258 .244767 .259602 .203036 .258445 .159385
+bezier .263292 .751295E-01 .186191 -.114417E-01 .09906 -.008255
+bezier .581274E-01 -.680577E-02 .209248E-01 .290856E-01 .01905 .070485
+bezier .980682E-02 .152672 .800858E-01 .238076 .16256 .24638
+aline .178435 .24638
+closepath
+! end of curve
+
+! start of curve
+amove .16129 .23749
+bezier .104045 .229722 .678321E-01 .173512 .056515 .120015
+bezier .475143E-01 .849135E-01 .443464E-01 .409013E-01 .07366 .0127
+bezier .106033 -.141839E-01 .151829 .006489 .17653 .03429
+bezier .207345 .659754E-01 .221992 .112548 .227965 .154305
+bezier .23093 .185644 .220692 .224272 .187325 .23495
+aline .184785 .235585
+aline .18288 .23622
+aline .179705 .236855
+aline .17907 .23749
+aline .17526 .23749
+aline .174625 .238125
+aline .161925 .238125
+aline .16129 .23749
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="P" !-------------- Beginning of new char.
+dfont wid=.642014 hei=.683332 dep=0 italic=.13889
+dfont fby=":" kadd=-.111112
+dfont fby=";" kadd=-.111112
+dfont fby="=" kadd=-.0555553
+dfont fby=127 kadd=.0833359
+set path ! start of curve
+newpath
+! start of curve
+amove .20447 .23876
+bezier .230521 .237855 .260812 .220739 .26416 .192405
+bezier .267176 .148995 .223783 .118551 .184785 .11176
+aline .18161 .11176
+aline .180975 .111125
+aline .177165 .111125
+aline .17653 .11049
+aline .107315 .11049
+aline .10668 .10922
+aline .084455 .02032
+aline .08382 .019685
+aline .08382 .013335
+aline .08509 .012065
+aline .086995 .01143
+aline .08763 .010795
+aline .090805 .010795
+aline .09144 .01016
+aline .097155 .01016
+aline .09779 .009525
+aline .1143 .009525
+aline .11557 .00889
+aline .11684 .00635
+aline .11684 .00508
+aline .116205 .00254
+aline .11557 .00127
+aline .113665 -.000635
+aline .103505 -.000635
+aline .10287 0
+aline .07239 0
+aline .071755 .000635
+aline .057785 .000635
+aline .05715 0
+aline .026035 0
+aline .0254 -.000635
+aline .017145 -.000635
+aline .01524 .00127
+aline .01524 .005715
+aline .015875 .00762
+aline .01778 .009525
+aline .034925 .009525
+bezier .424406E-01 .104407E-01 .535038E-01 .108563E-01 .055245 .020955
+aline .095885 .183515
+aline .10414 .216535
+aline .104775 .21971
+bezier .108078 .228048 .958791E-01 .227643 .090805 .2286
+aline .074295 .2286
+aline .07239 .230505
+aline .07239 .234315
+aline .073025 .23622
+aline .07366 .23749
+aline .074295 .238125
+aline .075565 .23876
+aline .20447 .23876
+closepath
+! end of curve
+
+! start of curve
+amove .14224 .227965
+aline .139065 .22733
+aline .13716 .226695
+aline .135255 .22479
+aline .133985 .22225
+aline .132715 .21844
+aline .108188 .120333
+aline .108585 .118745
+aline .16637 .118745
+bezier .190423 .120943 .217503 .134426 .22479 .16002
+bezier .23104 .179888 .240174 .205801 .21971 .220345
+aline .21209 .224155
+aline .20828 .225425
+aline .2032 .226695
+aline .202565 .22733
+aline .19939 .22733
+aline .198755 .227965
+aline .19431 .227965
+aline .193675 .2286
+aline .142875 .2286
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="Q" !-------------- Beginning of new char.
+dfont wid=.790555 hei=.683332 dep=.194445 italic=0
+dfont fby=127 kadd=.0833359
+set path ! start of curve
+newpath
+! start of curve
+amove .178435 .24638
+bezier .22258 .244767 .259602 .203036 .258445 .159385
+bezier .262843 .921427E-01 .214236 .266877E-01 .153194 .3175E-03
+bezier .155266 -.126845E-01 .156994 -.323196E-01 .173355 -.03556
+bezier .194984 -.371748E-01 .214905 -.201755E-01 .21971 .000635
+aline .221615 .00254
+aline .22479 .00254
+aline .226695 .000635
+bezier .221097 -.282291E-01 .205328 -.622812E-01 .17399 -.069215
+bezier .156211 -.729773E-01 .138376 -.584426E-01 .140335 -.040005
+aline .1397 -.03937
+aline .1397 -.024765
+aline .140335 -.02413
+aline .140335 -.01524
+aline .14097 -.014605
+aline .14097 -.008255
+aline .141605 -.00762
+aline .141605 -.00381
+bezier .106518 -.132863E-01 .628873E-01 -.905252E-02 .038735 .022225
+bezier -.236449E-02 .746617E-01 .224944E-01 .150131 .064135 .194945
+bezier .933993E-01 .226211 .135112 .249059 .178435 .24638
+closepath
+! end of curve
+
+! start of curve
+amove .16129 .23749
+bezier .105879 .229571 .695958E-01 .175974 .056515 .12446
+bezier .466501E-01 .901968E-01 .418284E-01 .510386E-01 .06477 .02032
+bezier .070814 .136577E-01 .799505E-01 .591388E-02 .874713E-01 .47625E-02
+bezier .762869E-01 .321248E-01 .11204 .631024E-01 .13716 .046355
+bezier .147339 .038738 .149925 .251268E-01 .151765 .01397
+bezier .190749 .345458E-01 .213 .792419E-01 .222885 .12192
+bezier .231822 .156685 .233817 .201722 .20193 .22733
+bezier .189987 .235308 .175168 .240031 .16129 .23749
+closepath
+! end of curve
+
+! start of curve
+amove .11684 .04318
+bezier .098749 .409834E-01 .825903E-01 .132254E-01 .10033 .00127
+bezier .114074 -.21302E-02 .13016 .189784E-02 .14224 .00889
+bezier .144072 .212475E-01 .141613 .424012E-01 .125095 .04318
+aline .12446 .043815
+aline .117475 .043815
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="R" !-------------- Beginning of new char.
+dfont wid=.75929 hei=.683332 dep=0 italic=.00772572
+dfont fby=127 kadd=.0833359
+set path ! start of curve
+newpath
+! start of curve
+amove .191135 .23876
+bezier .221137 .237857 .260728 .219234 .259715 .18415
+bezier .255193 .146404 .215319 .126202 .18161 .11811
+bezier .202499 .112224 .219553 .905441E-01 .213995 .06858
+bezier .21464 .469362E-01 .205717 .239874E-01 .21463 .003175
+bezier .226312 -.839809E-02 .24384 .552317E-02 .25019 .017145
+aline .25273 .022225
+aline .253365 .02413
+aline .254 .0254
+aline .25654 .03302
+aline .257175 .03429
+aline .25781 .034925
+aline .25908 .03556
+aline .262255 .03556
+aline .263525 .034925
+bezier .266765 .263703E-01 .258896 .168082E-01 .254635 .009525
+bezier .237011 -.207198E-01 .180863 -.110186E-01 .17653 .02413
+aline .17653 .03429
+aline .177165 .034925
+aline .177165 .0381
+aline .1778 .041275
+aline .186055 .074295
+bezier .192476 .924043E-01 .177228 .114623 .15748 .114935
+aline .156845 .11557
+aline .107315 .11557
+aline .10668 .1143
+aline .083185 .02032
+aline .08255 .019685
+aline .08255 .013335
+aline .08382 .012065
+aline .085725 .01143
+aline .08636 .010795
+aline .089535 .010795
+aline .09017 .01016
+aline .095885 .01016
+aline .09652 .009525
+aline .11303 .009525
+aline .1143 .00889
+aline .11557 .00635
+aline .11557 .00508
+aline .114935 .00254
+aline .1143 .00127
+aline .112395 -.000635
+aline .102235 -.000635
+aline .1016 0
+aline .071755 0
+aline .07112 .000635
+aline .05715 .000635
+aline .056515 0
+aline .026035 0
+aline .0254 -.000635
+aline .017145 -.000635
+aline .01524 .00127
+aline .01524 .005715
+aline .015875 .00762
+aline .01778 .009525
+aline .034925 .009525
+bezier .424406E-01 .104407E-01 .535038E-01 .108563E-01 .055245 .020955
+aline .095885 .183515
+aline .10414 .216535
+aline .104775 .21971
+bezier .108078 .228048 .958791E-01 .227643 .090805 .2286
+aline .074295 .2286
+aline .07239 .230505
+aline .07239 .234315
+aline .073025 .23622
+aline .07366 .23749
+aline .074295 .238125
+aline .075565 .23876
+aline .191135 .23876
+closepath
+! end of curve
+
+! start of curve
+amove .14224 .227965
+aline .139065 .22733
+aline .13716 .226695
+aline .135255 .22479
+aline .133985 .22225
+aline .132715 .21844
+aline .10922 .12446
+aline .108744 .123507
+aline .10922 .122555
+aline .15748 .122555
+bezier .182145 .124649 .21162 .136826 .220345 .163195
+bezier .227889 .181889 .232942 .209553 .211455 .22098
+bezier .202862 .225723 .192982 .227182 .18415 .2286
+aline .142875 .2286
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="S" !-------------- Beginning of new char.
+dfont wid=.613195 hei=.683332 dep=0 italic=.0576382
+dfont fby=":" kadd=-.0555553
+dfont fby=";" kadd=-.0555553
+dfont fby="=" kadd=-.0555553
+dfont fby=127 kadd=.0833359
+set path ! start of curve
+newpath
+! start of curve
+amove .15621 .24638
+bezier .172712 .245232 .190784 .236994 .19939 .221615
+bezier .206316 .229912 .212878 .238472 .220345 .24638
+aline .224155 .24638
+aline .22479 .245745
+aline .22606 .24511
+aline .22606 .2413
+aline .206375 .16256
+aline .20574 .16129
+aline .20447 .16002
+aline .200025 .16002
+aline .198755 .160655
+bezier .19884 .17921 .202325 .200664 .1905 .217805
+bezier .168697 .248798 .119113 .240505 .099695 .21082
+bezier .842202E-01 .192557 .819057E-01 .160706 .10541 .147955
+bezier .132165 .136761 .168501 .139485 .18542 .112395
+bezier .215518 .546359E-01 .151939 -.200194E-01 .090805 -.006985
+bezier .734077E-01 -.62647E-02 .571348E-01 .298021E-02 .460375E-01 .157163E-01
+bezier .382921E-01 .851108E-02 .326657E-01 -.123385E-02 .024765 -.008255
+aline .020955 -.008255
+aline .019685 -.006985
+aline .01905 -.005715
+aline .01905 -.004445
+aline .03937 .076835
+aline .04064 .07747
+aline .041275 .078105
+aline .04572 .078105
+aline .047625 .0762
+bezier .411824E-01 .538807E-01 .440097E-01 .245992E-01 .066675 .01143
+bezier .094454 -.440027E-02 .132473 -.956567E-03 .1524 .026035
+bezier .169871 .457102E-01 .177777 .807138E-01 .15367 .098425
+bezier .125251 .1124 .833884E-01 .107476 .067945 .140335
+bezier .471036E-01 .193561 .102344 .251616 .15621 .24638
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="T" !-------------- Beginning of new char.
+dfont wid=.584376 hei=.683332 dep=0 italic=.13889
+dfont fby=":" kadd=-.0555553
+dfont fby=";" kadd=-.0555553
+dfont fby="=" kadd=-.0277786
+dfont fby=127 kadd=.0833359
+set path ! start of curve
+newpath
+! start of curve
+amove .24511 .236855
+aline .247015 .23495
+bezier .2444 .209503 .239369 .185578 .23622 .16002
+aline .234315 .158115
+aline .22987 .158115
+aline .227965 .16002
+bezier .228863 .178012 .236214 .197416 .227965 .215265
+aline .22352 .21971
+aline .22225 .220345
+aline .221615 .22098
+aline .219075 .22225
+aline .21336 .224155
+aline .20701 .225425
+aline .206375 .22606
+aline .20066 .22606
+aline .200025 .226695
+aline .16129 .226695
+aline .160655 .22606
+aline .15748 .225425
+aline .155575 .22479
+aline .15367 .222885
+aline .153035 .221615
+aline .15113 .2159
+aline .11049 .05334
+aline .10287 .02286
+aline .102235 .019685
+aline .101838 .180975E-01
+aline .10287 .01397
+aline .10414 .0127
+aline .106045 .012065
+aline .10922 .01143
+aline .109855 .010795
+aline .113665 .010795
+aline .1143 .01016
+aline .12319 .01016
+aline .123825 .009525
+aline .14732 .009525
+aline .149225 .00762
+aline .149225 .00381
+aline .14859 .001905
+aline .147955 .000635
+aline .14732 0
+aline .14605 -.000635
+aline .13335 -.000635
+aline .132715 0
+aline .09271 0
+aline .092075 .000635
+aline .073025 .000635
+aline .07239 0
+aline .03175 0
+aline .031115 -.000635
+aline .02032 -.000635
+aline .01905 0
+aline .018415 .000635
+aline .01778 .001905
+aline .01778 .004445
+aline .018415 .006985
+aline .01905 .008255
+bezier .350041E-01 .117318E-01 .526641E-01 .698159E-02 .067945 .01397
+aline .070485 .01651
+aline .07112 .01778
+aline .071755 .018415
+aline .073025 .020955
+aline .113665 .183515
+aline .12192 .216535
+aline .122555 .21971
+aline .12319 .220345
+aline .12319 .22479
+aline .12192 .225425
+aline .118745 .22606
+aline .11811 .226695
+aline .079375 .226695
+bezier .626757E-01 .225312 .424607E-01 .218835 .03429 .20193
+bezier .260413E-01 .188177 .226046E-01 .171879 .01524 .158115
+aline .010795 .158115
+aline .00889 .16002
+bezier .158892E-01 .18569 .256051E-01 .211294 .034925 .23622
+aline .036195 .236855
+aline .24511 .236855
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="U" !-------------- Beginning of new char.
+dfont wid=.682777 hei=.683332 dep=0 italic=.109027
+dfont fby=":" kadd=-.111112
+dfont fby=";" kadd=-.111112
+dfont fby="=" kadd=-.0555553
+dfont fby=127 kadd=.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .042545 .23876
+aline .04318 .238125
+aline .07366 .238125
+aline .074295 .23749
+aline .088265 .23749
+aline .0889 .238125
+aline .11938 .238125
+aline .120015 .23876
+aline .12827 .23876
+aline .12954 .238125
+aline .130175 .23749
+aline .13081 .23622
+aline .13081 .23368
+aline .130175 .231775
+aline .128905 .229235
+bezier .116351 .226456 .0988 .232837 .09144 .21971
+aline .09017 .2159
+aline .05461 .07366
+bezier .477855E-01 .502178E-01 .492824E-01 .154617E-01 .076835 .00508
+bezier .113437 -.680117E-02 .152489 .205496E-01 .17018 .05207
+aline .174625 .06096
+aline .17526 .062865
+aline .17653 .065405
+aline .1778 .069215
+aline .178435 .070485
+aline .17907 .07239
+aline .179705 .07493
+aline .18034 .076835
+aline .212725 .206375
+bezier .218413 .21797 .206438 .229002 .194945 .227965
+aline .19431 .2286
+aline .18542 .2286
+aline .183515 .230505
+aline .183515 .234315
+aline .18415 .23622
+aline .184785 .23749
+aline .18542 .238125
+bezier .211438 .238547 .237957 .236951 .26416 .23876
+aline .26543 .238125
+aline .266065 .23749
+aline .2667 .23622
+aline .2667 .23368
+aline .266065 .231775
+aline .264795 .229235
+bezier .248943 .228733 .227599 .224712 .22352 .20574
+aline .191135 .0762
+bezier .177672 .259156E-01 .125619 -.019772 .071755 -.005715
+bezier .388138E-01 .209628E-02 .184696E-01 .038611 .0254 .06985
+aline .0254 .07366
+aline .026035 .076835
+aline .06096 .216535
+aline .061595 .21971
+bezier .064898 .228048 .526991E-01 .227643 .047625 .2286
+aline .031115 .2286
+aline .02921 .230505
+aline .02921 .234315
+aline .029845 .23622
+aline .03048 .23749
+aline .031115 .238125
+aline .032385 .23876
+aline .042545 .23876
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="V" !-------------- Beginning of new char.
+dfont wid=.583334 hei=.683332 dep=0 italic=.222223
+dfont fby=":" kadd=-.166667
+dfont fby=";" kadd=-.166667
+dfont fby="=" kadd=-.111112
+set path ! start of curve
+newpath
+! start of curve
+amove .03175 .23876
+aline .032385 .238125
+aline .05715 .238125
+aline .057785 .23749
+aline .070485 .23749
+aline .07112 .238125
+aline .102235 .238125
+aline .10287 .23876
+aline .111125 .23876
+aline .112395 .238125
+aline .113665 .235585
+aline .113665 .234315
+aline .11303 .231775
+aline .112395 .230505
+aline .11049 .2286
+bezier .998274E-01 .228468 .861931E-01 .229437 .08001 .219075
+bezier .874667E-01 .156179 .955264E-01 .935321E-01 .10414 .031115
+bezier .141386 .913603E-01 .180397 .150545 .216535 .211455
+bezier .222135 .222605 .207569 .229886 .19812 .2286
+aline .19685 .229235
+aline .19558 .231775
+aline .19558 .23241
+aline .196215 .23495
+aline .19685 .236855
+aline .198755 .23876
+bezier .222332 .237393 .246049 .238137 .26924 .238125
+aline .27051 .235585
+aline .27051 .234315
+aline .269875 .231775
+aline .26924 .230505
+aline .267335 .2286
+bezier .243545 .230353 .225966 .210613 .2159 .191135
+bezier .173993 .125245 .13326 .585099E-01 .090805 -.006985
+aline .088265 -.008255
+aline .08128 -.008255
+aline .07874 -.005715
+bezier .689139E-01 .705888E-01 .602232E-01 .146937 .048895 .222885
+bezier .042509 .231857 .296945E-01 .226168 .020955 .22987
+aline .02032 .23114
+aline .02032 .23368
+aline .020955 .235585
+aline .022225 .238125
+aline .023495 .23876
+aline .03175 .23876
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="W" !-------------- Beginning of new char.
+dfont wid=.944446 hei=.683332 dep=0 italic=.13889
+dfont fby=":" kadd=-.166667
+dfont fby=";" kadd=-.166667
+dfont fby="=" kadd=-.111112
+set path ! start of curve
+newpath
+! start of curve
+amove .031115 .23876
+aline .03175 .238125
+aline .055245 .238125
+aline .05588 .23749
+aline .067945 .23749
+aline .06858 .238125
+aline .099695 .238125
+aline .10033 .23876
+aline .108585 .23876
+aline .109855 .238125
+aline .11049 .23749
+aline .111125 .23622
+aline .111125 .234315
+aline .11049 .231775
+aline .10922 .229235
+bezier .985102E-01 .227663 .851327E-01 .229867 .07747 .220345
+bezier .771018E-01 .180743 .831514E-01 .141881 .084455 .102235
+bezier .871099E-01 .809556E-01 .869615E-01 .585151E-01 .09017 .037465
+bezier .119786 .0897 .149819 .141635 .179705 .193675
+aline .179705 .20193
+bezier .177067 .210306 .182199 .224766 .170815 .227965
+aline .16637 .227965
+aline .165735 .2286
+aline .153035 .2286
+aline .15113 .230505
+aline .15113 .23368
+aline .151765 .23622
+aline .1524 .23749
+aline .153035 .238125
+aline .154305 .23876
+aline .16256 .23876
+aline .163195 .238125
+aline .186055 .238125
+aline .18669 .23749
+aline .19939 .23749
+aline .200025 .238125
+aline .230505 .238125
+aline .23114 .23876
+aline .24003 .23876
+aline .241935 .236855
+aline .241935 .23368
+aline .2413 .23114
+aline .240665 .22987
+bezier .229982 .226779 .214618 .230589 .207645 .219075
+bezier .211383 .158245 .215715 .976621E-01 .22098 .037465
+bezier .253997 .095226 .287564 .152803 .32004 .21082
+bezier .323447 .223572 .307008 .229503 .296545 .2286
+aline .295275 .229235
+aline .29464 .22987
+aline .294005 .23114
+aline .294005 .233045
+aline .29464 .235585
+aline .295275 .236855
+aline .29718 .23876
+aline .30607 .23876
+aline .306705 .238125
+aline .33274 .238125
+aline .333375 .23749
+aline .343535 .23749
+aline .34417 .238125
+aline .36068 .238125
+aline .361315 .23876
+aline .366395 .23876
+aline .3683 .236855
+aline .3683 .23368
+aline .367665 .23114
+aline .36703 .22987
+bezier .354482 .227648 .339227 .224544 .33147 .21209
+bezier .286831 .140574 .247709 .650821E-01 .203835 -.006985
+aline .201295 -.008255
+aline .19685 -.008255
+aline .194945 -.00635
+bezier .189268 .554092E-01 .186751 .117495 .18034 .17907
+bezier .144226 .117298 .109621 .544389E-01 .073025 -.006985
+aline .070485 -.008255
+aline .06604 -.008255
+aline .06477 -.00762
+bezier .569555E-01 .639148E-01 .054274 .137086 .047625 .208915
+bezier .476152E-01 .216231 .048605 .226521 .03937 .227965
+aline .03556 .227965
+aline .034925 .2286
+aline .022225 .2286
+aline .02032 .230505
+aline .02032 .234315
+aline .020955 .236855
+aline .02286 .23876
+aline .031115 .23876
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="X" !-------------- Beginning of new char.
+dfont wid=.828474 hei=.683332 dep=0 italic=.0784712
+dfont fby=":" kadd=-.0555553
+dfont fby=";" kadd=-.0555553
+dfont fby="=" kadd=-.083334
+dfont fby=127 kadd=.0833359
+set path ! start of curve
+newpath
+! start of curve
+amove .08382 .23876
+aline .084455 .238125
+aline .109855 .238125
+aline .11049 .23749
+aline .12319 .23749
+aline .123825 .238125
+aline .15494 .238125
+aline .155575 .23876
+aline .164465 .23876
+aline .16637 .236855
+aline .16637 .23241
+aline .165735 .230505
+bezier .158058 .226463 .145735 .228402 .1397 .21971
+bezier .138051 .214218 .1443 .20791 .145415 .20193
+bezier .154123 .182704 .161522 .162524 .170498 .143669
+bezier .191413 .165011 .21183 .187287 .231775 .20955
+bezier .239814 .218711 .229061 .230347 .21844 .2286
+aline .21717 .229235
+aline .216535 .22987
+aline .2159 .23114
+aline .2159 .23368
+aline .216535 .235585
+aline .217805 .238125
+bezier .24389 .238867 .270423 .236697 .296545 .23876
+aline .297815 .238125
+aline .29845 .23749
+aline .299085 .23622
+aline .299085 .23368
+aline .29845 .23114
+aline .297815 .22987
+bezier .280806 .227578 .261028 .223935 .24765 .21082
+bezier .221606 .186699 .198654 .159033 .17399 .13335
+bezier .192723 .940636E-01 .206465 .516443E-01 .226695 .013335
+aline .229235 .012065
+aline .23114 .01143
+aline .234315 .010795
+aline .23495 .01016
+aline .24003 .01016
+aline .240665 .009525
+aline .254 .009525
+aline .25527 .00889
+aline .255905 .008255
+aline .25654 .006985
+aline .25654 .00508
+aline .255905 .00254
+aline .254635 0
+aline .253365 -.000635
+aline .244475 -.000635
+aline .24384 0
+aline .219075 0
+aline .21844 .000635
+aline .205105 .000635
+aline .20447 0
+aline .173355 0
+aline .17272 -.000635
+aline .16383 -.000635
+aline .161925 .00127
+aline .161925 .00508
+aline .16256 .006985
+aline .163195 .008255
+bezier .171766 .110509E-01 .184408 .010375 .189706 .200025E-01
+bezier .176959 .496766E-01 .164885 .798198E-01 .151765 .10922
+bezier .126435 .812298E-01 .987526E-01 .549346E-01 .075565 .0254
+bezier .701845E-01 .159382E-01 .082173 .825107E-02 .090805 .009525
+aline .09271 .00762
+aline .09271 .00381
+aline .092075 .00127
+aline .09017 -.000635
+aline .080645 -.000635
+aline .08001 0
+aline .052705 0
+aline .05207 .000635
+aline .04064 .000635
+aline .040005 0
+aline .018415 0
+aline .01778 -.000635
+aline .012065 -.000635
+aline .01016 .00127
+aline .01016 .005715
+aline .010795 .00762
+aline .0127 .009525
+bezier .042525 .788854E-02 .671909E-01 .293704E-01 .08509 .051435
+bezier .106188 .739114E-01 .127763 .961875E-01 .147743 .11938
+bezier .133205 .153668 .119121 .188145 .10414 .22225
+aline .1016 .22479
+aline .09906 .22606
+aline .097155 .226695
+aline .09398 .22733
+aline .093345 .227965
+aline .0889 .227965
+aline .088265 .2286
+aline .074295 .2286
+aline .073025 .229235
+aline .071755 .231775
+aline .071755 .23241
+aline .07239 .23495
+aline .073025 .236855
+aline .07493 .23876
+aline .08382 .23876
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="Y" !-------------- Beginning of new char.
+dfont wid=.580557 hei=.683332 dep=0 italic=.222223
+dfont fby=":" kadd=-.166667
+dfont fby=";" kadd=-.166667
+dfont fby="=" kadd=-.111112
+set path ! start of curve
+newpath
+! start of curve
+amove .024765 .23876
+aline .0254 .238125
+aline .0508 .238125
+aline .051435 .23749
+aline .064135 .23749
+aline .06477 .238125
+aline .09652 .238125
+aline .097155 .23876
+aline .106045 .23876
+aline .10795 .236855
+aline .10795 .23368
+aline .107315 .23114
+aline .10668 .22987
+bezier .976903E-01 .226824 .860164E-01 .230598 .07874 .22225
+bezier .899722E-01 .184455 .106408 .147001 .11938 .10922
+bezier .149095 .143087 .17926 .17663 .207645 .211455
+aline .20955 .215265
+bezier .215225 .224583 .202525 .22983 .194945 .2286
+aline .19304 .230505
+aline .19304 .23368
+aline .193675 .23622
+aline .19431 .23749
+aline .194945 .238125
+bezier .218248 .238825 .242101 .236675 .26543 .23876
+aline .2667 .238125
+aline .267335 .23749
+aline .26797 .23622
+aline .26797 .234315
+aline .267335 .231775
+aline .2667 .230505
+aline .264795 .2286
+bezier .229545 .229525 .208096 .196407 .187325 .17272
+bezier .164647 .14631 .140441 .120786 .11938 .093345
+aline .102235 .024765
+aline .100965 .018415
+bezier .097662 .100774E-01 .109861 .104819E-01 .114935 .009525
+aline .131445 .009525
+aline .13335 .00762
+aline .13335 .004445
+aline .132715 .001905
+aline .13208 .000635
+aline .131445 0
+aline .130175 -.000635
+aline .120015 -.000635
+aline .11938 0
+aline .089535 0
+aline .0889 .000635
+aline .07493 .000635
+aline .074295 0
+aline .043815 0
+aline .04318 -.000635
+aline .034925 -.000635
+aline .03302 .00127
+aline .03302 .005715
+aline .033655 .00762
+aline .03556 .009525
+aline .052705 .009525
+bezier .612384E-01 .994213E-02 .730084E-01 .121119E-01 .07366 .023495
+aline .074295 .0254
+aline .09144 .09398
+bezier .772181E-01 .136545 .060103 .17962 .04445 .22225
+bezier .365265E-01 .231585 .232847E-01 .226364 .013335 .22987
+aline .0127 .23114
+aline .0127 .23368
+aline .013335 .23622
+aline .01397 .23749
+aline .014605 .238125
+aline .015875 .23876
+aline .024765 .23876
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="Z" !-------------- Beginning of new char.
+dfont wid=.68264 hei=.683332 dep=0 italic=.0715275
+dfont fby=":" kadd=-.0555553
+dfont fby=";" kadd=-.0555553
+dfont fby="=" kadd=-.0555553
+dfont fby=127 kadd=.0833359
+set path ! start of curve
+newpath
+! start of curve
+amove .252095 .23876
+aline .253365 .23749
+aline .253365 .234315
+bezier .244146 .218605 .228963 .206394 .217805 .19177
+bezier .163967 .131863 .110541 .716588E-01 .05715 .01143
+aline .057785 .010795
+aline .126365 .010795
+bezier .151907 .116855E-01 .181117 .227574E-01 .193675 .047625
+bezier .202367 .615757E-01 .204981 .079014 .212725 .09271
+aline .216535 .09271
+aline .217805 .092075
+aline .219075 .089535
+bezier .20976 .596954E-01 .200825 .295127E-01 .1905 0
+aline .18923 -.000635
+aline .02286 -.000635
+aline .02159 0
+bezier .199241E-01 .117791E-01 .340496E-01 .180539E-01 .03937 .027305
+bezier .986083E-01 .942722E-01 .160563 .161719 .217805 .2286
+aline .151765 .2286
+bezier .125832 .227969 .971055E-01 .215127 .08509 .189865
+bezier .798649E-01 .180642 .772464E-01 .170142 .073025 .160655
+aline .071755 .16002
+aline .067945 .16002
+aline .06604 .161925
+bezier .719027E-01 .187535 .801861E-01 .213359 .0889 .238125
+aline .09017 .23876
+aline .252095 .23876
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="[" !-------------- Beginning of new char.
+dfont wid=.38889 hei=.75 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .02667 .262255
+aline .028575 .26035
+aline .028575 .14605
+bezier .493822E-01 .164427 .091243 .167339 .10795 .1397
+bezier .12805 .107047 .108883 .659384E-01 .085725 .040005
+bezier .681325E-01 .210151E-01 .475924E-01 .611485E-02 .02667 -.008255
+aline .022225 -.008255
+aline .02032 -.00635
+aline .02032 .259715
+aline .020955 .260985
+aline .02159 .26162
+aline .02286 .262255
+aline .02667 .262255
+closepath
+! end of curve
+
+! start of curve
+amove .06223 .14732
+bezier .491327E-01 .146963 .317276E-01 .141144 .028575 .126365
+aline .028575 .005715
+bezier .422287E-01 .146225E-01 .542382E-01 .308894E-01 .06477 .04445
+bezier .830039E-01 .721292E-01 .097939 .109366 .080645 .140335
+aline .0762 .14478
+aline .07239 .146685
+aline .069215 .14732
+aline .06858 .147955
+aline .062865 .147955
+aline .06223 .14732
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="\" !-------------- Beginning of new char.
+dfont wid=.38889 hei=.694445 dep=.194445 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .03429 .254635
+aline .03556 .254
+aline .036195 .253365
+aline .03683 .252095
+aline .03683 .153035
+bezier .598418E-01 .159556 .826223E-01 .172335 .106045 .178435
+aline .10795 .17653
+aline .10795 -.07493
+aline .106045 -.076835
+aline .10414 -.07747
+aline .102235 -.07747
+aline .100965 -.076835
+aline .10033 -.0762
+aline .099695 -.07493
+aline .099695 -.00381
+bezier .766836E-01 -.103307E-01 .539026E-01 -.231098E-01 .03048 -.02921
+aline .028575 -.027305
+aline .028575 .252095
+aline .03048 .254
+aline .032385 .254635
+closepath
+! end of curve
+
+! start of curve
+amove .09779 .14732
+bezier .774515E-01 .139321 .570685E-01 .13143 .03683 .12319
+aline .03683 .001905
+bezier .576475E-01 .838181E-02 .788379E-01 .180679E-01 .099695 .026035
+aline .099695 .14732
+aline .987425E-01 .147796
+aline .09779 .14732
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="]" !-------------- Beginning of new char.
+dfont wid=.38889 hei=.694445 dep=.194445 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .098425 .250825
+aline .099695 .25019
+aline .100965 .249555
+aline .1016 .248285
+aline .1016 .175895
+aline .102553 .175419
+aline .103505 .175895
+aline .111125 .178435
+aline .1143 .178435
+aline .116205 .17653
+aline .116205 .1524
+aline .1143 .150495
+aline .11176 .14986
+aline .102235 .146685
+aline .1016 .14605
+aline .1016 .024765
+aline .102553 .242887E-01
+aline .103505 .024765
+aline .111125 .027305
+aline .1143 .027305
+aline .116205 .0254
+aline .116205 .00127
+aline .1143 -.000635
+aline .11176 -.00127
+aline .102235 -.004445
+aline .1016 -.00508
+aline .1016 -.05588
+aline .099695 -.057785
+aline .098425 -.05842
+aline .09525 -.05842
+aline .093345 -.056515
+aline .093345 -.00762
+aline .09271 -.006985
+aline .092075 -.00762
+aline .07874 -.012065
+aline .0762 -.0127
+aline .06096 -.01778
+aline .05842 -.018415
+aline .04318 -.023495
+aline .04318 -.07493
+aline .041275 -.076835
+aline .038735 -.07747
+aline .0381 -.07747
+aline .03556 -.0762
+aline .034925 -.07493
+aline .034925 -.02667
+aline .339725E-01 -.261938E-01
+aline .03302 -.02667
+aline .0254 -.02921
+aline .022225 -.02921
+aline .02032 -.027305
+aline .02032 -.00381
+aline .020955 -.00254
+aline .02159 -.001905
+aline .02286 -.00127
+aline .03429 .00254
+aline .034925 .003175
+aline .034925 .12446
+aline .339725E-01 .124936
+aline .03302 .12446
+aline .0254 .12192
+aline .022225 .12192
+aline .02032 .123825
+aline .02032 .14732
+aline .020955 .14859
+aline .02159 .149225
+aline .02286 .14986
+aline .03429 .15367
+aline .034925 .154305
+aline .034925 .229235
+aline .03683 .23114
+aline .0381 .231775
+aline .041275 .231775
+aline .04318 .22987
+aline .04318 .156845
+aline .043815 .15621
+aline .04445 .156845
+aline .057785 .16129
+aline .060325 .161925
+aline .075565 .167005
+aline .078105 .16764
+aline .093345 .17272
+aline .093345 .248285
+aline .09525 .25019
+aline .09779 .250825
+closepath
+! end of curve
+
+! start of curve
+amove .092075 .14351
+aline .09017 .142875
+aline .07874 .139065
+aline .0762 .13843
+aline .06096 .13335
+aline .05842 .132715
+aline .04318 .127635
+aline .04318 .005715
+aline .043815 .00508
+aline .04445 .005715
+aline .057785 .01016
+aline .060325 .010795
+aline .075565 .015875
+aline .078105 .01651
+aline .093345 .02159
+aline .093345 .14351
+aline .09271 .144145
+aline .092075 .14351
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="^" !-------------- Beginning of new char.
+dfont wid=1 hei=.35764 dep=-.14236 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .026035 .128905
+bezier .056644 .852968E-01 .112869 .064009 .163195 .061595
+bezier .215756 .596029E-01 .272653 .729918E-01 .31115 .112395
+bezier .315998 .117716 .319985 .124081 .32512 .128905
+bezier .333072 .130202 .331281 .120808 .327025 .117475
+bezier .278638 .543009E-01 .190158 .323152E-01 .11684 .05461
+bezier .780955E-01 .663424E-01 .432436E-01 .901039E-01 .02032 .12319
+aline .02032 .126365
+aline .020955 .127635
+aline .022225 .12827
+aline .02286 .128905
+aline .026035 .128905
+aline .02667 .12827
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="_" !-------------- Beginning of new char.
+dfont wid=1 hei=.35764 dep=-.14236 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .18669 .132715
+bezier .242457 .129847 .300097 .992956E-01 .330835 .0508
+bezier .332226 .422229E-01 .321556 .448157E-01 .32004 .0508
+bezier .277939 .110057 .195459 .127477 .12954 .112395
+bezier .876926E-01 .103962 .498196E-01 .797372E-01 .026035 .045085
+bezier .171895E-01 .044023 .206906E-01 .054185 .024765 .057785
+bezier .615497E-01 .108379 .125366 .136577 .18669 .132715
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="`" !-------------- Beginning of new char.
+dfont wid=.41667 hei=.694445 dep=0 italic=0
+dfont fby=127 kadd=.111115
+set path ! start of curve
+newpath
+! start of curve
+amove .12319 .24638
+bezier .142433 .242702 .140573 .219278 .13843 .205105
+bezier .128694 .149294 .090334 .106557 .052705 .06731
+bezier .523019E-01 .461613E-01 .486851E-01 .208974E-01 .06477 .004445
+bezier .835521E-01 -.292576E-02 .100922 .140925E-01 .1143 .0254
+aline .121285 .032385
+aline .123825 .033655
+aline .12446 .033655
+aline .12573 .03302
+aline .127635 .031115
+aline .12827 .029845
+aline .12827 .02794
+bezier .110526 .929634E-02 .834849E-01 -.143331E-01 .056515 -.000635
+bezier .401512E-01 .958467E-02 .364875E-01 .031589 .333375E-01 .481013E-01
+aline .032385 .047625
+aline .019685 .034925
+aline .018415 .03429
+aline .01016 .026035
+aline .008255 .0254
+aline .00635 .026035
+aline .004445 .02794
+aline .00381 .02921
+aline .00381 .031115
+aline .004445 .032385
+aline .00762 .03556
+aline .00889 .036195
+aline .022225 .04953
+aline .023495 .050165
+aline .03302 .05969
+bezier .332561E-01 .118428 .532472E-01 .180623 .0889 .2286
+aline .098425 .238125
+aline .099695 .23876
+aline .100965 .24003
+aline .102235 .240665
+aline .10287 .2413
+aline .10414 .241935
+aline .104775 .24257
+aline .108585 .244475
+aline .112395 .245745
+aline .11557 .24638
+closepath
+! end of curve
+
+! start of curve
+amove .116205 .23876
+bezier .972697E-01 .227758 .916363E-01 .203647 .08255 .184785
+bezier .710421E-01 .151891 .617249E-01 .116786 .05588 .083185
+bezier .935369E-01 .122669 .131919 .171552 .131445 .2286
+aline .13081 .229235
+aline .12954 .233045
+aline .128905 .234315
+aline .12827 .23495
+aline .127635 .23622
+aline .127 .236855
+aline .12319 .23876
+aline .122555 .239395
+aline .11684 .239395
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="a" !-------------- Beginning of new char.
+dfont wid=.52859 hei=.430555 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .10414 .15367
+bezier .116472 .152079 .126517 .143098 .131445 .13208
+bezier .132188 .143151 .147541 .152923 .155575 .14224
+aline .15621 .140335
+aline .15621 .13462
+aline .13081 .03302
+bezier .128179 .233029E-01 .126154 .008314 .13716 .00254
+bezier .155523 .208581E-02 .159788 .247136E-01 .164465 .038735
+aline .167005 .048895
+aline .16764 .0508
+aline .169545 .052705
+aline .173355 .052705
+aline .174625 .05207
+aline .175895 .0508
+bezier .171603 .303008E-01 .166956 .173118E-02 .14351 -.004445
+bezier .126937 -.676785E-02 .109573 .461572E-02 .107315 .02159
+bezier .915018E-01 .485324E-04 .591061E-01 -.143901E-01 .03556 .00381
+bezier .817805E-02 .260016E-01 .122284E-01 .658589E-01 .024765 .09525
+bezier .379327E-01 .12333 .628698E-01 .149373 .094615 .15367
+closepath
+! end of curve
+
+! start of curve
+amove .09525 .14605
+bezier .606945E-01 .135097 .514399E-01 .949528E-01 .043815 .0635
+bezier .393374E-01 .447927E-01 .352422E-01 .207227E-01 .051435 .005715
+bezier .718976E-01 -.447854E-02 .924745E-01 .015131 .10414 .03048
+aline .104775 .03175
+aline .106045 .03302
+aline .10668 .03429
+aline .107315 .034925
+aline .10795 .036195
+aline .127 .112395
+bezier .128393 .128511 .114425 .149325 .095885 .146685
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="b" !-------------- Beginning of new char.
+dfont wid=.429167 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .08255 .24257
+aline .08382 .241935
+aline .08509 .239395
+aline .08509 .23876
+aline .592931E-01 .135573
+aline .05969 .133985
+bezier .763165E-01 .153038 .108401 .162313 .12827 .142875
+bezier .149814 .123635 .148231 .918495E-01 .14097 .066675
+bezier .129331 .302028E-01 .972959E-01 -.591785E-02 .056515 -.004445
+bezier .034143 -.23247E-02 .190956E-01 .201561E-01 .01778 .041275
+aline .01778 .05969
+aline .018415 .060325
+aline .018415 .064135
+aline .01905 .06477
+aline .01905 .067945
+aline .02032 .074295
+aline .05588 .216535
+aline .056515 .21717
+aline .056515 .220345
+aline .056896 .22225
+aline .056515 .224155
+aline .05588 .22606
+aline .053975 .226695
+aline .051435 .22733
+aline .0508 .227965
+aline .046355 .227965
+aline .04572 .2286
+aline .03302 .2286
+aline .031115 .230505
+aline .031115 .234315
+aline .03175 .236855
+aline .033655 .23876
+bezier .480835E-01 .239945 .626615E-01 .240769 .076835 .24257
+closepath
+! end of curve
+
+! start of curve
+amove .094615 .14605
+bezier .762816E-01 .142259 .062061 .127383 .05334 .11176
+aline .04191 .06604
+bezier .369763E-01 .458478E-01 .331358E-01 .017975 .05334 .004445
+bezier .732797E-01 -.279241E-02 .907525E-01 .171938E-01 .099695 .03302
+bezier .112294 .602446E-01 .120696 .902938E-01 .121285 .11938
+bezier .12003 .132324 .111142 .149455 .09525 .146685
+closepath
+! end of curve
+
+! start of curve
+amove .059055 .13335
+aline .05969 .133985
+aline .059055 .13462
+aline .05842 .133985
+aline .059055 .13335
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="c" !-------------- Beginning of new char.
+dfont wid=.432756 hei=.430555 dep=0 italic=0
+dfont fby=127 kadd=.0555573
+set path ! start of curve
+newpath
+! start of curve
+amove .11557 .15367
+bezier .132509 .152951 .154049 .139042 .149225 .120015
+bezier .151278 .103865 .1235 .934128E-01 .11811 .11049
+bezier .11548 .123135 .127368 .133598 .139065 .132715
+bezier .124915 .152921 .943811E-01 .149305 .078105 .13335
+bezier .539588E-01 .113232 .469785E-01 .788716E-01 .041275 .050165
+bezier .390279E-01 .314204E-01 .449958E-01 .671817E-02 .066675 .003175
+bezier .965167E-01 .162843E-03 .127998 .167443E-01 .14605 .041275
+bezier .154427 .419712E-01 .15184 .319775E-01 .146685 .02921
+bezier .121663 .242724E-03 .755918E-01 -.151115E-01 .04064 .00381
+bezier .431093E-02 .283931E-01 .011683 .825869E-01 .036195 .11303
+bezier .544358E-01 .137511 .843386E-01 .156057 .11557 .15367
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="d" !-------------- Beginning of new char.
+dfont wid=.520488 hei=.694445 dep=0 italic=0
+dfont fby="Y" kadd=.0555553
+dfont fby="Z" kadd=-.0555553
+dfont fby="f" kadd=-.166667
+dfont fby="j" kadd=-.111112
+dfont fby=127 kadd=.166672
+set path ! start of curve
+newpath
+! start of curve
+amove .179705 .24257
+aline .180975 .241935
+aline .182245 .239395
+aline .182245 .23876
+aline .141605 .0762
+aline .13081 .03302
+bezier .128179 .233029E-01 .126154 .008314 .13716 .00254
+bezier .155523 .208581E-02 .159788 .247136E-01 .164465 .038735
+aline .167005 .048895
+aline .16764 .0508
+aline .169545 .052705
+aline .173355 .052705
+aline .174625 .05207
+aline .175895 .0508
+bezier .171603 .303008E-01 .166956 .173118E-02 .14351 -.004445
+bezier .126937 -.676785E-02 .109573 .461572E-02 .107315 .02159
+bezier .915018E-01 .485324E-04 .591061E-01 -.143901E-01 .03556 .00381
+bezier .817805E-02 .260016E-01 .122284E-01 .658589E-01 .024765 .09525
+bezier .039629 .126964 .720151E-01 .159558 .109855 .1524
+bezier .120103 .14992 .127337 .139031 .13208 .132715
+aline .153035 .216535
+aline .15367 .21717
+aline .15367 .220345
+aline .154051 .22225
+aline .15367 .224155
+aline .153035 .22606
+aline .15113 .226695
+aline .14859 .22733
+aline .147955 .227965
+aline .14351 .227965
+aline .142875 .2286
+aline .130175 .2286
+aline .12827 .230505
+aline .12827 .234315
+aline .128905 .236855
+aline .13081 .23876
+bezier .145239 .239945 .159816 .240769 .17399 .24257
+closepath
+! end of curve
+
+! start of curve
+amove .09525 .14605
+bezier .606945E-01 .135097 .514399E-01 .949528E-01 .043815 .0635
+bezier .393374E-01 .447927E-01 .352422E-01 .207227E-01 .051435 .005715
+bezier .718976E-01 -.447854E-02 .924745E-01 .015131 .10414 .03048
+aline .104775 .03175
+aline .106045 .03302
+aline .10668 .03429
+aline .107315 .034925
+aline .10795 .036195
+aline .127 .112395
+bezier .128393 .128511 .114425 .149325 .095885 .146685
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="e" !-------------- Beginning of new char.
+dfont wid=.465627 hei=.430555 dep=0 italic=0
+dfont fby=127 kadd=.0555573
+set path ! start of curve
+newpath
+! start of curve
+amove .114935 .15367
+bezier .132991 .153002 .151081 .135778 .145415 .11684
+bezier .138468 .872975E-01 .103248 .811693E-01 .078105 .08128
+aline .07747 .080645
+aline .04826 .080645
+bezier .041786 .566516E-01 .361041E-01 .284603E-01 .055245 .008255
+bezier .764519E-01 -.486015E-02 .102531 .723054E-02 .122555 .018415
+bezier .131669 .245073E-01 .138921 .330219E-01 .14605 .041275
+bezier .154427 .419712E-01 .15184 .319775E-01 .146685 .02921
+bezier .122557 .141704E-02 .786974E-01 -.145026E-01 .04445 .00254
+bezier .159267E-01 .201733E-01 .130495E-01 .582088E-01 .020955 .086995
+bezier .327277E-01 .126755 .734589E-01 .156127 .114935 .15367
+closepath
+! end of curve
+
+! start of curve
+amove .10414 .14605
+bezier .075629 .142314 .550818E-01 .114833 .0508 .08763
+bezier .770958E-01 .880791E-01 .105149 .859068E-01 .126365 .10414
+bezier .137399 .115746 .137786 .137464 .121285 .144145
+aline .117475 .145415
+aline .1143 .14605
+aline .113665 .146685
+aline .104775 .146685
+aline .10414 .14605
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="f" !-------------- Beginning of new char.
+dfont wid=.489586 hei=.694445 dep=.194445 italic=.10764
+dfont fby=":" kadd=-.0555553
+dfont fby=";" kadd=-.0555553
+dfont fby=127 kadd=.166672
+set path ! start of curve
+newpath
+! start of curve
+amove .168275 .24638
+bezier .183185 .245754 .19888 .232288 .193675 .2159
+bezier .191618 .201534 .166456 .195325 .16256 .211455
+bezier .161026 .222553 .170322 .231981 .180975 .233045
+bezier .171459 .241989 .155094 .241603 .14859 .229235
+bezier .139333 .203638 .13638 .175246 .131445 .14986
+aline .16764 .14986
+aline .16891 .149225
+aline .17018 .146685
+aline .17018 .14605
+aline .169545 .14351
+aline .16891 .141605
+aline .167005 .1397
+aline .12954 .1397
+bezier .115997 .081631 .111939 .208271E-01 .09017 -.03683
+bezier .814778E-01 -.056629 .620791E-01 -.794227E-01 .0381 -.071755
+bezier .021294 -.689229E-01 .124675E-01 -.472014E-01 .02413 -.03429
+bezier .319095E-01 -.243785E-01 .534439E-01 -.273921E-01 .0508 -.042545
+bezier .049887 -.522159E-01 .410564E-01 -.589256E-01 .03175 -.05969
+bezier .414302E-01 -.688977E-01 .588142E-01 -.682463E-01 .064135 -.05461
+bezier .713601E-01 -.430222E-01 .728407E-01 -.028924 .0762 -.015875
+aline .083185 .01905
+bezier .905338E-01 .591499E-01 .990957E-01 .998057E-01 .10541 .1397
+aline .075565 .1397
+aline .074295 .140335
+aline .073025 .142875
+aline .073025 .14351
+aline .07366 .14605
+aline .074295 .147955
+aline .0762 .14986
+aline .107315 .14986
+bezier .115967 .180008 .113498 .221121 .14351 .240665
+aline .14986 .24384
+aline .15367 .24511
+aline .15875 .24638
+aline .168275 .24638
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="g" !-------------- Beginning of new char.
+dfont wid=.476969 hei=.430555 dep=.194445 italic=.0358791
+dfont fby=127 kadd=.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .114935 .15367
+bezier .127122 .152092 .136404 .142807 .14224 .132715
+bezier .141912 .144855 .16124 .15318 .16637 .140335
+aline .16637 .13462
+aline .12573 -.02794
+bezier .112871 -.641734E-01 .687646E-01 -.786294E-01 .03429 -.071755
+bezier .214417E-01 -.721328E-01 .003043 -.643273E-01 .00635 -.04826
+bezier .627106E-02 -.318345E-01 .352808E-01 -.238743E-01 .0381 -.042545
+bezier .385496E-01 -.513381E-01 .323091E-01 -.059161 .02413 -.06223
+bezier .474548E-01 -.702678E-01 .780382E-01 -.067485 .09271 -.04445
+aline .09398 -.04318
+aline .094615 -.04191
+aline .09525 -.041275
+aline .09652 -.038735
+aline .097155 -.0381
+aline .10033 -.03175
+aline .100965 -.029845
+aline .1016 -.028575
+aline .10287 -.024765
+aline .113427 .174625E-01
+aline .11303 .01905
+bezier .09657 -.420238E-03 .648497E-01 -.86893E-02 .04445 .009525
+bezier .141625E-01 .386754E-01 .261028E-01 .890119E-01 .04953 .118745
+bezier .629103E-01 .13628 .826356E-01 .15076 .104775 .15367
+closepath
+! end of curve
+
+! start of curve
+amove .106045 .14605
+bezier .708643E-01 .135579 .619852E-01 .945347E-01 .05461 .062865
+bezier .501872E-01 .456548E-01 .472623E-01 .199492E-01 .065405 .008255
+bezier .087396 .11843E-02 .107464 .218607E-01 .118745 .038735
+aline .137795 .114935
+bezier .136939 .130794 .124475 .149109 .10668 .146685
+closepath
+! end of curve
+
+! start of curve
+amove .11303 .01905
+aline .113665 .018415
+aline .1143 .01905
+aline .113665 .019685
+aline .11303 .01905
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="h" !-------------- Beginning of new char.
+dfont wid=.576159 hei=.694445 dep=0 italic=0
+dfont fby=127 kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .09906 .24257
+aline .10033 .241935
+aline .1016 .239395
+aline .1016 .23876
+aline .074295 .12954
+aline .738188E-01 .128587
+aline .074295 .127635
+bezier .930222E-01 .153537 .137208 .165617 .16002 .139065
+bezier .174773 .109155 .156342 .766042E-01 .14732 .04699
+bezier .143362 .330414E-01 .132767 .173993E-01 .141393 .423333E-02
+bezier .154604 -.171424E-02 .167447 .119807E-01 .173355 .02286
+aline .177165 .03048
+aline .1778 .032385
+aline .178435 .033655
+aline .17907 .03556
+aline .179705 .03683
+aline .18288 .046355
+aline .183515 .048895
+aline .18415 .0508
+aline .186055 .052705
+aline .189865 .052705
+aline .191135 .05207
+bezier .19434 .450548E-01 .187924 .364458E-01 .186055 .02921
+bezier .178169 .930325E-02 .157952 -.011547 .13462 -.00254
+bezier .114709 .523103E-02 .114391 .300152E-01 .12319 .046355
+bezier .131898 .746254E-01 .147405 .103942 .14224 .13335
+bezier .13805 .150136 .11832 .148246 .106045 .142875
+bezier .876863E-01 .135441 .757086E-01 .118787 .06731 .1016
+aline .04318 .00508
+bezier .405413E-01 -.469536E-02 .243781E-01 -.903696E-02 .02032 .001905
+aline .02032 .008255
+aline .06096 .170815
+aline .07239 .216535
+aline .073025 .21717
+aline .073025 .220345
+aline .073406 .22225
+aline .073025 .224155
+aline .07239 .22606
+aline .070485 .226695
+aline .067945 .22733
+aline .06731 .227965
+aline .062865 .227965
+aline .06223 .2286
+aline .04953 .2286
+aline .047625 .230505
+aline .047625 .234315
+aline .04826 .236855
+aline .050165 .23876
+bezier .645935E-01 .239945 .791715E-01 .240769 .093345 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="i" !-------------- Beginning of new char.
+dfont wid=.344513 hei=.659525 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .09017 .23114
+bezier .106236 .227372 .100236 .203846 .08636 .201295
+aline .08382 .20066
+bezier .697906E-01 .197514 .635825E-01 .216125 .073025 .22479
+aline .07366 .225425
+aline .07493 .22606
+aline .076835 .227965
+aline .078105 .2286
+aline .07874 .229235
+aline .08001 .22987
+aline .081915 .230505
+aline .084455 .23114
+closepath
+! end of curve
+
+! start of curve
+amove .06096 .15367
+bezier .814682E-01 .151967 .906419E-01 .127755 .08255 .11049
+bezier .718318E-01 .789055E-01 .564693E-01 .478091E-01 .048895 .015875
+bezier .479398E-01 .891761E-02 .535706E-01 -.67995E-03 .061595 .003175
+bezier .08419 .866863E-02 .885057E-01 .350165E-01 .097155 .052705
+aline .100965 .052705
+aline .102235 .05207
+bezier .10544 .450548E-01 .990236E-01 .364458E-01 .097155 .02921
+bezier .892695E-01 .930325E-02 .690517E-01 -.011547 .04572 -.00254
+bezier .248711E-01 .568698E-02 .259628E-01 .314247E-01 .034925 .04826
+bezier .447123E-01 .755046E-01 .570393E-01 .10281 .06477 .130175
+aline .06477 .139065
+bezier .620633E-01 .150388 .488735E-01 .14689 .04191 .141605
+bezier .285146E-01 .130325 .235381E-01 .11289 .01778 .097155
+aline .01651 .09652
+aline .0127 .09652
+aline .012065 .097155
+aline .010795 .09779
+bezier .138195E-01 .121109 .274305E-01 .147868 .05207 .15367
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="j" !-------------- Beginning of new char.
+dfont wid=.411807 hei=.659525 dep=.194445 italic=.0572433
+dfont fby=":" kadd=-.0555553
+dfont fby=";" kadd=-.0555553
+set path ! start of curve
+newpath
+! start of curve
+amove .128905 .23114
+bezier .144671 .228264 .14015 .206085 .127635 .20193
+bezier .117718 .196843 .10469 .204963 .10795 .216535
+aline .108585 .219075
+aline .109855 .221615
+aline .11049 .22225
+aline .111125 .22352
+aline .1143 .226695
+aline .11557 .22733
+aline .11684 .2286
+aline .11938 .22987
+aline .121285 .230505
+aline .123825 .23114
+closepath
+! end of curve
+
+! start of curve
+amove .098425 .15367
+bezier .117588 .152199 .129482 .132255 .12573 .114935
+aline .125095 .11176
+aline .09144 -.02286
+bezier .817098E-01 -.576386E-01 .382499E-01 -.853595E-01 .004445 -.06731
+bezier -.124115E-01 -.575115E-01 -.187771E-02 -.278945E-01 .01778 -.03175
+bezier .354515E-01 -.354967E-01 .271351E-01 -.611834E-01 .012065 -.06223
+bezier .335326E-01 -.748264E-01 .563426E-01 -.534743E-01 .0635 -.033655
+aline .06477 -.031115
+aline .065405 -.02921
+aline .06604 -.02794
+aline .067945 -.022225
+aline .10287 .117475
+bezier .10488 .12689 .107316 .141668 .095885 .146685
+bezier .688218E-01 .146761 .055449 .118461 .04572 .097155
+aline .04445 .09652
+aline .04064 .09652
+aline .040005 .097155
+aline .038735 .09779
+bezier .429926E-01 .120047 .589436E-01 .140894 .079375 .15113
+aline .083185 .1524
+aline .085725 .153035
+aline .0889 .15367
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="k" !-------------- Beginning of new char.
+dfont wid=.520604 hei=.694445 dep=0 italic=.0314808
+set path ! start of curve
+newpath
+! start of curve
+amove .09906 .24257
+aline .10033 .241935
+aline .1016 .239395
+aline .1016 .23876
+aline .650081E-01 .923925E-01
+aline .653143E-01 .911679E-01
+bezier .977558E-01 .105079 .113008 .147686 .14986 .15367
+bezier .165224 .156702 .182097 .144152 .178435 .127635
+bezier .178514 .11121 .149504 .103249 .146685 .12192
+bezier .146089 .13241 .155062 .141599 .165735 .14224
+bezier .15149 .153593 .132975 .140584 .121285 .13081
+bezier .105724 .115995 .924005E-01 .984598E-01 .074295 .086995
+bezier .929037E-01 .834595E-01 .120233 .786545E-01 .125095 .05588
+bezier .128015 .039189 .113644 .196359E-01 .126365 .004445
+bezier .142278 -.311202E-02 .153792 .167002E-01 .158115 .029845
+aline .16129 .03937
+aline .161925 .04191
+aline .16256 .043815
+aline .16383 .048895
+aline .164465 .0508
+aline .16637 .052705
+aline .17018 .052705
+aline .17145 .05207
+aline .17272 .0508
+bezier .168542 .293148E-01 .160372 .17054E-02 .136525 -.004445
+bezier .115143 -.829781E-02 .961425E-01 .130553E-01 .10033 .03302
+bezier .100709 .436397E-01 .105723 .552108E-01 .097155 .064135
+bezier .891348E-01 .746117E-01 .742485E-01 .784573E-01 .061976 .079502
+aline .061595 .07874
+aline .04318 .00508
+bezier .405413E-01 -.469536E-02 .243781E-01 -.903696E-02 .02032 .001905
+aline .02032 .008255
+aline .06096 .170815
+aline .07239 .216535
+aline .073025 .21717
+aline .073025 .220345
+aline .073406 .22225
+aline .073025 .224155
+aline .07239 .22606
+aline .070485 .226695
+aline .067945 .22733
+aline .06731 .227965
+aline .062865 .227965
+aline .06223 .2286
+aline .04953 .2286
+aline .047625 .230505
+aline .047625 .234315
+aline .04826 .236855
+aline .050165 .23876
+bezier .645935E-01 .239945 .791715E-01 .240769 .093345 .24257
+closepath
+! end of curve
+
+! start of curve
+amove .06477 .09017
+aline .065405 .090805
+aline .06477 .09144
+aline .064135 .090805
+aline .06477 .09017
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="l" !-------------- Beginning of new char.
+dfont wid=.29838 hei=.694445 dep=0 italic=.0196781
+dfont fby=127 kadd=.0833359
+set path ! start of curve
+newpath
+! start of curve
+amove .089535 .24257
+aline .090805 .241935
+aline .092075 .239395
+aline .092075 .23876
+aline .051435 .0762
+aline .04064 .03302
+bezier .380089E-01 .233029E-01 .359844E-01 .008314 .04699 .00254
+bezier .642378E-01 .203171E-02 .685647E-01 .230158E-01 .073025 .036195
+aline .0762 .048895
+aline .076835 .0508
+aline .07874 .052705
+aline .08255 .052705
+aline .08382 .05207
+aline .08509 .0508
+bezier .807925E-01 .304179E-01 .766091E-01 .215036E-02 .05334 -.004445
+bezier .322039E-01 -.81467E-02 .121405E-01 .127082E-01 .01778 .03302
+aline .01778 .036195
+aline .05842 .198755
+aline .062865 .216535
+aline .0635 .21717
+aline .0635 .220345
+aline .063881 .22225
+aline .0635 .224155
+aline .062865 .22606
+aline .06096 .226695
+aline .05842 .22733
+aline .057785 .227965
+aline .05334 .227965
+aline .052705 .2286
+aline .040005 .2286
+aline .0381 .230505
+aline .0381 .234315
+aline .038735 .236855
+aline .04064 .23876
+bezier .550685E-01 .239945 .696465E-01 .240769 .08382 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="m" !-------------- Beginning of new char.
+dfont wid=.878014 hei=.430555 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .051435 .15367
+bezier .669825E-01 .152217 .793113E-01 .138357 .079375 .12319
+bezier .965751E-01 .149299 .1343 .163923 .161925 .14605
+aline .168275 .1397
+aline .16891 .13843
+aline .169545 .137795
+aline .172085 .132715
+aline .17272 .13081
+aline .173355 .12827
+aline .17399 .125095
+aline .17399 .121285
+bezier .180451 .125441 .185559 .135983 .193675 .140335
+bezier .213451 .157022 .248509 .160485 .266065 .139065
+bezier .280818 .109155 .262387 .766042E-01 .253365 .04699
+bezier .249407 .330414E-01 .238812 .173993E-01 .247438 .423335E-02
+bezier .260649 -.171426E-02 .273492 .119807E-01 .2794 .02286
+aline .28321 .03048
+aline .283845 .032385
+aline .28448 .033655
+aline .285115 .03556
+aline .28575 .03683
+aline .288925 .046355
+aline .28956 .048895
+aline .290195 .0508
+aline .2921 .052705
+aline .29591 .052705
+aline .29718 .05207
+bezier .300385 .450548E-01 .293969 .364458E-01 .2921 .02921
+bezier .284214 .930326E-02 .263997 -.115469E-01 .240665 -.00254
+bezier .220754 .523103E-02 .220436 .300152E-01 .229235 .046355
+bezier .237943 .746254E-01 .25345 .103942 .248285 .13335
+bezier .244095 .150136 .224365 .148246 .21209 .142875
+bezier .193236 .134968 .179911 .117469 .17272 .09906
+aline .149225 .00508
+bezier .146838 -.465312E-02 .130855 -.872363E-02 .126365 .00127
+aline .126365 .008255
+aline .14986 .102235
+bezier .152925 .116075 .156585 .135619 .14224 .14478
+bezier .115813 .152559 .898256E-01 .130311 .07874 .107315
+aline .078105 .10668
+aline .075565 .1016
+aline .051435 .00508
+bezier .490482E-01 -.465312E-02 .330649E-01 -.872363E-02 .028575 .00127
+aline .028575 .008255
+aline .05588 .117475
+bezier .578901E-01 .12689 .603257E-01 .141668 .048895 .146685
+bezier .302423E-01 .146642 .262901E-01 .12357 .02159 .10922
+aline .01905 .09906
+aline .018415 .09779
+aline .01778 .097155
+aline .01651 .09652
+aline .0127 .09652
+aline .012065 .097155
+aline .010795 .09779
+bezier .139408E-01 .118027 .190329E-01 .144216 .040005 .153035
+aline .04318 .15367
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="n" !-------------- Beginning of new char.
+dfont wid=.600235 hei=.430555 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .051435 .15367
+bezier .066738 .152215 .789739E-01 .138745 .079375 .123825
+bezier .097342 .150876 .139489 .165803 .165735 .14224
+bezier .184364 .115634 .166716 .832686E-01 .15875 .055245
+bezier .154228 .391192E-01 .141644 .021658 .14859 .005715
+bezier .157424 -.251203E-02 .172045 .761274E-02 .177165 .01651
+bezier .186221 .266518E-01 .187879 .414171E-01 .19431 .052705
+aline .19812 .052705
+aline .19939 .05207
+bezier .202595 .450548E-01 .196179 .364458E-01 .19431 .02921
+bezier .186424 .930325E-02 .166207 -.011547 .142875 -.00254
+bezier .122964 .523099E-02 .122646 .300152E-01 .131445 .046355
+bezier .140153 .746254E-01 .15566 .103942 .150495 .13335
+bezier .146305 .150136 .126575 .148246 .1143 .142875
+bezier .959413E-01 .135441 .839636E-01 .118787 .075565 .1016
+aline .051435 .00508
+bezier .490482E-01 -.465312E-02 .330649E-01 -.872363E-02 .028575 .00127
+aline .028575 .008255
+aline .05588 .117475
+bezier .578901E-01 .12689 .603257E-01 .141668 .048895 .146685
+bezier .302423E-01 .146642 .262901E-01 .12357 .02159 .10922
+aline .01905 .09906
+aline .018415 .09779
+aline .01778 .097155
+aline .01651 .09652
+aline .0127 .09652
+aline .012065 .097155
+aline .010795 .09779
+bezier .139408E-01 .118027 .190329E-01 .144216 .040005 .153035
+aline .04318 .15367
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="o" !-------------- Beginning of new char.
+dfont wid=.484723 hei=.430555 dep=0 italic=0
+dfont fby=127 kadd=.0555573
+set path ! start of curve
+newpath
+! start of curve
+amove .11557 .15367
+bezier .142603 .151901 .164612 .127083 .1651 .10033
+bezier .168604 .439846E-01 .113143 -.150243E-01 .055245 -.00254
+bezier .264343E-01 .450799E-02 .111434E-01 .367775E-01 .01651 .064135
+bezier .213087E-01 .112357 .662112E-01 .156183 .11557 .15367
+closepath
+! end of curve
+
+! start of curve
+amove .10414 .14605
+bezier .650682E-01 .138266 .496742E-01 .950158E-01 .04318 .05969
+bezier .377595E-01 .398352E-01 .410796E-01 .774965E-02 .066675 .003175
+bezier .955729E-01 .653679E-04 .118462 .278861E-01 .127635 .05334
+bezier .135405 .080542 .148578 .11115 .13081 .136525
+aline .126365 .14097
+aline .125095 .141605
+aline .12446 .14224
+aline .12065 .144145
+aline .11684 .145415
+aline .113665 .14605
+aline .11303 .146685
+aline .104775 .146685
+aline .10414 .14605
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="p" !-------------- Beginning of new char.
+dfont wid=.503126 hei=.430555 dep=.194445 italic=0
+dfont fby=127 kadd=.0833359
+set path ! start of curve
+newpath
+! start of curve
+amove .05207 .15367
+bezier .657138E-01 .152218 .07712 .141579 .796925E-01 .128429
+bezier .959393E-01 .147768 .124781 .162963 .14859 .14732
+bezier .174584 .130256 .175223 .955734E-01 .16764 .069215
+bezier .156834 .315985E-01 .124163 -.568792E-02 .08255 -.004445
+bezier .701408E-01 -.269611E-02 .601916E-01 .666512E-02 .055245 .01778
+aline .038735 -.04826
+aline .0381 -.048895
+aline .0381 -.05207
+aline .377031E-01 -.536575E-01
+bezier .421769E-01 -.629046E-01 .556884E-01 -.563667E-01 .0635 -.060325
+aline .064135 -.061595
+aline .064135 -.0635
+aline .0635 -.06604
+aline .06223 -.06858
+bezier .387069E-01 -.692131E-01 .147128E-01 -.672489E-01 -.00889 -.069215
+aline -.010795 -.06731
+aline -.010795 -.064135
+aline -.01016 -.061595
+bezier -.450531E-02 -.555165E-01 .71646E-02 -.625134E-01 .0127 -.05461
+aline .01397 -.05207
+aline .014605 -.050165
+aline .055245 .112395
+bezier .057921 .123214 .617702E-01 .136984 .05207 .145415
+bezier .361856E-01 .151042 .286178E-01 .130333 .024765 .11811
+aline .02413 .11557
+aline .023495 .113665
+aline .02286 .111125
+aline .022225 .10922
+aline .019685 .09906
+aline .01905 .09779
+aline .018415 .097155
+aline .017145 .09652
+aline .013335 .09652
+aline .0127 .097155
+aline .01143 .09779
+bezier .145758E-01 .118027 .196679E-01 .144216 .04064 .153035
+aline .043815 .15367
+closepath
+! end of curve
+
+! start of curve
+amove .12065 .14605
+bezier .102101 .142348 .087559 .127554 .07874 .11176
+aline .592931E-01 .339725E-01
+bezier .609958E-01 .159915E-01 .774309E-01 -.404573E-02 .09652 .004445
+bezier .132558 .217817E-01 .13841 .067445 .146685 .1016
+bezier .148797 .11772 .146891 .140912 .12827 .146685
+aline .121285 .146685
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="q" !-------------- Beginning of new char.
+dfont wid=.446414 hei=.430555 dep=.194445 italic=.0358791
+dfont fby=127 kadd=.0833359
+set path ! start of curve
+newpath
+! start of curve
+amove .10414 .15367
+bezier .117296 .151803 .127285 .141468 .13208 .12954
+bezier .138451 .138684 .146099 .150232 .156845 .15367
+aline .158115 .153035
+aline .159385 .150495
+aline .159385 .14986
+aline .118745 -.0127
+aline .109855 -.04826
+aline .10922 -.048895
+aline .10922 -.05207
+aline .108823 -.536575E-01
+bezier .113297 -.629046E-01 .126808 -.563667E-01 .13462 -.060325
+aline .135255 -.061595
+aline .135255 -.0635
+aline .13462 -.06604
+aline .13335 -.06858
+bezier .10754 -.689949E-01 .812496E-01 -.674387E-01 .055245 -.069215
+aline .053975 -.06858
+aline .052705 -.06604
+aline .052705 -.065405
+aline .05334 -.062865
+aline .053975 -.06096
+aline .05588 -.059055
+bezier .667359E-01 -.585449E-01 .083442 -.616993E-01 .08636 -.047625
+aline .1016 .013335
+aline .102023 .014605
+aline .1016 .015875
+bezier .851352E-01 -.392692E-02 .535857E-01 -.127252E-01 .03302 .005715
+bezier .481359E-02 .330051E-01 .138229E-01 .778405E-01 .03175 .108585
+bezier .459017E-01 .130182 .067452 .150275 .09398 .15367
+closepath
+! end of curve
+
+! start of curve
+amove .09525 .14605
+bezier .605021E-01 .135411 .515683E-01 .949138E-01 .043815 .0635
+bezier .392383E-01 .446968E-01 .351695E-01 .204078E-01 .051435 .005715
+bezier .711262E-01 -.420506E-02 .918499E-01 .145804E-01 .10287 .029845
+aline .10414 .031115
+aline .104775 .032385
+aline .10541 .03302
+aline .106045 .03429
+aline .10668 .034925
+aline .107315 .036195
+aline .126365 .112395
+bezier .127717 .128382 .114295 .149189 .095885 .146685
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="r" !-------------- Beginning of new char.
+dfont wid=.451159 hei=.430555 dep=0 italic=.0277786
+dfont fby=":" kadd=-.0555553
+dfont fby=";" kadd=-.0555553
+dfont fby=127 kadd=.0555573
+set path ! start of curve
+newpath
+! start of curve
+amove .051435 .15367
+bezier .655218E-01 .152255 .766286E-01 .141035 .079375 .127635
+bezier .929258E-01 .148169 .122 .162482 .14478 .147955
+bezier .161417 .137421 .151692 .107446 .131445 .111125
+bezier .113774 .114872 .12209 .140558 .13716 .141605
+aline .139065 .14224
+bezier .11536 .156344 .903357E-01 .133864 .08001 .11303
+aline .076835 .10668
+aline .051435 .00508
+bezier .490482E-01 -.465312E-02 .330649E-01 -.872363E-02 .028575 .00127
+aline .028575 .008255
+aline .05588 .117475
+bezier .578901E-01 .12689 .603257E-01 .141668 .048895 .146685
+bezier .302423E-01 .146642 .262901E-01 .12357 .02159 .10922
+aline .01905 .09906
+aline .018415 .09779
+aline .01778 .097155
+aline .01651 .09652
+aline .0127 .09652
+aline .012065 .097155
+aline .010795 .09779
+bezier .139408E-01 .118027 .190329E-01 .144216 .040005 .153035
+aline .04318 .15367
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="s" !-------------- Beginning of new char.
+dfont wid=.46875 hei=.430555 dep=0 italic=0
+dfont fby=127 kadd=.0555573
+set path ! start of curve
+newpath
+! start of curve
+amove .112395 .15367
+bezier .13083 .15308 .151911 .137206 .14605 .11684
+bezier .145128 .104827 .124648 .098976 .12065 .11176
+bezier .118529 .12185 .127725 .129735 .13716 .130175
+bezier .12239 .157071 .736979E-01 .15039 .06731 .11938
+bezier .629729E-01 .106415 .764518E-01 .952204E-01 .0889 .094615
+bezier .110496 .923694E-01 .138081 .818978E-01 .13843 .056515
+bezier .141685 .234264E-01 .108163 -.390613E-02 .076835 -.004445
+bezier .553479E-01 -.565737E-02 .260411E-01 -.150985E-02 .01905 .02286
+bezier .152547E-01 .361737E-01 .242262E-01 .547376E-01 .04064 .05207
+bezier .583115E-01 .483233E-01 .499951E-01 .226366E-01 .034925 .02159
+aline .02921 .02159
+bezier .326369E-01 .911405E-02 .501112E-01 .423667E-02 .061595 .00254
+bezier .849009E-01 .122417E-03 .113284 .104393E-01 .118745 .036195
+bezier .123571 .530665E-01 .105732 .657329E-01 .09017 .066675
+bezier .713319E-01 .683618E-01 .471976E-01 .780718E-01 .047625 .10033
+bezier .449443E-01 .128083 .071744 .153022 .09906 .15367
+aline .112395 .15367
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="t" !-------------- Beginning of new char.
+dfont wid=.361113 hei=.61508 dep=0 italic=0
+dfont fby=127 kadd=.0833359
+set path ! start of curve
+newpath
+! start of curve
+amove .08255 .21844
+aline .084455 .217805
+aline .085725 .21717
+aline .086995 .2159
+aline .088265 .215265
+aline .089535 .212725
+aline .089535 .20574
+aline .0762 .1524
+aline .757767E-01 .15113
+aline .0762 .14986
+aline .113665 .14986
+aline .11557 .147955
+aline .11557 .14478
+aline .114935 .14224
+aline .1143 .14097
+aline .113665 .140335
+aline .112395 .1397
+aline .073025 .1397
+aline .046355 .03302
+bezier .437239E-01 .233029E-01 .416994E-01 .008314 .052705 .00254
+bezier .790918E-01 .247791E-02 .933348E-01 .292804E-01 .102235 .0508
+aline .10414 .052705
+aline .10795 .052705
+aline .10922 .05207
+aline .11049 .0508
+bezier .103171 .240403E-01 .814452E-01 -.675795E-02 .050165 -.004445
+bezier .304366E-01 -.260581E-02 .186835E-01 .183388E-01 .023495 .036195
+aline .048895 .137795
+aline .493712E-01 .138747
+aline .048895 .1397
+aline .010795 .1397
+aline .00889 .141605
+aline .00889 .145415
+aline .009525 .14732
+aline .01016 .14859
+aline .010795 .149225
+aline .012065 .14986
+aline .051435 .14986
+aline .05207 .150495
+aline .066675 .208915
+aline .06731 .21082
+aline .067945 .21209
+aline .071755 .2159
+aline .073025 .216535
+aline .07366 .21717
+aline .075565 .217805
+aline .07747 .21844
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="u" !-------------- Beginning of new char.
+dfont wid=.572458 hei=.430555 dep=0 italic=0
+dfont fby=127 kadd=.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .06096 .15367
+bezier .814682E-01 .151967 .906419E-01 .127755 .08255 .11049
+bezier .728077E-01 .800739E-01 .546744E-01 .478928E-01 .062865 .01651
+bezier .692841E-01 -.252014E-02 .936144E-01 .513443E-03 .106045 .01143
+bezier .112977 .186448E-01 .121634 .262272E-01 .12319 .036195
+aline .149225 .140335
+bezier .151612 .150068 .167595 .154139 .172085 .144145
+aline .172085 .13716
+aline .14605 .03302
+bezier .143419 .233029E-01 .141394 .008314 .1524 .00254
+bezier .170763 .208581E-02 .175028 .247136E-01 .179705 .038735
+aline .182245 .048895
+aline .18288 .0508
+aline .184785 .052705
+aline .188595 .052705
+aline .189865 .05207
+aline .191135 .0508
+bezier .186843 .303008E-01 .182196 .173118E-02 .15875 -.004445
+bezier .143306 -.650959E-02 .127032 .304628E-02 .12319 .018415
+bezier .106453 -.753938E-02 .649703E-01 -.136486E-01 .045085 .01143
+bezier .280778E-01 .450613E-01 .493721E-01 .821837E-01 .060325 .114935
+bezier .633832E-01 .125063 .698132E-01 .139941 .05842 .146685
+bezier .336937E-01 .146237 .245978E-01 .117696 .018415 .09779
+aline .01778 .097155
+aline .01651 .09652
+aline .0127 .09652
+aline .012065 .097155
+aline .010795 .09779
+bezier .138195E-01 .121109 .274305E-01 .147868 .05207 .15367
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="v" !-------------- Beginning of new char.
+dfont wid=.484724 hei=.430555 dep=0 italic=.0358791
+dfont fby=127 kadd=.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .06096 .15367
+bezier .814682E-01 .151967 .906419E-01 .127755 .08255 .11049
+bezier .730577E-01 .800256E-01 .05382 .047927 .064135 .01651
+bezier .741448E-01 -.50115E-02 .104469 .118239E-02 .116205 .01778
+bezier .134435 .377898E-01 .142643 .651929E-01 .14986 .090805
+bezier .152183 .106814 .144342 .121625 .132715 .13208
+bezier .126467 .147744 .151212 .162708 .160655 .14732
+bezier .170238 .123571 .159512 .985524E-01 .154305 .074295
+bezier .144317 .430477E-01 .12934 .638066E-02 .09525 -.00381
+bezier .726137E-01 -.808224E-02 .421529E-01 .262039E-02 .03937 .02921
+bezier .355431E-01 .638933E-01 .564475E-01 .972756E-01 .06477 .130175
+aline .06477 .139065
+bezier .620633E-01 .150388 .488735E-01 .14689 .04191 .141605
+bezier .285146E-01 .130325 .235381E-01 .11289 .01778 .097155
+aline .01651 .09652
+aline .0127 .09652
+aline .012065 .097155
+aline .010795 .09779
+bezier .138195E-01 .121109 .274305E-01 .147868 .05207 .15367
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="w" !-------------- Beginning of new char.
+dfont wid=.715918 hei=.430555 dep=0 italic=.0269089
+dfont fby=127 kadd=.0833359
+set path ! start of curve
+newpath
+! start of curve
+amove .06096 .15367
+bezier .814682E-01 .151967 .906419E-01 .127755 .08255 .11049
+bezier .733276E-01 .805926E-01 .054235 .491847E-01 .064135 .018415
+bezier .727761E-01 -.338586E-02 .105739 -.164575E-02 .114935 .01905
+aline .11557 .02032
+bezier .125329 .315665E-01 .12047 .459157E-01 .12446 .059055
+aline .14478 .140335
+bezier .147167 .150068 .16315 .154139 .16764 .144145
+aline .16764 .13716
+aline .146685 .05334
+bezier .141492 .364218E-01 .141628 .654316E-02 .1651 .003175
+bezier .190159 -.967775E-03 .206242 .251228E-01 .213995 .04572
+bezier .221505 .070237 .237494 .991296E-01 .21971 .122555
+aline .211455 .13081
+bezier .203111 .146543 .228951 .163289 .23876 .14732
+bezier .248537 .122726 .237103 .968555E-01 .231775 .071755
+bezier .222695 .412537E-01 .210056 .226602E-02 .174625 -.004445
+bezier .155807 -.595865E-02 .133311 .144569E-03 .125095 .01905
+bezier .116778 .406824E-02 .996486E-01 -.851896E-02 .081915 -.00381
+bezier .062145 -.432857E-02 .412055E-01 .010082 .03937 .031115
+bezier .364367E-01 .659499E-01 .566164E-01 .977874E-01 .06477 .130175
+aline .06477 .139065
+bezier .620633E-01 .150388 .488735E-01 .14689 .04191 .141605
+bezier .285146E-01 .130325 .235381E-01 .11289 .01778 .097155
+aline .01651 .09652
+aline .0127 .09652
+aline .012065 .097155
+aline .010795 .09779
+bezier .138195E-01 .121109 .274305E-01 .147868 .05207 .15367
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="x" !-------------- Beginning of new char.
+dfont wid=.571528 hei=.430555 dep=0 italic=0
+dfont fby=127 kadd=.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .08255 .15367
+bezier .972523E-01 .15238 .110383 .141476 .11557 .127635
+bezier .124145 .146941 .1465 .159332 .167005 .151765
+bezier .182995 .149072 .19144 .127769 .17907 .116205
+bezier .171567 .106806 .150226 .110648 .15367 .12446
+bezier .152926 .133792 .16177 .139858 .169545 .14224
+bezier .153584 .152354 .13229 .144239 .125095 .127
+aline .12446 .126365
+aline .122555 .122555
+aline .12192 .12065
+aline .121285 .11938
+aline .12065 .117475
+aline .120015 .116205
+aline .11938 .113665
+aline .118745 .11176
+aline .1016 .04318
+bezier .968776E-01 .028891 .974612E-01 .780819E-02 .114935 .00254
+bezier .141654 .166169E-02 .160013 .271343E-01 .16637 .0508
+aline .168275 .052705
+aline .172085 .052705
+aline .173355 .05207
+aline .174625 .0508
+bezier .169892 .180538E-01 .13519 -.152099E-01 .100965 -.00127
+bezier .911045E-01 .327693E-02 .831357E-01 .011681 .08001 .022225
+bezier .714744E-01 .135205E-02 .465581E-01 -.112373E-01 .0254 -.00127
+bezier .722971E-02 .393289E-02 .579255E-02 .314191E-01 .02413 .037465
+bezier .337155E-01 .411694E-01 .455681E-01 .338245E-01 .042545 .02286
+bezier .419529E-01 .142833E-01 .032519 .965663E-02 .270933E-01 .677334E-02
+bezier .428674E-01 -.362766E-02 .629651E-01 .603066E-02 .070485 .022225
+aline .073025 .027305
+aline .07366 .02921
+aline .074295 .03048
+aline .0762 .036195
+aline .093345 .104775
+bezier .979082E-01 .118961 .985722E-01 .141442 .080645 .146685
+bezier .529404E-01 .147731 .358887E-01 .120635 .028575 .097155
+aline .027305 .09652
+aline .023495 .09652
+aline .02286 .097155
+bezier .019111 .105135 .270587E-01 .115361 .03048 .12319
+bezier .415911E-01 .140576 .604442E-01 .15618 .08255 .15367
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="y" !-------------- Beginning of new char.
+dfont wid=.490282 hei=.430555 dep=.194445 italic=.0358791
+dfont fby=127 kadd=.0555573
+set path ! start of curve
+newpath
+! start of curve
+amove .06096 .15367
+bezier .814682E-01 .151967 .906419E-01 .127755 .08255 .11049
+bezier .728776E-01 .806652E-01 .556379E-01 .049245 .06223 .018415
+bezier .663629E-01 -.96483E-03 .909058E-01 -.743277E-03 .103505 .01016
+bezier .111223 .153149E-01 .116687 .231739E-01 .121285 .031115
+aline .14859 .140335
+bezier .150977 .150068 .16696 .154139 .17145 .144145
+aline .17145 .13716
+aline .13589 -.00508
+bezier .124375 -.458922E-01 .080474 -.840081E-01 .03683 -.06985
+bezier .158186E-01 -.632334E-01 .100412E-01 -.276321E-01 .03302 -.02032
+aline .03683 -.02032
+bezier .459473E-01 -.178419E-01 .535059E-01 -.292455E-01 .04953 -.0381
+bezier .467244E-01 -.472511E-01 .364999E-01 -.506516E-01 .287338E-01 -.511175E-01
+bezier .409002E-01 -.749778E-01 .755367E-01 -.670551E-01 .0889 -.04826
+bezier .103317 -.321593E-01 .112398 -.104623E-01 .11557 .010795
+bezier .953518E-01 -.139798E-01 .451098E-01 -.884218E-02 .03937 .026035
+bezier .345849E-01 .621055E-01 .056139 .963623E-01 .06477 .130175
+aline .06477 .139065
+bezier .620633E-01 .150388 .488735E-01 .14689 .04191 .141605
+bezier .285146E-01 .130325 .235381E-01 .11289 .01778 .097155
+aline .01651 .09652
+aline .0127 .09652
+aline .012065 .097155
+aline .010795 .09779
+bezier .138195E-01 .121109 .274305E-01 .147868 .05207 .15367
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="z" !-------------- Beginning of new char.
+dfont wid=.46505 hei=.430555 dep=0 italic=.0439806
+dfont fby=127 kadd=.0555573
+set path ! start of curve
+newpath
+! start of curve
+amove .090805 .15367
+bezier .109159 .151207 .114291 .120812 .135255 .128905
+bezier .146095 .133749 .150475 .145759 .158115 .15367
+aline .16256 .15367
+bezier .16775 .148176 .158747 .142379 .156845 .13716
+bezier .133112 .104298 .100268 .791041E-01 .070485 .05207
+aline .04826 .029845
+aline .477838E-01 .288925E-01
+bezier .620005E-01 .030869 .785191E-01 .245717E-01 .09271 .01905
+bezier .115203 .146381E-01 .138955 .301545E-01 .14605 .05207
+aline .14732 .052705
+aline .150495 .052705
+aline .151765 .05207
+bezier .154814 .432171E-01 .14709 .335326E-01 .14351 .0254
+bezier .131603 .644944E-02 .105659 -.135112E-01 .083185 0
+bezier .073034 .776526E-02 .655373E-01 .266275E-01 .050165 .020955
+bezier .370301E-01 .176487E-01 .298645E-01 .537634E-02 .022225 -.004445
+aline .01778 -.004445
+bezier .120447E-01 .850035E-03 .220806E-01 .778389E-02 .02413 .013335
+bezier .292325E-01 .020033 .345362E-01 .026586 .040005 .03302
+aline .062865 .05588
+bezier .860763E-01 .770074E-01 .110838 .965565E-01 .13208 .120015
+bezier .11045 .117846 .892002E-01 .138611 .067945 .127635
+bezier .601155E-01 .125006 .545292E-01 .118754 .05207 .111125
+aline .0508 .11049
+aline .046355 .11049
+aline .045085 .111125
+bezier .449271E-01 .129227 .606166E-01 .146315 .07747 .1524
+aline .08001 .153035
+aline .08255 .15367
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="{" !-------------- Beginning of new char.
+dfont wid=.322456 hei=.430555 dep=0 italic=0
+dfont fby=127 kadd=.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .06096 .15367
+bezier .814682E-01 .151967 .906419E-01 .127755 .08255 .11049
+bezier .718318E-01 .789055E-01 .564693E-01 .478091E-01 .048895 .015875
+bezier .479398E-01 .891761E-02 .535707E-01 -.679949E-03 .061595 .003175
+bezier .08419 .866863E-02 .885057E-01 .350165E-01 .097155 .052705
+aline .100965 .052705
+aline .102235 .05207
+bezier .10544 .450548E-01 .990236E-01 .364458E-01 .097155 .02921
+bezier .892695E-01 .930325E-02 .690517E-01 -.011547 .04572 -.00254
+bezier .248711E-01 .568698E-02 .259628E-01 .314247E-01 .034925 .04826
+bezier .447123E-01 .755046E-01 .570393E-01 .10281 .06477 .130175
+aline .06477 .139065
+bezier .620633E-01 .150388 .488735E-01 .14689 .04191 .141605
+bezier .285146E-01 .130325 .235381E-01 .11289 .01778 .097155
+aline .01651 .09652
+aline .0127 .09652
+aline .012065 .097155
+aline .010795 .09779
+bezier .138195E-01 .121109 .274305E-01 .147868 .05207 .15367
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="|" !-------------- Beginning of new char.
+dfont wid=.38403 hei=.430555 dep=.194445 italic=0
+dfont fby=127 kadd=.0833359
+set path ! start of curve
+newpath
+! start of curve
+amove .098425 .15367
+bezier .117588 .152199 .129482 .132255 .12573 .114935
+aline .125095 .11176
+aline .09144 -.02286
+bezier .820993E-01 -.590496E-01 .362068E-01 -.875787E-01 .00254 -.065405
+bezier -.131321E-01 -.535821E-01 .156525E-02 -.256659E-01 .02032 -.032385
+bezier .035072 -.390021E-01 .258785E-01 -.609286E-01 .012065 -.06223
+bezier .297088E-01 -.725734E-01 .509475E-01 -.611979E-01 .059055 -.043815
+aline .062865 -.036195
+aline .0635 -.03429
+aline .06477 -.03175
+aline .067945 -.022225
+aline .10287 .117475
+bezier .10488 .12689 .107316 .141668 .095885 .146685
+bezier .688218E-01 .146761 .055449 .118461 .04572 .097155
+aline .04445 .09652
+aline .04064 .09652
+aline .040005 .097155
+aline .038735 .09779
+bezier .429926E-01 .120047 .589436E-01 .140894 .079375 .15113
+aline .083185 .1524
+aline .085725 .153035
+aline .0889 .15367
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="}" !-------------- Beginning of new char.
+dfont wid=.636459 hei=.430555 dep=.194445 italic=0
+dfont fby=127 kadd=.111115
+set path ! start of curve
+newpath
+! start of curve
+amove .0889 .15748
+aline .09017 .156845
+aline .090805 .15621
+aline .090805 .151765
+bezier .065215 .146422 .535563E-01 .117514 .047625 .09398
+bezier .440306E-01 .794982E-01 .042343 .617032E-01 .05334 .04953
+bezier .764807E-01 .967669E-01 .120286 .145086 .177165 .14224
+bezier .20505 .139438 .220145 .108496 .2159 .08382
+bezier .213769 .405034E-01 .177506 -.587978E-02 .131445 -.004445
+bezier .111399 -.317807E-02 .981682E-01 .210882E-01 .108585 .0381
+aline .109855 .038735
+aline .11049 .03937
+aline .11176 .040005
+aline .117475 .040005
+aline .118745 .03937
+aline .12065 .037465
+aline .121285 .036195
+aline .121285 .03175
+aline .12065 .029845
+aline .117475 .02667
+aline .113665 .024765
+bezier .112734 .756691E-02 .133685 -.275363E-02 .147955 .00508
+bezier .180807 .204605E-01 .189513 .610468E-01 .19558 .09271
+bezier .197085 .109055 .193193 .131074 .174625 .135255
+bezier .126263 .136414 .088195 .963796E-01 .066675 .056515
+aline .05969 .042545
+bezier .688988E-01 .263585E-01 .863551E-01 .117796E-01 .094615 -.00635
+bezier .102138 -.371357E-01 .804943E-01 -.776527E-01 .046355 -.076835
+bezier .352288E-01 -.760671E-01 .277611E-01 -.654115E-01 .027305 -.055245
+bezier .269765E-01 -.278766E-01 .341197E-01 -.497319E-04 .043815 .026035
+bezier .206129E-01 .049603 .292525E-01 .852868E-01 .040005 .11303
+bezier .497164E-01 .132817 .645202E-01 .156446 .0889 .15748
+closepath
+! end of curve
+
+! start of curve
+amove .04953 .017145
+bezier .430312E-01 -.788845E-02 .327702E-01 -.332924E-01 .036195 -.057785
+bezier .380939E-01 -.719791E-01 .555386E-01 -.725509E-01 .064135 -.064135
+bezier .795382E-01 -.498091E-01 .883021E-01 -.230418E-01 .06985 -.00762
+bezier .633574E-01 .441508E-03 .564369E-01 .114893E-01 .04953 .017145
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="~" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.714444 dep=0 italic=.153819
+set path ! start of curve
+newpath
+! start of curve
+amove .19431 .25019
+bezier .203343 .246991 .200545 .233834 .20828 .2286
+bezier .211834 .2227 .224142 .21969 .21844 .21082
+bezier .20417 .203864 .192547 .192721 .182245 .180975
+bezier .172944 .177047 .16842 .191163 .17653 .19558
+aline .177165 .19685
+aline .18796 .207645
+aline .187325 .20828
+aline .069215 .20828
+bezier .625292E-01 .210186 .625292E-01 .220344 .069215 .22225
+aline .193675 .22225
+bezier .191648 .229364 .178941 .245228 .19177 .25019
+aline .19431 .25019
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=127 !-------------- Beginning of new char.
+dfont wid=.277779 hei=.694445 dep=0 italic=.399462
+set path ! start of curve
+newpath
+! start of curve
+amove .178435 .23241
+bezier .199388 .23127 .230496 .220029 .2286 .193675
+aline .227965 .1905
+aline .22733 .18923
+aline .22479 .18796
+aline .22225 .18796
+aline .22098 .188595
+aline .21971 .189865
+bezier .223061 .21247 .19504 .221002 .1778 .221615
+bezier .152574 .223956 .122368 .218051 .104775 .197485
+aline .102235 .192405
+aline .1016 .1905
+aline .100965 .18923
+aline .098425 .18796
+bezier .890091E-01 .187657 .949086E-01 .199864 .098425 .203835
+bezier .117685 .226784 .149847 .233881 .178435 .23241
+closepath
+! end of curve
+
+fill
+dfont endchar
diff --git a/src/fonts/texcmr.afm b/src/fonts/texcmr.afm
new file mode 100644
index 0000000..2ccb0f6
--- /dev/null
+++ b/src/fonts/texcmr.afm
@@ -0,0 +1,332 @@
+StartFontMetrics 2.0
+Comment Made from TEX tfm file using TFMTOAFM.bas
+FontName CMR10
+EncodingScheme TEXENCODING
+FullName CMR10
+FamilyName CMR10
+Weight Medium
+ItalicAngle 0
+IsFixedPitch false
+UnderlinePosition -97
+UnderlineThickness 73
+FontBBox 0 -300 1001 1001
+CapHeight 729
+XHeight 151
+Descender -219
+Ascender 729
+StartCharMetrics 127
+C 1 ; WX 833 ; N C1 ; B 0 0 833 683 ;
+C 2 ; WX 777 ; N C2 ; B 0 0 777 683 ;
+C 3 ; WX 694 ; N C3 ; B 0 0 694 683 ;
+C 4 ; WX 666 ; N C4 ; B 0 0 666 683 ;
+C 5 ; WX 750 ; N C5 ; B 0 0 750 683 ;
+C 6 ; WX 722 ; N C6 ; B 0 0 722 683 ;
+C 7 ; WX 777 ; N C7 ; B 0 0 777 683 ;
+C 8 ; WX 722 ; N C8 ; B 0 0 722 683 ;
+C 9 ; WX 777 ; N C9 ; B 0 0 777 683 ;
+C 10 ; WX 722 ; N C10 ; B 0 0 722 683 ;
+C 11 ; WX 583 ; N C11 ; B 0 0 583 694 ; L i C14 L l C15
+C 12 ; WX 555 ; N C12 ; B 0 0 555 694 ;
+C 13 ; WX 555 ; N C13 ; B 0 0 555 694 ;
+C 14 ; WX 833 ; N C14 ; B 0 0 833 694 ;
+C 15 ; WX 833 ; N C15 ; B 0 0 833 694 ;
+C 16 ; WX 277 ; N C16 ; B 0 0 277 430 ;
+C 17 ; WX 305 ; N C17 ; B 0 -194 305 430 ;
+C 18 ; WX 500 ; N C18 ; B 0 0 500 694 ;
+C 19 ; WX 500 ; N C19 ; B 0 0 500 694 ;
+C 20 ; WX 500 ; N C20 ; B 0 0 500 628 ;
+C 21 ; WX 500 ; N C21 ; B 0 0 500 694 ;
+C 22 ; WX 500 ; N C22 ; B 0 0 500 567 ;
+C 23 ; WX 750 ; N C23 ; B 0 0 750 694 ;
+C 24 ; WX 444 ; N C24 ; B 0 -170 444 0 ;
+C 25 ; WX 500 ; N C25 ; B 0 0 500 694 ;
+C 26 ; WX 722 ; N C26 ; B 0 0 722 430 ;
+C 27 ; WX 777 ; N C27 ; B 0 0 777 430 ;
+C 28 ; WX 500 ; N C28 ; B 0 -97 500 527 ;
+C 29 ; WX 902 ; N C29 ; B 0 0 902 683 ;
+C 30 ; WX 1013 ; N C30 ; B 0 0 1013 683 ;
+C 31 ; WX 777 ; N C31 ; B 0 -48 777 731 ;
+C 32 ; WX 234 ; N C32 ; B 0 0 234 430 ;
+C 33 ; WX 277 ; N C33 ; B 0 0 277 694 ;
+C 34 ; WX 500 ; N C34 ; B 0 0 500 694 ;
+C 35 ; WX 833 ; N C35 ; B 0 -194 833 694 ;
+C 36 ; WX 500 ; N C36 ; B 0 -55 500 750 ;
+C 37 ; WX 833 ; N C37 ; B 0 -55 833 750 ;
+C 38 ; WX 777 ; N C38 ; B 0 0 777 694 ;
+C 39 ; WX 277 ; N C39 ; B 0 0 277 694 ; L C39 C34
+C 40 ; WX 388 ; N C40 ; B 0 -250 388 750 ;
+C 41 ; WX 388 ; N C41 ; B 0 -250 388 750 ;
+C 42 ; WX 500 ; N C42 ; B 0 0 500 750 ;
+C 43 ; WX 777 ; N C43 ; B 0 -83 777 583 ;
+C 44 ; WX 277 ; N C44 ; B 0 -194 277 105 ;
+C 45 ; WX 333 ; N C45 ; B 0 0 333 430 ;
+C 46 ; WX 277 ; N C46 ; B 0 0 277 105 ;
+C 47 ; WX 500 ; N C47 ; B 0 -250 500 750 ;
+C 48 ; WX 500 ; N C48 ; B 0 0 500 644 ;
+C 49 ; WX 500 ; N C49 ; B 0 0 500 644 ;
+C 50 ; WX 500 ; N C50 ; B 0 0 500 644 ;
+C 51 ; WX 500 ; N C51 ; B 0 0 500 644 ;
+C 52 ; WX 500 ; N C52 ; B 0 0 500 644 ;
+C 53 ; WX 500 ; N C53 ; B 0 0 500 644 ;
+C 54 ; WX 500 ; N C54 ; B 0 0 500 644 ;
+C 55 ; WX 500 ; N C55 ; B 0 0 500 644 ;
+C 56 ; WX 500 ; N C56 ; B 0 0 500 644 ;
+C 57 ; WX 500 ; N C57 ; B 0 0 500 644 ;
+C 58 ; WX 277 ; N C58 ; B 0 0 277 430 ;
+C 59 ; WX 277 ; N C59 ; B 0 -194 277 430 ;
+C 60 ; WX 277 ; N C60 ; B 0 -194 277 500 ;
+C 61 ; WX 777 ; N C61 ; B 0 134 777 366 ;
+C 62 ; WX 472 ; N C62 ; B 0 -194 472 500 ;
+C 63 ; WX 472 ; N C63 ; B 0 0 472 694 ;
+C 64 ; WX 777 ; N C64 ; B 0 0 777 694 ;
+C 65 ; WX 750 ; N A ; B 0 0 750 683 ;
+C 66 ; WX 708 ; N B ; B 0 0 708 683 ;
+C 67 ; WX 722 ; N C ; B 0 0 722 683 ;
+C 68 ; WX 763 ; N D ; B 0 0 763 683 ;
+C 69 ; WX 680 ; N E ; B 0 0 680 683 ;
+C 70 ; WX 652 ; N F ; B 0 0 652 683 ;
+C 71 ; WX 784 ; N G ; B 0 0 784 683 ;
+C 72 ; WX 750 ; N H ; B 0 0 750 683 ;
+C 73 ; WX 361 ; N I ; B 0 0 361 683 ;
+C 74 ; WX 513 ; N J ; B 0 0 513 683 ;
+C 75 ; WX 777 ; N K ; B 0 0 777 683 ;
+C 76 ; WX 625 ; N L ; B 0 0 625 683 ;
+C 77 ; WX 916 ; N M ; B 0 0 916 683 ;
+C 78 ; WX 750 ; N N ; B 0 0 750 683 ;
+C 79 ; WX 777 ; N O ; B 0 0 777 683 ;
+C 80 ; WX 680 ; N P ; B 0 0 680 683 ;
+C 81 ; WX 777 ; N Q ; B 0 -194 777 683 ;
+C 82 ; WX 736 ; N R ; B 0 0 736 683 ;
+C 83 ; WX 555 ; N S ; B 0 0 555 683 ;
+C 84 ; WX 722 ; N T ; B 0 0 722 683 ;
+C 85 ; WX 750 ; N U ; B 0 0 750 683 ;
+C 86 ; WX 750 ; N V ; B 0 0 750 683 ;
+C 87 ; WX 1027 ; N W ; B 0 0 1027 683 ;
+C 88 ; WX 750 ; N X ; B 0 0 750 683 ;
+C 89 ; WX 750 ; N Y ; B 0 0 750 683 ;
+C 90 ; WX 611 ; N Z ; B 0 0 611 683 ;
+C 91 ; WX 277 ; N C91 ; B 0 -250 277 750 ;
+C 92 ; WX 500 ; N C92 ; B 0 0 500 694 ;
+C 93 ; WX 277 ; N C93 ; B 0 -250 277 750 ;
+C 94 ; WX 500 ; N C94 ; B 0 0 500 694 ;
+C 95 ; WX 277 ; N C95 ; B 0 0 277 667 ;
+C 96 ; WX 277 ; N C96 ; B 0 0 277 694 ;
+C 97 ; WX 500 ; N a ; B 0 0 500 430 ;
+C 98 ; WX 555 ; N b ; B 0 0 555 694 ;
+C 99 ; WX 444 ; N c ; B 0 0 444 430 ;
+C 100 ; WX 555 ; N d ; B 0 0 555 694 ;
+C 101 ; WX 444 ; N e ; B 0 0 444 430 ;
+C 102 ; WX 305 ; N f ; B 0 0 305 694 ; L f C11 L i C12 L l C13
+C 103 ; WX 500 ; N g ; B 0 -194 500 430 ;
+C 104 ; WX 555 ; N h ; B 0 0 555 694 ;
+C 105 ; WX 277 ; N i ; B 0 0 277 667 ;
+C 106 ; WX 305 ; N j ; B 0 -194 305 667 ;
+C 107 ; WX 527 ; N k ; B 0 0 527 694 ;
+C 108 ; WX 277 ; N l ; B 0 0 277 694 ;
+C 109 ; WX 833 ; N m ; B 0 0 833 430 ;
+C 110 ; WX 555 ; N n ; B 0 0 555 430 ;
+C 111 ; WX 500 ; N o ; B 0 0 500 430 ;
+C 112 ; WX 555 ; N p ; B 0 -194 555 430 ;
+C 113 ; WX 527 ; N q ; B 0 -194 527 430 ;
+C 114 ; WX 391 ; N r ; B 0 0 391 430 ;
+C 115 ; WX 394 ; N s ; B 0 0 394 430 ;
+C 116 ; WX 388 ; N t ; B 0 0 388 615 ;
+C 117 ; WX 555 ; N u ; B 0 0 555 430 ;
+C 118 ; WX 527 ; N v ; B 0 0 527 430 ;
+C 119 ; WX 722 ; N w ; B 0 0 722 430 ;
+C 120 ; WX 527 ; N x ; B 0 0 527 430 ;
+C 121 ; WX 527 ; N y ; B 0 -194 527 430 ;
+C 122 ; WX 444 ; N z ; B 0 0 444 430 ;
+C 123 ; WX 500 ; N C123 ; B 0 0 500 430 ;
+C 124 ; WX 1000 ; N C124 ; B 0 0 1000 430 ;
+C 125 ; WX 500 ; N C125 ; B 0 0 500 694 ;
+C 126 ; WX 500 ; N C126 ; B 0 0 500 667 ;
+C 127 ; WX 500 ; N C127 ; B 0 0 500 667 ;
+EndCharMetrics
+
+StartKernData
+StartKernPairs 181
+KPX C11 C33 77
+KPX C11 C39 77
+KPX C11 C41 77
+KPX C11 C63 77
+KPX C11 C93 77
+KPX C32 L -320
+KPX C32 l -278
+KPX C39 C33 111
+KPX C39 C63 111
+KPX A C -28
+KPX A G -28
+KPX A O -28
+KPX A Q -28
+KPX A T -84
+KPX A U -28
+KPX A V -112
+KPX A W -112
+KPX A Y -84
+KPX A t -28
+KPX D A -28
+KPX D V -28
+KPX D W -28
+KPX D X -28
+KPX D Y -28
+KPX F A -112
+KPX F C -28
+KPX F G -28
+KPX F O -28
+KPX F Q -28
+KPX F a -84
+KPX F e -84
+KPX F o -84
+KPX F r -84
+KPX F u -84
+KPX I I 27
+KPX K C -28
+KPX K G -28
+KPX K O -28
+KPX K Q -28
+KPX L T -84
+KPX L V -112
+KPX L W -112
+KPX L Y -84
+KPX O A -28
+KPX O V -28
+KPX O W -28
+KPX O X -28
+KPX O Y -28
+KPX P C44 -84
+KPX P C46 -84
+KPX P A -84
+KPX P a -28
+KPX P e -28
+KPX P o -28
+KPX R C -28
+KPX R G -28
+KPX R O -28
+KPX R Q -28
+KPX R T -84
+KPX R U -28
+KPX R V -112
+KPX R W -112
+KPX R Y -84
+KPX R t -28
+KPX T A -84
+KPX T a -84
+KPX T e -84
+KPX T o -84
+KPX T r -84
+KPX T u -84
+KPX T y -28
+KPX V A -112
+KPX V C -28
+KPX V G -28
+KPX V O -28
+KPX V Q -28
+KPX V a -84
+KPX V e -84
+KPX V o -84
+KPX V r -84
+KPX V u -84
+KPX W A -112
+KPX W C -28
+KPX W G -28
+KPX W O -28
+KPX W Q -28
+KPX W a -84
+KPX W e -84
+KPX W o -84
+KPX W r -84
+KPX W u -84
+KPX X C -28
+KPX X G -28
+KPX X O -28
+KPX X Q -28
+KPX Y A -84
+KPX Y a -84
+KPX Y e -84
+KPX Y o -84
+KPX Y r -84
+KPX Y u -84
+KPX a j 55
+KPX a v -28
+KPX a w -28
+KPX a y -28
+KPX b c 27
+KPX b d 27
+KPX b e 27
+KPX b j 55
+KPX b o 27
+KPX b q 27
+KPX b v -28
+KPX b w -28
+KPX b x -28
+KPX b y -28
+KPX c h -28
+KPX c k -28
+KPX f C33 77
+KPX f C39 77
+KPX f C41 77
+KPX f C63 77
+KPX f C93 77
+KPX g j 27
+KPX h b -28
+KPX h t -28
+KPX h u -28
+KPX h v -28
+KPX h w -28
+KPX h y -28
+KPX k a -56
+KPX k c -28
+KPX k e -28
+KPX k o -28
+KPX m b -28
+KPX m t -28
+KPX m u -28
+KPX m v -28
+KPX m w -28
+KPX m y -28
+KPX n b -28
+KPX n t -28
+KPX n u -28
+KPX n v -28
+KPX n w -28
+KPX n y -28
+KPX o c 27
+KPX o d 27
+KPX o e 27
+KPX o j 55
+KPX o o 27
+KPX o q 27
+KPX o v -28
+KPX o w -28
+KPX o x -28
+KPX o y -28
+KPX p c 27
+KPX p d 27
+KPX p e 27
+KPX p j 55
+KPX p o 27
+KPX p q 27
+KPX p v -28
+KPX p w -28
+KPX p x -28
+KPX p y -28
+KPX t w -28
+KPX t y -28
+KPX u w -28
+KPX v a -56
+KPX v c -28
+KPX v e -28
+KPX v o -28
+KPX w a -28
+KPX w c -28
+KPX w e -28
+KPX w o -28
+KPX y C44 -84
+KPX y C46 -84
+KPX y a -28
+KPX y e -28
+KPX y o -28
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/src/fonts/texcmr.gle b/src/fonts/texcmr.gle
new file mode 100644
index 0000000..f170bad
--- /dev/null
+++ b/src/fonts/texcmr.gle
@@ -0,0 +1,6359 @@
+dfont file_name="CMR10"
+dfont font_name="CMR10"
+dfont design= .35146
+dfont slant= 0
+dfont space= .117153
+dfont stretch= .585767E-01
+dfont shrink= .390513E-01
+dfont x_hei= .151323
+dfont quad= .351461
+dfont extra_space= .390513E-01
+dfont paint="FILL"
+!------------------ end of main parameters
+dfont char=0 !-------------- Beginning of new char.
+dfont wid=.625002 hei=.683332 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .194945 .23749
+bezier .198226 .21092 .201189 .185012 .20447 .15875
+aline .196215 .15875
+bezier .192981 .180937 .191278 .212159 .165735 .22225
+aline .16002 .224155
+aline .15367 .225425
+aline .153035 .22606
+aline .14986 .22606
+aline .149225 .226695
+aline .14224 .226695
+aline .141605 .22733
+aline .0889 .22733
+aline .088265 .226695
+aline .08509 .22606
+aline .083185 .225425
+aline .081915 .22479
+aline .08128 .22352
+aline .080645 .222885
+aline .08001 .220345
+aline .079375 .21971
+aline .079375 .019685
+bezier .828513E-01 .950903E-02 .946233E-01 .107478E-01 .10287 .009525
+aline .12446 .009525
+aline .12446 -.000635
+aline .1143 -.000635
+aline .113665 0
+aline .07366 0
+aline .073025 .000635
+aline .056515 .000635
+aline .05588 0
+aline .022225 0
+aline .02159 -.000635
+aline .0127 -.000635
+aline .0127 .009525
+bezier .024627 .107861E-01 .395101E-01 .617012E-02 .047625 .01651
+aline .04826 .01905
+aline .048895 .019685
+aline .048895 .21717
+bezier .470266E-01 .226372 .369063E-01 .226479 .029845 .22733
+aline .0127 .22733
+aline .0127 .23749
+aline .194945 .23749
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=1 !-------------- Beginning of new char.
+dfont wid=.833336 hei=.683332 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .14986 .25019
+aline .15113 .249555
+aline .1524 .24892
+aline .15367 .24765
+aline .19431 .16637
+aline .207645 .1397
+aline .20828 .137795
+aline .24892 .056515
+aline .27559 .003175
+aline .27559 .000635
+aline .27432 -.000635
+aline .018415 -.000635
+aline .017145 .000635
+aline .017145 .003175
+aline .057785 .084455
+aline .084455 .137795
+aline .08509 .1397
+aline .12573 .22098
+aline .139065 .24765
+aline .140335 .24892
+aline .141605 .249555
+aline .142875 .25019
+closepath
+! end of curve
+
+! start of curve
+amove .133985 .213995
+aline .13335 .212725
+aline .095885 .137795
+aline .09525 .13589
+aline .05461 .05461
+aline .04064 .02667
+aline .040005 .026035
+aline .04064 .0254
+aline .229235 .0254
+aline .22987 .026035
+aline .229235 .02667
+aline .2286 .02794
+aline .227965 .029845
+aline .187325 .111125
+aline .146685 .192405
+aline .135467 .214842
+aline .134938 .215106
+aline .134408 .214842
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=2 !-------------- Beginning of new char.
+dfont wid=.777781 hei=.683332 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .144145 .24638
+bezier .203945 .242778 .250391 .185202 .25273 .127635
+bezier .258235 .666173E-01 .214732 -.681331E-04 .15113 -.006985
+bezier .918884E-01 -.017422 .333816E-01 .313885E-01 .02286 .09017
+bezier .874393E-02 .152709 .457141E-01 .22874 .112395 .24384
+aline .118745 .24511
+aline .12192 .24511
+aline .122555 .245745
+aline .12827 .245745
+aline .128905 .24638
+aline .144145 .24638
+closepath
+! end of curve
+
+! start of curve
+amove .130175 .23876
+bezier .830441E-01 .233834 .574213E-01 .182237 .055245 .140335
+bezier .503847E-01 .961183E-01 .576358E-01 .429954E-01 .095885 .013335
+bezier .124861 -.983773E-02 .16888 -.002315 .191135 .02667
+bezier .221767 .064376 .22335 .117195 .21463 .16129
+bezier .207479 .201713 .174556 .242384 .13081 .239395
+aline .130175 .23876
+closepath
+! end of curve
+
+! start of curve
+amove .083185 .14478
+aline .083185 .13335
+aline .08382 .132715
+aline .18923 .132715
+aline .189865 .13335
+aline .189865 .14478
+aline .19812 .14478
+aline .19812 .094615
+aline .189865 .094615
+aline .189865 .106045
+aline .18923 .10668
+aline .08382 .10668
+aline .083185 .106045
+aline .083185 .094615
+aline .07493 .094615
+aline .07493 .14478
+aline .083185 .14478
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=3 !-------------- Beginning of new char.
+dfont wid=.694446 hei=.683332 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .125095 .25019
+aline .126365 .249555
+bezier .143162 .207807 .154615 .162918 .169545 .120015
+bezier .181667 .848362E-01 .190687 .479862E-01 .205105 .01397
+aline .206375 .013335
+aline .20701 .0127
+aline .20828 .012065
+aline .210185 .01143
+aline .212725 .010795
+aline .21336 .01016
+aline .21844 .01016
+aline .219075 .009525
+aline .231775 .009525
+aline .231775 -.000635
+aline .225425 -.000635
+aline .22479 0
+aline .197485 0
+aline .19685 .000635
+aline .18288 .000635
+aline .182245 0
+aline .14859 0
+aline .147955 -.000635
+aline .139065 -.000635
+aline .139065 .009525
+bezier .149433 .976592E-02 .163115 .868775E-02 .16891 .01905
+bezier .150703 .789768E-01 .130769 .139513 .111125 .19939
+bezier .926656E-01 .143411 .754097E-01 .867761E-01 .056515 .031115
+bezier .548415E-01 .164829E-01 .716333E-01 .881696E-02 .08382 .009525
+aline .08382 -.000635
+aline .076835 -.000635
+aline .0762 0
+aline .048895 0
+aline .04826 .000635
+aline .0381 .000635
+aline .037465 0
+aline .017145 0
+aline .01651 -.000635
+aline .012065 -.000635
+aline .012065 .009525
+bezier .252749E-01 .924324E-02 .402571E-01 .155725E-01 .045085 .02921
+bezier .687678E-01 .101961 .918179E-01 .174957 .11557 .24765
+aline .117475 .249555
+aline .118745 .25019
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=4 !-------------- Beginning of new char.
+dfont wid=.666669 hei=.683332 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .213995 .236855
+bezier .215143 .218689 .215979 .200393 .21717 .182245
+aline .208915 .182245
+bezier .207406 .192088 .209695 .204022 .20193 .211455
+aline .198755 .211455
+aline .19812 .21209
+aline .18923 .21209
+aline .188595 .212725
+aline .04572 .212725
+bezier .392714E-01 .211251 .281353E-01 .214152 .02794 .203835
+aline .027305 .2032
+aline .027305 .200025
+aline .02667 .19939
+aline .02667 .194945
+aline .026035 .19431
+aline .026035 .187325
+aline .0254 .18669
+aline .0254 .182245
+aline .017145 .182245
+bezier .183358E-01 .200393 .191724E-01 .218689 .02032 .236855
+aline .213995 .236855
+closepath
+! end of curve
+
+! start of curve
+amove .057785 .153035
+aline .057785 .13589
+aline .05842 .135255
+aline .175895 .135255
+aline .17653 .13589
+aline .17653 .153035
+aline .184785 .153035
+aline .184785 .093345
+aline .17653 .093345
+aline .17653 .11049
+aline .175895 .111125
+aline .05842 .111125
+aline .057785 .11049
+aline .057785 .093345
+aline .04953 .093345
+aline .04953 .153035
+aline .057785 .153035
+closepath
+! end of curve
+
+! start of curve
+amove .023495 .057785
+bezier .246819E-01 .469794E-01 .232856E-01 .356064E-01 .02921 .026035
+aline .031115 .0254
+aline .03175 .024765
+aline .034925 .024765
+aline .03556 .02413
+aline .045085 .02413
+aline .04572 .023495
+aline .188595 .023495
+aline .18923 .02413
+aline .198755 .02413
+bezier .209432 .240473E-01 .208533 .372513E-01 .210185 .04445
+aline .210185 .05207
+aline .21082 .052705
+aline .21082 .057785
+aline .219075 .057785
+bezier .217993 .383214E-01 .216982 .188286E-01 .2159 -.000635
+aline .018415 -.000635
+bezier .173331E-01 .188286E-01 .163219E-01 .383214E-01 .01524 .057785
+aline .023495 .057785
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=5 !-------------- Beginning of new char.
+dfont wid=.750002 hei=.683332 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .250825 .23749
+aline .250825 .22733
+bezier .238898 .226069 .224015 .230685 .2159 .220345
+aline .215265 .217805
+aline .21463 .21717
+aline .21463 .019685
+bezier .216498 .104831E-01 .226619 .103757E-01 .23368 .009525
+aline .250825 .009525
+aline .250825 -.000635
+aline .241935 -.000635
+aline .2413 0
+aline .207645 0
+aline .20701 .000635
+aline .19177 .000635
+aline .191135 0
+aline .15748 0
+aline .156845 -.000635
+aline .147955 -.000635
+aline .147955 .009525
+bezier .159882 .107861E-01 .174765 .617013E-02 .18288 .01651
+aline .183515 .01905
+aline .18415 .019685
+aline .18415 .226695
+aline .183515 .22733
+aline .08001 .22733
+aline .079375 .226695
+aline .079375 .019685
+bezier .812434E-01 .104831E-01 .913637E-01 .103757E-01 .098425 .009525
+aline .11557 .009525
+aline .11557 -.000635
+aline .10668 -.000635
+aline .106045 0
+aline .07239 0
+aline .071755 .000635
+aline .056515 .000635
+aline .05588 0
+aline .022225 0
+aline .02159 -.000635
+aline .0127 -.000635
+aline .0127 .009525
+bezier .024627 .107861E-01 .395101E-01 .617012E-02 .047625 .01651
+aline .04826 .01905
+aline .048895 .019685
+aline .048895 .21717
+bezier .470266E-01 .226372 .369063E-01 .226479 .029845 .22733
+aline .0127 .22733
+aline .0127 .23749
+aline .250825 .23749
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=6 !-------------- Beginning of new char.
+dfont wid=.722224 hei=.683332 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .224155 .23876
+bezier .227436 .21219 .230399 .186282 .23368 .16002
+aline .225425 .16002
+bezier .222959 .186351 .212359 .220976 .180975 .22479
+bezier .171356 .227755 .16112 .227316 .15113 .2286
+aline .060325 .2286
+bezier .826713E-01 .192186 .10983 .156269 .133985 .120015
+bezier .130414 .110781 .120579 .104309 .114935 .095885
+bezier .911165E-01 .685998E-01 .648157E-01 .406685E-01 .04318 .013335
+aline .150495 .013335
+bezier .172442 .149665E-01 .201242 .016376 .21336 .03937
+bezier .220687 .527414E-01 .223789 .675913E-01 .225425 .081915
+aline .23368 .081915
+bezier .230339 .544072E-01 .227499 .271791E-01 .224155 -.000635
+aline .02286 -.000635
+aline .02159 0
+aline .020955 .000635
+aline .02032 .001905
+bezier .244866E-01 .123754E-01 .035457 .197021E-01 .04191 .02921
+bezier .642354E-01 .539618E-01 .860626E-01 .790726E-01 .10795 .10414
+bezier .078301 .145945 .498463E-01 .188611 .02032 .230505
+aline .02032 .23622
+aline .020955 .23749
+aline .02159 .238125
+aline .02286 .23876
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=7 !-------------- Beginning of new char.
+dfont wid=.777781 hei=.683332 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .07112 .24638
+bezier .112825 .24244 .131355 .196391 .136525 .16002
+bezier .141925 .194899 .157739 .238019 .19685 .245745
+bezier .218604 .250959 .2411 .236691 .248285 .2159
+aline .250825 .20828
+aline .25146 .20574
+aline .25146 .202565
+aline .252095 .20193
+aline .252095 .19812
+aline .25273 .197485
+aline .25273 .189865
+aline .252095 .188595
+aline .249555 .187325
+aline .245745 .187325
+aline .243205 .188595
+bezier .243274 .214442 .210806 .226948 .189865 .2159
+bezier .161963 .202764 .155946 .166667 .1524 .140335
+aline .1524 .13208
+aline .151765 .131445
+aline .151765 .019685
+bezier .155241 .950903E-02 .167013 .107478E-01 .17526 .009525
+aline .19685 .009525
+aline .19685 -.000635
+aline .18669 -.000635
+aline .186055 0
+aline .14605 0
+aline .145415 .000635
+aline .127635 .000635
+aline .127 0
+aline .086995 0
+aline .08636 -.000635
+aline .0762 -.000635
+aline .0762 .009525
+aline .09779 .009525
+bezier .106037 .107478E-01 .117809 .950903E-02 .121285 .019685
+aline .121285 .131445
+bezier .118528 .160259 .113927 .198542 .08509 .215265
+bezier .646082E-01 .226675 .304271E-01 .2163 .03048 .189865
+aline .029845 .188595
+aline .027305 .187325
+aline .023495 .187325
+aline .020955 .188595
+bezier .168487E-01 .216337 .396086E-01 .250788 .07112 .24638
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=8 !-------------- Beginning of new char.
+dfont wid=.722224 hei=.683332 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .076835 .23876
+aline .07747 .238125
+aline .116205 .238125
+aline .11684 .23749
+aline .135255 .23749
+aline .13589 .238125
+aline .174625 .238125
+aline .17526 .23876
+aline .18542 .23876
+aline .18542 .2286
+aline .16383 .2286
+bezier .155583 .227377 .143811 .228616 .140335 .21844
+aline .140335 .19177
+bezier .177618 .188259 .22359 .169367 .233045 .12827
+bezier .23955 .903175E-01 .203205 .610002E-01 .169545 .05207
+aline .16764 .051435
+aline .16002 .04953
+aline .15367 .04826
+aline .14986 .04826
+aline .149225 .047625
+aline .14478 .047625
+aline .144145 .04699
+aline .14097 .04699
+aline .140335 .046355
+aline .140335 .019685
+bezier .143811 .950903E-02 .155583 .107478E-01 .16383 .009525
+aline .18542 .009525
+aline .18542 -.000635
+aline .17526 -.000635
+aline .174625 0
+aline .13589 0
+aline .135255 .000635
+aline .11684 .000635
+aline .116205 0
+aline .07747 0
+aline .076835 -.000635
+aline .066675 -.000635
+aline .066675 .009525
+aline .088265 .009525
+bezier .965117E-01 .107478E-01 .108284 .950903E-02 .11176 .019685
+aline .11176 .046355
+bezier .748177E-01 .507239E-01 .302523E-01 .693703E-01 .020955 .109855
+bezier .144497E-01 .147808 .507948E-01 .177125 .084455 .186055
+aline .08636 .18669
+aline .09398 .188595
+aline .10033 .189865
+aline .10414 .189865
+aline .104775 .1905
+aline .10922 .1905
+aline .109855 .191135
+aline .11176 .19177
+aline .11176 .21844
+bezier .108284 .228616 .965117E-01 .227377 .088265 .2286
+aline .066675 .2286
+aline .066675 .23876
+aline .076835 .23876
+closepath
+! end of curve
+
+! start of curve
+amove .140335 .183515
+aline .140335 .05461
+bezier .16555 .557187E-01 .193999 .730727E-01 .197485 .100965
+bezier .204593 .129515 .194704 .168214 .16256 .178435
+aline .15494 .180975
+aline .14986 .182245
+aline .149225 .18288
+aline .14605 .18288
+aline .145415 .183515
+aline .14224 .183515
+aline .141288 .183991
+aline .140335 .183515
+closepath
+! end of curve
+
+! start of curve
+amove .10795 .18288
+bezier .823567E-01 .180018 .576997E-01 .160233 .05588 .13335
+bezier .500251E-01 .105465 .608272E-01 .694027E-01 .09144 .05969
+aline .09906 .05715
+aline .10414 .05588
+aline .104775 .055245
+aline .10795 .055245
+aline .109855 .054864
+aline .11176 .055245
+aline .11176 .18288
+aline .109855 .183261
+aline .10795 .18288
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=9 !-------------- Beginning of new char.
+dfont wid=.777781 hei=.683332 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .08636 .23876
+aline .086995 .238125
+aline .12573 .238125
+aline .126365 .23749
+aline .14478 .23749
+aline .145415 .238125
+aline .18415 .238125
+aline .184785 .23876
+aline .194945 .23876
+aline .194945 .2286
+aline .173355 .2286
+bezier .165108 .227377 .153336 .228616 .14986 .21844
+aline .14986 .05588
+bezier .185289 .060863 .19863 .101977 .200025 .13208
+bezier .200353 .15303 .197716 .180396 .219075 .192405
+aline .22098 .19304
+aline .22352 .193675
+aline .250825 .193675
+aline .25273 .19177
+aline .25273 .188595
+aline .250825 .18669
+bezier .232895 .187318 .230123 .164534 .2286 .151765
+bezier .231796 .113534 .216814 .686536E-01 .1778 .053975
+bezier .169013 .049391 .158518 .491232E-01 .14986 .046355
+aline .14986 .019685
+bezier .153336 .950903E-02 .165108 .107478E-01 .173355 .009525
+aline .194945 .009525
+aline .194945 -.000635
+aline .184785 -.000635
+aline .18415 0
+aline .145415 0
+aline .14478 .000635
+aline .126365 .000635
+aline .12573 0
+aline .086995 0
+aline .08636 -.000635
+aline .0762 -.000635
+aline .0762 .009525
+aline .09779 .009525
+bezier .106037 .107478E-01 .117809 .950903E-02 .121285 .019685
+aline .121285 .046355
+bezier .920896E-01 .501919E-01 .620557E-01 .683051E-01 .05207 .09779
+bezier .394044E-01 .124291 .503562E-01 .153827 .03683 .179705
+aline .032385 .18415
+aline .029845 .18542
+aline .027305 .186055
+aline .02667 .18669
+aline .022225 .18669
+aline .02032 .188595
+aline .02032 .191135
+aline .020955 .192405
+aline .02159 .19304
+aline .02286 .193675
+aline .04953 .193675
+bezier .676951E-01 .189775 .719299E-01 .168109 .073025 .153035
+bezier .723688E-01 .121878 .750535E-01 .864462E-01 .100965 .06477
+bezier .106877 .606254E-01 .114258 .564061E-01 .121285 .05588
+aline .121285 .21844
+bezier .117809 .228616 .106037 .227377 .09779 .2286
+aline .0762 .2286
+aline .0762 .23876
+aline .08636 .23876
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=10 !-------------- Beginning of new char.
+dfont wid=.722224 hei=.683332 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .136525 .24638
+bezier .180427 .244196 .228992 .212996 .23368 .165735
+bezier .237817 .109774 .18582 .736017E-01 .171662 .02286
+aline .172085 .02159
+aline .207645 .02159
+aline .20828 .022225
+aline .21336 .022225
+aline .213995 .02286
+aline .21717 .023495
+aline .219075 .02413
+aline .220345 .024765
+aline .22098 .0254
+aline .221615 .02667
+aline .224155 .03429
+aline .22606 .04191
+aline .2286 .05461
+aline .229235 .05588
+aline .23749 .05588
+aline .23749 .055245
+aline .226695 .00127
+aline .22606 -.000635
+aline .164465 -.000635
+aline .163195 0
+bezier .158661 .398959E-01 .181756 .790658E-01 .19177 .11811
+bezier .202312 .15263 .201748 .194726 .173355 .221615
+bezier .142342 .250605 .880569E-01 .242235 .06731 .205105
+bezier .355868E-01 .146522 .793358E-01 .865382E-01 .09017 .027305
+aline .09017 .02413
+aline .090805 .023495
+aline .090805 .019685
+aline .09144 .01905
+aline .09144 .0127
+aline .092075 .012065
+aline .092075 .00127
+aline .09017 -.000635
+aline .02794 -.000635
+aline .027305 .000635
+aline .027305 .00381
+aline .02667 .004445
+aline .01651 .055245
+aline .01651 .05588
+aline .024765 .05588
+aline .0254 .05461
+aline .02794 .04191
+aline .029845 .03429
+aline .032385 .02667
+aline .03302 .0254
+aline .033655 .024765
+aline .034925 .02413
+aline .03683 .023495
+aline .040005 .02286
+aline .04064 .022225
+aline .04572 .022225
+aline .046355 .02159
+aline .081915 .02159
+bezier .711742E-01 .069079 .247717E-01 .102079 .02032 .151765
+bezier .153507E-01 .20446 .681849E-01 .244952 .11684 .245745
+aline .117475 .24638
+aline .136525 .24638
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=11 !-------------- Beginning of new char.
+dfont wid=.583336 hei=.694445 dep=0 italic=.0777788
+dfont fby=33 kadd=.0777788
+dfont fby=39 kadd=.0777788
+dfont fby=")" kadd=.0777788
+dfont fby="?" kadd=.0777788
+dfont fby="]" kadd=.0777788
+dfont fby="i" ligrep=14
+dfont fby="l" ligrep=15
+set path ! start of curve
+newpath
+! start of curve
+amove .118745 .24638
+bezier .130543 .245144 .143621 .241336 .151765 .231775
+bezier .169192 .248746 .203258 .253951 .21844 .231775
+aline .21971 .227965
+bezier .225368 .214534 .209537 .201195 .197485 .208915
+bezier .186495 .214478 .188632 .233409 .20066 .23622
+bezier .181621 .247546 .16128 .226603 .158115 .207645
+aline .15748 .20447
+aline .156845 .203835
+aline .156845 .19939
+aline .15621 .198755
+aline .15621 .150495
+aline .156845 .14986
+aline .19812 .14986
+aline .19812 .1397
+aline .158115 .1397
+aline .15748 .139065
+aline .15748 .019685
+bezier .158763 .108566E-01 .168621 .105225E-01 .17526 .009525
+aline .19177 .009525
+aline .19177 -.000635
+aline .18415 -.000635
+aline .183515 0
+aline .15367 0
+aline .153035 .000635
+aline .14097 .000635
+aline .140335 0
+aline .114935 0
+aline .1143 -.000635
+aline .10795 -.000635
+aline .10795 .009525
+bezier .117564 .102204E-01 .13141 .700019E-02 .135255 .018415
+aline .135255 .139065
+aline .13462 .1397
+aline .06096 .1397
+aline .060325 .139065
+aline .060325 .018415
+bezier .641704E-01 .700018E-02 .780158E-01 .102204E-01 .08763 .009525
+aline .08763 -.000635
+aline .08128 -.000635
+aline .080645 0
+aline .055245 0
+aline .05461 .000635
+aline .043815 .000635
+aline .04318 0
+aline .01778 0
+aline .017145 -.000635
+aline .010795 -.000635
+aline .010795 .009525
+bezier .204092E-01 .102204E-01 .342546E-01 .700019E-02 .0381 .018415
+aline .0381 .139065
+aline .037465 .1397
+aline .009525 .1397
+aline .009525 .14986
+aline .037465 .14986
+aline .0381 .150495
+aline .0381 .197485
+bezier .042403 .227762 .759583E-01 .244516 .103505 .24638
+aline .118745 .24638
+closepath
+! end of curve
+
+! start of curve
+amove .104775 .23876
+bezier .826385E-01 .237299 .624699E-01 .21922 .059055 .197485
+aline .059055 .150495
+aline .05969 .14986
+aline .13462 .14986
+aline .135255 .150495
+aline .135255 .19812
+aline .13589 .198755
+aline .13589 .202565
+bezier .121573 .207308 .124026 .229785 .13843 .23241
+aline .137795 .233045
+aline .133985 .23495
+aline .126365 .23749
+aline .12573 .238125
+aline .122555 .238125
+aline .12192 .23876
+aline .11811 .23876
+aline .117475 .239395
+aline .10541 .239395
+aline .104775 .23876
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=12 !-------------- Beginning of new char.
+dfont wid=.555557 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .11811 .24638
+bezier .139521 .245643 .164438 .224226 .154305 .20193
+bezier .145887 .188843 .121474 .196939 .125095 .21209
+bezier .12395 .221138 .133036 .226976 .14097 .227965
+bezier .11404 .253565 .640991E-01 .233256 .059055 .197485
+aline .059055 .150495
+aline .05969 .14986
+aline .10668 .14986
+bezier .123196 .151626 .139963 .152786 .156845 .15367
+aline .156845 .018415
+bezier .16069 .700018E-02 .174536 .102204E-01 .18415 .009525
+aline .18415 -.000635
+aline .1778 -.000635
+aline .177165 0
+aline .151765 0
+aline .15113 .000635
+aline .140335 .000635
+aline .1397 0
+aline .1143 0
+aline .113665 -.000635
+aline .107315 -.000635
+aline .107315 .009525
+bezier .116929 .102204E-01 .130775 .700019E-02 .13462 .018415
+aline .13462 .127635
+aline .133985 .12827
+aline .13335 .131445
+aline .131445 .135255
+aline .130175 .136525
+aline .127635 .137795
+aline .125095 .13843
+aline .12192 .139065
+aline .121285 .1397
+aline .06096 .1397
+aline .060325 .139065
+aline .060325 .018415
+bezier .641704E-01 .700018E-02 .780158E-01 .102204E-01 .08763 .009525
+aline .08763 -.000635
+aline .08128 -.000635
+aline .080645 0
+aline .055245 0
+aline .05461 .000635
+aline .043815 .000635
+aline .04318 0
+aline .01778 0
+aline .017145 -.000635
+aline .010795 -.000635
+aline .010795 .009525
+bezier .204092E-01 .102204E-01 .342546E-01 .700019E-02 .0381 .018415
+aline .0381 .139065
+aline .037465 .1397
+aline .009525 .1397
+aline .009525 .14986
+aline .037465 .14986
+aline .0381 .150495
+aline .0381 .197485
+bezier .044079 .233103 .858133E-01 .248879 .11811 .24638
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=13 !-------------- Beginning of new char.
+dfont wid=.555557 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .120015 .24638
+aline .12065 .245745
+bezier .131424 .247574 .141795 .238043 .151765 .241935
+aline .15494 .241935
+aline .155575 .24257
+aline .156845 .24257
+aline .156845 .018415
+bezier .16069 .700018E-02 .174536 .102204E-01 .18415 .009525
+aline .18415 -.000635
+aline .1778 -.000635
+aline .177165 0
+aline .151765 0
+aline .15113 .000635
+aline .140335 .000635
+aline .1397 0
+aline .1143 0
+aline .113665 -.000635
+aline .107315 -.000635
+aline .107315 .009525
+bezier .116929 .102204E-01 .130775 .700019E-02 .13462 .018415
+aline .13462 .139065
+aline .133985 .1397
+aline .06096 .1397
+aline .060325 .139065
+aline .060325 .018415
+bezier .641704E-01 .700018E-02 .780158E-01 .102204E-01 .08763 .009525
+aline .08763 -.000635
+aline .08128 -.000635
+aline .080645 0
+aline .055245 0
+aline .05461 .000635
+aline .043815 .000635
+aline .04318 0
+aline .01778 0
+aline .017145 -.000635
+aline .010795 -.000635
+aline .010795 .009525
+bezier .204092E-01 .102204E-01 .342546E-01 .700019E-02 .0381 .018415
+aline .0381 .139065
+aline .037465 .1397
+aline .009525 .1397
+aline .009525 .14986
+aline .037465 .14986
+aline .0381 .150495
+aline .0381 .197485
+bezier .423021E-01 .227865 .758813E-01 .244481 .103505 .24638
+aline .120015 .24638
+closepath
+! end of curve
+
+! start of curve
+amove .104775 .23876
+bezier .825241E-01 .237582 .625034E-01 .219122 .059055 .197485
+aline .059055 .150495
+aline .05969 .14986
+aline .133985 .14986
+aline .13462 .150495
+aline .13462 .207645
+bezier .122189 .212402 .123546 .230878 .133622 .236311
+aline .128905 .23749
+aline .12827 .238125
+aline .125095 .238125
+aline .12446 .23876
+aline .11938 .23876
+aline .118745 .239395
+aline .10541 .239395
+aline .104775 .23876
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=14 !-------------- Beginning of new char.
+dfont wid=.833336 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .11811 .24638
+bezier .131255 .245011 .14449 .23836 .1524 .22733
+bezier .176237 .246275 .212132 .253884 .239395 .238125
+bezier .252365 .230027 .260917 .20955 .248285 .19812
+bezier .237927 .190333 .219718 .199335 .222885 .21209
+bezier .22174 .221138 .230826 .226976 .23876 .227965
+bezier .21162 .25349 .16138 .233494 .15621 .197485
+aline .15621 .150495
+aline .156845 .14986
+aline .20447 .14986
+bezier .220986 .151626 .237753 .152786 .254635 .15367
+aline .254635 .018415
+bezier .25848 .700018E-02 .272326 .102204E-01 .28194 .009525
+aline .28194 -.000635
+aline .27559 -.000635
+aline .274955 0
+aline .249555 0
+aline .24892 .000635
+aline .238125 .000635
+aline .23749 0
+aline .21209 0
+aline .211455 -.000635
+aline .205105 -.000635
+aline .205105 .009525
+bezier .214719 .102204E-01 .228565 .700018E-02 .23241 .018415
+aline .23241 .127635
+aline .231775 .12827
+aline .23114 .131445
+aline .229235 .135255
+aline .227965 .136525
+aline .225425 .137795
+aline .222885 .13843
+aline .21971 .139065
+aline .219075 .1397
+aline .158115 .1397
+aline .15748 .139065
+aline .15748 .018415
+bezier .161325 .700018E-02 .175171 .102204E-01 .184785 .009525
+aline .184785 -.000635
+aline .178435 -.000635
+aline .1778 0
+aline .1524 0
+aline .151765 .000635
+aline .14097 .000635
+aline .140335 0
+aline .114935 0
+aline .1143 -.000635
+aline .10795 -.000635
+aline .10795 .009525
+bezier .117564 .102204E-01 .13141 .700019E-02 .135255 .018415
+aline .135255 .139065
+aline .13462 .1397
+aline .06096 .1397
+aline .060325 .139065
+aline .060325 .018415
+bezier .641704E-01 .700018E-02 .780158E-01 .102204E-01 .08763 .009525
+aline .08763 -.000635
+aline .08128 -.000635
+aline .080645 0
+aline .055245 0
+aline .05461 .000635
+aline .043815 .000635
+aline .04318 0
+aline .01778 0
+aline .017145 -.000635
+aline .010795 -.000635
+aline .010795 .009525
+bezier .204092E-01 .102204E-01 .342546E-01 .700019E-02 .0381 .018415
+aline .0381 .139065
+aline .037465 .1397
+aline .009525 .1397
+aline .009525 .14986
+aline .037465 .14986
+aline .0381 .150495
+aline .0381 .197485
+bezier .440333E-01 .23312 .858003E-01 .248956 .11811 .24638
+closepath
+! end of curve
+
+! start of curve
+amove .104775 .23876
+bezier .826385E-01 .237299 .624699E-01 .21922 .059055 .197485
+aline .059055 .150495
+aline .05969 .14986
+aline .13462 .14986
+aline .135255 .150495
+aline .135255 .19558
+bezier .118894 .200102 .121716 .227026 .139065 .22733
+aline .14097 .227965
+bezier .131349 .236889 .117232 .241104 .104775 .23876
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=15 !-------------- Beginning of new char.
+dfont wid=.833336 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .118745 .24638
+bezier .131767 .245182 .146368 .240216 .153987 .228759
+bezier .179733 .249455 .215507 .249921 .24511 .240665
+aline .245745 .2413
+aline .24892 .2413
+aline .249555 .241935
+aline .25273 .241935
+aline .253365 .24257
+aline .254635 .24257
+aline .254635 .018415
+bezier .25848 .700018E-02 .272326 .102204E-01 .28194 .009525
+aline .28194 -.000635
+aline .27559 -.000635
+aline .274955 0
+aline .249555 0
+aline .24892 .000635
+aline .238125 .000635
+aline .23749 0
+aline .21209 0
+aline .211455 -.000635
+aline .205105 -.000635
+aline .205105 .009525
+bezier .214719 .102204E-01 .228565 .700018E-02 .23241 .018415
+aline .23241 .139065
+aline .231775 .1397
+aline .158115 .1397
+aline .15748 .139065
+aline .15748 .018415
+bezier .161325 .700018E-02 .175171 .102204E-01 .184785 .009525
+aline .184785 -.000635
+aline .178435 -.000635
+aline .1778 0
+aline .1524 0
+aline .151765 .000635
+aline .14097 .000635
+aline .140335 0
+aline .114935 0
+aline .1143 -.000635
+aline .10795 -.000635
+aline .10795 .009525
+bezier .117564 .102204E-01 .13141 .700019E-02 .135255 .018415
+aline .135255 .139065
+aline .13462 .1397
+aline .06096 .1397
+aline .060325 .139065
+aline .060325 .018415
+bezier .641704E-01 .700018E-02 .780158E-01 .102204E-01 .08763 .009525
+aline .08763 -.000635
+aline .08128 -.000635
+aline .080645 0
+aline .055245 0
+aline .05461 .000635
+aline .043815 .000635
+aline .04318 0
+aline .01778 0
+aline .017145 -.000635
+aline .010795 -.000635
+aline .010795 .009525
+bezier .204092E-01 .102204E-01 .342546E-01 .700019E-02 .0381 .018415
+aline .0381 .139065
+aline .037465 .1397
+aline .009525 .1397
+aline .009525 .14986
+aline .037465 .14986
+aline .0381 .150495
+aline .0381 .197485
+bezier .042403 .227762 .759583E-01 .244516 .103505 .24638
+aline .118745 .24638
+closepath
+! end of curve
+
+! start of curve
+amove .104775 .23876
+bezier .826385E-01 .237299 .624699E-01 .21922 .059055 .197485
+aline .059055 .150495
+aline .05969 .14986
+aline .13462 .14986
+aline .135255 .150495
+aline .135255 .197485
+bezier .139626 .204466 .127495 .204476 .127 .211455
+aline .126365 .213995
+aline .126365 .220345
+aline .127 .222885
+aline .12827 .225425
+aline .13208 .229235
+aline .13335 .22987
+aline .133985 .230505
+aline .137795 .231775
+aline .13843 .23241
+aline .137795 .233045
+aline .133985 .23495
+aline .12827 .236855
+aline .12573 .23749
+aline .122555 .238125
+aline .12192 .23876
+aline .11811 .23876
+aline .117475 .239395
+aline .10541 .239395
+aline .104775 .23876
+closepath
+! end of curve
+
+! start of curve
+amove .20193 .23876
+bezier .179794 .237299 .159625 .21922 .15621 .197485
+aline .15621 .150495
+aline .156845 .14986
+aline .231775 .14986
+aline .23241 .150495
+aline .23241 .207645
+bezier .219979 .212402 .221336 .230878 .231412 .236311
+aline .226695 .23749
+aline .22606 .238125
+aline .222885 .238125
+aline .22225 .23876
+aline .21717 .23876
+aline .216535 .239395
+aline .202565 .239395
+aline .20193 .23876
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=16 !-------------- Beginning of new char.
+dfont wid=.277779 hei=.430555 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .061595 .15367
+aline .061595 .018415
+bezier .064539 .756568E-02 .774217E-01 .983781E-02 .08636 .009525
+aline .08636 -.000635
+aline .080645 -.000635
+aline .08001 0
+aline .056515 0
+aline .05588 .000635
+aline .045085 .000635
+aline .04445 0
+aline .01905 0
+aline .018415 -.000635
+aline .012065 -.000635
+aline .012065 .009525
+bezier .216792E-01 .102204E-01 .355246E-01 .700019E-02 .03937 .018415
+aline .03937 .127
+aline .038735 .127635
+bezier .379249E-01 .140592 .022969 .139946 .013335 .1397
+aline .013335 .14986
+bezier .029366 .151264 .455716E-01 .152247 .061595 .15367
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=17 !-------------- Beginning of new char.
+dfont wid=.305557 hei=.430555 dep=.194445 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .07366 .15367
+aline .07366 -.026035
+bezier .072073 -.544231E-01 .437289E-01 -.794388E-01 .01524 -.07239
+bezier -.190766E-02 -.708461E-01 -.214368E-01 -.521988E-01 -.01016 -.034925
+bezier -.449389E-03 -.220667E-01 .223406E-01 -.322139E-01 .018415 -.04826
+aline .01778 -.0508
+aline .015875 -.05461
+aline .0127 -.057785
+aline .01143 -.05842
+aline .010795 -.059055
+aline .008255 -.060325
+aline .005715 -.06096
+bezier .019171 -.690429E-01 .404742E-01 -.684123E-01 .04572 -.0508
+aline .046355 -.04953
+aline .04826 -.043815
+aline .048895 -.041275
+aline .04953 -.0381
+aline .050165 -.037465
+aline .050165 -.03429
+aline .0508 -.033655
+aline .0508 -.02794
+aline .051435 -.027305
+aline .051435 .127
+aline .0508 .127635
+bezier .488352E-01 .141579 .320432E-01 .139336 .02159 .1397
+aline .02159 .14986
+bezier .038926 .15118 .563006E-01 .152407 .07366 .15367
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=18 !-------------- Beginning of new char.
+dfont wid=.500002 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .052705 .24384
+bezier .064951 .237035 .708985E-01 .222612 .080645 .212725
+bezier .878125E-01 .20307 .960291E-01 .193812 .10287 .18415
+aline .097155 .178435
+bezier .779142E-01 .194528 .056288 .209392 .038735 .22733
+aline .0381 .229235
+aline .0381 .234315
+aline .040005 .238125
+aline .043815 .241935
+aline .046355 .243205
+aline .047625 .24384
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=19 !-------------- Beginning of new char.
+dfont wid=.500002 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .12827 .24384
+bezier .139296 .240747 .141068 .22545 .13081 .220345
+bezier .113281 .206676 .961809E-01 .191907 .07874 .178435
+aline .073025 .18415
+bezier .888609E-01 .203632 .10347 .225508 .121285 .243205
+aline .12319 .24384
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=20 !-------------- Beginning of new char.
+dfont wid=.500002 hei=.628473 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .047625 .222885
+bezier .610951E-01 .214935 .742903E-01 .206604 .879475E-01 .198914
+bezier .102092 .206392 .11526 .21623 .12954 .222885
+aline .130175 .22225
+aline .13081 .22098
+aline .131445 .220345
+bezier .13766 .214801 .12664 .21244 .123825 .20828
+bezier .111509 .199587 .999746E-01 .18931 .08763 .180975
+bezier .724354E-01 .192891 .569895E-01 .204459 .04191 .216535
+aline .042545 .21717
+aline .04318 .21844
+aline .043815 .219075
+aline .04445 .220345
+aline .045085 .22098
+aline .04572 .22225
+aline .046355 .222885
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=21 !-------------- Beginning of new char.
+dfont wid=.500002 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .042545 .24257
+bezier .412016E-01 .211543 .765878E-01 .184296 .10541 .198755
+bezier .122576 .206006 .133172 .224717 .13335 .24257
+aline .140335 .24257
+bezier .142306 .21001 .112687 .175438 .07874 .18288
+bezier .517937E-01 .18823 .348678E-01 .216509 .03556 .24257
+aline .042545 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=22 !-------------- Beginning of new char.
+dfont wid=.500002 hei=.567777 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .15113 .20574
+aline .15113 .19558
+aline .024765 .19558
+aline .024765 .20574
+aline .15113 .20574
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=23 !-------------- Beginning of new char.
+dfont wid=.750002 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .136525 .25019
+bezier .159784 .248764 .174791 .218494 .158115 .20066
+bezier .14135 .179947 .102047 .188521 .098425 .2159
+bezier .960986E-01 .233058 .110447 .248341 .127 .25019
+closepath
+! end of curve
+
+! start of curve
+amove .12573 .24257
+bezier .100387 .241203 .100387 .198217 .12573 .19685
+bezier .138499 .193468 .155344 .200531 .156845 .215265
+aline .156845 .224155
+aline .15621 .22479
+aline .155575 .227965
+aline .154305 .231775
+aline .153035 .234315
+aline .14859 .23876
+aline .14351 .2413
+aline .14097 .241935
+aline .137795 .24257
+aline .13716 .243205
+aline .126365 .243205
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=24 !-------------- Beginning of new char.
+dfont wid=.444446 hei=0 dep=.170138 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .099695 -.00889
+aline .099695 -.019685
+bezier .114821 -.219284E-01 .133688 -.328534E-01 .12827 -.0508
+bezier .121615 -.685206E-01 .987928E-01 -.688578E-01 .08382 -.07112
+aline .073025 -.07112
+aline .07239 -.071755
+aline .04699 -.071755
+aline .04699 -.06477
+bezier .663783E-01 -.639793E-01 .874758E-01 -.672052E-01 .10287 -.05334
+bezier .112004 -.395868E-01 .951565E-01 -.258417E-01 .081915 -.026035
+aline .08128 -.0254
+aline .0762 -.0254
+aline .0762 -.00889
+aline .099695 -.00889
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=25 !-------------- Beginning of new char.
+dfont wid=.500003 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .10287 .24638
+bezier .131702 .244887 .161634 .218344 .15494 .18796
+bezier .151014 .165577 .127228 .151993 .109855 .145415
+bezier .162401 .127062 .187471 .480608E-01 .142875 .009525
+bezier .123779 -.006808 .877581E-01 -.125951E-01 .073025 .012065
+aline .071755 .015875
+bezier .066862 .269533E-01 .782925E-01 .396919E-01 .089535 .033655
+bezier .10028 .282799E-01 .965695E-01 .110665E-01 .08509 .009525
+bezier .102217 -.618023E-02 .128074 .743863E-02 .13462 .027305
+bezier .146787 .624773E-01 .140458 .106203 .11176 .132715
+bezier .102739 .140054 .909807E-01 .14198 .080645 .144145
+aline .080645 .147955
+aline .08255 .14986
+bezier .110775 .147518 .135571 .176593 .12954 .203835
+bezier .129565 .226055 .105167 .247225 .08382 .236855
+bezier .694475E-01 .231793 .06242 .21608 .060325 .202565
+aline .060325 -.000635
+aline .059055 -.000635
+aline .05842 0
+aline .051435 0
+aline .0508 .000635
+aline .043815 .000635
+aline .04318 0
+aline .01778 0
+aline .017145 -.000635
+aline .010795 -.000635
+aline .010795 .009525
+bezier .204092E-01 .102204E-01 .342546E-01 .700019E-02 .0381 .018415
+aline .0381 .139065
+aline .037465 .1397
+aline .010795 .1397
+aline .010795 .14986
+aline .037465 .14986
+aline .0381 .150495
+aline .0381 .201295
+bezier .412336E-01 .231501 .744948E-01 .24966 .10287 .24638
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=26 !-------------- Beginning of new char.
+dfont wid=.722224 hei=.430555 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .08509 .155575
+bezier .103486 .154007 .122234 .144637 .132715 .128905
+bezier .15521 .16114 .210316 .166629 .23241 .131445
+bezier .241998 .116769 .244109 .993317E-01 .24384 .08255
+aline .241935 .080645
+aline .1397 .080645
+bezier .135837 .050058 .151277 .830623E-02 .18669 .004445
+bezier .20925 .634005E-03 .231482 .201074E-01 .235585 .042545
+aline .23749 .04445
+aline .241935 .04445
+bezier .246866 .376351E-01 .239138 .283395E-01 .23622 .02159
+bezier .217279 -.107874E-01 .169929 -.118705E-01 .144145 .0127
+aline .142875 .013335
+aline .135255 .020955
+aline .13462 .022225
+aline .132715 .02413
+aline .13208 .0254
+aline .131128 .258763E-01
+bezier .110367 -.843414E-02 .588269E-01 -.135419E-01 .027305 .008255
+bezier .582276E-02 .256212E-01 .191032E-01 .059218 .04064 .06985
+bezier .634226E-01 .841196E-01 .907966E-01 .855451E-01 .11557 .08763
+bezier .117484 .109229 .114102 .135279 .092075 .145415
+bezier .744266E-01 .152566 .533329E-01 .147052 .040005 .13335
+bezier .544701E-01 .134115 .629193E-01 .115954 .05334 .10541
+bezier .447989E-01 .968174E-01 .267703E-01 .10067 .0254 .113665
+bezier .224891E-01 .139268 .498757E-01 .154325 .071755 .155575
+aline .08509 .155575
+closepath
+! end of curve
+
+! start of curve
+amove .18034 .147955
+bezier .152867 .143629 .139176 .111536 .140335 .08763
+aline .220345 .08763
+bezier .221371 .10679 .217324 .131458 .200025 .144145
+aline .196215 .14605
+aline .192405 .14732
+aline .18923 .147955
+aline .188595 .14859
+aline .180975 .14859
+closepath
+! end of curve
+
+! start of curve
+amove .107315 .079375
+bezier .811151E-01 .078389 .476256E-01 .651974E-01 .04318 .03556
+bezier .400614E-01 .128199E-01 .066674 -.399918E-02 .08636 .004445
+bezier .109648 .980507E-02 .12616 .365327E-01 .11684 .059055
+aline .11684 .06223
+aline .116205 .062865
+aline .116205 .06731
+aline .11557 .067945
+aline .11557 .079375
+aline .114935 .08001
+aline .10795 .08001
+aline .107315 .079375
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=27 !-------------- Beginning of new char.
+dfont wid=.777781 hei=.430555 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .09144 .155575
+bezier .113707 .153453 .134111 .139361 .14605 .12065
+bezier .163848 .1533 .211567 .168382 .2413 .142875
+bezier .25883 .128455 .263561 .103911 .26289 .08255
+aline .260985 .080645
+aline .15875 .080645
+bezier .154887 .050058 .170327 .830623E-02 .20574 .004445
+bezier .2283 .634008E-03 .250532 .201074E-01 .254635 .042545
+aline .25654 .04445
+aline .260985 .04445
+bezier .265916 .376351E-01 .258188 .283395E-01 .25527 .02159
+bezier .236329 -.107873E-01 .188979 -.118705E-01 .163195 .0127
+bezier .156099 .017115 .1509 .268892E-01 .14605 .031115
+bezier .125469 -.656954E-02 .694383E-01 -.017023 .0381 .013335
+bezier -.654635E-02 .489492E-01 .38406E-02 .129068 .057785 .150495
+aline .065405 .153035
+aline .070485 .154305
+aline .07366 .15494
+aline .078105 .15494
+aline .07874 .155575
+aline .09144 .155575
+closepath
+! end of curve
+
+! start of curve
+amove .08001 .147955
+bezier .516151E-01 .144788 .379198E-01 .112965 .03683 .088265
+bezier .357275E-01 .599777E-01 .384794E-01 .265098E-01 .064135 .00889
+bezier .884653E-01 -.786918E-02 .120336 .113775E-01 .12827 .037465
+bezier .138706 .702588E-01 .13927 .111363 .11303 .137795
+bezier .103576 .144712 .915502E-01 .150654 .08001 .147955
+closepath
+! end of curve
+
+! start of curve
+amove .19939 .147955
+bezier .171917 .143629 .158226 .111536 .159385 .08763
+aline .239395 .08763
+bezier .240421 .10679 .236374 .131458 .219075 .144145
+aline .215265 .14605
+aline .211455 .14732
+aline .20828 .147955
+aline .207645 .14859
+aline .200025 .14859
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=28 !-------------- Beginning of new char.
+dfont wid=.500002 hei=.527779 dep=.0972233 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .149225 .18542
+aline .150495 .184785
+aline .153035 .183515
+aline .154305 .182245
+bezier .147082 .168252 .13719 .15482 .131318 .140716
+bezier .175854 .108234 .173572 .320177E-01 .12446 .00508
+bezier .101807 -.831153E-02 .734762E-01 -.66646E-02 .051435 .004445
+bezier .043531 -.941378E-02 .359458E-01 -.235023E-01 .027305 -.03683
+aline .02667 -.036195
+aline .02286 -.03429
+aline .02159 -.03302
+bezier .289529E-01 -.187229E-01 .392868E-01 -.475773E-02 .045085 .009525
+bezier -.510325E-02 .429406E-01 .545408E-02 .128906 .061595 .150495
+bezier .821703E-01 .159609 .106063 .155636 .125095 .14605
+bezier .132994 .159336 .140094 .173199 .14859 .186055
+aline .149225 .18542
+closepath
+! end of curve
+
+! start of curve
+amove .081915 .147955
+bezier .523667E-01 .145053 .360035E-01 .112923 .03683 .08636
+bezier .350169E-01 .634549E-01 .357971E-01 .03782 .051435 .01905
+bezier .737667E-01 .582678E-01 .984357E-01 .976281E-01 .118745 .13716
+bezier .10825 .144953 .947456E-01 .150758 .081915 .147955
+closepath
+! end of curve
+
+! start of curve
+amove .123825 .12954
+bezier .102198 .905832E-01 .777906E-01 .522507E-01 .057658 .013081
+bezier .849415E-01 -.010217 .130703 .772945E-02 .136525 .04318
+bezier .141735 .071691 .14305 .104189 .12573 .12954
+aline .124778 .130016
+aline .123825 .12954
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=29 !-------------- Beginning of new char.
+dfont wid=.902781 hei=.683332 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .287655 .23876
+bezier .290936 .21219 .293899 .186282 .29718 .16002
+aline .288925 .16002
+bezier .28549 .181687 .284623 .212091 .26035 .222885
+bezier .251982 .226372 .243276 .227552 .23495 .2286
+aline .18415 .2286
+aline .183515 .227965
+aline .18034 .22733
+aline .178435 .226695
+aline .177165 .22606
+aline .17653 .22479
+aline .175895 .224155
+aline .17526 .221615
+aline .174625 .22098
+aline .174625 .120015
+aline .17526 .11938
+aline .21336 .11938
+bezier .225697 .119929 .240174 .126938 .240665 .141605
+aline .2413 .14224
+aline .2413 .14732
+aline .241935 .147955
+aline .241935 .160655
+aline .25019 .160655
+aline .25019 .067945
+aline .241935 .067945
+bezier .242511 .082726 .241294 .10413 .222885 .107315
+aline .21971 .10795
+aline .219075 .108585
+aline .213995 .108585
+aline .21336 .10922
+aline .17526 .10922
+aline .174625 .108585
+aline .174625 .017145
+aline .17526 .01651
+aline .175895 .01397
+aline .17653 .013335
+aline .177165 .012065
+aline .178435 .01143
+aline .18034 .010795
+aline .183515 .01016
+aline .18415 .009525
+aline .23495 .009525
+bezier .255263 .107871E-01 .280897 .187041E-01 .287655 .041275
+bezier .293457 .572341E-01 .296542 .738312E-01 .299085 .089535
+aline .30734 .089535
+bezier .302385 .594612E-01 .297698 .297019E-01 .292735 -.000635
+aline .11938 -.000635
+aline .11938 .009525
+bezier .128994 .102204E-01 .14284 .700018E-02 .146685 .018415
+aline .146685 .108585
+aline .14605 .10922
+aline .09017 .10922
+bezier .800634E-01 .823714E-01 .698198E-01 .550851E-01 .611981E-01 .276225E-01
+bezier .622979E-01 .147504E-01 .766999E-01 .903966E-02 .08763 .009525
+aline .08763 -.000635
+aline .080645 -.000635
+aline .08001 0
+aline .052705 0
+aline .05207 .000635
+aline .041275 .000635
+aline .04064 0
+aline .018415 0
+aline .01778 -.000635
+aline .012065 -.000635
+aline .012065 .009525
+bezier .293515E-01 .855055E-02 .049021 .180945E-01 .052705 .03683
+bezier .755383E-01 .100317 .976953E-01 .164275 .121285 .22733
+aline .11811 .227965
+aline .117475 .2286
+aline .090805 .2286
+aline .090805 .23876
+closepath
+! end of curve
+
+! start of curve
+amove .131445 .225425
+bezier .11907 .190252 .105096 .15396 .09398 .11938
+aline .14605 .11938
+aline .146685 .120015
+aline .146685 .217805
+aline .14605 .21844
+aline .145415 .220345
+aline .14478 .221615
+aline .14224 .224155
+aline .1397 .225425
+aline .137795 .22606
+aline .13462 .226695
+aline .133033 .227092
+aline .131907 .22681
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=30 !-------------- Beginning of new char.
+dfont wid=1.01389 hei=.683332 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .147955 .24638
+bezier .160971 .244724 .175367 .240701 .18796 .23876
+aline .32639 .23876
+bezier .329671 .21219 .332634 .186282 .335915 .16002
+aline .32766 .16002
+bezier .324506 .182719 .322256 .215218 .295275 .224155
+aline .29337 .22479
+aline .28829 .22606
+aline .285115 .226695
+aline .28448 .22733
+aline .28067 .22733
+aline .280035 .227965
+aline .273685 .227965
+aline .27305 .2286
+aline .216535 .2286
+aline .2159 .227965
+aline .212725 .22733
+aline .21082 .226695
+aline .20955 .22606
+aline .208915 .22479
+aline .20828 .224155
+aline .207645 .221615
+aline .20701 .22098
+aline .20701 .12954
+aline .207645 .128905
+aline .253365 .128905
+bezier .266672 .128929 .283159 .136368 .283845 .1524
+aline .28448 .153035
+aline .28448 .15748
+aline .285115 .158115
+aline .285115 .17018
+aline .29337 .17018
+aline .29337 .07747
+aline .285115 .07747
+bezier .286172 .092759 .283034 .114234 .26416 .11684
+aline .263525 .117475
+aline .26035 .117475
+aline .259715 .11811
+aline .254 .11811
+aline .253365 .118745
+aline .207645 .118745
+aline .20701 .11811
+aline .20701 .017145
+aline .207645 .01651
+aline .20828 .01397
+aline .208915 .013335
+aline .20955 .012065
+aline .21082 .01143
+aline .212725 .010795
+aline .2159 .01016
+aline .216535 .009525
+aline .272415 .009525
+bezier .294343 .103902E-01 .321634 .201484E-01 .32766 .045085
+bezier .332669 .599436E-01 .335473 .750302E-01 .33782 .089535
+aline .346075 .089535
+bezier .34112 .594612E-01 .336433 .297019E-01 .33147 -.000635
+aline .18796 -.000635
+bezier .160179 -.695962E-02 .129541 -.135154E-01 .1016 -.000635
+bezier .363239E-01 .247614E-01 .871479E-02 .107452 .034925 .169545
+bezier .519304E-01 .215187 .985912E-01 .249883 .147955 .24638
+closepath
+! end of curve
+
+! start of curve
+amove .135255 .23876
+bezier .863404E-01 .232163 .626107E-01 .177134 .05969 .133985
+bezier .580897E-01 .897891E-01 .06965 .398467E-01 .10668 .010795
+bezier .125484 -.285666E-02 .154476 -.766792E-02 .172085 .01016
+bezier .179704 .241535E-01 .179474 .391671E-01 .180975 .053975
+aline .180975 .18415
+bezier .178657 .200674 .181091 .221837 .165735 .23368
+aline .160655 .23622
+aline .15875 .236855
+aline .15621 .23749
+aline .153035 .238125
+aline .1524 .23876
+aline .14859 .23876
+aline .147955 .239395
+aline .13589 .239395
+aline .135255 .23876
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=31 !-------------- Beginning of new char.
+dfont wid=.777781 hei=.731944 dep=.0486116 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .22733 .25781
+bezier .230216 .255851 .235505 .253881 .23114 .25019
+bezier .223285 .239928 .216888 .228617 .208915 .21844
+bezier .272162 .164944 .266339 .526558E-01 .194945 .00889
+bezier .157161 -.015933 .106316 -.134536E-01 .070485 .01397
+bezier .623017E-01 .279345E-02 .546799E-01 -.878784E-02 .04699 -.02032
+bezier .042783 -.179727E-01 .372368E-01 -.149434E-01 .04318 -.010795
+bezier .490882E-01 -.16955E-03 .587652E-01 .953147E-02 .062865 .02032
+bezier -.159513E-02 .755238E-01 .877621E-02 .191405 .08382 .23241
+bezier .120684 .254117 .16926 .250304 .202565 .22352
+bezier .210231 .235281 .21844 .246651 .22606 .258445
+closepath
+! end of curve
+
+! start of curve
+amove .12954 .23876
+bezier .882314E-01 .235563 .589821E-01 .196942 .053975 .15748
+bezier .481468E-01 .11663 .475609E-01 .697096E-01 .07239 .03302
+bezier .113839 .922796E-01 .153653 .152717 .194945 .21209
+bezier .17878 .230286 .153362 .241912 .12954 .23876
+closepath
+! end of curve
+
+! start of curve
+amove .198755 .2032
+bezier .159382 .143494 .116446 .845282E-01 .07874 .024765
+bezier .106935 -.700215E-02 .157507 -.980595E-02 .188595 .01905
+bezier .225553 .054929 .225694 .111499 .219075 .15748
+bezier .215963 .173976 .210932 .191388 .200343 .204311
+aline .19939 .203835
+aline .198755 .2032
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=32 !-------------- Beginning of new char.
+dfont wid=.277779 hei=.430555 dep=0 italic=0
+dfont fby="L" kadd=-.319446
+dfont fby="l" kadd=-.277779
+set path ! start of curve
+newpath
+! start of curve
+amove .0889 .13462
+aline .089535 .13335
+aline .09144 .127635
+bezier .823798E-01 .121291 .681118E-01 .118807 .05715 .113665
+bezier .424516E-01 .108599 .280184E-01 .102892 .013335 .09779
+aline .0127 .099695
+aline .012065 .100965
+aline .010795 .104775
+aline .01016 .106045
+aline .01016 .107315
+bezier .035722 .117849 .623434E-01 .126572 .088265 .136525
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=33 !-------------- Beginning of new char.
+dfont wid=.277779 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .052705 .25019
+aline .055245 .249555
+bezier .682672E-01 .245752 .068926 .230705 .06604 .220345
+bezier .619886E-01 .168747 .057971 .117135 .052705 .06604
+aline .051435 .065405
+aline .04699 .065405
+aline .04572 .06604
+bezier .400015E-01 .122414 .354758E-01 .179283 .031115 .23622
+aline .03175 .23876
+aline .032385 .240665
+aline .03302 .2413
+aline .033655 .24257
+aline .0381 .247015
+aline .04318 .249555
+aline .04572 .25019
+closepath
+! end of curve
+
+! start of curve
+amove .052705 .03556
+bezier .697695E-01 .326979E-01 .726319E-01 .697633E-02 .056515 .000635
+bezier .398275E-01 -.763559E-02 .221957E-01 .016007 .03556 .02921
+aline .036195 .03048
+aline .037465 .031115
+aline .038735 .032385
+aline .040005 .03302
+aline .04064 .033655
+aline .04191 .03429
+aline .043815 .034925
+aline .04572 .03556
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=34 !-------------- Beginning of new char.
+dfont wid=.500002 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .033655 .24257
+bezier .558799E-01 .23598 .545813E-01 .207607 .05207 .189865
+bezier .484531E-01 .169467 .037785 .150558 .02159 .137795
+aline .01905 .137795
+aline .017145 .1397
+aline .017145 .142875
+bezier .036212 .16045 .499133E-01 .188232 .045085 .21336
+bezier .364368E-01 .200981 .139196E-01 .205497 .012065 .22098
+aline .012065 .227965
+aline .0127 .230505
+aline .013335 .23241
+aline .014605 .23495
+aline .01905 .239395
+aline .02032 .24003
+aline .020955 .240665
+aline .022225 .2413
+aline .02413 .241935
+aline .02667 .24257
+closepath
+! end of curve
+
+! start of curve
+amove .102235 .24257
+bezier .12446 .23598 .123161 .207607 .12065 .189865
+bezier .117033 .169467 .106365 .150558 .09017 .137795
+aline .08763 .137795
+aline .085725 .1397
+aline .085725 .142875
+bezier .104792 .16045 .118493 .188232 .113665 .21336
+bezier .105017 .200981 .824996E-01 .205497 .080645 .22098
+aline .080645 .227965
+aline .08128 .230505
+aline .081915 .23241
+aline .083185 .23495
+aline .08763 .239395
+aline .0889 .24003
+aline .089535 .240665
+aline .090805 .2413
+aline .09271 .241935
+aline .09525 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=35 !-------------- Beginning of new char.
+dfont wid=.833336 hei=.694445 dep=.194443 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .147955 .24257
+aline .149225 .241935
+aline .150495 .2413
+aline .151765 .24003
+aline .153035 .23749
+bezier .146117 .200832 .132875 .164734 .12573 .12827
+aline .1905 .12827
+bezier .200961 .165421 .209689 .203197 .22098 .24003
+aline .22225 .2413
+aline .22479 .24257
+aline .2286 .24257
+aline .23114 .2413
+aline .23241 .24003
+aline .23368 .23749
+bezier .226762 .200832 .21352 .164734 .206375 .12827
+aline .267335 .12827
+aline .269875 .127
+aline .271145 .12573
+aline .272415 .12319
+aline .272415 .11938
+aline .271145 .11684
+aline .269875 .11557
+aline .267335 .1143
+aline .201295 .1143
+aline .20066 .11176
+aline .200025 .109855
+aline .196215 .094615
+aline .19558 .09271
+aline .19177 .07747
+aline .191135 .075565
+aline .187563 .612775E-01
+aline .18796 .05969
+aline .267335 .05969
+aline .269875 .05842
+aline .271145 .05715
+aline .272415 .05461
+aline .272415 .0508
+aline .271145 .04826
+aline .269875 .04699
+aline .267335 .04572
+aline .18288 .04572
+bezier .172396 .836429E-02 .163675 -.296257E-01 .1524 -.066675
+aline .15113 -.067945
+aline .14859 -.069215
+aline .14478 -.069215
+aline .14224 -.067945
+aline .14097 -.066675
+aline .1397 -.064135
+bezier .146602 -.027261 .159847 .904754E-02 .167005 .04572
+aline .102235 .04572
+bezier .917511E-01 .836429E-02 .830296E-01 -.296257E-01 .071755 -.066675
+aline .070485 -.067945
+aline .067945 -.069215
+aline .064135 -.069215
+aline .061595 -.067945
+aline .060325 -.066675
+aline .059055 -.064135
+bezier .659565E-01 -.027261 .792022E-01 .904745E-02 .08636 .04572
+aline .0254 .04572
+aline .02286 .04699
+aline .02159 .04826
+aline .02032 .0508
+aline .02032 .05461
+aline .02159 .05715
+aline .02286 .05842
+aline .0254 .05969
+aline .09144 .05969
+aline .092075 .06223
+aline .09271 .064135
+aline .09652 .079375
+aline .097155 .08128
+aline .100965 .09652
+aline .1016 .098425
+aline .105172 .112713
+aline .104775 .1143
+aline .0254 .1143
+aline .02286 .11557
+aline .02159 .11684
+aline .02032 .11938
+aline .02032 .12319
+aline .02159 .12573
+aline .02286 .127
+aline .0254 .12827
+aline .109855 .12827
+bezier .120316 .165421 .129044 .203197 .140335 .24003
+aline .141605 .2413
+aline .142875 .241935
+aline .144145 .24257
+closepath
+! end of curve
+
+! start of curve
+amove .120015 .11176
+aline .11938 .109855
+aline .11557 .094615
+aline .114935 .09271
+aline .111125 .07747
+aline .11049 .075565
+aline .106918 .612775E-01
+aline .107315 .05969
+aline .172085 .05969
+aline .17272 .06223
+aline .173355 .064135
+aline .177165 .079375
+aline .1778 .08128
+aline .18161 .09652
+aline .182245 .098425
+aline .185817 .112713
+aline .18542 .1143
+aline .12065 .1143
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=36 !-------------- Beginning of new char.
+dfont wid=.500002 hei=.75 dep=.0555553 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .093345 .262255
+aline .093345 .247015
+bezier .121958 .245614 .151965 .226382 .15494 .19558
+bezier .156277 .185805 .157295 .171468 .14478 .168275
+bezier .130633 .163131 .118109 .17988 .12573 .192405
+aline .130175 .19685
+aline .133985 .198755
+aline .136525 .19939
+aline .142875 .19939
+aline .144145 .198967
+bezier .14466 .205835 .137345 .216916 .13081 .22225
+bezier .120482 .230914 .106264 .235869 .093345 .235585
+aline .093345 .14097
+bezier .125376 .135576 .154171 .108773 .15494 .07493
+bezier .160743 .390944E-01 .132797 -.15963E-02 .094615 -.00381
+aline .093345 -.00508
+aline .093345 -.02032
+aline .083185 -.02032
+aline .083185 -.00508
+bezier .554214E-01 -.358057E-02 .273231E-01 .147963E-01 .022225 .043815
+bezier .201995E-01 .556545E-01 .159255E-01 .074515 .03175 .07874
+bezier .474729E-01 .841608E-01 .594249E-01 .622957E-01 .047625 .051435
+aline .046355 .0508
+aline .045085 .04953
+aline .042545 .04826
+aline .040005 .047625
+aline .032385 .047625
+aline .314325E-01 .481013E-01
+bezier .327527E-01 .267269E-01 .536644E-01 .951153E-02 .07493 .006985
+aline .075565 .00635
+aline .080645 .00635
+aline .081915 .592665E-02
+aline .083185 .00635
+aline .083185 .111125
+bezier .467025E-01 .115167 .160215E-01 .148162 .02032 .18542
+bezier .223548E-01 .217856 .515571E-01 .244224 .083185 .247015
+aline .083185 .262255
+aline .093345 .262255
+closepath
+! end of curve
+
+! start of curve
+amove .081915 .235585
+bezier .488088E-01 .234438 .239032E-01 .192261 .04572 .1651
+bezier .536202E-01 .152311 .688906E-01 .145045 .083185 .14351
+aline .083185 .235585
+aline .08255 .23622
+aline .081915 .235585
+closepath
+! end of curve
+
+! start of curve
+amove .093345 .10795
+aline .093345 .006985
+bezier .125765 .752108E-02 .148638 .487921E-01 .133985 .07747
+bezier .12719 .939539E-01 .111175 .106564 .093345 .10795
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=37 !-------------- Beginning of new char.
+dfont wid=.833336 hei=.75 dep=.0555553 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .075565 .262255
+bezier .954683E-01 .258819 .105232 .237893 .12446 .23241
+bezier .16079 .21427 .209529 .225708 .231775 .260985
+bezier .240166 .266936 .247733 .253902 .24003 .248285
+bezier .180349 .159167 .12131 .695857E-01 .06096 -.01905
+bezier .525695E-01 -.250007E-01 .045002 -.119674E-01 .052705 -.00635
+bezier .104117 .724246E-01 .159132 .15043 .208915 .229235
+bezier .178976 .210826 .139922 .214357 .110278 .230717
+bezier .121687 .19676 .120867 .15157 .09017 .127
+bezier .649215E-01 .110041 .342572E-01 .133091 .026035 .158115
+bezier .014349 .191286 .190065E-01 .235249 .0508 .25654
+aline .05715 .259715
+aline .06096 .260985
+aline .0635 .26162
+aline .066675 .26162
+aline .06731 .262255
+aline .075565 .262255
+closepath
+! end of curve
+
+! start of curve
+amove .067945 .254635
+bezier .474951E-01 .247893 .430306E-01 .22237 .041275 .20447
+bezier .411052E-01 .178997 .396747E-01 .149063 .061595 .131445
+bezier .796835E-01 .120796 .966937E-01 .140902 .102235 .156845
+bezier .113759 .187731 .111045 .22749 .08509 .250825
+aline .08001 .253365
+aline .078105 .254
+aline .075565 .254635
+aline .07493 .25527
+aline .06858 .25527
+closepath
+! end of curve
+
+! start of curve
+amove .10922 .23114
+aline .109855 .230505
+aline .11049 .23114
+aline .109855 .231775
+aline .10922 .23114
+closepath
+! end of curve
+
+! start of curve
+amove .208915 .229235
+aline .20955 .2286
+aline .210185 .229235
+aline .20955 .22987
+aline .208915 .229235
+closepath
+! end of curve
+
+! start of curve
+amove .23114 .12065
+bezier .258937 .115339 .270626 .835663E-01 .272415 .059055
+bezier .274195 .295698E-01 .266283 -.915768E-02 .234315 -.019685
+bezier .20062 -.255913E-01 .176591 .115949E-01 .17653 .041275
+bezier .172563 .071609 .185731 .111052 .219075 .120015
+aline .22225 .120015
+aline .222885 .12065
+closepath
+! end of curve
+
+! start of curve
+amove .22352 .11303
+bezier .20307 .106288 .198606 .807653E-01 .19685 .062865
+bezier .19668 .373922E-01 .19525 .745769E-02 .21717 -.01016
+bezier .235258 -.208095E-01 .252269 -.703499E-03 .25781 .01524
+bezier .269334 .461257E-01 .26662 .858849E-01 .240665 .10922
+aline .235585 .11176
+aline .23368 .112395
+aline .23114 .11303
+aline .230505 .113665
+aline .224155 .113665
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=38 !-------------- Beginning of new char.
+dfont wid=.777781 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .109855 .25019
+bezier .13268 .244447 .137273 .216174 .13462 .196215
+bezier .127192 .171532 .10849 .153355 .929217E-01 .133985
+bezier .106204 .989446E-01 .128704 .693925E-01 .150495 .040005
+bezier .171526 .647653E-01 .187551 .935477E-01 .2032 .12192
+bezier .204049 .135129 .188369 .140222 .1778 .1397
+aline .1778 .14986
+aline .18542 .14986
+aline .186055 .149225
+aline .2159 .149225
+aline .216535 .14859
+aline .227965 .14859
+aline .2286 .149225
+aline .24892 .149225
+aline .249555 .14986
+aline .254635 .14986
+aline .254635 .1397
+bezier .233323 .140954 .213004 .127332 .205105 .107315
+bezier .190469 .818069E-01 .173857 .552908E-01 .156845 .03302
+bezier .17182 .150796E-01 .195278 -.598524E-02 .21971 .00508
+bezier .23436 .107814E-01 .244589 .026044 .244475 .041275
+aline .25273 .041275
+bezier .254229 .123194E-01 .224612 -.013955 .196215 -.00762
+bezier .174809 -.769284E-02 .156797 .740326E-02 .14097 .01778
+bezier .110254 -.147926E-01 .480984E-01 -.200062E-01 .02159 .02032
+bezier .812882E-02 .418338E-01 .168967E-01 .695178E-01 .036195 .084455
+aline .03683 .085725
+aline .046355 .09525
+aline .04699 .09652
+aline .056515 .106045
+aline .05715 .107315
+aline .066675 .11684
+aline .06731 .11811
+aline .07112 .12192
+bezier .062206 .153066 .519097E-01 .185808 .061595 .217805
+bezier .678145E-01 .234141 .828729E-01 .248012 .10033 .25019
+closepath
+! end of curve
+
+! start of curve
+amove .102235 .24257
+bezier .875406E-01 .240632 .818857E-01 .224106 .079375 .21209
+bezier .783324E-01 .187596 .818432E-01 .165484 .09017 .14224
+bezier .109067 .164509 .135298 .191999 .12446 .22352
+bezier .122655 .234091 .11443 .244768 .10287 .243205
+closepath
+! end of curve
+
+! start of curve
+amove .073025 .113665
+bezier .589917E-01 .996771E-01 .444308E-01 .831877E-01 .04445 .06223
+bezier .416627E-01 .394994E-01 .506217E-01 .715253E-02 .076835 .001905
+bezier .979042E-01 .104403E-02 .119803 .997959E-02 .135096 .244475E-01
+bezier .111075 .517265E-01 .902539E-01 .817143E-01 .746125E-01 .114776
+aline .07366 .1143
+aline .073025 .113665
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=39 !-------------- Beginning of new char.
+dfont wid=.277779 hei=.694445 dep=0 italic=0
+dfont fby=33 kadd=.111112
+dfont fby=39 ligrep=34
+dfont fby="?" kadd=.111112
+set path ! start of curve
+newpath
+! start of curve
+amove .052705 .24257
+bezier .749299E-01 .23598 .736314E-01 .207607 .07112 .189865
+bezier .675031E-01 .169467 .056835 .150558 .04064 .137795
+aline .0381 .137795
+aline .036195 .1397
+aline .036195 .142875
+bezier .055262 .16045 .689633E-01 .188232 .064135 .21336
+bezier .554868E-01 .200981 .329696E-01 .205497 .031115 .22098
+aline .031115 .227965
+aline .03175 .230505
+aline .032385 .23241
+aline .033655 .23495
+aline .0381 .239395
+aline .03937 .24003
+aline .040005 .240665
+aline .041275 .2413
+aline .04318 .241935
+aline .04572 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=40 !-------------- Beginning of new char.
+dfont wid=.38889 hei=.75 dep=.25 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .1143 .262255
+aline .114935 .26162
+aline .116205 .260985
+aline .116205 .25781
+bezier .734519E-01 .218132 .569796E-01 .156693 .05461 .102235
+aline .05461 .071755
+bezier .571699E-01 .176727E-01 .730011E-01 -.443858E-01 .116205 -.083185
+aline .116205 -.086995
+aline .114935 -.08763
+bezier .106691 -.893241E-01 .101409 -.782218E-01 .094615 -.074295
+bezier .397469E-01 -.200791E-01 .273239E-01 .641349E-01 .038735 .135255
+bezier .469981E-01 .184695 .709492E-01 .232283 .111125 .262255
+aline .1143 .262255
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=")" !-------------- Beginning of new char.
+dfont wid=.38889 hei=.75 dep=.25 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .0254 .262255
+bezier .758703E-01 .225461 .099176 .159526 .1016 .10033
+bezier .104517 .335801E-01 .848224E-01 -.040313 .03048 -.084455
+aline .02921 -.08509
+aline .027305 -.086995
+aline .026035 -.08763
+aline .0254 -.088265
+aline .022225 -.088265
+aline .02032 -.08636
+aline .02032 -.08382
+bezier .630731E-01 -.441424E-01 .795454E-01 .172973E-01 .081915 .071755
+aline .081915 .102235
+bezier .795454E-01 .156693 .630731E-01 .218132 .02032 .25781
+aline .02032 .26035
+aline .022225 .262255
+aline .0254 .262255
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="*" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.75 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .09017 .262255
+aline .092075 .26162
+aline .093345 .260985
+aline .095885 .258445
+bezier .989771E-01 .246514 .939208E-01 .234548 .094615 .22225
+aline .09398 .221615
+aline .09398 .215265
+aline .093345 .21463
+aline .093345 .20828
+aline .09271 .207645
+aline .09271 .201295
+aline .092075 .20066
+aline .092075 .194945
+bezier .10808 .204253 .124181 .2189 .14097 .229235
+bezier .153168 .232267 .157037 .212536 .14478 .210185
+bezier .129075 .202362 .110756 .195497 .969433E-01 .186478
+bezier .114763 .177069 .13441 .170306 .15113 .159385
+bezier .157637 .149452 .142304 .13864 .135255 .14859
+bezier .120717 .158137 .106125 .170961 .092075 .17907
+bezier .932413E-01 .158532 .959887E-01 .138648 .097155 .11811
+bezier .936637E-01 .105931 .736161E-01 .113095 .079375 .12446
+bezier .797372E-01 .14308 .083912 .16151 .083185 .179705
+bezier .672198E-01 .167895 .515424E-01 .155685 .034925 .14478
+bezier .227268E-01 .141748 .188584E-01 .161479 .031115 .16383
+bezier .468205E-01 .171653 .651388E-01 .178518 .789517E-01 .187537
+bezier .611321E-01 .196946 .414851E-01 .203709 .024765 .21463
+bezier .182581E-01 .224563 .335913E-01 .235375 .04064 .225425
+bezier .551776E-01 .215878 .697697E-01 .203054 .08382 .194945
+bezier .826537E-01 .215483 .799063E-01 .235367 .07874 .255905
+aline .08001 .258445
+aline .08255 .260985
+aline .08382 .26162
+aline .085725 .262255
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="+" !-------------- Beginning of new char.
+dfont wid=.777781 hei=.583334 dep=.083334 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .13843 .203835
+aline .1397 .2032
+aline .14097 .202565
+aline .14224 .201295
+aline .14351 .198755
+aline .14351 .094615
+aline .144145 .09398
+aline .24765 .09398
+aline .25019 .09271
+aline .25146 .09144
+aline .25273 .0889
+aline .25273 .08509
+aline .25146 .08255
+aline .25019 .08128
+aline .24765 .08001
+aline .144145 .08001
+aline .14351 .079375
+aline .14351 -.024765
+aline .14224 -.027305
+aline .14097 -.028575
+aline .13843 -.029845
+aline .13462 -.029845
+aline .13208 -.028575
+aline .13081 -.027305
+aline .12954 -.024765
+aline .12954 .079375
+aline .128905 .08001
+aline .0254 .08001
+aline .02286 .08128
+aline .02159 .08255
+aline .02032 .08509
+aline .02032 .0889
+aline .02159 .09144
+aline .02286 .09271
+aline .0254 .09398
+aline .128905 .09398
+aline .12954 .094615
+aline .12954 .198755
+aline .13081 .201295
+aline .13208 .202565
+aline .13335 .2032
+aline .13462 .203835
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="," !-------------- Beginning of new char.
+dfont wid=.277779 hei=.105556 dep=.194445 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .052705 .03556
+bezier .744693E-01 .286338E-01 .719298E-01 .35721E-03 .06985 -.017145
+bezier .06628 -.372217E-01 .563972E-01 -.563946E-01 .04064 -.069215
+aline .0381 -.069215
+aline .036195 -.06731
+bezier .038064 -.588526E-01 .476945E-01 -.533093E-01 .051435 -.045085
+bezier .600433E-01 -.294045E-01 .660684E-01 -.116185E-01 .0635 .005715
+bezier .525706E-01 -.884516E-02 .265468E-01 .276842E-02 .031115 .020955
+aline .03175 .023495
+aline .032385 .0254
+aline .033655 .02794
+aline .0381 .032385
+aline .03937 .03302
+aline .040005 .033655
+aline .041275 .03429
+aline .04318 .034925
+aline .04572 .03556
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="-" !-------------- Beginning of new char.
+dfont wid=.333334 hei=.430555 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .09652 .084455
+aline .09652 .06477
+aline .004445 .06477
+aline .004445 .084455
+aline .09652 .084455
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="." !-------------- Beginning of new char.
+dfont wid=.277779 hei=.105556 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .05207 .03556
+bezier .707024E-01 .033691 .728738E-01 .436431E-02 .05461 0
+bezier .370705E-01 -.636072E-02 .226261E-01 .181321E-01 .036195 .03048
+aline .037465 .031115
+aline .03937 .03302
+aline .04191 .03429
+aline .043815 .034925
+aline .046355 .03556
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="/" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.75 dep=.25 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .150495 .262255
+aline .151765 .26162
+aline .153035 .260985
+aline .154305 .259715
+aline .155575 .257175
+bezier .13148 .181361 .101704 .106588 .075565 .031115
+bezier .604949E-01 -.801486E-02 .483176E-01 -.487238E-01 .03175 -.086995
+aline .02921 -.088265
+aline .0254 -.088265
+aline .02286 -.086995
+aline .02159 -.085725
+aline .02032 -.083185
+bezier .444152E-01 -.737131E-02 .741909E-01 .674023E-01 .10033 .142875
+bezier .1154 .182005 .127577 .222714 .144145 .260985
+aline .145415 .26162
+aline .146685 .262255
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="0" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.644444 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .09398 .233045
+bezier .133692 .230449 .156689 .189171 .15875 .153035
+aline .159385 .1524
+aline .159385 .14732
+aline .16002 .146685
+aline .16002 .14097
+aline .160655 .140335
+aline .160655 .12954
+aline .16129 .128905
+aline .16129 .09398
+bezier .159898 .579694E-01 .150442 .966101E-02 .11049 -.004445
+bezier .763621E-01 -.180143E-01 .356555E-01 .309333E-02 .024765 .0381
+bezier .174801E-01 .565307E-01 .161282E-01 .753836E-01 .014605 .09398
+aline .014605 .128905
+bezier .161011E-01 .164943 .245434E-01 .212661 .0635 .2286
+aline .07112 .23114
+aline .07366 .231775
+aline .076835 .23241
+aline .08128 .23241
+aline .081915 .233045
+aline .09398 .233045
+closepath
+! end of curve
+
+! start of curve
+amove .08255 .225425
+bezier .554326E-01 .22189 .460235E-01 .191852 .04445 .169545
+aline .04445 .161925
+aline .043815 .16129
+aline .043815 .147955
+aline .04318 .14732
+aline .04318 .08382
+bezier .454991E-01 .573397E-01 .431303E-01 .025907 .06604 .00635
+bezier .880447E-01 -.119819E-01 .120727 .551077E-02 .126365 .03175
+bezier .131485 .488626E-01 .131326 .660718E-01 .132715 .08382
+aline .132715 .14732
+bezier .130646 .172107 .131982 .203129 .108585 .21971
+aline .100965 .22352
+aline .09906 .224155
+aline .09652 .22479
+aline .093345 .225425
+aline .09271 .22606
+aline .083185 .22606
+aline .08255 .225425
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="1" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.644444 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .100965 .233045
+aline .10287 .23114
+aline .10287 .019685
+bezier .106079 .961816E-02 .1178 .108627E-01 .12573 .009525
+aline .146685 .009525
+aline .146685 -.000635
+aline .13716 -.000635
+aline .136525 0
+aline .099695 0
+aline .09906 .000635
+aline .081915 .000635
+aline .08128 0
+aline .04445 0
+aline .043815 -.000635
+aline .03429 -.000635
+aline .03429 .009525
+aline .055245 .009525
+bezier .631752E-01 .108627E-01 .748957E-01 .961816E-02 .078105 .019685
+aline .078105 .208915
+bezier .637256E-01 .203353 .477358E-01 .200103 .032385 .200025
+aline .032385 .210185
+bezier .542257E-01 .210766 .791067E-01 .215849 .09525 .233045
+aline .100965 .233045
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="2" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.644444 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .090805 .233045
+bezier .123156 .231686 .155629 .206131 .15748 .172085
+bezier .161783 .127708 .122322 .983985E-01 .09271 .07239
+aline .08128 .06096
+aline .08001 .060325
+aline .05969 .040005
+aline .05842 .03937
+aline .045085 .026035
+aline .04572 .0254
+aline .121285 .0254
+aline .12192 .026035
+aline .135255 .026035
+aline .13589 .02667
+aline .1397 .02667
+bezier .146557 .036467 .146884 .488981E-01 .149225 .05969
+aline .15748 .05969
+bezier .153975 .039666 .151467 .196523E-01 .147955 -.000635
+aline .018415 -.000635
+aline .018415 .00762
+bezier .515094E-01 .487822E-01 .936715E-01 .834089E-01 .11811 .13081
+bezier .131388 .158659 .129166 .195442 .103505 .2159
+bezier .777929E-01 .23358 .386173E-01 .215712 .032385 .186055
+bezier .478656E-01 .191488 .610748E-01 .171371 .05207 .158115
+bezier .435764E-01 .145179 .020431 .149228 .018415 .1651
+bezier .145182E-01 .204096 .525404E-01 .238146 .090805 .233045
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="3" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.644444 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .09398 .233045
+bezier .121103 .231751 .156629 .210355 .150495 .17907
+bezier .149319 .151935 .126416 .131511 .102235 .12319
+bezier .140005 .117761 .171035 .782231E-01 .158115 .04064
+bezier .140293 -.159153E-01 .055501 -.251883E-01 .022225 .02159
+bezier .139742E-01 .350676E-01 .925045E-02 .598608E-01 .028575 .06604
+bezier .437191E-01 .711926E-01 .588536E-01 .557393E-01 .05334 .04064
+bezier .050512 .310836E-01 .398596E-01 .273451E-01 .031115 .027305
+bezier .450606E-01 .646421E-02 .742866E-01 -.404775E-02 .09779 .003175
+bezier .126322 .166464E-01 .12789 .053919 .12319 .08001
+bezier .120166 .975957E-01 .108306 .114571 .09017 .11811
+aline .06096 .11811
+aline .060325 .118745
+aline .059055 .11938
+aline .059055 .123825
+bezier .740442E-01 .128001 .942148E-01 .123313 .104775 .139065
+bezier .120803 .161421 .127368 .196377 .10668 .217805
+bezier .857602E-01 .231835 .560438E-01 .223226 .040005 .205105
+aline .03937 .203835
+aline .038735 .2032
+bezier .483045E-01 .203746 .612709E-01 .197866 .05969 .186055
+bezier .063148 .171419 .414178E-01 .161257 .03048 .17145
+bezier .170226E-01 .186474 .285823E-01 .210904 .043815 .220345
+bezier .583198E-01 .231264 .765012E-01 .233729 .09398 .233045
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="4" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.644444 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .127635 .236855
+aline .128905 .23622
+aline .12954 .235585
+aline .130175 .234315
+aline .130175 .06858
+aline .13081 .067945
+aline .165735 .067945
+aline .165735 .057785
+aline .13081 .057785
+aline .130175 .05715
+aline .130175 .019685
+bezier .131458 .108566E-01 .141316 .105225E-01 .147955 .009525
+aline .164465 .009525
+aline .164465 -.000635
+aline .15621 -.000635
+aline .155575 0
+aline .125095 0
+aline .12446 .000635
+aline .109855 .000635
+aline .10922 0
+aline .07874 0
+aline .078105 -.000635
+aline .06985 -.000635
+aline .06985 .009525
+aline .08636 .009525
+bezier .929987E-01 .105225E-01 .102857 .108566E-01 .10414 .019685
+aline .10414 .05715
+aline .103505 .057785
+aline .01016 .057785
+bezier .76743E-02 .726746E-01 .212238E-01 .824405E-01 .027305 .094615
+bezier .590423E-01 .141826 .089039 .190764 .12192 .236855
+closepath
+! end of curve
+
+! start of curve
+amove .104775 .19812
+bezier .07692 .154743 .462453E-01 .111569 .02032 .067945
+aline .10541 .067945
+aline .106045 .06858
+aline .106045 .198755
+aline .10541 .19939
+aline .104775 .19812
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="5" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.644444 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .04064 .233045
+bezier .724086E-01 .217835 .107931 .217835 .1397 .233045
+aline .14224 .233045
+aline .142875 .23241
+aline .144145 .231775
+bezier .143781 .22128 .131988 .215136 .125095 .20828
+bezier .102627 .191002 .714045E-01 .190033 .046355 .197485
+aline .046355 .12954
+bezier .563104E-01 .136877 .703793E-01 .146198 .084455 .146685
+bezier .123703 .151526 .155946 .114068 .15748 .07747
+bezier .162518 .362089E-01 .1295 -.533006E-02 .08763 -.008255
+bezier .478801E-01 -.138722E-01 .855705E-02 .286528E-01 .020955 .06731
+bezier .030607 .812163E-01 .558402E-01 .727591E-01 .052705 .055245
+bezier .528361E-01 .431227E-01 .377739E-01 .379986E-01 .293688E-01 .403225E-01
+bezier .378604E-01 .870953E-02 .789064E-01 -.119408E-01 .106045 .009525
+bezier .132398 .331584E-01 .128388 .728821E-01 .12446 .103505
+bezier .121172 .122209 .105939 .143872 .08509 .139065
+bezier .672519E-01 .138257 .518241E-01 .126023 .042545 .11176
+aline .038735 .11176
+aline .037465 .112395
+aline .03683 .11303
+aline .036195 .1143
+aline .036195 .23114
+aline .0381 .233045
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="6" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.644444 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .1143 .233045
+bezier .137564 .232881 .160071 .207671 .149225 .184785
+bezier .139647 .172225 .115989 .180804 .120015 .197485
+bezier .120702 .207185 .131126 .211179 .139065 .21082
+bezier .118295 .236805 .763746E-01 .223412 .062865 .196215
+bezier .481267E-01 .171566 .453389E-01 .142951 .04699 .11557
+bezier .537115E-01 .133698 .718522E-01 .150223 .09144 .147955
+bezier .128145 .149889 .158713 .113787 .160655 .079375
+bezier .163902 .500085E-01 .151521 .196206E-01 .126365 .003175
+bezier .968359E-01 -.191429E-01 .504478E-01 -.797223E-02 .03302 .024765
+bezier .128575E-01 .633217E-01 .012186 .107275 .01905 .14859
+bezier .281635E-01 .19309 .661614E-01 .237024 .1143 .233045
+closepath
+! end of curve
+
+! start of curve
+amove .08255 .140335
+bezier .538268E-01 .132618 .460566E-01 .979168E-01 .04699 .07239
+bezier .476386E-01 .480452E-01 .504143E-01 .113447E-01 .08001 .001905
+bezier .103069 -.542679E-02 .125057 .160998E-01 .127635 .038735
+aline .12827 .03937
+aline .12827 .04318
+aline .128905 .043815
+aline .128905 .051435
+aline .12954 .05207
+aline .12954 .089535
+bezier .128949 .109648 .119962 .135647 .097155 .14097
+aline .083185 .14097
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="7" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.644444 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .040005 .236855
+bezier .412613E-01 .22676 .538925E-01 .227513 .06096 .22606
+aline .073025 .22606
+aline .07366 .225425
+aline .17018 .225425
+bezier .171665 .212204 .158411 .204048 .153035 .19304
+bezier .131039 .161886 .103731 .1317 .09906 .09144
+bezier .954683E-01 .075293 .952744E-01 .577386E-01 .09398 .04064
+aline .09398 .004445
+bezier .917711E-01 -.124101E-01 .644389E-01 -.124101E-01 .06223 .004445
+bezier .598421E-01 .682332E-01 .919423E-01 .129885 .13081 .17907
+bezier .134882 .18591 .141877 .192383 .144145 .19939
+aline .05842 .19939
+bezier .504177E-01 .196856 .365345E-01 .203002 .03429 .191135
+bezier .315176E-01 .182172 .299496E-01 .173886 .028575 .1651
+aline .02032 .1651
+bezier .244281E-01 .188932 .276091E-01 .212848 .03175 .236855
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="8" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.644444 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .094615 .233045
+bezier .123377 .231832 .15682 .207057 .150495 .17526
+bezier .149088 .151538 .127042 .13704 .108585 .126365
+bezier .131827 .112861 .159241 .951368E-01 .16002 .06477
+bezier .166504 .271084E-01 .130428 -.649493E-02 .094615 -.008255
+bezier .602871E-01 -.115566E-01 .191562E-01 .933489E-02 .01524 .046355
+bezier .114291E-01 .790669E-01 .385047E-01 .104578 .06604 .11684
+bezier .467315E-01 .128408 .262671E-01 .144496 .024765 .16891
+bezier .199988E-01 .206916 .584097E-01 .237617 .094615 .233045
+closepath
+! end of curve
+
+! start of curve
+amove .08128 .224155
+bezier .586894E-01 .224099 .03104 .201614 .04191 .177165
+bezier .051429 .157203 .746128E-01 .150846 .090805 .137795
+bezier .960046E-01 .135469 .100736 .128603 .106045 .13462
+bezier .130146 .147842 .147705 .181816 .127635 .20574
+bezier .117208 .219917 .978407E-01 .226788 .08128 .224155
+closepath
+! end of curve
+
+! start of curve
+amove .073025 .111125
+bezier .400958E-01 .964834E-01 .181325E-01 .511645E-01 .043815 .020955
+bezier .698322E-01 -.116515E-01 .130347 -.378416E-02 .142875 .037465
+bezier .147609 .596177E-01 .129822 .790515E-01 .111125 .088265
+bezier .098755 .958725E-01 .868348E-01 .1043 .074295 .111548
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="9" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.644444 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .095885 .233045
+bezier .13708 .228318 .157209 .182713 .15875 .14605
+bezier .16612 .956365E-01 .156428 .033511 .109855 .00254
+bezier .085446 -.012839 .482205E-01 -.139265E-01 .02921 .01016
+bezier .223055E-01 .208689E-01 .200056E-01 .415404E-01 .03556 .04572
+aline .04445 .04572
+bezier .617291E-01 .424768E-01 .586365E-01 .127346E-01 .04064 .014605
+bezier .034188 .145724E-01 .432889E-01 .796203E-02 .046355 .00635
+bezier .704568E-01 -.68699E-02 .102649 .33519E-02 .1143 .028575
+bezier .128704 .536964E-01 .130424 .822223E-01 .128905 .109855
+bezier .122669 .913679E-01 .104166 .745883E-01 .084455 .076835
+bezier .475563E-01 .749348E-01 .168559E-01 .11138 .01524 .14605
+bezier .116311E-01 .176306 .261653E-01 .206938 .05207 .222885
+bezier .647699E-01 .232027 .807892E-01 .233571 .095885 .233045
+closepath
+! end of curve
+
+! start of curve
+amove .08382 .224155
+bezier .589215E-01 .222104 .471223E-01 .194071 .046355 .17272
+aline .046355 .135255
+bezier .469095E-01 .115112 .560343E-01 .892219E-01 .07874 .08382
+bezier .10418 .079196 .122648 .102759 .126365 .12573
+bezier .131096 .150319 .129653 .176727 .121285 .20066
+bezier .115262 .215045 .997806E-01 .227985 .08382 .224155
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=":" !-------------- Beginning of new char.
+dfont wid=.277779 hei=.430555 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .05207 .14986
+bezier .707024E-01 .147991 .728738E-01 .118664 .05461 .1143
+bezier .370706E-01 .107939 .226261E-01 .132432 .036195 .14478
+aline .037465 .145415
+aline .03937 .14732
+aline .04191 .14859
+aline .043815 .149225
+aline .046355 .14986
+closepath
+! end of curve
+
+! start of curve
+amove .05207 .03556
+bezier .707024E-01 .033691 .728738E-01 .436431E-02 .05461 0
+bezier .370705E-01 -.636072E-02 .226261E-01 .181321E-01 .036195 .03048
+aline .037465 .031115
+aline .03937 .03302
+aline .04191 .03429
+aline .043815 .034925
+aline .046355 .03556
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=";" !-------------- Beginning of new char.
+dfont wid=.277779 hei=.430555 dep=.194445 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .05207 .14986
+bezier .707024E-01 .147991 .728738E-01 .118664 .05461 .1143
+bezier .370706E-01 .107939 .226261E-01 .132432 .036195 .14478
+aline .037465 .145415
+aline .03937 .14732
+aline .04191 .14859
+aline .043815 .149225
+aline .046355 .14986
+closepath
+! end of curve
+
+! start of curve
+amove .05207 .03556
+bezier .649477E-01 .334058E-01 .674632E-01 .018348 .06858 .008255
+bezier .702026E-01 -.019554 .618839E-01 -.500217E-01 .04064 -.069215
+aline .0381 -.069215
+bezier .032094 -.627987E-01 .439244E-01 -.575774E-01 .04572 -.051435
+bezier .562612E-01 -.353676E-01 .631732E-01 -.153587E-01 .06096 .003175
+bezier .486239E-01 -.761208E-02 .270741E-01 .441234E-02 .031115 .020955
+aline .03175 .023495
+aline .032385 .0254
+aline .033655 .02794
+aline .0381 .032385
+aline .03937 .03302
+aline .040005 .033655
+aline .041275 .03429
+aline .04318 .034925
+aline .04572 .03556
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="<" !-------------- Beginning of new char.
+dfont wid=.277779 hei=.5 dep=.194445 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .052705 .174625
+bezier .697695E-01 .171763 .726319E-01 .146041 .056515 .1397
+bezier .398275E-01 .131429 .221957E-01 .155072 .03556 .168275
+aline .036195 .169545
+aline .037465 .17018
+aline .038735 .17145
+aline .040005 .172085
+aline .04064 .17272
+aline .04191 .173355
+aline .043815 .17399
+aline .04572 .174625
+closepath
+! end of curve
+
+! start of curve
+amove .051435 .108585
+aline .052705 .10795
+bezier .584331E-01 .513678E-01 .629476E-01 -.571709E-02 .06731 -.062865
+bezier .644204E-01 -.813704E-01 .340046E-01 -.813704E-01 .031115 -.062865
+bezier .354774E-01 -.571711E-02 .399919E-01 .513678E-01 .04572 .10795
+aline .04699 .108585
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="=" !-------------- Beginning of new char.
+dfont wid=.777781 hei=.366875 dep=-.133125 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .24765 .12827
+aline .24892 .127635
+aline .25019 .127
+aline .25146 .12573
+aline .25273 .12319
+aline .25273 .11938
+aline .25146 .11684
+aline .25019 .11557
+aline .24765 .1143
+aline .0254 .1143
+aline .02286 .11557
+aline .02159 .11684
+aline .02032 .11938
+aline .02032 .12319
+aline .02159 .12573
+aline .02286 .127
+aline .02413 .127635
+aline .0254 .12827
+closepath
+! end of curve
+
+! start of curve
+amove .24765 .05969
+aline .24892 .059055
+aline .25019 .05842
+aline .25146 .05715
+aline .25273 .05461
+aline .25273 .0508
+aline .25146 .04826
+aline .25019 .04699
+aline .24765 .04572
+aline .0254 .04572
+aline .02286 .04699
+aline .02159 .04826
+aline .02032 .0508
+aline .02032 .05461
+aline .02159 .05715
+aline .02286 .05842
+aline .02413 .059055
+aline .0254 .05969
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=">" !-------------- Beginning of new char.
+dfont wid=.472224 hei=.5 dep=.194445 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .08128 .174625
+bezier .983445E-01 .171763 .101207 .146041 .08509 .1397
+bezier .684025E-01 .131429 .507707E-01 .155072 .064135 .168275
+aline .06477 .169545
+aline .06604 .17018
+aline .06731 .17145
+aline .06858 .172085
+aline .069215 .17272
+aline .070485 .173355
+aline .07239 .17399
+aline .074295 .174625
+closepath
+! end of curve
+
+! start of curve
+amove .08001 .108585
+aline .08128 .10795
+bezier .850948E-01 .697267E-01 .772729E-01 .296131E-01 .05334 -.001905
+bezier .472753E-01 -.191783E-01 .459649E-01 -.399539E-01 .05461 -.056515
+bezier .724725E-01 -.736102E-01 .995436E-01 -.651629E-01 .11938 -.055245
+bezier .123813 -.519772E-01 .132312 -.455795E-01 .131445 -.414867E-01
+bezier .116405 -.452669E-01 .106406 -.219557E-01 .11938 -.013335
+bezier .127834 -.592196E-02 .14451 -.108021E-01 .145415 -.02286
+bezier .148291 -.546663E-01 .112544 -.721097E-01 .085725 -.073025
+bezier .604774E-01 -.754337E-01 .280765E-01 -.670032E-01 .02159 -.038735
+bezier .181004E-01 -.216546E-01 .211045E-01 -.545914E-03 .03683 .01016
+bezier .651057E-01 .341065E-01 .077192 .071295 .07366 .107315
+aline .074295 .10795
+aline .075565 .108585
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="?" !-------------- Beginning of new char.
+dfont wid=.472224 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .088265 .24638
+bezier .112268 .245863 .143126 .232276 .145415 .20447
+bezier .14767 .18619 .13756 .168331 .121285 .16002
+bezier .100355 .143487 .851066E-01 .118602 .081915 .09271
+aline .081915 .066675
+aline .08128 .06604
+aline .08001 .065405
+aline .075565 .065405
+aline .074295 .06604
+bezier .699894E-01 .103683 .800546E-01 .144967 .108585 .172085
+bezier .119695 .189231 .120888 .21408 .10795 .230505
+bezier .848823E-01 .246803 .481776E-01 .240639 .03302 .2159
+bezier .435348E-01 .216616 .547538E-01 .207962 .05207 .196215
+bezier .502162E-01 .179258 .221738E-01 .179258 .02032 .196215
+bezier .017392 .224575 .457684E-01 .244675 .07112 .24638
+aline .088265 .24638
+closepath
+! end of curve
+
+! start of curve
+amove .08128 .03556
+bezier .983445E-01 .326979E-01 .101207 .697633E-02 .08509 .000635
+bezier .684025E-01 -.763559E-02 .507708E-01 .160069E-01 .064135 .02921
+aline .06477 .03048
+aline .06604 .031115
+aline .06731 .032385
+aline .06858 .03302
+aline .069215 .033655
+aline .070485 .03429
+aline .07239 .034925
+aline .074295 .03556
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="@" !-------------- Beginning of new char.
+dfont wid=.777781 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .14478 .24638
+bezier .202295 .242675 .251207 .188204 .252095 .13081
+bezier .252933 .10612 .254462 .797652E-01 .241935 .05715
+bezier .227126 .341612E-01 .187579 .445236E-01 .181398 .681567E-01
+bezier .162113 .039661 .119596 .372548E-01 .094615 .05969
+bezier .498464E-01 .955267E-01 .615728E-01 .17782 .11811 .194945
+bezier .143457 .203759 .172004 .190904 .18542 .168275
+aline .202565 .168275
+aline .20447 .16764
+aline .20574 .16637
+aline .20574 .06731
+bezier .207515 .596602E-01 .212427 .477642E-01 .22225 .05207
+bezier .239419 .557038E-01 .241541 .772909E-01 .24384 .090805
+bezier .247527 .129455 .24206 .170884 .215265 .201295
+bezier .182023 .243662 .116607 .25223 .07493 .217805
+bezier .020117 .175834 .135122E-01 .907125E-01 .05842 .03937
+bezier .838549E-01 .898883E-02 .126128 -.31827E-02 .163195 .004445
+bezier .187177 .704409E-02 .212621 .147025E-01 .23495 .026035
+aline .250825 .026035
+bezier .257392 .208256E-01 .24613 .176476E-01 .241935 .015875
+bezier .198186 -.732497E-03 .152445 -.995888E-02 .107315 -.000635
+bezier .467786E-01 .015387 .103423E-01 .838303E-01 .022225 .14224
+bezier .284675E-01 .201765 .085194 .251552 .14478 .24638
+closepath
+! end of curve
+
+! start of curve
+amove .13208 .189865
+bezier .10461 .184478 .936419E-01 .152692 .090805 .128905
+bezier .895645E-01 .101314 .977341E-01 .669863E-01 .125095 .053975
+bezier .148573 .446488E-01 .172672 .641527E-01 .182245 .08509
+aline .182245 .156845
+bezier .173293 .17578 .154501 .192197 .132715 .1905
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="A" !-------------- Beginning of new char.
+dfont wid=.750002 hei=.683332 dep=0 italic=0
+dfont fby="C" kadd=-.0277786
+dfont fby="G" kadd=-.0277786
+dfont fby="O" kadd=-.0277786
+dfont fby="Q" kadd=-.0277786
+dfont fby="T" kadd=-.083334
+dfont fby="U" kadd=-.0277786
+dfont fby="V" kadd=-.111112
+dfont fby="W" kadd=-.111112
+dfont fby="Y" kadd=-.083334
+dfont fby="t" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .135255 .25019
+aline .136525 .249555
+bezier .166188 .173048 .190063 .935248E-01 .219075 .01651
+aline .22225 .013335
+aline .22479 .012065
+aline .226695 .01143
+aline .22987 .010795
+aline .230505 .01016
+aline .23622 .01016
+aline .236855 .009525
+aline .25146 .009525
+aline .25146 -.000635
+aline .244475 -.000635
+aline .24384 0
+aline .21463 0
+aline .213995 .000635
+aline .19939 .000635
+aline .198755 0
+aline .1651 0
+aline .164465 -.000635
+aline .155575 -.000635
+aline .155575 .009525
+aline .16637 .009525
+bezier .173503 .105601E-01 .188477 .131141E-01 .18415 .02413
+bezier .177313 .424075E-01 .171883 .614571E-01 .164465 .079375
+aline .078105 .079375
+aline .075565 .071755
+aline .07493 .070485
+aline .06985 .055245
+aline .069215 .053975
+bezier .663353E-01 .412721E-01 .536309E-01 .250057E-01 .067945 .01524
+aline .06858 .014605
+aline .07366 .012065
+aline .075565 .01143
+aline .078105 .010795
+aline .07874 .01016
+aline .081915 .01016
+aline .08255 .009525
+aline .086995 .009525
+aline .086995 -.000635
+aline .080645 -.000635
+aline .08001 0
+aline .052705 0
+aline .05207 .000635
+aline .041275 .000635
+aline .04064 0
+aline .01778 0
+aline .017145 -.000635
+aline .012065 -.000635
+aline .012065 .009525
+bezier .299055E-01 .824771E-02 .492499E-01 .190848E-01 .052705 .0381
+bezier .776166E-01 .108477 .100326 .180147 .127 .249555
+aline .12827 .25019
+closepath
+! end of curve
+
+! start of curve
+amove .12065 .20193
+bezier .108069 .164532 .093425 .127055 .08255 .089535
+aline .160655 .089535
+bezier .149141 .127461 .134785 .166073 .121603 .203676
+aline .121158 .203454
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="B" !-------------- Beginning of new char.
+dfont wid=.708336 hei=.683332 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .149225 .23876
+bezier .182508 .237551 .222229 .212059 .219075 .174625
+bezier .214901 .146819 .186996 .129072 .160655 .12446
+bezier .195712 .122765 .235285 .924123E-01 .227965 .053975
+bezier .221995 .217926E-01 .18923 .134136E-02 .15875 -.000635
+aline .013335 -.000635
+aline .013335 .009525
+bezier .025262 .107861E-01 .401451E-01 .617013E-02 .04826 .01651
+aline .048895 .01905
+aline .04953 .019685
+aline .04953 .21844
+bezier .476616E-01 .227642 .375413E-01 .227749 .03048 .2286
+aline .013335 .2286
+aline .013335 .23876
+aline .149225 .23876
+closepath
+! end of curve
+
+! start of curve
+amove .086995 .227965
+aline .08382 .22733
+aline .081915 .226695
+aline .080645 .22606
+aline .08001 .22479
+aline .079375 .224155
+aline .07874 .221615
+aline .078105 .22098
+aline .078105 .12827
+aline .07874 .127635
+aline .1397 .127635
+bezier .172373 .132074 .195282 .169185 .18161 .19939
+bezier .175917 .214669 .16162 .226133 .14605 .2286
+aline .08763 .2286
+aline .086995 .227965
+closepath
+! end of curve
+
+! start of curve
+amove .078105 .120015
+aline .078105 .017145
+aline .07874 .01651
+aline .079375 .01397
+aline .08001 .013335
+aline .080645 .012065
+aline .081915 .01143
+aline .08382 .010795
+aline .086995 .01016
+aline .08763 .009525
+aline .146685 .009525
+bezier .179265 .125428E-01 .201917 .496219E-01 .19177 .08001
+bezier .187254 .101032 .169193 .118937 .147955 .12065
+aline .07874 .12065
+aline .078105 .120015
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="C" !-------------- Beginning of new char.
+dfont wid=.722224 hei=.683332 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .14986 .24638
+bezier .171263 .244655 .192063 .233128 .206375 .216535
+bezier .214056 .226134 .219924 .23704 .227965 .24638
+aline .231775 .24638
+aline .23241 .245745
+aline .23368 .24511
+aline .23368 .147955
+aline .23241 .14732
+aline .231775 .146685
+aline .225425 .146685
+aline .22479 .14732
+bezier .219666 .182788 .199513 .227901 .158115 .23495
+bezier .115826 .242876 .722575E-01 .210246 .06223 .168275
+bezier .511436E-01 .123518 .517999E-01 .718228E-01 .08128 .03302
+bezier .108594 -.613529E-03 .160917 -.904824E-02 .194945 .01905
+bezier .214222 .356003E-01 .226047 .609059E-01 .225425 .085725
+aline .226695 .08636
+aline .22733 .086995
+aline .231775 .086995
+aline .23241 .08636
+bezier .236529 .654909E-01 .226047 .405309E-01 .21209 .023495
+bezier .174505 -.216998E-01 .103335 -.152286E-01 .062865 .022225
+bezier .147317E-02 .744548E-01 .740209E-02 .181731 .075565 .225425
+bezier .968772E-01 .240977 .123995 .247561 .14986 .24638
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="D" !-------------- Beginning of new char.
+dfont wid=.763891 hei=.683332 dep=0 italic=0
+dfont fby="A" kadd=-.0277786
+dfont fby="V" kadd=-.0277786
+dfont fby="W" kadd=-.0277786
+dfont fby="X" kadd=-.0277786
+dfont fby="Y" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .149225 .23876
+bezier .204986 .234542 .246513 .179019 .248285 .12573
+bezier .253817 .675656E-01 .211032 .340006E-02 .14986 0
+aline .149225 -.000635
+aline .013335 -.000635
+aline .013335 .009525
+bezier .025262 .107861E-01 .401451E-01 .617013E-02 .04826 .01651
+aline .048895 .01905
+aline .04953 .019685
+aline .04953 .21844
+bezier .476616E-01 .227642 .375413E-01 .227749 .03048 .2286
+aline .013335 .2286
+aline .013335 .23876
+aline .149225 .23876
+closepath
+! end of curve
+
+! start of curve
+amove .08763 .227965
+aline .084455 .22733
+aline .08255 .226695
+aline .08128 .22606
+aline .080645 .22479
+aline .08001 .224155
+aline .079375 .221615
+aline .07874 .22098
+aline .07874 .017145
+aline .079375 .01651
+aline .08001 .01397
+aline .080645 .013335
+aline .08128 .012065
+aline .08255 .01143
+aline .084455 .010795
+aline .08763 .01016
+aline .088265 .009525
+aline .1397 .009525
+bezier .173576 .126767E-01 .203659 .392853E-01 .20955 .07366
+bezier .215869 .107661 .216188 .143691 .205105 .177165
+bezier .195475 .205656 .16785 .225698 .139065 .2286
+aline .088265 .2286
+aline .08763 .227965
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="E" !-------------- Beginning of new char.
+dfont wid=.680557 hei=.683332 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .20955 .23749
+bezier .212831 .21092 .215794 .185012 .219075 .15875
+aline .21082 .15875
+bezier .207942 .181045 .204852 .211686 .179705 .221615
+aline .17399 .22352
+aline .17145 .224155
+aline .1651 .225425
+aline .164465 .22606
+aline .16002 .22606
+aline .159385 .226695
+aline .151765 .226695
+aline .15113 .22733
+aline .0889 .22733
+aline .088265 .226695
+aline .08509 .22606
+aline .083185 .225425
+aline .081915 .22479
+aline .08128 .22352
+aline .080645 .222885
+aline .08001 .220345
+aline .079375 .21971
+aline .079375 .128905
+aline .08001 .12827
+aline .11938 .12827
+bezier .131982 .128514 .147528 .135809 .147955 .15113
+aline .14859 .151765
+aline .14859 .156845
+aline .149225 .15748
+aline .149225 .169545
+aline .15748 .169545
+aline .15748 .076835
+aline .149225 .076835
+bezier .150005 .917847E-01 .148037 .113075 .12954 .116205
+aline .128905 .11684
+aline .12573 .11684
+aline .125095 .117475
+aline .120015 .117475
+aline .11938 .11811
+aline .08001 .11811
+aline .079375 .117475
+aline .079375 .017145
+aline .08001 .01651
+aline .080645 .01397
+aline .08128 .013335
+aline .081915 .012065
+aline .083185 .01143
+aline .08509 .010795
+aline .088265 .01016
+aline .0889 .009525
+aline .153035 .009525
+bezier .176045 .100243E-01 .204287 .205945E-01 .21082 .046355
+bezier .216166 .060669 .218414 .754136E-01 .22098 .089535
+aline .229235 .089535
+bezier .22428 .594612E-01 .219593 .297019E-01 .21463 -.000635
+aline .0127 -.000635
+aline .0127 .009525
+bezier .024627 .107861E-01 .395101E-01 .617012E-02 .047625 .01651
+aline .04826 .01905
+aline .048895 .019685
+aline .048895 .21717
+bezier .470266E-01 .226372 .369063E-01 .226479 .029845 .22733
+aline .0127 .22733
+aline .0127 .23749
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="F" !-------------- Beginning of new char.
+dfont wid=.652781 hei=.683332 dep=0 italic=0
+dfont fby="A" kadd=-.111112
+dfont fby="C" kadd=-.0277786
+dfont fby="G" kadd=-.0277786
+dfont fby="O" kadd=-.0277786
+dfont fby="Q" kadd=-.0277786
+dfont fby="a" kadd=-.083334
+dfont fby="e" kadd=-.083334
+dfont fby="o" kadd=-.083334
+dfont fby="r" kadd=-.083334
+dfont fby="u" kadd=-.083334
+set path ! start of curve
+newpath
+! start of curve
+amove .20447 .23749
+bezier .207751 .21092 .210714 .185012 .213995 .15875
+aline .20574 .15875
+bezier .202931 .18251 .198745 .216866 .169545 .22352
+aline .16764 .224155
+aline .16129 .225425
+aline .160655 .22606
+aline .156845 .22606
+aline .15621 .226695
+aline .14859 .226695
+aline .147955 .22733
+aline .0889 .22733
+aline .088265 .226695
+aline .08509 .22606
+aline .083185 .225425
+aline .081915 .22479
+aline .08128 .22352
+aline .080645 .222885
+aline .08001 .220345
+aline .079375 .21971
+aline .079375 .12446
+aline .08001 .123825
+aline .11811 .123825
+bezier .129131 .124706 .143472 .129879 .14478 .14351
+aline .145415 .146685
+aline .14605 .14732
+aline .14605 .1524
+aline .146685 .153035
+aline .146685 .1651
+aline .15494 .1651
+aline .15494 .07239
+aline .146685 .07239
+bezier .147244 .872638E-01 .145842 .108299 .127635 .11176
+aline .127 .112395
+aline .123825 .112395
+aline .12319 .11303
+aline .118745 .11303
+aline .11811 .113665
+aline .08001 .113665
+aline .079375 .11303
+aline .079375 .019685
+bezier .828513E-01 .950903E-02 .946233E-01 .107478E-01 .10287 .009525
+aline .12446 .009525
+aline .12446 -.000635
+aline .1143 -.000635
+aline .113665 0
+aline .07366 0
+aline .073025 .000635
+aline .056515 .000635
+aline .05588 0
+aline .022225 0
+aline .02159 -.000635
+aline .0127 -.000635
+aline .0127 .009525
+bezier .024627 .107861E-01 .395101E-01 .617012E-02 .047625 .01651
+aline .04826 .01905
+aline .048895 .019685
+aline .048895 .21717
+bezier .470266E-01 .226372 .369063E-01 .226479 .029845 .22733
+aline .0127 .22733
+aline .0127 .23749
+aline .20447 .23749
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="G" !-------------- Beginning of new char.
+dfont wid=.784724 hei=.683332 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .14986 .24638
+bezier .171263 .244655 .192063 .233128 .206375 .216535
+bezier .214056 .226134 .219924 .23704 .227965 .24638
+aline .231775 .24638
+aline .23241 .245745
+aline .23368 .24511
+aline .23368 .147955
+aline .23241 .14732
+aline .231775 .146685
+aline .225425 .146685
+aline .22479 .14732
+bezier .219666 .182788 .199513 .227901 .158115 .23495
+bezier .115826 .242876 .722575E-01 .210246 .06223 .168275
+bezier .511445E-01 .124142 .518954E-01 .729076E-01 .080645 .03429
+bezier .107902 -.464813E-04 .166929 -.124476E-01 .197485 .023495
+aline .20066 .029845
+aline .20193 .033655
+aline .202565 .03683
+aline .2032 .037465
+aline .2032 .074295
+bezier .199991 .843619E-01 .18827 .831173E-01 .18034 .084455
+aline .159385 .084455
+aline .159385 .094615
+aline .169545 .094615
+aline .17018 .09398
+aline .208915 .09398
+aline .20955 .093345
+aline .224155 .093345
+aline .22479 .09398
+aline .250825 .09398
+aline .25146 .094615
+aline .25781 .094615
+aline .25781 .084455
+bezier .249064 .841762E-01 .236494 .086216 .23368 .075565
+aline .23368 .000635
+aline .23241 0
+aline .231775 -.000635
+bezier .221719 .198377E-02 .214773 .141215E-01 .208068 .205317E-01
+bezier .186367 -.103319E-01 .143118 -.127448E-01 .109855 -.00381
+bezier .491817E-01 .126052E-01 .100588E-01 .802307E-01 .022225 .1397
+bezier .288379E-01 .201355 .884748E-01 .250958 .14986 .24638
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="H" !-------------- Beginning of new char.
+dfont wid=.750002 hei=.683332 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .02159 .23876
+aline .022225 .238125
+aline .05588 .238125
+aline .056515 .23749
+aline .071755 .23749
+aline .07239 .238125
+aline .106045 .238125
+aline .10668 .23876
+aline .11557 .23876
+aline .11557 .2286
+bezier .103643 .227339 .887599E-01 .231955 .080645 .221615
+aline .08001 .219075
+aline .079375 .21844
+aline .079375 .12954
+aline .08001 .128905
+aline .183515 .128905
+aline .18415 .12954
+aline .18415 .21844
+bezier .182282 .227642 .172161 .227749 .1651 .2286
+aline .147955 .2286
+aline .147955 .23876
+aline .156845 .23876
+aline .15748 .238125
+aline .191135 .238125
+aline .19177 .23749
+aline .20701 .23749
+aline .207645 .238125
+aline .2413 .238125
+aline .241935 .23876
+aline .250825 .23876
+aline .250825 .2286
+bezier .238898 .227339 .224015 .231955 .2159 .221615
+aline .215265 .219075
+aline .21463 .21844
+aline .21463 .019685
+bezier .216498 .104831E-01 .226619 .103757E-01 .23368 .009525
+aline .250825 .009525
+aline .250825 -.000635
+aline .241935 -.000635
+aline .2413 0
+aline .207645 0
+aline .20701 .000635
+aline .19177 .000635
+aline .191135 0
+aline .15748 0
+aline .156845 -.000635
+aline .147955 -.000635
+aline .147955 .009525
+bezier .159882 .107861E-01 .174765 .617013E-02 .18288 .01651
+aline .183515 .01905
+aline .18415 .019685
+aline .18415 .11811
+aline .183515 .118745
+aline .08001 .118745
+aline .079375 .11811
+aline .079375 .019685
+bezier .812434E-01 .104831E-01 .913637E-01 .103757E-01 .098425 .009525
+aline .11557 .009525
+aline .11557 -.000635
+aline .10668 -.000635
+aline .106045 0
+aline .07239 0
+aline .071755 .000635
+aline .056515 .000635
+aline .05588 0
+aline .022225 0
+aline .02159 -.000635
+aline .0127 -.000635
+aline .0127 .009525
+bezier .024627 .107861E-01 .395101E-01 .617012E-02 .047625 .01651
+aline .04826 .01905
+aline .048895 .019685
+aline .048895 .21844
+bezier .470266E-01 .227642 .369063E-01 .227749 .029845 .2286
+aline .0127 .2286
+aline .0127 .23876
+aline .02159 .23876
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="I" !-------------- Beginning of new char.
+dfont wid=.361112 hei=.683332 dep=0 italic=0
+dfont fby="I" kadd=.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .01905 .23876
+aline .019685 .238125
+aline .05461 .238125
+aline .055245 .23749
+aline .071755 .23749
+aline .07239 .238125
+aline .107315 .238125
+aline .10795 .23876
+aline .11684 .23876
+aline .11684 .2286
+aline .098425 .2286
+bezier .911321E-01 .227657 .809868E-01 .227847 .07874 .21844
+aline .07874 .019685
+bezier .809868E-01 .102776E-01 .911321E-01 .104677E-01 .098425 .009525
+aline .11684 .009525
+aline .11684 -.000635
+aline .10795 -.000635
+aline .107315 0
+aline .07239 0
+aline .071755 .000635
+aline .055245 .000635
+aline .05461 0
+aline .019685 0
+aline .01905 -.000635
+aline .01016 -.000635
+aline .01016 .009525
+aline .028575 .009525
+bezier .358679E-01 .104677E-01 .460132E-01 .102776E-01 .04826 .019685
+aline .04826 .21844
+bezier .460131E-01 .227847 .358679E-01 .227657 .028575 .2286
+aline .01016 .2286
+aline .01016 .23876
+aline .01905 .23876
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="J" !-------------- Beginning of new char.
+dfont wid=.51389 hei=.683332 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .06985 .23876
+aline .070485 .238125
+aline .111125 .238125
+aline .11176 .23749
+aline .127635 .23749
+aline .12827 .238125
+aline .155575 .238125
+aline .15621 .23876
+aline .163195 .23876
+aline .163195 .2286
+bezier .153581 .227905 .139735 .231125 .13589 .21971
+aline .13589 .043815
+bezier .130288 -.836878E-02 .052005 -.276283E-01 .022225 .01524
+bezier .124055E-01 .284277E-01 .106496E-01 .546554E-01 .031115 .05842
+bezier .485587E-01 .623084E-01 .611669E-01 .400852E-01 .050165 .02667
+aline .04699 .023495
+aline .04572 .02286
+aline .045085 .022225
+aline .042545 .020955
+aline .04064 .02032
+aline .0381 .019685
+aline .03175 .019685
+bezier .427069E-01 -.140239E-02 .808907E-01 -.108585E-01 .095885 .013335
+bezier .102221 .219713E-01 .104828 .333381E-01 .10668 .04318
+aline .10668 .217805
+bezier .103537 .228977 .090563 .227235 .081915 .2286
+aline .05969 .2286
+aline .05969 .23876
+aline .06985 .23876
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="K" !-------------- Beginning of new char.
+dfont wid=.777781 hei=.683332 dep=0 italic=0
+dfont fby="C" kadd=-.0277786
+dfont fby="G" kadd=-.0277786
+dfont fby="O" kadd=-.0277786
+dfont fby="Q" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .02159 .23876
+aline .022225 .238125
+aline .05588 .238125
+aline .056515 .23749
+aline .071755 .23749
+aline .07239 .238125
+aline .106045 .238125
+aline .10668 .23876
+aline .11557 .23876
+aline .11557 .2286
+bezier .103643 .227339 .887599E-01 .231955 .080645 .221615
+aline .08001 .219075
+aline .079375 .21844
+aline .079375 .100965
+aline .08001 .10033
+bezier .117758 .137194 .157391 .172743 .193675 .21082
+bezier .199307 .220494 .188238 .229249 .17907 .2286
+aline .17907 .23876
+aline .18669 .23876
+aline .187325 .238125
+aline .219075 .238125
+aline .21971 .23749
+aline .230505 .23749
+aline .23114 .238125
+aline .248285 .238125
+aline .24892 .23876
+aline .25273 .23876
+aline .25273 .2286
+bezier .218412 .229059 .196233 .198774 .17272 .1778
+aline .15748 .16256
+aline .15621 .161925
+aline .141605 .14732
+bezier .140732 .14366 .147607 .137417 .14986 .132715
+bezier .174802 .956485E-01 .199463 .583789E-01 .22479 .02159
+bezier .232643 .110414E-01 .245666 .880817E-02 .25781 .009525
+aline .25781 -.000635
+aline .25146 -.000635
+aline .250825 0
+aline .226695 0
+aline .22606 .000635
+aline .212725 .000635
+aline .21209 0
+aline .1778 0
+aline .177165 -.000635
+aline .168275 -.000635
+aline .168275 .009525
+bezier .17731 .806678E-02 .192555 .126835E-01 .18796 .024765
+bezier .166498 .596983E-01 .142664 .929225E-01 .120015 .127
+aline .10922 .116205
+aline .10795 .11557
+aline .093345 .100965
+aline .092075 .10033
+aline .079375 .08763
+aline .079375 .019685
+bezier .812434E-01 .104831E-01 .913637E-01 .103757E-01 .098425 .009525
+aline .11557 .009525
+aline .11557 -.000635
+aline .10668 -.000635
+aline .106045 0
+aline .07239 0
+aline .071755 .000635
+aline .056515 .000635
+aline .05588 0
+aline .022225 0
+aline .02159 -.000635
+aline .0127 -.000635
+aline .0127 .009525
+bezier .024627 .107861E-01 .395101E-01 .617012E-02 .047625 .01651
+aline .04826 .01905
+aline .048895 .019685
+aline .048895 .21844
+bezier .470266E-01 .227642 .369063E-01 .227749 .029845 .2286
+aline .0127 .2286
+aline .0127 .23876
+aline .02159 .23876
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="L" !-------------- Beginning of new char.
+dfont wid=.625002 hei=.683332 dep=0 italic=0
+dfont fby="T" kadd=-.083334
+dfont fby="V" kadd=-.111112
+dfont fby="W" kadd=-.111112
+dfont fby="Y" kadd=-.083334
+set path ! start of curve
+newpath
+! start of curve
+amove .02159 .23876
+aline .022225 .238125
+aline .05588 .238125
+aline .056515 .23749
+aline .073025 .23749
+aline .07366 .238125
+aline .113665 .238125
+aline .1143 .23876
+aline .12446 .23876
+aline .12446 .2286
+aline .10287 .2286
+bezier .946233E-01 .227377 .828513E-01 .228616 .079375 .21844
+aline .079375 .017145
+aline .08001 .01651
+aline .080645 .01397
+aline .08128 .013335
+aline .081915 .012065
+aline .083185 .01143
+aline .08509 .010795
+aline .088265 .01016
+aline .0889 .009525
+aline .133985 .009525
+bezier .158344 .110355E-01 .184467 .264304E-01 .189865 .052705
+bezier .193448 .653826E-01 .194969 .768067E-01 .196215 .089535
+aline .20447 .089535
+bezier .201257 .594297E-01 .198266 .297582E-01 .194945 -.000635
+aline .0127 -.000635
+aline .0127 .009525
+bezier .024627 .107861E-01 .395101E-01 .617012E-02 .047625 .01651
+aline .04826 .01905
+aline .048895 .019685
+aline .048895 .21844
+bezier .470266E-01 .227642 .369063E-01 .227749 .029845 .2286
+aline .0127 .2286
+aline .0127 .23876
+aline .02159 .23876
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="M" !-------------- Beginning of new char.
+dfont wid=.916669 hei=.683332 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .08001 .23876
+bezier .881712E-01 .230659 .890909E-01 .217166 .094615 .20701
+bezier .116641 .149354 .138981 .918284E-01 .16129 .03429
+bezier .188422 .101972 .212683 .171416 .2413 .238125
+aline .24257 .23876
+aline .307975 .23876
+aline .307975 .2286
+bezier .296048 .227339 .281165 .231955 .27305 .221615
+aline .272415 .219075
+aline .27178 .21844
+aline .27178 .019685
+bezier .273648 .104831E-01 .283769 .103757E-01 .29083 .009525
+aline .307975 .009525
+aline .307975 -.000635
+aline .29972 -.000635
+aline .299085 0
+aline .266065 0
+aline .26543 .000635
+aline .250825 .000635
+aline .25019 0
+aline .21717 0
+aline .216535 -.000635
+aline .20828 -.000635
+aline .20828 .009525
+bezier .220207 .107861E-01 .23509 .617013E-02 .243205 .01651
+aline .24384 .01905
+aline .244475 .019685
+aline .244475 .227965
+bezier .239777 .221364 .236685 .208392 .23241 .19939
+bezier .206247 .133051 .182219 .652561E-01 .154305 0
+bezier .144592 -.340278E-02 .144507 .107492E-01 .14097 .01651
+bezier .114169 .861818E-01 .871919E-01 .155781 .060325 .225425
+aline .05969 .22479
+aline .05969 .028575
+bezier .634374E-01 .126883E-01 .819372E-01 .901146E-02 .095885 .009525
+aline .095885 -.000635
+aline .0889 -.000635
+aline .088265 0
+aline .061595 0
+aline .06096 .000635
+aline .048895 .000635
+aline .04826 0
+aline .02159 0
+aline .020955 -.000635
+aline .01397 -.000635
+aline .01397 .009525
+bezier .279178E-01 .901146E-02 .464176E-01 .126883E-01 .050165 .028575
+aline .050165 .21844
+bezier .482966E-01 .227642 .381763E-01 .227749 .031115 .2286
+aline .01397 .2286
+aline .01397 .23876
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="N" !-------------- Beginning of new char.
+dfont wid=.750002 hei=.683332 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .07874 .23876
+bezier .121176 .176909 .16271 .114408 .20447 .05207
+aline .205105 .052705
+aline .205105 .20955
+bezier .201358 .225437 .182858 .229114 .16891 .2286
+aline .16891 .23876
+aline .175895 .23876
+aline .17653 .238125
+aline .2032 .238125
+aline .203835 .23749
+aline .2159 .23749
+aline .216535 .238125
+aline .243205 .238125
+aline .24384 .23876
+aline .250825 .23876
+aline .250825 .2286
+bezier .236877 .229114 .218377 .225437 .21463 .20955
+aline .21463 .00127
+bezier .208491 -.496167E-02 .202791 .364241E-02 .200025 .00889
+bezier .153211 .788669E-01 .106386 .148836 .059055 .21844
+aline .05842 .217805
+aline .05842 .028575
+bezier .621674E-01 .126883E-01 .806672E-01 .901146E-02 .094615 .009525
+aline .094615 -.000635
+aline .08763 -.000635
+aline .086995 0
+aline .060325 0
+aline .05969 .000635
+aline .047625 .000635
+aline .04699 0
+aline .02032 0
+aline .019685 -.000635
+aline .0127 -.000635
+aline .0127 .009525
+bezier .266478E-01 .901146E-02 .451476E-01 .126883E-01 .048895 .028575
+aline .048895 .225425
+aline .04826 .22606
+aline .045085 .226695
+aline .04445 .22733
+aline .041275 .22733
+aline .04064 .227965
+aline .03302 .227965
+aline .032385 .2286
+aline .0127 .2286
+aline .0127 .23876
+aline .07874 .23876
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="O" !-------------- Beginning of new char.
+dfont wid=.777781 hei=.683332 dep=0 italic=0
+dfont fby="A" kadd=-.0277786
+dfont fby="V" kadd=-.0277786
+dfont fby="W" kadd=-.0277786
+dfont fby="X" kadd=-.0277786
+dfont fby="Y" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .144145 .24638
+bezier .203945 .242778 .250391 .185202 .25273 .127635
+bezier .258235 .666173E-01 .214732 -.681331E-04 .15113 -.006985
+bezier .918884E-01 -.017422 .333816E-01 .313885E-01 .02286 .09017
+bezier .874393E-02 .152709 .457141E-01 .22874 .112395 .24384
+aline .118745 .24511
+aline .12192 .24511
+aline .122555 .245745
+aline .12827 .245745
+aline .128905 .24638
+aline .144145 .24638
+closepath
+! end of curve
+
+! start of curve
+amove .130175 .23749
+bezier .085183 .233257 .591533E-01 .18544 .05715 .14478
+bezier .528067E-01 .100459 .586617E-01 .492229E-01 .09398 .01651
+bezier .117877 -.505281E-02 .155173 -.505281E-02 .17907 .01651
+bezier .217912 .527723E-01 .220934 .110128 .21463 .158115
+bezier .208136 .194984 .182956 .233812 .142875 .23749
+aline .14224 .238125
+aline .13081 .238125
+aline .130175 .23749
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="P" !-------------- Beginning of new char.
+dfont wid=.680557 hei=.683332 dep=0 italic=0
+dfont fby="," kadd=-.083334
+dfont fby="." kadd=-.083334
+dfont fby="A" kadd=-.083334
+dfont fby="a" kadd=-.0277786
+dfont fby="e" kadd=-.0277786
+dfont fby="o" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .14478 .23876
+bezier .181087 .23735 .222777 .208569 .219075 .168275
+bezier .214753 .134621 .179841 .113368 .14859 .11049
+aline .080645 .11049
+aline .08001 .109855
+aline .08001 .019685
+bezier .818784E-01 .104831E-01 .919987E-01 .103757E-01 .09906 .009525
+aline .116205 .009525
+aline .116205 -.000635
+aline .107315 -.000635
+aline .10668 0
+aline .073025 0
+aline .07239 .000635
+aline .05715 .000635
+aline .056515 0
+aline .02286 0
+aline .022225 -.000635
+aline .013335 -.000635
+aline .013335 .009525
+bezier .025262 .107861E-01 .401451E-01 .617013E-02 .04826 .01651
+aline .048895 .01905
+aline .04953 .019685
+aline .04953 .21844
+bezier .476616E-01 .227642 .375413E-01 .227749 .03048 .2286
+aline .013335 .2286
+aline .013335 .23876
+aline .14478 .23876
+closepath
+! end of curve
+
+! start of curve
+amove .08763 .227965
+aline .084455 .22733
+aline .08255 .226695
+aline .08128 .22606
+aline .080645 .22479
+aline .08001 .224155
+aline .079375 .221615
+aline .07874 .22098
+aline .07874 .11938
+aline .079375 .118745
+aline .135255 .118745
+bezier .155871 .120206 .180852 .132602 .182245 .156845
+bezier .185839 .180174 .184737 .212578 .158115 .222885
+bezier .150822 .226101 .143003 .227228 .13589 .2286
+aline .088265 .2286
+aline .08763 .227965
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="Q" !-------------- Beginning of new char.
+dfont wid=.777781 hei=.683332 dep=.194445 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .144145 .24638
+bezier .203945 .242778 .250391 .185202 .25273 .127635
+bezier .256586 .767524E-01 .228987 .221951E-01 .180975 .00127
+bezier .187461 -.126288E-01 .193916 -.302307E-01 .21082 -.033655
+bezier .230435 -.364027E-01 .248817 -.189165E-01 .24765 .000635
+aline .249555 .00254
+aline .25273 .00254
+aline .254635 .000635
+bezier .25528 -.256463E-01 .248684 -.629856E-01 .217805 -.069215
+bezier .197703 -.726491E-01 .180479 -.566144E-01 .17653 -.037465
+bezier .172334 -.259058E-01 .173767 -.132446E-01 .16891 -.338667E-02
+bezier .113148 -.225223E-01 .484123E-01 .135373E-01 .02921 .069215
+bezier .26529E-02 .134027 .352449E-01 .220567 .10541 .241935
+aline .10795 .24257
+aline .109855 .243205
+aline .112395 .24384
+aline .118745 .24511
+aline .12192 .24511
+aline .122555 .245745
+aline .12827 .245745
+aline .128905 .24638
+aline .144145 .24638
+closepath
+! end of curve
+
+! start of curve
+amove .130175 .23749
+bezier .833269E-01 .232712 .577513E-01 .181354 .05588 .1397
+bezier .513701E-01 .979605E-01 .574068E-01 .505306E-01 .089535 .01905
+bezier .967251E-01 .134998E-01 .104879 .68384E-02 .113665 .00508
+bezier .985512E-01 .241916E-01 .117306 .558099E-01 .141605 .0508
+bezier .160611 .482496E-01 .169804 .294538E-01 .176848 .141288E-01
+bezier .205955 .346861E-01 .216365 .735507E-01 .21844 .106045
+bezier .21982 .146833 .213343 .191701 .180975 .22098
+bezier .166903 .23225 .147943 .240402 .130175 .23749
+closepath
+! end of curve
+
+! start of curve
+amove .132715 .04318
+bezier .111072 .395649E-01 .110332 .598727E-02 .13081 0
+aline .14224 0
+aline .142875 .000635
+aline .14732 .000635
+aline .147955 .00127
+aline .15113 .001905
+aline .15367 .00254
+aline .16129 .00508
+aline .16764 .008255
+bezier .165565 .232342E-01 .158071 .041535 .14097 .043815
+aline .13335 .043815
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="R" !-------------- Beginning of new char.
+dfont wid=.736113 hei=.683332 dep=0 italic=0
+dfont fby="C" kadd=-.0277786
+dfont fby="G" kadd=-.0277786
+dfont fby="O" kadd=-.0277786
+dfont fby="Q" kadd=-.0277786
+dfont fby="T" kadd=-.083334
+dfont fby="U" kadd=-.0277786
+dfont fby="V" kadd=-.111112
+dfont fby="W" kadd=-.111112
+dfont fby="Y" kadd=-.083334
+dfont fby="t" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .131445 .23876
+bezier .165308 .236799 .208069 .218051 .213995 .18034
+bezier .21667 .146478 .182125 .125489 .153194 .118428
+bezier .176708 .110928 .197883 .896314E-01 .197485 .064135
+bezier .201883 .451589E-01 .201728 .239092E-01 .21209 .00508
+bezier .223665 -.909563E-02 .244467 .32042E-02 .24638 .01905
+aline .247015 .022225
+aline .24765 .02286
+aline .24765 .02667
+aline .248285 .027305
+aline .248285 .03302
+aline .24892 .03429
+aline .249555 .034925
+aline .250825 .03556
+aline .254 .03556
+aline .25527 .034925
+bezier .259695 .180601E-01 .248464 -.467039E-02 .22987 -.008255
+bezier .202583 -.113001E-01 .167644 .378706E-02 .16637 .034925
+aline .165735 .03556
+aline .165735 .076835
+bezier .16358 .096585 .146007 .113505 .126365 .11557
+aline .079375 .11557
+aline .07874 .114935
+aline .07874 .019685
+bezier .806084E-01 .104831E-01 .907287E-01 .103757E-01 .09779 .009525
+aline .114935 .009525
+aline .114935 -.000635
+aline .10668 -.000635
+aline .106045 0
+aline .07239 0
+aline .071755 .000635
+aline .056515 .000635
+aline .05588 0
+aline .022225 0
+aline .02159 -.000635
+aline .013335 -.000635
+aline .013335 .009525
+bezier .025262 .107861E-01 .401451E-01 .617013E-02 .04826 .01651
+aline .048895 .01905
+aline .04953 .019685
+aline .04953 .21844
+bezier .476616E-01 .227642 .375413E-01 .227749 .03048 .2286
+aline .013335 .2286
+aline .013335 .23876
+aline .131445 .23876
+closepath
+! end of curve
+
+! start of curve
+amove .08763 .227965
+aline .084455 .22733
+aline .08255 .226695
+aline .08128 .22606
+aline .080645 .22479
+aline .08001 .224155
+aline .079375 .221615
+aline .07874 .22098
+aline .07874 .12319
+aline .079375 .122555
+aline .12573 .122555
+bezier .147581 .123978 .175466 .135874 .177165 .161925
+bezier .182226 .184895 .17542 .215631 .149225 .22352
+aline .145415 .22479
+aline .140335 .22606
+aline .13716 .226695
+aline .136525 .22733
+aline .13335 .22733
+aline .132715 .227965
+aline .127 .227965
+aline .126365 .2286
+aline .088265 .2286
+aline .08763 .227965
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="S" !-------------- Beginning of new char.
+dfont wid=.555557 hei=.683332 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .09525 .24638
+bezier .113359 .24502 .131962 .23665 .14351 .22225
+bezier .149078 .230094 .152966 .23915 .159385 .24638
+aline .163195 .24638
+aline .16383 .245745
+aline .1651 .24511
+aline .1651 .16129
+aline .16383 .160655
+aline .163195 .16002
+aline .15875 .16002
+aline .158115 .160655
+bezier .153843 .187216 .143395 .222983 .11303 .233045
+bezier .890245E-01 .243682 .559481E-01 .235707 .04572 .208915
+bezier .343906E-01 .185146 .495707E-01 .153372 .075565 .146685
+bezier .106631 .137894 .14547 .136358 .163195 .10541
+bezier .190293 .651069E-01 .168236 .666941E-03 .11811 -.00762
+bezier .915386E-01 -.106157E-01 .614636E-01 -.426005E-02 .04191 .015875
+bezier .036342 .803085E-02 .324544E-01 -.10245E-02 .026035 -.008255
+aline .022225 -.008255
+aline .02159 -.00762
+aline .02032 -.006985
+aline .02032 .0762
+aline .022225 .078105
+aline .02667 .078105
+aline .027305 .07747
+aline .028575 .076835
+bezier .260169E-01 .423409E-01 .518474E-01 .789178E-02 .08763 .00381
+bezier .110023 -.304118E-02 .139131 .62428E-02 .147955 .03048
+bezier .161971 .573846E-01 .145822 .968141E-01 .1143 .102235
+aline .07874 .111125
+bezier .391247E-01 .115947 .113624E-01 .158407 .022225 .196215
+bezier .300993E-01 .22815 .062982 .249914 .09525 .24638
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="T" !-------------- Beginning of new char.
+dfont wid=.722224 hei=.683332 dep=0 italic=0
+dfont fby="A" kadd=-.083334
+dfont fby="a" kadd=-.083334
+dfont fby="e" kadd=-.083334
+dfont fby="o" kadd=-.083334
+dfont fby="r" kadd=-.083334
+dfont fby="u" kadd=-.083334
+dfont fby="y" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .23368 .236855
+bezier .236028 .210616 .238288 .184341 .240665 .158115
+aline .23241 .158115
+bezier .229594 .177833 .231125 .201886 .21463 .21717
+bezier .206336 .223442 .195347 .22512 .186055 .226695
+aline .151765 .226695
+aline .15113 .22606
+aline .147955 .225425
+aline .14605 .22479
+aline .14478 .224155
+aline .144145 .222885
+aline .14351 .22225
+aline .142875 .21971
+aline .14224 .219075
+aline .14224 .02032
+bezier .145872 .869008E-02 .15983 .111701E-01 .16891 .009525
+aline .19304 .009525
+aline .19304 -.000635
+aline .182245 -.000635
+aline .18161 0
+aline .137795 0
+aline .13716 .000635
+aline .11684 .000635
+aline .116205 0
+aline .07239 0
+aline .071755 -.000635
+aline .06096 -.000635
+aline .06096 .009525
+bezier .772244E-01 .104219E-01 .941485E-01 .712792E-02 .108585 .014605
+aline .10922 .015875
+aline .109855 .01651
+aline .11049 .01778
+aline .111125 .019685
+aline .11176 .02032
+aline .11176 .219075
+aline .111125 .21971
+aline .11049 .22225
+aline .109855 .222885
+aline .10922 .224155
+aline .10795 .22479
+aline .106045 .225425
+aline .10287 .22606
+aline .102235 .226695
+aline .067945 .226695
+bezier .051765 .225259 .312745E-01 .217825 .02794 .198755
+bezier .238319E-01 .185118 .229734E-01 .172014 .02159 .158115
+aline .013335 .158115
+bezier .157124E-01 .184341 .179721E-01 .210616 .02032 .236855
+aline .23368 .236855
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="U" !-------------- Beginning of new char.
+dfont wid=.750002 hei=.683332 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .02159 .23876
+aline .022225 .238125
+aline .05588 .238125
+aline .056515 .23749
+aline .071755 .23749
+aline .07239 .238125
+aline .106045 .238125
+aline .10668 .23876
+aline .11557 .23876
+aline .11557 .2286
+bezier .103643 .227339 .887599E-01 .231955 .080645 .221615
+aline .08001 .219075
+aline .079375 .21844
+aline .079375 .069215
+bezier .801852E-01 .416065E-01 .095444 .781671E-02 .127 .003175
+bezier .163631 -.495337E-02 .200124 .288533E-01 .2032 .065405
+aline .203835 .06604
+aline .203835 .07112
+aline .20447 .071755
+aline .20447 .20955
+bezier .200723 .225437 .182223 .229114 .168275 .2286
+aline .168275 .23876
+aline .17526 .23876
+aline .175895 .238125
+aline .202565 .238125
+aline .2032 .23749
+aline .2159 .23749
+aline .216535 .238125
+aline .243205 .238125
+aline .24384 .23876
+aline .250825 .23876
+aline .250825 .2286
+bezier .236877 .229114 .218377 .225437 .21463 .20955
+aline .21463 .07112
+bezier .212882 .284196E-01 .17308 -.148415E-01 .12827 -.00762
+bezier .873517E-01 -.549617E-02 .517682E-01 .311502E-01 .048895 .071755
+aline .048895 .21844
+bezier .470266E-01 .227642 .369063E-01 .227749 .029845 .2286
+aline .0127 .2286
+aline .0127 .23876
+aline .02159 .23876
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="V" !-------------- Beginning of new char.
+dfont wid=.750002 hei=.683332 dep=0 italic=.0138884
+dfont fby="A" kadd=-.111112
+dfont fby="C" kadd=-.0277786
+dfont fby="G" kadd=-.0277786
+dfont fby="O" kadd=-.0277786
+dfont fby="Q" kadd=-.0277786
+dfont fby="a" kadd=-.083334
+dfont fby="e" kadd=-.083334
+dfont fby="o" kadd=-.083334
+dfont fby="r" kadd=-.083334
+dfont fby="u" kadd=-.083334
+set path ! start of curve
+newpath
+! start of curve
+amove .01397 .23876
+aline .014605 .238125
+aline .042545 .238125
+aline .04318 .23749
+aline .057785 .23749
+aline .05842 .238125
+aline .092075 .238125
+aline .09271 .23876
+aline .1016 .23876
+aline .1016 .2286
+bezier .915028E-01 .228236 .761305E-01 .229814 .726017E-01 .217805
+bezier .956171E-01 .156575 .118521 .951089E-01 .14224 .03429
+bezier .164517 .091942 .185674 .150249 .20828 .207645
+bezier .210205 .221471 .194461 .229296 .18288 .2286
+aline .18288 .23876
+aline .18923 .23876
+aline .189865 .238125
+aline .21717 .238125
+aline .217805 .23749
+aline .2286 .23749
+aline .229235 .238125
+aline .25019 .238125
+aline .250825 .23876
+aline .25654 .23876
+aline .25654 .2286
+bezier .23814 .230053 .219473 .217812 .2159 .198755
+bezier .189048 .130198 .164984 .059914 .136525 -.00762
+aline .135255 -.008255
+aline .12827 -.008255
+bezier .120765 -.161149E-02 .120348 .103188E-01 .11557 .01905
+bezier .894127E-01 .869206E-01 .652789E-01 .15582 .037465 .222885
+bezier .028947 .230059 .175298E-01 .228152 .006985 .2286
+aline .006985 .23876
+aline .01397 .23876
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="W" !-------------- Beginning of new char.
+dfont wid=1.02778 hei=.683332 dep=0 italic=.0138884
+dfont fby="A" kadd=-.111112
+dfont fby="C" kadd=-.0277786
+dfont fby="G" kadd=-.0277786
+dfont fby="O" kadd=-.0277786
+dfont fby="Q" kadd=-.0277786
+dfont fby="a" kadd=-.083334
+dfont fby="e" kadd=-.083334
+dfont fby="o" kadd=-.083334
+dfont fby="r" kadd=-.083334
+dfont fby="u" kadd=-.083334
+set path ! start of curve
+newpath
+! start of curve
+amove .013335 .23876
+aline .01397 .238125
+aline .04064 .238125
+aline .041275 .23749
+aline .055245 .23749
+aline .05588 .238125
+aline .089535 .238125
+aline .09017 .23876
+aline .09906 .23876
+aline .09906 .2286
+bezier .886432E-01 .228461 .759305E-01 .229229 .069215 .21971
+bezier .865284E-01 .160052 .107743 .100367 .126365 .04064
+bezier .143529 .090821 .160379 .143186 .175895 .19304
+aline .17145 .206375
+bezier .169549 .216939 .163914 .229912 .15113 .227965
+aline .150495 .2286
+aline .13716 .2286
+aline .13716 .23876
+aline .144145 .23876
+aline .14478 .238125
+aline .17145 .238125
+aline .172085 .23749
+aline .18542 .23749
+aline .186055 .238125
+aline .220345 .238125
+aline .22098 .23876
+aline .229235 .23876
+aline .229235 .2286
+aline .21844 .2286
+bezier .211099 .227583 .195875 .224728 .20066 .21336
+bezier .219791 .15591 .237678 .977923E-01 .257175 .04064
+bezier .275186 .975549E-01 .295227 .154523 .311785 .211455
+bezier .308072 .22428 .29298 .228554 .281305 .2286
+aline .281305 .23876
+aline .28829 .23876
+aline .288925 .238125
+aline .3175 .238125
+aline .318135 .23749
+aline .32893 .23749
+aline .329565 .238125
+aline .34925 .238125
+aline .349885 .23876
+aline .35433 .23876
+aline .35433 .2286
+bezier .338353 .229572 .321369 .219004 .31877 .20193
+bezier .295197 .13231 .274623 .611445E-01 .249555 -.00762
+aline .248285 -.008255
+aline .24384 -.008255
+aline .2413 -.006985
+bezier .219743 .535743E-01 .201976 .117501 .180213 .176784
+bezier .159911 .115612 .141082 .538885E-01 .120015 -.006985
+aline .117475 -.008255
+aline .11303 -.008255
+aline .11176 -.00762
+bezier .839071E-01 .680281E-01 .624908E-01 .146885 .034925 .222885
+aline .03302 .22479
+aline .02921 .226695
+aline .026035 .22733
+aline .0254 .227965
+aline .02032 .227965
+aline .019685 .2286
+aline .006985 .2286
+aline .006985 .23876
+aline .013335 .23876
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="X" !-------------- Beginning of new char.
+dfont wid=.750002 hei=.683332 dep=0 italic=0
+dfont fby="C" kadd=-.0277786
+dfont fby="G" kadd=-.0277786
+dfont fby="O" kadd=-.0277786
+dfont fby="Q" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .020955 .23876
+aline .02159 .238125
+aline .050165 .238125
+aline .0508 .23749
+aline .06477 .23749
+aline .065405 .238125
+aline .10033 .238125
+aline .100965 .23876
+aline .109855 .23876
+aline .109855 .2286
+bezier .101815 .228634 .885557E-01 .225771 .086995 .21717
+bezier .102457 .192539 .118707 .168127 .135255 .144145
+bezier .148949 .167291 .167578 .187802 .178858 .21209
+bezier .177875 .222933 .16638 .228416 .156845 .2286
+aline .156845 .23876
+aline .164465 .23876
+aline .1651 .238125
+aline .19558 .238125
+aline .196215 .23749
+aline .20828 .23749
+aline .208915 .238125
+aline .233045 .238125
+aline .23368 .23876
+aline .24003 .23876
+aline .24003 .2286
+bezier .218004 .229659 .194303 .219008 .18415 .19812
+bezier .170266 .176829 .153828 .154949 .141605 .133985
+bezier .168781 .094404 .193357 .529483E-01 .22225 .014605
+bezier .231972 .842584E-02 .243302 .984874E-02 .254635 .009525
+aline .254635 -.000635
+aline .24765 -.000635
+aline .247015 0
+aline .21844 0
+aline .217805 .000635
+aline .2032 .000635
+aline .202565 0
+aline .168275 0
+aline .16764 -.000635
+aline .15875 -.000635
+aline .15875 .009525
+bezier .1666 .010002 .178461 .114251E-01 .181356 .02032
+bezier .163785 .505315E-01 .142721 .079022 .123825 .108585
+bezier .106203 .081651 .863769E-01 .558083E-01 .070485 .02794
+bezier .688302E-01 .161702E-01 .822758E-01 .951502E-02 .092075 .009525
+aline .092075 -.000635
+aline .084455 -.000635
+aline .08382 0
+aline .05334 0
+aline .052705 .000635
+aline .04064 .000635
+aline .040005 0
+aline .01524 0
+aline .014605 -.000635
+aline .00889 -.000635
+aline .00889 .009525
+bezier .314056E-01 .840671E-02 .555362E-01 .196701E-01 .065405 .041275
+bezier .829526E-01 .666803E-01 .100212 .924363E-01 .117263 .11811
+bezier .939974E-01 .153042 .718726E-01 .189029 .04699 .222885
+bezier .372021E-01 .229785 .255864E-01 .228294 .01397 .2286
+aline .01397 .23876
+aline .020955 .23876
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="Y" !-------------- Beginning of new char.
+dfont wid=.750002 hei=.683332 dep=0 italic=.0249996
+dfont fby="A" kadd=-.083334
+dfont fby="a" kadd=-.083334
+dfont fby="e" kadd=-.083334
+dfont fby="o" kadd=-.083334
+dfont fby="r" kadd=-.083334
+dfont fby="u" kadd=-.083334
+set path ! start of curve
+newpath
+! start of curve
+amove .012065 .23876
+aline .0127 .238125
+aline .041275 .238125
+aline .04191 .23749
+aline .056515 .23749
+aline .05715 .238125
+aline .09144 .238125
+aline .092075 .23876
+aline .100965 .23876
+aline .100965 .2286
+bezier .924924E-01 .22853 .828923E-01 .228918 .076835 .22225
+bezier .780577E-01 .209426 .894728E-01 .199736 .094615 .18796
+bezier .110959 .161899 .1269 .135547 .142875 .10922
+bezier .163424 .14359 .185846 .177103 .205105 .21209
+bezier .206682 .223142 .194115 .229158 .184785 .2286
+aline .184785 .23876
+aline .19177 .23876
+aline .192405 .238125
+aline .21971 .238125
+aline .220345 .23749
+aline .23114 .23749
+aline .231775 .238125
+aline .253365 .238125
+aline .254 .23876
+aline .25908 .23876
+aline .25908 .2286
+bezier .237327 .229891 .216793 .215617 .20828 .19558
+bezier .187431 .162001 .166994 .128125 .14605 .094615
+aline .14605 .02159
+bezier .146732 .122694E-01 .15645 .939469E-02 .164465 .01016
+aline .1651 .009525
+aline .182245 .009525
+aline .182245 -.000635
+aline .17399 -.000635
+aline .173355 0
+aline .1397 0
+aline .139065 .000635
+aline .123825 .000635
+aline .12319 0
+aline .09017 0
+aline .089535 -.000635
+aline .080645 -.000635
+aline .080645 .009525
+bezier .092572 .107861E-01 .107455 .617012E-02 .11557 .01651
+aline .116205 .01905
+aline .11684 .019685
+aline .11684 .09525
+bezier .898132E-01 .137385 .653977E-01 .181403 .037465 .222885
+bezier .277998E-01 .229821 .160413E-01 .228256 .004445 .2286
+aline .004445 .23876
+aline .012065 .23876
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="Z" !-------------- Beginning of new char.
+dfont wid=.611113 hei=.683332 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .19177 .23876
+bezier .199129 .232568 .189323 .223856 .186055 .217805
+bezier .143421 .148636 .976194E-01 .799223E-01 .056515 .010795
+aline .122555 .010795
+bezier .144869 .117914E-01 .172954 .208393E-01 .18034 .04572
+bezier .18582 .615129E-01 .187165 .766502E-01 .18796 .09271
+aline .196215 .09271
+bezier .1944 .615578E-01 .192315 .305172E-01 .1905 -.000635
+aline .02286 -.000635
+bezier .153096E-01 .625778E-02 .256435E-01 .156176E-01 .02921 .022225
+bezier .719578E-01 .091024 .117316 .16038 .15875 .2286
+aline .09525 .2286
+bezier .735394E-01 .227708 .468661E-01 .218089 .03937 .19431
+aline .037465 .188595
+aline .036195 .183515
+aline .034925 .177165
+aline .03429 .17653
+aline .03429 .172085
+aline .033655 .17145
+aline .033655 .1651
+aline .03302 .164465
+aline .03302 .16002
+aline .024765 .16002
+bezier .260907E-01 .186244 .272493E-01 .212536 .028575 .23876
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="[" !-------------- Beginning of new char.
+dfont wid=.277779 hei=.75 dep=.25 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .089535 .262255
+aline .089535 .248285
+aline .05588 .248285
+aline .055245 .24765
+aline .055245 -.07366
+aline .05588 -.074295
+aline .089535 -.074295
+aline .089535 -.088265
+aline .041275 -.088265
+aline .041275 .262255
+aline .089535 .262255
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="\" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .088265 .24257
+aline .09017 .240665
+aline .09017 .23749
+bezier .071103 .219915 .574017E-01 .192133 .06223 .167005
+bezier .708782E-01 .179384 .933954E-01 .174868 .09525 .159385
+bezier .990506E-01 .143191 .789229E-01 .13133 .06604 .14097
+bezier .484139E-01 .157609 .531543E-01 .18437 .059055 .205105
+bezier .645027E-01 .219742 .734113E-01 .232922 .085725 .24257
+aline .088265 .24257
+closepath
+! end of curve
+
+! start of curve
+amove .156845 .24257
+aline .15875 .240665
+aline .15875 .23749
+bezier .139683 .219915 .125982 .192133 .13081 .167005
+bezier .139458 .179384 .161975 .174868 .16383 .159385
+bezier .167631 .143191 .147503 .13133 .13462 .14097
+bezier .116994 .157609 .121734 .18437 .127635 .205105
+bezier .133083 .219742 .141991 .232922 .154305 .24257
+aline .156845 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="]" !-------------- Beginning of new char.
+dfont wid=.277779 hei=.75 dep=.25 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .056515 .262255
+aline .056515 -.088265
+aline .008255 -.088265
+aline .008255 -.074295
+aline .04191 -.074295
+aline .042545 -.07366
+aline .042545 .24765
+aline .04191 .248285
+aline .008255 .248285
+aline .008255 .262255
+aline .056515 .262255
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="^" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .088265 .241935
+aline .122555 .207645
+aline .12319 .206375
+aline .13462 .194945
+aline .128905 .18923
+bezier .114635 .199765 .101449 .215142 .086995 .224155
+bezier .738208E-01 .212352 .605133E-01 .200231 .04699 .18923
+aline .041275 .194945
+aline .052705 .206375
+aline .05334 .207645
+aline .08763 .241935
+aline .088265 .241935
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="_" !-------------- Beginning of new char.
+dfont wid=.277779 hei=.667859 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .05207 .234315
+bezier .703003E-01 .23144 .722613E-01 .20412 .05461 .198755
+bezier .378702E-01 .192864 .236103E-01 .214344 .03429 .22733
+aline .037465 .230505
+aline .038735 .23114
+aline .03937 .231775
+aline .04318 .23368
+aline .04572 .234315
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="`" !-------------- Beginning of new char.
+dfont wid=.277779 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .060325 .24257
+aline .06223 .240665
+aline .06223 .23749
+bezier .043163 .219915 .294617E-01 .192133 .03429 .167005
+bezier .429382E-01 .179384 .654554E-01 .174868 .06731 .159385
+bezier .711106E-01 .143191 .509829E-01 .13133 .0381 .14097
+bezier .204739E-01 .157609 .252143E-01 .18437 .031115 .205105
+bezier .365627E-01 .219742 .454713E-01 .232922 .057785 .24257
+aline .060325 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="a" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.430555 dep=0 italic=0
+dfont fby="j" kadd=.0555553
+dfont fby="v" kadd=-.0277786
+dfont fby="w" kadd=-.0277786
+dfont fby="y" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .08509 .155575
+bezier .108773 .153644 .135234 .137021 .13843 .111125
+aline .13843 .023495
+bezier .139309 .143963E-01 .148779 .236898E-02 .158115 .01016
+aline .159385 .010795
+aline .16002 .01143
+aline .160655 .0127
+aline .16129 .013335
+aline .163195 .017145
+aline .16383 .019685
+aline .164465 .02286
+aline .1651 .023495
+aline .1651 .04953
+aline .173355 .04953
+bezier .1736 .322091E-01 .176404 .93762E-02 .15748 .000635
+bezier .139689 -.102175E-01 .118177 .610385E-02 .117475 .0254
+bezier .10841 .20035E-02 .806338E-01 -.922766E-02 .057785 -.003175
+bezier .364999E-01 -.231232E-02 .111571E-01 .013173 .01524 .037465
+bezier .216653E-01 .762967E-01 .677495E-01 .876261E-01 .10033 .09017
+aline .11049 .09017
+aline .111125 .090805
+aline .1143 .090805
+bezier .119286 .114052 .107803 .144433 .081915 .14859
+bezier .066972 .149096 .505328E-01 .145077 .040005 .13335
+bezier .544701E-01 .134115 .629193E-01 .115954 .05334 .10541
+bezier .447989E-01 .968174E-01 .267703E-01 .10067 .0254 .113665
+bezier .224304E-01 .139151 .497521E-01 .15421 .07112 .155575
+aline .08509 .155575
+closepath
+! end of curve
+
+! start of curve
+amove .10795 .083185
+bezier .810619E-01 .823246E-01 .045912 .684984E-01 .042545 .037465
+bezier .373512E-01 .135296E-01 .677761E-01 -.613086E-02 .088265 .005715
+bezier .103021 .010936 .112121 .026381 .114935 .04064
+aline .114935 .083185
+aline .1143 .08382
+aline .108585 .08382
+aline .10795 .083185
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="b" !-------------- Beginning of new char.
+dfont wid=.555557 hei=.694445 dep=0 italic=0
+dfont fby="c" kadd=.0277786
+dfont fby="d" kadd=.0277786
+dfont fby="e" kadd=.0277786
+dfont fby="j" kadd=.0555553
+dfont fby="o" kadd=.0277786
+dfont fby="q" kadd=.0277786
+dfont fby="v" kadd=-.0277786
+dfont fby="w" kadd=-.0277786
+dfont fby="x" kadd=-.0277786
+dfont fby="y" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .060325 .24257
+aline .060325 .13208
+bezier .708442E-01 .140786 .846584E-01 .153404 .100965 .153035
+bezier .141494 .159243 .180518 .121907 .182245 .081915
+bezier .187231 .039835 .152581 -.185973E-02 .11049 -.004445
+bezier .902219E-01 -.671148E-02 .696533E-01 .353774E-02 .059055 .020955
+bezier .549064E-01 .136973E-01 .509212E-01 .632172E-02 .046355 -.000635
+aline .0381 -.000635
+aline .0381 .2159
+bezier .363966E-01 .229263 .212244E-01 .228888 .010795 .2286
+aline .010795 .23876
+bezier .272545E-01 .240152 .438655E-01 .241178 .060325 .24257
+closepath
+! end of curve
+
+! start of curve
+amove .1016 .14605
+bezier .843097E-01 .144615 .691054E-01 .132273 .061595 .11684
+aline .061595 .03302
+bezier .707719E-01 .102614E-01 .976942E-01 -.513128E-02 .12065 .00635
+bezier .143312 .158167E-01 .152368 .424284E-01 .15367 .064135
+bezier .154897 .925874E-01 .152018 .128415 .12319 .142875
+aline .121285 .14351
+aline .120015 .144145
+aline .11811 .14478
+aline .11557 .145415
+aline .112395 .14605
+aline .11176 .146685
+aline .102235 .146685
+aline .1016 .14605
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="c" !-------------- Beginning of new char.
+dfont wid=.444446 hei=.430555 dep=0 italic=0
+dfont fby="h" kadd=-.0277786
+dfont fby="k" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .09525 .155575
+bezier .117487 .154946 .147115 .139343 .14097 .11303
+bezier .13594 .988256E-01 .111399 .100745 .109855 .116205
+bezier .107646 .126438 .115863 .135081 .12573 .13589
+bezier .103361 .15283 .663781E-01 .152105 .052705 .12446
+bezier .368076E-01 .944818E-01 .370626E-01 .05764 .052705 .027305
+bezier .657045E-01 .325373E-02 .985493E-01 -.363684E-02 .120015 .013335
+bezier .129825 .020786 .134394 .032942 .139065 .04318
+aline .1397 .043815
+aline .144145 .043815
+aline .14478 .04318
+aline .14605 .042545
+bezier .142658 .841202E-02 .103638 -.110675E-01 .073025 -.003175
+bezier .278452E-01 .575718E-02 .240789E-02 .573614E-01 .015875 .09906
+bezier .249556E-01 .133601 .594707E-01 .159181 .09525 .155575
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="d" !-------------- Beginning of new char.
+dfont wid=.555557 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .156845 .24257
+aline .156845 .022225
+bezier .158548 .886187E-02 .173721 .923737E-02 .18415 .009525
+aline .18415 -.000635
+bezier .167271 -.203548E-02 .150229 -.304452E-02 .13335 -.004445
+aline .13335 .017145
+bezier .123314 .85089E-02 .109467 -.437448E-02 .093345 -.00381
+bezier .476694E-01 -.106068E-01 .583453E-02 .375614E-01 .013335 .081915
+bezier .138428E-01 .133957 .820822E-01 .175254 .125095 .141605
+aline .133985 .132715
+aline .13462 .13335
+aline .13462 .2159
+bezier .132917 .229263 .117744 .228888 .107315 .2286
+aline .107315 .23876
+bezier .123775 .240152 .140385 .241178 .156845 .24257
+closepath
+! end of curve
+
+! start of curve
+amove .08636 .14605
+bezier .569582E-01 .143152 .419082E-01 .110659 .041275 .08509
+bezier .400481E-01 .566376E-01 .042927 .208104E-01 .071755 .00635
+bezier .956448E-01 -.53411E-02 .123309 .115434E-01 .13335 .03429
+aline .13335 .11811
+bezier .125249 .135646 .105618 .149668 .08636 .14605
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="e" !-------------- Beginning of new char.
+dfont wid=.444446 hei=.430555 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .09017 .155575
+bezier .121653 .154516 .146234 .124692 .145415 .09398
+aline .14605 .093345
+aline .14605 .08255
+aline .144145 .080645
+aline .03937 .080645
+bezier .361632E-01 .524047E-01 .456583E-01 .147839E-01 .07747 .005715
+bezier .102429 -.230878E-02 .132464 .162401E-01 .137795 .042545
+aline .1397 .04445
+aline .144145 .04445
+bezier .149138 .375296E-01 .141047 .281702E-01 .137795 .02159
+bezier .116078 -.113539E-01 .676189E-01 -.114828E-01 .03937 .0127
+bezier -.371811E-02 .467587E-01 .187458E-02 .120967 .050165 .14732
+aline .055245 .14986
+aline .05715 .150495
+aline .05842 .15113
+aline .06604 .15367
+aline .06858 .154305
+aline .071755 .15494
+aline .075565 .15494
+aline .0762 .155575
+aline .09017 .155575
+closepath
+! end of curve
+
+! start of curve
+amove .07874 .147955
+bezier .514933E-01 .144273 .378616E-01 .111446 .040005 .08763
+aline .122555 .08763
+bezier .124551 .110413 .115616 .14415 .08763 .147955
+aline .086995 .14859
+aline .079375 .14859
+aline .07874 .147955
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="f" !-------------- Beginning of new char.
+dfont wid=.305557 hei=.694445 dep=0 italic=.0777788
+dfont fby=33 kadd=.0777788
+dfont fby=39 kadd=.0777788
+dfont fby=")" kadd=.0777788
+dfont fby="?" kadd=.0777788
+dfont fby="]" kadd=.0777788
+dfont fby="f" ligrep=11
+dfont fby="i" ligrep=12
+dfont fby="l" ligrep=13
+set path ! start of curve
+newpath
+! start of curve
+amove .098425 .24638
+bezier .114299 .245511 .13063 .229584 .122555 .21336
+bezier .114001 .200176 .905909E-01 .208675 .094615 .22479
+bezier .946717E-01 .230897 .101122 .234216 .104394 .236982
+bezier .831829E-01 .247008 .646318E-01 .224204 .06223 .20447
+aline .061595 .203835
+aline .061595 .19939
+aline .06096 .198755
+aline .06096 .150495
+aline .061595 .14986
+aline .102235 .14986
+aline .102235 .1397
+aline .062865 .1397
+aline .06223 .139065
+aline .06223 .019685
+bezier .635128E-01 .108566E-01 .733713E-01 .105225E-01 .08001 .009525
+aline .09652 .009525
+aline .09652 -.000635
+aline .0889 -.000635
+aline .088265 0
+aline .05842 0
+aline .057785 .000635
+aline .04572 .000635
+aline .045085 0
+aline .019685 0
+aline .01905 -.000635
+aline .0127 -.000635
+aline .0127 .009525
+bezier .223142E-01 .102204E-01 .361596E-01 .700019E-02 .040005 .018415
+aline .040005 .139065
+aline .03937 .1397
+aline .01143 .1397
+aline .01143 .14986
+aline .03937 .14986
+aline .040005 .150495
+aline .040005 .19812
+bezier .415942E-01 .222718 .063359 .243939 .08763 .24638
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="g" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.430555 dep=.194445 italic=.0138884
+dfont fby="j" kadd=.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .15621 .15748
+bezier .169454 .156861 .177097 .134001 .161925 .130175
+bezier .150162 .128212 .145856 .144797 .155575 .14986
+bezier .143451 .151817 .129547 .145616 .12065 .136525
+bezier .144622 .11439 .136204 .721143E-01 .107315 .05842
+bezier .872175E-01 .479219E-01 .616853E-01 .488138E-01 .04318 .06223
+bezier .317893E-01 .048848 .382558E-01 .253898E-01 .05588 .02159
+aline .10287 .02159
+bezier .127732 .210963E-01 .161026 .104945E-01 .1651 -.01905
+bezier .170008 -.369318E-01 .157648 -.543627E-01 .141605 -.061595
+bezier .1083 -.782427E-01 .686142E-01 -.778328E-01 .034925 -.06223
+bezier .176277E-01 -.542505E-01 .293515E-02 -.337447E-01 .013335 -.014605
+bezier .195173E-01 -.38767E-02 .305893E-01 .277478E-02 .04191 .006985
+bezier .226717E-01 .201175E-01 .232437E-01 .497752E-01 .373062E-01 .663575E-01
+bezier .123446E-01 .880147E-01 .182585E-01 .131941 .04826 .14605
+bezier .688439E-01 .157997 .959276E-01 .155859 .114935 .141817
+bezier .124508 .149078 .135532 .156727 .147955 .15748
+closepath
+! end of curve
+
+! start of curve
+amove .07366 .145415
+bezier .466942E-01 .141029 .441803E-01 .10791 .04826 .086995
+bezier .499827E-01 .644583E-01 .782756E-01 .503372E-01 .095885 .065405
+bezier .112891 .805776E-01 .111485 .1071 .10541 .127
+bezier .100824 .139643 .872976E-01 .147101 .074295 .14605
+closepath
+! end of curve
+
+! start of curve
+amove .05461 .00127
+bezier .316016E-01 -.879658E-03 .018771 -.323809E-01 .03683 -.04826
+bezier .065441 -.072291 .110454 -.072291 .139065 -.04826
+bezier .153422 -.356855E-01 .148802 -.109811E-01 .13081 -.004445
+bezier .121486 -.373231E-03 .11161 .841854E-03 .102235 .001905
+aline .055245 .001905
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="h" !-------------- Beginning of new char.
+dfont wid=.555557 hei=.694445 dep=0 italic=0
+dfont fby="b" kadd=-.0277786
+dfont fby="t" kadd=-.0277786
+dfont fby="u" kadd=-.0277786
+dfont fby="v" kadd=-.0277786
+dfont fby="w" kadd=-.0277786
+dfont fby="y" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .061595 .24257
+aline .061595 .121285
+bezier .700228E-01 .134937 .857348E-01 .152994 .10541 .153035
+bezier .128035 .157774 .157128 .14501 .15875 .118745
+aline .15875 .1143
+aline .159385 .113665
+aline .159385 .018415
+bezier .16323 .700018E-02 .177076 .102204E-01 .18669 .009525
+aline .18669 -.000635
+aline .18034 -.000635
+aline .179705 0
+aline .154305 0
+aline .15367 .000635
+aline .141605 .000635
+aline .14097 0
+aline .11557 0
+aline .114935 -.000635
+aline .108585 -.000635
+aline .108585 .009525
+bezier .118199 .102204E-01 .132045 .700018E-02 .13589 .018415
+aline .13589 .116205
+bezier .134599 .128433 .129534 .144383 .114935 .146685
+bezier .872265E-01 .149552 .654122E-01 .12335 .062865 .09779
+aline .062865 .018415
+bezier .667104E-01 .700018E-02 .805558E-01 .102204E-01 .09017 .009525
+aline .09017 -.000635
+aline .08382 -.000635
+aline .083185 0
+aline .057785 0
+aline .05715 .000635
+aline .045085 .000635
+aline .04445 0
+aline .01905 0
+aline .018415 -.000635
+aline .012065 -.000635
+aline .012065 .009525
+bezier .216792E-01 .102204E-01 .355246E-01 .700019E-02 .03937 .018415
+aline .03937 .2159
+bezier .376666E-01 .229263 .224944E-01 .228888 .012065 .2286
+aline .012065 .23876
+bezier .285245E-01 .240152 .451355E-01 .241178 .061595 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="i" !-------------- Beginning of new char.
+dfont wid=.277779 hei=.667859 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .04826 .234315
+bezier .676841E-01 .231725 .676841E-01 .20071 .04826 .19812
+bezier .299414E-01 .194125 .185288E-01 .220729 .03429 .23114
+aline .03683 .23241
+aline .037465 .233045
+aline .03937 .23368
+aline .04191 .234315
+closepath
+! end of curve
+
+! start of curve
+amove .061595 .15367
+aline .061595 .018415
+bezier .064539 .756568E-02 .774217E-01 .983781E-02 .08636 .009525
+aline .08636 -.000635
+aline .080645 -.000635
+aline .08001 0
+aline .056515 0
+aline .05588 .000635
+aline .045085 .000635
+aline .04445 0
+aline .01905 0
+aline .018415 -.000635
+aline .012065 -.000635
+aline .012065 .009525
+bezier .216792E-01 .102204E-01 .355246E-01 .700019E-02 .03937 .018415
+aline .03937 .127
+aline .038735 .127635
+bezier .379249E-01 .140592 .022969 .139946 .013335 .1397
+aline .013335 .14986
+bezier .029366 .151264 .455716E-01 .152247 .061595 .15367
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="j" !-------------- Beginning of new char.
+dfont wid=.305557 hei=.667859 dep=.194445 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .059055 .234315
+bezier .761195E-01 .231453 .789819E-01 .205731 .062865 .19939
+bezier .461774E-01 .191119 .285457E-01 .214762 .04191 .227965
+aline .042545 .229235
+aline .043815 .22987
+aline .045085 .23114
+aline .046355 .231775
+aline .04699 .23241
+aline .04826 .233045
+aline .050165 .23368
+aline .05207 .234315
+closepath
+! end of curve
+
+! start of curve
+amove .07366 .15367
+aline .07366 -.026035
+bezier .072073 -.544231E-01 .437289E-01 -.794388E-01 .01524 -.07239
+bezier -.190766E-02 -.708461E-01 -.214368E-01 -.521988E-01 -.01016 -.034925
+bezier -.449389E-03 -.220667E-01 .223406E-01 -.322139E-01 .018415 -.04826
+aline .01778 -.0508
+aline .015875 -.05461
+aline .0127 -.057785
+aline .01143 -.05842
+aline .010795 -.059055
+aline .008255 -.060325
+aline .005715 -.06096
+bezier .019171 -.690429E-01 .404742E-01 -.684123E-01 .04572 -.0508
+aline .046355 -.04953
+aline .04826 -.043815
+aline .048895 -.041275
+aline .04953 -.0381
+aline .050165 -.037465
+aline .050165 -.03429
+aline .0508 -.033655
+aline .0508 -.02794
+aline .051435 -.027305
+aline .051435 .127
+aline .0508 .127635
+bezier .488352E-01 .141579 .320432E-01 .139336 .02159 .1397
+aline .02159 .14986
+bezier .038926 .15118 .563006E-01 .152407 .07366 .15367
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="k" !-------------- Beginning of new char.
+dfont wid=.527781 hei=.694445 dep=0 italic=0
+dfont fby="a" kadd=-.0555553
+dfont fby="c" kadd=-.0277786
+dfont fby="e" kadd=-.0277786
+dfont fby="o" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .060325 .24257
+aline .060325 .07493
+bezier .759149E-01 .856252E-01 .914841E-01 .101825 .107315 .1143
+aline .114935 .12192
+bezier .120996 .128666 .117625 .139402 .10795 .1397
+aline .10795 .14986
+aline .114935 .14986
+aline .11557 .149225
+aline .14351 .149225
+aline .144145 .14859
+aline .15367 .14859
+aline .154305 .149225
+aline .16764 .149225
+aline .168275 .14986
+aline .17145 .14986
+aline .17145 .1397
+bezier .141134 .13856 .119931 .112996 .09779 .09525
+bezier .118337 .068837 .134741 .394384E-01 .15748 .014605
+aline .15875 .01397
+aline .159385 .013335
+aline .161925 .012065
+aline .16383 .01143
+aline .16637 .010795
+aline .167005 .01016
+aline .17018 .01016
+aline .170815 .009525
+aline .17907 .009525
+aline .17907 -.000635
+aline .174625 -.000635
+aline .17399 0
+aline .155575 0
+aline .15494 .000635
+aline .145415 .000635
+aline .14478 0
+aline .118745 0
+aline .11811 -.000635
+aline .11176 -.000635
+aline .11176 .009525
+bezier .120252 .783813E-02 .128393 .016329 .122555 .02413
+bezier .109798 .435766E-01 .962632E-01 .628145E-01 .822325E-01 .811213E-01
+bezier .074311 .753894E-01 .675172E-01 .680928E-01 .05969 .06223
+aline .05969 .018415
+bezier .635354E-01 .700018E-02 .773808E-01 .102204E-01 .086995 .009525
+aline .086995 -.000635
+aline .080645 -.000635
+aline .08001 0
+aline .055245 0
+aline .05461 .000635
+aline .04318 .000635
+aline .042545 0
+aline .01778 0
+aline .017145 -.000635
+aline .010795 -.000635
+aline .010795 .009525
+bezier .204092E-01 .102204E-01 .342546E-01 .700019E-02 .0381 .018415
+aline .0381 .2159
+bezier .363966E-01 .229263 .212244E-01 .228888 .010795 .2286
+aline .010795 .23876
+bezier .272545E-01 .240152 .438655E-01 .241178 .060325 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="l" !-------------- Beginning of new char.
+dfont wid=.277779 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .061595 .24257
+aline .061595 .018415
+bezier .654404E-01 .700018E-02 .792858E-01 .102204E-01 .0889 .009525
+aline .0889 -.000635
+aline .08255 -.000635
+aline .081915 0
+aline .056515 0
+aline .05588 .000635
+aline .045085 .000635
+aline .04445 0
+aline .01905 0
+aline .018415 -.000635
+aline .012065 -.000635
+aline .012065 .009525
+bezier .216792E-01 .102204E-01 .355246E-01 .700019E-02 .03937 .018415
+aline .03937 .2159
+bezier .376666E-01 .229263 .224944E-01 .228888 .012065 .2286
+aline .012065 .23876
+bezier .285245E-01 .240152 .451355E-01 .241178 .061595 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="m" !-------------- Beginning of new char.
+dfont wid=.833336 hei=.430555 dep=0 italic=0
+dfont fby="b" kadd=-.0277786
+dfont fby="t" kadd=-.0277786
+dfont fby="u" kadd=-.0277786
+dfont fby="v" kadd=-.0277786
+dfont fby="w" kadd=-.0277786
+dfont fby="y" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .06096 .15367
+aline .06096 .11938
+bezier .068772 .134097 .851101E-01 .152664 .10541 .153035
+bezier .127611 .157493 .15608 .146029 .159385 .12065
+bezier .173086 .15493 .223752 .166165 .24892 .13843
+aline .249555 .13716
+aline .25019 .136525
+aline .250825 .135255
+aline .25146 .13462
+aline .253365 .13081
+aline .25527 .125095
+aline .25654 .118745
+aline .25654 .1143
+aline .257175 .113665
+aline .257175 .018415
+bezier .26102 .700018E-02 .274866 .102204E-01 .28448 .009525
+aline .28448 -.000635
+aline .27813 -.000635
+aline .277495 0
+aline .252095 0
+aline .25146 .000635
+aline .239395 .000635
+aline .23876 0
+aline .21336 0
+aline .212725 -.000635
+aline .206375 -.000635
+aline .206375 .009525
+bezier .215989 .102204E-01 .229835 .700018E-02 .23368 .018415
+aline .23368 .116205
+bezier .23244 .128614 .22691 .144824 .21209 .146685
+bezier .184476 .149354 .162708 .123299 .16002 .09779
+aline .16002 .018415
+bezier .163865 .700018E-02 .177711 .102204E-01 .187325 .009525
+aline .187325 -.000635
+aline .180975 -.000635
+aline .18034 0
+aline .15494 0
+aline .154305 .000635
+aline .14224 .000635
+aline .141605 0
+aline .116205 0
+aline .11557 -.000635
+aline .10922 -.000635
+aline .10922 .009525
+bezier .118834 .102204E-01 .13268 .700018E-02 .136525 .018415
+aline .136525 .116205
+bezier .135285 .128614 .129755 .144824 .114935 .146685
+bezier .873205E-01 .149354 .655532E-01 .123299 .062865 .09779
+aline .062865 .018415
+bezier .667104E-01 .700018E-02 .805558E-01 .102204E-01 .09017 .009525
+aline .09017 -.000635
+aline .08382 -.000635
+aline .083185 0
+aline .057785 0
+aline .05715 .000635
+aline .045085 .000635
+aline .04445 0
+aline .01905 0
+aline .018415 -.000635
+aline .012065 -.000635
+aline .012065 .009525
+bezier .216792E-01 .102204E-01 .355246E-01 .700019E-02 .03937 .018415
+aline .03937 .127
+bezier .376666E-01 .140363 .224944E-01 .139988 .012065 .1397
+aline .012065 .14986
+bezier .283008E-01 .151281 .447148E-01 .152272 .06096 .15367
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="n" !-------------- Beginning of new char.
+dfont wid=.555557 hei=.430555 dep=0 italic=0
+dfont fby="b" kadd=-.0277786
+dfont fby="t" kadd=-.0277786
+dfont fby="u" kadd=-.0277786
+dfont fby="v" kadd=-.0277786
+dfont fby="w" kadd=-.0277786
+dfont fby="y" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .06096 .15367
+aline .06096 .120015
+bezier .661314E-01 .126795 .0724 .138959 .081915 .144145
+bezier .10386 .160189 .142878 .157584 .155575 .13081
+aline .15748 .125095
+aline .15875 .118745
+aline .15875 .1143
+aline .159385 .113665
+aline .159385 .018415
+bezier .16323 .700018E-02 .177076 .102204E-01 .18669 .009525
+aline .18669 -.000635
+aline .18034 -.000635
+aline .179705 0
+aline .154305 0
+aline .15367 .000635
+aline .141605 .000635
+aline .14097 0
+aline .11557 0
+aline .114935 -.000635
+aline .108585 -.000635
+aline .108585 .009525
+bezier .118199 .102204E-01 .132045 .700018E-02 .13589 .018415
+aline .13589 .116205
+bezier .134599 .128433 .129534 .144383 .114935 .146685
+bezier .872265E-01 .149552 .654122E-01 .12335 .062865 .09779
+aline .062865 .018415
+bezier .667104E-01 .700018E-02 .805558E-01 .102204E-01 .09017 .009525
+aline .09017 -.000635
+aline .08382 -.000635
+aline .083185 0
+aline .057785 0
+aline .05715 .000635
+aline .045085 .000635
+aline .04445 0
+aline .01905 0
+aline .018415 -.000635
+aline .012065 -.000635
+aline .012065 .009525
+bezier .216792E-01 .102204E-01 .355246E-01 .700019E-02 .03937 .018415
+aline .03937 .127
+bezier .376666E-01 .140363 .224944E-01 .139988 .012065 .1397
+aline .012065 .14986
+bezier .283008E-01 .151281 .447148E-01 .152272 .06096 .15367
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="o" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.430555 dep=0 italic=0
+dfont fby="c" kadd=.0277786
+dfont fby="d" kadd=.0277786
+dfont fby="e" kadd=.0277786
+dfont fby="j" kadd=.0555553
+dfont fby="o" kadd=.0277786
+dfont fby="q" kadd=.0277786
+dfont fby="v" kadd=-.0277786
+dfont fby="w" kadd=-.0277786
+dfont fby="x" kadd=-.0277786
+dfont fby="y" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .094615 .155575
+bezier .147902 .151615 .181788 .878467E-01 .15875 .04064
+bezier .13893 -.495178E-02 .752415E-01 -.193551E-01 .0381 .013335
+bezier -.568824E-02 .480097E-01 .434736E-02 .122977 .05334 .14732
+aline .05588 .14859
+aline .057785 .149225
+aline .060325 .150495
+aline .067945 .153035
+aline .073025 .154305
+aline .0762 .15494
+aline .080645 .15494
+aline .08128 .155575
+aline .094615 .155575
+closepath
+! end of curve
+
+! start of curve
+amove .08255 .147955
+bezier .551996E-01 .146056 .384159E-01 .117249 .03937 .092075
+bezier .375518E-01 .637613E-01 .369337E-01 .028888 .0635 .010795
+bezier .893416E-01 -.649387E-02 .127082 .010047 .13335 .04064
+bezier .138973 .659787E-01 .139785 .094809 .13081 .120015
+bezier .123186 .138568 .101922 .15132 .08255 .147955
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="p" !-------------- Beginning of new char.
+dfont wid=.555557 hei=.430555 dep=.194445 italic=0
+dfont fby="c" kadd=.0277786
+dfont fby="d" kadd=.0277786
+dfont fby="e" kadd=.0277786
+dfont fby="j" kadd=.0555553
+dfont fby="o" kadd=.0277786
+dfont fby="q" kadd=.0277786
+dfont fby="v" kadd=-.0277786
+dfont fby="w" kadd=-.0277786
+dfont fby="x" kadd=-.0277786
+dfont fby="y" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .060325 .15367
+aline .060325 .131445
+bezier .732401E-01 .145002 .956564E-01 .157449 .116205 .153035
+bezier .165652 .149454 .194718 .09094 .1778 .047625
+bezier .164457 .542279E-02 .106151 -.219177E-01 .06985 .008255
+aline .062865 .01524
+aline .06223 .01651
+aline .061595 .015875
+aline .061595 -.050165
+bezier .654404E-01 -.615798E-01 .792858E-01 -.583596E-01 .0889 -.059055
+aline .0889 -.069215
+aline .08255 -.069215
+aline .081915 -.06858
+aline .056515 -.06858
+aline .05588 -.067945
+aline .043815 -.067945
+aline .04318 -.06858
+aline .01778 -.06858
+aline .017145 -.069215
+aline .010795 -.069215
+aline .010795 -.059055
+bezier .204092E-01 -.583596E-01 .342546E-01 -.615798E-01 .0381 -.050165
+aline .0381 .128905
+bezier .357456E-01 .141502 .207341E-01 .139458 .010795 .1397
+aline .010795 .14986
+bezier .272545E-01 .151252 .438655E-01 .152278 .060325 .15367
+closepath
+! end of curve
+
+! start of curve
+amove .1016 .14478
+bezier .844975E-01 .143495 .692246E-01 .131343 .061595 .116205
+aline .061595 .03302
+bezier .707664E-01 .939339E-02 .10084 -.722464E-02 .12319 .00889
+bezier .154247 .310227E-01 .160355 .757545E-01 .14732 .10922
+bezier .141 .12841 .123178 .148658 .1016 .14478
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="q" !-------------- Beginning of new char.
+dfont wid=.527779 hei=.430555 dep=.194445 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .09525 .15367
+bezier .113385 .151852 .128889 .138143 .136525 .12192
+bezier .140973 .132479 .144978 .143409 .14986 .15367
+aline .156845 .15367
+aline .156845 -.050165
+bezier .16069 -.615798E-01 .174536 -.583596E-01 .18415 -.059055
+aline .18415 -.069215
+aline .1778 -.069215
+aline .177165 -.06858
+aline .151765 -.06858
+aline .15113 -.067945
+aline .139065 -.067945
+aline .13843 -.06858
+aline .11303 -.06858
+aline .112395 -.069215
+aline .106045 -.069215
+aline .106045 -.059055
+bezier .115659 -.583596E-01 .129505 -.615798E-01 .13335 -.050165
+aline .13335 .01905
+bezier .12328 .992048E-02 .109991 -.43422E-02 .093345 -.00381
+bezier .470479E-01 -.105583E-01 .570272E-02 .381133E-01 .013335 .08255
+bezier .014842 .123782 .552268E-01 .157131 .09525 .15367
+closepath
+! end of curve
+
+! start of curve
+amove .086995 .14478
+bezier .581765E-01 .14047 .440886E-01 .107839 .041275 .08255
+bezier .401355E-01 .054132 .481638E-01 .188803E-01 .0762 .00508
+bezier .101736 -.516842E-02 .126873 .178183E-01 .13462 .041275
+aline .13462 .1016
+bezier .129667 .123794 .112824 .148125 .08763 .145415
+aline .086995 .14478
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="r" !-------------- Beginning of new char.
+dfont wid=.391668 hei=.430555 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .05842 .15367
+aline .05842 .11684
+bezier .061557 .121931 .651411E-01 .132444 .070485 .13843
+bezier .831821E-01 .15635 .117008 .161212 .127 .13843
+bezier .129623 .12995 .126155 .119559 .11684 .117475
+bezier .10385 .114041 .931761E-01 .127806 .09906 .1397
+aline .099695 .140335
+aline .10033 .141605
+aline .1016 .142875
+aline .10287 .14351
+aline .10414 .14478
+aline .10541 .145415
+aline .106045 .14605
+bezier .821323E-01 .150238 .663841E-01 .124559 .062865 .103505
+aline .06223 .10033
+aline .061595 .099695
+aline .061595 .095885
+aline .06096 .09525
+aline .06096 .089535
+aline .060325 .0889
+aline .060325 .019685
+bezier .616078E-01 .108566E-01 .714663E-01 .105225E-01 .078105 .009525
+aline .094615 .009525
+aline .094615 -.000635
+aline .086995 -.000635
+aline .08636 0
+aline .056515 0
+aline .05588 .000635
+aline .043815 .000635
+aline .04318 0
+aline .01778 0
+aline .017145 -.000635
+aline .010795 -.000635
+aline .010795 .009525
+bezier .204092E-01 .102204E-01 .342546E-01 .700019E-02 .0381 .018415
+aline .0381 .127
+bezier .363966E-01 .140363 .212244E-01 .139988 .010795 .1397
+aline .010795 .14986
+bezier .266587E-01 .151157 .425563E-01 .152373 .05842 .15367
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="s" !-------------- Beginning of new char.
+dfont wid=.394445 hei=.430555 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .075565 .155575
+bezier .842498E-01 .154328 .941871E-01 .151778 .100965 .145415
+aline .10795 .1524
+aline .10922 .153035
+aline .11176 .155575
+aline .11557 .155575
+aline .116205 .15494
+aline .117475 .154305
+aline .117475 .104775
+aline .116205 .10414
+aline .11557 .103505
+aline .111125 .103505
+aline .11049 .10414
+aline .10922 .104775
+bezier .110791 .124832 .970074E-01 .148185 .07493 .14859
+bezier .576223E-01 .151327 .330088E-01 .146133 .028575 .12573
+bezier .269021E-01 .103579 .528225E-01 .956968E-01 .070485 .09398
+bezier .957651E-01 .916537E-01 .123679 .759705E-01 .126365 .048895
+bezier .129562 .252596E-01 .113484 .172389E-02 .089535 -.00254
+bezier .069783 -.66203E-02 .461427E-01 -.567808E-02 .03175 .010795
+aline .028575 .00762
+aline .02794 .00635
+aline .023495 .001905
+aline .02286 .000635
+aline .01778 -.004445
+aline .01397 -.004445
+aline .013335 -.00381
+aline .012065 -.003175
+aline .012065 .056515
+aline .01397 .05842
+aline .018415 .05842
+bezier .239437E-01 .480648E-01 .247101E-01 .325204E-01 .03302 .022225
+bezier .474739E-01 -.279242E-02 .886761E-01 -.468716E-02 .10541 .018415
+bezier .117915 .374461E-01 .102196 .061848 .08128 .065405
+bezier .561153E-01 .06987 .227885E-01 .739083E-01 .013335 .102235
+bezier .522765E-02 .128095 .277326E-01 .154126 .053975 .154305
+aline .05461 .15494
+aline .05969 .15494
+aline .060325 .155575
+aline .075565 .155575
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="t" !-------------- Beginning of new char.
+dfont wid=.38889 hei=.61508 dep=0 italic=0
+dfont fby="w" kadd=-.0277786
+dfont fby="y" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .06096 .21463
+aline .06096 .150495
+aline .061595 .14986
+aline .11049 .14986
+aline .11049 .1397
+aline .061595 .1397
+aline .06096 .139065
+aline .06096 .033655
+bezier .620376E-01 .200678E-01 .714774E-01 -.167436E-04 .088265 .004445
+bezier .102005 .769492E-02 .105781 .241562E-01 .10795 .03556
+aline .10795 .06223
+aline .116205 .06223
+bezier .116861 .391908E-01 .118187 .934658E-02 .09398 -.00254
+bezier .687568E-01 -.114472E-01 .376399E-01 .733651E-02 .037465 .034925
+aline .037465 .139065
+aline .03683 .1397
+aline .006985 .1397
+aline .006985 .146685
+bezier .375732E-01 .147082 .508315E-01 .18208 .052705 .20701
+aline .052705 .21463
+aline .06096 .21463
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="u" !-------------- Beginning of new char.
+dfont wid=.555557 hei=.430555 dep=0 italic=0
+dfont fby="w" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .062865 .15367
+aline .062865 .02921
+bezier .063526 .017981 .698907E-01 .477774E-02 .083185 .00381
+bezier .106758 -.371007E-02 .130202 .171891E-01 .133985 .04064
+aline .13462 .043815
+aline .135255 .04445
+aline .135255 .048895
+aline .13589 .04953
+aline .13589 .127
+bezier .134187 .140363 .119014 .139988 .108585 .1397
+aline .108585 .14986
+bezier .125464 .15126 .142506 .15227 .159385 .15367
+aline .159385 .022225
+bezier .161088 .886187E-02 .176261 .923737E-02 .18669 .009525
+aline .18669 -.000635
+bezier .17023 -.202685E-02 .15362 -.305315E-02 .13716 -.004445
+aline .13716 .0254
+bezier .132904 .206281E-01 .128754 .997974E-02 .121285 .005715
+bezier .103845 -.929627E-02 .780247E-01 -.628199E-02 .05842 .00254
+bezier .046534 .875211E-02 .403162E-01 .221968E-01 .03937 .034925
+aline .03937 .127
+bezier .376666E-01 .140363 .224944E-01 .139988 .012065 .1397
+aline .012065 .14986
+bezier .289443E-01 .15126 .459857E-01 .15227 .062865 .15367
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="v" !-------------- Beginning of new char.
+dfont wid=.527781 hei=.430555 dep=0 italic=.0138884
+dfont fby="a" kadd=-.0555553
+dfont fby="c" kadd=-.0277786
+dfont fby="e" kadd=-.0277786
+dfont fby="o" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .0127 .14986
+aline .013335 .149225
+aline .03429 .149225
+aline .034925 .14859
+aline .04572 .14859
+aline .046355 .149225
+aline .071755 .149225
+aline .07239 .14986
+aline .07874 .14986
+aline .07874 .1397
+bezier .704951E-01 .140812 .544936E-01 .136823 .060325 .12573
+bezier .736658E-01 .925007E-01 .870616E-01 .592943E-01 .10033 .026035
+bezier .113177 .574811E-01 .125747 .892944E-01 .13843 .12065
+bezier .140703 .130871 .131812 .139974 .12192 .1397
+aline .12192 .14986
+aline .127 .14986
+aline .127635 .149225
+aline .147955 .149225
+aline .14859 .14859
+aline .156845 .14859
+aline .15748 .149225
+aline .173355 .149225
+aline .17399 .14986
+aline .1778 .14986
+aline .1778 .1397
+bezier .159693 .14051 .14719 .124889 .142875 .108585
+bezier .12707 .713366E-01 .113986 .323929E-01 .09652 -.00381
+bezier .847264E-01 -.822533E-02 .842435E-01 .817571E-02 .08001 .01524
+bezier .628466E-01 .552035E-01 .493324E-01 .972463E-01 .029845 .13589
+aline .026035 .137795
+aline .023495 .13843
+aline .02286 .139065
+aline .01905 .139065
+aline .018415 .1397
+aline .00762 .1397
+aline .00762 .14986
+aline .0127 .14986
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="w" !-------------- Beginning of new char.
+dfont wid=.722224 hei=.430555 dep=0 italic=.0138884
+dfont fby="a" kadd=-.0277786
+dfont fby="c" kadd=-.0277786
+dfont fby="e" kadd=-.0277786
+dfont fby="o" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .012065 .14986
+aline .0127 .149225
+aline .03302 .149225
+aline .033655 .14859
+aline .043815 .14859
+aline .04445 .149225
+aline .06985 .149225
+aline .070485 .14986
+aline .076835 .14986
+aline .076835 .1397
+bezier .687801E-01 .140605 .537812E-01 .137826 .05715 .127
+bezier .687638E-01 .946271E-01 .798756E-01 .618561E-01 .092075 .029845
+bezier .102107 .582319E-01 .112279 .865614E-01 .122343 .114935
+bezier .118989 .125181 .115799 .139645 .10287 .1397
+aline .09271 .1397
+aline .09271 .14986
+aline .097155 .14986
+aline .09779 .149225
+aline .11684 .149225
+aline .117475 .14859
+aline .127635 .14859
+aline .12827 .149225
+aline .1524 .149225
+aline .153035 .14986
+aline .159385 .14986
+aline .159385 .1397
+bezier .15106 .140654 .135739 .137869 .1397 .126365
+bezier .151636 .926804E-01 .163401 .587345E-01 .175895 .0254
+bezier .187102 .567004E-01 .198044 .883623E-01 .20955 .11938
+bezier .211911 .131286 .200061 .14014 .18923 .1397
+aline .18923 .14986
+aline .194945 .14986
+aline .19558 .149225
+aline .217805 .149225
+aline .21844 .14859
+aline .226695 .14859
+aline .22733 .149225
+aline .24257 .149225
+aline .243205 .14986
+aline .247015 .14986
+aline .247015 .1397
+bezier .229352 .140554 .218311 .124289 .21463 .108585
+bezier .200701 .712611E-01 .189187 .323683E-01 .173355 -.00381
+aline .172085 -.004445
+aline .16764 -.004445
+aline .1651 -.003175
+bezier .151484 .314398E-01 .139741 .671386E-01 .127 .102235
+bezier .114259 .671386E-01 .102516 .314398E-01 .0889 -.003175
+aline .08636 -.004445
+aline .081915 -.004445
+bezier .738189E-01 .380603E-02 .073199 .175488E-01 .067945 .02794
+bezier .05433 .637613E-01 .439124E-01 .101283 .02794 .13589
+aline .02667 .136525
+aline .026035 .13716
+aline .024765 .137795
+aline .022225 .13843
+aline .02159 .139065
+aline .01778 .139065
+aline .017145 .1397
+aline .006985 .1397
+aline .006985 .14986
+aline .012065 .14986
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="x" !-------------- Beginning of new char.
+dfont wid=.527781 hei=.430555 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .01143 .14986
+aline .012065 .149225
+aline .03302 .149225
+aline .033655 .14859
+aline .04445 .14859
+aline .045085 .149225
+aline .070485 .149225
+aline .07112 .14986
+aline .07747 .14986
+aline .07747 .1397
+bezier .695229E-01 .140769 .059678 .131104 .067945 .12446
+bezier .770476E-01 .112627 .859878E-01 .100327 .955675E-01 .890587E-01
+bezier .104711 .100466 .115505 .111455 .122555 .12446
+bezier .124013 .131675 .120304 .139134 .112395 .1397
+aline .112395 .14986
+aline .11811 .14986
+aline .118745 .149225
+aline .141605 .149225
+aline .14224 .14859
+aline .15113 .14859
+aline .151765 .149225
+aline .169545 .149225
+aline .17018 .14986
+aline .174625 .14986
+aline .174625 .1397
+bezier .151606 .140458 .131914 .124085 .120015 .10541
+bezier .114009 .972715E-01 .105154 .894131E-01 .1016 .080645
+bezier .119372 .585997E-01 .135073 .347676E-01 .154305 .01397
+aline .158115 .012065
+aline .16002 .01143
+aline .163195 .010795
+aline .16383 .01016
+aline .168275 .01016
+aline .16891 .009525
+aline .180975 .009525
+aline .180975 -.000635
+aline .175895 -.000635
+aline .17526 0
+aline .154305 0
+aline .15367 .000635
+aline .142875 .000635
+aline .14224 0
+aline .11684 0
+aline .116205 -.000635
+aline .109855 -.000635
+aline .109855 .009525
+bezier .117716 .835007E-02 .12789 .184025E-01 .11938 .024765
+bezier .108867 .380334E-01 .987442E-01 .535239E-01 .874183E-01 .649817E-01
+bezier .775294E-01 .504977E-01 .630197E-01 .387096E-01 .056515 .022225
+aline .056515 .01905
+aline .05715 .018415
+aline .057785 .015875
+aline .059055 .013335
+aline .060325 .012065
+aline .064135 .01016
+aline .066675 .009525
+aline .066675 -.000635
+aline .061595 -.000635
+aline .06096 0
+aline .0381 0
+aline .037465 .000635
+aline .028575 .000635
+aline .02794 0
+aline .009525 0
+aline .00889 -.000635
+aline .004445 -.000635
+aline .004445 .009525
+bezier .273772E-01 .848693E-02 .472127E-01 .245805E-01 .059055 .04318
+bezier .665242E-01 .532303E-01 .770492E-01 .628739E-01 .081915 .07366
+bezier .653809E-01 .939703E-01 .509366E-01 .116234 .03302 .135255
+aline .02921 .13716
+aline .027305 .137795
+aline .02413 .13843
+aline .023495 .139065
+aline .01905 .139065
+aline .018415 .1397
+aline .00635 .1397
+aline .00635 .14986
+aline .01143 .14986
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="y" !-------------- Beginning of new char.
+dfont wid=.527781 hei=.430555 dep=.194445 italic=.0138884
+dfont fby="," kadd=-.083334
+dfont fby="." kadd=-.083334
+dfont fby="a" kadd=-.0277786
+dfont fby="e" kadd=-.0277786
+dfont fby="o" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .0127 .14986
+aline .013335 .149225
+aline .03429 .149225
+aline .034925 .14859
+aline .04572 .14859
+aline .046355 .149225
+aline .071755 .149225
+aline .07239 .14986
+aline .07874 .14986
+aline .07874 .1397
+bezier .706936E-01 .140551 .558686E-01 .137532 .060325 .126365
+bezier .737686E-01 .094025 .871001E-01 .616385E-01 .10033 .02921
+bezier .113174 .600224E-01 .126063 .910687E-01 .13843 .12192
+bezier .139848 .131507 .131223 .13994 .12192 .1397
+aline .12192 .14986
+aline .127 .14986
+aline .127635 .149225
+aline .147955 .149225
+aline .14859 .14859
+aline .156845 .14859
+aline .15748 .149225
+aline .173355 .149225
+aline .17399 .14986
+aline .1778 .14986
+aline .1778 .1397
+bezier .158035 .140923 .145763 .122073 .14097 .104775
+bezier .118603 .536187E-01 .100328 .396611E-03 .075565 -.04953
+bezier .651607E-01 -.068566 .392759E-01 -.812182E-01 .019685 -.06731
+bezier .716891E-02 -.601583E-01 .733207E-03 -.354145E-01 .018415 -.03048
+bezier .033561 -.261358E-01 .431986E-01 -.047944 .03048 -.056515
+aline .02921 -.05715
+aline .028575 -.057785
+aline .02667 -.05842
+aline .02413 -.059055
+aline .02286 -.05969
+bezier .379972E-01 -.736538E-01 .607315E-01 -.620756E-01 .06858 -.04572
+bezier .763612E-01 -.314382E-01 .814682E-01 -.158186E-01 .881063E-01 -.9525E-03
+bezier .689828E-01 .043863 .518038E-01 .089674 .03175 .133985
+aline .029845 .13589
+aline .028575 .136525
+aline .02794 .13716
+aline .026035 .137795
+aline .023495 .13843
+aline .02286 .139065
+aline .01905 .139065
+aline .018415 .1397
+aline .00762 .1397
+aline .00762 .14986
+aline .0127 .14986
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="z" !-------------- Beginning of new char.
+dfont wid=.444446 hei=.430555 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .13716 .14986
+bezier .144558 .144187 .133053 .137163 .13081 .131445
+bezier .10033 .904744E-01 .068059 .483564E-01 .03937 .00762
+aline .089535 .00762
+bezier .105061 .837487E-02 .124038 .158306E-01 .127635 .033655
+bezier .131105 .440978E-01 .131637 .541654E-01 .132715 .06477
+aline .14097 .06477
+bezier .138897 .430379E-01 .137328 .210971E-01 .135255 -.000635
+aline .0127 -.000635
+bezier .498079E-02 .609555E-02 .176204E-01 .137395E-01 .02032 .02032
+bezier .502861E-01 .609327E-01 .826484E-01 .102256 .11049 .142875
+aline .06223 .142875
+bezier .481371E-01 .142123 .304334E-01 .135963 .027305 .11938
+aline .026035 .1143
+aline .0254 .113665
+aline .0254 .11049
+aline .024765 .109855
+aline .024765 .10541
+aline .02413 .104775
+aline .02413 .098425
+aline .023495 .09779
+aline .023495 .09398
+aline .01524 .09398
+bezier .166192E-01 .112561 .176708E-01 .131279 .01905 .14986
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="{" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.430555 dep=0 italic=.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .17526 .095885
+aline .17526 .0889
+aline .000635 .0889
+aline .000635 .095885
+aline .17526 .095885
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="|" !-------------- Beginning of new char.
+dfont wid=1 hei=.430555 dep=0 italic=.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .35052 .095885
+aline .35052 .0889
+aline .000635 .0889
+aline .000635 .095885
+aline .35052 .095885
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="}" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .07747 .244475
+bezier .880736E-01 .243715 .093133 .229632 .084455 .222885
+bezier .073737 .208641 .639343E-01 .192074 .05207 .179705
+aline .04699 .182245
+aline .04572 .183515
+bezier .523212E-01 .2022 .593598E-01 .220922 .066675 .239395
+aline .06985 .24257
+aline .07239 .24384
+aline .074295 .244475
+aline .07747 .244475
+closepath
+! end of curve
+
+! start of curve
+amove .13589 .244475
+bezier .146494 .243715 .151553 .229632 .142875 .222885
+bezier .132157 .208641 .122354 .192074 .11049 .179705
+aline .10541 .182245
+aline .10414 .183515
+bezier .110741 .2022 .11778 .220922 .125095 .239395
+aline .12827 .24257
+aline .13081 .24384
+aline .132715 .244475
+aline .13589 .244475
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="~" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.667859 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .07112 .23368
+bezier .883774E-01 .230298 .10272 .210379 .121285 .21844
+aline .126365 .22098
+aline .127 .221615
+aline .12827 .22225
+aline .128905 .222885
+aline .130175 .22352
+aline .13208 .225425
+aline .13335 .22606
+aline .14097 .23368
+aline .14478 .22987
+aline .14605 .229235
+bezier .134698 .214987 .117919 .193683 .097155 .203835
+bezier .825042E-01 .211265 .649888E-01 .226165 .048895 .21336
+aline .047625 .212725
+aline .04699 .21209
+aline .04572 .211455
+aline .043815 .20955
+aline .042545 .208915
+aline .034925 .201295
+aline .031115 .205105
+aline .029845 .20574
+bezier .393545E-01 .216776 .488028E-01 .230611 .064135 .23368
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=127 !-------------- Beginning of new char.
+dfont wid=.500002 hei=.667859 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .05715 .234315
+bezier .740998E-01 .231684 .760944E-01 .205867 .05969 .20066
+bezier .445563E-01 .194933 .297165E-01 .214647 .040005 .22733
+aline .043815 .23114
+aline .045085 .231775
+aline .04572 .23241
+aline .04699 .233045
+aline .048895 .23368
+aline .0508 .234315
+closepath
+! end of curve
+
+! start of curve
+amove .125095 .234315
+bezier .141265 .23164 .14418 .20748 .128905 .201295
+bezier .114052 .193886 .976645E-01 .213192 .107315 .226695
+aline .112395 .231775
+aline .116205 .23368
+aline .118745 .234315
+closepath
+! end of curve
+
+fill
+dfont endchar
diff --git a/src/fonts/texcmsl.afm b/src/fonts/texcmsl.afm
new file mode 100644
index 0000000..cf236ff
--- /dev/null
+++ b/src/fonts/texcmsl.afm
@@ -0,0 +1,332 @@
+StartFontMetrics 2.0
+Comment Made from TEX tfm file using TFMTOAFM.bas
+FontName CMSL10
+EncodingScheme TEXENCODING
+FullName CMSL10
+FamilyName CMSL10
+Weight Medium
+ItalicAngle 9.46261
+IsFixedPitch false
+UnderlinePosition -97
+UnderlineThickness 73
+FontBBox 0 -300 1001 1001
+CapHeight 729
+XHeight 151
+Descender -219
+Ascender 729
+StartCharMetrics 127
+C 1 ; WX 833 ; N C1 ; B 0 0 833 683 ;
+C 2 ; WX 777 ; N C2 ; B 0 0 777 683 ;
+C 3 ; WX 694 ; N C3 ; B 0 0 694 683 ;
+C 4 ; WX 666 ; N C4 ; B 0 0 666 683 ;
+C 5 ; WX 750 ; N C5 ; B 0 0 750 683 ;
+C 6 ; WX 722 ; N C6 ; B 0 0 722 683 ;
+C 7 ; WX 777 ; N C7 ; B 0 0 777 683 ;
+C 8 ; WX 722 ; N C8 ; B 0 0 722 683 ;
+C 9 ; WX 777 ; N C9 ; B 0 0 777 683 ;
+C 10 ; WX 722 ; N C10 ; B 0 0 722 683 ;
+C 11 ; WX 583 ; N C11 ; B 0 0 583 694 ; L i C14 L l C15
+C 12 ; WX 555 ; N C12 ; B 0 0 555 694 ;
+C 13 ; WX 555 ; N C13 ; B 0 0 555 694 ;
+C 14 ; WX 833 ; N C14 ; B 0 0 833 694 ;
+C 15 ; WX 833 ; N C15 ; B 0 0 833 694 ;
+C 16 ; WX 277 ; N C16 ; B 0 0 277 430 ;
+C 17 ; WX 305 ; N C17 ; B 0 -194 305 430 ;
+C 18 ; WX 500 ; N C18 ; B 0 0 500 694 ;
+C 19 ; WX 500 ; N C19 ; B 0 0 500 694 ;
+C 20 ; WX 500 ; N C20 ; B 0 0 500 628 ;
+C 21 ; WX 500 ; N C21 ; B 0 0 500 694 ;
+C 22 ; WX 500 ; N C22 ; B 0 0 500 567 ;
+C 23 ; WX 808 ; N C23 ; B 0 0 808 694 ;
+C 24 ; WX 444 ; N C24 ; B 0 -170 444 0 ;
+C 25 ; WX 500 ; N C25 ; B 0 0 500 694 ;
+C 26 ; WX 722 ; N C26 ; B 0 0 722 430 ;
+C 27 ; WX 777 ; N C27 ; B 0 0 777 430 ;
+C 28 ; WX 500 ; N C28 ; B 0 -97 500 527 ;
+C 29 ; WX 902 ; N C29 ; B 0 0 902 683 ;
+C 30 ; WX 1013 ; N C30 ; B 0 0 1013 683 ;
+C 31 ; WX 777 ; N C31 ; B 0 -48 777 731 ;
+C 32 ; WX 234 ; N C32 ; B 0 0 234 430 ;
+C 33 ; WX 277 ; N C33 ; B 0 0 277 694 ;
+C 34 ; WX 500 ; N C34 ; B 0 0 500 694 ;
+C 35 ; WX 833 ; N C35 ; B 0 -194 833 694 ;
+C 36 ; WX 500 ; N C36 ; B 0 -55 500 750 ;
+C 37 ; WX 833 ; N C37 ; B 0 -55 833 750 ;
+C 38 ; WX 777 ; N C38 ; B 0 0 777 694 ;
+C 39 ; WX 277 ; N C39 ; B 0 0 277 694 ; L C39 C34
+C 40 ; WX 388 ; N C40 ; B 0 -250 388 750 ;
+C 41 ; WX 388 ; N C41 ; B 0 -250 388 750 ;
+C 42 ; WX 500 ; N C42 ; B 0 0 500 750 ;
+C 43 ; WX 777 ; N C43 ; B 0 -83 777 583 ;
+C 44 ; WX 277 ; N C44 ; B 0 -194 277 105 ;
+C 45 ; WX 333 ; N C45 ; B 0 0 333 430 ;
+C 46 ; WX 277 ; N C46 ; B 0 0 277 105 ;
+C 47 ; WX 500 ; N C47 ; B 0 -250 500 750 ;
+C 48 ; WX 500 ; N C48 ; B 0 0 500 644 ;
+C 49 ; WX 500 ; N C49 ; B 0 0 500 644 ;
+C 50 ; WX 500 ; N C50 ; B 0 0 500 644 ;
+C 51 ; WX 500 ; N C51 ; B 0 0 500 644 ;
+C 52 ; WX 500 ; N C52 ; B 0 0 500 644 ;
+C 53 ; WX 500 ; N C53 ; B 0 0 500 644 ;
+C 54 ; WX 500 ; N C54 ; B 0 0 500 644 ;
+C 55 ; WX 500 ; N C55 ; B 0 0 500 644 ;
+C 56 ; WX 500 ; N C56 ; B 0 0 500 644 ;
+C 57 ; WX 500 ; N C57 ; B 0 0 500 644 ;
+C 58 ; WX 277 ; N C58 ; B 0 0 277 430 ;
+C 59 ; WX 277 ; N C59 ; B 0 -194 277 430 ;
+C 60 ; WX 277 ; N C60 ; B 0 -194 277 500 ;
+C 61 ; WX 777 ; N C61 ; B 0 134 777 366 ;
+C 62 ; WX 472 ; N C62 ; B 0 -194 472 500 ;
+C 63 ; WX 472 ; N C63 ; B 0 0 472 694 ;
+C 64 ; WX 777 ; N C64 ; B 0 0 777 694 ;
+C 65 ; WX 750 ; N A ; B 0 0 750 683 ;
+C 66 ; WX 708 ; N B ; B 0 0 708 683 ;
+C 67 ; WX 722 ; N C ; B 0 0 722 683 ;
+C 68 ; WX 763 ; N D ; B 0 0 763 683 ;
+C 69 ; WX 680 ; N E ; B 0 0 680 683 ;
+C 70 ; WX 652 ; N F ; B 0 0 652 683 ;
+C 71 ; WX 784 ; N G ; B 0 0 784 683 ;
+C 72 ; WX 750 ; N H ; B 0 0 750 683 ;
+C 73 ; WX 361 ; N I ; B 0 0 361 683 ;
+C 74 ; WX 513 ; N J ; B 0 0 513 683 ;
+C 75 ; WX 777 ; N K ; B 0 0 777 683 ;
+C 76 ; WX 625 ; N L ; B 0 0 625 683 ;
+C 77 ; WX 916 ; N M ; B 0 0 916 683 ;
+C 78 ; WX 750 ; N N ; B 0 0 750 683 ;
+C 79 ; WX 777 ; N O ; B 0 0 777 683 ;
+C 80 ; WX 680 ; N P ; B 0 0 680 683 ;
+C 81 ; WX 777 ; N Q ; B 0 -194 777 683 ;
+C 82 ; WX 736 ; N R ; B 0 0 736 683 ;
+C 83 ; WX 555 ; N S ; B 0 0 555 683 ;
+C 84 ; WX 722 ; N T ; B 0 0 722 683 ;
+C 85 ; WX 750 ; N U ; B 0 0 750 683 ;
+C 86 ; WX 750 ; N V ; B 0 0 750 683 ;
+C 87 ; WX 1027 ; N W ; B 0 0 1027 683 ;
+C 88 ; WX 750 ; N X ; B 0 0 750 683 ;
+C 89 ; WX 750 ; N Y ; B 0 0 750 683 ;
+C 90 ; WX 611 ; N Z ; B 0 0 611 683 ;
+C 91 ; WX 277 ; N C91 ; B 0 -250 277 750 ;
+C 92 ; WX 500 ; N C92 ; B 0 0 500 694 ;
+C 93 ; WX 277 ; N C93 ; B 0 -250 277 750 ;
+C 94 ; WX 500 ; N C94 ; B 0 0 500 694 ;
+C 95 ; WX 277 ; N C95 ; B 0 0 277 667 ;
+C 96 ; WX 277 ; N C96 ; B 0 0 277 694 ;
+C 97 ; WX 500 ; N a ; B 0 0 500 430 ;
+C 98 ; WX 555 ; N b ; B 0 0 555 694 ;
+C 99 ; WX 444 ; N c ; B 0 0 444 430 ;
+C 100 ; WX 555 ; N d ; B 0 0 555 694 ;
+C 101 ; WX 444 ; N e ; B 0 0 444 430 ;
+C 102 ; WX 305 ; N f ; B 0 0 305 694 ; L f C11 L i C12 L l C13
+C 103 ; WX 500 ; N g ; B 0 -194 500 430 ;
+C 104 ; WX 555 ; N h ; B 0 0 555 694 ;
+C 105 ; WX 277 ; N i ; B 0 0 277 667 ;
+C 106 ; WX 305 ; N j ; B 0 -194 305 667 ;
+C 107 ; WX 527 ; N k ; B 0 0 527 694 ;
+C 108 ; WX 277 ; N l ; B 0 0 277 694 ;
+C 109 ; WX 833 ; N m ; B 0 0 833 430 ;
+C 110 ; WX 555 ; N n ; B 0 0 555 430 ;
+C 111 ; WX 500 ; N o ; B 0 0 500 430 ;
+C 112 ; WX 555 ; N p ; B 0 -194 555 430 ;
+C 113 ; WX 527 ; N q ; B 0 -194 527 430 ;
+C 114 ; WX 391 ; N r ; B 0 0 391 430 ;
+C 115 ; WX 394 ; N s ; B 0 0 394 430 ;
+C 116 ; WX 388 ; N t ; B 0 0 388 615 ;
+C 117 ; WX 555 ; N u ; B 0 0 555 430 ;
+C 118 ; WX 527 ; N v ; B 0 0 527 430 ;
+C 119 ; WX 722 ; N w ; B 0 0 722 430 ;
+C 120 ; WX 527 ; N x ; B 0 0 527 430 ;
+C 121 ; WX 527 ; N y ; B 0 -194 527 430 ;
+C 122 ; WX 444 ; N z ; B 0 0 444 430 ;
+C 123 ; WX 500 ; N C123 ; B 0 0 500 430 ;
+C 124 ; WX 1000 ; N C124 ; B 0 0 1000 430 ;
+C 125 ; WX 500 ; N C125 ; B 0 0 500 694 ;
+C 126 ; WX 500 ; N C126 ; B 0 0 500 667 ;
+C 127 ; WX 500 ; N C127 ; B 0 0 500 667 ;
+EndCharMetrics
+
+StartKernData
+StartKernPairs 181
+KPX C11 C33 77
+KPX C11 C39 77
+KPX C11 C41 77
+KPX C11 C63 77
+KPX C11 C93 77
+KPX C32 L -320
+KPX C32 l -278
+KPX C39 C33 111
+KPX C39 C63 111
+KPX A C -28
+KPX A G -28
+KPX A O -28
+KPX A Q -28
+KPX A T -84
+KPX A U -28
+KPX A V -112
+KPX A W -112
+KPX A Y -84
+KPX A t -28
+KPX D A -28
+KPX D V -28
+KPX D W -28
+KPX D X -28
+KPX D Y -28
+KPX F A -112
+KPX F C -28
+KPX F G -28
+KPX F O -28
+KPX F Q -28
+KPX F a -84
+KPX F e -84
+KPX F o -84
+KPX F r -84
+KPX F u -84
+KPX I I 27
+KPX K C -28
+KPX K G -28
+KPX K O -28
+KPX K Q -28
+KPX L T -84
+KPX L V -112
+KPX L W -112
+KPX L Y -84
+KPX O A -28
+KPX O V -28
+KPX O W -28
+KPX O X -28
+KPX O Y -28
+KPX P C44 -84
+KPX P C46 -84
+KPX P A -84
+KPX P a -28
+KPX P e -28
+KPX P o -28
+KPX R C -28
+KPX R G -28
+KPX R O -28
+KPX R Q -28
+KPX R T -84
+KPX R U -28
+KPX R V -112
+KPX R W -112
+KPX R Y -84
+KPX R t -28
+KPX T A -84
+KPX T a -84
+KPX T e -84
+KPX T o -84
+KPX T r -84
+KPX T u -84
+KPX T y -28
+KPX V A -112
+KPX V C -28
+KPX V G -28
+KPX V O -28
+KPX V Q -28
+KPX V a -84
+KPX V e -84
+KPX V o -84
+KPX V r -84
+KPX V u -84
+KPX W A -112
+KPX W C -28
+KPX W G -28
+KPX W O -28
+KPX W Q -28
+KPX W a -84
+KPX W e -84
+KPX W o -84
+KPX W r -84
+KPX W u -84
+KPX X C -28
+KPX X G -28
+KPX X O -28
+KPX X Q -28
+KPX Y A -84
+KPX Y a -84
+KPX Y e -84
+KPX Y o -84
+KPX Y r -84
+KPX Y u -84
+KPX a j 55
+KPX a v -28
+KPX a w -28
+KPX a y -28
+KPX b c 27
+KPX b d 27
+KPX b e 27
+KPX b j 55
+KPX b o 27
+KPX b q 27
+KPX b v -28
+KPX b w -28
+KPX b x -28
+KPX b y -28
+KPX c h -28
+KPX c k -28
+KPX f C33 77
+KPX f C39 77
+KPX f C41 77
+KPX f C63 77
+KPX f C93 77
+KPX g j 27
+KPX h b -28
+KPX h t -28
+KPX h u -28
+KPX h v -28
+KPX h w -28
+KPX h y -28
+KPX k a -56
+KPX k c -28
+KPX k e -28
+KPX k o -28
+KPX m b -28
+KPX m t -28
+KPX m u -28
+KPX m v -28
+KPX m w -28
+KPX m y -28
+KPX n b -28
+KPX n t -28
+KPX n u -28
+KPX n v -28
+KPX n w -28
+KPX n y -28
+KPX o c 27
+KPX o d 27
+KPX o e 27
+KPX o j 55
+KPX o o 27
+KPX o q 27
+KPX o v -28
+KPX o w -28
+KPX o x -28
+KPX o y -28
+KPX p c 27
+KPX p d 27
+KPX p e 27
+KPX p j 55
+KPX p o 27
+KPX p q 27
+KPX p v -28
+KPX p w -28
+KPX p x -28
+KPX p y -28
+KPX t w -28
+KPX t y -28
+KPX u w -28
+KPX v a -56
+KPX v c -28
+KPX v e -28
+KPX v o -28
+KPX w a -28
+KPX w c -28
+KPX w e -28
+KPX w o -28
+KPX y C44 -84
+KPX y C46 -84
+KPX y a -28
+KPX y e -28
+KPX y o -28
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/src/fonts/texcmss.afm b/src/fonts/texcmss.afm
new file mode 100644
index 0000000..c7cf156
--- /dev/null
+++ b/src/fonts/texcmss.afm
@@ -0,0 +1,294 @@
+StartFontMetrics 2.0
+Comment Made from TEX tfm file using TFMTOAFM.bas
+FontName CMSS10
+EncodingScheme TEXENCODING
+FullName CMSS10
+FamilyName CMSS10
+Weight Medium
+ItalicAngle 0
+IsFixedPitch false
+UnderlinePosition -97
+UnderlineThickness 73
+FontBBox 0 -300 1001 1001
+CapHeight 729
+XHeight 156
+Descender -219
+Ascender 729
+StartCharMetrics 127
+C 1 ; WX 833 ; N C1 ; B 0 0 833 694 ;
+C 2 ; WX 777 ; N C2 ; B 0 0 777 694 ;
+C 3 ; WX 611 ; N C3 ; B 0 0 611 694 ;
+C 4 ; WX 666 ; N C4 ; B 0 0 666 694 ;
+C 5 ; WX 708 ; N C5 ; B 0 0 708 694 ;
+C 6 ; WX 722 ; N C6 ; B 0 0 722 694 ;
+C 7 ; WX 777 ; N C7 ; B 0 0 777 694 ;
+C 8 ; WX 722 ; N C8 ; B 0 0 722 694 ;
+C 9 ; WX 777 ; N C9 ; B 0 0 777 694 ;
+C 10 ; WX 722 ; N C10 ; B 0 0 722 694 ;
+C 11 ; WX 583 ; N C11 ; B 0 0 583 694 ; L i C14 L l C15
+C 12 ; WX 536 ; N C12 ; B 0 0 536 694 ;
+C 13 ; WX 536 ; N C13 ; B 0 0 536 694 ;
+C 14 ; WX 813 ; N C14 ; B 0 0 813 694 ;
+C 15 ; WX 813 ; N C15 ; B 0 0 813 694 ;
+C 16 ; WX 238 ; N C16 ; B 0 0 238 444 ;
+C 17 ; WX 266 ; N C17 ; B 0 -194 266 444 ;
+C 18 ; WX 500 ; N C18 ; B 0 0 500 694 ;
+C 19 ; WX 500 ; N C19 ; B 0 0 500 694 ;
+C 20 ; WX 500 ; N C20 ; B 0 0 500 631 ;
+C 21 ; WX 500 ; N C21 ; B 0 0 500 694 ;
+C 22 ; WX 500 ; N C22 ; B 0 0 500 608 ;
+C 23 ; WX 666 ; N C23 ; B 0 0 666 694 ;
+C 24 ; WX 444 ; N C24 ; B 0 -170 444 0 ;
+C 25 ; WX 480 ; N C25 ; B 0 0 480 694 ;
+C 26 ; WX 722 ; N C26 ; B 0 0 722 444 ;
+C 27 ; WX 777 ; N C27 ; B 0 0 777 444 ;
+C 28 ; WX 500 ; N C28 ; B 0 -97 500 541 ;
+C 29 ; WX 861 ; N C29 ; B 0 0 861 694 ;
+C 30 ; WX 972 ; N C30 ; B 0 0 972 694 ;
+C 31 ; WX 777 ; N C31 ; B 0 -48 777 743 ;
+C 32 ; WX 234 ; N C32 ; B 0 0 234 444 ;
+C 33 ; WX 319 ; N C33 ; B 0 0 319 694 ;
+C 34 ; WX 500 ; N C34 ; B 0 0 500 694 ;
+C 35 ; WX 833 ; N C35 ; B 0 -194 833 694 ;
+C 36 ; WX 500 ; N C36 ; B 0 -55 500 750 ;
+C 37 ; WX 833 ; N C37 ; B 0 -55 833 750 ;
+C 38 ; WX 758 ; N C38 ; B 0 0 758 694 ;
+C 39 ; WX 277 ; N C39 ; B 0 0 277 694 ; L C39 C34
+C 40 ; WX 388 ; N C40 ; B 0 -250 388 750 ;
+C 41 ; WX 388 ; N C41 ; B 0 -250 388 750 ;
+C 42 ; WX 500 ; N C42 ; B 0 0 500 750 ;
+C 43 ; WX 777 ; N C43 ; B 0 -83 777 583 ;
+C 44 ; WX 277 ; N C44 ; B 0 -125 277 83 ;
+C 45 ; WX 333 ; N C45 ; B 0 0 333 444 ;
+C 46 ; WX 277 ; N C46 ; B 0 0 277 83 ;
+C 47 ; WX 500 ; N C47 ; B 0 -250 500 750 ;
+C 48 ; WX 500 ; N C48 ; B 0 0 500 655 ;
+C 49 ; WX 500 ; N C49 ; B 0 0 500 655 ;
+C 50 ; WX 500 ; N C50 ; B 0 0 500 655 ;
+C 51 ; WX 500 ; N C51 ; B 0 0 500 655 ;
+C 52 ; WX 500 ; N C52 ; B 0 0 500 655 ;
+C 53 ; WX 500 ; N C53 ; B 0 0 500 655 ;
+C 54 ; WX 500 ; N C54 ; B 0 0 500 655 ;
+C 55 ; WX 500 ; N C55 ; B 0 0 500 655 ;
+C 56 ; WX 500 ; N C56 ; B 0 0 500 655 ;
+C 57 ; WX 500 ; N C57 ; B 0 0 500 655 ;
+C 58 ; WX 277 ; N C58 ; B 0 0 277 444 ;
+C 59 ; WX 277 ; N C59 ; B 0 -125 277 444 ;
+C 60 ; WX 319 ; N C60 ; B 0 -194 319 500 ;
+C 61 ; WX 777 ; N C61 ; B 0 131 777 369 ;
+C 62 ; WX 472 ; N C62 ; B 0 -194 472 500 ;
+C 63 ; WX 472 ; N C63 ; B 0 0 472 694 ;
+C 64 ; WX 666 ; N C64 ; B 0 0 666 694 ;
+C 65 ; WX 666 ; N A ; B 0 0 666 694 ;
+C 66 ; WX 666 ; N B ; B 0 0 666 694 ;
+C 67 ; WX 638 ; N C ; B 0 0 638 694 ;
+C 68 ; WX 722 ; N D ; B 0 0 722 694 ;
+C 69 ; WX 597 ; N E ; B 0 0 597 694 ;
+C 70 ; WX 569 ; N F ; B 0 0 569 694 ;
+C 71 ; WX 666 ; N G ; B 0 0 666 694 ;
+C 72 ; WX 708 ; N H ; B 0 0 708 694 ;
+C 73 ; WX 277 ; N I ; B 0 0 277 694 ;
+C 74 ; WX 472 ; N J ; B 0 0 472 694 ;
+C 75 ; WX 694 ; N K ; B 0 0 694 694 ;
+C 76 ; WX 541 ; N L ; B 0 0 541 694 ;
+C 77 ; WX 875 ; N M ; B 0 0 875 694 ;
+C 78 ; WX 708 ; N N ; B 0 0 708 694 ;
+C 79 ; WX 736 ; N O ; B 0 0 736 694 ;
+C 80 ; WX 638 ; N P ; B 0 0 638 694 ;
+C 81 ; WX 736 ; N Q ; B 0 -125 736 694 ;
+C 82 ; WX 645 ; N R ; B 0 0 645 694 ;
+C 83 ; WX 555 ; N S ; B 0 0 555 694 ;
+C 84 ; WX 680 ; N T ; B 0 0 680 694 ;
+C 85 ; WX 687 ; N U ; B 0 0 687 694 ;
+C 86 ; WX 666 ; N V ; B 0 0 666 694 ;
+C 87 ; WX 944 ; N W ; B 0 0 944 694 ;
+C 88 ; WX 666 ; N X ; B 0 0 666 694 ;
+C 89 ; WX 666 ; N Y ; B 0 0 666 694 ;
+C 90 ; WX 611 ; N Z ; B 0 0 611 694 ;
+C 91 ; WX 288 ; N C91 ; B 0 -250 288 750 ;
+C 92 ; WX 500 ; N C92 ; B 0 0 500 694 ;
+C 93 ; WX 288 ; N C93 ; B 0 -250 288 750 ;
+C 94 ; WX 500 ; N C94 ; B 0 0 500 694 ;
+C 95 ; WX 277 ; N C95 ; B 0 0 277 679 ;
+C 96 ; WX 277 ; N C96 ; B 0 0 277 694 ;
+C 97 ; WX 480 ; N a ; B 0 0 480 444 ;
+C 98 ; WX 516 ; N b ; B 0 0 516 694 ;
+C 99 ; WX 444 ; N c ; B 0 0 444 444 ;
+C 100 ; WX 516 ; N d ; B 0 0 516 694 ;
+C 101 ; WX 444 ; N e ; B 0 0 444 444 ;
+C 102 ; WX 305 ; N f ; B 0 0 305 694 ; L f C11 L i C12 L l C13
+C 103 ; WX 500 ; N g ; B 0 -194 500 444 ;
+C 104 ; WX 516 ; N h ; B 0 0 516 694 ;
+C 105 ; WX 238 ; N i ; B 0 0 238 679 ;
+C 106 ; WX 266 ; N j ; B 0 -194 266 679 ;
+C 107 ; WX 488 ; N k ; B 0 0 488 694 ;
+C 108 ; WX 238 ; N l ; B 0 0 238 694 ;
+C 109 ; WX 794 ; N m ; B 0 0 794 444 ;
+C 110 ; WX 516 ; N n ; B 0 0 516 444 ;
+C 111 ; WX 500 ; N o ; B 0 0 500 444 ;
+C 112 ; WX 516 ; N p ; B 0 -194 516 444 ;
+C 113 ; WX 516 ; N q ; B 0 -194 516 444 ;
+C 114 ; WX 341 ; N r ; B 0 0 341 444 ;
+C 115 ; WX 383 ; N s ; B 0 0 383 444 ;
+C 116 ; WX 361 ; N t ; B 0 0 361 571 ;
+C 117 ; WX 516 ; N u ; B 0 0 516 444 ;
+C 118 ; WX 461 ; N v ; B 0 0 461 444 ;
+C 119 ; WX 683 ; N w ; B 0 0 683 444 ;
+C 120 ; WX 461 ; N x ; B 0 0 461 444 ;
+C 121 ; WX 461 ; N y ; B 0 -194 461 444 ;
+C 122 ; WX 434 ; N z ; B 0 0 434 444 ;
+C 123 ; WX 500 ; N C123 ; B 0 0 500 444 ;
+C 124 ; WX 1000 ; N C124 ; B 0 0 1000 444 ;
+C 125 ; WX 500 ; N C125 ; B 0 0 500 694 ;
+C 126 ; WX 500 ; N C126 ; B 0 0 500 676 ;
+C 127 ; WX 500 ; N C127 ; B 0 0 500 679 ;
+EndCharMetrics
+
+StartKernData
+StartKernPairs 143
+KPX C11 C33 69
+KPX C11 C39 69
+KPX C11 C41 69
+KPX C11 C63 69
+KPX C11 C93 69
+KPX C32 L -259
+KPX C32 l -239
+KPX C39 C33 111
+KPX C39 C63 111
+KPX A C -28
+KPX A G -28
+KPX A O -28
+KPX A Q -28
+KPX A T -84
+KPX A U -28
+KPX A V -112
+KPX A W -112
+KPX A Y -84
+KPX A t -28
+KPX D A -28
+KPX D V -28
+KPX D W -28
+KPX D X -28
+KPX D Y -28
+KPX F A -84
+KPX F C -28
+KPX F G -28
+KPX F O -28
+KPX F Q -28
+KPX F a -28
+KPX F e -28
+KPX F o -28
+KPX F r -28
+KPX F u -28
+KPX I I 27
+KPX K C -28
+KPX K G -28
+KPX K O -28
+KPX K Q -28
+KPX L T -84
+KPX L V -112
+KPX L W -112
+KPX L Y -84
+KPX O A -28
+KPX O V -28
+KPX O W -28
+KPX O X -28
+KPX O Y -28
+KPX P C44 -84
+KPX P C46 -84
+KPX P A -84
+KPX P a -28
+KPX P e -28
+KPX P o -28
+KPX T A -84
+KPX T a -84
+KPX T e -84
+KPX T o -84
+KPX T r -84
+KPX T u -84
+KPX T y -84
+KPX V A -84
+KPX V C -28
+KPX V G -28
+KPX V O -28
+KPX V Q -28
+KPX V a -28
+KPX V e -28
+KPX V o -28
+KPX V r -28
+KPX V u -28
+KPX W A -84
+KPX W C -28
+KPX W G -28
+KPX W O -28
+KPX W Q -28
+KPX W a -28
+KPX W e -28
+KPX W o -28
+KPX W r -28
+KPX W u -28
+KPX X C -28
+KPX X G -28
+KPX X O -28
+KPX X Q -28
+KPX Y A -84
+KPX Y a -84
+KPX Y e -84
+KPX Y o -84
+KPX Y r -84
+KPX Y u -84
+KPX a r -28
+KPX a w -28
+KPX a y -28
+KPX b c 27
+KPX b d 27
+KPX b e 27
+KPX b o 27
+KPX b q 27
+KPX b r -28
+KPX b w -28
+KPX b x -28
+KPX b y -28
+KPX f C33 69
+KPX f C39 69
+KPX f C41 69
+KPX f C63 69
+KPX f C93 69
+KPX g j 27
+KPX k a -28
+KPX k c -28
+KPX k e -28
+KPX k o -28
+KPX o c 27
+KPX o d 27
+KPX o e 27
+KPX o o 27
+KPX o q 27
+KPX o r -28
+KPX o w -28
+KPX o x -28
+KPX o y -28
+KPX p c 27
+KPX p d 27
+KPX p e 27
+KPX p o 27
+KPX p q 27
+KPX p r -28
+KPX p w -28
+KPX p x -28
+KPX p y -28
+KPX t w -28
+KPX t y -28
+KPX u w -28
+KPX w a -28
+KPX w c -28
+KPX w e -28
+KPX w o -28
+KPX y C44 -84
+KPX y C46 -84
+KPX y a -28
+KPX y e -28
+KPX y o -28
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/src/fonts/texcmss.gle b/src/fonts/texcmss.gle
new file mode 100644
index 0000000..9ce132f
--- /dev/null
+++ b/src/fonts/texcmss.gle
@@ -0,0 +1,4347 @@
+dfont file_name="CMSS10"
+dfont font_name="CMSS10"
+dfont design= .35146
+dfont slant= 0
+dfont space= .117153
+dfont stretch= .585767E-01
+dfont shrink= .390513E-01
+dfont x_hei= .156204
+dfont quad= .351461
+dfont extra_space= .390513E-01
+dfont paint="FILL"
+!------------------ end of main parameters
+dfont char=0 !-------------- Beginning of new char.
+dfont wid=.541669 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .17526 .2413
+aline .17526 .219075
+aline .11303 .219075
+aline .112395 .21971
+aline .065405 .21971
+aline .06477 .219075
+aline .06477 -.000635
+aline .03429 -.000635
+aline .03429 .2413
+aline .17526 .2413
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=1 !-------------- Beginning of new char.
+dfont wid=.833336 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .161925 .24257
+bezier .201033 .161887 .238836 .803534E-01 .277495 -.000635
+aline .01524 -.000635
+bezier .538844E-01 .803594E-01 .917101E-01 .161883 .13081 .24257
+aline .161925 .24257
+closepath
+! end of curve
+
+! start of curve
+amove .14224 .21844
+bezier .117468 .153543 .832473E-01 .091407 .056515 .02794
+aline .229235 .02794
+bezier .201707 .908276E-01 .167797 .154032 .142875 .219075
+aline .14224 .21844
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=2 !-------------- Beginning of new char.
+dfont wid=.777781 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .144145 .25019
+bezier .204494 .246316 .250588 .18747 .25273 .12954
+bezier .258312 .675849E-01 .214919 .590185E-03 .150495 -.00762
+bezier .912942E-01 -.162117E-01 .347541E-01 .311062E-01 .023495 .0889
+bezier .784083E-02 .152643 .441476E-01 .231512 .112395 .24765
+aline .118745 .24892
+aline .12192 .24892
+aline .122555 .249555
+aline .12827 .249555
+aline .128905 .25019
+aline .144145 .25019
+closepath
+! end of curve
+
+! start of curve
+amove .12954 .2286
+bezier .807084E-01 .224657 .512102E-01 .173591 .048895 .12954
+bezier .452994E-01 .823481E-01 .069891 .261672E-01 .12065 .01524
+bezier .16344 .444576E-02 .207694 .391477E-01 .21844 .08128
+bezier .234046 .131075 .218613 .197615 .16764 .22225
+bezier .155355 .227115 .142333 .230893 .12954 .2286
+closepath
+! end of curve
+
+! start of curve
+amove .2032 .13589
+aline .2032 .107315
+aline .06985 .107315
+aline .06985 .13589
+aline .2032 .13589
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=3 !-------------- Beginning of new char.
+dfont wid=.611115 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .122555 .24257
+aline .12319 .240665
+aline .12827 .225425
+aline .128905 .224155
+aline .15494 .14605
+aline .155575 .14478
+aline .180975 .06858
+aline .18161 .06731
+aline .203835 .000635
+aline .203835 -.000635
+aline .172085 -.000635
+aline .17145 0
+aline .14097 .09144
+bezier .127832 .133711 .112489 .176073 .103505 .219075
+bezier .967453E-01 .179986 .081913 .141801 .070485 .103505
+aline .05461 .05588
+aline .053975 .05334
+aline .050165 .04191
+aline .04953 .04064
+aline .036195 .000635
+aline .03556 -.000635
+aline .010795 -.000635
+aline .010795 .000635
+aline .03302 .06731
+aline .033655 .06858
+aline .05969 .146685
+aline .060325 .147955
+aline .085725 .224155
+aline .08636 .225425
+aline .09144 .240665
+aline .092075 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=4 !-------------- Beginning of new char.
+dfont wid=.666669 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .21717 .240665
+aline .21717 .215265
+aline .017145 .215265
+aline .017145 .240665
+aline .21717 .240665
+closepath
+! end of curve
+
+! start of curve
+amove .194945 .137795
+aline .194945 .112395
+aline .03937 .112395
+aline .03937 .137795
+aline .194945 .137795
+closepath
+! end of curve
+
+! start of curve
+amove .219075 .024765
+aline .219075 -.000635
+aline .01524 -.000635
+aline .01524 .024765
+aline .219075 .024765
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=5 !-------------- Beginning of new char.
+dfont wid=.708338 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .21463 .2413
+aline .21463 -.000635
+aline .18415 -.000635
+aline .18415 .21971
+aline .183515 .220345
+aline .065405 .220345
+aline .06477 .21971
+aline .06477 -.000635
+aline .03429 -.000635
+aline .03429 .2413
+aline .21463 .2413
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=6 !-------------- Beginning of new char.
+dfont wid=.722224 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .23368 .24257
+aline .23368 .220345
+aline .13716 .220345
+aline .136525 .22098
+aline .060325 .22098
+bezier .834769E-01 .187181 .112421 .15422 .13716 .12065
+bezier .115081 .882518E-01 .905025E-01 .055219 .070485 .02286
+aline .142875 .02286
+aline .14351 .023495
+aline .23368 .023495
+aline .23368 -.000635
+aline .02032 -.000635
+bezier .047569 .384111E-01 .744932E-01 .776914E-01 .1016 .11684
+bezier .742316E-01 .151143 .476688E-01 .186027 .02032 .220345
+aline .02032 .24257
+aline .23368 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=7 !-------------- Beginning of new char.
+dfont wid=.777781 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .08128 .25019
+bezier .118356 .246413 .133093 .203729 .13589 .172085
+aline .136525 .17145
+bezier .140669 .20215 .153297 .246448 .191135 .249555
+bezier .222484 .255428 .254244 .225993 .25273 .19431
+aline .22606 .19431
+bezier .227304 .213915 .207215 .233705 .187325 .22606
+bezier .160735 .218944 .156254 .186256 .153035 .164465
+aline .153035 .156845
+aline .1524 .15621
+aline .1524 .144145
+aline .151765 .14351
+aline .151765 -.000635
+aline .121285 -.000635
+aline .121285 .14351
+bezier .119241 .168904 .118995 .197522 .10033 .21844
+bezier .850084E-01 .232974 .560931E-01 .229628 .04953 .207645
+aline .048895 .20574
+aline .04826 .2032
+aline .047625 .202565
+aline .047625 .19939
+aline .04699 .198755
+aline .04699 .19431
+aline .02032 .19431
+bezier .190177E-01 .225999 .495994E-01 .254247 .08128 .25019
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=8 !-------------- Beginning of new char.
+dfont wid=.722224 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .140335 .24257
+aline .140335 .20574
+bezier .182539 .201668 .229024 .172634 .23368 .127
+bezier .237654 .772246E-01 .188073 .406578E-01 .142875 .03683
+aline .140335 .036195
+aline .140335 -.000635
+aline .11176 -.000635
+aline .11176 .036195
+bezier .721973E-01 .413417E-01 .286451E-01 .669131E-01 .020955 .109855
+bezier .135293E-01 .155219 .542009E-01 .193959 .09652 .202565
+aline .10287 .203835
+aline .106045 .203835
+aline .10668 .20447
+aline .11049 .20447
+aline .11176 .20574
+aline .11176 .24257
+aline .140335 .24257
+closepath
+! end of curve
+
+! start of curve
+amove .140335 .183515
+aline .140335 .05842
+bezier .170697 .598283E-01 .201379 .834408E-01 .20447 .114935
+bezier .207963 .148885 .179469 .179023 .14605 .18288
+aline .145415 .183515
+aline .14224 .183515
+aline .141288 .183991
+aline .140335 .183515
+closepath
+! end of curve
+
+! start of curve
+amove .10795 .18288
+bezier .728408E-01 .179135 .435233E-01 .145427 .050165 .11049
+bezier .557084E-01 .817093E-01 .829177E-01 .060516 .11176 .059055
+aline .11176 .18288
+aline .109855 .183261
+aline .10795 .18288
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=9 !-------------- Beginning of new char.
+dfont wid=.777781 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .14986 .24257
+aline .14986 .05969
+bezier .184434 .064424 .198589 .104399 .200025 .133985
+aline .200025 .168275
+bezier .202032 .183946 .200654 .208889 .220345 .21463
+aline .25273 .21463
+aline .25273 .193675
+bezier .233593 .192845 .230082 .169314 .2286 .15494
+bezier .230694 .115538 .221172 .685579E-01 .183515 .047625
+aline .175895 .043815
+aline .17399 .04318
+aline .17272 .042545
+aline .1651 .040005
+aline .15748 .0381
+aline .154305 .037465
+aline .150495 .037465
+aline .14986 .03683
+aline .14986 -.000635
+aline .121285 -.000635
+aline .121285 .03683
+bezier .797452E-01 .404556E-01 .048476 .789997E-01 .046355 .11938
+bezier .415335E-01 .142303 .499731E-01 .170649 .03175 .189865
+aline .02667 .192405
+aline .02413 .19304
+aline .023495 .193675
+aline .02032 .193675
+aline .02032 .21463
+aline .052705 .21463
+bezier .723955E-01 .208889 .710178E-01 .183946 .073025 .168275
+aline .073025 .133985
+bezier .742985E-01 .105032 .875149E-01 .652321E-01 .121285 .05969
+aline .121285 .24257
+aline .14986 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=10 !-------------- Beginning of new char.
+dfont wid=.722224 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .13589 .25019
+bezier .185268 .248556 .238672 .208031 .23368 .154305
+bezier .229484 .105649 .188099 .693539E-01 .177165 .02286
+aline .23749 .02286
+aline .23749 -.000635
+aline .1524 -.000635
+bezier .151561 .629253E-01 .216902 .116515 .200025 .180975
+bezier .180269 .242419 .819675E-01 .245664 .056515 .187325
+bezier .370611E-01 .13858 .745053E-01 .919837E-01 .09144 .04699
+bezier .980363E-01 .315803E-01 .10143 .154412E-01 .1016 -.000635
+aline .01651 -.000635
+aline .01651 .02286
+aline .076835 .02286
+bezier .651772E-01 .735305E-01 .149379E-01 .114103 .020955 .16891
+bezier .248648E-01 .216766 .738965E-01 .247969 .11811 .25019
+aline .13589 .25019
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=11 !-------------- Beginning of new char.
+dfont wid=.583336 hei=.694445 dep=0 italic=.0694447
+dfont fby=33 kadd=.0694447
+dfont fby=39 kadd=.0694447
+dfont fby=")" kadd=.0694447
+dfont fby="?" kadd=.0694447
+dfont fby="]" kadd=.0694447
+dfont fby="i" ligrep=14
+dfont fby="l" ligrep=15
+set path ! start of curve
+newpath
+! start of curve
+amove .1016 .24638
+aline .102235 .245745
+aline .10795 .245745
+aline .108585 .24511
+aline .11176 .24511
+aline .11811 .24384
+aline .12065 .243205
+aline .12192 .24257
+aline .12192 .21971
+bezier .10229 .227646 .743143E-01 .230166 .06223 .208915
+aline .061595 .20701
+aline .06096 .20447
+aline .060325 .203835
+aline .060325 .155575
+aline .06096 .15494
+aline .100965 .15494
+aline .100965 .135255
+aline .06223 .135255
+aline .061595 .13462
+aline .061595 -.000635
+aline .036195 -.000635
+aline .036195 .13462
+aline .03556 .135255
+aline .009525 .135255
+aline .009525 .15494
+aline .03556 .15494
+aline .036195 .155575
+aline .036195 .19431
+bezier .386281E-01 .22589 .700212E-01 .251187 .1016 .24638
+closepath
+! end of curve
+
+! start of curve
+amove .198755 .24638
+aline .19939 .245745
+aline .205105 .245745
+aline .20574 .24511
+aline .208915 .24511
+aline .215265 .24384
+aline .217805 .243205
+aline .219075 .24257
+aline .219075 .21971
+bezier .199445 .227646 .171469 .230166 .159385 .208915
+aline .15875 .20701
+aline .158115 .20447
+aline .15748 .203835
+aline .15748 .155575
+aline .158115 .15494
+aline .19812 .15494
+aline .19812 .135255
+aline .159385 .135255
+aline .15875 .13462
+aline .15875 -.000635
+aline .13335 -.000635
+aline .13335 .19431
+bezier .135783 .22589 .167176 .251187 .198755 .24638
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=12 !-------------- Beginning of new char.
+dfont wid=.536113 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .088265 .24638
+aline .0889 .245745
+aline .09271 .245745
+aline .095885 .24511
+aline .098425 .244475
+aline .102235 .243205
+aline .103505 .24257
+aline .103505 .21971
+bezier .904773E-01 .227314 .694444E-01 .229207 .062865 .21209
+aline .061595 .20828
+aline .06096 .205105
+aline .060325 .20447
+aline .060325 .155575
+aline .06096 .15494
+aline .103505 .15494
+aline .103505 .135255
+aline .06223 .135255
+aline .061595 .13462
+aline .061595 -.000635
+aline .036195 -.000635
+aline .036195 .13462
+aline .03556 .135255
+aline .009525 .135255
+aline .009525 .15494
+aline .03556 .15494
+aline .036195 .155575
+aline .036195 .194945
+bezier .375838E-01 .221196 .589682E-01 .250599 .088265 .24638
+closepath
+! end of curve
+
+! start of curve
+amove .160655 .243205
+aline .160655 .21463
+aline .13208 .21463
+aline .13208 .243205
+aline .160655 .243205
+closepath
+! end of curve
+
+! start of curve
+amove .159385 .15494
+aline .159385 -.000635
+aline .133985 -.000635
+aline .133985 .15494
+aline .159385 .15494
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=13 !-------------- Beginning of new char.
+dfont wid=.536113 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .088265 .24638
+aline .0889 .245745
+aline .09271 .245745
+aline .095885 .24511
+aline .098425 .244475
+aline .102235 .243205
+aline .103505 .24257
+aline .103505 .21971
+bezier .905823E-01 .227743 .693844E-01 .228948 .062865 .21209
+aline .061595 .20828
+aline .06096 .205105
+aline .060325 .20447
+aline .060325 .155575
+aline .06096 .15494
+aline .103505 .15494
+aline .103505 .135255
+aline .06223 .135255
+aline .061595 .13462
+aline .061595 -.000635
+aline .036195 -.000635
+aline .036195 .13462
+aline .03556 .135255
+aline .009525 .135255
+aline .009525 .15494
+aline .03556 .15494
+aline .036195 .155575
+aline .036195 .194945
+bezier .375838E-01 .221196 .589682E-01 .250599 .088265 .24638
+closepath
+! end of curve
+
+! start of curve
+amove .159385 .24257
+aline .159385 -.000635
+aline .133985 -.000635
+aline .133985 .24257
+aline .159385 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=14 !-------------- Beginning of new char.
+dfont wid=.813891 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .094615 .24638
+aline .09525 .245745
+aline .10033 .245745
+aline .103505 .24511
+aline .111125 .243205
+aline .112395 .24257
+aline .112395 .21971
+bezier .957002E-01 .228369 .688054E-01 .22908 .061595 .207645
+aline .06096 .205105
+aline .060325 .20447
+aline .060325 .155575
+aline .06096 .15494
+aline .10287 .15494
+aline .10287 .135255
+aline .06223 .135255
+aline .061595 .13462
+aline .061595 -.000635
+aline .036195 -.000635
+aline .036195 .13462
+aline .03556 .135255
+aline .009525 .135255
+aline .009525 .15494
+aline .03556 .15494
+aline .036195 .155575
+aline .036195 .19431
+bezier .377705E-01 .223255 .642426E-01 .250949 .094615 .24638
+closepath
+! end of curve
+
+! start of curve
+amove .186055 .24638
+aline .18669 .245745
+aline .1905 .245745
+aline .193675 .24511
+aline .19558 .244475
+aline .19812 .24384
+aline .200025 .243205
+aline .20066 .24257
+aline .20066 .21971
+bezier .187649 .228132 .165865 .228581 .16002 .21082
+aline .159385 .20828
+aline .15875 .205105
+aline .158115 .20447
+aline .158115 .155575
+aline .15875 .15494
+aline .20066 .15494
+aline .20066 .135255
+aline .16002 .135255
+aline .159385 .13462
+aline .159385 -.000635
+aline .133985 -.000635
+aline .133985 .194945
+bezier .135267 .221325 .157004 .250768 .186055 .24638
+closepath
+! end of curve
+
+! start of curve
+amove .25781 .243205
+aline .25781 .21463
+aline .229235 .21463
+aline .229235 .243205
+aline .25781 .243205
+closepath
+! end of curve
+
+! start of curve
+amove .25654 .15494
+aline .25654 -.000635
+aline .23114 -.000635
+aline .23114 .15494
+aline .25654 .15494
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=15 !-------------- Beginning of new char.
+dfont wid=.813891 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .094615 .24638
+aline .09525 .245745
+aline .10033 .245745
+aline .103505 .24511
+aline .111125 .243205
+aline .112395 .24257
+aline .112395 .21971
+bezier .957002E-01 .228369 .688054E-01 .22908 .061595 .207645
+aline .06096 .205105
+aline .060325 .20447
+aline .060325 .155575
+aline .06096 .15494
+aline .10287 .15494
+aline .10287 .135255
+aline .06223 .135255
+aline .061595 .13462
+aline .061595 -.000635
+aline .036195 -.000635
+aline .036195 .13462
+aline .03556 .135255
+aline .009525 .135255
+aline .009525 .15494
+aline .03556 .15494
+aline .036195 .155575
+aline .036195 .19431
+bezier .377705E-01 .223255 .642426E-01 .250949 .094615 .24638
+closepath
+! end of curve
+
+! start of curve
+amove .18542 .24638
+aline .186055 .245745
+aline .189865 .245745
+aline .19304 .24511
+aline .19558 .244475
+aline .19939 .243205
+aline .20066 .24257
+aline .20066 .21971
+bezier .187464 .228315 .165889 .228426 .16002 .21082
+aline .159385 .20828
+aline .15875 .205105
+aline .158115 .20447
+aline .158115 .155575
+aline .15875 .15494
+aline .20066 .15494
+aline .20066 .135255
+aline .16002 .135255
+aline .159385 .13462
+aline .159385 -.000635
+aline .133985 -.000635
+aline .133985 .194945
+bezier .135309 .221019 .156596 .250491 .18542 .24638
+closepath
+! end of curve
+
+! start of curve
+amove .25654 .24257
+aline .25654 -.000635
+aline .23114 -.000635
+aline .23114 .24257
+aline .25654 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=16 !-------------- Beginning of new char.
+dfont wid=.23889 hei=.444445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .05461 .15494
+aline .05461 -.000635
+aline .02921 -.000635
+aline .02921 .15494
+aline .05461 .15494
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=17 !-------------- Beginning of new char.
+dfont wid=.266668 hei=.444445 dep=.194445 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .06477 .15494
+aline .06477 -.029845
+bezier .630814E-01 -.539303E-01 .399697E-01 -.780971E-01 .014605 -.07239
+bezier .214029E-02 -.721707E-01 -.115573E-01 -.676862E-01 -.020955 -.060325
+aline -.014605 -.041275
+aline -.01397 -.040005
+bezier .913379E-03 -.558943E-01 .320748E-01 -.555725E-01 .03937 -.032385
+aline .03937 .15494
+aline .06477 .15494
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=18 !-------------- Beginning of new char.
+dfont wid=.500002 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .056515 .24257
+bezier .722792E-01 .223381 .878389E-01 .204045 .103505 .184785
+aline .08255 .184785
+bezier .649344E-01 .204013 .474055E-01 .223303 .029845 .24257
+aline .056515 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=19 !-------------- Beginning of new char.
+dfont wid=.500002 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .14605 .24257
+bezier .12849 .223303 .110961 .204013 .093345 .184785
+aline .07239 .184785
+bezier .880561E-01 .204045 .103616 .223381 .11938 .24257
+aline .14605 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=20 !-------------- Beginning of new char.
+dfont wid=.500002 hei=.631945 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .048895 .2286
+bezier .620044E-01 .214369 .745467E-01 .199378 .879475E-01 .185579
+bezier .101348 .199378 .113891 .214369 .127 .2286
+aline .147955 .2286
+bezier .131473 .209106 .114956 .189638 .098425 .17018
+aline .07747 .17018
+bezier .609393E-01 .189638 .444218E-01 .209106 .02794 .2286
+aline .048895 .2286
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=21 !-------------- Beginning of new char.
+dfont wid=.500002 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .04953 .24257
+bezier .480479E-01 .213562 .853597E-01 .191242 .10922 .210185
+bezier .119965 .216969 .126279 .230359 .126365 .24257
+aline .14732 .24257
+bezier .149323 .20457 .109406 .170489 .07239 .182245
+bezier .463149E-01 .189509 .279176E-01 .21604 .028575 .24257
+aline .04953 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=22 !-------------- Beginning of new char.
+dfont wid=.500002 hei=.608887 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .15113 .220345
+aline .15113 .19812
+aline .024765 .19812
+aline .024765 .220345
+aline .15113 .220345
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=23 !-------------- Beginning of new char.
+dfont wid=.66667 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .122555 .24257
+bezier .14169 .24226 .165158 .22223 .153035 .20193
+bezier .136168 .176313 .870802E-01 .178771 .078105 .210185
+bezier .076024 .233451 .102948 .245075 .122555 .24257
+closepath
+! end of curve
+
+! start of curve
+amove .111125 .22733
+bezier .964932E-01 .227608 .916165E-01 .205785 .106045 .201295
+bezier .117717 .196159 .139173 .200095 .13716 .216535
+aline .136525 .21717
+aline .13589 .219075
+aline .13462 .221615
+aline .13208 .224155
+aline .12827 .22606
+aline .126365 .226695
+aline .12319 .22733
+aline .122555 .227965
+aline .11176 .227965
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=24 !-------------- Beginning of new char.
+dfont wid=.444446 hei=0 dep=.170138 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .098425 -.01016
+bezier .911245E-01 -.029554 .830404E-01 -.486234E-01 .075565 -.067945
+aline .051435 -.067945
+bezier .600549E-01 -.486825E-01 .684472E-01 -.291365E-01 .07747 -.01016
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=25 !-------------- Beginning of new char.
+dfont wid=.480558 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .09525 .24638
+bezier .126928 .245149 .157732 .213229 .146685 .180975
+bezier .141926 .164598 .129242 .151858 .114935 .14351
+bezier .160507 .117119 .17765 .416407E-01 .13208 .006985
+bezier .112983 -.750302E-02 .855621E-01 -.774512E-02 .065405 .00254
+aline .06858 .012065
+aline .069215 .013335
+aline .071755 .020955
+aline .07239 .022225
+bezier .900624E-01 .129893E-01 .115302 .142332E-01 .12573 .033655
+bezier .141957 .663066E-01 .129221 .112953 .09525 .12954
+aline .08763 .13208
+aline .08509 .132715
+aline .084455 .13335
+aline .080645 .13335
+aline .08001 .133985
+aline .07493 .133985
+aline .07493 .15494
+bezier .10125 .152745 .130626 .178368 .12065 .20574
+bezier .109679 .234907 .593745E-01 .230902 .05461 .19939
+aline .05461 -.000635
+aline .02921 -.000635
+aline .02921 .20066
+bezier .332819E-01 .230866 .663456E-01 .249711 .09525 .24638
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=26 !-------------- Beginning of new char.
+dfont wid=.722224 hei=.444445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .089535 .160655
+bezier .106798 .159125 .122844 .147975 .13208 .13335
+bezier .15386 .164506 .207042 .172604 .229235 .137795
+bezier .241677 .11946 .243777 .097257 .24384 .0762
+aline .14097 .0762
+bezier .138627 .468336E-01 .16579 .110057E-01 .19812 .017145
+bezier .21323 .182734E-01 .228732 .256499E-01 .24003 .036195
+aline .24003 .03302
+aline .240665 .032385
+bezier .239278 .242158E-01 .246231 .136531E-01 .23622 .009525
+bezier .204848 -.132049E-01 .158374 -.764007E-02 .133668 .220663E-01
+bezier .113576 -.281745E-02 .787148E-01 -.424206E-02 .04953 -.004445
+bezier .171155E-01 .672046E-03 .372565E-02 .517315E-01 .034925 .067945
+bezier .587557E-01 .832861E-01 .878346E-01 .834376E-01 .113665 .08636
+bezier .115187 .106087 .112765 .132055 .090805 .139065
+bezier .069761 .143533 .473122E-01 .135213 .029845 .122555
+aline .029845 .126365
+aline .02921 .127
+aline .02921 .133985
+aline .028575 .13462
+aline .028575 .141605
+aline .02794 .14224
+aline .02794 .145415
+bezier .464885E-01 .157559 .680287E-01 .161571 .089535 .160655
+closepath
+! end of curve
+
+! start of curve
+amove .180975 .139065
+bezier .159928 .135658 .145632 .115082 .142875 .09525
+aline .222885 .09525
+bezier .222856 .117537 .206094 .142441 .18161 .1397
+closepath
+! end of curve
+
+! start of curve
+amove .106045 .06604
+bezier .862919E-01 .655605E-01 .660524E-01 .627476E-01 .04826 .05207
+bezier .333484E-01 .04016 .479065E-01 .186887E-01 .064135 .01778
+bezier .799933E-01 .146391E-01 .994993E-01 .172057E-01 .11176 .029845
+bezier .118374 .412766E-01 .114504 .547673E-01 .113665 .066675
+aline .10668 .066675
+aline .106045 .06604
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=27 !-------------- Beginning of new char.
+dfont wid=.777781 hei=.444445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .090805 .160655
+bezier .113077 .158868 .133316 .144562 .145733 .126524
+bezier .163983 .156212 .207709 .173123 .23749 .14986
+bezier .258838 .131671 .26314 .102076 .26289 .0762
+aline .16002 .0762
+bezier .157677 .468338E-01 .18484 .110059E-01 .21717 .017145
+bezier .23228 .182734E-01 .247782 .256499E-01 .25908 .036195
+aline .25908 .03302
+aline .259715 .032385
+bezier .258328 .242158E-01 .265281 .136531E-01 .25527 .009525
+bezier .220873 -.158409E-01 .168965 -.54019E-02 .146368 .303213E-01
+bezier .126983 -.482552E-03 .828914E-01 -.159204E-01 .0508 .00508
+bezier -.208722E-02 .035508 -.146086E-02 .121624 .051435 .151765
+aline .059055 .155575
+aline .06096 .15621
+aline .06223 .156845
+aline .06604 .158115
+aline .07112 .159385
+aline .074295 .16002
+aline .078105 .16002
+aline .07874 .160655
+aline .090805 .160655
+closepath
+! end of curve
+
+! start of curve
+amove .079375 .139065
+bezier .536147E-01 .137312 .378918E-01 .110961 .036195 .08763
+bezier .339215E-01 .594656E-01 .045196 .243694E-01 .0762 .017145
+bezier .102934 .114044E-01 .127897 .350527E-01 .13081 .061595
+bezier .137937 .903119E-01 .127812 .131392 .09398 .139065
+aline .090805 .139065
+aline .09017 .1397
+aline .08001 .1397
+aline .079375 .139065
+closepath
+! end of curve
+
+! start of curve
+amove .200025 .139065
+bezier .178978 .135658 .164682 .115082 .161925 .09525
+aline .241935 .09525
+bezier .241906 .117537 .225144 .142441 .20066 .1397
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=28 !-------------- Beginning of new char.
+dfont wid=.500002 hei=.541667 dep=.0972233 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .14224 .19431
+bezier .148025 .190635 .155405 .188093 .16002 .183515
+bezier .152718 .169123 .142115 .155226 .13716 .140335
+bezier .180143 .102183 .170043 .220624E-01 .114935 .000635
+bezier .962728E-01 -.707893E-02 .759752E-01 -.533132E-02 .057531 .139699E-02
+bezier .495817E-01 -.123087E-01 .042208 -.272583E-01 .033655 -.040005
+aline .031115 -.038735
+aline .03048 -.0381
+aline .0254 -.03556
+aline .024765 -.034925
+aline .019685 -.032385
+aline .01905 -.03175
+aline .01651 -.03048
+bezier .217349E-01 -.016089 .324296E-01 -.111353E-02 .040005 .013335
+bezier -.594342E-02 .516456E-01 .699353E-02 .134235 .062865 .15621
+bezier .811549E-01 .163282 .101317 .161515 .118957 .154093
+bezier .126585 .167442 .134007 .18094 .141605 .19431
+closepath
+! end of curve
+
+! start of curve
+amove .08255 .139065
+bezier .550339E-01 .137138 .390712E-01 .108217 .037465 .08382
+bezier .367365E-01 .661066E-01 .394517E-01 .476637E-01 .051435 .033655
+bezier .694794E-01 .677138E-01 .908547E-01 .101198 .107315 .135255
+aline .106045 .13589
+aline .10033 .137795
+aline .09779 .13843
+aline .097155 .139065
+aline .093345 .139065
+aline .09271 .1397
+aline .083185 .1397
+aline .08255 .139065
+closepath
+! end of curve
+
+! start of curve
+amove .12446 .12065
+bezier .106604 .870313E-01 .085582 .538681E-01 .069215 .02032
+bezier .972207E-01 .727947E-02 .132415 .281569E-01 .136525 .059055
+bezier .141145 .795715E-01 .137749 .103103 .125095 .121285
+aline .12446 .12065
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=29 !-------------- Beginning of new char.
+dfont wid=.861115 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .282575 .24257
+aline .282575 .220345
+aline .222885 .220345
+aline .22225 .22098
+aline .178435 .22098
+aline .1778 .220345
+aline .1778 .13716
+aline .178435 .136525
+aline .27305 .136525
+aline .27305 .11557
+aline .178435 .11557
+aline .1778 .114935
+aline .1778 .023495
+aline .178435 .02286
+aline .220345 .02286
+aline .22098 .023495
+aline .287655 .023495
+aline .287655 -.000635
+aline .147955 -.000635
+aline .147955 .076835
+aline .14732 .07747
+aline .06858 .07747
+bezier .057487 .515584E-01 .474378E-01 .252145E-01 .036195 -.000635
+aline .010795 -.000635
+bezier .043412 .804619E-01 .076583 .161958 .11049 .24257
+aline .282575 .24257
+closepath
+! end of curve
+
+! start of curve
+amove .127 .220345
+bezier .110574 .17917 .092102 .13706 .076835 .09652
+aline .14732 .09652
+aline .147955 .097155
+aline .147955 .220345
+aline .14732 .22098
+aline .127635 .22098
+aline .127 .220345
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=30 !-------------- Beginning of new char.
+dfont wid=.972226 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .13335 .25019
+bezier .146785 .248632 .161674 .244656 .174625 .24257
+aline .32131 .24257
+aline .32131 .220345
+aline .25146 .220345
+aline .250825 .22098
+aline .19685 .22098
+aline .196215 .220345
+aline .196215 .13716
+aline .19685 .136525
+aline .311785 .136525
+aline .311785 .11557
+aline .19685 .11557
+aline .196215 .114935
+aline .196215 .023495
+aline .19685 .02286
+aline .24765 .02286
+aline .248285 .023495
+aline .32639 .023495
+aline .32639 -.000635
+aline .174625 -.000635
+bezier .145491 -.734058E-02 .113086 -.136302E-01 .08382 .000635
+bezier .020183 .028731 -.522784E-02 .110246 .02032 .172085
+bezier .370319E-01 .218129 .836862E-01 .253662 .13335 .25019
+closepath
+! end of curve
+
+! start of curve
+amove .120015 .2286
+bezier .734078E-01 .224867 .428797E-01 .177172 .040005 .13462
+bezier .367151E-01 .849416E-01 .625728E-01 .245537E-01 .116205 .013335
+bezier .133102 .110961E-01 .158486 .123292E-01 .16256 .033655
+aline .163195 .036195
+aline .16383 .03937
+aline .164465 .040005
+aline .164465 .043815
+aline .1651 .04445
+aline .1651 .048895
+aline .165735 .04953
+aline .165735 .05842
+aline .16637 .059055
+aline .16637 .18288
+bezier .16451 .198032 .165101 .221197 .14605 .226695
+aline .14097 .227965
+aline .140335 .2286
+aline .13589 .2286
+aline .135255 .229235
+aline .12065 .229235
+aline .120015 .2286
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=31 !-------------- Beginning of new char.
+dfont wid=.777781 hei=.743055 dep=.0486116 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .207645 .264795
+aline .208915 .26416
+aline .211455 .26289
+aline .21209 .262255
+aline .2159 .26035
+aline .216535 .259715
+aline .220345 .25781
+aline .22098 .257175
+aline .22479 .25527
+aline .22606 .254
+bezier .220601 .24328 .212577 .233059 .208788 .221996
+bezier .272903 .166598 .2662 .521184E-01 .19304 .00762
+bezier .159513 -.013295 .117161 -.128897E-01 .829734E-01 .529167E-02
+bezier .772879E-01 -.427431E-02 .721711E-01 -.142502E-01 .06604 -.023495
+aline .065405 -.02286
+aline .061595 -.020955
+aline .06096 -.02032
+aline .05715 -.018415
+aline .056515 -.01778
+aline .052705 -.015875
+aline .05207 -.01524
+aline .04826 -.013335
+aline .04699 -.012065
+bezier .523804E-01 -.146495E-02 .605127E-01 .895089E-02 .064135 .019685
+bezier -.14161E-02 .753238E-01 .804554E-02 .191976 .08255 .235585
+bezier .115787 .255605 .156607 .253972 .190119 .236728
+bezier .195792 .246265 .200896 .256211 .20701 .26543
+aline .207645 .264795
+closepath
+! end of curve
+
+! start of curve
+amove .12954 .2286
+bezier .865258E-01 .225724 .555968E-01 .183372 .051435 .142875
+bezier .454957E-01 .107885 .526042E-01 .684008E-01 .076835 .040005
+bezier .110534 .988118E-01 .145428 .157771 .178012 .216747
+bezier .163401 .225717 .146105 .231067 .12954 .2286
+closepath
+! end of curve
+
+! start of curve
+amove .194945 .200025
+bezier .162146 .141521 .126395 .833167E-01 .09525 .024765
+bezier .132957 -.576744E-03 .186614 .016535 .207645 .05588
+bezier .231838 .101541 .229253 .15945 .19685 .20066
+aline .195898 .201136
+aline .195368 .200872
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=32 !-------------- Beginning of new char.
+dfont wid=.23889 hei=.444445 dep=0 italic=0
+dfont fby="L" kadd=-.258336
+dfont fby="l" kadd=-.23889
+set path ! start of curve
+newpath
+! start of curve
+amove .079375 .13843
+aline .08001 .137795
+aline .085725 .12065
+aline .085725 .120015
+aline .08509 .11938
+aline .05461 .10922
+aline .05207 .108585
+aline .004445 .09271
+aline .00381 .09398
+aline -.001905 .111125
+aline -.001905 .11176
+aline .062865 .13335
+aline .065405 .133985
+aline .07874 .13843
+aline .079375 .13843
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=33 !-------------- Beginning of new char.
+dfont wid=.319446 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .070485 .24257
+aline .070485 .222885
+aline .06985 .22225
+aline .06985 .182245
+aline .069215 .18161
+aline .069215 .14224
+aline .06858 .141605
+aline .06858 .1016
+aline .067945 .100965
+aline .067945 .061595
+aline .06731 .06096
+aline .045085 .06096
+aline .04445 .061595
+aline .04445 .100965
+aline .043815 .1016
+aline .043815 .141605
+aline .04318 .14224
+aline .04318 .18161
+aline .042545 .182245
+aline .042545 .22225
+aline .04191 .222885
+aline .04191 .24257
+aline .070485 .24257
+closepath
+! end of curve
+
+! start of curve
+amove .070485 .02794
+aline .070485 -.000635
+aline .04191 -.000635
+aline .04191 .02794
+aline .070485 .02794
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=34 !-------------- Beginning of new char.
+dfont wid=.500002 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .04064 .24257
+aline .04064 .21336
+aline .036195 .200025
+aline .03556 .198755
+aline .026035 .17018
+aline .01143 .17018
+bezier .143565E-01 .184704 .018177 .199756 .02032 .213995
+aline .012065 .213995
+aline .012065 .24257
+aline .04064 .24257
+closepath
+! end of curve
+
+! start of curve
+amove .10922 .24257
+aline .10922 .21336
+aline .104775 .200025
+aline .10414 .198755
+aline .094615 .17018
+aline .08001 .17018
+bezier .829365E-01 .184704 .086757 .199756 .0889 .213995
+aline .080645 .213995
+aline .080645 .24257
+aline .10922 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=35 !-------------- Beginning of new char.
+dfont wid=.833336 hei=.694445 dep=.194443 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .147955 .24257
+aline .149225 .241935
+aline .150495 .2413
+aline .151765 .24003
+aline .153035 .23749
+bezier .146317 .201264 .133458 .165505 .126365 .12954
+aline .191135 .12954
+bezier .201571 .166213 .209891 .203623 .22098 .24003
+aline .22225 .2413
+aline .22479 .24257
+aline .2286 .24257
+aline .23114 .2413
+aline .23241 .24003
+aline .23368 .23749
+bezier .226962 .201264 .214103 .165505 .20701 .12954
+aline .266065 .12954
+bezier .273366 .128898 .275111 .117848 .26797 .11557
+aline .20193 .11557
+bezier .197225 .966682E-01 .191362 .076519 .187325 .05842
+aline .26797 .05842
+bezier .275111 .561421E-01 .273366 .450925E-01 .266065 .04445
+aline .18288 .04445
+bezier .172224 .756781E-02 .163689 -.300531E-01 .1524 -.066675
+aline .15113 -.067945
+aline .14859 -.069215
+aline .14478 -.069215
+aline .14224 -.067945
+aline .14097 -.066675
+aline .1397 -.064135
+bezier .146612 -.276925E-01 .159668 .828318E-02 .167005 .04445
+aline .102235 .04445
+bezier .915787E-01 .756782E-02 .830437E-01 -.300531E-01 .071755 -.066675
+aline .070485 -.067945
+aline .067945 -.069215
+aline .064135 -.069215
+aline .061595 -.067945
+aline .060325 -.066675
+aline .059055 -.064135
+bezier .659674E-01 -.276926E-01 .790234E-01 .828355E-02 .08636 .04445
+aline .02667 .04445
+bezier .193688E-01 .450925E-01 .176236E-01 .561421E-01 .024765 .05842
+aline .09144 .05842
+bezier .961453E-01 .773218E-01 .102008 .097471 .106045 .11557
+aline .024765 .11557
+bezier .176236E-01 .117848 .193688E-01 .128898 .02667 .12954
+aline .11049 .12954
+bezier .120926 .166213 .129246 .203623 .140335 .24003
+aline .141605 .2413
+aline .142875 .241935
+aline .144145 .24257
+closepath
+! end of curve
+
+! start of curve
+amove .12065 .11303
+bezier .116098 .949914E-01 .110519 .756688E-01 .10668 .05842
+aline .172085 .05842
+bezier .17679 .773218E-01 .182653 .097471 .18669 .11557
+aline .121285 .11557
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=36 !-------------- Beginning of new char.
+dfont wid=.500002 hei=.75 dep=.0555553 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .09779 .262255
+aline .09779 .24638
+bezier .115474 .244788 .13724 .238662 .14986 .225425
+bezier .147967 .218832 .147965 .210391 .145415 .20447
+bezier .132447 .215382 .114278 .224342 .09779 .22352
+aline .09779 .1397
+bezier .139368 .132545 .164934 .085807 .153035 .04699
+bezier .145902 .210136E-01 .123987 .770359E-03 .09779 -.004445
+aline .09779 -.02032
+aline .078105 -.02032
+aline .078105 -.004445
+bezier .571516E-01 -.187072E-02 .316259E-01 .535071E-02 .01651 .020955
+bezier .184235E-01 .277539E-01 .186786E-01 .362831E-01 .020955 .042545
+bezier .364553E-01 .291015E-01 .581917E-01 .187559E-01 .078105 .018415
+aline .078105 .112395
+bezier .346033E-01 .118064 .643976E-02 .169222 .02667 .20828
+bezier .036409 .228361 .561975E-01 .242196 .078105 .24638
+aline .078105 .262255
+aline .09779 .262255
+closepath
+! end of curve
+
+! start of curve
+amove .075565 .222885
+bezier .479587E-01 .216266 .356397E-01 .180406 .053975 .15875
+bezier .602392E-01 .151874 .689297E-01 .145491 .078105 .14478
+aline .078105 .222885
+aline .076835 .223308
+aline .075565 .222885
+closepath
+! end of curve
+
+! start of curve
+amove .09779 .10668
+aline .09779 .01905
+bezier .129917 .254366E-01 .141318 .707711E-01 .11938 .09398
+bezier .114198 .100298 .106095 .10624 .09779 .10668
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=37 !-------------- Beginning of new char.
+dfont wid=.833336 hei=.75 dep=.0555553 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .073025 .262255
+bezier .101044 .257439 .115057 .22542 .11684 .200025
+bezier .118877 .170186 .10855 .13231 .076835 .12192
+bezier .435269E-01 .115856 .021126 .153763 .020955 .18288
+bezier .169152E-01 .213518 .303377E-01 .254978 .06477 .262255
+aline .073025 .262255
+closepath
+! end of curve
+
+! start of curve
+amove .226695 .262255
+bezier .23753 .257594 .227801 .246373 .224155 .24003
+bezier .174007 .153658 .124544 .667917E-01 .07366 -.01905
+aline .07112 -.02032
+aline .06731 -.02032
+bezier .564751E-01 -.156589E-01 .662042E-01 -.44376E-02 .06985 .001905
+bezier .119998 .882775E-01 .169461 .175143 .220345 .260985
+aline .221615 .26162
+aline .222885 .262255
+closepath
+! end of curve
+
+! start of curve
+amove .065405 .240665
+bezier .499001E-01 .235336 .475735E-01 .215775 .04572 .202565
+bezier .457141E-01 .182626 .442281E-01 .160499 .05969 .145415
+bezier .714244E-01 .136347 .084055 .148529 .08763 .16002
+bezier .967142E-01 .185222 .964218E-01 .215684 .07874 .23749
+aline .07747 .238125
+aline .076835 .23876
+aline .074295 .24003
+aline .07239 .240665
+aline .071755 .2413
+aline .06604 .2413
+closepath
+! end of curve
+
+! start of curve
+amove .2286 .12065
+bezier .256619 .115834 .270632 .838153E-01 .272415 .05842
+bezier .274452 .285814E-01 .264125 -.92947E-02 .23241 -.019685
+bezier .199102 -.257487E-01 .176701 .121574E-01 .17653 .041275
+bezier .17249 .719131E-01 .185913 .113373 .220345 .12065
+aline .2286 .12065
+closepath
+! end of curve
+
+! start of curve
+amove .22098 .09906
+bezier .205475 .937307E-01 .203149 .741696E-01 .201295 .06096
+bezier .201289 .410209E-01 .199803 .188935E-01 .215265 .00381
+bezier .226999 -.525819E-02 .23963 .692363E-02 .243205 .018415
+bezier .252289 .436173E-01 .251997 .740791E-01 .234315 .095885
+aline .233045 .09652
+aline .23241 .097155
+aline .22987 .098425
+aline .227965 .09906
+aline .22733 .099695
+aline .221615 .099695
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=38 !-------------- Beginning of new char.
+dfont wid=.758336 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .11049 .25019
+bezier .149171 .24451 .163892 .189615 .13843 .161925
+bezier .127623 .145551 .111572 .132965 .979488E-01 .119063
+bezier .112106 .901028E-01 .131722 .650773E-01 .153035 .041275
+bezier .183909 .665014E-01 .201636 .104178 .21336 .14097
+aline .22098 .139065
+aline .222885 .13843
+aline .233045 .13589
+aline .234315 .135255
+bezier .223512 .937056E-01 .201534 .554872E-01 .169704 .269875E-01
+bezier .19132 .796438E-02 .221055 .121605E-01 .24638 .02032
+aline .24638 -.00254
+bezier .214303 -.123178E-01 .17686 -.109596E-01 .149543 .119063E-01
+bezier .116305 -.710195E-02 .072442 -.018866 .038735 .004445
+bezier .918933E-02 .244287E-01 .712762E-02 .716537E-01 .03556 .093345
+bezier .046069 .103757 .587649E-01 .112191 .683683E-01 .12319
+bezier .560237E-01 .159479 .499847E-01 .202265 .074295 .23495
+aline .080645 .2413
+aline .081915 .241935
+aline .083185 .243205
+aline .084455 .24384
+aline .08509 .244475
+aline .09144 .24765
+aline .09525 .24892
+aline .09779 .249555
+aline .100965 .25019
+aline .11049 .25019
+closepath
+! end of curve
+
+! start of curve
+amove .102235 .2286
+bezier .810074E-01 .224185 .776057E-01 .197937 .080645 .18034
+bezier .081288 .166933 .847349E-01 .153662 .089535 .140335
+bezier .107308 .157944 .132184 .178102 .127 .20574
+bezier .124729 .217306 .115923 .232643 .102235 .2286
+closepath
+! end of curve
+
+! start of curve
+amove .07366 .098425
+bezier .575075E-01 .861395E-01 .377378E-01 .692341E-01 .042545 .04699
+bezier .441122E-01 .257911E-01 .665216E-01 .879835E-02 .086995 .01397
+bezier .102245 .146723E-01 .118325 .197088E-01 .13208 .027305
+bezier .111007 .502134E-01 .920101E-01 .074618 .07747 .102235
+aline .07366 .098425
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=39 !-------------- Beginning of new char.
+dfont wid=.277779 hei=.694445 dep=0 italic=0
+dfont fby=33 kadd=.111112
+dfont fby=39 ligrep=34
+dfont fby="?" kadd=.111112
+set path ! start of curve
+newpath
+! start of curve
+amove .0635 .24257
+aline .0635 .21336
+aline .059055 .200025
+aline .05842 .198755
+aline .048895 .17018
+aline .03429 .17018
+bezier .372165E-01 .184704 .041037 .199756 .04318 .213995
+aline .034925 .213995
+aline .034925 .24257
+aline .0635 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=40 !-------------- Beginning of new char.
+dfont wid=.38889 hei=.75 dep=.25 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .116205 .262255
+bezier .726926E-01 .221512 .572126E-01 .158334 .05461 .10287
+aline .05461 .07112
+bezier .572126E-01 .156559E-01 .726926E-01 -.475224E-01 .116205 -.088265
+aline .09525 -.088265
+bezier .486708E-01 -.490665E-01 .302593E-01 .155462E-01 .02794 .07239
+bezier .266015E-01 .126477 .343185E-01 .181757 .065405 .2286
+bezier .739252E-01 .240811 .836893E-01 .252523 .09525 .262255
+aline .116205 .262255
+aline .107315 .253365
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=")" !-------------- Beginning of new char.
+dfont wid=.38889 hei=.75 dep=.25 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .041275 .262255
+bezier .878542E-01 .223056 .106266 .158444 .108585 .1016
+bezier .109924 .475129E-01 .102207 -.776667E-02 .07112 -.05461
+bezier .625998E-01 -.066821 .528357E-01 -.785327E-01 .041275 -.088265
+aline .02032 -.088265
+bezier .638324E-01 -.475223E-01 .793125E-01 .156559E-01 .081915 .07112
+aline .081915 .10287
+bezier .793124E-01 .158334 .638324E-01 .221512 .02032 .262255
+aline .041275 .262255
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="*" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.75 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .09017 .262255
+bezier .103875 .259488 .990475E-01 .243103 .098425 .23368
+aline .098425 .22352
+aline .09779 .222885
+aline .09779 .21209
+aline .097155 .211455
+aline .097155 .20193
+bezier .111408 .20871 .124257 .221827 .139065 .229235
+bezier .151249 .231684 .158787 .212835 .14732 .20701
+bezier .133786 .199213 .117754 .192411 .105833 .183938
+bezier .12095 .175568 .137071 .168588 .15113 .15875
+bezier .159349 .147032 .141684 .132576 .13208 .14351
+bezier .120496 .151116 .108937 .161256 .097155 .167005
+bezier .097008 .14902 .100301 .131494 .09906 .113665
+bezier .951829E-01 .103422 .078306 .104726 .0762 .11557
+bezier .760486E-01 .132836 .798412E-01 .151063 .777875E-01 .167481
+bezier .640456E-01 .158381 .513121E-01 .147587 .03683 .1397
+bezier .246457E-01 .137251 .171076E-01 .1561 .028575 .161925
+bezier .421085E-01 .169722 .581413E-01 .176525 .700617E-01 .184997
+bezier .549446E-01 .193368 .388244E-01 .200347 .024765 .210185
+bezier .165457E-01 .221903 .034211 .236359 .043815 .225425
+bezier .553989E-01 .217819 .669585E-01 .207679 .07874 .20193
+bezier .078887 .219915 .755937E-01 .237441 .076835 .25527
+aline .07747 .25654
+aline .078105 .257175
+aline .07874 .258445
+aline .08001 .259715
+aline .08128 .26035
+aline .081915 .260985
+aline .083185 .26162
+aline .085725 .262255
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="+" !-------------- Beginning of new char.
+dfont wid=.777781 hei=.583334 dep=.083334 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .13843 .203835
+aline .1397 .2032
+aline .14097 .202565
+aline .14224 .201295
+aline .14351 .198755
+aline .14351 .094615
+aline .144145 .09398
+aline .24765 .09398
+aline .25019 .09271
+aline .25146 .09144
+aline .25273 .0889
+aline .25273 .08509
+aline .25146 .08255
+aline .25019 .08128
+aline .24765 .08001
+aline .144145 .08001
+aline .14351 .079375
+aline .14351 -.024765
+aline .14224 -.027305
+aline .14097 -.028575
+aline .13843 -.029845
+aline .13462 -.029845
+aline .13208 -.028575
+aline .13081 -.027305
+aline .12954 -.024765
+aline .12954 .079375
+aline .128905 .08001
+aline .0254 .08001
+aline .02286 .08128
+aline .02159 .08255
+aline .02032 .08509
+aline .02032 .0889
+aline .02159 .09144
+aline .02286 .09271
+aline .0254 .09398
+aline .128905 .09398
+aline .12954 .094615
+aline .12954 .198755
+aline .13081 .201295
+aline .13208 .202565
+aline .13335 .2032
+aline .13462 .203835
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="," !-------------- Beginning of new char.
+dfont wid=.277779 hei=.083333 dep=.125 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .0635 .02794
+aline .0635 -.00127
+aline .059055 -.014605
+aline .05842 -.015875
+aline .048895 -.04445
+aline .03429 -.04445
+bezier .372165E-01 -.299258E-01 .041037 -.148741E-01 .04318 -.000635
+aline .034925 -.000635
+aline .034925 .02794
+aline .0635 .02794
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="-" !-------------- Beginning of new char.
+dfont wid=.333334 hei=.444445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .09652 .086995
+aline .09652 .06731
+aline .004445 .06731
+aline .004445 .086995
+aline .09652 .086995
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="." !-------------- Beginning of new char.
+dfont wid=.277779 hei=.083333 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .0635 .02794
+aline .0635 -.000635
+aline .034925 -.000635
+aline .034925 .02794
+aline .0635 .02794
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="/" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.75 dep=.25 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .150495 .262255
+aline .151765 .26162
+aline .153035 .260985
+aline .154305 .259715
+aline .155575 .257175
+bezier .13148 .181361 .101704 .106588 .075565 .031115
+bezier .604949E-01 -.801486E-02 .483176E-01 -.487238E-01 .03175 -.086995
+aline .02921 -.088265
+aline .0254 -.088265
+aline .02286 -.086995
+aline .02159 -.085725
+aline .02032 -.083185
+bezier .444152E-01 -.737131E-02 .741909E-01 .674023E-01 .10033 .142875
+bezier .1154 .182005 .127577 .222714 .144145 .260985
+aline .145415 .26162
+aline .146685 .262255
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="0" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.655556 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .09398 .236855
+bezier .127256 .234378 .14949 .203775 .155575 .17272
+bezier .158698 .15865 .15939 .145376 .160655 .131445
+aline .160655 .09525
+bezier .159191 .589637E-01 .150267 .106582E-01 .11049 -.004445
+bezier .762342E-01 -.181343E-01 .357472E-01 .368544E-02 .0254 .038735
+bezier .179127E-01 .573306E-01 .168743E-01 .076471 .01524 .09525
+aline .01524 .131445
+bezier .168914E-01 .167791 .248834E-01 .216293 .064135 .23241
+aline .06604 .233045
+aline .06731 .23368
+aline .069215 .234315
+aline .074295 .235585
+aline .07747 .23622
+aline .08128 .23622
+aline .081915 .236855
+aline .09398 .236855
+closepath
+! end of curve
+
+! start of curve
+amove .083185 .215265
+bezier .534326E-01 .211739 .448331E-01 .176415 .042545 .1524
+aline .042545 .142875
+aline .04191 .14224
+aline .04191 .093345
+bezier .442782E-01 .680451E-01 .457053E-01 .353106E-01 .069215 .018415
+bezier .905401E-01 .368188E-02 .118873 .200863E-01 .125095 .04318
+bezier .13116 .059921 .1328 .765204E-01 .133985 .093345
+aline .133985 .14224
+bezier .132053 .167656 .128346 .203604 .09906 .213995
+aline .09652 .21463
+aline .095885 .215265
+aline .09271 .215265
+aline .092075 .2159
+aline .08382 .2159
+aline .083185 .215265
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="1" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.655556 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .104775 .236855
+aline .104775 .019685
+aline .10541 .01905
+aline .14859 .01905
+aline .14859 -.000635
+aline .03429 -.000635
+aline .03429 .01905
+aline .07747 .01905
+aline .078105 .019685
+aline .078105 .20193
+bezier .634322E-01 .197004 .481279E-01 .193675 .032385 .19431
+aline .032385 .213995
+bezier .557645E-01 .21336 .809129E-01 .2197 .098425 .236855
+aline .104775 .236855
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="2" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.655556 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .09017 .236855
+bezier .131066 .235548 .163228 .193849 .156845 .154305
+bezier .152614 .115222 .115686 .926175E-01 .089535 .067945
+aline .078105 .056515
+aline .076835 .05588
+aline .062865 .04191
+aline .061595 .041275
+aline .047625 .027305
+aline .046355 .02667
+aline .04318 .023495
+aline .043815 .02286
+aline .15748 .02286
+aline .15748 -.000635
+aline .018415 -.000635
+aline .018415 .020955
+aline .07493 .07747
+bezier .102087 .101003 .133853 .131564 .128905 .17018
+bezier .126167 .192915 .107004 .213368 .08382 .215265
+bezier .602044E-01 .218634 .039623 .200249 .03429 .1778
+aline .033655 .17653
+aline .03302 .17399
+aline .03175 .17018
+aline .029845 .16256
+aline .02921 .160655
+bezier .244514E-01 .166891 .192174E-01 .173133 .01524 .179705
+bezier .223306E-01 .208586 .455341E-01 .235598 .0762 .236855
+aline .09017 .236855
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="3" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.655556 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .094615 .236855
+bezier .125751 .235376 .157829 .206811 .150495 .17399
+bezier .146956 .152146 .131671 .133645 .112395 .123825
+bezier .143584 .114175 .167677 .810238E-01 .159385 .04826
+bezier .150982 .564646E-02 .102147 -.181626E-01 .062865 -.00508
+bezier .437734E-01 .882775E-03 .244763E-01 .129409E-01 .01524 .03048
+bezier .173957E-01 .356976E-01 .166619E-01 .449445E-01 .01905 .04826
+bezier .377868E-01 .209822E-01 .077054 .245926E-02 .10795 .01778
+bezier .141882 .392794E-01 .136548 .101716 .095885 .112395
+aline .09271 .112395
+aline .092075 .11303
+aline .059055 .11303
+aline .059055 .133985
+bezier .793304E-01 .134346 .104233 .137063 .11557 .15748
+bezier .127406 .175615 .126313 .205103 .103505 .213995
+bezier .076512 .224548 .430674E-01 .207087 .03302 .179705
+bezier .286877E-01 .185772 .243727E-01 .191851 .02032 .19812
+bezier .347202E-01 .22404 .651225E-01 .239521 .094615 .236855
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="4" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.655556 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .130175 .229235
+aline .130175 .08128
+aline .13081 .080645
+aline .165735 .080645
+aline .165735 .05969
+aline .13081 .05969
+aline .130175 .059055
+aline .130175 -.000635
+aline .103505 -.000635
+aline .103505 .059055
+aline .10287 .05969
+aline .01016 .05969
+aline .01016 .08128
+bezier .396861E-01 .130523 .689455E-01 .179958 .098425 .229235
+aline .130175 .229235
+closepath
+! end of curve
+
+! start of curve
+amove .10414 .2159
+bezier .973446E-01 .179519 .745984E-01 .148305 .057785 .116205
+bezier .512894E-01 .104444 .424361E-01 .919833E-01 .037465 .080645
+aline .104775 .080645
+aline .10541 .08128
+aline .10541 .2159
+aline .104775 .216535
+aline .10414 .2159
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="5" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.655556 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .14605 .229235
+aline .14605 .207645
+aline .05461 .207645
+aline .053975 .20701
+aline .053975 .135255
+bezier .623036E-01 .140665 .743455E-01 .148139 .085725 .14859
+bezier .125184 .152787 .155839 .113739 .15748 .07747
+bezier .163192 .313181E-01 .12013 -.014721 .07366 -.00762
+bezier .502985E-01 -.683432E-02 .279705E-01 .725354E-02 .014605 .026035
+bezier .183826E-01 .316218E-01 .216739E-01 .407445E-01 .026035 .043815
+bezier .427862E-01 .114486E-01 .096083 -.175874E-02 .117475 .032385
+bezier .131238 .581483E-01 .130804 .909753E-01 .114935 .11557
+bezier .096881 .139031 .604821E-01 .124741 .05207 .099695
+aline .02921 .099695
+aline .02921 .229235
+aline .14605 .229235
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="6" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.655556 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .11684 .236855
+bezier .12596 .235432 .136463 .234331 .145415 .22987
+aline .145415 .20955
+bezier .121007 .220192 .896206E-01 .221746 .070485 .200025
+bezier .534809E-01 .1821 .457122E-01 .15564 .045085 .13208
+bezier .654817E-01 .158969 .11143 .174288 .136525 .14605
+bezier .161605 .11738 .165691 .756226E-01 .154305 .04064
+bezier .142272 .124911E-01 .113822 -.134129E-01 .081915 -.00762
+bezier .393133E-01 -.402891E-02 .197397E-01 .440829E-01 .01778 .080645
+bezier .971032E-02 .132472 .218854E-01 .197334 .07112 .226695
+aline .071755 .22733
+aline .079375 .23114
+aline .08128 .231775
+aline .08255 .23241
+aline .088265 .234315
+aline .093345 .235585
+aline .09652 .23622
+aline .10033 .23622
+aline .100965 .236855
+aline .11684 .236855
+closepath
+! end of curve
+
+! start of curve
+amove .08255 .139065
+bezier .519943E-01 .133618 .041966 .969174E-01 .04572 .071755
+bezier .477494E-01 .482957E-01 .567474E-01 .171349E-01 .08382 .012065
+bezier .112761 .808383E-02 .131349 .392363E-01 .13208 .064135
+bezier .133212 .893749E-01 .132102 .11843 .109855 .13462
+aline .104775 .13716
+aline .100965 .13843
+aline .09779 .139065
+aline .097155 .1397
+aline .083185 .1397
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="7" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.655556 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .160655 .229235
+aline .160655 .20701
+bezier .110962 .148998 .828657E-01 .701974E-01 .083185 -.004445
+aline .05461 -.004445
+bezier .538198E-01 .07093 .845033E-01 .149928 .137795 .205105
+aline .13716 .20574
+aline .01524 .20574
+aline .01524 .229235
+aline .160655 .229235
+aline .160655 .20701
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="8" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.655556 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .094615 .236855
+bezier .132139 .235348 .167064 .19537 .1524 .158115
+bezier .146124 .140783 .128549 .130261 .114088 .122978
+bezier .149736 .112442 .171737 .704826E-01 .155575 .036195
+bezier .138482 -.910191E-02 .074573 -.229607E-01 .03937 .009525
+bezier .767054E-02 .350587E-01 .638297E-02 .897338E-01 .04191 .112395
+bezier .471574E-01 .117981 .569917E-01 .119714 .618067E-01 .124037
+bezier .311194E-01 .132812 .102094E-01 .168233 .024765 .19812
+bezier .364502E-01 .224635 .663525E-01 .239518 .094615 .236855
+closepath
+! end of curve
+
+! start of curve
+amove .08128 .216535
+bezier .0552 .216013 .371808E-01 .186499 .04572 .163195
+bezier .561245E-01 .123253 .123039 .124767 .13081 .165735
+bezier .137856 .188492 .119595 .216066 .094615 .216535
+aline .09398 .21717
+aline .081915 .21717
+aline .08128 .216535
+closepath
+! end of curve
+
+! start of curve
+amove .081915 .112395
+bezier .513654E-01 .110008 .036319 .737559E-01 .04445 .047625
+bezier .497475E-01 .108102E-01 .102425 -.601977E-03 .12319 .02921
+bezier .143367 .564306E-01 .133552 .104751 .097155 .112395
+aline .09398 .112395
+aline .093345 .11303
+aline .08255 .11303
+aline .081915 .112395
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="9" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.655556 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .09525 .236855
+bezier .137605 .232175 .155923 .184444 .15875 .147955
+bezier .163717 .100321 .157967 .449285E-01 .11938 .010795
+bezier .948981E-01 -.138878E-01 .052328 -.145945E-01 .026035 .00762
+bezier .295104E-01 .135484E-01 .032716 .204504E-01 .03683 .0254
+bezier .595689E-01 .349086E-02 .997071E-01 .96548E-02 .1143 .0381
+bezier .125038 .555223E-01 .131141 .774522E-01 .13081 .09652
+bezier .110335 .697778E-01 .644922E-01 .542407E-01 .03937 .08255
+bezier .142153E-01 .111623 .978965E-02 .154039 .022225 .18923
+bezier .351786E-01 .216885 .629917E-01 .240996 .09525 .236855
+closepath
+! end of curve
+
+! start of curve
+amove .08382 .216535
+bezier .586826E-01 .214584 .453653E-01 .186311 .043815 .164465
+bezier .426409E-01 .139218 .439232E-01 .110232 .06604 .09398
+bezier .903282E-01 .790776E-01 .122158 .097143 .127635 .123825
+bezier .134492 .149879 .130217 .177557 .11684 .20193
+bezier .109571 .212188 .961788E-01 .219596 .08382 .216535
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=":" !-------------- Beginning of new char.
+dfont wid=.277779 hei=.444445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .0635 .15494
+aline .0635 .126365
+aline .034925 .126365
+aline .034925 .15494
+aline .0635 .15494
+closepath
+! end of curve
+
+! start of curve
+amove .0635 .02794
+aline .0635 -.000635
+aline .034925 -.000635
+aline .034925 .02794
+aline .0635 .02794
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=";" !-------------- Beginning of new char.
+dfont wid=.277779 hei=.444445 dep=.125 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .0635 .15494
+aline .0635 .126365
+aline .034925 .126365
+aline .034925 .15494
+aline .0635 .15494
+closepath
+! end of curve
+
+! start of curve
+amove .0635 .02794
+aline .0635 -.00127
+aline .059055 -.014605
+aline .05842 -.015875
+aline .048895 -.04445
+aline .03429 -.04445
+bezier .372165E-01 -.299258E-01 .041037 -.148741E-01 .04318 -.000635
+aline .034925 -.000635
+aline .034925 .02794
+aline .0635 .02794
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="<" !-------------- Beginning of new char.
+dfont wid=.319446 hei=.5 dep=.194445 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .070485 .174625
+aline .070485 .14605
+aline .04191 .14605
+aline .04191 .174625
+aline .070485 .174625
+closepath
+! end of curve
+
+! start of curve
+amove .06731 .11303
+aline .067945 .112395
+aline .067945 .07239
+aline .06858 .071755
+aline .06858 .032385
+aline .069215 .03175
+aline .069215 -.008255
+aline .06985 -.00889
+aline .06985 -.048895
+aline .070485 -.04953
+aline .070485 -.069215
+aline .04191 -.069215
+aline .04191 -.04953
+aline .042545 -.048895
+aline .042545 -.00889
+aline .04318 -.008255
+aline .04318 .03175
+aline .043815 .032385
+aline .043815 .071755
+aline .04445 .07239
+aline .04445 .112395
+aline .045085 .11303
+aline .06731 .11303
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="=" !-------------- Beginning of new char.
+dfont wid=.777781 hei=.37 dep=-.13 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .24638 .12954
+bezier .253681 .128898 .255426 .117848 .248285 .11557
+aline .024765 .11557
+aline .023495 .116205
+aline .02286 .11684
+aline .02159 .117475
+aline .02032 .120015
+aline .02032 .12446
+aline .02159 .127
+aline .02286 .127635
+aline .023495 .12827
+aline .024765 .128905
+aline .02667 .12954
+closepath
+! end of curve
+
+! start of curve
+amove .248285 .05842
+bezier .255426 .561421E-01 .253681 .450925E-01 .24638 .04445
+aline .02667 .04445
+aline .024765 .045085
+aline .023495 .04572
+aline .02286 .046355
+aline .02159 .04699
+aline .02032 .04953
+aline .02032 .053975
+aline .02159 .056515
+aline .02286 .05715
+aline .023495 .057785
+aline .024765 .05842
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=">" !-------------- Beginning of new char.
+dfont wid=.472224 hei=.5 dep=.194445 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .092075 .174625
+aline .092075 .14605
+aline .0635 .14605
+aline .0635 .174625
+aline .092075 .174625
+closepath
+! end of curve
+
+! start of curve
+amove .0889 .11303
+bezier .093048 .736397E-01 .804638E-01 .310252E-01 .05207 .001905
+bezier .442568E-01 -.014044 .432693E-01 -.390714E-01 .06096 -.048895
+bezier .868151E-01 -.573381E-01 .11513 -.475954E-01 .137795 -.03302
+aline .139065 -.03683
+aline .1397 -.0381
+aline .141605 -.043815
+aline .14224 -.045085
+aline .144145 -.0508
+aline .14478 -.05207
+aline .145415 -.053975
+bezier .118472 -.714746E-01 .832538E-01 -.778868E-01 .05207 -.069215
+bezier .126359E-01 -.551048E-01 .990242E-02 .43497E-02 .04191 .02794
+bezier .620372E-01 .513311E-01 .684382E-01 .822487E-01 .06604 .112395
+aline .066675 .11303
+aline .0889 .11303
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="?" !-------------- Beginning of new char.
+dfont wid=.472224 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .086995 .24638
+bezier .113189 .246128 .14436 .228381 .14478 .198755
+bezier .148068 .180563 .139875 .159566 .123825 .149225
+bezier .983377E-01 .127697 .08579 .944865E-01 .089535 .061595
+aline .0889 .06096
+aline .066675 .06096
+bezier .062414 .993209E-01 .754681E-01 .142132 .107315 .167005
+bezier .127231 .182927 .120759 .221994 .09271 .224155
+bezier .07057 .228743 .453708E-01 .221708 .02794 .206375
+aline .02667 .210185
+aline .026035 .211455
+aline .02413 .21717
+bezier .226437E-01 .222113 .172887E-01 .228953 .024765 .23114
+bezier .432935E-01 .243377 .653669E-01 .247445 .086995 .24638
+closepath
+! end of curve
+
+! start of curve
+amove .092075 .02794
+aline .092075 -.000635
+aline .0635 -.000635
+aline .0635 .02794
+aline .092075 .02794
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="@" !-------------- Beginning of new char.
+dfont wid=.666669 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .14351 .24638
+bezier .17549 .244811 .200789 .21853 .207645 .18796
+bezier .214171 .156893 .217344 .124262 .210185 .09271
+bezier .201133 .576873E-01 .161422 .028682 .126365 .046355
+bezier .681302E-01 .076229 .715878E-01 .17661 .13462 .198755
+bezier .149409 .203036 .165414 .199983 .178647 .192828
+bezier .172068 .219829 .13938 .232082 .114935 .22225
+bezier .592025E-01 .206281 .337991E-01 .138314 .0508 .086995
+bezier .618668E-01 .430779E-01 .107628 .850355E-02 .1524 .01778
+bezier .165347 .187042E-01 .178831 .231608E-01 .191135 .028575
+aline .213995 .028575
+bezier .171735 -.177703E-01 .929303E-01 -.141588E-01 .05334 .033655
+bezier -.152773E-02 .911237E-01 .139325E-01 .19651 .08509 .23368
+bezier .103525 .243383 .123269 .247117 .14351 .24638
+closepath
+! end of curve
+
+! start of curve
+amove .17907 .19304
+aline .178435 .192405
+aline .17907 .19177
+aline .179705 .192405
+aline .17907 .19304
+closepath
+! end of curve
+
+! start of curve
+amove .145415 .17907
+bezier .122101 .174861 .11299 .14806 .11049 .12827
+bezier .109359 .104111 .116343 .726703E-01 .14224 .0635
+bezier .165786 .569082E-01 .183429 .825258E-01 .18669 .103505
+bezier .192385 .129485 .185878 .167496 .156845 .178435
+aline .15367 .17907
+aline .153035 .179705
+aline .14605 .179705
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="A" !-------------- Beginning of new char.
+dfont wid=.66667 hei=.694445 dep=0 italic=0
+dfont fby="C" kadd=-.0277786
+dfont fby="G" kadd=-.0277786
+dfont fby="O" kadd=-.0277786
+dfont fby="Q" kadd=-.0277786
+dfont fby="T" kadd=-.083334
+dfont fby="U" kadd=-.0277786
+dfont fby="V" kadd=-.111112
+dfont fby="W" kadd=-.111112
+dfont fby="Y" kadd=-.083334
+dfont fby="t" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .132715 .24257
+bezier .162667 .161404 .194173 .806126E-01 .22352 -.000635
+aline .192405 -.000635
+bezier .182587 .228438E-01 .174427 .473184E-01 .1651 .07112
+aline .062865 .07112
+bezier .542677E-01 .470804E-01 .449082E-01 .233566E-01 .036195 -.000635
+aline .010795 -.000635
+bezier .401444E-01 .806118E-01 .716472E-01 .161405 .1016 .24257
+closepath
+! end of curve
+
+! start of curve
+amove .113665 .217805
+aline .11303 .21463
+aline .112395 .211455
+aline .11176 .20955
+aline .111125 .20701
+aline .109855 .2032
+aline .10922 .20066
+aline .099695 .172085
+bezier .903003E-01 .144859 .792633E-01 .116536 .070485 .09017
+aline .15748 .09017
+bezier .149112 .116744 .138064 .143912 .128905 .170815
+aline .118745 .201295
+aline .11811 .203835
+aline .11684 .207645
+aline .114935 .215265
+aline .114935 .21844
+aline .1143 .219075
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="B" !-------------- Beginning of new char.
+dfont wid=.66667 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .126365 .24257
+bezier .160893 .240941 .206916 .217843 .20447 .177165
+bezier .200317 .149833 .173157 .133281 .147955 .127
+bezier .180379 .12087 .217431 .967621E-01 .213995 .05969
+bezier .208863 .228847E-01 .169333 .11053E-02 .135255 -.000635
+aline .034925 -.000635
+aline .034925 .24257
+aline .126365 .24257
+closepath
+! end of curve
+
+! start of curve
+amove .0635 .222885
+aline .0635 .13716
+aline .064135 .136525
+aline .11811 .136525
+bezier .143624 .139435 .179968 .154472 .1778 .186055
+bezier .170188 .211986 .139417 .220887 .116205 .22352
+aline .064135 .22352
+aline .0635 .222885
+closepath
+! end of curve
+
+! start of curve
+amove .0635 .114935
+aline .0635 .01905
+aline .064135 .018415
+aline .125095 .018415
+bezier .15133 .205372E-01 .186489 .364501E-01 .18669 .06731
+bezier .182318 .992947E-01 .14532 .114089 .117475 .11557
+aline .064135 .11557
+aline .0635 .114935
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="C" !-------------- Beginning of new char.
+dfont wid=.638891 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .149225 .25019
+bezier .166689 .248638 .185412 .245722 .202565 .238125
+bezier .200849 .228991 .199572 .219469 .197485 .210185
+bezier .166329 .231864 .121429 .237201 .09144 .21082
+bezier .411029E-01 .163342 .419304E-01 .739469E-01 .094615 .028575
+bezier .127268 .379148E-02 .173487 .106805E-01 .20447 .034925
+aline .20447 .031115
+aline .205105 .03048
+aline .205105 .023495
+aline .20574 .02286
+aline .20574 .015875
+aline .206375 .01524
+aline .206375 .01143
+bezier .16095 -.209418E-01 .919715E-01 -.139969E-01 .056515 .03048
+bezier .127592E-02 .925135E-01 .178421E-01 .204946 .09525 .2413
+bezier .112481 .249451 .130546 .250867 .149225 .25019
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="D" !-------------- Beginning of new char.
+dfont wid=.722226 hei=.694445 dep=0 italic=0
+dfont fby="A" kadd=-.0277786
+dfont fby="V" kadd=-.0277786
+dfont fby="W" kadd=-.0277786
+dfont fby="X" kadd=-.0277786
+dfont fby="Y" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .13462 .24257
+bezier .190926 .238127 .231629 .181753 .23368 .12827
+bezier .239063 .711241E-01 .199994 .823325E-02 .140335 0
+aline .135255 0
+aline .13462 -.000635
+aline .034925 -.000635
+aline .034925 .24257
+aline .13462 .24257
+closepath
+! end of curve
+
+! start of curve
+amove .064135 .222885
+aline .064135 .01905
+aline .06477 .018415
+aline .126365 .018415
+bezier .165552 .223204E-01 .196744 .562546E-01 .20193 .09525
+bezier .211496 .1418 .19265 .20541 .140335 .220345
+aline .135255 .221615
+aline .13462 .22225
+aline .131445 .22225
+aline .13081 .222885
+aline .126365 .222885
+aline .12573 .22352
+aline .06477 .22352
+aline .064135 .222885
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="E" !-------------- Beginning of new char.
+dfont wid=.597224 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .189865 .2413
+aline .189865 .219075
+aline .120015 .219075
+aline .11938 .21971
+aline .065405 .21971
+aline .06477 .219075
+aline .06477 .136525
+aline .065405 .13589
+aline .18034 .13589
+aline .18034 .114935
+aline .065405 .114935
+aline .06477 .1143
+aline .06477 .023495
+aline .065405 .02286
+aline .116205 .02286
+aline .11684 .023495
+aline .194945 .023495
+aline .194945 -.000635
+aline .03429 -.000635
+aline .03429 .2413
+aline .189865 .2413
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="F" !-------------- Beginning of new char.
+dfont wid=.569448 hei=.694445 dep=0 italic=0
+dfont fby="A" kadd=-.083334
+dfont fby="C" kadd=-.0277786
+dfont fby="G" kadd=-.0277786
+dfont fby="O" kadd=-.0277786
+dfont fby="Q" kadd=-.0277786
+dfont fby="a" kadd=-.0277786
+dfont fby="e" kadd=-.0277786
+dfont fby="o" kadd=-.0277786
+dfont fby="r" kadd=-.0277786
+dfont fby="u" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .184785 .2413
+aline .184785 .219075
+aline .117475 .219075
+aline .11684 .21971
+aline .065405 .21971
+aline .06477 .219075
+aline .06477 .131445
+aline .065405 .13081
+aline .17018 .13081
+aline .17018 .109855
+aline .065405 .109855
+aline .06477 .10922
+aline .06477 -.000635
+aline .03429 -.000635
+aline .03429 .2413
+aline .184785 .2413
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="G" !-------------- Beginning of new char.
+dfont wid=.666669 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .147955 .25019
+bezier .16761 .248771 .188931 .243631 .20701 .233045
+bezier .205294 .223911 .204017 .214389 .20193 .205105
+bezier .168509 .235523 .110052 .238716 .08128 .200025
+bezier .417548E-01 .150459 .455325E-01 .707872E-01 .094615 .028575
+bezier .120479 .775325E-02 .154411 .115824E-01 .183515 .020955
+aline .183515 .08255
+aline .18288 .083185
+aline .13716 .083185
+aline .13716 .10414
+aline .210185 .10414
+aline .210185 .00889
+bezier .165815 -.132029E-01 .107963 -.179152E-01 .069215 .01778
+bezier .232757E-02 .739898E-01 .108017E-01 .193973 .08763 .23749
+bezier .106288 .248146 .127018 .251237 .147955 .25019
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="H" !-------------- Beginning of new char.
+dfont wid=.708338 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .06477 .24257
+aline .06477 .13716
+aline .065405 .136525
+aline .183515 .136525
+aline .18415 .13716
+aline .18415 .24257
+aline .21463 .24257
+aline .21463 -.000635
+aline .18415 -.000635
+aline .18415 .114935
+aline .183515 .11557
+aline .065405 .11557
+aline .06477 .114935
+aline .06477 -.000635
+aline .03429 -.000635
+aline .03429 .24257
+aline .06477 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="I" !-------------- Beginning of new char.
+dfont wid=.277781 hei=.694445 dep=0 italic=0
+dfont fby="I" kadd=.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .064135 .24257
+aline .064135 -.000635
+aline .033655 -.000635
+aline .033655 .24257
+aline .064135 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="J" !-------------- Beginning of new char.
+dfont wid=.472224 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .13589 .24257
+aline .13589 .04318
+bezier .134831 .164611E-01 .110618 -.802865E-02 .083185 -.00762
+bezier .602531E-01 -.985751E-02 .362363E-01 -.478712E-02 .01524 .00635
+bezier .016842 .146412E-01 .179558E-01 .230075E-01 .019685 .03175
+bezier .404115E-01 .01018 .812444E-01 .342633E-02 .100965 .02921
+aline .103505 .03429
+aline .104775 .0381
+aline .10541 .04064
+aline .106045 .041275
+aline .106045 .04445
+aline .10668 .045085
+aline .10668 .24257
+aline .13589 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="K" !-------------- Beginning of new char.
+dfont wid=.694448 hei=.694445 dep=0 italic=0
+dfont fby="C" kadd=-.0277786
+dfont fby="G" kadd=-.0277786
+dfont fby="O" kadd=-.0277786
+dfont fby="Q" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .064135 .24257
+aline .064135 .11303
+aline .06477 .112395
+aline .081915 .12954
+aline .08255 .13081
+aline .104775 .153035
+aline .10541 .154305
+aline .127635 .17653
+aline .12827 .1778
+aline .150495 .200025
+aline .15113 .201295
+aline .173355 .22352
+aline .17399 .22479
+aline .19177 .24257
+aline .22352 .24257
+aline .201295 .220345
+aline .20066 .219075
+aline .178435 .19685
+aline .1778 .19558
+aline .15494 .17272
+aline .154305 .17145
+aline .13208 .149225
+bezier .128317 .143303 .137595 .137761 .1397 .13208
+bezier .169126 .876925E-01 .198959 .435979E-01 .2286 -.000635
+aline .19685 -.000635
+bezier .167661 .414661E-01 .14007 .849159E-01 .110808 .126841
+aline .109855 .126365
+aline .10922 .12573
+aline .108585 .12446
+aline .08636 .102235
+aline .085725 .100965
+aline .064135 .079375
+aline .064135 -.000635
+aline .034925 -.000635
+aline .034925 .24257
+aline .064135 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="L" !-------------- Beginning of new char.
+dfont wid=.541669 hei=.694445 dep=0 italic=0
+dfont fby="T" kadd=-.083334
+dfont fby="V" kadd=-.111112
+dfont fby="W" kadd=-.111112
+dfont fby="Y" kadd=-.083334
+set path ! start of curve
+newpath
+! start of curve
+amove .06477 .24257
+aline .06477 .02159
+aline .065405 .020955
+aline .11938 .020955
+aline .120015 .02159
+aline .17526 .02159
+aline .17526 -.000635
+aline .03429 -.000635
+aline .03429 .24257
+aline .06477 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="M" !-------------- Beginning of new char.
+dfont wid=.875005 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .075565 .24257
+bezier .101954 .172043 .131299 .102553 .15367 .03048
+bezier .176041 .102554 .205386 .172043 .231775 .24257
+aline .271145 .24257
+aline .271145 -.000635
+aline .244475 -.000635
+aline .244475 .21844
+aline .24384 .219075
+bezier .220876 .147182 .192175 .771736E-01 .1651 .006985
+aline .14097 .006985
+bezier .114166 .770923E-01 .848075E-01 .146786 .0635 .219075
+aline .062865 .21844
+aline .062865 -.000635
+aline .036195 -.000635
+aline .036195 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="N" !-------------- Beginning of new char.
+dfont wid=.708338 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .078105 .24257
+aline .07874 .2413
+aline .11938 .16002
+aline .16002 .07874
+aline .167005 .06477
+aline .16764 .062865
+aline .1778 .042545
+aline .178435 .04064
+aline .18288 .03175
+aline .183515 .029845
+aline .18542 .026035
+aline .186055 .02413
+aline .18669 .02286
+aline .187325 .023495
+aline .187325 .24257
+aline .213995 .24257
+aline .213995 -.000635
+aline .170815 -.000635
+aline .130175 .080645
+aline .089535 .161925
+aline .081915 .177165
+aline .08128 .17907
+aline .07112 .19939
+aline .070485 .201295
+aline .06604 .210185
+aline .065405 .21209
+aline .0635 .2159
+aline .062865 .217805
+aline .06223 .219075
+aline .061595 .21844
+aline .061595 -.000635
+aline .034925 -.000635
+aline .034925 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="O" !-------------- Beginning of new char.
+dfont wid=.736113 hei=.694445 dep=0 italic=0
+dfont fby="A" kadd=-.0277786
+dfont fby="V" kadd=-.0277786
+dfont fby="W" kadd=-.0277786
+dfont fby="X" kadd=-.0277786
+dfont fby="Y" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .136525 .25019
+bezier .195531 .245432 .236412 .184753 .238125 .12954
+bezier .243276 .698095E-01 .205303 .180366E-02 .14224 -.00762
+bezier .879562E-01 -.156923E-01 .381443E-01 .285372E-01 .0254 .08001
+bezier .862263E-02 .139705 .317041E-01 .215412 .092075 .24257
+bezier .1064 .248993 .121169 .250669 .136525 .25019
+closepath
+! end of curve
+
+! start of curve
+amove .122555 .22733
+bezier .779729E-01 .222882 .530177E-01 .175083 .0508 .135255
+bezier .048772 .914469E-01 .631327E-01 .03758 .107315 .018415
+bezier .145285 .195187E-02 .185747 .336288E-01 .197485 .06985
+bezier .214777 .115178 .21186 .170699 .177165 .207645
+bezier .162596 .220849 .142092 .230477 .122555 .22733
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="P" !-------------- Beginning of new char.
+dfont wid=.638891 hei=.694445 dep=0 italic=0
+dfont fby="," kadd=-.083334
+dfont fby="." kadd=-.083334
+dfont fby="A" kadd=-.083334
+dfont fby="a" kadd=-.0277786
+dfont fby="e" kadd=-.0277786
+dfont fby="o" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .130175 .24257
+bezier .168453 .240921 .209859 .206768 .203835 .165735
+bezier .201407 .129875 .166409 .104076 .132715 .100965
+aline .06604 .100965
+aline .065405 .10033
+aline .065405 -.000635
+aline .034925 -.000635
+aline .034925 .24257
+aline .130175 .24257
+closepath
+! end of curve
+
+! start of curve
+amove .064135 .222885
+aline .064135 .121285
+aline .06477 .12065
+aline .12192 .12065
+bezier .147249 .122054 .176267 .140479 .17653 .16891
+bezier .179591 .194133 .157528 .218247 .13208 .221615
+aline .131445 .22225
+aline .12827 .22225
+aline .127635 .222885
+aline .122555 .222885
+aline .12192 .22352
+aline .06477 .22352
+aline .064135 .222885
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="Q" !-------------- Beginning of new char.
+dfont wid=.736113 hei=.694445 dep=.125 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .136525 .25019
+bezier .195531 .245432 .236412 .184753 .238125 .12954
+bezier .240904 .852754E-01 .223452 .376838E-01 .18669 .010795
+bezier .201115 -.729188E-02 .214345 -.262402E-01 .2286 -.04445
+aline .19304 -.04445
+bezier .182969 -.303578E-01 .173265 -.158053E-01 .162878 -.206375E-02
+bezier .111445 -.235335E-01 .518278E-01 .110254E-01 .032385 .06096
+bezier .602663E-02 .120324 .223719E-01 .198917 .07874 .235585
+bezier .096217 .246523 .116352 .251353 .136525 .25019
+closepath
+! end of curve
+
+! start of curve
+amove .122555 .22733
+bezier .761425E-01 .222117 .518588E-01 .17129 .04953 .130175
+bezier .466623E-01 .856446E-01 .649074E-01 .030673 .112395 .01651
+bezier .124409 .126066E-01 .13738 .130977E-01 .149225 .01778
+bezier .137514 .342403E-01 .125922 .507855E-01 .1143 .06731
+aline .14478 .06731
+bezier .153806 .549791E-01 .162964 .425486E-01 .172403 .306388E-01
+bezier .209577 .630387E-01 .216014 .118709 .202565 .163195
+bezier .19319 .198446 .160591 .232161 .122555 .22733
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="R" !-------------- Beginning of new char.
+dfont wid=.645836 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .127 .24257
+bezier .163997 .241168 .209716 .214323 .206375 .172085
+bezier .202561 .142028 .174912 .120691 .146685 .113665
+bezier .170342 .758346E-01 .193104 .373582E-01 .216535 -.000635
+aline .186055 -.000635
+bezier .163628 .361083E-01 .141962 .734008E-01 .120015 .11049
+aline .06477 .11049
+aline .064135 .109855
+aline .064135 -.000635
+aline .034925 -.000635
+aline .034925 .24257
+aline .127 .24257
+closepath
+! end of curve
+
+! start of curve
+amove .064135 .222885
+aline .064135 .13208
+aline .06477 .131445
+aline .12319 .131445
+bezier .146782 .133093 .177112 .147014 .178435 .174625
+bezier .181182 .199084 .156999 .218977 .13335 .221615
+aline .132715 .22225
+aline .12954 .22225
+aline .128905 .222885
+aline .123825 .222885
+aline .12319 .22352
+aline .06477 .22352
+aline .064135 .222885
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="S" !-------------- Beginning of new char.
+dfont wid=.555557 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .10795 .25019
+bezier .126303 .248965 .146109 .243347 .16256 .233045
+bezier .160844 .223911 .159567 .214389 .15748 .205105
+bezier .130338 .231343 .788953E-01 .239539 .053975 .206375
+bezier .379728E-01 .183716 .547886E-01 .151887 .080645 .14605
+aline .118745 .136525
+bezier .163017 .125865 .190082 .709267E-01 .165735 .031115
+bezier .149138 -.914498E-03 .108537 -.014401 .075565 -.00635
+bezier .548566E-01 -.434423E-02 .339202E-01 .431138E-02 .01651 .015875
+bezier .182258E-01 .250085E-01 .195027E-01 .345308E-01 .02159 .043815
+bezier .497519E-01 .020561 .918996E-01 .489543E-02 .12573 .023495
+bezier .152998 .395159E-01 .154242 .814919E-01 .127635 .09906
+aline .126365 .099695
+aline .12573 .10033
+aline .11811 .10414
+aline .116205 .104775
+aline .114935 .10541
+aline .11303 .106045
+aline .07493 .11557
+bezier .367517E-01 .124507 .826344E-02 .167554 .024765 .205105
+bezier .382157E-01 .237323 .746482E-01 .253611 .10795 .25019
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="T" !-------------- Beginning of new char.
+dfont wid=.680557 hei=.694445 dep=0 italic=0
+dfont fby="A" kadd=-.083334
+dfont fby="a" kadd=-.083334
+dfont fby="e" kadd=-.083334
+dfont fby="o" kadd=-.083334
+dfont fby="r" kadd=-.083334
+dfont fby="u" kadd=-.083334
+dfont fby="y" kadd=-.083334
+set path ! start of curve
+newpath
+! start of curve
+amove .22606 .240665
+aline .22606 .21844
+aline .173355 .21844
+aline .17272 .219075
+aline .13589 .219075
+aline .135255 .21844
+aline .135255 -.000635
+aline .104775 -.000635
+aline .104775 .21844
+aline .10414 .219075
+aline .066675 .219075
+aline .06604 .21844
+aline .013335 .21844
+aline .013335 .240665
+aline .22606 .240665
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="U" !-------------- Beginning of new char.
+dfont wid=.687505 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .06477 .24257
+aline .06477 .07239
+bezier .662729E-01 .044911 .851881E-01 .137218E-01 .11557 .01143
+bezier .145609 .664106E-02 .175136 .319097E-01 .17907 .06223
+aline .179705 .062865
+aline .179705 .06604
+aline .18034 .066675
+aline .18034 .071755
+aline .180975 .07239
+aline .180975 .24257
+aline .207645 .24257
+aline .207645 .073025
+bezier .205481 .271924E-01 .160502 -.014398 .1143 -.00762
+bezier .724789E-01 -.597526E-02 .371341E-01 .318871E-01 .03429 .073025
+aline .03429 .24257
+aline .06477 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="V" !-------------- Beginning of new char.
+dfont wid=.66667 hei=.694445 dep=0 italic=.0138884
+dfont fby="A" kadd=-.083334
+dfont fby="C" kadd=-.0277786
+dfont fby="G" kadd=-.0277786
+dfont fby="O" kadd=-.0277786
+dfont fby="Q" kadd=-.0277786
+dfont fby="a" kadd=-.0277786
+dfont fby="e" kadd=-.0277786
+dfont fby="o" kadd=-.0277786
+dfont fby="r" kadd=-.0277786
+dfont fby="u" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .037465 .24257
+bezier .656841E-01 .169682 .962271E-01 .972894E-01 .120015 .02286
+bezier .142462 .973684E-01 .174219 .169623 .20193 .24257
+aline .2286 .24257
+bezier .197013 .161471 .165415 .799679E-01 .132715 -.000635
+aline .1016 -.000635
+bezier .689004E-01 .799679E-01 .373022E-01 .161471 .005715 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="W" !-------------- Beginning of new char.
+dfont wid=.944448 hei=.694445 dep=0 italic=.0138884
+dfont fby="A" kadd=-.083334
+dfont fby="C" kadd=-.0277786
+dfont fby="G" kadd=-.0277786
+dfont fby="O" kadd=-.0277786
+dfont fby="Q" kadd=-.0277786
+dfont fby="a" kadd=-.0277786
+dfont fby="e" kadd=-.0277786
+dfont fby="o" kadd=-.0277786
+dfont fby="r" kadd=-.0277786
+dfont fby="u" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .034925 .24257
+bezier .055765 .172168 .078015 .100936 .093345 .02921
+aline .093345 .023495
+aline .09398 .02286
+aline .094615 .024765
+aline .09525 .0254
+aline .09525 .029845
+aline .095885 .03048
+aline .095885 .033655
+aline .09779 .04318
+aline .098425 .04572
+aline .09906 .048895
+aline .10668 .079375
+bezier .121654 .133936 .136687 .188785 .15367 .24257
+aline .18161 .24257
+bezier .202818 .169854 .226348 .963938E-01 .241935 .02286
+bezier .257244 .963818E-01 .280843 .170115 .30226 .24257
+aline .32639 .24257
+bezier .303288 .161429 .279055 .803932E-01 .25527 -.000635
+aline .225425 -.000635
+bezier .204742 .722718E-01 .180761 .14555 .1651 .219075
+bezier .149172 .145179 .125218 .072417 .104775 -.000635
+aline .076835 -.000635
+bezier .530613E-01 .803966E-01 .288102E-01 .161427 .005715 .24257
+aline .034925 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="X" !-------------- Beginning of new char.
+dfont wid=.66667 hei=.694445 dep=0 italic=0
+dfont fby="C" kadd=-.0277786
+dfont fby="G" kadd=-.0277786
+dfont fby="O" kadd=-.0277786
+dfont fby="Q" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .046355 .24257
+bezier .693915E-01 .212391 .913799E-01 .181101 .114618 .151289
+bezier .137257 .181076 .158558 .212402 .180975 .24257
+aline .213995 .24257
+bezier .186471 .204051 .155764 .165389 .130175 .127
+bezier .162754 .842895E-01 .195868 .419651E-01 .2286 -.000635
+aline .19304 -.000635
+bezier .166145 .343545E-01 .141178 .725352E-01 .114088 .106257
+bezier .890498E-01 .705692E-01 .639951E-01 .348929E-01 .038735 -.000635
+aline .005715 -.000635
+bezier .036383 .423513E-01 .703237E-01 .854167E-01 .09906 .12827
+bezier .698863E-01 .166549 .398865E-01 .204232 .010795 .24257
+aline .046355 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="Y" !-------------- Beginning of new char.
+dfont wid=.66667 hei=.694445 dep=0 italic=.0249996
+dfont fby="A" kadd=-.083334
+dfont fby="a" kadd=-.083334
+dfont fby="e" kadd=-.083334
+dfont fby="o" kadd=-.083334
+dfont fby="r" kadd=-.083334
+dfont fby="u" kadd=-.083334
+set path ! start of curve
+newpath
+! start of curve
+amove .037465 .24257
+bezier .657434E-01 .202479 .935389E-01 .16204 .120015 .12065
+bezier .146134 .162297 .174525 .202307 .202565 .24257
+aline .23241 .24257
+bezier .19903 .193688 .165413 .144977 .131445 .09652
+aline .131445 -.000635
+aline .102235 -.000635
+aline .102235 .09652
+bezier .687134E-01 .145147 .351462E-01 .193741 .001905 .24257
+aline .037465 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="Z" !-------------- Beginning of new char.
+dfont wid=.611113 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .19431 .24257
+aline .19431 .2286
+bezier .149858 .159462 .102938 .902746E-01 .060325 .020955
+aline .11684 .020955
+aline .117475 .02159
+aline .196215 .02159
+aline .196215 -.000635
+aline .02032 -.000635
+bezier .196389E-01 .829923E-02 .199378E-01 .169982E-01 .02667 .023495
+bezier .068869 .898444E-01 .114026 .1565 .15494 .22225
+aline .100965 .22225
+aline .10033 .221615
+aline .024765 .221615
+aline .024765 .24257
+aline .19431 .24257
+aline .19431 .2286
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="[" !-------------- Beginning of new char.
+dfont wid=.28889 hei=.75 dep=.25 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .093345 .262255
+aline .093345 .2413
+aline .061595 .2413
+aline .06096 .240665
+aline .06096 -.066675
+aline .061595 -.06731
+aline .093345 -.06731
+aline .093345 -.088265
+aline .036195 -.088265
+aline .036195 .262255
+aline .093345 .262255
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="\" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .095885 .24257
+bezier .929585E-01 .228046 .891381E-01 .212994 .086995 .198755
+aline .09525 .198755
+aline .09525 .17018
+aline .066675 .17018
+aline .066675 .19939
+aline .07112 .212725
+aline .071755 .213995
+aline .080645 .240665
+aline .08128 .24257
+closepath
+! end of curve
+
+! start of curve
+amove .164465 .24257
+bezier .161539 .228046 .157718 .212995 .155575 .198755
+aline .16383 .198755
+aline .16383 .17018
+aline .135255 .17018
+aline .135255 .19939
+aline .1397 .212725
+aline .140335 .213995
+aline .149225 .240665
+aline .14986 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="]" !-------------- Beginning of new char.
+dfont wid=.28889 hei=.75 dep=.25 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .065405 .262255
+aline .065405 -.088265
+aline .008255 -.088265
+aline .008255 -.06731
+aline .040005 -.06731
+aline .04064 -.066675
+aline .04064 .240665
+aline .040005 .2413
+aline .008255 .2413
+aline .008255 .262255
+aline .065405 .262255
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="^" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .098425 .24257
+bezier .114985 .223344 .13149 .204079 .147955 .184785
+aline .127 .184785
+bezier .113817 .198751 .101586 .213755 .879475E-01 .227171
+bezier .743089E-01 .213755 .620777E-01 .198751 .048895 .184785
+aline .02794 .184785
+bezier .444053E-01 .204079 .609104E-01 .223344 .07747 .24257
+aline .098425 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="_" !-------------- Beginning of new char.
+dfont wid=.277779 hei=.679365 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .064135 .238125
+aline .064135 .207645
+aline .033655 .207645
+aline .033655 .238125
+aline .064135 .238125
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="`" !-------------- Beginning of new char.
+dfont wid=.277779 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .064135 .24257
+bezier .612085E-01 .228046 .573881E-01 .212994 .055245 .198755
+aline .0635 .198755
+aline .0635 .17018
+aline .034925 .17018
+aline .034925 .19939
+aline .03937 .212725
+aline .040005 .213995
+aline .048895 .240665
+aline .04953 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="a" !-------------- Beginning of new char.
+dfont wid=.480557 hei=.444445 dep=0 italic=0
+dfont fby="r" kadd=-.0277786
+dfont fby="w" kadd=-.0277786
+dfont fby="y" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .089535 .160655
+bezier .11579 .158277 .138093 .134604 .140335 .108585
+aline .140335 -.000635
+aline .114935 -.000635
+aline .114935 .01143
+bezier .100807 .300125E-02 .815364E-01 -.421204E-02 .064135 -.00381
+bezier .403602E-01 -.104768E-01 .017613 .111864E-01 .01651 .03429
+bezier .134403E-01 .630489E-01 .453129E-01 .758648E-01 .06858 .080645
+bezier .836666E-01 .839332E-01 .986292E-01 .083869 .113665 .085725
+bezier .114941 .104772 .113537 .1277 .094615 .137795
+bezier .725153E-01 .14494 .482712E-01 .135856 .029845 .122555
+aline .029845 .126365
+aline .02921 .127
+aline .02921 .133985
+aline .028575 .13462
+aline .028575 .141605
+aline .02794 .14224
+aline .02794 .145415
+bezier .046256 .157521 .681309E-01 .161729 .089535 .160655
+closepath
+! end of curve
+
+! start of curve
+amove .112395 .06731
+bezier .906658E-01 .673139E-01 .685689E-01 .644861E-01 .048895 .05334
+bezier .347784E-01 .440691E-01 .426431E-01 .234258E-01 .05715 .019685
+bezier .752705E-01 .132081E-01 .100486 .159932E-01 .11176 .033655
+aline .112395 .03556
+aline .11303 .0381
+aline .113665 .038735
+aline .113665 .06731
+aline .11303 .067945
+aline .112395 .06731
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="b" !-------------- Beginning of new char.
+dfont wid=.516668 hei=.694445 dep=0 italic=0
+dfont fby="c" kadd=.0277786
+dfont fby="d" kadd=.0277786
+dfont fby="e" kadd=.0277786
+dfont fby="o" kadd=.0277786
+dfont fby="q" kadd=.0277786
+dfont fby="r" kadd=-.0277786
+dfont fby="w" kadd=-.0277786
+dfont fby="x" kadd=-.0277786
+dfont fby="y" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .05461 .24257
+aline .05461 .13843
+bezier .762933E-01 .154553 .111552 .168367 .13716 .150495
+bezier .169604 .124048 .175183 .076562 .16129 .03937
+bezier .150156 .102085E-01 .118288 -.012179 .086995 -.00254
+bezier .750193E-01 .689666E-04 .642434E-01 .904559E-02 .05588 .01524
+aline .05588 -.000635
+aline .02921 -.000635
+aline .02921 .24257
+aline .05461 .24257
+closepath
+! end of curve
+
+! start of curve
+amove .088265 .13716
+bezier .752637E-01 .135905 .632219E-01 .12761 .05588 .11684
+aline .05588 .03937
+bezier .648283E-01 .195728E-01 .894259E-01 .107259E-01 .108585 .02032
+bezier .140018 .323768E-01 .146828 .727798E-01 .13843 .100965
+bezier .13358 .123489 .110663 .141126 .088265 .13716
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="c" !-------------- Beginning of new char.
+dfont wid=.444446 hei=.444445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .099695 .160655
+bezier .114671 .159601 .133187 .154592 .144145 .144145
+bezier .142252 .137552 .14225 .129111 .1397 .12319
+bezier .114072 .141264 .729996E-01 .147665 .05207 .11938
+bezier .322653E-01 .895072E-01 .354832E-01 .409205E-01 .069215 .022225
+bezier .939589E-01 .116804E-01 .122672 .211887E-01 .144145 .036195
+aline .144145 .03302
+aline .14478 .032385
+bezier .142915 .247479E-01 .15051 .142902E-01 .141605 .01016
+bezier .106762 -.122612E-01 .545171E-01 -.104976E-01 .029845 .026035
+bezier -.569689E-02 .707145E-01 .180467E-01 .149493 .076835 .16002
+aline .08128 .16002
+aline .081915 .160655
+aline .099695 .160655
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="d" !-------------- Beginning of new char.
+dfont wid=.516668 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .1524 .24257
+aline .1524 -.000635
+aline .12573 -.000635
+aline .12573 .017145
+bezier .105958 -.115131E-02 .697587E-01 -.145317E-01 .045085 .00508
+bezier .358659E-02 .381183E-01 .256881E-02 .108154 .040005 .14478
+bezier .643332E-01 .167541 .103433 .160338 .126365 .139065
+aline .127 .1397
+aline .127 .24257
+aline .1524 .24257
+closepath
+! end of curve
+
+! start of curve
+amove .085725 .13716
+bezier .590304E-01 .135626 .412649E-01 .108726 .040005 .084455
+bezier .377014E-01 .576475E-01 .485374E-01 .023505 .07874 .01778
+bezier .970592E-01 .122082E-01 .117611 .246829E-01 .12573 .04191
+aline .12573 .11811
+bezier .117477 .13122 .100955 .140341 .085725 .13716
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="e" !-------------- Beginning of new char.
+dfont wid=.444446 hei=.444445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .0889 .160655
+bezier .121675 .158884 .143691 .126039 .144145 .09525
+aline .14478 .094615
+aline .14478 .08763
+aline .145415 .086995
+aline .145415 .0762
+aline .03683 .0762
+bezier .351939E-01 .459068E-01 .627239E-01 .111911E-01 .09525 .017145
+bezier .11187 .180133E-01 .129056 .256572E-01 .14224 .036195
+aline .14224 .03302
+aline .142875 .032385
+aline .142875 .0254
+aline .14351 .024765
+aline .14351 .01778
+aline .144145 .017145
+aline .144145 .01397
+bezier .11084 -.122648E-01 .056212 -.118422E-01 .03048 .024765
+bezier -.522253E-02 .681382E-01 .140515E-01 .147676 .07239 .16002
+aline .076835 .16002
+aline .07747 .160655
+aline .0889 .160655
+closepath
+! end of curve
+
+! start of curve
+amove .078105 .139065
+bezier .567835E-01 .136454 .418881E-01 .114504 .038735 .09525
+aline .12573 .09525
+bezier .124858 .115135 .109264 .13754 .08763 .1397
+aline .07874 .1397
+aline .078105 .139065
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="f" !-------------- Beginning of new char.
+dfont wid=.305557 hei=.694445 dep=0 italic=.0694447
+dfont fby=33 kadd=.0694447
+dfont fby=39 kadd=.0694447
+dfont fby=")" kadd=.0694447
+dfont fby="?" kadd=.0694447
+dfont fby="]" kadd=.0694447
+dfont fby="f" ligrep=11
+dfont fby="i" ligrep=12
+dfont fby="l" ligrep=13
+set path ! start of curve
+newpath
+! start of curve
+amove .100965 .24638
+aline .1016 .245745
+aline .107315 .245745
+aline .10795 .24511
+aline .111125 .24511
+aline .117475 .24384
+aline .120015 .243205
+aline .121285 .24257
+aline .121285 .21971
+bezier .102102 .227653 .739709E-01 .230008 .06223 .208915
+aline .061595 .20701
+aline .06096 .20447
+aline .060325 .203835
+aline .060325 .155575
+aline .06096 .15494
+aline .10033 .15494
+aline .10033 .135255
+aline .06223 .135255
+aline .061595 .13462
+aline .061595 -.000635
+aline .036195 -.000635
+aline .036195 .13462
+aline .03556 .135255
+aline .009525 .135255
+aline .009525 .15494
+aline .03556 .15494
+aline .036195 .155575
+aline .036195 .19431
+bezier .386566E-01 .225575 .695211E-01 .25121 .100965 .24638
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="g" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.444445 dep=.194445 italic=.0138884
+dfont fby="j" kadd=.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .08382 .15875
+bezier .935703E-01 .158177 .104215 .151933 .11176 .147955
+bezier .129423 .155429 .147873 .158764 .16637 .15875
+bezier .16786 .151273 .168789 .144293 .17018 .13716
+aline .16637 .13716
+aline .165735 .137795
+aline .133985 .137795
+aline .13335 .13716
+aline .126365 .13716
+aline .12573 .136525
+aline .122908 .135961
+bezier .145186 .105774 .130447 .561429E-01 .09271 .046355
+bezier .772607E-01 .419987E-01 .599586E-01 .448367E-01 .466725E-01 .544513E-01
+bezier .038155 .447775E-01 .426229E-01 .260454E-01 .05588 .02286
+aline .10287 .02286
+bezier .12771 .225114E-01 .160824 .123447E-01 .1651 -.017145
+bezier .171436 -.444691E-01 .143519 -.639745E-01 .120015 -.06985
+bezier .844154E-01 -.780479E-01 .385868E-01 -.751325E-01 .014605 -.042545
+bezier .269578E-02 -.233158E-01 .015639 .933324E-03 .328613E-01 .111125E-01
+bezier .202179E-01 .027215 .222341E-01 .503774E-01 .341313E-01 .663575E-01
+bezier .899956E-02 .981648E-01 .276871E-01 .151478 .06858 .158115
+aline .071755 .158115
+aline .07239 .15875
+aline .08382 .15875
+closepath
+! end of curve
+
+! start of curve
+amove .073025 .13843
+bezier .441557E-01 .134028 .394158E-01 .947851E-01 .05461 .07493
+bezier .700054E-01 .549471E-01 .106605 .647391E-01 .108585 .090805
+bezier .11385 .109645 .105039 .136117 .08255 .139065
+aline .07366 .139065
+closepath
+! end of curve
+
+! start of curve
+amove .05461 -.001905
+bezier .345134E-01 -.358596E-02 .251361E-01 -.341235E-01 .045085 -.04318
+bezier .072586 -.583926E-01 .107168 -.580126E-01 .133985 -.041275
+bezier .148368 -.319347E-01 .141689 -.102432E-01 .126365 -.00635
+aline .12065 -.004445
+aline .1143 -.003175
+aline .113665 -.00254
+aline .11049 -.00254
+aline .109855 -.001905
+aline .103505 -.001905
+aline .10287 -.00127
+aline .055245 -.00127
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="h" !-------------- Beginning of new char.
+dfont wid=.516668 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .053975 .24257
+aline .053975 .13335
+bezier .064111 .144875 .809129E-01 .157815 .098425 .15875
+bezier .120187 .161472 .145518 .151187 .150495 .127635
+aline .151765 .122555
+aline .151765 .118745
+aline .1524 .11811
+aline .1524 .11303
+aline .153035 .112395
+aline .153035 -.000635
+aline .126365 -.000635
+aline .126365 .10922
+bezier .124954 .121811 .116542 .135346 .102235 .136525
+bezier .853275E-01 .14234 .653512E-01 .131394 .060325 .113665
+aline .05842 .10795
+aline .05715 .10287
+aline .056515 .102235
+aline .056515 .09906
+aline .05588 .098425
+aline .05588 .09398
+aline .055245 .093345
+aline .055245 -.000635
+aline .028575 -.000635
+aline .028575 .24257
+aline .053975 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="i" !-------------- Beginning of new char.
+dfont wid=.23889 hei=.679365 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .05715 .238125
+aline .05715 .207645
+aline .02667 .207645
+aline .02667 .238125
+aline .05715 .238125
+closepath
+! end of curve
+
+! start of curve
+amove .05461 .15494
+aline .05461 -.000635
+aline .02921 -.000635
+aline .02921 .15494
+aline .05461 .15494
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="j" !-------------- Beginning of new char.
+dfont wid=.266668 hei=.679365 dep=.194445 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .06477 .238125
+aline .06477 .207645
+aline .03429 .207645
+aline .03429 .238125
+aline .06477 .238125
+closepath
+! end of curve
+
+! start of curve
+amove .06477 .15494
+aline .06477 -.029845
+bezier .630814E-01 -.539303E-01 .399697E-01 -.780971E-01 .014605 -.07239
+bezier .199479E-02 -.724025E-01 -.104328E-01 -.674112E-01 -.020955 -.06096
+aline -.020955 -.05969
+aline -.01651 -.04191
+aline -.015875 -.040005
+bezier -.105706E-02 -.547177E-01 .288914E-01 -.564762E-01 .0381 -.034925
+aline .038735 -.032385
+aline .03937 -.03175
+aline .03937 .15494
+aline .06477 .15494
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="k" !-------------- Beginning of new char.
+dfont wid=.488892 hei=.694445 dep=0 italic=0
+dfont fby="a" kadd=-.0277786
+dfont fby="c" kadd=-.0277786
+dfont fby="e" kadd=-.0277786
+dfont fby="o" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .053975 .24257
+aline .053975 .081915
+aline .05461 .08128
+aline .05842 .08509
+aline .059055 .08636
+aline .09144 .118745
+aline .092075 .120015
+aline .125095 .153035
+aline .12573 .154305
+aline .126365 .15494
+aline .15748 .15494
+aline .12446 .12192
+aline .123825 .12065
+aline .09906 .095885
+bezier .116653 .656576E-01 .140444 .369272E-01 .16002 .006985
+aline .16129 .005715
+aline .161925 .004445
+aline .16256 .00381
+aline .163195 .00254
+aline .164465 .00127
+aline .1651 0
+aline .165735 -.000635
+aline .13843 -.000635
+bezier .119167 .251324E-01 .101501 .524043E-01 .822325E-01 .779463E-01
+aline .08128 .07747
+aline .057785 .053975
+aline .05715 .052705
+aline .05334 .048895
+aline .05334 -.000635
+aline .029845 -.000635
+aline .029845 .24257
+aline .053975 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="l" !-------------- Beginning of new char.
+dfont wid=.23889 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .05461 .24257
+aline .05461 -.000635
+aline .02921 -.000635
+aline .02921 .24257
+aline .05461 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="m" !-------------- Beginning of new char.
+dfont wid=.794447 hei=.444445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .111125 .15875
+bezier .128141 .158088 .145462 .14695 .14986 .12954
+bezier .167813 .159607 .215674 .170848 .240665 .14351
+bezier .247652 .134653 .249575 .122655 .250825 .112395
+aline .250825 -.000635
+aline .224155 -.000635
+aline .224155 .10922
+bezier .222744 .121811 .214332 .135346 .200025 .136525
+bezier .183118 .14234 .163141 .131394 .158115 .113665
+aline .15621 .10795
+aline .15494 .10287
+aline .154305 .102235
+aline .154305 .09906
+aline .15367 .098425
+aline .15367 .09398
+aline .153035 .093345
+aline .153035 -.000635
+aline .126365 -.000635
+aline .126365 .10922
+bezier .124954 .121811 .116542 .135346 .102235 .136525
+bezier .853275E-01 .14234 .653512E-01 .131394 .060325 .113665
+aline .05842 .10795
+aline .05715 .10287
+aline .056515 .102235
+aline .056515 .09906
+aline .05588 .098425
+aline .05588 .09398
+aline .055245 .093345
+aline .055245 -.000635
+aline .028575 -.000635
+aline .028575 .156845
+aline .05334 .156845
+aline .05334 .132715
+bezier .637491E-01 .143805 .796063E-01 .158246 .09779 .158115
+aline .098425 .15875
+aline .111125 .15875
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="n" !-------------- Beginning of new char.
+dfont wid=.516668 hei=.444445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .111125 .15875
+bezier .134883 .158878 .154005 .136253 .1524 .11303
+aline .153035 .112395
+aline .153035 -.000635
+aline .126365 -.000635
+aline .126365 .10922
+bezier .124954 .121811 .116542 .135346 .102235 .136525
+bezier .853275E-01 .14234 .653512E-01 .131394 .060325 .113665
+aline .05842 .10795
+aline .05715 .10287
+aline .056515 .102235
+aline .056515 .09906
+aline .05588 .098425
+aline .05588 .09398
+aline .055245 .093345
+aline .055245 -.000635
+aline .028575 -.000635
+aline .028575 .156845
+aline .05334 .156845
+aline .05334 .132715
+bezier .637491E-01 .143805 .796063E-01 .158246 .09779 .158115
+aline .098425 .15875
+aline .111125 .15875
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="o" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.444445 dep=0 italic=0
+dfont fby="c" kadd=.0277786
+dfont fby="d" kadd=.0277786
+dfont fby="e" kadd=.0277786
+dfont fby="o" kadd=.0277786
+dfont fby="q" kadd=.0277786
+dfont fby="r" kadd=-.0277786
+dfont fby="w" kadd=-.0277786
+dfont fby="x" kadd=-.0277786
+dfont fby="y" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .09398 .160655
+bezier .144631 .156471 .175917 .098221 .16129 .05207
+bezier .149417 .583805E-02 .914237E-01 -.204369E-01 .0508 .005715
+bezier -.312694E-02 .350969E-01 -.538582E-03 .122434 .052705 .15113
+aline .05334 .151765
+aline .05969 .15494
+aline .061595 .155575
+aline .062865 .15621
+aline .06858 .158115
+aline .07366 .159385
+aline .076835 .16002
+aline .08128 .16002
+aline .081915 .160655
+aline .09398 .160655
+closepath
+! end of curve
+
+! start of curve
+amove .081915 .139065
+bezier .500845E-01 .136211 .338456E-01 .997072E-01 .038735 .071755
+bezier .383398E-01 .432329E-01 .640103E-01 .127718E-01 .09398 .018415
+bezier .130327 .226493E-01 .143682 .671195E-01 .13589 .097155
+bezier .132443 .122631 .106994 .1437 .081915 .139065
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="p" !-------------- Beginning of new char.
+dfont wid=.516668 hei=.444445 dep=.194445 italic=0
+dfont fby="c" kadd=.0277786
+dfont fby="d" kadd=.0277786
+dfont fby="e" kadd=.0277786
+dfont fby="o" kadd=.0277786
+dfont fby="q" kadd=.0277786
+dfont fby="r" kadd=-.0277786
+dfont fby="w" kadd=-.0277786
+dfont fby="x" kadd=-.0277786
+dfont fby="y" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .118745 .15875
+bezier .151501 .152263 .166455 .115163 .168275 .085725
+bezier .171549 .488893E-01 .152526 .462753E-02 .11303 -.00381
+bezier .928666E-01 -.71533E-02 .706092E-01 .475479E-03 .056515 .015875
+aline .05588 .01524
+aline .05588 -.069215
+aline .02921 -.069215
+aline .02921 .15494
+aline .05461 .15494
+aline .05461 .137795
+bezier .681656E-01 .148501 .883748E-01 .157748 .10668 .15875
+closepath
+! end of curve
+
+! start of curve
+amove .088265 .13589
+bezier .753627E-01 .134708 .629262E-01 .126547 .05588 .11557
+aline .05588 .03937
+bezier .644127E-01 .020749 .874434E-01 .108378E-01 .106045 .019685
+bezier .153495 .386076E-01 .153619 .117802 .104775 .13462
+aline .102235 .135255
+aline .09906 .13589
+aline .098425 .136525
+aline .0889 .136525
+aline .088265 .13589
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="q" !-------------- Beginning of new char.
+dfont wid=.516668 hei=.444445 dep=.194445 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .08382 .15875
+bezier .100292 .157119 .116132 .147729 .126365 .13462
+aline .127 .135255
+aline .127 .15875
+aline .1524 .15875
+aline .1524 -.069215
+aline .12573 -.069215
+aline .12573 .01651
+bezier .113513 .704597E-02 .961532E-01 -.42206E-02 .07874 -.00381
+bezier .428888E-01 -.960461E-02 .167805E-01 .294009E-01 .014605 .061595
+bezier .678101E-02 .100645 .285759E-01 .15266 .07239 .15875
+aline .08382 .15875
+closepath
+! end of curve
+
+! start of curve
+amove .08636 .13589
+bezier .469838E-01 .131178 .298868E-01 .813422E-01 .04572 .048895
+bezier .543559E-01 .209107E-01 .928305E-01 .477142E-02 .114935 .027305
+bezier .120398 .310054E-01 .123253 .373161E-01 .127 .042545
+aline .127 .10287
+bezier .122176 .120993 .10776 .139404 .086995 .136525
+aline .08636 .13589
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="r" !-------------- Beginning of new char.
+dfont wid=.341669 hei=.444445 dep=0 italic=.0138884
+set path ! start of curve
+newpath
+! start of curve
+amove .1143 .15875
+aline .1143 .13589
+bezier .845307E-01 .136598 .576309E-01 .111189 .05461 .081915
+aline .05461 -.000635
+aline .02921 -.000635
+aline .02921 .156845
+aline .052705 .156845
+aline .052705 .12573
+bezier .061398 .134705 .724409E-01 .148281 .08636 .153035
+aline .0889 .154305
+aline .094615 .15621
+aline .099695 .15748
+aline .10287 .158115
+aline .107315 .158115
+aline .10795 .15875
+aline .1143 .15875
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="s" !-------------- Beginning of new char.
+dfont wid=.383334 hei=.444445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .079375 .160655
+bezier .923483E-01 .158858 .109634 .157285 .120015 .14859
+bezier .118122 .141997 .11812 .133556 .11557 .127635
+bezier .093873 .139283 .674904E-01 .14613 .04445 .135255
+bezier .029426 .124326 .370184E-01 .100652 .05461 .09779
+bezier .787777E-01 .929192E-01 .107371 .896675E-01 .12065 .06604
+bezier .136151 .399171E-01 .12007 .243984E-02 .089535 -.00254
+bezier .062691 -.758441E-02 .341157E-01 -.287804E-02 .01016 .01143
+bezier .118079E-01 .187289E-01 .123136E-01 .027607 .014605 .03429
+bezier .381913E-01 .195711E-01 .702464E-01 .899558E-02 .09525 .024765
+bezier .108481 .371465E-01 .101139 .595808E-01 .08382 .0635
+bezier .602502E-01 .069237 .317165E-01 .710964E-01 .01778 .09398
+bezier .532846E-03 .121105 .226622E-01 .159585 .05461 .159385
+aline .055245 .16002
+aline .060325 .16002
+aline .06096 .160655
+aline .079375 .160655
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="t" !-------------- Beginning of new char.
+dfont wid=.361112 hei=.571431 dep=0 italic=0
+dfont fby="w" kadd=-.0277786
+dfont fby="y" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .061595 .19939
+aline .061595 .155575
+aline .06223 .15494
+aline .11049 .15494
+aline .11049 .135255
+aline .06223 .135255
+aline .061595 .13462
+aline .061595 .03937
+bezier .630282E-01 .031163 .066012 .203501E-01 .075565 .01778
+bezier .880106E-01 .170962E-01 .100521 .214402E-01 .11049 .02921
+aline .111125 .02794
+aline .11176 .0254
+aline .112395 .023495
+aline .11303 .020955
+aline .113665 .01905
+aline .114935 .01397
+bezier .119297 .592747E-02 .106499 .525877E-02 .1016 .001905
+bezier .085439 -.27588E-02 .682472E-01 -.823477E-02 .05207 -.00127
+bezier .407011E-01 .611233E-02 .037995 .210814E-01 .03683 .03302
+aline .03683 .13462
+aline .036195 .135255
+aline .006985 .135255
+aline .006985 .15494
+aline .037465 .15494
+aline .0381 .155575
+aline .0381 .19939
+aline .061595 .19939
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="u" !-------------- Beginning of new char.
+dfont wid=.516668 hei=.444445 dep=0 italic=0
+dfont fby="w" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .055245 .15494
+aline .055245 .03175
+bezier .055539 .212853E-01 .662395E-01 .152123E-01 .075565 .014605
+bezier .972287E-01 .011552 .122592 .228648E-01 .126365 .046355
+aline .126365 .15494
+aline .153035 .15494
+aline .153035 -.000635
+aline .127635 -.000635
+aline .127635 .015875
+bezier .106647 -.641191E-04 .762678E-01 -.870561E-02 .04953 -.00254
+bezier .360618E-01 .163608E-02 .291961E-01 .163136E-01 .028575 .02921
+aline .028575 .15494
+aline .055245 .15494
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="v" !-------------- Beginning of new char.
+dfont wid=.461113 hei=.444445 dep=0 italic=.0138884
+set path ! start of curve
+newpath
+! start of curve
+amove .03175 .15494
+bezier .492524E-01 .109469 .068985 .635668E-01 .08128 .01651
+bezier .943201E-01 .638108E-01 .11384 .10902 .13081 .15494
+aline .15621 .15494
+bezier .136493 .103045 .116599 .508128E-01 .095885 -.000635
+aline .06604 -.000635
+bezier .453265E-01 .508128E-01 .254324E-01 .103045 .005715 .15494
+aline .03175 .15494
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="w" !-------------- Beginning of new char.
+dfont wid=.683336 hei=.444445 dep=0 italic=.0138884
+dfont fby="a" kadd=-.0277786
+dfont fby="c" kadd=-.0277786
+dfont fby="e" kadd=-.0277786
+dfont fby="o" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .031115 .15494
+bezier .045338 .109378 .610066E-01 .632937E-01 .069215 .01651
+bezier .769895E-01 .625236E-01 .927571E-01 .109775 .107315 .15494
+aline .13081 .15494
+bezier .145086 .10952 .160991 .627353E-01 .17018 .01651
+bezier .180183 .629453E-01 .195871 .109056 .20955 .15494
+aline .234315 .15494
+bezier .218721 .10308 .20275 .507996E-01 .186055 -.000635
+aline .156845 -.000635
+bezier .142382 .445625E-01 .126645 .917861E-01 .118745 .137795
+bezier .111456 .913025E-01 .947288E-01 .450606E-01 .08128 -.000635
+aline .053975 -.000635
+bezier .372796E-01 .507996E-01 .213087E-01 .10308 .005715 .15494
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="x" !-------------- Beginning of new char.
+dfont wid=.461113 hei=.444445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .031115 .15494
+bezier .473989E-01 .135456 .638725E-01 .116109 .08001 .09652
+bezier .953912E-01 .116197 .111619 .135263 .127 .15494
+aline .15494 .15494
+bezier .1343 .129441 .111801 .105138 .916517E-01 .079375
+bezier .114281 .052392 .137911 .258977E-01 .16129 -.000635
+aline .132715 -.000635
+bezier .115298 .216989E-01 .972317E-01 .435651E-01 .08001 .06604
+bezier .629812E-01 .437312E-01 .046022 .213723E-01 .028575 -.000635
+aline .000635 -.000635
+bezier .023371 .260395E-01 .464787E-01 .524461E-01 .684213E-01 .796925E-01
+bezier .471073E-01 .105043 .243298E-01 .129704 .003175 .15494
+aline .031115 .15494
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="y" !-------------- Beginning of new char.
+dfont wid=.461113 hei=.444445 dep=.194445 italic=.0138884
+dfont fby="," kadd=-.083334
+dfont fby="." kadd=-.083334
+dfont fby="a" kadd=-.0277786
+dfont fby="e" kadd=-.0277786
+dfont fby="o" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .032385 .15494
+bezier .508816E-01 .111774 .720021E-01 .068588 .08255 .02286
+aline .08255 .017145
+aline .083185 .01651
+bezier .917365E-01 .638775E-01 .113093 .109758 .13081 .15494
+aline .15621 .15494
+bezier .127733 .858089E-01 .101575 .153092E-01 .070485 -.052705
+bezier .648468E-01 -.617247E-01 .570747E-01 -.713885E-01 .04572 -.073025
+aline .03302 -.073025
+aline .032385 -.07239
+aline .026035 -.07239
+aline .0254 -.071755
+aline .020955 -.071755
+aline .02032 -.07112
+aline .017145 -.07112
+aline .01524 -.070485
+aline .01524 -.066675
+aline .014605 -.06604
+aline .014605 -.05969
+aline .01397 -.059055
+aline .01397 -.05207
+aline .013335 -.051435
+aline .013335 -.04826
+bezier .267305E-01 -.521849E-01 .462339E-01 -.606566E-01 .05461 -.04445
+bezier .621083E-01 -.302419E-01 .693569E-01 -.146828E-01 .073025 .000635
+bezier .506234E-01 .520677E-01 .277025E-01 .10342 .005715 .15494
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="z" !-------------- Beginning of new char.
+dfont wid=.434723 hei=.444445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .1397 .15494
+aline .1397 .141605
+bezier .109425 .10118 .758802E-01 .060675 .047625 .02032
+aline .083185 .02032
+aline .08382 .020955
+aline .14097 .020955
+aline .14097 -.000635
+aline .01016 -.000635
+aline .01016 .013335
+bezier .405235E-01 .540599E-01 .740351E-01 .949537E-01 .10287 .135255
+aline .06985 .135255
+aline .069215 .13462
+aline .01524 .13462
+aline .01524 .15494
+aline .1397 .15494
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="{" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.444445 dep=0 italic=.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .17526 .106045
+aline .17526 .08509
+aline .000635 .08509
+aline .000635 .106045
+aline .17526 .106045
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="|" !-------------- Beginning of new char.
+dfont wid=1 hei=.444445 dep=0 italic=.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .35052 .106045
+aline .35052 .08509
+aline .000635 .08509
+aline .000635 .106045
+aline .35052 .106045
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="}" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .08763 .24257
+aline .08763 .241935
+aline .07874 .224155
+aline .078105 .22225
+aline .06985 .20574
+aline .069215 .203835
+aline .05969 .184785
+aline .038735 .184785
+bezier .458358E-01 .204073 .532811E-01 .223437 .06096 .24257
+aline .08763 .24257
+closepath
+! end of curve
+
+! start of curve
+amove .14605 .24257
+aline .14605 .241935
+aline .13716 .224155
+aline .136525 .22225
+aline .12827 .20574
+aline .127635 .203835
+aline .11811 .184785
+aline .097155 .184785
+bezier .104256 .204073 .111701 .223437 .11938 .24257
+aline .14605 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="~" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.676588 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .067945 .23622
+bezier .085704 .233368 .981212E-01 .211623 .11684 .21717
+aline .117475 .217805
+aline .118745 .21844
+aline .12065 .220345
+aline .122555 .224155
+aline .123825 .227965
+aline .12446 .23114
+aline .125095 .231775
+aline .125095 .23622
+aline .14605 .23622
+bezier .148025 .213551 .125843 .187067 .1016 .19685
+bezier .087092 .202188 .073427 .221397 .05715 .212725
+aline .055245 .21082
+aline .05334 .20701
+aline .05207 .2032
+aline .051435 .200025
+aline .0508 .19939
+aline .0508 .194945
+aline .029845 .194945
+bezier .290958E-01 .21303 .409705E-01 .23358 .060325 .23622
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=127 !-------------- Beginning of new char.
+dfont wid=.500002 hei=.679365 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .06858 .238125
+aline .06858 .20955
+aline .040005 .20955
+aline .040005 .238125
+aline .06858 .238125
+closepath
+! end of curve
+
+! start of curve
+amove .13589 .238125
+aline .13589 .20955
+aline .107315 .20955
+aline .107315 .238125
+aline .13589 .238125
+closepath
+! end of curve
+
+fill
+dfont endchar
diff --git a/src/fonts/texcmssb.afm b/src/fonts/texcmssb.afm
new file mode 100644
index 0000000..9fda028
--- /dev/null
+++ b/src/fonts/texcmssb.afm
@@ -0,0 +1,294 @@
+StartFontMetrics 2.0
+Comment Made from TEX tfm file using TFMTOAFM.bas
+FontName CMSSBX10
+EncodingScheme TEXENCODING
+FullName CMSSBX10
+FamilyName CMSSBX10
+Weight Medium
+ItalicAngle 0
+IsFixedPitch false
+UnderlinePosition -97
+UnderlineThickness 73
+FontBBox 0 -300 1001 1001
+CapHeight 729
+XHeight 161
+Descender -219
+Ascender 729
+StartCharMetrics 127
+C 1 ; WX 916 ; N C1 ; B 0 0 916 694 ;
+C 2 ; WX 855 ; N C2 ; B 0 0 855 694 ;
+C 3 ; WX 672 ; N C3 ; B 0 0 672 694 ;
+C 4 ; WX 733 ; N C4 ; B 0 0 733 694 ;
+C 5 ; WX 794 ; N C5 ; B 0 0 794 694 ;
+C 6 ; WX 794 ; N C6 ; B 0 0 794 694 ;
+C 7 ; WX 855 ; N C7 ; B 0 0 855 694 ;
+C 8 ; WX 794 ; N C8 ; B 0 0 794 694 ;
+C 9 ; WX 855 ; N C9 ; B 0 0 855 694 ;
+C 10 ; WX 794 ; N C10 ; B 0 0 794 694 ;
+C 11 ; WX 641 ; N C11 ; B 0 0 641 694 ; L i C14 L l C15
+C 12 ; WX 586 ; N C12 ; B 0 0 586 694 ;
+C 13 ; WX 586 ; N C13 ; B 0 0 586 694 ;
+C 14 ; WX 891 ; N C14 ; B 0 0 891 694 ;
+C 15 ; WX 891 ; N C15 ; B 0 0 891 694 ;
+C 16 ; WX 255 ; N C16 ; B 0 0 255 458 ;
+C 17 ; WX 286 ; N C17 ; B 0 -194 286 458 ;
+C 18 ; WX 550 ; N C18 ; B 0 0 550 694 ;
+C 19 ; WX 550 ; N C19 ; B 0 0 550 694 ;
+C 20 ; WX 550 ; N C20 ; B 0 0 550 635 ;
+C 21 ; WX 550 ; N C21 ; B 0 0 550 694 ;
+C 22 ; WX 550 ; N C22 ; B 0 0 550 637 ;
+C 23 ; WX 733 ; N C23 ; B 0 0 733 694 ;
+C 24 ; WX 488 ; N C24 ; B 0 -170 488 0 ;
+C 25 ; WX 565 ; N C25 ; B 0 0 565 694 ;
+C 26 ; WX 794 ; N C26 ; B 0 0 794 458 ;
+C 27 ; WX 855 ; N C27 ; B 0 0 855 458 ;
+C 28 ; WX 550 ; N C28 ; B 0 -97 550 555 ;
+C 29 ; WX 947 ; N C29 ; B 0 0 947 694 ;
+C 30 ; WX 1069 ; N C30 ; B 0 0 1069 694 ;
+C 31 ; WX 855 ; N C31 ; B 0 -48 855 743 ;
+C 32 ; WX 257 ; N C32 ; B 0 0 257 458 ;
+C 33 ; WX 366 ; N C33 ; B 0 0 366 694 ;
+C 34 ; WX 558 ; N C34 ; B 0 0 558 694 ;
+C 35 ; WX 916 ; N C35 ; B 0 -194 916 694 ;
+C 36 ; WX 550 ; N C36 ; B 0 -55 550 750 ;
+C 37 ; WX 1029 ; N C37 ; B 0 -55 1029 750 ;
+C 38 ; WX 830 ; N C38 ; B 0 0 830 694 ;
+C 39 ; WX 305 ; N C39 ; B 0 0 305 694 ; L C39 C34
+C 40 ; WX 427 ; N C40 ; B 0 -250 427 750 ;
+C 41 ; WX 427 ; N C41 ; B 0 -250 427 750 ;
+C 42 ; WX 550 ; N C42 ; B 0 0 550 750 ;
+C 43 ; WX 855 ; N C43 ; B 0 -116 855 616 ;
+C 44 ; WX 305 ; N C44 ; B 0 -105 305 130 ;
+C 45 ; WX 366 ; N C45 ; B 0 0 366 458 ;
+C 46 ; WX 305 ; N C46 ; B 0 0 305 130 ;
+C 47 ; WX 550 ; N C47 ; B 0 -250 550 750 ;
+C 48 ; WX 550 ; N C48 ; B 0 0 550 694 ;
+C 49 ; WX 550 ; N C49 ; B 0 0 550 694 ;
+C 50 ; WX 550 ; N C50 ; B 0 0 550 694 ;
+C 51 ; WX 550 ; N C51 ; B 0 0 550 694 ;
+C 52 ; WX 550 ; N C52 ; B 0 0 550 694 ;
+C 53 ; WX 550 ; N C53 ; B 0 0 550 694 ;
+C 54 ; WX 550 ; N C54 ; B 0 0 550 694 ;
+C 55 ; WX 550 ; N C55 ; B 0 0 550 694 ;
+C 56 ; WX 550 ; N C56 ; B 0 0 550 694 ;
+C 57 ; WX 550 ; N C57 ; B 0 0 550 694 ;
+C 58 ; WX 305 ; N C58 ; B 0 0 305 458 ;
+C 59 ; WX 305 ; N C59 ; B 0 -105 305 458 ;
+C 60 ; WX 366 ; N C60 ; B 0 -194 366 500 ;
+C 61 ; WX 855 ; N C61 ; B 0 94 855 406 ;
+C 62 ; WX 519 ; N C62 ; B 0 -194 519 500 ;
+C 63 ; WX 519 ; N C63 ; B 0 0 519 694 ;
+C 64 ; WX 733 ; N C64 ; B 0 0 733 694 ;
+C 65 ; WX 733 ; N A ; B 0 0 733 694 ;
+C 66 ; WX 733 ; N B ; B 0 0 733 694 ;
+C 67 ; WX 702 ; N C ; B 0 0 702 694 ;
+C 68 ; WX 794 ; N D ; B 0 0 794 694 ;
+C 69 ; WX 641 ; N E ; B 0 0 641 694 ;
+C 70 ; WX 611 ; N F ; B 0 0 611 694 ;
+C 71 ; WX 733 ; N G ; B 0 0 733 694 ;
+C 72 ; WX 794 ; N H ; B 0 0 794 694 ;
+C 73 ; WX 330 ; N I ; B 0 0 330 694 ;
+C 74 ; WX 519 ; N J ; B 0 0 519 694 ;
+C 75 ; WX 763 ; N K ; B 0 0 763 694 ;
+C 76 ; WX 580 ; N L ; B 0 0 580 694 ;
+C 77 ; WX 977 ; N M ; B 0 0 977 694 ;
+C 78 ; WX 794 ; N N ; B 0 0 794 694 ;
+C 79 ; WX 794 ; N O ; B 0 0 794 694 ;
+C 80 ; WX 702 ; N P ; B 0 0 702 694 ;
+C 81 ; WX 794 ; N Q ; B 0 -105 794 694 ;
+C 82 ; WX 702 ; N R ; B 0 0 702 694 ;
+C 83 ; WX 611 ; N S ; B 0 0 611 694 ;
+C 84 ; WX 733 ; N T ; B 0 0 733 694 ;
+C 85 ; WX 763 ; N U ; B 0 0 763 694 ;
+C 86 ; WX 733 ; N V ; B 0 0 733 694 ;
+C 87 ; WX 1038 ; N W ; B 0 0 1038 694 ;
+C 88 ; WX 733 ; N X ; B 0 0 733 694 ;
+C 89 ; WX 733 ; N Y ; B 0 0 733 694 ;
+C 90 ; WX 672 ; N Z ; B 0 0 672 694 ;
+C 91 ; WX 343 ; N C91 ; B 0 -250 343 750 ;
+C 92 ; WX 558 ; N C92 ; B 0 0 558 694 ;
+C 93 ; WX 343 ; N C93 ; B 0 -250 343 750 ;
+C 94 ; WX 550 ; N C94 ; B 0 0 550 694 ;
+C 95 ; WX 305 ; N C95 ; B 0 0 305 694 ;
+C 96 ; WX 305 ; N C96 ; B 0 0 305 694 ;
+C 97 ; WX 525 ; N a ; B 0 0 525 458 ;
+C 98 ; WX 561 ; N b ; B 0 0 561 694 ;
+C 99 ; WX 488 ; N c ; B 0 0 488 458 ;
+C 100 ; WX 561 ; N d ; B 0 0 561 694 ;
+C 101 ; WX 511 ; N e ; B 0 0 511 458 ;
+C 102 ; WX 336 ; N f ; B 0 0 336 694 ; L f C11 L i C12 L l C13
+C 103 ; WX 550 ; N g ; B 0 -194 550 458 ;
+C 104 ; WX 561 ; N h ; B 0 0 561 694 ;
+C 105 ; WX 255 ; N i ; B 0 0 255 694 ;
+C 106 ; WX 286 ; N j ; B 0 -194 286 694 ;
+C 107 ; WX 530 ; N k ; B 0 0 530 694 ;
+C 108 ; WX 255 ; N l ; B 0 0 255 694 ;
+C 109 ; WX 866 ; N m ; B 0 0 866 458 ;
+C 110 ; WX 561 ; N n ; B 0 0 561 458 ;
+C 111 ; WX 550 ; N o ; B 0 0 550 458 ;
+C 112 ; WX 561 ; N p ; B 0 -194 561 458 ;
+C 113 ; WX 561 ; N q ; B 0 -194 561 458 ;
+C 114 ; WX 372 ; N r ; B 0 0 372 458 ;
+C 115 ; WX 421 ; N s ; B 0 0 421 458 ;
+C 116 ; WX 404 ; N t ; B 0 0 404 589 ;
+C 117 ; WX 561 ; N u ; B 0 0 561 458 ;
+C 118 ; WX 500 ; N v ; B 0 0 500 458 ;
+C 119 ; WX 744 ; N w ; B 0 0 744 458 ;
+C 120 ; WX 500 ; N x ; B 0 0 500 458 ;
+C 121 ; WX 500 ; N y ; B 0 -194 500 458 ;
+C 122 ; WX 476 ; N z ; B 0 0 476 458 ;
+C 123 ; WX 550 ; N C123 ; B 0 0 550 458 ;
+C 124 ; WX 1100 ; N C124 ; B 0 0 1100 458 ;
+C 125 ; WX 550 ; N C125 ; B 0 0 550 694 ;
+C 126 ; WX 550 ; N C126 ; B 0 0 550 694 ;
+C 127 ; WX 550 ; N C127 ; B 0 0 550 694 ;
+EndCharMetrics
+
+StartKernData
+StartKernPairs 143
+KPX C11 C33 76
+KPX C11 C39 76
+KPX C11 C41 76
+KPX C11 C63 76
+KPX C11 C93 76
+KPX C32 L -294
+KPX C32 l -256
+KPX C39 C33 122
+KPX C39 C63 122
+KPX A C -31
+KPX A G -31
+KPX A O -31
+KPX A Q -31
+KPX A T -92
+KPX A U -31
+KPX A V -123
+KPX A W -123
+KPX A Y -92
+KPX A t -31
+KPX D A -31
+KPX D V -31
+KPX D W -31
+KPX D X -31
+KPX D Y -31
+KPX F A -92
+KPX F C -31
+KPX F G -31
+KPX F O -31
+KPX F Q -31
+KPX F a -31
+KPX F e -31
+KPX F o -31
+KPX F r -31
+KPX F u -31
+KPX I I 30
+KPX K C -31
+KPX K G -31
+KPX K O -31
+KPX K Q -31
+KPX L T -92
+KPX L V -123
+KPX L W -123
+KPX L Y -92
+KPX O A -31
+KPX O V -31
+KPX O W -31
+KPX O X -31
+KPX O Y -31
+KPX P C44 -92
+KPX P C46 -92
+KPX P A -92
+KPX P a -31
+KPX P e -31
+KPX P o -31
+KPX T A -92
+KPX T a -92
+KPX T e -92
+KPX T o -92
+KPX T r -92
+KPX T u -92
+KPX T y -92
+KPX V A -92
+KPX V C -31
+KPX V G -31
+KPX V O -31
+KPX V Q -31
+KPX V a -31
+KPX V e -31
+KPX V o -31
+KPX V r -31
+KPX V u -31
+KPX W A -92
+KPX W C -31
+KPX W G -31
+KPX W O -31
+KPX W Q -31
+KPX W a -31
+KPX W e -31
+KPX W o -31
+KPX W r -31
+KPX W u -31
+KPX X C -31
+KPX X G -31
+KPX X O -31
+KPX X Q -31
+KPX Y A -92
+KPX Y a -92
+KPX Y e -92
+KPX Y o -92
+KPX Y r -92
+KPX Y u -92
+KPX a r -31
+KPX a w -31
+KPX a y -31
+KPX b c 30
+KPX b d 30
+KPX b e 30
+KPX b o 30
+KPX b q 30
+KPX b r -31
+KPX b w -31
+KPX b x -31
+KPX b y -31
+KPX f C33 76
+KPX f C39 76
+KPX f C41 76
+KPX f C63 76
+KPX f C93 76
+KPX g j 30
+KPX k a -31
+KPX k c -31
+KPX k e -31
+KPX k o -31
+KPX o c 30
+KPX o d 30
+KPX o e 30
+KPX o o 30
+KPX o q 30
+KPX o r -31
+KPX o w -31
+KPX o x -31
+KPX o y -31
+KPX p c 30
+KPX p d 30
+KPX p e 30
+KPX p o 30
+KPX p q 30
+KPX p r -31
+KPX p w -31
+KPX p x -31
+KPX p y -31
+KPX t w -31
+KPX t y -31
+KPX u w -31
+KPX w a -31
+KPX w c -31
+KPX w e -31
+KPX w o -31
+KPX y C44 -92
+KPX y C46 -92
+KPX y a -31
+KPX y e -31
+KPX y o -31
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/src/fonts/texcmssb.gle b/src/fonts/texcmssb.gle
new file mode 100644
index 0000000..036e0b7
--- /dev/null
+++ b/src/fonts/texcmssb.gle
@@ -0,0 +1,7078 @@
+dfont file_name="CMSSBX10"
+dfont font_name="CMSSBX10"
+dfont design= .35146
+dfont slant= 0
+dfont space= .128869
+dfont stretch= .644347E-01
+dfont shrink= .429564E-01
+dfont x_hei= .161086
+dfont quad= .386608
+dfont extra_space= .429564E-01
+dfont paint="FILL"
+!------------------ end of main parameters
+dfont char=0 !-------------- Beginning of new char.
+dfont wid=.580559 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .178659 .24114
+aline .180611 .240164
+aline .182564 .239188
+aline .185493 .236259
+aline .187445 .232354
+aline .187445 .213805
+aline .185493 .2099
+aline .182564 .206971
+aline .178659 .205018
+aline .145465 .205018
+aline .144489 .205994
+aline .868887E-01 .205994
+aline .854243E-01 .206727
+aline .839598E-01 .205994
+aline .839598E-01 .781022E-02
+aline .820073E-01 .390511E-02
+aline .790785E-01 .976277E-03
+aline .751733E-01 -.976277E-03
+aline .429562E-01 -.976277E-03
+aline .400274E-01 0
+aline .380748E-01 .976277E-03
+aline .035146 .390511E-02
+aline .341697E-01 .585766E-02
+aline .331934E-01 .878649E-02
+aline .331934E-01 .231378
+aline .341697E-01 .234307
+aline .035146 .236259
+aline .380748E-01 .239188
+aline .400274E-01 .240164
+aline .429562E-01 .24114
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=1 !-------------- Beginning of new char.
+dfont wid=.916672 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .185493 .242117
+bezier .202117 .237718 .204639 .21819 .211852 .205018
+bezier .241684 .140349 .271154 .755295E-01 .300693 .010739
+aline .300693 .390511E-02
+aline .299717 .292883E-02
+aline .298741 .976277E-03
+aline .294836 -.976277E-03
+aline .028312 -.976277E-03
+aline .244069E-01 .976277E-03
+aline .234307E-01 .292883E-02
+aline .224544E-01 .390511E-02
+aline .224544E-01 .010739
+bezier .571125E-01 .854831E-01 .899325E-01 .161281 .12594 .235283
+aline .127892 .237235
+aline .129845 .238212
+aline .130821 .239188
+aline .134726 .24114
+aline .137655 .242117
+closepath
+! end of curve
+
+! start of curve
+amove .156204 .196232
+bezier .132749 .146298 .110775 .954578E-01 .868887E-01 .045885
+aline .878649E-01 .449088E-01
+aline .227473 .449088E-01
+aline .228205 .463732E-01
+bezier .204242 .096955 .182195 .148965 .157669 .198916
+aline .156985 .198575
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=2 !-------------- Beginning of new char.
+dfont wid=.85556 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .164991 .249927
+bezier .199883 .247982 .241007 .234354 .25969 .201113
+bezier .27365 .181389 .276788 .155877 .279215 .13375
+aline .279215 .103485
+bezier .277386 .678642E-01 .262397 .276593E-01 .229425 .878649E-02
+bezier .209989 -.309171E-02 .186814 -.654389E-02 .165967 -.878649E-02
+aline .135703 -.878649E-02
+bezier .100826 -.677251E-02 .059678 .67489E-02 .410036E-01 .400274E-01
+bezier .284013E-01 .587117E-01 .245801E-01 .825459E-01 .224544E-01 .103485
+aline .224544E-01 .13375
+bezier .245853E-01 .166919 .354377E-01 .206174 .654106E-01 .226496
+bezier .941088E-01 .248758 .130476 .250439 .164991 .249927
+closepath
+! end of curve
+
+! start of curve
+amove .140584 .224544
+bezier .110698 .223842 .838082E-01 .20124 .771259E-01 .171825
+aline .761496E-01 .16792
+aline .741971E-01 .158157
+aline .732208E-01 .157181
+aline .732208E-01 .150347
+aline .722445E-01 .14937
+aline .722445E-01 .139608
+aline .712682E-01 .138631
+aline .712682E-01 .100557
+bezier .073178 .709443E-01 .084604 .331971E-01 .117153 .224544E-01
+bezier .148772 .112714E-01 .188512 .014904 .211852 .419799E-01
+bezier .224225 .591072E-01 .228524 .810541E-01 .230401 .100557
+aline .230401 .138631
+bezier .22821 .169173 .217216 .208383 .18354 .219662
+aline .180611 .220639
+aline .176706 .221615
+aline .173777 .222591
+aline .168896 .223567
+aline .16792 .224544
+aline .161086 .224544
+aline .160109 .22552
+aline .14156 .22552
+aline .140584 .224544
+closepath
+! end of curve
+
+! start of curve
+amove .196232 .144489
+aline .199161 .143513
+aline .201113 .142536
+aline .202089 .14156
+aline .204042 .140584
+aline .205018 .138631
+aline .205994 .137655
+aline .206971 .134726
+aline .206971 .10739
+aline .205994 .104462
+aline .205018 .103485
+aline .204042 .101533
+aline .202089 .100557
+aline .201113 .995803E-01
+aline .199161 .098604
+aline .196232 .976277E-01
+aline .105438 .976277E-01
+aline .102509 .098604
+aline .100557 .995803E-01
+aline .995803E-01 .100557
+aline .976277E-01 .101533
+aline .966514E-01 .103485
+aline .956752E-01 .104462
+aline .946989E-01 .10739
+aline .946989E-01 .134726
+aline .956752E-01 .137655
+aline .966514E-01 .138631
+aline .976277E-01 .140584
+aline .995803E-01 .14156
+aline .100557 .142536
+aline .102509 .143513
+aline .105438 .144489
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=3 !-------------- Beginning of new char.
+dfont wid=.672226 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .14156 .242117
+bezier .158383 .237291 .156754 .216375 .163038 .203066
+bezier .182392 .139558 .201917 .760996E-01 .221615 .126916E-01
+aline .221615 .488139E-02
+aline .220639 .292883E-02
+aline .21771 0
+aline .215757 -.976277E-03
+aline .181588 -.976277E-03
+aline .178659 0
+aline .174754 .195255E-02
+aline .170849 .585766E-02
+bezier .150726 .641285E-01 .133491 .123733 .11813 .18354
+aline .116177 .193303
+aline .116177 .198184
+aline .115201 .199161
+bezier .101261 .134906 .802585E-01 .709677E-01 .605292E-01 .781022E-02
+aline .595529E-01 .683394E-02
+aline .585766E-01 .488139E-02
+aline .566241E-01 .292883E-02
+aline .546715E-01 .195255E-02
+aline .536952E-01 .976277E-03
+aline .517427E-01 0
+aline .488139E-01 -.976277E-03
+aline .214781E-01 -.976277E-03
+aline .195255E-01 0
+aline .165967E-01 .292883E-02
+aline .156204E-01 .488139E-02
+aline .156204E-01 .126916E-01
+bezier .039644 .869602E-01 .600512E-01 .162936 .859124E-01 .236259
+aline .878649E-01 .238212
+aline .898175E-01 .239188
+aline .907938E-01 .240164
+aline .927463E-01 .24114
+aline .956752E-01 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=4 !-------------- Beginning of new char.
+dfont wid=.733337 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .230401 .240164
+aline .232354 .239188
+aline .234307 .238212
+aline .237235 .235283
+aline .239188 .231378
+aline .239188 .206971
+aline .237235 .203066
+aline .234307 .200137
+aline .230401 .198184
+aline .176706 .198184
+aline .17573 .199161
+aline .829836E-01 .199161
+aline .820073E-01 .198184
+aline .028312 .198184
+aline .244069E-01 .200137
+aline .214781E-01 .203066
+aline .195255E-01 .206971
+aline .195255E-01 .230401
+aline .205018E-01 .23333
+aline .214781E-01 .235283
+aline .244069E-01 .238212
+aline .263595E-01 .239188
+aline .292883E-01 .240164
+closepath
+! end of curve
+
+! start of curve
+amove .205994 .144489
+aline .207947 .143513
+aline .2099 .142536
+aline .212828 .139608
+aline .214781 .135703
+aline .214781 .112272
+aline .212828 .108367
+aline .2099 .105438
+aline .205994 .103485
+aline .052719 .103485
+aline .488139E-01 .105438
+aline .045885 .108367
+aline .439325E-01 .112272
+aline .439325E-01 .134726
+aline .449088E-01 .137655
+aline .045885 .139608
+aline .488139E-01 .142536
+aline .507664E-01 .143513
+aline .536952E-01 .144489
+closepath
+! end of curve
+
+! start of curve
+amove .081031 .410036E-01
+aline .820073E-01 .400274E-01
+aline .176706 .400274E-01
+aline .177682 .410036E-01
+aline .232354 .410036E-01
+aline .236259 .390511E-01
+aline .239188 .361223E-01
+aline .24114 .322171E-01
+aline .24114 .781022E-02
+aline .239188 .390511E-02
+aline .236259 .976277E-03
+aline .232354 -.976277E-03
+aline .273358E-01 -.976277E-03
+aline .244069E-01 0
+aline .224544E-01 .976277E-03
+aline .195255E-01 .390511E-02
+aline .185493E-01 .585766E-02
+aline .017573 .878649E-02
+aline .017573 .322171E-01
+aline .195255E-01 .361223E-01
+aline .224544E-01 .390511E-01
+aline .263595E-01 .410036E-01
+aline .081031 .410036E-01
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=5 !-------------- Beginning of new char.
+dfont wid=.794449 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .238212 .24114
+aline .240164 .240164
+aline .242117 .239188
+aline .245046 .236259
+aline .246998 .232354
+aline .246998 .781022E-02
+aline .245046 .390511E-02
+aline .242117 .976277E-03
+aline .238212 -.976277E-03
+aline .205018 -.976277E-03
+aline .201113 .976277E-03
+aline .198184 .390511E-02
+aline .196232 .781022E-02
+aline .196232 .207947
+aline .195255 .208923
+aline .849361E-01 .208923
+aline .839598E-01 .207947
+aline .839598E-01 .781022E-02
+aline .820073E-01 .390511E-02
+aline .790785E-01 .976277E-03
+aline .751733E-01 -.976277E-03
+aline .429562E-01 -.976277E-03
+aline .400274E-01 0
+aline .380748E-01 .976277E-03
+aline .035146 .390511E-02
+aline .341697E-01 .585766E-02
+aline .331934E-01 .878649E-02
+aline .331934E-01 .231378
+aline .341697E-01 .234307
+aline .035146 .236259
+aline .380748E-01 .239188
+aline .400274E-01 .240164
+aline .429562E-01 .24114
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=6 !-------------- Beginning of new char.
+dfont wid=.794449 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .248951 .242117
+aline .250903 .24114
+aline .252856 .240164
+aline .255785 .237235
+aline .257737 .23333
+aline .257737 .214781
+aline .255785 .210876
+aline .252856 .207947
+aline .248951 .205994
+aline .196232 .205994
+aline .195255 .206971
+aline .995803E-01 .206971
+aline .098604 .207947
+aline .978718E-01 .206483
+bezier .120444 .178984 .145304 .153134 .166943 .124963
+bezier .170892 .112033 .15558 .104653 .150347 .946989E-01
+bezier .133457 .759449E-01 .118272 .559613E-01 .101533 .370985E-01
+aline .103485 .364477E-01
+aline .105438 .370985E-01
+aline .197208 .370985E-01
+aline .198184 .380748E-01
+aline .248951 .380748E-01
+aline .252856 .361223E-01
+aline .255785 .331934E-01
+aline .257737 .292883E-01
+aline .257737 .781022E-02
+aline .255785 .390511E-02
+aline .252856 .976277E-03
+aline .248951 -.976277E-03
+aline .322171E-01 -.976277E-03
+bezier .202074E-01 .115648E-02 .200335E-01 .169478E-01 .028312 .234307E-01
+bezier .551833E-01 .543025E-01 .080519 .862808E-01 .10739 .117153
+bezier .789409E-01 .150248 .492537E-01 .18245 .224544E-01 .216734
+aline .224544E-01 .232354
+aline .234307E-01 .235283
+aline .244069E-01 .237235
+aline .273358E-01 .240164
+aline .292883E-01 .24114
+aline .322171E-01 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=7 !-------------- Beginning of new char.
+dfont wid=.85556 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .098604 .249927
+bezier .131061 .245339 .145858 .211394 .151323 .182564
+bezier .156309 .211266 .170675 .245497 .203066 .249927
+bezier .235222 .253152 .274189 .235252 .279215 .200137
+aline .279215 .190374
+aline .277263 .186469
+aline .274334 .18354
+aline .270429 .181588
+aline .24114 .181588
+aline .237235 .18354
+aline .234307 .186469
+aline .232354 .190374
+bezier .234812 .209489 .208218 .218521 .195255 .206971
+bezier .182207 .197435 .180876 .178518 .177682 .164991
+aline .177682 .152299
+aline .176706 .151323
+aline .176706 .781022E-02
+aline .174754 .390511E-02
+aline .171825 .976277E-03
+aline .16792 -.976277E-03
+aline .135703 -.976277E-03
+aline .132774 0
+aline .130821 .976277E-03
+aline .127892 .390511E-02
+aline .126916 .585766E-02
+aline .12594 .878649E-02
+aline .12594 .151323
+bezier .123441 .169962 .123541 .192669 .10739 .206971
+bezier .940486E-01 .218111 .669641E-01 .210152 .693157E-01 .190374
+aline .673631E-01 .186469
+aline .644343E-01 .18354
+aline .605292E-01 .181588
+aline .312409E-01 .181588
+aline .273358E-01 .18354
+aline .244069E-01 .186469
+bezier .170065E-01 .206422 .317484E-01 .227522 .478376E-01 .238212
+aline .615055E-01 .245046
+aline .673631E-01 .246998
+aline .712682E-01 .247974
+aline .761496E-01 .248951
+aline .081031 .248951
+aline .820073E-01 .249927
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=8 !-------------- Beginning of new char.
+dfont wid=.794449 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .155228 .242117
+aline .157181 .24114
+aline .159133 .240164
+aline .162062 .237235
+aline .164015 .23333
+aline .164015 .205994
+bezier .193181 .202682 .228904 .194056 .246022 .165967
+bezier .269344 .12682 .258545 .677023E-01 .214781 .478376E-01
+bezier .198723 .397257E-01 .180106 .381158E-01 .164015 .035146
+aline .164015 .781022E-02
+aline .162062 .390511E-02
+aline .159133 .976277E-03
+aline .155228 -.976277E-03
+aline .124963 -.976277E-03
+aline .122035 0
+aline .120082 .976277E-03
+aline .117153 .390511E-02
+aline .116177 .585766E-02
+aline .115201 .878649E-02
+aline .115201 .035146
+bezier .869544E-01 .388143E-01 .517816E-01 .467677E-01 .035146 .741971E-01
+bezier .967332E-02 .113575 .219914E-01 .176424 .683394E-01 .194279
+bezier .830661E-01 .202129 .100534 .2027 .115201 .205994
+aline .115201 .232354
+aline .116177 .235283
+aline .117153 .237235
+aline .120082 .240164
+aline .122035 .24114
+aline .124963 .242117
+closepath
+! end of curve
+
+! start of curve
+amove .111296 .178659
+bezier .919851E-01 .175893 .759856E-01 .160315 .741971E-01 .140584
+bezier .700601E-01 .11818 .703527E-01 .896202E-01 .888412E-01 .722445E-01
+bezier .964717E-01 .671008E-01 .105921 .062057 .115201 .624817E-01
+aline .115201 .178659
+aline .113248 .17931
+aline .111296 .178659
+closepath
+! end of curve
+
+! start of curve
+amove .164015 .178659
+aline .164015 .624817E-01
+bezier .184889 .620854E-01 .204262 .793195E-01 .205994 .100557
+bezier .210132 .122961 .209839 .151521 .19135 .168896
+aline .189398 .169872
+aline .188421 .170849
+aline .186469 .171825
+aline .185493 .172801
+aline .181588 .174754
+aline .178659 .17573
+aline .176706 .176706
+aline .166455 .179269
+aline .164015 .178659
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=9 !-------------- Beginning of new char.
+dfont wid=.85556 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .165967 .242117
+aline .16792 .24114
+aline .169872 .240164
+aline .172801 .237235
+aline .174754 .23333
+aline .174754 .644343E-01
+bezier .197199 .684225E-01 .208182 .953508E-01 .2099 .116177
+aline .210876 .117153
+aline .210876 .126916
+aline .211852 .127892
+aline .211852 .169872
+bezier .213073 .187073 .217183 .211954 .238212 .215757
+aline .270429 .215757
+aline .274334 .213805
+aline .277263 .210876
+aline .279215 .206971
+aline .279215 .200137
+aline .277263 .196232
+aline .274334 .193303
+aline .270429 .19135
+aline .26609 .190483
+aline .264571 .187445
+aline .263595 .18354
+aline .262619 .178659
+aline .261642 .177682
+aline .261642 .16792
+aline .260666 .166943
+aline .260666 .129845
+bezier .259036 .990665E-01 .245759 .634831E-01 .215757 .488139E-01
+bezier .204074 .421589E-01 .190351 .372827E-01 .176706 .370985E-01
+aline .174754 .035146
+aline .174754 .781022E-02
+aline .172801 .390511E-02
+aline .169872 .976277E-03
+aline .165967 -.976277E-03
+aline .135703 -.976277E-03
+aline .132774 0
+aline .130821 .976277E-03
+aline .127892 .390511E-02
+aline .126916 .585766E-02
+aline .12594 .878649E-02
+aline .12594 .035146
+aline .123987 .370985E-01
+bezier .811217E-01 .386232E-01 .445538E-01 .753232E-01 .429562E-01 .11813
+aline .419799E-01 .119106
+aline .419799E-01 .127892
+aline .410036E-01 .128869
+aline .410036E-01 .166943
+aline .400274E-01 .16792
+aline .400274E-01 .177682
+aline .390511E-01 .178659
+aline .380748E-01 .18354
+aline .370985E-01 .187445
+aline .355799E-01 .190483
+bezier .206968E-01 .189733 .172634E-01 .21324 .322171E-01 .215757
+aline .063458 .215757
+bezier .844875E-01 .211954 .885959E-01 .187073 .898175E-01 .169872
+aline .898175E-01 .127892
+bezier .922547E-01 .105049 .976674E-01 .731902E-01 .123987 .644343E-01
+aline .124963 .063458
+aline .12594 .644343E-01
+aline .12594 .232354
+aline .126916 .235283
+aline .127892 .237235
+aline .130821 .240164
+aline .132774 .24114
+aline .135703 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=10 !-------------- Beginning of new char.
+dfont wid=.794449 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .159133 .249927
+bezier .191094 .247846 .230485 .236844 .246998 .205018
+bezier .26735 .170012 .257552 .124973 .231378 .956752E-01
+bezier .217646 .758917E-01 .199449 .590175E-01 .189642 .366104E-01
+aline .190374 .035146
+aline .208923 .035146
+aline .2099 .361223E-01
+aline .252856 .361223E-01
+aline .256761 .341697E-01
+aline .25969 .312409E-01
+aline .261642 .273358E-01
+aline .261642 .781022E-02
+aline .25969 .390511E-02
+aline .256761 .976277E-03
+aline .252856 -.976277E-03
+aline .168896 -.976277E-03
+aline .165967 0
+aline .164015 .976277E-03
+aline .161086 .390511E-02
+aline .160109 .585766E-02
+bezier .156382 .303014E-01 .166645 .545025E-01 .176706 .771259E-01
+aline .192327 .108367
+bezier .207012 .138521 .214421 .174116 .196232 .204042
+bezier .178515 .226677 .146748 .226852 .121058 .224544
+bezier .102004 .220888 .817247E-01 .21014 .771259E-01 .189398
+bezier .680428E-01 .16231 .757595E-01 .134049 .878649E-01 .108367
+aline .103485 .771259E-01
+bezier .113781 .550721E-01 .122237 .317974E-01 .121058 .781022E-02
+aline .119106 .390511E-02
+aline .116177 .976277E-03
+aline .112272 -.976277E-03
+aline .028312 -.976277E-03
+aline .253832E-01 0
+aline .234307E-01 .976277E-03
+aline .205018E-01 .390511E-02
+aline .195255E-01 .585766E-02
+aline .185493E-01 .878649E-02
+aline .185493E-01 .273358E-01
+aline .205018E-01 .312409E-01
+aline .234307E-01 .341697E-01
+aline .273358E-01 .361223E-01
+aline .070292 .361223E-01
+aline .712682E-01 .035146
+aline .898175E-01 .035146
+bezier .883623E-01 .470183E-01 .776042E-01 .570668E-01 .712682E-01 .673631E-01
+bezier .463721E-01 .966284E-01 .175118E-01 .130323 .224544E-01 .171825
+bezier .251647E-01 .201778 .454973E-01 .229447 .741971E-01 .240164
+aline .888412E-01 .245046
+aline .927463E-01 .246022
+aline .976277E-01 .246998
+aline .102509 .246998
+aline .103485 .247974
+aline .109343 .247974
+aline .110319 .248951
+aline .120082 .248951
+aline .121058 .249927
+aline .159133 .249927
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=11 !-------------- Beginning of new char.
+dfont wid=.64167 hei=.694445 dep=0 italic=.0763903
+dfont fby=33 kadd=.0763903
+dfont fby=39 kadd=.0763903
+dfont fby=")" kadd=.0763903
+dfont fby="?" kadd=.0763903
+dfont fby="]" kadd=.0763903
+dfont fby="i" ligrep=14
+dfont fby="l" ligrep=15
+set path ! start of curve
+newpath
+! start of curve
+amove .112272 .246022
+aline .113248 .245046
+aline .120082 .245046
+aline .129845 .243093
+aline .132774 .242117
+aline .134726 .240164
+aline .134726 .2099
+aline .132774 .207947
+aline .128869 .207947
+bezier .117268 .222432 .918194E-01 .227695 .790785E-01 .212828
+aline .781022E-01 .2099
+aline .771259E-01 .205994
+aline .761496E-01 .205018
+aline .761496E-01 .160109
+aline .771259E-01 .159133
+aline .102509 .159133
+aline .106414 .157181
+aline .109343 .154252
+aline .111296 .150347
+aline .111296 .143513
+aline .109343 .139608
+aline .106414 .136679
+aline .102509 .134726
+aline .781022E-01 .134726
+aline .771259E-01 .13375
+aline .771259E-01 .781022E-02
+aline .751733E-01 .390511E-02
+aline .722445E-01 .976277E-03
+aline .683394E-01 -.976277E-03
+aline .410036E-01 -.976277E-03
+aline .380748E-01 0
+aline .361223E-01 .976277E-03
+aline .331934E-01 .390511E-02
+aline .322171E-01 .585766E-02
+aline .312409E-01 .878649E-02
+aline .312409E-01 .13375
+aline .302646E-01 .134726
+aline .195255E-01 .134726
+aline .156204E-01 .136679
+aline .126916E-01 .139608
+aline .010739 .143513
+aline .010739 .14937
+aline .117153E-01 .152299
+aline .126916E-01 .154252
+aline .156204E-01 .157181
+aline .017573 .158157
+aline .205018E-01 .159133
+aline .302646E-01 .159133
+aline .312409E-01 .160109
+aline .312409E-01 .197208
+bezier .329518E-01 .220079 .510998E-01 .240041 .741971E-01 .244069
+aline .790785E-01 .245046
+aline .859124E-01 .245046
+aline .868887E-01 .246022
+aline .112272 .246022
+closepath
+! end of curve
+
+! start of curve
+amove .219662 .246022
+aline .220639 .245046
+aline .227473 .245046
+aline .237235 .243093
+aline .240164 .242117
+aline .242117 .240164
+aline .242117 .2099
+aline .240164 .207947
+aline .236259 .207947
+bezier .224658 .222433 .199209 .227695 .186469 .212828
+aline .185493 .2099
+aline .184516 .205994
+aline .18354 .205018
+aline .18354 .160109
+aline .184516 .159133
+aline .2099 .159133
+aline .213805 .157181
+aline .216734 .154252
+aline .218686 .150347
+aline .218686 .143513
+aline .216734 .139608
+aline .213805 .136679
+aline .2099 .134726
+aline .185493 .134726
+aline .184516 .13375
+aline .184516 .781022E-02
+aline .182564 .390511E-02
+aline .179635 .976277E-03
+aline .17573 -.976277E-03
+aline .147418 -.976277E-03
+aline .143513 .976277E-03
+aline .140584 .390511E-02
+aline .138631 .781022E-02
+aline .138631 .197208
+bezier .140342 .220078 .15849 .240042 .181588 .244069
+aline .186469 .245046
+aline .193303 .245046
+aline .194279 .246022
+aline .219662 .246022
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=12 !-------------- Beginning of new char.
+dfont wid=.586115 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .966514E-01 .246022
+aline .976277E-01 .245046
+aline .102509 .245046
+aline .106414 .244069
+aline .112272 .242117
+aline .114224 .240164
+aline .114224 .207947
+aline .112272 .205994
+aline .108367 .205994
+bezier .104416 .21197 .101347 .220082 .927463E-01 .220639
+aline .917701E-01 .221615
+aline .849361E-01 .221615
+aline .839598E-01 .220639
+aline .820073E-01 .219662
+aline .800547E-01 .21771
+aline .781022E-01 .213805
+aline .771259E-01 .208923
+aline .761496E-01 .207947
+aline .761496E-01 .160109
+aline .771259E-01 .159133
+aline .105438 .159133
+aline .109343 .157181
+aline .112272 .154252
+aline .114224 .150347
+aline .114224 .143513
+aline .112272 .139608
+aline .109343 .136679
+aline .105438 .134726
+aline .781022E-01 .134726
+aline .771259E-01 .13375
+aline .771259E-01 .781022E-02
+aline .751733E-01 .390511E-02
+aline .722445E-01 .976277E-03
+aline .683394E-01 -.976277E-03
+aline .410036E-01 -.976277E-03
+aline .380748E-01 0
+aline .361223E-01 .976277E-03
+aline .331934E-01 .390511E-02
+aline .322171E-01 .585766E-02
+aline .312409E-01 .878649E-02
+aline .312409E-01 .13375
+aline .302646E-01 .134726
+aline .195255E-01 .134726
+aline .156204E-01 .136679
+aline .126916E-01 .139608
+aline .010739 .143513
+aline .010739 .14937
+aline .117153E-01 .152299
+aline .126916E-01 .154252
+aline .156204E-01 .157181
+aline .017573 .158157
+aline .205018E-01 .159133
+aline .302646E-01 .159133
+aline .312409E-01 .160109
+aline .312409E-01 .199161
+bezier .326824E-01 .219348 .463254E-01 .239522 .673631E-01 .244069
+aline .712682E-01 .245046
+aline .771259E-01 .245046
+aline .781022E-01 .246022
+aline .966514E-01 .246022
+closepath
+! end of curve
+
+! start of curve
+amove .17573 .243093
+aline .177682 .242117
+aline .179635 .24114
+aline .182564 .238212
+aline .184516 .234307
+aline .184516 .205018
+aline .182564 .201113
+aline .179635 .198184
+aline .17573 .196232
+aline .146442 .196232
+aline .142536 .198184
+aline .139608 .201113
+aline .137655 .205018
+aline .137655 .234307
+aline .139608 .238212
+aline .142536 .24114
+aline .144489 .242117
+aline .146442 .243093
+closepath
+! end of curve
+
+! start of curve
+amove .17573 .159133
+aline .177682 .158157
+aline .179635 .157181
+aline .182564 .154252
+aline .184516 .150347
+aline .184516 .781022E-02
+aline .182564 .390511E-02
+aline .179635 .976277E-03
+aline .17573 -.976277E-03
+aline .147418 -.976277E-03
+aline .143513 .976277E-03
+aline .140584 .390511E-02
+aline .138631 .781022E-02
+aline .138631 .150347
+aline .140584 .154252
+aline .143513 .157181
+aline .145465 .158157
+aline .147418 .159133
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=13 !-------------- Beginning of new char.
+dfont wid=.586115 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .966514E-01 .246022
+aline .976277E-01 .245046
+aline .102509 .245046
+aline .106414 .244069
+aline .112272 .242117
+aline .114224 .240164
+aline .114224 .2099
+aline .112272 .207947
+aline .108367 .207947
+bezier .103604 .217648 .089076 .227305 .800547E-01 .21771
+aline .781022E-01 .213805
+aline .771259E-01 .208923
+aline .761496E-01 .207947
+aline .761496E-01 .160109
+aline .771259E-01 .159133
+aline .105438 .159133
+aline .109343 .157181
+aline .112272 .154252
+aline .114224 .150347
+aline .114224 .143513
+aline .112272 .139608
+aline .109343 .136679
+aline .105438 .134726
+aline .781022E-01 .134726
+aline .771259E-01 .13375
+aline .771259E-01 .781022E-02
+aline .751733E-01 .390511E-02
+aline .722445E-01 .976277E-03
+aline .683394E-01 -.976277E-03
+aline .410036E-01 -.976277E-03
+aline .380748E-01 0
+aline .361223E-01 .976277E-03
+aline .331934E-01 .390511E-02
+aline .322171E-01 .585766E-02
+aline .312409E-01 .878649E-02
+aline .312409E-01 .13375
+aline .302646E-01 .134726
+aline .195255E-01 .134726
+aline .156204E-01 .136679
+aline .126916E-01 .139608
+aline .010739 .143513
+aline .010739 .14937
+aline .117153E-01 .152299
+aline .126916E-01 .154252
+aline .156204E-01 .157181
+aline .017573 .158157
+aline .205018E-01 .159133
+aline .302646E-01 .159133
+aline .312409E-01 .160109
+aline .312409E-01 .199161
+bezier .326824E-01 .219348 .463254E-01 .239522 .673631E-01 .244069
+aline .712682E-01 .245046
+aline .771259E-01 .245046
+aline .781022E-01 .246022
+aline .966514E-01 .246022
+closepath
+! end of curve
+
+! start of curve
+amove .17573 .242117
+aline .177682 .24114
+aline .179635 .240164
+aline .182564 .237235
+aline .184516 .23333
+aline .184516 .781022E-02
+aline .182564 .390511E-02
+aline .179635 .976277E-03
+aline .17573 -.976277E-03
+aline .147418 -.976277E-03
+aline .143513 .976277E-03
+aline .140584 .390511E-02
+aline .138631 .781022E-02
+aline .138631 .23333
+aline .140584 .237235
+aline .143513 .240164
+aline .145465 .24114
+aline .147418 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=14 !-------------- Beginning of new char.
+dfont wid=.891672 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .104462 .246022
+aline .105438 .245046
+aline .111296 .245046
+aline .119106 .243093
+aline .122035 .242117
+aline .123987 .240164
+aline .123987 .2099
+aline .122035 .207947
+aline .11813 .207947
+bezier .110353 .221432 .085964 .228663 .781022E-01 .211852
+aline .771259E-01 .206971
+aline .761496E-01 .205994
+aline .761496E-01 .160109
+aline .771259E-01 .159133
+aline .105438 .159133
+aline .109343 .157181
+aline .112272 .154252
+aline .114224 .150347
+aline .114224 .143513
+aline .112272 .139608
+aline .109343 .136679
+aline .105438 .134726
+aline .781022E-01 .134726
+aline .771259E-01 .13375
+aline .771259E-01 .781022E-02
+aline .751733E-01 .390511E-02
+aline .722445E-01 .976277E-03
+aline .683394E-01 -.976277E-03
+aline .410036E-01 -.976277E-03
+aline .380748E-01 0
+aline .361223E-01 .976277E-03
+aline .331934E-01 .390511E-02
+aline .322171E-01 .585766E-02
+aline .312409E-01 .878649E-02
+aline .312409E-01 .13375
+aline .302646E-01 .134726
+aline .195255E-01 .134726
+aline .156204E-01 .136679
+aline .126916E-01 .139608
+aline .010739 .143513
+aline .010739 .14937
+aline .117153E-01 .152299
+aline .126916E-01 .154252
+aline .156204E-01 .157181
+aline .017573 .158157
+aline .205018E-01 .159133
+aline .302646E-01 .159133
+aline .312409E-01 .160109
+aline .312409E-01 .198184
+bezier .032571 .223118 .054968 .246056 .081031 .245046
+aline .820073E-01 .246022
+aline .104462 .246022
+closepath
+! end of curve
+
+! start of curve
+amove .205994 .246022
+aline .206971 .245046
+aline .211852 .245046
+aline .216734 .244069
+aline .219662 .243093
+aline .221615 .24114
+aline .221615 .208923
+aline .219662 .206971
+aline .215757 .206971
+aline .213805 .208923
+bezier .210792 .220849 .190219 .227876 .185493 .213805
+aline .184516 .208923
+aline .18354 .207947
+aline .18354 .160109
+aline .184516 .159133
+aline .212828 .159133
+aline .216734 .157181
+aline .219662 .154252
+aline .221615 .150347
+aline .221615 .143513
+aline .219662 .139608
+aline .216734 .136679
+aline .212828 .134726
+aline .185493 .134726
+aline .184516 .13375
+aline .184516 .781022E-02
+aline .182564 .390511E-02
+aline .179635 .976277E-03
+aline .17573 -.976277E-03
+aline .148394 -.976277E-03
+aline .145465 0
+aline .143513 .976277E-03
+aline .140584 .390511E-02
+aline .139608 .585766E-02
+aline .138631 .878649E-02
+aline .138631 .199161
+bezier .140073 .219347 .153716 .239523 .174754 .244069
+aline .178659 .245046
+aline .184516 .245046
+aline .185493 .246022
+aline .205994 .246022
+closepath
+! end of curve
+
+! start of curve
+amove .28312 .243093
+aline .285073 .242117
+aline .287025 .24114
+aline .289954 .238212
+aline .291907 .234307
+aline .291907 .205018
+aline .289954 .201113
+aline .287025 .198184
+aline .28312 .196232
+aline .253832 .196232
+aline .249927 .198184
+aline .246998 .201113
+aline .245046 .205018
+aline .245046 .234307
+aline .246998 .238212
+aline .249927 .24114
+aline .25188 .242117
+aline .253832 .243093
+closepath
+! end of curve
+
+! start of curve
+amove .28312 .159133
+aline .285073 .158157
+aline .287025 .157181
+aline .289954 .154252
+aline .291907 .150347
+aline .291907 .781022E-02
+aline .289954 .390511E-02
+aline .287025 .976277E-03
+aline .28312 -.976277E-03
+aline .254808 -.976277E-03
+aline .250903 .976277E-03
+aline .247974 .390511E-02
+aline .246022 .781022E-02
+aline .246022 .150347
+aline .247974 .154252
+aline .250903 .157181
+aline .252856 .158157
+aline .254808 .159133
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=15 !-------------- Beginning of new char.
+dfont wid=.891672 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .104462 .246022
+aline .105438 .245046
+aline .111296 .245046
+aline .119106 .243093
+aline .122035 .242117
+aline .123987 .240164
+aline .123987 .2099
+aline .122035 .207947
+aline .11813 .207947
+bezier .110353 .221432 .085964 .228663 .781022E-01 .211852
+aline .771259E-01 .206971
+aline .761496E-01 .205994
+aline .761496E-01 .160109
+aline .771259E-01 .159133
+aline .105438 .159133
+aline .109343 .157181
+aline .112272 .154252
+aline .114224 .150347
+aline .114224 .143513
+aline .112272 .139608
+aline .109343 .136679
+aline .105438 .134726
+aline .781022E-01 .134726
+aline .771259E-01 .13375
+aline .771259E-01 .781022E-02
+aline .751733E-01 .390511E-02
+aline .722445E-01 .976277E-03
+aline .683394E-01 -.976277E-03
+aline .410036E-01 -.976277E-03
+aline .380748E-01 0
+aline .361223E-01 .976277E-03
+aline .331934E-01 .390511E-02
+aline .322171E-01 .585766E-02
+aline .312409E-01 .878649E-02
+aline .312409E-01 .13375
+aline .302646E-01 .134726
+aline .195255E-01 .134726
+aline .156204E-01 .136679
+aline .126916E-01 .139608
+aline .010739 .143513
+aline .010739 .14937
+aline .117153E-01 .152299
+aline .126916E-01 .154252
+aline .156204E-01 .157181
+aline .017573 .158157
+aline .205018E-01 .159133
+aline .302646E-01 .159133
+aline .312409E-01 .160109
+aline .312409E-01 .198184
+bezier .032571 .223118 .054968 .246056 .081031 .245046
+aline .820073E-01 .246022
+aline .104462 .246022
+closepath
+! end of curve
+
+! start of curve
+amove .204042 .246022
+aline .205018 .245046
+aline .2099 .245046
+aline .213805 .244069
+aline .219662 .242117
+aline .221615 .240164
+aline .221615 .2099
+aline .219662 .207947
+aline .215757 .207947
+bezier .210994 .217649 .196467 .227305 .187445 .21771
+aline .185493 .213805
+aline .184516 .208923
+aline .18354 .207947
+aline .18354 .160109
+aline .184516 .159133
+aline .212828 .159133
+aline .216734 .157181
+aline .219662 .154252
+aline .221615 .150347
+aline .221615 .143513
+aline .219662 .139608
+aline .216734 .136679
+aline .212828 .134726
+aline .185493 .134726
+aline .184516 .13375
+aline .184516 .781022E-02
+aline .182564 .390511E-02
+aline .179635 .976277E-03
+aline .17573 -.976277E-03
+aline .148394 -.976277E-03
+aline .145465 0
+aline .143513 .976277E-03
+aline .140584 .390511E-02
+aline .139608 .585766E-02
+aline .138631 .878649E-02
+aline .138631 .199161
+bezier .140073 .219347 .153716 .239523 .174754 .244069
+aline .178659 .245046
+aline .184516 .245046
+aline .185493 .246022
+aline .204042 .246022
+closepath
+! end of curve
+
+! start of curve
+amove .28312 .242117
+aline .285073 .24114
+aline .287025 .240164
+aline .289954 .237235
+aline .291907 .23333
+aline .291907 .781022E-02
+aline .289954 .390511E-02
+aline .287025 .976277E-03
+aline .28312 -.976277E-03
+aline .254808 -.976277E-03
+aline .250903 .976277E-03
+aline .247974 .390511E-02
+aline .246022 .781022E-02
+aline .246022 .23333
+aline .247974 .237235
+aline .250903 .240164
+aline .252856 .24114
+aline .254808 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=16 !-------------- Beginning of new char.
+dfont wid=.255557 hei=.458333 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .595529E-01 .159133
+aline .615055E-01 .158157
+aline .063458 .157181
+aline .663868E-01 .154252
+aline .683394E-01 .150347
+aline .683394E-01 .781022E-02
+aline .663868E-01 .390511E-02
+aline .063458 .976277E-03
+aline .595529E-01 -.976277E-03
+aline .322171E-01 -.976277E-03
+aline .292883E-01 0
+aline .273358E-01 .976277E-03
+aline .244069E-01 .390511E-02
+aline .234307E-01 .585766E-02
+aline .224544E-01 .878649E-02
+aline .224544E-01 .14937
+aline .234307E-01 .152299
+aline .244069E-01 .154252
+aline .273358E-01 .157181
+aline .292883E-01 .158157
+aline .322171E-01 .159133
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=17 !-------------- Beginning of new char.
+dfont wid=.286113 hei=.458333 dep=.194445 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .070292 .159133
+aline .722445E-01 .158157
+aline .741971E-01 .157181
+aline .771259E-01 .154252
+aline .790785E-01 .150347
+aline .790785E-01 -.234307E-01
+bezier .782746E-01 -.450623E-01 .642313E-01 -.685073E-01 .410036E-01 -.722445E-01
+bezier .190062E-01 -.752822E-01 -.401723E-02 -.718935E-01 -.234307E-01 -.605292E-01
+aline -.244069E-01 -.585766E-01
+aline -.244069E-01 -.556478E-01
+aline -.224544E-01 -.497901E-01
+aline -.214781E-01 -.478376E-01
+aline -.185493E-01 -.390511E-01
+aline -.165967E-01 -.370985E-01
+bezier -.227397E-02 -.415204E-01 .146447E-01 -.497536E-01 .028312 -.390511E-01
+aline .292883E-01 -.370985E-01
+aline .302646E-01 -.361223E-01
+aline .312409E-01 -.341697E-01
+aline .322171E-01 -.292883E-01
+aline .331934E-01 -.028312
+aline .331934E-01 .150347
+aline .035146 .154252
+aline .380748E-01 .157181
+aline .400274E-01 .158157
+aline .419799E-01 .159133
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=18 !-------------- Beginning of new char.
+dfont wid=.550003 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .781022E-01 .242117
+bezier .910974E-01 .2263 .102731 .209499 .115201 .193303
+aline .115201 .189398
+aline .113248 .187445
+aline .927463E-01 .187445
+bezier .732593E-01 .204422 .515176E-01 .219274 .331934E-01 .237235
+aline .331934E-01 .239188
+aline .341697E-01 .24114
+aline .361223E-01 .242117
+aline .781022E-01 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=19 !-------------- Beginning of new char.
+dfont wid=.550003 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .159133 .242117
+aline .161086 .240164
+aline .161086 .236259
+bezier .141533 .219574 .121223 .203938 .101533 .187445
+aline .820073E-01 .187445
+aline .800547E-01 .188421
+aline .790785E-01 .190374
+bezier .833613E-01 .202907 .948295E-01 .212074 .101533 .223567
+aline .103485 .22552
+aline .104462 .227473
+aline .106414 .229425
+aline .10739 .231378
+aline .109343 .23333
+aline .110319 .235283
+aline .112272 .237235
+aline .113248 .239188
+aline .116177 .242117
+aline .159133 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=20 !-------------- Beginning of new char.
+dfont wid=.550003 hei=.635417 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .615055E-01 .229425
+bezier .733859E-01 .219747 .849889E-01 .209684 .971396E-01 .200381
+bezier .10929 .209684 .120893 .219747 .132774 .229425
+aline .153276 .229425
+aline .155228 .227473
+bezier .154124 .217894 .143908 .212353 .139608 .204042
+bezier .13093 .19467 .123741 .184225 .115201 .174754
+aline .800547E-01 .174754
+bezier .652715E-01 .190003 .520829E-01 .207579 .390511E-01 .224544
+aline .390511E-01 .227473
+aline .410036E-01 .229425
+aline .615055E-01 .229425
+aline .063458 .227473
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=21 !-------------- Beginning of new char.
+dfont wid=.550003 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .468613E-01 .242117
+aline .488139E-01 .24114
+aline .507664E-01 .240164
+aline .536952E-01 .237235
+aline .556478E-01 .23333
+aline .564846E-01 .229983
+aline .576004E-01 .229425
+aline .605292E-01 .228449
+aline .654106E-01 .227473
+aline .663868E-01 .226496
+aline .751733E-01 .226496
+aline .761496E-01 .22552
+aline .11813 .22552
+aline .119106 .226496
+aline .127892 .226496
+aline .128869 .227473
+aline .13375 .228449
+aline .136679 .229425
+aline .137795 .229983
+aline .138631 .23333
+aline .140584 .237235
+aline .143513 .240164
+aline .147418 .242117
+aline .154252 .242117
+aline .158157 .240164
+bezier .17123 .226433 .156784 .204446 .14156 .199161
+aline .132774 .196232
+aline .128869 .195255
+aline .123987 .195255
+aline .123011 .194279
+aline .115201 .194279
+aline .114224 .193303
+aline .800547E-01 .193303
+bezier .624942E-01 .194929 .381423E-01 .199977 .322171E-01 .220639
+aline .312409E-01 .224544
+aline .312409E-01 .232354
+aline .322171E-01 .235283
+aline .331934E-01 .237235
+aline .361223E-01 .240164
+aline .380748E-01 .24114
+aline .410036E-01 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=22 !-------------- Beginning of new char.
+dfont wid=.550003 hei=.637776 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .164015 .230401
+aline .165967 .228449
+aline .165967 .203066
+aline .164015 .201113
+aline .312409E-01 .201113
+aline .292883E-01 .202089
+aline .028312 .204042
+aline .028312 .228449
+aline .302646E-01 .230401
+aline .164015 .230401
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=23 !-------------- Beginning of new char.
+dfont wid=.733337 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .140584 .242117
+bezier .153657 .241004 .170258 .234975 .172801 .219662
+bezier .176453 .201453 .158812 .186851 .14156 .188421
+bezier .124846 .186517 .103732 .185508 .907938E-01 .199161
+bezier .790849E-01 .213909 .887124E-01 .237504 .10739 .240164
+aline .111296 .24114
+aline .117153 .24114
+aline .11813 .242117
+aline .140584 .242117
+closepath
+! end of curve
+
+! start of curve
+amove .11813 .227473
+bezier .103783 .226594 .103783 .202968 .11813 .202089
+aline .119106 .201113
+aline .139608 .201113
+bezier .151901 .202589 .156311 .220949 .144489 .226496
+aline .140584 .227473
+aline .139608 .228449
+aline .119106 .228449
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=24 !-------------- Beginning of new char.
+dfont wid=.488892 hei=0 dep=.170138 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .106414 -.117153E-01
+aline .108367 -.126916E-01
+aline .109343 -.136679E-01
+bezier .104958 -.317853E-01 .947606E-01 -.487956E-01 .878649E-01 -.663868E-01
+aline .859124E-01 -.683394E-01
+aline .546715E-01 -.683394E-01
+bezier .485716E-01 -.617342E-01 .592887E-01 -.550891E-01 .615055E-01 -.488139E-01
+bezier .707881E-01 -.368931E-01 .773278E-01 -.222787E-01 .878649E-01 -.117153E-01
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=25 !-------------- Beginning of new char.
+dfont wid=.56528 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .117153 .246022
+bezier .138483 .24423 .166036 .237113 .174754 .213805
+bezier .183224 .189689 .174142 .159156 .151323 .146442
+bezier .173986 .131838 .187602 .104555 .187445 .781022E-01
+bezier .192706 .049289 .183329 .012006 .152299 .976277E-03
+bezier .129637 -.657081E-02 .104056 -.831403E-02 .820073E-01 .195255E-02
+aline .081031 .390511E-02
+aline .081031 .683394E-02
+aline .820073E-01 .976277E-02
+aline .829836E-01 .117153E-01
+aline .849361E-01 .017573
+aline .878649E-01 .234307E-01
+aline .898175E-01 .244069E-01
+bezier .102932 .210692E-01 .11738 .154028E-01 .129845 .244069E-01
+aline .131797 .253832E-01
+aline .13375 .273358E-01
+aline .134726 .292883E-01
+aline .135703 .302646E-01
+aline .137655 .341697E-01
+aline .139608 .419799E-01
+aline .140584 .429562E-01
+aline .140584 .488139E-01
+aline .14156 .497901E-01
+aline .14156 .800547E-01
+bezier .139168 .975252E-01 .135035 .121027 .116177 .129845
+aline .10739 .132774
+aline .106414 .13375
+aline .101533 .13375
+aline .100557 .134726
+aline .927463E-01 .134726
+aline .907938E-01 .136679
+aline .907938E-01 .156204
+aline .917701E-01 .158157
+aline .937226E-01 .159133
+aline .102509 .159133
+aline .103485 .160109
+aline .108367 .160109
+aline .109343 .161086
+bezier .131307 .166032 .134481 .193332 .127892 .210876
+bezier .11813 .224375 .979556E-01 .222833 .839598E-01 .219662
+aline .781022E-01 .21771
+aline .771259E-01 .216734
+aline .751733E-01 .215757
+aline .732208E-01 .213805
+aline .722445E-01 .211852
+aline .712682E-01 .210876
+aline .070292 .207947
+aline .693157E-01 .203066
+aline .683394E-01 .202089
+aline .683394E-01 .781022E-02
+aline .663868E-01 .390511E-02
+aline .063458 .976277E-03
+aline .595529E-01 -.976277E-03
+aline .322171E-01 -.976277E-03
+aline .292883E-01 0
+aline .273358E-01 .976277E-03
+aline .244069E-01 .390511E-02
+aline .234307E-01 .585766E-02
+aline .224544E-01 .878649E-02
+aline .224544E-01 .204042
+bezier .266923E-01 .231862 .567926E-01 .245989 .820073E-01 .245046
+aline .829836E-01 .246022
+aline .117153 .246022
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=26 !-------------- Beginning of new char.
+dfont wid=.794449 hei=.458333 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .10739 .164991
+aline .108367 .164015
+aline .115201 .164015
+aline .116177 .163038
+aline .121058 .163038
+aline .124963 .162062
+aline .130821 .160109
+aline .142536 .154252
+aline .143513 .153276
+aline .145465 .152299
+aline .147418 .151648
+bezier .175007 .167646 .210434 .170418 .239188 .156204
+bezier .264017 .141203 .270056 .109738 .268476 .829836E-01
+aline .266524 .790785E-01
+aline .263595 .761496E-01
+aline .25969 .741971E-01
+aline .164991 .741971E-01
+aline .164015 .732208E-01
+bezier .164748 .537456E-01 .170028 .265922E-01 .193303 .214781E-01
+bezier .216461 .147053E-01 .24254 .270163E-01 .25969 .439325E-01
+aline .262619 .439325E-01
+aline .264571 .419799E-01
+aline .264571 .035146
+aline .265547 .341697E-01
+aline .265547 .234307E-01
+aline .266524 .224544E-01
+aline .266524 .146442E-01
+bezier .236167 -.838074E-02 .194453 -.100212E-01 .160109 .292883E-02
+aline .152299 .683394E-02
+aline .151323 .781022E-02
+aline .14937 .878649E-02
+aline .148394 .976277E-02
+aline .146442 .010739
+aline .144489 .126916E-01
+aline .142536 .136679E-01
+aline .14156 .146442E-01
+bezier .123858 -.113921E-02 .982474E-01 -.219369E-02 .771259E-01 -.488139E-02
+aline .052719 -.488139E-02
+bezier .235696E-01 -.177094E-02 -.295293E-04 .345531E-01 .017573 .605292E-01
+bezier .391431E-01 .840168E-01 .744948E-01 .835973E-01 .102509 .868887E-01
+aline .116177 .868887E-01
+aline .117153 .878649E-01
+aline .117153 .11813
+bezier .115543 .127687 .110894 .140804 .098604 .14156
+bezier .761055E-01 .145652 .051305 .135205 .361223E-01 .117153
+aline .341697E-01 .116177
+aline .322171E-01 .116177
+aline .302646E-01 .117153
+aline .292883E-01 .119106
+aline .292883E-01 .124963
+aline .028312 .12594
+aline .028312 .138631
+aline .273358E-01 .139608
+aline .273358E-01 .147418
+aline .028312 .14937
+bezier .525372E-01 .163947 .798715E-01 .166038 .10739 .164991
+closepath
+! end of curve
+
+! start of curve
+amove .194279 .139608
+bezier .1715 .137109 .164275 .109968 .164991 .917701E-01
+aline .228449 .917701E-01
+aline .229425 .927463E-01
+bezier .229021 .10742 .227858 .122765 .21771 .134726
+aline .215757 .135703
+aline .214781 .136679
+aline .212828 .137655
+aline .2099 .138631
+aline .205994 .139608
+aline .205018 .140584
+aline .195255 .140584
+closepath
+! end of curve
+
+! start of curve
+amove .115201 .683394E-01
+bezier .975891E-01 .681868E-01 .791145E-01 .065146 .063458 .556478E-01
+bezier .493789E-01 .445897E-01 .600886E-01 .224083E-01 .761496E-01 .205018E-01
+aline .771259E-01 .195255E-01
+bezier .938081E-01 .019159 .113909 .231377E-01 .123011 .390511E-01
+aline .123011 .439325E-01
+aline .122035 .449088E-01
+aline .121058 .478376E-01
+aline .119106 .556478E-01
+aline .11813 .605292E-01
+aline .11813 .673631E-01
+aline .116177 .693157E-01
+aline .115201 .683394E-01
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=27 !-------------- Beginning of new char.
+dfont wid=.85556 hei=.458333 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .111296 .164991
+bezier .128892 .163416 .148441 .157864 .162062 .145465
+bezier .186116 .166992 .222488 .169513 .25188 .160109
+bezier .283095 .149243 .292199 .112481 .289954 .829836E-01
+aline .288002 .790785E-01
+aline .285073 .761496E-01
+aline .281168 .741971E-01
+aline .186469 .741971E-01
+aline .185493 .732208E-01
+bezier .186226 .537456E-01 .191506 .265922E-01 .214781 .214781E-01
+bezier .237939 .147054E-01 .264018 .270159E-01 .281168 .439325E-01
+aline .284097 .439325E-01
+aline .286049 .419799E-01
+aline .286049 .035146
+aline .287025 .341697E-01
+aline .287025 .234307E-01
+aline .288002 .224544E-01
+aline .288002 .146442E-01
+bezier .257646 -.838051E-02 .215932 -.100214E-01 .181588 .292883E-02
+aline .173777 .683394E-02
+aline .172801 .781022E-02
+aline .170849 .878649E-02
+aline .169872 .976277E-02
+aline .16792 .010739
+aline .165967 .126916E-01
+aline .16255 .144001E-01
+bezier .134678 -.800731E-02 .960462E-01 -.80315E-02 .063458 -.976277E-03
+bezier .335479E-01 .661668E-02 .122937E-01 .362611E-01 .126916E-01 .663868E-01
+bezier .821227E-02 .098012 .159436E-01 .138174 .478376E-01 .154252
+bezier .06736 .165749 .892674E-01 .165132 .111296 .164991
+closepath
+! end of curve
+
+! start of curve
+amove .907938E-01 .139608
+bezier .740829E-01 .139658 .601597E-01 .125016 .585766E-01 .108367
+aline .576004E-01 .10739
+aline .576004E-01 .995803E-01
+aline .566241E-01 .098604
+aline .566241E-01 .644343E-01
+bezier .584543E-01 .475773E-01 .649219E-01 .241526E-01 .859124E-01 .214781E-01
+bezier .105843 .145645E-01 .132728 .256233E-01 .135703 .488139E-01
+aline .136679 .497901E-01
+aline .136679 .546715E-01
+aline .137655 .556478E-01
+aline .137655 .624817E-01
+aline .138631 .063458
+aline .138631 .995803E-01
+bezier .136757 .115277 .130294 .135802 .111296 .138631
+aline .110319 .139608
+aline .105438 .139608
+aline .104462 .140584
+aline .917701E-01 .140584
+aline .907938E-01 .139608
+closepath
+! end of curve
+
+! start of curve
+amove .215757 .139608
+bezier .192978 .137109 .185753 .109968 .186469 .917701E-01
+aline .249927 .917701E-01
+aline .250903 .927463E-01
+bezier .250499 .10742 .249337 .122765 .239188 .134726
+aline .237235 .135703
+aline .236259 .136679
+aline .234307 .137655
+aline .231378 .138631
+aline .227473 .139608
+aline .226496 .140584
+aline .216734 .140584
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=28 !-------------- Beginning of new char.
+dfont wid=.550003 hei=.555555 dep=.0972233 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .164991 .205994
+bezier .175589 .203586 .177333 .189613 .169872 .182564
+bezier .165013 .171674 .155935 .161068 .153276 .150347
+bezier .184648 .126516 .186076 .829962E-01 .179635 .478376E-01
+bezier .173005 .162947E-01 .141216 -.485201E-02 .110319 -.390511E-02
+aline .109343 -.488139E-02
+aline .849361E-01 -.488139E-02
+aline .839598E-01 -.390511E-02
+aline .761496E-01 -.390511E-02
+aline .751733E-01 -.292883E-02
+aline .070292 -.292883E-02
+aline .673631E-01 -.234307E-02
+aline .649767E-01 -.282037E-02
+bezier .558628E-01 -.017322 .495789E-01 -.345303E-01 .380748E-01 -.468613E-01
+bezier .283498E-01 -.518765E-01 .160049E-01 -.415242E-01 .205018E-01 -.312409E-01
+bezier .279012E-01 -.181623E-01 .347916E-01 -.471684E-02 .429562E-01 .781022E-02
+bezier .120224E-01 .264693E-01 .797445E-02 .683006E-01 .136679E-01 .995803E-01
+bezier .149003E-01 .135852 .486958E-01 .165148 .839598E-01 .164015
+aline .849361E-01 .164991
+aline .109343 .164991
+aline .110319 .164015
+aline .117153 .164015
+aline .11813 .163038
+aline .123011 .163038
+aline .126916 .162062
+aline .12838 .16133
+bezier .139227 .174278 .144154 .193043 .156204 .205018
+aline .159133 .205994
+closepath
+! end of curve
+
+! start of curve
+amove .888412E-01 .139608
+bezier .706632E-01 .139302 .562952E-01 .123536 .546715E-01 .105438
+aline .536952E-01 .104462
+aline .536952E-01 .966514E-01
+aline .052719 .956752E-01
+aline .052719 .605292E-01
+aline .536952E-01 .595529E-01
+aline .536952E-01 .052719
+aline .546715E-01 .517427E-01
+aline .556478E-01 .468613E-01
+aline .576004E-01 .410036E-01
+aline .585766E-01 .390511E-01
+aline .595529E-01 .380748E-01
+bezier .779153E-01 .709717E-01 .097259 .103381 .114875 .136679
+aline .114491 .137833
+aline .111296 .138631
+aline .110319 .139608
+aline .105438 .139608
+aline .104462 .140584
+aline .898175E-01 .140584
+aline .888412E-01 .139608
+closepath
+! end of curve
+
+! start of curve
+amove .13375 .11813
+bezier .115201 .864721E-01 .097823 .539713E-01 .790785E-01 .224544E-01
+bezier .100083 .147513E-01 .133065 .203969E-01 .138631 .468613E-01
+aline .139608 .517427E-01
+aline .140584 .052719
+aline .140584 .595529E-01
+aline .14156 .605292E-01
+aline .14156 .956752E-01
+aline .140584 .966514E-01
+aline .140584 .104462
+aline .139608 .105438
+aline .138631 .110319
+aline .135703 .119106
+aline .134726 .120082
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=29 !-------------- Beginning of new char.
+dfont wid=.947227 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .302646 .242117
+aline .304598 .24114
+aline .306551 .240164
+aline .30948 .237235
+aline .311432 .23333
+aline .311432 .214781
+aline .30948 .210876
+aline .306551 .207947
+aline .302646 .205994
+aline .270429 .205994
+aline .269453 .206971
+aline .214781 .206971
+aline .213805 .205994
+aline .213805 .14156
+aline .214781 .140584
+aline .291907 .140584
+aline .295812 .138631
+aline .298741 .135703
+aline .300693 .131797
+aline .300693 .117153
+aline .298741 .113248
+aline .295812 .110319
+aline .291907 .108367
+aline .214781 .108367
+aline .213805 .10739
+aline .213805 .361223E-01
+aline .215269 .03539
+aline .216734 .361223E-01
+aline .273358 .361223E-01
+aline .274334 .370985E-01
+aline .307527 .370985E-01
+aline .311432 .035146
+aline .314361 .322171E-01
+aline .316314 .028312
+aline .316314 .781022E-02
+aline .314361 .390511E-02
+aline .311432 .976277E-03
+aline .307527 -.976277E-03
+aline .172801 -.976277E-03
+aline .169872 0
+aline .16792 .976277E-03
+aline .164991 .390511E-02
+aline .164015 .585766E-02
+aline .163038 .878649E-02
+aline .163038 .654106E-01
+aline .162062 .663868E-01
+aline .878649E-01 .663868E-01
+bezier .788074E-01 .467829E-01 .071929 .262764E-01 .624817E-01 .683394E-02
+aline .585766E-01 .292883E-02
+aline .566241E-01 .195255E-02
+aline .556478E-01 .976277E-03
+aline .497901E-01 -.976277E-03
+aline .224544E-01 -.976277E-03
+bezier .938126E-02 .595446E-02 .219189E-01 .205099E-01 .244069E-01 .302646E-01
+bezier .530767E-01 .980944E-01 .799551E-01 .166958 .109343 .234307
+aline .113248 .238212
+aline .115201 .239188
+aline .116177 .240164
+aline .11813 .24114
+aline .122035 .242117
+closepath
+! end of curve
+
+! start of curve
+amove .145465 .206971
+bezier .131101 .169962 .113239 .131666 .100557 .956752E-01
+aline .162062 .956752E-01
+aline .163038 .966514E-01
+aline .163038 .206971
+aline .162062 .207947
+aline .146442 .207947
+aline .145465 .206971
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=30 !-------------- Beginning of new char.
+dfont wid=1.06945 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .150347 .249927
+bezier .166188 .247071 .182343 .244972 .198184 .242117
+aline .345602 .242117
+aline .349507 .240164
+aline .352436 .237235
+aline .354389 .23333
+aline .354389 .214781
+aline .352436 .210876
+aline .349507 .207947
+aline .345602 .205994
+aline .307527 .205994
+aline .306551 .206971
+aline .24114 .206971
+aline .240164 .207947
+aline .234307 .207947
+aline .23333 .206971
+aline .23333 .14156
+aline .234307 .140584
+aline .334863 .140584
+aline .338768 .138631
+aline .341697 .135703
+aline .34365 .131797
+aline .34365 .117153
+aline .341697 .113248
+aline .338768 .110319
+aline .334863 .108367
+aline .234307 .108367
+aline .23333 .10739
+aline .23333 .361223E-01
+aline .234307 .035146
+aline .24114 .035146
+aline .242117 .361223E-01
+aline .310456 .361223E-01
+aline .311432 .370985E-01
+aline .350484 .370985E-01
+aline .354389 .035146
+aline .357317 .322171E-01
+aline .35927 .028312
+aline .35927 .781022E-02
+aline .357317 .390511E-02
+aline .354389 .976277E-03
+aline .350484 -.976277E-03
+aline .198184 -.976277E-03
+bezier .174203 -.46082E-02 .151047 -.01023 .124963 -.878649E-02
+bezier .900877E-01 -.677245E-02 .489387E-01 .674907E-02 .302646E-01 .400274E-01
+bezier .176622E-01 .587116E-01 .138411E-01 .825459E-01 .117153E-01 .103485
+aline .117153E-01 .13375
+bezier .138463E-01 .166919 .246986E-01 .206174 .546715E-01 .226496
+bezier .821893E-01 .247912 .117251 .250337 .150347 .249927
+closepath
+! end of curve
+
+! start of curve
+amove .129845 .224544
+bezier .989471E-01 .223386 .722811E-01 .199431 .663868E-01 .168896
+aline .644343E-01 .159133
+aline .063458 .158157
+aline .063458 .152299
+aline .624817E-01 .151323
+aline .624817E-01 .142536
+aline .615055E-01 .14156
+aline .615055E-01 .10739
+bezier .638376E-01 .747262E-01 .756035E-01 .319978E-01 .112272 .205018E-01
+bezier .130938 .146328E-01 .151875 .123727E-01 .169872 .214781E-01
+aline .17573 .273358E-01
+aline .177682 .312409E-01
+aline .179635 .370985E-01
+aline .180611 .410036E-01
+aline .181588 .419799E-01
+aline .181588 .468613E-01
+aline .182564 .478376E-01
+aline .182564 .566241E-01
+aline .18354 .576004E-01
+aline .18354 .18354
+bezier .181401 .197138 .180341 .217852 .163038 .222591
+aline .159133 .223567
+aline .158157 .224544
+aline .153276 .224544
+aline .152299 .22552
+aline .130821 .22552
+aline .129845 .224544
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=31 !-------------- Beginning of new char.
+dfont wid=.85556 hei=.743055 dep=.0486116 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .235283 .272381
+aline .237235 .271405
+aline .238212 .270429
+aline .240164 .269453
+aline .242117 .2675
+bezier .250257 .253868 .232469 .242425 .231378 .230401
+bezier .263066 .210236 .278268 .170577 .278239 .134726
+aline .279215 .13375
+aline .279215 .103485
+bezier .277386 .678642E-01 .262397 .276593E-01 .229425 .878649E-02
+bezier .209989 -.309171E-02 .186814 -.654389E-02 .165967 -.878649E-02
+aline .135703 -.878649E-02
+bezier .123314 -.675056E-02 .110557 -.622251E-02 .976277E-01 -.234306E-02
+aline .952413E-01 -.282035E-02
+bezier .881305E-01 -.118689E-01 .858827E-01 -.256718E-01 .751733E-01 -.312409E-01
+aline .663868E-01 -.312409E-01
+aline .644343E-01 -.302646E-01
+aline .063458 -.292883E-01
+aline .615055E-01 -.028312
+aline .595529E-01 -.263595E-01
+bezier .518705E-01 -.129792E-01 .679898E-01 -.16633E-02 .706174E-01 .100882E-01
+bezier .383886E-01 .028834 .244279E-01 .068705 .224544E-01 .103485
+aline .224544E-01 .13375
+bezier .245853E-01 .166919 .354377E-01 .206174 .654106E-01 .226496
+bezier .972062E-01 .250786 .138172 .251313 .17573 .248951
+aline .176706 .247974
+aline .182564 .247974
+aline .18354 .246998
+aline .188421 .246998
+aline .193303 .246022
+aline .197208 .245046
+aline .200137 .244069
+aline .204042 .243093
+aline .205018 .242117
+bezier .213144 .25138 .215162 .266318 .226496 .272381
+closepath
+! end of curve
+
+! start of curve
+amove .138631 .224544
+bezier .112131 .223282 .852439E-01 .207792 .761496E-01 .181588
+aline .732208E-01 .172801
+aline .712682E-01 .164991
+aline .070292 .164015
+aline .070292 .159133
+aline .693157E-01 .158157
+aline .693157E-01 .152299
+aline .683394E-01 .151323
+aline .683394E-01 .140584
+aline .673631E-01 .139608
+aline .673631E-01 .098604
+bezier .695504E-01 .787334E-01 .731993E-01 .552515E-01 .878649E-01 .390511E-01
+bezier .122504 .982623E-01 .157753 .158343 .190765 .217905
+aline .188421 .218686
+aline .186469 .219662
+aline .18354 .220639
+aline .17573 .222591
+aline .170849 .223567
+aline .169872 .224544
+aline .163038 .224544
+aline .162062 .22552
+aline .139608 .22552
+aline .138631 .224544
+closepath
+! end of curve
+
+! start of curve
+amove .211852 .199161
+bezier .178304 .140612 .14295 .081808 .11097 .231052E-01
+bezier .141554 .010991 .177745 .125703E-01 .205994 .312409E-01
+bezier .226415 .474717E-01 .232119 .752414E-01 .234307 .098604
+aline .234307 .139608
+bezier .232092 .160039 .22884 .184501 .213317 .200869
+aline .212503 .200462
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=32 !-------------- Beginning of new char.
+dfont wid=.255557 hei=.458333 dep=0 italic=0
+dfont fby="L" kadd=-.293057
+dfont fby="l" kadd=-.255557
+set path ! start of curve
+newpath
+! start of curve
+amove .102509 .144489
+aline .104462 .143513
+aline .106414 .142536
+aline .110319 .138631
+aline .111296 .135703
+aline .111296 .128869
+bezier .106507 .115589 .896348E-01 .12035 .800547E-01 .116177
+bezier .489073E-01 .111917 .194255E-01 .104724 -.117153E-01 .101533
+aline -.156204E-01 .103485
+aline -.195255E-01 .10739
+aline -.205018E-01 .110319
+aline -.205018E-01 .117153
+bezier -.157143E-01 .130433 .115938E-02 .125672 .010739 .129845
+bezier .394936E-01 .134424 .675824E-01 .139152 .956752E-01 .144489
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=33 !-------------- Beginning of new char.
+dfont wid=.366669 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .859124E-01 .242117
+aline .878649E-01 .240164
+aline .878649E-01 .219662
+aline .868887E-01 .218686
+aline .868887E-01 .182564
+aline .859124E-01 .181588
+aline .859124E-01 .145465
+aline .849361E-01 .144489
+aline .849361E-01 .108367
+aline .839598E-01 .10739
+aline .839598E-01 .722445E-01
+aline .829836E-01 .070292
+aline .081031 .683394E-01
+aline .497901E-01 .683394E-01
+aline .478376E-01 .070292
+aline .468613E-01 .722445E-01
+aline .468613E-01 .10739
+aline .045885 .108367
+aline .045885 .144489
+aline .449088E-01 .145465
+aline .449088E-01 .181588
+aline .439325E-01 .182564
+aline .439325E-01 .218686
+aline .429562E-01 .219662
+aline .429562E-01 .239188
+aline .439325E-01 .24114
+aline .045885 .242117
+aline .859124E-01 .242117
+closepath
+! end of curve
+
+! start of curve
+amove .790785E-01 .439325E-01
+aline .081031 .429562E-01
+aline .829836E-01 .419799E-01
+aline .859124E-01 .390511E-01
+aline .878649E-01 .035146
+aline .878649E-01 .781022E-02
+aline .859124E-01 .390511E-02
+aline .829836E-01 .976277E-03
+aline .790785E-01 -.976277E-03
+aline .052719 -.976277E-03
+aline .497901E-01 0
+aline .478376E-01 .976277E-03
+aline .449088E-01 .390511E-02
+aline .439325E-01 .585766E-02
+aline .429562E-01 .878649E-02
+aline .429562E-01 .035146
+aline .449088E-01 .390511E-01
+aline .478376E-01 .419799E-01
+aline .497901E-01 .429562E-01
+aline .517427E-01 .439325E-01
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=34 !-------------- Beginning of new char.
+dfont wid=.558336 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .566241E-01 .242117
+aline .585766E-01 .240164
+aline .585766E-01 .199161
+bezier .049633 .186579 .429256E-01 .17167 .331934E-01 .160109
+aline .165967E-01 .160109
+aline .146442E-01 .161086
+aline .136679E-01 .163038
+bezier .016109 .174409 .237543E-01 .186948 .253832E-01 .197208
+aline .156204E-01 .197208
+aline .136679E-01 .199161
+aline .136679E-01 .240164
+aline .156204E-01 .242117
+aline .566241E-01 .242117
+closepath
+! end of curve
+
+! start of curve
+amove .134726 .242117
+aline .136679 .240164
+aline .136679 .199161
+bezier .127735 .186579 .121028 .171671 .111296 .160109
+aline .946989E-01 .160109
+aline .927463E-01 .161086
+aline .917701E-01 .163038
+bezier .942108E-01 .174409 .101858 .186949 .103485 .197208
+aline .937226E-01 .197208
+aline .917701E-01 .199161
+aline .917701E-01 .240164
+aline .937226E-01 .242117
+aline .134726 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=35 !-------------- Beginning of new char.
+dfont wid=.916672 hei=.694445 dep=.194443 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .164991 .242117
+bezier .177491 .23915 .177497 .224386 .172801 .214781
+bezier .166823 .190377 .157908 .165557 .153276 .14156
+aline .204042 .14156
+bezier .214327 .173139 .220661 .206417 .232354 .237235
+bezier .241432 .248764 .261605 .238987 .257737 .224544
+bezier .250406 .196995 .240964 .168791 .235283 .14156
+aline .288002 .14156
+bezier .302876 .140388 .30546 .117116 .290931 .113248
+aline .22552 .113248
+bezier .220694 .954881E-01 .213811 .770668E-01 .210876 .595529E-01
+aline .290931 .595529E-01
+bezier .30546 .556842E-01 .302876 .324134E-01 .288002 .312409E-01
+aline .201113 .312409E-01
+bezier .190828 -.338434E-03 .184494 -.033616 .172801 -.644343E-01
+bezier .163723 -.759629E-01 .14355 -.661862E-01 .147418 -.517427E-01
+bezier .154749 -.241945E-01 .164191 .400969E-02 .169872 .312409E-01
+aline .119106 .312409E-01
+bezier .10882 -.338384E-03 .102487 -.336155E-01 .907938E-01 -.644343E-01
+bezier .817154E-01 -.759629E-01 .615428E-01 -.661861E-01 .654106E-01 -.517427E-01
+bezier .727422E-01 -.241945E-01 .821833E-01 .401039E-02 .878649E-01 .312409E-01
+aline .035146 .312409E-01
+bezier .203524E-01 .324666E-01 .175956E-01 .554717E-01 .322171E-01 .595529E-01
+aline .976277E-01 .595529E-01
+bezier .102454 .773126E-01 .109337 .957344E-01 .112272 .113248
+aline .322171E-01 .113248
+bezier .175958E-01 .11733 .203523E-01 .140335 .035146 .14156
+aline .122035 .14156
+bezier .13232 .17314 .138654 .206417 .150347 .237235
+aline .152299 .239188
+aline .154252 .240164
+aline .155228 .24114
+aline .158157 .242117
+closepath
+! end of curve
+
+! start of curve
+amove .142536 .110319
+bezier .138243 .934748E-01 .131468 .760923E-01 .128869 .595529E-01
+aline .179635 .595529E-01
+bezier .184461 .773128E-01 .191344 .957341E-01 .194279 .113248
+aline .143513 .113248
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=36 !-------------- Beginning of new char.
+dfont wid=.550003 hei=.75 dep=.0555553 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .100557 .261642
+aline .102509 .260666
+aline .104462 .25969
+aline .10739 .256761
+aline .109343 .252856
+aline .109343 .246998
+aline .111296 .245046
+aline .11813 .245046
+aline .127892 .243093
+aline .139608 .239188
+aline .155228 .231378
+aline .156204 .230401
+aline .160109 .228449
+aline .161086 .227473
+aline .163038 .226496
+aline .164991 .224544
+aline .164991 .219662
+aline .164015 .218686
+aline .164015 .213805
+aline .163038 .212828
+aline .163038 .207947
+aline .162062 .203066
+aline .161086 .202089
+aline .161086 .197208
+aline .160109 .193303
+aline .159133 .19135
+aline .157181 .190374
+aline .154252 .190374
+bezier .141902 .200757 .126174 .210556 .109343 .2099
+aline .109343 .14937
+bezier .142476 .143385 .168719 .113816 .171825 .081031
+bezier .173915 .524906E-01 .167141 .186232E-01 .139608 .390511E-02
+aline .135703 .195255E-02
+aline .132774 .976277E-03
+aline .130821 0
+aline .124963 -.195255E-02
+aline .121058 -.292883E-02
+aline .116177 -.390511E-02
+aline .110319 -.390511E-02
+aline .109343 -.488139E-02
+aline .109343 -.117153E-01
+aline .10739 -.156204E-01
+aline .104462 -.185493E-01
+aline .100557 -.205018E-01
+aline .946989E-01 -.205018E-01
+aline .917701E-01 -.195255E-01
+aline .898175E-01 -.185493E-01
+aline .868887E-01 -.156204E-01
+aline .859124E-01 -.136679E-01
+aline .849361E-01 -.010739
+aline .849361E-01 -.488139E-02
+bezier .615778E-01 -.238524E-02 .037086 .639585E-02 .185493E-01 .214781E-01
+bezier .197611E-01 .328794E-01 .212799E-01 .442093E-01 .244069E-01 .556478E-01
+aline .253832E-01 .566241E-01
+aline .273358E-01 .576004E-01
+bezier .427014E-01 .460961E-01 .597856E-01 .339648E-01 .800547E-01 .312409E-01
+aline .824954E-01 .306307E-01
+aline .849361E-01 .312409E-01
+aline .849361E-01 .101533
+bezier .461823E-01 .107525 .151239E-01 .147156 .234307E-01 .185493
+bezier .224001E-01 .217836 .519034E-01 .246072 .839598E-01 .245046
+aline .849361E-01 .246022
+aline .849361E-01 .25188
+aline .859124E-01 .254808
+aline .868887E-01 .256761
+aline .898175E-01 .25969
+aline .917701E-01 .260666
+aline .946989E-01 .261642
+closepath
+! end of curve
+
+! start of curve
+amove .829836E-01 .2099
+bezier .589681E-01 .205946 .558117E-01 .170147 .761496E-01 .159133
+aline .771259E-01 .158157
+aline .081031 .156204
+aline .829836E-01 .155553
+aline .849361E-01 .156204
+aline .849361E-01 .2099
+aline .839598E-01 .210876
+closepath
+! end of curve
+
+! start of curve
+amove .109343 .946989E-01
+aline .109343 .322171E-01
+aline .111296 .315663E-01
+bezier .140087 .399062E-01 .137266 .854216E-01 .110807 .954311E-01
+aline .109343 .946989E-01
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=37 !-------------- Beginning of new char.
+dfont wid=1.02912 hei=.75 dep=.0555553 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .956752E-01 .261642
+bezier .119986 .260296 .142063 .241404 .146442 .216734
+bezier .150701 .187505 .151265 .150133 .123987 .130821
+bezier .101367 .117317 .719618E-01 .117533 .488139E-01 .129845
+bezier .198382E-01 .148097 .199146E-01 .186987 .244069E-01 .216734
+bezier .289555E-01 .241729 .051575 .260292 .761496E-01 .261642
+aline .956752E-01 .261642
+closepath
+! end of curve
+
+! start of curve
+amove .280192 .261642
+bezier .292855 .258738 .29405 .241949 .285073 .234307
+bezier .220699 .150537 .159192 .639757E-01 .937226E-01 -.185493E-01
+aline .927463E-01 -.195255E-01
+aline .898175E-01 -.205018E-01
+aline .829836E-01 -.205018E-01
+aline .790785E-01 -.185493E-01
+aline .741971E-01 -.136679E-01
+bezier .665544E-01 .750163E-03 .841217E-01 .110274E-01 .898175E-01 .224544E-01
+bezier .150324 .10108 .207629 .182012 .269453 .25969
+aline .271405 .260666
+aline .273358 .261642
+closepath
+! end of curve
+
+! start of curve
+amove .081031 .236259
+bezier .670267E-01 .234543 .654577E-01 .218232 .063458 .207947
+aline .063458 .174754
+bezier .654578E-01 .164469 .670262E-01 .148158 .081031 .146442
+bezier .948396E-01 .141673 .106333 .156662 .10739 .169872
+bezier .110841 .188428 .110943 .209591 .102509 .227473
+aline .100557 .229425
+aline .995803E-01 .231378
+aline .098604 .232354
+aline .966514E-01 .23333
+aline .956752E-01 .234307
+aline .937226E-01 .235283
+aline .898175E-01 .236259
+aline .888412E-01 .237235
+aline .820073E-01 .237235
+aline .081031 .236259
+closepath
+! end of curve
+
+! start of curve
+amove .287025 .120082
+bezier .311337 .118737 .333414 .998434E-01 .337792 .751733E-01
+bezier .342051 .459447E-01 .342615 .85733E-02 .315338 -.010739
+bezier .292719 -.242433E-01 .263312 -.240267E-01 .240164 -.117153E-01
+bezier .211188 .653711E-02 .211266 .454252E-01 .215757 .751733E-01
+bezier .220306 .100168 .242925 .118732 .2675 .120082
+aline .287025 .120082
+closepath
+! end of curve
+
+! start of curve
+amove .272381 .946989E-01
+bezier .258376 .929821E-01 .256809 .766705E-01 .254808 .663868E-01
+aline .254808 .331934E-01
+bezier .256809 .229097E-01 .258376 .659813E-02 .272381 .488139E-02
+bezier .286192 .113595E-03 .297683 .151026E-01 .298741 .028312
+bezier .30219 .468675E-01 .302294 .680312E-01 .293859 .859124E-01
+aline .291907 .878649E-01
+aline .290931 .898175E-01
+aline .289954 .907938E-01
+aline .288002 .917701E-01
+aline .287025 .927463E-01
+aline .285073 .937226E-01
+aline .281168 .946989E-01
+aline .280192 .956752E-01
+aline .273358 .956752E-01
+aline .272381 .946989E-01
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=38 !-------------- Beginning of new char.
+dfont wid=.830561 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .128869 .249927
+bezier .165992 .246615 .194243 .20035 .171825 .16792
+bezier .157857 .14784 .137502 .133379 .11813 .119106
+bezier .117335 .112634 .124491 .107486 .126916 .101533
+bezier .139419 .862237E-01 .151086 .697718E-01 .166455 .568681E-01
+bezier .196061 .802684E-01 .213025 .115706 .224544 .151323
+aline .226496 .152299
+aline .229425 .152299
+aline .252856 .146442
+aline .255785 .145465
+aline .257737 .143513
+bezier .248802 .10152 .224718 .063758 .194279 .341697E-01
+bezier .216438 .213276E-01 .241528 .242333E-01 .264571 .331934E-01
+aline .268476 .331934E-01
+aline .270429 .312409E-01
+aline .270429 -.976277E-03
+aline .268476 -.292883E-02
+bezier .233118 -.135503E-01 .193454 -.106296E-01 .161574 .010495
+bezier .12605 -.78593E-02 .824148E-01 -.182516E-01 .045885 .195255E-02
+bezier .162671E-01 .176012E-01 .669737E-02 .629147E-01 .322171E-01 .868887E-01
+bezier .429663E-01 .099372 .058964 .106199 .712682E-01 .117153
+bezier .058752 .144613 .523862E-01 .175329 .595529E-01 .205018
+bezier .674376E-01 .228574 .885295E-01 .246441 .113248 .249927
+closepath
+! end of curve
+
+! start of curve
+amove .116177 .224544
+bezier .940923E-01 .217449 .929849E-01 .189024 .976277E-01 .170849
+aline .995803E-01 .161086
+aline .101533 .153276
+aline .105243 .142146
+bezier .126486 .153962 .147577 .180955 .138631 .205994
+aline .135703 .214781
+aline .134726 .215757
+aline .132774 .219662
+aline .129845 .222591
+aline .12594 .224544
+aline .124963 .22552
+aline .117153 .22552
+closepath
+! end of curve
+
+! start of curve
+amove .081031 .927463E-01
+bezier .633772E-01 .828079E-01 .609397E-01 .575737E-01 .683394E-01 .410036E-01
+bezier .713666E-01 .287073E-01 .854628E-01 .219903E-01 .966514E-01 .263595E-01
+aline .103485 .263595E-01
+aline .104462 .273358E-01
+aline .109343 .273358E-01
+aline .110319 .028312
+aline .122035 .312409E-01
+aline .127892 .331934E-01
+aline .129194 .338443E-01
+aline .129601 .346578E-01
+bezier .112309 .530811E-01 .958884E-01 .072434 .824954E-01 .934785E-01
+aline .081031 .927463E-01
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=39 !-------------- Beginning of new char.
+dfont wid=.305557 hei=.694445 dep=0 italic=0
+dfont fby=33 kadd=.122223
+dfont fby=39 ligrep=34
+dfont fby="?" kadd=.122223
+set path ! start of curve
+newpath
+! start of curve
+amove .751733E-01 .242117
+aline .771259E-01 .240164
+aline .771259E-01 .199161
+bezier .681822E-01 .186579 .614749E-01 .17167 .517427E-01 .160109
+aline .035146 .160109
+aline .331934E-01 .161086
+aline .322171E-01 .163038
+bezier .346584E-01 .174409 .423035E-01 .186948 .439325E-01 .197208
+aline .341697E-01 .197208
+aline .322171E-01 .199161
+aline .322171E-01 .240164
+aline .341697E-01 .242117
+aline .751733E-01 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=40 !-------------- Beginning of new char.
+dfont wid=.42778 hei=.75 dep=.25 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .126916 .261642
+aline .128869 .25969
+bezier .127877 .250907 .11845 .245044 .114224 .237235
+bezier .917048E-01 .203141 .830872E-01 .160775 .790785E-01 .123011
+aline .790785E-01 .108367
+aline .781022E-01 .10739
+aline .781022E-01 .654106E-01
+aline .790785E-01 .644343E-01
+bezier .797556E-01 .215182E-01 .892507E-01 -.022832 .112272 -.615055E-01
+bezier .117543 -.688529E-01 .122687 -.762924E-01 .128869 -.829836E-01
+aline .128869 -.868887E-01
+aline .126916 -.888412E-01
+aline .106414 -.888412E-01
+bezier .576996E-01 -.522656E-01 .343255E-01 .116042E-01 .312409E-01 .693157E-01
+aline .312409E-01 .103485
+bezier .343254E-01 .161196 .057699 .225066 .106414 .261642
+aline .126916 .261642
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=")" !-------------- Beginning of new char.
+dfont wid=.42778 hei=.75 dep=.25 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .449088E-01 .261642
+bezier .936241E-01 .225066 .116997 .161196 .120082 .103485
+aline .120082 .693157E-01
+bezier .116997 .116042E-01 .936235E-01 -.522658E-01 .449088E-01 -.888412E-01
+aline .253832E-01 -.888412E-01
+aline .234307E-01 -.878649E-01
+aline .224544E-01 -.859124E-01
+bezier .025999 -.075409 .366175E-01 -.681998E-01 .410036E-01 -.576004E-01
+bezier .611217E-01 -.250142E-01 .683063E-01 .145018E-01 .722445E-01 .497901E-01
+aline .722445E-01 .644343E-01
+aline .732208E-01 .654106E-01
+aline .732208E-01 .10739
+aline .722445E-01 .108367
+bezier .715674E-01 .151283 .620718E-01 .195634 .390511E-01 .234307
+bezier .343109E-01 .242883 .253508E-01 .24951 .224544E-01 .258713
+aline .234307E-01 .260666
+aline .253832E-01 .261642
+aline .449088E-01 .261642
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="*" !-------------- Beginning of new char.
+dfont wid=.550003 hei=.75 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .101533 .261642
+aline .104462 .260666
+aline .108367 .258713
+bezier .122208 .248524 .110318 .231128 .109343 .21771
+aline .108367 .213805
+aline .106414 .204042
+aline .105438 .200137
+aline .104852 .197208
+aline .105438 .194279
+aline .112272 .201113
+aline .114224 .202089
+aline .123987 .211852
+aline .12594 .212828
+aline .134726 .221615
+aline .136679 .222591
+bezier .14301 .233862 .160106 .234353 .165967 .222591
+aline .166943 .221615
+aline .16792 .219662
+aline .168896 .216734
+aline .168896 .205994
+aline .166943 .202089
+aline .164015 .199161
+aline .160109 .197208
+aline .157181 .196232
+aline .153276 .195255
+aline .135703 .189398
+aline .131797 .188421
+aline .114224 .182564
+aline .110319 .181588
+aline .114224 .180611
+aline .131797 .174754
+aline .135703 .173777
+aline .153276 .16792
+aline .157181 .166943
+bezier .178658 .162736 .168465 .12771 .148394 .131797
+aline .145465 .132774
+aline .143513 .13375
+aline .136679 .140584
+aline .134726 .14156
+aline .12594 .150347
+aline .123987 .151323
+aline .114224 .161086
+aline .112272 .162062
+aline .105438 .168896
+bezier .105941 .150602 .114179 .13264 .115201 .114224
+bezier .111114 .953273E-01 .778059E-01 .981356E-01 .790785E-01 .11813
+bezier .817861E-01 .135096 .879623E-01 .151955 .888412E-01 .168896
+aline .820073E-01 .162062
+aline .800547E-01 .161086
+aline .070292 .151323
+aline .683394E-01 .150347
+aline .595529E-01 .14156
+aline .576004E-01 .140584
+bezier .512691E-01 .129313 .341739E-01 .128822 .028312 .140584
+aline .273358E-01 .14156
+aline .263595E-01 .143513
+aline .253832E-01 .146442
+aline .253832E-01 .157181
+aline .273358E-01 .161086
+aline .302646E-01 .164015
+aline .341697E-01 .165967
+aline .370985E-01 .166943
+aline .410036E-01 .16792
+aline .585766E-01 .173777
+aline .624817E-01 .174754
+aline .800547E-01 .180611
+aline .839598E-01 .181588
+aline .800547E-01 .182564
+aline .624817E-01 .188421
+aline .585766E-01 .189398
+aline .410036E-01 .195255
+aline .370985E-01 .196232
+bezier .156215E-01 .200439 .258141E-01 .235465 .045885 .231378
+aline .488139E-01 .230401
+aline .507664E-01 .229425
+aline .576004E-01 .222591
+aline .595529E-01 .221615
+aline .683394E-01 .212828
+aline .070292 .211852
+aline .800547E-01 .202089
+aline .820073E-01 .201113
+aline .888412E-01 .194279
+bezier .881902E-01 .212544 .801958E-01 .230514 .790785E-01 .248951
+aline .800547E-01 .25188
+aline .081031 .253832
+aline .859124E-01 .258713
+aline .898175E-01 .260666
+aline .927463E-01 .261642
+closepath
+! end of curve
+
+! start of curve
+amove .898175E-01 .195255
+aline .888412E-01 .194279
+aline .898175E-01 .193303
+aline .907938E-01 .194279
+aline .898175E-01 .195255
+closepath
+! end of curve
+
+! start of curve
+amove .104462 .193303
+aline .105438 .194279
+aline .104462 .195255
+aline .103485 .194279
+aline .104462 .193303
+closepath
+! end of curve
+
+! start of curve
+amove .888412E-01 .168896
+aline .898175E-01 .16792
+aline .907938E-01 .168896
+aline .898175E-01 .169872
+aline .888412E-01 .168896
+closepath
+! end of curve
+
+! start of curve
+amove .103485 .168896
+aline .104462 .16792
+aline .105438 .168896
+aline .104462 .169872
+aline .103485 .168896
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="+" !-------------- Beginning of new char.
+dfont wid=.85556 hei=.616669 dep=.116669 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .154252 .214781
+aline .157181 .213805
+aline .158157 .212828
+aline .160109 .211852
+aline .162062 .2099
+aline .163038 .207947
+aline .164015 .206971
+aline .164991 .204042
+aline .164991 .101533
+aline .165967 .100557
+aline .268476 .100557
+bezier .282783 .977243E-01 .282784 .750766E-01 .268476 .722445E-01
+aline .165967 .722445E-01
+aline .164991 .712682E-01
+aline .164991 -.312409E-01
+bezier .162159 -.455479E-01 .139511 -.455489E-01 .136679 -.312409E-01
+aline .136679 .712682E-01
+aline .135703 .722445E-01
+aline .331934E-01 .722445E-01
+bezier .188857E-01 .075077 .188861E-01 .097724 .331934E-01 .100557
+aline .135703 .100557
+aline .136679 .101533
+aline .136679 .204042
+aline .137655 .206971
+aline .138631 .207947
+aline .139608 .2099
+aline .14156 .211852
+aline .143513 .212828
+aline .144489 .213805
+aline .147418 .214781
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="," !-------------- Beginning of new char.
+dfont wid=.305557 hei=.130556 dep=.105556 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .751733E-01 .439325E-01
+aline .771259E-01 .419799E-01
+aline .771259E-01 .976277E-03
+bezier .681818E-01 -.116049E-01 .614751E-01 -.265149E-01 .517427E-01 -.380748E-01
+aline .035146 -.380748E-01
+aline .331934E-01 -.370985E-01
+aline .322171E-01 -.035146
+bezier .346585E-01 -.237752E-01 .423035E-01 -.112362E-01 .439325E-01 -.976277E-03
+aline .341697E-01 -.976277E-03
+aline .322171E-01 .976277E-03
+aline .322171E-01 .419799E-01
+aline .341697E-01 .439325E-01
+aline .751733E-01 .439325E-01
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="-" !-------------- Beginning of new char.
+dfont wid=.366669 hei=.458333 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .098604 .917701E-01
+aline .100557 .907938E-01
+aline .102509 .898175E-01
+aline .105438 .868887E-01
+aline .10739 .829836E-01
+aline .10739 .761496E-01
+aline .105438 .722445E-01
+aline .102509 .693157E-01
+aline .098604 .673631E-01
+aline .136679E-01 .673631E-01
+aline .976277E-02 .693157E-01
+aline .683394E-02 .722445E-01
+aline .488139E-02 .761496E-01
+aline .488139E-02 .829836E-01
+aline .683394E-02 .868887E-01
+aline .976277E-02 .898175E-01
+aline .117153E-01 .907938E-01
+aline .136679E-01 .917701E-01
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="." !-------------- Beginning of new char.
+dfont wid=.305557 hei=.130556 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .751733E-01 .439325E-01
+aline .771259E-01 .419799E-01
+aline .771259E-01 .976277E-03
+aline .751733E-01 -.976277E-03
+aline .035146 -.976277E-03
+aline .331934E-01 0
+aline .322171E-01 .195255E-02
+aline .322171E-01 .419799E-01
+aline .341697E-01 .439325E-01
+aline .751733E-01 .439325E-01
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="/" !-------------- Beginning of new char.
+dfont wid=.550003 hei=.75 dep=.25 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .161086 .261642
+bezier .170756 .259468 .174911 .247472 .169872 .239188
+bezier .129267 .131442 .898408E-01 .232074E-01 .478376E-01 -.839598E-01
+bezier .387592E-01 -.954884E-01 .185866E-01 -.857116E-01 .224544E-01 -.712682E-01
+bezier .635174E-01 .373993E-01 .10352 .146506 .145465 .254808
+aline .151323 .260666
+aline .154252 .261642
+aline .161086 .261642
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="0" !-------------- Beginning of new char.
+dfont wid=.550003 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .106414 .249927
+bezier .134104 .248236 .160735 .229608 .168896 .202089
+bezier .176314 .184361 .176247 .166196 .178659 .148394
+aline .178659 .898175E-01
+bezier .176375 .593064E-01 .170937 .194419E-01 .140584 .195255E-02
+bezier .117851 -.115437E-01 .899751E-01 -.113809E-01 .654106E-01 -.390511E-02
+bezier .278244E-01 .900698E-02 .162078E-01 .538338E-01 .165967E-01 .888412E-01
+aline .156204E-01 .898175E-01
+aline .156204E-01 .148394
+bezier .180677E-01 .178874 .224202E-01 .216941 .507664E-01 .237235
+aline .052719 .238212
+aline .536952E-01 .239188
+aline .063458 .244069
+aline .722445E-01 .246998
+aline .761496E-01 .247974
+aline .081031 .248951
+aline .868887E-01 .248951
+aline .878649E-01 .249927
+aline .106414 .249927
+closepath
+! end of curve
+
+! start of curve
+amove .917701E-01 .224544
+bezier .697565E-01 .2208 .652564E-01 .194941 .063458 .177682
+aline .063458 .163038
+aline .624817E-01 .162062
+aline .624817E-01 .849361E-01
+aline .063458 .839598E-01
+bezier .637386E-01 .632629E-01 .639253E-01 .417426E-01 .771259E-01 .244069E-01
+bezier .087496 .014213 .104764 .121367E-01 .115201 .234307E-01
+bezier .127982 .034017 .128236 .530467E-01 .130821 .673631E-01
+aline .130821 .839598E-01
+aline .131797 .849361E-01
+aline .131797 .162062
+bezier .129185 .181451 .131517 .204999 .114224 .219662
+aline .112272 .220639
+aline .111296 .221615
+aline .109343 .222591
+aline .106414 .223567
+aline .102509 .224544
+aline .101533 .22552
+aline .927463E-01 .22552
+aline .917701E-01 .224544
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="1" !-------------- Beginning of new char.
+dfont wid=.550003 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .117153 .249927
+aline .119106 .248951
+aline .121058 .247974
+aline .123987 .245046
+aline .12594 .24114
+aline .12594 .244069E-01
+aline .126916 .234307E-01
+aline .157181 .234307E-01
+bezier .16916 .205527E-01 .169169 .137175E-02 .157181 -.976277E-03
+aline .419799E-01 -.976277E-03
+bezier .298924E-01 .204365E-02 .030451 .216433E-01 .429562E-01 .234307E-01
+aline .771259E-01 .234307E-01
+aline .781022E-01 .244069E-01
+aline .781022E-01 .205018
+aline .766378E-01 .20575
+aline .751733E-01 .205018
+aline .673631E-01 .203066
+aline .624817E-01 .203066
+aline .615055E-01 .202089
+aline .536952E-01 .202089
+aline .052719 .201113
+aline .370985E-01 .201113
+bezier .251106E-01 .20346 .251189E-01 .222642 .370985E-01 .22552
+bezier .606406E-01 .224718 .854889E-01 .230898 .102509 .248951
+aline .105438 .249927
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="2" !-------------- Beginning of new char.
+dfont wid=.550003 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .101533 .249927
+bezier .13744 .247481 .171379 .216879 .172801 .179635
+bezier .180215 .143646 .151504 .112686 .124963 .917701E-01
+aline .120082 .868887E-01
+aline .11813 .859124E-01
+aline .112272 .800547E-01
+aline .110319 .790785E-01
+aline .995803E-01 .683394E-01
+aline .976277E-01 .673631E-01
+aline .820073E-01 .517427E-01
+aline .800547E-01 .507664E-01
+aline .654106E-01 .361223E-01
+aline .663868E-01 .035146
+aline .946989E-01 .035146
+aline .956752E-01 .361223E-01
+aline .164991 .361223E-01
+aline .168896 .341697E-01
+aline .171825 .312409E-01
+aline .173777 .273358E-01
+aline .173777 .781022E-02
+aline .171825 .390511E-02
+aline .168896 .976277E-03
+aline .164991 -.976277E-03
+aline .302646E-01 -.976277E-03
+aline .273358E-01 0
+aline .253832E-01 .976277E-03
+aline .224544E-01 .390511E-02
+aline .214781E-01 .585766E-02
+aline .205018E-01 .878649E-02
+aline .205018E-01 .244069E-01
+bezier .502857E-01 .594831E-01 .859218E-01 .09034 .112272 .127892
+bezier .128541 .152327 .131969 .190618 .106414 .2099
+bezier .890483E-01 .221162 .639532E-01 .215226 .536952E-01 .197208
+aline .488139E-01 .187445
+aline .045885 .178659
+aline .449088E-01 .174754
+aline .439325E-01 .171825
+aline .419799E-01 .169872
+aline .390511E-01 .169872
+bezier .306005E-01 .177191 .242437E-01 .187178 .017573 .196232
+bezier .239279E-01 .225437 .516854E-01 .247817 .081031 .249927
+aline .101533 .249927
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="3" !-------------- Beginning of new char.
+dfont wid=.550003 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .105438 .249927
+bezier .131794 .249109 .161078 .232762 .164991 .204042
+bezier .17057 .178364 .158879 .149695 .135703 .135703
+aline .134726 .134726
+aline .132774 .13375
+aline .131797 .132774
+aline .127892 .130821
+bezier .1533 .125924 .174724 .104919 .176706 .790785E-01
+bezier .179515 .481193E-01 .168754 .119459E-01 .137655 -.976277E-03
+bezier .980291E-01 -.164345E-01 .483927E-01 -.102468E-01 .017573 .214781E-01
+aline .017573 .273358E-01
+aline .185493E-01 .028312
+aline .185493E-01 .331934E-01
+aline .195255E-01 .341697E-01
+aline .195255E-01 .390511E-01
+aline .205018E-01 .400274E-01
+aline .205018E-01 .449088E-01
+aline .214781E-01 .488139E-01
+aline .224544E-01 .507664E-01
+aline .244069E-01 .517427E-01
+aline .263595E-01 .517427E-01
+bezier .475222E-01 .318441E-01 .078781 .173795E-01 .10739 .263595E-01
+bezier .120613 .308445E-01 .123697 .464183E-01 .12594 .576004E-01
+bezier .125868 .07754 .128583 .102342 .109343 .114224
+aline .103485 .116177
+aline .098604 .117153
+aline .976277E-01 .11813
+aline .673631E-01 .11813
+aline .654106E-01 .120082
+aline .654106E-01 .140584
+aline .673631E-01 .142536
+bezier .823059E-01 .143039 .101465 .143332 .109343 .159133
+bezier .118574 .176096 .122094 .197096 .111296 .213805
+bezier .877993E-01 .228387 .563392E-01 .213452 .429562E-01 .19135
+bezier .356879E-01 .187415 .335754E-01 .198533 .292883E-01 .202089
+aline .028312 .204042
+aline .273358E-01 .205018
+aline .263595E-01 .206971
+aline .244069E-01 .208923
+aline .224544E-01 .212828
+bezier .253196E-01 .223604 .373319E-01 .230535 .045885 .237235
+aline .595529E-01 .244069
+aline .624817E-01 .245046
+aline .644343E-01 .246022
+aline .683394E-01 .246998
+aline .712682E-01 .247974
+aline .761496E-01 .248951
+aline .820073E-01 .248951
+aline .829836E-01 .249927
+aline .105438 .249927
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="4" !-------------- Beginning of new char.
+dfont wid=.550003 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .14156 .242117
+aline .143513 .24114
+aline .145465 .240164
+aline .148394 .237235
+aline .150347 .23333
+aline .150347 .859124E-01
+aline .151323 .849361E-01
+aline .173777 .849361E-01
+aline .177682 .829836E-01
+aline .180611 .800547E-01
+aline .182564 .761496E-01
+aline .182564 .615055E-01
+aline .180611 .576004E-01
+aline .177682 .546715E-01
+aline .173777 .052719
+aline .151323 .052719
+aline .150347 .517427E-01
+aline .150347 .781022E-02
+aline .148394 .390511E-02
+aline .145465 .976277E-03
+aline .14156 -.976277E-03
+aline .116177 -.976277E-03
+aline .112272 .976277E-03
+aline .109343 .390511E-02
+aline .10739 .781022E-02
+aline .10739 .517427E-01
+aline .106414 .052719
+aline .205018E-01 .052719
+aline .165967E-01 .546715E-01
+aline .136679E-01 .576004E-01
+aline .117153E-01 .615055E-01
+aline .117153E-01 .849361E-01
+bezier .390105E-01 .136603 .671571E-01 .188195 .956752E-01 .239188
+aline .976277E-01 .240164
+aline .098604 .24114
+aline .101533 .242117
+closepath
+! end of curve
+
+! start of curve
+amove .10739 .204042
+aline .106414 .201113
+aline .105438 .198184
+aline .104462 .196232
+aline .103485 .193303
+aline .995803E-01 .185493
+aline .098604 .182564
+aline .829836E-01 .151323
+bezier .712756E-01 .129736 .597409E-01 .108023 .480817E-01 .864005E-01
+aline .488139E-01 .849361E-01
+aline .108367 .849361E-01
+aline .109343 .859124E-01
+aline .109343 .205994
+aline .108367 .206971
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="5" !-------------- Beginning of new char.
+dfont wid=.550003 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .152299 .242117
+aline .154252 .24114
+aline .156204 .240164
+aline .159133 .237235
+aline .161086 .23333
+aline .161086 .216734
+aline .159133 .212828
+aline .156204 .2099
+aline .152299 .207947
+aline .761496E-01 .207947
+aline .751733E-01 .206971
+aline .751733E-01 .153276
+aline .761496E-01 .152299
+bezier .937739E-01 .160631 .114694 .157765 .132774 .152299
+bezier .159015 .143352 .17224 .114962 .173777 .898175E-01
+bezier .175696 .595601E-01 .170938 .238341E-01 .143513 .585766E-02
+bezier .11683 -.113722E-01 .821137E-01 -.129291E-01 .052719 -.292883E-02
+bezier .369247E-01 .389458E-02 .233871E-01 .152174E-01 .136679E-01 .292883E-01
+bezier .152657E-01 .395663E-01 .236086E-01 .475454E-01 .028312 .566241E-01
+aline .302646E-01 .576004E-01
+aline .331934E-01 .576004E-01
+bezier .462819E-01 .293783E-01 .832858E-01 .133839E-01 .110319 .302646E-01
+aline .115201 .035146
+aline .119106 .429562E-01
+aline .121058 .507664E-01
+aline .122035 .517427E-01
+aline .122035 .585766E-01
+aline .123011 .595529E-01
+aline .123011 .976277E-01
+bezier .121037 .109673 .120766 .128937 .104462 .131797
+bezier .877164E-01 .135664 .693569E-01 .123156 .624817E-01 .10739
+aline .595529E-01 .104462
+aline .556478E-01 .102509
+aline .390511E-01 .102509
+aline .035146 .104462
+aline .312409E-01 .108367
+aline .302646E-01 .111296
+aline .302646E-01 .23333
+aline .312409E-01 .236259
+aline .035146 .240164
+aline .370985E-01 .24114
+aline .390511E-01 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="6" !-------------- Beginning of new char.
+dfont wid=.550003 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .127892 .249927
+aline .128869 .248951
+aline .13375 .248951
+aline .137655 .247974
+aline .140584 .246998
+aline .146442 .244069
+aline .14937 .243093
+aline .151323 .24114
+aline .151323 .213805
+aline .14937 .211852
+aline .146442 .211852
+bezier .119491 .229448 .772877E-01 .216237 .712682E-01 .182564
+bezier .066419 .167513 .06592 .152649 .654106E-01 .136679
+aline .663868E-01 .135703
+bezier .073271 .152906 .898286E-01 .166962 .108367 .166943
+aline .109343 .166943
+aline .110319 .165967
+bezier .147113 .170978 .176882 .13467 .17573 .100557
+aline .176706 .995803E-01
+aline .176706 .063458
+bezier .176114 .288904E-01 .14878 -.847014E-02 .111296 -.781022E-02
+bezier .785517E-01 -.146642E-01 .409595E-01 .314899E-02 .292883E-01 .361223E-01
+bezier .205415E-01 .054961 .197511E-01 .755839E-01 .017573 .946989E-01
+aline .017573 .140584
+bezier .195133E-01 .17511 .308226E-01 .216654 .063458 .236259
+aline .751733E-01 .242117
+aline .781022E-01 .243093
+aline .800547E-01 .244069
+aline .859124E-01 .246022
+aline .937226E-01 .247974
+aline .098604 .247974
+aline .995803E-01 .248951
+aline .106414 .248951
+aline .10739 .249927
+aline .127892 .249927
+closepath
+! end of curve
+
+! start of curve
+amove .917701E-01 .140584
+bezier .074428 .135667 .699391E-01 .115152 .663868E-01 .100557
+aline .663868E-01 .693157E-01
+bezier .686817E-01 .531523E-01 .714136E-01 .277625E-01 .927463E-01 .244069E-01
+bezier .106144 .203851E-01 .123833 .283464E-01 .12594 .439325E-01
+aline .126916 .449088E-01
+aline .126916 .497901E-01
+aline .127892 .507664E-01
+aline .127892 .585766E-01
+aline .128869 .595529E-01
+aline .128869 .104462
+bezier .127097 .117399 .125385 .137422 .108367 .140584
+aline .10739 .14156
+aline .927463E-01 .14156
+aline .917701E-01 .140584
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="7" !-------------- Beginning of new char.
+dfont wid=.550003 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .16792 .242117
+aline .169872 .24114
+aline .171825 .240164
+aline .174754 .237235
+aline .176706 .23333
+aline .176706 .216734
+bezier .133302 .162936 .103439 .926168E-01 .101533 .244069E-01
+aline .100557 .234307E-01
+aline .100557 .390511E-02
+aline .098604 0
+aline .956752E-01 -.292883E-02
+aline .917701E-01 -.488139E-02
+aline .605292E-01 -.488139E-02
+aline .566241E-01 -.292883E-02
+aline .536952E-01 0
+aline .517427E-01 .390511E-02
+bezier .497363E-01 .764972E-01 .794113E-01 .151715 .129845 .205018
+aline .128869 .205994
+aline .995803E-01 .205994
+aline .098604 .205018
+aline .263595E-01 .205018
+aline .224544E-01 .206971
+aline .195255E-01 .2099
+aline .017573 .213805
+aline .017573 .23333
+aline .195255E-01 .237235
+aline .224544E-01 .240164
+aline .244069E-01 .24114
+aline .263595E-01 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="8" !-------------- Beginning of new char.
+dfont wid=.550003 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .109343 .249927
+bezier .132269 .248505 .158547 .23683 .166943 .212828
+bezier .175323 .187899 .175462 .155115 .151323 .138631
+aline .147418 .136679
+aline .146442 .135703
+aline .144489 .134726
+aline .14156 .13375
+aline .139608 .132774
+aline .134336 .131016
+aline .133994 .130333
+bezier .155869 .123895 .176044 .1044 .17573 .800547E-01
+bezier .180937 .486497E-01 .168746 .902309E-02 .135703 -.292883E-02
+bezier .106709 -.117695E-01 .741375E-01 -.122019E-01 .468613E-01 .292883E-02
+bezier .189671E-01 .215059E-01 .137549E-01 .595899E-01 .195255E-01 .898175E-01
+bezier .239663E-01 .110144 .414595E-01 .124427 .602851E-01 .130333
+bezier .419591E-01 .136201 .234271E-01 .151706 .234307E-01 .172801
+bezier .183841E-01 .199938 .301997E-01 .233826 .585766E-01 .244069
+aline .673631E-01 .246998
+aline .712682E-01 .247974
+aline .761496E-01 .247974
+aline .771259E-01 .248951
+aline .839598E-01 .248951
+aline .849361E-01 .249927
+aline .109343 .249927
+closepath
+! end of curve
+
+! start of curve
+amove .878649E-01 .218686
+aline .829836E-01 .21771
+aline .800547E-01 .216734
+aline .761496E-01 .214781
+aline .712682E-01 .2099
+bezier .640118E-01 .193846 .065029 .173734 .693157E-01 .157181
+bezier .763504E-01 .140626 .988009E-01 .140052 .113248 .145465
+aline .119106 .148394
+aline .122035 .151323
+aline .124963 .157181
+bezier .12925 .173734 .130267 .193846 .123011 .2099
+aline .11813 .214781
+aline .114224 .216734
+aline .111296 .21771
+aline .106414 .218686
+aline .105438 .219662
+aline .888412E-01 .219662
+closepath
+! end of curve
+
+! start of curve
+amove .898175E-01 .117153
+aline .849361E-01 .116177
+bezier .710355E-01 .113476 .669548E-01 .981494E-01 .654106E-01 .868887E-01
+aline .654106E-01 .536952E-01
+bezier .067249 .429914E-01 .705997E-01 .281354E-01 .839598E-01 .253832E-01
+bezier .100128 .195792E-01 .125467 .250475E-01 .126916 .045885
+aline .127892 .468613E-01
+aline .127892 .052719
+aline .128869 .536952E-01
+aline .128869 .868887E-01
+bezier .127323 .981485E-01 .123244 .113476 .109343 .116177
+aline .104462 .117153
+aline .103485 .11813
+aline .907938E-01 .11813
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="9" !-------------- Beginning of new char.
+dfont wid=.550003 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .108367 .249927
+bezier .134126 .247214 .157175 .228835 .165967 .204042
+aline .170849 .189398
+aline .171825 .185493
+aline .173777 .17573
+aline .173777 .170849
+aline .174754 .169872
+aline .174754 .162062
+aline .17573 .161086
+aline .17573 .148394
+aline .176706 .147418
+aline .176706 .100557
+bezier .174618 .669869E-01 .165175 .260313E-01 .13375 .585766E-02
+bezier .102637 -.141333E-01 .571152E-01 -.160074E-01 .292883E-01 .010739
+aline .292883E-01 .136679E-01
+aline .331934E-01 .214781E-01
+aline .341697E-01 .224544E-01
+aline .361223E-01 .263595E-01
+aline .370985E-01 .273358E-01
+aline .400274E-01 .331934E-01
+aline .410036E-01 .341697E-01
+aline .419799E-01 .361223E-01
+aline .439325E-01 .380748E-01
+aline .478376E-01 .380748E-01
+bezier .069314 .118485E-01 .117916 .230692E-01 .123011 .576004E-01
+bezier .127989 .072927 .128263 .882041E-01 .128869 .104462
+aline .127892 .105438
+bezier .120904 .883094E-01 .104519 .741289E-01 .859124E-01 .741971E-01
+aline .849361E-01 .741971E-01
+aline .839598E-01 .751733E-01
+bezier .047334 .703346E-01 .176473E-01 .106 .185493E-01 .140584
+aline .017573 .14156
+aline .017573 .177682
+aline .185493E-01 .178659
+bezier .173478E-01 .214434 .489129E-01 .248927 .849361E-01 .249927
+aline .108367 .249927
+closepath
+! end of curve
+
+! start of curve
+amove .907938E-01 .218686
+bezier .768044E-01 .217954 .684651E-01 .205301 .673631E-01 .192327
+aline .663868E-01 .19135
+aline .663868E-01 .182564
+aline .654106E-01 .181588
+aline .654106E-01 .137655
+bezier .674172E-01 .124542 .685856E-01 .1036 .859124E-01 .100557
+bezier .103245 .094426 .120335 .10879 .123987 .12594
+aline .124963 .129845
+bezier .130285 .147709 .127484 .165774 .126916 .184516
+bezier .124147 .197325 .119757 .216112 .103485 .218686
+aline .102509 .219662
+aline .917701E-01 .219662
+aline .907938E-01 .218686
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=":" !-------------- Beginning of new char.
+dfont wid=.305557 hei=.458333 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .751733E-01 .159133
+aline .771259E-01 .157181
+aline .771259E-01 .116177
+aline .751733E-01 .114224
+aline .341697E-01 .114224
+aline .322171E-01 .116177
+aline .322171E-01 .156204
+aline .331934E-01 .158157
+aline .035146 .159133
+aline .751733E-01 .159133
+closepath
+! end of curve
+
+! start of curve
+amove .751733E-01 .439325E-01
+aline .771259E-01 .419799E-01
+aline .771259E-01 .976277E-03
+aline .751733E-01 -.976277E-03
+aline .035146 -.976277E-03
+aline .331934E-01 0
+aline .322171E-01 .195255E-02
+aline .322171E-01 .419799E-01
+aline .341697E-01 .439325E-01
+aline .751733E-01 .439325E-01
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=";" !-------------- Beginning of new char.
+dfont wid=.305557 hei=.458333 dep=.105556 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .751733E-01 .159133
+aline .771259E-01 .157181
+aline .771259E-01 .116177
+aline .751733E-01 .114224
+aline .341697E-01 .114224
+aline .322171E-01 .116177
+aline .322171E-01 .156204
+aline .331934E-01 .158157
+aline .035146 .159133
+aline .751733E-01 .159133
+closepath
+! end of curve
+
+! start of curve
+amove .751733E-01 .439325E-01
+aline .771259E-01 .419799E-01
+aline .771259E-01 .976277E-03
+bezier .681818E-01 -.116049E-01 .614751E-01 -.265149E-01 .517427E-01 -.380748E-01
+aline .035146 -.380748E-01
+aline .331934E-01 -.370985E-01
+aline .322171E-01 -.035146
+bezier .346585E-01 -.237752E-01 .423035E-01 -.112362E-01 .439325E-01 -.976277E-03
+aline .341697E-01 -.976277E-03
+aline .322171E-01 .976277E-03
+aline .322171E-01 .419799E-01
+aline .341697E-01 .439325E-01
+aline .751733E-01 .439325E-01
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="<" !-------------- Beginning of new char.
+dfont wid=.366669 hei=.5 dep=.194445 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .790785E-01 .173777
+aline .081031 .172801
+aline .829836E-01 .171825
+aline .859124E-01 .168896
+aline .878649E-01 .164991
+aline .878649E-01 .137655
+aline .859124E-01 .13375
+aline .829836E-01 .130821
+aline .790785E-01 .128869
+aline .517427E-01 .128869
+aline .478376E-01 .130821
+aline .449088E-01 .13375
+aline .429562E-01 .137655
+aline .429562E-01 .164015
+aline .439325E-01 .166943
+aline .449088E-01 .168896
+aline .478376E-01 .171825
+aline .497901E-01 .172801
+aline .052719 .173777
+closepath
+! end of curve
+
+! start of curve
+amove .081031 .104462
+aline .829836E-01 .102509
+aline .839598E-01 .100557
+aline .839598E-01 .654106E-01
+aline .849361E-01 .644343E-01
+aline .849361E-01 .028312
+aline .859124E-01 .273358E-01
+aline .859124E-01 -.878649E-02
+aline .868887E-01 -.976277E-02
+aline .868887E-01 -.045885
+aline .878649E-01 -.468613E-01
+aline .878649E-01 -.673631E-01
+aline .859124E-01 -.693157E-01
+aline .045885 -.693157E-01
+aline .439325E-01 -.683394E-01
+aline .429562E-01 -.663868E-01
+aline .429562E-01 -.468613E-01
+aline .439325E-01 -.045885
+aline .439325E-01 -.976277E-02
+aline .449088E-01 -.878649E-02
+aline .449088E-01 .273358E-01
+aline .045885 .028312
+aline .045885 .644343E-01
+aline .468613E-01 .654106E-01
+aline .468613E-01 .100557
+aline .478376E-01 .102509
+aline .497901E-01 .104462
+aline .081031 .104462
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="=" !-------------- Beginning of new char.
+dfont wid=.85556 hei=.40625 dep=-.09375 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .266524 .14156
+bezier .281398 .140388 .283982 .117116 .269453 .113248
+aline .322171E-01 .113248
+aline .028312 .115201
+aline .244069E-01 .119106
+aline .234307E-01 .121058
+aline .224544E-01 .123987
+aline .224544E-01 .129845
+aline .234307E-01 .132774
+aline .244069E-01 .134726
+aline .292883E-01 .139608
+aline .312409E-01 .140584
+aline .035146 .14156
+closepath
+! end of curve
+
+! start of curve
+amove .269453 .595529E-01
+bezier .283982 .556842E-01 .281398 .324134E-01 .266524 .312409E-01
+aline .035146 .312409E-01
+bezier .203524E-01 .324666E-01 .175956E-01 .554717E-01 .322171E-01 .595529E-01
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=">" !-------------- Beginning of new char.
+dfont wid=.519447 hei=.5 dep=.194445 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .995803E-01 .173777
+aline .101533 .172801
+aline .103485 .171825
+aline .106414 .168896
+aline .108367 .164991
+aline .108367 .137655
+aline .106414 .13375
+aline .103485 .130821
+aline .995803E-01 .128869
+aline .722445E-01 .128869
+aline .683394E-01 .130821
+aline .654106E-01 .13375
+aline .063458 .137655
+aline .063458 .164015
+aline .644343E-01 .166943
+aline .654106E-01 .168896
+aline .683394E-01 .171825
+aline .070292 .172801
+aline .732208E-01 .173777
+closepath
+! end of curve
+
+! start of curve
+amove .101533 .104462
+aline .103485 .102509
+aline .104462 .100557
+bezier .104643 .781068E-01 .10313 .055942 .927463E-01 .035146
+bezier .863931E-01 .206921E-01 .771855E-01 .80045E-02 .070292 -.585766E-02
+aline .070292 -.010739
+aline .693157E-01 -.117153E-01
+aline .693157E-01 -.341697E-01
+aline .070292 -.035146
+aline .070292 -.400274E-01
+bezier .753163E-01 -.520539E-01 .918908E-01 -.493174E-01 .101533 -.468613E-01
+bezier .118815 -.441449E-01 .133936 -.349404E-01 .146442 -.234307E-01
+aline .150347 -.234307E-01
+aline .151323 -.244069E-01
+aline .153276 -.028312
+aline .155228 -.341697E-01
+aline .156204 -.361223E-01
+aline .159133 -.449088E-01
+aline .160109 -.468613E-01
+aline .161086 -.497901E-01
+aline .161086 -.536952E-01
+bezier .128582 -.730477E-01 .888699E-01 -.779001E-01 .052719 -.693157E-01
+aline .410036E-01 -.063458
+bezier .200058E-01 -.482432E-01 .190796E-01 -.185536E-01 .263595E-01 .390511E-02
+bezier .356373E-01 .220957E-01 .564632E-01 .317789E-01 .615055E-01 .052719
+aline .624817E-01 .546715E-01
+aline .063458 .576004E-01
+aline .654106E-01 .654106E-01
+aline .663868E-01 .663868E-01
+aline .663868E-01 .712682E-01
+aline .673631E-01 .722445E-01
+aline .673631E-01 .849361E-01
+aline .683394E-01 .859124E-01
+aline .683394E-01 .102509
+aline .070292 .104462
+aline .101533 .104462
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="?" !-------------- Beginning of new char.
+dfont wid=.519447 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .103485 .246022
+bezier .1234 .244458 .148559 .23703 .157181 .215757
+bezier .166639 .192126 .160113 .16068 .135703 .148394
+bezier .120349 .135508 .108757 .118231 .104462 .098604
+aline .104462 .722445E-01
+aline .103485 .070292
+aline .101533 .683394E-01
+aline .070292 .683394E-01
+aline .683394E-01 .070292
+aline .683394E-01 .101533
+bezier .723583E-01 .130258 .905841E-01 .155248 .110319 .17573
+bezier .115815 .188281 .116326 .203788 .109343 .215757
+bezier .849839E-01 .230207 .533957E-01 .216919 .370985E-01 .196232
+aline .331934E-01 .196232
+aline .322171E-01 .197208
+aline .302646E-01 .201113
+aline .028312 .206971
+aline .273358E-01 .208923
+aline .244069E-01 .21771
+aline .234307E-01 .219662
+aline .224544E-01 .222591
+aline .224544E-01 .22552
+bezier .339855E-01 .236782 .515529E-01 .241604 .673631E-01 .245046
+aline .741971E-01 .245046
+aline .751733E-01 .246022
+aline .103485 .246022
+closepath
+! end of curve
+
+! start of curve
+amove .995803E-01 .439325E-01
+aline .101533 .429562E-01
+aline .103485 .419799E-01
+aline .106414 .390511E-01
+aline .108367 .035146
+aline .108367 .781022E-02
+aline .106414 .390511E-02
+aline .103485 .976277E-03
+aline .995803E-01 -.976277E-03
+aline .732208E-01 -.976277E-03
+aline .070292 0
+aline .683394E-01 .976277E-03
+aline .654106E-01 .390511E-02
+aline .644343E-01 .585766E-02
+aline .063458 .878649E-02
+aline .063458 .035146
+aline .654106E-01 .390511E-01
+aline .683394E-01 .419799E-01
+aline .070292 .429562E-01
+aline .722445E-01 .439325E-01
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="@" !-------------- Beginning of new char.
+dfont wid=.733337 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .163038 .246022
+bezier .185065 .244168 .209398 .23426 .220639 .213805
+bezier .232328 .194555 .23419 .17188 .236259 .151323
+aline .236259 .10739
+bezier .234951 .820811E-01 .220878 .533023E-01 .194279 .449088E-01
+bezier .169885 .372839E-01 .142252 .373552E-01 .119106 .497901E-01
+bezier .098822 .615217E-01 .894125E-01 .858926E-01 .878649E-01 .10739
+bezier .867186E-01 .136015 .887005E-01 .168004 .113248 .187445
+bezier .134103 .203585 .161394 .201649 .185493 .200137
+bezier .177662 .216974 .156626 .224891 .139608 .220639
+bezier .107807 .22027 .759885E-01 .197756 .693157E-01 .164991
+bezier .597049E-01 .127907 .600353E-01 .862754E-01 .800547E-01 .517427E-01
+bezier .100718 .209564E-01 .143382 .148392E-01 .17573 .224544E-01
+aline .187445 .253832E-01
+aline .196232 .028312
+aline .198184 .292883E-01
+aline .201113 .302646E-01
+aline .206971 .331934E-01
+aline .234307 .331934E-01
+aline .236259 .312409E-01
+bezier .235831 .214494E-01 .22292 .188185E-01 .216734 .126916E-01
+bezier .178181 -.998786E-02 .131876 -.904718E-02 .907938E-01 .390511E-02
+bezier .485224E-01 .176157E-01 .229804E-01 .622399E-01 .234307E-01 .104462
+aline .224544E-01 .105438
+aline .224544E-01 .135703
+bezier .0244 .170376 .393912E-01 .210133 .722445E-01 .228449
+bezier .100217 .244887 .131793 .24673 .163038 .246022
+closepath
+! end of curve
+
+! start of curve
+amove .157181 .17573
+bezier .136442 .173603 .130864 .149705 .128869 .13375
+bezier .128986 .111297 .126864 .869114E-01 .144489 .070292
+bezier .161439 .569808E-01 .188195 .068427 .19135 .898175E-01
+aline .192327 .927463E-01
+bezier .197004 .1159 .197946 .143298 .185493 .164991
+aline .179635 .170849
+aline .177682 .171825
+aline .176706 .172801
+aline .174754 .173777
+aline .171825 .174754
+aline .166943 .17573
+aline .165967 .176706
+aline .158157 .176706
+aline .157181 .17573
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="A" !-------------- Beginning of new char.
+dfont wid=.733337 hei=.694445 dep=0 italic=0
+dfont fby="C" kadd=-.0305557
+dfont fby="G" kadd=-.0305557
+dfont fby="O" kadd=-.0305557
+dfont fby="Q" kadd=-.0305557
+dfont fby="T" kadd=-.0916672
+dfont fby="U" kadd=-.0305557
+dfont fby="V" kadd=-.122223
+dfont fby="W" kadd=-.122223
+dfont fby="Y" kadd=-.0916672
+dfont fby="t" kadd=-.0305557
+set path ! start of curve
+newpath
+! start of curve
+amove .152299 .242117
+aline .155228 .24114
+aline .159133 .239188
+aline .164015 .234307
+bezier .19155 .160272 .216434 .851374E-01 .243093 .010739
+aline .243093 .585766E-02
+aline .24114 .195255E-02
+aline .240164 .976277E-03
+aline .236259 -.976277E-03
+aline .203066 -.976277E-03
+bezier .187636 .295117E-02 .18736 .210945E-01 .181588 .331934E-01
+aline .17573 .507664E-01
+aline .174754 .517427E-01
+aline .771259E-01 .517427E-01
+aline .712682E-01 .341697E-01
+bezier .065266 .216933E-01 .649963E-01 .241878E-02 .488139E-01 -.976277E-03
+aline .224544E-01 -.976277E-03
+aline .185493E-01 .976277E-03
+aline .017573 .195255E-02
+aline .156204E-01 .585766E-02
+bezier .218868E-01 .035045 .352889E-01 .062923 .439325E-01 .917701E-01
+bezier .612987E-01 .139098 .765863E-01 .187288 .946989E-01 .234307
+aline .995803E-01 .239188
+aline .103485 .24114
+aline .106414 .242117
+closepath
+! end of curve
+
+! start of curve
+amove .124963 .195255
+aline .123987 .19135
+aline .123011 .187445
+aline .121058 .181588
+aline .120082 .177682
+aline .946989E-01 .101533
+aline .937226E-01 .995803E-01
+aline .881904E-01 .829836E-01
+aline .888412E-01 .081031
+aline .164015 .081031
+aline .164747 .824954E-01
+aline .164015 .839598E-01
+aline .159133 .098604
+aline .158157 .100557
+aline .143513 .144489
+aline .142536 .146442
+aline .14156 .14937
+aline .140584 .153276
+aline .131797 .179635
+aline .130821 .18354
+aline .128869 .189398
+aline .126916 .197208
+aline .12594 .199161
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="B" !-------------- Beginning of new char.
+dfont wid=.733337 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .148394 .242117
+bezier .175687 .240528 .210387 .231336 .221615 .202089
+bezier .230343 .179728 .225125 .151669 .204042 .137655
+aline .190374 .130821
+aline .181588 .127892
+aline .17824 .127055
+aline .177927 .126428
+bezier .203868 .121732 .234493 .10518 .235283 .751733E-01
+bezier .24127 .465632E-01 .223124 .146638E-01 .194279 .585766E-02
+aline .188421 .390511E-02
+aline .180611 .195255E-02
+aline .17573 .976277E-03
+aline .169872 .976277E-03
+aline .168896 0
+aline .159133 0
+aline .158157 -.976277E-03
+aline .429562E-01 -.976277E-03
+aline .400274E-01 0
+aline .380748E-01 .976277E-03
+aline .035146 .390511E-02
+aline .341697E-01 .585766E-02
+aline .331934E-01 .878649E-02
+aline .331934E-01 .232354
+aline .341697E-01 .235283
+aline .035146 .237235
+aline .380748E-01 .240164
+aline .400274E-01 .24114
+aline .429562E-01 .242117
+aline .148394 .242117
+closepath
+! end of curve
+
+! start of curve
+amove .820073E-01 .211852
+aline .820073E-01 .138631
+aline .829836E-01 .137655
+aline .132774 .137655
+bezier .151439 .139707 .176048 .149033 .177682 .171825
+bezier .183037 .189926 .166738 .207785 .148394 .2099
+aline .143513 .210876
+aline .142536 .211852
+aline .135703 .211852
+aline .134726 .212828
+aline .829836E-01 .212828
+aline .820073E-01 .211852
+closepath
+! end of curve
+
+! start of curve
+amove .820073E-01 .112272
+aline .820073E-01 .292883E-01
+aline .829836E-01 .028312
+aline .143513 .028312
+bezier .161342 .305018E-01 .185574 .038356 .187445 .605292E-01
+bezier .192784 .825185E-01 .175668 .107326 .152299 .110319
+aline .147418 .111296
+aline .146442 .112272
+aline .139608 .112272
+aline .138631 .113248
+aline .829836E-01 .113248
+aline .820073E-01 .112272
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="C" !-------------- Beginning of new char.
+dfont wid=.702782 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .166943 .249927
+bezier .185232 .247677 .206746 .245258 .223567 .235283
+bezier .222691 .222388 .219295 .210304 .21771 .197208
+aline .216734 .194279
+aline .215757 .192327
+bezier .206323 .192154 .200839 .202578 .192327 .205994
+bezier .160455 .221846 .118145 .219459 .927463E-01 .192327
+bezier .708912E-01 .162677 .713226E-01 .124123 .751733E-01 .898175E-01
+bezier .802582E-01 .645407E-01 .940241E-01 .374963E-01 .121058 .302646E-01
+bezier .153469 .198671E-01 .191041 .250901E-01 .21771 .478376E-01
+aline .219662 .488139E-01
+aline .222591 .488139E-01
+aline .224544 .468613E-01
+aline .224544 .410036E-01
+aline .22552 .400274E-01
+aline .22552 .312409E-01
+aline .226496 .302646E-01
+aline .226496 .214781E-01
+aline .227473 .205018E-01
+aline .227473 .126916E-01
+bezier .210225 .199515E-03 .188284 -.745828E-02 .16792 -.878649E-02
+aline .135703 -.878649E-02
+bezier .100661 -.677557E-02 .595873E-01 .756128E-02 .410036E-01 .410036E-01
+bezier .284013E-01 .596883E-01 .02458 .083522 .224544E-01 .104462
+aline .224544E-01 .136679
+bezier .242947E-01 .172722 .397261E-01 .213419 .732208E-01 .232354
+bezier .924021E-01 .243995 .11511 .247875 .135703 .249927
+aline .166943 .249927
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="D" !-------------- Beginning of new char.
+dfont wid=.794449 hei=.694445 dep=0 italic=0
+dfont fby="A" kadd=-.0305557
+dfont fby="V" kadd=-.0305557
+dfont fby="W" kadd=-.0305557
+dfont fby="X" kadd=-.0305557
+dfont fby="Y" kadd=-.0305557
+set path ! start of curve
+newpath
+! start of curve
+amove .153276 .242117
+bezier .175542 .24011 .20085 .234693 .219662 .219662
+bezier .244849 .199048 .256783 .165793 .256761 .134726
+aline .257737 .13375
+aline .257737 .103485
+bezier .255344 .789375E-01 .249528 .501209E-01 .230401 .312409E-01
+bezier .212268 .916898E-02 .180919 .120402E-02 .154252 -.976277E-03
+aline .429562E-01 -.976277E-03
+aline .400274E-01 0
+aline .380748E-01 .976277E-03
+aline .035146 .390511E-02
+aline .341697E-01 .585766E-02
+aline .331934E-01 .878649E-02
+aline .331934E-01 .232354
+aline .341697E-01 .235283
+aline .035146 .237235
+aline .380748E-01 .240164
+aline .400274E-01 .24114
+aline .429562E-01 .242117
+aline .153276 .242117
+closepath
+! end of curve
+
+! start of curve
+amove .829836E-01 .211852
+aline .829836E-01 .292883E-01
+aline .839598E-01 .028312
+aline .139608 .028312
+bezier .162144 .305087E-01 .19031 .401736E-01 .199161 .644343E-01
+aline .201113 .683394E-01
+aline .203066 .741971E-01
+aline .204042 .781022E-01
+aline .205018 .829836E-01
+aline .205994 .839598E-01
+aline .205994 .888412E-01
+aline .206971 .898175E-01
+aline .206971 .995803E-01
+aline .207947 .100557
+aline .207947 .137655
+bezier .206071 .163716 .195958 .196972 .166943 .205994
+aline .164991 .206971
+aline .162062 .207947
+aline .154252 .2099
+aline .153276 .210876
+aline .148394 .210876
+aline .147418 .211852
+aline .140584 .211852
+aline .139608 .212828
+aline .839598E-01 .212828
+aline .829836E-01 .211852
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="E" !-------------- Beginning of new char.
+dfont wid=.64167 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .195255 .24114
+aline .197208 .240164
+aline .199161 .239188
+aline .202089 .236259
+aline .204042 .232354
+aline .204042 .213805
+aline .202089 .2099
+aline .199161 .206971
+aline .195255 .205018
+aline .157181 .205018
+aline .156204 .205994
+aline .907938E-01 .205994
+aline .898175E-01 .206971
+aline .849361E-01 .206971
+aline .839598E-01 .205994
+aline .839598E-01 .14156
+aline .849361E-01 .140584
+aline .184516 .140584
+aline .188421 .138631
+aline .19135 .135703
+aline .193303 .131797
+aline .193303 .117153
+aline .19135 .113248
+aline .188421 .110319
+aline .184516 .108367
+aline .849361E-01 .108367
+aline .839598E-01 .10739
+aline .839598E-01 .361223E-01
+aline .849361E-01 .035146
+aline .907938E-01 .035146
+aline .917701E-01 .361223E-01
+aline .160109 .361223E-01
+aline .161086 .370985E-01
+aline .200137 .370985E-01
+aline .204042 .035146
+aline .206971 .322171E-01
+aline .208923 .028312
+aline .208923 .781022E-02
+aline .206971 .390511E-02
+aline .204042 .976277E-03
+aline .200137 -.976277E-03
+aline .429562E-01 -.976277E-03
+aline .400274E-01 0
+aline .380748E-01 .976277E-03
+aline .035146 .390511E-02
+aline .341697E-01 .585766E-02
+aline .331934E-01 .878649E-02
+aline .331934E-01 .231378
+aline .341697E-01 .234307
+aline .035146 .236259
+aline .380748E-01 .239188
+aline .400274E-01 .240164
+aline .429562E-01 .24114
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="F" !-------------- Beginning of new char.
+dfont wid=.611115 hei=.694445 dep=0 italic=0
+dfont fby="A" kadd=-.0916672
+dfont fby="C" kadd=-.0305557
+dfont fby="G" kadd=-.0305557
+dfont fby="O" kadd=-.0305557
+dfont fby="Q" kadd=-.0305557
+dfont fby="a" kadd=-.0305557
+dfont fby="e" kadd=-.0305557
+dfont fby="o" kadd=-.0305557
+dfont fby="r" kadd=-.0305557
+dfont fby="u" kadd=-.0305557
+set path ! start of curve
+newpath
+! start of curve
+amove .189398 .24114
+aline .19135 .240164
+aline .193303 .239188
+aline .196232 .236259
+aline .198184 .232354
+aline .198184 .213805
+aline .196232 .2099
+aline .193303 .206971
+aline .189398 .205018
+aline .153276 .205018
+aline .152299 .205994
+aline .898175E-01 .205994
+aline .868887E-01 .20658
+aline .839598E-01 .205994
+aline .839598E-01 .137655
+aline .849361E-01 .136679
+aline .173777 .136679
+aline .177682 .134726
+aline .180611 .131797
+aline .182564 .127892
+aline .182564 .113248
+aline .180611 .109343
+aline .177682 .106414
+aline .173777 .104462
+aline .849361E-01 .104462
+aline .839598E-01 .103485
+aline .839598E-01 .781022E-02
+aline .820073E-01 .390511E-02
+aline .790785E-01 .976277E-03
+aline .751733E-01 -.976277E-03
+aline .429562E-01 -.976277E-03
+aline .400274E-01 0
+aline .380748E-01 .976277E-03
+aline .035146 .390511E-02
+aline .341697E-01 .585766E-02
+aline .331934E-01 .878649E-02
+aline .331934E-01 .231378
+aline .341697E-01 .234307
+aline .035146 .236259
+aline .380748E-01 .239188
+aline .400274E-01 .240164
+aline .429562E-01 .24114
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="G" !-------------- Beginning of new char.
+dfont wid=.733337 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .165967 .249927
+bezier .186756 .247952 .210063 .242386 .228449 .230401
+bezier .227572 .217507 .224177 .205423 .222591 .192327
+aline .221615 .189398
+aline .220639 .187445
+aline .215757 .187445
+bezier .185051 .222445 .125313 .226529 .927463E-01 .192327
+bezier .708912E-01 .162677 .713226E-01 .124123 .751733E-01 .898175E-01
+bezier .802582E-01 .645407E-01 .940241E-01 .374963E-01 .121058 .302646E-01
+bezier .142234 .233542E-01 .164653 .240278E-01 .185493 .302646E-01
+aline .185493 .790785E-01
+aline .184516 .800547E-01
+aline .153276 .800547E-01
+aline .151323 .820073E-01
+aline .151323 .109343
+aline .152299 .111296
+aline .154252 .112272
+aline .230401 .112272
+aline .232354 .110319
+aline .232354 .010739
+bezier .202668 -.645338E-02 .16912 -.971846E-02 .135703 -.878649E-02
+bezier .100661 -.677557E-02 .595873E-01 .756128E-02 .410036E-01 .410036E-01
+bezier .284013E-01 .596883E-01 .02458 .083522 .224544E-01 .104462
+aline .224544E-01 .136679
+bezier .242947E-01 .172722 .397261E-01 .213419 .732208E-01 .232354
+bezier .924021E-01 .243995 .11511 .247875 .135703 .249927
+aline .165967 .249927
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="H" !-------------- Beginning of new char.
+dfont wid=.794449 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .751733E-01 .242117
+aline .771259E-01 .24114
+aline .790785E-01 .240164
+aline .820073E-01 .237235
+aline .839598E-01 .23333
+aline .839598E-01 .142536
+aline .849361E-01 .14156
+aline .195255 .14156
+aline .196232 .142536
+aline .196232 .23333
+aline .198184 .237235
+aline .201113 .240164
+aline .205018 .242117
+aline .238212 .242117
+aline .242117 .240164
+aline .245046 .237235
+aline .246998 .23333
+aline .246998 .781022E-02
+aline .245046 .390511E-02
+aline .242117 .976277E-03
+aline .238212 -.976277E-03
+aline .205018 -.976277E-03
+aline .201113 .976277E-03
+aline .198184 .390511E-02
+aline .196232 .781022E-02
+aline .196232 .108367
+aline .195255 .109343
+aline .849361E-01 .109343
+aline .839598E-01 .108367
+aline .839598E-01 .781022E-02
+aline .820073E-01 .390511E-02
+aline .790785E-01 .976277E-03
+aline .751733E-01 -.976277E-03
+aline .429562E-01 -.976277E-03
+aline .400274E-01 0
+aline .380748E-01 .976277E-03
+aline .035146 .390511E-02
+aline .341697E-01 .585766E-02
+aline .331934E-01 .878649E-02
+aline .331934E-01 .232354
+aline .341697E-01 .235283
+aline .035146 .237235
+aline .380748E-01 .240164
+aline .400274E-01 .24114
+aline .429562E-01 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="I" !-------------- Beginning of new char.
+dfont wid=.330557 hei=.694445 dep=0 italic=0
+dfont fby="I" kadd=.0305557
+set path ! start of curve
+newpath
+! start of curve
+amove .751733E-01 .242117
+aline .771259E-01 .24114
+aline .790785E-01 .240164
+aline .820073E-01 .237235
+aline .839598E-01 .23333
+aline .839598E-01 .781022E-02
+aline .820073E-01 .390511E-02
+aline .790785E-01 .976277E-03
+aline .751733E-01 -.976277E-03
+aline .429562E-01 -.976277E-03
+aline .400274E-01 0
+aline .380748E-01 .976277E-03
+aline .035146 .390511E-02
+aline .341697E-01 .585766E-02
+aline .331934E-01 .878649E-02
+aline .331934E-01 .232354
+aline .341697E-01 .235283
+aline .035146 .237235
+aline .380748E-01 .240164
+aline .400274E-01 .24114
+aline .429562E-01 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="J" !-------------- Beginning of new char.
+dfont wid=.519447 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .14156 .242117
+aline .143513 .24114
+aline .145465 .240164
+aline .148394 .237235
+aline .150347 .23333
+aline .150347 .410036E-01
+bezier .147903 .144324E-01 .122697 -.77876E-02 .956752E-01 -.781022E-02
+bezier .069557 -.109416E-01 .409965E-01 -.607789E-02 .017573 .781022E-02
+bezier .184855E-01 .203611E-01 .216955E-01 .032214 .234307E-01 .449088E-01
+aline .253832E-01 .468613E-01
+aline .302646E-01 .468613E-01
+bezier .043294 .244937E-01 .807073E-01 .01625 .976277E-01 .380748E-01
+aline .098604 .410036E-01
+aline .995803E-01 .449088E-01
+aline .100557 .045885
+aline .100557 .23333
+aline .102509 .237235
+aline .105438 .240164
+aline .10739 .24114
+aline .109343 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="K" !-------------- Beginning of new char.
+dfont wid=.763893 hei=.694445 dep=0 italic=0
+dfont fby="C" kadd=-.0305557
+dfont fby="G" kadd=-.0305557
+dfont fby="O" kadd=-.0305557
+dfont fby="Q" kadd=-.0305557
+set path ! start of curve
+newpath
+! start of curve
+amove .693157E-01 .242117
+aline .712682E-01 .24114
+aline .732208E-01 .240164
+aline .761496E-01 .237235
+aline .781022E-01 .23333
+aline .781022E-01 .129845
+aline .795666E-01 .129113
+bezier .119012 .165483 .157667 .202951 .197208 .239188
+aline .201113 .24114
+aline .205018 .242117
+aline .24114 .242117
+aline .242117 .24114
+aline .244069 .240164
+aline .245046 .238212
+aline .245046 .232354
+bezier .213749 .201242 .180331 .171437 .148394 .140584
+bezier .181737 .969956E-01 .214319 .528543E-01 .246998 .878649E-02
+aline .246998 .488139E-02
+aline .245046 .976277E-03
+aline .243093 0
+aline .242117 -.976277E-03
+aline .205994 -.976277E-03
+bezier .192959 .45419E-02 .188256 .197621E-01 .178659 .292883E-01
+bezier .158908 .569296E-01 .138033 .840624E-01 .117641 .111052
+aline .116177 .110319
+aline .110319 .104462
+aline .108367 .103485
+aline .937226E-01 .888412E-01
+aline .917701E-01 .878649E-01
+aline .781022E-01 .741971E-01
+aline .781022E-01 .781022E-02
+aline .761496E-01 .390511E-02
+aline .732208E-01 .976277E-03
+aline .693157E-01 -.976277E-03
+aline .429562E-01 -.976277E-03
+aline .400274E-01 0
+aline .380748E-01 .976277E-03
+aline .035146 .390511E-02
+aline .341697E-01 .585766E-02
+aline .331934E-01 .878649E-02
+aline .331934E-01 .232354
+aline .341697E-01 .235283
+aline .035146 .237235
+aline .380748E-01 .240164
+aline .400274E-01 .24114
+aline .429562E-01 .242117
+aline .693157E-01 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="L" !-------------- Beginning of new char.
+dfont wid=.580559 hei=.694445 dep=0 italic=0
+dfont fby="T" kadd=-.0916672
+dfont fby="V" kadd=-.122223
+dfont fby="W" kadd=-.122223
+dfont fby="Y" kadd=-.0916672
+set path ! start of curve
+newpath
+! start of curve
+amove .751733E-01 .242117
+aline .771259E-01 .24114
+aline .790785E-01 .240164
+aline .820073E-01 .237235
+aline .839598E-01 .23333
+aline .839598E-01 .341697E-01
+aline .849361E-01 .331934E-01
+aline .898175E-01 .331934E-01
+aline .907938E-01 .341697E-01
+aline .156204 .341697E-01
+aline .157181 .035146
+aline .177682 .035146
+aline .180611 .341697E-01
+aline .181588 .331934E-01
+aline .18354 .322171E-01
+aline .184516 .312409E-01
+aline .185493 .292883E-01
+aline .186469 .028312
+aline .187445 .253832E-01
+aline .187445 .781022E-02
+aline .185493 .390511E-02
+aline .182564 .976277E-03
+aline .178659 -.976277E-03
+aline .429562E-01 -.976277E-03
+aline .400274E-01 0
+aline .380748E-01 .976277E-03
+aline .035146 .390511E-02
+aline .341697E-01 .585766E-02
+aline .331934E-01 .878649E-02
+aline .331934E-01 .232354
+aline .341697E-01 .235283
+aline .035146 .237235
+aline .380748E-01 .240164
+aline .400274E-01 .24114
+aline .429562E-01 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="M" !-------------- Beginning of new char.
+dfont wid=.977783 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .868887E-01 .242117
+bezier .104046 .237167 .104755 .216451 .112272 .203066
+bezier .132985 .152714 .15429 .997823E-01 .172941 .050348
+bezier .193577 .112616 .220418 .172603 .245046 .23333
+aline .250903 .239188
+aline .254808 .24114
+aline .257737 .242117
+aline .302646 .242117
+aline .306551 .240164
+aline .30948 .237235
+aline .311432 .23333
+aline .311432 .781022E-02
+aline .30948 .390511E-02
+aline .306551 .976277E-03
+aline .302646 -.976277E-03
+aline .278239 -.976277E-03
+aline .274334 .976277E-03
+aline .271405 .390511E-02
+aline .269453 .781022E-02
+aline .269453 .198184
+aline .268476 .199161
+bezier .246133 .136377 .220817 .745315E-01 .194279 .136679E-01
+aline .192327 .117153E-01
+aline .190374 .010739
+aline .189398 .976277E-02
+aline .185493 .781022E-02
+bezier .171435 .561028E-02 .150059 .392068E-02 .145465 .214781E-01
+bezier .121571 .803677E-01 .957341E-01 .138547 .761496E-01 .199161
+aline .751733E-01 .198184
+aline .751733E-01 .781022E-02
+aline .732208E-01 .390511E-02
+aline .070292 .976277E-03
+aline .663868E-01 -.976277E-03
+aline .429562E-01 -.976277E-03
+aline .400274E-01 0
+aline .380748E-01 .976277E-03
+aline .035146 .390511E-02
+aline .341697E-01 .585766E-02
+aline .331934E-01 .878649E-02
+aline .331934E-01 .232354
+aline .341697E-01 .235283
+aline .035146 .237235
+aline .380748E-01 .240164
+aline .400274E-01 .24114
+aline .429562E-01 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="N" !-------------- Beginning of new char.
+dfont wid=.794449 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .898175E-01 .242117
+aline .937226E-01 .24114
+aline .976277E-01 .239188
+aline .098604 .238212
+aline .100557 .237235
+aline .104462 .23333
+aline .10739 .227473
+aline .108367 .226496
+aline .123011 .197208
+aline .123987 .196232
+aline .138631 .166943
+aline .139608 .165967
+aline .154252 .136679
+aline .155228 .135703
+aline .170849 .104462
+aline .171825 .103485
+aline .186469 .741971E-01
+aline .187445 .732208E-01
+aline .202089 .439325E-01
+aline .203066 .429562E-01
+aline .204042 .410036E-01
+aline .205018 .419799E-01
+aline .205018 .23333
+aline .206971 .237235
+aline .2099 .240164
+aline .213805 .242117
+aline .238212 .242117
+aline .242117 .240164
+aline .245046 .237235
+aline .246998 .23333
+aline .246998 .781022E-02
+aline .245046 .390511E-02
+aline .242117 .976277E-03
+aline .238212 -.976277E-03
+aline .190374 -.976277E-03
+aline .186469 0
+aline .182564 .195255E-02
+aline .181588 .292883E-02
+aline .179635 .390511E-02
+aline .17573 .781022E-02
+aline .172801 .136679E-01
+aline .171825 .146442E-01
+aline .157181 .439325E-01
+aline .156204 .449088E-01
+aline .14156 .741971E-01
+aline .140584 .751733E-01
+aline .12594 .104462
+aline .124963 .105438
+aline .109343 .136679
+aline .108367 .137655
+aline .937226E-01 .166943
+aline .927463E-01 .16792
+aline .781022E-01 .197208
+aline .771259E-01 .198184
+aline .761496E-01 .200137
+aline .751733E-01 .199161
+aline .751733E-01 .781022E-02
+aline .732208E-01 .390511E-02
+aline .070292 .976277E-03
+aline .663868E-01 -.976277E-03
+aline .429562E-01 -.976277E-03
+aline .400274E-01 0
+aline .380748E-01 .976277E-03
+aline .035146 .390511E-02
+aline .341697E-01 .585766E-02
+aline .331934E-01 .878649E-02
+aline .331934E-01 .232354
+aline .341697E-01 .235283
+aline .035146 .237235
+aline .380748E-01 .240164
+aline .400274E-01 .24114
+aline .429562E-01 .242117
+aline .898175E-01 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="O" !-------------- Beginning of new char.
+dfont wid=.794449 hei=.694445 dep=0 italic=0
+dfont fby="A" kadd=-.0305557
+dfont fby="V" kadd=-.0305557
+dfont fby="W" kadd=-.0305557
+dfont fby="X" kadd=-.0305557
+dfont fby="Y" kadd=-.0305557
+set path ! start of curve
+newpath
+! start of curve
+amove .153276 .249927
+bezier .187259 .247971 .225321 .231923 .24114 .199161
+bezier .253158 .17965 .255371 .155751 .257737 .134726
+aline .257737 .102509
+bezier .255848 .667954E-01 .242284 .247905E-01 .207947 .683394E-02
+bezier .174143 -.012227 .13406 -.116956E-01 .976277E-01 -.390511E-02
+bezier .546329E-01 .592832E-02 .025614 .475694E-01 .244069E-01 .907938E-01
+aline .234307E-01 .917701E-01
+aline .234307E-01 .101533
+aline .224544E-01 .102509
+aline .224544E-01 .134726
+bezier .243408E-01 .170746 .367514E-01 .213856 .712682E-01 .23333
+bezier .960719E-01 .249034 .125028 .250497 .153276 .249927
+closepath
+! end of curve
+
+! start of curve
+amove .130821 .222591
+bezier .104863 .221316 .833658E-01 .200131 .781022E-01 .174754
+aline .761496E-01 .164991
+aline .751733E-01 .164015
+aline .751733E-01 .158157
+aline .741971E-01 .157181
+aline .741971E-01 .147418
+aline .732208E-01 .146442
+aline .732208E-01 .101533
+bezier .756759E-01 .732134E-01 .834518E-01 .351163E-01 .115201 .234307E-01
+bezier .145987 .972534E-02 .18825 .249334E-01 .198184 .595529E-01
+bezier .203999 .735326E-01 .205133 .875231E-01 .206971 .101533
+aline .206971 .146442
+bezier .204585 .173134 .196025 .208755 .165967 .218686
+aline .160109 .220639
+aline .155228 .221615
+aline .154252 .222591
+aline .14937 .222591
+aline .148394 .223567
+aline .131797 .223567
+aline .130821 .222591
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="P" !-------------- Beginning of new char.
+dfont wid=.702782 hei=.694445 dep=0 italic=0
+dfont fby="," kadd=-.0916672
+dfont fby="." kadd=-.0916672
+dfont fby="A" kadd=-.0916672
+dfont fby="a" kadd=-.0305557
+dfont fby="e" kadd=-.0305557
+dfont fby="o" kadd=-.0305557
+set path ! start of curve
+newpath
+! start of curve
+amove .14937 .242117
+bezier .175803 .240601 .207938 .229542 .218686 .202089
+bezier .228776 .177837 .22849 .149365 .215757 .12594
+bezier .203354 .105162 .177842 .959902E-01 .155228 .937226E-01
+aline .849361E-01 .937226E-01
+aline .839598E-01 .927463E-01
+aline .839598E-01 .781022E-02
+aline .820073E-01 .390511E-02
+aline .790785E-01 .976277E-03
+aline .751733E-01 -.976277E-03
+aline .429562E-01 -.976277E-03
+aline .400274E-01 0
+aline .380748E-01 .976277E-03
+aline .035146 .390511E-02
+aline .341697E-01 .585766E-02
+aline .331934E-01 .878649E-02
+aline .331934E-01 .232354
+aline .341697E-01 .235283
+aline .035146 .237235
+aline .380748E-01 .240164
+aline .400274E-01 .24114
+aline .429562E-01 .242117
+aline .14937 .242117
+closepath
+! end of curve
+
+! start of curve
+amove .829836E-01 .211852
+aline .829836E-01 .121058
+aline .839598E-01 .120082
+aline .136679 .120082
+bezier .152452 .121866 .173224 .129297 .17573 .148394
+bezier .180113 .168521 .179929 .198692 .156204 .207947
+aline .150347 .2099
+aline .145465 .210876
+aline .144489 .211852
+aline .138631 .211852
+aline .137655 .212828
+aline .839598E-01 .212828
+aline .829836E-01 .211852
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="Q" !-------------- Beginning of new char.
+dfont wid=.794449 hei=.694445 dep=.105556 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .153276 .249927
+bezier .187259 .247971 .225321 .231923 .24114 .199161
+bezier .253158 .17965 .255371 .155751 .257737 .134726
+aline .257737 .102509
+bezier .255766 .686144E-01 .243925 .289685E-01 .212828 .976277E-02
+aline .210876 .781022E-02
+bezier .220029 -.531166E-02 .232711 -.167468E-01 .239188 -.312409E-01
+aline .238212 -.341697E-01
+aline .235283 -.370985E-01
+aline .23333 -.380748E-01
+aline .19135 -.380748E-01
+bezier .177738 -.329142E-01 .174783 -.015832 .164503 -.707801E-02
+bezier .121837 -.131677E-01 .06856 -.563341E-02 .429562E-01 .341697E-01
+bezier .286245E-01 .538391E-01 .246351E-01 .798528E-01 .224544E-01 .102509
+aline .224544E-01 .134726
+bezier .243408E-01 .170746 .367514E-01 .213856 .712682E-01 .23333
+bezier .960719E-01 .249034 .125028 .250497 .153276 .249927
+closepath
+! end of curve
+
+! start of curve
+amove .130821 .222591
+bezier .108553 .220718 .881161E-01 .205133 .081031 .18354
+aline .781022E-01 .174754
+aline .771259E-01 .170849
+aline .751733E-01 .161086
+aline .741971E-01 .160109
+aline .741971E-01 .154252
+aline .732208E-01 .153276
+aline .732208E-01 .14156
+aline .722445E-01 .140584
+aline .722445E-01 .976277E-01
+bezier .744974E-01 .697437E-01 .829929E-01 .327139E-01 .114224 .224544E-01
+aline .120082 .205018E-01
+aline .124963 .195255E-01
+aline .12594 .185493E-01
+aline .130821 .185493E-01
+aline .131797 .017573
+aline .147418 .017573
+bezier .145707 .243579E-01 .137602 .324572E-01 .13375 .400274E-01
+bezier .129228 .472748E-01 .117423 .568871E-01 .12594 .654106E-01
+aline .127892 .663868E-01
+aline .164015 .663868E-01
+bezier .173457 .058654 .178966 .464964E-01 .187933 .383189E-01
+bezier .200616 .502578E-01 .203237 .070355 .206971 .859124E-01
+aline .206971 .966514E-01
+aline .207947 .976277E-01
+aline .207947 .140584
+bezier .205452 .168446 .198357 .205565 .16792 .21771
+aline .159133 .220639
+aline .155228 .221615
+aline .154252 .222591
+aline .14937 .222591
+aline .148394 .223567
+aline .131797 .223567
+aline .130821 .222591
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="R" !-------------- Beginning of new char.
+dfont wid=.702782 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .146442 .242117
+bezier .175292 .240545 .211238 .229383 .221615 .198184
+bezier .230859 .171988 .22494 .139131 .200137 .123011
+aline .186469 .116177
+aline .177682 .113248
+aline .169872 .111296
+bezier .190098 .766207E-01 .212086 .423277E-01 .230401 .683394E-02
+aline .229425 .390511E-02
+aline .228449 .195255E-02
+aline .226496 0
+aline .224544 -.976277E-03
+aline .189398 -.976277E-03
+bezier .177431 .492227E-02 .174826 .203214E-01 .166943 .302646E-01
+bezier .152159 .564316E-01 .137641 .827924E-01 .122035 .108367
+aline .839598E-01 .108367
+aline .829836E-01 .10739
+aline .829836E-01 .781022E-02
+aline .081031 .390511E-02
+aline .781022E-01 .976277E-03
+aline .741971E-01 -.976277E-03
+aline .429562E-01 -.976277E-03
+aline .400274E-01 0
+aline .380748E-01 .976277E-03
+aline .035146 .390511E-02
+aline .341697E-01 .585766E-02
+aline .331934E-01 .878649E-02
+aline .331934E-01 .232354
+aline .341697E-01 .235283
+aline .035146 .237235
+aline .380748E-01 .240164
+aline .400274E-01 .24114
+aline .429562E-01 .242117
+aline .146442 .242117
+closepath
+! end of curve
+
+! start of curve
+amove .829836E-01 .211852
+aline .829836E-01 .13375
+aline .839598E-01 .132774
+aline .139608 .132774
+aline .140584 .13375
+aline .147418 .13375
+aline .148394 .134726
+aline .152299 .135703
+aline .158157 .137655
+bezier .179328 .145625 .180777 .173101 .174754 .19135
+bezier .170478 .206735 .152475 .210619 .139608 .212828
+aline .839598E-01 .212828
+aline .829836E-01 .211852
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="S" !-------------- Beginning of new char.
+dfont wid=.611115 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .122035 .249927
+bezier .141577 .247891 .163611 .242444 .180611 .230401
+bezier .179734 .217507 .176339 .205423 .174754 .192327
+aline .173777 .189398
+aline .172801 .187445
+aline .16792 .187445
+bezier .145934 .213796 .105924 .223367 .761496E-01 .206971
+bezier .604781E-01 .194935 .628452E-01 .169315 .800547E-01 .160109
+bezier .106507 .146505 .141086 .150109 .164015 .128869
+bezier .201804 .101202 .203762 .387596E-01 .168896 .781022E-02
+bezier .141445 -.126005E-01 .10566 -.104184E-01 .741971E-01 -.585766E-02
+aline .624817E-01 -.292883E-02
+aline .478376E-01 .195255E-02
+aline .439325E-01 .390511E-02
+aline .410036E-01 .488139E-02
+aline .253832E-01 .126916E-01
+aline .244069E-01 .136679E-01
+aline .205018E-01 .156204E-01
+aline .185493E-01 .017573
+bezier .194265E-01 .304672E-01 .228211E-01 .425521E-01 .244069E-01 .556478E-01
+aline .253832E-01 .585766E-01
+aline .263595E-01 .605292E-01
+aline .312409E-01 .605292E-01
+bezier .583995E-01 .034404 .1003 .193196E-01 .135703 .341697E-01
+bezier .156694 .476016E-01 .154231 .818936E-01 .131797 .927463E-01
+bezier .103489 .104383 .683022E-01 .102478 .045885 .12594
+bezier .261722E-01 .141438 .187905E-01 .169443 .234307E-01 .193303
+bezier .272842E-01 .227134 .060545 .249996 .927463E-01 .248951
+aline .937226E-01 .249927
+aline .122035 .249927
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="T" !-------------- Beginning of new char.
+dfont wid=.733337 hei=.694445 dep=0 italic=0
+dfont fby="A" kadd=-.0916672
+dfont fby="a" kadd=-.0916672
+dfont fby="e" kadd=-.0916672
+dfont fby="o" kadd=-.0916672
+dfont fby="r" kadd=-.0916672
+dfont fby="u" kadd=-.0916672
+dfont fby="y" kadd=-.0916672
+set path ! start of curve
+newpath
+! start of curve
+amove .235283 .240164
+aline .237235 .239188
+aline .239188 .238212
+aline .242117 .235283
+aline .244069 .231378
+aline .244069 .212828
+aline .242117 .208923
+aline .239188 .205994
+aline .235283 .204042
+aline .205018 .204042
+aline .204042 .205018
+aline .156204 .205018
+aline .155228 .204042
+aline .155228 .781022E-02
+aline .153276 .390511E-02
+aline .150347 .976277E-03
+aline .146442 -.976277E-03
+aline .114224 -.976277E-03
+aline .111296 0
+aline .109343 .976277E-03
+aline .106414 .390511E-02
+aline .105438 .585766E-02
+aline .104462 .878649E-02
+aline .104462 .204042
+aline .103485 .205018
+aline .546715E-01 .205018
+aline .536952E-01 .204042
+aline .234307E-01 .204042
+aline .195255E-01 .205994
+aline .165967E-01 .208923
+aline .146442E-01 .212828
+aline .146442E-01 .230401
+aline .156204E-01 .23333
+aline .165967E-01 .235283
+aline .195255E-01 .238212
+aline .214781E-01 .239188
+aline .244069E-01 .240164
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="U" !-------------- Beginning of new char.
+dfont wid=.763893 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .751733E-01 .242117
+aline .771259E-01 .24114
+aline .790785E-01 .240164
+aline .820073E-01 .237235
+aline .839598E-01 .23333
+aline .839598E-01 .673631E-01
+bezier .855742E-01 .509123E-01 .921911E-01 .295913E-01 .111296 .244069E-01
+bezier .133368 .175436E-01 .161216 .182251E-01 .178659 .361223E-01
+aline .179635 .380748E-01
+aline .180611 .390511E-01
+aline .184516 .468613E-01
+aline .185493 .497901E-01
+aline .186469 .536952E-01
+aline .187445 .585766E-01
+aline .188421 .595529E-01
+aline .188421 .673631E-01
+aline .189398 .683394E-01
+aline .189398 .23333
+aline .19135 .237235
+aline .194279 .240164
+aline .198184 .242117
+aline .227473 .242117
+aline .231378 .240164
+aline .234307 .237235
+aline .236259 .23333
+aline .236259 .683394E-01
+bezier .234275 .353381E-01 .211123 .350139E-02 .177682 -.390511E-02
+aline .174754 -.488139E-02
+aline .170849 -.585766E-02
+aline .165967 -.683394E-02
+aline .161086 -.683394E-02
+aline .160109 -.781022E-02
+aline .152299 -.781022E-02
+aline .151323 -.878649E-02
+aline .120082 -.878649E-02
+bezier .891734E-01 -.708246E-02 .530831E-01 .751979E-02 .410036E-01 .390511E-01
+aline .390511E-01 .429562E-01
+aline .370985E-01 .488139E-01
+aline .035146 .566241E-01
+aline .341697E-01 .615055E-01
+aline .341697E-01 .673631E-01
+aline .331934E-01 .683394E-01
+aline .331934E-01 .232354
+aline .341697E-01 .235283
+aline .035146 .237235
+aline .380748E-01 .240164
+aline .400274E-01 .24114
+aline .429562E-01 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="V" !-------------- Beginning of new char.
+dfont wid=.733337 hei=.694445 dep=0 italic=.0152788
+dfont fby="A" kadd=-.0916672
+dfont fby="C" kadd=-.0305557
+dfont fby="G" kadd=-.0305557
+dfont fby="O" kadd=-.0305557
+dfont fby="Q" kadd=-.0305557
+dfont fby="a" kadd=-.0305557
+dfont fby="e" kadd=-.0305557
+dfont fby="o" kadd=-.0305557
+dfont fby="r" kadd=-.0305557
+dfont fby="u" kadd=-.0305557
+set path ! start of curve
+newpath
+! start of curve
+amove .507664E-01 .242117
+bezier .673996E-01 .237339 .672959E-01 .217112 .741971E-01 .204042
+bezier .934307E-01 .150047 .114514 .967225E-01 .131797 .419799E-01
+bezier .153442 .106295 .176936 .170002 .201113 .23333
+aline .206971 .239188
+aline .210876 .24114
+aline .213805 .242117
+aline .242117 .242117
+aline .244069 .24114
+aline .246998 .238212
+aline .247974 .236259
+bezier .246851 .21928 .236953 .203862 .232354 .187445
+bezier .209628 .127353 .188333 .666702E-01 .164991 .683394E-02
+aline .161086 .292883E-02
+aline .159133 .195255E-02
+aline .158157 .976277E-03
+aline .156204 0
+aline .153276 -.976277E-03
+aline .105438 -.976277E-03
+bezier .873049E-01 .482303E-02 .880766E-01 .276289E-01 .800547E-01 .419799E-01
+bezier .572033E-01 .104567 .034098 .167048 .010739 .229425
+aline .010739 .236259
+aline .117153E-01 .238212
+aline .146442E-01 .24114
+aline .165967E-01 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="W" !-------------- Beginning of new char.
+dfont wid=1.03889 hei=.694445 dep=0 italic=.0152788
+dfont fby="A" kadd=-.0916672
+dfont fby="C" kadd=-.0305557
+dfont fby="G" kadd=-.0305557
+dfont fby="O" kadd=-.0305557
+dfont fby="Q" kadd=-.0305557
+dfont fby="a" kadd=-.0305557
+dfont fby="e" kadd=-.0305557
+dfont fby="o" kadd=-.0305557
+dfont fby="r" kadd=-.0305557
+dfont fby="u" kadd=-.0305557
+set path ! start of curve
+newpath
+! start of curve
+amove .429562E-01 .242117
+aline .045885 .24114
+aline .478376E-01 .240164
+aline .536952E-01 .234307
+bezier .664172E-01 .194576 .755718E-01 .153505 .868887E-01 .113248
+aline .098604 .663868E-01
+aline .995803E-01 .615055E-01
+aline .100557 .576004E-01
+aline .102509 .478376E-01
+aline .102509 .429562E-01
+aline .103485 .419799E-01
+aline .104462 .439325E-01
+aline .105438 .449088E-01
+aline .105438 .497901E-01
+aline .106414 .546715E-01
+aline .10739 .585766E-01
+aline .108367 .063458
+aline .122035 .11813
+bezier .133473 .15732 .141244 .19822 .155228 .236259
+aline .158157 .239188
+aline .162062 .24114
+aline .164991 .242117
+aline .204042 .242117
+aline .206971 .24114
+aline .210876 .239188
+aline .214781 .235283
+bezier .229404 .189775 .239957 .142779 .252856 .966514E-01
+aline .263595 .536952E-01
+aline .265547 .439325E-01
+aline .266524 .419799E-01
+bezier .281782 .106504 .299011 .17067 .31729 .234307
+aline .323148 .240164
+aline .3251 .24114
+aline .328029 .242117
+aline .349507 .242117
+aline .353412 .240164
+aline .355365 .238212
+aline .356341 .236259
+bezier .354213 .211688 .344348 .1881 .338768 .164015
+bezier .324505 .111617 .311256 .05883 .295812 .683394E-02
+aline .289954 .976277E-03
+aline .288002 0
+aline .285073 -.976277E-03
+aline .245046 -.976277E-03
+bezier .230142 .225091E-02 .230837 .196963E-01 .226496 .312409E-01
+bezier .215196 .738978E-01 .203694 .116496 .192327 .159133
+aline .18354 .194279
+aline .182672 .198618
+aline .182076 .198916
+aline .181479 .198618
+aline .180611 .194279
+aline .172801 .163038
+bezier .157759 .110504 .146328 .563602E-01 .128869 .488139E-02
+aline .126916 .292883E-02
+aline .124963 .195255E-02
+aline .123987 .976277E-03
+aline .122035 0
+aline .119106 -.976277E-03
+aline .081031 -.976277E-03
+aline .781022E-01 0
+bezier .635407E-01 .921091E-02 .065704 .294377E-01 .595529E-01 .439325E-01
+bezier .430868E-01 .105476 .264269E-01 .166963 .976277E-02 .228449
+aline .976277E-02 .236259
+aline .010739 .238212
+aline .126916E-01 .240164
+aline .146442E-01 .24114
+aline .165967E-01 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="X" !-------------- Beginning of new char.
+dfont wid=.733337 hei=.694445 dep=0 italic=0
+dfont fby="C" kadd=-.0305557
+dfont fby="G" kadd=-.0305557
+dfont fby="O" kadd=-.0305557
+dfont fby="Q" kadd=-.0305557
+set path ! start of curve
+newpath
+! start of curve
+amove .683394E-01 .242117
+bezier .081149 .236988 .856348E-01 .222185 .946989E-01 .212828
+bezier .10516 .198574 .115164 .183451 .126428 .170116
+bezier .144348 .191896 .158974 .216932 .176706 .239188
+aline .178659 .240164
+aline .179635 .24114
+aline .182564 .242117
+aline .223567 .242117
+bezier .233109 .238049 .226555 .227526 .221615 .222591
+bezier .198644 .190929 .175584 .159331 .152299 .127892
+bezier .183205 .884178E-01 .214064 .489095E-01 .244069 .878649E-02
+aline .244069 .390511E-02
+aline .243093 .195255E-02
+aline .24114 0
+aline .239188 -.976277E-03
+aline .195255 -.976277E-03
+bezier .18367 .377409E-02 .179887 .175724E-01 .171825 .263595E-01
+bezier .157009 .479479E-01 .141732 .692048E-01 .126916 .907938E-01
+bezier .104946 .616782E-01 .871558E-01 .02955 .644343E-01 .976277E-03
+aline .624817E-01 0
+aline .595529E-01 -.976277E-03
+aline .195255E-01 -.976277E-03
+aline .017573 0
+bezier .794899E-02 .709944E-02 .199523E-01 .157024E-01 .234307E-01 .224544E-01
+bezier .494179E-01 .573996E-01 .746909E-01 .928608E-01 .100557 .127892
+bezier .740287E-01 .163671 .445118E-01 .197623 .195255E-01 .234307
+aline .195255E-01 .235283
+aline .205018E-01 .238212
+aline .234307E-01 .24114
+aline .253832E-01 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="Y" !-------------- Beginning of new char.
+dfont wid=.733337 hei=.694445 dep=0 italic=.0274992
+dfont fby="A" kadd=-.0916672
+dfont fby="a" kadd=-.0916672
+dfont fby="e" kadd=-.0916672
+dfont fby="o" kadd=-.0916672
+dfont fby="r" kadd=-.0916672
+dfont fby="u" kadd=-.0916672
+set path ! start of curve
+newpath
+! start of curve
+amove .052719 .242117
+bezier .074326 .237691 .804516E-01 .213598 .937226E-01 .199161
+bezier .106885 .17988 .120769 .15855 .132969 .140193
+bezier .151953 .173444 .174583 .204492 .197208 .235283
+aline .199161 .236259
+aline .201113 .238212
+aline .205018 .240164
+aline .207947 .24114
+aline .211852 .242117
+aline .244069 .242117
+aline .246022 .24114
+bezier .255147 .231204 .239915 .221861 .236259 .212828
+bezier .208385 .174489 .182373 .134811 .154252 .966514E-01
+aline .154252 .781022E-02
+aline .152299 .390511E-02
+aline .14937 .976277E-03
+aline .145465 -.976277E-03
+aline .113248 -.976277E-03
+aline .109343 .976277E-03
+aline .106414 .390511E-02
+aline .104462 .781022E-02
+aline .104462 .966514E-01
+bezier .721787E-01 .141044 .415046E-01 .186596 .976277E-02 .231378
+aline .976277E-02 .237235
+aline .010739 .239188
+aline .126916E-01 .24114
+aline .146442E-01 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="Z" !-------------- Beginning of new char.
+dfont wid=.672226 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .205994 .242117
+aline .207947 .24114
+aline .2099 .240164
+aline .212828 .237235
+aline .214781 .23333
+aline .214781 .21771
+bezier .172983 .156036 .128428 .958053E-01 .849361E-01 .035146
+aline .859124E-01 .341697E-01
+aline .163038 .341697E-01
+aline .164015 .035146
+aline .207947 .035146
+aline .211852 .331934E-01
+aline .214781 .302646E-01
+aline .216734 .263595E-01
+aline .216734 .781022E-02
+aline .214781 .390511E-02
+aline .211852 .976277E-03
+aline .207947 -.976277E-03
+aline .312409E-01 -.976277E-03
+aline .273358E-01 .976277E-03
+aline .244069E-01 .390511E-02
+aline .224544E-01 .781022E-02
+aline .224544E-01 .253832E-01
+bezier .648748E-01 .866366E-01 .108938 .146706 .152055 .207459
+aline .151323 .208923
+aline .800547E-01 .208923
+aline .790785E-01 .207947
+aline .370985E-01 .207947
+aline .331934E-01 .2099
+aline .302646E-01 .212828
+aline .028312 .216734
+aline .028312 .232354
+aline .292883E-01 .235283
+aline .302646E-01 .237235
+aline .331934E-01 .240164
+aline .035146 .24114
+aline .380748E-01 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="[" !-------------- Beginning of new char.
+dfont wid=.343058 hei=.75 dep=.25 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .104462 .261642
+aline .106414 .260666
+aline .108367 .25969
+aline .111296 .256761
+aline .113248 .252856
+aline .113248 .246022
+aline .111296 .242117
+aline .108367 .239188
+aline .104462 .237235
+aline .771259E-01 .237235
+aline .761496E-01 .236259
+aline .761496E-01 -.063458
+aline .771259E-01 -.644343E-01
+aline .104462 -.644343E-01
+aline .108367 -.663868E-01
+aline .111296 -.693157E-01
+aline .113248 -.732208E-01
+aline .113248 -.800547E-01
+aline .111296 -.839598E-01
+aline .108367 -.868887E-01
+aline .104462 -.888412E-01
+aline .400274E-01 -.888412E-01
+aline .361223E-01 -.868887E-01
+aline .331934E-01 -.839598E-01
+aline .312409E-01 -.800547E-01
+aline .312409E-01 .252856
+aline .331934E-01 .256761
+aline .361223E-01 .25969
+aline .380748E-01 .260666
+aline .400274E-01 .261642
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="\" !-------------- Beginning of new char.
+dfont wid=.558336 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .102509 .242117
+aline .104462 .24114
+aline .105438 .239188
+bezier .102997 .227817 .953514E-01 .215278 .937226E-01 .205018
+aline .103485 .205018
+aline .105438 .203066
+aline .105438 .162062
+aline .103485 .160109
+aline .624817E-01 .160109
+aline .605292E-01 .162062
+aline .605292E-01 .203066
+bezier .694736E-01 .215647 .761801E-01 .230557 .859124E-01 .242117
+closepath
+! end of curve
+
+! start of curve
+amove .180611 .242117
+aline .182564 .24114
+aline .18354 .239188
+bezier .181099 .227817 .173453 .215279 .171825 .205018
+aline .181588 .205018
+aline .18354 .203066
+aline .18354 .162062
+aline .181588 .160109
+aline .140584 .160109
+aline .138631 .162062
+aline .138631 .203066
+bezier .147576 .215646 .154282 .230558 .164015 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="]" !-------------- Beginning of new char.
+dfont wid=.343058 hei=.75 dep=.25 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .820073E-01 .261642
+aline .839598E-01 .260666
+aline .859124E-01 .25969
+aline .888412E-01 .256761
+aline .907938E-01 .252856
+aline .907938E-01 -.800547E-01
+aline .888412E-01 -.839598E-01
+aline .859124E-01 -.868887E-01
+aline .820073E-01 -.888412E-01
+aline .017573 -.888412E-01
+aline .136679E-01 -.868887E-01
+aline .010739 -.839598E-01
+aline .878649E-02 -.800547E-01
+aline .878649E-02 -.732208E-01
+aline .010739 -.693157E-01
+aline .136679E-01 -.663868E-01
+aline .017573 -.644343E-01
+aline .449088E-01 -.644343E-01
+aline .045885 -.063458
+aline .045885 .236259
+aline .449088E-01 .237235
+aline .017573 .237235
+aline .136679E-01 .239188
+aline .010739 .242117
+aline .878649E-02 .246022
+aline .878649E-02 .252856
+aline .010739 .256761
+aline .136679E-01 .25969
+aline .156204E-01 .260666
+aline .017573 .261642
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="^" !-------------- Beginning of new char.
+dfont wid=.550003 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .115201 .242117
+bezier .128708 .225639 .142677 .209494 .155228 .192327
+aline .155228 .189398
+aline .153276 .187445
+aline .132774 .187445
+bezier .120894 .197123 .10929 .207186 .971396E-01 .216489
+bezier .849889E-01 .207186 .733852E-01 .197124 .615055E-01 .187445
+aline .410036E-01 .187445
+aline .390511E-01 .189398
+bezier .401559E-01 .198976 .503708E-01 .204518 .546715E-01 .212828
+bezier .638165E-01 .222012 .702615E-01 .233853 .800547E-01 .242117
+aline .115201 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="_" !-------------- Beginning of new char.
+dfont wid=.305557 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .070292 .243093
+aline .732208E-01 .242117
+aline .741971E-01 .24114
+aline .761496E-01 .240164
+aline .771259E-01 .238212
+aline .781022E-01 .237235
+aline .790785E-01 .235283
+aline .800547E-01 .232354
+aline .800547E-01 .213805
+aline .790785E-01 .210876
+aline .781022E-01 .208923
+aline .741971E-01 .205018
+aline .070292 .203066
+aline .380748E-01 .203066
+aline .341697E-01 .205018
+aline .302646E-01 .208923
+aline .292883E-01 .210876
+aline .028312 .213805
+aline .028312 .232354
+aline .292883E-01 .235283
+aline .302646E-01 .237235
+aline .312409E-01 .238212
+aline .322171E-01 .240164
+aline .341697E-01 .24114
+aline .035146 .242117
+aline .380748E-01 .243093
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="`" !-------------- Beginning of new char.
+dfont wid=.305557 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .741971E-01 .242117
+aline .761496E-01 .24114
+aline .771259E-01 .239188
+bezier .746849E-01 .227817 .670393E-01 .215278 .654106E-01 .205018
+aline .751733E-01 .205018
+aline .771259E-01 .203066
+aline .771259E-01 .162062
+aline .751733E-01 .160109
+aline .341697E-01 .160109
+aline .322171E-01 .162062
+aline .322171E-01 .203066
+bezier .411616E-01 .215647 .047868 .230557 .576004E-01 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="a" !-------------- Beginning of new char.
+dfont wid=.525003 hei=.458333 dep=0 italic=0
+dfont fby="r" kadd=-.0305557
+dfont fby="w" kadd=-.0305557
+dfont fby="y" kadd=-.0305557
+set path ! start of curve
+newpath
+! start of curve
+amove .106414 .164991
+bezier .130368 .164038 .158003 .150469 .162062 .123987
+aline .163038 .119106
+aline .163038 .781022E-02
+aline .161086 .390511E-02
+aline .158157 .976277E-03
+aline .154252 -.976277E-03
+aline .12594 -.976277E-03
+aline .122035 .976277E-03
+aline .119106 .390511E-02
+aline .117153 .781022E-02
+aline .117153 .214781E-01
+aline .116177 .224544E-01
+bezier .959583E-01 -.105234E-01 .391123E-01 -.164929E-01 .185493E-01 .195255E-01
+bezier .617627E-02 .387423E-01 .101958E-01 .676403E-01 .312409E-01 .790785E-01
+bezier .570564E-01 .957331E-01 .879302E-01 .950716E-01 .116177 .976277E-01
+aline .116177 .119106
+aline .115201 .120082
+aline .114224 .124963
+bezier .112694 .140359 .943508E-01 .145558 .820073E-01 .14156
+bezier .631898E-01 .141042 .472179E-01 .128877 .341697E-01 .116177
+aline .322171E-01 .116177
+aline .302646E-01 .117153
+aline .292883E-01 .119106
+aline .292883E-01 .124963
+aline .028312 .12594
+aline .028312 .138631
+aline .273358E-01 .139608
+aline .273358E-01 .147418
+aline .028312 .14937
+bezier .522385E-01 .163752 .792369E-01 .16605 .106414 .164991
+closepath
+! end of curve
+
+! start of curve
+amove .110319 .829836E-01
+bezier .09028 .816737E-01 .612351E-01 .751278E-01 .576004E-01 .507664E-01
+bezier .525681E-01 .351164E-01 .070485 .146623E-01 .868887E-01 .205018E-01
+aline .917701E-01 .214781E-01
+aline .956752E-01 .224544E-01
+aline .103485 .263595E-01
+aline .111296 .341697E-01
+aline .114224 .400274E-01
+aline .115201 .439325E-01
+aline .116177 .449088E-01
+aline .116177 .829836E-01
+aline .113248 .835693E-01
+aline .110319 .829836E-01
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="b" !-------------- Beginning of new char.
+dfont wid=.561114 hei=.694445 dep=0 italic=0
+dfont fby="c" kadd=.0305557
+dfont fby="d" kadd=.0305557
+dfont fby="e" kadd=.0305557
+dfont fby="o" kadd=.0305557
+dfont fby="q" kadd=.0305557
+dfont fby="r" kadd=-.0305557
+dfont fby="w" kadd=-.0305557
+dfont fby="x" kadd=-.0305557
+dfont fby="y" kadd=-.0305557
+set path ! start of curve
+newpath
+! start of curve
+amove .595529E-01 .242117
+aline .615055E-01 .24114
+aline .063458 .240164
+aline .663868E-01 .237235
+aline .683394E-01 .23333
+aline .683394E-01 .144489
+aline .693157E-01 .143513
+bezier .998594E-01 .17591 .164545 .168422 .178659 .123011
+bezier .186378 .983876E-01 .186011 .722629E-01 .181588 .468613E-01
+bezier .175486 .185147E-01 .149538 -.434449E-02 .120082 -.390511E-02
+bezier .102488 -.812906E-02 .819422E-01 -.195133E-02 .070292 .126916E-01
+aline .693157E-01 .781022E-02
+aline .673631E-01 .390511E-02
+aline .644343E-01 .976277E-03
+aline .605292E-01 -.976277E-03
+aline .322171E-01 -.976277E-03
+aline .292883E-01 0
+aline .273358E-01 .976277E-03
+aline .244069E-01 .390511E-02
+aline .234307E-01 .585766E-02
+aline .224544E-01 .878649E-02
+aline .224544E-01 .232354
+aline .234307E-01 .235283
+aline .244069E-01 .237235
+aline .273358E-01 .240164
+aline .292883E-01 .24114
+aline .322171E-01 .242117
+closepath
+! end of curve
+
+! start of curve
+amove .946989E-01 .137655
+aline .898175E-01 .136679
+aline .859124E-01 .135703
+aline .829836E-01 .134726
+aline .771259E-01 .131797
+aline .761496E-01 .130821
+aline .741971E-01 .129845
+aline .722445E-01 .127892
+aline .070292 .126916
+aline .693157E-01 .12594
+aline .693157E-01 .341697E-01
+bezier .085107 .111472E-01 .126405 .016361 .13375 .439325E-01
+aline .134726 .478376E-01
+aline .135703 .052719
+aline .136679 .536952E-01
+aline .136679 .605292E-01
+aline .137655 .615055E-01
+aline .137655 .976277E-01
+bezier .13581 .112571 .131072 .133861 .112272 .136679
+aline .10739 .137655
+aline .106414 .138631
+aline .956752E-01 .138631
+aline .946989E-01 .137655
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="c" !-------------- Beginning of new char.
+dfont wid=.488892 hei=.458333 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .113248 .164991
+aline .114224 .164015
+aline .121058 .164015
+aline .12594 .163038
+aline .129845 .162062
+aline .138631 .159133
+aline .140584 .158157
+aline .143513 .157181
+aline .157181 .150347
+aline .159133 .148394
+aline .159133 .143513
+aline .158157 .142536
+aline .158157 .137655
+aline .157181 .136679
+aline .157181 .131797
+aline .156204 .126916
+aline .155228 .12594
+aline .155228 .121058
+aline .154252 .119106
+aline .153276 .11813
+aline .148394 .11813
+bezier .130075 .13782 .988546E-01 .145746 .751733E-01 .131797
+bezier .644607E-01 .123334 .631277E-01 .10823 .605292E-01 .966514E-01
+aline .605292E-01 .063458
+bezier .629223E-01 .484536E-01 .673308E-01 .270994E-01 .859124E-01 .234307E-01
+bezier .109843 .169772E-01 .135666 .281931E-01 .154252 .439325E-01
+aline .157181 .439325E-01
+aline .159133 .419799E-01
+aline .159133 .035146
+aline .160109 .341697E-01
+aline .160109 .224544E-01
+aline .161086 .214781E-01
+aline .161086 .126916E-01
+bezier .131609 -.703292E-02 .937397E-01 -.902878E-02 .605292E-01 0
+bezier .328157E-01 .871515E-02 .142224E-01 .372209E-01 .146442E-01 .654106E-01
+bezier .934156E-02 .997809E-01 .198937E-01 .144798 .566241E-01 .158157
+aline .585766E-01 .159133
+aline .673631E-01 .162062
+aline .712682E-01 .163038
+aline .761496E-01 .163038
+aline .771259E-01 .164015
+aline .839598E-01 .164015
+aline .849361E-01 .164991
+aline .113248 .164991
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="d" !-------------- Beginning of new char.
+dfont wid=.561114 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .166943 .242117
+aline .168896 .24114
+aline .170849 .240164
+aline .173777 .237235
+aline .17573 .23333
+aline .17573 .781022E-02
+aline .173777 .390511E-02
+aline .170849 .976277E-03
+aline .166943 -.976277E-03
+aline .137655 -.976277E-03
+aline .13375 .976277E-03
+aline .130821 .390511E-02
+aline .128869 .781022E-02
+aline .128869 .136679E-01
+aline .127892 .146442E-01
+bezier .979885E-01 -.194892E-01 .335828E-01 -.782301E-02 .195255E-01 .361223E-01
+bezier .114727E-01 .629456E-01 .115256E-01 .917009E-01 .185493E-01 .119106
+bezier .318638E-01 .164535 .967675E-01 .178125 .128869 .145465
+aline .129845 .146442
+aline .129845 .23333
+aline .131797 .237235
+aline .134726 .240164
+aline .136679 .24114
+aline .138631 .242117
+closepath
+! end of curve
+
+! start of curve
+amove .937226E-01 .137655
+bezier .076739 .13672 .639254E-01 .123047 .624817E-01 .106414
+aline .615055E-01 .105438
+aline .615055E-01 .976277E-01
+aline .605292E-01 .966514E-01
+aline .605292E-01 .605292E-01
+bezier .623747E-01 .455858E-01 .671116E-01 .024296 .859124E-01 .214781E-01
+bezier .101224 .156816E-01 .118769 .235197E-01 .128869 .361223E-01
+aline .128869 .126916
+aline .12594 .129845
+aline .123987 .130821
+aline .123011 .131797
+aline .121058 .132774
+aline .120082 .13375
+aline .11813 .134726
+aline .112272 .136679
+aline .10739 .137655
+aline .106414 .138631
+aline .946989E-01 .138631
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="e" !-------------- Beginning of new char.
+dfont wid=.511114 hei=.458333 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .10739 .164991
+bezier .132853 .16346 .158178 .146932 .164991 .121058
+aline .166943 .113248
+aline .16792 .108367
+aline .16792 .101533
+aline .168896 .100557
+aline .168896 .829836E-01
+aline .166943 .790785E-01
+aline .164015 .761496E-01
+aline .160109 .741971E-01
+aline .566241E-01 .741971E-01
+bezier .547975E-01 .610235E-01 .596555E-01 .452953E-01 .673631E-01 .331934E-01
+bezier .928608E-01 .825244E-02 .13458 .207843E-01 .158157 .429562E-01
+aline .160109 .439325E-01
+aline .163038 .439325E-01
+aline .164991 .419799E-01
+aline .164991 .035146
+aline .165967 .341697E-01
+aline .165967 .234307E-01
+aline .166943 .224544E-01
+aline .166943 .146442E-01
+bezier .13529 -.736266E-02 .093399 -.102147E-01 .576004E-01 .195255E-02
+bezier .299869E-01 .118778E-01 .135426E-01 .403761E-01 .117153E-01 .683394E-01
+bezier .948303E-02 .995766E-01 .161835E-01 .13665 .045885 .153276
+aline .468613E-01 .154252
+aline .052719 .157181
+aline .556478E-01 .158157
+aline .576004E-01 .159133
+aline .063458 .161086
+aline .712682E-01 .163038
+aline .761496E-01 .164015
+aline .820073E-01 .164015
+aline .829836E-01 .164991
+aline .10739 .164991
+closepath
+! end of curve
+
+! start of curve
+amove .888412E-01 .139608
+bezier .660961E-01 .137931 .563605E-01 .112873 .566241E-01 .937226E-01
+aline .556478E-01 .927463E-01
+aline .566241E-01 .917701E-01
+aline .129845 .917701E-01
+aline .130821 .927463E-01
+bezier .130026 .108186 .128625 .127796 .113248 .136679
+aline .10739 .138631
+aline .102509 .139608
+aline .101533 .140584
+aline .898175E-01 .140584
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="f" !-------------- Beginning of new char.
+dfont wid=.336113 hei=.694445 dep=0 italic=.0763903
+dfont fby=33 kadd=.0763903
+dfont fby=39 kadd=.0763903
+dfont fby=")" kadd=.0763903
+dfont fby="?" kadd=.0763903
+dfont fby="]" kadd=.0763903
+dfont fby="f" ligrep=11
+dfont fby="i" ligrep=12
+dfont fby="l" ligrep=13
+set path ! start of curve
+newpath
+! start of curve
+amove .112272 .246022
+aline .113248 .245046
+aline .120082 .245046
+aline .129845 .243093
+aline .132774 .242117
+aline .134726 .240164
+aline .134726 .2099
+aline .132774 .207947
+aline .128869 .207947
+bezier .117268 .222432 .918194E-01 .227695 .790785E-01 .212828
+aline .781022E-01 .2099
+aline .771259E-01 .205994
+aline .761496E-01 .205018
+aline .761496E-01 .160109
+aline .771259E-01 .159133
+aline .102509 .159133
+aline .106414 .157181
+aline .109343 .154252
+aline .111296 .150347
+aline .111296 .143513
+aline .109343 .139608
+aline .106414 .136679
+aline .102509 .134726
+aline .781022E-01 .134726
+aline .771259E-01 .13375
+aline .771259E-01 .781022E-02
+aline .751733E-01 .390511E-02
+aline .722445E-01 .976277E-03
+aline .683394E-01 -.976277E-03
+aline .410036E-01 -.976277E-03
+aline .380748E-01 0
+aline .361223E-01 .976277E-03
+aline .331934E-01 .390511E-02
+aline .322171E-01 .585766E-02
+aline .312409E-01 .878649E-02
+aline .312409E-01 .13375
+aline .302646E-01 .134726
+aline .195255E-01 .134726
+aline .156204E-01 .136679
+aline .126916E-01 .139608
+aline .010739 .143513
+aline .010739 .14937
+aline .117153E-01 .152299
+aline .126916E-01 .154252
+aline .156204E-01 .157181
+aline .017573 .158157
+aline .205018E-01 .159133
+aline .302646E-01 .159133
+aline .312409E-01 .160109
+aline .312409E-01 .197208
+bezier .329518E-01 .220079 .510998E-01 .240041 .741971E-01 .244069
+aline .790785E-01 .245046
+aline .859124E-01 .245046
+aline .868887E-01 .246022
+aline .112272 .246022
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="g" !-------------- Beginning of new char.
+dfont wid=.550003 hei=.458333 dep=.194445 italic=.0152788
+dfont fby="j" kadd=.0305557
+set path ! start of curve
+newpath
+! start of curve
+amove .995803E-01 .163038
+aline .100557 .162062
+aline .10739 .162062
+aline .112272 .161086
+aline .120082 .159133
+aline .122035 .158157
+aline .124963 .157181
+aline .132774 .153276
+aline .13375 .152299
+aline .136191 .151689
+bezier .15103 .158429 .167377 .165722 .18354 .162062
+aline .184516 .160109
+aline .185493 .155228
+aline .185493 .150347
+aline .186469 .14937
+aline .186469 .144489
+aline .187445 .143513
+aline .187445 .138631
+aline .185493 .136679
+aline .181588 .136679
+aline .169872 .139608
+aline .168896 .140584
+aline .164015 .140584
+aline .163038 .14156
+aline .154252 .14156
+aline .153276 .142536
+aline .146442 .142536
+aline .145465 .14156
+bezier .165966 .113531 .158312 .640002E-01 .122035 .052719
+bezier .099607 .456037E-01 .754608E-01 .463554E-01 .052719 .517427E-01
+aline .507664E-01 .052719
+aline .478376E-01 .536952E-01
+aline .424681E-01 .05638
+bezier .374744E-01 .473248E-01 .456262E-01 .329653E-01 .566241E-01 .312409E-01
+aline .576004E-01 .302646E-01
+aline .122035 .302646E-01
+bezier .143375 .285723E-01 .171933 .228843E-01 .180611 -.976277E-03
+bezier .188664 -.212766E-01 .185571 -.487799E-01 .164991 -.605292E-01
+bezier .150982 -.705073E-01 .132812 -.723673E-01 .117153 -.741971E-01
+aline .771259E-01 -.741971E-01
+bezier .521278E-01 -.725842E-01 .189331E-01 -.644573E-01 .010739 -.361223E-01
+aline .976277E-02 -.312409E-01
+aline .976277E-02 -.195255E-01
+aline .010739 -.156204E-01
+aline .117153E-01 -.126916E-01
+aline .136679E-01 -.878649E-02
+aline .146442E-01 -.781022E-02
+aline .156204E-01 -.585766E-02
+aline .224544E-01 .976277E-03
+aline .322171E-01 .585766E-02
+aline .331934E-01 .683394E-02
+bezier .205414E-01 .222225E-01 .216688E-01 .461191E-01 .329494E-01 .619936E-01
+bezier .110147E-01 .851387E-01 .101097E-01 .125662 .331934E-01 .148394
+bezier .518701E-01 .163869 .766186E-01 .16351 .995803E-01 .163038
+closepath
+! end of curve
+
+! start of curve
+amove .790785E-01 .137655
+aline .741971E-01 .136679
+aline .712682E-01 .135703
+bezier .559081E-01 .12516 .609514E-01 .103648 .615055E-01 .878649E-01
+aline .624817E-01 .868887E-01
+bezier .673352E-01 .694618E-01 .901699E-01 .696638E-01 .103485 .761496E-01
+aline .10739 .800547E-01
+aline .109343 .839598E-01
+aline .110319 .868887E-01
+aline .111296 .878649E-01
+bezier .11185 .103649 .116893 .12516 .101533 .135703
+aline .098604 .136679
+aline .937226E-01 .137655
+aline .927463E-01 .138631
+aline .800547E-01 .138631
+closepath
+! end of curve
+
+! start of curve
+amove .566241E-01 -.781022E-02
+bezier .438782E-01 -.983382E-02 .042039 -.272561E-01 .488139E-01 -.361223E-01
+aline .536952E-01 -.410036E-01
+bezier .759168E-01 -.524795E-01 .102488 -.515283E-01 .12594 -.468613E-01
+bezier .14036 -.453797E-01 .15664 -.290292E-01 .145465 -.156204E-01
+bezier .137326 -.86864E-02 .126477 -.875051E-02 .117153 -.683394E-02
+aline .576004E-01 -.683394E-02
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="h" !-------------- Beginning of new char.
+dfont wid=.561114 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .595529E-01 .242117
+aline .615055E-01 .24114
+aline .063458 .240164
+aline .663868E-01 .237235
+aline .683394E-01 .23333
+aline .683394E-01 .129845
+aline .693157E-01 .128869
+bezier .080594 .154189 .111167 .168331 .137655 .162062
+bezier .158663 .163268 .175209 .14341 .17573 .123987
+aline .17573 .781022E-02
+aline .173777 .390511E-02
+aline .170849 .976277E-03
+aline .166943 -.976277E-03
+aline .137655 -.976277E-03
+aline .13375 .976277E-03
+aline .130821 .390511E-02
+aline .128869 .781022E-02
+aline .128869 .121058
+aline .127892 .122035
+bezier .127782 .137655 .10921 .141765 .976277E-01 .136679
+bezier .081519 .132252 .728512E-01 .116455 .693157E-01 .101533
+aline .693157E-01 .781022E-02
+aline .673631E-01 .390511E-02
+aline .644343E-01 .976277E-03
+aline .605292E-01 -.976277E-03
+aline .322171E-01 -.976277E-03
+aline .292883E-01 0
+aline .273358E-01 .976277E-03
+aline .244069E-01 .390511E-02
+aline .234307E-01 .585766E-02
+aline .224544E-01 .878649E-02
+aline .224544E-01 .232354
+aline .234307E-01 .235283
+aline .244069E-01 .237235
+aline .273358E-01 .240164
+aline .292883E-01 .24114
+aline .322171E-01 .242117
+aline .595529E-01 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="i" !-------------- Beginning of new char.
+dfont wid=.255557 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .615055E-01 .243093
+aline .063458 .242117
+aline .654106E-01 .24114
+aline .683394E-01 .238212
+aline .070292 .234307
+aline .070292 .204042
+aline .683394E-01 .200137
+aline .654106E-01 .197208
+aline .615055E-01 .195255
+aline .028312 .195255
+aline .244069E-01 .197208
+aline .214781E-01 .200137
+aline .195255E-01 .204042
+aline .195255E-01 .23333
+aline .205018E-01 .236259
+aline .214781E-01 .238212
+aline .244069E-01 .24114
+aline .263595E-01 .242117
+aline .292883E-01 .243093
+closepath
+! end of curve
+
+! start of curve
+amove .595529E-01 .159133
+aline .615055E-01 .158157
+aline .063458 .157181
+aline .663868E-01 .154252
+aline .683394E-01 .150347
+aline .683394E-01 .781022E-02
+aline .663868E-01 .390511E-02
+aline .063458 .976277E-03
+aline .595529E-01 -.976277E-03
+aline .322171E-01 -.976277E-03
+aline .292883E-01 0
+aline .273358E-01 .976277E-03
+aline .244069E-01 .390511E-02
+aline .234307E-01 .585766E-02
+aline .224544E-01 .878649E-02
+aline .224544E-01 .14937
+aline .234307E-01 .152299
+aline .244069E-01 .154252
+aline .273358E-01 .157181
+aline .292883E-01 .158157
+aline .322171E-01 .159133
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="j" !-------------- Beginning of new char.
+dfont wid=.286113 hei=.694445 dep=.194445 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .070292 .243093
+aline .722445E-01 .242117
+aline .741971E-01 .24114
+aline .771259E-01 .238212
+aline .790785E-01 .234307
+aline .790785E-01 .204042
+aline .771259E-01 .200137
+aline .741971E-01 .197208
+aline .070292 .195255
+aline .370985E-01 .195255
+aline .331934E-01 .197208
+aline .302646E-01 .200137
+aline .028312 .204042
+aline .028312 .234307
+aline .302646E-01 .238212
+aline .331934E-01 .24114
+aline .035146 .242117
+aline .370985E-01 .243093
+closepath
+! end of curve
+
+! start of curve
+amove .070292 .159133
+aline .722445E-01 .158157
+aline .741971E-01 .157181
+aline .771259E-01 .154252
+aline .790785E-01 .150347
+aline .790785E-01 -.234307E-01
+bezier .782746E-01 -.450623E-01 .642313E-01 -.685073E-01 .410036E-01 -.722445E-01
+bezier .190062E-01 -.752822E-01 -.401723E-02 -.718935E-01 -.234307E-01 -.605292E-01
+aline -.244069E-01 -.585766E-01
+aline -.244069E-01 -.556478E-01
+aline -.214781E-01 -.439325E-01
+aline -.205018E-01 -.410036E-01
+aline -.195255E-01 -.390511E-01
+aline -.017573 -.370985E-01
+aline -.146442E-01 -.370985E-01
+bezier -.104538E-02 -.044346 .189203E-01 -.495648E-01 .302646E-01 -.361223E-01
+aline .312409E-01 -.331934E-01
+aline .322171E-01 -.292883E-01
+aline .331934E-01 -.028312
+aline .331934E-01 .150347
+aline .035146 .154252
+aline .380748E-01 .157181
+aline .400274E-01 .158157
+aline .419799E-01 .159133
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="k" !-------------- Beginning of new char.
+dfont wid=.530559 hei=.694445 dep=0 italic=0
+dfont fby="a" kadd=-.0305557
+dfont fby="c" kadd=-.0305557
+dfont fby="e" kadd=-.0305557
+dfont fby="o" kadd=-.0305557
+set path ! start of curve
+newpath
+! start of curve
+amove .566241E-01 .242117
+aline .585766E-01 .24114
+aline .605292E-01 .240164
+aline .063458 .237235
+aline .654106E-01 .23333
+aline .654106E-01 .105438
+aline .663868E-01 .104462
+bezier .853144E-01 .122413 .103956 .140761 .123987 .157181
+aline .129845 .159133
+aline .164991 .159133
+aline .166943 .158157
+aline .168896 .156204
+aline .169872 .153276
+aline .169872 .151323
+aline .168896 .148394
+bezier .149503 .130355 .129457 .11247 .110563 .942107E-01
+bezier .131043 .650744E-01 .153972 .377044E-01 .174754 .878649E-02
+aline .174754 .390511E-02
+aline .173777 .195255E-02
+aline .171825 0
+aline .169872 -.976277E-03
+aline .138631 -.976277E-03
+bezier .126027 .398085E-02 .121531 .184416E-01 .112272 .273358E-01
+bezier .102334 .407558E-01 .922593E-01 .546169E-01 .815191E-01 .671191E-01
+aline .800547E-01 .663868E-01
+aline .751733E-01 .615055E-01
+aline .732208E-01 .605292E-01
+aline .644343E-01 .517427E-01
+aline .644343E-01 .781022E-02
+aline .624817E-01 .390511E-02
+aline .595529E-01 .976277E-03
+aline .556478E-01 -.976277E-03
+aline .035146 -.976277E-03
+aline .322171E-01 0
+aline .302646E-01 .976277E-03
+aline .273358E-01 .390511E-02
+aline .263595E-01 .585766E-02
+aline .253832E-01 .878649E-02
+aline .253832E-01 .232354
+aline .263595E-01 .235283
+aline .273358E-01 .237235
+aline .302646E-01 .240164
+aline .322171E-01 .24114
+aline .035146 .242117
+aline .566241E-01 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="l" !-------------- Beginning of new char.
+dfont wid=.255557 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .595529E-01 .242117
+aline .615055E-01 .24114
+aline .063458 .240164
+aline .663868E-01 .237235
+aline .683394E-01 .23333
+aline .683394E-01 .781022E-02
+aline .663868E-01 .390511E-02
+aline .063458 .976277E-03
+aline .595529E-01 -.976277E-03
+aline .322171E-01 -.976277E-03
+aline .292883E-01 0
+aline .273358E-01 .976277E-03
+aline .244069E-01 .390511E-02
+aline .234307E-01 .585766E-02
+aline .224544E-01 .878649E-02
+aline .224544E-01 .232354
+aline .234307E-01 .235283
+aline .244069E-01 .237235
+aline .273358E-01 .240164
+aline .292883E-01 .24114
+aline .322171E-01 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="m" !-------------- Beginning of new char.
+dfont wid=.866672 hei=.458333 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .136679 .163038
+bezier .154829 .162351 .17363 .149432 .17573 .129845
+aline .176706 .128869
+bezier .18543 .14667 .202757 .159813 .222591 .163038
+bezier .241993 .16358 .265471 .163932 .277263 .145465
+aline .281168 .137655
+aline .282144 .134726
+aline .28312 .129845
+aline .28312 .124963
+aline .284097 .123987
+aline .284097 .781022E-02
+aline .282144 .390511E-02
+aline .279215 .976277E-03
+aline .27531 -.976277E-03
+aline .246998 -.976277E-03
+aline .244069 0
+aline .242117 .976277E-03
+aline .239188 .390511E-02
+aline .238212 .585766E-02
+aline .237235 .878649E-02
+aline .237235 .121058
+aline .236259 .122035
+bezier .236082 .138111 .216811 .141709 .205018 .136679
+bezier .188909 .132252 .180243 .116455 .176706 .101533
+aline .176706 .781022E-02
+aline .174754 .390511E-02
+aline .171825 .976277E-03
+aline .16792 -.976277E-03
+aline .139608 -.976277E-03
+aline .136679 0
+aline .134726 .976277E-03
+aline .131797 .390511E-02
+aline .130821 .585766E-02
+aline .129845 .878649E-02
+aline .129845 .121058
+aline .128869 .122035
+bezier .128691 .138111 .109421 .141709 .976277E-01 .136679
+bezier .081519 .132252 .728512E-01 .116455 .693157E-01 .101533
+aline .693157E-01 .781022E-02
+aline .673631E-01 .390511E-02
+aline .644343E-01 .976277E-03
+aline .605292E-01 -.976277E-03
+aline .322171E-01 -.976277E-03
+aline .292883E-01 0
+aline .273358E-01 .976277E-03
+aline .244069E-01 .390511E-02
+aline .234307E-01 .585766E-02
+aline .224544E-01 .878649E-02
+aline .224544E-01 .151323
+aline .234307E-01 .154252
+aline .244069E-01 .156204
+aline .273358E-01 .159133
+aline .292883E-01 .160109
+aline .322171E-01 .161086
+aline .585766E-01 .161086
+aline .624817E-01 .159133
+aline .654106E-01 .156204
+aline .673631E-01 .152299
+aline .673631E-01 .127892
+aline .683394E-01 .126916
+bezier .768608E-01 .145672 .945983E-01 .159709 .115201 .163038
+aline .136679 .163038
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="n" !-------------- Beginning of new char.
+dfont wid=.561114 hei=.458333 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .136679 .163038
+bezier .156037 .162382 .176103 .146025 .174754 .124963
+aline .17573 .123987
+aline .17573 .781022E-02
+aline .173777 .390511E-02
+aline .170849 .976277E-03
+aline .166943 -.976277E-03
+aline .137655 -.976277E-03
+aline .13375 .976277E-03
+aline .130821 .390511E-02
+aline .128869 .781022E-02
+aline .128869 .121058
+aline .127892 .122035
+bezier .127782 .137655 .10921 .141765 .976277E-01 .136679
+bezier .081519 .132252 .728512E-01 .116455 .693157E-01 .101533
+aline .693157E-01 .781022E-02
+aline .673631E-01 .390511E-02
+aline .644343E-01 .976277E-03
+aline .605292E-01 -.976277E-03
+aline .322171E-01 -.976277E-03
+aline .292883E-01 0
+aline .273358E-01 .976277E-03
+aline .244069E-01 .390511E-02
+aline .234307E-01 .585766E-02
+aline .224544E-01 .878649E-02
+aline .224544E-01 .151323
+aline .234307E-01 .154252
+aline .244069E-01 .156204
+aline .273358E-01 .159133
+aline .292883E-01 .160109
+aline .322171E-01 .161086
+aline .585766E-01 .161086
+aline .624817E-01 .159133
+aline .654106E-01 .156204
+aline .673631E-01 .152299
+aline .673631E-01 .127892
+aline .683394E-01 .126916
+bezier .765615E-01 .14586 .947138E-01 .159716 .115201 .163038
+aline .136679 .163038
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="o" !-------------- Beginning of new char.
+dfont wid=.550003 hei=.458333 dep=0 italic=0
+dfont fby="c" kadd=.0305557
+dfont fby="d" kadd=.0305557
+dfont fby="e" kadd=.0305557
+dfont fby="o" kadd=.0305557
+dfont fby="q" kadd=.0305557
+dfont fby="r" kadd=-.0305557
+dfont fby="w" kadd=-.0305557
+dfont fby="x" kadd=-.0305557
+dfont fby="y" kadd=-.0305557
+set path ! start of curve
+newpath
+! start of curve
+amove .109343 .164991
+bezier .131843 .163209 .157224 .153605 .169872 .132774
+bezier .185871 .102979 .18634 .677742E-01 .17573 .361223E-01
+bezier .165043 .106811E-01 .136899 -.441705E-02 .110319 -.390511E-02
+bezier .801876E-01 -.765522E-02 .434427E-01 -.223237E-02 .244069E-01 .253832E-01
+bezier .824984E-02 .516046E-01 .972858E-02 .839289E-01 .156204E-01 .112272
+bezier .228256E-01 .143173 .532217E-01 .164595 .839598E-01 .164015
+aline .849361E-01 .164991
+aline .109343 .164991
+closepath
+! end of curve
+
+! start of curve
+amove .888412E-01 .139608
+bezier .732049E-01 .138545 .619907E-01 .125473 .605292E-01 .110319
+aline .595529E-01 .109343
+aline .595529E-01 .101533
+aline .585766E-01 .100557
+aline .585766E-01 .624817E-01
+bezier .601531E-01 .475166E-01 .656736E-01 .272221E-01 .839598E-01 .234307E-01
+bezier .102371 .169159E-01 .129077 .252299E-01 .132774 .478376E-01
+aline .13375 .488139E-01
+aline .13375 .536952E-01
+aline .134726 .546715E-01
+aline .134726 .615055E-01
+aline .135703 .624817E-01
+aline .135703 .100557
+bezier .134019 .115387 .128531 .135632 .110319 .138631
+aline .105438 .139608
+aline .104462 .140584
+aline .898175E-01 .140584
+aline .888412E-01 .139608
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="p" !-------------- Beginning of new char.
+dfont wid=.561114 hei=.458333 dep=.194445 italic=0
+dfont fby="c" kadd=.0305557
+dfont fby="d" kadd=.0305557
+dfont fby="e" kadd=.0305557
+dfont fby="o" kadd=.0305557
+dfont fby="q" kadd=.0305557
+dfont fby="r" kadd=-.0305557
+dfont fby="w" kadd=-.0305557
+dfont fby="x" kadd=-.0305557
+dfont fby="y" kadd=-.0305557
+set path ! start of curve
+newpath
+! start of curve
+amove .129845 .163038
+bezier .153945 .160795 .175068 .142134 .180611 .11813
+bezier .186314 .869684E-01 .188916 .510855E-01 .170849 .224544E-01
+bezier .153247 -.219521E-02 .11884 -.102144E-01 .907938E-01 -.195255E-02
+aline .081031 .292883E-02
+aline .800547E-01 .390511E-02
+aline .781022E-01 .488139E-02
+aline .070292 .126916E-01
+aline .693157E-01 .117153E-01
+aline .693157E-01 -.605292E-01
+aline .673631E-01 -.644343E-01
+aline .644343E-01 -.673631E-01
+aline .605292E-01 -.693157E-01
+aline .322171E-01 -.693157E-01
+aline .292883E-01 -.683394E-01
+aline .273358E-01 -.673631E-01
+aline .244069E-01 -.644343E-01
+aline .234307E-01 -.624817E-01
+aline .224544E-01 -.595529E-01
+aline .224544E-01 .14937
+aline .234307E-01 .152299
+aline .244069E-01 .154252
+aline .273358E-01 .157181
+aline .292883E-01 .158157
+aline .322171E-01 .159133
+aline .595529E-01 .159133
+aline .063458 .157181
+aline .663868E-01 .154252
+aline .683394E-01 .150347
+aline .683394E-01 .144489
+aline .693157E-01 .143513
+bezier .856804E-01 .15842 .108028 .165024 .129845 .163038
+closepath
+! end of curve
+
+! start of curve
+amove .946989E-01 .135703
+bezier .855326E-01 .135073 .760547E-01 .130545 .693157E-01 .123987
+aline .693157E-01 .341697E-01
+bezier .845575E-01 .114304E-01 .123217 .167299E-01 .131797 .429562E-01
+bezier .140165 .680146E-01 .140598 .959459E-01 .129845 .120082
+bezier .1234 .132191 .107405 .139048 .946989E-01 .135703
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="q" !-------------- Beginning of new char.
+dfont wid=.561114 hei=.458333 dep=.194445 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .956752E-01 .163038
+aline .995803E-01 .162062
+aline .103485 .161086
+aline .113248 .156204
+aline .114224 .155228
+aline .116177 .154252
+aline .12594 .144489
+aline .126916 .142536
+aline .128869 .140584
+aline .129845 .14156
+aline .129845 .154252
+aline .131797 .158157
+aline .134726 .161086
+aline .138631 .163038
+aline .166943 .163038
+aline .170849 .161086
+aline .173777 .158157
+aline .17573 .154252
+aline .17573 -.605292E-01
+aline .173777 -.644343E-01
+aline .170849 -.673631E-01
+aline .166943 -.693157E-01
+aline .137655 -.693157E-01
+aline .13375 -.673631E-01
+aline .130821 -.644343E-01
+aline .128869 -.605292E-01
+aline .128869 .146442E-01
+aline .127892 .156204E-01
+bezier .107343 -.120013E-01 .648975E-01 -.997758E-02 .390511E-01 .878649E-02
+bezier .102231E-01 .032879 .011684 .745653E-01 .156204E-01 .10739
+bezier .203483E-01 .137998 .477844E-01 .16207 .781022E-01 .163038
+closepath
+! end of curve
+
+! start of curve
+amove .946989E-01 .135703
+bezier .760233E-01 .134313 .642209E-01 .117026 .624817E-01 .995803E-01
+bezier .058783 .784651E-01 .590499E-01 .549777E-01 .693157E-01 .035146
+bezier .796896E-01 .179081E-01 .104068 .149427E-01 .119106 .273358E-01
+aline .126916 .035146
+aline .127892 .370985E-01
+aline .129845 .390511E-01
+aline .129845 .115201
+bezier .124012 .128436 .109264 .140372 .946989E-01 .135703
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="r" !-------------- Beginning of new char.
+dfont wid=.372225 hei=.458333 dep=0 italic=.0152788
+set path ! start of curve
+newpath
+! start of curve
+amove .123011 .163038
+aline .124963 .161086
+aline .124963 .129845
+aline .123011 .127892
+bezier .994875E-01 .128344 .724006E-01 .113497 .693157E-01 .878649E-01
+aline .683394E-01 .868887E-01
+aline .683394E-01 .781022E-02
+aline .663868E-01 .390511E-02
+aline .063458 .976277E-03
+aline .595529E-01 -.976277E-03
+aline .322171E-01 -.976277E-03
+aline .292883E-01 0
+aline .273358E-01 .976277E-03
+aline .244069E-01 .390511E-02
+aline .234307E-01 .585766E-02
+aline .224544E-01 .878649E-02
+aline .224544E-01 .151323
+aline .234307E-01 .154252
+aline .244069E-01 .156204
+aline .273358E-01 .159133
+aline .292883E-01 .160109
+aline .322171E-01 .161086
+aline .576004E-01 .161086
+aline .615055E-01 .159133
+aline .644343E-01 .156204
+aline .663868E-01 .152299
+aline .663868E-01 .122035
+aline .673631E-01 .121058
+bezier .755477E-01 .144025 .968589E-01 .16545 .123011 .163038
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="s" !-------------- Beginning of new char.
+dfont wid=.421669 hei=.458333 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .898175E-01 .164991
+bezier .103765 .162892 .120318 .160077 .132774 .151323
+aline .132774 .146442
+aline .131797 .145465
+aline .131797 .140584
+aline .130821 .139608
+aline .130821 .134726
+aline .129845 .129845
+aline .128869 .128869
+aline .128869 .123987
+aline .127892 .122035
+aline .126916 .121058
+aline .122035 .121058
+bezier .103993 .139298 .737188E-01 .147611 .507664E-01 .134726
+aline .488139E-01 .130821
+aline .478376E-01 .127892
+aline .468613E-01 .126916
+aline .468613E-01 .120082
+bezier .546001E-01 .103475 .757136E-01 .105457 .907938E-01 .101533
+bezier .113977 .967984E-01 .135866 .800443E-01 .139608 .556478E-01
+bezier .142049 .336707E-01 .134058 .826127E-02 .111296 0
+bezier .782805E-01 -.993588E-02 .410562E-01 -.560012E-02 .117153E-01 .136679E-01
+bezier .129274E-01 .025069 .144458E-01 .363992E-01 .017573 .478376E-01
+aline .185493E-01 .488139E-01
+aline .205018E-01 .497901E-01
+bezier .286081E-01 .452851E-01 .033692 .350778E-01 .429562E-01 .312409E-01
+bezier .601102E-01 .212866E-01 .812212E-01 .174455E-01 .995803E-01 .263595E-01
+aline .103485 .302646E-01
+aline .105438 .361223E-01
+aline .106414 .370985E-01
+bezier .108714 .535708E-01 .892531E-01 .608896E-01 .761496E-01 .615055E-01
+bezier .491722E-01 .643245E-01 .190254E-01 .781573E-01 .136679E-01 .10739
+bezier .011257 .128331 .194001E-01 .152348 .410036E-01 .160109
+aline .497901E-01 .163038
+aline .546715E-01 .164015
+aline .615055E-01 .164015
+aline .624817E-01 .164991
+aline .898175E-01 .164991
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="t" !-------------- Beginning of new char.
+dfont wid=.404169 hei=.589289 dep=0 italic=0
+dfont fby="w" kadd=-.0305557
+dfont fby="y" kadd=-.0305557
+set path ! start of curve
+newpath
+! start of curve
+amove .683394E-01 .205018
+aline .070292 .204042
+aline .722445E-01 .203066
+aline .751733E-01 .200137
+aline .771259E-01 .196232
+aline .771259E-01 .160109
+aline .781022E-01 .159133
+aline .116177 .159133
+aline .120082 .157181
+aline .123011 .154252
+aline .124963 .150347
+aline .124963 .143513
+aline .123011 .139608
+aline .120082 .136679
+aline .116177 .134726
+aline .781022E-01 .134726
+aline .771259E-01 .13375
+aline .771259E-01 .419799E-01
+aline .781022E-01 .410036E-01
+aline .781022E-01 .361223E-01
+aline .790785E-01 .035146
+aline .800547E-01 .312409E-01
+aline .081031 .028312
+bezier .877189E-01 .156879E-01 .103146 .235705E-01 .113248 .273358E-01
+aline .114224 .028312
+aline .116177 .292883E-01
+aline .11813 .312409E-01
+aline .120082 .322171E-01
+aline .121058 .331934E-01
+aline .123011 .341697E-01
+aline .12594 .341697E-01
+aline .127892 .322171E-01
+aline .131797 .165967E-01
+aline .131797 .126916E-01
+bezier .109717 -.242377E-02 .824412E-01 -.691099E-02 .566241E-01 -.390511E-02
+bezier .040066 .572389E-03 .033559 .193325E-01 .322171E-01 .341697E-01
+aline .322171E-01 .13375
+aline .312409E-01 .134726
+aline .165967E-01 .134726
+aline .126916E-01 .136679
+aline .976277E-02 .139608
+aline .781022E-02 .143513
+aline .781022E-02 .14937
+aline .878649E-02 .152299
+aline .976277E-02 .154252
+aline .126916E-01 .157181
+aline .146442E-01 .158157
+aline .017573 .159133
+aline .322171E-01 .159133
+aline .331934E-01 .160109
+aline .331934E-01 .195255
+aline .341697E-01 .198184
+aline .035146 .200137
+aline .380748E-01 .203066
+aline .400274E-01 .204042
+aline .429562E-01 .205018
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="u" !-------------- Beginning of new char.
+dfont wid=.561114 hei=.458333 dep=0 italic=0
+dfont fby="w" kadd=-.0305557
+set path ! start of curve
+newpath
+! start of curve
+amove .605292E-01 .159133
+aline .624817E-01 .158157
+aline .644343E-01 .157181
+aline .673631E-01 .154252
+aline .693157E-01 .150347
+aline .693157E-01 .302646E-01
+aline .070292 .292883E-01
+aline .712682E-01 .244069E-01
+aline .722445E-01 .214781E-01
+bezier .916975E-01 .633985E-02 .122998 .206752E-01 .126916 .449088E-01
+aline .127892 .045885
+aline .127892 .507664E-01
+aline .128869 .517427E-01
+aline .128869 .150347
+aline .130821 .154252
+aline .13375 .157181
+aline .137655 .159133
+aline .166943 .159133
+aline .170849 .157181
+aline .173777 .154252
+aline .17573 .150347
+aline .17573 .781022E-02
+aline .173777 .390511E-02
+aline .170849 .976277E-03
+aline .166943 -.976277E-03
+aline .138631 -.976277E-03
+aline .134726 .976277E-03
+aline .131797 .390511E-02
+aline .129845 .781022E-02
+aline .129845 .234307E-01
+aline .128869 .244069E-01
+bezier .12138 .932777E-02 .106693 -.212124E-02 .898175E-01 -.488139E-02
+bezier .687092E-01 -.496361E-02 .428859E-01 -.686195E-02 .292883E-01 .126916E-01
+aline .253832E-01 .205018E-01
+aline .234307E-01 .263595E-01
+aline .234307E-01 .312409E-01
+aline .224544E-01 .322171E-01
+aline .224544E-01 .14937
+aline .234307E-01 .152299
+aline .244069E-01 .154252
+aline .273358E-01 .157181
+aline .292883E-01 .158157
+aline .322171E-01 .159133
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="v" !-------------- Beginning of new char.
+dfont wid=.500003 hei=.458333 dep=0 italic=.0152788
+set path ! start of curve
+newpath
+! start of curve
+amove .390511E-01 .159133
+aline .419799E-01 .158157
+aline .045885 .156204
+aline .507664E-01 .151323
+aline .052719 .147418
+aline .663868E-01 .106414
+aline .673631E-01 .102509
+aline .820073E-01 .585766E-01
+aline .829836E-01 .546715E-01
+aline .888412E-01 .370985E-01
+aline .966514E-01 .605292E-01
+aline .976277E-01 .644343E-01
+aline .113248 .111296
+aline .114224 .115201
+aline .124963 .147418
+aline .126916 .151323
+aline .131797 .156204
+aline .135703 .158157
+aline .138631 .159133
+aline .160109 .159133
+aline .162062 .158157
+aline .165967 .154252
+aline .166943 .151323
+aline .166943 .148394
+aline .163038 .136679
+aline .162062 .132774
+aline .146442 .859124E-01
+aline .145465 .820073E-01
+aline .129845 .035146
+aline .128869 .312409E-01
+aline .122035 .010739
+aline .120082 .683394E-02
+aline .115201 .195255E-02
+aline .111296 0
+aline .108367 -.976277E-03
+aline .683394E-01 -.976277E-03
+aline .654106E-01 0
+aline .615055E-01 .195255E-02
+aline .566241E-01 .683394E-02
+aline .546715E-01 .010739
+aline .478376E-01 .312409E-01
+aline .468613E-01 .035146
+aline .312409E-01 .820073E-01
+aline .302646E-01 .859124E-01
+aline .146442E-01 .132774
+aline .136679E-01 .136679
+aline .976277E-02 .148394
+aline .976277E-02 .151323
+aline .010739 .154252
+aline .146442E-01 .158157
+aline .165967E-01 .159133
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="w" !-------------- Beginning of new char.
+dfont wid=.744449 hei=.458333 dep=0 italic=.0152788
+dfont fby="a" kadd=-.0305557
+dfont fby="c" kadd=-.0305557
+dfont fby="e" kadd=-.0305557
+dfont fby="o" kadd=-.0305557
+set path ! start of curve
+newpath
+! start of curve
+amove .390511E-01 .159133
+bezier .564809E-01 .152871 .541848E-01 .130608 .605292E-01 .116177
+bezier .672507E-01 .920743E-01 .734115E-01 .677151E-01 .081031 .439325E-01
+bezier .919222E-01 .079893 .100156 .116812 .112272 .152299
+aline .116177 .156204
+bezier .128058 .162485 .149085 .16078 .151323 .144489
+bezier .161844 .109527 .170131 .734457E-01 .181588 .390511E-01
+bezier .192805 .763133E-01 .201589 .114469 .213805 .151323
+aline .219662 .157181
+aline .221615 .158157
+aline .224544 .159133
+aline .246022 .159133
+aline .249927 .157181
+bezier .257546 .146823 .247801 .133362 .246022 .122035
+bezier .234954 .833329E-01 .225504 .439745E-01 .212828 .585766E-02
+aline .208923 .195255E-02
+aline .205018 0
+aline .202089 -.976277E-03
+aline .162062 -.976277E-03
+bezier .14542 .459296E-02 .147205 .253973E-01 .14156 .390511E-01
+bezier .135894 .626347E-01 .12725 .865187E-01 .12594 .110319
+aline .123987 .112272
+bezier .118849 .776714E-01 .108498 .410843E-01 .976277E-01 .683394E-02
+aline .917701E-01 .976277E-03
+aline .898175E-01 0
+aline .868887E-01 -.976277E-03
+aline .605292E-01 -.976277E-03
+bezier .043618 .330984E-02 .458139E-01 .241192E-01 .400274E-01 .370985E-01
+bezier .302348E-01 .736324E-01 .196234E-01 .109928 .976277E-02 .146442
+aline .976277E-02 .153276
+aline .010739 .154252
+aline .117153E-01 .156204
+aline .126916E-01 .157181
+aline .146442E-01 .158157
+aline .165967E-01 .159133
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="x" !-------------- Beginning of new char.
+dfont wid=.500003 hei=.458333 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .045885 .159133
+bezier .583209E-01 .155558 .06232 .14174 .712682E-01 .13375
+bezier .759053E-01 .126506 .820188E-01 .120325 .868887E-01 .113248
+bezier .994622E-01 .127198 .108772 .144176 .122035 .157181
+aline .123987 .158157
+aline .126916 .159133
+aline .155228 .159133
+aline .157181 .158157
+bezier .167308 .150198 .153008 .141887 .14937 .134726
+bezier .134995 .117299 .119959 .10013 .10674 .820073E-01
+bezier .125525 .568425E-01 .147385 .335334E-01 .166943 .878649E-02
+aline .166943 .390511E-02
+aline .165967 .195255E-02
+aline .164015 0
+aline .162062 -.976277E-03
+aline .132774 -.976277E-03
+bezier .119681 .426821E-02 .115765 .198167E-01 .106414 .292883E-01
+bezier .100443 .385534E-01 .939875E-01 .477644E-01 .873768E-01 .05638
+bezier .727038E-01 .387354E-01 .628861E-01 .164086E-01 .468613E-01 0
+aline .439325E-01 -.976277E-03
+aline .146442E-01 -.976277E-03
+aline .126916E-01 0
+bezier .366019E-02 .920432E-02 .183409E-01 .176554E-01 .224544E-01 .253832E-01
+bezier .379743E-01 .438744E-01 .530227E-01 .627055E-01 .680953E-01 .815191E-01
+bezier .504795E-01 .105311 .292542E-01 .1265 .117153E-01 .150347
+aline .117153E-01 .153276
+aline .136679E-01 .157181
+aline .156204E-01 .158157
+aline .165967E-01 .159133
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="y" !-------------- Beginning of new char.
+dfont wid=.500003 hei=.458333 dep=.194445 italic=.0152788
+dfont fby="," kadd=-.0916672
+dfont fby="." kadd=-.0916672
+dfont fby="a" kadd=-.0305557
+dfont fby="e" kadd=-.0305557
+dfont fby="o" kadd=-.0305557
+set path ! start of curve
+newpath
+! start of curve
+amove .410036E-01 .159133
+bezier .586365E-01 .154862 .608121E-01 .133804 .683394E-01 .120082
+bezier .787568E-01 .961514E-01 .908381E-01 .714316E-01 .946989E-01 .045885
+aline .956752E-01 .488139E-01
+aline .966514E-01 .497901E-01
+aline .966514E-01 .556478E-01
+aline .976277E-01 .605292E-01
+aline .995803E-01 .683394E-01
+aline .100557 .712682E-01
+aline .102509 .790785E-01
+aline .104462 .849361E-01
+aline .105438 .888412E-01
+aline .124963 .147418
+aline .126916 .151323
+aline .132774 .157181
+aline .134726 .158157
+aline .137655 .159133
+aline .160109 .159133
+aline .162062 .158157
+aline .165967 .154252
+aline .166943 .150347
+aline .166943 .14937
+aline .157181 .120082
+bezier .137938 .683379E-01 .122736 .146269E-01 .101533 -.361223E-01
+bezier .895153E-01 -.608299E-01 .607762E-01 -.789611E-01 .331934E-01 -.722445E-01
+aline .273358E-01 -.722445E-01
+aline .263595E-01 -.712682E-01
+aline .214781E-01 -.712682E-01
+aline .185493E-01 -.070292
+aline .165967E-01 -.693157E-01
+aline .156204E-01 -.673631E-01
+aline .156204E-01 -.576004E-01
+aline .146442E-01 -.566241E-01
+aline .146442E-01 -.045885
+aline .136679E-01 -.449088E-01
+aline .136679E-01 -.380748E-01
+aline .146442E-01 -.361223E-01
+aline .165967E-01 -.035146
+aline .195255E-01 -.035146
+bezier .336538E-01 -.045785 .558643E-01 -.482682E-01 .673631E-01 -.322171E-01
+aline .712682E-01 -.244069E-01
+aline .741971E-01 -.156204E-01
+aline .751733E-01 -.136679E-01
+aline .781022E-01 -.488139E-02
+aline .786879E-01 -.195255E-02
+bezier .578223E-01 .483354E-01 .336672E-01 .974912E-01 .117153E-01 .147418
+aline .117153E-01 .154252
+aline .126916E-01 .155228
+aline .136679E-01 .157181
+aline .156204E-01 .158157
+aline .017573 .159133
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="z" !-------------- Beginning of new char.
+dfont wid=.476392 hei=.458333 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .145465 .159133
+aline .147418 .158157
+aline .14937 .157181
+aline .152299 .154252
+bezier .159772 .141003 .147792 .129284 .139608 .120082
+bezier .115142 .087984 .892638E-01 .569065E-01 .646784E-01 .248951E-01
+aline .654106E-01 .234307E-01
+aline .859124E-01 .234307E-01
+aline .868887E-01 .244069E-01
+aline .146442 .244069E-01
+aline .150347 .224544E-01
+aline .153276 .195255E-01
+aline .155228 .156204E-01
+aline .155228 .781022E-02
+aline .153276 .390511E-02
+aline .150347 .976277E-03
+aline .146442 -.976277E-03
+aline .205018E-01 -.976277E-03
+aline .165967E-01 .976277E-03
+aline .136679E-01 .390511E-02
+bezier .61958E-02 .171543E-01 .181757E-01 .288729E-01 .263595E-01 .380748E-01
+bezier .050824 .701729E-01 .076704 .101251 .101289 .133262
+aline .100557 .134726
+aline .839598E-01 .134726
+aline .829836E-01 .13375
+aline .263595E-01 .13375
+aline .224544E-01 .135703
+aline .195255E-01 .138631
+aline .017573 .142536
+aline .017573 .14937
+aline .185493E-01 .152299
+aline .195255E-01 .154252
+aline .224544E-01 .157181
+aline .244069E-01 .158157
+aline .273358E-01 .159133
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="{" !-------------- Beginning of new char.
+dfont wid=.550003 hei=.458333 dep=0 italic=.0305557
+set path ! start of curve
+newpath
+! start of curve
+amove .184516 .110319
+aline .186469 .109343
+aline .188421 .108367
+aline .19135 .105438
+aline .193303 .101533
+aline .193303 .946989E-01
+aline .19135 .907938E-01
+aline .188421 .878649E-01
+aline .184516 .859124E-01
+aline .976277E-02 .859124E-01
+aline .585766E-02 .878649E-01
+aline .292883E-02 .907938E-01
+aline .976277E-03 .946989E-01
+aline .976277E-03 .101533
+aline .292883E-02 .105438
+aline .585766E-02 .108367
+aline .781022E-02 .109343
+aline .976277E-02 .110319
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="|" !-------------- Beginning of new char.
+dfont wid=1.10001 hei=.458333 dep=0 italic=.0305557
+set path ! start of curve
+newpath
+! start of curve
+amove .377819 .110319
+aline .379772 .109343
+aline .381724 .108367
+aline .384653 .105438
+aline .386606 .101533
+aline .386606 .946989E-01
+aline .384653 .907938E-01
+aline .381724 .878649E-01
+aline .377819 .859124E-01
+aline .976277E-02 .859124E-01
+aline .585766E-02 .878649E-01
+aline .292883E-02 .907938E-01
+aline .976277E-03 .946989E-01
+aline .976277E-03 .101533
+aline .292883E-02 .105438
+aline .585766E-02 .108367
+aline .781022E-02 .109343
+aline .976277E-02 .110319
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="}" !-------------- Beginning of new char.
+dfont wid=.550003 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .946989E-01 .242117
+bezier .100628 .235634 .897904E-01 .229076 .878649E-01 .222591
+bezier .079663 .211158 .073027 .198597 .644343E-01 .187445
+aline .449088E-01 .187445
+aline .429562E-01 .188421
+bezier .404174E-01 .198717 .462609E-01 .208233 .045885 .218686
+aline .468613E-01 .219662
+aline .468613E-01 .224544
+aline .478376E-01 .22552
+aline .478376E-01 .230401
+aline .488139E-01 .231378
+aline .488139E-01 .236259
+aline .497901E-01 .240164
+aline .517427E-01 .242117
+aline .946989E-01 .242117
+closepath
+! end of curve
+
+! start of curve
+amove .159133 .242117
+bezier .165063 .235635 .154225 .229076 .152299 .222591
+bezier .144098 .211158 .137461 .198597 .128869 .187445
+aline .109343 .187445
+aline .10739 .188421
+bezier .104852 .198717 .110695 .208233 .110319 .218686
+aline .111296 .219662
+aline .111296 .224544
+aline .112272 .22552
+aline .112272 .230401
+aline .113248 .231378
+aline .113248 .236259
+aline .114224 .240164
+aline .116177 .242117
+aline .159133 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="~" !-------------- Beginning of new char.
+dfont wid=.550003 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .781022E-01 .242117
+bezier .966937E-01 .24098 .108098 .222213 .12594 .221615
+aline .126916 .222591
+aline .130821 .224544
+aline .131797 .22552
+aline .132774 .227473
+aline .13375 .228449
+aline .134726 .230401
+aline .135703 .234307
+aline .136679 .235283
+aline .136679 .240164
+aline .138631 .242117
+aline .159133 .242117
+aline .161086 .240164
+bezier .164271 .213642 .137078 .190297 .111296 .198184
+bezier .950524E-01 .201021 .847369E-01 .217597 .683394E-01 .21771
+aline .673631E-01 .216734
+aline .063458 .214781
+aline .624817E-01 .213805
+aline .615055E-01 .211852
+aline .605292E-01 .210876
+aline .595529E-01 .208923
+aline .585766E-01 .205018
+aline .576004E-01 .204042
+aline .576004E-01 .199161
+aline .556478E-01 .197208
+aline .361223E-01 .197208
+aline .341697E-01 .198184
+bezier .294956E-01 .217911 .458803E-01 .238686 .654106E-01 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=127 !-------------- Beginning of new char.
+dfont wid=.550003 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .751733E-01 .243093
+aline .771259E-01 .242117
+aline .790785E-01 .24114
+aline .820073E-01 .238212
+aline .839598E-01 .234307
+aline .839598E-01 .211852
+aline .820073E-01 .207947
+aline .790785E-01 .205018
+aline .771259E-01 .204042
+aline .741971E-01 .203066
+aline .449088E-01 .203066
+aline .419799E-01 .204042
+aline .400274E-01 .205018
+aline .370985E-01 .207947
+aline .361223E-01 .2099
+aline .035146 .212828
+aline .035146 .23333
+aline .361223E-01 .236259
+aline .370985E-01 .238212
+aline .400274E-01 .24114
+aline .419799E-01 .242117
+aline .449088E-01 .243093
+closepath
+! end of curve
+
+! start of curve
+amove .14937 .243093
+aline .152299 .242117
+aline .154252 .24114
+aline .157181 .238212
+aline .158157 .236259
+aline .159133 .23333
+aline .159133 .212828
+aline .158157 .2099
+aline .157181 .207947
+aline .154252 .205018
+aline .152299 .204042
+aline .14937 .203066
+aline .120082 .203066
+aline .117153 .204042
+aline .115201 .205018
+aline .112272 .207947
+aline .110319 .211852
+aline .110319 .234307
+aline .112272 .238212
+aline .115201 .24114
+aline .117153 .242117
+aline .119106 .243093
+closepath
+! end of curve
+
+fill
+dfont endchar
diff --git a/src/fonts/texcmssi.afm b/src/fonts/texcmssi.afm
new file mode 100644
index 0000000..b27ccca
--- /dev/null
+++ b/src/fonts/texcmssi.afm
@@ -0,0 +1,294 @@
+StartFontMetrics 2.0
+Comment Made from TEX tfm file using TFMTOAFM.bas
+FontName CMSSI10
+EncodingScheme TEXENCODING
+FullName CMSSI10
+FamilyName CMSSI10
+Weight Medium
+ItalicAngle 11.9999
+IsFixedPitch false
+UnderlinePosition -97
+UnderlineThickness 73
+FontBBox 0 -300 1001 1001
+CapHeight 729
+XHeight 156
+Descender -219
+Ascender 729
+StartCharMetrics 127
+C 1 ; WX 833 ; N C1 ; B 0 0 833 694 ;
+C 2 ; WX 777 ; N C2 ; B 0 0 777 694 ;
+C 3 ; WX 611 ; N C3 ; B 0 0 611 694 ;
+C 4 ; WX 666 ; N C4 ; B 0 0 666 694 ;
+C 5 ; WX 708 ; N C5 ; B 0 0 708 694 ;
+C 6 ; WX 722 ; N C6 ; B 0 0 722 694 ;
+C 7 ; WX 777 ; N C7 ; B 0 0 777 694 ;
+C 8 ; WX 722 ; N C8 ; B 0 0 722 694 ;
+C 9 ; WX 777 ; N C9 ; B 0 0 777 694 ;
+C 10 ; WX 722 ; N C10 ; B 0 0 722 694 ;
+C 11 ; WX 583 ; N C11 ; B 0 0 583 694 ; L i C14 L l C15
+C 12 ; WX 536 ; N C12 ; B 0 0 536 694 ;
+C 13 ; WX 536 ; N C13 ; B 0 0 536 694 ;
+C 14 ; WX 813 ; N C14 ; B 0 0 813 694 ;
+C 15 ; WX 813 ; N C15 ; B 0 0 813 694 ;
+C 16 ; WX 238 ; N C16 ; B 0 0 238 444 ;
+C 17 ; WX 266 ; N C17 ; B 0 -194 266 444 ;
+C 18 ; WX 500 ; N C18 ; B 0 0 500 694 ;
+C 19 ; WX 500 ; N C19 ; B 0 0 500 694 ;
+C 20 ; WX 500 ; N C20 ; B 0 0 500 631 ;
+C 21 ; WX 500 ; N C21 ; B 0 0 500 694 ;
+C 22 ; WX 500 ; N C22 ; B 0 0 500 608 ;
+C 23 ; WX 737 ; N C23 ; B 0 0 737 694 ;
+C 24 ; WX 444 ; N C24 ; B 0 -170 444 0 ;
+C 25 ; WX 480 ; N C25 ; B 0 0 480 694 ;
+C 26 ; WX 722 ; N C26 ; B 0 0 722 444 ;
+C 27 ; WX 777 ; N C27 ; B 0 0 777 444 ;
+C 28 ; WX 500 ; N C28 ; B 0 -97 500 541 ;
+C 29 ; WX 861 ; N C29 ; B 0 0 861 694 ;
+C 30 ; WX 972 ; N C30 ; B 0 0 972 694 ;
+C 31 ; WX 777 ; N C31 ; B 0 -48 777 743 ;
+C 32 ; WX 234 ; N C32 ; B 0 0 234 444 ;
+C 33 ; WX 319 ; N C33 ; B 0 0 319 694 ;
+C 34 ; WX 500 ; N C34 ; B 0 0 500 694 ;
+C 35 ; WX 833 ; N C35 ; B 0 -194 833 694 ;
+C 36 ; WX 500 ; N C36 ; B 0 -55 500 750 ;
+C 37 ; WX 833 ; N C37 ; B 0 -55 833 750 ;
+C 38 ; WX 758 ; N C38 ; B 0 0 758 694 ;
+C 39 ; WX 277 ; N C39 ; B 0 0 277 694 ; L C39 C34
+C 40 ; WX 388 ; N C40 ; B 0 -250 388 750 ;
+C 41 ; WX 388 ; N C41 ; B 0 -250 388 750 ;
+C 42 ; WX 500 ; N C42 ; B 0 0 500 750 ;
+C 43 ; WX 777 ; N C43 ; B 0 -83 777 583 ;
+C 44 ; WX 277 ; N C44 ; B 0 -125 277 83 ;
+C 45 ; WX 333 ; N C45 ; B 0 0 333 444 ;
+C 46 ; WX 277 ; N C46 ; B 0 0 277 83 ;
+C 47 ; WX 500 ; N C47 ; B 0 -250 500 750 ;
+C 48 ; WX 500 ; N C48 ; B 0 0 500 655 ;
+C 49 ; WX 500 ; N C49 ; B 0 0 500 655 ;
+C 50 ; WX 500 ; N C50 ; B 0 0 500 655 ;
+C 51 ; WX 500 ; N C51 ; B 0 0 500 655 ;
+C 52 ; WX 500 ; N C52 ; B 0 0 500 655 ;
+C 53 ; WX 500 ; N C53 ; B 0 0 500 655 ;
+C 54 ; WX 500 ; N C54 ; B 0 0 500 655 ;
+C 55 ; WX 500 ; N C55 ; B 0 0 500 655 ;
+C 56 ; WX 500 ; N C56 ; B 0 0 500 655 ;
+C 57 ; WX 500 ; N C57 ; B 0 0 500 655 ;
+C 58 ; WX 277 ; N C58 ; B 0 0 277 444 ;
+C 59 ; WX 277 ; N C59 ; B 0 -125 277 444 ;
+C 60 ; WX 319 ; N C60 ; B 0 -194 319 500 ;
+C 61 ; WX 777 ; N C61 ; B 0 131 777 369 ;
+C 62 ; WX 472 ; N C62 ; B 0 -194 472 500 ;
+C 63 ; WX 472 ; N C63 ; B 0 0 472 694 ;
+C 64 ; WX 666 ; N C64 ; B 0 0 666 694 ;
+C 65 ; WX 666 ; N A ; B 0 0 666 694 ;
+C 66 ; WX 666 ; N B ; B 0 0 666 694 ;
+C 67 ; WX 638 ; N C ; B 0 0 638 694 ;
+C 68 ; WX 722 ; N D ; B 0 0 722 694 ;
+C 69 ; WX 597 ; N E ; B 0 0 597 694 ;
+C 70 ; WX 569 ; N F ; B 0 0 569 694 ;
+C 71 ; WX 666 ; N G ; B 0 0 666 694 ;
+C 72 ; WX 708 ; N H ; B 0 0 708 694 ;
+C 73 ; WX 277 ; N I ; B 0 0 277 694 ;
+C 74 ; WX 472 ; N J ; B 0 0 472 694 ;
+C 75 ; WX 694 ; N K ; B 0 0 694 694 ;
+C 76 ; WX 541 ; N L ; B 0 0 541 694 ;
+C 77 ; WX 875 ; N M ; B 0 0 875 694 ;
+C 78 ; WX 708 ; N N ; B 0 0 708 694 ;
+C 79 ; WX 736 ; N O ; B 0 0 736 694 ;
+C 80 ; WX 638 ; N P ; B 0 0 638 694 ;
+C 81 ; WX 736 ; N Q ; B 0 -125 736 694 ;
+C 82 ; WX 645 ; N R ; B 0 0 645 694 ;
+C 83 ; WX 555 ; N S ; B 0 0 555 694 ;
+C 84 ; WX 680 ; N T ; B 0 0 680 694 ;
+C 85 ; WX 687 ; N U ; B 0 0 687 694 ;
+C 86 ; WX 666 ; N V ; B 0 0 666 694 ;
+C 87 ; WX 944 ; N W ; B 0 0 944 694 ;
+C 88 ; WX 666 ; N X ; B 0 0 666 694 ;
+C 89 ; WX 666 ; N Y ; B 0 0 666 694 ;
+C 90 ; WX 611 ; N Z ; B 0 0 611 694 ;
+C 91 ; WX 288 ; N C91 ; B 0 -250 288 750 ;
+C 92 ; WX 500 ; N C92 ; B 0 0 500 694 ;
+C 93 ; WX 288 ; N C93 ; B 0 -250 288 750 ;
+C 94 ; WX 500 ; N C94 ; B 0 0 500 694 ;
+C 95 ; WX 277 ; N C95 ; B 0 0 277 679 ;
+C 96 ; WX 277 ; N C96 ; B 0 0 277 694 ;
+C 97 ; WX 480 ; N a ; B 0 0 480 444 ;
+C 98 ; WX 516 ; N b ; B 0 0 516 694 ;
+C 99 ; WX 444 ; N c ; B 0 0 444 444 ;
+C 100 ; WX 516 ; N d ; B 0 0 516 694 ;
+C 101 ; WX 444 ; N e ; B 0 0 444 444 ;
+C 102 ; WX 305 ; N f ; B 0 0 305 694 ; L f C11 L i C12 L l C13
+C 103 ; WX 500 ; N g ; B 0 -194 500 444 ;
+C 104 ; WX 516 ; N h ; B 0 0 516 694 ;
+C 105 ; WX 238 ; N i ; B 0 0 238 679 ;
+C 106 ; WX 266 ; N j ; B 0 -194 266 679 ;
+C 107 ; WX 488 ; N k ; B 0 0 488 694 ;
+C 108 ; WX 238 ; N l ; B 0 0 238 694 ;
+C 109 ; WX 794 ; N m ; B 0 0 794 444 ;
+C 110 ; WX 516 ; N n ; B 0 0 516 444 ;
+C 111 ; WX 500 ; N o ; B 0 0 500 444 ;
+C 112 ; WX 516 ; N p ; B 0 -194 516 444 ;
+C 113 ; WX 516 ; N q ; B 0 -194 516 444 ;
+C 114 ; WX 341 ; N r ; B 0 0 341 444 ;
+C 115 ; WX 383 ; N s ; B 0 0 383 444 ;
+C 116 ; WX 361 ; N t ; B 0 0 361 571 ;
+C 117 ; WX 516 ; N u ; B 0 0 516 444 ;
+C 118 ; WX 461 ; N v ; B 0 0 461 444 ;
+C 119 ; WX 683 ; N w ; B 0 0 683 444 ;
+C 120 ; WX 461 ; N x ; B 0 0 461 444 ;
+C 121 ; WX 461 ; N y ; B 0 -194 461 444 ;
+C 122 ; WX 434 ; N z ; B 0 0 434 444 ;
+C 123 ; WX 500 ; N C123 ; B 0 0 500 444 ;
+C 124 ; WX 1000 ; N C124 ; B 0 0 1000 444 ;
+C 125 ; WX 500 ; N C125 ; B 0 0 500 694 ;
+C 126 ; WX 500 ; N C126 ; B 0 0 500 676 ;
+C 127 ; WX 500 ; N C127 ; B 0 0 500 679 ;
+EndCharMetrics
+
+StartKernData
+StartKernPairs 143
+KPX C11 C33 69
+KPX C11 C39 69
+KPX C11 C41 69
+KPX C11 C63 69
+KPX C11 C93 69
+KPX C32 L -259
+KPX C32 l -239
+KPX C39 C33 111
+KPX C39 C63 111
+KPX A C -28
+KPX A G -28
+KPX A O -28
+KPX A Q -28
+KPX A T -84
+KPX A U -28
+KPX A V -112
+KPX A W -112
+KPX A Y -84
+KPX A t -28
+KPX D A -28
+KPX D V -28
+KPX D W -28
+KPX D X -28
+KPX D Y -28
+KPX F A -84
+KPX F C -28
+KPX F G -28
+KPX F O -28
+KPX F Q -28
+KPX F a -28
+KPX F e -28
+KPX F o -28
+KPX F r -28
+KPX F u -28
+KPX I I 27
+KPX K C -28
+KPX K G -28
+KPX K O -28
+KPX K Q -28
+KPX L T -84
+KPX L V -112
+KPX L W -112
+KPX L Y -84
+KPX O A -28
+KPX O V -28
+KPX O W -28
+KPX O X -28
+KPX O Y -28
+KPX P C44 -84
+KPX P C46 -84
+KPX P A -84
+KPX P a -28
+KPX P e -28
+KPX P o -28
+KPX T A -84
+KPX T a -84
+KPX T e -84
+KPX T o -84
+KPX T r -84
+KPX T u -84
+KPX T y -84
+KPX V A -84
+KPX V C -28
+KPX V G -28
+KPX V O -28
+KPX V Q -28
+KPX V a -28
+KPX V e -28
+KPX V o -28
+KPX V r -28
+KPX V u -28
+KPX W A -84
+KPX W C -28
+KPX W G -28
+KPX W O -28
+KPX W Q -28
+KPX W a -28
+KPX W e -28
+KPX W o -28
+KPX W r -28
+KPX W u -28
+KPX X C -28
+KPX X G -28
+KPX X O -28
+KPX X Q -28
+KPX Y A -84
+KPX Y a -84
+KPX Y e -84
+KPX Y o -84
+KPX Y r -84
+KPX Y u -84
+KPX a r -28
+KPX a w -28
+KPX a y -28
+KPX b c 27
+KPX b d 27
+KPX b e 27
+KPX b o 27
+KPX b q 27
+KPX b r -28
+KPX b w -28
+KPX b x -28
+KPX b y -28
+KPX f C33 69
+KPX f C39 69
+KPX f C41 69
+KPX f C63 69
+KPX f C93 69
+KPX g j 27
+KPX k a -28
+KPX k c -28
+KPX k e -28
+KPX k o -28
+KPX o c 27
+KPX o d 27
+KPX o e 27
+KPX o o 27
+KPX o q 27
+KPX o r -28
+KPX o w -28
+KPX o x -28
+KPX o y -28
+KPX p c 27
+KPX p d 27
+KPX p e 27
+KPX p o 27
+KPX p q 27
+KPX p r -28
+KPX p w -28
+KPX p x -28
+KPX p y -28
+KPX t w -28
+KPX t y -28
+KPX u w -28
+KPX w a -28
+KPX w c -28
+KPX w e -28
+KPX w o -28
+KPX y C44 -84
+KPX y C46 -84
+KPX y a -28
+KPX y e -28
+KPX y o -28
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/src/fonts/texcmssi.gle b/src/fonts/texcmssi.gle
new file mode 100644
index 0000000..ae1026b
--- /dev/null
+++ b/src/fonts/texcmssi.gle
@@ -0,0 +1,5340 @@
+dfont file_name="CMSSI10"
+dfont font_name="CMSSI10"
+dfont design= .35146
+dfont slant= .212555
+dfont space= .117153
+dfont stretch= .585767E-01
+dfont shrink= .390513E-01
+dfont x_hei= .156204
+dfont quad= .351461
+dfont extra_space= .390513E-01
+dfont paint="FILL"
+!------------------ end of main parameters
+dfont char=0 !-------------- Beginning of new char.
+dfont wid=.541669 hei=.694445 dep=0 italic=.133718
+set path ! start of curve
+newpath
+! start of curve
+amove .227473 .24114
+aline .227473 .240164
+aline .226496 .235283
+aline .22552 .231378
+aline .223567 .221615
+aline .222591 .219662
+aline .112272 .219662
+bezier .953279E-01 .146392 .814207E-01 .722012E-01 .644343E-01 -.976277E-03
+aline .341697E-01 -.976277E-03
+bezier .510363E-01 .797451E-01 .677257E-01 .160783 .859124E-01 .24114
+aline .227473 .24114
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=1 !-------------- Beginning of new char.
+dfont wid=.833336 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .214781 .242117
+bezier .235799 .16106 .257561 .801136E-01 .278239 -.976277E-03
+aline .156204E-01 -.976277E-03
+bezier .714736E-01 .799072E-01 .127237 .160852 .182564 .242117
+closepath
+! end of curve
+
+! start of curve
+amove .188421 .216734
+bezier .149146 .152199 .104655 .914218E-01 .627258E-01 .288002E-01
+aline .063458 .273358E-01
+aline .236259 .273358E-01
+bezier .230312 .538408E-01 .221849 .835843E-01 .214781 .111296
+aline .200137 .169872
+aline .199161 .174754
+aline .196232 .186469
+aline .195255 .19135
+aline .194279 .195255
+aline .19135 .2099
+aline .19135 .214781
+aline .190374 .215757
+aline .189398 .218686
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=2 !-------------- Beginning of new char.
+dfont wid=.777781 hei=.694445 dep=0 italic=.0755463
+set path ! start of curve
+newpath
+! start of curve
+amove .200137 .249927
+bezier .242035 .246992 .278371 .210246 .281168 .16792
+bezier .292921 .901958E-01 .232377 .654494E-02 .153276 -.781022E-02
+bezier .117472 -.139402E-01 .757525E-01 .561577E-03 .576004E-01 .341697E-01
+bezier .205237E-01 .999241E-01 .583329E-01 .185273 .117153 .22552
+bezier .141535 .242397 .170828 .25195 .200137 .249927
+closepath
+! end of curve
+
+! start of curve
+amove .176706 .228449
+bezier .109787 .218197 .688003E-01 .145027 .712682E-01 .820073E-01
+bezier .742748E-01 .536786E-01 .904033E-01 .218882E-01 .121058 .146442E-01
+bezier .163339 .245496E-02 .207989 .329642E-01 .230401 .683394E-01
+bezier .25585 .111538 .267531 .168854 .23333 .2099
+bezier .218254 .223839 .196623 .232708 .176706 .228449
+closepath
+! end of curve
+
+! start of curve
+amove .23333 .134726
+aline .232354 .129845
+aline .231378 .124963
+aline .230401 .121058
+aline .228449 .111296
+aline .227473 .10739
+aline .226496 .106414
+aline .927463E-01 .106414
+aline .937226E-01 .110319
+aline .956752E-01 .120082
+aline .966514E-01 .123987
+aline .098604 .13375
+aline .995803E-01 .134726
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=3 !-------------- Beginning of new char.
+dfont wid=.611115 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .174754 .242117
+bezier .184715 .16042 .194768 .080089 .205018 -.976277E-03
+aline .172801 -.976277E-03
+bezier .164407 .715426E-01 .15412 .143277 .150347 .21771
+aline .14937 .214781
+aline .148394 .212828
+aline .147418 .2099
+aline .145465 .205994
+aline .144489 .203066
+aline .135703 .185493
+aline .134726 .182564
+aline .13375 .180611
+aline .132774 .179635
+aline .117153 .148394
+bezier .904383E-01 .983907E-01 .632503E-01 .487289E-01 .361223E-01 -.976277E-03
+aline .010739 -.976277E-03
+bezier .554308E-01 .799769E-01 .099778 .161176 .144489 .242117
+closepath
+! end of curve
+
+! start of curve
+amove .150347 .21771
+aline .151323 .216734
+aline .152299 .21771
+aline .151323 .218686
+aline .150347 .21771
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=4 !-------------- Beginning of new char.
+dfont wid=.666669 hei=.694445 dep=0 italic=.128163
+set path ! start of curve
+newpath
+! start of curve
+amove .269453 .240164
+aline .268476 .235283
+aline .2675 .231378
+aline .264571 .216734
+aline .263595 .214781
+aline .063458 .214781
+aline .063458 .215757
+aline .663868E-01 .230401
+aline .673631E-01 .234307
+aline .683394E-01 .239188
+aline .693157E-01 .240164
+closepath
+! end of curve
+
+! start of curve
+amove .224544 .136679
+aline .224544 .134726
+aline .222591 .124963
+aline .221615 .121058
+aline .219662 .111296
+aline .644343E-01 .111296
+aline .644343E-01 .115201
+aline .654106E-01 .120082
+aline .663868E-01 .123987
+aline .683394E-01 .13375
+aline .693157E-01 .136679
+aline .224544 .136679
+closepath
+! end of curve
+
+! start of curve
+amove .22552 .244069E-01
+aline .224544 .195255E-01
+aline .223567 .146442E-01
+aline .222591 .010739
+aline .220639 .976277E-03
+aline .219662 -.976277E-03
+aline .156204E-01 -.976277E-03
+aline .156204E-01 0
+aline .017573 .976277E-02
+aline .185493E-01 .136679E-01
+aline .205018E-01 .234307E-01
+aline .214781E-01 .244069E-01
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=5 !-------------- Beginning of new char.
+dfont wid=.708338 hei=.694445 dep=0 italic=.0809383
+set path ! start of curve
+newpath
+! start of curve
+amove .2675 .24114
+bezier .250524 .160443 .23383 .794056E-01 .215757 -.976277E-03
+aline .185493 -.976277E-03
+bezier .199914 .729526E-01 .218092 .146872 .231378 .220639
+aline .112272 .220639
+bezier .957199E-01 .146925 .813553E-01 .725466E-01 .644343E-01 -.976277E-03
+aline .341697E-01 -.976277E-03
+bezier .510363E-01 .797451E-01 .677257E-01 .160783 .859124E-01 .24114
+aline .2675 .24114
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=6 !-------------- Beginning of new char.
+dfont wid=.722224 hei=.694445 dep=0 italic=.119829
+set path ! start of curve
+newpath
+! start of curve
+amove .286049 .242117
+aline .286049 .240164
+aline .285073 .235283
+aline .284097 .231378
+aline .282144 .221615
+aline .281168 .220639
+aline .10739 .220639
+aline .106414 .219662
+bezier .125595 .18676 .145416 .153756 .163038 .120082
+bezier .133494 .880487E-01 .104757 .554346E-01 .751733E-01 .234307E-01
+aline .761496E-01 .224544E-01
+aline .239188 .224544E-01
+aline .239188 .195255E-01
+aline .238212 .146442E-01
+aline .237235 .010739
+aline .235283 .976277E-03
+aline .234307 -.976277E-03
+aline .205018E-01 -.976277E-03
+bezier .056223 .379986E-01 .920967E-01 .768642E-01 .126672 .116665
+bezier .106803 .151251 .868607E-01 .185786 .673631E-01 .220639
+aline .693157E-01 .230401
+aline .070292 .234307
+aline .712682E-01 .239188
+aline .722445E-01 .242117
+aline .286049 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=7 !-------------- Beginning of new char.
+dfont wid=.777781 hei=.694445 dep=0 italic=.0903072
+set path ! start of curve
+newpath
+! start of curve
+amove .136679 .249927
+bezier .16107 .247446 .172802 .221403 .173777 .200137
+aline .173777 .173777
+aline .174754 .172801
+bezier .186142 .204506 .204241 .239471 .239188 .248951
+bezier .261167 .254364 .288013 .243864 .294836 .220639
+aline .295812 .216734
+aline .295812 .211852
+aline .296788 .210876
+aline .296788 .200137
+aline .295812 .199161
+aline .295812 .194279
+aline .269453 .194279
+bezier .271006 .2072 .267317 .223177 .252856 .226496
+bezier .233281 .231095 .213504 .21598 .204042 .199161
+bezier .177604 .146314 .173767 .858991E-01 .159133 .292883E-01
+aline .156204 .146442E-01
+aline .155228 .010739
+aline .153276 .976277E-03
+aline .152299 -.976277E-03
+aline .122035 -.976277E-03
+bezier .132675 .546674E-01 .147208 .112477 .156204 .165967
+aline .156204 .176706
+aline .157181 .177682
+bezier .157143 .194921 .155499 .218873 .135703 .22552
+bezier .114878 .233544 .927116E-01 .215054 .888412E-01 .194279
+aline .624817E-01 .194279
+bezier .676325E-01 .222808 .093591 .245427 .122035 .249927
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=8 !-------------- Beginning of new char.
+dfont wid=.722224 hei=.694445 dep=0 italic=.0460253
+set path ! start of curve
+newpath
+! start of curve
+amove .192327 .242117
+aline .192327 .240164
+aline .19135 .235283
+aline .190374 .231378
+aline .187445 .216734
+aline .186469 .212828
+aline .185493 .207947
+aline .18476 .206483
+aline .185493 .205018
+bezier .225623 .204322 .268192 .169604 .261642 .12594
+bezier .252155 .739545E-01 .199045 .398995E-01 .14937 .361223E-01
+aline .148394 .331934E-01
+aline .147418 .292883E-01
+aline .144489 .146442E-01
+aline .143513 .010739
+aline .14156 .976277E-03
+aline .140584 -.976277E-03
+aline .112272 -.976277E-03
+aline .112272 0
+aline .114224 .976277E-02
+aline .115201 .136679E-01
+aline .11813 .028312
+aline .119106 .322171E-01
+aline .119757 .341697E-01
+aline .119372 .353235E-01
+bezier .865378E-01 .393647E-01 .488751E-01 .612261E-01 .045885 .976277E-01
+bezier .395831E-01 .134447 .682962E-01 .168574 .098604 .186469
+aline .116177 .195255
+aline .119106 .196232
+aline .121058 .197208
+aline .132774 .201113
+aline .140584 .203066
+aline .145465 .204042
+aline .150347 .204042
+aline .151323 .205018
+aline .155662 .205886
+aline .156204 .206971
+aline .157181 .211852
+aline .158157 .215757
+aline .161086 .230401
+aline .162062 .234307
+aline .163038 .239188
+aline .164015 .242117
+aline .192327 .242117
+closepath
+! end of curve
+
+! start of curve
+amove .148394 .18354
+bezier .108266 .178612 .721339E-01 .143478 .741971E-01 .102509
+bezier .768471E-01 .790898E-01 .980371E-01 .599399E-01 .122035 .576004E-01
+aline .123499 .568681E-01
+bezier .133599 .983848E-01 .142929 .141783 .150486 .183959
+aline .149859 .184272
+closepath
+! end of curve
+
+! start of curve
+amove .179635 .180611
+bezier .171401 .139539 .16138 .983714E-01 .154057 .574051E-01
+bezier .195897 .597822E-01 .235302 .968644E-01 .232354 .139608
+bezier .229423 .159407 .213829 .177071 .193303 .181588
+aline .185493 .18354
+aline .182564 .184126
+aline .180406 .183694
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=9 !-------------- Beginning of new char.
+dfont wid=.777781 hei=.694445 dep=0 italic=.0903072
+set path ! start of curve
+newpath
+! start of curve
+amove .202089 .242117
+bezier .190253 .180807 .175705 .119369 .16377 .583326E-01
+bezier .206831 .665673E-01 .226872 .112732 .23333 .152299
+bezier .239552 .174379 .242254 .204543 .266524 .213805
+aline .299717 .213805
+aline .299717 .212828
+aline .297765 .203066
+aline .296788 .199161
+aline .295812 .194279
+aline .294836 .193303
+bezier .271424 .189974 .265096 .163137 .260666 .143513
+bezier .251156 .928534E-01 .215925 .435257E-01 .162062 .361223E-01
+aline .158867 .353235E-01
+aline .158157 .331934E-01
+aline .157181 .292883E-01
+aline .154252 .146442E-01
+aline .153276 .010739
+aline .151323 .976277E-03
+aline .150347 -.976277E-03
+aline .122035 -.976277E-03
+aline .122035 0
+aline .123987 .976277E-02
+aline .124963 .136679E-01
+aline .127892 .028312
+aline .128869 .322171E-01
+aline .129519 .341697E-01
+aline .129113 .353901E-01
+bezier .953023E-01 .389423E-01 .689978E-01 .704193E-01 .722445E-01 .104462
+aline .712682E-01 .105438
+bezier .723343E-01 .121841 .734226E-01 .138642 .781022E-01 .154252
+bezier .789703E-01 .166853 .081814 .183154 .693157E-01 .19135
+aline .663868E-01 .192327
+aline .615055E-01 .193303
+aline .624817E-01 .198184
+aline .063458 .202089
+aline .654106E-01 .211852
+aline .663868E-01 .213805
+aline .995803E-01 .213805
+aline .103485 .211852
+aline .108367 .206971
+aline .109343 .205018
+bezier .115187 .180821 .105755 .1567 .102509 .132774
+bezier .969011E-01 .107455 .100055 .709166E-01 .128869 .595529E-01
+aline .131797 .585766E-01
+aline .133262 .578444E-01
+bezier .148659 .11824 .159316 .181037 .173777 .242117
+aline .202089 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=10 !-------------- Beginning of new char.
+dfont wid=.722224 hei=.694445 dep=0 italic=.0829268
+set path ! start of curve
+newpath
+! start of curve
+amove .19135 .249927
+bezier .227187 .248056 .265678 .223955 .270429 .185493
+bezier .274145 .134879 .233823 .974546E-01 .205994 .605292E-01
+bezier .197496 .488805E-01 .189416 .369301E-01 .182808 .239188E-01
+aline .18354 .224544E-01
+aline .243093 .224544E-01
+aline .243093 .195255E-01
+aline .242117 .146442E-01
+aline .24114 .010739
+aline .239188 .976277E-03
+aline .238212 -.976277E-03
+aline .153276 -.976277E-03
+bezier .168321 .624697E-01 .228359 .103684 .240164 .16792
+bezier .243546 .196067 .222128 .223689 .193303 .227473
+bezier .148181 .237516 .922974E-01 .206364 .849361E-01 .157181
+bezier .762525E-01 .117158 .098926 .760352E-01 .103485 .361223E-01
+aline .103485 .781022E-02
+aline .102509 .683394E-02
+aline .102509 .976277E-03
+aline .101533 -.976277E-03
+aline .165967E-01 -.976277E-03
+aline .165967E-01 0
+aline .185493E-01 .976277E-02
+aline .195255E-01 .136679E-01
+aline .205018E-01 .185493E-01
+aline .214781E-01 .224544E-01
+aline .820073E-01 .224544E-01
+aline .829836E-01 .234307E-01
+bezier .790877E-01 .709224E-01 .421695E-01 .116268 .556478E-01 .164991
+bezier .727426E-01 .221474 .135222 .254102 .19135 .249927
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=11 !-------------- Beginning of new char.
+dfont wid=.583336 hei=.694445 dep=0 italic=.217052
+dfont fby=33 kadd=.0694447
+dfont fby=39 kadd=.0694447
+dfont fby=")" kadd=.0694447
+dfont fby="?" kadd=.0694447
+dfont fby="]" kadd=.0694447
+dfont fby="i" ligrep=14
+dfont fby="l" ligrep=15
+set path ! start of curve
+newpath
+! start of curve
+amove .156204 .246022
+aline .157181 .245046
+aline .163038 .245046
+aline .16792 .244069
+aline .171825 .243093
+aline .173777 .242117
+aline .173777 .240164
+aline .172801 .235283
+aline .171825 .231378
+aline .169872 .221615
+aline .168896 .219662
+bezier .14866 .229694 .118853 .227816 .106414 .205994
+aline .105438 .203066
+aline .104462 .199161
+aline .102509 .189398
+aline .101533 .185493
+aline .098604 .170849
+aline .976277E-01 .166943
+aline .956752E-01 .157181
+aline .094943 .155716
+aline .956752E-01 .154252
+aline .134726 .154252
+aline .134726 .153276
+aline .131797 .138631
+aline .130821 .134726
+aline .917701E-01 .134726
+bezier .819322E-01 .895303E-01 .731351E-01 .043928 .624817E-01 -.976277E-03
+aline .370985E-01 -.976277E-03
+bezier .452607E-01 .443367E-01 .578479E-01 .894571E-01 .644343E-01 .134726
+aline .390511E-01 .134726
+aline .390511E-01 .137655
+aline .419799E-01 .152299
+aline .429562E-01 .154252
+aline .693157E-01 .154252
+bezier .075596 .176498 .766181E-01 .20178 .927463E-01 .219662
+bezier .108219 .238025 .131874 .248979 .156204 .246022
+closepath
+! end of curve
+
+! start of curve
+amove .253832 .246022
+aline .254808 .245046
+aline .260666 .245046
+aline .265547 .244069
+aline .269453 .243093
+aline .271405 .242117
+aline .271405 .240164
+aline .270429 .235283
+aline .269453 .231378
+aline .2675 .221615
+aline .266524 .219662
+bezier .246945 .228632 .221476 .228287 .205994 .210876
+aline .202089 .203066
+aline .201113 .199161
+aline .199161 .189398
+aline .198184 .185493
+aline .195255 .170849
+aline .194279 .166943
+aline .192327 .157181
+aline .191594 .155716
+aline .192327 .154252
+aline .231378 .154252
+aline .231378 .153276
+aline .228449 .138631
+aline .227473 .134726
+aline .188421 .134726
+bezier .178585 .08953 .169786 .439283E-01 .159133 -.976277E-03
+aline .13375 -.976277E-03
+bezier .14778 .654176E-01 .160802 .132221 .176706 .198184
+bezier .188856 .228584 .220899 .250219 .253832 .246022
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=12 !-------------- Beginning of new char.
+dfont wid=.536113 hei=.694445 dep=0 italic=.0976076
+set path ! start of curve
+newpath
+! start of curve
+amove .142536 .246022
+aline .147418 .245046
+aline .153276 .243093
+aline .155228 .242117
+aline .155228 .240164
+aline .154252 .235283
+aline .153276 .231378
+aline .151323 .221615
+aline .150347 .218686
+bezier .136031 .232003 .111961 .224527 .106414 .205994
+aline .105438 .203066
+aline .104462 .199161
+aline .102509 .189398
+aline .101533 .185493
+aline .098604 .170849
+aline .976277E-01 .166943
+aline .956752E-01 .157181
+aline .094943 .155716
+aline .956752E-01 .154252
+aline .136679 .154252
+aline .136679 .153276
+aline .13375 .138631
+aline .132774 .134726
+aline .917701E-01 .134726
+bezier .819322E-01 .895303E-01 .731351E-01 .043928 .624817E-01 -.976277E-03
+aline .370985E-01 -.976277E-03
+bezier .452607E-01 .443367E-01 .578479E-01 .894571E-01 .644343E-01 .134726
+aline .390511E-01 .134726
+aline .390511E-01 .137655
+aline .419799E-01 .152299
+aline .429562E-01 .154252
+aline .693157E-01 .154252
+bezier .759032E-01 .178192 .773819E-01 .205327 .946989E-01 .224544
+aline .104462 .234307
+aline .106414 .235283
+aline .108367 .237235
+aline .110319 .238212
+aline .111296 .239188
+aline .119106 .243093
+aline .124963 .245046
+aline .128869 .246022
+closepath
+! end of curve
+
+! start of curve
+amove .211852 .243093
+aline .211852 .240164
+aline .210876 .235283
+aline .2099 .231378
+aline .206971 .216734
+aline .205994 .214781
+aline .177682 .214781
+aline .177682 .215757
+aline .180611 .230401
+aline .181588 .234307
+aline .182564 .239188
+aline .18354 .243093
+aline .211852 .243093
+closepath
+! end of curve
+
+! start of curve
+amove .192327 .154252
+bezier .181685 .102484 .170994 .504499E-01 .159133 -.976277E-03
+aline .13375 -.976277E-03
+bezier .144401 .05079 .155095 .102823 .166943 .154252
+aline .192327 .154252
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=13 !-------------- Beginning of new char.
+dfont wid=.536113 hei=.694445 dep=0 italic=.0948286
+set path ! start of curve
+newpath
+! start of curve
+amove .142536 .246022
+aline .147418 .245046
+aline .153276 .243093
+aline .155228 .242117
+aline .155228 .240164
+aline .154252 .235283
+aline .153276 .231378
+aline .151323 .221615
+aline .150347 .219662
+bezier .137419 .22859 .119302 .227215 .110319 .213805
+aline .106414 .205994
+aline .105438 .203066
+aline .104462 .199161
+aline .102509 .189398
+aline .101533 .185493
+aline .098604 .170849
+aline .976277E-01 .166943
+aline .956752E-01 .157181
+aline .094943 .155716
+aline .956752E-01 .154252
+aline .136679 .154252
+aline .136679 .153276
+aline .13375 .138631
+aline .132774 .134726
+aline .917701E-01 .134726
+bezier .819322E-01 .895303E-01 .731351E-01 .043928 .624817E-01 -.976277E-03
+aline .370985E-01 -.976277E-03
+bezier .452607E-01 .443367E-01 .578479E-01 .894571E-01 .644343E-01 .134726
+aline .390511E-01 .134726
+aline .390511E-01 .137655
+aline .419799E-01 .152299
+aline .429562E-01 .154252
+aline .693157E-01 .154252
+bezier .759032E-01 .178192 .773819E-01 .205327 .946989E-01 .224544
+aline .104462 .234307
+aline .106414 .235283
+aline .108367 .237235
+aline .110319 .238212
+aline .111296 .239188
+aline .119106 .243093
+aline .124963 .245046
+aline .128869 .246022
+closepath
+! end of curve
+
+! start of curve
+amove .210876 .242117
+bezier .194304 .161052 .17714 .797387E-01 .159133 -.976277E-03
+aline .13375 -.976277E-03
+bezier .150556 .801008E-01 .16768 .161251 .185493 .242117
+aline .210876 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=14 !-------------- Beginning of new char.
+dfont wid=.813891 hei=.694445 dep=0 italic=.0976076
+set path ! start of curve
+newpath
+! start of curve
+amove .14937 .246022
+aline .150347 .245046
+aline .155228 .245046
+aline .159133 .244069
+aline .162062 .243093
+aline .164015 .242117
+aline .164015 .240164
+aline .163038 .235283
+aline .162062 .231378
+aline .160109 .221615
+aline .159133 .219662
+bezier .141363 .231059 .112263 .225802 .105438 .203066
+aline .104462 .199161
+aline .102509 .189398
+aline .101533 .185493
+aline .098604 .170849
+aline .976277E-01 .166943
+aline .956752E-01 .157181
+aline .094943 .155716
+aline .956752E-01 .154252
+aline .136679 .154252
+aline .136679 .153276
+aline .13375 .138631
+aline .132774 .134726
+aline .917701E-01 .134726
+bezier .819322E-01 .895303E-01 .731351E-01 .043928 .624817E-01 -.976277E-03
+aline .370985E-01 -.976277E-03
+bezier .452607E-01 .443367E-01 .578479E-01 .894571E-01 .644343E-01 .134726
+aline .390511E-01 .134726
+aline .390511E-01 .137655
+aline .419799E-01 .152299
+aline .429562E-01 .154252
+aline .693157E-01 .154252
+bezier .756027E-01 .176309 .766774E-01 .201243 .917701E-01 .219662
+bezier .105807 .23679 .126428 .249378 .14937 .246022
+closepath
+! end of curve
+
+! start of curve
+amove .240164 .246022
+aline .245046 .245046
+aline .248951 .244069
+aline .25188 .243093
+aline .252856 .242117
+aline .252856 .240164
+aline .25188 .235283
+aline .250903 .231378
+aline .248951 .221615
+aline .247974 .219662
+bezier .236325 .227521 .218698 .228162 .2099 .215757
+bezier .19765 .198498 .199331 .175274 .192571 .155716
+aline .193303 .154252
+aline .234307 .154252
+aline .234307 .153276
+aline .231378 .138631
+aline .230401 .134726
+aline .189398 .134726
+bezier .179559 .895305E-01 .170764 .439274E-01 .160109 -.976277E-03
+aline .134726 -.976277E-03
+bezier .148757 .654056E-01 .161789 .132289 .177682 .198184
+bezier .185317 .220373 .202738 .240839 .226496 .246022
+closepath
+! end of curve
+
+! start of curve
+amove .30948 .243093
+aline .30948 .240164
+aline .308504 .235283
+aline .307527 .231378
+aline .304598 .216734
+aline .303622 .214781
+aline .27531 .214781
+aline .27531 .215757
+aline .278239 .230401
+aline .279215 .234307
+aline .280192 .239188
+aline .281168 .243093
+aline .30948 .243093
+closepath
+! end of curve
+
+! start of curve
+amove .289954 .154252
+bezier .279314 .102484 .268622 .05045 .256761 -.976277E-03
+aline .231378 -.976277E-03
+bezier .242027 .05079 .252722 .102823 .264571 .154252
+aline .289954 .154252
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=15 !-------------- Beginning of new char.
+dfont wid=.813891 hei=.694445 dep=0 italic=.0948286
+set path ! start of curve
+newpath
+! start of curve
+amove .14937 .246022
+aline .150347 .245046
+aline .155228 .245046
+aline .159133 .244069
+aline .162062 .243093
+aline .164015 .242117
+aline .164015 .240164
+aline .163038 .235283
+aline .162062 .231378
+aline .160109 .221615
+aline .159133 .219662
+bezier .141363 .231059 .112263 .225802 .105438 .203066
+aline .104462 .199161
+aline .102509 .189398
+aline .101533 .185493
+aline .098604 .170849
+aline .976277E-01 .166943
+aline .956752E-01 .157181
+aline .094943 .155716
+aline .956752E-01 .154252
+aline .136679 .154252
+aline .136679 .153276
+aline .13375 .138631
+aline .132774 .134726
+aline .917701E-01 .134726
+bezier .819322E-01 .895303E-01 .731351E-01 .043928 .624817E-01 -.976277E-03
+aline .370985E-01 -.976277E-03
+bezier .452607E-01 .443367E-01 .578479E-01 .894571E-01 .644343E-01 .134726
+aline .390511E-01 .134726
+aline .390511E-01 .137655
+aline .419799E-01 .152299
+aline .429562E-01 .154252
+aline .693157E-01 .154252
+bezier .756027E-01 .176309 .766774E-01 .201243 .917701E-01 .219662
+bezier .105807 .23679 .126428 .249378 .14937 .246022
+closepath
+! end of curve
+
+! start of curve
+amove .240164 .246022
+aline .245046 .245046
+aline .250903 .243093
+aline .252856 .242117
+aline .252856 .240164
+aline .25188 .235283
+aline .250903 .231378
+aline .248951 .221615
+aline .247974 .219662
+bezier .235047 .22859 .216929 .227215 .207947 .213805
+aline .204042 .205994
+aline .203066 .203066
+aline .202089 .199161
+aline .200137 .189398
+aline .199161 .185493
+aline .196232 .170849
+aline .195255 .166943
+aline .193303 .157181
+aline .192571 .155716
+aline .193303 .154252
+aline .234307 .154252
+aline .234307 .153276
+aline .231378 .138631
+aline .230401 .134726
+aline .189398 .134726
+bezier .179559 .895305E-01 .170764 .439274E-01 .160109 -.976277E-03
+aline .134726 -.976277E-03
+bezier .148757 .654056E-01 .161789 .132289 .177682 .198184
+bezier .185317 .220373 .202738 .240839 .226496 .246022
+closepath
+! end of curve
+
+! start of curve
+amove .308504 .242117
+bezier .291931 .161052 .274769 .797386E-01 .256761 -.976277E-03
+aline .231378 -.976277E-03
+bezier .248182 .080101 .26531 .161251 .28312 .242117
+aline .308504 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=16 !-------------- Beginning of new char.
+dfont wid=.23889 hei=.444445 dep=0 italic=.0416899
+set path ! start of curve
+newpath
+! start of curve
+amove .888412E-01 .154252
+bezier .782003E-01 .102484 .675088E-01 .504498E-01 .556478E-01 -.976277E-03
+aline .302646E-01 -.976277E-03
+bezier .040915 .507899E-01 .516092E-01 .102823 .063458 .154252
+aline .888412E-01 .154252
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=17 !-------------- Beginning of new char.
+dfont wid=.266668 hei=.444445 dep=.194445 italic=.0416899
+set path ! start of curve
+newpath
+! start of curve
+amove .098604 .154252
+bezier .852039E-01 .911214E-01 .730855E-01 .274808E-01 .576004E-01 -.035146
+bezier .479286E-01 -.576117E-01 .236046E-01 -.785729E-01 -.195255E-02 -.722445E-01
+bezier -.129421E-01 -.722137E-01 -.260018E-01 -.682549E-01 -.331934E-01 -.605292E-01
+aline -.322171E-01 -.595529E-01
+aline -.028312 -.517427E-01
+aline -.273358E-01 -.507664E-01
+aline -.234307E-01 -.429562E-01
+aline -.214781E-01 -.410036E-01
+bezier -.639956E-02 -.599199E-01 .299042E-01 -.522561E-01 .341697E-01 -.273358E-01
+bezier .472737E-01 .331524E-01 .593324E-01 .940481E-01 .732208E-01 .154252
+aline .098604 .154252
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=18 !-------------- Beginning of new char.
+dfont wid=.500002 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .108367 .242117
+bezier .119869 .223067 .132092 .203976 .142536 .184516
+aline .122035 .184516
+bezier .109185 .204071 .950907E-01 .222732 .820073E-01 .242117
+aline .108367 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=19 !-------------- Beginning of new char.
+dfont wid=.500002 hei=.694445 dep=0 italic=.0920515
+set path ! start of curve
+newpath
+! start of curve
+amove .198184 .242117
+bezier .176868 .222692 .154838 .204258 .13375 .184516
+aline .112272 .184516
+aline .114224 .185493
+aline .151323 .222591
+aline .153276 .223567
+aline .171825 .242117
+aline .198184 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=20 !-------------- Beginning of new char.
+dfont wid=.500002 hei=.631945 dep=0 italic=.0843229
+set path ! start of curve
+newpath
+! start of curve
+amove .976277E-01 .227473
+bezier .107919 .213656 .117354 .198684 .12838 .185737
+bezier .144796 .199222 .160335 .213926 .176706 .227473
+aline .197208 .227473
+bezier .176736 .208558 .155829 .190245 .135703 .170849
+aline .115201 .170849
+bezier .101892 .189278 .897012E-01 .208515 .771259E-01 .227473
+aline .976277E-01 .227473
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=21 !-------------- Beginning of new char.
+dfont wid=.500002 hei=.694445 dep=0 italic=.0948286
+set path ! start of curve
+newpath
+! start of curve
+amove .101533 .242117
+bezier .974487E-01 .226368 .107945 .205653 .12594 .204042
+bezier .14918 .199566 .173219 .219184 .178659 .242117
+aline .199161 .242117
+bezier .191202 .200396 .141005 .165116 .100557 .187445
+bezier .825227E-01 .198883 .765677E-01 .222071 .081031 .242117
+aline .101533 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=22 !-------------- Beginning of new char.
+dfont wid=.500002 hei=.608887 dep=0 italic=.0877552
+set path ! start of curve
+newpath
+! start of curve
+amove .198184 .219662
+aline .198184 .216734
+aline .197208 .212828
+aline .195255 .203066
+aline .194279 .199161
+aline .193303 .198184
+aline .673631E-01 .198184
+aline .683394E-01 .202089
+aline .070292 .211852
+aline .722445E-01 .219662
+aline .198184 .219662
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=23 !-------------- Beginning of new char.
+dfont wid=.737521 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .189398 .242117
+bezier .20508 .240955 .221069 .226449 .214781 .2099
+bezier .202448 .184158 .163445 .175608 .14156 .194279
+bezier .128222 .207876 .140102 .228057 .154252 .235283
+aline .160109 .238212
+aline .165967 .240164
+aline .169872 .24114
+aline .174754 .242117
+closepath
+! end of curve
+
+! start of curve
+amove .171825 .226496
+bezier .159296 .226694 .149133 .207616 .162062 .201113
+bezier .17549 .195017 .198585 .201673 .196232 .219662
+aline .195255 .220639
+aline .194279 .222591
+aline .193303 .223567
+aline .189398 .22552
+aline .186469 .226496
+aline .185493 .227473
+aline .172801 .227473
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=24 !-------------- Beginning of new char.
+dfont wid=.444446 hei=0 dep=.170138 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .966514E-01 -.117153E-01
+bezier .849206E-01 -.305788E-01 .733427E-01 -.495526E-01 .615055E-01 -.683394E-01
+aline .380748E-01 -.683394E-01
+bezier .506503E-01 -.049381 .628411E-01 -.301454E-01 .761496E-01 -.117153E-01
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=25 !-------------- Beginning of new char.
+dfont wid=.480558 hei=.694445 dep=0 italic=.0920515
+set path ! start of curve
+newpath
+! start of curve
+amove .150347 .246022
+bezier .17229 .24431 .197456 .223024 .19135 .199161
+bezier .189553 .173638 .16772 .155267 .147662 .143025
+bezier .16275 .130495 .173257 .111298 .174754 .917701E-01
+bezier .179475 .049988 .152268 .58818E-02 .110319 -.390511E-02
+aline .105438 -.390511E-02
+aline .104462 -.488139E-02
+aline .888412E-01 -.488139E-02
+aline .878649E-01 -.390511E-02
+aline .829836E-01 -.390511E-02
+aline .781022E-01 -.292883E-02
+aline .693157E-01 0
+aline .683394E-01 .976277E-03
+aline .683394E-01 .195255E-02
+aline .712682E-01 .781022E-02
+aline .722445E-01 .878649E-02
+aline .751733E-01 .146442E-01
+aline .761496E-01 .156204E-01
+aline .781022E-01 .195255E-01
+aline .790785E-01 .205018E-01
+bezier .093965 .142173E-01 .110559 .133497E-01 .123987 .234307E-01
+bezier .149339 .461644E-01 .155719 .859193E-01 .139608 .115201
+aline .137655 .117153
+aline .136679 .119106
+aline .130821 .124963
+aline .128869 .12594
+aline .127892 .126916
+aline .120082 .130821
+aline .112272 .132774
+aline .111296 .13375
+aline .104462 .13375
+aline .105438 .137655
+aline .108367 .152299
+aline .109343 .154252
+bezier .137732 .153497 .16939 .178123 .164991 .208923
+bezier .157733 .226569 .135552 .22895 .120082 .221615
+bezier .939676E-01 .211865 .962669E-01 .179805 .898175E-01 .157181
+bezier .781623E-01 .104543 .679511E-01 .514079E-01 .556478E-01 -.976277E-03
+aline .302646E-01 -.976277E-03
+bezier .446052E-01 .670481E-01 .580784E-01 .135452 .741971E-01 .203066
+bezier .866508E-01 .232242 .119493 .248993 .150347 .246022
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=26 !-------------- Beginning of new char.
+dfont wid=.722224 hei=.444445 dep=0 italic=.0677776
+set path ! start of curve
+newpath
+! start of curve
+amove .124963 .160109
+bezier .140375 .158436 .155217 .147737 .161086 .132774
+bezier .182225 .154246 .217726 .169966 .246022 .153276
+bezier .267793 .137626 .26667 .106187 .261642 .839598E-01
+aline .261642 .790785E-01
+aline .260666 .761496E-01
+aline .158157 .761496E-01
+bezier .150406 .536707E-01 .16167 .206415E-01 .188421 .165967E-01
+bezier .208885 .128426E-01 .231032 .228641E-01 .247974 .035146
+aline .247974 .322171E-01
+aline .246998 .312409E-01
+aline .246998 .234307E-01
+aline .246022 .224544E-01
+aline .246022 .156204E-01
+bezier .228536 -.192173E-02 .200206 -.733598E-02 .176706 -.390511E-02
+bezier .1614 -.647245E-03 .147988 .887429E-02 .139119 .021234
+bezier .115103 -.180916E-02 .08012 -.537814E-02 .488139E-01 -.488139E-02
+bezier .232326E-01 -.398551E-03 .188483E-01 .344416E-01 .322171E-01 .052719
+bezier .524255E-01 .770245E-01 .871198E-01 .816605E-01 .115201 .849361E-01
+aline .131797 .849361E-01
+bezier .137018 .10219 .142323 .121506 .127892 .135703
+bezier .112476 .144989 .953217E-01 .138311 .790785E-01 .13375
+aline .771259E-01 .132774
+aline .741971E-01 .131797
+aline .644343E-01 .126916
+aline .063458 .12594
+aline .595529E-01 .123987
+aline .585766E-01 .123011
+aline .566241E-01 .122035
+aline .566241E-01 .12594
+aline .576004E-01 .126916
+aline .576004E-01 .13375
+aline .585766E-01 .134726
+aline .585766E-01 .14156
+aline .595529E-01 .144489
+bezier .794292E-01 .156935 .102209 .161029 .124963 .160109
+closepath
+! end of curve
+
+! start of curve
+amove .2099 .138631
+bezier .187956 .134206 .169737 .113891 .164015 .946989E-01
+aline .244069 .946989E-01
+aline .245046 .956752E-01
+aline .245046 .111296
+aline .244069 .112272
+aline .243093 .117153
+aline .242117 .121058
+aline .238212 .128869
+aline .232354 .134726
+aline .228449 .136679
+aline .222591 .138631
+aline .221615 .139608
+aline .210876 .139608
+closepath
+! end of curve
+
+! start of curve
+amove .111296 .654106E-01
+aline .103485 .654106E-01
+bezier .867769E-01 .609541E-01 .617886E-01 .600598E-01 .517427E-01 .419799E-01
+bezier .465821E-01 .293669E-01 .577073E-01 .174545E-01 .070292 .165967E-01
+bezier .867676E-01 .135685E-01 .105601 .182707E-01 .119106 .292883E-01
+bezier .126275 .407593E-01 .128118 .053444 .127892 .663868E-01
+aline .112272 .663868E-01
+aline .111296 .654106E-01
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=27 !-------------- Beginning of new char.
+dfont wid=.777781 hei=.444445 dep=0 italic=.0677776
+set path ! start of curve
+newpath
+! start of curve
+amove .126916 .160109
+bezier .14701 .158076 .165921 .144027 .173777 .124963
+bezier .194372 .151114 .233844 .171437 .265547 .153276
+bezier .287318 .137626 .286195 .106188 .281168 .839598E-01
+aline .281168 .790785E-01
+aline .280192 .761496E-01
+aline .177682 .761496E-01
+bezier .169933 .536693E-01 .181195 .206411E-01 .207947 .165967E-01
+bezier .22841 .128424E-01 .250558 .228648E-01 .2675 .035146
+aline .2675 .322171E-01
+aline .266524 .312409E-01
+aline .266524 .234307E-01
+aline .265547 .224544E-01
+aline .265547 .156204E-01
+bezier .248061 -.192195E-02 .219732 -.733573E-02 .196232 -.390511E-02
+bezier .177411 -.837E-04 .161984 .133796E-01 .153764 .300205E-01
+bezier .129305 .791421E-03 .824833E-01 -.186567E-01 .488139E-01 .683394E-02
+bezier .013675 .369261E-01 .237602E-01 .918935E-01 .507664E-01 .123987
+bezier .697167E-01 .146176 .971287E-01 .162945 .126916 .160109
+closepath
+! end of curve
+
+! start of curve
+amove .108367 .138631
+bezier .666372E-01 .132853 .457181E-01 .828216E-01 .052719 .468613E-01
+bezier .550311E-01 .316256E-01 .663987E-01 .018641 .820073E-01 .165967E-01
+bezier .108387 .118923E-01 .134341 .333568E-01 .143513 .576004E-01
+bezier .153826 .812493E-01 .159636 .110184 .140584 .130821
+aline .138631 .131797
+aline .137655 .132774
+aline .135703 .13375
+aline .134726 .134726
+aline .132774 .135703
+aline .126916 .137655
+aline .122035 .138631
+aline .121058 .139608
+aline .109343 .139608
+closepath
+! end of curve
+
+! start of curve
+amove .229425 .138631
+bezier .207481 .134204 .189264 .113893 .18354 .946989E-01
+aline .263595 .946989E-01
+aline .264571 .956752E-01
+aline .264571 .111296
+aline .263595 .112272
+aline .262619 .117153
+aline .261642 .121058
+aline .257737 .128869
+aline .25188 .134726
+aline .247974 .136679
+aline .242117 .138631
+aline .24114 .139608
+aline .230401 .139608
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=28 !-------------- Beginning of new char.
+dfont wid=.500002 hei=.541667 dep=.0972233 italic=.0484667
+set path ! start of curve
+newpath
+! start of curve
+amove .184516 .193303
+bezier .189134 .189533 .196068 .187349 .199161 .182564
+bezier .188133 .168999 .177354 .155257 .167187 .141072
+bezier .20087 .098222 .175631 .334165E-01 .131797 .781022E-02
+bezier .109758 -.533379E-02 .832513E-01 -.934948E-02 .595529E-01 .650856E-03
+bezier .469965E-01 -.109461E-01 .380613E-01 -.270722E-01 .263595E-01 -.400274E-01
+bezier .021108 -.372592E-01 .141852E-01 -.339385E-01 .010739 -.292883E-01
+bezier .223436E-01 -.156843E-01 .322917E-01 -.886323E-03 .439325E-01 .126916E-01
+bezier .117273E-01 .047963 .297778E-01 .105213 .624817E-01 .13375
+bezier .849869E-01 .156744 .121595 .168374 .151323 .153601
+bezier .163717 .164832 .172088 .182161 .184516 .193303
+closepath
+! end of curve
+
+! start of curve
+amove .111296 .138631
+bezier .708189E-01 .131964 .504946E-01 .867713E-01 .052719 .497901E-01
+aline .536952E-01 .488139E-01
+aline .546715E-01 .439325E-01
+aline .556478E-01 .400274E-01
+aline .585766E-01 .341697E-01
+aline .595529E-01 .331934E-01
+bezier .849003E-01 .672932E-01 .113072 .10067 .137069 .134922
+aline .134726 .135703
+aline .132774 .136679
+aline .129845 .137655
+aline .124963 .138631
+aline .123987 .139608
+aline .112272 .139608
+closepath
+! end of curve
+
+! start of curve
+amove .14937 .119106
+bezier .124412 .859305E-01 .988342E-01 .532044E-01 .732208E-01 .205018E-01
+bezier .103713 .50439E-02 .140291 .030352 .150347 .605292E-01
+bezier .15673 .797899E-01 .16187 .101544 .150835 .119838
+aline .14937 .119106
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=29 !-------------- Beginning of new char.
+dfont wid=.861115 hei=.694445 dep=0 italic=.119829
+set path ! start of curve
+newpath
+! start of curve
+amove .334863 .242117
+aline .334863 .240164
+aline .333887 .235283
+aline .332911 .231378
+aline .330958 .221615
+aline .329982 .220639
+aline .226496 .220639
+bezier .220429 .192514 .213302 .163498 .208923 .135703
+aline .302646 .135703
+aline .302646 .134726
+aline .300693 .124963
+aline .299717 .121058
+aline .298741 .116177
+aline .297765 .115201
+aline .204042 .115201
+bezier .197356 .846126E-01 .18995 .518652E-01 .184516 .224544E-01
+aline .230401 .224544E-01
+aline .231378 .234307E-01
+aline .292883 .234307E-01
+aline .292883 .195255E-01
+aline .291907 .146442E-01
+aline .290931 .010739
+aline .288978 .976277E-03
+aline .288002 -.976277E-03
+aline .148394 -.976277E-03
+bezier .152847 .250399E-01 .160357 .516002E-01 .164015 .771259E-01
+aline .859124E-01 .771259E-01
+bezier .682709E-01 .518448E-01 .535747E-01 .244411E-01 .361223E-01 -.976277E-03
+aline .010739 -.976277E-03
+bezier .613145E-01 .079958 .111766 .160982 .162062 .242117
+aline .334863 .242117
+closepath
+! end of curve
+
+! start of curve
+amove .173777 .219662
+bezier .148763 .178614 .122932 .138155 .978718E-01 .971396E-01
+aline .098604 .956752E-01
+aline .16792 .956752E-01
+bezier .178307 .135765 .185308 .177563 .194889 .218198
+aline .194279 .220639
+aline .174754 .220639
+aline .173777 .219662
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=30 !-------------- Beginning of new char.
+dfont wid=.972226 hei=.694445 dep=0 italic=.119829
+set path ! start of curve
+newpath
+! start of curve
+amove .188421 .249927
+aline .189398 .248951
+aline .195255 .248951
+aline .205018 .246998
+aline .212828 .245046
+aline .213805 .244069
+aline .218686 .244069
+aline .219662 .243093
+aline .224544 .243093
+aline .22552 .242117
+aline .373914 .242117
+aline .373914 .240164
+aline .372938 .235283
+aline .371962 .231378
+aline .370009 .221615
+aline .369033 .220639
+aline .244069 .220639
+bezier .238002 .192514 .230875 .163498 .226496 .135703
+aline .341697 .135703
+aline .341697 .134726
+aline .339744 .124963
+aline .338768 .121058
+aline .337792 .116177
+aline .336816 .115201
+aline .221615 .115201
+bezier .214929 .846126E-01 .207523 .518652E-01 .202089 .224544E-01
+aline .25969 .224544E-01
+aline .260666 .234307E-01
+aline .331934 .234307E-01
+aline .331934 .195255E-01
+aline .330958 .146442E-01
+aline .329982 .010739
+aline .328029 .976277E-03
+aline .327053 -.976277E-03
+aline .173777 -.976277E-03
+bezier .146757 -.697659E-02 .116653 -.143321E-01 .888412E-01 -.195255E-02
+bezier .490671E-01 .139936E-01 .282056E-01 .606878E-01 .341697E-01 .100557
+bezier .384292E-01 .168773 .910705E-01 .232054 .158157 .247974
+aline .163038 .247974
+aline .164015 .248951
+aline .169872 .248951
+aline .170849 .249927
+aline .188421 .249927
+closepath
+! end of curve
+
+! start of curve
+amove .166943 .228449
+bezier .953953E-01 .217052 .502121E-01 .132931 .673631E-01 .663868E-01
+bezier .733055E-01 .390381E-01 .955867E-01 .155058E-01 .123011 .117153E-01
+bezier .138879 .110263E-01 .156888 .123379E-01 .166943 .263595E-01
+bezier .184236 .06097 .186437 .100626 .196232 .137655
+bezier .199924 .163344 .210686 .187913 .206971 .212828
+aline .205994 .216734
+aline .204042 .220639
+aline .200137 .224544
+aline .198184 .22552
+aline .192327 .227473
+aline .19135 .228449
+aline .186469 .228449
+aline .185493 .229425
+aline .16792 .229425
+aline .166943 .228449
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=31 !-------------- Beginning of new char.
+dfont wid=.777781 hei=.743055 dep=.0486116 italic=.0755463
+set path ! start of curve
+newpath
+! start of curve
+amove .266524 .264571
+bezier .27104 .26066 .277718 .258119 .281168 .253832
+bezier .272867 .243759 .264639 .233633 .257005 .223079
+bezier .276005 .20082 .285927 .169652 .282144 .14156
+bezier .278975 .710767E-01 .223364 .543736E-02 .153276 -.781022E-02
+bezier .130343 -.104073E-01 .104598 -.872761E-02 .849361E-01 .585766E-02
+bezier .774488E-01 -.446325E-02 .689429E-01 -.140501E-01 .615055E-01 -.244069E-01
+bezier .559203E-01 -.209007E-01 .505491E-01 -.170977E-01 .449088E-01 -.136679E-01
+bezier .523657E-01 -.26611E-02 .617731E-01 .694007E-02 .690716E-01 .180611E-01
+bezier .238452E-01 .698035E-01 .422839E-01 .150019 .859124E-01 .197208
+bezier .121913 .240864 .190011 .268714 .24114 .235283
+bezier .249007 .245005 .256266 .255165 .264571 .264571
+aline .266524 .264571
+aline .2675 .263595
+closepath
+! end of curve
+
+! start of curve
+amove .176706 .228449
+bezier .121751 .221039 .843349E-01 .168546 .751733E-01 .116177
+bezier .691468E-01 .912448E-01 .713081E-01 .621302E-01 .859124E-01 .390511E-01
+bezier .132536 .097996 .17976 .156502 .225276 .216245
+bezier .211834 .226847 .193139 .231788 .176706 .228449
+closepath
+! end of curve
+
+! start of curve
+amove .238212 .200137
+bezier .19296 .141325 .145713 .839522E-01 .100801 .248951E-01
+bezier .132966 -.664679E-03 .178811 .147137E-01 .206971 .400274E-01
+bezier .241034 .729608E-01 .257839 .123168 .252856 .168896
+bezier .249052 .179339 .247513 .192278 .239676 .200869
+aline .238212 .200137
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=32 !-------------- Beginning of new char.
+dfont wid=.23889 hei=.444445 dep=0 italic=0
+dfont fby="L" kadd=-.258336
+dfont fby="l" kadd=-.23889
+set path ! start of curve
+newpath
+! start of curve
+amove .109343 .137655
+aline .110319 .134726
+aline .110319 .127892
+aline .111296 .126916
+aline .111296 .119106
+bezier .829018E-01 .109769 .540635E-01 .101074 .253832E-01 .927463E-01
+aline .244069E-01 .937226E-01
+aline .244069E-01 .100557
+aline .234307E-01 .101533
+aline .234307E-01 .109343
+aline .224544E-01 .110319
+bezier .492202E-01 .120838 .799791E-01 .128517 .108367 .137655
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=33 !-------------- Beginning of new char.
+dfont wid=.319446 hei=.694445 dep=0 italic=.0573292
+set path ! start of curve
+newpath
+! start of curve
+amove .123011 .242117
+bezier .110134 .181832 .957021E-01 .121687 .820073E-01 .615055E-01
+aline .595529E-01 .615055E-01
+aline .595529E-01 .654106E-01
+aline .693157E-01 .114224
+aline .070292 .115201
+aline .070292 .120082
+aline .800547E-01 .168896
+aline .081031 .169872
+aline .081031 .174754
+aline .898175E-01 .218686
+aline .907938E-01 .219662
+aline .907938E-01 .224544
+aline .937226E-01 .239188
+aline .946989E-01 .242117
+aline .123011 .242117
+closepath
+! end of curve
+
+! start of curve
+amove .771259E-01 .273358E-01
+aline .771259E-01 .244069E-01
+aline .751733E-01 .146442E-01
+aline .741971E-01 .010739
+aline .722445E-01 .976277E-03
+aline .712682E-01 -.976277E-03
+aline .429562E-01 -.976277E-03
+aline .429562E-01 0
+aline .449088E-01 .976277E-02
+aline .045885 .136679E-01
+aline .478376E-01 .234307E-01
+aline .488139E-01 .273358E-01
+aline .771259E-01 .273358E-01
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=34 !-------------- Beginning of new char.
+dfont wid=.500002 hei=.694445 dep=0 italic=.00316143
+set path ! start of curve
+newpath
+! start of curve
+amove .927463E-01 .242117
+aline .927463E-01 .240164
+aline .917701E-01 .235283
+aline .907938E-01 .231378
+bezier .883535E-01 .20809 .722255E-01 .190204 .624817E-01 .169872
+aline .488139E-01 .169872
+bezier .539157E-01 .184114 .613045E-01 .197742 .670377E-01 .211852
+aline .663868E-01 .213805
+aline .585766E-01 .213805
+aline .585766E-01 .215757
+aline .615055E-01 .230401
+aline .624817E-01 .234307
+aline .063458 .239188
+aline .644343E-01 .242117
+aline .927463E-01 .242117
+closepath
+! end of curve
+
+! start of curve
+amove .161086 .242117
+aline .161086 .240164
+aline .160109 .235283
+aline .159133 .231378
+bezier .156693 .20809 .140565 .190204 .130821 .169872
+aline .117153 .169872
+bezier .122256 .184113 .129643 .197743 .135377 .211852
+aline .134726 .213805
+aline .126916 .213805
+aline .126916 .215757
+aline .129845 .230401
+aline .130821 .234307
+aline .131797 .239188
+aline .132774 .242117
+aline .161086 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=35 !-------------- Beginning of new char.
+dfont wid=.833336 hei=.694445 dep=.194443 italic=.0508671
+set path ! start of curve
+newpath
+! start of curve
+amove .199161 .242117
+aline .201113 .24114
+aline .202089 .240164
+aline .204042 .236259
+bezier .189647 .200383 .170507 .165799 .154496 .130333
+aline .155228 .128869
+aline .218686 .128869
+aline .22552 .142536
+aline .226496 .145465
+aline .236259 .164991
+aline .237235 .16792
+aline .247974 .189398
+aline .248951 .192327
+aline .25969 .213805
+aline .260666 .216734
+aline .271405 .238212
+aline .274334 .24114
+aline .276286 .242117
+aline .280192 .242117
+aline .282144 .24114
+aline .28312 .240164
+aline .285073 .236259
+bezier .270678 .200383 .251538 .165799 .235527 .130333
+aline .236259 .128869
+aline .294836 .128869
+aline .296788 .127892
+aline .298741 .12594
+aline .299717 .123987
+aline .299717 .120082
+aline .298741 .11813
+aline .296788 .116177
+aline .294836 .115201
+aline .227473 .115201
+bezier .218336 .968327E-01 .210507 .776315E-01 .201113 .595529E-01
+aline .202089 .585766E-01
+aline .280192 .585766E-01
+aline .282144 .576004E-01
+aline .28312 .566241E-01
+aline .285073 .052719
+aline .285073 .507664E-01
+aline .28312 .468613E-01
+aline .282144 .045885
+aline .280192 .449088E-01
+aline .194279 .449088E-01
+bezier .174645 .790063E-02 .15884 -.317523E-01 .138631 -.683394E-01
+aline .136679 -.693157E-01
+aline .132774 -.693157E-01
+aline .130821 -.683394E-01
+aline .127892 -.654106E-01
+aline .127892 -.595529E-01
+bezier .144488 -.250938E-01 .160513 .989383E-02 .177682 .439325E-01
+aline .176706 .449088E-01
+aline .113248 .449088E-01
+bezier .936146E-01 .790033E-02 .778082E-01 -.317519E-01 .576004E-01 -.683394E-01
+aline .556478E-01 -.693157E-01
+aline .517427E-01 -.693157E-01
+aline .497901E-01 -.683394E-01
+aline .468613E-01 -.654106E-01
+aline .468613E-01 -.595529E-01
+bezier .063457 -.250938E-01 .794819E-01 .989432E-02 .966514E-01 .439325E-01
+aline .956752E-01 .449088E-01
+aline .370985E-01 .449088E-01
+aline .035146 .045885
+aline .322171E-01 .488139E-01
+aline .322171E-01 .546715E-01
+aline .035146 .576004E-01
+aline .370985E-01 .585766E-01
+aline .103485 .585766E-01
+bezier .11309 .763707E-01 .120884 .953906E-01 .129601 .113736
+aline .128869 .115201
+aline .517427E-01 .115201
+aline .497901E-01 .116177
+aline .468613E-01 .119106
+aline .468613E-01 .124963
+aline .497901E-01 .127892
+aline .517427E-01 .128869
+aline .137655 .128869
+aline .144489 .142536
+aline .145465 .145465
+aline .155228 .164991
+aline .156204 .16792
+aline .166943 .189398
+aline .16792 .192327
+aline .178659 .213805
+aline .179635 .216734
+aline .190374 .238212
+aline .193303 .24114
+aline .195255 .242117
+closepath
+! end of curve
+
+! start of curve
+amove .145465 .113248
+bezier .136776 .954802E-01 .129129 .769896E-01 .120082 .595529E-01
+aline .121058 .585766E-01
+aline .184516 .585766E-01
+bezier .194121 .763707E-01 .201915 .953906E-01 .210632 .113736
+aline .2099 .115201
+aline .146442 .115201
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=36 !-------------- Beginning of new char.
+dfont wid=.500002 hei=.75 dep=.0555553 italic=.111563
+set path ! start of curve
+newpath
+! start of curve
+amove .154252 .261642
+aline .154252 .258713
+aline .152299 .248951
+aline .151567 .247486
+aline .152299 .246022
+bezier .169018 .244793 .186314 .237754 .199161 .226496
+aline .198184 .224544
+aline .196232 .218686
+aline .195255 .216734
+aline .194279 .213805
+aline .193303 .211852
+aline .192327 .208923
+aline .19135 .206971
+aline .190374 .204042
+bezier .17916 .215815 .162487 .222039 .147418 .224544
+bezier .141104 .196023 .133783 .167148 .129691 .138426
+bezier .157531 .133728 .176987 .103558 .171825 .771259E-01
+bezier .169946 .374541E-01 .136566 .339814E-02 .984265E-01 -.461515E-02
+aline .976277E-01 -.781022E-02
+aline .966514E-01 -.126916E-01
+aline .946989E-01 -.205018E-01
+aline .751733E-01 -.205018E-01
+aline .751733E-01 -.017573
+aline .761496E-01 -.136679E-01
+aline .771259E-01 -.878649E-02
+aline .777768E-01 -.683394E-02
+aline .771259E-01 -.488139E-02
+bezier .578485E-01 -.23482E-02 .357727E-01 .428697E-02 .214781E-01 .195255E-01
+aline .214781E-01 .214781E-01
+aline .224544E-01 .234307E-01
+aline .244069E-01 .292883E-01
+aline .253832E-01 .312409E-01
+aline .263595E-01 .341697E-01
+aline .273358E-01 .361223E-01
+aline .028312 .390511E-01
+aline .292883E-01 .410036E-01
+aline .302646E-01 .419799E-01
+bezier .436737E-01 .280709E-01 .630417E-01 .191288E-01 .820073E-01 .017573
+bezier .906922E-01 .479614E-01 .946405E-01 .809429E-01 .103485 .111296
+bezier .811359E-01 .115988 .608614E-01 .132761 .576004E-01 .156204
+bezier .526802E-01 .199634 .890943E-01 .239067 .1311 .245882
+aline .131797 .247974
+aline .13375 .257737
+aline .134726 .261642
+aline .154252 .261642
+closepath
+! end of curve
+
+! start of curve
+amove .123987 .222591
+bezier .929259E-01 .216467 .683633E-01 .174464 .946989E-01 .150347
+aline .966514E-01 .14937
+aline .976277E-01 .148394
+aline .101533 .146442
+aline .10739 .144489
+aline .108855 .143757
+bezier .115813 .169272 .12062 .197097 .126265 .222917
+aline .125452 .223323
+closepath
+! end of curve
+
+! start of curve
+amove .121058 .102509
+bezier .115859 .747354E-01 .108003 .470275E-01 .104322 .192466E-01
+bezier .138085 .258869E-01 .162071 .757401E-01 .13375 .101533
+aline .129845 .103485
+aline .128869 .104462
+aline .12594 .105438
+aline .122523 .107146
+aline .121926 .106848
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=37 !-------------- Beginning of new char.
+dfont wid=.833336 hei=.75 dep=.0555553 italic=.0312634
+set path ! start of curve
+newpath
+! start of curve
+amove .129845 .261642
+bezier .148034 .25877 .157923 .239712 .160109 .223567
+bezier .163679 .183391 .144411 .136569 .104462 .122035
+bezier .809639E-01 .11486 .614622E-01 .137288 .595529E-01 .159133
+bezier .055792 .199543 .756299E-01 .245711 .115201 .260666
+aline .120082 .261642
+closepath
+! end of curve
+
+! start of curve
+amove .282144 .261642
+aline .284097 .260666
+bezier .292895 .252253 .278743 .244544 .27531 .237235
+bezier .206403 .152058 .139637 .653358E-01 .070292 -.195255E-01
+aline .683394E-01 -.205018E-01
+aline .644343E-01 -.205018E-01
+aline .624817E-01 -.195255E-01
+bezier .542996E-01 -.104378E-01 .686401E-01 -.282896E-02 .722445E-01 .488139E-02
+bezier .140712 .898149E-01 .207459 .175991 .276286 .260666
+aline .278239 .261642
+closepath
+! end of curve
+
+! start of curve
+amove .116177 .240164
+bezier .091997 .229828 .895178E-01 .19834 .839598E-01 .176706
+aline .839598E-01 .159133
+aline .849361E-01 .158157
+aline .859124E-01 .154252
+aline .868887E-01 .151323
+aline .888412E-01 .147418
+bezier .994778E-01 .133588 .115991 .147986 .122035 .159133
+bezier .134569 .18302 .144722 .213924 .128869 .238212
+aline .124963 .240164
+aline .123987 .24114
+aline .117153 .24114
+closepath
+! end of curve
+
+! start of curve
+amove .256761 .120082
+bezier .279939 .114798 .289272 .086463 .286049 .663868E-01
+bezier .285233 .304818E-01 .263597 -.108911E-01 .226496 -.205018E-01
+bezier .203744 -.240523E-01 .187684 -.187396E-02 .185493 .185493E-01
+bezier .182087 .586728E-01 .2022 .104925 .242117 .119106
+aline .246022 .120082
+closepath
+! end of curve
+
+! start of curve
+amove .243093 .098604
+bezier .219718 .902485E-01 .217223 .614124E-01 .210876 .410036E-01
+bezier .2094 .271883E-01 .207314 .749427E-02 .222591 0
+bezier .242548 .100066E-03 .251879 .225727E-01 .257737 .390511E-01
+bezier .263232 .577844E-01 .267375 .796438E-01 .254808 .966514E-01
+aline .250903 .098604
+aline .249927 .995803E-01
+aline .244069 .995803E-01
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=38 !-------------- Beginning of new char.
+dfont wid=.758336 hei=.694445 dep=0 italic=.0305786
+set path ! start of curve
+newpath
+! start of curve
+amove .164991 .249927
+bezier .194108 .245577 .200312 .208616 .190374 .185493
+bezier .17545 .156939 .147363 .138172 .123255 .118618
+bezier .132145 .910644E-01 .145485 .064042 .16255 .412477E-01
+bezier .198209 .659734E-01 .22372 .102136 .243093 .140584
+aline .244069 .140584
+aline .247974 .139608
+aline .250903 .138631
+aline .254808 .137655
+aline .263595 .134726
+bezier .242887 .924689E-01 .213347 .547512E-01 .17573 .263595E-01
+bezier .189475 .127387E-01 .21114 .994598E-02 .228449 .146442E-01
+aline .23333 .146442E-01
+aline .234307 .156204E-01
+aline .239188 .165967E-01
+aline .246998 .185493E-01
+aline .249927 .195255E-01
+aline .25188 .195255E-01
+aline .250903 .146442E-01
+aline .249927 .010739
+aline .247974 .976277E-03
+aline .246998 -.292883E-02
+bezier .21744 -.107711E-01 .182086 -.142794E-01 .157181 .781022E-02
+aline .155228 .878649E-02
+aline .152299 .117153E-01
+bezier .122705 -.455876E-02 .870541E-01 -.148742E-01 .546715E-01 -.488139E-02
+bezier .256996E-01 .456508E-02 .168208E-01 .432242E-01 .331934E-01 .673631E-01
+bezier .470393E-01 .918113E-01 .735045E-01 .104383 .946989E-01 .121058
+aline .946989E-01 .127892
+aline .937226E-01 .128869
+bezier .901305E-01 .166274 .965759E-01 .20861 .12594 .236259
+bezier .133905 .24257 .142786 .248486 .153276 .249927
+closepath
+! end of curve
+
+! start of curve
+amove .14937 .228449
+bezier .127451 .222675 .120793 .197095 .11813 .178659
+aline .11813 .165967
+aline .117153 .164991
+aline .117153 .157181
+aline .11813 .156204
+aline .11813 .143513
+aline .119106 .142536
+aline .120082 .139608
+bezier .142568 .158947 .175104 .179668 .170849 .213805
+aline .169872 .214781
+aline .168896 .218686
+aline .16792 .221615
+aline .166943 .222591
+aline .165967 .224544
+aline .164015 .226496
+aline .162062 .227473
+aline .159133 .228449
+aline .158157 .229425
+aline .150347 .229425
+aline .14937 .228449
+closepath
+! end of curve
+
+! start of curve
+amove .956752E-01 .098604
+bezier .787877E-01 .863844E-01 .574112E-01 .074702 .536952E-01 .517427E-01
+bezier .490878E-01 .366354E-01 .579377E-01 .164425E-01 .751733E-01 .136679E-01
+bezier .959748E-01 .102582E-01 .117777 .179926E-01 .137655 .263595E-01
+aline .138631 .273358E-01
+bezier .121115 .489236E-01 .108371 .075156 .990921E-01 .101289
+aline .976277E-01 .100557
+aline .956752E-01 .098604
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=39 !-------------- Beginning of new char.
+dfont wid=.277779 hei=.694445 dep=0 italic=.0781631
+dfont fby=33 kadd=.111112
+dfont fby=39 ligrep=34
+dfont fby="?" kadd=.111112
+set path ! start of curve
+newpath
+! start of curve
+amove .115201 .242117
+aline .115201 .240164
+aline .114224 .235283
+aline .113248 .231378
+bezier .110808 .20809 .09468 .190203 .849361E-01 .169872
+aline .712682E-01 .169872
+bezier .763702E-01 .184114 .837589E-01 .197742 .894921E-01 .211852
+aline .888412E-01 .213805
+aline .081031 .213805
+aline .081031 .215757
+aline .839598E-01 .230401
+aline .849361E-01 .234307
+aline .859124E-01 .239188
+aline .868887E-01 .242117
+aline .115201 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=40 !-------------- Beginning of new char.
+dfont wid=.38889 hei=.75 dep=.25 italic=.131638
+set path ! start of curve
+newpath
+! start of curve
+amove .172801 .261642
+bezier .104103 .207667 .742567E-01 .115028 .663868E-01 .331934E-01
+aline .663868E-01 -.976277E-03
+bezier .069502 -.303635E-01 .783489E-01 -.063665 .098604 -.878649E-01
+aline .781022E-01 -.878649E-01
+bezier .542984E-01 -.637657E-01 .436081E-01 -.279421E-01 .410036E-01 .390511E-02
+aline .410036E-01 .410036E-01
+aline .419799E-01 .419799E-01
+bezier .469369E-01 .123709 .840311E-01 .211553 .152299 .261642
+aline .172801 .261642
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=")" !-------------- Beginning of new char.
+dfont wid=.38889 hei=.75 dep=.25 italic=.0253601
+set path ! start of curve
+newpath
+! start of curve
+amove .966514E-01 .261642
+bezier .128227 .230223 .135601 .183549 .134726 .14156
+aline .13375 .140584
+bezier .130626 .055812 .937083E-01 -.363073E-01 .224544E-01 -.878649E-01
+aline .195255E-02 -.878649E-01
+aline .292883E-02 -.868887E-01
+aline .488139E-02 -.859124E-01
+aline .878649E-02 -.820073E-01
+aline .010739 -.081031
+aline .331934E-01 -.585766E-01
+bezier .787434E-01 -.598554E-02 .100429 .675014E-01 .108367 .13375
+aline .108367 .150347
+aline .109343 .151323
+bezier .109589 .188604 .10237 .227317 .790785E-01 .258713
+aline .761496E-01 .261642
+aline .966514E-01 .261642
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="*" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.75 dep=0 italic=.117749
+set path ! start of curve
+newpath
+! start of curve
+amove .147418 .261642
+aline .14937 .260666
+aline .151323 .25969
+aline .152299 .258713
+aline .153276 .256761
+aline .154252 .253832
+bezier .15146 .236261 .144194 .21895 .141365 .201699
+bezier .15689 .208974 .171586 .220784 .187445 .228449
+aline .193303 .228449
+aline .195255 .227473
+aline .199161 .223567
+aline .200137 .220639
+aline .200137 .21771
+aline .199161 .214781
+aline .197208 .210876
+aline .194279 .207947
+aline .170849 .196232
+aline .16792 .195255
+aline .148394 .185493
+aline .146051 .184712
+bezier .154643 .176332 .16906 .170726 .179635 .163038
+aline .181588 .162062
+aline .185493 .158157
+aline .186469 .154252
+aline .185493 .14937
+aline .184516 .147418
+aline .178659 .14156
+aline .174754 .139608
+aline .16792 .139608
+bezier .156151 .148519 .144908 .15816 .13375 .16792
+bezier .129074 .149588 .128986 .131629 .123987 .113248
+aline .119106 .108367
+aline .117153 .10739
+aline .114224 .106414
+aline .108367 .106414
+aline .104462 .108367
+aline .103485 .109343
+aline .101533 .113248
+bezier .103685 .131168 .111121 .148945 .11455 .166293
+bezier .988175E-01 .159522 .841798E-01 .147295 .683394E-01 .139608
+aline .624817E-01 .139608
+aline .585766E-01 .14156
+aline .576004E-01 .142536
+aline .556478E-01 .146442
+aline .556478E-01 .151323
+aline .566241E-01 .154252
+aline .576004E-01 .156204
+aline .624817E-01 .161086
+aline .683394E-01 .164015
+aline .712682E-01 .164991
+aline .907938E-01 .174754
+aline .937226E-01 .17573
+aline .109343 .18354
+aline .110319 .184516
+bezier .971327E-01 .192092 .841237E-01 .199912 .712682E-01 .207947
+bezier .625508E-01 .22079 .848371E-01 .236946 .937226E-01 .223567
+bezier .103439 .216145 .112691 .208076 .122035 .200137
+bezier .12645 .217981 .126373 .236809 .131797 .254808
+aline .136679 .25969
+aline .138631 .260666
+aline .14156 .261642
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="+" !-------------- Beginning of new char.
+dfont wid=.777781 hei=.583334 dep=.083334 italic=.0253601
+set path ! start of curve
+newpath
+! start of curve
+amove .181588 .203066
+aline .18354 .202089
+aline .186469 .199161
+bezier .182288 .163843 .17101 .128377 .165967 .937226E-01
+aline .2675 .937226E-01
+aline .269453 .927463E-01
+aline .272381 .898175E-01
+aline .272381 .839598E-01
+aline .269453 .081031
+aline .2675 .800547E-01
+aline .163038 .800547E-01
+bezier .153907 .04534 .148365 .949831E-02 .139608 -.253832E-01
+aline .136679 -.028312
+aline .134726 -.292883E-01
+aline .130821 -.292883E-01
+aline .128869 -.028312
+aline .127892 -.273358E-01
+aline .12594 -.234307E-01
+bezier .131687 .111226E-01 .141934 .455992E-01 .146442 .800547E-01
+aline .439325E-01 .800547E-01
+aline .419799E-01 .081031
+aline .400274E-01 .829836E-01
+aline .390511E-01 .849361E-01
+aline .390511E-01 .888412E-01
+aline .400274E-01 .907938E-01
+aline .419799E-01 .927463E-01
+aline .439325E-01 .937226E-01
+aline .150347 .937226E-01
+bezier .158596 .129074 .164639 .165093 .173777 .200137
+aline .17573 .202089
+aline .177682 .203066
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="," !-------------- Beginning of new char.
+dfont wid=.277779 hei=.083333 dep=.125 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .693157E-01 .273358E-01
+bezier .06848 -.484868E-04 .516183E-01 -.219821E-01 .390511E-01 -.449088E-01
+aline .253832E-01 -.449088E-01
+bezier .030695 -.303861E-01 .400659E-01 -.145176E-01 .439325E-01 -.976277E-03
+aline .035146 -.976277E-03
+aline .035146 0
+aline .370985E-01 .976277E-02
+aline .380748E-01 .136679E-01
+aline .400274E-01 .234307E-01
+aline .410036E-01 .273358E-01
+aline .693157E-01 .273358E-01
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="-" !-------------- Beginning of new char.
+dfont wid=.333334 hei=.444445 dep=0 italic=.0194569
+set path ! start of curve
+newpath
+! start of curve
+amove .116177 .868887E-01
+aline .116177 .839598E-01
+aline .115201 .790785E-01
+aline .114224 .751733E-01
+aline .113248 .070292
+aline .112272 .673631E-01
+aline .195255E-01 .673631E-01
+aline .195255E-01 .693157E-01
+aline .205018E-01 .741971E-01
+aline .214781E-01 .781022E-01
+aline .224544E-01 .829836E-01
+aline .234307E-01 .868887E-01
+aline .116177 .868887E-01
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="." !-------------- Beginning of new char.
+dfont wid=.277779 hei=.083333 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .693157E-01 .273358E-01
+aline .693157E-01 .244069E-01
+aline .673631E-01 .146442E-01
+aline .663868E-01 .010739
+aline .644343E-01 .976277E-03
+aline .063458 -.976277E-03
+aline .035146 -.976277E-03
+aline .035146 0
+aline .370985E-01 .976277E-02
+aline .380748E-01 .136679E-01
+aline .400274E-01 .234307E-01
+aline .410036E-01 .273358E-01
+aline .693157E-01 .273358E-01
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="/" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.75 dep=.25 italic=.131638
+set path ! start of curve
+newpath
+! start of curve
+amove .205994 .261642
+aline .207947 .260666
+aline .2099 .258713
+aline .210876 .256761
+bezier .209185 .244516 .199043 .234978 .194279 .223567
+bezier .133517 .120157 .759091E-01 .144769E-01 .136679E-01 -.878649E-01
+aline .117153E-01 -.888412E-01
+aline .781022E-02 -.888412E-01
+aline .585766E-02 -.878649E-01
+aline .488139E-02 -.868887E-01
+aline .292883E-02 -.829836E-01
+bezier .293649E-01 -.030591 .616337E-01 .01943 .898175E-01 .712682E-01
+bezier .12727 .133913 .161641 .198775 .200137 .260666
+aline .202089 .261642
+aline .205994 .261642
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="0" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.655556 dep=0 italic=.111563
+set path ! start of curve
+newpath
+! start of curve
+amove .146442 .236259
+bezier .17269 .233854 .192045 .209336 .19135 .18354
+aline .192327 .182564
+aline .192327 .152299
+bezier .184595 .100867 .17414 .357886E-01 .126916 .292883E-02
+bezier .101052 -.141972E-01 .059389 -.147012E-01 .419799E-01 .146442E-01
+aline .390511E-01 .205018E-01
+aline .380748E-01 .234307E-01
+aline .370985E-01 .253832E-01
+aline .341697E-01 .370985E-01
+aline .341697E-01 .429562E-01
+aline .331934E-01 .439325E-01
+aline .331934E-01 .751733E-01
+bezier .412642E-01 .127694 .521536E-01 .192891 .100557 .22552
+aline .110319 .230401
+aline .113248 .231378
+aline .115201 .232354
+aline .121058 .234307
+aline .12594 .235283
+aline .130821 .235283
+aline .131797 .236259
+closepath
+! end of curve
+
+! start of curve
+amove .127892 .214781
+bezier .896119E-01 .206589 .779363E-01 .163276 .070292 .129845
+bezier .641905E-01 .944265E-01 .498162E-01 .592569E-01 .663868E-01 .253832E-01
+bezier .750277E-01 .115608E-01 .935127E-01 .822341E-02 .10739 .156204E-01
+bezier .141717 .332669E-01 .149625 .757111E-01 .158157 .110319
+bezier .163845 .140974 .175108 .171237 .161086 .201113
+aline .160109 .202089
+aline .159133 .204042
+aline .154252 .208923
+aline .152299 .2099
+aline .151323 .210876
+aline .147418 .212828
+aline .144489 .213805
+aline .140584 .214781
+aline .139608 .215757
+aline .128869 .215757
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="1" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.655556 dep=0 italic=.111563
+set path ! start of curve
+newpath
+! start of curve
+amove .157181 .236259
+bezier .142923 .163665 .124748 .911452E-01 .112272 .185493E-01
+aline .154252 .185493E-01
+aline .154252 .146442E-01
+aline .153276 .010739
+aline .151323 .976277E-03
+aline .150347 -.976277E-03
+aline .035146 -.976277E-03
+aline .035146 0
+aline .370985E-01 .976277E-02
+aline .380748E-01 .136679E-01
+aline .390511E-01 .185493E-01
+aline .829836E-01 .185493E-01
+bezier .952809E-01 .797139E-01 .110246 .141112 .121058 .202089
+aline .120082 .201113
+aline .111296 .198184
+aline .103485 .196232
+aline .098604 .195255
+aline .927463E-01 .195255
+aline .917701E-01 .194279
+aline .800547E-01 .194279
+aline .790785E-01 .193303
+aline .741971E-01 .193303
+aline .751733E-01 .198184
+aline .761496E-01 .202089
+aline .781022E-01 .211852
+aline .790785E-01 .212828
+bezier .103429 .213711 .130569 .219435 .150347 .236259
+aline .157181 .236259
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="2" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.655556 dep=0 italic=.111563
+set path ! start of curve
+newpath
+! start of curve
+amove .142536 .236259
+bezier .167616 .234818 .191676 .214606 .194279 .188421
+bezier .196442 .165498 .190127 .142359 .174754 .124963
+bezier .142059 .901423E-01 .100695 .673513E-01 .654106E-01 .361223E-01
+aline .063458 .035146
+aline .615055E-01 .331934E-01
+aline .595529E-01 .322171E-01
+aline .566241E-01 .292883E-01
+aline .546715E-01 .028312
+aline .517427E-01 .253832E-01
+aline .497901E-01 .244069E-01
+aline .488139E-01 .234307E-01
+aline .497901E-01 .224544E-01
+aline .163038 .224544E-01
+aline .163038 .195255E-01
+aline .162062 .146442E-01
+aline .161086 .010739
+aline .159133 .976277E-03
+aline .158157 -.976277E-03
+aline .185493E-01 -.976277E-03
+aline .185493E-01 0
+aline .205018E-01 .976277E-02
+bezier .206753E-01 .235976E-01 .348178E-01 .284058E-01 .429562E-01 .370985E-01
+bezier .766431E-01 .663541E-01 .114588 .904596E-01 .145465 .123011
+bezier .162634 .144196 .174661 .175304 .158157 .200137
+bezier .135673 .22638 .924162E-01 .214312 .781022E-01 .185493
+aline .771259E-01 .184516
+aline .741971E-01 .178659
+aline .732208E-01 .177682
+aline .663868E-01 .164015
+aline .654106E-01 .161086
+aline .644343E-01 .160109
+aline .063458 .162062
+aline .624817E-01 .163038
+aline .595529E-01 .168896
+aline .585766E-01 .169872
+aline .556478E-01 .17573
+aline .546715E-01 .176706
+aline .536952E-01 .178659
+bezier .067307 .206861 .926623E-01 .233036 .124963 .236259
+aline .142536 .236259
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="3" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.655556 dep=0 italic=.111563
+set path ! start of curve
+newpath
+! start of curve
+amove .146442 .236259
+bezier .166274 .234386 .187297 .221262 .19135 .200137
+bezier .194544 .166077 .168152 .137055 .139608 .123011
+bezier .162071 .114341 .179718 .917143E-01 .17573 .663868E-01
+bezier .166536 .753291E-02 .909235E-01 -.310665E-01 .410036E-01 .488139E-02
+bezier .329371E-01 .108384E-01 .263804E-01 .186855E-01 .214781E-01 .273358E-01
+aline .224544E-01 .302646E-01
+aline .234307E-01 .322171E-01
+aline .244069E-01 .035146
+aline .263595E-01 .390511E-01
+aline .273358E-01 .419799E-01
+aline .028312 .439325E-01
+aline .292883E-01 .468613E-01
+aline .302646E-01 .478376E-01
+bezier .466263E-01 .100376E-01 .10559 -.263736E-02 .130821 .331934E-01
+bezier .146282 .536974E-01 .15401 .877863E-01 .131797 .106414
+aline .12594 .109343
+aline .123011 .110319
+aline .11813 .111296
+aline .117153 .112272
+aline .839598E-01 .112272
+aline .839598E-01 .115201
+aline .849361E-01 .120082
+aline .859124E-01 .123987
+aline .868887E-01 .128869
+aline .878649E-01 .132774
+bezier .10562 .133696 .124479 .134513 .139608 .146442
+bezier .153669 .158432 .163561 .17594 .164015 .194279
+aline .163038 .195255
+bezier .161215 .212563 .14017 .21984 .12594 .215757
+bezier .103631 .213127 .834508E-01 .198294 .712682E-01 .179635
+aline .070292 .181588
+aline .693157E-01 .184516
+aline .624817E-01 .198184
+bezier .831738E-01 .222622 .114118 .239184 .146442 .236259
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="4" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.655556 dep=0 italic=.111563
+set path ! start of curve
+newpath
+! start of curve
+amove .179635 .228449
+bezier .170756 .178574 .157222 .128808 .14937 .790785E-01
+aline .18354 .790785E-01
+aline .182564 .751733E-01
+aline .180611 .654106E-01
+aline .179635 .615055E-01
+aline .178659 .585766E-01
+aline .144489 .585766E-01
+aline .143513 .566241E-01
+aline .14156 .468613E-01
+aline .140584 .429562E-01
+aline .138631 .331934E-01
+aline .137655 .292883E-01
+aline .134726 .146442E-01
+aline .13375 .010739
+aline .131797 .976277E-03
+aline .130821 -.976277E-03
+aline .103485 -.976277E-03
+bezier .106618 .188631E-01 .112828 .039235 .115201 .585766E-01
+aline .234307E-01 .585766E-01
+aline .234307E-01 .605292E-01
+aline .244069E-01 .644343E-01
+bezier .247252E-01 .778714E-01 .336276E-01 .087368 .419799E-01 .966514E-01
+bezier .771239E-01 .14082 .112658 .184708 .148394 .228449
+aline .179635 .228449
+closepath
+! end of curve
+
+! start of curve
+amove .14937 .213805
+bezier .131189 .171446 .099217 .137966 .722445E-01 .101533
+aline .693157E-01 .098604
+aline .683394E-01 .966514E-01
+aline .654106E-01 .937226E-01
+aline .644343E-01 .917701E-01
+aline .615055E-01 .888412E-01
+aline .605292E-01 .868887E-01
+aline .576004E-01 .839598E-01
+aline .566241E-01 .820073E-01
+aline .546715E-01 .800547E-01
+aline .556478E-01 .790785E-01
+aline .122035 .790785E-01
+bezier .131393 .124891 .143036 .170918 .150347 .216734
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="5" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.655556 dep=0 italic=.111563
+set path ! start of curve
+newpath
+! start of curve
+amove .195255 .228449
+aline .195255 .226496
+aline .193303 .216734
+aline .192327 .212828
+aline .19135 .207947
+aline .190374 .206971
+aline .098604 .206971
+bezier .934136E-01 .183212 .875495E-01 .159017 .837646E-01 .135312
+bezier .10357 .148791 .133393 .155153 .154252 .138631
+bezier .186955 .110307 .178773 .585874E-01 .153276 .028312
+bezier .126475 -.522763E-02 .750306E-01 -.223925E-01 .380748E-01 .390511E-02
+aline .253832E-01 .165967E-01
+aline .244069E-01 .185493E-01
+aline .234307E-01 .195255E-01
+aline .224544E-01 .214781E-01
+aline .214781E-01 .224544E-01
+aline .205018E-01 .244069E-01
+aline .205018E-01 .253832E-01
+aline .214781E-01 .273358E-01
+aline .244069E-01 .302646E-01
+aline .253832E-01 .322171E-01
+aline .028312 .035146
+aline .292883E-01 .370985E-01
+aline .322171E-01 .400274E-01
+aline .331934E-01 .419799E-01
+aline .035146 .439325E-01
+bezier .469422E-01 .113287E-01 .917921E-01 .139106E-02 .117153 .244069E-01
+bezier .139626 .430454E-01 .146854 .746166E-01 .145465 .102509
+bezier .142334 .112769 .137544 .125431 .124963 .126916
+bezier .104846 .131051 .841587E-01 .11622 .732208E-01 .995803E-01
+aline .507664E-01 .995803E-01
+bezier .592409E-01 .142579 .684942E-01 .18565 .781022E-01 .228449
+aline .195255 .228449
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="6" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.655556 dep=0 italic=.111563
+set path ! start of curve
+newpath
+! start of curve
+amove .168896 .236259
+aline .169872 .235283
+aline .176706 .235283
+aline .184516 .23333
+aline .193303 .230401
+aline .194279 .229425
+aline .194279 .226496
+aline .192327 .216734
+aline .19135 .212828
+aline .190374 .2099
+bezier .166689 .219528 .138835 .220317 .11813 .203066
+bezier .952509E-01 .186489 .800915E-01 .158692 .741971E-01 .131797
+bezier .952193E-01 .153767 .130697 .169231 .159133 .155228
+bezier .184017 .133166 .182684 .961404E-01 .174754 .673631E-01
+bezier .165008 .324414E-01 .136826 .173103E-02 .101533 -.781022E-02
+bezier .080787 -.124149E-01 .555817E-01 -.544136E-02 .449088E-01 .146442E-01
+aline .439325E-01 .156204E-01
+bezier .028478 .478699E-01 .350669E-01 .819766E-01 .410036E-01 .115201
+bezier .533236E-01 .168546 .893188E-01 .221276 .144489 .235283
+aline .14937 .235283
+aline .150347 .236259
+aline .168896 .236259
+closepath
+! end of curve
+
+! start of curve
+amove .110319 .138631
+bezier .802636E-01 .131066 .646533E-01 .100171 .615055E-01 .712682E-01
+aline .605292E-01 .070292
+aline .605292E-01 .045885
+aline .615055E-01 .449088E-01
+bezier .607531E-01 .262188E-01 .795597E-01 .619427E-02 .098604 .126916E-01
+bezier .133644 .189788E-01 .147554 .057978 .151323 .888412E-01
+bezier .155538 .107133 .150133 .133951 .128869 .139608
+aline .111296 .139608
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="7" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.655556 dep=0 italic=.111563
+set path ! start of curve
+newpath
+! start of curve
+amove .2099 .228449
+aline .2099 .226496
+aline .207947 .216734
+aline .206971 .212828
+aline .205994 .207947
+bezier .146114 .15063 .100866 .773964E-01 .820073E-01 -.488139E-02
+aline .536952E-01 -.488139E-02
+bezier .671133E-01 .593074E-01 .100352 .117652 .142536 .165967
+aline .17573 .199161
+aline .177682 .200137
+aline .181588 .204042
+aline .180611 .205018
+aline .595529E-01 .205018
+aline .595529E-01 .206971
+aline .605292E-01 .211852
+aline .615055E-01 .215757
+aline .063458 .22552
+aline .644343E-01 .228449
+aline .2099 .228449
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="8" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.655556 dep=0 italic=.111563
+set path ! start of curve
+newpath
+! start of curve
+amove .147418 .236259
+bezier .17085 .23427 .194018 .214659 .195255 .190374
+bezier .197321 .158125 .169133 .131554 .139608 .123011
+bezier .164796 .115015 .181704 .877113E-01 .174754 .615055E-01
+bezier .163304 .936695E-02 .970197E-01 -.284272E-01 .497901E-01 .195255E-02
+bezier .205907E-01 .230044E-01 .216615E-01 .669111E-01 .439325E-01 .927463E-01
+bezier .564207E-01 .106758 .071845 .117374 .898175E-01 .123011
+bezier .662549E-01 .129725 .511411E-01 .155863 .585766E-01 .178659
+bezier .699408E-01 .215796 .109538 .239758 .147418 .236259
+closepath
+! end of curve
+
+! start of curve
+amove .126916 .215757
+bezier .924469E-01 .214804 .638472E-01 .166451 .917701E-01 .140584
+bezier .120357 .122235 .163855 .14067 .169872 .174754
+bezier .17526 .190315 .166288 .211768 .147418 .214781
+aline .142536 .215757
+aline .14156 .216734
+aline .127892 .216734
+aline .126916 .215757
+closepath
+! end of curve
+
+! start of curve
+amove .102509 .111296
+bezier .668061E-01 .10426 .045379 .602465E-01 .595529E-01 .028312
+bezier .779736E-01 -.758292E-05 .122534 .116838E-01 .137655 .380748E-01
+bezier .149702 .591555E-01 .156404 .091848 .132774 .10739
+aline .128869 .109343
+aline .12594 .110319
+aline .122035 .111296
+aline .121058 .112272
+aline .103485 .112272
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="9" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.655556 dep=0 italic=.111563
+set path ! start of curve
+newpath
+! start of curve
+amove .147418 .236259
+bezier .174216 .232882 .191221 .205323 .190374 .179635
+bezier .193475 .161657 .189302 .14321 .187445 .12594
+bezier .178229 .706656E-01 .146751 .147345E-01 .927463E-01 -.585766E-02
+bezier .709147E-01 -.118614E-01 .447944E-01 -.986737E-02 .028312 .781022E-02
+bezier .332914E-01 .134587E-01 .373378E-01 .209944E-01 .429562E-01 .253832E-01
+bezier .666571E-01 -.291544E-03 .107545 .140884E-01 .124963 .400274E-01
+bezier .137662 .557569E-01 .148089 .758204E-01 .151323 .956752E-01
+bezier .130118 .751454E-01 .964976E-01 .600107E-01 .683394E-01 .722445E-01
+bezier .044133 .909593E-01 .429866E-01 .125455 .488139E-01 .152299
+bezier .056464 .189974 .849673E-01 .221966 .121058 .234307
+aline .12594 .235283
+aline .130821 .235283
+aline .131797 .236259
+closepath
+! end of curve
+
+! start of curve
+amove .128869 .215757
+bezier .950389E-01 .210171 .794448E-01 .174329 .751733E-01 .143513
+bezier .696578E-01 .124674 .744882E-01 .954243E-01 .966514E-01 .888412E-01
+bezier .128508 .837242E-01 .157033 .113355 .162062 .144489
+aline .163038 .145465
+aline .163038 .152299
+aline .164991 .154252
+bezier .166441 .173576 .167774 .195371 .153276 .210876
+aline .151323 .211852
+aline .150347 .212828
+aline .148394 .213805
+aline .142536 .215757
+aline .14156 .216734
+aline .129845 .216734
+closepath
+! end of curve
+
+! start of curve
+amove .151323 .956752E-01
+aline .152299 .946989E-01
+aline .153276 .956752E-01
+aline .152299 .966514E-01
+aline .151323 .956752E-01
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=":" !-------------- Beginning of new char.
+dfont wid=.277779 hei=.444445 dep=0 italic=.0250244
+set path ! start of curve
+newpath
+! start of curve
+amove .966514E-01 .154252
+aline .966514E-01 .153276
+aline .937226E-01 .138631
+aline .927463E-01 .134726
+aline .917701E-01 .129845
+aline .907938E-01 .12594
+aline .624817E-01 .12594
+aline .624817E-01 .128869
+aline .063458 .13375
+aline .644343E-01 .137655
+aline .673631E-01 .152299
+aline .683394E-01 .154252
+aline .966514E-01 .154252
+closepath
+! end of curve
+
+! start of curve
+amove .693157E-01 .273358E-01
+aline .693157E-01 .244069E-01
+aline .673631E-01 .146442E-01
+aline .663868E-01 .010739
+aline .644343E-01 .976277E-03
+aline .063458 -.976277E-03
+aline .035146 -.976277E-03
+aline .035146 0
+aline .370985E-01 .976277E-02
+aline .380748E-01 .136679E-01
+aline .400274E-01 .234307E-01
+aline .410036E-01 .273358E-01
+aline .693157E-01 .273358E-01
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=";" !-------------- Beginning of new char.
+dfont wid=.277779 hei=.444445 dep=.125 italic=.0250244
+set path ! start of curve
+newpath
+! start of curve
+amove .966514E-01 .154252
+aline .966514E-01 .153276
+aline .937226E-01 .138631
+aline .927463E-01 .134726
+aline .917701E-01 .129845
+aline .907938E-01 .12594
+aline .624817E-01 .12594
+aline .624817E-01 .128869
+aline .063458 .13375
+aline .644343E-01 .137655
+aline .673631E-01 .152299
+aline .683394E-01 .154252
+aline .966514E-01 .154252
+closepath
+! end of curve
+
+! start of curve
+amove .693157E-01 .273358E-01
+bezier .06848 -.484868E-04 .516183E-01 -.219821E-01 .390511E-01 -.449088E-01
+aline .253832E-01 -.449088E-01
+bezier .030695 -.303861E-01 .400659E-01 -.145176E-01 .439325E-01 -.976277E-03
+aline .035146 -.976277E-03
+aline .035146 0
+aline .370985E-01 .976277E-02
+aline .380748E-01 .136679E-01
+aline .400274E-01 .234307E-01
+aline .410036E-01 .273358E-01
+aline .693157E-01 .273358E-01
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="<" !-------------- Beginning of new char.
+dfont wid=.319446 hei=.5 dep=.194445 italic=.0159988
+set path ! start of curve
+newpath
+! start of curve
+amove .108367 .173777
+aline .108367 .170849
+aline .10739 .166943
+aline .105438 .157181
+aline .104462 .153276
+aline .103485 .148394
+aline .102509 .145465
+aline .741971E-01 .145465
+aline .741971E-01 .147418
+aline .751733E-01 .152299
+aline .761496E-01 .156204
+aline .781022E-01 .165967
+aline .800547E-01 .173777
+aline .108367 .173777
+closepath
+! end of curve
+
+! start of curve
+amove .927463E-01 .111296
+aline .917701E-01 .106414
+aline .859124E-01 .771259E-01
+aline .849361E-01 .761496E-01
+aline .849361E-01 .712682E-01
+aline .751733E-01 .224544E-01
+aline .741971E-01 .214781E-01
+aline .741971E-01 .165967E-01
+aline .644343E-01 -.322171E-01
+aline .063458 -.331934E-01
+aline .063458 -.380748E-01
+aline .576004E-01 -.673631E-01
+aline .566241E-01 -.693157E-01
+aline .028312 -.693157E-01
+bezier .422334E-01 -.921647E-02 .549076E-01 .518501E-01 .070292 .111296
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="=" !-------------- Beginning of new char.
+dfont wid=.777781 hei=.37 dep=-.13 italic=.0508671
+set path ! start of curve
+newpath
+! start of curve
+amove .27531 .128869
+aline .277263 .127892
+aline .279215 .12594
+aline .280192 .123987
+aline .280192 .120082
+aline .279215 .11813
+aline .277263 .116177
+aline .27531 .115201
+aline .517427E-01 .115201
+aline .497901E-01 .116177
+aline .468613E-01 .119106
+aline .468613E-01 .124963
+aline .497901E-01 .127892
+aline .517427E-01 .128869
+closepath
+! end of curve
+
+! start of curve
+amove .260666 .585766E-01
+aline .262619 .576004E-01
+aline .263595 .566241E-01
+aline .265547 .052719
+aline .265547 .507664E-01
+aline .263595 .468613E-01
+aline .262619 .045885
+aline .260666 .449088E-01
+aline .370985E-01 .449088E-01
+aline .035146 .045885
+aline .322171E-01 .488139E-01
+aline .322171E-01 .546715E-01
+aline .035146 .576004E-01
+aline .370985E-01 .585766E-01
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=">" !-------------- Beginning of new char.
+dfont wid=.472224 hei=.5 dep=.194445 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .129845 .173777
+aline .129845 .170849
+aline .128869 .166943
+aline .126916 .157181
+aline .12594 .153276
+aline .124963 .148394
+aline .123987 .145465
+aline .956752E-01 .145465
+aline .956752E-01 .147418
+aline .966514E-01 .152299
+aline .976277E-01 .156204
+aline .995803E-01 .165967
+aline .101533 .173777
+aline .129845 .173777
+closepath
+! end of curve
+
+! start of curve
+amove .114224 .111296
+bezier .108317 .683859E-01 .860412E-01 .297481E-01 .536952E-01 .195255E-02
+bezier .043773 -.102692E-01 .384302E-01 -.283376E-01 .439325E-01 -.429562E-01
+bezier .532886E-01 -.559138E-01 .728174E-01 -.534493E-01 .859124E-01 -.507664E-01
+bezier .102103 -.478391E-01 .118205 -.422944E-01 .131797 -.331934E-01
+aline .132774 -.361223E-01
+aline .132774 -.419799E-01
+aline .13375 -.429562E-01
+aline .13375 -.478376E-01
+aline .134726 -.488139E-01
+aline .134726 -.546715E-01
+bezier .105846 -.707303E-01 .718063E-01 -.776072E-01 .400274E-01 -.070292
+bezier .254512E-01 -.065208 .013683 -.512564E-01 .156204E-01 -.035146
+bezier .133732E-01 -.126337E-01 .268031E-01 .129744E-01 .468613E-01 .253832E-01
+bezier .715297E-01 .470493E-01 .860413E-01 .778522E-01 .907938E-01 .110319
+aline .917701E-01 .111296
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="?" !-------------- Beginning of new char.
+dfont wid=.472224 hei=.694445 dep=0 italic=.118086
+set path ! start of curve
+newpath
+! start of curve
+amove .142536 .246022
+bezier .164038 .245378 .191469 .23039 .188421 .205018
+bezier .190645 .182359 .174498 .158496 .154252 .147418
+bezier .12641 .127221 .107713 .960811E-01 .103485 .615055E-01
+aline .081031 .615055E-01
+bezier .851713E-01 .10835 .114886 .148105 .152299 .173777
+bezier .162629 .187131 .168935 .212424 .150347 .221615
+bezier .124411 .231915 .950957E-01 .221317 .722445E-01 .206971
+aline .712682E-01 .210876
+aline .712682E-01 .216734
+aline .070292 .21771
+aline .070292 .222591
+aline .693157E-01 .223567
+aline .693157E-01 .227473
+bezier .907383E-01 .242071 .117113 .247465 .142536 .246022
+closepath
+! end of curve
+
+! start of curve
+amove .098604 .273358E-01
+aline .098604 .244069E-01
+aline .966514E-01 .146442E-01
+aline .956752E-01 .010739
+aline .937226E-01 .976277E-03
+aline .927463E-01 -.976277E-03
+aline .644343E-01 -.976277E-03
+aline .644343E-01 0
+aline .663868E-01 .976277E-02
+aline .673631E-01 .136679E-01
+aline .693157E-01 .234307E-01
+aline .070292 .273358E-01
+aline .098604 .273358E-01
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="@" !-------------- Beginning of new char.
+dfont wid=.666669 hei=.694445 dep=0 italic=.0755463
+set path ! start of curve
+newpath
+! start of curve
+amove .198184 .246022
+bezier .220331 .244179 .241838 .228062 .246022 .205018
+bezier .25234 .174343 .245956 .146316 .240164 .116177
+bezier .229658 .773327E-01 .196062 .038367 .153276 .410036E-01
+bezier .122584 .443118E-01 .105283 .792236E-01 .110319 .106414
+bezier .111838 .152328 .150384 .202908 .200137 .200137
+aline .205018 .199161
+aline .210876 .197208
+aline .216734 .194279
+aline .21771 .193303
+aline .219662 .192327
+aline .220639 .19135
+bezier .220631 .206889 .208728 .222566 .192327 .224544
+bezier .161736 .228717 .130319 .210608 .108367 .189398
+bezier .713899E-01 .149594 .523389E-01 .838669E-01 .888412E-01 .380748E-01
+bezier .109956 .149099E-01 .144136 .113255E-01 .171825 .195255E-01
+aline .179635 .214781E-01
+aline .19135 .253832E-01
+aline .193303 .263595E-01
+aline .196232 .273358E-01
+aline .198184 .028312
+aline .220639 .028312
+bezier .180078 -.100162E-01 .107305 -.201974E-01 .673631E-01 .244069E-01
+bezier .452704E-01 .049014 .392515E-01 .852543E-01 .045885 .115201
+bezier .556662E-01 .178744 .108505 .23307 .171825 .245046
+aline .178659 .245046
+aline .179635 .246022
+aline .198184 .246022
+closepath
+! end of curve
+
+! start of curve
+amove .18354 .178659
+bezier .150987 .16979 .13655 .132096 .135092 .102021
+bezier .135351 .859544E-01 .142018 .066487 .159133 .615055E-01
+bezier .191768 .613531E-01 .211041 .960261E-01 .215757 .124963
+bezier .220065 .140749 .216613 .159163 .205994 .172801
+aline .204042 .173777
+aline .202089 .17573
+aline .200137 .176706
+aline .194279 .178659
+aline .193303 .179635
+aline .184516 .179635
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="A" !-------------- Beginning of new char.
+dfont wid=.66667 hei=.694445 dep=0 italic=0
+dfont fby="C" kadd=-.0277786
+dfont fby="G" kadd=-.0277786
+dfont fby="O" kadd=-.0277786
+dfont fby="Q" kadd=-.0277786
+dfont fby="T" kadd=-.083334
+dfont fby="U" kadd=-.0277786
+dfont fby="V" kadd=-.111112
+dfont fby="W" kadd=-.111112
+dfont fby="Y" kadd=-.083334
+dfont fby="t" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .184516 .242117
+bezier .198088 .160688 .211028 .800644E-01 .224544 -.976277E-03
+aline .193303 -.976277E-03
+bezier .188336 .232346E-01 .186406 .472179E-01 .180611 .712682E-01
+aline .790785E-01 .712682E-01
+bezier .643405E-01 .047489 .507927E-01 .228518E-01 .361223E-01 -.976277E-03
+aline .010739 -.976277E-03
+bezier .587426E-01 .799353E-01 .106107 .161307 .154252 .242117
+closepath
+! end of curve
+
+! start of curve
+amove .160109 .216734
+bezier .13903 .173304 .114088 .132129 .898175E-01 .907938E-01
+aline .907938E-01 .898175E-01
+aline .177682 .898175E-01
+bezier .177905 .101996 .173232 .115616 .172801 .128869
+aline .171825 .129845
+bezier .169553 .154524 .164218 .177935 .163038 .203066
+aline .162062 .204042
+aline .162062 .21771
+aline .161086 .218686
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="B" !-------------- Beginning of new char.
+dfont wid=.66667 hei=.694445 dep=0 italic=.0829268
+set path ! start of curve
+newpath
+! start of curve
+amove .180611 .242117
+bezier .209982 .240386 .247349 .220872 .245046 .186469
+bezier .240629 .153125 .205947 .135316 .176706 .12594
+bezier .199992 .12202 .223617 .10696 .229425 .829836E-01
+bezier .234286 .464618E-01 .202486 .190393E-01 .171825 .683394E-02
+aline .160109 .292883E-02
+aline .156204 .195255E-02
+aline .151323 .976277E-03
+aline .146442 .976277E-03
+aline .145465 0
+aline .138631 0
+aline .137655 -.976277E-03
+aline .035146 -.976277E-03
+bezier .519519E-01 .801009E-01 .690768E-01 .161251 .868887E-01 .242117
+aline .180611 .242117
+closepath
+! end of curve
+
+! start of curve
+amove .111296 .221615
+bezier .105622 .193076 .980351E-01 .163838 .937226E-01 .135703
+aline .147418 .135703
+bezier .174409 .13991 .208131 .151404 .21771 .180611
+bezier .221289 .204761 .195474 .218652 .174754 .221615
+aline .173777 .222591
+aline .166943 .222591
+aline .165967 .223567
+aline .112272 .223567
+closepath
+! end of curve
+
+! start of curve
+amove .878649E-01 .111296
+bezier .081473 .803163E-01 .736119E-01 .473445E-01 .683394E-01 .017573
+aline .131797 .017573
+bezier .159623 .215076E-01 .193288 .354288E-01 .202089 .654106E-01
+bezier .205802 .917736E-01 .180033 .110208 .156204 .113248
+aline .155228 .114224
+aline .148394 .114224
+aline .147418 .115201
+aline .888412E-01 .115201
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="C" !-------------- Beginning of new char.
+dfont wid=.638891 hei=.694445 dep=0 italic=.119829
+set path ! start of curve
+newpath
+! start of curve
+amove .205018 .249927
+aline .205994 .248951
+aline .214781 .248951
+aline .215757 .247974
+aline .220639 .247974
+aline .22552 .246998
+aline .23333 .245046
+aline .247974 .240164
+aline .253832 .237235
+bezier .250162 .228379 .24777 .216986 .242117 .2099
+bezier .20861 .238019 .157178 .23289 .126916 .202089
+bezier .937408E-01 .172852 .764663E-01 .126737 .771259E-01 .839598E-01
+bezier .796932E-01 .557716E-01 .945959E-01 .206037E-01 .126916 .146442E-01
+bezier .156714 .768204E-02 .187278 .180501E-01 .212828 .341697E-01
+aline .212828 .331934E-01
+aline .211852 .322171E-01
+aline .211852 .253832E-01
+aline .210876 .244069E-01
+aline .210876 .017573
+aline .2099 .165967E-01
+aline .2099 .010739
+bezier .177595 -.894693E-02 .138252 -.014962 .102509 -.292883E-02
+bezier .628513E-01 .128356E-01 .418389E-01 .595097E-01 .478376E-01 .995803E-01
+bezier .514986E-01 .171118 .109288 .240829 .181588 .249927
+aline .205018 .249927
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="D" !-------------- Beginning of new char.
+dfont wid=.722226 hei=.694445 dep=0 italic=.0755463
+dfont fby="A" kadd=-.0277786
+dfont fby="V" kadd=-.0277786
+dfont fby="W" kadd=-.0277786
+dfont fby="X" kadd=-.0277786
+dfont fby="Y" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .188421 .242117
+bezier .227421 .238846 .259736 .203232 .261642 .164015
+bezier .272528 .886145E-01 .212275 .811902E-02 .136679 -.976277E-03
+aline .035146 -.976277E-03
+bezier .519519E-01 .801009E-01 .690768E-01 .161251 .868887E-01 .242117
+aline .188421 .242117
+closepath
+! end of curve
+
+! start of curve
+amove .112272 .221615
+bezier .981053E-01 .153858 .824142E-01 .841086E-01 .693157E-01 .017573
+aline .131797 .017573
+bezier .180774 .242176E-01 .219652 .670617E-01 .229425 .115201
+bezier .238335 .148074 .234914 .1915 .204042 .212828
+bezier .195439 .218274 .184892 .221361 .17573 .223567
+aline .113248 .223567
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="E" !-------------- Beginning of new char.
+dfont wid=.597224 hei=.694445 dep=0 italic=.119829
+set path ! start of curve
+newpath
+! start of curve
+amove .242117 .24114
+aline .242117 .240164
+aline .24114 .235283
+aline .240164 .231378
+aline .238212 .221615
+aline .237235 .219662
+aline .112272 .219662
+bezier .105866 .191606 .988011E-01 .162804 .946989E-01 .134726
+aline .2099 .134726
+aline .207947 .124963
+aline .206971 .121058
+aline .205994 .116177
+aline .205018 .114224
+aline .898175E-01 .114224
+bezier .827413E-01 .840791E-01 .757902E-01 .515194E-01 .070292 .224544E-01
+aline .126916 .224544E-01
+aline .127892 .234307E-01
+aline .200137 .234307E-01
+aline .200137 .195255E-01
+aline .199161 .146442E-01
+aline .198184 .010739
+aline .196232 .976277E-03
+aline .195255 -.976277E-03
+aline .341697E-01 -.976277E-03
+bezier .510363E-01 .797451E-01 .677257E-01 .160783 .859124E-01 .24114
+aline .242117 .24114
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="F" !-------------- Beginning of new char.
+dfont wid=.569448 hei=.694445 dep=0 italic=.133718
+dfont fby="A" kadd=-.083334
+dfont fby="C" kadd=-.0277786
+dfont fby="G" kadd=-.0277786
+dfont fby="O" kadd=-.0277786
+dfont fby="Q" kadd=-.0277786
+dfont fby="a" kadd=-.0277786
+dfont fby="e" kadd=-.0277786
+dfont fby="o" kadd=-.0277786
+dfont fby="r" kadd=-.0277786
+dfont fby="u" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .237235 .24114
+aline .237235 .240164
+aline .236259 .235283
+aline .235283 .231378
+aline .23333 .221615
+aline .232354 .219662
+aline .112272 .219662
+bezier .105493 .190316 .984315E-01 .160137 .937226E-01 .130821
+aline .199161 .130821
+aline .199161 .129845
+aline .198184 .124963
+aline .197208 .121058
+aline .195255 .111296
+aline .194279 .110319
+aline .888412E-01 .110319
+bezier .800479E-01 .07342 .073561 .357649E-01 .644343E-01 -.976277E-03
+aline .341697E-01 -.976277E-03
+bezier .510363E-01 .797451E-01 .677257E-01 .160783 .859124E-01 .24114
+aline .237235 .24114
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="G" !-------------- Beginning of new char.
+dfont wid=.666669 hei=.694445 dep=0 italic=.119829
+set path ! start of curve
+newpath
+! start of curve
+amove .204042 .249927
+aline .205018 .248951
+aline .212828 .248951
+aline .213805 .247974
+aline .218686 .247974
+aline .223567 .246998
+aline .227473 .246022
+aline .239188 .242117
+aline .256761 .23333
+aline .257737 .232354
+bezier .25396 .223542 .251639 .212119 .246022 .205018
+bezier .214173 .238825 .158276 .234239 .126916 .202089
+bezier .937408E-01 .172852 .764663E-01 .126737 .771259E-01 .839598E-01
+bezier .796932E-01 .557716E-01 .945959E-01 .206037E-01 .126916 .146442E-01
+bezier .147716 .941792E-02 .167949 .150553E-01 .188421 .205018E-01
+bezier .193042 .411237E-01 .198689 .622984E-01 .201113 .829836E-01
+aline .155228 .829836E-01
+aline .156204 .878649E-01
+aline .157181 .917701E-01
+aline .159133 .101533
+aline .160109 .103485
+aline .23333 .103485
+bezier .226766 .719278E-01 .220715 .399782E-01 .212828 .878649E-02
+bezier .178452 -.71992E-02 .138805 -.151505E-01 .102509 -.292883E-02
+bezier .628513E-01 .128356E-01 .418389E-01 .595097E-01 .478376E-01 .995803E-01
+bezier .514986E-01 .171118 .109288 .240829 .181588 .249927
+aline .204042 .249927
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="H" !-------------- Beginning of new char.
+dfont wid=.708338 hei=.694445 dep=0 italic=.0809383
+set path ! start of curve
+newpath
+! start of curve
+amove .116177 .242117
+bezier .110101 .206639 .100158 .17069 .946989E-01 .135703
+aline .213805 .135703
+bezier .222563 .170827 .228634 .206875 .237235 .242117
+aline .2675 .242117
+bezier .250929 .161052 .233764 .797381E-01 .215757 -.976277E-03
+aline .185493 -.976277E-03
+bezier .19243 .378073E-01 .203177 .765662E-01 .208923 .115201
+aline .898175E-01 .115201
+bezier .808103E-01 .766195E-01 .738675E-01 .374014E-01 .644343E-01 -.976277E-03
+aline .341697E-01 -.976277E-03
+bezier .509757E-01 .080101 .681006E-01 .161251 .859124E-01 .242117
+aline .116177 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="I" !-------------- Beginning of new char.
+dfont wid=.277781 hei=.694445 dep=0 italic=.133718
+dfont fby="I" kadd=.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .116177 .242117
+bezier .996054E-01 .161052 .824412E-01 .797385E-01 .644343E-01 -.976277E-03
+aline .341697E-01 -.976277E-03
+bezier .509757E-01 .080101 .681006E-01 .161251 .859124E-01 .242117
+aline .116177 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="J" !-------------- Beginning of new char.
+dfont wid=.472224 hei=.694445 dep=0 italic=.0809383
+set path ! start of curve
+newpath
+! start of curve
+amove .188421 .242117
+bezier .173904 .173135 .160801 .10351 .143513 .035146
+bezier .133293 .107513E-01 .109066 -.676934E-02 .829836E-01 -.878649E-02
+aline .063458 -.878649E-02
+aline .624817E-01 -.781022E-02
+aline .556478E-01 -.781022E-02
+aline .045885 -.585766E-02
+aline .419799E-01 -.488139E-02
+aline .302646E-01 -.976277E-03
+aline .185493E-01 .488139E-02
+bezier .171003E-01 .129567E-01 .243205E-01 .218664E-01 .263595E-01 .302646E-01
+aline .273358E-01 .312409E-01
+bezier .494728E-01 .139096E-02 .103026 .686748E-02 .116177 .429562E-01
+bezier .131108 .109201 .144083 .175925 .159133 .242117
+aline .188421 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="K" !-------------- Beginning of new char.
+dfont wid=.694448 hei=.694445 dep=0 italic=.119829
+dfont fby="C" kadd=-.0277786
+dfont fby="G" kadd=-.0277786
+dfont fby="O" kadd=-.0277786
+dfont fby="Q" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .116177 .242117
+bezier .10848 .198791 .967871E-01 .155321 .898175E-01 .112272
+bezier .141151 .15567 .192658 .198827 .244069 .242117
+aline .276286 .242117
+bezier .238085 .210445 .199509 .178535 .162306 .145953
+bezier .18448 .968938E-01 .207123 .480297E-01 .229425 -.976277E-03
+aline .197208 -.976277E-03
+bezier .177368 .415242E-01 .157864 .841638E-01 .138631 .126916
+bezier .119915 .110751 .100879 .095028 .820073E-01 .790785E-01
+bezier .758077E-01 .524918E-01 .712692E-01 .253596E-01 .644343E-01 -.976277E-03
+aline .035146 -.976277E-03
+bezier .519519E-01 .801009E-01 .690768E-01 .161251 .868887E-01 .242117
+aline .116177 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="L" !-------------- Beginning of new char.
+dfont wid=.541669 hei=.694445 dep=0 italic=0
+dfont fby="T" kadd=-.083334
+dfont fby="V" kadd=-.111112
+dfont fby="W" kadd=-.111112
+dfont fby="Y" kadd=-.083334
+set path ! start of curve
+newpath
+! start of curve
+amove .116177 .242117
+bezier .101989 .168197 .837764E-01 .941394E-01 .070292 .205018E-01
+aline .162062 .205018E-01
+aline .163038 .214781E-01
+aline .180611 .214781E-01
+aline .180611 .195255E-01
+aline .179635 .146442E-01
+aline .178659 .010739
+aline .176706 .976277E-03
+aline .17573 -.976277E-03
+aline .341697E-01 -.976277E-03
+bezier .509757E-01 .080101 .681006E-01 .161251 .859124E-01 .242117
+aline .116177 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="M" !-------------- Beginning of new char.
+dfont wid=.875005 hei=.694445 dep=0 italic=.0809383
+set path ! start of curve
+newpath
+! start of curve
+amove .126916 .242117
+bezier .13029 .230407 .130375 .21859 .13375 .206971
+bezier .134553 .19579 .138176 .184993 .138631 .173777
+bezier .146976 .132848 .152319 .918347E-01 .159133 .507664E-01
+aline .159133 .429562E-01
+aline .160109 .419799E-01
+aline .160109 .312409E-01
+aline .161086 .302646E-01
+bezier .199645 .102632 .242852 .172184 .285073 .242117
+aline .324124 .242117
+bezier .307553 .161052 .290388 .079738 .272381 -.976277E-03
+aline .246022 -.976277E-03
+bezier .260569 .722228E-01 .277885 .146039 .291907 .218686
+bezier .253158 .146455 .20993 .769205E-01 .16792 .683394E-02
+aline .143513 .683394E-02
+bezier .140405 .176799E-01 .139694 .296968E-01 .136679 .410036E-01
+bezier .133596 .623599E-01 .130057 .838062E-01 .12594 .104462
+bezier .120631 .143103 .113051 .179489 .110319 .218686
+bezier .930019E-01 .145925 .079529 .718457E-01 .624817E-01 -.976277E-03
+aline .361223E-01 -.976277E-03
+bezier .529281E-01 .080101 .700532E-01 .161251 .878649E-01 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="N" !-------------- Beginning of new char.
+dfont wid=.708338 hei=.694445 dep=0 italic=.0809383
+set path ! start of curve
+newpath
+! start of curve
+amove .129845 .242117
+bezier .151934 .169621 .173573 .961901E-01 .192327 .224544E-01
+bezier .209798 .09489 .223332 .169198 .240164 .242117
+aline .266524 .242117
+bezier .249951 .161052 .232789 .797387E-01 .214781 -.976277E-03
+aline .171825 -.976277E-03
+bezier .149842 .718328E-01 .128303 .144963 .109343 .218686
+bezier .920255E-01 .145925 .785527E-01 .718458E-01 .615055E-01 -.976277E-03
+aline .035146 -.976277E-03
+bezier .519519E-01 .801009E-01 .690768E-01 .161251 .868887E-01 .242117
+aline .129845 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="O" !-------------- Beginning of new char.
+dfont wid=.736113 hei=.694445 dep=0 italic=.0755463
+dfont fby="A" kadd=-.0277786
+dfont fby="V" kadd=-.0277786
+dfont fby="W" kadd=-.0277786
+dfont fby="X" kadd=-.0277786
+dfont fby="Y" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .192327 .249927
+bezier .234624 .246609 .267387 .205288 .2675 .164015
+bezier .274954 .890169E-01 .220758 .775582E-02 .144489 -.781022E-02
+bezier .110387 -.143253E-01 .715727E-01 .183743E-02 .556478E-01 .341697E-01
+bezier .247731E-01 .946182E-01 .526393E-01 .170413 .100557 .214781
+bezier .125361 .23691 .158362 .25279 .192327 .249927
+closepath
+! end of curve
+
+! start of curve
+amove .169872 .227473
+bezier .114005 .218469 .800124E-01 .159632 .751733E-01 .10739
+aline .741971E-01 .106414
+aline .741971E-01 .761496E-01
+bezier .781224E-01 .493199E-01 .938429E-01 .170396E-01 .124963 .136679E-01
+bezier .154368 .918978E-02 .184624 .293076E-01 .202089 .052719
+bezier .226864 .838711E-01 .240343 .124951 .239188 .164015
+bezier .236369 .190291 .22154 .220696 .192327 .226496
+aline .19135 .227473
+aline .186469 .227473
+aline .185493 .228449
+aline .170849 .228449
+aline .169872 .227473
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="P" !-------------- Beginning of new char.
+dfont wid=.638891 hei=.694445 dep=0 italic=.0829268
+dfont fby="," kadd=-.083334
+dfont fby="." kadd=-.083334
+dfont fby="A" kadd=-.083334
+dfont fby="a" kadd=-.0277786
+dfont fby="e" kadd=-.0277786
+dfont fby="o" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .18354 .242117
+bezier .210593 .240175 .239213 .221262 .243093 .192327
+bezier .247463 .143047 .19885 .104545 .153276 .100557
+aline .878649E-01 .100557
+bezier .794814E-01 .669661E-01 .739325E-01 .325007E-01 .654106E-01 -.976277E-03
+aline .035146 -.976277E-03
+bezier .519519E-01 .801009E-01 .690768E-01 .161251 .868887E-01 .242117
+aline .18354 .242117
+closepath
+! end of curve
+
+! start of curve
+amove .112272 .221615
+bezier .105708 .1878 .964175E-01 .153871 .917701E-01 .120082
+aline .150347 .120082
+bezier .177369 .123777 .207187 .140483 .213805 .169872
+bezier .221493 .190609 .206508 .216702 .18354 .220639
+aline .178659 .221615
+aline .177682 .222591
+aline .172801 .222591
+aline .171825 .223567
+aline .113248 .223567
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="Q" !-------------- Beginning of new char.
+dfont wid=.736113 hei=.694445 dep=.125 italic=.0755463
+set path ! start of curve
+newpath
+! start of curve
+amove .192327 .249927
+bezier .234624 .246609 .267387 .205288 .2675 .164015
+bezier .273878 .105264 .240741 .432292E-01 .191155 .111296E-01
+bezier .197932 -.785956E-02 .211293 -.260915E-01 .219662 -.449088E-01
+aline .184516 -.449088E-01
+aline .18354 -.439325E-01
+aline .182564 -.410036E-01
+aline .164015 -.390511E-02
+aline .162062 -.325427E-02
+bezier .125457 -.170137E-01 .789839E-01 -.616576E-02 .585766E-01 .292883E-01
+bezier .270236E-01 .815763E-01 .460146E-01 .149466 .820073E-01 .195255
+bezier .108868 .227677 .14887 .253388 .192327 .249927
+closepath
+! end of curve
+
+! start of curve
+amove .169872 .227473
+bezier .111037 .217113 .792644E-01 .154579 .722445E-01 .101533
+bezier .697836E-01 .700029E-01 .783367E-01 .314927E-01 .110319 .017573
+bezier .124403 .113392E-01 .140025 .109801E-01 .154252 .165967E-01
+aline .153276 .017573
+aline .146442 .312409E-01
+aline .145465 .341697E-01
+aline .129845 .654106E-01
+aline .129845 .663868E-01
+aline .160109 .663868E-01
+aline .165967 .546715E-01
+aline .166943 .536952E-01
+aline .171825 .439325E-01
+aline .172801 .429562E-01
+aline .178659 .312409E-01
+aline .180611 .03059
+bezier .221941 .059576 .240995 .114301 .239188 .163038
+bezier .235704 .189262 .221604 .220102 .192327 .226496
+aline .19135 .227473
+aline .186469 .227473
+aline .185493 .228449
+aline .170849 .228449
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="R" !-------------- Beginning of new char.
+dfont wid=.645836 hei=.694445 dep=0 italic=.0829268
+set path ! start of curve
+newpath
+! start of curve
+amove .181588 .242117
+bezier .209444 .240145 .242045 .223942 .246998 .193303
+bezier .249654 .15136 .209075 .122588 .172383 .113388
+bezier .186734 .754722E-01 .20289 .371787E-01 .21771 -.976277E-03
+aline .187445 -.976277E-03
+bezier .171824 .354617E-01 .159558 .740568E-01 .143513 .110319
+aline .888412E-01 .110319
+bezier .800479E-01 .07342 .073561 .357649E-01 .644343E-01 -.976277E-03
+aline .035146 -.976277E-03
+bezier .519519E-01 .801009E-01 .690768E-01 .161251 .868887E-01 .242117
+aline .181588 .242117
+closepath
+! end of curve
+
+! start of curve
+amove .112272 .221615
+bezier .106278 .191411 .983008E-01 .160822 .937226E-01 .130821
+aline .154252 .130821
+bezier .181197 .134092 .215421 .149762 .218686 .180611
+bezier .222084 .195714 .210277 .212572 .195255 .21771
+aline .186469 .220639
+aline .181588 .221615
+aline .180611 .222591
+aline .173777 .222591
+aline .172801 .223567
+aline .113248 .223567
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="S" !-------------- Beginning of new char.
+dfont wid=.555557 hei=.694445 dep=0 italic=.0920515
+set path ! start of curve
+newpath
+! start of curve
+amove .164015 .249927
+aline .164991 .248951
+aline .172801 .248951
+aline .182564 .246998
+aline .194279 .243093
+aline .207947 .236259
+aline .208923 .235283
+aline .212828 .23333
+aline .213805 .232354
+bezier .210027 .223543 .207707 .212118 .202089 .205018
+bezier .172104 .239814 .106307 .234234 .888412E-01 .189398
+bezier .080701 .1698 .961906E-01 .147022 .117153 .144489
+bezier .142119 .138093 .171296 .132918 .184516 .108367
+bezier .206514 .652177E-01 .173169 .147418E-01 .131797 -.195255E-02
+bezier .949204E-01 -.158476E-01 .051866 -.841267E-02 .205018E-01 .156204E-01
+bezier .231768E-01 .247684E-01 .266822E-01 .034513 .312409E-01 .429562E-01
+bezier .623602E-01 .119154E-01 .11942 .139964E-02 .150347 .380748E-01
+bezier .162673 .541219E-01 .168519 .769288E-01 .154252 .937226E-01
+aline .153276 .956752E-01
+bezier .129523 .115912 .895752E-01 .107636 .070292 .134726
+bezier .497932E-01 .157382 .568183E-01 .192022 .751733E-01 .213805
+bezier .968463E-01 .23962 .130717 .25318 .164015 .249927
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="T" !-------------- Beginning of new char.
+dfont wid=.680557 hei=.694445 dep=0 italic=.133718
+dfont fby="A" kadd=-.083334
+dfont fby="a" kadd=-.083334
+dfont fby="e" kadd=-.083334
+dfont fby="o" kadd=-.083334
+dfont fby="r" kadd=-.083334
+dfont fby="u" kadd=-.083334
+dfont fby="y" kadd=-.083334
+set path ! start of curve
+newpath
+! start of curve
+amove .278239 .240164
+aline .277263 .235283
+aline .276286 .231378
+aline .274334 .221615
+aline .273358 .218686
+aline .18354 .218686
+bezier .166223 .145925 .152749 .718459E-01 .135703 -.976277E-03
+aline .105438 -.976277E-03
+bezier .119985 .722228E-01 .137301 .146039 .151323 .218686
+aline .605292E-01 .218686
+aline .605292E-01 .220639
+aline .624817E-01 .230401
+aline .063458 .234307
+aline .644343E-01 .239188
+aline .654106E-01 .240164
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="U" !-------------- Beginning of new char.
+dfont wid=.687505 hei=.694445 dep=0 italic=.0809383
+set path ! start of curve
+newpath
+! start of curve
+amove .116177 .242117
+bezier .104802 .182627 .901936E-01 .122006 .790785E-01 .063458
+bezier .780665E-01 .421632E-01 .886653E-01 .166457E-01 .112272 .117153E-01
+bezier .15128 .184782E-02 .189939 .363816E-01 .198184 .741971E-01
+bezier .210495 .130105 .221574 .186329 .234307 .242117
+aline .260666 .242117
+bezier .248055 .182587 .237246 .12229 .221615 .063458
+bezier .201285 .110545E-01 .135004 -.281535E-01 .820073E-01 .976277E-03
+bezier .057392 .148231E-01 .449708E-01 .461562E-01 .507664E-01 .732208E-01
+bezier .604538E-01 .129731 .738833E-01 .185958 .859124E-01 .242117
+aline .116177 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="V" !-------------- Beginning of new char.
+dfont wid=.66667 hei=.694445 dep=0 italic=.161496
+dfont fby="A" kadd=-.083334
+dfont fby="C" kadd=-.0277786
+dfont fby="G" kadd=-.0277786
+dfont fby="O" kadd=-.0277786
+dfont fby="Q" kadd=-.0277786
+dfont fby="a" kadd=-.0277786
+dfont fby="e" kadd=-.0277786
+dfont fby="o" kadd=-.0277786
+dfont fby="r" kadd=-.0277786
+dfont fby="u" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .898175E-01 .242117
+bezier .980274E-01 .191825 .10837 .142004 .115201 .927463E-01
+bezier .120443 .700045E-01 .12197 .045723 .12594 .224544E-01
+bezier .165009 .982294E-01 .211144 .169447 .254808 .242117
+aline .281168 .242117
+bezier .232067 .16106 .182868 .08007 .13375 -.976277E-03
+aline .101533 -.976277E-03
+bezier .932189E-01 .475055E-01 .841955E-01 .963013E-01 .751733E-01 .144489
+bezier .695811E-01 .177335 .634631E-01 .209692 .576004E-01 .242117
+aline .898175E-01 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="W" !-------------- Beginning of new char.
+dfont wid=.944448 hei=.694445 dep=0 italic=.161496
+dfont fby="A" kadd=-.083334
+dfont fby="C" kadd=-.0277786
+dfont fby="G" kadd=-.0277786
+dfont fby="O" kadd=-.0277786
+dfont fby="Q" kadd=-.0277786
+dfont fby="a" kadd=-.0277786
+dfont fby="e" kadd=-.0277786
+dfont fby="o" kadd=-.0277786
+dfont fby="r" kadd=-.0277786
+dfont fby="u" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .868887E-01 .242117
+aline .878649E-01 .24114
+aline .878649E-01 .230401
+bezier .912728E-01 .19624 .941676E-01 .161865 .956752E-01 .126916
+aline .966514E-01 .12594
+aline .966514E-01 .112272
+aline .976277E-01 .111296
+aline .976277E-01 .966514E-01
+aline .098604 .956752E-01
+aline .098604 .781022E-01
+aline .995803E-01 .771259E-01
+aline .995803E-01 .488139E-01
+aline .100557 .478376E-01
+aline .100557 .361223E-01
+aline .995803E-01 .035146
+aline .995803E-01 .234307E-01
+aline .100557 .224544E-01
+bezier .109138 .04958 .123267 .745632E-01 .134726 .100557
+aline .197208 .22552
+aline .205018 .24114
+aline .205994 .242117
+aline .23333 .242117
+bezier .237662 .193775 .241793 .146412 .244069 .976277E-01
+aline .245046 .966514E-01
+aline .245046 .081031
+aline .246022 .800547E-01
+aline .246022 .615055E-01
+aline .246998 .605292E-01
+aline .246998 .244069E-01
+aline .247974 .234307E-01
+bezier .255116 .439634E-01 .265592 .631142E-01 .274334 .829836E-01
+aline .296788 .127892
+aline .297765 .130821
+aline .323148 .181588
+aline .324124 .182564
+aline .353412 .24114
+aline .354389 .242117
+aline .378796 .242117
+aline .350484 .185493
+aline .349507 .184516
+aline .312409 .110319
+aline .311432 .109343
+aline .27531 .370985E-01
+aline .274334 .361223E-01
+aline .255785 -.976277E-03
+aline .22552 -.976277E-03
+aline .22552 .976277E-02
+aline .224544 .010739
+aline .224544 .214781E-01
+aline .223567 .224544E-01
+aline .223567 .331934E-01
+aline .222591 .341697E-01
+aline .222591 .045885
+aline .221615 .468613E-01
+aline .221615 .585766E-01
+aline .220639 .595529E-01
+aline .220639 .070292
+aline .219662 .712682E-01
+aline .219662 .839598E-01
+aline .218686 .849361E-01
+aline .218686 .966514E-01
+aline .21771 .976277E-01
+aline .21771 .110319
+aline .216734 .111296
+aline .216734 .123987
+aline .215757 .124963
+aline .215757 .138631
+aline .214781 .139608
+aline .214781 .155228
+aline .213805 .156204
+aline .213805 .172801
+aline .212828 .173777
+aline .212828 .21771
+aline .211852 .218686
+bezier .204945 .198843 .194952 .180277 .186469 .161086
+aline .168896 .12594
+aline .16792 .123011
+aline .128869 .449088E-01
+aline .127892 .439325E-01
+aline .105438 -.976277E-03
+aline .771259E-01 -.976277E-03
+aline .771259E-01 .976277E-02
+aline .761496E-01 .010739
+aline .761496E-01 .224544E-01
+aline .751733E-01 .234307E-01
+aline .751733E-01 .341697E-01
+aline .741971E-01 .035146
+aline .741971E-01 .045885
+aline .732208E-01 .468613E-01
+aline .732208E-01 .576004E-01
+aline .722445E-01 .585766E-01
+aline .722445E-01 .070292
+aline .712682E-01 .712682E-01
+aline .712682E-01 .820073E-01
+aline .070292 .829836E-01
+aline .070292 .937226E-01
+aline .693157E-01 .946989E-01
+aline .693157E-01 .106414
+aline .683394E-01 .10739
+aline .683394E-01 .11813
+aline .673631E-01 .119106
+aline .673631E-01 .129845
+aline .663868E-01 .130821
+aline .663868E-01 .14156
+aline .654106E-01 .142536
+aline .654106E-01 .154252
+aline .644343E-01 .155228
+aline .644343E-01 .165967
+aline .063458 .166943
+aline .063458 .177682
+aline .624817E-01 .178659
+aline .624817E-01 .189398
+aline .615055E-01 .190374
+aline .615055E-01 .202089
+aline .605292E-01 .203066
+aline .605292E-01 .213805
+aline .595529E-01 .214781
+aline .595529E-01 .22552
+aline .585766E-01 .226496
+aline .585766E-01 .238212
+aline .576004E-01 .239188
+aline .576004E-01 .242117
+aline .868887E-01 .242117
+closepath
+! end of curve
+
+! start of curve
+amove .246998 .224544E-01
+aline .247974 .234307E-01
+aline .246998 .244069E-01
+aline .246022 .234307E-01
+aline .246998 .224544E-01
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="X" !-------------- Beginning of new char.
+dfont wid=.66667 hei=.694445 dep=0 italic=.133718
+dfont fby="C" kadd=-.0277786
+dfont fby="G" kadd=-.0277786
+dfont fby="O" kadd=-.0277786
+dfont fby="Q" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .098604 .242117
+bezier .115098 .211687 .130918 .180772 .147418 .150347
+bezier .176356 .18072 .204749 .211486 .23333 .242117
+aline .266524 .242117
+bezier .229744 .203956 .193364 .165508 .157181 .126916
+bezier .181752 .846387E-01 .205178 .415354E-01 .229425 -.976277E-03
+aline .193303 -.976277E-03
+aline .184516 .165967E-01
+aline .18354 .017573
+aline .166943 .507664E-01
+aline .165967 .517427E-01
+aline .148394 .868887E-01
+aline .147418 .878649E-01
+aline .138631 .105438
+aline .137655 .106414
+bezier .104883 .070548 .719367E-01 .348074E-01 .390511E-01 -.976277E-03
+aline .585766E-02 -.976277E-03
+bezier .471356E-01 .412221E-01 .866139E-01 .847171E-01 .127892 .126916
+bezier .105789 .1651 .084621 .203959 .624817E-01 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="Y" !-------------- Beginning of new char.
+dfont wid=.66667 hei=.694445 dep=0 italic=.172607
+dfont fby="A" kadd=-.083334
+dfont fby="a" kadd=-.083334
+dfont fby="e" kadd=-.083334
+dfont fby="o" kadd=-.083334
+dfont fby="r" kadd=-.083334
+dfont fby="u" kadd=-.083334
+set path ! start of curve
+newpath
+! start of curve
+amove .898175E-01 .242117
+bezier .109435 .201783 .128553 .160948 .146442 .120082
+bezier .181102 .161814 .218668 .20145 .254808 .242117
+aline .285073 .242117
+bezier .240882 .193816 .196976 .145308 .153276 .966514E-01
+bezier .145476 .642743E-01 .13996 .312108E-01 .131797 -.976277E-03
+aline .102509 -.976277E-03
+bezier .108704 .318932E-01 .116758 .652899E-01 .123011 .976277E-01
+bezier .987937E-01 .14511 .771616E-01 .19414 .536952E-01 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="Z" !-------------- Beginning of new char.
+dfont wid=.611113 hei=.694445 dep=0 italic=.119829
+set path ! start of curve
+newpath
+! start of curve
+amove .246998 .242117
+bezier .247363 .224958 .23101 .21587 .222591 .203066
+bezier .169408 .142872 .117559 .817151E-01 .644343E-01 .214781E-01
+aline .654106E-01 .205018E-01
+aline .122035 .205018E-01
+aline .123011 .214781E-01
+aline .202089 .214781E-01
+aline .202089 .195255E-01
+aline .201113 .146442E-01
+aline .200137 .010739
+aline .198184 .976277E-03
+aline .197208 -.976277E-03
+aline .205018E-01 -.976277E-03
+aline .205018E-01 0
+aline .224544E-01 .976277E-02
+aline .234307E-01 .136679E-01
+bezier .836523E-01 .824113E-01 .143479 .151437 .203066 .220639
+aline .202089 .221615
+aline .732208E-01 .221615
+aline .732208E-01 .22552
+aline .741971E-01 .230401
+aline .751733E-01 .234307
+aline .761496E-01 .239188
+aline .771259E-01 .242117
+aline .246998 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="[" !-------------- Beginning of new char.
+dfont wid=.28889 hei=.75 dep=.25 italic=.159416
+set path ! start of curve
+newpath
+! start of curve
+amove .150347 .261642
+aline .150347 .258713
+aline .148394 .248951
+aline .146442 .24114
+aline .113248 .24114
+bezier .898788E-01 .139538 .694355E-01 .363295E-01 .472274E-01 -.658987E-01
+aline .478376E-01 -.683394E-01
+aline .800547E-01 -.683394E-01
+aline .800547E-01 -.722445E-01
+aline .790785E-01 -.771259E-01
+aline .781022E-01 -.081031
+aline .771259E-01 -.859124E-01
+aline .761496E-01 -.888412E-01
+aline .017573 -.888412E-01
+bezier .415395E-01 .280624E-01 .669706E-01 .144845 .917701E-01 .261642
+aline .150347 .261642
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="\" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.694445 dep=0 italic=.142052
+set path ! start of curve
+newpath
+! start of curve
+amove .148394 .242117
+bezier .142433 .227577 .133438 .212697 .129845 .198184
+aline .137655 .198184
+aline .137655 .194279
+aline .136679 .189398
+aline .135703 .185493
+aline .132774 .170849
+aline .131797 .169872
+aline .103485 .169872
+aline .106414 .184516
+bezier .109489 .205352 .124347 .221328 .132774 .240164
+aline .134726 .242117
+closepath
+! end of curve
+
+! start of curve
+amove .216734 .242117
+bezier .210771 .227577 .201777 .212697 .198184 .198184
+aline .205994 .198184
+aline .205994 .194279
+aline .205018 .189398
+aline .204042 .185493
+aline .201113 .170849
+aline .200137 .169872
+aline .171825 .169872
+aline .174754 .184516
+bezier .177828 .205351 .192687 .221327 .201113 .240164
+aline .203066 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="]" !-------------- Beginning of new char.
+dfont wid=.28889 hei=.75 dep=.25 italic=.0871935
+set path ! start of curve
+newpath
+! start of curve
+amove .122035 .261642
+bezier .984852E-01 .144698 .730345E-01 .278279E-01 .478376E-01 -.888412E-01
+aline -.010739 -.888412E-01
+aline -.010739 -.868887E-01
+aline -.976277E-02 -.820073E-01
+aline -.878649E-02 -.781022E-01
+aline -.683394E-02 -.683394E-01
+aline .273358E-01 -.683394E-01
+bezier .490266E-01 .345543E-01 .720875E-01 .139476 .927463E-01 .24114
+aline .595529E-01 .24114
+aline .595529E-01 .244069
+aline .605292E-01 .247974
+aline .624817E-01 .257737
+aline .063458 .261642
+aline .122035 .261642
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="^" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.694445 dep=0 italic=.079895
+set path ! start of curve
+newpath
+! start of curve
+amove .150347 .242117
+bezier .162866 .223097 .17604 .203987 .187445 .184516
+aline .166943 .184516
+bezier .157226 .199101 .147226 .213484 .136679 .227473
+bezier .120969 .212826 .104366 .19942 .888412E-01 .184516
+aline .673631E-01 .184516
+bezier .885591E-01 .203205 .108952 .223007 .129845 .242117
+aline .150347 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="_" !-------------- Beginning of new char.
+dfont wid=.277779 hei=.679365 dep=0 italic=.0777359
+set path ! start of curve
+newpath
+! start of curve
+amove .115201 .238212
+aline .115201 .235283
+aline .114224 .231378
+aline .111296 .216734
+aline .110319 .212828
+aline .109343 .207947
+aline .790785E-01 .207947
+aline .790785E-01 .211852
+aline .800547E-01 .215757
+aline .829836E-01 .230401
+aline .849361E-01 .238212
+aline .115201 .238212
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="`" !-------------- Beginning of new char.
+dfont wid=.277779 hei=.694445 dep=0 italic=.0781631
+set path ! start of curve
+newpath
+! start of curve
+amove .116177 .242117
+bezier .110216 .227577 .10122 .212697 .976277E-01 .198184
+aline .105438 .198184
+aline .105438 .194279
+aline .104462 .189398
+aline .103485 .185493
+aline .100557 .170849
+aline .995803E-01 .169872
+aline .712682E-01 .169872
+aline .741971E-01 .184516
+bezier .772726E-01 .205351 .921296E-01 .221328 .100557 .240164
+aline .102509 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="a" !-------------- Beginning of new char.
+dfont wid=.480557 hei=.444445 dep=0 italic=.00980663
+dfont fby="r" kadd=-.0277786
+dfont fby="w" kadd=-.0277786
+dfont fby="y" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .124963 .160109
+bezier .149465 .158375 .169509 .131418 .163038 .10739
+bezier .157452 .711004E-01 .148649 .034848 .140584 -.976277E-03
+aline .115201 -.976277E-03
+aline .115201 0
+aline .116763 .781022E-02
+aline .116177 .010739
+bezier .944213E-01 -.275855E-02 .686462E-01 -.670387E-02 .439325E-01 -.390511E-02
+bezier .175509E-01 .610981E-02 .178871E-01 .479659E-01 .410036E-01 .615055E-01
+bezier .661635E-01 .811758E-01 .997667E-01 .822468E-01 .128869 .849361E-01
+aline .132064 .857349E-01
+bezier .136668 .101812 .141568 .118233 .130821 .132774
+bezier .116187 .14644 .961446E-01 .138543 .790785E-01 .13375
+aline .771259E-01 .132774
+aline .741971E-01 .131797
+aline .644343E-01 .126916
+aline .063458 .12594
+aline .595529E-01 .123987
+aline .585766E-01 .123011
+aline .566241E-01 .122035
+aline .566241E-01 .12594
+aline .576004E-01 .126916
+aline .576004E-01 .13375
+aline .585766E-01 .134726
+aline .585766E-01 .14156
+aline .595529E-01 .144489
+bezier .794292E-01 .156935 .102209 .161029 .124963 .160109
+closepath
+! end of curve
+
+! start of curve
+amove .115201 .663868E-01
+bezier .959756E-01 .659565E-01 .761466E-01 .615219E-01 .585766E-01 .517427E-01
+bezier .457314E-01 .437381E-01 .467968E-01 .222021E-01 .624817E-01 .185493E-01
+bezier .808479E-01 .118726E-01 .101962 .170767E-01 .117153 .292883E-01
+aline .11813 .312409E-01
+aline .119106 .322171E-01
+aline .122035 .380748E-01
+aline .123987 .045885
+aline .126916 .605292E-01
+aline .127892 .644343E-01
+aline .128625 .658987E-01
+aline .127892 .673631E-01
+aline .116177 .673631E-01
+aline .115201 .663868E-01
+closepath
+! end of curve
+
+! start of curve
+amove .116177 .010739
+aline .117153 .976277E-02
+aline .11813 .010739
+aline .117153 .117153E-01
+aline .116177 .010739
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="b" !-------------- Beginning of new char.
+dfont wid=.516668 hei=.694445 dep=0 italic=.0305681
+dfont fby="c" kadd=.0277786
+dfont fby="d" kadd=.0277786
+dfont fby="e" kadd=.0277786
+dfont fby="o" kadd=.0277786
+dfont fby="q" kadd=.0277786
+dfont fby="r" kadd=-.0277786
+dfont fby="w" kadd=-.0277786
+dfont fby="x" kadd=-.0277786
+dfont fby="y" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .10739 .242117
+bezier .101616 .207725 .918264E-01 .173465 .867492E-01 .139189
+bezier .107482 .152045 .134152 .162906 .159133 .156204
+bezier .186243 .144252 .192134 .108883 .186469 .839598E-01
+bezier .182131 .446747E-01 .153857 .702069E-02 .115201 -.390511E-02
+bezier .959389E-01 -.777292E-02 .736127E-01 -.202997E-02 .610173E-01 .144001E-01
+aline .603897E-01 .140863E-01
+aline .595529E-01 .010739
+aline .576004E-01 .976277E-03
+aline .566241E-01 -.976277E-03
+aline .302646E-01 -.976277E-03
+bezier .470706E-01 .080101 .641955E-01 .161251 .820073E-01 .242117
+aline .10739 .242117
+closepath
+! end of curve
+
+! start of curve
+amove .117153 .136679
+bezier .103307 .13466 .904351E-01 .126921 .820073E-01 .116177
+bezier .766452E-01 .089863 .703081E-01 .629622E-01 .654106E-01 .370985E-01
+aline .663868E-01 .361223E-01
+bezier .704026E-01 .213398E-01 .087513 .121129E-01 .101533 .165967E-01
+bezier .131956 .020153 .154313 .485122E-01 .159133 .781022E-01
+bezier .164986 .983423E-01 .160342 .129083 .135703 .135703
+aline .130821 .136679
+aline .129845 .137655
+aline .11813 .137655
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="c" !-------------- Beginning of new char.
+dfont wid=.444446 hei=.444445 dep=0 italic=.0833569
+set path ! start of curve
+newpath
+! start of curve
+amove .136679 .160109
+bezier .150374 .159138 .164555 .152992 .17573 .144489
+aline .174754 .14156
+aline .173777 .139608
+aline .172801 .136679
+aline .171825 .134726
+aline .169872 .128869
+aline .168896 .126916
+aline .16792 .123987
+aline .166943 .122035
+bezier .139491 .148333 .899211E-01 .143136 .070292 .109343
+bezier .545814E-01 .835209E-01 .449359E-01 .461393E-01 .070292 .234307E-01
+bezier .967139E-01 .822215E-02 .127726 .211965E-01 .152299 .035146
+aline .152299 .322171E-01
+aline .151323 .312409E-01
+aline .151323 .244069E-01
+aline .150347 .234307E-01
+aline .150347 .165967E-01
+aline .14937 .126916E-01
+bezier .117401 -.706921E-02 .692578E-01 -.160474E-01 .419799E-01 .156204E-01
+bezier .981095E-02 .596576E-01 .381533E-01 .123622 .820073E-01 .148394
+aline .829836E-01 .14937
+aline .907938E-01 .153276
+aline .937226E-01 .154252
+aline .956752E-01 .155228
+aline .104462 .158157
+aline .109343 .159133
+aline .114224 .159133
+aline .115201 .160109
+aline .136679 .160109
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="d" !-------------- Beginning of new char.
+dfont wid=.516668 hei=.694445 dep=0 italic=.0948286
+set path ! start of curve
+newpath
+! start of curve
+amove .204042 .242117
+bezier .18747 .161052 .170306 .797381E-01 .152299 -.976277E-03
+aline .12594 -.976277E-03
+aline .12594 0
+aline .127892 .976277E-02
+aline .128869 .136679E-01
+aline .129601 .151323E-01
+aline .128869 .165967E-01
+bezier .107649 -.607699E-03 .752721E-01 -.137156E-01 .497901E-01 .195255E-02
+bezier .327137E-01 .150445E-01 .253194E-01 .388469E-01 .028312 .585766E-01
+bezier .287725E-01 .10049 .564508E-01 .144199 .976277E-01 .157181
+bezier .118095 .160683 .141941 .155654 .156204 .138631
+bezier .163979 .173056 .170498 .207804 .178659 .242117
+aline .204042 .242117
+closepath
+! end of curve
+
+! start of curve
+amove .114224 .136679
+bezier .811677E-01 .133032 .582388E-01 .998318E-01 .556478E-01 .683394E-01
+bezier .505038E-01 .477547E-01 .604654E-01 .019234 .849361E-01 .165967E-01
+bezier .10398 .122781E-01 .124754 .025506 .134726 .419799E-01
+bezier .139728 .067632 .146871 .936317E-01 .150347 .119106
+aline .148394 .123011
+aline .147418 .123987
+aline .146442 .12594
+aline .140584 .131797
+aline .132774 .135703
+aline .127892 .136679
+aline .126916 .137655
+aline .115201 .137655
+aline .114224 .136679
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="e" !-------------- Beginning of new char.
+dfont wid=.444446 hei=.444445 dep=0 italic=.0677776
+set path ! start of curve
+newpath
+! start of curve
+amove .124963 .160109
+bezier .148762 .158626 .1684 .135674 .165967 .111296
+aline .166943 .110319
+aline .166943 .102509
+aline .165967 .101533
+aline .165967 .917701E-01
+aline .164991 .907938E-01
+aline .164991 .849361E-01
+aline .164015 .839598E-01
+aline .164015 .790785E-01
+aline .163038 .761496E-01
+aline .536952E-01 .761496E-01
+bezier .460039E-01 .533651E-01 .581613E-01 .205413E-01 .849361E-01 .165967E-01
+bezier .10719 .128899E-01 .131026 .229263E-01 .150347 .035146
+aline .150347 .322171E-01
+aline .14937 .312409E-01
+aline .14937 .234307E-01
+aline .148394 .224544E-01
+aline .148394 .156204E-01
+bezier .13716 .448294E-02 .119909 -.37602E-03 .104462 -.390511E-02
+bezier .835737E-01 -.697513E-02 .581837E-01 -.429592E-02 .439325E-01 .136679E-01
+bezier .014857 .455189E-01 .275654E-01 .955555E-01 .052719 .12594
+bezier .707448E-01 .146784 .967787E-01 .162912 .124963 .160109
+closepath
+! end of curve
+
+! start of curve
+amove .10739 .138631
+bezier .848446E-01 .134937 .065757 .114182 .595529E-01 .946989E-01
+aline .147418 .946989E-01
+aline .148394 .956752E-01
+bezier .149689 .113671 .14119 .136615 .120082 .138631
+aline .119106 .139608
+aline .108367 .139608
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="f" !-------------- Beginning of new char.
+dfont wid=.305557 hei=.694445 dep=0 italic=.217052
+dfont fby=33 kadd=.0694447
+dfont fby=39 kadd=.0694447
+dfont fby=")" kadd=.0694447
+dfont fby="?" kadd=.0694447
+dfont fby="]" kadd=.0694447
+dfont fby="f" ligrep=11
+dfont fby="i" ligrep=12
+dfont fby="l" ligrep=13
+set path ! start of curve
+newpath
+! start of curve
+amove .156204 .246022
+aline .157181 .245046
+aline .163038 .245046
+aline .16792 .244069
+aline .171825 .243093
+aline .173777 .242117
+aline .173777 .240164
+aline .172801 .235283
+aline .171825 .231378
+aline .169872 .221615
+aline .168896 .219662
+bezier .14866 .229694 .118853 .227816 .106414 .205994
+aline .105438 .203066
+aline .104462 .199161
+aline .102509 .189398
+aline .101533 .185493
+aline .098604 .170849
+aline .976277E-01 .166943
+aline .956752E-01 .157181
+aline .094943 .155716
+aline .956752E-01 .154252
+aline .13375 .154252
+aline .13375 .153276
+aline .130821 .138631
+aline .129845 .134726
+aline .917701E-01 .134726
+bezier .819322E-01 .895303E-01 .731351E-01 .043928 .624817E-01 -.976277E-03
+aline .370985E-01 -.976277E-03
+bezier .452607E-01 .443367E-01 .578479E-01 .894571E-01 .644343E-01 .134726
+aline .390511E-01 .134726
+aline .390511E-01 .137655
+aline .419799E-01 .152299
+aline .429562E-01 .154252
+aline .693157E-01 .154252
+bezier .075596 .176498 .766181E-01 .20178 .927463E-01 .219662
+bezier .108219 .238025 .131874 .248979 .156204 .246022
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="g" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.444445 dep=.194445 italic=.108357
+dfont fby="j" kadd=.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .119106 .158157
+bezier .128605 .157568 .136089 .151672 .144001 .147784
+aline .146442 .148394
+aline .158157 .152299
+aline .169872 .155228
+aline .174754 .156204
+aline .179635 .156204
+aline .180611 .157181
+aline .188421 .157181
+aline .189398 .158157
+aline .201113 .158157
+aline .201113 .147418
+aline .200137 .146442
+aline .200137 .136679
+aline .194279 .136679
+aline .193303 .137655
+aline .164991 .137655
+aline .164015 .136679
+aline .152299 .136679
+aline .151323 .135703
+bezier .169098 .102679 .142989 .615403E-01 .110319 .488139E-01
+bezier .936601E-01 .421637E-01 .733759E-01 .432887E-01 .590648E-01 .544275E-01
+bezier .497919E-01 .468284E-01 .047564 .026404 .615055E-01 .224544E-01
+aline .111296 .224544E-01
+bezier .128958 .207968E-01 .153155 .162384E-01 .160109 -.390511E-02
+bezier .165351 -.215316E-01 .158896 -.422988E-01 .142536 -.052719
+bezier .111937 -.757838E-01 .708634E-01 -.794999E-01 .035146 -.683394E-01
+bezier .169949E-01 -.616398E-01 -.991961E-03 -.444807E-01 .585766E-02 -.234307E-01
+bezier .106135E-01 -.832786E-02 .023083 .243126E-02 .358782E-01 .102509E-01
+bezier .264279E-01 .293067E-01 .347404E-01 .528429E-01 .497901E-01 .663868E-01
+bezier .295913E-01 .105065 .650387E-01 .15267 .105438 .158157
+closepath
+! end of curve
+
+! start of curve
+amove .102509 .138631
+bezier .773656E-01 .134797 .064526 .104731 .683394E-01 .829836E-01
+bezier .699072E-01 .669552E-01 .892793E-01 .594084E-01 .102509 .654106E-01
+bezier .125123 .713919E-01 .134086 .975687E-01 .13375 .11813
+aline .132774 .119106
+aline .131797 .123987
+aline .127892 .131797
+aline .12594 .13375
+aline .123987 .134726
+aline .123011 .135703
+aline .121058 .136679
+aline .11813 .137655
+aline .114224 .138631
+aline .113248 .139608
+aline .103485 .139608
+closepath
+! end of curve
+
+! start of curve
+amove .536952E-01 -.292883E-02
+bezier .360259E-01 -.561863E-02 .190437E-01 -.299747E-01 .035146 -.439325E-01
+bezier .648474E-01 -.626244E-01 .106079 -.591011E-01 .132774 -.361223E-01
+bezier .141135 -.266175E-01 .137689 -.107236E-01 .124963 -.683394E-02
+aline .122035 -.585766E-02
+aline .114224 -.390511E-02
+aline .113248 -.292883E-02
+aline .106414 -.292883E-02
+aline .105438 -.195255E-02
+aline .546715E-01 -.195255E-02
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="h" !-------------- Beginning of new char.
+dfont wid=.516668 hei=.694445 dep=0 italic=.0177784
+set path ! start of curve
+newpath
+! start of curve
+amove .106414 .242117
+bezier .100449 .205912 .896801E-01 .169852 .849361E-01 .13375
+bezier .106094 .156155 .14537 .168972 .170849 .147418
+bezier .185005 .126959 .174515 .101524 .170849 .790785E-01
+bezier .164649 .052492 .16011 .253599E-01 .153276 -.976277E-03
+aline .126916 -.976277E-03
+bezier .134385 .351019E-01 .141412 .071967 .150347 .10739
+aline .150347 .120082
+aline .14937 .121058
+bezier .1457 .137694 .123646 .140337 .110319 .135703
+bezier .756793E-01 .121477 .737752E-01 .787562E-01 .663868E-01 .468613E-01
+aline .654106E-01 .429562E-01
+aline .063458 .331934E-01
+aline .624817E-01 .292883E-01
+aline .595529E-01 .146442E-01
+aline .585766E-01 .010739
+aline .566241E-01 .976277E-03
+aline .556478E-01 -.976277E-03
+aline .292883E-01 -.976277E-03
+bezier .460943E-01 .801009E-01 .632192E-01 .161251 .081031 .242117
+aline .106414 .242117
+closepath
+! end of curve
+
+! start of curve
+amove .839598E-01 .132774
+aline .849361E-01 .13375
+aline .839598E-01 .134726
+aline .829836E-01 .13375
+aline .839598E-01 .132774
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="i" !-------------- Beginning of new char.
+dfont wid=.23889 hei=.679365 dep=0 italic=.0971804
+set path ! start of curve
+newpath
+! start of curve
+amove .108367 .238212
+aline .108367 .235283
+aline .10739 .231378
+aline .104462 .216734
+aline .103485 .212828
+aline .102509 .207947
+aline .722445E-01 .207947
+aline .722445E-01 .211852
+aline .732208E-01 .215757
+aline .761496E-01 .230401
+aline .781022E-01 .238212
+aline .108367 .238212
+closepath
+! end of curve
+
+! start of curve
+amove .888412E-01 .154252
+bezier .782003E-01 .102484 .675088E-01 .504498E-01 .556478E-01 -.976277E-03
+aline .302646E-01 -.976277E-03
+bezier .040915 .507899E-01 .516092E-01 .102823 .063458 .154252
+aline .888412E-01 .154252
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="j" !-------------- Beginning of new char.
+dfont wid=.266668 hei=.679365 dep=.194445 italic=.0916243
+set path ! start of curve
+newpath
+! start of curve
+amove .116177 .238212
+aline .116177 .235283
+aline .115201 .231378
+aline .112272 .216734
+aline .111296 .212828
+aline .110319 .207947
+aline .800547E-01 .207947
+aline .800547E-01 .211852
+aline .081031 .215757
+aline .839598E-01 .230401
+aline .859124E-01 .238212
+aline .116177 .238212
+closepath
+! end of curve
+
+! start of curve
+amove .098604 .154252
+bezier .852039E-01 .911214E-01 .730855E-01 .274808E-01 .576004E-01 -.035146
+bezier .479286E-01 -.576117E-01 .236046E-01 -.785729E-01 -.195255E-02 -.722445E-01
+bezier -.129421E-01 -.722137E-01 -.260018E-01 -.682549E-01 -.331934E-01 -.605292E-01
+aline -.292883E-01 -.052719
+aline -.028312 -.497901E-01
+aline -.244069E-01 -.419799E-01
+aline -.234307E-01 -.410036E-01
+bezier -.741093E-02 -.059761 .293827E-01 -.527273E-01 .341697E-01 -.273358E-01
+bezier .472737E-01 .331524E-01 .593324E-01 .940481E-01 .732208E-01 .154252
+aline .098604 .154252
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="k" !-------------- Beginning of new char.
+dfont wid=.488892 hei=.694445 dep=0 italic=.0833569
+dfont fby="a" kadd=-.0277786
+dfont fby="c" kadd=-.0277786
+dfont fby="e" kadd=-.0277786
+dfont fby="o" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .106414 .242117
+bezier .963976E-01 .188424 .827823E-01 .134196 .732208E-01 .081031
+bezier .101815 .105949 .13133 .129591 .160109 .154252
+aline .190374 .154252
+bezier .167023 .133513 .14229 .114693 .119106 .937226E-01
+aline .120082 .927463E-01
+aline .131797 .693157E-01
+aline .132774 .663868E-01
+aline .154252 .234307E-01
+aline .155228 .205018E-01
+aline .165967 -.976277E-03
+aline .137655 -.976277E-03
+aline .134726 .488139E-02
+aline .13375 .781022E-02
+aline .112272 .507664E-01
+aline .111296 .536952E-01
+aline .999057E-01 .076475
+bezier .914662E-01 .736043E-01 .851376E-01 .643652E-01 .771259E-01 .595529E-01
+aline .722445E-01 .546715E-01
+aline .070292 .536952E-01
+aline .663868E-01 .497901E-01
+aline .652153E-01 .492044E-01
+aline .644343E-01 .468613E-01
+aline .063458 .429562E-01
+aline .615055E-01 .331934E-01
+aline .605292E-01 .292883E-01
+aline .576004E-01 .146442E-01
+aline .566241E-01 .010739
+aline .546715E-01 .976277E-03
+aline .536952E-01 -.976277E-03
+aline .302646E-01 -.976277E-03
+bezier .470706E-01 .080101 .641955E-01 .161251 .820073E-01 .242117
+aline .106414 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="l" !-------------- Beginning of new char.
+dfont wid=.23889 hei=.694445 dep=0 italic=.0948286
+set path ! start of curve
+newpath
+! start of curve
+amove .10739 .242117
+bezier .908193E-01 .161052 .736545E-01 .797385E-01 .556478E-01 -.976277E-03
+aline .302646E-01 -.976277E-03
+bezier .470706E-01 .080101 .641955E-01 .161251 .820073E-01 .242117
+aline .10739 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="m" !-------------- Beginning of new char.
+dfont wid=.794447 hei=.444445 dep=0 italic=.0177784
+set path ! start of curve
+newpath
+! start of curve
+amove .147418 .158157
+bezier .161394 .15699 .176248 .147199 .177682 .131797
+aline .178659 .129845
+bezier .199456 .153886 .237096 .168339 .265547 .150347
+bezier .28209 .133946 .274287 .108924 .270429 .888412E-01
+bezier .263824 .589451E-01 .258336 .286252E-01 .250903 -.976277E-03
+aline .224544 -.976277E-03
+bezier .232011 .351022E-01 .239041 .719656E-01 .247974 .10739
+aline .247974 .120082
+aline .246998 .121058
+bezier .243328 .137694 .221274 .140337 .207947 .135703
+bezier .173307 .121478 .171402 .787563E-01 .164015 .468613E-01
+aline .163038 .429562E-01
+aline .161086 .331934E-01
+aline .160109 .292883E-01
+aline .157181 .146442E-01
+aline .156204 .010739
+aline .154252 .976277E-03
+aline .153276 -.976277E-03
+aline .126916 -.976277E-03
+bezier .134385 .351019E-01 .141412 .071967 .150347 .10739
+aline .150347 .120082
+aline .14937 .121058
+bezier .1457 .137694 .123646 .140337 .110319 .135703
+bezier .756793E-01 .121477 .737752E-01 .787562E-01 .663868E-01 .468613E-01
+aline .654106E-01 .429562E-01
+aline .063458 .331934E-01
+aline .624817E-01 .292883E-01
+aline .595529E-01 .146442E-01
+aline .585766E-01 .010739
+aline .566241E-01 .976277E-03
+aline .556478E-01 -.976277E-03
+aline .292883E-01 -.976277E-03
+bezier .398122E-01 .514906E-01 .513972E-01 .103823 .624817E-01 .156204
+aline .868887E-01 .156204
+aline .868887E-01 .153276
+aline .839598E-01 .138631
+aline .829836E-01 .134726
+aline .822513E-01 .133262
+aline .829836E-01 .131797
+bezier .992919E-01 .149627 .123197 .160617 .147418 .158157
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="n" !-------------- Beginning of new char.
+dfont wid=.516668 hei=.444445 dep=0 italic=.0177784
+set path ! start of curve
+newpath
+! start of curve
+amove .147418 .158157
+bezier .161394 .15699 .176248 .147199 .177682 .131797
+bezier .177863 .923667E-01 .163471 .538272E-01 .157181 .146442E-01
+aline .156204 .010739
+aline .154252 .976277E-03
+aline .153276 -.976277E-03
+aline .126916 -.976277E-03
+bezier .134385 .351019E-01 .141412 .071967 .150347 .10739
+aline .150347 .120082
+aline .14937 .121058
+bezier .1457 .137694 .123646 .140337 .110319 .135703
+bezier .756793E-01 .121477 .737752E-01 .787562E-01 .663868E-01 .468613E-01
+aline .654106E-01 .429562E-01
+aline .063458 .331934E-01
+aline .624817E-01 .292883E-01
+aline .595529E-01 .146442E-01
+aline .585766E-01 .010739
+aline .566241E-01 .976277E-03
+aline .556478E-01 -.976277E-03
+aline .292883E-01 -.976277E-03
+bezier .398122E-01 .514906E-01 .513972E-01 .103823 .624817E-01 .156204
+aline .868887E-01 .156204
+aline .868887E-01 .153276
+aline .839598E-01 .138631
+aline .829836E-01 .134726
+aline .822513E-01 .133262
+aline .829836E-01 .131797
+bezier .992919E-01 .149627 .123197 .160617 .147418 .158157
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="o" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.444445 dep=0 italic=.0661287
+dfont fby="c" kadd=.0277786
+dfont fby="d" kadd=.0277786
+dfont fby="e" kadd=.0277786
+dfont fby="o" kadd=.0277786
+dfont fby="q" kadd=.0277786
+dfont fby="r" kadd=-.0277786
+dfont fby="w" kadd=-.0277786
+dfont fby="x" kadd=-.0277786
+dfont fby="y" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .130821 .160109
+bezier .159041 .15758 .181487 .13113 .18354 .103485
+bezier .188761 .469957E-01 .137434 -.923284E-02 .800547E-01 -.488139E-02
+bezier .523866E-01 -.305765E-02 .287001E-01 .214723E-01 .263595E-01 .488139E-01
+bezier .213699E-01 .105701 .724858E-01 .164424 .130821 .160109
+closepath
+! end of curve
+
+! start of curve
+amove .110319 .138631
+bezier .680442E-01 .131803 .460556E-01 .808937E-01 .556478E-01 .439325E-01
+bezier .614128E-01 .199669E-01 .090565 .105286E-01 .111296 .205018E-01
+bezier .144916 .343965E-01 .160925 .751977E-01 .157181 .108367
+bezier .153284 .123264 .142298 .136798 .12594 .138631
+aline .124963 .139608
+aline .111296 .139608
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="p" !-------------- Beginning of new char.
+dfont wid=.516668 hei=.444445 dep=.194445 italic=.0389004
+dfont fby="c" kadd=.0277786
+dfont fby="d" kadd=.0277786
+dfont fby="e" kadd=.0277786
+dfont fby="o" kadd=.0277786
+dfont fby="q" kadd=.0277786
+dfont fby="r" kadd=-.0277786
+dfont fby="w" kadd=-.0277786
+dfont fby="x" kadd=-.0277786
+dfont fby="y" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .153276 .158157
+bezier .181844 .152193 .191675 .117316 .187445 .927463E-01
+bezier .186101 .507681E-01 .1569 .776579E-02 .115201 -.390511E-02
+bezier .095651 -.786216E-02 .736406E-01 -.184692E-02 .605292E-01 .146442E-01
+bezier .053944 -.132306E-01 .493472E-01 -.417247E-01 .419799E-01 -.693157E-01
+aline .156204E-01 -.693157E-01
+bezier .313911E-01 .517656E-02 .466781E-01 .800545E-01 .063458 .154252
+aline .888412E-01 .154252
+aline .888412E-01 .153276
+aline .863029E-01 .140584
+aline .868887E-01 .137655
+bezier .101296 .149436 .120695 .155942 .138631 .158157
+closepath
+! end of curve
+
+! start of curve
+amove .116177 .135703
+bezier .101323 .132142 .822767E-01 .124246 .800547E-01 .10739
+bezier .755336E-01 .839553E-01 .695977E-01 .600563E-01 .654106E-01 .370985E-01
+bezier .695576E-01 .276451E-01 .764322E-01 .177184E-01 .878649E-01 .165967E-01
+bezier .111849 .125039E-01 .136629 .302166E-01 .148394 .507664E-01
+bezier .163305 .750835E-01 .167896 .109232 .144489 .129845
+aline .142536 .130821
+aline .14156 .131797
+aline .139608 .132774
+aline .136679 .13375
+aline .134726 .134726
+aline .129845 .135703
+aline .128869 .136679
+aline .117153 .136679
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="q" !-------------- Beginning of new char.
+dfont wid=.516668 hei=.444445 dep=.194445 italic=.0416899
+set path ! start of curve
+newpath
+! start of curve
+amove .120082 .158157
+bezier .134783 .1564 .14773 .147125 .155228 .134726
+aline .156204 .137655
+aline .159133 .152299
+aline .160109 .156204
+aline .161086 .158157
+aline .186469 .158157
+bezier .170296 .823802E-01 .155005 .612837E-02 .137655 -.693157E-01
+aline .111296 -.693157E-01
+bezier .116646 -.040752 .124229 -.011457 .128869 .165967E-01
+bezier .108041 -.620129E-03 .763266E-01 -.129101E-01 .507664E-01 .976277E-03
+bezier .321926E-01 .134476E-01 .257555E-01 .386337E-01 .028312 .585766E-01
+bezier .287668E-01 .101233 .583239E-01 .14535 .100557 .157181
+aline .105438 .157181
+aline .106414 .158157
+closepath
+! end of curve
+
+! start of curve
+amove .114224 .135703
+bezier .068504 .12764 .388738E-01 .682396E-01 .644343E-01 .292883E-01
+bezier .792278E-01 .960385E-02 .107175 .138273E-01 .123987 .028312
+aline .132774 .370985E-01
+bezier .14072 .539045E-01 .141246 .737761E-01 .146442 .917701E-01
+bezier .150972 .105249 .147819 .120108 .138631 .130821
+aline .136679 .131797
+aline .135703 .132774
+aline .13375 .13375
+aline .127892 .135703
+aline .126916 .136679
+aline .115201 .136679
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="r" !-------------- Beginning of new char.
+dfont wid=.341669 hei=.444445 dep=0 italic=.108357
+set path ! start of curve
+newpath
+! start of curve
+amove .14937 .158157
+aline .14937 .157181
+aline .148394 .153276
+aline .145465 .138631
+aline .144489 .135703
+bezier .107086 .13482 .739818E-01 .102976 .070292 .654106E-01
+aline .693157E-01 .615055E-01
+aline .663868E-01 .468613E-01
+aline .654106E-01 .429562E-01
+aline .063458 .331934E-01
+aline .624817E-01 .292883E-01
+aline .595529E-01 .146442E-01
+aline .585766E-01 .010739
+aline .566241E-01 .976277E-03
+aline .556478E-01 -.976277E-03
+aline .302646E-01 -.976277E-03
+bezier .407885E-01 .514905E-01 .523735E-01 .103823 .063458 .156204
+aline .868887E-01 .156204
+aline .868887E-01 .153276
+aline .839598E-01 .138631
+aline .829836E-01 .134726
+aline .820073E-01 .129845
+aline .813971E-01 .127404
+aline .820073E-01 .124963
+bezier .989468E-01 .144201 .123514 .158864 .14937 .158157
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="s" !-------------- Beginning of new char.
+dfont wid=.383334 hei=.444445 dep=0 italic=.0778017
+set path ! start of curve
+newpath
+! start of curve
+amove .116177 .160109
+aline .117153 .159133
+aline .123987 .159133
+aline .124963 .158157
+aline .129845 .158157
+aline .13375 .157181
+aline .145465 .153276
+aline .153276 .14937
+aline .151323 .143513
+aline .150347 .14156
+aline .14937 .138631
+aline .148394 .136679
+aline .147418 .13375
+aline .146442 .131797
+aline .145465 .128869
+aline .144489 .126916
+bezier .12317 .13921 .959374E-01 .145581 .732208E-01 .13375
+bezier .060234 .126078 .575172E-01 .102781 .741971E-01 .976277E-01
+bezier .961249E-01 .922557E-01 .124155 .909309E-01 .134726 .673631E-01
+bezier .147273 .331369E-01 .114879 -.45556E-02 .800547E-01 -.390511E-02
+bezier .578963E-01 -.716645E-02 .327444E-01 -.268349E-02 .136679E-01 .010739
+aline .136679E-01 .126916E-01
+aline .146442E-01 .146442E-01
+aline .156204E-01 .017573
+aline .165967E-01 .195255E-01
+aline .185493E-01 .253832E-01
+aline .195255E-01 .273358E-01
+aline .205018E-01 .302646E-01
+aline .224544E-01 .341697E-01
+bezier .448534E-01 .169037E-01 .780084E-01 .902103E-02 .102509 .253832E-01
+bezier .112548 .346751E-01 .116391 .521668E-01 .103485 .605292E-01
+bezier .825783E-01 .698047E-01 .542172E-01 .666257E-01 .410036E-01 .888412E-01
+bezier .237252E-01 .121486 .584755E-01 .160422 .927463E-01 .159133
+aline .937226E-01 .160109
+aline .116177 .160109
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="t" !-------------- Beginning of new char.
+dfont wid=.361112 hei=.571431 dep=0 italic=.0722475
+dfont fby="w" kadd=-.0277786
+dfont fby="y" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .104462 .199161
+aline .103485 .194279
+aline .102509 .189398
+aline .101533 .185493
+aline .098604 .170849
+aline .976277E-01 .166943
+aline .956752E-01 .157181
+aline .094943 .155716
+aline .956752E-01 .154252
+aline .144489 .154252
+aline .144489 .153276
+aline .14156 .138631
+aline .140584 .134726
+aline .907938E-01 .134726
+bezier .838664E-01 .103579 .782026E-01 .715653E-01 .070292 .410036E-01
+aline .070292 .263595E-01
+bezier .735539E-01 .145418E-01 .878569E-01 .152882E-01 .966514E-01 .185493E-01
+aline .995803E-01 .195255E-01
+aline .103485 .205018E-01
+aline .105438 .214781E-01
+aline .108367 .224544E-01
+aline .112272 .244069E-01
+aline .113248 .253832E-01
+aline .117153 .273358E-01
+aline .11813 .028312
+aline .119106 .273358E-01
+aline .119106 .878649E-02
+bezier .999818E-01 -.190748E-02 .778942E-01 -.674608E-02 .566241E-01 -.390511E-02
+aline .052719 -.195255E-02
+aline .478376E-01 .292883E-02
+bezier .374477E-01 .273199E-01 .499348E-01 .531849E-01 .536952E-01 .781022E-01
+aline .556478E-01 .878649E-01
+aline .566241E-01 .917701E-01
+aline .595529E-01 .106414
+aline .605292E-01 .110319
+aline .624817E-01 .120082
+aline .063458 .123987
+aline .650201E-01 .131797
+aline .644343E-01 .134726
+aline .370985E-01 .134726
+aline .370985E-01 .137655
+aline .400274E-01 .152299
+aline .410036E-01 .154252
+aline .070292 .154252
+aline .712682E-01 .156204
+aline .732208E-01 .165967
+aline .741971E-01 .169872
+aline .771259E-01 .184516
+aline .781022E-01 .188421
+aline .800547E-01 .198184
+aline .081031 .199161
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="u" !-------------- Beginning of new char.
+dfont wid=.516668 hei=.444445 dep=0 italic=.0416899
+dfont fby="w" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .888412E-01 .154252
+bezier .809681E-01 .11129 .693851E-01 .674628E-01 .624817E-01 .253832E-01
+aline .063458 .244069E-01
+aline .644343E-01 .214781E-01
+aline .654106E-01 .195255E-01
+bezier .907685E-01 .375827E-02 .131757 .202175E-01 .137655 .507664E-01
+bezier .145208 .085225 .151788 .120074 .160109 .154252
+aline .186469 .154252
+bezier .175828 .102484 .165136 .05045 .153276 -.976277E-03
+aline .127892 -.976277E-03
+aline .127892 0
+aline .129845 .976277E-02
+aline .130455 .122035E-01
+aline .129984 .140863E-01
+bezier .114344 .479421E-02 .949911E-01 -.410103E-02 .761496E-01 -.390511E-02
+bezier .061907 -.726326E-02 .400008E-01 -.504052E-02 .361223E-01 .126916E-01
+bezier .337916E-01 .389536E-01 .445352E-01 .654651E-01 .488139E-01 .917701E-01
+aline .517427E-01 .106414
+aline .052719 .110319
+aline .546715E-01 .120082
+aline .556478E-01 .123987
+aline .576004E-01 .13375
+aline .585766E-01 .137655
+aline .615055E-01 .152299
+aline .624817E-01 .154252
+aline .888412E-01 .154252
+closepath
+! end of curve
+
+! start of curve
+amove .129845 .146442E-01
+aline .130821 .136679E-01
+aline .131797 .146442E-01
+aline .130821 .156204E-01
+aline .129845 .146442E-01
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="v" !-------------- Beginning of new char.
+dfont wid=.461113 hei=.444445 dep=0 italic=.108357
+set path ! start of curve
+newpath
+! start of curve
+amove .654106E-01 .154252
+bezier .733733E-01 .107649 .820928E-01 .630931E-01 .859124E-01 .156204E-01
+bezier .108882 .640297E-01 .137774 .108698 .164991 .154252
+aline .190374 .154252
+bezier .158814 .10274 .128451 .503635E-01 .966514E-01 -.976277E-03
+aline .663868E-01 -.976277E-03
+bezier .573213E-01 .482655E-01 .495838E-01 .972453E-01 .400274E-01 .146442
+aline .400274E-01 .151323
+aline .390511E-01 .152299
+aline .390511E-01 .154252
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="w" !-------------- Beginning of new char.
+dfont wid=.683336 hei=.444445 dep=0 italic=.108357
+dfont fby="a" kadd=-.0277786
+dfont fby="c" kadd=-.0277786
+dfont fby="e" kadd=-.0277786
+dfont fby="o" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .644343E-01 .154252
+bezier .685617E-01 .121718 .702554E-01 .892308E-01 .732208E-01 .566241E-01
+aline .732208E-01 .205018E-01
+aline .726106E-01 .180611E-01
+aline .732208E-01 .156204E-01
+bezier .781891E-01 .299821E-01 .846271E-01 .437351E-01 .907938E-01 .576004E-01
+aline .120082 .116177
+aline .121058 .117153
+aline .13375 .142536
+aline .134726 .143513
+aline .139608 .153276
+aline .140584 .154252
+aline .164991 .154252
+aline .164991 .14937
+bezier .167521 .132171 .168875 .114485 .169872 .966514E-01
+bezier .172963 .712238E-01 .17465 .452142E-01 .174754 .185493E-01
+aline .174021 .170848E-01
+aline .174754 .156204E-01
+aline .17573 .165967E-01
+aline .177682 .224544E-01
+aline .178659 .244069E-01
+aline .179635 .273358E-01
+aline .181588 .312409E-01
+aline .182564 .341697E-01
+aline .188421 .045885
+aline .189398 .488139E-01
+aline .213805 .976277E-01
+aline .214781 .098604
+aline .229425 .127892
+aline .230401 .128869
+aline .24114 .150347
+aline .242117 .151323
+aline .243093 .153276
+aline .244069 .154252
+aline .268476 .154252
+bezier .241405 .102553 .214517 .507223E-01 .187445 -.976277E-03
+aline .157181 -.976277E-03
+aline .157181 .585766E-02
+aline .156204 .683394E-02
+aline .156204 .165967E-01
+bezier .151873 .539563E-01 .148576 .917432E-01 .148394 .130821
+aline .14937 .131797
+aline .14937 .136679
+aline .148394 .137655
+aline .145465 .128869
+aline .144489 .126916
+aline .143513 .123987
+aline .142536 .122035
+aline .14156 .119106
+aline .138631 .113248
+aline .137655 .110319
+aline .130821 .966514E-01
+aline .129845 .937226E-01
+aline .106414 .468613E-01
+aline .105438 .045885
+aline .917701E-01 .185493E-01
+aline .907938E-01 .017573
+aline .820073E-01 0
+aline .081031 -.976277E-03
+aline .536952E-01 -.976277E-03
+aline .536952E-01 .781022E-02
+aline .052719 .878649E-02
+bezier .521672E-01 .290828E-01 .484932E-01 .048086 .478376E-01 .683394E-01
+aline .468613E-01 .693157E-01
+bezier .463096E-01 .896123E-01 .426354E-01 .108616 .419799E-01 .128869
+aline .410036E-01 .129845
+aline .410036E-01 .139608
+aline .400274E-01 .140584
+aline .400274E-01 .14937
+aline .390511E-01 .150347
+aline .390511E-01 .154252
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="x" !-------------- Beginning of new char.
+dfont wid=.461113 hei=.444445 dep=0 italic=.0916901
+set path ! start of curve
+newpath
+! start of curve
+amove .644343E-01 .154252
+bezier .776028E-01 .13563 .885286E-01 .115392 .101533 .966514E-01
+aline .111296 .106414
+aline .113248 .10739
+aline .147418 .14156
+aline .14937 .142536
+aline .161086 .154252
+aline .188421 .154252
+bezier .162046 .128765 .135342 .103733 .108367 .790785E-01
+bezier .12715 .530314E-01 .143592 .025297 .162062 -.976277E-03
+aline .13375 -.976277E-03
+bezier .120087 .206882E-01 .107601 .431976E-01 .946989E-01 .654106E-01
+aline .683394E-01 .390511E-01
+aline .673631E-01 .370985E-01
+aline .292883E-01 -.976277E-03
+aline .195255E-02 -.976277E-03
+bezier .299122E-01 .261976E-01 .584121E-01 .526218E-01 .868887E-01 .790785E-01
+bezier .692708E-01 .103635 .533739E-01 .129432 .361223E-01 .154252
+aline .644343E-01 .154252
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="y" !-------------- Beginning of new char.
+dfont wid=.461113 hei=.444445 dep=.194445 italic=.108357
+dfont fby="," kadd=-.083334
+dfont fby="." kadd=-.083334
+dfont fby="a" kadd=-.0277786
+dfont fby="e" kadd=-.0277786
+dfont fby="o" kadd=-.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .663868E-01 .154252
+aline .673631E-01 .14937
+aline .683394E-01 .145465
+aline .693157E-01 .140584
+aline .070292 .136679
+aline .712682E-01 .131797
+aline .722445E-01 .127892
+aline .732208E-01 .123011
+aline .741971E-01 .119106
+aline .820073E-01 .800547E-01
+bezier .831051E-01 .658422E-01 .871487E-01 .528498E-01 .868887E-01 .380748E-01
+aline .878649E-01 .370985E-01
+aline .878649E-01 .205018E-01
+aline .872548E-01 .180611E-01
+aline .878649E-01 .156204E-01
+bezier .107014 .653866E-01 .137313 .109575 .164991 .154252
+aline .190374 .154252
+bezier .146678 .855604E-01 .10564 .149521E-01 .605292E-01 -.052719
+aline .468613E-01 -.663868E-01
+aline .449088E-01 -.673631E-01
+aline .439325E-01 -.683394E-01
+aline .380748E-01 -.712682E-01
+aline .322171E-01 -.732208E-01
+aline .165967E-01 -.732208E-01
+aline .156204E-01 -.722445E-01
+aline .878649E-02 -.722445E-01
+aline .390511E-02 -.712682E-01
+aline .976277E-03 -.070292
+aline .976277E-03 -.663868E-01
+aline .195255E-02 -.654106E-01
+aline .195255E-02 -.595529E-01
+aline .292883E-02 -.585766E-01
+aline .292883E-02 -.517427E-01
+aline .390511E-02 -.478376E-01
+bezier .160316E-01 -.515544E-01 .293316E-01 -.579809E-01 .410036E-01 -.497901E-01
+bezier .054989 -.356066E-01 .644829E-01 -.017714 .073831 -.488139E-03
+bezier .623351E-01 .511058E-01 .501568E-01 .10261 .390511E-01 .154252
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="z" !-------------- Beginning of new char.
+dfont wid=.434723 hei=.444445 dep=0 italic=.0875244
+set path ! start of curve
+newpath
+! start of curve
+amove .174754 .154252
+aline .174754 .153276
+aline .172801 .143513
+aline .171825 .140584
+aline .170849 .139608
+aline .168896 .138631
+aline .100557 .070292
+aline .098604 .693157E-01
+aline .497901E-01 .205018E-01
+aline .507664E-01 .195255E-01
+aline .147418 .195255E-01
+aline .146442 .146442E-01
+aline .145465 .010739
+aline .143513 .976277E-03
+aline .142536 -.976277E-03
+aline .010739 -.976277E-03
+aline .010739 0
+aline .126916E-01 .976277E-02
+aline .136679E-01 .126916E-01
+aline .507664E-01 .497901E-01
+aline .052719 .507664E-01
+aline .120082 .11813
+aline .122035 .119106
+aline .136679 .13375
+aline .135703 .134726
+aline .449088E-01 .134726
+aline .449088E-01 .137655
+aline .478376E-01 .152299
+aline .488139E-01 .154252
+aline .174754 .154252
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="{" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.444445 dep=0 italic=.0861635
+set path ! start of curve
+newpath
+! start of curve
+amove .198184 .105438
+aline .198184 .102509
+aline .196232 .927463E-01
+aline .194279 .849361E-01
+aline .195255E-01 .849361E-01
+aline .195255E-01 .878649E-01
+aline .205018E-01 .917701E-01
+aline .224544E-01 .101533
+aline .234307E-01 .105438
+aline .198184 .105438
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="|" !-------------- Beginning of new char.
+dfont wid=1 hei=.444445 dep=0 italic=.0861635
+set path ! start of curve
+newpath
+! start of curve
+amove .373914 .105438
+aline .373914 .102509
+aline .371962 .927463E-01
+aline .370009 .849361E-01
+aline .195255E-01 .849361E-01
+aline .195255E-01 .878649E-01
+aline .205018E-01 .917701E-01
+aline .224544E-01 .101533
+aline .234307E-01 .105438
+aline .373914 .105438
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="}" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.694445 dep=0 italic=.0920515
+set path ! start of curve
+newpath
+! start of curve
+amove .139608 .242117
+bezier .126054 .222835 .113071 .20314 .098604 .184516
+aline .781022E-01 .184516
+bezier .904083E-01 .203291 .101168 .223179 .113248 .242117
+closepath
+! end of curve
+
+! start of curve
+amove .198184 .242117
+bezier .184631 .222835 .171647 .203141 .157181 .184516
+aline .136679 .184516
+bezier .148985 .203291 .159744 .22318 .171825 .242117
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="~" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.676588 dep=0 italic=.0882568
+set path ! start of curve
+newpath
+! start of curve
+amove .119106 .236259
+bezier .135727 .233193 .146943 .209446 .164991 .21771
+aline .165967 .218686
+aline .16792 .219662
+aline .169872 .221615
+aline .170849 .223567
+aline .171825 .224544
+aline .173777 .228449
+aline .17573 .234307
+aline .176706 .236259
+aline .197208 .236259
+bezier .19254 .213915 .171161 .190137 .146442 .196232
+bezier .132564 .201167 .122173 .219353 .106414 .214781
+aline .102509 .212828
+aline .098604 .208923
+aline .976277E-01 .206971
+aline .966514E-01 .205994
+aline .956752E-01 .204042
+aline .927463E-01 .195255
+aline .722445E-01 .195255
+bezier .755147E-01 .214269 .909713E-01 .23244 .110319 .236259
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=127 !-------------- Beginning of new char.
+dfont wid=.500002 hei=.679365 dep=0 italic=.0638475
+set path ! start of curve
+newpath
+! start of curve
+amove .119106 .238212
+aline .119106 .235283
+aline .11813 .231378
+aline .115201 .216734
+aline .114224 .212828
+aline .113248 .2099
+aline .849361E-01 .2099
+aline .849361E-01 .211852
+aline .859124E-01 .215757
+aline .888412E-01 .230401
+aline .907938E-01 .238212
+aline .119106 .238212
+closepath
+! end of curve
+
+! start of curve
+amove .187445 .238212
+aline .187445 .235283
+aline .186469 .231378
+aline .18354 .216734
+aline .182564 .212828
+aline .181588 .2099
+aline .153276 .2099
+aline .153276 .211852
+aline .154252 .215757
+aline .157181 .230401
+aline .159133 .238212
+aline .187445 .238212
+closepath
+! end of curve
+
+fill
+dfont endchar
diff --git a/src/fonts/texcmsy.afm b/src/fonts/texcmsy.afm
new file mode 100644
index 0000000..db61b0c
--- /dev/null
+++ b/src/fonts/texcmsy.afm
@@ -0,0 +1,177 @@
+StartFontMetrics 2.0
+Comment Made from TEX tfm file using TFMTOAFM.bas
+FontName CMSY10
+EncodingScheme TEXENCODING
+FullName CMSY10
+FamilyName CMSY10
+Weight Medium
+ItalicAngle 14.0363
+IsFixedPitch false
+UnderlinePosition -97
+UnderlineThickness 73
+FontBBox 0 -300 1001 1001
+CapHeight 729
+XHeight 151
+Descender -219
+Ascender 729
+StartCharMetrics 127
+C 1 ; WX 277 ; N C1 ; B 0 56 277 444 ;
+C 2 ; WX 777 ; N C2 ; B 0 -83 777 583 ;
+C 3 ; WX 500 ; N C3 ; B 0 35 500 465 ;
+C 4 ; WX 777 ; N C4 ; B 0 -83 777 583 ;
+C 5 ; WX 500 ; N C5 ; B 0 56 500 444 ;
+C 6 ; WX 777 ; N C6 ; B 0 -83 777 583 ;
+C 7 ; WX 777 ; N C7 ; B 0 -83 777 583 ;
+C 8 ; WX 777 ; N C8 ; B 0 -83 777 583 ;
+C 9 ; WX 777 ; N C9 ; B 0 -83 777 583 ;
+C 10 ; WX 777 ; N C10 ; B 0 -83 777 583 ;
+C 11 ; WX 777 ; N C11 ; B 0 -83 777 583 ;
+C 12 ; WX 777 ; N C12 ; B 0 -83 777 583 ;
+C 13 ; WX 1000 ; N C13 ; B 0 -194 1000 694 ;
+C 14 ; WX 500 ; N C14 ; B 0 56 500 444 ;
+C 15 ; WX 500 ; N C15 ; B 0 56 500 444 ;
+C 16 ; WX 777 ; N C16 ; B 0 37 777 463 ;
+C 17 ; WX 777 ; N C17 ; B 0 37 777 463 ;
+C 18 ; WX 777 ; N C18 ; B 0 -135 777 635 ;
+C 19 ; WX 777 ; N C19 ; B 0 -135 777 635 ;
+C 20 ; WX 777 ; N C20 ; B 0 -135 777 635 ;
+C 21 ; WX 777 ; N C21 ; B 0 -135 777 635 ;
+C 22 ; WX 777 ; N C22 ; B 0 -135 777 635 ;
+C 23 ; WX 777 ; N C23 ; B 0 -135 777 635 ;
+C 24 ; WX 777 ; N C24 ; B 0 134 777 366 ;
+C 25 ; WX 777 ; N C25 ; B 0 17 777 483 ;
+C 26 ; WX 777 ; N C26 ; B 0 -39 777 539 ;
+C 27 ; WX 777 ; N C27 ; B 0 -39 777 539 ;
+C 28 ; WX 1000 ; N C28 ; B 0 -39 1000 539 ;
+C 29 ; WX 1000 ; N C29 ; B 0 -39 1000 539 ;
+C 30 ; WX 777 ; N C30 ; B 0 -39 777 539 ;
+C 31 ; WX 777 ; N C31 ; B 0 -39 777 539 ;
+C 32 ; WX 1000 ; N C32 ; B 0 134 1000 366 ;
+C 33 ; WX 1000 ; N C33 ; B 0 134 1000 366 ;
+C 34 ; WX 500 ; N C34 ; B 0 -194 500 694 ;
+C 35 ; WX 500 ; N C35 ; B 0 -194 500 694 ;
+C 36 ; WX 1000 ; N C36 ; B 0 134 1000 366 ;
+C 37 ; WX 1000 ; N C37 ; B 0 -194 1000 694 ;
+C 38 ; WX 1000 ; N C38 ; B 0 -194 1000 694 ;
+C 39 ; WX 777 ; N C39 ; B 0 37 777 463 ;
+C 40 ; WX 1000 ; N C40 ; B 0 134 1000 366 ;
+C 41 ; WX 1000 ; N C41 ; B 0 134 1000 366 ;
+C 42 ; WX 611 ; N C42 ; B 0 -194 611 694 ;
+C 43 ; WX 611 ; N C43 ; B 0 -194 611 694 ;
+C 44 ; WX 1000 ; N C44 ; B 0 134 1000 366 ;
+C 45 ; WX 1000 ; N C45 ; B 0 -194 1000 694 ;
+C 46 ; WX 1000 ; N C46 ; B 0 -194 1000 694 ;
+C 47 ; WX 777 ; N C47 ; B 0 0 777 430 ;
+C 48 ; WX 274 ; N C48 ; B 0 0 274 555 ;
+C 49 ; WX 1000 ; N C49 ; B 0 0 1000 430 ;
+C 50 ; WX 666 ; N C50 ; B 0 -39 666 539 ;
+C 51 ; WX 666 ; N C51 ; B 0 -39 666 539 ;
+C 52 ; WX 888 ; N C52 ; B 0 -194 888 694 ;
+C 53 ; WX 888 ; N C53 ; B 0 -194 888 694 ;
+C 54 ; WX 0 ; N C54 ; B 0 -194 0 694 ;
+C 55 ; WX 0 ; N C55 ; B 0 134 0 366 ;
+C 56 ; WX 555 ; N C56 ; B 0 0 555 694 ;
+C 57 ; WX 555 ; N C57 ; B 0 0 555 694 ;
+C 58 ; WX 666 ; N C58 ; B 0 0 666 430 ;
+C 59 ; WX 500 ; N C59 ; B 0 -55 500 750 ;
+C 60 ; WX 722 ; N C60 ; B 0 0 722 694 ;
+C 61 ; WX 722 ; N C61 ; B 0 0 722 694 ;
+C 62 ; WX 777 ; N C62 ; B 0 0 777 694 ;
+C 63 ; WX 777 ; N C63 ; B 0 0 777 694 ;
+C 64 ; WX 611 ; N C64 ; B 0 0 611 694 ;
+C 65 ; WX 798 ; N A ; B 0 0 798 683 ;
+C 66 ; WX 656 ; N B ; B 0 0 656 683 ;
+C 67 ; WX 526 ; N C ; B 0 0 526 683 ;
+C 68 ; WX 771 ; N D ; B 0 0 771 683 ;
+C 69 ; WX 527 ; N E ; B 0 0 527 683 ;
+C 70 ; WX 718 ; N F ; B 0 0 718 683 ;
+C 71 ; WX 594 ; N G ; B 0 -97 594 683 ;
+C 72 ; WX 844 ; N H ; B 0 0 844 683 ;
+C 73 ; WX 544 ; N I ; B 0 0 544 683 ;
+C 74 ; WX 677 ; N J ; B 0 -97 677 683 ;
+C 75 ; WX 761 ; N K ; B 0 0 761 683 ;
+C 76 ; WX 689 ; N L ; B 0 0 689 683 ;
+C 77 ; WX 1200 ; N M ; B 0 0 1200 683 ;
+C 78 ; WX 820 ; N N ; B 0 0 820 683 ;
+C 79 ; WX 796 ; N O ; B 0 0 796 683 ;
+C 80 ; WX 695 ; N P ; B 0 0 695 683 ;
+C 81 ; WX 816 ; N Q ; B 0 -97 816 683 ;
+C 82 ; WX 847 ; N R ; B 0 0 847 683 ;
+C 83 ; WX 605 ; N S ; B 0 0 605 683 ;
+C 84 ; WX 544 ; N T ; B 0 0 544 683 ;
+C 85 ; WX 625 ; N U ; B 0 0 625 683 ;
+C 86 ; WX 612 ; N V ; B 0 0 612 683 ;
+C 87 ; WX 987 ; N W ; B 0 0 987 683 ;
+C 88 ; WX 713 ; N X ; B 0 0 713 683 ;
+C 89 ; WX 668 ; N Y ; B 0 -97 668 683 ;
+C 90 ; WX 724 ; N Z ; B 0 0 724 683 ;
+C 91 ; WX 666 ; N C91 ; B 0 0 666 555 ;
+C 92 ; WX 666 ; N C92 ; B 0 0 666 555 ;
+C 93 ; WX 666 ; N C93 ; B 0 0 666 555 ;
+C 94 ; WX 666 ; N C94 ; B 0 0 666 555 ;
+C 95 ; WX 666 ; N C95 ; B 0 0 666 555 ;
+C 96 ; WX 611 ; N C96 ; B 0 0 611 694 ;
+C 97 ; WX 611 ; N a ; B 0 0 611 694 ;
+C 98 ; WX 444 ; N b ; B 0 -250 444 750 ;
+C 99 ; WX 444 ; N c ; B 0 -250 444 750 ;
+C 100 ; WX 444 ; N d ; B 0 -250 444 750 ;
+C 101 ; WX 444 ; N e ; B 0 -250 444 750 ;
+C 102 ; WX 500 ; N f ; B 0 -250 500 750 ;
+C 103 ; WX 500 ; N g ; B 0 -250 500 750 ;
+C 104 ; WX 388 ; N h ; B 0 -250 388 750 ;
+C 105 ; WX 388 ; N i ; B 0 -250 388 750 ;
+C 106 ; WX 277 ; N j ; B 0 -250 277 750 ;
+C 107 ; WX 500 ; N k ; B 0 -250 500 750 ;
+C 108 ; WX 500 ; N l ; B 0 -250 500 750 ;
+C 109 ; WX 611 ; N m ; B 0 -250 611 750 ;
+C 110 ; WX 500 ; N n ; B 0 -250 500 750 ;
+C 111 ; WX 277 ; N o ; B 0 -194 277 694 ;
+C 112 ; WX 833 ; N p ; B 0 -960 833 39 ;
+C 113 ; WX 750 ; N q ; B 0 0 750 683 ;
+C 114 ; WX 833 ; N r ; B 0 0 833 683 ;
+C 115 ; WX 416 ; N s ; B 0 -194 416 694 ;
+C 116 ; WX 666 ; N t ; B 0 0 666 555 ;
+C 117 ; WX 666 ; N u ; B 0 0 666 555 ;
+C 118 ; WX 777 ; N v ; B 0 -135 777 635 ;
+C 119 ; WX 777 ; N w ; B 0 -135 777 635 ;
+C 120 ; WX 444 ; N x ; B 0 -194 444 694 ;
+C 121 ; WX 444 ; N y ; B 0 -194 444 694 ;
+C 122 ; WX 444 ; N z ; B 0 -194 444 694 ;
+C 123 ; WX 611 ; N C123 ; B 0 -194 611 694 ;
+C 124 ; WX 777 ; N C124 ; B 0 -129 777 694 ;
+C 125 ; WX 777 ; N C125 ; B 0 -129 777 694 ;
+C 126 ; WX 777 ; N C126 ; B 0 -129 777 694 ;
+C 127 ; WX 777 ; N C127 ; B 0 -129 777 694 ;
+EndCharMetrics
+
+StartKernData
+StartKernPairs 26
+KPX A C48 194
+KPX B C48 138
+KPX C C48 138
+KPX D C48 83
+KPX E C48 111
+KPX F C48 111
+KPX G C48 111
+KPX H C48 111
+KPX I C48 27
+KPX J C48 166
+KPX K C48 55
+KPX L C48 138
+KPX M C48 138
+KPX N C48 83
+KPX O C48 111
+KPX P C48 83
+KPX Q C48 111
+KPX R C48 83
+KPX S C48 138
+KPX T C48 27
+KPX U C48 83
+KPX V C48 27
+KPX W C48 83
+KPX X C48 138
+KPX Y C48 83
+KPX Z C48 138
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/src/fonts/texcmsy.gle b/src/fonts/texcmsy.gle
new file mode 100644
index 0000000..71a70e8
--- /dev/null
+++ b/src/fonts/texcmsy.gle
@@ -0,0 +1,5780 @@
+dfont file_name="CMSY10"
+dfont font_name="CMSY10"
+dfont design= .35146
+dfont slant= .25
+dfont space= 0
+dfont stretch= 0
+dfont shrink= 0
+dfont x_hei= .151323
+dfont quad= .351461
+dfont extra_space= 0
+dfont mathspace= 0
+dfont num1= .676508
+dfont num2= .393732
+dfont num3= .443731
+dfont denom1= .685951
+dfont denom2= .344841
+dfont sup1= .412892
+dfont sup2= .362892
+dfont sup3= .288889
+dfont sub1= .15
+dfont sub2= .247217
+dfont supdrop= .386108
+dfont subdrop= .500002E-01
+dfont delim1= 2.39
+dfont delim2= 1.01
+dfont axisheight= .25
+dfont paint="FILL"
+!------------------ end of main parameters
+dfont char=0 !-------------- Beginning of new char.
+dfont wid=.777781 hei=.583334 dep=.083334 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .238125 .09398
+aline .239395 .093345
+aline .240665 .09271
+aline .241935 .09144
+aline .243205 .0889
+aline .243205 .08509
+aline .241935 .08255
+aline .240665 .08128
+aline .238125 .08001
+aline .034925 .08001
+aline .032385 .08128
+aline .031115 .08255
+aline .029845 .08509
+aline .029845 .0889
+aline .031115 .09144
+aline .032385 .09271
+aline .033655 .093345
+aline .034925 .09398
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=1 !-------------- Beginning of new char.
+dfont wid=.277779 hei=.444446 dep=-.0555544 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .05207 .10541
+bezier .707024E-01 .103541 .728738E-01 .742143E-01 .05461 .06985
+bezier .370706E-01 .634893E-01 .226261E-01 .087982 .036195 .10033
+aline .037465 .100965
+aline .03937 .10287
+aline .04191 .10414
+aline .043815 .104775
+aline .046355 .10541
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=2 !-------------- Beginning of new char.
+dfont wid=.777781 hei=.583334 dep=.083334 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .06096 .17145
+aline .06223 .170815
+aline .0635 .17018
+aline .136525 .097155
+aline .20955 .17018
+aline .21209 .17145
+aline .2159 .17145
+aline .21844 .17018
+aline .21971 .16891
+aline .22098 .16637
+aline .22098 .16256
+aline .21971 .16002
+aline .146685 .086995
+aline .21971 .01397
+aline .22098 .01143
+aline .22098 .00762
+aline .21971 .00508
+aline .21844 .00381
+aline .2159 .00254
+aline .21209 .00254
+aline .20955 .00381
+aline .136525 .076835
+aline .0635 .00381
+aline .06096 .00254
+aline .05715 .00254
+aline .05461 .00381
+aline .05334 .00508
+aline .05207 .00762
+aline .05207 .01143
+aline .05334 .01397
+aline .126365 .086995
+aline .05334 .16002
+aline .05207 .16256
+aline .05207 .16637
+aline .05334 .16891
+aline .05461 .17018
+aline .05588 .170815
+aline .05715 .17145
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=3 !-------------- Beginning of new char.
+dfont wid=.500002 hei=.465279 dep=-.0347214 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .09017 .16256
+bezier .101142 .159252 .955271E-01 .146238 .09525 .13843
+bezier .952399E-01 .123648 .915187E-01 .10902 .09271 .094615
+bezier .108902 .106404 .124765 .11865 .141605 .12954
+bezier .152359 .132005 .157055 .114139 .14605 .11176
+aline .12954 .103505
+aline .127635 .10287
+aline .112395 .09525
+aline .11049 .094615
+aline .969433E-01 .878417E-01
+bezier .112515 .773048E-01 .1336 .704698E-01 .150495 .060325
+bezier .158115 .516396E-01 .143992 .390531E-01 .136525 .04826
+bezier .12165 .581374E-01 .106557 .710661E-01 .092075 .079375
+bezier .927917E-01 .058423 .964836E-01 .378121E-01 .09652 .017145
+bezier .932013E-01 .830594E-02 .770942E-01 .118955E-01 .079375 .020955
+bezier .796694E-01 .408721E-01 .839891E-01 .605135E-01 .083185 .08001
+bezier .669925E-01 .682214E-01 .511298E-01 .559754E-01 .03429 .045085
+bezier .235363E-01 .426204E-01 .188399E-01 .604855E-01 .029845 .062865
+aline .046355 .07112
+aline .04826 .071755
+aline .0635 .079375
+aline .065405 .08001
+aline .789517E-01 .867833E-01
+bezier .633795E-01 .973203E-01 .042295 .104155 .0254 .1143
+bezier .177803E-01 .122985 .319028E-01 .135572 .03937 .126365
+bezier .542445E-01 .116488 .693384E-01 .103559 .08382 .09525
+bezier .830668E-01 .116187 .794624E-01 .136834 .079375 .15748
+aline .08001 .158115
+aline .080645 .159385
+aline .081915 .160655
+aline .083185 .16129
+aline .08382 .161925
+aline .085725 .16256
+closepath
+! end of curve
+
+! start of curve
+amove .08382 .09525
+aline .083185 .094615
+aline .08382 .09398
+aline .084455 .094615
+aline .08382 .09525
+closepath
+! end of curve
+
+! start of curve
+amove .092075 .09398
+aline .09271 .094615
+aline .092075 .09525
+aline .09144 .094615
+aline .092075 .09398
+closepath
+! end of curve
+
+! start of curve
+amove .083185 .08001
+aline .08382 .079375
+aline .084455 .08001
+aline .08382 .080645
+aline .083185 .08001
+closepath
+! end of curve
+
+! start of curve
+amove .09144 .08001
+aline .092075 .079375
+aline .09271 .08001
+aline .092075 .080645
+aline .09144 .08001
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=4 !-------------- Beginning of new char.
+dfont wid=.777781 hei=.583334 dep=.083334 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .140335 .184785
+bezier .16196 .182376 .165493 .148963 .14478 .14224
+bezier .125321 .133785 .105907 .15908 .118745 .175895
+aline .12319 .18034
+aline .12446 .180975
+aline .125095 .18161
+aline .128905 .183515
+aline .13081 .18415
+aline .13335 .184785
+closepath
+! end of curve
+
+! start of curve
+amove .248285 .09398
+aline .249555 .093345
+aline .250825 .09271
+aline .252095 .09144
+aline .253365 .0889
+aline .253365 .08509
+aline .252095 .08255
+aline .250825 .08128
+aline .248285 .08001
+aline .0254 .08001
+aline .02286 .08128
+aline .02159 .08255
+aline .02032 .08509
+aline .02032 .0889
+aline .02159 .09144
+aline .02286 .09271
+aline .02413 .093345
+aline .0254 .09398
+closepath
+! end of curve
+
+! start of curve
+amove .140335 .03302
+bezier .16196 .306109E-01 .165493 -.280197E-02 .14478 -.009525
+bezier .125321 -.179805E-01 .105907 .731469E-02 .118745 .02413
+aline .12319 .028575
+aline .12446 .02921
+aline .125095 .029845
+aline .128905 .03175
+aline .13081 .032385
+aline .13335 .03302
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=5 !-------------- Beginning of new char.
+dfont wid=.500002 hei=.444446 dep=-.0555544 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .09017 .17018
+aline .09144 .169545
+aline .09271 .16891
+aline .17018 .09144
+aline .17145 .0889
+aline .17145 .08509
+aline .17018 .08255
+aline .09271 .00508
+aline .09017 .00381
+aline .08636 .00381
+aline .08382 .00508
+aline .00635 .08255
+aline .00508 .08509
+aline .00508 .0889
+aline .00635 .09144
+aline .08382 .16891
+aline .08509 .169545
+aline .08636 .17018
+closepath
+! end of curve
+
+! start of curve
+amove .022225 .086995
+aline .088265 .020955
+aline .154305 .086995
+aline .088265 .153035
+aline .022225 .086995
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=6 !-------------- Beginning of new char.
+dfont wid=.777781 hei=.583334 dep=.083334 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .13843 .233045
+aline .1397 .23241
+aline .14097 .231775
+aline .14224 .230505
+aline .14351 .227965
+aline .14351 .123825
+aline .144145 .12319
+aline .24765 .12319
+aline .25019 .12192
+aline .25146 .12065
+aline .25273 .11811
+aline .25273 .1143
+aline .25146 .11176
+aline .25019 .11049
+aline .24765 .10922
+aline .144145 .10922
+aline .14351 .108585
+aline .14351 .01397
+aline .144145 .013335
+aline .24765 .013335
+aline .25019 .012065
+aline .25146 .010795
+aline .25273 .008255
+aline .25273 .004445
+aline .25146 .001905
+aline .25019 .000635
+aline .24765 -.000635
+aline .0254 -.000635
+aline .02286 .000635
+aline .02159 .001905
+aline .02032 .004445
+aline .02032 .008255
+aline .02159 .010795
+aline .02286 .012065
+aline .0254 .013335
+aline .128905 .013335
+aline .12954 .01397
+aline .12954 .108585
+aline .128905 .10922
+aline .0254 .10922
+aline .02286 .11049
+aline .02159 .11176
+aline .02032 .1143
+aline .02032 .11811
+aline .02159 .12065
+aline .02286 .12192
+aline .0254 .12319
+aline .128905 .12319
+aline .12954 .123825
+aline .12954 .227965
+aline .13081 .230505
+aline .13208 .231775
+aline .13335 .23241
+aline .13462 .233045
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=7 !-------------- Beginning of new char.
+dfont wid=.777781 hei=.583334 dep=.083334 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .24765 .174625
+aline .24892 .17399
+aline .25019 .173355
+aline .25146 .172085
+aline .25273 .169545
+aline .25273 .165735
+aline .25146 .163195
+aline .25019 .161925
+aline .24765 .160655
+aline .144145 .160655
+aline .14351 .16002
+aline .14351 .065405
+aline .144145 .06477
+aline .24765 .06477
+aline .25019 .0635
+aline .25146 .06223
+aline .25273 .05969
+aline .25273 .05588
+aline .25146 .05334
+aline .25019 .05207
+aline .24765 .0508
+aline .144145 .0508
+aline .14351 .050165
+aline .14351 -.053975
+aline .14224 -.056515
+aline .14097 -.057785
+aline .13843 -.059055
+aline .13462 -.059055
+aline .13208 -.057785
+aline .13081 -.056515
+aline .12954 -.053975
+aline .12954 .050165
+aline .128905 .0508
+aline .0254 .0508
+aline .02286 .05207
+aline .02159 .05334
+aline .02032 .05588
+aline .02032 .05969
+aline .02159 .06223
+aline .02286 .0635
+aline .0254 .06477
+aline .128905 .06477
+aline .12954 .065405
+aline .12954 .16002
+aline .128905 .160655
+aline .0254 .160655
+aline .02286 .161925
+aline .02159 .163195
+aline .02032 .165735
+aline .02032 .169545
+aline .02159 .172085
+aline .02286 .173355
+aline .02413 .17399
+aline .0254 .174625
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=8 !-------------- Beginning of new char.
+dfont wid=.777781 hei=.583334 dep=.083334 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .145415 .203835
+bezier .200427 .200683 .2501 .151974 .252095 .09652
+bezier .259936 .035818 .208465 -.270318E-01 .14605 -.02921
+bezier .848529E-01 -.372143E-01 .229356E-01 .156344E-01 .020955 .07747
+bezier .131144E-01 .138172 .064585 .201022 .127 .2032
+aline .127635 .203835
+aline .145415 .203835
+closepath
+! end of curve
+
+! start of curve
+amove .12827 .194945
+bezier .755474E-01 .192707 .289001E-01 .143862 .02921 .09144
+aline .13208 .09144
+aline .132715 .092075
+aline .132715 .194945
+aline .13208 .19558
+aline .128905 .19558
+aline .12827 .194945
+closepath
+! end of curve
+
+! start of curve
+amove .14097 .194945
+aline .14097 .092075
+aline .141605 .09144
+aline .24384 .09144
+bezier .244211 .145093 .195076 .195183 .14097 .194945
+closepath
+! end of curve
+
+! start of curve
+amove .028575 .08255
+bezier .298591E-01 .326254E-01 .712686E-01 -.154399E-01 .122555 -.02032
+aline .12319 -.020955
+aline .12827 -.020955
+aline .128905 -.02159
+aline .13208 -.02159
+aline .132715 -.020955
+aline .132715 .08255
+aline .13208 .083185
+aline .02921 .083185
+aline .028575 .08255
+closepath
+! end of curve
+
+! start of curve
+amove .14097 .08255
+aline .14097 -.020955
+bezier .193831 -.211505E-01 .241783 .264676E-01 .24384 .07874
+aline .244475 .079375
+aline .244475 .08255
+aline .24384 .083185
+aline .141605 .083185
+aline .14097 .08255
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=9 !-------------- Beginning of new char.
+dfont wid=.777781 hei=.583334 dep=.083334 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .145415 .203835
+bezier .200427 .200683 .2501 .151974 .252095 .09652
+bezier .259936 .035818 .208465 -.270318E-01 .14605 -.02921
+bezier .848529E-01 -.372143E-01 .229356E-01 .156344E-01 .020955 .07747
+bezier .131144E-01 .138172 .064585 .201022 .127 .2032
+aline .127635 .203835
+aline .145415 .203835
+closepath
+! end of curve
+
+! start of curve
+amove .12827 .194945
+bezier .755474E-01 .192707 .289001E-01 .143862 .02921 .09144
+aline .24384 .09144
+bezier .24415 .143862 .197503 .192707 .14478 .194945
+aline .144145 .19558
+aline .128905 .19558
+aline .12827 .194945
+closepath
+! end of curve
+
+! start of curve
+amove .028575 .08255
+bezier .298591E-01 .326254E-01 .712686E-01 -.154399E-01 .122555 -.02032
+bezier .178159 -.301672E-01 .237898 .153034E-01 .243205 .07239
+aline .24384 .073025
+aline .24384 .07874
+aline .244475 .079375
+aline .244475 .08255
+aline .24384 .083185
+aline .02921 .083185
+aline .028575 .08255
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=10 !-------------- Beginning of new char.
+dfont wid=.777781 hei=.583334 dep=.083334 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .145415 .203835
+bezier .200427 .200683 .2501 .151974 .252095 .09652
+bezier .259936 .035818 .208465 -.270318E-01 .14605 -.02921
+bezier .848529E-01 -.372143E-01 .229356E-01 .156344E-01 .020955 .07747
+bezier .131144E-01 .138172 .064585 .201022 .127 .2032
+aline .127635 .203835
+aline .145415 .203835
+closepath
+! end of curve
+
+! start of curve
+amove .12827 .194945
+bezier .104964 .193413 .805105E-01 .183237 .636588E-01 .166688
+aline .064135 .165735
+aline .136525 .093345
+aline .208915 .165735
+bezier .206572 .171992 .197338 .175764 .19177 .18034
+bezier .1723 .191141 .149825 .197487 .12827 .194945
+closepath
+! end of curve
+
+! start of curve
+amove .056515 .16002
+bezier .019348 .119179 .019589 .538436E-01 .05715 .013335
+aline .13081 .086995
+aline .05715 .160655
+aline .056515 .16002
+closepath
+! end of curve
+
+! start of curve
+amove .14224 .086995
+aline .2159 .013335
+bezier .253689 .540471E-01 .253689 .119943 .2159 .160655
+aline .14224 .086995
+closepath
+! end of curve
+
+! start of curve
+amove .064135 .008255
+bezier .664775E-01 .199865E-02 .757122E-01 -.17742E-02 .08128 -.00635
+bezier .121505 -.306368E-01 .175426 -.251737E-01 .209391 .73025E-02
+aline .208915 .008255
+aline .136525 .080645
+aline .064135 .008255
+aline .636588E-01 .73025E-02
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=11 !-------------- Beginning of new char.
+dfont wid=.777781 hei=.583334 dep=.083334 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .145415 .203835
+bezier .200427 .200683 .2501 .151974 .252095 .09652
+bezier .259936 .035818 .208465 -.270318E-01 .14605 -.02921
+bezier .848529E-01 -.372143E-01 .229356E-01 .156344E-01 .020955 .07747
+bezier .131144E-01 .138172 .064585 .201022 .127 .2032
+aline .127635 .203835
+aline .145415 .203835
+closepath
+! end of curve
+
+! start of curve
+amove .12827 .194945
+bezier .706363E-01 .192785 .224465E-01 .134921 .02921 .07874
+bezier .304029E-01 .553713E-01 .411138E-01 .310508E-01 .05715 .013335
+aline .132715 .0889
+aline .13335 .09017
+aline .208915 .165735
+bezier .206572 .171992 .197338 .175764 .19177 .18034
+bezier .1723 .191141 .149825 .197487 .12827 .194945
+closepath
+! end of curve
+
+! start of curve
+amove .140335 .08509
+aline .1397 .08382
+aline .064135 .008255
+bezier .664775E-01 .199865E-02 .757122E-01 -.17742E-02 .08128 -.00635
+bezier .134644 -.401337E-01 .212547 -.149031E-01 .235585 .04445
+bezier .252782 .828325E-01 .244264 .129126 .2159 .160655
+aline .140335 .08509
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=12 !-------------- Beginning of new char.
+dfont wid=.777781 hei=.583334 dep=.083334 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .145415 .203835
+bezier .200427 .200683 .2501 .151974 .252095 .09652
+bezier .259936 .035818 .208465 -.270318E-01 .14605 -.02921
+bezier .848529E-01 -.372143E-01 .229356E-01 .156344E-01 .020955 .07747
+bezier .131144E-01 .138172 .064585 .201022 .127 .2032
+aline .127635 .203835
+aline .145415 .203835
+closepath
+! end of curve
+
+! start of curve
+amove .12827 .194945
+bezier .706363E-01 .192785 .224465E-01 .134921 .02921 .07874
+bezier .310975E-01 .216031E-01 .881735E-01 -.277929E-01 .14478 -.020955
+bezier .202414 -.187951E-01 .250604 .390691E-01 .24384 .09525
+bezier .241779 .146322 .196245 .192671 .14478 .194945
+aline .144145 .19558
+aline .128905 .19558
+aline .12827 .194945
+closepath
+! end of curve
+
+! start of curve
+amove .140335 .11049
+bezier .162825 .108304 .167334 .073735 .146685 .065405
+bezier .129102 .566327E-01 .107545 .744308E-01 .113665 .093345
+aline .114935 .097155
+aline .116205 .099695
+aline .11684 .10033
+aline .117475 .1016
+aline .12192 .106045
+aline .12319 .10668
+aline .123825 .107315
+aline .126365 .108585
+aline .130175 .109855
+aline .132715 .11049
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=13 !-------------- Beginning of new char.
+dfont wid=1 hei=.694445 dep=.194445 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .18542 .25019
+bezier .254121 .246417 .315338 .189875 .32766 .121285
+bezier .341953 .550388E-01 .311993 -.231131E-01 .25019 -.05715
+bezier .18462 -.963153E-01 .944676E-01 -.075074 .051435 -.012065
+bezier -.24798E-02 .608166E-01 .150603E-01 .174809 .092075 .22479
+bezier .119679 .243725 .15281 .251766 .18542 .25019
+closepath
+! end of curve
+
+! start of curve
+amove .16637 .235585
+bezier .954976E-01 .232818 .365256E-01 .165654 .034925 .09652
+bezier .278061E-01 .254156E-01 .808917E-01 -.513709E-01 .15494 -.06096
+bezier .222872 -.739414E-01 .295142 -.231007E-01 .31115 .045085
+bezier .334629 .12023 .287878 .215035 .206375 .23241
+aline .200025 .23368
+aline .19939 .234315
+aline .196215 .234315
+aline .19558 .23495
+aline .19177 .23495
+aline .191135 .235585
+aline .184785 .235585
+aline .18415 .23622
+aline .167005 .23622
+aline .16637 .235585
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=14 !-------------- Beginning of new char.
+dfont wid=.500002 hei=.444446 dep=-.0555544 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .094615 .15494
+bezier .137924 .151992 .16835 .102 .15113 .06223
+bezier .136361 .191105E-01 .762909E-01 .47242E-02 .04318 .03556
+bezier .858985E-02 .064264 .143448E-01 .124824 .053975 .14605
+aline .061595 .14986
+aline .0635 .150495
+aline .06477 .15113
+aline .06858 .1524
+aline .07366 .15367
+aline .076835 .154305
+aline .080645 .154305
+aline .08128 .15494
+aline .094615 .15494
+closepath
+! end of curve
+
+! start of curve
+amove .081915 .140335
+bezier .426379E-01 .137725 .198661E-01 .864699E-01 .04445 .05588
+bezier .653034E-01 .232018E-01 .118308 .270318E-01 .135255 .061595
+bezier .153669 .092803 .130519 .137775 .09398 .140335
+aline .093345 .14097
+aline .08255 .14097
+aline .081915 .140335
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=15 !-------------- Beginning of new char.
+dfont wid=.500002 hei=.444446 dep=-.0555544 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .094615 .15494
+bezier .137924 .151992 .16835 .102 .15113 .06223
+bezier .136361 .191105E-01 .762909E-01 .47242E-02 .04318 .03556
+bezier .858985E-02 .064264 .143448E-01 .124824 .053975 .14605
+aline .061595 .14986
+aline .0635 .150495
+aline .06477 .15113
+aline .06858 .1524
+aline .07366 .15367
+aline .076835 .154305
+aline .080645 .154305
+aline .08128 .15494
+aline .094615 .15494
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=16 !-------------- Beginning of new char.
+dfont wid=.777781 hei=.463748 dep=-.036252 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .02921 .169545
+bezier .686224E-01 .136713 .123119 .112952 .173355 .130175
+bezier .199902 .137653 .222586 .153246 .24384 .169545
+aline .24765 .169545
+aline .25019 .168275
+bezier .258573 .159277 .24428 .153149 .23876 .147955
+bezier .191949 .111203 .126801 .976403E-01 .07239 .125095
+bezier .536025E-01 .134809 .343466E-01 .145152 .02032 .160655
+aline .02032 .164465
+aline .02159 .167005
+aline .02286 .168275
+aline .02413 .16891
+aline .0254 .169545
+closepath
+! end of curve
+
+! start of curve
+amove .14605 .0635
+bezier .184908 .601377E-01 .2251 .409145E-01 .25273 .013335
+aline .25273 .009525
+bezier .248776 -.543458E-03 .238379 .694044E-02 .23368 .012065
+bezier .191699 .454729E-01 .133804 .619387E-01 .08382 .0381
+bezier .634985E-01 .302212E-01 .463356E-01 .171174E-01 .02921 .004445
+aline .0254 .004445
+aline .02286 .005715
+bezier .144773E-01 .147128E-01 .287702E-01 .208407E-01 .03429 .026035
+bezier .661472E-01 .498778E-01 .106011 .662292E-01 .14605 .0635
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=17 !-------------- Beginning of new char.
+dfont wid=.777781 hei=.463748 dep=-.036252 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .24765 .16256
+aline .24892 .161925
+aline .25019 .16129
+aline .25146 .16002
+aline .25273 .15748
+aline .25273 .15367
+aline .25146 .15113
+aline .25019 .14986
+aline .24765 .14859
+aline .0254 .14859
+aline .02286 .14986
+aline .02159 .15113
+aline .02032 .15367
+aline .02032 .15748
+aline .02159 .16002
+aline .02286 .16129
+aline .02413 .161925
+aline .0254 .16256
+closepath
+! end of curve
+
+! start of curve
+amove .24765 .09398
+aline .24892 .093345
+aline .25019 .09271
+aline .25146 .09144
+aline .25273 .0889
+aline .25273 .08509
+aline .25146 .08255
+aline .25019 .08128
+aline .24765 .08001
+aline .0254 .08001
+aline .02286 .08128
+aline .02159 .08255
+aline .02032 .08509
+aline .02032 .0889
+aline .02159 .09144
+aline .02286 .09271
+aline .02413 .093345
+aline .0254 .09398
+closepath
+! end of curve
+
+! start of curve
+amove .24765 .0254
+aline .24892 .024765
+aline .25019 .02413
+aline .25146 .02286
+aline .25273 .02032
+aline .25273 .01651
+aline .25146 .01397
+aline .25019 .0127
+aline .24765 .01143
+aline .0254 .01143
+aline .02286 .0127
+aline .02159 .01397
+aline .02032 .01651
+aline .02032 .02032
+aline .02159 .02286
+aline .02286 .02413
+aline .02413 .024765
+aline .0254 .0254
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=18 !-------------- Beginning of new char.
+dfont wid=.777781 hei=.635971 dep=.135971 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .238125 .22225
+aline .239395 .221615
+aline .240665 .22098
+aline .241935 .21971
+aline .243205 .21717
+aline .243205 .21336
+aline .241935 .21082
+aline .240665 .20955
+aline .238125 .20828
+aline .128905 .20828
+bezier .875894E-01 .205492 .466912E-01 .17129 .04445 .12827
+bezier .384179E-01 .831908E-01 .772482E-01 .387461E-01 .122555 .03429
+aline .12319 .033655
+aline .12827 .033655
+aline .128905 .03302
+aline .238125 .03302
+aline .240665 .03175
+aline .241935 .03048
+aline .243205 .02794
+aline .243205 .02413
+aline .241935 .02159
+aline .240665 .02032
+aline .238125 .01905
+aline .127635 .01905
+bezier .792153E-01 .216853E-01 .327627E-01 .625905E-01 .029845 .112395
+bezier .239282E-01 .167641 .719792E-01 .219878 .127 .221615
+aline .127635 .22225
+closepath
+! end of curve
+
+! start of curve
+amove .238125 -.03556
+aline .239395 -.036195
+aline .240665 -.03683
+aline .241935 -.0381
+aline .243205 -.04064
+aline .243205 -.04445
+aline .241935 -.04699
+aline .240665 -.04826
+aline .238125 -.04953
+aline .04191 -.04953
+aline .04064 -.048895
+aline .0381 -.046355
+aline .037465 -.045085
+aline .03683 -.04318
+aline .03683 -.04191
+aline .037465 -.040005
+aline .0381 -.038735
+aline .04064 -.036195
+aline .04191 -.03556
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=19 !-------------- Beginning of new char.
+dfont wid=.777781 hei=.635971 dep=.135971 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .145415 .22225
+bezier .193835 .219615 .240287 .178709 .243205 .128905
+bezier .249122 .736594E-01 .201071 .021422 .14605 .019685
+aline .145415 .01905
+aline .034925 .01905
+aline .032385 .02032
+aline .031115 .02159
+aline .029845 .02413
+aline .029845 .02794
+aline .031115 .03048
+aline .032385 .03175
+aline .034925 .03302
+aline .144145 .03302
+bezier .185461 .358078E-01 .226359 .700098E-01 .2286 .11303
+bezier .234632 .158109 .195802 .202554 .150495 .20701
+aline .14986 .207645
+aline .14478 .207645
+aline .144145 .20828
+aline .034925 .20828
+aline .032385 .20955
+aline .031115 .21082
+aline .029845 .21336
+aline .029845 .21717
+aline .031115 .21971
+aline .032385 .22098
+aline .034925 .22225
+aline .145415 .22225
+closepath
+! end of curve
+
+! start of curve
+amove .23114 -.03556
+aline .23241 -.036195
+aline .23495 -.038735
+aline .235585 -.040005
+aline .23622 -.04191
+aline .23622 -.04318
+aline .235585 -.045085
+aline .23495 -.046355
+aline .23241 -.048895
+aline .23114 -.04953
+aline .034925 -.04953
+aline .032385 -.04826
+aline .031115 -.04699
+aline .029845 -.04445
+aline .029845 -.04064
+aline .031115 -.0381
+aline .032385 -.03683
+aline .033655 -.036195
+aline .034925 -.03556
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=20 !-------------- Beginning of new char.
+dfont wid=.777781 hei=.635971 dep=.135971 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .238125 .22225
+aline .239395 .221615
+aline .240665 .22098
+aline .241935 .21971
+aline .243205 .21717
+aline .243205 .21336
+aline .241935 .21082
+bezier .179806 .179678 .116122 .150793 .05334 .12065
+bezier .116122 .090507 .179806 .616225E-01 .241935 .03048
+aline .243205 .02794
+aline .243205 .02413
+aline .241935 .02159
+aline .240665 .02032
+aline .238125 .01905
+aline .234315 .01905
+bezier .166699 .051604 .981046E-01 .827149E-01 .031115 .116205
+aline .029845 .118745
+aline .029845 .122555
+aline .031115 .125095
+bezier .981046E-01 .158585 .166699 .189696 .234315 .22225
+aline .238125 .22225
+closepath
+! end of curve
+
+! start of curve
+amove .238125 -.03556
+aline .239395 -.036195
+aline .240665 -.03683
+aline .241935 -.0381
+aline .243205 -.04064
+aline .243205 -.04445
+aline .241935 -.04699
+aline .240665 -.04826
+aline .238125 -.04953
+aline .034925 -.04953
+aline .032385 -.04826
+aline .031115 -.04699
+aline .029845 -.04445
+aline .029845 -.04064
+aline .031115 -.0381
+aline .032385 -.03683
+aline .033655 -.036195
+aline .034925 -.03556
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=21 !-------------- Beginning of new char.
+dfont wid=.777781 hei=.635971 dep=.135971 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .038735 .22225
+bezier .106351 .189696 .174945 .158585 .241935 .125095
+aline .243205 .122555
+aline .243205 .118745
+aline .241935 .116205
+bezier .174945 .827149E-01 .106351 .516041E-01 .038735 .01905
+aline .034925 .01905
+aline .032385 .02032
+aline .031115 .02159
+aline .029845 .02413
+aline .029845 .02794
+aline .031115 .03048
+bezier .932442E-01 .616225E-01 .156928 .090507 .21971 .12065
+bezier .156928 .150793 .932442E-01 .179677 .031115 .21082
+aline .029845 .21336
+aline .029845 .21717
+aline .031115 .21971
+aline .032385 .22098
+aline .033655 .221615
+aline .034925 .22225
+closepath
+! end of curve
+
+! start of curve
+amove .238125 -.03556
+aline .239395 -.036195
+aline .240665 -.03683
+aline .241935 -.0381
+aline .243205 -.04064
+aline .243205 -.04445
+aline .241935 -.04699
+aline .240665 -.04826
+aline .238125 -.04953
+aline .034925 -.04953
+aline .032385 -.04826
+aline .031115 -.04699
+aline .029845 -.04445
+aline .029845 -.04064
+aline .031115 -.0381
+aline .032385 -.03683
+aline .033655 -.036195
+aline .034925 -.03556
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=22 !-------------- Beginning of new char.
+dfont wid=.777781 hei=.635971 dep=.135971 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .238125 .22225
+aline .239395 .221615
+aline .240665 .22098
+aline .241935 .21971
+bezier .245278 .196377 .230994 .172036 .213995 .15621
+bezier .1909 .136445 .160722 .126149 .13081 .12065
+bezier .179327 .112755 .234599 .867591E-01 .24257 .03302
+aline .24257 .029845
+aline .243205 .02921
+aline .243205 .02413
+aline .241935 .02159
+aline .240665 .02032
+aline .238125 .01905
+aline .234315 .01905
+aline .231775 .02032
+bezier .22667 .030409 .227446 .437844E-01 .220345 .053975
+bezier .196479 .965087E-01 .140657 .10524 .098425 .111125
+aline .092075 .111125
+aline .09144 .11176
+aline .084455 .11176
+aline .08382 .112395
+aline .074295 .112395
+aline .07366 .11303
+aline .059055 .11303
+aline .05842 .113665
+aline .034925 .113665
+aline .032385 .114935
+aline .031115 .116205
+aline .029845 .118745
+aline .029845 .122555
+aline .031115 .125095
+aline .032385 .126365
+aline .034925 .127635
+bezier .883921E-01 .1283 .140993 .129794 .189865 .15621
+bezier .213115 .168997 .227486 .194296 .230505 .21971
+aline .231775 .22098
+aline .233045 .221615
+aline .234315 .22225
+closepath
+! end of curve
+
+! start of curve
+amove .238125 -.03556
+aline .239395 -.036195
+aline .240665 -.03683
+aline .241935 -.0381
+aline .243205 -.04064
+aline .243205 -.04445
+aline .241935 -.04699
+aline .240665 -.04826
+aline .238125 -.04953
+aline .034925 -.04953
+aline .032385 -.04826
+aline .031115 -.04699
+aline .029845 -.04445
+aline .029845 -.04064
+aline .031115 -.0381
+aline .032385 -.03683
+aline .033655 -.036195
+aline .034925 -.03556
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=23 !-------------- Beginning of new char.
+dfont wid=.777781 hei=.635971 dep=.135971 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .038735 .22225
+aline .040005 .221615
+aline .041275 .22098
+bezier .463801E-01 .210891 .456039E-01 .197516 .052705 .187325
+bezier .765707E-01 .144791 .132393 .13606 .174625 .130175
+aline .180975 .130175
+aline .18161 .12954
+aline .188595 .12954
+aline .18923 .128905
+aline .198755 .128905
+aline .19939 .12827
+aline .213995 .12827
+aline .21463 .127635
+aline .238125 .127635
+aline .240665 .126365
+aline .241935 .125095
+aline .243205 .122555
+aline .243205 .118745
+aline .241935 .116205
+aline .240665 .114935
+aline .238125 .113665
+bezier .184658 .112999 .132057 .111505 .083185 .08509
+bezier .599346E-01 .072303 .455643E-01 .470038E-01 .042545 .02159
+aline .041275 .02032
+aline .038735 .01905
+aline .034925 .01905
+aline .032385 .02032
+aline .031115 .02159
+bezier .277717E-01 .449226E-01 .420556E-01 .692642E-01 .059055 .08509
+bezier .821496E-01 .104855 .112328 .115151 .14224 .12065
+bezier .937231E-01 .128545 .384511E-01 .154541 .03048 .20828
+aline .03048 .211455
+aline .029845 .21209
+aline .029845 .21717
+aline .031115 .21971
+aline .032385 .22098
+aline .033655 .221615
+aline .034925 .22225
+closepath
+! end of curve
+
+! start of curve
+amove .238125 -.03556
+aline .239395 -.036195
+aline .240665 -.03683
+aline .241935 -.0381
+aline .243205 -.04064
+aline .243205 -.04445
+aline .241935 -.04699
+aline .240665 -.04826
+aline .238125 -.04953
+aline .034925 -.04953
+aline .032385 -.04826
+aline .031115 -.04699
+aline .029845 -.04445
+aline .029845 -.04064
+aline .031115 -.0381
+aline .032385 -.03683
+aline .033655 -.036195
+aline .034925 -.03556
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=24 !-------------- Beginning of new char.
+dfont wid=.777781 hei=.366875 dep=-.133125 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .084455 .127635
+bezier .130142 .12201 .151337 .638688E-01 .19939 .06604
+bezier .225348 .691263E-01 .244931 .956897E-01 .243205 .121285
+aline .244475 .125095
+aline .247015 .127635
+aline .24892 .127635
+bezier .256563 .119819 .251251 .107314 .250825 .09779
+bezier .245252 .671709E-01 .215929 .401116E-01 .18415 .04699
+bezier .141055 .561582E-01 .120219 .109954 .07366 .10795
+bezier .462427E-01 .104775 .279974E-01 .764654E-01 .02921 .050165
+aline .028575 .048895
+aline .02794 .04826
+aline .027305 .04699
+aline .026035 .046355
+aline .02413 .046355
+aline .02159 .048895
+bezier .139428E-01 .856537E-01 .431535E-01 .13257 .084455 .127635
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=25 !-------------- Beginning of new char.
+dfont wid=.777781 hei=.483122 dep=-.0168781 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .08509 .168275
+bezier .128893 .163104 .158367 .113973 .20447 .12065
+bezier .223951 .124739 .244372 .140225 .243205 .161925
+aline .244475 .165735
+aline .247015 .168275
+aline .24892 .168275
+bezier .255996 .1616 .251986 .150123 .250825 .141605
+bezier .241883 .106228 .198391 .090502 .167005 .106045
+bezier .134421 .120213 .10666 .153597 .06858 .147955
+bezier .476804E-01 .143894 .281676E-01 .126667 .02921 .10414
+bezier .273082E-01 .975001E-01 .202857E-01 .101102 .02032 .10668
+bezier .161426E-01 .14206 .502912E-01 .173255 .08509 .168275
+closepath
+! end of curve
+
+! start of curve
+amove .08509 .08636
+bezier .128893 .811886E-01 .158367 .320581E-01 .20447 .038735
+bezier .223951 .428243E-01 .244372 .583099E-01 .243205 .08001
+aline .244475 .08382
+aline .247015 .08636
+aline .24892 .08636
+aline .25146 .08382
+bezier .260532 .047606 .2228 .118098E-01 .187325 .01905
+bezier .143425 .235581E-01 .114529 .730058E-01 .06858 .06604
+bezier .476931E-01 .619618E-01 .281608E-01 .447617E-01 .02921 .022225
+bezier .273082E-01 .155851E-01 .202857E-01 .191866E-01 .02032 .024765
+bezier .016138 .601514E-01 .503082E-01 .913161E-01 .08509 .08636
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=26 !-------------- Beginning of new char.
+dfont wid=.777781 hei=.539098 dep=.0390978 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .238125 .188595
+aline .239395 .18796
+aline .240665 .187325
+aline .241935 .186055
+aline .243205 .183515
+aline .243205 .179705
+aline .241935 .177165
+aline .240665 .175895
+aline .238125 .174625
+aline .128905 .174625
+bezier .875894E-01 .171837 .466912E-01 .137635 .04445 .094615
+bezier .384178E-01 .495359E-01 .772481E-01 .509115E-02 .122555 .000635
+aline .12319 0
+aline .12827 0
+aline .128905 -.000635
+aline .238125 -.000635
+aline .240665 -.001905
+aline .241935 -.003175
+aline .243205 -.005715
+aline .243205 -.009525
+aline .241935 -.012065
+aline .240665 -.013335
+aline .238125 -.014605
+aline .127635 -.014605
+bezier .792153E-01 -.119697E-01 .327627E-01 .289355E-01 .029845 .07874
+bezier .239282E-01 .133986 .719792E-01 .186223 .127 .18796
+aline .127635 .188595
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=27 !-------------- Beginning of new char.
+dfont wid=.777781 hei=.539098 dep=.0390978 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .145415 .188595
+bezier .193835 .18596 .240287 .145055 .243205 .09525
+bezier .249122 .400044E-01 .201071 -.122329E-01 .14605 -.01397
+aline .145415 -.014605
+aline .034925 -.014605
+aline .032385 -.013335
+aline .031115 -.012065
+aline .029845 -.009525
+aline .029845 -.005715
+aline .031115 -.003175
+aline .032385 -.001905
+aline .034925 -.000635
+aline .144145 -.000635
+bezier .185461 .21528E-02 .226359 .363548E-01 .2286 .079375
+bezier .234632 .124454 .195802 .168899 .150495 .173355
+aline .14986 .17399
+aline .14478 .17399
+aline .144145 .174625
+aline .034925 .174625
+aline .032385 .175895
+aline .031115 .177165
+aline .029845 .179705
+aline .029845 .183515
+aline .031115 .186055
+aline .032385 .187325
+aline .034925 .188595
+aline .145415 .188595
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=28 !-------------- Beginning of new char.
+dfont wid=1 hei=.539098 dep=.0390978 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .219075 .19812
+aline .220345 .197485
+aline .221615 .19685
+aline .222885 .19558
+aline .224155 .19304
+aline .224155 .18923
+bezier .218001 .180654 .205932 .178287 .197485 .172085
+bezier .145458 .143955 .939153E-01 .115154 .04191 .086995
+bezier .102245 .537774E-01 .163114 .213005E-01 .222885 -.0127
+aline .224155 -.01524
+aline .224155 -.01905
+aline .222885 -.02159
+aline .221615 -.02286
+aline .219075 -.02413
+bezier .204259 -.210227E-01 .19187 -.983661E-02 .1778 -.00381
+bezier .12598 .025324 .730581E-01 .529283E-01 .02159 .08255
+aline .02032 .08509
+aline .02032 .0889
+bezier .264736E-01 .974765E-01 .385434E-01 .998433E-01 .04699 .106045
+bezier .10322 .136544 .159072 .167569 .215265 .19812
+aline .219075 .19812
+closepath
+! end of curve
+
+! start of curve
+amove .325755 .19812
+aline .327025 .197485
+aline .328295 .19685
+aline .329565 .19558
+aline .330835 .19304
+aline .330835 .18923
+bezier .324681 .180654 .312612 .178287 .304165 .172085
+bezier .252138 .143955 .200595 .115154 .14859 .086995
+bezier .208925 .537775E-01 .269794 .213004E-01 .329565 -.0127
+aline .330835 -.01524
+aline .330835 -.01905
+aline .329565 -.02159
+aline .328295 -.02286
+aline .325755 -.02413
+bezier .310939 -.210227E-01 .29855 -.983661E-02 .28448 -.00381
+bezier .23266 .025324 .179738 .529283E-01 .12827 .08255
+aline .127 .08509
+aline .127 .0889
+bezier .133154 .974765E-01 .145223 .998433E-01 .15367 .106045
+bezier .2099 .136544 .265752 .167569 .321945 .19812
+aline .325755 .19812
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=29 !-------------- Beginning of new char.
+dfont wid=1 hei=.539098 dep=.0390978 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .02921 .19812
+bezier .937828E-01 .16258 .158862 .127743 .222885 .09144
+aline .224155 .0889
+aline .224155 .08509
+bezier .218001 .765135E-01 .205932 .741467E-01 .197485 .067945
+bezier .141255 .374457E-01 .854027E-01 .642145E-02 .02921 -.02413
+aline .0254 -.02413
+aline .02286 -.02286
+aline .02159 -.02159
+aline .02032 -.01905
+aline .02032 -.01524
+bezier .264736E-01 -.666353E-02 .385434E-01 -.42967E-02 .04699 .001905
+bezier .990167E-01 .300347E-01 .15056 .588356E-01 .202565 .086995
+bezier .14223 .120213 .813608E-01 .152689 .02159 .18669
+aline .02032 .18923
+aline .02032 .19304
+aline .02159 .19558
+aline .02286 .19685
+aline .02413 .197485
+aline .0254 .19812
+closepath
+! end of curve
+
+! start of curve
+amove .13589 .19812
+bezier .200463 .16258 .265542 .127743 .329565 .09144
+aline .330835 .0889
+aline .330835 .08509
+bezier .324681 .765135E-01 .312612 .741467E-01 .304165 .067945
+bezier .247935 .374457E-01 .192083 .642145E-02 .13589 -.02413
+aline .13208 -.02413
+aline .12954 -.02286
+aline .12827 -.02159
+aline .127 -.01905
+aline .127 -.01524
+bezier .133154 -.666353E-02 .145223 -.42967E-02 .15367 .001905
+bezier .205697 .300347E-01 .25724 .588356E-01 .309245 .086995
+bezier .24891 .120213 .188041 .152689 .12827 .18669
+aline .127 .18923
+aline .127 .19304
+aline .12827 .19558
+aline .12954 .19685
+aline .13081 .197485
+aline .13208 .19812
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=30 !-------------- Beginning of new char.
+dfont wid=.777781 hei=.539098 dep=.0390978 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .238125 .18796
+aline .239395 .187325
+aline .240665 .18669
+aline .241935 .18542
+bezier .245278 .162087 .230994 .137746 .213995 .12192
+bezier .1909 .102155 .160722 .918588E-01 .13081 .08636
+bezier .179327 .784645E-01 .234599 .524691E-01 .24257 -.00127
+aline .24257 -.004445
+aline .243205 -.00508
+aline .243205 -.01016
+aline .241935 -.0127
+aline .240665 -.01397
+aline .238125 -.01524
+aline .234315 -.01524
+aline .231775 -.01397
+bezier .22667 -.388099E-02 .227446 .949442E-02 .220345 .019685
+bezier .196479 .622187E-01 .140657 .709502E-01 .098425 .076835
+aline .092075 .076835
+aline .09144 .07747
+aline .084455 .07747
+aline .08382 .078105
+aline .074295 .078105
+aline .07366 .07874
+aline .059055 .07874
+aline .05842 .079375
+aline .034925 .079375
+aline .032385 .080645
+aline .031115 .081915
+aline .029845 .084455
+aline .029845 .088265
+aline .031115 .090805
+aline .032385 .092075
+aline .034925 .093345
+bezier .088392 .940105E-01 .140993 .955045E-01 .189865 .12192
+bezier .213115 .134707 .227486 .160006 .230505 .18542
+aline .231775 .18669
+aline .233045 .187325
+aline .234315 .18796
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=31 !-------------- Beginning of new char.
+dfont wid=.777781 hei=.539098 dep=.0390978 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .038735 .18796
+aline .040005 .187325
+aline .041275 .18669
+bezier .463801E-01 .176601 .456039E-01 .163226 .052705 .153035
+bezier .765706E-01 .110501 .132393 .10177 .174625 .095885
+aline .180975 .095885
+aline .18161 .09525
+aline .188595 .09525
+aline .18923 .094615
+aline .198755 .094615
+aline .19939 .09398
+aline .213995 .09398
+aline .21463 .093345
+aline .238125 .093345
+aline .240665 .092075
+aline .241935 .090805
+aline .243205 .088265
+aline .243205 .084455
+aline .241935 .081915
+aline .240665 .080645
+aline .238125 .079375
+bezier .184658 .787095E-01 .132057 .772155E-01 .083185 .0508
+bezier .599346E-01 .038013 .455644E-01 .127138E-01 .042545 -.0127
+aline .041275 -.01397
+aline .038735 -.01524
+aline .034925 -.01524
+aline .032385 -.01397
+aline .031115 -.0127
+bezier .277717E-01 .106326E-01 .420556E-01 .349742E-01 .059055 .0508
+bezier .821496E-01 .705655E-01 .112328 .808612E-01 .14224 .08636
+bezier .937231E-01 .942554E-01 .384511E-01 .120251 .03048 .17399
+aline .03048 .177165
+aline .029845 .1778
+aline .029845 .18288
+aline .031115 .18542
+aline .032385 .18669
+aline .033655 .187325
+aline .034925 .18796
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=32 !-------------- Beginning of new char.
+dfont wid=1 hei=.366875 dep=-.133125 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .084455 .149225
+aline .085725 .14859
+aline .086995 .14732
+bezier .865047E-01 .135251 .769461E-01 .124273 .070485 .1143
+aline .067945 .11176
+aline .06731 .11049
+aline .056515 .099695
+aline .055245 .09906
+aline .052705 .09652
+aline .051435 .095885
+aline .050165 .094615
+aline .0508 .09398
+aline .325755 .09398
+aline .328295 .09271
+aline .329565 .09144
+aline .330835 .0889
+aline .330835 .08509
+aline .329565 .08255
+aline .328295 .08128
+aline .325755 .08001
+aline .0508 .08001
+bezier .588791E-01 .710038E-01 .719593E-01 .607064E-01 .078105 .04826
+aline .07874 .047625
+aline .08001 .045085
+aline .080645 .04445
+aline .085725 .03429
+aline .08636 .032385
+bezier .921709E-01 .244938E-01 .766052E-01 .211784E-01 .0762 .029845
+bezier .665976E-01 .055883 .442111E-01 .736209E-01 .02032 .085725
+aline .02032 .088265
+bezier .453228E-01 .10075 .682495E-01 .119876 .07747 .14732
+aline .07874 .14859
+aline .08001 .149225
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=33 !-------------- Beginning of new char.
+dfont wid=1 hei=.366875 dep=-.133125 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .271145 .149225
+bezier .278563 .13966 .281962 .126063 .291465 .117475
+bezier .301375 .103848 .317214 .967422E-01 .330835 .088265
+aline .330835 .085725
+bezier .311315 .753579E-01 .29163 .620419E-01 .28067 .04191
+aline .27559 .03175
+bezier .276102 .245503E-01 .264362 .214067E-01 .263525 .02921
+bezier .270941 .492287E-01 .284243 .663811E-01 .30099 .079375
+aline .300355 .08001
+aline .0254 .08001
+aline .02286 .08128
+aline .02159 .08255
+aline .02032 .08509
+aline .02032 .0889
+aline .02159 .09144
+aline .02286 .09271
+aline .0254 .09398
+aline .300355 .09398
+bezier .292276 .102986 .279196 .113284 .27305 .12573
+aline .272415 .126365
+aline .271145 .128905
+aline .27051 .12954
+aline .26543 .1397
+aline .264795 .141605
+aline .26416 .142875
+aline .263525 .14478
+aline .263525 .14605
+aline .26416 .14732
+aline .26543 .14859
+aline .2667 .149225
+aline .271145 .149225
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=34 !-------------- Beginning of new char.
+dfont wid=.500002 hei=.694445 dep=.194443 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .089535 .24257
+bezier .101882 .217798 .121183 .194652 .14859 .18542
+aline .14986 .18415
+aline .150495 .18288
+aline .150495 .178435
+aline .14986 .177165
+aline .14859 .175895
+bezier .134609 .177063 .12228 .188066 .111125 .196215
+aline .100965 .206375
+aline .10033 .207645
+aline .09779 .210185
+aline .097155 .211455
+aline .095885 .212725
+aline .09525 .21209
+aline .09525 -.064135
+aline .09398 -.066675
+aline .09271 -.067945
+aline .09017 -.069215
+aline .08636 -.069215
+aline .08382 -.067945
+aline .08255 -.066675
+aline .08128 -.064135
+aline .08128 .21209
+bezier .723506E-01 .203904 .618374E-01 .191124 .04953 .184785
+bezier .430073E-01 .181155 .354102E-01 .175281 .02794 .175895
+aline .02667 .177165
+bezier .223864E-01 .187638 .371278E-01 .187362 .042545 .192405
+bezier .632247E-01 .202925 .763512E-01 .222741 .086995 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=35 !-------------- Beginning of new char.
+dfont wid=.500002 hei=.694445 dep=.194443 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .09017 .24257
+aline .09144 .241935
+aline .09271 .2413
+aline .09398 .24003
+aline .09525 .23749
+aline .09525 -.038735
+bezier .104179 -.305494E-01 .114693 -.177686E-01 .127 -.01143
+bezier .133523 -.780005E-02 .14112 -.192582E-02 .14859 -.00254
+aline .14986 -.00381
+bezier .154144 -.142829E-01 .139402 -.014007 .133985 -.01905
+bezier .113297 -.295028E-01 .100042 -.496424E-01 .089535 -.069215
+aline .086995 -.069215
+bezier .745148E-01 -.441818E-01 .055329 -.213755E-01 .02794 -.012065
+aline .02667 -.010795
+aline .026035 -.009525
+aline .026035 -.00508
+aline .02667 -.00381
+aline .02794 -.00254
+bezier .041921 -.37079E-02 .542498E-01 -.147106E-01 .065405 -.02286
+aline .075565 -.03302
+aline .0762 -.03429
+aline .07874 -.03683
+aline .079375 -.0381
+aline .080645 -.03937
+aline .08128 -.038735
+aline .08128 .23749
+aline .08255 .24003
+aline .08382 .2413
+aline .08509 .241935
+aline .08636 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=36 !-------------- Beginning of new char.
+dfont wid=1 hei=.366875 dep=-.133125 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .084455 .149225
+aline .085725 .14859
+aline .086995 .14732
+bezier .865047E-01 .135251 .769461E-01 .124273 .070485 .1143
+aline .067945 .11176
+aline .06731 .11049
+aline .056515 .099695
+aline .055245 .09906
+aline .052705 .09652
+aline .051435 .095885
+aline .050165 .094615
+aline .0508 .09398
+aline .300355 .09398
+bezier .292276 .102986 .279196 .113284 .27305 .12573
+aline .272415 .126365
+aline .271145 .128905
+aline .27051 .12954
+aline .26543 .1397
+aline .264795 .141605
+bezier .258984 .149496 .27455 .152812 .274955 .144145
+bezier .284484 .118097 .307192 .100218 .330835 .088265
+aline .330835 .085725
+bezier .311315 .753579E-01 .29163 .620419E-01 .28067 .04191
+aline .27559 .03175
+bezier .276102 .245503E-01 .264362 .214067E-01 .263525 .02921
+bezier .270941 .492287E-01 .284243 .663811E-01 .30099 .079375
+aline .300355 .08001
+aline .0508 .08001
+bezier .588791E-01 .710038E-01 .719593E-01 .607064E-01 .078105 .04826
+aline .07874 .047625
+aline .08001 .045085
+aline .080645 .04445
+aline .085725 .03429
+aline .08636 .032385
+bezier .921709E-01 .244938E-01 .766052E-01 .211784E-01 .0762 .029845
+bezier .665976E-01 .055883 .442111E-01 .736209E-01 .02032 .085725
+aline .02032 .088265
+bezier .453228E-01 .10075 .682495E-01 .119876 .07747 .14732
+aline .07874 .14859
+aline .08001 .149225
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=37 !-------------- Beginning of new char.
+dfont wid=1 hei=.694445 dep=.194443 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .24638 .24384
+bezier .272963 .231242 .301931 .233202 .32893 .24257
+aline .330835 .240665
+bezier .321898 .214405 .319236 .185988 .33147 .16002
+aline .332105 .158115
+aline .332105 .156845
+aline .33147 .155575
+aline .32766 .151765
+aline .324485 .151765
+bezier .312964 .170968 .312514 .194209 .31369 .215265
+aline .03175 -.066675
+aline .02921 -.067945
+aline .0254 -.067945
+aline .02286 -.066675
+aline .02159 -.065405
+aline .02032 -.062865
+aline .02032 -.059055
+aline .02159 -.056515
+aline .30353 .225425
+bezier .282474 .224249 .259233 .224699 .24003 .23622
+aline .24003 .239395
+aline .24384 .243205
+aline .24511 .24384
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=38 !-------------- Beginning of new char.
+dfont wid=1 hei=.694445 dep=.194443 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .02921 .2413
+aline .03048 .240665
+aline .03175 .24003
+aline .31369 -.04191
+bezier .312514 -.208541E-01 .312964 .238704E-02 .324485 .02159
+aline .32766 .02159
+aline .33147 .01778
+aline .332105 .01651
+bezier .321461 -.947514E-02 .319375 -.380617E-01 .330835 -.064135
+aline .330835 -.06731
+aline .32893 -.069215
+bezier .311864 -.647101E-01 .295126 -.590722E-01 .277495 -.06223
+bezier .266121 -.615412E-01 .254815 -.692691E-01 .24384 -.06985
+aline .24003 -.06604
+aline .24003 -.062865
+bezier .259233 -.513442E-01 .282474 -.508936E-01 .30353 -.05207
+aline .02159 .22987
+aline .02032 .23241
+aline .02032 .23622
+aline .02159 .23876
+aline .02286 .24003
+aline .02413 .240665
+aline .0254 .2413
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=39 !-------------- Beginning of new char.
+dfont wid=.777781 hei=.463748 dep=-.036252 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .084455 .161925
+bezier .128769 .156814 .153077 .104572 .19939 .10668
+bezier .222888 .109188 .244879 .131155 .243205 .155575
+aline .244475 .159385
+aline .247015 .161925
+aline .24892 .161925
+bezier .256053 .155675 .251674 .144363 .25146 .136525
+bezier .245902 .101429 .206515 .761931E-01 .173355 .090805
+bezier .137905 .103923 .11442 .144159 .07366 .14224
+bezier .487094E-01 .139733 .278142E-01 .116001 .02921 .090805
+aline .028575 .089535
+aline .02794 .0889
+aline .027305 .08763
+aline .026035 .086995
+aline .02413 .086995
+aline .02159 .089535
+bezier .133437E-01 .125607 .459614E-01 .167006 .084455 .161925
+closepath
+! end of curve
+
+! start of curve
+amove .24765 .0254
+aline .24892 .024765
+aline .25019 .02413
+aline .25146 .02286
+aline .25273 .02032
+aline .25273 .01651
+aline .25146 .01397
+aline .25019 .0127
+aline .24765 .01143
+aline .0254 .01143
+aline .02286 .0127
+aline .02159 .01397
+aline .02032 .01651
+aline .02032 .02032
+aline .02159 .02286
+aline .02286 .02413
+aline .02413 .024765
+aline .0254 .0254
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=40 !-------------- Beginning of new char.
+dfont wid=1 hei=.366875 dep=-.133125 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .14478 .183515
+aline .14605 .18288
+aline .14732 .182245
+bezier .148131 .172475 .139051 .163961 .13462 .155575
+bezier .129084 .145716 .119222 .136594 .113665 .12827
+aline .325755 .12827
+aline .328295 .127
+aline .329565 .12573
+aline .330835 .12319
+aline .330835 .11938
+aline .329565 .11684
+aline .328295 .11557
+aline .325755 .1143
+aline .097155 .1143
+bezier .843445E-01 .103165 .674945E-01 .948952E-01 .537633E-01 .867833E-01
+bezier .693684E-01 .793356E-01 .084311 .709686E-01 .097155 .05969
+aline .325755 .05969
+aline .328295 .05842
+aline .329565 .05715
+aline .330835 .05461
+aline .330835 .0508
+aline .329565 .04826
+aline .328295 .04699
+aline .325755 .04572
+aline .113665 .04572
+bezier .125445 .304036E-01 .141994 .131348E-01 .147955 -.006985
+aline .14732 -.008255
+aline .14478 -.009525
+aline .13716 -.009525
+bezier .130195 -.390553E-02 .128023 .700818E-02 .12192 .01397
+bezier .989294E-01 .484474E-01 .628927E-01 .737787E-01 .022225 .08382
+aline .02032 .085725
+aline .02032 .0889
+bezier .401174E-01 .967274E-01 .622193E-01 .103283 .079375 .11684
+bezier .103614 .133242 .122168 .156849 .135255 .18288
+aline .13716 .183515
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=")" !-------------- Beginning of new char.
+dfont wid=1 hei=.366875 dep=-.133125 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .213995 .183515
+bezier .220442 .179032 .221883 .169118 .22733 .163195
+bezier .249994 .127187 .287123 .100897 .32893 .090805
+aline .330835 .0889
+aline .330835 .085725
+bezier .308457 .771522E-01 .283929 .688139E-01 .26543 .052705
+bezier .24405 .366046E-01 .227861 .148441E-01 .2159 -.00889
+aline .213995 -.009525
+aline .206375 -.009525
+aline .203835 -.008255
+bezier .202995 .118927E-02 .211699 .958034E-02 .2159 .01778
+bezier .221878 .027682 .231507 .373417E-01 .23749 .04572
+aline .0254 .04572
+aline .02286 .04699
+aline .02159 .04826
+aline .02032 .0508
+aline .02032 .05461
+aline .02159 .05715
+aline .02286 .05842
+aline .0254 .05969
+aline .254 .05969
+bezier .266386 .716523E-01 .283895 .789818E-01 .297392 .878417E-01
+bezier .281569 .094558 .267177 .103727 .254 .1143
+aline .0254 .1143
+aline .02286 .11557
+aline .02159 .11684
+aline .02032 .11938
+aline .02032 .12319
+aline .02159 .12573
+aline .02286 .127
+aline .0254 .12827
+aline .23749 .12827
+bezier .225808 .143657 .209185 .160873 .2032 .180975
+aline .203835 .182245
+aline .206375 .183515
+aline .213995 .183515
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="*" !-------------- Beginning of new char.
+dfont wid=.611113 hei=.694445 dep=.194443 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .10922 .24257
+bezier .117684 .220399 .125832 .196248 .141605 .1778
+bezier .157726 .155759 .180441 .14013 .203835 .127
+aline .203835 .11684
+aline .202565 .11557
+bezier .192171 .115488 .183163 .124897 .17399 .12954
+bezier .165343 .134951 .157129 .144256 .149225 .14859
+aline .149225 -.062865
+aline .14859 -.06477
+aline .147955 -.06604
+aline .145415 -.06858
+aline .144145 -.069215
+aline .1397 -.069215
+aline .13843 -.06858
+aline .13589 -.06604
+aline .135255 -.06477
+aline .135255 .1651
+bezier .123948 .178177 .115597 .195269 .107103 .209127
+bezier .100052 .193149 .906485E-01 .178616 .08001 .1651
+aline .08001 -.06477
+aline .079375 -.06604
+aline .076835 -.06858
+aline .075565 -.069215
+aline .07112 -.069215
+aline .06985 -.06858
+aline .06731 -.06604
+aline .066675 -.06477
+aline .06604 -.062865
+aline .06604 .14859
+bezier .557202E-01 .14211 .045073 .130646 .03302 .12446
+aline .032385 .123825
+aline .029845 .122555
+aline .02921 .12192
+aline .0254 .120015
+aline .024765 .11938
+aline .015875 .114935
+aline .01397 .114935
+aline .0127 .11557
+aline .01143 .11684
+aline .01143 .127
+bezier .563188E-01 .149777 .924658E-01 .190624 .10414 .240665
+aline .106045 .24257
+aline .10922 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="+" !-------------- Beginning of new char.
+dfont wid=.611113 hei=.694445 dep=.194443 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .075565 .24257
+aline .076835 .241935
+aline .079375 .239395
+aline .08001 .238125
+aline .08001 .008255
+bezier .913171E-01 -.482139E-02 .099668 -.219144E-01 .108162 -.357717E-01
+bezier .115213 -.197942E-01 .124616 -.526066E-02 .135255 .008255
+aline .135255 .238125
+aline .13589 .239395
+aline .13843 .241935
+aline .1397 .24257
+aline .144145 .24257
+aline .145415 .241935
+aline .147955 .239395
+aline .14859 .238125
+aline .149225 .23622
+aline .149225 .024765
+bezier .159545 .312445E-01 .170192 .427094E-01 .182245 .048895
+aline .18288 .04953
+aline .18542 .0508
+aline .186055 .051435
+aline .189865 .05334
+aline .1905 .053975
+aline .19939 .05842
+aline .201295 .05842
+aline .202565 .057785
+aline .203835 .056515
+aline .203835 .046355
+bezier .158946 .235779E-01 .122799 -.172694E-01 .111125 -.06731
+aline .10922 -.069215
+aline .106045 -.069215
+bezier .975811E-01 -.470444E-01 .894331E-01 -.228932E-01 .07366 -.004445
+bezier .575393E-01 .175961E-01 .348244E-01 .332248E-01 .01143 .046355
+aline .01143 .056515
+aline .0127 .057785
+bezier .230945E-01 .578669E-01 .321021E-01 .484576E-01 .041275 .043815
+bezier .499217E-01 .384042E-01 .581358E-01 .290986E-01 .06604 .024765
+aline .06604 .23622
+aline .066675 .238125
+aline .06731 .239395
+aline .06985 .241935
+aline .07112 .24257
+aline .075565 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="," !-------------- Beginning of new char.
+dfont wid=1 hei=.366875 dep=-.133125 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .11811 .183515
+aline .11938 .18288
+aline .12065 .18161
+bezier .116805 .161507 .10117 .144002 .09144 .12827
+aline .259715 .12827
+bezier .249985 .144002 .23435 .161507 .230505 .18161
+aline .231775 .18288
+aline .233045 .183515
+aline .2413 .183515
+bezier .248792 .175916 .250777 .163373 .25781 .15494
+bezier .275938 .124223 .306339 .103016 .338455 .0889
+aline .338455 .085725
+bezier .297 .681904E-01 .260652 .360301E-01 .244475 -.006985
+aline .24257 -.00889
+aline .2413 -.009525
+aline .233045 -.009525
+aline .231775 -.00889
+aline .230505 -.00762
+bezier .234452 .124091E-01 .249828 .301014E-01 .259715 .04572
+aline .09144 .04572
+bezier .101327 .301014E-01 .116703 .124091E-01 .12065 -.00762
+aline .11938 -.00889
+aline .11811 -.009525
+aline .109855 -.009525
+bezier .101859 -.800591E-03 .993063E-01 .128937E-01 .09144 .022225
+bezier .729822E-01 .513696E-01 .437969E-01 .719938E-01 .0127 .085725
+aline .0127 .0889
+bezier .541818E-01 .106225 .905504E-01 .138 .10668 .180975
+aline .108585 .18288
+aline .109855 .183515
+closepath
+! end of curve
+
+! start of curve
+amove .07366 .111125
+bezier .631921E-01 .10204 .516887E-01 .943926E-01 .040005 .086995
+bezier .053421 .794741E-01 .659031E-01 .706575E-01 .076835 .05969
+aline .27432 .05969
+bezier .285252 .706575E-01 .297734 .794741E-01 .31115 .086995
+bezier .298261 .952468E-01 .285377 .103506 .27432 .1143
+aline .076835 .1143
+aline .07366 .111125
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="-" !-------------- Beginning of new char.
+dfont wid=1 hei=.694445 dep=.194443 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .106045 .24384
+aline .107315 .243205
+aline .111125 .239395
+aline .111125 .23622
+bezier .919221E-01 .224699 .686809E-01 .224249 .047625 .225425
+aline .329565 -.056515
+aline .330835 -.059055
+aline .330835 -.062865
+aline .329565 -.065405
+aline .328295 -.066675
+aline .325755 -.067945
+aline .321945 -.067945
+aline .319405 -.066675
+aline .037465 .215265
+bezier .386414E-01 .194209 .381908E-01 .170968 .02667 .151765
+aline .023495 .151765
+aline .019685 .155575
+aline .01905 .156845
+bezier .298926E-01 .183059 .315596E-01 .211725 .02032 .238125
+aline .02032 .24003
+aline .020955 .2413
+aline .02159 .241935
+bezier .302581E-01 .242722 .393402E-01 .23618 .04826 .23622
+bezier .671018E-01 .232613 .867338E-01 .235981 .104775 .24384
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="." !-------------- Beginning of new char.
+dfont wid=1 hei=.694445 dep=.194443 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .325755 .2413
+aline .327025 .240665
+aline .328295 .24003
+aline .329565 .23876
+aline .330835 .23622
+aline .330835 .23241
+aline .329565 .22987
+aline .047625 -.05207
+bezier .686805E-01 -.508936E-01 .919221E-01 -.513442E-01 .111125 -.062865
+aline .111125 -.06604
+aline .107315 -.06985
+aline .106045 -.070485
+bezier .800599E-01 -.598413E-01 .514734E-01 -.577546E-01 .0254 -.069215
+aline .02286 -.069215
+aline .02159 -.06858
+aline .020955 -.067945
+bezier .207733E-01 -.577403E-01 .276506E-01 -.471434E-01 .027305 -.03683
+bezier .301848E-01 -.185717E-01 .253472E-01 -.862596E-03 .01905 .01651
+aline .019685 .01778
+aline .023495 .02159
+aline .02667 .02159
+bezier .381908E-01 .23871E-02 .386414E-01 -.208545E-01 .037465 -.04191
+aline .319405 .24003
+aline .320675 .240665
+aline .321945 .2413
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="/" !-------------- Beginning of new char.
+dfont wid=.777781 hei=.430555 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .086995 .15367
+bezier .1212 .150267 .146254 .121861 .16256 .09398
+bezier .178597 .127285 .213154 .160773 .25273 .1524
+aline .25273 .14351
+bezier .214474 .149404 .18379 .114576 .171053 .815975E-01
+bezier .188935 .544138E-01 .205072 .017263 .24003 .009525
+aline .250825 .009525
+aline .25146 .01016
+aline .25273 .01016
+aline .25273 -.003175
+bezier .212141 -.117353E-01 .177595 .225465E-01 .159385 .055245
+bezier .142966 .206702E-01 .106271 -.133584E-01 .065405 -.00254
+bezier .267818E-01 .101426E-01 .159037E-01 .576644E-01 .02159 .09271
+bezier .255189E-01 .125158 .519951E-01 .157947 .086995 .15367
+closepath
+! end of curve
+
+! start of curve
+amove .070485 .139065
+bezier .384803E-01 .133748 .243934E-01 .094856 .02794 .066675
+bezier .028659 .373659E-01 .501927E-01 .836274E-03 .08382 .00508
+bezier .116182 .968183E-02 .139239 .386678E-01 .150892 .676275E-01
+bezier .13301 .948113E-01 .116873 .131962 .081915 .1397
+aline .07112 .1397
+aline .070485 .139065
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="0" !-------------- Beginning of new char.
+dfont wid=.275 hei=.555557 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .074295 .194945
+bezier .890178E-01 .193887 .963883E-01 .176406 .088265 .164465
+bezier .668573E-01 .114759 .463819E-01 .644768E-01 .02413 .01524
+bezier .182538E-01 .138715E-01 .634721E-02 .180145E-01 .01143 .026035
+bezier .269533E-01 .798744E-01 .397865E-01 .134924 .05715 .18796
+aline .05969 .1905
+aline .06096 .191135
+aline .06223 .192405
+aline .06477 .193675
+aline .066675 .19431
+aline .069215 .194945
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="1" !-------------- Beginning of new char.
+dfont wid=1 hei=.430555 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .09398 .15367
+bezier .130371 .150337 .158833 .122663 .178435 .09398
+bezier .198783 .129055 .238121 .162666 .281305 .151765
+bezier .32718 .136994 .341181 .786241E-01 .32385 .0381
+bezier .312108 .742582E-02 .277474 -.118173E-01 .245745 -.00254
+bezier .214002 .500324E-02 .190597 .296952E-01 .17272 .055245
+bezier .152372 .201701E-01 .113034 -.134407E-01 .06985 -.00254
+bezier .023975 .122308E-01 .997435E-02 .070601 .027305 .111125
+bezier .379367E-01 .13738 .650974E-01 .157155 .09398 .15367
+closepath
+! end of curve
+
+! start of curve
+amove .2667 .142875
+bezier .231148 .14249 .201923 .111282 .188595 .08128
+bezier .209455 .564866E-01 .226131 .023508 .25908 .0127
+bezier .289676 .614689E-02 .318783 .325745E-01 .32258 .062865
+bezier .329872 .967477E-01 .306173 .144433 .2667 .142875
+closepath
+! end of curve
+
+! start of curve
+amove .07493 .136525
+bezier .037492 .131334 .192195E-01 .850294E-01 .03048 .052705
+bezier .036694 .248801E-01 .639278E-01 .604781E-03 .09271 .006985
+bezier .124858 .119413E-01 .15015 .401814E-01 .16256 .067945
+bezier .1417 .927384E-01 .125024 .125717 .092075 .136525
+aline .0889 .136525
+aline .088265 .13716
+aline .075565 .13716
+aline .07493 .136525
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="2" !-------------- Beginning of new char.
+dfont wid=.666669 hei=.539098 dep=.0390978 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .19939 .188595
+aline .20066 .18796
+aline .20193 .187325
+aline .2032 .186055
+aline .20447 .183515
+aline .20447 .179705
+aline .2032 .177165
+aline .20193 .175895
+aline .19939 .174625
+aline .12954 .174625
+bezier .882182E-01 .171709 .471934E-01 .137613 .04445 .094615
+aline .045085 .09398
+aline .19939 .09398
+aline .20193 .09271
+aline .2032 .09144
+aline .20447 .0889
+aline .20447 .08509
+aline .2032 .08255
+aline .20193 .08128
+aline .19939 .08001
+aline .045085 .08001
+bezier .045969 .416337E-01 .805942E-01 .761401E-02 .118745 .00127
+aline .11938 .000635
+aline .12319 .000635
+aline .123825 0
+aline .128905 0
+aline .12954 -.000635
+aline .19939 -.000635
+aline .20193 -.001905
+aline .2032 -.003175
+aline .20447 -.005715
+aline .20447 -.009525
+aline .2032 -.012065
+aline .20193 -.013335
+aline .19939 -.014605
+aline .12827 -.014605
+bezier .792581E-01 -.118194E-01 .329876E-01 .294704E-01 .029845 .079375
+bezier .244899E-01 .134461 .729833E-01 .186059 .127635 .18796
+aline .12827 .188595
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="3" !-------------- Beginning of new char.
+dfont wid=.666669 hei=.539098 dep=.0390978 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .106045 .188595
+bezier .155057 .185809 .201327 .14452 .20447 .094615
+bezier .209825 .395294E-01 .161332 -.120689E-01 .10668 -.01397
+aline .106045 -.014605
+aline .034925 -.014605
+aline .032385 -.013335
+aline .031115 -.012065
+aline .029845 -.009525
+aline .029845 -.005715
+aline .031115 -.003175
+aline .032385 -.001905
+aline .034925 -.000635
+aline .104775 -.000635
+bezier .146097 .228061E-02 .187122 .363765E-01 .189865 .079375
+aline .18923 .08001
+aline .034925 .08001
+aline .032385 .08128
+aline .031115 .08255
+aline .029845 .08509
+aline .029845 .0889
+aline .031115 .09144
+aline .032385 .09271
+aline .034925 .09398
+aline .18923 .09398
+bezier .188346 .132356 .153721 .166376 .11557 .17272
+aline .114935 .173355
+aline .111125 .173355
+aline .11049 .17399
+aline .10541 .17399
+aline .104775 .174625
+aline .034925 .174625
+aline .032385 .175895
+aline .031115 .177165
+aline .029845 .179705
+aline .029845 .183515
+aline .031115 .186055
+aline .032385 .187325
+aline .034925 .188595
+aline .106045 .188595
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="4" !-------------- Beginning of new char.
+dfont wid=.888891 hei=.694445 dep=.194445 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .158115 .25019
+bezier .167245 .243289 .169804 .230197 .17653 .22098
+bezier .214632 .14992 .253335 .792939E-01 .291465 .008255
+aline .291465 .004445
+aline .290195 .001905
+aline .288925 .000635
+aline .286385 -.000635
+aline .026035 -.000635
+aline .023495 .000635
+aline .022225 .001905
+aline .020955 .004445
+bezier .238496E-01 .190514E-01 .348311E-01 .031221 .04064 .045085
+bezier .780524E-01 .112763 .113827 .181621 .151765 .24892
+aline .153035 .249555
+aline .154305 .25019
+closepath
+! end of curve
+
+! start of curve
+amove .155575 .22733
+bezier .117712 .155979 .771472E-01 .841377E-01 .04064 .013335
+aline .27178 .013335
+bezier .235007 .843104E-01 .194692 .156696 .15621 .227965
+aline .155575 .22733
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="5" !-------------- Beginning of new char.
+dfont wid=.888891 hei=.694445 dep=.194445 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .286385 .17399
+aline .287655 .173355
+aline .288925 .17272
+aline .290195 .17145
+aline .291465 .16891
+bezier .28857 .154304 .277589 .142134 .27178 .12827
+bezier .234368 .605922E-01 .198593 -.826587E-02 .160655 -.075565
+aline .158115 -.076835
+aline .154305 -.076835
+bezier .145175 -.699341E-01 .142616 -.056842 .13589 -.047625
+bezier .977881E-01 .234345E-01 .590855E-01 .940611E-01 .020955 .1651
+aline .020955 .16891
+aline .022225 .17145
+aline .023495 .17272
+aline .024765 .173355
+aline .026035 .17399
+closepath
+! end of curve
+
+! start of curve
+amove .040005 .159385
+bezier .790599E-01 .882839E-01 .117204 .165263E-01 .15621 -.05461
+bezier .194692 .166586E-01 .235007 .890446E-01 .27178 .16002
+aline .04064 .16002
+aline .040005 .159385
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="6" !-------------- Beginning of new char.
+dfont wid=0 hei=.694445 dep=.194443 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .21844 .25019
+aline .21971 .249555
+aline .22098 .24892
+aline .22225 .24765
+aline .22352 .24511
+aline .22352 .2413
+bezier .169227 .135966 .116044 .298335E-01 .06096 -.07493
+aline .05842 -.0762
+aline .05461 -.0762
+aline .05207 -.07493
+aline .0508 -.07366
+aline .04953 -.07112
+aline .04953 -.06731
+bezier .103823 .380237E-01 .157006 .144156 .21209 .24892
+aline .21463 .25019
+aline .21844 .25019
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="7" !-------------- Beginning of new char.
+dfont wid=0 hei=.366875 dep=-.133125 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .02921 .1524
+aline .03048 .151765
+aline .03175 .15113
+aline .03302 .14986
+aline .03429 .14732
+aline .03429 .094615
+aline .034925 .09398
+aline .038735 .09398
+aline .041275 .09271
+aline .04318 .090805
+aline .043815 .089535
+aline .043815 .084455
+aline .04318 .083185
+aline .041275 .08128
+aline .038735 .08001
+aline .034925 .08001
+aline .03429 .079375
+aline .03429 .02667
+aline .03302 .02413
+aline .03175 .02286
+aline .02921 .02159
+aline .0254 .02159
+aline .02286 .02286
+aline .02159 .02413
+aline .02032 .02667
+aline .02032 .14732
+aline .02159 .14986
+aline .02286 .15113
+aline .02413 .151765
+aline .0254 .1524
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="8" !-------------- Beginning of new char.
+dfont wid=.555557 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .009525 .24257
+bezier .183529E-01 .236418 .185576E-01 .223201 .023495 .213995
+bezier .307665E-01 .195188 .037857 .176305 .045085 .15748
+aline .150495 .15748
+bezier .161809 .185245 .17076 .21437 .183515 .2413
+aline .186055 .24257
+aline .189865 .24257
+bezier .200823 .237418 .190545 .225054 .188595 .21717
+bezier .159632 .142572 .132788 .667156E-01 .102235 -.006985
+bezier .918451E-01 -.012899 .892738E-01 .14683E-02 .08636 .008255
+bezier .579422E-01 .834618E-01 .291771E-01 .158525 .000635 .23368
+aline .000635 .23749
+aline .001905 .24003
+aline .003175 .2413
+aline .004445 .241935
+aline .005715 .24257
+closepath
+! end of curve
+
+! start of curve
+amove .050165 .142875
+bezier .667682E-01 .102045 .817609E-01 .602374E-01 .09779 .01905
+bezier .113291 .603817E-01 .130294 .102873 .14478 .14351
+aline .0508 .14351
+aline .050165 .142875
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="9" !-------------- Beginning of new char.
+dfont wid=.555557 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .169545 .24257
+aline .170815 .241935
+aline .172085 .2413
+aline .173355 .24003
+aline .174625 .23749
+aline .174625 .004445
+aline .173355 .001905
+aline .172085 .000635
+aline .169545 -.000635
+aline .0254 -.000635
+aline .02286 .000635
+aline .02159 .001905
+aline .02032 .004445
+aline .02032 .008255
+aline .02159 .010795
+aline .02286 .012065
+aline .0254 .013335
+aline .16002 .013335
+aline .160655 .01397
+aline .160655 .113665
+aline .16002 .1143
+aline .029845 .1143
+aline .027305 .11557
+aline .02667 .116205
+aline .0254 .118745
+aline .0254 .12319
+aline .02667 .12573
+aline .027305 .126365
+aline .029845 .127635
+aline .03175 .12827
+aline .16002 .12827
+aline .160655 .128905
+aline .160655 .227965
+aline .16002 .2286
+aline .0254 .2286
+aline .02286 .22987
+aline .02159 .23114
+aline .02032 .23368
+aline .02032 .23749
+aline .02159 .24003
+aline .02286 .2413
+aline .02413 .241935
+aline .0254 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=":" !-------------- Beginning of new char.
+dfont wid=.666669 hei=.430555 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .208915 .123825
+aline .210185 .12319
+aline .211455 .122555
+aline .212725 .121285
+aline .213995 .118745
+aline .213995 .03556
+aline .212725 .03302
+aline .211455 .03175
+aline .208915 .03048
+aline .205105 .03048
+aline .202565 .03175
+aline .201295 .03302
+aline .200025 .03556
+aline .200025 .10922
+aline .19939 .109855
+aline .0254 .109855
+aline .02286 .111125
+aline .02159 .112395
+aline .02032 .114935
+aline .02032 .118745
+aline .02159 .121285
+aline .02286 .122555
+aline .02413 .12319
+aline .0254 .123825
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=";" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.75 dep=.0555553 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .131445 .269875
+bezier .142121 .264786 .132565 .252078 .131445 .24384
+aline .13081 .2413
+aline .130175 .239395
+bezier .125377 .231359 .136547 .227777 .139065 .22098
+bezier .154246 .19598 .157059 .1669 .15875 .1397
+aline .15875 .10033
+bezier .156767 .642001E-01 .150711 .168337E-01 .113665 -.00254
+bezier .964297E-01 -.109832E-01 .764273E-01 -.962528E-02 .059563 -.001651
+bezier .555702E-01 -.101266E-01 .569166E-01 -.227811E-01 .04826 -.02794
+aline .04445 -.02794
+bezier .337738E-01 -.228509E-01 .433301E-01 -.010143 .04445 -.001905
+aline .045085 .000635
+aline .04572 .00254
+bezier .501599E-01 .101812E-01 .391834E-01 .139054E-01 .03683 .020955
+bezier .214799E-01 .450657E-01 .189632E-01 .738187E-01 .017145 .10033
+aline .017145 .1397
+bezier .191827E-01 .175078 .024137 .2198 .057785 .241935
+bezier .757379E-01 .253123 .979793E-01 .252141 .116364 .243681
+bezier .120334 .25213 .118999 .264743 .127635 .269875
+closepath
+! end of curve
+
+! start of curve
+amove .08255 .24257
+bezier .519065E-01 .238065 .434768E-01 .202686 .041275 .1778
+aline .041275 .17018
+aline .04064 .169545
+aline .04064 .156845
+aline .040005 .15621
+aline .040005 .09271
+bezier .418484E-01 .694391E-01 .412946E-01 .461019E-01 .05207 .02413
+bezier .721384E-01 .938541E-01 .937831E-01 .164715 .11303 .23368
+bezier .104502 .24006 .930361E-01 .245052 .08255 .24257
+closepath
+! end of curve
+
+! start of curve
+amove .123825 .217805
+bezier .104129 .147913 .815632E-01 .782332E-01 .0635 .008255
+bezier .817514E-01 -.902682E-02 .111674 -.671217E-03 .122555 .020955
+bezier .134287 .439738E-01 .134112 .068345 .13589 .09271
+aline .13589 .15621
+bezier .134407 .177465 .133833 .198642 .12446 .219075
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="<" !-------------- Beginning of new char.
+dfont wid=.722224 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .197485 .25019
+bezier .216824 .2204 .232983 .187552 .25146 .156845
+aline .25146 .153035
+bezier .231759 .142082 .21257 .128946 .1905 .122555
+bezier .190948 .943849E-01 .194424 .06657 .19431 .038735
+bezier .191064 .261888E-01 .19802 .77821E-02 .21082 .00381
+bezier .221409 .106908E-01 .230373 .217677E-01 .241935 .026035
+aline .243205 .0254
+bezier .250592 .230137E-01 .245639 .164056E-01 .240665 .014605
+bezier .230627 .681514E-02 .220179 -.405274E-03 .210185 -.008255
+bezier .184164 -.124113E-01 .159605 .133819E-01 .1651 .038735
+bezier .166489 .657528E-01 .162225 .927821E-01 .161925 .120015
+aline .16129 .12065
+aline .121285 .12065
+aline .12065 .120015
+aline .12065 .08763
+bezier .119523 .544738E-01 .113345 .111452E-01 .08001 -.00635
+bezier .548907E-01 -.156293E-01 .330336E-01 .716562E-02 .026035 .02921
+aline .0254 .028575
+aline .02413 .02794
+aline .02032 .02667
+aline .019685 .02667
+aline .017145 .02794
+aline .01651 .028575
+aline .01651 .032385
+aline .01778 .03302
+aline .018415 .033655
+aline .019685 .03429
+aline .02159 .034925
+aline .02413 .036195
+aline .023495 .03683
+aline .02286 .0381
+aline .022225 .04064
+aline .02286 .042545
+aline .0254 .045085
+aline .028575 .045085
+aline .03048 .04318
+aline .031115 .041275
+aline .03175 .040005
+aline .03302 .395817E-01
+aline .03429 .040005
+aline .03556 .04064
+aline .037465 .041275
+aline .04064 .041275
+aline .042545 .03937
+aline .042545 .036195
+aline .041275 .034925
+aline .040005 .03429
+aline .0381 .033655
+aline .03683 .03302
+aline .354013E-01 .325437E-01
+bezier .390157E-01 .157797E-01 .545674E-01 -.55224E-02 .07366 0
+bezier .864317E-01 .111534E-01 .884115E-01 .307107E-01 .090805 .04572
+aline .090805 .053975
+aline .09144 .05461
+aline .09144 .18161
+bezier .888992E-01 .201729 .845732E-01 .230584 .06223 .239395
+bezier .387782E-01 .241956 .212217E-01 .208999 .036195 .191135
+bezier .493975E-01 .177543 .066141 .164893 .06858 .14478
+bezier .679536E-01 .12531 .699702E-01 .1021 .05334 .088265
+bezier .404828E-01 .781326E-01 .216651E-01 .882667E-01 .020955 .10414
+aline .020955 .107315
+aline .02032 .10795
+aline .02032 .114935
+aline .022225 .11684
+aline .02667 .11684
+aline .028575 .114935
+bezier .281315E-01 .105708 .308015E-01 .900213E-01 .04318 .09144
+bezier .549794E-01 .095698 .563482E-01 .110571 .057785 .12065
+bezier .587971E-01 .136183 .582924E-01 .15286 .04572 .16383
+bezier .344021E-01 .176744 .160194E-01 .190125 .020955 .20955
+bezier .210959E-01 .239351 .589859E-01 .25743 .08255 .239395
+bezier .941573E-01 .233275 .101891 .220668 .108797 .211243
+bezier .127579 .240186 .16515 .250704 .197485 .25019
+closepath
+! end of curve
+
+! start of curve
+amove .168275 .236855
+bezier .145835 .23185 .120356 .219507 .1143 .196215
+bezier .121714 .174857 .119628 .152911 .121285 .13081
+aline .18034 .13081
+bezier .19456 .134063 .209765 .140509 .222091 .148907
+bezier .205417 .178431 .18864 .207881 .172085 .23749
+aline .16891 .23749
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="=" !-------------- Beginning of new char.
+dfont wid=.722224 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .10414 .24638
+bezier .144583 .243782 .180838 .214771 .19685 .1778
+bezier .204395 .16882 .217064 .175217 .22606 .17907
+bezier .232225 .181883 .232767 .18992 .23495 .19431
+aline .235585 .194945
+aline .241935 .194945
+bezier .246985 .189571 .241683 .178695 .235585 .17526
+bezier .210577 .157542 .174287 .167182 .15621 .1905
+bezier .138968 .207812 .127151 .234217 .100965 .239395
+bezier .652715E-01 .242875 .026852 .212453 .03048 .174625
+bezier .344602E-01 .142221 .067806 .119284 .09906 .12065
+aline .099695 .120015
+aline .100965 .11938
+aline .100965 .114935
+bezier .619417E-01 .108248 .013521 .143921 .020955 .18669
+bezier .237701E-01 .226695 .676611E-01 .250057 .10414 .24638
+closepath
+! end of curve
+
+! start of curve
+amove .208915 .14986
+bezier .226122 .148558 .245638 .134981 .24384 .11557
+aline .241935 .113665
+aline .235585 .113665
+bezier .232227 .121167 .231102 .132331 .22225 .13716
+bezier .212492 .144032 .195074 .1468 .191135 .13208
+bezier .184014 .115906 .186966 .962661E-01 .20066 .08382
+bezier .212877 .071248 .223787 .540437E-01 .217805 .03556
+bezier .21143 .120348E-01 .187361 -.221812E-02 .164465 -.004445
+aline .12954 -.004445
+bezier .860167E-01 .128285E-02 .661686E-01 .555741E-01 .02159 .05715
+aline .02032 .057785
+aline .02032 .061595
+aline .022225 .0635
+bezier .434885E-01 .641051E-01 .666059E-01 .650164E-01 .083185 .04953
+bezier .105247 .034472 .121615 .825748E-02 .149225 .003175
+bezier .17242 .777862E-02 .195675 .030432 .18923 .055245
+bezier .181322 .768116E-01 .153128 .090835 .159385 .11684
+bezier .163424 .13917 .187697 .152209 .208915 .14986
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=">" !-------------- Beginning of new char.
+dfont wid=.777781 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .24765 .231775
+aline .24892 .23114
+aline .25019 .230505
+aline .25146 .229235
+aline .25273 .226695
+aline .25273 .222885
+aline .25146 .220345
+aline .25019 .219075
+aline .24765 .217805
+aline .144145 .217805
+aline .14351 .21717
+aline .14351 .004445
+aline .14224 .001905
+aline .14097 .000635
+aline .13843 -.000635
+aline .13462 -.000635
+aline .13208 .000635
+aline .13081 .001905
+aline .12954 .004445
+aline .12954 .21717
+aline .128905 .217805
+aline .0254 .217805
+aline .02286 .219075
+aline .02159 .220345
+aline .02032 .222885
+aline .02032 .226695
+aline .02159 .229235
+aline .02286 .230505
+aline .02413 .23114
+aline .0254 .231775
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="?" !-------------- Beginning of new char.
+dfont wid=.777781 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .13843 .231775
+aline .1397 .23114
+aline .14097 .230505
+aline .14224 .229235
+aline .14351 .226695
+aline .14351 .01397
+aline .144145 .013335
+aline .24765 .013335
+aline .25019 .012065
+aline .25146 .010795
+aline .25273 .008255
+aline .25273 .004445
+aline .25146 .001905
+aline .25019 .000635
+aline .24765 -.000635
+aline .0254 -.000635
+aline .02286 .000635
+aline .02159 .001905
+aline .02032 .004445
+aline .02032 .008255
+aline .02159 .010795
+aline .02286 .012065
+aline .0254 .013335
+aline .128905 .013335
+aline .12954 .01397
+aline .12954 .226695
+aline .13081 .229235
+aline .13208 .230505
+aline .13335 .23114
+aline .13462 .231775
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="@" !-------------- Beginning of new char.
+dfont wid=.611113 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .03048 .24257
+aline .031115 .241935
+bezier .335086E-01 .230771 .378247E-01 .216711 .04699 .207645
+bezier .794843E-01 .168954 .112924 .130945 .14605 .09271
+bezier .150787 .118077 .15531 .145128 .159385 .170815
+aline .159385 .177165
+aline .16002 .1778
+aline .16002 .182245
+bezier .147914 .194116 .132177 .208792 .13716 .22733
+aline .13716 .230505
+aline .137795 .233045
+aline .139065 .236855
+aline .1397 .23749
+aline .140335 .23876
+aline .144145 .24257
+aline .146685 .24257
+bezier .157816 .222268 .1692 .200321 .18796 .184785
+bezier .196791 .174372 .196066 .158232 .1905 .146685
+aline .18669 .142875
+aline .18415 .142875
+aline .183515 .14351
+bezier .181339 .152403 .177956 .164186 .17018 .17145
+bezier .165271 .141441 .158448 .111352 .15621 .080645
+bezier .171162 .060752 .197006 .432127E-01 .19431 .01524
+aline .193675 .014605
+aline .193675 .01143
+aline .19304 .00889
+aline .19177 .00508
+aline .191135 .004445
+aline .1905 .003175
+aline .18669 -.000635
+aline .18415 -.000635
+aline .183515 0
+bezier .181121 .111637E-01 .176805 .252244E-01 .16764 .03429
+bezier .134346 .740725E-01 .997306E-01 .112903 .06604 .1524
+bezier .554851E-01 .127732 .505318E-01 .102237 .053975 .0762
+bezier .608988E-01 .053277 .091339 .385935E-01 .083185 .01143
+bezier .077985 .269321E-02 .066827 .337089E-03 .057785 -.000635
+aline .022225 -.000635
+aline .02032 .00127
+aline .02032 .00508
+bezier .302525E-01 .811523E-02 .454365E-01 .505151E-02 .0508 .017145
+bezier .507917E-01 .430666E-01 .243108E-01 .642264E-01 .03048 .090805
+bezier .305373E-01 .116808 .470486E-01 .140396 .05715 .16256
+bezier .426939E-01 .182109 .017489 .199313 .02032 .226695
+aline .020955 .22733
+aline .020955 .230505
+aline .02159 .233045
+aline .02286 .236855
+aline .023495 .23749
+aline .02413 .23876
+aline .02794 .24257
+aline .03048 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="A" !-------------- Beginning of new char.
+dfont wid=.798471 hei=.683332 dep=0 italic=0
+dfont fby="0" kadd=.19445
+set path ! start of curve
+newpath
+! start of curve
+amove .22987 .25273
+aline .231775 .252095
+aline .233045 .250825
+aline .233045 .24638
+aline .23241 .245745
+aline .23241 .188595
+bezier .236265 .12865 .233208 .702185E-01 .252095 .0127
+bezier .260157 .228208E-02 .269605 .014913 .2794 .01397
+aline .28067 .013335
+bezier .280726 .41742E-02 .268335 -.201708E-03 .260985 -.004445
+bezier .248122 -.114319E-01 .225449 -.163426E-01 .21971 .001905
+bezier .213875 .204338E-01 .211841 .394582E-01 .208915 .05715
+aline .113665 .05715
+bezier .945425E-01 .311028E-01 .781859E-01 -.201854E-03 .048895 -.01651
+bezier .256671E-01 -.243161E-01 .503809E-03 .36332E-02 .013335 .0254
+aline .01397 .027305
+aline .015875 .031115
+aline .01651 .03175
+aline .017145 .03302
+aline .01778 .033655
+aline .018415 .034925
+aline .020955 .037465
+aline .02413 .037465
+bezier .269614E-01 .175187E-01 .552337E-01 .546346E-02 .06858 .02286
+bezier .103064 .577349E-01 .126925 .101034 .153035 .14224
+bezier .162193 .157922 .17096 .173885 .179705 .189865
+aline .200025 .230505
+aline .20066 .23241
+aline .201295 .233045
+bezier .205992 .243012 .217613 .250814 .229235 .25273
+closepath
+! end of curve
+
+! start of curve
+amove .201295 .20828
+aline .20066 .20701
+aline .183515 .17272
+bezier .165143 .137759 .143898 .103856 .123613 .709083E-01
+aline .124142 .706438E-01
+aline .126365 .071755
+aline .127 .07239
+aline .128905 .073025
+aline .131445 .074295
+aline .13716 .0762
+aline .20701 .0762
+bezier .205897 .107476 .203476 .140485 .202565 .17272
+aline .202565 .208915
+aline .20193 .20955
+closepath
+! end of curve
+
+! start of curve
+amove .12192 .06985
+aline .122555 .069215
+aline .12319 .06985
+aline .122555 .070485
+aline .12192 .06985
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="B" !-------------- Beginning of new char.
+dfont wid=.65681 hei=.683332 dep=0 italic=.0304127
+dfont fby="0" kadd=.138893
+set path ! start of curve
+newpath
+! start of curve
+amove .09779 .24638
+aline .09906 .245745
+bezier .983185E-01 .227991 .933032E-01 .209635 .092075 .19177
+bezier .11886 .226187 .165216 .255208 .20955 .243205
+bezier .230049 .236961 .238983 .212163 .229235 .193675
+bezier .216405 .168 .19033 .153295 .1651 .141605
+bezier .195587 .13733 .224487 .109335 .21844 .07747
+bezier .214428 .349054E-01 .172941 .969389E-02 .13589 -.00254
+bezier .106093 -.112102E-01 .680573E-01 -.132688E-01 .04699 .014605
+bezier .492472E-01 .245338E-01 .613545E-01 .294629E-01 .070485 .032385
+aline .075565 .032385
+bezier .982769E-01 .319885E-02 .142186 .609594E-02 .17018 .0254
+bezier .199869 .498486E-01 .193826 .102774 .156845 .11684
+bezier .140556 .124343 .12235 .123709 .106045 .12192
+bezier .102818 .126787 .1112 .130844 .1143 .133985
+bezier .141342 .148942 .177929 .150376 .197485 .17653
+bezier .210565 .194609 .200047 .222626 .177165 .22606
+bezier .152204 .23275 .12675 .215346 .1143 .193675
+bezier .738998E-01 .138071 .730549E-01 .646935E-01 .03937 .005715
+aline .03429 .000635
+aline .03302 0
+aline .03175 -.00127
+aline .02921 -.00254
+aline .028575 -.003175
+aline .022225 -.00635
+aline .018415 -.00762
+aline .015875 -.008255
+aline .012065 -.008255
+aline .010795 -.006985
+bezier .305612E-01 .315154E-01 .041667 .742409E-01 .050165 .11684
+aline .056515 .14859
+bezier .609338E-01 .173628 .667305E-01 .198229 .067945 .222885
+aline .06731 .22225
+aline .05588 .216535
+aline .053975 .2159
+aline .052705 .215265
+aline .050165 .21463
+aline .045085 .21463
+bezier .431414E-01 .22206 .534004E-01 .225934 .05842 .22987
+aline .08636 .24384
+aline .088265 .244475
+aline .089535 .24511
+aline .09144 .245745
+aline .09398 .24638
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="C" !-------------- Beginning of new char.
+dfont wid=.526529 hei=.683332 dep=0 italic=.0583363
+dfont fby="0" kadd=.138893
+set path ! start of curve
+newpath
+! start of curve
+amove .165735 .24638
+bezier .178753 .24655 .19126 .233568 .18669 .220345
+bezier .183323 .201552 .174562 .182833 .163195 .16764
+bezier .156263 .163054 .147039 .155084 .13843 .15875
+bezier .144683 .178708 .164403 .19957 .154305 .22098
+bezier .139967 .232491 .120679 .226402 .104775 .221615
+bezier .609539E-01 .199696 .431354E-01 .146963 .03556 .102235
+bezier .325672E-01 .710012E-01 .376953E-01 .299893E-01 .070485 .01524
+bezier .979675E-01 .186346E-02 .132506 .152504E-01 .14605 .042545
+bezier .152827 .500086E-01 .162677 .567683E-01 .173355 .056515
+bezier .176448 .513917E-01 .168218 .462474E-01 .16637 .041275
+bezier .136405 .509504E-02 .817788E-01 -.240089E-01 .036195 0
+bezier .443259E-02 .203153E-01 .195916E-02 .631522E-01 .006985 .095885
+bezier .174428E-01 .166795 .688328E-01 .233391 .141605 .24511
+aline .145415 .24511
+aline .14605 .245745
+aline .151765 .245745
+aline .1524 .24638
+aline .165735 .24638
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="D" !-------------- Beginning of new char.
+dfont wid=.771393 hei=.683332 dep=0 italic=.0277786
+dfont fby="0" kadd=.0833359
+set path ! start of curve
+newpath
+! start of curve
+amove .169545 .23876
+bezier .207911 .237697 .2569 .22105 .2667 .1778
+bezier .278171 .120868 .239484 .642881E-01 .191135 .036195
+bezier .158513 .146471E-01 .118127 .205403E-02 .080645 -.000635
+aline .029845 -.000635
+aline .028575 0
+aline .02794 .000635
+bezier .305542E-01 .010777 .430647E-01 .134767E-01 .050165 .01905
+bezier .755429E-01 .838343E-01 .946056E-01 .15395 .097155 .21971
+bezier .791508E-01 .218261 .564287E-01 .2172 .043815 .201295
+bezier .383975E-01 .192585 .372931E-01 .180889 .02667 .17653
+aline .01905 .17272
+aline .01524 .17145
+aline .012065 .170815
+aline .01016 .170815
+aline .00889 .17145
+bezier .944569E-02 .191599 .286078E-01 .206802 .04445 .21717
+bezier .657749E-01 .230557 .918066E-01 .236985 .11557 .23876
+aline .169545 .23876
+closepath
+! end of curve
+
+! start of curve
+amove .126365 .219075
+bezier .1209 .152992 .100107 .821818E-01 .07493 .018415
+bezier .128449 .149452E-01 .188471 .322708E-01 .21971 .079375
+bezier .241799 .11434 .249549 .164833 .216535 .19558
+bezier .190994 .21578 .157313 .221428 .126365 .219075
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="E" !-------------- Beginning of new char.
+dfont wid=.527781 hei=.683332 dep=0 italic=.0894413
+dfont fby="0" kadd=.111115
+set path ! start of curve
+newpath
+! start of curve
+amove .1651 .24638
+bezier .179363 .245663 .200568 .238943 .197485 .220345
+bezier .195234 .203575 .179991 .189802 .163195 .18923
+aline .161925 .1905
+bezier .165477 .199243 .171142 .209288 .164465 .21844
+bezier .142809 .233308 .110138 .229838 .092075 .210185
+bezier .770808E-01 .192904 .769962E-01 .16275 .09906 .15113
+bezier .112309 .143043 .127244 .139977 .14224 .140335
+bezier .145937 .134744 .136592 .130145 .132715 .127
+bezier .118393 .117508 .101106 .123556 .08636 .114935
+bezier .600606E-01 .103251 .387012E-01 .073688 .04064 .045085
+bezier .459651E-01 .156162E-01 .827583E-01 .629709E-02 .107315 .0127
+bezier .127663 .163283E-01 .139167 .344479E-01 .151765 .04826
+bezier .158281 .520384E-01 .167113 .592172E-01 .174625 .055245
+bezier .156461 .230065E-01 .121438 .108904E-02 .08509 -.006985
+bezier .057215 -.123057E-01 .165038E-01 -.359777E-02 .01016 .029845
+bezier .010328 .739499E-01 .476502E-01 .107232 .08382 .126365
+bezier .638734E-01 .132512 .466234E-01 .152437 .05207 .17399
+bezier .627756E-01 .215583 .106826 .239389 .14605 .245745
+aline .150495 .245745
+aline .15113 .24638
+aline .1651 .24638
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="F" !-------------- Beginning of new char.
+dfont wid=.718748 hei=.683332 dep=0 italic=.0993061
+dfont fby="0" kadd=.111115
+set path ! start of curve
+newpath
+! start of curve
+amove .269875 .23876
+bezier .27824 .238129 .292767 .235873 .291465 .224155
+bezier .2872 .213075 .273961 .205935 .262255 .20574
+aline .260985 .20701
+bezier .264829 .216275 .25222 .219185 .245745 .21971
+aline .174625 .21971
+bezier .167605 .187573 .157247 .154732 .14732 .12446
+aline .236855 .12446
+bezier .240784 .116667 .229911 .110376 .224155 .10668
+aline .219075 .10414
+aline .215265 .10287
+aline .21209 .102235
+aline .20955 .102235
+aline .20828 .10287
+aline .207645 .103505
+aline .20701 .10541
+aline .1397 .10541
+bezier .126331 .073716 .114406 .040178 .094615 .012065
+bezier .749457E-01 -.106064E-01 .357057E-01 -.234323E-01 .013335 .00254
+bezier .90762E-02 .820302E-02 .241458E-02 .167232E-01 .010795 .022225
+bezier .017791 .269974E-01 .275884E-01 .352451E-01 .036195 .031115
+bezier .407486E-01 .166973E-01 .569191E-01 .582223E-02 .07112 .00762
+bezier .106197 .738934E-01 .133743 .14566 .146685 .21971
+bezier .125583 .218359 .951516E-01 .215238 .088265 .189865
+bezier .843198E-01 .17855 .711252E-01 .171997 .05969 .170815
+aline .05842 .17145
+bezier .601479E-01 .192834 .805841E-01 .208332 .09779 .219075
+bezier .118318 .231056 .142732 .236963 .1651 .23876
+aline .269875 .23876
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="G" !-------------- Beginning of new char.
+dfont wid=.594866 hei=.683332 dep=.0972233 italic=.0593033
+dfont fby="0" kadd=.111115
+set path ! start of curve
+newpath
+! start of curve
+amove .17526 .24638
+bezier .187909 .244342 .208174 .243976 .211455 .22733
+bezier .211375 .206456 .196027 .189645 .183515 .174625
+bezier .176653 .170445 .167704 .16258 .159385 .16637
+bezier .162292 .174958 .170535 .181445 .174625 .189865
+bezier .181203 .199639 .186345 .215477 .173355 .22225
+bezier .136997 .235693 .906239E-01 .223447 .070485 .18796
+bezier .467272E-01 .149839 .342936E-01 .977829E-01 .06223 .059055
+bezier .844302E-01 .337442E-01 .126806 .388446E-01 .145415 .06604
+bezier .158983 .799658E-01 .164233 .997274E-01 .172085 .11684
+bezier .17933 .122673 .189025 .130294 .198755 .127635
+bezier .186281 .766632E-01 .175451 .199345E-01 .136525 -.01778
+bezier .104862 -.471395E-01 .054175 -.509963E-01 .01905 -.026035
+bezier .232893E-01 -.157446E-01 .370222E-01 -.850301E-02 .047625 -.00889
+bezier .677199E-01 -.201674E-01 .927317E-01 -.284034E-01 .1143 -.02032
+bezier .135505 -.117762E-02 .145738 .283756E-01 .153035 .055245
+bezier .123031 .296074E-01 .748428E-01 .009618 .03937 .03556
+bezier .112001E-01 .611858E-01 .132247E-01 .10266 .02286 .13589
+bezier .040994 .201777 .107646 .249905 .17526 .24638
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="H" !-------------- Beginning of new char.
+dfont wid=.844518 hei=.683332 dep=0 italic=.00965405
+dfont fby="0" kadd=.111115
+set path ! start of curve
+newpath
+! start of curve
+amove .10922 .23876
+bezier .120687 .237839 .130141 .225576 .126365 .21463
+bezier .125088 .188619 .118783 .163214 .113665 .136525
+aline .1143 .13716
+aline .11684 .13843
+aline .12065 .1397
+aline .12319 .140335
+aline .22098 .140335
+bezier .232697 .170247 .244567 .20083 .26162 .227965
+bezier .268801 .23313 .277622 .240287 .28702 .238125
+aline .287655 .236855
+bezier .255264 .170495 .223218 .985472E-01 .22479 .024765
+bezier .225067 .158359E-01 .227617 .449466E-02 .238125 .001905
+aline .24384 .001905
+aline .244475 .00254
+aline .24765 .003175
+aline .249827 .371929E-02
+bezier .253835 .161149E-01 .268611 .261264E-01 .281305 .02413
+bezier .277156 .326504E-02 .254792 -.747409E-02 .23622 -.01397
+bezier .222776 -.185124E-01 .20276 -.202161E-01 .19685 -.00381
+bezier .18971 .394386E-01 .202564 .820525E-01 .214757 .124079
+aline .214313 .124301
+aline .21336 .123825
+aline .211455 .12319
+aline .210185 .122555
+aline .20828 .12192
+aline .20574 .121285
+aline .10922 .121285
+bezier .974193E-01 .825562E-01 .855224E-01 .432069E-01 .06985 .005715
+aline .06477 .000635
+aline .0635 0
+aline .06223 -.00127
+aline .05969 -.00254
+aline .059055 -.003175
+aline .052705 -.00635
+aline .048895 -.00762
+aline .046355 -.008255
+aline .042545 -.008255
+aline .041275 -.006985
+bezier .659868E-01 .624002E-01 .928634E-01 .135724 .097155 .20701
+aline .09652 .207645
+bezier .093646 .222587 .754818E-01 .220767 .06477 .217805
+bezier .464304E-01 .216034 .414543E-01 .196508 .034925 .18288
+bezier .02777 .177321 .176458E-01 .168678 .008255 .172085
+bezier .154361E-01 .208697 .525467E-01 .230501 .086995 .23749
+aline .09144 .23749
+aline .092075 .238125
+aline .097155 .238125
+aline .09779 .23876
+closepath
+! end of curve
+
+! start of curve
+amove .21463 .12446
+aline .215265 .123825
+aline .2159 .12446
+aline .215265 .125095
+aline .21463 .12446
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="I" !-------------- Beginning of new char.
+dfont wid=.544516 hei=.683332 dep=0 italic=.073822
+dfont fby="0" kadd=.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .22225 .23876
+bezier .226592 .233002 .215908 .227652 .211455 .22479
+aline .21082 .224155
+aline .20574 .221615
+aline .20193 .220345
+aline .19939 .21971
+aline .15621 .21971
+bezier .13928 .195918 .132859 .166323 .125095 .13843
+aline .11684 .10541
+bezier .107988 .744128E-01 .991074E-01 .403791E-01 .07366 .01905
+aline .074295 .018415
+aline .1397 .018415
+aline .140335 .01905
+aline .14351 .01905
+aline .144145 .019685
+aline .146685 .02032
+aline .147955 .020955
+bezier .152389 .341169E-01 .165559 .443336E-01 .179705 .04445
+bezier .183112 .384699E-01 .175909 .316333E-01 .17272 .02667
+bezier .158103 .111923E-01 .136782 .153841E-02 .116205 -.000635
+aline -.00635 -.000635
+aline -.00762 0
+aline -.008255 .000635
+bezier -.480446E-02 .105975E-01 .683903E-02 .156067E-01 .01651 .018415
+aline .053975 .018415
+bezier .734717E-01 .372406E-01 .791519E-01 .661169E-01 .086995 .09144
+aline .09525 .12446
+bezier .103889 .157747 .113634 .194623 .13589 .21971
+aline .09144 .21971
+bezier .760453E-01 .217587 .594293E-01 .219425 .04572 .210185
+bezier .408603E-01 .201926 .393078E-01 .1912 .02921 .187325
+aline .028575 .18669
+aline .022225 .183515
+aline .018415 .182245
+aline .015875 .18161
+aline .012065 .18161
+bezier .872839E-02 .189678 .171886E-01 .198538 .02159 .205105
+bezier .045617 .230956 .826427E-01 .237441 .114935 .23876
+aline .22225 .23876
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="J" !-------------- Beginning of new char.
+dfont wid=.67778 hei=.683332 dep=.0972233 italic=.184721
+dfont fby="0" kadd=.166672
+set path ! start of curve
+newpath
+! start of curve
+amove .294005 .23876
+bezier .297428 .233159 .288243 .228721 .28448 .225425
+aline .28194 .224155
+aline .281305 .22352
+aline .2794 .222885
+aline .27686 .221615
+aline .271145 .21971
+bezier .253154 .222069 .245006 .202306 .236855 .189865
+bezier .21002 .140587 .203317 .837649E-01 .18415 .03175
+bezier .162221 -.101934E-01 .117114 -.439966E-01 .06858 -.042545
+bezier .393082E-01 -.418339E-01 .113048E-01 -.139482E-01 .017145 .015875
+bezier .155782E-01 .319022E-01 .340919E-01 .428959E-01 .047625 .042545
+aline .048895 .041275
+bezier .387469E-01 .146997E-01 .575933E-01 -.185196E-01 .086995 -.022225
+bezier .115788 -.303503E-01 .142401 -.659563E-02 .154305 .018415
+bezier .172394 .656241E-01 .178523 .117298 .20066 .163195
+bezier .21013 .184527 .222732 .204739 .2413 .219075
+aline .240665 .21971
+aline .18542 .21971
+bezier .157188 .217769 .130327 .196416 .123825 .16764
+bezier .118051 .158304 .105877 .150283 .094615 .151765
+bezier .988628E-01 .181293 .12466 .204138 .149225 .219075
+bezier .167403 .229778 .188797 .237029 .208915 .23876
+aline .294005 .23876
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="K" !-------------- Beginning of new char.
+dfont wid=.76195 hei=.683332 dep=0 italic=.0144453
+dfont fby="0" kadd=.0555573
+set path ! start of curve
+newpath
+! start of curve
+amove .09779 .24638
+aline .09906 .245745
+bezier .970419E-01 .166002 .068707 .829949E-01 .03937 .005715
+aline .03429 .000635
+aline .03302 0
+aline .03175 -.00127
+aline .02921 -.00254
+aline .028575 -.003175
+aline .022225 -.00635
+aline .018415 -.00762
+aline .015875 -.008255
+aline .012065 -.008255
+aline .010795 -.006985
+bezier .037167 .674058E-01 .652583E-01 .145902 .069215 .22225
+aline .682625E-01 .222726
+aline .05588 .216535
+aline .053975 .2159
+aline .052705 .215265
+aline .050165 .21463
+aline .045085 .21463
+bezier .431414E-01 .22206 .534004E-01 .225934 .05842 .22987
+aline .08636 .24384
+aline .088265 .244475
+aline .089535 .24511
+aline .09144 .245745
+aline .09398 .24638
+closepath
+! end of curve
+
+! start of curve
+amove .240665 .24638
+bezier .260573 .244989 .263824 .212617 .24384 .20828
+aline .240665 .207645
+aline .23876 .207645
+aline .236855 .20828
+aline .23622 .208915
+aline .235585 .210185
+bezier .240146 .219927 .232213 .235528 .220345 .23114
+bezier .180001 .217813 .144079 .194088 .113665 .1651
+bezier .984019E-01 .149919 .110671 .12944 .114935 .11176
+bezier .129853 .745506E-01 .145877 .346861E-01 .1778 .009525
+bezier .194327 .185381E-02 .215338 .974766E-02 .227965 .022225
+bezier .233795 .308521E-01 .235327 .439972E-01 .24765 .046355
+aline .250825 .04699
+aline .25146 .04699
+aline .253365 .046355
+aline .254635 .04572
+bezier .254173 .027865 .237612 .141747E-01 .22352 .00508
+bezier .203482 -.491044E-02 .178201 -.149931E-01 .15748 -.00254
+bezier .122788 .027024 .104583 .715405E-01 .09017 .1143
+bezier .857399E-01 .130129 .813113E-01 .148879 .094615 .161925
+bezier .128945 .198344 .172305 .224883 .219075 .243205
+aline .229235 .245745
+aline .233045 .245745
+aline .23368 .24638
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="L" !-------------- Beginning of new char.
+dfont wid=.689725 hei=.683332 dep=0 italic=0
+dfont fby="0" kadd=.138893
+set path ! start of curve
+newpath
+! start of curve
+amove .193675 .24638
+bezier .216683 .24341 .221899 .21457 .213995 .19685
+bezier .205485 .188614 .194039 .179617 .18161 .180975
+bezier .185473 .195909 .184555 .217706 .167005 .224155
+bezier .153056 .229384 .139043 .220421 .132715 .207645
+bezier .963634E-01 .155195 .988379E-01 .084898 .063881 .032258
+bezier .105114 .384539E-01 .145087 .117847E-01 .186055 .0127
+bezier .195099 .216859E-01 .195002 .373984E-01 .20828 .042545
+bezier .214409 .460608E-01 .222823 .522381E-01 .22987 .048895
+bezier .22231 .189145E-01 .192379 -.403493E-04 .16383 -.00762
+bezier .124562 -.128957E-01 .862963E-01 .113649E-01 .047625 .012065
+bezier .381519E-01 .217059E-02 .264178E-01 -.796225E-02 .012065 -.008255
+aline .010795 -.006985
+bezier .169426E-01 .641935E-02 .312154E-01 .145576E-01 .03683 .028575
+bezier .613226E-01 .707564E-01 .631573E-01 .121967 .084455 .165735
+bezier .101016 .206186 .136831 .240258 .180975 .24638
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="M" !-------------- Beginning of new char.
+dfont wid=1.2009 hei=.683332 dep=0 italic=0
+dfont fby="0" kadd=.138893
+set path ! start of curve
+newpath
+! start of curve
+amove .15367 .24638
+bezier .167495 .185265 .177621 .116643 .202565 .05588
+aline .206375 .04826
+aline .20701 .046355
+aline .207433 .455083E-01
+aline .207963 .452438E-01
+aline .208915 .04572
+aline .210185 .04699
+aline .211455 .047625
+aline .23495 .07112
+bezier .287749 .127735 .336034 .188076 .38608 .24638
+aline .38735 .24638
+aline .38862 .24511
+bezier .386335 .213966 .37732 .185662 .37465 .15621
+bezier .368425 .111847 .360441 .659825E-01 .36449 .01905
+bezier .364412 .113615E-01 .373807 .51296E-02 .380365 .01143
+aline .38227 .012065
+aline .38354 .0127
+aline .385445 .013335
+aline .38862 .01397
+aline .39116 .01397
+bezier .396482 .101946E-01 .387463 .431876E-02 .384175 .001905
+bezier .370883 -.579966E-02 .35135 -.182306E-01 .33782 -.00508
+bezier .331455 .982538E-02 .33412 .271339E-01 .333375 .043815
+bezier .336903 .903663E-01 .34403 .136025 .35052 .180975
+bezier .311937 .134535 .272992 .883565E-01 .231775 .043815
+aline .20447 .01651
+aline .2032 .015875
+aline .19939 .012065
+aline .19812 .01143
+aline .19431 .01143
+bezier .161464 .607483E-01 .152967 .122599 .139065 .179705
+aline .13716 .18923
+aline .13716 .192405
+aline .136525 .19304
+aline .13589 .196215
+bezier .120931 .129423 .099935 .628227E-01 .066675 .003175
+bezier .592937E-01 -.793242E-02 .480471E-01 -.219805E-01 .03302 -.017145
+bezier .218434E-01 -.146679E-01 .546404E-02 -.791517E-02 .010795 .00635
+aline .013335 .01397
+aline .015875 .01905
+aline .01651 .019685
+aline .017145 .020955
+aline .01778 .02159
+aline .018415 .02286
+bezier .235379E-01 .305662E-01 .283183E-01 .190593E-01 .03429 .018415
+bezier .442824E-01 .129936E-01 .576687E-01 .011391 .064135 .02286
+bezier .954978E-01 .795401E-01 .113797 .144949 .126365 .207645
+bezier .127751 .216842 .128328 .225837 .13081 .23495
+bezier .136239 .241545 .144645 .247021 .15367 .24638
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="N" !-------------- Beginning of new char.
+dfont wid=.820491 hei=.683332 dep=0 italic=.14736
+dfont fby="0" kadd=.0833359
+set path ! start of curve
+newpath
+! start of curve
+amove .342265 .271145
+bezier .346109 .260539 .340285 .246621 .332105 .239395
+bezier .313839 .239295 .292861 .238117 .2794 .224155
+bezier .265894 .186661 .256981 .147636 .24638 .10922
+aline .235585 .06604
+bezier .229913 .447849E-01 .226663 .226627E-01 .21971 .001905
+bezier .213697 -.572153E-02 .197436 -.156047E-01 .19177 -.00254
+bezier .151853 .593991E-01 .13117 .132051 .10795 .20193
+bezier .100998 .162479 .914392E-01 .120648 .07874 .08128
+aline .06858 .0508
+bezier .588439E-01 .266874E-01 .509853E-01 -.138534E-02 .028575 -.01651
+bezier .154235E-01 -.201883E-01 -.145592E-02 -.147264E-01 -.009525 -.00381
+aline -.009525 .003175
+aline -.00889 .00635
+aline -.00635 .01397
+aline -.003175 .02032
+aline -.00254 .020955
+aline -.001905 .022225
+aline .00127 .0254
+aline .00254 .026035
+bezier .136618E-01 .175745E-01 .343984E-01 .63527E-02 .04445 .022225
+bezier .503131E-01 .314013E-01 .538704E-01 .418822E-01 .057785 .05207
+aline .06731 .080645
+bezier .838818E-01 .132039 .093567 .185117 .10033 .23495
+bezier .105614 .241454 .116097 .249105 .12446 .24511
+bezier .148662 .16854 .170872 .896569E-01 .211455 .02032
+aline .21209 .019685
+aline .212725 .018415
+aline .21336 .020955
+aline .213995 .02413
+aline .215265 .02921
+aline .2159 .032385
+aline .217805 .040005
+aline .21844 .04318
+aline .221615 .05588
+aline .22225 .059055
+aline .233045 .102235
+bezier .247371 .150893 .256048 .202098 .278765 .24765
+bezier .292779 .26814 .319703 .271643 .342265 .271145
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="O" !-------------- Beginning of new char.
+dfont wid=.796114 hei=.683332 dep=0 italic=.0277786
+dfont fby="0" kadd=.111115
+set path ! start of curve
+newpath
+! start of curve
+amove .13843 .24638
+bezier .142246 .239813 .131368 .235293 .127 .231775
+bezier .601281E-01 .195214 .242022E-01 .983217E-01 .071755 .03429
+bezier .103422 -.639567E-03 .159582 .614301E-02 .19177 .03683
+bezier .236204 .781283E-01 .257964 .14857 .230505 .203835
+bezier .215696 .229653 .172947 .237605 .155575 .210185
+bezier .144332 .197596 .137442 .181573 .130175 .16637
+bezier .123064 .159347 .113343 .151754 .10287 .153035
+aline .1016 .154305
+bezier .119155 .202632 .162625 .248247 .21717 .24638
+bezier .248186 .245229 .270373 .214706 .271145 .18542
+bezier .280855 .114694 .235196 .431241E-01 .17272 .010795
+bezier .135009 -.930805E-02 .857482E-01 -.191288E-01 .050165 .009525
+bezier .164881E-01 .400265E-01 .154408E-01 .893753E-01 .02667 .12954
+bezier .433177E-01 .18195 .846544E-01 .225168 .13462 .24638
+aline .13843 .24638
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="P" !-------------- Beginning of new char.
+dfont wid=.69556 hei=.683332 dep=0 italic=.082222
+dfont fby="0" kadd=.0833359
+set path ! start of curve
+newpath
+! start of curve
+amove .17907 .23876
+bezier .208401 .236572 .248537 .226337 .257175 .192405
+bezier .26169 .148247 .224322 .111749 .18796 .09271
+bezier .162734 .786403E-01 .133995 .709461E-01 .106045 .07112
+bezier .102418 .775535E-01 .113035 .822558E-01 .117475 .085725
+bezier .13023 .933106E-01 .14525 .885458E-01 .158115 .093345
+bezier .197019 .998758E-01 .231914 .136702 .22733 .17653
+bezier .219132 .207856 .181886 .21722 .15494 .21971
+aline .127 .21971
+bezier .117554 .146232 .984485E-01 .660184E-01 .066675 -.00508
+bezier .595248E-01 -.119293E-01 .493533E-01 -.189882E-01 .03937 -.01778
+bezier .404804E-01 -.607264E-02 .483012E-01 .531798E-02 .051435 .017145
+bezier .755082E-01 .832682E-01 .936162E-01 .153757 .097155 .21971
+bezier .791508E-01 .218261 .564287E-01 .2172 .043815 .201295
+bezier .383975E-01 .192585 .372931E-01 .180889 .02667 .17653
+aline .01905 .17272
+aline .01524 .17145
+aline .012065 .170815
+aline .01016 .170815
+aline .00889 .17145
+bezier .944569E-02 .191599 .286078E-01 .206802 .04445 .21717
+bezier .657749E-01 .230557 .918066E-01 .236985 .11557 .23876
+aline .17907 .23876
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="Q" !-------------- Beginning of new char.
+dfont wid=.81667 hei=.683332 dep=.0972233 italic=0
+dfont fby="0" kadd=.111115
+set path ! start of curve
+newpath
+! start of curve
+amove .202565 .24638
+bezier .241244 .244682 .271341 .207767 .271145 .17018
+bezier .2772 .104945 .230224 .444783E-01 .174625 .014605
+aline .161925 .008255
+aline .16002 .00762
+aline .15621 .005715
+aline .154305 .00508
+aline .151765 .00381
+aline .147955 .00254
+aline .146685 .001905
+aline .13716 -.00127
+aline .13462 -.001905
+bezier .167587 -.133171E-01 .202278 -.302002E-01 .236855 -.023495
+bezier .246713 -.171856E-01 .245382 -.208724E-02 .257175 .00254
+aline .258445 .003175
+aline .25908 .00381
+aline .26416 .00635
+aline .266065 .006985
+aline .267335 .00762
+aline .269875 .008255
+aline .27559 .008255
+bezier .275782 -.825363E-02 .259759 -.021082 .247015 -.029845
+bezier .206066 -.580296E-01 .156652 -.039068 .1143 -.023495
+bezier .926005E-01 -.163131E-01 .711665E-01 -.959003E-02 .048895 -.01016
+bezier .450788E-01 -.359255E-02 .559571E-01 .927042E-03 .060325 .004445
+aline .064135 .00635
+aline .06604 .006985
+aline .06731 .00762
+bezier .100274 .106245E-01 .132313 .68711E-02 .163195 .020955
+bezier .227771 .508106E-01 .266116 .140051 .22479 .20193
+bezier .197356 .237509 .142607 .233112 .112395 .203835
+bezier .777275E-01 .171616 .533262E-01 .114347 .08382 .07239
+bezier .104679 .486602E-01 .139999 .509428E-01 .1651 .066675
+aline .16891 .067945
+aline .17145 .06858
+aline .17526 .06858
+bezier .178683 .629786E-01 .169498 .585409E-01 .165735 .055245
+bezier .132429 .356825E-01 .838485E-01 .228002E-01 .05461 .055245
+bezier .022904 .976308E-01 .479111E-01 .155673 .08001 .1905
+bezier .111685 .223418 .15619 .248525 .202565 .24638
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="R" !-------------- Beginning of new char.
+dfont wid=.847504 hei=.683332 dep=0 italic=0
+dfont fby="0" kadd=.0833359
+set path ! start of curve
+newpath
+! start of curve
+amove .17907 .23876
+bezier .203765 .236127 .236258 .237186 .25273 .21336
+bezier .266591 .183075 .244662 .149184 .22098 .13081
+bezier .207073 .118659 .189848 .110315 .172879 .103187
+bezier .194135 .766044E-01 .197494 .379812E-01 .222885 .014605
+bezier .238092 .430234E-02 .257429 .160719E-01 .26543 .03048
+bezier .272611 .375279E-01 .283768 .470939E-01 .294005 .04318
+bezier .278943 .149316E-01 .246356 -.393667E-02 .215265 -.008255
+bezier .189193 -.114583E-01 .177596 .166507E-01 .16891 .036195
+bezier .158067 .569131E-01 .152913 .853366E-01 .12954 .09525
+aline .125095 .09525
+bezier .121279 .101817 .132157 .106337 .136525 .109855
+bezier .149438 .117184 .163843 .112909 .177165 .11811
+bezier .210637 .125663 .238428 .165765 .22225 .19812
+bezier .208956 .215014 .185052 .216652 .16637 .219075
+aline .155575 .219075
+aline .15494 .21971
+aline .127 .21971
+bezier .118622 .149477 .998912E-01 .735993E-01 .06985 .005715
+aline .06477 .000635
+aline .0635 0
+aline .06223 -.00127
+aline .05969 -.00254
+aline .059055 -.003175
+aline .052705 -.00635
+aline .048895 -.00762
+aline .046355 -.008255
+aline .042545 -.008255
+bezier .396271E-01 -.26519E-02 .465807E-01 .407817E-02 .047625 .01016
+bezier .741972E-01 .778289E-01 .939026E-01 .151197 .097155 .21971
+bezier .791508E-01 .218261 .564287E-01 .2172 .043815 .201295
+bezier .383975E-01 .192585 .372931E-01 .180889 .02667 .17653
+aline .01905 .17272
+aline .01524 .17145
+aline .012065 .170815
+aline .01016 .170815
+aline .00889 .17145
+bezier .944569E-02 .191599 .286078E-01 .206802 .04445 .21717
+bezier .657749E-01 .230557 .918066E-01 .236985 .11557 .23876
+aline .17907 .23876
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="S" !-------------- Beginning of new char.
+dfont wid=.605558 hei=.683332 dep=0 italic=.074995
+dfont fby="0" kadd=.138893
+set path ! start of curve
+newpath
+! start of curve
+amove .17653 .24638
+bezier .194062 .24394 .221058 .239562 .22479 .217805
+bezier .225977 .205265 .222476 .191147 .20955 .186055
+aline .20447 .183515
+aline .20066 .182245
+aline .19812 .18161
+aline .19431 .18161
+aline .19304 .182245
+bezier .195126 .193648 .197654 .208786 .186055 .216535
+bezier .160936 .23035 .124775 .23428 .104775 .210185
+bezier .088741 .189444 .100048 .159972 .122555 .149225
+bezier .150635 .132644 .189806 .123302 .200025 .088265
+bezier .205648 .492387E-01 .169934 .190734E-01 .13716 .00508
+bezier .101369 -.107683E-01 .564518E-01 -.166014E-01 .02413 .009525
+bezier .49101E-02 .237237E-01 .193403E-02 .506138E-01 .01524 .06985
+bezier .245703E-01 .827055E-01 .410867E-01 .938292E-01 .05715 .092075
+bezier .570466E-01 .803497E-01 .377886E-01 .802807E-01 .0381 .06731
+bezier .296917E-01 .367486E-01 .650948E-01 .012286 .09271 .01143
+bezier .120948 .839021E-02 .158427 .176022E-01 .168275 .048895
+bezier .178461 .736322E-01 .158863 .098958 .136525 .10922
+bezier .111759 .123771 .770621E-01 .131568 .067945 .16256
+bezier .624461E-01 .198401 .963956E-01 .225051 .126365 .23749
+bezier .142736 .24443 .159138 .246881 .17653 .24638
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="T" !-------------- Beginning of new char.
+dfont wid=.544644 hei=.683332 dep=0 italic=.254168
+dfont fby="0" kadd=.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .278765 .250825
+aline .280035 .25019
+bezier .274294 .23312 .254363 .225282 .238125 .220345
+aline .23495 .21971
+aline .231775 .21971
+aline .23114 .219075
+aline .226695 .219075
+aline .22606 .21844
+aline .216535 .21844
+aline .2159 .217805
+aline .17653 .217805
+bezier .168406 .198755 .16383 .178094 .158115 .158115
+aline .14859 .120015
+bezier .13863 .839774E-01 .127299 .450778E-01 .097155 .020955
+aline .09779 .02032
+aline .15113 .02032
+aline .1524 .01905
+bezier .1471 .845124E-02 .134853 .278923E-02 .123825 -.000635
+aline .041275 -.000635
+bezier .400833E-01 .750029E-02 .514043E-01 .116531E-01 .05715 .015875
+aline .05969 .017145
+bezier .678124E-01 .022114 .796377E-01 .174561E-01 .08382 .02794
+bezier .999163E-01 .497143E-01 .106903 .769841E-01 .1143 .10287
+aline .123825 .14097
+bezier .130696 .16694 .138114 .194106 .149225 .217805
+aline .06858 .217805
+bezier .054255 .209289 .485808E-01 .191683 .04318 .17653
+bezier .348136E-01 .168226 .229455E-01 .158883 .010795 .160655
+bezier .181043E-01 .199678 .534027E-01 .228659 .090805 .238125
+aline .09398 .238125
+aline .094615 .23876
+aline .241935 .23876
+aline .24257 .239395
+bezier .25518 .236748 .262903 .249296 .274955 .250825
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="U" !-------------- Beginning of new char.
+dfont wid=.625832 hei=.683332 dep=0 italic=.0993061
+dfont fby="0" kadd=.0833359
+set path ! start of curve
+newpath
+! start of curve
+amove .06985 .23876
+bezier .086103 .236416 .835147E-01 .217137 .08001 .20574
+bezier .648388E-01 .154744 .338595E-01 .107837 .024765 .05588
+bezier .234255E-01 .384128E-01 .280597E-01 .148846E-01 .04826 .010795
+bezier .750583E-01 .107325E-01 .935877E-01 .345029E-01 .111125 .05207
+bezier .155861 .101621 .191862 .159586 .212725 .224155
+bezier .219536 .231939 .230394 .240069 .2413 .238125
+bezier .240116 .225057 .233548 .211843 .2286 .19939
+aline .21717 .1651
+bezier .203156 .11578 .184331 .654744E-01 .182245 .015875
+aline .18288 .01524
+bezier .184951 .589596E-02 .194398 .106359E-01 .200025 .013335
+aline .2032 .01397
+aline .20574 .01397
+bezier .211062 .101946E-01 .202043 .431876E-02 .198755 .001905
+bezier .186358 -.511341E-02 .167804 -.170896E-01 .15494 -.00508
+bezier .148999 .593146E-02 .155182 .184295E-01 .15494 .029845
+bezier .158473 .535567E-01 .167007 .786532E-01 .172085 .102235
+bezier .1373 .565638E-01 .968526E-01 .674789E-02 .0381 -.00762
+bezier .228734E-01 -.109955E-01 .495296E-02 -.490185E-02 -.00127 .010795
+bezier -.141518E-01 .515323E-01 .111241E-01 .918436E-01 .0254 .12954
+bezier .359129E-01 .155936 .518374E-01 .182319 .052705 .21082
+bezier .04935 .224699 .312039E-01 .220068 .02286 .21336
+aline .01524 .20955
+aline .01143 .20828
+aline .00889 .207645
+aline .005715 .207645
+aline .004445 .20828
+bezier .454785E-02 .217283 .016489 .22111 .02286 .22606
+bezier .344585E-01 .232432 .474524E-01 .237451 .060325 .23876
+closepath
+! end of curve
+
+! start of curve
+amove .172085 .10287
+aline .17272 .102235
+aline .173355 .10287
+aline .17272 .103505
+aline .172085 .10287
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="V" !-------------- Beginning of new char.
+dfont wid=.612782 hei=.683332 dep=0 italic=.082222
+dfont fby="0" kadd=.0277786
+set path ! start of curve
+newpath
+! start of curve
+amove .041275 .23876
+bezier .794211E-01 .234372 .942913E-01 .190592 .097155 .15748
+aline .09779 .156845
+aline .09779 .1524
+aline .098425 .151765
+aline .098425 .14605
+aline .09906 .145415
+aline .09906 .13843
+aline .099695 .137795
+aline .099695 .127
+aline .10033 .126365
+aline .10033 .092075
+bezier .990666E-01 .713652E-01 .974352E-01 .508079E-01 .09525 .03048
+bezier .117838 .454454E-01 .13851 .671861E-01 .15875 .086995
+bezier .181921 .113185 .206764 .139746 .21717 .17399
+bezier .218644 .191644 .20264 .208474 .184785 .20701
+bezier .18088 .217733 .18716 .23095 .194945 .23876
+bezier .213879 .240902 .230744 .224076 .231775 .20574
+bezier .233111 .156902 .201625 .114655 .17272 .07874
+aline .16891 .07493
+aline .168275 .07366
+aline .16383 .069215
+aline .163195 .067945
+aline .15621 .06096
+aline .155575 .05969
+aline .13081 .034925
+bezier .110971 .168191E-01 .908724E-01 -.926799E-03 .069215 -.01651
+aline .06604 -.01651
+bezier .639984E-01 -.279361E-02 .699522E-01 .989963E-02 .06985 .023495
+bezier .730171E-01 .419345E-01 .073334 .615547E-01 .07493 .080645
+aline .07493 .1143
+bezier .722936E-01 .146922 .698045E-01 .185663 .04445 .211455
+bezier .035804 .2199 .229677E-01 .221029 .0127 .22352
+bezier .154339E-01 .234863 .301836E-01 .240236 .041275 .23876
+closepath
+! end of curve
+
+! start of curve
+amove .09525 .02921
+aline .095885 .029845
+aline .09525 .03048
+aline .094615 .029845
+aline .09525 .02921
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="W" !-------------- Beginning of new char.
+dfont wid=.987783 hei=.683332 dep=0 italic=.082222
+dfont fby="0" kadd=.0833359
+set path ! start of curve
+newpath
+! start of curve
+amove .041275 .23876
+bezier .759516E-01 .23507 .894515E-01 .194816 .090805 .1651
+aline .09144 .164465
+aline .09144 .15875
+aline .092075 .158115
+aline .092075 .14859
+aline .09271 .147955
+aline .09271 .117475
+bezier .911442E-01 .929415E-01 .883964E-01 .688975E-01 .08509 .045085
+bezier .096401 .555818E-01 .106234 .726067E-01 .11684 .085725
+bezier .146093 .127821 .173505 .171387 .196638 .217805
+bezier .1904 .228939 .205062 .236348 .213995 .23876
+aline .21844 .23876
+bezier .239361 .189298 .248832 .132136 .255905 .081915
+bezier .257438 .065003 .258694 .047976 .26035 .031115
+bezier .294897 .744353E-01 .33032 .11908 .348615 .17272
+bezier .352303 .187566 .342834 .20807 .32512 .20701
+bezier .321207 .217665 .327223 .231445 .33528 .23876
+bezier .351593 .240787 .362773 .224508 .363855 .210185
+bezier .364892 .155823 .331027 .107284 .302895 .0635
+bezier .283078 .358574E-01 .262499 .876372E-02 .239395 -.01651
+aline .23622 -.01651
+bezier .233937 .582916E-01 .225335 .127866 .202057 .201549
+bezier .160514 .124694 .112478 .500045E-01 .055245 -.01651
+aline .05207 -.01651
+bezier .499845E-01 .14124E-03 .581614E-01 .169686E-01 .059055 .03302
+bezier .664455E-01 .083371 .748356E-01 .140093 .056515 .191135
+bezier .499704E-01 .208968 .331941E-01 .223352 .01397 .22225
+aline .0127 .22352
+bezier .154339E-01 .234863 .301836E-01 .240236 .041275 .23876
+closepath
+! end of curve
+
+! start of curve
+amove .08509 .04318
+aline .855663E-01 .441325E-01
+aline .08509 .045085
+aline .846137E-01 .441325E-01
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="X" !-------------- Beginning of new char.
+dfont wid=.713297 hei=.683332 dep=0 italic=.146428
+dfont fby="0" kadd=.138893
+set path ! start of curve
+newpath
+! start of curve
+amove .142875 .23876
+bezier .164856 .235791 .166953 .208953 .16891 .192405
+bezier .170208 .174534 .171484 .156141 .174307 .139224
+bezier .200707 .155498 .228187 .170276 .250825 .19177
+bezier .256879 .200796 .255083 .220284 .2413 .21971
+bezier .23797 .225182 .246895 .229981 .250825 .233045
+bezier .260806 .240923 .279603 .241711 .28321 .226695
+bezier .288834 .199488 .260551 .183918 .24257 .17018
+bezier .220957 .15438 .197008 .141329 .174784 .126683
+bezier .17979 .943028E-01 .177375 .616289E-01 .18796 .029845
+bezier .1912 .222336E-01 .201725 .153751E-01 .208915 .019685
+bezier .215415 .283265E-01 .226818 .357524E-01 .23749 .034925
+bezier .23965 .259074E-01 .229071 .174781E-01 .22225 .012065
+bezier .205838 .171579E-02 .183792 -.618377E-02 .165735 .00381
+bezier .148922 .019764 .153144 .444535E-01 .149225 .064135
+bezier .148033 .792118E-01 .147443 .095049 .144462 .109061
+bezier .112326 .894291E-01 .785306E-01 .720993E-01 .0508 .046355
+bezier .044267 .364662E-01 .472666E-01 .173543E-01 .061595 .01778
+bezier .059907 .729483E-02 .468295E-01 .236371E-02 .037465 -.000635
+bezier .178746E-01 -.395705E-02 .01249 .223228E-01 .022225 .034925
+bezier .490807E-01 .679793E-01 .888181E-01 .086255 .123825 .10922
+bezier .130352 .113608 .13894 .116718 .143907 .122238
+bezier .140064 .150619 .14147 .178552 .132715 .206375
+bezier .129853 .215249 .120019 .222031 .111125 .219075
+bezier .105077 .209967 .937907E-01 .202913 .08255 .2032
+bezier .795854E-01 .209767 .876935E-01 .216773 .092075 .221615
+bezier .103416 .230949 .118117 .237713 .132715 .23876
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="Y" !-------------- Beginning of new char.
+dfont wid=.668337 hei=.683332 dep=.0972233 italic=.082222
+dfont fby="0" kadd=.0833359
+set path ! start of curve
+newpath
+! start of curve
+amove .0762 .23876
+bezier .115652 .233933 .132055 .190812 .13843 .15621
+bezier .141924 .136117 .143483 .115936 .14478 .09525
+aline .14478 .055245
+aline .144145 .05461
+aline .144145 .040005
+aline .14351 .03937
+aline .14351 .03429
+bezier .166651 .540036E-01 .187291 .810117E-01 .205105 .10668
+bezier .219571 .130953 .235879 .157624 .238125 .186055
+bezier .235974 .20101 .222365 .213311 .20701 .21209
+bezier .202527 .220666 .207762 .233037 .215265 .23876
+bezier .234691 .240728 .250305 .223156 .25146 .205105
+bezier .251351 .158198 .224902 .115219 .200025 .07747
+bezier .163768 .288882E-01 .120583 -.192309E-01 .065405 -.046355
+bezier .370624E-01 -.570788E-01 .187698E-02 -.265067E-01 .01397 .003175
+aline .015875 .006985
+aline .01651 .00762
+aline .017145 .00889
+aline .02032 .012065
+aline .02159 .0127
+aline .02286 .0127
+bezier .271233E-01 .440173E-02 .285948E-01 -.792218E-02 .0381 -.013335
+bezier .052081 -.247218E-01 .716419E-01 -.234093E-01 .085725 -.0127
+bezier .972002E-01 -.652902E-02 .107149 .176011E-02 .117475 .009525
+aline .117475 .017145
+aline .11811 .01778
+aline .11811 .02794
+aline .118745 .028575
+aline .118745 .04318
+aline .11938 .043815
+aline .11938 .083185
+bezier .1168 .123228 .114096 .16644 .089535 .20193
+bezier .801424E-01 .214636 .643144E-01 .222502 .048895 .22225
+bezier .434507E-01 .215352 .339408E-01 .208569 .024765 .21082
+bezier .246728E-01 .220498 .367847E-01 .226277 .043815 .231775
+aline .047625 .23368
+aline .04953 .234315
+aline .05207 .235585
+aline .057785 .23749
+aline .060325 .238125
+aline .0635 .23876
+aline .0762 .23876
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="Z" !-------------- Beginning of new char.
+dfont wid=.724726 hei=.683332 dep=0 italic=.079443
+dfont fby="0" kadd=.138893
+set path ! start of curve
+newpath
+! start of curve
+amove .172085 .23876
+bezier .196581 .237002 .22035 .228335 .24511 .22987
+bezier .252286 .233845 .260806 .240431 .26924 .238125
+bezier .266423 .228539 .256318 .221925 .250825 .21336
+bezier .235246 .19579 .219263 .178511 .2032 .16129
+aline .179705 .137795
+bezier .188809 .134995 .203404 .138955 .208915 .12827
+bezier .210544 .118532 .196815 .110094 .188595 .1143
+aline .188595 .11811
+aline .187325 .11938
+aline .183515 .12065
+aline .18034 .121285
+aline .179705 .12192
+aline .173355 .12192
+aline .17272 .122555
+aline .16383 .122555
+bezier .131039 .899475E-01 .966355E-01 .595774E-01 .06223 .02921
+bezier .108558 .326268E-01 .150795 .020034 .19685 .02032
+bezier .206289 .298619E-01 .210861 .042738 .215265 .055245
+bezier .223631 .063549 .2355 .728919E-01 .24765 .07112
+bezier .239313 .289002E-01 .195668 -.486189E-02 .1524 -.000635
+bezier .114528 .147913E-02 .781704E-01 .010483 .03937 .008255
+bezier .307675E-01 .61832E-02 .216758E-01 -.379809E-02 .0127 .000635
+bezier .226978E-01 .154254E-01 .397059E-01 .244187E-01 .05207 .037465
+bezier .830406E-01 .645628E-01 .116 .935921E-01 .14351 .122555
+aline .10541 .122555
+aline .10414 .12319
+aline .10287 .12446
+aline .10287 .126365
+aline .10414 .128905
+aline .10795 .132715
+aline .10922 .13335
+aline .109855 .133985
+aline .114935 .136525
+aline .117475 .13716
+aline .159385 .13716
+bezier .182088 .160073 .203959 .183585 .224631 .207962
+aline .224155 .208915
+bezier .186373 .203864 .151179 .22584 .113665 .213995
+bezier .101656 .207774 .103288 .190178 .09017 .184785
+bezier .835024E-01 .180816 .754124E-01 .175015 .06731 .177165
+bezier .739427E-01 .205626 .102533 .221636 .127635 .23241
+aline .135255 .23495
+aline .142875 .236855
+aline .14605 .23749
+aline .149225 .23749
+aline .14986 .238125
+aline .154305 .238125
+aline .15494 .23876
+aline .172085 .23876
+closepath
+! end of curve
+
+! start of curve
+amove .224155 .208915
+aline .22479 .20828
+aline .225425 .208915
+aline .22479 .20955
+aline .224155 .208915
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="[" !-------------- Beginning of new char.
+dfont wid=.666669 hei=.555557 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .02921 .208915
+aline .03048 .20828
+aline .03175 .207645
+aline .03302 .206375
+aline .03429 .203835
+aline .03429 .06096
+bezier .387752E-01 .257132E-01 .780729E-01 .780402E-02 .10922 .005715
+bezier .14318 .41959E-02 .186939 .163933E-01 .19812 .05334
+aline .198755 .05588
+aline .19939 .056515
+aline .19939 .060325
+aline .200025 .06096
+aline .200025 .203835
+aline .201295 .206375
+aline .202565 .207645
+aline .205105 .208915
+aline .208915 .208915
+aline .211455 .207645
+aline .212725 .206375
+aline .213995 .203835
+aline .213995 .05969
+bezier .210013 .172989E-01 .164233 -.636737E-02 .126365 -.008255
+bezier .848488E-01 -.111064E-01 .327574E-01 .681429E-02 .02159 .05207
+aline .020955 .055245
+aline .020955 .059055
+aline .02032 .05969
+aline .02032 .203835
+aline .02159 .206375
+aline .02286 .207645
+aline .02413 .20828
+aline .0254 .208915
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="\" !-------------- Beginning of new char.
+dfont wid=.666669 hei=.555557 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .126365 .208915
+bezier .164233 .207027 .210013 .183361 .213995 .14097
+aline .213995 -.003175
+aline .212725 -.005715
+aline .211455 -.006985
+aline .208915 -.008255
+aline .205105 -.008255
+aline .202565 -.006985
+aline .201295 -.005715
+aline .200025 -.003175
+aline .200025 .1397
+bezier .19554 .174947 .156242 .192856 .125095 .194945
+bezier .911351E-01 .196464 .473762E-01 .184267 .036195 .14732
+aline .03556 .14478
+aline .034925 .144145
+aline .034925 .140335
+aline .03429 .1397
+aline .03429 -.003175
+aline .03302 -.005715
+aline .03175 -.006985
+aline .02921 -.008255
+aline .0254 -.008255
+aline .02286 -.006985
+aline .02159 -.005715
+aline .02032 -.003175
+aline .02032 .14097
+bezier .243016E-01 .183361 .700816E-01 .207027 .10795 .208915
+aline .126365 .208915
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="]" !-------------- Beginning of new char.
+dfont wid=.666669 hei=.555557 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .02921 .208915
+aline .03048 .20828
+aline .03175 .207645
+aline .03302 .206375
+aline .03429 .203835
+aline .03429 .06096
+bezier .387752E-01 .257132E-01 .780729E-01 .780402E-02 .10922 .005715
+bezier .14318 .41959E-02 .186939 .163933E-01 .19812 .05334
+aline .198755 .05588
+aline .19939 .056515
+aline .19939 .060325
+aline .200025 .06096
+aline .200025 .203835
+aline .201295 .206375
+aline .202565 .207645
+aline .205105 .208915
+aline .208915 .208915
+aline .211455 .207645
+aline .212725 .206375
+aline .213995 .203835
+aline .213995 .05969
+bezier .210013 .172989E-01 .164233 -.636737E-02 .126365 -.008255
+bezier .848488E-01 -.111064E-01 .327574E-01 .681429E-02 .02159 .05207
+aline .020955 .055245
+aline .020955 .059055
+aline .02032 .05969
+aline .02032 .203835
+aline .02159 .206375
+aline .02286 .207645
+aline .02413 .20828
+aline .0254 .208915
+closepath
+! end of curve
+
+! start of curve
+amove .11938 .17399
+aline .12065 .173355
+aline .12192 .17272
+aline .12319 .17145
+aline .12446 .16891
+aline .12446 .1143
+aline .125095 .113665
+aline .179705 .113665
+aline .182245 .112395
+aline .183515 .111125
+aline .184785 .108585
+aline .184785 .104775
+aline .183515 .102235
+aline .182245 .100965
+aline .179705 .099695
+aline .125095 .099695
+aline .12446 .09906
+aline .12446 .043815
+bezier .122614 .371926E-01 .112336 .371926E-01 .11049 .043815
+aline .11049 .09906
+aline .109855 .099695
+aline .05461 .099695
+aline .05207 .100965
+aline .0508 .102235
+aline .04953 .104775
+aline .04953 .108585
+aline .0508 .111125
+aline .05207 .112395
+aline .05461 .113665
+aline .109855 .113665
+aline .11049 .1143
+aline .11049 .16891
+aline .11176 .17145
+aline .11303 .17272
+aline .1143 .173355
+aline .11557 .17399
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="^" !-------------- Beginning of new char.
+dfont wid=.666669 hei=.555557 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .11938 .208915
+bezier .129731 .198317 .132251 .18179 .1397 .16891
+bezier .164278 .112741 .18926 .056739 .213995 .000635
+aline .213995 -.003175
+aline .212725 -.005715
+aline .211455 -.006985
+aline .208915 -.008255
+aline .205105 -.008255
+bezier .196102 -.171384E-02 .195119 .116776E-01 .18923 .020955
+bezier .16506 .747347E-01 .141913 .131172 .116628 .183092
+bezier .088168 .11985 .613392E-01 .055551 .03175 -.006985
+aline .02921 -.008255
+aline .0254 -.008255
+bezier .145644E-01 -.353027E-02 .244565E-01 .794659E-02 .02667 .01524
+bezier .549993E-01 .786664E-01 .827865E-01 .142317 .111125 .20574
+aline .113665 .20828
+aline .114935 .208915
+aline .11938 .208915
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="_" !-------------- Beginning of new char.
+dfont wid=.666669 hei=.555557 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .02921 .208915
+bezier .382132E-01 .202374 .391962E-01 .188982 .045085 .179705
+bezier .692548E-01 .125926 .924026E-01 .694871E-01 .117687 .175683E-01
+bezier .146147 .808103E-01 .172976 .145109 .202565 .207645
+aline .205105 .208915
+aline .208915 .208915
+bezier .219751 .20419 .209859 .192713 .207645 .18542
+bezier .179316 .121994 .151529 .583426E-01 .12319 -.00508
+aline .12065 -.00762
+bezier .109117 -.113945E-01 .10782 .493019E-02 .103505 .012065
+bezier .756541E-01 .746676E-01 .480711E-01 .137381 .02032 .200025
+aline .02032 .203835
+aline .02159 .206375
+aline .02286 .207645
+aline .02413 .20828
+aline .0254 .208915
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="`" !-------------- Beginning of new char.
+dfont wid=.611113 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .02921 .24257
+aline .03048 .241935
+aline .03175 .2413
+aline .03302 .24003
+aline .03429 .23749
+aline .03429 .128905
+aline .034925 .12827
+aline .18796 .12827
+bezier .195261 .127628 .197006 .116578 .189865 .1143
+aline .034925 .1143
+aline .03429 .113665
+aline .03429 .004445
+aline .03302 .001905
+aline .03175 .000635
+aline .02921 -.000635
+aline .0254 -.000635
+aline .02286 .000635
+aline .02159 .001905
+aline .02032 .004445
+aline .02032 .23749
+aline .02159 .24003
+aline .02286 .2413
+aline .02413 .241935
+aline .0254 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="a" !-------------- Beginning of new char.
+dfont wid=.611113 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .18923 .24257
+aline .1905 .241935
+aline .19177 .2413
+aline .19304 .24003
+aline .19431 .23749
+aline .19431 .004445
+aline .19304 .001905
+aline .19177 .000635
+aline .18923 -.000635
+aline .18542 -.000635
+aline .18288 .000635
+aline .18161 .001905
+aline .18034 .004445
+aline .18034 .113665
+aline .179705 .1143
+aline .024765 .1143
+aline .023495 .114935
+aline .02159 .11684
+aline .02032 .11938
+aline .02032 .122555
+aline .02159 .125095
+aline .023495 .127
+aline .024765 .127635
+aline .027305 .12827
+aline .179705 .12827
+aline .18034 .128905
+aline .18034 .23749
+aline .18161 .24003
+aline .18288 .2413
+aline .18415 .241935
+aline .18542 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="b" !-------------- Beginning of new char.
+dfont wid=.444446 hei=.75 dep=.25 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .070485 .262255
+aline .071755 .26162
+aline .073025 .260985
+aline .074295 .259715
+aline .075565 .257175
+aline .075565 -.07366
+aline .0762 -.074295
+aline .14351 -.074295
+aline .14605 -.075565
+aline .147955 -.07747
+aline .14859 -.07874
+aline .14859 -.08382
+aline .147955 -.08509
+aline .14605 -.086995
+aline .14351 -.088265
+aline .066675 -.088265
+aline .064135 -.086995
+aline .062865 -.085725
+aline .061595 -.083185
+aline .061595 .257175
+aline .062865 .259715
+aline .064135 .260985
+aline .065405 .26162
+aline .066675 .262255
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="c" !-------------- Beginning of new char.
+dfont wid=.444446 hei=.75 dep=.25 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .089535 .262255
+aline .090805 .26162
+aline .092075 .260985
+aline .093345 .259715
+aline .094615 .257175
+aline .094615 -.083185
+aline .093345 -.085725
+aline .092075 -.086995
+aline .089535 -.088265
+aline .0127 -.088265
+aline .01016 -.086995
+aline .008255 -.08509
+aline .00762 -.08382
+aline .00762 -.07874
+aline .008255 -.07747
+aline .01016 -.075565
+aline .0127 -.074295
+aline .08001 -.074295
+aline .080645 -.07366
+aline .080645 .257175
+aline .081915 .259715
+aline .083185 .260985
+aline .084455 .26162
+aline .085725 .262255
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="d" !-------------- Beginning of new char.
+dfont wid=.444446 hei=.75 dep=.25 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .14351 .262255
+aline .14478 .26162
+aline .14605 .260985
+aline .147955 .25908
+aline .14859 .25781
+aline .14859 .25273
+aline .147955 .25146
+aline .14605 .249555
+aline .14351 .248285
+aline .0762 .248285
+aline .075565 .24765
+aline .075565 -.083185
+aline .074295 -.085725
+aline .073025 -.086995
+aline .070485 -.088265
+aline .066675 -.088265
+aline .064135 -.086995
+aline .062865 -.085725
+aline .061595 -.083185
+aline .061595 .257175
+aline .062865 .259715
+aline .064135 .260985
+aline .065405 .26162
+aline .066675 .262255
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="e" !-------------- Beginning of new char.
+dfont wid=.444446 hei=.75 dep=.25 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .089535 .262255
+aline .090805 .26162
+aline .092075 .260985
+aline .093345 .259715
+aline .094615 .257175
+aline .094615 -.083185
+aline .093345 -.085725
+aline .092075 -.086995
+aline .089535 -.088265
+aline .085725 -.088265
+aline .083185 -.086995
+aline .081915 -.085725
+aline .080645 -.083185
+aline .080645 .24765
+aline .08001 .248285
+aline .0127 .248285
+aline .01016 .249555
+aline .008255 .25146
+aline .00762 .25273
+aline .00762 .25781
+aline .008255 .25908
+aline .01016 .260985
+aline .01143 .26162
+aline .0127 .262255
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="f" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.75 dep=.25 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .147955 .262255
+aline .14859 .26162
+aline .14986 .260985
+aline .14986 .25654
+aline .14859 .255905
+bezier .127787 .255571 .103439 .243352 .099695 .220345
+aline .099695 .125095
+bezier .969959E-01 .104018 .768819E-01 .915467E-01 .057785 .086995
+bezier .768819E-01 .824433E-01 .969959E-01 .069972 .099695 .048895
+aline .099695 -.046355
+bezier .103439 -.693618E-01 .127787 -.815805E-01 .14859 -.081915
+aline .14986 -.08255
+aline .14986 -.086995
+bezier .124894 -.908098E-01 .092175 -.817478E-01 .079375 -.05715
+aline .078105 -.05334
+aline .07747 -.0508
+aline .07747 -.047625
+aline .076835 -.04699
+aline .076835 .04826
+bezier .726587E-01 .710364E-01 .489121E-01 .840271E-01 .027305 .08382
+aline .026035 .08509
+aline .026035 .0889
+aline .027305 .09017
+bezier .489121E-01 .899629E-01 .726586E-01 .102954 .076835 .12573
+aline .076835 .22098
+bezier .803246E-01 .249014 .112972 .26061 .13716 .262255
+aline .147955 .262255
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="g" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.75 dep=.25 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .038735 .262255
+bezier .627618E-01 .26068 .961883E-01 .249319 .099695 .22098
+aline .099695 .12573
+bezier .103725 .102989 .127035 .901075E-01 .14859 .09017
+aline .14986 .0889
+aline .14986 .08509
+aline .14859 .08382
+bezier .127035 .838825E-01 .103725 .710008E-01 .099695 .04826
+aline .099695 -.04699
+bezier .961883E-01 -.753293E-01 .627618E-01 -.866898E-01 .038735 -.088265
+aline .02794 -.088265
+aline .026035 -.08636
+aline .026035 -.08255
+bezier .453514E-01 -.807118E-01 .703136E-01 -.725216E-01 .075565 -.050165
+aline .0762 -.04699
+aline .076835 -.046355
+aline .076835 .048895
+bezier .794054E-01 .697451E-01 .993277E-01 .821924E-01 .11811 .086995
+bezier .993277E-01 .917976E-01 .794054E-01 .104245 .076835 .125095
+aline .076835 .220345
+bezier .729072E-01 .243443 .480806E-01 .255511 .027305 .255905
+aline .026035 .25654
+aline .026035 .26035
+aline .02794 .262255
+aline .038735 .262255
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="h" !-------------- Beginning of new char.
+dfont wid=.38889 hei=.75 dep=.25 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .111125 .262255
+bezier .122293 .256903 .111377 .244433 .109855 .23622
+bezier .909287E-01 .186544 .721128E-01 .136822 .535517E-01 .086995
+bezier .737423E-01 .300807E-01 .980648E-01 -.259268E-01 .116205 -.083185
+aline .114935 -.085725
+aline .113665 -.086995
+bezier .103118 -.09291 .100394 -.781661E-01 .09779 -.07112
+bezier .779332E-01 -.191212E-01 .584318E-01 .330249E-01 .038735 .08509
+bezier .567613E-01 .141914 .080796 .197559 .100965 .254
+aline .1016 .25527
+aline .102235 .257175
+aline .103505 .259715
+aline .104775 .260985
+aline .106045 .26162
+aline .107315 .262255
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="i" !-------------- Beginning of new char.
+dfont wid=.38889 hei=.75 dep=.25 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .02921 .262255
+bezier .378628E-01 .256738 .375441E-01 .244053 .042545 .235585
+bezier .060321 .185255 .082105 .135781 .09779 .08509
+bezier .755059E-01 .027888 .055547 -.306581E-01 .03175 -.086995
+aline .02921 -.088265
+aline .0254 -.088265
+bezier .142323E-01 -.829129E-01 .251477E-01 -.704434E-01 .02667 -.06223
+bezier .455962E-01 -.012554 .644122E-01 .371677E-01 .829733E-01 .086995
+bezier .627827E-01 .143909 .384602E-01 .199917 .02032 .257175
+aline .02159 .259715
+aline .02286 .260985
+aline .02413 .26162
+aline .0254 .262255
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="j" !-------------- Beginning of new char.
+dfont wid=.277779 hei=.75 dep=.25 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .0508 .262255
+aline .05207 .26162
+aline .05334 .260985
+aline .05461 .259715
+aline .05588 .257175
+aline .05588 -.083185
+aline .05461 -.085725
+aline .05334 -.086995
+aline .0508 -.088265
+aline .04699 -.088265
+aline .04445 -.086995
+aline .04318 -.085725
+aline .04191 -.083185
+aline .04191 .257175
+aline .04318 .259715
+aline .04445 .260985
+aline .04572 .26162
+aline .04699 .262255
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="k" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.75 dep=.25 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .055245 .262255
+aline .056515 .26162
+aline .057785 .260985
+aline .05969 .25908
+aline .060325 .25781
+aline .060325 -.08382
+aline .05969 -.08509
+aline .057785 -.086995
+aline .055245 -.088265
+aline .051435 -.088265
+aline .050165 -.08763
+aline .047625 -.08509
+aline .04699 -.08382
+aline .046355 -.081915
+aline .046355 .255905
+aline .04699 .25781
+aline .047625 .25908
+aline .050165 .26162
+aline .051435 .262255
+closepath
+! end of curve
+
+! start of curve
+amove .12446 .262255
+aline .12573 .26162
+aline .12827 .25908
+aline .128905 .25781
+aline .12954 .255905
+aline .12954 -.081915
+aline .128905 -.08382
+aline .12827 -.08509
+aline .12573 -.08763
+aline .12446 -.088265
+aline .12065 -.088265
+aline .11811 -.086995
+aline .116205 -.08509
+aline .11557 -.08382
+aline .11557 .25781
+aline .116205 .25908
+aline .11811 .260985
+aline .11938 .26162
+aline .12065 .262255
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="l" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.75 dep=.25 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .089535 .269875
+bezier .101882 .245103 .121183 .221957 .14859 .212725
+aline .14986 .211455
+aline .150495 .210185
+aline .150495 .20574
+aline .14986 .20447
+aline .14859 .2032
+bezier .134609 .204368 .12228 .215371 .111125 .22352
+aline .100965 .23368
+aline .10033 .23495
+aline .09779 .23749
+aline .097155 .23876
+aline .095885 .24003
+aline .09525 .239395
+aline .09525 -.065405
+bezier .104179 -.572194E-01 .114693 -.444386E-01 .127 -.0381
+bezier .133523 -.03447 .14112 -.285958E-01 .14859 -.02921
+aline .14986 -.03048
+bezier .154144 -.409529E-01 .139402 -.040677 .133985 -.04572
+bezier .113297 -.561728E-01 .100042 -.763124E-01 .089535 -.095885
+aline .086995 -.095885
+bezier .746484E-01 -.711127E-01 .553467E-01 -.479668E-01 .02794 -.038735
+aline .02667 -.037465
+aline .026035 -.036195
+aline .026035 -.03175
+aline .02667 -.03048
+aline .02794 -.02921
+bezier .041921 -.303779E-01 .542498E-01 -.413806E-01 .065405 -.04953
+aline .075565 -.05969
+aline .0762 -.06096
+aline .07874 -.0635
+aline .079375 -.06477
+aline .080645 -.06604
+aline .08128 -.065405
+aline .08128 .239395
+bezier .723506E-01 .231209 .618374E-01 .218429 .04953 .21209
+bezier .430073E-01 .20846 .354102E-01 .202586 .02794 .2032
+aline .02667 .20447
+bezier .223864E-01 .214943 .371278E-01 .214667 .042545 .21971
+bezier .632334E-01 .230163 .764884E-01 .250302 .086995 .269875
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="m" !-------------- Beginning of new char.
+dfont wid=.611113 hei=.75 dep=.25 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .10922 .269875
+bezier .126678 .228197 .158807 .192108 .20193 .175895
+aline .203835 .17399
+aline .203835 .16383
+aline .20193 .161925
+bezier .182156 .166214 .164614 .181117 .149225 .191135
+aline .149225 -.017145
+bezier .164614 -.712674E-02 .182156 .777606E-02 .20193 .012065
+aline .203835 .01016
+aline .203835 0
+bezier .162457 -.181126E-01 .12664 -.505421E-01 .111125 -.09398
+aline .10922 -.095885
+aline .106045 -.095885
+bezier .885873E-01 -.054207 .056458 -.181178E-01 .013335 -.001905
+aline .01143 0
+aline .01143 .01016
+aline .013335 .012065
+bezier .331089E-01 .777606E-02 .506509E-01 -.712673E-02 .06604 -.017145
+aline .06604 .191135
+bezier .506509E-01 .181117 .331089E-01 .166214 .013335 .161925
+aline .01143 .16383
+aline .01143 .17399
+bezier .528077E-01 .192103 .886247E-01 .224532 .10414 .26797
+aline .106045 .269875
+aline .10922 .269875
+closepath
+! end of curve
+
+! start of curve
+amove .10668 .2413
+bezier .993483E-01 .228112 .090148 .21627 .08001 .205105
+aline .08001 -.031115
+bezier .909263E-01 -.042139 .995973E-01 -.565642E-01 .108162 -.681567E-01
+bezier .115608 -.546671E-01 .124886 -.042498 .135255 -.031115
+aline .135255 .205105
+bezier .124339 .216129 .115668 .230553 .107103 .242147
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="n" !-------------- Beginning of new char.
+dfont wid=.500002 hei=.75 dep=.25 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .02921 .262255
+bezier .376973E-01 .256968 .372952E-01 .244549 .04191 .23622
+bezier .796645E-01 .130966 .117719 .258366E-01 .155575 -.079375
+aline .155575 -.083185
+aline .154305 -.085725
+aline .153035 -.086995
+aline .150495 -.088265
+aline .146685 -.088265
+aline .144145 -.086995
+bezier .100928 .253679E-01 .06192 .140094 .02032 .253365
+aline .02032 .257175
+aline .02159 .259715
+aline .02286 .260985
+aline .02413 .26162
+aline .0254 .262255
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="o" !-------------- Beginning of new char.
+dfont wid=.277779 hei=.694445 dep=.194443 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .036195 .203835
+bezier .620753E-01 .20193 .763547E-01 .174026 .07747 .15113
+bezier .082995 .101661 .290139E-01 .628817E-01 .04191 .01397
+bezier .447221E-01 -.235041E-02 .548549E-01 -.218805E-01 .07366 -.020955
+aline .0762 -.022225
+aline .076835 -.02286
+aline .07747 -.02413
+aline .07747 -.026035
+aline .076835 -.027305
+bezier .05631 -.364976E-01 .321547E-01 -.203833E-01 .0254 0
+bezier .134912E-01 .300243E-01 .235266E-01 .627426E-01 .040005 .089535
+bezier .574057E-01 .118874 .664183E-01 .156199 .045085 .18542
+aline .04064 .189865
+aline .03937 .1905
+aline .038735 .191135
+aline .034925 .19304
+aline .03302 .193675
+aline .032385 .19431
+aline .02667 .19431
+aline .02286 .19558
+aline .02032 .19812
+aline .02032 .200025
+aline .02286 .202565
+aline .02667 .203835
+aline .036195 .203835
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="p" !-------------- Beginning of new char.
+dfont wid=.833336 hei=.039999 dep=.960001 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .29464 .013335
+aline .29591 .0127
+aline .29718 .012065
+aline .29845 .010795
+aline .29972 .008255
+aline .29972 .004445
+bezier .244503 -.109096 .19072 -.223613 .13462 -.33655
+aline .13208 -.33782
+aline .125095 -.33782
+bezier .996105E-01 -.286105 .770933E-01 -.232232 .052705 -.179705
+bezier .443551E-01 -.184852 .373605E-01 -.194109 .02794 -.196215
+bezier .216991E-01 -.18956 .346541E-01 -.186006 .0381 -.18161
+bezier .493324E-01 -.174532 .590405E-01 -.163389 .07112 -.15875
+bezier .094648 -.204705 .114628 -.25374 .136525 -.30099
+bezier .187491 -.196842 .236648 -.915643E-01 .28829 .012065
+aline .28956 .0127
+aline .29083 .013335
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="q" !-------------- Beginning of new char.
+dfont wid=.750002 hei=.683332 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .024765 .23876
+aline .0254 .238125
+aline .056515 .238125
+aline .05715 .23749
+aline .070485 .23749
+aline .07112 .238125
+aline .102235 .238125
+aline .10287 .23876
+aline .11176 .23876
+aline .11303 .238125
+aline .113665 .23749
+aline .1143 .23622
+aline .1143 .23114
+aline .113665 .22987
+bezier .102795 .225879 .877979E-01 .232289 .079375 .222885
+aline .07874 .21971
+aline .078105 .219075
+aline .078105 .01016
+aline .07874 .009525
+aline .184785 .009525
+aline .18542 .01016
+aline .18542 .219075
+bezier .18444 .227911 .174692 .227635 .168275 .2286
+aline .151765 .2286
+aline .150495 .229235
+aline .14986 .22987
+aline .149225 .23114
+aline .149225 .23622
+aline .14986 .23749
+aline .150495 .238125
+aline .151765 .23876
+aline .160655 .23876
+aline .16129 .238125
+aline .192405 .238125
+aline .19304 .23749
+aline .206375 .23749
+aline .20701 .238125
+aline .238125 .238125
+aline .23876 .23876
+aline .24765 .23876
+aline .24892 .238125
+aline .249555 .23749
+aline .25019 .23622
+aline .25019 .23114
+aline .249555 .22987
+bezier .238685 .225879 .223688 .232289 .215265 .222885
+aline .21463 .21971
+aline .213995 .219075
+aline .213995 .01905
+bezier .214975 .102141E-01 .224723 .104901E-01 .23114 .009525
+aline .24765 .009525
+aline .24892 .00889
+aline .249555 .008255
+aline .25019 .006985
+aline .25019 .001905
+aline .249555 .000635
+aline .24892 0
+aline .24765 -.000635
+aline .015875 -.000635
+aline .014605 0
+aline .01397 .000635
+aline .013335 .001905
+aline .013335 .006985
+aline .01397 .008255
+bezier .248399E-01 .122461E-01 .398371E-01 .583618E-02 .04826 .01524
+aline .048895 .018415
+aline .04953 .01905
+aline .04953 .219075
+bezier .485501E-01 .227911 .388022E-01 .227635 .032385 .2286
+aline .015875 .2286
+aline .014605 .229235
+aline .01397 .22987
+aline .013335 .23114
+aline .013335 .23622
+aline .01397 .23749
+aline .014605 .238125
+aline .015875 .23876
+aline .024765 .23876
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="r" !-------------- Beginning of new char.
+dfont wid=.833336 hei=.683332 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .27432 .23876
+aline .27559 .23749
+aline .27559 .23495
+aline .23495 .15367
+aline .20828 .10033
+aline .207645 .098425
+aline .167005 .017145
+aline .15367 -.009525
+aline .1524 -.010795
+aline .14986 -.012065
+aline .142875 -.012065
+aline .140335 -.010795
+aline .139065 -.009525
+aline .098425 .071755
+aline .08509 .098425
+aline .084455 .10033
+aline .043815 .18161
+aline .017145 .23495
+aline .017145 .23749
+aline .018415 .23876
+aline .27432 .23876
+closepath
+! end of curve
+
+! start of curve
+amove .05969 .213995
+aline .060325 .21336
+aline .094615 .14478
+aline .09525 .142875
+aline .13589 .061595
+aline .15621 .020955
+aline .156845 .02032
+aline .196215 .09906
+aline .19685 .100965
+aline .23749 .182245
+aline .253206 .213677
+aline .25273 .21463
+aline .060325 .21463
+aline .05969 .213995
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="s" !-------------- Beginning of new char.
+dfont wid=.416669 hei=.694445 dep=.194445 italic=.111112
+set path ! start of curve
+newpath
+! start of curve
+amove .14224 .25019
+bezier .159224 .248037 .172805 .224715 .160655 .21082
+bezier .149714 .201209 .131799 .213614 .137795 .22733
+aline .139065 .22987
+aline .141605 .23241
+aline .142875 .233045
+aline .14351 .23368
+aline .14605 .23495
+aline .14859 .235585
+aline .151765 .23622
+bezier .145512 .244979 .131577 .245801 .126365 .235585
+bezier .113456 .207965 .115818 .178859 .111125 .150495
+bezier .104925 .835137E-01 .958823E-01 .209408E-01 .080645 -.046355
+bezier .759596E-01 -.650612E-01 .573203E-01 -.836314E-01 .03683 -.07493
+bezier .022903 -.695178E-01 .127969E-01 -.464722E-01 .02667 -.036195
+bezier .380859E-01 -.288619E-01 .531121E-01 -.413368E-01 .047625 -.053975
+aline .046355 -.056515
+aline .043815 -.059055
+aline .042545 -.05969
+aline .04191 -.060325
+aline .03937 -.061595
+aline .03683 -.06223
+aline .033655 -.062865
+bezier .039908 -.716241E-01 .538433E-01 -.724464E-01 .059055 -.06223
+bezier .719636E-01 -.346104E-01 .696024E-01 -.550415E-02 .074295 .02286
+bezier .080495 .898413E-01 .895376E-01 .152414 .104775 .21971
+bezier .109359 .233489 .118387 .247941 .133985 .25019
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="t" !-------------- Beginning of new char.
+dfont wid=.666669 hei=.555557 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .031115 .208915
+aline .032385 .20828
+aline .033655 .207645
+aline .034925 .206375
+aline .036195 .203835
+aline .036195 .01397
+aline .03683 .013335
+aline .197485 .013335
+aline .19812 .01397
+aline .19812 .203835
+aline .19939 .206375
+aline .20066 .207645
+aline .2032 .208915
+aline .20701 .208915
+aline .20955 .207645
+aline .21082 .206375
+aline .21209 .203835
+aline .21209 .004445
+aline .21082 .001905
+aline .20955 .000635
+aline .20701 -.000635
+aline .027305 -.000635
+aline .024765 .000635
+aline .023495 .001905
+aline .022225 .004445
+aline .022225 .203835
+aline .023495 .206375
+aline .024765 .207645
+aline .026035 .20828
+aline .027305 .208915
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="u" !-------------- Beginning of new char.
+dfont wid=.666669 hei=.555557 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .20701 .208915
+aline .20828 .20828
+aline .20955 .207645
+aline .21082 .206375
+aline .21209 .203835
+aline .21209 .004445
+aline .21082 .001905
+aline .20955 .000635
+aline .20701 -.000635
+aline .2032 -.000635
+aline .20066 .000635
+aline .19939 .001905
+aline .19812 .004445
+aline .19812 .19431
+aline .197485 .194945
+aline .03683 .194945
+aline .036195 .19431
+aline .036195 .004445
+aline .034925 .001905
+aline .033655 .000635
+aline .031115 -.000635
+aline .027305 -.000635
+aline .024765 .000635
+aline .023495 .001905
+aline .022225 .004445
+aline .022225 .203835
+aline .023495 .206375
+aline .024765 .207645
+aline .026035 .20828
+aline .027305 .208915
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="v" !-------------- Beginning of new char.
+dfont wid=.777781 hei=.635971 dep=.135971 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .245745 .22225
+aline .247015 .221615
+aline .249555 .219075
+aline .25019 .217805
+aline .250825 .2159
+aline .250825 .21463
+aline .25019 .212725
+aline .249555 .211455
+aline .247015 .208915
+aline .245745 .20828
+aline .04826 .20828
+aline .047625 .207645
+aline .047625 .033655
+aline .04826 .03302
+aline .24511 .03302
+aline .24765 .03175
+aline .249555 .029845
+aline .25019 .028575
+aline .250825 .02667
+aline .250825 .0254
+aline .25019 .023495
+aline .249555 .022225
+aline .247015 .019685
+aline .245745 .01905
+aline .038735 .01905
+aline .036195 .02032
+aline .034925 .02159
+aline .033655 .02413
+aline .033655 .21717
+aline .034925 .21971
+aline .036195 .22098
+aline .037465 .221615
+aline .038735 .22225
+closepath
+! end of curve
+
+! start of curve
+amove .24511 -.03556
+bezier .252103 -.372841E-01 .252388 -.471147E-01 .245745 -.04953
+aline .034925 -.04953
+aline .032385 -.04826
+aline .031115 -.04699
+aline .029845 -.04445
+aline .029845 -.04064
+aline .031115 -.0381
+aline .032385 -.03683
+aline .033655 -.036195
+aline .034925 -.03556
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="w" !-------------- Beginning of new char.
+dfont wid=.777781 hei=.635971 dep=.135971 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .234315 .22225
+aline .235585 .221615
+aline .236855 .22098
+aline .238125 .21971
+aline .239395 .21717
+aline .239395 .02413
+aline .238125 .02159
+aline .236855 .02032
+aline .234315 .01905
+aline .027305 .01905
+aline .026035 .019685
+aline .023495 .022225
+aline .02286 .023495
+aline .022225 .0254
+aline .022225 .02667
+aline .02286 .028575
+aline .023495 .029845
+aline .0254 .03175
+aline .02794 .03302
+aline .22479 .03302
+aline .225425 .033655
+aline .225425 .207645
+aline .22479 .20828
+aline .027305 .20828
+aline .026035 .208915
+aline .023495 .211455
+aline .02286 .212725
+aline .022225 .21463
+aline .022225 .2159
+aline .02286 .217805
+aline .023495 .219075
+aline .026035 .221615
+aline .027305 .22225
+closepath
+! end of curve
+
+! start of curve
+amove .238125 -.03556
+aline .239395 -.036195
+aline .240665 -.03683
+aline .241935 -.0381
+aline .243205 -.04064
+aline .243205 -.04445
+aline .241935 -.04699
+aline .240665 -.04826
+aline .238125 -.04953
+aline .027305 -.04953
+aline .026035 -.048895
+aline .023495 -.046355
+aline .02286 -.045085
+aline .022225 -.04318
+aline .022225 -.04191
+aline .02286 -.040005
+aline .023495 -.038735
+aline .0254 -.03683
+aline .02667 -.036195
+aline .02794 -.03556
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="x" !-------------- Beginning of new char.
+dfont wid=.444448 hei=.694445 dep=.194445 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .08382 .24638
+bezier .107015 .244809 .13233 .222589 .125095 .197485
+bezier .118478 .187016 .100131 .19384 .103505 .206375
+aline .10414 .208915
+aline .104775 .210185
+aline .10795 .21336
+aline .11049 .21463
+aline .112395 .215265
+aline .115217 .215829
+bezier .105972 .24208 .629179E-01 .249081 .0508 .22098
+bezier .334208E-01 .191712 .501134E-01 .151133 .08255 .14097
+bezier .107764 .130261 .135327 .10933 .131445 .07874
+bezier .129527 .570468E-01 .112505 .380217E-01 .09144 .032385
+bezier .114892 .217529E-01 .136975 -.187228E-02 .13081 -.02921
+bezier .125472 -.068607 .729419E-01 -.871797E-01 .043815 -.06096
+bezier .335168E-01 -.522758E-01 .268019E-01 -.374398E-01 .031115 -.02413
+bezier .377319E-01 -.136608E-01 .560787E-01 -.204854E-01 .052705 -.03302
+aline .05207 -.03556
+aline .051435 -.03683
+aline .04826 -.040005
+aline .04572 -.041275
+aline .043815 -.04191
+aline .409928E-01 -.424745E-01
+bezier .502387E-01 -.687244E-01 .932919E-01 -.757259E-01 .10541 -.047625
+bezier .122789 -.018357 .106097 .222221E-01 .07366 .032385
+bezier .484455E-01 .430937E-01 .208835E-01 .640246E-01 .024765 .094615
+bezier .266835E-01 .116308 .437053E-01 .135333 .06477 .14097
+bezier .413184E-01 .151602 .192353E-01 .175227 .0254 .202565
+bezier .029533 .229769 .569907E-01 .249502 .08382 .24638
+closepath
+! end of curve
+
+! start of curve
+amove .07366 .13462
+bezier .479817E-01 .128951 .390343E-01 .955152E-01 .046355 .07366
+bezier .518064E-01 .573534E-01 .649652E-01 .416341E-01 .081915 .0381
+bezier .109468 .449874E-01 .118752 .814027E-01 .10795 .104775
+bezier .101744 .118837 .894787E-01 .132284 .074295 .135255
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="y" !-------------- Beginning of new char.
+dfont wid=.444446 hei=.694445 dep=.194445 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .080645 .24638
+aline .08255 .245745
+aline .08509 .244475
+aline .088265 .2413
+bezier .923389E-01 .213135 .821901E-01 .187636 .081915 .16002
+aline .08128 .159385
+aline .08128 .15367
+bezier .977272E-01 .153334 .114965 .166005 .131445 .159385
+aline .13462 .15621
+aline .135255 .15494
+aline .13589 .1524
+aline .13589 .14732
+aline .135255 .14478
+bezier .126952 .132732 .11066 .140504 .09906 .142875
+aline .09144 .14478
+aline .088265 .145415
+aline .08763 .14605
+aline .08382 .14605
+aline .08255 .146473
+aline .08128 .14605
+bezier .825685E-01 .12836 .876708E-01 .110301 .089535 .09271
+aline .089535 .05207
+bezier .879028E-01 .909586E-02 .864213E-01 -.335148E-01 .081915 -.075565
+aline .080645 -.076835
+aline .075565 -.076835
+bezier .712207E-01 -.665197E-01 .735463E-01 -.540335E-01 .07112 -.04318
+bezier .692289E-01 -.115996E-01 .678525E-01 .020194 .066675 .05207
+aline .066675 .09271
+bezier .685392E-01 .110301 .736415E-01 .12836 .07493 .14605
+bezier .584828E-01 .146386 .041245 .133715 .024765 .140335
+aline .02159 .14351
+aline .020955 .14478
+aline .02032 .14732
+aline .02032 .1524
+aline .020955 .15494
+bezier .292579E-01 .166988 .455503E-01 .159216 .05715 .156845
+aline .06477 .15494
+aline .067945 .154305
+aline .06858 .15367
+aline .07239 .15367
+aline .07366 .153247
+aline .07493 .15367
+bezier .747378E-01 .183523 .640125E-01 .210992 .067945 .2413
+aline .07112 .244475
+aline .07366 .245745
+aline .075565 .24638
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="z" !-------------- Beginning of new char.
+dfont wid=.444446 hei=.694445 dep=.194445 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .080645 .24638
+bezier .946711E-01 .242584 .882996E-01 .225727 .088265 .2159
+bezier .861415E-01 .200753 .811125E-01 .185281 .081915 .17018
+bezier .988204E-01 .170744 .118863 .184909 .133985 .17399
+aline .135255 .17145
+aline .13589 .16891
+aline .13589 .164465
+aline .135255 .161925
+aline .133985 .159385
+bezier .11989 .149352 .101788 .160818 .08636 .16256
+aline .085725 .163195
+aline .081915 .163195
+bezier .807203E-01 .139744 .929481E-01 .116517 .088265 .092075
+aline .08509 .0889
+aline .08255 .08763
+aline .080645 .086995
+aline .075565 .086995
+bezier .615389E-01 .907911E-01 .679104E-01 .107648 .067945 .117475
+bezier .700685E-01 .132622 .750975E-01 .148094 .074295 .163195
+bezier .578495E-01 .162312 .396401E-01 .150131 .023495 .158115
+bezier .015627 .165173 .226822E-01 .180357 .032385 .1778
+aline .040005 .1778
+aline .046355 .17653
+aline .056515 .17399
+aline .05842 .173355
+aline .0635 .172085
+aline .06985 .170815
+aline .070485 .17018
+aline .074295 .17018
+bezier .754897E-01 .193631 .632619E-01 .216858 .067945 .2413
+aline .07112 .244475
+aline .07366 .245745
+aline .075565 .24638
+closepath
+! end of curve
+
+! start of curve
+amove .080645 .085725
+bezier .946711E-01 .819289E-01 .882996E-01 .650717E-01 .088265 .055245
+bezier .08572 .403163E-01 .821452E-01 .253876E-01 .08128 .01016
+bezier .977268E-01 .98235E-02 .114965 .224953E-01 .131445 .015875
+aline .13462 .0127
+aline .135255 .01143
+aline .13589 .00889
+aline .13589 .00381
+aline .135255 .00127
+bezier .126952 -.107784E-01 .11066 -.300572E-02 .09906 -.000635
+aline .09144 .00127
+aline .088265 .001905
+aline .08763 .00254
+aline .08382 .00254
+aline .08255 .296333E-02
+aline .08128 .00254
+bezier .818032E-01 -.211341E-01 .925275E-01 -.437626E-01 .088265 -.067945
+aline .08509 -.07112
+aline .08255 -.07239
+aline .080645 -.073025
+aline .075565 -.073025
+bezier .615389E-01 -.692289E-01 .679104E-01 -.523717E-01 .067945 -.042545
+bezier .07049 -.276163E-01 .740648E-01 -.126876E-01 .07493 .00254
+bezier .584832E-01 .28765E-02 .041245 -.979525E-02 .024765 -.003175
+aline .02159 0
+aline .020955 .00127
+aline .02032 .00381
+aline .02032 .00889
+aline .020955 .01143
+bezier .292578E-01 .234784E-01 .455503E-01 .157057E-01 .05715 .013335
+aline .06477 .01143
+aline .067945 .010795
+aline .06858 .01016
+aline .07239 .01016
+aline .07366 .973665E-02
+aline .07493 .01016
+bezier .744068E-01 .338341E-01 .636825E-01 .564626E-01 .067945 .080645
+aline .07112 .08382
+aline .07366 .08509
+aline .075565 .085725
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="{" !-------------- Beginning of new char.
+dfont wid=.611113 hei=.694445 dep=.194445 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .19939 .24257
+aline .20066 .241935
+aline .20193 .2413
+aline .2032 .24003
+aline .20447 .23749
+aline .20447 .23368
+aline .2032 .23114
+aline .20193 .22987
+aline .19939 .2286
+aline .175895 .2286
+aline .17526 .227965
+aline .17526 -.064135
+aline .17399 -.066675
+aline .17272 -.067945
+aline .17018 -.069215
+aline .16637 -.069215
+aline .16383 -.067945
+aline .16256 -.066675
+aline .16129 -.064135
+aline .16129 .227965
+aline .160655 .2286
+aline .136525 .2286
+aline .13589 .227965
+aline .13589 -.064135
+aline .13462 -.066675
+aline .13335 -.067945
+aline .13081 -.069215
+aline .127 -.069215
+aline .12446 -.067945
+aline .12319 -.066675
+aline .12192 -.064135
+aline .12192 .07874
+bezier .805151E-01 .813529E-01 .286318E-01 .102896 .020955 .14986
+bezier .127863E-01 .195969 .537435E-01 .24045 .099695 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="|" !-------------- Beginning of new char.
+dfont wid=.777781 hei=.694445 dep=.129629 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .14224 .254
+bezier .186974 .249842 .21037 .19477 .192405 .15621
+bezier .187884 .145647 .180702 .136668 .172244 .129222
+aline .177165 .11938
+aline .1778 .117475
+aline .179705 .113665
+bezier .19866 .137543 .239124 .130728 .252095 .10414
+bezier .27316 .677444E-01 .264307 .118933E-01 .22225 -.00508
+bezier .200585 -.134076E-01 .167312 -.648178E-02 .161925 .019685
+aline .161925 .023495
+aline .16129 .02413
+aline .144145 .02413
+bezier .141699 .191287E-02 .149094 -.189314E-01 .153035 -.041275
+aline .151765 -.043815
+aline .150495 -.045085
+aline .147955 -.046355
+aline .125095 -.046355
+aline .122555 -.045085
+aline .121285 -.043815
+bezier .117946 -.329933E-01 .126386 -.218094E-01 .126365 -.010795
+bezier .128256 .247473E-03 .1304 .125586E-01 .128905 .02413
+aline .11176 .02413
+bezier .110043 -.493607E-02 .725457E-01 -.149696E-01 .04953 -.004445
+bezier .136576E-02 .160964E-01 -.310575E-02 .906174E-01 .03683 .121285
+bezier .542657E-01 .133165 .798925E-01 .130087 .093345 .113665
+aline .09525 .117475
+aline .095885 .11938
+aline .100806 .129222
+bezier .595624E-01 .160769 .688888E-01 .236962 .12065 .252095
+aline .12319 .25273
+aline .126365 .253365
+aline .130175 .253365
+aline .13081 .254
+aline .14224 .254
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="}" !-------------- Beginning of new char.
+dfont wid=.777781 hei=.694445 dep=.129629 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .13843 .254
+aline .1397 .253365
+bezier .151933 .235764 .160199 .214538 .17272 .19685
+bezier .194634 .161326 .222559 .129326 .25273 .10033
+aline .25273 .095885
+bezier .206112 .525153E-01 .16954 .446452E-03 .14097 -.056515
+aline .13843 -.057785
+aline .13462 -.057785
+aline .13208 -.056515
+bezier .103439 -.495161E-03 .686716E-01 .515426E-01 .02159 .09398
+aline .02032 .09652
+aline .02032 .099695
+bezier .657145E-01 .143782 .103502 .194049 .13081 .25146
+aline .13208 .25273
+aline .13335 .253365
+aline .13462 .254
+closepath
+! end of curve
+
+! start of curve
+amove .13589 .22987
+bezier .110508 .180846 .784544E-01 .136159 .382587E-01 .981075E-01
+bezier .787723E-01 .597092E-01 .111057 .146127E-01 .136525 -.034925
+bezier .161993 .146127E-01 .194278 .597091E-01 .234791 .981075E-01
+bezier .194278 .136506 .161993 .181602 .136525 .23114
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="~" !-------------- Beginning of new char.
+dfont wid=.777781 hei=.694445 dep=.129629 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .084455 .25019
+bezier .106902 .24793 .127647 .232386 .136525 .211455
+bezier .151285 .250946 .211164 .265683 .23749 .22987
+bezier .26453 .186421 .254489 .128173 .22098 .090805
+aline .220345 .089535
+aline .217805 .086995
+aline .21717 .085725
+aline .213995 .08255
+aline .21336 .08128
+aline .207645 .075565
+aline .20701 .074295
+aline .18288 .050165
+bezier .162855 .345111E-01 .151064 .118508E-01 .14097 -.010795
+bezier .132389 -.016226 .128154 -.527858E-02 .126365 .00127
+bezier .118098 .201073E-01 .106094 .370134E-01 .09017 .050165
+aline .06604 .074295
+bezier .391836E-01 .102531 .015303 .140709 .020955 .180975
+bezier .202058E-01 .210996 .379788E-01 .247939 .071755 .25019
+aline .084455 .25019
+closepath
+! end of curve
+
+! start of curve
+amove .07239 .235585
+bezier .447795E-01 .233645 .356832E-01 .201219 .03429 .17907
+bezier .309746E-01 .14212 .530257E-01 .108984 .07747 .083185
+aline .100965 .05969
+bezier .116214 .047039 .128047 .311613E-01 .136525 .013335
+bezier .145003 .311613E-01 .156836 .047039 .172085 .05969
+aline .19558 .083185
+bezier .221865 .110464 .245314 .14799 .23749 .18669
+bezier .236553 .208045 .223823 .234066 .200025 .23622
+bezier .170787 .239462 .145663 .212949 .14351 .184785
+aline .14224 .182245
+aline .14097 .180975
+aline .13843 .179705
+bezier .125966 .178687 .130021 .194548 .125095 .20193
+bezier .117566 .22321 .945931E-01 .239525 .07239 .235585
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=127 !-------------- Beginning of new char.
+dfont wid=.777781 hei=.694445 dep=.129629 italic=0
diff --git a/src/fonts/texcmti.afm b/src/fonts/texcmti.afm
new file mode 100644
index 0000000..0aed077
--- /dev/null
+++ b/src/fonts/texcmti.afm
@@ -0,0 +1,331 @@
+StartFontMetrics 2.0
+Comment Made from TEX tfm file using TFMTOAFM.bas
+FontName CMTI10
+EncodingScheme TEXENCODING
+FullName CMTI10
+FamilyName CMTI10
+Weight Medium
+ItalicAngle 14.0363
+IsFixedPitch false
+UnderlinePosition -97
+UnderlineThickness 73
+FontBBox 0 -300 1001 1001
+CapHeight 729
+XHeight 151
+Descender -219
+Ascender 729
+StartCharMetrics 127
+C 1 ; WX 817 ; N C1 ; B 0 0 817 683 ;
+C 2 ; WX 766 ; N C2 ; B 0 0 766 683 ;
+C 3 ; WX 692 ; N C3 ; B 0 0 692 683 ;
+C 4 ; WX 664 ; N C4 ; B 0 0 664 683 ;
+C 5 ; WX 743 ; N C5 ; B 0 0 743 683 ;
+C 6 ; WX 715 ; N C6 ; B 0 0 715 683 ;
+C 7 ; WX 766 ; N C7 ; B 0 0 766 683 ;
+C 8 ; WX 715 ; N C8 ; B 0 0 715 683 ;
+C 9 ; WX 766 ; N C9 ; B 0 0 766 683 ;
+C 10 ; WX 715 ; N C10 ; B 0 0 715 683 ;
+C 11 ; WX 613 ; N C11 ; B 0 -194 613 694 ; L i C14 L l C15
+C 12 ; WX 562 ; N C12 ; B 0 -194 562 694 ;
+C 13 ; WX 587 ; N C13 ; B 0 -194 587 694 ;
+C 14 ; WX 881 ; N C14 ; B 0 -194 881 694 ;
+C 15 ; WX 894 ; N C15 ; B 0 -194 894 694 ;
+C 16 ; WX 306 ; N C16 ; B 0 0 306 430 ;
+C 17 ; WX 332 ; N C17 ; B 0 -194 332 430 ;
+C 18 ; WX 511 ; N C18 ; B 0 0 511 694 ;
+C 19 ; WX 511 ; N C19 ; B 0 0 511 694 ;
+C 20 ; WX 511 ; N C20 ; B 0 0 511 628 ;
+C 21 ; WX 511 ; N C21 ; B 0 0 511 694 ;
+C 22 ; WX 511 ; N C22 ; B 0 0 511 561 ;
+C 23 ; WX 831 ; N C23 ; B 0 0 831 694 ;
+C 24 ; WX 459 ; N C24 ; B 0 -170 459 0 ;
+C 25 ; WX 536 ; N C25 ; B 0 -194 536 694 ;
+C 26 ; WX 715 ; N C26 ; B 0 0 715 430 ;
+C 27 ; WX 715 ; N C27 ; B 0 0 715 430 ;
+C 28 ; WX 511 ; N C28 ; B 0 -97 511 527 ;
+C 29 ; WX 882 ; N C29 ; B 0 0 882 683 ;
+C 30 ; WX 984 ; N C30 ; B 0 0 984 683 ;
+C 31 ; WX 766 ; N C31 ; B 0 -48 766 731 ;
+C 32 ; WX 251 ; N C32 ; B 0 0 251 430 ;
+C 33 ; WX 306 ; N C33 ; B 0 0 306 694 ;
+C 34 ; WX 514 ; N C34 ; B 0 0 514 694 ;
+C 35 ; WX 817 ; N C35 ; B 0 -194 817 694 ;
+C 36 ; WX 769 ; N C36 ; B 0 0 769 694 ;
+C 37 ; WX 817 ; N C37 ; B 0 -55 817 750 ;
+C 38 ; WX 766 ; N C38 ; B 0 0 766 694 ;
+C 39 ; WX 306 ; N C39 ; B 0 0 306 694 ; L C39 C34
+C 40 ; WX 408 ; N C40 ; B 0 -250 408 750 ;
+C 41 ; WX 408 ; N C41 ; B 0 -250 408 750 ;
+C 42 ; WX 511 ; N C42 ; B 0 0 511 750 ;
+C 43 ; WX 766 ; N C43 ; B 0 -56 766 561 ;
+C 44 ; WX 306 ; N C44 ; B 0 -194 306 105 ;
+C 45 ; WX 357 ; N C45 ; B 0 0 357 430 ;
+C 46 ; WX 306 ; N C46 ; B 0 0 306 105 ;
+C 47 ; WX 511 ; N C47 ; B 0 -250 511 750 ;
+C 48 ; WX 511 ; N C48 ; B 0 0 511 644 ;
+C 49 ; WX 511 ; N C49 ; B 0 0 511 644 ;
+C 50 ; WX 511 ; N C50 ; B 0 0 511 644 ;
+C 51 ; WX 511 ; N C51 ; B 0 0 511 644 ;
+C 52 ; WX 511 ; N C52 ; B 0 -194 511 644 ;
+C 53 ; WX 511 ; N C53 ; B 0 0 511 644 ;
+C 54 ; WX 511 ; N C54 ; B 0 0 511 644 ;
+C 55 ; WX 511 ; N C55 ; B 0 -194 511 644 ;
+C 56 ; WX 511 ; N C56 ; B 0 0 511 644 ;
+C 57 ; WX 511 ; N C57 ; B 0 0 511 644 ;
+C 58 ; WX 306 ; N C58 ; B 0 0 306 430 ;
+C 59 ; WX 306 ; N C59 ; B 0 -194 306 430 ;
+C 60 ; WX 306 ; N C60 ; B 0 -194 306 500 ;
+C 61 ; WX 766 ; N C61 ; B 0 134 766 366 ;
+C 62 ; WX 511 ; N C62 ; B 0 -194 511 500 ;
+C 63 ; WX 511 ; N C63 ; B 0 0 511 694 ;
+C 64 ; WX 766 ; N C64 ; B 0 0 766 694 ;
+C 65 ; WX 743 ; N A ; B 0 0 743 683 ;
+C 66 ; WX 703 ; N B ; B 0 0 703 683 ;
+C 67 ; WX 715 ; N C ; B 0 0 715 683 ;
+C 68 ; WX 754 ; N D ; B 0 0 754 683 ;
+C 69 ; WX 678 ; N E ; B 0 0 678 683 ;
+C 70 ; WX 652 ; N F ; B 0 0 652 683 ;
+C 71 ; WX 773 ; N G ; B 0 0 773 683 ;
+C 72 ; WX 743 ; N H ; B 0 0 743 683 ;
+C 73 ; WX 385 ; N I ; B 0 0 385 683 ;
+C 74 ; WX 524 ; N J ; B 0 0 524 683 ;
+C 75 ; WX 768 ; N K ; B 0 0 768 683 ;
+C 76 ; WX 627 ; N L ; B 0 0 627 683 ;
+C 77 ; WX 896 ; N M ; B 0 0 896 683 ;
+C 78 ; WX 743 ; N N ; B 0 0 743 683 ;
+C 79 ; WX 766 ; N O ; B 0 0 766 683 ;
+C 80 ; WX 678 ; N P ; B 0 0 678 683 ;
+C 81 ; WX 766 ; N Q ; B 0 -194 766 683 ;
+C 82 ; WX 729 ; N R ; B 0 0 729 683 ;
+C 83 ; WX 562 ; N S ; B 0 0 562 683 ;
+C 84 ; WX 715 ; N T ; B 0 0 715 683 ;
+C 85 ; WX 743 ; N U ; B 0 0 743 683 ;
+C 86 ; WX 743 ; N V ; B 0 0 743 683 ;
+C 87 ; WX 998 ; N W ; B 0 0 998 683 ;
+C 88 ; WX 743 ; N X ; B 0 0 743 683 ;
+C 89 ; WX 743 ; N Y ; B 0 0 743 683 ;
+C 90 ; WX 613 ; N Z ; B 0 0 613 683 ;
+C 91 ; WX 306 ; N C91 ; B 0 -250 306 750 ;
+C 92 ; WX 514 ; N C92 ; B 0 0 514 694 ;
+C 93 ; WX 306 ; N C93 ; B 0 -250 306 750 ;
+C 94 ; WX 511 ; N C94 ; B 0 0 511 694 ;
+C 95 ; WX 306 ; N C95 ; B 0 0 306 667 ;
+C 96 ; WX 306 ; N C96 ; B 0 0 306 694 ;
+C 97 ; WX 511 ; N a ; B 0 0 511 430 ;
+C 98 ; WX 459 ; N b ; B 0 0 459 694 ;
+C 99 ; WX 459 ; N c ; B 0 0 459 430 ;
+C 100 ; WX 511 ; N d ; B 0 0 511 694 ;
+C 101 ; WX 459 ; N e ; B 0 0 459 430 ;
+C 102 ; WX 306 ; N f ; B 0 -194 306 694 ; L f C11 L i C12 L l C13
+C 103 ; WX 459 ; N g ; B 0 -194 459 430 ;
+C 104 ; WX 511 ; N h ; B 0 0 511 694 ;
+C 105 ; WX 306 ; N i ; B 0 0 306 655 ;
+C 106 ; WX 306 ; N j ; B 0 -194 306 655 ;
+C 107 ; WX 459 ; N k ; B 0 0 459 694 ;
+C 108 ; WX 255 ; N l ; B 0 0 255 694 ;
+C 109 ; WX 817 ; N m ; B 0 0 817 430 ;
+C 110 ; WX 562 ; N n ; B 0 0 562 430 ;
+C 111 ; WX 511 ; N o ; B 0 0 511 430 ;
+C 112 ; WX 511 ; N p ; B 0 -194 511 430 ;
+C 113 ; WX 459 ; N q ; B 0 -194 459 430 ;
+C 114 ; WX 421 ; N r ; B 0 0 421 430 ;
+C 115 ; WX 408 ; N s ; B 0 0 408 430 ;
+C 116 ; WX 332 ; N t ; B 0 0 332 615 ;
+C 117 ; WX 536 ; N u ; B 0 0 536 430 ;
+C 118 ; WX 459 ; N v ; B 0 0 459 430 ;
+C 119 ; WX 664 ; N w ; B 0 0 664 430 ;
+C 120 ; WX 463 ; N x ; B 0 0 463 430 ;
+C 121 ; WX 485 ; N y ; B 0 -194 485 430 ;
+C 122 ; WX 408 ; N z ; B 0 0 408 430 ;
+C 123 ; WX 511 ; N C123 ; B 0 0 511 430 ;
+C 124 ; WX 1022 ; N C124 ; B 0 0 1022 430 ;
+C 125 ; WX 511 ; N C125 ; B 0 0 511 694 ;
+C 126 ; WX 511 ; N C126 ; B 0 0 511 667 ;
+C 127 ; WX 511 ; N C127 ; B 0 0 511 667 ;
+EndCharMetrics
+
+StartKernData
+StartKernPairs 180
+KPX C11 C33 104
+KPX C11 C39 104
+KPX C11 C41 104
+KPX C11 C63 104
+KPX C11 C93 104
+KPX C32 L -321
+KPX C32 l -256
+KPX C39 C33 102
+KPX C39 C63 102
+KPX A C -26
+KPX A G -26
+KPX A O -26
+KPX A Q -26
+KPX A T -77
+KPX A U -26
+KPX A V -103
+KPX A W -103
+KPX A Y -77
+KPX A a -52
+KPX A b -26
+KPX A c -52
+KPX A d -52
+KPX A e -52
+KPX A g -52
+KPX A h -26
+KPX A i -26
+KPX A k -26
+KPX A l -26
+KPX A m -26
+KPX A n -26
+KPX A o -52
+KPX A q -52
+KPX A r -26
+KPX A t -26
+KPX A u -26
+KPX A v -26
+KPX A w -26
+KPX D A -26
+KPX D V -26
+KPX D W -26
+KPX D X -26
+KPX D Y -26
+KPX F A -103
+KPX F C -26
+KPX F G -26
+KPX F O -26
+KPX F Q -26
+KPX F a -77
+KPX F e -77
+KPX F o -77
+KPX F r -77
+KPX F u -77
+KPX K C -26
+KPX K G -26
+KPX K O -26
+KPX K Q -26
+KPX L T -77
+KPX L V -103
+KPX L W -103
+KPX L Y -77
+KPX L a -52
+KPX L c -52
+KPX L d -52
+KPX L e -52
+KPX L g -52
+KPX L o -52
+KPX L q -52
+KPX O A -26
+KPX O V -26
+KPX O W -26
+KPX O X -26
+KPX O Y -26
+KPX P A -77
+KPX R C -26
+KPX R G -26
+KPX R O -26
+KPX R Q -26
+KPX R T -77
+KPX R U -26
+KPX R V -103
+KPX R W -103
+KPX R Y -77
+KPX R a -52
+KPX R b -26
+KPX R c -52
+KPX R d -52
+KPX R e -52
+KPX R g -52
+KPX R h -26
+KPX R i -26
+KPX R k -26
+KPX R l -26
+KPX R m -26
+KPX R n -26
+KPX R o -52
+KPX R q -52
+KPX R r -26
+KPX R t -26
+KPX R u -26
+KPX R v -26
+KPX R w -26
+KPX T A -77
+KPX T a -77
+KPX T e -77
+KPX T o -77
+KPX T r -77
+KPX T u -77
+KPX T y -77
+KPX V A -103
+KPX V C -26
+KPX V G -26
+KPX V O -26
+KPX V Q -26
+KPX V a -77
+KPX V e -77
+KPX V o -77
+KPX V r -77
+KPX V u -77
+KPX W A -77
+KPX X C -26
+KPX X G -26
+KPX X O -26
+KPX X Q -26
+KPX Y A -77
+KPX Y a -77
+KPX Y e -77
+KPX Y o -77
+KPX Y r -77
+KPX Y u -77
+KPX b a -52
+KPX b c -52
+KPX b d -52
+KPX b e -52
+KPX b g -52
+KPX b o -52
+KPX b q -52
+KPX c a -52
+KPX c c -52
+KPX c d -52
+KPX c e -52
+KPX c g -52
+KPX c o -52
+KPX c q -52
+KPX d l 51
+KPX e a -52
+KPX e c -52
+KPX e d -52
+KPX e e -52
+KPX e g -52
+KPX e o -52
+KPX e q -52
+KPX f C33 104
+KPX f C39 104
+KPX f C41 104
+KPX f C63 104
+KPX f C93 104
+KPX l l 51
+KPX n C39 -103
+KPX o a -52
+KPX o c -52
+KPX o d -52
+KPX o e -52
+KPX o g -52
+KPX o o -52
+KPX o q -52
+KPX p a -52
+KPX p c -52
+KPX p d -52
+KPX p e -52
+KPX p g -52
+KPX p o -52
+KPX p q -52
+KPX r a -52
+KPX r c -52
+KPX r d -52
+KPX r e -52
+KPX r g -52
+KPX r o -52
+KPX r q -52
+KPX w l 51
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/src/fonts/texcmti.gle b/src/fonts/texcmti.gle
new file mode 100644
index 0000000..658767e
--- /dev/null
+++ b/src/fonts/texcmti.gle
@@ -0,0 +1,7243 @@
+dfont file_name="CMTI10"
+dfont font_name="CMTI10"
+dfont design= .35146
+dfont slant= .25
+dfont space= .125744
+dfont stretch= .538903E-01
+dfont shrink= .359267E-01
+dfont x_hei= .151323
+dfont quad= .359268
+dfont extra_space= .359267E-01
+dfont paint="FILL"
+!------------------ end of main parameters
+dfont char=0 !-------------- Beginning of new char.
+dfont wid=.627218 hei=.683332 dep=0 italic=.133055
+set path ! start of curve
+newpath
+! start of curve
+amove .24511 .23749
+aline .24638 .236855
+bezier .248147 .224371 .243319 .211186 .243205 .19812
+bezier .240784 .185879 .240096 .173388 .238125 .160655
+aline .23622 .15875
+aline .230505 .15875
+aline .229235 .159385
+aline .2286 .16002
+bezier .227492 .178775 .237915 .203893 .221615 .21971
+bezier .21358 .225213 .203714 .226133 .194945 .22733
+aline .14605 .22733
+aline .145415 .226695
+aline .14224 .22606
+aline .14097 .225425
+aline .1397 .224155
+aline .137795 .220345
+aline .13716 .21844
+aline .09652 .05588
+aline .088265 .02286
+aline .08763 .019685
+bezier .840536E-01 .103992E-01 .970086E-01 .976037E-02 .103505 .01016
+aline .10414 .009525
+aline .12319 .009525
+aline .125095 .00762
+aline .125095 .004445
+aline .12446 .001905
+aline .123825 .000635
+aline .12319 0
+aline .12192 -.000635
+aline .111125 -.000635
+aline .11049 0
+aline .076835 0
+aline .0762 .000635
+aline .061595 .000635
+aline .06096 0
+aline .032385 0
+aline .03175 -.000635
+aline .02413 -.000635
+aline .02286 0
+aline .022225 .000635
+aline .02159 .001905
+aline .02159 .00381
+aline .022225 .00635
+aline .023495 .00889
+bezier .357018E-01 .115426E-01 .545197E-01 .516735E-02 .059055 .020955
+aline .099695 .183515
+aline .10795 .216535
+aline .108585 .21717
+aline .108585 .224155
+aline .106045 .225425
+aline .10287 .22606
+aline .102235 .226695
+aline .09652 .226695
+aline .095885 .22733
+aline .080645 .22733
+aline .07874 .229235
+aline .07874 .23241
+aline .079375 .23495
+aline .08001 .23622
+aline .080645 .236855
+aline .081915 .23749
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=1 !-------------- Beginning of new char.
+dfont wid=.817774 hei=.683332 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .210185 .25019
+aline .211455 .249555
+bezier .224199 .203052 .231707 .154097 .24257 .10668
+bezier .24905 .713318E-01 .258718 .357872E-01 .263525 .000635
+aline .26289 0
+aline .26162 -.000635
+aline .026035 -.000635
+bezier .255204E-01 .744158E-02 .351979E-01 .140401E-01 .038735 .02159
+bezier .093648 .971485E-01 .145515 .175374 .20193 .249555
+aline .2032 .25019
+closepath
+! end of curve
+
+! start of curve
+amove .187325 .215265
+bezier .142726 .151084 .951152E-01 .866357E-01 .05207 .02286
+aline .227965 .02286
+bezier .215844 .870755E-01 .201996 .152055 .18796 .2159
+aline .187325 .215265
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=2 !-------------- Beginning of new char.
+dfont wid=.766663 hei=.683332 dep=0 italic=.0940275
+set path ! start of curve
+newpath
+! start of curve
+amove .203835 .24638
+bezier .243354 .244348 .274785 .206443 .27559 .16764
+bezier .282515 .909813E-01 .226756 .997126E-02 .14986 -.006985
+bezier .11321 -.151039E-01 .708165E-01 .581916E-02 .059055 .04318
+bezier .345039E-01 .119858 .851823E-01 .207814 .15748 .23876
+aline .16891 .24257
+aline .17653 .244475
+aline .179705 .24511
+aline .18288 .24511
+aline .183515 .245745
+aline .188595 .245745
+aline .18923 .24638
+aline .203835 .24638
+closepath
+! end of curve
+
+! start of curve
+amove .188595 .23876
+bezier .137253 .230282 .106069 .180063 .092075 .13335
+bezier .806223E-01 .945249E-01 .713796E-01 .505399E-01 .09779 .015875
+bezier .121744 -.011524 .163086 -.540553E-03 .18669 .02159
+bezier .226625 .551205E-01 .242838 .110822 .248285 .159385
+bezier .249645 .187713 .242567 .222796 .21336 .235585
+aline .207645 .23749
+aline .205105 .238125
+aline .20447 .23876
+aline .20066 .23876
+aline .200025 .239395
+aline .18923 .239395
+aline .188595 .23876
+closepath
+! end of curve
+
+! start of curve
+amove .118745 .14351
+aline .12065 .142875
+aline .12192 .141605
+aline .12192 .13716
+aline .120888 .133033
+aline .121285 .131445
+aline .21463 .131445
+aline .215265 .132715
+aline .21717 .140335
+aline .217805 .141605
+aline .219075 .142875
+aline .220345 .14351
+aline .224155 .14351
+aline .22606 .142875
+aline .22733 .141605
+aline .22733 .13716
+aline .217805 .09906
+aline .21717 .097155
+aline .2159 .095885
+aline .213995 .09525
+aline .210185 .09525
+aline .208915 .095885
+aline .207645 .097155
+aline .20701 .098425
+aline .20701 .099695
+aline .20828 .104775
+aline .208703 .106045
+aline .20828 .107315
+aline .114935 .107315
+aline .1143 .10668
+aline .112395 .09906
+aline .11176 .097155
+aline .11049 .095885
+aline .108585 .09525
+aline .104775 .09525
+aline .103505 .095885
+aline .102235 .097155
+aline .1016 .098425
+aline .1016 .099695
+aline .11176 .140335
+aline .112395 .141605
+aline .113665 .142875
+aline .114935 .14351
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=3 !-------------- Beginning of new char.
+dfont wid=.692218 hei=.683332 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .187325 .25019
+aline .188595 .249555
+aline .189865 .248285
+bezier .193883 .17069 .196347 .924502E-01 .201295 .01524
+aline .20193 .013335
+aline .2032 .012065
+aline .20447 .01143
+aline .206375 .010795
+aline .20701 .01016
+aline .21082 .01016
+aline .211455 .009525
+aline .222885 .009525
+aline .224155 .00889
+aline .225425 .00635
+aline .225425 .005715
+aline .22479 .003175
+aline .224155 .00127
+aline .22225 -.000635
+bezier .195022 .118086E-02 .167447 -.471418E-03 .140335 0
+aline .1397 .000635
+aline .139065 .001905
+aline .139065 .004445
+aline .1397 .006985
+aline .140335 .008255
+bezier .149899 .113818E-01 .163446 .762134E-02 .17018 .01778
+aline .170815 .019685
+bezier .169001 .079347 .165876 .140743 .16256 .20066
+bezier .131644 .14242 .983601E-01 .854603E-01 .06858 .02667
+bezier .640806E-01 .155215E-01 .076873 .833172E-02 .08636 .009525
+aline .088265 .00762
+aline .088265 .004445
+aline .08763 .001905
+aline .086995 .000635
+aline .08636 0
+bezier .653408E-01 -.766923E-03 .438794E-01 .143133E-02 .02286 -.000635
+aline .020955 .00127
+aline .020955 .00508
+aline .02159 .00762
+aline .023495 .009525
+bezier .048609 .813397E-02 .614623E-01 .033864 .07112 .05334
+bezier .107793 .118401 .141764 .185409 .179705 .249555
+aline .180975 .25019
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=4 !-------------- Beginning of new char.
+dfont wid=.664441 hei=.683332 dep=0 italic=.152944
+set path ! start of curve
+newpath
+! start of curve
+amove .26289 .236855
+aline .264795 .23495
+aline .264795 .230505
+aline .262255 .217805
+aline .26162 .21717
+aline .26162 .213995
+aline .25781 .194945
+aline .257175 .19431
+aline .257175 .191135
+aline .25654 .18796
+aline .255905 .186055
+aline .254 .18415
+aline .248285 .18415
+bezier .242746 .187737 .248256 .195278 .248285 .200025
+aline .248285 .2032
+aline .24892 .203835
+aline .24892 .212725
+aline .247015 .21336
+aline .24638 .213995
+aline .238125 .213995
+aline .23749 .21463
+aline .106045 .21463
+aline .10541 .213995
+aline .09652 .213995
+aline .095885 .21336
+aline .09271 .21336
+aline .092075 .212725
+aline .088265 .205105
+aline .086995 .201295
+aline .08636 .200025
+aline .08509 .196215
+aline .084455 .193675
+aline .081915 .186055
+aline .08001 .18415
+aline .074295 .18415
+aline .073025 .184785
+aline .07239 .18542
+bezier .737455E-01 .201689 .818283E-01 .218005 .085725 .234315
+aline .08636 .235585
+aline .086995 .23622
+aline .088265 .236855
+aline .26289 .236855
+closepath
+! end of curve
+
+! start of curve
+amove .099695 .150495
+aline .1016 .14859
+aline .1016 .14478
+aline .992981E-01 .135573
+aline .099695 .133985
+aline .20193 .133985
+aline .202565 .135255
+aline .20574 .147955
+aline .206375 .149225
+aline .20701 .14986
+aline .20828 .150495
+aline .213995 .150495
+aline .2159 .14859
+aline .2159 .14478
+aline .20447 .09906
+aline .203835 .097155
+aline .20193 .09525
+aline .196215 .09525
+aline .194945 .095885
+aline .19431 .09652
+aline .193675 .09779
+aline .193675 .099695
+aline .196215 .109855
+aline .196691 .110808
+aline .196215 .11176
+aline .093345 .11176
+aline .09017 .09906
+aline .089535 .097155
+aline .08763 .09525
+aline .081915 .09525
+aline .080645 .095885
+aline .08001 .09652
+aline .079375 .09779
+aline .079375 .099695
+aline .09144 .147955
+aline .092075 .149225
+aline .09271 .14986
+aline .09398 .150495
+aline .099695 .150495
+closepath
+! end of curve
+
+! start of curve
+amove .04445 .05588
+aline .046355 .053975
+aline .046355 .050165
+aline .04445 .04064
+aline .043815 .040005
+aline .043815 .03683
+aline .04318 .036195
+aline .04318 .032385
+aline .042545 .03175
+aline .042545 .023495
+aline .04572 .02286
+aline .046355 .022225
+aline .05461 .022225
+aline .055245 .02159
+aline .18796 .02159
+aline .188595 .022225
+aline .197485 .022225
+bezier .207476 .235438E-01 .20799 .376433E-01 .211455 .04572
+aline .21336 .051435
+aline .213995 .053975
+aline .2159 .05588
+aline .22225 .05588
+aline .224155 .053975
+bezier .220446 .357899E-01 .214147 .176953E-01 .20828 0
+aline .20701 -.000635
+aline .028575 -.000635
+aline .02667 .00127
+aline .02667 .00635
+aline .036195 .053975
+aline .0381 .05588
+aline .04445 .05588
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=5 !-------------- Beginning of new char.
+dfont wid=.743329 hei=.683332 dep=0 italic=.16389
+set path ! start of curve
+newpath
+! start of curve
+amove .296545 .23749
+aline .297815 .236855
+aline .29845 .23622
+aline .299085 .23495
+aline .299085 .233045
+aline .29845 .230505
+aline .29718 .227965
+bezier .284973 .225312 .266155 .231688 .26162 .2159
+aline .22098 .05334
+aline .212725 .02032
+aline .21209 .019685
+aline .21209 .0127
+aline .21463 .01143
+aline .217805 .010795
+aline .21844 .01016
+aline .224155 .01016
+aline .22479 .009525
+aline .24003 .009525
+aline .241935 .00762
+aline .241935 .004445
+aline .2413 .001905
+aline .240665 .000635
+aline .24003 0
+bezier .209986 -.462549E-03 .179459 .120853E-02 .149225 -.000635
+aline .147955 0
+aline .14732 .000635
+aline .146685 .001905
+aline .146685 .00381
+aline .14732 .00635
+aline .14859 .00889
+bezier .160797 .115426E-01 .179615 .516739E-02 .18415 .020955
+aline .22479 .183515
+aline .235347 .225743
+aline .23495 .22733
+aline .1397 .22733
+aline .139065 .22606
+aline .098425 .0635
+aline .08763 .02032
+aline .086995 .019685
+aline .086995 .0127
+aline .089535 .01143
+aline .09271 .010795
+aline .093345 .01016
+aline .09906 .01016
+aline .099695 .009525
+aline .114935 .009525
+aline .11684 .00762
+aline .11684 .004445
+aline .116205 .001905
+aline .11557 .000635
+aline .114935 0
+bezier .848913E-01 -.462542E-03 .054364 .120853E-02 .02413 -.000635
+aline .02286 0
+aline .022225 .000635
+aline .02159 .001905
+aline .02159 .00381
+aline .022225 .00635
+aline .023495 .00889
+bezier .357018E-01 .115426E-01 .545197E-01 .516735E-02 .059055 .020955
+aline .099695 .183515
+aline .10795 .216535
+aline .108585 .21717
+aline .108585 .224155
+aline .106045 .225425
+aline .10287 .22606
+aline .102235 .226695
+aline .09652 .226695
+aline .095885 .22733
+aline .080645 .22733
+aline .07874 .229235
+aline .07874 .23241
+aline .079375 .23495
+aline .08001 .23622
+aline .080645 .236855
+aline .081915 .23749
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=6 !-------------- Beginning of new char.
+dfont wid=.715551 hei=.683332 dep=0 italic=.120277
+set path ! start of curve
+newpath
+! start of curve
+amove .272415 .23876
+aline .27432 .236855
+bezier .271298 .211267 .26899 .185682 .26416 .160655
+aline .26289 .16002
+aline .257175 .16002
+aline .25527 .161925
+bezier .256591 .181237 .261916 .206143 .24384 .220345
+bezier .23172 .226869 .218427 .227233 .20574 .2286
+aline .120015 .2286
+bezier .131537 .19159 .149643 .154932 .160655 .117475
+bezier .124632 .825227E-01 .881514E-01 .048206 .05207 .013335
+aline .052705 .0127
+aline .147955 .0127
+bezier .172568 .013582 .202616 .187335E-01 .216535 .04318
+bezier .225095 .545367E-01 .228684 .692527E-01 .235585 .08128
+aline .241935 .08128
+aline .24384 .079375
+bezier .236127 .525684E-01 .225106 .262617E-01 .215265 0
+aline .213995 -.000635
+aline .03048 -.000635
+aline .028575 .00127
+aline .028575 .004445
+bezier .633044E-01 .038636 .991692E-01 .717443E-01 .133826 .105728
+bezier .117435 .147172 .101779 .188921 .085725 .230505
+aline .085725 .234315
+aline .08636 .23622
+aline .086995 .23749
+aline .08763 .238125
+aline .0889 .23876
+aline .272415 .23876
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=7 !-------------- Beginning of new char.
+dfont wid=.766663 hei=.683332 dep=0 italic=.111112
+set path ! start of curve
+newpath
+! start of curve
+amove .13716 .24638
+bezier .163083 .245062 .177055 .216745 .175895 .193675
+aline .17653 .19304
+aline .17653 .174625
+aline .175895 .17399
+aline .175895 .16637
+aline .175498 .164782
+aline .175895 .163195
+bezier .18998 .198165 .211378 .237402 .25146 .245745
+bezier .26582 .24892 .283359 .244011 .288925 .2286
+bezier .293479 .216157 .293118 .20244 .28956 .189865
+aline .287655 .18796
+aline .28575 .187325
+aline .28194 .187325
+aline .28067 .18796
+aline .280035 .188595
+aline .2794 .189865
+bezier .284771 .20376 .274658 .220408 .259715 .22225
+bezier .223056 .224234 .201234 .187457 .1905 .156845
+bezier .18547 .143876 .181495 .130436 .178435 .11684
+aline .15494 .02286
+aline .154305 .019685
+bezier .150729 .103992E-01 .163684 .976037E-02 .17018 .01016
+aline .170815 .009525
+aline .189865 .009525
+aline .19177 .00762
+aline .19177 .004445
+aline .191135 .001905
+aline .1905 .000635
+aline .189865 0
+aline .188595 -.000635
+aline .1778 -.000635
+aline .177165 0
+aline .14351 0
+aline .142875 .000635
+aline .127 .000635
+aline .126365 0
+aline .092075 0
+aline .09144 -.000635
+aline .08255 -.000635
+aline .08128 0
+aline .080645 .000635
+aline .08001 .001905
+aline .08001 .00381
+aline .080645 .00635
+aline .081915 .00889
+bezier .957434E-01 .114341E-01 .11185 .617131E-02 .12319 .015875
+aline .12573 .020955
+aline .150495 .120015
+bezier .15716 .150156 .16684 .182201 .150495 .21082
+bezier .131267 .234613 .908581E-01 .217783 .08509 .189865
+aline .083185 .18796
+aline .08128 .187325
+aline .07747 .187325
+aline .0762 .18796
+aline .075565 .188595
+bezier .796949E-01 .217392 .104835 .249363 .13716 .24638
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=8 !-------------- Beginning of new char.
+dfont wid=.715551 hei=.683332 dep=0 italic=.0598621
+set path ! start of curve
+newpath
+! start of curve
+amove .14224 .23876
+aline .142875 .238125
+aline .17653 .238125
+aline .177165 .23749
+aline .192405 .23749
+aline .19304 .238125
+aline .22606 .238125
+aline .226695 .23876
+aline .23622 .23876
+aline .238125 .236855
+aline .238125 .233045
+aline .23749 .230505
+aline .235585 .2286
+bezier .221845 .22773 .207054 .23088 .19558 .222885
+aline .19304 .217805
+aline .192405 .2159
+aline .18669 .19304
+aline .186214 .192088
+bezier .215328 .1889 .25321 .1716 .25527 .13716
+bezier .25891 .100291 .225278 .709891E-01 .193675 .057785
+bezier .180103 .505721E-01 .162875 .492941E-01 .14986 .04572
+aline .144145 .02286
+aline .14351 .019685
+bezier .139934 .103992E-01 .152889 .976037E-02 .159385 .01016
+aline .16002 .009525
+aline .17907 .009525
+aline .180975 .00762
+aline .180975 .004445
+aline .18034 .001905
+aline .179705 .000635
+aline .17907 0
+aline .1778 -.000635
+aline .167005 -.000635
+aline .16637 0
+aline .13335 0
+aline .132715 .000635
+aline .117475 .000635
+aline .11684 0
+aline .083185 0
+aline .08255 -.000635
+aline .07366 -.000635
+aline .07239 0
+aline .071755 .000635
+aline .07112 .001905
+aline .07112 .00381
+aline .071755 .00635
+aline .073025 .00889
+bezier .868534E-01 .114341E-01 .10296 .617131E-02 .1143 .015875
+aline .11684 .020955
+aline .122952 .454025E-01
+aline .122646 .466271E-01
+bezier .939583E-01 .498049E-01 .601829E-01 .673862E-01 .05588 .09906
+bezier .523562E-01 .142456 .093388 .17332 .13081 .18542
+aline .13335 .186055
+aline .135255 .18669
+aline .142875 .188595
+aline .149225 .189865
+aline .1524 .189865
+aline .153035 .1905
+aline .15748 .1905
+aline .158115 .191135
+aline .1595 .191597
+aline .165735 .216535
+aline .16637 .21717
+aline .16637 .224155
+aline .164465 .22606
+aline .161925 .226695
+aline .16129 .22733
+aline .158115 .22733
+aline .15748 .227965
+aline .150495 .227965
+aline .14986 .2286
+aline .13081 .2286
+aline .12954 .229235
+aline .12827 .231775
+aline .12827 .23241
+aline .128905 .23495
+aline .12954 .236855
+aline .131445 .23876
+aline .14224 .23876
+closepath
+! end of curve
+
+! start of curve
+amove .18415 .18288
+aline .183515 .18034
+aline .1524 .05588
+aline .151924 .549275E-01
+bezier .183886 .056186 .214503 .817648E-01 .221615 .1143
+bezier .228403 .135054 .230048 .162852 .20828 .175895
+aline .20066 .179705
+aline .194945 .18161
+aline .192405 .182245
+aline .186055 .183515
+aline .185103 .183991
+aline .184573 .183727
+closepath
+! end of curve
+
+! start of curve
+amove .15367 .18288
+bezier .120045 .177859 .940177E-01 .15065 .088265 .117475
+bezier .810063E-01 .965771E-01 .856253E-01 .672869E-01 .109855 .059055
+aline .111125 .05842
+aline .11684 .056515
+aline .12192 .055245
+aline .123825 .054864
+aline .125276 .551543E-01
+aline .12573 .056515
+aline .156845 .180975
+aline .157268 .182245
+aline .157026 .182971
+aline .155575 .183261
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=9 !-------------- Beginning of new char.
+dfont wid=.766663 hei=.683332 dep=0 italic=.111112
+set path ! start of curve
+newpath
+! start of curve
+amove .15113 .23876
+aline .151765 .238125
+aline .18542 .238125
+aline .186055 .23749
+aline .201295 .23749
+aline .20193 .238125
+aline .23495 .238125
+aline .235585 .23876
+aline .24511 .23876
+aline .247015 .236855
+aline .247015 .233045
+aline .24638 .230505
+aline .244475 .2286
+bezier .230735 .22773 .215944 .23088 .20447 .222885
+aline .20193 .217805
+aline .201295 .2159
+aline .161528 .568325E-01
+aline .161925 .055245
+bezier .203974 .681373E-01 .222365 .112651 .23114 .1524
+bezier .236462 .16906 .244089 .1891 .26289 .193675
+aline .287655 .193675
+aline .28956 .19177
+aline .28956 .188595
+aline .287655 .18669
+bezier .267983 .186113 .261431 .163166 .25654 .14732
+bezier .247462 .988179E-01 .211852 .523559E-01 .160655 .04699
+aline .159131 .046482
+aline .15875 .04572
+aline .153035 .02286
+aline .1524 .019685
+bezier .148824 .103992E-01 .161779 .976037E-02 .168275 .01016
+aline .16891 .009525
+aline .18796 .009525
+aline .189865 .00762
+aline .189865 .004445
+aline .18923 .001905
+aline .188595 .000635
+aline .18796 0
+aline .18669 -.000635
+aline .175895 -.000635
+aline .17526 0
+aline .14224 0
+aline .141605 .000635
+aline .126365 .000635
+aline .12573 0
+aline .092075 0
+aline .09144 -.000635
+aline .08255 -.000635
+aline .08128 0
+aline .080645 .000635
+aline .08001 .001905
+aline .08001 .00381
+aline .080645 .00635
+aline .081915 .00889
+bezier .957434E-01 .114341E-01 .11185 .617131E-02 .12319 .015875
+aline .12573 .020955
+aline .13208 .046355
+aline .132715 .04699
+bezier .105027 .492664E-01 .806794E-01 .739088E-01 .081915 .102235
+bezier .774464E-01 .128004 .938282E-01 .15334 .0889 .17907
+aline .088265 .18034
+bezier .875395E-01 .188854 .723902E-01 .183438 .075565 .192405
+aline .0762 .19304
+aline .07747 .193675
+aline .1016 .193675
+bezier .119737 .189424 .116885 .167068 .114935 .15367
+bezier .108415 .123712 .974146E-01 .906303E-01 .11811 .064135
+aline .11938 .0635
+aline .12192 .06096
+aline .12319 .060325
+aline .123825 .05969
+aline .130175 .056515
+aline .13335 .554567E-01
+aline .134239 .055753
+aline .13462 .056515
+aline .174625 .216535
+aline .17526 .21717
+aline .17526 .224155
+aline .173355 .22606
+aline .170815 .226695
+aline .17018 .22733
+aline .167005 .22733
+aline .16637 .227965
+aline .159385 .227965
+aline .15875 .2286
+aline .1397 .2286
+aline .13843 .229235
+aline .13716 .231775
+aline .13716 .23241
+aline .137795 .23495
+aline .13843 .236855
+aline .140335 .23876
+aline .15113 .23876
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=10 !-------------- Beginning of new char.
+dfont wid=.715551 hei=.683332 dep=0 italic=.10257
+set path ! start of curve
+newpath
+! start of curve
+amove .19558 .24638
+bezier .229994 .245034 .266884 .217492 .266065 .18034
+bezier .268732 .142028 .239826 .109683 .216535 .081915
+bezier .199888 .625642E-01 .180699 .432252E-01 .17145 .019685
+aline .2032 .019685
+aline .203835 .02032
+bezier .218008 .184963E-01 .221229 .353167E-01 .226695 .045085
+aline .230505 .052705
+aline .23114 .05334
+aline .23241 .053975
+aline .238125 .053975
+aline .24003 .05207
+aline .24003 .048895
+aline .23749 .043815
+aline .236855 .04191
+aline .230505 .02921
+aline .22987 .027305
+aline .224155 .015875
+aline .22352 .01397
+aline .216535 0
+aline .215265 -.000635
+aline .159385 -.000635
+aline .15748 .00127
+bezier .169843 .629716E-01 .223217 .107745 .23368 .17018
+bezier .241015 .196441 .228525 .233797 .19685 .238125
+bezier .155232 .244888 .115482 .20921 .103505 .17018
+bezier .894788E-01 .13353 .09714 .941653E-01 .10033 .05715
+aline .10033 .026035
+bezier .981273E-01 .176857E-01 .100061 .656751E-02 .09398 -.000635
+aline .0381 -.000635
+aline .036195 .00127
+aline .036195 .03048
+aline .03683 .031115
+aline .03683 .051435
+aline .037465 .052705
+aline .0381 .05334
+aline .03937 .053975
+aline .045085 .053975
+aline .04699 .05207
+aline .04699 .02667
+aline .047625 .026035
+aline .047625 .022225
+aline .048895 .02159
+aline .051435 .020955
+aline .05207 .02032
+aline .056515 .02032
+aline .05715 .019685
+aline .090805 .019685
+bezier .951825E-01 .562349E-01 .067201 .912599E-01 .065405 .12827
+bezier .575942E-01 .190844 .119903 .242334 .1778 .24638
+aline .19558 .24638
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=11 !-------------- Beginning of new char.
+dfont wid=.61333 hei=.694445 dep=.194445 italic=.211945
+dfont fby=33 kadd=.104306
+dfont fby=39 kadd=.104306
+dfont fby=")" kadd=.104306
+dfont fby="?" kadd=.104306
+dfont fby="]" kadd=.104306
+dfont fby="i" ligrep=14
+dfont fby="l" ligrep=15
+set path ! start of curve
+newpath
+! start of curve
+amove .154305 .24638
+bezier .169041 .245917 .188933 .236595 .184785 .21844
+bezier .18335 .205172 .161374 .197993 .15621 .21209
+bezier .154303 .221532 .160854 .2307 .17018 .23241
+bezier .149512 .248728 .113561 .235602 .111125 .207645
+bezier .106443 .188433 .101779 .168907 .099695 .14986
+aline .18034 .14986
+bezier .188691 .177926 .186945 .212308 .20828 .23495
+bezier .223331 .251271 .257844 .251344 .26543 .227965
+aline .26543 .21844
+bezier .263995 .205172 .242019 .197993 .236855 .21209
+bezier .234713 .222174 .242311 .230641 .25146 .233045
+bezier .242416 .242241 .226234 .241241 .22098 .2286
+bezier .216304 .220835 .215792 .211225 .21336 .202565
+aline .20701 .170815
+aline .206375 .17018
+aline .206375 .167005
+aline .203835 .154305
+aline .2032 .15367
+aline .2032 .150495
+aline .203835 .14986
+aline .236855 .14986
+aline .23876 .147955
+aline .23876 .144145
+aline .238125 .14224
+aline .23749 .14097
+aline .236855 .140335
+aline .235585 .1397
+aline .201295 .1397
+bezier .187722 .822736E-01 .183313 .021479 .16129 -.034925
+bezier .148124 -.634122E-01 .11007 -.855579E-01 .08128 -.065405
+bezier .668011E-01 -.553371E-01 .752972E-01 -.278415E-01 .09398 -.031115
+bezier .109664 -.342221E-01 .102929 -.057843 .892629E-01 -.589643E-01
+bezier .976055E-01 -.685493E-01 .114426 -.679391E-01 .12446 -.05969
+bezier .146193 -.420003E-01 .14763 -.120135E-01 .154305 .013335
+aline .160655 .045085
+bezier .166357 .076401 .173535 .108559 .178435 .1397
+aline .097155 .1397
+bezier .911679E-01 .109858 .854851E-01 .803812E-01 .08001 .0508
+aline .07366 .01905
+bezier .651193E-01 -.133634E-01 .060647 -.549955E-01 .02794 -.071755
+bezier .010816 -.779286E-01 -.129561E-01 -.653173E-01 -.008255 -.045085
+bezier -.681984E-02 -.318172E-01 .151563E-01 -.246385E-01 .02032 -.038735
+bezier .224424E-01 -.489461E-01 .147011E-01 -.057709 .00508 -.05969
+bezier .126131E-01 -.069277 .280341E-01 -.674493E-01 .032385 -.05588
+bezier .503452E-01 -.60046E-02 .551836E-01 .473492E-01 .06731 .09779
+aline .06731 .100965
+aline .06985 .113665
+aline .070485 .1143
+aline .070485 .117475
+aline .07366 .13335
+aline .074295 .133985
+aline .074295 .13716
+aline .747183E-01 .13843
+aline .074295 .1397
+aline .04699 .1397
+aline .04572 .140335
+aline .04445 .142875
+aline .04445 .14351
+aline .045085 .14605
+aline .04572 .147955
+aline .047625 .14986
+aline .076835 .14986
+bezier .843291E-01 .181195 .838816E-01 .224769 .11811 .240665
+aline .120015 .2413
+aline .121285 .241935
+aline .127 .24384
+aline .13208 .24511
+aline .135255 .245745
+aline .1397 .245745
+aline .140335 .24638
+aline .154305 .24638
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=12 !-------------- Beginning of new char.
+dfont wid=.56222 hei=.694445 dep=.194445 italic=.103334
+set path ! start of curve
+newpath
+! start of curve
+amove .169545 .24638
+bezier .185849 .245635 .212391 .238557 .208915 .216535
+bezier .209314 .201672 .183988 .193162 .179705 .20955
+bezier .17828 .219226 .186277 .227182 .194945 .229235
+bezier .176117 .243377 .14956 .241969 .128905 .23241
+bezier .107889 .219238 .109083 .190148 .102235 .16891
+aline .102235 .165735
+aline .099695 .153035
+aline .992981E-01 .151448
+aline .099695 .14986
+aline .18923 .14986
+aline .189865 .149225
+aline .191135 .14859
+aline .191135 .14478
+aline .163195 .03302
+bezier .161022 .231564E-01 .15694 .85486E-02 .168275 .00254
+bezier .183644 .295029E-02 .186797 .022468 .191135 .03429
+aline .19177 .03683
+aline .192405 .038735
+aline .194945 .048895
+aline .19558 .0508
+aline .197485 .052705
+aline .2032 .052705
+aline .20447 .05207
+aline .20574 .0508
+bezier .201353 .03046 .197259 .213025E-02 .17399 -.004445
+bezier .153172 -.812466E-02 .135874 .136921E-01 .141605 .03302
+aline .141605 .036195
+aline .167005 .137795
+aline .167481 .138747
+aline .167005 .1397
+aline .097155 .1397
+bezier .841647E-01 .811573E-01 .783112E-01 .203252E-01 .057785 -.037465
+bezier .499078E-01 -.573232E-01 .309803E-01 -.805274E-01 .006985 -.07112
+bezier -.012039 -.669582E-01 -.014586 -.353643E-01 .005715 -.031115
+aline .01143 -.031115
+bezier .272912E-01 -.343202E-01 .201979E-01 -.581669E-01 .00635 -.059055
+aline .00508 -.05969
+bezier .122653E-01 -.685202E-01 .268351E-01 -.679683E-01 .03175 -.05715
+bezier .408424E-01 -.384887E-01 .432362E-01 -.174384E-01 .04826 .00254
+aline .056515 .043815
+bezier .621581E-01 .756192E-01 .697771E-01 .107688 .074295 .1397
+aline .04699 .1397
+aline .045085 .141605
+aline .045085 .14605
+aline .04572 .147955
+aline .047625 .14986
+aline .076835 .14986
+bezier .837171E-01 .182587 .857903E-01 .226064 .12192 .240665
+aline .123825 .2413
+aline .125095 .241935
+aline .127 .24257
+aline .13462 .244475
+aline .137795 .24511
+aline .141605 .24511
+aline .14224 .245745
+aline .147955 .245745
+aline .14859 .24638
+aline .169545 .24638
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=13 !-------------- Beginning of new char.
+dfont wid=.587774 hei=.694445 dep=.194445 italic=.103334
+set path ! start of curve
+newpath
+! start of curve
+amove .161925 .24638
+bezier .175275 .245358 .198027 .240586 .196215 .22225
+aline .19685 .221615
+aline .201295 .239395
+aline .20193 .2413
+aline .202565 .241935
+aline .203835 .24257
+aline .221615 .24257
+aline .222885 .2413
+aline .22352 .24003
+aline .22352 .23876
+aline .18288 .0762
+aline .172085 .03302
+bezier .169912 .231564E-01 .16583 .85486E-02 .177165 .00254
+bezier .192534 .295029E-02 .195687 .022468 .200025 .03429
+aline .20066 .03683
+aline .201295 .038735
+aline .203835 .048895
+aline .20447 .0508
+aline .206375 .052705
+aline .21209 .052705
+aline .21336 .05207
+aline .21463 .0508
+bezier .210243 .03046 .206149 .213025E-02 .18288 -.004445
+bezier .162062 -.812466E-02 .144764 .136921E-01 .150495 .03302
+aline .150495 .036195
+aline .175895 .137795
+aline .176371 .138747
+aline .175895 .1397
+aline .097155 .1397
+bezier .838224E-01 .080521 .078342 .193827E-01 .05715 -.038735
+bezier .049252 -.574423E-01 .318596E-01 -.079209 .00889 -.071755
+bezier -.947649E-02 -.689082E-01 -.156577E-01 -.406561E-01 .001905 -.032385
+bezier .110927E-01 -.275122E-01 .235953E-01 -.347256E-01 .02032 -.04572
+bezier .189809E-01 -.532615E-01 .119945E-01 -.578003E-01 .00508 -.05969
+bezier .122274E-01 -.686118E-01 .268567E-01 -.067916 .03175 -.05715
+bezier .479198E-01 -.150301E-01 .529789E-01 .031113 .06223 .074295
+bezier .662547E-01 .962337E-01 .714793E-01 .117686 .074295 .1397
+aline .04699 .1397
+aline .04572 .140335
+aline .04445 .142875
+aline .04445 .14351
+aline .045085 .14605
+aline .04572 .147955
+aline .047625 .14986
+aline .076835 .14986
+bezier .840967E-01 .181775 .847013E-01 .225432 .120015 .240665
+aline .12192 .2413
+aline .12319 .241935
+aline .127 .243205
+aline .13208 .244475
+aline .135255 .24511
+aline .13843 .24511
+aline .139065 .245745
+aline .144145 .245745
+aline .14478 .24638
+aline .161925 .24638
+closepath
+! end of curve
+
+! start of curve
+amove .14732 .23876
+bezier .133856 .237846 .118585 .230489 .1143 .216535
+bezier .107033 .194688 .102624 .172105 .099695 .14986
+aline .178435 .14986
+aline .17907 .150495
+aline .194072 .210503
+aline .193675 .21209
+bezier .188173 .203084 .171425 .200648 .16764 .21209
+bezier .165733 .221532 .172284 .2307 .18161 .23241
+bezier .171313 .238747 .158749 .240465 .14732 .23876
+closepath
+! end of curve
+
+! start of curve
+amove .193834 .212407
+aline .19431 .211455
+aline .194786 .212407
+aline .19431 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=14 !-------------- Beginning of new char.
+dfont wid=.881662 hei=.694445 dep=.194445 italic=.103334
+set path ! start of curve
+newpath
+! start of curve
+amove .160655 .24638
+bezier .172706 .244957 .19016 .242247 .19431 .227965
+aline .19431 .21844
+bezier .192875 .205172 .170899 .197993 .165735 .21209
+bezier .163828 .221532 .170379 .2307 .179705 .23241
+bezier .15766 .246459 .118897 .24023 .112395 .21082
+bezier .106893 .190712 .102481 .169618 .099695 .14986
+aline .18415 .14986
+bezier .191827 .18026 .192425 .221377 .22479 .238125
+bezier .250215 .249318 .27923 .248805 .305435 .2413
+bezier .321856 .237159 .327938 .212634 .313055 .2032
+bezier .303939 .195701 .287455 .204182 .292735 .216535
+aline .29337 .21844
+aline .29464 .22098
+aline .299085 .225425
+aline .300355 .22606
+aline .30099 .226695
+aline .30226 .22733
+aline .304165 .227965
+aline .306705 .2286
+aline .30734 .229235
+bezier .289394 .242599 .26474 .241203 .244475 .235585
+bezier .21834 .227571 .216579 .195652 .211455 .173355
+aline .20828 .15748
+aline .207645 .156845
+aline .207645 .15367
+aline .207264 .151765
+aline .207645 .14986
+aline .301625 .14986
+aline .30226 .149225
+aline .30353 .14859
+aline .30353 .14478
+aline .27559 .03302
+bezier .273417 .231564E-01 .269335 .854861E-02 .28067 .00254
+bezier .296039 .295029E-02 .299192 .022468 .30353 .03429
+aline .304165 .03683
+aline .3048 .038735
+aline .30734 .048895
+aline .307975 .0508
+aline .30988 .052705
+aline .315595 .052705
+aline .316865 .05207
+aline .318135 .0508
+bezier .313748 .03046 .309654 .213026E-02 .286385 -.004445
+bezier .265567 -.812466E-02 .248269 .136921E-01 .254 .03302
+aline .254 .036195
+aline .2794 .137795
+aline .279876 .138747
+aline .2794 .1397
+aline .205105 .1397
+bezier .199161 .111245 .193889 .829126E-01 .188595 .05461
+aline .182245 .02286
+bezier .174899 -.010138 .167314 -.487152E-01 .135255 -.06604
+bezier .116923 -.765689E-01 .887655E-01 -.768644E-01 .075565 -.05842
+bezier .686237E-01 -.044544 .823736E-01 -.253228E-01 .09779 -.032385
+bezier .109196 -.398444E-01 .100586 -.057466 .890587E-01 -.593725E-01
+bezier .108979 -.760692E-01 .137279 -.586311E-01 .14478 -.03683
+aline .145415 -.03556
+aline .14859 -.026035
+aline .149225 -.023495
+aline .14986 -.02159
+aline .15494 -.00127
+aline .155575 .001905
+aline .15621 .004445
+aline .15748 .010795
+aline .158115 .013335
+aline .1651 .04826
+bezier .170689 .785259E-01 .177554 .109675 .182245 .1397
+aline .09779 .1397
+bezier .833582E-01 .807491E-01 .788541E-01 .177148E-01 .056515 -.04064
+bezier .485383E-01 -.598371E-01 .283172E-01 -.810561E-01 .005715 -.070485
+bezier -.124453E-01 -.065683 -.138998E-01 -.350571E-01 .005715 -.031115
+aline .01143 -.031115
+bezier .272912E-01 -.343202E-01 .201979E-01 -.581669E-01 .00635 -.059055
+aline .00508 -.05969
+bezier .122285E-01 -.068217 .270912E-01 -.683722E-01 .03175 -.05715
+bezier .476819E-01 -.187059E-01 .509981E-01 .239925E-01 .06096 .0635
+bezier .641776E-01 .891564E-01 .716308E-01 .114251 .074295 .1397
+aline .04699 .1397
+aline .045085 .141605
+aline .045085 .145415
+aline .04572 .14732
+aline .046355 .14859
+aline .04699 .149225
+aline .04826 .14986
+aline .076835 .14986
+bezier .845217E-01 .180067 .838638E-01 .219174 .113665 .23749
+aline .121285 .2413
+aline .128905 .24384
+aline .131445 .244475
+aline .13462 .24511
+aline .137795 .24511
+aline .13843 .245745
+aline .14351 .245745
+aline .144145 .24638
+aline .160655 .24638
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=15 !-------------- Beginning of new char.
+dfont wid=.89444 hei=.694445 dep=.194445 italic=.103334
+set path ! start of curve
+newpath
+! start of curve
+amove .15494 .24638
+bezier .169676 .245917 .189568 .236595 .18542 .21844
+bezier .183985 .205172 .162009 .197993 .156845 .21209
+bezier .154938 .221532 .161489 .2307 .170815 .23241
+bezier .150557 .248241 .114681 .236469 .11176 .208915
+bezier .106591 .189386 .102509 .169389 .099695 .14986
+aline .18415 .14986
+bezier .192348 .179914 .191417 .219605 .221615 .23749
+bezier .243913 .248853 .270351 .249369 .29337 .240665
+aline .294005 .24003
+aline .295275 .239395
+aline .29591 .23876
+aline .29718 .238125
+aline .30226 .233045
+aline .302895 .231775
+aline .304165 .227965
+aline .304165 .22225
+aline .3048 .221615
+aline .309245 .239395
+aline .30988 .2413
+aline .310515 .241935
+aline .311785 .24257
+aline .329565 .24257
+aline .330835 .2413
+aline .33147 .24003
+aline .33147 .23876
+aline .29083 .0762
+aline .280035 .03302
+bezier .277862 .231564E-01 .27378 .854861E-02 .285115 .00254
+bezier .300484 .295029E-02 .303637 .022468 .307975 .03429
+aline .30861 .03683
+aline .309245 .038735
+aline .311785 .048895
+aline .31242 .0508
+aline .314325 .052705
+aline .32004 .052705
+aline .32131 .05207
+aline .32258 .0508
+bezier .318193 .03046 .314099 .213026E-02 .29083 -.004445
+bezier .270012 -.812466E-02 .252714 .136921E-01 .258445 .03302
+aline .258445 .036195
+aline .283845 .137795
+aline .284321 .138747
+aline .283845 .1397
+aline .205105 .1397
+bezier .191878 .833162E-01 .187146 .238959E-01 .16637 -.03175
+bezier .153156 -.636979E-01 .110525 -.868298E-01 .08001 -.064135
+bezier .660203E-01 -.527353E-01 .779586E-01 -.253065E-01 .09652 -.03175
+bezier .109618 -.038081 .101165 -.575848E-01 .890587E-01 -.593725E-01
+bezier .108979 -.760692E-01 .137279 -.586311E-01 .14478 -.03683
+bezier .151075 -.206819E-01 .15414 -.348838E-02 .158115 .013335
+aline .1651 .04826
+bezier .170585 .785164E-01 .177574 .109568 .182245 .1397
+aline .09779 .1397
+bezier .832968E-01 .806338E-01 .788343E-01 .177727E-01 .056515 -.04064
+bezier .485383E-01 -.598371E-01 .283172E-01 -.810561E-01 .005715 -.070485
+bezier -.124453E-01 -.065683 -.138998E-01 -.350571E-01 .005715 -.031115
+aline .01143 -.031115
+bezier .272912E-01 -.343202E-01 .201979E-01 -.581669E-01 .00635 -.059055
+aline .00508 -.05969
+bezier .122285E-01 -.068217 .270912E-01 -.683722E-01 .03175 -.05715
+bezier .409536E-01 -.038777 .432335E-01 -.178522E-01 .04826 .001905
+aline .056515 .04318
+bezier .621444E-01 .751293E-01 .699971E-01 .107518 .074295 .1397
+aline .04699 .1397
+aline .045085 .141605
+aline .045085 .145415
+aline .04572 .14732
+aline .046355 .14859
+aline .04699 .149225
+aline .04826 .14986
+aline .076835 .14986
+bezier .847679E-01 .18004 .835608E-01 .220096 .113665 .238125
+aline .121285 .241935
+aline .127 .24384
+aline .12954 .244475
+aline .13589 .245745
+aline .140335 .245745
+aline .14097 .24638
+aline .15494 .24638
+closepath
+! end of curve
+
+! start of curve
+amove .254635 .23876
+bezier .237398 .238002 .221806 .225285 .219075 .207645
+bezier .214316 .188561 .20933 .168481 .207645 .14986
+aline .286385 .14986
+aline .28702 .150495
+aline .302022 .210503
+aline .301625 .21209
+bezier .296123 .203084 .279375 .200648 .27559 .21209
+bezier .273683 .221532 .280234 .2307 .28956 .23241
+bezier .279087 .238909 .266311 .240516 .254635 .23876
+closepath
+! end of curve
+
+! start of curve
+amove .301784 .212407
+aline .30226 .211455
+aline .302736 .212407
+aline .30226 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=16 !-------------- Beginning of new char.
+dfont wid=.306665 hei=.430555 dep=0 italic=.0767136
+set path ! start of curve
+newpath
+! start of curve
+amove .078105 .15367
+bezier .989184E-01 .151163 .104837 .126361 .097155 .109855
+bezier .867987E-01 .769781E-01 .697906E-01 .448971E-01 .064135 .01143
+aline .06477 .010795
+bezier .649366E-01 -.600005E-03 .782985E-01 .184865E-02 .084455 .006985
+bezier .098338 .184456E-01 .100418 .377757E-01 .10795 .052705
+aline .113665 .052705
+aline .114935 .05207
+aline .116205 .0508
+bezier .112029 .263792E-01 .971334E-01 -.623283E-02 .067945 -.004445
+bezier .457265E-01 -.215228E-02 .408384E-01 .251231E-01 .04953 .04191
+bezier .597011E-01 .717978E-01 .728131E-01 .101583 .08128 .131445
+aline .08128 .140335
+bezier .764568E-01 .153452 .590603E-01 .143402 .05461 .13462
+bezier .461901E-01 .123783 .438237E-01 .1095 .038735 .097155
+aline .037465 .09652
+aline .03175 .09652
+aline .031115 .097155
+bezier .274723E-01 .104153 .342159E-01 .113707 .036195 .121285
+bezier .427564E-01 .135735 .530791E-01 .15078 .06985 .15367
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=17 !-------------- Beginning of new char.
+dfont wid=.33222 hei=.430555 dep=.194445 italic=.0373611
+set path ! start of curve
+newpath
+! start of curve
+amove .086995 .15367
+bezier .107105 .151762 .116313 .128919 .111125 .11176
+aline .07747 -.02286
+bezier .692938E-01 -.565106E-01 .029292 -.860669E-01 -.00381 -.06731
+bezier -.194529E-01 -.582447E-01 -.104476E-01 -.308924E-01 .008255 -.03429
+bezier .235735E-01 -.037737 .169669E-01 -.594459E-01 .004445 -.06223
+bezier .200308E-01 -.723726E-01 .387962E-01 -.608603E-01 .04572 -.04572
+aline .050165 -.03683
+aline .0508 -.034925
+aline .051435 -.033655
+aline .055245 -.022225
+aline .09017 .117475
+bezier .921826E-01 .126356 .954191E-01 .140915 .08509 .146685
+bezier .586822E-01 .146668 .481432E-01 .117395 .038735 .097155
+aline .037465 .09652
+aline .03175 .09652
+aline .031115 .097155
+aline .029845 .09779
+bezier .339876E-01 .11917 .481695E-01 .139742 .06731 .150495
+aline .069215 .15113
+aline .070485 .151765
+aline .07239 .1524
+aline .07493 .153035
+aline .078105 .15367
+aline .086995 .15367
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=18 !-------------- Beginning of new char.
+dfont wid=.511108 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .118745 .243205
+aline .12065 .24257
+aline .121285 .241935
+aline .122555 .2413
+aline .12319 .240665
+aline .123825 .239395
+aline .12446 .23876
+aline .12954 .2286
+aline .130175 .226695
+aline .141605 .203835
+aline .14224 .20193
+aline .15113 .18415
+aline .15113 .18034
+aline .149225 .178435
+bezier .141715 .172296 .137852 .185023 .13335 .18923
+bezier .123188 .201776 .113052 .214341 .103505 .22733
+aline .103505 .23368
+aline .10414 .235585
+aline .104775 .23622
+aline .10541 .23749
+aline .108585 .240665
+aline .109855 .2413
+aline .11049 .241935
+aline .11176 .24257
+aline .113665 .243205
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=19 !-------------- Beginning of new char.
+dfont wid=.511108 hei=.694445 dep=0 italic=.0969448
+set path ! start of curve
+newpath
+! start of curve
+amove .186055 .243205
+bezier .196093 .240834 .194606 .226401 .186055 .222885
+bezier .166303 .207232 .146388 .191806 .126365 .17653
+aline .123825 .17653
+aline .120015 .18034
+aline .120015 .183515
+aline .12065 .184785
+aline .16383 .227965
+aline .164465 .229235
+aline .17526 .24003
+aline .17653 .240665
+aline .1778 .241935
+aline .17907 .24257
+aline .180975 .243205
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=20 !-------------- Beginning of new char.
+dfont wid=.511108 hei=.628473 dep=0 italic=.0829525
+set path ! start of curve
+newpath
+! start of curve
+amove .10668 .22098
+bezier .117373 .212654 .127498 .203539 .138113 .195104
+bezier .153886 .203191 .168442 .214952 .184785 .22098
+bezier .18969 .217816 .189184 .211352 .183515 .20955
+bezier .166712 .199404 .151456 .185116 .133985 .177165
+aline .12319 .18796
+aline .122555 .18923
+aline .11176 .200025
+aline .111125 .201295
+aline .10033 .21209
+aline .09906 .21463
+aline .09906 .215265
+aline .10033 .217805
+aline .1016 .219075
+aline .10287 .21971
+aline .10414 .22098
+aline .10668 .22098
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=21 !-------------- Beginning of new char.
+dfont wid=.511108 hei=.694445 dep=0 italic=.108057
+set path ! start of curve
+newpath
+! start of curve
+amove .10668 .24257
+aline .10795 .241935
+bezier .11028 .234384 .104652 .225487 .108585 .217805
+bezier .112887 .195845 .13932 .189758 .156845 .19939
+bezier .174376 .207263 .186376 .223748 .19177 .241935
+aline .19304 .24257
+aline .19558 .24257
+aline .19685 .241935
+bezier .199192 .23129 .190625 .220438 .18542 .211455
+bezier .170593 .189254 .138422 .172676 .1143 .189865
+bezier .993341E-01 .20225 .972774E-01 .223735 .102235 .240665
+aline .10414 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=22 !-------------- Beginning of new char.
+dfont wid=.511108 hei=.561666 dep=0 italic=.103334
+set path ! start of curve
+newpath
+! start of curve
+amove .19685 .20574
+aline .198755 .203835
+aline .198755 .20066
+aline .19812 .19812
+aline .197485 .19685
+aline .19685 .196215
+aline .19558 .19558
+aline .08382 .19558
+aline .081915 .197485
+aline .081915 .201295
+aline .08255 .203835
+aline .084455 .20574
+aline .19685 .20574
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=23 !-------------- Beginning of new char.
+dfont wid=.831291 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .21336 .25019
+bezier .23389 .248448 .239938 .221644 .22733 .207645
+bezier .216085 .188194 .179762 .179721 .169545 .20447
+bezier .163671 .22584 .183177 .247299 .20447 .25019
+closepath
+! end of curve
+
+! start of curve
+amove .20193 .24257
+bezier .183433 .240786 .173938 .216427 .180975 .201295
+bezier .196323 .188446 .221819 .200965 .222885 .22098
+bezier .227169 .230362 .222122 .241773 .211455 .243205
+aline .202565 .243205
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=24 !-------------- Beginning of new char.
+dfont wid=.459997 hei=0 dep=.170138 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .09779 -.00127
+aline .099695 -.003175
+aline .099695 -.006985
+aline .967581E-01 -.187325E-01
+bezier .103805 -.223427E-01 .115439 -.247918E-01 .117475 -.034925
+bezier .120725 -.05837 .925853E-01 -.670951E-01 .074295 -.066675
+aline .07366 -.06731
+aline .064135 -.06731
+aline .0635 -.067945
+aline .038735 -.067945
+aline .037465 -.06731
+aline .03683 -.066675
+aline .036195 -.065405
+aline .036195 -.0635
+aline .03683 -.06223
+bezier .054059 -.590699E-01 .730631E-01 -.630927E-01 .0889 -.052705
+bezier .098803 -.459477E-01 .982238E-01 -.290784E-01 .08509 -.02667
+aline .081915 -.026035
+aline .08128 -.0254
+aline .0762 -.0254
+aline .07493 -.024765
+aline .07366 -.022225
+aline .07366 -.02159
+aline .078105 -.00381
+aline .07874 -.00254
+aline .079375 -.001905
+aline .080645 -.00127
+aline .09779 -.00127
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=25 !-------------- Beginning of new char.
+dfont wid=.536664 hei=.694445 dep=.194445 italic=.105138
+set path ! start of curve
+newpath
+! start of curve
+amove .16256 .24638
+bezier .184617 .245521 .207852 .225116 .202565 .20193
+bezier .199649 .169601 .172553 .148831 .156845 .12319
+bezier .150649 .107606 .168122 .954085E-01 .17526 .083185
+bezier .207191 .037406 .139231 -.280785E-01 .094615 .00381
+bezier .082861 .119931E-01 .834413E-01 .378978E-01 .100965 .037465
+bezier .114001 .356968E-01 .108742 .169135E-01 .09779 .015875
+bezier .106103 -.209215E-02 .133997 -.135776E-02 .14224 .01651
+bezier .15238 .343724E-01 .164393 .582549E-01 .14859 .0762
+bezier .134732 .930985E-01 .134676 .119819 .14859 .136525
+bezier .169492 .152001 .175695 .177804 .180975 .20193
+bezier .184665 .216875 .176898 .23667 .16002 .239395
+bezier .142622 .240156 .120726 .234599 .1143 .2159
+bezier .973537E-01 .15801 .911741E-01 .987396E-01 .07747 .04064
+bezier .714268E-01 .812234E-02 .663459E-01 -.271911E-01 .04699 -.05461
+bezier .369765E-01 -.679447E-01 .017177 -.801117E-01 .00127 -.06858
+bezier -.137746E-01 -.580782E-01 -.719264E-02 -.283957E-01 .013335 -.031115
+bezier .291962E-01 -.343202E-01 .221029E-01 -.581669E-01 .008255 -.059055
+aline .00508 -.05969
+bezier .012167 -.718733E-01 .027669 -.639336E-01 .03175 -.05334
+bezier .474292E-01 -.185393E-01 .050913 .212732E-01 .059055 .057785
+bezier .641272E-01 .085233 .704369E-01 .112173 .074295 .1397
+aline .04699 .1397
+aline .04572 .140335
+aline .04445 .142875
+aline .04445 .14351
+aline .045085 .14605
+aline .04572 .147955
+aline .047625 .14986
+aline .076835 .14986
+bezier .838603E-01 .182046 .851953E-01 .225614 .12065 .240665
+aline .12446 .241935
+aline .12573 .24257
+aline .13335 .244475
+aline .136525 .24511
+aline .1397 .24511
+aline .140335 .245745
+aline .14605 .245745
+aline .146685 .24638
+aline .16256 .24638
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=26 !-------------- Beginning of new char.
+dfont wid=.715551 hei=.430555 dep=0 italic=.075139
+set path ! start of curve
+newpath
+! start of curve
+amove .165735 .15367
+aline .16764 .153035
+aline .168275 .1524
+aline .169545 .151765
+aline .170815 .150495
+aline .17145 .149225
+aline .17145 .14224
+aline .17018 .13716
+aline .169704 .136208
+bezier .177506 .140032 .188462 .149008 .19939 .15113
+bezier .218861 .158122 .248506 .15239 .252095 .12827
+bezier .255418 .100176 .225405 .825171E-01 .20066 .08255
+aline .200025 .081915
+aline .194945 .081915
+aline .19431 .08128
+aline .18542 .08128
+aline .184785 .080645
+aline .15621 .080645
+bezier .149822 .567802E-01 .145457 .263095E-01 .165735 .006985
+bezier .189682 -.593175E-02 .216571 .138123E-01 .231775 .032385
+bezier .234712 .035455 .235868 .421952E-01 .2413 .041275
+aline .24511 .037465
+bezier .242529 .023968 .228365 .148966E-01 .217805 .006985
+bezier .194742 -.875669E-02 .158091 -.010382 .142875 .01651
+aline .14097 .02032
+bezier .138117 .106401E-01 .137918 -.611992E-02 .123825 -.004445
+aline .12192 -.00381
+aline .12065 -.003175
+aline .11811 -.000635
+aline .117475 .00127
+aline .117475 .005715
+aline .120015 .015875
+aline .120438 .017145
+aline .120015 .018415
+bezier .107749 .231121E-02 .870735E-01 -.915482E-02 .066675 -.003175
+bezier .447437E-01 .885368E-04 .270384E-01 .221672E-01 .033655 .043815
+bezier .487085E-01 .984847E-01 .10437 .125429 .1524 .145415
+aline .153035 .14732
+aline .15367 .14859
+aline .156845 .151765
+aline .159385 .153035
+aline .16129 .15367
+closepath
+! end of curve
+
+! start of curve
+amove .21209 .14605
+bezier .18417 .141317 .163899 .114249 .15875 .08763
+bezier .183642 .880433E-01 .210833 .08668 .230505 .10414
+bezier .244252 .115968 .241933 .14352 .221615 .14605
+aline .22098 .146685
+aline .212725 .146685
+aline .21209 .14605
+closepath
+! end of curve
+
+! start of curve
+amove .147955 .13462
+bezier .102061 .114623 .587746E-01 .722169E-01 .057785 .019685
+bezier .622681E-01 .107884E-02 .870807E-01 -.232544E-02 .099695 .01016
+bezier .112 .194413E-01 .120546 .327467E-01 .127635 .046355
+aline .149225 .132715
+aline .149648 .133985
+aline .149352 .134874
+aline .148907 .135096
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=27 !-------------- Beginning of new char.
+dfont wid=.715551 hei=.430555 dep=0 italic=.075139
+set path ! start of curve
+newpath
+! start of curve
+amove .11938 .154305
+bezier .13687 .154249 .15176 .139783 .15621 .12319
+bezier .176537 .146176 .213549 .16488 .241935 .14605
+bezier .262802 .129152 .248944 .956856E-01 .22606 .088265
+bezier .203632 .799506E-01 .181091 .807177E-01 .15748 .080645
+bezier .150891 .567569E-01 .146321 .02782 .1651 .00762
+bezier .187706 -.616585E-02 .215087 .124511E-01 .22987 .03048
+bezier .234334 .334364E-01 .234854 .420053E-01 .2413 .041275
+aline .24511 .037465
+bezier .242529 .023968 .228365 .148966E-01 .217805 .006985
+bezier .194275 -.917905E-02 .157121 -.100342E-01 .141605 .017145
+aline .13843 .023495
+aline .137795 .0254
+aline .13716 .02667
+aline .13589 .03048
+bezier .119575 .630722E-02 .855881E-01 -.171239E-01 .057785 .00254
+bezier .310787E-01 .247054E-01 .361399E-01 .648928E-01 .047625 .09398
+bezier .603051E-01 .12332 .856641E-01 .152448 .11938 .154305
+closepath
+! end of curve
+
+! start of curve
+amove .113665 .14605
+bezier .804326E-01 .132347 .732282E-01 .919225E-01 .065405 .060325
+bezier .608288E-01 .422962E-01 .567057E-01 .168584E-01 .074295 .00381
+bezier .093316 -.205781E-02 .10861 .172493E-01 .117475 .03175
+bezier .131236 .593832E-01 .139994 .899229E-01 .1397 .120015
+bezier .13816 .132426 .130298 .150361 .1143 .146685
+closepath
+! end of curve
+
+! start of curve
+amove .21209 .14605
+bezier .183985 .141107 .16494 .114011 .16002 .08763
+bezier .185398 .881841E-01 .213755 .867881E-01 .233045 .10668
+bezier .244055 .119461 .240451 .14375 .221615 .14605
+aline .22098 .146685
+aline .212725 .146685
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=28 !-------------- Beginning of new char.
+dfont wid=.511108 hei=.527779 dep=.0972233 italic=.0919447
+set path ! start of curve
+newpath
+! start of curve
+amove .191135 .18796
+bezier .196835 .181603 .185869 .175463 .183515 .169545
+bezier .176307 .159805 .168418 .150249 .162163 .140017
+bezier .19183 .0998 .170815 .402444E-01 .13335 .012065
+bezier .113898 -.434984E-02 .083095 -.122824E-01 .061595 .004445
+bezier .504927E-01 -.972685E-02 .404807E-01 -.246845E-01 .02921 -.038735
+bezier .207909E-01 -.395919E-01 .252442E-01 -.300067E-01 .02921 -.027305
+bezier .371612E-01 -.145137E-01 .491143E-01 -.280192E-02 .055245 .01016
+bezier .279819E-01 .448317E-01 .438568E-01 .095768 .07112 .12573
+bezier .919371E-01 .149197 .128797 .164431 .156422 .145203
+bezier .167164 .159385 .177221 .174529 .188595 .18796
+aline .191135 .18796
+closepath
+! end of curve
+
+! start of curve
+amove .121285 .14605
+bezier .798403E-01 .134326 .667257E-01 .08529 .06096 .04826
+aline .06096 .03556
+aline .061595 .034925
+aline .061595 .03048
+aline .06223 .029845
+aline .0635 .024765
+aline .06477 .020955
+bezier .927775E-01 .591589E-01 .120825 .973342E-01 .149225 .135255
+aline .14732 .13716
+aline .146685 .13843
+aline .14351 .141605
+aline .14224 .14224
+aline .141605 .142875
+aline .137795 .14478
+aline .133985 .14605
+aline .13335 .146685
+aline .12192 .146685
+closepath
+! end of curve
+
+! start of curve
+amove .151765 .127
+bezier .124306 .892732E-01 .963264E-01 .519216E-01 .687388E-01 .142875E-01
+bezier .796915E-01 -.461752E-02 .105372 .230085E-02 .118745 .014605
+bezier .145786 .406578E-01 .156806 .805695E-01 .15621 .11684
+aline .155575 .117475
+aline .15494 .12065
+aline .15367 .12573
+aline .153035 .127
+aline .1524 .127635
+aline .151765 .127
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=29 !-------------- Beginning of new char.
+dfont wid=.882772 hei=.683332 dep=0 italic=.120277
+set path ! start of curve
+newpath
+! start of curve
+amove .33147 .23876
+aline .333375 .236855
+bezier .330353 .211267 .328045 .185682 .323215 .160655
+aline .321945 .16002
+aline .31623 .16002
+aline .314325 .161925
+bezier .31424 .181303 .324037 .205822 .30734 .221615
+aline .30226 .224155
+aline .296545 .22606
+aline .29337 .226695
+aline .292735 .22733
+aline .28956 .22733
+aline .288925 .227965
+aline .282575 .227965
+aline .28194 .2286
+aline .235585 .2286
+aline .23495 .227965
+aline .231775 .22733
+aline .229235 .22606
+aline .22733 .22225
+aline .22606 .21844
+aline .20193 .12192
+aline .201507 .12065
+aline .20193 .11938
+aline .23622 .11938
+bezier .248363 .120189 .261576 .12713 .264795 .140335
+aline .2667 .14605
+aline .267335 .14859
+aline .26797 .150495
+aline .269875 .158115
+aline .27051 .159385
+aline .271145 .16002
+aline .272415 .160655
+aline .27813 .160655
+aline .280035 .15875
+aline .280035 .15494
+aline .25908 .07112
+aline .25781 .06858
+aline .25654 .067945
+aline .250825 .067945
+aline .249555 .06858
+bezier .24662 .804943E-01 .259148 .950043E-01 .248285 .10541
+aline .245745 .10668
+aline .24384 .107315
+aline .240665 .10795
+aline .24003 .108585
+aline .235585 .108585
+aline .23495 .10922
+aline .198755 .10922
+aline .175895 .01778
+aline .17526 .017145
+aline .17526 .01143
+aline .175895 .010795
+aline .178435 .01016
+aline .17907 .009525
+aline .22606 .009525
+bezier .248629 .109178E-01 .274441 .021438 .283845 .04445
+bezier .292981 .584776E-01 .297107 .760543E-01 .30607 .089535
+aline .311785 .089535
+bezier .316905 .829159E-01 .307992 .745406E-01 .306705 .06731
+bezier .296615 .449306E-01 .289197 .204574E-01 .277495 -.000635
+aline .12319 -.000635
+aline .12192 0
+aline .121285 .000635
+aline .12065 .001905
+aline .12065 .00381
+aline .121285 .00635
+aline .12192 .00762
+bezier .129566 .126923E-01 .144526 .562416E-02 .14859 .017145
+aline .149225 .018415
+aline .17145 .107315
+aline .171926 .108268
+aline .17145 .10922
+aline .120015 .10922
+bezier .10448 .803388E-01 .854067E-01 .531611E-01 .071755 .023495
+bezier .700252E-01 .125553E-01 .826508E-01 .934405E-02 .090805 .00889
+aline .092075 .00635
+aline .092075 .005715
+aline .09144 .003175
+aline .090805 .00127
+aline .0889 -.000635
+aline .080645 -.000635
+aline .08001 0
+aline .057785 0
+aline .05715 .000635
+aline .047625 .000635
+aline .04699 0
+aline .02921 0
+aline .028575 -.000635
+aline .02286 -.000635
+aline .020955 .00127
+aline .020955 .004445
+aline .02159 .006985
+aline .022225 .008255
+bezier .319949E-01 .105822E-01 .434124E-01 .01124 .05207 .018415
+bezier .736961E-01 .411267E-01 .850362E-01 .712522E-01 .102235 .097155
+bezier .127046 .14075 .153109 .183586 .177588 .22733
+aline .177165 .2286
+aline .154305 .2286
+aline .153035 .229235
+aline .1524 .22987
+aline .151765 .23114
+aline .151765 .233045
+aline .1524 .235585
+aline .15367 .238125
+aline .15494 .23876
+aline .33147 .23876
+closepath
+! end of curve
+
+! start of curve
+amove .188595 .226695
+bezier .168417 .190896 .145641 .155144 .127 .11938
+aline .17399 .11938
+aline .174625 .120015
+aline .198755 .216535
+aline .19939 .21717
+aline .19939 .22225
+aline .198755 .222885
+aline .19812 .22479
+aline .19558 .22606
+aline .1905 .227076
+aline .188595 .226695
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=30 !-------------- Beginning of new char.
+dfont wid=.984995 hei=.683332 dep=0 italic=.120277
+set path ! start of curve
+newpath
+! start of curve
+amove .20701 .24638
+bezier .218582 .244873 .231328 .240799 .24257 .23876
+aline .36703 .23876
+aline .368935 .236855
+bezier .365913 .211267 .363605 .185682 .358775 .160655
+aline .357505 .16002
+aline .35179 .16002
+aline .349885 .161925
+bezier .350191 .180625 .357899 .202191 .34544 .219075
+bezier .337218 .226074 .325945 .227438 .31623 .2286
+aline .264795 .2286
+aline .26416 .227965
+aline .260985 .22733
+aline .258445 .22606
+aline .25654 .22225
+aline .25527 .21844
+aline .233283 .130492
+aline .23368 .128905
+aline .274955 .128905
+bezier .288272 .129207 .303273 .13588 .30734 .150495
+aline .309245 .15621
+aline .30988 .15875
+aline .310515 .160655
+aline .31242 .168275
+aline .314325 .17018
+aline .320675 .17018
+aline .32258 .168275
+aline .32258 .1651
+aline .301625 .08128
+aline .30099 .079375
+aline .299085 .07747
+aline .29337 .07747
+aline .2921 .078105
+bezier .288985 .876558E-01 .297613 .981581E-01 .294005 .10795
+aline .292735 .11176
+aline .290195 .1143
+aline .286385 .116205
+aline .283845 .11684
+aline .28067 .117475
+aline .280035 .11811
+aline .274955 .11811
+aline .27432 .118745
+aline .230505 .118745
+aline .22987 .11684
+aline .205105 .01778
+aline .20447 .017145
+aline .20447 .01143
+aline .205105 .010795
+aline .207645 .01016
+aline .20828 .009525
+aline .26035 .009525
+bezier .283817 .107667E-01 .310223 .219845E-01 .32004 .04572
+bezier .328969 .059323 .332815 .765031E-01 .34163 .089535
+aline .347345 .089535
+bezier .352465 .829159E-01 .343552 .745406E-01 .342265 .06731
+bezier .332175 .449306E-01 .324757 .204574E-01 .313055 -.000635
+aline .182245 -.000635
+bezier .153738 -.757618E-02 .120483 -.148953E-01 .09398 .004445
+bezier .554095E-01 .030381 .515101E-01 .832936E-01 .0635 .123825
+bezier .806055E-01 .181985 .127363 .234973 .188595 .245745
+aline .193675 .245745
+aline .19431 .24638
+aline .20701 .24638
+closepath
+! end of curve
+
+! start of curve
+amove .193675 .23876
+bezier .148668 .230922 .119582 .189046 .10287 .149225
+bezier .874482E-01 .105846 .785606E-01 .565284E-01 .10541 .015875
+bezier .123819 -.100437E-01 .17005 -.626376E-02 .179705 .026035
+aline .18034 .02794
+aline .180975 .02921
+aline .18161 .031115
+aline .182245 .032385
+aline .187325 .047625
+aline .18796 .050165
+aline .188595 .05207
+aline .18923 .05461
+aline .189865 .056515
+aline .22098 .180975
+bezier .223724 .197748 .230985 .215165 .222885 .23114
+bezier .215304 .2389 .203645 .240674 .193675 .23876
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=31 !-------------- Beginning of new char.
+dfont wid=.766663 hei=.731944 dep=.0486116 italic=.0940275
+set path ! start of curve
+newpath
+! start of curve
+amove .28448 .26035
+aline .28575 .259715
+aline .28702 .25908
+aline .28829 .25781
+aline .28829 .254
+bezier .278035 .24192 .26662 .230533 .257387 .217805
+bezier .29474 .163714 .272818 .894798E-01 .23241 .04318
+bezier .199086 .479969E-02 .141482 -.247005E-01 .09271 .001905
+bezier .869311E-01 .456473E-02 .822498E-01 .111034E-01 .076835 .0127
+bezier .066679 .960193E-03 .567808E-01 -.114323E-01 .04572 -.022225
+aline .04445 -.022225
+aline .04318 -.02159
+aline .04064 -.01905
+aline .04064 -.01651
+bezier .510248E-01 -.430191E-02 .615996E-01 .776923E-02 .07239 .019685
+bezier .037776 .655161E-01 .524375E-01 .129636 .081915 .174625
+bezier .112007 .220767 .171195 .261651 .22733 .240665
+bezier .236731 .237465 .244201 .229138 .252095 .225425
+bezier .262991 .236784 .272077 .249914 .283845 .26035
+closepath
+! end of curve
+
+! start of curve
+amove .18796 .23876
+bezier .132981 .231306 .998187E-01 .177317 .08763 .127
+bezier .794342E-01 .957737E-01 .714253E-01 .638923E-01 .08382 .03302
+bezier .136068 .093166 .189063 .152774 .241141 .213042
+bezier .230971 .231467 .208053 .242163 .18796 .23876
+closepath
+! end of curve
+
+! start of curve
+amove .2413 .20066
+bezier .190864 .141706 .136892 .828625E-01 .088265 .02413
+bezier .104693 -.354846E-02 .141703 -.717437E-02 .168275 .006985
+bezier .225019 .347394E-01 .244179 .104318 .25146 .160655
+bezier .251825 .176018 .251414 .190448 .24511 .20447
+aline .2413 .20066
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=32 !-------------- Beginning of new char.
+dfont wid=.255554 hei=.430555 dep=0 italic=0
+dfont fby="L" kadd=-.320554
+dfont fby="l" kadd=-.255554
+set path ! start of curve
+newpath
+! start of curve
+amove .11684 .136525
+bezier .122537 .133654 .119797 .125323 .113665 .125095
+bezier .873152E-01 .116437 .615737E-01 .104712 .034925 .09779
+aline .03302 .099695
+aline .032385 .10287
+aline .032385 .104775
+bezier .411765E-01 .112372 .547544E-01 .113586 .065405 .118745
+bezier .817549E-01 .124547 .980556E-01 .130468 .1143 .136525
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=33 !-------------- Beginning of new char.
+dfont wid=.306665 hei=.694445 dep=0 italic=.124168
+set path ! start of curve
+newpath
+! start of curve
+amove .11938 .25019
+aline .12192 .249555
+aline .12573 .24765
+aline .12954 .24384
+aline .13081 .2413
+aline .131445 .23876
+aline .131445 .23368
+aline .13081 .23114
+aline .126365 .217805
+aline .12573 .215265
+aline .108585 .16383
+aline .10795 .16129
+aline .09017 .10795
+aline .089535 .10541
+aline .076835 .06731
+aline .0762 .06604
+aline .07493 .065405
+aline .067945 .065405
+bezier .648343E-01 .740791E-01 .707076E-01 .840873E-01 .070485 .093345
+bezier .798898E-01 .141903 .085921 .190359 .09652 .239395
+aline .09779 .240665
+aline .098425 .241935
+aline .10033 .24384
+aline .1016 .244475
+aline .103505 .24638
+aline .106045 .24765
+aline .10668 .248285
+aline .11049 .249555
+aline .11303 .25019
+closepath
+! end of curve
+
+! start of curve
+amove .06604 .03556
+bezier .08453 .310546E-01 .078019 .506315E-02 .062865 .000635
+bezier .544939E-01 -.298507E-02 .433683E-01 .297474E-03 .04064 .009525
+bezier .383196E-01 .217246E-01 .475149E-01 .033044 .059055 .03556
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=34 !-------------- Beginning of new char.
+dfont wid=.514442 hei=.694445 dep=0 italic=.0696125
+set path ! start of curve
+newpath
+! start of curve
+amove .1016 .24257
+bezier .119085 .238021 .115617 .21656 .112395 .2032
+bezier .105143 .176666 .087995 .154316 .066675 .137795
+aline .064135 .137795
+aline .062865 .13843
+aline .061595 .1397
+aline .061595 .142875
+bezier .831477E-01 .160202 .101821 .18421 .106045 .21209
+bezier .979374E-01 .20353 .788873E-01 .203677 .0762 .21717
+bezier .738357E-01 .231516 .873504E-01 .244802 .1016 .24257
+closepath
+! end of curve
+
+! start of curve
+amove .1651 .24257
+bezier .182585 .238021 .179117 .21656 .175895 .2032
+bezier .168643 .176666 .151495 .154316 .130175 .137795
+aline .127635 .137795
+aline .126365 .13843
+aline .125095 .1397
+aline .125095 .142875
+bezier .146648 .160202 .165321 .18421 .169545 .21209
+bezier .161437 .20353 .142387 .203677 .1397 .21717
+bezier .137336 .231516 .15085 .244802 .1651 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=35 !-------------- Beginning of new char.
+dfont wid=.817774 hei=.694445 dep=.194443 italic=.066164
+set path ! start of curve
+newpath
+! start of curve
+amove .20447 .24257
+aline .20574 .241935
+aline .20701 .2413
+aline .20828 .24003
+aline .20955 .23749
+aline .20955 .23368
+aline .202565 .21971
+aline .20193 .217805
+aline .174625 .163195
+aline .17399 .16129
+aline .158115 .12954
+aline .15748 .128905
+aline .158115 .12827
+aline .215265 .12827
+aline .23368 .1651
+aline .234315 .167005
+aline .26162 .221615
+aline .262255 .22352
+aline .27051 .24003
+aline .27178 .2413
+aline .27432 .24257
+aline .27813 .24257
+aline .28067 .2413
+aline .28194 .24003
+aline .28321 .23749
+aline .28321 .23368
+aline .276225 .21971
+aline .27559 .217805
+aline .248285 .163195
+aline .24765 .16129
+aline .231775 .12954
+aline .23114 .128905
+aline .231775 .12827
+aline .28575 .12827
+aline .28829 .127
+aline .28956 .12573
+aline .29083 .12319
+aline .29083 .11938
+aline .28956 .11684
+aline .28829 .11557
+aline .28575 .1143
+aline .224155 .1143
+bezier .215057 .966317E-01 .20515 .772202E-01 .19812 .05969
+aline .268605 .05969
+aline .271145 .05842
+aline .272415 .05715
+aline .273685 .05461
+aline .273685 .0508
+aline .272415 .04826
+aline .271145 .04699
+aline .268605 .04572
+aline .189865 .04572
+aline .187325 .04064
+aline .18669 .038735
+aline .164465 -.005715
+aline .16383 -.00762
+aline .141605 -.05207
+aline .14097 -.053975
+aline .13462 -.066675
+aline .13335 -.067945
+aline .13081 -.069215
+aline .127 -.069215
+aline .12446 -.067945
+aline .12319 -.066675
+aline .12192 -.064135
+aline .12192 -.060325
+aline .127 -.050165
+aline .127635 -.04826
+aline .14986 -.00381
+aline .150495 -.001905
+aline .17272 .042545
+aline .173355 .04445
+aline .17399 .045085
+aline .173355 .04572
+aline .116205 .04572
+aline .113665 .04064
+aline .11303 .038735
+aline .090805 -.005715
+aline .09017 -.00762
+aline .067945 -.05207
+aline .06731 -.053975
+aline .06096 -.066675
+aline .05969 -.067945
+aline .05715 -.069215
+aline .05334 -.069215
+aline .0508 -.067945
+aline .04953 -.066675
+aline .04826 -.064135
+aline .04826 -.060325
+aline .05334 -.050165
+aline .053975 -.04826
+aline .0762 -.00381
+aline .076835 -.001905
+aline .09906 .042545
+aline .099695 .04445
+aline .10033 .045085
+aline .099695 .04572
+aline .04572 .04572
+aline .04318 .04699
+aline .04191 .04826
+aline .041275 .04953
+aline .04064 .051435
+aline .04064 .053975
+aline .041275 .05588
+aline .04191 .05715
+aline .04318 .05842
+aline .04572 .05969
+aline .10795 .05969
+aline .111125 .06604
+aline .11176 .067945
+aline .11938 .083185
+aline .120015 .08509
+aline .127635 .10033
+aline .12827 .102235
+aline .133826 .113348
+aline .13335 .1143
+aline .062865 .1143
+aline .060325 .11557
+aline .059055 .11684
+aline .05842 .11811
+aline .057785 .120015
+aline .057785 .122555
+aline .05842 .12446
+aline .059055 .12573
+aline .060325 .127
+aline .062865 .12827
+aline .141605 .12827
+aline .16002 .1651
+aline .160655 .167005
+aline .18796 .221615
+aline .188595 .22352
+aline .19685 .24003
+aline .19812 .2413
+aline .19939 .241935
+aline .20066 .24257
+closepath
+! end of curve
+
+! start of curve
+amove .14986 .113665
+bezier .141453 .958675E-01 .131205 .770621E-01 .12446 .05969
+aline .18161 .05969
+aline .184785 .06604
+aline .18542 .067945
+aline .19304 .083185
+aline .193675 .08509
+aline .201295 .10033
+aline .20193 .102235
+aline .207486 .113348
+aline .20701 .1143
+aline .150495 .1143
+aline .14986 .113665
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=36 !-------------- Beginning of new char.
+dfont wid=.769094 hei=.694445 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .205105 .247015
+bezier .227508 .247951 .246543 .22642 .24511 .20447
+bezier .246048 .192118 .246114 .172383 .230505 .168275
+bezier .22197 .165528 .211166 .173475 .215265 .183515
+bezier .217466 .192742 .22737 .196545 .235585 .196215
+bezier .237092 .213466 .229907 .235287 .21082 .239395
+bezier .180788 .24205 .163163 .210898 .156845 .18542
+aline .142478 .127953
+aline .142875 .126365
+aline .175895 .126365
+aline .17653 .12573
+aline .1778 .125095
+aline .1778 .121285
+aline .177165 .118745
+aline .17653 .117475
+aline .17526 .116205
+aline .1397 .116205
+aline .139065 .1143
+aline .12446 .05588
+aline .12192 .04826
+aline .121285 .04699
+aline .12065 .045085
+aline .11684 .037465
+bezier .111845 .316744E-01 .122523 .300424E-01 .125095 .026035
+bezier .142558 .122027E-01 .167162 .175406E-02 .187325 .015875
+bezier .201176 .228112E-01 .207863 .377229E-01 .213995 .0508
+aline .220345 .0508
+bezier .22552 .461742E-01 .218832 .378978E-01 .21717 .032385
+bezier .200672 -.18042E-04 .155437 -.173037E-01 .125095 .006985
+bezier .117759 .106631E-01 .111643 .184485E-01 .10414 .02032
+bezier .879967E-01 .288235E-02 .060629 -.124287E-01 .037465 0
+bezier .228036E-01 .112038E-01 .359868E-01 .326754E-01 .048895 .03937
+bezier .631704E-01 .491585E-01 .823164E-01 .502592E-01 .09779 .04318
+aline .098425 .04445
+aline .100965 .05207
+aline .1016 .05461
+aline .102235 .056515
+aline .11684 .114935
+aline .117475 .11557
+aline .11684 .116205
+aline .092075 .116205
+aline .090805 .11684
+aline .09017 .117475
+aline .09017 .12192
+aline .090805 .12446
+aline .09271 .126365
+aline .11938 .126365
+aline .120015 .127635
+aline .13462 .186055
+bezier .143829 .217447 .171501 .245511 .205105 .247015
+closepath
+! end of curve
+
+! start of curve
+amove .067945 .033655
+bezier .556712E-01 .332108E-01 .398172E-01 .204265E-01 .045085 .006985
+bezier .564865E-01 -.387783E-02 .734018E-01 .828002E-02 .08255 .017145
+bezier .854981E-01 .211777E-01 .888253E-01 .024937 .09144 .02921
+aline .089535 .029845
+aline .088265 .03048
+aline .08255 .032385
+aline .079375 .03302
+aline .07874 .033655
+aline .074295 .033655
+aline .07366 .03429
+aline .06858 .03429
+aline .067945 .033655
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=37 !-------------- Beginning of new char.
+dfont wid=.817774 hei=.75 dep=.0555553 italic=.136389
+set path ! start of curve
+newpath
+! start of curve
+amove .14351 .262255
+bezier .160042 .259445 .164433 .239989 .17907 .23368
+bezier .214898 .21363 .261107 .2301 .28575 .260985
+bezier .294158 .267216 .302102 .253197 .29337 .248285
+bezier .21679 .158989 .139991 .698516E-01 .062865 -.01905
+bezier .545436E-01 -.251606E-01 .464862E-01 -.113002E-01 .055245 -.00635
+bezier .122019 .717773E-01 .189422 .149451 .25654 .22733
+bezier .228767 .215602 .193649 .212151 .168275 .23241
+bezier .171408 .192556 .156332 .144734 .118745 .123825
+bezier .957155E-01 .112709 .071863 .135554 .073025 .15875
+bezier .691606E-01 .19913 .907256E-01 .248386 .13208 .26162
+aline .135255 .262255
+closepath
+! end of curve
+
+! start of curve
+amove .13589 .254635
+bezier .107693 .243518 .100294 .209568 .093345 .18288
+bezier .893095E-01 .165732 .854237E-01 .145399 .098425 .13081
+bezier .114713 .122351 .129307 .141077 .137795 .153035
+bezier .154036 .181706 .167858 .218229 .15113 .24892
+aline .14732 .25273
+aline .14478 .254
+aline .142875 .254635
+aline .14224 .25527
+aline .136525 .25527
+closepath
+! end of curve
+
+! start of curve
+amove .255905 .227965
+aline .25654 .22733
+aline .257175 .227965
+aline .25654 .2286
+aline .255905 .227965
+closepath
+! end of curve
+
+! start of curve
+amove .25146 .12065
+bezier .273677 .116043 .27851 .088843 .276225 .070485
+bezier .273955 .348051E-01 .256406 -.623656E-02 .22098 -.019685
+bezier .197931 -.257188E-01 .179826 -.185004E-02 .180975 .01905
+bezier .17783 .059514 .200596 .109829 .243205 .12065
+closepath
+! end of curve
+
+! start of curve
+amove .24384 .11303
+bezier .214618 .100952 .207576 .654207E-01 .20066 .037465
+bezier .196923 .218881E-01 .194536 .283828E-02 .206375 -.010795
+bezier .223565 -.195104E-01 .238443 .652075E-03 .247015 .013335
+bezier .262861 .420255E-01 .276474 .793825E-01 .25781 .10922
+aline .25654 .11049
+aline .25273 .112395
+aline .250825 .11303
+aline .25019 .113665
+aline .244475 .113665
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=38 !-------------- Beginning of new char.
+dfont wid=.766663 hei=.694445 dep=0 italic=.0969448
+set path ! start of curve
+newpath
+! start of curve
+amove .15367 .25019
+bezier .173769 .248944 .188593 .227023 .18542 .20828
+bezier .187541 .196334 .179141 .180769 .16637 .18288
+bezier .151858 .182213 .152998 .203491 .16383 .20828
+aline .16637 .20955
+aline .16891 .210185
+aline .172085 .210185
+aline .17272 .21082
+aline .174307 .210423
+aline .175895 .21082
+bezier .177162 .227192 .162826 .247324 .14478 .24257
+bezier .109055 .232003 .100449 .188618 .09398 .15748
+aline .09398 .149225
+bezier .109162 .15669 .132938 .168269 .14732 .151765
+bezier .160513 .128738 .132931 .101799 .10922 .108585
+aline .10414 .109855
+aline .102235 .11049
+aline .095885 .113665
+aline .09525 .1143
+aline .09398 .114935
+aline .09271 .116205
+aline .09144 .11684
+aline .0889 .11938
+bezier .762185E-01 .897347E-01 .609672E-01 .05505 .078105 .024765
+bezier .984208E-01 -.492259E-02 .139519 -.519129E-02 .17018 .00381
+bezier .219937 .160259E-01 .252161 .717426E-01 .245745 .120015
+bezier .243041 .133271 .23717 .147094 .22733 .155998
+bezier .207424 .144259 .179452 .129837 .18288 .102235
+aline .183515 .1016
+aline .18415 .10033
+bezier .187347 .111581 .20671 .11637 .21082 .103505
+bezier .214236 .875359E-01 .192906 .785436E-01 .18161 .088265
+bezier .163056 .104395 .175334 .134546 .193675 .145415
+bezier .216849 .163077 .245652 .175864 .259715 .2032
+aline .26543 .21463
+aline .266065 .215265
+bezier .251701 .214516 .250148 .234693 .26162 .24003
+aline .262255 .240665
+aline .264795 .241935
+aline .267335 .24257
+aline .27305 .24257
+aline .274955 .241935
+aline .277495 .240665
+aline .280035 .238125
+bezier .284167 .220949 .271921 .203983 .263525 .189865
+bezier .256299 .179644 .246847 .171094 .237649 .162878
+bezier .281966 .109311 .245804 .216474E-01 .183515 0
+bezier .141524 -.141644E-01 .886361E-01 -.131408E-01 .05715 .02286
+bezier .297511E-01 .583193E-01 .521892E-01 .106321 .778669E-01 .135573
+bezier .636339E-01 .181023 .932949E-01 .236932 .1397 .249555
+aline .142875 .249555
+aline .14351 .25019
+aline .15367 .25019
+closepath
+! end of curve
+
+! start of curve
+amove .125095 .1524
+bezier .113394 .149977 .101709 .140392 .097155 .13081
+bezier .101618 .113661 .126246 .10925 .135255 .125095
+bezier .141217 .133286 .144113 .148817 .13208 .153035
+aline .12573 .153035
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=39 !-------------- Beginning of new char.
+dfont wid=.306665 hei=.694445 dep=0 italic=.124168
+dfont fby=33 kadd=.102221
+dfont fby=39 ligrep=34
+dfont fby="?" kadd=.102221
+set path ! start of curve
+newpath
+! start of curve
+amove .117475 .24257
+bezier .13496 .238021 .131492 .21656 .12827 .2032
+bezier .121018 .176666 .10387 .154316 .08255 .137795
+aline .08001 .137795
+aline .07874 .13843
+aline .07747 .1397
+aline .07747 .142875
+bezier .990227E-01 .160202 .117696 .18421 .12192 .21209
+bezier .113812 .20353 .947623E-01 .203677 .092075 .21717
+bezier .897107E-01 .231516 .103225 .244802 .117475 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=40 !-------------- Beginning of new char.
+dfont wid=.408887 hei=.75 dep=.25 italic=.161944
+set path ! start of curve
+newpath
+! start of curve
+amove .17907 .262255
+aline .18034 .26162
+aline .180975 .260985
+aline .180975 .257175
+bezier .110426 .200182 .794114E-01 .103959 .070485 .018415
+bezier .687421E-01 -.174682E-01 .737372E-01 -.536806E-01 .09525 -.08382
+aline .09525 -.08636
+bezier .885111E-01 -.924848E-01 .838581E-01 -.800924E-01 .079375 -.0762
+bezier .063117 -.543142E-01 .561659E-01 -.256509E-01 .053975 0
+aline .053975 .03175
+bezier .608895E-01 .118338 .101557 .211001 .175895 .262255
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=")" !-------------- Beginning of new char.
+dfont wid=.408887 hei=.75 dep=.25 italic=.0369444
+set path ! start of curve
+newpath
+! start of curve
+amove .097155 .262255
+bezier .132998 .227187 .137706 .172118 .131445 .126365
+bezier .121919 .043765 .810259E-01 -.402049E-01 .01143 -.088265
+aline .008255 -.088265
+aline .00762 -.08763
+aline .00635 -.086995
+aline .00635 -.083185
+bezier .765563E-01 -.268754E-01 .107432 .685884E-01 .11684 .153035
+bezier .119167 .189298 .114034 .227416 .092075 .258445
+aline .092075 .259715
+aline .09271 .260985
+aline .09398 .262255
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="*" !-------------- Beginning of new char.
+dfont wid=.511108 hei=.75 dep=0 italic=.149167
+set path ! start of curve
+newpath
+! start of curve
+amove .15748 .262255
+aline .159385 .26162
+aline .161925 .25908
+aline .16256 .25781
+aline .16256 .254635
+aline .155575 .23368
+aline .15494 .23114
+aline .14351 .19685
+bezier .143345 .192638 .148851 .199462 .15113 .200025
+bezier .166148 .209271 .180443 .21952 .19558 .2286
+bezier .205535 .231628 .208247 .216896 .200025 .21336
+bezier .181897 .204133 .162721 .196446 .144939 .187008
+bezier .158429 .176351 .176083 .170027 .188595 .158115
+aline .188595 .15494
+aline .18796 .153035
+aline .18669 .150495
+aline .183515 .14732
+aline .179705 .145415
+aline .17526 .145415
+aline .17272 .146685
+aline .1524 .167005
+aline .15113 .16764
+aline .139065 .179705
+bezier .134558 .15874 .132661 .138105 .127635 .11684
+aline .12446 .113665
+aline .12192 .112395
+aline .120015 .11176
+aline .116205 .11176
+aline .1143 .112395
+aline .11176 .114935
+aline .111125 .116205
+aline .111125 .11938
+aline .11811 .140335
+aline .118745 .142875
+aline .130175 .177165
+bezier .13034 .181377 .124834 .174553 .122555 .17399
+bezier .107537 .164744 .932421E-01 .154495 .078105 .145415
+bezier .681504E-01 .142387 .654385E-01 .157119 .07366 .160655
+bezier .917874E-01 .169883 .110966 .177568 .128746 .187008
+bezier .115255 .197664 .976021E-01 .203988 .08509 .2159
+aline .08509 .219075
+aline .085725 .22098
+aline .086995 .22352
+aline .09017 .226695
+aline .09398 .2286
+aline .098425 .2286
+aline .100965 .22733
+aline .121285 .20701
+aline .122555 .206375
+aline .13462 .19431
+bezier .139127 .215275 .141024 .23591 .14605 .257175
+aline .149225 .26035
+aline .151765 .26162
+aline .15367 .262255
+aline .15748 .262255
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="+" !-------------- Beginning of new char.
+dfont wid=.766663 hei=.561666 dep=.0566654 italic=.0369444
+set path ! start of curve
+newpath
+! start of curve
+amove .183515 .19431
+aline .184785 .193675
+aline .186055 .19304
+aline .187325 .19177
+aline .188595 .18923
+aline .188595 .18542
+aline .16637 .09652
+aline .165947 .09525
+aline .16637 .09398
+aline .25908 .09398
+bezier .265526 .918421E-01 .265526 .821479E-01 .25908 .08001
+aline .16256 .08001
+aline .161925 .07874
+aline .13843 -.01524
+aline .13716 -.01778
+aline .13589 -.01905
+aline .13335 -.02032
+aline .12954 -.02032
+aline .127 -.01905
+aline .12573 -.01778
+aline .125095 -.01651
+aline .12446 -.014605
+aline .12446 -.012065
+aline .125095 -.00889
+aline .146685 .07747
+aline .147108 .07874
+aline .146685 .08001
+aline .05461 .08001
+aline .05207 .08128
+aline .050165 .083185
+aline .04953 .084455
+aline .04953 .089535
+aline .050165 .090805
+aline .05207 .09271
+aline .05461 .09398
+aline .150495 .09398
+aline .15113 .09525
+aline .174625 .18923
+aline .175895 .19177
+aline .177165 .19304
+aline .178435 .193675
+aline .179705 .19431
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="," !-------------- Beginning of new char.
+dfont wid=.306665 hei=.105556 dep=.194445 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .06604 .03556
+bezier .819943E-01 .310963E-01 .788217E-01 .121009E-01 .076835 0
+bezier .702118E-01 -.279263E-01 .529742E-01 -.521421E-01 .03048 -.069215
+aline .02794 -.069215
+aline .026035 -.06731
+aline .026035 -.0635
+bezier .476756E-01 -.465441E-01 .650267E-01 -.220659E-01 .06985 .00508
+bezier .609019E-01 -.627421E-02 .365821E-01 -.302082E-03 .04064 .01524
+bezier .404381E-01 .027849 .539812E-01 .037416 .06604 .03556
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="-" !-------------- Beginning of new char.
+dfont wid=.357776 hei=.430555 dep=0 italic=.028264
+set path ! start of curve
+newpath
+! start of curve
+amove .11684 .08382
+aline .118745 .081915
+aline .118745 .07874
+aline .116205 .06858
+aline .11557 .066675
+aline .1143 .065405
+aline .112395 .06477
+aline .033655 .06477
+aline .032385 .065405
+aline .031115 .066675
+aline .03048 .067945
+aline .03048 .069215
+aline .033655 .081915
+aline .03556 .08382
+aline .11684 .08382
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="." !-------------- Beginning of new char.
+dfont wid=.306665 hei=.105556 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .065405 .03556
+bezier .825156E-01 .328834E-01 .798586E-01 .885797E-02 .066675 .00254
+bezier .581863E-01 -.335653E-02 .435402E-01 -.152151E-02 .04064 .009525
+bezier .381215E-01 .220203E-01 .476245E-01 .335643E-01 .05969 .03556
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="/" !-------------- Beginning of new char.
+dfont wid=.511108 hei=.75 dep=.25 italic=.161944
+set path ! start of curve
+newpath
+! start of curve
+amove .211455 .262255
+bezier .222725 .257035 .211528 .245681 .20828 .23876
+bezier .144679 .130401 .828022E-01 .020798 .018415 -.086995
+aline .015875 -.088265
+bezier .666263E-02 -.900125E-01 .487156E-02 -.780884E-01 .010795 -.073025
+bezier .755752E-01 .383043E-01 .139503 .150248 .205105 .260985
+aline .207645 .262255
+aline .211455 .262255
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="0" !-------------- Beginning of new char.
+dfont wid=.511108 hei=.644444 dep=0 italic=.135556
+set path ! start of curve
+newpath
+! start of curve
+amove .15367 .233045
+bezier .177288 .231777 .193885 .208549 .19431 .186055
+bezier .19631 .143583 .184078 .998498E-01 .168275 .059055
+bezier .153665 .243847E-01 .12362 -.111623E-01 .08255 -.008255
+bezier .567266E-01 -.687455E-02 .398683E-01 .201334E-01 .04191 .04445
+bezier .406586E-01 .848931E-01 .533759E-01 .12736 .06858 .16637
+bezier .833611E-01 .200485 .113022 .235862 .15367 .233045
+closepath
+! end of curve
+
+! start of curve
+amove .141605 .225425
+bezier .104906 .217498 .953369E-01 .176066 .08636 .14478
+aline .084455 .13716
+aline .08382 .135255
+aline .074295 .097155
+bezier .069302 .068882 .05751 .421846E-01 .066675 .014605
+bezier .07397 -.513813E-02 .100198 -.481698E-02 .113665 .008255
+bezier .139911 .295594E-01 .144747 .657871E-01 .154305 .09652
+aline .16383 .13462
+bezier .168363 .162044 .181555 .189175 .16764 .215265
+aline .165735 .21717
+aline .1651 .21844
+aline .164465 .219075
+aline .163195 .21971
+aline .16129 .221615
+aline .15621 .224155
+aline .154305 .22479
+aline .15113 .225425
+aline .150495 .22606
+aline .14224 .22606
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="1" !-------------- Beginning of new char.
+dfont wid=.511108 hei=.644444 dep=0 italic=.135556
+set path ! start of curve
+newpath
+! start of curve
+amove .159385 .233045
+aline .160655 .23241
+aline .16129 .231775
+aline .161925 .230505
+aline .161925 .2286
+aline .121285 .06604
+aline .109855 .02032
+bezier .105861 .109359E-01 .118344 .940015E-02 .125095 .01016
+aline .12573 .009525
+aline .144145 .009525
+aline .14605 .00762
+aline .14605 .003175
+aline .145415 .00127
+aline .14351 -.000635
+aline .132715 -.000635
+aline .13208 0
+aline .100965 0
+aline .10033 .000635
+aline .085725 .000635
+aline .08509 0
+aline .05334 0
+aline .052705 -.000635
+aline .043815 -.000635
+aline .04191 .00127
+aline .04191 .00508
+aline .042545 .006985
+aline .04318 .008255
+bezier .562676E-01 .122999E-01 .728387E-01 .569997E-02 .08382 .015875
+aline .084455 .017145
+aline .08509 .01778
+aline .085725 .019685
+aline .08636 .020955
+aline .127 .183515
+aline .128667 .190183
+aline .12827 .19177
+bezier .116131 .183293 .995571E-01 .174667 .08509 .17907
+aline .084455 .18034
+aline .084455 .182245
+aline .08509 .184785
+aline .085725 .186055
+aline .086995 .187325
+bezier .116497 .188146 .139874 .210322 .15621 .233045
+closepath
+! end of curve
+
+! start of curve
+amove .12827 .19177
+aline .128905 .191135
+aline .12954 .19177
+aline .128905 .192405
+aline .12827 .19177
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="2" !-------------- Beginning of new char.
+dfont wid=.511108 hei=.644444 dep=0 italic=.135556
+set path ! start of curve
+newpath
+! start of curve
+amove .14478 .233045
+bezier .171197 .231295 .192641 .206987 .193675 .180975
+bezier .19607 .155388 .18542 .12932 .164465 .113665
+bezier .130196 .817554E-01 .078205 .070235 .05461 .02667
+aline .05334 .0254
+bezier .081362 .285643E-01 .109064 .116934E-01 .136525 .01651
+bezier .155574 .223722E-01 .165546 .04148 .17145 .059055
+aline .17272 .05969
+aline .178435 .05969
+aline .179705 .059055
+aline .18034 .05842
+bezier .176952 .320298E-01 .161381 .304386E-02 .135255 -.006985
+bezier .111785 -.143652E-01 .932576E-01 .526935E-02 .074295 .01524
+bezier .648418E-01 .019755 .521479E-01 .020395 .04699 .009525
+aline .046355 .008255
+aline .04572 .00762
+aline .043815 .00381
+aline .04318 .001905
+aline .042545 .000635
+aline .040005 -.006985
+aline .03937 -.00762
+aline .0381 -.008255
+aline .03175 -.008255
+aline .03048 -.006985
+bezier .353193E-01 .281947E-01 .616398E-01 .578469E-01 .09017 .07747
+bezier .126721 .963603E-01 .163431 .126991 .16764 .170815
+bezier .17367 .190855 .166848 .222083 .14224 .22606
+bezier .106991 .227197 .849894E-01 .192394 .074295 .16256
+bezier .713361E-01 .150099 .621895E-01 .134137 .07366 .12446
+bezier .964809E-01 .124932 .105794 .151019 .111125 .169545
+aline .111125 .175895
+aline .11049 .17653
+aline .109855 .17907
+aline .108585 .18288
+aline .107315 .18542
+aline .10668 .187325
+aline .10668 .188595
+aline .107315 .189865
+aline .10795 .1905
+aline .10922 .191135
+aline .112395 .191135
+bezier .126041 .170411 .112336 .143454 .09779 .127
+bezier .882125E-01 .116345 .651803E-01 .111681 .05969 .128905
+bezier .550404E-01 .156008 .704614E-01 .183838 .08636 .205105
+bezier .100949 .222157 .121663 .235579 .14478 .233045
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="3" !-------------- Beginning of new char.
+dfont wid=.511108 hei=.644444 dep=0 italic=.135556
+set path ! start of curve
+newpath
+! start of curve
+amove .15367 .233045
+bezier .180128 .232148 .203157 .205611 .19685 .17907
+bezier .193657 .148489 .168285 .124608 .140335 .114935
+bezier .176829 .100183 .17525 .484537E-01 .14986 .02413
+bezier .126607 -.236631E-02 .836743E-01 -.194284E-01 .051435 0
+bezier .335257E-01 .121919E-01 .295308E-01 .369748E-01 .037465 .05588
+bezier .432812E-01 .643266E-01 .586925E-01 .673366E-01 .0635 .056515
+bezier .066167 .451216E-01 .562594E-01 .335317E-01 .04445 .03556
+bezier .422957E-01 .184975E-01 .575345E-01 .455619E-03 .07493 -.00127
+bezier .106696 -.345073E-02 .133002 .238276E-01 .139065 .053975
+bezier .143994 .717892E-01 .14932 .932488E-01 .13335 .107315
+aline .12827 .109855
+aline .126365 .11049
+aline .123825 .111125
+aline .12319 .11176
+aline .099695 .11176
+aline .09779 .113665
+aline .09779 .11684
+aline .098425 .11938
+aline .09906 .12065
+aline .10033 .12192
+bezier .124166 .119274 .150868 .12559 .163195 .147955
+bezier .174414 .168103 .184033 .194106 .170815 .215265
+bezier .15001 .237264 .115745 .221498 .09779 .2032
+bezier .869564E-01 .18976 .738384E-01 .169845 .08382 .153035
+bezier .101001 .144957 .119928 .171096 .107315 .18542
+aline .10668 .187325
+aline .10668 .188595
+aline .107315 .189865
+aline .10795 .1905
+aline .10922 .191135
+aline .112395 .191135
+bezier .130426 .171284 .106865 .136341 .08128 .145415
+bezier .062439 .156614 .708866E-01 .183748 .08128 .19812
+bezier .977632E-01 .220677 .125772 .235201 .15367 .233045
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="4" !-------------- Beginning of new char.
+dfont wid=.511108 hei=.644444 dep=.194445 italic=.135556
+set path ! start of curve
+newpath
+! start of curve
+amove .15875 .233045
+bezier .171937 .229491 .163047 .213438 .16129 .20447
+bezier .140882 .135025 .10386 .071409 .0508 .02286
+bezier .673808E-01 .224241E-01 .847848E-01 .213062E-01 .10033 .013335
+aline .10414 .012065
+aline .10541 .01143
+aline .107315 .010795
+aline .10795 .01016
+aline .108585 .010795
+aline .12446 .074295
+bezier .126491 .853191E-01 .146291 .879628E-01 .146685 .07493
+aline .14605 .074295
+aline .14605 .07112
+aline .129778 .60325E-02
+aline .130175 .004445
+bezier .141786 .305583E-02 .151989 .765866E-02 .163195 .009525
+aline .16637 .00635
+aline .167005 .00508
+aline .167005 .00254
+bezier .155426 -.502292E-02 .140211 -.63051E-02 .126909 -.544287E-02
+aline .11303 -.06096
+bezier .10973 -.072635 .881662E-01 -.718827E-01 .09144 -.057785
+aline .10541 -.001905
+aline .105886 -.9525E-03
+bezier .836497E-01 .010548 .548524E-01 .181336E-01 .03175 .006985
+bezier .273119E-01 .357401E-02 .199806E-01 -.531067E-02 .015875 .003175
+bezier .145355E-01 .139439E-01 .294435E-01 .157301E-01 .034925 .02286
+bezier .952086E-01 .751528E-01 .125365 .152332 .14605 .227965
+aline .147955 .22987
+aline .149225 .230505
+aline .150495 .231775
+aline .1524 .23241
+aline .154305 .233045
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="5" !-------------- Beginning of new char.
+dfont wid=.511108 hei=.644444 dep=0 italic=.135556
+set path ! start of curve
+newpath
+! start of curve
+amove .10414 .233045
+bezier .132294 .216113 .165956 .219595 .194945 .233045
+aline .197485 .233045
+aline .19939 .23114
+bezier .196591 .220834 .184466 .215363 .17653 .208915
+bezier .15459 .19563 .126667 .190678 .10287 .20066
+aline .085725 .13208
+aline .852488E-01 .131128
+bezier .930121E-01 .135131 .104315 .143997 .11557 .145415
+bezier .140858 .152917 .16933 .135793 .173355 .10922
+bezier .184943 .526385E-01 .135917 -.011094 .076835 -.008255
+bezier .523809E-01 -.669783E-02 .345263E-01 .195427E-01 .0381 .042545
+bezier .364374E-01 .559962E-01 .433823E-01 .073801 .05969 .07239
+bezier .772626E-01 .701326E-01 .710553E-01 .044429 .056515 .042545
+aline .053975 .04191
+aline .050165 .04191
+aline .492125E-01 .423862E-01
+bezier .448446E-01 .246546E-01 .595799E-01 .223681E-02 .07874 .000635
+bezier .113081 -.720662E-03 .135035 .338087E-01 .14224 .064135
+bezier .147571 .881636E-01 .159061 .116236 .1397 .136525
+bezier .119289 .145525 .954687E-01 .131692 .08128 .116205
+aline .080645 .114935
+aline .07747 .11176
+aline .073025 .11176
+aline .07112 .113665
+aline .07112 .117475
+aline .099695 .231775
+aline .100965 .23241
+aline .1016 .233045
+aline .10414 .233045
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="6" !-------------- Beginning of new char.
+dfont wid=.511108 hei=.644444 dep=0 italic=.135556
+set path ! start of curve
+newpath
+! start of curve
+amove .17145 .233045
+bezier .186869 .232886 .203028 .218504 .198755 .202565
+bezier .202 .187225 .179186 .174715 .17018 .188595
+bezier .16594 .200409 .177696 .21198 .188595 .21082
+bezier .182473 .227369 .161549 .227074 .147955 .22098
+bezier .109207 .202794 .910286E-01 .158979 .08255 .11938
+bezier .968739E-01 .14504 .132637 .158357 .15748 .1397
+bezier .190648 .110924 .178954 .586972E-01 .15494 .02794
+bezier .134541 .307714E-02 .997184E-01 -.189649E-01 .06731 -.003175
+bezier .382478E-01 .145628E-01 .405424E-01 .544236E-01 .045085 .08255
+bezier .524114E-01 .145047 .877103E-01 .213175 .151765 .231775
+aline .15494 .23241
+aline .15875 .23241
+aline .159385 .233045
+aline .17145 .233045
+closepath
+! end of curve
+
+! start of curve
+amove .12065 .140335
+bezier .823828E-01 .129042 .721796E-01 .827598E-01 .06604 .04953
+bezier .637972E-01 .334429E-01 .635503E-01 .116264E-01 .080645 .00254
+bezier .106194 -.599973E-02 .128787 .189554E-01 .13716 .041275
+bezier .14431 .662942E-01 .154512 .921881E-01 .1524 .117475
+bezier .150593 .127674 .145209 .138282 .13462 .14097
+aline .121285 .14097
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="7" !-------------- Beginning of new char.
+dfont wid=.511108 hei=.644444 dep=.194445 italic=.135556
+set path ! start of curve
+newpath
+! start of curve
+amove .097155 .233045
+aline .098425 .231775
+aline .09906 .22987
+aline .098425 .22733
+aline .09398 .21844
+aline .093345 .216535
+aline .915987E-01 .213042
+bezier .958406E-01 .214116 .101884 .221293 .107315 .224155
+bezier .119961 .230738 .137341 .238305 .14986 .2286
+bezier .158226 .217524 .149831 .200056 .161925 .19177
+bezier .186161 .191869 .197798 .217435 .211455 .233045
+aline .217805 .233045
+bezier .223177 .227121 .212998 .220923 .21082 .215265
+bezier .168261 .15024 .141641 .753249E-01 .12192 0
+bezier .116166 -.955468E-02 .985418E-01 -.012475 .094615 0
+bezier .103002 .517294E-01 .128585 .994843E-01 .15367 .14478
+bezier .161765 .159228 .171819 .173267 .179282 .187537
+bezier .168745 .183173 .153648 .182925 .147955 .194945
+bezier .144796 .203014 .137943 .212983 .12827 .208915
+bezier .953927E-01 .204234 .746423E-01 .174166 .05969 .14732
+aline .052705 .14732
+aline .051435 .14859
+bezier .558384E-01 .166899 .673757E-01 .183526 .074295 .201295
+aline .078105 .208915
+aline .07874 .21082
+aline .083185 .21971
+aline .08382 .221615
+aline .0889 .231775
+aline .089535 .23241
+aline .090805 .233045
+aline .097155 .233045
+closepath
+! end of curve
+
+! start of curve
+amove .09144 .211455
+aline .092075 .21209
+aline .09144 .212725
+aline .090805 .21209
+aline .09144 .211455
+closepath
+! end of curve
+
+! start of curve
+amove .17907 .18796
+aline .179705 .187325
+aline .18034 .18796
+aline .179705 .188595
+aline .17907 .18796
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="8" !-------------- Beginning of new char.
+dfont wid=.511108 hei=.644444 dep=0 italic=.135556
+set path ! start of curve
+newpath
+! start of curve
+amove .15367 .233045
+bezier .176623 .232254 .199698 .210402 .19431 .18669
+bezier .191831 .156629 .163887 .13844 .1397 .12573
+bezier .15383 .113118 .172891 .100861 .17272 .079375
+bezier .18051 .197322E-01 .100112 -.336913E-01 .050165 .004445
+bezier .216326E-01 .287269E-01 .357086E-01 .733315E-01 .06223 .093345
+bezier .731448E-01 .104077 .08684 .110951 .10033 .11811
+bezier .884636E-01 .127619 .754612E-01 .138356 .074295 .15494
+bezier .698291E-01 .197719 .111816 .236457 .15367 .233045
+closepath
+! end of curve
+
+! start of curve
+amove .14097 .224155
+bezier .113745 .222173 .823494E-01 .192791 .095885 .1651
+bezier .106217 .151927 .12037 .141841 .13335 .131657
+bezier .158569 .143988 .184746 .170906 .17907 .20066
+bezier .175871 .217812 .156707 .22783 .14097 .224155
+closepath
+! end of curve
+
+! start of curve
+amove .106045 .11176
+bezier .758388E-01 .968889E-01 .481652E-01 .647712E-01 .05207 .029845
+bezier .562127E-01 .107714E-01 .076549 -.289343E-02 .09525 .00127
+bezier .127832 .359837E-02 .162754 .038618 .14986 .071755
+bezier .139761 .889052E-01 .121292 .989459E-01 .106997 .112236
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="9" !-------------- Beginning of new char.
+dfont wid=.511108 hei=.644444 dep=0 italic=.135556
+set path ! start of curve
+newpath
+! start of curve
+amove .154305 .233045
+bezier .180999 .230883 .19525 .201805 .193675 .1778
+bezier .194788 .109559 .165825 .275567E-01 .09906 -.00381
+bezier .795004E-01 -.107334E-01 .520383E-01 -.119932E-01 .03937 .00762
+bezier .350756E-01 .019563 .03619 .379889E-01 .0508 .04191
+aline .059055 .04191
+bezier .744734E-01 .368852E-01 .645281E-01 .01232 .050165 .014605
+bezier .479882E-01 .688325E-02 .601375E-01 .330626E-02 .06604 .00127
+bezier .956224E-01 -.40905E-02 .119256 .222003E-01 .132715 .04572
+bezier .142479 .064394 .15038 .847992E-01 .15367 .10541
+bezier .139652 .801031E-01 .105462 .672052E-01 .080645 .08382
+bezier .474841E-01 .109921 .055966 .159189 .076835 .1905
+bezier .950454E-01 .214402 .122495 .23612 .154305 .233045
+closepath
+! end of curve
+
+! start of curve
+amove .14351 .224155
+bezier .115146 .2203 .099696 .190701 .093345 .1651
+bezier .882862E-01 .139317 .731366E-01 .109567 .09398 .08763
+bezier .116177 .749791E-01 .140806 .947832E-01 .15113 .1143
+bezier .165199 .141637 .172579 .172149 .17145 .201295
+bezier .169323 .214292 .157824 .228681 .14351 .224155
+closepath
+! end of curve
+
+! start of curve
+amove .15367 .10541
+aline .154305 .104775
+aline .15494 .10541
+aline .154305 .106045
+aline .15367 .10541
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=":" !-------------- Beginning of new char.
+dfont wid=.306665 hei=.430555 dep=0 italic=.0581951
+set path ! start of curve
+newpath
+! start of curve
+amove .09398 .14986
+bezier .111091 .147183 .108434 .123158 .09525 .11684
+bezier .867613E-01 .110943 .721152E-01 .112778 .069215 .123825
+bezier .666965E-01 .13632 .761995E-01 .147864 .088265 .14986
+closepath
+! end of curve
+
+! start of curve
+amove .065405 .03556
+bezier .825156E-01 .328834E-01 .798586E-01 .885797E-02 .066675 .00254
+bezier .581863E-01 -.335653E-02 .435402E-01 -.152151E-02 .04064 .009525
+bezier .381215E-01 .220203E-01 .476245E-01 .335643E-01 .05969 .03556
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=";" !-------------- Beginning of new char.
+dfont wid=.306665 hei=.430555 dep=.194445 italic=.0581951
+set path ! start of curve
+newpath
+! start of curve
+amove .09398 .14986
+bezier .111091 .147183 .108434 .123158 .09525 .11684
+bezier .867613E-01 .110943 .721152E-01 .112778 .069215 .123825
+bezier .666965E-01 .13632 .761995E-01 .147864 .088265 .14986
+closepath
+! end of curve
+
+! start of curve
+amove .065405 .03556
+bezier .800436E-01 .319287E-01 .763314E-01 .138258E-01 .074295 .003175
+bezier .684264E-01 -.252944E-01 .522572E-01 -.506189E-01 .03048 -.069215
+aline .02794 -.069215
+aline .026035 -.06731
+aline .026035 -.0635
+bezier .04521 -.468575E-01 .611829E-01 -.221064E-01 .657225E-01 .174625E-02
+bezier .553729E-01 -.520549E-02 .369523E-01 .207937E-02 .04064 .01524
+bezier .404284E-01 .275534E-01 .535288E-01 .372499E-01 .065405 .03556
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="<" !-------------- Beginning of new char.
+dfont wid=.306665 hei=.5 dep=.194445 italic=.0755568
+set path ! start of curve
+newpath
+! start of curve
+amove .10033 .174625
+bezier .117852 .171375 .114182 .146736 .10033 .14097
+bezier .886159E-01 .132691 .702631E-01 .143572 .075565 .158115
+bezier .782573E-01 .166371 .854331E-01 .172876 .09398 .174625
+closepath
+! end of curve
+
+! start of curve
+amove .084455 .108585
+bezier .878765E-01 .100495 .820942E-01 .917879E-01 .08255 .083185
+bezier .728107E-01 .334764E-01 .667004E-01 -.159672E-01 .05588 -.06604
+bezier .489239E-01 -.786022E-01 .249137E-01 -.082333 .020955 -.065405
+aline .020955 -.060325
+aline .02159 -.057785
+aline .0254 -.046355
+aline .026035 -.043815
+aline .042545 .005715
+aline .04318 .008255
+aline .059055 .05588
+aline .05969 .05842
+aline .075565 .106045
+aline .0762 .107315
+aline .07747 .108585
+aline .084455 .108585
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="=" !-------------- Beginning of new char.
+dfont wid=.766663 hei=.366875 dep=-.133125 italic=.066164
+set path ! start of curve
+newpath
+! start of curve
+amove .267335 .12827
+aline .268605 .127635
+aline .269875 .127
+aline .271145 .12573
+aline .272415 .12319
+aline .272415 .11938
+aline .271145 .11684
+aline .269875 .11557
+aline .267335 .1143
+aline .062865 .1143
+aline .060325 .11557
+aline .059055 .11684
+aline .05842 .11811
+aline .057785 .120015
+aline .057785 .122555
+aline .05842 .12446
+aline .059055 .12573
+aline .060325 .127
+aline .061595 .127635
+aline .062865 .12827
+closepath
+! end of curve
+
+! start of curve
+amove .25019 .05969
+aline .25146 .059055
+aline .25273 .05842
+aline .254 .05715
+aline .25527 .05461
+aline .25527 .0508
+aline .254 .04826
+aline .25273 .04699
+aline .25019 .04572
+aline .04572 .04572
+aline .04318 .04699
+aline .04191 .04826
+aline .041275 .04953
+aline .04064 .051435
+aline .04064 .053975
+aline .041275 .05588
+aline .04191 .05715
+aline .04318 .05842
+aline .04445 .059055
+aline .04572 .05969
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=">" !-------------- Beginning of new char.
+dfont wid=.511108 hei=.5 dep=.194445 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .13589 .174625
+bezier .153412 .171375 .149742 .146736 .13589 .14097
+bezier .124176 .132691 .105823 .143572 .111125 .158115
+bezier .113817 .166371 .120993 .172876 .12954 .174625
+closepath
+! end of curve
+
+! start of curve
+amove .120015 .108585
+bezier .142117 .10297 .139299 .729644E-01 .12827 .05842
+bezier .105808 .334158E-01 .741912E-01 .178653E-01 .05207 -.00762
+bezier .380854E-01 -.250991E-01 .352453E-01 -.057047 .059055 -.06731
+bezier .896321E-01 -.779208E-01 .117385 -.504306E-01 .13081 -.0254
+aline .135255 -.01651
+aline .13589 -.014605
+aline .137795 -.010795
+aline .139065 -.006985
+aline .139541 -.60325E-02
+aline .139065 -.00508
+bezier .123762 -.719426E-02 .122613 .152168E-01 .13462 .02032
+bezier .142227 .268675E-01 .157781 .210274E-01 .15494 .010795
+bezier .1476 -.276331E-01 .121647 -.06659 .081915 -.0762
+bezier .585367E-01 -.819514E-01 .311263E-01 -.652489E-01 .029845 -.040005
+bezier .264915E-01 -.100793E-01 .046503 .163673E-01 .070485 .03175
+bezier .086334 .458505E-01 .104649 .571441E-01 .11938 .07239
+bezier .124915 .810913E-01 .12949 .958796E-01 .11811 .1016
+bezier .101604 .102411 .909209E-01 .861139E-01 .085725 .073025
+aline .08509 .07239
+aline .07874 .07239
+aline .076835 .074295
+bezier .789666E-01 .915836E-01 .949786E-01 .105625 .11176 .108585
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="?" !-------------- Beginning of new char.
+dfont wid=.511108 hei=.694445 dep=0 italic=.1225
+set path ! start of curve
+newpath
+! start of curve
+amove .15748 .25019
+bezier .176061 .248512 .192526 .232126 .193675 .21336
+bezier .1973 .182041 .175121 .155667 .150495 .1397
+bezier .134671 .124876 .113722 .114879 .1016 .09652
+bezier .974768E-01 .888104E-01 .963038E-01 .775726E-01 .104775 .07239
+bezier .120527 .711837E-01 .132769 .853928E-01 .136525 .099695
+aline .13843 .1016
+aline .14478 .1016
+aline .145415 .100965
+bezier .149248 .947064E-01 .141971 .862836E-01 .13843 .080645
+bezier .127603 .673911E-01 .103374 .572742E-01 .090805 .07366
+bezier .797264E-01 .951044E-01 .939866E-01 .121034 .113665 .13208
+bezier .136185 .153697 .169355 .167154 .18034 .198755
+bezier .187787 .216853 .176581 .241113 .15621 .243205
+bezier .12009 .244726 .938811E-01 .209683 .084455 .178435
+bezier .997583E-01 .180549 .100907 .158138 .0889 .153035
+bezier .081293 .146487 .657391E-01 .152328 .06858 .16256
+bezier .759203E-01 .200988 .101873 .239945 .141605 .249555
+aline .145415 .249555
+aline .14605 .25019
+aline .15748 .25019
+closepath
+! end of curve
+
+! start of curve
+amove .1016 .03556
+bezier .12009 .310546E-01 .113579 .506315E-02 .098425 .000635
+bezier .900539E-01 -.298507E-02 .789283E-01 .297473E-03 .0762 .009525
+bezier .738796E-01 .217246E-01 .830749E-01 .033044 .094615 .03556
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="@" !-------------- Beginning of new char.
+dfont wid=.766663 hei=.694445 dep=0 italic=.0959721
+set path ! start of curve
+newpath
+! start of curve
+amove .2032 .24638
+bezier .243796 .244266 .276656 .205322 .276225 .1651
+bezier .278539 .13117 .268672 .951052E-01 .25273 .064135
+bezier .242903 .440326E-01 .210469 .356172E-01 .19685 .056515
+aline .196215 .057785
+aline .19558 .05969
+aline .194945 .06223
+aline .194945 .066675
+bezier .183241 .580093E-01 .16837 .454887E-01 .151765 .04445
+bezier .124537 .405833E-01 .998474E-01 .064296 .098425 .090805
+bezier .937032E-01 .141601 .134784 .198855 .188595 .197485
+bezier .204593 .195552 .217895 .183204 .222885 .168275
+aline .236855 .168275
+aline .23876 .16764
+aline .24003 .16637
+aline .24003 .16256
+aline .216535 .06858
+bezier .213691 .625361E-01 .214964 .482315E-01 .22479 .05207
+bezier .246124 .584185E-01 .250803 .841871E-01 .257175 .10287
+bezier .269238 .139741 .273241 .181829 .248285 .21463
+bezier .226273 .242355 .187052 .245254 .156845 .230505
+bezier .961644E-01 .202566 .553043E-01 .130392 .065405 .065405
+bezier .697462E-01 .331606E-01 .961375E-01 .497461E-02 .12827 .00254
+bezier .16409 .150542E-02 .199083 .105507E-01 .23241 .026035
+aline .245745 .026035
+aline .247015 .0254
+bezier .250373 .178375E-01 .238206 .177081E-01 .23368 .014605
+bezier .193498 .210082E-03 .151869 -.96128E-02 .11049 -.00127
+bezier .693487E-01 .101147E-01 .485252E-01 .566052E-01 .053975 .095885
+bezier .583133E-01 .165594 .112185 .233067 .182245 .245745
+aline .187325 .245745
+aline .18796 .24638
+aline .2032 .24638
+closepath
+! end of curve
+
+! start of curve
+amove .17907 .189865
+bezier .14252 .180076 .125886 .138972 .11938 .10541
+bezier .11755 .867977E-01 .119916 .616786E-01 .1397 .052705
+bezier .164622 .473072E-01 .187428 .692738E-01 .19939 .089535
+aline .215265 .153035
+bezier .216168 .171314 .20025 .193171 .179705 .1905
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="A" !-------------- Beginning of new char.
+dfont wid=.743329 hei=.683332 dep=0 italic=0
+dfont fby="C" kadd=-.0255556
+dfont fby="G" kadd=-.0255556
+dfont fby="O" kadd=-.0255556
+dfont fby="Q" kadd=-.0255556
+dfont fby="T" kadd=-.0766659
+dfont fby="U" kadd=-.0255556
+dfont fby="V" kadd=-.102221
+dfont fby="W" kadd=-.102221
+dfont fby="Y" kadd=-.0766659
+dfont fby="a" kadd=-.0511112
+dfont fby="b" kadd=-.0255556
+dfont fby="c" kadd=-.0511112
+dfont fby="d" kadd=-.0511112
+dfont fby="e" kadd=-.0511112
+dfont fby="g" kadd=-.0511112
+dfont fby="h" kadd=-.0255556
+dfont fby="i" kadd=-.0255556
+dfont fby="k" kadd=-.0255556
+dfont fby="l" kadd=-.0255556
+dfont fby="m" kadd=-.0255556
+dfont fby="n" kadd=-.0255556
+dfont fby="o" kadd=-.0511112
+dfont fby="q" kadd=-.0511112
+dfont fby="r" kadd=-.0255556
+dfont fby="t" kadd=-.0255556
+dfont fby="u" kadd=-.0255556
+dfont fby="v" kadd=-.0255556
+dfont fby="w" kadd=-.0255556
+set path ! start of curve
+newpath
+! start of curve
+amove .196215 .25019
+aline .197485 .249555
+aline .198755 .248285
+bezier .205046 .170177 .208098 .09202 .2159 .014605
+aline .216535 .013335
+aline .217805 .012065
+aline .219075 .01143
+aline .22225 .010795
+aline .222885 .01016
+aline .22733 .01016
+aline .227965 .009525
+aline .240665 .009525
+aline .24257 .00762
+aline .24257 .003175
+aline .241935 .00127
+aline .24003 -.000635
+bezier .211905 .109395E-02 .183516 -.34204E-03 .155575 0
+aline .15494 .000635
+aline .154305 .001905
+aline .154305 .004445
+aline .15494 .006985
+aline .155575 .008255
+bezier .164981 .112321E-01 .17785 .783549E-02 .184785 .017145
+aline .18542 .01905
+bezier .185627 .038934 .183465 .601044E-01 .18161 .08001
+aline .102235 .08001
+bezier .917621E-01 .608084E-01 .07795 .420358E-01 .07112 .02159
+aline .071755 .020955
+aline .07239 .01778
+aline .073025 .015875
+aline .0762 .0127
+aline .07874 .01143
+aline .080645 .010795
+aline .08382 .01016
+aline .084455 .009525
+aline .089535 .009525
+aline .09144 .00762
+aline .09144 .003175
+aline .090805 .00127
+aline .0889 -.000635
+aline .080645 -.000635
+aline .08001 0
+aline .057785 0
+aline .05715 .000635
+aline .047625 .000635
+aline .04699 0
+aline .028575 0
+aline .02794 -.000635
+aline .02286 -.000635
+aline .020955 .00127
+aline .020955 .00508
+aline .02159 .006985
+aline .022225 .008255
+bezier .358348E-01 .103439E-01 .525996E-01 .141187E-01 .060325 .02794
+bezier .104829 .100552 .14381 .177146 .188595 .249555
+aline .189865 .25019
+closepath
+! end of curve
+
+! start of curve
+amove .172085 .2032
+bezier .151064 .165722 .127777 .127441 .108585 .09017
+aline .180975 .09017
+bezier .178793 .127508 .176928 .166828 .17272 .20447
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="B" !-------------- Beginning of new char.
+dfont wid=.703885 hei=.683332 dep=0 italic=.10257
+set path ! start of curve
+newpath
+! start of curve
+amove .20701 .23876
+bezier .229322 .237482 .254509 .222649 .25781 .19812
+bezier .261674 .158904 .223906 .131417 .18923 .12446
+bezier .215804 .123255 .242849 .988172E-01 .23749 .07112
+bezier .233028 .312224E-01 .193093 .282027E-02 .155575 -.000635
+aline .0254 -.000635
+aline .02413 0
+aline .023495 .000635
+aline .02286 .001905
+aline .02286 .00381
+aline .023495 .00635
+aline .024765 .00889
+bezier .369718E-01 .115426E-01 .557897E-01 .516735E-02 .060325 .020955
+aline .100965 .183515
+aline .10922 .216535
+aline .109855 .21971
+aline .11049 .220345
+aline .11049 .224155
+aline .109855 .22479
+aline .10922 .22606
+aline .107315 .226695
+aline .10414 .22733
+aline .103505 .227965
+aline .098425 .227965
+aline .09779 .2286
+aline .08255 .2286
+aline .08128 .229235
+aline .08001 .231775
+aline .08001 .23241
+aline .080645 .23495
+aline .08128 .236855
+aline .083185 .23876
+aline .20701 .23876
+closepath
+! end of curve
+
+! start of curve
+amove .145415 .227965
+aline .14224 .22733
+aline .1397 .22606
+aline .137795 .22225
+aline .136525 .21844
+aline .1143 .12954
+aline .113824 .128587
+aline .1143 .127635
+aline .17018 .127635
+bezier .208 .133604 .241992 .179554 .221615 .2159
+aline .220345 .21717
+aline .21971 .21844
+aline .2159 .22225
+aline .21463 .222885
+aline .213995 .22352
+aline .207645 .226695
+aline .205105 .22733
+aline .20193 .227965
+aline .201295 .2286
+aline .14605 .2286
+closepath
+! end of curve
+
+! start of curve
+amove .11176 .11938
+aline .111125 .11684
+aline .08636 .01778
+aline .085725 .017145
+aline .085725 .01143
+aline .08636 .010795
+aline .0889 .01016
+aline .089535 .009525
+aline .14732 .009525
+bezier .189923 .152451E-01 .222674 .691236E-01 .19939 .10795
+aline .19304 .1143
+aline .19177 .114935
+aline .191135 .11557
+aline .186055 .11811
+aline .18415 .118745
+aline .18161 .11938
+aline .180975 .120015
+aline .17653 .120015
+aline .175895 .12065
+aline .112395 .12065
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="C" !-------------- Beginning of new char.
+dfont wid=.715551 hei=.683332 dep=0 italic=.145277
+set path ! start of curve
+newpath
+! start of curve
+amove .207645 .24638
+bezier .226438 .244908 .244313 .233133 .253365 .216535
+bezier .26176 .226688 .270429 .236643 .2794 .24638
+aline .28321 .24638
+aline .283845 .245745
+aline .285115 .24511
+aline .285115 .2413
+aline .262255 .14986
+aline .26162 .147955
+aline .260985 .14732
+aline .259715 .146685
+aline .253365 .146685
+aline .252095 .147955
+bezier .255306 .175171 .254571 .211015 .2286 .229235
+bezier .194536 .247755 .152986 .225292 .12954 .198755
+bezier .101112 .167974 .890072E-01 .123471 .083185 .08382
+bezier .799313E-01 .529248E-01 .090939 .152708E-01 .123825 .00508
+bezier .167307 -.853821E-02 .21224 .270401E-01 .2286 .066675
+aline .22987 .069215
+aline .230505 .07112
+aline .23114 .07239
+aline .234315 .081915
+aline .23495 .084455
+aline .235585 .085725
+aline .236855 .086995
+aline .243205 .086995
+aline .244475 .08636
+bezier .244884 .068441 .232887 .511792E-01 .222885 .03683
+bezier .193635 -.249726E-02 .135403 -.240119E-01 .092075 .00508
+bezier .574088E-01 .262521E-01 .482483E-01 .716726E-01 .05461 .10795
+bezier .661743E-01 .174892 .120058 .234644 .187325 .245745
+aline .192405 .245745
+aline .19304 .24638
+aline .207645 .24638
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="D" !-------------- Beginning of new char.
+dfont wid=.754995 hei=.683332 dep=0 italic=.0940275
+dfont fby="A" kadd=-.0255556
+dfont fby="V" kadd=-.0255556
+dfont fby="W" kadd=-.0255556
+dfont fby="X" kadd=-.0255556
+dfont fby="Y" kadd=-.0255556
+set path ! start of curve
+newpath
+! start of curve
+amove .206375 .23876
+bezier .24515 .23657 .272576 .19723 .27178 .160655
+bezier .276021 .899081E-01 .224764 .138373E-01 .1524 0
+aline .14732 0
+aline .146685 -.000635
+aline .024765 -.000635
+aline .023495 0
+aline .02286 .000635
+aline .022225 .001905
+aline .022225 .00381
+aline .02286 .00635
+aline .02413 .00889
+bezier .363368E-01 .115426E-01 .551547E-01 .516735E-02 .05969 .020955
+aline .10033 .183515
+aline .108585 .216535
+aline .10922 .21971
+aline .109855 .220345
+aline .109855 .224155
+aline .10922 .22479
+aline .108585 .22606
+aline .10668 .226695
+aline .103505 .22733
+aline .10287 .227965
+aline .09779 .227965
+aline .097155 .2286
+aline .081915 .2286
+aline .080645 .229235
+aline .079375 .231775
+aline .079375 .23241
+aline .08001 .23495
+aline .080645 .236855
+aline .08255 .23876
+aline .206375 .23876
+closepath
+! end of curve
+
+! start of curve
+amove .145415 .227965
+aline .14224 .22733
+aline .1397 .22606
+aline .137795 .22225
+aline .136525 .21844
+aline .095885 .05588
+aline .08636 .01778
+aline .085725 .017145
+aline .085725 .01143
+aline .08636 .010795
+aline .0889 .01016
+aline .089535 .009525
+aline .140335 .009525
+bezier .181566 .142543E-01 .214837 .484462E-01 .22733 .08763
+bezier .238308 .126483 .254827 .168329 .23368 .20574
+bezier .225355 .21905 .209622 .22642 .194945 .2286
+aline .14605 .2286
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="E" !-------------- Beginning of new char.
+dfont wid=.678329 hei=.683332 dep=0 italic=.120277
+set path ! start of curve
+newpath
+! start of curve
+amove .258445 .23749
+aline .259715 .236855
+bezier .261482 .224371 .256654 .211186 .25654 .19812
+bezier .254119 .185879 .253431 .173388 .25146 .160655
+aline .249555 .15875
+aline .24384 .15875
+aline .24257 .159385
+aline .241935 .16002
+bezier .24122 .178948 .250888 .204101 .23368 .21971
+aline .22733 .222885
+aline .22352 .224155
+aline .22098 .22479
+aline .217805 .225425
+aline .21717 .22606
+aline .21336 .22606
+aline .212725 .226695
+aline .206375 .226695
+aline .20574 .22733
+aline .14605 .22733
+aline .145415 .226695
+aline .14224 .22606
+aline .14097 .225425
+aline .1397 .224155
+aline .137795 .220345
+aline .13716 .21844
+aline .114935 .12954
+aline .1143 .128905
+aline .114935 .12827
+aline .15113 .12827
+bezier .163403 .12907 .177278 .135088 .180975 .14859
+aline .18415 .158115
+aline .186055 .165735
+aline .18669 .16764
+aline .188595 .169545
+aline .19431 .169545
+aline .19558 .16891
+aline .196215 .168275
+aline .19685 .167005
+aline .19685 .1651
+aline .17526 .07874
+aline .173355 .076835
+aline .167005 .076835
+aline .1651 .07874
+bezier .165356 .905341E-01 .173873 .10341 .1651 .113665
+aline .16129 .11557
+aline .159385 .116205
+aline .15621 .11684
+aline .155575 .117475
+aline .15113 .117475
+aline .150495 .11811
+aline .112395 .11811
+aline .11176 .11684
+aline .086995 .01778
+aline .08636 .017145
+aline .08636 .01143
+aline .086995 .010795
+aline .089535 .01016
+aline .09017 .009525
+aline .14859 .009525
+bezier .173167 .101396E-01 .20073 .215437E-01 .21209 .04572
+bezier .220888 .594029E-01 .224935 .764558E-01 .23368 .089535
+aline .239395 .089535
+bezier .244515 .829159E-01 .235602 .745406E-01 .234315 .06731
+bezier .224225 .449306E-01 .216807 .204574E-01 .205105 -.000635
+aline .02413 -.000635
+aline .02286 0
+aline .022225 .000635
+aline .02159 .001905
+aline .02159 .00381
+aline .022225 .00635
+aline .023495 .00889
+bezier .357018E-01 .115426E-01 .545197E-01 .516735E-02 .059055 .020955
+aline .099695 .183515
+aline .10795 .216535
+aline .108585 .21717
+aline .108585 .224155
+aline .106045 .225425
+aline .10287 .22606
+aline .102235 .226695
+aline .09652 .226695
+aline .095885 .22733
+aline .080645 .22733
+aline .07874 .229235
+aline .07874 .23241
+aline .079375 .23495
+aline .08001 .23622
+aline .080645 .236855
+aline .081915 .23749
+aline .258445 .23749
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="F" !-------------- Beginning of new char.
+dfont wid=.652774 hei=.683332 dep=0 italic=.133055
+dfont fby="A" kadd=-.102221
+dfont fby="C" kadd=-.0255556
+dfont fby="G" kadd=-.0255556
+dfont fby="O" kadd=-.0255556
+dfont fby="Q" kadd=-.0255556
+dfont fby="a" kadd=-.0766659
+dfont fby="e" kadd=-.0766659
+dfont fby="o" kadd=-.0766659
+dfont fby="r" kadd=-.0766659
+dfont fby="u" kadd=-.0766659
+set path ! start of curve
+newpath
+! start of curve
+amove .254 .23749
+aline .25527 .236855
+bezier .257037 .224371 .252209 .211186 .252095 .19812
+bezier .249674 .185879 .248986 .173388 .247015 .160655
+aline .24511 .15875
+aline .239395 .15875
+aline .238125 .159385
+aline .23749 .16002
+bezier .236687 .17869 .246214 .203036 .230505 .219075
+bezier .222114 .224883 .211766 .226135 .202565 .22733
+aline .14605 .22733
+aline .145415 .226695
+aline .14224 .22606
+aline .14097 .225425
+aline .1397 .224155
+aline .137795 .220345
+aline .13716 .21844
+aline .113903 .125412
+aline .1143 .123825
+aline .14859 .123825
+bezier .161281 .124559 .175293 .131414 .178435 .145415
+aline .18034 .15113
+aline .180975 .15367
+aline .18161 .155575
+aline .183515 .163195
+aline .18542 .1651
+aline .19177 .1651
+aline .193675 .163195
+aline .193675 .16002
+aline .17272 .0762
+aline .172085 .074295
+aline .17018 .07239
+aline .164465 .07239
+bezier .158574 .769942E-01 .165603 .862997E-01 .165735 .092075
+bezier .167493 .101151 .164803 .112106 .15367 .112395
+aline .153035 .11303
+aline .14859 .11303
+aline .147955 .113665
+aline .111125 .113665
+aline .11049 .11176
+aline .088265 .02286
+aline .08763 .019685
+bezier .840536E-01 .103992E-01 .970086E-01 .976037E-02 .103505 .01016
+aline .10414 .009525
+aline .12319 .009525
+aline .125095 .00762
+aline .125095 .004445
+aline .12446 .001905
+aline .123825 .000635
+aline .12319 0
+aline .12192 -.000635
+aline .111125 -.000635
+aline .11049 0
+aline .076835 0
+aline .0762 .000635
+aline .061595 .000635
+aline .06096 0
+aline .032385 0
+aline .03175 -.000635
+aline .02413 -.000635
+aline .02286 0
+aline .022225 .000635
+aline .02159 .001905
+aline .02159 .00381
+aline .022225 .00635
+aline .023495 .00889
+bezier .357018E-01 .115426E-01 .545197E-01 .516735E-02 .059055 .020955
+aline .099695 .183515
+aline .10795 .216535
+aline .108585 .21717
+aline .108585 .224155
+aline .106045 .225425
+aline .10287 .22606
+aline .102235 .226695
+aline .09652 .226695
+aline .095885 .22733
+aline .080645 .22733
+aline .07874 .229235
+aline .07874 .23241
+aline .079375 .23495
+aline .08001 .23622
+aline .080645 .236855
+aline .081915 .23749
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="G" !-------------- Beginning of new char.
+dfont wid=.773607 hei=.683332 dep=0 italic=.0872221
+set path ! start of curve
+newpath
+! start of curve
+amove .207645 .24638
+bezier .22624 .244828 .243853 .23306 .25273 .216535
+bezier .261125 .226688 .269794 .236643 .278765 .24638
+aline .282575 .24638
+aline .28321 .245745
+aline .28448 .24511
+aline .28448 .2413
+aline .26162 .14986
+aline .260985 .147955
+aline .26035 .14732
+aline .25908 .146685
+aline .25273 .146685
+aline .25146 .147955
+bezier .254601 .174894 .254119 .209675 .229235 .2286
+bezier .192931 .249147 .148706 .223299 .125095 .193675
+bezier .997189E-01 .16311 .088487 .120909 .083185 .083185
+bezier .802858E-01 .053365 .905491E-01 .178179E-01 .121285 .00635
+bezier .151803 -.584105E-02 .194387 .822889E-02 .20574 .041275
+aline .21336 .071755
+aline .213995 .07493
+bezier .217096 .835883E-01 .204788 .840295E-01 .198755 .08382
+aline .19812 .084455
+aline .179705 .084455
+aline .178435 .08509
+aline .177165 .08763
+aline .177165 .0889
+aline .1778 .09144
+aline .178435 .09271
+aline .18034 .094615
+aline .191135 .094615
+aline .19177 .09398
+aline .22479 .09398
+aline .225425 .093345
+aline .238125 .093345
+aline .23876 .09398
+aline .26035 .09398
+aline .260985 .094615
+aline .2667 .094615
+aline .26797 .09398
+aline .26924 .09144
+aline .26924 .090805
+aline .268605 .088265
+aline .26797 .08636
+aline .266065 .084455
+aline .25527 .084455
+aline .254635 .08382
+aline .250825 .08382
+aline .25019 .083185
+aline .248285 .08255
+aline .247015 .081915
+aline .24511 .08001
+aline .24384 .07747
+aline .24257 .07366
+aline .22479 .00254
+aline .224155 .000635
+bezier .217756 -.378639E-02 .214331 .699659E-02 .21082 .010795
+aline .20828 .015875
+aline .20701 .019685
+bezier .195527 .991528E-02 .180606 -.178288E-02 .16383 -.00508
+bezier .122704 -.177405E-01 .724205E-01 .411774E-02 .059055 .04699
+bezier .302584E-01 .137804 .110835 .248542 .207645 .24638
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="H" !-------------- Beginning of new char.
+dfont wid=.743329 hei=.683332 dep=0 italic=.16389
+set path ! start of curve
+newpath
+! start of curve
+amove .09144 .23876
+aline .092075 .238125
+aline .12065 .238125
+aline .121285 .23749
+aline .133985 .23749
+aline .13462 .238125
+aline .163195 .238125
+aline .16383 .23876
+aline .172085 .23876
+aline .17399 .236855
+aline .17399 .233045
+aline .173355 .230505
+aline .17145 .2286
+aline .155575 .2286
+aline .15494 .227965
+aline .149225 .227965
+aline .14859 .22733
+aline .145415 .226695
+aline .141605 .225425
+aline .1397 .22352
+aline .137795 .21971
+aline .136525 .2159
+aline .115173 .130492
+aline .11557 .128905
+aline .21082 .128905
+aline .211455 .130175
+aline .233045 .216535
+aline .23368 .21971
+aline .234315 .220345
+aline .234315 .224155
+aline .23368 .22479
+aline .233045 .22606
+aline .23114 .226695
+aline .227965 .22733
+aline .22733 .227965
+aline .22225 .227965
+aline .221615 .2286
+aline .206375 .2286
+aline .205105 .229235
+aline .203835 .231775
+aline .203835 .23241
+aline .20447 .23495
+aline .205105 .236855
+aline .20701 .23876
+aline .216535 .23876
+aline .21717 .238125
+aline .245745 .238125
+aline .24638 .23749
+aline .25908 .23749
+aline .259715 .238125
+aline .28829 .238125
+aline .288925 .23876
+aline .29718 .23876
+aline .299085 .236855
+aline .299085 .233045
+aline .29845 .230505
+aline .296545 .2286
+aline .28067 .2286
+aline .280035 .227965
+aline .27432 .227965
+aline .273685 .22733
+aline .27051 .226695
+aline .2667 .225425
+aline .264795 .22352
+aline .26289 .21971
+aline .26162 .2159
+aline .22098 .05334
+aline .212725 .02032
+aline .21209 .019685
+aline .21209 .0127
+aline .21463 .01143
+aline .217805 .010795
+aline .21844 .01016
+aline .224155 .01016
+aline .22479 .009525
+aline .24003 .009525
+aline .241935 .00762
+aline .241935 .004445
+aline .2413 .001905
+aline .240665 .000635
+aline .24003 0
+bezier .209986 -.462549E-03 .179459 .120853E-02 .149225 -.000635
+aline .147955 0
+aline .14732 .000635
+aline .146685 .001905
+aline .146685 .00381
+aline .14732 .00635
+aline .14859 .00889
+bezier .160797 .115426E-01 .179615 .516739E-02 .18415 .020955
+aline .20828 .117475
+aline .208915 .11811
+aline .20828 .118745
+aline .112395 .118745
+aline .11176 .11684
+aline .08763 .02032
+aline .086995 .019685
+aline .086995 .0127
+aline .089535 .01143
+aline .09271 .010795
+aline .093345 .01016
+aline .09906 .01016
+aline .099695 .009525
+aline .114935 .009525
+aline .11684 .00762
+aline .11684 .004445
+aline .116205 .001905
+aline .11557 .000635
+aline .114935 0
+bezier .848913E-01 -.462542E-03 .054364 .120853E-02 .02413 -.000635
+aline .02286 0
+aline .022225 .000635
+aline .02159 .001905
+aline .02159 .00381
+aline .022225 .00635
+aline .023495 .00889
+bezier .357018E-01 .115426E-01 .545197E-01 .516735E-02 .059055 .020955
+aline .099695 .183515
+aline .10795 .216535
+aline .108585 .21971
+aline .10922 .220345
+aline .10922 .224155
+aline .108585 .22479
+aline .10795 .22606
+aline .106045 .226695
+aline .10287 .22733
+aline .102235 .227965
+aline .097155 .227965
+aline .09652 .2286
+aline .08128 .2286
+aline .08001 .229235
+aline .07874 .231775
+aline .07874 .23241
+aline .079375 .23495
+aline .08001 .236855
+aline .081915 .23876
+aline .09144 .23876
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="I" !-------------- Beginning of new char.
+dfont wid=.385553 hei=.683332 dep=0 italic=.158055
+set path ! start of curve
+newpath
+! start of curve
+amove .09017 .23876
+aline .090805 .238125
+aline .12065 .238125
+aline .121285 .23749
+aline .13462 .23749
+aline .135255 .238125
+aline .1651 .238125
+aline .165735 .23876
+aline .173355 .23876
+aline .174625 .238125
+aline .17526 .23749
+aline .175895 .23622
+aline .175895 .23368
+aline .17526 .231775
+aline .17399 .229235
+aline .17272 .2286
+aline .156845 .2286
+aline .15621 .227965
+aline .14986 .227965
+aline .149225 .22733
+aline .14605 .226695
+aline .14351 .22606
+aline .14097 .22479
+aline .1397 .22352
+aline .137795 .21971
+aline .136525 .2159
+aline .095885 .05334
+aline .08763 .02032
+aline .086995 .019685
+aline .086995 .013335
+aline .088265 .012065
+aline .09017 .01143
+aline .093345 .010795
+aline .09398 .01016
+aline .099695 .01016
+aline .10033 .009525
+aline .116205 .009525
+aline .117475 .00889
+aline .118745 .00635
+aline .118745 .00508
+aline .11811 .00254
+aline .117475 .00127
+aline .11557 -.000635
+aline .10541 -.000635
+aline .104775 0
+aline .075565 0
+aline .07493 .000635
+aline .061595 .000635
+aline .06096 0
+aline .031115 0
+aline .03048 -.000635
+aline .022225 -.000635
+aline .02032 .00127
+aline .02032 .005715
+aline .020955 .00762
+aline .02286 .009525
+aline .03937 .009525
+aline .040005 .01016
+aline .04572 .01016
+aline .046355 .010795
+aline .04953 .010795
+aline .050165 .01143
+aline .053975 .0127
+aline .056515 .01524
+aline .05842 .01905
+aline .059055 .020955
+aline .099695 .183515
+aline .10795 .216535
+aline .108585 .21971
+bezier .111858 .22808 .10038 .227721 .09525 .2286
+aline .079375 .2286
+aline .07747 .230505
+aline .07747 .234315
+aline .078105 .23622
+aline .07874 .23749
+aline .079375 .238125
+aline .080645 .23876
+aline .09017 .23876
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="J" !-------------- Beginning of new char.
+dfont wid=.524997 hei=.683332 dep=0 italic=.140279
+set path ! start of curve
+newpath
+! start of curve
+amove .136525 .23876
+aline .13716 .238125
+aline .172085 .238125
+aline .17272 .23749
+aline .18542 .23749
+aline .186055 .238125
+aline .208915 .238125
+aline .20955 .23876
+aline .2159 .23876
+aline .217805 .236855
+aline .217805 .233045
+aline .21717 .23114
+aline .216535 .22987
+bezier .207574 .226525 .191802 .231904 .18923 .21844
+aline .14859 .05588
+bezier .141814 .122619E-01 .883214E-01 -.247082E-01 .047625 -.000635
+bezier .028739 .011304 .255898E-01 .488021E-01 .050165 .05588
+bezier .586263E-01 .586666E-01 .715639E-01 .051435 .06858 .041275
+bezier .688495E-01 .287574E-01 .554603E-01 .020342 .442686E-01 .216807E-01
+bezier .475501E-01 -.134549E-02 .791647E-01 -.821095E-02 .094615 .00762
+bezier .106294 .179409E-01 .114299 .314126E-01 .118745 .046355
+aline .159385 .208915
+aline .16129 .216535
+aline .161925 .21717
+aline .161925 .224155
+aline .160655 .225425
+aline .159385 .22606
+aline .156845 .226695
+aline .15621 .22733
+aline .153035 .22733
+aline .1524 .227965
+aline .14478 .227965
+aline .144145 .2286
+aline .12446 .2286
+aline .122555 .230505
+aline .122555 .234315
+aline .12319 .23622
+aline .123825 .23749
+aline .12446 .238125
+aline .12573 .23876
+aline .136525 .23876
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="K" !-------------- Beginning of new char.
+dfont wid=.768885 hei=.683332 dep=0 italic=.145277
+dfont fby="C" kadd=-.0255556
+dfont fby="G" kadd=-.0255556
+dfont fby="O" kadd=-.0255556
+dfont fby="Q" kadd=-.0255556
+set path ! start of curve
+newpath
+! start of curve
+amove .09144 .23876
+aline .092075 .238125
+aline .12065 .238125
+aline .121285 .23749
+aline .133985 .23749
+aline .13462 .238125
+aline .163195 .238125
+aline .16383 .23876
+aline .172085 .23876
+aline .17399 .236855
+aline .17399 .233045
+aline .173355 .230505
+aline .17145 .2286
+aline .155575 .2286
+aline .15494 .227965
+aline .149225 .227965
+aline .14859 .22733
+aline .145415 .226695
+aline .141605 .225425
+aline .1397 .22352
+aline .137795 .21971
+aline .136525 .2159
+aline .108585 .10414
+aline .108109 .103188
+bezier .113153 .104124 .119377 .112119 .125095 .11557
+bezier .163317 .149008 .20441 .179118 .2413 .213995
+bezier .246256 .219376 .24369 .227715 .23622 .2286
+aline .23241 .2286
+aline .23114 .229235
+aline .230505 .22987
+aline .22987 .23114
+aline .22987 .23368
+aline .230505 .235585
+aline .231775 .238125
+bezier .254264 .239197 .277383 .2364 .29972 .23876
+aline .301625 .236855
+aline .301625 .233045
+aline .30099 .230505
+aline .299085 .2286
+bezier .263209 .225997 .238136 .195375 .21082 .17526
+bezier .199858 .164727 .184726 .15534 .175895 .14478
+bezier .192404 .102111 .207142 .587076E-01 .22479 .01651
+aline .2286 .0127
+aline .23114 .01143
+aline .233045 .010795
+aline .23368 .01016
+aline .23749 .01016
+aline .238125 .009525
+aline .247015 .009525
+aline .24892 .00762
+aline .24892 .004445
+aline .248285 .001905
+aline .24765 .000635
+aline .247015 0
+bezier .221319 -.743744E-04 .194993 .844631E-03 .16891 -.000635
+aline .167005 .00127
+aline .167005 .00508
+aline .16764 .00762
+bezier .174322 .119156E-01 .186555 .730689E-02 .1905 .017145
+bezier .193493 .273677E-01 .184433 .378545E-01 .182245 .04826
+bezier .171846 .740069E-01 .163446 .101323 .152083 .126206
+bezier .136049 .112997 .119947 .998831E-01 .10414 .08636
+aline .08763 .02032
+aline .086995 .019685
+aline .086995 .0127
+aline .089535 .01143
+aline .09271 .010795
+aline .093345 .01016
+aline .09906 .01016
+aline .099695 .009525
+aline .114935 .009525
+aline .11684 .00762
+aline .11684 .004445
+aline .116205 .001905
+aline .11557 .000635
+aline .114935 0
+bezier .848913E-01 -.462542E-03 .054364 .120853E-02 .02413 -.000635
+aline .02286 0
+aline .022225 .000635
+aline .02159 .001905
+aline .02159 .00381
+aline .022225 .00635
+aline .023495 .00889
+bezier .357018E-01 .115426E-01 .545197E-01 .516735E-02 .059055 .020955
+aline .099695 .183515
+aline .10795 .216535
+aline .108585 .21971
+aline .10922 .220345
+aline .10922 .224155
+aline .108585 .22479
+aline .10795 .22606
+aline .106045 .226695
+aline .10287 .22733
+aline .102235 .227965
+aline .097155 .227965
+aline .09652 .2286
+aline .08128 .2286
+aline .08001 .229235
+aline .07874 .231775
+aline .07874 .23241
+aline .079375 .23495
+aline .08001 .236855
+aline .081915 .23876
+aline .09144 .23876
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="L" !-------------- Beginning of new char.
+dfont wid=.627218 hei=.683332 dep=0 italic=0
+dfont fby="T" kadd=-.0766659
+dfont fby="V" kadd=-.102221
+dfont fby="W" kadd=-.102221
+dfont fby="Y" kadd=-.0766659
+dfont fby="a" kadd=-.0511112
+dfont fby="c" kadd=-.0511112
+dfont fby="d" kadd=-.0511112
+dfont fby="e" kadd=-.0511112
+dfont fby="g" kadd=-.0511112
+dfont fby="o" kadd=-.0511112
+dfont fby="q" kadd=-.0511112
+set path ! start of curve
+newpath
+! start of curve
+amove .09144 .23876
+aline .092075 .238125
+aline .12065 .238125
+aline .121285 .23749
+aline .135255 .23749
+aline .13589 .238125
+aline .17018 .238125
+aline .170815 .23876
+aline .18034 .23876
+aline .182245 .236855
+aline .182245 .233045
+aline .18161 .230505
+aline .179705 .2286
+bezier .165965 .22773 .151174 .23088 .1397 .222885
+aline .13716 .217805
+aline .136525 .2159
+aline .095885 .05334
+aline .086995 .01778
+aline .08636 .017145
+aline .08636 .01143
+aline .086995 .010795
+aline .089535 .01016
+aline .09017 .009525
+aline .13335 .009525
+bezier .15635 .01171 .18062 .247142E-01 .19177 .046355
+bezier .199867 .059748 .20354 .755238E-01 .21082 .0889
+aline .21209 .089535
+aline .2159 .089535
+aline .21844 .088265
+aline .219075 .086995
+bezier .210653 .576795E-01 .199159 .287651E-01 .188595 0
+aline .187325 -.000635
+aline .02413 -.000635
+aline .02286 0
+aline .022225 .000635
+aline .02159 .001905
+aline .02159 .00381
+aline .022225 .00635
+aline .023495 .00889
+bezier .357018E-01 .115426E-01 .545197E-01 .516735E-02 .059055 .020955
+aline .099695 .183515
+aline .10795 .216535
+aline .108585 .21971
+aline .10922 .220345
+aline .10922 .224155
+aline .108585 .22479
+aline .10795 .22606
+aline .106045 .226695
+aline .10287 .22733
+aline .102235 .227965
+aline .097155 .227965
+aline .09652 .2286
+aline .08128 .2286
+aline .08001 .229235
+aline .07874 .231775
+aline .07874 .23241
+aline .079375 .23495
+aline .08001 .236855
+aline .081915 .23876
+aline .09144 .23876
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="M" !-------------- Beginning of new char.
+dfont wid=.896662 hei=.683332 dep=0 italic=.16389
+set path ! start of curve
+newpath
+! start of curve
+amove .14351 .23876
+aline .14478 .238125
+bezier .14887 .229699 .14686 .219147 .149225 .210185
+bezier .154785 .151552 .1598 .931851E-01 .167005 .034925
+bezier .208438 .102333 .247442 .171964 .290195 .238125
+aline .291465 .23876
+aline .34925 .23876
+aline .351155 .236855
+aline .351155 .233045
+aline .35052 .230505
+aline .348615 .2286
+aline .33274 .2286
+aline .332105 .227965
+aline .32639 .227965
+aline .325755 .22733
+aline .32258 .226695
+aline .31877 .225425
+aline .316865 .22352
+aline .31496 .21971
+aline .31369 .2159
+aline .27305 .05334
+aline .264795 .02032
+aline .26416 .019685
+aline .26416 .0127
+aline .2667 .01143
+aline .269875 .010795
+aline .27051 .01016
+aline .276225 .01016
+aline .27686 .009525
+aline .2921 .009525
+aline .294005 .00762
+aline .294005 .004445
+aline .29337 .001905
+aline .292735 .000635
+aline .2921 0
+bezier .263137 -.407233E-03 .23362 .120498E-02 .20447 -.000635
+aline .2032 0
+aline .202565 .000635
+aline .20193 .001905
+aline .20193 .00381
+aline .202565 .00635
+aline .203835 .00889
+bezier .216042 .115426E-01 .23486 .516739E-02 .239395 .020955
+aline .280035 .183515
+aline .28956 .221615
+aline .289983 .222885
+aline .28956 .224155
+bezier .244515 .149772 .200782 .744432E-01 .15494 .000635
+aline .1524 -.000635
+aline .147955 -.000635
+aline .146685 0
+bezier .141317 .268335E-01 .141286 .553904E-01 .13716 .08255
+bezier .132862 .128842 .128778 .175222 .12319 .22098
+aline .08255 .05842
+aline .075565 .03048
+bezier .070728 .199268E-01 .081094 .909089E-02 .092075 .01016
+aline .09271 .009525
+aline .10033 .009525
+aline .102235 .00762
+aline .102235 .004445
+aline .1016 .001905
+aline .100965 .000635
+aline .10033 0
+bezier .757773E-01 -.42662E-03 .507801E-01 .115914E-02 .026035 -.000635
+aline .024765 0
+aline .02413 .000635
+aline .023495 .001905
+aline .023495 .00381
+aline .02413 .00635
+aline .0254 .00889
+bezier .402579E-01 .917717E-02 .594102E-01 .138703E-01 .0635 .031115
+aline .10414 .193675
+aline .109855 .216535
+aline .11049 .21971
+aline .111125 .220345
+aline .111125 .224155
+aline .11049 .22479
+aline .109855 .22606
+aline .10795 .226695
+aline .104775 .22733
+aline .10414 .227965
+aline .09906 .227965
+aline .098425 .2286
+aline .083185 .2286
+aline .081915 .229235
+aline .080645 .231775
+aline .080645 .23241
+aline .08128 .23495
+aline .081915 .236855
+aline .08382 .23876
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="N" !-------------- Beginning of new char.
+dfont wid=.743329 hei=.683332 dep=0 italic=.16389
+set path ! start of curve
+newpath
+! start of curve
+amove .139065 .23876
+bezier .164193 .177739 .184055 .113262 .207962 .515938E-01
+aline .208371 .517978E-01
+aline .247015 .206375
+bezier .252461 .217154 .242658 .229084 .23114 .227965
+aline .230505 .2286
+aline .222885 .2286
+aline .221615 .229235
+aline .220345 .231775
+aline .220345 .23241
+aline .22098 .23495
+aline .221615 .236855
+aline .22352 .23876
+aline .231775 .23876
+aline .23241 .238125
+aline .25527 .238125
+aline .255905 .23749
+aline .266065 .23749
+aline .2667 .238125
+aline .290195 .238125
+aline .29083 .23876
+aline .29718 .23876
+aline .299085 .236855
+aline .299085 .233045
+aline .29845 .230505
+aline .296545 .2286
+bezier .281987 .2295 .264499 .223831 .259715 .20828
+aline .219075 .04572
+aline .20828 .00254
+aline .20701 0
+aline .20574 -.000635
+aline .198755 -.000635
+bezier .186348 .245737E-01 .178938 .534597E-01 .168275 .08001
+bezier .152345 .124948 .136029 .169726 .120015 .21463
+aline .11938 .21336
+aline .07874 .0508
+bezier .770747E-01 .038131 .660908E-01 .217957E-01 .079375 .0127
+aline .083185 .01143
+aline .085725 .010795
+aline .08636 .01016
+aline .09017 .01016
+aline .090805 .009525
+aline .098425 .009525
+aline .10033 .00762
+aline .10033 .004445
+aline .099695 .001905
+aline .09906 .000635
+aline .098425 0
+bezier .738723E-01 -.426624E-03 .488751E-01 .115914E-02 .02413 -.000635
+aline .02286 0
+aline .022225 .000635
+aline .02159 .001905
+aline .02159 .00381
+aline .022225 .00635
+aline .023495 .00889
+bezier .383529E-01 .917717E-02 .575052E-01 .138703E-01 .061595 .031115
+aline .102235 .193675
+aline .109855 .224155
+aline .110278 .225425
+aline .110014 .226219
+aline .108585 .226695
+aline .10795 .22733
+aline .104775 .22733
+aline .10414 .227965
+aline .098425 .227965
+aline .09779 .2286
+aline .08128 .2286
+aline .08001 .229235
+aline .07874 .231775
+aline .07874 .23241
+aline .079375 .23495
+aline .08001 .236855
+aline .081915 .23876
+aline .139065 .23876
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="O" !-------------- Beginning of new char.
+dfont wid=.766663 hei=.683332 dep=0 italic=.0940275
+dfont fby="A" kadd=-.0255556
+dfont fby="V" kadd=-.0255556
+dfont fby="W" kadd=-.0255556
+dfont fby="X" kadd=-.0255556
+dfont fby="Y" kadd=-.0255556
+set path ! start of curve
+newpath
+! start of curve
+amove .203835 .24638
+bezier .243354 .244348 .274785 .206443 .27559 .16764
+bezier .282515 .909813E-01 .226756 .997126E-02 .14986 -.006985
+bezier .11321 -.151039E-01 .708165E-01 .581916E-02 .059055 .04318
+bezier .345039E-01 .119858 .851823E-01 .207814 .15748 .23876
+aline .16891 .24257
+aline .17653 .244475
+aline .179705 .24511
+aline .18288 .24511
+aline .183515 .245745
+aline .188595 .245745
+aline .18923 .24638
+aline .203835 .24638
+closepath
+! end of curve
+
+! start of curve
+amove .18796 .23749
+bezier .136102 .228921 .105307 .177783 .09271 .130175
+bezier .829718E-01 .926192E-01 .749943E-01 .510712E-01 .09906 .017145
+bezier .119609 -.881593E-02 .157328 -.168594E-02 .179705 .01778
+bezier .222185 .505516E-01 .239868 .107999 .247015 .158115
+bezier .249111 .186591 .242482 .221553 .21336 .234315
+aline .207645 .23622
+aline .20447 .236855
+aline .203835 .23749
+aline .20066 .23749
+aline .200025 .238125
+aline .188595 .238125
+aline .18796 .23749
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="P" !-------------- Beginning of new char.
+dfont wid=.678329 hei=.683332 dep=0 italic=.10257
+dfont fby="A" kadd=-.0766659
+set path ! start of curve
+newpath
+! start of curve
+amove .202565 .23876
+bezier .226408 .237338 .252478 .220839 .255905 .194945
+bezier .260509 .149219 .214574 .114836 .173355 .11049
+aline .111125 .11049
+aline .11049 .10922
+aline .088265 .02032
+aline .08763 .019685
+aline .08763 .0127
+aline .09017 .01143
+aline .093345 .010795
+aline .09398 .01016
+aline .099695 .01016
+aline .10033 .009525
+aline .11557 .009525
+aline .117475 .00762
+aline .117475 .004445
+aline .11684 .001905
+aline .116205 .000635
+aline .11557 0
+bezier .855263E-01 -.462542E-03 .054999 .120853E-02 .024765 -.000635
+aline .023495 0
+aline .02286 .000635
+aline .022225 .001905
+aline .022225 .00381
+aline .02286 .00635
+aline .02413 .00889
+bezier .363368E-01 .115426E-01 .551547E-01 .516735E-02 .05969 .020955
+aline .10033 .183515
+aline .108585 .216535
+aline .10922 .21971
+aline .109855 .220345
+aline .109855 .224155
+aline .10922 .22479
+aline .108585 .22606
+aline .10668 .226695
+aline .103505 .22733
+aline .10287 .227965
+aline .09779 .227965
+aline .097155 .2286
+aline .081915 .2286
+aline .080645 .229235
+aline .079375 .231775
+aline .079375 .23241
+aline .08001 .23495
+aline .080645 .236855
+aline .08255 .23876
+aline .202565 .23876
+closepath
+! end of curve
+
+! start of curve
+amove .145415 .227965
+aline .14224 .22733
+aline .1397 .22606
+aline .137795 .22225
+aline .136525 .21844
+aline .111998 .120333
+aline .112395 .118745
+aline .16383 .118745
+bezier .188517 .120814 .213909 .137543 .219075 .16383
+bezier .224612 .18289 .232926 .206914 .213995 .22098
+bezier .207164 .22544 .198537 .227172 .191135 .2286
+aline .14605 .2286
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="Q" !-------------- Beginning of new char.
+dfont wid=.766663 hei=.683332 dep=.194445 italic=.0940275
+set path ! start of curve
+newpath
+! start of curve
+amove .203835 .24638
+bezier .243354 .244348 .274785 .206443 .27559 .16764
+bezier .282197 .991787E-01 .23796 .296375E-01 .175895 .000635
+bezier .176458 -.127848E-01 .176743 -.327326E-01 .19304 -.03683
+bezier .214591 -.384225E-01 .232467 -.195024E-01 .236855 .000635
+aline .23876 .00254
+aline .241935 .00254
+aline .24384 .000635
+bezier .238207 -.275418E-01 .224774 -.622287E-01 .193675 -.069215
+bezier .176682 -.727777E-01 .159482 -.590363E-01 .161925 -.041275
+bezier .160457 -.288088E-01 .164088 -.160859E-01 .164624 -.365125E-02
+bezier .131261 -.145591E-01 .886653E-01 -.70879E-02 .06858 .024765
+bezier .344608E-01 .794533E-01 .587448E-01 .150994 .098425 .196215
+bezier .125141 .225713 .163119 .248906 .203835 .24638
+closepath
+! end of curve
+
+! start of curve
+amove .18796 .23749
+bezier .135864 .228641 .105082 .17701 .09144 .12954
+bezier .811606E-01 .924437E-01 .729366E-01 .511487E-01 .097155 .01778
+bezier .102147 .129123E-01 .108493 .568345E-02 .114776 .53975E-02
+bezier .104716 .311787E-01 .139562 .649193E-01 .16383 .045085
+bezier .173682 .038135 .173124 .231506E-01 .175895 .141817E-01
+bezier .223279 .456573E-01 .242056 .107476 .24765 .16002
+bezier .249479 .189993 .238787 .229855 .20447 .236855
+aline .203835 .23749
+aline .20066 .23749
+aline .200025 .238125
+aline .188595 .238125
+aline .18796 .23749
+closepath
+! end of curve
+
+! start of curve
+amove .14351 .04318
+bezier .125081 .407237E-01 .110169 .100554E-01 .12954 0
+bezier .142229 -.886509E-03 .154146 .269146E-02 .165806 .797277E-02
+bezier .169357 .210979E-01 .167217 .421388E-01 .150495 .043815
+aline .144145 .043815
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="R" !-------------- Beginning of new char.
+dfont wid=.729441 hei=.683332 dep=0 italic=.038681
+dfont fby="C" kadd=-.0255556
+dfont fby="G" kadd=-.0255556
+dfont fby="O" kadd=-.0255556
+dfont fby="Q" kadd=-.0255556
+dfont fby="T" kadd=-.0766659
+dfont fby="U" kadd=-.0255556
+dfont fby="V" kadd=-.102221
+dfont fby="W" kadd=-.102221
+dfont fby="Y" kadd=-.0766659
+dfont fby="a" kadd=-.0511112
+dfont fby="b" kadd=-.0255556
+dfont fby="c" kadd=-.0511112
+dfont fby="d" kadd=-.0511112
+dfont fby="e" kadd=-.0511112
+dfont fby="g" kadd=-.0511112
+dfont fby="h" kadd=-.0255556
+dfont fby="i" kadd=-.0255556
+dfont fby="k" kadd=-.0255556
+dfont fby="l" kadd=-.0255556
+dfont fby="m" kadd=-.0255556
+dfont fby="n" kadd=-.0255556
+dfont fby="o" kadd=-.0511112
+dfont fby="q" kadd=-.0511112
+dfont fby="r" kadd=-.0255556
+dfont fby="t" kadd=-.0255556
+dfont fby="u" kadd=-.0255556
+dfont fby="v" kadd=-.0255556
+dfont fby="w" kadd=-.0255556
+set path ! start of curve
+newpath
+! start of curve
+amove .189865 .23876
+bezier .218826 .238289 .255079 .217033 .252095 .183515
+bezier .247407 .147538 .211277 .126184 .178435 .11811
+bezier .198427 .111633 .21285 .901043E-01 .207645 .069215
+bezier .207738 .472919E-01 .19867 .248047E-01 .206375 .003175
+bezier .216327 -.762407E-02 .231568 .365652E-02 .236855 .01397
+aline .240665 .02159
+aline .2413 .023495
+aline .241935 .024765
+aline .243205 .028575
+bezier .2417 .363964E-01 .255633 .389406E-01 .254635 .03048
+bezier .249493 .966971E-02 .231243 -.134197E-01 .207645 -.00762
+bezier .185704 -.845301E-02 .165658 .132892E-01 .17145 .034925
+aline .17145 .0381
+aline .172085 .041275
+aline .18034 .074295
+bezier .18601 .912141E-01 .175659 .113533 .15621 .11557
+aline .111125 .11557
+aline .11049 .1143
+aline .086995 .02032
+aline .08636 .019685
+aline .08636 .0127
+aline .0889 .01143
+aline .092075 .010795
+aline .09271 .01016
+aline .098425 .01016
+aline .09906 .009525
+aline .1143 .009525
+aline .116205 .00762
+aline .116205 .004445
+aline .11557 .001905
+aline .114935 .000635
+aline .1143 0
+bezier .846799E-01 -.465114E-03 .545712E-01 .122061E-02 .024765 -.000635
+aline .023495 0
+aline .02286 .000635
+aline .022225 .001905
+aline .022225 .00381
+aline .02286 .00635
+aline .02413 .00889
+bezier .363368E-01 .115426E-01 .551547E-01 .516735E-02 .05969 .020955
+aline .10033 .183515
+aline .108585 .216535
+aline .10922 .21971
+aline .109855 .220345
+aline .109855 .224155
+aline .10922 .22479
+aline .108585 .22606
+aline .10668 .226695
+aline .103505 .22733
+aline .10287 .227965
+aline .09779 .227965
+aline .097155 .2286
+aline .081915 .2286
+aline .080645 .229235
+aline .079375 .231775
+aline .079375 .23241
+aline .08001 .23495
+aline .080645 .236855
+aline .08255 .23876
+aline .189865 .23876
+closepath
+! end of curve
+
+! start of curve
+amove .145415 .227965
+aline .14224 .22733
+aline .1397 .22606
+aline .137795 .22225
+aline .136525 .21844
+aline .11303 .12446
+aline .112554 .123507
+aline .11303 .122555
+aline .15621 .122555
+bezier .183023 .12436 .211452 .141898 .216535 .170815
+bezier .222166 .187381 .225379 .210423 .207645 .22098
+aline .201295 .224155
+aline .19558 .22606
+aline .18923 .22733
+aline .188595 .227965
+aline .183515 .227965
+aline .18288 .2286
+aline .14605 .2286
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="S" !-------------- Beginning of new char.
+dfont wid=.56222 hei=.683332 dep=0 italic=.119722
+set path ! start of curve
+newpath
+! start of curve
+amove .158115 .24638
+bezier .17339 .245073 .189621 .237164 .19685 .222885
+bezier .203785 .230448 .209416 .23895 .216535 .24638
+aline .220345 .24638
+aline .22098 .245745
+aline .22225 .24511
+aline .22225 .2413
+aline .202565 .16256
+aline .20193 .16129
+aline .20066 .16002
+aline .19431 .16002
+aline .19304 .160655
+bezier .192711 .177796 .197807 .197163 .18923 .213995
+bezier .178583 .241651 .140369 .243794 .120015 .22606
+bezier .971552E-01 .209287 .817993E-01 .169747 .10668 .14859
+bezier .132487 .135165 .171122 .138874 .18415 .10795
+bezier .206823 .486401E-01 .143966 -.260587E-01 .08128 -.00508
+bezier .693205E-01 -.188219E-02 .596321E-01 .60973E-02 .517525E-01 .150813E-01
+bezier .446881E-01 .790233E-02 .391826E-01 -.141397E-02 .03175 -.008255
+aline .02794 -.008255
+aline .02667 -.006985
+aline .026035 -.005715
+aline .026035 -.004445
+aline .046355 .076835
+aline .047625 .07747
+aline .04826 .078105
+aline .05461 .078105
+aline .056515 .0762
+bezier .505498E-01 .05375 .512643E-01 .243626E-01 .07366 .01016
+bezier .970033E-01 -.350286E-02 .128213 -.135135E-03 .145415 .02159
+bezier .164403 .420826E-01 .176178 .791372E-01 .151765 .099695
+bezier .125722 .112707 .865897E-01 .109507 .074295 .14097
+bezier .558858E-01 .191848 .105081 .250903 .158115 .24638
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="T" !-------------- Beginning of new char.
+dfont wid=.715551 hei=.683332 dep=0 italic=.133055
+dfont fby="A" kadd=-.0766659
+dfont fby="a" kadd=-.0766659
+dfont fby="e" kadd=-.0766659
+dfont fby="o" kadd=-.0766659
+dfont fby="r" kadd=-.0766659
+dfont fby="u" kadd=-.0766659
+dfont fby="y" kadd=-.0766659
+set path ! start of curve
+newpath
+! start of curve
+amove .28067 .236855
+bezier .285302 .230363 .279452 .222009 .280035 .21463
+bezier .276884 .196444 .273783 .17875 .271145 .16002
+aline .26924 .158115
+aline .26289 .158115
+aline .260985 .16002
+bezier .261723 .178629 .270625 .199075 .260985 .21717
+bezier .25458 .223794 .244945 .225405 .236855 .226695
+aline .203835 .226695
+aline .2032 .22606
+aline .200025 .225425
+aline .197908 .224367
+aline .197485 .22352
+aline .19685 .222885
+aline .196215 .221615
+aline .19558 .21971
+aline .194945 .21844
+aline .154305 .05588
+aline .14605 .02286
+aline .145415 .019685
+bezier .142162 .128522E-01 .1514 .106536E-01 .15621 .01016
+aline .164465 .01016
+aline .1651 .009525
+aline .186055 .009525
+aline .187325 .00889
+aline .188595 .00635
+aline .188595 .00508
+aline .18796 .00254
+aline .187325 .00127
+aline .18542 -.000635
+aline .173355 -.000635
+aline .17272 0
+aline .135255 0
+aline .13462 .000635
+aline .117475 .000635
+aline .11684 0
+aline .07874 0
+aline .078105 -.000635
+aline .067945 -.000635
+aline .06604 .00127
+aline .06604 .005715
+aline .066675 .00762
+aline .06858 .009525
+bezier .838508E-01 .102111E-01 .994917E-01 .754012E-02 .11303 .014605
+aline .113665 .015875
+aline .114935 .017145
+aline .11684 .020955
+aline .15748 .183515
+aline .165735 .216535
+aline .16637 .21971
+aline .167005 .220345
+aline .167005 .22479
+aline .16637 .225425
+aline .16383 .22606
+aline .163195 .226695
+aline .130175 .226695
+bezier .114909 .224979 .962519E-01 .218907 .0889 .2032
+bezier .805684E-01 .189058 .773786E-01 .172234 .06985 .158115
+aline .0635 .158115
+aline .061595 .16002
+aline .061595 .16256
+aline .07493 .202565
+aline .075565 .203835
+aline .085725 .234315
+aline .08636 .235585
+aline .086995 .23622
+aline .088265 .236855
+aline .28067 .236855
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="U" !-------------- Beginning of new char.
+dfont wid=.743329 hei=.683332 dep=0 italic=.16389
+set path ! start of curve
+newpath
+! start of curve
+amove .09144 .23876
+aline .092075 .238125
+aline .12065 .238125
+aline .121285 .23749
+aline .133985 .23749
+aline .13462 .238125
+aline .163195 .238125
+aline .16383 .23876
+aline .172085 .23876
+aline .17399 .236855
+aline .17399 .233045
+aline .173355 .230505
+aline .17145 .2286
+aline .155575 .2286
+aline .15494 .227965
+aline .149225 .227965
+aline .14859 .22733
+aline .145415 .226695
+aline .141605 .225425
+aline .1397 .22352
+aline .137795 .21971
+aline .136525 .2159
+aline .100965 .07366
+bezier .094656 .050856 .932673E-01 .186648E-01 .11811 .005715
+bezier .15104 -.738777E-02 .186522 .191759E-01 .2032 .04699
+bezier .208572 .563753E-01 .213092 .663222E-01 .2159 .076835
+aline .248285 .206375
+bezier .253731 .217154 .243928 .229084 .23241 .227965
+aline .231775 .2286
+aline .224155 .2286
+aline .222885 .229235
+aline .221615 .231775
+aline .221615 .23241
+aline .22225 .23495
+aline .222885 .236855
+aline .22479 .23876
+aline .233045 .23876
+aline .23368 .238125
+aline .255905 .238125
+aline .25654 .23749
+aline .2667 .23749
+aline .267335 .238125
+aline .290195 .238125
+aline .29083 .23876
+aline .29718 .23876
+aline .299085 .236855
+aline .299085 .233045
+aline .29845 .230505
+aline .296545 .2286
+bezier .281987 .2295 .264499 .223831 .259715 .20828
+aline .226695 .0762
+bezier .214456 .308205E-01 .172441 -.141058E-01 .122555 -.00762
+bezier .884273E-01 -.334075E-02 .661558E-01 .328515E-01 .071755 .06477
+aline .071755 .06985
+aline .07239 .070485
+aline .07239 .07366
+aline .073025 .076835
+aline .10795 .216535
+aline .108585 .21971
+aline .10922 .220345
+aline .10922 .224155
+aline .108585 .22479
+aline .10795 .22606
+aline .106045 .226695
+aline .10287 .22733
+aline .102235 .227965
+aline .097155 .227965
+aline .09652 .2286
+aline .08128 .2286
+aline .08001 .229235
+aline .07874 .231775
+aline .07874 .23241
+aline .079375 .23495
+aline .08001 .236855
+aline .081915 .23876
+aline .09144 .23876
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="V" !-------------- Beginning of new char.
+dfont wid=.743329 hei=.683332 dep=0 italic=.183611
+dfont fby="A" kadd=-.102221
+dfont fby="C" kadd=-.0255556
+dfont fby="G" kadd=-.0255556
+dfont fby="O" kadd=-.0255556
+dfont fby="Q" kadd=-.0255556
+dfont fby="a" kadd=-.0766659
+dfont fby="e" kadd=-.0766659
+dfont fby="o" kadd=-.0766659
+dfont fby="r" kadd=-.0766659
+dfont fby="u" kadd=-.0766659
+set path ! start of curve
+newpath
+! start of curve
+amove .08509 .23876
+aline .085725 .238125
+aline .108585 .238125
+aline .10922 .23749
+aline .12065 .23749
+aline .121285 .238125
+aline .14986 .238125
+aline .150495 .23876
+aline .15875 .23876
+aline .160655 .236855
+aline .160655 .233045
+aline .16002 .230505
+aline .158115 .2286
+bezier .147773 .228727 .130221 .228936 .12954 .215265
+bezier .136329 .154998 .141136 .939096E-01 .147955 .033655
+bezier .18386 .930702E-01 .220093 .152461 .254635 .212725
+bezier .25758 .223046 .246614 .22982 .23749 .2286
+aline .23622 .229235
+aline .23495 .231775
+aline .23495 .23241
+aline .235585 .23495
+aline .23622 .236855
+aline .238125 .23876
+aline .24638 .23876
+aline .247015 .238125
+aline .26924 .238125
+aline .269875 .23749
+aline .278765 .23749
+aline .2794 .238125
+aline .296545 .238125
+aline .29718 .23876
+aline .30226 .23876
+aline .304165 .236855
+aline .304165 .23241
+aline .30353 .230505
+aline .301625 .2286
+bezier .27584 .230169 .260848 .205426 .25019 .18542
+bezier .210883 .121392 .174012 .551362E-01 .13335 -.00762
+aline .13208 -.008255
+aline .12573 -.008255
+aline .12446 -.00762
+bezier .120341 .100739E-02 .122371 .117771E-01 .120015 .020955
+bezier .113596 .886851E-01 .107792 .156177 .099695 .22352
+bezier .939231E-01 .231738 .821585E-01 .22619 .074295 .22987
+aline .07366 .23114
+aline .07366 .233045
+aline .074295 .235585
+aline .07493 .236855
+aline .076835 .23876
+aline .08509 .23876
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="W" !-------------- Beginning of new char.
+dfont wid=.998883 hei=.683332 dep=0 italic=.183611
+dfont fby="A" kadd=-.0766659
+set path ! start of curve
+newpath
+! start of curve
+amove .084455 .23876
+aline .08509 .238125
+aline .10668 .238125
+aline .107315 .23749
+aline .118745 .23749
+aline .11938 .238125
+aline .147955 .238125
+aline .14859 .23876
+aline .15621 .23876
+aline .15748 .238125
+aline .158115 .23749
+aline .15875 .23622
+aline .15875 .234315
+aline .158115 .231775
+aline .156845 .229235
+bezier .146363 .227746 .132289 .229747 .126365 .21844
+bezier .129159 .159191 .131272 .996596E-01 .13462 .04064
+bezier .163436 .913844E-01 .1904 .143464 .219075 .19431
+aline .219075 .205105
+aline .21844 .20574
+aline .21844 .219075
+bezier .217854 .230375 .204178 .228501 .19558 .2286
+aline .193675 .230505
+aline .193675 .234315
+aline .19431 .23622
+aline .194945 .23749
+aline .19558 .238125
+bezier .222142 .23833 .24933 .237144 .276225 .23876
+aline .277495 .238125
+aline .27813 .23749
+aline .278765 .23622
+aline .278765 .234315
+aline .27813 .231775
+aline .277495 .230505
+aline .27559 .2286
+bezier .265175 .228747 .252062 .228869 .24638 .21844
+bezier .24912 .158957 .251277 .099232 .254635 .040005
+bezier .285516 .978476E-01 .318761 .1549 .34798 .21336
+bezier .348696 .225562 .334511 .228659 .32512 .229235
+aline .32385 .231775
+aline .32385 .233045
+aline .324485 .235585
+aline .32512 .236855
+aline .327025 .23876
+bezier .34933 .237591 .37188 .237907 .3937 .238125
+aline .394335 .23749
+aline .39497 .23622
+aline .39497 .23368
+aline .394335 .231775
+aline .393065 .229235
+bezier .373046 .229591 .35798 .213217 .35052 .19558
+bezier .313102 .12833 .277317 .599019E-01 .239395 -.006985
+aline .236855 -.008255
+aline .230505 -.008255
+aline .229235 -.00762
+bezier .22522 .301442E-01 .225867 .688646E-01 .222885 .10668
+bezier .22231 .129952 .22136 .153068 .21971 .175895
+bezier .186035 .115102 .15373 .533215E-01 .11938 -.006985
+aline .11684 -.008255
+aline .11049 -.008255
+aline .108585 -.00635
+bezier .103911 .702083E-01 .10264 .147153 .097155 .22352
+aline .09652 .225425
+aline .095885 .22606
+aline .094615 .226695
+aline .092075 .22733
+aline .09144 .227965
+aline .08763 .227965
+aline .086995 .2286
+aline .075565 .2286
+aline .07366 .230505
+aline .07366 .234315
+aline .074295 .23622
+aline .07493 .23749
+aline .075565 .238125
+aline .076835 .23876
+aline .084455 .23876
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="X" !-------------- Beginning of new char.
+dfont wid=.743329 hei=.683332 dep=0 italic=.158055
+dfont fby="C" kadd=-.0255556
+dfont fby="G" kadd=-.0255556
+dfont fby="O" kadd=-.0255556
+dfont fby="Q" kadd=-.0255556
+set path ! start of curve
+newpath
+! start of curve
+amove .090805 .23876
+aline .09144 .238125
+aline .114935 .238125
+aline .11557 .23749
+aline .127635 .23749
+aline .12827 .238125
+aline .156845 .238125
+aline .15748 .23876
+aline .165735 .23876
+aline .167005 .238125
+aline .168275 .235585
+aline .168275 .23495
+aline .16764 .23241
+aline .167005 .230505
+aline .1651 .2286
+bezier .157028 .22874 .144119 .225458 .14224 .21717
+bezier .151553 .19294 .159628 .168006 .169545 .144145
+bezier .188674 .167465 .210997 .188482 .227965 .21336
+aline .228997 .217487
+aline .227965 .221615
+aline .226695 .224155
+aline .225425 .225425
+aline .221615 .22733
+aline .219075 .227965
+aline .21844 .2286
+aline .213995 .2286
+aline .21209 .230505
+aline .21209 .234315
+aline .212725 .23622
+aline .21336 .23749
+aline .213995 .238125
+bezier .238136 .238759 .262809 .236743 .28702 .23876
+aline .28829 .238125
+aline .288925 .23749
+aline .28956 .23622
+aline .28956 .23368
+aline .288925 .231775
+aline .287655 .229235
+bezier .264553 .229059 .242685 .216104 .2286 .197485
+bezier .209746 .176414 .191176 .155139 .172879 .133667
+bezier .187518 .942275E-01 .201669 .545856E-01 .216535 .01524
+bezier .223945 .681058E-02 .236006 .116491E-01 .24511 .008255
+aline .245745 .006985
+aline .245745 .004445
+aline .24511 .001905
+aline .244475 .000635
+aline .24384 0
+bezier .216205 -.239579E-03 .187958 .102149E-02 .16002 -.000635
+aline .15875 0
+aline .158115 .000635
+aline .15748 .001905
+aline .15748 .004445
+aline .158115 .006985
+aline .15875 .008255
+bezier .166636 .011055 .179154 .105131E-01 .183277 .200025E-01
+bezier .172858 .495712E-01 .162017 .793746E-01 .150813 .108426
+bezier .127327 .081146 .101889 .546954E-01 .08001 .026035
+bezier .746084E-01 .172209E-01 .843503E-01 .807313E-02 .093345 .009525
+aline .09525 .00762
+aline .09525 .003175
+aline .094615 .00127
+aline .09271 -.000635
+bezier .680794E-01 .704466E-03 .043266 .178691E-04 .01905 0
+aline .01778 .00254
+aline .01778 .003175
+aline .018415 .005715
+aline .01905 .00762
+aline .020955 .009525
+bezier .526078E-01 .798421E-02 .751507E-01 .034648 .093345 .05715
+bezier .11143 .777572E-01 .130213 .980048E-01 .147108 .11938
+bezier .133539 .154345 .122458 .190715 .107315 .22479
+aline .103505 .226695
+aline .10033 .22733
+aline .099695 .227965
+aline .09525 .227965
+aline .094615 .2286
+aline .081915 .2286
+aline .08001 .230505
+aline .08001 .234315
+aline .080645 .236855
+aline .08255 .23876
+aline .090805 .23876
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="Y" !-------------- Beginning of new char.
+dfont wid=.743329 hei=.683332 dep=0 italic=.193832
+dfont fby="A" kadd=-.0766659
+dfont fby="a" kadd=-.0766659
+dfont fby="e" kadd=-.0766659
+dfont fby="o" kadd=-.0766659
+dfont fby="r" kadd=-.0766659
+dfont fby="u" kadd=-.0766659
+set path ! start of curve
+newpath
+! start of curve
+amove .08255 .23876
+aline .083185 .238125
+aline .10668 .238125
+aline .107315 .23749
+aline .11938 .23749
+aline .120015 .238125
+aline .149225 .238125
+aline .14986 .23876
+aline .158115 .23876
+aline .16002 .236855
+aline .16002 .233045
+aline .159385 .230505
+bezier .151844 .225934 .139335 .231161 .13335 .22225
+aline .132715 .221615
+bezier .143151 .184283 .156256 .146682 .16764 .10922
+bezier .195409 .144632 .226064 .177965 .252095 .21463
+aline .25273 .216535
+bezier .256832 .224771 .246348 .229701 .239395 .2286
+aline .23749 .230505
+aline .23749 .234315
+aline .238125 .23622
+aline .23876 .23749
+aline .239395 .238125
+bezier .261028 .23885 .283139 .23668 .3048 .23876
+aline .306705 .236855
+aline .306705 .233045
+aline .30607 .230505
+aline .304165 .2286
+bezier .269783 .22923 .250793 .195133 .23114 .172085
+bezier .209925 .1459 .18733 .120495 .16764 .093345
+aline .150495 .024765
+aline .149225 .018415
+aline .14859 .01778
+aline .14859 .01397
+aline .149225 .013335
+aline .14986 .012065
+aline .151765 .01143
+aline .15494 .010795
+aline .155575 .01016
+aline .160655 .01016
+aline .16129 .009525
+aline .17653 .009525
+aline .178435 .00762
+aline .178435 .003175
+aline .1778 .00127
+aline .175895 -.000635
+bezier .145856 .103123E-02 .11552 -.246946E-03 .085725 0
+aline .08509 .000635
+aline .084455 .001905
+aline .084455 .00381
+aline .08509 .00635
+aline .08636 .00889
+bezier .985669E-01 .115426E-01 .117385 .516739E-02 .12192 .020955
+aline .122555 .023495
+aline .12319 .0254
+aline .140335 .09398
+bezier .127667 .137021 .113953 .181472 .09906 .224155
+aline .09779 .225425
+aline .09652 .22606
+aline .094615 .226695
+aline .092075 .22733
+aline .09144 .227965
+aline .086995 .227965
+aline .08636 .2286
+aline .07366 .2286
+aline .07239 .229235
+aline .07112 .231775
+aline .07112 .23241
+aline .071755 .23495
+aline .07239 .236855
+aline .074295 .23876
+aline .08255 .23876
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="Z" !-------------- Beginning of new char.
+dfont wid=.61333 hei=.683332 dep=0 italic=.145277
+set path ! start of curve
+newpath
+! start of curve
+amove .245745 .23876
+bezier .250364 .229679 .237352 .223317 .23368 .2159
+bezier .176856 .147753 .117698 .788514E-01 .062865 .010795
+aline .122555 .010795
+bezier .146459 .118903E-01 .173998 .227137E-01 .18542 .046355
+bezier .194229 .606754E-01 .196553 .786714E-01 .20447 .09271
+aline .210185 .09271
+aline .211455 .092075
+aline .212725 .089535
+bezier .203623 .596951E-01 .19492 .295062E-01 .184785 0
+aline .183515 -.000635
+aline .029845 -.000635
+bezier .242695E-01 .520256E-02 .336873E-01 .121113E-01 .03683 .017145
+bezier .959545E-01 .872157E-01 .154488 .157712 .21336 .227965
+aline .212725 .2286
+aline .15621 .2286
+bezier .133636 .227383 .10822 .217039 .09652 .19558
+bezier .09009 .184605 .866274E-01 .172188 .081915 .160655
+aline .080645 .16002
+aline .07493 .16002
+aline .073025 .161925
+bezier .788877E-01 .187535 .871711E-01 .213359 .095885 .238125
+aline .097155 .23876
+aline .245745 .23876
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="[" !-------------- Beginning of new char.
+dfont wid=.306665 hei=.75 dep=.25 italic=.1875
+set path ! start of curve
+newpath
+! start of curve
+amove .154305 .262255
+aline .15621 .26035
+aline .15621 .25654
+aline .15494 .25146
+aline .15367 .24892
+aline .1524 .248285
+aline .12319 .248285
+aline .122555 .24638
+aline .081915 .08382
+aline .427831E-01 -.727075E-01
+aline .04318 -.074295
+aline .06985 -.074295
+aline .07112 -.07493
+aline .071755 -.075565
+aline .07239 -.076835
+aline .07239 -.07874
+aline .070485 -.08636
+aline .06858 -.088265
+aline .027305 -.088265
+aline .0254 -.08636
+aline .0254 -.083185
+aline .06604 .079375
+aline .10668 .241935
+aline .111125 .259715
+aline .11176 .260985
+aline .112395 .26162
+aline .113665 .262255
+aline .154305 .262255
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="\" !-------------- Beginning of new char.
+dfont wid=.514442 hei=.694445 dep=0 italic=.1685
+set path ! start of curve
+newpath
+! start of curve
+amove .149225 .24257
+aline .15113 .240665
+aline .15113 .236855
+bezier .12902 .220205 .111272 .195284 .10668 .16764
+bezier .115427 .179132 .139017 .174894 .13716 .15875
+bezier .137716 .140628 .108021 .128246 .099695 .14732
+bezier .931381E-01 .184798 .118151 .220805 .146685 .24257
+aline .149225 .24257
+closepath
+! end of curve
+
+! start of curve
+amove .212725 .24257
+aline .21463 .240665
+aline .21463 .236855
+bezier .19252 .220205 .174772 .195284 .17018 .16764
+bezier .178927 .179132 .202517 .174894 .20066 .15875
+bezier .201216 .140628 .171521 .128246 .163195 .14732
+bezier .156638 .184798 .181651 .220805 .210185 .24257
+aline .212725 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="]" !-------------- Beginning of new char.
+dfont wid=.306665 hei=.75 dep=.25 italic=.105278
+set path ! start of curve
+newpath
+! start of curve
+amove .12446 .262255
+aline .126365 .26035
+aline .126365 .25654
+aline .085725 .09398
+aline .045085 -.06858
+aline .04064 -.08636
+aline .038735 -.088265
+aline -.00254 -.088265
+aline -.004445 -.08636
+aline -.004445 -.083185
+aline -.003175 -.078105
+aline -.00254 -.0762
+aline -.000635 -.074295
+aline .028575 -.074295
+aline .02921 -.073025
+aline .06985 .089535
+aline .10922 .247015
+aline .109855 .24765
+aline .10922 .248285
+aline .081915 .248285
+aline .080645 .24892
+aline .079375 .25146
+aline .079375 .252095
+aline .08128 .259715
+aline .081915 .260985
+aline .08255 .26162
+aline .08382 .262255
+aline .12446 .262255
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="^" !-------------- Beginning of new char.
+dfont wid=.511108 hei=.694445 dep=0 italic=.0664597
+set path ! start of curve
+newpath
+! start of curve
+amove .15113 .24257
+bezier .162666 .227735 .172101 .210621 .18288 .194945
+aline .18288 .19177
+aline .179705 .188595
+bezier .172343 .184523 .170021 .196571 .1651 .200025
+bezier .159195 .208236 .152837 .216122 .146685 .224155
+bezier .130571 .212042 .115359 .197665 .098425 .187325
+aline .097155 .18796
+aline .094615 .1905
+aline .09398 .19177
+aline .09398 .194945
+bezier .111981 .211101 .130224 .226921 .14859 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="_" !-------------- Beginning of new char.
+dfont wid=.306665 hei=.667859 dep=0 italic=.117521
+set path ! start of curve
+newpath
+! start of curve
+amove .114935 .234315
+bezier .132457 .231065 .128787 .206426 .114935 .20066
+bezier .103221 .192381 .848681E-01 .203262 .09017 .217805
+bezier .928623E-01 .226061 .100038 .232566 .108585 .234315
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="`" !-------------- Beginning of new char.
+dfont wid=.306665 hei=.694445 dep=0 italic=.124168
+set path ! start of curve
+newpath
+! start of curve
+amove .12446 .24257
+aline .126365 .240665
+aline .126365 .236855
+bezier .104255 .220205 .865072E-01 .195284 .081915 .16764
+bezier .906625E-01 .179132 .114252 .174894 .112395 .15875
+bezier .11295 .140628 .832564E-01 .128246 .07493 .14732
+bezier .683731E-01 .184798 .933855E-01 .220805 .12192 .24257
+aline .12446 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="a" !-------------- Beginning of new char.
+dfont wid=.511108 hei=.430555 dep=0 italic=.0767136
+set path ! start of curve
+newpath
+! start of curve
+amove .12319 .15367
+bezier .134507 .151946 .143599 .143626 .147955 .13335
+bezier .147697 .144763 .165694 .152714 .170815 .14097
+aline .170815 .13462
+aline .145415 .03302
+bezier .143242 .231564E-01 .13916 .85486E-02 .150495 .00254
+bezier .165864 .295029E-02 .169017 .022468 .173355 .03429
+aline .17399 .03683
+aline .174625 .038735
+aline .177165 .048895
+aline .1778 .0508
+aline .179705 .052705
+aline .18542 .052705
+aline .18669 .05207
+aline .18796 .0508
+bezier .183573 .03046 .179479 .213027E-02 .15621 -.004445
+bezier .140669 -.671904E-02 .125056 .457372E-02 .12319 .02032
+bezier .108688 .618776E-04 .781251E-01 -.142973E-01 .056515 .00381
+bezier .302045E-01 .279893E-01 .366312E-01 .687479E-01 .04953 .098425
+bezier .621439E-01 .124088 .842985E-01 .149004 .113665 .15367
+closepath
+! end of curve
+
+! start of curve
+amove .114935 .14605
+bezier .886139E-01 .13753 .780718E-01 .108277 .07112 .08382
+bezier .656612E-01 .587196E-01 .540808E-01 .325695E-01 .06858 .00889
+bezier .815904E-01 -.572294E-02 .102391 .892982E-02 .11176 .020955
+bezier .116799 .026301 .12077 .324166E-01 .12446 .038735
+aline .142875 .112395
+bezier .142645 .126354 .134094 .148986 .11557 .146685
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="b" !-------------- Beginning of new char.
+dfont wid=.459997 hei=.694445 dep=0 italic=.0631237
+dfont fby="a" kadd=-.0511112
+dfont fby="c" kadd=-.0511112
+dfont fby="d" kadd=-.0511112
+dfont fby="e" kadd=-.0511112
+dfont fby="g" kadd=-.0511112
+dfont fby="o" kadd=-.0511112
+dfont fby="q" kadd=-.0511112
+set path ! start of curve
+newpath
+! start of curve
+amove .104775 .24257
+aline .106045 .241935
+aline .107315 .239395
+aline .107315 .23876
+aline .081915 .13716
+aline .814388E-01 .136208
+bezier .858944E-01 .13698 .914933E-01 .144779 .097155 .14732
+bezier .120479 .16359 .153625 .147479 .15875 .12065
+bezier .169798 .711377E-01 .14066 .102636E-01 .089535 -.00381
+bezier .651047E-01 -.101292E-01 .420604E-01 .127088E-01 .04191 .03683
+aline .041275 .037465
+aline .041275 .043815
+aline .04064 .04445
+aline .04064 .052705
+aline .041275 .05334
+aline .041275 .060325
+aline .04191 .06096
+aline .04191 .06477
+aline .043815 .074295
+aline .079375 .216535
+aline .08001 .21717
+aline .08001 .220345
+aline .080391 .22225
+aline .08001 .224155
+aline .079375 .22606
+aline .07747 .226695
+aline .07493 .22733
+aline .074295 .227965
+aline .06985 .227965
+aline .069215 .2286
+aline .056515 .2286
+aline .05461 .230505
+aline .05461 .234315
+aline .055245 .236855
+aline .05715 .23876
+bezier .713523E-01 .23998 .857282E-01 .240781 .099695 .24257
+closepath
+! end of curve
+
+! start of curve
+amove .1143 .14605
+bezier .959669E-01 .141441 .832378E-01 .125033 .07493 .10922
+aline .064135 .06604
+bezier .594349E-01 .460217E-01 .552012E-01 .022363 .07112 .005715
+bezier .898709E-01 -.484871E-02 .107087 .016344 .11557 .031115
+bezier .127601 .540793E-01 .132602 .811883E-01 .137795 .10541
+bezier .13847 .120254 .13812 .140445 .12192 .146685
+aline .114935 .146685
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="c" !-------------- Beginning of new char.
+dfont wid=.459997 hei=.430555 dep=0 italic=.0565281
+dfont fby="a" kadd=-.0511112
+dfont fby="c" kadd=-.0511112
+dfont fby="d" kadd=-.0511112
+dfont fby="e" kadd=-.0511112
+dfont fby="g" kadd=-.0511112
+dfont fby="o" kadd=-.0511112
+dfont fby="q" kadd=-.0511112
+set path ! start of curve
+newpath
+! start of curve
+amove .13335 .15367
+bezier .151534 .153146 .170193 .136041 .164465 .11684
+bezier .162998 .10362 .140649 .965328E-01 .13589 .111125
+bezier .133521 .122068 .143558 .131554 .15367 .131445
+bezier .143375 .153199 .113227 .14901 .09906 .13335
+bezier .749308E-01 .111599 .683404E-01 .075656 .062865 .04572
+bezier .612618E-01 .286789E-01 .673111E-01 .657775E-02 .08636 .00254
+bezier .114959 .126051E-02 .141648 .191003E-01 .158115 .041275
+aline .160655 .041275
+aline .164465 .037465
+bezier .162348 .251702E-01 .148982 .176004E-01 .1397 .01016
+bezier .112258 -.769784E-02 .689081E-01 -.134146E-01 .04826 .017145
+bezier .017256 .736214E-01 .687584E-01 .155752 .13335 .15367
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="d" !-------------- Beginning of new char.
+dfont wid=.511108 hei=.694445 dep=0 italic=.103334
+dfont fby="l" kadd=.0511112
+set path ! start of curve
+newpath
+! start of curve
+amove .19431 .24257
+aline .19558 .241935
+aline .19685 .239395
+aline .19685 .23876
+aline .15621 .0762
+aline .145415 .03302
+bezier .143242 .231564E-01 .13916 .85486E-02 .150495 .00254
+bezier .165864 .295029E-02 .169017 .022468 .173355 .03429
+aline .17399 .03683
+aline .174625 .038735
+aline .177165 .048895
+aline .1778 .0508
+aline .179705 .052705
+aline .18542 .052705
+aline .18669 .05207
+aline .18796 .0508
+bezier .183573 .03046 .179479 .213027E-02 .15621 -.004445
+bezier .140669 -.671904E-02 .125056 .457372E-02 .12319 .02032
+bezier .108688 .618776E-04 .781251E-01 -.142973E-01 .056515 .00381
+bezier .302045E-01 .279893E-01 .366312E-01 .687479E-01 .04953 .098425
+bezier .637811E-01 .127357 .092849 .159414 .12827 .1524
+bezier .137321 .149341 .144185 .141973 .147955 .13335
+aline .14859 .135255
+aline .16891 .216535
+aline .169545 .21717
+aline .169545 .220345
+aline .169926 .22225
+aline .169545 .224155
+aline .16891 .22606
+aline .167005 .226695
+aline .164465 .22733
+aline .16383 .227965
+aline .159385 .227965
+aline .15875 .2286
+aline .14605 .2286
+aline .144145 .230505
+aline .144145 .234315
+aline .14478 .236855
+aline .146685 .23876
+bezier .160887 .23998 .175263 .240781 .18923 .24257
+closepath
+! end of curve
+
+! start of curve
+amove .114935 .14605
+bezier .886139E-01 .13753 .780718E-01 .108277 .07112 .08382
+bezier .656612E-01 .587196E-01 .540808E-01 .325695E-01 .06858 .00889
+bezier .815904E-01 -.572294E-02 .102391 .892982E-02 .11176 .020955
+bezier .116799 .026301 .12077 .324166E-01 .12446 .038735
+aline .142875 .112395
+bezier .142645 .126354 .134094 .148986 .11557 .146685
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="e" !-------------- Beginning of new char.
+dfont wid=.459997 hei=.430555 dep=0 italic=.075139
+dfont fby="a" kadd=-.0511112
+dfont fby="c" kadd=-.0511112
+dfont fby="d" kadd=-.0511112
+dfont fby="e" kadd=-.0511112
+dfont fby="g" kadd=-.0511112
+dfont fby="o" kadd=-.0511112
+dfont fby="q" kadd=-.0511112
+set path ! start of curve
+newpath
+! start of curve
+amove .13335 .15367
+bezier .152738 .152687 .168217 .132895 .16129 .1143
+bezier .152602 .862043E-01 .118583 .821698E-01 .094615 .080645
+aline .070485 .080645
+bezier .640612E-01 .566061E-01 .574371E-01 .272183E-01 .076835 .006985
+bezier .953165E-01 -.387674E-02 .117887 .764308E-02 .13462 .01778
+bezier .143881 .241006E-01 .150737 .332635E-01 .158115 .041275
+aline .160655 .041275
+aline .164465 .037465
+bezier .162348 .251702E-01 .148982 .176004E-01 .1397 .01016
+bezier .113793 -.626996E-02 .735947E-01 -.138179E-01 .052705 .01397
+bezier .333184E-01 .438594E-01 .381703E-01 .838758E-01 .056515 .11303
+bezier .073826 .137411 .1026 .155927 .13335 .15367
+closepath
+! end of curve
+
+! start of curve
+amove .122555 .14605
+bezier .944853E-01 .141218 .776973E-01 .112506 .07239 .08763
+bezier .969015E-01 .880584E-01 .123927 .874807E-01 .142875 .106045
+bezier .154499 .118586 .151355 .143568 .13208 .14605
+aline .131445 .146685
+aline .12319 .146685
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="f" !-------------- Beginning of new char.
+dfont wid=.306665 hei=.694445 dep=.194445 italic=.211945
+dfont fby=33 kadd=.104306
+dfont fby=39 kadd=.104306
+dfont fby=")" kadd=.104306
+dfont fby="?" kadd=.104306
+dfont fby="]" kadd=.104306
+dfont fby="f" ligrep=11
+dfont fby="i" ligrep=12
+dfont fby="l" ligrep=13
+set path ! start of curve
+newpath
+! start of curve
+amove .13462 .24638
+bezier .149797 .24548 .162726 .231238 .15748 .2159
+bezier .154095 .204184 .134165 .19901 .12954 .21209
+bezier .127418 .222301 .135159 .231064 .14478 .233045
+bezier .136756 .242317 .1217 .240983 .11684 .229235
+bezier .108154 .203542 .104036 .175843 .099695 .14986
+aline .132715 .14986
+aline .133985 .149225
+aline .135255 .146685
+aline .135255 .14605
+aline .13462 .14351
+aline .133985 .141605
+aline .13208 .1397
+aline .097155 .1397
+bezier .916896E-01 .111129 .858919E-01 .820016E-01 .080645 .05334
+aline .07366 .018415
+bezier .654126E-01 -.135315E-01 .060745 -.531401E-01 .029845 -.07112
+bezier .125868E-01 -.786523E-01 -.131117E-01 -.661508E-01 -.008255 -.045085
+bezier -.681984E-02 -.318172E-01 .151563E-01 -.246385E-01 .02032 -.038735
+bezier .224424E-01 -.489461E-01 .147011E-01 -.057709 .00508 -.05969
+bezier .123029E-01 -.682706E-01 .269809E-01 -.682926E-01 .03175 -.05715
+bezier .477957E-01 -.163647E-01 .525536E-01 .285572E-01 .061595 .070485
+bezier .657428E-01 .936714E-01 .715674E-01 .116668 .074295 .1397
+aline .04699 .1397
+aline .045085 .141605
+aline .045085 .145415
+aline .04572 .147955
+aline .047625 .14986
+aline .076835 .14986
+bezier .845602E-01 .178735 .832739E-01 .213566 .10541 .23622
+aline .10668 .236855
+aline .108585 .23876
+aline .109855 .239395
+aline .111125 .240665
+aline .113665 .241935
+aline .1143 .24257
+aline .11684 .24384
+aline .122555 .245745
+aline .12573 .24638
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="g" !-------------- Beginning of new char.
+dfont wid=.459997 hei=.430555 dep=.194445 italic=.0884724
+set path ! start of curve
+newpath
+! start of curve
+amove .12319 .15367
+bezier .13416 .151917 .143528 .143993 .147955 .133985
+bezier .148303 .145027 .165806 .152497 .170815 .14097
+aline .170815 .13462
+aline .130175 -.02794
+bezier .118438 -.623239E-01 .777265E-01 -.790822E-01 .04445 -.071755
+bezier .310144E-01 -.724984E-01 .143716E-01 -.622431E-01 .01905 -.047625
+bezier .206078E-01 -.343652E-01 .433792E-01 -.028012 .047625 -.042545
+aline .047625 -.04826
+aline .04699 -.0508
+aline .045085 -.05461
+aline .040005 -.05969
+aline .037465 -.06096
+aline .03556 -.061595
+bezier .575853E-01 -.071222 .871784E-01 -.660056E-01 .099695 -.04318
+aline .10033 -.042545
+aline .100965 -.041275
+aline .1016 -.04064
+aline .106045 -.03175
+aline .10668 -.029845
+aline .107315 -.028575
+aline .108585 -.024765
+aline .118745 .015875
+aline .119221 .168275E-01
+bezier .1147 .015374 .10853 .752016E-02 .102235 .00508
+bezier .777023E-01 -.111932E-01 .440413E-01 .808168E-02 .04064 .036195
+bezier .325199E-01 .837153E-01 .610328E-01 .139995 .109855 .153035
+aline .11303 .153035
+aline .113665 .15367
+closepath
+! end of curve
+
+! start of curve
+amove .114935 .14605
+bezier .821335E-01 .135052 .743066E-01 .960579E-01 .066675 .06604
+bezier .622469E-01 .474738E-01 .575896E-01 .252829E-01 .07239 .009525
+bezier .906457E-01 -.409586E-03 .109245 .184603E-01 .11938 .032385
+aline .120015 .033655
+aline .12065 .03429
+aline .121285 .03556
+aline .12192 .036195
+aline .122555 .037465
+aline .12319 .0381
+aline .123825 .03937
+aline .12446 .040005
+aline .125095 .041275
+aline .142875 .112395
+bezier .143317 .127501 .13368 .148721 .11557 .146685
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="h" !-------------- Beginning of new char.
+dfont wid=.511108 hei=.694445 dep=0 italic=.0767136
+set path ! start of curve
+newpath
+! start of curve
+amove .104775 .24257
+aline .106045 .241935
+aline .107315 .239395
+aline .107315 .23876
+aline .808831E-01 .133033
+aline .08128 .131445
+bezier .991731E-01 .153871 .138772 .16442 .15875 .1397
+bezier .172721 .108936 .154132 .761111E-01 .145415 .04572
+bezier .141456 .322226E-01 .131632 .174486E-01 .138853 .423333E-02
+bezier .154305 -.218476E-02 .165972 .165403E-01 .170815 .02921
+aline .17145 .031115
+aline .172085 .032385
+aline .17526 .04191
+aline .175895 .04445
+aline .17653 .046355
+aline .177165 .048895
+aline .1778 .0508
+aline .179705 .052705
+aline .18542 .052705
+aline .18669 .05207
+aline .18796 .0508
+bezier .183784 .263792E-01 .168888 -.623291E-02 .1397 -.004445
+bezier .117482 -.215228E-02 .112593 .025123 .121285 .04191
+bezier .130574 .713583E-01 .145247 .1017 .142875 .13208
+bezier .141177 .141647 .13151 .149658 .12192 .14605
+bezier .965041E-01 .142808 .810925E-01 .118371 .071755 .09652
+aline .048895 .00508
+bezier .470278E-01 -.629919E-02 .262627E-01 -.869947E-02 .02667 .00508
+aline .027305 .008255
+aline .067945 .170815
+aline .079375 .216535
+aline .08001 .21717
+aline .08001 .220345
+aline .080391 .22225
+aline .08001 .224155
+aline .079375 .22606
+aline .07747 .226695
+aline .07493 .22733
+aline .074295 .227965
+aline .06985 .227965
+aline .069215 .2286
+aline .056515 .2286
+aline .05461 .230505
+aline .05461 .234315
+aline .055245 .236855
+aline .05715 .23876
+bezier .713523E-01 .23998 .857282E-01 .240781 .099695 .24257
+closepath
+! end of curve
+
+! start of curve
+amove .080645 .13081
+aline .08128 .131445
+aline .080645 .13208
+aline .08001 .131445
+aline .080645 .13081
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="i" !-------------- Beginning of new char.
+dfont wid=.306665 hei=.655359 dep=0 italic=.101896
+set path ! start of curve
+newpath
+! start of curve
+amove .10541 .22987
+bezier .12121 .226559 .114239 .202899 .10033 .20193
+bezier .086277 .198505 .806853E-01 .218137 .09144 .225425
+aline .09271 .22606
+aline .09398 .22733
+aline .09779 .229235
+aline .10033 .22987
+closepath
+! end of curve
+
+! start of curve
+amove .078105 .15367
+bezier .989184E-01 .151163 .104837 .126361 .097155 .109855
+bezier .867987E-01 .769781E-01 .697906E-01 .448971E-01 .064135 .01143
+aline .06477 .010795
+bezier .649366E-01 -.600005E-03 .782985E-01 .184865E-02 .084455 .006985
+bezier .098338 .184456E-01 .100418 .377757E-01 .10795 .052705
+aline .113665 .052705
+aline .114935 .05207
+aline .116205 .0508
+bezier .112029 .263792E-01 .971334E-01 -.623283E-02 .067945 -.004445
+bezier .457265E-01 -.215228E-02 .408384E-01 .251231E-01 .04953 .04191
+bezier .597011E-01 .717978E-01 .728131E-01 .101583 .08128 .131445
+aline .08128 .140335
+bezier .764568E-01 .153452 .590603E-01 .143402 .05461 .13462
+bezier .461901E-01 .123783 .438237E-01 .1095 .038735 .097155
+aline .037465 .09652
+aline .03175 .09652
+aline .031115 .097155
+bezier .274723E-01 .104153 .342159E-01 .113707 .036195 .121285
+bezier .427564E-01 .135735 .530791E-01 .15078 .06985 .15367
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="j" !-------------- Beginning of new char.
+dfont wid=.306665 hei=.655359 dep=.194445 italic=.144673
+set path ! start of curve
+newpath
+! start of curve
+amove .116205 .22987
+bezier .130091 .226725 .12638 .207124 .114935 .2032
+aline .111125 .20193
+aline .10541 .20193
+bezier .893924E-01 .20589 .973805E-01 .229104 .111125 .22987
+closepath
+! end of curve
+
+! start of curve
+amove .086995 .15367
+bezier .107105 .151762 .116313 .128919 .111125 .11176
+aline .07747 -.02286
+bezier .686376E-01 -.558862E-01 .282055E-01 -.857976E-01 -.004445 -.06731
+bezier -.193552E-01 -.574638E-01 -.102256E-01 -.310719E-01 .008255 -.03429
+bezier .239733E-01 -.377535E-01 .167241E-01 -.608923E-01 .003175 -.06223
+bezier .232246E-01 -.746986E-01 .434714E-01 -.535008E-01 .050165 -.03556
+aline .051435 -.03302
+aline .05207 -.031115
+aline .052705 -.029845
+aline .055245 -.022225
+aline .09017 .117475
+bezier .921826E-01 .126356 .954191E-01 .140915 .08509 .146685
+bezier .586822E-01 .146668 .481432E-01 .117395 .038735 .097155
+aline .037465 .09652
+aline .03175 .09652
+aline .031115 .097155
+aline .029845 .09779
+bezier .339876E-01 .11917 .481695E-01 .139742 .06731 .150495
+aline .069215 .15113
+aline .070485 .151765
+aline .07239 .1524
+aline .07493 .153035
+aline .078105 .15367
+aline .086995 .15367
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="k" !-------------- Beginning of new char.
+dfont wid=.459997 hei=.694445 dep=0 italic=.107638
+set path ! start of curve
+newpath
+! start of curve
+amove .104775 .24257
+aline .106045 .241935
+aline .107315 .239395
+aline .107315 .23876
+aline .707231E-01 .923925E-01
+aline .710293E-01 .911679E-01
+bezier .101701 .105295 .114093 .147094 .14986 .15367
+bezier .163845 .156899 .179824 .14427 .175895 .130175
+bezier .178011 .115139 .151981 .106088 .14732 .12192
+aline .14732 .127635
+aline .147955 .130175
+aline .14986 .133985
+aline .15494 .139065
+aline .15748 .140335
+aline .162814 .142113
+bezier .155776 .151853 .140562 .143863 .13208 .13843
+bezier .112987 .123024 .998081E-01 .100754 .795337E-01 .866775E-01
+bezier .970069E-01 .833651E-01 .121566 .768021E-01 .12573 .05588
+bezier .128417 .038065 .114692 .206064E-01 .125095 .004445
+bezier .138543 -.293582E-02 .148662 .135347E-01 .1524 .024765
+aline .15494 .032385
+aline .155575 .034925
+aline .15621 .03683
+aline .156845 .03937
+aline .15748 .041275
+aline .159385 .048895
+aline .16002 .0508
+aline .161925 .052705
+aline .16764 .052705
+aline .16891 .05207
+aline .17018 .0508
+bezier .165899 .295207E-01 .158822 .100732E-02 .13462 -.004445
+bezier .113361 -.818728E-02 .974911E-01 .148977E-01 .102235 .033655
+bezier .103306 .446626E-01 .10742 .573354E-01 .09779 .06604
+bezier .909513E-01 .744638E-01 .767337E-01 .796474E-01 .06731 .07874
+aline .048895 .00508
+bezier .470278E-01 -.629919E-02 .262627E-01 -.869947E-02 .02667 .00508
+aline .027305 .008255
+aline .067945 .170815
+aline .079375 .216535
+aline .08001 .21717
+aline .08001 .220345
+aline .080391 .22225
+aline .08001 .224155
+aline .079375 .22606
+aline .07747 .226695
+aline .07493 .22733
+aline .074295 .227965
+aline .06985 .227965
+aline .069215 .2286
+aline .056515 .2286
+aline .05461 .230505
+aline .05461 .234315
+aline .055245 .236855
+aline .05715 .23876
+bezier .731098E-01 .239825 .887556E-01 .241649 .104775 .24257
+closepath
+! end of curve
+
+! start of curve
+amove .070485 .09017
+aline .07112 .090805
+aline .070485 .09144
+aline .06985 .090805
+aline .070485 .09017
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="l" !-------------- Beginning of new char.
+dfont wid=.255554 hei=.694445 dep=0 italic=.103334
+dfont fby="l" kadd=.0511112
+set path ! start of curve
+newpath
+! start of curve
+amove .104775 .24257
+aline .106045 .241935
+aline .107315 .239395
+aline .107315 .23876
+aline .066675 .0762
+aline .05588 .03302
+bezier .537068E-01 .231564E-01 .049625 .85486E-02 .06096 .00254
+bezier .760557E-01 .321738E-02 .790175E-01 .225657E-01 .083185 .03429
+aline .08382 .036195
+aline .086995 .048895
+aline .08763 .0508
+aline .089535 .052705
+aline .09525 .052705
+aline .09652 .05207
+aline .09779 .0508
+bezier .934472E-01 .306123E-01 .896069E-01 .227328E-02 .066675 -.004445
+bezier .458572E-01 -.812466E-02 .285585E-01 .136921E-01 .03429 .03302
+aline .03429 .036195
+aline .07493 .198755
+aline .079375 .216535
+aline .08001 .21717
+aline .08001 .220345
+aline .080391 .22225
+aline .08001 .224155
+aline .079375 .22606
+aline .07747 .226695
+aline .07493 .22733
+aline .074295 .227965
+aline .06985 .227965
+aline .069215 .2286
+aline .056515 .2286
+aline .05461 .230505
+aline .05461 .234315
+aline .055245 .236855
+aline .05715 .23876
+bezier .713523E-01 .23998 .857282E-01 .240781 .099695 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="m" !-------------- Beginning of new char.
+dfont wid=.817774 hei=.430555 dep=0 italic=.0767136
+set path ! start of curve
+newpath
+! start of curve
+amove .069215 .15367
+bezier .833153E-01 .152367 .940021E-01 .139142 .094615 .12573
+bezier .111144 .150552 .149538 .164836 .17399 .14351
+bezier .179656 .138188 .180631 .129696 .18288 .12319
+bezier .198902 .149824 .240047 .166298 .264795 .14224
+bezier .281237 .115493 .264982 .841825E-01 .257175 .056515
+bezier .252882 .396797E-01 .239607 .217834E-01 .24638 .00508
+bezier .256722 -.002646 .27014 .103963E-01 .27432 .02032
+bezier .281082 .299799E-01 .281645 .430237E-01 .287655 .052705
+aline .29337 .052705
+aline .29464 .05207
+aline .29591 .0508
+bezier .291734 .263792E-01 .276838 -.623285E-02 .24765 -.004445
+bezier .225431 -.215226E-02 .220543 .251231E-01 .229235 .04191
+bezier .238524 .713583E-01 .253197 .1017 .250825 .13208
+bezier .249127 .141647 .23946 .149658 .22987 .14605
+bezier .204454 .142808 .189042 .118371 .179705 .09652
+aline .156845 .00508
+bezier .155103 -.633444E-02 .133929 -.869333E-02 .13462 .00508
+aline .135255 .008255
+aline .15875 .102235
+bezier .161984 .116125 .165921 .134305 .153035 .14478
+bezier .128677 .152652 .106478 .130052 .095885 .109855
+aline .09017 .098425
+aline .089535 .09652
+aline .066675 .00508
+bezier .649329E-01 -.633444E-02 .437594E-01 -.869333E-02 .04445 .00508
+aline .045085 .008255
+aline .07239 .117475
+bezier .744026E-01 .126356 .776391E-01 .140915 .06731 .146685
+bezier .051382 .146278 .481593E-01 .125941 .043815 .113665
+aline .04318 .11176
+aline .040005 .09906
+aline .03937 .09779
+aline .038735 .097155
+aline .037465 .09652
+aline .03175 .09652
+aline .031115 .097155
+aline .029845 .09779
+bezier .331115E-01 .117909 .377613E-01 .14403 .05842 .153035
+aline .061595 .15367
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="n" !-------------- Beginning of new char.
+dfont wid=.56222 hei=.430555 dep=0 italic=.0767136
+dfont fby=39 kadd=-.102221
+set path ! start of curve
+newpath
+! start of curve
+amove .069215 .15367
+bezier .833153E-01 .152367 .940021E-01 .139142 .094615 .12573
+bezier .111006 .151033 .150961 .165367 .174625 .14224
+bezier .191067 .115493 .174812 .841825E-01 .167005 .056515
+bezier .162712 .396797E-01 .149437 .217834E-01 .15621 .00508
+bezier .166552 -.264599E-02 .17997 .103963E-01 .18415 .02032
+bezier .190912 .299799E-01 .191475 .430237E-01 .197485 .052705
+aline .2032 .052705
+aline .20447 .05207
+aline .20574 .0508
+bezier .201564 .263792E-01 .186668 -.623288E-02 .15748 -.004445
+bezier .135261 -.215226E-02 .130373 .251231E-01 .139065 .04191
+bezier .148354 .713583E-01 .163027 .1017 .160655 .13208
+bezier .158957 .141647 .14929 .149658 .1397 .14605
+bezier .114284 .142808 .988725E-01 .118371 .089535 .09652
+aline .066675 .00508
+bezier .649329E-01 -.633444E-02 .437594E-01 -.869333E-02 .04445 .00508
+aline .045085 .008255
+aline .07239 .117475
+bezier .744026E-01 .126356 .776391E-01 .140915 .06731 .146685
+bezier .051382 .146278 .481593E-01 .125941 .043815 .113665
+aline .04318 .11176
+aline .040005 .09906
+aline .03937 .09779
+aline .038735 .097155
+aline .037465 .09652
+aline .03175 .09652
+aline .031115 .097155
+aline .029845 .09779
+bezier .331115E-01 .117909 .377613E-01 .14403 .05842 .153035
+aline .061595 .15367
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="o" !-------------- Beginning of new char.
+dfont wid=.511108 hei=.430555 dep=0 italic=.0631237
+dfont fby="a" kadd=-.0511112
+dfont fby="c" kadd=-.0511112
+dfont fby="d" kadd=-.0511112
+dfont fby="e" kadd=-.0511112
+dfont fby="g" kadd=-.0511112
+dfont fby="o" kadd=-.0511112
+dfont fby="q" kadd=-.0511112
+set path ! start of curve
+newpath
+! start of curve
+amove .13335 .15367
+bezier .158232 .151944 .177464 .1279 .178435 .10414
+bezier .182596 .516754E-01 .139254 -.644742E-02 .08382 -.004445
+bezier .539462E-01 -.220101E-02 .348975E-01 .304661E-01 .03937 .057785
+bezier .411924E-01 .105926 .829367E-01 .155586 .13335 .15367
+closepath
+! end of curve
+
+! start of curve
+amove .12319 .14605
+bezier .081626 .136 .709973E-01 .872698E-01 .0635 .051435
+bezier .606182E-01 .332844E-01 .648569E-01 .71957E-02 .08636 .00254
+bezier .121037 .299724E-02 .139792 .393968E-01 .14732 .069215
+bezier .153105 .916979E-01 .160447 .115888 .146685 .13716
+aline .141605 .14224
+aline .136525 .14478
+aline .13462 .145415
+aline .13208 .14605
+aline .131445 .146685
+aline .123825 .146685
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="p" !-------------- Beginning of new char.
+dfont wid=.511108 hei=.430555 dep=.194445 italic=.0631237
+dfont fby="a" kadd=-.0511112
+dfont fby="c" kadd=-.0511112
+dfont fby="d" kadd=-.0511112
+dfont fby="e" kadd=-.0511112
+dfont fby="g" kadd=-.0511112
+dfont fby="o" kadd=-.0511112
+dfont fby="q" kadd=-.0511112
+set path ! start of curve
+newpath
+! start of curve
+amove .069215 .15367
+bezier .818925E-01 .152464 .918986E-01 .141577 .942975E-01 .129699
+bezier .108871 .147444 .136362 .163075 .158115 .14732
+bezier .183145 .129747 .181701 .947836E-01 .174625 .06858
+bezier .163874 .328982E-01 .134868 -.498079E-02 .094615 -.004445
+bezier .829824E-01 -.357652E-02 .747301E-01 .676142E-02 .691243E-01 .148771E-01
+aline .05334 -.04826
+aline .052705 -.048895
+aline .052705 -.05207
+aline .523081E-01 -.536575E-01
+bezier .567819E-01 -.629046E-01 .702934E-01 -.563667E-01 .078105 -.060325
+aline .07874 -.061595
+aline .07874 -.0635
+aline .078105 -.06604
+aline .076835 -.06858
+bezier .053735 -.06921 .301601E-01 -.672368E-01 .006985 -.069215
+aline .00508 -.06731
+aline .00508 -.064135
+aline .005715 -.061595
+bezier .113697E-01 -.555165E-01 .230396E-01 -.625134E-01 .028575 -.05461
+aline .029845 -.05207
+aline .03048 -.050165
+aline .07112 .112395
+bezier .737394E-01 .122702 .774986E-01 .135073 .070485 .14478
+bezier .593862E-01 .15173 .515055E-01 .136512 .04826 .127635
+aline .04445 .116205
+aline .043815 .113665
+aline .04318 .11176
+aline .040005 .09906
+aline .03937 .09779
+aline .038735 .097155
+aline .037465 .09652
+aline .03175 .09652
+aline .031115 .097155
+aline .029845 .09779
+bezier .331115E-01 .117909 .377613E-01 .14403 .05842 .153035
+aline .061595 .15367
+closepath
+! end of curve
+
+! start of curve
+amove .13208 .14605
+bezier .113747 .141441 .101018 .125033 .09271 .10922
+aline .07493 .0381
+bezier .738647E-01 .234129E-01 .834076E-01 .103746E-03 .102235 .00254
+bezier .135898 .152653E-01 .14386 .554554E-01 .151765 .086995
+bezier .156185 .105228 .159997 .127852 .14605 .14351
+aline .14224 .145415
+aline .140335 .14605
+aline .1397 .146685
+aline .132715 .146685
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="q" !-------------- Beginning of new char.
+dfont wid=.459997 hei=.430555 dep=.194445 italic=.0884724
+set path ! start of curve
+newpath
+! start of curve
+amove .12319 .15367
+bezier .135588 .151993 .144242 .142116 .149225 .131445
+bezier .155363 .139714 .161894 .150838 .172085 .15367
+aline .173355 .153035
+aline .174625 .150495
+aline .174625 .14986
+aline .133985 -.0127
+aline .125095 -.04826
+aline .12446 -.048895
+aline .12446 -.05207
+aline .124063 -.536575E-01
+bezier .128537 -.629046E-01 .142048 -.563667E-01 .14986 -.060325
+aline .150495 -.061595
+aline .150495 -.0635
+aline .14986 -.06604
+aline .14859 -.06858
+bezier .123207 -.689917E-01 .973243E-01 -.673895E-01 .071755 -.069215
+aline .070485 -.06858
+aline .069215 -.06604
+aline .069215 -.065405
+aline .06985 -.062865
+aline .070485 -.06096
+aline .07239 -.059055
+bezier .832459E-01 -.585449E-01 .099952 -.616993E-01 .10287 -.047625
+aline .117872 .123825E-01
+aline .117475 .01397
+bezier .102842 -.311917E-02 .075202 -.120294E-01 .056515 .00381
+bezier .302045E-01 .279893E-01 .366312E-01 .687479E-01 .04953 .098425
+bezier .621439E-01 .124088 .842985E-01 .149004 .113665 .15367
+closepath
+! end of curve
+
+! start of curve
+amove .114935 .14605
+bezier .886139E-01 .13753 .780718E-01 .108277 .07112 .08382
+bezier .656612E-01 .587196E-01 .540808E-01 .325695E-01 .06858 .00889
+bezier .815904E-01 -.572294E-02 .102391 .892982E-02 .11176 .020955
+bezier .116799 .026301 .12077 .324166E-01 .12446 .038735
+aline .142875 .112395
+bezier .142645 .126354 .134094 .148986 .11557 .146685
+closepath
+! end of curve
+
+! start of curve
+amove .117475 .01397
+aline .11811 .013335
+aline .118745 .01397
+aline .11811 .014605
+aline .117475 .01397
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="r" !-------------- Beginning of new char.
+dfont wid=.421664 hei=.430555 dep=0 italic=.107638
+dfont fby="a" kadd=-.0511112
+dfont fby="c" kadd=-.0511112
+dfont fby="d" kadd=-.0511112
+dfont fby="e" kadd=-.0511112
+dfont fby="g" kadd=-.0511112
+dfont fby="o" kadd=-.0511112
+dfont fby="q" kadd=-.0511112
+set path ! start of curve
+newpath
+! start of curve
+amove .069215 .15367
+bezier .823299E-01 .152474 .920479E-01 .141045 .094615 .128905
+bezier .108696 .152195 .140571 .161594 .16383 .146685
+bezier .178863 .136904 .169564 .110432 .15113 .113665
+bezier .13562 .11708 .142475 .139543 .155575 .141605
+bezier .135639 .154644 .110566 .140996 .100965 .121285
+aline .10033 .12065
+aline .09906 .11811
+aline .098425 .117475
+aline .09144 .103505
+aline .090805 .1016
+aline .066675 .00508
+bezier .649329E-01 -.633444E-02 .437594E-01 -.869333E-02 .04445 .00508
+aline .045085 .008255
+aline .07239 .117475
+bezier .744026E-01 .126356 .776391E-01 .140915 .06731 .146685
+bezier .051382 .146278 .481593E-01 .125941 .043815 .113665
+aline .04318 .11176
+aline .040005 .09906
+aline .03937 .09779
+aline .038735 .097155
+aline .037465 .09652
+aline .03175 .09652
+aline .031115 .097155
+aline .029845 .09779
+bezier .331115E-01 .117909 .377613E-01 .14403 .05842 .153035
+aline .061595 .15367
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="s" !-------------- Beginning of new char.
+dfont wid=.408887 hei=.430555 dep=0 italic=.0820827
+set path ! start of curve
+newpath
+! start of curve
+amove .11557 .15367
+bezier .133544 .152934 .151598 .135731 .14605 .11684
+aline .145415 .1143
+aline .144145 .11176
+aline .1397 .107315
+aline .13716 .106045
+aline .135255 .10541
+aline .12827 .10541
+bezier .115863 .110153 .123086 .128564 .13462 .128905
+bezier .135885 .135777 .126009 .144035 .11811 .145415
+bezier .100175 .151028 .779168E-01 .139351 .074295 .11938
+bezier .697835E-01 .106413 .821213E-01 .940843E-01 .09525 .09398
+bezier .115392 .920645E-01 .137112 .789687E-01 .137795 .05715
+bezier .139545 .249455E-01 .110554 -.338336E-02 .079375 -.004445
+bezier .059373 -.623204E-02 .331566E-01 .710788E-04 .027305 .022225
+bezier .249954E-01 .330662E-01 .282926E-01 .489046E-01 .04191 .0508
+bezier .512553E-01 .529637E-01 .588393E-01 .437912E-01 .05588 .03556
+bezier .543528E-01 .271039E-01 .450707E-01 .230425E-01 .382587E-01 .219075E-01
+bezier .538287E-01 -.103243E-01 .108808 -.382236E-03 .11684 .033655
+bezier .123733 .503576E-01 .107949 .067179 .090805 .06731
+bezier .729959E-01 .687417E-01 .543253E-01 .806237E-01 .053975 .099695
+bezier .528327E-01 .126854 .756771E-01 .152305 .10287 .15367
+aline .11557 .15367
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="t" !-------------- Beginning of new char.
+dfont wid=.33222 hei=.61508 dep=0 italic=.094861
+set path ! start of curve
+newpath
+! start of curve
+amove .1016 .21844
+aline .103505 .217805
+aline .104775 .21717
+aline .107315 .21463
+aline .10795 .21336
+aline .108585 .21082
+aline .108585 .208915
+aline .10795 .20574
+aline .094615 .1524
+aline .941917E-01 .15113
+aline .094615 .14986
+aline .128905 .14986
+aline .13081 .147955
+aline .13081 .14478
+aline .130175 .14224
+aline .12954 .14097
+aline .128905 .140335
+aline .127635 .1397
+aline .09144 .1397
+aline .06477 .03302
+bezier .625968E-01 .231564E-01 .058515 .85486E-02 .06985 .00254
+bezier .953333E-01 .279394E-02 .106409 .305799E-01 .114935 .0508
+aline .11684 .052705
+aline .122555 .052705
+aline .123825 .05207
+aline .125095 .0508
+bezier .118681 .268674E-01 .102265 .778853E-03 .0762 -.004445
+bezier .602892E-01 -.692066E-02 .439733E-01 .463265E-02 .042545 .020955
+aline .042545 .032385
+aline .04318 .03302
+aline .04318 .036195
+aline .06858 .137795
+aline .690563E-01 .138747
+aline .06858 .1397
+aline .03429 .1397
+aline .032385 .141605
+aline .032385 .145415
+aline .03302 .14732
+aline .033655 .14859
+aline .03429 .149225
+aline .03556 .14986
+aline .07112 .14986
+aline .071755 .150495
+aline .08636 .208915
+aline .086995 .21082
+aline .08763 .21209
+aline .088265 .212725
+aline .0889 .213995
+aline .089535 .21463
+aline .090805 .215265
+aline .092075 .216535
+aline .094615 .217805
+aline .09652 .21844
+aline .1016 .21844
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="u" !-------------- Beginning of new char.
+dfont wid=.536664 hei=.430555 dep=0 italic=.0767136
+set path ! start of curve
+newpath
+! start of curve
+amove .078105 .15367
+bezier .989184E-01 .151163 .104837 .126361 .097155 .109855
+bezier .876367E-01 .801122E-01 .715889E-01 .491062E-01 .076835 .018415
+bezier .788975E-01 .431015E-02 .954023E-01 -.133294E-02 .10668 .00508
+bezier .119349 .107186E-01 .129701 .230697E-01 .132715 .036195
+aline .15875 .140335
+bezier .160492 .151749 .181666 .154108 .180975 .140335
+aline .18034 .13716
+aline .154305 .03302
+bezier .152132 .231564E-01 .14805 .85486E-02 .159385 .00254
+bezier .174754 .295029E-02 .177907 .022468 .182245 .03429
+aline .18288 .03683
+aline .183515 .038735
+aline .186055 .048895
+aline .18669 .0508
+aline .188595 .052705
+aline .19431 .052705
+aline .19558 .05207
+aline .19685 .0508
+bezier .192463 .03046 .188369 .213025E-02 .1651 -.004445
+bezier .150874 -.643097E-02 .13656 .265064E-02 .132715 .01651
+bezier .116756 -.901106E-02 .731413E-01 -.134108E-01 .05842 .01524
+bezier .460867E-01 .542406E-01 .720434E-01 .937127E-01 .08128 .131445
+aline .08128 .140335
+bezier .764568E-01 .153452 .590603E-01 .143402 .05461 .13462
+bezier .461901E-01 .123783 .438237E-01 .1095 .038735 .097155
+aline .037465 .09652
+aline .03175 .09652
+aline .031115 .097155
+bezier .274723E-01 .104153 .342159E-01 .113707 .036195 .121285
+bezier .427564E-01 .135735 .530791E-01 .15078 .06985 .15367
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="v" !-------------- Beginning of new char.
+dfont wid=.459997 hei=.430555 dep=0 italic=.107638
+set path ! start of curve
+newpath
+! start of curve
+amove .078105 .15367
+bezier .989184E-01 .151163 .104837 .126361 .097155 .109855
+bezier .879744E-01 .799191E-01 .703182E-01 .484598E-01 .078105 .01778
+bezier .834859E-01 -.796675E-03 .107786 -.846496E-03 .120015 .010795
+bezier .141902 .032893 .149347 .657514E-01 .156845 .094615
+bezier .158549 .109277 .152573 .123141 .142875 .133985
+bezier .138646 .148608 .160557 .161714 .169545 .147955
+bezier .178712 .123012 .167374 .973391E-01 .161925 .071755
+bezier .152134 .412968E-01 .138563 .288219E-02 .103505 -.004445
+bezier .821974E-01 -.731537E-02 .559516E-01 .568695E-02 .05588 .029845
+bezier .522342E-01 .648243E-01 .732448E-01 .983742E-01 .08128 .131445
+aline .08128 .140335
+bezier .764568E-01 .153452 .590603E-01 .143402 .05461 .13462
+bezier .461901E-01 .123783 .438237E-01 .1095 .038735 .097155
+aline .037465 .09652
+aline .03175 .09652
+aline .031115 .097155
+bezier .274723E-01 .104153 .342159E-01 .113707 .036195 .121285
+bezier .427564E-01 .135735 .530791E-01 .15078 .06985 .15367
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="w" !-------------- Beginning of new char.
+dfont wid=.664441 hei=.430555 dep=0 italic=.107638
+dfont fby="l" kadd=.0511112
+set path ! start of curve
+newpath
+! start of curve
+amove .078105 .15367
+bezier .989184E-01 .151163 .104837 .126361 .097155 .109855
+bezier .881025E-01 .798156E-01 .700075E-01 .490087E-01 .07874 .01778
+bezier .845409E-01 -.131492E-04 .111145 -.282066E-02 .120015 .01397
+bezier .128162 .241758E-01 .133016 .366826E-01 .13208 .04953
+aline .133985 .059055
+aline .154305 .140335
+bezier .156047 .151749 .177221 .154108 .17653 .140335
+aline .175895 .13716
+aline .15494 .05334
+bezier .151043 .374133E-01 .148265 .157193E-01 .164465 .00508
+bezier .184405 -.441068E-02 .203293 .145128E-01 .20955 .032385
+bezier .219046 .560693E-01 .228008 .815037E-01 .2286 .10668
+bezier .227079 .116631 .221144 .126132 .21463 .133985
+bezier .210401 .148608 .232312 .161714 .2413 .147955
+bezier .250445 .123018 .23916 .973301E-01 .23368 .071755
+bezier .225435 .427741E-01 .215939 .557934E-02 .183515 -.00381
+bezier .16546 -.689974E-02 .142454 -.10446E-02 .13462 .01778
+bezier .126612 .38836E-02 .110766 -.833857E-02 .09398 -.00381
+bezier .073658 -.422168E-02 .554797E-01 .128913E-01 .055245 .03302
+bezier .542617E-01 .670233E-01 .730611E-01 .992668E-01 .08128 .131445
+aline .08128 .140335
+bezier .764568E-01 .153452 .590603E-01 .143402 .05461 .13462
+bezier .461901E-01 .123783 .438237E-01 .1095 .038735 .097155
+aline .037465 .09652
+aline .03175 .09652
+aline .031115 .097155
+bezier .274723E-01 .104153 .342159E-01 .113707 .036195 .121285
+bezier .427564E-01 .135735 .530791E-01 .15078 .06985 .15367
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="x" !-------------- Beginning of new char.
+dfont wid=.463887 hei=.430555 dep=0 italic=.120417
+set path ! start of curve
+newpath
+! start of curve
+amove .088265 .15367
+bezier .101349 .151937 .11262 .1426 .11684 .130175
+bezier .125845 .149194 .149268 .159761 .16891 .150495
+bezier .186488 .145033 .186499 .117054 .16764 .113665
+aline .161925 .113665
+bezier .146207 .117129 .153456 .140267 .167005 .141605
+bezier .153217 .152526 .133696 .144361 .127635 .128905
+aline .127 .12827
+aline .125095 .12446
+aline .12446 .122555
+aline .123825 .121285
+aline .12319 .11938
+aline .122555 .11811
+aline .121285 .1143
+aline .103505 .04318
+bezier .993768E-01 .295861E-01 .980336E-01 .80922E-02 .114935 .00254
+bezier .140648 .002274 .155113 .287967E-01 .16129 .0508
+aline .163195 .052705
+aline .16891 .052705
+aline .17018 .05207
+aline .17145 .0508
+bezier .166858 .199902E-01 .13634 -.141735E-01 .10287 -.001905
+bezier .936887E-01 .154621E-02 .873821E-01 .110936E-01 .829733E-01 .179917E-01
+bezier .739041E-01 .398361E-03 .525049E-01 -.100865E-01 .033655 -.001905
+bezier .171831E-01 .215439E-02 .013105 .270865E-01 .02921 .03429
+bezier .372719E-01 .388453E-01 .502288E-01 .032771 .047625 .023495
+bezier .483717E-01 .154777E-01 .410401E-01 .893276E-02 .033655 .00762
+bezier .471235E-01 -.306752E-02 .661683E-01 .459157E-02 .07239 .019685
+aline .073025 .02032
+aline .075565 .0254
+aline .0762 .027305
+aline .076835 .028575
+aline .079375 .036195
+aline .097155 .107315
+bezier .101306 .120446 .102044 .141148 .085725 .146685
+bezier .591253E-01 .147034 .459455E-01 .118953 .038735 .097155
+aline .037465 .09652
+aline .03175 .09652
+aline .031115 .097155
+aline .029845 .09779
+bezier .328105E-01 .123521 .052847 .149099 .07874 .15367
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="y" !-------------- Beginning of new char.
+dfont wid=.485553 hei=.430555 dep=.194445 italic=.0884724
+set path ! start of curve
+newpath
+! start of curve
+amove .078105 .15367
+bezier .989184E-01 .151163 .104837 .126361 .097155 .109855
+bezier .876367E-01 .801122E-01 .715889E-01 .491062E-01 .076835 .018415
+bezier .788975E-01 .431015E-02 .954023E-01 -.133294E-02 .10668 .00508
+bezier .118312 .982223E-02 .126103 .202744E-01 .131445 .031115
+aline .15875 .140335
+bezier .160492 .151749 .181666 .154108 .180975 .140335
+aline .18034 .13716
+aline .14478 -.00508
+bezier .134188 -.423667E-01 .986309E-01 -.797672E-01 .05715 -.071755
+bezier .369378E-01 -.678603E-01 .265598E-01 -.393788E-01 .04191 -.024765
+bezier .488036E-01 -.194784E-01 .611876E-01 -.194856E-01 .064135 -.02921
+bezier .666948E-01 -.398587E-01 .559408E-01 -.506396E-01 .046355 -.048895
+bezier .486105E-01 -.665889E-01 .730068E-01 -.705115E-01 .085725 -.06096
+bezier .109079 -.463991E-01 .120217 -.177092E-01 .125095 .008255
+bezier .105256 -.140977E-01 .576981E-01 -.683372E-02 .05588 .02667
+bezier .510833E-01 .618063E-01 .728024E-01 .973682E-01 .08128 .131445
+aline .08128 .140335
+bezier .764568E-01 .153452 .590603E-01 .143402 .05461 .13462
+bezier .461901E-01 .123783 .438237E-01 .1095 .038735 .097155
+aline .037465 .09652
+aline .03175 .09652
+aline .031115 .097155
+bezier .274723E-01 .104153 .342159E-01 .113707 .036195 .121285
+bezier .427564E-01 .135735 .530791E-01 .15078 .06985 .15367
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="z" !-------------- Beginning of new char.
+dfont wid=.408887 hei=.430555 dep=0 italic=.122917
+set path ! start of curve
+newpath
+! start of curve
+amove .09525 .15367
+bezier .112728 .151917 .114916 .123284 .133985 .12827
+bezier .144589 .133135 .147041 .146299 .15494 .15367
+aline .16129 .15367
+bezier .166491 .148007 .157188 .142132 .155575 .136525
+bezier .138148 .111653 .115962 .898401E-01 .093345 .069215
+aline .064135 .040005
+aline .0635 .038735
+aline .05842 .033655
+aline .057785 .032385
+aline .05461 .02921
+bezier .075537 .328659E-01 .936364E-01 .996449E-02 .1143 .019685
+bezier .128959 .248871E-01 .137369 .385899E-01 .142875 .05207
+aline .144145 .052705
+aline .149225 .052705
+aline .150495 .05207
+aline .15113 .051435
+bezier .149451 .285981E-01 .132348 .645899E-02 .111125 -.00254
+bezier .976208E-01 -.827893E-02 .824135E-01 -.215247E-02 .0762 .010795
+bezier .716322E-01 .194853E-01 .603547E-01 .255765E-01 .051435 .01905
+bezier .414249E-01 .143183E-01 .372134E-01 .349242E-02 .03048 -.004445
+aline .02413 -.004445
+bezier .184535E-01 .466054E-03 .027584 .765903E-02 .029845 .0127
+bezier .368166E-01 .236325E-01 .045503 .033329 .053975 .04318
+aline .08382 .073025
+bezier .997693E-01 .876421E-01 .115743 .102775 .12954 .11938
+bezier .110398 .120838 .911094E-01 .140978 .07239 .127
+bezier .650581E-01 .124149 .635394E-01 .115442 .059055 .11049
+aline .052705 .11049
+aline .051435 .111125
+bezier .514199E-01 .130372 .684981E-01 .149526 .08763 .15367
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="{" !-------------- Beginning of new char.
+dfont wid=.511108 hei=.430555 dep=0 italic=.0920792
+set path ! start of curve
+newpath
+! start of curve
+amove .191135 .095885
+aline .192405 .09525
+aline .19304 .094615
+aline .193675 .093345
+aline .193675 .09144
+aline .19304 .09017
+aline .192405 .089535
+aline .191135 .0889
+aline .034925 .0889
+aline .03302 .090805
+aline .03302 .09398
+aline .034925 .095885
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="|" !-------------- Beginning of new char.
+dfont wid=1.02222 hei=.430555 dep=0 italic=.0920792
+set path ! start of curve
+newpath
+! start of curve
+amove .36195 .095885
+aline .36322 .09525
+aline .363855 .094615
+aline .36449 .093345
+aline .36449 .09144
+aline .363855 .09017
+aline .36322 .089535
+aline .36195 .0889
+aline .043815 .0889
+aline .04191 .090805
+aline .04191 .09398
+aline .043815 .095885
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="}" !-------------- Beginning of new char.
+dfont wid=.511108 hei=.694445 dep=0 italic=.1225
+set path ! start of curve
+newpath
+! start of curve
+amove .141605 .243205
+bezier .152275 .240512 .149043 .227297 .14224 .22225
+bezier .128845 .207417 .116037 .192162 .10287 .177165
+aline .09906 .177165
+bezier .899162E-01 .180449 .989099E-01 .188735 .1016 .193675
+bezier .112479 .209856 .1203 .228706 .133985 .24257
+aline .13589 .243205
+closepath
+! end of curve
+
+! start of curve
+amove .19558 .243205
+bezier .20625 .240512 .203018 .227297 .196215 .22225
+bezier .18282 .207417 .170012 .192162 .156845 .177165
+aline .153035 .177165
+bezier .143891 .180449 .152885 .188735 .155575 .193675
+bezier .166454 .209856 .174275 .228706 .18796 .24257
+aline .189865 .243205
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="~" !-------------- Beginning of new char.
+dfont wid=.511108 hei=.667859 dep=0 italic=.115854
+set path ! start of curve
+newpath
+! start of curve
+amove .135255 .23368
+bezier .149464 .231462 .149558 .206602 .165735 .211455
+bezier .177827 .215961 .186939 .22508 .196215 .23368
+aline .198755 .23368
+aline .200025 .233045
+aline .20066 .23241
+aline .201295 .23114
+aline .201295 .2286
+bezier .187278 .216161 .173476 .1984 .153035 .198755
+bezier .138826 .200973 .138732 .225833 .122555 .22098
+bezier .110463 .216474 .101351 .207355 .092075 .198755
+aline .089535 .198755
+aline .088265 .19939
+aline .08763 .200025
+aline .086995 .201295
+aline .086995 .203835
+bezier .994107E-01 .215571 .111433 .228623 .12827 .23368
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=127 !-------------- Beginning of new char.
+dfont wid=.511108 hei=.667859 dep=0 italic=.104744
+set path ! start of curve
+newpath
+! start of curve
+amove .120015 .234315
+bezier .137489 .230023 .131273 .205168 .11684 .201295
+aline .11557 .20066
+aline .11303 .200025
+bezier .984917E-01 .196456 .090014 .215546 .099695 .225425
+aline .10033 .226695
+aline .10287 .229235
+aline .10414 .22987
+aline .104775 .230505
+aline .106045 .23114
+aline .10668 .231775
+aline .10922 .233045
+aline .111125 .23368
+aline .11303 .234315
+closepath
+! end of curve
+
+! start of curve
+amove .182245 .234315
+bezier .198307 .230848 .194827 .208465 .182245 .202565
+bezier .171635 .195072 .15482 .203497 .158115 .21717
+aline .159385 .22098
+aline .160655 .22352
+aline .16129 .224155
+aline .161925 .225425
+aline .167005 .230505
+aline .168275 .23114
+aline .16891 .231775
+aline .17145 .233045
+aline .173355 .23368
+aline .175895 .234315
+closepath
+! end of curve
+
+fill
+dfont endchar
diff --git a/src/fonts/texcmtt.afm b/src/fonts/texcmtt.afm
new file mode 100644
index 0000000..daceb7c
--- /dev/null
+++ b/src/fonts/texcmtt.afm
@@ -0,0 +1,151 @@
+StartFontMetrics 2.0
+Comment Made from TEX tfm file using TFMTOAFM.bas
+FontName CMTT10
+EncodingScheme TEXENCODING
+FullName CMTT10
+FamilyName CMTT10
+Weight Medium
+ItalicAngle 0
+IsFixedPitch false
+UnderlinePosition -97
+UnderlineThickness 73
+FontBBox 0 -300 1001 1001
+CapHeight 729
+XHeight 151
+Descender -219
+Ascender 729
+StartCharMetrics 127
+C 1 ; WX 524 ; N C1 ; B 0 0 524 611 ;
+C 2 ; WX 524 ; N C2 ; B 0 0 524 611 ;
+C 3 ; WX 524 ; N C3 ; B 0 0 524 611 ;
+C 4 ; WX 524 ; N C4 ; B 0 0 524 611 ;
+C 5 ; WX 524 ; N C5 ; B 0 0 524 611 ;
+C 6 ; WX 524 ; N C6 ; B 0 0 524 611 ;
+C 7 ; WX 524 ; N C7 ; B 0 0 524 611 ;
+C 8 ; WX 524 ; N C8 ; B 0 0 524 611 ;
+C 9 ; WX 524 ; N C9 ; B 0 0 524 611 ;
+C 10 ; WX 524 ; N C10 ; B 0 0 524 611 ;
+C 11 ; WX 524 ; N C11 ; B 0 0 524 611 ;
+C 12 ; WX 524 ; N C12 ; B 0 0 524 611 ;
+C 13 ; WX 524 ; N C13 ; B 0 0 524 611 ;
+C 14 ; WX 524 ; N C14 ; B 0 -222 524 388 ;
+C 15 ; WX 524 ; N C15 ; B 0 -222 524 388 ;
+C 16 ; WX 524 ; N C16 ; B 0 0 524 430 ;
+C 17 ; WX 524 ; N C17 ; B 0 -222 524 430 ;
+C 18 ; WX 524 ; N C18 ; B 0 0 524 611 ;
+C 19 ; WX 524 ; N C19 ; B 0 0 524 611 ;
+C 20 ; WX 524 ; N C20 ; B 0 0 524 565 ;
+C 21 ; WX 524 ; N C21 ; B 0 0 524 611 ;
+C 22 ; WX 524 ; N C22 ; B 0 0 524 565 ;
+C 23 ; WX 524 ; N C23 ; B 0 0 524 611 ;
+C 24 ; WX 524 ; N C24 ; B 0 -194 524 0 ;
+C 25 ; WX 524 ; N C25 ; B 0 0 524 611 ;
+C 26 ; WX 524 ; N C26 ; B 0 0 524 430 ;
+C 27 ; WX 524 ; N C27 ; B 0 0 524 430 ;
+C 28 ; WX 524 ; N C28 ; B 0 -111 524 541 ;
+C 29 ; WX 524 ; N C29 ; B 0 0 524 611 ;
+C 30 ; WX 524 ; N C30 ; B 0 0 524 611 ;
+C 31 ; WX 524 ; N C31 ; B 0 -55 524 666 ;
+C 32 ; WX 369 ; N C32 ; B 0 -111 369 219 ;
+C 33 ; WX 524 ; N C33 ; B 0 0 524 611 ;
+C 34 ; WX 524 ; N C34 ; B 0 0 524 611 ;
+C 35 ; WX 524 ; N C35 ; B 0 0 524 611 ;
+C 36 ; WX 524 ; N C36 ; B 0 -83 524 694 ;
+C 37 ; WX 524 ; N C37 ; B 0 -83 524 694 ;
+C 38 ; WX 524 ; N C38 ; B 0 0 524 611 ;
+C 39 ; WX 524 ; N C39 ; B 0 0 524 611 ;
+C 40 ; WX 524 ; N C40 ; B 0 -83 524 694 ;
+C 41 ; WX 524 ; N C41 ; B 0 -83 524 694 ;
+C 42 ; WX 524 ; N C42 ; B 0 0 524 520 ;
+C 43 ; WX 524 ; N C43 ; B 0 81 524 530 ;
+C 44 ; WX 524 ; N C44 ; B 0 -138 524 125 ;
+C 45 ; WX 524 ; N C45 ; B 0 81 524 530 ;
+C 46 ; WX 524 ; N C46 ; B 0 0 524 125 ;
+C 47 ; WX 524 ; N C47 ; B 0 -83 524 694 ;
+C 48 ; WX 524 ; N C48 ; B 0 0 524 611 ;
+C 49 ; WX 524 ; N C49 ; B 0 0 524 611 ;
+C 50 ; WX 524 ; N C50 ; B 0 0 524 611 ;
+C 51 ; WX 524 ; N C51 ; B 0 0 524 611 ;
+C 52 ; WX 524 ; N C52 ; B 0 0 524 611 ;
+C 53 ; WX 524 ; N C53 ; B 0 0 524 611 ;
+C 54 ; WX 524 ; N C54 ; B 0 0 524 611 ;
+C 55 ; WX 524 ; N C55 ; B 0 0 524 611 ;
+C 56 ; WX 524 ; N C56 ; B 0 0 524 611 ;
+C 57 ; WX 524 ; N C57 ; B 0 0 524 611 ;
+C 58 ; WX 524 ; N C58 ; B 0 0 524 430 ;
+C 59 ; WX 524 ; N C59 ; B 0 -138 524 430 ;
+C 60 ; WX 524 ; N C60 ; B 0 56 524 555 ;
+C 61 ; WX 524 ; N C61 ; B 0 196 524 415 ;
+C 62 ; WX 524 ; N C62 ; B 0 56 524 555 ;
+C 63 ; WX 524 ; N C63 ; B 0 0 524 611 ;
+C 64 ; WX 524 ; N C64 ; B 0 0 524 611 ;
+C 65 ; WX 524 ; N A ; B 0 0 524 611 ;
+C 66 ; WX 524 ; N B ; B 0 0 524 611 ;
+C 67 ; WX 524 ; N C ; B 0 0 524 611 ;
+C 68 ; WX 524 ; N D ; B 0 0 524 611 ;
+C 69 ; WX 524 ; N E ; B 0 0 524 611 ;
+C 70 ; WX 524 ; N F ; B 0 0 524 611 ;
+C 71 ; WX 524 ; N G ; B 0 0 524 611 ;
+C 72 ; WX 524 ; N H ; B 0 0 524 611 ;
+C 73 ; WX 524 ; N I ; B 0 0 524 611 ;
+C 74 ; WX 524 ; N J ; B 0 0 524 611 ;
+C 75 ; WX 524 ; N K ; B 0 0 524 611 ;
+C 76 ; WX 524 ; N L ; B 0 0 524 611 ;
+C 77 ; WX 524 ; N M ; B 0 0 524 611 ;
+C 78 ; WX 524 ; N N ; B 0 0 524 611 ;
+C 79 ; WX 524 ; N O ; B 0 0 524 611 ;
+C 80 ; WX 524 ; N P ; B 0 0 524 611 ;
+C 81 ; WX 524 ; N Q ; B 0 -138 524 611 ;
+C 82 ; WX 524 ; N R ; B 0 0 524 611 ;
+C 83 ; WX 524 ; N S ; B 0 0 524 611 ;
+C 84 ; WX 524 ; N T ; B 0 0 524 611 ;
+C 85 ; WX 524 ; N U ; B 0 0 524 611 ;
+C 86 ; WX 524 ; N V ; B 0 0 524 611 ;
+C 87 ; WX 524 ; N W ; B 0 0 524 611 ;
+C 88 ; WX 524 ; N X ; B 0 0 524 611 ;
+C 89 ; WX 524 ; N Y ; B 0 0 524 611 ;
+C 90 ; WX 524 ; N Z ; B 0 0 524 611 ;
+C 91 ; WX 524 ; N C91 ; B 0 -83 524 694 ;
+C 92 ; WX 524 ; N C92 ; B 0 -83 524 694 ;
+C 93 ; WX 524 ; N C93 ; B 0 -83 524 694 ;
+C 94 ; WX 524 ; N C94 ; B 0 0 524 611 ;
+C 95 ; WX 524 ; N C95 ; B 0 -95 524 0 ;
+C 96 ; WX 524 ; N C96 ; B 0 0 524 611 ;
+C 97 ; WX 524 ; N a ; B 0 0 524 430 ;
+C 98 ; WX 524 ; N b ; B 0 0 524 611 ;
+C 99 ; WX 524 ; N c ; B 0 0 524 430 ;
+C 100 ; WX 524 ; N d ; B 0 0 524 611 ;
+C 101 ; WX 524 ; N e ; B 0 0 524 430 ;
+C 102 ; WX 524 ; N f ; B 0 0 524 611 ;
+C 103 ; WX 524 ; N g ; B 0 -222 524 430 ;
+C 104 ; WX 524 ; N h ; B 0 0 524 611 ;
+C 105 ; WX 524 ; N i ; B 0 0 524 611 ;
+C 106 ; WX 524 ; N j ; B 0 -222 524 611 ;
+C 107 ; WX 524 ; N k ; B 0 0 524 611 ;
+C 108 ; WX 524 ; N l ; B 0 0 524 611 ;
+C 109 ; WX 524 ; N m ; B 0 0 524 430 ;
+C 110 ; WX 524 ; N n ; B 0 0 524 430 ;
+C 111 ; WX 524 ; N o ; B 0 0 524 430 ;
+C 112 ; WX 524 ; N p ; B 0 -222 524 430 ;
+C 113 ; WX 524 ; N q ; B 0 -222 524 430 ;
+C 114 ; WX 524 ; N r ; B 0 0 524 430 ;
+C 115 ; WX 524 ; N s ; B 0 0 524 430 ;
+C 116 ; WX 524 ; N t ; B 0 0 524 553 ;
+C 117 ; WX 524 ; N u ; B 0 0 524 430 ;
+C 118 ; WX 524 ; N v ; B 0 0 524 430 ;
+C 119 ; WX 524 ; N w ; B 0 0 524 430 ;
+C 120 ; WX 524 ; N x ; B 0 0 524 430 ;
+C 121 ; WX 524 ; N y ; B 0 -222 524 430 ;
+C 122 ; WX 524 ; N z ; B 0 0 524 430 ;
+C 123 ; WX 524 ; N C123 ; B 0 -83 524 694 ;
+C 124 ; WX 524 ; N C124 ; B 0 -83 524 694 ;
+C 125 ; WX 524 ; N C125 ; B 0 -83 524 694 ;
+C 126 ; WX 524 ; N C126 ; B 0 0 524 611 ;
+C 127 ; WX 524 ; N C127 ; B 0 0 524 611 ;
+EndCharMetrics
+
+StartKernData
+StartKernPairs 0
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/src/fonts/texcmtt.gle b/src/fonts/texcmtt.gle
new file mode 100644
index 0000000..235b207
--- /dev/null
+++ b/src/fonts/texcmtt.gle
@@ -0,0 +1,5655 @@
+dfont file_name="CMTT10"
+dfont font_name="CMTT10"
+dfont design= .35146
+dfont slant= 0
+dfont space= .184515
+dfont stretch= 0
+dfont shrink= 0
+dfont x_hei= .151323
+dfont quad= .369029
+dfont extra_space= .184515
+dfont paint="FILL"
+!------------------ end of main parameters
+dfont char=0 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .164465 .21336
+aline .165735 .212725
+aline .167005 .21209
+aline .16764 .211455
+aline .16891 .21082
+aline .169545 .20955
+aline .17018 .208915
+aline .17145 .206375
+aline .17145 .16637
+bezier .168234 .156536 .151171 .156536 .147955 .16637
+aline .147955 .19177
+aline .14732 .192405
+aline .062865 .192405
+aline .06223 .19177
+aline .06223 .020955
+aline .062865 .02032
+aline .0889 .02032
+aline .09271 .018415
+aline .094615 .01651
+aline .095885 .01397
+aline .095885 .005715
+aline .094615 .003175
+aline .09271 .00127
+aline .0889 -.000635
+aline .01905 -.000635
+bezier .879278E-02 .143465E-02 .879278E-02 .182503E-01 .01905 .02032
+aline .0381 .02032
+aline .038735 .020955
+aline .038735 .19177
+aline .0381 .192405
+aline .01905 .192405
+bezier .879278E-02 .194475 .879278E-02 .21129 .01905 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=1 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .10033 .217805
+bezier .114953 .213239 .112984 .194517 .118745 .18288
+bezier .135959 .123296 .156994 .643454E-01 .172085 .004445
+aline .170815 .001905
+aline .169545 .000635
+aline .167005 -.000635
+aline .01778 -.000635
+aline .01524 .000635
+aline .01397 .001905
+bezier .105518E-01 .139323E-01 .196826E-01 .260592E-01 .02159 .0381
+bezier .401473E-01 .961521E-01 .563889E-01 .155305 .0762 .212725
+aline .07874 .215265
+aline .08255 .21717
+aline .084455 .217805
+closepath
+! end of curve
+
+! start of curve
+amove .09144 .18669
+bezier .762252E-01 .131635 .574926E-01 .769473E-01 .042545 .022225
+aline .14224 .022225
+bezier .126724 .776251E-01 .108222 .135049 .920045E-01 .189512
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=2 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .11049 .21717
+bezier .127632 .216411 .150527 .21194 .156845 .192405
+bezier .163354 .174055 .162735 .155715 .164465 .13716
+aline .164465 .075565
+bezier .161598 .526144E-01 .165403 .249584E-01 .14732 .00635
+bezier .136876 -.235565E-02 .122714 -.312107E-02 .11049 -.004445
+aline .074295 -.004445
+bezier .571528E-01 -.368601E-02 .342577E-01 .78462E-03 .02794 .02032
+bezier .214311E-01 .386695E-01 .220499E-01 .570095E-01 .02032 .075565
+aline .02032 .13716
+bezier .231865E-01 .160111 .193821E-01 .187767 .037465 .206375
+bezier .047909 .215081 .620708E-01 .215846 .074295 .21717
+aline .11049 .21717
+closepath
+! end of curve
+
+! start of curve
+amove .08001 .19558
+bezier .660501E-01 .196121 .501166E-01 .187642 .04826 .172085
+bezier .448599E-01 .159702 .450111E-01 .147281 .043815 .13462
+aline .043815 .078105
+bezier .460419E-01 .600686E-01 .434761E-01 .390061E-01 .05715 .02413
+bezier .748507E-01 .133717E-01 .977061E-01 .154484E-01 .11684 .01905
+bezier .137841 .236346E-01 .138233 .486857E-01 .140335 .06477
+aline .140335 .07747
+aline .14097 .078105
+aline .14097 .13462
+bezier .138743 .152656 .141309 .173719 .127635 .188595
+bezier .113501 .197914 .960967E-01 .196743 .08001 .19558
+closepath
+! end of curve
+
+! start of curve
+amove .073025 .128905
+aline .075565 .12827
+aline .078105 .127
+aline .080645 .12446
+aline .08128 .12319
+aline .081915 .121285
+aline .08255 .11811
+aline .102235 .11811
+bezier .10186 .131043 .123298 .133156 .126365 .121285
+aline .126365 .09144
+bezier .123298 .795686E-01 .10186 .816822E-01 .102235 .094615
+aline .08255 .094615
+bezier .829248E-01 .816822E-01 .614866E-01 .795686E-01 .05842 .09144
+aline .05842 .121285
+aline .059055 .12319
+aline .05969 .12446
+aline .06223 .127
+aline .06477 .12827
+aline .06731 .128905
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=3 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .100965 .217805
+bezier .114619 .213099 .111971 .195418 .116205 .18415
+bezier .129007 .129563 .141644 .749388E-01 .154305 .02032
+aline .16637 .02032
+bezier .176677 .182331E-01 .176677 .145194E-02 .16637 -.000635
+aline .11557 -.000635
+bezier .105263 .145194E-02 .105263 .182331E-01 .11557 .02032
+aline .128905 .02032
+bezier .11782 .765535E-01 .102508 .134208 .092075 .189865
+bezier .830209E-01 .133694 .665511E-01 .766405E-01 .05588 .02032
+aline .069215 .02032
+bezier .795224E-01 .182331E-01 .795224E-01 .145194E-02 .069215 -.000635
+aline .018415 -.000635
+bezier .810756E-02 .145194E-02 .810756E-02 .182331E-01 .018415 .02032
+aline .03048 .02032
+bezier .459744E-01 .843563E-01 .590575E-01 .14927 .0762 .212725
+aline .079375 .2159
+aline .081915 .21717
+aline .08382 .217805
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=4 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .16383 .21336
+aline .1651 .212725
+aline .16637 .21209
+aline .167005 .211455
+aline .168275 .21082
+aline .16891 .20955
+aline .169545 .208915
+aline .170815 .206375
+aline .170815 .186055
+bezier .167599 .176221 .150536 .176221 .14732 .186055
+aline .14732 .19304
+aline .146685 .193675
+aline .0381 .193675
+aline .037465 .19304
+aline .037465 .186055
+bezier .342486E-01 .176221 .171864E-01 .176221 .01397 .186055
+aline .01397 .20574
+aline .014605 .207645
+aline .01524 .208915
+aline .018415 .21209
+aline .019685 .212725
+aline .02159 .21336
+closepath
+! end of curve
+
+! start of curve
+amove .05461 .13335
+aline .056515 .132715
+aline .059055 .131445
+aline .061595 .128905
+aline .06223 .127635
+aline .062865 .12573
+aline .062865 .121285
+aline .0635 .12065
+aline .121285 .12065
+aline .12192 .121285
+bezier .118885 .135075 .142436 .138195 .145415 .12573
+aline .145415 .095885
+bezier .142436 .834197E-01 .118885 .865405E-01 .12192 .10033
+aline .121285 .100965
+aline .0635 .100965
+aline .062865 .10033
+bezier .659004E-01 .865405E-01 .423492E-01 .834197E-01 .03937 .095885
+aline .03937 .12573
+aline .040005 .127635
+aline .04064 .128905
+aline .04318 .131445
+aline .04572 .132715
+aline .047625 .13335
+closepath
+! end of curve
+
+! start of curve
+amove .028575 .03556
+aline .029845 .034925
+aline .031115 .03429
+aline .03175 .033655
+aline .03302 .03302
+aline .033655 .03175
+aline .03429 .031115
+aline .03556 .028575
+aline .03556 .019685
+aline .036195 .01905
+aline .14859 .01905
+aline .149225 .019685
+aline .149225 .028575
+bezier .152441 .384087E-01 .169504 .384087E-01 .17272 .028575
+aline .17272 .00635
+aline .17145 .00381
+aline .170815 .003175
+aline .17018 .001905
+aline .16891 .00127
+aline .168275 .000635
+aline .165735 -.000635
+aline .019685 -.000635
+aline .01778 0
+aline .01651 .000635
+aline .013335 .00381
+aline .0127 .00508
+aline .012065 .006985
+aline .012065 .028575
+aline .013335 .031115
+aline .01397 .03175
+aline .014605 .03302
+aline .015875 .033655
+aline .01651 .03429
+aline .01778 .034925
+aline .01905 .03556
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=5 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .169545 .21336
+aline .170815 .212725
+aline .173355 .211455
+aline .174625 .210185
+aline .17653 .206375
+aline .17653 .19939
+aline .174625 .19558
+aline .173355 .19431
+aline .169545 .192405
+aline .154305 .192405
+aline .15367 .19177
+aline .15367 .020955
+aline .154305 .02032
+aline .169545 .02032
+aline .173355 .018415
+aline .174625 .017145
+aline .17653 .013335
+aline .17653 .00635
+aline .174625 .00254
+aline .173355 .00127
+aline .169545 -.000635
+aline .1143 -.000635
+aline .11049 .00127
+aline .10922 .00254
+aline .107315 .00635
+aline .107315 .013335
+aline .10922 .017145
+aline .11049 .018415
+aline .1143 .02032
+aline .12954 .02032
+aline .130175 .020955
+aline .130175 .19177
+aline .12954 .192405
+aline .055245 .192405
+aline .05461 .19177
+aline .05461 .020955
+aline .055245 .02032
+aline .070485 .02032
+aline .074295 .018415
+aline .075565 .017145
+aline .07747 .013335
+aline .07747 .00635
+aline .075565 .00254
+aline .074295 .00127
+aline .070485 -.000635
+aline .01524 -.000635
+aline .01143 .00127
+aline .01016 .00254
+aline .008255 .00635
+aline .008255 .013335
+aline .01016 .017145
+aline .01143 .018415
+aline .01524 .02032
+aline .03048 .02032
+aline .031115 .020955
+aline .031115 .19177
+aline .03048 .192405
+aline .01524 .192405
+aline .01143 .19431
+aline .01016 .19558
+aline .008255 .19939
+aline .008255 .206375
+aline .01016 .210185
+aline .01143 .211455
+aline .01397 .212725
+aline .01524 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=6 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .163195 .21336
+aline .164465 .212725
+aline .165735 .21209
+aline .16637 .211455
+aline .16764 .21082
+aline .168275 .20955
+aline .16891 .208915
+aline .17018 .206375
+aline .17018 .16637
+bezier .166964 .156536 .149901 .156536 .146685 .16637
+aline .146685 .19177
+aline .14605 .192405
+aline .04699 .192405
+bezier .611282E-01 .1651 .079853 .137143 .09525 .10922
+bezier .945778E-01 .948143E-01 .821368E-01 .841847E-01 .076835 .07112
+bezier .674027E-01 .546304E-01 .559474E-01 .371787E-01 .04826 .020955
+aline .14605 .020955
+aline .146685 .02159
+aline .146685 .04699
+bezier .149901 .568237E-01 .166964 .568237E-01 .17018 .04699
+aline .17018 .00635
+aline .16891 .00381
+aline .168275 .003175
+aline .16764 .001905
+aline .16637 .00127
+aline .165735 .000635
+aline .163195 -.000635
+aline .022225 -.000635
+bezier .118799E-01 .18658E-02 .136827E-01 .143471E-01 .019685 .02032
+bezier .357518E-01 .491231E-01 .542799E-01 .785862E-01 .069215 .10668
+bezier .512143E-01 .137729 .324672E-01 .168241 .014605 .19939
+aline .014605 .20574
+aline .01524 .207645
+aline .015875 .208915
+aline .01905 .21209
+aline .02032 .212725
+aline .022225 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=7 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .05842 .21717
+bezier .817527E-01 .214761 .893195E-01 .186962 .923925E-01 .168434
+bezier .954655E-01 .186962 .103032 .214761 .126365 .21717
+bezier .153621 .221201 .178166 .188398 .168275 .16383
+bezier .162001 .159284 .15003 .159782 .14732 .168275
+bezier .147943 .180276 .145069 .198159 .13081 .200025
+bezier .112415 .198514 .108656 .17546 .106045 .16129
+aline .106045 .15621
+aline .10541 .155575
+aline .10541 .149225
+aline .104775 .14859
+aline .104775 .13589
+aline .10414 .135255
+aline .10414 .020955
+aline .104775 .02032
+aline .123825 .02032
+bezier .133349 .175997E-01 .133349 .208533E-02 .123825 -.000635
+aline .06096 -.000635
+bezier .514359E-01 .208533E-02 .514359E-01 .175997E-01 .06096 .02032
+aline .08001 .02032
+aline .080645 .020955
+aline .080645 .135255
+bezier .784434E-01 .155562 .800761E-01 .178562 .065405 .19558
+bezier .566447E-01 .203261 .425705E-01 .19945 .040005 .187325
+aline .038735 .182245
+bezier .362844E-01 .175467 .401726E-01 .164164 .03048 .16129
+aline .020955 .16129
+bezier .91648E-02 .166462 .146708E-01 .181735 .01778 .191135
+bezier .241757E-01 .207344 .407637E-01 .219424 .05842 .21717
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=8 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .12573 .21336
+aline .127 .212725
+aline .12954 .211455
+aline .13081 .210185
+aline .132715 .206375
+aline .132715 .19939
+aline .13081 .19558
+aline .12954 .19431
+aline .12573 .192405
+aline .104775 .192405
+aline .10414 .19177
+aline .10414 .159385
+bezier .133722 .156229 .172845 .137082 .17018 .1016
+bezier .164569 .071167 .13128 .567555E-01 .10414 .05334
+aline .10414 .020955
+aline .104775 .02032
+aline .12573 .02032
+aline .12954 .018415
+aline .13081 .017145
+aline .132715 .013335
+aline .132715 .00635
+aline .13081 .00254
+aline .12954 .00127
+aline .12573 -.000635
+aline .059055 -.000635
+aline .055245 .00127
+aline .053975 .00254
+aline .05207 .00635
+aline .05207 .013335
+aline .053975 .017145
+aline .055245 .018415
+aline .059055 .02032
+aline .08001 .02032
+aline .080645 .020955
+aline .080645 .05334
+bezier .510631E-01 .564964E-01 .119402E-01 .756433E-01 .014605 .111125
+bezier .202159E-01 .141558 .053505 .155969 .080645 .159385
+aline .080645 .19177
+aline .08001 .192405
+aline .059055 .192405
+aline .055245 .19431
+aline .053975 .19558
+aline .05207 .19939
+aline .05207 .206375
+aline .053975 .210185
+aline .055245 .211455
+aline .057785 .212725
+aline .059055 .21336
+closepath
+! end of curve
+
+! start of curve
+amove .07874 .13716
+bezier .613172E-01 .1351 .035762 .123701 .038735 .10287
+bezier .429782E-01 .084689 .646801E-01 .770513E-01 .080645 .075565
+aline .080645 .13716
+aline .796925E-01 .137636
+aline .07874 .13716
+closepath
+! end of curve
+
+! start of curve
+amove .10414 .13716
+aline .10414 .075565
+bezier .121749 .076582 .149036 .883927E-01 .14605 .109855
+bezier .141807 .128036 .120105 .135674 .10414 .13716
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=9 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .123825 .21336
+bezier .133349 .21064 .133349 .195125 .123825 .192405
+aline .104775 .192405
+aline .10414 .19177
+aline .10414 .076835
+bezier .124208 .792573E-01 .132085 .10319 .13335 .120015
+bezier .133352 .137009 .131416 .159924 .150495 .16764
+aline .153035 .168275
+aline .16383 .168275
+bezier .175362 .164838 .171909 .145732 .16002 .146685
+bezier .153637 .128551 .159558 .10834 .150495 .09017
+bezier .142657 .710197E-01 .12476 .570019E-01 .10414 .053975
+aline .10414 .020955
+aline .104775 .02032
+aline .123825 .02032
+bezier .133349 .175997E-01 .133349 .208533E-02 .123825 -.000635
+aline .06096 -.000635
+bezier .514359E-01 .208533E-02 .514359E-01 .175997E-01 .06096 .02032
+aline .08001 .02032
+aline .080645 .020955
+aline .080645 .053975
+bezier .049047 .576183E-01 .028611 .887043E-01 .02794 .11811
+aline .02794 .13462
+aline .027305 .135255
+aline .027305 .140335
+aline .02667 .14097
+aline .026035 .14351
+aline .0254 .145415
+aline .024765 .146685
+bezier .126312E-01 .145597 .937461E-02 .16552 .02159 .168275
+bezier .390912E-01 .172307 .524039E-01 .155045 .0508 .139065
+bezier .516793E-01 .118844 .051091 .942084E-01 .06985 .080645
+aline .0762 .07747
+aline .079375 .764117E-01
+aline .080645 .076835
+aline .080645 .19177
+aline .08001 .192405
+aline .06096 .192405
+bezier .514359E-01 .195125 .514359E-01 .21064 .06096 .21336
+aline .123825 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=10 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .099695 .21717
+bezier .140606 .214714 .176268 .174336 .169545 .13335
+bezier .167952 .934888E-01 .136023 .592448E-01 .13208 .02032
+aline .153035 .02032
+aline .15367 .020955
+aline .15367 .029845
+bezier .156079 .390938E-01 .170311 .390938E-01 .17272 .029845
+aline .17272 .00635
+aline .17145 .00381
+aline .170815 .003175
+aline .17018 .001905
+aline .16891 .00127
+aline .168275 .000635
+aline .165735 -.000635
+aline .11684 -.000635
+bezier .104668 .319507E-02 .110391 .179104E-01 .11049 .02667
+bezier .117213 .709352E-01 .154001 .110561 .14478 .155575
+bezier .136352 .193814 .842572E-01 .209746 .056515 .182245
+bezier .351409E-01 .164521 .349269E-01 .134492 .043815 .11049
+bezier .548722E-01 .754847E-01 .797249E-01 .411531E-01 .074295 .00381
+aline .07366 .003175
+aline .073025 .001905
+aline .071755 .00127
+aline .07112 .000635
+aline .06858 -.000635
+aline .019685 -.000635
+aline .01778 0
+aline .01651 .000635
+aline .013335 .00381
+aline .0127 .00508
+aline .012065 .006985
+aline .012065 .029845
+bezier .144737E-01 .390938E-01 .287063E-01 .390938E-01 .031115 .029845
+aline .031115 .020955
+aline .03175 .02032
+aline .052705 .02032
+bezier .487618E-01 .592448E-01 .168331E-01 .934888E-01 .01524 .13335
+bezier .851701E-02 .174336 .441786E-01 .214714 .08509 .21717
+aline .099695 .21717
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=11 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .09525 .21336
+bezier .104133 .208268 .106734 .196748 .1143 .189865
+bezier .126745 .175851 .143412 .167225 .160655 .160655
+bezier .169542 .152856 .159589 .136382 .14859 .142875
+bezier .132211 .147937 .117369 .159558 .104775 .168275
+aline .104775 .00889
+bezier .102579 -.367765E-02 .828405E-01 -.367765E-02 .080645 .00889
+aline .080645 .168275
+bezier .664224E-01 .158578 .049553 .144695 .03048 .141605
+bezier .176248E-01 .143025 .193452E-01 .163137 .03175 .16383
+bezier .056426 .171575 .740682E-01 .191297 .08763 .21209
+aline .0889 .212725
+aline .090805 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=12 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .09525 .21336
+aline .097155 .212725
+aline .099695 .211455
+aline .10287 .20828
+aline .10414 .20574
+aline .104775 .203835
+aline .104775 .04445
+bezier .118998 .054147 .135867 .680305E-01 .15494 .07112
+bezier .167795 .696998E-01 .166075 .495883E-01 .15367 .048895
+bezier .128971 .041235 .111212 .021172 .09779 .000635
+bezier .853337E-01 -.549138E-02 .813326E-01 .115882E-01 .07493 .018415
+bezier .620343E-01 .345823E-01 .439199E-01 .450055E-01 .024765 .05207
+bezier .158783E-01 .598687E-01 .258308E-01 .076343 .03683 .06985
+bezier .532085E-01 .647884E-01 .680514E-01 .531668E-01 .080645 .04445
+aline .080645 .203835
+aline .08128 .20574
+aline .08255 .20828
+aline .085725 .211455
+aline .088265 .212725
+aline .09017 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=13 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .09525 .21717
+bezier .102937 .216057 .109697 .207416 .107315 .200025
+bezier .105694 .172728 .105327 .145623 .1016 .118745
+bezier .952388E-01 .108996 .783956E-01 .11601 .081915 .127635
+bezier .800965E-01 .153639 .776887E-01 .18025 .07747 .206375
+aline .078105 .20828
+aline .07874 .20955
+aline .079375 .210185
+aline .08001 .211455
+aline .083185 .21463
+aline .086995 .216535
+aline .089535 .21717
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=14 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.388888 dep=.222223 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .095885 .135255
+bezier .112086 .13272 .114994 .108291 .099695 .102235
+bezier .848295E-01 .949145E-01 .685549E-01 .114073 .078105 .127635
+aline .083185 .132715
+aline .085725 .133985
+aline .08763 .13462
+aline .089535 .135255
+closepath
+! end of curve
+
+! start of curve
+amove .099695 .070485
+aline .100965 .06985
+aline .102235 .069215
+aline .104775 .066675
+aline .106045 .064135
+bezier .107365 .189022E-01 .109717 -.260106E-01 .10922 -.07112
+bezier .104297 -.875265E-01 .779238E-01 -.085605 .075565 -.06858
+bezier .767046E-01 -.242267E-01 .776031E-01 .197358E-01 .079375 .064135
+aline .080645 .066675
+aline .083185 .069215
+aline .084455 .06985
+aline .085725 .070485
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=15 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.388888 dep=.222223 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .09017 .135255
+bezier .106371 .13272 .109279 .108291 .09398 .102235
+bezier .791145E-01 .949145E-01 .628399E-01 .114073 .07239 .127635
+aline .07747 .132715
+aline .08001 .133985
+aline .081915 .13462
+aline .08382 .135255
+closepath
+! end of curve
+
+! start of curve
+amove .09398 .070485
+aline .09525 .06985
+aline .09652 .069215
+aline .09906 .066675
+bezier .108673 .315581E-01 .854279E-01 -.435938E-02 .055245 -.02159
+bezier .407597E-01 -.292323E-01 .442806E-01 -.510771E-01 .05969 -.055245
+bezier .829833E-01 -.062609 .109016 -.613973E-01 .131445 -.0508
+aline .132715 -.04953
+aline .133985 -.048895
+aline .13462 -.04826
+bezier .131295 -.040812 .130226 -.290695E-01 .139065 -.02413
+bezier .15134 -.167008E-01 .16626 -.289702E-01 .16256 -.042545
+bezier .158103 -.721609E-01 .123098 -.793391E-01 .09906 -.080645
+bezier .072229 -.817548E-01 .372495E-01 -.799295E-01 .024765 -.051435
+bezier .160682E-01 -.315052E-01 .287939E-01 -.855492E-02 .047625 0
+bezier .681521E-01 .148198E-01 .759428E-01 .399911E-01 .07366 .064135
+aline .07493 .066675
+aline .07747 .069215
+aline .08001 .070485
+aline .09398 .070485
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=16 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.430555 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .1016 .14986
+aline .10287 .149225
+aline .10414 .14859
+aline .104775 .147955
+aline .106045 .14732
+aline .10668 .14605
+aline .107315 .145415
+aline .108585 .142875
+aline .108585 .020955
+aline .10922 .02032
+aline .1524 .02032
+bezier .162534 .181709E-01 .162534 .151407E-02 .1524 -.000635
+aline .03556 -.000635
+bezier .254261E-01 .151407E-02 .254261E-01 .181709E-01 .03556 .02032
+aline .084455 .02032
+aline .08509 .020955
+aline .08509 .12827
+aline .084455 .128905
+aline .0381 .128905
+bezier .285295E-01 .131508 .285295E-01 .147257 .0381 .14986
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=17 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.430555 dep=.222223 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .12192 .14986
+aline .12319 .149225
+aline .12446 .14859
+aline .125095 .147955
+aline .126365 .14732
+aline .127 .14605
+aline .127635 .145415
+aline .128905 .142875
+aline .128905 -.02413
+bezier .126545 -.515824E-01 .104356 -.07794 .0762 -.080645
+bezier .569533E-01 -.799211E-01 .335113E-01 -.839554E-01 .02032 -.066675
+bezier .112413E-01 -.549411E-01 .211029E-01 -.341785E-01 .03683 -.03937
+aline .038735 -.040005
+aline .041275 -.041275
+aline .045085 -.045085
+aline .04699 -.048895
+aline .047625 -.051435
+aline .047625 -.05715
+aline .04699 -.057785
+bezier .645338E-01 -.619843E-01 .886465E-01 -.618066E-01 .098425 -.04318
+aline .100965 -.0381
+aline .1016 -.036195
+aline .102235 -.034925
+aline .10287 -.032385
+aline .103505 -.03048
+aline .10414 -.027305
+aline .104775 -.02667
+aline .104775 -.02286
+aline .10541 -.022225
+aline .10541 .12827
+aline .104775 .128905
+aline .052705 .128905
+bezier .431809E-01 .131625 .431809E-01 .14714 .052705 .14986
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=18 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .05588 .21336
+bezier .745412E-01 .205699 .926631E-01 .196737 .111125 .188595
+bezier .122501 .181407 .110282 .159645 .098425 .168275
+bezier .806246E-01 .177077 .606358E-01 .183389 .04445 .19431
+aline .043815 .194945
+aline .04191 .198755
+aline .04191 .203835
+aline .042545 .20574
+aline .043815 .20828
+aline .04699 .211455
+aline .04953 .212725
+aline .0508 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=19 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .133985 .21336
+bezier .143496 .210932 .146368 .196856 .137795 .19177
+bezier .118385 .183306 .994349E-01 .172453 .079375 .16637
+bezier .685883E-01 .167891 .064494 .187052 .076835 .189865
+bezier .941127E-01 .197887 .111327 .206063 .128905 .21336
+aline .133985 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=20 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.565973 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .050165 .19939
+bezier .641441E-01 .193283 .784825E-01 .188043 .923925E-01 .181769
+bezier .106303 .188043 .120641 .193283 .13462 .19939
+bezier .149564 .202934 .154734 .176182 .13843 .17526
+bezier .122322 .170044 .106806 .161286 .09017 .15875
+bezier .728629E-01 .166373 .532851E-01 .170269 .037465 .18034
+aline .036195 .18288
+aline .036195 .188595
+aline .03683 .1905
+aline .037465 .19177
+aline .0381 .193675
+aline .038735 .194945
+aline .04191 .19812
+aline .04318 .198755
+aline .04445 .19939
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=21 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .045085 .21336
+bezier .523763E-01 .211918 .505365E-01 .203638 .05461 .200025
+aline .05588 .19939
+aline .05969 .19812
+aline .062865 .197485
+aline .0635 .19685
+aline .06731 .19685
+aline .067945 .196215
+aline .07493 .196215
+aline .075565 .19558
+aline .10922 .19558
+bezier .116807 .197238 .126777 .195945 .132715 .202565
+bezier .130547 .21496 .150702 .217583 .15367 .206375
+bezier .156615 .186288 .135227 .175207 .118745 .174625
+aline .11176 .174625
+aline .111125 .17399
+aline .07366 .17399
+bezier .575518E-01 .174928 .342673E-01 .179135 .031115 .19939
+aline .031115 .20574
+aline .03175 .207645
+aline .032385 .208915
+aline .03556 .21209
+aline .03683 .212725
+aline .038735 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=22 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.565555 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .151765 .201295
+bezier .161368 .198402 .161368 .182598 .151765 .179705
+aline .033655 .179705
+bezier .234385E-01 .181953 .232416E-01 .198466 .03302 .201295
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=23 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .097155 .216535
+bezier .111504 .216152 .127909 .199811 .117475 .18542
+bezier .103948 .168692 .706223E-01 .17074 .064135 .19304
+bezier .06264 .210399 .827527E-01 .218557 .097155 .216535
+closepath
+! end of curve
+
+! start of curve
+amove .0889 .20574
+bezier .784792E-01 .205299 .739773E-01 .191047 .084455 .18669
+bezier .933459E-01 .18056 .112076 .189238 .104775 .20066
+aline .1016 .203835
+aline .10033 .20447
+aline .098425 .205105
+aline .095885 .20574
+aline .09525 .206375
+aline .089535 .206375
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=24 !-------------- Beginning of new char.
+dfont wid=.524996 hei=0 dep=.194446 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .108585 .014605
+aline .109855 .01397
+aline .111125 .013335
+aline .11176 .0127
+aline .11303 .012065
+aline .113665 .01143
+aline .11557 .00762
+aline .11557 -.00381
+bezier .135061 -.712226E-02 .154858 -.242338E-01 .14986 -.045085
+bezier .144627 -.682905E-01 .116653 -.720703E-01 .09779 -.07366
+aline .07112 -.07366
+bezier .587581E-01 -.078939 .515587E-01 -.574208E-01 .064135 -.05334
+bezier .084555 -.510762E-01 .107229 -.563229E-01 .125095 -.043815
+bezier .131408 -.316395E-01 .115156 -.249774E-01 .106045 -.02413
+aline .099695 -.02413
+aline .09779 -.023495
+aline .09652 -.02286
+aline .093345 -.019685
+aline .09271 -.018415
+aline .092075 -.01651
+aline .092075 .006985
+aline .09271 .00889
+aline .093345 .01016
+aline .09652 .013335
+aline .09779 .01397
+aline .099695 .014605
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=25 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .111125 .215265
+bezier .133557 .213634 .166761 .200988 .16383 .17272
+bezier .161581 .156569 .14844 .145135 .135414 .137478
+bezier .173601 .110818 .191059 .465088E-01 .1524 .0127
+bezier .132444 -.382364E-02 .973585E-01 -.010971 .07874 .010795
+bezier .070339 .209898E-01 .758583E-01 .400096E-01 .090805 .0381
+aline .093345 .037465
+aline .097155 .03556
+aline .10033 .032385
+aline .102235 .028575
+aline .10287 .026035
+bezier .099811 .162765E-01 .113255 .177855E-01 .118745 .019685
+bezier .146788 .252753E-01 .156566 .058467 .14732 .081915
+bezier .140971 .107284 .118242 .130035 .09144 .128905
+bezier .08172 .131633 .081975 .147709 .092075 .14986
+bezier .110114 .14947 .133227 .155729 .140335 .174625
+bezier .14067 .187876 .123203 .190757 .113665 .193675
+bezier .963943E-01 .19527 .748605E-01 .194551 .0635 .17907
+aline .0635 .00635
+aline .06223 .00381
+aline .061595 .003175
+aline .06096 .001905
+aline .05969 .00127
+aline .059055 .000635
+aline .056515 -.000635
+aline .01397 -.000635
+bezier .431464E-02 .178964E-02 .431464E-02 .178954E-01 .01397 .02032
+aline .03937 .02032
+aline .040005 .020955
+aline .040005 .12827
+aline .03937 .128905
+aline .01397 .128905
+bezier .431464E-02 .13133 .431464E-02 .147435 .01397 .14986
+aline .03937 .14986
+aline .040005 .150495
+aline .040005 .18161
+bezier .454585E-01 .204668 .072401 .213264 .09271 .215265
+aline .111125 .215265
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=26 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.430555 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .06223 .153035
+bezier .768134E-01 .150671 .897134E-01 .140903 .095885 .127635
+bezier .106241 .148887 .135432 .162351 .155575 .145415
+bezier .1755 .12677 .179238 .962766E-01 .175895 .07112
+aline .17526 .070485
+aline .174625 .069215
+aline .173355 .06858
+aline .17272 .067945
+aline .17018 .066675
+aline .103505 .066675
+bezier .103319 .463153E-01 .117967 .176197E-01 .14224 .018415
+bezier .153871 .021749 .156238 .343653E-01 .160655 .043815
+bezier .168648 .514777E-01 .181267 .415536E-01 .17653 .03175
+bezier .171683 .756493E-02 .144681 -.108432E-01 .121285 .000635
+bezier .111236 .437466E-02 .103321 .149599E-01 .097155 .020955
+bezier .816754E-01 -.529662E-02 .361052E-01 -.131818E-01 .01905 .015875
+bezier .542407E-02 .357769E-01 .121294E-01 .651177E-01 .03429 .075565
+bezier .495849E-01 .841245E-01 .672539E-01 .850107E-01 .083185 .086995
+bezier .851117E-01 .104377 .811101E-01 .127107 .06096 .131445
+aline .060325 .13208
+aline .047625 .13208
+aline .04699 .131445
+aline .04445 .13081
+bezier .501354E-01 .115446 .260443E-01 .104208 .017145 .11811
+bezier .714409E-02 .135183 .026336 .152123 .042545 .1524
+aline .04699 .1524
+aline .047625 .153035
+closepath
+! end of curve
+
+! start of curve
+amove .13081 .131445
+bezier .112522 .126121 .104893 .103803 .103505 .086995
+aline .15748 .086995
+bezier .157295 .102132 .153986 .125267 .136525 .13208
+aline .131445 .13208
+closepath
+! end of curve
+
+! start of curve
+amove .080645 .065405
+bezier .064745 .649744E-01 .463507E-01 .623846E-01 .03429 .050165
+bezier .227621E-01 .333839E-01 .454847E-01 .120055E-01 .06223 .019685
+bezier .715336E-01 .217579E-01 .797048E-01 .283921E-01 .08255 .037465
+aline .08255 .055245
+aline .083185 .05588
+aline .083185 .065405
+aline .081915 .658283E-01
+aline .080645 .065405
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=27 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.430555 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .06223 .153035
+bezier .079509 .151436 .916405E-01 .134883 .09906 .12319
+bezier .106991 .144054 .132835 .162612 .154305 .147955
+bezier .176795 .130368 .177841 .995182E-01 .1778 .07366
+aline .17653 .07112
+aline .175895 .070485
+aline .17526 .069215
+aline .17399 .06858
+aline .173355 .067945
+aline .170815 .066675
+aline .109855 .066675
+bezier .109627 .474544E-01 .121522 .018512 .14478 .018415
+bezier .155644 .223558E-01 .156705 .349726E-01 .16129 .043815
+bezier .168071 .504993E-01 .180219 .435705E-01 .1778 .03429
+bezier .174605 .111327E-01 .150863 -.108119E-01 .127 0
+bezier .113974 .519281E-02 .104907 .167684E-01 .09906 .02921
+bezier .906288E-01 .652455E-02 .624373E-01 -.122952E-01 .03937 .00254
+bezier .744578E-02 .234106E-01 .292555E-02 .676102E-01 .009525 .1016
+bezier .149532E-01 .12419 .285071E-01 .148931 .05334 .153035
+closepath
+! end of curve
+
+! start of curve
+amove .05461 .131445
+bezier .345921E-01 .126038 .283698E-01 .101807 .026035 .084455
+bezier .255911E-01 .613475E-01 .295868E-01 .321296E-01 .05207 .019685
+bezier .700047E-01 .142801E-01 .818283E-01 .358309E-01 .085725 .0508
+bezier .093195 .768384E-01 .911647E-01 .110673 .067945 .128905
+aline .065405 .130175
+aline .0635 .13081
+aline .06096 .131445
+aline .060325 .13208
+aline .055245 .13208
+closepath
+! end of curve
+
+! start of curve
+amove .133985 .131445
+bezier .117269 .124698 .110919 .103393 .109855 .086995
+aline .158115 .086995
+bezier .157715 .101728 .155868 .121565 .141605 .13081
+aline .1397 .131445
+aline .139065 .13208
+aline .13462 .13208
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=28 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.541667 dep=.111112 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .160655 .19939
+bezier .170734 .197056 .170895 .184664 .164465 .178435
+bezier .156342 .164158 .148297 .149825 .1397 .13589
+bezier .181366 .104134 .176434 .324427E-01 .130175 .00762
+bezier .109919 -.005153 .843583E-01 -.475127E-02 .062865 .00254
+bezier .523316E-01 -.141242E-01 .439419E-01 -.323335E-01 .032385 -.04826
+bezier .232408E-01 -.541466E-01 .104228E-01 -.419052E-01 .01778 -.03302
+bezier .266913E-01 -.172195E-01 .356555E-01 -.145702E-02 .045085 .01397
+bezier .358313E-02 .455597E-01 .836957E-02 .116636 .053975 .14224
+bezier .745438E-01 .155903 .100318 .155002 .122555 .147955
+bezier .132465 .164705 .141153 .182334 .1524 .19812
+aline .15494 .19939
+aline .160655 .19939
+closepath
+! end of curve
+
+! start of curve
+amove .08636 .131445
+bezier .456454E-01 .129001 .020877 .764664E-01 .045085 .043815
+aline .04572 .042545
+aline .04699 .041275
+aline .047625 .040005
+aline .050165 .037465
+aline .0508 .036195
+aline .05334 .033655
+aline .05461 .03302
+bezier .610136E-01 .391223E-01 .657792E-01 .518071E-01 .071755 .060325
+bezier .842011E-01 .832188E-01 .995745E-01 .106433 .11049 .128905
+aline .108585 .12954
+aline .106045 .130175
+aline .10287 .13081
+aline .102235 .131445
+aline .098425 .131445
+aline .09779 .13208
+aline .086995 .13208
+aline .08636 .131445
+closepath
+! end of curve
+
+! start of curve
+amove .128905 .11684
+bezier .111224 .849301E-01 .909149E-01 .536682E-01 .747712E-01 .214313E-01
+bezier .107101 .889494E-02 .14631 .348848E-01 .149225 .069215
+bezier .150491 .872304E-01 .14317 .105816 .12954 .11811
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=29 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .165735 .21336
+aline .167005 .212725
+aline .168275 .21209
+aline .16891 .211455
+aline .17018 .21082
+aline .170815 .20955
+aline .17145 .208915
+aline .17272 .206375
+aline .17272 .16637
+bezier .170311 .157121 .156079 .157121 .15367 .16637
+aline .15367 .19177
+aline .153035 .192405
+aline .11303 .192405
+aline .112395 .19177
+aline .112395 .121285
+aline .11303 .12065
+aline .16002 .12065
+bezier .169544 .11793 .169544 .102415 .16002 .099695
+aline .11303 .099695
+aline .112395 .09906
+aline .112395 .020955
+aline .11303 .02032
+aline .155575 .02032
+aline .15621 .020955
+aline .15621 .05207
+bezier .158619 .613188E-01 .172851 .613188E-01 .17526 .05207
+aline .17526 .00635
+aline .17399 .00381
+aline .173355 .003175
+aline .17272 .001905
+aline .17145 .00127
+aline .170815 .000635
+aline .168275 -.000635
+aline .08636 -.000635
+bezier .737441E-01 .320462E-02 .792732E-01 .02456 .09271 .02032
+aline .093345 .020955
+aline .093345 .062865
+aline .09271 .0635
+aline .053975 .0635
+aline .04572 .022225
+aline .452438E-01 .212725E-01
+aline .04572 .02032
+aline .053975 .02032
+aline .057785 .018415
+aline .05969 .01651
+aline .06096 .01397
+aline .06096 .005715
+aline .05969 .003175
+aline .057785 .00127
+aline .053975 -.000635
+aline .015875 -.000635
+aline .012065 .00127
+aline .01016 .003175
+aline .00889 .005715
+aline .00889 .01397
+aline .01016 .01651
+aline .012065 .018415
+aline .015875 .02032
+aline .0254 .02032
+aline .037465 .080645
+aline .0381 .083185
+aline .053975 .16256
+aline .05461 .1651
+aline .05969 .1905
+aline .601663E-01 .191453
+aline .05969 .192405
+bezier .482805E-01 .188947 .414428E-01 .2042 .04953 .211455
+aline .05207 .212725
+aline .05334 .21336
+closepath
+! end of curve
+
+! start of curve
+amove .079375 .18923
+aline .07874 .186055
+aline .073025 .15748
+aline .07239 .15494
+aline .058674 .08636
+aline .059055 .084455
+aline .09271 .084455
+aline .093345 .08509
+aline .093345 .19177
+aline .09271 .192405
+aline .08001 .192405
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=30 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .076835 .21717
+bezier .834137E-01 .215893 .906377E-01 .214752 .097155 .21336
+aline .167005 .21336
+aline .169545 .21209
+aline .17018 .211455
+aline .17145 .21082
+aline .172085 .20955
+aline .17272 .208915
+aline .17399 .206375
+aline .17399 .16637
+bezier .171581 .157121 .157349 .157121 .15494 .16637
+aline .15494 .19177
+aline .154305 .192405
+aline .112395 .192405
+aline .11176 .19177
+aline .11176 .121285
+aline .112395 .12065
+aline .161925 .12065
+bezier .171449 .11793 .171449 .102415 .161925 .099695
+aline .112395 .099695
+aline .11176 .09906
+aline .11176 .020955
+aline .112395 .02032
+aline .156845 .02032
+aline .15748 .020955
+aline .15748 .05207
+bezier .159889 .613188E-01 .174121 .613188E-01 .17653 .05207
+aline .17653 .00635
+aline .17526 .00381
+aline .174625 .003175
+aline .17399 .001905
+aline .17272 .00127
+aline .172085 .000635
+aline .169545 -.000635
+aline .097155 -.000635
+bezier .075003 -.51557E-02 .474293E-01 -.876872E-02 .02667 .00508
+bezier .121713E-01 .195805E-01 .141473E-01 .412661E-01 .01143 .059055
+aline .01143 .073025
+aline .010795 .07366
+aline .010795 .139065
+bezier .013277 .161071 .104918E-01 .184575 .023495 .20447
+bezier .374296E-01 .219058 .584279E-01 .216792 .076835 .21717
+closepath
+! end of curve
+
+! start of curve
+amove .06223 .19558
+bezier .489327E-01 .195961 .03452 .187379 .033655 .17272
+bezier .305355E-01 .161889 .312222E-01 .15029 .029845 .139065
+aline .029845 .079375
+bezier .318952E-01 .612907E-01 .296792E-01 .415478E-01 .04064 .0254
+bezier .536793E-01 .163802E-01 .740073E-01 .114957E-01 .086995 .02286
+bezier .919388E-01 .313283E-01 .913527E-01 .405376E-01 .09271 .04953
+aline .09271 .163195
+bezier .911721E-01 .174725 .923329E-01 .193371 .0762 .19558
+aline .075565 .196215
+aline .062865 .196215
+aline .06223 .19558
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=31 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.666667 dep=.0555553 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .13462 .243205
+aline .136525 .24257
+bezier .150733 .237437 .138947 .221546 .138303 .211836
+bezier .161988 .201938 .161209 .172201 .16383 .151765
+aline .16383 .137795
+aline .164465 .13716
+aline .164465 .075565
+bezier .161598 .526144E-01 .165403 .249584E-01 .14732 .00635
+bezier .136876 -.235565E-02 .122714 -.312107E-02 .11049 -.004445
+aline .074295 -.004445
+aline .07366 -.00381
+aline .06858 -.00381
+aline .067945 -.004445
+aline .0635 -.01778
+aline .062865 -.02032
+bezier .622584E-01 -.320121E-01 .451359E-01 -.340528E-01 .041275 -.023495
+aline .041275 -.017145
+aline .04572 -.00381
+aline .046355 -.00127
+aline .467783E-01 0
+bezier .272779E-01 .882857E-02 .227794E-01 .330443E-01 .022225 .05207
+aline .02159 .052705
+aline .02159 .060325
+aline .020955 .06096
+aline .020955 .07493
+aline .02032 .075565
+aline .02032 .13716
+bezier .231865E-01 .160111 .193821E-01 .187767 .037465 .206375
+bezier .047909 .215081 .620708E-01 .215846 .074295 .21717
+aline .11049 .21717
+aline .111125 .216535
+aline .116205 .216535
+aline .11684 .21717
+aline .121285 .230505
+aline .12192 .233045
+aline .12319 .236855
+aline .12446 .239395
+aline .126365 .2413
+aline .128905 .24257
+aline .130175 .243205
+closepath
+! end of curve
+
+! start of curve
+amove .07747 .19558
+bezier .611678E-01 .196543 .443258E-01 .185402 .04318 .16764
+bezier .400605E-01 .156809 .407472E-01 .14521 .03937 .133985
+aline .03937 .07874
+bezier .415868E-01 .060775 .039209 .390385E-01 .05334 .024765
+aline .542925E-01 .242887E-01
+bezier .073194 .08068 .915524E-01 .138327 .109492 .195036
+aline .107315 .19558
+aline .10668 .196215
+aline .078105 .196215
+aline .07747 .19558
+closepath
+! end of curve
+
+! start of curve
+amove .12954 .18669
+bezier .111571 .130371 .928127E-01 .0739 .752929E-01 .176893E-01
+bezier .946952E-01 .158949E-01 .116967 .135552E-01 .13335 .026035
+bezier .144905 .415395E-01 .143553 .610534E-01 .145415 .07874
+aline .145415 .133985
+bezier .143198 .15195 .145576 .173686 .131445 .18796
+aline .130492 .188436
+aline .130048 .188214
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=32 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.219444 dep=.111112 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .0254 .083185
+aline .02667 .08255
+aline .02794 .081915
+aline .02921 .080645
+aline .03048 .078105
+aline .03048 -.03175
+aline .031115 -.032385
+aline .15367 -.032385
+aline .154305 -.03175
+aline .154305 .078105
+aline .155575 .080645
+aline .156845 .081915
+aline .159385 .083185
+aline .16383 .083185
+aline .16637 .081915
+aline .16764 .080645
+aline .16891 .078105
+aline .16891 -.041275
+aline .168275 -.04318
+aline .1651 -.046355
+aline .163195 -.04699
+aline .02159 -.04699
+aline .019685 -.046355
+aline .01651 -.04318
+aline .015875 -.041275
+aline .015875 .078105
+aline .017145 .080645
+aline .018415 .081915
+aline .019685 .08255
+aline .020955 .083185
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=33 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .095885 .21717
+bezier .109925 .214899 .111816 .198439 .10922 .187325
+bezier .108641 .148119 .107589 .109599 .106045 .070485
+aline .104775 .067945
+aline .102235 .065405
+aline .099695 .064135
+aline .085725 .064135
+aline .083185 .065405
+aline .080645 .067945
+aline .079375 .070485
+bezier .780548E-01 .115718 .757031E-01 .160631 .0762 .20574
+aline .078105 .20955
+aline .079375 .21082
+aline .08001 .21209
+aline .080645 .212725
+aline .081915 .21336
+aline .083185 .21463
+aline .086995 .216535
+aline .089535 .21717
+closepath
+! end of curve
+
+! start of curve
+amove .095885 .033655
+bezier .112086 .311197E-01 .114994 .669062E-02 .099695 .000635
+bezier .848295E-01 -.668551E-02 .685549E-01 .124734E-01 .078105 .026035
+aline .083185 .031115
+aline .085725 .032385
+aline .08763 .03302
+aline .089535 .033655
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=34 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .064135 .21717
+bezier .747536E-01 .215499 .784421E-01 .203205 .075565 .19431
+bezier .745117E-01 .16952 .730217E-01 .145396 .07112 .12065
+bezier .067629 .110583 .502721E-01 .112904 .050165 .123825
+bezier .497775E-01 .151798 .456537E-01 .179196 .046355 .20701
+aline .04826 .21082
+aline .048895 .211455
+aline .04953 .212725
+aline .050165 .21336
+aline .051435 .213995
+aline .05207 .21463
+aline .05588 .216535
+aline .057785 .21717
+closepath
+! end of curve
+
+! start of curve
+amove .127 .21717
+bezier .136374 .215392 .141428 .204633 .13843 .196215
+bezier .137054 .170376 .136402 .145043 .13335 .11938
+bezier .128947 .111018 .113756 .113141 .11303 .12319
+bezier .112675 .15161 .108233 .179237 .10922 .207645
+aline .11049 .210185
+aline .111125 .21082
+aline .11176 .21209
+aline .11303 .21336
+aline .1143 .213995
+aline .11557 .215265
+aline .11684 .2159
+aline .118745 .216535
+aline .12065 .21717
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=35 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .0762 .21336
+aline .078105 .212725
+bezier .907018E-01 .206976 .839837E-01 .191852 .083185 .182245
+bezier .834351E-01 .17357 .799777E-01 .165086 .08128 .156845
+aline .11684 .156845
+bezier .12139 .173572 .119837 .1914 .125095 .20828
+bezier .132365 .219966 .152129 .209886 .146685 .197485
+bezier .146232 .183768 .142162 .17017 .142875 .156845
+aline .16256 .156845
+bezier .175128 .154649 .175128 .13491 .16256 .132715
+aline .139065 .132715
+bezier .135762 .115743 .134464 .986292E-01 .132715 .08128
+aline .13335 .080645
+aline .16256 .080645
+bezier .175128 .784495E-01 .175128 .587105E-01 .16256 .056515
+aline .12954 .056515
+bezier .125025 .395606E-01 .126552 .215335E-01 .121285 .004445
+bezier .114015 -.72406E-02 .942513E-01 .283923E-02 .099695 .01524
+bezier .100126 .291772E-01 .104251 .429649E-01 .103505 .056515
+aline .067945 .056515
+bezier .634305E-01 .395606E-01 .649572E-01 .215335E-01 .05969 .004445
+bezier .524197E-01 -.72406E-02 .326563E-01 .283922E-02 .0381 .01524
+bezier .385306E-01 .291772E-01 .426563E-01 .429649E-01 .04191 .056515
+aline .022225 .056515
+bezier .965736E-02 .587105E-01 .965736E-02 .784495E-01 .022225 .080645
+aline .04572 .080645
+bezier .049023 .976169E-01 .503206E-01 .114731 .05207 .13208
+aline .051435 .132715
+aline .022225 .132715
+bezier .965736E-02 .13491 .965736E-02 .154649 .022225 .156845
+aline .055245 .156845
+bezier .597952E-01 .173572 .058242 .1914 .0635 .20828
+aline .066675 .211455
+aline .069215 .212725
+aline .07112 .21336
+closepath
+! end of curve
+
+! start of curve
+amove .076835 .13081
+bezier .749554E-01 .114336 .715216E-01 .971187E-01 .071755 .080645
+aline .107315 .080645
+bezier .110618 .976169E-01 .111916 .114731 .113665 .13208
+aline .11303 .132715
+aline .07747 .132715
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=36 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.694445 dep=.083333 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .095885 .24257
+aline .097155 .241935
+aline .098425 .2413
+aline .09906 .240665
+aline .10033 .24003
+aline .100965 .23876
+aline .1016 .238125
+aline .10287 .235585
+aline .10287 .215265
+bezier .130066 .213787 .162115 .195927 .163195 .1651
+bezier .168728 .152176 .154262 .136229 .14097 .144145
+bezier .131326 .149237 .131265 .162978 .138218 .17018
+bezier .133726 .184946 .11696 .192652 .10287 .19304
+aline .10287 .121285
+bezier .131492 .116284 .160404 .959701E-01 .16383 .065405
+bezier .167923 .301927E-01 .135757 .138093E-02 .10287 -.00254
+aline .10287 -.02286
+bezier .100142 -.03258 .840664E-01 -.032325 .081915 -.022225
+aline .081915 -.00254
+bezier .534983E-01 -.711652E-03 .224301E-01 .200327E-01 .02159 .051435
+bezier .188616E-01 .600946E-01 .221343E-01 .721676E-01 .032385 .074295
+bezier .459942E-01 .778831E-01 .571246E-01 .615437E-01 .048895 .050165
+aline .04572 .04699
+bezier .501721E-01 .311135E-01 .660493E-01 .203784E-01 .081915 .019685
+aline .081915 .10033
+bezier .050554 .104453 .171718E-01 .128626 .020955 .163195
+bezier .245298E-01 .192767 .542115E-01 .211761 .081915 .215265
+aline .081915 .23495
+aline .08255 .236855
+aline .083185 .238125
+aline .08636 .2413
+aline .08763 .241935
+aline .089535 .24257
+closepath
+! end of curve
+
+! start of curve
+amove .080645 .19304
+bezier .060165 .19088 .359323E-01 .172052 .04445 .14986
+bezier .508325E-01 .135472 .667949E-01 .126828 .081915 .12573
+aline .081915 .19304
+aline .08128 .193675
+closepath
+! end of curve
+
+! start of curve
+amove .10287 .095885
+aline .10287 .02032
+bezier .12999 .203401E-01 .154586 .546138E-01 .135255 .07747
+bezier .127949 .878088E-01 .114529 .946671E-01 .10287 .095885
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=37 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.694445 dep=.083333 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .046355 .24257
+bezier .712461E-01 .236276 .766926E-01 .204458 .07239 .183515
+bezier .719745E-01 .163862 .517288E-01 .140139 .031115 .1524
+bezier .830155E-02 .170815 .785527E-02 .205984 .02159 .22987
+aline .02286 .23114
+aline .023495 .23241
+aline .028575 .23749
+aline .029845 .238125
+aline .031115 .239395
+aline .034925 .2413
+aline .03683 .241935
+aline .040005 .24257
+closepath
+! end of curve
+
+! start of curve
+amove .144145 .24257
+bezier .156684 .239662 .154595 .224913 .149225 .216535
+bezier .117247 .136108 .857497E-01 .554828E-01 .05334 -.024765
+bezier .463662E-01 -.356237E-01 .028078 -.277826E-01 .031115 -.01524
+bezier .644336E-01 .069055 .975762E-01 .153423 .131445 .23749
+aline .13462 .240665
+aline .13716 .241935
+aline .139065 .24257
+closepath
+! end of curve
+
+! start of curve
+amove .04064 .220345
+bezier .282456E-01 .207417 .285229E-01 .183445 .041275 .170815
+bezier .509941E-01 .170062 .525072E-01 .183796 .05461 .1905
+bezier .548065E-01 .201348 .540519E-01 .216158 .04318 .221361
+aline .041275 .22098
+aline .04064 .220345
+closepath
+! end of curve
+
+! start of curve
+amove .14478 .062865
+bezier .171463 .557277E-01 .175571 .214263E-01 .17018 -.00127
+bezier .166969 -.019085 .14799 -.379212E-01 .12954 -.02667
+bezier .106265 -.810902E-02 .105633 .294453E-01 .12192 .052705
+aline .127 .057785
+aline .12827 .05842
+aline .12954 .05969
+aline .13335 .061595
+aline .135255 .06223
+aline .13843 .062865
+closepath
+! end of curve
+
+! start of curve
+amove .139065 .04064
+bezier .126623 .279918E-01 .126906 .410082E-02 .1397 -.008255
+bezier .149324 -.899682E-02 .151292 .463659E-02 .153035 .01143
+bezier .153205 .220663E-01 .152467 .366648E-01 .141605 .041656
+aline .1397 .041275
+aline .139065 .04064
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=38 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .07747 .21717
+bezier .103561 .212137 .107362 .179993 .104775 .15875
+bezier .1002 .136157 .833059E-01 .119804 .700881E-01 .102553
+bezier .766172E-01 .854489E-01 .867864E-01 .701847E-01 .095885 .05461
+bezier .107862 .784047E-01 .118065 .103981 .12573 .128905
+bezier .112328 .124744 .106838 .146742 .120015 .14986
+aline .1651 .14986
+bezier .174624 .14714 .174624 .131625 .1651 .128905
+aline .14732 .128905
+bezier .135513 .978971E-01 .124943 .662208E-01 .108744 .371475E-01
+bezier .116475 .267262E-01 .130192 .122238E-01 .144145 .018415
+bezier .153099 .250231E-01 .149017 .373677E-01 .15494 .045085
+aline .15875 .04699
+aline .16383 .04699
+bezier .175944 .418075E-01 .169925 .259897E-01 .167005 .01651
+bezier .160379 -.448107E-02 .132924 -.108548E-01 .116205 .00254
+bezier .108742 .679555E-02 .102744 .134915E-01 .968375E-01 .195263E-01
+bezier .818275E-01 -.507855E-03 .510612E-01 -.014155 .02921 .00381
+bezier .212518E-02 .027472 .561225E-02 .736404E-01 .033655 .09525
+aline .03429 .09652
+aline .041275 .103505
+aline .04191 .104775
+aline .04572 .108585
+bezier .394752E-01 .138702 .291134E-01 .171381 .045085 .20066
+aline .04572 .201295
+aline .046355 .202565
+aline .047625 .203835
+aline .04826 .205105
+aline .05334 .210185
+aline .05461 .21082
+aline .05588 .21209
+aline .06223 .215265
+aline .06604 .216535
+aline .069215 .21717
+closepath
+! end of curve
+
+! start of curve
+amove .070485 .19558
+bezier .535915E-01 .188228 .547297E-01 .165899 .05715 .15113
+aline .05715 .146685
+aline .057785 .14605
+aline .057785 .14224
+aline .05842 .141605
+aline .060325 .13208
+aline .615043E-01 .127363
+bezier .778374E-01 .141665 .938563E-01 .166253 .08255 .188595
+aline .08128 .191135
+aline .080645 .19177
+aline .08001 .19304
+aline .07874 .19431
+aline .0762 .19558
+aline .075565 .196215
+aline .07112 .196215
+aline .070485 .19558
+closepath
+! end of curve
+
+! start of curve
+amove .05207 .084455
+bezier .346439E-01 .700899E-01 .286516E-01 .449936E-01 .040005 .0254
+bezier .046657 .113671E-01 .642461E-01 .167736E-01 .07366 .024765
+aline .08128 .032385
+bezier .878014E-01 .378191E-01 .0783 .438538E-01 .0762 .04953
+bezier .689372E-01 .620298E-01 .614632E-01 .743773E-01 .055245 .08763
+aline .05207 .084455
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=39 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .09652 .21336
+bezier .12146 .20724 .122682 .175886 .11811 .155575
+bezier .112631 .133859 .975247E-01 .115063 .07747 .10541
+bezier .656849E-01 .102695 .583099E-01 .121294 .070485 .12573
+bezier .897439E-01 .135621 .100516 .158106 .09906 .17907
+bezier .867949E-01 .176224 .728345E-01 .185747 .075565 .19939
+aline .0762 .20193
+aline .078105 .20574
+aline .07874 .206375
+aline .079375 .207645
+aline .08128 .20955
+aline .08255 .210185
+aline .083185 .21082
+aline .086995 .212725
+aline .089535 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=40 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.694445 dep=.0833311 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .146685 .24257
+bezier .157015 .239472 .154974 .224942 .145415 .22225
+bezier .765351E-01 .177482 .651833E-01 .732304E-01 .120015 .013335
+bezier .128696 .165276E-02 .141759 -.564021E-02 .1524 -.014605
+bezier .158955 -.252183E-01 .143247 -.344032E-01 .135255 -.02667
+bezier .063693 .154502E-01 .396755E-01 .116517 .083185 .18669
+bezier .964307E-01 .209743 .1164 .22969 .1397 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=")" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.694445 dep=.0833311 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .045085 .24257
+bezier .11768 .203285 .14504 .103676 .104775 .032385
+bezier .915174E-01 .676974E-02 .702852E-01 -.152095E-01 .045085 -.02921
+bezier .343822E-01 -.03286 .025335 -.178787E-01 .03556 -.01143
+bezier .104299 .300839E-01 .12008 .130282 .07112 .192405
+bezier .612069E-01 .207904 .446856E-01 .21721 .03175 .229235
+aline .031115 .23114
+aline .031115 .23495
+aline .03175 .236855
+aline .032385 .238125
+aline .03556 .2413
+aline .03683 .241935
+aline .038735 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="*" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.520834 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .094615 .18161
+aline .09652 .180975
+aline .09906 .179705
+aline .1016 .177165
+aline .103505 .173355
+aline .103505 .15494
+aline .10287 .154305
+aline .10287 .125095
+bezier .117399 .131188 .131975 .142973 .14732 .14986
+bezier .160612 .152249 .165297 .131166 .1524 .127635
+bezier .140063 .120068 .124937 .113904 .114088 .105833
+bezier .128836 .971098E-01 .14583 .908608E-01 .15875 .08001
+bezier .16553 .692295E-01 .149993 .056756 .14097 .06604
+bezier .128168 .726876E-01 .115237 .824904E-01 .10287 .08763
+aline .10287 .05842
+aline .103505 .057785
+aline .103505 .03937
+aline .1016 .03556
+aline .09906 .03302
+aline .09652 .03175
+aline .094615 .031115
+aline .09017 .031115
+aline .088265 .03175
+aline .085725 .03302
+aline .083185 .03556
+aline .08128 .03937
+aline .08128 .057785
+aline .081915 .05842
+aline .081915 .08763
+bezier .673863E-01 .815372E-01 .528102E-01 .697519E-01 .037465 .062865
+bezier .241725E-01 .604765E-01 .194878E-01 .815592E-01 .032385 .08509
+bezier .447221E-01 .926572E-01 .598486E-01 .988212E-01 .706967E-01 .106892
+bezier .559489E-01 .115615 .389551E-01 .121864 .026035 .132715
+bezier .192553E-01 .143495 .347925E-01 .155969 .043815 .146685
+bezier .566169E-01 .140037 .069548 .130235 .081915 .125095
+aline .081915 .154305
+aline .08128 .15494
+aline .08128 .173355
+aline .083185 .177165
+aline .085725 .179705
+aline .088265 .180975
+aline .09017 .18161
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="+" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.530554 dep=-.0805569 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .09525 .18542
+aline .097155 .184785
+aline .099695 .183515
+aline .10287 .18034
+aline .10414 .1778
+aline .104775 .175895
+aline .104775 .11938
+aline .10541 .118745
+aline .16129 .118745
+bezier .173858 .116549 .173858 .968105E-01 .16129 .094615
+aline .10541 .094615
+aline .104775 .09398
+aline .104775 .037465
+bezier .102579 .248974E-01 .828405E-01 .248974E-01 .080645 .037465
+aline .080645 .09398
+aline .08001 .094615
+aline .023495 .094615
+bezier .109274E-01 .968105E-01 .109274E-01 .116549 .023495 .118745
+aline .08001 .118745
+aline .080645 .11938
+aline .080645 .175895
+aline .08128 .1778
+aline .08255 .18034
+aline .085725 .183515
+aline .088265 .184785
+aline .09017 .18542
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="," !-------------- Beginning of new char.
+dfont wid=.524996 hei=.125 dep=.138888 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .09652 .042545
+bezier .124296 .372084E-01 .12774 .763791E-03 .114935 -.019685
+bezier .106574 -.351915E-01 .896164E-01 -.502377E-01 .07112 -.048895
+aline .06985 -.04826
+aline .065405 -.043815
+aline .064135 -.041275
+bezier .618533E-01 -.271662E-01 .799623E-01 -.291349E-01 .086995 -.02159
+bezier .929572E-01 -.160193E-01 .985867E-01 -.877952E-02 .099187 -.508002E-03
+bezier .829993E-01 -.475319E-02 .663792E-01 .107553E-01 .071755 .027305
+aline .07239 .02921
+aline .074295 .03302
+aline .075565 .03429
+aline .0762 .03556
+aline .07874 .0381
+aline .08001 .038735
+aline .080645 .03937
+aline .084455 .041275
+aline .08636 .04191
+aline .0889 .042545
+closepath
+! end of curve
+
+! start of curve
+amove .09906 0
+aline .099695 -.000635
+aline .10033 0
+aline .099695 .000635
+aline .09906 0
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="-" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.530554 dep=-.0805569 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .15494 .118745
+bezier .167508 .116549 .167508 .968105E-01 .15494 .094615
+aline .029845 .094615
+bezier .172774E-01 .968105E-01 .172774E-01 .116549 .029845 .118745
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="." !-------------- Beginning of new char.
+dfont wid=.524996 hei=.125 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .095885 .042545
+aline .09906 .04191
+aline .10541 .038735
+aline .11049 .033655
+bezier .122718 .177978E-01 .105252 -.636978E-02 .08636 0
+aline .08001 .003175
+aline .07493 .008255
+aline .071755 .014605
+aline .07112 .01778
+aline .07112 .02413
+aline .071755 .027305
+aline .07493 .033655
+aline .08001 .038735
+aline .08636 .04191
+aline .089535 .042545
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="/" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.694445 dep=.0833311 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .154305 .24257
+aline .15621 .241935
+aline .15875 .240665
+aline .161925 .23749
+aline .163195 .23495
+aline .16383 .233045
+aline .16383 .227965
+bezier .124103 .143519 .833809E-01 .594848E-01 .04318 -.024765
+bezier .356434E-01 -.365753E-01 .159538E-01 -.261976E-01 .02159 -.013335
+bezier .616277E-01 .702598E-01 .101488 .153928 .141605 .23749
+aline .14478 .240665
+aline .14732 .241935
+aline .149225 .24257
+aline .154305 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="0" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .09779 .21717
+bezier .143197 .209618 .1642 .15741 .16637 .11684
+bezier .168713 .073156 .155043 .203378E-01 .112395 -.000635
+bezier .08251 -.138612E-01 .503313E-01 .730869E-02 .036195 .033655
+bezier .109018E-01 .810978E-01 .117126E-01 .140384 .04064 .186055
+bezier .533688E-01 .204465 .744047E-01 .219726 .09779 .21717
+closepath
+! end of curve
+
+! start of curve
+amove .08763 .19558
+bezier .550689E-01 .187932 .450965E-01 .148522 .04191 .12065
+bezier .409401E-01 .863987E-01 .464097E-01 .484892E-01 .073025 .023495
+bezier .898403E-01 .904613E-02 .114434 .194833E-01 .123825 .037465
+bezier .147718 .779515E-01 .149876 .128803 .12827 .170815
+bezier .120297 .185095 .105529 .197764 .088265 .196215
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="1" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .102235 .21717
+aline .103505 .216535
+aline .104775 .2159
+aline .10541 .215265
+aline .10668 .21463
+aline .107315 .21336
+aline .10795 .212725
+aline .10922 .210185
+aline .10922 .020955
+aline .109855 .02032
+aline .147955 .02032
+bezier .158089 .181709E-01 .158089 .151407E-02 .147955 -.000635
+aline .04699 -.000635
+bezier .368561E-01 .151407E-02 .368561E-01 .181709E-01 .04699 .02032
+aline .08509 .02032
+aline .085725 .020955
+aline .085725 .168275
+bezier .745371E-01 .160302 .566148E-01 .148861 .041275 .15494
+bezier .331243E-01 .161431 .385528E-01 .176096 .048895 .174625
+bezier .069986 .175703 .833536E-01 .195409 .090805 .21336
+aline .093345 .2159
+aline .094615 .216535
+aline .09652 .21717
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="2" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .095885 .21717
+bezier .12876 .215673 .16306 .191107 .165735 .15621
+bezier .16992 .111336 .131518 .797651E-01 .099695 .055245
+bezier .867857E-01 .432924E-01 .699592E-01 .321225E-01 .059055 .02032
+aline .141605 .02032
+aline .14224 .020955
+aline .14224 .029845
+bezier .145456 .396787E-01 .162519 .396787E-01 .165735 .029845
+aline .165735 .00635
+aline .164465 .00381
+aline .16383 .003175
+aline .163195 .001905
+aline .161925 .00127
+aline .16129 .000635
+aline .15875 -.000635
+aline .02667 -.000635
+bezier .156999E-01 .20773E-02 .172391E-01 .177903E-01 .02667 .02159
+bezier .602815E-01 .523261E-01 .993004E-01 .773048E-01 .128905 .112395
+bezier .147138 .134264 .147729 .171077 .121285 .18669
+bezier .972837E-01 .201568 .594886E-01 .200563 .04572 .172085
+aline .045085 .17018
+bezier .506178E-01 .16381 .522135E-01 .149106 .04191 .144145
+bezier .330922E-01 .138934 .020475 .144692 .01905 .15494
+bezier .161836E-01 .194828 .059309 .222057 .095885 .21717
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="3" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .102235 .21717
+bezier .130122 .215577 .163948 .193405 .158115 .161925
+bezier .157393 .143076 .144491 .12697 .12954 .11684
+bezier .1586 .104481 .178059 .697306E-01 .1651 .03937
+bezier .150791 .339508E-02 .107737 -.993364E-02 .073025 -.003175
+bezier .452081E-01 .411446E-04 .131149E-01 .019493 .015875 .0508
+bezier .179931E-01 .669282E-01 .442369E-01 .669282E-01 .046355 .0508
+aline .046355 .045085
+aline .04572 .042545
+aline .043815 .038735
+aline .04191 .03683
+bezier .573923E-01 .175931E-01 .857551E-01 .013747 .10795 .018415
+bezier .138069 .231117E-01 .158 .619832E-01 .13589 .085725
+bezier .127518 .971475E-01 .112788 .102522 .099695 .104775
+aline .069215 .104775
+bezier .569436E-01 .108398 .617275E-01 .12947 .07493 .12573
+bezier .092905 .1271 .115337 .127156 .127 .14478
+bezier .138614 .158063 .138525 .181206 .12065 .18923
+bezier .100517 .200117 .757081E-01 .197979 .05588 .187325
+aline .05334 .184785
+bezier .634313E-01 .17371 .496503E-01 .156014 .03683 .160655
+bezier .215145E-01 .165699 .245523E-01 .185904 .032385 .196215
+bezier .498233E-01 .216534 .778288E-01 .217423 .102235 .21717
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="4" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .125095 .217805
+aline .127 .21717
+aline .12827 .216535
+aline .131445 .21336
+aline .13208 .21209
+aline .132715 .210185
+aline .132715 .080645
+aline .13335 .08001
+aline .167005 .08001
+bezier .176529 .772897E-01 .176529 .617753E-01 .167005 .059055
+aline .13335 .059055
+aline .132715 .05842
+aline .132715 .020955
+aline .13335 .02032
+aline .16129 .02032
+bezier .17139 .181959E-01 .17139 .148909E-02 .16129 -.000635
+aline .08509 -.000635
+bezier .07499 .148909E-02 .07499 .181959E-01 .08509 .02032
+aline .11303 .02032
+aline .113665 .020955
+aline .113665 .05842
+aline .11303 .059055
+aline .01778 .059055
+bezier .770962E-02 .630776E-01 .930216E-02 .780164E-01 .01397 .085725
+bezier .428158E-01 .128922 .690208E-01 .174494 .09906 .216535
+aline .10033 .21717
+aline .102235 .217805
+closepath
+! end of curve
+
+! start of curve
+amove .112395 .201295
+bezier .868852E-01 .161097 .594125E-01 .119877 .03556 .08001
+aline .11303 .08001
+aline .113665 .080645
+aline .113665 .20193
+aline .11303 .202565
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="5" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .146685 .21336
+bezier .156209 .21064 .156209 .195125 .146685 .192405
+aline .05588 .192405
+aline .055245 .19177
+aline .055245 .12573
+bezier .846757E-01 .140595 .128173 .140078 .14986 .11049
+bezier .176788 .800478E-01 .168317 .281807E-01 .132715 .008255
+bezier .975767E-01 -.145265E-01 .396774E-01 -.784977E-02 .02159 .033655
+bezier .171597E-01 .448156E-01 .016823 .633119E-01 .032385 .065405
+bezier .469304E-01 .677345E-01 .552707E-01 .482487E-01 .452438E-01 .384175E-01
+bezier .068077 -.184422E-03 .137243 .015637 .141605 .060325
+bezier .146846 .880772E-01 .119945 .12002 .090805 .113665
+bezier .743013E-01 .113848 .058974 .104363 .04826 .092075
+aline .046355 .09144
+aline .038735 .09144
+aline .034925 .093345
+aline .033655 .094615
+aline .03175 .098425
+aline .03175 .206375
+aline .033655 .210185
+aline .034925 .211455
+aline .037465 .212725
+aline .038735 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="6" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .12065 .21717
+bezier .141799 .21694 .164456 .198302 .15875 .17526
+bezier .1542 .16117 .130856 .162916 .128905 .1778
+aline .128905 .183515
+aline .12954 .186055
+aline .13081 .188595
+aline .131445 .18923
+bezier .131024 .194487 .12199 .194539 .11811 .196215
+bezier .076212 .199024 .446981E-01 .156028 .043815 .117475
+bezier .741575E-01 .146072 .128446 .145036 .1524 .108585
+bezier .177305 .772481E-01 .166944 .263359E-01 .13208 .00635
+bezier .10053 -.150235E-01 .526303E-01 -.438291E-02 .034925 .029845
+bezier .168942E-01 .645784E-01 .154738E-01 .104303 .023495 .141605
+bezier .347378E-01 .184592 .748295E-01 .22158 .12065 .21717
+closepath
+! end of curve
+
+! start of curve
+amove .085725 .11557
+bezier .620444E-01 .11355 .393859E-01 .896451E-01 .047625 .065405
+bezier .484005E-01 .404683E-01 .717685E-01 .114368E-01 .09906 .017145
+bezier .136298 .019961 .156368 .701014E-01 .131445 .09779
+bezier .121456 .112426 .102549 .119144 .085725 .11557
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="7" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .032385 .219075
+aline .033655 .21844
+aline .034925 .217805
+aline .03556 .21717
+aline .03683 .216535
+aline .037465 .215265
+aline .0381 .21463
+aline .038735 .21336
+aline .161925 .21336
+bezier .169852 .211122 .171758 .198826 .1651 .19431
+bezier .112268 .145782 .832124E-01 .729661E-01 .083185 .003175
+bezier .797511E-01 -.778957E-02 .620173E-01 -.638656E-02 .060325 .00508
+bezier .058939 .719511E-01 .858915E-01 .141864 .132556 .191453
+aline .13208 .192405
+aline .040005 .192405
+aline .03937 .19177
+aline .03937 .18288
+bezier .361536E-01 .173046 .190914E-01 .173046 .015875 .18288
+aline .015875 .21209
+aline .017145 .21463
+aline .01778 .215265
+aline .018415 .216535
+aline .019685 .21717
+aline .02032 .217805
+aline .02159 .21844
+aline .02286 .219075
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="8" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .099695 .21717
+bezier .133164 .216318 .173265 .185763 .161925 .14859
+bezier .154679 .13108 .137661 .120143 .120015 .114935
+bezier .150128 .107426 .177351 .769792E-01 .167005 .045085
+bezier .14755 -.153022E-01 .547571E-01 -.021463 .023495 .03175
+bezier .702132E-02 .057319 .184085E-01 .09197 .04445 .106045
+aline .04953 .108585
+aline .050165 .10922
+aline .05207 .109855
+aline .05588 .11176
+aline .057785 .112395
+aline .059055 .11303
+aline .06477 .114935
+bezier .408772E-01 .121081 .155514E-01 .14268 .02159 .169545
+bezier .293881E-01 .203674 .677425E-01 .220014 .099695 .21717
+closepath
+! end of curve
+
+! start of curve
+amove .085725 .19558
+bezier .635571E-01 .195387 .361658E-01 .173651 .04699 .14986
+bezier .644714E-01 .117163 .120314 .117163 .137795 .14986
+bezier .148619 .173651 .121228 .195387 .09906 .19558
+aline .098425 .196215
+aline .08636 .196215
+aline .085725 .19558
+closepath
+! end of curve
+
+! start of curve
+amove .090805 .10414
+bezier .610203E-01 .106236 .278878E-01 .745379E-01 .04318 .04445
+bezier .635055E-01 .290927E-02 .136233 .907903E-02 .145415 .05588
+bezier .148368 .848651E-01 .117384 .106551 .090805 .10414
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="9" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .100965 .21717
+bezier .141992 .21296 .163579 .168361 .164465 .131445
+bezier .172547 .814299E-01 .153085 .186332E-01 .100965 -.000635
+bezier .077528 -.727629E-02 .470284E-01 -.763669E-02 .03048 .013335
+bezier .235684E-01 .235113E-01 .217404E-01 .422667E-01 .036195 .04699
+bezier .499006E-01 .512485E-01 .062426 .337624E-01 .052705 .02286
+bezier .831217E-01 .387525E-02 .121822 .293644E-01 .132715 .060325
+bezier .137196 .071544 .141892 .840804E-01 .14097 .09525
+bezier .110627 .666532E-01 .563385E-01 .676886E-01 .032385 .10414
+bezier .844823E-02 .1343 .168391E-01 .183586 .050165 .203835
+bezier .645434E-01 .215471 .832054E-01 .217949 .100965 .21717
+closepath
+! end of curve
+
+! start of curve
+amove .08763 .19558
+bezier .548391E-01 .193665 .032465 .155007 .046355 .12573
+bezier .056781 .100458 .883564E-01 .887848E-01 .112395 .100965
+bezier .129181 .107019 .143099 .126302 .137795 .14351
+bezier .138303 .168953 .116189 .20146 .08763 .19558
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=":" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.430555 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .095885 .14986
+aline .09906 .149225
+aline .10541 .14605
+aline .11049 .14097
+bezier .122718 .125113 .105252 .100945 .08636 .107315
+aline .08001 .11049
+aline .07493 .11557
+aline .071755 .12192
+aline .07112 .125095
+aline .07112 .131445
+aline .071755 .13462
+aline .07493 .14097
+aline .08001 .14605
+aline .08636 .149225
+aline .089535 .14986
+closepath
+! end of curve
+
+! start of curve
+amove .095885 .042545
+aline .09906 .04191
+aline .10541 .038735
+aline .11049 .033655
+bezier .122718 .177978E-01 .105252 -.636978E-02 .08636 0
+aline .08001 .003175
+aline .07493 .008255
+aline .071755 .014605
+aline .07112 .01778
+aline .07112 .02413
+aline .071755 .027305
+aline .07493 .033655
+aline .08001 .038735
+aline .08636 .04191
+aline .089535 .042545
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=";" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.430555 dep=.138888 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .095885 .14986
+aline .09906 .149225
+aline .10541 .14605
+aline .11049 .14097
+bezier .122718 .125113 .105252 .100945 .08636 .107315
+aline .08001 .11049
+aline .07493 .11557
+aline .071755 .12192
+aline .07112 .125095
+aline .07112 .131445
+aline .071755 .13462
+aline .07493 .14097
+aline .08001 .14605
+aline .08636 .149225
+aline .089535 .14986
+closepath
+! end of curve
+
+! start of curve
+amove .095885 .042545
+bezier .118019 .373843E-01 .118528 .942451E-02 .1143 -.008255
+bezier .108531 -.274066E-01 .933909E-01 -.464001E-01 .073025 -.04953
+aline .07112 -.048895
+aline .06985 -.04826
+aline .065405 -.043815
+aline .064135 -.041275
+bezier .061965 -.277341E-01 .802424E-01 -.283151E-01 .08509 -.018415
+aline .086995 -.01651
+aline .08763 -.01524
+aline .088265 -.014605
+aline .0889 -.013335
+aline .089535 -.0127
+aline .09144 -.00889
+aline .937683E-01 -.001905
+aline .093345 -.000635
+bezier .718745E-01 -.325078E-02 .626219E-01 .0289 .080645 .03937
+aline .084455 .041275
+aline .08636 .04191
+aline .0889 .042545
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="<" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.555555 dep=-.0555553 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .153035 .194945
+bezier .16687 .194493 .168439 .173764 .155575 .17018
+bezier .122209 .148906 .886683E-01 .127874 .055245 .10668
+bezier .907571E-01 .833299E-01 .128379 .622514E-01 .16256 .037465
+bezier .170647 .272272E-01 .155435 .122225E-01 .145415 .020955
+bezier .104313 .471482E-01 .622988E-01 .720755E-01 .022225 .099695
+bezier .149192E-01 .111205 .279862E-01 .119513 .03683 .123825
+bezier .739963E-01 .147441 .111063 .171194 .14859 .19431
+aline .151765 .194945
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="=" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.415624 dep=-.195488 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .16129 .145415
+bezier .173858 .143219 .173858 .12348 .16129 .121285
+aline .023495 .121285
+bezier .109274E-01 .12348 .109274E-01 .143219 .023495 .145415
+closepath
+! end of curve
+
+! start of curve
+amove .16129 .092075
+bezier .173858 .898795E-01 .173858 .701405E-01 .16129 .067945
+aline .023495 .067945
+bezier .109274E-01 .701405E-01 .109274E-01 .898795E-01 .023495 .092075
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=">" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.555555 dep=-.0555553 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .03302 .194945
+bezier .763939E-01 .171497 .116935 .14228 .159385 .11684
+bezier .169476 .109767 .163188 .956637E-01 .153035 .09271
+bezier .114136 .680911E-01 .754228E-01 .432133E-01 .036195 .01905
+bezier .221228E-01 .137333E-01 .133954E-01 .365737E-01 .027305 .04191
+bezier .612435E-01 .063694 .954893E-01 .850516E-01 .12954 .10668
+bezier .940279E-01 .13003 .564064E-01 .151109 .022225 .175895
+bezier .163936E-01 .183578 .232981E-01 .195814 .03302 .194945
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="?" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .10033 .215265
+bezier .12458 .214146 .157602 .204995 .16256 .17653
+bezier .165642 .155168 .1474 .140492 .130175 .132715
+bezier .116166 .123711 .104489 .109932 .100965 .093345
+aline .100965 .073025
+aline .10033 .070485
+aline .09906 .067945
+aline .09652 .065405
+aline .09398 .064135
+aline .08001 .064135
+aline .07747 .065405
+aline .07493 .067945
+bezier .705969E-01 .088368 .744446E-01 .111792 .0889 .127635
+bezier .101667 .143507 .120306 .151232 .13589 .163195
+bezier .145358 .175602 .130975 .18832 .118745 .1905
+bezier .963175E-01 .195795 .696123E-01 .19818 .050165 .18288
+bezier .534898E-01 .175432 .054559 .163689 .04572 .15875
+bezier .334448E-01 .151321 .185251E-01 .16359 .022225 .177165
+bezier .261774E-01 .203368 .555348E-01 .213846 .078105 .215265
+aline .10033 .215265
+closepath
+! end of curve
+
+! start of curve
+amove .09017 .033655
+bezier .106371 .311197E-01 .109279 .669062E-02 .09398 .000635
+bezier .791145E-01 -.668551E-02 .628399E-01 .124733E-01 .07239 .026035
+aline .07747 .031115
+aline .08001 .032385
+aline .081915 .03302
+aline .08382 .033655
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="@" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .113665 .215265
+bezier .14755 .211826 .165191 .175431 .16637 .14478
+bezier .170501 .110561 .172304 .658898E-01 .1397 .04318
+bezier .117967 .278075E-01 .887073E-01 .417594E-01 .078105 .0635
+bezier .605707E-01 .974643E-01 .641571E-01 .145512 .09652 .169545
+bezier .109456 .178493 .126907 .177544 .139827 .169926
+bezier .135528 .189178 .111356 .198967 .09398 .192405
+bezier .431032E-01 .179296 .235424E-01 .115666 .041275 .07112
+bezier .526445E-01 .313201E-01 .103805 .180819E-02 .1397 .02921
+aline .14097 .03048
+aline .14224 .031115
+bezier .148487 .410288E-01 .170845 .391744E-01 .168275 .024765
+bezier .140062 -.108958E-01 .817335E-01 -.108941E-01 .050165 .020955
+bezier -.121055E-02 .704007E-01 .509599E-02 .166831 .06731 .20447
+aline .0762 .208915
+aline .078105 .20955
+aline .079375 .210185
+aline .086995 .212725
+aline .092075 .213995
+aline .09525 .213995
+aline .095885 .21463
+aline .099695 .21463
+aline .10033 .215265
+aline .113665 .215265
+closepath
+! end of curve
+
+! start of curve
+amove .140335 .17018
+aline .1397 .169545
+aline .140335 .16891
+aline .14097 .169545
+aline .140335 .17018
+closepath
+! end of curve
+
+! start of curve
+amove .1143 .154305
+bezier .893645E-01 .145932 .834507E-01 .113034 .0889 .090805
+bezier .914707E-01 .730008E-01 .109175 .497799E-01 .12827 .06096
+bezier .153765 .079038 .15475 .118161 .13843 .142875
+bezier .132824 .150011 .124417 .156001 .114935 .15494
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="A" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .10033 .217805
+bezier .114046 .214324 .111327 .196721 .11557 .186055
+bezier .128498 .130828 .140799 .753472E-01 .154305 .02032
+aline .167005 .02032
+bezier .177312 .182331E-01 .177312 .145194E-02 .167005 -.000635
+aline .11684 -.000635
+bezier .10674 .148909E-02 .10674 .181959E-01 .11684 .02032
+aline .128905 .02032
+bezier .127025 .322416E-01 .123629 .450316E-01 .12065 .05715
+aline .064135 .05715
+bezier .611559E-01 .450316E-01 .577595E-01 .322412E-01 .05588 .02032
+aline .067945 .02032
+bezier .078045 .181959E-01 .078045 .148909E-02 .067945 -.000635
+aline .01778 -.000635
+bezier .747256E-02 .145194E-02 .747256E-02 .182331E-01 .01778 .02032
+aline .03048 .02032
+bezier .469034E-01 .842963E-01 .590295E-01 .149964 .076835 .21336
+aline .07874 .215265
+aline .08001 .2159
+aline .080645 .216535
+aline .081915 .21717
+aline .084455 .217805
+closepath
+! end of curve
+
+! start of curve
+amove .09144 .188595
+bezier .872564E-01 .152153 .757839E-01 .114445 .069215 .078105
+aline .11557 .078105
+bezier .108591 .114787 .978556E-01 .153462 .09271 .189865
+aline .09144 .188595
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="B" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .109855 .21336
+bezier .14669 .211853 .177141 .166211 .154305 .133985
+bezier .147441 .123638 .137055 .115748 .125095 .11176
+bezier .156956 .105049 .178707 .693121E-01 .16637 .038735
+bezier .159412 .173975E-01 .138781 .156916E-02 .11684 -.000635
+aline .01651 -.000635
+bezier .637608E-02 .151407E-02 .637608E-02 .181709E-01 .01651 .02032
+aline .032385 .02032
+aline .03302 .020955
+aline .03302 .19177
+aline .032385 .192405
+aline .01651 .192405
+bezier .637608E-02 .194554 .637608E-02 .211211 .01651 .21336
+aline .109855 .21336
+closepath
+! end of curve
+
+! start of curve
+amove .056515 .19177
+aline .056515 .12192
+aline .05715 .121285
+aline .102235 .121285
+bezier .126197 .123408 .148193 .151864 .133985 .174625
+bezier .12924 .184731 .117978 .190385 .10795 .192405
+aline .05715 .192405
+aline .056515 .19177
+closepath
+! end of curve
+
+! start of curve
+amove .056515 .099695
+aline .056515 .020955
+aline .05715 .02032
+aline .108585 .02032
+bezier .131939 .220463E-01 .153147 .473596E-01 .144145 .070485
+bezier .14031 .862662E-01 .12585 .098114 .11049 .10033
+aline .05715 .10033
+aline .056515 .099695
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="C" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .106045 .21717
+bezier .120227 .216361 .134811 .207596 .145415 .20066
+bezier .148326 .209437 .154713 .221944 .165735 .2159
+aline .16637 .215265
+aline .16764 .21463
+aline .168275 .21336
+aline .16891 .212725
+aline .17018 .210185
+aline .17018 .146685
+bezier .166146 .134801 .144774 .138158 .14605 .15113
+bezier .143946 .181105 .110121 .207267 .081915 .19177
+bezier .423538E-01 .170701 .319914E-01 .118065 .041275 .07874
+bezier .474851E-01 .464923E-01 .743885E-01 .112599E-01 .109855 .017145
+bezier .130812 .213227E-01 .148301 .041363 .146685 .062865
+bezier .149901 .726987E-01 .166964 .726987E-01 .17018 .062865
+bezier .173784 .103772E-01 .105322 -.227896E-01 .0635 .005715
+bezier .171025E-01 .354506E-01 .586313E-02 .986144E-01 .02032 .147955
+bezier .030998 .185457 .644813E-01 .221173 .106045 .21717
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="D" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .100965 .21336
+bezier .146308 .206546 .16824 .154802 .17018 .1143
+bezier .173091 .701083E-01 .155519 .151839E-01 .108585 .000635
+aline .10541 0
+aline .1016 0
+aline .100965 -.000635
+aline .01524 -.000635
+bezier .493256E-02 .145194E-02 .493256E-02 .182331E-01 .01524 .02032
+aline .02921 .02032
+aline .029845 .020955
+aline .029845 .19177
+aline .02921 .192405
+aline .01524 .192405
+bezier .493256E-02 .194492 .493256E-02 .211273 .01524 .21336
+aline .100965 .21336
+closepath
+! end of curve
+
+! start of curve
+amove .05334 .19177
+aline .05334 .020955
+aline .053975 .02032
+aline .094615 .02032
+bezier .128622 .270756E-01 .143808 .649008E-01 .146685 .09525
+bezier .148113 .129368 .138838 .170892 .106045 .188595
+aline .10414 .18923
+aline .10287 .189865
+aline .100965 .1905
+aline .098425 .191135
+aline .09779 .19177
+aline .094615 .19177
+aline .09398 .192405
+aline .053975 .192405
+aline .05334 .19177
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="E" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .161925 .21336
+aline .163195 .212725
+aline .164465 .21209
+aline .1651 .211455
+aline .16637 .21082
+aline .167005 .20955
+aline .16764 .208915
+aline .16891 .206375
+aline .16891 .16637
+bezier .165694 .156536 .148631 .156536 .145415 .16637
+aline .145415 .19177
+aline .14478 .192405
+aline .059055 .192405
+aline .05842 .19177
+aline .05842 .121285
+aline .059055 .12065
+aline .10414 .12065
+aline .104775 .121285
+aline .104775 .13335
+bezier .107991 .143184 .125054 .143184 .12827 .13335
+aline .12827 .086995
+bezier .125054 .771613E-01 .107991 .771613E-01 .104775 .086995
+aline .104775 .09906
+aline .10414 .099695
+aline .059055 .099695
+aline .05842 .09906
+aline .05842 .020955
+aline .059055 .02032
+aline .1524 .02032
+aline .153035 .020955
+aline .153035 .05207
+bezier .156251 .619037E-01 .173314 .619037E-01 .17653 .05207
+aline .17653 .00635
+aline .17526 .00381
+aline .174625 .003175
+aline .17399 .001905
+aline .17272 .00127
+aline .172085 .000635
+aline .169545 -.000635
+aline .017145 -.000635
+aline .013335 .00127
+aline .012065 .00254
+aline .01016 .00635
+aline .01016 .013335
+aline .012065 .017145
+aline .013335 .018415
+aline .017145 .02032
+aline .03429 .02032
+aline .034925 .020955
+aline .034925 .19177
+aline .03429 .192405
+aline .017145 .192405
+aline .013335 .19431
+aline .012065 .19558
+aline .01016 .19939
+aline .01016 .206375
+aline .012065 .210185
+aline .013335 .211455
+aline .015875 .212725
+aline .017145 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="F" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .1651 .21336
+aline .16637 .212725
+aline .16764 .21209
+aline .168275 .211455
+aline .169545 .21082
+aline .17018 .20955
+aline .170815 .208915
+aline .172085 .206375
+aline .172085 .16637
+bezier .168869 .156536 .151806 .156536 .14859 .16637
+aline .14859 .19177
+aline .147955 .192405
+aline .06096 .192405
+aline .060325 .19177
+aline .060325 .117475
+aline .06096 .11684
+aline .10795 .11684
+aline .108585 .117475
+aline .108585 .12954
+bezier .111801 .139374 .128864 .139374 .13208 .12954
+aline .13208 .083185
+bezier .128864 .733513E-01 .111801 .733513E-01 .108585 .083185
+aline .108585 .09525
+aline .10795 .095885
+aline .06096 .095885
+aline .060325 .09525
+aline .060325 .020955
+aline .06096 .02032
+aline .085725 .02032
+bezier .952955E-01 .177169E-01 .952955E-01 .196808E-02 .085725 -.000635
+aline .018415 -.000635
+bezier .810756E-02 .145194E-02 .810756E-02 .182331E-01 .018415 .02032
+aline .036195 .02032
+aline .03683 .020955
+aline .03683 .19177
+aline .036195 .192405
+aline .018415 .192405
+bezier .810756E-02 .194492 .810756E-02 .211273 .018415 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="G" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .09779 .21717
+bezier .110663 .216651 .1239 .208131 .13335 .20193
+bezier .135844 .210571 .142779 .221667 .153035 .2159
+aline .15367 .215265
+aline .15494 .21463
+aline .155575 .21336
+aline .15621 .212725
+aline .15748 .210185
+aline .15748 .146685
+bezier .153446 .134801 .132074 .138158 .13335 .15113
+bezier .131994 .174896 .110423 .202489 .08509 .194945
+bezier .522051E-01 .184505 .040346 .1454 .037465 .11557
+bezier .036211 .809877E-01 .449302E-01 .392038E-01 .07747 .02032
+bezier .977106E-01 .893655E-02 .120984 .245089E-01 .127 .045085
+aline .12954 .052705
+aline .13081 .057785
+aline .131445 .06096
+aline .13208 .061595
+aline .13208 .06477
+aline .132715 .065405
+aline .132715 .069215
+aline .133096 .07112
+aline .132715 .073025
+aline .11176 .073025
+bezier .101626 .751741E-01 .101626 .918309E-01 .11176 .09398
+aline .16637 .09398
+bezier .176677 .918931E-01 .176677 .751119E-01 .16637 .073025
+aline .158115 .073025
+aline .15748 .07239
+aline .15748 .00635
+bezier .154264 -.348374E-02 .137201 -.348374E-02 .133985 .00635
+aline .133985 .013335
+bezier .124756 .578638E-02 .111443 -.374488E-02 .09779 -.004445
+bezier .543833E-01 -.79351E-02 .247723E-01 .343716E-01 .017145 .073025
+bezier .758755E-02 .120333 .175834E-01 .180294 .061595 .208915
+aline .069215 .212725
+aline .07112 .21336
+aline .07239 .213995
+aline .0762 .215265
+aline .07874 .2159
+aline .081915 .216535
+aline .08509 .216535
+aline .085725 .21717
+aline .09779 .21717
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="H" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .070485 .21336
+aline .071755 .212725
+aline .074295 .211455
+aline .075565 .210185
+aline .07747 .206375
+aline .07747 .19939
+aline .075565 .19558
+aline .074295 .19431
+aline .070485 .192405
+aline .055245 .192405
+aline .05461 .19177
+aline .05461 .12192
+aline .055245 .121285
+aline .12954 .121285
+aline .130175 .12192
+aline .130175 .19177
+aline .12954 .192405
+aline .1143 .192405
+aline .11049 .19431
+aline .10922 .19558
+aline .107315 .19939
+aline .107315 .206375
+aline .10922 .210185
+aline .11049 .211455
+aline .1143 .21336
+aline .169545 .21336
+aline .173355 .211455
+aline .174625 .210185
+aline .17653 .206375
+aline .17653 .19939
+aline .174625 .19558
+aline .173355 .19431
+aline .169545 .192405
+aline .154305 .192405
+aline .15367 .19177
+aline .15367 .020955
+aline .154305 .02032
+aline .169545 .02032
+aline .173355 .018415
+aline .174625 .017145
+aline .17653 .013335
+aline .17653 .00635
+aline .174625 .00254
+aline .173355 .00127
+aline .169545 -.000635
+aline .1143 -.000635
+aline .11049 .00127
+aline .10922 .00254
+aline .107315 .00635
+aline .107315 .013335
+aline .10922 .017145
+aline .11049 .018415
+aline .1143 .02032
+aline .12954 .02032
+aline .130175 .020955
+aline .130175 .099695
+aline .12954 .10033
+aline .055245 .10033
+aline .05461 .099695
+aline .05461 .020955
+aline .055245 .02032
+aline .070485 .02032
+aline .074295 .018415
+aline .075565 .017145
+aline .07747 .013335
+aline .07747 .00635
+aline .075565 .00254
+aline .074295 .00127
+aline .070485 -.000635
+aline .01524 -.000635
+aline .01143 .00127
+aline .01016 .00254
+aline .008255 .00635
+aline .008255 .013335
+aline .01016 .017145
+aline .01143 .018415
+aline .01524 .02032
+aline .03048 .02032
+aline .031115 .020955
+aline .031115 .19177
+aline .03048 .192405
+aline .01524 .192405
+aline .01143 .19431
+aline .01016 .19558
+aline .008255 .19939
+aline .008255 .206375
+aline .01016 .210185
+aline .01143 .211455
+aline .01397 .212725
+aline .01524 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="I" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .149225 .21336
+bezier .15888 .210935 .15888 .19483 .149225 .192405
+aline .104775 .192405
+aline .10414 .19177
+aline .10414 .020955
+aline .104775 .02032
+aline .149225 .02032
+bezier .15888 .178954E-01 .15888 .178964E-02 .149225 -.000635
+aline .03556 -.000635
+bezier .259046E-01 .178964E-02 .259046E-01 .178954E-01 .03556 .02032
+aline .08001 .02032
+aline .080645 .020955
+aline .080645 .19177
+aline .08001 .192405
+aline .03556 .192405
+bezier .259046E-01 .19483 .259046E-01 .210935 .03556 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="J" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .160655 .21336
+aline .161925 .212725
+aline .164465 .211455
+aline .165735 .210185
+aline .16764 .206375
+aline .16764 .19939
+aline .165735 .19558
+aline .164465 .19431
+aline .160655 .192405
+aline .14351 .192405
+aline .142875 .19177
+aline .142875 .03937
+bezier .138485 .641454E-02 .992514E-01 -.103873E-01 .06985 -.003175
+bezier .475102E-01 -.256336E-02 .213475E-01 .154298E-01 .02667 .040005
+bezier .311158E-01 .547085E-01 .546433E-01 .527222E-01 .056515 .037465
+aline .056515 .03175
+aline .055245 .02794
+aline .541338E-01 .257175E-01
+bezier .727833E-01 .011011 .108115 .126674E-01 .11811 .037465
+aline .118745 .04064
+aline .11938 .041275
+aline .11938 .19177
+aline .118745 .192405
+aline .08382 .192405
+bezier .735126E-01 .194492 .735126E-01 .211273 .08382 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="K" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .065405 .21336
+bezier .757124E-01 .211273 .757124E-01 .194492 .065405 .192405
+aline .051435 .192405
+aline .0508 .19177
+aline .0508 .099695
+bezier .606771E-01 .108139 .696124E-01 .122712 .079375 .13335
+bezier .939806E-01 .153266 .112271 .172347 .125095 .192405
+bezier .112708 .188596 .106125 .207584 .117475 .212725
+aline .11938 .21336
+aline .163195 .21336
+bezier .173502 .211273 .173502 .194492 .163195 .192405
+aline .15113 .192405
+bezier .133402 .169635 .114557 .147528 .973667E-01 .12446
+bezier .116697 .896495E-01 .136075 .546404E-01 .15621 .02032
+aline .16637 .02032
+bezier .176677 .182331E-01 .176677 .145194E-02 .16637 -.000635
+aline .127 -.000635
+bezier .116693 .145194E-02 .116693 .182331E-01 .127 .02032
+aline .132715 .02032
+bezier .118274 .049041 .100335 .791991E-01 .08382 .10795
+bezier .724449E-01 .946689E-01 .620724E-01 .806651E-01 .0508 .06731
+aline .0508 .020955
+aline .051435 .02032
+aline .065405 .02032
+bezier .757124E-01 .182331E-01 .757124E-01 .145194E-02 .065405 -.000635
+aline .017145 -.000635
+bezier .683756E-02 .145194E-02 .683756E-02 .182331E-01 .017145 .02032
+aline .031115 .02032
+aline .03175 .020955
+aline .03175 .19177
+aline .031115 .192405
+aline .017145 .192405
+bezier .683756E-02 .194492 .683756E-02 .211273 .017145 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="L" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .0889 .21336
+aline .09017 .212725
+aline .09271 .211455
+aline .094615 .20955
+aline .095885 .20701
+aline .095885 .198755
+aline .094615 .196215
+aline .09271 .19431
+aline .0889 .192405
+aline .062865 .192405
+aline .06223 .19177
+aline .06223 .020955
+aline .062865 .02032
+aline .14732 .02032
+aline .147955 .020955
+aline .147955 .051435
+bezier .150453 .620869E-01 .168952 .620869E-01 .17145 .051435
+aline .17145 .00635
+aline .17018 .00381
+aline .169545 .003175
+aline .16891 .001905
+aline .16764 .00127
+aline .167005 .000635
+aline .164465 -.000635
+aline .01905 -.000635
+bezier .879278E-02 .143465E-02 .879278E-02 .182503E-01 .01905 .02032
+aline .0381 .02032
+aline .038735 .020955
+aline .038735 .19177
+aline .0381 .192405
+aline .01905 .192405
+bezier .879278E-02 .194475 .879278E-02 .21129 .01905 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="M" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .04699 .21336
+aline .048895 .212725
+aline .0508 .21209
+aline .051435 .211455
+aline .052705 .21082
+aline .05588 .207645
+aline .057785 .203835
+aline .07366 .15621
+bezier .797399E-01 .135737 .877344E-01 .11519 .092075 .094615
+bezier .978276E-01 .115073 .104651 .135755 .111125 .15621
+aline .127 .203835
+aline .128905 .207645
+aline .13208 .21082
+aline .13335 .211455
+aline .133985 .21209
+aline .137795 .21336
+aline .170815 .21336
+aline .174625 .211455
+aline .17653 .20955
+aline .1778 .20701
+aline .1778 .198755
+aline .17653 .196215
+aline .174625 .19431
+aline .170815 .192405
+aline .16002 .192405
+aline .159385 .19177
+aline .159385 .020955
+aline .16002 .02032
+aline .170815 .02032
+aline .174625 .018415
+aline .17653 .01651
+aline .1778 .01397
+aline .1778 .005715
+aline .17653 .003175
+aline .174625 .00127
+aline .170815 -.000635
+aline .128905 -.000635
+aline .125095 .00127
+aline .12319 .003175
+aline .12192 .005715
+aline .12192 .01397
+aline .12319 .01651
+aline .125095 .018415
+aline .128905 .02032
+aline .1397 .02032
+aline .140335 .020955
+aline .140335 .18923
+bezier .137062 .182531 .134969 .169591 .131445 .160655
+aline .13081 .158115
+aline .127635 .14859
+aline .127 .14605
+aline .121285 .128905
+aline .12065 .126365
+aline .10541 .080645
+bezier .101933 .681457E-01 .828517E-01 .681457E-01 .079375 .080645
+aline .064135 .126365
+bezier .577033E-01 .147506 .500924E-01 .168326 .045085 .189865
+aline .04445 .18923
+aline .04445 .020955
+aline .045085 .02032
+aline .05588 .02032
+aline .05969 .018415
+aline .061595 .01651
+aline .062865 .01397
+aline .062865 .005715
+aline .061595 .003175
+aline .05969 .00127
+aline .05588 -.000635
+aline .01397 -.000635
+aline .01016 .00127
+aline .008255 .003175
+aline .006985 .005715
+aline .006985 .01397
+aline .008255 .01651
+aline .01016 .018415
+aline .01397 .02032
+aline .024765 .02032
+aline .0254 .020955
+aline .0254 .19177
+aline .024765 .192405
+aline .01397 .192405
+aline .01016 .19431
+aline .008255 .196215
+aline .006985 .198755
+aline .006985 .20701
+aline .008255 .20955
+aline .01016 .211455
+aline .0127 .212725
+aline .01397 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="N" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .055245 .21336
+bezier .703006E-01 .208521 .695942E-01 .189177 .0762 .177165
+bezier .946894E-01 .125761 .114111 .747428E-01 .131445 .02286
+aline .13208 .023495
+aline .13208 .19177
+aline .131445 .192405
+aline .116205 .192405
+aline .112395 .19431
+aline .111125 .19558
+aline .10922 .19939
+aline .10922 .206375
+aline .111125 .210185
+aline .112395 .211455
+aline .116205 .21336
+aline .167005 .21336
+aline .170815 .211455
+aline .172085 .210185
+aline .17399 .206375
+aline .17399 .19939
+aline .172085 .19558
+aline .170815 .19431
+aline .167005 .192405
+aline .151765 .192405
+aline .15113 .19177
+aline .15113 .00635
+aline .14986 .00381
+aline .149225 .003175
+aline .14859 .001905
+aline .14732 .00127
+aline .146685 .000635
+aline .144145 -.000635
+aline .12954 -.000635
+bezier .114484 .420364E-02 .115191 .235483E-01 .108585 .03556
+bezier .900956E-01 .869642E-01 .070674 .137982 .05334 .189865
+aline .052705 .18923
+aline .052705 .020955
+aline .05334 .02032
+aline .06858 .02032
+aline .07239 .018415
+aline .07366 .017145
+aline .075565 .013335
+aline .075565 .00635
+aline .07366 .00254
+aline .07239 .00127
+aline .06858 -.000635
+aline .01778 -.000635
+aline .01397 .00127
+aline .0127 .00254
+aline .010795 .00635
+aline .010795 .013335
+aline .0127 .017145
+aline .01397 .018415
+aline .01778 .02032
+aline .03302 .02032
+aline .033655 .020955
+aline .033655 .19177
+aline .03302 .192405
+aline .01778 .192405
+aline .01397 .19431
+aline .0127 .19558
+aline .010795 .19939
+aline .010795 .206375
+aline .0127 .210185
+aline .01397 .211455
+aline .01651 .212725
+aline .01778 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="O" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .11049 .21717
+bezier .127632 .216411 .150527 .21194 .156845 .192405
+bezier .163354 .174055 .162735 .155715 .164465 .13716
+aline .164465 .075565
+bezier .161598 .526144E-01 .165403 .249584E-01 .14732 .00635
+bezier .136876 -.235565E-02 .122714 -.312107E-02 .11049 -.004445
+aline .074295 -.004445
+bezier .571528E-01 -.368601E-02 .342577E-01 .78462E-03 .02794 .02032
+bezier .214311E-01 .386695E-01 .220499E-01 .570095E-01 .02032 .075565
+aline .02032 .13716
+bezier .231865E-01 .160111 .193821E-01 .187767 .037465 .206375
+bezier .047909 .215081 .620708E-01 .215846 .074295 .21717
+aline .11049 .21717
+closepath
+! end of curve
+
+! start of curve
+amove .079375 .19558
+bezier .657885E-01 .195874 .502521E-01 .188414 .04826 .173355
+bezier .044923 .161592 .450939E-01 .149779 .043815 .137795
+aline .043815 .080645
+bezier .461835E-01 .618152E-01 .431512E-01 .394646E-01 .057785 .02413
+bezier .765709E-01 .133819E-01 .998972E-01 .148993E-01 .120015 .02032
+bezier .138965 .276978E-01 .137875 .514857E-01 .140335 .06731
+aline .140335 .08001
+aline .14097 .080645
+aline .14097 .137795
+bezier .138522 .155093 .141444 .176906 .126365 .189865
+aline .120015 .19304
+aline .114935 .19431
+aline .11176 .194945
+aline .111125 .19558
+aline .10541 .19558
+aline .104775 .196215
+aline .08001 .196215
+aline .079375 .19558
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="P" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .109855 .21336
+bezier .15136 .211139 .181508 .163402 .164465 .125095
+bezier .155353 .103001 .133428 .870875E-01 .109855 .08509
+aline .059055 .08509
+aline .05842 .084455
+aline .05842 .020955
+aline .059055 .02032
+aline .0762 .02032
+aline .08001 .018415
+aline .08128 .017145
+aline .083185 .013335
+aline .083185 .00635
+aline .08128 .00254
+aline .08001 .00127
+aline .0762 -.000635
+aline .017145 -.000635
+aline .013335 .00127
+aline .012065 .00254
+aline .01016 .00635
+aline .01016 .013335
+aline .012065 .017145
+aline .013335 .018415
+aline .017145 .02032
+aline .03429 .02032
+aline .034925 .020955
+aline .034925 .19177
+aline .03429 .192405
+aline .017145 .192405
+aline .013335 .19431
+aline .012065 .19558
+aline .01016 .19939
+aline .01016 .206375
+aline .012065 .210185
+aline .013335 .211455
+aline .017145 .21336
+aline .109855 .21336
+closepath
+! end of curve
+
+! start of curve
+amove .05842 .19177
+aline .05842 .10668
+aline .059055 .106045
+aline .103505 .106045
+bezier .130551 .10825 .154554 .138305 .14224 .164465
+bezier .135988 .180465 .119351 .189852 .103505 .192405
+aline .059055 .192405
+aline .05842 .19177
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="Q" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=.138888 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .11049 .21717
+bezier .127632 .216411 .150527 .21194 .156845 .192405
+bezier .163354 .174055 .162735 .155715 .164465 .13716
+aline .164465 .075565
+bezier .161598 .526144E-01 .165403 .249584E-01 .14732 .00635
+aline .14605 .005715
+aline .14478 .004445
+aline .14351 .00381
+aline .142875 .003175
+aline .138303 .888996E-03
+bezier .143359 -.014565 .155937 -.285702E-01 .16002 -.04445
+aline .159385 -.046355
+aline .156845 -.048895
+aline .155575 -.04953
+aline .139065 -.04953
+aline .136525 -.04826
+aline .13335 -.045085
+aline .127 -.032385
+aline .126365 -.03175
+aline .120015 -.01905
+aline .11938 -.018415
+aline .112395 -.004445
+aline .111442 -.396875E-02
+aline .11049 -.004445
+aline .074295 -.004445
+bezier .571528E-01 -.368601E-02 .342577E-01 .78462E-03 .02794 .02032
+bezier .214311E-01 .386695E-01 .220499E-01 .570095E-01 .02032 .075565
+aline .02032 .13716
+bezier .231865E-01 .160111 .193821E-01 .187767 .037465 .206375
+bezier .047909 .215081 .620708E-01 .215846 .074295 .21717
+aline .11049 .21717
+closepath
+! end of curve
+
+! start of curve
+amove .08001 .19558
+bezier .660501E-01 .196121 .501166E-01 .187642 .04826 .172085
+bezier .448599E-01 .159702 .450111E-01 .147281 .043815 .13462
+aline .043815 .078105
+bezier .460419E-01 .600686E-01 .434761E-01 .390061E-01 .05715 .02413
+bezier .700381E-01 .156963E-01 .866559E-01 .153456E-01 .100806 .174625E-01
+aline .098425 .022225
+aline .09779 .02286
+aline .09144 .03556
+aline .090805 .036195
+aline .083185 .051435
+aline .083185 .05334
+aline .08382 .055245
+aline .084455 .056515
+aline .08636 .05842
+aline .088265 .059055
+aline .104775 .059055
+bezier .113529 .486168E-01 .118251 .345121E-01 .12573 .02286
+bezier .13887 .325653E-01 .138018 .510422E-01 .140335 .06477
+aline .140335 .07747
+aline .14097 .078105
+aline .14097 .13462
+bezier .138743 .152656 .141309 .173719 .127635 .188595
+bezier .113501 .197914 .960967E-01 .196743 .08001 .19558
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="R" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .092075 .21336
+bezier .128911 .212162 .164093 .173236 .149225 .136525
+bezier .144526 .123257 .134123 .112808 .122555 .10541
+bezier .133355 .098104 .140925 .861193E-01 .142875 .073025
+aline .142875 .03429
+bezier .1443 .277972E-01 .145007 .152293E-01 .15494 .01651
+bezier .163052 .023681 .155548 .377163E-01 .16637 .042545
+aline .177165 .042545
+aline .179705 .041275
+bezier .188074 .314441E-01 .181627 .168686E-01 .175895 .006985
+bezier .162385 -.127046E-01 .12979 -.538749E-02 .12319 .01651
+aline .121285 .022225
+aline .120015 .028575
+aline .120015 .03302
+aline .11938 .033655
+aline .11938 .07112
+bezier .116541 .0852 .102598 .094058 .089535 .095885
+aline .055245 .095885
+aline .05461 .09525
+aline .05461 .020955
+aline .055245 .02032
+aline .070485 .02032
+aline .074295 .018415
+aline .075565 .017145
+aline .07747 .013335
+aline .07747 .00635
+aline .075565 .00254
+aline .074295 .00127
+aline .070485 -.000635
+aline .01524 -.000635
+aline .01143 .00127
+aline .01016 .00254
+aline .008255 .00635
+aline .008255 .013335
+aline .01016 .017145
+aline .01143 .018415
+aline .01524 .02032
+aline .03048 .02032
+aline .031115 .020955
+aline .031115 .19177
+aline .03048 .192405
+aline .01524 .192405
+aline .01143 .19431
+aline .01016 .19558
+aline .008255 .19939
+aline .008255 .206375
+aline .01016 .210185
+aline .01143 .211455
+aline .01524 .21336
+aline .092075 .21336
+closepath
+! end of curve
+
+! start of curve
+amove .05461 .19177
+aline .05461 .117475
+aline .055245 .11684
+aline .088265 .11684
+bezier .10977 .118655 .134662 .138932 .127635 .16256
+bezier .123068 .18029 .10463 .189967 .088265 .192405
+aline .055245 .192405
+aline .05461 .19177
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="S" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .09144 .21717
+bezier .105919 .215801 .121746 .210945 .132715 .20066
+bezier .134839 .208797 .138464 .219894 .149225 .21717
+aline .151765 .2159
+aline .1524 .215265
+aline .15367 .21463
+aline .154305 .21336
+aline .15494 .212725
+aline .15621 .210185
+aline .15621 .14986
+bezier .152176 .137976 .130804 .141333 .13208 .154305
+bezier .130502 .1761 .11178 .19545 .089535 .19558
+bezier .065102 .201478 .319601E-01 .176608 .043815 .14986
+bezier .554872E-01 .12342 .892907E-01 .126079 .11303 .11811
+bezier .150385 .112707 .176637 .706677E-01 .161925 .03556
+bezier .151287 .762679E-02 .119438 -.896906E-02 .090805 -.00381
+bezier .737685E-01 -.441473E-02 .560448E-01 .316191E-02 .04191 .010795
+bezier .411314E-01 .157175E-02 .333881E-01 -.878052E-02 .023495 -.003175
+aline .02286 -.00254
+aline .02159 -.001905
+aline .020955 -.000635
+aline .02032 0
+aline .01905 .00254
+aline .01905 .06223
+bezier .216161E-01 .727288E-01 .039389 .728338E-01 .042545 .062865
+bezier .399891E-01 .397596E-01 .599469E-01 .206684E-01 .08255 .018415
+bezier .106033 .108937E-01 .139467 .222925E-01 .142875 .0508
+bezier .147083 .072388 .12729 .934798E-01 .10541 .09525
+bezier .769526E-01 .10241 .417862E-01 .104993 .026035 .13335
+bezier .622076E-02 .165365 .300232E-01 .208086 .065405 .215265
+aline .071755 .216535
+aline .075565 .216535
+aline .0762 .21717
+aline .09144 .21717
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="T" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .16764 .21336
+aline .16891 .212725
+aline .17018 .21209
+aline .170815 .211455
+aline .172085 .21082
+aline .17272 .20955
+aline .173355 .208915
+aline .174625 .206375
+aline .174625 .16637
+bezier .171409 .156536 .154346 .156536 .15113 .16637
+aline .15113 .19177
+aline .150495 .192405
+aline .104775 .192405
+aline .10414 .19177
+aline .10414 .020955
+aline .104775 .02032
+aline .12954 .02032
+aline .13335 .018415
+aline .13462 .017145
+aline .136525 .013335
+aline .136525 .00635
+aline .13462 .00254
+aline .13335 .00127
+aline .12954 -.000635
+aline .055245 -.000635
+aline .051435 .00127
+aline .050165 .00254
+aline .04826 .00635
+aline .04826 .013335
+aline .050165 .017145
+aline .051435 .018415
+aline .055245 .02032
+aline .08001 .02032
+aline .080645 .020955
+aline .080645 .19177
+aline .08001 .192405
+aline .03429 .192405
+aline .033655 .19177
+aline .033655 .16637
+bezier .304386E-01 .156536 .133764E-01 .156536 .01016 .16637
+aline .01016 .20574
+aline .010795 .207645
+aline .01143 .208915
+aline .014605 .21209
+aline .015875 .212725
+aline .01778 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="U" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .06858 .21336
+aline .06985 .212725
+aline .07239 .211455
+aline .07366 .210185
+aline .075565 .206375
+aline .075565 .19939
+aline .07366 .19558
+aline .07239 .19431
+aline .06858 .192405
+aline .051435 .192405
+aline .0508 .19177
+aline .0508 .06477
+bezier .522388E-01 .409313E-01 .726659E-01 .114119E-01 .099695 .017145
+bezier .120453 .230925E-01 .131965 .452973E-01 .133985 .06477
+aline .133985 .19177
+aline .13335 .192405
+aline .116205 .192405
+aline .112395 .19431
+aline .111125 .19558
+aline .10922 .19939
+aline .10922 .206375
+aline .111125 .210185
+aline .112395 .211455
+aline .116205 .21336
+aline .17526 .21336
+aline .17907 .211455
+aline .18034 .210185
+aline .182245 .206375
+aline .182245 .19939
+aline .18034 .19558
+aline .17907 .19431
+aline .17526 .192405
+aline .158115 .192405
+aline .15748 .19177
+aline .15748 .062865
+bezier .155788 .260736E-01 .12134 -.112633E-01 .08255 -.00381
+bezier .508823E-01 .160396E-02 .296579E-01 .032896 .027305 .062865
+aline .027305 .19177
+aline .02667 .192405
+aline .009525 .192405
+aline .005715 .19431
+aline .004445 .19558
+aline .00254 .19939
+aline .00254 .206375
+aline .004445 .210185
+aline .005715 .211455
+aline .008255 .212725
+aline .009525 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="V" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .0635 .21336
+bezier .0736 .211236 .0736 .194529 .0635 .192405
+aline .05207 .192405
+aline .516731E-01 .190818
+aline .05207 .18923
+aline .052705 .187325
+aline .064135 .141605
+aline .06477 .1397
+aline .074295 .1016
+bezier .802266E-01 .754327E-01 .879244E-01 .490097E-01 .092075 .02286
+bezier .976009E-01 .484961E-01 .104145 .755193E-01 .11049 .1016
+aline .120015 .1397
+aline .12065 .141605
+aline .13208 .187325
+aline .132715 .18923
+aline .133112 .190818
+aline .132715 .192405
+aline .121285 .192405
+bezier .111185 .194529 .111185 .211236 .121285 .21336
+aline .17018 .21336
+bezier .180487 .211273 .180487 .194492 .17018 .192405
+aline .158115 .192405
+aline .150495 .161925
+aline .14986 .16002
+aline .141605 .127
+aline .14097 .125095
+aline .132715 .092075
+aline .13208 .09017
+aline .123825 .05715
+aline .12319 .055245
+aline .11557 .024765
+aline .114935 .02286
+aline .11049 .00508
+aline .108585 .00127
+aline .106045 -.00127
+aline .104775 -.001905
+aline .10414 -.00254
+aline .10287 -.003175
+aline .10033 -.00381
+aline .084455 -.00381
+aline .081915 -.003175
+aline .080645 -.00254
+aline .08001 -.001905
+aline .07874 -.00127
+aline .0762 .00127
+aline .074295 .00508
+aline .06985 .02286
+aline .069215 .024765
+aline .061595 .055245
+aline .06096 .05715
+aline .052705 .09017
+aline .05207 .092075
+aline .043815 .125095
+aline .04318 .127
+aline .034925 .16002
+aline .03429 .161925
+aline .02667 .192405
+aline .014605 .192405
+bezier .429756E-02 .194492 .429756E-02 .211273 .014605 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="W" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .052705 .21336
+bezier .630124E-01 .211273 .630124E-01 .194492 .052705 .192405
+aline .037465 .192405
+bezier .441585E-01 .136733 .052846 .796093E-01 .059055 .02286
+bezier .635354E-01 .548457E-01 .697828E-01 .904389E-01 .08001 .122555
+bezier .861393E-01 .130716 .103036 .129809 .10668 .11938
+bezier .114185 .873755E-01 .122097 .539512E-01 .12573 .02286
+bezier .131939 .796093E-01 .140626 .136733 .14732 .192405
+aline .13208 .192405
+bezier .121773 .194492 .121773 .211273 .13208 .21336
+aline .17272 .21336
+bezier .185514 .210482 .180807 .18873 .16764 .192405
+bezier .156829 .128841 .150801 .652346E-01 .1397 .00127
+bezier .132404 -.861981E-02 .112542 -.467096E-02 .112395 .00889
+bezier .105021 .403458E-01 .976413E-01 .736472E-01 .092075 .10414
+bezier .869027E-01 .709263E-01 .793258E-01 .349941E-01 .06985 .001905
+bezier .638303E-01 -.805875E-02 .433343E-01 -.579809E-02 .04318 .00762
+bezier .348108E-01 .693962E-01 .269462E-01 .130955 .017145 .192405
+bezier .397839E-02 .18873 -.728656E-03 .210482 .012065 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="X" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .07112 .21336
+aline .07239 .212725
+aline .07493 .211455
+aline .076835 .20955
+aline .078105 .20701
+aline .078105 .198755
+aline .076835 .196215
+aline .07493 .19431
+aline .07112 .192405
+aline .0635 .192405
+bezier .713676E-01 .176504 .811934E-01 .156282 .910167E-01 .141393
+aline .094615 .14859
+aline .09525 .150495
+aline .10922 .178435
+aline .109855 .18034
+aline .115411 .191453
+aline .114935 .192405
+aline .107315 .192405
+bezier .970076E-01 .194492 .970076E-01 .211273 .107315 .21336
+aline .156845 .21336
+bezier .1665 .210935 .1665 .19483 .156845 .192405
+aline .14224 .192405
+aline .12573 .159385
+aline .125095 .15875
+aline .102394 .113348
+bezier .119172 .824174E-01 .135394 .510862E-01 .1524 .02032
+aline .167005 .02032
+bezier .176715 .178785E-01 .176715 .180649E-02 .167005 -.000635
+aline .117475 -.000635
+bezier .107168 .145194E-02 .107168 .182331E-01 .117475 .02032
+aline .125095 .02032
+bezier .115047 .421376E-01 .10244 .06626 .904875E-01 .881063E-01
+bezier .794643E-01 .661787E-01 .678209E-01 .420634E-01 .05842 .02032
+aline .06731 .02032
+bezier .768341E-01 .175997E-01 .768341E-01 .208533E-02 .06731 -.000635
+aline .017145 -.000635
+bezier .762092E-02 .208533E-02 .762092E-02 .175997E-01 .017145 .02032
+aline .03175 .02032
+aline .032385 .020955
+aline .073025 .102235
+aline .785813E-01 .113348
+bezier .644743E-01 .139716 .503683E-01 .166085 .036195 .192405
+aline .02159 .192405
+bezier .113328E-01 .194475 .113328E-01 .21129 .02159 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="Y" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .064135 .21336
+aline .065405 .212725
+aline .067945 .211455
+aline .06985 .20955
+aline .07112 .20701
+aline .07112 .198755
+aline .06985 .196215
+aline .067945 .19431
+aline .064135 .192405
+aline .05588 .192405
+bezier .669842E-01 .165856 .824694E-01 .136455 .928007E-01 .109583
+bezier .101921 .138136 .11827 .165561 .128905 .192405
+aline .12065 .192405
+aline .11684 .19431
+aline .114935 .196215
+aline .113665 .198755
+aline .113665 .20701
+aline .114935 .20955
+aline .11684 .211455
+aline .12065 .21336
+aline .17018 .21336
+bezier .180314 .211211 .180314 .194554 .17018 .192405
+aline .15621 .192405
+bezier .138633 .156748 .121888 .120556 .10414 .08509
+aline .10414 .020955
+aline .104775 .02032
+aline .120015 .02032
+aline .123825 .018415
+aline .125095 .017145
+aline .127 .013335
+aline .127 .00635
+aline .125095 .00254
+aline .123825 .00127
+aline .120015 -.000635
+aline .06477 -.000635
+aline .06096 .00127
+aline .05969 .00254
+aline .057785 .00635
+aline .057785 .013335
+aline .05969 .017145
+aline .06096 .018415
+aline .06477 .02032
+aline .08001 .02032
+aline .080645 .020955
+aline .080645 .08509
+bezier .628966E-01 .120556 .461524E-01 .156748 .028575 .192405
+aline .014605 .192405
+bezier .447108E-02 .194554 .447108E-02 .211211 .014605 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="Z" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .16002 .21336
+bezier .172324 .209363 .168307 .192697 .160655 .186055
+bezier .124005 .130679 .838563E-01 .753875E-01 .048895 .02032
+aline .14478 .02032
+aline .145415 .020955
+aline .145415 .05334
+bezier .148631 .631737E-01 .165694 .631737E-01 .16891 .05334
+aline .16891 .00635
+aline .16764 .00381
+aline .167005 .003175
+aline .16637 .001905
+aline .1651 .00127
+aline .164465 .000635
+aline .161925 -.000635
+aline .024765 -.000635
+bezier .124612E-01 .336242E-02 .164778E-01 .200284E-01 .02413 .02667
+bezier .607797E-01 .820459E-01 .100929 .137337 .13589 .192405
+aline .04572 .192405
+aline .045085 .19177
+aline .045085 .16637
+bezier .418686E-01 .156536 .248064E-01 .156536 .02159 .16637
+aline .02159 .20574
+aline .022225 .207645
+aline .02286 .208915
+aline .026035 .21209
+aline .027305 .212725
+aline .02921 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="[" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.694445 dep=.0833311 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .163195 .24257
+bezier .172719 .23985 .172719 .224335 .163195 .221615
+aline .10287 .221615
+aline .102235 .22098
+aline .102235 -.008255
+aline .10287 -.00889
+aline .163195 -.00889
+bezier .172719 -.116103E-01 .172719 -.271247E-01 .163195 -.029845
+aline .085725 -.029845
+aline .083185 -.028575
+aline .08255 -.02794
+aline .08128 -.027305
+aline .080645 -.026035
+aline .08001 -.0254
+aline .07874 -.02286
+aline .07874 .235585
+aline .08001 .238125
+aline .080645 .23876
+aline .08128 .24003
+aline .08255 .240665
+aline .083185 .2413
+aline .084455 .241935
+aline .085725 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="\" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.694445 dep=.0833311 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .03556 .24257
+aline .037465 .241935
+aline .040005 .240665
+bezier .544309E-01 .218938 .630796E-01 .193304 .075565 .17018
+bezier .104683 .108248 .134905 .467724E-01 .16383 -.01524
+bezier .166867 -.277826E-01 .148579 -.356237E-01 .141605 -.024765
+bezier .101404 .594849E-01 .606817E-01 .143519 .020955 .227965
+aline .020955 .233045
+aline .02159 .23495
+aline .02286 .23749
+aline .026035 .240665
+aline .028575 .241935
+aline .03048 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="]" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.694445 dep=.0833311 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .09906 .24257
+aline .10033 .241935
+aline .1016 .2413
+aline .102235 .240665
+aline .103505 .24003
+aline .10414 .23876
+aline .104775 .238125
+aline .106045 .235585
+aline .106045 -.02286
+aline .104775 -.0254
+aline .10414 -.026035
+aline .103505 -.027305
+aline .102235 -.02794
+aline .1016 -.028575
+aline .09906 -.029845
+aline .02159 -.029845
+bezier .120659E-01 -.271247E-01 .120659E-01 -.116103E-01 .02159 -.00889
+aline .081915 -.00889
+aline .08255 -.008255
+aline .08255 .22098
+aline .081915 .221615
+aline .02159 .221615
+bezier .120659E-01 .224335 .120659E-01 .23985 .02159 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="^" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .094615 .21336
+bezier .11227 .203966 .130512 .194905 .14732 .18415
+bezier .154157 .17485 .140555 .158319 .13081 .167005
+bezier .117268 .173566 .104762 .184467 .090805 .188595
+bezier .759173E-01 .180897 .623771E-01 .169211 .046355 .164465
+bezier .348358E-01 .166856 .030993 .185744 .04445 .188595
+bezier .595717E-01 .197014 .074657 .205484 .09017 .21336
+aline .094615 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="_" !-------------- Beginning of new char.
+dfont wid=.524996 hei=0 dep=.0951357 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .15494 -.01016
+bezier .167508 -.123555E-01 .167508 -.320945E-01 .15494 -.03429
+aline .029845 -.03429
+bezier .172773E-01 -.320945E-01 .172773E-01 -.123555E-01 .029845 -.01016
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="`" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .112395 .238125
+aline .1143 .23749
+aline .11557 .236855
+aline .120015 .23241
+bezier .125358 .223386 .115361 .217463 .108585 .213995
+bezier .093327 .202549 .851153E-01 .183091 .08636 .164465
+bezier .986251E-01 .167311 .112586 .157788 .109855 .144145
+bezier .106515 .125048 .788548E-01 .12687 .071755 .14224
+bezier .541491E-01 .176692 .735969E-01 .222267 .10795 .238125
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="a" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.430555 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .092075 .153035
+bezier .117221 .150883 .144898 .133405 .14859 .106045
+aline .14859 .023495
+bezier .158822 .177089E-01 .171535 .234525E-01 .18161 .01778
+bezier .186426 .120934E-01 .184795 .165783E-02 .177165 -.000635
+bezier .160251 -.189673E-03 .140456 -.340048E-02 .127953 .106363E-01
+bezier .102453 -.458707E-02 .692971E-01 -.81934E-02 .042545 .00635
+bezier .219418E-01 .176993E-01 .120024E-01 .483309E-01 .028575 .06731
+bezier .537315E-01 .933791E-01 .926344E-01 .940537E-01 .125095 .09652
+bezier .127416 .116538 .107005 .130291 .089535 .13208
+aline .06985 .13208
+aline .069215 .131445
+aline .062865 .131445
+aline .06223 .13081
+aline .05969 .130175
+bezier .633343E-01 .114466 .406659E-01 .104783 .03175 .11811
+bezier .217153E-01 .135379 .413517E-01 .153019 .05842 .151765
+aline .059055 .1524
+aline .06604 .1524
+aline .066675 .153035
+aline .092075 .153035
+closepath
+! end of curve
+
+! start of curve
+amove .11049 .07493
+bezier .891666E-01 .073713 .646628E-01 .702121E-01 .047625 .05461
+bezier .362161E-01 .397112E-01 .053479 .214763E-01 .069215 .019685
+bezier .867316E-01 .016597 .108043 .190648E-01 .12192 .032385
+aline .123825 .036195
+aline .12446 .038735
+aline .125095 .03937
+aline .125095 .07493
+aline .12446 .075565
+aline .111125 .075565
+aline .11049 .07493
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="b" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .051435 .21336
+aline .052705 .212725
+aline .053975 .21209
+aline .05461 .211455
+aline .05588 .21082
+aline .056515 .20955
+aline .05715 .208915
+aline .05842 .206375
+aline .05842 .135255
+bezier .761772E-01 .149783 .104098 .15744 .127 .14732
+bezier .182283 .124316 .186811 .370303E-01 .135255 .00762
+bezier .111889 -.762511E-02 .780893E-01 -.644632E-02 .059055 .01524
+aline .05842 .014605
+aline .05842 .00635
+bezier .055264 -.361877E-02 .374911E-01 -.351377E-02 .034925 .006985
+aline .034925 .19177
+aline .03429 .192405
+aline .012065 .192405
+bezier .254092E-02 .195125 .254092E-02 .21064 .012065 .21336
+closepath
+! end of curve
+
+! start of curve
+amove .09652 .130175
+bezier .786295E-01 .128923 .637501E-01 .114464 .05842 .09779
+aline .05842 .05969
+bezier .628177E-01 .388644E-01 .785104E-01 .156781E-01 .102235 .018415
+bezier .139392 .022821 .15855 .693012E-01 .14224 .100965
+bezier .13536 .11895 .115593 .133614 .09652 .130175
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="c" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.430555 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .121285 .153035
+bezier .135519 .152113 .15644 .148666 .159385 .13081
+bezier .163494 .114877 .140614 .104506 .131445 .11811
+aline .12954 .12192
+aline .128905 .12446
+aline .128905 .130175
+bezier .103612 .136455 .718935E-01 .130684 .05842 .10541
+bezier .382246E-01 .737193E-01 .056897 .260031E-01 .09525 .019685
+bezier .113097 .147707E-01 .136369 .228269E-01 .14224 .042545
+bezier .148615 .513958E-01 .168529 .454434E-01 .163195 .03302
+bezier .150096 -.302946E-02 .103262 -.995559E-02 .071755 .00381
+bezier .248834E-01 .236036E-01 .011809 .897459E-01 .04572 .127
+bezier .584672E-01 .141423 .768807E-01 .151241 .095885 .153035
+aline .121285 .153035
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="d" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .142875 .21336
+aline .144145 .212725
+aline .145415 .21209
+aline .14605 .211455
+aline .14732 .21082
+aline .147955 .20955
+aline .14859 .208915
+aline .14986 .206375
+aline .14986 .020955
+aline .150495 .02032
+aline .17272 .02032
+bezier .182244 .175997E-01 .182244 .208533E-02 .17272 -.000635
+aline .13335 -.000635
+aline .13081 .000635
+aline .130175 .00127
+aline .128905 .001905
+aline .12827 .003175
+aline .127635 .00381
+aline .126365 .00635
+aline .126365 .01651
+bezier .116537 .820124E-02 .102251 -.188521E-02 .08763 -.00254
+bezier .425691E-01 -.732441E-02 .709407E-02 .405278E-01 .01397 .08255
+bezier .144972E-01 .129903 .713926E-01 .169482 .1143 .144145
+aline .11684 .142875
+aline .117475 .14224
+aline .118745 .141605
+aline .11938 .14097
+aline .12065 .140335
+aline .12192 .139065
+aline .12319 .13843
+aline .12573 .13589
+aline .126365 .136525
+aline .126365 .19177
+aline .12573 .192405
+aline .103505 .192405
+bezier .939809E-01 .195125 .939809E-01 .21064 .103505 .21336
+closepath
+! end of curve
+
+! start of curve
+amove .081915 .130175
+bezier .437897E-01 .126032 .263372E-01 .778338E-01 .04318 .046355
+bezier .533405E-01 .219762E-01 .861959E-01 .869154E-02 .107315 .027305
+bezier .117442 .357241E-01 .122552 .482028E-01 .126365 .060325
+aline .126365 .098425
+bezier .121068 .117351 .101675 .134079 .081915 .130175
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="e" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.430555 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .102235 .153035
+bezier .133548 .151528 .159983 .124197 .16129 .09271
+bezier .162126 .845494E-01 .166332 .070655 .155575 .066675
+aline .045085 .066675
+bezier .486475E-01 .254766E-01 .110648 -.165738E-03 .13716 .034925
+bezier .138838 .449076E-01 .1494 .493743E-01 .158115 .045085
+bezier .168232 .378451E-01 .158499 .024893 .153035 .01778
+bezier .113617 -.225122E-01 .364598E-01 -.683345E-04 .02286 .05461
+bezier .972724E-02 .979128E-01 .416985E-01 .149177 .08763 .153035
+aline .102235 .153035
+closepath
+! end of curve
+
+! start of curve
+amove .089535 .131445
+bezier .673093E-01 .129317 .047908 .109077 .04572 .086995
+aline .137795 .086995
+bezier .138824 .108749 .12199 .130855 .099695 .13208
+aline .09017 .13208
+aline .089535 .131445
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="f" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .128905 .215265
+bezier .142025 .215342 .158555 .204413 .15367 .18923
+bezier .148862 .173686 .124319 .178244 .12446 .19431
+bezier .109905 .19613 .927447E-01 .189435 .0889 .17399
+aline .0889 .150495
+aline .089535 .14986
+aline .1397 .14986
+bezier .149224 .14714 .149224 .131625 .1397 .128905
+aline .089535 .128905
+aline .0889 .12827
+aline .0889 .020955
+aline .089535 .02032
+aline .131445 .02032
+aline .135255 .018415
+aline .13716 .01651
+aline .13843 .01397
+aline .13843 .005715
+aline .13716 .003175
+aline .135255 .00127
+aline .131445 -.000635
+aline .02286 -.000635
+aline .01905 .00127
+aline .017145 .003175
+aline .015875 .005715
+aline .015875 .01397
+aline .017145 .01651
+aline .01905 .018415
+aline .02286 .02032
+aline .06477 .02032
+aline .065405 .020955
+aline .065405 .12827
+aline .06477 .128905
+aline .022225 .128905
+bezier .012505 .131633 .01276 .147709 .02286 .14986
+aline .06477 .14986
+bezier .663215E-01 .165956 .621801E-01 .186215 .076835 .19812
+bezier .896053E-01 .21255 .110298 .216642 .128905 .215265
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="g" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.430555 dep=.222223 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .159385 .15367
+bezier .174143 .153594 .187114 .133616 .173355 .12319
+bezier .165369 .118121 .153415 .122434 .151938 .132195
+aline .150813 .132477
+aline .149225 .13208
+aline .145415 .13208
+aline .14478 .131445
+aline .141605 .13081
+aline .13589 .128905
+aline .13462 .12827
+aline .132715 .127635
+aline .130175 .126365
+bezier .155026 .942993E-01 .129308 .420185E-01 .0889 .04064
+bezier .762089E-01 .378033E-01 .613744E-01 .428532E-01 .0508 .04826
+bezier .435873E-01 .368036E-01 .530051E-01 .185861E-01 .06731 .02032
+aline .108585 .02032
+bezier .134202 .196676E-01 .168163 .91972E-02 .173355 -.020955
+bezier .179879 -.493624E-01 .152375 -.703367E-01 .127635 -.076835
+bezier .909505E-01 -.859719E-01 .451936E-01 -.832173E-01 .018415 -.052705
+bezier .133045E-02 -.306624E-01 .148409E-01 .152307E-02 .366713E-01 .142875E-01
+bezier .259071E-01 .285422E-01 .026531 .477536E-01 .353483E-01 .062865
+bezier .011813 .092768 .293756E-01 .141497 .066675 .14986
+bezier .832214E-01 .154262 .101278 .151354 .115888 .141764
+bezier .125433 .148 .136812 .152547 .147955 .15367
+closepath
+! end of curve
+
+! start of curve
+amove .07747 .13081
+bezier .463285E-01 .127032 .379531E-01 .817524E-01 .064135 .06604
+bezier .084376 .509357E-01 .113935 .680171E-01 .116205 .09144
+bezier .118976 .112663 .100047 .133943 .078105 .131445
+closepath
+! end of curve
+
+! start of curve
+amove .05969 0
+bezier .389622E-01 -.394363E-03 .193166E-01 -.298806E-01 .038735 -.045085
+bezier .704115E-01 -.666388E-01 .114373 -.666388E-01 .14605 -.045085
+bezier .162966 -.326172E-01 .150545 -.694651E-02 .13208 -.00381
+aline .12446 -.001905
+aline .123825 -.00127
+aline .12065 -.00127
+aline .120015 -.000635
+aline .11557 -.000635
+aline .114935 0
+aline .107315 0
+aline .10668 .000635
+aline .060325 .000635
+aline .05969 0
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="h" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .051435 .21336
+aline .052705 .212725
+aline .053975 .21209
+aline .05461 .211455
+aline .05588 .21082
+aline .056515 .20955
+aline .05715 .208915
+aline .05842 .206375
+aline .05842 .133985
+bezier .078845 .152295 .118093 .161481 .1397 .137795
+aline .140335 .136525
+aline .141605 .135255
+aline .14224 .133985
+aline .142875 .13335
+aline .14605 .127
+aline .147955 .121285
+aline .149225 .114935
+aline .149225 .11049
+aline .14986 .109855
+aline .14986 .020955
+aline .150495 .02032
+aline .17272 .02032
+bezier .182244 .175997E-01 .182244 .208533E-02 .17272 -.000635
+aline .106045 -.000635
+aline .102235 .00127
+aline .10033 .003175
+aline .09906 .005715
+aline .09906 .01397
+aline .10033 .01651
+aline .102235 .018415
+aline .106045 .02032
+aline .12573 .02032
+aline .126365 .020955
+aline .126365 .10795
+bezier .125558 .117712 .119867 .130621 .10795 .130175
+bezier .844502E-01 .134692 .606784E-01 .113438 .05842 .09017
+aline .05842 .020955
+aline .059055 .02032
+aline .08128 .02032
+bezier .908041E-01 .175997E-01 .908041E-01 .208533E-02 .08128 -.000635
+aline .012065 -.000635
+bezier .254092E-02 .208533E-02 .254092E-02 .175997E-01 .012065 .02032
+aline .03429 .02032
+aline .034925 .020955
+aline .034925 .19177
+aline .03429 .192405
+aline .012065 .192405
+bezier .254092E-02 .195125 .254092E-02 .21064 .012065 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="i" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .094615 .213995
+bezier .110816 .21146 .113724 .187031 .098425 .180975
+bezier .835595E-01 .173654 .672849E-01 .192813 .076835 .206375
+aline .081915 .211455
+aline .084455 .212725
+aline .08636 .21336
+aline .088265 .213995
+closepath
+! end of curve
+
+! start of curve
+amove .1016 .14986
+aline .10287 .149225
+aline .10414 .14859
+aline .104775 .147955
+aline .106045 .14732
+aline .10668 .14605
+aline .107315 .145415
+aline .108585 .142875
+aline .108585 .020955
+aline .10922 .02032
+aline .1524 .02032
+bezier .162534 .181709E-01 .162534 .151407E-02 .1524 -.000635
+aline .03556 -.000635
+bezier .254261E-01 .151407E-02 .254261E-01 .181709E-01 .03556 .02032
+aline .084455 .02032
+aline .08509 .020955
+aline .08509 .12827
+aline .084455 .128905
+aline .0381 .128905
+bezier .285295E-01 .131508 .285295E-01 .147257 .0381 .14986
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="j" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=.222223 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .114935 .213995
+bezier .131136 .21146 .134044 .187031 .118745 .180975
+bezier .10388 .173654 .876049E-01 .192813 .097155 .206375
+aline .102235 .211455
+aline .104775 .212725
+aline .10668 .21336
+aline .108585 .213995
+closepath
+! end of curve
+
+! start of curve
+amove .12192 .14986
+aline .12319 .149225
+aline .12446 .14859
+aline .125095 .147955
+aline .126365 .14732
+aline .127 .14605
+aline .127635 .145415
+aline .128905 .142875
+aline .128905 -.02413
+bezier .126545 -.515824E-01 .104356 -.07794 .0762 -.080645
+bezier .569533E-01 -.799211E-01 .335113E-01 -.839554E-01 .02032 -.066675
+bezier .112413E-01 -.549411E-01 .211029E-01 -.341785E-01 .03683 -.03937
+aline .038735 -.040005
+aline .041275 -.041275
+aline .045085 -.045085
+aline .04699 -.048895
+aline .047625 -.051435
+aline .047625 -.05715
+aline .04699 -.057785
+bezier .645338E-01 -.619843E-01 .886465E-01 -.618066E-01 .098425 -.04318
+aline .100965 -.0381
+aline .1016 -.036195
+aline .102235 -.034925
+aline .10287 -.032385
+aline .103505 -.03048
+aline .10414 -.027305
+aline .104775 -.02667
+aline .104775 -.02286
+aline .10541 -.022225
+aline .10541 .12827
+aline .104775 .128905
+aline .052705 .128905
+bezier .431809E-01 .131625 .431809E-01 .14714 .052705 .14986
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="k" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .051435 .21336
+aline .052705 .212725
+aline .053975 .21209
+aline .05461 .211455
+aline .05588 .21082
+aline .056515 .20955
+aline .05715 .208915
+aline .05842 .206375
+aline .05842 .0762
+bezier .770195E-01 .913546E-01 .963218E-01 .111019 .114935 .12827
+aline .1143 .128905
+aline .095885 .128905
+bezier .862296E-01 .13133 .862296E-01 .147435 .095885 .14986
+aline .163195 .14986
+bezier .173329 .147711 .173329 .131054 .163195 .128905
+aline .144145 .128905
+aline .1397 .12446
+aline .13843 .123825
+aline .12954 .114935
+aline .12827 .1143
+aline .120015 .106045
+aline .118745 .10541
+aline .109855 .09652
+aline .108585 .095885
+aline .100965 .088265
+bezier .118385 .656621E-01 .135969 .431782E-01 .153035 .02032
+aline .170815 .02032
+bezier .180949 .181709E-01 .180949 .151407E-02 .170815 -.000635
+aline .116205 -.000635
+bezier .106105 .148909E-02 .106105 .181959E-01 .116205 .02032
+aline .127635 .02032
+bezier .116237 .386836E-01 .100328 .05711 .866775E-01 .747712E-01
+aline .085725 .074295
+aline .080645 .069215
+aline .079375 .06858
+aline .070485 .05969
+aline .069215 .059055
+aline .06096 .0508
+aline .05969 .050165
+aline .05842 .048895
+aline .05842 .020955
+aline .059055 .02032
+aline .08255 .02032
+bezier .09265 .181959E-01 .09265 .148909E-02 .08255 -.000635
+aline .01524 -.000635
+bezier .513996E-02 .148909E-02 .513996E-02 .181959E-01 .01524 .02032
+aline .038735 .02032
+aline .03937 .020955
+aline .03937 .19177
+aline .038735 .192405
+aline .01524 .192405
+bezier .513996E-02 .194529 .513996E-02 .211236 .01524 .21336
+aline .051435 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="l" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .097155 .21336
+aline .098425 .212725
+aline .099695 .21209
+aline .10033 .211455
+aline .1016 .21082
+aline .102235 .20955
+aline .10287 .208915
+aline .10414 .206375
+aline .10414 .020955
+aline .104775 .02032
+aline .156845 .02032
+bezier .166369 .175997E-01 .166369 .208533E-02 .156845 -.000635
+aline .02794 -.000635
+bezier .184159E-01 .208533E-02 .184159E-01 .175997E-01 .02794 .02032
+aline .08001 .02032
+aline .080645 .020955
+aline .080645 .19177
+aline .08001 .192405
+aline .02794 .192405
+bezier .184159E-01 .195125 .184159E-01 .21064 .02794 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="m" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.430555 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .073025 .151765
+aline .0762 .15113
+aline .078105 .150495
+aline .084455 .14732
+aline .085725 .14605
+aline .086995 .145415
+aline .09017 .14224
+aline .090805 .14097
+aline .092075 .1397
+aline .09525 .13335
+bezier .10747 .152124 .139318 .160378 .15367 .1397
+aline .15748 .13208
+aline .15875 .12827
+aline .159385 .12573
+aline .160655 .11938
+aline .160655 .1143
+aline .16129 .113665
+aline .16129 .020955
+aline .161925 .02032
+aline .17399 .02032
+bezier .1837 .178785E-01 .1837 .180649E-02 .17399 -.000635
+aline .13462 -.000635
+bezier .124313 .145194E-02 .124313 .182331E-01 .13462 .02032
+aline .141605 .02032
+aline .14224 .020955
+aline .14224 .11049
+bezier .141728 .11893 .137332 .134256 .12573 .130175
+bezier .107804 .127202 .101873 .106085 .099695 .09144
+aline .099695 .020955
+aline .10033 .02032
+aline .112395 .02032
+bezier .122105 .178785E-01 .122105 .180649E-02 .112395 -.000635
+aline .073025 -.000635
+bezier .627176E-01 .145194E-02 .627176E-01 .182331E-01 .073025 .02032
+aline .08001 .02032
+aline .080645 .020955
+aline .080645 .11049
+bezier .801334E-01 .11893 .757369E-01 .134256 .064135 .130175
+bezier .462091E-01 .127202 .402781E-01 .106085 .0381 .09144
+aline .0381 .020955
+aline .038735 .02032
+aline .0508 .02032
+bezier .605097E-01 .178785E-01 .605097E-01 .180649E-02 .0508 -.000635
+aline .00635 -.000635
+bezier -.335975E-02 .180649E-02 -.335975E-02 .178785E-01 .00635 .02032
+aline .018415 .02032
+aline .01905 .020955
+aline .01905 .12827
+aline .018415 .128905
+aline .00635 .128905
+bezier -.335975E-02 .131346 -.335975E-02 .147419 .00635 .14986
+aline .031115 .14986
+aline .033655 .14859
+aline .03429 .147955
+aline .03556 .14732
+aline .036195 .14605
+aline .03683 .145415
+aline .0381 .142875
+aline .0381 .1397
+bezier .446635E-01 .144371 .546129E-01 .151242 .064135 .151765
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="n" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.430555 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .111125 .151765
+bezier .132796 .151108 .149729 .130925 .14986 .109855
+aline .14986 .020955
+aline .150495 .02032
+aline .17272 .02032
+bezier .182244 .175997E-01 .182244 .208533E-02 .17272 -.000635
+aline .106045 -.000635
+aline .102235 .00127
+aline .10033 .003175
+aline .09906 .005715
+aline .09906 .01397
+aline .10033 .01651
+aline .102235 .018415
+aline .106045 .02032
+aline .12573 .02032
+aline .126365 .020955
+aline .126365 .10795
+bezier .125558 .117712 .119867 .130621 .10795 .130175
+bezier .844502E-01 .134692 .606784E-01 .113438 .05842 .09017
+aline .05842 .020955
+aline .059055 .02032
+aline .08128 .02032
+bezier .908041E-01 .175997E-01 .908041E-01 .208533E-02 .08128 -.000635
+aline .012065 -.000635
+bezier .254092E-02 .208533E-02 .254092E-02 .175997E-01 .012065 .02032
+aline .03429 .02032
+aline .034925 .020955
+aline .034925 .12827
+aline .03429 .128905
+aline .012065 .128905
+bezier .254092E-02 .131625 .254092E-02 .14714 .012065 .14986
+aline .051435 .14986
+aline .053975 .14859
+aline .05461 .147955
+aline .05588 .14732
+aline .056515 .14605
+aline .05715 .145415
+aline .05842 .142875
+aline .05842 .133985
+bezier .685674E-01 .141814 .834116E-01 .150901 .09779 .151765
+aline .111125 .151765
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="o" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.430555 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .098425 .153035
+bezier .14313 .149263 .171836 .994346E-01 .16256 .05842
+bezier .155795 .147057E-01 .105718 -.165308E-01 .06477 .003175
+bezier .106245E-01 .268453E-01 .597072E-02 .110353 .055245 .141605
+aline .05588 .14224
+aline .05715 .142875
+aline .057785 .14351
+aline .067945 .14859
+aline .075565 .15113
+aline .081915 .1524
+aline .085725 .1524
+aline .08636 .153035
+aline .098425 .153035
+closepath
+! end of curve
+
+! start of curve
+amove .086995 .131445
+bezier .504581E-01 .126688 .348237E-01 .805516E-01 .050165 .050165
+bezier .590352E-01 .02378 .935112E-01 .825655E-02 .11684 .02667
+bezier .151314 .522281E-01 .148051 .116657 .10414 .130175
+aline .1016 .13081
+aline .100965 .131445
+aline .09779 .131445
+aline .097155 .13208
+aline .08763 .13208
+aline .086995 .131445
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="p" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.430555 dep=.222223 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .109855 .151765
+bezier .164651 .145486 .189129 .724049E-01 .158115 .029845
+bezier .138539 -.315724E-02 .862096E-01 -.157708E-01 .059055 .01524
+aline .05842 .014605
+aline .05842 -.05715
+aline .059055 -.057785
+aline .08128 -.057785
+bezier .908041E-01 -.605053E-01 .908041E-01 -.760197E-01 .08128 -.07874
+aline .012065 -.07874
+bezier .254092E-02 -.760197E-01 .254092E-02 -.605053E-01 .012065 -.057785
+aline .03429 -.057785
+aline .034925 -.05715
+aline .034925 .12827
+aline .03429 .128905
+aline .012065 .128905
+bezier .254092E-02 .131625 .254092E-02 .14714 .012065 .14986
+aline .051435 .14986
+aline .053975 .14859
+aline .05461 .147955
+aline .05588 .14732
+aline .056515 .14605
+aline .05715 .145415
+aline .05842 .142875
+aline .05842 .135255
+bezier .717748E-01 .145628 .912996E-01 .154074 .109855 .151765
+closepath
+! end of curve
+
+! start of curve
+amove .09652 .130175
+bezier .786295E-01 .128923 .637501E-01 .114464 .05842 .09779
+aline .05842 .05969
+bezier .628177E-01 .388644E-01 .785104E-01 .156781E-01 .102235 .018415
+bezier .139392 .022821 .15855 .693012E-01 .14224 .100965
+bezier .13536 .11895 .115593 .133614 .09652 .130175
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="q" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.430555 dep=.222223 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .095885 .151765
+bezier .110075 .150893 .124206 .141154 .133985 .13335
+aline .133985 .14478
+bezier .137201 .154614 .154264 .154614 .15748 .14478
+aline .15748 -.05715
+aline .158115 -.057785
+aline .18161 -.057785
+bezier .19171 -.599091E-01 .19171 -.766159E-01 .18161 -.07874
+aline .109855 -.07874
+bezier .099755 -.766159E-01 .099755 -.599091E-01 .109855 -.057785
+aline .13335 -.057785
+aline .133985 -.05715
+aline .133985 .01778
+bezier .123325 .873412E-02 .107783 -.166756E-02 .092075 -.00254
+bezier .046418 -.773869E-02 .813491E-02 .395678E-01 .01524 .08255
+bezier .172016E-01 .122699 .561341E-01 .155743 .095885 .151765
+closepath
+! end of curve
+
+! start of curve
+amove .085725 .130175
+bezier .487651E-01 .12699 .274799E-01 .820163E-01 .04318 .050165
+bezier .535028E-01 .021843 .915169E-01 .76077E-02 .114935 .028575
+bezier .142944 .529428E-01 .141119 .105067 .109855 .12573
+aline .106045 .127635
+aline .102235 .128905
+aline .099695 .12954
+aline .09906 .130175
+aline .095885 .130175
+aline .09525 .13081
+aline .08636 .13081
+aline .085725 .130175
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="r" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.430555 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .145415 .151765
+bezier .159965 .152058 .178006 .13774 .169545 .12192
+bezier .162706 .109255 .140386 .115435 .14224 .130175
+bezier .109873 .134569 .805842E-01 .103634 .078105 .07239
+aline .078105 .020955
+aline .07874 .02032
+aline .12446 .02032
+bezier .133984 .175997E-01 .133984 .208533E-02 .12446 -.000635
+aline .01905 -.000635
+aline .01524 .00127
+aline .01397 .00254
+aline .012065 .00635
+aline .012065 .013335
+aline .01397 .017145
+aline .01524 .018415
+aline .01905 .02032
+aline .053975 .02032
+aline .05461 .020955
+aline .05461 .12827
+aline .053975 .128905
+aline .01905 .128905
+aline .01524 .13081
+aline .01397 .13208
+aline .012065 .13589
+aline .012065 .142875
+aline .01397 .146685
+aline .01524 .147955
+aline .01905 .14986
+aline .07112 .14986
+aline .07366 .14859
+aline .074295 .147955
+aline .075565 .14732
+aline .0762 .14605
+aline .076835 .145415
+aline .078105 .142875
+aline .078105 .12446
+bezier .085009 .128882 .923094E-01 .138142 .100965 .14224
+aline .108585 .14605
+aline .11049 .146685
+aline .11176 .14732
+aline .11557 .14859
+aline .11811 .149225
+aline .120015 .14986
+aline .126365 .15113
+aline .13081 .15113
+aline .131445 .151765
+aline .145415 .151765
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="s" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.430555 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .102235 .153035
+bezier .111112 .152147 .12233 .149451 .130175 .14605
+bezier .132839 .155476 .147831 .155476 .150495 .14605
+aline .150495 .10795
+bezier .146345 .095415 .122813 .999004E-01 .127 .1143
+bezier .124797 .127122 .110116 .130479 .099695 .13208
+bezier .818065E-01 .131836 .596469E-01 .133322 .04826 .11684
+bezier .042375 .102751 .613861E-01 .961211E-01 .07239 .09398
+bezier .992239E-01 .875244E-01 .134432 .089925 .154305 .064135
+bezier .16995 .042376 .155511 .010928 .131445 .003175
+bezier .104442 -.564497E-02 .726932E-01 -.595071E-02 .048768 .010414
+bezier .475297E-01 .809298E-03 .370655E-01 -.719559E-02 .028575 0
+aline .02794 .00127
+aline .027305 .001905
+aline .026035 .004445
+aline .026035 .051435
+bezier .289655E-01 .629841E-01 .492672E-01 .616932E-01 .050165 .04953
+bezier .551279E-01 .259104E-01 .814561E-01 .146448E-01 .10287 .01905
+bezier .118487 .188404E-01 .141379 .268348E-01 .1397 .046355
+bezier .131219 .667783E-01 .104615 .662642E-01 .08763 .070485
+bezier .644085E-01 .724995E-01 .312677E-01 .796109E-01 .026035 .107315
+bezier .225177E-01 .136972 .554423E-01 .153324 .080645 .1524
+aline .08128 .153035
+aline .102235 .153035
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="t" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.553576 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .07112 .19304
+aline .07239 .192405
+aline .07366 .19177
+aline .074295 .191135
+aline .075565 .1905
+aline .0762 .18923
+aline .076835 .188595
+aline .078105 .186055
+aline .078105 .150495
+aline .07874 .14986
+aline .142875 .14986
+bezier .152399 .14714 .152399 .131625 .142875 .128905
+aline .07874 .128905
+aline .078105 .12827
+aline .078105 .0381
+bezier .829034E-01 .102756E-01 .128989 .127405E-01 .133985 .03937
+aline .133985 .04953
+bezier .137201 .593637E-01 .154264 .593637E-01 .15748 .04953
+bezier .162184 .215863E-01 .136312 -.948613E-03 .11049 -.00254
+bezier .086132 -.588929E-02 .561093E-01 .802914E-02 .055245 .03556
+aline .05461 .036195
+aline .05461 .12827
+aline .053975 .128905
+aline .01651 .128905
+bezier .678997E-02 .131633 .704497E-02 .147709 .017145 .14986
+aline .053975 .14986
+aline .05461 .150495
+aline .05461 .18542
+aline .055245 .187325
+aline .05588 .188595
+aline .059055 .19177
+aline .060325 .192405
+aline .06223 .19304
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="u" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.430555 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .051435 .14986
+aline .052705 .149225
+aline .053975 .14859
+aline .05461 .147955
+aline .05588 .14732
+aline .056515 .14605
+aline .05715 .145415
+aline .05842 .142875
+aline .05842 .03429
+bezier .609367E-01 .181669E-01 .808319E-01 .171993E-01 .093345 .01905
+bezier .108642 .202344E-01 .12356 .313639E-01 .126365 .04699
+aline .126365 .12827
+aline .12573 .128905
+aline .103505 .128905
+bezier .939809E-01 .131625 .939809E-01 .14714 .103505 .14986
+aline .142875 .14986
+aline .145415 .14859
+aline .14605 .147955
+aline .14732 .14732
+aline .147955 .14605
+aline .14859 .145415
+aline .14986 .142875
+aline .14986 .020955
+aline .150495 .02032
+aline .17272 .02032
+bezier .182244 .175997E-01 .182244 .208533E-02 .17272 -.000635
+aline .13335 -.000635
+aline .13081 .000635
+aline .130175 .00127
+aline .128905 .001905
+aline .12827 .003175
+aline .127635 .00381
+aline .126365 .00635
+aline .126365 .01016
+bezier .117228 .45653E-02 .104005 -.19349E-02 .092075 -.00254
+bezier .704172E-01 -.435366E-02 .424119E-01 .625047E-03 .036195 .0254
+aline .034925 .03175
+aline .034925 .12827
+aline .03429 .128905
+aline .012065 .128905
+bezier .254092E-02 .131625 .254092E-02 .14714 .012065 .14986
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="v" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.430555 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .070485 .14986
+aline .071755 .149225
+aline .074295 .147955
+aline .0762 .14605
+aline .07747 .14351
+aline .07747 .135255
+aline .0762 .132715
+aline .074295 .13081
+aline .070485 .128905
+aline .05461 .128905
+aline .541338E-01 .127953
+aline .05461 .127
+aline .060325 .109855
+aline .06096 .108585
+aline .071755 .0762
+aline .07239 .07493
+aline .083185 .042545
+aline .08382 .041275
+aline .091948 .016891
+aline .923925E-01 .166687E-01
+aline .092837 .016891
+aline .100965 .041275
+aline .1016 .042545
+aline .112395 .07493
+aline .11303 .0762
+aline .123825 .108585
+aline .12446 .109855
+aline .130175 .127
+aline .130651 .127953
+aline .130175 .128905
+aline .1143 .128905
+aline .11049 .13081
+aline .108585 .132715
+aline .107315 .135255
+aline .107315 .14351
+aline .108585 .14605
+aline .11049 .147955
+aline .1143 .14986
+aline .168275 .14986
+bezier .178582 .147773 .178582 .130992 .168275 .128905
+aline .151765 .128905
+aline .15113 .12827
+aline .142875 .103505
+aline .14224 .102235
+aline .131445 .06985
+aline .13081 .06858
+aline .120015 .036195
+bezier .113135 .237204E-01 .114865 .289267E-02 .09906 -.001905
+aline .085725 -.001905
+bezier .699199E-01 .289267E-02 .07165 .237204E-01 .06477 .036195
+aline .053975 .06858
+aline .05334 .06985
+aline .042545 .102235
+aline .04191 .103505
+aline .033655 .12827
+aline .03302 .128905
+aline .01651 .128905
+bezier .620256E-02 .130992 .620256E-02 .147773 .01651 .14986
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="w" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.430555 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .06858 .14986
+aline .06985 .149225
+aline .07239 .147955
+aline .07366 .146685
+aline .075565 .142875
+aline .075565 .13589
+aline .07366 .13208
+aline .07239 .13081
+aline .06858 .128905
+aline .04445 .128905
+bezier .476383E-01 .973228E-01 .559009E-01 .065149 .05969 .033655
+aline .060325 .03302
+aline .060325 .029845
+aline .06096 .02921
+aline .06096 .0254
+aline .061595 .024765
+aline .06223 .02286
+bezier .674063E-01 .433349E-01 .726077E-01 .642055E-01 .08001 .08382
+bezier .884308E-01 .950897E-01 .109489 .898976E-01 .109855 .07493
+bezier .114844 .578061E-01 .120524 .401858E-01 .12319 .02286
+bezier .129102 .579901E-01 .134933 .925855E-01 .14097 .12827
+aline .140335 .128905
+aline .116205 .128905
+aline .112395 .13081
+aline .111125 .13208
+aline .10922 .13589
+aline .10922 .142875
+aline .111125 .146685
+aline .112395 .147955
+aline .116205 .14986
+aline .17145 .14986
+aline .17526 .147955
+aline .177165 .14605
+aline .178435 .14351
+aline .178435 .135255
+aline .177165 .132715
+aline .17526 .13081
+aline .17145 .128905
+aline .16129 .128905
+bezier .151938 .869849E-01 .147618 .441504E-01 .13716 .00254
+bezier .12864 -.625229E-02 .108639 -.311908E-02 .107315 .010795
+bezier .101951 .289159E-01 .960259E-01 .479766E-01 .093345 .06604
+bezier .08899 .449598E-01 .842728E-01 .022489 .075565 .00254
+aline .07366 .000635
+bezier .644744E-01 -.404405E-02 .467689E-01 -.449092E-02 .045085 .00889
+bezier .03816 .048859 .316036E-01 .890452E-01 .023495 .128905
+aline .013335 .128905
+aline .009525 .13081
+aline .00762 .132715
+aline .00635 .135255
+aline .00635 .14351
+aline .00762 .14605
+aline .009525 .147955
+aline .012065 .149225
+aline .013335 .14986
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="x" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.430555 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .07366 .14986
+bezier .839674E-01 .147773 .839674E-01 .130992 .07366 .128905
+aline .065405 .128905
+bezier .718259E-01 .116787 .830649E-01 .105196 .09144 .093345
+bezier .997735E-01 .104999 .110561 .117292 .11684 .128905
+aline .10795 .128905
+bezier .976426E-01 .130992 .976426E-01 .147773 .10795 .14986
+aline .161925 .14986
+aline .165735 .147955
+aline .16764 .14605
+aline .16891 .14351
+aline .16891 .135255
+aline .16764 .132715
+aline .165735 .13081
+aline .161925 .128905
+aline .14097 .128905
+bezier .127933 .111333 .114186 .942736E-01 .100965 .076835
+bezier .11617 .058124 .130898 .390689E-01 .14605 .02032
+aline .167005 .02032
+aline .170815 .018415
+aline .172085 .017145
+aline .17399 .013335
+aline .17399 .00635
+aline .172085 .00254
+aline .170815 .00127
+aline .167005 -.000635
+aline .112395 -.000635
+aline .108585 .00127
+aline .107315 .00254
+aline .10541 .00635
+aline .10541 .013335
+aline .107315 .017145
+aline .108585 .018415
+aline .112395 .02032
+aline .12192 .02032
+bezier .114155 .352858E-01 .101144 .494245E-01 .09144 .064135
+bezier .820242E-01 .494441E-01 .069595 .345083E-01 .061595 .02032
+aline .071755 .02032
+bezier .818889E-01 .181709E-01 .818889E-01 .151407E-02 .071755 -.000635
+aline .01778 -.000635
+bezier .752278E-02 .143465E-02 .752278E-02 .182503E-01 .01778 .02032
+aline .0381 .02032
+bezier .528528E-01 .391195E-01 .675746E-01 .579414E-01 .817562E-01 .771525E-01
+bezier .681236E-01 .944558E-01 .542926E-01 .111616 .04064 .128905
+aline .019685 .128905
+aline .015875 .13081
+aline .01397 .132715
+aline .0127 .135255
+aline .0127 .14351
+aline .01397 .14605
+aline .015875 .147955
+aline .018415 .149225
+aline .019685 .14986
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="y" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.430555 dep=.222223 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .07112 .14986
+bezier .812539E-01 .147711 .812539E-01 .131054 .07112 .128905
+aline .056515 .128905
+bezier .679941E-01 .935839E-01 .847774E-01 .588797E-01 .095885 .02286
+aline .09652 .024765
+aline .097155 .027305
+aline .09779 .02921
+aline .098425 .03175
+aline .10033 .037465
+aline .100965 .040005
+aline .123825 .108585
+aline .12446 .109855
+aline .130175 .127
+aline .130651 .127953
+aline .130175 .128905
+aline .1143 .128905
+bezier .1042 .131029 .1042 .147736 .1143 .14986
+aline .168275 .14986
+bezier .178582 .147773 .178582 .130992 .168275 .128905
+aline .151765 .128905
+bezier .129177 .696472E-01 .112751 .752754E-02 .08763 -.0508
+bezier .770323E-01 -.721066E-01 .481823E-01 -.911494E-01 .026035 -.074295
+bezier .148003E-01 -.658344E-01 .98753E-02 -.423553E-01 .02667 -.037465
+bezier .359703E-01 -.353922E-01 .468187E-01 -.417513E-01 .04572 -.05207
+aline .040005 -.05207
+bezier .381374E-01 -.592038E-01 .464355E-01 -.616004E-01 .051435 -.05842
+bezier .752141E-01 -.502144E-01 .780892E-01 -.215714E-01 .861219E-01 -.9525E-03
+bezier .690592E-01 .423688E-01 .520797E-01 .859793E-01 .03429 .128905
+aline .017145 .128905
+bezier .701108E-02 .131054 .701108E-02 .147711 .017145 .14986
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="z" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.430555 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .158115 .14986
+aline .16002 .149225
+aline .16129 .14859
+aline .164465 .145415
+aline .1651 .144145
+aline .165735 .14224
+aline .165735 .13335
+bezier .140077 .104555 .109227 .797966E-01 .081915 .05207
+aline .080645 .051435
+aline .07112 .04191
+aline .06985 .041275
+aline .05969 .031115
+aline .05842 .03048
+aline .048895 .020955
+aline .04953 .02032
+aline .142875 .02032
+aline .14351 .020955
+aline .14351 .041275
+bezier .146726 .511087E-01 .163789 .511087E-01 .167005 .041275
+aline .167005 .00635
+aline .165735 .00381
+aline .1651 .003175
+aline .164465 .001905
+aline .163195 .00127
+aline .16256 .000635
+aline .16002 -.000635
+aline .019685 -.000635
+aline .01778 0
+aline .01651 .000635
+aline .013335 .00381
+aline .0127 .00508
+aline .012065 .006985
+aline .012065 .015875
+bezier .377229E-01 .446696E-01 .685728E-01 .694284E-01 .095885 .097155
+aline .097155 .09779
+aline .10668 .107315
+aline .10795 .10795
+aline .11811 .11811
+aline .11938 .118745
+aline .128905 .12827
+aline .12827 .128905
+aline .04191 .128905
+aline .041275 .12827
+aline .041275 .112395
+bezier .380586E-01 .102561 .209964E-01 .102561 .01778 .112395
+aline .01778 .14224
+aline .018415 .144145
+aline .01905 .145415
+aline .022225 .14859
+aline .023495 .149225
+aline .0254 .14986
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="{" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.694445 dep=.0833311 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .15748 .24257
+bezier .167004 .23985 .167004 .224335 .15748 .221615
+bezier .139897 .221038 .120701 .222213 .10668 .20955
+aline .10541 .20701
+aline .104775 .205105
+aline .10414 .20447
+aline .10414 .133985
+bezier .102713 .121956 .941879E-01 .112401 .846137E-01 .106362
+bezier .941892E-01 .100324 .102713 .907686E-01 .10414 .07874
+aline .10414 .008255
+bezier .11073 -.72592E-02 .130785 -.670205E-02 .144145 -.00889
+aline .15748 -.00889
+bezier .167004 -.116103E-01 .167004 -.271247E-01 .15748 -.029845
+bezier .13256 -.297118E-01 .102631 -.296328E-01 .085725 -.00762
+aline .08255 -.00127
+aline .081915 .000635
+aline .08128 .003175
+aline .080645 .00635
+aline .080645 .076835
+bezier .746566E-01 .934059E-01 .532257E-01 .093613 .03937 .095885
+aline .027305 .095885
+bezier .177809E-01 .986053E-01 .177809E-01 .11412 .027305 .11684
+bezier .449402E-01 .117254 .643388E-01 .117008 .078105 .130175
+aline .079375 .132715
+aline .08001 .135255
+aline .080645 .13589
+aline .080645 .206375
+bezier .846957E-01 .234439 .117675 .241378 .140335 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="|" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.694445 dep=.0833311 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .09525 .24257
+aline .097155 .241935
+aline .099695 .240665
+aline .10287 .23749
+aline .10414 .23495
+aline .104775 .233045
+aline .104775 -.02032
+bezier .102579 -.328877E-01 .828405E-01 -.328877E-01 .080645 -.02032
+aline .080645 .233045
+aline .08128 .23495
+aline .08255 .23749
+aline .085725 .240665
+aline .088265 .241935
+aline .09017 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="}" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.694445 dep=.0833311 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .04445 .24257
+bezier .671105E-01 .241378 .100089 .234439 .10414 .206375
+aline .10414 .13589
+bezier .110128 .119319 .131559 .119112 .145415 .11684
+aline .15748 .11684
+bezier .167004 .11412 .167004 .986053E-01 .15748 .095885
+bezier .139845 .954712E-01 .120446 .957168E-01 .10668 .08255
+aline .10541 .08001
+aline .104775 .07747
+aline .10414 .076835
+aline .10414 .00635
+bezier .100089 -.217137E-01 .671104E-01 -.286527E-01 .04445 -.029845
+aline .02794 -.029845
+bezier .01784 -.276936E-01 .017585 -.116176E-01 .027305 -.00889
+bezier .448885E-01 -.831341E-02 .640844E-01 -.948803E-02 .078105 .003175
+aline .079375 .005715
+aline .08001 .00762
+aline .080645 .008255
+aline .080645 .07874
+bezier .820721E-01 .907686E-01 .905959E-01 .100324 .100171 .106362
+bezier .905973E-01 .112401 .820717E-01 .121956 .080645 .133985
+aline .080645 .20447
+bezier .740545E-01 .219984 .539998E-01 .219427 .04064 .221615
+aline .027305 .221615
+bezier .017585 .224343 .01784 .240419 .02794 .24257
+aline .04445 .24257
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char="~" !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .08001 .21336
+bezier .935214E-01 .212387 .987738E-01 .195672 .111125 .19431
+bezier .123196 .19673 .13029 .207523 .140335 .21336
+bezier .15182 .215989 .159347 .198242 .147955 .19304
+bezier .134203 .178669 .110384 .162122 .09144 .1778
+aline .081915 .187325
+bezier .722379E-01 .195964 .612056E-01 .183945 .05334 .178435
+aline .048895 .17399
+bezier .385073E-01 .164171 .233847E-01 .183225 .03556 .191135
+bezier .462853E-01 .200341 .572331E-01 .210603 .071755 .21336
+closepath
+! end of curve
+
+fill
+dfont endchar
+dfont char=127 !-------------- Beginning of new char.
+dfont wid=.524996 hei=.611112 dep=0 italic=0
+set path ! start of curve
+newpath
+! start of curve
+amove .05969 .213995
+bezier .781392E-01 .2116 .781392E-01 .1821 .05969 .179705
+bezier .417905E-01 .175758 .031286 .202757 .047625 .211455
+aline .04826 .21209
+aline .04953 .212725
+aline .051435 .21336
+aline .053975 .213995
+closepath
+! end of curve
+
+! start of curve
+amove .13081 .213995
+bezier .148334 .212078 .150412 .18481 .13335 .18034
+bezier .115998 .17391 .102816 .198918 .11684 .210185
+aline .11811 .21082
+aline .118745 .211455
+aline .122555 .21336
+aline .125095 .213995
+closepath
+! end of curve
+
+fill
+dfont endchar
diff --git a/src/fonts/texstd.enc b/src/fonts/texstd.enc
new file mode 100644
index 0000000..0ead985
--- /dev/null
+++ b/src/fonts/texstd.enc
@@ -0,0 +1,87 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+0; capital gamma
+1; capital delta
+2; capital theta
+3; capital lambda
+4; capital epsilon
+5; captial pi
+6; capital sigma
+7; captial gamma
+8; capital phi
+9; capital psi
+10; capital omega
+11; ligature ff
+12; ligature fi
+13; ligature fl
+14; ligature ffi
+15; ligature ffl
+16; dot-less i
+$0237, 17; dot-less j
+18; accent \
+19; accent /
+20; caron
+21; breve
+22; boriz bar
+23; ring
+24; ognek
+25; german ss
+26; ae
+27; oe
+28; oring
+29; AE
+30; OE
+31; Oring
+123; endash
+124; emdash
+125; accent //
+126; accent ~
+127; accent �
+
+$2020; dagger
+$2021; double dagger
+$2022; bullet
+$2030; per mille
+
+$00C6, 29; AE
+$00D8, 31; Oslash
+$0153, 27; oe
+$0152, 30; OE
+$00E6, 26; ae
+$00F8, 28; oslash
diff --git a/src/gle/Makefile.gcc b/src/gle/Makefile.gcc
new file mode 100644
index 0000000..0b2d6fe
--- /dev/null
+++ b/src/gle/Makefile.gcc
@@ -0,0 +1,101 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+#
+# makefile.gcc for GLE v4.0
+# for compilation with gcc
+#
+#
+include ../../config.i
+include ../../config.gcc
+-include ../../extraconfig.gcc
+#
+include files.txt
+
+ifdef HAVE_LIBTIFF
+ OBJECTS := $(OBJECTS) $(TIFFOBJS)
+endif
+
+ifdef HAVE_LIBPNG
+ OBJECTS := $(OBJECTS) $(PNGOBJS)
+endif
+
+ifdef HAVE_LIBJPEG
+ OBJECTS := $(OBJECTS) $(JPEGOBJS)
+endif
+
+all: $(OBJECTS) $(PSOBJS) $(SVGOBJS) $(PROJECT_BINDIR)/glerc $(PROJECT_BINDIR)/bin/gle $(PROJECT_BINDIR)/bin/rungle
+
+$(OBJECTS): $(INCLUDES)
+
+$(PROJECT_BINDIR)/bin/gle: $(PSOBJS) $(GLEOBJS) $(OBJECTS) $(LINKOBJS)
+ $(CC) $(LINK_OPTS) -o $(PROJECT_BINDIR)/bin/gle $(OBJECTS) $(LINKOBJS) $(LINKFLAGS)
+
+$(PROJECT_BINDIR)/glerc:
+ echo "begin config gle" > $(PROJECT_BINDIR)/glerc
+ echo " current = $(VERSION_NUMBER).$(BUILD_NUMBER)" >> $(PROJECT_BINDIR)/glerc
+ echo "end config" >> $(PROJECT_BINDIR)/glerc
+
+$(PROJECT_BINDIR)/bin/rungle:
+ echo "#!/bin/sh" > $(PROJECT_BINDIR)/bin/rungle
+ echo "GLE_TOP=../../build" >> $(PROJECT_BINDIR)/bin/rungle
+ echo "export GLE_TOP" >> $(PROJECT_BINDIR)/bin/rungle
+ echo "../../build/bin/gle \$$@" >> $(PROJECT_BINDIR)/bin/rungle
+ chmod a+x $(PROJECT_BINDIR)/bin/rungle
+
+dofonts:
+ $(MAKE) -C font
+
+#
+# installs files and fonts to GLE_PATH and GLE_PATH/font
+# and creates the inittex.ini file
+#
+
+#
+# simple test to make the sample and compare it to
+# the eps file that is included in the distribution
+# -- if you get this far chances are it working allready ;-)
+# you should only get an error on the Creation date
+#
+test: # do this after make install!
+ gle sample.gle /eps
+ diff sample.eps sample_compare.eps
+
+
+clean:
+ -$(RM) $(OBJECTS) $(PSOBJS) $(SVGOBJS) $(PROJECT_BINDIR)/bin/gle
diff --git a/src/gle/Makefile.in b/src/gle/Makefile.in
new file mode 100644
index 0000000..04c76d9
--- /dev/null
+++ b/src/gle/Makefile.in
@@ -0,0 +1,196 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+#
+# makefile.gcc for GLE v4.0
+# for compilation with gcc
+#
+
+include ../../config.i
+include ../../config.aconf
+
+include files.txt
+
+PACKAGE_TARNAME=@PACKAGE_TARNAME@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+datarootdir=@datarootdir@
+docdir=@docdir@
+
+TOMAKE=
+GLE_ELIBS=
+LIBGLE_ELIBS=
+
+CXX=@CXX@
+LIBS=@LIBS@
+
+CPPFLAGS=@CPPFLAGS@
+LDFLAGS=@LDFLAGS@
+
+LIBGLE_CPPFLAGS=@LIBGLE_CPPFLAGS@@CPPFLAGS@
+LIBGLE_LDFLAGS=@LIBGLE_LDFLAGS@@LDFLAGS@
+
+SIMPLE_LDFLAGS=@SIMPLE_LDFLAGS@
+SIMPLE_LIBS=@SIMPLE_LIBS@
+SIMPLE_LIBS_DL=@SIMPLE_LIBS_DL@
+
+INSTALL_LIB=@libdir@
+INSTALL_BIN=@GLE_INSTALL_BIN@
+INSTALL_DIR=@GLE_INSTALL_DATA@
+
+ifeq (@HAVE_LIBTIFF@,1)
+ OBJECTS := $(OBJECTS) $(TIFFOBJS)
+endif
+
+ifeq (@HAVE_LIBPNG@,1)
+ OBJECTS := $(OBJECTS) $(PNGOBJS)
+endif
+
+ifeq (@HAVE_LIBJPEG@,1)
+ OBJECTS := $(OBJECTS) $(JPEGOBJS)
+endif
+
+MAKESCRIPTS :=
+ifeq (@HAVE_NOSCRIPTS@,0)
+ MAKESCRIPTS := $(PROJECT_BINDIR)/bin/rungle
+endif
+
+ifeq (@HAVE_WIN32@,1)
+ GLE_ELIBS := -lwsock32
+ ifeq (@HAVE_LIBGLE@,1)
+ LIBGLE_ELIBS := -lwsock32
+ endif
+endif
+
+UTILOBJS=cutils.$(OBJ_SUFF) file_io.$(OBJ_SUFF)
+
+ifeq (@HAVE_LIBGLE_CPPFLAGS@,1)
+ UTILOBJS=cutils.static.$(OBJ_SUFF) file_io.static.$(OBJ_SUFF)
+endif
+
+ifeq (@HAVE_LIBGLE@,1)
+ TOMAKE := $(PROJECT_BINDIR)/lib/libgle-graphics- at GLE_VERSION@.so
+ GLEOBJ := glec.cpp $(UTILOBJS) $(SIMPLE_LIBS_DL)
+ ifeq (@HAVE_WIN32@,1)
+ TOMAKE := $(PROJECT_BINDIR)/bin/libgle-graphics- at GLE_VERSION@.dll
+ GLEOBJ := glec.cpp $(UTILOBJS)
+ endif
+ ifeq (@HAVE_MAC@,1)
+ TOMAKE := $(PROJECT_BINDIR)/lib/libgle-graphics- at GLE_VERSION@.dylib
+ endif
+ GLEIN := glec.cpp $(UTILOBJS)
+ GLEOPT := $(CPPFLAGS)
+else
+ GLEIN := $(GLEOBJS) $(OBJECTS) $(LINKOBJS)
+ GLEOBJ := $(OBJECTS) $(LINKOBJS) $(LIBS)
+ GLEOPT := $(LINK_OPTS) $(LDFLAGS)
+endif
+
+TOMAKE := $(TOMAKE) $(PROJECT_BINDIR)/bin/gle
+
+ifeq (@HAVE_LIBGLE_STATIC@,1)
+ TOMAKE := $(TOMAKE) $(PROJECT_BINDIR)/lib/libgle-graphics- at GLE_VERSION@.a
+ GLEIN := $(GLEOBJS) $(OBJECTS) $(LINKOBJS)
+ GLEOBJ := $(OBJECTS) $(LINKOBJS) $(LIBS)
+ GLEOPT := $(LINK_OPTS) $(LDFLAGS)
+endif
+
+LIBGLE_CPPFLAGS := $(strip $(LIBGLE_CPPFLAGS))
+CPPFLAGS := $(strip $(CPPFLAGS))
+
+all: $(OBJECTS) $(TOMAKE)
+
+make_glebtool: $(PROJECT_BINDIR)/bin/glebtool $(PROJECT_BINDIR)/glerc $(MAKESCRIPTS)
+
+$(filter %.static.$(OBJ_SUFF),$(UTILOBJS)): %.static.$(OBJ_SUFF): %.cpp $(INCLUDES)
+ $(CXX) $(CPPFLAGS) -c $< -o $@
+
+$(OBJECTS): %.$(OBJ_SUFF): %.cpp $(INCLUDES)
+ $(CXX) $(LIBGLE_CPPFLAGS) -c $< -o $@
+
+$(PROJECT_BINDIR)/lib/libgle-graphics- at GLE_VERSION@.dylib: $(GLEOBJS) $(OBJECTS) $(LINKOBJS)
+ $(CXX) -dynamiclib -install_name libgle-graphics- at GLE_VERSION@.dylib $(LINK_OPTS) $(LIBGLE_LDFLAGS) -o $(PROJECT_BINDIR)/lib/libgle-graphics- at GLE_VERSION@.dylib $(OBJECTS) $(LINKOBJS) $(LIBS) $(LIBGLE_ELIBS)
+
+$(PROJECT_BINDIR)/lib/libgle-graphics- at GLE_VERSION@.so: $(GLEOBJS) $(OBJECTS) $(LINKOBJS)
+ $(CXX) -shared -Wl,-soname,libgle-graphics- at GLE_VERSION@.so $(LINK_OPTS) $(LIBGLE_LDFLAGS) -o $(PROJECT_BINDIR)/lib/libgle-graphics- at GLE_VERSION@.so $(OBJECTS) $(LINKOBJS) $(LIBS) $(LIBGLE_ELIBS)
+
+$(PROJECT_BINDIR)/bin/libgle-graphics- at GLE_VERSION@.dll: $(GLEOBJS) $(OBJECTS) $(LINKOBJS)
+ $(CXX) -shared $(LINK_OPTS) $(LIBGLE_LDFLAGS) -o $(PROJECT_BINDIR)/bin/libgle-graphics- at GLE_VERSION@.dll $(OBJECTS) $(LINKOBJS) $(LIBS) $(LIBGLE_ELIBS)
+
+$(PROJECT_BINDIR)/lib/libgle-graphics- at GLE_VERSION@.a: $(GLEOBJS) $(OBJECTS) $(LINKOBJS)
+ rm -f $(PROJECT_BINDIR)/lib/libgle-graphics- at GLE_VERSION@.a
+ ar rvu $(PROJECT_BINDIR)/lib/libgle-graphics- at GLE_VERSION@.a $(OBJECTS) $(LINKOBJS)
+ ranlib $(PROJECT_BINDIR)/lib/libgle-graphics- at GLE_VERSION@.a
+
+$(PROJECT_BINDIR)/bin/gle-unit-test: unit-tests/part1.cpp unit-tests/expressions.txt $(PROJECT_BINDIR)/lib/libgle-graphics- at GLE_VERSION@.a
+ $(CXX) $(GLEOPT) $(LIBGLE_LDFLAGS) -o $(PROJECT_BINDIR)/bin/gle-unit-test unit-tests/part1.cpp $(PROJECT_BINDIR)/lib/libgle-graphics- at GLE_VERSION@.a $(LIBS) $(LIBGLE_ELIBS)
+ $(PROJECT_BINDIR)/bin/gle-unit-test
+
+$(PROJECT_BINDIR)/bin/gle: $(GLEIN)
+ $(CXX) $(GLEOPT) $(SIMPLE_LDFLAGS) -o $(PROJECT_BINDIR)/bin/gle $(GLEOBJ) $(GLE_ELIBS) $(SIMPLE_LIBS)
+
+$(PROJECT_BINDIR)/glerc:
+ echo "begin config gle" > $(PROJECT_BINDIR)/glerc
+ echo " current = $(VERSION_NUMBER).$(BUILD_NUMBER)" >> $(PROJECT_BINDIR)/glerc
+ echo "end config" >> $(PROJECT_BINDIR)/glerc
+
+$(PROJECT_BINDIR)/bin/glebtool: glebtool.cpp $(UTILOBJS) Makefile
+ $(CXX) $(CPPFLAGS) $(SIMPLE_LDFLAGS) glebtool.cpp $(UTILOBJS) $(GLE_ELIBS) $(SIMPLE_LIBS) -o $(PROJECT_BINDIR)/bin/glebtool
+ $(PROJECT_BINDIR)/bin/glebtool -setrelpath $(INSTALL_BIN) $(INSTALL_LIB) $(INSTALL_DIR) $(docdir) ../config.h
+
+$(PROJECT_BINDIR)/bin/rungle:
+ echo "#!/bin/sh" > $(PROJECT_BINDIR)/bin/rungle
+ echo "GLE_TOP=../../build" >> $(PROJECT_BINDIR)/bin/rungle
+ echo "export GLE_TOP" >> $(PROJECT_BINDIR)/bin/rungle
+ echo "../../build/bin/gle \$$@" >> $(PROJECT_BINDIR)/bin/rungle
+ chmod a+x $(PROJECT_BINDIR)/bin/rungle
+
+dofonts:
+ $(MAKE) -C font
+
+# simple test to make the sample and compare it to
+# the eps file that is included in the distribution
+# -- if you get this far chances are it working allready ;-)
+# you should only get an error on the Creation date
+
+test: # do this after make install!
+ gle sample.gle /eps
+ diff sample.eps sample_compare.eps
+
+clean:
+ -$(RM) $(OBJECTS) $(PROJECT_BINDIR)/bin/gle* $(PROJECT_BINDIR)/bin/glebtool* *.static.$(OBJ_SUFF)
diff --git a/src/gle/Makefile.os2 b/src/gle/Makefile.os2
new file mode 100644
index 0000000..d9b3057
--- /dev/null
+++ b/src/gle/Makefile.os2
@@ -0,0 +1,93 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+#
+# makefile.os2 for GLE v4.0
+# for compilation with gcc
+#
+#
+include ../../config.i
+include ../../config.os2
+#
+include files.txt
+
+all: $(OBJECTS) $(LINKOBJS) $(PROJECT_BINDIR)/glerc $(PROJECT_BINDIR)/bin/gle.exe
+
+$(OBJECTS): $(INCLUDES)
+
+$(LINKOBJS): $(INCLUDES)
+
+$(PROJECT_BINDIR)/bin/gle.exe: $(PSOBJS) $(GLEOBJS) $(OBJECTS) $(LINKOBJS)
+ $(CC) $(LINK_OPTS) -o $(PROJECT_BINDIR)/bin/gle.exe $(OBJECTS) $(LINKOBJS) $(EXTRA_LIBS)
+
+dofonts:
+ make -C font
+
+$(PROJECT_BINDIR)/glerc:
+ echo "begin config gle" > $(PROJECT_BINDIR)/glerc
+ echo " current = $(VERSION_NUMBER).$(BUILD_NUMBER)" >> $(PROJECT_BINDIR)/glerc
+ echo "end config" >> $(PROJECT_BINDIR)/glerc
+ echo "" >> $(PROJECT_BINDIR)/glerc
+ echo "begin config tools" >> $(PROJECT_BINDIR)/glerc
+ echo " tex = \"vlatexp.cmd\"" >> $(PROJECT_BINDIR)/glerc
+ echo " dvips = \"dvips.exe\"" >> $(PROJECT_BINDIR)/glerc
+ echo " ghostscript = \"gsos2.exe\"" >> $(PROJECT_BINDIR)/glerc
+ echo "end config" >> $(PROJECT_BINDIR)/glerc
+ echo "" >> $(PROJECT_BINDIR)/glerc
+ echo "begin config tex" >> $(PROJECT_BINDIR)/glerc
+ echo " system = vtex" >> $(PROJECT_BINDIR)/glerc
+ echo "end config" >> $(PROJECT_BINDIR)/glerc
+
+#
+# installs files and fonts to GLE_PATH and GLE_PATH/font
+# and creates the inittex.ini file
+#
+
+#
+# simple test to make the sample and compare it to
+# the eps file that is included in the distribution
+# -- if you get this far chances are it working allready ;-)
+# you should only get an error on the Creation date
+#
+test: # do this after make install!
+ gle sample.gle /eps
+ diff sample.eps sample_compare.eps
+
+
+clean:
+ -$(RM) $(OBJECTS) $(LINKOBJS) $(PROJECT_BINDIR)/bin/gle.exe
diff --git a/src/gle/Makefile.vc b/src/gle/Makefile.vc
new file mode 100644
index 0000000..b8d82b8
--- /dev/null
+++ b/src/gle/Makefile.vc
@@ -0,0 +1,74 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+#
+# makefile.vc for GLE v4.0
+# for compilation with MS vc++ .net
+#
+#
+!include ..\..\config.vc
+#
+!include files.txt
+
+!ifdef HAVE_LIBTIFF
+OBJECTS = $(OBJECTS) $(TIFFOBJS)
+!endif
+
+!ifdef HAVE_LIBPNG
+OBJECTS = $(OBJECTS) $(PNGOBJS)
+!endif
+
+!ifdef HAVE_LIBJPEG
+OBJECTS = $(OBJECTS) $(JPEGOBJS)
+!endif
+
+all: $(OBJECTS) $(PSOBJS) $(SVGOBJS) $(PROJECT_BINDIR)\glerc $(PROJECT_BINDIR)\bin\gle$(EXE_SUFF)
+
+$(OBJECTS): $(INCLUDES)
+
+$(PROJECT_BINDIR)\bin\gle$(EXE_SUFF): $(GLEOBJS) $(OBJECTS) $(LINKOBJS)
+ $(AR) $(LINKFLAGS) /out:$(PROJECT_BINDIR)\bin\gle$(EXE_SUFF) $(OBJECTS) $(LINKOBJS) $(LIBS)
+
+$(PROJECT_BINDIR)\glerc:
+ echo begin config gle > $(PROJECT_BINDIR)\glerc
+ echo current = $(VERSION_NUMBER).$(BUILD_NUMBER) >> $(PROJECT_BINDIR)\glerc
+ echo end config >> $(PROJECT_BINDIR)\glerc
+
+clean:
+ -erase $(OBJECTS) $(PSOBJS) $(SVGOBJS) $(PROJECT_BINDIR)\bin\gle$(EXE_SUFF)
+
diff --git a/src/gle/all.h b/src/gle/all.h
new file mode 100644
index 0000000..83e8be0
--- /dev/null
+++ b/src/gle/all.h
@@ -0,0 +1,75 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#ifndef INCLUDE_ALL
+#define INCLUDE_ALL
+
+#include "basicconf.h"
+#include "gle-interface/gle-base.h"
+
+#include <fstream>
+#include <sstream>
+
+#ifdef M_PI
+ #define GLE_PI M_PI
+#else
+ #define GLE_PI 3.14159265358979323846
+#endif
+
+#if defined(__UNIX__) && defined(HAVE_X11)
+ #define ENABLE_GS_PREVIEW
+#endif
+
+//
+// -- containers
+//
+typedef vector< vector<int> > _GlobalPCode;
+typedef vector< vector<int> >::iterator _itGlobalPCode;
+typedef vector< vector<int> >::const_iterator _citGlobalPCode;
+
+typedef vector<int> _PCode;
+typedef vector<int>::iterator _itPCode;
+typedef vector<int>::const_iterator _citPCode;
+
+typedef vector<string> _Tokens;
+typedef vector<string>::iterator _itTokens;
+typedef vector<string>::const_iterator _citTokens;
+
+#include "glepro.h"
+
+#endif
diff --git a/src/gle/axis.cpp b/src/gle/axis.cpp
new file mode 100644
index 0000000..a6216e2
--- /dev/null
+++ b/src/gle/axis.cpp
@@ -0,0 +1,1466 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#include "all.h"
+#include "gle-interface/gle-base.h"
+#include "tokens/stokenizer.h"
+#include "justify.h"
+#include "core.h"
+#include "axis.h"
+#include "gprint.h"
+#include "d_interface.h"
+#include "numberformat.h"
+#include "cutils.h"
+
+#define GRAPHDEF extern
+#include "mem_limits.h"
+#include "token.h"
+#include "graph.h"
+
+double start_subtick(double dsubticks, double dticks, GLEAxis* ax);
+void nice_ticks(double *dticks, double *gmin,double *gmax, double *t1,double *tn,int minset, int maxset);
+void numtrim(char **d,char *s, double dticks);
+void nice_log_ticks(double *start, double *last, double gmin, double gmax) throw (ParserError);
+
+double fnloglen(double v, GLEAxis *ax);
+double fnlogx(double v, GLEAxis *ax);
+
+void draw_axis_titles(GLEAxis *ax, double h, double ox, double oy, GLEMeasureBox* measure);
+void draw_axis_titles_v35(GLEAxis *ax, double h, double ox, double oy, double dticks, double llen);
+
+extern double graph_x1;
+extern double graph_x2;
+extern double graph_y1;
+extern double graph_y2;
+
+void add_tex_labels(string* title)
+{
+ if (g_get_tex_labels() && str_i_str(*title, "\\tex{") == -1) {
+ title->insert(0, "\\tex{");
+ title->append("}");
+ }
+}
+
+double axis_range_dist_perc(double v1, double v2, GLERange* range, bool log) {
+ if (log) {
+ double lwidth = log10(range->getMax()) - log10(range->getMin());
+ v1 = log10(v1)/lwidth;
+ v2 = log10(v2)/lwidth;
+ } else {
+ v1 /= range->getWidth();
+ v2 /= range->getWidth();
+ }
+ return fabs(v1 - v2);
+}
+
+double fnloglen(double v, GLEAxis *ax) {
+ return (v - log10(ax->getMin())) / (log10(ax->getMax()) - log10(ax->getMin())) * ax->length;
+}
+
+double fnAxisX(double v, GLEAxis *ax) {
+ if (ax->negate) {
+ v = ax->getMax() - (v - ax->getMin());
+ }
+ if (ax->log) {
+ return fnloglen(log10(v), ax);
+ } else {
+ return (v - ax->getMin()) / (ax->getMax() - ax->getMin()) * ax->length;
+ }
+}
+
+bool axis_value_equal(double v1, double v2, GLEAxis* ax) {
+ if (ax->log) {
+ if (v2 == 0) {
+ return fabs(v1) < 0.001;
+ } else {
+ return fabs(v1 - v2) / v2 < 0.001;
+ }
+ } else {
+ return fabs(v1 - v2) < ax->dsubticks/100.0;
+ }
+}
+
+bool axis_is_pos(double pos, int* cnt, double del, vector<double>& vec) {
+ if (*cnt < (int)vec.size()) {
+ while (*cnt < (int)vec.size() && pos > vec[*cnt]+del/100.0) {
+ (*cnt)++;
+ }
+ if (*cnt < (int)vec.size() && fabs(pos-vec[*cnt]) < del/100.0) {
+ return true;
+ }
+ }
+ return false;
+}
+
+bool axis_is_pos_perc(double pos, int* cnt, double perc, vector<double>& vec) {
+ if (*cnt < (int)vec.size()) {
+ while (*cnt < (int)vec.size() && pos > vec[*cnt]*(1+perc)) {
+ (*cnt)++;
+ }
+ if (*cnt < (int)vec.size()) {
+ if (vec[*cnt] != 0.0) {
+ if (fabs((pos-vec[*cnt])/vec[*cnt]) < perc) return true;
+ } else {
+ if (fabs(pos-vec[*cnt]) < perc) return true;
+ }
+ }
+ }
+ return false;
+}
+
+void axis_draw_tick(GLEAxis *ax, double fi, int* tick1_cnt, int* tick2_cnt, double ox, double oy, double t) {
+ bool has_tick1 = t > 0.0 || ax->ticks_both;
+ bool has_tick2 = t < 0.0 || ax->ticks_both;
+ has_tick1 &= !ax->isNoTick1(fi, tick1_cnt, ax->dsubticks);
+ has_tick2 &= !ax->isNoTick2(fi, tick2_cnt, ax->dsubticks);
+ if (!has_tick1 && !has_tick2) return;
+ double inv = axis_ticks_neg(ax->type) ? -1.0 : 1.0;
+ double from = has_tick2 ? -fabs(t)*inv : 0.0;
+ double to = has_tick1 ? fabs(t)*inv : 0.0;
+ if (axis_horizontal(ax->type)) {
+ g_move(ox + fnAxisX(fi, ax), oy + from);
+ g_line(ox + fnAxisX(fi, ax), oy + to);
+ } else {
+ g_move(ox + from, oy + fnAxisX(fi, ax));
+ g_line(ox + to, oy + fnAxisX(fi, ax));
+ }
+}
+
+void axis_draw_tick_log(GLEAxis *ax, double fi, int* tick1_cnt, int* tick2_cnt, double ox, double oy, double t) {
+ bool has_tick1 = t > 0.0 || ax->ticks_both;
+ bool has_tick2 = t < 0.0 || ax->ticks_both;
+ has_tick1 &= !ax->isNoTick1Perc(fi, tick1_cnt);
+ has_tick2 &= !ax->isNoTick2Perc(fi, tick2_cnt);
+ if (!has_tick1 && !has_tick2) return;
+ double inv = axis_ticks_neg(ax->type) ? -1.0 : 1.0;
+ double from = has_tick2 ? -fabs(t)*inv : 0.0;
+ double to = has_tick1 ? fabs(t)*inv : 0.0;
+ if (axis_horizontal(ax->type)) {
+ g_move(ox + fnAxisX(fi, ax), oy + from);
+ g_line(ox + fnAxisX(fi, ax), oy + to);
+ } else {
+ g_move(ox + from, oy + fnAxisX(fi, ax));
+ g_line(ox + to, oy + fnAxisX(fi, ax));
+ }
+}
+
+bool inAxisRange(double value, GLEAxis* ax) {
+ if (value >= ax->getMin() && value <= ax->getMax()) {
+ return true;
+ }
+ if (axis_value_equal(value, ax->getMin(), ax)) {
+ return true;
+ }
+ if (axis_value_equal(value, ax->getMax(), ax)) {
+ return true;
+ }
+ return false;
+}
+
+std::vector<double> getLogSubPlaces(double pos, double gmin, double gmax, int lgset) {
+ std::vector<double> result;
+ if (lgset == GLE_AXIS_LOG_1 || lgset == GLE_AXIS_LOG_25 || lgset == GLE_AXIS_LOG_25B) {
+ for (int i = 2; i <= 9; i++) {
+ if (lgset == GLE_AXIS_LOG_1 || i == 2 || i == 5) {
+ double pos_sub = pos * i;
+ if (pos_sub >= gmin && pos_sub <= gmax) {
+ result.push_back(pos_sub);
+ }
+ }
+ }
+ }
+ return result;
+}
+
+std::string g_format_label(double value, double dticks, GLENumberFormat* format) {
+ std::string result;
+ double absValue = fabs(value);
+ if (absValue < 0.00001 * dticks) {
+ // otherwise place for "zero" may be -8.2556e-25 or some other small number
+ value = 0;
+ }
+ if (format != NULL) {
+ format->format(value, &result);
+ } else {
+ char cbuff[100];
+ char* num_trim_str = NULL;
+ if (value == 0 || (absValue > 1e-5 && absValue < 1e6)) {
+ sprintf(cbuff, "%f", value);
+ } else {
+ sprintf(cbuff, "%e", value);
+ }
+ numtrim(&num_trim_str, cbuff, dticks);
+ if (num_trim_str != NULL) {
+ result = num_trim_str;
+ myfree(num_trim_str);
+ }
+ }
+ return result;
+}
+
+void draw_axis(GLEAxis *ax, GLERectangle* box, DrawAxisPart drawPart) {
+ double x,y,gmin,gmax,dticks,tick1,tickn;
+ int savecap;
+ double h,dist;
+ double ox,oy;
+
+ // Fix for font problems by Jan Struyf
+ g_resetfont();
+
+ bool xax = axis_horizontal(ax->type);
+ if (ax->off) return;
+ g_get_xy(&ox,&oy);
+
+ bool drawsubticks = true;
+ bool drawticks = true;
+ bool drawrest = true;
+
+ if (ax->hasGrid()) {
+ if (drawPart == DRAW_AXIS_GRID_SUBTICKS) {
+ drawticks = false;
+ drawrest = false;
+ } else if (drawPart == DRAW_AXIS_GRID_TICKS) {
+ drawsubticks = false;
+ drawrest = false;
+ } else {
+ CUtilsAssert(drawPart == DRAW_AXIS_ALL);
+ drawsubticks = false;
+ drawticks = false;
+ }
+ } else {
+ if (drawPart != DRAW_AXIS_ALL) return;
+ }
+
+/*----------------------------- Generate the places for labels to go */
+ gmin = ax->getMin();
+ gmax = ax->getMax();
+ int lgset = ax->lgset;
+
+ vector<double> subplaces;
+ int lgset_def = GLE_AXIS_LOG_OFF;
+ if (ax->log) {
+ h = ax->label_hei;
+ if (h==0) h = ax->base;
+ nice_log_ticks(&tick1, &tickn, gmin, gmax);
+ /* find suitable value for dticks */
+ if (lgset == GLE_AXIS_LOG_DEFAULT || lgset == GLE_AXIS_LOG_OFF) {
+ dticks = (tickn - tick1) / ax->length * 3 * h;
+ if (dticks >= 4) {
+ dticks = ((int)dticks / 5) * 5.0;
+ } else if (dticks >= 2) {
+ dticks = 2;
+ }
+ } else {
+ dticks = 1.0;
+ }
+ /* nticks explicitly given */
+ if (ax->nticks != 0) {
+ dticks = (tickn - tick1)/(ax->nticks - 1);
+ }
+ /* dticks explicitly given */
+ if (ax->dticks != 0) {
+ dticks = ax->dticks;
+ if (!ax->subticks_off) {
+ /* values smaller than 0.9 translate to lgset */
+ if (dticks < 0.2) lgset_def = GLE_AXIS_LOG_1;
+ else if (dticks < 0.9) lgset_def = GLE_AXIS_LOG_25;
+ }
+ }
+ /* round dticks to integer */
+ if (dticks < 1.0) {
+ dticks = 1.0;
+ } else {
+ dticks = floor(dticks+0.001);
+ }
+ /* define default value for lg_set */
+ if (dticks == 1.0 && lgset_def == GLE_AXIS_LOG_OFF && !ax->subticks_off) {
+ /* dist between 10^0 and 10^1 */
+ dist = fnloglen(2, ax) - fnloglen(1, ax);
+ if (dist > ax->base*22.0) lgset_def = GLE_AXIS_LOG_1;
+ else if (dist > ax->base*4.5) lgset_def = GLE_AXIS_LOG_25;
+ }
+ /* now set value of lgset if not already given */
+ if (lgset == GLE_AXIS_LOG_DEFAULT) {
+ lgset = lgset_def;
+ }
+ if (ax->getNbPlaces() == 0) {
+ for (double pw10 = tick1; pw10 <= tickn; pw10 += dticks) {
+ double pos = pow(10.0, pw10);
+ if (equals_rel(gmin, pos)) {
+ /* first tick */
+ if (!ax->nofirst) {
+ ax->addPlace(pos);
+ }
+ } else if (equals_rel(gmax, pos)) {
+ /* last tick */
+ if (!ax->nolast) {
+ ax->addPlace(pos);
+ }
+ } else {
+ /* add if in window */
+ if (pos >= gmin && pos <= gmax) {
+ ax->addPlace(pos);
+ }
+ }
+ /* also label subticks? */
+ std::vector<double> crSubPlaces(getLogSubPlaces(pos, gmin, gmax, lgset));
+ for (std::vector<double>::iterator i(crSubPlaces.begin()); i != crSubPlaces.end(); ++i) {
+ ax->addPlace(*i);
+ }
+ }
+ }
+ for (double pw10 = tick1; pw10 <= tickn; pw10 += dticks) {
+ std::vector<double> crSubPlaces(getLogSubPlaces(pow(10.0, pw10), gmin, gmax, lgset));
+ for (std::vector<double>::iterator i(crSubPlaces.begin()); i != crSubPlaces.end(); ++i) {
+ subplaces.push_back(*i);
+ }
+ }
+ } else {
+ dticks = 0;
+ GLERangeSet* range = ax->getRange();
+ if (ax->nticks != 0) dticks = (gmax - gmin)/ax->nticks;
+ if (ax->dticks != 0) dticks = ax->dticks;
+ if (ax->has_ftick) {
+ tick1 = ax->ftick;
+ if (ax->dticks == 0) {
+ // Compute suitable value for dticks
+ double dummy = 0.0;
+ nice_ticks(&dticks, &gmin, &gmax, &dummy, &tickn, range->hasMin(), range->hasMax());
+ }
+ if (ax->nticks != 0) {
+ tickn = tick1 + (ax->nticks-1) * dticks;
+ } else {
+ tickn = tick1 + floor((gmax-tick1)/dticks) * dticks;
+ }
+ } else {
+ nice_ticks(&dticks, &gmin, &gmax, &tick1, &tickn, range->hasMin(), range->hasMax());
+ }
+ if (ax->nofirst) tick1 = tick1 + dticks;
+ if (ax->nolast) tickn = tickn - dticks;
+ tickn = tickn + dticks/100.0;
+ if (ax->getNbPlaces() == 0) {
+ /* haven't been set, so generate positions. */
+ double prev_tick = GLE_INF;
+ double end_tick = (tickn+dticks/100.0);
+ for (double fi = tick1; fi <= end_tick; fi += dticks) {
+ if (fi - prev_tick == 0.0) {
+ /* dticks too small for precision of double */
+ ax->subticks_off = true;
+ break;
+ }
+ ax->addPlace(fi);
+ prev_tick = fi;
+ }
+ }
+ }
+
+/*------------------------------ Now draw the ticks (subticks first) */
+
+ // ticks length
+ double tlen = ax->base*g_get_fconst(GLEC_TICKSSCALE);
+ if (ax->ticks_length!=0) tlen = ax->ticks_length;
+
+ // subticks length and distance
+ double stlen = tlen/2;
+ if (ax->subticks_length!=0) stlen = ax->subticks_length;
+
+ // draw subticks
+ if (ax->log) {
+ if (!ax->subticks_off && drawsubticks) {
+ g_gsave();
+ g_set_color(ax->subticks_color);
+ g_set_line_width(ax->subticks_lwidth);
+ g_set_line_style(ax->subticks_lstyle);
+ bool draw_log_subticks = false;
+ if (ax->has_subticks_onoff) {
+ // if "subticks = on" explicitly given -> draw log subticks if dticks <= 1.0
+ draw_log_subticks = (dticks <= 1.0);
+ } else {
+ // if "subticks = on" not given -> draw log subticks based on default lgset
+ draw_log_subticks = (lgset_def != GLE_AXIS_LOG_OFF);
+ }
+ if (lgset != GLE_AXIS_LOG_OFF) {
+ // if log sub-labels on then also draw log subticks (if subtick "on" or "undefined")
+ draw_log_subticks = true;
+ }
+ int place_cnt = 0;
+ int tick1_cnt = 0;
+ int tick2_cnt = 0;
+ for (double pw10 = tick1; pw10 <= tickn; pw10 += 1.0) {
+ double pos = pow(10.0, pw10);
+ if (pos > gmin && pos < gmax && !ax->isPlaceRel(pos, &place_cnt)) {
+ axis_draw_tick_log(ax, pos, &tick1_cnt, &tick2_cnt, ox, oy, stlen);
+ }
+ if (draw_log_subticks) {
+ for (int i = 2; i <= 9; i++) {
+ double pos_sub = pos * i;
+ if (pos_sub > gmin && pos_sub < gmax) {
+ axis_draw_tick_log(ax, pos_sub, &tick1_cnt, &tick2_cnt, ox, oy, stlen);
+ }
+ }
+ }
+ }
+ g_grestore();
+ }
+ } else {
+ double dsubticks = 0;
+ if (ax->nsubticks != 0) dsubticks = dticks/(ax->nsubticks+1);
+ if (ax->dsubticks != 0) dsubticks = ax->dsubticks;
+ if (dsubticks == 0) dsubticks = dticks / 2.0;
+ ax->dsubticks = dsubticks;
+ if (!ax->subticks_off && drawsubticks) {
+ double firstSubtick = start_subtick(dsubticks, dticks, ax);
+ double subtickLimit = ax->getMax() + dsubticks/100.0;
+ int place_cnt = 0;
+ int tick1_cnt = 0;
+ int tick2_cnt = 0;
+ g_gsave();
+ g_set_color(ax->subticks_color);
+ g_set_line_width(ax->subticks_lwidth);
+ g_set_line_style(ax->subticks_lstyle);
+ for (double fi = firstSubtick; fi <= subtickLimit; fi += dsubticks) {
+ if (inAxisRange(fi, ax) && !ax->isPlace(fi, &place_cnt, dsubticks)) {
+ axis_draw_tick(ax, fi, &tick1_cnt, &tick2_cnt, ox, oy, stlen);
+ }
+ }
+ g_grestore();
+ }
+ }
+
+/*------------------------------ Now the main ticks */
+
+ if (!ax->ticks_off && drawticks) {
+ g_gsave();
+ g_set_color(ax->ticks_color);
+ g_set_line_width(ax->ticks_lwidth);
+ g_set_line_style(ax->ticks_lstyle);
+ int tick1_cnt = 0;
+ int tick2_cnt = 0;
+ int subplace_cnt = 0;
+ if (ax->log) {
+ /* Draw log ticks */
+ for (int i = 0; i < ax->getNbPlaces(); i++) {
+ double fi = ax->places[i];
+ if (!axis_is_pos_perc(fi, &subplace_cnt, 1e-6, subplaces)) {
+ /* only draw major ticks */
+ axis_draw_tick_log(ax, fi, &tick1_cnt, &tick2_cnt, ox, oy, tlen);
+ }
+ }
+ } else {
+ for (int i = 0; i < ax->getNbPlaces(); i++) {
+ double fi = ax->places[i];
+ axis_draw_tick(ax, fi, &tick1_cnt, &tick2_cnt, ox, oy, tlen);
+ }
+ }
+ g_grestore();
+ }
+
+/*----------------------------- Ok lets draw the side now */
+/*----------------------------- Note: after the ticks - this gives better result if ticks are different color */
+
+ if (!ax->side_off && drawrest) {
+ // FIXME: is cap not saved by gsave??
+ g_get_line_cap(&savecap);
+ g_gsave();
+ g_set_color(ax->side_color);
+ g_set_line_width(ax->side_lwidth);
+ g_set_line_style(ax->side_lstyle);
+ g_set_line_cap(1);
+ g_get_xy(&x,&y);
+ if (xax) g_line(x+ax->length,y);
+ else g_line(x,y+ax->length);
+ g_grestore();
+ g_set_line_cap(savecap);
+ }
+
+/*------------------------------ Now draw the labels */
+
+ double real_llen = 0;
+ if (!ax->ticks_off) {
+ if (tlen < 0) real_llen = -tlen;
+ if (ax->ticks_both) real_llen = +tlen;
+ }
+ h = ax->label_hei;
+ if (h == 0) h = ax->base;
+ double llen = real_llen + h*g_get_fconst(GLEC_ALABELDIST);
+ if (ax->label_dist != 0) llen = ax->label_dist;
+ if (ax->getNbNames() == 0) {
+ char cbuff[100];
+ GLENumberFormat* format = ax->format == "" ? NULL : new GLENumberFormat(ax->format);
+ if (ax->log) {
+ int subplace_cnt = 0;
+ for (int i = 0; i < ax->getNbPlaces(); i++) {
+ double fi = ax->places[i];
+ int n = (int) floor(.0001 + fi/pow(10.0,floor(log10(fi))));
+ if (!axis_is_pos_perc(fi, &subplace_cnt, 1e-6, subplaces)) {
+ n = (int) floor(log10(fi)+0.5);
+ if (format != NULL) {
+ format->format(pow(10.0, n), ax->getNamePtr(i));
+ } else {
+ if (n == 0) {
+ sprintf(cbuff, "1");
+ } else if (n == 1) {
+ sprintf(cbuff, "10");
+ } else {
+ const char* fmt = g_get_tex_labels() ? "$10^{%d}$" : "10^{%d}";
+ sprintf(cbuff, fmt, n);
+ }
+ ax->setName(i, cbuff);
+ }
+ } else {
+ if (ax->lgset == GLE_AXIS_LOG_25B && format != NULL) {
+ format->format(fi, ax->getNamePtr(i));
+ } else {
+ n = (int) floor(0.0001 + fi/(pow(10.0,floor(log10(fi)))));
+ double lsize = 0.7 * h * g_get_fconst(GLEC_ALABELSCALE);
+ const char* fmt = g_get_tex_labels() ? "{\\sethei{%g}\\tex{%d}}" : "{\\sethei{%g}%d}";
+ sprintf(cbuff, fmt, lsize, n);
+ ax->setName(i, cbuff);
+ }
+ }
+ }
+ } else {
+ if (ax->getNamesDataSet() != -1) {
+ // Get axis labels from a data set
+ ax->getLabelsFromDataSet(ax->getNamesDataSet());
+ } else {
+ for (int i = 0; i < ax->getNbPlaces(); i++) {
+ ax->setName(i, g_format_label(ax->places[i], dticks, format));
+ }
+ }
+ }
+ if (format != NULL) delete format;
+ }
+ g_set_color(ax->label_color);
+ g_set_line_width(ax->label_lwidth);
+ g_set_line_style(ax->label_lstyle);
+ g_set_font(ax->label_font);
+ g_set_hei(h*g_get_fconst(GLEC_ALABELSCALE));
+ double maxd = 0, maxh = 0, maxw = 0;
+ GLEMeasureBox measure;
+ measure.measureStart();
+ // If there are no labels, use g_set_bounds to initialize "measure"
+ double bl,br,bu,bd;
+ init_measure_by_axis(ax, ox, oy, real_llen);
+ if (!ax->label_off && drawrest) {
+ int nb_names = ax->getNbNamedPlaces();
+ for (int i = 0; i < nb_names; i++) {
+ string name = ax->names[i];
+ add_tex_labels(&name);
+ g_measure(name, &bl, &br, &bu, &bd);
+ if (bu > maxh) maxh = bu;
+ if (-bd > maxd) maxd = -bd;
+ if (br-bl > maxw) maxw = br-bl;
+ }
+ int place_cnt = 0;
+ double angle = ax->getLabelAngle();
+ for (int i = 0; i < nb_names; i++) {
+ double fi = ax->places[i];
+ string name = ax->names[i];
+ add_tex_labels(&name);
+ if (!ax->isNoPlaceLogOrReg(fi, &place_cnt, dticks) && name != "") {
+ fi = fnAxisX(fi, ax);
+ if (ax->log) fi = fnAxisX(ax->places[i], ax);
+ g_measure(name, &bl, &br, &bu, &bd);
+ switch (ax->type) {
+ case GLE_AXIS_X:
+ case GLE_AXIS_X0:
+ if (angle == 0.0) {
+ g_move(ox+fi+ax->shift, oy-llen-maxh);
+ g_jtext(JUST_CENTRE);
+ } else {
+ g_gsave();
+ g_move(ox+fi+ax->shift, oy-llen);
+ g_rotate(angle);
+ if (angle == 90.0) g_jtext(JUST_RC);
+ else if (angle > 0.0) g_jtext(JUST_TR);
+ else g_jtext(JUST_TL);
+ g_grestore();
+ }
+ break;
+ case GLE_AXIS_Y:
+ case GLE_AXIS_Y0:
+ if (angle == 0.0) {
+ if (ax->label_align == JUST_RIGHT) {
+ g_move(ox-llen, oy+fi+ax->shift);
+ g_jtext(JUST_RC);
+ } else {
+ g_move(ox-llen-maxw, oy+fi+ax->shift);
+ g_jtext(JUST_LC);
+ }
+ } else {
+ g_gsave();
+ if (angle == 90.0) {
+ g_move(ox-llen-maxd, oy+fi+ax->shift);
+ g_rotate(90);
+ g_jtext(JUST_CENTRE);
+ } else if (angle == -90.0) {
+ g_move(ox-llen-maxh+maxd, oy+fi+ax->shift);
+ g_rotate(-90);
+ g_jtext(JUST_CENTRE);
+ } else {
+ g_move(ox-llen, oy+fi+ax->shift);
+ g_rotate(angle);
+ if (angle > 0.0) g_jtext(JUST_BR);
+ else g_jtext(JUST_TR);
+ }
+ g_grestore();
+ }
+ break;
+ case GLE_AXIS_X2:
+ if (angle == 0.0) {
+ g_move(ox+fi+ax->shift, oy+llen+maxd);
+ g_jtext(JUST_CENTRE);
+ } else {
+ g_gsave();
+ g_move(ox+fi+ax->shift, oy+llen);
+ g_rotate(angle);
+ if (angle == 90.0) g_jtext(JUST_LC);
+ else if (angle > 0.0) g_jtext(JUST_BL);
+ else g_jtext(JUST_BR);
+ g_grestore();
+ }
+ break;
+ case GLE_AXIS_Y2:
+ if (angle == 0.0) {
+ g_move(ox+llen, oy+fi+ax->shift);
+ g_jtext(JUST_LC);
+ } else {
+ g_gsave();
+ if (angle == 90.0) {
+ g_move(ox+llen+maxh-maxd, oy+fi+ax->shift);
+ g_rotate(90);
+ g_jtext(JUST_CENTRE);
+ } else if (angle == -90.0) {
+ g_move(ox+llen, oy+fi+ax->shift);
+ g_rotate(-90);
+ g_jtext(JUST_CENTRE);
+ } else {
+ g_move(ox+llen, oy+fi+ax->shift);
+ g_rotate(angle);
+ if (angle > 0.0) g_jtext(JUST_TL);
+ else g_jtext(JUST_BL);
+ }
+ g_grestore();
+ }
+ break;
+ }
+ }
+ }
+ }
+ measure.measureEnd();
+ // g_box_stroke(measure.getX1(), measure.getY1(), measure.getX2(), measure.getY2(), false);
+
+/*---------------------------------- Now the axis title. */
+
+ if (ax->title_off || ax->title == "" || !drawrest) {
+ g_update_bounds_box(box);
+ return;
+ }
+ if (g_get_compatibility() <= GLE_COMPAT_35) {
+ draw_axis_titles_v35(ax, h, ox, oy, dticks, llen);
+ } else {
+ draw_axis_titles(ax, h, ox, oy, &measure);
+ }
+ g_update_bounds_box(box);
+}
+
+void init_measure_by_axis(GLEAxis* ax, double ox, double oy, double llen) {
+ // If there are no labels, use g_set_bounds to initialize "measure"
+ switch (ax->type) {
+ case GLE_AXIS_X:
+ case GLE_AXIS_X0:
+ g_update_bounds(ox+ax->shift, oy-llen);
+ break;
+ case GLE_AXIS_Y:
+ case GLE_AXIS_Y0:
+ g_update_bounds(ox-llen, oy+ax->shift);
+ break;
+ case GLE_AXIS_X2:
+ case GLE_AXIS_T:
+ g_update_bounds(ox+ax->shift, oy+llen);
+ break;
+ case GLE_AXIS_Y2:
+ g_update_bounds(ox+llen, oy+ax->shift);
+ break;
+ }
+}
+
+void draw_axis_titles(GLEAxis *ax, double h, double ox, double oy, GLEMeasureBox* measure) {
+ double bl,br,bu,bd;
+ g_gsave();
+ double th = h * g_get_fconst(GLEC_ATITLESCALE);
+ if (ax->title_scale != 0) th = th*ax->title_scale;
+ if (ax->title_hei != 0) th = ax->title_hei;
+ g_set_color(ax->title_color);
+ g_set_font(ax->title_font);
+ g_set_hei(th);
+ double tdist = ax->title_dist;
+ if (ax->title_adist >= 0.0) {
+ // absolute distance from axis side
+ // update measure without taking into account labels or ticks!
+ measure->measureStart();
+ init_measure_by_axis(ax, ox, oy, 0.0);
+ measure->measureEndIgnore();
+ tdist = ax->title_adist;
+ // also align to baseline and not to bottom of text
+ ax->alignBase = true;
+ }
+ if (tdist == 0) tdist = h * g_get_fconst(GLEC_ATITLEDIST);
+ string title_str(ax->title);
+ add_tex_labels(&title_str);
+ g_measure(title_str,&bl,&br,&bu,&bd);
+ switch (ax->type) {
+ case GLE_AXIS_X:
+ case GLE_AXIS_X0:
+ g_move(ox+ax->length/2, measure->getYMin() - tdist);
+ g_jtext(JUST_TC);
+ break;
+ case GLE_AXIS_Y:
+ case GLE_AXIS_Y0:
+ g_move(measure->getXMin() - tdist,oy + ax->length/2);
+ g_rotate(90.0);
+ if (ax->isAlignBase()) g_jtext(JUST_CENTER);
+ else g_jtext(JUST_BC);
+ break;
+ case GLE_AXIS_X2:
+ case GLE_AXIS_T:
+ g_move(ox+ax->length/2, measure->getYMax() + tdist);
+ // *should* be center - otherwise titles of different graphs don't align!
+ if (ax->isAlignBase()) g_jtext(JUST_CENTER);
+ else g_jtext(JUST_BC);
+ break;
+ case GLE_AXIS_Y2:
+ g_move(measure->getXMax() + tdist,oy + ax->length/2);
+ if (ax->title_rot) {
+ g_rotate(-90.0);
+ if (ax->isAlignBase()) g_jtext(JUST_CENTER);
+ else g_jtext(JUST_BC);
+ } else {
+ g_rotate(90.0);
+ g_jtext(JUST_TC);
+ }
+ break;
+ }
+ g_grestore();
+}
+
+void draw_axis_titles_v35(GLEAxis *ax, double h, double ox, double oy, double dticks, double llen) {
+ double bl,br,bu,bd,x,y;
+ double ty = 0;
+ double tx = ox-.3*h;
+ double maxd = 0;
+ if (ax->type == GLE_AXIS_Y2) tx = ox + .3*h;
+ if (ax->type == GLE_AXIS_X || ax->type == GLE_AXIS_X0) ty = oy-llen-.3*h;
+ if (ax->type == GLE_AXIS_X2 || ax->type == GLE_AXIS_T) ty = oy+llen;
+ if (!ax->label_off) {
+ int nb_names = ax->getNbNamedPlaces();
+ for (int i = 0; i < nb_names; i++) {
+ string name(ax->names[i]);
+ add_tex_labels(&name);
+ g_measure(name,&bl,&br,&bu,&bd);
+ if (bd>maxd) maxd = bd;
+ }
+ int place_cnt = 0;
+ for (int i = 0; i < nb_names; i++) {
+ double fi = ax->places[i];
+ string name = ax->names[i];
+ add_tex_labels(&name);
+ if (!ax->isNoPlaceLogOrReg(fi, &place_cnt, dticks) && name != "") {
+ fi = fnAxisX(fi, ax);
+ if (ax->log) fi = fnAxisX(ax->places[i], ax);
+ g_measure(name, &bl, &br, &bu, &bd);
+ switch (ax->type) {
+ case GLE_AXIS_X:
+ case GLE_AXIS_X0:
+ y = oy-llen-bu+bd-.3*h;
+ if (y<ty) ty = y;
+ break;
+ case GLE_AXIS_Y:
+ case GLE_AXIS_Y0:
+ x = ox-br+bl-llen-.3*h;
+ if (x<tx) tx = x;
+ break;
+ case GLE_AXIS_X2:
+ case GLE_AXIS_T:
+ y = oy+llen+maxd+bu;
+ if (y>ty) ty = y;
+ break;
+ case GLE_AXIS_Y2:
+ x = ox+br-bl+llen+.3*h;
+ if (x>tx) tx = x;
+ break;
+ }
+ if (bd>maxd) maxd = bd;
+ }
+ }
+ }
+ g_gsave();
+ double th = h * 1.3;
+ if (ax->title_scale!=0) th = th*ax->title_scale;
+ if (ax->title_hei!=0) th = ax->title_hei;
+ g_set_color(ax->title_color);
+ g_set_font(ax->title_font);
+ g_set_hei(th);
+ g_measure(ax->title,&bl,&br,&bu,&bd);
+ switch (ax->type) {
+ case GLE_AXIS_X:
+ case GLE_AXIS_X0:
+ g_move(ox+ax->length/2,ty - ax->title_dist);
+ g_jtext(JUST_TC);
+ break;
+ case GLE_AXIS_Y:
+ case GLE_AXIS_Y0:
+ g_move(tx - ax->title_dist,oy + ax->length/2);
+ g_rotate(90.0);
+ g_jtext(JUST_BC);
+ g_rotate(-90.0);
+ break;
+ case GLE_AXIS_X2:
+ case GLE_AXIS_T:
+ g_move(ox+ax->length/2,ty + ax->title_dist);
+ g_jtext(JUST_BC);
+ break;
+ case GLE_AXIS_Y2: /* y2axis */
+ g_move(tx + ax->title_dist,oy + ax->length/2);
+ if (ax->title_rot) {
+ g_rotate(-90.0);
+ g_jtext(JUST_BC);
+ g_rotate(90.0);
+ } else {
+ g_rotate(90.0);
+ g_jtext(JUST_TC);
+ g_rotate(-90.0);
+ }
+ break;
+ }
+ g_grestore();
+}
+
+void nice_log_ticks(double *start, double *last, double gmin, double gmax) throw (ParserError) {
+ if (gmin <= 0 || gmax <= 0) {
+ stringstream err;
+ err << "illegal range for log axis: min = ";
+ err << gmin << " max = " << gmax;
+ g_throw_parser_error(err.str());
+ }
+ /* range in powers of 10 */
+ /* add one extra power on both sides! */
+ *start = floor(log10(gmin)-1e-6);
+ if (equals_rel(gmin, pow(10.0, *start+1))) {
+ (*start)++;
+ }
+ *last = ceil(log10(gmax)+1e-6);
+ if (equals_rel(gmax, pow(10.0, *last-1))) {
+ (*last)--;
+ }
+}
+
+double compute_dticks(GLERange* range) {
+ if (range->getMax() <= range->getMin()) {
+ return 0.0;
+ }
+ double delta = range->getMax() - range->getMin();
+ double st = delta/10;
+ double expnt = floor(log10(st));
+ double n = st/pow(10.0, expnt);
+ int ni = 1;
+ if (n > 5) {
+ ni = 10;
+ } else if (n > 2) {
+ ni = 5;
+ } else if (n > 1) {
+ ni = 2;
+ } else {
+ ni = 1;
+ }
+ return ni * pow(10.0, expnt);
+}
+
+bool auto_collapse_range(GLERange* range, double dticks) {
+ // detect underflow in precision
+ // because this could lead to infinite loop in axis drawing code
+ double max_end = max(fabs(range->getMin()), fabs(range->getMax()));
+ if (max_end == 0.0) {
+ range->setMin(0.0); range->setMax(0.0);
+ return true;
+ }
+ if (dticks / max_end < CUTILS_REL_PREC_FINE) {
+ double mean = (range->getMin() + range->getMax())/2.0;
+ range->setMin(mean); range->setMax(mean);
+ return true;
+ } else {
+ return false;
+ }
+}
+
+void nice_ticks(double *dticks, double *gmin, double *gmax, double *t1, double *tn, int minset, int maxset) {
+/*
+ double delta,st,expnt,n;
+ int ni;
+ delta = *gmax-*gmin;
+ if (delta == 0) {
+ gprint("Axis range error min=%g max=%g \n",*gmin,*gmax);
+ *gmax = *gmin+10;
+ delta = 10;
+ }
+ st = delta/10;
+ expnt = floor(log10(st));
+ n = st/pow(10.0,expnt);
+ if (n>5)
+ ni = 10;
+ else if (n>2)
+ ni = 5;
+ else if (n>1)
+ ni = 2;
+ else
+ ni = 1;
+ if (*dticks==0) *dticks = ni * pow(10.0,expnt);
+
+
+ if (*gmin - (delta/1000) <= floor( *gmin/ *dticks) * *dticks)
+ *t1 = *gmin;
+ else
+ *t1 = (floor(*gmin/ *dticks) * *dticks ) + *dticks;
+
+ *tn = *gmax;
+ if ( (floor(.000001+ *gmax / *dticks) * *dticks) <
+ (*gmax - (delta/1000) ) )
+ *tn = floor(.00001 + *gmax/ *dticks ) * *dticks;
+*/
+ if (*gmax <= *gmin) {
+ gprint("Axis range error min=%g max=%g \n",*gmin,*gmax);
+ *gmax = *gmin + 10;
+ }
+ GLERange range;
+ range.setMinMax(*gmin, *gmax);
+ if (*dticks == 0.0) {
+ // no dticks parameter given for axis
+ *dticks = compute_dticks(&range);
+ }
+ // Round range to nearest dtick
+ range.setMax(ceil(range.getMax()/(*dticks)) * (*dticks));
+ range.setMin(floor(range.getMin()/(*dticks)) * (*dticks));
+ // cout << "Range0 [" << *gmin << "," << *gmax << "] ticks ["<< range.getMin() << "," << range.getMax() << "] diff: " << ((*gmin)-range.getMin()) << endl;
+ // Make sure labels are in axis range
+ if ((*gmin)-range.getMin() > CUTILS_REL_PREC_FINE) range.setMin(range.getMin()+(*dticks));
+ if (range.getMax()-(*gmax) > CUTILS_REL_PREC_FINE) range.setMax(range.getMax()-(*dticks));
+ // cout << "Range1 [" << *gmin << "," << *gmax << "] ticks ["<< range.getMin() << "," << range.getMax() << "]" << endl;
+ // Return labels
+ *t1 = range.getMin();
+ *tn = range.getMax();
+}
+
+void roundrange(GLERange* range, bool extend, bool tozero, double dticks) {
+ if (range->getMax() <= range->getMin()) {
+ return;
+ }
+ double delta = range->getMax() - range->getMin();
+ // auto-extend axis towards zero
+ if (tozero && range->getMin() > 0 && range->getMin() <= delta*0.2) {
+ range->setMin(0.0);
+ }
+ if (tozero && range->getMax() < 0 && range->getMax() >= -delta*0.2) {
+ range->setMax(0.0);
+ }
+ if (dticks == 0.0) {
+ // no dticks parameter given for axis
+ dticks = compute_dticks(range);
+ }
+ // detect underflow in precision
+ if (auto_collapse_range(range, dticks)) {
+ return;
+ }
+ // round range towards multiple of dticks
+ if (equals_rel_fine(ceil(range->getMax()/dticks) * dticks, range->getMax())) {
+ range->setMax(ceil(range->getMax()/dticks) * dticks);
+ // "extend" is true only in bar plots - it makes sure that there is a tick of space
+ // left above of the largest bar; otherwise the bar would extend to the x2axis
+ if (extend && range->getMax() != 0.0) range->setMax(range->getMax() + dticks);
+ } else {
+ range->setMax(ceil(range->getMax()/dticks) * dticks);
+ }
+ if (equals_rel_fine(floor(range->getMin()/dticks) * dticks, range->getMin())) {
+ range->setMin(floor(range->getMin()/dticks) * dticks);
+ if (extend && range->getMin() != 0.0) range->setMin(range->getMin() - dticks);
+ } else {
+ range->setMin(floor(range->getMin()/dticks) * dticks);
+ }
+}
+
+double start_subtick(double dsubticks, double dticks, GLEAxis* ax) {
+ double firstTick;
+ if (ax->getNbPlaces() > 0) {
+ firstTick = ax->getPlace(0);
+ } else {
+ GLERange range;
+ range.copy(ax->getRange());
+ roundrange(&range, false, false, dticks);
+ firstTick = range.getMin();
+ }
+ if (firstTick <= ax->getMin()) {
+ return firstTick;
+ } else {
+ double n = ceil((firstTick - ax->getMin()) / dsubticks) + 1;
+ return firstTick - n * dsubticks;
+ }
+}
+
+void numtrime(char *o,char *s) {
+ char *e, *f;
+ strcpy(o, s);
+ e = strchr(s, 'e');
+ if (e == NULL) return;
+ e--;
+ for (; *e=='0'; e--);
+ if (*e == '.') {
+ e--;
+ }
+ f = strchr(s, 'e');
+ strcpy(e + 1, f);
+ strcpy(o, s);
+}
+
+void numtrim(char **d,char *s,double dticks) {
+ char *o,*nonzero=0;
+ if (*d==0) *d = (char*) myallocz(20);
+ o = *d;
+ nonzero = 0;
+ if (strchr(s,'e')!=NULL) {
+ numtrime(o,s);
+ return;
+ }
+ while (*s==' ' && *s!=0) s++;
+ while (*s!=0) {
+ *(o++) = *(s++);
+ if (*s=='.') {
+ nonzero = o-1;
+ if (dticks!=floor(dticks)) nonzero = o+1;
+ while (*s!=0) {
+ *(o++) = *(s++);
+ if ((*s!='0') && (*s!=0))
+ if (o>nonzero) nonzero = o;
+ }
+ }
+ }
+ *(o++) = 0;
+ if (nonzero!=NULL) *(nonzero+1) = 0;
+}
+
+bool axis_is_max(int axis) {
+ return axis == GLE_AXIS_X2 || axis == GLE_AXIS_Y2;
+}
+
+bool axis_ticks_neg(int axis) {
+ return axis == GLE_AXIS_X2 || axis == GLE_AXIS_Y2;
+}
+
+bool axis_horizontal(int axis) {
+ return axis == GLE_AXIS_X0 || axis == GLE_AXIS_X || axis == GLE_AXIS_X2 || axis == GLE_AXIS_T;
+}
+
+int axis_get_orth(int axis, int which) {
+ if (axis_horizontal(axis)) {
+ switch (which) {
+ case 0: return GLE_AXIS_Y0;
+ case 1: return GLE_AXIS_Y;
+ default: return GLE_AXIS_Y2;
+ }
+ } else {
+ switch (which) {
+ case 0: return GLE_AXIS_X0;
+ case 1: return GLE_AXIS_X;
+ default: return GLE_AXIS_X2;
+ }
+ }
+}
+
+int axis_type(const char *s) {
+ if (str_ni_equals(s,"X0",2)) return GLE_AXIS_X0;
+ if (str_ni_equals(s,"Y0",2)) return GLE_AXIS_Y0;
+ if (str_ni_equals(s,"X2",2)) return GLE_AXIS_X2;
+ if (str_ni_equals(s,"Y2",2)) return GLE_AXIS_Y2;
+ if (str_ni_equals(s,"X",1)) return GLE_AXIS_X;
+ if (str_ni_equals(s,"Y",1)) return GLE_AXIS_Y;
+ return GLE_AXIS_ALL;
+}
+
+int axis_type_check(const char *s) throw (ParserError) {
+ int type = axis_type(s);
+ if (type == GLE_AXIS_ALL) {
+ ostringstream err;
+ err << "can't infer axis type (x, y, ...) from expression '" << s << "'; ";
+ err << "try, e.g., 'x" << s << "'";
+ g_throw_parser_error(err.str());
+ }
+ return type;
+}
+
+const char* axis_type_name(int type) {
+ switch (type) {
+ case GLE_AXIS_X: return "xaxis";
+ case GLE_AXIS_Y: return "yaxis";
+ case GLE_AXIS_X2: return "x2axis";
+ case GLE_AXIS_Y2: return "y2axis";
+ case GLE_AXIS_X0: return "x0axis";
+ case GLE_AXIS_Y0: return "y0axis";
+ default: return "unknown";
+ }
+}
+
+/*
+ * lower and upper quantile used for automatic yscaling.
+ * the factors control the amount of extension of the yrange
+ * under the lower quantile and above the upper quantile. with
+ * lower quantile of 3/40=0.075 and upper quantile of
+ * 37/40=0.925 a factor of 3/34=0.0882 would extend linearly,
+ * meaning that the graph of a linear function (e. g.: f(x)=x)
+ * would exactly fit. a slightly higher value looks fine for
+ * many functions.
+ */
+
+GLEAxisQuantileScale::GLEAxisQuantileScale() {
+ m_QLower = 0.075;
+ m_QUpper = 0.925;
+ m_QLowerFactor = 0.092;
+ m_QUpperFactor = 0.092;
+}
+
+GLEAxisQuantileScale::~GLEAxisQuantileScale() {
+}
+
+GLEAxis::GLEAxis() : format() {
+}
+
+GLEAxis::~GLEAxis() {
+}
+
+void GLEAxis::init(int i) {
+ format = ""; title = "";
+ clearNoTicks();
+ names.clear(); places.clear(); noplaces.clear();
+ base = 0.0; length = 0.0; shift = 0.0;
+ label_align = JUST_RIGHT;
+ label_font = 0; label_hei = 0.0; label_scale = 0.0; label_dist = 0.0;
+ log = 0; nofirst = 0; nolast = 0;
+ nticks = 0; nsubticks = 0; dticks = 0.0; dsubticks = 0.0;
+ ticks_length = 0.0; ticks_scale = 0.0; ticks_lstyle[0] = 0;
+ subticks_length = 0.0; subticks_scale = 0.0; subticks_lstyle[0] = 0;
+ label_lstyle[0] = 0;
+ off = 0;
+ label_off = (i != GLE_AXIS_X && i != GLE_AXIS_Y);
+ side_off = 0; ticks_off = 0; subticks_off = 0;
+ side_lstyle[0] = 0;
+ title_font = 0; title_dist = 0.0; title_adist = -1.0; title_hei = 0.0; title_scale = 0.0;
+ title_rot = 0; title_off = 0; title_color = 0;
+ negate = 0;
+ names_ds = -1;
+ label_angle = 0.0;
+ has_subticks_onoff = false;
+ has_label_onoff = false;
+ setColor(g_get_color());
+ side_lwidth = -1; ticks_lwidth = -1; subticks_lwidth = -1; label_lwidth = -1;
+ lgset = GLE_AXIS_LOG_DEFAULT;
+ has_ftick = false; ftick = 0.0;
+ has_offset = false; offset = 0.0;
+ ticks_both = false; grid = false; gridtop = false;
+ roundRange = true;
+ type = i;
+ getRange()->initRange();
+ getRange()->resetSet();
+ m_QuantileScale.clear();
+ if (g_get_compatibility() <= GLE_COMPAT_35) {
+ alignBase = false;
+ } else {
+ if (i == GLE_AXIS_Y || i == GLE_AXIS_Y0 || i == GLE_AXIS_Y2) alignBase = false;
+ else alignBase = true;
+ }
+}
+
+string* GLEAxis::getNamePtr(int i) {
+ while ((int)names.size() <= i) names.push_back(string());
+ return &names[i];
+}
+
+void GLEAxis::setName(int i, const std::string& name) {
+ while ((int)names.size() <= i) names.push_back(string());
+ names[i] = name;
+}
+
+void GLEAxis::setPlace(int i, double place) {
+ while ((int)places.size() <= i) places.push_back(0.0);
+ places[i] = place;
+}
+
+void GLEAxis::insertNoTick(double pos, vector<double>& vec) {
+ vector<double>::size_type at = 0;
+ while (at < vec.size() && vec[at] < pos) {
+ at++;
+ }
+ if (at == vec.size()) vec.push_back(pos);
+ else vec.insert(vec.begin()+at, pos);
+}
+
+bool GLEAxis::isNoPlaceLogOrReg(double pos, int* place_cnt, double delta) {
+ if (log) return axis_is_pos_perc(pos, place_cnt, 0.001, noplaces);
+ else return axis_is_pos(pos, place_cnt, delta, noplaces);
+}
+
+void GLEAxis::addNoTick(double pos) {
+ addNoTick1(pos);
+ addNoTick2(pos);
+}
+
+void GLEAxis::insertNoTick(double pos) {
+ insertNoTick1(pos);
+ insertNoTick2(pos);
+}
+
+void GLEAxis::insertNoTickOrLabel(double pos) {
+ insertNoTick1(pos);
+ insertNoTick2(pos);
+ insertNoPlace(pos);
+}
+
+void GLEAxis::clearNoTicks() {
+ noticks1.clear();
+ noticks2.clear();
+}
+
+void GLEAxis::printNoTicks() {
+ cout << "Noticks1:";
+ for (vector<double>::size_type i = 0; i < noticks1.size(); i++) {
+ cout << " " << noticks1[i];
+ }
+ cout << endl;
+ cout << "Noticks2:";
+ for (vector<double>::size_type i = 0; i < noticks2.size(); i++) {
+ cout << " " << noticks2[i];
+ }
+ cout << endl;
+ cout << "NoPlaces:";
+ for (vector<double>::size_type i = 0; i < noplaces.size(); i++) {
+ cout << " " << noplaces[i];
+ }
+ cout << endl;
+}
+
+int GLEAxis::getNbNamedPlaces() {
+ int nb = getNbNames();
+ if (getNbPlaces() < nb) nb = getNbPlaces();
+ return nb;
+}
+
+double GLEAxis::getLocalAveragePlacesDistance(int i) {
+ int count = 0;
+ double distance = 0.0;
+ if (i > 0) {
+ distance += fabs(places[i] - places[i - 1]);
+ count ++;
+ }
+ if (i < getNbPlaces() - 1) {
+ distance += fabs(places[i] - places[i + 1]);
+ count ++;
+ }
+ if (count == 0) {
+ return GLE_INF;
+ } else {
+ return distance / count;
+ }
+}
+
+void GLEAxis::getLabelsFromDataSet(int ds) {
+ GLEDataSet* dataSet = dp[ds];
+ if (dataSet == NULL || dataSet->np == 0) {
+ return;
+ }
+ GLEDataPairs data;
+ GLEDataPairs::validate(dataSet, 2);
+ data.copyDimension(dataSet, 0);
+ GLEArrayImpl* yv = static_cast<GLEArrayImpl*>(dataSet->getData()->getObject(1));
+ double* xt = data.getX();
+ double min_val = xt[0];
+ double max_val = xt[dataSet->np - 1];
+ double half_spc = (max_val - min_val) / dataSet->np / 2.0;
+ min_val -= half_spc;
+ max_val += half_spc;
+ unsigned int crpos = 0;
+ for (int i = 0; i < getNbPlaces(); i++) {
+ double fi = places[i];
+ *getNamePtr(i) = "";
+ if (fi >= min_val && fi <= max_val) {
+ // find last position with x-value smaller than fi
+ while (crpos < dataSet->np && xt[crpos] < fi) {
+ crpos++;
+ }
+ if (crpos < dataSet->np && crpos >= 0) {
+ if (crpos > 0) crpos--;
+ unsigned int sel = crpos;
+ double dist = fabs(xt[crpos] - fi);
+ if (crpos+1 < dataSet->np) {
+ if (fabs(xt[crpos+1] - fi) < dist) sel = crpos+1;
+ }
+ if (crpos >= 1) {
+ if (fabs(xt[crpos-1] - fi) < dist) sel = crpos-1;
+ }
+ if (sel >= 0 && sel < dataSet->np && !data.getM(sel)) {
+ bool showLabel = true;
+ dist = fabs(xt[sel] - fi);
+ if (!log && dist > getLocalAveragePlacesDistance(i) / 2.0) {
+ showLabel = false;
+ }
+ if (showLabel) {
+ GLERC<GLEString> str(yv->getString(sel));
+ *getNamePtr(i) = str->toUTF8();
+ }
+ }
+ }
+ }
+ }
+}
+
+void GLEAxis::initRange() {
+ getDataRange()->initRange();
+ getRange()->initRangeIfNotSet();
+}
+
+void GLEAxis::performRoundRange(GLERange* range, bool extend, bool tozero) {
+ if (range->getMax() <= range->getMin()) {
+ return;
+ }
+ if (!log) {
+ if (roundRange) {
+ roundrange(range, extend, tozero, dticks);
+ } else {
+ double dt = compute_dticks(range);
+ auto_collapse_range(range, dt);
+ }
+ }
+}
+
+void GLEAxis::roundDataRange(bool extend, bool tozero) {
+ if (getRange()->hasBoth()) {
+ return;
+ }
+ GLERange* drange = getDataRange();
+ performRoundRange(drange, extend, tozero);
+ drange->copyHas(getRange());
+ getRange()->copyIfNotSet(drange);
+}
+
+void GLEAxis::makeUpRange(GLEAxis* copy, GLEAxis* orth, bool extend, bool tozero) {
+ if (getRange()->hasBoth()) {
+ return;
+ }
+ GLERange* drange = getDataRange();
+ if (drange->getWidth() == 0.0) {
+ // No spread in values
+ double x = drange->getMin();
+ GLERange* orth_range = orth->getRange();
+ if (!log && !orth->log && orth_range->validNotEmpty()) {
+ // Set range based on orthogonal axis
+ drange->setMin(x - orth_range->getWidth()/2);
+ drange->setMax(x + orth_range->getWidth()/2);
+ performRoundRange(drange, extend, tozero);
+ }
+ if (drange->getWidth() == 0.0) {
+ // Previous approach was not applicable or did not help
+ if (log) {
+ // Set 3 log steps
+ drange->setMinMax(x/10, x*10);
+ } else {
+ // Range [0..2x] or [-2x..0]
+ double xa = fabs(x);
+ if (xa == 0) drange->setMinMax(-1, 1);
+ else drange->setMinMax(x - xa, x + xa);
+ performRoundRange(drange, extend, tozero);
+ }
+ }
+ }
+ if (drange->invalidOrEmpty()) {
+ // Note: if both ends found and invalid then error in range specification
+ // this should throw error later, so ignore that case
+ if (!drange->isMinValid() && !drange->isMaxValid()) {
+ // Both ends of axis not found, copy range or use default
+ GLERange* copy_range = copy->getRange();
+ if (copy_range->validNotEmpty()) {
+ drange->copy(copy_range);
+ // Copy not only range, but also places (if given)
+ if (getNbPlaces() == 0 && copy->getNbPlaces() > 0) {
+ for (int i = 0; i < copy->getNbPlaces(); i++) {
+ addPlace(copy->getPlace(i));
+ }
+ }
+ } else {
+ if (log) drange->setMinMax(1, 1e3);
+ else drange->setMinMax(0, 1);
+ }
+ } else if (drange->isMinValid()) {
+ if (log) {
+ // Set 3 log steps
+ drange->setMax(drange->getMin()*100);
+ } else {
+ // Range [min..0], [0..1], or [v..10v]
+ if (drange->getMin() < 0) drange->setMax(0);
+ else if (drange->getMin() == 0) drange->setMax(1);
+ else drange->setMax(drange->getMin()*10);
+ performRoundRange(drange, extend, tozero);
+ }
+ } else if (drange->isMaxValid()) {
+ if (log) {
+ // Set 3 log steps
+ drange->setMin(drange->getMax()/100);
+ } else {
+ // Range [0..max], [-1..0], or [-10v..-v]
+ if (drange->getMax() > 0) drange->setMin(0);
+ else if (drange->getMax() == 0) drange->setMin(-1);
+ else drange->setMin(drange->getMax()*10);
+ performRoundRange(drange, extend, tozero);
+ }
+ }
+ }
+ getRange()->copyIfNotSet(drange);
+}
+
+
+void GLEAxis::setColor(const GLERC<GLEColor>& color) {
+ side_color = color;
+ ticks_color = color;
+ label_color = color;
+ subticks_color = color;
+}
diff --git a/src/gle/axis.h b/src/gle/axis.h
new file mode 100644
index 0000000..ffd54cf
--- /dev/null
+++ b/src/gle/axis.h
@@ -0,0 +1,224 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#ifndef GLE_HAS_AXIS_H
+#define GLE_HAS_AXIS_H
+
+#define GLE_AXIS_NONE -1
+#define GLE_AXIS_MAX 7
+#define GLE_AXIS_X 1
+#define GLE_AXIS_Y 2
+#define GLE_AXIS_X2 3
+#define GLE_AXIS_Y2 4
+#define GLE_AXIS_X0 5
+#define GLE_AXIS_Y0 6
+#define GLE_AXIS_T 7
+#define GLE_AXIS_ALL 8
+
+#define GLE_AXIS_LOG_DEFAULT 0
+#define GLE_AXIS_LOG_OFF 1
+#define GLE_AXIS_LOG_25B 2
+#define GLE_AXIS_LOG_25 3
+#define GLE_AXIS_LOG_1 4
+#define GLE_AXIS_LOG_N1 5
+
+bool axis_ticks_neg(int axis);
+bool axis_is_max(int axis);
+bool axis_horizontal(int axis);
+int axis_get_orth(int axis, int which);
+int axis_type(const char *s);
+int axis_type_check(const char *s) throw (ParserError);
+const char* axis_type_name(int type);
+bool axis_is_pos(double pos, int* cnt, double del, vector<double>& vec);
+bool axis_is_pos_perc(double pos, int* cnt, double perc, vector<double>& vec);
+double axis_range_dist_perc(double v1, double v2, GLERange* range, bool log);
+
+void roundrange(GLERange* range, bool extend, bool tozero, double dticks);
+
+class GLEDataSetDimension;
+
+class GLEAxisQuantileScale : public GLERefCountObject {
+protected:
+ double m_QLower, m_QUpper, m_QLowerFactor, m_QUpperFactor;
+public:
+ GLEAxisQuantileScale();
+ ~GLEAxisQuantileScale();
+ inline double getLowerQuantile() { return m_QLower; }
+ inline double getUpperQuantile() { return m_QUpper; }
+ inline double getLowerQuantileFactor() { return m_QLowerFactor; }
+ inline double getUpperQuantileFactor() { return m_QUpperFactor; }
+ inline void setLowerQuantile(double v) { m_QLower = v; }
+ inline void setUpperQuantile(double v) { m_QUpper = v; }
+ inline void setLowerQuantileFactor(double v) { m_QLowerFactor = v; }
+ inline void setUpperQuantileFactor(double v) { m_QUpperFactor = v; }
+};
+
+class GLEAxis {
+public:
+ int type; /* 1=xaxis 2=yaxis 3=x2axis 4=y2axis */
+ double base;
+ double length;
+ double shift;
+ int label_font;
+ double label_hei;
+ double label_scale;
+ double label_dist;
+ int label_align;
+ bool log;
+ int lgset;
+ int nofirst,nolast;
+ int nticks,nsubticks;
+ bool has_ftick, has_offset, ticks_both;
+ double ftick, dticks, dsubticks, offset;
+ double ticks_length,ticks_scale,ticks_lwidth;
+ char ticks_lstyle[9];
+ double subticks_length,subticks_scale,subticks_lwidth;
+ char subticks_lstyle[9],label_lstyle[9];
+ int off;
+ int label_off;
+ int side_off,ticks_off,subticks_off;
+ bool has_subticks_onoff, has_label_onoff;
+ double side_lwidth,label_lwidth;
+ char side_lstyle[9];
+ int title_font;
+ double title_dist, title_adist;
+ double title_hei, title_scale;
+ int title_rot,title_off;
+ GLERC<GLEColor> title_color; /* 0=normal, 1=rotate 180 */
+ GLERC<GLEColor> ticks_color;
+ GLERC<GLEColor> side_color;
+ GLERC<GLEColor> subticks_color;
+ GLERC<GLEColor> label_color;
+ int names_ds;
+ double label_angle;
+ bool grid, gridtop;
+ bool alignBase;
+ bool roundRange;
+ string title;
+ vector<string> names;
+ vector<double> places;
+ vector<double> noticks1;
+ vector<double> noticks2;
+ vector<double> noplaces;
+ int negate;
+ string format;
+ GLERangeSet m_Range;
+ GLERangeSet m_DataRange;
+ vector<GLEDataSetDimension*> m_Dims;
+ GLERC<GLEAxisQuantileScale> m_QuantileScale;
+public:
+ GLEAxis();
+ ~GLEAxis();
+ void init(int i);
+ string* getNamePtr(int i);
+ void setName(int i, const std::string& name);
+ void setPlace(int i, double place);
+ void clearNoTicks();
+ void addNoTick(double pos);
+ void insertNoTick(double pos);
+ void insertNoTickOrLabel(double pos);
+ void insertNoTick(double pos, vector<double>& vec);
+ void printNoTicks();
+ void getLabelsFromDataSet(int ds);
+ int getNbNamedPlaces();
+ bool isNoPlaceLogOrReg(double pos, int* place_cnt, double delta);
+ void initRange();
+ void performRoundRange(GLERange* range, bool extend, bool tozero);
+ void roundDataRange(bool extend, bool tozero);
+ void makeUpRange(GLEAxis* copy, GLEAxis* orth, bool extend, bool tozero);
+ void setColor(const GLERC<GLEColor>& color);
+ inline bool isPlace(double pos, int* cnt, double delta) { return axis_is_pos(pos, cnt, delta, places); }
+ inline bool isPlaceRel(double pos, int* cnt) { return axis_is_pos_perc(pos, cnt, 1e-6, places); }
+ inline bool isNoPlace(double pos, int* cnt, double delta) { return axis_is_pos(pos, cnt, delta, noplaces); }
+ inline bool isNoTick1(double pos, int* cnt, double delta) { return axis_is_pos(pos, cnt, delta, noticks1); }
+ inline bool isNoTick2(double pos, int* cnt, double delta) { return axis_is_pos(pos, cnt, delta, noticks2); }
+ inline bool isPlacePerc(double pos, int* cnt) { return axis_is_pos_perc(pos, cnt, 0.001, places); }
+ inline bool isNoPlacePerc(double pos, int* cnt) { return axis_is_pos_perc(pos, cnt, 0.001, noplaces); }
+ inline bool isNoTick1Perc(double pos, int* cnt) { return axis_is_pos_perc(pos, cnt, 0.001, noticks1); }
+ inline bool isNoTick2Perc(double pos, int* cnt) { return axis_is_pos_perc(pos, cnt, 0.001, noticks2); }
+ inline double getPlace(unsigned int i) { return places[i]; }
+ inline void addName(const char* name) { names.push_back(string(name)); }
+ inline void addPlace(double place) { places.push_back(place); }
+ inline void addNoTick1(double pos) { noticks1.push_back(pos); }
+ inline void addNoTick2(double pos) { noticks2.push_back(pos); }
+ inline void addNoPlace(double pos) { noplaces.push_back(pos); }
+ inline void insertNoTick1(double pos) { insertNoTick(pos, noticks1); }
+ inline void insertNoTick2(double pos) { insertNoTick(pos, noticks2); }
+ inline void insertNoPlace(double pos) { insertNoTick(pos, noplaces); }
+ inline bool hasPlaces() { return places.size() != 0; }
+ inline bool hasNames() { return names.size() != 0; }
+ inline int getNbPlaces() { return places.size(); }
+ inline int getNbNames() { return names.size(); }
+ inline void setNamesDataSet(int i) { names_ds = i; }
+ inline int getNamesDataSet() { return names_ds; }
+ inline double getLabelAngle() { return label_angle; }
+ inline void setLabelAngle(double angle) { label_angle = angle; }
+ inline bool hasGrid() { return grid; }
+ inline void setGrid(bool gr) { grid = gr; }
+ inline bool hasGridOnTop() { return gridtop; }
+ inline void setGridOnTop(bool ontop) { gridtop = ontop; }
+ inline void setAlignBase(bool align) { alignBase = align; }
+ inline bool isAlignBase() { return alignBase; }
+ inline GLERangeSet* getRange() { return &m_Range; }
+ inline double getMin() { return m_Range.getMin(); }
+ inline double getMax() { return m_Range.getMax(); }
+ inline GLERange* getDataRange() { return &m_DataRange; }
+ inline int getType() { return type; }
+ inline const char* getName() { return axis_type_name(getType()); }
+ inline void removeAllDimensions() { m_Dims.clear(); }
+ inline void addDimension(GLEDataSetDimension* dim) { m_Dims.push_back(dim); }
+ inline int getNbDimensions() { return m_Dims.size(); }
+ inline GLEDataSetDimension* getDim(int i) { return m_Dims[i]; }
+ inline bool shouldPerformQuantileScale() { return !m_QuantileScale.isNull(); }
+ inline GLEAxisQuantileScale* getQuantileScale() { return m_QuantileScale.get(); }
+ inline void setQuantileScale(GLEAxisQuantileScale* scale) { m_QuantileScale = scale; }
+private:
+ double getLocalAveragePlacesDistance(int i);
+};
+
+void init_measure_by_axis(GLEAxis* ax, double ox, double oy, double llen);
+
+enum DrawAxisPart {
+ DRAW_AXIS_GRID_SUBTICKS,
+ DRAW_AXIS_GRID_TICKS,
+ DRAW_AXIS_ALL
+};
+
+void draw_axis(GLEAxis *ax, GLERectangle* box, DrawAxisPart drawPart); /* Draws the axis */
+
+#endif // GLE_HAS_AXIS_H
diff --git a/src/gle/b_tab.cpp b/src/gle/b_tab.cpp
new file mode 100644
index 0000000..d2c8f76
--- /dev/null
+++ b/src/gle/b_tab.cpp
@@ -0,0 +1,166 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#include "all.h"
+#include "justify.h"
+#include "core.h"
+#include "gprint.h"
+#include "mem_limits.h"
+#include "token.h"
+#include "cutils.h"
+
+#define BEGINDEF extern
+#include "begin.h"
+
+#define true (!false)
+#define false 0
+#define dbg if ((gle_debug & 32)>0)
+
+extern int gle_debug;
+
+void g_textfindend(const string& s, double *x, double *y);
+void tab_line(const string& line, stringstream& tab_buf, double swid, const vector<int>& delta);
+void tab_line_delta(const string& line, stringstream& tab_buf, vector<int>& delta);
+
+void begin_tab(int *pln, int *pcode, int *cp) {
+ vector<int> delta;
+ int cjust, save_fnt;
+ double zzz, save_hei, base_owidth;
+ (*pln)++;
+ string line;
+ stringstream tab_buf;
+ g_get_font(&save_fnt);
+ g_get_hei(&save_hei);
+ g_get_just(&cjust);
+ g_textfindend("o",&base_owidth,&zzz);
+ int save_pln = *pln;
+ while (begin_line_norep(pln, line)) {
+ tab_line_delta(line, tab_buf, delta);
+ }
+ *pln = save_pln;
+ while (begin_line_norep(pln, line)) {
+ tab_line(line, tab_buf, base_owidth, delta);
+ }
+ // cout << "tab buf '" << tab_buf.str() << "'" << endl;
+ g_set_font(save_fnt);
+ g_set_hei(save_hei);
+ text_block(tab_buf.str(),0.0,cjust);
+}
+
+void tab_line_delta(const string& line, stringstream& tab_buf, vector<int>& delta) {
+ string::size_type len = line.length();
+ string::size_type pos = 0, c = 0;
+ while (pos < line.length()) {
+ if (line[pos] == 9) {
+ c = (c/8)*8+8; pos++;
+ } else if (line[pos] == ' ') {
+ c++; pos++;
+ } else {
+ string::size_type savec = c;
+ while (delta.size() <= savec) {
+ delta.push_back(0);
+ }
+ int delta_cnt = 0;
+ while (pos < len && line[pos] != 9 &&
+ !(pos < len-1 && isspace(line[pos]) && isspace(line[pos+1]))) {
+ if (pos < len-1 && line[pos] == '\\') {
+ int ch = line[pos+1];
+ if (gle_isalphanum(ch)) {
+ delta_cnt++; pos++; c++;
+ while (pos < len && gle_isalphanum(line[pos])) {
+ pos++; c++;
+ delta_cnt++;
+ }
+ if (pos < len && line[pos] == '{') {
+ int old_pos = pos;
+ pos = str_skip_brackets(line, pos, '{', '}');
+ delta_cnt += pos - old_pos + 1;
+ c += pos - old_pos + 1;
+ }
+ } else {
+ if (strchr("{}_$", ch) != NULL) {
+ delta_cnt++;
+ } else {
+ delta_cnt += 2;
+ }
+ pos++; c++;
+ }
+ } else {
+ pos++; c++;
+ }
+ }
+ // cout << "delta_cnt = " << delta_cnt << endl;
+ if (delta[savec] < delta_cnt) delta[savec] = delta_cnt;
+ }
+ }
+}
+
+void tab_line(const string& line, stringstream& tab_buf, double swid, const vector<int>& delta) {
+ int len = line.length();
+ bool is_modified = false;
+ int pos = 0, c = 0, diff = 0;
+ // cout << "line = '" << line << "'" << endl;
+ while (pos < (int)line.length()) {
+ if (line[pos] == 9) {
+ c = (c/8)*8+8; pos++;
+ } else if (line[pos] == ' ') {
+ c++; pos++;
+ } else {
+ int savec = c;
+ string next_line;
+ while (pos < len && line[pos] != 9 &&
+ !(pos < len-1 && isspace(line[pos]) && isspace(line[pos+1]))) {
+ next_line += line[pos++]; c++;
+ }
+ double br,bd;
+ replace_exp(next_line);
+ // cout << "'" << next_line << "': " << savec << endl;
+ g_textfindend(next_line,&br,&bd);
+ int real_c = savec - diff;
+ tab_buf << "\\movexy{" << (swid*real_c) << "}{0}";
+ tab_buf << next_line;
+ tab_buf << "\\movexy{" << (-br-swid*real_c) << "}{0}";
+ is_modified = true;
+ diff += savec < (int)delta.size() ? delta[savec] : 0;
+ diff ++;
+ // cout << "savec = " << savec << " delta = " << delta[savec] << " diff = " << diff << endl;
+ }
+ }
+ if (!is_modified) tab_buf << "\\movexy{0}{0}";
+ tab_buf << endl;
+}
diff --git a/src/gle/b_text.cpp b/src/gle/b_text.cpp
new file mode 100644
index 0000000..fed664a
--- /dev/null
+++ b/src/gle/b_text.cpp
@@ -0,0 +1,62 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#include "all.h"
+#include "justify.h"
+#include "mem_limits.h"
+#include "token.h"
+#include "core.h"
+
+#define BEGINDEF extern
+#include "begin.h"
+
+#define dbg if ((gle_debug & 32)>0)
+extern int gle_debug;
+
+void begin_text(int *pln,int *pcode, int *cp, double width, int just) {
+ (*pln)++;
+ int cjust;
+ string text, line;
+ while (begin_line(pln, line)) {
+ text += line;
+ text += "\n";
+ }
+ g_get_just(&cjust);
+ // cout << "line = '" << text << "'" << endl;
+ text_block(text, width, cjust, just);
+}
diff --git a/src/gle/basicconf.h b/src/gle/basicconf.h
new file mode 100644
index 0000000..fba4ed0
--- /dev/null
+++ b/src/gle/basicconf.h
@@ -0,0 +1,101 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#ifndef INCLUDE_BASICCONF_H
+#define INCLUDE_BASICCONF_H
+
+#ifdef HAVE_CONFIG_H
+ #include "../config.h"
+#else
+ #include "../config_noauto.h"
+#endif
+
+#include <stdio.h>
+#if HAVE_SYS_TYPES_H
+ #include <sys/types.h>
+#endif
+#if HAVE_SYS_STAT_H
+ #include <sys/stat.h>
+#endif
+#if STDC_HEADERS
+ #include <stdlib.h>
+ #include <stddef.h>
+#else
+ #if HAVE_STDLIB_H
+ #include <stdlib.h>
+ #endif
+#endif
+#if HAVE_STRING_H
+ #if !STDC_HEADERS && HAVE_MEMORY_H
+ #include <memory.h>
+ #endif
+ #include <string.h>
+#endif
+#if HAVE_STRINGS_H
+ #include <strings.h>
+#endif
+#if HAVE_UNISTD_H
+ #include <unistd.h>
+#endif
+#include <math.h>
+
+#include <string>
+#include <vector>
+#include <iostream>
+#include <sstream>
+#include <fstream>
+#include <limits>
+
+using namespace std;
+
+#if defined(__OS2__) && defined(__EMX__)
+#define uint unsigned int
+#endif
+
+#ifdef __WIN32__
+ #define DLLEXPORT __declspec( dllexport )
+ #define DLLIMPORT __declspec( dllimport )
+#else
+ #define DLLEXPORT
+ #define DLLIMPORT
+#endif
+
+#endif
+
+#define GLE_INF numeric_limits<double>::infinity()
+#define GLE_NAN numeric_limits<double>::quiet_NaN()
diff --git a/src/gle/begin.cpp b/src/gle/begin.cpp
new file mode 100644
index 0000000..f238bf8
--- /dev/null
+++ b/src/gle/begin.cpp
@@ -0,0 +1,186 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#define BEGINDEF
+
+#include "all.h"
+#include "mem_limits.h"
+#include "gle-interface/gle-interface.h"
+#include "glearray.h"
+#include "token.h"
+#include "begin.h"
+#include "gprint.h"
+#include "cutils.h"
+#include "polish.h"
+
+void replace_exp(char* exp);
+void replace_exp(string& exp);
+
+double token_next_double(int i) throw(ParserError) {
+ char* tok = tk[i];
+ if (!is_float(tok)) {
+ stringstream err;
+ err << "floating point number expected, but found: '" << tok << "'";
+ g_throw_parser_error(err.str());
+ }
+ return atof(tok);
+}
+
+int begin_token(int **pcode,int *cp,int *pln,char *srclin,TOKENS tk,int *ntk,char *outbuff) {
+ g_set_error_line(*pln);
+ (*pcode) = gpcode[(*pln)++];
+ if ((*pcode)[1] != 5 || (*pcode)[2] == 0) {
+ (*pln)--;
+ return false;
+ }
+ strcpy(srclin,(char *) ((*pcode)+3));
+ replace_exp(srclin);
+ for (int i = 0; i < TOKEN_LENGTH; i++) {
+ strcpy(tk[i], " ");
+ }
+ token(srclin,tk,ntk,outbuff);
+ return true;
+}
+
+int begin_token(GLESourceLine& sline, char *srclin, TOKENS tk, int *ntk, char *outbuff, bool replaceExpr) {
+ g_set_error_line(sline.getGlobalLineNo());
+ strcpy(srclin, sline.getCodeCStr());
+ if (replaceExpr) {
+ replace_exp(srclin);
+ }
+ for (int i = 0; i < TOKEN_LENGTH; i++) {
+ strcpy(tk[i], " ");
+ }
+ token(srclin,tk,ntk,outbuff);
+ return true;
+}
+
+bool begin_line(int *pln, string& srclin) {
+ g_set_error_line(*pln);
+ int *pcode = gpcode[(*pln)++];
+ if (pcode[1] != 5 || pcode[2] == 0) {
+ (*pln)--;
+ return false;
+ }
+ srclin = (char *)(pcode+3);
+ replace_exp(srclin);
+ return true;
+}
+
+bool get_block_line(int pln, string& srclin) {
+ g_set_error_line(pln);
+ int *pcode = gpcode[pln];
+ if (pcode[1] != 5 || pcode[2] == 0) {
+ srclin = "";
+ return false;
+ }
+ srclin = (char *)(pcode+3);
+ replace_exp(srclin);
+ return true;
+}
+
+bool begin_line_norep(int *pln, string& srclin) {
+ int *pcode = gpcode[(*pln)++];
+ if (pcode[1] != 5 || pcode[2] == 0) {
+ (*pln)--;
+ return false;
+ }
+ srclin = (char *)(pcode+3);
+ return true;
+}
+
+void begin_init() {
+ strcpy(space_str," \0");
+ for (int i = 0; i < TOKEN_LENGTH; i++) {
+ strcpy(tk[i], " ");
+ }
+}
+
+int begin_next_line(int *pcode, int *cp) {
+ return true;
+}
+
+// replaces \expr{some_exp} by the result of evaluating some_exp
+void replace_exp(char* exp) {
+ char *ptr = str_i_str(exp, "\\EXPR{");
+ while (ptr != NULL) {
+ int depth = 0;
+ int first = ptr-exp;
+ int pos = first+6; // 6 = strlen("\\EXPR{")
+ char ch = exp[pos];
+ string to_eval = "", eval_res;
+ while (ch != 0 && (ch != '}' || depth > 0)) {
+ if (ch == '{') depth++;
+ else if (ch == '}') depth--;
+ if (ch != 0 && (ch != '}' || depth > 0)) {
+ to_eval += ch;
+ ch = exp[++pos];
+ }
+ }
+ polish_eval_string(to_eval.c_str(), &eval_res, true);
+ string at_end = exp+pos+1;
+ exp[first] = 0;
+ strcat(exp, eval_res.c_str());
+ strcat(exp, at_end.c_str());
+ ptr = str_i_str(exp, "\\EXPR{");
+ }
+}
+
+// replaces \expr{some_exp} by the result of evaluating some_exp
+void replace_exp(string& exp) {
+ int ptr = str_i_str(exp, "\\EXPR{");
+ while (ptr != -1) {
+ int depth = 0;
+ int pos = ptr+6; // 6 = strlen("\\EXPR{")
+ char ch = exp[pos];
+ int len = exp.length();
+ string to_eval = "", eval_res;
+ while (pos < len && (ch != '}' || depth > 0)) {
+ if (ch == '{') depth++;
+ else if (ch == '}') depth--;
+ if (ch != 0 && (ch != '}' || depth > 0)) {
+ to_eval += ch; pos++;
+ ch = pos < len ? exp[pos] : 0;
+ }
+ }
+ polish_eval_string(to_eval.c_str(), &eval_res, true);
+ exp.erase(ptr, pos-ptr+1);
+ exp.insert(ptr, eval_res);
+ ptr = str_i_str(exp, "\\EXPR{");
+ }
+}
diff --git a/src/gle/begin.h b/src/gle/begin.h
new file mode 100644
index 0000000..d169071
--- /dev/null
+++ b/src/gle/begin.h
@@ -0,0 +1,78 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#ifndef INCLUDE_BEGIN
+#define INCLUDE_BEGIN
+extern int **gpcode; /* gpcode is a pointer to an array of poiter to int */
+extern int *gplen; /* gpcode is a pointer to an array of int */
+extern int ngpcode;
+
+//#define TOKEN_LENGTH 500
+//#define TOKEN_WIDTH 500
+#define STRBUF_LENGTH 200
+#define SRCLIN_LENGTH 1000
+#define OUTBUFF_LENGTH 300
+#define INBUFF_LENGTH 300
+#define TKBUFF_LENGTH 9600
+
+BEGINDEF char tk[TOKEN_LENGTH][TOKEN_WIDTH];
+BEGINDEF char strbuf[STRBUF_LENGTH];
+BEGINDEF char srclin[SRCLIN_LENGTH];
+BEGINDEF char outbuff[OUTBUFF_LENGTH];
+BEGINDEF char inbuff[OUTBUFF_LENGTH];
+BEGINDEF char tkbuff[TKBUFF_LENGTH];
+BEGINDEF char space_str[3];
+BEGINDEF int ntk;
+
+class GLESourceLine;
+
+int begin_token(GLESourceLine& sline, char *srclin, TOKENS tk, int *ntk, char *outbuff, bool replaceExpr);
+int begin_token(int **pcode,int *cp,int *pln,char *srclin,TOKENS tk,int *ntk,char *outbuff);
+void begin_init(void);
+int begin_next_line(int *pcode, int *cp);
+bool begin_line(int *pln, char *srclin, int *len);
+bool begin_line(int *pln, string& srclin);
+bool begin_line_norep(int *pln, string& srclin);
+
+void replace_exp(string& exp);
+
+double token_next_double(int i) throw(ParserError);
+
+bool get_block_line(int pln, string& srclin);
+
+#endif
diff --git a/src/gle/bitmap/Makefile.gcc b/src/gle/bitmap/Makefile.gcc
new file mode 100644
index 0000000..819e559
--- /dev/null
+++ b/src/gle/bitmap/Makefile.gcc
@@ -0,0 +1,55 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+#
+# makefile.gcc for GLE v4.0
+# for compilation with gcc
+#
+#
+include ../../../config.i
+include ../../../config.gcc
+#
+include files.txt
+
+all: $(OBJECTS)
+
+$(OBJECTS): $(INCLUDES)
+
+clean:
+ -$(RM) $(OBJECTS)
+
diff --git a/src/gle/bitmap/Makefile.in b/src/gle/bitmap/Makefile.in
new file mode 100644
index 0000000..9d38c05
--- /dev/null
+++ b/src/gle/bitmap/Makefile.in
@@ -0,0 +1,63 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+#
+# makefile.gcc for GLE v4.0
+# for compilation with gcc
+#
+
+include ../../../config.i
+include ../../../config.aconf
+
+include files.txt
+
+CXX=@CXX@
+CPPFLAGS=@LIBGLE_CPPFLAGS@@CPPFLAGS@
+
+CPPFLAGS := $(strip $(CPPFLAGS))
+
+LDFLAGS=@LDFLAGS@
+LIBS=@LIBS@
+
+all: $(OBJECTS)
+
+$(OBJECTS): %.o: %.cpp $(INCLUDES)
+ $(CXX) $(CPPFLAGS) -c $< -o $@
+
+clean:
+ -$(RM) $(OBJECTS)
diff --git a/src/gle/bitmap/Makefile.os2 b/src/gle/bitmap/Makefile.os2
new file mode 100644
index 0000000..01782fd
--- /dev/null
+++ b/src/gle/bitmap/Makefile.os2
@@ -0,0 +1,55 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+#
+# makefile.gcc for GLE v4.0
+# for compilation with gcc
+#
+#
+include ../../../config.i
+include ../../../config.os2
+#
+include files.txt
+
+all: $(OBJECTS)
+
+$(OBJECTS): $(INCLUDES)
+
+clean:
+ -$(RM) $(OBJECTS)
+
diff --git a/src/gle/bitmap/Makefile.vc b/src/gle/bitmap/Makefile.vc
new file mode 100644
index 0000000..58dd502
--- /dev/null
+++ b/src/gle/bitmap/Makefile.vc
@@ -0,0 +1,53 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+#
+# makefile.vc for GLE v4.0
+# for compilation with MS vc++ .net
+#
+#
+!include ..\..\..\config.vc
+#
+!include files.txt
+
+all: $(OBJECTS)
+
+$(OBJECTS): $(INCLUDES)
+
+clean:
+ -erase $(OBJECTS)
diff --git a/src/gle/bitmap/ascii85.cpp b/src/gle/bitmap/ascii85.cpp
new file mode 100644
index 0000000..a34b45e
--- /dev/null
+++ b/src/gle/bitmap/ascii85.cpp
@@ -0,0 +1,123 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+/*
+ * 2004 Jan Struyf
+ *
+ * ASCII85 Encoding Support.
+ *
+ */
+
+#include "../basicconf.h"
+#include "../file_io.h"
+#include "img2ps.h"
+
+#define PS_MAXLINE 36
+
+static char* Ascii85Encode(unsigned char* raw) {
+ static char encoded[6];
+ unsigned int word = (((raw[0]<<8)+raw[1])<<16) + (raw[2]<<8) + raw[3];
+ if (word != 0L) {
+ unsigned int q;
+ unsigned int w1;
+
+ q = word / (85L*85*85*85); /* actually only a byte */
+ encoded[0] = q + '!';
+
+ word -= q * (85L*85*85*85); q = word / (85L*85*85);
+ encoded[1] = q + '!';
+
+ word -= q * (85L*85*85); q = word / (85*85);
+ encoded[2] = q + '!';
+
+ w1 = (unsigned int) ((word - q*(85L*85)) & 0xFFFF);
+ encoded[3] = (w1 / 85) + '!';
+ encoded[4] = (w1 % 85) + '!';
+ encoded[5] = '\0';
+ } else {
+ encoded[0] = 'z', encoded[1] = '\0';
+ }
+ return encoded;
+}
+
+GLEASCII85ByteStream::GLEASCII85ByteStream(ostream* file) {
+ m_File = file;
+ m_BreakLength = 2*PS_MAXLINE;
+ m_Count = 0;
+}
+
+int GLEASCII85ByteStream::sendByte(unsigned char code) {
+ m_Buffer[m_Count++] = code;
+ if (m_Count >= 4) {
+ int n;
+ unsigned char* p;
+ for (n = m_Count, p = m_Buffer; n >= 4; n -= 4, p += 4) {
+ char* cp;
+ for (cp = Ascii85Encode(p); *cp; cp++) {
+ m_File->put(*cp);
+ if (--m_BreakLength == 0) {
+ m_File->put('\n');
+ m_BreakLength = 2*PS_MAXLINE;
+ }
+ }
+ }
+ for (int i = 0; i < n; i++) {
+ m_Buffer[i] = p[i];
+ }
+ m_Count = n;
+ }
+ return GLE_IMAGE_ERROR_NONE;
+}
+
+int GLEASCII85ByteStream::term() {
+ if (!isTerminated()) {
+ if (m_Count > 0) {
+ char* res;
+ for (int i = 0; i < 3; i++) {
+ m_Buffer[m_Count+i] = 0;
+ }
+ res = Ascii85Encode(m_Buffer);
+ m_File->write(res[0] == 'z' ? "!!!!" : res, m_Count + 1);
+ }
+ *m_File << "~>" << endl;
+ }
+ return GLEByteStream::term();
+}
+
+GLEASCII85ByteStream::~GLEASCII85ByteStream() {
+}
diff --git a/src/gle/bitmap/files.txt b/src/gle/bitmap/files.txt
new file mode 100644
index 0000000..c0a6969
--- /dev/null
+++ b/src/gle/bitmap/files.txt
@@ -0,0 +1,55 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+#
+# files list for GLE to be included by the makefiles
+#
+
+INCLUDES = \
+img2ps.h \
+lzwencode.h \
+glegif.h
+
+OBJECTS = \
+img2ps.$(OBJ_SUFF) \
+lzwencode.$(OBJ_SUFF) \
+glegif.$(OBJ_SUFF) \
+glejpeg.$(OBJ_SUFF) \
+gletiff.$(OBJ_SUFF) \
+glepng.$(OBJ_SUFF) \
+ascii85.$(OBJ_SUFF)
diff --git a/src/gle/bitmap/glegif.cpp b/src/gle/bitmap/glegif.cpp
new file mode 100644
index 0000000..54bd950
--- /dev/null
+++ b/src/gle/bitmap/glegif.cpp
@@ -0,0 +1,342 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+/*
+ * 2004 Jan Struyf
+ *
+ */
+
+#include "../basicconf.h"
+#include "../file_io.h"
+#include "img2ps.h"
+#include "glegif.h"
+
+/*
+ * GIF
+ */
+
+GLEGIF::GLEGIF () : GLEFileBitmap() {
+ m_ImageOffs = 0;
+}
+
+GLEGIF::~GLEGIF () {
+}
+
+int GLEGIF::readHeader() {
+ GIFHEADER hdr;
+ if (hdr.get(m_file.getFile())) {
+ return GLE_IMAGE_ERROR_INTERN;
+ }
+ if (! hdr.isvalid()) {
+ return GLE_IMAGE_ERROR_TYPE;
+ }
+ GIFSCDESC scd;
+ if (scd.get(this)) {
+ return GLE_IMAGE_ERROR_INTERN;
+ }
+ rgb* pal = allocPalette(256);
+ if (scd.isgct()) {
+ // Skip global color table - should remember position?
+ m_Colors = scd.ncolors();
+ for (int i = 0; i < m_Colors; i++) {
+ pal[i].red = m_file.fgetc();
+ pal[i].green = m_file.fgetc();
+ pal[i].blue = m_file.fgetc();
+ }
+ }
+ int type;
+ while ((type = m_file.fgetc()) > 0) {
+ // printf("GIF Block Ox%X\n", type);
+ if (type == 0x2C) {
+ // image descriptor
+ headerImage();
+ break;
+ } else if (type == 0x21) {
+ // extension
+ headerExtension();
+ } else if (type == 0x3B) {
+ // trailer
+ return GLE_IMAGE_ERROR_DATA;
+ } else {
+ return GLE_IMAGE_ERROR_DATA;
+ }
+ }
+ return GLE_IMAGE_ERROR_NONE;
+}
+
+int GLEGIF::headerImage() {
+ GIFIMDESC imd;
+ if (imd.get(this) == 0) {
+ return GLE_IMAGE_ERROR_DATA;
+ }
+ if (imd.islct()) {
+ rgb* pal = getPalette();
+ m_Colors = imd.ncolors();
+ for (int i = 0; i < m_Colors; i++) {
+ pal[i].red = m_file.fgetc();
+ pal[i].green = m_file.fgetc();
+ pal[i].blue = m_file.fgetc();
+ }
+ }
+ m_ImageOffs = ftell(m_file.getFile());
+ updateImageType();
+ m_Width = imd.getWidth();
+ m_Height = imd.getHeight();
+ return GLE_IMAGE_ERROR_NONE;
+}
+
+void GLEGIF::updateImageType() {
+ if (getNbColors() == 0) {
+ setMode(GLE_BITMAP_GRAYSCALE);
+ } else {
+ setMode(GLE_BITMAP_INDEXED);
+ setBitsPerComponent(getMaxBits());
+ checkGrayScalePalette();
+ }
+}
+
+int GLEGIF::headerExtension() {
+ int label = m_file.fgetc();
+ switch (label) {
+ case 0xFE : // comment extension
+ headerCOMExt();
+ break;
+ case 0xF9 : // control extension
+ case 0x01 : // text extension
+ case 0xFF : // application extension
+ skipBlocks();
+ break;
+ default : // unknown or invalid
+ return 0;
+ }
+ return 1;
+}
+
+void GLEGIF::skipBlocks() {
+ int nbytes;
+ while ((nbytes = m_file.fgetc()) > 0) {
+ fseek(m_file.getFile(), nbytes, SEEK_CUR);
+ }
+}
+
+void GLEGIF::headerCOMExt() {
+ skipBlocks();
+/* int nbytes;
+ while ((nbytes = fgetc(m_In)) > 0) {
+ char* comment = new char[nbytes+1];
+ fread(comment, nbytes, 1, m_In);
+ comment[nbytes] = 0;
+ printf("Comment: '%s'\n", comment);
+ delete comment;
+ }*/
+}
+
+int GLEGIF::decode(GLEByteStream* out) {
+ fseek(m_file.getFile(), m_ImageOffs, SEEK_SET);
+ GLEGIFDecoder decoder(this, out);
+ int result = decoder.decode(m_file.getFile());
+ return result;
+}
+
+int GIFHEADER::get(FILE *f) {
+ return (fread(sig, 6, 1, f) == 1) ? 0 : -1;
+}
+
+int GIFHEADER::isvalid(void) {
+ if (strncmp( sig, "GIF", 3 ) != 0 ) {
+ return 0;
+ }
+ if ((strncmp( ver, "87a", 3 ) != 0) && (strncmp( ver, "89a", 3 ) != 0)) {
+ return 0;
+ }
+ return 1;
+}
+
+GIFSCDESC::GIFSCDESC() {
+ scwidth = scheight = 0;
+ flags = bgclr = pixasp = 0;
+}
+
+int GIFSCDESC::get(GLEGIF *gif) {
+ scwidth = gif->read16LE();
+ scheight = gif->read16LE();
+ flags = gif->read8();
+ bgclr = gif->read8();
+ pixasp = gif->read8();
+ return 0;
+}
+
+int GIFIMDESC::ncolors() {
+ if (islct()) {
+ return 1 << ((flags & imdLCTSIZE) + 1);
+ } else {
+ return 0;
+ }
+}
+
+int GIFIMDESC::get(GLEGIF* gif) {
+ xleft = gif->read16LE(); // x origin
+ ytop = gif->read16LE(); // y origin
+ imwidth = gif->read16LE(); // image width
+ imheight = gif->read16LE(); // image height
+ flags = gif->read8(); // various flags
+ return 1;
+}
+
+GLEGIFDecoder::GLEGIFDecoder(GLEGIF* gif, GLEByteStream* out) {
+ m_Gif = gif;
+ m_Output = out;
+ m_First = new GLEDWORD[LZW_MAXVAL];
+ m_Last = new GLEBYTE[LZW_MAXVAL];
+ m_Buffer = new GLEBYTE[LZW_MAXVAL];
+ m_ScanLine = new GLEBYTE[gif->getWidth()];
+}
+
+GLEGIFDecoder::~GLEGIFDecoder() {
+ delete[] m_First;
+ delete[] m_Last;
+ delete[] m_Buffer;
+ delete[] m_ScanLine;
+}
+
+void GLEGIFDecoder::clearTable() {
+ int maxi = 1 << m_RootCodeSize;
+ m_Expected = maxi + 2;
+ m_Old = LZW_MAXVAL;
+ m_CodeSize = m_RootCodeSize + 1;
+ m_Mask = (1 << m_CodeSize) - 1;
+ for (int i = 0; i < maxi; i++) {
+ m_First[i] = LZW_MAXVAL;
+ m_Last[i] = i & 0xFF;
+ }
+ m_TopBuffer = m_Buffer;
+}
+
+int GLEGIFDecoder::deInterlace(int nrows) {
+ static int gif_delta[] = { 8, 8, 4, 2 };
+ static int gif_origin[] = { 0, 4, 2, 1 };
+ m_CrLine += gif_delta[m_CrPass];
+ if (m_CrLine >= nrows) {
+ m_CrPass++;
+ m_CrLine = gif_origin[m_CrPass];
+ }
+ return m_CrLine;
+}
+
+void GLEGIFDecoder::storeBytes(int bytes, GLEBYTE* source) {
+ int wd = (int)m_Gif->getWidth();
+ int i = bytes - 1;
+ while (i >= 0) {
+ int j = i-wd+m_CrPos+1;
+ if (j < 0) j = 0;
+ while (i >= j) m_ScanLine[m_CrPos++] = source[i--];
+ if (m_CrPos >= wd) {
+ m_CrPos = 0;
+ if (isInterlaced()) {
+ // reader->put(scanLine, Deinterlace(descr->gfHeight));
+ printf("HELP, can't handle interlaced gifs\n");
+ } else {
+ m_Output->send(m_ScanLine, wd);
+ m_Output->endScanLine();
+ }
+ }
+ }
+}
+
+int GLEGIFDecoder::decode(FILE* input) {
+ int need = 0;
+ GLEDWORD bits = 0, code = 0, codeFeched;
+ GLEBYTE *chPos, m_FirstCodeOut = 0, charBuff[256];
+ // Read data block header
+ m_RootCodeSize = fgetc(input);
+ GLEDWORD CLEAR = 1 << m_RootCodeSize;
+ GLEDWORD EOI = CLEAR + 1;
+ clearTable();
+ // Read image data
+ m_CrPass = m_CrPos = 0;
+ m_CrLine = isInterlaced() ? -8 : 0;
+ GLEDWORD buffCount = fgetc(input);
+ if (buffCount == 0) return GLE_IMAGE_ERROR_DATA;
+ while(buffCount > 0) {
+ if ((GLEDWORD)fread(charBuff, 1, buffCount, input) != buffCount) return GLE_IMAGE_ERROR_FILE;
+ for(chPos = charBuff; buffCount-- > 0; chPos++) {
+ need += (int) *chPos << bits;
+ bits += 8;
+ while (bits >= m_CodeSize) {
+ code = need & m_Mask;
+ need >>= m_CodeSize;
+ bits -= m_CodeSize;
+ if (code > m_Expected) return GLE_IMAGE_ERROR_DATA; // Neither LZW nor RunLength
+ if (code == EOI) return GLE_IMAGE_ERROR_NONE;
+ if (code == CLEAR) {
+ clearTable();
+ continue;
+ }
+ if (m_Old == LZW_MAXVAL) { // m_First code after clear table
+ storeBytes(1, &m_Last[code]);
+ m_FirstCodeOut = m_Last[code];
+ m_Old = code;
+ continue;
+ }
+ codeFeched = code;
+ if (code == m_Expected) {
+ *m_TopBuffer++ = m_FirstCodeOut;
+ code = m_Old;
+ }
+ while (code > CLEAR) {
+ *m_TopBuffer++ = m_Last[code];
+ code = m_First[code];
+ }
+ *m_TopBuffer++ = m_FirstCodeOut = m_Last[code];
+ m_First[m_Expected] = m_Old;
+ m_Last[m_Expected] = m_FirstCodeOut;
+ if (m_Expected < LZW_MAXVAL) m_Expected++;
+ if (((m_Expected & m_Mask) == 0) && (m_Expected < LZW_MAXVAL)) {
+ m_CodeSize++;
+ m_Mask += m_Expected;
+ }
+ m_Old = codeFeched;
+ storeBytes(m_TopBuffer - m_Buffer, m_Buffer);
+ m_TopBuffer = m_Buffer;
+ }
+ }
+ buffCount = fgetc(input);
+ if (buffCount == 0) return GLE_IMAGE_ERROR_DATA;
+ }
+ return GLE_IMAGE_ERROR_NONE;
+}
diff --git a/src/gle/bitmap/glegif.h b/src/gle/bitmap/glegif.h
new file mode 100644
index 0000000..e058560
--- /dev/null
+++ b/src/gle/bitmap/glegif.h
@@ -0,0 +1,127 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+/*
+ * 2004 Jan Struyf
+ *
+ */
+
+#ifndef INC_GIF_H
+#define INC_GIF_H
+
+class GIFHEADER {
+protected:
+ char sig[3]; // "GIF"
+ char ver[3]; // "87a" or "89a"
+public:
+ int isvalid(void);
+ int get(FILE *f);
+};
+
+#define scdGCT 0x80 // global color table
+#define scdGCTCRES 0x70 // color res : nbits-1
+#define scdGCTSORT 0x08 // sort flag
+#define scdGCTSIZE 0x07 // color cnt as 2^(sss+1)
+
+class GIFSCDESC { // Screen Descriptor
+protected:
+ unsigned short scwidth; // width in pixels
+ unsigned short scheight; // height in pixels
+ unsigned char flags; // various flags
+ unsigned char bgclr; // background color
+ unsigned char pixasp; // pixel aspect ratio
+public:
+ GIFSCDESC();
+ int get(GLEGIF *gif);
+ inline int isgct() { return (flags & scdGCT) ? 1 : 0; }
+ inline int issorted() { return (flags & scdGCTSORT) ? 1 : 0; }
+// bits per pixel
+ inline int depth() { return ((flags & scdGCTCRES) >> 4) + 1; }
+// # entries in GCT
+ inline int ncolors() { return 1 << ((flags & scdGCTSIZE) + 1); }
+};
+
+#define imdLCT 0x80 // local color table
+#define imdINTRLACE 0x40 // interlace flag
+#define imdLCTSORT 0x20 // sort flag
+#define imdRESV 0x18 // reserved
+#define imdLCTSIZE 0x07 // color cnt as 2^(sss+1)
+
+class GIFIMDESC { // Image Descriptor
+protected:
+ unsigned char id; // 0x2C
+ unsigned short xleft; // x origin
+ unsigned short ytop; // y origin
+ unsigned short imwidth; // image width
+ unsigned short imheight; // image height
+ unsigned char flags; // various flags
+public:
+ int get(GLEGIF* gif);
+ inline int islct() { return (flags & imdLCT) ? 1 : 0; }
+ inline int issorted() { return (flags & imdLCTSORT) ? 1 : 0; }
+ inline int isinterlaced() { return (flags & imdINTRLACE) ? 1 : 0; }
+ inline int getWidth() { return imwidth; }
+ inline int getHeight() { return imheight; }
+ int ncolors();
+};
+
+
+#define LZW_MAXVAL 4096
+
+
+class PGImageReader;
+
+class GLEGIFDecoder {
+public:
+ GLEGIF* m_Gif;
+ GLEByteStream* m_Output;
+ int m_CrLine, m_CrPos, m_CrPass;
+ GLEBYTE *m_Last, *m_TopBuffer, *m_Buffer, *m_ScanLine;
+ GLEDWORD *m_First, m_RootCodeSize, m_CodeSize, m_Expected, m_Mask, m_Old;
+public:
+ GLEGIFDecoder(GLEGIF* gif, GLEByteStream* out);
+ virtual ~GLEGIFDecoder();
+ void clearTable();
+ int deInterlace(int nbrows);
+ int decode(FILE* input);
+ void storeBytes(int bytes, GLEBYTE* source);
+ inline int isInterlaced() { return m_Gif->isInterlaced(); }
+ inline int getWidth() { return m_Gif->getWidth(); }
+};
+
+#endif
diff --git a/src/gle/bitmap/glejpeg.cpp b/src/gle/bitmap/glejpeg.cpp
new file mode 100644
index 0000000..1a88acb
--- /dev/null
+++ b/src/gle/bitmap/glejpeg.cpp
@@ -0,0 +1,188 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+/*
+ * 2004 Jan Struyf
+ *
+ */
+
+#include "../basicconf.h"
+#include "../file_io.h"
+#include "img2ps.h"
+
+/*
+ * JPEG
+ */
+
+#define M_SOF0 0xC0
+#define M_SOF1 0xC1
+#define M_SOF2 0xC2
+#define M_SOF3 0xC3
+#define M_SOF5 0xC5
+#define M_SOF6 0xC6
+#define M_SOF7 0xC7
+#define M_SOF9 0xC9
+#define M_SOF10 0xCA
+#define M_SOF11 0xCB
+#define M_SOF13 0xCD
+#define M_SOF14 0xCE
+#define M_SOF15 0xCF
+#define M_SOI 0xD8
+#define M_EOI 0xD9
+#define M_SOS 0xDA
+#define M_EXIF 0xE1
+#define M_COM 0xFE
+#define M_TEM 0x01
+#define M_RST0 0xD0
+#define M_RST7 0xD7
+
+GLEJPEG::GLEJPEG() : GLEFileBitmap() {
+ m_Encoding = GLE_BITMAP_JPEG;
+}
+
+GLEJPEG::~GLEJPEG() {
+}
+
+int GLEJPEG::readImageSize() {
+ m_BitsPerComponent = m_file.fgetc();
+ m_Height = read16BE();
+ m_Width = read16BE();
+ m_Components = m_file.fgetc();
+ if (m_Components == 1) {
+ setMode(GLE_BITMAP_GRAYSCALE);
+ } else {
+ setMode(GLE_BITMAP_RGB);
+ }
+ return GLE_IMAGE_ERROR_NONE;
+}
+
+
+int GLEJPEG::checkJPG() {
+ if (m_BitsPerComponent != 8) {
+ stringstream str;
+ str << "unsupported number of bits/component: " << m_BitsPerComponent << " <> 8";
+ setError(str.str());
+ return GLE_IMAGE_ERROR_DATA;
+ }
+ if (m_Components != 1 && m_Components != 3 && m_Components != 4) {
+ stringstream str;
+ str << "unsupported number of components: " << m_BitsPerComponent << " (should be 1, 3, or 4)";
+ setError(str.str());
+ return GLE_IMAGE_ERROR_DATA;
+ }
+ return GLE_IMAGE_ERROR_NONE;
+}
+
+int GLEJPEG::readHeader() {
+ char markstr[20];
+ while (!m_file.feof()) {
+ /* Skip padding at start of section */
+ int marker = 0;
+ int nbpadding = 0;
+ while (true) {
+ marker = m_file.fgetc();
+ if (m_file.feof()) {
+ setError("SOF marker not found");
+ return GLE_IMAGE_ERROR_DATA;
+ }
+ if (marker != 0xff) {
+ break;
+ } else {
+ nbpadding++;
+ }
+ }
+ if (nbpadding == 0) {
+ sprintf(markstr, "0x%X", marker);
+ setError(string("no 0xFF before marker: ") +markstr);
+ return GLE_IMAGE_ERROR_DATA;
+ }
+ /* Just before section */
+ if (marker == M_SOI || marker == M_EOI || marker == M_TEM ||
+ (marker >= M_RST0 && marker <= M_RST7)) {
+ continue;
+ }
+ /* Start of scan found */
+ if (marker == M_SOS) {
+ setError("start of scan comes before SOF marker");
+ return GLE_IMAGE_ERROR_DATA;
+ }
+ /* Read section length */
+ int crpos = m_file.ftell();
+ int size = read16BE();
+ if (size < 2) {
+ sprintf(markstr, "0x%X", marker);
+ setError(string("size error for block with marker: ") +markstr);
+ return GLE_IMAGE_ERROR_DATA;
+ }
+ /* Size info? */
+ switch (marker) {
+ case M_SOF0:
+ case M_SOF1:
+ case M_SOF2:
+ case M_SOF3:
+ case M_SOF5:
+ case M_SOF6:
+ case M_SOF7:
+ case M_SOF9:
+ case M_SOF10:
+ case M_SOF11:
+ case M_SOF13:
+ case M_SOF14:
+ case M_SOF15:
+ readImageSize();
+ return checkJPG();
+ }
+ /* Skip till after section */
+ fseek(m_file.getFile(), crpos+size, SEEK_SET);
+ }
+ setError("SOF marker not found");
+ return GLE_IMAGE_ERROR_DATA;
+}
+
+int GLEJPEG::coded(GLEByteStream* output) {
+ fseek(m_file.getFile(), 0, SEEK_SET);
+ while (true) {
+ int nextByte = m_file.fgetc();
+ if (nextByte == EOF) {
+ break;
+ } else {
+ output->sendByte((GLEBYTE)nextByte);
+ }
+ }
+ return GLE_IMAGE_ERROR_NONE;
+}
diff --git a/src/gle/bitmap/glepng.cpp b/src/gle/bitmap/glepng.cpp
new file mode 100644
index 0000000..d74be84
--- /dev/null
+++ b/src/gle/bitmap/glepng.cpp
@@ -0,0 +1,152 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+/*
+ * 2004 Jan Struyf
+ *
+ */
+
+#include "../basicconf.h"
+#include "../file_io.h"
+#include "img2ps.h"
+
+#ifdef HAVE_LIBPNG
+
+#include <png.h>
+
+
+GLEPNG::GLEPNG() {
+ m_PNGPtr = NULL;
+ m_InfoPtr = NULL;
+ m_EndInfo = NULL;
+}
+
+GLEPNG::~GLEPNG() {
+ png_destroy_read_struct(&m_PNGPtr, &m_InfoPtr, &m_EndInfo);
+}
+
+#define GLEPNG_SIG_SIZE 8
+
+int GLEPNG::readHeader() {
+ GLEBYTE sig[GLEPNG_SIG_SIZE];
+ m_file.fread(sig, 1, GLEPNG_SIG_SIZE);
+ if (png_sig_cmp(sig, 0, GLEPNG_SIG_SIZE)) {
+ setError("invalid PNG file");
+ return GLE_IMAGE_ERROR_TYPE;
+ }
+ m_PNGPtr = png_create_read_struct(PNG_LIBPNG_VER_STRING, (png_voidp)NULL, NULL, NULL);
+ if (!m_PNGPtr) {
+ return GLE_IMAGE_ERROR_INTERN;
+ }
+ m_InfoPtr = png_create_info_struct(m_PNGPtr);
+ if (!m_InfoPtr) {
+ png_destroy_read_struct(&m_PNGPtr, (png_infopp)NULL, (png_infopp)NULL);
+ return GLE_IMAGE_ERROR_INTERN;
+ }
+ m_EndInfo = png_create_info_struct(m_PNGPtr);
+ if (!m_EndInfo) {
+ png_destroy_read_struct(&m_PNGPtr, &m_InfoPtr, (png_infopp)NULL);
+ return GLE_IMAGE_ERROR_INTERN;
+ }
+ png_init_io(m_PNGPtr, m_file.getFile());
+ png_set_sig_bytes(m_PNGPtr, GLEPNG_SIG_SIZE);
+ png_read_info(m_PNGPtr, m_InfoPtr);
+ // Get most important parts from header
+ m_Width = png_get_image_width(m_PNGPtr, m_InfoPtr);
+ m_Height = png_get_image_height(m_PNGPtr, m_InfoPtr);
+ m_BitsPerComponent = png_get_bit_depth(m_PNGPtr, m_InfoPtr);
+ // Check if interlaced
+ int interlace_type = png_get_interlace_type(m_PNGPtr, m_InfoPtr);
+ if (interlace_type != PNG_INTERLACE_NONE) {
+ setError("interlaced PNGs not yet supported");
+ return GLE_IMAGE_ERROR_DATA;
+ }
+ return GLE_IMAGE_ERROR_NONE;
+}
+
+int GLEPNG::prepare(int mode) {
+ int color_type = png_get_color_type(m_PNGPtr, m_InfoPtr);
+ if (color_type == PNG_COLOR_TYPE_PALETTE) {
+ /* Palette image */
+ int num_palette;
+ png_colorp palette;
+ png_get_PLTE(m_PNGPtr, m_InfoPtr, &palette, &num_palette);
+ rgb* pal = allocPalette(num_palette);
+ for (int i = 0; i < num_palette; i++) {
+ pal[i].red = palette[i].red;
+ pal[i].green = palette[i].green;
+ pal[i].blue = palette[i].blue;
+ }
+ setNbColors(num_palette);
+ setMode(GLE_BITMAP_INDEXED);
+ setComponents(1);
+ if (m_BitsPerComponent < 8) {
+ png_set_packing(m_PNGPtr);
+ }
+ checkGrayScalePalette();
+ } else if (color_type == PNG_COLOR_TYPE_GRAY || color_type == PNG_COLOR_TYPE_GRAY_ALPHA) {
+ /* Grayscale image */
+ setMode(GLE_BITMAP_GRAYSCALE);
+ setComponents(1);
+ } else {
+ /* RGB image */
+ setMode(GLE_BITMAP_RGB);
+ setComponents(3);
+ }
+ if (color_type & PNG_COLOR_MASK_ALPHA) {
+ setAlpha(true);
+ setComponents(getComponents() + 1);
+ setExtraComponents(1);
+ }
+ return GLE_IMAGE_ERROR_NONE;
+}
+
+int GLEPNG::decode(GLEByteStream* output) {
+ int size = getScanlineSize();
+ GLEBYTE* scanline = new GLEBYTE[size];
+ for (int i = 0; i < getHeight(); i++) {
+ png_read_row(m_PNGPtr, scanline, NULL);
+ output->send(scanline, size);
+ output->endScanLine();
+ }
+ delete[] scanline;
+ png_read_end(m_PNGPtr, m_EndInfo);
+ return GLE_IMAGE_ERROR_NONE;
+}
+
+#endif
diff --git a/src/gle/bitmap/gletiff.cpp b/src/gle/bitmap/gletiff.cpp
new file mode 100644
index 0000000..f6a8890
--- /dev/null
+++ b/src/gle/bitmap/gletiff.cpp
@@ -0,0 +1,213 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+/*
+ * 2004 Jan Struyf
+ *
+ */
+
+#include "../basicconf.h"
+#include "../file_io.h"
+
+#ifdef HAVE_LIBTIFF
+
+#include "tiffio.h"
+#include "img2ps.h"
+
+/*
+ * TIFF
+ */
+
+GLETIFF::GLETIFF() : GLEBitmap() {
+}
+
+GLETIFF::~GLETIFF() {
+}
+
+int GLETIFF::open(const string& fname) {
+ m_fname = fname;
+ /* leave as "r" for WINDOWS VL */
+ m_Tiff = TIFFOpen(fname.c_str(), "r");
+ if (m_Tiff == NULL) {
+ return 0;
+ }
+ return 1;
+}
+
+int GLETIFF::readHeader() {
+ uint16 samplesperpixel, bitspersample, planarconfiguration;
+ uint16 photometric, extrasamples, *sampleinfo;
+ /* Get fields */
+ TIFFGetField(m_Tiff, TIFFTAG_IMAGEWIDTH, &m_Width);
+ TIFFGetField(m_Tiff, TIFFTAG_IMAGELENGTH, &m_Height);
+ TIFFGetFieldDefaulted(m_Tiff, TIFFTAG_BITSPERSAMPLE, &bitspersample);
+ TIFFGetFieldDefaulted(m_Tiff, TIFFTAG_SAMPLESPERPIXEL, &samplesperpixel);
+ TIFFGetFieldDefaulted(m_Tiff, TIFFTAG_PLANARCONFIG, &planarconfiguration);
+ TIFFGetField(m_Tiff, TIFFTAG_COMPRESSION, &m_TIFFCompress);
+ TIFFGetFieldDefaulted(m_Tiff, TIFFTAG_EXTRASAMPLES, &extrasamples, &sampleinfo);
+ /* Set fields */
+ setComponents(samplesperpixel);
+ setBitsPerComponent(bitspersample);
+ /* Detect alpha channel */
+ if (extrasamples == 1) {
+ if (sampleinfo[0] == EXTRASAMPLE_ASSOCALPHA || sampleinfo[0] == EXTRASAMPLE_UNSPECIFIED) {
+ setAlpha(1);
+ }
+ setExtraComponents(1);
+ } else if (extrasamples != 0) {
+ printf("\nTIFF: Unsupported number of extra samples: %d\n", extrasamples);
+ }
+ /* Detect photometric */
+ if (!TIFFGetField(m_Tiff, TIFFTAG_PHOTOMETRIC, &photometric)) {
+ switch (samplesperpixel - extrasamples) {
+ case 1:
+ if (isCCITTCompression()) photometric = PHOTOMETRIC_MINISWHITE;
+ else photometric = PHOTOMETRIC_MINISBLACK;
+ break;
+ case 3:
+ photometric = PHOTOMETRIC_RGB;
+ break;
+ }
+ }
+ /* Detect mode based on photometric */
+ switch (photometric) {
+ case PHOTOMETRIC_MINISWHITE:
+ case PHOTOMETRIC_MINISBLACK:
+ /* Should invert if MINISWHITE? */
+ setMode(GLE_BITMAP_GRAYSCALE);
+ break;
+ case PHOTOMETRIC_RGB:
+ setMode(GLE_BITMAP_RGB);
+ break;
+ case PHOTOMETRIC_PALETTE:
+ setMode(GLE_BITMAP_INDEXED);
+ setNbColors(1 << bitspersample);
+ break;
+/*
+ case PHOTOMETRIC_MASK:
+ case PHOTOMETRIC_SEPARATED:
+ case PHOTOMETRIC_YCBCR:
+ case PHOTOMETRIC_CIELAB:
+ case PHOTOMETRIC_ICCLAB:
+ case PHOTOMETRIC_ITULAB:
+ case PHOTOMETRIC_LOGL:
+ case PHOTOMETRIC_LOGLUV:
+*/
+ default:
+ printf("\nTIFF: Unsupported photometric: %d\n", photometric);
+ return GLE_IMAGE_ERROR_NOT_IMPL;
+ }
+ /* Determine organization */
+ int tiled_image = TIFFIsTiled(m_Tiff);
+ if (tiled_image) {
+ printf("\nTIFF: Tiled images not yet supported\n");
+ return GLE_IMAGE_ERROR_NOT_IMPL;
+ }
+ /* Determine planar configuration */
+ if (planarconfiguration != PLANARCONFIG_CONTIG) {
+ printf("\nTIFF: Only planar images supported\n");
+ return GLE_IMAGE_ERROR_NOT_IMPL;
+ }
+ return GLE_IMAGE_ERROR_NONE;
+}
+
+int GLETIFF::prepare(int mode) {
+ /* Load palette */
+ if (isIndexed()) {
+ uint16 *rmap, *gmap, *bmap;
+ if (!TIFFGetField(m_Tiff, TIFFTAG_COLORMAP, &rmap, &gmap, &bmap)) {
+ printf("\nTIFF: Indexed image without palette\n");
+ return GLE_IMAGE_ERROR_DATA;
+ }
+ /* Check if palette is 8 or 16 bit */
+ int is8bit = 1;
+ for (int i = 0; i < getNbColors(); i++) {
+ if (rmap[i] >= 256 || gmap[i] >= 256 || bmap[i] >= 256) {
+ is8bit = 0;
+ }
+ }
+ /* Convert palette */
+ rgb* pal = allocPalette(getNbColors());
+ for (int i = 0; i < getNbColors(); i++) {
+ if (is8bit == 1) {
+ pal[i].red = rmap[i];
+ pal[i].green = gmap[i];
+ pal[i].blue = bmap[i];
+ } else {
+ pal[i].red = CVT16TO8(rmap[i]);
+ pal[i].green = CVT16TO8(gmap[i]);
+ pal[i].blue = CVT16TO8(bmap[i]);
+ }
+ }
+ }
+ return GLE_IMAGE_ERROR_NONE;
+}
+
+int GLETIFF::decode(GLEByteStream* output) {
+ int size = TIFFScanlineSize(m_Tiff);
+ GLEBYTE* scanline = (GLEBYTE*)_TIFFmalloc(size);
+ for (int i = 0; i < getHeight(); i++) {
+ TIFFReadScanline(m_Tiff, scanline, i);
+ output->send(scanline, size);
+ output->endScanLine();
+ }
+ _TIFFfree(scanline);
+ return GLE_IMAGE_ERROR_NONE;
+}
+
+void GLETIFF::close() {
+ if (m_Tiff != NULL) {
+ TIFFClose(m_Tiff);
+ m_Tiff = NULL;
+ }
+}
+
+int GLETIFF::isCCITTCompression() {
+ return (m_TIFFCompress == COMPRESSION_CCITTFAX3 ||
+ m_TIFFCompress == COMPRESSION_CCITTFAX4 ||
+ m_TIFFCompress == COMPRESSION_CCITTRLE ||
+ m_TIFFCompress == COMPRESSION_CCITTRLEW);
+}
+
+string GLETIFF::getFName()
+{
+ return m_fname;
+}
+
+#endif
+
diff --git a/src/gle/bitmap/img2ps.cpp b/src/gle/bitmap/img2ps.cpp
new file mode 100644
index 0000000..52c83de
--- /dev/null
+++ b/src/gle/bitmap/img2ps.cpp
@@ -0,0 +1,690 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+/*
+ * 2004 Jan Struyf
+ *
+ */
+
+#include "../basicconf.h"
+#include "../gprint.h"
+#include "../file_io.h"
+#include "../cutils.h"
+#include "img2ps.h"
+
+GLEBitmap::GLEBitmap() {
+ m_Height = 0;
+ m_Width = 0;
+ m_Mode = GLE_BITMAP_NONE;
+ m_Components = 1;
+ m_ExtraComponents = 0;
+ m_Colors = 0;
+ m_Interlaced = 0;
+ m_Palette = NULL;
+ m_ASCII85 = 0;
+ m_Compress = 0;
+ m_Alpha = 0;
+ m_Encoding = GLE_BITMAP_LZW;
+ m_BitsPerComponent = 8;
+}
+
+GLEBitmap::~GLEBitmap() {
+ close();
+ if (m_Palette != NULL) {
+ delete[] m_Palette;
+ }
+}
+
+int GLEBitmap::open(const string& fname) {
+ return 0;
+}
+
+int GLEBitmap::readHeader() {
+ return 0;
+}
+
+int GLEBitmap::toPS(ostream* fp) {
+ // Init image, set transformations, possibly load palette
+ prepare(GLE_BITMAP_PREPARE_SCANLINE);
+ // Variables
+ const char* coder = "/ASCII85Decode filter";
+ const char* encoder;
+ int width = m_Width;
+ int height = m_Height;
+ int colors = getNbColors();
+ int bits = getBitsPerComponent();
+ if (getEncoding() == GLE_BITMAP_LZW) {
+ encoder = "/LZWDecode";
+ } else {
+ encoder = "/DCTDecode";
+ }
+ *fp << "save 9 dict begin" << endl;
+ *fp << "{/T currentfile" << coder << " def" << endl;
+ if (isIndexed()) {
+ *fp << "[/Indexed/DeviceRGB " << (colors-1) << " T " << (colors*3) << " string readstring pop]";
+ } else if (isGrayScale()) {
+ *fp << "/DeviceGray";
+ } else {
+ *fp << "/DeviceRGB";
+ }
+ *fp << " setcolorspace" << endl;
+ *fp << "/F T" << encoder << " filter def" << endl;
+ *fp << "<</ImageType 1/Width " << width << "/Height " << height << "/BitsPerComponent " << bits << endl;
+ *fp << "/ImageMatrix[" << width << " 0 0 -" << height << " 0 " << height << "]/Decode" << endl;
+ *fp << "[";
+ int decodemax = isIndexed() ? (1 << bits)-1 : 1;
+ *fp << "0 " << decodemax;
+ int comps = getColorComponents();
+ for (int j = 1; j < comps; j++) {
+ *fp << " 0 " << decodemax;
+ }
+ *fp << "]/DataSource F>> image" << endl;
+ *fp << "F closefile T closefile}" << endl;
+ *fp << "exec" << endl;
+ GLEASCII85ByteStream ascii85(fp);
+ // Store palette for indexed image
+ if (isIndexed()) {
+ rgb* pal = getPalette();
+ for (int i = 0; i < colors; i++) {
+ ascii85.sendByte(pal[i].red);
+ ascii85.sendByte(pal[i].green);
+ ascii85.sendByte(pal[i].blue);
+ }
+ }
+ // Encode image
+ GLEByteStream* stream = NULL;
+ if (getEncoding() == GLE_BITMAP_LZW) {
+ GLELZWByteStream lzw(&ascii85);
+ // Remove extra components?
+ int extra = getExtraComponents();
+ int color_alpha = getColorComponents();
+ if (isAlpha()) {
+ // Do not count alpha as extra component
+ extra--;
+ color_alpha++;
+ }
+ GLEComponentRemovalByteStream crem(&lzw, color_alpha, extra);
+ if (extra != 0) {
+ stream = &crem;
+ } else {
+ stream = &lzw;
+ }
+ // Remove alpha?
+ GLEAlphaRemovalByteStream alpha(stream, color_alpha);
+ if (isAlpha()) stream = α
+ // Combine more than one pixel in each byte?
+ GLEPixelCombineByteStream combine(stream, bits);
+ if (bits < 8) stream = &combine;
+ // Decode
+ decode(stream);
+ stream->term();
+ } else {
+ coded(&ascii85);
+ }
+ // End
+ ascii85.term();
+ *fp << "end restore" << endl;
+ return 0;
+}
+
+int GLEBitmap::decode(GLEByteStream* output) {
+ return GLE_IMAGE_ERROR_NOT_IMPL;
+}
+
+int GLEBitmap::coded(GLEByteStream* output) {
+ return GLE_IMAGE_ERROR_NOT_IMPL;
+}
+
+void GLEBitmap::loadImageData() {
+}
+
+int GLEBitmap::prepare(int mode) {
+ return GLE_IMAGE_ERROR_NONE;
+}
+
+rgb* GLEBitmap::allocPalette(int ncolors) {
+ if (m_Palette != NULL) {
+ delete[] m_Palette;
+ }
+ m_Palette = new rgb[ncolors];
+ return m_Palette;
+}
+
+int GLEBitmap::getScanlineSize() {
+ int bytespc = getBitsPerComponent()/8;
+ if (bytespc < 1) bytespc = 1;
+ return getWidth()*getComponents()*bytespc;
+}
+
+int GLEBitmap::getColorComponents() {
+ return getComponents() - getExtraComponents();
+}
+
+int GLEBitmap::getMaxBits() {
+ if (isIndexed()) {
+ if (m_Colors > 16) {
+ /* More than 16 colors -> 8 bits (5,6,7 bits are not supported by postscript!) */
+ return 8;
+ } else if (m_Colors >= 5) {
+ /* At most 16 colors */
+ return 4;
+ } else if (m_Colors >= 3) {
+ /* At most 4 colors */
+ return 2;
+ } else {
+ /* Monochrome bitmap */
+ return 1;
+ }
+ } else {
+ return 8;
+ }
+}
+
+void GLEBitmap::checkGrayScalePalette() {
+ rgb* pal = getPalette();
+ if (getNbColors() == 256) {
+ int nogray = 0;
+ for (int i = 0; i < 256; i++) {
+ if (pal[i].red != i || pal[i].green != i || pal[i].blue != i) {
+ nogray = 1;
+ }
+ }
+ if (nogray == 0) {
+ setMode(GLE_BITMAP_GRAYSCALE);
+ setBitsPerComponent(8);
+ }
+ } else if (getNbColors() == 2) {
+ if (pal[0].red == 0 && pal[0].green == 0 && pal[0].blue == 0 &&
+ pal[1].red == 255 && pal[1].green == 255 && pal[1].blue == 255) {
+ setMode(GLE_BITMAP_GRAYSCALE);
+ setBitsPerComponent(1);
+ }
+ }
+}
+
+void GLEBitmap::printInfo(ostream& os) {
+ os << getWidth();
+ os << "x";
+ os << getHeight();
+ os << "x";
+ os << getBitsPerComponent() * getComponents();
+ switch (getMode()) {
+ case GLE_BITMAP_GRAYSCALE:
+ os << "-GRAY";
+ break;
+ case GLE_BITMAP_RGB:
+ os << "-RGB";
+ break;
+ case GLE_BITMAP_INDEXED:
+ os << "-PAL:" << getNbColors();
+ break;
+ }
+}
+
+void GLEBitmap::close() {
+}
+
+string GLEBitmap::getFName()
+{
+ return "";
+}
+
+GLEFileBitmap::GLEFileBitmap() {
+ m_Palette = NULL;
+}
+
+GLEFileBitmap::~GLEFileBitmap() {
+ close();
+}
+
+int GLEFileBitmap::open(const string& fname) {
+ m_file.open(fname.c_str(), "rb");
+ return m_file.isOpen() ? 1 : 0;
+}
+
+int GLEFileBitmap::read16BE() {
+ int lh = fgetc(m_file.getFile());
+ int ll = fgetc(m_file.getFile());
+ return (lh << 8) | ll;
+}
+
+int GLEFileBitmap::read16LE() {
+ int lh = fgetc(m_file.getFile());
+ int ll = fgetc(m_file.getFile());
+ return (ll << 8) | lh;
+}
+
+void GLEFileBitmap::close() {
+ m_file.close();
+}
+
+string GLEFileBitmap::getFName()
+{
+ return m_file.getName();
+}
+
+GLEByteStream::GLEByteStream() {
+ m_Terminated = 0;
+}
+
+GLEByteStream::~GLEByteStream() {
+}
+
+int GLEByteStream::send(GLEBYTE* bytes, GLEDWORD count) {
+ for (unsigned int i = 0; i < count; i++) {
+ sendByte(bytes[i]);
+ }
+ return GLE_IMAGE_ERROR_NONE;
+}
+
+int GLEByteStream::term() {
+ m_Terminated = 1;
+ return GLE_IMAGE_ERROR_NONE;
+}
+
+int GLEByteStream::endScanLine() {
+ return GLE_IMAGE_ERROR_NONE;
+}
+
+GLERecordedByteStream::GLERecordedByteStream() {
+}
+
+GLERecordedByteStream::~GLERecordedByteStream() {
+}
+
+int GLERecordedByteStream::sendByte(GLEBYTE byte) {
+ m_bytes.push_back(byte);
+ return GLE_IMAGE_ERROR_NONE;
+}
+
+unsigned long GLERecordedByteStream::getNbBytes() const {
+ return (unsigned long)m_bytes.size();
+}
+
+GLEBYTE* GLERecordedByteStream::getBytes() {
+ if (m_bytes.empty()) {
+ return 0;
+ } else {
+ return &m_bytes[0];
+ }
+}
+
+GLEPipedByteStream::GLEPipedByteStream(GLEByteStream* pipe): GLEByteStream() {
+ m_Pipe = pipe;
+}
+
+GLEPipedByteStream::~GLEPipedByteStream() {
+}
+
+int GLEPipedByteStream::endScanLine() {
+ m_Pipe->endScanLine();
+ return GLEByteStream::endScanLine();
+}
+
+int GLEPipedByteStream::term() {
+ m_Pipe->term();
+ return GLEByteStream::term();
+}
+
+GLEPNegateByteStream::GLEPNegateByteStream(GLEByteStream* pipe):
+ GLEPipedByteStream(pipe)
+{
+}
+
+GLEPNegateByteStream::~GLEPNegateByteStream() {
+}
+
+int GLEPNegateByteStream::sendByte(GLEBYTE byte) {
+ m_Pipe->sendByte(~byte);
+ return GLE_IMAGE_ERROR_NONE;
+}
+
+GLEIndexedToRGBByteStream::GLEIndexedToRGBByteStream(GLEByteStream* pipe, rgb* palette):
+ GLEPipedByteStream(pipe),
+ m_palette(palette)
+{
+}
+
+GLEIndexedToRGBByteStream::~GLEIndexedToRGBByteStream() {
+}
+
+int GLEIndexedToRGBByteStream::sendByte(GLEBYTE byte) {
+ rgb values(m_palette[byte]);
+ m_Pipe->sendByte(values.red);
+ m_Pipe->sendByte(values.green);
+ m_Pipe->sendByte(values.blue);
+ return GLE_IMAGE_ERROR_NONE;
+}
+
+GLERGBATo32BitByteStream::GLERGBATo32BitByteStream(GLEByteStream* pipe, bool isAlpha):
+ GLEPipedByteStream(pipe),
+ m_index(0),
+ m_nbComponents(isAlpha ? 4 : 3)
+{
+}
+
+GLERGBATo32BitByteStream::~GLERGBATo32BitByteStream() {
+}
+
+int GLERGBATo32BitByteStream::sendByte(GLEBYTE byte) {
+ m_components[m_index++] = byte;
+ if (m_index == m_nbComponents) {
+ unsigned int value = ((unsigned int)m_components[0]) << 16
+ | ((unsigned int)m_components[1]) << 8
+ | ((unsigned int)m_components[2]);
+ if (m_nbComponents == 4) {
+ value |= ((unsigned int)m_components[3]) << 24;
+ }
+ const char* valueAsBytes = (const char*)&value;
+ for (unsigned int i = 0; i < sizeof(unsigned int); ++i) {
+ m_Pipe->sendByte(valueAsBytes[i]);
+ }
+ m_index = 0;
+ }
+ return GLE_IMAGE_ERROR_NONE;
+}
+
+int GLERGBATo32BitByteStream::endScanLine() {
+ m_index = 0;
+ return GLEPipedByteStream::endScanLine();
+}
+
+GLEPixelCombineByteStream::GLEPixelCombineByteStream(GLEByteStream* pipe, int bpc) : GLEPipedByteStream(pipe) {
+ m_BitsPerComponent = bpc;
+ m_BitsLeft = 8;
+ m_Combined = 0;
+}
+
+GLEPixelCombineByteStream::~GLEPixelCombineByteStream() {
+}
+
+int GLEPixelCombineByteStream::flushBufferByte() {
+ m_Pipe->sendByte(m_Combined);
+ m_BitsLeft = 8;
+ m_Combined = 0;
+ return GLE_IMAGE_ERROR_NONE;
+}
+
+int GLEPixelCombineByteStream::sendByte(GLEBYTE byte) {
+ if (m_BitsLeft >= m_BitsPerComponent) {
+ /* Still fits in */
+ m_Combined |= byte << (m_BitsLeft - m_BitsPerComponent);
+ m_BitsLeft -= m_BitsPerComponent;
+ } else {
+ /* Does not fit in */
+ int left = m_BitsPerComponent - m_BitsLeft;
+ m_Combined |= byte >> left;
+ flushBufferByte();
+ m_Combined |= byte << (m_BitsLeft - left);
+ m_BitsLeft -= left;
+ }
+ if (m_BitsLeft == 0) flushBufferByte();
+ return GLE_IMAGE_ERROR_NONE;
+}
+
+int GLEPixelCombineByteStream::endScanLine() {
+ if (m_BitsLeft != 8) flushBufferByte();
+ return GLEPipedByteStream::endScanLine();
+}
+
+int GLEPixelCombineByteStream::term() {
+ if (m_BitsLeft != 8) flushBufferByte();
+ return GLEPipedByteStream::term();
+}
+
+GLEBitsTo32BitByteStream::GLEBitsTo32BitByteStream(GLEByteStream* pipe) : GLEPipedByteStream(pipe) {
+ m_bitsLeft = 32;
+ m_combined = 0;
+}
+
+GLEBitsTo32BitByteStream::~GLEBitsTo32BitByteStream() {
+}
+
+int GLEBitsTo32BitByteStream::flushBufferByte() {
+ const char* valueAsBytes = (const char*)&m_combined;
+ for (unsigned int i = 0; i < sizeof(unsigned int); ++i) {
+ m_Pipe->sendByte(valueAsBytes[i]);
+ }
+ m_bitsLeft = 32;
+ m_combined = 0;
+ return GLE_IMAGE_ERROR_NONE;
+}
+
+int GLEBitsTo32BitByteStream::sendByte(GLEBYTE byte) {
+ if (m_bitsLeft > 0) {
+ m_combined |= ((unsigned int)byte) << (32 - m_bitsLeft);
+ m_bitsLeft--;
+ }
+ if (m_bitsLeft == 0) {
+ flushBufferByte();
+ }
+ return GLE_IMAGE_ERROR_NONE;
+}
+
+int GLEBitsTo32BitByteStream::endScanLine() {
+ if (m_bitsLeft != 32) flushBufferByte();
+ return GLEPipedByteStream::endScanLine();
+}
+
+int GLEBitsTo32BitByteStream::term() {
+ if (m_bitsLeft != 32) flushBufferByte();
+ return GLEPipedByteStream::term();
+}
+
+GLEComponentRemovalByteStream::GLEComponentRemovalByteStream(GLEByteStream* pipe, int main, int remove) : GLEPipedByteStream(pipe) {
+ m_Index = 0;
+ m_Removed = 0;
+ m_Main = main;
+ m_Total = main+remove;
+}
+
+GLEComponentRemovalByteStream::~GLEComponentRemovalByteStream() {
+}
+
+int GLEComponentRemovalByteStream::sendByte(GLEBYTE byte) {
+ if (m_Index < m_Main) {
+ m_Pipe->sendByte(byte);
+ } else {
+ m_Removed++;
+ }
+ m_Index++;
+ if (m_Index >= m_Total) {
+ m_Index = 0;
+ }
+ return GLE_IMAGE_ERROR_NONE;
+}
+
+int GLEComponentRemovalByteStream::endScanLine() {
+ m_Index = 0;
+ return GLEPipedByteStream::endScanLine();
+}
+
+GLEAlphaRemovalByteStream::GLEAlphaRemovalByteStream(GLEByteStream* pipe, int components) : GLEPipedByteStream(pipe) {
+ m_Components = components-1;
+ m_Index = 0;
+ // Do not support images with more channels
+ if (m_Components > GLE_BITMAP_MAX_COMPONENTS) {
+ m_Components = GLE_BITMAP_MAX_COMPONENTS;
+ }
+}
+
+GLEAlphaRemovalByteStream::~GLEAlphaRemovalByteStream() {
+}
+
+int GLEAlphaRemovalByteStream::sendByte(GLEBYTE byte) {
+ if (m_Index >= m_Components) {
+ unsigned int adjust = 255-byte;
+ for (int i = 0; i < m_Components; i++) {
+ unsigned int output = (unsigned int)m_Buffer[i] + adjust;
+ if (output >= 0xFF) m_Pipe->sendByte(0xFF);
+ else m_Pipe->sendByte((GLEBYTE)output);
+ }
+ m_Index = 0;
+ } else {
+ m_Buffer[m_Index++] = byte;
+ }
+ return GLE_IMAGE_ERROR_NONE;
+}
+
+int GLEAlphaRemovalByteStream::endScanLine() {
+ m_Index = 0;
+ return GLEPipedByteStream::endScanLine();
+}
+
+IpolData::IpolData() {
+}
+
+IpolData::~IpolData() {
+}
+
+IpolDoubleMatrix::IpolDoubleMatrix(double* data, int wd, int hi) {
+ m_Width = wd;
+ m_Height = hi;
+ m_Data = data;
+}
+
+IpolDoubleMatrix::~IpolDoubleMatrix() {
+}
+
+double IpolDoubleMatrix::getValue(int x, int y) {
+ if (x < 0) x = 0;
+ if (x >= m_Width) x = m_Width - 1;
+ if (y < 0) y = 0;
+ if (y >= m_Height) y = m_Height - 1;
+ return m_Data[y * m_Width + x];
+}
+
+Ipol::Ipol()
+{
+}
+
+Ipol::~Ipol()
+{
+}
+
+BicubicIpol::BicubicIpol(IpolData* data) {
+ m_Data = data;
+}
+
+double BicubicIpol::R(double x) {
+ double v;
+ double sum = 0.0;
+ v = x + 2;
+ if (v > 0) sum += v*v*v;
+ v = x + 1;
+ if (v > 0) sum -= 4*v*v*v;
+ if (x > 0) sum += 6*x*x*x;
+ v = x - 1;
+ if (v > 0) sum -= 4*v*v*v;
+ return sum/6.0;
+}
+
+double BicubicIpol::ipol(double xp, double yp) {
+ double x = xp * m_Data->getWidth();
+ double y = yp * m_Data->getHeight();
+ int i = (int)floor(x);
+ int j = (int)floor(y);
+ double dx = x - i;
+ double dy = y - j;
+ double value = 0;
+ for (int m = -1; m <= 2; m++) {
+ int xo = i + m;
+ double rx = R(m-dx);
+ for (int n = -1; n <= 2; n++) {
+ int yo = j + n;
+ value += m_Data->getValue(xo, yo) * rx * R(dy-n);
+ }
+ }
+ return value;
+}
+
+NearestIpol::NearestIpol(IpolData* data):
+ m_Data(data)
+{
+}
+
+double NearestIpol::ipol(double xp, double yp) {
+ return m_Data->getValue(gle_round_int(xp * m_Data->getWidth()), gle_round_int(yp * m_Data->getHeight()));
+}
+
+void GLEBitmapSetPalette(GLEBYTE* pal, int offs, double red, double green, double blue) {
+ int i_red = (int)floor(red*255+0.5);
+ int i_green = (int)floor(green*255+0.5);
+ int i_blue = (int)floor(blue*255+0.5);
+ if (i_red > 255) i_red = 255;
+ if (i_green > 255) i_green = 255;
+ if (i_blue > 255) i_blue = 255;
+ if (i_red < 0) i_red = 0;
+ if (i_green < 0) i_green = 0;
+ if (i_blue < 0) i_blue = 0;
+ pal[offs*3] = i_red;
+ pal[offs*3+1] = i_green;
+ pal[offs*3+2] = i_blue;
+}
+
+GLEBYTE* GLEBitmapCreateColorPalette(int nc) {
+ int offset = 1;
+ int nintervals = 6;
+ int divisor = 3;
+ int num = nc-offset;
+ int n = (num / (nintervals*divisor))*divisor;
+ nc = n*nintervals+offset;
+ GLEBYTE* result = new GLEBYTE[nc*3];
+ double ninv = 1.0/n;
+ int n3 = n/3;
+ int n23 = 2*n3;
+ double third = n3*ninv;
+ double twothirds = n23*ninv;
+ for (int i = 0; i < n3; ++i) {
+ double ininv = i*ninv;
+ GLEBitmapSetPalette(result, i, ininv, 0.0, ininv);
+ GLEBitmapSetPalette(result, n3+i, third, 0.0, third+ininv);
+ GLEBitmapSetPalette(result, n23+i, third-ininv, 0.0, twothirds+ininv);
+ }
+ for (int i = 0; i < n; ++i) {
+ double ininv = i*ninv;
+ double ininv1 = 1.0-ininv;
+ GLEBitmapSetPalette(result, n+i, 0.0, ininv, 1.0);
+ GLEBitmapSetPalette(result, 2*n+i, 0.0, 1.0, ininv1);
+ GLEBitmapSetPalette(result, 3*n+i, ininv, 1.0, 0.0);
+ GLEBitmapSetPalette(result, 4*n+i, 1.0, ininv1, 0.0);
+ GLEBitmapSetPalette(result, 5*n+i, 1.0, ininv, ininv);
+ }
+ GLEBitmapSetPalette(result, 6*n, 1.0, 1.0, 1.0);
+ return result;
+}
diff --git a/src/gle/bitmap/img2ps.h b/src/gle/bitmap/img2ps.h
new file mode 100644
index 0000000..f972a02
--- /dev/null
+++ b/src/gle/bitmap/img2ps.h
@@ -0,0 +1,435 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#ifndef INC_IMG2PS_H
+#define INC_IMG2PS_H
+
+/*
+ * 2004 Jan Struyf
+ *
+ * Still busy implementing - import of JPEG, GIF and TIFF should work to some extend
+ * If you encounter problems, please contact the GLE list
+ */
+
+#ifdef HAVE_LIBTIFF
+ #include <tiffio.h>
+#endif
+
+#ifdef HAVE_LIBPNG
+ #include <png.h>
+#endif
+
+#define GLE_BITMAP_INDEXED 1
+#define GLE_BITMAP_GRAYSCALE 2
+#define GLE_BITMAP_RGB 3
+
+#define GLE_IMAGE_ERROR_NONE 0
+#define GLE_IMAGE_ERROR_DATA 1
+#define GLE_IMAGE_ERROR_FILE 2
+#define GLE_IMAGE_ERROR_TYPE 3
+#define GLE_IMAGE_ERROR_INTERN 4
+#define GLE_IMAGE_ERROR_NOT_IMPL 10
+
+#define GLE_BITMAP_NONE 0
+#define GLE_BITMAP_LZW 1
+#define GLE_BITMAP_JPEG 2
+
+#define GLE_BITMAP_PREPARE_SCANLINE 0
+
+#define GLE_BITMAP_MAX_COMPONENTS 3
+
+#define CVT16TO8(x) (((x) * 255) / ((1L<<16)-1))
+
+typedef unsigned char GLEBYTE;
+typedef unsigned int GLEDWORD;
+
+typedef struct {
+ unsigned char red;
+ unsigned char green;
+ unsigned char blue;
+} rgb;
+
+class GLEByteStream;
+
+class GLEBitmap {
+protected:
+ string m_Error;
+ int m_Height;
+ int m_Width;
+ char m_Mode;
+ int m_Components;
+ int m_ExtraComponents;
+ int m_Colors;
+ char m_Encoding;
+ char m_Interlaced;
+ char m_Alpha;
+ int m_BitsPerComponent;
+ rgb* m_Palette;
+ int m_ASCII85;
+ double m_Compress;
+public:
+ GLEBitmap();
+ virtual ~GLEBitmap();
+ inline int getWidth() { return m_Width; }
+ inline int getHeight() { return m_Height; }
+ inline int getNbColors() { return m_Colors; }
+ inline void setNbColors(int colors) { m_Colors = colors; }
+ inline int getComponents() { return m_Components; }
+ inline void setComponents(int components) { m_Components = components; }
+ inline void setMode(char mode) { m_Mode = mode; }
+ inline char getMode() { return m_Mode; }
+ inline char isIndexed() { return m_Mode == GLE_BITMAP_INDEXED; }
+ inline char isGrayScale() { return m_Mode == GLE_BITMAP_GRAYSCALE; }
+ inline char isInterlaced() { return m_Interlaced; }
+ inline void setInterlaced(char interlaced) { m_Interlaced = interlaced; }
+ inline char isAlpha() { return m_Alpha; }
+ inline void setAlpha(char alpha) { m_Alpha = alpha; }
+ inline char getEncoding() { return m_Encoding; }
+ inline void setEncoding(char encoding) { m_Encoding = encoding; }
+ inline int getBitsPerComponent() { return m_BitsPerComponent; }
+ inline void setBitsPerComponent(int bits) { m_BitsPerComponent = bits; }
+ inline int isASCII85() { return m_ASCII85; }
+ inline void setASCII85(int val) { m_ASCII85 = val; }
+ inline double getCompress() { return m_Compress; }
+ inline void setCompress(double val) { m_Compress = val; }
+ inline rgb* getPalette() { return m_Palette; }
+ inline int getExtraComponents() { return m_ExtraComponents; }
+ inline void setExtraComponents(int extra) { m_ExtraComponents = extra; }
+ inline const string& getError() { return m_Error; }
+ inline void setError(const string& err) { m_Error = err; }
+ inline void setError(const char* err) { m_Error = err; }
+ rgb* allocPalette(int ncolors);
+ int getScanlineSize();
+ int getColorComponents();
+ int getMaxBits();
+ void checkGrayScalePalette();
+ virtual int open(const string& fname);
+ virtual int readHeader();
+ virtual int toPS(ostream* fp);
+ virtual void loadImageData();
+ virtual int prepare(int mode);
+ virtual int decode(GLEByteStream* output);
+ virtual int coded(GLEByteStream* output);
+ virtual void close();
+ virtual string getFName();
+ void printInfo(ostream& os);
+};
+
+class GLEFileBitmap : public GLEBitmap {
+protected:
+ GLEFileIO m_file;
+public:
+ GLEFileBitmap();
+ virtual ~GLEFileBitmap();
+ virtual int open(const string& fname);
+ virtual void close();
+ virtual string getFName();
+ int read16BE();
+ int read16LE();
+ inline int read8() { return fgetc(m_file.getFile()); }
+};
+
+class GLEJPEG : public GLEFileBitmap {
+public:
+ GLEJPEG();
+ virtual ~GLEJPEG();
+ virtual int readHeader();
+ virtual int coded(GLEByteStream* output);
+ int checkJPG();
+ int readImageSize();
+};
+
+class GLEGIFDecoder;
+
+class GLEGIF : public GLEFileBitmap {
+protected:
+ long m_ImageOffs;
+public:
+ GLEGIF();
+ virtual ~GLEGIF();
+ virtual int readHeader();
+ virtual int decode(GLEByteStream* output);
+ void updateImageType();
+ int headerExtension();
+ int headerImage();
+ void headerCOMExt();
+ void skipBlocks();
+};
+
+#ifdef HAVE_LIBTIFF
+class GLETIFF : public GLEBitmap {
+protected:
+ TIFF* m_Tiff;
+ uint16 m_TIFFCompress;
+ string m_fname;
+public:
+ GLETIFF();
+ virtual ~GLETIFF();
+ virtual int open(const string& fname);
+ virtual int readHeader();
+ virtual int prepare(int mode);
+ virtual int decode(GLEByteStream* output);
+ virtual void close();
+ virtual string getFName();
+ int isCCITTCompression();
+ uint16 getTIFFCompression() { return m_TIFFCompress; }
+};
+#endif
+
+#ifdef HAVE_LIBPNG
+class GLEPNG : public GLEFileBitmap {
+protected:
+ png_structp m_PNGPtr;
+ png_infop m_InfoPtr;
+ png_infop m_EndInfo;
+public:
+ GLEPNG();
+ virtual ~GLEPNG();
+ virtual int readHeader();
+ virtual int prepare(int mode);
+ virtual int decode(GLEByteStream* output);
+};
+#endif
+
+class GLEByteStream {
+protected:
+ char m_Terminated;
+public:
+ GLEByteStream();
+ virtual ~GLEByteStream();
+ virtual int send(GLEBYTE* bytes, GLEDWORD count);
+ virtual int sendByte(GLEBYTE byte) = 0;
+ virtual int endScanLine();
+ virtual int term();
+ inline int isTerminated() { return m_Terminated; }
+};
+
+class GLERecordedByteStream : public GLEByteStream {
+protected:
+ std::vector<GLEBYTE> m_bytes;
+public:
+ GLERecordedByteStream();
+ virtual ~GLERecordedByteStream();
+ virtual int sendByte(GLEBYTE byte);
+ unsigned long getNbBytes() const;
+ GLEBYTE* getBytes();
+};
+
+class GLEPipedByteStream : public GLEByteStream {
+protected:
+ GLEByteStream* m_Pipe;
+public:
+ GLEPipedByteStream(GLEByteStream* pipe);
+ virtual ~GLEPipedByteStream();
+ virtual int endScanLine();
+ virtual int term();
+};
+
+class GLEPNegateByteStream : public GLEPipedByteStream {
+public:
+ GLEPNegateByteStream(GLEByteStream* pipe);
+ virtual ~GLEPNegateByteStream();
+ virtual int sendByte(GLEBYTE byte);
+};
+
+class GLEIndexedToRGBByteStream : public GLEPipedByteStream {
+protected:
+ rgb* m_palette;
+public:
+ GLEIndexedToRGBByteStream(GLEByteStream* pipe, rgb* palette);
+ virtual ~GLEIndexedToRGBByteStream();
+ virtual int sendByte(GLEBYTE byte);
+};
+
+class GLERGBATo32BitByteStream : public GLEPipedByteStream {
+protected:
+ GLEBYTE m_components[4];
+ int m_index;
+ int m_nbComponents;
+public:
+ GLERGBATo32BitByteStream(GLEByteStream* pipe, bool isAlpha);
+ virtual ~GLERGBATo32BitByteStream();
+ virtual int sendByte(GLEBYTE byte);
+ virtual int endScanLine();
+};
+
+class GLEPixelCombineByteStream : public GLEPipedByteStream {
+protected:
+ GLEBYTE m_Combined;
+ int m_BitsPerComponent;
+ int m_BitsLeft;
+public:
+ GLEPixelCombineByteStream(GLEByteStream* pipe, int bpc);
+ virtual ~GLEPixelCombineByteStream();
+ virtual int sendByte(GLEBYTE byte);
+ virtual int endScanLine();
+ virtual int term();
+private:
+ int flushBufferByte();
+};
+
+class GLEBitsTo32BitByteStream : public GLEPipedByteStream {
+protected:
+ unsigned int m_combined;
+ int m_bitsLeft;
+public:
+ GLEBitsTo32BitByteStream(GLEByteStream* pipe);
+ virtual ~GLEBitsTo32BitByteStream();
+ virtual int sendByte(GLEBYTE byte);
+ virtual int endScanLine();
+ virtual int term();
+private:
+ int flushBufferByte();
+};
+
+class GLEAlphaRemovalByteStream : public GLEPipedByteStream {
+protected:
+ GLEBYTE m_Buffer[GLE_BITMAP_MAX_COMPONENTS];
+ int m_Components;
+ int m_Index;
+public:
+ GLEAlphaRemovalByteStream(GLEByteStream* pipe, int components);
+ virtual ~GLEAlphaRemovalByteStream();
+ virtual int sendByte(GLEBYTE byte);
+ virtual int endScanLine();
+};
+
+class GLEComponentRemovalByteStream : public GLEPipedByteStream {
+protected:
+ int m_Index, m_Main, m_Total, m_Removed;
+public:
+ GLEComponentRemovalByteStream(GLEByteStream* pipe, int main, int remove);
+ virtual ~GLEComponentRemovalByteStream();
+ virtual int sendByte(GLEBYTE byte);
+ virtual int endScanLine();
+};
+
+class GLEASCII85ByteStream : public GLEByteStream {
+private:
+ ostream* m_File;
+ unsigned char m_Buffer[10];
+ int m_Count;
+ int m_BreakLength;
+public:
+ GLEASCII85ByteStream(ostream* file);
+ virtual ~GLEASCII85ByteStream();
+ virtual int sendByte(GLEBYTE byte);
+ virtual int term();
+ inline void decBreakLength(int cnt) { m_BreakLength -= cnt; }
+};
+
+class GLELZWByteStream : public GLEPipedByteStream {
+private:
+ GLEBYTE* m_Data; /* compression scheme private data */
+ GLEBYTE* m_RawData; /* raw data buffer */
+ GLEDWORD m_RawDatasize; /* # of bytes in raw data buffer */
+ GLEBYTE* m_RawCP; /* current spot in raw buffer */
+ GLEDWORD m_RawCC; /* bytes unread from raw buffer */
+ GLEBYTE m_State;
+public:
+ GLELZWByteStream(GLEByteStream* pipe);
+ virtual ~GLELZWByteStream();
+ virtual int send(GLEBYTE* bytes, GLEDWORD count);
+ virtual int sendByte(GLEBYTE byte);
+ virtual int term();
+private:
+ int setupEncode();
+ int preEncode();
+ int encode(GLEBYTE* bp, GLEDWORD cc);
+ int postEncode();
+ int flushData();
+ int init();
+ void cleanUp();
+};
+
+enum IpolType
+{
+ IPOL_TYPE_BICUBIC,
+ IPOL_TYPE_NEAREST
+};
+
+class IpolData {
+protected:
+ int m_Width;
+ int m_Height;
+public:
+ IpolData();
+ virtual ~IpolData();
+ inline int getWidth() { return m_Width; }
+ inline int getHeight() { return m_Height; }
+ virtual double getValue(int x, int y) = 0;
+};
+
+class IpolDoubleMatrix: public IpolData {
+protected:
+ double* m_Data;
+public:
+ IpolDoubleMatrix(double* data, int wd, int hi);
+ virtual ~IpolDoubleMatrix();
+ virtual double getValue(int x, int y);
+};
+
+class Ipol {
+public:
+ Ipol();
+ virtual ~Ipol();
+ virtual double ipol(double xp, double yp) = 0;
+};
+
+class BicubicIpol: public Ipol {
+protected:
+ IpolData* m_Data;
+public:
+ BicubicIpol(IpolData* data);
+ virtual double ipol(double xp, double yp);
+ double R(double x);
+};
+
+class NearestIpol: public Ipol {
+protected:
+ IpolData* m_Data;
+public:
+ NearestIpol(IpolData* data);
+ virtual double ipol(double xp, double yp);
+};
+
+void GLEBitmapSetPalette(GLEBYTE* pal, int offs, double red, double green, double blue);
+
+GLEBYTE* GLEBitmapCreateColorPalette(int nc);
+
+#endif
diff --git a/src/gle/bitmap/lzwencode.cpp b/src/gle/bitmap/lzwencode.cpp
new file mode 100644
index 0000000..7a31b42
--- /dev/null
+++ b/src/gle/bitmap/lzwencode.cpp
@@ -0,0 +1,406 @@
+
+/*
+ * Rev 5.0 Lempel-Ziv & Welch Compression Support
+ * Based on the LZW compression code from libtiff <www.libtiff.org>
+ *
+ * Copyright (c) 1985, 1986 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * James A. Woods, derived from original work by Spencer Thomas
+ * and Joseph Orost.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the above copyright notice and this paragraph are
+ * duplicated in all such forms and that any documentation,
+ * advertising materials, and other materials related to such
+ * distribution and use acknowledge that the software was developed
+ * by the University of California, Berkeley. The name of the
+ * University may not be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+#include "../basicconf.h"
+#include "../file_io.h"
+#include "img2ps.h"
+
+GLELZWByteStream::GLELZWByteStream(GLEByteStream* pipe) : GLEPipedByteStream(pipe) {
+ m_RawDatasize = 4096;
+ m_RawData = (GLEBYTE*)malloc(m_RawDatasize);
+ m_RawCP = m_RawData;
+ m_RawCC = 0;
+ if (init() && setupEncode() && preEncode()) {
+ m_State = GLE_IMAGE_ERROR_NONE;
+ } else {
+ cleanUp();
+ }
+}
+
+GLELZWByteStream::~GLELZWByteStream() {
+ cleanUp();
+ if (m_RawData != NULL) {
+ free(m_RawData);
+ }
+}
+
+int GLELZWByteStream::send(GLEBYTE* bytes, GLEDWORD count) {
+ if (encode(bytes, count)) {
+ return GLE_IMAGE_ERROR_NONE;
+ } else {
+ return GLE_IMAGE_ERROR_DATA;
+ }
+}
+
+int GLELZWByteStream::sendByte(GLEBYTE byte) {
+ if (encode(&byte, 1)) {
+ return GLE_IMAGE_ERROR_NONE;
+ } else {
+ return GLE_IMAGE_ERROR_DATA;
+ }
+}
+
+int GLELZWByteStream::term() {
+ if (!postEncode()) return GLE_IMAGE_ERROR_DATA;
+ cleanUp();
+ if (!flushData()) return GLE_IMAGE_ERROR_DATA;
+ return GLEPipedByteStream::term();
+}
+
+int GLELZWByteStream::flushData() {
+ if (m_RawCC > 0) {
+ m_Pipe->send(m_RawData, m_RawCC);
+ // FIXME return 0 depending on error code of send
+
+ m_RawCC = 0;
+ m_RawCP = m_RawData;
+ }
+ return 1;
+}
+
+#define MAXCODE(n) ((1L<<(n))-1)
+#define BITS_MIN 9 /* start with 9 bits */
+#define BITS_MAX 12 /* max of 12 bit strings */
+#define CODE_CLEAR 256 /* code to clear string table */
+#define CODE_EOI 257 /* end-of-information code */
+#define CODE_FIRST 258 /* first free code entry */
+#define CODE_MAX MAXCODE(BITS_MAX)
+#define HSIZE 9001L /* 91% occupancy */
+#define HSHIFT (13-8)
+/* NB: +1024 is for compatibility with old files */
+#define CSIZE (MAXCODE(BITS_MAX)+1024L)
+
+typedef struct {
+ unsigned short nbits; /* # of bits/code */
+ unsigned short maxcode; /* maximum code for lzw_nbits */
+ unsigned short free_ent; /* next free entry in hash table */
+ long nextdata; /* next bits of i/o */
+ long nextbits; /* # of valid bits in lzw_nextdata */
+} LZWBaseState;
+
+#define lzw_nbits base.nbits
+#define lzw_maxcode base.maxcode
+#define lzw_free_ent base.free_ent
+#define lzw_nextdata base.nextdata
+#define lzw_nextbits base.nextbits
+
+typedef unsigned short hcode_t; /* codes fit in 16 bits */
+typedef struct {
+ long hash;
+ hcode_t code;
+} hash_t;
+
+typedef struct {
+ LZWBaseState base;
+ int enc_oldcode; /* last code encountered */
+ long enc_checkpoint; /* point at which to clear table */
+#define CHECK_GAP 10000 /* enc_ratio check interval */
+ long enc_ratio; /* current compression ratio */
+ long enc_incount; /* (input) data bytes encoded */
+ long enc_outcount; /* encoded (output) bytes */
+ GLEBYTE* enc_rawlimit; /* bound on m_RawData buffer */
+ hash_t* enc_hashtab; /* kept separate for small machines */
+} encodeState;
+
+static void GLELZWEncoderClearHash(encodeState* sp) {
+ register hash_t *hp = &sp->enc_hashtab[HSIZE-1];
+ register long i = HSIZE-8;
+ do {
+ i -= 8;
+ hp[-7].hash = -1;
+ hp[-6].hash = -1;
+ hp[-5].hash = -1;
+ hp[-4].hash = -1;
+ hp[-3].hash = -1;
+ hp[-2].hash = -1;
+ hp[-1].hash = -1;
+ hp[ 0].hash = -1;
+ hp -= 8;
+ } while (i >= 0);
+ for (i += 8; i > 0; i--, hp--) {
+ hp->hash = -1;
+ }
+}
+
+int GLELZWByteStream::setupEncode() {
+ encodeState* sp = (encodeState*)m_Data;
+ sp->enc_hashtab = (hash_t*) malloc(HSIZE*sizeof (hash_t));
+ if (sp->enc_hashtab == NULL) {
+ return 0;
+ }
+ return 1;
+}
+
+int GLELZWByteStream::preEncode() {
+ encodeState *sp = (encodeState*)m_Data;
+ sp->lzw_nbits = BITS_MIN;
+ sp->lzw_maxcode = MAXCODE(BITS_MIN);
+ sp->lzw_free_ent = CODE_FIRST;
+ sp->lzw_nextbits = 0;
+ sp->lzw_nextdata = 0;
+ sp->enc_checkpoint = CHECK_GAP;
+ sp->enc_ratio = 0;
+ sp->enc_incount = 0;
+ sp->enc_outcount = 0;
+ /*
+ * The 4 here insures there is space for 2 max-sized
+ * codes in encode and LZWPostDecode.
+ */
+ sp->enc_rawlimit = m_RawData + m_RawDatasize-1 - 4;
+ GLELZWEncoderClearHash(sp);
+ sp->enc_oldcode = (hcode_t) -1; /* generates CODE_CLEAR in encode */
+ return 1;
+}
+
+#define CALCRATIO(sp, rat) { \
+ if (incount > 0x007fffff) { /* NB: shift will overflow */ \
+ rat = outcount >> 8; \
+ rat = (rat == 0 ? 0x7fffffff : incount/rat); \
+ } else \
+ rat = (incount<<8) / outcount; \
+}
+#define PutNextCode(op, c) { \
+ nextdata = (nextdata << nbits) | c; \
+ nextbits += nbits; \
+ *op++ = (unsigned char)(nextdata >> (nextbits-8)); \
+ nextbits -= 8; \
+ if (nextbits >= 8) { \
+ *op++ = (unsigned char)(nextdata >> (nextbits-8)); \
+ nextbits -= 8; \
+ } \
+ outcount += nbits; \
+}
+
+/*
+ * Encode a chunk of pixels.
+ *
+ * Uses an open addressing double hashing (no chaining) on the
+ * prefix code/next character combination. We do a variant of
+ * Knuth's algorithm D (vol. 3, sec. 6.4) along with G. Knott's
+ * relatively-prime secondary probe. Here, the modular division
+ * first probe is gives way to a faster exclusive-or manipulation.
+ * Also do block compression with an adaptive reset, whereby the
+ * code table is cleared when the compression ratio decreases,
+ * but after the table fills. The variable-length output codes
+ * are re-sized at this point, and a CODE_CLEAR is generated
+ * for the decoder.
+ */
+int GLELZWByteStream::encode(GLEBYTE* bp, GLEDWORD cc) {
+ register encodeState *sp = (encodeState*)m_Data;
+ register long fcode;
+ register hash_t *hp;
+ register int h, c;
+ hcode_t ent;
+ long disp;
+ long incount, outcount, checkpoint;
+ long nextdata, nextbits;
+ int free_ent, maxcode, nbits;
+ GLEBYTE* op, *limit;
+ if (sp == NULL) return 0;
+ /*
+ * Load local state.
+ */
+ incount = sp->enc_incount;
+ outcount = sp->enc_outcount;
+ checkpoint = sp->enc_checkpoint;
+ nextdata = sp->lzw_nextdata;
+ nextbits = sp->lzw_nextbits;
+ free_ent = sp->lzw_free_ent;
+ maxcode = sp->lzw_maxcode;
+ nbits = sp->lzw_nbits;
+ op = m_RawCP;
+ limit = sp->enc_rawlimit;
+ ent = sp->enc_oldcode;
+ if (ent == (hcode_t) -1 && cc > 0) {
+ /*
+ * NB: This is safe because it can only happen
+ * at the start of a strip where we know there
+ * is space in the data buffer.
+ */
+ PutNextCode(op, CODE_CLEAR);
+ ent = *bp++; cc--; incount++;
+ }
+ while (cc > 0) {
+ c = *bp++; cc--; incount++;
+ fcode = ((long)c << BITS_MAX) + ent;
+ h = (c << HSHIFT) ^ ent; /* xor hashing */
+// #ifdef _WINDOWS
+// /*
+// * Check hash index for an overflow.
+// */
+// if (h >= HSIZE)
+// h -= HSIZE;
+// #endif
+ hp = &sp->enc_hashtab[h];
+ if (hp->hash == fcode) {
+ ent = hp->code;
+ continue;
+ }
+ if (hp->hash >= 0) {
+ /*
+ * Primary hash failed, check secondary hash.
+ */
+ disp = HSIZE - h;
+ if (h == 0) disp = 1;
+ do {
+ /*
+ * Avoid pointer arithmetic 'cuz of
+ * wraparound problems with segments.
+ */
+ if ((h -= disp) < 0) h += HSIZE;
+ hp = &sp->enc_hashtab[h];
+ if (hp->hash == fcode) {
+ ent = hp->code;
+ goto hit;
+ }
+ } while (hp->hash >= 0);
+ }
+ /*
+ * New entry, emit code and add to table.
+ */
+ /*
+ * Verify there is space in the buffer for the code
+ * and any potential Clear code that might be emitted
+ * below. The value of limit is setup so that there
+ * are at least 4 bytes free--room for 2 codes.
+ */
+ if (op > limit) {
+ m_RawCC = (GLEDWORD)(op - m_RawData);
+ flushData();
+ op = m_RawData;
+ }
+ PutNextCode(op, ent);
+ ent = c;
+ hp->code = free_ent++;
+ hp->hash = fcode;
+ if (free_ent == CODE_MAX-1) {
+ /* table is full, emit clear code and reset */
+ GLELZWEncoderClearHash(sp);
+ sp->enc_ratio = 0;
+ incount = 0;
+ outcount = 0;
+ free_ent = CODE_FIRST;
+ PutNextCode(op, CODE_CLEAR);
+ nbits = BITS_MIN;
+ maxcode = MAXCODE(BITS_MIN);
+ } else {
+ /*
+ * If the next entry is going to be too big for
+ * the code size, then increase it, if possible.
+ */
+ if (free_ent > maxcode) {
+ nbits++;
+ // assert(nbits <= BITS_MAX);
+ maxcode = (int) MAXCODE(nbits);
+ } else if (incount >= checkpoint) {
+ long rat;
+ /*
+ * Check compression ratio and, if things seem
+ * to be slipping, clear the hash table and
+ * reset state. The compression ratio is a
+ * 24+8-bit fractional number.
+ */
+ checkpoint = incount+CHECK_GAP;
+ CALCRATIO(sp, rat);
+ if (rat <= sp->enc_ratio) {
+ GLELZWEncoderClearHash(sp);
+ sp->enc_ratio = 0;
+ incount = 0;
+ outcount = 0;
+ free_ent = CODE_FIRST;
+ PutNextCode(op, CODE_CLEAR);
+ nbits = BITS_MIN;
+ maxcode = MAXCODE(BITS_MIN);
+ } else {
+ sp->enc_ratio = rat;
+ }
+ }
+ }
+ hit:
+ ;
+ }
+ /*
+ * Restore global state.
+ */
+ sp->enc_incount = incount;
+ sp->enc_outcount = outcount;
+ sp->enc_checkpoint = checkpoint;
+ sp->enc_oldcode = ent;
+ sp->lzw_nextdata = nextdata;
+ sp->lzw_nextbits = nextbits;
+ sp->lzw_free_ent = free_ent;
+ sp->lzw_maxcode = maxcode;
+ sp->lzw_nbits = nbits;
+ m_RawCP = op;
+ return 1;
+}
+
+/*
+ * Finish off an encoded strip by flushing the last
+ * string and tacking on an End Of Information code.
+ */
+int GLELZWByteStream::postEncode() {
+ register encodeState *sp = (encodeState*)m_Data;
+ GLEBYTE* op = m_RawCP;
+ long nextbits = sp->lzw_nextbits;
+ long nextdata = sp->lzw_nextdata;
+ long outcount = sp->enc_outcount;
+ int nbits = sp->lzw_nbits;
+ if (op > sp->enc_rawlimit) {
+ m_RawCC = (GLEDWORD)(op - m_RawData);
+ flushData();
+ op = m_RawData;
+ }
+ if (sp->enc_oldcode != (hcode_t) -1) {
+ PutNextCode(op, sp->enc_oldcode);
+ sp->enc_oldcode = (hcode_t) -1;
+ }
+ PutNextCode(op, CODE_EOI);
+ if (nextbits > 0) {
+ *op++ = (unsigned char)(nextdata << (8-nextbits));
+ }
+ m_RawCC = (GLEDWORD)(op - m_RawData);
+ return 1;
+}
+
+void GLELZWByteStream::cleanUp() {
+ if (m_Data != NULL) {
+ if (((encodeState*)m_Data)->enc_hashtab != NULL) {
+ free(((encodeState*)m_Data)->enc_hashtab);
+ }
+ free(m_Data);
+ m_Data = NULL;
+ }
+}
+
+int GLELZWByteStream::init() {
+ m_Data = (GLEBYTE*) malloc(sizeof (encodeState));
+ if (m_Data == NULL) {
+ return 0;
+ }
+ ((encodeState*)m_Data)->enc_hashtab = NULL;
+ return 1;
+}
+
diff --git a/src/gle/bitmap/lzwencode.h b/src/gle/bitmap/lzwencode.h
new file mode 100644
index 0000000..c07e706
--- /dev/null
+++ b/src/gle/bitmap/lzwencode.h
@@ -0,0 +1,47 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+/*
+ * 2004 Jan Struyf
+ *
+ */
+
+#ifndef INC_LZWENCODE_H
+#define INC_LZWENCODE_H
+
+#endif
diff --git a/src/gle/builtin-double.cpp b/src/gle/builtin-double.cpp
new file mode 100644
index 0000000..a9efc3d
--- /dev/null
+++ b/src/gle/builtin-double.cpp
@@ -0,0 +1,25 @@
+
+#include "all.h"
+#include "gle-interface/gle-base.h"
+#include "gle-interface/gle-interface.h"
+#include "gle-interface/gle-datatype.h"
+#include "var.h"
+#include "sub.h"
+#include "builtin-double.h"
+
+GLEBuiltInBinaryDoubleDouble::GLEBuiltInBinaryDoubleDouble(const char* name, GLEBuiltInFactory* factory) {
+ setRoot(factory->createRoot(name, factory->getBinaryArgNamesXY()));
+ setArgTypeDefaults(factory->getBinaryDoubleDoubleArgTypeDefaults());
+}
+
+GLEBuiltInOpPlusDouble::GLEBuiltInOpPlusDouble(GLEBuiltInFactory* factory) : GLEBuiltInBinaryDoubleDouble("+", factory) {}
+
+void GLEBuiltInOpPlusDouble::execute(GLEArrayImpl* stack, unsigned int top) {
+}
+
+void initializeBuiltInDouble(GLESubMap* submap, GLEBuiltInFactory* factory) {
+
+
+
+ submap->add(new GLEBuiltInOpPlusDouble(factory)); /* +/2 operator */
+}
diff --git a/src/gle/builtin-double.h b/src/gle/builtin-double.h
new file mode 100644
index 0000000..338d5e9
--- /dev/null
+++ b/src/gle/builtin-double.h
@@ -0,0 +1,19 @@
+
+#ifndef BUILTINDOUBLE_H_
+#define BUILTINDOUBLE_H_
+
+class GLEBuiltInBinaryDoubleDouble : public GLEBuiltIn {
+public:
+ GLEBuiltInBinaryDoubleDouble(const char* name, GLEBuiltInFactory* factory);
+};
+
+class GLEBuiltInOpPlusDouble : public GLEBuiltInBinaryDoubleDouble {
+public:
+ GLEBuiltInOpPlusDouble(GLEBuiltInFactory* factory);
+ virtual void execute(GLEArrayImpl* stack, unsigned int top);
+};
+
+
+
+
+#endif
diff --git a/src/gle/cmdline.cpp b/src/gle/cmdline.cpp
new file mode 100644
index 0000000..d78b6ec
--- /dev/null
+++ b/src/gle/cmdline.cpp
@@ -0,0 +1,905 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+/*
+ * 2004 Jan Struyf
+ *
+ */
+
+#include <string.h>
+#include <string>
+#include <vector>
+#include <iostream>
+#include <stdlib.h>
+
+using namespace std;
+
+#include "tokens/stokenizer.h"
+#include "cmdline.h"
+#include "cutils.h"
+
+CmdLineOptionArg::CmdLineOptionArg(const char* name) {
+ m_Name = name;
+ m_MinCard = -1;
+ m_MaxCard = -1;
+ m_Card = 0;
+}
+
+CmdLineOptionArg::~CmdLineOptionArg() {
+}
+
+void CmdLineOptionArg::showExtraHelp() {
+}
+
+void CmdLineOptionArg::initArg() {
+}
+
+void CmdLineOptionArg::setDefaultValue() {
+}
+
+void CmdLineOptionArg::initShowError() {
+ cerr << ">> Option " << getObject()->getOptionPrefix() << getOption()->getName();
+ if (getOption()->getMaxNbArgs() != 1) {
+ cerr << " argument '" << getName() << "'";
+ }
+}
+
+bool CmdLineOptionArg::appendValue(const string& value) {
+ return addValue(value);
+}
+
+CmdLineOptionList* CmdLineOptionArg::getObject() {
+ return m_Option->getObject();
+}
+
+bool CmdLineOptionArg::needsComma() {
+ return false;
+}
+
+CmdLineArgString::CmdLineArgString(const char* name, bool unquote) : CmdLineOptionArg(name) {
+ m_Unquote = unquote;
+ setMaxCard(1);
+}
+
+CmdLineArgString::~CmdLineArgString() {
+}
+
+void CmdLineArgString::write(ostream& os) {
+ os << "\"" << m_Value << "\"";
+}
+
+void CmdLineArgString::reset() {
+ m_Value = "";
+ m_Card = 0;
+}
+
+bool CmdLineArgString::addValue(const string& value) {
+ m_Value = value;
+ if (m_Unquote) str_remove_quote(m_Value);
+ m_Card++;
+ return true;
+}
+
+void CmdLineArgString::setValue(const char* value) {
+ m_Value = value;
+ if (m_Unquote) str_remove_quote(m_Value);
+ m_Card = 1;
+}
+
+bool CmdLineArgString::appendValue(const string& value) {
+ if (m_Value == "") {
+ m_Value = value;
+ if (m_Unquote) str_remove_quote(m_Value);
+ } else {
+ string temp = value;
+ if (m_Unquote) str_remove_quote(temp);
+ m_Value += string(" ") + temp;
+ }
+ m_Card++;
+ return true;
+}
+
+void CmdLineArgString::setDefaultValue() {
+ m_Value = m_Default;
+ m_Card++;
+}
+
+bool CmdLineArgString::isDefault() {
+ return m_Value == m_Default;
+}
+
+bool CmdLineArgString::needsComma() {
+ return true;
+}
+
+CmdLineArgSPairList::CmdLineArgSPairList(const char* name) : CmdLineOptionArg(name) {
+ setMaxCard(1);
+}
+
+CmdLineArgSPairList::~CmdLineArgSPairList() {
+}
+
+void CmdLineArgSPairList::write(ostream& os) {
+ if (size() != 0) {
+ os << "\"" << getValue1(0) << "\",\"" << getValue2(0) << "\"" << endl;
+ for (int i = 1; i < size(); i++) {
+ os << "\t" << getName() << " += \"" << getValue1(i) << "\",\"" << getValue2(i) << "\"";
+ if (i != size()-1) os << endl;
+ }
+ }
+}
+
+void CmdLineArgSPairList::reset() {
+ m_Card = 0;
+ m_Value1.clear();
+ m_Value2.clear();
+}
+
+bool CmdLineArgSPairList::addValue(const string& value) {
+ m_Card++;
+ return true;
+}
+
+bool CmdLineArgSPairList::appendValue(const string& value) {
+ level_char_separator separator(" ,", "", "\"", "\"");
+ tokenizer<level_char_separator> tokens(value, separator);
+ string s1 = tokens.has_more() ? tokens.next_token() : "?";
+ string s2 = tokens.has_more() ? tokens.next_token() : "?";
+ str_remove_quote(s1);
+ str_remove_quote(s2);
+ addPair(s1, s2);
+ m_Card++;
+ return true;
+}
+
+void CmdLineArgSPairList::setDefaultValue() {
+ reset();
+ m_Card++;
+}
+
+bool CmdLineArgSPairList::isDefault() {
+ return m_Value1.size() == 0 && m_Value2.size() == 0;
+}
+
+void CmdLineArgSPairList::addPair(const string& s1, const string& s2) {
+ m_Value1.push_back(s1);
+ m_Value2.push_back(s2);
+}
+
+void CmdLineArgSPairList::addPairValue2(const string& s2) {
+ m_Value1.push_back("");
+ m_Value2.push_back(s2);
+}
+
+bool CmdLineArgSPairList::hasValue2(const string& s2) {
+ for (vector<string>::size_type i = 0; i < m_Value2.size(); i++) {
+ if (m_Value2[i] == s2) return true;
+ }
+ return false;
+}
+
+const string* CmdLineArgSPairList::lookup(const string& s1) {
+ for (vector<string>::size_type i = 0; i < m_Value1.size(); i++) {
+ if (m_Value1[i] == s1) return &m_Value2[i];
+ }
+ return NULL;
+}
+
+CmdLineArgInt::CmdLineArgInt(const char* name) : CmdLineOptionArg(name) {
+ setMaxCard(1);
+}
+
+CmdLineArgInt::~CmdLineArgInt() {
+}
+
+void CmdLineArgInt::write(ostream& os) {
+ os << m_Value;
+}
+
+void CmdLineArgInt::reset() {
+ m_Value = 0;
+ m_Card = 0;
+}
+
+bool CmdLineArgInt::addValue(const string& value) {
+ for (string::size_type i = 0; i < value.length(); i++) {
+ if (value[i] < '0' || value[i] > '9') {
+ initShowError();
+ cerr << " illegal value '" << value << "'" << endl;
+ return false;
+ }
+ }
+ m_Value = atoi(value.c_str());
+ m_Card++;
+ return true;
+}
+
+void CmdLineArgInt::setValue(int value) {
+ m_Value = value;
+ m_Card++;
+}
+
+void CmdLineArgInt::setDefaultValue() {
+ m_Value = m_Default;
+ m_Card++;
+}
+
+bool CmdLineArgInt::isDefault() {
+ return m_Value == m_Default;
+}
+
+CmdLineArgSet::CmdLineArgSet(const char* name) : CmdLineOptionArg(name) {
+}
+
+CmdLineArgSet::~CmdLineArgSet() {
+}
+
+bool CmdLineArgSet::addValue(const string& value) {
+ for (vector<string>::size_type i = 0; i < m_Values.size(); i++) {
+ if (str_i_equals(m_Values[i], value)) {
+ if (m_HasValue[i] == CMDLINE_NO) {
+ m_HasValue[i] = CMDLINE_YES;
+ m_Card++;
+ return true;
+ }
+ }
+ }
+ initShowError();
+ cerr << " illegal value '" << value << "'" << endl;
+ return false;
+}
+
+void CmdLineArgSet::removeValue(int i) {
+ if (m_HasValue[i] == CMDLINE_YES) {
+ m_HasValue[i] = CMDLINE_NO;
+ m_Card--;
+ }
+}
+
+void CmdLineArgSet::addValue(int i) {
+ if (m_HasValue[i] == CMDLINE_NO) {
+ m_HasValue[i] = CMDLINE_YES;
+ m_Card++;
+ }
+}
+
+int CmdLineArgSet::getFirstValue() {
+ for (vector<int>::size_type i = 0; i < m_Values.size(); i++) {
+ if (m_HasValue[i] == CMDLINE_YES) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+void CmdLineArgSet::write(ostream& os) {
+ bool prev = false;
+ for (vector<int>::size_type i = 0; i < m_Values.size(); i++) {
+ if (m_HasValue[i] == CMDLINE_YES) {
+ if (prev) { os << " "; } else { prev = true; }
+ os << m_Values[i];
+ }
+ }
+}
+
+void CmdLineArgSet::reset() {
+ for (vector<int>::size_type i = 0; i < m_Values.size(); i++) {
+ if (m_HasValue[i] != CMDLINE_UNSUPPORTED) {
+ m_HasValue[i] = CMDLINE_NO;
+ }
+ }
+ m_Card = 0;
+}
+
+void CmdLineArgSet::setDefaultValue() {
+ for (vector<int>::size_type i = 0; i < m_Defaults.size(); i++) {
+ m_HasValue[m_Defaults[i]] = CMDLINE_YES;
+ m_Card++;
+ }
+}
+
+bool CmdLineArgSet::isDefault() {
+ for (vector<int>::size_type i = 0; i < m_Values.size(); i++) {
+ if (m_HasValue[i] != CMDLINE_UNSUPPORTED) {
+ bool yes = m_HasValue[i] == CMDLINE_YES;
+ bool default_yes = false;
+ for (vector<int>::size_type j = 0; j < m_Defaults.size(); j++) {
+ if (m_Defaults[j] == (int)i) {
+ default_yes = true;
+ }
+ }
+ if (yes != default_yes) return false;
+ }
+ }
+ return true;
+}
+
+void CmdLineArgSet::showExtraHelp() {
+ cerr << " Possible values: ";
+ for (vector<int>::size_type i = 0; i < m_Values.size(); i++) {
+ if (m_HasValue[i] != CMDLINE_UNSUPPORTED) {
+ if (i != 0) cerr << ", ";
+ cerr << m_Values[i];
+ }
+ }
+ cerr << endl;
+}
+
+void CmdLineArgSet::addPossibleValue(const char* value) {
+ m_Values.push_back(string(value));
+ m_HasValue.push_back(CMDLINE_NO);
+}
+
+bool CmdLineArgSet::hasOnlyValue(int id) {
+ if (!hasValue(id)) return false;
+ for (vector<int>::size_type i = 0; i < m_Values.size(); i++) {
+ if (i != (unsigned int)id && m_HasValue[i] == CMDLINE_YES) {
+ return false;
+ }
+ }
+ return true;
+}
+
+vector<string> CmdLineArgSet::getValues() {
+ vector<string> result;
+ for (vector<int>::size_type i = 0; i < m_Values.size(); i++) {
+ if (m_HasValue[i] == CMDLINE_YES) {
+ result.push_back(m_Values[i]);
+ }
+ }
+ return result;
+}
+
+CmdLineOption::CmdLineOption(const char* name) {
+ addAlias(name);
+ initialize();
+}
+
+CmdLineOption::CmdLineOption(const char* name, const char* alias) {
+ addAlias(name); addAlias(alias);
+ initialize();
+}
+
+CmdLineOption::CmdLineOption(const char* name, const char* alias1, const char* alias2) {
+ addAlias(name); addAlias(alias1); addAlias(alias2);
+ initialize();
+}
+
+CmdLineOption::~CmdLineOption() {
+ deleteArgs();
+}
+
+void CmdLineOption::initialize() {
+ m_HasOption = false;
+ m_Expert = false;
+ m_MinNbArgs = 0;
+ m_NbArgs = 0;
+}
+
+void CmdLineOption::deleteArgs() {
+ for (vector<CmdLineOptionArg*>::size_type i = 0; i < m_Args.size(); i++) {
+ if (m_Args[i] != NULL) {
+ delete m_Args[i];
+ m_Args[i] = NULL;
+ }
+ }
+}
+
+void CmdLineOption::initOption() {
+ for (vector<CmdLineOptionArg*>::size_type i = 0; i < m_Args.size(); i++) {
+ if (m_Args[i] != NULL) {
+ m_Args[i]->initArg();
+ }
+ }
+}
+
+void CmdLineOption::setDefaultValues() {
+ for (vector<CmdLineOptionArg*>::size_type i = 0; i < m_Args.size(); i++) {
+ if (m_Args[i] != NULL) {
+ m_Args[i]->setDefaultValue();
+ }
+ }
+}
+
+bool CmdLineOption::allDefaults() {
+ for (vector<CmdLineOptionArg*>::size_type i = 0; i < m_Args.size(); i++) {
+ if (m_Args[i] != NULL) {
+ if (!m_Args[i]->isDefault()) return false;
+ }
+ }
+ return true;
+}
+
+void CmdLineOption::addArg(CmdLineOptionArg* arg) {
+ m_Args.push_back(arg);
+ arg->setOption(this);
+ int nb = m_Args.size();
+ if (m_MinNbArgs < nb) m_MinNbArgs = nb;
+}
+
+void CmdLineOption::addAlias(const char* alias) {
+ m_Names.push_back(string(alias));
+}
+
+void CmdLineOption::showHelp() {
+ cerr << "Option: " << getObject()->getOptionPrefix() << getName() << endl;
+ if (getNbNames() > 1) {
+ cerr << "Abbreviation(s): ";
+ for (int i = 1; i < getNbNames(); i++) {
+ if (i != 1) cerr << ", ";
+ cerr << getObject()->getOptionPrefix() << getName(i);
+ }
+ cerr << endl;
+ }
+ cerr << getHelp() << endl;
+ for (int i = 0; i < getMaxNbArgs(); i++) {
+ CmdLineOptionArg* argi = getArg(i);
+ cerr << " Argument '" << argi->getName() << "': " << argi->getHelp() << endl;
+ argi->showExtraHelp();
+ }
+}
+
+CmdLineOptionList::CmdLineOptionList() {
+ m_Error = 0;
+}
+
+CmdLineOptionList::~CmdLineOptionList() {
+ deleteOptions();
+}
+
+void CmdLineOptionList::deleteOptions() {
+ for (vector<CmdLineOption*>::size_type i = 0; i < m_Options.size(); i++) {
+ if (m_Options[i] != NULL) {
+ delete m_Options[i];
+ m_Options[i] = NULL;
+ }
+ }
+}
+
+void CmdLineOptionList::initOptions() {
+ for (vector<CmdLineOption*>::size_type i = 0; i < m_Options.size(); i++) {
+ if (m_Options[i] != NULL) {
+ m_Options[i]->initOption();
+ }
+ }
+}
+
+void CmdLineOptionList::setDefaultValues() {
+ for (vector<CmdLineOption*>::size_type i = 0; i < m_Options.size(); i++) {
+ CmdLineOption* opt = m_Options[i];
+ if (opt != NULL && !opt->hasOption()) {
+ opt->setDefaultValues();
+ }
+ }
+}
+
+void CmdLineOptionList::clearAll() {
+ for (vector<CmdLineOption*>::size_type i = 0; i < m_Options.size(); i++) {
+ CmdLineOption* opt = m_Options[i];
+ if (opt != NULL) opt->setHasOption(false);
+ }
+ setDefaultValues();
+}
+
+bool CmdLineOptionList::allDefaults() {
+ for (vector<CmdLineOption*>::size_type i = 0; i < m_Options.size(); i++) {
+ if (m_Options[i] != NULL) {
+ if (!m_Options[i]->allDefaults()) return false;
+ }
+ }
+ return true;
+}
+
+CmdLineOption* CmdLineOptionList::getOption(const string& name) {
+ for (vector<CmdLineOption*>::size_type i = 0; i < m_Options.size(); i++) {
+ CmdLineOption* opt = m_Options[i];
+ if (opt != NULL) {
+ for (int j = 0; j < opt->getNbNames(); j++) {
+ if (str_i_equals(opt->getName(j), name)) {
+ return opt;
+ }
+ }
+ }
+ }
+ return NULL;
+}
+
+void CmdLineOptionList::setHasOption(const string& name) {
+ CmdLineOption* opt = getOption(name);
+ if (opt != NULL) opt->setHasOption(true);
+}
+
+void CmdLineOptionList::setOptionString(const string& name, const string& value, int arg) {
+ CmdLineOption* opt = getOption(name);
+ if (opt != NULL) {
+ opt->setHasOption(true);
+ CmdLineOptionArg* carg = opt->getArg(arg);
+ carg->addValue(value);
+ }
+}
+
+CmdLineOption* CmdLineOptionList::createOption(int id) {
+ CmdLineOption* opt = getOption(id);
+ if (opt != NULL) opt->setHasOption(true);
+ return opt;
+}
+
+void CmdLineOptionList::showHelp(int helpid) {
+ bool expert = false;
+ CmdLineOption* help = getOption(helpid);
+ CmdLineArgString* item = (CmdLineArgString*)help->getArg(0);
+ if (item->getCard() == 1) {
+ const string& value = item->getValue();
+ if (value == "expert") {
+ expert = true;
+ } else {
+ CmdLineOption* opt = getOption(value);
+ if (opt == NULL) {
+ cerr << ">> Unknown option '" << getOptionPrefix() << value << "'" << endl;
+ } else {
+ cerr << endl;
+ opt->showHelp();
+ }
+ return;
+ }
+ }
+ cerr << endl << "Options:" << endl;
+ for (vector<CmdLineOption*>::size_type i = 0; i < m_Options.size(); i++) {
+ CmdLineOption* opt = m_Options[i];
+ if (opt != NULL && (!opt->isExpert() || expert)) {
+ string str = " ";
+ str += getOptionPrefix();
+ str += opt->getName();
+ cerr << str;
+ for (int i = str.length(); i < 17; i++) cerr << ' ';
+ cerr << opt->getHelp() << endl;
+ }
+ }
+ if (!expert) cerr << endl << "Show expert options: " << getOptionPrefix() << "help expert" << endl;
+}
+
+bool CmdLineOptionList::hasOption(const string& name) {
+ CmdLineOption* option = getOption(name);
+ return option != 0 && option->hasOption();
+}
+
+bool CmdLineOptionList::hasOption(int id) {
+ if (id >= (int)m_Options.size()) return false;
+ if (m_Options[id] == NULL) return false;
+ return m_Options[id]->hasOption();
+}
+
+void CmdLineOptionList::setHasOption(int id, bool set) {
+ return m_Options[id]->setHasOption(set);
+}
+
+char CmdLineOptionList::getOptionPrefix() {
+#ifdef __WIN32__
+ return '/';
+#else
+ return '-';
+#endif
+}
+
+void CmdLineOptionList::addOption(CmdLineOption* option, int id) {
+ int size = m_Options.size();
+ if (id >= size) {
+ m_Options.reserve(id+1);
+ for (int i = size; i <= id; i++) m_Options.push_back(NULL);
+ }
+ option->setObject(this);
+ m_Options[id] = option;
+}
+
+CmdLineArgString* CmdLineOptionList::addStringOption(const char* name, int id) {
+ CmdLineOption* opt = new CmdLineOption(name);
+ CmdLineArgString* arg = new CmdLineArgString("");
+ opt->addArg(arg);
+ addOption(opt, id);
+ return arg;
+}
+
+CmdLineArgSPairList* CmdLineOptionList::addSPairListOption(const char* name, int id) {
+ CmdLineOption* opt = new CmdLineOption(name);
+ CmdLineArgSPairList* arg = new CmdLineArgSPairList(name);
+ opt->addArg(arg);
+ addOption(opt, id);
+ return arg;
+}
+
+ConfigSection::ConfigSection(const char* name) {
+ m_Name = name;
+}
+
+ConfigSection::~ConfigSection() {
+}
+
+ConfigCollection::ConfigCollection() {
+}
+
+ConfigCollection::~ConfigCollection() {
+ deleteSections();
+}
+
+void ConfigCollection::deleteSections() {
+ for (vector<ConfigSection*>::size_type i = 0; i < m_Sections.size(); i++) {
+ if (m_Sections[i] != NULL) {
+ delete m_Sections[i];
+ m_Sections[i] = NULL;
+ }
+ }
+}
+
+void ConfigCollection::setDefaultValues() {
+ for (vector<ConfigSection*>::size_type i = 0; i < m_Sections.size(); i++) {
+ if (m_Sections[i] != NULL) {
+ m_Sections[i]->setDefaultValues();
+ }
+ }
+}
+
+bool ConfigCollection::allDefaults() {
+ for (vector<ConfigSection*>::size_type i = 0; i < m_Sections.size(); i++) {
+ if (m_Sections[i] != NULL) {
+ if (!m_Sections[i]->allDefaults()) return false;
+ }
+ }
+ return true;
+}
+
+void ConfigCollection::addSection(ConfigSection* section, int id) {
+ int size = m_Sections.size();
+ if (id >= size) {
+ m_Sections.reserve(id+1);
+ for (int i = size; i <= id; i++) m_Sections.push_back(NULL);
+ }
+ m_Sections[id] = section;
+}
+
+ConfigSection* ConfigCollection::getSection(const string& name) {
+ for (vector<ConfigSection*>::size_type i = 0; i < m_Sections.size(); i++) {
+ ConfigSection* sec = m_Sections[i];
+ if (sec != NULL && str_i_equals(sec->getName(), name)) {
+ return sec;
+ }
+ }
+ return NULL;
+}
+
+void ConfigCollection::setStringValue(int section, int value, const char* str) {
+ ConfigSection* sec = getSection(section);
+ ((CmdLineArgString*)sec->getOptionValue(value))->setValue(str);
+}
+
+const string& ConfigCollection::getStringValue(int section, int value) {
+ ConfigSection* sec = getSection(section);
+ return ((CmdLineArgString*)sec->getOptionValue(value))->getValue();
+}
+
+CmdLineObj::CmdLineObj() {
+ m_ArgC = 0;
+ m_ArgIdx = 0;
+ m_ArgV = NULL;
+ m_MArgSepPos = -1;
+ m_HasStdin = false;
+}
+
+CmdLineObj::~CmdLineObj() {
+}
+
+const char* CmdLineObj::getNextArg() {
+ return m_ArgIdx >= m_ArgC ? NULL : m_ArgV[m_ArgIdx++];
+}
+
+bool CmdLineObj::parseOptionArg(bool inmainargs, const string& optionname, int argidx, CmdLineOption** cropt_p) {
+ if (inmainargs) {
+ cerr << ">> Options should come before " << m_MainArgType << " arguments" << endl;
+ m_Error = 1;
+ return false;
+ }
+ CmdLineOption* cropt = *cropt_p;
+ if (cropt != NULL) {
+ if (argidx < cropt->getMinNbArgs()) {
+ cerr << ">> Option '" << cropt->getName() << "' requires "
+ << cropt->getMinNbArgs() << " arguments" << endl;
+ m_Error = 1;
+ return false;
+ }
+ // Set default values for all arguments not given
+ for (int i = argidx; i < cropt->getMaxNbArgs(); i++) {
+ cropt->getArg(i)->setDefaultValue();
+ }
+ }
+ cropt = *cropt_p = getOption(optionname);
+ if (cropt == NULL) {
+ cerr << ">> Unknown option '" << getOptionPrefix() << optionname << "'" << endl;
+ m_Error = 1;
+ return false;
+ } else {
+ cropt->setHasOption(true);
+ }
+ return true;
+}
+
+bool CmdLineObj::isMainArgSeparator(const string& arg) {
+ for (vector<string>::size_type i = 0; i < m_MArgSep.size(); i++) {
+ // cout << "Sep = " << m_MArgSep[i] << " Arg = " << arg << endl;
+ if (str_i_equals(m_MArgSep[i], arg)) {
+ return true;
+ }
+ }
+ return false;
+}
+
+int CmdLineObj::getIntValue(int option, int arg) {
+ CmdLineArgInt* intval = (CmdLineArgInt*)getOption(option)->getArg(arg);
+ return intval->getValue();
+}
+
+void CmdLineObj::setIntValue(int option, int value, int arg) {
+ CmdLineArgInt* intval = (CmdLineArgInt*)getOption(option)->getArg(arg);
+ intval->setValue(value);
+}
+
+const string& CmdLineObj::getStringValue(int option, int arg) {
+ CmdLineArgString* strval = (CmdLineArgString*)getOption(option)->getArg(arg);
+ return strval->getValue();
+}
+
+int CmdLineObj::getNbMainArgs() {
+ return m_MArgSepPos == -1 ? m_MainArgs.size() : m_MArgSepPos;
+}
+
+const string& CmdLineObj::getMainArg(int i) {
+ return m_MainArgs[i];
+}
+
+int CmdLineObj::getNbExtraArgs() {
+ return m_MArgSepPos == -1 ? 0 : m_MainArgs.size() - m_MArgSepPos;
+}
+
+const string& CmdLineObj::getExtraArg(int i) {
+ return m_MainArgs[i + m_MArgSepPos];
+}
+
+bool CmdLineObj::checkForStdin() {
+ for (int i = 0; i < getNbMainArgs(); i++) {
+ const string& arg = getMainArg(i);
+ if (arg == "-") {
+ m_HasStdin = true;
+ m_MainArgs.erase(m_MainArgs.begin()+i);
+ if (i < getNbMainArgs()) {
+ /* after stdin marker, assume only extra args */
+ setMainArgSepPos(i);
+ }
+ return true;
+ }
+ }
+ return false;
+}
+
+void CmdLineObj::parse(int argc, char** argv) {
+ const char* crarg;
+ m_ArgC = argc;
+ m_ArgV = argv;
+ m_ArgIdx = 1;
+ int argidx = 0;
+ bool inmainargs = false;
+ CmdLineOption* cropt = NULL;
+ while ((crarg = getNextArg()) != NULL) {
+ int len = strlen(crarg);
+#ifdef __WIN32__
+ /* Also allow options with prefix '/' on Windows */
+ /* On Unix, '/' might be the start of an absolute path !! */
+ if (len >= 2 && (crarg[0] == '-' || crarg[0] == '/')) {
+#else
+ if (len >= 2 && crarg[0] == '-') {
+#endif
+ string optionname;
+ if (crarg[1] == '-') {
+ optionname = crarg+2;
+ } else {
+ optionname = crarg+1;
+ }
+ if (inmainargs && isMainArgSeparator(optionname)) {
+ if (getMainArgSepPos() != -1) {
+ cerr << ">> Only one extra argument separator allowed" << endl;
+ m_Error = 1;
+ return;
+ }
+ setMainArgSepPos(getNbMainArgs());
+ } else {
+ if (parseOptionArg(inmainargs, optionname, argidx, &cropt)) {
+ argidx = 0;
+ } else {
+ return;
+ }
+ }
+ } else {
+ if (cropt != NULL && argidx < cropt->getMaxNbArgs()) {
+ /* Assume extra argument for current option */
+ addOptionArg(cropt, argidx, string(crarg));
+ if (hasError()) return;
+ argidx++;
+ } else {
+ /* Assume main argument */
+ inmainargs = true;
+ m_MainArgs.push_back(string(crarg));
+ }
+ }
+ }
+ setDefaultValues();
+}
+
+void CmdLineObj::addOptionArg(CmdLineOption* cropt, int argidx, const string& crarg) {
+ CmdLineOptionArg* arg = cropt->getArg(argidx);
+ if (arg->needsComma()) {
+ if (arg->getMaxCard() == -1 || arg->getCard() < arg->getMaxCard()) {
+ if (!arg->addValue(crarg)) {
+ m_Error = 1;
+ }
+ }
+ return;
+ }
+ char_separator separator(",", "", drop_empty_tokens);
+ tokenizer<char_separator> tokens(crarg, separator);
+ while (tokens.has_more()) {
+ if (arg->getMaxCard() == -1 || arg->getCard() < arg->getMaxCard()) {
+ if (!arg->addValue(tokens.next_token())) {
+ m_Error = 1;
+ }
+ } else {
+ cerr << ">> Option '" << getOptionPrefix() << cropt->getName() << "'";
+ if (cropt->getMaxNbArgs() > 1) {
+ cerr << " argument " << argidx << " (" << arg->getName() << ")";
+ }
+ cerr << " takes at most " << arg->getMaxCard() << " value(s)" << endl;
+ m_Error = 1;
+ return;
+ }
+ }
+}
+
+bool cmdline_is_option(const char* opt, const char* val) {
+ bool is_option = false;
+ if (opt != NULL && opt[0] == '-') is_option = true;
+#ifdef __WIN32__
+ if (opt != NULL && opt[0] == '/') is_option = true;
+#endif
+ return is_option && str_i_equals(opt+1, val);
+}
diff --git a/src/gle/cmdline.h b/src/gle/cmdline.h
new file mode 100644
index 0000000..5d888d0
--- /dev/null
+++ b/src/gle/cmdline.h
@@ -0,0 +1,316 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+/*
+ * 2004 Jan Struyf
+ *
+ */
+
+#ifndef INCLUDE_CMDLINE
+#define INCLUDE_CMDLINE
+
+class CmdLineOptionList;
+class CmdLineOption;
+
+bool cmdline_is_option(const char* opt, const char* val);
+
+class CmdLineOptionArg {
+protected:
+ int m_MinCard, m_MaxCard, m_Card;
+ string m_Help, m_Name;
+ CmdLineOption* m_Option;
+public:
+ CmdLineOptionArg(const char* name);
+ virtual ~CmdLineOptionArg();
+ virtual bool isDefault() = 0;
+ virtual void reset() = 0;
+ virtual void write(ostream& os) = 0;
+ virtual bool addValue(const string& value) = 0;
+ virtual bool appendValue(const string& value);
+ virtual void showExtraHelp();
+ virtual void initArg();
+ virtual void setDefaultValue();
+ virtual bool needsComma();
+ void initShowError();
+ CmdLineOptionList* getObject();
+ inline int getCard() { return m_Card; }
+ inline int getMinCard() { return m_MinCard; }
+ inline int getMaxCard() { return m_MaxCard; }
+ inline void setCardLimits(int min, int max) { m_MinCard = min; m_MaxCard = max; }
+ inline void setMinCard(int card) { m_MinCard = card; }
+ inline void setMaxCard(int card) { m_MaxCard = card; }
+ inline const string& getHelp() { return m_Help; }
+ inline void setHelp(const char* help) { m_Help = help; }
+ inline const string& getName() { return m_Name; }
+ inline CmdLineOption* getOption() { return m_Option; }
+ inline void setOption(CmdLineOption* option) { m_Option = option; }
+};
+
+class CmdLineArgString : public CmdLineOptionArg {
+protected:
+ bool m_Unquote;
+ string m_Value;
+ string m_Default;
+public:
+ CmdLineArgString(const char* name, bool unquote = true);
+ ~CmdLineArgString();
+ virtual bool isDefault();
+ virtual void reset();
+ virtual void write(ostream& os);
+ virtual bool addValue(const string& value);
+ virtual bool appendValue(const string& value);
+ virtual void setDefaultValue();
+ virtual bool needsComma();
+ void setValue(const char* value);
+ inline const string& getValue() { return m_Value; }
+ inline void setDefault(const char* value) { m_Default = value; }
+ inline const string& getDefault() { return m_Default; }
+ inline string* getValuePtr() { return &m_Value; }
+};
+
+class CmdLineArgSPairList : public CmdLineOptionArg {
+protected:
+ vector<string> m_Value1;
+ vector<string> m_Value2;
+public:
+ CmdLineArgSPairList(const char* name);
+ ~CmdLineArgSPairList();
+ virtual bool isDefault();
+ virtual void reset();
+ virtual void write(ostream& os);
+ virtual bool addValue(const string& value);
+ virtual bool appendValue(const string& value);
+ virtual void setDefaultValue();
+ void addPair(const string& s1, const string& s2);
+ void addPairValue2(const string& s2);
+ bool hasValue2(const string& s2);
+ const string* lookup(const string& s1);
+ inline string& getValue1(int i) { return m_Value1[i]; }
+ inline string& getValue2(int i) { return m_Value2[i]; }
+ inline void setValue1(int i, const string& s1) { m_Value1[i] = s1; }
+ inline void setValue2(int i, const string& s2) { m_Value2[i] = s2; }
+ inline int size() { return m_Value1.size(); }
+};
+
+class CmdLineArgInt : public CmdLineOptionArg {
+protected:
+ int m_Value;
+ int m_Default;
+public:
+ CmdLineArgInt(const char* name);
+ ~CmdLineArgInt();
+ virtual bool isDefault();
+ virtual void reset();
+ virtual void write(ostream& os);
+ virtual bool addValue(const string& value);
+ virtual void setDefaultValue();
+ virtual void setValue(int value);
+ inline const int getValue() { return m_Value; }
+ inline void setDefault(int value) { m_Default = value; }
+};
+
+#define CMDLINE_NO 0
+#define CMDLINE_YES 1
+#define CMDLINE_UNSUPPORTED 2
+
+class CmdLineArgSet : public CmdLineOptionArg {
+protected:
+ vector<string> m_Values;
+ vector<int> m_HasValue;
+ vector<int> m_Defaults;
+public:
+ CmdLineArgSet(const char* name);
+ ~CmdLineArgSet();
+ virtual bool isDefault();
+ virtual void reset();
+ virtual void write(ostream& os);
+ virtual bool addValue(const string& value);
+ virtual void showExtraHelp();
+ virtual void setDefaultValue();
+ int getFirstValue();
+ void addValue(int i);
+ void removeValue(int i);
+ void addPossibleValue(const char* value);
+ bool hasOnlyValue(int id);
+ vector<string> getValues();
+ inline void setUnsupportedValue(int id) { m_HasValue[id] = CMDLINE_UNSUPPORTED; }
+ inline void addDefaultValue(int id) { m_Defaults.push_back(id); }
+ inline int getNbValues() { return m_Values.size(); }
+ inline bool hasValue(int id) { return m_HasValue[id] == CMDLINE_YES; }
+ inline const string& getStringValue(int id) { return m_Values[id]; }
+};
+
+class CmdLineOption {
+protected:
+ bool m_HasOption, m_Expert;
+ int m_MinNbArgs, m_NbArgs;
+ vector<string> m_Names;
+ vector<CmdLineOptionArg*> m_Args;
+ CmdLineOptionList* m_Object;
+ string m_Help;
+public:
+ CmdLineOption(const char* name);
+ CmdLineOption(const char* name, const char* alias);
+ CmdLineOption(const char* name, const char* alias1, const char* alias2);
+ ~CmdLineOption();
+ void initialize();
+ void deleteArgs();
+ void addAlias(const char* alias);
+ void showHelp();
+ void initOption();
+ void setDefaultValues();
+ void addArg(CmdLineOptionArg* arg);
+ bool allDefaults();
+ inline int getNbNames() { return m_Names.size(); }
+ inline const string& getName(int i) { return m_Names[i]; }
+ inline const string& getName() { return m_Names[0]; }
+ inline int getMinNbArgs() { return m_MinNbArgs; }
+ inline int getMaxNbArgs() { return m_Args.size(); }
+ inline int getNbArgs() { return m_NbArgs; }
+ inline CmdLineOptionArg* getArg(int i) { return m_Args[i]; }
+ inline bool hasOption() { return m_HasOption; }
+ inline void setHasOption(bool has) { m_HasOption = has; }
+ inline void setMinNbArgs(int min) { m_MinNbArgs = min; }
+ inline const string& getHelp() { return m_Help; }
+ inline void setHelp(const char* help) { m_Help = help; }
+ inline bool isExpert() { return m_Expert; }
+ inline void setExpert(bool expert) { m_Expert = expert; }
+ inline CmdLineOptionList* getObject() { return m_Object; }
+ inline void setObject(CmdLineOptionList* obj) { m_Object = obj; }
+ inline bool hasArgument() { return getArg(0)->getCard() != 0; }
+};
+
+class CmdLineOptionList {
+protected:
+ vector<CmdLineOption*> m_Options;
+ int m_Error;
+public:
+ CmdLineOptionList();
+ ~CmdLineOptionList();
+ void addOption(CmdLineOption* option, int id);
+ CmdLineOption* getOption(const string& name);
+ CmdLineOption* createOption(int id);
+ CmdLineArgString* addStringOption(const char* name, int id);
+ CmdLineArgSPairList* addSPairListOption(const char* name, int id);
+ void deleteOptions();
+ char getOptionPrefix();
+ void showHelp(int helpid);
+ void initOptions();
+ void setDefaultValues();
+ bool allDefaults();
+ void clearAll();
+ bool hasOption(const string& name);
+ bool hasOption(int id);
+ void setHasOption(const string& name);
+ void setOptionString(const string& name, const string& value, int arg = 0);
+ void setHasOption(int id, bool set);
+ inline int hasError() { return m_Error == 1; }
+ inline int getNbOptions() { return m_Options.size(); }
+ inline CmdLineOption* getOption(int i) { return m_Options[i]; }
+ inline CmdLineOptionArg* getOptionValue(int i) { return m_Options[i]->getArg(0); }
+ inline const string& getOptionString(int id, int nr = 0) {
+ return ((CmdLineArgString*)m_Options[id]->getArg(nr))->getValue();
+ }
+ inline int getOptionInt(int id, int nr = 0) {
+ return ((CmdLineArgInt*)m_Options[id]->getArg(nr))->getValue();
+ }
+};
+
+class ConfigSection : public CmdLineOptionList {
+protected:
+ string m_Name;
+public:
+ ConfigSection(const char* name);
+ ~ConfigSection();
+ inline const string& getName() { return m_Name; }
+ inline void setName(const char* name) { m_Name = name; }
+};
+
+class ConfigCollection {
+protected:
+ vector<ConfigSection*> m_Sections;
+public:
+ ConfigCollection();
+ ~ConfigCollection();
+ void deleteSections();
+ bool allDefaults();
+ void setDefaultValues();
+ void addSection(ConfigSection* section, int id);
+ ConfigSection* getSection(const string& name);
+ const string& getStringValue(int section, int value);
+ void setStringValue(int section, int value, const char* str);
+ inline int getNbSections() { return m_Sections.size(); }
+ inline ConfigSection* getSection(int id) { return m_Sections[id]; };
+};
+
+class CmdLineObj : public CmdLineOptionList {
+protected:
+ string m_MainArgType;
+ vector<string> m_MainArgs;
+ vector<string> m_MArgSep;
+ int m_ArgC, m_ArgIdx;
+ int m_MArgSepPos;
+ bool m_HasStdin;
+ char** m_ArgV;
+public:
+ CmdLineObj();
+ ~CmdLineObj();
+ void parse(int argc, char** argv);
+ const char* getNextArg();
+ void addOptionArg(CmdLineOption* cropt, int argidx, const string& crarg);
+ bool parseOptionArg(bool inmainargs, const string& optionname, int argidx, CmdLineOption** cropt_p);
+ bool isMainArgSeparator(const string& arg);
+ int getNbMainArgs();
+ const string& getMainArg(int i);
+ int getNbExtraArgs();
+ const string& getExtraArg(int i);
+ const string& getStringValue(int option, int arg = 0);
+ int getIntValue(int option, int arg = 0);
+ void setIntValue(int option, int value, int arg = 0);
+ bool checkForStdin();
+ inline bool hasStdin() { return m_HasStdin; }
+ inline bool supportsExtraArgs() { return m_MArgSep.size() != 0; }
+ inline const string& getMainArgSep(int i) { return m_MArgSep[i]; }
+ inline int getMainArgSepPos() { return m_MArgSepPos; }
+ inline void setMainArgSepPos(int pos) { m_MArgSepPos = pos; }
+ inline void setMainArgType(const char* type) { m_MainArgType = type; }
+ inline void addMainArgSep(const char* sep) { m_MArgSep.push_back(sep); }
+ inline vector<string>* getMainArgs() { return &m_MainArgs; }
+};
+
+#endif
diff --git a/src/gle/color.cpp b/src/gle/color.cpp
new file mode 100644
index 0000000..f31525d
--- /dev/null
+++ b/src/gle/color.cpp
@@ -0,0 +1,447 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#include <fstream>
+
+#include "all.h"
+#include "cutils.h"
+#include "gle-interface/gle-interface.h"
+#include "color.h"
+
+GLEColorList* g_ColorList = NULL;
+
+GLEColorList* GLEGetColorList() {
+ if (g_ColorList == NULL) {
+ g_ColorList = new GLEColorList();
+ g_ColorList->defineDefaultColors();
+ }
+ return g_ColorList;
+}
+
+GLEColorList::GLEColorList() {
+}
+
+GLEColorList::~GLEColorList() {
+}
+
+void GLEColorList::reset() {
+ m_Colors.clear();
+ m_ColorHash.clear();
+ m_OldColors.clear();
+ m_OldColorHash.clear();
+ defineDefaultColors();
+}
+
+GLEColor* GLEColorList::get(const string& name) {
+ int idx = m_ColorHash.try_get(name);
+ if (idx != -1) {
+ return m_Colors.get(idx);
+ }
+ int old_idx = m_OldColorHash.try_get(name);
+ if (old_idx != -1) {
+ return m_OldColors.get(old_idx);
+ }
+ return NULL;
+}
+
+GLEColor* GLEColorList::getSafeDefaultBlack(const string& name) {
+ GLEColor* res = get(name);
+ if (res == NULL) res = getColor(GLE_COLOR_BLACK);
+ return res;
+}
+
+void GLEColorList::defineColor(const char* name, unsigned int value) {
+ string key = name;
+ defineColor(key, value);
+}
+
+void GLEColorList::defineColor(const string& name, unsigned int value) {
+ GLEColor* color = new GLEColor();
+ color->setHexValue(value);
+ defineColor(name, color);
+}
+
+void GLEColorList::defineColor(const string& name, GLEColor* color) {
+ color->setName(name);
+ int idx = m_ColorHash.try_get(name);
+ if (idx != -1) {
+ m_Colors[idx] = color;
+ } else {
+ int new_pos = m_Colors.size();
+ m_Colors.add(color);
+ m_ColorHash.add_item(name, new_pos);
+ }
+}
+
+void GLEColorList::defineOldColor(const char* name, unsigned int value) {
+ string key = name;
+ defineOldColor(key, value);
+}
+
+void GLEColorList::defineOldColor(const string& name, unsigned int value) {
+ GLEColor* color = new GLEColor();
+ color->setHexValue(value);
+ color->setName(name);
+ int idx = m_OldColorHash.try_get(name);
+ if (idx != -1) {
+ m_OldColors[idx] = color;
+ } else {
+ int new_pos = m_OldColors.size();
+ m_OldColors.add(color);
+ m_OldColorHash.add_item(name, new_pos);
+ }
+}
+
+void GLEColorList::defineDefaultColors() {
+ defineGrays();
+ defineSVGColors();
+ defineOldGLEColors();
+}
+
+void GLEColorList::defineGrays() {
+ defineColor("GRAY1", GLE_COLOR_GRAY1);
+ defineColor("GRAY5", GLE_COLOR_GRAY5);
+ defineColor("GRAY10", GLE_COLOR_GRAY10);
+ defineColor("GRAY20", GLE_COLOR_GRAY20);
+ defineColor("GRAY30", GLE_COLOR_GRAY30);
+ defineColor("GRAY40", GLE_COLOR_GRAY40);
+ defineColor("GRAY50", GLE_COLOR_GRAY50);
+ defineColor("GRAY60", GLE_COLOR_GRAY60);
+ defineColor("GRAY70", GLE_COLOR_GRAY70);
+ defineColor("GRAY80", GLE_COLOR_GRAY80);
+ defineColor("GRAY90", GLE_COLOR_GRAY90);
+}
+
+void GLEColorList::defineSVGColors() {
+ defineColor("ALICEBLUE", GLE_COLOR_ALICEBLUE);
+ defineColor("ANTIQUEWHITE", GLE_COLOR_ANTIQUEWHITE);
+ defineColor("AQUA", GLE_COLOR_AQUA);
+ defineColor("AQUAMARINE", GLE_COLOR_AQUAMARINE);
+ defineColor("AZURE", GLE_COLOR_AZURE);
+ defineColor("BEIGE", GLE_COLOR_BEIGE);
+ defineColor("BISQUE", GLE_COLOR_BISQUE);
+ defineColor("BLACK", GLE_COLOR_BLACK);
+ defineColor("BLANCHEDALMOND", GLE_COLOR_BLANCHEDALMOND);
+ defineColor("BLUE", GLE_COLOR_BLUE);
+ defineColor("BLUEVIOLET", GLE_COLOR_BLUEVIOLET);
+ defineColor("BROWN", GLE_COLOR_BROWN);
+ defineColor("BURLYWOOD", GLE_COLOR_BURLYWOOD);
+ defineColor("CADETBLUE", GLE_COLOR_CADETBLUE);
+ defineColor("CHARTREUSE", GLE_COLOR_CHARTREUSE);
+ defineColor("CHOCOLATE", GLE_COLOR_CHOCOLATE);
+ defineColor("CORAL", GLE_COLOR_CORAL);
+ defineColor("CORNFLOWERBLUE", GLE_COLOR_CORNFLOWERBLUE);
+ defineColor("CORNSILK", GLE_COLOR_CORNSILK);
+ defineColor("CRIMSON", GLE_COLOR_CRIMSON);
+ defineColor("CYAN", GLE_COLOR_CYAN);
+ defineColor("DARKBLUE", GLE_COLOR_DARKBLUE);
+ defineColor("DARKCYAN", GLE_COLOR_DARKCYAN);
+ defineColor("DARKGOLDENROD", GLE_COLOR_DARKGOLDENROD);
+ defineColor("DARKGRAY", GLE_COLOR_DARKGRAY);
+ defineColor("DARKGREEN", GLE_COLOR_DARKGREEN);
+ defineColor("DARKKHAKI", GLE_COLOR_DARKKHAKI);
+ defineColor("DARKMAGENTA", GLE_COLOR_DARKMAGENTA);
+ defineColor("DARKOLIVEGREEN", GLE_COLOR_DARKOLIVEGREEN);
+ defineColor("DARKORANGE", GLE_COLOR_DARKORANGE);
+ defineColor("DARKORCHID", GLE_COLOR_DARKORCHID);
+ defineColor("DARKRED", GLE_COLOR_DARKRED);
+ defineColor("DARKSALMON", GLE_COLOR_DARKSALMON);
+ defineColor("DARKSEAGREEN", GLE_COLOR_DARKSEAGREEN);
+ defineColor("DARKSLATEBLUE", GLE_COLOR_DARKSLATEBLUE);
+ defineColor("DARKSLATEGRAY", GLE_COLOR_DARKSLATEGRAY);
+ defineColor("DARKTURQUOISE", GLE_COLOR_DARKTURQUOISE);
+ defineColor("DARKVIOLET", GLE_COLOR_DARKVIOLET);
+ defineColor("DEEPPINK", GLE_COLOR_DEEPPINK);
+ defineColor("DEEPSKYBLUE", GLE_COLOR_DEEPSKYBLUE);
+ defineColor("DIMGRAY", GLE_COLOR_DIMGRAY);
+ defineColor("DODGERBLUE", GLE_COLOR_DODGERBLUE);
+ defineColor("FIREBRICK", GLE_COLOR_FIREBRICK);
+ defineColor("FLORALWHITE", GLE_COLOR_FLORALWHITE);
+ defineColor("FORESTGREEN", GLE_COLOR_FORESTGREEN);
+ defineColor("FUCHSIA", GLE_COLOR_FUCHSIA);
+ defineColor("GAINSBORO", GLE_COLOR_GAINSBORO);
+ defineColor("GHOSTWHITE", GLE_COLOR_GHOSTWHITE);
+ defineColor("GOLD", GLE_COLOR_GOLD);
+ defineColor("GOLDENROD", GLE_COLOR_GOLDENROD);
+ defineColor("GRAY", GLE_COLOR_GRAY);
+ defineColor("GREEN", GLE_COLOR_GREEN);
+ defineColor("GREENYELLOW", GLE_COLOR_GREENYELLOW);
+ defineColor("HONEYDEW", GLE_COLOR_HONEYDEW);
+ defineColor("HOTPINK", GLE_COLOR_HOTPINK);
+ defineColor("INDIANRED", GLE_COLOR_INDIANRED);
+ defineColor("INDIGO", GLE_COLOR_INDIGO);
+ defineColor("IVORY", GLE_COLOR_IVORY);
+ defineColor("KHAKI", GLE_COLOR_KHAKI);
+ defineColor("LAVENDER", GLE_COLOR_LAVENDER);
+ defineColor("LAVENDERBLUSH", GLE_COLOR_LAVENDERBLUSH);
+ defineColor("LAWNGREEN", GLE_COLOR_LAWNGREEN);
+ defineColor("LEMONCHIFFON", GLE_COLOR_LEMONCHIFFON);
+ defineColor("LIGHTBLUE", GLE_COLOR_LIGHTBLUE);
+ defineColor("LIGHTCORAL", GLE_COLOR_LIGHTCORAL);
+ defineColor("LIGHTCYAN", GLE_COLOR_LIGHTCYAN);
+ defineColor("LIGHTGOLDENRODYELLOW", GLE_COLOR_LIGHTGOLDENRODYELLOW);
+ defineColor("LIGHTGRAY", GLE_COLOR_LIGHTGRAY);
+ defineColor("LIGHTGREEN", GLE_COLOR_LIGHTGREEN);
+ defineColor("LIGHTPINK", GLE_COLOR_LIGHTPINK);
+ defineColor("LIGHTSALMON", GLE_COLOR_LIGHTSALMON);
+ defineColor("LIGHTSEAGREEN", GLE_COLOR_LIGHTSEAGREEN);
+ defineColor("LIGHTSKYBLUE", GLE_COLOR_LIGHTSKYBLUE);
+ defineColor("LIGHTSLATEGRAY", GLE_COLOR_LIGHTSLATEGRAY);
+ defineColor("LIGHTSTEELBLUE", GLE_COLOR_LIGHTSTEELBLUE);
+ defineColor("LIGHTYELLOW", GLE_COLOR_LIGHTYELLOW);
+ defineColor("LIME", GLE_COLOR_LIME);
+ defineColor("LIMEGREEN", GLE_COLOR_LIMEGREEN);
+ defineColor("LINEN", GLE_COLOR_LINEN);
+ defineColor("MAGENTA", GLE_COLOR_MAGENTA);
+ defineColor("MAROON", GLE_COLOR_MAROON);
+ defineColor("MEDIUMAQUAMARINE", GLE_COLOR_MEDIUMAQUAMARINE);
+ defineColor("MEDIUMBLUE", GLE_COLOR_MEDIUMBLUE);
+ defineColor("MEDIUMORCHID", GLE_COLOR_MEDIUMORCHID);
+ defineColor("MEDIUMPURPLE", GLE_COLOR_MEDIUMPURPLE);
+ defineColor("MEDIUMSEAGREEN", GLE_COLOR_MEDIUMSEAGREEN);
+ defineColor("MEDIUMSLATEBLUE", GLE_COLOR_MEDIUMSLATEBLUE);
+ defineColor("MEDIUMSPRINGGREEN", GLE_COLOR_MEDIUMSPRINGGREEN);
+ defineColor("MEDIUMTURQUOISE", GLE_COLOR_MEDIUMTURQUOISE);
+ defineColor("MEDIUMVIOLETRED", GLE_COLOR_MEDIUMVIOLETRED);
+ defineColor("MIDNIGHTBLUE", GLE_COLOR_MIDNIGHTBLUE);
+ defineColor("MINTCREAM", GLE_COLOR_MINTCREAM);
+ defineColor("MISTYROSE", GLE_COLOR_MISTYROSE);
+ defineColor("MOCCASIN", GLE_COLOR_MOCCASIN);
+ defineColor("NAVAJOWHITE", GLE_COLOR_NAVAJOWHITE);
+ defineColor("NAVY", GLE_COLOR_NAVY);
+ defineColor("OLDLACE", GLE_COLOR_OLDLACE);
+ defineColor("OLIVE", GLE_COLOR_OLIVE);
+ defineColor("OLIVEDRAB", GLE_COLOR_OLIVEDRAB);
+ defineColor("ORANGE", GLE_COLOR_ORANGE);
+ defineColor("ORANGERED", GLE_COLOR_ORANGERED);
+ defineColor("ORCHID", GLE_COLOR_ORCHID);
+ defineColor("PALEGOLDENROD", GLE_COLOR_PALEGOLDENROD);
+ defineColor("PALEGREEN", GLE_COLOR_PALEGREEN);
+ defineColor("PALETURQUOISE", GLE_COLOR_PALETURQUOISE);
+ defineColor("PALEVIOLETRED", GLE_COLOR_PALEVIOLETRED);
+ defineColor("PAPAYAWHIP", GLE_COLOR_PAPAYAWHIP);
+ defineColor("PEACHPUFF", GLE_COLOR_PEACHPUFF);
+ defineColor("PERU", GLE_COLOR_PERU);
+ defineColor("PINK", GLE_COLOR_PINK);
+ defineColor("PLUM", GLE_COLOR_PLUM);
+ defineColor("POWDERBLUE", GLE_COLOR_POWDERBLUE);
+ defineColor("PURPLE", GLE_COLOR_PURPLE);
+ defineColor("RED", GLE_COLOR_RED);
+ defineColor("ROSYBROWN", GLE_COLOR_ROSYBROWN);
+ defineColor("ROYALBLUE", GLE_COLOR_ROYALBLUE);
+ defineColor("SADDLEBROWN", GLE_COLOR_SADDLEBROWN);
+ defineColor("SALMON", GLE_COLOR_SALMON);
+ defineColor("SANDYBROWN", GLE_COLOR_SANDYBROWN);
+ defineColor("SEAGREEN", GLE_COLOR_SEAGREEN);
+ defineColor("SEASHELL", GLE_COLOR_SEASHELL);
+ defineColor("SIENNA", GLE_COLOR_SIENNA);
+ defineColor("SILVER", GLE_COLOR_SILVER);
+ defineColor("SKYBLUE", GLE_COLOR_SKYBLUE);
+ defineColor("SLATEBLUE", GLE_COLOR_SLATEBLUE);
+ defineColor("SLATEGRAY", GLE_COLOR_SLATEGRAY);
+ defineColor("SNOW", GLE_COLOR_SNOW);
+ defineColor("SPRINGGREEN", GLE_COLOR_SPRINGGREEN);
+ defineColor("STEELBLUE", GLE_COLOR_STEELBLUE);
+ defineColor("TAN", GLE_COLOR_TAN);
+ defineColor("TEAL", GLE_COLOR_TEAL);
+ defineColor("THISTLE", GLE_COLOR_THISTLE);
+ defineColor("TOMATO", GLE_COLOR_TOMATO);
+ defineColor("TURQUOISE", GLE_COLOR_TURQUOISE);
+ defineColor("VIOLET", GLE_COLOR_VIOLET);
+ defineColor("WHEAT", GLE_COLOR_WHEAT);
+ defineColor("WHITE", GLE_COLOR_WHITE);
+ defineColor("WHITESMOKE", GLE_COLOR_WHITESMOKE);
+ defineColor("YELLOW", GLE_COLOR_YELLOW);
+ defineColor("YELLOWGREEN", GLE_COLOR_YELLOWGREEN);
+}
+
+void GLEColorList::defineOldGLEColors() {
+ defineOldColor("BAKERS_CHOCOLATE", 0x5C3317);
+ defineOldColor("BLUE_VIOLET", 0x9F5F9F);
+ defineOldColor("BRASS", 0xB5A642);
+ defineOldColor("BRIGHT_GOLD", 0xD9D919);
+ defineOldColor("BRONZE", 0x8C7853);
+ defineOldColor("BRONZE_II", 0xA67D3D);
+ defineOldColor("BROWN_WEB", 0xA62A2A);
+ defineOldColor("CADET_BLUE", 0x5F9F9F);
+ defineOldColor("COOL_COPPER", 0xD98719);
+ defineOldColor("COPPER", 0xB87333);
+ defineOldColor("CORN_FLOWER_BLUE", 0x42426F);
+ defineOldColor("DARK_BROWN", 0x5C4033);
+ defineOldColor("DARK_GREEN", 0x2F4F2F);
+ defineOldColor("DARK_GREEN_COPPER", 0x4A766E);
+ defineOldColor("DARK_OLIVE_GREEN", 0x4F4F2F);
+ defineOldColor("DARK_ORCHID", 0x9932CD);
+ defineOldColor("DARK_PURPLE", 0x871F78);
+ defineOldColor("DARK_SLATE_BLUE", 0x6B238E);
+ defineOldColor("DARK_SLATE_GRAY", 0x2F4F4F);
+ defineOldColor("DARK_SLATE_GREY", 0x2F4F4F);
+ defineOldColor("DARK_TAN", 0x97694F);
+ defineOldColor("DARK_TURQUOISE", 0x7093DB);
+ defineOldColor("DARK_WOOD", 0x855E42);
+ defineOldColor("DIM_GRAY", 0x545454);
+ defineOldColor("DIM_GREY", 0x545454);
+ defineOldColor("DUSTY_ROSE", 0x856363);
+ defineOldColor("FELDSPAR", 0xD19275);
+ defineOldColor("FOREST_GREEN", 0x228B22);
+ defineOldColor("FOREST_GREEN_WEB", 0x238E23);
+ defineOldColor("GRAY_WEB", 0xC0C0C0);
+ defineOldColor("GREEN_COPPER", 0x527F76);
+ defineOldColor("GREEN_YELLOW", 0x93DB70);
+ defineOldColor("GREY", 0x7F7F7F);
+ defineOldColor("GREY1", 0xFDFDFD);
+ defineOldColor("GREY10", 0xC8C8C8);
+ defineOldColor("GREY20", 0xAFAFAF);
+ defineOldColor("GREY30", 0x969696);
+ defineOldColor("GREY40", 0x7D7D7D);
+ defineOldColor("GREY5", 0xF0F0F0);
+ defineOldColor("GREY50", 0x646464);
+ defineOldColor("GREY60", 0x4B4B4B);
+ defineOldColor("GREY70", 0x323232);
+ defineOldColor("GREY80", 0x191919);
+ defineOldColor("GREY90", 0x060606);
+ defineOldColor("GREY_WEB", 0xC0C0C0);
+ defineOldColor("HUNTER_GREEN", 0x215E21);
+ defineOldColor("INDIAN_RED", 0x4E2F2F);
+ defineOldColor("LAWN_GREEN", 0x7CFC00);
+ defineOldColor("LIGHT_BLUE", 0xC0D9D9);
+ defineOldColor("LIGHT_GRAY", 0xA8A8A8);
+ defineOldColor("LIGHT_GREY", 0xA8A8A8);
+ defineOldColor("LIGHT_STEEL_BLUE", 0x8F8FBD);
+ defineOldColor("LIGHT_WOOD", 0xE9C2A6);
+ defineOldColor("LIME_GREEN", 0x32CD32);
+ defineOldColor("MANDARIAN_ORANGE", 0xE47833);
+ defineOldColor("MAROON_WEB", 0x8E236B);
+ defineOldColor("MEDIUM_AQUAMARINE", 0x32CD99);
+ defineOldColor("MEDIUM_BLUE", 0x3232CD);
+ defineOldColor("MEDIUM_FOREST_GREEN", 0x6B8E23);
+ defineOldColor("MEDIUM_GOLDENROD", 0xEAEAAE);
+ defineOldColor("MEDIUM_ORCHID", 0x9370DB);
+ defineOldColor("MEDIUM_SEA_GREEN", 0x426F42);
+ defineOldColor("MEDIUM_SLATE_BLUE", 0x7F00FF);
+ defineOldColor("MEDIUM_SPRING_GREEN", 0x7FFF00);
+ defineOldColor("MEDIUM_TURQUOISE", 0x70DBDB);
+ defineOldColor("MEDIUM_VIOLET_RED", 0xDB7093);
+ defineOldColor("MEDIUM_WOOD", 0xA68064);
+ defineOldColor("MIDNIGHT_BLUE", 0x2F2F4F);
+ defineOldColor("NAVY_BLUE", 0x23238E);
+ defineOldColor("NEON_BLUE", 0x4D4DFF);
+ defineOldColor("NEON_PINK", 0xFF6EC7);
+ defineOldColor("NEW_MIDNIGHT_BLUE", 0x00009C);
+ defineOldColor("NEW_TAN", 0xEBC79E);
+ defineOldColor("OLD_GOLD", 0xCFB53B);
+ defineOldColor("ORANGE_RED", 0xFF2400);
+ defineOldColor("ORANGE_WEB", 0xFF7F00);
+ defineOldColor("PALE_GREEN", 0x8FBC8F);
+ defineOldColor("PINK_WEB", 0xBC8F8F);
+ defineOldColor("QUARTZ", 0xD9D9F3);
+ defineOldColor("RICH_BLUE", 0x5959AB);
+ defineOldColor("SCARLET", 0x8C1717);
+ defineOldColor("SEA_GREEN", 0x238E68);
+ defineOldColor("SEMI_SWEET_CHOCOLATE", 0x6B4226);
+ defineOldColor("SILVER_WEB", 0xE6E8FA);
+ defineOldColor("SKY_BLUE", 0x3299CC);
+ defineOldColor("SLATE_BLUE", 0x007FFF);
+ defineOldColor("SPICY_PINK", 0xFF1CAE);
+ defineOldColor("SPRING_GREEN", 0x00FF7F);
+ defineOldColor("STEEL_BLUE", 0x236B8E);
+ defineOldColor("SUMMER_SKY", 0x38B0DE);
+ defineOldColor("TAN_COLOR", 0x008080);
+ defineOldColor("VERY_DARK_BROWN", 0x5C4033);
+ defineOldColor("VERY_LIGHT_GRAY", 0xCDCDCD);
+ defineOldColor("VERY_LIGHT_GREY", 0xCDCDCD);
+ defineOldColor("VIOLET_RED", 0xCC3299);
+ defineOldColor("VIOLET_WEB", 0x4F2F4F);
+ defineOldColor("YELLOW_GREEN", 0x99CC32);
+}
+
+GLERC<GLEColor> color_or_fill_from_int(int hexValue) {
+ GLERC<GLEColor> result(new GLEColor());
+ result->setHexValueGLE(hexValue);
+ return result;
+}
+
+void update_color_foreground(GLEColor* updateMe, GLEColor* color) {
+ updateMe->setRGBA(color->getRed(), color->getGreen(), color->getBlue(), color->getAlpha());
+ updateMe->setTransparent(color->isTransparent());
+ updateMe->setName(color->getNameS());
+}
+
+void update_color_foreground_and_pattern(GLEColor* updateMe, GLEColor* color) {
+ update_color_foreground(updateMe, color);
+ if (color->isFill() && color->getFill()->getFillType() == GLE_FILL_TYPE_PATTERN) {
+ update_color_fill_pattern(updateMe, static_cast<GLEPatternFill*>(color->getFill()));
+ }
+}
+
+void update_color_fill_pattern(GLEColor* updateMe, GLEPatternFill* fill) {
+ if (updateMe->isFill() && updateMe->getFill()->getFillType() == GLE_FILL_TYPE_PATTERN) {
+ GLEPatternFill* myFill = static_cast<GLEPatternFill*>(updateMe->getFill());
+ myFill->setFillDescription(fill->getFillDescription());
+ } else {
+ updateMe->setFill(new GLEPatternFill(fill->getFillDescription()));
+ }
+ updateMe->setTransparent(false);
+}
+
+void update_color_fill_background(GLEColor* updateMe, GLEColor* color) {
+ if (updateMe->isFill() && updateMe->getFill()->getFillType() == GLE_FILL_TYPE_PATTERN) {
+ GLEPatternFill* myFill = static_cast<GLEPatternFill*>(updateMe->getFill());
+ myFill->setBackground(color);
+ } else {
+ GLEPatternFill* myFill = new GLEPatternFill(0X02010020);
+ myFill->setBackground(color);
+ updateMe->setFill(myFill);
+ }
+ updateMe->setTransparent(false);
+}
+
+GLERC<GLEColor> get_fill_background(GLEColor* fill) {
+ if (fill->isFill() && fill->getFill()->getFillType() == GLE_FILL_TYPE_PATTERN) {
+ GLEPatternFill* myFill = static_cast<GLEPatternFill*>(fill->getFill());
+ return myFill->getBackground();
+ } else {
+ return color_or_fill_from_int(GLE_COLOR_WHITE);
+ }
+}
+
+GLERC<GLEColor> get_fill_foreground(GLEColor* fill) {
+ GLERC<GLEColor> result(new GLEColor());
+ update_color_foreground(result.get(), fill);
+ return result;
+}
diff --git a/src/gle/color.h b/src/gle/color.h
new file mode 100644
index 0000000..3fbefa9
--- /dev/null
+++ b/src/gle/color.h
@@ -0,0 +1,220 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#ifndef INC_COLOR_H
+#define INC_COLOR_H
+
+typedef union {
+ int l;
+ unsigned char b[4];
+} colortyp;
+
+typedef struct {
+ double red, green, blue;
+} rgb01;
+
+#ifdef WORDS_BIGENDIAN
+ #define B_F 0
+ #define B_R 1
+ #define B_G 2
+ #define B_B 3
+#else
+ #define B_F 3
+ #define B_R 2
+ #define B_G 1
+ #define B_B 0
+#endif
+
+#define GLE_FILL_CLEAR 0XFF000000
+
+// SVG colors
+#define GLE_COLOR_ALICEBLUE 0x01F0F8FF
+#define GLE_COLOR_ANTIQUEWHITE 0x01FAEBD7
+#define GLE_COLOR_AQUA 0x0100FFFF
+#define GLE_COLOR_AQUAMARINE 0x017FFFD4
+#define GLE_COLOR_AZURE 0x01F0FFFF
+#define GLE_COLOR_BEIGE 0x01F5F5DC
+#define GLE_COLOR_BISQUE 0x01FFE4C4
+#define GLE_COLOR_BLACK 0x01000000
+#define GLE_COLOR_BLANCHEDALMOND 0x01FFEBCD
+#define GLE_COLOR_BLUE 0x010000FF
+#define GLE_COLOR_BLUEVIOLET 0x018A2BE2
+#define GLE_COLOR_BROWN 0x01A52A2A
+#define GLE_COLOR_BURLYWOOD 0x01DEB887
+#define GLE_COLOR_CADETBLUE 0x015F9EA0
+#define GLE_COLOR_CHARTREUSE 0x017FFF00
+#define GLE_COLOR_CHOCOLATE 0x01D2691E
+#define GLE_COLOR_CORAL 0x01FF7F50
+#define GLE_COLOR_CORNFLOWERBLUE 0x016495ED
+#define GLE_COLOR_CORNSILK 0x01FFF8DC
+#define GLE_COLOR_CRIMSON 0x01DC143C
+#define GLE_COLOR_CYAN 0x0100FFFF
+#define GLE_COLOR_DARKBLUE 0x0100008B
+#define GLE_COLOR_DARKCYAN 0x01008B8B
+#define GLE_COLOR_DARKGOLDENROD 0x01B8860B
+#define GLE_COLOR_DARKGRAY 0x01A9A9A9
+#define GLE_COLOR_DARKGREEN 0x01006400
+#define GLE_COLOR_DARKKHAKI 0x01BDB76B
+#define GLE_COLOR_DARKMAGENTA 0x018B008B
+#define GLE_COLOR_DARKOLIVEGREEN 0x01556B2F
+#define GLE_COLOR_DARKORANGE 0x01FF8C00
+#define GLE_COLOR_DARKORCHID 0x019932CC
+#define GLE_COLOR_DARKRED 0x018B0000
+#define GLE_COLOR_DARKSALMON 0x01E9967A
+#define GLE_COLOR_DARKSEAGREEN 0x018FBC8F
+#define GLE_COLOR_DARKSLATEBLUE 0x01483D8B
+#define GLE_COLOR_DARKSLATEGRAY 0x012F4F4F
+#define GLE_COLOR_DARKTURQUOISE 0x0100CED1
+#define GLE_COLOR_DARKVIOLET 0x019400D3
+#define GLE_COLOR_DEEPPINK 0x01FF1493
+#define GLE_COLOR_DEEPSKYBLUE 0x0100BFFF
+#define GLE_COLOR_DIMGRAY 0x01696969
+#define GLE_COLOR_DODGERBLUE 0x011E90FF
+#define GLE_COLOR_FIREBRICK 0x01B22222
+#define GLE_COLOR_FLORALWHITE 0x01FFFAF0
+#define GLE_COLOR_FORESTGREEN 0x01228B22
+#define GLE_COLOR_FUCHSIA 0x01FF00FF
+#define GLE_COLOR_GAINSBORO 0x01DCDCDC
+#define GLE_COLOR_GHOSTWHITE 0x01F8F8FF
+#define GLE_COLOR_GOLD 0x01FFD700
+#define GLE_COLOR_GOLDENROD 0x01DAA520
+#define GLE_COLOR_GRAY 0x01808080
+#define GLE_COLOR_GREEN 0x01008000
+#define GLE_COLOR_GREENYELLOW 0x01ADFF2F
+#define GLE_COLOR_HONEYDEW 0x01F0FFF0
+#define GLE_COLOR_HOTPINK 0x01FF69B4
+#define GLE_COLOR_INDIANRED 0x01CD5C5C
+#define GLE_COLOR_INDIGO 0x014B0082
+#define GLE_COLOR_IVORY 0x01FFFFF0
+#define GLE_COLOR_KHAKI 0x01F0E68C
+#define GLE_COLOR_LAVENDER 0x01E6E6FA
+#define GLE_COLOR_LAVENDERBLUSH 0x01FFF0F5
+#define GLE_COLOR_LAWNGREEN 0x017CFC00
+#define GLE_COLOR_LEMONCHIFFON 0x01FFFACD
+#define GLE_COLOR_LIGHTBLUE 0x01ADD8E6
+#define GLE_COLOR_LIGHTCORAL 0x01F08080
+#define GLE_COLOR_LIGHTCYAN 0x01E0FFFF
+#define GLE_COLOR_LIGHTGOLDENRODYELLOW 0x01FAFAD2
+#define GLE_COLOR_LIGHTGRAY 0x01D3D3D3
+#define GLE_COLOR_LIGHTGREEN 0x0190EE90
+#define GLE_COLOR_LIGHTPINK 0x01FFB6C1
+#define GLE_COLOR_LIGHTSALMON 0x01FFA07A
+#define GLE_COLOR_LIGHTSEAGREEN 0x0120B2AA
+#define GLE_COLOR_LIGHTSKYBLUE 0x0187CEFA
+#define GLE_COLOR_LIGHTSLATEGRAY 0x01778899
+#define GLE_COLOR_LIGHTSTEELBLUE 0x01B0C4DE
+#define GLE_COLOR_LIGHTYELLOW 0x01FFFFE0
+#define GLE_COLOR_LIME 0x0100FF00
+#define GLE_COLOR_LIMEGREEN 0x0132CD32
+#define GLE_COLOR_LINEN 0x01FAF0E6
+#define GLE_COLOR_MAGENTA 0x01FF00FF
+#define GLE_COLOR_MAROON 0x01800000
+#define GLE_COLOR_MEDIUMAQUAMARINE 0x0166CDAA
+#define GLE_COLOR_MEDIUMBLUE 0x010000CD
+#define GLE_COLOR_MEDIUMORCHID 0x01BA55D3
+#define GLE_COLOR_MEDIUMPURPLE 0x019370DB
+#define GLE_COLOR_MEDIUMSEAGREEN 0x013CB371
+#define GLE_COLOR_MEDIUMSLATEBLUE 0x017B68EE
+#define GLE_COLOR_MEDIUMSPRINGGREEN 0x0100FA9A
+#define GLE_COLOR_MEDIUMTURQUOISE 0x0148D1CC
+#define GLE_COLOR_MEDIUMVIOLETRED 0x01C71585
+#define GLE_COLOR_MIDNIGHTBLUE 0x01191970
+#define GLE_COLOR_MINTCREAM 0x01F5FFFA
+#define GLE_COLOR_MISTYROSE 0x01FFE4E1
+#define GLE_COLOR_MOCCASIN 0x01FFE4B5
+#define GLE_COLOR_NAVAJOWHITE 0x01FFDEAD
+#define GLE_COLOR_NAVY 0x01000080
+#define GLE_COLOR_OLDLACE 0x01FDF5E6
+#define GLE_COLOR_OLIVE 0x01808000
+#define GLE_COLOR_OLIVEDRAB 0x016B8E23
+#define GLE_COLOR_ORANGE 0x01FFA500
+#define GLE_COLOR_ORANGERED 0x01FF4500
+#define GLE_COLOR_ORCHID 0x01DA70D6
+#define GLE_COLOR_PALEGOLDENROD 0x01EEE8AA
+#define GLE_COLOR_PALEGREEN 0x0198FB98
+#define GLE_COLOR_PALETURQUOISE 0x01AFEEEE
+#define GLE_COLOR_PALEVIOLETRED 0x01DB7093
+#define GLE_COLOR_PAPAYAWHIP 0x01FFEFD5
+#define GLE_COLOR_PEACHPUFF 0x01FFDAB9
+#define GLE_COLOR_PERU 0x01CD853F
+#define GLE_COLOR_PINK 0x01FFC0CB
+#define GLE_COLOR_PLUM 0x01DDA0DD
+#define GLE_COLOR_POWDERBLUE 0x01B0E0E6
+#define GLE_COLOR_PURPLE 0x01800080
+#define GLE_COLOR_RED 0x01FF0000
+#define GLE_COLOR_ROSYBROWN 0x01BC8F8F
+#define GLE_COLOR_ROYALBLUE 0x014169E1
+#define GLE_COLOR_SADDLEBROWN 0x018B4513
+#define GLE_COLOR_SALMON 0x01FA8072
+#define GLE_COLOR_SANDYBROWN 0x01F4A460
+#define GLE_COLOR_SEAGREEN 0x012E8B57
+#define GLE_COLOR_SEASHELL 0x01FFF5EE
+#define GLE_COLOR_SIENNA 0x01A0522D
+#define GLE_COLOR_SILVER 0x01C0C0C0
+#define GLE_COLOR_SKYBLUE 0x0187CEEB
+#define GLE_COLOR_SLATEBLUE 0x016A5ACD
+#define GLE_COLOR_SLATEGRAY 0x01708090
+#define GLE_COLOR_SNOW 0x01FFFAFA
+#define GLE_COLOR_SPRINGGREEN 0x0100FF7F
+#define GLE_COLOR_STEELBLUE 0x014682B4
+#define GLE_COLOR_TAN 0x01D2B48C
+#define GLE_COLOR_TEAL 0x01008080
+#define GLE_COLOR_THISTLE 0x01D8BFD8
+#define GLE_COLOR_TOMATO 0x01FF6347
+#define GLE_COLOR_TURQUOISE 0x0140E0D0
+#define GLE_COLOR_VIOLET 0x01EE82EE
+#define GLE_COLOR_WHEAT 0x01F5DEB3
+#define GLE_COLOR_WHITE 0x01FFFFFF
+#define GLE_COLOR_WHITESMOKE 0x01F5F5F5
+#define GLE_COLOR_YELLOW 0x01FFFF00
+#define GLE_COLOR_YELLOWGREEN 0x019ACD32
+
+// Gray values
+#define GLE_COLOR_GRAY1 0x01FDFDFD
+#define GLE_COLOR_GRAY5 0x01F0F0F0
+#define GLE_COLOR_GRAY10 0x01C8C8C8
+#define GLE_COLOR_GRAY20 0x01AFAFAF
+#define GLE_COLOR_GRAY30 0x01969696
+#define GLE_COLOR_GRAY40 0x017D7D7D
+#define GLE_COLOR_GRAY50 0x01646464
+#define GLE_COLOR_GRAY60 0x014B4B4B
+#define GLE_COLOR_GRAY70 0x01323232
+#define GLE_COLOR_GRAY80 0x01191919
+#define GLE_COLOR_GRAY90 0x01060606
+
+#endif
diff --git a/src/gle/config.cpp b/src/gle/config.cpp
new file mode 100644
index 0000000..6603c41
--- /dev/null
+++ b/src/gle/config.cpp
@@ -0,0 +1,723 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+/*
+ * 2004 Jan Struyf
+ *
+ */
+
+#include "all.h"
+#include "gle-interface/gle-interface.h"
+#include "tokens/stokenizer.h"
+#include "mem_limits.h"
+#include "token.h"
+#include "core.h"
+#include "file_io.h"
+#include "texinterface.h"
+#include "cutils.h"
+#include "cmdline.h"
+#include "gprint.h"
+#include "config.h"
+#include "drawit.h"
+
+#ifdef __WIN32__
+ #include <windows.h>
+#endif
+
+#define BEGINDEF extern
+#include "begin.h"
+
+extern string GLE_TOP_DIR;
+extern string GLE_BIN_DIR;
+extern ConfigCollection g_Config;
+extern CmdLineObj g_CmdLine;
+
+void doskip(char *s,int *ct);
+char *un_quote(char *ct);
+
+#define skipspace doskip(tk[ct],&ct)
+
+void begin_config(const std::string& block, int *pln, int *pcode, int *cp) throw(ParserError) {
+ string block_name(block);
+ ConfigSection* section = g_Config.getSection(block_name);
+ if (section == NULL) {
+ g_throw_parser_error("unrecognized config section '", block_name.c_str(), "'");
+ }
+ // Don't do config blocks in safe mode (except in RC file)
+ GLEInterface* iface = GLEGetInterfacePointer();
+ if (iface->getCmdLine()->hasOption(GLE_OPT_SAFEMODE)) {
+ GLEGlobalConfig* config = iface->getConfig();
+ if (!config->allowConfigBlocks()) {
+ g_throw_parser_error("safe mode - config blocks not allowed");
+ }
+ }
+ // Start with pcode from the next line
+ (*pln)++;
+ begin_init();
+ while (true) {
+ int st = begin_token(&pcode,cp,pln,srclin,tk,&ntk,outbuff);
+ if (!st) {
+ /* exit loop */
+ break;
+ }
+ int ct = 1;
+ int mode = 0;
+ bool plus_is = false;
+ CmdLineOption* option = NULL;
+ while (ct <= ntk) {
+ skipspace;
+ if (section != NULL) {
+ if (mode == 0) {
+ option = section->getOption(tk[ct]);
+ if (option == NULL) {
+ gprint("Not a valid setting for section '%s': {%s}\n", block_name.c_str(), tk[ct]);
+ }
+ } else if (mode == 1) {
+ if (strcmp(tk[ct], "=") == 0) {
+ plus_is = false;
+ } else if (strcmp(tk[ct], "+=") == 0) {
+ plus_is = true;
+ } else {
+ gprint("Expected '=' or '+=', not {%s}\n", tk[ct]);
+ }
+ } else if (option != NULL) {
+ CmdLineOptionArg* arg = option->getArg(0);
+ if (!plus_is) arg->reset();
+ arg->appendValue(tk[ct]);
+ }
+ mode++;
+ }
+ ct++;
+ }
+ }
+}
+
+void init_config(ConfigCollection* collection) {
+ ConfigSection* section;
+ CmdLineOption* option;
+ CmdLineArgString* strarg;
+ CmdLineArgSet* setarg;
+/* GLE */
+ section = new ConfigSection("gle");
+ strarg = section->addStringOption("current", GLE_CONFIG_GLE_VERSION);
+ strarg->setDefault("");
+ section->addSPairListOption("versions", GLE_CONFIG_GLE_INSTALL);
+ collection->addSection(section, GLE_CONFIG_GLE);
+/* Tools */
+ section = new ConfigSection("tools");
+ /* LaTeX */
+ strarg = section->addStringOption("latex", GLE_TOOL_LATEX_CMD);
+#ifdef __WIN32__
+ strarg->setDefault("latex.exe");
+#endif
+#ifdef __UNIX__
+ strarg->setDefault("latex");
+#endif
+#ifdef __OS2__
+ strarg->setDefault("vlatexp.cmd");
+#endif
+ section->addStringOption("latex_options", GLE_TOOL_LATEX_OPTIONS);
+
+ /* PdfLaTeX */
+ strarg = section->addStringOption("pdflatex", GLE_TOOL_PDFTEX_CMD);
+#ifdef __WIN32__
+ strarg->setDefault("pdflatex.exe");
+#else
+ strarg->setDefault("pdflatex");
+#endif
+ section->addStringOption("pdflatex_options", GLE_TOOL_PDFTEX_OPTIONS);
+
+ /* DVIPS */
+ strarg = section->addStringOption("dvips", GLE_TOOL_DVIPS_CMD);
+#ifdef __WIN32__
+ strarg->setDefault("dvips.exe");
+#endif
+#ifdef __UNIX__
+ strarg->setDefault("dvips");
+#endif
+#ifdef __OS2__
+ strarg->setDefault("dvips.exe");
+#endif
+ section->addStringOption("dvips_options", GLE_TOOL_DVIPS_OPTIONS);
+
+ /* GhostScript Program */
+ strarg = section->addStringOption("ghostscript", GLE_TOOL_GHOSTSCRIPT_CMD);
+#ifdef __WIN32__
+ strarg->setDefault("gswin32c.exe");
+#endif
+#ifdef __MACOS__
+ strarg->setDefault("gs,glegs;$EXELOC/glegs");
+#endif
+#if defined(__UNIX__) && !defined(__MACOS__)
+ strarg->setDefault("gs");
+#endif
+#ifdef __OS2__
+ strarg->setDefault("gsos2.exe");
+#endif
+ section->addStringOption("ghostscript_options", GLE_TOOL_GHOSTSCRIPT_OPTIONS);
+
+ collection->addSection(section, GLE_CONFIG_TOOLS);
+ /* GhostScript Library */
+ strarg = section->addStringOption("libgs", GLE_TOOL_GHOSTSCRIPT_LIB);
+#ifdef __WIN32__
+ strarg->setDefault("gsdll32.dll");
+#endif
+#ifdef __MACOS__
+ strarg->setDefault("/Library/Frameworks/Ghostscript.framework,Ghostscript.framework");
+#endif
+#if defined(__UNIX__) && !defined(__MACOS__)
+ strarg->setDefault("/usr/lib/libgs.so");
+#endif
+ strarg = section->addStringOption("editor", GLE_TOOL_TEXT_EDITOR);
+ strarg = section->addStringOption("pdfviewer", GLE_TOOL_PDF_VIEWER);
+/* TeX config */
+ section = new ConfigSection("tex");
+ option = new CmdLineOption("system");
+ setarg = new CmdLineArgSet("device-names");
+ setarg->setMaxCard(1);
+ setarg->addPossibleValue("latex");
+ setarg->addPossibleValue("vtex");
+#ifdef __OS2__
+ setarg->addDefaultValue(GLE_TEX_SYSTEM_VTEX);
+#else
+ setarg->addDefaultValue(GLE_TEX_SYSTEM_LATEX);
+#endif
+ option->addArg(setarg);
+ section->addOption(option, GLE_TEX_SYSTEM);
+ collection->addSection(section, GLE_CONFIG_TEX);
+/* Config paper */
+ section = new ConfigSection("paper");
+ strarg = section->addStringOption("size", GLE_CONFIG_PAPER_SIZE);
+ strarg->setDefault("a4paper");
+ strarg = section->addStringOption("margins", GLE_CONFIG_PAPER_MARGINS);
+ strarg->setDefault("2.54 2.54 2.54 2.54");
+ collection->addSection(section, GLE_CONFIG_PAPER);
+ collection->setDefaultValues();
+}
+
+const string& gle_config_margins() {
+ ConfigSection* paper = g_Config.getSection(GLE_CONFIG_PAPER);
+ return ((CmdLineArgString*)paper->getOptionValue(GLE_CONFIG_PAPER_MARGINS))->getValue();
+}
+
+const string& gle_config_papersize() {
+ ConfigSection* paper = g_Config.getSection(GLE_CONFIG_PAPER);
+ return ((CmdLineArgString*)paper->getOptionValue(GLE_CONFIG_PAPER_SIZE))->getValue();
+}
+
+bool try_load_config(const string& fname) {
+ // FIXME: script as parameter to avoid repeated construction?
+ GLERC<GLEScript> script = new GLEScript();
+ script->getLocation()->fromFileNameCrDir(fname);
+ if (script->getSource()->tryLoad()) {
+ GLEGlobalConfig* conf = GLEGetInterfacePointer()->getConfig();
+ conf->setAllowConfigBlocks(true);
+ g_select_device(GLE_DEVICE_DUMMY);
+ g_message_first_newline(false);
+ GLEFileLocation output;
+ output.createIllegal();
+ DrawIt(script.get(), &output, NULL, true);
+ conf->setAllowConfigBlocks(false);
+ return true;
+ } else {
+ return false;
+ }
+}
+
+bool try_save_config(const string& fname, GLEInterface* iface, bool isUser) {
+ ConfigCollection* collection = iface->getConfig()->getRCFile();
+ if (collection->allDefaults()) {
+ return true;
+ }
+ if (fname == "") {
+ return false;
+ }
+ if (IsAbsPath(fname)) {
+ std::string dirname;
+ GetDirName(fname, dirname);
+ EnsureMkDir(dirname);
+ }
+ ofstream fout(fname.c_str());
+ if (!fout.is_open()) {
+ return false;
+ }
+ CmdLineOption* versionOption = collection->getSection(GLE_CONFIG_GLE)->getOption(GLE_CONFIG_GLE_VERSION);
+ ostringstream out;
+ out << "Save configuration to: '" << fname << "'";
+ GLEOutputStream* output = iface->getOutput();
+ output->println(out.str().c_str());
+ for (int i = 0; i < collection->getNbSections(); i++) {
+ ConfigSection* sec = collection->getSection(i);
+ if (!sec->allDefaults()) {
+ fout << "begin config " << sec->getName() << endl;
+ for (int j = 0; j < sec->getNbOptions(); j++) {
+ CmdLineOption* option = sec->getOption(j);
+ if (!option->allDefaults() && (!isUser || option != versionOption)) {
+ fout << "\t" << option->getName() << " = ";
+ for (int k = 0; k < option->getMaxNbArgs(); k++) {
+ if (k != 0) fout << " ";
+ CmdLineOptionArg* arg = option->getArg(k);
+ arg->write(fout);
+ }
+ fout << endl;
+ }
+ }
+ fout << "end config" << endl << endl;
+ }
+ }
+ fout.close();
+ return true;
+}
+
+void get_version_soft(const string& cmdline, string& version) {
+ // Running GLE gives something like: "GLE version 4.0.11"
+ // Parse this string to get version number
+ string gle_output;
+ GLERunCommand(cmdline, gle_output);
+ str_parse_get_next(gle_output, "VERSION", version);
+ str_remove_quote(version);
+}
+
+void get_version_hard(const string& cmdline, string& version) {
+ // If gle_version_soft fails, use this more complex method
+ // Running GLE on some dummy file results in "GLE 4.0.11 [temp1234.gle]-C-R-[temp1234.eps]"
+ // Parse this string to get version number
+ string gle_output;
+ string temp_file = "temp1234";
+ // Set GLE top
+ GLESetGLETop(cmdline);
+ // Create dummy file
+ string temp_gle_file = temp_file + ".gle";
+ ofstream file(temp_gle_file.c_str());
+ file << "size 10 10" << endl;
+ file << "amove 0 0" << endl;
+ file.close();
+ // Create command line
+ string cmd_line = string("\"") + cmdline + "\" " + temp_gle_file;
+ GLERunCommand(cmd_line, gle_output);
+ // Parse output to find version number
+ str_parse_get_next(gle_output, "GLE", version);
+ // Delete our temp file
+ TryDeleteFile(temp_gle_file);
+ TryDeleteFile(temp_file + ".ps");
+}
+
+void init_installed_versions(CmdLineObj& cmdline, ConfigCollection* collection) {
+ CmdLineArgSet* versions = (CmdLineArgSet*)cmdline.getOption(GLE_OPT_VERSION)->getArg(0);
+ ConfigSection* gle = collection->getSection(GLE_CONFIG_GLE);
+ CmdLineArgSPairList* installs = (CmdLineArgSPairList*)gle->getOption(GLE_CONFIG_GLE_INSTALL)->getArg(0);
+ if (installs->size() == 0) {
+ versions->addPossibleValue("no older GLE versions found (run \"gle -finddeps\")");
+ } else {
+ for (int i = 0; i < installs->size(); i++) {
+ versions->addPossibleValue(installs->getValue1(i).c_str());
+ }
+ }
+}
+
+void do_wait_for_enter() {
+ if (g_CmdLine.hasOption(GLE_OPT_PAUSE)) {
+ cout << "Press enter to continue ..." << endl;
+ GLEReadConsoleInteger();
+ }
+}
+
+void do_wait_for_enter_exit(int exitcode) {
+ do_wait_for_enter();
+ exit(exitcode);
+}
+
+class GLEProgressIndicatorInterface : public GLEProgressIndicator {
+protected:
+ GLEInterface* m_Iface;
+public:
+ GLEProgressIndicatorInterface(GLEInterface* iface);
+ virtual ~GLEProgressIndicatorInterface();
+ virtual void indicate();
+};
+
+GLEProgressIndicatorInterface::GLEProgressIndicatorInterface(GLEInterface* iface) {
+ m_Iface = iface;
+}
+
+GLEProgressIndicatorInterface::~GLEProgressIndicatorInterface() {
+}
+
+void GLEProgressIndicatorInterface::indicate() {
+ m_Iface->getOutput()->printflush(".");
+}
+
+string get_tool_path(int tool, ConfigSection* tools) {
+ string path(tools->getOptionString(tool));
+ string::size_type pos = path.find(',');
+ if (pos != string::npos) {
+ path.erase(pos);
+ }
+ pos = path.find(';');
+ if (pos != string::npos) {
+ path.erase(pos);
+ }
+ str_replace_all(path, "$EXELOC", GLE_BIN_DIR.c_str());
+ return GLEExpandEnvironmentVariables(path);
+}
+
+void find_deps(const string& loc, GLEInterface* iface) {
+ vector<GLEFindEntry*> tofind;
+ vector<string*> result;
+ string gle_paths = ";";
+ ConfigCollection* collection = iface->getConfig()->getRCFile();
+#ifdef __WIN32__
+ GLEFindEntry* findGLE = new GLEFindEntry(&gle_paths);
+ findGLE->addToFind("gle.exe");
+ findGLE->addToFind("gle_ps.exe");
+ tofind.push_back(findGLE);
+#endif
+ // Create GLEFindEntry for each tool (ghostscript, pdflatex, ...)
+ ConfigSection* tools = collection->getSection(GLE_CONFIG_TOOLS);
+ for (int j = 0; j <= GLE_TOOL_GHOSTSCRIPT_LIB; j++) {
+ CmdLineArgString* strarg = (CmdLineArgString*)tools->getOption(j)->getArg(0);
+ GLEFindEntry* findTool = new GLEFindEntry(strarg->getValuePtr());
+ char_separator separator(",", ";");
+ tokenizer<char_separator> tokens(strarg->getDefault(), separator);
+ while (tokens.has_more()) {
+ const string& toolName = tokens.next_token();
+ if (toolName == ";") {
+ if (tokens.has_more() && strarg->isDefault()) {
+ findTool->setNotFound(tokens.next_token());
+ }
+ break;
+ } else {
+ if (!IsAbsPath(toolName)) {
+ findTool->addToFind(toolName);
+ }
+ }
+ }
+ if (findTool->getNbFind() != 0) tofind.push_back(findTool);
+ else delete findTool;
+ }
+ // Initialize output and progress indicator
+ GLEOutputStream* output = iface->getOutput();
+ ostringstream out1;
+ out1 << "Running GLE -finddeps \"";
+ out1 << loc;
+ out1 << ("\" to locate installed software (e.g., Ghostscript and LaTeX): ");
+ output->println(out1.str().c_str());
+ GLEProgressIndicatorInterface progress(iface);
+ // Perform search at specified location
+ if (loc != "") {
+ if (IsDirectory(loc, true)) {
+ GLEFindFiles(loc, tofind, &progress);
+ for (unsigned int i = 0; i < tofind.size(); i++) {
+ tofind[i]->updateResult(false);
+ }
+ } else {
+ // Name of old GLERC file given
+ if (try_load_config(loc)) {
+ // Override old version number
+ collection->setStringValue(GLE_CONFIG_GLE, GLE_CONFIG_GLE_VERSION, GLEVN);
+ } else {
+ ostringstream err;
+ err << "Can't load configuration from '" << loc << "'" << endl;
+ output->println(err.str().c_str());
+ }
+ }
+ }
+ #ifdef __UNIX__
+ // Find programs in search path on Unix
+ GLEFindPrograms(tofind, &progress);
+ #endif
+ #ifdef __MACOS__
+ // Search for frameworks on Mac
+ GLEFindFiles(string("/Library/Frameworks"), tofind, &progress);
+ string home = GetHomeDir();
+ if (home != "") {
+ home += "Library/Frameworks";
+ GLEFindFiles(home, tofind, &progress);
+ }
+ #endif
+ for (unsigned int i = 0; i < tofind.size(); i++) {
+ tofind[i]->updateResult(true);
+ }
+ #ifdef __UNIX__
+ // Search for libraries in typical directories and in LD_LIBRARY_PATH
+ string gslibloc = GLEFindLibrary("libgs", &progress);
+ if (gslibloc != "") {
+ CmdLineArgString* gslib_stra = (CmdLineArgString*)tools->getOption(GLE_TOOL_GHOSTSCRIPT_LIB)->getArg(0);
+ gslib_stra->setValue(gslibloc.c_str());
+ }
+ #endif
+ output->println();
+ // Write installed GLE's to config section
+ ConfigSection* gle = collection->getSection(GLE_CONFIG_GLE);
+ CmdLineArgSPairList* installs = (CmdLineArgSPairList*)gle->getOption(GLE_CONFIG_GLE_INSTALL)->getArg(0);
+ char_separator separator(";", "");
+ tokenizer<char_separator> tokens(gle_paths, separator);
+ while (tokens.has_more()) {
+ string path = tokens.next_token();
+ if (path.length() > 0 && !installs->hasValue2(path)) {
+ installs->addPair("?", path);
+ }
+ }
+ // Find versions of installed GLEs and set value of gleexe
+ ostringstream out;
+ string gle_version = GLEVN;
+ if (installs->size() > 1) {
+ // Only need to find out versions if more than one installed
+ // otherwise assume it is "this" version
+ for (int i = 0; i < installs->size(); i++) {
+ const string& cr_gle = installs->getValue2(i);
+ string& version = installs->getValue1(i);
+ if (version == "?") {
+ get_version_soft(cr_gle, version);
+ if (version == "?") {
+ // cout << "Use hard method for: " << cr_gle << endl;
+ get_version_hard(cr_gle, version);
+ }
+ }
+ if (str_i_equals(version, gle_version)) {
+ out << "Found: GLE " << version << " in " << cr_gle << " (*)" << endl;
+ } else {
+ out << "Found: GLE " << version << " in " << cr_gle << endl;
+ }
+ }
+ } else if (installs->size() == 1) {
+ out << "Found: GLE in " << installs->getValue2(0) << endl;
+ // Do not need to remember installed GLEs if there is only one
+ // because then the "-v" option makes no sense
+ installs->reset();
+ }
+ // Show locations of other tools
+ for (int j = 0; j <= GLE_TOOL_GHOSTSCRIPT_LIB; j++) {
+ CmdLineOption* opt = tools->getOption(j);
+ CmdLineArgString* strarg = (CmdLineArgString*)opt->getArg(0);
+ if (strarg->isDefault()) {
+ out << "Found: " << opt->getName() << " in '?'" << endl;
+ } else {
+ out << "Found: " << opt->getName() << " in '" << strarg->getValue() << "'" << endl;
+ }
+ }
+ output->println(out.str().c_str());
+ for (unsigned int i = 0; i < tofind.size(); i++) {
+ delete tofind[i];
+ }
+}
+
+void complain_about_gletop(bool has_top, ostream& out) {
+ if (has_top) {
+ // If the user has GLE_TOP, then it points to the wrong location
+ // Let him first try to remove it, to see if that works
+ out << "GLE_TOP might be pointing to an incorrect location." << endl;
+ out << "Try removing GLE_TOP from your environment." << endl;
+ } else {
+ // The user did not set GLE_TOP and still something is wrong
+ // Ask him to correct this by setting GLE_TOP as a workaround
+ out << "Please set GLE_TOP to the correct location." << endl;
+ }
+}
+
+bool check_correct_version(const string name, bool has_top, bool has_config, const vector<string>& triedLocations, ConfigCollection& coll) {
+ if (has_config) {
+ const string& val = coll.getStringValue(GLE_CONFIG_GLE, GLE_CONFIG_GLE_VERSION);
+ if (!str_i_equals(val.c_str(), GLEVN)) {
+ ostringstream out;
+ out << "Error: GLE's configuration file:" << endl;
+ out << " '" << name << "'" << endl;
+ out << "Is from GLE version '";
+ if (val == "") { out << "unknown"; } else { out << val; }
+ out << "' (and not '" << GLEVN << "' as expected)." << endl;
+ complain_about_gletop(has_top, out);
+ g_message(out.str().c_str());
+ return false;
+ }
+ } else {
+ ostringstream out;
+ out << "Error: GLE is unable to locate its configuration file." << endl;
+ out << " GLE searched these locations:" << endl;
+ for (size_t i = 0; i < triedLocations.size(); i++) {
+ out << " '" << triedLocations[i] << "'" << endl;
+ }
+ complain_about_gletop(has_top, out);
+ g_message(out.str().c_str());
+ return false;
+ }
+ coll.setStringValue(GLE_CONFIG_GLE, GLE_CONFIG_GLE_VERSION, GLEVN);
+ return true;
+}
+
+bool try_load_config_sub(string& conf_name, vector<string>& triedLocations) {
+ StripDirSep(GLE_TOP_DIR);
+ string conf_name2 = GLE_TOP_DIR + DIR_SEP + "glerc";
+ triedLocations.push_back(conf_name2);
+ bool has_config = try_load_config(conf_name2);
+ if (has_config) {
+ // only update name if configuration file found here
+ conf_name = conf_name2;
+ }
+ return has_config;
+}
+
+bool do_load_config(const char* appname, char **argv, CmdLineObj& cmdline, ConfigCollection& coll) {
+ // Set GLE_TOP
+ // -> prefer environment var GLE_TOP
+ // -> otherwise, locate relative to executable location
+ string conf_name;
+ bool has_top = false;
+ bool has_config = false;
+ const char* top = getenv("GLE_TOP");
+ vector<string> triedLocations;
+ if (top == NULL || top[0] == 0) {
+ string exe_name;
+ bool has_exe_name = GetExeName(appname, argv, exe_name);
+ if (has_exe_name) {
+ GetDirName(exe_name, GLE_BIN_DIR);
+ StripDirSep(GLE_BIN_DIR);
+ #ifdef GLETOP_CD
+ // Try relative path
+ GLE_TOP_DIR = GLEAddRelPath(exe_name, GLETOP_CD+1, GLETOP_REL);
+ has_config = try_load_config_sub(conf_name, triedLocations);
+ // Try one level higher as executable
+ if (!has_config) {
+ GLE_TOP_DIR = GLEAddRelPath(exe_name, 2, NULL);
+ has_config = try_load_config_sub(conf_name, triedLocations);
+ }
+ // Try with absolute path
+ if (!has_config) {
+ GLE_TOP_DIR = GLETOP_ABS;
+ has_config = try_load_config_sub(conf_name, triedLocations);
+ }
+ #else
+ GLE_TOP_DIR = exe_name;
+ StripPathComponents(&GLE_TOP_DIR, 2);
+ #endif
+ } else {
+ // The user will see as error messege: "$GLE_TOP/some_file" not found.
+ GLE_TOP_DIR = "$GLE_TOP";
+ }
+ } else {
+ has_top = true;
+ GLE_TOP_DIR = top;
+ }
+ StripDirSep(GLE_TOP_DIR);
+ if (!has_config) {
+ // Try load config file
+ // -> first $GLE_TOP/glerc
+ if (conf_name == "") {
+ // Only update conf_name if it was not yet set
+ // To make error message if glerc not found more interpretable
+ conf_name = GLE_TOP_DIR + DIR_SEP + "glerc";
+ if (std::find(triedLocations.begin(), triedLocations.end(), conf_name) == triedLocations.end()) {
+ triedLocations.push_back(conf_name);
+ has_config = try_load_config(conf_name);
+ }
+ }
+ }
+ if (!check_correct_version(conf_name, has_top, has_config, triedLocations, coll)) {
+ return false;
+ }
+ GLEInterface* iface = GLEGetInterfacePointer();
+ string uconf = iface->getUserConfigLocation();
+ if (uconf != "") {
+ // -> on Unix also $HOME/.glerc
+ try_load_config(uconf);
+ }
+ // Set values for -v option
+ init_installed_versions(cmdline, &coll);
+ return has_config;
+}
+
+void do_find_deps_sub(GLEInterface* iface, const string& loc) {
+ string myloc = loc;
+#ifdef __WIN32__
+ if (myloc.length() == 0) {
+ GLEGetEnv("ProgramFiles", myloc);
+ }
+#endif
+ find_deps(myloc, iface);
+}
+
+void do_save_config() {
+ GLEInterface* iface = GLEGetInterfacePointer();
+ string conf_name = GLE_TOP_DIR + DIR_SEP + "glerc";
+ bool is_ok = try_save_config(conf_name, iface, false);
+ if (!is_ok) {
+ string user_conf = iface->getUserConfigLocation();
+ is_ok = try_save_config(user_conf, iface, true);
+ }
+ if (!is_ok) {
+ ostringstream err;
+ err << ">>> Can't write to config file '" << conf_name << "'" << endl;
+ GLEOutputStream* output = iface->getOutput();
+ output->println(err.str().c_str());
+ }
+}
+
+void do_find_deps(CmdLineObj& cmdline) {
+ // Save config if find deps
+ if (cmdline.hasOption(GLE_OPT_FINDDEPS)) {
+ GLEInterface* iface = GLEGetInterfacePointer();
+ CmdLineArgString* arg = (CmdLineArgString*)cmdline.getOption(GLE_OPT_FINDDEPS)->getArg(0);
+ do_find_deps_sub(iface, arg->getValue());
+ do_save_config();
+ do_wait_for_enter();
+ exit(0);
+ }
+}
+
+GLEGlobalConfig::GLEGlobalConfig() {
+ m_CmdLine = NULL;
+ m_Config = NULL;
+ m_AllowConfigBlocks = false;
+}
+
+GLEGlobalConfig::~GLEGlobalConfig() {
+}
+
+void GLEGlobalConfig::initCmdLine() {
+ m_AllowReadDirs.clear();
+ if (getCmdLine()->hasOption(GLE_OPT_ALLOWREAD)) {
+ GLEPathToVector(getCmdLine()->getOptionString(GLE_OPT_ALLOWREAD), &m_AllowReadDirs);
+ }
+ m_AllowWriteDirs.clear();
+ if (getCmdLine()->hasOption(GLE_OPT_ALLOWWRITE)) {
+ GLEPathToVector(getCmdLine()->getOptionString(GLE_OPT_ALLOWWRITE), &m_AllowWriteDirs);
+ }
+}
+
+int g_verbosity() {
+ return g_CmdLine.getIntValue(GLE_OPT_VERBOSITY);
+}
diff --git a/src/gle/config.h b/src/gle/config.h
new file mode 100644
index 0000000..e5d5c0a
--- /dev/null
+++ b/src/gle/config.h
@@ -0,0 +1,146 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#ifndef GLE_CONFIG_H
+#define GLE_CONFIG_H
+
+typedef enum {
+ GLE_OPT_HELP,
+ GLE_OPT_INFO,
+ GLE_OPT_VERBOSITY,
+ GLE_OPT_DEVICE,
+ GLE_OPT_CAIRO,
+ GLE_OPT_DPI,
+ GLE_OPT_FULL_PAGE,
+ GLE_OPT_LANDSCAPE,
+ GLE_OPT_OUTPUT,
+ GLE_OPT_NOSAVE,
+ GLE_OPT_COPY,
+ GLE_OPT_PREVIEW,
+ GLE_OPT_GSPREVIEW,
+ GLE_OPT_VERSION,
+ GLE_OPT_COMPAT,
+ GLE_OPT_CALC,
+ GLE_OPT_CATCSV,
+ GLE_OPT_TEX,
+ GLE_OPT_NO_PDFTEX,
+ GLE_OPT_CREATE_INC,
+ GLE_OPT_TEXINCPREF,
+ GLE_OPT_PAUSE,
+ GLE_OPT_MKINITTEX,
+ GLE_OPT_FINDDEPS,
+ GLE_OPT_NO_COLOR,
+ GLE_OPT_INVERSE,
+ GLE_OPT_TRANSPARENT,
+ GLE_OPT_BBTWEAK,
+ GLE_OPT_NO_CTRL_D,
+ GLE_OPT_NO_MAXPATH,
+ GLE_OPT_NO_LIGATURES,
+ GLE_OPT_GSOPTIONS,
+ GLE_OPT_SAFEMODE,
+ GLE_OPT_ALLOWREAD,
+ GLE_OPT_ALLOWWRITE,
+ GLE_OPT_KEEP,
+ GLE_OPT_TRACE,
+ GLE_OPT_DEBUG
+} GLECmdLineOption;
+
+#define GLE_CONFIG_GLE 0
+#define GLE_CONFIG_TOOLS 1
+#define GLE_CONFIG_TEX 2
+#define GLE_CONFIG_PAPER 3
+
+#define GLE_CONFIG_GLE_VERSION 0
+#define GLE_CONFIG_GLE_INSTALL 1
+
+#define GLE_CONFIG_PAPER_SIZE 0
+#define GLE_CONFIG_PAPER_MARGINS 1
+
+typedef enum {
+ GLE_TOOL_PDFTEX_CMD,
+ GLE_TOOL_PDFTEX_OPTIONS,
+ GLE_TOOL_LATEX_CMD,
+ GLE_TOOL_LATEX_OPTIONS,
+ GLE_TOOL_DVIPS_CMD,
+ GLE_TOOL_DVIPS_OPTIONS,
+ GLE_TOOL_GHOSTSCRIPT_CMD,
+ GLE_TOOL_GHOSTSCRIPT_LIB,
+ GLE_TOOL_GHOSTSCRIPT_OPTIONS,
+ GLE_TOOL_TEXT_EDITOR,
+ GLE_TOOL_PDF_VIEWER
+} GLEConfigTool;
+
+#define GLE_TEX_SYSTEM 0
+#define GLE_TEX_SYSTEM_LATEX 0
+#define GLE_TEX_SYSTEM_VTEX 1
+
+class GLEGlobalConfig {
+protected:
+ CmdLineObj* m_CmdLine;
+ ConfigCollection* m_Config;
+ bool m_AllowConfigBlocks;
+ vector<string> m_AllowReadDirs;
+ vector<string> m_AllowWriteDirs;
+public:
+ GLEGlobalConfig();
+ ~GLEGlobalConfig();
+ void initCmdLine();
+ inline CmdLineObj* getCmdLine() { return m_CmdLine; }
+ inline void setCmdLine(CmdLineObj* cmd) { m_CmdLine = cmd; }
+ inline ConfigCollection* getRCFile() { return m_Config; }
+ inline void setRCFile(ConfigCollection* config) { m_Config = config; }
+ inline bool allowConfigBlocks() { return m_AllowConfigBlocks; }
+ inline void setAllowConfigBlocks(bool allow) { m_AllowConfigBlocks = allow; }
+ inline int getNumberAllowReadDirs() { return m_AllowReadDirs.size(); }
+ inline const string& getAllowReadDir(int i) { return m_AllowReadDirs[i]; }
+ inline int getNumberAllowWriteDirs() { return m_AllowWriteDirs.size(); }
+ inline const string& getAllowWriteDir(int i) { return m_AllowWriteDirs[i]; }
+};
+
+bool try_load_config(const string& fname);
+void do_find_deps(CmdLineObj& cmdline);
+void do_find_deps_sub(GLEInterface* iface, const string& loc);
+void do_save_config();
+bool do_load_config(const char* appname, char **argv, CmdLineObj& cmdline, ConfigCollection& coll);
+void init_config(ConfigCollection* collection);
+string get_tool_path(int tool, ConfigSection* tools);
+
+const string& gle_config_margins();
+const string& gle_config_papersize();
+
+#endif
diff --git a/src/gle/core.cpp b/src/gle/core.cpp
new file mode 100644
index 0000000..1f8f290
--- /dev/null
+++ b/src/gle/core.cpp
@@ -0,0 +1,4080 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#define FONTDEF extern
+
+#include "all.h"
+#include "file_io.h"
+#include "bitmap/img2ps.h"
+#include "core.h"
+#include "d_interface.h"
+#include "justify.h"
+#include "gprint.h"
+#include "var.h"
+#include "sub.h"
+#include "cutils.h"
+#include "keyword.h"
+#include "run.h"
+#include "color.h"
+#include "texinterface.h"
+#include "tokens/stokenizer.h"
+#include "gle-interface/gle-interface.h"
+#include "font.h"
+#include "cmdline.h"
+#include "config.h"
+#include "glearray.h"
+#include "polish.h"
+
+void g_graph_init();
+void dis_mat(char *s,double m[3][3]);
+
+int mystrncmp(char *a, char *b, int n);
+gmodel g;
+double tmpimg[3][3];
+double tmpimg2[3][3];
+double font_lwidth;
+
+static int ngsave;
+static gmodel *gsave[100];
+
+int g_compatibility = GLE_COMPAT_MOST_RECENT;
+
+/*---------------------------------------------------------------------------*/
+
+#define dbg if ((gle_debug & 32)>0)
+extern int gle_debug;
+
+/*-----------------------------------------------*/
+/* The global variables that CORE keeps track of */
+/*-----------------------------------------------*/
+
+void test_unit(void);
+void clean_surface();
+void g_arrowsize_actual(GLEArrowProps* arrow, double* lwd, bool sz_az);
+void g_arrowsize_transform(GLEArrowProps* arrow, double lwd, bool sz_az);
+void g_set_color_to_device();
+void g_set_fill_to_device();
+
+int gunit=false;
+
+GLERectangle g_UserBoxDev;
+GLECore g_core;
+
+unsigned int coreleft() {
+ return 4000000;
+}
+
+unsigned int farcoreleft() {
+ return 1200000;
+}
+
+GLECore::GLECore()
+{
+}
+
+GLECore::~GLECore() {
+}
+
+void GLECore::reset() {
+ m_isComputingLength = false;
+ m_totalLength = 0.0;
+ m_showNoteAboutFallback = true;
+}
+
+bool GLECore::isComputingLength() const {
+ return m_isComputingLength;
+}
+
+void GLECore::setComputingLength(bool computingLength) {
+ m_isComputingLength = computingLength;
+}
+
+double GLECore::getTotalLength() const {
+ return m_totalLength;
+}
+
+void GLECore::setTotalLength(double length) {
+ m_totalLength = length;
+}
+
+void GLECore::addToLength(double value) {
+ m_totalLength += value;
+}
+
+bool GLECore::isShowNoteAboutFallback() const {
+ return m_showNoteAboutFallback;
+}
+
+void GLECore::setShowNoteAboutFallback(bool value) {
+ m_showNoteAboutFallback = value;
+}
+
+GLEWithoutUpdates::GLEWithoutUpdates() {
+ m_core = g_get_core();
+ m_isComputingLength = m_core->isComputingLength();
+ m_core->setComputingLength(false);
+}
+
+GLEWithoutUpdates::~GLEWithoutUpdates() {
+ m_core->setComputingLength(m_isComputingLength);
+}
+
+GLECore* g_get_core() {
+ return &g_core;
+}
+
+// Called only once g_clear is called for each script.
+void g_init() {
+ clean_surface();
+ g.devtype = GLE_DEVICE_NONE;
+ g.dev = NULL;
+ g.console_output = false;
+ g.needs_newline = true;
+ g_graph_init();
+}
+
+void g_get_version(string* version) {
+ *version = GLEVN;
+ #ifdef GLE_SNAPSHOT
+ *version += GLE_SNAPSHOT;
+ #endif
+}
+
+void g_get_build_date(string* date) {
+ date->resize(0);
+#if defined(__TIME__) && defined(__DATE__)
+ string bdate(__DATE__);
+ bdate += " "; bdate += __TIME__;
+ str_replace_all(bdate, " ", " ");
+ *date = bdate;
+#endif
+}
+
+string g_get_version() {
+ string version;
+ g_get_version(&version);
+ return version;
+}
+
+string g_get_version_nosnapshot() {
+ return string(GLEVN);
+}
+
+const char* g_device_to_ext(int device) {
+ switch (device) {
+ case GLE_DEVICE_EPS:
+ case GLE_DEVICE_CAIRO_EPS:
+ return ".eps";
+ case GLE_DEVICE_PS:
+ case GLE_DEVICE_CAIRO_PS:
+ return ".ps";
+ case GLE_DEVICE_PDF:
+ case GLE_DEVICE_CAIRO_PDF:
+ return ".pdf";
+ case GLE_DEVICE_SVG:
+ case GLE_DEVICE_CAIRO_SVG:
+ return ".svg";
+ case GLE_DEVICE_JPEG:
+ return ".jpg";
+ case GLE_DEVICE_PNG:
+ return ".png";
+ default:
+ return "";
+ }
+}
+
+GLEDevice* g_select_device(int device) {
+ g.devtype = device;
+ if (g.dev != NULL) {
+ delete g.dev;
+ g.dev = NULL;
+ }
+ switch (device) {
+ case GLE_DEVICE_PS:
+ g.dev = new PSGLEDevice(false);
+ break;
+ case GLE_DEVICE_EPS:
+ g.dev = new PSGLEDevice(true);
+ break;
+ case GLE_DEVICE_DUMMY:
+ g.dev = new GLEDummyDevice(false);
+ break;
+#ifdef HAVE_CAIRO
+ case GLE_DEVICE_CAIRO_PDF:
+ g.dev = new GLECairoDevicePDF(false);
+ break;
+ case GLE_DEVICE_CAIRO_EPS:
+ g.dev = new GLECairoDeviceEPS(false);
+ break;
+ case GLE_DEVICE_CAIRO_SVG:
+ g.dev = new GLECairoDeviceSVG(false);
+ break;
+#ifdef __WIN32__
+ case GLE_DEVICE_EMF:
+ g.dev = new GLECairoDeviceEMF(false);
+ break;
+#endif
+#endif
+#ifdef HAVE_X11
+ case GLE_DEVICE_X11:
+ g.dev = new X11GLEDevice();
+ break;
+#endif
+ }
+ return g.dev;
+}
+
+GLEDevice* g_set_dummy_device() {
+ g_flush();
+ GLEDevice* previous = g.dev;
+ g.dev = new GLEDummyDevice(false);
+ g.devtype = GLE_DEVICE_DUMMY;
+ return previous;
+}
+
+void g_restore_device(GLEDevice* device) {
+ if (device != NULL) {
+ g_flush();
+ delete g.dev;
+ g.dev = device;
+ g.devtype = device->getDeviceType();
+ }
+}
+
+GLEDevice* g_get_device_ptr() {
+ return g.dev;
+}
+
+int g_get_device() {
+ return g.devtype;
+}
+
+bool g_is_dummy_device() {
+ return g.devtype == GLE_DEVICE_DUMMY;
+}
+
+void g_devcmd(const char *s) {
+ g.dev->devcmd(s);
+}
+
+void g_resetfont() {
+ g.dev->resetfont();
+}
+
+void g_dfont(const std::string& s) {
+ g.dev->dfont((char*)s.c_str());
+}
+
+GLERC<GLEColor> g_get_fill_clear() {
+ GLERC<GLEColor> color(new GLEColor());
+ color->setTransparent(true);
+ return color;
+}
+
+GLERC<GLEColor> g_get_color_hex(int hexValue) {
+ GLERC<GLEColor> color(new GLEColor());
+ color->setHexValue(hexValue);
+ return color;
+}
+
+void g_hint(char *s) {
+ gprint("%s\n",s);
+}
+
+void g_message(const string& s) {
+ g_message(s.c_str());
+}
+
+void g_message(const char *s) {
+ GLEInterface* iface = GLEGetInterfacePointer();
+ if (!g.console_output) {
+ g.console_output = true;
+ if (g.needs_newline) iface->getOutput()->println();
+ }
+ iface->getOutput()->println(s);
+}
+
+bool g_has_console_output() {
+ return g.console_output;
+}
+
+void g_set_console_output(bool set) {
+ g.console_output = set;
+}
+
+bool g_reset_message() {
+ bool res = g.console_output;
+ if (g.console_output) {
+ cerr << endl;
+ }
+ g.console_output = false;
+ return res;
+}
+
+void g_message_first_newline(bool newline) {
+ g.needs_newline = newline;
+}
+
+void g_get_end(dbl *x,dbl *y) {
+ *x = tex_xend();
+ *y = tex_yend();
+}
+
+void g_set_end(dbl x,dbl y) {
+ gprint("What is setting end \n");
+}
+
+void g_get_usersize(dbl *x,dbl *y) {
+ *x = g.userwidth;
+ *y = g.userheight;
+}
+
+void g_get_pagesize(dbl *x,dbl *y) {
+ *x = g.pagewidth;
+ *y = g.pageheight;
+}
+
+void g_get_pagesize(dbl *x, dbl *y, int *type) {
+ *x = g.pagewidth;
+ *y = g.pageheight;
+ *type = g.papersize;
+}
+
+void g_get_bounds(dbl *x1,dbl *y1,dbl *x2,dbl *y2) {
+ *x1 = g.xmin;
+ *y1 = g.ymin;
+ *x2 = g.xmax;
+ *y2 = g.ymax;
+}
+
+void g_init_bounds() {
+ g.xmin = 1e30;
+ g.ymin = 1e30;
+ g.xmax = -1e30;
+ g.ymax = -1e30;
+}
+
+std::string g_get_type() {
+ return g.dev->get_type();
+}
+
+void g_set_path(int onoff) {
+ if (static_cast<bool>(onoff)==g.inpath) return;
+ g_flush();
+ if (static_cast<bool>(onoff) == true) {
+ g.inpath=true;
+ g.npath = 0;
+ g.xinline=false;
+ } else {
+ g.inpath = false;
+ g.xinline = false;
+ }
+ g.dev->set_path(onoff);
+}
+
+void g_get_path(int *onoff) {
+ *onoff = g.inpath;
+}
+
+void g_newpath() {
+ g.npath = 0;
+ g.dev->newpath();
+}
+
+void g_set_size(double width, double height, bool box) {
+ g.userwidth = width;
+ g.userheight = height;
+ g.hasbox = box;
+}
+
+bool g_has_size() {
+ return g.userwidth > 0 && g.userheight > 0;
+}
+
+void g_set_pagesize(double width, double height) {
+ g.pagewidth = width;
+ g.pageheight = height;
+ g.papersize = GLE_PAPER_UNKNOWN;
+}
+
+void g_set_margins(double top, double bottom, double left, double right) {
+ g.topmargin = top; g.bottommargin = bottom;
+ g.leftmargin = left; g.rightmargin = right;
+}
+
+int g_papersize_type(const string& papersize) {
+ if (papersize == "a0paper") {
+ return GLE_PAPER_A0;
+ } else if (papersize == "a1paper") {
+ return GLE_PAPER_A1;
+ } else if (papersize == "a2paper") {
+ return GLE_PAPER_A2;
+ } else if (papersize == "a3paper") {
+ return GLE_PAPER_A3;
+ } else if (papersize == "a4paper") {
+ return GLE_PAPER_A4;
+ } else if (papersize == "letterpaper") {
+ return GLE_PAPER_LETTER;
+ } else {
+ return GLE_PAPER_UNKNOWN;
+ }
+}
+
+/*
+4A0 1682 � 2378 ? ? ? ?
+2A0 1189 � 1682 ? ? ? ?
+A0 841 � 1189 B0 1000 � 1414 C0 917 � 1297
+A1 594 � 841 B1 707 � 1000 C1 648 � 917
+A2 420 � 594 B2 500 � 707 C2 458 � 648
+A3 297 � 420 B3 353 � 500 C3 324 � 458
+A4 210 � 297 B4 250 � 353 C4 229 � 324
+A5 148 � 210 B5 176 � 250 C5 162 � 229
+A6 105 � 148 B6 125 � 176 C6 114 � 162
+A7 74 � 105 B7 88 � 125 C7 81 � 114
+A8 52 � 74 B8 62 � 88 C8 57 � 81
+A9 37 � 52 B9 44 � 62 C9 40 � 57
+A10 26 � 37 B10 31 � 44 C10 28 � 40
+*/
+
+void g_set_pagesize(int type) {
+ g.papersize = type;
+ switch (type) {
+ case GLE_PAPER_A0:
+ g.pagewidth = 84.1;
+ g.pageheight = 118.9; break;
+ case GLE_PAPER_A1:
+ g.pagewidth = 59.4;
+ g.pageheight = 84.1; break;
+ case GLE_PAPER_A2:
+ g.pagewidth = 42.0;
+ g.pageheight = 59.4; break;
+ case GLE_PAPER_A3:
+ g.pagewidth = 29.7;
+ g.pageheight = 42.0; break;
+ case GLE_PAPER_A4:
+ g.pagewidth = 21.0;
+ g.pageheight = 29.7; break;
+ case GLE_PAPER_LETTER:
+ g.pagewidth = 21.6;
+ g.pageheight = 27.9; break;
+ }
+}
+
+void g_set_pagesize(const string& papersize) throw (ParserError) {
+ SpaceStringTokenizer tokens(papersize.c_str());
+ const string& token = tokens.next_token();
+ int type = g_papersize_type(token);
+ if (type != GLE_PAPER_UNKNOWN) {
+ g_set_pagesize(type);
+ } else {
+ tokens.pushback_token();
+ g.pagewidth = tokens.next_double();
+ g.pageheight = tokens.next_double();
+ g.papersize = GLE_PAPER_UNKNOWN;
+ }
+}
+
+void g_set_margins(const string& margins) throw (ParserError) {
+ SpaceStringTokenizer tokens(margins.c_str());
+ g.topmargin = tokens.next_double();
+ g.bottommargin = tokens.next_double();
+ g.leftmargin = tokens.next_double();
+ g.rightmargin = tokens.next_double();
+}
+
+void g_set_rotate_fullpage(bool rotfp) {
+ g.rotate = rotfp;
+}
+
+bool g_is_rotate_fullpage() {
+ return g.rotate;
+}
+
+void g_set_fullpage(bool fullpage) {
+ g.fullpage = fullpage;
+}
+
+bool g_is_fullpage() {
+ return g.fullpage;
+}
+
+void g_set_landscape(bool landscape) {
+ g.landscape = landscape;
+}
+
+bool g_is_landscape() {
+ return g.landscape;
+}
+
+double g_draw_width() {
+ if (g_is_landscape()) {
+ return g.pageheight - g.leftmargin - g.rightmargin;
+ } else {
+ return g.pagewidth - g.leftmargin - g.rightmargin;
+ }
+}
+
+double g_draw_height() {
+ if (g_is_landscape()) {
+ return g.pagewidth - g.topmargin - g.bottommargin;
+ } else {
+ return g.pageheight - g.topmargin - g.bottommargin;
+ }
+}
+
+void g_open(GLEFileLocation* outputfile, const string& inputfile) {
+ if (g.isopen) return;
+ g.isopen = true;
+ g_reset_message();
+ bool centerfig = false;
+ double scalefac = 1.0;
+ if (g.userwidth < 0 || g.userheight < 0) {
+ // No size command given: full page + all available space
+ g.userwidth = g_draw_width();
+ g.userheight = g_draw_height();
+ g.fullpage = true;
+ } else {
+ // Center figure if full page mode
+ centerfig = true;
+ if (g.fullpage) {
+ // how much area is outside the page in landscape / portrait mode?
+ double area_horiz_norm = max(0.0, g.userwidth - g.pagewidth) * g.userheight;
+ double area_vert_norm = max(0.0, g.userheight - g.pageheight) * g.userwidth;
+ double area_horiz_land = max(0.0, g.userheight - g.pagewidth) * g.userwidth;
+ double area_vert_land = max(0.0, g.userwidth - g.pageheight) * g.userheight;
+ if (area_horiz_land + area_vert_land < area_horiz_norm + area_vert_norm) {
+ g_set_landscape(true);
+ }
+ double userWidth = g.userwidth;
+ double userHeight = g.userheight;
+ if (g_is_landscape()) {
+ userWidth = g.userheight;
+ userHeight = g.userwidth;
+ }
+ if (userWidth > g.pagewidth) {
+ scalefac = g.pagewidth / userWidth;
+ }
+ if (userHeight > g.pageheight) {
+ scalefac = min(scalefac, g.pageheight / userHeight);
+ }
+ // cout << endl << "scale = " << scalefac << endl;
+ }
+ }
+ if (g.fullpage) {
+ if (g_get_compatibility() <= GLE_COMPAT_35) {
+ if (!g_is_rotate_fullpage()) {
+ // No real fullpage mode in 3.5
+ g.dev->opendev(g.pagewidth, g.pageheight, outputfile, inputfile);
+ g_on_open();
+ // This is rather arbitrary, but this is how it was in 3.x
+ g_translate(1.5, 1.01);
+ if (g.userwidth > g.userheight) {
+ // Rotate page in landscape mode (not just the figure)
+ g_move(0.0,0.0);
+ g_rotate(90.0);
+ g_translate(0.0,-g.userheight);
+ g_move(0.0,0.0);
+ }
+ } else {
+ // Rotate page into landscape mode
+ g.dev->opendev(g.pageheight, g.pagewidth, outputfile, inputfile);
+ g_on_open();
+ if (g.userwidth > g.userheight) {
+ // Rotates cancel out
+ g_translate(1.01, -1.5+g.pagewidth-g.userheight);
+ } else {
+ g_translate(0, g.pagewidth);
+ g_rotate(-90.0);
+ g_translate(1.5, 1.01);
+ }
+ }
+ } else {
+ if (!g_is_rotate_fullpage()) {
+ g.dev->opendev(g.pagewidth, g.pageheight, outputfile, inputfile);
+ g_on_open();
+ if (g_is_landscape()) {
+ // Note: landscape only rotates the figure, not the full page
+ // -> this is how it was intended (don't change this)
+ g_translate(g.pagewidth, 0);
+ g_rotate(90.0);
+ }
+ } else {
+ g.dev->opendev(g.pageheight, g.pagewidth, outputfile, inputfile);
+ g_on_open();
+ if (!g_is_landscape()) {
+ // This rotation together with landscape cancels out
+ g_translate(0, g.pagewidth);
+ g_rotate(-90.0);
+ }
+ }
+ if (centerfig) {
+ double left = g.leftmargin + (g_draw_width() - g.userwidth)/2;
+ double bottom = g.bottommargin + (g_draw_height() - g.userheight)/2;
+ g_translate(left, bottom);
+ } else {
+ g_translate(g.leftmargin, g.bottommargin);
+ }
+ }
+ } else {
+ g.dev->opendev(g.userwidth, g.userheight, outputfile, inputfile);
+ g_on_open();
+ }
+ g_UserBoxDev.setDimensions(0.0, 0.0, g.userwidth, g.userheight);
+ g_dev(&g_UserBoxDev);
+ if (g.hasbox) {
+ g_box_stroke(0.0, 0.0, g.userwidth, g.userheight, false);
+ }
+}
+
+void g_get_userbox_undev(GLERectangle* rect) {
+ rect->copy(&g_UserBoxDev);
+ g_undev(rect);
+}
+
+void g_close() {
+ g.isopen = false;
+ g_flush();
+ g.dev->closedev();
+}
+
+void g_pscomment(char* ss) {
+ if(g.isopen) {
+ gprint("Can't call PSCOMMENT before SIZE command. Ignoring\n");
+ } else {
+ g.dev->pscomment(ss);
+ }
+}
+
+void g_psbbtweak(void) {
+}
+
+bool g_is_bbtweak() {
+ // return g.bbtweak;
+ return true;
+}
+
+void g_set_line_cap(int i) {
+ /* lcap, 0= butt, 1=round, 2=projecting square */
+ if (i<0 || i>2) {
+ gprint("Invalid line cap, {%d}, valid numbers are \n",i);
+ gprint(" 0= butt, 1=round, 2=projecting square \n");
+ }
+ g.dev->set_line_cap(i);
+ g.lcap = i;
+}
+
+void g_set_line_join(int i) {
+ if (i<0 || i>2) {
+ gprint("Invalid line join, {%d}, valid numbers are \n",i);
+ gprint(" 0= mitre, 1=round, 2=bevel \n");
+ }
+ g.dev->set_line_join(i);
+ g.ljoin = i;
+}
+
+void g_get_line_join(int *i) {
+ *i = g.ljoin;
+}
+
+void g_get_line_cap(int *i) {
+ *i = g.lcap;
+}
+
+void g_set_line_miterlimit(double d) {
+ g.dev->set_line_miterlimit(d);
+ g.miterlimit = d;
+}
+
+void g_get_line_width(double *w) {
+ *w = g.lwidth;
+}
+
+void g_set_line_width(double w) {
+ if (w < 0) return;
+ g.dev->set_line_width(w);
+ g.lwidth = w;
+}
+
+void g_set_font_width(double w) {
+ font_lwidth = w;
+}
+
+void g_get_line_styled(double *w) {
+ *w = g.lstyled;
+}
+
+void g_set_line_styled(double w) {
+ if (w==0) return;
+ g.dev->set_line_styled(w);
+ g.lstyled = w;
+}
+
+void g_set_line_style(const char *s) {
+ g.dev->set_line_style(s);
+ strncpy(g.lstyle,s,8);
+}
+
+void g_get_line_style(char *s) {
+ strncpy(s, (char *)&g.lstyle, 8);
+}
+
+double g_get_angle_deg() {
+ if (fabs(g.image[0][0]) <= 1e-6) {
+ return g.image[1][0] > 0.0 ? 90.0 : -90.0;
+ } else {
+ return myatan2(g.image[1][0], g.image[0][0])*180/GLE_PI;
+ }
+}
+
+void g_get_scale(double* sx, double* sy) {
+ double x0, y0, x1, y1;
+ g_dev(0.0, 0.0, &x0, &y0);
+ g_dev(1.0, 1.0, &x1, &y1);
+ *sx = (x1-x0)/PS_POINTS_PER_INCH*CM_PER_INCH;
+ *sy = (y1-y0)/PS_POINTS_PER_INCH*CM_PER_INCH;
+}
+
+double g_get_avg_scale() {
+ double sx, sy;
+ g_get_scale(&sx, &sy);
+ return (sx + sy)/2.0;
+}
+
+void g_dev(double x, double y, double *xd, double *yd) {
+ if (static_cast<bool>(gunit)==true) {
+ *xd = x; *yd = y;
+ } else {
+ *xd = g.image[0][0]*x + g.image[0][1]*y + g.image[0][2];
+ *yd = g.image[1][0]*x + g.image[1][1]*y + g.image[1][2];
+ }
+}
+
+void g_dev(GLEPoint* pt) {
+ g_dev(pt->m_X, pt->m_Y, &pt->m_X, &pt->m_Y);
+}
+
+void g_dev_rel(GLEPoint* pt) {
+ pt->m_X = g.image[0][0]*pt->m_X + g.image[0][1]*pt->m_Y;
+ pt->m_Y = g.image[1][0]*pt->m_X + g.image[1][1]*pt->m_Y;
+}
+
+void g_dev(GLERectangle* rect) {
+ double x1, x2, y1, y2;
+ g_dev(rect->getXMin(), rect->getYMin(), &x1, &y1);
+ g_dev(rect->getXMax(), rect->getYMax(), &x2, &y2);
+ rect->setDimensions(x1, y1, x2, y2);
+ rect->normalize();
+}
+
+void g_undev(double ux, double uy, double *x, double *y, gmodel* model) {
+ static double xx,yy,cdiv,xd,yd;
+ if (static_cast<bool>(gunit) == true) {
+ *x = ux; *y = uy;
+ } else {
+ cdiv = ( model->image[0][1]*model->image[1][0] - model->image[0][0]*model->image[1][1] );
+ if (cdiv == 0) {
+ gprint("Image matrix FLAT, a 1D world, giving up \n");
+ return;
+ }
+ xd = ux - model->image[0][2];
+ yd = uy - model->image[1][2];
+ xx = -xd*model->image[1][1] + yd*model->image[0][1];
+ *x = xx/cdiv;
+ yy = xd*model->image[1][0]-yd*model->image[0][0];
+ *y = yy/cdiv;
+ }
+}
+
+void g_undev(double ux, double uy, double *x, double *y) {
+ g_undev(ux, uy, x, y, &g);
+}
+
+void g_undev(GLERectangle* rect, gmodel* g) {
+ double x1, x2, y1, y2;
+ g_undev(rect->getXMin(), rect->getYMin(), &x1, &y1, g);
+ g_undev(rect->getXMax(), rect->getYMax(), &x2, &y2, g);
+ rect->setDimensions(x1, y1, x2, y2);
+ rect->normalize();
+}
+
+void g_undev(GLERectangle* rect) {
+ double x1, x2, y1, y2;
+ g_undev(rect->getXMin(), rect->getYMin(), &x1, &y1);
+ g_undev(rect->getXMax(), rect->getYMax(), &x2, &y2);
+ rect->setDimensions(x1, y1, x2, y2);
+ rect->normalize();
+}
+
+void g_rundev(double x, double y,double *xd,double *yd) {
+ static double zx,zy;
+ g_undev(0,0,&zx,&zy);
+ g_undev(x,y,xd,yd);
+ *xd -= zx;
+ *yd -= zy;
+}
+
+void g_rdev(double x, double y,double *xd,double *yd) {
+ static double zx,zy;
+ g_dev(0,0,&zx,&zy);
+ g_dev(x,y,xd,yd);
+ *xd -= zx;
+ *yd -= zy;
+}
+
+void g_fill() {
+ g.dev->fill();
+}
+
+void g_fill_ary(int nwk,double *wkx,double *wky) {
+ g.dev->fill_ary(nwk,wkx,wky);
+}
+
+void g_line_ary(int nwk,double *wkx,double *wky) {
+ g.dev->line_ary(nwk,wkx,wky);
+}
+
+void g_stroke() {
+ g.dev->stroke();
+}
+
+void g_clip() {
+ /* Find the intersection of the current path with the clipping path */
+ /* and thus define a new clipping path */
+ g.dev->clip();
+}
+
+void g_set_matrix(double newmat[3][3], gmodel* old_g, gmodel* new_g) {
+ double x1, y1, x2, y2, x3, y3, x4, y4;
+ double a1, b1, a2, b2, a3, b3, a4, b4;
+ bool modified = false;
+ bool has_box = g_has_box(old_g);
+ // Check if transformation matrix is different from old one
+ if (memcmp(newmat, old_g->image, GLE_TRNS_MATRIX_SIZE) != 0) {
+ if (has_box) {
+ g_dev(old_g->xmin, old_g->ymin, &x1, &y1);
+ g_dev(old_g->xmax, old_g->ymin, &x2, &y2);
+ g_dev(old_g->xmax, old_g->ymax, &x3, &y3);
+ g_dev(old_g->xmin, old_g->ymax, &x4, &y4);
+ #ifdef CORE_MATRIX_DEBUG
+ cout << "c1 : " << old_g->xmin << ", " << old_g->ymin << endl;
+ cout << "c2 : " << old_g->xmax << ", " << old_g->ymin << endl;
+ cout << "c3 : " << old_g->xmax << ", " << old_g->ymax << endl;
+ cout << "c4 : " << old_g->xmin << ", " << old_g->ymax << endl;
+ #endif
+ }
+ new_g->dev->set_matrix(newmat);
+ if (newmat != new_g->image) memcpy(&new_g->image, newmat, GLE_TRNS_MATRIX_SIZE);
+ modified = true;
+ }
+ #ifdef CORE_MATRIX_DEBUG
+ cout << "modified: " << modified << " has box: " << has_box << " min " << old_g->xmin << " max " << old_g->xmax << endl;
+ #endif
+ if (has_box) {
+ if (modified) {
+ g_undev(x1, y1, &a1, &b1, new_g);
+ g_undev(x2, y2, &a2, &b2, new_g);
+ g_undev(x3, y3, &a3, &b3, new_g);
+ g_undev(x4, y4, &a4, &b4, new_g);
+ g_set_bounds(a1, b1, new_g);
+ g_set_bounds(a2, b2, new_g);
+ g_set_bounds(a3, b3, new_g);
+ g_set_bounds(a4, b4, new_g);
+ #ifdef CORE_MATRIX_DEBUG
+ cout << "c1 : " << a1 << ", " << b1 << endl;
+ cout << "c2 : " << a2 << ", " << b2 << endl;
+ cout << "c3 : " << a3 << ", " << b3 << endl;
+ cout << "c4 : " << a4 << ", " << b4 << endl;
+ #endif
+ } else {
+ g_set_bounds(old_g->xmin, old_g->ymin, new_g);
+ g_set_bounds(old_g->xmax, old_g->ymax, new_g);
+ #ifdef CORE_MATRIX_DEBUG
+ cout << "update : " << old_g->xmin << ", " << old_g->ymin << endl;
+ cout << "update : " << old_g->xmax << ", " << old_g->ymax << endl;
+ cout << "yields : " << new_g->xmin << ", " << new_g->ymin << endl;
+ cout << "yields : " << new_g->xmax << ", " << new_g->ymax << endl;
+ #endif
+ }
+ }
+}
+
+void g_set_matrix(double newmat[3][3]) {
+ g_set_matrix(newmat, &g, &g);
+}
+
+void g_clear_matrix() {
+ /* Clear transformation matrix */
+ for (int i = 0; i < 3; i++) {
+ for (int j = 0; j < 3; j++) {
+ g.image[i][j] = 0.0;
+ }
+ g.image[i][i] = 1.0;
+ }
+}
+
+void mat_mult(double a[3][3],double b[3][3]) {
+ static double c[3][3],tot;
+ int y,xb,x;
+ for (y=0;y<3;y++) {
+ for (xb=0;xb<3;xb++) {
+ tot = 0;
+ for (x=0;x<3;x++) tot += a[x][y] * b[xb][x];
+ c[xb][y] = tot;
+ }
+ }
+ memcpy(a,&c,GLE_TRNS_MATRIX_SIZE); /* maybe sizeof(*a) would be better? */
+}
+
+void g_rotate(double ar) {
+ static double r[3][3],unx,uny,cx,cy;
+ if (ar == 0.0) {
+ /* Do not have to do anything if arrow is zero */
+ return;
+ }
+ ar = GLE_PI*ar/180;
+ r[0][0] = cos(ar);
+ r[0][1] = -sin(ar);
+ r[1][0] = sin(ar);
+ r[1][1] = cos(ar);
+ r[2][2] = 1;
+ g_dev(g.curx,g.cury,&cx,&cy);
+ g_rundev(-cx,-cy,&unx,&uny);
+ g_translate(unx,uny);
+ memcpy(tmpimg,g.image,GLE_TRNS_MATRIX_SIZE);
+ mat_mult(tmpimg,r);
+ g_set_matrix(tmpimg);
+ g_rundev(cx,cy,&unx,&uny);
+ g_translate(unx,uny); /* not shore about this ORIGIN stuff */
+ test_unit();
+}
+
+void gg_unrotate(void);
+void gg_rerotate(void);
+
+void g_scale(double sx,double sy) {
+ /* The idea is to rotate or scale about the CURRENT POINT */
+ static double r[3][3],unx,uny,cx,cy;
+ r[0][0] = sx;
+ r[1][1] = sy;
+ r[2][2] = 1;
+
+ gg_unrotate();
+ g_dev(g.curx,g.cury,&cx,&cy);
+ g_rundev(-cx,-cy,&unx,&uny);
+ g_translate(unx,uny);
+ memcpy(tmpimg,g.image,GLE_TRNS_MATRIX_SIZE);
+ mat_mult(tmpimg,r);
+ g_set_matrix(tmpimg);
+ g_rundev(cx,cy,&unx,&uny);
+ g_translate(unx,uny); /* not shore about this ORIGIN stuff */
+ gg_rerotate();
+ test_unit();
+}
+
+void g_shear(double sx,double sy) {
+ /* The idea is to rotate or scale about the CURRENT POINT */
+ static double r[3][3],unx,uny,cx,cy;
+ r[0][0] = 1;
+ r[1][0] = sy;
+ r[1][1] = 1;
+ r[0][1] = sx;
+ r[2][2] = 1;
+
+ gg_unrotate();
+ g_dev(g.curx,g.cury,&cx,&cy);
+ g_rundev(-cx,-cy,&unx,&uny);
+ g_translate(unx,uny);
+ memcpy(tmpimg,g.image,GLE_TRNS_MATRIX_SIZE);
+ mat_mult(tmpimg,r);
+ g_set_matrix(tmpimg);
+ g_rundev(cx,cy,&unx,&uny);
+ g_translate(unx,uny); /* not shore about this ORIGIN stuff */
+ gg_rerotate();
+ test_unit();
+}
+
+static double ggra;
+void gg_rerotate() {
+ g_rotate(ggra);
+}
+
+void gg_unrotate() {
+ double ox,oy,x1,y0,dx,dy,tt;
+ g_dev(0.0,0.0,&ox,&oy);
+ g_dev(1.0,0.0,&x1,&y0);
+ dx = x1-ox;
+ dy = y0-oy;
+ tt = myatan2(dy,dx);
+ ggra = tt * 180.0 / GLE_PI;
+ g_rotate(-ggra);
+}
+
+void dis_mat(char *s,double m[3][3]) {
+ gprint("\n Matrix {%s} \n",s);
+ for (int i = 0; i < 3; i++) {
+ gprint(" %f %f %f \n",m[0][i],m[1][i],m[2][i]);
+ }
+}
+
+void g_translate(double ztx,double zty) {
+ static double tx,ty,r[3][3];
+ g_rdev(ztx,zty,&tx,&ty);
+
+ r[0][0] = 1;
+ r[1][1] = 1;
+ r[2][2] = 1;
+ r[0][2] = tx;
+ r[1][2] = ty;
+ memcpy(tmpimg,g.image,GLE_TRNS_MATRIX_SIZE);
+ mat_mult(tmpimg,r);
+ g_set_matrix(tmpimg);
+ test_unit();
+}
+
+void g_move(const GLEPoint& pt) {
+ g_move(pt.getX(), pt.getY());
+}
+
+void g_move(double zx, double zy) {
+ if (static_cast<bool>(g.xinline)==true) g_flush();
+ g.dev->move(zx,zy);
+ g.curx = zx;
+ g.cury = zy;
+ g.closex = zx;
+ g.closey = zy;
+}
+
+void g_set_pos(double zx,double zy) {
+ g.curx = zx;
+ g.cury = zy;
+ g_update_bounds(zx,zy);
+}
+
+void g_set_pos(const GLEPoint& p) {
+ g.curx = p.getX();
+ g.cury = p.getY();
+ g_update_bounds(p.getX(), p.getY());
+}
+
+void g_rset_pos(double x, double y) {
+ g.curx += x;
+ g.cury += y;
+ g_update_bounds(g.curx,g.cury);
+}
+
+void g_rmove(double zx,double zy) {
+ g_move(g.curx+zx,g.cury+zy);
+}
+
+void g_rline(double zx,double zy) {
+ g_line(g.curx+zx,g.cury+zy);
+}
+
+void g_reverse() {
+ g.dev->reverse();
+}
+
+void g_closepath() {
+ if (g.inpath) g.dev->closepath();
+ else g_line(g.closex,g.closey);
+ g.curx = g.closex;
+ g.cury = g.closey;
+ if (!g.inpath) g_flush();
+}
+
+void g_line(const GLEPoint& p) {
+ g_line(p.getX(), p.getY());
+}
+
+void g_line(double zx, double zy) {
+ GLEPoint origin;
+ g_get_xy(&origin);
+ g.dev->line(zx,zy);
+ if (g.xinline == false) {
+ g.xinline = true;
+ g_update_bounds(g.curx, g.cury);
+ }
+ g.curx = zx;
+ g.cury = zy;
+ g_update_bounds(zx, zy);
+ GLECore* core = g_get_core();
+ if (core->isComputingLength()) {
+ GLEPoint endPoint(zx, zy);
+ core->addToLength(origin.distance(endPoint));
+ }
+}
+
+void g_update_bounds(double x, double y) {
+ if (x < g.xmin) g.xmin = x;
+ if (x > g.xmax) g.xmax = x;
+ if (y < g.ymin) g.ymin = y;
+ if (y > g.ymax) g.ymax = y;
+ //g_check_bounds("after g_set_bounds");
+}
+
+void g_set_bounds(double x, double y, gmodel* model) {
+ if (x < model->xmin) model->xmin = x;
+ if (x > model->xmax) model->xmax = x;
+ if (y < model->ymin) model->ymin = y;
+ if (y > model->ymax) model->ymax = y;
+}
+
+bool g_has_box(gmodel* model) {
+ return model->xmin <= model->xmax && model->ymin <= model->ymax;
+}
+
+void g_update_bounds_box(GLERectangle* box) {
+ // cout << "update " << g.xmin << " " << g.xmax << " " << g.ymin << " " << g.ymax << endl;
+ if (g_has_box(&g)) {
+ if (g.xmin < box->getXMin()) box->setXMin(g.xmin);
+ if (g.xmax > box->getXMax()) box->setXMax(g.xmax);
+ if (g.ymin < box->getYMin()) box->setYMin(g.ymin);
+ if (g.ymax > box->getYMax()) box->setYMax(g.ymax);
+ }
+}
+
+void g_restore_bounds(double xmin, double xmax, double ymin, double ymax) {
+ g.xmin = xmin;
+ g.xmax = xmax;
+ g.ymin = ymin;
+ g.ymax = ymax;
+}
+
+void g_get_bounds(GLERectangle* rect) {
+ rect->setXMin(g.xmin);
+ rect->setYMin(g.ymin);
+ rect->setXMax(g.xmax);
+ rect->setYMax(g.ymax);
+}
+
+void g_set_bounds(GLERectangle* rect) {
+ g.xmin = rect->getXMin();
+ g.ymin = rect->getYMin();
+ g.xmax = rect->getXMax();
+ g.ymax = rect->getYMax();
+}
+
+void g_update_bounds(GLERectangle* rect) {
+ g_update_bounds(rect->getXMin(), rect->getYMin());
+ g_update_bounds(rect->getXMax(), rect->getYMax());
+}
+
+void g_debug_bounds(const char* out) {
+ cout << out << ": bounds: (" << g.xmin << ", " << g.ymin << ") - (" << g.xmax << ", " << g.ymax << ")" << endl;
+}
+
+void g_check_bounds(const char* after) {
+ if (g.xmin == -1e30 || g.xmax == 1e30 || g.ymin == -1e30 || g.ymax == 1e30) {
+ ostringstream ostr;
+ ostr << "bounds error: " << after << endl;
+ ostr << "yields : " << g.xmin << ", " << g.ymin << endl;
+ ostr << "yields : " << g.xmax << ", " << g.ymax;
+ g_throw_parser_error(ostr.str().c_str());
+ }
+}
+
+void test_unit() {
+ int i,j;
+ gunit = true;
+ for (i=0;i<3;i++) for (j=0;j<3;j++) if (i!=j) if(g.image[i][j]!=0.0) gunit = false;
+ for (i=0;i<3;i++) if (g.image[i][i]!=1.0) gunit = false;
+}
+
+void tex_clear(void);
+
+void g_clear() {
+ /* Reset all params */
+ // cout << "calling g_clear()" << endl;
+ ngsave = 0;
+ g.fontn = 0.0;
+ g.fontsz = 0.0; /* up to here for font caching */
+ g.color = color_or_fill_from_int(GLE_COLOR_BLACK);
+ g.fill = g_get_fill_clear();
+ g.lwidth = 0.0;
+ g.lstyled = 0.0;
+ g.curx = 0.0;
+ g.cury = 0.0;
+ g.endx = 0.0;
+ g.endy = 0.0;
+ g.miterlimit = 0.0;
+ g.lcap = 0;
+ g.ljoin = 0;
+ g.just = 0;
+ g.xinline = 0;
+ g.npath = 0; /* up to here for STATE */
+ g.inpath = 0;
+ g.xmin = 0.0;
+ g.xmax = 0.0;
+ g.ymin = 0.0;
+ g.ymax = 0.0; /* bounds in USER coordinates */
+ g.startx = 0.0;
+ g.starty = 0.0;
+ g.closex = 0.0;
+ g.closey = 0.0; /* for closepath */
+ g.arrowsize = 0.0;
+ g.arrowangle = 0.0;
+ g.arrowstyle = GLE_ARRSTY_FILLED;
+ g.arrowtip = GLE_ARRTIP_SHARP;
+ g.pdfimgformat = PDF_IMG_COMPR_ZIP;
+ g.userheight = -1.0;
+ g.userwidth = -1.0;
+ g.pagewidth = -1.0;
+ g.pageheight = -1.0;
+ g.papersize = GLE_PAPER_UNKNOWN;
+ g.topmargin = 0.0; g.bottommargin = 0.0;
+ g.leftmargin = 0.0; g.rightmargin = 0.0;
+ g.fullpage = false;
+ g.landscape = false;
+ g.rotate = false;
+ g.hasbox = false;
+ g.isopen = false;
+ g.texlabels = false;
+ /* Reset line style */
+ for (unsigned int i = 0; i < sizeof(g.lstyle); i++) {
+ g.lstyle[i] = 0;
+ }
+ g.lstyle[0] = '1';
+ /* Clear transformation matrix */
+ g_clear_matrix();
+ /* set other constants */
+ g_set_fconst(GLEC_ATITLEDIST, 0.5);
+ g_set_fconst(GLEC_ALABELDIST, 0.5);
+ g_compatibility_settings();
+ g_get_core()->reset();
+}
+
+void g_compatibility_settings() {
+ if (g_get_compatibility() <= GLE_COMPAT_35) {
+ g_set_fconst(GLEC_TITLESCALE, 1.5);
+ g_set_fconst(GLEC_ATITLESCALE, 1.3);
+ g_set_fconst(GLEC_ALABELSCALE, 1.0);
+ g_set_fconst(GLEC_TICKSSCALE, 0.2);
+ g.arrowstyle = GLE_ARRSTY_OLD35;
+ } else {
+ // Make sure GLEC_ATITLESCALE = 1
+ g_set_fconst(GLEC_TITLESCALE, 1.16);
+ g_set_fconst(GLEC_ATITLESCALE, 1.0);
+ g_set_fconst(GLEC_ALABELSCALE, 0.8);
+ g_set_fconst(GLEC_TICKSSCALE, 0.3);
+ }
+}
+
+void g_on_open() {
+ /* Clear device dependent stuff */
+ g.dev->clear();
+ g_resetfont();
+ tex_clear();
+ g_set_just(JUST_LEFT);
+ g_set_line_styled(0.04);
+ g_set_line_style("1");
+ g_set_line_width(0.02);
+ g_set_color(GLE_COLOR_BLACK);
+ g_set_fill(GLE_FILL_CLEAR);
+ g_set_font(1); /* Load and set default font */
+ g_set_font_width(-1); /* Load and set default font */
+ if (g_get_compatibility() <= GLE_COMPAT_35) {
+ g_set_hei(1);
+ } else {
+ // Same default height as TeX fonts, don't change this.
+ g_set_hei(0.3633);
+ }
+ g_move(0.0,0.0);
+ test_unit();
+}
+
+void g_restore_defaults() {
+ /* FIXME - improve code sharing with above methods */
+ /* after 4.0.12 is out */
+ g.curx = 0.0;
+ g.cury = 0.0;
+ g.endx = 0.0;
+ g.endy = 0.0;
+ g.arrowsize = 0.0;
+ g.arrowangle = 0.0;
+ g.arrowstyle = GLE_ARRSTY_FILLED;
+ g.arrowtip = GLE_ARRTIP_SHARP;
+ if (g_get_compatibility() <= GLE_COMPAT_35) {
+ g_set_fconst(GLEC_TITLESCALE, 1.5);
+ g_set_fconst(GLEC_ATITLESCALE, 1.3);
+ g_set_fconst(GLEC_ALABELSCALE, 1.0);
+ g_set_fconst(GLEC_TICKSSCALE, 0.2);
+ g.arrowstyle = GLE_ARRSTY_OLD35;
+ } else {
+ g_set_fconst(GLEC_TITLESCALE, 1.16);
+ g_set_fconst(GLEC_ATITLESCALE, 1.0);
+ g_set_fconst(GLEC_ALABELSCALE, 0.8);
+ g_set_fconst(GLEC_TICKSSCALE, 0.3);
+ }
+ g_set_fconst(GLEC_ATITLEDIST, 0.5);
+ g_set_fconst(GLEC_ALABELDIST, 0.5);
+ g_set_just(JUST_LEFT);
+ g_set_line_styled(0.04);
+ g_set_line_style("1");
+ g_set_line_width(0.02);
+ g_set_color(GLE_COLOR_BLACK);
+ g_set_fill(GLE_FILL_CLEAR);
+ g_set_font(1); /* Load and set default font */
+ g_set_font_width(-1); /* Load and set default font */
+ if (g_get_compatibility() <= GLE_COMPAT_35) {
+ g_set_hei(1);
+ } else {
+ // Same default height as TeX fonts, don't change this.
+ g_set_hei(0.3633);
+ }
+ g_move(0.0,0.0);
+ test_unit();
+}
+
+void g_get_xy(double *x,double *y) {
+ *x = g.curx;
+ *y = g.cury;
+}
+
+GLEPoint g_get_xy() {
+ GLEPoint result;
+ g_get_xy(&result);
+ return result;
+}
+
+void g_get_xy(GLEPoint* pt) {
+ pt->setX(g.curx);
+ pt->setY(g.cury);
+}
+
+void g_set_xy(double x, double y) {
+ g_move(x,y);
+}
+
+void g_flush() {
+ if (g.inpath) return;
+ g.dev->flush();
+ g.xinline = false;
+}
+
+void g_arcto(dbl x1,dbl y1,dbl x2,dbl y2,dbl rrr) {
+ g.dev->arcto(x1,y1,x2,y2,rrr);
+ g.curx = x2;
+ g.cury = y2;
+ g.xinline = true;
+ /* should do MASSES of calc to find bounds of arc */
+ g_update_bounds(x1,y1);
+ g_update_bounds(x2,y2);
+}
+
+void g_dojust(dbl *x1, dbl *y1, dbl *x2, dbl *y2, int jj) {
+ double d;
+ int jx,jy;
+ jx = (jj & 0xf0) / 16;
+ jy = jj & 0x0f;
+ d = jx * (*x2-*x1)/2;
+ *x1 -= d;
+ *x2 -= d;
+ d = jy * (*y2-*y1)/2;
+ *y1 -= d;
+ *y2 -= d;
+}
+
+void g_dotjust(dbl *x1, dbl *y1, dbl l, dbl r, dbl u, dbl d, int jj) {
+ static int jx,jy,t;
+ static double ddd;
+ jx = (jj & 0xf0) / 16;
+ jy = jj & 0x0f;
+ t = (jj & 0xf00) / 256 ;
+ ddd = jx * (-l+r)/2;
+ *x1 = *x1 + -l - ddd;
+ ddd = jy * (u-d)/2;
+ if (t==0) *y1 = *y1 - d - ddd;
+}
+
+void g_box_stroke(GLERectangle* rect, bool reverse) {
+ g_box_stroke(rect->getXMin(), rect->getYMin(), rect->getXMax(), rect->getYMax(), reverse);
+}
+
+void g_box_stroke(dbl x1, dbl y1, dbl x2, dbl y2, bool reverse) {
+ double x,y;
+ g_get_xy(&x,&y);
+ g.dev->box_stroke(x1,y1,x2,y2,reverse);
+ g_update_bounds(x1,y1);
+ g_update_bounds(x2,y2);
+ g_move(x,y);
+}
+
+void g_box_fill(GLERectangle* rect) {
+ g_box_fill(rect->getXMin(), rect->getYMin(), rect->getXMax(), rect->getYMax());
+}
+
+void g_box_fill(dbl x1, dbl y1, dbl x2, dbl y2) {
+ double x,y;
+ g_get_xy(&x,&y);
+ g.dev->box_fill(x1,y1,x2,y2);
+ g_update_bounds(x1,y1);
+ g_update_bounds(x2,y2);
+ g_move(x,y);
+}
+
+enum arrow_direction{CW,CCW};
+
+void g_circle_stroke(dbl zr) {
+ GLEPoint orig(g_get_xy());
+ g.dev->circle_stroke(zr);
+ g_update_bounds(g.curx-zr,g.cury-zr);
+ g_update_bounds(g.curx+zr,g.cury+zr);
+ GLECore* core = g_get_core();
+ if (core->isComputingLength()) {
+ GLECircleArc curve(orig, zr, 0.0, 2.0 * GLE_PI);
+ core->addToLength(curve.getDist(curve.getT0(), curve.getT1()));
+ }
+}
+
+void g_circle_fill(dbl zr) {
+ g.dev->circle_fill(zr);
+ g_update_bounds(g.curx-zr,g.cury-zr);
+ g_update_bounds(g.curx+zr,g.cury+zr);
+}
+
+void g_update_arc_bounds_for_arrow_heads(GLECurvedArrowHead* head_start,
+ GLECurvedArrowHead* head_end,
+ double* t1,
+ double* t2)
+{
+ if (head_start->getStyle() != GLE_ARRSTY_SIMPLE) {
+ if (head_start->isEnabled()) *t1 = head_start->getParamValueEnd()*180/GLE_PI;
+ if (head_end->isEnabled()) *t2 = head_end->getParamValueEnd()*180/GLE_PI;
+ }
+}
+
+double g_arc_normalized_angle2(double a1, double a2) {
+ if (a2 < a1) {
+ // Correctly normalize a2
+ return a2 + 360 * ceil((a1 - a2)/360.0);
+ } else {
+ return a2;
+ }
+}
+
+void g_arc(double r, double t1, double t2, double cx, double cy, int arrow) {
+ g_flush();
+ GLEPoint orig(cx, cy);
+ GLECore* core = g_get_core();
+ if (core->isComputingLength()) {
+ GLECircleArc circle(orig, r, t1*GLE_PI/180, t2*GLE_PI/180);
+ core->addToLength(fabs(circle.getDist(circle.getT0(), circle.getT1())));
+ }
+ GLEWithoutUpdates noUpdates;
+ if (arrow != 0) {
+ GLECircleArc circle(orig, r, t1*GLE_PI/180, t2*GLE_PI/180);
+ GLECurvedArrowHead head_start(&circle);
+ GLECurvedArrowHead head_end(&circle);
+ if (arrow == 1 || arrow == 3) g_init_arrow_head(&head_start, true);
+ if (arrow == 2 || arrow == 3) g_init_arrow_head(&head_end, false);
+ g_update_arc_bounds_for_arrow_heads(&head_start, &head_end, &t1, &t2);
+ g.dev->arc(r,t1,t2,cx,cy);
+ head_start.computeAndDraw();
+ head_end.computeAndDraw();
+ } else {
+ g.dev->arc(r,t1,t2,cx,cy);
+ }
+ g.curx = cx; g.cury = cy;
+}
+
+void g_narc(double r, double t1, double t2, double cx, double cy, int arrow) {
+ g_flush();
+ GLEPoint orig(cx, cy);
+ GLECore* core = g_get_core();
+ if (core->isComputingLength()) {
+ GLECircleArc circle(orig, r, t1*GLE_PI/180, t2*GLE_PI/180);
+ core->addToLength(fabs(circle.getDist(circle.getT0(), circle.getT1())));
+ }
+ GLEWithoutUpdates noUpdates;
+ if (arrow != 0) {
+ GLECircleArc circle(orig, r, t2*GLE_PI/180, t1*GLE_PI/180);
+ GLECurvedArrowHead head_start(&circle);
+ GLECurvedArrowHead head_end(&circle);
+ if (arrow == 1 || arrow == 3) g_init_arrow_head(&head_start, false);
+ if (arrow == 2 || arrow == 3) g_init_arrow_head(&head_end, true);
+ g_update_arc_bounds_for_arrow_heads(&head_start, &head_end, &t1, &t2);
+ g.dev->narc(r,t1,t2,cx,cy);
+ head_start.computeAndDraw();
+ head_end.computeAndDraw();
+ } else {
+ g.dev->narc(r,t1,t2,cx,cy);
+ }
+ g.curx = cx; g.cury = cy;
+}
+
+void g_ellipse_stroke(dbl rx, dbl ry) {
+ GLEPoint orig(g_get_xy());
+ g.dev->ellipse_stroke(rx,ry);
+ g_update_bounds(g.curx-rx,g.cury-ry);
+ g_update_bounds(g.curx+rx,g.cury+ry);
+ GLECore* core = g_get_core();
+ if (core->isComputingLength()) {
+ GLEEllipseArc curve(orig, rx, ry, 0.0, 2.0 * GLE_PI);
+ core->addToLength(curve.getDist(curve.getT0(), curve.getT1()));
+ }
+}
+
+void g_ellipse_fill(dbl rx, dbl ry) {
+ g.dev->ellipse_fill(rx,ry);
+ g_update_bounds(g.curx-rx,g.cury-ry);
+ g_update_bounds(g.curx+rx,g.cury+ry);
+}
+
+void g_elliptical_arc(double rx, double ry, double t1, double t2, double cx, double cy, int arrow) {
+ g_flush();
+ GLEPoint orig(cx, cy);
+ GLECore* core = g_get_core();
+ if (core->isComputingLength()) {
+ GLEEllipseArc arc(orig, rx, ry, t1*GLE_PI/180, t2*GLE_PI/180);
+ core->addToLength(fabs(arc.getDist(arc.getT0(), arc.getT1())));
+ }
+ GLEWithoutUpdates noUpdates;
+ if (arrow != 0) {
+ GLEEllipseArc ellipse(orig, rx, ry, t1*GLE_PI/180, t2*GLE_PI/180);
+ GLECurvedArrowHead head_start(&ellipse);
+ GLECurvedArrowHead head_end(&ellipse);
+ if (arrow == 1 || arrow == 3) g_init_arrow_head(&head_start, true);
+ if (arrow == 2 || arrow == 3) g_init_arrow_head(&head_end, false);
+ g_update_arc_bounds_for_arrow_heads(&head_start, &head_end, &t1, &t2);
+ g.dev->elliptical_arc(rx, ry, t1, t2, cx, cy);
+ head_start.computeAndDraw();
+ head_end.computeAndDraw();
+ } else {
+ g.dev->elliptical_arc(rx, ry, t1, t2, cx, cy);
+ }
+ g.curx = cx; g.cury = cy;
+}
+
+void g_elliptical_narc(double rx, double ry, double t1, double t2, double cx, double cy, int arrow) {
+ g_flush();
+ GLEPoint orig(cx, cy);
+ GLECore* core = g_get_core();
+ if (core->isComputingLength()) {
+ GLEEllipseArc arc(orig, rx, ry, t1*GLE_PI/180, t2*GLE_PI/180);
+ core->addToLength(fabs(arc.getDist(arc.getT0(), arc.getT1())));
+ }
+ GLEWithoutUpdates noUpdates;
+ if (arrow != 0) {
+ GLEEllipseArc ellipse(orig, rx, ry, t2*GLE_PI/180, t1*GLE_PI/180);
+ GLECurvedArrowHead head_start(&ellipse);
+ GLECurvedArrowHead head_end(&ellipse);
+ if (arrow == 1 || arrow == 3) g_init_arrow_head(&head_start, false);
+ if (arrow == 2 || arrow == 3) g_init_arrow_head(&head_end, true);
+ g_update_arc_bounds_for_arrow_heads(&head_start, &head_end, &t1, &t2);
+ g.dev->elliptical_narc(rx, ry, t1, t2, cx, cy);
+ head_start.computeAndDraw();
+ head_end.computeAndDraw();
+ } else {
+ g.dev->elliptical_narc(rx, ry, t1, t2, cx, cy);
+ }
+ g.curx = cx; g.cury = cy;
+}
+
+void g_arrowcurve(double x, double y, int arrow, double a1, double a2, double d1, double d2) {
+ if (d1 == 0.0 && d2 == 0.0) {
+ g_arrowline(x, y, arrow, true);
+ return;
+ }
+ double cx, cy, x1, y1, x2, y2;
+ polar_xy(d1, a1, &x1, &y1);
+ polar_xy(d2, a2, &x2, &y2);
+ g_get_xy(&cx, &cy);
+ GLEBezier bezier(cx, cy, cx+x1, cy+y1, x+x2, y+y2, x, y);
+ GLECore* core = g_get_core();
+ if (core->isComputingLength()) {
+ core->addToLength(bezier.getDist(0.0, 1.0));
+ }
+ GLEWithoutUpdates noUpdates;
+ if (arrow != 0) {
+ GLECurvedArrowHead head_start(&bezier);
+ GLECurvedArrowHead head_end(&bezier);
+ if (arrow == 1 || arrow == 3) g_init_arrow_head(&head_start, true);
+ if (arrow == 2 || arrow == 3) g_init_arrow_head(&head_end, false);
+ GLEBezier todraw(bezier);
+ if (head_start.getStyle() != GLE_ARRSTY_SIMPLE) {
+ if (arrow == 1) todraw.cutFromParamValue(head_start.getParamValueEnd());
+ if (arrow == 2) todraw.cutAtParamValue(head_end.getParamValueEnd());
+ if (arrow == 3) {
+ todraw.cutAtParamValue(head_end.getParamValueEnd());
+ double t0 = todraw.distToParamValue(0.0, head_start.getArrowCurveDist()*0.75);
+ todraw.cutFromParamValue(t0);
+ }
+
+ }
+ todraw.draw();
+ head_start.computeAndDraw();
+ head_end.computeAndDraw();
+ } else {
+ bezier.draw();
+ }
+}
+
+void g_bezier(dbl x1, dbl y1, dbl x2, dbl y2, dbl x3, dbl y3) {
+ GLEPoint origin;
+ g_get_xy(&origin);
+ g.dev->bezier(x1, y1, x2, y2, x3, y3);
+ if (g.xinline == false) {
+ g.xinline = true;
+ g_update_bounds(g.curx, g.cury);
+ }
+ g.curx = x3;
+ g.cury = y3;
+ g_update_bounds(x3,y3);
+ GLECore* core = g_get_core();
+ if (core->isComputingLength()) {
+ GLEBezier bezierCurve(origin.getX(), origin.getY(), x1, y1, x2, y2, x3, y3);
+ core->addToLength(bezierCurve.getDist(0.0, 1.0));
+ }
+}
+
+void g_bezier(const GLEPoint& p1, const GLEPoint& p2, const GLEPoint& p3) {
+ g_bezier(p1.getX(), p1.getY(), p2.getX(), p2.getY(), p3.getX(), p3.getY());
+}
+
+void g_dmove(double x, double y) {
+ double ux,uy;
+ g_undev(x,y,&ux,&uy);
+ g.dev->move(ux,uy);
+ g.curx = ux;
+ g.cury = uy;
+}
+
+void g_dline(double x, double y) {
+ double ux,uy;
+ g_undev(x,y,&ux,&uy);
+ g.dev->line(ux,uy);
+ g.curx = ux;
+ g.cury = uy;
+}
+
+void g_dbezier(dbl x1,dbl y1,dbl x2,dbl y2,dbl x3,dbl y3) {
+ double a1,b1,a2,b2,a3,b3;
+ g_undev(x1,y1,&a1,&b1);
+ g_undev(x2,y2,&a2,&b2);
+ g_undev(x3,y3,&a3,&b3);
+ g_bezier(a1,b1,a2,b2,a3,b3);
+ g.curx = a3;
+ g.cury = b3;
+}
+
+int g_hash_string_to_color(const string& str, colortyp* c) {
+ int err = 0;
+ const char* color_str = str.c_str();
+ c->b[B_F] = (unsigned char)1;
+ c->b[B_R] = (unsigned char)gle_pass_hex(color_str, 1, 2, &err);
+ c->b[B_G] = (unsigned char)gle_pass_hex(color_str, 3, 2, &err);
+ c->b[B_B] = (unsigned char)gle_pass_hex(color_str, 5, 2, &err);
+ return err;
+}
+
+void g_set_fill(int fill) {
+ g_set_fill(color_or_fill_from_int(fill));
+}
+
+void g_set_fill(GLEColor* fill) {
+ // Note: g_set_fill resets "pattern", so "set pattern" should come after "set fill"
+ if (fill == 0) {
+ g.fill = g_get_fill_clear();
+ } else {
+ g.fill = fill->clone();
+ }
+ g_set_fill_to_device();
+}
+
+void g_set_fill(const GLERC<GLEColor>& fill) {
+ g_set_fill(fill.get());
+}
+
+void g_set_background(const GLERC<GLEColor>& color) {
+ update_color_fill_background(g.fill.get(), color.get());
+ g_set_fill_to_device();
+}
+
+void g_set_fill_pattern(const GLERC<GLEColor>& pattern) {
+ if (pattern->isFill() && pattern->getFill()->getFillType() == GLE_FILL_TYPE_PATTERN) {
+ update_color_fill_pattern(g.fill.get(), static_cast<GLEPatternFill*>(pattern->getFill()));
+ g_set_fill_to_device();
+ } else {
+ g_throw_parser_error("expected fill pattern");
+ }
+}
+
+GLERC<GLEColor> g_modify_color_for_device(const GLERC<GLEColor>& color) {
+ GLERC<GLEColor> result(color);
+ CmdLineObj* cmdLine = GLEGetInterfacePointer()->getCmdLine();
+ if (cmdLine->hasOption(GLE_OPT_INVERSE)) {
+ unsigned int hexValue = color->getHexValueGLE();
+ if (hexValue == (unsigned int)GLE_COLOR_WHITE && color->getAlpha() == 1.0) {
+ result = new GLEColor(0.0, 0.0, 0.0);
+ }
+ if (hexValue == (unsigned int)GLE_COLOR_BLACK && color->getAlpha() == 1.0) {
+ result = new GLEColor(1.0, 1.0, 1.0);
+ }
+ }
+ if (cmdLine->hasOption(GLE_OPT_NO_COLOR)) {
+ double gray = color->getGray();
+ result = new GLEColor(gray, gray, gray);
+ }
+ return result;
+}
+
+void g_set_color_to_device() {
+ g.dev->set_color(g_modify_color_for_device(g.color));
+}
+
+void g_set_fill_to_device() {
+ g.dev->set_fill(g_modify_color_for_device(g.fill));
+}
+
+void g_set_color(GLEColor* color) {
+ g.color = color->clone();
+ g_set_color_to_device();
+}
+
+void g_set_color(const GLERC<GLEColor>& color) {
+ if (!color.isNull()) {
+ g_set_color(color.get());
+ }
+}
+
+void g_set_color(int l) {
+ if (l==0) return;
+ g.color->setHexValueGLE(l);
+ g_set_color_to_device();
+}
+
+GLERC<GLEColor> g_get_color() {
+ return g.color->clone();
+}
+
+void g_set_fill_method(const char* meth) {
+ if (str_i_equals(meth, "DEFAULT")) g.dev->set_fill_method(GLE_FILL_METHOD_DEFAULT);
+ else if (str_i_equals(meth, "GLE")) g.dev->set_fill_method(GLE_FILL_METHOD_GLE);
+ else g.dev->set_fill_method(GLE_FILL_METHOD_POSTSCRIPT);
+}
+
+bool g_is_filled(void) {
+ return !g.fill->isTransparent();
+}
+
+GLERC<GLEColor> g_get_fill() {
+ return g.fill->clone();
+}
+
+void g_beginclip() {
+ g.dev->beginclip();
+}
+
+void g_endclip() {
+ g.dev->endclip();
+}
+
+void g_gsave() {
+ ngsave++;
+ if (ngsave>=99) {
+ gprint("Over 99 GSAVE's, probably a loop in your code\n");
+ return;
+ }
+ gsave[ngsave] = new gmodel();
+ g_get_state(gsave[ngsave]);
+ g_init_bounds();
+}
+
+void g_grestore() {
+ static double a,b;
+ g_flush();
+ if (ngsave==0) {
+ gprint("Attempt to GRESTORE at top of stack\n");
+ if (gle_debug>0) a = a/b;
+ return;
+ }
+ g_set_state(gsave[ngsave]);
+ delete gsave[ngsave];
+ ngsave--;
+}
+
+void g_get_state(gmodel *s) {
+ *s = g;
+ s->fill = g.fill->clone();
+ s->color = g.color->clone();
+}
+
+void g_set_state(gmodel* s) {
+ g_set_matrix(s->image, &g, s);
+ g = *s;
+ g_set_color_to_device();
+ g_set_fill_to_device();
+ g.dev->set_line_width(g.lwidth);
+ g.dev->set_line_style(g.lstyle);
+ g.dev->set_line_styled(g.lstyled);
+ test_unit();
+}
+
+void g_set_partial_state(gmodel* s) {
+ g_set_color(s->color);
+ g_set_fill(s->fill);
+ g_set_line_width(s->lwidth);
+ g_set_line_style(s->lstyle);
+ g_set_line_styled(s->lstyled);
+}
+
+ /* 12,4,-.5,-.5,0.35, original dot */
+struct mark_struct { int ff; int cc; double rx; double ry; double scl; double x1; double x2; double y1; double y2; };
+struct mark_struct minf[61];
+extern char *mrk_name[];
+extern char *mrk_fname[];
+
+/* struct mark_struct { int ff, int cc, double rx, double ry, double scl;}; */
+extern char *mark_name[];
+extern char *mark_sub[];
+extern int mark_subp[];
+extern int nmark;
+extern int nmrk;
+
+void g_marker(int i, double sz) {
+ g_marker2(i,sz,1.0);
+}
+
+void g_marker2(int i, double sz, double dval) throw(ParserError) {
+ static double cx,cy,h,scale;
+ static double x1,y1,x2,y2;
+ if (i<0) {
+ GLERC<GLEArrayImpl> stk(new GLEArrayImpl());
+ ++i;
+ i = -i;
+ if (mark_subp[i] == -1) {
+ GLESub* sub = sub_find(mark_sub[i]);
+ mark_subp[i] = sub != NULL ? sub->getIndex() : -1;
+ if (mark_subp[i] == -1) {
+ stringstream err;
+ err << "subroutine '" << mark_sub[i] << "', which defines marker '" << mark_name[i] << "' not found";
+ g_throw_parser_error(err.str());
+ } else if (sub->getNbParam() != 2) {
+ stringstream err;
+ err << "subroutine '" << mark_sub[i] << "', which defines marker '" << mark_name[i] << "' should take two parameters (size and data), not " << sub->getNbParam();
+ g_throw_parser_error(err.str());
+ }
+ }
+ setEvalStack(stk.get(), 0, sz);
+ setEvalStack(stk.get(), 1, dval);
+ g_get_xy(&cx,&cy);
+ getGLERunInstance()->sub_call(sub_get(mark_subp[i]), stk.get());
+ g_move(cx,cy);
+ return;
+ }
+ if (i<1 || i>nmrk) {gprint("Invalid marker number %d \n",i); return;}
+ g_get_xy(&cx,&cy);
+ g_get_hei(&h);
+ i--;
+ scale = minf[i].scl*sz;
+ g_set_hei(scale);
+ if (minf[i].ff == 0) {
+ minf[i].ff = g_font_fallback(pass_font(mrk_fname[i]));
+ char_bbox(minf[i].ff,minf[i].cc,&x1,&y1,&x2,&y2);
+ minf[i].x1 = x1; minf[i].x2 = x2;
+ minf[i].y1 = y1; minf[i].y2 = y2;
+ } else if (minf[i].ff == -1) {
+ minf[i].ff = g_font_fallback(pass_font(mrk_fname[i]));
+ char_bbox(minf[i].ff,minf[i].cc,&x1,&y1,&x2,&y2);
+ minf[i].ry = (minf[i].ry + -y1-(y2-y1)/2.0);
+ minf[i].rx = (minf[i].rx + -x1-(x2-x1)/2.0);
+ minf[i].x1 = x1; minf[i].x2 = x2;
+ minf[i].y1 = y1; minf[i].y2 = y2;
+ }
+ double xpos = cx+minf[i].rx*scale;
+ double ypos = cy+minf[i].ry*scale;
+ g_move(xpos, ypos);
+ g_char(minf[i].ff,minf[i].cc);
+ g_update_bounds(xpos+minf[i].x1*scale, ypos+minf[i].y1*scale);
+ g_update_bounds(xpos+minf[i].x2*scale, ypos+minf[i].y2*scale);
+ g_move(cx,cy);
+ g_set_hei(h);
+}
+
+void g_defmarker(const char *mname, const char *font, int ccc, double dx, double dy, double sz, int autodx) {
+ int i;
+ for (i=0; i<nmrk; i++) {
+ if (str_i_equals(mname,mrk_name[i])) {
+ myfree(mrk_name[i]);
+ myfree(mrk_fname[i]);
+ nmrk--;
+ break;
+ }
+ }
+ nmrk++;
+ if (nmrk>61-1) {
+ gprint("Too many markers defined \n");
+ return;
+ }
+ mrk_name[i] = sdup(mname);
+ mrk_fname[i] = sdup(font);
+ minf[i].ff = 0;
+ if (autodx) minf[i].ff = -1;
+ minf[i].cc = ccc;
+ minf[i].rx = dx;
+ minf[i].ry = dy;
+ minf[i].scl = sz;
+ minf[i].x1 = 0.0;
+ minf[i].x2 = 0.0;
+ minf[i].y1 = 0.0;
+ minf[i].y2 = 0.0;
+}
+
+void g_marker_def(char *mname,char *subname) {
+ int i;
+ for (i=0; i<nmark; i++) {
+ if (str_i_equals(mname,mark_name[i])) {
+ myfree(mark_name[i]);
+ myfree(mark_sub[i]);
+ nmark--;
+ break;
+ }
+ }
+ nmark++;
+ mark_name[i] = sdup(mname);
+ mark_sub[i] = sdup(subname);
+ mark_subp[i] = -1;
+}
+
+void g_char(int font, int cc) {
+ g.dev->dochar(font,cc);
+}
+
+void g_text(const string& s) {
+ string str(s);
+ text_block(str, 0.0, g.just);
+}
+
+void g_set_just(int jj) {
+ g.just = jj;
+}
+
+void g_set_font(int jj) {
+ if (jj==0) return;
+ font_load_metric(jj);
+ g.fontn = jj;
+}
+
+void g_set_hei(double h) {
+ if (h <= 0.0) {
+ cerr << "font size zero or negative: " << h << endl;
+ return;
+ }
+ g.fontsz = h;
+}
+
+void g_get_just(int *jj) {
+ *jj = g.just;
+}
+
+void g_get_font(int *jj) {
+ *jj = (int) g.fontn;
+}
+
+void g_get_hei(double *h) {
+ *h = g.fontsz;
+}
+
+bool g_parse_ps_boundingbox(const string& line, int* bx1, int* by1, int* bx2, int* by2)
+{
+ if (str_ni_equals(line.c_str(), "%%BoundingBox:", 14) && str_i_str(line, "(atend)") == -1) {
+ char_separator sep(" :\t");
+ tokenizer<char_separator> tokens(line, sep);
+ if (tokens.has_more()) tokens.next_token();
+ if (tokens.has_more()) {
+ *bx1 = atoi(tokens.next_token().c_str());
+ }
+ if (tokens.has_more()) {
+ *by1 = atoi(tokens.next_token().c_str());
+ }
+ if (tokens.has_more()) {
+ *bx2 = atoi(tokens.next_token().c_str());
+ }
+ if (tokens.has_more()) {
+ *by2 = atoi(tokens.next_token().c_str());
+ }
+ return true;
+ }
+ return false;
+}
+
+void g_postscript(char *fname, double wx, double wy) throw(ParserError) {
+ /*
+ fname ... the filename
+ wx .... the users desired width in GLE units
+ wy .... the users desired height in GLE units
+ */
+ int bx1 = 0, by1 = 0, bx2 = 0, by2 = 0;
+ double cx, cy;
+ /* Open PostScript file */
+ ifstream input;
+ validate_open_input_stream(input, fname);
+ while (input.good()) {
+ string line;
+ getline(input, line);
+ if (g_parse_ps_boundingbox(line, &bx1, &by1, &bx2, &by2))
+ {
+ // do not get confused by second bounding box
+ break;
+ }
+ }
+ /* compute size if only height or width is given */
+ bx2 -= bx1;
+ by2 -= by1;
+ if (bx2 == 0 || by2 == 0) {
+ gprint("Invalid bounding box in EPS file\n");
+ return;
+ }
+ if (fabs(wy) < 1e-18) {
+ if (fabs(wx) < 1e-18) {
+ // if with and hight is zero, then use default size
+ wx = bx2/PS_POINTS_PER_INCH*CM_PER_INCH;
+ wy = by2/PS_POINTS_PER_INCH*CM_PER_INCH;
+ } else {
+ wy = wx*by2/bx2;
+ }
+ } else if (fabs(wx) < 1e-18) {
+ wx = wy*bx2/by2;
+ }
+ /* non-Postscript device? */
+ std::string inbuff(g_get_type());
+ if (str_i_str(inbuff, "POSTSCRIPT") == 0) {
+ input.close();
+ g_get_xy(&cx,&cy);
+ g_box_stroke(cx,cy,cx+wx,cy+wy);
+ return;
+ }
+ /* Output PostScript */
+ GLERectangle save_box;
+ g_get_bounds(&save_box);
+ g_devcmd("/GLESTATE save def\n");
+ g_devcmd("gsave\n");
+ g_devcmd("/a4small {} def /legal {} def\n");
+ g_devcmd("/letter {} def /note {} def /copypage {} def\n");
+ g_devcmd("/erasepage {} def /showpage {} def\n");
+ g_gsave();
+ g_get_xy(&cx,&cy);
+ g_translate(cx, cy);
+ g_set_pos(0, 0);
+ g_scale(wx/bx2, wy/by2);
+ g_translate(-bx1, -by1);
+ g_devcmd("0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin\n");
+ g_devcmd("10 setmiterlimit [] 0 setdash newpath\n");
+ /* Copy Poscrscript file over */
+ string begin_doc("%%BeginDocument: ");
+ begin_doc += fname;
+ begin_doc += "\n";
+ g_devcmd(begin_doc.c_str());
+ input.seekg(0, ios_base::beg);
+ while (input.good()) {
+ string line;
+ getline(input, line);
+ if (!str_ni_equals(line.c_str(), "%%BoundingBox:", strlen("%%BoundingBox:")) &&
+ !str_ni_equals(line.c_str(), "%%HiResBoundingBox:", strlen("%%HiResBoundingBox:")) &&
+ !str_ni_equals(line.c_str(), "%%EOF", strlen("%%EOF"))) {
+ str_trim_right(line);
+ line += "\n";
+ g_devcmd(line.c_str());
+ }
+ }
+ input.close();
+ g_devcmd("%%EndDocument\n");
+ /* Done copy */
+ g_devcmd("grestore GLESTATE restore\n");
+ g_grestore();
+ /* Adjust bounds */
+ g_set_bounds(&save_box);
+ g_update_bounds(cx, cy);
+ g_update_bounds(cx+wx, cy+wy);
+}
+
+
+int g_bitmap_string_to_type(const std::string& stype) {
+ return g_bitmap_string_to_type(stype.c_str());
+}
+
+int g_bitmap_string_to_type(const char* stype) {
+ if (str_i_equals(stype, "tiff")) {
+ return BITMAP_TYPE_TIFF;
+ } else if (str_i_equals(stype, "tif")) {
+ return BITMAP_TYPE_TIFF;
+ } else if (str_i_equals(stype, "gif")) {
+ return BITMAP_TYPE_GIF;
+ } else if (str_i_equals(stype, "png")) {
+ return BITMAP_TYPE_PNG;
+ } else if (str_i_equals(stype, "jpg")) {
+ return BITMAP_TYPE_JPEG;
+ } else if (str_i_equals(stype, "jpeg")) {
+ return BITMAP_TYPE_JPEG;
+ } else {
+ return BITMAP_TYPE_UNK;
+ }
+}
+
+void g_update_bitmap_type(const string& fname, int* type) throw(ParserError) {
+ if (*type == 0) {
+ string ext;
+ GetExtension(fname, ext);
+ *type = g_bitmap_string_to_type(ext.c_str());
+ if (*type == BITMAP_TYPE_UNK) {
+ g_throw_parser_error("unsupported bitmap type: '", ext.c_str(), "'");
+ }
+ }
+}
+
+void g_bitmap_type_to_string(int type, string &typestr) {
+ switch (type) {
+ case BITMAP_TYPE_TIFF:
+ typestr = "TIFF"; break;
+ case BITMAP_TYPE_GIF:
+ typestr = "GIF"; break;
+ case BITMAP_TYPE_PNG:
+ typestr = "PNG"; break;
+ case BITMAP_TYPE_JPEG:
+ typestr = "JPEG"; break;
+ }
+}
+
+int g_device_to_bitmap_type(int device) {
+ switch (device) {
+ case GLE_DEVICE_PNG:
+ return BITMAP_TYPE_PNG;
+ case GLE_DEVICE_JPEG:
+ return BITMAP_TYPE_JPEG;
+ default:
+ return BITMAP_TYPE_UNK;
+ }
+}
+
+bool g_bitmap_supports_type(int type) {
+ switch (type) {
+ case BITMAP_TYPE_TIFF:
+ #ifdef HAVE_LIBTIFF
+ return true;
+ #else
+ return false;
+ #endif
+ case BITMAP_TYPE_GIF:
+ return true;
+ case BITMAP_TYPE_PNG:
+ #ifdef HAVE_LIBPNG
+ return true;
+ #else
+ return false;
+ #endif
+ case BITMAP_TYPE_JPEG:
+ #ifdef HAVE_LIBJPEG
+ return true;
+ #else
+ return false;
+ #endif
+ default:
+ return false;
+ }
+}
+
+void g_bitmap_add_supported_type(int type, ostream& out, int* i) {
+ if (g_bitmap_supports_type(type)) {
+ string str;
+ if ((*i) != 0) out << ", ";
+ g_bitmap_type_to_string(type, str);
+ out << str;
+ (*i)++;
+ }
+}
+
+string g_bitmap_supported_types() {
+ int i = 0;
+ stringstream out;
+ g_bitmap_add_supported_type(BITMAP_TYPE_JPEG, out, &i);
+ g_bitmap_add_supported_type(BITMAP_TYPE_PNG, out, &i);
+ g_bitmap_add_supported_type(BITMAP_TYPE_TIFF, out, &i);
+ g_bitmap_add_supported_type(BITMAP_TYPE_GIF, out, &i);
+ if (i == 0) out << "None";
+ return out.str();
+}
+
+GLEBitmap* g_bitmap_type_to_object(int type) {
+ switch (type) {
+ case BITMAP_TYPE_TIFF:
+ #ifdef HAVE_LIBTIFF
+ return new GLETIFF();
+ #else
+ return NULL;
+ #endif
+ case BITMAP_TYPE_GIF:
+ return new GLEGIF();
+ case BITMAP_TYPE_PNG:
+ #ifdef HAVE_LIBPNG
+ return new GLEPNG();
+ #else
+ return NULL;
+ #endif
+ case BITMAP_TYPE_JPEG:
+ return new GLEJPEG();
+ default:
+ return NULL;
+ }
+}
+
+void g_bitmap(string& fname, double wx, double wy, int type) throw(ParserError) {
+ fname = GLEExpandEnvironmentVariables(fname);
+ validate_file_name(fname, true);
+ g_update_bitmap_type(fname, &type);
+ if (type == 0) {
+ // Unknown bitmap type
+ return;
+ }
+ /* Get bitmap type string */
+ string typestr;
+ g_bitmap_type_to_string(type, typestr);
+ /* Get bitmap writer object */
+ GLEBitmap* bitmap = g_bitmap_type_to_object(type);
+ if (bitmap == NULL) {
+ g_throw_parser_error("support for ", typestr.c_str(), " bitmaps not enabled");
+ }
+ /* Open file */
+ if (bitmap->open(fname) == 0) {
+ g_throw_parser_error("can't open bitmap file: '", fname.c_str(), "'");
+ }
+ g_bitmap(bitmap, wx, wy, type);
+ bitmap->close();
+ delete bitmap;
+}
+
+void g_bitmap(GLEBitmap* bitmap, double wx, double wy, int type) throw(ParserError) {
+ /* Read header */
+ int result = bitmap->readHeader();
+ if (result != GLE_IMAGE_ERROR_NONE) {
+ stringstream str;
+ str << "error reading bitmap header '" << bitmap->getFName() << "': ";
+ if (bitmap->getError() == "") str << "unknown";
+ else str << bitmap->getError();
+ g_throw_parser_error(str.str());
+ }
+ /* Get current point */
+ double cx, cy;
+ g_get_xy(&cx,&cy);
+ /* Update scale */
+ if (wx == 0.0 || wy == 0.0) {
+ double bw = bitmap->getWidth();
+ double bh = bitmap->getHeight();
+ if (wx == 0.0 && bh != 0.0) {
+ wx = wy*bw/bh;
+ }
+ if (wy == 0.0 && bw != 0.0) {
+ wy = wx*bh/bw;
+ }
+ }
+ /* Actually draw the bitmap */
+ GLEPoint pos(cx, cy);
+ GLEPoint scale(wx, wy);
+ g.dev->bitmap(bitmap, &pos, &scale, type);
+ /* Output info */
+ if (!g_is_dummy_device() && type != BITMAP_TYPE_USER && g_verbosity() >= 2) {
+ cerr << "{" << bitmap->getFName() << "-";
+ bitmap->printInfo(cerr);
+ cerr << "}";
+ }
+ /* Adjust bounds */
+ g_update_bounds(cx, cy);
+ g_update_bounds(cx+wx, cy+wy);
+}
+
+void g_bitmap_info(string& fname, int xvar, int yvar, int type) throw(ParserError) {
+ fname = GLEExpandEnvironmentVariables(fname);
+ validate_file_name(fname, true);
+ g_update_bitmap_type(fname, &type);
+ if (type == 0) {
+ // Unknown bitmap type
+ return;
+ }
+ /* Get bitmap type string */
+ string typestr;
+ g_bitmap_type_to_string(type, typestr);
+ /* Get bitmap writer object */
+ GLEBitmap* bitmap = g_bitmap_type_to_object(type);
+ if (bitmap == NULL) {
+ g_throw_parser_error("support for ", typestr.c_str(), " bitmaps not enabled");
+ }
+ /* Open file */
+ if (bitmap->open(fname) == 0) {
+ g_throw_parser_error("can't open bitmap file: '", fname.c_str(), "'");
+ }
+ /* Read header */
+ int result = bitmap->readHeader();
+ if (result != GLE_IMAGE_ERROR_NONE) {
+ stringstream str;
+ str << "error reading bitmap header '" << bitmap->getFName() << "': ";
+ if (bitmap->getError() == "") str << "unknown";
+ else str << bitmap->getError();
+ g_throw_parser_error(str.str());
+ }
+ var_set(xvar, (double)bitmap->getWidth());
+ var_set(yvar, (double)bitmap->getHeight());
+ bitmap->close();
+ delete bitmap;
+}
+
+void g_arrowpoints(double cx, double cy, double dx, double dy, GLEArrowPoints* pts);
+
+void g_arrowline(double x2, double y2, int flag, int can_fillpath) throw(ParserError) {
+ double x1,y1;
+ GLECore* core = g_get_core();
+ if (core->isComputingLength()) {
+ core->addToLength(g_get_xy().distance(GLEPoint(x2, y2)));
+ }
+ GLEWithoutUpdates noUpdates;
+ if ((flag & 3) == 0) {
+ g_line(x2,y2);
+ return;
+ }
+ g_get_xy(&x1,&y1);
+ if (can_fillpath && g.arrowstyle < GLE_ARRSTY_SUB) {
+ g_psarrow(x1, y1, x2, y2, flag);
+ } else {
+ if ((flag & 1) != 0) g_arrow(x2-x1, y2-y1, can_fillpath);
+ g_line(x2, y2);
+ if ((flag & 2) != 0) g_arrow(x1-x2, y1-y2, can_fillpath);
+ }
+}
+
+int g_arrow_style() {
+ return g.arrowstyle;
+}
+
+int g_arrow_tip() {
+ return g.arrowtip;
+}
+
+void g_arrowpoints(GLEPoint& pt, double dx, double dy, GLEArrowProps* arrow, double lwd, GLEArrowPoints* pts) {
+ double radius, angle, dx1, dy1;
+ double arrow_angle = arrow->angle*GLE_PI/180;
+ xy_polar(dx, dy, &radius, &angle);
+ if (arrow->tip == GLE_ARRTIP_SHARP && arrow->style != GLE_ARRSTY_OLD35) {
+ double dist = lwd/(2*sin(arrow_angle));
+ polar_xy(dist, angle, &dx1, &dy1);
+ } else {
+ dx1 = dy1 = 0.0;
+ }
+ pts->xt = pt.getX() + dx1;
+ pts->yt = pt.getY() + dy1;
+ polar_xy(arrow->size, angle+arrow->angle, &dx, &dy);
+ pts->xa = pt.getX() + dx1 + dx;
+ pts->ya = pt.getY() + dy1 + dy;
+ polar_xy(arrow->size, angle-arrow->angle, &dx, &dy);
+ pts->xb = pt.getX() + dx1 + dx;
+ pts->yb = pt.getY() + dy1 + dy;
+ // How far should the line stick into the arrow?
+ if (arrow->style == GLE_ARRSTY_OLD35 || arrow->tip == GLE_ARRTIP_SHARP) {
+ double dist = 1.1*lwd/(2*tan(arrow_angle));
+ polar_xy(dist, angle, &dx1, &dy1);
+ pts->xl = pt.getX() + dx1;
+ pts->yl = pt.getY() + dy1;
+ } else {
+ pts->xl = pt.getX();
+ pts->yl = pt.getY();
+ }
+}
+
+void g_arrowpoints(double cx, double cy, double dx, double dy, GLEArrowPoints* pts) {
+ double lwd;
+ GLEArrowProps arrow;
+ GLEPoint pt(cx, cy);
+ g_arrowsize_actual(&arrow, &lwd, true);
+ g_arrowpoints(pt, dx, dy, &arrow, lwd, pts);
+}
+
+void g_arrowsize(GLEArrowProps* arrow) {
+ double width;
+ double arrow_len = g.arrowsize;
+ double arrow_angle = g.arrowangle;
+ arrow->tip = g.arrowtip;
+ arrow->style = g.arrowstyle;
+ g_get_line_width(&width);
+ if (width == 0) width = 0.02;
+ if (arrow_angle <= 0.0) {
+ if (arrow->style == GLE_ARRSTY_OLD35) {
+ arrow_angle = 10;
+ } else {
+ arrow_angle = 15;
+ }
+ if (width > 0.1) arrow_angle = 20;
+ if (width > 0.3) arrow_angle = 30;
+ }
+ if (arrow_len <= 0.0) {
+ double ang_rad = arrow_angle*GLE_PI/180;
+ if (arrow->style == GLE_ARRSTY_OLD35) {
+ g_get_hei(&arrow_len);
+ arrow_len = arrow_len/2 * cos(ang_rad);
+ if (arrow_len*tan(ang_rad) < width/1.5) {
+ arrow_len = width / (1.5*tan(ang_rad));
+ }
+ } else {
+ arrow_len = 0.2;
+ double fac = (20*width+2.5)/(20*width+1);
+ if (arrow_len*tan(ang_rad) < width*fac) {
+ arrow_len = width*fac / tan(ang_rad);
+ }
+ if (arrow->style == GLE_ARRSTY_EMPTY || arrow->style == GLE_ARRSTY_FILLED) {
+ arrow->size += width/2;
+ }
+ }
+ }
+ //cout << "size: " << arrow_len << endl;
+ arrow->size = arrow_len;
+ arrow->angle = arrow_angle;
+}
+
+void g_arrowsize_actual(GLEArrowProps* arrow, double* lwd, bool sz_az) {
+ g_get_line_width(lwd);
+ g_arrowsize(arrow);
+ g_arrowsize_transform(arrow, *lwd, sz_az);
+}
+
+void g_arrowsize_transform(GLEArrowProps* arrow, double lwd, bool sz_az) {
+ double ang_rad = arrow->angle*GLE_PI/180;
+ if (arrow->style != GLE_ARRSTY_OLD35) {
+ if (arrow->style == GLE_ARRSTY_EMPTY || arrow->style == GLE_ARRSTY_FILLED) {
+ arrow->size -= lwd/2;
+ }
+ if (arrow->tip == GLE_ARRTIP_SHARP) {
+ double dist = lwd/(2*sin(ang_rad));
+ arrow->size -= dist;
+ }
+ if (arrow->size < lwd*0.1) {
+ arrow->size = lwd*0.1;
+ }
+ }
+ if (sz_az) {
+ arrow->size /= cos(ang_rad);
+ }
+}
+
+void g_init_arrow_head(GLECurvedArrowHead* head, bool startend) {
+ double lwidth;
+ GLEArrowProps arrow;
+ g_arrowsize_actual(&arrow, &lwidth, false);
+ head->setLineWidth(lwidth);
+ head->setSharp(arrow.tip == GLE_ARRTIP_SHARP);
+ head->setArrowAngleSizeSharp(arrow.style, arrow.size, arrow.angle);
+ head->setStartEnd(startend);
+}
+
+void g_init_arrow_head_from_properties(GLECurvedArrowHead* head, GLEPropertyStore* props, double fac, bool startend) {
+ GLEArrowProps arrow;
+ double lwd = props->getRealProperty(GLEDOPropertyLineWidth) * fac;
+ arrow.size = props->getRealProperty(GLEDOPropertyArrowSize) * fac;
+ arrow.angle = props->getRealProperty(GLEDOPropertyArrowAngle);
+ arrow.tip = (GLEArrowTip)props->getIntProperty(GLEDOPropertyArrowTip);
+ arrow.style = GLE_ARRSTY_FILLED;
+ g_arrowsize_transform(&arrow, lwd, false);
+ head->setLineWidth(lwd);
+ head->setSharp(arrow.tip == GLE_ARRTIP_SHARP);
+ head->setArrowAngleSizeSharp(arrow.style, arrow.size, arrow.angle);
+ head->setStartEnd(startend);
+}
+
+double GLEArcNormalizedAngle2(double a1, double a2) {
+ return g_arc_normalized_angle2(a1, a2);
+}
+
+void GLEArcUpdateCurvedArrowHeads(GLECurvedArrowHead* head_start,
+ GLECurvedArrowHead* head_end,
+ double* t1,
+ double* t2,
+ GLEPropertyStore* props,
+ double fac,
+ int arrow)
+{
+ if (arrow == 1 || arrow == 3) g_init_arrow_head_from_properties(head_start, props, fac, true);
+ if (arrow == 2 || arrow == 3) g_init_arrow_head_from_properties(head_end, props, fac, false);
+ g_update_arc_bounds_for_arrow_heads(head_start, head_end, t1, t2);
+}
+
+void GLEGetArrowPoints(GLEPoint& pt, double dx, double dy, GLEPropertyStore* props, double fac, GLEArrowPoints* pts) {
+ GLEArrowProps arrow;
+ double lwd = props->getRealProperty(GLEDOPropertyLineWidth) * fac;
+ arrow.size = props->getRealProperty(GLEDOPropertyArrowSize) * fac;
+ arrow.angle = props->getRealProperty(GLEDOPropertyArrowAngle);
+ arrow.tip = (GLEArrowTip)props->getIntProperty(GLEDOPropertyArrowTip);
+ arrow.style = GLE_ARRSTY_FILLED;
+ g_arrowsize_transform(&arrow, lwd, true);
+ g_arrowpoints(pt, dx, dy, &arrow, lwd, pts);
+}
+
+void GLEGetArrowPointsNoProps(GLEPoint& pt, double dx, double dy, double lwd, double size, double angle, GLEArrowPoints* pts) {
+ GLEArrowProps arrow;
+ arrow.size = size;
+ arrow.angle = angle;
+ arrow.tip = GLE_ARRTIP_SHARP;
+ arrow.style = GLE_ARRSTY_FILLED;
+ g_arrowsize_transform(&arrow, lwd, true);
+ g_arrowpoints(pt, dx, dy, &arrow, lwd, pts);
+}
+
+void g_set_arrow_size(double size) {
+ g.arrowsize = size;
+}
+
+void g_set_arrow_angle(double angle) {
+ g.arrowangle = angle;
+}
+
+void g_set_arrow_style(int shape) {
+ g.arrowstyle = shape;
+}
+
+void g_set_arrow_style(const char* shape) throw(ParserError) {
+ if (str_i_equals(shape, "SIMPLE")) {
+ g_set_arrow_style(GLE_ARRSTY_SIMPLE);
+ } else if (str_i_equals(shape, "FILLED")) {
+ g_set_arrow_style(GLE_ARRSTY_FILLED);
+ } else if (str_i_equals(shape, "EMPTY")) {
+ g_set_arrow_style(GLE_ARRSTY_EMPTY);
+ } else {
+ string name = "ARROW_";
+ name += shape;
+ str_to_uppercase(name);
+ GLESub* sub = sub_find(name.c_str());
+ if (sub == NULL || sub->getIndex() == -1) {
+ g_throw_parser_error("subroutine defining arrow style '", name.c_str(), "' not defined");
+ }
+ g_set_arrow_style(GLE_ARRSTY_SUB + sub->getIndex());
+ }
+}
+
+void g_set_arrow_tip(int tip) {
+ g.arrowtip = tip;
+}
+
+void g_set_arrow_tip(const char* tip) throw (ParserError) {
+ if (str_i_equals(tip, "SHARP")) {
+ g_set_arrow_tip(GLE_ARRTIP_SHARP);
+ } else if (str_i_equals(tip, "ROUND")) {
+ g_set_arrow_tip(GLE_ARRTIP_ROUND);
+ } else {
+ g_throw_parser_error("unsupported arrow tip style '", tip, "'");
+ }
+}
+
+void g_arrow(double dx, double dy, int can_fillpath) throw(ParserError) {
+ int old_join;
+ char old_lstyle[15];
+ g_get_line_style(old_lstyle);
+ if (!(old_lstyle[0] == '1' && old_lstyle[1] == 0)) {
+ g_set_line_style("1");
+ }
+ int desired_join = g.arrowtip == GLE_ARRTIP_ROUND ? 1 : 0;
+ g_get_line_join(&old_join);
+ if (old_join != desired_join) {
+ g_set_line_join(desired_join);
+ }
+ double x1, y1;
+ g_get_xy(&x1, &y1);
+ if (g.arrowstyle >= GLE_ARRSTY_SUB) {
+ double radius, angle, lwd;
+ xy_polar(dx, dy, &radius, &angle);
+ GLEArrowProps arrow;
+ g_arrowsize_actual(&arrow, &lwd, true);
+ double args[3];
+ args[0] = angle;
+ args[1] = arrow.angle;
+ args[2] = arrow.size;
+ call_sub_byid(arrow.style-GLE_ARRSTY_SUB, args, 3, "(used for defining arrow style)");
+ } else {
+ GLEArrowPoints pts;
+ g_arrowpoints(x1, y1, dx, dy, &pts);
+ g_set_path(true);
+ g_newpath();
+ g_move(pts.xa, pts.ya);
+ g_line(pts.xt, pts.yt);
+ g_line(pts.xb, pts.yb);
+ if (g.arrowstyle != GLE_ARRSTY_SIMPLE) {
+ g_closepath();
+ GLERC<GLEColor> curr_color(g_get_color());
+ GLERC<GLEColor> curr_fill(g_get_fill());
+ if (g.arrowstyle == GLE_ARRSTY_EMPTY) g_set_fill(GLE_COLOR_WHITE);
+ else g_set_fill(curr_color);
+ g_fill();
+ g_set_fill(curr_fill);
+ }
+ if (g.arrowstyle != GLE_ARRSTY_OLD35) {
+ g_stroke();
+ }
+ g_set_path(false);
+ }
+ if (old_join != desired_join) {
+ g_set_line_join(old_join);
+ }
+ if (!(old_lstyle[0] == '1' && old_lstyle[1] == 0)) {
+ g_set_line_style(old_lstyle);
+ }
+ g_move(x1, y1);
+}
+
+void g_psarrow(double x1, double y1, double x2, double y2, int flag) {
+ double dx = x2-x1;
+ double dy = y2-y1;
+ int old_join;
+ char old_lstyle[15];
+ GLEArrowPoints pts1, pts2;
+ g_arrowpoints(x1, y1, dx, dy, &pts1);
+ g_arrowpoints(x2, y2, -dx, -dy, &pts2);
+ g_get_line_style(old_lstyle);
+ int desired_join = g.arrowtip == GLE_ARRTIP_ROUND ? 1 : 0;
+ g_get_line_join(&old_join);
+ if (old_join != desired_join) {
+ g_set_line_join(desired_join);
+ }
+ /* draw line */
+ if ((flag & 1)>0) g_move(pts1.xl, pts1.yl);
+ else g_move(x1, y1);
+ if ((flag & 2)>0) g_line(pts2.xl, pts2.yl);
+ else g_line(x2, y2);
+ /* draw arrow heads */
+ if (!(old_lstyle[0] == '1' && old_lstyle[1] == 0)) {
+ g_set_line_style("1");
+ }
+ g_set_path(true);
+ g_newpath();
+ if ((flag & 1)>0) {
+ g_move(pts1.xa, pts1.ya);
+ g_line(pts1.xt, pts1.yt);
+ g_line(pts1.xb, pts1.yb);
+ if (g.arrowstyle != GLE_ARRSTY_SIMPLE) g_closepath();
+ }
+ if ((flag & 2)>0) {
+ g_move(pts2.xa, pts2.ya);
+ g_line(pts2.xt, pts2.yt);
+ g_line(pts2.xb, pts2.yb);
+ if (g.arrowstyle != GLE_ARRSTY_SIMPLE) g_closepath();
+ }
+ if (g.arrowstyle != GLE_ARRSTY_SIMPLE) {
+ GLERC<GLEColor> cur_color(g_get_color());
+ GLERC<GLEColor> cur_fill(g_get_fill());
+ if (g.arrowstyle == GLE_ARRSTY_EMPTY) g_set_fill(GLE_COLOR_WHITE);
+ else g_set_fill(cur_color);
+ g_fill();
+ g_set_fill(cur_fill);
+ }
+ if (g.arrowstyle != GLE_ARRSTY_OLD35) {
+ g_stroke();
+ }
+ g_set_path(false);
+ if (old_join != desired_join) {
+ g_set_line_join(old_join);
+ }
+ if (!(old_lstyle[0] == '1' && old_lstyle[1] == 0)) {
+ g_set_line_style(old_lstyle);
+ }
+ g_move(x2, y2);
+}
+
+void g_set_pdf_image_format(const char* format) {
+ if (str_i_equals(format, "AUTO")) {
+ g.pdfimgformat = PDF_IMG_COMPR_AUTO;
+ } else if (str_i_equals(format, "ZIP")) {
+ g.pdfimgformat = PDF_IMG_COMPR_ZIP;
+ } else if (str_i_equals(format, "JPEG")) {
+ g.pdfimgformat = PDF_IMG_COMPR_JPEG;
+ } else if (str_i_equals(format, "PS")) {
+ g.pdfimgformat = PDF_IMG_COMPR_PS;
+ }
+}
+
+void g_set_tex_scale(const char* ss) {
+ TeXInterface* iface = TeXInterface::getInstance();
+ if (str_i_equals(ss, "NONE")) {
+ iface->setScaleMode(TEX_SCALE_MODE_NONE);
+ } else if (str_i_equals(ss, "FIXED")) {
+ iface->setScaleMode(TEX_SCALE_MODE_FIXED);
+ } else if (str_i_equals(ss, "SCALE")) {
+ iface->setScaleMode(TEX_SCALE_MODE_SCALE);
+ }
+}
+
+void g_set_tex_labels(bool onoff) {
+ g.texlabels = onoff;
+}
+
+bool g_get_tex_labels() {
+ return g.texlabels;
+}
+
+int g_get_pdf_image_format() {
+ return g.pdfimgformat;
+}
+
+int g_get_compatibility() {
+ return g_compatibility;
+}
+
+int g_parse_compatibility(const string& compat) throw (ParserError) {
+ TokenizerLanguage lang;
+ lang.setSpaceTokens(" ");
+ lang.setSingleCharTokens(".");
+ StringTokenizer tokens(&lang, true);
+ string compat_noquote = compat;
+ str_remove_quote(compat_noquote);
+ tokens.set_string(compat_noquote);
+ int minor = 0;
+ int micro = 0;
+ int major = tokens.next_integer();
+ if (tokens.has_more_tokens()) {
+ tokens.ensure_next_token(".");
+ minor = tokens.next_integer();
+ }
+ if (tokens.has_more_tokens()) {
+ tokens.ensure_next_token(".");
+ micro = tokens.next_integer();
+ }
+ int value = (major << 16) | (minor << 8) | micro;
+ if (value > GLE_COMPAT_MOST_RECENT) {
+ stringstream err;
+ int cr_major = (GLE_COMPAT_MOST_RECENT >> 16) & 0xFF;
+ int cr_minor = (GLE_COMPAT_MOST_RECENT >> 8) & 0xFF;
+ int cr_micro = GLE_COMPAT_MOST_RECENT & 0xFF;
+ err << "can't set compatibility beyond " << cr_major << "." << cr_minor << "." << cr_micro;
+ throw tokens.error(err.str());
+ }
+ return value;
+}
+
+int g_set_compatibility(const string& compat) throw (ParserError) {
+ int value = g_parse_compatibility(compat);
+ g_set_compatibility(value);
+ return value;
+}
+
+void g_set_compatibility(int compat) {
+ g_compatibility = compat;
+}
+
+void g_set_iconst(int i, int value) {
+ g.intconst[i] = value;
+}
+
+void g_set_fconst(int i, double value) {
+ g.floatconst[i] = value;
+}
+
+int g_get_iconst(int i) {
+ return g.intconst[i];
+}
+
+double g_get_fconst(int i) {
+ return g.floatconst[i];
+}
+
+GLEDevice::GLEDevice():
+ m_recording(false),
+ m_resolution(300.0)
+{
+}
+
+GLEDevice::~GLEDevice() {
+}
+
+void GLEDevice::bitmap(GLEBitmap* bitmap, GLEPoint* pos, GLEPoint* scale, int type) {
+}
+
+void GLEDevice::getRecordedBytes(string* output) {
+ *output = "";
+}
+
+void GLEDevice::set_fill_method(int m) {
+}
+
+void GLEDevice::computeBoundingBox(double width, double height) {
+ if (g_is_fullpage()) {
+ m_boundingBox.setX(72*width/CM_PER_INCH);
+ m_boundingBox.setY(72*height/CM_PER_INCH);
+ } else {
+ // Make bounding box a little larger (bounding box tweak)
+ m_boundingBox.setX(72*width/CM_PER_INCH+2);
+ m_boundingBox.setY(72*height/CM_PER_INCH+2);
+ }
+}
+
+void GLEDevice::computeBoundingBox(double width, double height, int* int_bb_x, int* int_bb_y) {
+ computeBoundingBox(width, height);
+ if (g_is_fullpage()) {
+ // Just round the bounding box to make sure papersize detection works in GhostView
+ *int_bb_x = (int)floor(m_boundingBox.getX()+0.5);
+ *int_bb_y = (int)floor(m_boundingBox.getY()+0.5);
+ } else {
+ // Make sure approximate bounding box is large enough for ImageMagick and GhostView
+ *int_bb_x = (int)ceil(m_boundingBox.getX()+1e-6);
+ *int_bb_y = (int)ceil(m_boundingBox.getY()+1e-6);
+ }
+}
+
+GLEMeasureBox::GLEMeasureBox() : GLERectangle() {
+}
+
+GLEMeasureBox::~GLEMeasureBox() {
+}
+
+void GLEMeasureBox::measureStart() {
+ g_get_bounds(&m_XMin, &m_YMin, &m_XMax, &m_YMax);
+ g_init_bounds();
+}
+
+void GLEMeasureBox::measureEnd() {
+ double x1, y1, x2, y2;
+ g_get_bounds(&x1, &y1, &x2, &y2);
+ if (m_XMin <= m_XMax && m_YMin <= m_YMax) {
+ g_update_bounds(m_XMin, m_YMin);
+ g_update_bounds(m_XMax, m_YMax);
+ }
+ m_XMin = x1; m_YMin = y1;
+ m_XMax = x2; m_YMax = y2;
+}
+
+void GLEMeasureBox::measureEndIgnore() {
+ double x1, y1, x2, y2;
+ g_get_bounds(&x1, &y1, &x2, &y2);
+ g_restore_bounds(m_XMin, m_XMax, m_YMin, m_YMax);
+ m_XMin = x1; m_YMin = y1;
+ m_XMax = x2; m_YMax = y2;
+}
+
+GLEPolynomial::GLEPolynomial(double* coefs, int degree) {
+ m_Coefs = coefs;
+ m_Degree = degree;
+}
+
+GLEPolynomial::~GLEPolynomial() {
+}
+
+void GLEPolynomial::print() {
+ int d = degree();
+ cout << "Polynomial: ";
+ for (int i = d; i >= 0; i--) {
+ double c = a(i);
+ if (c >= 0.0 && i != d) { cout << "+"; }
+ cout << c;
+ if (i != 0) { cout << "*x^" << i; }
+ }
+ cout << endl;
+}
+
+void GLEPolynomial::horner(double v) {
+ int d = degree();
+ for (int i = d-1; i >= 0; i--) {
+ set(i, a(i) + a(i+1)*v);
+ }
+ for (int i = 0; i < d; i++) {
+ set(i, a(i+1));
+ }
+ setDegree(d-1);
+}
+
+double GLEPolynomial::evalPoly(double t) {
+ double r = 0.0;
+ for (int i = degree(); i >= 0; i--) {
+ r *= t;
+ r += a(i);
+ }
+ return r;
+}
+
+double GLEPolynomial::evalDPoly(double t) {
+ double r = 0.0;
+ for (int i = degree(); i > 0; i--) {
+ r *= t;
+ r += i * a(i);
+ }
+ return r;
+}
+
+double GLEPolynomial::newtonRaphson(double t, double prec) {
+ while (true) {
+ double v = evalPoly(t);
+ if (fabs(v) < 1e-9) break;
+ t = t - evalPoly(t)/evalDPoly(t);
+ }
+ return t;
+}
+
+GLERange::GLERange() {
+ m_Min = GLE_INF; m_Max = -GLE_INF;
+}
+
+GLERange::~GLERange() {
+}
+
+void GLERange::setMinMax(double min, double max) {
+ setMin(min);
+ setMax(max);
+}
+
+void GLERange::copy(GLERange* other) {
+ m_Min = other->getMin();
+ m_Max = other->getMax();
+}
+
+void GLERange::copyHas(GLERangeSet* other) {
+ if (other->hasMin()) m_Min = other->getMin();
+ if (other->hasMax()) m_Max = other->getMax();
+}
+
+void GLERange::initRange() {
+ setMin(GLE_INF);
+ setMax(-GLE_INF);
+}
+
+bool GLERange::isMinValid() const {
+ return !gle_isinf(m_Min);
+}
+
+bool GLERange::isMaxValid() const {
+ return !gle_isinf(m_Max);
+}
+
+void GLERange::updateRange(double value) {
+ if (value < m_Min) m_Min = value;
+ if (value > m_Max) m_Max = value;
+}
+
+void GLERange::clip(double* value) {
+ if (*value < m_Min) *value = m_Min;
+ if (*value > m_Max) *value = m_Max;
+}
+
+bool GLERange::contains(double value) {
+ return value >= m_Min && value <= m_Max;
+}
+
+ostream& GLERange::printRange(ostream& out) const {
+ out << "min = ";
+ if (isMinValid()) out << m_Min; else out << "?";
+ out << " max = ";
+ if (isMaxValid()) out << m_Max; else out << "?";
+ return out;
+}
+
+GLERangeSet::GLERangeSet() : GLERange() {
+ m_MinSet = m_MaxSet = false;
+}
+
+GLERangeSet::~GLERangeSet() {
+}
+
+void GLERangeSet::setMinSet(double min) {
+ setMin(min);
+ m_MinSet = true;
+}
+
+void GLERangeSet::setMaxSet(double max) {
+ setMax(max);
+ m_MaxSet = true;
+}
+
+void GLERangeSet::setMinMaxSet(double min, double max) {
+ setMinSet(min);
+ setMaxSet(max);
+}
+
+void GLERangeSet::resetSet() {
+ m_MinSet = m_MaxSet = false;
+}
+
+void GLERangeSet::setMinIfNotSet(double min) {
+ if (!hasMin()) setMin(min);
+}
+
+void GLERangeSet::setMaxIfNotSet(double max) {
+ if (!hasMax()) setMax(max);
+}
+
+void GLERangeSet::copyIfNotSet(GLERange* other) {
+ if (!hasMin()) setMin(other->getMin());
+ if (!hasMax()) setMax(other->getMax());
+}
+
+void GLERangeSet::initRangeIfNotSet() {
+ if (!hasMin()) setMin(GLE_INF);
+ if (!hasMax()) setMax(-GLE_INF);
+}
+
+void GLERangeSet::copySet(GLERangeSet* other) {
+ GLERange::copy(other);
+ m_MinSet = other->hasMin();
+ m_MaxSet = other->hasMax();
+}
+
+GLERectangle::GLERectangle() {
+ m_XMin = m_YMin = m_XMax = m_YMax = 0.0;
+}
+
+GLERectangle::GLERectangle(double xmin, double ymin, double xmax, double ymax) {
+ m_XMin = xmin; m_YMin = ymin;
+ m_XMax = xmax; m_YMax = ymax;
+}
+
+GLERectangle::GLERectangle(GLERectangle* other) {
+ m_XMin = other->m_XMin; m_YMin = other->m_YMin;
+ m_XMax = other->m_XMax; m_YMax = other->m_YMax;
+}
+
+GLERectangle::~GLERectangle() {
+}
+
+void GLERectangle::reset() {
+ m_XMin = m_YMin = m_XMax = m_YMax = 0.0;
+}
+
+void GLERectangle::normalize() {
+ if (m_XMin > m_XMax) {
+ double a = m_XMin;
+ m_XMin = m_XMax;
+ m_XMax = a;
+ }
+ if (m_YMin > m_YMax) {
+ double a = m_YMin;
+ m_YMin = m_YMax;
+ m_YMax = a;
+ }
+}
+
+void GLERectangle::copy(GLERectangle* other) {
+ m_XMin = other->m_XMin; m_YMin = other->m_YMin;
+ m_XMax = other->m_XMax; m_YMax = other->m_YMax;
+}
+
+void GLERectangle::copy(GLEPoint* point) {
+ m_XMin = point->getX(); m_YMin = point->getY();
+ m_XMax = point->getX(); m_YMax = point->getY();
+}
+
+void GLERectangle::getDimensions(double* xmin, double* ymin, double* xmax, double* ymax) {
+ *xmin = m_XMin; *ymin = m_YMin;
+ *xmax = m_XMax; *ymax = m_YMax;
+}
+
+void GLERectangle::setDimensions(double xmin, double ymin, double xmax, double ymax) {
+ m_XMin = xmin; m_YMin = ymin;
+ m_XMax = xmax; m_YMax = ymax;
+}
+
+void GLERectangle::translate(double x, double y) {
+ m_XMin += x; m_YMin += y;
+ m_XMax += x; m_YMax += y;
+}
+
+void GLERectangle::translate(GLEPoint* p) {
+ m_XMin += p->getX(); m_YMin += p->getY();
+ m_XMax += p->getX(); m_YMax += p->getY();
+}
+
+void GLERectangle::scale(double s) {
+ m_XMin *= s; m_YMin *= s;
+ m_XMax *= s; m_YMax *= s;
+}
+
+void GLERectangle::subtractXFrom(double x) {
+ m_XMin = x - m_XMin;
+ m_XMax = x - m_XMax;
+}
+
+void GLERectangle::subtractYFrom(double y) {
+ m_YMin = y - m_YMin;
+ m_YMax = y - m_YMax;
+}
+
+void GLERectangle::grow(double d) {
+ m_XMin -= d; m_XMax += d;
+ m_YMin -= d; m_YMax += d;
+}
+
+bool GLERectangle::contains(double x, double y) {
+ return x >= m_XMin && x <= m_XMax && y >= m_YMin && y <= m_YMax;
+}
+
+void GLERectangle::initRange() {
+ m_XMin = m_YMin = GLE_INF;
+ m_XMax = m_YMax = -GLE_INF;
+}
+
+void GLERectangle::updateRange(double x, double y) {
+ if (x < m_XMin) m_XMin = x;
+ if (y < m_YMin) m_YMin = y;
+ if (x > m_XMax) m_XMax = x;
+ if (y > m_YMax) m_YMax = y;
+}
+
+void GLERectangle::updateRange(GLEPoint* pt) {
+ if (pt->getX() < m_XMin) m_XMin = pt->getX();
+ if (pt->getY() < m_YMin) m_YMin = pt->getY();
+ if (pt->getX() > m_XMax) m_XMax = pt->getX();
+ if (pt->getY() > m_YMax) m_YMax = pt->getY();
+}
+
+void GLERectangle::addToRangeX(GLERange* range) {
+ if (m_XMin <= m_XMax) {
+ range->updateRange(m_XMin);
+ range->updateRange(m_XMax);
+ }
+}
+
+void GLERectangle::addToRangeY(GLERange* range) {
+ if (m_YMin <= m_YMax) {
+ range->updateRange(m_YMin);
+ range->updateRange(m_YMax);
+ }
+}
+
+ostream& GLERectangle::print(ostream& out) const {
+ out << "(" << m_XMin << "," << m_YMin << ") x (" << m_XMax << "," << m_YMax << ")";
+ return out;
+}
+
+void GLERectangle::toPoint(GLEJustify just, GLEPoint* point) {
+ if (just == GLEJustifyVert) {
+ /* vertical box */
+ if (fabs(m_YMax - point->getY()) < fabs(m_YMin - point->getY())) point->setY(m_YMax);
+ else point->setY(m_YMin);
+ return;
+ }
+ if (just == GLEJustifyHorz) {
+ /* horizontal box */
+ if (fabs(m_XMax - point->getX()) < fabs(m_XMin - point->getX())) point->setX(m_XMax);
+ else point->setX(m_XMin);
+ return;
+ }
+ /* jx and jy value 0..2 */
+ int jx = (just & 0xf0) >> 4;
+ int jy = just & 0x0f;
+ double dx = jx * (m_XMax-m_XMin)/2;
+ point->setX(m_XMin + dx);
+ double dy = jy * (m_YMax-m_YMin)/2;
+ point->setY(m_YMin + dy);
+}
+
+GLEPoint::GLEPoint(double x, double y) {
+ m_X = x;
+ m_Y = y;
+}
+
+GLEPoint::GLEPoint() {
+ m_X = 0.0;
+ m_Y = 0.0;
+}
+
+GLEPoint::GLEPoint(const GLEPoint& p) {
+ m_X = p.m_X;
+ m_Y = p.m_Y;
+}
+
+GLEPoint::~GLEPoint() {
+}
+
+void GLEPoint::add(double s, const GLEPoint& p) {
+ m_X += s*p.m_X;
+ m_Y += s*p.m_Y;
+}
+
+double GLEPoint::distance(const GLEPoint& p) const {
+ double dx = m_X - p.m_X;
+ double dy = m_Y - p.m_Y;
+ return sqrt(dx*dx + dy*dy);
+}
+
+double GLEPoint::norm() const {
+ return sqrt(m_X*m_X + m_Y*m_Y);
+}
+
+double GLEPoint::normSq() const {
+ return m_X*m_X + m_Y*m_Y;
+}
+
+void GLEPoint::normalize() {
+ double n = norm();
+ m_X /= n; m_Y /= n;
+}
+
+bool GLEPoint::approx(double x, double y) {
+ return fabs(x - m_X) < 1e-6 && fabs(y - m_Y) < 1e-6;
+}
+
+void GLEPoint::swap(GLEPoint& other) {
+ double backup_x = m_X;
+ double backup_y = m_Y;
+ m_X = other.m_X;
+ m_Y = other.m_Y;
+ other.m_X = backup_x;
+ other.m_Y = backup_y;
+}
+
+ostream& GLEPoint::write(ostream& os) const {
+ os << m_X << ":" << m_Y;
+ return os;
+}
+
+GLELineSegment::GLELineSegment(const GLEPoint& p1, const GLEPoint& p2):
+ m_p1(p1),
+ m_p2(p2)
+{
+}
+
+GLELineSegment::GLELineSegment(double x1, double y1, double x2, double y2):
+ m_p1(x1, y1),
+ m_p2(x2, y2)
+{
+}
+
+GLEPoint3D::GLEPoint3D() {
+ m_C[0] = m_C[1] = m_C[2] = 0.0;
+}
+
+GLEPoint3D::GLEPoint3D(double x, double y, double z) {
+ m_C[0] = x;
+ m_C[1] = y;
+ m_C[2] = z;
+}
+
+GLEPoint3D::GLEPoint3D(const GLEPoint3D& p) {
+ m_C[0] = p.m_C[0];
+ m_C[1] = p.m_C[1];
+ m_C[2] = p.m_C[2];
+}
+
+void GLEPoint3D::dotScalar(double s) {
+ m_C[0] *= s;
+ m_C[1] *= s;
+ m_C[2] *= s;
+}
+
+void GLEPoint3D::add(const GLEPoint3D& p) {
+ m_C[0] += p.m_C[0];
+ m_C[1] += p.m_C[1];
+ m_C[2] += p.m_C[2];
+}
+
+void GLEPoint3D::subtract(const GLEPoint3D& p) {
+ m_C[0] -= p.m_C[0];
+ m_C[1] -= p.m_C[1];
+ m_C[2] -= p.m_C[2];
+}
+
+void GLEPoint3D::addScalar(double s1, double s2, const GLEPoint3D& p) {
+ m_C[0] = s1*m_C[0] + s2*p.m_C[0];
+ m_C[1] = s1*m_C[1] + s2*p.m_C[1];
+ m_C[2] = s1*m_C[2] + s2*p.m_C[2];
+}
+
+double GLEPoint3D::norm() const {
+ return sqrt(m_C[0]*m_C[0]+m_C[1]*m_C[1]+m_C[2]*m_C[2]);
+}
+
+void GLEPoint3D::normalize() {
+ double n = norm();
+ m_C[0] /= n; m_C[1] /= n; m_C[2] /= n;
+}
+
+/**
+ * Operator ortho3DUnit
+ * Description : Compute a unit vector that is orthogonal to this vector and p.
+ * Parameters : p - Other vector.
+ * r - Result vector.
+ */
+void GLEPoint3D::ortho3DUnit(const GLEPoint3D& p, GLEPoint3D* r) {
+ double ax = m_C[0];
+ double ay = m_C[1];
+ double az = m_C[2];
+ double bx = p.m_C[0];
+ double by = p.m_C[1];
+ double bz = p.m_C[2];
+ double cx = ay*bz - by*az;
+ double cy = bx*az - ax*bz;
+ double cz = ax*by - bx*ay;
+ double div = sqrt(cx*cx+cy*cy+cz*cz);
+ r->set(cx/div, cy/div, cz/div);
+}
+
+ostream& GLEPoint3D::write(ostream& os) const {
+ os << m_C[0] << ", " << m_C[1] << ", " << m_C[2];
+ return os;
+}
+
+GLEMatrix::GLEMatrix(int rows, int cols) {
+ m_Rows = rows;
+ m_Cols = cols;
+ m_C = new double[m_Rows*m_Cols];
+}
+
+GLEMatrix::GLEMatrix(const GLEMatrix& p) {
+ m_Rows = p.m_Rows;
+ m_Cols = p.m_Cols;
+ int size = m_Rows*m_Cols;
+ m_C = new double[size];
+ for (int i = 0; i < size; i++) {
+ m_C[i] = p.m_C[i];
+ }
+}
+
+GLEMatrix::~GLEMatrix() {
+ delete[] m_C;
+}
+
+/**
+ * Operator dot
+ * Description : Compute the dot product with a given vector.
+ * Parameters : p - The given vector
+ * r - The result vector
+ */
+void GLEMatrix::dot(const GLEPoint3D& p, GLEPoint3D* r) const {
+ int idx = 0;
+ for (int row = 0; row < 3; row++) {
+ double result = 0.0;
+ for (int col = 0; col < 3; col++) {
+ result += m_C[idx++]*p.m_C[col];
+ }
+ r->m_C[row] = result;
+ }
+
+}
+
+/**
+ * Method setVertVector
+ * Description : Copy vector to matrix row.
+ * Parameters : row - Destination row.
+ * col - Destination column.
+ * p - Vector to copy.
+ */
+void GLEMatrix::setVertVector(int row, int col, const GLEPoint3D& p) {
+ int idx = row*m_Cols+col;
+ for (int pos = 0; pos < 3; pos++) {
+ m_C[idx] = p.m_C[pos];
+ idx += m_Cols;
+ }
+}
+
+ostream& GLEMatrix::write(ostream& os) const {
+ int offs = 0;
+ for (int i = 0; i < m_Rows; i++) {
+ for (int j = 0; j < m_Cols; j++) {
+ if (j != 0) os << ", ";
+ os << m_C[offs++];
+ }
+ os << endl;
+ }
+ return os;
+}
+
+GLEProjection::GLEProjection() {
+}
+
+void GLEProjection::zoom(double factor) {
+ GLEPoint3D dir(m_Eye);
+ dir.subtract(m_Reference);
+ dir.dotScalar(factor);
+ m_Eye.add(dir);
+}
+
+void GLEProjection::rotate(double angle, bool horiz) {
+ GLEPoint3D dir(m_Eye);
+ dir.subtract(m_Reference);
+ double len = dir.norm();
+ double v_cos = cos(angle*GLE_PI/180);
+ double v_sin = sin(angle*GLE_PI/180);
+ GLEPoint3D n_eye, n_vvec;
+ if (horiz) {
+ n_eye.set(len*v_sin, 0.0, len*v_cos);
+ n_vvec.set(0.0, v_cos, -v_sin);
+ } else {
+ n_eye.set(0.0, len*v_sin, len*v_cos);
+ n_vvec.set(0.0, 1.0, 0.0);
+ }
+ GLEMatrix axis_rotate(3, 3);
+ invToReference(&axis_rotate);
+ axis_rotate.dot(n_eye, &m_Eye);
+ m_Eye.add(m_Reference);
+ axis_rotate.dot(n_vvec, &m_VVector);
+}
+
+/**
+ * Inspector invToReference
+ * Explanation : Returns the inverse viewing transformation
+ * Z-axis parrallel to eye-ref.
+ * X-axis orthogonal to vvec and z-axis.
+ * Y-axis orthogonal to previous two axis.
+ */
+void GLEProjection::invToReference(GLEMatrix* mtrx) {
+ GLEPoint3D z_axis(m_Eye);
+ z_axis.subtract(m_Reference);
+ z_axis.normalize();
+ GLEPoint3D x_axis, y_axis;
+ m_VVector.ortho3DUnit(z_axis, &x_axis);
+ z_axis.ortho3DUnit(x_axis, &y_axis);
+ mtrx->setVertVector(0,0,x_axis);
+ mtrx->setVertVector(0,1,y_axis);
+ mtrx->setVertVector(0,2,z_axis);
+}
+
+void GLEProjection::reference(const GLEPoint3D& ref) {
+ GLEPoint3D delta;
+ GLEMatrix axis_rotate(3, 3);
+ invToReference(&axis_rotate);
+ axis_rotate.dot(ref, &delta);
+ m_Reference.add(delta);
+}
+
+void GLEProjection::adjustV(double angle) {
+ GLEMatrix axis_rotate(3, 3);
+ invToReference(&axis_rotate);
+ double v_cos = cos(angle*GLE_PI/180);
+ double v_sin = sin(angle*GLE_PI/180);
+ GLEPoint3D y_vect(v_sin, v_cos, 0.0);
+ axis_rotate.dot(y_vect, &m_VVector);
+}
+
+GLELinearEquation::GLELinearEquation() {
+ m_A = 1.0;
+ m_B = 0.0;
+}
+
+GLELinearEquation::~GLELinearEquation() {
+}
+
+void GLELinearEquation::fit(double x0, double y0, double x1, double y1) {
+ double det = x0 - x1;
+ if (det != 0.0) {
+ m_A = (y0 - y1) / det;
+ m_B = (x0*y1 - x1*y0) / det;
+ }
+}
+
+GLECurve::GLECurve() {
+}
+
+GLECurve::~GLECurve() {
+}
+
+double GLECurve::getT0() {
+ return 0.0;
+}
+
+double GLECurve::getT1() {
+ return 1.0;
+}
+
+double GLECurve::computeDistRecursive(double t1, GLEPoint& p1, double t2, GLEPoint& p2) {
+ GLEPoint pm, pm1, pm2;
+ /* Check for trivial case */
+ if (t1 == t2) {
+ return 0.0;
+ }
+ /* Rough approximation */
+ double tm = (t1 + t2) / 2.0;
+ getC(tm, pm);
+ double dist1 = p1.distance(pm) + p2.distance(pm);
+ /* Finer approximation */
+ getC((t1+tm)/2.0, pm1);
+ getC((t2+tm)/2.0, pm2);
+ double dist2 = p1.distance(pm1) + pm1.distance(pm) + pm2.distance(pm) + p2.distance(pm2);
+ if (fabs(dist1-dist2)/(t2-t1) < 1e-9) {
+ return dist2;
+ } else {
+ return computeDistRecursive(t1, p1, tm, pm) +
+ computeDistRecursive(tm, pm, t2, p2);
+ }
+}
+
+double GLECurve::getDist(double t1, double t2) {
+ GLEPoint p1, p2;
+ getC(t1, p1);
+ getC(t2, p2);
+ if (t2 < t1) {
+ return -1.0*computeDistRecursive(t2, p2, t1, p1);
+ } else {
+ return computeDistRecursive(t1, p1, t2, p2);
+ }
+}
+
+double GLECurve::distToParamValue(double t1, double dist) {
+ GLEPoint T;
+ getCp(t1, T);
+ double dist_corr = dist * 1.05; /* add 5% */
+ double t = t1 + dist_corr / T.norm();
+ return distToParamValue(t1, dist, t);
+}
+
+class GLECurveDistToParamValue {
+protected:
+ GLECurve* m_Curve;
+ double m_Dist, m_CrDist, m_BestErr, m_BestParam;
+public:
+ GLECurveDistToParamValue(GLECurve* curve);
+ ~GLECurveDistToParamValue();
+ void update(double dist, double param);
+ void distToParamValueRecursive(double t1, GLEPoint& p1, double t2, GLEPoint& p2);
+ double distToParamValue(double t1, double dist, double t2);
+};
+
+GLECurveDistToParamValue::GLECurveDistToParamValue(GLECurve* curve) {
+ m_Curve = curve;
+}
+
+GLECurveDistToParamValue::~GLECurveDistToParamValue() {
+}
+
+void GLECurveDistToParamValue::update(double dist, double param) {
+ m_CrDist += dist;
+ double err = fabs(m_Dist - m_CrDist);
+ if (err < m_BestErr) {
+ m_BestErr = err;
+ m_BestParam = param;
+ }
+}
+
+void GLECurveDistToParamValue::distToParamValueRecursive(double t1, GLEPoint& p1, double t2, GLEPoint& p2) {
+ GLEPoint pm, pm1, pm2;
+ /* Check for trivial case */
+ if (t1 == t2) {
+ return;
+ }
+ /* Rough approximation */
+ double tm = (t1 + t2) / 2.0;
+ m_Curve->getC(tm, pm);
+ double dist1 = p1.distance(pm) + p2.distance(pm);
+ /* Finer approximation */
+ m_Curve->getC((t1+tm)/2.0, pm1);
+ m_Curve->getC((t2+tm)/2.0, pm2);
+ double dist2 = p1.distance(pm1) + pm1.distance(pm) + pm2.distance(pm) + p2.distance(pm2);
+ if (fabs(dist1-dist2)/(t2-t1) < 1e-9) {
+ update(p1.distance(pm1), (t1+tm)/2.0);
+ update(pm1.distance(pm), tm);
+ update(pm2.distance(pm), (t2+tm)/2.0);
+ update(p2.distance(pm2), t2);
+ } else {
+ distToParamValueRecursive(t1, p1, tm, pm);
+ distToParamValueRecursive(tm, pm, t2, p2);
+ }
+}
+
+double GLECurveDistToParamValue::distToParamValue(double t1, double dist, double t2) {
+ GLEPoint p1, p2;
+ m_Curve->getC(t1, p1);
+ m_Curve->getC(t2, p2);
+ m_Dist = dist;
+ m_BestErr = 1e16;
+ m_BestParam = t2;
+ m_CrDist = 0.0;
+ distToParamValueRecursive(t1, p1, t2, p2);
+ return m_BestParam;
+}
+
+double GLECurve::distToParamValue(double t1, double dist, double t2) {
+ GLEPoint T, p0, p;
+ getC(t1, p0);
+ double dist_abs = fabs(dist);
+ double dist_corr = dist_abs * 1.05; /* add 5% */
+ /* Newton-Raphson on line distance between c(t1) and c(t) */
+ /* Make this distance 5% longer than desired, just to be sure */
+ double froot = 0.0;
+ do {
+ getC(t2, p);
+ getCp(t2, T);
+ p.add(-1.0, p0);
+ froot = p.norm();
+ double ft = froot - dist_corr;
+ double fpt = 1/froot * (p.getX()*T.getX() + p.getY()*T.getY());
+ t2 = t2 - ft/fpt;
+ } while (fabs(froot - dist_corr)/dist_corr > 1e-4);
+ /* Line distance should be upper bound on true distance */
+ /* Now do iterative refinement to obtain true distance */
+ GLECurveDistToParamValue dtp(this);
+ double res = dtp.distToParamValue(t1, dist_abs, t2);
+ return res;
+}
+
+double GLECurve::getDistp(double t) {
+ GLEPoint T;
+ getCp(t, T);
+ return T.norm();
+}
+
+GLECurveT0T1::GLECurveT0T1() {
+}
+
+GLECurveT0T1::~GLECurveT0T1() {
+}
+
+double GLECurveT0T1::getT0() {
+ return m_T0;
+}
+
+double GLECurveT0T1::getT1() {
+ return m_T1;
+}
+
+GLECircleArc::GLECircleArc(const GLEPoint& orig, double r, double t0, double t1) {
+ m_Orig.set(orig);
+ m_T0 = t0; m_T1 = t1; m_R = r;
+}
+
+GLECircleArc::~GLECircleArc() {
+}
+
+void GLECircleArc::getC(double t, GLEPoint& p) {
+ p.setX(m_Orig.getX() + m_R * cos(t));
+ p.setY(m_Orig.getY() + m_R * sin(t));
+}
+
+void GLECircleArc::getCp(double t, GLEPoint& p) {
+ p.setX(-sin(t) * m_R);
+ p.setY(cos(t) * m_R);
+}
+
+void GLECircleArc::getCpp(double t, GLEPoint& p) {
+ p.setX(-cos(t) * m_R);
+ p.setY(-sin(t) * m_R);
+}
+
+
+double GLECircleArc::getDist(double t1, double t2) {
+ return m_R * (t2 - t1);
+}
+
+double GLECircleArc::distToParamValue(double t1, double dist, double t2) {
+ return distToParamValue(t1, dist);
+}
+
+double GLECircleArc::distToParamValue(double t1, double dist) {
+ return t1 + dist/m_R;
+}
+
+GLEEllipseArc::GLEEllipseArc(const GLEPoint& orig, double rx, double ry, double t0, double t1) {
+ m_Orig.set(orig);
+ m_T0 = t0; m_T1 = t1;
+ m_Rx = rx; m_Ry = ry;
+}
+
+GLEEllipseArc::~GLEEllipseArc() {
+}
+
+void GLEEllipseArc::getC(double t, GLEPoint& p) {
+ p.setX(m_Orig.getX() + m_Rx * cos(t));
+ p.setY(m_Orig.getY() + m_Ry * sin(t));
+}
+
+void GLEEllipseArc::getCp(double t, GLEPoint& p) {
+ p.setX(-sin(t) * m_Rx);
+ p.setY(cos(t) * m_Ry);
+}
+
+void GLEEllipseArc::getCpp(double t, GLEPoint& p) {
+ p.setX(-cos(t) * m_Rx);
+ p.setY(-sin(t) * m_Ry);
+}
+
+/*
+ x(t) = axt^3 + bxt^2 + cxt + x0
+
+ x1 = x0 + cx / 3
+ x2 = x1 + (cx + bx) / 3
+ x3 = x0 + cx + bx + ax
+
+ y(t) = ayt^3 + byt^2 + cyt + y0
+
+ y1 = y0 + cy / 3
+ y2 = y1 + (cy + by) / 3
+ y3 = y0 + cy + by + ay
+
+ cx = 3 (x1 - x0)
+ bx = 3 (x2 - x1) - cx
+ ax = x3 - x0 - cx - bx
+
+ cy = 3 (y1 - y0)
+ by = 3 (y2 - y1) - cy
+ ay = y3 - y0 - cy - by
+*/
+
+GLEBezier::GLEBezier() {
+}
+
+GLEBezier::GLEBezier(double x0, double y0, double x1, double y1, double x2, double y2, double x3, double y3) : m_P0(x0, y0), m_P1(x1, y1), m_P2(x2, y2), m_P3(x3, y3) {
+ updateEquation();
+}
+
+GLEBezier::GLEBezier(const GLEBezier& other) : m_P0(other.getP0()), m_P1(other.getP1()), m_P2(other.getP2()), m_P3(other.getP3()) {
+ updateEquation();
+}
+
+GLEBezier::~GLEBezier() {
+}
+
+void GLEBezier::updateEquation() {
+ m_Cx = 3*(m_P1.getX() - m_P0.getX());
+ m_Bx = 3*(m_P2.getX() - m_P1.getX()) - m_Cx;
+ m_Ax = m_P3.getX() - m_P0.getX() - m_Cx - m_Bx;
+ m_Cy = 3*(m_P1.getY() - m_P0.getY());
+ m_By = 3*(m_P2.getY() - m_P1.getY()) - m_Cy;
+ m_Ay = m_P3.getY() - m_P0.getY() - m_Cy - m_By;
+}
+
+void GLEBezier::getC(double t, GLEPoint& p) {
+ p.setX(((m_Ax*t + m_Bx)*t + m_Cx)*t + m_P0.getX());
+ p.setY(((m_Ay*t + m_By)*t + m_Cy)*t + m_P0.getY());
+}
+
+void GLEBezier::getCp(double t, GLEPoint& p) {
+ p.setX((3.0*m_Ax*t + 2.0*m_Bx)*t + m_Cx);
+ p.setY((3.0*m_Ay*t + 2.0*m_By)*t + m_Cy);
+}
+
+void GLEBezier::getCpp(double t, GLEPoint& p) {
+ p.setX(6.0*m_Ax*t + 2.0*m_Bx);
+ p.setY(6.0*m_Ay*t + 2.0*m_By);
+}
+
+void GLEBezier::draw() {
+ g_set_pos(getP0());
+ g_bezier(getP1(), getP2(), getP3());
+}
+
+void GLEBezier::cutAtParamValue(double t) {
+ double ot = 1.0 - t;
+ GLEPoint p_1_1(m_P2);
+ p_1_1.dotScalar(t);
+ p_1_1.addScalar(m_P1, ot);
+ GLEPoint p_2_1(m_P3);
+ p_2_1.dotScalar(t);
+ p_2_1.addScalar(m_P2, ot);
+ GLEPoint p_1_2(p_2_1);
+ p_1_2.dotScalar(t);
+ p_1_2.addScalar(p_1_1, ot);
+ m_P1.dotScalar(t);
+ m_P1.addScalar(m_P0, ot);
+ m_P2.set(m_P1);
+ m_P2.dotScalar(ot);
+ m_P2.addScalar(p_1_1, t);
+ m_P3.set(m_P2);
+ m_P3.dotScalar(ot);
+ m_P3.addScalar(p_1_2, t);
+ updateEquation();
+}
+
+void GLEBezier::cutFromParamValue(double t) {
+ double ot = 1.0 - t;
+ GLEPoint p_1_1(m_P2);
+ p_1_1.dotScalar(t);
+ p_1_1.addScalar(m_P1, ot);
+ GLEPoint p_0_1(m_P1);
+ p_0_1.dotScalar(t);
+ p_0_1.addScalar(m_P0, ot);
+ GLEPoint p_0_2(p_1_1);
+ p_0_2.dotScalar(t);
+ p_0_2.addScalar(p_0_1, ot);
+ m_P2.dotScalar(ot);
+ m_P2.addScalar(m_P3, t);
+ m_P1.set(m_P2);
+ m_P1.dotScalar(t);
+ m_P1.addScalar(p_1_1, ot);
+ m_P0.set(m_P1);
+ m_P0.dotScalar(t);
+ m_P0.addScalar(p_0_2, ot);
+ updateEquation();
+}
+
+void GLEBezier::throughPoint(GLEPoint& p, GLEPoint& dir1, GLEPoint& dir2) {
+ double poly[6];
+ double a = p.getX() - m_P0.getX();
+ double b = 3*(m_P0.getX()-m_P3.getX());
+ double c = 2*(m_P3.getX()-m_P0.getX());
+ double d = dir1.getX();
+ double e = dir2.getX() - 2*dir1.getX();
+ double f = dir1.getX() - dir2.getX();
+ double g = p.getY() - m_P0.getY();
+ double h = 3*(m_P0.getY()-m_P3.getY());
+ double i = 2*(m_P3.getY()-m_P0.getY());
+ double j = dir1.getY();
+ double k = dir2.getY() - 2*dir1.getY();
+ double l = dir1.getY() - dir2.getY();
+ poly[5] = c*l - i*f;
+ poly[4] = c*k + b*l - i*e - h*f;
+ poly[3] = c*j + b*k - i*d - h*e;
+ poly[2] = b*j + a*l - h*d - g*f;
+ poly[1] = a*k - g*e;
+ poly[0] = a*j - g*d;
+ GLEPolynomial polynomial(poly, 5);
+ polynomial.horner(1);
+ // polynomial.print();
+ double t = polynomial.newtonRaphson(0.5);
+ double scale = (a + b*t*t + c*t*t*t)/(d + e*t + f*t*t)/(3*t);
+ m_P1.set(m_P0);
+ m_P1.add(scale, dir1);
+ m_P2.set(m_P3);
+ m_P2.add(scale, dir2);
+}
+
+GLECurvedArrowHead::GLECurvedArrowHead(GLECurve* curve) {
+ m_Curve = curve;
+ m_T0 = m_TM = m_T1 = m_ArrAlpha = m_ArrSize = m_LWidth = 0.0;
+ m_Sharp = m_Enable = false;
+ m_ArrStyle = GLE_ARRSTY_FILLED;
+}
+
+GLECurvedArrowHead::~GLECurvedArrowHead() {
+}
+
+void GLECurvedArrowHead::setArrowAngleSize(int style, double size, double angle) {
+ m_ArrStyle = style;
+ m_ArrSize = size;
+ m_ArrAlpha = angle*GLE_PI/180.0;
+}
+
+void GLECurvedArrowHead::setArrowAngleSizeSharp(int style, double size, double angle) {
+ m_ArrStyle = style;
+ m_ArrAlpha = angle*GLE_PI/180.0;
+ if (style != GLE_ARRSTY_FILLED) setSharp(false);
+ if (isSharp() && style == GLE_ARRSTY_FILLED) {
+ m_ArrSize = size + m_LWidth*(1+1/sin(m_ArrAlpha))/2;
+ } else {
+ m_ArrSize = size;
+ }
+ if (style == GLE_ARRSTY_OLD35) {
+ setSharp(true);
+ m_ArrStyle = GLE_ARRSTY_FILLED;
+ }
+}
+
+void GLECurvedArrowHead::getA(double t, double pm, GLEPoint& p) {
+ GLEPoint N, T;
+ // get curve tangent
+ m_Curve->getCp(t, T);
+ T.normalize();
+ // compute curve normal
+ N.setXY(T.getY(), -T.getX());
+ // multiply by height
+ double h = pm * m_Curve->getDist(m_T0, t) * tan(m_ArrAlpha);
+ N.dotScalar(h);
+ // add to point on curve
+ m_Curve->getC(t, p);
+ p.add(N);
+}
+
+void GLECurvedArrowHead::getAp(double t, double pm1, double pm2, GLEPoint& p) {
+ GLEPoint T, Tp, N, Np, c;
+ m_Curve->getC(t, c);
+ m_Curve->getCp(t, T);
+ m_Curve->getCpp(t, Tp);
+ /* the normal vector */
+ N.setXY(T.getY(), -T.getX());
+ N.normalize();
+ /* derivative of the normal vector */
+ double norm_sq = T.normSq();
+ double norm = sqrt(norm_sq);
+ double dnorm = (T.getX()*Tp.getX() + T.getY()*Tp.getY())/norm;
+ Np.setX((Tp.getY()*norm - T.getY()*dnorm)/norm_sq);
+ Np.setY((T.getX()*dnorm - Tp.getX()*norm)/norm_sq);
+ /* result = T +- (h'*N + h*N') */
+ double h = m_Curve->getDist(m_T0, t) * tan(m_ArrAlpha);
+ double hp = m_Curve->getDistp(t) * tan(m_ArrAlpha);
+ N.dotScalar(hp);
+ Np.dotScalar(h);
+ N.add(Np);
+ N.dotScalar(pm1);
+ /* compute result in p */
+ p.set(T);
+ p.add(N);
+ p.normalize();
+ p.dotScalar(pm2);
+}
+
+void GLECurvedArrowHead::computeArrowHead() {
+ // compute P0 and P3 for both sides
+ GLEPoint r1, r2, p;
+ getA(m_T1, +1, m_Side1.P0());
+ m_Curve->getC(m_T0, m_Side1.P3());
+ getA(m_TM, +1, p);
+ getAp(m_T1, +1, -1, r1);
+ getAp(m_T0, +1, +1, r2);
+ m_Side1.throughPoint(p, r1, r2);
+ m_Curve->getC(m_T0, m_Side2.P0());
+ getA(m_T1, -1, m_Side2.P3());
+ getA(m_TM, -1, p);
+ getAp(m_T0, -1, +1, r1);
+ getAp(m_T1, -1, -1, r2);
+ m_Side2.throughPoint(p, r1, r2);
+}
+
+void GLECurvedArrowHead::draw() {
+ char old_lstyle[15];
+ int old_join;
+ double x, y;
+ g_get_xy(&x, &y);
+ g_get_line_style(old_lstyle);
+ if (!(old_lstyle[0] == '1' && old_lstyle[1] == 0)) {
+ g_set_line_style("1");
+ }
+ g_get_line_join(&old_join);
+ if (old_join != 1) {
+ g_set_line_join(1);
+ }
+ g_set_path(true);
+ g_newpath();
+ m_Side1.draw();
+ m_Side2.draw();
+ if (getStyle() != GLE_ARRSTY_SIMPLE) {
+ g_closepath();
+ GLERC<GLEColor> cur_color(g_get_color());
+ GLERC<GLEColor> cur_full(g_get_fill());
+ if (getStyle() == GLE_ARRSTY_EMPTY) g_set_fill(GLE_COLOR_WHITE);
+ else g_set_fill(cur_color);
+ g_fill();
+ g_set_fill(cur_full);
+ }
+ if (!isSharp()) {
+ g_stroke();
+ }
+ g_set_path(false);
+ g_move(x, y);
+ if (old_join != 1) {
+ g_set_line_join(old_join);
+ }
+ if (!(old_lstyle[0] == '1' && old_lstyle[1] == 0)) {
+ g_set_line_style(old_lstyle);
+ }
+}
+
+double GLECurvedArrowHead::getArrowCurveDist() {
+ return m_ArrSize;
+}
+
+void GLECurvedArrowHead::setStartEnd(bool dir) {
+ setEnabled(true);
+ double dist = getArrowCurveDist();
+ if (dir) {
+ m_T0 = m_Curve->getT0();
+ m_T1 = m_Curve->distToParamValue(m_T0, dist);
+ m_TM = m_Curve->distToParamValue(m_T0, dist/2.0, (m_T0 + m_T1)/2.0);
+ } else {
+ m_T0 = m_Curve->getT1();
+ m_T1 = m_Curve->distToParamValue(m_T0, -dist);
+ m_TM = m_Curve->distToParamValue(m_T0, -dist/2.0, (m_T0 + m_T1)/2.0);
+ }
+}
+
+double GLECurvedArrowHead::getParamValueEnd() {
+ return (m_T1 + m_TM) / 2;
+}
+
+void GLECurvedArrowHead::drawDirection(bool dir) {
+ setStartEnd(dir);
+ computeArrowHead();
+ draw();
+}
+
+void GLECurvedArrowHead::computeAndDraw() {
+ if (isEnabled()) {
+ computeArrowHead();
+ draw();
+ }
+}
+
+int GLEBBoxToPixels(double dpi, double bbox) {
+ // this has been tested with bbox.gle in gle-testsuite/plain
+ return (int)floor((double)dpi/PS_POINTS_PER_INCH*bbox+1);
+}
+
+GLESaveRestore::GLESaveRestore() {
+ model = NULL;
+}
+
+GLESaveRestore::~GLESaveRestore() {
+ if (model != NULL) {
+ delete model;
+ }
+}
+
+void GLESaveRestore::save() {
+ if (model == NULL) model = new gmodel();
+ g_get_state(model);
+}
+
+void GLESaveRestore::restore() {
+ g_set_state(model);
+}
+
+int g_font_fallback(int font) {
+ GLECoreFont* coreFont = get_core_font_ensure_loaded(font);
+ if (coreFont->info.encoding <= 2) {
+ CmdLineObj* cmdLine = GLEGetInterfacePointer()->getCmdLine();
+ if (cmdLine->hasOption(GLE_OPT_CAIRO)) {
+ GLECore* core = g_get_core();
+ if (core->isShowNoteAboutFallback()) {
+ core->setShowNoteAboutFallback(false);
+ g_message(">> PostScript fonts not supported with '-cairo'; using 'texcmr' instead");
+ }
+ return 17;
+ }
+ }
+ return font;
+}
+
+std::vector<std::string> g_create_device_string() {
+ CmdLineObj* cmdLine = GLEGetInterfacePointer()->getCmdLine();
+ CmdLineArgSet* device = (CmdLineArgSet*)cmdLine->getOption(GLE_OPT_DEVICE)->getArg(0);
+ std::vector<std::string> result(device->getValues());
+ if (cmdLine->hasOption(GLE_OPT_LANDSCAPE)) {
+ result.push_back("LANDSCAPE");
+ }
+ if (cmdLine->hasOption(GLE_OPT_FULL_PAGE)) {
+ result.push_back("FULLPAGE");
+ }
+ if (cmdLine->hasOption(GLE_OPT_TEX) || cmdLine->hasOption(GLE_OPT_CREATE_INC)) {
+ result.push_back("TEX");
+ }
+ if (cmdLine->hasOption(GLE_OPT_NO_COLOR)) {
+ result.push_back("GRAYSCALE");
+ }
+ if (cmdLine->hasOption(GLE_OPT_TRANSPARENT)) {
+ result.push_back("TRANSPARENT");
+ }
+ if (cmdLine->hasOption(GLE_OPT_NO_LIGATURES)) {
+ result.push_back("NOLIGATURES");
+ }
+ if (cmdLine->hasOption(GLE_OPT_SAFEMODE)) {
+ result.push_back("SAFE");
+ }
+ return strs_to_uppercase(result);
+}
diff --git a/src/gle/core.h b/src/gle/core.h
new file mode 100644
index 0000000..9a72677
--- /dev/null
+++ b/src/gle/core.h
@@ -0,0 +1,458 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#ifndef INC_CORE_H
+#define INC_CORE_H
+
+#include "color.h"
+#include "gle-interface/gle-interface.h"
+#include "d_interface.h"
+
+#define GLE_PAPER_UNKNOWN 0
+#define GLE_PAPER_A0 1
+#define GLE_PAPER_A1 2
+#define GLE_PAPER_A2 3
+#define GLE_PAPER_A3 4
+#define GLE_PAPER_A4 5
+#define GLE_PAPER_LETTER 6
+
+#define PDF_IMG_COMPR_AUTO 0
+#define PDF_IMG_COMPR_ZIP 1
+#define PDF_IMG_COMPR_JPEG 2
+#define PDF_IMG_COMPR_PS 3
+
+#define GLE_COMPAT_35 0x030500
+#define GLE_COMPAT_MOST_RECENT 0x040200
+
+#define GLEC_MAX_INT 1
+#define GLEC_COMPATIBILITY 0
+
+#define GLEC_MAX_DOUBLE 6
+#define GLEC_TITLESCALE 0
+#define GLEC_ATITLESCALE 1
+#define GLEC_ALABELSCALE 2
+#define GLEC_TICKSSCALE 3
+#define GLEC_ATITLEDIST 4
+#define GLEC_ALABELDIST 5
+
+#define GLE_ARRSTY_SIMPLE 0
+#define GLE_ARRSTY_FILLED 1
+#define GLE_ARRSTY_EMPTY 2
+#define GLE_ARRSTY_OLD35 3
+#define GLE_ARRSTY_SUB 10
+
+#define GLE_ARRTIP_ROUND 0
+#define GLE_ARRTIP_SHARP 1
+
+class GLEBitmap;
+class GLEPcodeList;
+
+class GLEArrowProps {
+public:
+ int style;
+ int tip;
+ double size;
+ double angle;
+};
+
+struct gmodel {
+ double image[3][3];
+ double fontn,fontsz; /* up to here for font caching */
+ GLERC<GLEColor> color;
+ GLERC<GLEColor> fill;
+ double lwidth,lstyled,curx,cury;
+ double endx,endy;
+ double miterlimit;
+ int lcap,ljoin;
+ int just,xinline,npath; /* up to here for STATE */
+ bool inpath;
+ char lstyle [9];
+ /* 18*8, 6*int, 2*int */
+ double xmin,xmax,ymin,ymax; /* bounds in USER coordinates */
+ double startx,starty;
+ double closex,closey; /* for closepath */
+ double arrowsize, arrowangle;
+ double userwidth,userheight; /* The user req size */
+ double pagewidth,pageheight;
+ double topmargin, bottommargin;
+ double leftmargin, rightmargin;
+ int arrowstyle;
+ int arrowtip;
+ bool texlabels;
+ bool fullpage;
+ bool rotate;
+ bool landscape;
+ int papersize;
+ bool hasbox;
+ bool isopen;
+ int devtype;
+ GLEDevice* dev;
+ bool console_output;
+ bool needs_newline;
+ int pdfimgformat;
+ int intconst[GLEC_MAX_INT];
+ double floatconst[GLEC_MAX_DOUBLE];
+};
+
+class GLESaveRestore {
+protected:
+ gmodel* model;
+public:
+ GLESaveRestore();
+ ~GLESaveRestore();
+ void save();
+ void restore();
+};
+
+class GLEMeasureBox : public GLERectangle {
+public:
+ GLEMeasureBox();
+ ~GLEMeasureBox();
+ void measureStart();
+ void measureEnd();
+ void measureEndIgnore();
+};
+
+void g_init_arrow_head(GLECurvedArrowHead* head, bool startend);
+
+class GLEPolynomial {
+protected:
+ double* m_Coefs;
+ int m_Degree;
+public:
+ GLEPolynomial(double* coefs, int degree);
+ ~GLEPolynomial();
+ double evalPoly(double t);
+ double evalDPoly(double t);
+ double newtonRaphson(double t, double prec = 1e-9);
+ void horner(double v);
+ void print();
+ inline void setDegree(int deg) { m_Degree = deg; }
+ inline int degree() { return m_Degree; }
+ inline double a(int i) { return m_Coefs[i]; }
+ inline void set(int i, double v) { m_Coefs[i] = v; }
+};
+
+class GLECore {
+public:
+ GLECore();
+ ~GLECore();
+
+ void reset();
+ bool isComputingLength() const;
+ void setComputingLength(bool computingLength);
+ double getTotalLength() const;
+ void setTotalLength(double length);
+ void addToLength(double value);
+ bool isShowNoteAboutFallback() const;
+ void setShowNoteAboutFallback(bool value);
+
+private:
+ bool m_isComputingLength;
+ double m_totalLength;
+ bool m_showNoteAboutFallback;
+};
+
+class GLEWithoutUpdates {
+public:
+ GLEWithoutUpdates();
+ ~GLEWithoutUpdates();
+
+private:
+ GLECore* m_core;
+ bool m_isComputingLength;
+};
+
+unsigned int coreleft();
+unsigned int farcoreleft();
+
+#define GLE_FILL_METHOD_DEFAULT 0
+#define GLE_FILL_METHOD_GLE 1
+#define GLE_FILL_METHOD_POSTSCRIPT 2
+
+#define SIZEOFSTATE sizeof(gmodel)
+
+void g_init();
+void g_get_version(string* version);
+void g_get_build_date(string* date);
+string g_get_version();
+string g_get_version_nosnapshot();
+void g_open(GLEFileLocation* outputfile, const string& inputfile);
+void g_get_font(int *f);
+//void g_close(void);
+void g_defmarker(const char *mname, const char *font, int ccc, double dx, double dy, double sz, int autodx);
+void g_get_hei(double *h);
+//void g_gsave(void);
+void g_hint(char *s);
+void g_marker(int i, double sz);
+void g_marker2(int i, double sz, double dval) throw (ParserError);
+void g_set_hei(double h);
+bool gclip(double *x1,double *y1, double *x2, double *y2,double xmin, double ymin, double xmax, double ymax);
+void g_pscomment(char* ss);
+void g_psbbtweak(void);
+void g_message(const string& s);
+void g_message_first_newline(bool newline);
+bool g_has_console_output();
+void g_set_console_output(bool set);
+void g_get_usersize(double *x,double *y);
+void g_get_userbox_undev(GLERectangle* rect);
+GLECore* g_get_core();
+
+//
+// -- no need to ifdef these
+// they will simply print warning message if libraries are not linked
+//
+void g_bitmap(string& fname, double wx, double wy, int type) throw(ParserError);
+void g_bitmap_info(string& fname, int xvar, int yvar, int type) throw(ParserError);
+int g_bitmap_string_to_type(const std::string& stype);
+int g_bitmap_string_to_type(const char* stype);
+string g_bitmap_supported_types();
+
+void g_ellipse_stroke(double rx, double ry);
+void g_ellipse_fill(double rx, double ry);
+void g_elliptical_arc(double rx, double ry, double t1, double t2, double cx, double cy, int arrow);
+void g_elliptical_narc(double rx, double ry, double t1, double t2, double cx, double cy, int arrow);
+
+void g_arrowsize(GLEArrowProps* arrow);
+void g_arrowline(double x2, double y2, int flag, int can_fillpath) throw(ParserError);
+
+void g_arrowpoints(double cx,double cy,double dx,double dy, double *ax1,
+ double *ay1,double *ax2,double *ay2, double *nnx, double *nny);
+void g_psarrow(double x1, double y1, double x2, double y2, int flag);
+
+double g_arc_normalized_angle2(double a1, double a2);
+void g_arc(double r, double t1, double t2, double cx, double cy, int arrow);
+void g_narc(double r, double t1, double t2, double cx, double cy, int arrow);
+
+bool g_is_bbtweak();
+double g_get_angle_deg();
+void g_get_scale(double* sx, double* sy);
+double g_get_avg_scale();
+
+const char* g_device_to_ext(int device);
+GLEDevice* g_select_device(int device);
+GLEDevice* g_get_device_ptr();
+GLEDevice* g_set_dummy_device();
+void g_restore_device(GLEDevice* device);
+int g_get_device();
+bool g_is_dummy_device();
+void g_resetfont();
+
+void g_arrow(double dx, double dy, int can_fillpath) throw(ParserError);
+void g_arrowcurve(double x, double y, int arrow, double a1, double a2, double d1, double d2);
+bool g_has_size();
+void g_set_size(double width, double height, bool box);
+int g_papersize_type(const string& papersize);
+void g_set_pagesize(int type);
+void g_set_pagesize(double width, double height);
+void g_set_margins(double top, double bottom, double left, double right);
+void g_set_fullpage(bool fullpage);
+void g_set_rotate_fullpage(bool rotfp);
+bool g_is_rotate_fullpage();
+void g_on_open();
+bool g_is_fullpage();
+void g_set_landscape(bool landscape);
+bool g_is_landscape();
+void g_set_arrow_size(double size);
+void g_set_arrow_angle(double angle);
+void g_set_pdf_image_format(const char* format);
+int g_get_pdf_image_format();
+
+int g_get_compatibility();
+void g_set_compatibility(int compat);
+int g_set_compatibility(const string& compat) throw (ParserError);
+int g_parse_compatibility(const string& compat) throw (ParserError);
+void g_compatibility_settings();
+
+void g_set_iconst(int i, int value);
+void g_set_fconst(int i, double value);
+int g_get_iconst(int i);
+double g_get_fconst(int i);
+
+void g_update_bounds_box(GLERectangle* box);
+void g_get_bounds(GLERectangle* rect);
+void g_set_bounds(GLERectangle* rect);
+void g_update_bounds(GLERectangle* rect);
+void g_restore_bounds(double xmin, double xmax, double ymin, double ymax);
+void g_set_bounds(double x, double y, gmodel* model);
+void g_debug_bounds(const char* out);
+void g_check_bounds(const char* after);
+bool g_has_box(gmodel* model);
+void g_set_state(gmodel *s);
+void g_get_state(gmodel *s);
+void g_rset_pos(double x, double y);
+
+void g_undev(double ux, double uy, double *x, double *y, gmodel* model);
+void g_dev(GLEPoint* pt);
+void g_dev_rel(GLEPoint* pt);
+void g_dev(GLERectangle* rect);
+void g_undev(GLERectangle* rect);
+void g_undev(GLERectangle* rect, gmodel* g);
+void g_set_arrow_style(const char* shape) throw (ParserError);
+void g_set_arrow_tip(const char* tip) throw (ParserError);
+
+void g_bitmap(GLEBitmap*, double wx, double wy, int type) throw(ParserError);
+
+void g_set_tex_scale(const char* ss);
+void g_set_tex_labels(bool onoff);
+bool g_get_tex_labels();
+
+void g_restore_defaults();
+
+int g_arrow_style();
+int g_arrow_tip();
+
+GLEPoint g_get_xy();
+void g_get_xy(GLEPoint* pt);
+void g_move(const GLEPoint& pt);
+void g_clear_matrix();
+void g_set_color(const GLERC<GLEColor>& color);
+void g_set_fill(int fill);
+void g_set_fill(const GLERC<GLEColor>& fill);
+bool g_is_filled(void);
+void g_set_fill_pattern(const GLERC<GLEColor>& pattern);
+void g_set_partial_state(gmodel* s);
+
+unsigned char float_to_color_comp(double value);
+unsigned char float_to_color_comp_255(double value);
+
+int g_hash_string_to_color(const string& str, colortyp* c);
+int g_verbosity();
+
+int font_get_encoding(int ff);
+void d_devcmd(char *s);
+void g_arcto(dbl x1,dbl y1,dbl x2,dbl y2,dbl rrr);
+void g_beginclip(void);
+void g_bezier(dbl x1,dbl y1,dbl x2,dbl y2,dbl x3,dbl y3);
+void g_bitmap(char *bmap);
+void g_box_fill(GLERectangle* rect);
+void g_box_fill(dbl x1, dbl y1, dbl x2, dbl y2);
+void g_box_stroke(dbl x1, dbl y1, dbl x2, dbl y2, bool reverse = false);
+void g_box_stroke(GLERectangle* rect, bool reverse = false);
+void g_char(int font, int cc);
+void g_circle_fill(double zr);
+void g_circle_stroke(double zr);
+void g_clear(void);
+void g_clip(void);
+void g_close(void);
+void g_closepath(void);
+void g_curve(GLEPcodeList* pclist, int *pcode);
+void g_dbezier(dbl x1,dbl y1,dbl x2,dbl y2,dbl x3,dbl y3);
+void g_dev(double x, double y,double *xd,double *yd);
+void g_devcmd(const char *s);
+void g_dfont(const std::string& s);
+void g_dline(double x, double y);
+void g_dmove(double x, double y);
+void g_dojust(dbl *x1, dbl *y1, dbl *x2, dbl *y2, int jj);
+void g_dotjust(dbl *x1, dbl *y1, dbl l, dbl r, dbl u, dbl d, int jj);
+void g_endclip(void);
+void g_fill(void);
+void g_fill_ary(int nwk,double *wkx,double *wky);
+void g_flush(void);
+void g_get_bounds(dbl *x1,dbl *y1,dbl *x2,dbl *y2);
+GLERC<GLEColor> g_get_color();
+GLERC<GLEColor> g_get_fill_clear();
+GLERC<GLEColor> g_get_color_hex(int hexValue);
+void g_get_devsize(dbl *x,dbl *y);
+void g_get_end(dbl *x,dbl *y);
+GLERC<GLEColor> g_get_fill();
+void g_get_just(int *j);
+void g_get_line_cap(int *jj);
+void g_get_line_join(int *jj);
+void g_get_line_style(char *s);
+void g_get_line_styled(double *w);
+void g_get_line_width(double *w);
+void g_get_path(int *pathonoff);
+std::string g_get_type();
+void g_get_usersize(dbl *x,dbl *y);
+void g_get_pagesize(dbl *x,dbl *y,int *type);
+void g_get_pagesize(dbl *x,dbl *y);
+void g_get_xy(double *x,double *y);
+void g_grestore(void);
+void g_gsave(void);
+void g_init_bounds(void);
+void g_jtext(int just);
+void g_line(const GLEPoint& p);
+void g_line(double zx,double zy);
+void g_line_ary(int nwk,double *wkx,double *wky);
+void g_marker_def(char *name, char *subname);
+// void g_measure(const char *s, dbl *l, dbl *r, dbl *u, dbl *d);
+void g_measure(const string& s, dbl *l, dbl *r, dbl *u, dbl *d);
+void g_message(const char *s);
+bool g_reset_message();
+void g_move(double zx,double zy);
+void g_set_pos(double zx,double zy);
+void g_newpath(void);
+void g_postscript(char *ss,double w,double h) throw (ParserError);
+bool g_parse_ps_boundingbox(const string& line, int* bx1, int* by1, int* bx2, int* by2);
+void g_rdev(double x, double y,double *xd,double *yd);
+void g_reverse(void);
+void g_rline(double zx,double zy);
+void g_rmove(double zx,double zy);
+void g_rotate(double ar);
+void g_rundev(double x, double y,double *xd,double *yd);
+void g_scale(double sx,double sy);
+void g_update_bounds(double x,double y);
+void g_set_color(int l);
+void g_set_background(const GLERC<GLEColor>& color);
+void g_set_end(dbl x,dbl y);
+void g_set_hei(double h);
+void g_set_fill_method(const char* meth);
+void g_set_font(int j);
+void g_set_font_width(double v);
+void g_set_just(int j);
+void g_set_line_cap(int i);
+void g_set_line_join(int i);
+void g_set_line_miterlimit(double d);
+void g_set_line_style(const char *s);
+void g_set_line_styled(double x);
+void g_set_line_width(double w);
+void g_set_matrix(double newmat[3][3]);
+void g_set_path(int onoff);
+void g_set_xy(double x, double y);
+void g_stroke(void);
+void g_text(const string& s);
+void g_translate(double ztx,double zty);
+void g_undev(double ux,double uy, double *x,double *y);
+void my_char(int ff, int cc);
+int g_device_to_bitmap_type(int device);
+bool g_bitmap_supports_type(int type);
+int g_font_fallback(int font);
+std::vector<std::string> g_create_device_string();
+
+#endif
diff --git a/src/gle/curve.cpp b/src/gle/curve.cpp
new file mode 100644
index 0000000..1e3b508
--- /dev/null
+++ b/src/gle/curve.cpp
@@ -0,0 +1,101 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#include "all.h"
+#include "gprint.h"
+#include "core.h"
+#include "var.h"
+#include "keyword.h"
+#include "run.h"
+
+int ncvec=0;
+void cvec_list(GLEPcodeList* pclist, int *pcode);
+double cvecx[30],cvecy[30];
+double dcvecx[30],dcvecy[30];
+void rbezier(double x1, double y1, double x2, double y2, double x3, double y3);
+
+void g_curve(GLEPcodeList* pclist, int *pcode) {
+ double dx1,dy1;
+ ncvec = 0;
+ cvec_list(pclist, pcode);
+ dx1 = cvecx[1] - cvecx[0];
+ dy1 = cvecy[1] - cvecy[0];
+ dcvecx[0] = cvecx[ncvec] - cvecx[ncvec-1];
+ dcvecy[0] = cvecy[ncvec] - cvecy[ncvec-1];
+ for (int i = 0; i <= ncvec; i++) {
+ cvecx[i] = cvecx[i] - dx1;
+ cvecy[i] = cvecy[i] - dy1;
+ }
+ for (int i = 1; i < ncvec; i++) {
+ dcvecx[i] = (cvecx[i+1] - cvecx[i-1]) * .25;
+ dcvecy[i] = (cvecy[i+1] - cvecy[i-1]) * .25;
+ }
+ for (int i = 1; i < ncvec-1; i++) {
+ rbezier(dcvecx[i],
+ dcvecy[i],
+ dcvecx[i+1],
+ dcvecy[i+1],
+ cvecx[i+1],
+ cvecy[i+1]);
+ }
+}
+
+void rbezier(double x1, double y1, double x2, double y2, double x3, double y3) {
+ double cx,cy;
+ g_get_xy(&cx, &cy);
+ g_bezier(x1+cx, y1+cy, x3-x2, y3-y2, x3, y3);
+}
+
+void cvec_list(GLEPcodeList* pclist, int *pcode) {
+ int cp=0;
+ double cx,cy;
+ g_get_xy(&cx,&cy);
+ ncvec = 0;
+ cvecx[0] = cx;
+ cvecy[0] = cy;
+ GLERC<GLEArrayImpl> stk(new GLEArrayImpl());
+ while ( *(pcode + cp++)==111) {
+ if (ncvec>27) {gprint("Too many param in curve\n"); return; }
+ double x1 = evalDouble(stk.get(), pclist, pcode, &cp);
+ double y1 = evalDouble(stk.get(), pclist, pcode, &cp);
+ cvecx[++ncvec] = x1;
+ cvecx[ncvec] = cvecx[ncvec] + cvecx[ncvec-1];
+ cvecy[ncvec] = y1;
+ cvecy[ncvec] = cvecy[ncvec] + cvecy[ncvec-1];
+ }
+}
diff --git a/src/gle/cutils.cpp b/src/gle/cutils.cpp
new file mode 100644
index 0000000..dc3b2ee
--- /dev/null
+++ b/src/gle/cutils.cpp
@@ -0,0 +1,794 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <errno.h>
+#include <string.h>
+
+#ifdef HAVE_CONFIG_H
+ #include "../config.h"
+#else
+ #include "../config_noauto.h"
+#endif
+
+// For visual C++ -- should use numeric limits?
+#if defined(__WIN32__) && !defined(__NOCYGWIN__)
+#include<float.h>
+ #define isnan _isnan
+ #define isinf _isnan
+#endif
+
+#ifndef isnan
+#define isnan(x) \
+ (sizeof (x) == sizeof (long double) ? isnan_ld (x) \
+ : sizeof (x) == sizeof (double) ? isnan_d (x) \
+ : isnan_f (x))
+static inline int isnan_f (float x) { return x != x; }
+static inline int isnan_d (double x) { return x != x; }
+static inline int isnan_ld (long double x) { return x != x; }
+#endif
+
+#ifndef isinf
+#define isinf(x) \
+ (sizeof (x) == sizeof (long double) ? isinf_ld (x) \
+ : sizeof (x) == sizeof (double) ? isinf_d (x) \
+ : isinf_f (x))
+static inline int isinf_f (float x) { return isnan (x - x); }
+static inline int isinf_d (double x) { return isnan (x - x); }
+static inline int isinf_ld (long double x) { return isnan (x - x); }
+#endif
+
+int gle_isnan(double v) {
+ // Do not include <iostream> or <cmath> before gle_isnan
+ // otherwise gle_isnan wil break on Mac OS/X and OS/2
+ return isnan(v);
+}
+
+int gle_isinf(double v) {
+ // Do not include <iostream> or <cmath> before gle_isinf
+ // otherwise gle_isinf wil break on Mac OS/X and OS/2
+ return isinf(v);
+}
+
+#include <string>
+#include <vector>
+#include <sstream>
+#include <iostream>
+
+using namespace std;
+
+#include "cutils.h"
+#include "tokens/stokenizer.h"
+
+bool equals_rel(double v1, double v2) {
+ if (v1 != 0.0) {
+ return fabs(v1 - v2)/v1 < CUTILS_REL_PREC;
+ } else {
+ return fabs(v1 - v2) < CUTILS_REL_PREC;
+ }
+}
+
+bool equals_rel_fine(double v1, double v2) {
+ if (v1 != 0.0) {
+ return fabs(v1 - v2)/v1 < CUTILS_REL_PREC_FINE;
+ } else {
+ return fabs(v1 - v2) < CUTILS_REL_PREC_FINE;
+ }
+}
+
+char* gle_strupr(char *s) {
+ char *tmp = s;
+ while (*s != 0) {
+ *s = toupper(*s);
+ s++;
+ }
+ return tmp;
+}
+
+char* gle_strlwr(char *s) {
+ char *tmp = s;
+ while (*s != 0) {
+ *s = tolower(*s);
+ s++;
+ }
+ return tmp;
+}
+
+void gle_strlwr(string& s) {
+ string::size_type len = s.length();
+ for (string::size_type i = 0; i < len; i++) {
+ int ch = s[i];
+ if (ch >= 'A' && ch <= 'Z') {
+ ch += 'a' - 'A';
+ s[i] = ch;
+ }
+ }
+}
+
+bool gle_onlyspace(const string& s) {
+ string::size_type len = s.length();
+ for (string::size_type i = 0; i < len; i++) {
+ if (s[i] != ' ' && s[i] != '\t') return false;
+ }
+ return true;
+}
+
+bool gle_isnumber(const char *s) {
+ while (*s!='\0') {
+ if (isdigit(*s) || *s=='.' || toupper(*s)=='E' ) s++;
+ else return false;
+ }
+ return true;
+}
+
+bool gle_isalphanum(char ch) {
+ if (ch >= 'A' && ch <= 'Z') return true;
+ if (ch >= 'a' && ch <= 'z') return true;
+ if (ch >= '0' && ch <= '9') return true;
+ return false;
+}
+
+const char* str_find_char(const char* s, int ch1) {
+ while (*s != 0) {
+ if (*s == ch1) return s;
+ s++;
+ }
+ return s;
+}
+
+const char* str_skip_brackets(const char* s, int ch1, int ch2) {
+ int depth = 0;
+ while (*s != 0) {
+ if (*s == ch1) {
+ depth++;
+ } else if (*s == ch2) {
+ depth--;
+ if (depth <= 0) break;
+ }
+ s++;
+ }
+ return s;
+}
+
+int str_skip_brackets(const string& s, int pos, int ch1, int ch2) {
+ int depth = 0;
+ int len = s.length();
+ while (pos < len) {
+ if (s[pos] == ch1) {
+ depth++;
+ } else if (s[pos] == ch2) {
+ depth--;
+ if (depth <= 0) break;
+ }
+ pos++;
+ }
+ return pos;
+}
+
+bool str_i_equals(const char* s1, const char* s2) {
+ int i = 0;
+ while (s1[i] != 0 && s2[i] != 0) {
+ if (toupper(s1[i]) != toupper(s2[i])) return false;
+ i++;
+ }
+ return s1[i] == 0 && s2[i] == 0;
+}
+
+bool str_ni_equals(const char* s1, const char* s2, int max) {
+ int i = 0;
+ while (s1[i] != 0 && s2[i] != 0 && i < max) {
+ if (toupper(s1[i]) != toupper(s2[i])) return false;
+ i++;
+ }
+ if (i == max) return true;
+ return s1[i] == 0 && s2[i] == 0;
+}
+
+int str_i_cmp(const char* s1, const char* s2) {
+ while (true) {
+ int c1 = tolower((unsigned char)*(s1++));
+ int c2 = tolower((unsigned char)*(s2++));
+ if (c1 == 0 || c1 != c2) return c1 - c2;
+ }
+}
+
+bool str_i_less::operator()(const std::string& s1, const std::string& s2) const {
+ return str_i_cmp(s1.c_str(), s2.c_str()) < 0;
+}
+
+int str_i_str(const string& haystack, int from, const char* needle) {
+ int endIndex = haystack.length();
+ int patternLength = strlen(needle);
+ int endPattern = endIndex - patternLength + 1;
+ if (endPattern < 0) {
+ return -1;
+ }
+ if (patternLength <= 0) {
+ return 0;
+ }
+ char patternChar0 = toupper(needle[0]);
+ for (int ctrSrc = from; ctrSrc <= endPattern; ctrSrc++) {
+ if (toupper(haystack[ctrSrc]) != patternChar0) {
+ continue;
+ }
+ int ctrPat;
+ for (ctrPat = 1; (ctrPat < patternLength) && (toupper(haystack[ctrSrc + ctrPat]) == toupper(needle[ctrPat])); ctrPat++) {
+ ; // just loop
+ }
+ if (ctrPat == patternLength) {
+ return ctrSrc;
+ }
+ }
+ return -1;
+}
+
+int str_i_str(const string& haystack, const char* needle) {
+ return str_i_str(haystack, 0, needle);
+}
+
+char* str_i_str(const char* haystack, const char* needle) {
+ int endIndex = strlen(haystack);
+ int patternLength = strlen(needle);
+ int endPattern = endIndex - patternLength + 1;
+ if (endPattern < 0) {
+ return NULL;
+ }
+ if (patternLength <= 0) {
+ return (char*)haystack;
+ }
+ char patternChar0 = toupper(needle[0]);
+ for (int ctrSrc = 0; ctrSrc <= endPattern; ctrSrc++) {
+ if (toupper(haystack[ctrSrc]) != patternChar0) {
+ continue;
+ }
+ int ctrPat;
+ for (ctrPat = 1; (ctrPat < patternLength) && (toupper(haystack[ctrSrc + ctrPat]) == toupper(needle[ctrPat])); ctrPat++) {
+ ; // just loop
+ }
+ if (ctrPat == patternLength) {
+ return (char*)haystack+ctrSrc;
+ }
+ }
+ return NULL;
+}
+
+bool str_i_equals(const string& s1, const char* s2) {
+ int l1 = s1.length();
+ for (int i = 0; i < l1; i++) {
+ if (toupper(s1[i]) != toupper(s2[i])) return false;
+ }
+ return true;
+}
+
+bool str_i_equals(const string& s1, const string& s2) {
+ int l1 = s1.length();
+ int l2 = s2.length();
+ if (l1 != l2) return false;
+ for (int i = 0; i < l1; i++) {
+ if (toupper(s1[i]) != toupper(s2[i])) return false;
+ }
+ return true;
+}
+
+int str_starts_with_trim(const string& str, const char* test) {
+ int len = str.length();
+ int pos = 0;
+ while (pos < len && (str[pos] == ' ' || str[pos] == '\t')) {
+ pos++;
+ }
+ int idx = 0;
+ while (pos < len && toupper(test[idx]) == toupper(str[pos])) {
+ idx++;
+ pos++;
+ }
+ if (test[idx] == 0) return pos;
+ else return -1;
+}
+
+bool str_starts_with(const string& str, const char* find) {
+ int idx = 0;
+ int len = str.length();
+ while (idx < len && find[idx] == str[idx]) {
+ idx++;
+ }
+ return find[idx] == 0;
+}
+
+bool str_i_starts_with(const string& str, const char* find) {
+ int idx = 0;
+ int len = str.length();
+ while (idx < len && toupper(find[idx]) == toupper(str[idx])) {
+ idx++;
+ }
+ return find[idx] == 0;
+}
+
+bool str_i_ends_with(const string& str, const char* find) {
+ int f_len = strlen(find);
+ int s_len = str.length();
+ if (f_len > s_len) {
+ return false;
+ } else {
+ int pos = 0;
+ for (int i = s_len-f_len; i < s_len; i++) {
+ if (toupper(str[i]) != toupper(find[pos++])) {
+ return false;
+ }
+ }
+ return true;
+ }
+}
+
+void str_delete_start(string& str, char ch) {
+ if (str.length() > 0 && str[0] == ch) {
+ str.erase(0, 1);
+ }
+}
+
+void str_replace_start(string& str, const char* find, const char* repl) {
+ if (str_starts_with(str, find)) {
+ str.erase(0, strlen(find));
+ str.insert(0, repl);
+ }
+}
+
+int str_remove_all(char* str, char ch) {
+ int pos = 0;
+ int from = 0;
+ while (str[from] != 0) {
+ while (str[from] == ch) {
+ from++;
+ }
+ str[pos++] = str[from++];
+ }
+ str[pos] = 0;
+ return pos;
+}
+
+bool str_contains(const char* str, char ch) {
+ int i = 0;
+ while (str[i] != 0 && str[i] != ch) {
+ i++;
+ }
+ return str[i] == ch;
+}
+
+bool str_contains(const string& str, const char* elems) {
+ int len = str.length();
+ for (int i = 0; i < len; i++) {
+ if (str_contains(elems, str[i])) return true;
+ }
+ return false;
+}
+
+void str_prefix(int count, char ch, string* str) {
+ if (count > 0) {
+ stringstream prefix;
+ for (int i = 0; i < count; i++) {
+ prefix << ch;
+ }
+ prefix << (*str);
+ *str = prefix.str();
+ }
+}
+
+void str_to_uppercase(const string& input, string& output) {
+ output = input;
+ int len = input.length();
+ for (int i = 0; i < len; i++) {
+ output[i] = toupper(output[i]);
+ }
+}
+
+void str_to_uppercase(string& output) {
+ int len = output.length();
+ for (int i = 0; i < len; i++) {
+ output[i] = toupper(output[i]);
+ }
+}
+
+std::vector<std::string> strs_to_uppercase(const std::vector<std::string>& input) {
+ std::vector<std::string> result;
+ result.reserve(input.size());
+ for (std::vector<std::string>::size_type i(0); i != input.size(); ++i) {
+ std::string value(input[i]);
+ str_to_uppercase(value);
+ result.push_back(value);
+ }
+ return result;
+}
+
+std::string str_join(const std::vector<std::string>& input, const char* joinStr) {
+ std::ostringstream strm;
+ for (std::vector<std::string>::size_type i(0); i != input.size(); ++i) {
+ if (i != 0) {
+ strm << joinStr;
+ }
+ strm << input[i];
+ }
+ return strm.str();
+}
+
+
+void str_uppercase_initial_capital(string& str) {
+ if (str.length() >= 1) str[0] = toupper(str[0]);
+}
+
+void str_remove_quote(string& str) {
+ int len = str.length();
+ if (len >= 2) {
+ if ((str[0] == '\"' && str[len-1] == '\"') || (str[0] == '\'' && str[len-1] == '\'')) {
+ str.erase(len-1);
+ str.erase(0, 1);
+ }
+ }
+}
+
+void str_try_add_quote(string& str) {
+ if (str.find(' ') == string::npos) return;
+ str.insert(0, "\"");
+ str += "\"";
+}
+
+bool str_only_space(const string& str) {
+ unsigned int len = str.length();
+ for (unsigned int i = 0; i < len; i++) {
+ if (str[i] != ' ') return false;
+ }
+ return true;
+}
+
+void str_trim_right(string& str) {
+ int len = str.length();
+ if (len > 0) {
+ bool is_space;
+ int pos = len;
+ do {
+ pos--;
+ char ch = str.at(pos);
+ is_space = (ch == ' ' || ch == '\t' || ch == '\r' || ch == '\n');
+ } while (pos > 0 && is_space);
+ if (pos == 0 && is_space) {
+ str = "";
+ } else if (pos < len-1) {
+ str.erase(pos+1);
+ }
+ }
+}
+
+void str_trim_left(string& str) {
+ int len = str.length();
+ if (len > 0) {
+ bool is_space;
+ int pos = -1;
+ do {
+ pos++;
+ char ch = str.at(pos);
+ is_space = (ch == ' ' || ch == '\t' || ch == '\r' || ch == '\n');
+ } while (pos < len-1 && is_space);
+ if (pos >= len-1 && is_space) {
+ str = "";
+ } else if (pos > 0) {
+ str.erase(0,pos);
+ }
+ }
+}
+
+void str_trim_left(string& str, string& prefix) {
+ int len = str.length();
+ if (len > 0) {
+ char ch;
+ bool is_space;
+ int pos = -1;
+ do {
+ pos++;
+ ch = str.at(pos);
+ is_space = (ch == ' ' || ch == '\t' || ch == '\r' || ch == '\n');
+ } while (pos < len-1 && is_space);
+ if (pos >= len-1 && is_space) {
+ prefix = str;
+ str = "";
+ } else if (pos > 0) {
+ prefix = str.substr(0,pos);
+ str.erase(0,pos);
+ }
+ }
+}
+
+void str_trim_left_bom(string& str) {
+ int len = str.length();
+ if (len >= 3 && ((unsigned char)str[0]) == 0xEF &&
+ ((unsigned char)str[1]) == 0xBB && ((unsigned char)str[2]) == 0xBF) {
+ str.erase(0, 3);
+ }
+}
+
+void str_trim_both(string& str) {
+ str_trim_right(str);
+ str_trim_left(str);
+}
+
+void str_replace_all(char* str, const char* find, const char* repl) {
+ char* find_res = str_i_str((const char*)str, find);
+ int len_repl = strlen(repl);
+ int len_find = strlen(find);
+ while (find_res != NULL) {
+ int pos = (find_res - (char*)str);
+ int len = strlen((const char*)str);
+ for (int k = len; k > pos; k--) {
+ str[k+len_repl-len_find] = str[k];
+ }
+ strncpy((char*)str+pos, repl, len_repl);
+ find_res = str_i_str((const char*)str, find);
+ }
+}
+
+void str_replace_all(string& str, const char* find, const char* repl) {
+ int find_res = str_i_str(str, find);
+ int len_find = strlen(find);
+ int len_repl = strlen(repl);
+ while (find_res != -1) {
+ str.erase(find_res, len_find);
+ str.insert(find_res, repl);
+ find_res = str_i_str(str, find_res+len_repl, find);
+ }
+}
+
+void str_parse_get_next(const string& strg, const char* find, string& res) {
+ char_separator sep(" \n\r", "");
+ tokenizer<char_separator> tok(strg, sep);
+ while (tok.has_more()) {
+ string token = tok.next_token();
+ if (str_i_equals(token, find) && tok.has_more()) {
+ res = tok.next_token();
+ break;
+ }
+ }
+}
+
+void gle_int_to_string(int value, string* str) {
+ char str_value[80];
+ sprintf(str_value, "%d", value);
+ *str = str_value;
+}
+
+int gle_double_digits(double value, int prec) {
+ if (value == 0.0) {
+ return 0;
+ } else {
+ int digits = (int)floor(log10(value));
+ // Round value to desired precision, and check if overflows, i.e., > 10
+ value = floor(value / pow(10.0, digits-prec+1)+0.5+1e-6) / pow(10.0, prec-1);
+ return value >= 10.0 ? digits+1 : digits;
+ }
+}
+
+int gle_int_digits(int value) {
+ return (int)floor(log10((double)value));
+}
+
+void gle_int_to_string_bin(int value, string* binary) {
+ vector<unsigned char> values;
+ while (value > 0) {
+ values.push_back((unsigned char)(value % 2));
+ value /= 2;
+ }
+ stringstream out;
+ for (int i = values.size()-1; i >= 0; i--) {
+ out << (int)values[i];
+ }
+ *binary = out.str();
+}
+
+int lastchar(char *s, char c) {
+ while (*s != '\0') { s++; }
+ return *(--s) == c;
+}
+
+char *un_quote(char *cts) {
+ int i = strlen(cts);
+ if (*cts == '"') {
+ *(cts+i-1) = 0;
+ cts = cts + 1;
+ }
+ return cts;
+}
+
+int gle_pow_ii(int x, int n) {
+ int pow = 1;
+ if(n > 0) {
+ while (true) {
+ if ((n & 1) != 0) {
+ pow *= x;
+ }
+ if ((n >>= 1) != 0) {
+ x *= x;
+ } else {
+ break;
+ }
+ }
+ }
+ return pow;
+}
+
+int f_pow_ii(int* ap, int* bp) {
+ return gle_pow_ii(*ap, *bp);
+}
+
+double f_r_sign(double* a, double* b) {
+ double x = *a >= 0 ? *a : - *a;
+ return *b >= 0 ? x : -x;
+}
+
+int f_i_sign(int *a, int* b) {
+ int x = *a >= 0 ? *a : - *a;
+ return *b >= 0 ? x : -x;
+}
+
+int gle_round_int(double val) {
+ return (int)floor(val + 0.5);
+}
+
+int gle_make_zero_based(int val) {
+ if (val >= 1) {
+ return val - 1;
+ } else {
+ return val;
+ }
+}
+
+void str_get_system_error(ostream& error) {
+ int error_id = errno;
+ char* error_str = strerror(error_id);
+ if (error_str == NULL || error_str[0] == 0) {
+ error << "error #" << error_id;
+ } else {
+ error << error_str;
+ }
+}
+
+#if defined(__UNIX__)
+ string str_format(const char* format, ...) {
+#else
+ string str_format(va_list format, ...) {
+#endif
+ va_list ap;
+ va_start(ap, format);
+ string result;
+ str_format(&result, (const char*)format, ap);
+ va_end(ap);
+ return result;
+}
+
+void str_format(string* str, const char *format, va_list ap) {
+ /* this could be implemented with vsnprintf, but this does not seem to */
+ /* be compatible with many different OSes */
+ int pos = 0;
+ stringstream sstr;
+ while (format[pos] != 0) {
+ if (format[pos] == '%') {
+ if (format[pos+1] == '%') {
+ sstr << (char)'%';
+ pos++;
+ } else if (format[pos+1] == 'd') {
+ int val = va_arg(ap, int);
+ sstr << val;
+ pos++;
+ } else if (format[pos+1] == 's') {
+ char* val = va_arg(ap, char*);
+ sstr << val;
+ pos++;
+ } else {
+ sstr << (char)format[pos];
+ }
+ } else {
+ sstr << (char)format[pos];
+ }
+ pos++;
+ }
+ *str = sstr.str();
+}
+
+int gle_pass_hex(const char* str, int from, int digits, int* err) {
+ int value = 0;
+ for (int i = 0; i < digits; i++) {
+ value *= 16;
+ int digit = str[from + i];
+ if (digit >= '0' && digit <= '9') {
+ value += digit - '0';
+ } else if (digit >= 'a' && digit <= 'f') {
+ value += digit - 'a' + 10;
+ } else if (digit >= 'A' && digit <= 'F') {
+ value += digit - 'A' + 10;
+ } else {
+ *err = from + i;
+ }
+ }
+ return value;
+}
+
+void bool_vector_set_expand(vector<bool>* v, unsigned int i, bool value) {
+ while (v->size() <= i) {
+ v->push_back(false);
+ }
+ (*v)[i] = value;
+}
+
+bool bool_vector_is(vector<bool>* v, unsigned int i) {
+ if (i >= v->size()) return false;
+ else return (*v)[i];
+}
+
+void split_into_lines(const std::vector<unsigned char>* input, std::vector<std::string>* output) {
+ bool done = false;
+ unsigned int pos = 0;
+ while (!done) {
+ std::ostringstream crLine;
+ bool lineDone = false;
+ while (!lineDone) {
+ if (pos >= input->size()) {
+ done = true;
+ lineDone = true;
+ } else {
+ char ch = (char)input->at(pos++);
+ if (ch == '\n' || ch == '\r') {
+ if (pos < input->size() && input->at(pos) != ch && (input->at(pos) == '\n' || input->at(pos) == '\r')) {
+ pos++;
+ }
+ lineDone = true;
+ } else {
+ crLine << ch;
+ }
+ }
+ }
+ output->push_back(crLine.str());
+ }
+}
+
+void CUtilsAssertImpl(const char* expr, const char* file, int line, const char* function) {
+ cerr << "Internal error: '" << expr << "' in file '" << file << "' function: '" << function << "' line: " << line << endl;
+ exit(1);
+}
+
+double gle_limit_range(double value, double minValue, double maxValue)
+{
+ return std::min<double>(std::max<double>(value, minValue), maxValue);
+}
diff --git a/src/gle/cutils.h b/src/gle/cutils.h
new file mode 100644
index 0000000..f062072
--- /dev/null
+++ b/src/gle/cutils.h
@@ -0,0 +1,187 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#ifndef INCLUDE_CUTILS_H
+#define INCLUDE_CUTILS_H
+
+#include <stdarg.h>
+
+bool gle_onlyspace(const string& s);
+bool gle_isnumber(const char *s);
+
+bool gle_isalphanum(char ch);
+
+int gle_isnan(double v);
+int gle_isinf(double v);
+
+#define CUTILS_REL_PREC 1e-6
+#define CUTILS_REL_PREC_FINE 1e-13
+
+bool equals_rel(double actual, double value);
+bool equals_rel_fine(double actual, double value);
+
+const char* str_find_char(const char* s, int ch);
+
+const char* str_skip_brackets(const char* s, int ch1, int ch2);
+
+char* gle_strupr(char* s);
+char* gle_strlwr(char *s);
+void gle_strlwr(string& s);
+
+int str_skip_brackets(const string& s, int pos, int ch1, int ch2);
+
+// for compatibility between different compilers
+bool str_i_equals(const char* s1, const char* s2);
+bool str_ni_equals(const char* s1, const char* s2, int max);
+int str_i_cmp(const char* s1, const char* s2);
+
+struct str_i_less
+{
+ bool operator()(const std::string& s1, const std::string& s2) const;
+};
+
+char* str_i_str(const char* haystack, const char* needle);
+int str_i_str(const string& haystack, const char* needle);
+int str_i_str(const string& haystack, int from, const char* needle);
+
+bool str_i_equals(const string& s1, const string& s2);
+
+bool str_contains(const char* str, char ch);
+
+bool str_contains(const string& str, const char* elems);
+
+int str_remove_all(char* str, char ch);
+
+void str_prefix(int count, char ch, string* str);
+
+void str_to_uppercase(const string& input, string& output);
+
+void str_to_uppercase(string& output);
+
+std::vector<std::string> strs_to_uppercase(const std::vector<std::string>& input);
+
+std::string str_join(const std::vector<std::string>& input, const char* joinStr = ", ");
+
+void str_uppercase_initial_capital(string& str);
+
+bool str_only_space(const string& str);
+
+void str_trim_both(string& str);
+
+void str_trim_right(string& str);
+
+void str_trim_left(string& str);
+
+void str_trim_left(string& str, string& prefix);
+
+void str_trim_left_bom(string& str);
+
+int str_starts_with_trim(const string& str, const char* test);
+
+bool str_starts_with(const string& str, const char* find);
+
+bool str_i_starts_with(const string& str, const char* find);
+
+bool str_i_ends_with(const string& str, const char* find);
+
+void str_remove_quote(string& str);
+
+void str_try_add_quote(string& str);
+
+void str_parse_get_next(const string& strg, const char* find, string& res);
+
+void gle_int_to_string_bin(int value, string* binary);
+
+void gle_int_to_string(int value, string* str);
+
+int gle_double_digits(double value, int prec);
+
+int gle_int_digits(int value);
+
+char *un_quote(char *cts);
+
+int lastchar(char *s, char c);
+
+int gle_pow_ii(int x, int n);
+
+int f_pow_ii(int* ap, int* bp);
+
+double f_r_sign(double* a, double* b);
+
+int f_i_sign(int *a, int* b);
+
+void str_delete_start(string& str, char ch);
+
+void str_replace_start(string& str, const char* find, const char* repl);
+
+void str_replace_all(char* str, const char* find, const char* repl);
+void str_replace_all(string& str, const char* find, const char* repl);
+
+void str_get_system_error(ostream& error);
+
+int gle_round_int(double val);
+
+int gle_make_zero_based(int val);
+
+#if defined(__UNIX__)
+ string str_format(const char* arg_list, ...);
+#else
+ string str_format(va_list arg_list, ...);
+#endif
+
+void str_format(string* str, const char *format, va_list ap);
+
+int gle_pass_hex(const char* str, int from, int digits, int* err);
+
+void bool_vector_set_expand(vector<bool>* v, unsigned int i, bool value);
+
+bool bool_vector_is(vector<bool>* v, unsigned int i);
+
+void split_into_lines(const std::vector<unsigned char>* input, std::vector<std::string>* output);
+
+void CUtilsAssertImpl(const char* expr, const char* file, int line, const char* function);
+
+#define CUtilsAssertMessage(msg) \
+ CUtilsAssertImpl(msg, __FILE__, __LINE__, __FUNCTION__)
+
+#define CUtilsAssert(exp) \
+ if (!(exp)) CUtilsAssertImpl(#exp, __FILE__, __LINE__, __FUNCTION__)
+
+#endif
+
+double gle_limit_range(double value, double minValue, double maxValue);
diff --git a/src/gle/d_cairo.cpp b/src/gle/d_cairo.cpp
new file mode 100644
index 0000000..c32beec
--- /dev/null
+++ b/src/gle/d_cairo.cpp
@@ -0,0 +1,1108 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#include "all.h"
+#include "core.h"
+#include "file_io.h"
+#include "texinterface.h"
+#include "cutils.h"
+#include "gprint.h"
+#include "bitmap/img2ps.h"
+
+#ifdef HAVE_CAIRO
+
+#include <cairo-ps.h>
+#include <cairo-pdf.h>
+#include <cairo-svg.h>
+
+/************************************************************************************
+ * Fonts in Cairo:
+ *
+ ************************************************************************************/
+
+extern struct gmodel g;
+
+char *font_getname(int i);
+
+GLECairoDevice::GLECairoDevice(bool showerror):
+ m_ShowError(showerror),
+ m_width(0.0),
+ m_height(0.0),
+ m_surface(0),
+ m_cr(0),
+ m_FillMethod(GLE_FILL_METHOD_DEFAULT),
+ m_currentFill(g_get_fill_clear())
+{
+}
+
+GLECairoDevice::~GLECairoDevice() {
+ for (unsigned int i = 0; i < m_surfacesToDelete.size(); ++i) {
+ cairo_surface_destroy(m_surfacesToDelete[i]);
+ }
+}
+
+void GLECairoDevice::arc(dbl r,dbl t1,dbl t2,dbl cx,dbl cy) {
+ //double dx,dy;
+ double x,y;
+ g_get_xy(&x,&y);
+ //polar_xy(r,t1,&dx,&dy);
+ if (!g.inpath) {
+ if (!g.xinline) cairo_new_path(m_cr);
+ }
+ cairo_arc(m_cr, cx, cy, r, t1*GLE_PI/180.0, t2*GLE_PI/180.0);
+ g.xinline = true;
+ if (!g.inpath) g_move(x,y);
+}
+
+void GLECairoDevice::arcto(dbl x1,dbl y1,dbl x2,dbl y2,dbl rrr) {
+ if (g.xinline==false) move(g.curx,g.cury);
+ cairo_curve_to(m_cr, x1, y1, x2, y2, x2, y2);
+ g.xinline = true;
+}
+
+void GLECairoDevice::beginclip(void) {
+ cairo_save(m_cr);
+}
+
+void GLECairoDevice::bezier(dbl x1,dbl y1,dbl x2,dbl y2,dbl x3,dbl y3) {
+ double x=g.curx,y=g.cury;
+ if (g.inpath) {
+ if (g.xinline==false) move(g.curx,g.cury);
+ cairo_curve_to(m_cr, x1, y1, x2, y2, x3, y3);
+ } else {
+ g_flush();
+ if (!g.xinline) cairo_move_to(m_cr, x, y);
+ cairo_curve_to(m_cr, x1, y1, x2, y2, x3, y3);
+ }
+ g.xinline = true;
+}
+
+void GLECairoDevice::box_fill(dbl x1, dbl y1, dbl x2, dbl y2) {
+ if (g.inpath) {
+ xdbox(x1,y1,x2,y2);
+ } else {
+ g_flush();
+ cairo_new_path(m_cr);
+ GLERectangle rect(x1, y1, x2, y2);
+ xdbox(x1,y1,x2,y2);
+ ddfill(&rect);
+ cairo_new_path(m_cr);
+ }
+}
+
+void GLECairoDevice::box_stroke(dbl x1, dbl y1, dbl x2, dbl y2, bool reverse) {
+ if (g.inpath) {
+ if (reverse) {
+ cairo_move_to(m_cr, x1, y1);
+ cairo_line_to(m_cr, x1, y2);
+ cairo_line_to(m_cr, x2, y2);
+ cairo_line_to(m_cr, x2, y1);
+ cairo_close_path(m_cr);
+ } else {
+ xdbox(x1,y1,x2,y2);
+ }
+ } else {
+ g_flush();
+ cairo_new_path(m_cr);
+ xdbox(x1,y1,x2,y2);
+ cairo_stroke(m_cr);
+ //ps_nvec = 0;
+ }
+}
+
+void GLECairoDevice::dochar(int font, int cc) {
+ if (font_get_encoding(font) > 2) {
+ my_char(font, cc);
+ } else {
+ g_throw_parser_error("PostScript fonts not supported with '-cairo'");
+ }
+}
+
+void GLECairoDevice::resetfont() {
+}
+
+void GLECairoDevice::circle_fill(double zr) {
+ double x=g.curx,y=g.cury;
+ if (g.inpath) {
+ cairo_arc(m_cr, x, y, zr, 0, 2*GLE_PI);
+ } else {
+ g_flush();
+ cairo_new_path(m_cr);
+ cairo_arc(m_cr, x, y, zr, 0, 2*GLE_PI);
+ GLERectangle rect(x-zr, y-zr, x+zr, y+zr);
+ ddfill(&rect);
+ cairo_new_path(m_cr);
+ }
+}
+
+void GLECairoDevice::circle_stroke(double zr) {
+ double x,y;
+ g_get_xy(&x,&y);
+ if (g.inpath) {
+ cairo_arc(m_cr, x, y, zr, 0, 2*GLE_PI);
+ } else {
+ g_flush();
+ cairo_new_path(m_cr);
+ cairo_arc(m_cr, x, y, zr, 0, 2*GLE_PI);
+ cairo_close_path(m_cr);
+ cairo_stroke(m_cr);
+ }
+}
+
+void GLECairoDevice::clear(void) {
+}
+
+void GLECairoDevice::clip(void) {
+ cairo_clip(m_cr);
+}
+
+void GLECairoDevice::closedev(void) {
+ cairo_destroy(m_cr);
+ cairo_surface_destroy(m_surface);
+ if (g_verbosity() > 0) {
+ string mainname;
+ string extension(g_device_to_ext(getDeviceType()));
+ GetMainNameExt(m_OutputName.getName(), extension.c_str(), mainname);
+ cerr << "[" << mainname << "][" << extension << "]";
+ g_set_console_output(false);
+ }
+}
+
+void GLECairoDevice::closepath(void) {
+ cairo_close_path(m_cr);
+}
+
+void GLECairoDevice::dfont(char *c) {
+}
+
+void GLECairoDevice::ellipse_fill(double rx, double ry) {
+ double x=g.curx,y=g.cury;
+ if (g.inpath) {
+ cairo_save (m_cr);
+ cairo_translate (m_cr, x, y);
+ cairo_scale (m_cr, rx, ry);
+ cairo_arc (m_cr, 0, 0, 1, 0, 2*GLE_PI);
+ cairo_restore (m_cr);
+ } else {
+ g_flush();
+ cairo_new_path(m_cr);
+ cairo_save (m_cr);
+ cairo_translate (m_cr, x, y);
+ cairo_scale (m_cr, rx, ry);
+ cairo_arc (m_cr, 0, 0, 1, 0, 2*GLE_PI);
+ cairo_restore (m_cr);
+ GLERectangle rect(x-rx, y-ry, x+rx, y+ry);
+ ddfill(&rect);
+ cairo_new_path(m_cr);
+ }
+}
+
+void GLECairoDevice::ellipse_stroke(double rx, double ry) {
+ double x,y;
+ g_get_xy(&x,&y);
+ if (!g.inpath) {
+ if (!g.xinline) cairo_new_path(m_cr);
+ }
+ cairo_save (m_cr);
+ cairo_translate (m_cr, x, y);
+ cairo_scale (m_cr, rx, ry);
+ cairo_arc (m_cr, 0, 0, 1, 0, 2*GLE_PI);
+ cairo_restore (m_cr);
+ g.xinline = true;
+ if (!g.inpath) g_move(x,y);
+}
+
+void GLECairoDevice::elliptical_arc(double rx,double ry,double t1,double t2,double cx,double cy) {
+ double x,y;
+ g_get_xy(&x,&y);
+ if (!g.inpath) {
+ if (!g.xinline) cairo_new_path(m_cr);
+ }
+ cairo_save (m_cr);
+ cairo_translate (m_cr, cx, cy);
+ cairo_scale (m_cr, rx, ry);
+ cairo_arc (m_cr, 0, 0, 1, t1*GLE_PI/180.0, t2*GLE_PI/180.0);
+ cairo_restore (m_cr);
+ g.xinline = true;
+ if (!g.inpath) g_move(x,y);
+}
+
+void GLECairoDevice::elliptical_narc(double rx,double ry,double t1,double t2,double cx,double cy) {
+ double x,y;
+ g_get_xy(&x,&y);
+ if (!g.inpath) {
+ if (!g.xinline) cairo_new_path(m_cr);
+ }
+ cairo_save (m_cr);
+ cairo_translate (m_cr, cx, cy);
+ cairo_scale (m_cr, rx, ry);
+ cairo_arc_negative (m_cr, 0, 0, 1, t1*GLE_PI/180.0, t2*GLE_PI/180.0);
+ cairo_restore (m_cr);
+ g.xinline = true;
+ if (!g.inpath) g_move(x,y);
+}
+
+void GLECairoDevice::endclip(void) {
+ g_flush();
+ cairo_restore(m_cr);
+ gmodel* state = new gmodel();
+ g_get_state(state);
+ g_set_state(state);
+ delete state;
+}
+
+void GLECairoDevice::fill(void) {
+ //cairo_save(cr);
+ ddfill();
+ //cairo_restore(cr);
+}
+
+void GLECairoDevice::ddfill(GLERectangle* bounds) {
+ colortyp cur_fill;
+ cur_fill.l = m_currentFill->getHexValueGLE();
+ if (cur_fill.b[B_F] == 255) {
+ return; /* clear fill, do nothing */
+ } else if (cur_fill.b[B_F] == 2) {
+ shade(bounds);
+ return;
+ }
+ set_fill(); /*because color and fill are the same*/
+ //cairo_fill(cr);
+ cairo_fill_preserve(m_cr);
+ set_color();
+}
+
+void GLECairoDevice::shadePattern(void) {
+ colortyp cur_fill;
+ cur_fill.l = m_currentFill->getHexValueGLE();
+ int step1 = cur_fill.b[B_B];
+ int step2 = cur_fill.b[B_G];
+ int xstep = max(step1, step2);
+ int ystep = max(step1, step2);
+ cairo_save(m_cr);
+ cairo_matrix_t matrix;
+ cairo_get_matrix(m_cr, &matrix);
+ cairo_surface_t *isurface = cairo_surface_create_similar(m_surface, CAIRO_CONTENT_COLOR_ALPHA, xstep, ystep);
+ cairo_t *icr = cairo_create(isurface);
+ GLERC<GLEColor> background(get_fill_background(m_currentFill.get()));
+ if (!background->isTransparent()) {
+ if (background->getHexValueGLE() == (unsigned int)GLE_COLOR_WHITE) {
+ cairo_set_source_rgb(icr, 1.0, 1.0, 1.0);
+ } else {
+ cairo_set_source_rgb(icr, background->getRed(), background->getGreen(), background->getBlue());
+ }
+ cairo_rectangle(icr, -1, -1, (xstep+1), (ystep+1));
+ cairo_fill(icr);
+ }
+ GLERC<GLEColor> foreground(get_fill_foreground(m_currentFill.get()));
+ if (foreground->getHexValueGLE() == GLE_COLOR_BLACK) {
+ cairo_set_source_rgb(icr, 0, 0, 0);
+ } else {
+ cairo_set_source_rgb(icr, foreground->getRed(), foreground->getGreen(), foreground->getBlue());
+ }
+ cairo_set_line_width(icr, cur_fill.b[B_R]);
+ if (step1 > 0) {
+ cairo_move_to(icr, 0, 0);
+ cairo_line_to(icr, xstep, ystep);
+ cairo_stroke(icr);
+ if (step2 == 0) {
+ cairo_move_to(icr, xstep/2, -ystep/2);
+ cairo_line_to(icr, 3*xstep/2, ystep/2);
+ cairo_stroke(icr);
+ cairo_move_to(icr, -xstep/2, ystep/2);
+ cairo_line_to(icr, xstep/2, 3*ystep/2);
+ cairo_stroke(icr);
+ }
+ }
+ if (step2 > 0) {
+ cairo_move_to(icr, 0, ystep);
+ cairo_line_to(icr, xstep, 0);
+ cairo_stroke(icr);
+ if (step1 == 0) {
+ cairo_move_to(icr, -xstep/2, ystep/2);
+ cairo_line_to(icr, xstep/2, -ystep/2);
+ cairo_stroke(icr);
+ cairo_move_to(icr, xstep/2, 3*ystep/2);
+ cairo_line_to(icr, 3*xstep/2, ystep/2);
+ cairo_stroke(icr);
+ }
+ }
+ cairo_pattern_t *pattern = cairo_pattern_create_for_surface(isurface);
+ cairo_pattern_set_extend(pattern, CAIRO_EXTEND_REPEAT);
+ cairo_matrix_init_scale(&matrix, 160.0, 160.0);
+ cairo_pattern_set_matrix(pattern, &matrix);
+ cairo_set_source(m_cr, pattern);
+ cairo_fill(m_cr);
+ cairo_restore(m_cr);
+ cairo_pattern_destroy(pattern);
+ cairo_destroy(icr);
+ cairo_surface_destroy(isurface);
+}
+
+void GLECairoDevice::shadeGLE() {
+ colortyp cur_fill;
+ cur_fill.l = m_currentFill->getHexValueGLE();
+ double step1 = cur_fill.b[B_B]/160.0;
+ double step2 = cur_fill.b[B_G]/160.0;
+ if (step1 > 0) {
+ for (double x = -40.0; x < 40.0; x += step1) {
+ cairo_move_to(m_cr, x, 0.0);
+ cairo_line_to(m_cr, 40.0+x, 40);
+ cairo_stroke(m_cr);
+ }
+ }
+ if (step2 > 0) {
+ for (double x = 0.0; x < 80; x += step2) {
+ cairo_move_to(m_cr, x, 0.0);
+ cairo_line_to(m_cr, x-40.0, 40);
+ cairo_stroke(m_cr);
+ }
+ }
+}
+
+void GLECairoDevice::shadeBoundedIfThenElse1(GLERectangle* bounds, double p, double step1) {
+ // if x1+p*s > y1 then
+ if (bounds->getXMax()+p*step1 > bounds->getYMax()) {
+ // aline y1-p*s y1
+ cairo_line_to(m_cr, bounds->getYMax()-p*step1, bounds->getYMax());
+ } else {
+ // aline x1 x1+p*s
+ cairo_line_to(m_cr, bounds->getXMax(), bounds->getXMax()+p*step1);
+ }
+ cairo_stroke(m_cr);
+}
+
+void GLECairoDevice::shadeBoundedIfThenElse2(GLERectangle* bounds, double p, double step2) {
+ // if p*s-y1 > x0 then
+ if (p*step2-bounds->getYMax() > bounds->getXMin()) {
+ // aline p*s-y1 y1
+ cairo_line_to(m_cr, p*step2-bounds->getYMax(), bounds->getYMax());
+ } else {
+ // aline x0 p*s-x0
+ cairo_line_to(m_cr, bounds->getXMin(), p*step2-bounds->getXMin());
+ }
+ cairo_stroke(m_cr);
+}
+
+void GLECairoDevice::shadeBounded(GLERectangle* bounds) {
+ colortyp cur_fill;
+ cur_fill.l = m_currentFill->getHexValueGLE();
+ double step1 = cur_fill.b[B_B]/160.0;
+ double step2 = cur_fill.b[B_G]/160.0;
+ cairo_set_line_cap(m_cr, CAIRO_LINE_CAP_SQUARE);
+ if (step1 > 0) {
+ int p0 = (int)ceil((bounds->getYMax()-bounds->getXMin())/step1-1e-6);
+ if (bounds->getXMin() + p0*step1 > bounds->getYMax()) p0--;
+ int p1 = (int)floor((bounds->getYMin()-bounds->getXMin())/step1+1e-6);
+ if (bounds->getXMin() + p1*step1 < bounds->getYMin()) p1++;
+ int p2 = (int)floor((bounds->getYMin()-bounds->getXMax())/step1+1e-6);
+ if (bounds->getXMax() + p2*step1 < bounds->getYMin()) p2++;
+ for (int p = p0; p > p1; p--) {
+ // amove x0 x0+p*s
+ cairo_move_to(m_cr, bounds->getXMin(), bounds->getXMin()+p*step1);
+ shadeBoundedIfThenElse1(bounds, p, step1);
+ }
+ for (int p = p1; p >= p2; p--) {
+ // amove y0-p*s y0
+ cairo_move_to(m_cr, bounds->getYMin()-p*step1, bounds->getYMin());
+ shadeBoundedIfThenElse1(bounds, p, step1);
+ }
+ }
+ if (step2 > 0) {
+ int p0 = (int)ceil((bounds->getYMax()+bounds->getXMax())/step2-1e-6);
+ if (p0*step2 - bounds->getXMin() > bounds->getYMax()) p0--;
+ int p1 = (int)floor((bounds->getYMin()+bounds->getXMax())/step2+1e-6);
+ if (p1*step2 - bounds->getXMax() < bounds->getYMin()) p1++;
+ int p2 = (int)floor((bounds->getYMin()+bounds->getXMin())/step2+1e-6);
+ if (p2*step2 - bounds->getXMax() < bounds->getYMin()) p2++;
+ for (int p = p0; p > p1; p--) {
+ // amove x0 x0+p*s
+ cairo_move_to(m_cr, bounds->getXMax(), p*step2-bounds->getXMax());
+ shadeBoundedIfThenElse2(bounds, p, step2);
+ }
+ for (int p = p1; p >= p2; p--) {
+ // amove y0-p*s y0
+ cairo_move_to(m_cr, p*step2-bounds->getYMin(), bounds->getYMin());
+ shadeBoundedIfThenElse2(bounds, p, step2);
+ }
+ }
+}
+
+void GLECairoDevice::shade(GLERectangle* bounds) {
+ if (m_FillMethod == GLE_FILL_METHOD_GLE ||
+ (m_FillMethod == GLE_FILL_METHOD_DEFAULT && bounds != NULL)) {
+ cairo_save(m_cr);
+ GLERC<GLEColor> background(get_fill_background(m_currentFill.get()));
+ if (!background->isTransparent()) {
+ cairo_set_source_rgb(m_cr, background->getRed(), background->getGreen(), background->getBlue());
+ cairo_fill_preserve(m_cr);
+ }
+ // Implemented by using path as clip and then painting strokes over the clip
+ cairo_clip(m_cr);
+ cairo_new_path(m_cr);
+ GLERC<GLEColor> foreground(get_fill_foreground(m_currentFill.get()));
+ cairo_set_source_rgb(m_cr, foreground->getRed(), foreground->getGreen(), foreground->getBlue());
+ colortyp cur_fill;
+ cur_fill.l = m_currentFill->getHexValueGLE();
+ cairo_set_line_width(m_cr, (double)(cur_fill.b[B_R]/160.0));
+ if (m_FillMethod == GLE_FILL_METHOD_DEFAULT && bounds != NULL) {
+ shadeBounded(bounds);
+ } else {
+ shadeGLE();
+ }
+ cairo_restore(m_cr);
+ } else {
+ shadePattern();
+ }
+}
+
+void GLECairoDevice::fill_ary(int nwk,double *wkx,double *wky) {
+ cout << "fill_ary not yet implemented" << endl;
+}
+
+void GLECairoDevice::flush(void) {
+ if (g.inpath) return;
+ if (g.xinline) {
+ cairo_stroke(m_cr);
+ //ps_nvec = 0;
+ }
+}
+
+std::string GLECairoDevice::get_type() {
+ std::vector<std::string> temp(g_create_device_string());
+ temp.push_back("FILLPATH");
+ temp.push_back("CAIRO");
+ return str_join(temp);
+}
+
+void GLECairoDevice::line(double zx,double zy) {
+ if (g.xinline==false) {
+ move(g.curx,g.cury);
+ }
+ cairo_line_to(m_cr, zx, zy);
+}
+
+void GLECairoDevice::line_ary(int nwk,double *wkx,double *wky) {
+ cout << "line_ary not yet implemented" << endl;
+}
+
+void GLECairoDevice::message(char *s) {
+ printf("%s\n",s);
+}
+
+void GLECairoDevice::move(double zx,double zy) {
+ if (g.inpath) {
+ cairo_move_to(m_cr, zx, zy);
+ } else {
+ //ps_nvec++;
+ cairo_new_path(m_cr);
+ cairo_move_to(m_cr, zx, zy);
+ }
+}
+
+void GLECairoDevice::narc(dbl r,dbl t1,dbl t2,dbl cx,dbl cy) {
+ //double dx,dy;
+ double x,y;
+ g_get_xy(&x,&y);
+ //polar_xy(r,t1,&dx,&dy);
+ if (!g.inpath) {
+ if (!g.xinline) cairo_new_path(m_cr);
+ }
+ cairo_arc_negative(m_cr, cx, cy, r, t1*GLE_PI/180.0, t2*GLE_PI/180.0);
+ g.xinline = true;
+ if (!g.inpath) g_move(x,y);
+}
+
+void GLECairoDevice::newpath(void) {
+ cairo_new_path(m_cr);
+}
+
+void GLECairoDevice::opendev(double width, double height, GLEFileLocation* outputfile, const string& inputfile) throw(ParserError) {
+}
+
+void GLECairoDevice::pscomment(char* ss) {
+ cout << "pscomment not yet implemented" << endl;
+}
+
+void GLECairoDevice::reverse(void) /* reverse the order of stuff in the current path */ {
+ cout << "reverse not yet implemented" << endl;
+}
+
+void GLECairoDevice::set_color_impl(const GLERC<GLEColor>& color) {
+ if (color->hasAlpha()) {
+ cairo_set_source_rgba(m_cr, color->getRed(), color->getGreen(), color->getBlue(), color->getAlpha());
+ } else {
+ cairo_set_source_rgb(m_cr, color->getRed(), color->getGreen(), color->getBlue());
+ }
+}
+
+void GLECairoDevice::set_color() {
+ set_color_impl(m_currentColor);
+}
+
+void GLECairoDevice::set_color(const GLERC<GLEColor>& color) {
+ g_flush();
+ m_currentColor = color;
+ set_color();
+}
+
+void GLECairoDevice::set_fill(const GLERC<GLEColor>& fill) {
+ m_currentFill = fill;
+}
+
+void GLECairoDevice::set_fill_method(int m) {
+ m_FillMethod = m;
+}
+
+void GLECairoDevice::set_line_cap(int i) {
+ /* lcap, 0= butt, 1=round, 2=projecting square */
+ if (!g.inpath) g_flush();
+ cairo_set_line_cap(m_cr, (cairo_line_cap_t)i);
+}
+
+void GLECairoDevice::set_line_join(int i) {
+ /* 0=miter, 1=round, 2=bevel */
+ if (!g.inpath) g_flush();
+ cairo_set_line_join(m_cr, (cairo_line_join_t)i);
+}
+
+void GLECairoDevice::set_line_miterlimit(double d) {
+ if (!g.inpath) g_flush();
+ cairo_set_miter_limit(m_cr, d);
+}
+
+void GLECairoDevice::set_line_style(const char *s) {
+ /* should deal with [] for solid lines */
+ static const char *defline[] = {"","","12","41","14","92","1282",
+ "9229","4114","54","73","7337","6261","2514"};
+ if (!g.inpath) g_flush();
+ if (strlen(s) == 1) {
+ s = defline[*s-'0'];
+ }
+ int nb_dashes = strlen(s);
+ double *dashes = new double[nb_dashes];
+ for (int i = 0; i < nb_dashes; i++) {
+ dashes[i] = (s[i]-'0')*g.lstyled;
+ }
+ cairo_set_dash(m_cr, dashes, nb_dashes, 0);
+ delete[] dashes;
+}
+
+void GLECairoDevice::set_line_styled(double dd) {
+ // no need to implement: set_line_style gets this from context
+ // FIXME: rather: should call set_line_style again?
+}
+
+void GLECairoDevice::set_line_width(double w) {
+ if (w == 0) w = 0.02;
+ if (w < .0002) w = 0;
+ if (!g.inpath) g_flush();
+ cairo_set_line_width(m_cr, w);
+}
+
+void GLECairoDevice::set_matrix(double newmat[3][3]) {
+ cairo_matrix_t matrix;
+ matrix.xx = newmat[0][0];
+ matrix.xy = newmat[0][1];
+ matrix.yx = - newmat[1][0];
+ matrix.yy = - newmat[1][1];
+ matrix.x0 = newmat[0][2];
+ double offset = 0.0;
+ if (!g_is_fullpage()) {
+ offset = 2.0 * CM_PER_INCH / 72;
+ }
+ matrix.y0 = (m_height + offset) * 72 / CM_PER_INCH - newmat[1][2];
+ cairo_set_matrix(m_cr, &matrix);
+}
+
+void GLECairoDevice::set_path(int onoff) {
+ //cout << "set_path not yet implemented" << endl;
+}
+
+void GLECairoDevice::source(const char *s) {
+ //cout << "source not yet implemented" << endl;
+}
+
+void GLECairoDevice::stroke(void) {
+ cairo_stroke_preserve(m_cr);
+}
+
+void GLECairoDevice::set_fill(void) {
+ set_color_impl(m_currentFill);
+}
+
+void GLECairoDevice::xdbox(double x1, double y1, double x2, double y2) {
+ //cout << "xdbox" << endl;
+ //cairo_rectangle_t(cr, x1, y1, x2 - x1, y2 - y1);
+ cairo_move_to(m_cr, x1, y1);
+ cairo_line_to(m_cr, x2, y1);
+ cairo_line_to(m_cr, x2, y2);
+ cairo_line_to(m_cr, x1, y2);
+ cairo_close_path(m_cr);
+}
+
+void GLECairoDevice::devcmd(const char *s) {
+ cout << "devcmd not yet implemented" << endl;
+}
+
+FILE* GLECairoDevice::get_file_pointer(void) {
+ return NULL;
+}
+
+int GLECairoDevice::getDeviceType() {
+ return GLE_DEVICE_NONE;
+}
+
+void delete_gle_recorded_byte_stream(void* todelete) {
+ GLERecordedByteStream* stream = (GLERecordedByteStream*)todelete;
+ delete stream;
+}
+
+class GLECairoImageByteStream: public GLEByteStream {
+public:
+ GLECairoImageByteStream(cairo_surface_t *image) {
+ m_buffer = cairo_image_surface_get_data(image);
+ m_stride = cairo_image_surface_get_stride(image);
+ m_pos = 0;
+ m_scanLine = 0;
+ }
+
+ virtual int sendByte(GLEBYTE byte) {
+ m_buffer[m_pos++] = byte;
+ return GLE_IMAGE_ERROR_NONE;
+ }
+
+ virtual int endScanLine() {
+ m_scanLine++;
+ m_pos = m_scanLine * m_stride;
+ return GLE_IMAGE_ERROR_NONE;
+ }
+
+protected:
+ unsigned char* m_buffer;
+ int m_stride;
+ int m_pos;
+ int m_scanLine;
+};
+
+cairo_surface_t* GLECairoDevice::bitmapCreateSurface(GLEBitmap* bitmap) {
+ /* Set options */
+ bitmap->setCompress(0.0);
+ bitmap->setASCII85(1);
+ /* Convert bitmap to postscript */
+ bitmap->prepare(GLE_BITMAP_PREPARE_SCANLINE);
+ cairo_format_t imageFormat = CAIRO_FORMAT_RGB24;
+ if (bitmap->isAlpha()) {
+ imageFormat = CAIRO_FORMAT_ARGB32;
+ }
+ if (bitmap->isGrayScale()) {
+ imageFormat = CAIRO_FORMAT_A8;
+ if (bitmap->getBitsPerComponent() == 1) {
+ imageFormat = CAIRO_FORMAT_A1;
+ }
+ }
+ cairo_surface_t* image = cairo_image_surface_create(imageFormat, bitmap->getWidth(), bitmap->getHeight());
+ GLECairoImageByteStream stream(image);
+ GLEByteStream* toDecode = &stream;
+ GLERGBATo32BitByteStream rgbTo32Bit(toDecode, bitmap->isAlpha());
+ if (bitmap->isIndexed() || bitmap->getColorComponents() >= 3) {
+ toDecode = &rgbTo32Bit;
+ }
+ int extra = bitmap->getExtraComponents();
+ int color_alpha = bitmap->getColorComponents();
+ if (bitmap->isAlpha()) {
+ // Do not count alpha as extra component
+ extra--;
+ color_alpha++;
+ }
+ GLEComponentRemovalByteStream crem(toDecode, color_alpha, extra);
+ if (extra != 0) {
+ toDecode = &crem;
+ }
+ GLEPNegateByteStream negated(&stream);
+ if (bitmap->isGrayScale()) {
+ toDecode = &negated;
+ }
+ GLEIndexedToRGBByteStream indexedToRGB(toDecode, bitmap->getPalette());
+ if (bitmap->isIndexed()) {
+ toDecode = &indexedToRGB;
+ }
+ GLEBitsTo32BitByteStream combine(toDecode);
+ if (bitmap->isGrayScale() && bitmap->getBitsPerComponent() == 1) {
+ toDecode = &combine;
+ }
+ bitmap->decode(toDecode);
+ cairo_surface_mark_dirty(image);
+ if (bitmap->getEncoding() == GLE_BITMAP_JPEG) {
+ GLERecordedByteStream* stream = new GLERecordedByteStream();
+ bitmap->coded(stream);
+ cairo_status_t status = cairo_surface_set_mime_data(image,
+ CAIRO_MIME_TYPE_JPEG,
+ stream->getBytes(),
+ stream->getNbBytes(),
+ delete_gle_recorded_byte_stream,
+ (void*)stream);
+ CUtilsAssert(status == CAIRO_STATUS_SUCCESS);
+ }
+ return image;
+}
+
+void GLECairoDevice::bitmap(GLEBitmap* bitmap, GLEPoint* pos, GLEPoint* scale, int type) {
+ /* Store current box */
+ GLERectangle save_box;
+ g_get_bounds(&save_box);
+ /* Generate header in postrscript output */
+ g_gsave();
+ /* Get current position */
+ g_scale(scale->getX() / bitmap->getWidth(), scale->getY() / bitmap->getHeight());
+ g_translate(pos->getX(), pos->getY());
+ /* Flip image so that it is not upside down */
+ cairo_matrix_t mirror, current, result;
+ cairo_matrix_init(&mirror, 1, 0, 0, -1, 0, bitmap->getHeight());
+ cairo_get_matrix(m_cr, ¤t);
+ cairo_matrix_multiply(&result, &mirror, ¤t);
+ cairo_set_matrix(m_cr, &result);
+ /* Create image */
+ bool inCache = false;
+ cairo_surface_t* image = 0;
+ const std::string& name(bitmap->getFName());
+ if (name.empty()) {
+ image = bitmapCreateSurface(bitmap);
+ } else {
+ inCache = true;
+ image = (cairo_surface_t*)m_bitmapCache.try_get(name);
+ if (image == 0) {
+ image = bitmapCreateSurface(bitmap);
+ m_bitmapCache.add_item(name, image);
+ m_surfacesToDelete.push_back(image);
+ }
+ }
+ cairo_set_source_surface(m_cr, image, 0, 0);
+ cairo_paint(m_cr);
+ if (!inCache) {
+ cairo_surface_destroy(image);
+ }
+ /* Footer */
+ g_grestore();
+ g_set_bounds(&save_box);
+ bitmap->close();
+}
+
+void GLECairoDevice::getRecordedBytes(string* output) {
+ if (!m_recorded.empty()) {
+ *output = std::string(&m_recorded[0], m_recorded.size());
+ } else {
+ output->clear();
+ }
+}
+
+void GLECairoDevice::recordData(const unsigned char *data, unsigned int length) {
+ m_recorded.reserve(m_recorded.size() + length);
+ for (unsigned int i = 0; i < length; ++i) {
+ m_recorded.push_back((char)data[i]);
+ }
+}
+
+void GLECairoDevice::clearRecordedData() {
+ m_recorded.clear();
+}
+
+cairo_status_t gle_cairo_device_write(void* closure, const unsigned char *data, unsigned int length) {
+ GLECairoDevice* cairoDevice = (GLECairoDevice*)closure;
+ cairoDevice->recordData(data, length);
+ return CAIRO_STATUS_SUCCESS;
+}
+
+GLECairoDeviceSVG::GLECairoDeviceSVG(bool showerror) : GLECairoDevice(showerror) {
+}
+
+GLECairoDeviceSVG::~GLECairoDeviceSVG() {
+}
+
+void GLECairoDeviceSVG::opendev(double width, double height, GLEFileLocation* outputfile, const string& inputfile) throw(ParserError) {
+ m_width = width;
+ m_height = height;
+ m_OutputName.copy(outputfile);
+ m_OutputName.addExtension(g_device_to_ext(getDeviceType()));
+ m_surface = cairo_svg_surface_create(m_OutputName.getFullPath().c_str(), 72*width/CM_PER_INCH+2, 72*height/CM_PER_INCH+2);
+ cairo_surface_set_fallback_resolution(m_surface, m_resolution, m_resolution);
+ m_cr = cairo_create(m_surface);
+ computeBoundingBox(width, height);
+ g_scale(PS_POINTS_PER_INCH/CM_PER_INCH, PS_POINTS_PER_INCH/CM_PER_INCH);
+ if (!g_is_fullpage()) {
+ g_translate(1.0*CM_PER_INCH/72, 1.0*CM_PER_INCH/72);
+ }
+}
+
+int GLECairoDeviceSVG::getDeviceType() {
+ return GLE_DEVICE_CAIRO_SVG;
+}
+
+GLECairoDevicePDF::GLECairoDevicePDF(bool showerror) : GLECairoDevice(showerror) {
+}
+
+GLECairoDevicePDF::~GLECairoDevicePDF() {
+}
+
+void GLECairoDevicePDF::opendev(double width, double height, GLEFileLocation* outputfile, const string& inputfile) throw(ParserError) {
+ clearRecordedData();
+ m_width = width;
+ m_height = height;
+ m_OutputName.copy(outputfile);
+ m_OutputName.addExtension(g_device_to_ext(getDeviceType()));
+ if (isRecordingEnabled()) {
+ m_surface = cairo_pdf_surface_create_for_stream(gle_cairo_device_write, (void*)this, 72*width/CM_PER_INCH+2, 72*height/CM_PER_INCH+2);
+ } else {
+ m_surface = cairo_pdf_surface_create(m_OutputName.getFullPath().c_str(), 72*width/CM_PER_INCH+2, 72*height/CM_PER_INCH+2);
+ }
+ cairo_surface_set_fallback_resolution(m_surface, m_resolution, m_resolution);
+ m_cr = cairo_create(m_surface);
+ computeBoundingBox(width, height);
+ g_scale(PS_POINTS_PER_INCH/CM_PER_INCH, PS_POINTS_PER_INCH/CM_PER_INCH);
+ if (!g_is_fullpage()) {
+ g_translate(1.0*CM_PER_INCH/72, 1.0*CM_PER_INCH/72);
+ }
+}
+
+int GLECairoDevicePDF::getDeviceType() {
+ return GLE_DEVICE_CAIRO_PDF;
+}
+
+GLECairoDeviceEPS::GLECairoDeviceEPS(bool showerror) : GLECairoDevice(showerror) {
+}
+
+GLECairoDeviceEPS::~GLECairoDeviceEPS() {
+}
+
+void GLECairoDeviceEPS::opendev(double width, double height, GLEFileLocation* outputfile, const string& inputfile) throw(ParserError) {
+ clearRecordedData();
+ m_width = width;
+ m_height = height;
+ m_OutputName.copy(outputfile);
+ m_OutputName.addExtension(g_device_to_ext(getDeviceType()));
+ if (isRecordingEnabled()) {
+ m_surface = cairo_ps_surface_create_for_stream(gle_cairo_device_write, (void*)this, 72*width/CM_PER_INCH+2, 72*height/CM_PER_INCH+2);
+ } else {
+ m_surface = cairo_ps_surface_create(m_OutputName.getFullPath().c_str(), 72*width/CM_PER_INCH+2, 72*height/CM_PER_INCH+2);
+ }
+ cairo_surface_set_fallback_resolution(m_surface, m_resolution, m_resolution);
+ cairo_ps_surface_set_eps(m_surface, true);
+ int int_bb_x = 0, int_bb_y = 0;
+ computeBoundingBox(width, height, &int_bb_x, &int_bb_y);
+ std::ostringstream bbLoRes;
+ std::ostringstream bbHiRes;
+ bbLoRes << "%%BoundingBox: 0 0 " << int_bb_x << " " << int_bb_y;
+ bbHiRes << "%%HiResBoundingBox: 0 0 " << m_boundingBox.getX() << " " << m_boundingBox.getY();
+ cairo_ps_surface_dsc_comment(m_surface, bbLoRes.str().c_str());
+ cairo_ps_surface_dsc_comment(m_surface, bbHiRes.str().c_str());
+ m_cr = cairo_create(m_surface);
+ g_scale(PS_POINTS_PER_INCH/CM_PER_INCH, PS_POINTS_PER_INCH/CM_PER_INCH);
+ if (!g_is_fullpage()) {
+ g_translate(1.0*CM_PER_INCH/72, 1.0*CM_PER_INCH/72);
+ }
+}
+
+void GLECairoDeviceEPS::getRecordedBytes(string* output) {
+ // work-around for bug in Cairo 1.10.x
+ int int_bb_x = 0, int_bb_y = 0;
+ computeBoundingBox(m_width, m_height, &int_bb_x, &int_bb_y);
+ std::ostringstream bbLoRes;
+ std::ostringstream bbHiRes;
+ bbLoRes << "%%BoundingBox: 0 0 " << int_bb_x << " " << int_bb_y;
+ bbHiRes << "%%HiResBoundingBox: 0 0 " << m_boundingBox.getX() << " " << m_boundingBox.getY();
+ // do conversion
+ std::stringstream inp;
+ std::ostringstream outp;
+ inp.write(&m_recorded[0], m_recorded.size());
+ while (inp.good()) {
+ string line;
+ getline(inp, line);
+ if (str_starts_with(line, "%%BoundingBox:")) {
+ outp << bbLoRes.str() << std::endl;
+ } else if (str_starts_with(line, "%%HiResBoundingBox:")) {
+ outp << bbHiRes.str() << std::endl;
+ } else {
+ outp << line << std::endl;
+ }
+ }
+ *output = outp.str();
+}
+
+int GLECairoDeviceEPS::getDeviceType() {
+ return GLE_DEVICE_CAIRO_EPS;
+}
+
+#ifdef __WIN32__
+
+#include <cairo-win32.h>
+
+class GLECairoDeviceEMFWinInfo {
+public:
+ HDC hdc;
+ bool shouldClose;
+ GLECairoDeviceEMFWinInfo();
+ ~GLECairoDeviceEMFWinInfo();
+};
+
+GLECairoDeviceEMFWinInfo::GLECairoDeviceEMFWinInfo() :
+ shouldClose(false)
+{
+}
+
+GLECairoDeviceEMFWinInfo::~GLECairoDeviceEMFWinInfo()
+{
+ if (shouldClose) {
+ HENHMETAFILE meta = CloseEnhMetaFile(hdc);
+ DeleteEnhMetaFile(meta);
+ }
+}
+
+GLECairoDeviceEMF::GLECairoDeviceEMF(bool showerror) : GLECairoDevice(showerror) {
+ m_WinInfo = new GLECairoDeviceEMFWinInfo();
+ m_DPI = 1000;
+ m_CopyClipboard = false;
+}
+
+GLECairoDeviceEMF::~GLECairoDeviceEMF() {
+ delete m_WinInfo;
+}
+
+void GLECairoDeviceEMF::set_matrix(double newmat[3][3]) {
+ cairo_matrix_t matrix;
+ matrix.xx = newmat[0][0];
+ matrix.xy = newmat[0][1];
+ matrix.yx = - newmat[1][0];
+ matrix.yy = - newmat[1][1];
+ matrix.x0 = newmat[0][2];
+ double offset = 0.0;
+ if (!g_is_fullpage()) {
+ offset = 2.0 * CM_PER_INCH / 72;
+ }
+ matrix.y0 = (m_height + offset) * m_DPI/CM_PER_INCH - newmat[1][2];
+ cairo_set_matrix(m_cr, &matrix);
+}
+
+void GLECairoDeviceEMF::opendev(double width, double height, GLEFileLocation* outputfile, const string& inputfile) throw(ParserError) {
+ m_width = width;
+ m_height = height;
+ m_OutputName.copy(outputfile);
+ m_OutputName.addExtension("emf");
+ double myWidth = width + 2.0/PS_POINTS_PER_INCH*CM_PER_INCH;
+ double myHeight = height + 2.0/PS_POINTS_PER_INCH*CM_PER_INCH;
+ HDC hdcRef = GetDC(NULL);
+ int iWidthMM = GetDeviceCaps(hdcRef, HORZSIZE); // iWidthMM is the display width in millimeters.
+ int iHeightMM = GetDeviceCaps(hdcRef, VERTSIZE); // iHeightMM is the display height in millimeters.
+ int iWidthPels = GetDeviceCaps(hdcRef, HORZRES); // iWidthPels is the display width in pixels.
+ int iHeightPels = GetDeviceCaps(hdcRef, VERTRES); // iHeightPels is the display height in pixels.
+ RECT dim;
+ dim.left = 0;
+ dim.top = 0;
+ dim.right = (int)floor(1000.0 * myWidth + 0.5);
+ dim.bottom = (int)floor(1000.0 * myHeight + 0.5);
+ // cout << "dim.right = " << dim.right << endl;
+ // cout << "dim.bottom = " << dim.bottom << endl;
+ if (m_CopyClipboard) {
+ m_WinInfo->hdc = CreateEnhMetaFile(hdcRef, NULL, &dim, NULL);
+ } else {
+ m_WinInfo->hdc = CreateEnhMetaFile(hdcRef, m_OutputName.getFullPath().c_str(), &dim, NULL);
+ }
+ ReleaseDC(NULL, hdcRef);
+ if (m_WinInfo->hdc != NULL) {
+ m_WinInfo->shouldClose = true;
+ } else {
+ g_throw_parser_error("error creating EMF file: '", m_OutputName.getFullPath().c_str(), "'");
+ }
+ // cout << "Width = " << iWidthMM << " mm = " << iWidthPels << " pixels" << endl;
+ // cout << "Height = " << iHeightMM << " mm = " << iHeightPels << " pixels" << endl;
+ int viewportWidth = (int)floor(10.0 * myWidth * iWidthPels / iWidthMM + 0.5);
+ int viewportHeight = (int)floor(10.0 * myHeight * iHeightPels / iHeightMM + 0.5);
+ // cout << "Viewport width in pixels = " << viewportWidth << endl;
+ // cout << "Viewport height in pixels = " << viewportHeight << endl;
+ int windowWidth = (int)floor(myWidth * m_DPI / CM_PER_INCH + 0.5);
+ int windowHeight = (int)floor(myHeight * m_DPI / CM_PER_INCH + 0.5);
+ // cout << "Window width in pixels = " << windowWidth << endl;
+ // cout << "Window height in pixels = " << windowHeight << endl;
+ SetMapMode(m_WinInfo->hdc, MM_ANISOTROPIC);
+ SetWindowOrgEx(m_WinInfo->hdc, 0, 0, NULL);
+ SetWindowExtEx(m_WinInfo->hdc, windowWidth, windowHeight, NULL);
+ SetViewportExtEx(m_WinInfo->hdc, viewportWidth, viewportHeight, NULL);
+ m_surface = cairo_win32_printing_surface_create(m_WinInfo->hdc);
+ cairo_surface_set_fallback_resolution(m_surface, m_resolution, m_resolution);
+ m_cr = cairo_create(m_surface);
+ computeBoundingBox(width, height);
+ g_scale(m_DPI/CM_PER_INCH, m_DPI/CM_PER_INCH);
+ if (!g_is_fullpage()) {
+ g_translate(1.0*CM_PER_INCH/72, 1.0*CM_PER_INCH/72);
+ }
+}
+
+BOOL PutEnhMetafileOnClipboard(HWND hWnd, HENHMETAFILE hEMF) {
+ BOOL bResult = false;
+ HENHMETAFILE hEMF2 = CopyEnhMetaFile(hEMF, NULL);
+ if (hEMF2 != NULL) {
+ if (OpenClipboard(hWnd)) {
+ if (EmptyClipboard()) {
+ HANDLE hRes = (HENHMETAFILE)SetClipboardData(CF_ENHMETAFILE, hEMF2);
+ bResult = (hRes != NULL);
+ }
+ CloseClipboard();
+ }
+ }
+ return bResult;
+}
+
+void GLECairoDeviceEMF::closedev(void) {
+ GLECairoDevice::closedev();
+ HENHMETAFILE meta = CloseEnhMetaFile(m_WinInfo->hdc);
+ if (meta == NULL) {
+ return;
+ }
+ if (m_CopyClipboard) {
+ PutEnhMetafileOnClipboard(NULL, meta);
+ }
+ DeleteEnhMetaFile(meta);
+ m_WinInfo->shouldClose = false;
+}
+
+int GLECairoDeviceEMF::getDeviceType() {
+ return GLE_DEVICE_EMF;
+}
+
+#endif
+
+#endif
diff --git a/src/gle/d_dummy.cpp b/src/gle/d_dummy.cpp
new file mode 100644
index 0000000..c772105
--- /dev/null
+++ b/src/gle/d_dummy.cpp
@@ -0,0 +1,214 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+/*
+ * 2004 Jan Struyf
+ *
+ */
+
+#include "all.h"
+#include "core.h"
+#include "file_io.h"
+#include "texinterface.h"
+#include "cutils.h"
+#include "gprint.h"
+
+GLEDummyDevice::GLEDummyDevice(bool showerror) {
+ m_ShowError = showerror;
+}
+
+GLEDummyDevice::~GLEDummyDevice() {
+}
+
+void GLEDummyDevice::arc(dbl r,dbl t1,dbl t2,dbl cx,dbl cy) {
+}
+
+void GLEDummyDevice::arcto(dbl x1,dbl y1,dbl x2,dbl y2,dbl rrr) {
+}
+
+void GLEDummyDevice::beginclip(void) {
+}
+
+void GLEDummyDevice::bezier(dbl x1,dbl y1,dbl x2,dbl y2,dbl x3,dbl y3) {
+}
+
+void GLEDummyDevice::box_fill(dbl x1, dbl y1, dbl x2, dbl y2) {
+}
+
+void GLEDummyDevice::box_stroke(dbl x1, dbl y1, dbl x2, dbl y2, bool reverse) {
+}
+
+void GLEDummyDevice::dochar(int font, int cc) {
+}
+
+void GLEDummyDevice::resetfont() {
+}
+
+void GLEDummyDevice::circle_fill(double zr) {
+}
+
+void GLEDummyDevice::circle_stroke(double zr) {
+}
+
+void GLEDummyDevice::clear(void) {
+}
+
+void GLEDummyDevice::clip(void) {
+}
+
+void GLEDummyDevice::closedev(void) {
+}
+
+void GLEDummyDevice::closepath(void) {
+}
+
+void GLEDummyDevice::dfont(char *c) {
+}
+
+void GLEDummyDevice::ellipse_fill(double rx, double ry) {
+}
+
+void GLEDummyDevice::ellipse_stroke(double rx, double ry) {
+}
+
+void GLEDummyDevice::elliptical_arc(double rx,double ry,double t1,double t2,double cx,double cy) {
+}
+
+void GLEDummyDevice::elliptical_narc(double rx,double ry,double t1,double t2,double cx,double cy) {
+}
+
+void GLEDummyDevice::endclip(void) {
+}
+
+void GLEDummyDevice::fill(void) {
+}
+
+void GLEDummyDevice::fill_ary(int nwk,double *wkx,double *wky) {
+}
+
+void GLEDummyDevice::flush(void) {
+}
+
+std::string GLEDummyDevice::get_type() {
+ return "DUMMY";
+}
+
+void GLEDummyDevice::line(double zx,double zy) {
+}
+
+void GLEDummyDevice::line_ary(int nwk,double *wkx,double *wky) {
+}
+
+void GLEDummyDevice::message(char *s) {
+}
+
+void GLEDummyDevice::move(double zx,double zy) {
+}
+
+void GLEDummyDevice::narc(dbl r,dbl t1,dbl t2,dbl cx,dbl cy) {
+}
+
+void GLEDummyDevice::newpath(void) {
+}
+
+void GLEDummyDevice::opendev(double width, double height, GLEFileLocation* outputfile, const string& inputfile) throw(ParserError) {
+ g_scale(PS_POINTS_PER_INCH/CM_PER_INCH, PS_POINTS_PER_INCH/CM_PER_INCH);
+ g_translate(1.0*CM_PER_INCH/72, 1.0*CM_PER_INCH/72);
+}
+
+void GLEDummyDevice::pscomment(char* ss) {
+}
+
+void GLEDummyDevice::reverse(void) /* reverse the order of stuff in the current path */ {
+}
+
+void GLEDummyDevice::set_color(const GLERC<GLEColor>& color) {
+}
+
+void GLEDummyDevice::set_fill(const GLERC<GLEColor>& fill) {
+}
+
+void GLEDummyDevice::set_line_cap(int i) {
+}
+
+void GLEDummyDevice::set_line_join(int i) {
+}
+
+void GLEDummyDevice::set_line_miterlimit(double d) {
+}
+
+void GLEDummyDevice::set_line_style(const char *s) {
+}
+
+void GLEDummyDevice::set_line_styled(double dd) {
+}
+
+void GLEDummyDevice::set_line_width(double w) {
+}
+
+void GLEDummyDevice::set_matrix(double newmat[3][3]) {
+}
+
+void GLEDummyDevice::set_path(int onoff) {
+}
+
+void GLEDummyDevice::source(const char *s) {
+}
+
+void GLEDummyDevice::stroke(void) {
+}
+
+void GLEDummyDevice::set_color(void) {
+}
+
+void GLEDummyDevice::set_fill(void) {
+}
+
+void GLEDummyDevice::xdbox(double x1, double y1, double x2, double y2) {
+}
+
+void GLEDummyDevice::devcmd(const char *s) {
+}
+
+FILE* GLEDummyDevice::get_file_pointer(void) {
+ return NULL;
+}
+
+int GLEDummyDevice::getDeviceType() {
+ return GLE_DEVICE_DUMMY;
+}
diff --git a/src/gle/d_interface.h b/src/gle/d_interface.h
new file mode 100644
index 0000000..a7c5e3b
--- /dev/null
+++ b/src/gle/d_interface.h
@@ -0,0 +1,545 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#ifndef INCLUDE_D_INTERFACE
+#define INCLUDE_D_INTERFACE
+
+// all device files (d_*) should define these functions
+// core.cpp calls them
+
+class GLEBitmap;
+class GLEPoint;
+
+int setMaxPSVector(int newMax);
+
+class GLEDevice {
+protected:
+ bool m_recording;
+ GLEPoint m_boundingBox;
+ double m_resolution;
+public:
+ GLEDevice();
+ virtual ~GLEDevice();
+ virtual void arc(dbl r,dbl t1,dbl t2,dbl cx,dbl cy) = 0;
+ virtual void arcto(dbl x1,dbl y1,dbl x2,dbl y2,dbl rrr) = 0;
+ virtual void beginclip(void) = 0;
+ virtual void bezier(dbl x1,dbl y1,dbl x2,dbl y2,dbl x3,dbl y3) = 0;
+ virtual void box_fill(dbl x1, dbl y1, dbl x2, dbl y2) = 0;
+ virtual void box_stroke(dbl x1, dbl y1, dbl x2, dbl y2, bool reverse) = 0;
+ virtual void dochar(int font, int cc) = 0;
+ virtual void resetfont() = 0;
+ virtual void circle_fill(double zr) = 0;
+ virtual void circle_stroke(double zr) = 0;
+ virtual void clear(void) = 0;
+ virtual void clip(void) = 0;
+ virtual void closedev(void) = 0;
+ virtual void closepath(void) = 0;
+ virtual void dfont(char *c) = 0;
+ virtual void ellipse_fill(double rx, double ry) = 0;
+ virtual void ellipse_stroke(double rx, double ry) = 0;
+ virtual void elliptical_arc(double rx,double ry,double t1,double t2,double cx,double cy) = 0;
+ virtual void elliptical_narc(double rx,double ry,double t1,double t2,double cx,double cy) = 0;
+ virtual void endclip(void) = 0;
+ virtual void fill(void) = 0;
+ virtual void fill_ary(int nwk,double *wkx,double *wky) = 0;
+ virtual void flush(void) = 0;
+ // virtual void get_line_cap(int *i) = 0;
+ virtual std::string get_type() = 0;
+ virtual void line(double zx,double zy) = 0;
+ virtual void line_ary(int nwk,double *wkx,double *wky) = 0;
+ virtual void message(char *s) = 0;
+ virtual void move(double zx,double zy) = 0;
+ virtual void narc(dbl r,dbl t1,dbl t2,dbl cx,dbl cy) = 0;
+ virtual void newpath(void) = 0;
+ virtual void opendev(double width, double height, GLEFileLocation* outputfile, const string& inputfile) throw(ParserError) = 0;
+ virtual void pscomment(char* ss) = 0;
+ virtual void reverse(void) /* reverse the order of stuff in the current path */ = 0;
+ virtual void set_color(const GLERC<GLEColor>& color) = 0;
+ virtual void set_fill(const GLERC<GLEColor>& fill) = 0;
+ virtual void set_line_cap(int i) = 0;
+ virtual void set_line_join(int i) = 0;
+ virtual void set_line_miterlimit(double d) = 0;
+ virtual void set_line_style(const char *s) = 0;
+ virtual void set_line_styled(double dd) = 0;
+ virtual void set_line_width(double w) = 0;
+ virtual void set_matrix(double newmat[3][3]) = 0;
+ virtual void set_path(int onoff) = 0;
+ virtual void source(const char *s) = 0;
+ virtual void stroke(void) = 0;
+ virtual void set_color(void) = 0;
+ virtual void set_fill(void) = 0;
+ virtual void set_fill_method(int m);
+ virtual void xdbox(double x1, double y1, double x2, double y2) = 0;
+ virtual void devcmd(const char *s) = 0;
+ virtual FILE* get_file_pointer(void) = 0;
+ virtual int getDeviceType() = 0;
+ virtual void bitmap(GLEBitmap* bitmap, GLEPoint* pos, GLEPoint* scale, int type);
+ virtual void getRecordedBytes(string* output);
+ void computeBoundingBox(double width, double height, int* int_bb_x, int* int_bb_y);
+ void computeBoundingBox(double width, double height);
+ inline GLEPoint* getBoundingBox() { return &m_boundingBox; }
+ void setResolution(double resolution) { m_resolution = resolution; }
+public:
+ inline void setRecordingEnabled(bool rec) { m_recording = rec; }
+ inline bool isRecordingEnabled() { return m_recording; }
+};
+
+class PSGLEDevice : public GLEDevice {
+protected:
+ GLEFileLocation m_OutputName;
+ ostringstream* m_OutputBuffer;
+ ofstream* m_OutputFile;
+ ostream* m_Out;
+ bool m_IsEps;
+ bool m_IsPageSize;
+ int ps_nvec;
+ int first_ellipse;
+ vector<string> comments;
+ FILE *psfile;
+ int i,l,j;
+ int m_FillMethod;
+ GLERC<GLEColor> m_currentColor;
+ GLERC<GLEColor> m_currentFill;
+public:
+ PSGLEDevice(bool eps);
+ virtual ~PSGLEDevice();
+ virtual void arc(dbl r,dbl t1,dbl t2,dbl cx,dbl cy);
+ virtual void arcto(dbl x1,dbl y1,dbl x2,dbl y2,dbl rrr);
+ virtual void beginclip(void) ;
+ virtual void bezier(dbl x1,dbl y1,dbl x2,dbl y2,dbl x3,dbl y3);
+ virtual void box_fill(dbl x1, dbl y1, dbl x2, dbl y2);
+ virtual void box_stroke(dbl x1, dbl y1, dbl x2, dbl y2, bool reverse);
+ virtual void dochar(int font, int cc);
+ virtual void resetfont();
+ virtual void circle_fill(double zr);
+ virtual void circle_stroke(double zr);
+ virtual void clear(void);
+ virtual void clip(void);
+ virtual void closedev(void);
+ virtual void closepath(void);
+ virtual void dfont(char *c);
+ virtual void ellipse_fill(double rx, double ry);
+ virtual void ellipse_stroke(double rx, double ry);
+ virtual void elliptical_arc(double rx,double ry,double t1,double t2,double cx,double cy);
+ virtual void elliptical_narc(double rx,double ry,double t1,double t2,double cx,double cy);
+ virtual void endclip(void) ;
+ virtual void fill(void);
+ virtual void fill_ary(int nwk,double *wkx,double *wky);
+ virtual void flush(void);
+ // virtual void get_line_cap(int *i);
+ virtual std::string get_type();
+ virtual void line(double zx,double zy);
+ virtual void line_ary(int nwk,double *wkx,double *wky);
+ virtual void message(char *s);
+ virtual void move(double zx,double zy);
+ virtual void narc(dbl r,dbl t1,dbl t2,dbl cx,dbl cy);
+ virtual void newpath(void);
+ virtual void opendev(double width, double height, GLEFileLocation* outputfile, const string& inputfile) throw(ParserError);
+ virtual void pscomment(char* ss);
+ virtual void reverse(void) /* reverse the order of stuff in the current path */;
+ virtual void set_color(const GLERC<GLEColor>& color);
+ virtual void set_fill(const GLERC<GLEColor>& fill);
+ virtual void set_line_cap(int i);
+ virtual void set_line_join(int i);
+ virtual void set_line_miterlimit(double d);
+ virtual void set_line_style(const char *s);
+ virtual void set_line_styled(double dd);
+ virtual void set_line_width(double w);
+ virtual void set_matrix(double newmat[3][3]);
+ virtual void set_path(int onoff);
+ virtual void source(const char *s);
+ virtual void stroke(void);
+ virtual void set_color(void);
+ virtual void set_fill(void);
+ virtual void set_fill_method(int m);
+ virtual void xdbox(double x1, double y1, double x2, double y2);
+ virtual void devcmd(const char *s);
+ virtual FILE* get_file_pointer(void);
+ virtual int getDeviceType();
+ virtual void bitmap(GLEBitmap* bitmap, GLEPoint* pos, GLEPoint* scale, int type);
+ virtual void getRecordedBytes(string* output);
+protected:
+ void set_color_impl(const GLERC<GLEColor>& color);
+ void ddfill(GLERectangle* bounds = NULL);
+ void shadeGLE();
+ void shadeBoundedIfThenElse1(GLERectangle* bounds, double step1);
+ void shadeBoundedIfThenElse2(GLERectangle* bounds, double step2);
+ void shadeBounded(GLERectangle* bounds);
+ void shadePostScript();
+ void shade(GLERectangle* bounds);
+ void read_psfont(void);
+ void displayGeometry(double width, double height, int *gsPixelWidth, int *gsPixelHeight, int *gsPixelRes);
+ void psFileASCIILine(const char* prefix, int cnt, char ch, bool nl);
+public:
+ inline bool isEps() { return m_IsEps; }
+ inline bool isOutputPageSize() { return m_IsPageSize; }
+ inline void setOutputPageSize(bool out) { m_IsPageSize = out; }
+ inline ostream& out() { return *m_Out; }
+ void startRecording();
+ void initialPS();
+};
+
+#ifdef HAVE_CAIRO
+
+#include <cairo.h>
+
+class GLECairoDevice : public GLEDevice {
+protected:
+ GLEFileLocation m_OutputName;
+ bool m_ShowError;
+ double m_width;
+ double m_height;
+ cairo_surface_t *m_surface;
+ cairo_t *m_cr;
+ int m_FillMethod;
+ GLERC<GLEColor> m_currentColor;
+ GLERC<GLEColor> m_currentFill;
+ std::vector<char> m_recorded;
+ StringVoidPtrHash m_bitmapCache;
+ std::vector<cairo_surface_t*> m_surfacesToDelete;
+public:
+ GLECairoDevice(bool showerror);
+ virtual ~GLECairoDevice();
+ virtual void arc(dbl r,dbl t1,dbl t2,dbl cx,dbl cy);
+ virtual void arcto(dbl x1,dbl y1,dbl x2,dbl y2,dbl rrr);
+ virtual void beginclip(void) ;
+ virtual void bezier(dbl x1,dbl y1,dbl x2,dbl y2,dbl x3,dbl y3);
+ virtual void box_fill(dbl x1, dbl y1, dbl x2, dbl y2);
+ virtual void box_stroke(dbl x1, dbl y1, dbl x2, dbl y2, bool reverse);
+ virtual void dochar(int font, int cc);
+ virtual void resetfont();
+ virtual void circle_fill(double zr);
+ virtual void circle_stroke(double zr);
+ virtual void clear(void);
+ virtual void clip(void);
+ virtual void closedev(void);
+ virtual void closepath(void);
+ virtual void dfont(char *c);
+ virtual void ellipse_fill(double rx, double ry);
+ virtual void ellipse_stroke(double rx, double ry);
+ virtual void elliptical_arc(double rx,double ry,double t1,double t2,double cx,double cy);
+ virtual void elliptical_narc(double rx,double ry,double t1,double t2,double cx,double cy);
+ virtual void endclip(void) ;
+ virtual void fill(void);
+ virtual void fill_ary(int nwk,double *wkx,double *wky);
+ virtual void flush(void);
+ virtual std::string get_type();
+ virtual void line(double zx,double zy);
+ virtual void line_ary(int nwk,double *wkx,double *wky);
+ virtual void message(char *s);
+ virtual void move(double zx,double zy);
+ virtual void narc(dbl r,dbl t1,dbl t2,dbl cx,dbl cy);
+ virtual void newpath(void);
+ virtual void opendev(double width, double height, GLEFileLocation* outputfile, const string& inputfile) throw(ParserError);
+ virtual void pscomment(char* ss);
+ virtual void reverse(void) /* reverse the order of stuff in the current path */;
+ virtual void set_color(const GLERC<GLEColor>& color);
+ virtual void set_fill(const GLERC<GLEColor>& fill);
+ virtual void set_fill_method(int m);
+ virtual void set_line_cap(int i);
+ virtual void set_line_join(int i);
+ virtual void set_line_miterlimit(double d);
+ virtual void set_line_style(const char *s);
+ virtual void set_line_styled(double dd);
+ virtual void set_line_width(double w);
+ virtual void set_matrix(double newmat[3][3]);
+ virtual void set_path(int onoff);
+ virtual void source(const char *s);
+ virtual void stroke(void);
+ virtual void set_color(void);
+ virtual void set_fill(void);
+ virtual void xdbox(double x1, double y1, double x2, double y2);
+ virtual void devcmd(const char *s);
+ virtual FILE* get_file_pointer(void);
+ virtual int getDeviceType();
+ virtual void bitmap(GLEBitmap* bitmap, GLEPoint* pos, GLEPoint* scale, int type);
+ virtual void getRecordedBytes(string* output);
+ void recordData(const unsigned char *data, unsigned int length);
+protected:
+ void set_color_impl(const GLERC<GLEColor>& color);
+ void ddfill(GLERectangle* bounds = NULL);
+ void shadePattern();
+ void shadeGLE();
+ void shadeBoundedIfThenElse1(GLERectangle* bounds, double p, double step1);
+ void shadeBoundedIfThenElse2(GLERectangle* bounds, double p, double step2);
+ void shadeBounded(GLERectangle* bounds);
+ void shade(GLERectangle* bounds);
+ void clearRecordedData();
+private:
+ cairo_surface_t* bitmapCreateSurface(GLEBitmap* bitmap);
+};
+
+class GLECairoDevicePDF : public GLECairoDevice {
+public:
+ GLECairoDevicePDF(bool showerror);
+ virtual ~GLECairoDevicePDF();
+ virtual void opendev(double width, double height, GLEFileLocation* outputfile, const string& inputfile) throw(ParserError);
+ virtual int getDeviceType();
+};
+
+class GLECairoDeviceEPS : public GLECairoDevice {
+public:
+ GLECairoDeviceEPS(bool showerror);
+ virtual ~GLECairoDeviceEPS();
+ virtual void opendev(double width, double height, GLEFileLocation* outputfile, const string& inputfile) throw(ParserError);
+ virtual int getDeviceType();
+ virtual void getRecordedBytes(string* output);
+};
+
+class GLECairoDeviceSVG : public GLECairoDevice {
+public:
+ GLECairoDeviceSVG(bool showerror);
+ virtual ~GLECairoDeviceSVG();
+ virtual void opendev(double width, double height, GLEFileLocation* outputfile, const string& inputfile) throw(ParserError);
+ virtual int getDeviceType();
+};
+
+#ifdef __WIN32__
+
+class GLECairoDeviceEMFWinInfo;
+
+class GLECairoDeviceEMF : public GLECairoDevice {
+protected:
+ GLECairoDeviceEMFWinInfo* m_WinInfo;
+ double m_DPI;
+ bool m_CopyClipboard;
+public:
+ GLECairoDeviceEMF(bool showerror);
+ virtual ~GLECairoDeviceEMF();
+ virtual void set_matrix(double newmat[3][3]);
+ virtual void opendev(double width, double height, GLEFileLocation* outputfile, const string& inputfile) throw(ParserError);
+ virtual int getDeviceType();
+ virtual void closedev(void);
+ inline void setDPI(double d) { m_DPI = d; }
+ inline void setCopyClipboard(bool c) { m_CopyClipboard = true; }
+};
+
+#endif
+
+#endif
+
+class GLEDummyDevice : public GLEDevice {
+protected:
+ bool m_ShowError;
+public:
+ GLEDummyDevice(bool showerror);
+ virtual ~GLEDummyDevice();
+ virtual void arc(dbl r,dbl t1,dbl t2,dbl cx,dbl cy);
+ virtual void arcto(dbl x1,dbl y1,dbl x2,dbl y2,dbl rrr);
+ virtual void beginclip(void) ;
+ virtual void bezier(dbl x1,dbl y1,dbl x2,dbl y2,dbl x3,dbl y3);
+ virtual void box_fill(dbl x1, dbl y1, dbl x2, dbl y2);
+ virtual void box_stroke(dbl x1, dbl y1, dbl x2, dbl y2, bool reverse);
+ virtual void dochar(int font, int cc);
+ virtual void resetfont();
+ virtual void circle_fill(double zr);
+ virtual void circle_stroke(double zr);
+ virtual void clear(void);
+ virtual void clip(void);
+ virtual void closedev(void);
+ virtual void closepath(void);
+ virtual void dfont(char *c);
+ virtual void ellipse_fill(double rx, double ry);
+ virtual void ellipse_stroke(double rx, double ry);
+ virtual void elliptical_arc(double rx,double ry,double t1,double t2,double cx,double cy);
+ virtual void elliptical_narc(double rx,double ry,double t1,double t2,double cx,double cy);
+ virtual void endclip(void) ;
+ virtual void fill(void);
+ virtual void fill_ary(int nwk,double *wkx,double *wky);
+ virtual void flush(void);
+ virtual std::string get_type();
+ virtual void line(double zx,double zy);
+ virtual void line_ary(int nwk,double *wkx,double *wky);
+ virtual void message(char *s);
+ virtual void move(double zx,double zy);
+ virtual void narc(dbl r,dbl t1,dbl t2,dbl cx,dbl cy);
+ virtual void newpath(void);
+ virtual void opendev(double width, double height, GLEFileLocation* outputfile, const string& inputfile) throw(ParserError);
+ virtual void pscomment(char* ss);
+ virtual void reverse(void) /* reverse the order of stuff in the current path */;
+ virtual void set_color(const GLERC<GLEColor>& color);
+ virtual void set_fill(const GLERC<GLEColor>& fill);
+ virtual void set_line_cap(int i);
+ virtual void set_line_join(int i);
+ virtual void set_line_miterlimit(double d);
+ virtual void set_line_style(const char *s);
+ virtual void set_line_styled(double dd);
+ virtual void set_line_width(double w);
+ virtual void set_matrix(double newmat[3][3]);
+ virtual void set_path(int onoff);
+ virtual void source(const char *s);
+ virtual void stroke(void);
+ virtual void set_color(void);
+ virtual void set_fill(void);
+ virtual void xdbox(double x1, double y1, double x2, double y2);
+ virtual void devcmd(const char *s);
+ virtual FILE* get_file_pointer(void);
+ virtual int getDeviceType();
+};
+
+#ifdef HAVE_X11
+
+#ifdef VMS
+ #include <decw$include/Xlib.h>
+ #include <decw$include/Xutil.h>
+#else
+ #ifdef aix
+ #define NeedFunctionPrototypes 0
+ #endif
+ #include <X11/Xlib.h>
+ #include <X11/Xutil.h>
+#endif
+
+#define NUM_COLTABLE_ENTRIES 34
+#define X11_PATH_LENGTH 500
+
+struct X11Pnt {int type,x,y;} ;
+
+class X11GLEDevice : public GLEDevice {
+protected:
+ int color_table[NUM_COLTABLE_ENTRIES];
+ int maxxsize;
+ int maxysize;
+ int window1W;
+ int window1H;
+ Display *dpy;
+ Window window1;
+ GC gc,gcf;
+ Screen *screen;
+ int doesbackingstore;
+ double savexsize,saveysize;
+ int gle_nspeed; /* text mode = slow and fast */
+ int i,l,j,ix,iy;
+ double f;
+ double xsizecm,ysizecm;
+ double d_scale, d_xscale, d_yscale;
+ int d_graphmode;
+ int d_fillstyle,d_fillcolor;
+ int d_lstyle,d_lwidth;
+ int d_maxy;
+ int safnt;
+ struct X11Pnt pnts[X11_PATH_LENGTH];
+ int npnts;
+ int startx,starty;
+public:
+ X11GLEDevice();
+ virtual ~X11GLEDevice();
+ virtual void arc(dbl r,dbl t1,dbl t2,dbl cx,dbl cy);
+ virtual void arcto(dbl x1,dbl y1,dbl x2,dbl y2,dbl rrr);
+ virtual void beginclip(void) ;
+ virtual void bezier(dbl x1,dbl y1,dbl x2,dbl y2,dbl x3,dbl y3);
+ virtual void box_fill(dbl x1, dbl y1, dbl x2, dbl y2);
+ virtual void box_stroke(dbl x1, dbl y1, dbl x2, dbl y2, bool reverse);
+ virtual void dochar(int font, int cc);
+ virtual void resetfont();
+ virtual void circle_fill(double zr);
+ virtual void circle_stroke(double zr);
+ virtual void clear(void);
+ virtual void clip(void);
+ virtual void closedev(void);
+ virtual void closepath(void);
+ virtual void dfont(char *c);
+ virtual void ellipse_fill(double rx, double ry);
+ virtual void ellipse_stroke(double rx, double ry);
+ virtual void elliptical_arc(double rx,double ry,double t1,double t2,double cx,double cy);
+ virtual void elliptical_narc(double rx,double ry,double t1,double t2,double cx,double cy);
+ virtual void endclip(void) ;
+ virtual void fill(void);
+ virtual void fill_ary(int nwk,double *wkx,double *wky);
+ virtual void flush(void);
+ // virtual void get_line_cap(int *i);
+ virtual std::string get_type();
+ virtual void line(double zx,double zy);
+ virtual void line_ary(int nwk,double *wkx,double *wky);
+ virtual void message(char *s);
+ virtual void move(double zx,double zy);
+ virtual void narc(dbl r,dbl t1,dbl t2,dbl cx,dbl cy);
+ virtual void newpath(void);
+ virtual void opendev(double width, double height, GLEFileLocation* outputfile, const string& inputfile) throw(ParserError);
+ virtual void pscomment(char* ss);
+ virtual void reverse(void) /* reverse the order of stuff in the current path */;
+ virtual void set_color(const GLERC<GLEColor>& color);
+ virtual void set_fill(const GLERC<GLEColor>& fill);
+ virtual void set_line_cap(int i);
+ virtual void set_line_join(int i);
+ virtual void set_line_miterlimit(double d);
+ virtual void set_line_style(const char *s);
+ virtual void set_line_styled(double dd);
+ virtual void set_line_width(double w);
+ virtual void set_matrix(double newmat[3][3]);
+ virtual void set_path(int onoff);
+ virtual void source(const char *s);
+ virtual void stroke(void);
+ virtual void set_color(void);
+ virtual void set_fill(void);
+ virtual void xdbox(double x1, double y1, double x2, double y2);
+ virtual void devcmd(const char *s);
+ virtual FILE* get_file_pointer(void);
+ virtual int getDeviceType();
+protected:
+ void setcolor(int);
+ void setfillcolor(int);
+ void setfillstyle(int);
+ double getmaxx();
+ double getmaxy();
+ int getmaxcolor();
+ void doInitialize();
+ int doDefineColor(int n);
+ void doCreateWindows();
+ void doCreateGraphicsContext();
+ void doLoadFont();
+ void doExpose();
+ void doWMHints();
+ void doMapWindows();
+ void openDisplay();
+ void path_move(int x, int y);
+ void path_line(int x, int y);
+ void path_close(void);
+ void path_fill(void);
+ void path_newpath(void);
+ void path_stroke(void);
+ int set_expose(void);
+ int wait_expose(void);
+ void dxy(double x, double y, int *dx, int *dy);
+ void rxy(double x, double y, int *dx, int *dy);
+ void dxy_short(double x, double y, short *dx, short *dy);
+ void rxy_short(double x, double y, short *dx, short *dy);
+};
+
+#endif
+#endif
diff --git a/src/gle/d_ps.cpp b/src/gle/d_ps.cpp
new file mode 100644
index 0000000..99655f7
--- /dev/null
+++ b/src/gle/d_ps.cpp
@@ -0,0 +1,1119 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+/*--------------------------------------------------------------*/
+/* Post Script Driver, for GLE */
+/*--------------------------------------------------------------*/
+
+#include "all.h"
+#include "file_io.h"
+#include "bitmap/img2ps.h"
+#include "core.h"
+#include "d_interface.h"
+#include "gprint.h"
+#include "cutils.h"
+#include "op_def.h"
+#include "cmdline.h"
+#include "config.h"
+#include "mem_limits.h"
+#ifdef __WIN32__
+#include <time.h>
+#endif
+
+//
+// -- constants
+//
+#define dbg if ((gle_debug & 64)>0)
+
+//
+// elipse function only for PS
+//
+static char ellipse_fcn[] = "\
+/ellipsedict 8 dict def\n ellipsedict /mtrx matrix put \n\
+/ellipse\n\
+ { ellipsedict begin\n\
+ /endangle exch def\n\
+ /startangle exch def\n\
+ /yrad exch def\n\
+ /xrad exch def\n\
+ /y exch def\n\
+ /x exch def\n\
+ \n\
+ /savematrix mtrx currentmatrix def\n\
+ x y translate\n\
+ xrad yrad scale\n\
+ 0 0 1 startangle endangle arc\n\
+ savematrix setmatrix\n\
+ end\n\
+ } def\n\
+/ellipsen\n\
+ { ellipsedict begin\n\
+ /endangle exch def\n\
+ /startangle exch def\n\
+ /yrad exch def\n\
+ /xrad exch def\n\
+ /y exch def\n\
+ /x exch def\n\
+ \n\
+ /savematrix mtrx currentmatrix def\n\
+ x y translate\n\
+ xrad yrad scale\n\
+ 0 0 1 startangle endangle arcn\n\
+ savematrix setmatrix\n\
+ end\n\
+ } def\n\
+";
+//
+// -- global variables can we get rid of these?
+//
+extern bool control_d;
+extern struct gmodel g;
+extern bool GS_PREVIEW;
+extern int gle_debug;
+extern ConfigCollection g_Config;
+
+int MAX_VECTOR = MAXIMUM_PS_VECTOR; /* Cant send POSTSCRIPT too complex a path */
+
+int setMaxPSVector(int newMax) {
+ int oldValue = MAX_VECTOR;
+ MAX_VECTOR = newMax;
+ return oldValue;
+}
+
+//
+// -- function prototypes
+//
+char *font_getname(int i);
+void AddExtension(string& fname, const string& ext);
+
+void d_tidyup() {
+}
+
+PSGLEDevice::PSGLEDevice(bool eps) : GLEDevice() {
+ m_IsEps = eps;
+ m_IsPageSize = false;
+ first_ellipse = 1;
+ ps_nvec = 0;
+ m_Out = NULL;
+ m_OutputFile = NULL;
+ m_OutputBuffer = NULL;
+ m_FillMethod = GLE_FILL_METHOD_DEFAULT;
+ m_currentFill = g_get_fill_clear();
+}
+
+PSGLEDevice::~PSGLEDevice() {
+}
+
+void PSGLEDevice::dfont(char *c) {
+ /* only used for the DFONT driver which builds fonts */
+}
+
+void PSGLEDevice::message(char *s) {
+ printf("%s\n",s);
+}
+
+void PSGLEDevice::devcmd(const char *s) {
+ out() << s;
+}
+
+void PSGLEDevice::source(const char *s) {
+ dbg out() << "%% SOURCE, " << s;
+}
+
+std::string PSGLEDevice::get_type() {
+ std::vector<std::string> temp(g_create_device_string());
+ temp.push_back("FILLPATH");
+ temp.push_back("POSTSCRIPT");
+ return str_join(temp);
+}
+
+void PSGLEDevice::set_path(int onoff) {
+}
+
+void PSGLEDevice::newpath() {
+ out() << " newpath ";
+ ps_nvec = 0;
+}
+
+void PSGLEDevice::pscomment(char* ss) {
+ comments.push_back(ss);
+}
+
+FILE* PSGLEDevice::get_file_pointer(void) {
+ return psfile;
+}
+
+void PSGLEDevice::opendev(double width, double height, GLEFileLocation* outputfile, const string& inputfile) throw(ParserError) {
+ first_ellipse = 1;
+ m_OutputName.copy(outputfile);
+ m_OutputName.addExtension(g_device_to_ext(getDeviceType()));
+#ifdef ENABLE_GS_PREVIEW
+ setRecordingEnabled(true);
+#endif
+ if (isRecordingEnabled()) {
+ startRecording();
+ } else {
+ m_Out = m_OutputFile = new ofstream(m_OutputName.getFullPath().c_str(), ios::out | ios::binary);
+ if (!m_OutputFile->is_open()) {
+ g_throw_parser_error("failed to create PostScript file '", m_OutputName.getFullPath().c_str(), "'");
+ }
+ }
+ if (!isEps()) {
+ if (control_d) out() << (char)4 << endl;
+ out() << "%!PS-Adobe-2.0" << endl;
+ } else {
+ out() << "%!PS-Adobe-2.0 EPSF-2.0" << endl;
+ }
+ time_t t;
+ t = time(0);
+ // Make sure to use proper Adobe DSC comments
+ // Windows Explorer can show these in the document properties of a PDF created by GLE
+ string vers_nosnap = g_get_version_nosnapshot();
+ out() << "%%Creator: GLE " << vers_nosnap << " <www.gle-graphics.org>" << endl;
+ out() << "%%CreationDate: " << ctime(&t);
+ out() << "%%Title: " << inputfile << endl;
+ for (vector<string>::size_type i = 0; i < comments.size(); i++) {
+ out() << "%% " << comments[i] << endl;
+ }
+ comments.clear();
+ int int_bb_x = 0, int_bb_y = 0;
+ computeBoundingBox(width, height, &int_bb_x, &int_bb_y);
+ out() << "%%BoundingBox: 0 0 " << int_bb_x << " " << int_bb_y << endl;
+ out() << "%%HiResBoundingBox: 0 0 " << m_boundingBox.getX() << " " << m_boundingBox.getY() << endl;
+ out() << "%%EndComments" << endl;
+ out() << "%%EndProlog" << endl;
+ if (isOutputPageSize()) {
+ // Currently not used
+ out() << "<< /PageSize [" << int_bb_x << " " << int_bb_y << "] >> setpagedevice" << endl;
+ }
+ initialPS();
+}
+
+void PSGLEDevice::initialPS() {
+ out() << "gsave" << endl;
+ out() << "/f {findfont exch scalefont setfont} bind def" << endl;
+ out() << "/s {show} bind def" << endl;
+ out() << "/ps {true charpath} bind def" << endl;
+ out() << "/l {lineto} bind def" << endl;
+ out() << "/m {newpath moveto} bind def" << endl;
+ out() << "matrix currentmatrix /originmat exch def" << endl;
+ out() << "/umatrix {originmat matrix concatmatrix setmatrix} def" << endl;
+ // Measure distance in cm
+ g_scale(PS_POINTS_PER_INCH/CM_PER_INCH, PS_POINTS_PER_INCH/CM_PER_INCH);
+ if (!g_is_fullpage()) {
+ // Bounding box tweak
+ g_translate(1.0*CM_PER_INCH/72, 1.0*CM_PER_INCH/72);
+ }
+}
+
+void PSGLEDevice::closedev() {
+ g_flush();
+ out() << "showpage" << endl;
+ out() << "grestore" << endl;
+ out() << "%%Trailer" << endl;
+ if (!isEps() && control_d) out() << (char)4 << endl;
+ #ifdef ENABLE_GS_PREVIEW
+ // GS_PREVIEW a.r. 2005
+ // - purpose: *FAST* previewing while writing GLE code,
+ // don't write huge eps files to disk, no hassle with resizing ghostview,
+ // gsview or gv windows.
+ // - add to .Xresources: Ghostscript*geometry: -5+0
+ // to place gs window in upper right corner like gle -d x11
+ // - may use environment variable or .glerc file for additional gs options
+ // based on $DISPLAY, if you work on multiple sytems
+ if (GS_PREVIEW) {
+ ostringstream GScmd;
+ double width, height;
+ int gsPixelWidth, gsPixelHeight, gsPixelRes;
+ g_get_pagesize(&width, &height);
+ displayGeometry(width, height, &gsPixelWidth, &gsPixelHeight, &gsPixelRes);
+ ConfigSection* tools = g_Config.getSection(GLE_CONFIG_TOOLS);
+ string gs_cmd = ((CmdLineArgString*)tools->getOptionValue(GLE_TOOL_GHOSTSCRIPT_CMD))->getValue();
+ str_try_add_quote(gs_cmd);
+ GScmd << gs_cmd;
+ GScmd << " -sDEVICE=x11 -dTextAlphaBits=4 -dGraphicsAlphaBits=2 -dMaxBitmap=5000000 ";
+ GScmd << "-dNOPLATFONTS -dTTYPAUSE -g" << gsPixelWidth << "x" << gsPixelHeight << " ";
+ GScmd << "-r" << gsPixelRes << "x" << gsPixelRes << " -dDELAYSAFER ";
+ GScmd << "-c '<< /PermitFileReading [ (/dev/tty)] >> setuserparams .locksafe' -dSAFER -q -_";
+ // cerr << endl << "Calling " << GScmd.str() << endl;
+ // NOTE: popen may not exist (or may not work as expected) on Windows and OS/2 !
+ FILE* psfile = popen(GScmd.str().c_str(), "w");
+ if (psfile == NULL) {
+ cerr << "GLE PS: popen ghostscript failed: " << GScmd.str() << endl;
+ exit(1);
+ }
+ fprintf(psfile, "%s\n", m_OutputBuffer->str().c_str());
+ pclose(psfile);
+ }
+ #endif
+ if (m_OutputFile != NULL) {
+ m_OutputFile->close();
+ delete m_OutputFile;
+ m_OutputFile = NULL;
+ }
+ if (g_verbosity() > 0) {
+ string mainname;
+ if (isEps()) {
+ GetMainNameExt(m_OutputName.getName(), ".eps", mainname);
+ cerr << "[" << mainname << "][.eps]";
+ } else {
+ GetMainNameExt(m_OutputName.getName(), ".ps", mainname);
+ cerr << "[" << mainname << "][.ps]";
+ }
+ g_set_console_output(false);
+ }
+}
+
+void PSGLEDevice::set_line_cap(int i) {
+ /* lcap, 0= butt, 1=round, 2=projecting square */
+ if (!g.inpath) g_flush();
+ out() << i << " setlinecap" << endl;
+}
+
+void PSGLEDevice::set_line_join(int i) {
+ if (!g.inpath) g_flush();
+ out() << i << " setlinejoin" << endl;
+}
+
+void PSGLEDevice::set_line_miterlimit(double d) {
+ if (!g.inpath) g_flush();
+ out() << d << " setmiterlimit" << endl;
+}
+
+void PSGLEDevice::set_line_width(double w) {
+ if (w==0) w = 0.02;
+ if (w<.0002) w = 0;
+ if (!g.inpath) g_flush();
+ out() << w << " setlinewidth" << endl;
+}
+
+void PSGLEDevice::set_line_styled(double dd) {
+}
+
+void PSGLEDevice::set_line_style(const char *s) {
+ /* should deal with [] for solid lines */
+ static const char *defline[] = {"","","12","41","14","92","1282","9229","4114","54","73","7337","6261","2514"};
+ char ob[200];
+ if (!g.inpath) g_flush();
+ strcpy(ob,"[");
+ if (strlen(s) == 1) {
+ int index = s[0] - '0';
+ if (index < 0 || index > (int)(sizeof(defline)/sizeof(const char*))) {
+ ostringstream err;
+ err << "illegal line style '" << s << "'";
+ g_throw_parser_error(err.str());
+ }
+ s = defline[index];
+ }
+ int l = strlen(s);
+ for (i=0;i<l;i++) {
+ sprintf(ob+strlen(ob),"%g ",(*(s+i)-'0')*g.lstyled);
+ }
+ strcat(ob,"]");
+ out() << ob << " 0 setdash" << endl;
+}
+
+void PSGLEDevice::fill() {
+ out() << "gsave" << endl;
+ ddfill();
+ out() << "grestore" << endl;
+}
+
+void PSGLEDevice::ddfill(GLERectangle* bounds) {
+ colortyp cur_fill;
+ cur_fill.l = m_currentFill->getHexValueGLE();
+ if (cur_fill.b[B_F] == 255) {
+ return; /* clear fill, do nothing */
+ } else if (cur_fill.b[B_F] == 2) {
+ shade(bounds);
+ return;
+ }
+ set_fill(); /*because color and fill are the same*/
+ out() << "fill" << endl;
+ set_color();
+}
+
+void PSGLEDevice::shadeGLE() {
+ colortyp cur_fill;
+ cur_fill.l = m_currentFill->getHexValueGLE();
+ double step1 = cur_fill.b[B_B]/160.0;
+ double step2 = cur_fill.b[B_G]/160.0;
+ if (step1 > 0) {
+ out() << -40.0 << " " << step1 << " " << 40.0 << " { /x exch def" << endl;
+ out() << "x 0 moveto 40 x add 40 lineto stroke" << endl;
+ out() << "} for" << endl;
+ }
+ if (step2 > 0) {
+ out() << 0.0 << " " << step2 << " " << 80.0 << " { /x exch def" << endl;
+ out() << "x 0 moveto -40 x add 40 lineto stroke" << endl;
+ out() << "} for" << endl;
+ }
+}
+
+void PSGLEDevice::shadeBoundedIfThenElse1(GLERectangle* bounds, double step1) {
+ // if x1+p*s > y1 then
+ out() << bounds->getXMax() << " p " << step1 << " mul add " << bounds->getYMax() << " gt" << endl;
+ // aline y1-p*s y1
+ out() << "{" << bounds->getYMax() << " dup p " << step1 << " mul sub exch lineto stroke}" << endl;
+ // aline x1 x1+p*s
+ out() << "{" << bounds->getXMax() << " dup p " << step1 << " mul add lineto stroke} ifelse" << endl;
+}
+
+void PSGLEDevice::shadeBoundedIfThenElse2(GLERectangle* bounds, double step2) {
+ // if p*s-y1 > x0 then
+ out() << "p " << step2 << " mul " << bounds->getYMax() << " sub " << bounds->getXMin() << " gt" << endl;
+ // aline p*s-y1 y1
+ out() << "{" << bounds->getYMax() << " dup p " << step2 << " mul exch sub exch lineto stroke}" << endl;
+ // aline x0 p*s-x0
+ out() << "{" << bounds->getXMin() << " dup p " << step2 << " mul exch sub lineto stroke} ifelse" << endl;
+}
+
+void PSGLEDevice::shadeBounded(GLERectangle* bounds) {
+ colortyp cur_fill;
+ cur_fill.l = m_currentFill->getHexValueGLE();
+ double step1 = cur_fill.b[B_B]/160.0;
+ double step2 = cur_fill.b[B_G]/160.0;
+ out() << "2 setlinecap" << endl;
+ if (step1 > 0) {
+ int p0 = (int)ceil((bounds->getYMax()-bounds->getXMin())/step1-1e-6);
+ if (bounds->getXMin() + p0*step1 > bounds->getYMax()) p0--;
+ int p1 = (int)floor((bounds->getYMin()-bounds->getXMin())/step1+1e-6);
+ if (bounds->getXMin() + p1*step1 < bounds->getYMin()) p1++;
+ int p2 = (int)floor((bounds->getYMin()-bounds->getXMax())/step1+1e-6);
+ if (bounds->getXMax() + p2*step1 < bounds->getYMin()) p2++;
+ // for (int p = p0; p > p1; p--)
+ out() << p0 << " -1 " << (p1+1) << " { /p exch def" << endl;
+ // amove x0 x0+p*s
+ out() << bounds->getXMin() << " dup p " << step1 << " mul add moveto" << endl;
+ shadeBoundedIfThenElse1(bounds, step1);
+ out() << "} for" << endl;
+ // for (int p = p1; p >= p2; p--)
+ out() << p1 << " -1 " << p2 << " { /p exch def" << endl;
+ // amove y0-p*s y0
+ out() << bounds->getYMin() << " dup p " << step1 << " mul sub exch moveto" << endl;
+ shadeBoundedIfThenElse1(bounds, step1);
+ out() << "} for" << endl;
+ }
+ if (step2 > 0) {
+ int p0 = (int)ceil((bounds->getYMax()+bounds->getXMax())/step2-1e-6);
+ if (p0*step2 - bounds->getXMin() > bounds->getYMax()) p0--;
+ int p1 = (int)floor((bounds->getYMin()+bounds->getXMax())/step2+1e-6);
+ if (p1*step2 - bounds->getXMax() < bounds->getYMin()) p1++;
+ int p2 = (int)floor((bounds->getYMin()+bounds->getXMin())/step2+1e-6);
+ if (p2*step2 - bounds->getXMax() < bounds->getYMin()) p2++;
+ // for (int p = p0; p > p1; p--)
+ out() << p0 << " -1 " << (p1+1) << " { /p exch def" << endl;
+ // amove x0 x0+p*s
+ out() << bounds->getXMax() << " dup p " << step2 << " mul exch sub moveto" << endl;
+ shadeBoundedIfThenElse2(bounds, step2);
+ out() << "} for" << endl;
+ // for (int p = p1; p >= p2; p--)
+ out() << p1 << " -1 " << p2 << " { /p exch def" << endl;
+ // amove y0-p*s y0
+ out() << bounds->getYMin() << " dup p " << step2 << " mul exch sub exch moveto" << endl;
+ shadeBoundedIfThenElse2(bounds, step2);
+ out() << "} for" << endl;
+ }
+}
+
+void PSGLEDevice::shadePostScript() {
+ colortyp cur_fill;
+ cur_fill.l = m_currentFill->getHexValueGLE();
+ int step1 = cur_fill.b[B_B];
+ int step2 = cur_fill.b[B_G];
+ out() << "<< /PatternType 1" << endl;
+ out() << "/PaintType 1" << endl;
+ out() << "/TilingType 1" << endl;
+ int xstep = max(step1, step2);
+ int ystep = max(step1, step2);
+ out() << "/BBox [0 0 " << xstep << " " << ystep << "]" << endl;
+ out() << "/XStep " << xstep << endl;
+ out() << "/YStep " << ystep << endl;
+ out() << "/PaintProc" << endl;
+ out() << "{ pop" << endl;
+ out() << "0 setlinecap" << endl;
+ out() << "0 setlinejoin" << endl;
+ GLERC<GLEColor> background(get_fill_background(m_currentFill.get()));
+ if (!background->isTransparent()) {
+ set_color_impl(background);
+ out() << "-1 -1 " << (xstep+1) << " " << (ystep+1) << " rectfill" << endl;
+ }
+ GLERC<GLEColor> foreground(get_fill_foreground(m_currentFill.get()));
+ set_color_impl(foreground);
+ out() << (int)cur_fill.b[B_R] << " setlinewidth" << endl;
+ if (step1 > 0) {
+ out() << "0 0 moveto" << endl;
+ out() << xstep << " " << ystep << " l" << endl;
+ out() << "stroke" << endl;
+ if (step2 == 0) {
+ out() << xstep/2 << " " << -ystep/2 << " moveto" << endl;
+ out() << 3*xstep/2 << " " << ystep/2 << " l" << endl;
+ out() << "stroke" << endl;
+ out() << -xstep/2 << " " << ystep/2 << " moveto" << endl;
+ out() << xstep/2 << " " << 3*ystep/2 << " l" << endl;
+ out() << "stroke" << endl;
+ }
+ }
+ if (step2 > 0) {
+ out() << "0 " << ystep << " moveto" << endl;
+ out() << xstep << " 0 l" << endl;
+ out() << "stroke" << endl;
+ if (step1 == 0) {
+ out() << -xstep/2 << " " << ystep/2 << " moveto" << endl;
+ out() << xstep/2 << " " << -ystep/2 << " l" << endl;
+ out() << "stroke" << endl;
+ out() << xstep/2 << " " << 3*ystep/2 << " moveto" << endl;
+ out() << 3*xstep/2 << " " << ystep/2 << " l" << endl;
+ out() << "stroke" << endl;
+ }
+ }
+ out() << "} bind" << endl;
+ out() << ">>" << endl;
+ out() << "[" << 1.0/160 << " 0 0 " << 1.0/160 << " 1 1]" << endl;
+ out() << "makepattern" << endl;
+ out() << "/Pattern setcolorspace" << endl;
+ out() << "setpattern fill" << endl;
+ set_color();
+}
+
+void PSGLEDevice::shade(GLERectangle* bounds) {
+ if (m_FillMethod == GLE_FILL_METHOD_GLE ||
+ (m_FillMethod == GLE_FILL_METHOD_DEFAULT && bounds != NULL)) {
+ GLERC<GLEColor> background(get_fill_background(m_currentFill.get()));
+ if (!background->isTransparent()) {
+ out() << "gsave" << endl;
+ set_color_impl(background);
+ out() << "fill" << endl;
+ out() << "grestore" << endl;
+ }
+ // Implemented by using path as clip and then painting strokes over the clip
+ out() << "gsave" << endl;
+ out() << "clip" << endl;
+ out() << "newpath" << endl;
+ GLERC<GLEColor> foreground(get_fill_foreground(m_currentFill.get()));
+ set_color_impl(foreground);
+ colortyp cur_fill;
+ cur_fill.l = m_currentFill->getHexValueGLE();
+ out() << (double)(cur_fill.b[B_R]/160.0) << " setlinewidth" << endl;
+ if (m_FillMethod == GLE_FILL_METHOD_DEFAULT && bounds != NULL) {
+ shadeBounded(bounds);
+ } else {
+ shadeGLE();
+ }
+ out() << "grestore" << endl;
+ } else {
+ shadePostScript();
+ }
+}
+
+void PSGLEDevice::fill_ary(int nwk,double *wkx,double *wky) {
+ out() << "gsave" << endl;
+ out() << "newpath" << endl;
+ out() << wkx[0] << " " << wky[0] << " moveto" << endl;
+ for (int i = 1; i < nwk; i++) {
+ out() << wkx[i] << " " << wky[i] << " l" << endl;
+ }
+ set_fill();
+ out() << "fill" << endl;
+ set_color();
+ out() << "grestore" << endl;
+}
+
+void PSGLEDevice::line_ary(int nwk,double *wkx,double *wky) {
+ out() << "gsave" << endl;
+ out() << "newpath" << endl;
+ out() << wkx[0] << " " << wky[0] << " moveto" << endl;
+ for (int i = 1; i < nwk; i++) {
+ out() << wkx[i] << " " << wky[i] << " l" << endl;
+ }
+ out() << "stroke" << endl;
+ out() << "grestore" << endl;
+}
+
+void PSGLEDevice::stroke() {
+ out() << "gsave" << endl;
+ out() << "stroke" << endl;
+ out() << "grestore" << endl;
+}
+
+void PSGLEDevice::clip() {
+ out() << "clip" << endl;
+}
+
+void PSGLEDevice::set_matrix(double newmat[3][3]) {
+ out() << "[";
+ out() << newmat[0][0] << " " << newmat[1][0] << " " << newmat[0][1] << " ";
+ out() << newmat[1][1] << " " << newmat[0][2] << " " << newmat[1][2] << "] umatrix" << endl;
+}
+
+void PSGLEDevice::move(double zx,double zy) {
+ if (g.inpath) {
+ out() << zx << " " << zy << " moveto" << endl;
+ } else {
+ ps_nvec++;
+ out() << zx << " " << zy << " m" << endl;
+ }
+}
+
+void PSGLEDevice::reverse() {
+ out() << "reversepath" << endl;
+}
+
+void PSGLEDevice::closepath() {
+ out() << "closepath" << endl;
+}
+
+void PSGLEDevice::line(double zx,double zy) {
+ dbg gprint("in d_line g.curx,y %g %g ",g.curx,g.cury);
+ if (g.xinline==false) {
+ move(g.curx,g.cury);
+ }
+ ps_nvec++;
+ if (MAX_VECTOR != -1 && ps_nvec > MAX_VECTOR) {
+ //gprint("Warning, complex path, if filling fails then try /nomaxpath \n");
+ ps_nvec = 0; g_flush(); move(g.curx,g.cury);
+ }
+ out() << zx << " " << zy << " l" << endl;
+}
+
+void PSGLEDevice::clear() {
+}
+
+void PSGLEDevice::flush() {
+ if (g.inpath) return;
+ if (g.xinline) {
+ out() << "stroke" << endl;
+ ps_nvec = 0;
+ }
+}
+
+void PSGLEDevice::arcto(dbl x1,dbl y1,dbl x2,dbl y2,dbl rrr) {
+ if (g.xinline==false) move(g.curx,g.cury);
+ out() << x1 << " " << y1 << " " << x2 << " " << y2 << " " << rrr << " arcto clear ";
+ out() << x2 << " " << y2 << " l" << endl;
+ g.xinline = true;
+}
+
+void PSGLEDevice::arc(dbl r,dbl t1,dbl t2,dbl cx,dbl cy) {
+ //double dx,dy;
+ double x,y;
+ g_get_xy(&x,&y);
+ //polar_xy(r,t1,&dx,&dy);
+ if (!g.inpath) {
+ if (!g.xinline) out() << "newpath ";
+ }
+ out() << cx << " " << cy << " " << r << " " << t1 << " " << t2 << " arc" << endl;
+ g.xinline = true;
+ if (!g.inpath) g_move(x,y);
+}
+
+void PSGLEDevice::narc(dbl r,dbl t1,dbl t2,dbl cx,dbl cy) {
+ double dx,dy;
+ double x,y;
+ g_get_xy(&x,&y);
+ polar_xy(r,t1,&dx,&dy);
+ if (!g.inpath) {
+ if (!g.xinline) out() << "newpath ";
+ }
+ out() << cx << " " << cy << " " << r << " " << t1 << " " << t2 << " arcn" << endl;
+ g.xinline = true;
+ if (!g.inpath) g_move(x,y);
+}
+
+void PSGLEDevice::elliptical_arc(dbl rx,dbl ry,dbl t1,dbl t2,dbl cx,dbl cy) {
+ double dx,dy;
+ double x,y;
+ if (first_ellipse) {
+ first_ellipse = 0;
+ out() << ellipse_fcn << endl;
+ }
+ g_get_xy(&x,&y);
+ polar_xy(rx,ry,t1,&dx,&dy);
+ if (!g.inpath) g_move(cx+dx,cy+dy);
+ out() << cx << " " << cy << " " << rx << " " << ry << " " << t1 << " " << t2 << " ellipse" << endl;
+ g.xinline = true;
+ if (!g.inpath) g_move(x,y);
+}
+
+void PSGLEDevice::elliptical_narc(dbl rx,dbl ry,dbl t1,dbl t2,dbl cx,dbl cy) {
+ double dx,dy;
+ double x,y;
+ if(first_ellipse) {
+ first_ellipse = 0;
+ out() << ellipse_fcn << endl;
+ }
+ g_get_xy(&x,&y);
+ polar_xy(rx,ry,t1,&dx,&dy);
+ if (!g.inpath) g_move(cx+dx,cy+dy);
+ out() << cx << " " << cy << " " << rx << " " << ry << " " << t1 << " " << t2 << " ellipsen" << endl;
+ g.xinline = true;
+ if (!g.inpath) g_move(x,y);
+}
+
+void PSGLEDevice::box_fill(dbl x1, dbl y1, dbl x2, dbl y2) {
+ if (g.inpath) {
+ xdbox(x1,y1,x2,y2);
+ } else {
+ g_flush();
+ out() << "newpath ";
+ GLERectangle rect(x1, y1, x2, y2);
+ xdbox(x1,y1,x2,y2);
+ ddfill(&rect);
+ out() << "newpath" << endl;
+ }
+}
+
+void PSGLEDevice::box_stroke(dbl x1, dbl y1, dbl x2, dbl y2, bool reverse) {
+ if (g.inpath) {
+ if (reverse) {
+ out() << x1 << " " << y1 << " moveto " << x1 << " " << y2 << " l " <<
+ x2 << " " << y2 << " l " << x2 << " " << y1 << " l closepath" << endl;
+ } else {
+ xdbox(x1,y1,x2,y2);
+ }
+ } else {
+ g_flush();
+ out() << "newpath ";
+ xdbox(x1,y1,x2,y2);
+ out() << "stroke" << endl;
+ ps_nvec = 0;
+ }
+}
+
+void PSGLEDevice::xdbox(double x1, double y1, double x2, double y2) {
+ out() << x1 << " " << y1 << " moveto " << x2 << " " << y1 << " l " << x2 << " " <<
+ y2 << " l " << x1 << " " << y2 << " l closepath" << endl;
+}
+
+void PSGLEDevice::circle_stroke(double zr) {
+ double x,y;
+ g_get_xy(&x,&y);
+ if (g.inpath) {
+ out() << x << " " << y << " " << zr << " 0 360 arc" << endl;
+ } else {
+ g_flush();
+ out() << "newpath ";
+ out() << x << " " << y << " " << zr << " 0 360 arc" << endl;
+ out() << "closepath stroke" << endl;
+ }
+}
+
+void PSGLEDevice::circle_fill(double zr) {
+ double x=g.curx,y=g.cury;
+ if (g.inpath) {
+ out() << x << " " << y << " " << zr << " 0 360 arc" << endl;
+ } else {
+ g_flush();
+ out() << "newpath ";
+ out() << x << " " << y << " " << zr << " 0 360 arc" << endl;
+ GLERectangle rect(x-zr, y-zr, x+zr, y+zr);
+ ddfill(&rect);
+ out() << "newpath" << endl;
+ }
+}
+
+void PSGLEDevice::ellipse_stroke(double rx, double ry) {
+ double x,y;
+ if (first_ellipse) {
+ first_ellipse = 0;
+ out() << ellipse_fcn << endl;
+ }
+ g_get_xy(&x,&y);
+ if (g.inpath) {
+ out() << x << " " << y << " " << rx << " " << ry << " 0 360 ellipse" << endl;
+ } else {
+ g_flush();
+ out() << "newpath ";
+ out() << x << " " << y << " " << rx << " " << ry << " 0 360 ellipse closepath" << endl;
+ out() << "closepath stroke" << endl;
+ }
+}
+
+void PSGLEDevice::ellipse_fill(double rx, double ry) {
+ double x=g.curx,y=g.cury;
+ if (first_ellipse) {
+ first_ellipse = 0;
+ out() << ellipse_fcn << endl;
+ }
+ if (g.inpath) {
+ out() << x << " " << y << " " << rx << " " << ry << " 0 360 ellipse" << endl;
+ } else {
+ g_flush();
+ out() << "newpath ";
+ out() << x << " " << y << " " << rx << " " << ry << " 0 360 ellipse" << endl;
+ GLERectangle rect(x-rx, y-ry, x+rx, y+ry);
+ ddfill(&rect);
+ out() << "newpath" << endl;
+ }
+}
+
+void PSGLEDevice::bezier(dbl x1,dbl y1,dbl x2,dbl y2,dbl x3,dbl y3) {
+ double x=g.curx,y=g.cury;
+ if (g.inpath) {
+ if (g.xinline==false) move(g.curx,g.cury);
+ out() << x1 << " " << y1 << " " << x2 << " " << y2 << " "
+ << x3 << " " << y3 << " curveto" << endl;
+ } else {
+ g_flush();
+ if (!g.xinline) out() << x << " " << y << " moveto ";
+ out() << x1 << " " << y1 << " " << x2 << " " << y2 << " "
+ << x3 << " " << y3 << " curveto" << endl;
+ }
+ g.xinline = true;
+}
+
+void PSGLEDevice::set_color_impl(const GLERC<GLEColor>& color) {
+ unsigned int hexValue = color->getHexValueGLE();
+ if (hexValue == (unsigned int)GLE_COLOR_WHITE) {
+ out() << "1 setgray" << endl;
+ } else if (hexValue == (unsigned int)GLE_COLOR_BLACK) {
+ out() << "0 setgray" << endl;
+ } else {
+ if (color->getRed() == color->getGreen() && color->getRed() == color->getBlue()) {
+ out() << color->getRed() << " setgray" << endl;
+ } else {
+ out() << color->getRed() << " " << color->getGreen() << " " << color->getBlue() << " setrgbcolor" << endl;
+ }
+ }
+ if (color->hasAlpha()) {
+ g_throw_parser_error("semi-transparency only supported with command line option '-cairo'");
+ }
+}
+
+void PSGLEDevice::set_color() {
+ set_color_impl(m_currentColor);
+}
+
+void PSGLEDevice::set_fill() {
+ set_color_impl(m_currentFill);
+}
+
+void PSGLEDevice::set_fill_method(int m) {
+ m_FillMethod = m;
+}
+
+void PSGLEDevice::set_color(const GLERC<GLEColor>& color) {
+ g_flush();
+ m_currentColor = color;
+ set_color();
+}
+
+void PSGLEDevice::set_fill(const GLERC<GLEColor>& fill) {
+ m_currentFill = fill;
+}
+
+void PSGLEDevice::beginclip() {
+ out() << "gsave" << endl;
+}
+
+void PSGLEDevice::endclip() {
+ g_flush();
+ out() << "grestore" << endl;
+ gmodel* state = new gmodel();
+ g_get_state(state);
+ g_set_state(state);
+ delete state;
+}
+
+struct psfont_struct {char *sname; char *lname;};
+struct psfont_struct psf[70] = { /* leaves room for twenty more from PSFONT.DAT*/
+ { (char*)"PSTR", (char*)"Times-Roman" },
+ { (char*)"PSTI", (char*)"Times-Italic" },
+ { (char*)"PSTB", (char*)"Times-Bold" },
+ { (char*)"PSTBI", (char*)"Times-BoldItalic" },
+ { (char*)"RM", (char*)"Times-Roman" },
+ { (char*)"RMI", (char*)"Times-Italic" },
+ { (char*)"RMB", (char*)"Times-Bold" },
+ { (char*)"RMBI", (char*)"Times-BoldItalic" },
+ { (char*)"SS", (char*)"Helvetica" },
+ { (char*)"SSB", (char*)"Helvetica-Bold" },
+ { (char*)"SSI", (char*)"Helvetica-Oblique" },
+ { (char*)"SSBI", (char*)"Helvetica-BoldOblique" },
+ { (char*)"PSH", (char*)"Helvetica" },
+ { (char*)"PSHB", (char*)"Helvetica-Bold" },
+ { (char*)"PSHBO", (char*)"Helvetica-BoldOblique" },
+ { (char*)"PSHO", (char*)"Helvetica-Oblique" },
+ { (char*)"PSAGB", (char*)"AvantGarde-Book" },
+ { (char*)"PSAGBO", (char*)"AvantGarde-BookOblique" },
+ { (char*)"PSAGD", (char*)"AvantGarde-Demi" },
+ { (char*)"PSAGDO", (char*)"AvantGarde-DemiOblique" },
+ { (char*)"PSBD", (char*)"Bookman-Demi" },
+ { (char*)"PSBDI", (char*)"Bookman-DemiItalic" },
+ { (char*)"PSBL", (char*)"Bookman-Light" },
+ { (char*)"PSBLI", (char*)"Bookman-LightItalic" },
+ { (char*)"PSC", (char*)"Courier" },
+ { (char*)"PSCB", (char*)"Courier-Bold" },
+ { (char*)"PSCBO", (char*)"Courier-BoldOblique" },
+ { (char*)"PSCO", (char*)"Courier-Oblique" },
+ { (char*)"TT", (char*)"Courier" },
+ { (char*)"TTB", (char*)"Courier-Bold" },
+ { (char*)"TTBI", (char*)"Courier-BoldOblique" },
+ { (char*)"TTI", (char*)"Courier-Oblique" },
+ { (char*)"PSNCSB", (char*)"NewCenturySchlbk-Bold" },
+ { (char*)"PSNCSBI", (char*)"NewCenturySchlbk-BoldItalic" },
+ { (char*)"PSNCSI", (char*)"NewCenturySchlbk-Italic" },
+ { (char*)"PSNCSR", (char*)"NewCenturySchlbk-Roman" },
+ { (char*)"PSPB", (char*)"Palatino-Bold" },
+ { (char*)"PSPBI", (char*)"Palatino-BoldItalic" },
+ { (char*)"PSPI", (char*)"Palatino-Italic" },
+ { (char*)"PSPR", (char*)"Palatino-Roman" },
+ { (char*)"PSZCMI", (char*)"ZapfChancery-MediumItalic" },
+ { (char*)"PSZD", (char*)"ZapfDingbats" },
+ { (char*)"PSSYM", (char*)"Symbol" },
+ { NULL, NULL }
+};
+
+static int d_ps_this_font = 0;
+static double d_ps_this_size = 0;
+
+struct ps_glyph_name { const char* name; };
+struct ps_glyph_name ps_glyph_name_map[] = {
+ { "Aacute" }, { "Abreve" }, { "Acircumflex" }, { "Adieresis" }, { "Agrave" }, { "Amacron" },
+ { "Aogonek" }, { "Aring" }, { "Atilde" }, { "Cacute" }, { "Ccaron" }, { "Ccedilla" },
+ { "Dcaron" }, { "Dcroat" }, { "Delta" }, { "Eacute" }, { "Ecaron" }, { "Ecircumflex" },
+ { "Edieresis" }, { "Edotaccent" }, { "Egrave" }, { "Emacron" }, { "Eogonek" }, { "Eth" },
+ { "Gbreve" }, { "Gcommaaccent" }, { "Iacute" }, { "Icircumflex" }, { "Idieresis" },
+ { "Idotaccent" }, { "Igrave" }, { "Imacron" }, { "Iogonek" }, { "Kcommaaccent" },
+ { "Lacute" }, { "Lcaron" }, { "Lcommaaccent" }, { "Nacute" }, { "Ncaron" }, { "Ncommaaccent" },
+ { "Ntilde" }, { "Oacute" }, { "Ocircumflex" }, { "Odieresis" }, { "Ograve" }, { "Ohungarumlaut" },
+ { "Omacron" }, { "Otilde" }, { "Racute" }, { "Rcaron" }, { "Rcommaaccent" }, { "Sacute" },
+ { "Scaron" }, { "Scedilla" }, { "Scommaaccent" }, { "Tcaron" }, { "Tcommaaccent" }, { "Thorn" },
+ { "Uacute" }, { "Ucircumflex" }, { "Udieresis" }, { "Ugrave" }, { "Uhungarumlaut" },
+ { "Umacron" }, { "Uogonek" }, { "Uring" }, { "Yacute" }, { "Ydieresis" }, { "Zacute" },
+ { "Zcaron" }, { "Zdotaccent" }, { "aacute" }, { "abreve" }, { "acircumflex" }, { "adieresis" },
+ { "agrave" }, { "amacron" }, { "aogonek" }, { "aring" }, { "atilde" }, { "brokenbar" },
+ { "cacute" }, { "ccaron" }, { "ccedilla" }, { "commaaccent" }, { "copyright" }, { "dcaron" },
+ { "dcroat" }, { "degree" }, { "divide" }, { "eacute" }, { "ecaron" }, { "ecircumflex" },
+ { "edieresis" }, { "edotaccent" }, { "egrave" }, { "emacron" }, { "eogonek" }, { "eth" },
+ { "gbreve" }, { "gcommaaccent" }, { "greaterequal" }, { "iacute" }, { "icircumflex" },
+ { "idieresis" }, { "igrave" }, { "imacron" }, { "iogonek" }, { "kcommaaccent" }, { "lacute" },
+ { "lcaron" }, { "lcommaaccent" }, { "lessequal" }, { "logicalnot" }, { "lozenge" }, { "minus" },
+ { "mu" }, { "multiply" }, { "nacute" }, { "ncaron" }, { "ncommaaccent" }, { "notequal" },
+ { "ntilde" }, { "oacute" }, { "ocircumflex" }, { "odieresis" }, { "ograve" }, { "ohungarumlaut" },
+ { "omacron" }, { "onehalf" }, { "onequarter" }, { "onesuperior" }, { "otilde" }, { "partialdiff" },
+ { "plusminus" }, { "racute" }, { "radical" }, { "rcaron" }, { "rcommaaccent" }, { "registered" },
+ { "sacute" }, { "scaron" }, { "scedilla" }, { "scommaaccent" }, { "summation" }, { "tcaron" },
+ { "tcommaaccent" }, { "thorn" }, { "threequarters" }, { "threesuperior" }, { "trademark" },
+ { "twosuperior" }, { "uacute" }, { "ucircumflex" }, { "udieresis" }, { "ugrave" }, { "uhungarumlaut" },
+ { "umacron" }, { "uogonek" }, { "uring" }, { "yacute" }, { "ydieresis" }, { "zacute" }, { "zcaron" },
+ { "zdotaccent" }
+};
+
+
+void PSGLEDevice::dochar(int font, int cc) {
+ read_psfont();
+ if (font_get_encoding(font)>2) {
+ my_char(font,cc);
+ return;
+ }
+ if (d_ps_this_font!=font || d_ps_this_size!=g.fontsz) {
+ if (g.fontsz<0.00001) {
+ gprint("Font size is zero, error ********* \n");
+ return;
+ }
+ char *s = font_getname(font);
+ for (i=0;;i++) {
+ if (psf[i].sname==NULL) break;
+ dbg printf("font match {%s} {%s} \n",s,psf[i].sname);
+ if (str_i_equals(psf[i].sname,s)) break;
+ }
+ if (psf[i].sname==NULL) {
+ my_char(font,cc);
+ return;
+ }
+ d_ps_this_font = font;
+ d_ps_this_size = g.fontsz;
+ out() << g.fontsz << " /" << psf[i].lname << " f" << endl;
+ }
+ if (cc >= 256) {
+ if (cc <= 420) {
+ /* FIXME: support g.inpath for these glyphs */
+ out() << "/" << ps_glyph_name_map[cc-256].name << " glyphshow" << endl;
+ }
+ } else {
+ if (isalnum(cc) && cc < 127) {
+ out() << "(" << (char)cc << ")";
+ } else {
+ char temp[50];
+ sprintf(temp,"(\\%o)",cc);
+ out() << temp;
+ }
+ if (g.inpath) {
+ out() << " ps" << endl;
+ } else {
+ out() << " s" << endl;
+ }
+ }
+}
+
+void PSGLEDevice::resetfont() {
+ d_ps_this_font = 0;
+ d_ps_this_size = 0;
+}
+
+void PSGLEDevice::read_psfont(void) {
+ /* add aditional ps fonts, e.g. pstr = TimesRoman */
+ static int init_done;
+ FILE *fptr;
+ char *s;
+ char inbuff[200];
+ if (init_done) return;
+ init_done = true;
+
+ /* Find last used psf */
+ for (i=0;;i++) if (psf[i].sname==NULL) break;
+
+ string fname = fontdir("psfont.dat");
+ fptr = fopen(fname.c_str(), "r");
+ if (fptr == 0) return; /* if not exists then don't bother */
+
+ if (fgets(inbuff, 200, fptr) != 0) {
+ while (!feof(fptr)) {
+ s = strchr(inbuff,'!');
+ if (s!=NULL) *s=0;
+ s = strtok(inbuff," \t,\n");
+ if (s!=NULL) if (*s!='\n') {
+ psf[i].sname = sdup(s);
+ s = strtok(0," \t,\n");
+ psf[i].lname = sdup(s);
+ i++;
+ }
+ if (fgets(inbuff, 200, fptr) == 0) {
+ break;
+ }
+ }
+ }
+ psf[i].sname = NULL;
+ psf[i].lname = NULL;
+}
+
+void PSGLEDevice::displayGeometry(double width, double height, int *gsPixelWidth, int *gsPixelHeight, int *gsPixelRes) {
+#if defined(__UNIX__) && defined(ENABLE_GS_PREVIEW)
+ Display *dpy = XOpenDisplay((char *) NULL);
+ if (dpy == NULL){
+ perror("Unable to open Display!");
+ exit(1);
+ }
+ int screenNo = DefaultScreen(dpy);
+ int dpyPixelWidth = DisplayWidth(dpy, screenNo);
+ int dpyPixelHeight = DisplayHeight(dpy, screenNo);
+ XCloseDisplay(dpy);
+ double dpyXbyY = (double) dpyPixelWidth / (double) dpyPixelHeight;
+ double gleXbyY = width / height;
+ if (gleXbyY > dpyXbyY) {
+ *gsPixelWidth = (int) (0.9 * dpyPixelWidth);
+ *gsPixelRes = (int) (*gsPixelWidth/(width/CM_PER_INCH));
+ *gsPixelHeight = (int) ( *gsPixelWidth / gleXbyY);
+ } else {
+ *gsPixelHeight = (int) (0.9 * dpyPixelHeight);
+ *gsPixelRes = (int) (*gsPixelHeight/(height/CM_PER_INCH));
+ *gsPixelWidth = (int) (*gsPixelHeight * gleXbyY);
+ }
+#endif
+#if defined(__WIN32__) && defined(ENABLE_GS_PREVIEW)
+ // Not yet implemented
+#endif
+#if defined(__OS2__) && defined(ENABLE_GS_PREVIEW)
+ // Not yet implemented
+#endif
+}
+
+int PSGLEDevice::getDeviceType() {
+ return m_IsEps ? GLE_DEVICE_EPS : GLE_DEVICE_PS;
+}
+
+void PSGLEDevice::psFileASCIILine(const char* prefix, int cnt, char ch, bool nl) {
+ out() << prefix;
+ for (int i = 0; i < cnt; i++) {
+ out() << (char)ch;
+ }
+ if (nl) out() << endl;
+}
+
+void PSGLEDevice::bitmap(GLEBitmap* bitmap, GLEPoint* pos, GLEPoint* scale, int type) {
+ /* Store current box */
+ GLERectangle save_box;
+ g_get_bounds(&save_box);
+ /* Generate header in postrscript output */
+ if (type != BITMAP_TYPE_USER) {
+ string str = string("%% BEGIN image: ") + bitmap->getFName() + "\n";
+ psFileASCIILine("%%", str.length()-3, '=', true);
+ g_devcmd((char*)str.c_str());
+ psFileASCIILine("%%", str.length()-3, '=', true);
+ }
+ g_devcmd("/GLESTATE save def \n");
+ g_devcmd("gsave\n");
+ g_devcmd("0 setgray 0 setlinecap 0 setlinewidth 0 setlinejoin\n");
+ g_devcmd("10 setmiterlimit [] 0 setdash\n");
+ g_gsave();
+ /* Set options */
+ bitmap->setCompress(0.0);
+ bitmap->setASCII85(1);
+ /* Get current position */
+ g_scale(scale->getX(), scale->getY());
+ g_translate(pos->getX(), pos->getY());
+ /* Convert bitmap to postscript */
+ bitmap->toPS(m_Out);
+ bitmap->close();
+ /* Footer */
+ g_devcmd("grestore GLESTATE restore \n");
+ g_grestore();
+ if (type != BITMAP_TYPE_USER) {
+ string str = string("%% END image: ") + bitmap->getFName() + "\n";
+ psFileASCIILine("%%", str.length()-3, '=', true);
+ g_devcmd((char*)str.c_str());
+ psFileASCIILine("%%", str.length()-3, '=', true);
+ }
+ g_set_bounds(&save_box);
+}
+
+void PSGLEDevice::startRecording() {
+ if (m_OutputFile != NULL) {
+ delete m_OutputFile;
+ m_OutputFile = NULL;
+ }
+ if (m_OutputBuffer != NULL) {
+ delete m_OutputBuffer;
+ }
+ m_OutputBuffer = new ostringstream();
+ m_Out = m_OutputBuffer;
+}
+
+void PSGLEDevice::getRecordedBytes(string* result) {
+ *result = m_OutputBuffer->str();
+}
diff --git a/src/gle/d_svg.cpp b/src/gle/d_svg.cpp
new file mode 100644
index 0000000..56257da
--- /dev/null
+++ b/src/gle/d_svg.cpp
@@ -0,0 +1,39 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+/* We now use the Cairo SVG export */
diff --git a/src/gle/d_x.cpp b/src/gle/d_x.cpp
new file mode 100644
index 0000000..bdcb92e
--- /dev/null
+++ b/src/gle/d_x.cpp
@@ -0,0 +1,1215 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+/*--------------------------------------------------------------*/
+/* DecWindows Driver 1.0 , for GLE V3.0 */
+/*--------------------------------------------------------------*/
+/* NOTE: MUST be run from a DECwindow (vt100 window, or curses) */
+/* */
+/* After 1.5 (float) beers the orphaned 3.3i gle_x code */
+/* compiled and was able to draw wallx.gle and adphas.gle */
+/* using the gle 4.0.7 code. No core dump, yet! */
+/* Axel Rohde, Jan 13. 2005 */
+/*--------------------------------------------------------------*/
+
+#include "all.h"
+#include "core.h"
+#include "d_interface.h"
+#include "gprint.h"
+
+#ifdef HAVE_X11
+
+extern struct gmodel g;
+extern int gle_debug;
+
+/*---------------------------------------------------------------------------*/
+/* XWindows stuff here */
+/*-----------------------------------------------*/
+
+/* Usage of backingstore should be *Always* safe now.... */
+#ifndef NOBACKINGSTORE
+ #define BACKINGSTORE
+#endif
+
+#define FontName "-ADOBE-NEW CENTURY SCHOOLBOOK-MEDIUM-R-NORMAL--*-140-*-*-P-*"
+#define WindowName "GLE Output"
+
+X11GLEDevice::X11GLEDevice() : GLEDevice() {
+ d_fillstyle = 1;
+ gle_nspeed = 2;
+ maxxsize = 0; maxysize = 0;
+ window1W = 0; window1H = 0;
+ window1 = 0;
+ dpy = NULL;
+ gc = NULL;
+ gcf = NULL;
+ screen = NULL;
+ doesbackingstore = 0;
+ savexsize = 0.0; saveysize = 0.0;
+ i = 0; l = 0; j = 0; ix = 0; iy = 0;
+ f = 0.0;
+ xsizecm = 0.0; ysizecm = 0.0;
+ d_scale = 0.0; d_xscale = 0.0; d_yscale = 0.0;
+ d_graphmode = 0; d_fillstyle = 0; d_fillcolor = 0;
+ d_lstyle = 0; d_lwidth = 0;
+ d_maxy = 0; safnt = 0; npnts = 0;
+ startx = 0; starty = 0;
+}
+
+X11GLEDevice::~X11GLEDevice() {
+}
+
+/******************** openDisplay ******************************************/
+
+void X11GLEDevice::openDisplay() {
+ dpy = XOpenDisplay(0);
+ if (dpy == NULL){
+ /*
+ gle_abort("Display not opened!\n");
+ gle_scr_end();
+ */
+ perror("Unable to open Display!");
+ exit(1);
+ }
+ screen = XDefaultScreenOfDisplay(dpy);
+ doesbackingstore = DoesBackingStore(screen);
+}
+
+/***************** doInitialize **************************/
+/* int color_table[10]; */ /* a.r. 10 instead of 9 */
+
+void X11GLEDevice::doInitialize() {
+ int i;
+
+ openDisplay();
+ doCreateWindows();
+
+ for (i=0;i<NUM_COLTABLE_ENTRIES; i++) {
+ color_table[i] = doDefineColor(i);
+ }
+
+ doCreateGraphicsContext();
+
+ XSync(dpy,False);
+
+ doLoadFont();
+ doWMHints();
+ doMapWindows();
+}
+
+/******* doCreateWindows *********/
+void X11GLEDevice::doCreateWindows() {
+ int window1X = (XWidthOfScreen(screen)-window1W);
+ int window1Y = 1;
+ XSetWindowAttributes xswa;
+ unsigned long CW;
+
+ /* Create the window1 window width and height are global variables*/
+
+ xswa.event_mask = ExposureMask | ButtonPressMask | KeyPressMask
+ | VisibilityChangeMask;
+
+ xswa.background_pixel = doDefineColor(0);
+#ifdef BACKINGSTORE
+ if (doesbackingstore){
+ xswa.backing_store = Always;
+ CW = CWEventMask | CWBackPixel | CWBackingStore;
+ }
+ else
+ CW = CWEventMask | CWBackPixel;
+#else
+ CW = CWEventMask | CWBackPixel;
+#endif
+
+ window1 = XCreateWindow(dpy,
+ XRootWindowOfScreen(screen),
+ window1X, window1Y,
+ window1W, window1H,
+ 0,
+ XDefaultDepthOfScreen(screen),
+ InputOutput,
+ XDefaultVisualOfScreen(screen),
+ CW,
+ &xswa);
+}
+
+
+/******** Create the graphics context *********/
+void X11GLEDevice::doCreateGraphicsContext() {
+ XGCValues xgcv;
+
+ /* Create graphics context. */
+
+ xgcv.background = doDefineColor(0);
+ xgcv.foreground = doDefineColor(1);
+
+ gc = XCreateGC(dpy, window1, GCForeground | GCBackground, &xgcv);
+ gcf = XCreateGC(dpy, window1, GCForeground | GCBackground, &xgcv);
+}
+
+void X11GLEDevice::setcolor(int i) {
+ XGCValues xgcv;
+ xgcv.foreground = color_table[i];
+ XChangeGC(dpy, gc, GCForeground , &xgcv);
+}
+
+void X11GLEDevice::setfillcolor(int i) {
+ XGCValues xgcv;
+ xgcv.foreground = color_table[i];
+ XChangeGC(dpy, gcf, GCForeground , &xgcv);
+}
+
+void X11GLEDevice::setfillstyle(int i) {
+#define BM_WIDTH 16
+#define BM_HEIGHT 16
+Pixmap bm;
+//unsigned
+const unsigned char bm_bits[][32] = {
+{ 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04,
+ 0x00, 0x02, 0x00, 0x01, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00,
+ 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x01, 0x00}, /* SHADE */
+{ 0x11, 0x11, 0x88, 0x88, 0x44, 0x44, 0x22, 0x22, 0x11, 0x11, 0x88, 0x88,
+ 0x44, 0x44, 0x22, 0x22, 0x11, 0x11, 0x88, 0x88, 0x44, 0x44, 0x22, 0x22,
+ 0x11, 0x11, 0x88, 0x88, 0x44, 0x44, 0x22, 0x22}, /* SHADE 1 */
+{ 0x01, 0x01, 0x80, 0x80, 0x40, 0x40, 0x20, 0x20, 0x10, 0x10, 0x08, 0x08,
+ 0x04, 0x04, 0x02, 0x02, 0x01, 0x01, 0x80, 0x80, 0x40, 0x40, 0x20, 0x20,
+ 0x10, 0x10, 0x08, 0x08, 0x04, 0x04, 0x02, 0x02}, /* SHADE 2 */
+{ 0x33, 0x33, 0x99, 0x99, 0xcc, 0xcc, 0x66, 0x66, 0x33, 0x33, 0x99, 0x99,
+ 0xcc, 0xcc, 0x66, 0x66, 0x33, 0x33, 0x99, 0x99, 0xcc, 0xcc, 0x66, 0x66,
+ 0x33, 0x33, 0x99, 0x99, 0xcc, 0xcc, 0x66, 0x66}, /* SHADE 3 */
+{ 0x07, 0x07, 0x83, 0x83, 0xc1, 0xc1, 0xe0, 0xe0, 0x70, 0x70, 0x38, 0x38,
+ 0x1c, 0x1c, 0x0e, 0x0e, 0x07, 0x07, 0x83, 0x83, 0xc1, 0xc1, 0xe0, 0xe0,
+ 0x70, 0x70, 0x38, 0x38, 0x1c, 0x1c, 0x0e, 0x0e}, /* SHADE 4 */
+{ 0x0f, 0x0f, 0x87, 0x87, 0xc3, 0xc3, 0xe1, 0xe1, 0xf0, 0xf0, 0x78, 0x78,
+ 0x3c, 0x3c, 0x1e, 0x1e, 0x0f, 0x0f, 0x87, 0x87, 0xc3, 0xc3, 0xe1, 0xe1,
+ 0xf0, 0xf0, 0x78, 0x78, 0x3c, 0x3c, 0x1e, 0x1e}, /* SHADE 5 */
+{ 0x01, 0x80, 0x02, 0x40, 0x04, 0x20, 0x08, 0x10, 0x10, 0x08, 0x20, 0x04,
+ 0x40, 0x02, 0x80, 0x01, 0x80, 0x01, 0x40, 0x02, 0x20, 0x04, 0x10, 0x08,
+ 0x08, 0x10, 0x04, 0x20, 0x02, 0x40, 0x01, 0x80}, /* GRID */
+{ 0x01, 0x01, 0x82, 0x82, 0x44, 0x44, 0x28, 0x28, 0x10, 0x10, 0x28, 0x28,
+ 0x44, 0x44, 0x82, 0x82, 0x01, 0x01, 0x82, 0x82, 0x44, 0x44, 0x28, 0x28,
+ 0x10, 0x10, 0x28, 0x28, 0x44, 0x44, 0x82, 0x82}, /* GRID 1 */
+{ 0x01, 0x01, 0x82, 0x82, 0x44, 0x44, 0x28, 0x28, 0x10, 0x10, 0x28, 0x28,
+ 0x44, 0x44, 0x82, 0x82, 0x01, 0x01, 0x82, 0x82, 0x44, 0x44, 0x28, 0x28,
+ 0x10, 0x10, 0x28, 0x28, 0x44, 0x44, 0x82, 0x82}, /* GRID 2 */
+{ 0x83, 0x83, 0xc6, 0xc6, 0x6c, 0x6c, 0x38, 0x38, 0x38, 0x38, 0x6c, 0x6c,
+ 0xc6, 0xc6, 0x83, 0x83, 0x83, 0x83, 0xc6, 0xc6, 0x6c, 0x6c, 0x38, 0x38,
+ 0x38, 0x38, 0x6c, 0x6c, 0xc6, 0xc6, 0x83, 0x83}, /* GRID 3 */
+{ 0x03, 0xc0, 0x06, 0x60, 0x0c, 0x30, 0x18, 0x18, 0x30, 0x0c, 0x60, 0x06,
+ 0xc0, 0x03, 0x80, 0x01, 0xc0, 0x03, 0x60, 0x06, 0x30, 0x0c, 0x18, 0x18,
+ 0x0c, 0x30, 0x06, 0x60, 0x03, 0xc0, 0x01, 0x80}, /* GRID 4 */
+{ 0x03, 0xc0, 0x07, 0xe0, 0x0e, 0x70, 0x1c, 0x38, 0x38, 0x1c, 0x70, 0x0e,
+ 0xe0, 0x07, 0xc0, 0x03, 0xc0, 0x03, 0xe0, 0x07, 0x70, 0x0e, 0x38, 0x1c,
+ 0x1c, 0x38, 0x0e, 0x70, 0x07, 0xe0, 0x03, 0xc0} /* GRID 5 */
+};
+
+ bm = XCreateBitmapFromData(dpy,window1, (char*)bm_bits[i], BM_WIDTH, BM_HEIGHT);
+ XSetStipple(dpy, gcf, bm);
+ XSetFillStyle(dpy, gcf, FillStippled);
+ XFreePixmap(dpy, bm);
+}
+
+
+/******* Load the font for text writing ******/
+void X11GLEDevice::doLoadFont() {
+ Font font;
+
+ font = XLoadFont(dpy, FontName);
+ XSetFont(dpy, gc, font);
+}
+
+ /******* Create color ************************/
+int X11GLEDevice::doDefineColor(int i) {
+ static Visual *vis;
+ /* change NUM_COLTABLE_ENTRIES, when you add colors */
+ const char *colors[] = {
+ "white", /* 0 */
+ "black", /* 1 */
+ "red", /* 2 */
+ "green", /* 3 */
+ "blue", /* 4 */
+ "yellow", /* 5 */
+ "magenta", /* 6 */
+ "cyan", /* 7 */
+ "light grey", /* 8 */
+ "dim grey", /* 9 */ /* a.r. instead of black */
+ "grey5", /* 10 */
+ "grey10", /* 11 */
+ "grey20", /* 12 */
+ "grey30", /* 13 */
+ "grey40", /* 14 */
+ "grey50", /* 15 */
+ "grey60", /* 16 */
+ "grey70", /* 17 */
+ "grey80", /* 18 */
+ "grey90", /* 19 */
+ "grey100", /* 20 */ /* dupl to white, for simplicity */
+ "orange", /* 21 */ /* 255 165 0 */
+ "brown", /* 22 */ /* 165 42 42 */
+ "violet", /* 23 */ /* 238 130 238 */
+ "pink", /* 24 */ /* 255 192 203 */
+ "dark red", /* 25 */ /* 139 0 0 */
+ "dark blue", /* 26 */ /* 0 0 139 */
+ "dark green", /* 27 */ /* 0 139 0 */
+ "tan", /* 28 */ /* 210 180 140 */
+ "tan4", /* 29 */ /* 139 90 43 */
+ "khaki", /* 30 */ /* 240 230 140 */
+ "khaki4", /* 31 */ /* 139 134 78 */
+ "pink4", /* 32 */ /* 255 192 203 */
+ "darkcyan", /* 33 */ /* 0 139 139 */
+ };
+
+ XColor exact_color,screen_color; /* a.r. added TrueColor */
+ vis = XDefaultVisualOfScreen(screen);
+ if (
+ vis->c_class == PseudoColor
+ || vis->c_class == DirectColor
+ || vis->c_class == TrueColor
+ )
+ if (XAllocNamedColor(dpy, XDefaultColormapOfScreen(screen),
+ colors[i], &screen_color, &exact_color))
+ return screen_color.pixel;
+ else
+ gprint("Color not allocated! {%s}\n",colors[i]);
+ else
+ switch (i) {
+ case 0: return XWhitePixelOfScreen(screen); break;
+ case 1: return XBlackPixelOfScreen(screen); break;
+ default: return XBlackPixelOfScreen(screen); break;
+ }
+ return 0;
+}
+
+/******** do WMHints *************/
+void X11GLEDevice::doWMHints() {
+ XSizeHints xsh;
+
+ /* Define the size and name of the window1 window */
+
+ xsh.x = XWidthOfScreen(screen)-window1W;
+ xsh.y = 1;
+ xsh.width = xsh.min_width = xsh.max_width = window1W;
+ xsh.height = xsh.min_height = xsh.max_height = window1H;
+ xsh.flags = PSize | PMinSize | PMaxSize | PPosition | USPosition;
+
+ XSetNormalHints(dpy, window1, &xsh);
+
+ XStoreName(dpy, window1, WindowName);
+}
+
+/******** doMapWindows ***********/
+void X11GLEDevice::doMapWindows() {
+ set_expose();
+ XMapWindow(dpy, window1);
+}
+
+double X11GLEDevice::getmaxx(void) {
+ return XHeightOfScreen( screen ); /* a.r. */
+}
+
+double X11GLEDevice::getmaxy(void) {
+ return (XHeightOfScreen( screen ) * 0.95 ); /* a.r. */
+ /* how do I query the height of a titlebar from the Window Manager ? */
+}
+
+int X11GLEDevice::getmaxcolor(void) {
+ return 10; /* a.r. 10 instead of 9 */
+}
+/*---------------------------------------------------------------------------*/
+
+#define DASHED_LINE 2
+#define SOLID_LINE 1
+#define BLACKANDWHITE 1
+#define false 0
+#define true (!false)
+#define dbg if ((gle_debug & 64)>0)
+
+#define sx(v) ( (int) ((v) * d_xscale))
+#define sy(v) ( d_maxy - ((int) ((v) * d_yscale)))
+#define rx(v) ( (int) ((v) * d_xscale))
+#define ry(v) ( d_maxy - ((int) ((v) * d_yscale)))
+
+void X11GLEDevice::dxy(double x, double y, int *dx, int *dy) {
+ static double fx,fy;
+ g_dev(x,y,&fx,&fy);
+ *dx = sx(fx);
+ *dy = sy(fy);
+}
+
+void X11GLEDevice::rxy(double x, double y, int *dx, int *dy) {
+ static double fx,fy,zx,zy;
+ g_dev(x,y,&fx,&fy);
+ g_dev(0.0,0.0,&zx,&zy);
+ *dx = (int) ( (fx-zx) * d_xscale);
+ *dy = (int) ( (fy-zy) * d_yscale);
+}
+
+/* short for XFillPolygon() */
+void X11GLEDevice::dxy_short(double x, double y, short *dx, short *dy) {
+ static double fx,fy;
+ g_dev(x,y,&fx,&fy);
+ *dx = sx(fx);
+ *dy = sy(fy);
+}
+
+void X11GLEDevice::rxy_short(double x, double y, short *dx, short *dy) {
+ static double fx,fy,zx,zy;
+ g_dev(x,y,&fx,&fy);
+ g_dev(0.0,0.0,&zx,&zy);
+ *dx = (int) ( (fx-zx) * d_xscale);
+ *dy = (int) ( (fy-zy) * d_yscale);
+}
+
+void X11GLEDevice::devcmd(const char *s) {
+}
+/*---------------------------------------------------------------------------*/
+void X11GLEDevice::dfont(char *c)
+{
+ /* only used for the DFONT driver which builds fonts */
+}
+void X11GLEDevice::resetfont()
+{
+}
+/*---------------------------------------------------------------------------*/
+static char lastline[80];
+void X11GLEDevice::message(char *s)
+{
+ /* w_message(s); 4.0 */
+ printf("%s\n",s);
+}
+/*---------------------------------------------------------------------------*/
+void X11GLEDevice::source(const char *s)
+{
+ dbg fprintf(stderr,"drawing %s ....",s);
+}
+/*---------------------------------------------------------------------------*/
+std::string X11GLEDevice::get_type()
+{
+ return "INTERACTIVE, X, DECWINDOWS, XWINDOWS";
+}
+/*---------------------------------------------------------------------------*/
+void X11GLEDevice::set_path(int onoff)
+{}
+/*---------------------------------------------------------------------------*/
+void X11GLEDevice::newpath()
+{
+ path_newpath();
+}
+/*---------------------------------------------------------------------------*/
+void X11GLEDevice::opendev(double width, double height, GLEFileLocation* outputfile, const string& inputfile) throw(ParserError)
+{
+ gle_nspeed = 2; /* text mode = slow and fast */
+ xsizecm = 16;
+ ysizecm = 16*0.95;
+ /* Get largest rectangle we can fit on the screen */
+ d_scale = xsizecm / width;
+ f = ysizecm / height;
+ if (f<d_scale) d_scale = f;
+ if (dpy==NULL)
+ openDisplay();
+ d_xscale = d_scale * (getmaxx()) / xsizecm; /* Device Scale X, Device Scale y */
+ d_yscale = d_scale * (getmaxy()) / ysizecm;
+ window1W = (int) (width*d_xscale);
+ window1H = (int) (height*d_yscale);
+ d_maxy = window1H;
+ if (dpy==NULL || savexsize != width || saveysize != height) {
+ if (dpy != NULL) {
+ if (window1 != 0) {
+ XUnmapWindow(dpy, window1);
+ XDestroyWindow(dpy, window1);
+ }
+ XCloseDisplay(dpy);
+ }
+ openDisplay();
+ doInitialize();
+ set_expose();
+ XRaiseWindow(dpy, window1);
+ wait_expose();
+ } else {
+ set_expose();
+ XRaiseWindow(dpy, window1);
+#ifndef BACKINGSTORE /* a.r. */
+ wait_expose();
+#else
+ if (!doesbackingstore)
+ wait_expose();
+#endif
+ }
+ XClearWindow(dpy, window1);
+ XSync(dpy,False);
+ savexsize = width;
+ saveysize = height;
+}
+/*---------------------------------------------------------------------------*/
+
+void X11GLEDevice::closedev() {
+ int emask;
+ XEvent ereturn;
+ Window rr, cr;
+ int rx, ry, cx, cy;
+ unsigned int retmask;
+
+ g_flush();
+ lastline[0] = 0;
+ XSync(dpy,False);
+ XQueryPointer(dpy, window1, &rr, &cr, &rx, &ry, &cx, &cy, &retmask);
+/* if ( cx >= 0 && cx <= window1W && cy >= 0 && cy <= window1H ) {
+ fner("Picture completed, press any key or click mouse in the graphics window ");
+ gle_scr_refresh();
+*/
+ fprintf(stderr, "\nDrawing completed, press CTRL-c on commandline to exit...\n");
+ emask = NoEventMask;
+ XWindowEvent(dpy, window1, emask, &ereturn);
+/* } else {
+ fner("Picture completed, press RETURN to continue (Press any key)");
+ gle_scr_refresh();
+
+ text_inkey();
+ }
+
+ XLowerWindow(dpy, window1);
+ XSync(dpy,True);
+*/
+}
+
+/*---------------------------------------------------------------------------*/
+void X11GLEDevice::set_line_cap(int i)
+{
+ /* lcap, 0= butt, 1=round, 2=projecting square */
+/* if X11 would do the same as Postscript......
+ XGCValues xgcv;
+
+ xgcv.cap_style = i+1;
+ XChangeGC(dpy, gc, GCCapStyle , &xgcv);
+ XChangeGC(dpy, gcf, GCCapStyle , &xgcv);
+*/
+}
+/*---------------------------------------------------------------------------*/
+void X11GLEDevice::set_line_join(int i)
+{
+ /* 0= mitre, 1=round, 2=bevel */
+/* if X11 would do the same as Postscript......
+ XGCValues xgcv;
+
+ xgcv.join_style = i;
+ XChangeGC(dpy, gc, GCJoinStyle, &xgcv);
+ XChangeGC(dpy, gcf, GCJoinStyle, &xgcv);
+*/
+}
+/*---------------------------------------------------------------------------*/
+void X11GLEDevice::set_line_miterlimit(double d)
+{
+ i++;
+}
+/*---------------------------------------------------------------------------*/
+void X11GLEDevice::set_line_width(double w)
+{
+ int xa,xb;
+ XGCValues xgcv;
+ rxy(w,w,&xa,&xb);
+ rxy(w,w,&xa,&xb);
+ xa = abs(xa);
+ xgcv.line_width = xa;
+ XChangeGC(dpy, gc, GCLineWidth , &xgcv);
+}
+/*---------------------------------------------------------------------------*/
+void X11GLEDevice::set_line_styled(double dd)
+{}
+void X11GLEDevice::set_line_style(const char *s)
+{
+ XGCValues xgcv;
+ const char *defline[] = {"", "", "12", "41", "14", "92", "1282", "9229", "4114", "54"};
+ int i, dashoff=0;
+ char dashlist[64];
+
+ if (strlen(s)==1) s = defline[*s-'0'];
+ if (strcmp(s,"")==0) {
+ xgcv.line_style = LineSolid;
+ XChangeGC(dpy, gc, GCLineStyle , &xgcv);
+ } else {
+ xgcv.line_style = LineDoubleDash;
+ XChangeGC(dpy, gc, GCLineStyle , &xgcv);
+ for (i=0; *s!=0; s++,i++)
+ dashlist[i] = *s-'0' ? *s-'0' : 1;
+ XSetDashes(dpy, gc, dashoff, dashlist, i);
+ }
+}
+/*---------------------------------------------------------------------------*/
+int in_font;
+void X11GLEDevice::fill()
+{
+ if (in_font)
+ path_stroke();
+ else
+ path_fill();
+}
+/*---------------------------------------------------------------------------*/
+void X11GLEDevice::fill_ary(int nwk,double *wkx,double *wky)
+{
+/* fprintf(psfile,"%g %g moveto \n",wkx[0],wky[0]);
+ for (i=1;i<nwk;i++)
+ fprintf(psfile,"%g %g l \n",wkx[i],wky[i]);
+*/
+}
+void X11GLEDevice::line_ary(int nwk,double *wkx,double *wky)
+{
+ int i;
+ dxy( wkx[0], wky[0], &ix, &iy);
+/* moveto(ix,iy); */
+ for (i=1;i<nwk;i++) {
+ dxy( wkx[i], wky[i], &ix, &iy);
+ }
+}
+/*---------------------------------------------------------------------------*/
+void X11GLEDevice::stroke()
+{
+ path_stroke();
+}
+/*---------------------------------------------------------------------------*/
+void X11GLEDevice::clip()
+{
+}
+/*---------------------------------------------------------------------------*/
+void X11GLEDevice::set_matrix(double newmat[3][3])
+{
+}
+/*---------------------------------------------------------------------------*/
+void X11GLEDevice::move(double zx,double zy)
+{
+}
+/*---------------------------------------------------------------------------*/
+void X11GLEDevice::reverse() /* reverse the order of stuff in the current path */
+{
+}
+/*---------------------------------------------------------------------------*/
+void X11GLEDevice::closepath()
+{
+ if (g.inpath==true) {
+ path_close();
+ return;
+ }
+ g_line(g.closex,g.closey);
+}
+/*---------------------------------------------------------------------------*/
+void X11GLEDevice::line(double zx,double zy)
+{
+ static int ux,uy;
+ dxy(g.curx,g.cury,&ux,&uy);
+ dxy(zx,zy,&ix,&iy);
+ if (g.inpath==true) {
+ if (!g.xinline) path_move(ux,uy);
+ path_line(ix,iy);
+ return;
+ }
+ XDrawLine(dpy,window1,gc,ux,uy,ix,iy);
+}
+/*---------------------------------------------------------------------------*/
+void X11GLEDevice::clear()
+{
+}
+/*---------------------------------------------------------------------------*/
+void X11GLEDevice::flush()
+{
+}
+/*---------------------------------------------------------------------------*/
+void polar_xy(double r, double angle, double *dx, double *dy);
+void xy_polar(double dx,double dy,double *radius,double *angle);
+
+#ifdef OLDARC /* draws weird things */
+void X11GLEDevice::arcto(dbl x1,dbl y1,dbl x2,dbl y2,dbl rrr)
+{
+ double x0,y0,r1,a1,r2,a2,r3,a3,a4,r5,ssx,ssy,ex,ey;
+ double bx1,by1,bx2,by2,dist,neg;
+ g_get_xy(&x0,&y0);
+ xy_polar(x1-x0,y1-y0,&r1,&a1);
+ xy_polar(x2-x1,y2-y1,&r2,&a2);
+ neg = 1;
+ a4 = (180-a2+a1);
+ a3 = a2 + (a4/2);
+ if ((a4/2)>90 && (a4/2)<180 ) neg = -1;
+ if ((a4/2)<0 && (a4/2)>-90 ) neg = -1;
+ r3 = neg*rrr/(tan((GLE_PI/180)*a4/2));
+ dbg gprint("rrr %g a4/2 %g t=%g a2=%g a1=%g r1=%g r2=%g r3=%g \n",rrr,a4/2,tan(a4/2),a2,a1,r1,r2,r3);
+ polar_xy(-r3,a1,&ssx,&ssy); ssx += x1; ssy += y1;
+ polar_xy(r3,a2,&ex,&ey); ex += x1; ey += y1;
+ g_line(ssx,ssy);
+ dist = sqrt((ex-ssx) * (ex-ssx) + (ey-ssy)*(ey-ssy));
+ polar_xy(r1+ dist/2.5-r3,a1,&bx1,&by1); bx1 += x0; by1 += y0;
+ polar_xy(-r2+ -dist/2.5+r3,a2,&bx2,&by2); bx2 += x2; by2 += y2;
+ g_bezier(bx1,by1,bx2,by2,ex,ey);
+ g_line(x2,y2);
+}
+/*---------------------------------------------------------------------------*/
+void X11GLEDevice::arc(dbl r, dbl t1, dbl t2, dbl cx, dbl cy)
+{
+ static int ixr,iyr,icx,icy,a1,a2;
+ double ux,uy,z;
+ dxy(cx,cy,&icx,&icy);
+ rxy(r,r,&ixr,&iyr);
+ if (t1>t2) {z = t1; t1 = t2; t2 = z;}
+ a1 = t1*64; a2 = t2*64 - a1;
+ XDrawArc(dpy,window1,gc,icx-ixr,icy-iyr,ixr*2,iyr*2,a1,a2);
+}
+/*---------------------------------------------------------------------------*/
+void X11GLEDevice::narc(dbl r, dbl t1, dbl t2, dbl cx, dbl cy)
+{
+ static int ixr,iyr,icx,icy,a1,a2;
+ double ux,uy,z;
+ dxy(cx,cy,&icx,&icy);
+ rxy(r,r,&ixr,&iyr);
+ if (t1>t2) {z = t1; t1 = t2; t2 = z;}
+ a1 = t1*64; a2 = t2*64 - a1;
+ XDrawArc(dpy,window1,gc,icx-ixr,icy-iyr,ixr*2,iyr*2,a1,a2);
+}
+/*---------------------------------------------------------------------------*/
+#else /* arc code from easydev.c */
+#define CSTEP (360/6)
+void df_arcto(dbl x1,dbl y1,dbl x2,dbl y2,dbl rrr)
+{
+ double x0,y0,r1,a1,r2,a2,r3,a4,sx,sy,ex,ey;
+ double bx1,by1,bx2,by2,dist,neg;
+ g_get_xy(&x0,&y0);
+ xy_polar(x1-x0,y1-y0,&r1,&a1);
+ xy_polar(x2-x1,y2-y1,&r2,&a2);
+ neg = 1;
+ a4 = (180-a2+a1);
+ if ((a4/2)>90 && (a4/2)<180 ) neg = -1;
+ if ((a4/2)<0 && (a4/2)>-90 ) neg = -1;
+ r3 = neg*rrr/(tan((GLE_PI/180)*a4/2));
+ polar_xy(-r3,a1,&sx,&sy); sx += x1; sy += y1;
+ polar_xy(r3,a2,&ex,&ey); ex += x1; ey += y1;
+ g_line(sx,sy);
+ dist = sqrt((ex-sx)*(ex-sx) + (ey-sy)*(ey-sy));
+ polar_xy(r1+ dist/2.5-r3,a1,&bx1,&by1); bx1 += x0; by1 += y0;
+ polar_xy(-r2+ -dist/2.5+r3,a2,&bx2,&by2); bx2 += x2; by2 += y2;
+ g_bezier(bx1,by1,bx2,by2,ex,ey);
+ g_line(x2,y2);
+}
+void xdf_barc(double r,dbl t1,dbl t2,dbl cx,dbl cy)
+{
+ double rx1,ry1,rx2,ry2,d,dx1,dy1,dx2,dy2;
+
+ polar_xy(r,t1,&rx1,&ry1);
+ polar_xy(r,t2,&rx2,&ry2);
+ d = sqrt( (rx2-rx1)*(rx2-rx1) + (ry2-ry1)*(ry2-ry1));
+ polar_xy(d/3,t1+90,&dx1,&dy1);
+ polar_xy(d/3,t2-90,&dx2,&dy2);
+ if (g.inpath) {
+ g_line(rx1+cx,ry1+cy);
+ g_bezier(rx1+cx+dx1,ry1+cy+dy1
+ ,rx2+cx+dx2,ry2+cy+dy2,rx2+cx,ry2+cy);
+ } else {
+ g_move(rx1+cx,ry1+cy);
+ g_bezier(rx1+cx+dx1,ry1+cy+dy1
+ ,rx2+cx+dx2,ry2+cy+dy2,rx2+cx,ry2+cy);
+ g_move(cx,cy);
+ }
+}
+
+void df_arc(dbl r,dbl t1,dbl t2,dbl cx,dbl cy)
+{
+ /* circle from t1 to t2, lets use 6 bezier's for a circle */
+ double stz;
+ int nst,i;
+
+ for (;t2<t1;)
+ t2 = t2 + 360;
+
+ nst = (int) (floor((t2-t1)/CSTEP)+1);
+ stz = (t2-t1) / nst;
+ for (i=1;i<=nst;i++)
+ xdf_barc(r,t1+stz*(i-1),t1+stz*i,cx,cy);
+}
+
+void X11GLEDevice::arcto(dbl x1,dbl y1,dbl x2,dbl y2,dbl rrr)
+{
+ df_arcto(x1,y1,x2,y2,rrr);
+}
+/*---------------------------------------------------------------------------*/
+void X11GLEDevice::arc(dbl r,dbl t1,dbl t2,dbl cx,dbl cy)
+{
+ df_arc(r,t1,t2,cx,cy);
+}
+/*---------------------------------------------------------------------------*/
+void X11GLEDevice::narc(dbl r,dbl t1,dbl t2,dbl cx,dbl cy)
+{
+ /* swap t1 and t2 */
+ df_arc(r,t2,t1,cx,cy);
+}
+/*---------------------------------------------------------------------------*/
+#endif /* OLDARC */
+/*---------------------------------------------------------------------------*/
+
+void X11GLEDevice::box_fill(dbl x1, dbl y1, dbl x2, dbl y2)
+{
+#ifdef OLDARC
+ static int ix1,iy1,ix2,iy2;
+ static int ii;
+ dxy(x1,y1,&ix1,&iy1);
+ dxy(x2,y2,&ix2,&iy2);
+ if (ix1>ix2) { ii = ix1; ix1 = ix2; ix2 = ii; }
+ if (iy1>iy2) { ii = iy1; iy1 = iy2; iy2 = ii; }
+ XFillRectangle(dpy,window1,gcf,ix1,iy1,ix2-ix1,iy2-iy1);
+#else
+ XPoint point[4];
+ int n = 0;
+
+ dxy_short(x1,y1,&point[n].x,&point[n].y); n++;
+ dxy_short(x2,y1,&point[n].x,&point[n].y); n++;
+ dxy_short(x2,y2,&point[n].x,&point[n].y); n++;
+ dxy_short(x1,y2,&point[n].x,&point[n].y);
+
+ XFillPolygon(dpy,window1,gcf,point,4,Convex,CoordModeOrigin);
+#endif
+}
+void X11GLEDevice::box_stroke(dbl x1, dbl y1, dbl x2, dbl y2, bool reverse)
+{
+ g_move(x1,y1);
+ g_line(x2,y1);
+ g_line(x2,y2);
+ g_line(x1,y2);
+ g_line(x1,y1);
+}
+/*---------------------------------------------------------------------------*/
+void X11GLEDevice::circle_stroke(double zr)
+{
+#ifdef OLDARC
+ static int ixr,iyr;
+ int ux,uy;
+ rxy(zr,zr,&ixr,&iyr);
+ ixr =(fabs(ixr)+fabs(iyr))/2;
+ dxy(g.curx,g.cury,&ux,&uy);
+ XDrawArc(dpy,window1,gc,ux-ixr,uy-ixr,ixr*2,ixr*2,0,64*360);
+#else
+ arc(zr,0,360,g.curx,g.cury);
+#endif
+}
+void X11GLEDevice::circle_fill(double zr)
+{
+#ifdef OLDARC
+ static int ixr,iyr;
+ int rr;
+ int ux,uy;
+ rxy(zr,zr,&ixr,&iyr);
+ rr = (fabs(ixr)+fabs(iyr))/2;
+ dxy(g.curx,g.cury,&ux,&uy);
+ XFillArc(dpy,window1,gcf,ux-rr,uy-rr,rr*2,rr*2,0,64*360);
+#else
+ if (!g.inpath){
+ g_set_path(true);
+ g_newpath();
+ g_arc(zr,0,360,g.curx,g.cury,0);
+ g_closepath();
+ g_fill();
+ g_set_path(false);
+ }
+ else
+ g_arc(zr,0,360,g.curx,g.cury,0);
+#endif
+}
+/*---------------------------------------------------------------------------*/
+void X11GLEDevice::bezier(dbl x1,dbl y1,dbl x2,dbl y2,dbl x3,dbl y3)
+{
+ double ax,bx,cx,ay,by,cy,dist;
+ double xxx,yyy,i,t,nstep,x0,y0;
+ g_get_xy(&x0,&y0);
+ dist = fabs(x3-x0) + fabs(y3-y0);
+ nstep = 12;
+ if (dist<1) nstep = 7;
+ if (dist<.5) nstep = 3;
+ if (dist<.1) {
+ g_line(x3,y3);
+ return;
+ }
+ cx = (x1-x0)*3;
+ bx = (x2-x1)*3-cx;
+ ax = x3-x0-cx-bx;
+ cy = (y1-y0)*3;
+ by = (y2-y1)*3-cy;
+ ay = y3-y0-cy-by;
+ for (i=0;i<=nstep;i++) {
+ t = i/nstep;
+ xxx = ax*pow(t,3.0) + bx*t*t + cx*t + x0;
+ yyy = ay*pow(t,3.0) + by*t*t + cy*t + y0;
+ g_line(xxx,yyy);
+ }
+}
+/*---------------------------------------------------------------------------*/
+void X11GLEDevice::set_color(const GLERC<GLEColor>& color) /* colors slightly changed a.r. */
+{
+ int f = color->getHexValueGLE();
+ int i;
+ colortyp cc;
+ cc.l = f;
+ i = 1;
+
+ /* process grey stuff first */
+ if (cc.b[B_R] == cc.b[B_G] && cc.b[B_G] == cc.b[B_B]) {
+ if (cc.b[B_R] < 25) i = 1; /* black */
+ if (cc.b[B_R] >= 25) i = 11;
+ if (cc.b[B_R] >= 50) i = 12;
+ if (cc.b[B_R] >= 75) i = 13;
+ if (cc.b[B_R] >= 100) i = 14;
+ if (cc.b[B_R] >= 125) i = 15;
+ if (cc.b[B_R] >= 150) i = 16;
+ if (cc.b[B_R] >= 175) i = 17;
+ if (cc.b[B_R] >= 200) i = 18;
+ if (cc.b[B_R] >= 225) i = 19;
+ if (cc.b[B_R] >= 250) i = 0; /* white */
+ }
+ else {
+ if (cc.b[B_R]>=10 && cc.b[B_G]>=10 && cc.b[B_B]>=10) i = 9;
+ if (cc.b[B_R]>60 && cc.b[B_G]>60 && cc.b[B_B]>60) i = 8;
+ if (cc.b[B_R]>80) i = 25;
+ if (cc.b[B_R]>175) i = 2;
+ if (cc.b[B_B]>80) i = 26;
+ if (cc.b[B_B]>175) i = 4;
+ if (cc.b[B_G]>80) i = 27;
+ if (cc.b[B_G]>175) i = 3;
+ if (cc.b[B_R]>100 && cc.b[B_G]>100) i = 5;
+ if (cc.b[B_G]>100 && cc.b[B_B]>100) i = 7;
+ if (cc.b[B_R]>30 && cc.b[B_B]>100) i = 6;
+ if (cc.b[B_R]>100 && cc.b[B_G]>100 && cc.b[B_B]>100) i = 8;
+ if (cc.b[B_R]<10 && cc.b[B_G]<10 && cc.b[B_B]<10) i = 1;
+ if (cc.b[B_R]>250 && cc.b[B_G]>250 && cc.b[B_B]>250) i = 0;
+ /* violet */
+ if (cc.b[B_R]>230 && cc.b[B_G]>110 && cc.b[B_B]>230) i = 23;
+ /* orange: */
+ if (cc.b[B_R]>245 && cc.b[B_G]>150
+ && cc.b[B_G]<180 && cc.b[B_B]<10) i = 21;
+ /* brown */
+ if (cc.b[B_R]>150 && cc.b[B_G]>35 && cc.b[B_B]>35
+ && cc.b[B_R]<180 && cc.b[B_G]<50 && cc.b[B_B]<50) i = 22;
+ /* pink */
+ if (cc.b[B_R]>250 && cc.b[B_G]>175 && cc.b[B_B]>185
+ && cc.b[B_G]<210 && cc.b[B_B]<225) i = 24;
+ /* darkpink */
+ if (cc.b[B_R]>129 && cc.b[B_G]>89 && cc.b[B_B]>98
+ && cc.b[B_R]<149 && cc.b[B_G]<100 && cc.b[B_B]<118 ) i = 32;
+ /* darkcyan */
+ if ( cc.b[B_G]>120 && cc.b[B_B]>120
+ && cc.b[B_R]<25 && cc.b[B_G]<160 && cc.b[B_B]<160 ) i = 33;
+ /* khaki */
+ if (cc.b[B_R]>225 && cc.b[B_G]>215 && cc.b[B_B]>120
+ && cc.b[B_G]<245 && cc.b[B_B]<160 ) i = 30;
+ /* darkkhaki */
+ if (cc.b[B_R]>120 && cc.b[B_G]>119 && cc.b[B_B]>50
+ && cc.b[B_R]<160 && cc.b[B_G]<150 && cc.b[B_B]<100 ) i = 31;
+ /* tan */
+ if (cc.b[B_R]>190 && cc.b[B_G]>160 && cc.b[B_B]>120
+ && cc.b[B_R]<230 && cc.b[B_G]<200 && cc.b[B_B]<160 ) i = 28;
+ /* tan4 */
+ if (cc.b[B_R]>129 && cc.b[B_G]>70 && cc.b[B_B]>23
+ && cc.b[B_R]<169 && cc.b[B_G]<110 && cc.b[B_B]<63 ) i = 29;
+ /* magenta */
+ if (cc.b[B_R]>238 && cc.b[B_G]<20 && cc.b[B_B]>238) i = 6;
+ }
+ setcolor(i);
+}
+
+void X11GLEDevice::set_fill(const GLERC<GLEColor>& fill) /* colors slightly changed a.r. */
+{
+ int f = fill->getHexValueGLE();
+ int i, j;
+ colortyp cc;
+ cc.l = f;
+ i = 1;
+ j = 0;
+ if (cc.b[B_F] == 1) /* colours */
+ {
+ /* process grey stuff first */
+ if (cc.b[B_R] == cc.b[B_G] && cc.b[B_G] == cc.b[B_B]) {
+ if (cc.b[B_R] < 25) i = 1; /* black */
+ if (cc.b[B_R] >= 25) i = 11;
+ if (cc.b[B_R] >= 50) i = 12;
+ if (cc.b[B_R] >= 75) i = 13;
+ if (cc.b[B_R] >= 100) i = 14;
+ if (cc.b[B_R] >= 125) i = 15;
+ if (cc.b[B_R] >= 150) i = 16;
+ if (cc.b[B_R] >= 175) i = 17;
+ if (cc.b[B_R] >= 200) i = 18;
+ if (cc.b[B_R] >= 225) i = 19;
+ if (cc.b[B_R] >= 250) i = 0; /* white */
+ }
+ else {
+ if (cc.b[B_R]>=10 && cc.b[B_G]>=10 && cc.b[B_B]>=10) i = 9;
+ if (cc.b[B_R]>60 && cc.b[B_G]>60 && cc.b[B_B]>60) i = 8;
+ if (cc.b[B_R]>60) i = 25;
+ if (cc.b[B_R]>175) i = 2;
+ if (cc.b[B_B]>60) i = 26;
+ if (cc.b[B_B]>175) i = 4;
+ if (cc.b[B_G]>60) i = 27;
+ if (cc.b[B_G]>175) i = 3;
+ if (cc.b[B_R]>100 && cc.b[B_G]>100) i = 5;
+ if (cc.b[B_G]>100 && cc.b[B_B]>100) i = 7;
+ if (cc.b[B_R]>30 && cc.b[B_B]>100) i = 6;
+ if (cc.b[B_R]>100 && cc.b[B_G]>100 && cc.b[B_B]>100) i = 8;
+ if (cc.b[B_R]<10 && cc.b[B_G]<10 && cc.b[B_B]< 10) i = 1;
+ if (cc.b[B_R]>250 && cc.b[B_G]>250 && cc.b[B_B]>250) i = 0;
+ /* violet */
+ if (cc.b[B_R]>230 && cc.b[B_G]>110 && cc.b[B_B]>230) i = 23;
+ /* orange: */
+ if (cc.b[B_R]>245 && cc.b[B_G]>150
+ && cc.b[B_G]<180 && cc.b[B_B]<10) i = 21;
+ /* brown */
+ if (cc.b[B_R]>150 && cc.b[B_G]>35 && cc.b[B_B]>35
+ && cc.b[B_R]<180 && cc.b[B_G]<50 && cc.b[B_B]<50) i = 22;
+ /* pink */
+ if (cc.b[B_R]>250 && cc.b[B_G]>175 && cc.b[B_B]>185
+ && cc.b[B_G]<210 && cc.b[B_B]<225) i = 24;
+ /* darkpink */
+ if (cc.b[B_R]>129 && cc.b[B_G]>89 && cc.b[B_B]>98
+ && cc.b[B_R]<149 && cc.b[B_G]<100 && cc.b[B_B]<118 ) i = 32;
+ /* darkcyan */
+ if ( cc.b[B_G]>120 && cc.b[B_B]>120
+ && cc.b[B_R]<25 && cc.b[B_G]<160 && cc.b[B_B]<160 ) i = 33;
+ /* khaki */
+ if (cc.b[B_R]>225 && cc.b[B_G]>215 && cc.b[B_B]>120
+ && cc.b[B_G]<245 && cc.b[B_B]<160 ) i = 30;
+ /* darkkhaki */
+ if (cc.b[B_R]>120 && cc.b[B_G]>119 && cc.b[B_B]>50
+ && cc.b[B_R]<160 && cc.b[B_G]<150 && cc.b[B_B]<100 ) i = 31;
+ /* tan */
+ if (cc.b[B_R]>190 && cc.b[B_G]>160 && cc.b[B_B]>120
+ && cc.b[B_R]<230 && cc.b[B_G]<200 && cc.b[B_B]<160 ) i = 28;
+ /* tan4 */
+ if (cc.b[B_R]>129 && cc.b[B_G]>70 && cc.b[B_B]>23
+ && cc.b[B_R]<169 && cc.b[B_G]<110 && cc.b[B_B]<63 ) i = 29;
+ /* magenta */
+ if (cc.b[B_R]>238 && cc.b[B_G]<20 && cc.b[B_B]>238) i = 6;
+ }
+ XSetFillStyle(dpy, gcf, FillSolid);
+ d_fillcolor = i;
+ setfillcolor(i);
+ }
+ if (cc.b[B_F] == 2) /* grids and shades */
+ {
+ if (cc.b[B_R]==0x00 && cc.b[B_G]==0x00 && cc.b[B_B]==0x20) j=0; /* SHADE */
+ if (cc.b[B_R]==0x04 && cc.b[B_G]==0x00 && cc.b[B_B]==0x0C) j=1; /* SHADE1 */
+ if (cc.b[B_R]==0x00 && cc.b[B_G]==0x00 && cc.b[B_B]==0x10) j=2; /* SHADE2 */
+ if (cc.b[B_R]==0x05 && cc.b[B_G]==0x00 && cc.b[B_B]==0x20) j=3; /* SHADE3 */
+ if (cc.b[B_R]==0x10 && cc.b[B_G]==0x00 && cc.b[B_B]==0x40) j=4; /* SHADE4 */
+ if (cc.b[B_R]==0x20 && cc.b[B_G]==0x00 && cc.b[B_B]==0x60) j=5; /* SHADE5 */
+ if (cc.b[B_R]==0x00 && cc.b[B_G]==0x20 && cc.b[B_B]==0x20) j=6; /* GRID */
+ if (cc.b[B_R]==0x04 && cc.b[B_G]==0x0f && cc.b[B_B]==0x0f) j=7; /* GRID1 */
+ if (cc.b[B_R]==0x00 && cc.b[B_G]==0x10 && cc.b[B_B]==0x10) j=8; /* GRID2 */
+ if (cc.b[B_R]==0x05 && cc.b[B_G]==0x20 && cc.b[B_B]==0x20) j=9; /* GRID3 */
+ if (cc.b[B_R]==0x10 && cc.b[B_G]==0x40 && cc.b[B_B]==0x40) j=10;/* GRID4 */
+ if (cc.b[B_R]==0x20 && cc.b[B_G]==0x60 && cc.b[B_B]==0x60) j=11;/* GRID5 */
+ setfillcolor(1); /* black */
+ setfillstyle(j);
+ }
+ else
+ {
+ XSetFillStyle(dpy, gcf, FillSolid);
+ setfillcolor(d_fillcolor);
+ }
+}
+
+/*---------------------------------------------------------------------------*/
+
+void X11GLEDevice::beginclip() {
+}
+
+void X11GLEDevice::endclip() {
+}
+
+struct X11_char_data {float wx,wy,x1,y1,x2,y2; };
+
+void X11GLEDevice::dochar(int font, int cc) {
+ in_font = true;
+ if (safnt==0) safnt = pass_font("PLSR");
+ if (font_get_encoding(font)>2) {
+ my_char(font,cc);
+ in_font = false;
+ return;
+ }
+ my_char(safnt,cc);
+ in_font = false;
+}
+
+
+int X11GLEDevice::wait_expose(void) {
+ /* Wait till he presses key or clicks mouse */
+ XEvent ereturn;
+ int emask;
+
+/* for (;;) {
+ XNextEvent(dpy,&ereturn);
+ wprintf("Event %d %d %d %d\n",ereturn.type,Expose,ButtonPress,
+ VisibilityNotify);
+ gle_scr_refresh();
+ }
+*/
+/* XSync(dpy,True); */
+ emask = ExposureMask | ButtonPressMask | KeyPressMask;
+ XWindowEvent(dpy, window1, emask, &ereturn);
+ return 0;
+}
+
+int X11GLEDevice::set_expose(void) {
+ int emask;
+
+ emask = ExposureMask | ButtonPressMask | KeyPressMask
+ | VisibilityChangeMask;
+
+/* #define X11R5 true for X11R5 and R6 */
+#define X11R5 true
+#ifdef X11R5
+ XSelectInput(dpy, window1, emask);
+#else
+ XSelectInput(dpy, window1, emask, &ereturn);
+#endif
+ return 0;
+}
+
+enum {P_MOVE,P_LINE,P_BEZIER};
+
+void X11GLEDevice::path_move(int x, int y) {
+ startx = x; starty = y;
+ pnts[npnts].type = P_MOVE;
+ pnts[npnts].x = x;
+ pnts[npnts++].y = y;
+}
+
+void X11GLEDevice::path_line(int x, int y) {
+ pnts[npnts].type = P_LINE;
+ pnts[npnts].x = x;
+ pnts[npnts++].y = y;
+}
+
+void X11GLEDevice::path_close(void) {
+ pnts[npnts].type = P_LINE;
+ pnts[npnts].x = startx;
+ pnts[npnts++].y = starty;
+}
+
+void X11GLEDevice::path_fill(void) {
+ XPoint pts[X11_PATH_LENGTH];
+ int i,npts;
+
+ for (i=0; i<npnts; i++) {
+ if (pnts[i].type==P_LINE) {
+ npts = 0;
+ pts[npts].x = pnts[i].x;
+ pts[npts++].y = pnts[i++].y;
+ for (;pnts[i].type==P_LINE && i<npnts;i++) {
+ pts[npts].x = pnts[i].x;
+ pts[npts++].y = pnts[i].y;
+ }
+ XFillPolygon(dpy,window1,gcf,pts,npts,Complex, CoordModeOrigin);
+ }
+ }
+}
+
+void X11GLEDevice::path_newpath(void) {
+ npnts = 0;
+}
+
+void X11GLEDevice::path_stroke(void) {
+ for (i=1; i<npnts; i++) {
+ if (pnts[i].type==P_LINE) {
+ XDrawLine(dpy,window1,gc,
+ pnts[i-1].x,pnts[i-1].y,
+ pnts[i].x,pnts[i].y);
+ }
+ }
+}
+
+/* new gle 4.x stuff */
+
+void X11GLEDevice::ellipse_fill(double rx, double ry) {
+}
+
+void X11GLEDevice::ellipse_stroke(double rx, double ry) {
+}
+
+void X11GLEDevice::elliptical_arc(double rx,double ry,double t1,double t2,double cx,double cy) {
+}
+
+void X11GLEDevice::elliptical_narc(double rx,double ry,double t1,double t2,double cx,double cy) {
+}
+
+/*
+void X11GLEDevice::get_line_cap(int *i)
+{
+}
+*/
+
+void X11GLEDevice::pscomment(char* ss) {
+}
+
+void X11GLEDevice::set_color() {
+ /*
+ if (BLACKANDWHITE) {
+ fprintf(psfile,"%g setgray \n",((g_cur_color.b[B_R]*3.0/255.0
+ +g_cur_color.b[B_G]*2.0/255.0+g_cur_color.b[B_B]/255.0) / 6));
+ } else
+ fprintf(psfile,"%g %g %g setrgbcolor \n",g_cur_color.b[B_R]/255.0
+ ,g_cur_color.b[B_G]/255.0,g_cur_color.b[B_B]/255.0);
+ */
+}
+
+void X11GLEDevice::set_fill() {
+ /*
+ if (BLACKANDWHITE) {
+ fprintf(psfile,"%g setgray \n",((g_cur_fill.b[B_R]*3.0/255.0
+ +g_cur_fill.b[B_G]*2.0/255.0+g_cur_fill.b[B_B]/255.0) / 6));
+ } else
+ fprintf(psfile,"%g %g %g setrgbcolor \n",g_cur_fill.b[B_R]/255.0
+ ,g_cur_fill.b[B_G]/255.0,g_cur_fill.b[B_B]/255.0);
+ */
+}
+
+void X11GLEDevice::xdbox(double x1, double y1, double x2, double y2) {
+ /*
+ fprintf(psfile," %g %g moveto %g %g l %g %g l %g %g l closepath \n",
+ x1,y1,x2,y1,x2,y2,x1,y2);
+ */
+}
+
+
+FILE* X11GLEDevice::get_file_pointer(void) {
+ return (FILE*) NULL;
+}
+
+int X11GLEDevice::getDeviceType() {
+ return GLE_DEVICE_X11;
+}
+
+#endif
diff --git a/src/gle/drawit.cpp b/src/gle/drawit.cpp
new file mode 100644
index 0000000..290aedd
--- /dev/null
+++ b/src/gle/drawit.cpp
@@ -0,0 +1,405 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#include "all.h"
+#include "tokens/stokenizer.h"
+#include "tokens/Tokenizer.h"
+#include "mem_limits.h"
+#include "token.h"
+#include "core.h"
+#include "var.h"
+#include "glearray.h"
+#include "polish.h"
+#include "pass.h"
+#include "file_io.h"
+#include "gprint.h"
+#include "cmdline.h"
+#include "config.h"
+#include "drawit.h"
+#include "cutils.h"
+#include "gle-interface/gle-interface.h"
+#include "keyword.h"
+#include "run.h"
+
+#define dbg if (gle_debug>0)
+extern int gle_debug;
+extern int this_line;
+int trace_on;
+int **gpcode; /* gpcode is a pointer to an array of poiter to int */
+int *gplen; /* gpcode is a pointer to an array of int */
+int ngpcode=0;
+int ngerror;
+extern int last_line;
+char *dr_nextline(int *srclin);
+void dr_init(void);
+int getch(void);
+int abort_flag;
+GLEGlobalSource* g_Source = NULL;
+void g_close();
+int gle_is_open();
+GLERun* g_GLERun = NULL;
+
+extern CmdLineObj g_CmdLine;
+
+GLERun* getGLERunInstance() {
+ return g_GLERun;
+}
+
+void text_load_include(GLEParser* parser, const string& fname, GLESourceLine* code, GLESourceFile* file) throw(ParserError);
+
+void gle_set_constants() {
+ GLEMemoryCell value;
+ GLE_MC_INIT(value);
+ var_findadd_set("PI", GLE_PI);
+ GLE_MC_SET_BOOL(&value, true);
+ var_findadd_set("TRUE", &value);
+ GLE_MC_SET_BOOL(&value, false);
+ var_findadd_set("FALSE", &value);
+}
+
+void do_set_vars() {
+ gle_set_constants();
+ var_findadd_set("XGMIN", 0.0);
+ var_findadd_set("YGMIN", 0.0);
+ var_findadd_set("XGMAX", 0.0);
+ var_findadd_set("YGMAX", 0.0);
+ var_findadd_set("X2GMIN", 0.0);
+ var_findadd_set("Y2GMIN", 0.0);
+ var_findadd_set("X2GMAX", 0.0);
+ var_findadd_set("Y2GMAX", 0.0);
+ var_findadd_set("ZGMIN", 0.0);
+ var_findadd_set("ZGMAX", 0.0);
+}
+
+/*---------------------------------------------------------------------------*/
+
+void output_error(ParserError& err) {
+ g_set_error_column(-1);
+ if (err.hasFlag(TOK_PARSER_ERROR_ATEND)) {
+ // Otherwise, the message would be "unexpected end of file"
+ err.setMessage("unexpected end of line");
+ }
+ if (err.hasFlag(TOK_PARSER_ERROR_PSTRING)) {
+ if (err.file() == "") {
+ gprint(string(">> Error: ")+err.msg()+"\n");
+ } else {
+ string err_str;
+ err.toString(err_str);
+ gprint(string(">> Error: ")+err_str+"\n");
+ }
+ if (err.getColumn() != -1) {
+ stringstream pos_strm;
+ pos_strm << ">> In: '";
+ int delta = showLineAbbrev(err.getParserString(), err.getColumn(), pos_strm);
+ pos_strm << "'" << endl;
+ pos_strm << ">>";
+ for (int i = 0; i < err.getColumn()+5-delta; i++) {
+ pos_strm << " ";
+ }
+ pos_strm << "^" << endl;
+ gprint(pos_strm.str());
+ }
+ } else {
+ if (err.file() == "") {
+ // Error in the GLE file
+ g_set_error_column(err.getColumn());
+ gprint(string(">> Error: ")+err.msg()+"\n");
+ } else {
+ // Error while reading a data file
+ string err_str;
+ err.toString(err_str);
+ gprint(string(">> Error: ")+err_str+"\n");
+ }
+ }
+}
+
+void output_error_cerr(ParserError& err) {
+ // Used by GLE "as a calculator", i.e., if no GLE file is active
+ if (err.hasFlag(TOK_PARSER_ERROR_ATEND)) {
+ // Otherwise, the message would be "unexpected end of file"
+ err.setMessage("unexpected end of line");
+ }
+ if (err.hasFlag(TOK_PARSER_ERROR_PSTRING)) {
+ cerr << ">> Error: " << err.msg() << endl;
+ if (err.getColumn() != -1) {
+ cerr << ">> In: '" << err.getParserString() << "'" << endl;
+ stringstream pos_strm;
+ pos_strm << ">>";
+ for (int i = 0; i < err.getColumn()+5; i++) {
+ pos_strm << " ";
+ }
+ pos_strm << "^" << endl;
+ cerr << pos_strm.str();
+ }
+ } else {
+ cerr << ">> Error: " << err.msg() << endl;
+ }
+}
+
+void validate_open_input_stream(ifstream& input, const string& fname) throw(ParserError) {
+ string expanded(GLEExpandEnvironmentVariables(fname));
+ validate_file_name(expanded, true);
+ input.open(expanded.c_str());
+ if (!input.is_open()) {
+ g_throw_parser_error_sys("unable to open file '", expanded.c_str(), "'");
+ }
+}
+
+FILE* validate_fopen(const string& fname, const char *mode, bool isread) throw(ParserError) {
+ string expanded(GLEExpandEnvironmentVariables(fname));
+ validate_file_name(expanded, isread);
+ FILE* result = fopen(expanded.c_str(), mode);
+ if (result == NULL) {
+ if (isread) g_throw_parser_error_sys("unable to open file '", expanded.c_str(), "'");
+ else g_throw_parser_error_sys("unable to create file '", expanded.c_str(), "'");
+ }
+ return result;
+}
+
+void validate_file_name(const string& fname, bool isread) throw(ParserError) {
+ GLEInterface* iface = GLEGetInterfacePointer();
+ if (iface->hasFileInfos()) {
+ GLEFileLocation finfo;
+ finfo.fromFileNameCrDir(fname);
+ iface->addFileInfo(finfo);
+ }
+ GLEGlobalConfig* conf = iface->getConfig();
+ if (conf->getCmdLine()->hasOption(GLE_OPT_SAFEMODE)) {
+ bool allow = false;
+ string fullpath, dirname;
+ GLEGetCrDir(&dirname);
+ GLEGetFullPath(dirname, fname, fullpath);
+ // cout << "full path: " << fullpath << endl;
+ GetDirName(fullpath, dirname);
+ StripDirSepButNotRoot(dirname);
+ int nbread = conf->getNumberAllowReadDirs();
+ if (nbread > 0 && isread) {
+ for (int i = 0; i < nbread; i++) {
+ if (conf->getAllowReadDir(i) == dirname) {
+ allow = true;
+ }
+ }
+ if (allow) {
+ return;
+ } else {
+ g_throw_parser_error("safe mode - reading not allowed in directory '", dirname.c_str(), "'");
+ }
+ }
+ int nbwrite = conf->getNumberAllowWriteDirs();
+ if (nbwrite > 0 && !isread) {
+ for (int i = 0; i < nbwrite; i++) {
+ if (conf->getAllowWriteDir(i) == dirname) {
+ allow = true;
+ }
+ }
+ if (allow) {
+ return;
+ } else {
+ g_throw_parser_error("safe mode - writing not allowed in directory '", dirname.c_str(), "'");
+ }
+ }
+ g_throw_parser_error("safe mode - can not access '", fname.c_str(), "': file system access has been disabled");
+ }
+}
+
+void DrawIt(GLEScript* script, GLEFileLocation* outfile, CmdLineObj* cmdline, bool silent) throw (ParserError) {
+ GLEGlobalSource* glecode = script->getSource();
+ GLEInterface* iface = script->getGLEInterface();
+ script->cleanUp();
+ g_Source = glecode;
+ abort_flag = false;
+ ngerror = 0;
+ last_line = 0;
+ if (!silent && g_verbosity() > 0) {
+ string version;
+ g_get_version(&version);
+ cerr << "GLE " << version << "[" << script->getLocation()->getName() << "]-C";
+ cerr.flush();
+ g_set_console_output(false);
+ }
+ g_clear();
+ var_clear();
+ mark_clear();
+ sub_clear(iface->isCommitMode());
+ clear_run();
+ f_init();
+ if (cmdline != NULL) {
+ int devtype = g_get_device();
+ if (devtype == GLE_DEVICE_PS) {
+ g_set_fullpage(true);
+ } else {
+ g_set_fullpage(cmdline->hasOption(GLE_OPT_FULL_PAGE));
+ }
+ g_set_rotate_fullpage(cmdline->hasOption(GLE_OPT_LANDSCAPE));
+ }
+ g_set_pagesize(gle_config_papersize());
+ g_set_margins(gle_config_margins());
+ do_set_vars();
+ GLEPcodeList* pc_list = new GLEPcodeList();
+ GLEPcodeIndexed* pcode = new GLEPcodeIndexed(pc_list);
+ script->setPcode(pcode);
+ GLEPolish* polish = new GLEPolish();
+ script->setPolish(polish);
+ polish->initTokenizer();
+ // Create tokenizer
+ GLEParser* parser = new GLEParser(script, polish);
+ script->setParser(parser);
+ parser->initTokenizer();
+ try {
+ // Auto-include "compatibility.gle" if compatibilty mode is not most recent
+ string compat = "compatibility.gle";
+ if ((g_get_compatibility() < GLE_COMPAT_MOST_RECENT) && !glecode->includes(compat)) {
+ GLESourceFile* includefile = new GLESourceFile();
+ text_load_include(parser, compat, NULL, includefile);
+ glecode->insertIncludeNoOverwrite(0, includefile);
+ }
+ set_global_parser(parser);
+ pcode->addIndex(pcode->size());
+ for (int crline = 0; crline < glecode->getNbLines(); crline++) {
+ // call passt to convert the tokens into PCode
+ // pcode is simply numbers that instruct the drawing
+ // engine which commands to draw
+ // cout << "Line = " << *crline;
+
+ int prevSize = pcode->size();
+ GLESourceLine* code = glecode->getLine(crline);
+ parser->setString(code->getCodeCStr());
+ try {
+ parser->passt(*code, *pcode);
+ } catch (ParserError& err) {
+ output_error(err);
+ }
+ bool add_pcode = true;
+ if (parser->hasSpecial(GLE_PARSER_INCLUDE) && !glecode->includes(parser->getInclude())) {
+ // this is a file to include load the file and insert it into glecode here
+ GLESourceFile* includefile = new GLESourceFile();
+ text_load_include(parser, parser->getInclude(), code, includefile);
+ glecode->insertInclude(crline, includefile);
+ crline--;
+ if (g_verbosity() > 5) {
+ cerr << "{" << parser->getInclude() << "}";
+ }
+ // don't need this pcode
+ add_pcode = false;
+ }
+ if (add_pcode) {
+ pcode->addIndex(pcode->size());
+ } else {
+ pcode->resize(prevSize);
+ }
+ }
+ parser->checkmode();
+ /* build global pcode index */
+ ngpcode = pcode->getNbEntries()-1;
+ if (gpcode != NULL) free(gpcode);
+ if (gplen != NULL) free(gplen);
+ gpcode = (int**)malloc(sizeof(int*)*(ngpcode+1));
+ gplen = (int*)malloc(sizeof(int)*(ngpcode+1));
+ for (int i = 0; i < ngpcode; i++) {
+ gplen[i+1] = pcode->getSize(i);
+ gpcode[i+1] = &(*pcode)[0] + pcode->getIndex(i);
+ }
+ } catch (ParserError& err) {
+ output_error(err);
+ }
+ // Create GLERun
+ GLERun* run = new GLERun(script, outfile, pcode);
+ run->setBlockTypes(parser->getBlockTypes());
+ script->setRun(run);
+ g_GLERun = run;
+ g_compatibility_settings();
+ // Exit if parser error (not: this should be done after GLERun has been created!)
+ if (ngerror > 0){
+ reset_new_error(true);
+ g_message("");
+ g_throw_parser_error("errors, aborting");
+ }
+ try {
+ //
+ // -- now run the pcode in the driver
+ //
+ if (!silent && g_verbosity() > 0) cerr << "-R-";
+ if (ngpcode != glecode->getNbLines()) {
+ cerr << "error pcode and text size mismatch"<<endl;
+ cerr << "pcode size = " << ngpcode <<" text size = "<<glecode->getNbLines()<<endl;
+ }
+ token_space();
+ int endp = 0;
+ // should get rid of glecode here!
+ bool mkdrobjs = iface->isMakeDrawObjects();
+ for (int i=1;i<=ngpcode;i++){
+ this_line = i;
+ GLESourceLine* code = glecode->getLine(i-1);
+ run->do_pcode(*code,&i,gpcode[i],gplen[i],&endp,mkdrobjs);
+ }
+ } catch (ParserError& err) {
+ output_error(err);
+ }
+ if (!gle_is_open()) {
+ // If .gle file is empty, create empty postscript file
+ if (!g_has_size()) g_set_size(10, 10, false);
+ g_open(outfile, glecode->getLocation()->getName());
+ }
+ bool has_console = g_reset_message();
+ g_close();
+ g_set_console_output(has_console);
+}
+
+void text_load_include(GLEParser* parser, const string& fname, GLESourceLine* code, GLESourceFile* file) throw(ParserError) {
+ GLEFileLocation* loc = file->getLocation();
+ loc->setName(fname);
+ const string* dirname = NULL;
+ if (code != NULL) {
+ dirname = &(code->getSource()->getLocation()->getDirectory());
+ }
+ ifstream input;
+ string expanded(GLEExpandEnvironmentVariables(fname));
+ const string fullname(GetActualFilename(&input, expanded, dirname));
+ if (fullname == "") {
+ ostringstream errs;
+ errs << "include file not found: '" << expanded << "'";
+ throw parser->error(errs.str());
+ } else {
+ loc->setFullPath(fullname);
+ loc->initDirectory();
+ validate_file_name(fullname, true);
+ file->load(input);
+ input.close();
+ file->trim(0);
+ }
+}
diff --git a/src/gle/drawit.h b/src/gle/drawit.h
new file mode 100644
index 0000000..78ff4b9
--- /dev/null
+++ b/src/gle/drawit.h
@@ -0,0 +1,40 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+void CompileGLE(const string& output_file, GLEGlobalSource &glecode, CmdLineObj* cmdline, bool silent) throw(ParserError);
+void DrawIt(GLEScript* script, GLEFileLocation* outfile, CmdLineObj* cmdline, bool silent = false) throw (ParserError);
diff --git a/src/gle/eval.cpp b/src/gle/eval.cpp
new file mode 100644
index 0000000..5061e1b
--- /dev/null
+++ b/src/gle/eval.cpp
@@ -0,0 +1,1139 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#define GRAPHDEF extern
+
+#include "all.h"
+#include "tokens/stokenizer.h"
+#include "core.h"
+#include "glearray.h"
+#include "mem_limits.h"
+#include "var.h"
+#include "cutils.h"
+#include "gprint.h"
+#include "numberformat.h"
+#include "keyword.h"
+#include "run.h"
+#include "fn.h"
+#include "polish.h"
+#include "file_io.h"
+#include "cmdline.h"
+#include "graph.h"
+#include "sub.h"
+#include "file_io.h"
+#ifdef __WIN32__
+#include <time.h>
+#endif
+
+colortyp colvar;
+//
+// set this to zero if your compiler complains about acosh atanh and asinh
+//
+// #define HAVE_INVERSE_HYP <== obsolete should be done in config.i V.L.
+//
+#define true (!false)
+#define false 0
+char *eval_str();
+void var_getstr(int varnum,char *s);
+//int pass_marker(char *s);
+int f_eof(int chn);
+void gle_as_a_calculator(vector<string>* exprs);
+void output_error_cerr(ParserError& err);
+double xg3d(double x, double y, double z);
+double yg3d(double x, double y, double z);
+
+/*---------------------------------------------------------------------------*/
+/* bin = 10..29, binstr = 30..49, fn= 60...139, userfn=LOCAL_START_INDEX..nnn */
+/* pcode:, 1=exp,len 2=float,val 3=var,int 4,string_var, 5=string,.../0 */
+/*---------------------------------------------------------------------------*/
+/* Input is exp-pcode, output is number or string */
+
+const char *binop[] = { "", "+", "-", "*", "/", "^", "=", "<", "<=", ">", ">=", "<>", ".AND.", ".OR." };
+
+struct keyw
+{
+ char *word;
+ int index;
+ int ret,np,p[5];
+} ;
+
+extern struct keyw keywfn[] ;
+
+int stk_var[100];
+int stk_strlen[100];
+char sbuf[512];
+char sbuf2[112];
+extern int gle_debug;
+extern int ndata;
+extern CmdLineObj g_CmdLine;
+
+double string_to_number(const std::string& str) {
+// FIXME support other numeric formats
+ char* pend;
+ return strtod(str.c_str(), &pend);
+}
+
+std::string format_number_to_string(const std::string& format, double value);
+GLERC<GLEColor> memory_cell_to_color(GLEPolish* polish, GLEArrayImpl* stk, GLEMemoryCell* cell, IThrowsError* throwsError, int depth);
+
+unsigned char float_to_color_comp(double value) {
+ int color = (int)floor(value*255 + 0.5);
+ if (color < 0) color = 0;
+ if (color > 255) color = 255;
+ return (unsigned char)color;
+}
+
+unsigned char float_to_color_comp_255(double value) {
+ int color = (int)floor(value + 0.5);
+ if (color < 0) color = 0;
+ if (color > 255) color = 255;
+ return (unsigned char)color;
+}
+
+void eval_get_extra_arg_test(int i, const char* type) throw(ParserError) {
+ int max_arg = g_CmdLine.getNbExtraArgs();
+ if (max_arg == 0) {
+ stringstream s;
+ s << "arg" << type << "(" << i << "): no command line arguments given";
+ g_throw_parser_error(s.str());
+ }
+ if (i > max_arg || i <= 0) {
+ stringstream s;
+ s << "arg" << type << "(" << i << "): argument out of range (1.." << max_arg << ")";
+ g_throw_parser_error(s.str());
+ }
+}
+
+double eval_get_extra_arg_f(int i) throw(ParserError) {
+ eval_get_extra_arg_test(i, "");
+ const string& arg = g_CmdLine.getExtraArg(i-1);
+ if (!is_float(arg)) {
+ stringstream s;
+ s << "arg(" << i << "): argument not a floating point number: " << arg;
+ g_throw_parser_error(s.str());
+ }
+ return atof(arg.c_str());
+}
+
+const char* eval_get_extra_arg_s(int i) throw(ParserError) {
+ eval_get_extra_arg_test(i, "$");
+ return g_CmdLine.getExtraArg(i-1).c_str();
+}
+
+void setEvalStack(GLEArrayImpl* stk, int pos, double value) {
+ stk->ensure(pos + 1);
+ stk->setDouble(pos, value);
+}
+
+void setEvalStack(GLEArrayImpl* stk, int pos, const char* value) {
+ stk->ensure(pos + 1);
+ stk->setObject(pos, new GLEString(value));
+}
+
+void setEvalStack(GLEArrayImpl* stk, int pos, const std::string& value) {
+ stk->ensure(pos + 1);
+ stk->setObject(pos, new GLEString(value));
+}
+
+void setEvalStack(GLEArrayImpl* stk, int pos, int value) {
+ stk->ensure(pos + 1);
+ stk->setDouble(pos, (double)value);
+}
+
+void setEvalStack(GLEArrayImpl* stk, int pos, GLEDataObject* value) {
+ stk->ensure(pos + 1);
+ stk->setObject(pos, value);
+}
+
+void setEvalStackBool(GLEArrayImpl* stk, int pos, bool value) {
+ stk->ensure(pos + 1);
+ stk->setBool(pos, value);
+}
+
+double getEvalStackDouble(GLEArrayImpl* stk, int pos) {
+ stk->checkType(pos, GLEObjectTypeDouble);
+ return stk->getDouble(pos);
+}
+
+int getEvalStackInt(GLEArrayImpl* stk, int pos) {
+ stk->checkType(pos, GLEObjectTypeDouble);
+ return gle_round_int(stk->getDouble(pos));
+}
+
+GLEString* getEvalStackGLEString(GLEArrayImpl* stk, int pos) {
+ stk->checkType(pos, GLEObjectTypeString);
+ return (GLEString*)stk->getObject(pos);
+}
+
+GLEColor* getEvalStackColor(GLEArrayImpl* stk, int pos) {
+ stk->checkType(pos, GLEObjectTypeColor);
+ return (GLEColor*)stk->getObject(pos);
+}
+
+std::string getEvalStackStringStd(GLEArrayImpl* stk, int pos) {
+ stk->checkType(pos, GLEObjectTypeString);
+ return ((GLEString*)stk->getObject(pos))->toUTF8();
+}
+
+void validateIntRange(int value, int from, int to) {
+ if (value < from || value > to) {
+ std::ostringstream msg;
+ msg << "value " << value << " not in range " << from << ", ..., " << to;
+ g_throw_parser_error(msg.str());
+ }
+}
+
+void validateArrayIndexRange(int value, int from, int to) {
+ if (value >= 0) {
+ validateIntRange(value, from, to);
+ } else {
+ validateIntRange(value, -to, -from);
+ }
+}
+
+void complain_operator_type(int op, int type) {
+ std::ostringstream msg;
+ msg << "operator " << gle_operator_to_string(op) << " does not apply to type '" << gle_object_type_to_string((GLEObjectType)type) << "'";
+ g_throw_parser_error(msg.str());
+}
+
+void eval_binary_operator_string(GLEArrayImpl* stk, int op, GLEString* a, GLEString* b) {
+ switch (op) {
+ case BIN_OP_PLUS:
+ setEvalStack(stk, stk->last() - 1, a->concat(b));
+ break;
+ case BIN_OP_EQUALS:
+ setEvalStackBool(stk, stk->last() - 1, a->equalsI(b));
+ break;
+ case BIN_OP_LT:
+ setEvalStackBool(stk, stk->last() - 1, a->strICmp(b) < 0);
+ break;
+ case BIN_OP_LE:
+ setEvalStackBool(stk, stk->last() - 1, a->strICmp(b) <= 0);
+ break;
+ case BIN_OP_GT:
+ setEvalStackBool(stk, stk->last() - 1, a->strICmp(b) > 0);
+ break;
+ case BIN_OP_GE:
+ setEvalStackBool(stk, stk->last() - 1, a->strICmp(b) >= 0);
+ break;
+ case BIN_OP_NOT_EQUALS:
+ setEvalStackBool(stk, stk->last() - 1, !a->equalsI(b));
+ break;
+ case BIN_OP_DOT:
+ {
+ GLERC<GLEString> dot(new GLEString("."));
+ GLERC<GLEString> temp(a->concat(dot.get()));
+ setEvalStack(stk, stk->last() - 1, temp->concat(b));
+ }
+ break;
+ default:
+ complain_operator_type(op, GLEObjectTypeString);
+ break;
+ }
+}
+
+void eval_binary_operator_double(GLEArrayImpl* stk, int op, double a, double b) {
+ switch (op) {
+ case BIN_OP_PLUS:
+ setEvalStack(stk, stk->last() - 1, a + b);
+ break;
+ case BIN_OP_MINUS:
+ setEvalStack(stk, stk->last() - 1, a - b);
+ break;
+ case BIN_OP_MULTIPLY:
+ setEvalStack(stk, stk->last() - 1, a * b);
+ break;
+ case BIN_OP_DIVIDE:
+ // do not test on divide by zero, otherwise "let"
+ // cannot plot functions with divide by zero anymore
+ setEvalStack(stk, stk->last() - 1, a / b);
+ break;
+ case BIN_OP_POW:
+ setEvalStack(stk, stk->last() - 1, pow(a, b));
+ break;
+ case BIN_OP_EQUALS:
+ setEvalStackBool(stk, stk->last() - 1, a == b);
+ break;
+ case BIN_OP_LT:
+ setEvalStackBool(stk, stk->last() - 1, a < b);
+ break;
+ case BIN_OP_LE:
+ setEvalStackBool(stk, stk->last() - 1, a <= b);
+ break;
+ case BIN_OP_GT:
+ setEvalStackBool(stk, stk->last() - 1, a > b);
+ break;
+ case BIN_OP_GE:
+ setEvalStackBool(stk, stk->last() - 1, a >= b);
+ break;
+ case BIN_OP_NOT_EQUALS:
+ setEvalStackBool(stk, stk->last() - 1, a != b);
+ break;
+ case BIN_OP_MOD:
+ setEvalStack(stk, stk->last() - 1, gle_round_int(a) % gle_round_int(b));
+ break;
+ default:
+ complain_operator_type(op, GLEObjectTypeDouble);
+ break;
+ }
+}
+
+void eval_binary_operator_bool(GLEArrayImpl* stk, int op, bool a, bool b) {
+ switch (op) {
+ case BIN_OP_AND:
+ setEvalStackBool(stk, stk->last() - 1, a && b);
+ break;
+ case BIN_OP_OR:
+ setEvalStackBool(stk, stk->last() - 1, a || b);
+ break;
+ default:
+ complain_operator_type(op, GLEObjectTypeDouble);
+ break;
+ }
+}
+
+void eval_binary_operator(GLEArrayImpl* stk, int op) {
+ // a OP b
+ GLEMemoryCell* a = stk->get(stk->last() - 1);
+ GLEMemoryCell* b = stk->get(stk->last());
+ int a_type = gle_memory_cell_type(a);
+ int b_type = gle_memory_cell_type(b);
+ if (a_type == b_type) {
+ switch (a_type) {
+ case GLEObjectTypeDouble:
+ eval_binary_operator_double(stk, op, a->Entry.DoubleVal, b->Entry.DoubleVal);
+ break;
+ case GLEObjectTypeString:
+ eval_binary_operator_string(stk, op, (GLEString*)a->Entry.ObjectVal, (GLEString*)b->Entry.ObjectVal);
+ break;
+ case GLEObjectTypeBool:
+ eval_binary_operator_bool(stk, op, a->Entry.BoolVal, b->Entry.BoolVal);
+ break;
+ default:
+ complain_operator_type(op, a_type);
+ break;
+ }
+ } else if (op == BIN_OP_PLUS && (a_type == GLEObjectTypeString || b_type == GLEObjectTypeString)) {
+ GLERC<GLEString> a_str(stk->getString(stk->last() - 1));
+ GLERC<GLEString> b_str(stk->getString(stk->last()));
+ eval_binary_operator_string(stk, op, a_str.get(), b_str.get());
+ } else {
+ std::ostringstream msg;
+ msg << "operator " << gle_operator_to_string(op)
+ << " does not apply to types '" << gle_object_type_to_string((GLEObjectType)a_type)
+ << "' and '" << gle_object_type_to_string((GLEObjectType)b_type) << "'";
+ g_throw_parser_error(msg.str());
+ }
+ stk->decrementSize(1);
+}
+
+void eval_pcode_loop(GLEArrayImpl* stk, GLEPcodeList* pclist, int *pcode, int plen) throw(ParserError) {
+ if (plen > 1000) {
+ gprint("Expression is suspiciously long %d \n",plen);
+ }
+ union {double d; int l[2];} both;
+ double x1, y1, x2, y2;
+ double xx, yy;
+ int i, j;
+ for (int c = 0; c < plen; c++) {
+ // cout << "pos: " << c << " pcode: " << pcode[c] << endl;
+ switch (pcode[c]) {
+ /*
+ ..
+ Special commands 1..9 -------------------------------
+ ..
+ */
+ case PCODE_EXPR: /* Start of another expression (function param) */
+ c++; /* skip over exp length */
+ break;
+ case PCODE_DOUBLE: /* Floating point number follows */
+ both.l[0] = *(pcode+(++c));
+ both.l[1] = *(pcode+(++c));
+ stk->incrementSize(1);
+ setEvalStack(stk, stk->last(), both.d);
+ dbg gprint("Got float %f %d %f \n",getEvalStackDouble(stk, stk->last()),stk->last(),*(pcode+(c)));
+ break;
+ case PCODE_VAR: /* Floating_point variable number follows */
+ case PCODE_STRVAR: /* string variable number follows */
+ i = *(pcode + (++c));
+ stk->incrementSize(1);
+ stk->ensure(stk->size());
+ getVarsInstance()->get(i, stk->get(stk->last()));
+ break;
+ case PCODE_STRING: /* Null terminated string follows (int alligned) */
+ c++;
+ stk->incrementSize(1);
+ setEvalStack(stk, stk->last(), eval_str(pcode, &c));
+ break;
+ case PCODE_OBJECT:
+ i = *(pcode+(++c));
+ stk->incrementSize(1);
+ setEvalStack(stk, stk->last(), pclist->get(i));
+ break;
+ /*
+ Binary operators 10..29 -----------------------
+ */
+ case BIN_OP_PLUS + BINARY_OPERATOR_OFFSET:
+ case BIN_OP_MINUS + BINARY_OPERATOR_OFFSET:
+ case BIN_OP_MULTIPLY + BINARY_OPERATOR_OFFSET:
+ case BIN_OP_DIVIDE + BINARY_OPERATOR_OFFSET:
+ case BIN_OP_POW + BINARY_OPERATOR_OFFSET:
+ case BIN_OP_EQUALS + BINARY_OPERATOR_OFFSET:
+ case BIN_OP_LT + BINARY_OPERATOR_OFFSET:
+ case BIN_OP_LE + BINARY_OPERATOR_OFFSET:
+ case BIN_OP_GT + BINARY_OPERATOR_OFFSET:
+ case BIN_OP_GE + BINARY_OPERATOR_OFFSET:
+ case BIN_OP_NOT_EQUALS + BINARY_OPERATOR_OFFSET:
+ case BIN_OP_AND + BINARY_OPERATOR_OFFSET:
+ case BIN_OP_OR + BINARY_OPERATOR_OFFSET:
+ case BIN_OP_MOD + BINARY_OPERATOR_OFFSET:
+ case BIN_OP_DOT + BINARY_OPERATOR_OFFSET:
+ eval_binary_operator(stk, pcode[c] - BINARY_OPERATOR_OFFSET);
+ break;
+
+ /* look in fn.c and start indexes with 1 */
+ /* Built in functions 60..199 ----------------------------- */
+ /* note add 60 to the index in fn.cpp */
+ case 61: /* unary plus */
+ break;
+ case 62: /* unary minus */
+ setEvalStack(stk, stk->last(), -getEvalStackDouble(stk, stk->last()));
+ break;
+ case 63: /* abs */
+ setEvalStack(stk, stk->last(), fabs(getEvalStackDouble(stk, stk->last())));
+ break;
+ case 64: /* atan */
+ setEvalStack(stk, stk->last(), atan(getEvalStackDouble(stk, stk->last())));
+ break;
+ case 113: /* ACOS 53*/
+ setEvalStack(stk, stk->last(), acos(getEvalStackDouble(stk, stk->last())));
+ break;
+ case 114: /* ASIN 54*/
+ setEvalStack(stk, stk->last(), asin(getEvalStackDouble(stk, stk->last())));
+ break;
+ case 65: /* cos 5*/
+ setEvalStack(stk, stk->last(), cos(getEvalStackDouble(stk, stk->last())));
+ break;
+ case 116: /* ACOT 56*/
+ setEvalStack(stk, stk->last(), 1.0/atan(getEvalStackDouble(stk, stk->last())));
+ break;
+ case 117: /*ASEC 57*/
+ setEvalStack(stk, stk->last(), 1.0/acos(getEvalStackDouble(stk, stk->last())));
+ break;
+ case 118: /*ACSC 58*/
+ setEvalStack(stk, stk->last(), 1.0/asin(getEvalStackDouble(stk, stk->last())));
+ break;
+ case 119: /*cot 59*/
+ setEvalStack(stk, stk->last(), 1.0/tan(getEvalStackDouble(stk, stk->last())));
+ break;
+ case 120: /*sec 60*/
+ setEvalStack(stk, stk->last(), 1.0/cos(getEvalStackDouble(stk, stk->last())));
+ break;
+ case 121: /*csc 61*/
+ setEvalStack(stk, stk->last(), 1.0/sin(getEvalStackDouble(stk, stk->last())));
+ break;
+ case 122: /* cosh 62*/
+ setEvalStack(stk, stk->last(), cosh(getEvalStackDouble(stk, stk->last())));
+ break;
+ case 123: /* sinh 63*/
+ setEvalStack(stk, stk->last(), sinh(getEvalStackDouble(stk, stk->last())));
+ break;
+ case 124: /* tanh 64*/
+ setEvalStack(stk, stk->last(), tanh(getEvalStackDouble(stk, stk->last())));
+ break;
+ case 125: /* coth 65*/
+ setEvalStack(stk, stk->last(), 1.0/tanh(getEvalStackDouble(stk, stk->last())));
+ break;
+ case 126: /* sech 66*/
+ setEvalStack(stk, stk->last(), 1.0/cosh(getEvalStackDouble(stk, stk->last())));
+ break;
+ case 127: /* csch 67*/
+ setEvalStack(stk, stk->last(), 1.0/sinh(getEvalStackDouble(stk, stk->last())));
+ break;
+ #ifdef HAVE_INVERSE_HYP
+ case 128: /* acosh 68*/
+ setEvalStack(stk, stk->last(), acosh(getEvalStackDouble(stk, stk->last())));
+ break;
+ case 129: /* asinh 69*/
+ setEvalStack(stk, stk->last(), asinh(getEvalStackDouble(stk, stk->last())));
+ break;
+ case 130: /* atanh 70*/
+ setEvalStack(stk, stk->last(), atanh(getEvalStackDouble(stk, stk->last())));
+ break;
+ case 131: /* acoth 71*/
+ setEvalStack(stk, stk->last(), 1.0/atanh(getEvalStackDouble(stk, stk->last())));
+ break;
+ case 132: /* asech 72*/
+ setEvalStack(stk, stk->last(), 1.0/acosh(getEvalStackDouble(stk, stk->last())));
+ break;
+ case 133: /* acsch 73*/
+ setEvalStack(stk, stk->last(), 1.0/asinh(getEvalStackDouble(stk, stk->last())));
+ break;
+ #endif
+ case 134: /* todeg 74*/
+ setEvalStack(stk, stk->last(), getEvalStackDouble(stk, stk->last())*180.0/GLE_PI);
+ break;
+ case 135: /* torad 75*/
+ setEvalStack(stk, stk->last(), getEvalStackDouble(stk, stk->last())*GLE_PI/180.0);
+ break;
+ case FN_BUILTIN_MAGIC + FN_EVAL: /* eval */
+ {
+ std::string toEval(getEvalStackStringStd(stk, stk->last()));
+ stk->set(stk->last(), get_global_polish()->evalGeneric(stk, toEval.c_str()));
+ }
+ break;
+ case FN_BUILTIN_MAGIC + FN_ARG: /* arg */
+ setEvalStack(stk, stk->last(), eval_get_extra_arg_f((int)getEvalStackDouble(stk, stk->last())));
+ break;
+ case FN_BUILTIN_MAGIC + FN_ARGS: /* arg$ */
+ setEvalStack(stk, stk->last(), (char*)eval_get_extra_arg_s((int)getEvalStackDouble(stk, stk->last())));
+ break;
+ case FN_BUILTIN_MAGIC + FN_NARGS: /* narg */
+ stk->incrementSize(1);
+ setEvalStack(stk, stk->last(), g_CmdLine.getNbExtraArgs());
+ break;
+ case FN_BUILTIN_MAGIC + FN_MIN: /* min */
+ stk->decrementSize(1);
+ if (getEvalStackDouble(stk, stk->last()+1) < getEvalStackDouble(stk, stk->last())) setEvalStack(stk, stk->last(), getEvalStackDouble(stk, stk->last()+1));
+ break;
+ case FN_BUILTIN_MAGIC + FN_MAX: /* max */
+ stk->decrementSize(1);
+ if (getEvalStackDouble(stk, stk->last()+1) > getEvalStackDouble(stk, stk->last())) setEvalStack(stk, stk->last(), getEvalStackDouble(stk, stk->last()+1));
+ break;
+ case FN_BUILTIN_MAGIC + FN_SDIV: /* sdiv */
+ if (getEvalStackDouble(stk, stk->last()) == 0.0) setEvalStack(stk, stk->last()-1, 0.0);
+ else setEvalStack(stk, stk->last()-1, getEvalStackDouble(stk, stk->last()-1) / getEvalStackDouble(stk, stk->last()));
+ stk->decrementSize(1);
+ break;
+ case FN_BUILTIN_MAGIC + FN_XBAR: /* bar x position */
+ stk->decrementSize(1);
+ setEvalStack(stk, stk->last(), graph_bar_pos(getEvalStackDouble(stk, stk->last()), getEvalStackInt(stk, stk->last() + 1), 1));
+ break;
+ case FN_BUILTIN_MAGIC + FN_XY2ANGLE:
+ stk->decrementSize(1);
+ xy_polar(getEvalStackDouble(stk, stk->last()), getEvalStackDouble(stk, stk->last()+1), &x1, &y1);
+ setEvalStack(stk, stk->last(), y1);
+ break;
+ case FN_BUILTIN_MAGIC + FN_ATAN2:
+ stk->decrementSize(1);
+ setEvalStack(stk, stk->last(), myatan2(getEvalStackDouble(stk, stk->last()), getEvalStackDouble(stk, stk->last()+1)));
+ break;
+ case FN_BUILTIN_MAGIC + FN_ISNAME:
+ setEvalStackBool(stk, stk->last(), getGLERunInstance()->is_name(getEvalStackGLEString(stk, stk->last())));
+ break;
+ case 137: /* pointx */
+ {
+ GLEPoint pt;
+ getGLERunInstance()->name_to_point(getEvalStackGLEString(stk, stk->last()), &pt);
+ setEvalStack(stk, stk->last(), pt.getX());
+ }
+ break;
+ case 138: /* pointy */
+ {
+ GLEPoint pt;
+ getGLERunInstance()->name_to_point(getEvalStackGLEString(stk, stk->last()), &pt);
+ setEvalStack(stk, stk->last(), pt.getY());
+ }
+ break;
+ case 139: /* format$ */
+ stk->decrementSize(1);
+ setEvalStack(stk, stk->last(), format_number_to_string(getEvalStackStringStd(stk, stk->last()+1), getEvalStackDouble(stk, stk->last())));
+ break;
+ case FN_BUILTIN_MAGIC + FN_GETENV: /* getenv */
+ {
+ string result;
+ GLEGetEnv(getEvalStackStringStd(stk, stk->last()), result);
+ setEvalStack(stk, stk->last(), result);
+ }
+ break;
+ case 66: /* date$ */
+ {
+ time_t today;
+ time(&today);
+ strcpy(sbuf2,ctime(&today));
+ strcpy(sbuf,sbuf2);
+ strcpy(sbuf+11,sbuf2+20);
+ sbuf[strlen(sbuf)-1] = 0;
+ stk->incrementSize(1);
+ setEvalStack(stk, stk->last(), sbuf);
+ }
+ break;
+ case 111: /* device$ */
+ stk->incrementSize(1);
+ setEvalStack(stk, stk->last(), g_get_type());
+ break;
+ case 115: /* feof(chan) */
+ setEvalStack(stk, stk->last(), f_eof((int) getEvalStackDouble(stk, stk->last())));
+ break;
+ case 67: /* exp */
+ setEvalStack(stk, stk->last(), exp(getEvalStackDouble(stk, stk->last())));
+ break;
+ case 68: /* fix*/
+ setEvalStack(stk, stk->last(), floor(getEvalStackDouble(stk, stk->last())));
+ break;
+ case 69: /* height of named object */
+ getGLERunInstance()->name_to_size(getEvalStackGLEString(stk, stk->last()), &x1, &y1);
+ setEvalStack(stk, stk->last(), y1);
+ break;
+ case 70: /* int (??int) */
+ setEvalStack(stk, stk->last(), floor(fabs(getEvalStackDouble(stk, stk->last())))
+ *( (getEvalStackDouble(stk, stk->last())>=0)?1:-1 ) );
+ break;
+ case 112: /* CHR$() */
+ {
+ GLERC<GLEString> str(new GLEString());
+ str->setSize(1);
+ str->set(0, getEvalStackInt(stk, stk->last()));
+ setEvalStack(stk, stk->last(), str.get());
+ }
+ break;
+ case 71: /* left$ */
+ {
+ int number = getEvalStackInt(stk, stk->last());
+ GLEString* str = getEvalStackGLEString(stk, stk->last() - 1);
+ validateIntRange(number, 0, str->length());
+ stk->decrementSize(1);
+ setEvalStack(stk, stk->last(), str->substringWithLength(0, number));
+ }
+ break;
+ case 72: /* len */
+ setEvalStack(stk, stk->last(), (int)getEvalStackGLEString(stk, stk->last())->length());
+ break;
+ case 73: /* log */
+ setEvalStack(stk, stk->last(), log(getEvalStackDouble(stk, stk->last())));
+ break;
+ case 74: /* log10 */
+ setEvalStack(stk, stk->last(), log10(getEvalStackDouble(stk, stk->last())));
+ break;
+ case 75: /* not */
+ setEvalStack(stk, stk->last(), !(getEvalStackDouble(stk, stk->last())));
+ break;
+ case 76: /* num$ */
+ sprintf(sbuf,"%g",getEvalStackDouble(stk, stk->last()));
+ setEvalStack(stk, stk->last(), sbuf);
+ break;
+ case 77: /* num1$ */
+ sprintf(sbuf,"%g ",getEvalStackDouble(stk, stk->last()));
+ setEvalStack(stk, stk->last(), sbuf);
+ break;
+ case 78: /* pageheight */
+ g_get_usersize(&xx, &yy);
+ stk->incrementSize(1);
+ setEvalStack(stk, stk->last(), yy);
+ break;
+ case 79: /* pagewidth */
+ g_get_usersize(&xx, &yy);
+ stk->incrementSize(1);
+ setEvalStack(stk, stk->last(), xx);
+ break;
+ case 80: /* pos */
+ {
+ int from = getEvalStackInt(stk, stk->last());
+ GLERC<GLEString> needle(getEvalStackGLEString(stk, stk->last() - 1));
+ GLEString* hayStack(getEvalStackGLEString(stk, stk->last() - 2));
+ validateArrayIndexRange(from, 1, hayStack->length());
+ stk->decrementSize(1);
+ setEvalStack(stk, stk->last(), hayStack->find(needle.get(), hayStack->toStringIndex(from)) + 1);
+ }
+ break;
+ case 81: /* right$ */
+ {
+ int number = getEvalStackInt(stk, stk->last());
+ GLEString* str = getEvalStackGLEString(stk, stk->last() - 1);
+ validateIntRange(number, 0, str->length());
+ stk->decrementSize(1);
+ setEvalStack(stk, stk->last(), str->substringWithLength(str->toStringIndex(-number), number));
+ }
+ break;
+ case 82: /* rnd */
+ setEvalStack(stk, stk->last(), ((double) rand()/(double)RAND_MAX)*getEvalStackDouble(stk, stk->last()));
+ break;
+ case 83: /* seg$ */
+ {
+ int from = getEvalStackInt(stk, stk->last() - 1);
+ int to = getEvalStackInt(stk, stk->last());
+ GLEString* str = getEvalStackGLEString(stk, stk->last() - 2);
+ validateArrayIndexRange(from, 1, str->length());
+ validateArrayIndexRange(to, 1, str->length());
+ stk->decrementSize(2);
+ setEvalStack(stk, stk->last(), str->substring(str->toStringIndex(from), str->toStringIndex(to)));
+ }
+ break;
+ case 84: /* sgn */
+ if (getEvalStackDouble(stk, stk->last())>=0) setEvalStack(stk, stk->last(), 1);
+ else setEvalStack(stk, stk->last(), -1);
+ break;
+ case 85: /* sin */
+ setEvalStack(stk, stk->last(), sin(getEvalStackDouble(stk, stk->last())));
+ break;
+ case 86: /* sqr */
+ setEvalStack(stk, stk->last(), getEvalStackDouble(stk, stk->last()) * getEvalStackDouble(stk, stk->last()));
+ break;
+ case 87: /* sqrt */
+ setEvalStack(stk, stk->last(), sqrt(getEvalStackDouble(stk, stk->last())));
+ break;
+ case 88: /* tan */
+ setEvalStack(stk, stk->last(), tan(getEvalStackDouble(stk, stk->last())));
+ break;
+ case 89: /* tdepth */
+ g_get_xy(&xx,&yy);
+ g_measure(getEvalStackStringStd(stk, stk->last()),&x1,&x2,&y2,&y1);
+ setEvalStack(stk, stk->last(), y1);
+ break;
+ case 90: /* theight */
+ g_get_xy(&xx,&yy);
+ g_measure(getEvalStackStringStd(stk, stk->last()),&x1,&x2,&y2,&y1);
+ setEvalStack(stk, stk->last(), y2);
+ break;
+ case 91: /* time$ */
+ {
+ time_t today;
+ time(&today);
+ ncpy(sbuf,ctime(&today)+11,9);
+ stk->incrementSize(1);
+ setEvalStack(stk, stk->last(), sbuf);
+ }
+ break;
+ case FN_BUILTIN_MAGIC + FN_FILE: /* file$ */
+ {
+ string tmp_s = getGLERunInstance()->getScript()->getLocation()->getMainName();
+ stk->incrementSize(1);
+ setEvalStack(stk, stk->last(), tmp_s.c_str());
+ }
+ break;
+ case FN_BUILTIN_MAGIC + FN_PATH: /* path$ */
+ stk->incrementSize(1);
+ setEvalStack(stk, stk->last(), getGLERunInstance()->getScript()->getLocation()->getDirectory().c_str());
+ break;
+ case FN_BUILTIN_MAGIC + FN_FONT:
+ setEvalStackBool(stk, stk->last(), check_has_font(getEvalStackStringStd(stk, stk->last())) != 0);
+ break;
+ case 92: /* twidth */
+ g_measure(getEvalStackStringStd(stk, stk->last()),&x1,&x2,&y1,&y2);
+ setEvalStack(stk, stk->last(), x2-x1);
+ break;
+ case 93: /* val */
+ setEvalStack(stk, stk->last(), string_to_number(getEvalStackStringStd(stk, stk->last())));
+ break;
+ case 94: /* width of named object */
+ getGLERunInstance()->name_to_size(getEvalStackGLEString(stk, stk->last()), &x1, &y1);
+ setEvalStack(stk, stk->last(), x1);
+ break;
+ case 95: /* xend */
+ stk->incrementSize(1);
+ setEvalStack(stk, stk->last(), tex_xend());
+ break;
+ case 96: /* xgraph */
+ setEvalStack(stk, stk->last(), graph_xgraph(getEvalStackDouble(stk, stk->last())));
+ break;
+ case 97: /* xmax */
+ break;
+ case 98: /* xmin */
+ break;
+ case 99: /* xpos */
+ g_get_xy(&xx,&yy);
+ stk->incrementSize(1);
+ setEvalStack(stk, stk->last(), xx);
+ break;
+ case 100: /* yend */
+ stk->incrementSize(1);
+ setEvalStack(stk, stk->last(), tex_yend());
+ break;
+ case 101: /* ygraph */
+ setEvalStack(stk, stk->last(), graph_ygraph(getEvalStackDouble(stk, stk->last())));
+ break;
+ case 102: /* ymax */
+ break;
+ case 103: /* ymin */
+ break;
+ case 104: /* ypos */
+ g_get_xy(&xx,&yy);
+ stk->incrementSize(1);
+ setEvalStack(stk, stk->last(), yy);
+ break;
+ case 105: /* CVTGRAY(.5) */
+ {
+ GLERC<GLEColor> color(new GLEColor(getEvalStackDouble(stk, stk->last())));
+ setEvalStack(stk, stk->last(), color.get());
+ }
+ break;
+ case 106: /* CVTINT(2) */
+ setEvalStack(stk, stk->last(), (int) floor(getEvalStackDouble(stk, stk->last())));
+ break;
+ case 108: /* CVTMARKER(m$) */
+ both.l[0] = get_marker_string(getEvalStackStringStd(stk, stk->last()), g_get_throws_error());
+ both.l[1] = 0;
+ setEvalStack(stk, stk->last(), both.d);
+ break;
+ case 110: /* CVTFONT(m$) */
+ both.l[0] = pass_font(getEvalStackStringStd(stk, stk->last()));
+ both.l[1] = 0;
+ setEvalStack(stk, stk->last(), both.d);
+ break;
+ case FN_BUILTIN_MAGIC + FN_JUSTIFY: /* JUSTIFY(m$) */
+ both.l[0] = pass_justify(getEvalStackStringStd(stk, stk->last()));
+ both.l[1] = 0;
+ setEvalStack(stk, stk->last(), both.d);
+ break;
+ case 109: /* CVTCOLOR(c$) */
+ {
+ GLERC<GLEColor> color(pass_color_var(getEvalStackStringStd(stk, stk->last())));
+ setEvalStack(stk, stk->last(), color.get());
+ }
+ break;
+ case 107: /* RGB(.4,.4,.2) */
+ {
+ GLERC<GLEColor> color(new GLEColor(getEvalStackDouble(stk, stk->last()-2), getEvalStackDouble(stk, stk->last()-1), getEvalStackDouble(stk, stk->last())));
+ stk->decrementSize(2);
+ setEvalStack(stk, stk->last(), color.get());
+ }
+ break;
+ case 140: /* RGB255(.4,.4,.2) */
+ {
+ GLERC<GLEColor> color(new GLEColor());
+ color->setRGB255(getEvalStackDouble(stk, stk->last()-2), getEvalStackDouble(stk, stk->last()-1), getEvalStackDouble(stk, stk->last()));
+ stk->decrementSize(2);
+ setEvalStack(stk, stk->last(), color.get());
+ }
+ break;
+ case FN_BUILTIN_MAGIC + FN_RGBA:
+ {
+ GLERC<GLEColor> color(new GLEColor(getEvalStackDouble(stk, stk->last()-3), getEvalStackDouble(stk, stk->last()-2), getEvalStackDouble(stk, stk->last()-1), getEvalStackDouble(stk, stk->last())));
+ stk->decrementSize(3);
+ setEvalStack(stk, stk->last(), color.get());
+ }
+ break;
+ case FN_BUILTIN_MAGIC + FN_RGBA255:
+ {
+ GLERC<GLEColor> color(new GLEColor());
+ color->setRGBA255(getEvalStackDouble(stk, stk->last()-3), getEvalStackDouble(stk, stk->last()-2), getEvalStackDouble(stk, stk->last()-1), getEvalStackDouble(stk, stk->last()));
+ stk->decrementSize(3);
+ setEvalStack(stk, stk->last(), color.get());
+ }
+ break;
+ case FN_BUILTIN_MAGIC + FN_NDATA: /* Number of datapoints in a dateset */
+ i = get_dataset_identifier(getEvalStackStringStd(stk, stk->last()), false);
+ setEvalStack(stk, stk->last(), dp[i] == 0 ? 0 : (int)dp[i]->np);
+ break;
+ case FN_BUILTIN_MAGIC + FN_DATAXVALUE: /* X value in a dateset */
+ stk->decrementSize(1);
+ i = get_dataset_identifier(getEvalStackStringStd(stk, stk->last()), true);
+ j = (int) getEvalStackDouble(stk, stk->last()+1);
+ if (j <= 0 || j > (int)dp[i]->np) {
+ throw g_format_parser_error("index out of range: %d (1 ... %d)", j, dp[i]->np);
+ } else {
+ GLEArrayImpl* array = dp[i]->getDimData(0);
+ if (array != 0) {
+ setEvalStack(stk, stk->last(), array->getDouble(j-1));
+ }
+ }
+ break;
+ case FN_BUILTIN_MAGIC + FN_DATAYVALUE: /* Y value in a dateset */
+ stk->decrementSize(1);
+ i = get_dataset_identifier(getEvalStackStringStd(stk, stk->last()), true);
+ j = (int) getEvalStackDouble(stk, stk->last()+1);
+ if (j <= 0 || j > (int)dp[i]->np) {
+ throw g_format_parser_error("index out of range: %d (1 ... %d)", j, dp[i]->np);
+ } else {
+ GLEArrayImpl* array = dp[i]->getDimData(1);
+ if (array != 0) {
+ setEvalStack(stk, stk->last(), array->getDouble(j-1));
+ }
+ }
+ break;
+ case FN_BUILTIN_MAGIC + FN_NDATASETS:
+ stk->incrementSize(1);
+ setEvalStack(stk, stk->last(), ndata);
+ break;
+ case FN_BUILTIN_MAGIC + FN_DI:
+ {
+ sprintf(sbuf, "D%d", getEvalStackInt(stk, stk->last()));
+ GLEVars* vars = getVarsInstance();
+ if (vars->getNameMode() == nameMode::DETECT || vars->getNameMode() == nameMode::RETRIEVE) {
+ if (vars->getNameMode() == nameMode::DETECT) {
+ vars->findAdd(sbuf, &i, &j);
+ vars->setDouble(i, 0.0);
+ } else {
+ vars->find(sbuf, &i, &j);
+ }
+ if (i == -1) {
+ g_throw_parser_error("no value found for data set ", sbuf, "");
+ }
+ vars->get(i, stk->get(stk->last()));
+ } else {
+ CUtilsAssert(vars->getNameMode() == nameMode::NAME);
+ setEvalStack(stk, stk->last(), sbuf);
+ }
+ }
+ break;
+ case FN_BUILTIN_MAGIC + FN_XG3D:
+ setEvalStack(stk, stk->last() - 2, xg3d(getEvalStackDouble(stk, stk->last() - 2), getEvalStackDouble(stk, stk->last() - 1), getEvalStackDouble(stk, stk->last())));
+ stk->decrementSize(2);
+ break;
+ case FN_BUILTIN_MAGIC + FN_YG3D:
+ setEvalStack(stk, stk->last() - 2, yg3d(getEvalStackDouble(stk, stk->last() - 2), getEvalStackDouble(stk, stk->last() - 1), getEvalStackDouble(stk, stk->last())));
+ stk->decrementSize(2);
+ break;
+ default: /* User function, LOCAL_START_INDEX..nnn , or error */
+ /* Is it a user defined function */
+ if (*(pcode+c) >= LOCAL_START_INDEX) {
+ /*
+ pass the address of some numbers
+ pass address of variables if possible
+ */
+ GLESub* sub = sub_get(*(pcode + c) - LOCAL_START_INDEX);
+ getGLERunInstance()->sub_call_stack(sub, stk);
+ } else {
+ g_throw_parser_error("unrecognized byte code expression");
+ }
+ break;
+ }
+ }
+}
+
+GLESub* eval_subroutine_call(GLEArrayImpl* stk, GLEPcodeList* pclist, int *pcode, int *cp) throw(ParserError) {
+ if (*(pcode+(*cp)++) != 1) {
+ (*cp)--;
+ gprint("PCODE, Expecting expression, v=%ld cp=%d \n", *(pcode + (*cp)), *cp);
+ return NULL;
+ }
+ int plen = pcode[(*cp)++];
+ eval_pcode_loop(stk, pclist, pcode + (*cp), plen-1);
+ int sub_code = pcode[(*cp) + plen - 1];
+ GLESub* result = NULL;
+ if (sub_code >= LOCAL_START_INDEX) {
+ result = sub_get(sub_code - LOCAL_START_INDEX);
+ }
+ *cp = *cp + plen;
+ return result;
+}
+
+void eval_do_object_block_call(GLEArrayImpl* stk, GLESub* sub, GLEObjectDO* obj) throw(ParserError) {
+ GLEObjectDOConstructor* cons = obj->getConstructor();
+ obj->makePropertyStore();
+ GLEArrayImpl* arr = obj->getProperties()->getArray();
+ int first = 0;
+ int offset = stk->last() - sub->getNbParam() + 1;
+ if (cons->isSupportScale()) {
+ // First two arguments are width and height
+ arr->setDouble(0, getEvalStackDouble(stk, offset+0));
+ arr->setDouble(1, getEvalStackDouble(stk, offset+1));
+ first += 2;
+ }
+ for (int i = first; i < sub->getNbParam(); i++) {
+ if (sub->getParamType(i) == 1) {
+ ostringstream dstr;
+ dstr << getEvalStackDouble(stk, offset+i);
+ arr->setObject(i, new GLEString(dstr.str()));
+ } else {
+ GLEString* str_i = getEvalStackGLEString(stk, offset+i);
+ str_i->addQuotes();
+ arr->setObject(i, str_i);
+ }
+ }
+ getGLERunInstance()->sub_call_stack(sub, stk);
+}
+
+void evalDoConstant(GLEArrayImpl* stk, int *pcode, int *cp)
+{
+ union {double d; int l[2];} both;
+ both.l[0] = *(pcode+ ++(*cp));
+ both.l[1] = 0;
+ stk->incrementSize(1);
+ stk->ensure(stk->last());
+ stk->setDouble(stk->last(), both.d);
+}
+
+GLEMemoryCell* evalGeneric(GLEArrayImpl* stk, GLEPcodeList* pclist, int *pcode, int *cp) throw(ParserError) {
+ int fixed_cp;
+ if (cp == 0) {
+ fixed_cp = 0;
+ cp = &fixed_cp;
+ }
+ if (pcode[(*cp)] == 8) {
+ evalDoConstant(stk, pcode, cp);
+ *cp = *cp + 1;
+ } else {
+ if (pcode[(*cp)++] != PCODE_EXPR) {
+ g_throw_parser_error("pcode error: expected expression");
+ }
+ int plen = pcode[(*cp)++];
+ eval_pcode_loop(stk, pclist, pcode + (*cp), plen);
+ *cp = *cp + plen;
+ }
+ if (stk->size() < 1) {
+ g_throw_parser_error("pcode error: stack underflow in eval");
+ }
+ stk->decrementSize(1);
+ return stk->get(stk->last() + 1);
+}
+
+double evalDouble(GLEArrayImpl* stk, GLEPcodeList* pclist, int *pcode, int *cp) throw(ParserError) {
+ GLEMemoryCell* mc = evalGeneric(stk, pclist, pcode, cp);
+ gle_memory_cell_check(mc, GLEObjectTypeDouble);
+ return mc->Entry.DoubleVal;
+}
+
+bool evalBool(GLEArrayImpl* stk, GLEPcodeList* pclist, int *pcode, int *cp) throw(ParserError) {
+ GLEMemoryCell* mc = evalGeneric(stk, pclist, pcode, cp);
+ gle_memory_cell_check(mc, GLEObjectTypeBool);
+ return mc->Entry.BoolVal;
+}
+
+GLEString* evalStringPtr(GLEArrayImpl* stk, GLEPcodeList* pclist, int *pcode, int *cp) throw(ParserError) {
+ GLEMemoryCell* mc = evalGeneric(stk, pclist, pcode, cp);
+ gle_memory_cell_check(mc, GLEObjectTypeString);
+ return (GLEString*)mc->Entry.ObjectVal;
+}
+
+GLERC<GLEColor> evalColor(GLEArrayImpl* stk, GLEPcodeList* pclist, int *pcode, int *cp) throw(ParserError) {
+ GLEMemoryCell* mc = evalGeneric(stk, pclist, pcode, cp);
+ return memory_cell_to_color(get_global_polish(), stk, mc, g_get_throws_error(), 0);
+}
+
+GLERC<GLEString> evalString(GLEArrayImpl* stk, GLEPcodeList* pclist, int *pcode, int *cp, bool allowOther) throw(ParserError) {
+ GLERC<GLEString> result;
+ GLEMemoryCell* mc = evalGeneric(stk, pclist, pcode, cp);
+ int type = gle_memory_cell_type(mc);
+ if (type == GLEObjectTypeString) {
+ result = (GLEString*)mc->Entry.ObjectVal;
+ } else {
+ if (allowOther) {
+ result = stk->getString(stk->last() + 1);
+ } else {
+ std::ostringstream msg;
+ msg << "found type '" << gle_object_type_to_string((GLEObjectType)type) << "' but expected 'string'";
+ g_throw_parser_error(msg.str());
+ }
+ }
+ return result;
+}
+
+void debug_polish(int *pcode,int *zcp)
+{
+ int *cp,cpval;
+ int plen,c,cde;
+ cpval = *zcp;
+ cp = &cpval;
+ if (*(pcode+(*cp)++)!=1) {
+ gprint("Expecting expression, v=%d \n",(int) *(pcode+--(*cp)) );
+ return;
+ }
+ plen = *(pcode+*(cp));
+ gprint("Expression length %d current point %d \n",plen,(int) *cp);
+ if (plen>1000) gprint("Expession is suspiciously int %d \n",plen);
+ for (c=(*cp)+1;(c-*cp)<=plen;c++) {
+ cde = *(pcode+c);
+ gprint("Code=%d ",cde);
+ if (cde==0) {
+ gprint("# ZERO \n");
+ } else if (cde==1) {
+ gprint("# Expression, length ??? \n");
+ c++;
+ } else if (cde==2) {
+ gprint("# Floating point number %8x \n",*(pcode+(++c)));
+ c++; /* because it's a DOUBLE which is a quad word */
+ } else if (cde==3) {
+ gprint("# Variable \n"); c++;
+ } else if (cde==4) {
+ gprint("# String Variable \n"); c++;
+ } else if (cde==5) {
+ c++;
+ gprint("# String constant {%s} \n",eval_str(pcode,&c));
+ } else if (cde<29) {
+ gprint("# Binary operator {%s} \n",binop[cde-10]);
+ } else if (cde<49) {
+ gprint("# Binary string op {%s} \n",binop[cde-30]);
+ } else if (cde<LOCAL_START_INDEX) {
+ gprint("# Built in function (with salt) {%s} \n",keywfn[cde-60].word);
+ } else {
+ gprint("# User defined function %d \n",cde);
+ }
+
+ }
+}
+
+char *eval_str(int *pcode,int *plen)
+{
+ char *s;
+ int sl;
+ s = (char *) (pcode+*plen);
+ sl = strlen(s)+1;
+ sl = ((sl + 3) & 0xfffc);
+ *plen = *plen + sl/4 - 1;
+ return s;
+}
+
+void gle_as_a_calculator_eval(GLEPolish& polish, const string& line) {
+ GLERC<GLEArrayImpl> stk(new GLEArrayImpl());
+ try {
+ string value;
+ polish.evalString(stk.get(), line.c_str(), &value, true);
+ cout << " " << value << endl;
+ } catch (ParserError& err) {
+ // do not use the gprint version as no GLE file is "active"
+ output_error_cerr(err);
+ }
+}
+
+void gle_as_a_calculator(vector<string>* exprs) {
+ g_select_device(GLE_DEVICE_DUMMY);
+ g_clear();
+ sub_clear(false);
+ clear_run();
+ f_init();
+ gle_set_constants();
+ GLEPolish polish;
+ polish.initTokenizer();
+ string line;
+ if (exprs != NULL) {
+ for (vector<string>::size_type i = 0; i < exprs->size(); i++) {
+ cout << "> " << (*exprs)[i] << endl;
+ gle_as_a_calculator_eval(polish, (*exprs)[i]);
+ }
+ } else {
+ while (true) {
+ cout << "> "; fflush(stdout);
+ ReadFileLineAllowEmpty(cin, line);
+ str_trim_both(line);
+ if (line == "") break;
+ gle_as_a_calculator_eval(polish, line);
+ }
+ }
+}
diff --git a/src/gle/f2c.h b/src/gle/f2c.h
new file mode 100644
index 0000000..3576dd4
--- /dev/null
+++ b/src/gle/f2c.h
@@ -0,0 +1,248 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+/* f2c.h -- Standard Fortran to C header file */
+
+/** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed."
+
+ - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */
+
+#ifndef F2C_INCLUDE
+#define F2C_INCLUDE
+
+typedef int integer;
+typedef char *address;
+typedef short int shortint;
+typedef float real;
+typedef double doublereal;
+typedef struct { real r, i; } complex;
+typedef struct { doublereal r, i; } doublecomplex;
+typedef int logical;
+typedef short int shortlogical;
+
+#define TRUE_ (1)
+#define FALSE_ (0)
+
+/* Extern is for use with -E */
+#ifndef Extern
+#define Extern extern
+#endif
+
+/* I/O stuff */
+
+#ifdef f2c_i2
+/* for -i2 */
+typedef short flag;
+typedef short ftnlen;
+typedef short ftnint;
+#else
+typedef int flag;
+typedef int ftnlen;
+typedef int ftnint;
+#endif
+
+/*external read, write*/
+typedef struct
+{ flag cierr;
+ ftnint ciunit;
+ flag ciend;
+ char *cifmt;
+ ftnint cirec;
+} cilist;
+
+/*internal read, write*/
+typedef struct
+{ flag icierr;
+ char *iciunit;
+ flag iciend;
+ char *icifmt;
+ ftnint icirlen;
+ ftnint icirnum;
+} icilist;
+
+/*open*/
+typedef struct
+{ flag oerr;
+ ftnint ounit;
+ char *ofnm;
+ ftnlen ofnmlen;
+ char *osta;
+ char *oacc;
+ char *ofm;
+ ftnint orl;
+ char *oblnk;
+} olist;
+
+/*close*/
+typedef struct
+{ flag cerr;
+ ftnint cunit;
+ char *csta;
+} cllist;
+
+/*rewind, backspace, endfile*/
+typedef struct
+{ flag aerr;
+ ftnint aunit;
+} alist;
+
+/* inquire */
+typedef struct
+{ flag inerr;
+ ftnint inunit;
+ char *infile;
+ ftnlen infilen;
+ ftnint *inex; /*parameters in standard's order*/
+ ftnint *inopen;
+ ftnint *innum;
+ ftnint *innamed;
+ char *inname;
+ ftnlen innamlen;
+ char *inacc;
+ ftnlen inacclen;
+ char *inseq;
+ ftnlen inseqlen;
+ char *indir;
+ ftnlen indirlen;
+ char *infmt;
+ ftnlen infmtlen;
+ char *inform;
+ ftnint informlen;
+ char *inunf;
+ ftnlen inunflen;
+ ftnint *inrecl;
+ ftnint *innrec;
+ char *inblank;
+ ftnlen inblanklen;
+} inlist;
+
+#define VOID void
+
+union Multitype { /* for multiple entry points */
+ shortint h;
+ integer i;
+ real r;
+ doublereal d;
+ complex c;
+ doublecomplex z;
+ };
+
+typedef union Multitype Multitype;
+
+typedef int Long;
+
+struct Vardesc { /* for Namelist */
+ char *name;
+ char *addr;
+ Long *dims;
+ int type;
+ };
+typedef struct Vardesc Vardesc;
+
+struct Namelist {
+ char *name;
+ Vardesc **vars;
+ int nvars;
+ };
+typedef struct Namelist Namelist;
+
+#define abs(x) ((x) >= 0 ? (x) : -(x))
+#define dabs(x) (doublereal)abs(x)
+#define min(a,b) ((a) <= (b) ? (a) : (b))
+#define max(a,b) ((a) >= (b) ? (a) : (b))
+#define dmin(a,b) (doublereal)min(a,b)
+#define dmax(a,b) (doublereal)max(a,b)
+
+/* procedure parameter types for -A and -C++ */
+
+#define F2C_proc_par_types 1
+#ifdef __cplusplus
+typedef int /* Unknown procedure type */ (*U_fp)(...);
+typedef shortint (*J_fp)(...);
+typedef integer (*I_fp)(...);
+typedef real (*R_fp)(...);
+typedef doublereal (*D_fp)(...), (*E_fp)(...);
+typedef /* Complex */ VOID (*C_fp)(...);
+typedef /* Double Complex */ VOID (*Z_fp)(...);
+typedef logical (*L_fp)(...);
+typedef shortlogical (*K_fp)(...);
+typedef /* Character */ VOID (*H_fp)(...);
+typedef /* Subroutine */ int (*S_fp)(...);
+#else
+typedef int /* Unknown procedure type */ (*U_fp)();
+typedef shortint (*J_fp)();
+typedef integer (*I_fp)();
+typedef real (*R_fp)();
+typedef doublereal (*D_fp)(), (*E_fp)();
+typedef /* Complex */ VOID (*C_fp)();
+typedef /* Double Complex */ VOID (*Z_fp)();
+typedef logical (*L_fp)();
+typedef shortlogical (*K_fp)();
+typedef /* Character */ VOID (*H_fp)();
+typedef /* Subroutine */ int (*S_fp)();
+#endif
+/* E_fp is for real functions when -R is not specified */
+typedef VOID C_f; /* complex function */
+typedef VOID H_f; /* character function */
+typedef VOID Z_f; /* double complex function */
+typedef doublereal E_f; /* real function with -R not specified */
+
+/* undef any lower-case symbols that your C compiler predefines, e.g.: */
+
+#ifndef Skip_f2c_Undefs
+/* #undef cray */
+#undef gcos
+#undef mc68010
+#undef mc68020
+#undef mips
+#undef pdp11
+#undef sgi
+#undef sparc
+#undef sun
+#undef sun2
+#undef sun3
+#undef sun4
+#undef u370
+#undef u3b
+#undef u3b2
+#undef u3b5
+#undef unix
+#undef vax
+#endif
+#endif
+
diff --git a/src/gle/file_io.cpp b/src/gle/file_io.cpp
new file mode 100644
index 0000000..b91eaad
--- /dev/null
+++ b/src/gle/file_io.cpp
@@ -0,0 +1,1668 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#include "basicconf.h"
+
+#include <list>
+#include <map>
+#include <fstream>
+#include <algorithm>
+
+#include <errno.h>
+#include <time.h>
+#include <sys/stat.h>
+
+#ifdef HAVE_SYS_PARAM_H
+ #include <sys/param.h>
+#endif
+
+#ifdef __WIN32__
+ #include <sys/types.h>
+ #include <sys/stat.h>
+ #include <stdlib.h>
+ #include <process.h>
+ #include <windows.h>
+ #include <winsock.h>
+#endif
+#ifdef __CYGWIN__
+ #include <unistd.h>
+ #include <windows.h>
+#endif
+#ifdef __MACOS__
+ #include <mach-o/dyld.h>
+#endif
+#ifdef __UNIX__
+ #include <limits.h>
+ #include <unistd.h>
+ #include <fcntl.h>
+ #include <sys/types.h>
+ #include <sys/wait.h>
+ #include <dirent.h>
+ #ifdef HAVE_SOCKETS
+ #include <sys/socket.h>
+ #include <netinet/in.h>
+ #include <arpa/inet.h>
+ typedef int SOCKET;
+ #define SOCKET_ERROR -1
+ #endif
+#endif
+#if defined(__OS2__) && defined(__EMX__)
+ #include <unistd.h>
+ #include <sys/types.h>
+ #ifdef HAVE_SOCKETS
+ #include <sys/socket.h>
+ #include <netinet/in.h>
+ #include <arpa/inet.h>
+ typedef int SOCKET;
+ #define SOCKET_ERROR -1
+ #endif
+#endif
+
+/* PATH_MAX is not defined on gnu-hurd */
+#ifndef PATH_MAX
+ #define PATH_MAX 8192
+#endif
+
+using namespace std;
+
+#include "tokens/stokenizer.h"
+#include "file_io.h"
+#include "cutils.h"
+
+#ifdef __UNIX__
+ /* Cygwin too */
+ string PATH_SEP = ":";
+ string DIR_SEP = "/";
+#endif
+
+#ifdef __WIN32__
+ string PATH_SEP = ";";
+ string DIR_SEP = "\\";
+#endif
+
+#if defined(__OS2__) && defined(__EMX__)
+ string PATH_SEP = ";";
+ string DIR_SEP = "/";
+#endif
+
+string GLE_TOP_DIR;
+string GLE_BIN_DIR;
+
+bool GLEGetEnv(const string& name, string& result) {
+ const char* env = getenv(name.c_str());
+ if (env == NULL) {
+ result = "";
+ return false;
+ } else {
+ result = env;
+ return true;
+ }
+}
+
+//
+// -- directory finding routines
+//
+
+void FillIncludePaths(vector<string> &IP) {
+ // fills containor with paths to search for
+ // file. This is called if it can't find file
+ // in current directory
+ //
+ // Paths searched are:
+ // %GLE_TOP%
+ // %GLE_TOP%/gleinc
+ // %GLE_USRLIB%
+ // note that GLE_USERLIB can contain multiple
+ // directories separated by ; (PC) or : (unix)
+ // as defined in PATH_SEP
+ //
+ //printf("string paths for GLE_PATH\n");
+ string paths = GLE_TOP_DIR + DIR_SEP + "gleinc";
+ IP.push_back(paths);
+ //printf("paths for GLE_USRLIB\n");
+ const char* usr_lib = getenv("GLE_USRLIB");
+ if (usr_lib != NULL) {
+ paths = getenv("GLE_USRLIB");
+ GLEPathToVector(paths, &IP);
+ }
+}
+
+void GLEPathToVector(const string& path, vector<string>* vec) {
+ char_separator sep(PATH_SEP.c_str());
+ tokenizer<char_separator> tokens(path, sep);
+ while (tokens.has_more()) {
+ string dir = tokens.next_token();
+ CorrectDirSepStrip(dir);
+ vec->push_back(dir);
+ }
+}
+
+bool GLEStreamContains(istream& strm, const char* msg) {
+ string line;
+ while (!strm.eof()) {
+ getline(strm, line);
+ if (str_i_str(line, msg) != -1) return true;
+ }
+ return false;
+}
+
+void StripDirSep(string& fname) {
+ if (str_i_ends_with(fname, DIR_SEP.c_str())) {
+ int nb = DIR_SEP.length();
+ fname.erase(fname.length()-nb, nb);
+ }
+}
+
+void StripDirSepButNotRoot(string& fname) {
+ if (str_i_ends_with(fname, DIR_SEP.c_str())) {
+ if (fname == "/") {
+ // don't strip unix root dir
+ return;
+ }
+ int nb = DIR_SEP.length();
+ fname.erase(fname.length()-nb, nb);
+ }
+}
+
+void CorrectDirSep(string& fname) {
+ int len = fname.length();
+ char dirsep = DIR_SEP[0];
+ for (int i = 0; i < len; i++) {
+ if (fname[i] == '/' || fname[i] == '\\') {
+ fname[i] = dirsep;
+ }
+ }
+}
+
+void CorrectDirSepStrip(string& fname) {
+ CorrectDirSep(fname);
+ StripDirSepButNotRoot(fname);
+}
+
+void AddDirSep(string& fname) {
+ string::size_type pos = fname.length();
+ if (pos >= 1) {
+ if (fname[pos-1] != '/' && fname[pos-1] != '\\') {
+ // only add if not already has one!
+ fname += DIR_SEP;
+ }
+ } else {
+ fname += DIR_SEP;
+ }
+}
+
+string GLEAddRelPath(const string& base, int cd, const char* path) {
+ string result = base;
+ StripPathComponents(&result, cd);
+ if (path != NULL && path[0] != 0) {
+ AddDirSep(result);
+ result += path;
+ }
+ return result;
+}
+
+bool GLEAddRelPathAndFileTry(const string& base, int cd, const char* path, const char* file, string& result) {
+ result = GLEAddRelPath(base, cd, path);
+ AddDirSep(result);
+ result += file;
+ return GLEFileExists(result);
+}
+
+bool IsAbsPath(const string& path) {
+ if (path.length() >= 1) {
+ if (path[0] == '/') {
+ // Unix style absolute path
+ return true;
+ }
+ if (path.length() >= 3) {
+ if (path[1] == ':' && (path[2] == '/' || path[2] == '\\')) {
+ // Windows style absolute path
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+void GLENormalizePath(string& path) {
+ char dir_sep = DIR_SEP[0];
+ string::size_type len = path.length();
+ string::size_type orig = 0;
+ string::size_type dest = 0;
+ while (orig < len) {
+ if (path[orig] == '/' || path[orig] == '\\') {
+ if (orig + 1 < len &&
+ (path[orig+1] == '/' || path[orig+1] == '\\')) {
+ // found "//" -> skip
+ orig++;
+ } else if (orig + 2 < len &&
+ path[orig+1] == '.' &&
+ (path[orig+2] == '/' || path[orig+2] == '\\')) {
+ // found "/./" -> skip
+ orig += 2;
+ } else if (orig + 3 < len &&
+ path[orig+1] == '.' && path[orig+2] == '.' &&
+ (path[orig+3] == '/' || path[orig+3] == '\\')) {
+ // found "/../" -> skip + remove last directory
+ orig += 3;
+ if (dest > 0) dest--; // backup to last written character
+ while (dest > 0 && path[dest] != '/' && path[dest] != '\\') {
+ // as long as this is not path separator, go back
+ dest--;
+ }
+ } else {
+ orig++;
+ path[dest++] = dir_sep;
+ }
+ } else {
+ path[dest++] = path[orig++];
+ }
+ }
+ path.resize(dest);
+}
+
+void GLEGetFullPath(const string& dirname, const string& fname, string& fullpath) {
+ if (IsAbsPath(fname)) {
+ fullpath = fname;
+ } else {
+ fullpath = dirname;
+ AddDirSep(fullpath);
+ fullpath += fname;
+ }
+ GLENormalizePath(fullpath);
+}
+
+void FileNameDotToUnderscore(string& fname) {
+ string::size_type pos = fname.length();
+ while (pos >= 1 && fname[pos-1] != '/' && fname[pos-1] != '\\') {
+ if (fname[pos-1] == '.') fname[pos-1] = '_';
+ if (fname[pos-1] == ' ') fname[pos-1] = '_';
+ pos--;
+ }
+}
+
+// Get extension of filename and convert it to lower case
+void GetExtension(const string& fname, string& ext) {
+ string::size_type pos = fname.length();
+ // Never search to before "/" or "\\": file may not have extension
+ // And don't find "." in path before file name
+ while (pos >= 1 && fname[pos-1] != '/' && fname[pos-1] != '\\' && fname[pos-1] != '.' ) {
+ pos--;
+ }
+ if (pos >= 1 && fname[pos-1] == '.') {
+ ext = fname.substr(pos);
+ gle_strlwr(ext);
+ } else {
+ ext = "";
+ }
+}
+
+// Get file name without extension
+void GetMainName(const string& fname, string& name) {
+ string::size_type pos = fname.length();
+ // Never search to before "/" or "\\": file may not have extension
+ // And don't find "." in path before file name
+ while (pos >= 1 && fname[pos-1] != '/' && fname[pos-1] != '\\' && fname[pos-1] != '.' ) {
+ pos--;
+ }
+ if (pos >= 1 && fname[pos-1] == '.') {
+ name = fname.substr(0, pos-1);
+ } else {
+ name = fname;
+ }
+}
+
+void GetMainNameExt(const string& fname, const char* ext, string& name) {
+ if (str_i_ends_with(fname, ext)) {
+ string::size_type pos = fname.length() - strlen(ext);
+ name = fname.substr(0, pos);
+ } else {
+ name = fname;
+ }
+}
+
+// Add extension to filename
+void AddExtension(string& fname, const string& ext) {
+ string::size_type pos = fname.length();
+ // Never search to before "/" or "\\": file may not have extension
+ // And don't find "." in path before file name
+ while (pos >= 1 && fname[pos-1] != '/' && fname[pos-1] != '\\' && fname[pos-1] != '.' ) {
+ pos--;
+ }
+ if (pos >= 1 && fname[pos-1] == '.') {
+ fname.erase(pos);
+ fname += ext;
+ } else {
+ fname += ".";
+ fname += ext;
+ }
+}
+
+// Get path of file name (assume last part after DIR_SEP is file name)
+void GetDirName(const string& path, string& dir) {
+ string::size_type pos = path.length();
+ while (pos >= 1 && path[pos-1] != '/' && path[pos-1] != '\\') {
+ pos--;
+ }
+ // position pos-1 is where the slash is, so if pos = 1 then the slash is the first
+ // character of the path and the file is in the root of the system
+ if (pos >= 1 && (path[pos-1] == '/' || path[pos-1] == '\\')) {
+ dir = path.substr(0, pos);
+ AddDirSep(dir);
+ } else {
+ dir = "";
+ }
+}
+
+// Split file name in path (dir) and file name (name)
+void SplitFileName(const string& path, string& dir, string& name) {
+ string::size_type pos = path.length();
+ while (pos >= 1 && path[pos-1] != '/' && path[pos-1] != '\\') {
+ pos--;
+ }
+ // position pos-1 is where the slash is, so if pos = 1 then the slash is the first
+ // character of the path and the file is in the root of the system
+ if (pos >= 1 && (path[pos-1] == '/' || path[pos-1] == '\\')) {
+ dir = path.substr(0, pos); // second argument to substr = number of characters to copy
+ name = path.substr(pos);
+ AddDirSep(dir);
+ } else {
+ name = path;
+ dir = "";
+ }
+}
+
+// Split file name in path (dir) and file name (name) and return only file name
+void SplitFileNameNoDir(const string& path, string& name) {
+ string::size_type pos = path.length();
+ while (pos >= 1 && path[pos-1] != '/' && path[pos-1] != '\\') {
+ pos--;
+ }
+ // position pos-1 is where the slash is, so if pos = 1 then the slash is the first
+ // character of the path and the file is in the root of the system
+ if (pos >= 1 && (path[pos-1] == '/' || path[pos-1] == '\\')) {
+ name = path.substr(pos);
+ } else {
+ name = path;
+ }
+}
+
+// Remove given absolute path from filename
+void RemoveDirectoryIfEqual(string* filename, const string& directory) {
+ if (IsAbsPath(directory)) {
+ // Ignore trailing path separator on directory
+ int pos = directory.length()-1;
+ while (pos > 0 && (directory[pos] == '/' || directory[pos] == '\\')) pos--;
+ // Check if directory is a prefix of the given filename
+ if (strncmp(directory.c_str(), filename->c_str(), pos+1) == 0) {
+ // Skip the path separator character
+ pos++;
+ // And erase the absolute path prefix
+ if (pos < (int)filename->length() && ((*filename)[pos] == '/' || (*filename)[pos] == '\\')) {
+ filename->erase(0, pos+1);
+ }
+ }
+ }
+}
+
+void StripPathComponents(string* fname, int nb) {
+ while (nb > 0) {
+ string::size_type i = fname->rfind(DIR_SEP);
+ if (i != string::npos) {
+ *fname = fname->substr(0, i);
+ } else {
+ break;
+ }
+ nb--;
+ }
+}
+
+string GLETempDirName() {
+ string result;
+#ifdef __WIN32__
+ #define WIN32_TMPNAM_BUFSIZE 1024
+ TCHAR lpPathBuffer[WIN32_TMPNAM_BUFSIZE+1];
+ DWORD dwRetVal = GetTempPath(WIN32_TMPNAM_BUFSIZE, lpPathBuffer);
+ if (dwRetVal > WIN32_TMPNAM_BUFSIZE || (dwRetVal == 0)) {
+ return string("C:\\");
+ } else {
+ result = lpPathBuffer;
+ }
+#else
+ result = "/tmp";
+#endif
+ AddDirSep(result);
+ return result;
+}
+
+string GLETempName() {
+ string result;
+#ifdef __WIN32__
+ #define WIN32_TMPNAM_BUFSIZE 1024
+ result = "C:\\gle.tmp";
+ TCHAR szTempName[WIN32_TMPNAM_BUFSIZE+1];
+ TCHAR lpPathBuffer[WIN32_TMPNAM_BUFSIZE+1];
+ DWORD dwRetVal = GetTempPath(WIN32_TMPNAM_BUFSIZE, lpPathBuffer);
+ if (dwRetVal <= WIN32_TMPNAM_BUFSIZE && dwRetVal != 0) {
+ UINT uRetVal = GetTempFileName(lpPathBuffer, TEXT("gle"), 0, szTempName);
+ if (uRetVal != 0) {
+ result = szTempName;
+ }
+ }
+#else
+ const char* base = "/tmp/gle-XXXXXX";
+ char* temp = (char*)malloc(strlen(base)+1);
+ strcpy(temp, base);
+ int fd = mkstemp(temp);
+ if (fd != -1) close(fd);
+ result = temp;
+ free(temp);
+#endif
+ GetMainNameExt(result, ".tmp", result);
+ return result;
+}
+
+bool GLEMoveFile(const string& from, const string& to) {
+#ifdef __WIN32__
+#else
+ if (rename(from.c_str(), to.c_str()) == -1) return false;
+#endif
+ return true;
+}
+
+void GLECopyStream(istream& from, ostream& to) {
+ to << from.rdbuf();
+}
+
+int GLECopyFile(const string& from, const string& to, string* err) {
+ ifstream strm(from.c_str());
+ if (!strm.is_open()) {
+ if (err != NULL) {
+ *err = string("file '") + from + "' not found";
+ }
+ return GLE_FILE_NOT_FOUND_ERROR;
+ }
+ ofstream out(to.c_str());
+ if (!out.is_open()) {
+ strm.close();
+ if (err != NULL) {
+ *err = string("can't create '") + to + "'";
+ }
+ return GLE_FILE_WRITE_ERROR;
+ }
+ GLECopyStream(strm, out);
+ out.close();
+ strm.close();
+ if (out.fail()) {
+ if (err != NULL) {
+ *err = string("error while writing to '") + to + "'";
+ }
+ return GLE_FILE_WRITE_ERROR;
+ }
+ return GLE_FILE_OK;
+}
+
+// Return current directory
+bool GLEGetCrDir(string* name) {
+#ifdef __WIN32__
+ TCHAR buffer[1024];
+ if (GetCurrentDirectory(1024, buffer) != 0) {
+ *name = buffer;
+ return true;
+ }
+#else
+ #ifdef _GNU_SOURCE
+ char* res = get_current_dir_name();
+ if (res != NULL) {
+ *name = res;
+ free(res);
+ return true;
+ }
+ #else
+ char buffer[1024];
+ if (getcwd(buffer, 1024) != NULL) {
+ *name = buffer;
+ return true;
+ }
+ #endif
+#endif
+ return false;
+}
+
+// Return current directory
+// -> Used for compatibility with QGLE.EXE
+bool GLEGetCrDirWin32(string* name) {
+#if defined(__WIN32__) || defined(__CYGWIN__)
+ TCHAR buffer[1024];
+ if (GetCurrentDirectory(1024, buffer) != 0) {
+ *name = buffer;
+ return true;
+ } else {
+ return false;
+ }
+#else
+ char buffer[1024];
+ if (getcwd(buffer, 1024) == NULL) {
+ return false;
+ } else {
+ *name = buffer;
+ return true;
+ }
+#endif
+}
+
+// Change directory
+bool GLEChDir(const string& dir) {
+#ifdef __WIN32__
+ return SetCurrentDirectory(dir.c_str());
+#else
+ return chdir(dir.c_str()) == 0;
+#endif
+}
+
+void GLESetGLETop(const string& cmdline) {
+ string gle_top = cmdline;
+ StripPathComponents(&gle_top, 1);
+ // Newer versions have the executable in the "bin" subdir
+ if (!GLEFileExists(gle_top + DIR_SEP + "inittex.ini")) {
+ StripPathComponents(&gle_top, 1);
+ }
+ gle_top = "GLE_TOP="+gle_top;
+#ifdef __WIN32__
+ _putenv(gle_top.c_str());
+#endif
+}
+
+#define GLEREAD_BUF 10000
+
+int GLERunCommand(const string& cmd, string& result) {
+ ostringstream strm;
+ int res = GLESystem(cmd, true, true, NULL, &strm);
+ result = strm.str();
+ return res;
+}
+
+#define GLESYS_PIPE_RD 0
+#define GLESYS_PIPE_WR 1
+
+#ifdef __WIN32__
+
+void GLEReadFileWin32(HANDLE input, ostream* strm) {
+ char buffer[GLEREAD_BUF+1];
+ while(true) {
+ DWORD nbytes = 0;
+ BOOL fSuccess = ReadFile(input, buffer, GLEREAD_BUF, &nbytes, NULL);
+ if (!fSuccess || nbytes == 0) {
+ CloseHandle(input);
+ return;
+ } else if (strm != NULL) {
+ buffer[nbytes] = 0;
+ nbytes = str_remove_all(buffer, '\r');
+ strm->write(buffer, nbytes);
+ }
+ }
+}
+
+typedef struct {
+ HANDLE handle;
+ istream* strm;
+} GLESystemWriterData;
+
+DWORD WINAPI GLESystemWriter(LPVOID lpParam) {
+ GLESystemWriterData* data = (GLESystemWriterData*)lpParam;
+ char write_buffer[GLEREAD_BUF+1];
+ while(data->strm->good()) {
+ data->strm->read(write_buffer, GLEREAD_BUF);
+ int to_write = data->strm->gcount();
+ DWORD nbWritten;
+ BOOL fSuccess = WriteFile(data->handle, write_buffer, to_write, &nbWritten, NULL);
+ if (!fSuccess) {
+ break;
+ }
+ }
+ CloseHandle(data->handle);
+ ExitThread(0);
+ return 0;
+}
+
+int GLESystem(const string& cmd, bool wait, bool redirout, istream* ins, ostream* outerrs) {
+ SECURITY_ATTRIBUTES saAttr;
+ saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
+ saAttr.bInheritHandle = TRUE;
+ saAttr.lpSecurityDescriptor = NULL;
+ HANDLE hChildStdinRd, hChildStdinWr, hChildStdoutRd, hChildStdoutWr;
+ if (wait) {
+ // Create pipe for standard out
+ if (!CreatePipe(&hChildStdoutRd, &hChildStdoutWr, &saAttr, 0)) {
+ cerr << "stdout pipe creation failed" << endl;
+ return GLE_SYSTEM_ERROR;
+ }
+ SetHandleInformation(hChildStdoutRd, HANDLE_FLAG_INHERIT, 0);
+ // Create pipe for standard in
+ if (!CreatePipe(&hChildStdinRd, &hChildStdinWr, &saAttr, 0)) {
+ cerr << "stdin pipe creation failed" << endl;
+ return GLE_SYSTEM_ERROR;
+ }
+ SetHandleInformation(hChildStdinWr, HANDLE_FLAG_INHERIT, 0);
+ }
+ PROCESS_INFORMATION piProcInfo;
+ STARTUPINFO siStartInfo;
+ ZeroMemory(&piProcInfo, sizeof(PROCESS_INFORMATION));
+ ZeroMemory(&siStartInfo, sizeof(STARTUPINFO));
+ siStartInfo.cb = sizeof(STARTUPINFO);
+ if (wait) {
+ siStartInfo.hStdError = hChildStdoutWr;
+ if (redirout) {
+ siStartInfo.hStdOutput = hChildStdoutWr;
+ } else {
+ siStartInfo.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
+ }
+ siStartInfo.hStdInput = hChildStdinRd;
+ siStartInfo.dwFlags |= STARTF_USESTDHANDLES;
+ }
+ BOOL bFuncRetn = CreateProcess(NULL,
+ (CHAR*)cmd.c_str(), // command line
+ NULL, // process security attributes
+ NULL, // primary thread security attributes
+ wait, // handles are inherited
+ NORMAL_PRIORITY_CLASS | CREATE_NO_WINDOW, // creation flags
+ NULL, // use parent's environment
+ NULL, // use parent's current directory
+ &siStartInfo, // STARTUPINFO pointer
+ &piProcInfo); // receives PROCESS_INFORMATION
+ if (bFuncRetn == 0) {
+ if (wait) {
+ CloseHandle(hChildStdinRd);
+ CloseHandle(hChildStdinWr);
+ CloseHandle(hChildStdoutRd);
+ CloseHandle(hChildStdoutWr);
+ }
+ return GLE_SYSTEM_ERROR;
+ }
+ if (wait) {
+ HANDLE hWrThread = NULL;
+ GLESystemWriterData writerData;
+ CloseHandle(hChildStdinRd);
+ CloseHandle(hChildStdoutWr);
+ if (ins == NULL) {
+ CloseHandle(hChildStdinWr);
+ } else {
+ DWORD dwThreadID;
+ writerData.strm = ins;
+ writerData.handle = hChildStdinWr;
+ hWrThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)GLESystemWriter, (LPVOID)&writerData, 0, &dwThreadID);
+ }
+ GLEReadFileWin32(hChildStdoutRd, outerrs);
+ if (hWrThread != NULL) {
+ WaitForSingleObject(hWrThread, INFINITE);
+ CloseHandle(hWrThread);
+ }
+ WaitForSingleObject(piProcInfo.hProcess, INFINITE);
+ }
+ CloseHandle(piProcInfo.hProcess);
+ CloseHandle(piProcInfo.hThread);
+ return GLE_SYSTEM_OK;
+}
+
+#else
+
+void GLECloseFD(int* fd, int i) {
+ if (fd[i] != -1) {
+ close(fd[i]);
+ fd[i] = -1;
+ }
+}
+
+void GLECloseFDArray(int* fd) {
+ for (int i = 0; i < 4; i++) {
+ GLECloseFD(fd, i);
+ }
+}
+
+void GLEDupFD(int* fd, int dup, int to) {
+ if (*fd >= 0) {
+ close(fd[1-dup]);
+ dup2(fd[dup], to);
+ close(fd[dup]);
+ }
+}
+
+int GLESystem(const string& cmd, bool wait, bool redirout, istream* ins, ostream* outerrs) {
+ int fd[] = { -1, -1, -1, -1 };
+ int* const pin = fd;
+ int* const pout = fd+2;
+ if (wait) {
+ if (pipe(pin) != 0) {
+ return GLE_SYSTEM_ERROR;
+ }
+ if (pipe(pout) != 0) {
+ return GLE_SYSTEM_ERROR;
+ }
+ fcntl(pin[GLESYS_PIPE_WR], F_SETFL, O_NONBLOCK);
+ fcntl(pout[GLESYS_PIPE_RD], F_SETFL, O_NONBLOCK);
+ }
+ pid_t pid = fork();
+ if (pid == 0) {
+ /* here, we're in the child process */
+ GLEDupFD(pin, GLESYS_PIPE_RD, STDIN_FILENO);
+ if (redirout && *pout >= 0) {
+ /* redirect both stdout and stderr */
+ close(pout[GLESYS_PIPE_RD]);
+ dup2(pout[GLESYS_PIPE_WR], STDOUT_FILENO);
+ dup2(pout[GLESYS_PIPE_WR], STDERR_FILENO);
+ close(pout[GLESYS_PIPE_WR]);
+ } else {
+ /* redirect just stderr */
+ GLEDupFD(pout, GLESYS_PIPE_WR, STDERR_FILENO);
+ }
+ execl("/bin/sh", "/bin/sh", "-c", cmd.c_str(), NULL);
+ _exit(0);
+ } else if (pid < 0) {
+ GLECloseFDArray(fd);
+ return GLE_SYSTEM_ERROR;
+ } else if (wait) {
+ int status;
+ /* first close unused pipe ends */
+ GLECloseFD(pin, GLESYS_PIPE_RD);
+ if (ins == NULL) {
+ GLECloseFD(pin, GLESYS_PIPE_WR);
+ }
+ GLECloseFD(pout, GLESYS_PIPE_WR);
+ if (pin[GLESYS_PIPE_WR] >= 0) {
+ /* don't crash with broken pipe signal */
+ signal(SIGPIPE, SIG_IGN);
+ }
+ /* then read/write to used ones (these functions close when done) */
+ fd_set read_set, write_set;
+ char read_buffer[GLEREAD_BUF+1], write_buffer[GLEREAD_BUF+1];
+ int to_write = 0, offs_write = 0;
+ while (true) {
+ /* write data until EAGAIN error (this means pipe full) */
+ while (pin[GLESYS_PIPE_WR] >= 0) {
+ if (to_write == 0) {
+ offs_write = 0;
+ if (ins->good()) {
+ ins->read(write_buffer, GLEREAD_BUF);
+ to_write = ins->gcount();
+ if (to_write == 0) {
+ GLECloseFD(pin, GLESYS_PIPE_WR);
+ break;
+ }
+ } else {
+ GLECloseFD(pin, GLESYS_PIPE_WR);
+ break;
+ }
+ }
+ int nbytes = write(pin[GLESYS_PIPE_WR], write_buffer+offs_write, to_write);
+ if (nbytes < 0) {
+ /* an error occured */
+ if (errno != EAGAIN) {
+ GLECloseFD(pin, GLESYS_PIPE_WR);
+ }
+ break;
+ } else {
+ offs_write += nbytes;
+ to_write -= nbytes;
+ }
+ }
+ /* read data until EAGAIN error (this means pipe empty) */
+ while (pout[GLESYS_PIPE_RD] >= 0) {
+ int nbytes = read(pout[GLESYS_PIPE_RD], read_buffer, GLEREAD_BUF);
+ if (nbytes < 0) {
+ /* an error occured */
+ if (errno != EAGAIN) {
+ GLECloseFD(pout, GLESYS_PIPE_RD);
+ }
+ break;
+ } else if (nbytes == 0) {
+ /* end of file reached */
+ GLECloseFD(pout, GLESYS_PIPE_RD);
+ break;
+ } else if (outerrs != NULL) {
+ read_buffer[nbytes] = 0;
+ nbytes = str_remove_all(read_buffer, '\r');
+ outerrs->write(read_buffer, nbytes);
+ }
+ }
+ /* initialize descriptor sets */
+ int cnt = 0;
+ FD_ZERO(&read_set);
+ FD_ZERO(&write_set);
+ if (pout[GLESYS_PIPE_RD] >= 0) {
+ FD_SET(pout[GLESYS_PIPE_RD], &read_set);
+ cnt++;
+ }
+ if (pin[GLESYS_PIPE_WR] >= 0) {
+ FD_SET(pin[GLESYS_PIPE_WR], &write_set);
+ cnt++;
+ }
+ if (cnt == 0) {
+ /* everyting error or end of stream */
+ break;
+ }
+ /* wait for data to become available or flushed */
+ int res = select(FD_SETSIZE, &read_set, &write_set, NULL, NULL);
+ if (res < 1) {
+ /* no stream ready */
+ break;
+ }
+ }
+ GLECloseFDArray(fd);
+ waitpid(pid, &status, 0);
+ }
+ return GLE_SYSTEM_OK;
+}
+
+#endif
+
+void GLESleep(int msec) {
+#ifdef __WIN32__
+ Sleep(msec);
+#else
+ sleep(msec/1000);
+#endif
+}
+
+bool GLEFileExists(const string& fname) {
+ FILE* f = fopen(fname.c_str(), "rb");
+ if (f != NULL) {
+ fclose(f);
+ return true;
+ } else {
+ return false;
+ }
+}
+
+// Create new directory
+void MakeDirectory(const string& dir) {
+ /* Create directory user read/write/exec, group & others read/exec */
+#ifdef __WIN32__
+ SECURITY_ATTRIBUTES sec_attr;
+ sec_attr.nLength = sizeof(SECURITY_ATTRIBUTES);
+ sec_attr.lpSecurityDescriptor = NULL;
+ sec_attr.bInheritHandle = FALSE;
+ CreateDirectory(dir.c_str(), &sec_attr);
+#else
+ mkdir(dir.c_str(), S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH);
+#endif
+}
+
+// Recursively create directory if it does not yet exist
+void EnsureMkDir(const string& dir) {
+ if (!IsDirectory(dir)) {
+ int done = 0;
+ string temp = dir;
+ vector<string> comps;
+ do {
+ string::size_type i = temp.rfind(DIR_SEP);
+ if (i != string::npos) {
+ comps.push_back(temp.substr(i+1));
+ temp = temp.substr(0, i);
+ } else {
+ comps.push_back(temp);
+ done = 1;
+ }
+ } while (done == 0 && (!IsDirectory(temp)));
+ if (done == 0) {
+ temp += DIR_SEP;
+ } else {
+ temp = "";
+ }
+ for (int i = comps.size()-1; i >= 0; i--) {
+ temp += comps[i];
+ MakeDirectory(temp);
+ if (i > 0) temp += DIR_SEP;
+ }
+ }
+}
+
+bool TryDeleteDir(const string& fname) {
+ // cout << "Delete: '" << fname << "'" << endl;
+#ifdef __WIN32__
+ RemoveDirectory(fname.c_str());
+#else
+ if (rmdir(fname.c_str()) != 0) {
+ return false;
+ }
+#endif
+ return true;
+}
+
+bool TryDeleteFile(const string& fname) {
+ // cout << "Delete: '" << fname << "'" << endl;
+#ifdef __WIN32__
+ DeleteFile(fname.c_str());
+#else
+ if (unlink(fname.c_str()) != 0) {
+ return false;
+ }
+#endif
+ return true;
+}
+
+// Delete file with extension replaced by given one
+bool DeleteFileWithNewExt(const string& fname, const char* ext) {
+ string main_name;
+ GetMainName(fname, main_name);
+ main_name += ext;
+ return TryDeleteFile(main_name);
+}
+
+// Delete file with extension replaced by given one
+bool DeleteFileWithExt(const string& fname, const char* ext) {
+ string name(fname);
+ name += ext;
+ return TryDeleteFile(name);
+}
+
+// Read line from file
+int ReadFileLine(istream& file, string& line) {
+ line = "";
+ int count = 0;
+ char ch = '\n';
+ while ((ch == '\n' || ch == '\r') && file.good()) {
+ file.read(&ch, 1);
+ }
+ while (ch != '\n' && ch != '\r' && file.good()) {
+ count++;
+ line += ch;
+ file.read(&ch, 1);
+ }
+ return count;
+}
+
+int ReadFileLineAllowEmpty(istream& file, string& line) {
+ line = "";
+ char ch;
+ int count = 0;
+ file.read(&ch, 1);
+ while (ch != '\n' && ch != '\r' && !file.eof()) {
+ count++;
+ line += ch;
+ file.read(&ch, 1);
+ }
+ return count;
+}
+
+bool IsExecutable(const string& fname) {
+#if defined(__UNIX__) || ( defined(__OS2__) && defined(__EMX__) )
+ struct stat stat_buf;
+ if (stat((const char *)fname.c_str(), &stat_buf) == 0) {
+ return (stat_buf.st_mode & S_IXOTH) != 0;
+ } else {
+ return false;
+ }
+#else
+ return true;
+#endif
+}
+
+bool IsDirectory(const string& fname, bool linkok) {
+#if defined(__UNIX__) || ( defined(__OS2__) && defined(__EMX__) )
+ struct stat stat_buf;
+ if (linkok) {
+ if (stat((const char *)fname.c_str(), &stat_buf) == 0) {
+ return S_ISDIR(stat_buf.st_mode);
+ }
+ } else {
+ if (lstat((const char *)fname.c_str(), &stat_buf) == 0) {
+ return S_ISDIR(stat_buf.st_mode);
+ }
+ }
+#else
+ struct _stat stat_buf;
+ if (_stat((const char *)fname.c_str(), &stat_buf) == 0) {
+ return (stat_buf.st_mode & _S_IFDIR);
+ }
+#endif
+ return false;
+}
+
+GLEProgressIndicator::GLEProgressIndicator() {
+}
+
+GLEProgressIndicator::~GLEProgressIndicator() {
+}
+
+void GLEProgressIndicator::indicate() {
+}
+
+GLEFindEntry::GLEFindEntry(string* result) {
+ m_Result = result;
+ m_Done = false;
+}
+
+GLEFindEntry::~GLEFindEntry() {
+}
+
+void GLEFindEntry::addToFind(const string& tofind) {
+ m_ToFind.push_back(tofind);
+ m_Found.push_back(string());
+}
+
+void GLEFindEntry::updateResult(bool isFinal) {
+ for (unsigned int i = 0; i < getNbFind(); i++) {
+ if (!m_Done && m_Found[i] != "") {
+ // The first one is to be preferred
+ *m_Result = m_Found[i];
+ m_Done = true;
+ break;
+ }
+ }
+ if (!m_Done && isFinal && m_NotFound != "") {
+ *m_Result = m_NotFound;
+ }
+}
+
+void GLEFindEntry::setFound(unsigned int i, const string& found) {
+ unsigned int len = m_Result->length();
+ if (len >= 1 && (*m_Result)[len-1] == ';') {
+ // If result ends with ";", then find all results
+ if (len == 1) *m_Result = found + ";";
+ else *m_Result += found + ";";
+ } else {
+ // Only update if not yet found
+ if (!m_Done && m_Found[i] == "") m_Found[i] = found;
+ }
+}
+
+void GLEFindFilesUpdate(const char* fname, const string& dir, vector<GLEFindEntry*>& tofind) {
+ for (vector<string>::size_type i = 0; i < tofind.size(); i++) {
+ GLEFindEntry* entry = tofind[i];
+ for (unsigned int j = 0; j < entry->getNbFind(); j++) {
+ if (str_i_equals(fname, entry->getFind(j).c_str())) {
+ string place = dir + DIR_SEP + fname;
+ if (IsExecutable(place)) {
+ entry->setFound(j, place);
+ }
+ }
+ }
+ }
+}
+
+void GLEFindFiles(const string& dirname, vector<GLEFindEntry*>& tofind, GLEProgressIndicator* progress) {
+ static int find_files_progress = 0;
+ vector<string> subdirs;
+ if (find_files_progress++ == 10) {
+ progress->indicate();
+ find_files_progress = 0;
+ }
+ // cout << "Dir: " << dirname << endl;
+#ifdef __WIN32__
+ WIN32_FIND_DATA FindFileData;
+ string findpattern = dirname + DIR_SEP + "*.*";
+ HANDLE hFind = FindFirstFile(findpattern.c_str(), &FindFileData);
+ if (hFind == INVALID_HANDLE_VALUE) {
+ return;
+ }
+ do {
+ const char* name = FindFileData.cFileName;
+ if ((FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0) {
+ if (!str_i_equals(name, ".") && !str_i_equals(name, "..")) {
+ subdirs.push_back(name);
+ }
+ } else {
+ GLEFindFilesUpdate(name, dirname, tofind);
+ }
+ } while (FindNextFile(hFind, &FindFileData) != 0);
+ FindClose(hFind);
+#endif
+#ifdef __UNIX__
+ DIR* dir = opendir(dirname.c_str());
+ if (dir != NULL) {
+ struct dirent* entry = readdir(dir);
+ while (entry != NULL) {
+ string path = dirname + DIR_SEP + entry->d_name;
+ if (IsDirectory(path, false)) {
+ if (!str_i_equals(entry->d_name, ".") && !str_i_equals(entry->d_name, "..")) {
+ subdirs.push_back(entry->d_name);
+ }
+ if (str_i_str(entry->d_name, ".framework") != NULL) {
+ GLEFindFilesUpdate(entry->d_name, dirname, tofind);
+ }
+ } else {
+ GLEFindFilesUpdate(entry->d_name, dirname, tofind);
+ }
+ entry = readdir(dir);
+ }
+ closedir(dir);
+ }
+#endif
+ for (vector<string>::size_type i = 0; i < subdirs.size(); i++) {
+ string nextdir = dirname + DIR_SEP + subdirs[i];
+ GLEFindFiles(nextdir, tofind, progress);
+ }
+}
+
+string GLEFindLibrary(const char* name, GLEProgressIndicator* progress) {
+#ifdef __UNIX__
+ string libpath;
+ const char* ldlibpath = getenv("LD_LIBRARY_PATH");
+ if (ldlibpath != NULL && ldlibpath[0] != 0) {
+ libpath = ldlibpath;
+ libpath += ":";
+ }
+ #ifdef __x86_64__
+ libpath += "/usr/lib64:/usr/local/lib64:";
+ #endif
+ libpath += "/usr/lib:/usr/local/lib";
+ string tofind = name;
+ tofind += ".";
+ char_separator separator(":", "");
+ tokenizer<char_separator> tokens(libpath, separator);
+ while (tokens.has_more()) {
+ progress->indicate();
+ const string& dirname = tokens.next_token();
+ DIR* dir = opendir(dirname.c_str());
+ if (dir != NULL) {
+ struct dirent* entry = readdir(dir);
+ while (entry != NULL) {
+ string fname = entry->d_name;
+ if (str_starts_with(fname, tofind.c_str()) && str_i_str(fname, ".so") != -1) {
+ string result = dirname + DIR_SEP + fname;
+ return result;
+ }
+#ifdef __MACOS__
+ if (str_starts_with(fname, tofind.c_str()) && str_i_str(fname, ".dylib") != -1) {
+ string result = dirname + DIR_SEP + fname;
+ return result;
+ }
+#endif
+ entry = readdir(dir);
+ }
+ closedir(dir);
+ }
+ }
+#endif
+ return string("");
+}
+
+void GLEFindPrograms(vector<GLEFindEntry*>& tofind, GLEProgressIndicator* progress) {
+#ifdef __UNIX__
+ const char* path = getenv("PATH");
+ if (path == NULL) {
+ return;
+ }
+ char_separator separator(":", "");
+ tokenizer<char_separator> tokens(path, separator);
+ while (tokens.has_more()) {
+ progress->indicate();
+ const string& dirname = tokens.next_token();
+ DIR* dir = opendir(dirname.c_str());
+ if (dir != NULL) {
+ struct dirent* entry = readdir(dir);
+ while (entry != NULL) {
+ GLEFindFilesUpdate(entry->d_name, dirname, tofind);
+ entry = readdir(dir);
+ }
+ closedir(dir);
+ }
+ }
+#endif
+}
+
+string GetActualFilename(ifstream* file, const string& fname, const string* directory) {
+ // will return the filename
+ // if found in ./ or in any of the include
+ // paths, will return empty string if
+ // file not found
+ if (directory == NULL) {
+ file->open(fname.c_str());
+ if (file->is_open()) return fname;
+ } else {
+ string fullpath;
+ GLEGetFullPath(*directory, fname, fullpath);
+ file->open(fullpath.c_str());
+ if (file->is_open()) return fullpath;
+ }
+ // -- try the IncludePaths
+ vector<string> IncludePaths;
+ FillIncludePaths(IncludePaths);
+ vector<string>::iterator vsi = IncludePaths.begin();
+ while(vsi != IncludePaths.end()) {
+ file->clear();
+ const string path = *vsi + DIR_SEP + fname;
+ file->open(path.c_str());
+ if (file->is_open()) return path;
+ vsi++;
+ }
+ return "";
+}
+
+#ifdef HAVE_SOCKETS
+void GLECloseSocket(SOCKET sock) {
+#ifdef __WIN32__
+ closesocket(sock);
+ WSACleanup();
+#endif
+#ifdef __UNIX__
+ close(sock);
+#endif
+}
+#endif
+
+int GLESendSocket(const string& commands) {
+#ifdef HAVE_SOCKETS
+#ifdef __WIN32__
+ struct WSAData wsaData;
+ int nCode = WSAStartup(MAKEWORD(1, 1), &wsaData);
+ if (nCode != 0) {
+ return -1;
+ }
+#endif
+ struct sockaddr_in name;
+ SOCKET sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
+ if (sock < 0) {
+ #ifdef __WIN32__
+ WSACleanup();
+ #endif
+ return -2;
+ }
+ name.sin_family = AF_INET;
+ name.sin_port = htons(6667);
+ name.sin_addr.s_addr = inet_addr("127.0.0.1");
+ if (connect(sock, (struct sockaddr *) &name, sizeof (name)) < 0) {
+ GLECloseSocket(sock);
+ return -3;
+ }
+ int nbsend = send(sock, commands.c_str(), commands.length(), 0);
+ if (nbsend != (int)commands.length()) {
+ GLECloseSocket(sock);
+ return -4;
+ }
+ char ch = 0;
+ while (true) {
+#ifdef __WIN32__
+ int res1 = recv(sock, &ch, 1, 0);
+ if (res1 <= 0) {
+ if (res1 == SOCKET_ERROR && WSAGetLastError() == WSAEWOULDBLOCK) {
+#else
+ int res1 = read(sock, &ch, 1);
+ if (res1 <= 0) {
+ if (res1 == -1 && errno == EAGAIN) {
+#endif
+ fd_set read_set;
+ FD_ZERO(&read_set);
+ FD_SET(sock, &read_set);
+ int res2 = select(FD_SETSIZE, &read_set, NULL, NULL, NULL);
+ if (res2 < 1) break;
+ } else {
+ break;
+ }
+ } else {
+ cerr << ch;
+ }
+ }
+ GLECloseSocket(sock);
+ return 0;
+#else
+ return -1;
+#endif
+}
+
+bool GetExeName(const char* appname, char **argv, string& exe_name) {
+#ifdef __WIN32__
+ char name[1024];
+ DWORD res = GetModuleFileName(NULL, name, 1023);
+ if (res > 0) {
+ name[res] = 0;
+ exe_name = name;
+ return true;
+ }
+#endif
+#ifdef __MACOS__
+ char name[1024];
+ uint32_t path_len = 1023;
+ if (_NSGetExecutablePath(name, &path_len) == 0) {
+ exe_name = name;
+ str_replace_all(exe_name, "/./", "/");
+ return true;
+ }
+#endif
+#if defined(__UNIX__) && !defined(__MACOS__) && !defined(__FREEBSD__)
+ /* try to read location from the /proc/self/exe file */
+ char path[PATH_MAX];
+ struct stat stat_buf;
+ string path2 = "/proc/self/exe";
+ while (true) {
+ int size = readlink(path2.c_str(), path, PATH_MAX - 1);
+ if (size == -1) {
+ break;
+ }
+ path[size] = '\0';
+ int i = stat(path, &stat_buf);
+ if (i == -1) {
+ break;
+ }
+ if (!S_ISLNK(stat_buf.st_mode)) {
+ exe_name = path;
+ return true;
+ }
+ path2 = path;
+ }
+ /* try to read location from the /proc/self/maps file */
+ ifstream maps("/proc/self/maps");
+ if (maps.is_open()) {
+ string f1 = DIR_SEP + appname;
+ string f2 = f1 + ".exe";
+ while (!maps.eof()) {
+ string line;
+ ReadFileLine(maps, line);
+ char_separator separator(" ", "");
+ tokenizer<char_separator> tokens(line, separator);
+ while (tokens.has_more()) {
+ exe_name = tokens.next_token();
+ if (str_i_ends_with(exe_name, f1.c_str())
+ || str_i_ends_with(exe_name, f2.c_str())) {
+ return true;
+ }
+ }
+ }
+ maps.close();
+ }
+#endif
+ string arg0 = argv[0];
+ if (IsAbsPath(arg0)) {
+ exe_name = arg0;
+ return true;
+ }
+ if (GLEGetCrDir(&exe_name)) {
+ AddDirSep(exe_name);
+ exe_name += arg0;
+ GLENormalizePath(exe_name);
+ return true;
+ }
+ return false;
+}
+
+string GetHomeDir() {
+ #if defined(__UNIX__) || defined (__OS2__)
+ const char* home = getenv("HOME");
+ if (home != NULL && home[0] != 0) {
+ string home_str(home);
+ AddDirSep(home_str);
+ return home_str;
+ }
+ #endif
+ return string();
+}
+
+StreamTokenizerMax::StreamTokenizerMax(const string& fname, int sep, int max) : m_File(fname.c_str()) {
+ m_Sep = sep; m_Max = max; m_IsOK = 1;
+ m_LastToken = new char[m_Max+1];
+ if (!m_File.is_open()) {
+ m_IsOK = 0;
+ }
+}
+
+StreamTokenizerMax::~StreamTokenizerMax() {
+ delete[] m_LastToken;
+}
+
+bool StreamTokenizerMax::hasMoreTokens() {
+ if (m_IsOK == 1) readNextToken();
+ return m_IsOK == 1;
+}
+
+const char* StreamTokenizerMax::nextToken() {
+ return m_LastToken;
+}
+
+void StreamTokenizerMax::close() {
+ m_File.close();
+}
+
+bool StreamTokenizerMax::isSepChar(char ch) {
+ return ch == m_Sep || ch == '\n' || ch == '\r' || ch == 0;
+}
+
+void StreamTokenizerMax::readNextToken() {
+ char ch = m_Sep;
+ while (isSepChar(ch) && !m_File.eof()) {
+ m_File.read(&ch, 1);
+ }
+ int count = 0;
+ while (count < m_Max && !isSepChar(ch) && !m_File.eof()) {
+ if (ch != m_Sep) m_LastToken[count++] = ch;
+ m_File.read(&ch, 1);
+ }
+ m_LastToken[count] = 0;
+ while (!isSepChar(ch) && !m_File.eof()) {
+ m_File.read(&ch, 1);
+ }
+ if (m_File.eof()) {
+ m_IsOK = 0;
+ }
+}
+
+void CopyGLETop(char* buf) {
+ strcpy(buf, GLE_TOP_DIR.c_str());
+}
+
+string fontdir(const char *fname) {
+ // simply returns %GLE_TOP%/font
+ string result = GLE_TOP_DIR;
+ result += DIR_SEP;
+ result += "font";
+ result += DIR_SEP;
+ result += fname;
+ return result;
+}
+
+string gledir(const char *fname) {
+ // simply returns %GLE_TOP%
+ string result = GLE_TOP_DIR;
+ result += DIR_SEP;
+ result += fname;
+ return result;
+}
+
+string GLEExpandEnvironmentVariables(const string& str) {
+ ostringstream result;
+ for (unsigned int i = 0; i < str.size(); i++) {
+ if (str[i] == '$') {
+ string envVar;
+ for (unsigned int j = i+1; j < str.size(); j++) {
+ if (toupper(str[j]) >= 'A' && toupper(str[j]) <= 'Z') {
+ envVar += str[j];
+ } else {
+ break;
+ }
+ }
+ bool replaced = false;
+ if (!envVar.empty()) {
+ char* var = getenv(envVar.c_str());
+ if (var != NULL) {
+ replaced = true;
+ result << var;
+ }
+ }
+ if (!replaced) {
+ result << "$";
+ result << envVar;
+ }
+ i += envVar.size();
+ } else {
+ result << str[i];
+ }
+ }
+ return result.str();
+}
+
+bool GLEReadFile(const string& name, vector<string>* lines) {
+ ifstream inFile(name.c_str());
+ if (!inFile.is_open()) {
+ return false;
+ }
+ while (inFile.good()) {
+ string line;
+ getline(inFile, line);
+ lines->push_back(line);
+ }
+ inFile.close();
+ return true;
+}
+
+bool GLEReadFileBinary(const string& name, std::vector<char>* contents) {
+ ifstream inFile(name.c_str(), ios::in | ios::binary | ios::ate);
+ if (!inFile.is_open()) {
+ return false;
+ }
+ int length = inFile.tellg();
+ inFile.seekg(0, ios::beg);
+ contents->resize(length, 0);
+ inFile.read(&(*contents)[0], length);
+ inFile.close();
+ return true;
+}
+
+GLEFileIO::GLEFileIO():
+ m_file(0)
+{
+}
+
+GLEFileIO::~GLEFileIO()
+{
+}
+
+void GLEFileIO::open(const char* fname, const char* flags)
+{
+ m_fname = fname;
+ m_file = fopen(fname, flags);
+}
+
+bool GLEFileIO::isOpen() const
+{
+ return m_file != 0;
+}
+
+void GLEFileIO::close()
+{
+ if (m_file != 0) {
+ fclose(m_file);
+ m_file = 0;
+ }
+}
+
+void GLEFileIO::fread(void *ptr, size_t size, size_t nmemb)
+{
+ size_t nbRead = ::fread(ptr, size, nmemb, m_file);
+ if (nbRead != nmemb) {
+ std::cerr << "error reading from file '" << m_fname << "'";
+ }
+}
+
+void GLEFileIO::fwrite(const void *ptr, size_t size, size_t nmemb)
+{
+ size_t nbWritten = ::fwrite(ptr, size, nmemb, m_file);
+ if (nbWritten != nmemb) {
+ std::cerr << "error writing to file '" << m_fname << "'";
+ }
+}
+
+FILE* GLEFileIO::getFile()
+{
+ return m_file;
+}
+
+std::string GLEFileIO::getName() const
+{
+ return m_fname;
+}
+
+void GLEFileIO::setName(const std::string& name)
+{
+ m_fname = name;
+}
+
+int GLEFileIO::fgetc()
+{
+ return ::fgetc(m_file);
+}
+
+void GLEFileIO::fputc(int value)
+{
+ ::fputc(value, m_file);
+}
+
+int GLEFileIO::feof()
+{
+ return ::feof(m_file);
+}
+
+long GLEFileIO::ftell()
+{
+ return ::ftell(m_file);
+}
+
+int GLEFileIO::fseek(long offset, int whence)
+{
+ return ::fseek(m_file, offset, whence);
+}
+
+void GLEFileIO::fgetcstr(char* s) {
+ int i = fgetc();
+ if (i != 0) {
+ fread(s, 1, i);
+ s[i] = 0;
+ }
+}
+
+void GLEFileIO::fsendstr(const char *s) {
+ if (s == NULL) {
+ ::fputc(0, m_file);
+ } else {
+ ::fputc(strlen(s), m_file);
+ fwrite(s, 1, strlen(s));
+ }
+}
+
+int GLEReadConsoleInteger()
+{
+ char* ptr = 0;
+ std::string line;
+ getline(std::cin, line);
+ int result = strtol(line.c_str(), &ptr, 10);
+ if (ptr == 0 || *ptr != 0) {
+ return 0;
+ } else {
+ return result;
+ }
+}
+
+
diff --git a/src/gle/file_io.h b/src/gle/file_io.h
new file mode 100644
index 0000000..91f4f0f
--- /dev/null
+++ b/src/gle/file_io.h
@@ -0,0 +1,197 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#ifndef INCLUDE_FILE_IO
+#define INCLUDE_FILE_IO
+
+#ifdef __UNIX__
+ #define READ_BIN "r"
+ #define WRITE_BIN "w"
+#endif
+
+#ifdef __WIN32__
+ #define READ_BIN "rb"
+ #define WRITE_BIN "wb"
+#endif
+
+#if defined(__OS2__) && defined(__EMX__)
+ #define READ_BIN "rb"
+ #define WRITE_BIN "wb"
+#endif
+
+#ifndef IN_FILE_IO_H
+ extern string PATH_SEP;
+ extern string DIR_SEP;
+#endif
+
+class GLEProgressIndicator {
+public:
+ GLEProgressIndicator();
+ virtual ~GLEProgressIndicator();
+ virtual void indicate();
+};
+
+class GLEFindEntry {
+protected:
+ vector<string> m_ToFind;
+ vector<string> m_Found;
+ string* m_Result;
+ string m_NotFound;
+ bool m_Done;
+public:
+ GLEFindEntry(string* result);
+ ~GLEFindEntry();
+ void addToFind(const string& tofind);
+ void updateResult(bool isFinal);
+ void setFound(unsigned int i, const string& found);
+ inline void setNotFound(const string& notfound) { m_NotFound = notfound; }
+ inline unsigned int getNbFind() { return m_ToFind.size(); }
+ inline const string& getFind(unsigned int i) { return m_ToFind[i]; }
+};
+
+string fontdir(const char *fname);
+char *line(int i);
+
+bool GLEGetEnv(const string& name, string& result);
+void CopyGLETop(char* buf);
+string GetActualFilename(ifstream* file, const string& fname, const string* directory);
+void FillIncludePaths(vector<string>& IP);
+void GLEPathToVector(const string& path, vector<string>* vec);
+bool GLEStreamContains(istream& strm, const char* msg);
+void StripDirSep(string& fname);
+void StripDirSepButNotRoot(string& fname);
+void CorrectDirSep(string& fname);
+void CorrectDirSepStrip(string& fname);
+void AddDirSep(string& fname);
+string GLEAddRelPath(const string& base, int cd, const char* path);
+bool GLEAddRelPathAndFileTry(const string& base, int cd, const char* path, const char* file, string& result);
+void FileNameDotToUnderscore(string& fname);
+void GetExtension(const string& fname, string& ext);
+void GetMainName(const string& fname, string& name);
+void GetMainNameExt(const string& fname, const char* ext, string& name);
+void AddExtension(string& fname, const string& ext);
+void SplitFileName(const string& fname, string& dir, string& name);
+void SplitFileNameNoDir(const string& fname, string& name);
+void RemoveDirectoryIfEqual(string* filename, const string& directory);
+void GetDirName(const string& fname, string& dir);
+void EnsureMkDir(const string& dir);
+bool TryDeleteDir(const string& fname);
+bool TryDeleteFile(const string& fname);
+bool DeleteFileWithExt(const string& fname, const char* ext);
+bool DeleteFileWithNewExt(const string& fname, const char* ext);
+int ReadFileLine(istream& file, string& line);
+int ReadFileLineAllowEmpty(istream& file, string& line);
+bool IsDirectory(const string& fname, bool linkok = true);
+bool IsExecutable(const string& fname);
+string GLETempName();
+string GLETempDirName();
+bool GLEMoveFile(const string& from, const string& to);
+void GLECopyStream(istream& from, ostream& to);
+int GLECopyFile(const string& from, const string& to, string* err = NULL);
+bool GLEGetCrDir(string* name);
+bool GLEGetCrDirWin32(string* name);
+bool GLEChDir(const string& dir);
+void GLEFindFiles(const string& dir, vector<GLEFindEntry*>& tofind, GLEProgressIndicator* progress);
+string GLEFindLibrary(const char* name, GLEProgressIndicator* progress);
+void GLEFindPrograms(vector<GLEFindEntry*>& tofind, GLEProgressIndicator* progress);
+int GLESystem(const string& cmd, bool wait = true, bool redirout = true, istream* ins = NULL, ostream* outerrs = NULL);
+int GLERunCommand(const string& cmd, string& result);
+int GLESendSocket(const string& commands);
+bool GetExeName(const char* appname, char **argv, string& exe_name);
+string GetHomeDir();
+void GLESetGLETop(const string& cmdline);
+bool GLEFileExists(const string& fname);
+void GLESleep(int msec);
+void StripPathComponents(string* fname, int nb);
+bool IsAbsPath(const string& path);
+void GLEGetFullPath(const string& dirname, const string& fname, string& fullpath);
+string GLEExpandEnvironmentVariables(const string& str);
+bool GLEReadFile(const string& name, vector<string>* lines);
+bool GLEReadFileBinary(const string& name, std::vector<char>* contents);
+
+#define GLE_SYSTEM_OK 0
+#define GLE_SYSTEM_ERROR 1
+#define GLE_FILE_OK 0
+#define GLE_FILE_WRITE_ERROR 2
+#define GLE_FILE_READ_ERROR 3
+#define GLE_FILE_NOT_FOUND_ERROR 4
+
+class StreamTokenizerMax {
+protected:
+ char* m_LastToken;
+ int m_Sep, m_Max, m_IsOK;
+ ifstream m_File;
+public:
+ StreamTokenizerMax(const string& fname, int sep, int max);
+ ~StreamTokenizerMax();
+ bool hasMoreTokens();
+ bool isSepChar(char ch);
+ const char* nextToken();
+ void readNextToken();
+ void close();
+ inline ifstream& getFile() { return m_File; }
+};
+
+class GLEFileIO {
+public:
+ GLEFileIO();
+ ~GLEFileIO();
+ void open(const char* fname, const char* flags);
+ bool isOpen() const;
+ void close();
+ FILE* getFile();
+ std::string getName() const;
+ void setName(const std::string& name);
+ void fread(void *ptr, size_t size, size_t nmemb);
+ void fwrite(const void *ptr, size_t size, size_t nmemb);
+ int fgetc();
+ void fputc(int value);
+ int feof();
+ long ftell();
+ int fseek(long offset, int whence);
+ void fgetcstr(char* s);
+ void fsendstr(const char* s);
+
+private:
+ FILE* m_file;
+ std::string m_fname;
+};
+
+int GLEReadConsoleInteger();
+
+#endif
diff --git a/src/gle/files.txt b/src/gle/files.txt
new file mode 100644
index 0000000..1d96f7c
--- /dev/null
+++ b/src/gle/files.txt
@@ -0,0 +1,152 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+#
+# files list for GLE to be included by the makefiles
+#
+
+INCLUDES = \
+all.h \
+axis.h \
+begin.h \
+color.h \
+core.h \
+font.h \
+glepro.h \
+op_def.h \
+graph.h \
+justify.h \
+key.h \
+d_interface.h \
+pass.h \
+polish.h \
+tex.h \
+gprint.h \
+token.h \
+cutils.h \
+var.h \
+config.h \
+cmdline.h \
+glearray.h \
+gle-block.h \
+numberformat.h \
+builtin-double.h \
+gle-poppler.h \
+gle-interface$(PATH_SEP)gle-shapemath.h \
+gle-interface$(PATH_SEP)gle-base.h \
+gle-interface$(PATH_SEP)gle-datatype.h
+
+OBJECTS = \
+gle.$(OBJ_SUFF) \
+axis.$(OBJ_SUFF) \
+b_tab.$(OBJ_SUFF) \
+b_text.$(OBJ_SUFF) \
+begin.$(OBJ_SUFF) \
+core.$(OBJ_SUFF) \
+curve.$(OBJ_SUFF) \
+color.$(OBJ_SUFF) \
+drawit.$(OBJ_SUFF) \
+eval.$(OBJ_SUFF) \
+file_io.$(OBJ_SUFF) \
+fitbez.$(OBJ_SUFF) \
+fitcf.$(OBJ_SUFF) \
+fn.$(OBJ_SUFF) \
+font.$(OBJ_SUFF) \
+general.$(OBJ_SUFF) \
+op_def.$(OBJ_SUFF) \
+gprint.$(OBJ_SUFF) \
+graph.$(OBJ_SUFF) \
+graph2.$(OBJ_SUFF) \
+key.$(OBJ_SUFF) \
+keyword.$(OBJ_SUFF) \
+leastsq.$(OBJ_SUFF) \
+memory.$(OBJ_SUFF) \
+mychar.$(OBJ_SUFF) \
+pass.$(OBJ_SUFF) \
+polish.$(OBJ_SUFF) \
+run.$(OBJ_SUFF) \
+savgol.$(OBJ_SUFF) \
+sub.$(OBJ_SUFF) \
+tex.$(OBJ_SUFF) \
+token.$(OBJ_SUFF) \
+var.$(OBJ_SUFF) \
+cutils.$(OBJ_SUFF) \
+texinterface.$(OBJ_SUFF) \
+d_ps.$(OBJ_SUFF) \
+d_svg.$(OBJ_SUFF) \
+d_x.$(OBJ_SUFF) \
+d_dummy.$(OBJ_SUFF) \
+d_cairo.$(OBJ_SUFF) \
+config.$(OBJ_SUFF) \
+numberformat.$(OBJ_SUFF) \
+glearray.$(OBJ_SUFF) \
+cmdline.$(OBJ_SUFF) \
+gle-block.$(OBJ_SUFF) \
+gle-sourcefile.$(OBJ_SUFF) \
+gle-interface.$(OBJ_SUFF) \
+gle-base.$(OBJ_SUFF) \
+gle-datatype.$(OBJ_SUFF) \
+gle-poppler.$(OBJ_SUFF) \
+builtin-double.$(OBJ_SUFF)
+
+LINKOBJS = \
+bitmap$(PATH_SEP)img2ps.$(OBJ_SUFF) \
+bitmap$(PATH_SEP)lzwencode.$(OBJ_SUFF) \
+bitmap$(PATH_SEP)glegif.$(OBJ_SUFF) \
+bitmap$(PATH_SEP)glejpeg.$(OBJ_SUFF) \
+bitmap$(PATH_SEP)gletiff.$(OBJ_SUFF) \
+bitmap$(PATH_SEP)glepng.$(OBJ_SUFF) \
+bitmap$(PATH_SEP)ascii85.$(OBJ_SUFF) \
+surface$(PATH_SEP)gsurface.$(OBJ_SUFF) \
+surface$(PATH_SEP)hide.$(OBJ_SUFF) \
+surface$(PATH_SEP)fcontour.$(OBJ_SUFF) \
+surface$(PATH_SEP)ffitcontour.$(OBJ_SUFF) \
+surface$(PATH_SEP)gcontour.$(OBJ_SUFF) \
+letzfitz$(PATH_SEP)let.$(OBJ_SUFF) \
+letzfitz$(PATH_SEP)fit.$(OBJ_SUFF) \
+letzfitz$(PATH_SEP)ffit.$(OBJ_SUFF) \
+tokens$(PATH_SEP)Tokenizer.$(OBJ_SUFF) \
+tokens$(PATH_SEP)StringKeyHash.$(OBJ_SUFF) \
+tokens$(PATH_SEP)BinIO.$(OBJ_SUFF)
+
+SVGOBJS =
+
+PNGOBJS =
+
+JPEGOBJS =
+
diff --git a/src/gle/fitbez.cpp b/src/gle/fitbez.cpp
new file mode 100644
index 0000000..91f37f7
--- /dev/null
+++ b/src/gle/fitbez.cpp
@@ -0,0 +1,82 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#define GRAPHDEF extern
+#include "all.h"
+#include "gle-interface/gle-interface.h"
+#include "mem_limits.h"
+#include "cutils.h"
+#include "graph.h"
+
+int glefitcf_(int *mode,float *x, float *y, int *l, int *m, float *u, float *v, int *n);
+
+void fitbez(GLEDataPairs* data, bool multi) {
+ if (data->size() > 200 || data->size() <= 2) {
+ return;
+ }
+ int np = data->size();
+ vector<float> xin(np);
+ vector<float> yin(np);
+ for (int i = 0; i < np; i++) {
+ xin[i] = (float)data->getX(i);
+ yin[i] = (float)data->getY(i);
+ }
+ int mode = (multi ? 2 : 1);
+ int nsub = 300/(np-1);
+ if (nsub <= 1) nsub = 2;
+ int np_out = (np-1)*nsub+1;
+ vector<float> xout(np_out);
+ vector<float> yout(np_out);
+ glefitcf_(&mode, &xin[0], &yin[0], &np, &nsub, &xout[0], &yout[0], &np_out);
+ data->resize(np_out);
+ for (int i = 0; i < np_out; i++) {
+ data->set(i, xout[i], yout[i], 0);
+ }
+}
+
+void transform_log(double* v, int np) {
+ for (int i = 0; i < np; i++) {
+ v[i] = log10(v[i]);
+ }
+}
+
+void untransform_log(double* v, int np) {
+ for (int i = 0; i < np; i++) {
+ v[i] = pow(10.0, v[i]);
+ }
+}
diff --git a/src/gle/fitcf.cpp b/src/gle/fitcf.cpp
new file mode 100644
index 0000000..af5f918
--- /dev/null
+++ b/src/gle/fitcf.cpp
@@ -0,0 +1,589 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+/* fitcf.f -- translated by f2c (version of 26 February 1990 17:38:00).
+ You must link the resulting object file with the libraries:
+ -lF77 -lI77 -lm -lc (in that order)
+*/
+
+#include "all.h"
+#include "fitcf.h"
+#include "gprint.h"
+
+void gd_message__(const char *s,int l)
+{
+ gprint("%s %ld \n",s,l);
+}
+
+
+/* -- GUTRE2 */
+doublereal gutre2_(real* a,real* b)
+/*real *a, *b;*/
+{
+ /* Initialized data */
+
+ static real zero = (float)0.;
+ static real two = (float)2.;
+ static real four = (float)4.;
+
+ /* System generated locals */
+ real ret_val, r_1;
+
+ /* Local variables */
+ static real aabs, babs, r, s;
+
+/* (Euclidean Norm of 2-Vector) */
+/* Return SQRT(A**2+B**2) without doing a square root, and */
+/* without destructive underflow or overflow. */
+/* (Cleve Moler, University of New Mexico) */
+/* (09-APR-82) */
+
+
+ aabs = dabs(*a);
+ babs = dabs(*b);
+/* --- IF (BABS .GT. AABS) THEN -- SWAP A AND B */
+ if (babs <= aabs) {
+ goto L10;
+ }
+ r = babs;
+ babs = aabs;
+ aabs = r;
+/* --- END IF */
+/* --- IF (BABS .EQ. ZERO) THEN -- Special case sudden exit */
+L10:
+ if (babs != zero) {
+ goto L20;
+ }
+ ret_val = aabs;
+ goto L40;
+/* --- END IF */
+/* --- DO FOREVER */
+L20:
+/* Computing 2nd power */
+ r_1 = babs / aabs;
+ r = r_1 * r_1;
+/* --- IF ((TWO+R) .EQ. TWO) THEN -- Converged */
+ if (two + r != two) {
+ goto L30;
+ }
+ ret_val = aabs;
+ goto L40;
+/* --- END IF */
+L30:
+ s = r / (four + r);
+ aabs += two * s * aabs;
+ babs = s * babs;
+/* --- END FOREVER */
+ goto L20;
+
+L40:
+ return ret_val;
+} /* gutre2_ */
+
+
+/* -- FITCF */
+/* Subroutine */
+int glefitcf_(integer* mode,real* x,real* y,integer* l,integer* m,real* u,real* v,integer* n)
+/*
+integer *mode;
+real *x, *y;
+integer *l, *m;
+real *u, *v;
+integer *n;
+*/
+{
+ /* System generated locals */
+ integer i_1, i_2;
+ real r_1;
+ static real equiv_1[1], equiv_2[1], equiv_3[1], equiv_4[1], equiv_5[1],
+ equiv_6[1], equiv_7[1], equiv_8[1], equiv_9[1], equiv_10[1],
+ equiv_11[1], equiv_12[1];
+
+ /* Builtin functions */
+ // double sqrt();
+
+ /* Local variables */
+ static integer mode0, i, j, k;
+#define r (equiv_10)
+#define z (equiv_10)
+#define a1 (equiv_7)
+#define a2 (equiv_8)
+ static real a3, a4;
+#define b1 (equiv_9)
+#define b2 (equiv_1)
+#define b3 (equiv_2)
+#define b4 (equiv_3)
+ static integer l0, m0, n0;
+#define m1 (equiv_9)
+ static integer k5;
+#define m2 (equiv_1)
+#define m3 (equiv_2)
+#define m4 (equiv_3)
+#define p0 (equiv_5)
+ static real p1;
+#define p2 (equiv_7)
+#define p3 (equiv_9)
+#define q0 (equiv_6)
+#define q1 (equiv_4)
+#define q2 (equiv_11)
+#define q3 (equiv_12)
+#define t2 (equiv_4)
+ static real t3;
+#define w2 (equiv_11)
+#define w3 (equiv_12)
+#define x2 (equiv_5)
+ static real x3;
+ static integer modem1;
+ static real x4, x5;
+#define y2 (equiv_6)
+ static real y3, y4, y5;
+// extern doublereal gutre2_();
+#define dz (equiv_8)
+ static real rm;
+#define sw (equiv_10)
+// extern /* Subroutine */ int gd_message__();
+ static integer lm1, mm1;
+ static real cos2, cos3, sin2, sin3;
+
+/* (Smooth Curve Fitting) */
+/* This subroutine fits a smooth curve to a given set of input */
+/* data points in an X-Y plane. It interpolates points in */
+/* each interval between a pair of data points and generates a */
+/* set of output points consisting of the input data points */
+/* and the interpolated points. It can process either a */
+/* single-valued function or a multiple-valued function. */
+
+/* The input arguments are: */
+
+/* MODE = mode of the curve (must be 1 or 2) */
+/* = 1 for a single-valued function */
+/* = 2 for multiple-valued function */
+/* X = Array of dimension L storing the abscissas of input */
+/* data points (in ascending or descending order for mode */
+/* = 1) */
+/* Y = Array of dimension L storing the ordinates of input */
+/* data points */
+/* L = Number of input data points (must be 2 or greater) */
+/* M = Number of subintervals between each pair of input data */
+/* points (must be 2 or greater). */
+/* N = Number of output points */
+/* = (L-1)*M+1 */
+
+/* The output arguments are: */
+
+/* U = Array of dimension N where the abscissas of output */
+/* points are to be displayed */
+/* V = Array of dimension N where the ordinates of output */
+/* points are to be displayed */
+
+/* Author: Hiroshi Akima, "Interpolation and Smooth Curve */
+/* Fitting Based on Local Procedures", COMM. ACM 15, */
+/* 914-918 (1972), and "A New Method of Interpolation */
+/* and Smooth Curve Fitting Based on Local */
+/* Procedures", J. ACM 17, 589-602 (1970). */
+
+/* Corrections: M.R. Andersen, "Remark on Algorithm 433", ACM */
+/* Trans. on Math. Software, 2, 208 (1976). */
+/* (30-JAN-82) */
+
+/* Preliminary processing */
+
+ /* Parameter adjustments */
+ --v;
+ --u;
+ --y;
+ --x;
+
+ /* Function Body */
+ mode0 = *mode;
+ modem1 = mode0 - 1;
+ l0 = *l;
+ lm1 = l0 - 1;
+ m0 = *m;
+ mm1 = m0 - 1;
+ n0 = *n;
+ if (mode0 <= 0) {
+ goto L320;
+ }
+ if (mode0 >= 3) {
+ goto L320;
+ }
+ if (lm1 <= 0) {
+ goto L330;
+ }
+ if (mm1 <= 0) {
+ goto L340;
+ }
+ if (n0 != lm1 * m0 + 1) {
+ gprint("Improper n value %ld, wanted %ld \n",n0,lm1 * m0 + 1);
+ gprint("n0 %ld, lm1 %ld, m0 %ld l0 %ld \n",n0,lm1,m0,l0);
+ goto L350;
+ }
+
+ switch (mode0) {
+ case 1: goto L10;
+ case 2: goto L60;
+ }
+L10:
+ i = 2;
+ if ((r_1 = x[1] - x[2]) < (float)0.) {
+ goto L20;
+ } else if (r_1 == 0) {
+ gprint("Identical x values 1, %g %g \n",(double) x[1], (double) x[2]);
+ goto L360;
+ } else {
+ goto L40;
+ }
+L20:
+ if (l0 <= 2) {
+ goto L80;
+ }
+ i_1 = l0;
+ for (i = 3; i <= i_1; ++i) {
+ if ((r_1 = x[i - 1] - x[i]) < (float)0.) {
+ goto L30;
+ } else if (r_1 == 0) {
+ gprint("Identical x values i, %g %g \n",(int) i,(double) x[i-1], (double) x[i]);
+ goto L360;
+ } else {
+ goto L370;
+ }
+L30:
+ ;}
+ goto L80;
+L40:
+ if (l0 <= 2) {
+ goto L80;
+ }
+ i_1 = l0;
+ for (i = 3; i <= i_1; ++i) {
+ if ((r_1 = x[i - 1] - x[i]) < (float)0.) {
+ goto L370;
+ } else if (r_1 == 0) {
+ gprint("Identical x aavalues i, %g %g \n",(int) i,(double) x[i-1], (double) x[i]);
+ goto L360;
+ } else {
+ goto L50;
+ }
+L50:
+ ;}
+ goto L80;
+L60:
+ i_1 = l0;
+ for (i = 2; i <= i_1; ++i) {
+ if (x[i - 1] != x[i]) {
+ goto L70;
+ }
+ if (y[i - 1] == y[i]) {
+ goto L380;
+ }
+L70:
+ ;}
+
+L80:
+ k = n0 + m0;
+ i = l0 + 1;
+ i_1 = l0;
+ for (j = 1; j <= i_1; ++j) {
+ k -= m0;
+ --i;
+ u[k] = x[i];
+/* L90: */
+ v[k] = y[i];
+ }
+ rm = (real) m0;
+ rm = (float)1. / rm;
+
+/* Main DO-loop */
+
+ k5 = m0 + 1;
+ i_1 = l0;
+ for (i = 1; i <= i_1; ++i) {
+
+/* Routines to pick up necessary X and Y values and to */
+/* estimate them if necessary */
+
+ if (i > 1) {
+ goto L130;
+ }
+ x3 = u[1];
+ y3 = v[1];
+ x4 = u[m0 + 1];
+ y4 = v[m0 + 1];
+ a3 = x4 - x3;
+ *b3 = y4 - y3;
+ if (modem1 == 0) {
+ *m3 = *b3 / a3;
+ }
+ if (l0 != 2) {
+ goto L140;
+ }
+ a4 = a3;
+ *b4 = *b3;
+L100:
+ switch (mode0) {
+ case 1: goto L120;
+ case 2: goto L110;
+ }
+L110:
+ *a2 = a3 + a3 - a4;
+ *a1 = *a2 + *a2 - a3;
+L120:
+ *b2 = *b3 + *b3 - *b4;
+ *b1 = *b2 + *b2 - *b3;
+ switch (mode0) {
+ case 1: goto L180;
+ case 2: goto L210;
+ }
+L130:
+ *x2 = x3;
+ *y2 = y3;
+ x3 = x4;
+ y3 = y4;
+ x4 = x5;
+ y4 = y5;
+ *a1 = *a2;
+ *b1 = *b2;
+ *a2 = a3;
+ *b2 = *b3;
+ a3 = a4;
+ *b3 = *b4;
+ if (i >= lm1) {
+ goto L150;
+ }
+L140:
+ k5 += m0;
+ x5 = u[k5];
+ y5 = v[k5];
+ a4 = x5 - x4;
+ *b4 = y5 - y4;
+ if (modem1 == 0) {
+ *m4 = *b4 / a4;
+ }
+ goto L160;
+L150:
+ if (modem1 != 0) {
+ a4 = a3 + a3 - *a2;
+ }
+ *b4 = *b3 + *b3 - *b2;
+L160:
+ if (i == 1) {
+ goto L100;
+ }
+ switch (mode0) {
+ case 1: goto L170;
+ case 2: goto L200;
+ }
+
+/* Numerical differentiation */
+
+L170:
+ *t2 = t3;
+L180:
+ *w2 = (r_1 = *m4 - *m3, dabs(r_1));
+ *w3 = (r_1 = *m2 - *m1, dabs(r_1));
+ *sw = *w2 + *w3;
+ if (*sw != (float)0.) {
+ goto L190;
+ }
+ *w2 = (float).5;
+ *w3 = (float).5;
+ *sw = (float)1.;
+L190:
+ t3 = (*w2 * *m2 + *w3 * *m3) / *sw;
+ if (i - 1 <= 0) {
+ goto L310;
+ } else {
+ goto L240;
+ }
+
+L200:
+ cos2 = cos3;
+ sin2 = sin3;
+L210:
+ *w2 = (r_1 = a3 * *b4 - a4 * *b3, dabs(r_1));
+ *w3 = (r_1 = *a1 * *b2 - *a2 * *b1, dabs(r_1));
+ if (*w2 + *w3 != (float)0.) {
+ goto L220;
+ }
+ *w2 = gutre2_(&a3, b3);
+ *w3 = gutre2_(a2, b2);
+L220:
+ cos3 = *w2 * *a2 + *w3 * a3;
+ sin3 = *w2 * *b2 + *w3 * *b3;
+ *r = cos3 * cos3 + sin3 * sin3;
+ if (*r == (float)0.) {
+ goto L230;
+ }
+ *r = sqrt(*r);
+ cos3 /= *r;
+ sin3 /= *r;
+L230:
+ if (i - 1 <= 0) {
+ goto L310;
+ } else {
+ goto L250;
+ }
+
+/* Determination of the coefficients */
+
+L240:
+ *q2 = ((*m2 - *t2) * (float)2. + *m2 - t3) / *a2;
+ *q3 = (-(doublereal)(*m2) - *m2 + *t2 + t3) / (*a2 * *a2);
+ goto L260;
+
+L250:
+ *r = gutre2_(a2, b2);
+ p1 = *r * cos2;
+ *p2 = *a2 * (float)3. - *r * (cos2 + cos2 + cos3);
+ *p3 = *a2 - p1 - *p2;
+ *q1 = *r * sin2;
+ *q2 = *b2 * (float)3. - *r * (sin2 + sin2 + sin3);
+ *q3 = *b2 - *q1 - *q2;
+ goto L280;
+
+/* Computation of the polynomials */
+
+L260:
+ *dz = *a2 * rm;
+ *z = (float)0.;
+ i_2 = mm1;
+ for (j = 1; j <= i_2; ++j) {
+ ++k;
+ *z += *dz;
+ u[k] = *p0 + *z;
+/* L270: */
+ v[k] = *q0 + *z * (*q1 + *z * (*q2 + *z * *q3));
+ }
+ goto L300;
+
+L280:
+ *z = (float)0.;
+ i_2 = mm1;
+ for (j = 1; j <= i_2; ++j) {
+ ++k;
+ *z += rm;
+ u[k] = *p0 + *z * (p1 + *z * (*p2 + *z * *p3));
+/* L290: */
+ v[k] = *q0 + *z * (*q1 + *z * (*q2 + *z * *q3));
+ }
+
+L300:
+ ++k;
+L310:
+ ;}
+ goto L410;
+
+/* Error exit */
+
+L320:
+ gd_message__("Cannot SMOOTH: Mode out of proper range 1..2", 29L);
+ goto L400;
+L330:
+ gd_message__("Cannot SMOOTH: L = 1 or less", 13L);
+ goto L400;
+L340:
+ gd_message__("Cannot SMOOTH: M = 1 or less", 13L);
+ goto L400;
+L350:
+ gd_message__("Cannot SMOOTH: Improper N value", 16L);
+ goto L400;
+L360:
+ gd_message__("Cannot SMOOTH: Identical X values", 18L);
+ goto L390;
+L370:
+ gd_message__("Cannot SMOOTH: X values out of sequence", 24L);
+ goto L390;
+L380:
+ gd_message__("Cannot SMOOTH: Identical X and Y values", 24L);
+L390:
+L400:
+
+L410:
+ return 0;
+} /* glefitcf_ */
+
+#undef sw
+#undef dz
+#undef y2
+#undef x2
+#undef w3
+#undef w2
+#undef t2
+#undef q3
+#undef q2
+#undef q1
+#undef q0
+#undef p3
+#undef p2
+#undef p0
+#undef m4
+#undef m3
+#undef m2
+#undef m1
+#undef b4
+#undef b3
+#undef b2
+#undef b1
+#undef a2
+#undef a1
+#undef z
+#undef r
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/gle/fitcf.h b/src/gle/fitcf.h
new file mode 100644
index 0000000..3895b3e
--- /dev/null
+++ b/src/gle/fitcf.h
@@ -0,0 +1,265 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+/* f2c.h -- Standard Fortran to C header file */
+
+/** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed."
+
+ - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */
+
+#ifndef F2C_INCLUDE
+#define F2C_INCLUDE
+
+typedef int integer;
+typedef char *address;
+typedef short int shortint;
+typedef float real;
+typedef double doublereal;
+typedef struct { real r, i; } complex;
+typedef struct { doublereal r, i; } doublecomplex;
+typedef int logical;
+typedef short int shortlogical;
+
+#define TRUE_ (1)
+#define FALSE_ (0)
+
+/* Extern is for use with -E */
+#ifndef Extern
+#define Extern extern
+#endif
+
+/* I/O stuff */
+
+#ifdef f2c_i2
+/* for -i2 */
+typedef short flag;
+typedef short ftnlen;
+typedef short ftnint;
+#else
+typedef int flag;
+typedef int ftnlen;
+typedef int ftnint;
+#endif
+
+/*external read, write*/
+typedef struct
+{ flag cierr;
+ ftnint ciunit;
+ flag ciend;
+ char *cifmt;
+ ftnint cirec;
+} cilist;
+
+/*internal read, write*/
+typedef struct
+{ flag icierr;
+ char *iciunit;
+ flag iciend;
+ char *icifmt;
+ ftnint icirlen;
+ ftnint icirnum;
+} icilist;
+
+/*open*/
+typedef struct
+{ flag oerr;
+ ftnint ounit;
+ char *ofnm;
+ ftnlen ofnmlen;
+ char *osta;
+ char *oacc;
+ char *ofm;
+ ftnint orl;
+ char *oblnk;
+} olist;
+
+/*close*/
+typedef struct
+{ flag cerr;
+ ftnint cunit;
+ char *csta;
+} cllist;
+
+/*rewind, backspace, endfile*/
+typedef struct
+{ flag aerr;
+ ftnint aunit;
+} alist;
+
+/* inquire */
+typedef struct
+{ flag inerr;
+ ftnint inunit;
+ char *infile;
+ ftnlen infilen;
+ ftnint *inex; /*parameters in standard's order*/
+ ftnint *inopen;
+ ftnint *innum;
+ ftnint *innamed;
+ char *inname;
+ ftnlen innamlen;
+ char *inacc;
+ ftnlen inacclen;
+ char *inseq;
+ ftnlen inseqlen;
+ char *indir;
+ ftnlen indirlen;
+ char *infmt;
+ ftnlen infmtlen;
+ char *inform;
+ ftnint informlen;
+ char *inunf;
+ ftnlen inunflen;
+ ftnint *inrecl;
+ ftnint *innrec;
+ char *inblank;
+ ftnlen inblanklen;
+} inlist;
+
+#define VOID void
+
+union Multitype { /* for multiple entry points */
+ shortint h;
+ integer i;
+ real r;
+ doublereal d;
+ complex c;
+ doublecomplex z;
+ };
+
+typedef union Multitype Multitype;
+
+typedef int Long;
+
+struct Vardesc { /* for Namelist */
+ char *name;
+ char *addr;
+ Long *dims;
+ int type;
+ };
+typedef struct Vardesc Vardesc;
+
+struct Namelist {
+ char *name;
+ Vardesc **vars;
+ int nvars;
+ };
+typedef struct Namelist Namelist;
+
+#define abs(x) ((x) >= 0 ? (x) : -(x))
+#define dabs(x) (doublereal)abs(x)
+#define min(a,b) ((a) <= (b) ? (a) : (b))
+#define max(a,b) ((a) >= (b) ? (a) : (b))
+#define dmin(a,b) (doublereal)min(a,b)
+#define dmax(a,b) (doublereal)max(a,b)
+
+/* procedure parameter types for -A and -C++ */
+
+#define F2C_proc_par_types 1
+#ifdef __cplusplus
+typedef int /* Unknown procedure type */ (*U_fp)(...);
+typedef shortint (*J_fp)(...);
+typedef integer (*I_fp)(...);
+typedef real (*R_fp)(...);
+typedef doublereal (*D_fp)(...), (*E_fp)(...);
+typedef /* Complex */ VOID (*C_fp)(...);
+typedef /* Double Complex */ VOID (*Z_fp)(...);
+typedef logical (*L_fp)(...);
+typedef shortlogical (*K_fp)(...);
+typedef /* Character */ VOID (*H_fp)(...);
+typedef /* Subroutine */ int (*S_fp)(...);
+#else
+typedef int /* Unknown procedure type */ (*U_fp)();
+typedef shortint (*J_fp)();
+typedef integer (*I_fp)();
+typedef real (*R_fp)();
+typedef doublereal (*D_fp)(), (*E_fp)();
+typedef /* Complex */ VOID (*C_fp)();
+typedef /* Double Complex */ VOID (*Z_fp)();
+typedef logical (*L_fp)();
+typedef shortlogical (*K_fp)();
+typedef /* Character */ VOID (*H_fp)();
+typedef /* Subroutine */ int (*S_fp)();
+#endif
+/* E_fp is for real functions when -R is not specified */
+/* typedef VOID C_f; complex function */
+/* typedef VOID H_f; character function */
+/* typedef VOID Z_f; double complex function */
+typedef doublereal E_f; /* real function with -R not specified */
+
+/* undef any lower-case symbols that your C compiler predefines, e.g.: */
+
+#ifndef Skip_f2c_Undefs
+/* #undef cray */
+#undef gcos
+#undef mc68010
+#undef mc68020
+#undef mips
+#undef pdp11
+#undef sgi
+#undef sparc
+#undef sun
+#undef sun2
+#undef sun3
+#undef sun4
+#undef u370
+#undef u3b
+#undef u3b2
+#undef u3b5
+#undef unix
+#undef vax
+#endif
+#endif
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/gle/fn.cpp b/src/gle/fn.cpp
new file mode 100644
index 0000000..7410c09
--- /dev/null
+++ b/src/gle/fn.cpp
@@ -0,0 +1,201 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#include "all.h"
+#include "cutils.h"
+#include "fn.h"
+
+/*-------------------------------------------------------------------*/
+/* Find the function called *cp, and return it's number */
+/*-------------------------------------------------------------------*/
+
+/* You can add a function, you MUST place it in alphabetical order */
+/* and give it the next unused index number */
+
+/* ret = Type of returned value, 1=number, 2=string */
+/* np = number of parameters expected */
+/* Parameters p0...p4 == 1=number, 2=string, 0=none (e.g. height()).*/
+
+// current max is 97 ==> FN_GETENV
+
+#define NKEYS (sizeof keywfn / sizeof(struct keyw))
+struct keyw { const char *word; int index; int ret,np,p[5]; } keywfn[] = {
+ { " ", 0, 1,0, { 0,0,0,0,0 } },
+ { "+", 1, 1,0, { 0,0,0,0,0 } },
+ { "-", 2, 1,0, { 0,0,0,0,0 } },
+ { "ABS", 3, 1,1, { 1,0,0,0,0 } },
+ { "ACOS", 53, 1,1, { 1,0,0,0,0 } },
+ { "ACOSH", 68, 1,1, { 1,0,0,0,0 } },
+ { "ACOT", 56, 1,1, { 1,0,0,0,0 } },
+ { "ACOTH", 71, 1,1, { 1,0,0,0,0 } },
+ { "ACSC", 58, 1,1, { 1,0,0,0,0 } },
+ { "ACSCH", 73, 1,1, { 1,0,0,0,0 } },
+ { "ARG", FN_ARG, 1,1, { 1,0,0,0,0 } },
+ { "ARG$", FN_ARGS, 2,1, { 1,0,0,0,0 } },
+ { "ASEC", 57, 1,1, { 1,0,0,0,0 } },
+ { "ASECH", 72, 1,1, { 1,0,0,0,0 } },
+ { "ASIN", 54, 1,1, { 1,0,0,0,0 } },
+ { "ASINH", 69, 1,1, { 1,0,0,0,0 } },
+ { "ATAN", 4, 1,1, { 1,0,0,0,0 } },
+ { "ATAN2", FN_ATAN2, 1,2, { 1,1,0,0,0 } },
+ { "ATANH", 70, 1,1, { 1,0,0,0,0 } },
+ { "ATN", 4, 1,1, { 1,0,0,0,0 } }, // for backward coompatability same as ATAN
+ { "CHR$", 52, 2,1, { 1,0,0,0,0 } },
+ { "COS", 5, 1,1, { 1,0,0,0,0 } },
+ { "COSH", 62, 1,1, { 1,0,0,0,0 } },
+ { "COT", 59, 1,1, { 1,0,0,0,0 } },
+ { "COTH", 65, 1,1, { 1,0,0,0,0 } },
+ { "CSC", 61, 1,1, { 1,0,0,0,0 } },
+ { "CSCH", 67, 1,1, { 1,0,0,0,0 } },
+ { "CVTCOLOR", 49, 1,1, { 2,0,0,0,0 } },
+ { "CVTFONT", 50, 1,1, { 2,0,0,0,0 } },
+ { "CVTGRAY", 45, 1,1, { 1,0,0,0,0 } },
+ { "CVTINT", 46, 1,1, { 1,0,0,0,0 } },
+ { "CVTMARKER", 48, 1,1, { 2,0,0,0,0 } },
+ { "CVTRGB", 47, 1,3, { 1,1,1,0,0 } },
+ { "DATAXVALUE", FN_DATAXVALUE, 1,2, { 2,1,0,0,0 } },
+ { "DATAYVALUE", FN_DATAYVALUE, 1,2, { 2,1,0,0,0 } },
+ { "DATE$", 6, 2,0, { 0,0,0,0,0 } },
+ { "DEVICE$", 51, 2,0, { 0,0,0,0,0 } },
+ { "EOF", 55, 1,1, { 1,0,0,0,0 } },
+ { "EVAL", FN_EVAL, 1,1, { 2,0,0,0,0 } },
+ { "EXP", 7, 1,1, { 1,0,0,0,0 } },
+ { "FEOF", 55, 1,1, { 1,0,0,0,0 } },
+ { "FILE$", FN_FILE, 2,0, { 0,0,0,0,0 } },
+ { "FIX", 8, 1,1, { 1,0,0,0,0 } },
+ { "FONT", FN_FONT, 1,1, { 2,0,0,0,0 } },
+ { "FORMAT$", 79, 2,2, { 1,2,0,0,0 } },
+ { "GETENV", FN_GETENV, 2,1, { 2,0,0,0,0 } },
+ { "HEIGHT", 9, 1,1, { 0,0,0,0,0 } },
+ { "INT", 10, 1,1, { 1,0,0,0,0 } },
+ { "ISNAME", FN_ISNAME, 1,1, { 2,0,0,0,0 } },
+ { "JUSTIFY", FN_JUSTIFY, 1,1, { 2,0,0,0,0 } },
+ { "LEFT$", 11, 2,2, { 2,1,0,0,0 } },
+ { "LEN", 12, 1,1, { 2,0,0,0,0 } },
+ { "LOG", 13, 1,1, { 1,0,0,0,0 } },
+ { "LOG10", 14, 1,1, { 1,0,0,0,0 } },
+ { "MAX", FN_MAX, 1,2, { 1,1,0,0,0 } },
+ { "MIN", FN_MIN, 1,2, { 1,1,0,0,0 } },
+ { "NARGS", FN_NARGS, 1,0, { 0,0,0,0,0 } },
+ { "NDATA", FN_NDATA, 1,1, { 2,0,0,0,0 } },
+ { "NDATASETS", FN_NDATASETS, 1,0, { 0,0,0,0,0 } },
+ { "NOT", 15, 1,1, { 1,0,0,0,0 } },
+ { "NUM$", 16, 2,1, { 1,0,0,0,0 } },
+ { "NUM1$", 17, 2,1, { 1,0,0,0,0 } },
+ { "PAGEHEIGHT", 18, 1,0, { 0,0,0,0,0 } },
+ { "PAGEWIDTH", 19, 1,0, { 0,0,0,0,0 } },
+ { "PATH$", FN_PATH, 2,0, { 0,0,0,0,0 } },
+ { "POINTX", 77, 1,1, { 2,0,0,0,0 } },
+ { "POINTY", 78, 1,1, { 2,0,0,0,0 } },
+ { "POS", 20, 1,3, { 2,2,1,0,0 } },
+ { "PTX", 77, 1,1, { 2,0,0,0,0 } },
+ { "PTY", 78, 1,1, { 2,0,0,0,0 } },
+ { "RGB", 47, 1,3, { 1,1,1,0,0 } },
+ { "RGB255", 80, 1,3, { 1,1,1,0,0 } },
+ { "RGBA", FN_RGBA, 1,4, { 1,1,1,1,0 } },
+ { "RGBA255", FN_RGBA255, 1,4, { 1,1,1,1,0 } },
+ { "RIGHT$", 21, 2,2, { 2,1,0,0,0 } },
+ { "RND", 22, 1,1, { 1,0,0,0,0 } },
+ { "SDIV", FN_SDIV, 1,2, { 1,1,0,0,0 } },
+ { "SEC", 60, 1,1, { 1,0,0,0,0 } },
+ { "SECH", 66, 1,1, { 1,0,0,0,0 } },
+ { "SEG$", 23, 2,3, { 2,1,1,0,0 } },
+ { "SGN", 24, 1,1, { 1,0,0,0,0 } },
+ { "SIN", 25, 1,1, { 1,0,0,0,0 } },
+ { "SINH", 63, 1,1, { 1,0,0,0,0 } },
+ { "SQR", 26, 1,1, { 1,0,0,0,0 } },
+ { "SQRT", 27, 1,1, { 1,0,0,0,0 } },
+ { "TAN", 28, 1,1, { 1,0,0,0,0 } },
+ { "TANH", 64, 1,1, { 1,0,0,0,0 } },
+ { "TDEPTH", 29, 1,1, { 2,0,0,0,0 } },
+ { "THEIGHT", 30, 1,1, { 2,0,0,0,0 } },
+ { "TIME$", 31, 2,0, { 0,0,0,0,0 } },
+ { "TODEG", 74, 1,1, { 1,0,0,0,0 } },
+ { "TORAD", 75, 1,1, { 1,0,0,0,0 } },
+ { "TWIDTH", 32, 1,1, { 2,0,0,0,0 } },
+ { "VAL", 33, 1,1, { 2,0,0,0,0 } },
+ { "WIDTH", 34, 1,1, { 0,0,0,0,0 } },
+ { "XBAR", FN_XBAR, 1,2, { 1,1,0,0,0 } },
+ { "XEND", 35, 1,0, { 0,0,0,0,0 } },
+ { "XG", 36, 1,1, { 1,0,0,0,0 } },
+ { "XG3D", FN_XG3D, 1,3, { 1,1,1,0,0 } },
+ { "XGRAPH", 36, 1,1, { 1,0,0,0,0 } },
+ { "XMAX", 37, 1,1, { 0,0,0,0,0 } },
+ { "XMIN", 38, 1,1, { 0,0,0,0,0 } },
+ { "XPOS", 39, 1,0, { 0,0,0,0,0 } },
+ { "XY2ANGLE", FN_XY2ANGLE, 1,2, { 1,1,0,0,0 } },
+ { "YEND", 40, 1,0, { 0,0,0,0,0 } },
+ { "YG", 41, 1,1, { 1,0,0,0,0 } },
+ { "YG3D", FN_YG3D, 1,3, { 1,1,1,0,0 } },
+ { "YGRAPH", 41, 1,1, { 1,0,0,0,0 } },
+ { "YMAX", 42, 1,1, { 0,0,0,0,0 } },
+ { "YMIN", 43, 1,1, { 0,0,0,0,0 } },
+ { "YPOS", 44, 1,0, { 0,0,0,0,0 } }
+};
+
+int binsearch(char *word, struct keyw tab[], int n);
+
+void find_un(char *cp, int *idx,int *ret,int *np,int **plist)
+{
+ int i;
+ i = binsearch(cp,keywfn,NKEYS);
+ *idx = keywfn[i].index;
+ *ret = keywfn[i].ret;
+ *np = keywfn[i].np;
+ *plist = &keywfn[i].p[0];
+}
+
+/*------------------------------------------------------------------*/
+/* Simple binary search */
+/*------------------------------------------------------------------*/
+int binsearch(char *word, struct keyw tab[], int n)
+{
+ int cond,low,high,mid;
+ low = 0;
+ high = n-1;
+ while (low <= high) {
+ mid = (low+high) / 2;
+ if ((cond = str_i_cmp(word,tab[mid].word)) < 0)
+ high = mid - 1;
+ else if (cond > 0)
+ low = mid + 1;
+ else
+ return mid;
+ }
+ return 0;
+}
diff --git a/src/gle/fn.h b/src/gle/fn.h
new file mode 100644
index 0000000..38d858b
--- /dev/null
+++ b/src/gle/fn.h
@@ -0,0 +1,66 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#define FN_RGB 47
+#define FN_EVAL 76
+#define FN_NARGS 81
+#define FN_ARG 82
+#define FN_ARGS 83
+#define FN_MIN 84
+#define FN_MAX 85
+#define FN_SDIV 86
+#define FN_XBAR 87
+#define FN_XY2ANGLE 88
+#define FN_DATAXVALUE 89
+#define FN_DATAYVALUE 90
+#define FN_NDATA 91
+#define FN_ATAN2 92
+#define FN_ISNAME 93
+#define FN_FILE 94
+#define FN_PATH 95
+#define FN_FONT 96
+#define FN_GETENV 97
+#define FN_XG3D 98
+#define FN_YG3D 99
+#define FN_JUSTIFY 100
+#define FN_RGBA 101
+#define FN_RGBA255 102
+#define FN_NDATASETS 103
+#define FN_DI 104
+
+#define FN_BUILTIN_MAGIC 60
diff --git a/src/gle/font.cpp b/src/gle/font.cpp
new file mode 100644
index 0000000..87fe5b6
--- /dev/null
+++ b/src/gle/font.cpp
@@ -0,0 +1,461 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#include "all.h"
+#include "tokens/Tokenizer.h"
+#include "core.h"
+#include "file_io.h"
+#include "gprint.h"
+#include "cutils.h"
+#include "gle-interface/gle-interface.h"
+
+int text_gprint(int *in,int ilen);
+int fftext_block(uchar *s,double width,int justify);
+void font_load(void) throw (ParserError);
+void font_init(void);
+
+int do_prim(uchar **in,int *out,int *lout); /* \frac{text}{text} */
+
+#define true (!false)
+#define false 0
+
+#define dbg if ((gle_debug & 32)>0)
+
+
+extern int gle_debug;
+/* typedef char unsigned uchar; */
+
+/* FONT.DAT contains names of fonts, and indexes for each font, and
+ names of metric, vector and bitmap files
+ This enables fonts to be referred to by number, as their index will
+ not change */
+
+#include "font.h"
+
+class GLEFontUnicodeMap : public map<unsigned int, unsigned int> {
+};
+
+GLECoreFont* init_core_font(int n) {
+ while ((unsigned int)n >= fnt.size()) {
+ fnt.push_back(new GLECoreFont());
+ }
+ return fnt[n];
+}
+
+GLECoreFont* get_core_font(int n) {
+ if (n < 0 || (unsigned int)n >= fnt.size()) {
+ gprint("no font number: %d", n);
+ return fnt[1];
+ }
+ return fnt[n];
+}
+
+GLECoreFont* get_core_font_ensure_loaded(int font) {
+ if (fnt.size() == 0) {
+ /* load font.dat */
+ /* FIXME: move loading of font.dat to GLE's mandatory init code? */
+ font_load();
+ }
+ if (font < 0 || (unsigned int)font >= fnt.size()) {
+ gprint("no font number: %d", font);
+ font = 1;
+ }
+ GLECoreFont* cfont = fnt[font];
+ if (!cfont->metric_loaded) {
+ /* load font metric */
+ font_load_metric(font);
+ }
+ return cfont;
+}
+
+char *font_getname(int i) {
+ GLECoreFont* cfont = get_core_font(i);
+ return cfont->name;
+}
+
+void char_bbox(int ff, int cc, double *xx1, double *yy1, double *xx2, double *yy2) {
+ GLECoreFont* cfont = get_core_font_ensure_loaded(ff);
+ GLEFontCharData* cdata = cfont->getCharData(cc);
+ if (cdata != 0) {
+ *xx1 = cdata->x1;
+ *yy1 = cdata->y1;
+ *xx2 = cdata->x2;
+ *yy2 = cdata->y2;
+ } else {
+ *xx1 = 0;
+ *xx2 = 0;
+ *yy1 = 0;
+ *yy2 = 0;
+ }
+}
+
+void font_get_chardata(struct char_data *cd, int ff, int cc) {
+ GLECoreFont* cfont = get_core_font(ff);
+ GLEFontCharData* cdata = cfont->getCharData(cc);
+ if (cdata != 0) {
+ cd->x1 = cdata->x1;
+ cd->y1 = cdata->y1;
+ cd->x2 = cdata->x2;
+ cd->y2 = cdata->y2;
+ } else {
+ cd->x1 = 0;
+ cd->y1 = 0;
+ cd->x2 = 0;
+ cd->y2 = 0;
+ }
+}
+
+void font_load(void) throw(ParserError) {
+ /* load font.dat */
+ char inbuff[200];
+ string fname = fontdir("font.dat");
+ FILE *fptr = fopen(fname.c_str(), READ_BIN);
+ if (fptr == NULL) {
+ TokenizerPos pos;
+ pos.setColumn(-1);
+ stringstream err_str;
+ err_str << "unable to open 'font.dat' file '" << fname << "': ";
+ str_get_system_error(err_str);
+ err_str << endl;
+ err_str << "set GLE_TOP to the directory containing the file \"inittex.ini\" and the fonts";
+ ParserError err_exp(err_str.str(), pos, NULL);
+ throw err_exp;
+ }
+ /* font_load() */
+ GLEInterface* iface = GLEGetInterfacePointer();
+ TokenizerLanguage lang;
+ lang.setSpaceTokens(" ,\t\r\n");
+ lang.setSingleCharTokens("()");
+ lang.setLineCommentTokens("!");
+ StringTokenizer tokens(&lang);
+ while(fgets(SC inbuff, 200, fptr) != NULL) {
+ tokens.set_string(inbuff);
+ if (tokens.has_more_tokens()) {
+ GLEFont* font = new GLEFont();
+ string name = tokens.next_token();
+ // font zero is a dummy; font 1 is the first valid font
+ int n = tokens.next_integer();
+ font->setIndex(n);
+ font->setName(name);
+ GLECoreFont* cfont = init_core_font(n);
+ mystrcpy(&cfont->name, (char*)name.c_str());
+ const string& metric = tokens.next_token();
+ mystrcpy(&cfont->file_metric, (char*)metric.c_str());
+ const string& vec = tokens.next_token();
+ mystrcpy(&cfont->file_vector, (char*)vec.c_str());
+ const string& bitmap = tokens.next_token();
+ mystrcpy(&cfont->file_bitmap, (char*)bitmap.c_str());
+ if (tokens.is_next_token("%")) {
+ const string& full = tokens.read_line();
+ font->setFullName(full);
+ iface->addFont(font);
+ } else if (tokens.is_next_token("-")) {
+ string type = tokens.next_token();
+ tokens.ensure_next_token("(");
+ string parent = tokens.next_token();
+ tokens.ensure_next_token(")");
+ GLEFont* pfont = iface->getFont(parent);
+ if (pfont == NULL) {
+ g_throw_parser_error("parent font '", parent.c_str(), "' not found");
+ } else {
+ iface->addSubFont(font);
+ font->setParent(pfont);
+ if (type == "B") pfont->setStyle(GLEFontStyleBold, font);
+ else if (type == "I") pfont->setStyle(GLEFontStyleItalic, font);
+ else if (type == "BI") pfont->setStyle(GLEFontStyleBoldItalic, font);
+ else g_throw_parser_error("font style '", type.c_str(), "' not defined");
+ }
+ }
+ }
+ }
+ fclose(fptr);
+}
+
+void font_file_vector(int ff, char *s) {
+ if (fnt.size() == 0) {
+ /* load font.dat */
+ font_load();
+ }
+ GLECoreFont* cfont = get_core_font(ff);
+ strcpy(s, cfont->file_vector);
+}
+
+void font_replace_vector(int ff) {
+ if (fnt.size() == 0) {
+ /* load font.dat */
+ font_load();
+ }
+ GLECoreFont* cfont = get_core_font(ff);
+ myfree(cfont->file_vector);
+ cfont->file_vector = sdup(fnt[17]->file_vector);
+}
+
+int font_get_encoding(int ff) {
+ GLECoreFont* cfont = get_core_font_ensure_loaded(ff);
+ return cfont->info.encoding;
+}
+
+int check_has_font(const std::string& name) {
+ if (fnt.size() == 0) {
+ /* load font.dat */
+ font_load();
+ }
+ int ff = 0;
+ // font zero is a dummy!
+ for (unsigned int i = 1; i < fnt.size(); i++) {
+ if (fnt[i]->name != NULL && str_i_equals(name, fnt[i]->name)) {
+ ff = i;
+ break;
+ }
+ }
+ if (ff == 0) {
+ /* don't know about font */
+ return 0;
+ }
+ GLECoreFont* cfont = fnt[ff];
+ if (cfont->metric_loaded) {
+ return 1;
+ }
+ if (cfont->error) {
+ return 0;
+ }
+ string fname = fontdir(cfont->file_metric);
+ if (GLEFileExists(fname)) {
+ font_load_metric(ff);
+ } else {
+ cfont->error = true;
+ }
+ return cfont->error ? 0 : 1;
+}
+
+void font_load_metric(int ff) {
+ if (ff == 0) {
+ gprint("There is no zero font, error loading font \n");
+ return;
+ }
+ if (fnt.size() == 0) {
+ /* load font.dat */
+ font_load();
+ }
+ GLECoreFont* cfont = get_core_font(ff);
+ if (cfont->metric_loaded) {
+ /* font metric file already loaded */
+ return;
+ }
+ /* don't do multiple tries */
+ cfont->metric_loaded = true;
+ /* try to open font metric file */
+ string fname = fontdir(cfont->file_metric);
+ GLEFileIO fmt;
+ fmt.open(fname.c_str(), READ_BIN);
+ if (!fmt.isOpen()) {
+ cfont->error = true;
+ ostringstream err;
+ err << "font metric file not found: '" << fname << "'; spacing will be incorrect";
+ g_message(err.str().c_str());
+ myfree(cfont->file_metric);
+ cfont->file_metric = sdup(fnt[1]->file_metric);
+ fname = fontdir(cfont->file_metric);
+ fmt.open(fname.c_str(), READ_BIN);
+ if (!fmt.isOpen()) {
+ gprint("can't open metric file: '%s'\n", fname.c_str());
+ return;
+ }
+ }
+ /* reads in font data */
+ fmt.fread(&cfont->info, sizeof(GLEFontTable), 1);
+ dbg printf("Encoding %d slant %f, box %f %f %f %f \n",
+ cfont->info.encoding,cfont->info.slant,cfont->info.fx1,
+ cfont->info.fy1,cfont->info.fx2,cfont->info.fy2);
+ /* read number of characters */
+ int nb_chars;
+ fmt.fread(&nb_chars, sizeof(int), 1);
+ /* read unicode map */
+ int uni_map_size;
+ fmt.fread(&uni_map_size, sizeof(int), 1);
+ if (uni_map_size != 0) {
+ unsigned int* encoding_unicode = new unsigned int[uni_map_size];
+ unsigned int* encoding_code = new unsigned int[uni_map_size];
+ fmt.fread(encoding_unicode, sizeof(unsigned int), uni_map_size);
+ fmt.fread(encoding_code, sizeof(unsigned int), uni_map_size);
+ for (int i = 0; i < uni_map_size; i++) {
+ if (encoding_code[i] < (unsigned int)nb_chars) {
+ (*cfont->unimap)[encoding_unicode[i]] = encoding_code[i];
+ }
+ }
+ delete[] encoding_unicode;
+ delete[] encoding_code;
+ }
+ /* read character data */
+ for (int i = 0; i < nb_chars; i++) {
+ GLEFontCharData* cdata = cfont->addCharData();
+ if (fmt.fgetc() == 1) {
+ fmt.fread(&cdata->wx, sizeof(float), 1);
+ fmt.fread(&cdata->wy, sizeof(float), 1);
+ fmt.fread(&cdata->x1, sizeof(float), 1);
+ fmt.fread(&cdata->y1, sizeof(float), 1);
+ fmt.fread(&cdata->x2, sizeof(float), 1);
+ fmt.fread(&cdata->y2, sizeof(float), 1);
+ unsigned int ksize;
+ fmt.fread(&ksize, sizeof(unsigned int), 1);
+ if (ksize > 0) {
+ cdata->Kern.resize(ksize);
+ fmt.fread(&cdata->Kern[0], sizeof(GLEFontKernInfo), ksize);
+ }
+ unsigned int lsize;
+ fmt.fread(&lsize, sizeof(unsigned int), 1);
+ if (lsize > 0) {
+ cdata->Lig.resize(lsize);
+ fmt.fread(&cdata->Lig[0], sizeof(GLEFontLigatureInfo), lsize);
+ }
+ }
+ }
+ /* add some dummy characters */
+ for (int i = nb_chars; i <= 256; i++) {
+ /* some routines in tex.cpp assume fonts have at least this number of characters */
+ cfont->addCharData();
+ }
+ /* Also do the composites to support accents in GLE (new 070506) */
+ int char_code = 0;
+ fmt.fread(&char_code, sizeof(int), 1);
+ while (char_code != 0) {
+ int accent_idx;
+ fmt.fread(&accent_idx, sizeof(int), 1);
+ int hash_key = (char_code << 7) | accent_idx;
+ FontCompositeInfo* info = new FontCompositeInfo();
+ cfont->composites.add_item(hash_key, info);
+ fmt.fread(&info->c1, sizeof(int), 1);
+ fmt.fread(&info->dx1, sizeof(double), 1);
+ fmt.fread(&info->dy1, sizeof(double), 1);
+ fmt.fread(&info->c2, sizeof(int), 1);
+ fmt.fread(&info->dx2, sizeof(double), 1);
+ fmt.fread(&info->dy2, sizeof(double), 1);
+ /* another character in the file? */
+ fmt.fread(&char_code, sizeof(int), 1);
+ }
+ fmt.close();
+}
+
+GLEFontCharData::GLEFontCharData() {
+ wx = 0.0;
+ wy = 0.0;
+ x1 = 0.0;
+ y1 = 0.0;
+ x2 = 0.0;
+ y2 = 0.0;
+}
+
+GLEFontCharData::~GLEFontCharData() {
+}
+
+GLECoreFont::GLECoreFont() {
+ name = NULL;
+ full_name = NULL;
+ file_metric = NULL;
+ file_vector = NULL;
+ file_bitmap = NULL;
+ metric_loaded = false;
+ error = false;
+ unimap = new GLEFontUnicodeMap();
+}
+
+GLECoreFont::~GLECoreFont() {
+}
+
+int GLECoreFont::char_lig(int *c1, int c2) {
+ GLEFontCharData* ch_data = getCharData(*c1);
+ if (ch_data != 0) {
+ for (unsigned int i = 0; i < ch_data->Lig.size(); i++) {
+ if (ch_data->Lig[i].NextChar == (unsigned int)c2) {
+ *c1 = ch_data->Lig[i].RepChar;
+ return *c1;
+ }
+ }
+ }
+ return 0;
+}
+
+void GLECoreFont::char_kern(int c1, int c2, float *w) {
+ GLEFontCharData* ch_data = getCharData(c1);
+ if (ch_data != 0) {
+ for (unsigned int i = 0; i < ch_data->Kern.size(); i++) {
+ if (ch_data->Kern[i].CharCode == (unsigned int)c2) {
+ *w = ch_data->Kern[i].X;
+ return;
+ }
+ }
+ }
+ *w = 0;
+}
+
+FontCompositeInfo* GLECoreFont::get_composite_char(int ch, int accent) {
+ int hash_key = (ch << 7) | accent;
+ return composites.try_get(hash_key);
+}
+
+int GLECoreFont::unicode_map(unsigned int ucode) {
+ GLEFontUnicodeMap::iterator i = unimap->find(ucode);
+ if (i == unimap->end()) {
+ return -1;
+ } else {
+ return i->second;
+ }
+}
+
+GLEFontCharData* GLECoreFont::getCharData(int cc) {
+ if (cc >= 0 && (unsigned int)cc < cdata.size()) {
+ return cdata[cc];
+ } else {
+ return 0;
+ }
+}
+
+GLEFontCharData* GLECoreFont::addCharData() {
+ cdata.push_back(new GLEFontCharData());
+ return cdata[cdata.size() - 1];
+}
+
+GLEFontCharData* GLECoreFont::getCharDataThrow(int cc) {
+ GLEFontCharData* result = getCharData(cc);
+ if (result == 0) {
+ std::ostringstream msg;
+ msg << "font '" << name << "' does not contain a character with id = " << cc;
+ g_throw_parser_error(msg.str());
+ }
+ return result;
+}
diff --git a/src/gle/font.h b/src/gle/font.h
new file mode 100644
index 0000000..71f10d8
--- /dev/null
+++ b/src/gle/font.h
@@ -0,0 +1,114 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+struct char_data {
+ float wx, wy, x1, y1, x2, y2;
+};
+
+class FontCompositeInfo {
+public:
+ int c1, c2;
+ double dx1, dy1;
+ double dx2, dy2;
+};
+
+typedef struct {
+ unsigned int CharCode;
+ float X;
+ float Y;
+} GLEFontKernInfo;
+
+typedef struct {
+ unsigned int NextChar;
+ unsigned int RepChar;
+} GLEFontLigatureInfo;
+
+typedef struct {
+ int encoding; /* 1 = postscript text, 2 = postscrip symbol, 3 = TEX text, 4 = TEX symbol, 5 = GLE markers */
+ float space, space_stretch, space_shrink;
+ float scale, slant, uposition, uthickness;
+ float fx1, fy1, fx2, fy2, caphei, xhei, descender, ascender;
+} GLEFontTable;
+
+class GLEFontCharData {
+public:
+ vector<GLEFontKernInfo> Kern;
+ vector<GLEFontLigatureInfo> Lig;
+ float wx, wy, x1, y1, x2, y2;
+public:
+ GLEFontCharData();
+ ~GLEFontCharData();
+};
+
+class GLEFontUnicodeMap;
+
+class GLECoreFont {
+public:
+ char *name;
+ char *full_name;
+ char *file_metric;
+ char *file_vector;
+ char *file_bitmap;
+ bool metric_loaded;
+ bool error;
+ GLEFontTable info;
+ GLEFontUnicodeMap* unimap;
+ IntKeyHash<FontCompositeInfo*> composites;
+public:
+ GLECoreFont();
+ ~GLECoreFont();
+ int char_lig(int *c1, int c2);
+ void char_kern(int c1, int c2, float *w);
+ FontCompositeInfo* get_composite_char(int ch, int accent);
+ int unicode_map(unsigned int ucode);
+ GLEFontCharData* getCharData(int cc);
+ GLEFontCharData* getCharDataThrow(int cc);
+ GLEFontCharData* addCharData();
+
+private:
+ std::vector<GLEFontCharData*> cdata;
+};
+
+GLECoreFont* get_core_font(int font);
+GLECoreFont* get_core_font_ensure_loaded(int font);
+
+#ifndef FONTDEF
+ #define FONTDEF
+#endif
+
+FONTDEF vector<GLECoreFont*> fnt;
diff --git a/src/gle/general.cpp b/src/gle/general.cpp
new file mode 100644
index 0000000..488e563
--- /dev/null
+++ b/src/gle/general.cpp
@@ -0,0 +1,153 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#include "all.h"
+#include "gprint.h"
+
+#ifdef VAXC
+double myatan2(double y, double x);
+#endif
+
+void showpcode(int *p)
+{
+ union {int l; short s[2];} bth;
+ int i;
+
+ gprint("GP> ");
+ for (i=0;i<12;i++) {
+ bth.l = *(p++);
+ gprint("%x %x ",bth.s[0],bth.s[1]);
+ }
+ gprint("\n");
+}
+void polar_xy(double r, double angle, double *dx, double *dy)
+{
+ *dx = r*cos(angle*GLE_PI/180);
+ *dy = r*sin(angle*GLE_PI/180);
+}
+void polar_xy(double rx, double ry, double angle, double *dx, double *dy)
+{
+ *dx = rx*cos(angle*GLE_PI/180);
+ *dy = ry*sin(angle*GLE_PI/180);
+}
+
+void xy_polar(double dx,double dy,double *radius,double *angle)
+{
+ if (dx==0 && dy==0) {
+ *angle = 0;
+ gprint("Cannot work out angle of zero length vector\n");
+ return;
+ }
+ if (dx==0) {
+ *angle = 90;
+ if (dy<0) *angle = -90;
+ } else {
+ *angle = myatan2(dy,dx)*180/GLE_PI;
+ }
+ *radius = sqrt(dx*dx + dy*dy);
+}
+
+void fpolar_xy(float r, float angle, float *dx, float *dy)
+{
+ *dx = r*cos(angle*GLE_PI/180);
+ *dy = r*sin(angle*GLE_PI/180);
+}
+
+void fxy_polar(float dx,float dy,float *radius,float *angle)
+{
+ if (dx==0 && dy==0) {
+ gprint("Cannot work out angle of zero length vector\n");
+ return;
+ }
+ if (dx==0) {
+ *angle = 90;
+ if (dy<0) *angle = -90;
+ } else {
+ *angle = myatan2(dy,dx)*180/GLE_PI;
+ }
+ *radius = sqrt(dx*dx+dy*dy);
+}
+
+void ncpy(char *d, const char *s, int n)
+{
+ strncpy(d,s,n);
+ *(d+n) = 0;
+}
+
+void ncat(char *d, char *s, int n)
+{
+ int i;
+ i = strlen(d);
+ strncat(d,s,n);
+ *(d+i+n) = 0;
+}
+
+#ifdef VAXC
+double myatan2(double y, double x)
+{
+ static double one,test,xx,yy,zero,at2;
+ zero = 0;
+ one = 1;
+ xx = fabs(x);
+ yy = fabs(y);
+ if (x==0) {
+ at2 = GLE_PI/2;
+ } else {
+ if (yy<=xx) {
+ at2 = fabs(atan(yy/xx));
+ } else {
+ test = one + (xx/yy);
+ if (test!=one) {
+ at2 = fabs(atan(yy/xx));
+ } else {
+ at2 = GLE_PI/2;
+ }
+ }
+ if (x<zero) at2 = GLE_PI - at2;
+ }
+ if (y<0) at2 = -at2;
+ return at2;
+}
+#else
+double myatan2(double y, double x)
+{
+ return atan2(y,x);
+}
+#endif
+
+
diff --git a/src/gle/gle-base.cpp b/src/gle/gle-base.cpp
new file mode 100644
index 0000000..afb4d21
--- /dev/null
+++ b/src/gle/gle-base.cpp
@@ -0,0 +1,48 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#include "basicconf.h"
+#include "gle-interface/gle-base.h"
+
+GLERefCountObject::GLERefCountObject() {
+ m_OwnerCount = 0;
+}
+
+GLERefCountObject::~GLERefCountObject() {
+}
+
diff --git a/src/gle/gle-block.cpp b/src/gle/gle-block.cpp
new file mode 100644
index 0000000..1c16e15
--- /dev/null
+++ b/src/gle/gle-block.cpp
@@ -0,0 +1,125 @@
+
+#include "basicconf.h"
+#include "cutils.h"
+#include "gle-block.h"
+#include "tokens/Tokenizer.h"
+#include "gle-interface/gle-interface.h"
+
+void GLEParserInitTokenizer(Tokenizer* tokens);
+
+GLEBlockInstance::GLEBlockInstance(GLEBlockBase* parent):
+ m_parent(parent)
+{
+}
+
+GLEBlockInstance::~GLEBlockInstance() {
+}
+
+GLEBlockBase* GLEBlockInstance::getParent() {
+ return m_parent;
+}
+
+GLEBlockBase::GLEBlockBase(const std::string& blockName,
+ bool allowRecursiveBlocks):
+ m_blockName(blockName),
+ m_allowRecursiveBlocks(allowRecursiveBlocks)
+{
+}
+
+GLEBlockBase::~GLEBlockBase() {
+ for (std::vector<GLEBlockInstance*>::iterator i(m_blockStack.begin()); i != m_blockStack.end(); ++i) {
+ delete *i;
+ }
+}
+
+void GLEBlockBase::beginExecuteBlock(GLESourceLine& sline, int *pcode, int *cp) {
+ if (!allowRecursiveBlocks() && !m_blockStack.empty()) {
+ g_throw_parser_error("recursive calls to '", getBlockName().c_str(), "' blocks not allowed");
+ }
+ GLEBlockInstance* block = beginExecuteBlockImpl(sline, pcode, cp);
+ m_blockStack.push_back(block);
+}
+
+void GLEBlockBase::executeLine(GLESourceLine& sline) {
+ if (m_blockStack.empty()) {
+ g_throw_parser_error("not in block '", getBlockName().c_str(), "'");
+ } else {
+ m_blockStack.back()->executeLine(sline);
+ }
+}
+
+void GLEBlockBase::endExecuteBlock() {
+ if (m_blockStack.empty()) {
+ g_throw_parser_error("not in block '", getBlockName().c_str(), "'");
+ } else {
+ GLEBlockInstance* block = m_blockStack.back();
+ block->endExecuteBlock();
+ delete block;
+ m_blockStack.pop_back();
+ }
+}
+
+bool GLEBlockBase::allowRecursiveBlocks() const {
+ return m_allowRecursiveBlocks;
+}
+
+const std::string GLEBlockBase::getBlockName() const {
+ return m_blockName;
+}
+
+GLEBlockWithSimpleKeywords::GLEBlockWithSimpleKeywords(const std::string& blockName, bool allowRecursiveBlocks):
+ GLEBlockBase(blockName, allowRecursiveBlocks)
+{
+}
+
+GLEBlockWithSimpleKeywords::~GLEBlockWithSimpleKeywords() {
+}
+
+bool GLEBlockWithSimpleKeywords::checkLine(GLESourceLine& sline) {
+ StringTokenizer tokens(sline.getCodeCStr());
+ GLEParserInitTokenizer(&tokens);
+ if (tokens.has_more_tokens()) {
+ const std::string token = tokens.next_token();
+ return m_keyWords.find(token) != m_keyWords.end();
+ } else {
+ return false;
+ }
+}
+
+void GLEBlockWithSimpleKeywords::addKeyWord(const char* keyword) {
+ m_keyWords.insert(keyword);
+}
+
+void GLEBlockWithSimpleKeywords::addKeyWord(const std::string& keyword) {
+ m_keyWords.insert(keyword);
+}
+
+GLEBlocks::GLEBlocks() {
+}
+
+GLEBlocks::~GLEBlocks() {
+ for (std::map<int, GLEBlockBase*>::iterator i(m_blocks.begin()); i != m_blocks.end(); ++i) {
+ delete i->second;
+ }
+}
+
+void GLEBlocks::addBlock(int blockType, GLEBlockBase* block) {
+ std::map<int, GLEBlockBase*>::iterator i(m_blocks.find(blockType));
+ CUtilsAssert(i == m_blocks.end());
+ m_blocks.insert(std::make_pair(blockType, block));
+}
+
+GLEBlockBase* GLEBlocks::getBlock(int blockType) {
+ std::map<int, GLEBlockBase*>::iterator i(m_blocks.find(blockType));
+ CUtilsAssert(i != m_blocks.end());
+ return i->second;
+}
+
+GLEBlockBase* GLEBlocks::getBlockIfExists(int blockType) {
+ std::map<int, GLEBlockBase*>::iterator i(m_blocks.find(blockType));
+ if (i != m_blocks.end()) {
+ return i->second;
+ } else {
+ return 0;
+ }
+}
diff --git a/src/gle/gle-block.h b/src/gle/gle-block.h
new file mode 100644
index 0000000..c8b7349
--- /dev/null
+++ b/src/gle/gle-block.h
@@ -0,0 +1,75 @@
+#ifndef GLE_BLOCK_H
+#define GLE_BLOCK_H
+
+class GLEBlockBase;
+class GLESourceLine;
+
+#include <vector>
+#include <map>
+#include <set>
+
+class GLEBlockInstance {
+public:
+ GLEBlockInstance(GLEBlockBase* parent);
+ virtual ~GLEBlockInstance();
+
+ virtual void executeLine(GLESourceLine& sline) = 0;
+ virtual void endExecuteBlock() = 0;
+
+ GLEBlockBase* getParent();
+
+private:
+ GLEBlockBase* m_parent;
+};
+
+class GLEBlockBase {
+public:
+ GLEBlockBase(const std::string& blockName,
+ bool allowRecursiveBlocks);
+ virtual ~GLEBlockBase();
+
+ virtual GLEBlockInstance* beginExecuteBlockImpl(GLESourceLine& sline, int *pcode, int *cp) = 0;
+ virtual bool checkLine(GLESourceLine& sline) = 0;
+
+ void beginExecuteBlock(GLESourceLine& sline, int *pcode, int *cp);
+ void executeLine(GLESourceLine& sline);
+ void endExecuteBlock();
+
+ bool allowRecursiveBlocks() const;
+ const std::string getBlockName() const;
+
+private:
+ std::string m_blockName;
+ bool m_allowRecursiveBlocks;
+ std::vector<GLEBlockInstance*> m_blockStack;
+};
+
+class GLEBlockWithSimpleKeywords : public GLEBlockBase {
+public:
+ GLEBlockWithSimpleKeywords(const std::string& blockName,
+ bool allowRecursiveBlocks);
+ virtual ~GLEBlockWithSimpleKeywords();
+
+ virtual bool checkLine(GLESourceLine& sline);
+
+ void addKeyWord(const char* keyword);
+ void addKeyWord(const std::string& keyword);
+
+private:
+ std::set<std::string, str_i_less> m_keyWords;
+};
+
+class GLEBlocks {
+public:
+ GLEBlocks();
+ ~GLEBlocks();
+
+ void addBlock(int blockType, GLEBlockBase* block);
+ GLEBlockBase* getBlock(int blockType);
+ GLEBlockBase* getBlockIfExists(int blockType);
+
+private:
+ std::map<int, GLEBlockBase*> m_blocks;
+};
+
+#endif
diff --git a/src/gle/gle-datatype.cpp b/src/gle/gle-datatype.cpp
new file mode 100644
index 0000000..93ef218
--- /dev/null
+++ b/src/gle/gle-datatype.cpp
@@ -0,0 +1,1034 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#include "all.h"
+#include "gle-interface/gle-interface.h"
+#include "var.h"
+#include "core.h"
+
+const char* gle_object_type_to_string(GLEObjectType type) {
+ switch (type) {
+ case GLEObjectTypeBool:
+ return "bool";
+ case GLEObjectTypeInt:
+ return "integer";
+ case GLEObjectTypeDouble:
+ return "double";
+ case GLEObjectTypeString:
+ return "string";
+ case GLEObjectTypeArray:
+ return "array";
+ case GLEObjectTypeColor:
+ return "color";
+ case GLEObjectTypeDynamicSub:
+ return "subroutine";
+ case GLEObjectTypeObjectRep:
+ return "object";
+ case GLEObjectTypePoint:
+ return "point";
+ case GLEObjectTypeClassDefinition:
+ return "definition";
+ case GLEObjectTypeClassInstance:
+ return "instance";
+ case GLEObjectTypeUnknown:
+ return "unknown";
+ }
+ return "unknown";
+}
+
+bool gle_memory_cell_equals(GLEMemoryCell* a, GLEMemoryCell* b) {
+ if (a->Type != b->Type) return false;
+ switch (a->Type) {
+ case GLE_MC_UNKNOWN:
+ return true;
+ case GLE_MC_BOOL:
+ return a->Entry.BoolVal == b->Entry.BoolVal;
+ case GLE_MC_INT:
+ return a->Entry.IntVal == b->Entry.IntVal;
+ case GLE_MC_DOUBLE:
+ return a->Entry.DoubleVal == b->Entry.DoubleVal;
+ case GLE_MC_OBJECT:
+ return a->Entry.ObjectVal->equals(b->Entry.ObjectVal);
+ }
+ return false;
+}
+
+void gle_memory_cell_print(GLEMemoryCell* a, ostream& out) {
+ switch (a->Type) {
+ case GLE_MC_UNKNOWN:
+ out << "?";
+ break;
+ case GLE_MC_BOOL:
+ out << (a->Entry.BoolVal ? "true" : "false");
+ break;
+ case GLE_MC_INT:
+ out << a->Entry.IntVal;
+ break;
+ case GLE_MC_DOUBLE:
+ out << a->Entry.DoubleVal;
+ break;
+ case GLE_MC_OBJECT:
+ a->Entry.ObjectVal->print(out);
+ break;
+ }
+}
+
+bool gle_memory_cell_to_double(GLEMemoryCell* a, double* result) {
+ switch (a->Type) {
+ case GLE_MC_BOOL:
+ *result = a->Entry.BoolVal ? 1.0 : 0.0;
+ return true;
+ case GLE_MC_INT:
+ *result = a->Entry.IntVal;
+ return true;
+ case GLE_MC_DOUBLE:
+ *result = a->Entry.DoubleVal;
+ return true;
+ default:
+ *result = 0.0;
+ return false;
+ }
+}
+
+int gle_memory_cell_type(GLEMemoryCell* a) {
+ switch (a->Type) {
+ case GLE_MC_UNKNOWN: return GLEObjectTypeUnknown;
+ case GLE_MC_BOOL: return GLEObjectTypeBool;
+ case GLE_MC_INT: return GLEObjectTypeInt;
+ case GLE_MC_DOUBLE: return GLEObjectTypeDouble;
+ case GLE_MC_OBJECT: return a->Entry.ObjectVal->getType();
+ }
+ return GLEObjectTypeUnknown;
+}
+
+void gle_memory_cell_check(GLEMemoryCell* a, int expected) {
+ int cellType = gle_memory_cell_type(a);
+ if (cellType != expected) {
+ std::ostringstream msg;
+ msg << "found type '" << gle_object_type_to_string((GLEObjectType)cellType) << "' (value = '";
+ gle_memory_cell_print(a, msg);
+ msg << "') but expected '" << gle_object_type_to_string((GLEObjectType)expected) << "'";
+ g_throw_parser_error(msg.str());
+ }
+}
+
+GLEDataObject::GLEDataObject() {
+}
+
+GLEDataObject::~GLEDataObject() {
+}
+
+int GLEDataObject::getType() const {
+ return GLEObjectTypeUnknown;
+}
+
+bool GLEDataObject::equals(GLEDataObject* obj) const {
+ return false;
+}
+
+void GLEDataObject::print(ostream& out) const {
+}
+
+GLEPointDataObject::GLEPointDataObject(double x, double y) : m_point(x, y) {
+}
+
+GLEPointDataObject::~GLEPointDataObject() {
+}
+
+int GLEPointDataObject::getType() const {
+ return GLEObjectTypePoint;
+}
+
+bool GLEPointDataObject::equals(GLEDataObject* obj) const {
+ if (obj->getType() != GLEObjectTypePoint) return false;
+ GLEPointDataObject* other = (GLEPointDataObject*)obj;
+ return m_point.getX() == other->m_point.getX()
+ && m_point.getY() == other->m_point.getY();
+}
+
+void GLEPointDataObject::print(ostream& out) const {
+ m_point.write(out);
+}
+
+
+GLEString::GLEString() {
+ m_Data = NULL;
+ m_Length = 0;
+ m_Alloc = 0;
+ m_Intern = 0;
+}
+
+GLEString::GLEString(const char* utf8) {
+ m_Data = NULL;
+ m_Length = 0;
+ m_Alloc = 0;
+ m_Intern = 0;
+ fromUTF8(utf8);
+}
+
+GLEString::GLEString(const string& utf8) {
+ m_Data = NULL;
+ m_Length = 0;
+ m_Alloc = 0;
+ m_Intern = 0;
+ fromUTF8(utf8);
+}
+
+GLEString::~GLEString() {
+ if (m_Data != NULL) {
+ free(m_Data);
+ }
+}
+
+void GLEString::fromUTF8(const char* str) {
+ if (str != 0) {
+ fromUTF8(str, strlen(str));
+ }
+}
+
+void GLEString::fromUTF8(const string& str) {
+ fromUTF8(str.c_str(), str.length());
+}
+
+/*
+ 0 0000 1 0001 2 0010 3 0011 4 0100 5 0101 6 0110
+ 7 0111 8 1000 9 1001 a 1010 b 1011 c 1100 d 1101
+ e 1110 f 1111
+
+ Char. number range | UTF-8 octet sequence
+ (hexadecimal) | (binary)
+ --------------------+---------------------------------------------
+ 0000 0000-0000 007F | 0xxxxxxx
+ 0000 0080-0000 07FF | 110xxxxx 10xxxxxx
+ 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
+ 0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
+*/
+
+unsigned int getUTF8NumberOfChars(const char* str, unsigned int len) {
+ unsigned int i = 0;
+ unsigned int dest = 0;
+ while (i < len) {
+ unsigned char ch = str[i++];
+ if ((ch & 0x80) != 0) {
+ /* highest bit is one - 3 possibilities */
+ int remain = 0;
+ if ((ch & 0xE0) == 0xC0) {
+ /* 110x -> two byte unicode */
+ remain = 1;
+ } else if ((ch & 0xF0) == 0xE0) {
+ /* 1110x -> three byte unicode */
+ remain = 2;
+ } else if ((ch & 0xF8) == 0xF0) {
+ /* 1111x -> four byte unicode */
+ remain = 3;
+ } else if ((ch & 0xFC) == 0xF8) {
+ remain = 4;
+ } else if ((ch & 0xFE) == 0xFC) {
+ remain = 5;
+ }
+ while ((remain > 0) && (i < len)) {
+ remain--;
+ ch = str[i++];
+ if ((ch & 0xC0) != 0x80) {
+ remain = 0;
+ i--;
+ /* try processing this byte separately */
+ }
+ }
+ dest++;
+ } else {
+ dest++;
+ }
+ }
+ return dest;
+}
+
+void GLEString::fromUTF8(const char* str, unsigned int len) {
+ resize(len);
+ unsigned int i = 0;
+ unsigned int dest = 0;
+ while (i < len) {
+ unsigned char ch = str[i++];
+ if ((ch & 0x80) != 0) {
+ /* highest bit is one - 3 possibilities */
+ int remain = 0;
+ unsigned int unicode = 0;
+ if ((ch & 0xE0) == 0xC0) {
+ /* 110x -> two byte unicode */
+ unicode = ch & 0x1F;
+ remain = 1;
+ } else if ((ch & 0xF0) == 0xE0) {
+ /* 1110x -> three byte unicode */
+ unicode = ch & 0x0F;
+ remain = 2;
+ } else if ((ch & 0xF8) == 0xF0) {
+ /* 1111x -> four byte unicode */
+ unicode = ch & 0x07;
+ remain = 3;
+ } else if ((ch & 0xFC) == 0xF8) {
+ unicode = ch & 0x03;
+ remain = 4;
+ } else if ((ch & 0xFE) == 0xFC) {
+ unicode = ch & 0x01;
+ remain = 5;
+ } else {
+ unicode = (unsigned int)'?';
+ }
+ while ((remain > 0) && (i < len)) {
+ remain--;
+ ch = str[i++];
+ if ((ch & 0xC0) != 0x80) {
+ unicode = (unsigned int)'?';
+ remain = 0;
+ i--; /* try processing this byte separately */
+ } else {
+ unicode <<= 6;
+ unicode |= ch & 0x3F;
+ }
+ }
+ m_Data[dest++] = unicode;
+ } else {
+ m_Data[dest++] = ch;
+ }
+ }
+ m_Length = dest;
+}
+
+class GLEStringToUTF8 {
+protected:
+ const GLEString* m_Str;
+ char m_Unicode[5];
+ unsigned int m_Pos, m_Sub, m_Max;
+public:
+ GLEStringToUTF8(const GLEString* s);
+ char get();
+};
+
+GLEStringToUTF8::GLEStringToUTF8(const GLEString* s) {
+ m_Str = s;
+ m_Pos = 0;
+ m_Sub = 0;
+ m_Max = 0;
+}
+
+char GLEStringToUTF8::get() {
+ if (m_Sub < m_Max) {
+ return m_Unicode[m_Sub++];
+ } else if (m_Pos >= m_Str->length()) {
+ return 0;
+ } else {
+ m_Sub = 0;
+ unsigned int unicode = m_Str->get(m_Pos++);
+ if (unicode < 0x80) {
+ m_Max = 0;
+ return (char)unicode;
+ } else if (unicode < 0x800) {
+ m_Max = 1;
+ m_Unicode[0] = 0x80 | (unicode & 0x3F);
+ return 0xC0 | ((unicode >> 6) & 0x1F);
+ } else if (unicode < 0x10000) {
+ m_Max = 2;
+ m_Unicode[0] = 0x80 | ((unicode >> 6) & 0x3F);
+ m_Unicode[1] = 0x80 | (unicode & 0x3F);
+ return 0xE0 | ((unicode >> 12) & 0xF);
+ } else if (unicode < 0x200000) {
+ m_Max = 3;
+ m_Unicode[0] = 0x80 | ((unicode >> 12) & 0x3F);
+ m_Unicode[1] = 0x80 | ((unicode >> 6) & 0x3F);
+ m_Unicode[2] = 0x80 | (unicode & 0x3F);
+ return 0xF0 | ((unicode >> 18) & 0x7);
+ } else if (unicode < 0x4000000) {
+ m_Max = 4;
+ m_Unicode[0] = 0x80 | ((unicode >> 18) & 0x3F);
+ m_Unicode[1] = 0x80 | ((unicode >> 12) & 0x3F);
+ m_Unicode[2] = 0x80 | ((unicode >> 6) & 0x3F);
+ m_Unicode[3] = 0x80 | (unicode & 0x3F);
+ return 0xF8 | ((unicode >> 24) & 0x3);
+ } else {
+ m_Max = 5;
+ m_Unicode[0] = 0x80 | ((unicode >> 24) & 0x3F);
+ m_Unicode[1] = 0x80 | ((unicode >> 18) & 0x3F);
+ m_Unicode[2] = 0x80 | ((unicode >> 12) & 0x3F);
+ m_Unicode[3] = 0x80 | ((unicode >> 6) & 0x3F);
+ m_Unicode[4] = 0x80 | (unicode & 0x3F);
+ return 0xFC | ((unicode >> 30) & 0x1);
+ }
+ return 0;
+ }
+}
+
+ostream& GLEString::toUTF8(ostream& out) const {
+ GLEStringToUTF8 conv(this);
+ while (1) {
+ char ch = conv.get();
+ if (ch == 0) break;
+ out << ch;
+ }
+ return out;
+}
+
+void GLEString::print(ostream& out) const {
+ GLEStringToUTF8 conv(this);
+ while (1) {
+ char ch = conv.get();
+ if (ch == 0) break;
+ out << ch;
+ }
+}
+
+void GLEString::toUTF8(string& out) const {
+ out.resize(0);
+ GLEStringToUTF8 conv(this);
+ while (1) {
+ char ch = conv.get();
+ if (ch == 0) break;
+ out.push_back(ch);
+ }
+}
+
+string GLEString::toUTF8() const {
+ string out;
+ GLEStringToUTF8 conv(this);
+ while (1) {
+ char ch = conv.get();
+ if (ch == 0) break;
+ out.push_back(ch);
+ }
+ return out;
+}
+
+void GLEString::toUTF8(char* out) const {
+ int len = 0;
+ GLEStringToUTF8 conv(this);
+ while (1) {
+ char ch = conv.get();
+ if (ch == 0) break;
+ out[len++] = ch;
+ }
+ out[len] = 0;
+}
+
+unsigned int GLEString::getI(unsigned int i) const {
+ unsigned int ch = get(i);
+ if (ch >= 'a' && ch <= 'z') ch -= ('a' - 'A');
+ return ch;
+}
+
+bool GLEString::isSmallerThanI(const GLEString* s2) const {
+ unsigned int l1 = length();
+ unsigned int l2 = s2->length();
+ unsigned int minlen = l1 < l2 ? l1 : l2;
+ unsigned int pos = 0;
+ /* as long as ch equal */
+ while (pos < minlen && getI(pos) == s2->getI(pos)) pos++;
+ if (pos >= minlen) {
+ /* at end of shortest string */
+ return l1 < l2;
+ } else {
+ /* at first character that differs */
+ return getI(pos) < s2->getI(pos);
+ }
+}
+
+bool GLEString::equalsI(const char* str) {
+ unsigned int s_len = strlen(str);
+ if (s_len != length()) return false;
+ for (unsigned int i = 0; i < s_len; i++) {
+ if ((unsigned int)toupper(str[i]) != getI(i)) return false;
+ }
+ return true;
+}
+
+bool GLEString::equalsI(GLEString* other) {
+ if (m_Length != other->m_Length) return false;
+ for (unsigned int i = 0; i < m_Length; ++i) {
+ if (getI(i) != other->getI(i)) {
+ return false;
+ }
+ }
+ return true;
+}
+
+bool GLEString::containsI(unsigned int ch) {
+ for (unsigned int i = 0; i < m_Length; ++i) {
+ if (getI(i) == ch) {
+ return true;
+ }
+ }
+ return false;
+}
+
+int GLEString::strICmp(GLEString* other) const {
+ unsigned int s1 = 0;
+ unsigned int s2 = 0;
+ while (true) {
+ int c1 = s1 < m_Length ? getI(s1++) : 0;
+ int c2 = s2 < other->m_Length ? other->getI(s2++) : 0;
+ if (c1 == 0 || c1 != c2) return c1 - c2;
+ }
+}
+
+bool GLEString::equals(GLEDataObject* obj) const {
+ if (obj->getType() != GLEObjectTypeString) return false;
+ GLEString* other = (GLEString*)obj;
+ if (m_Length != other->length()) return false;
+ for (unsigned int i = 0; i < m_Length; i++) {
+ if (get(i) != other->get(i)) return false;
+ }
+ return true;
+}
+
+GLEString* GLEString::concat(GLEString* other) const {
+ GLEString* res = new GLEString();
+ int size = m_Length + other->m_Length;
+ res->resize(size);
+ res->m_Length = size;
+ unsigned int idx = 0;
+ for (unsigned int i = 0; i < m_Length; ++i) {
+ res->set(idx++, get(i));
+ }
+ for (unsigned int i = 0; i < other->m_Length; ++i) {
+ res->set(idx++, other->get(i));
+ }
+ return res;
+}
+
+GLEString* GLEString::substringWithLength(unsigned int from, unsigned int size) const {
+ if (size == 0) {
+ return new GLEString();
+ } else {
+ return substring(from, from + size - 1);
+ }
+}
+
+GLEString* GLEString::substring(unsigned int from, unsigned int to) const {
+ if (m_Length == 0) {
+ return new GLEString();
+ } else {
+ if (to >= m_Length-1) to = m_Length-1;
+ if (from > to) {
+ return new GLEString();
+ } else {
+ unsigned int size = to - from + 1;
+ GLEString* res = new GLEString();
+ res->resize(size);
+ res->m_Length = size;
+ unsigned int idx = 0;
+ for (unsigned int pos = from; pos <= to; pos++) {
+ res->set(idx++, get(pos));
+ }
+ return res;
+ }
+ }
+}
+
+int GLEString::find(GLEString* needle, unsigned int from) {
+ int endPattern = (int)m_Length - needle->length() + 1;
+ if (endPattern < 0) {
+ return -1;
+ }
+ if (needle->length() <= 0) {
+ return 0;
+ }
+ unsigned int patternChar0 = needle->getI(0);
+ for (int ctrSrc = from; ctrSrc <= endPattern; ctrSrc++) {
+ if (getI(ctrSrc) != patternChar0) {
+ continue;
+ }
+ int ctrPat;
+ for (ctrPat = 1; ctrPat < int(needle->length()) && getI(ctrSrc + ctrPat) == needle->getI(ctrPat); ctrPat++) {
+ ; // just loop
+ }
+ if (ctrPat == int(needle->length())) {
+ return ctrSrc;
+ }
+ }
+ return -1;
+}
+
+GLEArrayImpl* GLEString::split(char bych) const {
+ GLEArrayImpl* res = new GLEArrayImpl();
+ unsigned int pos = 0;
+ unsigned int prevpos = 0;
+ while (true) {
+ while (pos < m_Length && m_Data[pos] != (unsigned int)bych) pos++;
+ if (pos >= m_Length) {
+ /* not found */
+ res->addObject(substring(prevpos, pos));
+ break;
+ } else {
+ /* found - add previous string and skip */
+ res->addObject(substring(prevpos, pos-1));
+ prevpos = ++pos;
+ }
+ }
+ return res;
+}
+
+void GLEString::join(char bych, GLEArrayImpl* arr, int from, int to) {
+ int cnt = 0;
+ int totlen = 0;
+ if (arr->size() == 0) {
+ setSize(0);
+ return;
+ }
+ if (to == -1 || to > (int)arr->size()-1) {
+ /* make value of to legal */
+ to = arr->size()-1;
+ }
+ if (from > to) {
+ /* result is empty */
+ setSize(0);
+ return;
+ }
+ for (int i = from; i <= to; i++) {
+ GLEString* s_i = (GLEString*)arr->getObjectUnsafe(i);
+ totlen += s_i->length();
+ cnt++;
+ }
+ totlen += cnt-1;
+ setSize(totlen);
+ int pos = 0;
+ for (int i = from; i <= to; i++) {
+ GLEString* s_i = (GLEString*)arr->getObjectUnsafe(i);
+ if (pos != 0) m_Data[pos++] = (unsigned int)bych;
+ for (unsigned int j = 0; j < s_i->length(); j++) {
+ m_Data[pos++] = s_i->get(j);
+ }
+ }
+}
+
+void GLEString::addQuotes() {
+ resize(m_Length+2);
+ for (unsigned int i = m_Length; i > 0; i--) {
+ m_Data[i] = m_Data[i-1];
+ }
+ m_Data[0] = '\"';
+ m_Data[m_Length+1] = '\"';
+ m_Length += 2;
+}
+
+void GLEString::setSize(unsigned int size) {
+ resize(size);
+ m_Length = size;
+}
+
+void GLEString::resize(unsigned int size) {
+ if (m_Alloc < size) {
+ m_Data = (unsigned int*)realloc(m_Data, size*sizeof(unsigned int));
+ m_Alloc = size;
+ }
+}
+
+unsigned int GLEString::toStringIndex(int value)
+{
+ if (value < 0) {
+ return (unsigned int)std::max<int>(0, (int)m_Length + value);
+ } else if (value > 0) {
+ return value - 1;
+ } else {
+ return 0;
+ }
+}
+
+int GLEString::getType() const {
+ return GLEObjectTypeString;
+}
+
+GLEString* GLEString::getEmptyString() {
+ static GLERC<GLEString> g_EmptyString = new GLEString();
+ return g_EmptyString.get();
+}
+
+GLEArray::GLEArray() {
+}
+
+GLEArray::~GLEArray() {
+}
+
+GLEArrayImpl::GLEArrayImpl() {
+ m_Data = NULL;
+ m_Length = 0;
+ m_Alloc = 0;
+}
+
+GLEArrayImpl::~GLEArrayImpl() {
+ clear();
+}
+
+void GLEArrayImpl::clear() {
+ if (m_Data != NULL) {
+ for (unsigned int i = 0; i < m_Alloc; i++) {
+ GLE_MC_DEL_INTERN(&m_Data[i]);
+ }
+ free(m_Data);
+ }
+ m_Data = NULL;
+ m_Length = 0;
+ m_Alloc = 0;
+}
+
+void GLEArrayImpl::checkType(unsigned int i, int expected) {
+ gle_memory_cell_check(get(i), expected);
+}
+
+int GLEArrayImpl::getType(unsigned int i) const {
+ return gle_memory_cell_type(get(i));
+}
+
+void GLEArrayImpl::init(unsigned int i) {
+ GLE_MC_DEL_INTERN(&m_Data[i]);
+ GLE_MC_INIT(m_Data[i]);
+}
+
+void GLEArrayImpl::setObject(unsigned int i, GLEDataObject* v) {
+ GLE_MC_SET_OBJECT(&m_Data[i], v);
+}
+
+void GLEArrayImpl::addObject(GLEDataObject* v) {
+ unsigned int len = m_Length;
+ ensure(len+1);
+ GLE_MC_SET_OBJECT(&m_Data[len], v);
+}
+
+void GLEArrayImpl::addInt(int v) {
+ unsigned int len = m_Length;
+ ensure(len+1);
+ GLE_MC_SET_INT(&m_Data[len], v);
+}
+
+void GLEArrayImpl::set(unsigned int i, const GLEMemoryCell* cell) {
+ if (cell->Type == GLE_MC_OBJECT) {
+ setObject(i, cell->Entry.ObjectVal);
+ } else {
+ GLE_MC_DEL_INTERN(&m_Data[i]);
+ m_Data[i].Entry = cell->Entry;
+ m_Data[i].Type = cell->Type;
+ }
+}
+
+void GLEArrayImpl::setDouble(unsigned int i, double v) {
+ GLE_MC_SET_DOUBLE(&m_Data[i], v);
+}
+
+double GLEArrayImpl::getDouble(unsigned int i) {
+ if (m_Data[i].Type == GLE_MC_DOUBLE) return m_Data[i].Entry.DoubleVal;
+ else return 0.0;
+}
+
+int GLEArrayImpl::getInt(unsigned int i) {
+ if (m_Data[i].Type == GLE_MC_INT) return m_Data[i].Entry.IntVal;
+ else return 0;
+}
+
+void GLEArrayImpl::setInt(unsigned int i, int v) {
+ GLE_MC_SET_INT(&m_Data[i], v);
+}
+
+bool GLEArrayImpl::getBool(unsigned int i) {
+ if (m_Data[i].Type == GLE_MC_BOOL) return m_Data[i].Entry.BoolVal;
+ else return false;
+}
+
+void GLEArrayImpl::setBool(unsigned int i, bool v) {
+ GLE_MC_SET_BOOL(&m_Data[i], v);
+}
+
+void GLEArrayImpl::setUnknown(unsigned int i) {
+ GLE_MC_SET_UNKNOWN(&m_Data[i]);
+}
+
+bool GLEArrayImpl::isUnknown(unsigned int i) {
+ return m_Data[i].Type == GLE_MC_UNKNOWN;
+}
+
+GLEDataObject* GLEArrayImpl::getObject(unsigned int i) {
+ if (m_Data[i].Type == GLE_MC_OBJECT) return m_Data[i].Entry.ObjectVal;
+ else return NULL;
+}
+
+GLERC<GLEString> GLEArrayImpl::getString(unsigned int i) {
+ GLERC<GLEString> result;
+ GLEMemoryCell* cell = &m_Data[i];
+ if (cell->Type == GLE_MC_OBJECT && cell->Entry.ObjectVal->getType() == GLEObjectTypeString) {
+ result = static_cast<GLEString*>(cell->Entry.ObjectVal);
+ } else {
+ ostringstream out;
+ gle_memory_cell_print(cell, out);
+ result = new GLEString(out.str());
+ }
+ return result;
+}
+
+void GLEArrayImpl::ensure(unsigned int size) {
+ if (m_Alloc < size) extend(size);
+ m_Length = std::max<int>(m_Length, size);
+}
+
+void GLEArrayImpl::resize(unsigned int size) {
+ ensure(size);
+ if (size < m_Length) {
+ for (unsigned int i = size; i < m_Length; i++) {
+ init(i);
+ }
+ m_Length = size;
+ }
+}
+
+void GLEArrayImpl::resizeMemory(unsigned int size) {
+ if (m_Alloc < size) {
+ m_Data = (GLEMemoryCell*)realloc(m_Data, size*sizeof(GLEMemoryCell));
+ for (unsigned int i = m_Alloc; i < size; ++i) {
+ GLE_MC_INIT(m_Data[i]);
+ }
+ m_Alloc = size;
+ }
+}
+
+void GLEArrayImpl::extend(unsigned int size) {
+ unsigned int newSize = m_Alloc;
+ while (newSize < size) {
+ newSize = 2*newSize + 5;
+ }
+ resizeMemory(newSize);
+}
+
+void GLEArrayImpl::enumStrings(ostream& out) {
+ out << " ";
+ for (unsigned int i = 0; i < size(); i++) {
+ GLEString* key = (GLEString*)getObjectUnsafe(i);
+ out << *key;
+ if (i != size()-1) {
+ out << ", ";
+ if ((i+1) % 3 == 0) out << endl << " ";
+ }
+ }
+}
+
+int GLEArrayImpl::getType() const {
+ return GLEObjectTypeArray;
+}
+
+GLERC<GLEArrayImpl> doublesToArray(double* args, int nb) {
+ GLERC<GLEArrayImpl> result(new GLEArrayImpl());
+ result->ensure(nb);
+ for (int i = 0; i < nb; ++i) {
+ result->setDouble(i, args[i]);
+ }
+ return result;
+}
+
+GLEStringHash::GLEStringHash() : GLEArrayImpl() {
+}
+
+GLEStringHash::~GLEStringHash() {
+}
+
+void GLEStringHash::setObjectByKey(const GLEStringKey& key, GLEDataObject* v) {
+ GLEStringHashData::const_iterator i = m_Map.find(key);
+ if (i != m_Map.end()) {
+ GLEArrayImpl::setObject(i->second, v);
+ } else {
+ int len = size();
+ ensure(len+1);
+ GLEArrayImpl::setObject(len, v);
+ m_Map.insert(pair<GLEStringKey, unsigned int>(key, len));
+ }
+}
+
+GLEDataObject* GLEStringHash::getObjectByKey(const GLEStringKey& key) {
+ GLEStringHashData::const_iterator i = m_Map.find(key);
+ if (i != m_Map.end()) {
+ return GLEArrayImpl::getObject(i->second);
+ } else {
+ return NULL;
+ }
+}
+
+void GLEStringHash::getKeys(GLEArrayImpl* keys) {
+ for (GLEStringHashData::const_iterator i = m_Map.begin(); i != m_Map.end(); i++) {
+ keys->addObject(i->first.get());
+ }
+}
+
+GLEDynamicSub::GLEDynamicSub() {
+ m_Sub = NULL;
+ m_VarValues = NULL;
+ m_State = NULL;
+}
+
+GLEDynamicSub::GLEDynamicSub(GLESub* sub) {
+ m_Sub = sub;
+ m_VarValues = NULL;
+ m_State = NULL;
+}
+
+GLEDynamicSub::~GLEDynamicSub() {
+ if (m_VarValues != NULL) delete m_VarValues;
+ if (m_State != NULL) delete m_State;
+}
+
+int GLEDynamicSub::getType() const {
+ return GLEObjectTypeDynamicSub;
+}
+
+GLEObjectRepresention::GLEObjectRepresention() {
+}
+
+GLEObjectRepresention::~GLEObjectRepresention() {
+}
+
+GLEObjectRepresention* GLEObjectRepresention::getChildObject(GLEString* elem) {
+ if (m_SubObjs.isNull()) {
+ return NULL;
+ } else {
+ GLERC<GLEString> key(elem);
+ return (GLEObjectRepresention*)m_SubObjs->getObjectByKey(key);
+ }
+}
+
+bool GLEObjectRepresention::setChildObject(GLEString* elem, GLEObjectRepresention* obj) {
+ if (!m_SubObjs.isNull()) {
+ GLERC<GLEString> key(elem);
+ m_SubObjs->setObjectByKey(key, obj);
+ return true;
+ } else {
+ return false;
+ }
+}
+
+void GLEObjectRepresention::enableChildObjects() {
+ if (m_SubObjs.isNull()) m_SubObjs = new GLEStringHash();
+}
+
+int GLEObjectRepresention::getType() const {
+ return GLEObjectTypeObjectRep;
+}
+
+void GLEObjectRepresention::printNames() {
+ GLEStringHash* children = getChilds();
+ if (children != NULL) {
+ GLEStringHashData* hash = children->getHash();
+ for (GLEStringHashData::const_iterator i = hash->begin(); i != hash->end(); i++) {
+ GLEString* child_name = i->first.get();
+ GLEObjectRepresention* child = (GLEObjectRepresention*)children->getObject(i->second);
+ cout << *child_name << ": " << *child->getRectangle() << endl;
+ child->printNames();
+ }
+ }
+}
+
+void GLEObjectRepresention::translateChildrenRecursive(GLEPoint* trans) {
+ GLEStringHash* children = getChilds();
+ if (children != NULL) {
+ GLEStringHashData* hash = children->getHash();
+ for (GLEStringHashData::const_iterator i = hash->begin(); i != hash->end(); i++) {
+ GLEObjectRepresention* child = (GLEObjectRepresention*)children->getObject(i->second);
+ child->getRectangle()->translate(trans);
+ child->translateChildrenRecursive(trans);
+ }
+ }
+}
+
+void GLEObjectRepresention::copyChildrenRecursive(GLEObjectRepresention* newobj, gmodel* oldstate) {
+ GLEStringHash* children = getChilds();
+ if (children != NULL) {
+ GLEStringHashData* hash = children->getHash();
+ for (GLEStringHashData::const_iterator i = hash->begin(); i != hash->end(); i++) {
+ GLEString* child_name = i->first.get();
+ GLEObjectRepresention* child = (GLEObjectRepresention*)children->getObject(i->second);
+ newobj->enableChildObjects();
+ GLERC<GLEObjectRepresention> new_child = new GLEObjectRepresention();
+ newobj->setChildObject(child_name, new_child.get());
+ new_child->getRectangle()->copy(child->getRectangle());
+ g_undev(new_child->getRectangle(), oldstate);
+ g_dev(new_child->getRectangle());
+ child->copyChildrenRecursive(new_child.get(), oldstate);
+ }
+ }
+}
+
+GLEClassDefinition::GLEClassDefinition(const char* name):
+ m_Name(new GLEString(name)),
+ m_FieldNames(new GLEArrayImpl())
+{
+}
+
+void GLEClassDefinition::addField(const char* fieldName) {
+ m_FieldNames->addObject(new GLEString(fieldName));
+}
+
+int GLEClassDefinition::getType() const {
+ return GLEObjectTypeClassDefinition;
+}
+
+bool GLEClassDefinition::equals(GLEDataObject* obj) const {
+ return false;
+}
+
+void GLEClassDefinition::print(ostream& out) const {
+}
+
+GLEClassInstance::GLEClassInstance(GLEClassDefinition* definition):
+ m_Definition(definition)
+{
+}
+
+int GLEClassInstance::getType() const {
+ return GLEObjectTypeClassInstance;
+}
+
+bool GLEClassInstance::equals(GLEDataObject* obj) const {
+ return false;
+}
+
+void GLEClassInstance::print(ostream& out) const {
+}
+
+GLEClassInstance* getGLEClassInstance(GLEMemoryCell* object, GLEClassDefinition* def) {
+ if (object->Type == GLE_MC_OBJECT) {
+ GLEDataObject* dataObject = object->Entry.ObjectVal;
+ if (dataObject->getType() == GLEObjectTypeClassInstance) {
+ GLEClassInstance* classInstance = static_cast<GLEClassInstance*>(dataObject);
+ if (classInstance->getDefinition() == def) {
+ return classInstance;
+ }
+ }
+ }
+ return 0;
+}
diff --git a/src/gle/gle-interface.cpp b/src/gle/gle-interface.cpp
new file mode 100644
index 0000000..45d9806
--- /dev/null
+++ b/src/gle/gle-interface.cpp
@@ -0,0 +1,2432 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#include <fstream>
+#include <set>
+
+#include "all.h"
+#include "cutils.h"
+#include "file_io.h"
+#include "core.h"
+#include "cmdline.h"
+#include "config.h"
+#include "core.h"
+#include "gle-interface/gle-interface.h"
+#include "tokens/stokenizer.h"
+#include "texinterface.h"
+#include "drawit.h"
+#include "justify.h"
+#include "var.h"
+#include "sub.h"
+#include "mem_limits.h"
+#include "token.h"
+#include "glearray.h"
+#include "polish.h"
+#include "pass.h"
+#include "keyword.h"
+#include "run.h"
+#include "gle-poppler.h"
+
+// TODO make these available through the interface
+extern CmdLineObj g_CmdLine;
+extern ConfigCollection g_Config;
+extern string GLE_WORKING_DIR;
+extern string GLE_TOP_DIR;
+
+void init_option_args(CmdLineObj& cmdline);
+void load_one_file_sub(GLEScript* script, CmdLineObj& cmdline, size_t* exit_code) throw(ParserError);
+GLERC<GLEScript> load_gle_code_sub(const char* name, CmdLineObj& cmdline) throw(ParserError);
+
+void GLEScaleSimpleLineProperties(double scale, bool dir, GLEPropertyStore* prop);
+void GLEScaleArrowProperties(double scale, bool dir, GLEPropertyStore* prop);
+
+GLEInterface* g_GLEInterface = NULL;
+
+GLEInterface* GLEGetInterfacePointer() {
+ if (g_GLEInterface == NULL) {
+ GLEGlobalConfig* config = new GLEGlobalConfig();
+ config->setCmdLine(&g_CmdLine);
+ config->setRCFile(&g_Config);
+ g_GLEInterface = new GLEInterface();
+ g_GLEInterface->setConfig(config);
+ }
+ return g_GLEInterface;
+}
+
+struct GLEFileLocationCompare {
+ bool operator()(const GLEFileLocation& s1, const GLEFileLocation& s2) const {
+ if (s1.getExt() == s2.getExt()) {
+ if (s1.getName() == s2.getName()) {
+ return s1.getFullPath() < s2.getFullPath();
+ } else {
+ return s1.getName() < s2.getName();
+ }
+ } else {
+ if (str_i_equals(s1.getExt(), "GLE")) return true;
+ if (str_i_equals(s2.getExt(), "GLE")) return false;
+ return s1.getExt() < s2.getExt();
+ }
+ }
+};
+
+typedef set<GLEFileLocation, GLEFileLocationCompare> GLEFileLocationMapData;
+
+class GLEFileLocationMap {
+protected:
+ GLEFileLocationMapData m_Data;
+public:
+ GLEFileLocationMap();
+ ~GLEFileLocationMap();
+ vector<GLEFileLocation> getFiles();
+ inline void addFile(const GLEFileLocation& f1) { m_Data.insert(f1); }
+ inline void clear() { m_Data.clear(); }
+};
+
+GLEFileLocationMap::GLEFileLocationMap() {
+}
+
+GLEFileLocationMap::~GLEFileLocationMap() {
+}
+
+vector<GLEFileLocation> GLEFileLocationMap::getFiles() {
+ vector<GLEFileLocation> res;
+ for (GLEFileLocationMapData::iterator it = m_Data.begin(); it != m_Data.end(); it++) {
+ res.push_back(*it);
+ }
+ return res;
+}
+
+GLEInterface::GLEInterface() {
+ m_Output = new GLEOutputStream();
+ m_MakeDrawObjs = false;
+ m_CommitMode = false;
+ m_FontHash = new StringIntHash();
+ m_FontIndexHash = new IntIntHash();
+ m_FileInfoMap = new GLEFileLocationMap();
+
+ // Initialize text property store model
+ m_TextModel = new GLEPropertyStoreModel();
+ m_TextModel->add(new GLEPropertyFont("Font"));
+ m_TextModel->add(new GLEPropertyHei("Font size"));
+ m_TextModel->add(new GLEPropertyColor("Text color"));
+ m_TextModel->add(new GLEPropertyJustify("Text justify"));
+
+ m_LineModel = new GLEPropertyStoreModel();
+ m_LineModel->add(new GLEPropertyLWidth("Line width"));
+ m_LineModel->add(new GLEPropertyColor("Line color"));
+ m_LineModel->add(new GLEPropertyLStyle("Line style"));
+ GLEPropertyNominal* linecap = new GLEPropertyNominal("Line cap", GLEPropertyTypeInt, GLEDOPropertyLineCap);
+ linecap->addValue("butt", GLELineCapButt);
+ linecap->addValue("round", GLELineCapRound);
+ linecap->addValue("square", GLELineCapSquare);
+ m_LineModel->add(linecap);
+
+ m_LineModel->add(new GLEPropertyArrowSize("Arrow size"));
+ m_LineModel->add(new GLEPropertyArrowAngle("Arrow angle"));
+ GLEPropertyNominal* arrowstyle = new GLEPropertyNominal("Arrow style", GLEPropertyTypeInt, GLEDOPropertyArrowStyle);
+ arrowstyle->addValue("simple", GLEArrowStyleSimple);
+ arrowstyle->addValue("filled", GLEArrowStyleFilled);
+ arrowstyle->addValue("empty", GLEArrowStyleEmpty);
+ m_LineModel->add(arrowstyle);
+ GLEPropertyNominal* arrowtip = new GLEPropertyNominal("Arrow tip", GLEPropertyTypeInt, GLEDOPropertyArrowTip);
+ arrowtip->addValue("round", GLEArrowTipRound);
+ arrowtip->addValue("sharp", GLEArrowTipSharp);
+ m_LineModel->add(arrowtip);
+
+ m_ShapeModel = new GLEPropertyStoreModel();
+ m_ShapeModel->add(new GLEPropertyLWidth("Line width"));
+ m_ShapeModel->add(new GLEPropertyColor("Line color"));
+ m_ShapeModel->add(new GLEPropertyLStyle("Line style"));
+ m_ShapeModel->add(new GLEPropertyFillColor("Fill color"));
+
+ m_InitialPS = NULL;
+ m_Config = NULL;
+}
+
+GLEInterface::~GLEInterface() {
+ delete m_FontHash;
+ delete m_FontIndexHash;
+ delete m_Output;
+ if (m_Config != NULL) delete m_Config;
+ if (m_FileInfoMap != NULL) delete m_FileInfoMap;
+}
+
+bool GLEInterface::initializeGLE(const char* appname, int argc, char **argv) {
+ try {
+ gle_glib_init(argc, argv);
+ // Initialize code in core.cpp
+ g_init();
+ // Load configuration file
+ init_config(&g_Config);
+ init_option_args(g_CmdLine);
+ return do_load_config(appname, argv, g_CmdLine, g_Config);
+ } catch (ParserError& err) {
+ string err_str;
+ err.toString(err_str);
+ str_uppercase_initial_capital(err_str);
+ g_message(err_str);
+ }
+ return false;
+}
+
+string GLEInterface::getGLEVersion() {
+ string version;
+ g_get_version(&version);
+ return version;
+}
+
+string GLEInterface::getGLEBuildDate() {
+ string date;
+ g_get_build_date(&date);
+ return date;
+}
+
+const char* GLEInterface::getGLETop() {
+ return GLE_TOP_DIR.c_str();
+}
+
+void GLEInterface::setOutputStream(GLEOutputStream* output) {
+ m_Output = output;
+}
+
+GLERC<GLEScript> GLEInterface::newGLEFile(const char* glecode, const char* tmpfile) {
+ GLERC<GLEScript> script;
+ try {
+ string in_name = tmpfile;
+ script = new GLEScript();
+ GLEFileLocation* loc = script->getLocation();
+ loc->fromFileNameDir(in_name, GLE_WORKING_DIR);
+ GLESourceFile* file = script->getSource()->getMainFile();
+ char_separator sep("\n");
+ tokenizer<char_separator> tokens(glecode, sep);
+ while (tokens.has_more()) {
+ string line = tokens.next_token();
+ str_trim_both(line);
+ GLESourceLine* sline = file->addLine();
+ sline->setCode(line);
+ }
+ file->trim(1);
+ script->getSource()->initFromMain();
+ } catch (ParserError& err) {
+ string err_str;
+ err.toString(err_str);
+ str_uppercase_initial_capital(err_str);
+ g_message(err_str);
+ }
+ return script;
+}
+
+GLERC<GLEScript> GLEInterface::loadGLEFile(const char* glefile) {
+ try {
+ if (m_FileInfoMap != NULL) m_FileInfoMap->clear();
+ g_set_compatibility(GLE_COMPAT_MOST_RECENT);
+ return load_gle_code_sub(glefile, g_CmdLine);
+ } catch (ParserError& err) {
+ string err_str;
+ err.toString(err_str);
+ str_uppercase_initial_capital(err_str);
+ g_message(err_str);
+ return NULL;
+ }
+}
+
+void GLEInterface::saveGLEFile(GLEScript* script, const char* glefile) {
+ ofstream file(glefile);
+ GLESourceFile* main = script->getSource()->getMainFile();
+ // save all code lines
+ for (int i = 0; i < main->getNbLines(); i++) {
+ GLESourceLine* line = main->getLine(i);
+ file << line->getPrefix() << line->getCode() << endl;
+ }
+ file << endl;
+ file.close();
+ // update location
+ main->getLocation()->fromFileNameCrDir(glefile);
+}
+
+void GLEInterface::showGLEFile(GLEScript* script) {
+ cout << "Script:" << endl;
+ GLESourceFile* file = script->getSource()->getMainFile();
+ for (int i = 0; i < file->getNbLines(); i++) {
+ GLESourceLine* line = file->getLine(i);
+ cout << line->getCode() << endl;
+ }
+}
+
+void GLEInterface::setCompatibilityMode(const char* version) {
+ CmdLineArgString* arg = (CmdLineArgString*)g_CmdLine.createOption(GLE_OPT_COMPAT)->getArg(0);
+ arg->setValue(version);
+ g_set_compatibility(version);
+}
+
+void GLEInterface::renderGLE(GLEScript* script, const char* outfile, int device, bool toMemory) {
+ m_Script = script;
+ if (script == NULL) {
+ cerr << "GLEInterface::renderGLE(): script == NULL" << endl;
+ return;
+ }
+ script->cleanUp();
+ try {
+ size_t exit_code;
+ // Select dry-run (and output to memory)
+ CmdLineOption* noSave = g_CmdLine.createOption(GLE_OPT_NOSAVE);
+ noSave->setHasOption(toMemory);
+ // Set the device
+ CmdLineArgSet* dev = (CmdLineArgSet*)g_CmdLine.createOption(GLE_OPT_DEVICE)->getArg(0);
+ dev->reset();
+ dev->addValue(device);
+ // Set the output file name
+ CmdLineArgString* o_file = (CmdLineArgString*)g_CmdLine.createOption(GLE_OPT_OUTPUT)->getArg(0);
+ o_file->setValue(outfile);
+ if (isMakeDrawObjects()) script->clear();
+ load_one_file_sub(script, g_CmdLine, &exit_code);
+ m_Output->setExitCode(get_nb_errors());
+ } catch (ParserError& err) {
+ string err_str;
+ err.toString(err_str);
+ str_uppercase_initial_capital(err_str);
+ g_message(err_str);
+ m_Output->setExitCode(1);
+ }
+}
+
+void handleNewProperties(GLEGlobalSource* source, GLEPropertyStore* props) {
+ vector<GLEProperty*> changed;
+ GLEPropertyStoreModel* model = props->getModel();
+ for (int i = 0; i < model->getNumberOfProperties(); i++) {
+ GLEProperty* prop = model->getProperty(i);
+ if (!prop->isEqualToState(props)) {
+ prop->updateState(props);
+ changed.push_back(prop);
+ }
+ }
+ if (changed.size() != 0) {
+ ostringstream ss;
+ ss << "set";
+ for (vector<GLEProperty*>::size_type i = 0; i < changed.size(); i++) {
+ GLEProperty* prop = changed[i];
+ prop->createSetCommandGLECode(ss, props->getPropertyValue(prop));
+ }
+ source->addLine(ss.str());
+ }
+}
+
+void GLEInterface::commitChangesGLE(GLEScript* script) {
+ m_Script = script;
+ if (script == NULL) {
+ cerr << "GLEInterface::commitChangesGLE(): script == NULL" << endl;
+ return;
+ }
+ try {
+ setCommitMode(true);
+ setMakeDrawObjects(true);
+ GLEDevice* old_device = g_set_dummy_device();
+ TeXInterface* interface = TeXInterface::getInstance();
+ GLEFileLocation output;
+ output.createIllegal();
+ interface->initialize(script->getLocation(), &output);
+ interface->reset();
+ script->resetObjectIterator();
+ DrawIt(m_Script, &output, &g_CmdLine);
+ for (int i = 0; i < script->getNumberNewObjects(); i++) {
+ string code;
+ GLEDrawObject* obj = script->getNewObject(i);
+ if (!obj->hasFlag(GDO_FLAG_DELETED)) {
+ obj->createGLECode(code);
+ /* check if needs amove? */
+ GLEPoint amove;
+ bool needs_amove = false;
+ if (obj->needsAMove(amove)) {
+ /* Check if not already at this point */
+ GLEPoint crpt;
+ g_get_xy(&crpt);
+ if (!crpt.approx(amove)) {
+ needs_amove = true;
+ script->getSource()->addLine("");
+ }
+ }
+ /* add line to code */
+ handleNewProperties(script->getSource(), obj->getProperties());
+ /* amove command in front of object? */
+ if (needs_amove) {
+ ostringstream amovec;
+ amovec << "amove " << amove.getX() << " " << amove.getY();
+ script->getSource()->addLine(amovec.str());
+ }
+ script->getSource()->addLine(code);
+ /* compile and execute line of code */
+ obj->updateBoundingBox();
+ script->addObject(obj);
+ }
+ }
+ script->getSource()->performUpdates();
+ script->clearNewObjects();
+ script->removeDeletedObjects();
+ interface->tryCreateHash();
+ g_restore_device(old_device);
+ setMakeDrawObjects(false);
+ setCommitMode(false);
+ } catch (ParserError& err) {
+ string err_str;
+ err.toString(err_str);
+ str_uppercase_initial_capital(err_str);
+ g_message(err_str);
+ m_Output->setExitCode(1);
+ }
+}
+
+CmdLineObj* GLEInterface::getCmdLine() {
+ return m_Config->getCmdLine();
+}
+
+int GLEInterface::getNumberOfColors() {
+ return GLEGetColorList()->getNbColors();
+}
+
+GLEColor* GLEInterface::getColor(int i) {
+ return GLEGetColorList()->getColor(i);
+}
+
+void GLEInterface::addFont(GLEFont* font) {
+ font->setNumber(m_Fonts.size());
+ m_Fonts.add(font);
+ addSubFont(font);
+}
+
+void GLEInterface::addSubFont(GLEFont* font) {
+ m_FontHash->add_item(font->getName(), m_AllFonts.size());
+ m_FontIndexHash->add_item(font->getIndex(), m_AllFonts.size());
+ m_AllFonts.add(font);
+}
+
+// Return the number of available fonts
+int GLEInterface::getNumberOfFonts() {
+ return m_Fonts.size();
+}
+
+// Return the i-the font
+GLEFont* GLEInterface::getFont(int i) {
+ if (i < 0 || i >= (int)m_Fonts.size()) return m_Fonts.get(0);
+ return m_Fonts.get(i);
+}
+
+// Return the font matching a given name
+GLEFont* GLEInterface::getFont(const string& name) {
+ int idx = m_FontHash->try_get(name);
+ if (idx == -1) return NULL;
+ else return m_AllFonts.get(idx);
+}
+
+GLEFont* GLEInterface::getFont(const char* name) {
+ return getFont(string(name));
+}
+
+GLEFont* GLEInterface::getFontIndex(int font) {
+ int index = m_FontIndexHash->try_get(font);
+ if (index == -1) {
+ return 0;
+ } else {
+ return m_AllFonts.get(index);
+ }
+}
+
+const char* GLEInterface::getInitialPostScript() {
+ if (m_InitialPS == NULL) {
+ GLESaveRestore saved_state;
+ g_select_device(GLE_DEVICE_EPS);
+ PSGLEDevice* dev = (PSGLEDevice*)g_get_device_ptr();
+ dev->startRecording();
+ saved_state.save();
+ g_clear();
+ dev->startRecording();
+ dev->initialPS();
+ m_InitialPS = new string();
+ dev->getRecordedBytes(m_InitialPS);
+ saved_state.restore();
+ }
+ return m_InitialPS->c_str();
+}
+
+const char* GLEInterface::getTerminatePostScript() {
+ return "showpage\ngrestore\n";
+}
+
+void GLEInterface::renderText(GLETextDO* text, GLEPropertyStore* prop) {
+ GLESaveRestore saved_state;
+ g_select_device(GLE_DEVICE_EPS);
+ PSGLEDevice* dev = (PSGLEDevice*)g_get_device_ptr();
+ dev->startRecording();
+ saved_state.save();
+ g_clear();
+ g_resetfont();
+ g_scale(PS_POINTS_PER_INCH/CM_PER_INCH, PS_POINTS_PER_INCH/CM_PER_INCH);
+ g_translate(1.0*CM_PER_INCH/72, 1.0*CM_PER_INCH/72);
+ dev->startRecording();
+ // Select the right color
+ GLEColor* color = prop->getColorProperty(GLEDOPropertyColor);
+ g_set_color(color);
+ // Select the right size
+ double hei = prop->getRealProperty(GLEDOPropertyFontSize);
+ g_set_hei(hei);
+ g_set_font_width(-1);
+ g_set_line_style("1");
+ g_set_line_width(0.02);
+ // Select the font
+ GLEFont* font = prop->getFontProperty(GLEDOPropertyFont);
+ if (font == NULL) {
+ font = getFont("rm");
+ }
+ g_set_font(font->getIndex());
+ char* str = (char*)text->getTextC();
+ // Calculate the text's size
+ double x1, x2, y1, y2;
+ g_measure(str, &x1, &x2, &y2, &y1);
+ text->initBB(x2-x1, y2-y1, -y1);
+// DRAW BOUNDING BOX
+/* g_set_color(0X01FF0000);
+ g_set_line_width(0.005);
+ g_move(0.0,0.0);
+ g_line(x2-x1, 0.0);
+ g_line(x2-x1, y2-y1);
+ g_line(0.0, y2-y1);
+ g_line(0.0, 0.0);
+ dev->flush();
+ g_set_color(0X01000000);*/
+ // Draw the string
+ g_move(0.0, 0.0);
+ g_jtext(JUST_BL);
+ // Return the resulting PostScript code
+ dev->getRecordedBytes(text->getPostScriptPtr());
+/*
+ string code;
+ code += getInitialPostScript();
+ code += (*text->getPostScriptPtr());
+ code += getTerminatePostScript();
+ cout << "PS:" << endl << code << endl; */
+ saved_state.restore();
+}
+
+GLETextDO* GLEInterface::renderText(const char* str, GLEPropertyStore* prop) {
+ GLEPoint orig;
+ GLETextDO* text = new GLETextDO(orig, str);
+ renderText(text, prop);
+ return text;
+}
+
+bool GLEInterface::isDeviceSupported(int device) {
+ switch (device) {
+ case GLE_DEVICE_PS:
+ case GLE_DEVICE_EPS:
+ case GLE_DEVICE_DUMMY:
+ return true;
+#ifdef HAVE_CAIRO
+ case GLE_DEVICE_CAIRO_PDF:
+ case GLE_DEVICE_SVG:
+ case GLE_DEVICE_CAIRO_SVG:
+ return true;
+#ifdef __WIN32__
+ case GLE_DEVICE_EMF:
+ return true;
+#endif
+#endif
+#ifdef HAVE_X11
+ case GLE_DEVICE_X11:
+ return true;
+#endif
+ default:
+ return false;
+ }
+}
+
+const char* GLEInterface::getDeviceFilenameExtension(int device) {
+ switch (device) {
+ case GLE_DEVICE_PDF: return "pdf";
+ case GLE_DEVICE_PS: return "ps";
+ case GLE_DEVICE_EPS: return "eps";
+ case GLE_DEVICE_SVG: return "svg";
+ case GLE_DEVICE_EMF: return "emf";
+ case GLE_DEVICE_PNG: return "png";
+ case GLE_DEVICE_JPEG: return "jpg";
+ }
+ return "unk";
+}
+
+void GLEInterface::clearAllCmdLine() {
+ getCmdLine()->clearAll();
+}
+
+void GLEInterface::setCmdLineOption(const char* name) {
+ getCmdLine()->setHasOption(string(name));
+}
+
+void GLEInterface::setCmdLineOptionString(const char* name, const char* value, int arg) {
+ getCmdLine()->setOptionString(string(name), string(value), arg);
+}
+
+bool GLEInterface::hasCmdLineOptionString(const char* name) {
+ return getCmdLine()->hasOption(string(name));
+}
+
+string GLEInterface::getGhostScriptLocation() {
+ ConfigSection* tools = g_Config.getSection(GLE_CONFIG_TOOLS);
+#ifdef __WIN32__
+ string name = "gsdll32.dll";
+ string result = ((CmdLineArgString*)tools->getOptionValue(GLE_TOOL_GHOSTSCRIPT_CMD))->getValue();
+ if (IsAbsPath(result)) {
+ StripPathComponents(&result, 1);
+ AddDirSep(result);
+ } else {
+ result = "";
+ }
+ result += name;
+ return result;
+#else
+ return get_tool_path(GLE_TOOL_GHOSTSCRIPT_LIB, tools);
+#endif
+}
+
+string GLEInterface::getToolLocation(const char* name) {
+ ConfigSection* tools = g_Config.getSection(GLE_CONFIG_TOOLS);
+ for (int j = 0; j < tools->getNbOptions(); j++) {
+ CmdLineOption* opt = tools->getOption(j);
+ if (str_i_equals(opt->getName(), name)) {
+ return get_tool_path(j, tools);
+ }
+ }
+ return string("");
+}
+
+string GLEInterface::getUserConfigLocation() {
+ string location;
+ #if defined(__UNIX__) || defined (__OS2__)
+ GLEGetEnv("HOME", location);
+ #endif
+ #ifdef __WIN32__
+ GLEGetEnv("APPDATA", location);
+ if (location != "") {
+ AddDirSep(location);
+ location += "gle-graphics.org";
+ }
+ #endif
+ if (location != "") {
+ AddDirSep(location);
+ location += ".glerc";
+ }
+ return location;
+}
+
+string GLEInterface::getManualLocation() {
+ string loc;
+#ifdef GLEDOC_CD
+ if (GLEAddRelPathAndFileTry(GLE_TOP_DIR, GLEDOC_CD, GLEDOC_REL, "gle-manual.pdf", loc)) {
+ return loc;
+ }
+ if (GLEAddRelPathAndFileTry(GLE_TOP_DIR, GLEDOC_CD, GLEDOC_REL, "gle-manual.pdf.gz", loc)) {
+ return loc;
+ }
+#endif
+ if (GLEAddRelPathAndFileTry(GLE_TOP_DIR, 0, "doc", "gle-manual.pdf", loc)) {
+ return loc;
+ }
+ if (GLEAddRelPathAndFileTry(GLE_TOP_DIR, 0, "doc", "gle-manual.pdf.gz", loc)) {
+ return loc;
+ }
+#ifdef GLEDOC_ABS
+ if (GLEAddRelPathAndFileTry(GLEDOC_ABS, 0, NULL, "gle-manual.pdf", loc)) {
+ return loc;
+ }
+ if (GLEAddRelPathAndFileTry(GLEDOC_ABS, 0, NULL, "gle-manual.pdf.gz", loc)) {
+ return loc;
+ }
+#endif
+ return loc;
+}
+
+void GLEInterface::findDependencies(const char* root) {
+ string loc = root;
+ do_find_deps_sub(this, loc);
+}
+
+void GLEInterface::saveRCFile() {
+ do_save_config();
+}
+
+void GLEInterface::addFileInfo(const GLEFileLocation& f1) {
+ if (m_FileInfoMap != NULL) m_FileInfoMap->addFile(f1);
+}
+
+vector<GLEFileLocation> GLEInterface::getFileInfos() {
+ if (m_FileInfoMap != NULL) {
+ return m_FileInfoMap->getFiles();
+ } else {
+ return vector<GLEFileLocation>();
+ }
+}
+
+void GLEInterface::initTextProperties(GLEPropertyStore* prop) {
+ int font;
+ double fontsize;
+ g_get_hei(&fontsize);
+ prop->setRealProperty(GLEDOPropertyFontSize, fontsize);
+ g_get_font(&font);
+ prop->setFontProperty(GLEDOPropertyFont, getFontIndex(font));
+}
+
+extern GLEGlobalSource* g_Source;
+void output_error(ParserError& err);
+void g_set_error_line(int lin);
+
+void GLEInterface::evalString(const char* str, GLEScript* script) {
+ try {
+ g_set_error_line(-1);
+ g_select_device(GLE_DEVICE_DUMMY);
+ if (script == NULL) {
+ g_Source = NULL;
+ g_clear();
+ sub_clear(false);
+ clear_run();
+ f_init();
+ gle_set_constants();
+ }
+ GLEPolish polish;
+ polish.initTokenizer();
+ string value;
+ GLERC<GLEArrayImpl> stk(new GLEArrayImpl());
+ polish.evalString(stk.get(), str, &value, true);
+ g_message_first_newline(false);
+ g_message(value);
+ } catch (ParserError& err) {
+ output_error(err);
+ }
+}
+
+string GLEInterface::getTempFile() {
+ return GLETempName();
+}
+
+int GLEInterface::copyFile(const string& from, const string& to, string* err) {
+ return GLECopyFile(from, to, err);
+}
+
+void GLEInterface::convertPDFToImage(char* pdfData,
+ int pdfLength,
+ double resolution,
+ int device,
+ int options,
+ gle_write_func writeFunc,
+ void* closure)
+{
+ gle_convert_pdf_to_image(pdfData,
+ pdfLength,
+ resolution,
+ device,
+ options,
+ writeFunc,
+ closure);
+}
+
+bool GLEReadFileOrGZIPTxt(const std::string& name, std::string* result);
+
+bool GLEInterface::readFileOrGZIPTxt(const char* name, std::string* result) {
+ return GLEReadFileOrGZIPTxt(std::string(name), result);
+}
+
+GLEFileLocation::GLEFileLocation() {
+ m_Flags = 0;
+}
+
+GLEFileLocation::GLEFileLocation(const GLEFileLocation& other) {
+ m_Flags = other.getFlags();
+ m_Name = other.getName();
+ m_Ext = other.getExt();
+ m_Directory = other.getDirectory();
+ m_FullPath = other.getFullPath();
+}
+
+GLEFileLocation::GLEFileLocation(const char* file) {
+ m_Name = file;
+ m_FullPath = file;
+ m_Flags = GLE_FILELOCATION_IS_LOCAL;
+ GetExtension(m_Name, m_Ext);
+}
+
+GLEFileLocation::~GLEFileLocation() {
+}
+
+void GLEFileLocation::fromAbsolutePath(const string& path) {
+ SplitFileName(path, m_Directory, m_Name);
+ GetExtension(m_Name, m_Ext);
+ setFullPath(path);
+}
+
+void GLEFileLocation::fromRelativePath(const string& dirname, const string& fname) {
+ // don't modify fname, store it with setName(), also if it is a relative path [this is intentional]
+ GLEGetFullPath(dirname, fname, m_FullPath);
+ // note that fname can also contain part of the path
+ GetDirName(m_FullPath, m_Directory);
+ GetExtension(fname, m_Ext);
+ setName(fname);
+}
+
+void GLEFileLocation::fromFileNameCrDir(const string& fname) {
+ if (IsAbsPath(fname)) {
+ fromAbsolutePath(fname);
+ } else {
+ string dirname;
+ GLEGetCrDir(&dirname);
+ fromRelativePath(dirname, fname);
+ }
+}
+
+void GLEFileLocation::fromFileNameDir(const string& fname, const string& dirname) {
+ if (IsAbsPath(fname)) {
+ fromAbsolutePath(fname);
+ } else {
+ fromRelativePath(dirname, fname);
+ }
+}
+
+void GLEFileLocation::createStdin() {
+ m_Name = "stdin";
+ m_Flags = GLE_FILELOCATION_IS_STDIN;
+}
+
+void GLEFileLocation::createStdout() {
+ m_Name = "stdout";
+ m_Flags = GLE_FILELOCATION_IS_STDOUT;
+}
+
+void GLEFileLocation::createIllegal() {
+ m_Name = "illegal";
+ m_Flags = GLE_FILELOCATION_IS_ILLEGAL;
+}
+
+void GLEFileLocation::initDirectory() {
+ GetDirName(m_FullPath, m_Directory);
+}
+
+void GLEFileLocation::copy(const GLEFileLocation* other) {
+ m_Flags = other->getFlags();
+ m_Name = other->getName();
+ m_Ext = other->getExt();
+ m_Directory = other->getDirectory();
+ m_FullPath = other->getFullPath();
+}
+
+void GLEFileLocation::addExtension(const char* ext) {
+ const char* myExt = ext[0] == '.' ? (ext + 1) : ext;
+ m_Ext = myExt;
+ m_FullPath += ".";
+ m_FullPath += myExt;
+ if ((m_Flags & (GLE_FILELOCATION_IS_STDIN | GLE_FILELOCATION_IS_STDOUT | GLE_FILELOCATION_IS_ILLEGAL)) == 0) {
+ m_Name += ".";
+ m_Name += myExt;
+ }
+}
+
+bool GLEFileLocation::isStream() {
+ return (m_Flags & (GLE_FILELOCATION_IS_STDIN | GLE_FILELOCATION_IS_STDOUT)) != 0;
+}
+
+string GLEFileLocation::getFileName() {
+ string result;
+ SplitFileNameNoDir(m_FullPath, result);
+ return result;
+}
+
+string GLEFileLocation::getMainName() {
+ string result;
+ SplitFileNameNoDir(m_FullPath, result);
+ GetMainName(result, result);
+ return result;
+}
+
+GLEErrorMessage::GLEErrorMessage() {
+ m_Line = m_Column = -1;
+ m_Delta = 0;
+}
+
+GLEErrorMessage::~GLEErrorMessage() {
+}
+
+GLEOutputStream::GLEOutputStream() {
+ m_ExitCode = 0;
+}
+
+GLEOutputStream::~GLEOutputStream() {
+}
+
+void GLEOutputStream::println() {
+ println("");
+}
+
+void GLEOutputStream::println(const char* str) {
+ cerr << str << endl;
+}
+
+void GLEOutputStream::printflush(const char* str) {
+ cerr << str;
+ cerr.flush();
+}
+
+void GLEOutputStream::error(GLEErrorMessage* msg) {
+ const char* file = msg->getFile();
+ const char* abbrev = msg->getLineAbbrev();
+ ostringstream output;
+ output << endl;
+ output << ">> " << file << " (" << msg->getLine() << ")";
+ if (abbrev[0] != 0) {
+ output << " |" << abbrev << "|";
+ }
+ if (msg->getColumn() != -1) {
+ char number[50];
+ output << endl;
+ output << ">> ";
+ sprintf(number, "%d", msg->getLine());
+ int nbspc = strlen(file) + strlen(number) + 4 + msg->getColumn() - msg->getDelta();
+ for (int i = 0; i < nbspc; i++) {
+ output << " ";
+ }
+ output << "^";
+ }
+ output << msg->getErrorMsg();
+ g_message(output.str().c_str());
+}
+
+GLEDrawObject::GLEDrawObject() {
+ m_Flag = 0;
+ m_Properties = NULL;
+}
+
+GLEDrawObject::~GLEDrawObject() {
+ if (m_Properties != NULL) delete m_Properties;
+}
+
+void GLEDrawObject::initProperties(GLEInterface* iface) {
+}
+
+bool GLEDrawObject::needsAMove(GLEPoint& pt) {
+ return false;
+}
+
+void GLEDrawObject::createGLECode(string& code) {
+ code = "";
+}
+
+void GLEDrawObject::getPSBoundingBox(GLERectangle* box) {
+}
+
+const char* GLEDrawObject::getPostScriptCode() {
+ return "";
+}
+
+void GLEDrawObject::updateBoundingBox() {
+}
+
+void GLEDrawObject::applyTransformation(bool dir) {
+}
+
+void GLEDrawObject::applyTransformationPt(GLEPoint* pt, bool dir) {
+ if (dir) {
+ double devx, devy;
+ g_dev(pt->getX(), pt->getY(), &devx, &devy);
+ pt->setXY((devx-1.0)/PS_POINTS_PER_INCH*CM_PER_INCH, (devy-1.0)/PS_POINTS_PER_INCH*CM_PER_INCH);
+ } else {
+ double xp, yp;
+ g_undev(pt->getX()*PS_POINTS_PER_INCH/CM_PER_INCH+1.0, pt->getY()*PS_POINTS_PER_INCH/CM_PER_INCH+1.0, &xp, &yp);
+ pt->setXY(xp, yp);
+ }
+}
+
+GLEDrawObject* GLEDrawObject::clone() {
+ return NULL;
+}
+
+GLEDrawObject* GLEDrawObject::deepClone() {
+ GLEDrawObject* res = clone();
+ GLEPropertyStore* store = getProperties();
+ if (store != NULL) {
+ res->setProperties(store->clone());
+ }
+ return res;
+}
+
+bool GLEDrawObject::approx(GLEDrawObject* other) {
+ return false;
+}
+
+void GLEDrawObject::draw() {
+}
+
+bool GLEDrawObject::modified() {
+ return true;
+}
+
+void GLEDrawObject::setProperties(GLEPropertyStore* store) {
+ if (m_Properties != NULL) delete m_Properties;
+ m_Properties = store;
+}
+
+GLEObjectDOConstructor::GLEObjectDOConstructor(GLESub* sub) {
+ m_Sub = sub;
+ m_NbExtra = sub->getNbParam();
+ int first = 0;
+ if (sub->getNbParam() >= 2 && str_i_equals(sub->getParamNameShort(0), "width") && str_i_equals(sub->getParamNameShort(1), "height")) {
+ // First two arguments are width and height
+ m_CanScale = true;
+ add(new GLEProperty(sub->getParamNameShort(0).c_str(), GLEPropertyTypeReal, GLEDOPropertyUserArg));
+ add(new GLEProperty(sub->getParamNameShort(1).c_str(), GLEPropertyTypeReal, GLEDOPropertyUserArg));
+ first += 2;
+ }
+ for (int i = first; i < sub->getNbParam(); i++) {
+ string arg = sub->getParamNameShort(i);
+ add(new GLEProperty(arg.c_str(), GLEPropertyTypeString, GLEDOPropertyUserArg));
+ }
+ add(new GLEPropertyColor("Color"));
+ add(new GLEPropertyFillColor("Fill color"));
+ add(new GLEPropertyLWidth("Line width"));
+ add(new GLEPropertyLStyle("Line style"));
+ GLEPropertyNominal* linecap = new GLEPropertyNominal("Line cap", GLEPropertyTypeInt, GLEDOPropertyLineCap);
+ linecap->addValue("butt", GLELineCapButt);
+ linecap->addValue("round", GLELineCapRound);
+ linecap->addValue("square", GLELineCapSquare);
+ add(linecap);
+ add(new GLEPropertyFont("Font"));
+ add(new GLEPropertyHei("Font size"));
+}
+
+GLEObjectDOConstructor::~GLEObjectDOConstructor() {
+}
+
+void GLEObjectDOConstructor::scale(GLEDrawObject* obj, double sx, double sy) {
+ GLEArrayImpl* props = obj->getProperties()->getArray();
+ props->setDouble(0, sx);
+ props->setDouble(1, sy);
+}
+
+const string& GLEObjectDOConstructor::getName() {
+ return m_Sub->getName();
+}
+
+GLEScript* GLEObjectDOConstructor::getScript() {
+ return m_Sub->getScript();
+}
+
+void output_error(ParserError& err);
+void eval(GLEArrayImpl* stk, GLEPcodeList* pclist, int *pcode, int *cp, double *oval, GLEString **ostr, int *otyp) throw(ParserError);
+
+GLEObjectDO* GLEObjectDOConstructor::constructObject() {
+ GLEObjectDO* obj = new GLEObjectDO(this);
+ obj->initProperties(m_Sub->getScript()->getGLEInterface());
+ GLEArrayImpl* arr = obj->getProperties()->getArray();
+ int first = 0;
+ if (isSupportScale()) {
+ // First two arguments are width and height
+ arr->setDouble(0, atof(m_Sub->getDefault(0).c_str()));
+ arr->setDouble(1, atof(m_Sub->getDefault(1).c_str()));
+ first += 2;
+ }
+ for (int i = first; i < m_Sub->getNbParam(); i++) {
+ string arg = m_Sub->getDefault(i);
+ arr->setObject(i, new GLEString(arg));
+ }
+ obj->render();
+ return obj;
+}
+
+GLEScript::GLEScript() {
+ m_Run = NULL;
+ m_Parser = NULL;
+ m_Polish = NULL;
+ m_Pcode = NULL;
+}
+
+GLEScript::~GLEScript() {
+ cleanUp();
+}
+
+void GLEScript::cleanUp() {
+ if (m_Run != NULL) delete m_Run;
+ if (m_Parser != NULL) delete m_Parser;
+ if (m_Polish != NULL) delete m_Polish;
+ if (m_Pcode != NULL) {
+ delete m_Pcode->getPcodeList();
+ delete m_Pcode;
+ }
+ m_Run = NULL;
+ m_Parser = NULL;
+ m_Polish = NULL;
+ m_Pcode = NULL;
+ m_PostScriptCode.resize(0);
+}
+
+GLEDrawObject* GLEScript::newGLEObject(GLEDrawObjectType type) {
+ GLEDrawObject* obj = NULL;
+ switch (type) {
+ case GDOLine:
+ obj = new GLELineDO();
+ obj->initProperties(GLEGetInterfacePointer());
+ break;
+ case GDOEllipse:
+ obj = new GLEEllipseDO();
+ obj->initProperties(GLEGetInterfacePointer());
+ break;
+ case GDOArc:
+ obj = new GLEArcDO();
+ obj->initProperties(GLEGetInterfacePointer());
+ break;
+ case GDOText:
+ obj = new GLETextDO();
+ ((GLETextDO*)obj)->setModified(true);
+ obj->initProperties(GLEGetInterfacePointer());
+ break;
+ default:
+ break;
+ }
+ m_NewObjs.add(obj);
+ return obj;
+}
+
+void GLEScript::cancelObject(GLEDrawObject* obj) {
+ int pos = m_NewObjs.size()-1;
+ while (pos > 0) {
+ if (m_NewObjs[pos].get() == obj) {
+ m_NewObjs.erase(m_NewObjs.begin()+pos);
+ break;
+ }
+ pos--;
+ }
+}
+
+GLEDrawObject* GLEScript::nextObject() {
+ if (m_CurrObject < getNumberObjects()) {
+ return getObject(m_CurrObject++);
+ } else {
+ return NULL;
+ }
+}
+
+void GLEScript::clearNewObjects() {
+ m_NewObjs.clear();
+}
+
+GLEDrawObjectType GLEScript::getType() {
+ return GDOScript;
+}
+
+void GLEScript::updateObjectDOConstructors() {
+ m_File.clearObjectDOConstructors();
+ // update all
+ GLESubMap* subs = getParser()->getSubroutines();
+ for (int i = 0; i < subs->size(); i++) {
+ GLESub* sub = subs->get(i);
+ sub->setScript(this);
+ bool okSub = true;
+ if (!sub->isObject()) {
+ okSub = false;
+ } else {
+ for (int j = 0; j < sub->getNbParam(); j++) {
+ // Should have default value for each parameter
+ if (sub->getDefault(j).length() == 0) okSub = false;
+ }
+ }
+ if (okSub) {
+ int line = sub->getStart();
+ GLESourceFile* file = m_File.getLine(line)->getSource();
+ GLEObjectDOConstructor* cons = sub->getObjectDOConstructor();
+ file->addObjectDOConstructor(cons);
+ }
+ }
+}
+
+const char* GLEScript::getPostScriptCode()
+{
+ return m_PostScriptCode.c_str();
+}
+
+string* GLEScript::getRecordedBytesBuffer(int device)
+{
+ if (device == GLE_DEVICE_EPS) {
+ return &m_PostScriptCode;
+ } else if (device == GLE_DEVICE_PDF) {
+ return &m_PDFCode;
+ } else {
+ CUtilsAssert(false);
+ return 0;
+ }
+}
+
+GLEHasArrowBase::GLEHasArrowBase():
+ m_Arrow(GLEHasArrowNone)
+{
+}
+
+GLELineDO::GLELineDO() {
+}
+
+GLELineDO::GLELineDO(const GLEPoint& p1, const GLEPoint& p2) : m_P1(p1), m_P2(p2) {
+}
+
+GLELineDO::GLELineDO(double x1, double y1, double x2, double y2) : m_P1(x1,y1), m_P2(x2,y2) {
+}
+
+GLELineDO::~GLELineDO() {
+}
+
+GLEDrawObjectType GLELineDO::getType() {
+ return GDOLine;
+}
+
+void GLELineDO::initProperties(GLEInterface* iface) {
+ m_Properties = new GLEPropertyStore(iface->getLinePropertyStoreModel());
+ GLEInitLineProperties(m_Properties);
+ GLEInitArrowProperties(m_Properties);
+}
+
+bool GLELineDO::needsAMove(GLEPoint& pt) {
+ pt.set(getP1());
+ return true;
+}
+
+namespace {
+
+ void addArrowToCode(ostream& str, GLEHasArrow arrow) {
+ if (arrow == (GLEHasArrowStart | GLEHasArrowEnd)) {
+ str << " arrow both";
+ } else if (arrow == GLEHasArrowStart) {
+ str << " arrow start";
+ } else if (arrow == GLEHasArrowEnd) {
+ str << " arrow end";
+ }
+ }
+
+}
+
+void GLELineDO::createGLECode(string& code) {
+ ostringstream str;
+ str << "aline " << getP2().getX() << " " << getP2().getY();
+ addArrowToCode(str, getArrow());
+ code = str.str();
+}
+
+void GLELineDO::updateBoundingBox() {
+ g_update_bounds(getP1().getX(), getP1().getY());
+ g_update_bounds(getP2().getX(), getP2().getY());
+ g_move(getP2().getX(), getP2().getY());
+}
+
+void GLELineDO::applyTransformation(bool dir) {
+ applyTransformationPt(&m_P1, dir);
+ applyTransformationPt(&m_P2, dir);
+ double scale = g_get_avg_scale();
+ GLEScaleSimpleLineProperties(scale, dir, getProperties());
+ GLEScaleArrowProperties(scale, dir, getProperties());
+}
+
+GLEDrawObject* GLELineDO::clone() {
+ GLELineDO* cl = new GLELineDO(getP1(), getP2());
+ cl->setArrow(getArrow());
+ return cl;
+}
+
+bool GLELineDO::approx(GLEDrawObject* other) {
+ GLELineDO* otherc = (GLELineDO*)other;
+ return getP1().approx(otherc->getP1()) && getP2().approx(otherc->getP2()) && getArrow() == otherc->getArrow();
+}
+
+GLEEllipseDO::GLEEllipseDO() {
+ m_Rx = m_Ry = 0.0;
+}
+
+GLEEllipseDO::GLEEllipseDO(double x0, double y0, double rx, double ry) : m_Center(x0, y0) {
+ m_Rx = rx;
+ m_Ry = ry;
+}
+
+GLEEllipseDO::GLEEllipseDO(const GLEPoint& c, double rx, double ry) : m_Center(c) {
+ m_Rx = rx;
+ m_Ry = ry;
+}
+
+GLEEllipseDO::GLEEllipseDO(double x0, double y0, double r) : m_Center(x0, y0) {
+ m_Rx = m_Ry = r;
+}
+
+GLEEllipseDO::~GLEEllipseDO() {
+}
+
+GLEDrawObjectType GLEEllipseDO::getType() {
+ return GDOEllipse;
+}
+
+void GLEEllipseDO::setRadius(double r) {
+ m_Rx = m_Ry = r;
+}
+
+GLEPoint GLEEllipseDO::getPoint(GLEJustify just) {
+ switch (just) {
+ case GLEJustifyRC:
+ return GLEPoint(m_Center.getX()+m_Rx, m_Center.getY());
+ case GLEJustifyTL:
+ return GLEPoint(m_Center.getX()-m_Rx, m_Center.getY()+m_Ry);
+ case GLEJustifyBR:
+ return GLEPoint(m_Center.getX()+m_Rx, m_Center.getY()-m_Ry);
+ default:
+ break;
+ }
+ return GLEPoint();
+}
+
+void GLEEllipseDO::initProperties(GLEInterface* iface) {
+ m_Properties = new GLEPropertyStore(iface->getShapePropertyStoreModel());
+ GLEInitSimpleLineProperties(m_Properties);
+ GLEInitShapeFillColor(m_Properties);
+}
+
+bool GLEEllipseDO::needsAMove(GLEPoint& pt) {
+ pt.set(getCenter());
+ return true;
+}
+
+void GLEEllipseDO::createGLECode(string& code) {
+ ostringstream str;
+ if (isCircle()) {
+ str << "circle " << m_Rx;
+ } else {
+ str << "ellipse " << m_Rx << " " << m_Ry;
+ }
+ code = str.str();
+}
+
+void GLEEllipseDO::updateBoundingBox() {
+ g_move(getCenter().getX(), getCenter().getY());
+ g_update_bounds(getCenter().getX()-m_Rx,getCenter().getY()-m_Ry);
+ g_update_bounds(getCenter().getX()+m_Rx,getCenter().getY()+m_Ry);
+}
+
+void GLEEllipseDO::applyTransformation(bool dir) {
+ applyTransformationPt(&m_Center, dir);
+ double sx, sy;
+ g_get_scale(&sx, &sy);
+ if (dir) {
+ m_Rx *= sx;
+ m_Ry *= sy;
+ } else {
+ m_Rx /= sx;
+ m_Ry /= sy;
+ }
+ double scale = (sx+sy)/2.0;
+ GLEScaleSimpleLineProperties(scale, dir, getProperties());
+}
+
+GLEDrawObject* GLEEllipseDO::clone() {
+ return new GLEEllipseDO(m_Center, m_Rx, m_Ry);
+}
+
+bool GLEEllipseDO::approx(GLEDrawObject* other) {
+ GLEEllipseDO* otherc = (GLEEllipseDO*)other;
+ return m_Center.approx(otherc->getCenter()) &&
+ fabs(m_Rx - otherc->getRadiusX()) < 1e-6 &&
+ fabs(m_Ry - otherc->getRadiusY()) < 1e-6;
+}
+
+GLEArcDO::GLEArcDO() {
+ m_Angle1 = m_Angle2 = 0.0;
+}
+
+GLEArcDO::GLEArcDO(double x0, double y0, double r, double a1, double a2) : GLEEllipseDO(x0, y0, r) {
+ m_Angle1 = a1; m_Angle2 = a2;
+}
+
+GLEArcDO::GLEArcDO(double x0, double y0, double rx, double ry, double a1, double a2) : GLEEllipseDO(x0, y0, rx, ry) {
+ m_Angle1 = a1; m_Angle2 = a2;
+}
+
+GLEArcDO::~GLEArcDO() {
+}
+
+GLEDrawObjectType GLEArcDO::getType() {
+ return GDOArc;
+}
+
+void GLEArcDO::initProperties(GLEInterface* iface) {
+ m_Properties = new GLEPropertyStore(iface->getLinePropertyStoreModel());
+ GLEInitLineProperties(m_Properties);
+ GLEInitArrowProperties(m_Properties);
+}
+
+bool GLEArcDO::needsAMove(GLEPoint& pt) {
+ pt.set(getCenter());
+ return true;
+}
+
+void GLEArcDO::createGLECode(string& code) {
+ ostringstream str;
+ double angle2 = g_arc_normalized_angle2(m_Angle1, m_Angle2);
+ if (isCircle()) {
+ str << "arc " << m_Rx << " " << m_Angle1 << " " << angle2;
+ } else {
+
+ str << "elliptical_arc " << m_Rx << " " << m_Ry << " " << m_Angle1 << " " << angle2;
+ }
+ addArrowToCode(str, getArrow());
+ code = str.str();
+}
+
+void GLEArcDO::updateBoundingBox() {
+ g_move(m_Center.getX(), m_Center.getY());
+}
+
+GLEDrawObject* GLEArcDO::clone() {
+ GLEArcDO* result = new GLEArcDO(m_Center.getX(), m_Center.getY(), m_Rx, m_Ry, m_Angle1, m_Angle2);
+ result->setArrow(getArrow());
+ return result;
+}
+
+bool GLEArcDO::approx(GLEDrawObject* other) {
+ GLEArcDO* otherc = (GLEArcDO*)other;
+ return GLEEllipseDO::approx(other) &&
+ fabs(m_Angle1 - otherc->getAngle1()) < 1e-6 &&
+ fabs(m_Angle2 - otherc->getAngle2()) < 1e-6 &&
+ getArrow() == otherc->getArrow();
+}
+
+void GLEArcDO::normalize() {
+ m_Angle2 = g_arc_normalized_angle2(m_Angle1, m_Angle2);
+}
+
+GLEPoint& GLEArcDO::getPoint1(GLEPoint& pt) {
+ pt.set(m_Center);
+ pt.add(m_Rx*cos(m_Angle1*GLE_PI/180.0), m_Ry*sin(m_Angle1*GLE_PI/180.0));
+ return pt;
+}
+
+GLEPoint& GLEArcDO::getPoint2(GLEPoint& pt) {
+ pt.set(m_Center);
+ pt.add(m_Rx*cos(m_Angle2*GLE_PI/180.0), m_Ry*sin(m_Angle2*GLE_PI/180.0));
+ return pt;
+}
+
+GLEPoint& GLEArcDO::getPointMid(GLEPoint& pt) {
+ pt.set(m_Center);
+ double angle2 = g_arc_normalized_angle2(m_Angle1, m_Angle2);
+ double angleMid = (m_Angle1 + angle2)/2;
+ pt.add(m_Rx*cos(angleMid*GLE_PI/180.0), m_Ry*sin(angleMid*GLE_PI/180.0));
+ return pt;
+}
+
+GLETextDO::GLETextDO() : m_Modified(false) {
+}
+
+GLETextDO::GLETextDO(GLEPoint& position, const string& text) : m_Position(position), m_Text(text), m_Modified(false) {
+}
+
+GLETextDO::~GLETextDO() {
+}
+
+GLEDrawObjectType GLETextDO::getType() {
+ return GDOText;
+}
+
+const char* GLETextDO::getPostScriptCode() {
+ return m_PostScript.c_str();
+}
+
+void GLETextDO::getPSBoundingBox(GLERectangle* box) {
+ box->copy(&m_PSBoundingBox);
+}
+
+void GLETextDO::initBB(double width, double height, double baseline) {
+ m_PSBoundingBox.setXMin(0.0);
+ m_PSBoundingBox.setXMax(width);
+ m_PSBoundingBox.setYMin(0.0);
+ m_PSBoundingBox.setYMax(height);
+ m_BaseLine = baseline;
+}
+
+bool GLETextDO::needsAMove(GLEPoint& pt) {
+ pt.set(getPosition());
+ return true;
+}
+
+void GLETextDO::createGLECode(string& code) {
+ ostringstream str;
+ str << "write \"" << getText() << "\"";
+ code = str.str();
+}
+
+void GLETextDO::updateBoundingBox() {
+ GLEDevice* oldDevice = g_set_dummy_device();
+ g_move(getPosition());
+ g_text(getText());
+ g_restore_device(oldDevice);
+ g_move(getPosition());
+}
+
+void GLETextDO::applyTransformation(bool dir) {
+ applyTransformationPt(&m_Position, dir);
+ GLEPropertyStore* props = getProperties();
+ if (props != NULL) {
+ double scale = g_get_avg_scale();
+ if (scale > 0) {
+ double hei = props->getRealProperty(GLEDOPropertyFontSize);
+ if (dir) {
+ hei *= scale;
+ } else {
+ hei /= scale;
+ }
+ props->setRealProperty(GLEDOPropertyFontSize, hei);
+ }
+ }
+}
+
+GLEDrawObject* GLETextDO::clone() {
+ return new GLETextDO(getPosition(), getText());
+}
+
+bool GLETextDO::approx(GLEDrawObject* other) {
+ GLETextDO* othert = (GLETextDO*)other;
+ return m_Position.approx(othert->getPosition()) &&
+ m_Text == othert->getText();
+}
+
+bool GLETextDO::modified() {
+ return m_Modified;
+}
+
+void GLETextDO::setModified(bool modified) {
+ m_Modified = modified;
+}
+
+void GLETextDO::initProperties(GLEInterface* iface) {
+ int justify;
+ m_Properties = new GLEPropertyStore(iface->getTextPropertyStoreModel());
+ GLEInitColorProperty(m_Properties);
+ iface->initTextProperties(m_Properties);
+ g_get_just(&justify);
+ m_Properties->setIntProperty(GLEDOPropertyJustify, justify);
+}
+
+void GLETextDO::render(GLEInterface* iface) {
+ iface->renderText(this, getProperties());
+}
+
+GLEObjectDO::GLEObjectDO(GLEObjectDOConstructor* cons) {
+ m_Cons = cons;
+ setRefPointString(GLEString::getEmptyString());
+}
+
+GLEObjectDO::~GLEObjectDO() {
+}
+
+GLEDrawObjectType GLEObjectDO::getType() {
+ return GDOObject;
+}
+
+const char* GLEObjectDO::getPostScriptCode() {
+ return m_PostScript.c_str();
+}
+
+void GLEObjectDO::makePropertyStore() {
+ if (m_Properties == NULL) {
+ m_Properties = new GLEPropertyStore(m_Cons);
+ }
+}
+
+void GLEObjectDO::getPSBoundingBox(GLERectangle* box) {
+ box->copy(m_ObjRep->getRectangle());
+ // Convert from points to cm
+ box->translate(-1.0, -1.0);
+ box->scale(CM_PER_INCH/PS_POINTS_PER_INCH);
+}
+
+bool GLEObjectDO::needsAMove(GLEPoint& pt) {
+ pt.set(m_Position);
+ return true;
+}
+
+void GLEObjectDO::createGLECode(string& code) {
+ ostringstream str;
+ GLESub* sub = getConstructor()->getSubroutine();
+ string subname = sub->getName();
+ gle_strlwr(subname);
+ if (m_RefPoint.isNull()) {
+ str << "draw " << subname;
+ } else {
+ str << "draw " << subname << "." << *m_RefPoint.get();
+ }
+ GLEArrayImpl* args = getProperties()->getArray();
+ for (int i = 0; i < sub->getNbParam(); i++) {
+ str << " ";
+ gle_memory_cell_print(args->get(i), str);
+ }
+ code = str.str();
+}
+
+void GLEObjectDO::updateBoundingBox() {
+ g_move(getPosition());
+}
+
+void GLEObjectDO::applyTransformation(bool dir) {
+ applyTransformationPt(&m_Position, dir);
+}
+
+GLEDrawObject* GLEObjectDO::clone() {
+ GLEObjectDO* res = new GLEObjectDO(m_Cons);
+ res->setPosition(m_Position);
+ res->setRefPointString(m_RefPoint.get());
+ return res;
+}
+
+bool GLEObjectDO::approx(GLEDrawObject* other) {
+ GLEObjectDO* otherc = (GLEObjectDO*)other;
+ if (!otherc->getRefPointString()->equals(getRefPointString())) return false;
+ GLEArrayImpl* my_args = getProperties()->getArray();
+ GLEArrayImpl* other_args = otherc->getProperties()->getArray();
+ GLESub* sub = getConstructor()->getSubroutine();
+ for (int i = 0; i < sub->getNbParam(); i++) {
+ GLEMemoryCell* a1 = my_args->get(i);
+ GLEMemoryCell* a2 = other_args->get(i);
+ if (!gle_memory_cell_equals(a1, a2)) return false;
+ }
+ return getPosition().approx(otherc->getPosition());
+}
+
+void GLEObjectDO::initProperties(GLEInterface* iface) {
+ makePropertyStore();
+ GLEInitLineProperties(m_Properties);
+ GLEInitShapeFillColor(m_Properties);
+ iface->initTextProperties(m_Properties);
+}
+
+void GLEObjectDO::render() {
+ GLEObjectRepresention* newobj = new GLEObjectRepresention();
+ setObjectRepresentation(newobj);
+ GLESub* sub = m_Cons->getSubroutine();
+ GLEScript* script = sub->getScript();
+ if (script == NULL && sub->getStart() == -1) {
+ // Subroutine does not have script attached properly
+ newobj->getRectangle()->setXMin(-1.0);
+ return;
+ }
+ GLEInterface* iface = script->getGLEInterface();
+ GLESaveRestore saved_state;
+ try {
+ g_select_device(GLE_DEVICE_EPS);
+ PSGLEDevice* dev = (PSGLEDevice*)g_get_device_ptr();
+ dev->startRecording();
+ saved_state.save();
+ g_clear();
+ g_resetfont();
+ g_scale(PS_POINTS_PER_INCH/CM_PER_INCH, PS_POINTS_PER_INCH/CM_PER_INCH);
+ g_translate(1.0*CM_PER_INCH/72, 1.0*CM_PER_INCH/72);
+ dev->startRecording();
+ GLEPropertyStore* prop = getProperties();
+ // Select the right color
+ GLEColor* color = prop->getColorProperty(GLEDOPropertyColor);
+ g_set_color(color);
+ GLEColor* fill = prop->getColorProperty(GLEDOPropertyFillColor);
+ g_set_fill(fill);
+ // Select the right size
+ double hei = prop->getRealProperty(GLEDOPropertyFontSize);
+ if (hei == 0.0) g_set_hei(0.3633);
+ else g_set_hei(hei);
+ g_set_font_width(-1);
+ g_set_line_style("1");
+ g_set_line_width(prop->getRealProperty(GLEDOPropertyLineWidth));
+ // Select the font
+ GLEFont* font = prop->getFontProperty(GLEDOPropertyFont);
+ if (font == NULL) {
+ font = iface->getFont("rm");
+ }
+ g_set_font(font->getIndex());
+ newobj->enableChildObjects();
+ GLERun* run = script->getRun();
+ run->setDeviceIsOpen(true);
+ run->setCRObjectRep(newobj);
+ /* draw to measure */
+ GLEMeasureBox measure;
+ measure.measureStart();
+ g_move(0.0, 0.0);
+ int cp = 0;
+ GLEPcodeList pc_list;
+ GLEPcode pcode(&pc_list);
+ pcode.addInt(PCODE_EXPR); /* Expression follows */
+ int savelen = pcode.size(); /* Used to set acutal length at end */
+ pcode.addInt(0); /* Length of expression */
+ GLEPolish* polish = script->getPolish();
+ if (polish != NULL) {
+ string argi;
+ GLEArrayImpl* arr = prop->getArray();
+ for (int i = 0; i < sub->getNbParam(); i++) {
+ int rtype = sub->getParamTypes()[i];
+ if (arr->getType(i) == GLEObjectTypeDouble) {
+ pcode.addDoubleExpression(arr->getDouble(i));
+ } else {
+ GLEString* args = (GLEString*)arr->getObject(i);
+ args->toUTF8(argi);
+ polish->polish(argi.c_str(), pcode, &rtype);
+ }
+ }
+ }
+ pcode.addFunction(sub->getIndex() + LOCAL_START_INDEX);
+ pcode.setInt(savelen, pcode.size() - savelen - 1);
+ GLERC<GLEArrayImpl> stk(new GLEArrayImpl());
+ evalGeneric(stk.get(), &pc_list, (int*)&pcode[0], &cp);
+ // g_flush() required to make sure that all line segments are output
+ g_flush();
+ measure.measureEnd();
+ newobj->getRectangle()->copy(&measure);
+ // cout << "Rectangle: " << *newobj->getRectangle() << endl;
+ g_dev(newobj->getRectangle());
+ // cout << "Dev. Rectangle: " << *newobj->getRectangle() << endl;
+ run->setCRObjectRep(NULL);
+ // Return the resulting PostScript code
+ dev->getRecordedBytes(getPostScriptPtr());
+ saved_state.restore();
+ } catch (ParserError& err) {
+ newobj->getRectangle()->setXMin(-1.0);
+ output_error(err);
+ }
+}
+
+void GLEObjectDO::computeReferencePoint(GLEPoint* pt) {
+ if (m_RefPoint.isNull()) return;
+ try {
+ GLEJustify just;
+ GLEObjectRepresention* myobj = getObjectRepresentation();
+ GLERC<GLEArrayImpl> path(m_RefPoint->split('.'));
+ GLEObjectRepresention* obj = GLERun::name_to_object(myobj, path.get(), &just, 0);
+ if (obj != NULL) {
+ GLERectangle rect;
+ rect.copy(obj->getRectangle());
+ rect.translate(1.0-myobj->getRectangle()->getXMin(), 1.0-myobj->getRectangle()->getYMin());
+ g_undev(&rect);
+ rect.toPoint(just, pt);
+ } else {
+ pt->setXY(0, 0);
+ }
+ } catch (ParserError& err) {
+ output_error(err);
+ }
+}
+
+GLEComposedObject::GLEComposedObject() {
+}
+
+GLEComposedObject::~GLEComposedObject() {
+}
+
+void GLEComposedObject::clear() {
+ m_Objs.clear();
+}
+
+void GLEComposedObject::removeDeletedObjects() {
+ int nbDeleted = 0;
+ int nbTotal = getNumberObjects();
+ for (int i = 0; i < nbTotal; i++) {
+ GLEDrawObject* obj = getObject(i);
+ if (obj->hasFlag(GDO_FLAG_DELETED)) {
+ nbDeleted++;
+ }
+ if (i+nbDeleted < nbTotal) {
+ setObject(i, getObject(i+nbDeleted));
+ }
+ }
+ setNumberObjects(nbTotal - nbDeleted);
+}
+
+GLEFont::GLEFont() {
+ m_Bold = m_Italic = m_BoldItalic = NULL;
+ m_Index = m_Number = 0;
+ m_Parent = 0;
+}
+
+GLEFont::~GLEFont() {
+}
+
+GLEFontStyle GLEFont::checkStyle(GLEFont* child) {
+ if (m_Bold.get() == child) {
+ return GLEFontStyleBold;
+ } else if (m_Italic.get() == child) {
+ return GLEFontStyleItalic;
+ } else if (m_BoldItalic.get() == child) {
+ return GLEFontStyleBoldItalic;
+ } else {
+ return GLEFontStyleRoman;
+ }
+}
+
+GLEFont* GLEFont::getStyle(GLEFontStyle style) {
+ switch (style) {
+ case GLEFontStyleRoman:
+ return this;
+ case GLEFontStyleBold:
+ return m_Bold.get();
+ case GLEFontStyleItalic:
+ return m_Italic.get();
+ case GLEFontStyleBoldItalic:
+ return m_BoldItalic.get();
+ default:
+ return NULL;
+ }
+}
+
+void GLEFont::setStyle(GLEFontStyle style, GLEFont* font) {
+ switch (style) {
+ case GLEFontStyleBold:
+ m_Bold = font;
+ break;
+ case GLEFontStyleItalic:
+ m_Italic = font;
+ break;
+ case GLEFontStyleBoldItalic:
+ m_BoldItalic = font;
+ break;
+ default:
+ break;
+ }
+}
+
+GLEFillBase::GLEFillBase() {
+}
+
+GLEFillBase::~GLEFillBase() {
+}
+
+GLEPatternFill::GLEPatternFill(int fillDescr) :
+ m_fillDescription(fillDescr),
+ m_background(new GLEColor())
+{
+ m_background->setHexValueGLE(GLE_COLOR_WHITE);
+}
+
+GLEPatternFill::~GLEPatternFill() {
+}
+
+GLEFillType GLEPatternFill::getFillType() {
+ return GLE_FILL_TYPE_PATTERN;
+}
+
+GLEFillBase* GLEPatternFill::clone() {
+ GLEPatternFill* result = new GLEPatternFill(m_fillDescription);
+ result->setBackground(m_background->clone());
+ return result;
+}
+
+GLEColor::GLEColor() :
+ m_Name(0)
+{
+ setGray(0);
+}
+
+GLEColor::GLEColor(double r, double g, double b) :
+ m_Name(0)
+{
+ setRGB(r, g, b);
+}
+
+GLEColor::GLEColor(double r, double g, double b, double a) :
+ m_Name(0)
+{
+ setRGBA(r, g, b, a);
+}
+
+GLEColor::GLEColor(double gray) :
+ m_Name(0)
+{
+ setGray(gray);
+}
+
+GLEColor::~GLEColor() {
+ if (m_Name != NULL) delete m_Name;
+}
+
+GLEColor* GLEColor::clone() {
+ GLEColor* result = new GLEColor(m_Red, m_Green, m_Blue, m_Alpha);
+ result->setTransparent(isTransparent());
+ result->setName(m_Name);
+ if (isFill()) {
+ result->setFill(getFill()->clone());
+ }
+ return result;
+}
+
+int GLEColor::getType() const {
+ return GLEObjectTypeColor;
+}
+
+bool GLEColor::equalsApprox(GLEColor* other) {
+ return equals_rel_fine(m_Red, other->m_Red) &&
+ equals_rel_fine(m_Green, other->m_Green) &&
+ equals_rel_fine(m_Blue, other->m_Blue) &&
+ equals_rel_fine(m_Alpha, other->m_Alpha) &&
+ m_Transparent == other->m_Transparent;
+}
+
+bool GLEColor::equals(GLEDataObject* obj) const {
+ if (obj->getType() != GLEObjectTypeColor) return false;
+ GLEColor* other = (GLEColor*)obj;
+ return m_Red == other->m_Red &&
+ m_Green == other->m_Green &&
+ m_Blue == other->m_Blue &&
+ m_Alpha == other->m_Alpha &&
+ m_Transparent == other->m_Transparent;
+}
+
+void GLEColor::print(ostream& out) const {
+ if (isTransparent()) {
+ out << "clear";
+ } else {
+ bool found = false;
+ // FIXME: don't do this look-up here - do it some place else (in QGLE?)
+ // FIXME: AFTER4.2
+ GLEColorList* list = GLEGetColorList();
+ for (int i = 0; i < list->getNbColors(); i++) {
+ GLEColor* def = list->getColor(i);
+ if (equals(def)) {
+ string name = def->getName();
+ if (name != "") {
+ gle_strlwr(name);
+ out << name;
+ found = true;
+ }
+ }
+ }
+ if (!found) {
+ if (hasAlpha()) {
+ out << "rgba255(" << (int)getRedI() << "," << (int)getGreenI() << "," << (int)getBlueI() << "," << (int)getAlphaI() << ")";
+ } else {
+ out << "rgb255(" << (int)getRedI() << "," << (int)getGreenI() << "," << (int)getBlueI() << ")";
+ }
+ }
+ }
+}
+
+const char* GLEColor::getName() {
+ return m_Name != NULL ? m_Name->c_str() : "";
+}
+
+void GLEColor::setName(const string& name) {
+ delete m_Name;
+ m_Name = new string(name);
+}
+
+void GLEColor::setName(const string* name) {
+ delete m_Name;
+ if (name != 0) {
+ m_Name = new std::string(*name);
+ } else {
+ m_Name = 0;
+ }
+}
+
+void GLEColor::setRGB(double r, double g, double b) {
+ m_Red = r; m_Green = g; m_Blue = b;
+ m_Alpha = 1.0;
+ m_Transparent = false;
+}
+
+void GLEColor::setRGBA(double r, double g, double b, double a) {
+ m_Red = r; m_Green = g; m_Blue = b; m_Alpha = a;
+ m_Transparent = false;
+}
+
+void GLEColor::setRGB255(int r, int g, int b) {
+ setRGB(((double)r) / 255.0, ((double)g) / 255.0, ((double)b) / 255.0);
+}
+
+void GLEColor::setRGB255(double r, double g, double b) {
+ setRGB(r / 255.0, g / 255.0, b / 255.0);
+}
+
+void GLEColor::setRGBA255(double r, double g, double b, double a) {
+ setRGBA(r / 255.0, g / 255.0, b / 255.0, a / 255.0);
+}
+
+void GLEColor::setGray(double gray) {
+ setRGB(gray, gray, gray);
+}
+
+void GLEColor::setHexValue(unsigned int v) {
+ unsigned int red = (v >> 16) & 0xFF;
+ unsigned int green = (v >> 8) & 0xFF;
+ unsigned int blue = v & 0xFF;
+ setRGB(((double)red) / 255.0, ((double)green) / 255.0, ((double)blue) / 255.0);
+}
+
+void GLEColor::setDoubleEncoding(double v) {
+ union {
+ double d;
+ int l[2];
+ } both;
+ both.d = v;
+ setHexValueGLE(both.l[0]);
+ m_Alpha = double(both.l[1]) / 255.0;
+}
+
+double GLEColor::getDoubleEncoding() {
+ union {
+ double d;
+ int l[2];
+ } both;
+ both.l[0] = getHexValueGLE();
+ both.l[1] = getAlphaI();
+ return both.d;
+}
+
+void GLEColor::setHexValueGLE(unsigned int hexValue) {
+ if (hexValue == GLE_FILL_CLEAR) {
+ setGray(0);
+ m_Fill = 0;
+ setTransparent(true);
+ } else if ((hexValue & 0X02000000) != 0) {
+ setGray(0);
+ setFill(new GLEPatternFill(hexValue));
+ } else {
+ setHexValue(hexValue);
+ }
+}
+
+unsigned int GLEColor::getHexValueGLE() {
+ if (isTransparent()) {
+ return GLE_FILL_CLEAR;
+ } else if (isFill() && getFill()->getFillType() == GLE_FILL_TYPE_PATTERN) {
+ GLEPatternFill* myFill = static_cast<GLEPatternFill*>(getFill());
+ return myFill->getFillDescription();
+ } else {
+ unsigned int red = float_to_color_comp(m_Red);
+ unsigned int green = float_to_color_comp(m_Green);
+ unsigned int blue = float_to_color_comp(m_Blue);
+ return 0x01000000 | (red << 16) | (green << 8) | blue;
+ }
+}
+
+double GLEColor::getGray() {
+ return (getRed() * 3.0 + getGreen() * 2.0 + getBlue()) / 6.0;
+}
+
+GLEPropertyStore::GLEPropertyStore(GLEPropertyStoreModel* model) {
+ m_Model = model;
+ m_Values.ensure(model->getNumberOfProperties());
+}
+
+GLEPropertyStore::~GLEPropertyStore() {
+}
+
+GLEPropertyStore* GLEPropertyStore::clone() {
+ GLEPropertyStore* result = new GLEPropertyStore(getModel());
+ for (size_t i = 0; i < m_Values.size(); i++) {
+ result->setPropertyValue(i, m_Values.get(i));
+ }
+ return result;
+}
+
+void GLEPropertyStore::getPropertyAsString(GLEPropertyID id, string* result) {
+ int idx = m_Model->find(id);
+ GLEProperty* prop = m_Model->getProperty(idx);
+ prop->getPropertyAsString(result, m_Values.get(idx));
+}
+
+GLEPropertyStoreModel::GLEPropertyStoreModel() {
+ m_Hash = new IntIntHash();
+ m_CanScale = false;
+ m_NbExtra = 0;
+}
+
+GLEPropertyStoreModel::~GLEPropertyStoreModel() {
+ delete m_Hash;
+}
+
+int GLEPropertyStoreModel::find(GLEPropertyID id) {
+ return m_Hash->try_get(id);
+}
+
+void GLEPropertyStoreModel::add(GLEProperty* prop) {
+ int id = m_Properties.size();
+ m_Properties.push_back(prop);
+ prop->setIndex(id);
+ m_Hash->add_item(prop->getID(), id);
+}
+
+void GLEPropertyStoreModel::scale(GLEDrawObject* obj, double sx, double sy) {
+}
+
+GLEProperty::GLEProperty(const char* name, const char* cmdname, GLEPropertyType type, GLEPropertyID id) {
+ m_Name = name;
+ m_Type = type;
+ m_ID = id;
+ m_SetCmdName = cmdname;
+ m_Index = -1;
+}
+
+GLEProperty::GLEProperty(const char* name, GLEPropertyType type, GLEPropertyID id) {
+ m_Name = name;
+ m_Type = type;
+ m_ID = id;
+ m_SetCmdName = NULL;
+ m_Index = -1;
+}
+
+GLEProperty::~GLEProperty() {
+}
+
+void GLEProperty::getPropertyAsString(string* result, GLEMemoryCell* value) {
+ GLEColor* color = NULL;
+ GLEFont* font = NULL;
+ GLEString* gstr = NULL;
+ ostringstream str;
+ switch (m_Type) {
+ case GLEPropertyTypeInt:
+ str << value->Entry.IntVal;
+ break;
+ case GLEPropertyTypeBool:
+ if (value->Entry.BoolVal) str << "yes";
+ else str << "no";
+ break;
+ case GLEPropertyTypeReal:
+ str << value->Entry.DoubleVal;
+ break;
+ case GLEPropertyTypeString:
+ gstr = (GLEString*)value->Entry.ObjectVal;
+ str << *gstr;
+ break;
+ case GLEPropertyTypeColor:
+ color = (GLEColor*)value->Entry.ObjectVal;
+ color->print(str);
+ break;
+ case GLEPropertyTypeFont:
+ font = (GLEFont*)value->Entry.ObjectVal;
+ str << font->getName();
+ break;
+ }
+ *result = str.str();
+}
+
+void GLEProperty::createSetCommandGLECode(ostream& os, GLEMemoryCell* value) {
+ if (getSetCommandName() != NULL) {
+ string str;
+ getPropertyAsString(&str, value);
+ os << " " << getSetCommandName() << " " << str;
+ }
+}
+
+bool GLEProperty::isEqualToState(GLEPropertyStore* store) {
+ return true;
+}
+
+void GLEProperty::updateState(GLEPropertyStore* store) {
+}
+
+GLEPropertyNominal::GLEPropertyNominal(const char* name, GLEPropertyType type, GLEPropertyID id) : GLEProperty(name, type, id) {
+ m_Value2Name = new IntIntHash();
+ m_Name2Value = new StringIntHash();
+}
+
+GLEPropertyNominal::~GLEPropertyNominal() {
+ delete m_Value2Name;
+ delete m_Name2Value;
+}
+
+void GLEPropertyNominal::addValue(const char* name, int value) {
+ int pos = m_NomValues.size();
+ m_NomValues.push_back(name);
+ m_Value2Name->add_item(value, pos);
+ m_Name2Value->add_item(name, value);
+}
+
+void GLEPropertyNominal::getPropertyAsString(string* result, GLEMemoryCell* value) {
+ int pos = m_Value2Name->try_get(value->Entry.IntVal);
+ if (pos == -1) {
+ ostringstream res;
+ res << value->Entry.IntVal;
+ *result = res.str();
+ } else {
+ *result = m_NomValues[pos];
+ }
+}
+
+GLEPropertyLWidth::GLEPropertyLWidth(const char* name) : GLEProperty(name, "lwidth", GLEPropertyTypeReal, GLEDOPropertyLineWidth) {
+}
+
+GLEPropertyLWidth::~GLEPropertyLWidth() {
+}
+
+bool GLEPropertyLWidth::isEqualToState(GLEPropertyStore* store) {
+ double lwidth;
+ g_get_line_width(&lwidth);
+ return equals_rel_fine(lwidth, store->getRealProperty(this));
+}
+
+void GLEPropertyLWidth::updateState(GLEPropertyStore* store) {
+ g_set_line_width(store->getRealProperty(this));
+}
+
+GLEPropertyLStyle::GLEPropertyLStyle(const char* name) : GLEProperty(name, "lstyle", GLEPropertyTypeString, GLEDOPropertyLineStyle) {
+}
+
+GLEPropertyLStyle::~GLEPropertyLStyle() {
+}
+
+bool GLEPropertyLStyle::isEqualToState(GLEPropertyStore* store) {
+ char lstyle[15];
+ g_get_line_style(lstyle);
+ GLEString* str = store->getStringProperty(this);
+ return str->length() == 0 || str->equalsI(lstyle);
+}
+
+void GLEPropertyLStyle::updateState(GLEPropertyStore* store) {
+ char lstyle[15];
+ store->getStringProperty(this)->toUTF8(lstyle);
+ g_set_line_style(lstyle);
+}
+
+GLEPropertyColor::GLEPropertyColor(const char* name) : GLEProperty(name, "color", GLEPropertyTypeColor, GLEDOPropertyColor) {
+}
+
+GLEPropertyColor::~GLEPropertyColor() {
+}
+
+bool GLEPropertyColor::isEqualToState(GLEPropertyStore* store) {
+ GLERC<GLEColor> color(g_get_color());
+ GLEColor* gle_color = store->getColorProperty(this);
+ return color->equalsApprox(gle_color);
+}
+
+void GLEPropertyColor::updateState(GLEPropertyStore* store) {
+ g_set_color(store->getColorProperty(this));
+}
+
+GLEPropertyFillColor::GLEPropertyFillColor(const char* name) : GLEProperty(name, "fill", GLEPropertyTypeColor, GLEDOPropertyFillColor) {
+}
+
+GLEPropertyFillColor::~GLEPropertyFillColor() {
+}
+
+bool GLEPropertyFillColor::isEqualToState(GLEPropertyStore* store) {
+ GLERC<GLEColor> curr_fill(g_get_fill());
+ return curr_fill->equalsApprox(store->getColorProperty(this));
+}
+
+void GLEPropertyFillColor::updateState(GLEPropertyStore* store) {
+ g_set_fill(store->getColorProperty(this));
+}
+
+GLEPropertyHei::GLEPropertyHei(const char* name) : GLEProperty(name, "hei", GLEPropertyTypeReal, GLEDOPropertyFontSize) {
+}
+
+GLEPropertyHei::~GLEPropertyHei() {
+}
+
+bool GLEPropertyHei::isEqualToState(GLEPropertyStore* store) {
+ double fontsize;
+ g_get_hei(&fontsize);
+ return equals_rel_fine(fontsize, store->getRealProperty(this));
+}
+
+void GLEPropertyHei::updateState(GLEPropertyStore* store) {
+ g_set_hei(store->getRealProperty(this));
+}
+
+GLEPropertyFont::GLEPropertyFont(const char* name) : GLEProperty(name, "font", GLEPropertyTypeFont, GLEDOPropertyFont) {
+}
+
+GLEPropertyFont::~GLEPropertyFont() {
+}
+
+bool GLEPropertyFont::isEqualToState(GLEPropertyStore* store) {
+ int font;
+ g_get_font(&font);
+ GLEFont* gle_font = store->getFontProperty(this);
+ return font == gle_font->getIndex();
+}
+
+void GLEPropertyFont::updateState(GLEPropertyStore* store) {
+ g_set_font(store->getFontProperty(this)->getIndex());
+}
+
+GLEPropertyJustify::GLEPropertyJustify(const char* name) : GLEProperty(name, "just", GLEPropertyTypeInt, GLEDOPropertyJustify) {
+}
+
+GLEPropertyJustify::~GLEPropertyJustify() {
+}
+
+bool GLEPropertyJustify::isEqualToState(GLEPropertyStore* store) {
+ int just;
+ g_get_just(&just);
+ return just == store->getIntProperty(this);
+}
+
+void GLEPropertyJustify::updateState(GLEPropertyStore* store) {
+ g_set_just(store->getIntProperty(this));
+}
+
+void GLEPropertyJustify::getPropertyAsString(string* result, GLEMemoryCell* value) {
+ int ival = value->Entry.IntVal;
+ switch (ival) {
+ case GLEJustifyCC:
+ *result = "cc"; break;
+ case GLEJustifyTL:
+ *result = "tl"; break;
+ case GLEJustifyTC:
+ *result = "tc"; break;
+ case GLEJustifyTR:
+ *result = "tr"; break;
+ case GLEJustifyBL:
+ *result = "bl"; break;
+ case GLEJustifyBC:
+ *result = "bc"; break;
+ case GLEJustifyBR:
+ *result = "br"; break;
+ case GLEJustifyLC:
+ *result = "lc"; break;
+ case GLEJustifyRC:
+ *result = "rc"; break;
+ case GLEJustifyLeft:
+ *result = "left"; break;
+ case GLEJustifyCenter:
+ *result = "center"; break;
+ case GLEJustifyRight:
+ *result = "right"; break;
+ default:
+ *result = "?"; break;
+ }
+}
+
+GLEPropertyArrowSize::GLEPropertyArrowSize(const char* name) : GLEProperty(name, "arrowsize", GLEPropertyTypeReal, GLEDOPropertyArrowSize) {
+}
+
+GLEPropertyArrowSize::~GLEPropertyArrowSize() {
+}
+
+bool GLEPropertyArrowSize::isEqualToState(GLEPropertyStore* store) {
+ GLEArrowProps arrow;
+ g_arrowsize(&arrow);
+ return equals_rel_fine(arrow.size, store->getRealProperty(this));
+}
+
+void GLEPropertyArrowSize::updateState(GLEPropertyStore* store) {
+ g_set_arrow_size(store->getRealProperty(this));
+}
+
+GLEPropertyArrowAngle::GLEPropertyArrowAngle(const char* name) : GLEProperty(name, "arrowangle", GLEPropertyTypeReal, GLEDOPropertyArrowAngle) {
+}
+
+GLEPropertyArrowAngle::~GLEPropertyArrowAngle() {
+}
+
+bool GLEPropertyArrowAngle::isEqualToState(GLEPropertyStore* store) {
+ GLEArrowProps arrow;
+ g_arrowsize(&arrow);
+ return equals_rel_fine(arrow.angle, store->getRealProperty(this));
+}
+
+void GLEPropertyArrowAngle::updateState(GLEPropertyStore* store) {
+ g_set_arrow_angle(store->getRealProperty(this));
+}
+
+void GLEInitColorProperty(GLEPropertyStore* prop) {
+ prop->setColorProperty(GLEDOPropertyColor, g_get_color()->clone());
+}
+
+void GLEInitSimpleLineProperties(GLEPropertyStore* prop) {
+ // line width property
+ double lwidth;
+ g_get_line_width(&lwidth);
+ prop->setRealProperty(GLEDOPropertyLineWidth, lwidth);
+ // line style
+ char lstyle[15];
+ g_get_line_style(lstyle);
+ prop->setStringProperty(GLEDOPropertyLineStyle, new GLEString(lstyle));
+ GLEInitColorProperty(prop);
+}
+
+void GLEScaleSimpleLineProperties(double scale, bool dir, GLEPropertyStore* prop) {
+ if (prop != NULL && scale > 0) {
+ double wd = prop->getRealProperty(GLEDOPropertyLineWidth);
+ if (dir) {
+ wd *= scale;
+ } else {
+ wd /= scale;
+ }
+ prop->setRealProperty(GLEDOPropertyLineWidth, wd);
+ }
+}
+
+void GLEScaleArrowProperties(double scale, bool dir, GLEPropertyStore* prop) {
+ if (prop != NULL && scale > 0) {
+ double size = prop->getRealProperty(GLEDOPropertyArrowSize);
+ if (dir) {
+ size *= scale;
+ } else {
+ size /= scale;
+ }
+ prop->setRealProperty(GLEDOPropertyArrowSize, size);
+ }
+}
+
+void GLEInitLineProperties(GLEPropertyStore* prop) {
+ GLEInitSimpleLineProperties(prop);
+ // cap
+ int cap;
+ g_get_line_cap(&cap);
+ prop->setIntProperty(GLEDOPropertyLineCap, cap);
+}
+
+void GLESetDefaultArrowProperties(double lwd, GLEPropertyStore* prop) {
+ if (!g_is_dummy_device()) {
+ g_set_dummy_device();
+ }
+ g_set_line_width(lwd);
+ g_set_hei(0.3633);
+ GLEInitArrowProperties(prop);
+}
+
+void GLEInitArrowProperties(GLEPropertyStore* prop) {
+ GLEArrowProps arrow;
+ g_arrowsize(&arrow);
+ prop->setRealProperty(GLEDOPropertyArrowSize, arrow.size);
+ prop->setRealProperty(GLEDOPropertyArrowAngle, arrow.angle);
+ prop->setIntProperty(GLEDOPropertyArrowStyle, arrow.style);
+ prop->setIntProperty(GLEDOPropertyArrowTip, arrow.tip);
+}
+
+void GLEInitShapeFillColor(GLEPropertyStore* prop) {
+ GLERC<GLEColor> gcolor(g_get_fill());
+ prop->setColorProperty(GLEDOPropertyFillColor, gcolor->clone());
+}
diff --git a/src/gle/gle-interface/gle-base.h b/src/gle/gle-interface/gle-base.h
new file mode 100644
index 0000000..84755e6
--- /dev/null
+++ b/src/gle/gle-interface/gle-base.h
@@ -0,0 +1,178 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#ifndef __GLE_BASE__
+#define __GLE_BASE__
+
+// #include <iostream>
+
+// #include <stdlib.h>
+// #include <string.h>
+
+using namespace std;
+
+class GLERefCountObject {
+private:
+ int m_OwnerCount;
+public:
+ GLERefCountObject();
+ virtual ~GLERefCountObject();
+ inline int getOwnerCount() const { return m_OwnerCount; }
+ inline void use() { m_OwnerCount++; }
+ inline int release() { return (--m_OwnerCount) == 0; }
+ inline int unused() const { return m_OwnerCount == 0; }
+};
+
+template <class T> class GLERC {
+private:
+ T* m_Object;
+public:
+ GLERC() {
+ m_Object = NULL;
+ }
+ GLERC(T* obj) {
+ m_Object = obj;
+ if (m_Object != NULL) m_Object->use();
+ }
+ GLERC(const GLERC<T>& obj) {
+ m_Object = obj.m_Object;
+ if (m_Object != NULL) m_Object->use();
+ }
+ ~GLERC() {
+ if (m_Object != NULL && m_Object->release()) {
+ delete m_Object;
+ }
+ }
+ inline GLERC<T>& operator=(GLERC<T> src) {
+ set(src.m_Object);
+ return *this;
+ }
+ inline GLERC<T>& operator=(T *src) {
+ set(src);
+ return *this;
+ }
+ inline bool isNull() const { return m_Object == NULL; }
+ inline T& operator*() const { return *m_Object; }
+ inline T* operator->() const { return m_Object; }
+ inline T* get() const { return m_Object; }
+ void set(T* obj) {
+ if (obj != NULL) obj->use();
+ if (m_Object != NULL && m_Object->release()) {
+ delete m_Object;
+ }
+ m_Object = obj;
+ }
+ void clear() {
+ if (m_Object != NULL && m_Object->release()) {
+ delete m_Object;
+ }
+ m_Object = NULL;
+ }
+};
+
+inline void GLE_DEL_RC(GLERefCountObject* rc) {
+ if (rc == NULL) return;
+ rc->release();
+ if (rc->unused()) delete rc;
+}
+
+inline void GLE_DEL_RC_INTERN(GLERefCountObject* rc) {
+ if (rc->release()) {
+ delete rc;
+ }
+}
+
+inline GLERefCountObject* GLE_INIT_RC(GLERefCountObject* value) {
+ value->use();
+ return value;
+}
+
+inline GLERefCountObject* GLE_SET_RC(GLERefCountObject* rc, GLERefCountObject* value) {
+ value->use();
+ GLE_DEL_RC_INTERN(rc);
+ return value;
+}
+
+template <class T> class GLERCVector : public vector< GLERC<T> > {
+public:
+ inline void add(T* elem) { this->push_back(GLERC<T>(elem)); }
+ inline T* get(int i) { return (*this)[i].get(); }
+};
+
+template <class T> class GLEVectorAutoDelete : public vector<T*> {
+public:
+ GLEVectorAutoDelete() : vector<T*>() {
+ }
+ ~GLEVectorAutoDelete() {
+ this->deleteAll();
+ }
+ void clear() {
+ this->deleteAll();
+ vector<T*>::clear();
+ }
+ void deleteAll() {
+ for (typename vector<T*>::size_type i = 0; i < vector<T*>::size(); i++) {
+ T* elem = this->at(i);
+ if (elem != NULL) delete elem;
+ }
+ }
+};
+
+template <class T> class GLEAutoDelete {
+protected:
+ T* m_Object;
+public:
+ GLEAutoDelete() {
+ m_Object = NULL;
+ }
+ GLEAutoDelete(T* data) {
+ m_Object = data;
+ }
+ ~GLEAutoDelete() {
+ if (m_Object != NULL) delete m_Object;
+ }
+ inline GLEAutoDelete<T>& operator=(T* data) {
+ if (m_Object != NULL) delete m_Object;
+ m_Object = data;
+ return *this;
+ }
+ inline T* get() { return m_Object; }
+ inline T* operator->() const { return m_Object; }
+};
+
+#endif
diff --git a/src/gle/gle-interface/gle-const.h b/src/gle/gle-interface/gle-const.h
new file mode 100644
index 0000000..806a670
--- /dev/null
+++ b/src/gle/gle-interface/gle-const.h
@@ -0,0 +1,67 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#ifndef INCLUDE_GLECONST
+#define INCLUDE_GLECONST
+
+#define GLE_DEVICE_NONE -1
+#define GLE_DEVICE_EPS 0
+#define GLE_DEVICE_PS 1
+#define GLE_DEVICE_PDF 2
+#define GLE_DEVICE_SVG 3
+#define GLE_DEVICE_JPEG 4
+#define GLE_DEVICE_PNG 5
+#define GLE_DEVICE_X11 6
+#define GLE_DEVICE_EMF 7
+#define GLE_DEVICE_DUMMY 8
+#define GLE_DEVICE_CAIRO_PDF 9
+#define GLE_DEVICE_CAIRO_EPS 10
+#define GLE_DEVICE_CAIRO_PS 11
+#define GLE_DEVICE_CAIRO_SVG 12
+
+#define BITMAP_TYPE_USER 0
+#define BITMAP_TYPE_TIFF 1
+#define BITMAP_TYPE_GIF 2
+#define BITMAP_TYPE_PNG 3
+#define BITMAP_TYPE_JPEG 4
+#define BITMAP_TYPE_UNK 5
+
+#define CM_PER_INCH 2.54
+#define PS_POINTS_PER_INCH 72.0
+
+#endif
diff --git a/src/gle/gle-interface/gle-datatype.h b/src/gle/gle-interface/gle-datatype.h
new file mode 100644
index 0000000..ad96f4e
--- /dev/null
+++ b/src/gle/gle-interface/gle-datatype.h
@@ -0,0 +1,355 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#ifndef __GLE_DATATYPE__
+#define __GLE_DATATYPE__
+
+class GLEArrayImpl;
+class GLESub;
+class GLELocalVars;
+class gmodel;
+
+typedef enum {
+ GLEObjectTypeUnknown,
+ GLEObjectTypeBool,
+ GLEObjectTypeInt,
+ GLEObjectTypeDouble,
+ GLEObjectTypeString,
+ GLEObjectTypeArray,
+ GLEObjectTypeColor,
+ GLEObjectTypeDynamicSub,
+ GLEObjectTypeObjectRep,
+ GLEObjectTypePoint,
+ GLEObjectTypeClassDefinition,
+ GLEObjectTypeClassInstance
+} GLEObjectType;
+
+const char* gle_object_type_to_string(GLEObjectType type);
+
+class GLEDataObject : public GLERefCountObject {
+public:
+ GLEDataObject();
+ virtual ~GLEDataObject();
+ virtual int getType() const;
+ virtual bool equals(GLEDataObject* obj) const;
+ virtual void print(ostream& out) const;
+};
+
+typedef union {
+ bool BoolVal;
+ int IntVal;
+ double DoubleVal;
+ GLEDataObject *ObjectVal;
+} GLEMemoryCellEntry;
+
+typedef enum {
+ GLE_MC_UNKNOWN,
+ GLE_MC_BOOL,
+ GLE_MC_INT,
+ GLE_MC_DOUBLE,
+ GLE_MC_OBJECT
+} GLEMemoryCellType;
+
+typedef struct {
+ GLEMemoryCellType Type;
+ GLEMemoryCellEntry Entry;
+} GLEMemoryCell;
+
+#define GLE_MC_ISA(a,b) (a->Type == b)
+#define GLE_MC_INIT(a) a.Type = GLE_MC_UNKNOWN
+
+inline void GLE_MC_DEL_INTERN(GLEMemoryCell* a) {
+ if (a->Type == GLE_MC_OBJECT) {
+ GLE_DEL_RC_INTERN(a->Entry.ObjectVal);
+ }
+}
+
+inline void GLE_MC_SET_DOUBLE(GLEMemoryCell* a, double v) {
+ GLE_MC_DEL_INTERN(a);
+ a->Entry.DoubleVal = v;
+ a->Type = GLE_MC_DOUBLE;
+}
+
+inline void GLE_MC_SET_INT(GLEMemoryCell* a, int v) {
+ GLE_MC_DEL_INTERN(a);
+ a->Entry.IntVal = v;
+ a->Type = GLE_MC_INT;
+}
+
+inline void GLE_MC_SET_BOOL(GLEMemoryCell* a, bool v) {
+ GLE_MC_DEL_INTERN(a);
+ a->Entry.BoolVal = v;
+ a->Type = GLE_MC_BOOL;
+}
+
+inline void GLE_MC_SET_UNKNOWN(GLEMemoryCell* a) {
+ GLE_MC_DEL_INTERN(a);
+ a->Type = GLE_MC_UNKNOWN;
+}
+
+inline void GLE_MC_SET_OBJECT(GLEMemoryCell* a, GLEDataObject* v) {
+ if (a->Type == GLE_MC_OBJECT) {
+ a->Entry.ObjectVal = (GLEDataObject*)GLE_SET_RC(a->Entry.ObjectVal, v);
+ } else {
+ a->Entry.ObjectVal = (GLEDataObject*)GLE_INIT_RC(v);
+ }
+ a->Type = GLE_MC_OBJECT;
+}
+
+inline void GLE_MC_COPY(GLEMemoryCell* a, GLEMemoryCell* b) {
+ if (b->Type == GLE_MC_OBJECT) {
+ GLE_MC_SET_OBJECT(a, b->Entry.ObjectVal);
+ } else {
+ GLE_MC_DEL_INTERN(a);
+ a->Entry = b->Entry;
+ a->Type = b->Type;
+ }
+}
+
+bool gle_memory_cell_equals(GLEMemoryCell* a, GLEMemoryCell* b);
+void gle_memory_cell_print(GLEMemoryCell* a, ostream& out);
+bool gle_memory_cell_to_double(GLEMemoryCell* a, double* result);
+void gle_memory_cell_check(GLEMemoryCell* a, int expected);
+int gle_memory_cell_type(GLEMemoryCell* a);
+
+unsigned int getUTF8NumberOfChars(const char* str, unsigned int len);
+
+class DLLCLASS GLEPointDataObject : public GLEDataObject {
+protected:
+ GLEPoint m_point;
+public:
+ GLEPointDataObject(double x, double y);
+ virtual ~GLEPointDataObject();
+ virtual int getType() const;
+ virtual bool equals(GLEDataObject* obj) const;
+ virtual void print(ostream& out) const;
+};
+
+class DLLCLASS GLEString : public GLEDataObject {
+protected:
+ unsigned int* m_Data;
+ unsigned int m_Length;
+ unsigned int m_Alloc;
+ unsigned int m_Intern;
+public:
+ GLEString();
+ GLEString(const char* utf8);
+ GLEString(const string& utf8);
+ virtual ~GLEString();
+ inline unsigned int length() const { return m_Length; }
+ inline unsigned int get(unsigned int i) const { return m_Data[i]; }
+ inline void set(unsigned int i, unsigned int v) { m_Data[i] = v; }
+ unsigned int getI(unsigned int i) const;
+ bool isSmallerThanI(const GLEString* s2) const;
+ bool equalsI(const char* str);
+ bool equalsI(GLEString* other);
+ bool containsI(unsigned int ch);
+ int strICmp(GLEString* other) const;
+ virtual bool equals(GLEDataObject* obj) const;
+ virtual void print(ostream& out) const;
+ void fromUTF8(const char* str);
+ void fromUTF8(const string& str);
+ void fromUTF8(const char* str, unsigned int len);
+ ostream& toUTF8(ostream& out) const;
+ void toUTF8(string& out) const;
+ void toUTF8(char* out) const;
+ string toUTF8() const;
+ GLEString* concat(GLEString* other) const;
+ GLEString* substringWithLength(unsigned int from, unsigned int size) const;
+ GLEString* substring(unsigned int from, unsigned int to) const;
+ int find(GLEString* needle, unsigned int from);
+ GLEArrayImpl* split(char bych) const;
+ void addQuotes();
+ void join(char bych, GLEArrayImpl* arr, int from = 0, int to = -1);
+ void resize(unsigned int size);
+ unsigned int toStringIndex(int value);
+ void DLLFCT setSize(unsigned int size);
+ virtual int getType() const;
+ static GLEString* getEmptyString();
+};
+
+inline ostream& operator<<(ostream& os, const GLEString& pos) {
+ return pos.toUTF8(os);
+}
+
+typedef GLERC<GLEString> GLEStringKey;
+
+struct GLEStringCompare {
+ bool operator()(const GLEStringKey& s1, const GLEStringKey& s2) const {
+ return s1->isSmallerThanI(s2.get());
+ }
+};
+
+class GLEArray : public GLEDataObject {
+public:
+ GLEArray();
+ virtual ~GLEArray();
+};
+
+class DLLCLASS GLEArrayImpl : public GLEArray {
+protected:
+ GLEMemoryCell* m_Data;
+ unsigned int m_Length;
+ unsigned int m_Alloc;
+public:
+ GLEArrayImpl();
+ virtual ~GLEArrayImpl();
+ void clear();
+ void set(unsigned int i, const GLEMemoryCell* cell);
+ inline GLEMemoryCell* get(unsigned int i) const { return &m_Data[i]; }
+ inline GLEDataObject* getObjectUnsafe(unsigned int i) { return m_Data[i].Entry.ObjectVal; }
+ inline unsigned int size() const { return m_Length; }
+ inline unsigned int last() const { return m_Length - 1; }
+ inline void decrementSize(int diff) { m_Length -= diff; }
+ inline void incrementSize(int diff) { m_Length += diff; }
+ void init(unsigned int i);
+ int getType(unsigned int i) const;
+ void checkType(unsigned int i, int expected);
+ double DLLFCT getDouble(unsigned int i);
+ void DLLFCT setDouble(unsigned int i, double v);
+ int DLLFCT getInt(unsigned int i);
+ void DLLFCT setInt(unsigned int i, int v);
+ bool DLLFCT getBool(unsigned int i);
+ void DLLFCT setBool(unsigned int i, bool v);
+ void DLLFCT setUnknown(unsigned int i);
+ bool DLLFCT isUnknown(unsigned int i);
+ void DLLFCT setObject(unsigned int i, GLEDataObject* v);
+ DLLFCT GLEDataObject* getObject(unsigned int i);
+ DLLFCT GLERC<GLEString> getString(unsigned int i);
+ void addObject(GLEDataObject* v);
+ void addInt(int v);
+ void ensure(unsigned int size);
+ void resize(unsigned int size);
+ void extend(unsigned int size);
+ void enumStrings(ostream& out);
+ virtual int getType() const;
+private:
+ void resizeMemory(unsigned int size);
+};
+
+GLERC<GLEArrayImpl> doublesToArray(double* args, int nb);
+
+class DLLCLASS GLEArrayWithFreeList : public GLEArrayImpl {
+
+};
+
+typedef map<GLEStringKey, unsigned int, GLEStringCompare> GLEStringHashData;
+
+class GLEStringHash : public GLEArrayImpl {
+protected:
+ GLEStringHashData m_Map;
+ // FIXME: add freelist
+public:
+ GLEStringHash();
+ virtual ~GLEStringHash();
+ void setObjectByKey(const GLEStringKey& key, GLEDataObject* v);
+ GLEDataObject* getObjectByKey(const GLEStringKey& key);
+ void getKeys(GLEArrayImpl* keys);
+ inline GLEStringHashData* getHash() { return &m_Map; }
+};
+
+class GLEDynamicSub : public GLEDataObject {
+protected:
+ GLESub* m_Sub;
+ GLELocalVars* m_VarValues; // FIXME: replace by GLEArrayImpl
+ // to store values of local variables
+ gmodel* m_State;
+public:
+ GLEDynamicSub();
+ GLEDynamicSub(GLESub* sub);
+ virtual ~GLEDynamicSub();
+ virtual int getType() const;
+ inline GLESub* getSub() { return m_Sub; }
+ inline void setSub(GLESub* sub) { m_Sub = sub; }
+ inline GLELocalVars* getLocalVars() { return m_VarValues; }
+ inline void setLocalVars(GLELocalVars* vars) { m_VarValues = vars; }
+ inline void setState(gmodel* state) { m_State = state; }
+ inline gmodel* getState() { return m_State; }
+};
+
+class GLEObjectRepresention : public GLEDataObject {
+protected:
+ GLERectangle m_Rect;
+ GLERC<GLEStringHash> m_SubObjs;
+ GLERC<GLEDynamicSub> m_DynSub;
+public:
+ GLEObjectRepresention();
+ virtual ~GLEObjectRepresention();
+ inline GLERectangle* getRectangle() { return &m_Rect; }
+ GLEObjectRepresention* getChildObject(GLEString* elem);
+ bool setChildObject(GLEString* elem, GLEObjectRepresention* obj);
+ void enableChildObjects();
+ void translateChildrenRecursive(GLEPoint* trans);
+ void copyChildrenRecursive(GLEObjectRepresention* newobj, gmodel* oldstate);
+ void printNames();
+ virtual int getType() const;
+ inline bool isChildObjectsEnabled() { return !m_SubObjs.isNull(); }
+ inline GLEStringHash* getChilds() { return m_SubObjs.get(); }
+ inline bool hasSub() { return !m_DynSub.isNull(); }
+ inline GLEDynamicSub* getSub() { return m_DynSub.get(); }
+ inline void setSub(GLEDynamicSub* sub) { m_DynSub = sub; }
+};
+
+class GLEClassDefinition : public GLEDataObject {
+protected:
+ GLERC<GLEString> m_Name;
+ GLERC<GLEArrayImpl> m_FieldNames;
+public:
+ GLEClassDefinition(const char* name);
+ void addField(const char* fieldName);
+ virtual int getType() const;
+ virtual bool equals(GLEDataObject* obj) const;
+ virtual void print(ostream& out) const;
+};
+
+class GLEClassInstance : public GLEDataObject {
+protected:
+ GLERC<GLEClassDefinition> m_Definition;
+ GLEArrayImpl m_Data;
+public:
+ GLEClassInstance(GLEClassDefinition* definition);
+ virtual int getType() const;
+ virtual bool equals(GLEDataObject* obj) const;
+ virtual void print(ostream& out) const;
+ inline GLEClassDefinition* getDefinition() { return m_Definition.get(); }
+ inline GLEArrayImpl* getArray() { return &m_Data; }
+};
+
+GLEClassInstance* getGLEClassInstance(GLEMemoryCell* object, GLEClassDefinition* def);
+
+#endif
diff --git a/src/gle/gle-interface/gle-interface.h b/src/gle/gle-interface/gle-interface.h
new file mode 100644
index 0000000..180c980
--- /dev/null
+++ b/src/gle/gle-interface/gle-interface.h
@@ -0,0 +1,1324 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#ifndef __GLE_INTERFACE__
+#define __GLE_INTERFACE__
+
+#undef DLLEXPORT
+#undef DLLIMPORT
+
+#ifndef __WIN32__
+#ifdef Q_WS_WIN
+#define __WIN32__
+#endif
+#endif
+
+#ifdef Q_WS_WIN
+#define INCLUDE_GLE_DLL
+#endif
+
+#if defined(__WIN32__) && (defined(HAVE_LIBGLE) || defined(INCLUDE_GLE_DLL))
+ #define DLLEXPORT __declspec( dllexport )
+ #define DLLIMPORT __declspec( dllimport )
+ #define DLLCLASSEXPORT __attribute__ ((dllexport))
+ #define DLLCLASSIMPORT __attribute__ ((dllimport))
+#else
+ #define DLLEXPORT
+ #define DLLIMPORT
+ #define DLLCLASSEXPORT
+ #define DLLCLASSIMPORT
+#endif
+
+#ifdef INCLUDE_GLE_DLL
+#define DLLFCT DLLIMPORT
+#define DLLCLASS DLLCLASSIMPORT
+#else
+#define DLLFCT DLLEXPORT
+#define DLLCLASS DLLCLASSEXPORT
+#endif
+
+#include <string>
+#include <vector>
+
+using namespace std;
+
+#include "gle-base.h"
+#include "gle-const.h"
+
+// what do we do with these?
+#include "../tokens/RefCount.h"
+#include "../tokens/StringKeyHash.h"
+#include "../tokens/Tokenizer.h"
+
+#define GDO_FLAG_DELETED 1
+#define GDO_FLAG_MODIFIED 2
+
+typedef void (*gle_write_func)(void* closure, char* data, int length);
+
+class GLEInterface;
+class GLEScript;
+class GLEFont;
+class GLEColor;
+class GLEDrawObject;
+class GLETextDO;
+class GLEStringSettings;
+class GLEOutputStream;
+class GLEProperty;
+class GLEPropertyStore;
+class GLEPropertyStoreModel;
+class GLEGlobalConfig;
+class CmdLineObj;
+class StringIntHash;
+class IntIntHash;
+class GLEPoint;
+class GLESub;
+class GLERun;
+class GLEParser;
+class GLEPolish;
+class GLEPcodeIndexed;
+class GLERangeSet;
+
+unsigned char float_to_color_comp(double value);
+
+extern "C" {
+
+ // Note: (currently) GLEInterface is a singleton class there is at most one instance
+ DLLFCT GLEInterface* GLEGetInterfacePointer();
+
+ // GLEInterface* iface = GLEGetInterfacePointer();
+ // GLEGlobalConfig* conf = GLEGetInterfacePointer()->getConfig();
+
+ DLLEXPORT int GLEMain(int argc, char **argv);
+};
+
+enum GLEJustify {
+ GLEJustifyCC = 0x011, GLEJustifyTL = 0x002, GLEJustifyTC = 0x012,
+ GLEJustifyTR = 0x022, GLEJustifyBL = 0x000, GLEJustifyBC = 0x010,
+ GLEJustifyBR = 0x020, GLEJustifyLC = 0x001, GLEJustifyRC = 0x021,
+ GLEJustifyLeft = 0x100, GLEJustifyCenter = 0x110, GLEJustifyRight = 0x120,
+ GLEJustifyCirc = 0x1011, GLEJusitfyBox = 0x5011, GLEJustifyVert = 0x2000,
+ GLEJustifyHorz = 0x3000
+
+// add LH CH RH BV CV TV
+};
+
+class GLERange {
+protected:
+ double m_Min, m_Max;
+public:
+ GLERange();
+ ~GLERange();
+ void setMinMax(double min, double max);
+ void copy(GLERange* other);
+ void copyHas(GLERangeSet* other);
+ void initRange();
+ bool isMinValid() const;
+ bool isMaxValid() const;
+ void updateRange(double value);
+ void clip(double* value);
+ bool contains(double value);
+ ostream& printRange(ostream& out) const;
+ inline double getMin() { return m_Min; }
+ inline double getMax() { return m_Max; }
+ inline double getWidth() { return m_Max - m_Min; }
+ inline void setMin(double min) { m_Min = min; }
+ inline void setMax(double max) { m_Max = max; }
+ inline bool valid() { return m_Min <= m_Max; }
+ inline bool validNotEmpty() { return m_Min < m_Max; }
+ inline bool invalid() { return m_Min > m_Max; }
+ inline bool invalidOrEmpty() { return m_Min >= m_Max; }
+ inline void updateRange(double value, bool miss) { if (!miss) updateRange(value); }
+};
+
+inline ostream& operator<<(ostream& os, const GLERange& range) {
+ return range.printRange(os);
+}
+
+class GLERangeSet : public GLERange {
+protected:
+ bool m_MinSet, m_MaxSet;
+public:
+ GLERangeSet();
+ ~GLERangeSet();
+ void setMinSet(double min);
+ void setMaxSet(double max);
+ void setMinMaxSet(double min, double max);
+ void setMinIfNotSet(double min);
+ void setMaxIfNotSet(double max);
+ void resetSet();
+ void copySet(GLERangeSet* other);
+ void copyIfNotSet(GLERange* other);
+ void initRangeIfNotSet();
+ inline bool hasMin() { return m_MinSet; }
+ inline bool hasMax() { return m_MaxSet; }
+ inline bool hasBoth() { return m_MinSet && m_MaxSet; }
+ inline bool hasOne() { return m_MinSet || m_MaxSet; }
+};
+
+class DLLCLASS GLERectangle {
+protected:
+ double m_XMin, m_YMin, m_XMax, m_YMax;
+public:
+ GLERectangle();
+ GLERectangle(double xmin, double ymin, double xmax, double ymax);
+ GLERectangle(GLERectangle* other);
+ ~GLERectangle();
+ inline double getXMin() const { return m_XMin; }
+ inline double getXMax() const { return m_XMax; }
+ inline double getYMin() const { return m_YMin; }
+ inline double getYMax() const { return m_YMax; }
+ inline void setXMin(double v) { m_XMin = v; }
+ inline void setXMax(double v) { m_XMax = v; }
+ inline void setYMin(double v) { m_YMin = v; }
+ inline void setYMax(double v) { m_YMax = v; }
+ inline double getWidth() const { return m_XMax - m_XMin; }
+ inline double getHeight() const { return m_YMax - m_YMin; }
+ inline double getXMid() const { return (m_XMin+m_XMax)/2; }
+ inline double getYMid() const { return (m_YMin+m_YMax)/2; }
+ inline bool isValid() const { return m_XMin <= m_XMax; }
+ inline bool isPoint() const { return m_XMin == m_XMax && m_YMin == m_YMax; }
+ void reset();
+ void normalize();
+ void copy(GLERectangle* other);
+ void copy(GLEPoint* point);
+ void getDimensions(double* xmin, double* ymin, double* xmax, double* ymax);
+ void setDimensions(double xmin, double ymin, double xmax, double ymax);
+ void translate(double x, double y);
+ void translate(GLEPoint* p);
+ void scale(double s);
+ void subtractXFrom(double x);
+ void subtractYFrom(double y);
+ void grow(double d);
+ bool contains(double x, double y);
+ void initRange();
+ void updateRange(double x, double y);
+ void updateRange(GLEPoint* pt);
+ void addToRangeX(GLERange* range);
+ void addToRangeY(GLERange* range);
+ ostream& print(ostream& out) const;
+ void toPoint(GLEJustify just, GLEPoint* pt);
+};
+
+inline ostream& operator<<(ostream& os, const GLERectangle& rect) {
+ return rect.print(os);
+}
+
+class DLLCLASS GLEPoint {
+public:
+ double m_X, m_Y;
+public:
+ GLEPoint();
+ GLEPoint(double x, double y);
+ GLEPoint(const GLEPoint& p);
+ ~GLEPoint();
+ inline double getX() const { return m_X; }
+ inline double getY() const { return m_Y; }
+ inline void setXY(double x, double y) { m_X = x; m_Y = y; }
+ inline void setX(double x) { m_X = x; }
+ inline void setY(double y) { m_Y = y; }
+ inline void set(const GLEPoint& p) { m_X = p.m_X; m_Y = p.m_Y; }
+ inline void dotScalar(double s) { m_X *= s; m_Y *= s; }
+ inline void addScalar(const GLEPoint& p, double s) { m_X += s*p.m_X; m_Y += s*p.m_Y; }
+ inline void subtractFrom(const GLEPoint* p) { m_X = p->m_X - m_X; m_Y = p->m_Y - m_Y; }
+ inline void add(const GLEPoint& p) { m_X += p.m_X; m_Y += p.m_Y; }
+ inline void add(double x, double y) { m_X += x; m_Y += y; }
+ inline void invert() { m_X *= -1; m_Y *= -1; }
+ inline bool approx(const GLEPoint& p) { return approx(p.getX(), p.getY()); }
+ DLLFCT void add(double s, const GLEPoint& p);
+ DLLFCT double distance(const GLEPoint& p) const;
+ DLLFCT double norm() const;
+ DLLFCT double normSq() const;
+ DLLFCT void normalize();
+ DLLFCT bool approx(double x, double y);
+ DLLFCT void swap(GLEPoint& other);
+ DLLFCT ostream& write(ostream& os) const;
+};
+
+inline ostream& operator<<(ostream& os, const GLEPoint& pt) {
+ return pt.write(os);
+}
+
+#include "gle-shapemath.h"
+
+class DLLCLASS GLEPoint3D {
+public:
+ double m_C[3];
+public:
+ GLEPoint3D();
+ GLEPoint3D(double x, double y, double z);
+ GLEPoint3D(const GLEPoint3D& p);
+ inline double get(int i) const { return m_C[i]; }
+ inline void set(int i, double v) { m_C[i] = v; }
+ inline void set(double x, double y, double z) { m_C[0] = x; m_C[1] = y; m_C[2] = z; }
+ DLLFCT void dotScalar(double s);
+ DLLFCT void add(const GLEPoint3D& p);
+ DLLFCT void subtract(const GLEPoint3D& p);
+ DLLFCT void addScalar(double s1, double s2, const GLEPoint3D& p);
+ DLLFCT double norm() const;
+ DLLFCT void normalize();
+ void ortho3DUnit(const GLEPoint3D& p, GLEPoint3D* r);
+ DLLFCT ostream& write(ostream& os) const;
+};
+
+class DLLCLASS GLEMatrix {
+public:
+ double* m_C;
+ int m_Rows, m_Cols;
+public:
+ GLEMatrix(int rows, int cols);
+ GLEMatrix(const GLEMatrix& p);
+ ~GLEMatrix();
+ void dot(const GLEPoint3D& p, GLEPoint3D* r) const;
+ void setVertVector(int row, int col, const GLEPoint3D& p);
+ DLLFCT ostream& write(ostream& os) const;
+};
+
+class DLLCLASS GLEProjection {
+public:
+ GLEPoint3D m_Eye, m_Reference, m_VVector;
+public:
+ GLEProjection();
+ inline GLEPoint3D* getEye() { return &m_Eye; }
+ inline GLEPoint3D* getReference() { return &m_Reference; }
+ inline GLEPoint3D* getV() { return &m_VVector; }
+ void invToReference(GLEMatrix* mtrx);
+ DLLFCT void zoom(double factor);
+ DLLFCT void rotate(double angle, bool horiz);
+ DLLFCT void reference(const GLEPoint3D& ref);
+ DLLFCT void adjustV(double angle);
+};
+
+class DLLCLASS GLELinearEquation {
+protected:
+ double m_A, m_B;
+public:
+ GLELinearEquation();
+ ~GLELinearEquation();
+ void DLLFCT fit(double x0, double y0, double x1, double y1);
+ inline double intersect(GLELinearEquation* o) { return (o->m_B - m_B)/(m_A - o->m_A); }
+ inline void fitB(double x0, double y0) { m_B = y0 - m_A*x0; }
+ inline void setA(double a) { m_A = a; }
+ inline void setB(double b) { m_B = b; }
+ inline double apply(double x) const { return m_A*x + m_B; }
+ inline double getA() const { return m_A; }
+ inline double getB() const { return m_B; }
+};
+
+class DLLCLASS GLELineSegment {
+private:
+ GLEPoint m_p1;
+ GLEPoint m_p2;
+
+public:
+ GLELineSegment(const GLEPoint& p1, const GLEPoint& p2);
+ GLELineSegment(double x1, double y1, double x2, double y2);
+ const GLEPoint& getP1() const { return m_p1; }
+ const GLEPoint& getP2() const { return m_p2; }
+};
+
+#include "gle-datatype.h"
+
+enum GLEFontStyle {
+ GLEFontStyleRoman, GLEFontStyleBold, GLEFontStyleItalic, GLEFontStyleBoldItalic
+};
+
+class GLEFont : public GLEDataObject {
+protected:
+ string m_Name;
+ string m_FullName;
+ GLERC<GLEFont> m_Bold;
+ GLERC<GLEFont> m_Italic;
+ GLERC<GLEFont> m_BoldItalic;
+ GLEFont* m_Parent;
+ int m_Index;
+ int m_Number;
+public:
+ GLEFont();
+ ~GLEFont();
+ // Return the name of the font
+ inline const string& getName() { return m_Name; }
+ inline const string& getFullName() { return m_FullName; }
+ inline const char* getNameC() { return m_Name.c_str(); }
+ inline const char* getFullNameC() { return m_FullName.c_str(); }
+ inline void setName(const string& name) { m_Name = name; }
+ inline void setFullName(const string& name) { m_FullName = name; }
+ inline bool hasStyle(GLEFontStyle style) { return getStyle(style) != NULL; }
+ DLLFCT GLEFontStyle checkStyle(GLEFont* child);
+ DLLFCT GLEFont* getStyle(GLEFontStyle style);
+ void setStyle(GLEFontStyle style, GLEFont* font);
+ inline int getIndex() { return m_Index; }
+ inline void setIndex(int value) { m_Index = value; }
+ inline int getNumber() { return m_Number; }
+ inline void setNumber(int value) { m_Number = value; }
+ inline GLEFont* getBaseFont() { return m_Parent != 0 ? m_Parent : this; }
+ inline void setParent(GLEFont* parent) { m_Parent = parent; }
+};
+
+enum GLEFillType {
+ GLE_FILL_TYPE_PATTERN
+};
+
+class GLEFillBase : public GLERefCountObject {
+public:
+ GLEFillBase();
+ virtual ~GLEFillBase();
+ virtual GLEFillType getFillType() = 0;
+ virtual GLEFillBase* clone() = 0;
+};
+
+class GLEPatternFill : public GLEFillBase {
+public:
+ GLEPatternFill(int fillDescr);
+ virtual ~GLEPatternFill();
+ virtual GLEFillType getFillType();
+ virtual GLEFillBase* clone();
+
+ inline void setFillDescription(int fillDescription) { m_fillDescription = fillDescription; }
+ inline int getFillDescription() const { return m_fillDescription; }
+ inline void setBackground(GLEColor* color) { m_background = color; }
+ inline GLEColor* getBackground() const { return m_background.get(); }
+
+private:
+ int m_fillDescription;
+ GLERC<GLEColor> m_background;
+};
+
+class DLLCLASS GLEColor : public GLEDataObject {
+protected:
+ bool m_Transparent;
+ double m_Red, m_Green, m_Blue, m_Alpha;
+ string* m_Name;
+ GLERC<GLEFillBase> m_Fill;
+public:
+ GLEColor();
+ GLEColor(double r, double g, double b);
+ GLEColor(double r, double g, double b, double a);
+ explicit GLEColor(double gray);
+ ~GLEColor();
+ virtual int getType() const;
+ virtual bool equals(GLEDataObject* obj) const;
+ virtual void print(ostream& out) const;
+ bool equalsApprox(GLEColor* other);
+ DLLFCT void setRGB(double r, double g, double b);
+ DLLFCT void setRGBA(double r, double g, double b, double a);
+ DLLFCT void setRGB255(int r, int g, int b);
+ DLLFCT void setRGB255(double r, double g, double b);
+ void setRGBA255(double r, double g, double b, double a);
+ void setGray(double gray);
+ DLLFCT const char* getName();
+ void setName(const string& name);
+ void setName(const string* name);
+ void setHexValue(unsigned int v);
+ void setDoubleEncoding(double v);
+ double getDoubleEncoding();
+ void setHexValueGLE(unsigned int hexValue);
+ unsigned int getHexValueGLE();
+ double getGray();
+ GLEColor* clone();
+ inline double getRed() const { return m_Red; }
+ inline double getGreen() const { return m_Green; }
+ inline double getBlue() const { return m_Blue; }
+ inline double getAlpha() const { return m_Alpha; }
+ inline bool hasAlpha() const { return float_to_color_comp(m_Alpha) != 255; }
+ inline unsigned char getRedI() const { return float_to_color_comp(m_Red); }
+ inline unsigned char getGreenI() const { return float_to_color_comp(m_Green); }
+ inline unsigned char getBlueI() const { return float_to_color_comp(m_Blue); }
+ inline unsigned char getAlphaI() const { return float_to_color_comp(m_Alpha); }
+ inline void setRed(double v) { m_Red = v; }
+ inline void setGreen(double v) { m_Green = v; }
+ inline void setBlue(double v) { m_Blue = v; }
+ inline bool isTransparent() const { return m_Transparent; }
+ inline void setTransparent(bool transp) { m_Transparent = transp; }
+ inline bool isFill() const { return !m_Fill.isNull(); }
+ inline GLEFillBase* getFill() { return m_Fill.get(); }
+ inline void setFill(GLEFillBase* fill) { m_Fill = fill; }
+ inline std::string* getNameS() { return m_Name; }
+};
+
+GLERC<GLEColor> color_or_fill_from_int(int hexValue);
+void update_color_foreground(GLEColor* updateMe, GLEColor* color);
+void update_color_foreground_and_pattern(GLEColor* updateMe, GLEColor* color);
+void update_color_fill_pattern(GLEColor* updateMe, GLEPatternFill* fill);
+void update_color_fill_background(GLEColor* updateMe, GLEColor* color);
+GLERC<GLEColor> get_fill_background(GLEColor* fill);
+GLERC<GLEColor> get_fill_foreground(GLEColor* fill);
+
+// Each drawable object has a reference to a property store
+// To, e.g., get the line width of a given object, call:
+//
+// double lwidth = obj->getProperties()->getRealProperty(GDOPLineWidth);
+//
+// It is also possible to enumerate all properties of an object:
+//
+// GLEPropertyStoreModel* model = obj->getProperties()->getModel();
+// for (int i = 0; i < model->getNumberOfProperties(); i++) {
+// GLEProperty* prop = model->getProperty(i);
+// // do something with prop, e.g., get name, type, ...
+// }
+//
+// All objects of the same type share the same model
+//
+// Should two objects with the same properties share the same GLEPropertyStore object?
+// (For efficiency reasons?) Then we have to decide how to set property values.
+//
+// Or should there be a kind of invisible "set property object"
+// Similar to the "set" command in GLE scripts ?
+
+enum GLEPropertyType {
+ GLEPropertyTypeInt, GLEPropertyTypeBool, GLEPropertyTypeReal, GLEPropertyTypeString, GLEPropertyTypeColor, GLEPropertyTypeFont
+};
+
+enum GLEPropertyID {
+ GLEDOPropertyColor, GLEDOPropertyFillColor, GLEDOPropertyJustify,
+ GLEDOPropertyLineWidth, GLEDOPropertyLineStyle, GLEDOPropertyLineCap,
+ GLEDOPropertyFont, GLEDOPropertyFontSize, GLEDOPropertyArrowSize,
+ GLEDOPropertyArrowAngle, GLEDOPropertyArrowStyle, GLEDOPropertyArrowTip,
+ GLEDOPropertyUserArg
+};
+
+enum GLELineCap {
+ GLELineCapButt = 0,
+ GLELineCapRound = 1,
+ GLELineCapSquare = 2
+};
+
+enum GLEArrowStyle {
+ GLEArrowStyleSimple = 0,
+ GLEArrowStyleFilled = 1,
+ GLEArrowStyleEmpty = 2,
+ GLEArrowStyleSub = 10
+};
+
+enum GLEArrowTip {
+ GLEArrowTipRound = 0,
+ GLEArrowTipSharp = 1
+};
+
+class GLEProperty {
+private:
+ string m_Name;
+ const char* m_SetCmdName;
+ GLEPropertyType m_Type;
+ GLEPropertyID m_ID;
+ int m_Index;
+public:
+ GLEProperty(const char* name, GLEPropertyType type, GLEPropertyID id);
+ GLEProperty(const char* name, const char* cmdname, GLEPropertyType type, GLEPropertyID id);
+ virtual ~GLEProperty();
+ inline GLEPropertyType getType() { return m_Type; }
+ inline GLEPropertyID getID() { return m_ID; }
+ inline const string& getName() { return m_Name; }
+ inline const char* getNameC() { return m_Name.c_str(); }
+ inline void setSetCommandName(const char* cmdname) { m_SetCmdName = cmdname; }
+ inline const char* getSetCommandName() { return m_SetCmdName; }
+ inline void setIndex(int idx) { m_Index = idx; }
+ inline int getIndex() { return m_Index; }
+ virtual void getPropertyAsString(string* result, GLEMemoryCell* value);
+ virtual void createSetCommandGLECode(ostream& os, GLEMemoryCell* value);
+ virtual bool isEqualToState(GLEPropertyStore* store);
+ virtual void updateState(GLEPropertyStore* store);
+};
+
+class GLEPropertyNominal : public GLEProperty {
+private:
+ IntIntHash* m_Value2Name;
+ StringIntHash* m_Name2Value;
+ vector<string> m_NomValues;
+public:
+ GLEPropertyNominal(const char* name, GLEPropertyType type, GLEPropertyID id);
+ virtual ~GLEPropertyNominal();
+ void addValue(const char* name, int value);
+ virtual void getPropertyAsString(string* result, GLEMemoryCell* value);
+};
+
+class GLEPropertyLWidth : public GLEProperty {
+public:
+ GLEPropertyLWidth(const char* name);
+ virtual ~GLEPropertyLWidth();
+ virtual bool isEqualToState(GLEPropertyStore* store);
+ virtual void updateState(GLEPropertyStore* store);
+};
+
+class GLEPropertyLStyle : public GLEProperty {
+public:
+ GLEPropertyLStyle(const char* name);
+ virtual ~GLEPropertyLStyle();
+ virtual bool isEqualToState(GLEPropertyStore* store);
+ virtual void updateState(GLEPropertyStore* store);
+};
+
+class GLEPropertyColor : public GLEProperty {
+public:
+ GLEPropertyColor(const char* name);
+ virtual ~GLEPropertyColor();
+ virtual bool isEqualToState(GLEPropertyStore* store);
+ virtual void updateState(GLEPropertyStore* store);
+};
+
+class GLEPropertyHei : public GLEProperty {
+public:
+ GLEPropertyHei(const char* name);
+ virtual ~GLEPropertyHei();
+ virtual bool isEqualToState(GLEPropertyStore* store);
+ virtual void updateState(GLEPropertyStore* store);
+};
+
+class GLEPropertyFont : public GLEProperty {
+public:
+ GLEPropertyFont(const char* name);
+ virtual ~GLEPropertyFont();
+ virtual bool isEqualToState(GLEPropertyStore* store);
+ virtual void updateState(GLEPropertyStore* store);
+};
+
+class GLEPropertyJustify : public GLEProperty {
+public:
+ GLEPropertyJustify(const char* name);
+ virtual ~GLEPropertyJustify();
+ virtual bool isEqualToState(GLEPropertyStore* store);
+ virtual void updateState(GLEPropertyStore* store);
+ virtual void getPropertyAsString(string* result, GLEMemoryCell* value);
+};
+
+class GLEPropertyFillColor : public GLEProperty {
+public:
+ GLEPropertyFillColor(const char* name);
+ virtual ~GLEPropertyFillColor();
+ virtual bool isEqualToState(GLEPropertyStore* store);
+ virtual void updateState(GLEPropertyStore* store);
+};
+
+class GLEPropertyArrowSize : public GLEProperty {
+public:
+ GLEPropertyArrowSize(const char* name);
+ virtual ~GLEPropertyArrowSize();
+ virtual bool isEqualToState(GLEPropertyStore* store);
+ virtual void updateState(GLEPropertyStore* store);
+};
+
+class GLEPropertyArrowAngle : public GLEProperty {
+public:
+ GLEPropertyArrowAngle(const char* name);
+ virtual ~GLEPropertyArrowAngle();
+ virtual bool isEqualToState(GLEPropertyStore* store);
+ virtual void updateState(GLEPropertyStore* store);
+};
+
+class DLLCLASS GLEPropertyStoreModel : public GLERefCountObject {
+protected:
+ GLEVectorAutoDelete<GLEProperty> m_Properties;
+ IntIntHash* m_Hash;
+ bool m_CanScale;
+ int m_NbExtra;
+public:
+ GLEPropertyStoreModel();
+ virtual ~GLEPropertyStoreModel();
+ inline bool isSupportScale() { return m_CanScale; }
+ inline int getNumberOfExtraProperties() { return m_NbExtra; }
+ inline int getNumberOfProperties() { return m_Properties.size(); }
+ inline GLEProperty* getProperty(int idx) { return m_Properties[idx]; }
+ inline bool hasProperty(GLEPropertyID id) { return find(id) != -1; }
+ DLLFCT int find(GLEPropertyID id);
+ void add(GLEProperty* prop);
+ virtual void scale(GLEDrawObject* obj, double sx, double sy);
+};
+
+class DLLCLASS GLEPropertyStore {
+protected:
+ GLEArrayImpl m_Values;
+ GLERC<GLEPropertyStoreModel> m_Model;
+public:
+ GLEPropertyStore(GLEPropertyStoreModel* model);
+ ~GLEPropertyStore();
+ inline GLEPropertyStoreModel* getModel() { return m_Model.get(); }
+ inline int getIntProperty(GLEPropertyID id) { return m_Values.getInt(m_Model->find(id)); }
+ inline bool getBoolProperty(GLEPropertyID id) { return m_Values.getBool(m_Model->find(id)); }
+ inline double getRealProperty(GLEPropertyID id) { return m_Values.getDouble(m_Model->find(id)); }
+ inline GLEFont* getFontProperty(GLEPropertyID id) { return (GLEFont*)m_Values.getObject(m_Model->find(id)); }
+ inline GLEColor* getColorProperty(GLEPropertyID id) { return (GLEColor*)m_Values.getObject(m_Model->find(id)); }
+ inline GLEString* getStringProperty(GLEPropertyID id) { return (GLEString*)m_Values.getObject(m_Model->find(id)); }
+ inline void setIntProperty(GLEPropertyID id, int value) { m_Values.setInt(m_Model->find(id), value); }
+ inline void setBoolProperty(GLEPropertyID id, bool value) { m_Values.setBool(m_Model->find(id), value); }
+ inline void setRealProperty(GLEPropertyID id, double value) { m_Values.setDouble(m_Model->find(id), value); }
+ inline void setFontProperty(GLEPropertyID id, GLEFont* value) { m_Values.setObject(m_Model->find(id), value); }
+ inline void setColorProperty(GLEPropertyID id, GLEColor* value) { m_Values.setObject(m_Model->find(id), value); }
+ inline void setStringProperty(GLEPropertyID id, GLEString* value) { m_Values.setObject(m_Model->find(id), value); }
+ inline int getNumberOfProperties() { return m_Model->getNumberOfProperties(); }
+ inline GLEProperty* getProperty(int idx) { return m_Model->getProperty(idx); }
+ inline GLEMemoryCell* getPropertyValue(int idx) { return m_Values.get(idx); }
+ inline void setPropertyValue(int idx, const GLEMemoryCell* value) { m_Values.set(idx, value); }
+ inline GLEMemoryCell* getPropertyValue(GLEProperty* prop) { return m_Values.get(prop->getIndex()); }
+ inline int getIntProperty(GLEProperty* prop) { return m_Values.getInt(prop->getIndex()); }
+ inline double getRealProperty(GLEProperty* prop) { return m_Values.getDouble(prop->getIndex()); }
+ inline void setRealProperty(GLEProperty* prop, double value) { m_Values.setDouble(prop->getIndex(), value); }
+ inline GLEColor* getColorProperty(GLEProperty* prop) { return (GLEColor*)m_Values.getObject(prop->getIndex()); }
+ inline GLEFont* getFontProperty(GLEProperty* prop) { return (GLEFont*)m_Values.getObject(prop->getIndex()); }
+ inline GLEString* getStringProperty(GLEProperty* prop) { return (GLEString*)m_Values.getObject(prop->getIndex()); }
+ inline GLEArrayImpl* getArray() { return &m_Values; }
+ void getPropertyAsString(GLEPropertyID id, string* result);
+ GLEPropertyStore* clone();
+};
+
+class GLEFileLocationMap;
+
+#define GLE_FILELOCATION_IS_STDIN 1
+#define GLE_FILELOCATION_IS_STDOUT 2
+#define GLE_FILELOCATION_IS_LOCAL 4
+#define GLE_FILELOCATION_IS_ILLEGAL 8
+
+class DLLCLASS GLEFileLocation {
+protected:
+ unsigned int m_Flags;
+ string m_Name;
+ string m_Ext;
+ string m_Directory;
+ string m_FullPath;
+public:
+ GLEFileLocation();
+ GLEFileLocation(const char* file);
+ GLEFileLocation(const GLEFileLocation& other);
+ ~GLEFileLocation();
+ void fromAbsolutePath(const string& path);
+ void fromRelativePath(const string& dirname, const string& fname);
+ void fromFileNameCrDir(const string& fname);
+ void fromFileNameDir(const string& fname, const string& dirname);
+ void createStdin();
+ void createStdout();
+ void createIllegal();
+ void initDirectory();
+ void copy(const GLEFileLocation* other);
+ void addExtension(const char* ext);
+ bool isStream();
+ string getFileName();
+ string getMainName();
+ inline unsigned int getFlags() const { return m_Flags; }
+ inline const string& getName() const { return m_Name; }
+ inline const string& getExt() const { return m_Ext; }
+ inline const string& getDirectory() const { return m_Directory; }
+ inline const string& getFullPath() const { return m_FullPath; }
+ inline string& getFullPathNC() { return m_FullPath; }
+ inline bool isStdin() { return (m_Flags & GLE_FILELOCATION_IS_STDIN) != 0; }
+ inline bool isStdout() { return (m_Flags & GLE_FILELOCATION_IS_STDOUT) != 0; }
+ inline void setName(const string& v) { m_Name = v; }
+ inline void setExt(const string& v) { m_Ext = v; }
+ inline void setDirectory(const string& v) { m_Directory = v; }
+ inline void setFullPath(const string& v) { m_FullPath = v; }
+};
+
+struct surface_struct;
+
+class DLLCLASS GLEInterface {
+protected:
+ GLEScript* m_Script;
+ GLEOutputStream* m_Output;
+ GLEGlobalConfig* m_Config;
+ bool m_MakeDrawObjs;
+ bool m_CommitMode;
+ GLERCVector<GLEFont> m_Fonts;
+ GLERCVector<GLEFont> m_AllFonts;
+ StringIntHash* m_FontHash;
+ IntIntHash* m_FontIndexHash;
+
+ GLERC<GLEPropertyStoreModel> m_TextModel;
+ GLERC<GLEPropertyStoreModel> m_LineModel;
+ GLERC<GLEPropertyStoreModel> m_ShapeModel;
+
+ string* m_InitialPS;
+ GLEFileLocationMap* m_FileInfoMap;
+public:
+ GLEInterface();
+ ~GLEInterface();
+
+ // Initialize GLE - call once before calling any of the other functions
+ DLLFCT bool initializeGLE(const char* appname, int argc, char **argv);
+
+ // Returns the version of GLE
+ DLLFCT string getGLEVersion();
+ DLLFCT string getGLEBuildDate();
+
+ // Returns the location of GLE_TOP
+ DLLFCT const char* getGLETop();
+
+ // ****************************** Methods for changing settings
+
+ // Sets the port used by the QGLE server
+ void setSetting(const char* section, const char* name, const char* value);
+
+ // Write settings to "glerc" file ($HOME/.glerc)
+ void saveSettings();
+
+ // ****************************** Methods for rendering a GLE file
+
+ // The provided function is called for each block of PostScript code created by GLE
+ void setPostScriptCallbackFunction(void* callback);
+
+ // Should GLE make GLEDrawObjects or just regular output
+ inline void setMakeDrawObjects(bool make) { m_MakeDrawObjs = make; }
+ inline bool isMakeDrawObjects() { return m_MakeDrawObjs; }
+
+ inline GLEScript* getScript() { return m_Script; }
+
+ // Set the output stream for error messages, etc..
+ DLLFCT void setOutputStream(GLEOutputStream* output);
+
+ DLLFCT GLERC<GLEScript> newGLEFile(const char* glecode, const char* tmpfile);
+
+ DLLFCT GLERC<GLEScript> loadGLEFile(const char* glefile);
+
+ DLLFCT void saveGLEFile(GLEScript* script, const char* glefile);
+
+ DLLFCT void showGLEFile(GLEScript* script);
+
+ DLLFCT void setCompatibilityMode(const char* version);
+
+ DLLFCT void renderGLE(GLEScript* script, const char* outfile, int device, bool toMemory = false);
+
+ DLLFCT void commitChangesGLE(GLEScript* script);
+
+ // Create a new GLE script "in memory"
+ GLEScript* createGLEScript();
+
+ // ****************************** Methods for working with text
+
+ int getNumberOfColors();
+ GLEColor* getColor(int i);
+
+ // Return the number of available fonts
+ int getNumberOfFonts();
+
+ // Return the i-the font
+ GLEFont* getFont(int i);
+
+ // Return the font matching a given name
+ GLEFont* getFont(const string& name);
+
+ // Return the font matching a given name
+ GLEFont* getFont(const char* name);
+
+ GLEFont* getFontIndex(int font);
+
+ // Return the property store model for a text string
+ inline GLEPropertyStoreModel* getTextPropertyStoreModel() { return m_TextModel.get(); }
+
+ DLLFCT const char* getInitialPostScript();
+
+ DLLFCT const char* getTerminatePostScript();
+
+ // Render a given string
+ DLLFCT GLETextDO* renderText(const char* strUTF8, GLEPropertyStore* prop);
+ void renderText(GLETextDO* text, GLEPropertyStore* prop);
+
+ // Deletes a given object that is no longer required
+ void deleteGLEObject(GLEDrawObject* object);
+
+ inline GLEOutputStream* getOutput() { return m_Output; }
+
+ DLLFCT bool isDeviceSupported(int device);
+
+ DLLFCT const char* getDeviceFilenameExtension(int device);
+
+ // Return the property store model for a line
+ inline GLEPropertyStoreModel* getLinePropertyStoreModel() { return m_LineModel.get(); }
+ inline GLEPropertyStoreModel* getShapePropertyStoreModel() { return m_ShapeModel.get(); }
+
+ DLLFCT void clearAllCmdLine();
+ DLLFCT void setCmdLineOption(const char* name);
+ DLLFCT void setCmdLineOptionString(const char* name, const char* value, int arg = 0);
+ DLLFCT bool hasCmdLineOptionString(const char* name);
+
+ DLLFCT string getGhostScriptLocation();
+ DLLFCT string getToolLocation(const char* name);
+ DLLFCT string getUserConfigLocation();
+
+ // Returns the location of gle-manual.pdf
+ DLLFCT string getManualLocation();
+
+ DLLFCT void findDependencies(const char* root);
+ DLLFCT void saveRCFile();
+
+ DLLFCT void addFileInfo(const GLEFileLocation& f1);
+ DLLFCT vector<GLEFileLocation> getFileInfos();
+ inline bool hasFileInfos() { return m_FileInfoMap != NULL; }
+
+ DLLFCT void evalString(const char* str, GLEScript* script = NULL);
+
+ DLLFCT string getTempFile();
+ DLLFCT int copyFile(const string& from, const string& to, string* err = NULL);
+
+ void initTextProperties(GLEPropertyStore* prop);
+
+ // Get information about 3D surface plots
+ DLLFCT surface_struct* getSurface();
+
+ DLLFCT void convertPDFToImage(char* pdfData,
+ int pdfLength,
+ double resolution,
+ int device,
+ int options,
+ gle_write_func writeFunc,
+ void* closure);
+
+ DLLFCT bool readFileOrGZIPTxt(const char* name, std::string* result);
+
+public:
+ inline void setCommitMode(bool commit) { m_CommitMode = commit; }
+ inline bool isCommitMode() { return m_CommitMode; }
+ inline GLEGlobalConfig* getConfig() { return m_Config; }
+ inline void setConfig(GLEGlobalConfig* config) { m_Config = config; }
+ CmdLineObj* getCmdLine();
+public:
+ // For GLE internal use only
+ void addFont(GLEFont* font);
+ void addSubFont(GLEFont* font);
+};
+
+class DLLCLASS GLEErrorMessage {
+private:
+ int m_Line, m_Column, m_Delta;
+ string m_File;
+ string m_LineAbbrev;
+ string m_ErrorMsg;
+public:
+ GLEErrorMessage();
+ ~GLEErrorMessage();
+ inline int getLine() { return m_Line; }
+ inline void setLine(int line) { m_Line = line; }
+ inline int getColumn() { return m_Column; }
+ inline void setColumn(int col) { m_Column = col; }
+ inline int getDelta() { return m_Delta; }
+ inline void setDelta(int delta) { m_Delta = delta; }
+ inline const char* getFile() { return m_File.c_str(); }
+ inline void setFile(const string& val) { m_File = val; }
+ inline const char* getLineAbbrev() { return m_LineAbbrev.c_str(); }
+ inline void setLineAbbrev(const string& val) { m_LineAbbrev = val; }
+ inline const char* getErrorMsg() { return m_ErrorMsg.c_str(); }
+ inline void setErrorMsg(const string& val) { m_ErrorMsg = val; }
+};
+
+class DLLCLASS GLEOutputStream {
+private:
+ int m_ExitCode;
+public:
+ GLEOutputStream();
+ virtual ~GLEOutputStream();
+ virtual void println();
+ virtual void println(const char* str);
+ virtual void printflush(const char* str);
+ virtual void error(GLEErrorMessage* msg);
+ inline int getExitCode() { return m_ExitCode; }
+ inline void setExitCode(int code) { m_ExitCode = code; }
+};
+
+enum GLEDrawObjectType {
+ // Only implement a few to start
+ GDOScript, GDOText, GDOLine, GDOEllipse, GDOArc, GDOObject
+};
+
+enum GLEHasArrow {
+ GLEHasArrowNone = 0,
+ GLEHasArrowStart = 1,
+ GLEHasArrowEnd = 2,
+ GLEHasArrowBoth = 3
+};
+
+class DLLCLASS GLEDrawObject : public GLERefCountObject {
+protected:
+ int m_Flag;
+ GLEPropertyStore* m_Properties;
+public:
+ GLEDrawObject();
+ virtual ~GLEDrawObject();
+
+ // Get the exact bounding box of this object (in cm)
+ virtual void getPSBoundingBox(GLERectangle* box);
+
+ // Return the PostScript code generated for this object (if any)
+ virtual const char* getPostScriptCode();
+
+ // Position of the object in the originating script (if any)
+ // This can be used to delete or move the object
+ int getSourceLine1();
+ int getSourceLine2();
+
+ // What type of object are we dealing with?
+ DLLFCT virtual GLEDrawObjectType getType() = 0;
+
+ inline void setFlag(int flag) { m_Flag |= flag; }
+ inline bool hasFlag(int flag) { return (m_Flag & flag) != 0; }
+
+ // Return the list of properties associated with this object
+ inline GLEPropertyStore* getProperties() { return m_Properties; }
+ void setProperties(GLEPropertyStore* store);
+
+ virtual void initProperties(GLEInterface* iface);
+ virtual bool needsAMove(GLEPoint& pt);
+ virtual void createGLECode(string& code);
+ virtual void updateBoundingBox();
+ virtual void applyTransformation(bool dir);
+ virtual GLEDrawObject* clone();
+ virtual bool approx(GLEDrawObject* other);
+ virtual bool modified();
+ virtual void draw();
+
+ GLEDrawObject* deepClone();
+ void applyTransformationPt(GLEPoint* point, bool dir);
+
+ inline int getIntProperty(GLEPropertyID id) { return m_Properties->getIntProperty(id); }
+ inline bool getBoolProperty(GLEPropertyID id) { return m_Properties->getBoolProperty(id); }
+ inline double getRealProperty(GLEPropertyID id) { return m_Properties->getRealProperty(id); }
+ inline GLEFont* getFontProperty(GLEPropertyID id) { return m_Properties->getFontProperty(id); }
+ inline GLEColor* getColorProperty(GLEPropertyID id) { return m_Properties->getColorProperty(id); }
+ inline void setIntProperty(GLEPropertyID id, int value) { m_Properties->setIntProperty(id, value); }
+ inline void setBoolProperty(GLEPropertyID id, bool value) { m_Properties->setBoolProperty(id, value); }
+ inline void setRealProperty(GLEPropertyID id, double value) { m_Properties->setRealProperty(id, value); }
+ inline void setFontProperty(GLEPropertyID id, GLEFont* value) { m_Properties->setFontProperty(id, value); }
+ inline void setColorProperty(GLEPropertyID id, GLEColor* value) { m_Properties->setColorProperty(id, value); }
+ void getPropertyAsString(GLEPropertyID id, string* result) { m_Properties->getPropertyAsString(id, result); }
+};
+
+class GLEHasArrowBase {
+public:
+ GLEHasArrowBase();
+ inline GLEHasArrow getArrow() { return m_Arrow; }
+ inline void setArrow(GLEHasArrow arrow) { m_Arrow = arrow; }
+
+protected:
+ GLEHasArrow m_Arrow;
+};
+
+class GLELineDO : public GLEDrawObject, public GLEHasArrowBase {
+protected:
+ GLEPoint m_P1, m_P2;
+public:
+ GLELineDO();
+ GLELineDO(double x1, double y1, double x2, double y2);
+ GLELineDO(const GLEPoint& p1, const GLEPoint& p2);
+ virtual ~GLELineDO();
+ virtual GLEDrawObjectType getType();
+ inline GLEPoint& getP1() { return m_P1; }
+ inline GLEPoint& getP2() { return m_P2; }
+ inline void setP1(const GLEPoint& p1) { m_P1 = p1; }
+ inline void setP2(const GLEPoint& p2) { m_P2 = p2; }
+ virtual void initProperties(GLEInterface* iface);
+ virtual bool needsAMove(GLEPoint& pt);
+ virtual void createGLECode(string& code);
+ virtual void updateBoundingBox();
+ virtual void applyTransformation(bool dir);
+ virtual GLEDrawObject* clone();
+ virtual bool approx(GLEDrawObject* other);
+};
+
+class GLEEllipseDO : public GLEDrawObject {
+protected:
+ GLEPoint m_Center;
+ double m_Rx, m_Ry;
+public:
+ GLEEllipseDO();
+ GLEEllipseDO(double x0, double y0, double r);
+ GLEEllipseDO(const GLEPoint& c, double rx, double ry);
+ GLEEllipseDO(double x0, double y0, double rx, double ry);
+ virtual ~GLEEllipseDO();
+ virtual GLEDrawObjectType getType();
+ inline GLEPoint& getCenter() { return m_Center; }
+ inline void setCenter(const GLEPoint& c) { m_Center = c; }
+ inline double getRadiusX() { return m_Rx; }
+ inline double getRadiusY() { return m_Ry; }
+ inline void setRadiusX(double r) { m_Rx = r; }
+ inline void setRadiusY(double r) { m_Ry = r; }
+ DLLFCT void setRadius(double r);
+ inline bool isCircle() { return m_Rx == m_Ry; }
+ DLLFCT GLEPoint getPoint(GLEJustify just);
+ virtual bool needsAMove(GLEPoint& pt);
+ virtual void createGLECode(string& code);
+ virtual void updateBoundingBox();
+ virtual void applyTransformation(bool dir);
+ virtual GLEDrawObject* clone();
+ virtual bool approx(GLEDrawObject* other);
+ virtual void initProperties(GLEInterface* iface);
+};
+
+class GLEArcDO : public GLEEllipseDO, public GLEHasArrowBase {
+protected:
+ double m_Angle1, m_Angle2;
+public:
+ GLEArcDO();
+ GLEArcDO(double x0, double y0, double r, double a1, double a2);
+ GLEArcDO(double x0, double y0, double rx, double ry, double a1, double a2);
+ virtual ~GLEArcDO();
+ virtual GLEDrawObjectType getType();
+ inline double getAngle1() { return m_Angle1; }
+ inline double getAngle2() { return m_Angle2; }
+ inline void setAngle1(double a1) { m_Angle1 = a1; }
+ inline void setAngle2(double a2) { m_Angle2 = a2; }
+ virtual bool needsAMove(GLEPoint& pt);
+ virtual void createGLECode(string& code);
+ virtual void updateBoundingBox();
+ virtual GLEDrawObject* clone();
+ virtual bool approx(GLEDrawObject* other);
+ virtual void initProperties(GLEInterface* iface);
+ DLLFCT GLEPoint& getPoint1(GLEPoint& pt);
+ DLLFCT GLEPoint& getPoint2(GLEPoint& pt);
+ DLLFCT GLEPoint& getPointMid(GLEPoint& pt);
+ DLLFCT void normalize();
+};
+
+class GLETextDO : public GLEDrawObject {
+protected:
+ GLEPoint m_Position;
+ string m_Text;
+ string m_PostScript;
+ GLERectangle m_PSBoundingBox;
+ double m_BaseLine;
+ bool m_Modified;
+public:
+ GLETextDO();
+ GLETextDO(GLEPoint& position, const string& text);
+ virtual ~GLETextDO();
+ virtual const char* getPostScriptCode();
+ virtual void getPSBoundingBox(GLERectangle* box);
+ GLEDrawObjectType getType();
+ inline double getBaseLine() { return m_BaseLine; }
+ void initBB(double width, double height, double baseline);
+ inline string* getPostScriptPtr() { return &m_PostScript; }
+ inline const string& getText() { return m_Text; }
+ inline const char* getTextC() { return m_Text.c_str(); }
+ inline void setText(const string& text) { m_Text = text; }
+ inline void setText(const char* text) { m_Text = text; }
+ inline GLEPoint& getPosition() { return m_Position; }
+ inline void setPosition(const GLEPoint& pos) { m_Position = pos; }
+ virtual bool needsAMove(GLEPoint& pt);
+ virtual void createGLECode(string& code);
+ virtual void updateBoundingBox();
+ virtual void applyTransformation(bool dir);
+ virtual void initProperties(GLEInterface* iface);
+ virtual GLEDrawObject* clone();
+ virtual bool approx(GLEDrawObject* other);
+ virtual bool modified();
+ DLLFCT void setModified(bool modified);
+ DLLFCT void render(GLEInterface* iface);
+};
+
+// ...
+
+class DLLCLASS GLEComposedObject : public GLEDrawObject {
+private:
+ GLERCVector<GLEDrawObject> m_Objs;
+public:
+ GLEComposedObject();
+ virtual ~GLEComposedObject();
+
+ // Return the number of objects defined by this object
+ inline int getNumberObjects() { return m_Objs.size(); }
+ inline void setNumberObjects(int nb) { m_Objs.resize(nb); }
+
+ // Return given object defined by the script
+ inline GLEDrawObject* getObject(int i) { return m_Objs.get(i); }
+ inline void setObject(int i, GLEDrawObject* obj) { m_Objs[i] = obj; }
+
+ // Add a new object to this composed object
+ inline void addObject(GLEDrawObject* obj) { m_Objs.add(obj); }
+
+ void DLLFCT clear();
+ void removeDeletedObjects();
+};
+
+class GLEObjectDO;
+
+class DLLCLASS GLEObjectDOConstructor : public GLEPropertyStoreModel {
+protected:
+ GLESub* m_Sub;
+public:
+ GLEObjectDOConstructor(GLESub* sub);
+ virtual ~GLEObjectDOConstructor();
+ DLLFCT const string& getName();
+ DLLFCT GLEObjectDO* constructObject();
+ DLLFCT GLEScript* getScript();
+ inline GLESub* getSubroutine() { return m_Sub; }
+ virtual void scale(GLEDrawObject* obj, double sx, double sy);
+};
+
+class GLEObjectDO : public GLEDrawObject {
+protected:
+ GLEPoint m_Position;
+ string m_PostScript;
+ GLERC<GLEObjectRepresention> m_ObjRep;
+ GLERC<GLEString> m_RefPoint;
+ GLEObjectDOConstructor* m_Cons;
+public:
+ GLEObjectDO(GLEObjectDOConstructor* cons);
+ virtual ~GLEObjectDO();
+ virtual const char* getPostScriptCode();
+ virtual void getPSBoundingBox(GLERectangle* box);
+ GLEDrawObjectType getType();
+ inline string* getPostScriptPtr() { return &m_PostScript; }
+ inline GLEPoint& getPosition() { return m_Position; }
+ inline void setPosition(const GLEPoint& pos) { m_Position = pos; }
+ virtual bool needsAMove(GLEPoint& pt);
+ virtual void createGLECode(string& code);
+ virtual void updateBoundingBox();
+ virtual void applyTransformation(bool dir);
+ virtual void initProperties(GLEInterface* iface);
+ virtual GLEDrawObject* clone();
+ virtual bool approx(GLEDrawObject* other);
+ void makePropertyStore();
+ DLLFCT void render();
+ DLLFCT void computeReferencePoint(GLEPoint* pt);
+ inline void setObjectRepresentation(GLEObjectRepresention* rep) { m_ObjRep = rep; }
+ inline GLEObjectRepresention* getObjectRepresentation() { return m_ObjRep.get(); }
+ inline GLEObjectDOConstructor* getConstructor() { return m_Cons; }
+ inline void setRefPointString(GLEString* str) { m_RefPoint = str; }
+ inline GLEString* getRefPointString() { return m_RefPoint.get(); }
+};
+
+// must come after definition GLEFileLocation and of GLEObjectDOConstructor
+#include "gle-sourcefile.h"
+
+class DLLCLASS GLEScript : public GLEComposedObject {
+protected:
+ GLEPcodeIndexed* m_Pcode;
+ GLERun* m_Run;
+ GLEParser* m_Parser;
+ GLEPolish* m_Polish;
+ GLEGlobalSource m_File;
+ GLEPoint m_Size, m_BoundingBox, m_BoundingBoxOrigin;
+ GLERCVector<GLEDrawObject> m_NewObjs;
+ string m_PostScriptCode;
+ string m_PDFCode;
+ int m_CurrObject;
+public:
+ GLEScript();
+ virtual ~GLEScript();
+ void cleanUp();
+
+ // What type of object are we dealing with?
+ virtual GLEDrawObjectType getType();
+
+ DLLFCT void updateObjectDOConstructors();
+
+ GLEDrawObject* DLLFCT newGLEObject(GLEDrawObjectType type);
+ void DLLFCT cancelObject(GLEDrawObject* obj);
+
+ inline GLEGlobalSource* getSource() { return &m_File; }
+ inline GLEFileLocation* getLocation() { return m_File.getLocation(); }
+
+ inline const GLEPoint& getSize() { return m_Size; }
+ inline const GLEPoint& getBoundingBox() { return m_BoundingBox; }
+ inline const GLEPoint& getBoundingBoxOrigin() { return m_BoundingBoxOrigin; }
+
+ inline void setSize(double wd, double hi) { m_Size.setXY(wd, hi); }
+ inline void setBoundingBox(double wd, double hi) { m_BoundingBox.setXY(wd, hi); }
+ inline void setBoundingBoxOrigin(double x, double y) { m_BoundingBoxOrigin.setXY(x, y); }
+
+ inline void resetObjectIterator() { m_CurrObject = 0; }
+ GLEDrawObject* nextObject();
+
+ inline GLEInterface* getGLEInterface() { return GLEGetInterfacePointer(); }
+ inline GLERun* getRun() { return m_Run; }
+ inline GLEParser* getParser() { return m_Parser; }
+ inline GLEPolish* getPolish() { return m_Polish; }
+ inline GLEPcodeIndexed* getPcode() { return m_Pcode; }
+ inline void setRun(GLERun* run) { m_Run = run; }
+ inline void setParser(GLEParser* parser) { m_Parser = parser; }
+ inline void setPolish(GLEPolish* polish) { m_Polish = polish; }
+ inline void setPcode(GLEPcodeIndexed* code) { m_Pcode = code; }
+
+ inline int getNumberNewObjects() { return m_NewObjs.size(); }
+ inline GLEDrawObject* getNewObject(int i) { return m_NewObjs.get(i); }
+ inline void addNewObject(GLEDrawObject* obj) { m_NewObjs.add(obj); }
+ void clearNewObjects();
+ virtual const char* getPostScriptCode();
+ virtual string* getRecordedBytesBuffer(int device);
+};
+
+class DLLCLASS GLEColorList {
+protected:
+ GLERCVector<GLEColor> m_Colors;
+ StringIntHash m_ColorHash;
+ GLERCVector<GLEColor> m_OldColors;
+ StringIntHash m_OldColorHash;
+public:
+ GLEColorList();
+ ~GLEColorList();
+ void reset();
+ void defineColor(const char* name, unsigned int value);
+ void defineColor(const string& name, unsigned int value);
+ void defineColor(const string& name, GLEColor* color);
+ void defineOldColor(const char* name, unsigned int value);
+ void defineOldColor(const string& name, unsigned int value);
+ GLEColor* get(const string& name);
+ DLLFCT GLEColor* getSafeDefaultBlack(const string& name);
+ inline int getNbColors() { return m_Colors.size(); }
+ inline GLEColor* getColor(int i) { return m_Colors.get(i); }
+ void defineDefaultColors();
+private:
+ void defineGrays();
+ void defineSVGColors();
+ void defineOldGLEColors();
+};
+
+GLEColorList* DLLFCT GLEGetColorList();
+
+class GLEStringSettings {
+public:
+ void setHeight(double hei);
+ void setFontLWidth(double lwidht);
+// ...
+};
+
+typedef struct {
+ double xt, yt;
+ double xa, ya;
+ double xb, yb;
+ double xl, yl;
+} GLEArrowPoints;
+
+DLLFCT void GLESetDefaultArrowProperties(double lwd, GLEPropertyStore* prop);
+DLLFCT void GLEGetArrowPoints(GLEPoint& pt, double dx, double dy, GLEPropertyStore* props, double fac, GLEArrowPoints* pts);
+DLLFCT void GLEGetArrowPointsNoProps(GLEPoint& pt, double dx, double dy, double lwd, double size, double angle, GLEArrowPoints* pts);
+void GLEInitColorProperty(GLEPropertyStore* prop);
+void GLEInitSimpleLineProperties(GLEPropertyStore* prop);
+void GLEInitLineProperties(GLEPropertyStore* prop);
+void GLEInitArrowProperties(GLEPropertyStore* prop);
+void GLEInitShapeFillColor(GLEPropertyStore* prop);
+void GLEInitTextProperties(GLEPropertyStore* prop);
+
+// Implements: (int)floor((double)dpi/72.0*bbox+1);
+// Not inline because math.h may not be included in some cpp files, which is required by floor()
+DLLFCT int GLEBBoxToPixels(double dpi, double bbox);
+
+#endif
diff --git a/src/gle/gle-interface/gle-shapemath.h b/src/gle/gle-interface/gle-shapemath.h
new file mode 100644
index 0000000..2bbc82d
--- /dev/null
+++ b/src/gle/gle-interface/gle-shapemath.h
@@ -0,0 +1,173 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#ifndef __GLE_SHAPEMATH__
+#define __GLE_SHAPEMATH__
+
+class DLLCLASS GLECurve {
+public:
+ GLECurve();
+ virtual ~GLECurve();
+ virtual void getC(double t, GLEPoint& p) = 0;
+ virtual void getCp(double t, GLEPoint& p) = 0;
+ virtual void getCpp(double t, GLEPoint& p) = 0;
+ virtual double getT0();
+ virtual double getT1();
+ virtual double getDist(double t1, double t2);
+ virtual double distToParamValue(double t1, double dist, double t2);
+ virtual double distToParamValue(double t1, double dist);
+ double getDistp(double t);
+protected:
+ double computeDistRecursive(double t1, GLEPoint& p1, double t2, GLEPoint& p2);
+};
+
+class DLLCLASS GLECurveT0T1 : public GLECurve {
+protected:
+ double m_T0, m_T1;
+public:
+ GLECurveT0T1();
+ ~GLECurveT0T1();
+ virtual double getT0();
+ virtual double getT1();
+};
+
+class DLLCLASS GLECircleArc : public GLECurveT0T1 {
+protected:
+ GLEPoint m_Orig;
+ double m_R;
+public:
+ GLECircleArc(const GLEPoint& orig, double r, double t0, double t1);
+ virtual ~GLECircleArc();
+ virtual void getC(double t, GLEPoint& p);
+ virtual void getCp(double t, GLEPoint& p);
+ virtual void getCpp(double t, GLEPoint& p);
+ virtual double getDist(double t1, double t2);
+ virtual double distToParamValue(double t1, double dist, double t2);
+ virtual double distToParamValue(double t1, double dist);
+};
+
+class DLLCLASS GLEEllipseArc : public GLECurveT0T1 {
+protected:
+ GLEPoint m_Orig;
+ double m_Rx, m_Ry;
+public:
+ GLEEllipseArc(const GLEPoint& orig, double rx, double ry, double t0, double t1);
+ virtual ~GLEEllipseArc();
+ virtual void getC(double t, GLEPoint& p);
+ virtual void getCp(double t, GLEPoint& p);
+ virtual void getCpp(double t, GLEPoint& p);
+};
+
+class DLLCLASS GLEBezier : public GLECurve {
+protected:
+ GLEPoint m_P0, m_P1, m_P2, m_P3;
+ double m_Ax, m_Bx, m_Cx, m_Ay, m_By, m_Cy;
+public:
+ GLEBezier();
+ GLEBezier(double x0, double y0, double x1, double y1, double x2, double y2, double x3, double y3);
+ GLEBezier(const GLEBezier& other);
+ ~GLEBezier();
+ inline void setP0(const GLEPoint& p) { m_P0.set(p); }
+ inline void setP1(const GLEPoint& p) { m_P1.set(p); }
+ inline void setP2(const GLEPoint& p) { m_P2.set(p); }
+ inline void setP3(const GLEPoint& p) { m_P3.set(p); }
+ inline void setP0(double x, double y) { m_P0.setXY(x, y); }
+ inline void setP1(double x, double y) { m_P1.setXY(x, y); }
+ inline void setP2(double x, double y) { m_P2.setXY(x, y); }
+ inline void setP3(double x, double y) { m_P3.setXY(x, y); }
+ inline const GLEPoint& getP0() const { return m_P0; }
+ inline const GLEPoint& getP1() const { return m_P1; }
+ inline const GLEPoint& getP2() const { return m_P2; }
+ inline const GLEPoint& getP3() const { return m_P3; }
+ inline GLEPoint& P0() { return m_P0; }
+ inline GLEPoint& P1() { return m_P1; }
+ inline GLEPoint& P2() { return m_P2; }
+ inline GLEPoint& P3() { return m_P3; }
+ virtual void getC(double t, GLEPoint& p);
+ virtual void getCp(double t, GLEPoint& p);
+ virtual void getCpp(double t, GLEPoint& p);
+ void throughPoint(GLEPoint& p, GLEPoint& dir1, GLEPoint& dir2);
+ void updateEquation();
+ void draw();
+ void cutAtParamValue(double t);
+ void cutFromParamValue(double t);
+};
+
+class DLLCLASS GLECurvedArrowHead {
+protected:
+ GLECurve* m_Curve;
+ GLEBezier m_Side1, m_Side2;
+ double m_T0, m_TM, m_T1;
+ double m_ArrAlpha, m_ArrSize, m_LWidth;
+ bool m_Enable, m_Sharp;
+ int m_ArrStyle;
+public:
+ GLECurvedArrowHead(GLECurve* curve);
+ virtual ~GLECurvedArrowHead();
+ void getA(double t, double pm, GLEPoint& p);
+ void getAp(double t, double pm1, double pm2, GLEPoint& p);
+ void setArrowAngleSize(int style, double size, double angle);
+ void setArrowAngleSizeSharp(int style, double size, double angle);
+ void drawDirection(bool dir);
+ void setStartEnd(bool dir);
+ double getParamValueEnd();
+ double getArrowCurveDist();
+ void computeAndDraw();
+ DLLFCT void computeArrowHead();
+ void draw();
+ GLEBezier* getSide1() { return &m_Side1; }
+ GLEBezier* getSide2() { return &m_Side2; }
+ inline int getStyle() { return m_ArrStyle; }
+ inline bool isSharp() { return m_Sharp; }
+ inline void setSharp(bool sharp) { m_Sharp = sharp; }
+ inline void setLineWidth(double lwidth) { m_LWidth = lwidth; }
+ inline bool isEnabled() { return m_Enable; }
+ inline void setEnabled(bool enable) { m_Enable = enable; }
+};
+
+DLLFCT void GLEArcUpdateCurvedArrowHeads(GLECurvedArrowHead* head_start,
+ GLECurvedArrowHead* head_end,
+ double* t1,
+ double* t2,
+ GLEPropertyStore* props,
+ double fac,
+ int arrow);
+
+DLLFCT double GLEArcNormalizedAngle2(double a1, double a2);
+
+#endif // __GLE_SHAPEMATH__
diff --git a/src/gle/gle-interface/gle-sourcefile.h b/src/gle/gle-interface/gle-sourcefile.h
new file mode 100644
index 0000000..3abbbcd
--- /dev/null
+++ b/src/gle/gle-interface/gle-sourcefile.h
@@ -0,0 +1,140 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#ifndef __GLE_SOURCEFILE__
+#define __GLE_SOURCEFILE__
+
+class GLESourceFile;
+
+class GLESourceLine {
+protected:
+ bool m_Delete;
+ int m_GlobalLineNo;
+ int m_LineNo;
+ string m_Code;
+ string m_Prefix;
+ GLESourceFile* m_File;
+public:
+ GLESourceLine();
+ ~GLESourceLine();
+ inline void setCode(const string& code) { m_Code = code; }
+ inline const string& getCode() { return m_Code; }
+ inline const char* getCodeCStr() { return m_Code.c_str(); }
+ inline void setPrefix(const string& prefix) { m_Prefix = prefix; }
+ inline const string& getPrefix() { return m_Prefix; }
+ inline int getLineNo() { return m_LineNo; }
+ inline void setLineNo(int no) { m_LineNo = no; }
+ inline int getGlobalLineNo() { return m_GlobalLineNo; }
+ inline void setGlobalLineNo(int no) { m_GlobalLineNo = no; }
+ inline void setSource(GLESourceFile* file) { m_File = file; }
+ inline GLESourceFile* getSource() { return m_File; }
+ inline void setDelete(bool del) { m_Delete = del; }
+ inline bool isDelete() { return m_Delete; }
+ bool isEmpty();
+ const string& getFileName();
+ int showLineAbbrev(ostream& out, int focuscol);
+};
+
+class GLESourceFile {
+protected:
+ GLEFileLocation m_File;
+ vector<GLESourceLine*> m_Code;
+ vector<int> m_ToInsertIdx;
+ vector<string> m_ToInsertLine;
+ GLERCVector<GLEObjectDOConstructor> m_Cons;
+public:
+ GLESourceFile();
+ ~GLESourceFile();
+ inline int getNbLines() { return m_Code.size(); }
+ inline GLESourceLine* getLine(int i) { return m_Code[i]; }
+ inline GLEFileLocation* getLocation() { return &m_File; }
+ void trim(int add = 0);
+ void clear();
+ void reNumber();
+ GLESourceLine* addLine();
+ void scheduleInsertLine(int i, const string& str);
+ void performUpdates();
+ int getNextInsertIndex(int line, int pos);
+ void load(istream& input);
+ void load() throw(ParserError);
+ bool tryLoad();
+ inline void addObjectDOConstructor(GLEObjectDOConstructor* cons) { m_Cons.add(cons); }
+ inline int getNbObjectDOConstructors() { return m_Cons.size(); }
+ inline GLEObjectDOConstructor* getObjectDOConstructor(int i) { return m_Cons.get(i); }
+ inline void clearObjectDOConstructors() { m_Cons.clear(); }
+};
+
+class GLEGlobalSource {
+protected:
+ GLESourceFile m_Main;
+ vector<GLESourceFile*> m_Files;
+ vector<GLESourceLine*> m_Code;
+public:
+ GLEGlobalSource();
+ ~GLEGlobalSource();
+ inline GLESourceFile* getMainFile() { return &m_Main; }
+ inline GLEFileLocation* getLocation() { return m_Main.getLocation(); }
+ inline int getNbLines() { return m_Code.size(); }
+ inline GLESourceLine* getLine(int i) { return m_Code[i]; }
+ inline const string& getLineCode(int i) { return m_Code[i]->getCode(); }
+ inline void addLine(GLESourceLine* line) { m_Code.push_back(line); }
+ inline int getNbFiles() { return m_Files.size(); }
+ inline GLESourceFile* getFile(int i) { return m_Files[i]; }
+ void clear();
+ GLESourceFile* createNew();
+ bool includes(const string& file);
+ void initFromMain();
+ void insertInclude(int offs, GLESourceFile* file);
+ void insertIncludeNoOverwrite(int offs, GLESourceFile* file);
+ void reNumber();
+ void addLine(const string& code);
+ void updateLine(int i, const string& code);
+ void scheduleDeleteLine(int i);
+ void scheduleInsertLine(int i, const string& str);
+ void performUpdates();
+ void sourceLineFileAndNumber(int line, ostream& err);
+ void load() throw(ParserError);
+ bool tryLoad();
+ void clearObjectDOConstructors();
+};
+
+int showLineAbbrev(const string& text, int focuscol, ostream& out);
+void sourceLineFileAndNumber(int globalLine, ostream& out);
+
+#endif
+
diff --git a/src/gle/gle-poppler.cpp b/src/gle/gle-poppler.cpp
new file mode 100644
index 0000000..cde6b8f
--- /dev/null
+++ b/src/gle/gle-poppler.cpp
@@ -0,0 +1,393 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#include "all.h"
+#include "gle-poppler.h"
+#include "cutils.h"
+#include "gle-interface/gle-const.h"
+#include "core.h"
+
+void gle_write_ostream(void* closure, char* data, int length) {
+ std::ostream* file = (std::ostream*)closure;
+ file->write(data, length);
+}
+
+struct GLEWriteFuncAndClosure {
+ gle_write_func writeFunc;
+ void* closure;
+};
+
+#ifdef HAVE_CAIRO
+
+#ifdef HAVE_LIBPNG
+
+#include <png.h>
+
+void gle_png_write_data_fn(png_structp png_ptr, png_bytep data, png_size_t length) {
+ GLEWriteFuncAndClosure* writeCallback = (GLEWriteFuncAndClosure*)png_get_io_ptr(png_ptr);
+ writeCallback->writeFunc(writeCallback->closure, (char*)data, (int)length);
+}
+
+void gle_png_flush_fn(png_structp /* png_ptr */) {
+}
+
+void gle_write_cairo_surface_png(cairo_surface_t* surface,
+ int options,
+ gle_write_func writeFunc,
+ void* closure) {
+ png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
+ if (!png_ptr) {
+ CUtilsAssertMessage("png_create_write_struct failed");
+ }
+ png_infop info_ptr = png_create_info_struct(png_ptr);
+ if (!info_ptr) {
+ CUtilsAssertMessage("png_create_info_struct failed");
+ }
+ if (setjmp(png_jmpbuf(png_ptr))) {
+ CUtilsAssertMessage("png_set_write_fn failed");
+ }
+ GLEWriteFuncAndClosure writeCallback;
+ writeCallback.writeFunc = writeFunc;
+ writeCallback.closure = closure;
+ png_set_write_fn(png_ptr, (void*)&writeCallback, gle_png_write_data_fn, gle_png_flush_fn);
+ if (setjmp(png_jmpbuf(png_ptr))) {
+ CUtilsAssertMessage("png_set_IHDR failed");
+ }
+ int width = cairo_image_surface_get_width(surface);
+ int height = cairo_image_surface_get_height(surface);
+ int channels = 3;
+ int color_type = PNG_COLOR_TYPE_RGB;
+ if ((options & GLE_OUTPUT_OPTION_TRANSPARENT) != 0) {
+ color_type = PNG_COLOR_TYPE_RGBA;
+ channels = 4;
+ }
+ bool grayScale = false;
+ if ((options & GLE_OUTPUT_OPTION_GRAYSCALE) != 0) {
+ grayScale = true;
+ if (color_type != PNG_COLOR_TYPE_RGBA) {
+ color_type = PNG_COLOR_TYPE_GRAY;
+ channels = 1;
+ }
+ }
+ png_set_IHDR(png_ptr, info_ptr, width, height,
+ 8, color_type, PNG_INTERLACE_NONE,
+ PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
+ png_write_info(png_ptr, info_ptr);
+ if (setjmp(png_jmpbuf(png_ptr))) {
+ CUtilsAssertMessage("png_write_image failed");
+ }
+ int rowBytes = png_get_rowbytes(png_ptr, info_ptr);
+ unsigned char* imageData = cairo_image_surface_get_data(surface);
+ int stride = cairo_image_surface_get_stride(surface);
+ CUtilsAssert(imageData != 0);
+ png_bytep* row_pointers = (png_bytep*)malloc(sizeof(png_bytep) * height);
+ for (int y = 0; y < height; y++) {
+ png_byte* row = (png_byte*)malloc(rowBytes);
+ row_pointers[y] = row;
+ for (int x = 0; x < width; x++) {
+ png_byte* ptr = &(row[x * channels]);
+ unsigned int value = *(unsigned int*)(&imageData[x*4 + y*stride]);
+ if (grayScale == 1) {
+ int blue = value & 0xFF; /* blue */
+ value >>= 8;
+ int green = value & 0xFF; /* green */
+ value >>= 8;
+ int red = value & 0xFF; /* red */
+ double gray = (3.0 * red / 255.0 + 2.0 * green / 255.0 + 1.0 * blue / 255.0) / 6.0 * 255.0;
+ int gray_i = std::min<int>(gle_round_int(gray), 0xFF);
+ if (channels == 1) {
+ *ptr = (png_byte)gray_i;
+ } else {
+ ptr[2] = (png_byte)gray_i;
+ ptr[1] = (png_byte)gray_i;
+ ptr[0] = (png_byte)gray_i;
+ value >>= 8;
+ ptr[3] = value & 0xFF; /* alpha */
+ }
+ } else {
+ ptr[2] = value & 0xFF; /* blue */
+ value >>= 8;
+ ptr[1] = value & 0xFF; /* green */
+ value >>= 8;
+ ptr[0] = value & 0xFF; /* red */
+ if (channels == 4) {
+ value >>= 8;
+ ptr[3] = value & 0xFF; /* alpha */
+ }
+ }
+ }
+ }
+ png_write_image(png_ptr, row_pointers);
+ if (setjmp(png_jmpbuf(png_ptr))) {
+ CUtilsAssertMessage("png_write_end failed");
+ }
+ png_write_end(png_ptr, NULL);
+ for (int y = 0; y < height; y++) {
+ free(row_pointers[y]);
+ }
+ free(row_pointers);
+}
+
+#endif // HAVE_LIBPNG
+
+#ifdef HAVE_LIBJPEG
+
+extern "C" {
+ #include <jpeglib.h>
+}
+
+#define GLE_JPEG_BUFFER_SIZE 50000
+
+struct gle_jpeg_destination_mgr {
+ struct jpeg_destination_mgr pub;
+ JOCTET* buffer;
+ GLEWriteFuncAndClosure writeCallback;
+};
+
+void gle_jpeg_init_destination(j_compress_ptr cinfo) {
+ gle_jpeg_destination_mgr* dest = (gle_jpeg_destination_mgr*)cinfo->dest;
+ dest->pub.next_output_byte = dest->buffer;
+ dest->pub.free_in_buffer = GLE_JPEG_BUFFER_SIZE;
+}
+
+void gle_jpeg_term_destination(j_compress_ptr cinfo) {
+ gle_jpeg_destination_mgr* dest = (gle_jpeg_destination_mgr*)cinfo->dest;
+ int size = GLE_JPEG_BUFFER_SIZE - dest->pub.free_in_buffer;
+ dest->writeCallback.writeFunc(dest->writeCallback.closure, (char*)dest->buffer, size);
+}
+
+boolean gle_jpeg_empty_output_buffer(j_compress_ptr cinfo) {
+ gle_jpeg_term_destination(cinfo);
+ gle_jpeg_init_destination(cinfo);
+ return true;
+}
+
+void gle_jpeg_memory_dest(j_compress_ptr cinfo, JOCTET* buffer, GLEWriteFuncAndClosure writeCallback) {
+ if (cinfo->dest == 0) {
+ cinfo->dest = (struct jpeg_destination_mgr*)(*cinfo->mem->alloc_small)((j_common_ptr) cinfo,
+ JPOOL_PERMANENT,
+ sizeof(gle_jpeg_destination_mgr));
+ }
+ gle_jpeg_destination_mgr* dest = (gle_jpeg_destination_mgr*)cinfo->dest;
+ dest->buffer = buffer;
+ dest->writeCallback = writeCallback;
+ dest->pub.init_destination = gle_jpeg_init_destination;
+ dest->pub.empty_output_buffer = gle_jpeg_empty_output_buffer;
+ dest->pub.term_destination = gle_jpeg_term_destination;
+}
+
+void gle_write_cairo_surface_jpeg(cairo_surface_t* surface,
+ int options,
+ gle_write_func writeFunc,
+ void* closure)
+{
+ struct jpeg_compress_struct cinfo;
+ struct jpeg_error_mgr jerr;
+ cinfo.err = jpeg_std_error(&jerr);
+ jpeg_create_compress(&cinfo);
+ GLEWriteFuncAndClosure writeCallback;
+ writeCallback.writeFunc = writeFunc;
+ writeCallback.closure = closure;
+ JOCTET buffer[GLE_JPEG_BUFFER_SIZE];
+ gle_jpeg_memory_dest(&cinfo, buffer, writeCallback);
+ int width = cairo_image_surface_get_width(surface);
+ int height = cairo_image_surface_get_height(surface);
+ cinfo.image_width = width;
+ cinfo.image_height = height;
+ if ((options & GLE_OUTPUT_OPTION_GRAYSCALE) != 0) {
+ cinfo.input_components = 1;
+ cinfo.in_color_space = JCS_GRAYSCALE;
+ } else {
+ cinfo.input_components = 3;
+ cinfo.in_color_space = JCS_RGB;
+ }
+ jpeg_set_defaults(&cinfo);
+ jpeg_start_compress(&cinfo, true);
+ JSAMPROW row = new JSAMPLE[cinfo.input_components * width];
+ JSAMPROW row_pointer[1];
+ row_pointer[0] = row;
+ unsigned char* imageData = cairo_image_surface_get_data(surface);
+ int stride = cairo_image_surface_get_stride(surface);
+ CUtilsAssert(imageData != 0);
+ for (int y = 0; y < height; y++) {
+ for (int x = 0; x < width; x++) {
+ JSAMPLE* ptr = &(row[x * cinfo.input_components]);
+ unsigned int value = *(unsigned int*)(&imageData[x*4 + y*stride]);
+ if (cinfo.input_components == 1) {
+ int blue = value & 0xFF; /* blue */
+ value >>= 8;
+ int green = value & 0xFF; /* green */
+ value >>= 8;
+ int red = value & 0xFF; /* red */
+ double gray = (3.0 * red / 255.0 + 2.0 * green / 255.0 + 1.0 * blue / 255.0) / 6.0 * 255.0;
+ int gray_i = std::min<int>(gle_round_int(gray), 0xFF);
+ *ptr = (JSAMPLE)gray_i;
+ } else {
+ ptr[2] = value & 0xFF; /* blue */
+ value >>= 8;
+ ptr[1] = value & 0xFF; /* green */
+ value >>= 8;
+ ptr[0] = value & 0xFF; /* red */
+ }
+ }
+ jpeg_write_scanlines(&cinfo, row_pointer, 1);
+ }
+ delete[] row;
+ jpeg_finish_compress(&cinfo);
+ jpeg_destroy_compress(&cinfo);
+}
+
+#endif // HAVE_LIBJPEG
+
+void gle_write_cairo_surface_bitmap(cairo_surface_t* surface,
+ int device,
+ int options,
+ gle_write_func writeFunc,
+ void* closure)
+{
+#ifdef HAVE_LIBPNG
+ if (device == GLE_DEVICE_PNG) {
+ gle_write_cairo_surface_png(surface, options, writeFunc, closure);
+ return;
+ }
+#endif // HAVE_LIBPNG
+#ifdef HAVE_LIBJPEG
+ if (device == GLE_DEVICE_JPEG) {
+ gle_write_cairo_surface_jpeg(surface, options, writeFunc, closure);
+ return;
+ }
+#endif // HAVE_LIBJPEG
+ g_throw_parser_error(">> unsupported bitmap output type '", g_device_to_ext(device), "'");
+}
+
+#ifdef HAVE_POPPLER
+
+#include <glib.h>
+#include <poppler.h>
+
+void gle_glib_init(int /* argc */, char** /* argv */) {
+ g_type_init();
+}
+
+void gle_convert_pdf_to_image(char* pdfData,
+ int pdfLength,
+ double resolution,
+ int device,
+ int options,
+ gle_write_func writeFunc,
+ void* closure)
+{
+ GError* err = 0;
+ PopplerDocument* doc = poppler_document_new_from_data(pdfData, pdfLength, 0, &err);
+ if (doc == 0) {
+ std::ostringstream errMsg;
+ errMsg << ">> error opening PDF: " << err->message;
+ g_object_unref(err);
+ g_throw_parser_error(errMsg.str());
+ }
+ PopplerPage* page = poppler_document_get_page(doc, 0);
+ if (page == 0) {
+ g_object_unref(doc);
+ g_throw_parser_error(">> error opening PDF: can't read first page");
+ }
+ double width, height;
+ poppler_page_get_size(page, &width, &height);
+ int i_width = gle_round_int(width / PS_POINTS_PER_INCH * resolution);
+ int i_height = gle_round_int(height / PS_POINTS_PER_INCH * resolution);
+ cairo_format_t format = CAIRO_FORMAT_RGB24;
+ if ((options & GLE_OUTPUT_OPTION_TRANSPARENT) != 0 && device == GLE_DEVICE_PNG) {
+ format = CAIRO_FORMAT_ARGB32;
+ }
+ cairo_surface_t* surface = cairo_image_surface_create(format, i_width, i_height);
+ cairo_t* cr = cairo_create(surface);
+ if (format == CAIRO_FORMAT_RGB24) {
+ cairo_set_source_rgb (cr, 1.0, 1.0, 1.0);
+ cairo_paint(cr);
+ }
+ cairo_scale(cr, resolution / PS_POINTS_PER_INCH, resolution / PS_POINTS_PER_INCH);
+ poppler_page_render(page, cr);
+ gle_write_cairo_surface_bitmap(surface, device, options, writeFunc, closure);
+ cairo_destroy(cr);
+ cairo_surface_destroy(surface);
+ g_object_unref(page);
+ g_object_unref(doc);
+}
+
+void gle_convert_pdf_to_image_file(char* pdfData,
+ int pdfLength,
+ double resolution,
+ int device,
+ int options,
+ const char* fname)
+{
+ std::ofstream file(fname, ios_base::out | ios_base::binary);
+ if (!file.is_open()) {
+ g_throw_parser_error(">> error creating '", fname, "'");
+ }
+ gle_convert_pdf_to_image(pdfData,
+ pdfLength,
+ resolution,
+ device,
+ options,
+ gle_write_ostream,
+ static_cast<std::ostream*>(&file));
+ file.close();
+}
+
+#endif // HAVE_POPPLER
+
+#endif // HAVE_CAIRO
+
+#ifndef HAVE_POPPLER
+
+// stubs
+
+void gle_glib_init(int /* argc */, char** /* argv */) {
+}
+
+void gle_convert_pdf_to_image(char* /* pdfData */,
+ int /* pdfLength */,
+ double /* resolution */,
+ int /* device */,
+ int /* options */,
+ gle_write_func /* writeFunc */,
+ void* /* closure */)
+{
+}
+
+#endif // !HAVE_POPPLER
diff --git a/src/gle/gle-poppler.h b/src/gle/gle-poppler.h
new file mode 100644
index 0000000..3101913
--- /dev/null
+++ b/src/gle/gle-poppler.h
@@ -0,0 +1,78 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#ifndef INCLUDE_GLE_POPPLER_H
+#define INCLUDE_GLE_POPPLER_H
+
+#define GLE_OUTPUT_OPTION_TRANSPARENT 1
+#define GLE_OUTPUT_OPTION_GRAYSCALE 2
+
+typedef void (*gle_write_func)(void* closure, char* data, int length);
+
+void gle_glib_init(int argc, char** argv);
+
+void gle_convert_pdf_to_image(char* pdfData,
+ int pdfLength,
+ double resolution,
+ int device,
+ int options,
+ gle_write_func writeFunc,
+ void* closure);
+
+#ifdef HAVE_CAIRO
+
+#include <cairo.h>
+
+void gle_write_cairo_surface_bitmap(cairo_surface_t* surface,
+ int device,
+ int options,
+ gle_write_func writeFunc,
+ void* closure);
+
+#ifdef HAVE_POPPLER
+
+void gle_convert_pdf_to_image_file(char* pdfData,
+ int pdfLength,
+ double resolution,
+ int device,
+ int options,
+ const char* fname);
+
+#endif // HAVE_POPPLER
+#endif // HAVE_CAIRO
+#endif // INCLUDE_GLE_POPPLER_H
diff --git a/src/gle/gle-sourcefile.cpp b/src/gle/gle-sourcefile.cpp
new file mode 100644
index 0000000..21cc861
--- /dev/null
+++ b/src/gle/gle-sourcefile.cpp
@@ -0,0 +1,398 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+// #define DEBUG_UPDATE
+
+#include "all.h"
+#include "gle-interface/gle-interface.h"
+#include "stdio.h"
+#include "cutils.h"
+
+int showLineAbbrev(const string& text, int focuscol, ostream& out) {
+ int delta = 0;
+ int show_max = 60;
+ if (focuscol < 0) focuscol = 0;
+ int first = focuscol-show_max/2;
+ if (first < 0) first = 0;
+ int last = first+show_max;
+ if (last > (int)text.length()-1) {
+ last = text.length()-1;
+ first = last-show_max;
+ if (first < 0) first = 0;
+ }
+ if (first != 0) {
+ out << "...";
+ delta = first - 3;
+ }
+ for (int i = first; i <= last; i++) {
+ out << (char)text[i];
+ }
+ if (last != (int)text.length()-1) {
+ out << "...";
+ }
+ return delta;
+}
+
+GLESourceLine::GLESourceLine() {
+ m_GlobalLineNo = 0;
+ m_LineNo = 0;
+ m_File = NULL;
+ m_Delete = false;
+}
+
+GLESourceLine::~GLESourceLine() {
+}
+
+const string& GLESourceLine::getFileName() {
+ return m_File->getLocation()->getName();
+}
+
+int GLESourceLine::showLineAbbrev(ostream& out, int focuscol) {
+ return ::showLineAbbrev(getCode(), focuscol, out);
+}
+
+bool GLESourceLine::isEmpty() {
+ return gle_onlyspace(m_Code);
+}
+
+GLESourceFile::GLESourceFile() {
+}
+
+GLESourceFile::~GLESourceFile() {
+ for (unsigned int i = 0; i < m_Code.size(); i++) {
+ delete m_Code[i];
+ }
+}
+
+GLESourceLine* GLESourceFile::addLine() {
+ int line_no = getNbLines() + 1;
+ GLESourceLine* line = new GLESourceLine();
+ line->setLineNo(line_no);
+ line->setSource(this);
+ m_Code.push_back(line);
+ return line;
+}
+
+void GLESourceFile::scheduleInsertLine(int i, const string& str) {
+ m_ToInsertIdx.push_back(i);
+ m_ToInsertLine.push_back(str);
+}
+
+int GLESourceFile::getNextInsertIndex(int line, int pos) {
+ while (pos < (int)m_ToInsertIdx.size() && m_ToInsertIdx[pos] < line) {
+ pos++;
+ }
+ if (pos < (int)m_ToInsertIdx.size()) {
+ return m_ToInsertIdx[pos];
+ } else {
+ return -1;
+ }
+}
+
+void GLESourceFile::performUpdates() {
+ /* copy to tmp */
+ int nb_old = getNbLines();
+ vector<GLESourceLine*> tmp;
+ tmp.resize(nb_old);
+ for (int i = 0; i < nb_old; i++) {
+ tmp[i] = getLine(i);
+ }
+ m_Code.clear();
+ /* copy back one by one */
+ unsigned int ins_pos = 0;
+ #ifdef DEBUG_UPDATE
+ cout << "Performing updates: " << m_ToInsertIdx.size() << endl;
+ #endif
+ for (int i = 0; i < nb_old; i++) {
+ GLESourceLine* line = tmp[i];
+ int nxt = getNextInsertIndex(i, ins_pos);
+ if (nxt == i) {
+ /* may insert multiple lines */
+ while (ins_pos < m_ToInsertIdx.size() && m_ToInsertIdx[ins_pos] == i) {
+ #ifdef DEBUG_UPDATE
+ cout << "Inserting line at: " << i << endl;
+ cout << "Inserting line code: '" << m_ToInsertLine[ins_pos] << "'" << endl;
+ #endif
+ GLESourceLine* new_line = new GLESourceLine();
+ new_line->setSource(this);
+ new_line->setCode(m_ToInsertLine[ins_pos]);
+ m_Code.push_back(new_line);
+ ins_pos++;
+ }
+ }
+ if (line->isDelete()) {
+ /* should delete a line? */
+ delete line;
+ } else {
+ /* just copy old line */
+ #ifdef DEBUG_UPDATE
+ cout << "Copy line: '" << line->getCode() << "'" << endl;
+ #endif
+ m_Code.push_back(line);
+ }
+ }
+ /* renumber and clear update stacks */
+ reNumber();
+ m_ToInsertIdx.clear();
+ m_ToInsertLine.clear();
+}
+
+void GLESourceFile::trim(int add) {
+ int pos = getNbLines()-1;
+ while (pos >= 0 && getLine(pos)->isEmpty()) {
+ delete getLine(pos);
+ pos--;
+ }
+ pos++;
+ if (pos < getNbLines()) {
+ m_Code.erase(m_Code.begin()+pos, m_Code.end());
+ }
+ for (int i = 0; i < add; i++) {
+ addLine();
+ }
+}
+
+void GLESourceFile::clear() {
+ m_Code.clear();
+ m_ToInsertIdx.clear();
+ m_ToInsertLine.clear();
+}
+
+void GLESourceFile::reNumber() {
+ for (int i = 0; i < getNbLines(); i++) {
+ GLESourceLine* sline = getLine(i);
+ sline->setLineNo(i + 1);
+ }
+}
+
+void GLESourceFile::load(istream& input) {
+ // load the input and rememeber to look for continuation character
+ const char CONT_CHAR = '&'; // should be a global define somewhere??
+ bool cont = false;
+ string inbuff;
+ while (input.good()) {
+ string linbuff;
+ getline(input, linbuff);
+ // trim is required to make position indicator in error messages appear correctly
+ str_trim_right(linbuff);
+ if (cont) {
+ // -- splice this string into inbuff at location of '&'
+ str_trim_left(linbuff);
+ inbuff.replace(inbuff.rfind(CONT_CHAR),linbuff.length(),linbuff);
+ cont = false;
+ } else {
+ // -- ignore BOM in Unicode input
+ str_trim_left_bom(linbuff);
+ inbuff = linbuff;
+ }
+ // -- search for continuation character '&' if found
+ if (inbuff.length() > 0 && inbuff.at(inbuff.length()-1) == CONT_CHAR) {
+ // -- continuation
+ cont = true;
+ }
+ if (!cont || input.eof()){
+ string prefix;
+ GLESourceLine* sline = addLine();
+ str_trim_left(inbuff, prefix);
+ sline->setPrefix(prefix);
+ sline->setCode(inbuff);
+ }
+ }
+}
+
+void GLESourceFile::load() throw(ParserError) {
+ // called to load the main script or an include file
+ if (getLocation()->isStdin()) {
+ load(cin);
+ } else {
+ ifstream input;
+ input.open(getLocation()->getFullPath().c_str());
+ if (!input.is_open()) {
+ g_throw_parser_error("file not found: '", getLocation()->getName().c_str(), "'");
+ }
+ load(input);
+ input.close();
+ }
+}
+
+bool GLESourceFile::tryLoad() {
+ // called to read configuration file
+ ifstream input;
+ input.open(getLocation()->getFullPath().c_str());
+ if (!input.is_open()) {
+ return false;
+ }
+ load(input);
+ input.close();
+ return true;
+}
+
+GLEGlobalSource::GLEGlobalSource() {
+}
+
+GLEGlobalSource::~GLEGlobalSource() {
+}
+
+void GLEGlobalSource::clear() {
+ m_Code.clear();
+ m_Files.clear();
+ m_Main.clear();
+}
+
+GLESourceFile* GLEGlobalSource::createNew() {
+ clear();
+ return &m_Main;
+}
+
+void GLEGlobalSource::addLine(const string& code) {
+ GLESourceLine* sline = getMainFile()->addLine();
+ sline->setCode(code);
+ addLine(sline);
+}
+
+void GLEGlobalSource::updateLine(int i, const string& code) {
+ getLine(i)->setCode(code);
+}
+
+void GLEGlobalSource::scheduleDeleteLine(int i) {
+ getLine(i)->setDelete(true);
+}
+
+void GLEGlobalSource::scheduleInsertLine(int i, const string& str) {
+ GLESourceLine* sline = getLine(i);
+ GLESourceFile* src = sline->getSource();
+ src->scheduleInsertLine(sline->getLineNo() - 1, str);
+}
+
+void GLEGlobalSource::performUpdates() {
+ m_Main.performUpdates();
+ for (int i = 0; i < getNbFiles(); i++) {
+ getFile(i)->performUpdates();
+ }
+ /* Note: this compiles as if all include files came up front */
+ m_Code.clear();
+ for (int i = 0; i < getNbFiles(); i++) {
+ GLESourceFile* file = getFile(i);
+ for (int i = 0; i < file->getNbLines(); i++) {
+ m_Code.push_back(file->getLine(i));
+ }
+ }
+ GLESourceFile* main = getMainFile();
+ for (int i = 0; i < main->getNbLines(); i++) {
+ m_Code.push_back(main->getLine(i));
+ }
+ reNumber();
+}
+
+void GLEGlobalSource::reNumber() {
+ for (int i = 0; i < getNbLines(); i++) {
+ GLESourceLine* sline = getLine(i);
+ sline->setGlobalLineNo(i + 1);
+ }
+}
+
+void GLEGlobalSource::initFromMain() {
+ m_Code.clear();
+ GLESourceFile* main = getMainFile();
+ for (int i = 0; i < main->getNbLines(); i++) {
+ m_Code.push_back(main->getLine(i));
+ }
+ reNumber();
+}
+
+void GLEGlobalSource::insertInclude(int offs, GLESourceFile* file) {
+ m_Files.push_back(file);
+ if (file->getNbLines() > 0) {
+ m_Code.insert(m_Code.begin()+offs+1, file->getNbLines()-1, (GLESourceLine*)NULL);
+ for (int i = 0; i < file->getNbLines(); i++) {
+ m_Code[offs+i] = file->getLine(i);
+ }
+ reNumber();
+ }
+}
+
+void GLEGlobalSource::insertIncludeNoOverwrite(int offs, GLESourceFile* file) {
+ m_Files.push_back(file);
+ if (file->getNbLines() > 0) {
+ m_Code.insert(m_Code.begin()+offs, file->getNbLines(), (GLESourceLine*)NULL);
+ for (int i = 0; i < file->getNbLines(); i++) {
+ m_Code[offs+i] = file->getLine(i);
+ }
+ reNumber();
+ }
+}
+
+bool GLEGlobalSource::includes(const string& file) {
+ for (vector<GLESourceFile*>::size_type i = 0; i < m_Files.size(); i++) {
+ if (str_i_equals(m_Files[i]->getLocation()->getName(), file)) return true;
+ }
+ return false;
+}
+
+void GLEGlobalSource::sourceLineFileAndNumber(int line, ostream& err) {
+ int max = getNbLines();
+ if (line < 0 || line >= max) {
+ err << "[OUT OF RANGE: " << line << "]";
+ } else {
+ GLESourceLine* srclin = getLine(line);
+ err << srclin->getFileName() << ":" << srclin->getLineNo();
+ }
+}
+
+void GLEGlobalSource::load() throw(ParserError) {
+ GLESourceFile* main = getMainFile();
+ main->load();
+ main->trim(0);
+ initFromMain();
+}
+
+bool GLEGlobalSource::tryLoad() {
+ // called to read configuration file
+ GLESourceFile* main = getMainFile();
+ bool res = main->tryLoad();
+ main->trim(0);
+ initFromMain();
+ return res;
+}
+
+void GLEGlobalSource::clearObjectDOConstructors() {
+ getMainFile()->clearObjectDOConstructors();
+ for (int i = 0; i < getNbFiles(); i++) {
+ getFile(i)->clearObjectDOConstructors();
+ }
+}
diff --git a/src/gle/gle.cpp b/src/gle/gle.cpp
new file mode 100644
index 0000000..9b62bc7
--- /dev/null
+++ b/src/gle/gle.cpp
@@ -0,0 +1,1304 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#define GLE_MAIN_CPP
+
+#include "all.h"
+#include "tokens/Tokenizer.h"
+#include "core.h"
+#include "mem_limits.h"
+#include "file_io.h"
+#include "cutils.h"
+#include "cmdline.h"
+#include "texinterface.h"
+#include "config.h"
+#include "drawit.h"
+#include "gle-interface/gle-interface.h"
+#include "gle-poppler.h"
+
+#ifdef __WIN32__
+ #include <io.h>
+#endif
+
+#include <set>
+
+/*------------ GLOBAL VARIABLES --------------*/
+//
+// -- these globals are needed. they are called in other source files using extern...
+//
+int gle_debug;
+bool control_d = true;
+extern int trace_on;
+bool IS_INSTALL = false;
+bool GS_PREVIEW = false;
+
+void do_find_deps(CmdLineObj& cmdline);
+void gle_as_a_calculator(vector<string>* exprs);
+
+extern string GLE_TOP_DIR;
+extern string GLE_BIN_DIR;
+string GLE_WORKING_DIR;
+
+class GLEOptions {
+public:
+ bool ASK_DEBUG;
+};
+
+/* Better to put all global options in one class? */
+GLEOptions g_Options;
+CmdLineObj g_CmdLine;
+ConfigCollection g_Config;
+
+void load_one_file(const char* name, CmdLineObj& cmdline, size_t* exit_code);
+void load_one_file_stdin(CmdLineObj& cmdline, size_t* exit_code);
+void init_option_args(CmdLineObj& cmdline);
+void do_gen_inittex(CmdLineObj& cmdline, GLEOptions& options) throw(ParserError);
+void process_option_args(CmdLineObj& cmdline, GLEOptions& options);
+void do_run_other_version(ConfigCollection& coll, int argc, char **argv);
+void gle_do_socket(const string& commands);
+void gle_cleanup();
+void tex_term();
+void do_show_info();
+void get_out_name(const string& name, CmdLineObj& cmdline, GLEFileLocation* outname);
+
+#include "glearray.h"
+
+void gle_cat_csv(vector<string>* files) {
+ for (unsigned int i = 0; i < files->size(); i++) {
+ string fname(files->at(i));
+ GLECSVData csvData;
+ csvData.read(fname);
+ GLECSVError* error = csvData.getError();
+ if (error->errorCode != GLECSVErrorNone) {
+ cout << "error: " << error->errorString << endl;
+ } else {
+ csvData.print(cout);
+ }
+ }
+}
+
+#if defined(HAVE_LIBGLE) && !defined(HAVE_LIBGLE_STATIC)
+int GLEMain(int argc, char **argv) {
+#else
+int main(int argc, char **argv) {
+#endif
+ try {
+ gle_glib_init(argc, argv);
+ g_init();
+
+ /* Init and process command line arguments */
+ init_config(&g_Config);
+ init_option_args(g_CmdLine);
+ if (!do_load_config("gle", argv, g_CmdLine, g_Config)) {
+ return -1;
+ }
+ do_run_other_version(g_Config, argc, argv);
+ g_CmdLine.parse(argc, argv);
+
+ /* Error in command line arguments? */
+ if (g_CmdLine.hasError()) {
+ return -1;
+ }
+
+ /* Has calculator option? */
+ if (g_CmdLine.hasOption(GLE_OPT_CALC)) {
+ if (g_CmdLine.getNbMainArgs() == 0) {
+ gle_as_a_calculator(NULL);
+ } else {
+ gle_as_a_calculator(g_CmdLine.getMainArgs());
+ }
+ return 0;
+ }
+
+ /* Cat CSV file to stdout? */
+ if (g_CmdLine.hasOption(GLE_OPT_CATCSV) && g_CmdLine.getNbMainArgs() != 0) {
+ gle_cat_csv(g_CmdLine.getMainArgs());
+ return 0;
+ }
+
+ /* Should regenerate inittex.ini? */
+ do_gen_inittex(g_CmdLine, g_Options);
+
+ /* Find dependencies */
+ do_find_deps(g_CmdLine);
+
+ /* Get working directory */
+ GLEGetCrDir(&GLE_WORKING_DIR);
+
+ /* This is used by the GUI */
+ if (g_CmdLine.hasOption(GLE_OPT_INFO)) {
+ do_show_info();
+ }
+
+ if (g_CmdLine.getNbMainArgs() == 0 || g_CmdLine.hasOption(GLE_OPT_HELP)) {
+ string version;
+ g_get_version(&version);
+ cerr << "GLE version " << version << endl;
+ cerr << "Usage: gle [options] filename.gle" << endl;
+ cerr << "More information: gle " << g_CmdLine.getOptionPrefix() << "help" << endl;
+ if (g_CmdLine.hasOption(GLE_OPT_HELP)) {
+ g_CmdLine.showHelp(GLE_OPT_HELP);
+ if (!g_CmdLine.getOption(GLE_OPT_HELP)->hasArgument()) {
+ cerr << "Give more help about a given option: " << g_CmdLine.getOptionPrefix() << "help option" << endl;
+ }
+ }
+ return 0;
+ }
+
+ /* Process optional arguments */
+ process_option_args(g_CmdLine, g_Options);
+ } catch (ParserError& err) {
+ ostringstream err_str;
+ err_str << "Error: ";
+ err.write(err_str);
+ g_message(err_str.str());
+ return -1;
+ }
+
+ /* iterate over "file" arguments */
+ size_t exit_code = 0;
+ if (g_CmdLine.hasStdin()) {
+ // read file from standard input (in that case there are no other main arguments)
+ load_one_file_stdin(g_CmdLine, &exit_code);
+ }
+ for (int i = 0; i < g_CmdLine.getNbMainArgs(); i++) {
+ // the standard CMD shell didn't expand the wildcards
+#ifdef __WIN32__
+ //
+ // -- globbing and wildcards
+ //
+ _finddata_t fileinfo;
+ string file_dir, file_pattern;
+ SplitFileName(g_CmdLine.getMainArg(i), file_dir, file_pattern);
+ intptr_t File = _findfirst((char*)g_CmdLine.getMainArg(i).c_str(), &fileinfo);
+ if (File != -1){
+ do {
+ string combined_name = file_dir + fileinfo.name;
+ load_one_file(combined_name.c_str(), g_CmdLine, &exit_code);
+ } while(!_findnext(File,&fileinfo));
+ _findclose(File);
+ } else {
+ exit_code = 1;
+ cout << "Can't open file: " << g_CmdLine.getMainArg(i) << endl;
+ }
+#else
+#if defined(__OS2__) && defined(__EMX__)
+ char **list;
+ list = _fnexplode((char*)g_CmdLine.getMainArg(i).c_str());
+ if ( list == NULL ) {
+ load_one_file( g_CmdLine.getMainArg(i).c_str(), g_CmdLine, &exit_code);
+ } else {
+ for ( int i = 0; list[i] != NULL; i++ ) {
+ load_one_file(list[i], g_CmdLine, &exit_code);
+ }
+ }
+ _fnexplodefree(list);
+#else
+ // on Unix the shell expands the wildcards for us
+ load_one_file(g_CmdLine.getMainArg(i).c_str(), g_CmdLine, &exit_code);
+#endif
+#endif
+ }
+ // will exit with the number of files it could NOT open
+ gle_cleanup();
+ if (exit_code != 0 || g_has_console_output()) {
+ do_wait_for_enter();
+ }
+ return exit_code;
+}
+
+void graph_init();
+
+void gle_cleanup() {
+ tex_term();
+ graph_init();
+ delete GLEGetColorList();
+ delete GLEGetInterfacePointer();
+}
+
+void do_run_other_version(ConfigCollection& coll, int argc, char **argv) {
+ // Scan command line for -v option
+ // Note: can not use cmdline here because older versions might have different options
+ // which would result in an error message
+ string version = "";
+ for (int i = 1; i < argc-1; i++) {
+ if (cmdline_is_option(argv[i], "v") ||
+ cmdline_is_option(argv[i], "version")) {
+ version = argv[i+1];
+ str_remove_quote(version);
+ }
+ }
+ if (version != "") {
+ ConfigSection* gle = coll.getSection(GLE_CONFIG_GLE);
+ CmdLineArgSPairList* installs = (CmdLineArgSPairList*)gle->getOption(GLE_CONFIG_GLE_INSTALL)->getArg(0);
+ const string* path = installs->lookup(version);
+ if (path != NULL) {
+ GLESetGLETop(*path);
+ ostringstream torun;
+ torun << "\"" << (*path) << "\"";
+ for (int i = 1; i < argc; i++) {
+ string arg = argv[i];
+ str_remove_quote(arg);
+ if (cmdline_is_option(arg.c_str(), "v")) i++;
+ else torun << " \"" << arg << "\"";
+ }
+ int res = GLESystem(torun.str());
+ if (res != GLE_SYSTEM_OK) {
+ cerr << "Error while running: " << (*path) << endl;
+ }
+ } else {
+ cerr << "Don't know path for version: '" << version << "'" << endl;
+ }
+ exit(0);
+ }
+}
+
+void do_show_info() {
+ string version, bdate;
+ g_get_version(&version);
+ g_get_build_date(&bdate);
+ cout << "GLE version: " << version << endl;
+ if (!bdate.empty()) {
+ cout << "Build date: " << bdate << endl;
+ }
+ cout << "GLE_TOP: " << GLE_TOP_DIR << endl;
+ cout << "GLE_BIN: " << GLE_BIN_DIR << endl;
+ /* Location of GhostScript */
+ string gs_dir;
+ ConfigSection* tools = g_Config.getSection(GLE_CONFIG_TOOLS);
+ const string& gs_cmd = ((CmdLineArgString*)tools->getOptionValue(GLE_TOOL_GHOSTSCRIPT_CMD))->getValue();
+ if (gs_cmd != "") {
+ cout << "GhostScript: " << gs_cmd << endl;
+ }
+ CmdLineArgString* gslib = (CmdLineArgString*)tools->getOptionValue(GLE_TOOL_GHOSTSCRIPT_LIB);
+ if (!gslib->isDefault()) {
+ cout << "GS library: " << gslib->getValue() << endl;
+ }
+ /* Bitmap import */
+ cout << "Bitmap import: " << g_bitmap_supported_types() << endl;
+ /* Cairo support */
+#ifdef HAVE_CAIRO
+ cout << "Cairo rendering support: Yes" << endl;
+#else
+ cout << "Cairo rendering support: No" << endl;
+#endif
+#ifdef HAVE_POPPLER
+ cout << "Poppler PDF support: Yes" << endl;
+#else
+ cout << "Poppler PDF support: No" << endl;
+#endif
+ do_wait_for_enter_exit(0);
+}
+
+void do_gen_inittex(CmdLineObj& cmdline, GLEOptions& options) throw(ParserError) {
+ // Generate inittex.ini from init.tex
+ if (cmdline.hasOption(GLE_OPT_MKINITTEX)) {
+ IS_INSTALL = 1;
+ string inittex = GLE_TOP_DIR + DIR_SEP + "init.tex";
+ GLERC<GLEScript> script = new GLEScript();
+ script->getLocation()->fromFileNameCrDir(inittex);
+ script->getSource()->load();
+ string inittex_ini = GLE_TOP_DIR + DIR_SEP + "inittex.ini";
+ TryDeleteFile(inittex_ini);
+ g_select_device(GLE_DEVICE_DUMMY);
+ GLEFileLocation output;
+ output.createIllegal();
+ DrawIt(script.get(), &output, &cmdline);
+ exit(0);
+ }
+}
+
+void process_option_args(CmdLineObj& cmdline, GLEOptions& options) {
+ if (cmdline.hasOption(GLE_OPT_COMPAT)) {
+ const string& compat = cmdline.getStringValue(GLE_OPT_COMPAT);
+ g_set_compatibility(compat);
+ } else {
+ g_set_compatibility(GLE_COMPAT_MOST_RECENT);
+ }
+ trace_on = cmdline.hasOption(GLE_OPT_TRACE);
+ options.ASK_DEBUG = cmdline.hasOption(GLE_OPT_DEBUG);
+ control_d = !cmdline.hasOption(GLE_OPT_NO_CTRL_D);
+ if (cmdline.hasOption(GLE_OPT_NO_MAXPATH)) {
+ setMaxPSVector(-1);
+ }
+ if (cmdline.hasOption(GLE_OPT_BBTWEAK)) g_psbbtweak();
+ GS_PREVIEW = cmdline.hasOption(GLE_OPT_GSPREVIEW);
+ // .ps output implies full page
+ CmdLineArgSet* device = (CmdLineArgSet*)cmdline.getOption(GLE_OPT_DEVICE)->getArg(0);
+ if (device->hasValue(GLE_DEVICE_PS)) {
+ cmdline.setHasOption(GLE_OPT_FULL_PAGE, true);
+ }
+ if (cmdline.hasOption(GLE_OPT_LANDSCAPE)) {
+ cmdline.setHasOption(GLE_OPT_FULL_PAGE, true);
+ }
+ // remove stdin marker "-" from main arguments
+ cmdline.checkForStdin();
+ // Auto detect extra arguments (after .GLE / .TEX files)
+ // Note that extra arguments can also be supplied by means of -args
+ if (cmdline.getMainArgSepPos() == -1) {
+ int nargs = cmdline.getNbMainArgs();
+ for (int i = 0; i < nargs; i++) {
+ const string& arg = cmdline.getMainArg(i);
+ if (!str_i_ends_with(arg, ".GLE")) {
+ if (i != 0) cmdline.setMainArgSepPos(i);
+ break;
+ }
+ }
+ }
+ // Distable TeX interface
+ if (cmdline.hasOption(GLE_OPT_SAFEMODE)) {
+ TeXInterface* interface = TeXInterface::getInstance();
+ interface->setEnabled(false);
+ }
+ // Process further args into global config object
+ GLEGlobalConfig* conf = GLEGetInterfacePointer()->getConfig();
+ conf->initCmdLine();
+}
+
+void init_option_args(CmdLineObj& cmdline) {
+ CmdLineOption* option;
+ CmdLineArgString* strarg;
+ CmdLineArgInt* intarg;
+ CmdLineArgSet* setarg;
+ cmdline.setMainArgType("file name");
+ option = new CmdLineOption("help", "h", "?");
+ option->setHelp("Shows help about command line options");
+ strarg = new CmdLineArgString("option");
+ strarg->setHelp("show specific help about 'option'");
+ strarg->setCardLimits(0, 1);
+ option->addArg(strarg);
+ cmdline.addOption(option, GLE_OPT_HELP);
+ option = new CmdLineOption("device", "d");
+ option->setHelp("Selects output device(s)");
+ option->setMinNbArgs(1);
+ setarg = new CmdLineArgSet("device-names");
+ setarg->setHelp("set output device(s)");
+ setarg->setMinCard(1);
+ /* Order of values is important! (must match GLE_DEVICE_ constants in core.h) */
+ setarg->addPossibleValue("eps");
+ setarg->addPossibleValue("ps");
+ setarg->addPossibleValue("pdf");
+ setarg->addPossibleValue("svg");
+ setarg->addPossibleValue("jpg");
+ setarg->addPossibleValue("png");
+ setarg->addPossibleValue("x11");
+ setarg->addPossibleValue("emf");
+#ifndef HAVE_X11
+ setarg->setUnsupportedValue(GLE_DEVICE_X11);
+#endif
+#ifndef HAVE_CAIRO
+ setarg->setUnsupportedValue(GLE_DEVICE_SVG);
+ setarg->setUnsupportedValue(GLE_DEVICE_EMF);
+#endif
+#ifndef __WIN32__
+ setarg->setUnsupportedValue(GLE_DEVICE_EMF);
+#endif
+ setarg->addDefaultValue(GLE_DEVICE_EPS);
+ option->addArg(setarg);
+ cmdline.addOption(option, GLE_OPT_DEVICE);
+#ifdef HAVE_CAIRO
+ option = new CmdLineOption("cairo");
+ option->setHelp("Use cairo output device");
+ cmdline.addOption(option, GLE_OPT_CAIRO);
+#endif
+ option = new CmdLineOption("fullpage");
+ option->setHelp("Selects full page output");
+ cmdline.addOption(option, GLE_OPT_FULL_PAGE);
+ option = new CmdLineOption("landscape");
+ option->setHelp("Selects full page landscape output");
+ cmdline.addOption(option, GLE_OPT_LANDSCAPE);
+ option = new CmdLineOption("nocolor", "bw");
+ option->setHelp("Forces grayscale output");
+ cmdline.addOption(option, GLE_OPT_NO_COLOR);
+ option = new CmdLineOption("inverse");
+ option->setHelp("Render black as white for using on dark backgrounds");
+ cmdline.addOption(option, GLE_OPT_INVERSE);
+ option = new CmdLineOption("transparent", "tr");
+ option->setHelp("Creates transparent output (with -d png)");
+ cmdline.addOption(option, GLE_OPT_TRANSPARENT);
+ option = new CmdLineOption("noctrl-d");
+ option->setHelp("Excludes CTRL-D from the PostScript output");
+ cmdline.addOption(option, GLE_OPT_NO_CTRL_D);
+ option = new CmdLineOption("resolution", "r", "dpi");
+ option->setHelp("Sets the resolution for bitmap and PDF output");
+ intarg = new CmdLineArgInt("dpi");
+ intarg->setHelp("set the resolution (measured in dots per inch)");
+ intarg->setCardLimits(0, 1);
+ intarg->setDefault(72);
+ option->addArg(intarg);
+ cmdline.addOption(option, GLE_OPT_DPI);
+ option = new CmdLineOption("tex");
+ option->setHelp("Indicates that the script includes LaTeX expressions");
+ cmdline.addOption(option, GLE_OPT_TEX);
+ option = new CmdLineOption("nopdftex");
+ option->setHelp("Disable PdfLaTeX for .pdf creation");
+ option->setExpert(true);
+ cmdline.addOption(option, GLE_OPT_NO_PDFTEX);
+ option = new CmdLineOption("inc");
+ option->setHelp("Creates an .inc file with LaTeX code");
+ cmdline.addOption(option, GLE_OPT_CREATE_INC);
+ option = new CmdLineOption("texincprefix");
+ option->setHelp("Adds the given subdirectory to the path in the .inc file");
+ strarg = new CmdLineArgString("path");
+ strarg->setHelp("adds 'path' to path in .inc file");
+ strarg->setCardLimits(1, 1);
+ option->addArg(strarg);
+ cmdline.addOption(option, GLE_OPT_TEXINCPREF);
+ option = new CmdLineOption("finddeps");
+ option->setHelp("Automatically finds dependencies");
+ strarg = new CmdLineArgString("path");
+ strarg->setHelp("find dependencies in 'path'");
+ strarg->setCardLimits(0, 1);
+ // Default value should also be set if no value is given?
+ option->addArg(strarg);
+ cmdline.addOption(option, GLE_OPT_FINDDEPS);
+ option = new CmdLineOption("preview", "p");
+ option->setHelp("Previews the output with QGLE");
+ cmdline.addOption(option, GLE_OPT_PREVIEW);
+#ifdef ENABLE_GS_PREVIEW
+ option = new CmdLineOption("gs");
+ option->setHelp("Previews the output with GhostScript");
+ cmdline.addOption(option, GLE_OPT_GSPREVIEW);
+#endif
+ option = new CmdLineOption("calc", "c");
+ option->setHelp("Runs GLE in \"calculator\" mode");
+ cmdline.addOption(option, GLE_OPT_CALC);
+ option = new CmdLineOption("catcsv", "csv");
+ option->setHelp("Pretty print a CSV file to standard output");
+ cmdline.addOption(option, GLE_OPT_CATCSV);
+ option = new CmdLineOption("output", "o");
+ option->setHelp("Specifies the name of the output file");
+ strarg = new CmdLineArgString("name");
+ strarg->setHelp("writes output to file 'name'");
+ strarg->setCardLimits(1, 1);
+ option->addArg(strarg);
+ cmdline.addOption(option, GLE_OPT_OUTPUT);
+ option = new CmdLineOption("nosave");
+ option->setHelp("Don't write output file to disk (dry-run)");
+ cmdline.addOption(option, GLE_OPT_NOSAVE);
+#if defined(__WIN32__) and defined(HAVE_CAIRO)
+ option = new CmdLineOption("copy");
+ option->setHelp("Copy resulting figure to clipboard (only EMF)");
+ cmdline.addOption(option, GLE_OPT_COPY);
+#endif
+ option = new CmdLineOption("compatibility", "cm");
+ option->setHelp("Selects a GLE compatibility mode");
+ strarg = new CmdLineArgString("version");
+ strarg->setHelp("specifies GLE version to emulate (can be any existing GLE version)");
+ option->addArg(strarg);
+ cmdline.addOption(option, GLE_OPT_COMPAT);
+ option = new CmdLineOption("version", "v");
+ option->setHelp("Selects a GLE version to run");
+ setarg = new CmdLineArgSet("version");
+ setarg->setHelp("run GLE version 'version'");
+ setarg->setMinCard(1);
+ setarg->setMaxCard(1);
+ option->addArg(setarg);
+ cmdline.addOption(option, GLE_OPT_VERSION);
+ option = new CmdLineOption("noligatures");
+ option->setHelp("Disable the use of ligatures for 'fl' and 'fi'");
+ cmdline.addOption(option, GLE_OPT_NO_LIGATURES);
+ option = new CmdLineOption("gsoptions");
+ option->setHelp("Specify additional options for GhostScript");
+ strarg = new CmdLineArgString("value");
+ option->addArg(strarg);
+ cmdline.addOption(option, GLE_OPT_GSOPTIONS);
+ option = new CmdLineOption("safemode");
+ option->setHelp("Disables reading/writing to the file system");
+ cmdline.addOption(option, GLE_OPT_SAFEMODE);
+ option = new CmdLineOption("allowread");
+ option->setHelp("Allows reading from the given path");
+ strarg = new CmdLineArgString("path");
+ option->addArg(strarg);
+ cmdline.addOption(option, GLE_OPT_ALLOWREAD);
+ option = new CmdLineOption("allowwrite");
+ option->setHelp("Allows writing to the given path");
+ strarg = new CmdLineArgString("path");
+ option->addArg(strarg);
+ cmdline.addOption(option, GLE_OPT_ALLOWWRITE);
+ option = new CmdLineOption("keep");
+ option->setHelp("Don't delete temporary files");
+ cmdline.addOption(option, GLE_OPT_KEEP);
+ option = new CmdLineOption("trace");
+ option->setHelp("Trace GLE");
+ option->setExpert(true);
+ cmdline.addOption(option, GLE_OPT_TRACE);
+ option = new CmdLineOption("debug");
+ option->setHelp("Debug GLE");
+ option->setExpert(true);
+ cmdline.addOption(option, GLE_OPT_DEBUG);
+ option = new CmdLineOption("nomaxpath");
+ option->setHelp("Disables the upper-bound on the drawing path complexity");
+ cmdline.addOption(option, GLE_OPT_NO_MAXPATH);
+ option = new CmdLineOption("mkinittex");
+ option->setHelp("Creates \"inittex.ini\" from \"init.tex\"");
+ cmdline.addOption(option, GLE_OPT_MKINITTEX);
+ option = new CmdLineOption("info");
+ option->setHelp("Outputs software version, build date, GLE_TOP, GLE_BIN, etc.");
+ cmdline.addOption(option, GLE_OPT_INFO);
+ option = new CmdLineOption("pause");
+ option->setHelp("Pause if output has been generated");
+ option->setExpert(true);
+ cmdline.addOption(option, GLE_OPT_PAUSE);
+ option = new CmdLineOption("verbosity", "vb");
+ option->setHelp("Sets the verbosity level of GLE console output");
+ intarg = new CmdLineArgInt("verbosity");
+ intarg->setHelp("sets verbosity level to 'verbosity' (0..20)");
+ intarg->setCardLimits(0, 1);
+ intarg->setDefault(1);
+ option->addArg(intarg);
+ cmdline.addOption(option, GLE_OPT_VERBOSITY);
+ cmdline.addMainArgSep("args");
+ cmdline.addMainArgSep("a");
+ cmdline.initOptions();
+}
+
+void gle_preview_file(const char* name, CmdLineObj& cmdline) {
+ ostringstream commands;
+ commands << "glefile: \"" << name << "\"" << endl;
+ if (cmdline.hasOption(GLE_OPT_DPI)) {
+ int dpi = ((CmdLineArgInt*)cmdline.getOption(GLE_OPT_DPI)->getArg(0))->getValue();
+ commands << "dpi: \"" << dpi << "\"" << endl;
+ }
+ commands << "*DONE*" << endl;
+ // cout << "Sending: " << commands.str() << endl;
+ int result = GLESendSocket(commands.str());
+ if (result == -3) {
+ cerr << "Note: GLE is trying to launch QGLE, the GLE preview application" << endl;
+#ifdef __WIN32__
+ string qgle = "\"" + GLE_BIN_DIR + DIR_SEP + "qgle.exe\"";
+#else
+ string qgle = "\"" + GLE_BIN_DIR + DIR_SEP + "qgle\"";
+#endif
+ int sysres = GLESystem(qgle, false, false, NULL, NULL);
+ if (sysres == GLE_SYSTEM_OK) {
+ bool done = false;
+ while (!done) {
+ GLESleep(1000);
+ result = GLESendSocket(commands.str());
+ if (result != -3) {
+ done = true;
+ }
+ }
+ } else {
+ cerr << "Error: failed to start QGLE: '" << qgle << "'" << endl;
+ result = 0;
+ }
+ }
+ if (result != 0) {
+ cerr << "Error: could not connect to GLE preview application, code = " << result << endl;
+ }
+ cerr << endl;
+}
+
+bool has_pdflatex(CmdLineObj* cmdline) {
+ if (cmdline->hasOption(GLE_OPT_NO_PDFTEX)) {
+ return false;
+ }
+ ConfigSection* tex = g_Config.getSection(GLE_CONFIG_TEX);
+ CmdLineArgSet* texsys = (CmdLineArgSet*)tex->getOptionValue(GLE_TEX_SYSTEM);
+ if (texsys->hasValue(GLE_TEX_SYSTEM_VTEX)) {
+ return false;
+ } else {
+ return true;
+ }
+}
+
+bool has_eps_or_pdf_based_device(CmdLineArgSet* device, CmdLineObj& cmdline) {
+ if (cmdline.hasOption(GLE_OPT_TEX)) return true;
+ if (device->hasValue(GLE_DEVICE_EPS)) return true;
+ if (device->hasValue(GLE_DEVICE_PDF)) return true;
+ if (device->hasValue(GLE_DEVICE_JPEG)) return true;
+ if (device->hasValue(GLE_DEVICE_PNG)) return true;
+ return false;
+}
+
+bool requires_tex(CmdLineArgSet* device, CmdLineObj* cmdline) {
+ if (!cmdline->hasOption(GLE_OPT_CREATE_INC)) {
+ if (device->hasValue(GLE_DEVICE_EPS)) return true;
+ if (device->hasValue(GLE_DEVICE_PDF)) return true;
+ }
+ if (device->hasValue(GLE_DEVICE_PS)) return true;
+ if (device->hasValue(GLE_DEVICE_JPEG)) return true;
+ if (device->hasValue(GLE_DEVICE_PNG)) return true;
+ return false;
+}
+
+bool has_bitmap_or_pdf_device(CmdLineArgSet* device) {
+ if (device->hasValue(GLE_DEVICE_JPEG)) return true;
+ if (device->hasValue(GLE_DEVICE_PNG)) return true;
+ if (device->hasValue(GLE_DEVICE_PDF)) return true;
+ return false;
+}
+
+bool is_bitmap_device(int device) {
+ if (device == GLE_DEVICE_JPEG) return true;
+ if (device == GLE_DEVICE_PNG) return true;
+ return false;
+}
+
+void force_device(int dev, CmdLineObj& cmdline) {
+ CmdLineArgSet* device = (CmdLineArgSet*)cmdline.getOption(GLE_OPT_DEVICE)->getArg(0);
+ device->removeValue(GLE_DEVICE_EPS);
+ device->addValue(dev);
+}
+
+void get_out_name(GLEFileLocation* inname, CmdLineObj& cmdline, GLEFileLocation* outname) {
+ if (cmdline.hasOption(GLE_OPT_OUTPUT)) {
+ const string& o_file = cmdline.getOptionString(GLE_OPT_OUTPUT);
+ if (str_i_equals(o_file, "STDOUT")) {
+ outname->createStdout();
+ } else {
+ if (str_i_ends_with(o_file, ".ps")) force_device(GLE_DEVICE_PS, cmdline);
+ if (str_i_ends_with(o_file, ".pdf")) force_device(GLE_DEVICE_PDF, cmdline);
+ if (str_i_ends_with(o_file, ".svg")) force_device(GLE_DEVICE_SVG, cmdline);
+ if (str_i_ends_with(o_file, ".jpg")) force_device(GLE_DEVICE_JPEG, cmdline);
+ if (str_i_ends_with(o_file, ".png")) force_device(GLE_DEVICE_PNG, cmdline);
+ string main_name;
+ GetMainName(o_file, main_name);
+ outname->fromFileNameDir(main_name, GLE_WORKING_DIR);
+ }
+ } else {
+ if (inname->isStdin()) {
+ outname->createStdout();
+ } else {
+ string main_name;
+ GetMainNameExt(inname->getFullPath(), ".gle", main_name);
+ outname->fromAbsolutePath(main_name);
+ }
+ }
+}
+
+GLERC<GLEScript> load_gle_code_sub(const char* name, CmdLineObj& cmdline) throw(ParserError) {
+ string in_name = name;
+ GLERC<GLEScript> script = new GLEScript();
+ GLEFileLocation* loc = script->getLocation();
+ loc->fromFileNameDir(in_name, GLE_WORKING_DIR);
+ script->getSource()->load();
+ return script;
+}
+
+GLERC<GLEScript> load_gle_code_sub_stdin(CmdLineObj& cmdline) throw(ParserError) {
+ GLERC<GLEScript> script = new GLEScript();
+ GLEFileLocation* loc = script->getLocation();
+ loc->createStdin();
+ loc->setDirectory(GLE_WORKING_DIR);
+ script->getSource()->load();
+ return script;
+}
+
+void delete_temp_file(const string& file, const char* ext) {
+ int verbosity = g_verbosity();
+ bool keep = g_CmdLine.hasOption(GLE_OPT_KEEP);
+ if ((verbosity >= 5 && keep) || verbosity > 10) {
+ string fname = file + ext;
+ ostringstream todel;
+ if (keep) {
+ todel << "keep: " << fname;
+ } else {
+ todel << "delete: " << fname;
+ }
+ g_message(todel.str());
+ }
+ if (!g_CmdLine.hasOption(GLE_OPT_KEEP)) {
+ DeleteFileWithExt(file, ext);
+ }
+}
+
+void writeRecordedOutputFile(const string& fname, int deviceCode, string* buffer) throw (ParserError) {
+ string outf = fname;
+ outf.append(g_device_to_ext(deviceCode));
+ ofstream out(outf.c_str(), ios::out | ios::binary);
+ if (!out.is_open()) {
+ g_throw_parser_error("failed to create file '", outf.c_str(), "'");
+ }
+ out.write(buffer->data(), buffer->size());
+ out.close();
+}
+
+void writeRecordedOutputFile(const string& fname, int deviceCode, GLEScript* script) throw (ParserError) {
+ string* buffer = script->getRecordedBytesBuffer(deviceCode);
+ writeRecordedOutputFile(fname, deviceCode, buffer);
+}
+
+class GLELoadOneFileManager {
+protected:
+ GLEScript* m_Script;
+ CmdLineObj* m_CmdLine;
+ GLEFileLocation* m_OutName;
+ GLEDevice* m_Device;
+ GLEFileLocation m_IncName;
+ bool m_HasTeXFile;
+ bool m_HasTempDotDir;
+ bool m_HasTempFile;
+ std::set<int> m_hasGenerated;
+ std::set<int> m_hasFile;
+ std::set<int> m_hasIncFile;
+public:
+ GLELoadOneFileManager(GLEScript* script, CmdLineObj* cmdline, GLEFileLocation* outname);
+ ~GLELoadOneFileManager();
+ void update_bounding_box();
+ void delete_previous_output(int deviceCode);
+ void create_cairo_eps() throw(ParserError);
+ bool process_one_file_tex() throw(ParserError);
+ void do_output_type(const char* type);
+ void cat_stdout(const char* ext);
+ void cat_stdout_and_del(const char* ext);
+ void create_latex_eps_ps_pdf() throw(ParserError);
+ void convert_eps_to_pdf_no_latex() throw(ParserError);
+ istream* get_eps_stream();
+ bool hasGenerated(int deviceCode);
+ bool hasFile(int deviceCode);
+ bool hasIncFile(int deviceCode);
+ void setHasGenerated(int deviceCode, bool value);
+ void setHasFile(int deviceCode, bool value);
+ void setHasIncFile(int deviceCode, bool value);
+ void write_recorded_data(int deviceCode) throw(ParserError);
+ void clean_tex_temp_files();
+ void clean_inc_file(int deviceCode);
+ void delete_original_eps_pdf();
+ void delete_original_eps_pdf_impl(int device);
+ bool requires_tex_eps(CmdLineArgSet* device, CmdLineObj* cmdline);
+ bool requires_tex_pdf(CmdLineArgSet* device, CmdLineObj* cmdline);
+ bool has_cairo_pdf_based_device(CmdLineArgSet* device, CmdLineObj* cmdline);
+};
+
+GLELoadOneFileManager::GLELoadOneFileManager(GLEScript* script, CmdLineObj* cmdline, GLEFileLocation* outname) {
+ m_Script = script;
+ m_CmdLine = cmdline;
+ m_OutName = outname;
+ m_Device = NULL;
+ m_HasTeXFile = false;
+ m_HasTempDotDir = false;
+ m_HasTempFile = false;
+}
+
+GLELoadOneFileManager::~GLELoadOneFileManager() {
+}
+
+
+
+void GLELoadOneFileManager::update_bounding_box() {
+ double size_x, size_y;
+ g_get_usersize(&size_x, &size_y);
+ m_Script->setSize(size_x, size_y);
+ PSGLEDevice* psdev = (PSGLEDevice*)g_get_device_ptr();
+ m_Script->setBoundingBox(psdev->getBoundingBox()->getX(), psdev->getBoundingBox()->getY());
+ m_Script->setBoundingBoxOrigin(0.0, 0.0);
+}
+
+void GLELoadOneFileManager::delete_previous_output(int deviceCode) {
+ CmdLineArgSet* device = (CmdLineArgSet*)m_CmdLine->getOption(GLE_OPT_DEVICE)->getArg(0);
+ if (device->hasValue(deviceCode) && !m_OutName->isStdout()) {
+ /* Delete output so that QGLE does not display previous rendering if there are errors */
+ DeleteFileWithExt(m_OutName->getFullPath(), g_device_to_ext(deviceCode));
+ }
+}
+
+void GLELoadOneFileManager::create_cairo_eps() throw(ParserError) {
+ CmdLineArgSet* device = (CmdLineArgSet*)m_CmdLine->getOption(GLE_OPT_DEVICE)->getArg(0);
+ if (!hasGenerated(GLE_DEVICE_EPS) && device->hasValue(GLE_DEVICE_EPS)) {
+ setHasGenerated(GLE_DEVICE_EPS, true);
+ m_Device = g_select_device(GLE_DEVICE_CAIRO_EPS);
+ m_Device->setRecordingEnabled(true);
+ if (g_verbosity() > 0) {
+ cerr << endl;
+ }
+ DrawIt(m_Script, m_OutName, m_CmdLine);
+ m_Device->getRecordedBytes(m_Script->getRecordedBytesBuffer(GLE_DEVICE_EPS));
+ }
+}
+
+bool GLELoadOneFileManager::process_one_file_tex() throw(ParserError) {
+ CmdLineArgSet* device = (CmdLineArgSet*)m_CmdLine->getOption(GLE_OPT_DEVICE)->getArg(0);
+ delete_previous_output(GLE_DEVICE_EPS);
+ delete_previous_output(GLE_DEVICE_PDF);
+ if (m_CmdLine->hasOption(GLE_OPT_CAIRO)) {
+ if (has_cairo_pdf_based_device(device, m_CmdLine)) {
+ setHasGenerated(GLE_DEVICE_PDF, true);
+ m_Device = g_select_device(GLE_DEVICE_CAIRO_PDF);
+ } else {
+ setHasGenerated(GLE_DEVICE_EPS, true);
+ m_Device = g_select_device(GLE_DEVICE_CAIRO_EPS);
+ }
+ } else {
+ setHasGenerated(GLE_DEVICE_EPS, true);
+ m_Device = g_select_device(GLE_DEVICE_EPS);
+ }
+ if (m_CmdLine->hasOption(GLE_OPT_DPI)) {
+ m_Device->setResolution(((CmdLineArgInt*)m_CmdLine->getOption(GLE_OPT_DPI)->getArg(0))->getValue());
+ }
+ m_Device->setRecordingEnabled(true);
+ /* In some cases two passes are required to measure size of TeX objects */
+ int done = 1;
+ TeXInterface* interface = TeXInterface::getInstance();
+ if (m_Script->getLocation()->isStdin()) {
+ interface->initialize(m_OutName, m_OutName);
+ } else {
+ interface->initialize(m_Script->getLocation(), m_OutName);
+ }
+ int iter = 0;
+ do {
+ interface->reset();
+ if (iter != 0 && g_verbosity() > 0) cerr << endl;
+ DrawIt(m_Script, m_OutName, m_CmdLine);
+ if (get_nb_errors() > 0) {
+ return false;
+ }
+ if (iter == 0 && interface->hasObjects() && m_OutName->isStdout()) {
+ /* this means we need temporary files */
+ m_HasTempFile = true;
+ m_OutName->setFullPath(GLETempName());
+ if (m_Script->getLocation()->isStdin()) {
+ m_HasTempDotDir = true;
+ interface->updateNames(m_OutName, m_OutName);
+ } else {
+ interface->updateOutName(m_OutName);
+ }
+ }
+ done = interface->tryCreateHash();
+ if (done == 2) {
+ inc_nb_errors();
+ return false;
+ }
+ iter++;
+ } while (done == 1);
+ /* get recorded PostScript code */
+ if (hasGenerated(GLE_DEVICE_PDF)) {
+ m_Device->getRecordedBytes(m_Script->getRecordedBytesBuffer(GLE_DEVICE_PDF));
+ } else {
+ m_Device->getRecordedBytes(m_Script->getRecordedBytesBuffer(GLE_DEVICE_EPS));
+ }
+ update_bounding_box();
+ interface->checkObjectDimensions();
+ create_cairo_eps();
+ if (m_CmdLine->hasOption(GLE_OPT_CREATE_INC)) {
+ interface->createInc(m_CmdLine->getStringValue(GLE_OPT_TEXINCPREF));
+ }
+ if (interface->hasObjects() && requires_tex(device, m_CmdLine)) {
+ bool use_geom = false;
+ bool has_pdftex = has_pdflatex(m_CmdLine);
+ bool create_inc = m_CmdLine->hasOption(GLE_OPT_CREATE_INC);
+ if (device->hasValue(GLE_DEVICE_PS)) use_geom = true;
+ if (has_pdftex && !create_inc) use_geom = true;
+ interface->createTeX(use_geom);
+ m_HasTeXFile = true;
+ }
+ if (!interface->isEnabled()) {
+ /* No TeX objects in safe mode */
+ return false;
+ }
+ if (m_CmdLine->hasOption(GLE_OPT_CREATE_INC)) {
+ /* See bug #2165591 */
+ return true;
+ }
+ return interface->hasObjects();
+}
+
+void GLELoadOneFileManager::do_output_type(const char* type) {
+ if (g_verbosity() > 0) {
+ cerr << "[" << type << "]";
+ g_set_console_output(false);
+ }
+}
+
+void GLELoadOneFileManager::cat_stdout(const char* ext) {
+ string outf = m_OutName->getFullPath() + ext;
+ ifstream in(outf.c_str(), ios::in | ios::binary);
+ GLECopyStream(in, cout);
+ in.close();
+}
+
+void GLELoadOneFileManager::cat_stdout_and_del(const char* ext) {
+ cat_stdout(ext);
+ delete_temp_file(m_OutName->getFullPath(), ext);
+}
+
+void GLELoadOneFileManager::convert_eps_to_pdf_no_latex() throw(ParserError) {
+ CmdLineArgSet* device = (CmdLineArgSet*)m_CmdLine->getOption(GLE_OPT_DEVICE)->getArg(0);
+ if (device->hasValue(GLE_DEVICE_PDF) && !hasGenerated(GLE_DEVICE_PDF)) {
+ setHasFile(GLE_DEVICE_PDF, true);
+ int dpi = m_CmdLine->getIntValue(GLE_OPT_DPI);
+ create_pdf_file_ghostscript(m_OutName, dpi, m_Script);
+ do_output_type(".pdf");
+ }
+}
+
+bool GLELoadOneFileManager::requires_tex_eps(CmdLineArgSet* device, CmdLineObj* cmdline) {
+ if (!cmdline->hasOption(GLE_OPT_CREATE_INC)) {
+ if (device->hasValue(GLE_DEVICE_EPS)) return true;
+ if (device->hasValue(GLE_DEVICE_PDF) && !has_pdflatex(cmdline)) return true;
+ }
+ if (!hasGenerated(GLE_DEVICE_PDF)) {
+ if (device->hasValue(GLE_DEVICE_JPEG)) return true;
+ if (device->hasValue(GLE_DEVICE_PNG)) return true;
+ }
+ return false;
+}
+
+bool GLELoadOneFileManager::has_cairo_pdf_based_device(CmdLineArgSet* device, CmdLineObj* cmdline) {
+ if (m_CmdLine->hasOption(GLE_OPT_CAIRO)) {
+ if (device->hasValue(GLE_DEVICE_PDF)) return true;
+ if (device->hasValue(GLE_DEVICE_JPEG)) return true;
+ if (device->hasValue(GLE_DEVICE_PNG)) return true;
+ }
+ return false;
+}
+
+bool GLELoadOneFileManager::requires_tex_pdf(CmdLineArgSet* device, CmdLineObj* cmdline) {
+ if (!cmdline->hasOption(GLE_OPT_CREATE_INC)) {
+ if (device->hasValue(GLE_DEVICE_PDF)) return true;
+ }
+ if (hasGenerated(GLE_DEVICE_PDF)) {
+ if (device->hasValue(GLE_DEVICE_JPEG)) return true;
+ if (device->hasValue(GLE_DEVICE_PNG)) return true;
+ }
+ return false;
+}
+
+void GLELoadOneFileManager::create_latex_eps_ps_pdf() throw(ParserError) {
+ /* m_OutName has no path and no extension */
+ m_IncName.fromAbsolutePath(m_OutName->getFullPath() + "_inc");
+ /* includegraphics does not handle "." in filenames */
+ FileNameDotToUnderscore(m_IncName.getFullPathNC());
+ bool create_inc = m_CmdLine->hasOption(GLE_OPT_CREATE_INC);
+ bool has_pdftex = has_pdflatex(m_CmdLine);
+ int dpi = m_CmdLine->getIntValue(GLE_OPT_DPI);
+ CmdLineArgSet* device = (CmdLineArgSet*)m_CmdLine->getOption(GLE_OPT_DEVICE)->getArg(0);
+ /* Create "_inc.eps" */
+ if (device->hasOnlyValue(GLE_DEVICE_PDF) && (has_pdftex || create_inc)) {
+ /* "_inc.eps" not required in this case */
+ } else if (hasGenerated(GLE_DEVICE_EPS)) {
+ setHasIncFile(GLE_DEVICE_EPS, true);
+ writeRecordedOutputFile(m_IncName.getFullPath(), GLE_DEVICE_EPS, m_Script);
+ }
+ /* Create "_inc.pdf" */
+ if ((device->hasValue(GLE_DEVICE_PDF) || hasGenerated(GLE_DEVICE_PDF)) && (has_pdftex || create_inc)) {
+ setHasIncFile(GLE_DEVICE_PDF, true);
+ if (hasGenerated(GLE_DEVICE_PDF)) {
+ writeRecordedOutputFile(m_IncName.getFullPath(), GLE_DEVICE_PDF, m_Script);
+ } else {
+ create_pdf_file_ghostscript(&m_IncName, dpi, m_Script);
+ do_output_type(".pdf");
+ }
+ }
+ /* Exit if no EPS/PS/PDF required */
+ if (!requires_tex_eps(device, m_CmdLine) &&
+ !requires_tex_pdf(device, m_CmdLine) &&
+ !device->hasValue(GLE_DEVICE_PS)) {
+ return;
+ }
+ /* Create EPS/PS/PDF based on .TeX */
+ string out_name_dir, out_name_np;
+ SplitFileName(m_OutName->getFullPath(), out_name_dir, out_name_np);
+ /* LaTeX does not like to run with absolute paths */
+ GLEChDir(out_name_dir);
+ if (requires_tex_eps(device, m_CmdLine)) {
+ create_eps_file_latex_dvips(out_name_np, m_Script);
+ writeRecordedOutputFile(m_OutName->getFullPath(), GLE_DEVICE_EPS, m_Script);
+ setHasFile(GLE_DEVICE_EPS, true);
+ }
+ if ((device->hasValue(GLE_DEVICE_PDF) && !create_inc) || requires_tex_pdf(device, m_CmdLine)) {
+ setHasFile(GLE_DEVICE_PDF, true);
+ if (has_pdftex) {
+ create_pdf_file_pdflatex(out_name_np, m_Script);
+ } else {
+ create_pdf_file_ghostscript(m_OutName, dpi, m_Script);
+ do_output_type(".pdf");
+ }
+ }
+ if (device->hasValue(GLE_DEVICE_PS)) {
+ create_ps_file_latex_dvips(out_name_np);
+ if (m_OutName->isStdout()) cat_stdout_and_del(".ps");
+ do_output_type(".ps");
+ }
+ GLEChDir(m_Script->getLocation()->getDirectory());
+}
+
+istream* GLELoadOneFileManager::get_eps_stream() {
+ return NULL;
+}
+
+bool GLELoadOneFileManager::hasGenerated(int deviceCode) {
+ return m_hasGenerated.find(deviceCode) != m_hasGenerated.end();
+}
+
+bool GLELoadOneFileManager::hasFile(int deviceCode) {
+ return m_hasFile.find(deviceCode) != m_hasFile.end();
+}
+
+bool GLELoadOneFileManager::hasIncFile(int deviceCode) {
+ return m_hasIncFile.find(deviceCode) != m_hasIncFile.end();
+}
+
+void GLELoadOneFileManager::setHasGenerated(int deviceCode, bool value) {
+ if (value) {
+ m_hasGenerated.insert(deviceCode);
+ } else {
+ m_hasGenerated.erase(deviceCode);
+ }
+}
+
+void GLELoadOneFileManager::setHasFile(int deviceCode, bool value) {
+ if (value) {
+ m_hasFile.insert(deviceCode);
+ } else {
+ m_hasFile.erase(deviceCode);
+ }
+}
+
+void GLELoadOneFileManager::setHasIncFile(int deviceCode, bool value) {
+ if (value) {
+ m_hasIncFile.insert(deviceCode);
+ } else {
+ m_hasIncFile.erase(deviceCode);
+ }
+}
+
+void GLELoadOneFileManager::write_recorded_data(int deviceCode) throw (ParserError) {
+ CmdLineArgSet* device = (CmdLineArgSet*)m_CmdLine->getOption(GLE_OPT_DEVICE)->getArg(0);
+ if (!device->hasValue(deviceCode)) {
+ return;
+ }
+ if (m_CmdLine->hasOption(GLE_OPT_CREATE_INC) || m_CmdLine->hasOption(GLE_OPT_NOSAVE)) {
+ return;
+ }
+ if (m_OutName->isStdout()) {
+ /* Write to stdout */
+ if (hasFile(deviceCode)) {
+ cat_stdout(g_device_to_ext(deviceCode));
+ } else {
+ string* buffer = m_Script->getRecordedBytesBuffer(deviceCode);
+ cout.write(buffer->data(), buffer->size());
+ }
+ } else {
+ if (!hasFile(deviceCode)) {
+ writeRecordedOutputFile(m_OutName->getFullPath(), deviceCode, m_Script);
+ }
+ }
+}
+
+void GLELoadOneFileManager::clean_inc_file(int deviceCode) {
+ /* Remove _inc.* if not required anymore */
+ bool create_inc = m_CmdLine->hasOption(GLE_OPT_CREATE_INC);
+ CmdLineArgSet* device = (CmdLineArgSet*)m_CmdLine->getOption(GLE_OPT_DEVICE)->getArg(0);
+ if (hasIncFile(deviceCode) && (!create_inc || !device->hasValue(deviceCode))) {
+ delete_temp_file(m_IncName.getFullPath(), g_device_to_ext(deviceCode));
+ }
+}
+
+void GLELoadOneFileManager::clean_tex_temp_files() {
+ clean_inc_file(GLE_DEVICE_EPS);
+ clean_inc_file(GLE_DEVICE_PDF);
+ /* Remove .tex file */
+ if (m_HasTeXFile) {
+ delete_temp_file(m_OutName->getFullPath(), ".tex");
+ }
+ /* Remove files in ".gle" directory */
+ if (m_HasTempDotDir) {
+ TeXInterface* interface = TeXInterface::getInstance();
+ interface->removeDotFiles();
+ }
+}
+
+void GLELoadOneFileManager::delete_original_eps_pdf_impl(int deviceCode) {
+ CmdLineArgSet* device = (CmdLineArgSet*)m_CmdLine->getOption(GLE_OPT_DEVICE)->getArg(0);
+ bool should_del = hasFile(deviceCode);
+ if (device->hasValue(deviceCode)) {
+ /* don't delete .eps/.pdf if we wanted this as output */
+ /* and we did not wanted this printed to stout */
+ if (!m_OutName->isStdout() && !m_CmdLine->hasOption(GLE_OPT_CREATE_INC)) {
+ should_del = false;
+ }
+ }
+ if (should_del) {
+ /* delete original .eps/.pdf file */
+ delete_temp_file(m_OutName->getFullPath(), g_device_to_ext(deviceCode));
+ }
+}
+
+void GLELoadOneFileManager::delete_original_eps_pdf() {
+ delete_original_eps_pdf_impl(GLE_DEVICE_EPS);
+ delete_original_eps_pdf_impl(GLE_DEVICE_PDF);
+ /* has temporary output file */
+ if (m_HasTempFile) {
+ #ifdef __WIN32__
+ delete_temp_file(m_OutName->getFullPath(), ".tmp");
+ #else
+ delete_temp_file(m_OutName->getFullPath(), "");
+ #endif
+ }
+}
+
+void complain_latex_not_supported(int device) {
+ if (TeXInterface::getInstance()->hasObjects()) {
+ g_throw_parser_error(">> LaTeX expressions not supported in '", g_device_to_ext(device), "' output");
+ }
+}
+
+void load_one_file_sub(GLEScript* script, CmdLineObj& cmdline, size_t* exit_code) throw(ParserError) {
+ GLEFileLocation out_name; /* out_name has no extension */
+ GLEGetInterfacePointer()->getConfig()->setAllowConfigBlocks(false);
+ GLEChDir(script->getLocation()->getDirectory());
+ get_out_name(script->getLocation(), cmdline, &out_name);
+ g_set_console_output(false);
+ g_message_first_newline(true);
+ GLEGetColorList()->reset();
+ if (cmdline.hasOption(GLE_OPT_DEBUG)){
+ printf("Debug options 16=do_pcode, 8=pass 4=polish, 2=eval ");
+ printf("Debug "); gle_debug = GLEReadConsoleInteger();
+ printf("Trace "); trace_on = GLEReadConsoleInteger();
+ }
+ GLELoadOneFileManager manager(script, &cmdline, &out_name);
+ CmdLineArgSet* device = (CmdLineArgSet*)cmdline.getOption(GLE_OPT_DEVICE)->getArg(0);
+ if (has_eps_or_pdf_based_device(device, cmdline)) {
+ bool has_tex = manager.process_one_file_tex();
+ /* Return if there were errors */
+ if (get_nb_errors() > 0) {
+ if (g_verbosity() > 0) cerr << endl;
+ (*exit_code)++;
+ return;
+ }
+ /* Get device information */
+ int dpi = cmdline.getIntValue(GLE_OPT_DPI);
+ /* File has TeX code -> move it and create again */
+ if (has_tex) {
+ manager.create_latex_eps_ps_pdf();
+ } else {
+ manager.convert_eps_to_pdf_no_latex();
+ }
+ /* Create bitmap outputs */
+ int output_options = 0;
+ if (cmdline.hasOption(GLE_OPT_NO_COLOR)) {
+ output_options |= GLE_OUTPUT_OPTION_GRAYSCALE;
+ }
+ if (cmdline.hasOption(GLE_OPT_TRANSPARENT)) {
+ output_options |= GLE_OUTPUT_OPTION_TRANSPARENT;
+ }
+ for (int i = 0; i < device->getNbValues(); i++) {
+ if (is_bitmap_device(i) && device->hasValue(i)) {
+ create_bitmap_file(&out_name, i, dpi, output_options, script);
+ manager.do_output_type(g_device_to_ext(i));
+ }
+ }
+ /* Output .eps to stdout? */
+ manager.write_recorded_data(GLE_DEVICE_EPS);
+ manager.write_recorded_data(GLE_DEVICE_PDF);
+ manager.delete_original_eps_pdf();
+ if (has_tex) manager.clean_tex_temp_files();
+ if (g_verbosity() > 0) cerr << endl;
+ }
+ if (device->hasValue(GLE_DEVICE_PS) && !cmdline.hasOption(GLE_OPT_TEX)) {
+ GLEDevice* psdev = g_select_device(GLE_DEVICE_PS);
+ DrawIt(script, &out_name, &cmdline);
+ if (TeXInterface::getInstance()->hasObjects()) {
+ g_message(">> To include LaTeX expressions, use \"gle -tex -d ps file.gle\"");
+ }
+ if (psdev->isRecordingEnabled()) {
+ std::string recorded;
+ psdev->getRecordedBytes(&recorded);
+ writeRecordedOutputFile(out_name.getFullPath(), GLE_DEVICE_PS, &recorded);
+ }
+ if (out_name.isStdout()) {
+ manager.cat_stdout_and_del(".ps");
+ }
+ cerr << endl;
+ }
+ if (device->hasValue(GLE_DEVICE_SVG)) {
+ g_select_device(GLE_DEVICE_CAIRO_SVG);
+ DrawIt(script, &out_name, &cmdline);
+ complain_latex_not_supported(GLE_DEVICE_SVG);
+ if (out_name.isStdout()) {
+ manager.cat_stdout_and_del(".svg");
+ }
+ cerr << endl;
+ }
+ if (device->hasValue(GLE_DEVICE_X11)) {
+ g_select_device(GLE_DEVICE_X11);
+ DrawIt(script, &out_name, &cmdline);
+ }
+#if defined(__WIN32__) && defined(HAVE_CAIRO)
+ if (device->hasValue(GLE_DEVICE_EMF)) {
+ GLECairoDeviceEMF* dev = (GLECairoDeviceEMF*)g_select_device(GLE_DEVICE_EMF);
+ if (cmdline.hasOption(GLE_OPT_COPY)) {
+ dev->setCopyClipboard(true);
+ }
+ if (cmdline.hasOption(GLE_OPT_DPI)) {
+ int dpi = ((CmdLineArgInt*)cmdline.getOption(GLE_OPT_DPI)->getArg(0))->getValue();
+ dev->setDPI(dpi);
+ } else {
+ dev->setDPI(2000);
+ }
+ DrawIt(script, &out_name, &cmdline);
+ complain_latex_not_supported(GLE_DEVICE_EMF);
+ cerr << endl;
+ }
+#endif
+}
+
+void load_one_file(const char* name, CmdLineObj& cmdline, size_t* exit_code) {
+ if (cmdline.hasOption(GLE_OPT_PREVIEW)) {
+ GLEFileLocation loc;
+ loc.fromFileNameDir(name, GLE_WORKING_DIR);
+ gle_preview_file(loc.getFullPath().c_str(), cmdline);
+ return;
+ }
+ try {
+ GLERC<GLEScript> script = load_gle_code_sub(name, cmdline);
+ load_one_file_sub(script.get(), cmdline, exit_code);
+ } catch (ParserError& err) {
+ string err_str;
+ err.toString(err_str);
+ str_uppercase_initial_capital(err_str);
+ g_message(err_str);
+ (*exit_code)++;
+ }
+}
+
+void load_one_file_stdin(CmdLineObj& cmdline, size_t* exit_code) {
+ try {
+ GLERC<GLEScript> script = load_gle_code_sub_stdin(cmdline);
+ load_one_file_sub(script.get(), cmdline, exit_code);
+ } catch (ParserError& err) {
+ string err_str;
+ err.toString(err_str);
+ str_uppercase_initial_capital(err_str);
+ g_message(err_str);
+ (*exit_code)++;
+ }
+}
diff --git a/src/gle/glearray.cpp b/src/gle/glearray.cpp
new file mode 100644
index 0000000..a520079
--- /dev/null
+++ b/src/gle/glearray.cpp
@@ -0,0 +1,780 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+/*
+ * 2004 Jan Struyf
+ *
+ */
+
+#include "all.h"
+#include "core.h"
+#include "file_io.h"
+#include "texinterface.h"
+#include "cutils.h"
+#include "gprint.h"
+#include "tokens/RefCount.h"
+#include "glearray.h"
+
+#ifdef HAVE_LIBZ
+ #include <zlib.h>
+#endif
+
+#include <memory>
+
+bool GLEReadFileBinaryGZIP(const string& name, std::vector<GLEBYTE>* contents);
+
+RefCountObject::RefCountObject() {
+ owner_count = 0;
+}
+
+RefCountObject::~RefCountObject() {
+}
+
+GLEObject::GLEObject() {
+}
+
+GLEObject::~GLEObject() {
+}
+
+int GLEObject::size() {
+ return 0;
+}
+
+double GLEObject::getDoubleAt(int i) {
+ return 0.0;
+}
+
+void GLEObject::setDoubleAt(double v, int i) {
+}
+
+bool GLEObject::getBoolAt(int i) {
+ return false;
+}
+
+void GLEObject::setBoolAt(bool v, int i) {
+}
+
+GLEObject* GLEObject::getObjectAt(int i) {
+ return NULL;
+}
+
+void GLEObject::setObjectAt(GLEObject* v, int i) {
+}
+
+GLEObjectArray::GLEObjectArray() {
+}
+
+GLEObjectArray::~GLEObjectArray() {
+}
+
+int GLEObjectArray::size() {
+ return m_Elems.size();
+}
+
+GLEObject* GLEObjectArray::getObjectAt(int i) {
+ if (i > (int)m_Elems.size()) return NULL;
+ else return m_Elems[i].get();
+}
+
+void GLEObjectArray::setObjectAt(GLEObject* v, int i) {
+ resize(i);
+ m_Elems[i] = v;
+}
+
+void GLEObjectArray::resize(int n) {
+ int add = n - m_Elems.size() + 1;
+ while (add > 0) {
+ m_Elems.push_back(NULL);
+ add--;
+ }
+}
+
+GLEDoubleArray::GLEDoubleArray() {
+}
+
+GLEDoubleArray::~GLEDoubleArray() {
+}
+
+int GLEDoubleArray::size() {
+ return m_Elems.size();
+}
+
+double GLEDoubleArray::getDoubleAt(int i) {
+ if (i > (int)m_Elems.size()) return 0.0;
+ else return m_Elems[i];
+}
+
+void GLEDoubleArray::setDoubleAt(double v, int i) {
+ resize(i);
+ m_Elems[i] = v;
+}
+
+double* GLEDoubleArray::toArray() {
+ double* res = (double*)myallocz(sizeof(double) * (m_Elems.size()+1));
+ for (vector<double>::size_type i = 0; i < m_Elems.size(); i++) {
+ res[i] = m_Elems[i];
+ }
+ return res;
+}
+
+void GLEDoubleArray::resize(int n) {
+ int add = n - m_Elems.size() + 1;
+ while (add > 0) {
+ m_Elems.push_back(0.0);
+ add--;
+ }
+}
+
+GLEBoolArray::GLEBoolArray() {
+}
+
+GLEBoolArray::~GLEBoolArray() {
+}
+
+int GLEBoolArray::size() {
+ return m_Elems.size();
+}
+
+bool GLEBoolArray::getBoolAt(int i) {
+ if (i > (int)m_Elems.size()) return false;
+ else return m_Elems[i];
+}
+
+void GLEBoolArray::setBoolAt(bool v, int i) {
+ resize(i);
+ m_Elems[i] = v;
+}
+
+int* GLEBoolArray::toArray() {
+ int* res = (int*)myallocz(sizeof(int) * (m_Elems.size()+1));
+ for (vector<bool>::size_type i = 0; i < m_Elems.size(); i++) {
+ res[i] = m_Elems[i] ? 1 : 0;
+ }
+ return res;
+}
+
+void GLEBoolArray::resize(int n) {
+ int add = n - m_Elems.size() + 1;
+ while (add > 0) {
+ m_Elems.push_back(false);
+ add--;
+ }
+}
+
+GLEZData::GLEZData() {
+ m_ZMin = 1e300;
+ m_ZMax = -1e300;
+ m_NX = 0;
+ m_NY = 0;
+ m_Data = NULL;
+}
+
+GLEZData::~GLEZData() {
+ if (m_Data != NULL) delete[] m_Data;
+}
+
+void GLEZData::read(const string& fname) throw(ParserError) {
+ string expanded(GLEExpandEnvironmentVariables(fname));
+ validate_file_name(expanded, false);
+ TokenizerLanguage lang;
+ std::auto_ptr<Tokenizer> tokens;
+ std::vector<GLEBYTE> contents;
+ if (str_i_ends_with(expanded, ".gz")) {
+ if (GLEReadFileBinaryGZIP(expanded, &contents)) {
+ contents.push_back(0);
+ tokens.reset(new StringTokenizer((const char*)&contents[0], &lang));
+ } else {
+ g_throw_parser_error("can't open: '", expanded.c_str(), "'");
+ }
+ } else {
+ StreamTokenizer* streamTokens = new StreamTokenizer(&lang);
+ tokens.reset(streamTokens);
+ streamTokens->open_tokens(expanded.c_str());
+ }
+ lang.setSpaceTokens(" \t\r,");
+ lang.setSingleCharTokens("\n!");
+ // Read the header of the z file
+ GLERectangle* bounds = getBounds();
+ tokens->ensure_next_token("!");
+ while (tokens->has_more_tokens()) {
+ string& token = tokens->next_token();
+ if (token == "\n") {
+ break;
+ } else if (str_i_equals(token, "NX")) {
+ m_NX = tokens->next_integer();
+ } else if (str_i_equals(token, "NY")) {
+ m_NY = tokens->next_integer();
+ } else if (str_i_equals(token, "XMIN")) {
+ bounds->setXMin(tokens->next_double());
+ } else if (str_i_equals(token, "XMAX")) {
+ bounds->setXMax(tokens->next_double());
+ } else if (str_i_equals(token, "YMIN")) {
+ bounds->setYMin(tokens->next_double());
+ } else if (str_i_equals(token, "YMAX")) {
+ bounds->setYMax(tokens->next_double());
+ } else {
+ stringstream str;
+ str << "unknown .z header token '" << token << "'";
+ throw tokens->error(str.str());
+ }
+ }
+ lang.setLineCommentTokens("!");
+ lang.setSingleCharTokens("");
+ lang.setSpaceTokens(" \t\n\r,");
+ // Allocate data
+ if (m_NX == 0 || m_NY == 0) {
+ throw tokens->error("data file header should contain valid NX and NY parameters");
+ }
+ m_Data = new double[m_NX * m_NY];
+ for (int y = 0; y < m_NY; y++) {
+ for (int x = 0; x < m_NX; x++) {
+ double v = tokens->next_double();
+ if (v < m_ZMin) m_ZMin = v;
+ if (v > m_ZMax) m_ZMax = v;
+ m_Data[x + y * m_NX] = v;
+ }
+ }
+}
+
+bool GLEReadFileBinaryGZIP(const string& name, std::vector<GLEBYTE>* contents) {
+#ifdef HAVE_LIBZ
+ gzFile file = gzopen(name.c_str(), "rb");
+ if (file == 0) {
+ return false;
+ }
+ bool returnCode = true;
+ const int GLE_READ_GZIP_BUFFER_SIZE = 100000;
+ char* buffer = new char[GLE_READ_GZIP_BUFFER_SIZE];
+ bool done = false;
+ while (!done) {
+ int result = gzread(file, (voidp)buffer, GLE_READ_GZIP_BUFFER_SIZE);
+ if (result == -1) {
+ done = true;
+ returnCode = false;
+ } else if (result == 0) {
+ done = true;
+ } else {
+ contents->reserve(contents->size() + result);
+ for (int i = 0; i < result; ++i) {
+ contents->push_back(buffer[i]);
+ }
+ }
+ }
+ delete[] buffer;
+ gzclose(file);
+ return returnCode;
+#else
+ return false;
+#endif
+}
+
+bool GLEReadFileOrGZIP(const std::string& name, vector<string>* lines) {
+ bool res = GLEReadFile(name, lines);
+ if (!res) {
+ std::vector<GLEBYTE> contents;
+ res = GLEReadFileBinaryGZIP(name + ".gz", &contents);
+ if (res) {
+ split_into_lines(&contents, lines);
+ }
+ }
+ return res;
+}
+
+bool GLEReadFileOrGZIPTxt(const std::string& name, std::string* result) {
+ vector<string> lines;
+ bool res = GLEReadFileOrGZIP(name, &lines);
+ result->clear();
+ if (res) {
+ std::ostringstream strm;
+ for (std::vector<string>::size_type i = 0; i < lines.size(); ++i) {
+ strm << lines[i] << std::endl;
+ }
+ *result = strm.str();
+ }
+ return res;
+}
+
+GLECSVError::GLECSVError() {
+}
+
+GLECSVError::~GLECSVError() {
+}
+
+GLECSVData::GLECSVData() {
+ initDelims();
+ m_lines = 0;
+ m_ignoreHeader = 0;
+ m_nextLine = true;
+ m_firstColumn = 0;
+ m_error.errorCode = GLECSVErrorNone;
+ m_error.errorLine = 0;
+ m_error.errorColumn = 0;
+ m_comment = "!";
+}
+
+GLECSVData::~GLECSVData() {
+ delete[] m_delims;
+}
+
+bool GLECSVData::read(const std::string& file) {
+ bool result = readBlock(file);
+ if (!result) return false;
+ parseBlock();
+ return true;
+}
+
+void GLECSVData::readBuffer(const char* buffer) {
+ unsigned int size = strlen(buffer);
+ m_buffer.resize(size + 1);
+ memcpy(&m_buffer[0], buffer, size);
+ m_buffer[size] = 0;
+ parseBlock();
+}
+
+bool GLECSVData::readBlock(const std::string& fileName) {
+ m_fileName = fileName;
+ if (str_i_ends_with(fileName, ".gz")) {
+ if (GLEReadFileBinaryGZIP(fileName, &m_buffer)) {
+ return true;
+ } else {
+ m_error.errorCode = GLECSVErrorFileNotFound;
+ ostringstream errStr;
+ errStr << "can't open: '" << fileName << "'";
+ m_error.errorString = errStr.str();
+ return false;
+ }
+ } else {
+ ifstream file(fileName.c_str(), ios::in | ios::binary | ios::ate);
+ if (file.is_open()) {
+ unsigned int size = file.tellg();
+ m_buffer.resize(size + 1);
+ file.seekg(0, ios::beg);
+ file.read((char*)&m_buffer[0], size);
+ file.close();
+ return true;
+ } else {
+ m_error.errorCode = GLECSVErrorFileNotFound;
+ ostringstream errStr;
+ errStr << "can't open: '" << fileName << "': ";
+ str_get_system_error(errStr);
+ m_error.errorString = errStr.str();
+ return false;
+ }
+ }
+}
+
+unsigned int GLECSVData::getNbLines() {
+ return m_firstCell.size();
+}
+
+unsigned int GLECSVData::getFirstCell(unsigned int line) {
+ return m_firstCell[line];
+}
+
+unsigned int GLECSVData::getNbColumns(unsigned int line) {
+ unsigned int startCell = m_firstCell[line];
+ if (line + 1 >= m_firstCell.size()) {
+ return m_cellPos.size() - startCell;
+ } else {
+ return m_firstCell[line + 1] - startCell;
+ }
+}
+
+const char* GLECSVData::getCell(unsigned int row, unsigned int column, unsigned int* size) {
+ unsigned int idx = m_firstCell[row] + column;
+ *size = m_cellSize[idx];
+ return (const char*)&m_buffer[m_cellPos[idx]];
+}
+
+string GLECSVData::getCellString(unsigned int row, unsigned int column) {
+ unsigned int size;
+ const char* buffer = getCell(row, column, &size);
+ return string(buffer, size);
+}
+
+void GLECSVData::setCellTrim(unsigned int row, unsigned int column, const char* data) {
+ unsigned int idx = m_firstCell[row] + column;
+ unsigned int size = std::min<unsigned int>(m_cellSize[idx], strlen(data));
+ for (unsigned int i = 0; i < size; i++) {
+ m_buffer[m_cellPos[idx] + i] = data[i];
+ }
+ m_cellSize[idx] = size;
+}
+
+unsigned int GLECSVData::validateIdenticalNumberOfColumns() {
+ bool found = false;
+ unsigned int dataColumns = 0;
+ for (unsigned int row = 0; row < getNbLines(); ++row) {
+ if (!found) {
+ found = true;
+ dataColumns = getNbColumns(row);
+ } else {
+ if (m_error.errorCode == GLECSVErrorNone && getNbColumns(row) != dataColumns) {
+ m_error.errorCode = GLECSVErrorInconsistentNrColumns;
+ m_error.errorLine = row;
+ m_error.errorColumn = 0;
+ ostringstream err;
+ err << "inconsistent number of columns " << getNbColumns(row) << " <> " << dataColumns;
+ createErrorString(err.str());
+ return dataColumns;
+ }
+ }
+ }
+ return dataColumns;
+}
+
+void GLECSVData::print(ostream& os) {
+ vector<unsigned int> columnWidth;
+ for (unsigned int row = 0; row < getNbLines(); row++) {
+ unsigned int nbColumns = getNbColumns(row);
+ for (unsigned int col = 0; col < nbColumns; col++) {
+ unsigned int size;
+ const char* cell = getCell(row, col, &size);
+ unsigned int chars = getUTF8NumberOfChars(cell, size);
+ while (columnWidth.size() <= col) {
+ columnWidth.push_back(0);
+ }
+ columnWidth[col] = std::max<unsigned int>(columnWidth[col], chars + 1);
+ }
+ }
+ for (unsigned int row = 0; row < getNbLines(); row++) {
+ unsigned int nbColumns = getNbColumns(row);
+ for (unsigned int col = 0; col < nbColumns; col++) {
+ unsigned int size;
+ const char* cell = getCell(row, col, &size);
+ unsigned int chars = getUTF8NumberOfChars(cell, size);
+ for (unsigned int idx = 0; idx < size; idx++) {
+ os << cell[idx];
+ }
+ if (col != nbColumns - 1) {
+ os << ",";
+ for (unsigned int idx = chars; idx < columnWidth[col]; idx++) {
+ os << (char)' ';
+ }
+ }
+ }
+ os << endl;
+ }
+}
+
+void GLECSVData::parseBlock() {
+ m_pos = 0;
+ m_size = m_buffer.size();
+ m_data = &m_buffer[0];
+ GLECSVDataStatus status = ignoreHeader();
+ while (status != GLECSVDataStatusEOF) {
+ status = readCell();
+ }
+}
+
+void GLECSVData::setDelims(const char* delims) {
+ int pos = 0;
+ unsigned int size = 256;
+ for (unsigned int i = 0; i < size; i++) {
+ m_delims[i] = false;
+ }
+ while (delims[pos] != 0) {
+ m_delims[(int)delims[pos]] = true;
+ pos++;
+ }
+ m_lastDelimWasSpace = isDelim(' ') || isDelim('\t');
+}
+
+void GLECSVData::setCommentIndicator(const char* comment) {
+ m_comment = comment;
+}
+
+void GLECSVData::setIgnoreHeader(unsigned int ignore) {
+ m_ignoreHeader = ignore;
+}
+
+void GLECSVData::initDelims() {
+ unsigned int size = 256;
+ m_delims = new bool[size];
+ setDelims(" ,;\t");
+}
+
+bool GLECSVData::isDelim(GLEBYTE ch) {
+ return m_delims[ch];
+}
+
+bool GLECSVData::isSpace(GLEBYTE ch) {
+ return ch == ' ' || ch == '\t';
+}
+
+bool GLECSVData::isEol(GLEBYTE ch) {
+ return ch == '\n' || ch == '\r';
+}
+
+bool GLECSVData::isComment(GLEBYTE ch) {
+ int currentPos = m_pos;
+ size_t commentPos = 0;
+ while (commentPos < m_comment.size() && ch == m_comment[commentPos]) {
+ ch = readChar();
+ commentPos++;
+ }
+ if (commentPos == m_comment.size()) {
+ goBack();
+ return true;
+ } else {
+ m_pos = currentPos;
+ return false;
+ }
+}
+
+GLECSVDataStatus GLECSVData::skipTillEol() {
+ while (true) {
+ GLEBYTE ch = readChar();
+ if (ch == 0) {
+ return GLECSVDataStatusEOF;
+ }
+ if (isEol(ch)) {
+ return readNewline(ch);
+ }
+ }
+}
+
+GLECSVDataStatus GLECSVData::ignoreHeader() {
+ GLECSVDataStatus result = GLECSVDataStatusOK;
+ for (unsigned int i = 0; i < m_ignoreHeader; i++) {
+ result = skipTillEol();
+ }
+ return result;
+}
+
+void GLECSVData::createErrorString(const string& str) {
+ ostringstream err;
+ err << str;
+ err << " at " << (m_error.errorLine + 1) << ":" << (m_error.errorColumn + 1);
+ err << " while reading '" << m_fileName << "'";
+ m_error.errorString = err.str();
+}
+
+unsigned int GLECSVData::getUTF8Column(unsigned int cellPos) {
+ int size = cellPos - m_firstColumn;
+ if (size < 0) size = 0;
+ return getUTF8NumberOfChars((const char*)&m_buffer[m_firstColumn], size);
+}
+
+GLECSVDataStatus GLECSVData::readCellString(GLEBYTE quote) {
+ unsigned int cellSize = 1;
+ unsigned int cellPos = lastCharPos();
+ initWritePos();
+ while (true) {
+ GLEBYTE ch = readChar();
+ writeChar(ch);
+ cellSize++;
+ if (ch == 0) {
+ m_error.errorCode = GLECSVErrorUnterminatedString;
+ m_error.errorLine = m_lines;
+ m_error.errorColumn = getUTF8Column(cellPos);
+ createErrorString("unterminated string");
+ return GLECSVDataStatusEOF;
+ } else if (isEol(ch)) {
+ m_error.errorCode = GLECSVErrorUnterminatedString;
+ m_error.errorLine = m_lines;
+ m_error.errorColumn = getUTF8Column(cellPos);
+ createErrorString("unterminated string");
+ return readNewline(ch);
+ } else if (ch == quote) {
+ GLEBYTE ch = readChar();
+ if (ch != quote) {
+ writeChar(ch);
+ createCell(cellSize, cellPos);
+ return skipSpacesAndFirstDelim(ch);
+ }
+ }
+ }
+ return GLECSVDataStatusOK;
+}
+
+GLECSVDataStatus GLECSVData::readCell() {
+ GLEBYTE ch = readSignificantChar();
+ if (ch == '"' || ch == '\'') {
+ return readCellString(ch);
+ }
+ unsigned int cellCount = 0;
+ unsigned int cellSize = 0;
+ unsigned int cellPos = lastCharPos();
+ while (true) {
+ if (ch == 0) {
+ if (isSizeCheckOKEndOfLine(cellSize)) {
+ createCell(cellSize, cellPos);
+ }
+ return GLECSVDataStatusEOF;
+ } else if (isEol(ch)) {
+ if (isSizeCheckOKEndOfLine(cellSize)) {
+ createCell(cellSize, cellPos);
+ }
+ return readNewline(ch);
+ } else if (isDelim(ch)) {
+ m_lastDelimWasSpace = isSpace(ch);
+ if (isSizeCheckOKAtDelim(ch, cellSize)) {
+ createCell(cellSize, cellPos);
+ }
+ return skipSpacesAndFirstDelim(ch);
+ } else if (isComment(ch)) {
+ if (isSizeCheckOKEndOfLine(cellSize)) {
+ createCell(cellSize, cellPos);
+ }
+ return skipTillEol();
+ }
+ cellCount++;
+ if (!isSpace(ch)) {
+ cellSize = cellCount;
+ }
+ ch = readChar();
+ }
+ return GLECSVDataStatusOK;
+}
+
+bool GLECSVData::isSizeCheckOKEndOfLine(unsigned int cellSize) {
+ if (cellSize == 0) {
+ if (m_nextLine) {
+ return false;
+ }
+ if (m_lastDelimWasSpace) {
+ return false;
+ }
+ }
+ return true;
+}
+
+bool GLECSVData::isSizeCheckOKAtDelim(GLEBYTE delim, unsigned int cellSize) {
+ if (cellSize == 0) {
+ if (delim == ' ' || delim == '\t') {
+ return false;
+ }
+ }
+ return true;
+}
+
+void GLECSVData::createCell(unsigned int cellSize, unsigned int cellPos) {
+ if (m_nextLine) {
+ m_firstCell.push_back(m_cellPos.size());
+ m_nextLine = false;
+ }
+ m_cellSize.push_back(cellSize);
+ m_cellPos.push_back(cellPos);
+}
+
+GLECSVDataStatus GLECSVData::readNewline(GLEBYTE prevCh) {
+ m_lines++;
+ m_nextLine = true;
+ GLEBYTE ch = readChar();
+ if (ch == 0) {
+ m_firstColumn = m_pos;
+ return GLECSVDataStatusEOF;
+ }
+ if (isEol(ch) && (ch != prevCh)) {
+ // Found, e.g., CR followed by LF (Windows encoding of new line)
+ m_firstColumn = m_pos;
+ return GLECSVDataStatusEOL;
+ }
+ // Found just CR or just LF (Unix / Mac encoding of new line)
+ goBack();
+ m_firstColumn = m_pos;
+ return GLECSVDataStatusEOL;
+}
+
+void GLECSVData::goBack() {
+ if (m_pos > 0) {
+ m_pos = m_pos - 1;
+ }
+}
+
+unsigned int GLECSVData::lastCharPos() {
+ if (m_pos > 0) {
+ return m_pos - 1;
+ } else {
+ return 0;
+ }
+}
+
+GLEBYTE GLECSVData::readChar() {
+ if (m_pos == m_size) {
+ return 0;
+ } else {
+ GLEBYTE ch = m_data[m_pos];
+ m_pos = m_pos + 1;
+ return ch;
+ }
+}
+
+void GLECSVData::initWritePos() {
+ m_writePos = m_pos;
+}
+
+void GLECSVData::writeChar(GLEBYTE ch) {
+ m_data[m_writePos++] = ch;
+}
+
+GLEBYTE GLECSVData::readSignificantChar() {
+ GLEBYTE ch;
+ do {
+ ch = readChar();
+ if (ch == 0) {
+ return 0;
+ }
+ } while (isSpace(ch));
+ return ch;
+}
+
+GLECSVDataStatus GLECSVData::skipSpacesAndFirstDelim(GLEBYTE ch) {
+ while (true) {
+ if (!isSpace(ch)) {
+ if (ch == 0) {
+ return GLECSVDataStatusEOF;
+ } else if (isEol(ch)) {
+ return readNewline(ch);
+ } else if (isDelim(ch)) {
+ m_lastDelimWasSpace = isSpace(ch);
+ return GLECSVDataStatusOK;
+ } else {
+ goBack();
+ return GLECSVDataStatusOK;
+ }
+ }
+ ch = readChar();
+ }
+ return GLECSVDataStatusOK;
+}
+
+GLECSVError* GLECSVData::getError() {
+ return &m_error;
+}
diff --git a/src/gle/glearray.h b/src/gle/glearray.h
new file mode 100644
index 0000000..df1da1f
--- /dev/null
+++ b/src/gle/glearray.h
@@ -0,0 +1,204 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#ifndef _GLE_ARRAY_H_
+#define _GLE_ARRAY_H_
+
+class GLEObject : public RefCountObject {
+public:
+ GLEObject();
+ virtual ~GLEObject();
+ virtual int size();
+ virtual double getDoubleAt(int i);
+ virtual void setDoubleAt(double v, int i);
+ virtual bool getBoolAt(int i);
+ virtual void setBoolAt(bool v, int i);
+ virtual GLEObject* getObjectAt(int i);
+ virtual void setObjectAt(GLEObject* v, int i);
+};
+
+class GLEObjectArray : public GLEObject {
+protected:
+ RefCountVector<GLEObject> m_Elems;
+public:
+ GLEObjectArray();
+ virtual ~GLEObjectArray();
+ virtual int size();
+ virtual GLEObject* getObjectAt(int i);
+ virtual void setObjectAt(GLEObject* v, int i);
+protected:
+ void resize(int n);
+};
+
+class GLEDoubleArray : public GLEObject {
+protected:
+ vector<double> m_Elems;
+public:
+ GLEDoubleArray();
+ virtual ~GLEDoubleArray();
+ virtual int size();
+ virtual double getDoubleAt(int i);
+ virtual void setDoubleAt(double v, int i);
+ double* toArray();
+protected:
+ void resize(int n);
+};
+
+class GLEBoolArray : public GLEObject {
+protected:
+ vector<bool> m_Elems;
+public:
+ GLEBoolArray();
+ virtual ~GLEBoolArray();
+ virtual int size();
+ virtual bool getBoolAt(int i);
+ virtual void setBoolAt(bool v, int i);
+ int* toArray();
+protected:
+ void resize(int n);
+};
+
+class GLEZData {
+protected:
+ GLERectangle m_XYBounds;
+ double m_ZMin, m_ZMax;
+ int m_NX, m_NY;
+ double* m_Data;
+public:
+ GLEZData();
+ ~GLEZData();
+ void read(const string& fname) throw(ParserError);
+ inline double getZMin() { return m_ZMin; }
+ inline double getZMax() { return m_ZMax; }
+ inline GLERectangle* getBounds() { return &m_XYBounds; }
+ inline int getNX() { return m_NX; }
+ inline int getNY() { return m_NY; }
+ inline double* getData() { return m_Data; }
+};
+
+bool GLEReadFileOrGZIPTxt(const std::string& name, std::string* result);
+
+typedef unsigned char GLEBYTE;
+
+enum GLECSVDataStatus {
+ GLECSVDataStatusOK,
+ GLECSVDataStatusEOL,
+ GLECSVDataStatusEOF
+};
+
+enum GLECSVErrorCode {
+ GLECSVErrorNone,
+ GLECSVErrorFileNotFound,
+ GLECSVErrorUnterminatedString,
+ GLECSVErrorInconsistentNrColumns
+};
+
+class GLECSVError {
+public:
+ GLECSVError();
+ ~GLECSVError();
+ GLECSVErrorCode errorCode;
+ unsigned int errorLine;
+ unsigned int errorColumn;
+ string errorString;
+};
+
+class GLECSVData {
+protected:
+ vector<GLEBYTE> m_buffer;
+ vector<unsigned int> m_cellPos;
+ vector<unsigned int> m_cellSize;
+ vector<unsigned int> m_firstCell;
+ GLEBYTE* m_data;
+ bool* m_delims;
+ unsigned int m_size;
+ unsigned int m_pos;
+ unsigned int m_writePos;
+ unsigned int m_lines;
+ unsigned int m_firstColumn;
+ unsigned int m_nextLine;
+ unsigned int m_ignoreHeader;
+ GLECSVError m_error;
+ string m_fileName;
+ string m_comment;
+ bool m_lastDelimWasSpace;
+public:
+ GLECSVData();
+ ~GLECSVData();
+ bool read(const std::string& file);
+ void readBuffer(const char* buffer);
+ void print(ostream& os);
+ void setDelims(const char* delims);
+ void setCommentIndicator(const char* comment);
+ void setIgnoreHeader(unsigned int ignore);
+ GLECSVError* getError();
+ unsigned int getNbLines();
+ unsigned int getNbColumns(unsigned int line);
+ const char* getCell(unsigned int row, unsigned int column, unsigned int* size);
+ string getCellString(unsigned int row, unsigned int column);
+ void setCellTrim(unsigned int row, unsigned int column, const char* data);
+ unsigned int validateIdenticalNumberOfColumns();
+private:
+ bool readBlock(const std::string& file);
+ void parseBlock();
+ void initDelims();
+ bool isDelim(GLEBYTE ch);
+ bool isSpace(GLEBYTE ch);
+ bool isEol(GLEBYTE ch);
+ bool isComment(GLEBYTE ch);
+ GLECSVDataStatus skipTillEol();
+ GLECSVDataStatus ignoreHeader();
+ GLECSVDataStatus readCellString(GLEBYTE quote);
+ GLECSVDataStatus readCell();
+ void createCell(unsigned int cellSize, unsigned int cellPos);
+ GLECSVDataStatus readNewline(GLEBYTE prevCh);
+ bool isSizeCheckOKEndOfLine(unsigned int cellSize);
+ bool isSizeCheckOKAtDelim(GLEBYTE delim, unsigned int cellSize);
+ void goBack();
+ unsigned int lastCharPos();
+ GLEBYTE readChar();
+ GLEBYTE readSignificantChar();
+ void initWritePos();
+ void writeChar(GLEBYTE ch);
+ GLECSVDataStatus skipSpacesAndFirstDelim(GLEBYTE ch);
+ void createErrorString(const string& str);
+ unsigned int getUTF8Column(unsigned int cellPos);
+ unsigned int getFirstCell(unsigned int line);
+};
+
+#endif
diff --git a/src/gle/glebtool.cpp b/src/gle/glebtool.cpp
new file mode 100644
index 0000000..70ad41c
--- /dev/null
+++ b/src/gle/glebtool.cpp
@@ -0,0 +1,203 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <iostream>
+#include <fstream>
+#include <string>
+#include <vector>
+
+using namespace std;
+
+#include "basicconf.h"
+#include "cutils.h"
+#include "file_io.h"
+#include "tokens/stokenizer.h"
+
+void GLEFindRelPath(const string& p1, const string& p2, string* result, int* nb) {
+ char path = '/';
+ #ifdef __WIN32__
+ path = '\\';
+ #endif
+ char spliton[2];
+ spliton[0] = path;
+ spliton[1] = 0;
+ string nxt1;
+ string nxt2;
+ char_separator separator(spliton, "");
+ tokenizer<char_separator> tok1(p1, separator);
+ tokenizer<char_separator> tok2(p2, separator);
+ bool more1 = tok1.has_more();
+ bool more2 = tok2.has_more();
+ while (more1 && more2) {
+ nxt1 = tok1.next_token();
+ nxt2 = tok2.next_token();
+ if (!str_i_equals(nxt1, nxt2)) break;
+ more1 = tok1.has_more();
+ more2 = tok2.has_more();
+ }
+ string rpath;
+ int nb_back = 0;
+ if (str_i_equals(nxt1, nxt2)) {
+ int pos = 0;
+ while (tok2.has_more()) {
+ if (pos != 0) rpath += spliton;
+ rpath += tok2.next_token();
+ pos++;
+ }
+ } else {
+ rpath = nxt2;
+ while (tok2.has_more()) {
+ rpath += spliton;
+ rpath += tok2.next_token();
+ }
+ if (more1) {
+ nb_back++;
+ while (tok1.has_more()) {
+ tok1.next_token();
+ nb_back++;
+ }
+ }
+ }
+ *result = rpath;
+ *nb = nb_back;
+}
+
+int do_setrelpath(char** argv) {
+ string bin = argv[0];
+ string lib = argv[1];
+ string data = argv[2];
+ string doc = argv[3];
+ string config = argv[4];
+ cout << "GLE will be installed as follows:" << endl;
+ cout << "Binary: \"" << bin << "\"" << endl;
+ cout << "Library: \"" << lib << "\"" << endl;
+ /* LIB dir */
+ string rel_lib;
+ int rel_lib_nb;
+ GLEFindRelPath(bin, lib, &rel_lib, &rel_lib_nb);
+ cout << " (Up: " << rel_lib_nb << ", Relative: \"" << rel_lib << "\")" << endl;
+ /* GLE_TOP */
+ string rel_data;
+ int rel_data_nb;
+ GLEFindRelPath(bin, data, &rel_data, &rel_data_nb);
+ cout << "GLE_TOP: \"" << data << "\"" << endl;
+ cout << " (Up: " << rel_data_nb << ", Relative: \"" << rel_data << "\")" << endl;
+ /* DOC dir */
+ string rel_doc;
+ int rel_doc_nb;
+ GLEFindRelPath(data, doc, &rel_doc, &rel_doc_nb);
+ cout << "DOC: \"" << doc << "\"" << endl;
+ cout << " (Up: " << rel_doc_nb << ", Relative: \"" << rel_doc << "\")" << endl;
+ /* Create config.h */
+ vector<string> lines;
+ ifstream ifile(config.c_str());
+ if (!ifile.good()) {
+ cout << "Can't open: '" << config << "'" << endl;
+ return -1;
+ }
+ while (!ifile.eof()) {
+ string line;
+ ReadFileLine(ifile, line);
+ if (str_i_str(line.c_str(), "[SETRELPATH]")) {
+ break;
+ }
+ lines.push_back(line);
+ }
+ ifile.close();
+ ofstream ofile(config.c_str());
+ for (vector<string>::size_type i = 0; i < lines.size(); i++) {
+ ofile << lines[i] << endl;
+ }
+ ofile << endl;
+ ofile << "/* [SETRELPATH]: The following lines have been added by 'build/bin/setrelpath' */" << endl;
+ ofile << "#define GLETOP_CD " << rel_data_nb << endl;
+ ofile << "#define GLETOP_REL \"" << rel_data << "\"" << endl;
+ ofile << "#define GLETOP_ABS \"" << data << "\"" << endl;
+ ofile << endl;
+ ofile << "#define GLELIB_CD " << rel_lib_nb << endl;
+ ofile << "#define GLELIB_REL \"" << rel_lib << "\"" << endl;
+ ofile << "#define GLELIB_ABS \"" << lib << "\"" << endl;
+ ofile << endl;
+ ofile << "#define GLEDOC_CD " << rel_doc_nb << endl;
+ ofile << "#define GLEDOC_REL \"" << rel_doc << "\"" << endl;
+ ofile << "#define GLEDOC_ABS \"" << doc << "\"" << endl;
+ ofile << endl;
+ ofile.close();
+ return 0;
+}
+
+int do_latexdef(char** argv) {
+ string fname = argv[0];
+ string def = argv[1];
+ string value = argv[2];
+ ofstream ofile(fname.c_str());
+ ofile << "\\newcommand{\\" << def << "}[1]{";
+ if (value == "1") {
+ ofile << "#1";
+ }
+ ofile << "}" << endl;
+ ofile.close();
+ return 0;
+}
+
+int do_latex_gle_version(char** argv) {
+ string fname = argv[0];
+ ofstream ofile(fname.c_str(), ios::app);
+ ofile << "\\newcommand{\\gleversion}{" << GLEVN << "}" << std::endl;
+ ofile.close();
+ return 0;
+}
+
+int main(int argc, char** argv) {
+ string option = argv[1];
+ if (option == "-setrelpath") {
+#ifndef __WIN32__
+ return do_setrelpath(argv + 2);
+#else
+ return 0;
+#endif
+ } else if (option == "-latexdef") {
+ return do_latexdef(argv + 2);
+ } else if (option == "-latexversion") {
+ return do_latex_gle_version(argv + 2);
+ }
+ return -1;
+}
diff --git a/src/gle/glec.cpp b/src/gle/glec.cpp
new file mode 100644
index 0000000..09ee70f
--- /dev/null
+++ b/src/gle/glec.cpp
@@ -0,0 +1,171 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+/**
+ * GLE command line version using libGLE.so
+ ***/
+
+#include <stdio.h>
+#include <string>
+#include <iostream>
+
+#ifdef HAVE_CONFIG_H
+ #include "../config.h"
+#else
+ #include "../config_noauto.h"
+#endif
+
+#ifdef __WIN32__
+ #include <windows.h>
+#endif
+#ifdef __UNIX__
+ #include <dlfcn.h>
+#endif
+
+using namespace std;
+
+bool GetExeName(const char* appname, char **argv, string& exe_name);
+void StripPathComponents(string* fname, int nb);
+string GLEAddRelPath(const string& base, int cd, const char* path);
+void AddDirSep(string& fname);
+
+extern string DIR_SEP;
+
+void GLEAddLibName(string* lib) {
+ AddDirSep(*lib);
+ *lib += "libgle-graphics-";
+ *lib += GLEVN;
+#ifdef __UNIX__
+ #ifdef __MACOS__
+ *lib += ".dylib";
+ #else
+ *lib += ".so";
+ #endif
+#endif
+#ifdef __WIN32__
+ *lib += ".dll";
+#endif
+// cout << "Trying: " << (*lib) << endl;
+}
+
+void* tryLoadLib(const string& name, int tryCount, bool verbose) {
+ void* lib = 0;
+#ifdef __UNIX__
+ lib = dlopen(name.c_str(), RTLD_NOW);
+#endif
+ if (verbose) {
+ cout << "Try: " << (tryCount + 1) << " load '" << name << "':" << endl;
+ if (lib == 0) {
+#ifdef __UNIX__
+ cout << "error: " << dlerror();
+#endif
+ } else {
+ cout << "OK";
+ }
+ cout << endl;
+ }
+ return lib;
+}
+
+int main(int argc, char** argv) {
+ string exe_name;
+ int (*GLEMain)(int g_argc, char** g_argv);
+ if (!GetExeName("gle", argv, exe_name)) {
+ cerr << "GLE: error getting file name of 'gle' executable" << endl;
+ return -1;
+ }
+#ifdef __UNIX__
+ string lib_name;
+ void* lib = NULL;
+ unsigned int tryCount = 0;
+ while (lib == 0 && tryCount < 2) {
+#ifdef GLELIB_CD
+ if (lib == NULL) {
+ lib_name = GLEAddRelPath(exe_name, GLELIB_CD+1, GLELIB_REL);
+ GLEAddLibName(&lib_name);
+ lib = tryLoadLib(lib_name, tryCount, tryCount == 1);
+ }
+#endif
+ if (lib == NULL) {
+ // Try "../lib"
+ lib_name = GLEAddRelPath(exe_name, 2, "lib");
+ GLEAddLibName(&lib_name);
+ lib = tryLoadLib(lib_name, tryCount, tryCount == 1);
+ }
+#ifdef GLELIB_ABS
+ if (lib == NULL) {
+ lib_name = GLELIB_ABS;
+ GLEAddLibName(&lib_name);
+ lib = tryLoadLib(lib_name, tryCount, tryCount == 1);
+ }
+#endif
+ tryCount++;
+ }
+ if (lib == NULL) {
+ cerr << "GLE: error loading library" << endl;
+ return -1;
+ }
+ const char* error = NULL;
+ GLEMain = (int (*)(int, char**))dlsym(lib, "GLEMain");
+ if (GLEMain == NULL && (error = dlerror()) != NULL) {
+ cerr << "GLE: can't find main method in library '" << lib_name << "'" << endl;
+ cerr << "Message: " << error << endl;
+ return -1;
+ }
+ int result = GLEMain(argc, argv);
+ dlclose(lib);
+#endif
+#ifdef __WIN32__
+ string lib_name = exe_name;
+ StripPathComponents(&lib_name, 1);
+ GLEAddLibName(&lib_name);
+ HMODULE lib = LoadLibraryA(lib_name.c_str());
+ if (lib < (HINSTANCE)HINSTANCE_ERROR) {
+ cerr << "GLE: error loading library '" << lib_name << "'" << endl;
+ return -1;
+ }
+ GLEMain = (int (*)(int, char**))GetProcAddress(lib, "GLEMain");
+ if (GLEMain == NULL) {
+ cerr << "GLE: can't find main method in library '" << lib_name << "'" << endl;
+ return -1;
+ }
+ int result = GLEMain(argc, argv);
+ // FreeLibrary(lib);
+#endif
+ return result;
+}
diff --git a/src/gle/glepro.h b/src/gle/glepro.h
new file mode 100644
index 0000000..77685d3
--- /dev/null
+++ b/src/gle/glepro.h
@@ -0,0 +1,156 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#ifndef INCLUDE_GLEPRO
+#define INCLUDE_GLEPRO
+
+#include "tokens/Tokenizer.h"
+
+class GLEColor;
+class GLEString;
+
+#define SC (char *)
+#define UC (unsigned char *)
+
+#define GLE_TRNS_MATRIX_SIZE 3*3*sizeof(double)
+
+typedef double dbl;
+
+typedef unsigned char uchar;
+
+//int do_pcode(int *srclin, int *pcode, int plen, int *pend);
+char *eval_str(int *pcode,int *plen);
+string gledir(const char *filename);
+const char *gle_top(void);
+char *sdup(const char *s);
+double graph_xgraph(double v);
+double graph_ygraph(double v);
+double myatan2(double y, double x);
+double tex_xend(void);
+double tex_yend(void);
+void df_arc(dbl r,dbl t1,dbl t2,dbl cx,dbl cy);
+void df_arcto(dbl x1, dbl y1, dbl x2, dbl y2, dbl r);
+int df_box_fill(dbl x1, dbl y1, dbl x2, dbl y2);
+int df_box_stroke(dbl x1, dbl y1, dbl x2, dbl y2);
+int df_circle_fill(dbl r);
+int df_circle_stroke(dbl r);
+int df_narc(dbl r,dbl t1,dbl t2,dbl cx,dbl cy);
+int mem_total(void);
+int mem_worst(void);
+GLERC<GLEColor> pass_color_var(const std::string& token) throw(ParserError);
+int pass_font(const std::string& token);
+int pass_justify(const std::string& token);
+int pass_marker(char *s) throw(ParserError);
+int testfree(int i);
+int text_printf(int *in,int ilen);
+int w_message(char *s);
+void init_memory(void);
+void *myalloc(int size);
+void *myallocn(int nitems,int size);
+void *myallocz(int size);
+void add_svga(void);
+void alloc_temp(int n);
+void big_close(void);
+void box_clip(double *x1, double *y1, double xmin, double ymin, double xmax, double ymax);
+void char_bbox(int ff,int cc,double *xx1, double *yy1, double *xx2, double *yy2);
+void cmd_name(int idx, char **cp);
+void d_tidyup(void);
+void debug_polish(int *pcode,int *zcp);
+void dr_init(void);
+void f_init(void);
+void find_mkey(string cp, int *idx);
+void find_un(char *cp, int *idx,int *ret,int *np,int **plist);
+void font_get_lineskip(double *ls,double *gap);
+void font_get_parskip(double *ls,double *gap);
+void font_init(void);
+void font_load_metric(int ff);
+void font_replace_vector(int ff);
+void freefont(int i);
+void g_shear(double sx,double sy);
+void gle_include(char *s);
+void gprint_do(char *output);
+void gr_nomiss(int i);
+void gr_thrownomiss(void);
+void graph_freedata(void);
+void myfree(void *p);
+void myfrees(void *p, const char *s);
+void mystrcpy(char **d, const char *s);
+void ncpy(char *d, const char *s, int n);
+void polar_xy(double r, double angle, double *dx, double *dy);
+void polar_xy(double rx, double ry, double angle, double *dx, double *dy);
+void scheck(int v);
+void set_glue(int *in,int ilen,double actual,double width,double stretch,double shrink,double *setlen);
+void setdstr(char **s, const char *in);
+void setdstr(char **s, const std::string& in);
+void setsstr(char **s, const char *in);
+void showpcode(int *p);
+void spop(int v);
+void spush(int v);
+void sub_clear(bool undef);
+void sub_get_startend(int idx, int *ss, int *ee);
+void sub_set_return(double d);
+void sub_set_return_str(GLEString* s);
+void subscript();
+void text_block(const string& s,double width,int justify);
+void text_block(const string& s,double width,int justify, int innerjust);
+void text_draw(int *in,int ilen);
+void text_tomacro(const string& in, uchar *out);
+void text_topcode(uchar *in, int *out, int *lout) /* passed a paragraph */;
+void text_wrapcode(int *in,int ilen,double width);
+void wprintf_do(char *s);
+void xy_polar(double dx,double dy,double *radius,double *angle);
+void reset_new_error(bool val);
+int get_nb_errors();
+void inc_nb_errors();
+const char* get_font_name(int idx);
+int get_nb_fonts();
+void pass_file_name(const char* name, string& file);
+int get_nb_extra_args();
+const string& get_extra_arg(int i);
+void gle_abort(const char *s);
+void do_wait_for_enter();
+void do_wait_for_enter_exit(int exitcode);
+void validate_open_input_stream(ifstream& input, const string& fname) throw(ParserError);
+FILE* validate_fopen(const string& fname, const char *mode, bool isread) throw(ParserError);
+void validate_file_name(const string& fname, bool isread) throw(ParserError);
+string fontdir(const char *s);
+int check_has_font(const std::string& name);
+int get_marker_string(const string& marker, IThrowsError* error);
+void gle_set_constants();
+
+#endif
diff --git a/src/gle/gprint.cpp b/src/gle/gprint.cpp
new file mode 100644
index 0000000..feb9117
--- /dev/null
+++ b/src/gle/gprint.cpp
@@ -0,0 +1,167 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#include "all.h"
+#include "file_io.h"
+#include "gle-interface/gle-interface.h"
+#include "core.h"
+
+typedef double dbl;
+
+//#ifndef unix
+#include <stdarg.h>
+//#endif
+#include "gprint.h"
+#include "cutils.h"
+char *line(int i);
+#define false 0
+#define true (!false)
+
+int this_line = -1;
+int g_error_col = -1;
+int last_line = -1;
+extern int trace_on;
+bool new_error = true;
+extern int ngerror;
+void gprint_send(const char* ss);
+void gprint_send(const string& output);
+void check_new_error();
+
+extern GLEGlobalSource* g_Source;
+
+#ifdef __UNIX__
+ void gprint(const char* arg_list, ...)
+#else
+ void gprint(va_list arg_list, ...)
+#endif
+/* Prints an error message */
+{
+ va_list arg_ptr;
+ char *format;
+ char output[1024];
+ va_start(arg_ptr, arg_list);
+ format = (char*)arg_list;
+ vsprintf(output, format, arg_ptr);
+ output[1023] = 0;
+ check_new_error();
+ gprint_send(output);
+ g_set_error_column(-1);
+}
+
+void gprint(const string& output) {
+ check_new_error();
+ gprint_send(output);
+ g_set_error_column(-1);
+}
+
+void check_new_error() {
+ if (new_error) {
+ ngerror++;
+ if (last_line != this_line && this_line != -1 && !trace_on && g_Source != NULL) {
+ GLEErrorMessage err;
+ int errorLine = this_line-1;
+ if (errorLine >= 0 && errorLine < g_Source->getNbLines()) {
+ GLESourceLine* line = g_Source->getLine(errorLine);
+ err.setLine(line->getLineNo());
+ err.setColumn(g_error_col);
+ err.setFile(line->getFileName());
+ ostringstream ss;
+ err.setDelta(line->showLineAbbrev(ss, g_error_col));
+ err.setLineAbbrev(ss.str());
+ } else {
+ // to prevent crash in case of incorrect line number
+ err.setLine(this_line);
+ err.setColumn(g_error_col);
+ ostringstream ss;
+ ss << "can't derive source file for internal line #" << this_line;
+ err.setLineAbbrev(ss.str());
+ }
+ GLEInterface* iface = GLEGetInterfacePointer();
+ iface->getOutput()->error(&err);
+ }
+ last_line = this_line;
+ new_error = false;
+ }
+}
+
+void gprint_send(const char *ss) {
+ string output = ss;
+ gprint_send(output);
+}
+
+/* No new error if does not end in \n */
+void gprint_send(const string& output) {
+ string strg = output;
+ string::size_type pos = strg.find('\n');
+ while (pos != string::npos) {
+ string part = strg.substr(0, pos);
+ g_message((char*)part.c_str());
+ string::size_type len = strg.length();
+ strg = strg.substr(pos+1, len-pos);
+ pos = strg.find('\n');
+ }
+ if (gle_onlyspace(strg)) {
+ new_error = true;
+ } else {
+ g_message((char*)strg.c_str());
+ }
+}
+
+void reset_new_error(bool val) {
+ new_error = val;
+}
+
+int get_nb_errors() {
+ return ngerror;
+}
+
+void inc_nb_errors() {
+ ngerror++;
+}
+
+void g_set_error_column(int col) {
+ g_error_col = col;
+}
+
+void g_set_error_line(int lin) {
+ this_line = lin;
+}
+
+int g_get_error_line() {
+ return this_line;
+}
diff --git a/src/gle/gprint.h b/src/gle/gprint.h
new file mode 100644
index 0000000..870518d
--- /dev/null
+++ b/src/gle/gprint.h
@@ -0,0 +1,52 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#if defined(__NOCYGWIN__)
+ #include <stdarg.h>
+#endif
+#if defined(__UNIX__)
+ void gprint(const char* arg_list, ...);
+#else
+ void gprint(va_list arg_list, ...);
+#endif
+
+void gprint(const string& output);
+
+void g_set_error_column(int col);
+void g_set_error_line(int lin);
+int g_get_error_line();
diff --git a/src/gle/graph.cpp b/src/gle/graph.cpp
new file mode 100644
index 0000000..6a1a13b
--- /dev/null
+++ b/src/gle/graph.cpp
@@ -0,0 +1,2194 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#define GRAPHDEF
+
+#include "all.h"
+#include "tokens/stokenizer.h"
+#include "cutils.h"
+#include "mem_limits.h"
+#include "token.h"
+#include "core.h"
+#include "glearray.h"
+#include "polish.h"
+#include "pass.h"
+#include "var.h"
+#include "graph.h"
+#include "begin.h"
+#include "axis.h"
+#include "gprint.h"
+#include "key.h"
+#include "justify.h"
+#include "file_io.h"
+#include "keyword.h"
+#include "run.h"
+
+#define GLEG_CMD_AXIS 1
+#define GLEG_CMD_LABELS 2
+#define GLEG_CMD_SIDE 3
+#define GLEG_CMD_SUBTICKS 4
+#define GLEG_CMD_TICKS 5
+
+#define BAR_SET_COLOR 0
+#define BAR_SET_FILL 1
+#define BAR_SET_TOP 2
+#define BAR_SET_SIDE 3
+#define BAR_SET_PATTERN 4
+#define BAR_SET_BACKGROUND 5
+
+extern int trace_on;
+static int xxgrid[GLE_AXIS_MAX+1];
+
+KeyInfo* g_keyInfo = 0;
+GLEGraphBlockData* g_graphBlockData = 0;
+
+vector<GLELet*> g_letCmds;
+int g_nbar = 0;
+GLERC<GLEColor> g_graph_background;
+
+int freedataset(int i);
+void free_temp(void);
+void set_sizelength(void);
+void draw_graph(KeyInfo* keyinfo, GLEGraphBlockInstance* graphBlock) throw (ParserError);
+void do_set_bar_color(const char* tk, bar_struct* bar, int type);
+void do_set_bar_style(const char* tk, bar_struct* bar);
+void do_axis_part_all(int xset) throw (ParserError);
+bool do_remaining_entries(int ct, bool isCommandCheck);
+void graph_freebars();
+double get_next_exp(TOKENS tk,int ntk,int *curtok);
+void data_command(GLESourceLine& sline);
+void do_discontinuity();
+void do_bar(int& ct, GLEGraphBlockInstance* graphBlock);
+void do_fill(int& ct, GLEGraphBlockInstance* graphBlock);
+void do_hscale(int& ct);
+void do_letsave(GLESourceLine& sline);
+void do_size(int& ct);
+void do_key(int& ct);
+void do_vscale(int& ct);
+void do_scale(int& ct);
+void do_colormap(int& ct);
+void do_main_title(int& ct);
+void do_noticks(int& ct);
+void do_names(int& ct);
+void do_places(int& ct);
+void do_title(int& ct);
+void do_datasets(int& ct, GLEGraphBlockInstance* graphBlock);
+bool is_dataset_identifier(const char* ds);
+GLESub* sub_find(const string& s);
+
+GLEAxis xx[GLE_AXIS_MAX+1];
+GLEColorMap* g_colormap;
+
+bool check_axis_command_name(const char* name, const char* cmp) {
+ int type = axis_type(name);
+ if (type != GLE_AXIS_ALL) {
+ int len = strlen(name);
+ if (len > 2 && name[1] >= '0' && name[1] <= '9') {
+ return str_i_equals(name+2, cmp);
+ } else if (len > 1) {
+ return str_i_equals(name+1, cmp);
+ }
+ }
+ return false;
+}
+
+void ensureDataSetCreated(int d) {
+ if (dp[d] == NULL) {
+ dp[d] = new GLEDataSet(d);
+ copy_default(d);
+ if (ndata < d) ndata = d;
+ }
+}
+
+void ensureDataSetCreatedAndSetUsed(int d) {
+ ensureDataSetCreated(d);
+ dp[d]->axisscale = true;
+ g_graphBlockData->getOrder()->addDataSet(d);
+}
+
+void replace_exp(string& exp);
+
+fill_data::fill_data():
+ layer(0),
+ da(0),
+ db(0),
+ type(0),
+ xmin(GLE_INF),
+ ymin(GLE_INF),
+ xmax(-GLE_INF),
+ ymax(-GLE_INF)
+{
+}
+
+GLEInternalClassDefinitions::GLEInternalClassDefinitions() {
+ m_keySeparator = new GLEClassDefinition("key_separator");
+ m_keySeparator->addField("lstyle");
+ m_drawCommand = new GLEClassDefinition("draw_command");
+ m_drawCommand->addField("index");
+ m_fill = new GLEClassDefinition("fill");
+ m_fill->addField("index");
+ m_bar = new GLEClassDefinition("bar");
+ m_bar->addField("index");
+}
+
+GLEGraphDataSetOrder::GLEGraphDataSetOrder(GLEGraphBlockData* data):
+ m_data(data),
+ m_order(new GLEArrayImpl())
+{
+}
+
+void GLEGraphDataSetOrder::addDataSet(int dataSetID) {
+ std::set<int>::iterator found(m_isIn.find(dataSetID));
+ if (found == m_isIn.end()) {
+ m_isIn.insert(dataSetID);
+ m_order->addInt(dataSetID);
+ }
+}
+
+void GLEGraphDataSetOrder::addObject(GLEDataObject* object) {
+ m_order->addObject(object);
+}
+
+GLEGraphBlockData::GLEGraphBlockData(GLEGraphBlockBase* graphBlockBase):
+ m_graphBlockBase(graphBlockBase),
+ m_order(new GLEGraphDataSetOrder(this))
+{
+}
+
+class GLEGraphDrawCommand {
+public:
+ GLEGraphDrawCommand(int layer);
+ virtual ~GLEGraphDrawCommand();
+
+ void createGraphDrawCommand(GLESourceLine& sline);
+ void draw();
+ int getLayer() const;
+
+private:
+ GLESub* m_sub;
+ GLEArrayImpl m_arguments;
+ int m_layer;
+};
+
+GLEGraphDrawCommand::GLEGraphDrawCommand(int layer):
+ m_sub(0),
+ m_layer(layer)
+{
+}
+
+GLEGraphDrawCommand::~GLEGraphDrawCommand() {
+}
+
+void GLEGraphDrawCommand::createGraphDrawCommand(GLESourceLine& sline) {
+ GLEParser* parser = get_global_parser();
+ parser->setString(sline.getCodeCStr());
+ Tokenizer* tokens = parser->getTokens();
+ tokens->ensure_next_token_i("DRAW");
+ std::string subName(tokens->next_token());
+ str_to_uppercase(subName);
+ m_sub = sub_find((char*)subName.c_str());
+ if (m_sub != NULL) {
+ GLESubCallInfo info(m_sub);
+ parser->pass_subroutine_call(&info, tokens->token_pos_col());
+ parser->evaluate_subroutine_arguments(&info, &m_arguments);
+ } else {
+ g_throw_parser_error("function '", subName.c_str(), "' not defined");
+ }
+}
+
+void GLEGraphDrawCommand::draw() {
+ getGLERunInstance()->sub_call(m_sub, &m_arguments);
+}
+
+int GLEGraphDrawCommand::getLayer() const {
+ return m_layer;
+}
+
+GLEGraphPart::GLEGraphPart() {
+}
+
+GLEGraphPart::~GLEGraphPart() {
+}
+
+void GLEGraphPart::drawLayer(int /* layer */) {
+}
+
+void GLEGraphPart::addToOrder(GLEGraphDataSetOrder* /* order */) {
+}
+
+void GLEGraphPart::drawLayerObject(int /* layer */, GLEMemoryCell* /* object */) {
+}
+
+GLEGraphDrawCommands::GLEGraphDrawCommands() {
+}
+
+GLEGraphDrawCommands::~GLEGraphDrawCommands() {
+}
+
+std::set<int> GLEGraphDrawCommands::getLayers() {
+ std::set<int> result;
+ for (int i = 0; i < int(m_drawCommands.size()); ++i) {
+ result.insert(m_drawCommands[i]->getLayer());
+ }
+ return result;
+}
+
+void GLEGraphDrawCommands::drawLayerObject(int layer, GLEMemoryCell* object) {
+ GLEClassInstance* classObj = getGLEClassInstance(object, g_graphBlockData->getGraphBlockBase()->getClassDefinitions()->getDrawCommand());
+ if (classObj != 0) {
+ int index = classObj->getArray()->getInt(0);
+ if (m_drawCommands[index]->getLayer() == layer) {
+ g_gsave();
+ g_beginclip();
+ g_set_path(true);
+ g_newpath();
+ g_box_stroke(xbl, ybl, xbl+xlength, ybl+ylength, false);
+ g_clip();
+ g_set_path(false);
+ g_set_hei(g_fontsz);
+ m_drawCommands[index]->draw();
+ g_endclip();
+ g_grestore();
+ }
+ }
+}
+
+void GLEGraphDrawCommands::doDrawCommand(GLESourceLine& sline, GLEGraphBlockInstance* graphBlock)
+{
+ int index = m_drawCommands.size();
+ GLEGraphDrawCommand* cmd = new GLEGraphDrawCommand(graphBlock->getLayerWithDefault(GLE_GRAPH_LAYER_DRAW_COMMAND));
+ m_drawCommands.push_back(cmd);
+ GLEGraphDataSetOrder* order = graphBlock->getData()->getOrder();
+ GLEClassDefinition* classDef = graphBlock->getGraphBlockBase()->getClassDefinitions()->getDrawCommand();
+ GLEClassInstance* classObj = new GLEClassInstance(classDef);
+ order->addObject(classObj);
+ classObj->getArray()->addInt(index);
+ cmd->createGraphDrawCommand(sline);
+}
+
+GLEGraphBlockInstance::GLEGraphBlockInstance(GLEGraphBlockBase* parent):
+ GLEBlockInstance(parent),
+ m_graphBlockBase(parent),
+ m_layer(GLE_GRAPH_LAYER_UNDEFINED),
+ m_data(0)
+{
+ m_drawCommands = new GLEGraphDrawCommands();
+ m_axis = new GLEGraphPartAxis();
+
+ m_graphParts.push_back(new GLEGraphPartGrid());
+ m_graphParts.push_back(new GLEGraphPartFills());
+ m_graphParts.push_back(new GLEGraphPartBars());
+ m_graphParts.push_back(m_axis);
+ m_graphParts.push_back(new GLEGraphPartLines());
+ m_graphParts.push_back(new GLEGraphPartErrorBars());
+ m_graphParts.push_back(new GLEGraphPartMarkers());
+ m_graphParts.push_back(m_drawCommands);
+}
+
+GLEGraphBlockInstance::~GLEGraphBlockInstance() {
+}
+
+void GLEGraphBlockInstance::executeLine(GLESourceLine& sline) {
+ execute_graph(sline, false, this);
+}
+
+void GLEGraphBlockInstance::endExecuteBlock() {
+ draw_graph(g_keyInfo, this);
+}
+
+void GLEGraphBlockInstance::doDrawCommand(GLESourceLine& sline) {
+ m_drawCommands->doDrawCommand(sline, this);
+}
+
+int GLEGraphBlockInstance::getLayer() const {
+ return m_layer;
+}
+
+int GLEGraphBlockInstance::getLayerWithDefault(int defaultLayer) const {
+ if (m_layer == GLE_GRAPH_LAYER_UNDEFINED) {
+ return defaultLayer;
+ } else {
+ return m_layer;
+ }
+}
+
+void GLEGraphBlockInstance::setLayer(int layer) {
+ m_layer = layer;
+}
+
+void GLEGraphBlockInstance::drawParts() {
+ typedef std::set<int> LayerSet;
+ LayerSet allLayers;
+ GLEVectorAutoDelete<LayerSet> partLayers;
+ GLEGraphDataSetOrder* order = getData()->getOrder();
+ for (int i = 0; i < int(m_graphParts.size()); ++i) {
+ m_graphParts[i]->addToOrder(order);
+ }
+ for (int i = 0; i < int(m_graphParts.size()); ++i) {
+ LayerSet layers(m_graphParts[i]->getLayers());
+ allLayers.insert(layers.begin(), layers.end());
+ partLayers.push_back(new LayerSet(layers.begin(), layers.end()));
+ }
+ for (LayerSet::const_iterator layer(allLayers.begin()); layer != allLayers.end(); ++layer) {
+ for (int i = 0; i < int(m_graphParts.size()); ++i) {
+ if (partLayers[i]->count(*layer) != 0) {
+ m_graphParts[i]->drawLayer(*layer);
+ }
+ }
+ GLEArrayImpl* orderArray = order->getArray();
+ for (unsigned int j = 0; j < orderArray->size(); ++j) {
+ for (int i = 0; i < int(m_graphParts.size()); ++i) {
+ if (partLayers[i]->count(*layer) != 0) {
+ m_graphParts[i]->drawLayerObject(*layer, orderArray->get(j));
+ }
+ }
+ }
+ }
+}
+
+GLEGraphPartAxis* GLEGraphBlockInstance::getAxis() {
+ return m_axis;
+}
+
+void GLEGraphBlockInstance::setData(GLEGraphBlockData* data) {
+ m_data = data;
+}
+
+GLEGraphBlockData* GLEGraphBlockInstance::getData() {
+ return m_data;
+}
+
+GLEGraphBlockBase* GLEGraphBlockInstance::getGraphBlockBase() {
+ return m_graphBlockBase;
+}
+
+GLEGraphBlockBase::GLEGraphBlockBase():
+ GLEBlockBase("graph", false),
+ m_classDefinitions(new GLEInternalClassDefinitions())
+{
+}
+
+GLEGraphBlockBase::~GLEGraphBlockBase() {
+
+}
+
+GLEBlockInstance* GLEGraphBlockBase::beginExecuteBlockImpl(GLESourceLine& sline, int *pcode, int *cp) {
+ GLEGraphBlockInstance* graphBlock = new GLEGraphBlockInstance(this);
+ begin_graph(this, graphBlock);
+ return graphBlock;
+}
+
+bool GLEGraphBlockBase::checkLine(GLESourceLine& sline) {
+ return execute_graph(sline, true, 0);
+}
+
+// Font sizes in a graph are based in g_fontsz, but this was set in the original
+// GLE to a fixed proportion of the largest dimension of a graph. The size of an
+// axis is defined in terms of its base size, which is equal to g_fontsz.
+// A useful value for base is 0.25
+
+void begin_graph(GLEGraphBlockBase* graphBlockBase, GLEGraphBlockInstance* graphBlock) throw (ParserError) {
+ g_colormap = NULL;
+ for (unsigned int i = 0; i < g_letCmds.size(); i++) {
+ deleteLet(g_letCmds[i]);
+ }
+ g_letCmds.clear();
+ delete g_keyInfo;
+ g_keyInfo = new KeyInfo();
+ delete g_graphBlockData;
+ g_graphBlockData = new GLEGraphBlockData(graphBlockBase);
+ graphBlock->setData(g_graphBlockData);
+ g_hscale = .7;
+ g_vscale = .7;
+ g_discontinuityThreshold = GLE_INF;
+ if (g_get_compatibility() == GLE_COMPAT_35) {
+ g_nobox = false;
+ } else {
+ g_nobox = true;
+ }
+ g_center = false;
+ g_auto_s_h = false;
+ g_auto_s_v = false;
+ g_math = false;
+ for (int i = 1; i <= GLE_AXIS_MAX; i++) {
+ xxgrid[i] = 0;
+ vinit_axis(i);
+ }
+ graph_init();
+ g_get_usersize(&g_xsize,&g_ysize);
+ g_get_hei(&g_fontsz);
+ set_sizelength();
+ dp[0] = new GLEDataSet(0); /* dataset for default settings */
+}
+
+bool execute_graph(GLESourceLine& sline, bool isCommandCheck, GLEGraphBlockInstance* graphBlock) {
+ begin_init();
+ int st = begin_token(sline, srclin, tk, &ntk, outbuff, !isCommandCheck);
+ if (!st) {
+ return false;
+ }
+ int ct = 1;
+ if (str_i_equals(tk[ct],"BAR")) {
+ if (isCommandCheck) return true;
+ do_bar(ct, graphBlock);
+ } else if (str_i_equals(tk[ct],"DATA")) {
+ if (isCommandCheck) return true;
+ data_command(sline);
+ } else kw("FILL") {
+ if (isCommandCheck) return true;
+ do_fill(ct, graphBlock);
+ } else kw("HSCALE") {
+ if (isCommandCheck) return true;
+ do_hscale(ct);
+ } else kw("LET") {
+ if (isCommandCheck) return true;
+ do_letsave(sline);
+ } else kw("SIZE") {
+ if (isCommandCheck) return true;
+ do_size(ct);
+ } else kw("KEY") {
+ if (isCommandCheck) return true;
+ do_key(ct);
+ } else kw("VSCALE") {
+ if (isCommandCheck) return true;
+ do_vscale(ct);
+ } else kw("SCALE") {
+ if (isCommandCheck) return true;
+ do_scale(ct);
+ } else kw("COLORMAP") {
+ if (isCommandCheck) return true;
+ do_colormap(ct);
+ } else kw("TITLE") {
+ if (isCommandCheck) return true;
+ do_main_title(ct);
+ } else kw("DISCONTINUITY") {
+ if (isCommandCheck) return true;
+ do_discontinuity();
+ } else kw("BACKGROUND") {
+ if (isCommandCheck) return true;
+ g_graph_background = next_color;
+ } else kw("BEGIN") {
+ ct++;
+ kw("LAYER") {
+ if (isCommandCheck) return true;
+ graphBlock->setLayer(int(floor(next_exp + 0.5)));
+ }
+ } else kw("END") {
+ ct++;
+ kw("LAYER") {
+ if (isCommandCheck) return true;
+ graphBlock->setLayer(GLE_GRAPH_LAYER_UNDEFINED);
+
+ }
+ } else if (check_axis_command_name(tk[ct],"NOTICKS")) {
+ if (isCommandCheck) return true;
+ do_noticks(ct);
+ } else if (str_i_str(tk[ct],"AXIS") != NULL) {
+ if (isCommandCheck) return true;
+ do_axis_part_all(GLEG_CMD_AXIS);
+ } else if (str_i_str(tk[ct],"LABELS") != NULL) {
+ if (isCommandCheck) return true;
+ do_axis_part_all(GLEG_CMD_LABELS);
+ } else if (str_i_str(tk[ct],"SIDE") != NULL) {
+ if (isCommandCheck) return true;
+ do_axis_part_all(GLEG_CMD_SIDE);
+ } else if (str_i_str(tk[ct],"SUBTICKS") != NULL) {
+ if (isCommandCheck) return true;
+ do_axis_part_all(GLEG_CMD_SUBTICKS);
+ } else if (str_i_str(tk[ct],"TICKS") != NULL) {
+ if (isCommandCheck) return true;
+ do_axis_part_all(GLEG_CMD_TICKS);
+ } else if (str_i_str(tk[ct],"DRAW") != NULL) {
+ if (isCommandCheck) return true;
+ graphBlock->doDrawCommand(sline);
+ } else if (check_axis_command_name(tk[ct],"NAMES")) {
+ if (isCommandCheck) return true;
+ do_names(ct);
+ } else if (check_axis_command_name(tk[ct],"PLACES")) {
+ if (isCommandCheck) return true;
+ do_places(ct);
+ } else if (check_axis_command_name(tk[ct],"TITLE")) {
+ if (isCommandCheck) return true;
+ do_title(ct);
+ } else if (is_dataset_identifier(tk[ct])) {
+ if (isCommandCheck) return true;
+ do_datasets(ct, graphBlock);
+ } else if (do_remaining_entries(ct, isCommandCheck)) {
+ if (isCommandCheck) return true;
+ }
+ return false;
+}
+
+void do_bar(int& ct, GLEGraphBlockInstance* graphBlock) {
+ /* bar d1,d2,d3 from d4,d5,d6 color red,green,blue fill grey,blue,green
+ dist exp, width exp, LSTYLE 3,445,1
+ 3dbar .5 .5 top black,black,black side red,green,blue notop */
+ int ng = 0,fi;
+ char *ss;
+ if (g_nbar + 1 >= MAX_NB_BAR) {
+ g_throw_parser_error("too many bar commands in graph block");
+ }
+ g_nbar++;
+ br[g_nbar] = new bar_struct();
+ br[g_nbar]->ngrp = 0;
+ GLEGraphDataSetOrder* order = graphBlock->getData()->getOrder();
+ GLEClassDefinition* classDef = graphBlock->getGraphBlockBase()->getClassDefinitions()->getBar();
+ GLEClassInstance* classObj = new GLEClassInstance(classDef);
+ order->addObject(classObj);
+ classObj->getArray()->addInt(g_nbar);
+ br[g_nbar]->layer = graphBlock->getLayerWithDefault(GLE_GRAPH_LAYER_FILL);
+ ct = 2;
+ ss = strtok(tk[ct],",");
+ while (ss!=NULL) {
+ if (toupper(*ss)=='D') {
+ ng = (br[g_nbar]->ngrp)++;
+ int d = get_dataset_identifier(ss);
+ ensureDataSetCreatedAndSetUsed(d);
+ br[g_nbar]->to[ng] = d;
+ }
+ ss = strtok(0,",");
+ }
+ br[g_nbar]->horiz = false;
+ for (int i = 0; i <= ng; i++) {
+ br[g_nbar]->color[i] = new GLEColor(0.0);
+ br[g_nbar]->fill[i] = new GLEColor(i == 0 ? 0.0 : 1.0 - ng/i);
+ br[g_nbar]->from[i] = 0;
+ g_get_line_width(&br[g_nbar]->lwidth[i]);
+ strcpy(br[g_nbar]->lstyle[i] ,"1\0");
+ }
+ ct++;
+ while (ct<=ntk) {
+ kw("DIST") {
+ br[g_nbar]->dist = next_exp;
+ } else kw("WIDTH") {
+ br[g_nbar]->width = next_exp;
+ } else kw("3D") {
+ br[g_nbar]->x3d = next_exp;
+ br[g_nbar]->y3d = next_exp;
+ } else kw("NOTOP") {
+ br[g_nbar]->notop = true;
+ } else kw("HORIZ") {
+ br[g_nbar]->horiz = true;
+ } else kw("LSTYLE") {
+ next_str((char *) br[g_nbar]->lstyle);
+ } else kw("STYLE") {
+ ct += 1;
+ do_set_bar_style(tk[ct], br[g_nbar]);
+ } else kw("LWIDTH") {
+ br[g_nbar]->lwidth[0] = next_exp;
+ } else kw("FROM") {
+ fi = 0;
+ ct +=1;
+ ss = strtok(tk[ct],",");
+ while (ss!=NULL) {
+ if (toupper(*ss)=='D') {
+ int di = get_dataset_identifier(ss);
+ ensureDataSetCreatedAndSetUsed(di);
+ br[g_nbar]->from[fi++] = di;
+ }
+ ss = strtok(0,",");
+ }
+ } else kw("COLOR") {
+ ct += 1;
+ do_set_bar_color(tk[ct], br[g_nbar], BAR_SET_COLOR);
+ } else kw("SIDE") {
+ ct += 1;
+ do_set_bar_color(tk[ct], br[g_nbar], BAR_SET_SIDE);
+ } else kw("TOP") {
+ ct += 1;
+ do_set_bar_color(tk[ct], br[g_nbar], BAR_SET_TOP);
+ } else kw("FILL") {
+ ct++;
+ do_set_bar_color(tk[ct], br[g_nbar], BAR_SET_FILL);
+ } else kw("PATTERN") {
+ ct++;
+ do_set_bar_color(tk[ct], br[g_nbar], BAR_SET_PATTERN);
+ } else kw("BACKGROUND") {
+ ct++;
+ do_set_bar_color(tk[ct], br[g_nbar], BAR_SET_BACKGROUND);
+ } else {
+ g_throw_parser_error("unrecognised bar sub command '", tk[ct], "'");
+ }
+ ct++;
+ }
+}
+
+/* fill x1,d2 color green xmin 1 xmax 2 ymin 1 ymax 2 */
+/* fill d1,x2 color green xmin 1 xmax 2 ymin 1 ymax 2 */
+/* fill d1,d2 color green xmin 1 xmax 2 ymin 1 ymax 2 */
+/* fill d1 color green xmin 1 xmax 2 ymin 1 ymax 2 */
+void do_fill(int& ct, GLEGraphBlockInstance* graphBlock) {
+ if (nfd + 1 >= MAX_NB_FILL) {
+ g_throw_parser_error("too many fill commands in graph block");
+ }
+ fd[++nfd] = new fill_data();
+ GLEGraphDataSetOrder* order = graphBlock->getData()->getOrder();
+ GLEClassDefinition* classDef = graphBlock->getGraphBlockBase()->getClassDefinitions()->getFill();
+ GLEClassInstance* classObj = new GLEClassInstance(classDef);
+ order->addObject(classObj);
+ classObj->getArray()->addInt(nfd);
+ fd[nfd]->layer = graphBlock->getLayerWithDefault(GLE_GRAPH_LAYER_FILL);
+ char s1[40],s2[40];
+ ct = 2;
+ strcpy(s1,strtok(tk[ct],","));
+ char *ss = strtok(0,",");
+ if (ss == NULL) {
+ strcpy(s2,"");
+ } else {
+ strcpy(s2,ss);
+ strtok(0,",");
+ }
+ if (str_i_equals(s1,"X1")) {
+ fd[nfd]->type = 1;
+ int d = get_dataset_identifier(s2);
+ fd[nfd]->da = d;
+ } else if (str_i_equals(s2,"X2")) {
+ fd[nfd]->type = 2;
+ int d = get_dataset_identifier(s1);
+ fd[nfd]->da = d;
+ } else if (!str_i_equals(s2,"")) {
+ fd[nfd]->type = 3;
+ int d = get_dataset_identifier(s1);
+ int d2 = get_dataset_identifier(s2);
+ fd[nfd]->da = d;
+ fd[nfd]->db = d2;
+ } else if (toupper(*s1)=='D') {
+ fd[nfd]->type = 4;
+ int d = get_dataset_identifier(s1);
+ fd[nfd]->da = d;
+ } else {
+ g_throw_parser_error("invalid fill option, wanted d1,d2 or x1,d1 or d1,x2 or d1");
+ }
+ if (fd[nfd]->da != 0) {
+ ensureDataSetCreatedAndSetUsed(fd[nfd]->da);
+ }
+ if (fd[nfd]->db != 0) {
+ ensureDataSetCreatedAndSetUsed(fd[nfd]->db);
+ }
+ ct++;
+ fd[nfd]->color = new GLEColor(1.0 - nfd * 0.1);
+ fd[nfd]->xmin = -GLE_INF;
+ fd[nfd]->xmax = GLE_INF;
+ fd[nfd]->ymin = -GLE_INF;
+ fd[nfd]->ymax = GLE_INF;
+ while (ct<=ntk) {
+ kw("COLOR") {
+ ct++;
+ fd[nfd]->color = pass_color_var(tk[ct]);
+ } else kw("XMIN") {
+ fd[nfd]->xmin = next_exp;
+ } else kw("XMAX") {
+ fd[nfd]->xmax = next_exp;
+ } else kw("YMIN") {
+ fd[nfd]->ymin = next_exp;
+ } else kw("YMAX") {
+ fd[nfd]->ymax = next_exp;
+ } else {
+ g_throw_parser_error("unrecognised fill sub command: '", tk[ct], "'");
+ }
+ ct++;
+ }
+}
+
+void do_key(int& ct) {
+ ct = 2;
+ while (ct<=ntk) {
+ kw("OFFSET") {
+ g_keyInfo->setOffsetX(next_exp);
+ g_keyInfo->setOffsetY(next_exp);
+ }
+ else kw("MARGINS") {
+ double mx = next_exp;
+ double my = next_exp;
+ g_keyInfo->setMarginXY(mx, my);
+ }
+ else kw("ABSOLUTE") {
+ if (g_xsize*g_ysize==0) {
+ g_xsize = 10; g_ysize = 10;
+ g_get_usersize(&g_xsize,&g_ysize);
+ }
+ window_set(false);
+ store_window_bounds_to_vars();
+ set_sizelength();
+
+ g_keyInfo->setOffsetX(next_exp);
+ g_keyInfo->setOffsetY(next_exp);
+ g_keyInfo->setAbsolute(true);
+ }
+ else kw("BACKGROUND") g_keyInfo->setBackgroundColor(next_color);
+ else kw("BOXCOLOR") g_keyInfo->setBoxColor(next_color);
+ else kw("ROW") g_keyInfo->setBase(next_exp);
+ else kw("LPOS") g_keyInfo->setLinePos(next_exp);
+ else kw("LLEN") g_keyInfo->setLineLen(next_exp);
+ else kw("NOBOX") g_keyInfo->setNoBox(true);
+ else kw("NOLINE") g_keyInfo->setNoLines(true);
+ else kw("COMPACT") g_keyInfo->setCompact(true);
+ else kw("HEI") g_keyInfo->setHei(next_exp);
+ else kw("POSITION") next_str(g_keyInfo->getJustify());
+ else kw("POS") next_str(g_keyInfo->getJustify());
+ else kw("JUSTIFY") {
+ next_str(g_keyInfo->getJustify());
+ g_keyInfo->setPosOrJust(false);
+ }
+ else kw("JUST") {
+ next_str(g_keyInfo->getJustify());
+ g_keyInfo->setPosOrJust(false);
+ }
+ else kw("DIST") g_keyInfo->setDist(next_exp);
+ else kw("COLDIST") g_keyInfo->setColDist(next_exp);
+ else kw("OFF") g_keyInfo->setDisabled(true);
+ else kw("SEPARATOR") {
+ GLEClassDefinition* keySeparatorDefinition = g_graphBlockData->getGraphBlockBase()->getClassDefinitions()->getKeySeparator();
+ GLEClassInstance* keySeparator = new GLEClassInstance(keySeparatorDefinition);
+ g_graphBlockData->getOrder()->addObject(keySeparator);
+ ct++;
+ kw("LSTYLE") {
+ keySeparator->getArray()->addInt((int)floor(next_exp + 0.5));
+ }
+ }
+ else g_throw_parser_error("unrecognised KEY sub command: '",tk[ct],"'");
+ ct++;
+ }
+}
+
+void do_hscale(int& ct) {
+ if (str_i_equals(tk[ct+1], "AUTO")) g_auto_s_h = true;
+ else g_hscale = next_exp;
+}
+
+void do_letsave(GLESourceLine& sline) {
+ GLELet* let = parseLet(sline);
+ g_letCmds.push_back(let);
+}
+
+void do_size(int& ct) {
+ g_xsize = next_exp;
+ g_ysize = next_exp;
+ /* ! set up some more constants */
+ set_sizelength();
+ do_remaining_entries(ct+1, false);
+}
+
+void do_scale(int& ct) {
+ if (str_i_equals(tk[ct+1], "AUTO")) {
+ g_auto_s_v = true;
+ g_auto_s_h = true;
+ ct++;
+ } else {
+ g_hscale = next_exp;
+ g_vscale = next_exp;
+ }
+ do_remaining_entries(ct+1, false);
+}
+
+void do_vscale(int& ct) {
+ if (str_i_equals(tk[ct+1], "AUTO")) g_auto_s_v = true;
+ else g_vscale = next_exp;
+}
+
+void do_colormap(int& ct) {
+ g_colormap = new GLEColorMap();
+ g_colormap->setFunction(tk[++ct]);
+ g_colormap->setWidth((int)floor(next_exp+0.5));
+ g_colormap->setHeight((int)floor(next_exp+0.5));
+ ct++;
+ while (ct <= ntk) {
+ kw("COLOR") g_colormap->setColor(true);
+ else kw("INVERT") g_colormap->setInvert(true);
+ else kw("ZMIN") g_colormap->setZMin(next_exp);
+ else kw("ZMAX") g_colormap->setZMax(next_exp);
+ else kw("INTERPOLATE") {
+ string tmp;
+ next_str_cpp(tmp);
+ IpolType ipolType(IPOL_TYPE_BICUBIC);
+ if (str_i_equals(tmp, "BICUBIC")) {
+ ipolType = IPOL_TYPE_BICUBIC;
+ } else if (str_i_equals(tmp, "NEAREST")) {
+ ipolType = IPOL_TYPE_NEAREST;
+ } else {
+ g_throw_parser_error("unknown interpolation type '", tmp.c_str(), "'");
+ }
+ g_colormap->setIpolType(ipolType);
+ }
+ else kw("PALETTE") {
+ string tmp;
+ next_str_cpp(tmp);
+ str_to_uppercase(tmp);
+ g_colormap->setPalette(tmp);
+ }
+ else g_throw_parser_error("expecting colormap sub command, not '", tk[ct], "'");
+ ct++;
+ }
+ g_colormap->readData();
+}
+
+void do_names(int& ct) {
+ int t = axis_type_check(tk[1]);
+ xx[t].label_off = false;
+ if (ntk >= 3 && str_i_equals(tk[2], "FROM") && toupper(tk[3][0]) == 'D') {
+ // Support syntax "xnames from d1" to retrieve names from the data set
+ xx[t].setNamesDataSet(get_dataset_identifier(tk[3]));
+ } else {
+ ct = 1;
+ while (ct<ntk) {
+ next_quote(strbuf);
+ xx[t].addName(strbuf);
+ }
+ }
+}
+
+void do_places(int& ct) {
+ int t = axis_type_check(tk[1]);
+ xx[t].label_off = false;
+ ct = 1;
+ while (ct<ntk) {
+ xx[t].addPlace(next_exp);
+ }
+}
+
+void do_noticks(int& ct) {
+ int t = axis_type_check(tk[1]);
+ ct = 1;
+ xx[t].clearNoTicks();
+ if (t <= 2) xx[t+2].clearNoTicks();
+ while (ct<ntk) {
+ double pos = next_exp;
+ xx[t].addNoTick(pos);
+ if (t <= 2) xx[t+2].addNoTick(pos);
+ }
+}
+
+void do_main_title(int& ct) {
+ /* should change position and size of main title */
+ int t = GLE_AXIS_T;
+ xx[GLE_AXIS_T].off = 0;
+ ct = 1;
+ next_vquote_cpp(xx[t].title);
+ ct = 3;
+ xx[t].title_dist = g_fontsz*.7;
+ xx[t].title_hei = g_fontsz*g_get_fconst(GLEC_TITLESCALE);
+ while (ct<=ntk) {
+ kw("HEI") xx[t].title_hei = next_exp;
+ else kw("OFF") xx[t].title_off = true;
+ else kw("COLOR") xx[t].title_color = next_color;
+ else kw("FONT") xx[t].title_font = next_font;
+ else kw("DIST") xx[t].title_dist = next_exp;
+ else g_throw_parser_error("expecting title sub command, not '", tk[ct], "'");
+ ct++;
+ }
+}
+
+void do_title(int& ct) {
+ int t = axis_type_check(tk[1]);
+ ct = 1;
+ next_vquote_cpp(xx[t].title);
+ ct = 3;
+ while (ct<=ntk) {
+ kw("HEI") xx[t].title_hei = next_exp;
+ else kw("OFF") xx[t].title_off = true;
+ else kw("ROT") xx[t].title_rot = true;
+ else kw("ROTATE") xx[t].title_rot = true;
+ else kw("COLOR") xx[t].title_color = next_color;
+ else kw("FONT") xx[t].title_font = next_font;
+ else kw("DIST") xx[t].title_dist = next_exp;
+ else kw("ADIST") xx[t].title_adist = next_exp;
+ else kw("ALIGN") {
+ string base;
+ next_str_cpp(base);
+ xx[t].setAlignBase(str_i_equals(base, "BASE"));
+ } else {
+ g_throw_parser_error("expecting title sub command, not '", tk[ct], "'");
+ }
+ ct++;
+ }
+}
+
+void do_datasets(int& ct, GLEGraphBlockInstance* graphBlock) {
+ int d = get_dataset_identifier(tk[1]); /* dataset number (right$(k$,2)) (0=dn) */
+ if (d != 0) {
+ ensureDataSetCreatedAndSetUsed(d);
+ do_dataset(d, graphBlock);
+ } else {
+ for (d = 0; d < MAX_NB_DATA; d++) {
+ if (dp[d] != NULL) {
+ do_dataset(d, graphBlock);
+ }
+ }
+ }
+}
+
+bool do_remaining_entries(int ct, bool isCommandCheck) {
+ int nb_found = 0;
+ bool found = true;
+ while (found && ct <= ntk) {
+ kw("NOBOX") {
+ if (isCommandCheck) return true;
+ g_nobox = true;
+ } else kw("BOX") {
+ if (isCommandCheck) return true;
+ g_nobox = false;
+ } else kw("NOBORDER") {
+ if (isCommandCheck) return true;
+ g_nobox = true; // for compatibility with v3.5
+ } else kw("BORDER") {
+ if (isCommandCheck) return true;
+ g_nobox = false;
+ } else kw("CENTER") {
+ if (isCommandCheck) return true;
+ g_center = true;
+ } else kw("FULLSIZE") {
+ if (isCommandCheck) return true;
+ g_vscale = 1;
+ g_hscale = 1;
+ g_nobox = true;
+ } else kw("MATH") {
+ if (isCommandCheck) return true;
+ g_math = true;
+ xx[GLE_AXIS_Y].offset = 0.0;
+ xx[GLE_AXIS_Y].has_offset = true;
+ xx[GLE_AXIS_Y].ticks_both = true;
+ xx[GLE_AXIS_X].offset = 0.0;
+ xx[GLE_AXIS_X].has_offset = true;
+ xx[GLE_AXIS_X].ticks_both = true;
+ xx[GLE_AXIS_X2].off = true;
+ xx[GLE_AXIS_Y2].off = true;
+ } else {
+ found = false;
+ }
+ if (found) {
+ ct++;
+ nb_found++;
+ }
+ }
+ return nb_found > 0;
+}
+
+void do_axis(int axis, bool craxis) throw (ParserError) {
+ int ct = 2;
+ while (ct <= ntk) {
+ kw("BASE") xx[axis].base = next_exp;
+ else kw("COLOR") xx[axis].setColor(next_color);
+ else kw("DSUBTICKS") xx[axis].dsubticks = next_exp;
+ else kw("DTICKS") {
+ xx[axis].dticks = next_exp;
+ if (craxis) xx[axis].label_off = false;
+ } else kw("FTICK") {
+ xx[axis].ftick = next_exp;
+ xx[axis].has_ftick = true;
+ }
+ else kw("SYMTICKS") xx[axis].ticks_both = get_on_off(tk, &ct);
+ else kw("SHIFT") xx[axis].shift = next_exp;
+ else kw("ANGLE") xx[axis].label_angle = next_exp;
+ else kw("GRID") {
+ xxgrid[axis] = true;
+ if (str_i_equals(tk[ct+1],"ONTOP")) {
+ xx[axis].setGridOnTop(true);
+ ct++;
+ }
+ }
+ else kw("NEGATE") {
+ xx[axis].negate = true;
+ }
+ else kw("FONT") xx[axis].label_font = next_font;
+ else kw("LOG") xx[axis].log = true; /* don't make log depend on craxis, otherwise grid may not line up */
+ else kw("LIN") xx[axis].log = false;
+ else kw("LSTYLE") next_str(xx[axis].side_lstyle);
+ else kw("LWIDTH") xx[axis].side_lwidth = next_exp;
+ else kw("MIN") {
+ double value = next_exp;
+ if (craxis) xx[axis].getRange()->setMinSet(value);
+ }
+ else kw("MAX") {
+ double value = next_exp;
+ if (craxis) xx[axis].getRange()->setMaxSet(value);
+ }
+ else kw("OFFSET") {
+ double offs = next_exp;
+ if (craxis) {
+ xx[axis].offset = offs;
+ xx[axis].has_offset = true;
+ if (!g_math) {
+ if (axis == GLE_AXIS_X) xx[GLE_AXIS_X0].off = false;
+ if (axis == GLE_AXIS_Y) xx[GLE_AXIS_Y0].off = false;
+ }
+ }
+ }
+ else kw("ROUNDRANGE") xx[axis].roundRange = get_on_off(tk, &ct);
+ else kw("HEI") xx[axis].label_hei = next_exp;
+ else kw("NOLAST") xx[axis].nolast = true;
+ else kw("LAST") xx[axis].nolast = !get_on_off(tk, &ct);
+ else kw("FIRST") xx[axis].nofirst = !get_on_off(tk, &ct);
+ else kw("NOFIRST") xx[axis].nofirst = true;
+ else kw("NSUBTICKS") xx[axis].nsubticks = (int) next_exp;
+ else kw("NTICKS") {
+ xx[axis].nticks = (int) next_exp;
+ if (craxis) xx[axis].label_off = false;
+ }
+ else kw("ON") xx[axis].off = false;
+ else kw("OFF") xx[axis].off = true;
+ else kw("FORMAT") next_str_cpp(xx[axis].format);
+ else kw("SCALE") {
+ if (str_i_equals(tk[ct+1],"QUANTILE")) {
+ ct++;
+ GLERC<GLEAxisQuantileScale> q_scale = new GLEAxisQuantileScale();
+ while (true) {
+ if (str_i_equals(tk[ct+1], "LOWER")) {
+ ct++;
+ q_scale->setLowerQuantile(next_exp);
+ } else if (str_i_equals(tk[ct+1], "UPPER")) {
+ ct++;
+ q_scale->setUpperQuantile(next_exp);
+ } else if (str_i_equals(tk[ct+1], "FACTOR")) {
+ ct++;
+ double factor = next_exp;
+ q_scale->setLowerQuantileFactor(factor);
+ q_scale->setUpperQuantileFactor(factor);
+ } else if (str_i_equals(tk[ct+1], "LFACTOR")) {
+ ct++;
+ q_scale->setLowerQuantileFactor(next_exp);
+ } else if (str_i_equals(tk[ct+1], "UFACTOR")) {
+ ct++;
+ q_scale->setUpperQuantileFactor(next_exp);
+ } else {
+ break;
+ }
+ }
+ xx[axis].setQuantileScale(q_scale.get());
+ }
+ }
+ else {
+ g_throw_parser_error("expecting axis sub command, found '", tk[ct], "'");
+ }
+ ct++;
+ }
+}
+
+void do_labels(int axis, bool showerr) throw (ParserError) {
+ int ct = 2;
+ while (ct <= ntk) {
+ if (*tk[ct]==' ') ct++;
+ kw("HEI") xx[axis].label_hei = next_exp;
+ else kw("OFF") {
+ if (showerr) {
+ xx[axis].label_off = true;
+ xx[axis].has_label_onoff = true;
+ }
+ }
+ else kw("ON") {
+ if (showerr) {
+ xx[axis].label_off = false;
+ xx[axis].has_label_onoff = true;
+ xx[axis].off = false;
+ }
+ }
+ else kw("COLOR") xx[axis].label_color = next_color;
+ else kw("FONT") xx[axis].label_font = next_font;
+ else kw("DIST") xx[axis].label_dist = next_exp;
+ else kw("ALIGN") {
+ ct++;
+ kw("LEFT") xx[axis].label_align = JUST_LEFT;
+ else kw("RIGHT") xx[axis].label_align = JUST_RIGHT;
+ }
+ else kw("LOG") {
+ ct++;
+ kw("OFF") xx[axis].lgset = GLE_AXIS_LOG_OFF;
+ else kw("L25B") xx[axis].lgset = GLE_AXIS_LOG_25B;
+ else kw("L25") xx[axis].lgset = GLE_AXIS_LOG_25;
+ else kw("L1") xx[axis].lgset = GLE_AXIS_LOG_1;
+ else kw("N1") xx[axis].lgset = GLE_AXIS_LOG_N1;
+ else if (showerr) g_throw_parser_error("Expecting OFF, L25, L25B, L1, or N1, found '", tk[ct], "'");
+ }
+ else if (showerr) {
+ g_throw_parser_error("Expecting LABELS sub command, found '", tk[ct], "'");
+ }
+ ct++;
+ }
+}
+
+void do_side(int axis, bool showerr) throw (ParserError) {
+ int ct = 2;
+ while (ct <= ntk) {
+ if (*tk[ct]==' ') ct++;
+ kw("OFF") {
+ if (showerr) xx[axis].side_off = true;
+ }
+ else kw("ON") {
+ if (showerr) xx[axis].side_off = false;
+ }
+ else kw("COLOR") xx[axis].side_color = next_color;
+ else kw("LWIDTH") xx[axis].side_lwidth = next_exp;
+ else kw("LSTYLE") next_str(xx[axis].side_lstyle);
+ else if (showerr) {
+ g_throw_parser_error("Expecting SIDE sub command, found '", tk[ct], "'");
+ }
+ ct++;
+ }
+}
+
+void do_ticks(int axis, bool showerr) throw (ParserError) {
+ int ct = 2;
+ while (ct <= ntk) {
+ if (*tk[ct]==' ') ct++;
+ kw("LENGTH") xx[axis].ticks_length = next_exp;
+ else kw("OFF") {
+ if (showerr) {
+ xx[axis].ticks_off = true;
+ xx[axis].subticks_off = true;
+ }
+ } else kw("ON") {
+ if (showerr) {
+ xx[axis].ticks_off = false;
+ xx[axis].subticks_off = false;
+ }
+ } else kw("COLOR") {
+ xx[axis].ticks_color = next_color;
+ xx[axis].subticks_color = xx[axis].ticks_color;
+ } else kw("LWIDTH") {
+ xx[axis].ticks_lwidth = next_exp;
+ } else kw("LSTYLE") {
+ next_str(xx[axis].ticks_lstyle);
+ } else if (showerr) {
+ g_throw_parser_error("Expecting TICKS sub command, found '", tk[ct], "'");
+ }
+ ct++;
+ }
+}
+
+void do_subticks(int axis, bool showerr) throw (ParserError) {
+ int ct = 2;
+ while (ct <= ntk) {
+ if (*tk[ct]==' ') ct++;
+ kw("LENGTH") xx[axis].subticks_length = next_exp;
+ else kw("OFF") {
+ if (showerr) {
+ xx[axis].subticks_off = true;
+ xx[axis].has_subticks_onoff = true;
+ }
+ }
+ else kw("ON") {
+ if (showerr) {
+ xx[axis].subticks_off = false;
+ xx[axis].has_subticks_onoff = true;
+ }
+ }
+ else kw("COLOR") xx[axis].subticks_color = next_color;
+ else kw("LWIDTH") xx[axis].subticks_lwidth = next_exp;
+ else kw("LSTYLE") next_str(xx[axis].subticks_lstyle);
+ else {
+ g_throw_parser_error("Expecting SUBTICKS sub command, found '", tk[ct], "'");
+ }
+ ct++;
+ }
+}
+
+void do_axis_part(int axis, bool craxis, int xset) throw (ParserError) {
+ // craxis = command is for current axis
+ // showerr = passing options for axis command to labels/side/ticks commands
+ switch (xset) {
+ case GLEG_CMD_AXIS:
+ do_axis(axis, craxis);
+ do_labels(axis, false);
+ do_side(axis, false);
+ do_ticks(axis, false);
+ break;
+ case GLEG_CMD_LABELS:
+ do_labels(axis, true);
+ break;
+ case GLEG_CMD_SIDE:
+ do_side(axis, true);
+ break;
+ case GLEG_CMD_TICKS:
+ do_ticks(axis, true);
+ break;
+ case GLEG_CMD_SUBTICKS:
+ do_subticks(axis, true);
+ break;
+ }
+}
+
+void do_axis_part_all(int xset) throw (ParserError) {
+ int axis = axis_type(tk[1]);
+ if (axis == GLE_AXIS_ALL) {
+ do_axis_part(GLE_AXIS_X, false, xset);
+ do_axis_part(GLE_AXIS_X0, false, xset);
+ do_axis_part(GLE_AXIS_X2, false, xset);
+ do_axis_part(GLE_AXIS_Y, false, xset);
+ do_axis_part(GLE_AXIS_Y0, false, xset);
+ do_axis_part(GLE_AXIS_Y2, false, xset);
+ } else {
+ do_axis_part(axis, true, xset);
+ }
+ if (axis == GLE_AXIS_X) {
+ do_axis_part(GLE_AXIS_X2, false, xset);
+ do_axis_part(GLE_AXIS_X0, false, xset);
+ do_axis_part(GLE_AXIS_T, false, xset);
+ }
+ if (axis == GLE_AXIS_Y) {
+ do_axis_part(GLE_AXIS_Y2, false, xset);
+ do_axis_part(GLE_AXIS_Y0, false, xset);
+ }
+}
+
+void do_discontinuity() {
+ int ct = 2;
+ while (ct <= ntk) {
+ kw("THRESHOLD") {
+ g_discontinuityThreshold = next_exp;
+ } else {
+ g_throw_parser_error("Expecting discontinuity option, but found '", tk[ct], "'");
+ }
+ ct++;
+ }
+}
+
+void ensure_fill_created(bar_struct* bar, int fi) {
+ if (bar->fill[fi].isNull()) {
+ bar->fill[fi] = new GLEColor();
+ bar->fill[fi]->setTransparent(true);
+ }
+}
+
+void update_key_fill(bar_struct* bar, int fi) {
+ int dataset = bar->to[fi];
+ if (dp[dataset] != NULL) {
+ dp[dataset]->key_fill = bar->fill[fi];
+ }
+}
+
+void do_set_bar_color(const char* tk, bar_struct* bar, int type) {
+ /* Use tokenizer that jumps over () pairs to be able to parse CVTRGB(...) */
+ int fi = 0;
+ string tokstr = (const char*)tk;
+ level_char_separator separator(",", "", "(", ")");
+ tokenizer<level_char_separator> tokens(tokstr, separator);
+ while (tokens.has_more()) {
+ GLERC<GLEColor> color(pass_color_var(tokens.next_token().c_str()));
+ switch (type) {
+ case BAR_SET_COLOR:
+ bar->color[fi] = color;
+ break;
+ case BAR_SET_FILL:
+ ensure_fill_created(bar, fi);
+ update_color_foreground_and_pattern(bar->fill[fi].get(), color.get());
+ update_key_fill(bar, fi);
+ break;
+ case BAR_SET_TOP:
+ bar->top[fi] = color;
+ break;
+ case BAR_SET_SIDE:
+ bar->side[fi] = color;
+ break;
+ case BAR_SET_PATTERN:
+ if (color->isFill() && color->getFill()->getFillType() == GLE_FILL_TYPE_PATTERN) {
+ ensure_fill_created(bar, fi);
+ update_color_fill_pattern(bar->fill[fi].get(), static_cast<GLEPatternFill*>(color->getFill()));
+ update_key_fill(bar, fi);
+ } else {
+ g_throw_parser_error("expected fill pattern");
+ }
+ break;
+ case BAR_SET_BACKGROUND:
+ ensure_fill_created(bar, fi);
+ update_color_fill_background(bar->fill[fi].get(), color.get());
+ update_key_fill(bar, fi);
+ break;
+ }
+ fi++;
+ }
+}
+
+void do_set_bar_style(const char* tk, bar_struct* bar) {
+ int fi = 0;
+ string tokstr = (const char*)tk;
+ level_char_separator separator(",", "", "(", ")");
+ tokenizer<level_char_separator> tokens(tokstr, separator);
+ while (tokens.has_more()) {
+ pass_file_name(tokens.next_token().c_str(), bar->style[fi]);
+ str_to_uppercase(bar->style[fi]);
+ fi++;
+ }
+}
+
+void set_sizelength() {
+ double ox, oy;
+
+ /* get the origin x,y */
+ g_get_xy(&ox,&oy);
+ if (g_hscale==0) g_hscale = .7;
+ if (g_vscale==0) g_vscale = .7;
+
+ xbl = ox + (g_xsize/2)-(g_xsize*g_hscale/2);
+ ybl = oy + (g_ysize/2)-(g_ysize*g_vscale/2);
+ xlength = g_xsize*g_hscale;
+ ylength = g_ysize*g_vscale;
+
+ // In more recent versions, the size of a graph font depends on the hei parameter
+ if (g_get_compatibility() == GLE_COMPAT_35) {
+ if (xlength<ylength) g_fontsz = xlength/23;
+ else g_fontsz = ylength/23;
+ }
+
+ /* set graph globals */
+ graph_x1 = xbl;
+ graph_y1 = ybl;
+ graph_x2 = xbl + xlength;
+ graph_y2 = ybl + ylength;
+ graph_xmin = xx[GLE_AXIS_X].getMin();
+ graph_xmax = xx[GLE_AXIS_X].getMax();
+ graph_ymin = xx[GLE_AXIS_Y].getMin();
+ graph_ymax = xx[GLE_AXIS_Y].getMax();
+}
+
+void axis_init_length() {
+ for (int i = 1; i <= GLE_AXIS_MAX; i++) {
+ xx[i].type = i;
+ if (xx[i].base==0) xx[i].base = g_fontsz;
+ if (axis_horizontal(i)) xx[i].length = xlength;
+ else xx[i].length = ylength;
+ }
+}
+
+void axis_add_grid() {
+ for (int i = 1; i <= 2; i++) {
+ if (xxgrid[i]) {
+ double len = axis_horizontal(i) ? ylength : xlength;
+ if (!xx[i].hasGridOnTop()) xx[i].setGrid(true);
+ xx[i].ticks_length = len;
+ xx[i+2].ticks_off = true;
+ if (xx[i].subticks_length == 0.0) {
+ xx[i].subticks_length = len;
+ xx[i+2].subticks_off = true;
+ }
+ if (!xx[i].has_subticks_onoff) {
+ /* only change default behaviour if no explicit setting given */
+ if (xx[i].log) {
+ xx[i].subticks_off = false;
+ } else {
+ xx[i].subticks_off = true;
+ }
+ }
+ }
+ }
+}
+
+void axis_add_noticks() {
+ // Disable ticks and places on some axis
+ for (int i = 1; i < GLE_AXIS_MAX; i++) {
+ if (!xx[i].off) {
+ if (xx[i].has_offset) {
+ // axis has offset:
+ // - disable ticks and labels at each intersection
+ for (int j = 0; j < 3; j++) {
+ int orth = axis_get_orth(i, j);
+ if (!xx[orth].off) {
+ if (xx[orth].has_offset) {
+ xx[i].insertNoTickOrLabel(xx[orth].offset);
+ } else {
+ if (axis_is_max(orth)) xx[i].insertNoTickOrLabel(xx[i].getMax());
+ else xx[i].insertNoTickOrLabel(xx[i].getMin());
+ }
+ }
+ }
+ } else {
+ // axis has no offset:
+ // - disable inside ticks (ticks1) for each intersection
+ for (int j = 0; j < 3; j++) {
+ int orth = axis_get_orth(i, j);
+ if (!xx[orth].off) {
+ if (xx[orth].has_offset) {
+ xx[i].insertNoTick1(xx[orth].offset);
+ } else {
+ if (axis_is_max(orth)) xx[i].insertNoTick1(xx[i].getMax());
+ else xx[i].insertNoTick1(xx[i].getMin());
+ }
+ }
+ }
+ }
+ }
+ }
+#ifdef AXIS_DEBUG
+ cout << endl;
+ for (int i = 1; i <= GLE_AXIS_MAX; i++) {
+ cout << "AXIS: " << i << endl;
+ xx[i].printNoTicks();
+ cout << endl;
+ }
+#endif
+}
+
+void draw_axis_pos(int axis, double xpos, double ypos, bool xy, DrawAxisPart axisPart, GLERectangle* box) {
+ if (xx[axis].has_offset) {
+ if (xy) g_move(graph_xgraph(xx[axis].offset), ypos);
+ else g_move(xpos, graph_ygraph(xx[axis].offset));
+ } else {
+ g_move(xpos,ypos);
+ }
+ draw_axis(&xx[axis], box, axisPart);
+}
+
+GLEGraphPartGrid::GLEGraphPartGrid() {
+}
+
+GLEGraphPartGrid::~GLEGraphPartGrid() {
+}
+
+std::set<int> GLEGraphPartGrid::getLayers() {
+ std::set<int> result;
+ result.insert(GLE_GRAPH_LAYER_GRID);
+ return result;
+}
+
+void GLEGraphPartGrid::drawLayerPart(DrawAxisPart axisPart) {
+ GLERectangle box;
+ box.initRange();
+ draw_axis_pos(GLE_AXIS_Y0, xbl, ybl, true, axisPart, &box);
+ draw_axis_pos(GLE_AXIS_Y, xbl, ybl, true, axisPart, &box);
+ draw_axis_pos(GLE_AXIS_Y2, xbl+xlength, ybl, true, axisPart, &box);
+ draw_axis_pos(GLE_AXIS_X, xbl, ybl, false, axisPart, &box);
+ draw_axis_pos(GLE_AXIS_X0, xbl, ybl, false, axisPart, &box);
+ draw_axis_pos(GLE_AXIS_X2, xbl, ybl+ylength, false, axisPart, &box);
+}
+
+void GLEGraphPartGrid::drawLayer(int layer) {
+ drawLayerPart(DRAW_AXIS_GRID_SUBTICKS);
+ drawLayerPart(DRAW_AXIS_GRID_TICKS);
+}
+
+GLEGraphPartAxis::GLEGraphPartAxis():
+ m_box(0)
+{
+}
+
+GLEGraphPartAxis::~GLEGraphPartAxis() {
+}
+
+std::set<int> GLEGraphPartAxis::getLayers() {
+ std::set<int> result;
+ result.insert(GLE_GRAPH_LAYER_AXIS);
+ return result;
+}
+
+void GLEGraphPartAxis::drawLayer(int layer) {
+ g_init_bounds();
+ // y-axis should *not* influence position of title!
+ draw_axis_pos(GLE_AXIS_Y0, xbl, ybl, true, DRAW_AXIS_ALL, m_box);
+ draw_axis_pos(GLE_AXIS_Y, xbl, ybl, true, DRAW_AXIS_ALL, m_box);
+ draw_axis_pos(GLE_AXIS_Y2, xbl+xlength, ybl, true, DRAW_AXIS_ALL, m_box);
+ GLEMeasureBox measure;
+ measure.measureStart();
+ draw_axis_pos(GLE_AXIS_X, xbl, ybl, false, DRAW_AXIS_ALL, m_box);
+ draw_axis_pos(GLE_AXIS_X0, xbl, ybl, false, DRAW_AXIS_ALL, m_box);
+ draw_axis_pos(GLE_AXIS_X2, xbl, ybl+ylength, false, DRAW_AXIS_ALL, m_box);
+ g_update_bounds(xbl+xlength/2, ybl+ylength);
+ measure.measureEnd();
+ draw_axis_pos(GLE_AXIS_T, xbl, measure.getYMax(), true, DRAW_AXIS_ALL, m_box);
+ // otherwise it does not work if all axis are disabled!
+ g_update_bounds_box(m_box);
+}
+
+void GLEGraphPartAxis::setBox(GLERectangle* box) {
+ m_box = box;
+}
+
+void prepare_graph_key_and_clip(double ox, double oy, KeyInfo* keyinfo) {
+ if (!keyinfo->hasHei()) keyinfo->setHei(g_fontsz);
+ measure_key(keyinfo);
+ if (keyinfo->getNbEntries() > 0 && !keyinfo->isDisabled() && !keyinfo->getNoBox() && keyinfo->getBackgroundColor()->isTransparent()) {
+ g_gsave();
+ g_beginclip();
+ g_set_path(true);
+ g_newpath();
+ GLERectangle fullFig;
+ g_get_userbox_undev(&fullFig);
+ g_box_stroke(&fullFig, true);
+ g_box_stroke(keyinfo->getRect(), false);
+ g_clip();
+ g_set_path(false);
+ }
+}
+
+void key_update_bounds(double ox, double oy, KeyInfo* keyinfo) {
+ if (!keyinfo->hasHei()) keyinfo->setHei(g_fontsz);
+ measure_key(keyinfo);
+ if (keyinfo->getNbEntries() > 0 && !keyinfo->isDisabled()) {
+ g_update_bounds(keyinfo->getRect());
+ }
+}
+
+void draw_graph(KeyInfo* keyinfo, GLEGraphBlockInstance* graphBlock) throw (ParserError) {
+ GLERectangle box;
+ double ox,oy;
+
+ do_bigfile_compatibility();
+ g_get_bounds(&box);
+
+ /* if no size given, take entire drawing */
+ if (g_xsize*g_ysize==0) {
+ g_xsize = 10; g_ysize = 10;
+ g_get_usersize(&g_xsize,&g_ysize);
+ }
+
+ /* get scales from data sets */
+ do_each_dataset_settings();
+ set_bar_axis_places();
+ get_dataset_ranges();
+
+ /* this window set is there to initialize ranges based on data */
+ /* in case there is no ranges given in let commands */
+ window_set(false);
+
+ /* update scale based on let commands if not explicit scale given */
+ if (should_autorange_based_on_lets()) {
+ /* if min max not set, do_let in approximate way first */
+ for (unsigned int i = 0; i < g_letCmds.size(); i++) {
+ doLet(g_letCmds[i], false);
+ }
+ get_dataset_ranges();
+ for (int i = 1; i <= ndata; i++) {
+ if (dp[i] != NULL) {
+ dp[i]->restore();
+ }
+ }
+ } else {
+ /* otherwise window_set will round ranges found by previous window_set! */
+ reset_axis_ranges();
+ }
+
+ window_set(true);
+ store_window_bounds_to_vars();
+
+ /* get the origin x,y */
+ g_get_xy(&ox,&oy);
+ g_gsave();
+ set_sizelength();
+ g_set_hei(g_fontsz);
+
+ /* draw the box */
+ if (!g_nobox) {
+ g_box_stroke(ox, oy, ox+g_xsize, oy+g_ysize);
+ }
+
+ /* init axis things */
+ vinit_title_axis();
+ axis_add_noticks();
+ axis_init_length();
+
+ /* center? */
+ if (g_center || g_auto_s_v || g_auto_s_h) {
+ GLERectangle dummy;
+ dummy.initRange();
+ GLEMeasureBox measure;
+ GLEDevice* old_device = g_set_dummy_device();
+ measure.measureStart();
+ graphBlock->getAxis()->setBox(&dummy);
+ graphBlock->getAxis()->drawLayer(GLE_GRAPH_LAYER_UNDEFINED);
+ key_update_bounds(ox, oy, keyinfo);
+ measure.measureEnd();
+ g_restore_device(old_device);
+ if (g_auto_s_h) {
+ double d1 = measure.getXMin() - ox - g_fontsz/5;
+ double d2 = ox + g_xsize - measure.getXMax() - g_fontsz/5;
+ double l1 = ox + g_xsize/2 - xlength/2 - measure.getXMin();
+ double new_xlen = xlength + d1 + d2;
+ g_hscale = new_xlen/g_xsize;
+ ox += new_xlen/2 - g_xsize/2 + l1 + g_fontsz/5;
+ } else if (g_center) {
+ ox += ox+g_xsize/2.0 - measure.getXMid();
+ }
+ if (g_auto_s_v) {
+ double d1 = measure.getYMin() - oy - g_fontsz/5;
+ double d2 = oy + g_ysize - measure.getYMax() - g_fontsz/5;
+ double l1 = oy + g_ysize/2 - ylength/2 - measure.getYMin();
+ double new_ylen = ylength + d1 + d2;
+ g_vscale = new_ylen/g_ysize;
+ oy += new_ylen/2 - g_ysize/2 + l1 + g_fontsz/5;
+ } else if (g_center) {
+ oy += oy+g_ysize/2.0 - measure.getYMid();
+ }
+ g_move(ox,oy);
+ set_sizelength();
+ axis_init_length();
+ }
+
+ /* Measure key */
+ g_move(ox,oy);
+ prepare_graph_key_and_clip(ox, oy, keyinfo);
+
+ /* must come after auto scale */
+ axis_add_grid();
+
+ /* do LETS now */
+ for (unsigned int i = 0; i < g_letCmds.size(); i++) {
+ doLet(g_letCmds[i], true);
+ }
+
+ /* Throw away missing values if NOMISS on datasets */
+ gr_thrownomiss();
+
+ /* Draw graph background */
+ if (!g_graph_background->isTransparent()) {
+ GLERC<GLEColor> old_fill(g_get_fill());
+ g_set_fill(g_graph_background);
+ g_box_fill(graph_x1, graph_y1, graph_x2, graph_y2);
+ g_set_fill(old_fill);
+ }
+
+ if (g_colormap != NULL) {
+ GLEToGraphView view(&xx[GLE_AXIS_X], &xx[GLE_AXIS_Y]);
+ g_colormap->draw(&view, graph_x1, graph_y1, xlength, ylength);
+ delete g_colormap;
+ g_colormap = NULL;
+ }
+
+ graphBlock->getAxis()->setBox(&box);
+
+ graphBlock->drawParts();
+
+ /* Draw the key */
+ if (keyinfo->getNbEntries() > 0 && !keyinfo->isDisabled() && !keyinfo->getNoBox() && keyinfo->getBackgroundColor()->isTransparent()) {
+ g_endclip();
+ g_grestore();
+ }
+
+ g_grestore();
+ g_init_bounds();
+ g_set_bounds(&box);
+
+ draw_key_after_measure(keyinfo);
+ g_move(ox,oy);
+ return;
+}
+
+void g_graph_init() {
+ for (int i = 0; i < MAX_NB_FILL; i++) {
+ fd[i] = NULL;
+ }
+ for (int i = 0; i < MAX_NB_DATA; i++) {
+ dp[i] = NULL;
+ }
+}
+
+void graph_free() {
+ for (int i = 0; i < MAX_NB_FILL; i++) {
+ if (fd[i] != NULL) {
+ delete fd[i];
+ fd[i] = NULL;
+ }
+ }
+ for (int i = 0; i < MAX_NB_DATA; i++) {
+ if (dp[i] != NULL) {
+ delete dp[i];
+ }
+ dp[i] = NULL;
+ }
+}
+
+void graph_freebars() {
+ for (int i = 1; i <= g_nbar; i++) {
+ delete br[i];
+ br[i] = NULL;
+ }
+ g_nbar = 0;
+}
+
+void graph_init() {
+ g_graph_background = g_get_fill_clear();
+ ndata = 0; nfd = 0; g_nbar = 0;
+ xx[GLE_AXIS_X0].off = true;
+ xx[GLE_AXIS_Y0].off = true;
+ xx[GLE_AXIS_T].off = true;
+ graph_freebars();
+ graph_free();
+}
+
+void iffree(void *p, const char *s) {
+ if (p!=NULL) myfrees(p,s);
+}
+
+int freedataset(int d) {
+ int i,c=0;
+ for (i=1;i<=ndata;i++)
+ {
+ if (dp[i] == NULL) c++;
+ else if (dp[i]->undefined()) c++;
+ if (c==d) return i;
+ }
+ return ndata + d - c;
+}
+
+void copy_default(int dn) {
+ dp[dn]->copy(dp[0]);
+ dp[dn]->key_name = "";
+ dp[dn]->axisscale = false;
+}
+
+bool is_dataset_identifier(const char* ds) {
+ int len = strlen(ds);
+ if (len <= 1 || toupper(ds[0]) != 'D') {
+ return false;
+ }
+ if (str_i_starts_with(ds, "d\\expr")) {
+ return true;
+ }
+ if (str_i_equals(ds, "dn")) {
+ return true;
+ }
+ if (len > 3 && ds[1] == '[' && ds[len - 1] == ']') {
+ return true;
+ }
+ char* ptr = NULL;
+ int result = strtol(ds+1, &ptr, 10);
+ return ptr != NULL && *ptr == 0 && result >= 0;
+}
+
+int get_dataset_identifier(const std::string& ds, bool def) throw(ParserError) {
+ int len = ds.size();
+ if (len <= 1 || toupper(ds[0]) != 'D') {
+ g_throw_parser_error("illegal data set identifier '", ds.c_str(), "'");
+ }
+ if (str_i_equals(ds, "dn")) {
+ return 0;
+ }
+ if (len > 3 && ds[1] == '[' && ds[len - 1] == ']') {
+ double id;
+ string str(ds.c_str() + 2, len - 3);
+ polish_eval((char*)str.c_str(), &id);
+ int result = (int)floor(id + 0.5);
+ if (result < 0 || result >= MAX_NB_DATA) {
+ ostringstream err;
+ err << "data set identifier out of range: '" << result << "'";
+ g_throw_parser_error(err.str());
+ }
+ if (def && dp[result] == NULL) {
+ g_throw_parser_error("data set '", ds.c_str(), "' not defined");
+ }
+ return result;
+ } else {
+ char* ptr = NULL;
+ int result = strtol(ds.c_str() + 1, &ptr, 10);
+ if (*ptr != 0) {
+ g_throw_parser_error("illegal data set identifier '", ds.c_str(), "'");
+ }
+ if (result < 0 || result >= MAX_NB_DATA) {
+ g_throw_parser_error("data set identifier out of range '", ds.c_str(), "'");
+ }
+ if (def && dp[result] == NULL) {
+ g_throw_parser_error("data set '", ds.c_str(), "' not defined");
+ }
+ return result;
+ }
+}
+
+int get_dataset_identifier(const string& ds, GLEParser* parser, bool def) throw(ParserError) {
+ Tokenizer* tokens = parser->getTokens();
+ if (str_i_equals(ds, "d")) {
+ tokens->ensure_next_token("[");
+ int result = (int)floor(parser->evalTokenToDouble() + 0.5);
+ if (result < 0 || result >= MAX_NB_DATA) {
+ ostringstream err;
+ err << "data set identifier out of range: '" << result << "'";
+ throw tokens->error(err.str());
+ }
+ tokens->ensure_next_token("]");
+ if (def && dp[result] == NULL) {
+ ostringstream err;
+ err << "data set d" << result << " not defined";
+ throw tokens->error(err.str());
+ }
+ return result;
+ } else if (str_i_equals(ds, "dn")) {
+ return 0;
+ } else {
+ if (ds.size() <= 1 || toupper(ds[0]) != 'D') {
+ throw tokens->error("illegal data set identifier");
+ }
+ char* ptr = NULL;
+ int result = strtol(ds.c_str() + 1, &ptr, 10);
+ if (*ptr != 0) {
+ throw tokens->error("data set identifier should be integer");
+ }
+ if (result < 0 || result >= MAX_NB_DATA) {
+ throw tokens->error("data set identifier out of range");
+ }
+ if (def && dp[result] == NULL) {
+ throw tokens->error("data set '", ds.c_str(), "' not defined");
+ }
+ return result;
+ }
+}
+
+int get_column_number(GLEParser* parser) throw(ParserError) {
+ Tokenizer* tokens = parser->getTokens();
+ const string& token = tokens->next_token();
+ if (str_i_equals(token, "c")) {
+ tokens->ensure_next_token("[");
+ int result = (int)floor(parser->evalTokenToDouble() + 0.5);
+ if (result < 0) {
+ ostringstream err;
+ err << "column index out of range: '" << result << "'";
+ throw tokens->error(err.str());
+ }
+ tokens->ensure_next_token("]");
+ return result;
+ } else {
+ if (token.size() <= 1 || toupper(token[0]) != 'C') {
+ throw tokens->error("illegal column index '", token.c_str(), "'");
+ }
+ char* ptr = NULL;
+ int result = strtol(token.c_str()+1, &ptr, 10);
+ if (*ptr != 0) {
+ throw tokens->error("column index should be integer, not '", token.c_str(), "'");
+ }
+ if (result < 0) {
+ throw tokens->error("column index out of range '", token.c_str(), "'");
+ }
+ return result;
+ }
+}
+
+class GLEDataSetDescription {
+public:
+ GLEDataSetDescription();
+ void setColumnIdx(unsigned int dimension, int column);
+ int getColumnIdx(unsigned int dimension) const;
+ unsigned int getNrDimensions() const;
+
+ int ds;
+ bool xygiven;
+private:
+ vector<int> m_columnIdx;
+};
+
+class GLEDataDescription {
+public:
+ GLEDataDescription();
+ inline int getNbDataSets() { return m_description.size(); }
+ inline GLEDataSetDescription* getDataSet(int i) { return &m_description[i]; }
+ inline void addDataSet(const GLEDataSetDescription& description) { m_description.push_back(description); }
+
+private:
+ vector<GLEDataSetDescription> m_description;
+
+public:
+ string fileName;
+ string comment;
+ string delimiters;
+ unsigned int ignore;
+ bool nox;
+};
+
+GLEDataSetDescription::GLEDataSetDescription() {
+ ds = 0;
+ xygiven = false;
+}
+
+void GLEDataSetDescription::setColumnIdx(unsigned int dimension, int column) {
+ m_columnIdx.resize(std::max<unsigned int>(m_columnIdx.size(), dimension + 1), -1);
+ m_columnIdx[dimension] = column;
+}
+
+int GLEDataSetDescription::getColumnIdx(unsigned int dimension) const {
+ return m_columnIdx[dimension];
+}
+
+unsigned int GLEDataSetDescription::getNrDimensions() const {
+ return m_columnIdx.size();
+}
+
+GLEDataDescription::GLEDataDescription() :
+ comment("!"),
+ delimiters(" ,;\t"),
+ ignore(0),
+ nox(false)
+{
+}
+
+/* data a.dat */
+/* data a.dat d2 d5 */
+/* data a.dat d1=c1,c3 d2=c5,c1 */
+/* data a.dat IGNORE n d2 d5 */
+/* data a.dat IGNORE n d1=c1,c3 d2=c5,c1 */
+/* data a.dat COMMENT # d1=c1,c3 d2=c5,c1 */
+/* data a.dat COMMENT # IGNORE n d1=c1,c3 d2=c5,c1 */
+
+void read_data_description(GLEDataDescription* description, GLESourceLine& sline) {
+ // Get data command
+ string datacmd(sline.getCode());
+ // Initialize parser for this line
+ GLEParser* parser = get_global_parser();
+ parser->setString(datacmd.c_str());
+ Tokenizer* tokens = parser->getTokens();
+ tokens->ensure_next_token_i("DATA");
+ // Read file name
+ parser->evalTokenToFileName(&description->fileName);
+ // Parse rest of the line
+ while (true) {
+ // read next token from the data description
+ const string& token = tokens->try_next_token();
+ if (token == "") {
+ // no further tokens
+ break;
+ }
+ // check if it is one of the options
+ if (str_i_equals(token, "IGNORE")) {
+ description->ignore = tokens->next_integer();
+ } else if (str_i_equals(token, "COMMENT")) {
+ parser->evalTokenToFileName(&description->comment);
+ } else if (str_i_equals(token, "DELIMITERS")) {
+ parser->evalTokenToString(&description->delimiters);
+ } else if(str_i_equals(token,"NOX")) {
+ description->nox = true;
+ } else {
+ // check if it is a data set identifier
+ GLEDataSetDescription datasetDescription;
+ datasetDescription.ds = get_dataset_identifier(token, parser, false);
+ if (tokens->is_next_token("=")) {
+ datasetDescription.xygiven = true;
+ datasetDescription.setColumnIdx(0, get_column_number(parser));
+ tokens->ensure_next_token(",");
+ datasetDescription.setColumnIdx(1, get_column_number(parser));
+ }
+ description->addDataSet(datasetDescription);
+ }
+ }
+}
+
+bool isMissingValue(const char* content, unsigned int size) {
+ if (size == 0) {
+ return true;
+ } else if (size == 1) {
+ char ch = content[0];
+ return ch == '*' || ch == '?' || ch == '-' || ch == '.';
+ } else {
+ return false;
+ }
+}
+
+void get_data_value(GLECSVData* csvData, int dn, GLEArrayImpl* array, int arrayIdx, int row, int col, unsigned int dimension) {
+ unsigned int size;
+ const char* buffer = csvData->getCell(row, col, &size);
+ if (isMissingValue(buffer, size)) {
+ array->setUnknown(arrayIdx);
+ } else {
+ char *ptr = NULL;
+ string strValue(buffer, size);
+ double doubleValue = strtod(strValue.c_str(), &ptr);
+ if (ptr == NULL || *ptr != 0) {
+ str_remove_quote(strValue);
+ array->setObject(arrayIdx, new GLEString(strValue));
+ } else {
+ array->setDouble(arrayIdx, doubleValue);
+ }
+ }
+}
+
+void createDataSet(int dn) {
+ if (dn < 0 || dn >= MAX_NB_DATA) {
+ g_throw_parser_error("too many data sets");
+ }
+ if (dn > ndata) ndata = dn;
+ if (dp[dn] == NULL) {
+ dp[dn] = new GLEDataSet(dn);
+ copy_default(dn);
+ }
+}
+
+string dimension2String(unsigned int dimension) {
+ if (dimension == 0) {
+ return "x";
+ } else if (dimension == 1) {
+ return "y";
+ } else if (dimension == 2) {
+ return "z";
+ } else {
+ ostringstream dim;
+ dim << (dimension + 1);
+ return dim.str();
+ }
+}
+
+bool isFloatMiss(GLECSVData* csvData, unsigned int row, unsigned int col) {
+ unsigned int size;
+ const char* buffer = csvData->getCell(row, col, &size);
+ if (isMissingValue(buffer, size)) {
+ return true;
+ } else if (is_float(string(buffer, size))) {
+ return true;
+ } else {
+ return false;
+ }
+}
+
+bool auto_has_header(GLECSVData* csvData, unsigned int dataColumns) {
+ if (csvData->getNbLines() == 0) {
+ return false;
+ } else {
+ for (unsigned int col = 0; col < dataColumns; col++) {
+ if (isFloatMiss(csvData, 0, col)) {
+ return false;
+ }
+ }
+ return true;
+ }
+}
+
+bool auto_all_labels_column(GLECSVData* csvData, unsigned int first_row) {
+ if (first_row >= csvData->getNbLines()) {
+ return false;
+ } else {
+ for (unsigned int row = first_row; row < csvData->getNbLines(); row++) {
+ if (isFloatMiss(csvData, row, 0)) {
+ return false;
+ }
+ }
+ return true;
+ }
+}
+
+void data_command(GLESourceLine& sline) {
+ // Read data set description
+ GLEDataDescription description;
+ read_data_description(&description, sline);
+ // Open file
+ string expandedName(GLEExpandEnvironmentVariables(description.fileName));
+ validate_file_name(expandedName, true);
+ GLECSVData csvData;
+ csvData.setDelims(description.delimiters.c_str());
+ csvData.setCommentIndicator(description.comment.c_str());
+ csvData.setIgnoreHeader(description.ignore);
+ csvData.read(expandedName);
+ unsigned int dataColumns = csvData.validateIdenticalNumberOfColumns();
+ GLECSVError* error = csvData.getError();
+ if (error->errorCode != GLECSVErrorNone) {
+ g_throw_parser_error(error->errorString);
+ }
+ // Auto-detect header
+ bool has_header = auto_has_header(&csvData, dataColumns);
+ unsigned int first_row = has_header ? 1 : 0;
+ bool all_str_col = auto_all_labels_column(&csvData, first_row);
+ bool nox = description.nox || dataColumns == 1 || all_str_col;
+ // Auto-assign columns
+ int cx = nox ? 0 : 1;
+ int cyOffs = nox && !all_str_col ? 0 : 1;
+ int nbDataSetsGiven = description.getNbDataSets();
+ for (int i = 0; i < nbDataSetsGiven; ++i) {
+ GLEDataSetDescription* dataset = description.getDataSet(i);
+ if (!dataset->xygiven) {
+ dataset->setColumnIdx(0, cx);
+ dataset->setColumnIdx(1, i + cyOffs + 1);
+ }
+ }
+ if (nbDataSetsGiven == 0) {
+ int nbDataSetsMax = dataColumns - cyOffs;
+ for (int i = 0; i < nbDataSetsMax; ++i) {
+ GLEDataSetDescription dataset;
+ dataset.ds = freedataset(i + 1);
+ dataset.setColumnIdx(0, cx);
+ dataset.setColumnIdx(1, i + cyOffs + 1);
+ description.addDataSet(dataset);
+ }
+ }
+ // Construct names data set
+ if (all_str_col) {
+ int ds = 0;
+ GLEDataSetDescription dataset;
+ dataset.ds = ds;
+ dataset.setColumnIdx(0, 0);
+ dataset.setColumnIdx(1, 1);
+ description.addDataSet(dataset);
+ xx[GLE_AXIS_X].setNamesDataSet(ds);
+ }
+ // Validate column indices
+ for (int i = 0; i < description.getNbDataSets(); i++) {
+ GLEDataSetDescription* dataset = description.getDataSet(i);
+ if (dataset->getNrDimensions() <= 0) {
+ ostringstream err;
+ err << "no columns defined for d" << dataset->ds;
+ g_throw_parser_error(err.str());
+ }
+ for (unsigned int dimension = 0; dimension < dataset->getNrDimensions(); dimension++) {
+ int column = dataset->getColumnIdx(dimension);
+ if (column < 0 || column > (int)dataColumns) {
+ ostringstream err;
+ err << "dimension " << dimension2String(dimension) << " column index out of range for d"
+ << dataset->ds << ": " << column << " not in [0,...," << dataColumns << "]";
+ g_throw_parser_error(err.str());
+ }
+ }
+ }
+ // Read header and copy to key
+ if (has_header && csvData.getNbLines() > 0) {
+ for (int i = 0; i < description.getNbDataSets(); i++) {
+ GLEDataSetDescription* dataset = description.getDataSet(i);
+ int dn = dataset->ds;
+ int targetColumn = dataset->getColumnIdx(dataset->getNrDimensions() - 1);
+ if (targetColumn > 0) {
+ createDataSet(dn);
+ string tmp(csvData.getCellString(0, targetColumn - 1));
+ str_remove_quote(tmp);
+ dp[dn]->key_name = sdup(tmp.c_str());
+ }
+ }
+ }
+ // Copy all data to the data sets
+ for (int i = 0; i < description.getNbDataSets(); i++) {
+ GLEDataSetDescription* datasetDescr = description.getDataSet(i);
+ int dn = datasetDescr->ds;
+ createDataSet(dn);
+ GLEDataSet* dataset = dp[dn];
+ unsigned int np = csvData.getNbLines() - first_row;
+ dataset->clearAll();
+ dataset->np = np;
+ GLEArrayImpl* dataDimensions = dataset->getData();
+ dataDimensions->ensure(datasetDescr->getNrDimensions());
+ for (unsigned int dimension = 0; dimension < datasetDescr->getNrDimensions(); dimension++) {
+ int column = datasetDescr->getColumnIdx(dimension);
+ GLEArrayImpl* dataColumn = new GLEArrayImpl();
+ dataDimensions->setObject(dimension, dataColumn);
+ dataColumn->ensure(np);
+ for (unsigned int j = 0; j < np ; j++) {
+ if (column == 0) {
+ dataColumn->setDouble(j, j + 1);
+ } else {
+ unsigned int row = first_row + j;
+ get_data_value(&csvData, dn, dataColumn, j, row, column - 1, dimension);
+ }
+ }
+ }
+ }
+}
diff --git a/src/gle/graph.h b/src/gle/graph.h
new file mode 100644
index 0000000..c0d16b9
--- /dev/null
+++ b/src/gle/graph.h
@@ -0,0 +1,669 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#include "gle-block.h"
+#include "axis.h"
+#include "file_io.h"
+#include "bitmap/img2ps.h"
+
+class GLEGraphBlockBase;
+class GLEGraphDrawCommand;
+class GLEGraphBlockData;
+class GLEGraphBlockInstance;
+
+const int GLE_GRAPH_LAYER_UNDEFINED = -1;
+const int GLE_GRAPH_LAYER_GRID = 200;
+const int GLE_GRAPH_LAYER_FILL = 350;
+const int GLE_GRAPH_LAYER_BAR = 350;
+const int GLE_GRAPH_LAYER_AXIS = 500;
+const int GLE_GRAPH_LAYER_LINE = 700;
+const int GLE_GRAPH_LAYER_ERROR_BAR = 700;
+const int GLE_GRAPH_LAYER_MARKER = 700;
+const int GLE_GRAPH_LAYER_DRAW_COMMAND = 700;
+
+class GLEInternalClassDefinitions : public GLERefCountObject
+{
+public:
+ GLEInternalClassDefinitions();
+
+ inline GLEClassDefinition* getKeySeparator() { return m_keySeparator.get(); }
+ inline GLEClassDefinition* getDrawCommand() { return m_drawCommand.get(); }
+ inline GLEClassDefinition* getFill() { return m_fill.get(); }
+ inline GLEClassDefinition* getBar() { return m_bar.get(); }
+
+public:
+ GLERC<GLEClassDefinition> m_keySeparator;
+ GLERC<GLEClassDefinition> m_drawCommand;
+ GLERC<GLEClassDefinition> m_fill;
+ GLERC<GLEClassDefinition> m_bar;
+};
+
+class GLEGraphDataSetOrder : public GLERefCountObject
+{
+public:
+ GLEGraphDataSetOrder(GLEGraphBlockData* data);
+
+ void addDataSet(int dataSetID);
+ void addObject(GLEDataObject* object);
+ inline GLEArrayImpl* getArray() { return m_order.get(); }
+ inline GLEGraphBlockData* getData() { return m_data; }
+
+private:
+ GLEGraphBlockData* m_data;
+ GLERC<GLEArrayImpl> m_order;
+ std::set<int> m_isIn;
+};
+
+class GLEGraphBlockData
+{
+public:
+ GLEGraphBlockData(GLEGraphBlockBase* graphBlockBase);
+
+ inline GLEGraphBlockBase* getGraphBlockBase() { return m_graphBlockBase; }
+ inline GLEGraphDataSetOrder* getOrder() { return m_order.get(); }
+
+private:
+ GLEGraphBlockBase* m_graphBlockBase;
+ GLERC<GLEGraphDataSetOrder> m_order;
+};
+
+class GLEGraphPart
+{
+public:
+ GLEGraphPart();
+ virtual ~GLEGraphPart();
+
+ virtual std::set<int> getLayers() = 0;
+ virtual void drawLayer(int layer);
+ virtual void addToOrder(GLEGraphDataSetOrder* order);
+ virtual void drawLayerObject(int layer, GLEMemoryCell* object);
+};
+
+class GLEGraphPartGrid : public GLEGraphPart
+{
+public:
+ GLEGraphPartGrid();
+ virtual ~GLEGraphPartGrid();
+
+ virtual std::set<int> getLayers();
+ virtual void drawLayer(int layer);
+ void drawLayerPart(DrawAxisPart axisPart);
+};
+
+class GLEGraphPartFills : public GLEGraphPart
+{
+public:
+ GLEGraphPartFills();
+ virtual ~GLEGraphPartFills();
+
+ virtual std::set<int> getLayers();
+ virtual void drawLayerObject(int layer, GLEMemoryCell* object);
+
+ bool shouldDraw(int n);
+ void drawFill(int n);
+};
+
+class GLEGraphPartBars : public GLEGraphPart
+{
+public:
+ GLEGraphPartBars();
+ virtual ~GLEGraphPartBars();
+
+ virtual std::set<int> getLayers();
+ virtual void drawLayerObject(int layer, GLEMemoryCell* object);
+
+ bool shouldDraw(int n);
+ void drawBar(int b);
+};
+
+class GLEGraphPartAxis : public GLEGraphPart
+{
+public:
+ GLEGraphPartAxis();
+ virtual ~GLEGraphPartAxis();
+
+ virtual std::set<int> getLayers();
+ virtual void drawLayer(int layer);
+
+ void setBox(GLERectangle* box);
+
+private:
+ GLERectangle* m_box;
+};
+
+class GLEGraphPartLines : public GLEGraphPart
+{
+public:
+ GLEGraphPartLines();
+ virtual ~GLEGraphPartLines();
+
+ virtual std::set<int> getLayers();
+ virtual void addToOrder(GLEGraphDataSetOrder* order);
+ virtual void drawLayerObject(int layer, GLEMemoryCell* object);
+
+ bool shouldDraw(int dn);
+ void drawLine(int dn);
+};
+
+class GLEGraphPartErrorBars : public GLEGraphPart
+{
+public:
+ GLEGraphPartErrorBars();
+ virtual ~GLEGraphPartErrorBars();
+
+ virtual std::set<int> getLayers();
+ virtual void addToOrder(GLEGraphDataSetOrder* order);
+ virtual void drawLayerObject(int layer, GLEMemoryCell* object);
+
+ bool shouldDraw(int dn);
+ void drawErrorBars(int dn);
+};
+
+class GLEGraphPartMarkers : public GLEGraphPart
+{
+public:
+ GLEGraphPartMarkers();
+ virtual ~GLEGraphPartMarkers();
+
+ virtual std::set<int> getLayers();
+ virtual void addToOrder(GLEGraphDataSetOrder* order);
+ virtual void drawLayerObject(int layer, GLEMemoryCell* object);
+
+ bool shouldDraw(int dn);
+ void drawMarkers(int dn);
+};
+
+class GLEGraphDrawCommands : public GLEGraphPart
+{
+public:
+ GLEGraphDrawCommands();
+ virtual ~GLEGraphDrawCommands();
+
+ virtual std::set<int> getLayers();
+ virtual void drawLayerObject(int layer, GLEMemoryCell* object);
+
+ void doDrawCommand(GLESourceLine& sline, GLEGraphBlockInstance* graphBlock);
+
+private:
+ GLEVectorAutoDelete<GLEGraphDrawCommand> m_drawCommands;
+};
+
+class GLEGraphBlockInstance : public GLEBlockInstance {
+public:
+ GLEGraphBlockInstance(GLEGraphBlockBase* parent);
+ virtual ~GLEGraphBlockInstance();
+
+ virtual void executeLine(GLESourceLine& sline);
+ virtual void endExecuteBlock();
+
+ void doDrawCommand(GLESourceLine& sline);
+
+ int getLayer() const;
+ int getLayerWithDefault(int defaultLayer) const;
+ void setLayer(int layer);
+
+ void drawParts();
+
+ GLEGraphPartAxis* getAxis();
+ void setData(GLEGraphBlockData* data);
+ GLEGraphBlockData* getData();
+ GLEGraphBlockBase* getGraphBlockBase();
+
+private:
+ GLEGraphBlockBase* m_graphBlockBase;
+ int m_layer;
+ GLEGraphBlockData* m_data;
+ GLEGraphDrawCommands* m_drawCommands;
+ GLEGraphPartAxis* m_axis;
+ GLEVectorAutoDelete<GLEGraphPart> m_graphParts;
+};
+
+class GLEGraphBlockBase : public GLEBlockBase {
+public:
+ GLEGraphBlockBase();
+ virtual ~GLEGraphBlockBase();
+
+ virtual GLEBlockInstance* beginExecuteBlockImpl(GLESourceLine& sline, int *pcode, int *cp);
+ virtual bool checkLine(GLESourceLine& sline);
+
+ inline GLEInternalClassDefinitions* getClassDefinitions() { return m_classDefinitions.get(); }
+
+private:
+ GLERC<GLEInternalClassDefinitions> m_classDefinitions;
+};
+
+#define BEGINDEF extern
+
+#define GLE_GRAPH_LM_PLAIN 0
+#define GLE_GRAPH_LM_STEPS 1
+#define GLE_GRAPH_LM_FSTEPS 2
+#define GLE_GRAPH_LM_HIST 3
+#define GLE_GRAPH_LM_IMPULSES 4
+#define GLE_GRAPH_LM_BAR 5
+
+/* for key command and gx(), gy() */
+
+#define dbg if ((gle_debug & 64)>0)
+extern int gle_debug;
+
+class KeyInfo;
+class GLELet;
+
+void graph_init(void);
+void graph_free(void);
+void iffree(void *p, const char *s);
+void setrange(double x, double y, int m);
+void gdraw_key(KeyInfo* info);
+void copy_default(int d);
+void do_dataset(int d, GLEGraphBlockInstance* graphBlock) throw(ParserError);
+void do_each_dataset_settings();
+void fill_vec(double x1, double y1, double x2, double y2, vector<double>* vec);
+void do_smooth(void);
+void window_set(bool showError) throw(ParserError);
+void reset_axis_ranges();
+bool should_autorange_based_on_lets();
+void deleteLet(GLELet* let);
+GLELet* parseLet(GLESourceLine& sline) throw(ParserError);
+GLELet* parseLet(const string& letFct, int codeLine) throw(ParserError);
+void doLet(GLELet* let, bool nofirst) throw(ParserError);
+void request(void);
+/*int draw_axis(void *axis);*/
+void bar_reset();
+void doskip(char *s,int *ct);
+void store_window_bounds_to_vars();
+void do_dataset_key(int d);
+void do_bigfile_compatibility() throw(ParserError);
+void ensureDataSetCreated(int d);
+
+#define kw(ss) if (str_i_equals(tk[ct],ss))
+#define true (!false)
+#define false 0
+
+void var_find_dn(int *idx, int *vara, int *nd);
+char *un_quote(char *ct);
+
+#define skipspace doskip(tk[ct],&ct)
+//#define tok(n) (*tk)[n]
+#define tok(n) tk[n]
+#define next_exp (get_next_exp(tk,ntk,&ct))
+#define next_font ((ct+=1),pass_font(tk[ct]))
+#define next_marker ((ct+=1),pass_marker(tk[ct]))
+#define next_color ((ct+=1),pass_color_var(tk[ct]))
+#define next_fill ((ct+=1),pass_color_var(tk[ct]))
+#define next_str(s) (ct+=1,skipspace,strcpy(s,tk[ct]))
+#define next_str_cpp(s) (ct+=1,skipspace,s=tk[ct])
+#define next_vstr(s) (ct+=1,skipspace,mystrcpy(&s,tk[ct]))
+#define next_vquote(s) (ct+=1,skipspace,mystrcpy(&s,un_quote(tk[ct])))
+#define next_vquote_cpp(s) (ct+=1,skipspace,pass_file_name(tk[ct],s))
+#define next_quote(s) (ct+=1,skipspace,strcpy(s,un_quote(tk[ct])))
+
+class fill_data {
+public:
+ fill_data();
+
+public:
+ int layer;
+ int da, db; /* fill from, too */
+ int type; /* 1= x1,d1, 2=d1,x2, 3=d1,d2, 4=d1 */
+ GLERC<GLEColor> color;
+ double xmin, ymin, xmax, ymax;
+};
+
+class GLEDataSet;
+
+void draw_vec(double x1, double y1, double x2, double y2, GLEDataSet* ds);
+void draw_mark(double x1, double y1, int i, double sz, double dval, GLEDataSet* ds) throw (ParserError);
+
+/* range of dataset dimension is initialized in window_set */
+/* can be different from axis range because "xmin" / "xmax" / "ymin" / "ymax" settings of dn */
+
+class GLEDataSetDimension {
+protected:
+ int m_Axis, m_Index;
+ GLERangeSet m_Range;
+ GLEDataSet* m_Data;
+public:
+ GLEDataSetDimension();
+ ~GLEDataSetDimension();
+ void copy(GLEDataSetDimension* other);
+ int getDataDimensionIndex();
+ inline GLERangeSet* getRange() { return &m_Range; }
+ inline int getAxis() { return m_Axis; }
+ inline void setAxis(int axis) { m_Axis = axis; }
+ inline int getIndex() { return m_Index; }
+ inline void setIndex(int idx) { m_Index = idx; }
+ inline void setDataSet(GLEDataSet* set) { m_Data = set; }
+ inline GLEDataSet* getDataSet() { return m_Data; }
+};
+
+class GLEDataPairs : public GLERefCountObject {
+protected:
+ vector<double> m_X;
+ vector<double> m_Y;
+ vector<int> m_M;
+public:
+ GLEDataPairs();
+ GLEDataPairs(double* x, double* y, int* m, int np);
+ GLEDataPairs(GLEDataSet* dataSet);
+ virtual ~GLEDataPairs();
+ void copy(GLEDataSet* dataSet);
+ void copyDimension(GLEDataSet* dataSet, unsigned int dim);
+ void resize(int np);
+ void set(double* x, double* y, int* m, int np);
+ void set(unsigned int i, double x, double y, int m);
+ void add(double x, double y, int m);
+ void noMissing();
+ void noNaN();
+ void transformLog(bool xlog, bool ylog);
+ void untransformLog(bool xlog, bool ylog);
+ void noLogZero(bool xlog, bool ylog);
+ vector<double>* getDimension(unsigned int i);
+ double getMinXInterval();
+ inline unsigned int size() const { return m_X.size(); }
+ inline double getX(int i) const { return m_X[i]; }
+ inline double getY(int i) const { return m_Y[i]; }
+ inline int getM(int i) const { return m_M[i]; }
+ inline double* getX() { return &m_X[0]; }
+ inline double* getY() { return &m_Y[0]; }
+ inline int* getM() { return &m_M[0]; }
+
+public:
+ static void validate(GLEDataSet* data, unsigned int minDim);
+ static double getDataPoint(GLEMemoryCell* element, int datasetID, unsigned int dimension, unsigned int arrayIdx);
+
+private:
+ void copyDimensionImpl(GLEArrayImpl* data, unsigned int np, int datasetID, unsigned int dim);
+};
+
+class GLEAxis;
+
+class GLEDataSet {
+public:
+ int id;
+ int nomiss;
+ unsigned int np; /* NUMBER OF POINTS */
+ int autoscale;
+ bool axisscale;
+ bool inverted;
+ char lstyle[9];
+ string key_name;
+ char *bigfile;
+ GLERC<GLEColor> key_fill;
+ GLERC<GLEColor> color;
+ double errwidth;
+ string errup;
+ string errdown;
+ double herrwidth;
+ string herrup;
+ string herrdown;
+ double msize,mdist,lwidth;
+ vector<string>* yv_str;
+ int marker;
+ int smooth;
+ int smoothm;
+ int svg_smooth; /* Savitski Golay filtering true=on */
+ int svg_poly; /* the type of polynomial 2,3,4,5...*/
+ int svg_points; /* the number of points 5,7,9,11.... */
+ int svg_iter; /* numb or time to do svg smoothing */
+ int deresolve; /* Only plot every N points: true = on */
+ bool deresolve_avg; /* dresolve + average points */
+ int line_mode;
+ int mdata;
+ double mscale;
+ bool line;
+ double rx1,ry1,rx2,ry2;
+ int layer_line;
+ int layer_marker;
+ int layer_error;
+ GLEDataSetDimension dims[2];
+ GLEArrayImpl m_data;
+ GLEArrayImpl m_dataBackup;
+public:
+ GLEDataSet(int identifier);
+ ~GLEDataSet();
+ void copy(GLEDataSet* other);
+ void backup();
+ void restore();
+ void initBackup();
+ void clearAll();
+ bool undefined();
+ GLEDataSetDimension* getDimXInv();
+ GLEDataSetDimension* getDimYInv();
+ GLEAxis* getAxis(int i);
+ void clip(double *x, double *y);
+ bool contains(double x, double y);
+ bool contains(const GLEPoint& p);
+ void checkRanges() throw(ParserError);
+ void copyRangeIfRequired(int dimension);
+ vector<int> getMissingValues();
+ void validateDimensions();
+ void validateNbPoints(unsigned int expectedNb, const char* descr = NULL);
+ GLEArrayImpl* getDimData(unsigned int dim);
+ void fromData(const vector<double>& xp, const vector<double>& yp, const vector<int>& miss);
+ inline GLEDataSetDimension* getDim(int i) { return &dims[i]; }
+ inline GLEArrayImpl* getData() { return &m_data; }
+ inline GLEArrayImpl* getDataBackup() { return &m_dataBackup; }
+};
+
+#define GLE_DIM_X 0
+#define GLE_DIM_Y 1
+
+class bar_struct {
+public:
+ int ngrp;
+ int from[20];
+ int to[20];
+ double width,dist;
+ double lwidth[20];
+ char lstyle[20][9];
+ GLERC<GLEColor> fill[20];
+ GLERC<GLEColor> color[20];
+ GLERC<GLEColor> side[20];
+ GLERC<GLEColor> top[20];
+ int notop;
+ double x3d,y3d;
+ bool horiz;
+ string style[20];
+ int layer;
+ bar_struct();
+};
+
+#ifdef __TURBOC__
+#define MAXTEMP 2000
+#else
+#define MAXTEMP 10000
+#endif
+
+#ifdef GRAPHDEF
+#else
+#define GRAPHDEF
+#endif
+
+#define MAX_NB_FILL 100
+#define MAX_NB_BAR 100
+
+GRAPHDEF double graph_x1,graph_y1,graph_x2,graph_y2; /* in cm */
+GRAPHDEF double graph_xmin,graph_ymin,graph_xmax,graph_ymax; /* graph units */
+GRAPHDEF char ebuff[400];
+GRAPHDEF int etype,eplen;
+GRAPHDEF double xbl,ybl;
+GRAPHDEF double xlength,ylength;
+GRAPHDEF double g_xsize,g_ysize,g_hscale,g_vscale,g_fontsz;
+GRAPHDEF double last_vecx,last_vecy;
+GRAPHDEF int ndata,g_nobox,g_center;
+GRAPHDEF bool g_auto_s_h, g_auto_s_v;
+GRAPHDEF bool g_math;
+GRAPHDEF double sizex,sizey;
+GRAPHDEF double vscale,hscale;
+GRAPHDEF double g_discontinuityThreshold;
+GRAPHDEF struct fill_data *fd[MAX_NB_FILL];
+GRAPHDEF int nfd;
+GRAPHDEF int gntmp;
+
+GRAPHDEF GLEDataSet *dp[MAX_NB_DATA];
+
+GRAPHDEF bar_struct *br[MAX_NB_BAR];
+void vinit_axis(int i);
+void vinit_title_axis();
+void draw_bar(double x, double yf, double yt, double wd, bar_struct* barset, int di, GLEDataSet* toDataSet) throw(ParserError);
+void get_dataset_ranges();
+void set_bar_axis_places();
+int get_dataset_identifier(const std::string& ds, bool def = false) throw(ParserError);
+int get_dataset_identifier(const string& ds, GLEParser* parser, bool def) throw(ParserError);
+
+double graph_bar_pos(double xpos, int bar, int set) throw(ParserError);
+void begin_graph(GLEGraphBlockBase* graphBlockBase, GLEGraphBlockInstance* graphBlock) throw (ParserError);
+bool execute_graph(GLESourceLine& sline, bool isCommandCheck, GLEGraphBlockInstance* graphBlock);
+void begin_key(int *pln, int *pcode, int *cp) throw (ParserError);
+void begin_tab(int *pln, int *pcode, int *cp);
+void begin_text(int *pln, int *pcode, int *cp, double w, int just);
+void draw_key(int nkd, struct offset_struct* koffset, char *kpos,double khei, int knobox);
+string dimension2String(unsigned int dimension);
+
+#define DP_CAST (struct data_struct*)
+#define BR_CAST (struct bar_struct*)
+#define AX_CAST (GLEAxis*)
+#define FD_CAST (struct fill_data*)
+
+class GLEZData;
+
+class GLEToView {
+public:
+ GLEToView();
+ virtual ~GLEToView();
+ virtual GLEPoint fnXY(const GLEPoint& xy) = 0;
+ virtual GLEPoint fnXYInv(const GLEPoint& xy) = 0;
+};
+
+class GLEToRectangularView: public GLEToView {
+public:
+ GLEToRectangularView();
+ virtual ~GLEToRectangularView();
+ virtual GLEPoint fnXY(const GLEPoint& xy);
+ virtual GLEPoint fnXYInv(const GLEPoint& xy);
+ void setXRange(double from, double to) { m_xRange.setMinMax(from, to); }
+ void setYRange(double from, double to) { m_yRange.setMinMax(from, to); }
+ void setOrigin(const GLEPoint& origin) { m_origin.set(origin); }
+ void setSize(const GLEPoint& size) { m_size.set(size); }
+private:
+ GLERange m_xRange;
+ GLERange m_yRange;
+ GLEPoint m_origin;
+ GLEPoint m_size;
+};
+
+class GLEToGraphView: public GLEToView {
+public:
+ GLEToGraphView(GLEAxis* xAxis, GLEAxis* yAxis);
+ virtual ~GLEToGraphView();
+ virtual GLEPoint fnXY(const GLEPoint& xy);
+ virtual GLEPoint fnXYInv(const GLEPoint& xy);
+private:
+ GLEAxis* m_xAxis;
+ GLEAxis* m_yAxis;
+};
+
+class GLEColorMap {
+public:
+ string m_function;
+ string m_palette;
+ int m_wd, m_hi;
+ bool m_color;
+ double m_zmin, m_zmax;
+ bool m_has_zmin;
+ bool m_has_zmax;
+ bool m_invert;
+ bool m_haspal;
+ IpolType m_ipolType;
+ GLEZData* m_Data;
+public:
+ GLEColorMap();
+ ~GLEColorMap();
+ void draw(GLEToView* toView, double x0, double y0, double wd, double hi);
+ void setZMin(double val);
+ void setZMax(double val);
+ void setPalette(const string& pal);
+ void readData();
+ inline bool hasZMin() { return m_has_zmin; }
+ inline bool hasZMax() { return m_has_zmax; }
+ inline double getZMin() { return m_zmin; }
+ inline double getZMax() { return m_zmax; }
+ inline void setFunction(const std::string& f) { m_function = f; }
+ inline void setWidth(int wd) { m_wd = wd; }
+ inline void setHeight(int hi) { m_hi = hi; }
+ inline const string& getFunction() { return m_function; }
+ inline int getWidth() { return m_wd; }
+ inline int getHeight() { return m_hi; }
+ inline bool isColor() { return m_color; }
+ inline void setColor(bool color) { m_color = color; }
+ inline void setInvert(bool inv) { m_invert = inv; }
+ inline bool isInverted() { return m_invert; }
+ inline bool hasPalette() { return m_haspal; }
+ inline const string& getPaletteFunction() { return m_palette; }
+ inline GLEZData* getData() { return m_Data; }
+ inline void setIpolType(IpolType type) { m_ipolType = type; }
+ inline IpolType getIpolType() const { return m_ipolType; }
+};
+
+
+/**
+ * Layers:
+ *
+ * - background (fill)
+ * - color map
+ * - grid
+ * - fills (e.g., fill x1,d1 color gray50)
+ * struct fill_data {
+ * int da,db;
+ * int type;
+ * int color;
+ * double xmin,ymin,xmax,ymax;
+ * };
+ * - bars (e.g., bar d3 from d1 width 0.6 fill gray30)
+ * class bar_struct {
+ * int ngrp;
+ * int from[20];
+ * int to[20];
+ * double width,dist;
+ * ...
+ * - axis
+ * - lines
+ * - error bars
+ * - markers
+ * - key
+ */
diff --git a/src/gle/graph2.cpp b/src/gle/graph2.cpp
new file mode 100644
index 0000000..dcb595c
--- /dev/null
+++ b/src/gle/graph2.cpp
@@ -0,0 +1,4534 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#define GRAPHDEF extern
+
+#include <set>
+
+#include "all.h"
+#include "tokens/stokenizer.h"
+#include "cutils.h"
+#include "file_io.h"
+#include "bitmap/img2ps.h"
+#include "op_def.h"
+#include "mem_limits.h"
+#include "token.h"
+#include "gle-interface/gle-interface.h"
+#include "glearray.h"
+#include "polish.h"
+#include "pass.h"
+#include "var.h"
+#include "graph.h"
+#include "begin.h"
+#include "color.h"
+#include "leastsq.h"
+#include "core.h"
+#include "axis.h"
+#include "gprint.h"
+#include "key.h"
+#include "glearray.h"
+#include "keyword.h"
+#include "run.h"
+#include "sub.h"
+#include "numberformat.h"
+
+#include <memory>
+
+#define DEFAULT_STEPS 100
+
+extern int g_nbar;
+extern GLEAxis xx[];
+
+extern vector<int> g_fcalls;
+extern vector<int> g_funder;
+extern GLEColorMap* g_colormap;
+
+extern GLEGlobalSource* g_Source;
+extern GLEGraphBlockData* g_graphBlockData;
+
+void box3d(double x1, double y1, double x2, double y2,double x3d, double y3d, const GLERC<GLEColor>& sidecolor, const GLERC<GLEColor>& topcolor, int notop);
+void var_clear_local(void);
+void do_svg_smooth(double* , int);
+void draw_errbar(double x, double y, double eup, double ewid, GLEDataSet* ds);
+void draw_herrbar(double x, double y, double eup, double ewid, GLEDataSet* ds);
+void do_draw_lines(double* xt, double* yt, int* m, int npts, GLEDataSet* ds);
+void do_draw_steps(double* xt, double* yt, int* m, int npts, GLEDataSet* ds);
+void do_draw_fsteps(double* xt, double* yt, int* m, int npts, GLEDataSet* ds);
+void do_draw_hist(double* xt, double* yt, int* m, int npts, GLEDataSet* ds);
+void do_draw_bar(double* xt, double* yt, int* m, int npts, GLEDataSet* ds);
+void do_draw_impulses(double* xt, double* yt, int* m, int npts, GLEDataSet* ds);
+void do_dataset_key_entries();
+
+bool hasDataset(int di) {
+ return di > 0 && di <= ndata && dp[di] != NULL && !dp[di]->undefined();
+}
+
+GLEDataSet* getDataset(int di, const char* descr = 0) {
+ if (hasDataset(di)) {
+ return dp[di];
+ } else {
+ ostringstream err;
+ if (descr != 0) {
+ err << descr << " ";
+ }
+ err << "dataset d" << di << " not defined";
+ g_throw_parser_error(err.str());
+ return 0;
+ }
+}
+
+double fnx(double value, GLEAxis* axis, GLERange* range) {
+ double wmin = range->getMin();
+ double wmax = range->getMax();
+ if (axis->negate) {
+ value = wmax - (value - wmin);
+ }
+ if (axis->log) {
+ return (log10(value) - log10(wmin))/(log10(wmax) - log10(wmin)) * xlength + xbl;
+ } else {
+ return (value - wmin)/(wmax - wmin) * xlength + xbl;
+ }
+}
+
+double fny(double value, GLEAxis* axis, GLERange* range) {
+ double wmin = range->getMin();
+ double wmax = range->getMax();
+ if (axis->negate) {
+ value = wmax - (value - wmin);
+ }
+ if (axis->log) {
+ return (log10(value) - log10(wmin))/(log10(wmax) - log10(wmin)) * ylength + ybl;
+ } else {
+ return (((value - wmin)/(wmax - wmin)) * ylength + ybl);
+ }
+}
+
+double fnx(double value, GLEDataSet* dataSet) {
+ return fnx(value, dataSet->getAxis(GLE_DIM_X), dataSet->getDim(GLE_DIM_X)->getRange());
+}
+
+double fny(double value, GLEDataSet* dataSet) {
+ return fny(value, dataSet->getAxis(GLE_DIM_Y), dataSet->getDim(GLE_DIM_Y)->getRange());
+}
+
+double fnx(double value, GLEAxis* axis) {
+ return fnx(value, axis, axis->getRange());
+}
+
+double fny(double value, GLEAxis* axis) {
+ return fny(value, axis, axis->getRange());
+}
+
+double fnxInv(double value, GLEAxis* axis, GLERange* range) {
+ double wmin = range->getMin();
+ double wmax = range->getMax();
+ double result = 0.0;
+ if (axis->log) {
+ result = pow(10, (value - ybl) / xlength * (log10(wmax) - log10(wmin)) + log10(wmin));
+ } else {
+ result = (value - xbl) / xlength * (wmax - wmin) + wmin;
+ }
+ if (axis->negate) {
+ return wmax + wmin - result;
+ } else {
+ return result;
+ }
+}
+
+double fnyInv(double value, GLEAxis* axis, GLERange* range) {
+ double wmin = range->getMin();
+ double wmax = range->getMax();
+ double result = 0.0;
+ if (axis->log) {
+ result = pow(10, (value - ybl) / xlength * (log10(wmax) - log10(wmin)) + log10(wmin));
+ } else {
+ result = (value - ybl) / ylength * (wmax - wmin) + wmin;
+ }
+ if (axis->negate) {
+ return wmax + wmin - result;
+ } else {
+ return result;
+ }
+}
+
+double fnxInv(double value, GLEAxis* axis) {
+ return fnxInv(value, axis, axis->getRange());
+}
+
+double fnyInv(double value, GLEAxis* axis) {
+ return fnyInv(value, axis, axis->getRange());
+}
+
+GLEPoint fnXY(double x, double y, GLEDataSet* dataSet) {
+ return GLEPoint(fnx(x, dataSet), fny(y, dataSet));
+}
+
+double graph_xgraph(double v) {
+ // cout << "graph_xmin: " << graph_xmin << " graph_xmax: " << graph_xmax << endl;
+ // cout << "graph_x1: " << graph_x1 << " graph_x2: " << graph_x2 << endl;
+ if (graph_xmax == graph_xmin) return 0.0;
+ if (xx[GLE_AXIS_X].negate) {
+ v = (graph_xmax - v) + graph_xmin;
+ }
+ if (xx[GLE_AXIS_X].log) {
+ return graph_x1 + (log10(v)-log10(graph_xmin))/(log10(graph_xmax)-log10(graph_xmin))*(graph_x2-graph_x1);
+ } else {
+ return graph_x1 + (v-graph_xmin)/(graph_xmax-graph_xmin)*(graph_x2-graph_x1);
+ }
+}
+
+double graph_ygraph(double v) {
+ if (graph_ymax == graph_ymin) return 0.0;
+ if (xx[GLE_AXIS_Y].negate) {
+ v = (graph_ymax - v) + graph_ymin;
+ }
+ if (xx[GLE_AXIS_Y].log) {
+ return graph_y1 + (log10(v)-log10(graph_ymin))/(log10(graph_ymax)-log10(graph_ymin))*(graph_y2-graph_y1);
+ } else {
+ return graph_y1 + (v-graph_ymin)/(graph_ymax-graph_ymin)*(graph_y2-graph_y1);
+ }
+}
+
+double bar_get_min_interval_bars(int bar) {
+ double min = GLE_INF;
+ for (int idx = 0; idx < br[bar]->ngrp; idx++) {
+ int di = br[bar]->to[idx];
+ if (hasDataset(di)) {
+ GLEDataPairs data(dp[di]);
+ min = std::min(min, data.getMinXInterval());
+ }
+ }
+ return min;
+}
+
+bool bar_has_type(bool horiz) {
+ for (int bar = 1; bar <= g_nbar; bar++) {
+ if (horiz == br[bar]->horiz) return true;
+ }
+ return false;
+}
+
+bar_struct::bar_struct() {
+ ngrp = 0;
+ width = 0.0;
+ dist = 0.0;
+ x3d = 0.0;
+ y3d = 0.0;
+ notop = false;
+ horiz = false;
+ layer = 0;
+ for (int i = 0; i < 20; i++) {
+ from[i] = 0;
+ to[i] = 0;
+ lwidth[i] = 0.0;
+ lstyle[i][0] = 0;
+ fill[i] = g_get_color_hex(GLE_COLOR_BLACK);
+ color[i] = g_get_color_hex(GLE_COLOR_BLACK);
+ side[i] = g_get_color_hex(GLE_COLOR_BLACK);
+ top[i] = g_get_color_hex(GLE_COLOR_BLACK);
+ }
+}
+
+GLEGraphPartBars::GLEGraphPartBars() {
+}
+
+GLEGraphPartBars::~GLEGraphPartBars() {
+}
+
+bool GLEGraphPartBars::shouldDraw(int /* b */) {
+ return true;
+}
+
+std::set<int> GLEGraphPartBars::getLayers() {
+ std::set<int> result;
+ for (int b = 1; b <= g_nbar; b++) {
+ if (shouldDraw(b)) {
+ result.insert(br[b]->layer);
+ }
+ }
+ return result;
+}
+
+void GLEGraphPartBars::drawLayerObject(int layer, GLEMemoryCell* object) {
+ GLEClassInstance* classObj = getGLEClassInstance(object, g_graphBlockData->getGraphBlockBase()->getClassDefinitions()->getBar());
+ if (classObj != 0) {
+ int index = classObj->getArray()->getInt(0);
+ if (shouldDraw(index) && br[index]->layer == layer) {
+ g_gsave();
+ drawBar(index);
+ g_grestore();
+ }
+ }
+}
+
+void GLEGraphPartBars::drawBar(int b) {
+ if (br[b] == 0 || br[b]->ngrp == 0) {
+ ostringstream err;
+ err << "bar set " << b << " not properly defined";
+ g_throw_parser_error(err.str());
+ }
+ int nbars = br[b]->ngrp;
+ double min_int = bar_get_min_interval_bars(b);
+ if (br[b]->width == 0) br[b]->width = min_int/(nbars * 2);
+ if (br[b]->dist == 0) br[b]->dist = br[b]->width * 1.4;
+ for (int bi = 0; bi < nbars; bi++) {
+ int df = br[b]->from[bi];
+ int dt = br[b]->to[bi];
+ // validate "to" dataset
+ if (!hasDataset(dt)) {
+ ostringstream err;
+ err << "bar dataset d" << dt << " not defined";
+ g_throw_parser_error(err.str());
+ }
+ // set bar style
+ g_set_line_width(br[b]->lwidth[bi]);
+ g_set_line_style(&br[b]->lstyle[bi][0]);
+ if (br[b]->color[bi].isNull()) {
+ br[b]->color[bi] = g_get_color_hex(GLE_COLOR_BLACK);
+ }
+ g_set_color(br[b]->color[bi]);
+ g_set_fill(br[b]->fill[bi]);
+ // compute sizes
+ double bwid = br[b]->width;
+ double bdis = br[b]->dist;
+ double whole_wid = (nbars-1) * bdis + bwid;
+ // get data
+ GLEDataSet* toDataSet = dp[dt];
+ toDataSet->checkRanges();
+ GLEDataPairs toData(toDataSet);
+ // check if has "from" dataset
+ bool hasfrom = hasDataset(df);
+ if (hasfrom) {
+ if (dp[df]->np != dp[dt]->np) {
+ ostringstream err;
+ err << "bar 'from' dataset d" << df << " and 'to' dataset d" << dt << " ";
+ err << "have a different number of points (" << dp[df]->np << " <> " << dp[dt]->np << ")";
+ g_throw_parser_error(err.str());
+ }
+ GLEDataPairs fromData(dp[df]);
+ for (unsigned int i = 0; i < dp[dt]->np; i++) {
+ if (fromData.getM(i) != toData.getM(i)) {
+ ostringstream err;
+ err << "bar 'from' dataset d" << df << " and 'to' dataset d" << dt << " ";
+ err << "have inconsistent missing values at point " << (i + 1);
+ g_throw_parser_error(err.str());
+ }
+ if (!equals_rel(fromData.getX(i), toData.getX(i))) {
+ ostringstream err;
+ err << "bar 'from' dataset d" << df << " and 'to' dataset d" << dt << " ";
+ err << "have different x-values at point " << (i + 1) << " (";
+ err << fromData.getX(i) << " <> " << toData.getX(i) << ")";
+ g_throw_parser_error(err.str());
+ }
+ if (!toData.getM(i)) {
+ draw_bar(toData.getX(i) - whole_wid/2 + bi*bdis, fromData.getY(i), toData.getY(i), bwid, br[b], bi, toDataSet);
+ }
+ }
+ } else {
+ for (unsigned int i = 0; i < dp[dt]->np; i++) {
+ if (!toData.getM(i)) {
+ draw_bar(toData.getX(i) - whole_wid/2 + bi*bdis, 0.0, toData.getY(i), bwid, br[b], bi, toDataSet);
+ }
+ }
+
+ }
+ }
+}
+
+double graph_bar_pos(double xpos, int bar, int set) throw(ParserError) {
+ if (set < 1 || set > g_nbar) {
+ g_throw_parser_error("illegal bar set: ", set);
+ }
+ int nb = br[set]->ngrp;
+ if (bar < 1 || bar > nb) {
+ g_throw_parser_error("illegal bar number: ", bar);
+ }
+ double bwid = br[set]->width;
+ double bdis = br[set]->dist;
+ double whole_wid = (nb-1)*bdis+bwid;
+ // cout << "bwid: " << bwid << endl;
+ // cout << "bdis: " << bdis << endl;
+ // cout << "nb: " << nb << endl;
+ // cout << "whole: " << whole_wid << endl;
+ if (br[set]->horiz) {
+ return graph_ygraph(xpos-whole_wid/2+(bar-1)*bdis+bwid/2);
+ } else {
+ return graph_xgraph(xpos-whole_wid/2+(bar-1)*bdis+bwid/2);
+ }
+}
+
+void draw_bar(double x, double yf, double yt, double wd, bar_struct* barset, int di, GLEDataSet* toDataSet) throw(ParserError) {
+ /* draw a bar, wd wide, centere at x , from yf, to yt */
+ x = x + wd/2;
+ double x1 = x - wd/2;
+ double y1 = yf;
+ double x2 = x + wd/2;
+ double y2 = yt;
+ double x3d = barset->x3d;
+ double y3d = barset->y3d;
+ GLERC<GLEColor> topcolor = barset->top[di];
+ GLERC<GLEColor> sidecolor = barset->side[di];
+ int notop = barset->notop;
+ if (barset->horiz) {
+ toDataSet->clip(&y1, &x1);
+ toDataSet->clip(&y2, &x2);
+ double bx1 = x1;
+ double bx2 = x2;
+ x1 = fnx(y1, toDataSet); x2 = fnx(y2, toDataSet);
+ y1 = fny(bx1, toDataSet); y2 = fny(bx2, toDataSet);
+ } else {
+ toDataSet->clip(&x1, &y1);
+ toDataSet->clip(&x2, &y2);
+ x1 = fnx(x1, toDataSet); x2 = fnx(x2, toDataSet);
+ y1 = fny(y1, toDataSet); y2 = fny(y2, toDataSet);
+ }
+ if (x1 == x2 || y1 == y2) {
+ // zero size bar
+ return;
+ }
+ if (barset->style[di] == "") {
+ if (x3d != 0.0) {
+ box3d(x1, y1, x2, y2, x3d, y3d, sidecolor, topcolor, notop);
+ }
+ g_box_fill(x1, y1, x2, y2);
+ g_box_stroke(x1, y1, x2, y2);
+ } else {
+ double args[6];
+ args[0] = x1;
+ args[1] = y1;
+ args[2] = x2;
+ args[3] = y2;
+ args[4] = yt;
+ args[5] = di;
+ string name = string("BAR_") + barset->style[di];
+ call_sub_byname(name, args, 6, "(used for defining bar style)");
+ }
+}
+
+void box3d(double x1, double y1, double x2, double y2, double x3d, double y3d, const GLERC<GLEColor>& sidecolor, const GLERC<GLEColor>& topcolor, int notop) {
+ /* assuming x3d is positive for the moment */
+ double xx;
+ if (x1>x2) { xx = x1; x1 = x2; x2 = xx;}
+ if (y1>y2) { xx = y1; y1 = y2; y2 = xx;}
+ x3d = x3d*(x2-x1);
+ y3d = y3d*(x2-x1);
+ if (x3d<0) {
+ xx = x1; x1 = x2; x2 = xx;
+ }
+ g_gsave();
+ g_set_path(true);
+ g_set_line_join(1); /* use rounded lines to avoid ucky peeks */
+ g_newpath();
+ g_move(x2,y1);
+ g_line(x2+x3d,y1+y3d);
+ g_line(x2+x3d,y2+y3d);
+ g_line(x2,y2);
+ g_line(x2,y1);
+ if (!topcolor.isNull()) {
+ g_set_fill(sidecolor);
+ g_fill();
+ }
+ g_stroke();
+ g_newpath();
+ if (!notop) { /* now draw top of bar */
+ g_move(x2,y2);
+ g_line(x2+x3d,y2+y3d);
+ g_line(x1+x3d,y2+y3d);
+ g_line(x1,y2);
+ g_line(x2,y2);
+ if (!topcolor.isNull()) {
+ g_set_fill(topcolor);
+ g_fill();
+ }
+ g_stroke();
+ }
+ g_newpath();
+ g_set_path(false);
+ g_newpath();
+ g_grestore();
+}
+
+void gr_thrownomiss(void) {
+ for (int i=1;i<=ndata;i++) {
+ if (dp[i]!=NULL) if (dp[i]->nomiss && dp[i]->np>0) {
+ gr_nomiss(i); /* throw away missing points */
+ }
+ }
+}
+
+void gr_nomiss(int i) {
+ if (!hasDataset(i)) {
+ return;
+ }
+ unsigned int nbPoints = 0;
+ GLEDataSet* dataSet = dp[i];
+ dataSet->validateDimensions();
+ GLEArrayImpl* dimensions = dataSet->getData();
+ vector<int> miss(dataSet->getMissingValues());
+ for (unsigned int dim = 0; dim < dimensions->size(); dim++) {
+ GLEDataObject* data = dimensions->getObject(dim);
+ if (data != 0 && data->getType() == GLEObjectTypeArray) {
+ GLEArrayImpl* array = static_cast<GLEArrayImpl*>(data);
+ unsigned int target = 0;
+ for (unsigned int j = 0; j < array->size(); j++) {
+ if (!miss[j]) {
+ array->set(target++, array->get(j));
+ }
+ }
+ array->resize(target);
+ nbPoints = max(nbPoints, target);
+ }
+ }
+ dataSet->np = nbPoints;
+}
+
+void reset_axis_ranges() {
+ for (int axis = GLE_AXIS_X; axis <= GLE_AXIS_Y0; axis++) {
+ xx[axis].initRange();
+ }
+}
+
+bool should_autorange_based_on_lets() {
+ for (int axis = GLE_AXIS_X; axis <= GLE_AXIS_Y0; axis++) {
+ GLEAxis* ax = &xx[axis];
+ if (!ax->getRange()->hasBoth()) {
+ if (ax->getNbDimensions() > 0) return true;
+ if (g_colormap != NULL && g_colormap->getData() != NULL) return true;
+ }
+ }
+ return false;
+}
+
+void window_set(bool showError) throw(ParserError) {
+ // Called twice:
+ // - Before processing "let" commands - then "showError = false"
+ // - After processing "let" commands - then "showError = true"
+ for (int axis = GLE_AXIS_X; axis <= GLE_AXIS_Y0; axis++) {
+ bool is_horiz = axis_horizontal(axis);
+ bool has_bar = bar_has_type(is_horiz);
+ xx[axis].roundDataRange(has_bar, !is_horiz);
+ }
+ for (int axis = GLE_AXIS_X; axis <= GLE_AXIS_Y0; axis++) {
+ bool is_horiz = axis_horizontal(axis);
+ bool has_bar = bar_has_type(is_horiz);
+ int ortho = is_horiz ? GLE_AXIS_Y : GLE_AXIS_X;
+ int clone = is_horiz ? GLE_AXIS_X : GLE_AXIS_Y;
+ xx[axis].makeUpRange(&xx[clone], &xx[ortho], has_bar, !is_horiz);
+ if (showError && xx[axis].getRange()->invalidOrEmpty()) {
+ stringstream err;
+ err << "illegal range for " << axis_type_name(axis) << ": ";
+ xx[axis].getRange()->printRange(err);
+ g_throw_parser_error(err.str());
+ }
+ }
+ for (int axis = GLE_AXIS_X; axis <= GLE_AXIS_Y0; axis++) {
+ GLEAxis* ax = &xx[axis];
+ for (int dim = 0; dim < ax->getNbDimensions(); dim++) {
+ ax->getDim(dim)->getRange()->copyIfNotSet(ax->getRange());
+ }
+ }
+}
+
+void store_window_bounds_to_vars() {
+ var_findadd_set("XGMIN", xx[GLE_AXIS_X].getMin());
+ var_findadd_set("XGMAX", xx[GLE_AXIS_X].getMax());
+ var_findadd_set("YGMIN", xx[GLE_AXIS_Y].getMin());
+ var_findadd_set("YGMAX", xx[GLE_AXIS_Y].getMax());
+ var_findadd_set("X2GMIN", xx[GLE_AXIS_X2].getMin());
+ var_findadd_set("X2GMAX", xx[GLE_AXIS_X2].getMax());
+ var_findadd_set("Y2GMIN", xx[GLE_AXIS_Y2].getMin());
+ var_findadd_set("Y2GMAX", xx[GLE_AXIS_Y2].getMax());
+}
+
+void fitbez(GLEDataPairs* data, bool multi);
+
+GLERC<GLEDataPairs> transform_data(GLEDataSet* ds, bool isline = true) {
+ /* isline = false for marker plots */
+ GLERC<GLEDataPairs> data = new GLEDataPairs();
+ data->copy(ds);
+ data->noNaN();
+ bool xlog = xx[ds->getDim(GLE_DIM_X)->getAxis()].log;
+ bool ylog = xx[ds->getDim(GLE_DIM_Y)->getAxis()].log;
+ data->noLogZero(xlog, ylog);
+ if (ds->deresolve > 1) {
+ data->noMissing();
+ if (data->size() >= 1) {
+ int pos = 0;
+ if (!ds->deresolve_avg) {
+ /* deresolve by just skipping some of the original points */
+ for (unsigned int j = 0; j < data->size(); j += ds->deresolve) {
+ data->set(pos++, data->getX(j), data->getY(j), 0);
+ }
+ data->set(pos++, data->getX(data->size()-1), data->getY(data->size()-1), 0);
+ } else {
+ /* deresolve by averaging points */
+ /* d1 deresolve 5 average plots points something like */
+ /* X = (X[5]+X[0])/2, Y = mean(Y[0]...Y[5]), etc. */
+ if (isline) data->set(pos++, data->getX(0), data->getY(0), 0);
+ for (unsigned int i = 0; (i+1)*ds->deresolve-1 < data->size(); i++) {
+ double yavg = 0.0;
+ for (int j = 0; j < ds->deresolve; j++) {
+ yavg += data->getY(i*ds->deresolve + j);
+ }
+ yavg /= ds->deresolve;
+ double x = (data->getX(i*ds->deresolve)+
+ data->getX((i+1)*ds->deresolve-1))/2.0;
+ data->set(pos++, x, yavg, 0);
+ }
+ if (isline) data->set(pos++, data->getX(data->size()-1), data->getY(data->size()-1), 0);
+ }
+ data->resize(pos);
+ }
+ }
+ if (ds->smooth && isline) {
+ data->noMissing();
+ data->transformLog(xlog, ylog);
+ fitbez(data.get(), ds->smoothm);
+ data->untransformLog(xlog, ylog);
+ /* maybe use real bezier curves for drawing a smoothed graph? */
+ /* instead of a huge number of line segments? */
+ }
+ if (ds->svg_smooth) {
+ data->noMissing();
+ if (data->size() > 3) {
+ if (ds->svg_iter == 0) ds->svg_iter = 1;
+ for(int j = 0; j < ds->svg_iter; j++) {
+ do_svg_smooth(data->getY(), data->size());
+ }
+ }
+ }
+ return data;
+}
+
+GLEGraphPartFills::GLEGraphPartFills() {
+}
+
+GLEGraphPartFills::~GLEGraphPartFills() {
+}
+
+bool GLEGraphPartFills::shouldDraw(int n) {
+ return fd[n]->type != 0;
+}
+
+std::set<int> GLEGraphPartFills::getLayers() {
+ std::set<int> result;
+ for (int n = 1; n <= nfd; n++) {
+ if (shouldDraw(n)) {
+ result.insert(fd[n]->layer);
+ }
+ }
+ return result;
+}
+
+void GLEGraphPartFills::drawLayerObject(int layer, GLEMemoryCell* object) {
+ GLEClassInstance* classObj = getGLEClassInstance(object, g_graphBlockData->getGraphBlockBase()->getClassDefinitions()->getFill());
+ if (classObj != 0) {
+ int index = classObj->getArray()->getInt(0);
+ if (shouldDraw(index) && fd[index]->layer == layer) {
+ g_gsave();
+ int origMaxVector = setMaxPSVector(-1);
+ drawFill(index);
+ setMaxPSVector(origMaxVector);
+ g_grestore();
+ }
+ }
+}
+
+void GLEGraphPartFills::drawFill(int n) {
+ struct fill_data *ff = fd[n];
+ int dn = ff->da;
+ if (!hasDataset(dn)) {
+ gprint("no data in fill dataset");
+ return;
+ }
+ GLEDataSet* daDS = dp[dn];
+ daDS->checkRanges();
+ /* set clipping region */
+ daDS->clip(&ff->xmin, &ff->ymin);
+ daDS->clip(&ff->xmax, &ff->ymax);
+ g_beginclip(); /* saves current clipping */
+ g_set_path(true);
+ g_newpath();
+ GLERectangle clipBox;
+ clipBox.initRange();
+ GLEPoint pMin(fnXY(ff->xmin, ff->ymin, daDS));
+ GLEPoint pMax(fnXY(ff->xmax, ff->ymax, daDS));
+ clipBox.updateRange(&pMin);
+ clipBox.updateRange(&pMax);
+ g_box_stroke(&clipBox);
+ g_clip(); /* sets current path to be clipping */
+ vector<double> fvec;
+ GLERC<GLEDataPairs> data1 = transform_data(dp[dn]);
+ GLERC<GLEDataPairs> data2;
+ data1->noMissing();
+ if (data1->size() < 1) {
+ return;
+ }
+ double *xt = data1->getX();
+ double *yt = data1->getY();
+ double x2 = 0.0, y2 = 0.0;
+ double ymx = ff->ymax;
+ switch(ff->type) {
+ case 1: /* x1,d1 */
+ ymx = ff->ymin;
+ case 2: /* d1,x2 */
+ fill_vec(*xt, ymx, *xt, *yt, &fvec);
+ for (unsigned int i = 0; i < data1->size()-1; i++, xt++, yt++) {
+ fill_vec(*xt, *yt, *(xt+1), *(yt+1), &fvec);
+ }
+ fill_vec(*xt, *yt, *xt, ymx, &fvec);
+ fill_vec(*xt, ymx, data1->getX(0), ymx, &fvec);
+ break;
+ case 3: /* d1,d2 */
+ for (unsigned int i = 0; i < data1->size()-1; i++, xt++, yt++) {
+ fill_vec(*xt, *yt, *(xt+1), *(yt+1), &fvec);
+ x2 = *(xt+1); y2 = *(yt+1);
+ }
+ data2 = transform_data(dp[ff->db]);
+ data2->noMissing();
+ if (data2->size() < 1) {
+ break;
+ }
+ xt = data2->getX() + data2->size() - 1;
+ yt = data2->getY() + data2->size() - 1;
+ fill_vec(x2, y2, *xt, *yt, &fvec);
+ for (unsigned int i = 0; i < data2->size()-1; i++, xt--, yt--) {
+ fill_vec(*xt, *yt, *(xt-1), *(yt-1), &fvec);
+ }
+ fill_vec(*xt, *yt, data1->getX(0), data1->getY(0), &fvec);
+ break;
+ case 4: /* d1 */
+ for (unsigned int i = 0; i < data1->size()-1; i++, xt++, yt++) {
+ fill_vec(*xt, *yt, *(xt+1), *(yt+1), &fvec);
+ }
+ fill_vec(*xt, *yt, data1->getX(0), data1->getY(0), &fvec);
+ break;
+ }
+ /* Paint the region defined */
+ g_set_fill(ff->color);
+ g_newpath();
+ if (fvec.size() >= 4) {
+ g_move(fnXY(fvec[0], fvec[1], daDS));
+ double lastx = fvec[0];
+ double lasty = fvec[1];
+ for (int i = 0; i <= (int)fvec.size()-4; i += 4) {
+ if (lastx != fvec[i] || lasty != fvec[i+1]) {
+ g_closepath();
+ g_move(fnXY(fvec[i], fvec[i+1], daDS));
+ }
+ g_line(fnXY(fvec[i+2], fvec[i+3], daDS));
+ lastx = fvec[i+2]; lasty = fvec[i+3];
+ }
+ }
+ g_closepath();
+ g_fill();
+ g_set_path(false);
+ g_endclip();
+}
+
+void fill_vec(double x1, double y1, double x2, double y2, vector<double>* vec) {
+ vec->push_back(x1);
+ vec->push_back(y1);
+ vec->push_back(x2);
+ vec->push_back(y2);
+}
+
+void setupdown(const string& s, bool *enable, int *dataset, bool *percentage, double *upval) {
+ *dataset = 0;
+ *enable = true;
+ *percentage = false;
+ *upval = 0.0;
+ unsigned int len = s.size();
+ if (len == 0) {
+ *enable = false;
+ } else if (len >= 1 && toupper(s[0]) == 'D') {
+ // dataset identifier
+ *dataset = get_dataset_identifier(s.c_str(), false);
+ } else if (str_i_str(s, "%") != -1) {
+ // percentage
+ *percentage = true;
+ *upval = atof(s.c_str());
+ } else {
+ // absolute value
+ *upval = atof(s.c_str());
+ }
+}
+
+/*------------------------------------------------------------------*/
+/* d3 err .1 */
+/* d3 err 10% */
+/* d3 errup 10% errdown d2 */
+/* d3 err d1 errwidth .2 */
+
+void draw_errbar(const GLELineSegment& segment, double ewid, GLEDataSet* ds) {
+ if (ds->contains(segment.getP1())) {
+ double x = segment.getP1().getX();
+ double y = segment.getP1().getY();
+ double y2 = segment.getP2().getY();
+ draw_vec(x, y, x, y2, ds);
+ if (ds->contains(x, y2)) {
+ g_move(fnx(x, ds) - ewid/2, fny(y2, ds));
+ g_line(fnx(x, ds) + ewid/2, fny(y2, ds));
+ }
+ }
+}
+
+void draw_herrbar(const GLELineSegment& segment, double ewid, GLEDataSet* ds) {
+ if (ds->contains(segment.getP1())) {
+ double x = segment.getP1().getX();
+ double y = segment.getP1().getY();
+ double x2 = segment.getP2().getX();
+ draw_vec(x, y, x2, y, ds);
+ if (ds->contains(x2, y)) {
+ g_move(fnx(x2, ds), fny(y, ds) - ewid/2);
+ g_line(fnx(x2, ds), fny(y, ds) + ewid/2);
+ }
+ }
+}
+
+void helperGetErrorBarData(GLEDataSet* dataSet, const GLEDataPairs& pairs, int i, double error, bool isHoriz, std::vector<GLELineSegment>* result) {
+ if (isHoriz) {
+ double x2 = pairs.getX(i) - error;
+ if (dataSet->getAxis(GLE_DIM_X)->log && x2 <= 0.0) {
+ x2 = 0.0;
+ }
+ result->push_back(GLELineSegment(pairs.getX(i), pairs.getY(i), x2, pairs.getY(i)));
+ } else {
+ double y2 = pairs.getY(i) + error;
+ if (dataSet->getAxis(GLE_DIM_Y)->log && y2 <= 0.0) {
+ y2 = 0.0;
+ }
+ result->push_back(GLELineSegment(pairs.getX(i), pairs.getY(i), pairs.getX(i), y2));
+ }
+}
+
+std::vector<GLELineSegment> getErrorBarData(GLEDataSet* dataSet, const string& errdescr, bool isUp, bool isHoriz, const char* descr) {
+ int errID;
+ double value;
+ bool enable, percentage;
+ setupdown(errdescr, &enable, &errID, &percentage, &value);
+ GLEDataPairs pairs(dataSet);
+ GLEDataPairs errPairs;
+ if (errID != 0) {
+ GLEDataSet* errDataset = getDataset(errID, descr);
+ errPairs.copyDimension(errDataset, 1);
+ errDataset->validateNbPoints(dataSet->np, descr);
+ }
+ std::vector<GLELineSegment> result;
+ vector<double>* errDimension = pairs.getDimension(isHoriz ? 0 : 1);
+ for (unsigned int i = 0; i < dataSet->np; i++) {
+ int miss = false;
+ double error = 0.0;
+ if (errID != 0) {
+ miss = errPairs.getM(i);
+ error = errPairs.getY(i);
+ } else {
+ error = value;
+ if (percentage) error *= fabs(errDimension->at(i)) / 100.0;
+ }
+ if (enable && !pairs.getM(i) && !miss) {
+ if (!isUp) {
+ error = error * -1;
+ }
+ helperGetErrorBarData(dataSet, pairs, i, error, isHoriz, &result);
+ }
+ }
+ return result;
+}
+
+void draw_err(GLEDataSet* dataSet, const string& errdescr, bool isUp, bool isHoriz, double errwd, const char* descr) {
+ dataSet->checkRanges();
+ if (errwd == 0) {
+ double hei;
+ g_get_hei(&hei);
+ errwd = hei/3;
+ }
+ g_set_color(dataSet->color);
+ g_set_line_width(dataSet->lwidth);
+ std::vector<GLELineSegment> errData(getErrorBarData(dataSet, errdescr, isUp, isHoriz, descr));
+ for (unsigned int i = 0; i < errData.size(); i++) {
+ if (isHoriz) {
+ draw_herrbar(errData[i], errwd, dataSet);
+ } else {
+ draw_errbar(errData[i], errwd, dataSet);
+ }
+ }
+}
+
+void doMinMaxScaleErrorBars(GLEDataSet* dataSet, int dimensionIndex, const string& errdescr, bool isUp, bool isHoriz, const char* descr, GLERange* range)
+{
+ std::vector<GLELineSegment> errData(getErrorBarData(dataSet, errdescr, isUp, isHoriz, descr));
+ for (unsigned int i = 0; i < errData.size(); i++) {
+ GLELineSegment segment(errData[i]);
+ if (dimensionIndex == 0) {
+ range->updateRange(segment.getP1().getX(), false);
+ range->updateRange(segment.getP2().getX(), false);
+ } else {
+ range->updateRange(segment.getP1().getY(), false);
+ range->updateRange(segment.getP2().getY(), false);
+ }
+ }
+}
+
+void doMinMaxScaleErrorBars(GLEDataSet* dataSet, int dimensionIndex, GLERange* range)
+{
+ if (dataSet->errup.size() != 0) {
+ doMinMaxScaleErrorBars(dataSet, dimensionIndex, dataSet->errup, true, false, "error up", range);
+ }
+ if (dataSet->errdown.size() != 0) {
+ doMinMaxScaleErrorBars(dataSet, dimensionIndex, dataSet->errdown, false, false, "error down", range);
+ }
+ if (dataSet->herrup.size() != 0) {
+ doMinMaxScaleErrorBars(dataSet, dimensionIndex, dataSet->herrup, true, true, "error right", range);
+ }
+ if (dataSet->herrdown.size() != 0) {
+ doMinMaxScaleErrorBars(dataSet, dimensionIndex, dataSet->herrdown, false, true, "error left", range);
+ }
+}
+
+GLEGraphPartErrorBars::GLEGraphPartErrorBars() {
+}
+
+GLEGraphPartErrorBars::~GLEGraphPartErrorBars() {
+}
+
+bool GLEGraphPartErrorBars::shouldDraw(int dn) {
+ if (hasDataset(dn)) {
+ GLEDataSet* dataSet = dp[dn];
+ if (!dataSet->errup.empty() || !dataSet->errdown.empty() || !dataSet->herrup.empty() || !dataSet->herrdown.empty()) {
+ return true;
+ }
+ }
+ return false;
+}
+
+std::set<int> GLEGraphPartErrorBars::getLayers() {
+ std::set<int> result;
+ for (int dn = 1; dn <= ndata; dn++) {
+ if (shouldDraw(dn)) {
+ result.insert(dp[dn]->layer_error);
+ }
+ }
+ return result;
+}
+
+void GLEGraphPartErrorBars::addToOrder(GLEGraphDataSetOrder* order) {
+ for (int dn = 1; dn <= ndata; dn++) {
+ if (shouldDraw(dn)) {
+ order->addDataSet(dn);
+ }
+ }
+}
+
+void GLEGraphPartErrorBars::drawLayerObject(int layer, GLEMemoryCell* object) {
+ if (object->Type == GLE_MC_INT) {
+ int dn = object->Entry.IntVal;
+ if (shouldDraw(dn) && dp[dn]->layer_error == layer) {
+ g_gsave();
+ drawErrorBars(dn);
+ g_grestore();
+ }
+ }
+}
+
+void GLEGraphPartErrorBars::drawErrorBars(int dn) {
+ GLEDataSet* dataSet = dp[dn];
+ if (dataSet->errup.size() != 0) {
+ draw_err(dataSet, dataSet->errup, true, false, dataSet->errwidth, "error up");
+ }
+ if (dataSet->errdown.size() != 0) {
+ draw_err(dataSet, dataSet->errdown, false, false, dataSet->errwidth, "error down");
+ }
+ if (dataSet->herrup.size() != 0) {
+ draw_err(dataSet, dataSet->herrup, true, true, dataSet->herrwidth, "error right");
+ }
+ if (dataSet->herrdown.size() != 0) {
+ draw_err(dataSet, dataSet->herrdown, false, true, dataSet->herrwidth, "error left");
+ }
+}
+
+GLEGraphPartLines::GLEGraphPartLines() {
+}
+
+GLEGraphPartLines::~GLEGraphPartLines() {
+}
+
+bool GLEGraphPartLines::shouldDraw(int dn) {
+ return hasDataset(dn) && (dp[dn]->line || dp[dn]->lstyle[0] != 0);
+}
+
+std::set<int> GLEGraphPartLines::getLayers() {
+ std::set<int> result;
+ for (int dn = 1; dn <= ndata; dn++) {
+ if (shouldDraw(dn)) {
+ result.insert(dp[dn]->layer_line);
+ }
+ }
+ return result;
+}
+
+void GLEGraphPartLines::addToOrder(GLEGraphDataSetOrder* order) {
+ for (int dn = 1; dn <= ndata; dn++) {
+ if (shouldDraw(dn)) {
+ order->addDataSet(dn);
+ }
+ }
+}
+
+void GLEGraphPartLines::drawLayerObject(int layer, GLEMemoryCell* object) {
+ if (object->Type == GLE_MC_INT) {
+ int dn = object->Entry.IntVal;
+ if (shouldDraw(dn) && dp[dn]->layer_line == layer) {
+ g_gsave();
+ drawLine(dn);
+ g_grestore();
+ }
+ }
+}
+
+void GLEGraphPartLines::drawLine(int dn) {
+ GLEDataSet* dataSet = dp[dn];
+ dataSet->checkRanges();
+ GLERC<GLEDataPairs> data = transform_data(dataSet);
+ g_set_line_style(dp[dn]->lstyle);
+ g_set_color(dp[dn]->color);
+ g_set_line_width(dp[dn]->lwidth); /* does nothing if arg = 0 */
+ last_vecx = GLE_INF;
+ last_vecy = GLE_INF;
+ switch (dp[dn]->line_mode) {
+ case GLE_GRAPH_LM_PLAIN:
+ do_draw_lines(data->getX(), data->getY(), data->getM(), data->size(), dataSet);
+ break;
+ case GLE_GRAPH_LM_STEPS:
+ do_draw_steps(data->getX(), data->getY(), data->getM(), data->size(), dataSet);
+ break;
+ case GLE_GRAPH_LM_FSTEPS:
+ do_draw_fsteps(data->getX(), data->getY(), data->getM(), data->size(), dataSet);
+ break;
+ case GLE_GRAPH_LM_HIST:
+ do_draw_hist(data->getX(), data->getY(), data->getM(), data->size(), dataSet);
+ break;
+ case GLE_GRAPH_LM_IMPULSES:
+ do_draw_impulses(data->getX(), data->getY(), data->getM(), data->size(), dataSet);
+ break;
+ case GLE_GRAPH_LM_BAR:
+ do_draw_bar(data->getX(), data->getY(), data->getM(), data->size(), dataSet);
+ break;
+ }
+}
+
+void do_draw_lines(double* xt, double* yt, int* m, int npnts, GLEDataSet* ds) {
+ for (int i = 0; i < (npnts-1); i++, m++, xt++, yt++) {
+ if (!*m && !*(m+1)) draw_vec(*xt, *yt, *(xt+1), *(yt+1), ds);
+ }
+}
+
+void do_draw_steps(double* xt, double* yt, int* m, int npnts, GLEDataSet* ds) {
+ // STEPS: (x1,y1) to (x2,y1) and the second from (x2,y1) to (x2,y2). See demo.
+ for (int i = 0; i < (npnts-1); i++, m++, xt++, yt++) {
+ if (!*m && !*(m+1)) {
+ draw_vec(*xt, *yt, *(xt+1), *yt, ds);
+ draw_vec(*(xt+1), *yt, *(xt+1), *(yt+1), ds);
+ }
+ }
+}
+
+void do_draw_fsteps(double* xt, double* yt, int* m, int npnts, GLEDataSet* ds) {
+ // FSTEPS: (x1,y1) to (x1,y2) and the second from (x1,y2) to (x2,y2)
+ for (int i = 0; i < (npnts-1); i++, m++, xt++, yt++) {
+ if (!*m && !*(m+1)) {
+ draw_vec(*xt, *yt, *xt, *(yt+1), ds);
+ draw_vec(*xt, *(yt+1), *(xt+1), *(yt+1), ds);
+ }
+ }
+}
+
+void do_draw_hist(double* xt, double* yt, int* m, int npnts, GLEDataSet* ds) {
+ double hist_prev_x = 0, hist_prev_y = 0, hist_x1, hist_x2;
+ bool hist_has_prev = false;
+ for (int i = 0; i < npnts; i++, m++, xt++, yt++) {
+ if (!*m) {
+ bool hist_valid = true;
+ if (i < npnts-1 && !*(m+1)) {
+ hist_x2 = (*(xt+1) + (*xt))/2;
+ if (hist_has_prev) {
+ hist_x1 = (hist_prev_x + (*xt))/2;
+ } else {
+ hist_x1 = 2*(*xt) - hist_x2;
+ }
+ } else {
+ if (hist_has_prev) {
+ hist_x1 = (hist_prev_x + (*xt))/2;
+ hist_x2 = 2*(*xt) - hist_x1;
+ } else {
+ hist_valid = false;
+ }
+ }
+ if (hist_valid) {
+ if (hist_has_prev) {
+ draw_vec(hist_x1, hist_prev_y, hist_x1, *yt, ds);
+ }
+ draw_vec(hist_x1, *yt, hist_x2, *yt, ds);
+ }
+ hist_has_prev = true;
+ hist_prev_x = *xt; hist_prev_y = *yt;
+ } else {
+ hist_has_prev = false;
+ }
+ }
+}
+
+double impulsesOrig(GLEDataSet* ds) {
+ GLERange* range = ds->getDim(GLE_DIM_Y)->getRange();
+ if (range->getMin() > 0.0) return range->getMin();
+ if (range->getMax() < 0.0) return range->getMax();
+ return 0.0;
+}
+
+void do_draw_impulses(double* xt, double* yt, int* m, int npnts, GLEDataSet* ds) {
+ double impulses_orig = impulsesOrig(ds);
+ for (int i = 0; i < npnts; i++, m++, xt++, yt++) {
+ if (!*m) draw_vec(*xt, impulses_orig, *xt, *yt, ds);
+ }
+}
+
+void do_draw_bar(double* xt, double* yt, int* m, int npts, GLEDataSet* ds) {
+ do_draw_hist(xt, yt, m, npts, ds);
+ double hist_prev_x = 0, hist_prev_y = 0, hist_x1, hist_x2;
+ bool hist_has_prev = false;
+ double impulses_orig = impulsesOrig(ds);
+ for (int i = 0; i < npts; i++, m++, xt++, yt++) {
+ if (!*m) {
+ bool hist_valid = true;
+ if (i < npts-1 && !*(m+1)) {
+ hist_x2 = (*(xt+1) + (*xt))/2;
+ if (hist_has_prev) {
+ hist_x1 = (hist_prev_x + (*xt))/2;
+ } else {
+ hist_x1 = 2*(*xt) - hist_x2;
+ }
+ } else {
+ if (hist_has_prev) {
+ hist_x1 = (hist_prev_x + (*xt))/2;
+ hist_x2 = 2*(*xt) - hist_x1;
+ } else {
+ hist_valid = false;
+ }
+ }
+ if (hist_valid && hist_has_prev) {
+ // g_set_color(GLE_COLOR_BLACK);
+ double yval = hist_prev_y;
+ if (fabs(hist_prev_y-impulses_orig) > fabs(*yt-impulses_orig)) {
+ yval = *yt;
+ }
+ draw_vec(hist_x1, impulses_orig, hist_x1, yval, ds);
+ }
+ hist_has_prev = true;
+ hist_prev_x = *xt; hist_prev_y = *yt;
+ } else {
+ hist_has_prev = false;
+ }
+ }
+
+}
+
+void do_svg_smooth(double* xold, int size) {
+ /* for now this is a quadratic or cubic and 7 point smoothing only */
+ int i;
+ double* xnew;
+ xnew = (double*) calloc(size,sizeof(double));
+ for (i =0 ;i <= size ;i++ ) {
+ if (i == 0 || i == 1 || i == size-2 || i == size-1) {
+ /* can't do it*/
+ xnew[i]=xold[i];
+ } else if (i == 2 || i == size-3) {
+ /* do five point */
+ xnew[i] = (-3*xold[i-2]+12*xold[i-1]+17*xold[i]+12*xold[i+1]-3*xold[i+2])/35;
+ } else if (i == 3 || i == size - 4) {
+ /* do seven point */
+ xnew[i] = (-2*xold[i-3]+3*xold[i-2]+6*xold[i-1]+7*xold[i]+6*xold[i+1]+3*xold[i+2]-2*xold[i+3])/21;
+ } else if (i >= 4 && i <= size - 5) {
+ /* do nine point */
+ xnew[i] = (-21*xold[i-4]+14*xold[i-3]+39*xold[i-2]+54*xold[i-1]+59*xold[i]+54*xold[i+1]+39*xold[i+2]+14*xold[i+3]-21*xold[i+4])/231;
+ }
+ }
+ memcpy(xold,xnew,size*sizeof(double));
+ free(xnew);
+}
+
+void g_move_safe(const GLEPoint& p) {
+ if (gle_isnan(p.getX())) return;
+ if (gle_isnan(p.getY())) return;
+ g_move(p);
+}
+
+void g_line_safe(const GLEPoint& p) {
+ if (gle_isnan(p.getX())) return;
+ if (gle_isnan(p.getY())) return;
+ g_line(p);
+}
+
+void draw_vec(double x1, double y1, double x2, double y2, GLEDataSet* ds) {
+ if (!ds->contains(x1, y1) || !ds->contains(x2, y2)) {
+ /* ok one or both are outside our box */
+ GLERange* xrange = ds->getDim(GLE_DIM_X)->getRange();
+ GLERange* yrange = ds->getDim(GLE_DIM_Y)->getRange();
+ double txmin = xrange->getMin(), tymin = yrange->getMin();
+ double txmax = xrange->getMax(), tymax = yrange->getMax();
+ if (ds->getAxis(GLE_DIM_X)->log) {
+ x1 = log10(x1); x2 = log10(x2);
+ txmin = log10(txmin); txmax = log10(txmax);
+ }
+ if (ds->getAxis(GLE_DIM_Y)->log) {
+ y1 = log10(y1); y2 = log10(y2);
+ tymin = log10(tymin); tymax = log10(tymax);
+ }
+ bool invis = gclip(&x1, &y1, &x2, &y2, txmin, tymin, txmax, tymax);
+ if (invis) return;
+ if (ds->getAxis(GLE_DIM_X)->log) {
+ x1 = pow(10.0,x1); x2 = pow(10.0,x2);
+ }
+ if (ds->getAxis(GLE_DIM_Y)->log) {
+ y1 = pow(10.0,y1); y2 = pow(10.0,y2);
+ }
+ }
+ if (x1 != last_vecx || y1 != last_vecy) {
+ g_move_safe(fnXY(x1, y1, ds));
+ }
+ g_line_safe(fnXY(x2, y2, ds));
+ last_vecx = x2;
+ last_vecy = y2;
+}
+
+GLEGraphPartMarkers::GLEGraphPartMarkers() {
+}
+
+GLEGraphPartMarkers::~GLEGraphPartMarkers() {
+}
+
+bool GLEGraphPartMarkers::shouldDraw(int dn) {
+ return hasDataset(dn) && dp[dn]->marker != 0;
+}
+
+std::set<int> GLEGraphPartMarkers::getLayers() {
+ std::set<int> result;
+ for (int dn = 1; dn <= ndata; dn++) {
+ if (shouldDraw(dn)) {
+ result.insert(dp[dn]->layer_marker);
+ }
+ }
+ return result;
+}
+
+void GLEGraphPartMarkers::addToOrder(GLEGraphDataSetOrder* order) {
+ for (int dn = 1; dn <= ndata; dn++) {
+ if (shouldDraw(dn)) {
+ order->addDataSet(dn);
+ }
+ }
+}
+
+void GLEGraphPartMarkers::drawLayerObject(int layer, GLEMemoryCell* object) {
+ if (object->Type == GLE_MC_INT) {
+ int dn = object->Entry.IntVal;
+ if (shouldDraw(dn) && dp[dn]->layer_marker == layer) {
+ g_gsave();
+ drawMarkers(dn);
+ g_grestore();
+ }
+ }
+}
+
+void GLEGraphPartMarkers::drawMarkers(int dn) {
+ GLEDataSet* dataSet = dp[dn];
+ dataSet->checkRanges();
+ GLERC<GLEDataPairs> data = transform_data(dataSet, false);
+ g_set_color(dataSet->color);
+ g_set_line_width(dataSet->lwidth);
+ g_set_line_style("1");
+ double msize = dataSet->msize;
+ if (msize == 0) msize = g_fontsz;
+ if (dataSet->mscale != 0) msize = msize * dataSet->mscale;
+ double mdist = dataSet->mdist;
+ if (mdist == 0) {
+ GLEDataPairs mdataPairs;
+ if (dataSet->mdata != 0) {
+ GLEDataSet* mdataSet = getDataset(dataSet->mdata, "marker mdata");
+ mdataPairs.copyDimension(mdataSet, 1);
+ mdataSet->validateNbPoints(data->size(), "marker mdata");
+ }
+ for (unsigned int i = 0; i < data->size(); i++) {
+ if (!data->getM(i)) {
+ double dval = 1.0;
+ if (dataSet->mdata != 0) {
+ dval = mdataPairs.getY(i);
+ }
+ draw_mark(data->getX(i), data->getY(i), dataSet->marker, msize, dval, dataSet);
+ }
+ }
+ } else {
+ data->noMissing();
+ double* xt = data->getX();
+ double* yt = data->getY();
+ if (data->size() >= 1) {
+ double len = 0.0;
+ double x0 = fnx(xt[0], dataSet);
+ double y0 = fny(yt[0], dataSet);
+ for (unsigned int i = 1; i < data->size(); i++) {
+ double x = fnx(xt[i], dataSet);
+ double y = fny(yt[i], dataSet);
+ len += sqrt((x-x0)*(x-x0)+(y-y0)*(y-y0));
+ x0 = x; y0 = y;
+ }
+ x0 = fnx(xt[0], dataSet);
+ y0 = fny(yt[0], dataSet);
+ double prev_dist = mdist - fmod(len, mdist)/2.0;
+ for (unsigned int i = 1; i < data->size(); i++) {
+ double x = fnx(xt[i], dataSet);
+ double y = fny(yt[i], dataSet);
+ double dist = sqrt((x-x0)*(x-x0)+(y-y0)*(y-y0));
+ while (prev_dist + dist > mdist) {
+ double offs = mdist - prev_dist;
+ double xp = (offs*x + (dist-offs)*x0)/dist;
+ double yp = (offs*y + (dist-offs)*y0)/dist;
+ if (xp >= xbl && xp <= xbl+xlength && yp >= ybl && yp <= ybl+ylength) {
+ g_move(xp, yp);
+ g_marker2(dataSet->marker,msize,1);
+ }
+ x0 = xp; y0 = yp;
+ dist = sqrt((x-x0)*(x-x0)+(y-y0)*(y-y0));
+ prev_dist = 0.0;
+ }
+ prev_dist += dist;
+ x0 = x; y0 = y;
+ }
+ }
+ }
+}
+
+void draw_mark(double x, double y, int mrk, double msize, double dval, GLEDataSet* ds) throw (ParserError) {
+ if (ds->contains(x, y)) {
+ g_move(fnXY(x, y, ds));
+ g_marker2(mrk, msize, dval);
+ }
+}
+
+void gclip_simple(double *v, double vmin, double vmax) {
+ if (*v < vmin) { *v = vmin; }
+ if (*v > vmax) { *v = vmax; }
+}
+
+bool gclip(double *x1, double *y1, double *x2, double *y2,
+ double xmin, double ymin, double xmax, double ymax) {
+ // Take care of infinite values
+ if (gle_isinf(*y1)) {
+ gclip_simple(y1, ymin, ymax);
+ if (gle_isinf(*y2)) {
+ if (*y1 == *y2) return true;
+ else gclip_simple(y2, ymin, ymax);
+ } else {
+ *x1 = *x2;
+ }
+ } else if (gle_isinf(*y2)) {
+ gclip_simple(y2, ymin, ymax);
+ *x2 = *x1;
+ }
+ if (gle_isinf(*x1)) {
+ gclip_simple(x1, xmin, xmax);
+ if (gle_isinf(*x2)) {
+ if (*x1 == *x2) return true;
+ else gclip_simple(x2, xmin, xmax);
+ } else {
+ *y1 = *y2;
+ }
+ } else if (gle_isinf(*x2)) {
+ gclip_simple(x2, xmin, xmax);
+ *y2 = *y1;
+ }
+ // Check upper bound for all variables
+ // Check X
+ if (*x2 > xmax) {
+ if (*x1 > xmax) return true;
+ double dx = *x2 - *x1;
+ if (dx == 0) return true;
+ double dy = *y2 - *y1;
+ *y2 = *y1 + dy*(xmax-*x1)/dx;
+ *x2 = xmax;
+ }
+ if (*x1 > xmax) {
+ double dx = *x1 - *x2;
+ if (dx == 0) return true;
+ double dy = *y1 - *y2;
+ *y1 = *y2 + dy*(xmax-*x2)/dx;
+ *x1 = xmax;
+ }
+ // Check Y
+ if (*y2 > ymax) {
+ if (*y1 > ymax) return true;
+ double dy = *y2 - *y1;
+ if (dy == 0) return true;
+ double dx = *x2 - *x1;
+ *x2 = *x1 + dx*(ymax-*y1)/dy;
+ *y2 = ymax;
+ }
+ if (*y1 > ymax) {
+ double dy = *y1 - *y2;
+ if (dy == 0) return true;
+ double dx = *x1 - *x2;
+ *x1 = *x2 + dx*(ymax-*y2)/dy;
+ *y1 = ymax ;
+ }
+ // Check lower bound for all variables
+ // Check X
+ if (*x2 < xmin) {
+ if (*x1 < xmin) return true;
+ double dx = *x2 - *x1;
+ if (dx == 0) return true;
+ double dy = *y2 - *y1;
+ *y2 = *y1 + dy*(xmin-*x1)/dx;
+ *x2 = xmin;
+ }
+ if (*x1 < xmin) {
+ double dx = *x1 - *x2 ;
+ if (dx == 0) return true;
+ double dy = *y1 - *y2 ;
+ *y1 = *y2 + dy*(xmin-*x2)/dx;
+ *x1 = xmin;
+ }
+ // Check Y
+ if (*y2 < ymin) {
+ if (*y1 < ymin) return true;
+ double dy = *y2 - *y1;
+ if (dy == 0) return true;
+ double dx = *x2 - *x1;
+ *x2 = *x1 + dx*(ymin-*y1)/dy;
+ *y2 = ymin;
+ }
+ if (*y1 < ymin) {
+ double dy = *y1 - *y2;
+ if (dy == 0) return true;
+ double dx = *x1 - *x2;
+ *x1 = *x2 + dx*(ymin-*y2)/dy;
+ *y1 = ymin;
+ }
+ return false;
+}
+
+void vinit_axis(int i) {
+ xx[i].init(i);
+}
+
+void vinit_title_axis() {
+ xx[GLE_AXIS_T].log = 0;
+ xx[GLE_AXIS_T].getRange()->setMinMaxSet(0, 1);
+ xx[GLE_AXIS_T].label_off = 1;
+ xx[GLE_AXIS_T].side_off = 1;
+ xx[GLE_AXIS_T].ticks_off = 1;
+ xx[GLE_AXIS_T].subticks_off = 1;
+ xx[GLE_AXIS_T].title_off = 0;
+}
+
+void doskip(char *s,int *ct) {
+ if (*s==' ') (*ct)++;
+}
+
+double get_next_exp(TOKENS tk,int ntok,int *curtok) {
+ static int i;
+ static double x;
+ (*curtok)++;
+ dbg for (i=1;i<=ntok;i++) gprint("{%s} ",(*tk)[i]);
+ dbg gprint("\n");
+ dbg gprint("**get exp token ct %d {%s} \n",*curtok,(*tk)[*curtok]);
+ if (strlen(tk[*curtok])==0){
+ /* this is added for optional parameters on smoothing. They must be at end for this to work*/
+ dbg gprint("zero length expression in get expression no polish called\n");
+ x=0;
+ } else {
+ polish_eval(tk[*curtok],&x);
+ }
+ return x;
+}
+
+void get_next_exp_string(TOKENS tk, int ntok, int *curtok, string* res) {
+ (*curtok)++;
+ if ((*curtok) <= ntok) {
+ polish_eval_string(tk[*curtok], res);
+ } else {
+ *res = "";
+ }
+}
+
+void get_next_exp_file(TOKENS tk, int ntok, int *curtok, string* res) {
+ (*curtok)++;
+ if ((*curtok) <= ntok) {
+ pass_file_name(tk[*curtok], *res);
+ } else {
+ *res = "";
+ }
+}
+
+bool checktok(char *t, char *want) {
+ if (str_i_equals(t,want)) return true;
+ else {
+ gprint("Found token {%s} Wanted {%s} \n",t,want);
+ return false;
+ }
+}
+
+#define GLE_DS_L 0
+#define GLE_DS_R 1
+
+typedef struct {
+ double x, y[2];
+} DataSetVal;
+
+bool DataSetValCMP(const DataSetVal& e1, const DataSetVal& e2) {
+ return e1.x < e2.x;
+}
+
+class GLELetDataSet {
+protected:
+ int m_DN;
+ int m_Var;
+ int m_CrP;
+ bool m_IsFunction;
+ bool m_IsXRangeDS;
+ vector<DataSetVal> m_Vals;
+ vector<double> m_MissX;
+public:
+ GLELetDataSet();
+ ~GLELetDataSet();
+ void initializeFrom(int dn, int var);
+ void complainNoFunction() throw (ParserError);
+ bool interpolateTo(double x, int lr);
+ inline int getNbValues() { return m_Vals.size(); }
+ inline double getXValue(int i) { return m_Vals[i].x; }
+ inline int getNbMissing() { return m_MissX.size(); }
+ inline double getMissing(int i) { return m_MissX[i]; }
+ inline bool isFunction() { return m_IsFunction; }
+ inline int getDatasetID() { return m_DN; }
+ inline int getVar() { return m_Var; }
+ inline void setIsXRangeDS(bool value) { m_IsXRangeDS = value; }
+ inline bool isXRangeDS() { return m_IsXRangeDS; }
+};
+
+GLELetDataSet::GLELetDataSet() {
+ m_DN = -1;
+ m_Var = -1;
+ m_CrP = 0;
+ m_IsFunction = true;
+ m_IsXRangeDS = false;
+}
+
+GLELetDataSet::~GLELetDataSet() {
+}
+
+void GLELetDataSet::initializeFrom(int dn, int var) {
+ m_DN = dn;
+ m_Var = var;
+ /* points */
+ GLEDataSet* dataSet = dp[dn];
+ GLEDataPairs pairs(dataSet);
+ double* xv = pairs.getX();
+ double* yv = pairs.getY();
+ int* mm = pairs.getM();
+ /* get data from datasets */
+ /* record x-values for which y-value is missing separately */
+ int nbvals = 0;
+ double xprev = GLE_INF;
+ for (unsigned int i = 0; i < dataSet->np; i++) {
+ if (!mm[i]) {
+ if (xv[i] == xprev && nbvals > 0) {
+ /* same x-value, but different y-value */
+ /* support for datasets with discontinuities */
+ m_Vals[nbvals-1].y[GLE_DS_R] = yv[i];
+ } else {
+ DataSetVal val;
+ val.x = xv[i];
+ val.y[GLE_DS_L] = yv[i];
+ val.y[GLE_DS_R] = yv[i];
+ m_Vals.push_back(val);
+ xprev = val.x;
+ nbvals++;
+ }
+ } else {
+ m_MissX.push_back(xv[i]);
+ }
+ }
+ // Sort data if required
+ bool sorted = true;
+ for (unsigned int i = 1; i < m_Vals.size(); i++) {
+ if (m_Vals[i].x <= m_Vals[i-1].x) sorted = false;
+ }
+ if (!sorted) {
+ std::sort(m_Vals.begin(), m_Vals.end(), DataSetValCMP);
+ }
+ // Check if dataset represents a function
+ m_IsFunction = true;
+ for (unsigned int i = 1; i < m_Vals.size(); i++) {
+ if (m_Vals[i].x == m_Vals[i-1].x) {
+ // Note: GLE can't combine different datasets if they don't represent functions in one let command
+ m_IsFunction = false;
+ }
+ }
+}
+
+void GLELetDataSet::complainNoFunction() throw (ParserError) {
+ for (unsigned int i = 1; i < m_Vals.size(); i++) {
+ if (m_Vals[i].x == m_Vals[i-1].x) {
+ ostringstream errs;
+ errs << "dataset d" << m_DN << " not a function - duplicate range value: '" << m_Vals[i].x << "'";
+ g_throw_parser_error(errs.str());
+ }
+ }
+}
+
+bool GLELetDataSet::interpolateTo(double x, int lr) {
+ /* returns true if dataset has discontinuity at point x */
+ if (m_Var == -1) {
+ /* dataset not used in let expression, only in 'range" part */
+ return false;
+ }
+ int mx = m_Vals.size();
+ if (mx == 0) {
+ var_set(m_Var, GLE_NAN);
+ } else if (mx == 1) {
+ double x_val = m_Vals[0].x;
+ if (x < x_val) {
+ var_set(m_Var, m_Vals[0].y[GLE_DS_L]);
+ } else if (x > x_val) {
+ var_set(m_Var, m_Vals[0].y[GLE_DS_R]);
+ } else {
+ DataSetVal* v = &m_Vals[0];
+ var_set(m_Var, v->y[lr]);
+ if (lr == GLE_DS_L && v->y[GLE_DS_L] != v->y[GLE_DS_R]) {
+ return true;
+ }
+ }
+ } else {
+ while (x < m_Vals[m_CrP].x || x > m_Vals[m_CrP+1].x) {
+ /* x too small or too large for current interval -> move interval */
+ if (x < m_Vals[m_CrP].x) {
+ if (m_CrP <= 0) {
+ var_set(m_Var, m_Vals[0].y[GLE_DS_L]);
+ return false;
+ }
+ m_CrP--;
+ }
+ if (x > m_Vals[m_CrP+1].x) {
+ if (m_CrP+2 >= mx) {
+ var_set(m_Var, m_Vals[mx-1].y[GLE_DS_R]);
+ return false;
+ }
+ m_CrP++;
+ }
+ }
+ if (x == m_Vals[m_CrP].x) {
+ DataSetVal* v = &m_Vals[m_CrP];
+ var_set(m_Var, v->y[lr]);
+ if (lr == GLE_DS_L && v->y[GLE_DS_L] != v->y[GLE_DS_R]) {
+ return true;
+ }
+ } else if (x == m_Vals[m_CrP+1].x) {
+ DataSetVal* v = &m_Vals[m_CrP+1];
+ var_set(m_Var, v->y[lr]);
+ if (lr == GLE_DS_L && v->y[GLE_DS_L] != v->y[GLE_DS_R]) {
+ return true;
+ }
+ } else {
+ double y1 = m_Vals[m_CrP].y[GLE_DS_R];
+ double y2 = m_Vals[m_CrP+1].y[GLE_DS_L];
+ double x1 = m_Vals[m_CrP].x;
+ double x2 = m_Vals[m_CrP+1].x;
+ var_set(m_Var, (x-x1)/(x2-x1)*(y2-y1)+y1);
+ }
+ }
+ return false;
+}
+
+class DataFillDimension {
+protected:
+ bool m_Log;
+ GLERange m_Range;
+ double m_Value;
+ GLEFunctionParserPcode* m_Fct;
+ RefCountPtr<GLEDoubleArray> m_Values;
+public:
+ DataFillDimension(GLEFunctionParserPcode* fct);
+ ~DataFillDimension();
+ void setRange(GLERange* range, bool log);
+ bool isYValid();
+ inline bool isLog() { return m_Log; }
+ inline GLERange* getRange() { return &m_Range; }
+ inline void setDoubleAt(double v, int i) { m_Values->setDoubleAt(v, i); }
+ inline GLEDoubleArray* getValues() { return m_Values.get(); }
+ inline double getValue() { return m_Value; }
+ inline void computeValue() { m_Value = m_Fct->evalDouble(); }
+ inline bool isYNan() { return gle_isnan(m_Value); }
+};
+
+DataFillDimension::DataFillDimension(GLEFunctionParserPcode* fct) {
+ m_Log = false;
+ m_Fct = fct;
+ m_Values = new GLEDoubleArray();
+}
+
+DataFillDimension::~DataFillDimension() {
+}
+
+void DataFillDimension::setRange(GLERange* range, bool log) {
+ m_Log = log;
+ if (range->invalid()) {
+ range->initRange();
+ } else {
+ m_Range.setMin(range->getMin() - range->getWidth()/100.0);
+ m_Range.setMax(range->getMax() + range->getWidth()/100.0);
+ }
+}
+
+bool DataFillDimension::isYValid() {
+ if (gle_isnan(m_Value)) return false;
+ if (m_Value < m_Range.getMin() || m_Value > m_Range.getMax()) return false;
+ return true;
+}
+
+class DataFill {
+protected:
+ int m_Size;
+ int m_VarX;
+ bool m_PrevInvalid;
+ bool m_PrevPoint;
+ bool m_FineTune;
+ bool m_CrEnable;
+ double m_PrevXValue;
+ bool m_detectDiscontinuity;
+ double m_discontinuityThreshold;
+ bool m_tuneDistance;
+ int m_tuneIterationsMin;
+ int m_tuneIterationsMax;
+ set<double> m_MissX;
+ GLEVectorAutoDelete<GLELetDataSet>* m_DataSets;
+ GLEVectorAutoDelete<DataFillDimension> m_Dim;
+ RefCountPtr<GLEBoolArray> m_Missing;
+ GLEFunctionParserPcode* m_Where;
+public:
+ DataFill(bool finetune);
+ ~DataFill();
+ void addPointFineTune(double x, int lr);
+ void addPointIPol(double x);
+ void addPoint();
+ void addPointLR(double x, int lr);
+ void addPoint(double x);
+ void addPoint(double x, double y);
+ void addMissing();
+ void addMissingLR(double x, int lr);
+ bool isYValid();
+ bool isYNotNan();
+ bool isRangeValid();
+ bool selectXValue(double x, int lr);
+ void selectXValueNoIPol(double x);
+ double maxDistanceTo(double x);
+ void minMaxDistanceTo(double x, GLERange* distanceRange);
+ void tryIPol(double other, double nanval);
+ void checkDiscontinuity(double xPrev, double xNext, int lr);
+ void tryAddMissing(double x, int lr);
+ void setInfo(GLEFunctionParserPcode* expr, int varx);
+ void setYMinYMax(double ymin, double ymax);
+ void setDetectDiscontinuity(bool detect, double threshold);
+ void toDataset(GLEDataSet* dataset);
+ inline int size() { return m_Size; }
+ inline double* getX() { return m_Dim[0]->getValues()->toArray(); }
+ inline double* getY() { return m_Dim[1]->getValues()->toArray(); }
+ inline int* getM() { return m_Missing->toArray(); }
+ inline void addDataDimension(DataFillDimension* fill) { m_Dim.push_back(fill); }
+ inline void setDataSets(GLEVectorAutoDelete<GLELetDataSet>* sets) { m_DataSets = sets; }
+ inline void setVarX(int varx) { m_VarX = varx; }
+ inline bool isFineTune() { return m_FineTune; }
+ inline void setMissingValue(double x) { m_MissX.insert(x); }
+ inline void setWhere(GLEFunctionParserPcode* where) { m_Where = where; }
+};
+
+DataFill::DataFill(bool finetune) {
+ m_Size = 0;
+ m_VarX = -1;
+ m_PrevInvalid = false;
+ m_PrevPoint = false;
+ m_FineTune = finetune;
+ m_PrevXValue = GLE_INF;
+ m_CrEnable = true;
+ m_Missing = new GLEBoolArray();
+ m_Where = NULL;
+ m_detectDiscontinuity = false;
+ m_discontinuityThreshold = GLE_INF;
+ m_tuneDistance = 1e-6;
+ m_tuneIterationsMin = 50;
+ m_tuneIterationsMax = 10000;
+}
+
+DataFill::~DataFill() {
+}
+
+bool DataFill::isYValid() {
+ for (unsigned int i = 0; i < m_Dim.size(); i++) {
+ DataFillDimension* dim = m_Dim[i];
+ if (!dim->isYValid()) return false;
+ }
+ return true;
+}
+
+bool DataFill::isYNotNan() {
+ for (unsigned int i = 0; i < m_Dim.size(); i++) {
+ DataFillDimension* dim = m_Dim[i];
+ if (dim->isYNan()) return false;
+ }
+ return true;
+}
+
+bool DataFill::isRangeValid() {
+ for (unsigned int i = 0; i < m_Dim.size(); i++) {
+ DataFillDimension* dim = m_Dim[i];
+ if (dim->getRange()->invalid()) return false;
+ }
+ return true;
+}
+
+void DataFill::selectXValueNoIPol(double x) {
+ /* set parameter variable */
+ if (m_VarX >= 0) var_set(m_VarX, x);
+ for (unsigned int i = 0; i < m_Dim.size(); i++) {
+ DataFillDimension* dim = m_Dim[i];
+ dim->computeValue();
+ }
+}
+
+bool DataFill::selectXValue(double x, int lr) {
+ /* set parameter variable */
+ if (m_VarX >= 0) var_set(m_VarX, x);
+ /* set dataset variables */
+ bool onceMore = false;
+ for (unsigned int i = 0; i < m_DataSets->size(); i++) {
+ onceMore |= (*m_DataSets)[i]->interpolateTo(x, lr);
+ }
+ for (unsigned int i = 0; i < m_Dim.size(); i++) {
+ DataFillDimension* dim = m_Dim[i];
+ dim->computeValue();
+ }
+ return onceMore;
+}
+
+double DataFill::maxDistanceTo(double x) {
+ GLERange range;
+ minMaxDistanceTo(x, &range);
+ return range.getMax();
+}
+
+void DataFill::minMaxDistanceTo(double x, GLERange* distanceRange) {
+ /* set parameter variable */
+ if (m_VarX >= 0) var_set(m_VarX, x);
+ /* set dataset variables */
+ for (unsigned int i = 0; i < m_DataSets->size(); i++) {
+ (*m_DataSets)[i]->interpolateTo(x, GLE_DS_L);
+ }
+ double maxValue = 0.0;
+ double minValue = GLE_INF;
+ for (unsigned int i = 0; i < m_Dim.size(); i++) {
+ DataFillDimension* dim = m_Dim[i];
+ if (dim->isYValid()) {
+ double v1 = dim->getValue();
+ dim->computeValue();
+ if (dim->isYValid()) {
+ double v2 = dim->getValue();
+ double d = axis_range_dist_perc(v1, v2, dim->getRange(), dim->isLog());
+ maxValue = max(maxValue, d);
+ minValue = min(minValue, d);
+ }
+ }
+ }
+ distanceRange->setMinMax(minValue, maxValue);
+}
+
+void DataFill::tryIPol(double other, double nanval) {
+ int iter = 0;
+ double not_xmid = 0.0;
+ while (true) {
+ double xmid = (other + nanval)/2;
+ selectXValue(xmid, GLE_DS_L);
+ if (!isYValid()) {
+ nanval = xmid;
+ not_xmid = other;
+ } else {
+ other = xmid;
+ not_xmid = nanval;
+ }
+ if (iter > m_tuneIterationsMax || (iter > m_tuneIterationsMin
+ && maxDistanceTo(not_xmid) < m_tuneDistance)) {
+ addPointLR(xmid, GLE_DS_L);
+ return;
+ }
+ iter++;
+ }
+}
+
+void DataFill::tryAddMissing(double x, int lr) {
+ if (m_MissX.find(x) != m_MissX.end()) {
+ addMissingLR(x, lr);
+ }
+}
+
+void DataFill::addPoint(double x, double y) {
+ m_Dim[0]->setDoubleAt(x, m_Size);
+ m_Dim[1]->setDoubleAt(y, m_Size);
+ m_Missing->setBoolAt(false, m_Size);
+ m_Size++;
+}
+
+void DataFill::addMissing() {
+ m_Missing->setBoolAt(true, m_Size);
+ m_Size++;
+}
+
+void DataFill::addPoint(double x) {
+ int lr = GLE_DS_L;
+ while (true) {
+ bool more = selectXValue(x, lr);
+ if (!more && m_MissX.find(x) != m_MissX.end()) {
+ addMissingLR(x, lr);
+ return;
+ }
+ if (m_Where != NULL) {
+ bool wval = m_Where->evalBool();
+ if (m_CrEnable && !wval) {
+ // disable from now on -> emit missing value
+ addMissingLR(x, lr);
+ }
+ m_CrEnable = wval;
+ }
+ if (m_CrEnable) addPoint();
+ if (more) {
+ tryAddMissing(x, lr);
+ lr++;
+ } else {
+ break;
+ }
+ }
+}
+
+void DataFill::addPoint() {
+ for (unsigned int i = 0; i < m_Dim.size(); i++) {
+ DataFillDimension* dim = m_Dim[i];
+ dim->setDoubleAt(dim->getValue(), m_Size);
+ }
+ m_Missing->setBoolAt(false, m_Size);
+ m_Size++;
+}
+
+void DataFill::addPointLR(double x, int lr) {
+ selectXValue(x, lr);
+ addPoint();
+}
+
+void DataFill::addMissingLR(double x, int lr) {
+ selectXValue(x, lr);
+ for (unsigned int i = 0; i < m_Dim.size(); i++) {
+ DataFillDimension* dim = m_Dim[i];
+ if (dim->isYNan()) dim->setDoubleAt(GLE_NAN, m_Size);
+ else dim->setDoubleAt(dim->getValue(), m_Size);
+ }
+ m_Missing->setBoolAt(true, m_Size);
+ m_Size++;
+}
+
+void DataFill::checkDiscontinuity(double xPrev, double xNext, int lr) {
+ if (!m_detectDiscontinuity) {
+ return;
+ }
+ double leftX = xPrev;
+ double rightX = xNext;
+ selectXValue(leftX, lr);
+ double distance = maxDistanceTo(rightX);
+ if (distance > m_discontinuityThreshold) {
+ int iter = 0;
+ GLERange leftDistance;
+ GLERange rightDistance;
+ while (true) {
+ double xMid = (leftX + rightX) / 2;
+ selectXValue(xMid, lr);
+ minMaxDistanceTo(leftX, &leftDistance);
+ selectXValue(xMid, lr);
+ minMaxDistanceTo(rightX, &rightDistance);
+ double minDistance = leftDistance.getMin() + rightDistance.getMin();
+ if (leftDistance.getMax() > m_discontinuityThreshold) {
+ rightX = xMid;
+ distance = leftDistance.getMax();
+ } else if (rightDistance.getMax() > m_discontinuityThreshold) {
+ leftX = xMid;
+ distance = rightDistance.getMax();
+ } else {
+ return;
+ }
+ iter++;
+ if (iter > m_tuneIterationsMax || (iter > m_tuneIterationsMin && minDistance < m_tuneDistance)) {
+ if (leftX != xPrev) {
+ addPointLR(leftX, lr);
+ }
+ addMissingLR(xMid, lr);
+ if (rightX != xNext) {
+ addPointLR(rightX, lr);
+ }
+ return;
+ }
+ }
+ }
+}
+
+void DataFill::addPointFineTune(double x, int lr) {
+ if (!isYValid()) {
+ bool yNotNan = isYNotNan();
+ if (!m_PrevInvalid && m_PrevPoint) {
+ tryIPol(m_PrevXValue, x);
+ }
+ m_PrevInvalid = true;
+ addMissingLR(x, lr);
+ if (yNotNan) addPointLR(x, lr);
+ } else {
+ if (m_PrevInvalid) {
+ tryIPol(x, m_PrevXValue);
+ m_PrevInvalid = false;
+ } else {
+ checkDiscontinuity(m_PrevXValue, x, lr);
+ }
+ addPointLR(x, lr);
+ }
+}
+
+void DataFill::addPointIPol(double x) {
+ int lr = GLE_DS_L;
+ while (true) {
+ bool more = selectXValue(x, lr);
+ if (!more && m_MissX.find(x) != m_MissX.end()) {
+ // if more, then missing value is emitted in-between left and right limit
+ addMissingLR(x, lr);
+ return;
+ }
+ if (m_Where != NULL) {
+ bool wval = m_Where->evalBool();
+ if (m_CrEnable && !wval) {
+ // disable from now on -> emit missing value
+ addMissingLR(x, lr);
+ m_PrevPoint = false;
+ m_PrevInvalid = false;
+ }
+ m_CrEnable = wval;
+ }
+ if (m_CrEnable) {
+ if (m_FineTune) {
+ addPointFineTune(x, lr);
+ } else {
+ addPoint();
+ }
+ m_PrevPoint = true;
+ m_PrevXValue = x;
+ }
+ if (more) {
+ tryAddMissing(x, lr);
+ lr++;
+ } else {
+ break;
+ }
+ }
+}
+
+void DataFill::setDetectDiscontinuity(bool detect, double threshold) {
+ m_detectDiscontinuity = detect;
+ m_discontinuityThreshold = threshold;
+}
+
+void DataFill::toDataset(GLEDataSet* dataset) {
+ dataset->np = size();
+ GLEArrayImpl* dimensions = dataset->getData();
+ dimensions->ensure(m_Dim.size());
+ for (unsigned int dim = 0; dim < m_Dim.size(); dim++) {
+ GLEArrayImpl* newArray = new GLEArrayImpl();
+ newArray->ensure(dataset->np);
+ dimensions->setObject(dim, newArray);
+ GLEDoubleArray* values = m_Dim[dim]->getValues();
+ for (unsigned int i = 0; i < dataset->np; i++) {
+ if (m_Missing->getBoolAt(i)) {
+ newArray->setUnknown(i);
+ } else {
+ newArray->setDouble(i, values->getDoubleAt(i));
+ }
+ }
+ }
+}
+
+class GLECheckWindow {
+protected:
+ bool m_HasXMin, m_HasXMax, m_HasYMin, m_HasYMax;
+ double m_XMin, m_XMax, m_YMin, m_YMax;
+public:
+ GLECheckWindow();
+ ~GLECheckWindow();
+ void setXMin(double v);
+ void setXMax(double v);
+ void setYMin(double v);
+ void setYMax(double v);
+ bool valid(double x, double y);
+};
+
+GLECheckWindow::GLECheckWindow() {
+ m_HasXMin = m_HasXMax = m_HasYMin = m_HasYMax = false;
+ m_XMin = m_XMax = m_YMin = m_YMax = 0.0;
+}
+
+GLECheckWindow::~GLECheckWindow() {
+}
+
+void GLECheckWindow::setXMin(double v) {
+ m_XMin = v;
+ m_HasXMin = true;
+}
+
+void GLECheckWindow::setXMax(double v) {
+ m_XMax = v;
+ m_HasXMax = true;
+}
+
+void GLECheckWindow::setYMin(double v) {
+ m_YMin = v;
+ m_HasYMin = true;
+}
+
+void GLECheckWindow::setYMax(double v) {
+ m_YMax = v;
+ m_HasYMax = true;
+}
+
+bool GLECheckWindow::valid(double x, double y) {
+ if (m_HasXMin && x < m_XMin) return false;
+ if (m_HasXMax && x > m_XMax) return false;
+ if (m_HasYMin && y < m_YMin) return false;
+ if (m_HasYMax && y < m_YMax) return false;
+ return true;
+}
+
+class GLEFitLS : public GLEPowellFunc {
+protected:
+ int m_IdxX, m_NIter;
+ double m_RSquare;
+ vector<int> m_Vars;
+ vector<double>* m_X;
+ vector<double>* m_Y;
+ StringIntHash m_VarMap;
+ string m_FunctionStr;
+ GLERC<GLEFunctionParserPcode> m_Function;
+public:
+ GLEFitLS();
+ virtual ~GLEFitLS();
+ void polish(const string& str) throw(ParserError);
+ void setXY(vector<double>* x, vector<double>* y);
+ void fit();
+ void testFit();
+ void setVarsVals(double* vals);
+ void toFunctionStr(const string& format, string* str) throw(ParserError);
+ virtual double fitMSE(double* vals);
+ inline GLEFunctionParserPcode* getFunction() { return m_Function.get(); }
+ inline double getRSquare() { return m_RSquare; }
+};
+
+GLEFitLS::GLEFitLS() {
+ m_IdxX = -1;
+ m_NIter = 0;
+ m_RSquare = 0.0;
+ m_Function = new GLEFunctionParserPcode();
+}
+
+GLEFitLS::~GLEFitLS() {
+}
+
+void GLEFitLS::polish(const string& str) throw(ParserError) {
+ m_FunctionStr = str;
+ m_Function->polish(str.c_str(), &m_VarMap);
+ /* Iterate over variables in expression */
+ for (StringIntHash::const_iterator i = m_VarMap.begin(); i != m_VarMap.end(); i++ ) {
+ if (i->first != "X") {
+ m_Vars.push_back(i->second);
+ }
+ }
+}
+
+void GLEFitLS::setXY(vector<double>* x, vector<double>* y) {
+ m_X = x;
+ m_Y = y;
+}
+
+void GLEFitLS::fit() {
+ int naz = m_Vars.size();
+ double** xi = matrix(1,naz,1,naz);
+ for (int i = 1; i <= naz; i++) {
+ for (int j = 1; j <= naz; j++) {
+ xi[i][j] = 0;
+ }
+ xi[i][i] = 1;
+ }
+ double* pms = new double[naz+1];
+ for (int i = 1; i <= naz; i++) {
+ int v_idx = m_Vars[i-1];
+ var_get(v_idx, &pms[i]);
+ }
+ int vtype;
+ double fret = 0;
+ double anstol = 1e-4;
+ var_findadd("X", &m_IdxX, &vtype);
+ powell(pms, xi, naz, anstol, &m_NIter, &fret, this);
+ free_matrix(xi,1,naz,1,naz);
+ setVarsVals(pms);
+}
+
+void GLEFitLS::testFit() {
+ int nxy = m_X->size();
+ double sumy = 0.0;
+ for (int i = 0; i < nxy; i++) {
+ sumy = sumy + (*m_Y)[i];
+ }
+ double meany = sumy/nxy;
+ double sum1 = 0.0, sum2 = 0.0;
+ for (int i = 0; i < nxy; i++) {
+ var_set(m_IdxX, (*m_X)[i]);
+ double value = m_Function->evalDouble();
+ double y = (*m_Y)[i];
+ double r1 = value - y;
+ double r2 = meany - y;
+ sum1 = sum1 + r1*r1;
+ sum2 = sum2 + r2*r2;
+ }
+ m_RSquare = 1 - sum1/sum2;
+}
+
+void GLEFitLS::setVarsVals(double* vals) {
+ /* Set all variables to given values */
+ int naz = m_Vars.size();
+ for (int i = 1; i <= naz; i++) {
+ int v_idx = m_Vars[i-1];
+ if (v_idx >= 0) var_set(v_idx, vals[i]);
+ }
+}
+
+double GLEFitLS::fitMSE(double* vals) {
+ /* Set all variables to given values */
+ setVarsVals(vals);
+ /* Compute MSE */
+ double tot = 0.0;
+ for (vector<double>::size_type i = 0; i < m_X->size(); i++) {
+ var_set(m_IdxX, (*m_X)[i]);
+ double value = m_Function->evalDouble();
+ double residue = (*m_Y)[i] - value;
+ tot += residue*residue;
+ }
+ /* Return error */
+ return tot / m_X->size();
+}
+
+void GLEFitLS::toFunctionStr(const string& format, string* str) throw(ParserError) {
+ *str = "";
+ string fmt_str = format;
+ if (fmt_str == "") fmt_str = "fix 3";
+ GLENumberFormat fmt(fmt_str);
+ GLEPolish* polish = get_global_polish();
+ Tokenizer* tokens = polish->getTokens(m_FunctionStr);
+ string uc_token, v_str;
+ bool has_plus = false;
+ while (tokens->has_more_tokens()) {
+ const string& token = tokens->next_token();
+ str_to_uppercase(token, uc_token);
+ int v_idx = m_VarMap.try_get(uc_token);
+ if (uc_token != "X" && v_idx != -1) {
+ double value;
+ var_get(v_idx, &value);
+ fmt.format(value, &v_str);
+ if (has_plus && value >= 0) *str = *str + "+";
+ *str = *str + v_str;
+ has_plus = false;
+ } else {
+ if (has_plus) *str = *str + "+";
+ has_plus = token == "+";
+ if (!has_plus) *str = *str + token;
+ }
+ }
+}
+
+class GLELet {
+protected:
+ GLERC<GLEVarSubMap> m_SubMap;
+ GLERCVector<GLEFunctionParserPcode> m_Fcts;
+ GLERC<GLEFunctionParserPcode> m_Where;
+ GLEVarBackup m_varBackup;
+ set<int> m_XRangeDS;
+ double m_LetFrom, m_LetTo, m_LetStep, m_LogStep;
+ bool m_FineTune, m_NoFirst, m_HasSteps, m_HasStepOption, m_HasFrom, m_HasTo;
+ int m_VarX, m_Ds, m_LetNSteps;
+ int m_codeLine;
+
+ // For histogram routine
+ int m_nrBins;
+ int m_HistDS;
+
+ // For fitting routines
+ int m_FitDS;
+ bool m_limitDataX;
+ bool m_limitDataY;
+ bool m_limitData;
+ string m_fitType;
+ string m_fitFct;
+ string m_eqStr;
+ string m_format;
+ string m_rsq;
+ string m_varSlope;
+ string m_varIntercept;
+ string m_varR;
+ GLECheckWindow m_window;
+
+public:
+ GLELet();
+ ~GLELet();
+ void initVars();
+ void initStep();
+ void doLet() throw(ParserError);
+ void parseFitFunction(const string& fct, GLEParser* parser) throw(ParserError);
+ void parseHistogram(GLEParser* parser) throw(ParserError);
+ void doFitFunction() throw(ParserError);
+ void doHistogram() throw(ParserError);
+ void complainAboutNoFunctions(GLEVectorAutoDelete<GLELetDataSet>& datasets) throw(ParserError);
+ bool checkIdenticalRanges(GLEVectorAutoDelete<GLELetDataSet>& datasets);
+ void transformIdenticalRangeDatasets(GLEVectorAutoDelete<GLELetDataSet>& datasets, DataFill* fill);
+ void combineFunctions(GLEVectorAutoDelete<GLELetDataSet>& datasets, DataFill* fill, double logstep);
+ void setStep(double value);
+ void createVarBackup(GLEVars* vars, StringIntHash* varHash);
+ void restoreVarBackup(GLEVars* vars);
+ GLEFunctionParserPcode* insertFunction();
+ GLEFunctionParserPcode* addFunction();
+ GLEFunctionParserPcode* addWhere();
+ inline void setVarSubMap(GLEVarSubMap* map) { m_SubMap = map; }
+ inline GLEVarSubMap* getVarSubMap() { return m_SubMap.get(); }
+ inline void setFrom(double value) { m_LetFrom = value; }
+ inline void setTo(double value) { m_LetTo = value; }
+ inline void setNSteps(int value) { m_LetNSteps = value; }
+ inline void setFineTune(bool value) { m_FineTune = value; }
+ inline void setNoFirst(bool value) { m_NoFirst = value; }
+ inline double getFrom() { return m_LetFrom; }
+ inline double getTo() { return m_LetTo; }
+ inline double getStep() { return m_LetStep; }
+ inline bool hasSteps() { return m_HasSteps; }
+ inline bool hasFrom() { return m_HasFrom; }
+ inline bool hasTo() { return m_HasTo; }
+ inline void setHasStepOption(bool has) { m_HasStepOption = has; }
+ inline void setHasSteps(bool has) { m_HasSteps = has; }
+ inline void setHasFrom(bool has) { m_HasFrom = has; }
+ inline void setHasTo(bool has) { m_HasTo = has; }
+ inline void setDataSet(int ds) { m_Ds = ds; }
+ inline int getDataSet() { return m_Ds; }
+ inline int getDimension() { return m_Fcts.size(); }
+ inline void addFunction(GLEFunctionParserPcode* fct) { m_Fcts.add(fct); }
+ inline void addXRangeDS(int ds) { m_XRangeDS.insert(ds); }
+ inline set<int>& getXRangeDS() { return m_XRangeDS; }
+ inline bool isHistogram() const { return m_HistDS != -1; }
+ inline bool isFit() const { return m_FitDS != -1; }
+ inline void setCodeLine(int line) { m_codeLine = line; }
+ inline int getCodeLine() const { return m_codeLine; }
+};
+
+GLELet::GLELet() {
+ m_SubMap = NULL;
+ m_LetFrom = 0.0;
+ m_LetTo = 0.0;
+ m_LetStep = 0.0;
+ m_LetNSteps = 0;
+ m_VarX = -1;
+ m_NoFirst = false;
+ m_FineTune = false;
+ m_HasSteps = false;
+ m_HasStepOption = false;
+ m_HasFrom = false;
+ m_HasTo = false;
+ m_Ds = -1;
+ m_codeLine = -1;
+ m_fitType = "none";
+ m_HistDS = -1;
+ m_nrBins = -1;
+ m_FitDS = -1;
+ m_limitDataX = false;
+ m_limitDataY = false;
+ m_limitData = false;
+}
+
+GLELet::~GLELet() {
+}
+
+void GLELet::createVarBackup(GLEVars* vars, StringIntHash* varHash) {
+ vector<int> ids;
+ for (StringIntHash::iterator i(varHash->begin()); i != varHash->end(); ++i) {
+ ids.push_back(i->second);
+ }
+ m_varBackup.backup(vars, ids);
+}
+
+void GLELet::restoreVarBackup(GLEVars* vars) {
+ m_varBackup.restore(vars);
+}
+
+void GLELet::setStep(double value) {
+ m_LetStep = value;
+ setHasSteps(true);
+}
+
+void GLELet::initVars() {
+ int vartype = 1;
+ var_findadd("X", &m_VarX, &vartype);
+}
+
+void GLELet::initStep() {
+ if (hasSteps()) return;
+ int nstep = m_LetNSteps;
+ if (nstep == 0) nstep = DEFAULT_STEPS;
+ if (xx[1].log) {
+ setStep(nstep);
+ } else {
+ setStep((getTo() - getFrom())/(nstep-1));
+ }
+}
+
+GLEFunctionParserPcode* GLELet::insertFunction() {
+ GLERC<GLEFunctionParserPcode> fct = new GLEFunctionParserPcode();
+ m_Fcts.insert(m_Fcts.begin(), fct);
+ return fct.get();
+}
+
+GLEFunctionParserPcode* GLELet::addFunction() {
+ GLEFunctionParserPcode* fct = new GLEFunctionParserPcode();
+ m_Fcts.add(fct);
+ return fct;
+}
+
+GLEFunctionParserPcode* GLELet::addWhere() {
+ m_Where = new GLEFunctionParserPcode();
+ return m_Where.get();
+}
+
+bool GLELet::checkIdenticalRanges(GLEVectorAutoDelete<GLELetDataSet>& datasets) {
+ if (datasets.size() == 0) return false;
+ if (datasets.size() == 1) return true;
+ GLELetDataSet* ds0 = datasets[0];
+ unsigned int nbX = dp[ds0->getDatasetID()]->np;
+ for (unsigned int i = 1; i < datasets.size(); i++) {
+ if (dp[datasets[i]->getDatasetID()]->np != nbX) return false;
+ }
+ GLEArrayImpl* rangeX0 = dp[ds0->getDatasetID()]->getDimData(0);
+ if (rangeX0 == 0) {
+ return false;
+ }
+ for (unsigned int i = 1; i < datasets.size(); i++) {
+ GLEArrayImpl* rangeXi = dp[datasets[i]->getDatasetID()]->getDimData(0);
+ if (rangeXi == 0 || rangeX0->size() != rangeXi->size()) {
+ return false;
+ }
+ for (unsigned int j = 0; j < rangeX0->size(); j++) {
+ if (!gle_memory_cell_equals(rangeX0->get(j), rangeXi->get(j))) {
+ return false;
+ }
+ }
+ }
+ return true;
+}
+
+void GLELet::transformIdenticalRangeDatasets(GLEVectorAutoDelete<GLELetDataSet>& datasets, DataFill* fill) {
+ // transform single dataset - advantage: dataset does not need to represent a function and is not sorted
+ GLELetDataSet* ds0 = datasets[0];
+ GLEDataSet* ds0Data = dp[ds0->getDatasetID()];
+ unsigned int nbX = ds0Data->np;
+ GLEDataPairs ds0Pairs;
+ ds0Pairs.copyDimension(ds0Data, 0);
+ for (unsigned int j = 0; j < nbX; j++) {
+ if (m_HasFrom && ds0Pairs.getX(j) < m_LetFrom) {
+ continue;
+ }
+ if (m_HasTo && ds0Pairs.getX(j) > m_LetTo) {
+ continue;
+ }
+ bool miss = false;
+ if (ds0Pairs.getM(j)) {
+ miss = true;
+ } else {
+ for (unsigned int i = 0; i < datasets.size(); i++) {
+ GLELetDataSet* dsi = datasets[i];
+ GLEArrayImpl* dsiArray = dp[dsi->getDatasetID()]->getDimData(1);
+ if (dsiArray != 0 && dsiArray->size() == nbX) {
+ if (dsiArray->isUnknown(j)) {
+ miss = true;
+ } else if (dsi->getVar() != -1) {
+ /* dsi->getVar() can be -1 if dataset is only used in "range" expression */
+ var_set(dsi->getVar(), dsiArray->get(j));
+ }
+ }
+ }
+ }
+ if (!miss) {
+ // this method sets the x value and computes the values for all dimensions
+ fill->selectXValueNoIPol(ds0Pairs.getX(j));
+ if (!m_Where.isNull()) {
+ if (m_Where->evalBool()) {
+ fill->addPoint();
+ } else {
+ fill->addMissing();
+ }
+ } else {
+ fill->addPoint();
+ }
+ } else {
+ fill->addMissing();
+ }
+ }
+}
+
+void GLELet::combineFunctions(GLEVectorAutoDelete<GLELetDataSet>& datasets, DataFill* fill, double logstep) {
+ /* initialize x-range */
+ set<double> xvalues;
+ for (unsigned int i = 0; i < datasets.size(); i++) {
+ if (datasets[i]->isXRangeDS()) {
+ for (int j = 0; j < datasets[i]->getNbValues(); j++) {
+ double xv = datasets[i]->getXValue(j);
+ if ((!m_HasFrom || xv >= m_LetFrom) && (!m_HasTo || xv <= m_LetTo)) {
+ xvalues.insert(xv);
+ }
+ }
+ for (int j = 0; j < datasets[i]->getNbMissing(); j++) {
+ fill->setMissingValue(datasets[i]->getMissing(j));
+ }
+ }
+ }
+ /* get x-values from step option to let command */
+ if (datasets.size() == 0 || m_HasStepOption) {
+ for (double xv = m_LetFrom; xv < m_LetTo; ) {
+ xvalues.insert(xv);
+ if (xx[1].log) {
+ xv *= logstep;
+ } else {
+ xv += m_LetStep;
+ }
+ }
+ /* make sure "to" value is in there */
+ xvalues.insert(m_LetTo);
+ }
+ /* iterate over x-values and compute target values */
+ fill->setDataSets(&datasets);
+ fill->setWhere(m_Where.get());
+ bool shouldIPol = fill->isFineTune() && fill->isRangeValid();
+ for (set<double>::iterator i = xvalues.begin(); i != xvalues.end(); i++) {
+ if (shouldIPol) {
+ fill->addPointIPol(*i);
+ } else {
+ fill->addPoint(*i);
+ }
+ }
+}
+
+void GLELet::complainAboutNoFunctions(GLEVectorAutoDelete<GLELetDataSet>& datasets) throw(ParserError) {
+ for (unsigned int i = 0; i < datasets.size(); i++) {
+ if (!datasets[i]->isFunction()) {
+ datasets[i]->complainNoFunction();
+ }
+ }
+}
+
+void GLELet::doLet() throw(ParserError) {
+ if (m_LetTo <= m_LetFrom) {
+ stringstream ss;
+ ss << "illegal range for let expression: ";
+ GLERange letRange;
+ letRange.setMinMax(m_LetFrom, m_LetTo);
+ letRange.printRange(ss);
+ g_throw_parser_error(ss.str());
+ }
+ int dset_id = getDataSet();
+ if (ndata < dset_id) ndata = dset_id;
+ if (dp[dset_id] == NULL) {
+ dp[dset_id] = new GLEDataSet(dset_id);
+ copy_default(dset_id);
+ }
+ /* copy default dataset settings */
+ DataFill fill(m_FineTune);
+ if (g_discontinuityThreshold < 100.0) {
+ fill.setDetectDiscontinuity(true, g_discontinuityThreshold / 100.0);
+ }
+ fill.setVarX(m_VarX);
+ for (int dim = GLE_DIM_X; dim <= GLE_DIM_Y; dim++) {
+ DataFillDimension* dim_f = new DataFillDimension(m_Fcts[dim].get());
+ fill.addDataDimension(dim_f);
+ bool log = xx[dp[dset_id]->getDim(dim)->getAxis()].log;
+ dim_f->setRange(dp[dset_id]->getDim(dim)->getRange(), log);
+ }
+ /* Find data sets used as d[i] */
+ GLEVars* vars = getVarsInstance();
+ vars->setNameMode(nameMode::DETECT);
+ fill.selectXValueNoIPol(0.0);
+ if (!m_Where.isNull()) {
+ m_Where->evalBool();
+ }
+ vars->setNameMode(nameMode::RETRIEVE);
+ /* Find data set variables */
+ int ndn = 0;
+ int dn_idx[11], dn_var[11];
+ if (!m_SubMap.isNull()) {
+ var_find_dn(m_SubMap.get(), dn_idx, dn_var, &ndn);
+ }
+ double logstep = 1.0;
+ if (ndn == 0 && xx[1].log) {
+ if (m_LetStep < 2) {
+ stringstream ss;
+ ss << "with a LOG xaxis scale STEP is taken as the number of steps n," << endl;
+ ss << "which should be at least 2, but found: " << m_LetStep;
+ g_throw_parser_error(ss.str());
+ }
+ logstep = pow(m_LetTo/m_LetFrom, 1.0/(m_LetStep-1));
+ }
+ /* was "range" option given? */
+ set<int>& rangeDS = getXRangeDS();
+ bool allRangeDS = rangeDS.empty();
+ /* initialize input datasets */
+ bool allFunctions = true;
+ GLEVectorAutoDelete<GLELetDataSet> datasets;
+ for (int i = 0; i < ndn; i++) {
+ GLELetDataSet* ds = new GLELetDataSet();
+ datasets.push_back(ds);
+ if (dp[dn_var[i]] == NULL) {
+ ostringstream errs;
+ errs << "dataset not defined: d" << (dn_var[i]);
+ g_throw_parser_error(errs.str());
+ }
+ ds->initializeFrom(dn_var[i], dn_idx[i]);
+ if (!ds->isFunction()) allFunctions = false;
+ /* should the x-range include the x-range of this dataset? */
+ if (allRangeDS) {
+ ds->setIsXRangeDS(true);
+ } else {
+ set<int>::iterator iter = rangeDS.find(ds->getDatasetID());
+ if (iter != rangeDS.end()) {
+ ds->setIsXRangeDS(true);
+ rangeDS.erase(iter);
+ }
+ }
+ }
+ /* add datasets that supply x-range values */
+ for (set<int>::iterator iter = rangeDS.begin(); iter != rangeDS.end(); iter++) {
+ GLELetDataSet* ds = new GLELetDataSet();
+ datasets.push_back(ds);
+ if (dp[*iter] == NULL) {
+ ostringstream errs;
+ errs << "dataset not defined: d" << (*iter);
+ g_throw_parser_error(errs.str());
+ }
+ ds->initializeFrom(*iter, -1);
+ if (!ds->isFunction()) allFunctions = false;
+ ds->setIsXRangeDS(true);
+ }
+ /* ok, ready to generate points */
+ if (checkIdenticalRanges(datasets) && !m_HasStepOption) {
+ // transform datasets with identical x-ranges and no "step" option given
+ // in this case, the datasets do not need to be a function!
+ transformIdenticalRangeDatasets(datasets, &fill);
+ } else {
+ if (!allFunctions) {
+ // code below assumes all given datasets represent functions
+ complainAboutNoFunctions(datasets);
+ }
+ combineFunctions(datasets, &fill, logstep);
+ }
+ if (!m_NoFirst) {
+ dp[dset_id]->backup();
+ } else {
+ dp[dset_id]->clearAll();
+ }
+ /* done, transfer to target dataset */
+ fill.toDataset(dp[dset_id]);
+ vars->setNameMode(nameMode::NAME);
+}
+
+void GLELet::parseFitFunction(const string& fct, GLEParser* parser) throw(ParserError) {
+ Tokenizer* tokens = parser->getTokens();
+ string& token = tokens->next_token();
+ m_FitDS = get_dataset_identifier(token, parser, true);
+ m_fitType = fct;
+ m_limitDataX = false;
+ m_limitDataY = false;
+ m_limitData = false;
+ while (true) {
+ string& token = tokens->try_next_token();
+ if (str_i_equals(token, "WITH")) {
+ m_fitFct = tokens->next_multilevel_token();
+ } else if (str_i_equals(token, "EQSTR")) {
+ parser->evalTokenToString(&m_eqStr);
+ } else if (str_i_equals(token, "FORMAT")) {
+ parser->evalTokenToString(&m_format);
+ } else if (str_i_equals(token, "RSQ")) {
+ m_rsq = tokens->next_token();
+ } else if (str_i_equals(token, "FROM")) {
+ setHasFrom(true);
+ setFrom(parser->evalTokenToDouble());
+ } else if (str_i_equals(token,"TO")) {
+ setHasTo(true);
+ setTo(parser->evalTokenToDouble());
+ } else if (str_i_equals(token, "STEP")) {
+ setHasStepOption(true);
+ setStep(parser->evalTokenToDouble());
+ } else if (str_i_equals(token, "LIMIT_DATA_X")) {
+ // user wants the data ploted from dd xmax to dd xmin
+ m_limitDataX = true;
+ } else if (str_i_equals(token, "LIMIT_DATA_Y")) {
+ // get x values from evaluation of slope
+ m_limitDataY = true;
+ } else if (str_i_equals(token, "LIMIT_DATA")) {
+ m_limitData = true;
+ } else if (str_i_equals(token, "XMIN")) {
+ double xm = parser->evalTokenToDouble();
+ m_window.setXMin(xm);
+ setFrom(xm);
+ } else if (str_i_equals(token, "XMAX")) {
+ double xm = parser->evalTokenToDouble();
+ m_window.setXMax(xm);
+ setTo(xm);
+ } else if (str_i_equals(token, "YMIN")) {
+ m_window.setYMin(parser->evalTokenToDouble());
+ } else if (str_i_equals(token, "YMAX")) {
+ m_window.setYMax(parser->evalTokenToDouble());
+ } else {
+ if (token != "") tokens->pushback_token();
+ break;
+ }
+ }
+ // user can supply three variables to get the fit: SLOPE OFFSET R_SQUARED
+ if (tokens->has_more_tokens()) {
+ m_varSlope = tokens->next_token();
+ ensure_valid_var_name(tokens, m_varSlope);
+ }
+ if (tokens->has_more_tokens()) {
+ m_varIntercept = tokens->next_token();
+ ensure_valid_var_name(tokens, m_varIntercept);
+ }
+ if (tokens->has_more_tokens()) {
+ m_varR = tokens->next_token();
+ ensure_valid_var_name(tokens, m_varR);
+ }
+ if (tokens->has_more_tokens()) {
+ throw tokens->error("extra tokens at end of let command");
+ }
+}
+
+void GLELet::doFitFunction() throw(ParserError) {
+ bool linfit = false, logefit = false, log10fit = false, powxfit = false, genfit = false;
+ // doing fitting routines
+ if (str_i_equals(m_fitType, "LINFIT")) linfit = true;
+ if (str_i_equals(m_fitType, "LOGEFIT")) logefit = true;
+ if (str_i_equals(m_fitType, "LOG10FIT")) log10fit = true;
+ if (str_i_equals(m_fitType, "POWXFIT")) powxfit = true;
+ if (str_i_equals(m_fitType, "FIT")) genfit = true;
+ // copy to vectors but ignore miss
+ vector<double> x, y;
+ double xmax = -GLE_INF;
+ double ymax = -GLE_INF;
+ double xmin = +GLE_INF;
+ double ymin = +GLE_INF;
+ GLEDataPairs fitPairs(getDataset(m_FitDS));
+ for (unsigned int i = 0; i < fitPairs.size(); i++) {
+ if (!fitPairs.getM(i)) {
+ if (m_window.valid(fitPairs.getX(i), fitPairs.getY(i))) {
+ xmax = max(xmax, fitPairs.getX(i));
+ xmin = min(xmin, fitPairs.getX(i));
+ ymax = max(ymax, fitPairs.getY(i));
+ ymin = min(ymin, fitPairs.getY(i));
+ x.push_back(fitPairs.getX(i));
+ y.push_back(fitPairs.getY(i));
+ }
+ }
+ }
+ if (m_limitDataX) {
+ setFrom(xmin);
+ setTo(xmax);
+ }
+ int fitds = getDataSet();
+ double slope = 0, offset = 0, rsquared = 0;
+ char* new_let = new char[1000];
+ if (linfit) {
+ least_square(&x, &y, &slope, &offset, &rsquared);
+ if (m_limitDataY || m_limitData) {
+ // find x values from ymax and min
+ // y=slope*x+offset
+ // x=(y-offset)/slope
+ double temp_xmax = max((ymax-offset)/slope, (ymin-offset)/slope);
+ double temp_xmin = min((ymax-offset)/slope, (ymin-offset)/slope);
+ if (m_limitDataY) {
+ setTo(temp_xmax);
+ setFrom(temp_xmin);
+ } else if (m_limitData) {
+ setTo(max(temp_xmax, xmax));
+ setFrom(min(temp_xmin, xmin));
+ }
+ }
+ sprintf(new_let, "let d%d = %0.10e*x+%0.10e FROM %0.10e TO %0.10e", fitds, slope, offset, getFrom(), getTo());
+ } else if (logefit) {
+ //take loge of y values
+ for (vector<double>::iterator vdi = y.begin(); vdi != y.end(); ++vdi) {
+ (*vdi) = log(*vdi);
+ }
+ least_square(&x, &y, &slope, &offset, &rsquared);
+ if (m_limitDataY || m_limitData) {
+ // find x values from ymax and min
+ // y=exp(offset)*exp(slope*x)
+ // x=(log(y)-offset)/slope
+ double temp_xmax = max((log(ymax)-offset)/slope, (log(ymin)-offset)/slope);
+ double temp_xmin = min((log(ymax)-offset)/slope, (log(ymin)-offset)/slope);
+ if (m_limitDataY) {
+ setTo(temp_xmax);
+ setFrom(temp_xmin);
+ } else if (m_limitData) {
+ setTo(max(temp_xmax, xmax));
+ setFrom(min(temp_xmin, xmin));
+ }
+ }
+ offset = exp(offset);
+ sprintf(new_let, "let d%d = %0.10e*exp(%0.10e*x) FROM %0.10e TO %0.10e", fitds, offset, slope, getFrom(), getTo());
+ } else if (log10fit) {
+ //take log10 of y values
+ for (vector<double>::iterator vdi = y.begin(); vdi != y.end(); ++vdi) {
+ (*vdi) = log10(*vdi);
+ }
+ least_square(&x,&y,&slope,&offset,&rsquared);
+ if (m_limitDataY || m_limitData) {
+ // find x values from ymax and min
+ // y=exp(offset)*exp(slope*x)
+ // x=(log10(y)-offset)/slope
+ double temp_xmax = max((log10(ymax)-offset)/slope, (log10(ymin)-offset)/slope);
+ double temp_xmin = min((log10(ymax)-offset)/slope, (log10(ymin)-offset)/slope);
+ if (m_limitDataY) {
+ setTo(temp_xmax);
+ setFrom(temp_xmin);
+ } else if (m_limitData) {
+ setTo(max(temp_xmax, xmax));
+ setFrom(min(temp_xmin, xmin));
+ }
+ }
+ offset = pow(10.0,offset);
+ sprintf(new_let, "let d%d = %0.10e*10^(%0.10e*x) FROM %0.10e TO %0.10e", fitds, offset, slope, getFrom(), getTo());
+ } else if (powxfit) {
+ //take loge of both axis
+ for (vector<double>::iterator vdi = y.begin(); vdi != y.end(); ++vdi) {
+ (*vdi) = log(*vdi);
+ }
+ for (vector<double>::iterator vdi = x.begin(); vdi != x.end(); ++vdi) {
+ (*vdi) = log(*vdi);
+ }
+ least_square(&x, &y, &slope, &offset, &rsquared);
+ if (m_limitDataY || m_limitData) {
+ // find x values from ymax and min
+ // y=exp(offset)*x^(slope)
+ // x = ( y / exp(offset) ) ^ (1/slope)
+ double temp_xmax = max(pow(ymax/exp(offset),1.0/slope), pow(ymin/exp(offset),1.0/slope) );
+ double temp_xmin = min(pow(ymax/exp(offset),1.0/slope), pow(ymin/exp(offset),1.0/slope) );
+ if (m_limitDataY) {
+ setTo(temp_xmax);
+ setFrom(temp_xmin);
+ } else if (m_limitData) {
+ setTo(max(temp_xmax, xmax));
+ setFrom(min(temp_xmin, xmin));
+ }
+ }
+ offset = exp(offset);
+ sprintf(new_let, "let d%d = %0.10e*x^(%0.10e) FROM %0.10e TO %0.10e", fitds, offset, slope, getFrom(), getTo());
+ } else if (genfit) {
+ GLEFitLS fitls;
+ fitls.polish(m_fitFct);
+ fitls.setXY(&x,&y);
+ fitls.fit();
+ fitls.testFit();
+ initVars();
+ initStep();
+ addFunction()->polishX();
+ addFunction(fitls.getFunction());
+ doLet();
+ if (m_eqStr != "") {
+ string eqstr_v;
+ str_to_uppercase(m_eqStr);
+ fitls.toFunctionStr(m_format, &eqstr_v);
+ var_findadd_set(m_eqStr.c_str(), eqstr_v);
+ }
+ if (m_rsq != "") {
+ str_to_uppercase(m_rsq);
+ var_findadd_set((char*)m_rsq.c_str(), fitls.getRSquare());
+ }
+ delete []new_let;
+ return;
+ }
+ // add the variables -- they will be globals?
+ if (m_varSlope != "") {
+ str_to_uppercase(m_varSlope);
+ var_findadd_set((char*)m_varSlope.c_str(), slope);
+ }
+ if (m_varIntercept != "") {
+ str_to_uppercase(m_varIntercept);
+ var_findadd_set((char*)m_varIntercept.c_str(), offset);
+ }
+ if (m_varR != "") {
+ str_to_uppercase(m_varR);
+ var_findadd_set((char*)m_varR.c_str(), rsquared);
+ }
+ string letFct(new_let);
+ delete []new_let;
+ GLELet* let = parseLet(letFct, getCodeLine());
+ ::doLet(let, m_FineTune);
+ delete let;
+}
+
+void GLELet::parseHistogram(GLEParser* parser) throw(ParserError) {
+ Tokenizer* tokens = parser->getTokens();
+ string& token = tokens->next_token();
+ m_nrBins = -1;
+ m_HistDS = get_dataset_identifier(token, parser, true);
+ while (tokens->has_more_tokens()) {
+ string& token = tokens->next_token();
+ if (str_i_equals(token, "FROM")) {
+ setHasFrom(true);
+ setFrom(parser->evalTokenToDouble());
+ } else if (str_i_equals(token,"TO")) {
+ setHasTo(true);
+ setTo(parser->evalTokenToDouble());
+ } else if (str_i_equals(token, "STEP")) {
+ setHasStepOption(true);
+ setStep(parser->evalTokenToDouble());
+ } else if (str_i_equals(token, "BINS")) {
+ m_nrBins = (int)floor(parser->evalTokenToDouble()+0.5);
+ } else {
+ stringstream errstr;
+ errstr << "unknown token in 'let' expression: '" << token << "'";
+ throw tokens->error(errstr.str());
+ }
+ }
+}
+
+void GLELet::doHistogram() throw(ParserError) {
+ int bins = m_nrBins;
+ GLEDataPairs histData(getDataset(m_HistDS));
+ if (!hasFrom() || !hasTo()) {
+ // Take from axis range if explicitly given
+ GLEAxis* ax = &xx[GLE_AXIS_X];
+ if (!hasFrom() && ax->getRange()->hasMin()) {
+ setHasFrom(true);
+ setFrom(ax->getMin());
+ }
+ if (!hasTo() && ax->getRange()->hasMax()) {
+ setHasTo(true);
+ setTo(ax->getMax());
+ }
+ // Take from data range
+ GLERange range;
+ for (unsigned int i = 0; i < histData.size(); i++) {
+ range.updateRange(histData.getY(i), histData.getM(i));
+ }
+ roundrange(&range, false, false, 0.0);
+ if (range.validNotEmpty()) {
+ if (!hasFrom()) {
+ setHasFrom(true);
+ setFrom(range.getMin());
+ }
+ if (!hasTo()) {
+ setHasTo(true);
+ setTo(range.getMax());
+ }
+ }
+ }
+ if (bins == -1 && !hasSteps()) {
+ bins = 10;
+ }
+ vector<double> from;
+ vector<double> counts;
+ if (bins != -1) {
+ for (int i = 0; i < bins; i++) {
+ from.push_back(getFrom() + (getTo()-getFrom())*i/bins);
+ counts.push_back(0.0);
+ }
+ from.push_back(getTo());
+ } else {
+ int i = 0;
+ double value = getFrom();
+ while (value < getTo()) {
+ from.push_back(value);
+ counts.push_back(0.0);
+ i++;
+ // avoids rounding errors
+ value = getFrom()+i*getStep();
+ }
+ from.push_back(value);
+ }
+ for (unsigned int i = 0; i < dp[m_HistDS]->np; i++) {
+ if (!histData.getM(i)) {
+ int found = -1;
+ double yv = histData.getY(i);
+ for (vector<double>::size_type j = 0; j < counts.size(); j++) {
+ if (yv >= from[j] && yv < from[j+1]) {
+ found = j;
+ break;
+ }
+ }
+ if (found != -1) counts[found]++;
+ else if (yv == getTo()) counts[counts.size()-1]++;
+ }
+ }
+ DataFill fill(false);
+ for (int dim = GLE_DIM_X; dim <= GLE_DIM_Y; dim++) {
+ DataFillDimension* dim_f = new DataFillDimension(NULL);
+ fill.addDataDimension(dim_f);
+ }
+ for (vector<double>::size_type i = 0; i < from.size()-1; i++) {
+ fill.addPoint((from[i]+from[i+1])/2.0, counts[i]);
+ }
+ int resds = getDataSet();
+ dp[resds]->clearAll();
+ fill.toDataset(dp[resds]);
+}
+
+void deleteLet(GLELet* let) {
+ delete let;
+}
+
+/* LET d2 = exp(x) [ FROM exp TO exp [ STEP exp ] ] */
+/* LET d3 = exp(dn,d...) */
+// added by V.L.
+// LET d3 = LINFIT(dn) [FROM exp TO exp] or [DATA] [SLOPE] [OFFSET] [R_SQUARED]
+// [SLOPE] [OFFSET] [R_SQUARED] are user defined variables
+// no option after linfit results in line being drawn over the whole graph
+// DATA results in the line being drawn from the minimum to the maximum of the data series
+
+GLELet* parseLet(GLEParser* parser, int codeLine) throw(ParserError) {
+ GLELet* let = new GLELet();
+ let->setCodeLine(codeLine);
+ Tokenizer* tokens = parser->getTokens();
+ tokens->ensure_next_token_i("LET");
+
+ // read the target data set identifier
+ string& token = tokens->next_token();
+ let->setDataSet(get_dataset_identifier(token, parser, false));
+ ensureDataSetCreated(let->getDataSet());
+
+ // next token should be an equal sign
+ tokens->ensure_next_token("=");
+
+ string let_fct = tokens->next_multilevel_token();
+ if (str_i_equals(let_fct,"LINFIT") ||
+ str_i_equals(let_fct,"LOGEFIT") ||
+ str_i_equals(let_fct,"LOG10FIT") ||
+ str_i_equals(let_fct,"POWXFIT") ||
+ str_i_equals(let_fct,"FIT")) {
+ let->parseFitFunction(let_fct, parser);
+ return let;
+ }
+
+ if (str_i_equals(let_fct,"HIST")) {
+ let->parseHistogram(parser);
+ return let;
+ }
+
+ GLEVars* vars = getVarsInstance();
+ let->setVarSubMap(vars->addLocalSubMap());
+ let->initVars();
+
+ // read in multi-dimensional let
+ StringIntHash varHash;
+ GLEFunctionParserPcode* dim_1 = let->addFunction();
+ dim_1->polishPos(let_fct.c_str(), tokens->token_pos_col(), &varHash);
+ while (tokens->is_next_token(",")) {
+ const string& let_fct_n = tokens->next_multilevel_token();
+ GLEFunctionParserPcode* dim_n = let->addFunction();
+ dim_n->polishPos(let_fct_n.c_str(), tokens->token_pos_col(), &varHash);
+ }
+ // if one dimensional, then first dimension is just "x"
+ if (let->getDimension() == 1) {
+ GLEFunctionParserPcode* dim_0 = let->insertFunction();
+ dim_0->polishX();
+ }
+ // check for too high dimension
+ if (let->getDimension() > 2) {
+ ostringstream errstr;
+ errstr << "let dimension > 2 not supported (found dimension " << let->getDimension() << ")";
+ throw tokens->error(errstr.str());
+ }
+ let->createVarBackup(vars, &varHash);
+
+ // iterate over all tokens
+ while (tokens->has_more_tokens()) {
+ token = tokens->next_token();
+ if (str_i_equals(token,"FROM")) {
+ let->setHasFrom(true);
+ let->setFrom(parser->evalTokenToDouble());
+ } else if (str_i_equals(token,"TO")) {
+ let->setHasTo(true);
+ let->setTo(parser->evalTokenToDouble());
+ } else if (str_i_equals(token,"STEP")) {
+ let->setHasStepOption(true);
+ let->setStep(parser->evalTokenToDouble());
+ } else if (str_i_equals(token,"NSTEPS")) {
+ let->setNSteps((int)floor(parser->evalTokenToDouble()+0.5));
+ } else if (str_i_equals(token,"NOTUNE")) {
+ let->setFineTune(false);
+ } else if (str_i_equals(token,"WHERE")) {
+ const string& where_s = tokens->next_multilevel_token();
+ GLEFunctionParserPcode* where = let->addWhere();
+ where->polishPos(where_s.c_str(), tokens->token_pos_col());
+ } else if (str_i_equals(token,"RANGE")) {
+ token = tokens->next_token();
+ let->addXRangeDS(get_dataset_identifier(token.c_str()));
+ while (tokens->is_next_token(",")) {
+ token = tokens->next_token();
+ let->addXRangeDS(get_dataset_identifier(token.c_str()));
+ }
+ } else {
+ ostringstream errstr;
+ errstr << "unknown token in 'let' expression: '" << token << "'";
+ throw tokens->error(errstr.str());
+ }
+ }
+
+ vars->removeLocalSubMap();
+ return let;
+}
+
+GLELet* parseLet(GLESourceLine& sline) throw(ParserError) {
+ GLEParser* parser = get_global_parser();
+ parser->setString(sline.getCodeCStr());
+ return parseLet(parser, sline.getGlobalLineNo());
+}
+
+GLELet* parseLet(const string& letFct, int codeLine) throw(ParserError) {
+ GLEParser* parser = get_global_parser();
+ parser->setString(letFct.c_str());
+ return parseLet(parser, codeLine);
+}
+
+void doLet(GLELet* let, bool nofirst) throw(ParserError) {
+ g_set_error_line(let->getCodeLine());
+ let->setNoFirst(nofirst);
+ let->setFineTune(nofirst);
+ GLEAxis* ax = &xx[GLE_AXIS_X];
+ if (!let->hasFrom()) {
+ let->setFrom(ax->getMin());
+ }
+ if (!let->hasTo()) {
+ let->setTo(ax->getMax());
+ }
+ if (let->isHistogram()) {
+ let->doHistogram();
+ } else if (let->isFit()) {
+ let->doFitFunction();
+ } else {
+ GLEVars* vars = getVarsInstance();
+ vars->addLocalSubMap(let->getVarSubMap());
+ let->restoreVarBackup(vars);
+ let->initStep();
+ let->doLet();
+ vars->removeLocalSubMap();
+ }
+}
+
+void next_lstyle(char* s,int* ct) {
+ char next[200];
+ double temp;
+ int is_alpha;
+ int i,len;
+
+ is_alpha=false;
+ (*ct)++;
+ doskip(tk[*ct],ct);
+ strcpy(next,tk[*ct]);
+ len = strlen(next);
+
+ for(i=0 ; i < len ; i++) {
+ is_alpha=isalpha((int)next[i]);
+ if (is_alpha) i = len;
+ }
+ if (is_alpha) {
+ /* this is a variable so evaluate it */
+ polish_eval(next,&temp);
+ sprintf(s,"%g",temp);
+ } else {
+ /* it is a number so just copy over*/
+ if (len < 9) {
+ strcpy(s,next);
+ } else {
+ gprint("ERROR line style string too long %s\n",next);
+ }
+ }
+}
+
+void next_svg_iter(int* s, int* ct) {
+ char next[200];
+ double temp;
+ int is_alpha;
+ int i,len,idx,type;
+ is_alpha=false;
+ (*ct)++;
+ doskip(tk[*ct],ct);
+ strcpy(next,tk[*ct]);
+ len = strlen(next);
+ printf("len=%d next=%s\n",len,next);
+ // check to see if number or alphanumeric
+ if ( len > 0 ) {
+ for(i=0 ; i < len ; i++) {
+ is_alpha=isalpha((int)next[i]);
+ if (is_alpha) i = len;
+ }
+ if (is_alpha) {
+ // it is alphanumeric so see if it is a variable
+ // if not set it to zero
+ var_find(next,&idx,&type);
+ if (idx != -1 ) {
+ /* this is a variable so evaluate it */
+ polish_eval(next,&temp);
+ *s = (int) temp;
+ } else {
+ // its not a variable must be another keyword
+ // set iter to 1
+ (*ct)--;
+ *s = 1;
+ }
+ //sprintf(s,"%g\0",temp);
+ } else {
+ /* it is a number so just copy over*/
+ *s = atoi(next);
+ }
+ } else {
+ //len == 0 so there isnothing there set to 1
+ *s = 1;
+ (*ct)--;
+ }
+}
+
+#define next_dn (ct+=1,skipspace,atoi(tk[ct]+1))
+
+void fixup_err(string& err) {
+ if (err.size() >= 1 && toupper(err[0]) == 'D') {
+ // If d[i] is used, then this should be converted now
+ int dataset = get_dataset_identifier(err.c_str(), false);
+ std::ostringstream fixupName;
+ fixupName << "d" << dataset;
+ err = fixupName.str();
+ }
+}
+
+void do_dataset(int d, GLEGraphBlockInstance* graphBlock) throw(ParserError) {
+ int ct = 2;
+ while (ct <= ntk) {
+ kw("LINE") {
+ dp[d]->line = true;
+ dp[d]->layer_line = graphBlock->getLayerWithDefault(GLE_GRAPH_LAYER_LINE);
+ } else kw("LSTYLE") {
+ next_lstyle(dp[d]->lstyle,&ct);
+ dp[d]->layer_line = graphBlock->getLayerWithDefault(GLE_GRAPH_LAYER_LINE);
+ } else kw("LWIDTH") {
+ dp[d]->lwidth = next_exp;
+ } else kw("MARKER") {
+ dp[d]->marker = next_marker;
+ dp[d]->layer_marker = graphBlock->getLayerWithDefault(GLE_GRAPH_LAYER_MARKER);
+ } else kw("MDATA") {
+ dp[d]->mdata = next_dn;
+ } else kw("COLOR") {
+ dp[d]->color = next_color;
+ } else kw("KEYFILL") {
+ dp[d]->key_fill = next_color;
+ } else kw("MSIZE") {
+ dp[d]->msize = next_exp;
+ } else kw("MDIST") {
+ dp[d]->mdist = next_exp;
+ } else kw("MSCALE") {
+ dp[d]->mscale = next_exp;
+ } else kw("KEY") {
+ next_vquote_cpp(dp[d]->key_name);
+ } else kw("AUTOSCALE") {
+ dp[d]->autoscale = true;
+ } else kw("AUTO") {
+ dp[d]->autoscale = true;
+ } else kw("NOMISS") {
+ dp[d]->nomiss = true;
+ } else kw("NOMISSING") {
+ dp[d]->nomiss = true;
+ } else kw("FILE") {
+ next_vquote(dp[d]->bigfile);
+ } else kw("BIGFILE") {
+ next_vquote(dp[d]->bigfile);
+ } else kw("STEPS") {
+ dp[d]->line_mode = GLE_GRAPH_LM_STEPS;
+ dp[d]->layer_line = graphBlock->getLayerWithDefault(GLE_GRAPH_LAYER_LINE);
+ } else kw("FSTEPS") {
+ dp[d]->line_mode = GLE_GRAPH_LM_FSTEPS;
+ dp[d]->layer_line = graphBlock->getLayerWithDefault(GLE_GRAPH_LAYER_LINE);
+ } else kw("HIST") {
+ dp[d]->line_mode = GLE_GRAPH_LM_HIST;
+ dp[d]->layer_line = graphBlock->getLayerWithDefault(GLE_GRAPH_LAYER_LINE);
+ } else kw("BAR") {
+ dp[d]->line_mode = GLE_GRAPH_LM_BAR;
+ dp[d]->layer_line = graphBlock->getLayerWithDefault(GLE_GRAPH_LAYER_LINE);
+ } else kw("IMPULSES") {
+ dp[d]->line_mode = GLE_GRAPH_LM_IMPULSES;
+ dp[d]->layer_line = graphBlock->getLayerWithDefault(GLE_GRAPH_LAYER_LINE);
+ } else kw("XAXIS") {
+ dp[d]->getDim(GLE_DIM_X)->setAxis(GLE_AXIS_X);
+ } else kw("YAXIS") {
+ dp[d]->getDim(GLE_DIM_Y)->setAxis(GLE_AXIS_Y);
+ } else kw("X2AXIS") {
+ dp[d]->getDim(GLE_DIM_X)->setAxis(GLE_AXIS_X2);
+ } else kw("Y2AXIS") {
+ dp[d]->getDim(GLE_DIM_Y)->setAxis(GLE_AXIS_Y2);
+ } else kw("X0AXIS") {
+ dp[d]->getDim(GLE_DIM_X)->setAxis(GLE_AXIS_X0);
+ } else kw("Y0AXIS") {
+ dp[d]->getDim(GLE_DIM_Y)->setAxis(GLE_AXIS_Y0);
+ } else kw("SMOOTH") {
+ dp[d]->line = true;
+ dp[d]->layer_line = graphBlock->getLayerWithDefault(GLE_GRAPH_LAYER_LINE);
+ dp[d]->smoothm = false;
+ dp[d]->smooth = true;
+ } else kw("SMOOTHM") {
+ dp[d]->line = true;
+ dp[d]->layer_line = graphBlock->getLayerWithDefault(GLE_GRAPH_LAYER_LINE);
+ dp[d]->smoothm = true;
+ dp[d]->smooth = true;
+ } else kw("SVG_SMOOTH") {
+ dp[d]->line = true;
+ dp[d]->layer_line = graphBlock->getLayerWithDefault(GLE_GRAPH_LAYER_LINE);
+ dp[d]->svg_iter = (int) next_exp;
+ if (dp[d]->svg_iter == 0) dp[d]->svg_iter = 1; // if they say svg_smooth they want it at least once
+ dp[d]->svg_smooth = true;
+ dp[d]->smoothm = false;
+ dp[d]->smooth = false;
+ } else kw("DERESOLVE") {
+ dp[d]->deresolve = (int) next_exp;
+ dp[d]->deresolve_avg = false;
+ if (str_i_equals(tk[ct+1], "AVERAGE")) {
+ dp[d]->deresolve_avg = true;
+ ct++;
+ }
+ } else kw("XMIN") {
+ dp[d]->getDim(GLE_DIM_X)->getRange()->setMinSet(next_exp);
+ } else kw("XMAX") {
+ dp[d]->getDim(GLE_DIM_X)->getRange()->setMaxSet(next_exp);
+ } else kw("YMIN") {
+ dp[d]->getDim(GLE_DIM_Y)->getRange()->setMinSet(next_exp);
+ } else kw("YMAX") {
+ dp[d]->getDim(GLE_DIM_Y)->getRange()->setMaxSet(next_exp);
+ } else kw("HERR") {
+ next_str_cpp(dp[d]->herrup);
+ fixup_err(dp[d]->herrup);
+ dp[d]->herrdown = dp[d]->herrup;
+ dp[d]->layer_error = graphBlock->getLayerWithDefault(GLE_GRAPH_LAYER_ERROR_BAR);
+ } else kw("HERRLEFT") {
+ next_str_cpp(dp[d]->herrup);
+ fixup_err(dp[d]->herrup);
+ dp[d]->layer_error = graphBlock->getLayerWithDefault(GLE_GRAPH_LAYER_ERROR_BAR);
+ } else kw("HERRRIGHT") {
+ next_str_cpp(dp[d]->herrdown);
+ fixup_err(dp[d]->herrdown);
+ dp[d]->layer_error = graphBlock->getLayerWithDefault(GLE_GRAPH_LAYER_ERROR_BAR);
+ } else kw("HERRWIDTH") {
+ dp[d]->herrwidth = next_exp;
+ } else kw("ERR") {
+ next_str_cpp(dp[d]->errup);
+ fixup_err(dp[d]->errup);
+ dp[d]->errdown = dp[d]->errup;
+ dp[d]->layer_error = graphBlock->getLayerWithDefault(GLE_GRAPH_LAYER_ERROR_BAR);
+ } else kw("ERRUP") {
+ next_str_cpp(dp[d]->errup);
+ fixup_err(dp[d]->errup);
+ dp[d]->layer_error = graphBlock->getLayerWithDefault(GLE_GRAPH_LAYER_ERROR_BAR);
+ } else kw("ERRDOWN") {
+ next_str_cpp(dp[d]->errdown);
+ fixup_err(dp[d]->errdown);
+ dp[d]->layer_error = graphBlock->getLayerWithDefault(GLE_GRAPH_LAYER_ERROR_BAR);
+ } else kw("ERRWIDTH") {
+ dp[d]->errwidth = next_exp;
+ } else {
+ g_throw_parser_error("unrecognised GRAPH DN sub command: '",tk[ct],"'");
+ }
+ ct++;
+ }
+ // some options imply "di line"
+ if (dp[d]->line_mode != GLE_GRAPH_LM_PLAIN) {
+ dp[d]->line = true;
+ }
+ if (dp[d]->lstyle[0] != 0) {
+ dp[d]->line = true;
+ }
+ if (dp[d]->line || dp[d]->marker != 0) {
+ // make sure axisscale is also on if "dn line" given
+ // for individual datasets "di ...", this is enabled before this method is called
+ dp[d]->axisscale = true;
+ }
+}
+
+void do_each_dataset_settings() {
+ // Set datasets in to/from of bar commands as used
+ for (int bar = 1; bar <= g_nbar; bar++) {
+ for (int i = 0; i < br[bar]->ngrp; i++) {
+ int to_bar = br[bar]->to[i];
+ int from_bar = br[bar]->from[i];
+ if (to_bar != 0 && to_bar <= ndata && dp[to_bar] != NULL) {
+ dp[to_bar]->axisscale = true;
+ if (br[bar]->horiz) dp[to_bar]->inverted = true;
+ }
+ if (from_bar != 0 && from_bar <= ndata && dp[from_bar] != NULL) {
+ dp[from_bar]->axisscale = true;
+ if (br[bar]->horiz) dp[from_bar]->inverted = true;
+ }
+ }
+ }
+ /* Add dataset to key */
+ for (int dn = 1; dn <= ndata; dn++) {
+ if (dp[dn] != NULL && dp[dn]->axisscale) {
+ g_graphBlockData->getOrder()->addDataSet(dn);
+ /* automatically turn on labels on axis for this dataset */
+ for (int dim = GLE_DIM_X; dim <= GLE_DIM_Y; dim++) {
+ GLEAxis* ax = &xx[dp[dn]->getDim(dim)->getAxis()];
+ if (!ax->has_label_onoff) ax->label_off = false;
+ }
+ }
+ }
+ do_dataset_key_entries();
+ // If no dataset is used, then scale based on all datasets
+ bool has = false;
+ for (int dn = 1; dn <= ndata; dn++) {
+ if (dp[dn] != NULL && dp[dn]->axisscale) has = true;
+ }
+ if (!has) {
+ for (int dn = 1; dn <= ndata; dn++) {
+ if (dp[dn] != NULL) dp[dn]->axisscale = true;
+ }
+ }
+ // Make sure no axis has datasets associated to it
+ for (int axis = GLE_AXIS_X; axis <= GLE_AXIS_Y0; axis++) {
+ xx[axis].removeAllDimensions();
+ }
+ // Add datasets to axis
+ for (int dn = 1; dn <= ndata; dn++) {
+ if (dp[dn] != NULL && dp[dn]->axisscale) {
+ for (int dim = 0; dim < 2; dim++) {
+ GLEDataSetDimension* dimension = dp[dn]->getDim(dim);
+ xx[dimension->getAxis()].addDimension(dimension);
+ }
+ }
+ }
+}
+
+extern KeyInfo* g_keyInfo;
+
+void do_dataset_key(int d) {
+ if (dp[d] != NULL && dp[d]->key_name != "") {
+ KeyEntry* entry = g_keyInfo->createEntry();
+ entry->fill = dp[d]->key_fill;
+ entry->color = dp[d]->color;
+ entry->lwidth = dp[d]->lwidth;
+ entry->marker = dp[d]->marker;
+ entry->msize = dp[d]->msize;
+ strcpy(entry->lstyle,dp[d]->lstyle);
+ if (entry->lstyle[0] == 0 && dp[d]->line) {
+ entry->lstyle[0] = '1';
+ entry->lstyle[1] = 0;
+ }
+ entry->descrip = dp[d]->key_name;
+ if (g_get_tex_labels()) {
+ entry->descrip.insert(0, "\\tex{");
+ entry->descrip.append("}");
+ }
+ }
+}
+
+void do_dataset_key_entries()
+{
+ GLEArrayImpl* order = g_graphBlockData->getOrder()->getArray();
+ for (unsigned int i = 0; i < order->size(); ++i) {
+ if (order->getType(i) == GLEObjectTypeInt) {
+ do_dataset_key(order->getInt(i));
+ }
+ if (order->getType(i) == GLEObjectTypeClassInstance) {
+ GLEClassInstance* classInstance = static_cast<GLEClassInstance*>(order->getObject(i));
+ if (classInstance->getDefinition() == g_graphBlockData->getGraphBlockBase()->getClassDefinitions()->getKeySeparator()) {
+ if (i == 0 || i + 1 == order->size()) {
+ g_throw_parser_error("key separator not in between key entries");
+ }
+ KeyEntry* entry = g_keyInfo->lastEntry();
+ if (classInstance->getArray()->size() > 0) {
+ entry->sepstyle = classInstance->getArray()->getInt(0);
+ }
+ g_keyInfo->addColumn();
+ }
+ }
+ }
+}
+
+void set_bar_axis_places() {
+ for (int bar = 1; bar <= g_nbar; bar++) {
+ for (int i = 0; i < br[bar]->ngrp; i++) {
+ int to_bar = br[bar]->to[i];
+ if (to_bar != 0 && to_bar <= ndata && dp[to_bar] != NULL) {
+ GLEAxis* axis = br[bar]->horiz ? &xx[2] : &xx[1];
+ if (axis->hasNames() && !axis->hasPlaces()) {
+ int np = dp[to_bar]->np;
+ if (np == axis->getNbNames()) {
+ GLEDataPairs barData;
+ barData.copyDimension(getDataset(to_bar), 0);
+ for (unsigned int i = 0; i < barData.size(); i++) {
+ axis->addPlace(barData.getX(i));
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+void min_max_scale(GLEAxis* ax) {
+ GLERange* range = ax->getDataRange();
+ for (int dim = 0; dim < ax->getNbDimensions(); dim++) {
+ GLEDataSet* dataset = ax->getDim(dim)->getDataSet();
+ if (dataset->np > 0) {
+ GLEDataPairs pairs(dataset);
+ vector<double>* values = pairs.getDimension(ax->getDim(dim)->getDataDimensionIndex());
+ for (unsigned int i = 0; i < pairs.size(); i++) {
+ range->updateRange(values->at(i), pairs.getM(i));
+ }
+ doMinMaxScaleErrorBars(dataset, ax->getDim(dim)->getDataDimensionIndex(), range);
+ }
+ }
+}
+
+void quantile_scale(GLEAxis* ax) {
+ /* building list for quantile calculation */
+ vector<double> q_list;
+ for (int dim = 0; dim < ax->getNbDimensions(); dim++) {
+ GLEDataSet* dataset = ax->getDim(dim)->getDataSet();
+ if (dataset->np > 0) {
+ GLEDataPairs pairs(dataset);
+ vector<double>* values = pairs.getDimension(ax->getDim(dim)->getDataDimensionIndex());
+ for (unsigned int i = 0; i < pairs.size(); i++) {
+ if (!pairs.getM(i)) {
+ q_list.push_back(values->at(i));
+ }
+ }
+ }
+ }
+ std::sort(q_list.begin(), q_list.end());
+ int q_size = q_list.size();
+ /* only do quantile scale if at least two values given */
+ if (q_size > 1) {
+ GLEAxisQuantileScale* q_scale = ax->getQuantileScale();
+ /* calculating ymin */
+ double q_intpart;
+ double q_fracpart = modf((q_size-1)*q_scale->getLowerQuantile(), &q_intpart);
+ double q_lower = q_list[(int)q_intpart];
+ if ((int)q_intpart + 1 < q_size - 1) {
+ q_lower = q_lower*(1.0-q_fracpart)+q_list[(int)q_intpart+1]*q_fracpart;
+ }
+ /* calculating ymax */
+ q_fracpart = modf((q_size-1)*q_scale->getUpperQuantile(), &q_intpart);
+ double q_upper = q_list[(int)q_intpart];
+ if ((int)q_intpart + 1 < q_size - 1) {
+ q_upper = q_upper*(1.0-q_fracpart)+q_list[(int)q_intpart+1]*q_fracpart;
+ }
+ double q_ymin = q_lower-(q_upper-q_lower)*q_scale->getLowerQuantileFactor();
+ double q_ymax = q_upper+(q_upper-q_lower)*q_scale->getUpperQuantileFactor();
+ /* store the axis range */
+ GLERange* range = ax->getDataRange();
+ range->updateRange(q_ymin);
+ range->updateRange(q_ymax);
+ } else {
+ min_max_scale(ax);
+ }
+}
+
+void get_dataset_ranges() {
+ // Reset axis ranges
+ reset_axis_ranges();
+ // Get ranges from color map
+ if (g_colormap != NULL && g_colormap->getData() != NULL) {
+ GLERectangle* bounds = g_colormap->getData()->getBounds();
+ bounds->addToRangeX(xx[GLE_AXIS_X].getDataRange());
+ bounds->addToRangeY(xx[GLE_AXIS_Y].getDataRange());
+ }
+ // Set datasets in to/from of bar commands as used
+ for (int bar = 1; bar <= g_nbar; bar++) {
+ for (int i = 0; i < br[bar]->ngrp; i++) {
+ int to_bar = br[bar]->to[i];
+ if (to_bar != 0 && to_bar <= ndata && dp[to_bar] != NULL && dp[to_bar]->np > 0) {
+ // Extend range at both sides for a bar dataset
+ // So that bars are visible
+ int np = dp[to_bar]->np;
+ if (np > 0) {
+ GLEDataSetDimension* xdim = dp[to_bar]->getDimXInv();
+ GLERange* xrange = xx[xdim->getAxis()].getDataRange();
+ GLEDataPairs barData(dp[to_bar]);
+ double delta = barData.getMinXInterval();
+ xrange->updateRange(barData.getX(0) - delta/2, barData.getM(0));
+ xrange->updateRange(barData.getX(np - 1) + delta/2, barData.getM(np-1));
+ }
+ }
+ }
+ }
+ // Autoscale axis
+ for (int axis = GLE_AXIS_X; axis <= GLE_AXIS_Y0; axis++) {
+ GLEAxis* ax = &xx[axis];
+ if (!ax->getRange()->hasBoth()) {
+ if (ax->shouldPerformQuantileScale()) {
+ quantile_scale(ax);
+ } else {
+ min_max_scale(ax);
+ }
+ }
+ }
+}
+
+void do_bigfile_compatibility_dn(int dn) throw(ParserError) {
+ string infile = dp[dn]->bigfile;
+ if (infile.length() >= 1 && infile[infile.length()-1] == '$') {
+ int idx, typ;
+ var_find(infile.c_str(), &idx, &typ) ;
+ if (idx >= 0) var_getstr(idx, infile);
+ }
+ string fname;
+ int bigcol1 = 1;
+ int bigcol2 = 2;
+ bool bigally = false;
+ char_separator sep1(",", "");
+ tokenizer<char_separator> tokens(infile, sep1);
+ if (tokens.has_more()) {
+ fname = tokens.next_token();
+ }
+ if (tokens.has_more()) {
+ string col1 = tokens.next_token();
+ if (col1 == "*") {
+ bigally = true;
+ } else {
+ bigcol1 = atoi(col1.c_str());
+ }
+ if (tokens.has_more()) {
+ string col2 = tokens.next_token();
+ if (col2 == "*") {
+ bigally = true;
+ } else {
+ bigcol2 = atoi(col2.c_str());
+ if (bigcol2 == 0) {
+ g_throw_parser_error_sys("expecting \"file,xcoloumn,ycolumn\", but found \"", infile.c_str(), "\"");
+ }
+ }
+ }
+ }
+ if (fname.length() >= 1 && fname[fname.length()-1] == '$') {
+ int idx, typ;
+ var_find(fname.c_str(), &idx, &typ) ;
+ if (idx >= 0) var_getstr(idx, fname);
+ }
+ string line;
+ ifstream file;
+ validate_open_input_stream(file, fname);
+ vector<double> xp;
+ vector<double> yp;
+ vector<int> miss;
+ vector<double> columns;
+ vector<bool> columns_miss;
+ char_separator sep2(" ,;\t\n", "!");
+ tokenizer<char_separator> data_tokens(sep2);
+ while (file.good()) {
+ getline(file, line);
+ data_tokens.set_input(line);
+ if (bigally) {
+ // only data points - not in columns
+ while (data_tokens.has_more()) {
+ const string& token = data_tokens.next_token();
+ if (token == "!") {
+ break;
+ }
+ xp.push_back(xp.size()+1);
+ if (token == "*" || token == "?" || token == "-" || token == ".") {
+ yp.push_back(0.0);
+ miss.push_back(true);
+ } else {
+ yp.push_back(atof(token.c_str()));
+ miss.push_back(false);
+ }
+ }
+ } else {
+ // read in columns
+ int nbcol = 0;
+ while (data_tokens.has_more()) {
+ const string& token = data_tokens.next_token();
+ if (nbcol >= (int)columns.size()) {
+ columns.push_back(0.0);
+ columns_miss.push_back(false);
+ }
+ if (token == "!") {
+ break;
+ }
+ if (token == "*" || token == "?" || token == "-" || token == ".") {
+ columns[nbcol] = 0.0;
+ columns_miss[nbcol] = true;
+ } else {
+ columns[nbcol] = atof(token.c_str());
+ columns_miss[nbcol] = false;
+ }
+ nbcol++;
+ }
+ // get data from columns
+ if (bigcol1 == 0) {
+ if (bigcol2 >= 1 && bigcol2 <= nbcol) {
+ xp.push_back(xp.size()+1);
+ yp.push_back(columns[bigcol2-1]);
+ miss.push_back(columns_miss[bigcol2-1]);
+ }
+ } else {
+ if (bigcol1 >= 1 && bigcol1 <= nbcol &&
+ bigcol2 >= 1 && bigcol2 <= nbcol) {
+ xp.push_back(columns[bigcol1-1]);
+ yp.push_back(columns[bigcol2-1]);
+ miss.push_back(columns_miss[bigcol1-1] || columns_miss[bigcol2-1]);
+ }
+ }
+ }
+ }
+ file.close();
+ dp[dn]->clearAll();
+ dp[dn]->fromData(xp, yp, miss);
+}
+
+void do_bigfile_compatibility() throw(ParserError) {
+ for (int dn = 1; dn <= ndata; dn++) {
+ if (dp[dn] != NULL) {
+ if (dp[dn]->bigfile != NULL) {
+ do_bigfile_compatibility_dn(dn);
+ }
+ }
+ }
+}
+
+GLEToView::GLEToView() {
+}
+
+GLEToView::~GLEToView() {
+}
+
+GLEToGraphView::GLEToGraphView(GLEAxis* xAxis, GLEAxis* yAxis):
+ m_xAxis(xAxis),
+ m_yAxis(yAxis)
+{
+}
+
+GLEToGraphView::~GLEToGraphView() {
+}
+
+GLEPoint GLEToGraphView::fnXY(const GLEPoint& xy) {
+ return GLEPoint(fnx(xy.getX(), m_xAxis, m_xAxis->getRange()), fny(xy.getY(), m_yAxis, m_yAxis->getRange()));
+}
+
+GLEPoint GLEToGraphView::fnXYInv(const GLEPoint& xy) {
+ return GLEPoint(fnxInv(xy.getX(), m_xAxis, m_xAxis->getRange()), fnyInv(xy.getY(), m_yAxis, m_yAxis->getRange()));
+}
+
+GLEToRectangularView::GLEToRectangularView()
+{
+}
+
+GLEToRectangularView::~GLEToRectangularView() {
+}
+
+GLEPoint GLEToRectangularView::fnXY(const GLEPoint& xy) {
+ CUtilsAssert(false);
+ return xy;
+}
+
+GLEPoint GLEToRectangularView::fnXYInv(const GLEPoint& xy) {
+ double xpos = (xy.getX() - m_origin.getX())/ m_size.getX() * m_xRange.getWidth() + m_xRange.getMin();
+ double ypos = (xy.getY() - m_origin.getY())/ m_size.getY() * m_yRange.getWidth() + m_yRange.getMin();
+ return GLEPoint(xpos, ypos);
+}
+
+class GLEColorMapBitmap : public GLEBitmap {
+protected:
+ GLEZData* m_Data;
+ GLEColorMap* m_map;
+ GLEPoint m_origin;
+ GLEPoint m_size;
+ double m_ZMin;
+ double m_ZMax;
+ GLESub* m_sub;
+ GLEBYTE* m_pal;
+ GLEBYTE* m_scanLine;
+ GLEToView* m_toView;
+public:
+ GLEColorMapBitmap(GLEToView* toView, GLEColorMap* map, const GLEPoint& origin, const GLEPoint& size, GLEZData* data = NULL);
+ virtual ~GLEColorMapBitmap();
+ GLEBYTE* createColorPalette();
+ virtual int readHeader();
+ virtual int decode(GLEByteStream* output);
+ void plotFunction(GLEPcode& code, int varx, int vary, GLEByteStream* output);
+ void plotData(GLEZData* data, GLEByteStream* output);
+ inline void setZRange(double zmin, double zmax) { m_ZMin = zmin; m_ZMax = zmax; }
+ inline double getZMin() { return m_ZMin; }
+ inline double getZMax() { return m_ZMax; }
+ inline bool isFunction() { return m_Data == NULL; }
+ inline GLEZData* getData() { return m_Data; }
+private:
+ void updateScanLine(int* pos, double zvalue);
+ void init();
+ void cleanUp();
+};
+
+GLEColorMapBitmap::GLEColorMapBitmap(GLEToView* toView, GLEColorMap* map, const GLEPoint& origin, const GLEPoint& size, GLEZData* data):
+ GLEBitmap(),
+ m_Data(data),
+ m_map(map),
+ m_origin(origin),
+ m_size(size),
+ m_ZMin(GLE_INF),
+ m_ZMax(-GLE_INF),
+ m_sub(0),
+ m_pal(0),
+ m_scanLine(0),
+ m_toView(toView)
+{
+}
+
+GLEColorMapBitmap::~GLEColorMapBitmap() {
+}
+
+int GLEColorMapBitmap::readHeader() {
+ m_Width = m_map->getWidth();
+ m_Height = m_map->getHeight();
+ m_BitsPerComponent = 8;
+ if (m_map->isColor() || m_map->hasPalette()) {
+ setMode(GLE_BITMAP_RGB);
+ setComponents(3);
+ } else {
+ setMode(GLE_BITMAP_GRAYSCALE);
+ setComponents(1);
+ }
+ return GLE_IMAGE_ERROR_NONE;
+}
+
+int fixRange(int v, int min, int max) {
+ if (v < min) return min;
+ if (v > max) return max;
+ return v;
+}
+
+void GLEColorMapBitmap::init() {
+ cleanUp();
+ if (m_map->isColor()) {
+ m_pal = GLEBitmapCreateColorPalette(32761);
+ } else if (m_map->hasPalette()) {
+ m_sub = sub_find(m_map->getPaletteFunction().c_str());
+ if (m_sub == NULL) {
+ stringstream err;
+ err << "palette subroutine '" << m_map->getPaletteFunction() << "' not found";
+ g_throw_parser_error(err.str());
+ } else if (m_sub->getNbParam() != 1) {
+ stringstream err;
+ err << "palette subroutine '" << m_map->getPaletteFunction() << "' should take one argument";
+ g_throw_parser_error(err.str());
+ }
+ }
+ m_scanLine = new GLEBYTE[getScanlineSize()];
+}
+
+void GLEColorMapBitmap::cleanUp() {
+ delete[] m_pal;
+ delete[] m_scanLine;
+}
+
+void GLEColorMapBitmap::updateScanLine(int* pos, double zvalue) {
+ if (m_map->isColor()) {
+ int color = (int)floor(zvalue * 32760 + 0.5);
+ if (color > 32760) color = 32760;
+ if (color < 0) color = 0;
+ m_scanLine[(*pos)++] = m_pal[color*3];
+ m_scanLine[(*pos)++] = m_pal[color*3+1];
+ m_scanLine[(*pos)++] = m_pal[color*3+2];
+ } else if (m_map->hasPalette()) {
+ GLERC<GLEArrayImpl> stk(new GLEArrayImpl());
+ setEvalStack(stk.get(), 0, zvalue);
+ getGLERunInstance()->sub_call_stack(m_sub, stk.get());
+ GLEColor* color = getEvalStackColor(stk.get(), 0);
+ m_scanLine[(*pos)++] = color->getRedI();
+ m_scanLine[(*pos)++] = color->getGreenI();
+ m_scanLine[(*pos)++] = color->getBlueI();
+ } else {
+ double grey = floor(zvalue*255+0.5);
+ if (grey > 255) grey = 255;
+ if (grey < 0) grey = 0;
+ m_scanLine[(*pos)++] = (int)grey;
+ }
+}
+
+void GLEColorMapBitmap::plotData(GLEZData* zdata, GLEByteStream* output) {
+ double zmin = zdata->getZMin();
+ double zmax = zdata->getZMax();
+ if (m_map->hasZMin()) zmin = m_map->getZMin();
+ if (m_map->hasZMax()) zmax = m_map->getZMax();
+ IpolDoubleMatrix ipd(zdata->getData(), zdata->getNX(), zdata->getNY());
+ std::auto_ptr<Ipol> ipol;
+ if (m_map->getIpolType() == IPOL_TYPE_BICUBIC) {
+ ipol.reset(new BicubicIpol(&ipd));
+ } else {
+ ipol.reset(new NearestIpol(&ipd));
+ }
+ double scale = zmax - zmin;
+ GLERectangle* bounds = zdata->getBounds();
+ for (int i = getHeight() - 1; i >= 0; i--) {
+ int pos = 0;
+ double yView = m_origin.getY() + m_size.getY() * (i + 0.5) / getHeight();
+ for (int j = 0; j < getWidth(); j++) {
+ double xView = m_origin.getX() + m_size.getX() * (j + 0.5) / getWidth();
+ GLEPoint xy(m_toView->fnXYInv(GLEPoint(xView, yView)));
+ double xpos = gle_limit_range((xy.getX() - bounds->getXMin()) / bounds->getWidth(), 0.0, 1.0);
+ double ypos = gle_limit_range((xy.getY() - bounds->getYMin()) / bounds->getHeight(), 0.0, 1.0);
+ double zvalue = 0.0;
+ if (m_map->isInverted()) {
+ zvalue = (zmax - ipol->ipol(xpos, ypos)) / scale;
+ } else {
+ zvalue = (ipol->ipol(xpos, ypos) - zmin) / scale;
+ }
+ updateScanLine(&pos, zvalue);
+ }
+ output->send(m_scanLine, getScanlineSize());
+ output->endScanLine();
+ }
+ setZRange(zmin, zmax);
+}
+
+void GLEColorMapBitmap::plotFunction(GLEPcode& code, int varx, int vary, GLEByteStream* output) {
+ double zmax = -GLE_INF;
+ double zmin = GLE_INF;
+ double set_zmin = 0.0;
+ double set_zmax = 1.0;
+ if (m_map->hasZMin()) {
+ set_zmin = m_map->getZMin();
+ }
+ if (m_map->hasZMax()) {
+ set_zmax = m_map->getZMax();
+ }
+ double scale = set_zmax - set_zmin;
+ for (int i = getHeight() - 1; i >= 0; i--) {
+ int pos = 0;
+ double yView = m_origin.getY() + m_size.getY() * (i + 0.5) / getHeight();
+ for (int j = 0; j < getWidth(); j++) {
+ double xView = m_origin.getX() + m_size.getX() * (j + 0.5) / getWidth();
+ GLEPoint xy(m_toView->fnXYInv(GLEPoint(xView, yView)));
+ var_set(varx, xy.getX());
+ var_set(vary, xy.getY());
+ double zvalue;
+ eval_pcode(code, &zvalue);
+ if (zvalue > zmax) zmax = zvalue;
+ if (zvalue < zmin) zmin = zvalue;
+ if (m_map->isInverted()) {
+ zvalue = (set_zmax - zvalue) / scale;
+ } else {
+ zvalue = (zvalue - set_zmin) / scale;
+ }
+ updateScanLine(&pos, zvalue);
+ }
+ output->send(m_scanLine, getScanlineSize());
+ output->endScanLine();
+ }
+ setZRange(zmin, zmax);
+}
+
+int GLEColorMapBitmap::decode(GLEByteStream* output) {
+ init();
+ if (isFunction()) {
+ int varx, vary;
+ int vartype = 1;
+ GLEVars* vars = getVarsInstance();
+ GLERC<GLEVarSubMap> submap(vars->addLocalSubMap());
+ var_findadd("X", &varx, &vartype);
+ var_findadd("Y", &vary, &vartype);
+ GLEPcodeList pc_list;
+ GLEPcode my_pcode(&pc_list);
+ polish((char*)m_map->getFunction().c_str(), my_pcode, &etype);
+ plotFunction(my_pcode, varx, vary, output);
+ vars->removeLocalSubMap();
+ } else {
+ plotData(getData(), output);
+ }
+ cleanUp();
+ var_findadd_set("ZGMIN", getZMin());
+ var_findadd_set("ZGMAX", getZMax());
+ return GLE_IMAGE_ERROR_NONE;
+}
+
+GLEColorMap::GLEColorMap() {
+ m_color = false;
+ m_wd = 50; m_hi = 50;
+ m_zmin = 0.0; m_zmax = 1.0;
+ m_has_zmin = false;
+ m_has_zmax = false;
+ m_invert = false;
+ m_haspal = false;
+ m_Data = NULL;
+ m_ipolType = IPOL_TYPE_BICUBIC;
+}
+
+GLEColorMap::~GLEColorMap() {
+ if (m_Data != NULL) delete m_Data;
+}
+
+void GLEColorMap::readData() {
+ string fname;
+ int varx, vary;
+ int vartype = 1;
+ GLEVars* vars = getVarsInstance();
+ GLERC<GLEVarSubMap> submap(vars->addLocalSubMap());
+ var_findadd("X", &varx, &vartype);
+ var_findadd("Y", &vary, &vartype);
+ polish_eval_string(getFunction().c_str(), &fname, true);
+ vars->removeLocalSubMap();
+ if (str_i_ends_with(fname, ".Z") || str_i_ends_with(fname, ".GZ")) {
+ m_Data = new GLEZData();
+ m_Data->read(fname);
+ }
+}
+/*
+Thanks for pointing this out! Indeed, if you use a function (not
+a .z file), then the range of the function should be 0 - 1.
+Normally, it should be possible to specify the range with zmin
+and zmax, but this does not work correctly. The function is
+multiplied by (zmax - zmin) and not by 1/(zmax - zmin). I have
+now corrected this behaviour. The fix is in the current
+development version and will be included in the next release.
+*/
+void GLEColorMap::setPalette(const string& pal) {
+ m_palette = pal;
+ m_haspal = true;
+}
+
+void GLEColorMap::setZMin(double val) {
+ m_has_zmin = true;
+ m_zmin = val;
+}
+
+void GLEColorMap::setZMax(double val) {
+ m_has_zmax = true;
+ m_zmax = val;
+}
+
+void GLEColorMap::draw(GLEToView* toView, double x0, double y0, double wd, double hi) {
+ GLEZData* zdata = getData();
+ if (zdata != NULL) {
+ /* figure out position of bitmap */
+ GLERectangle* bounds = zdata->getBounds();
+ GLERectangle screenBounds;
+ screenBounds.initRange();
+ screenBounds.updateRange(fnx(bounds->getXMin(), &xx[GLE_AXIS_X]), fny(bounds->getYMin(), &xx[GLE_AXIS_Y]));
+ screenBounds.updateRange(fnx(bounds->getXMax(), &xx[GLE_AXIS_X]), fny(bounds->getYMax(), &xx[GLE_AXIS_Y]));
+ double xMin = std::max<double>(x0, screenBounds.getXMin());
+ double yMin = std::max<double>(y0, screenBounds.getYMin());
+ double xMax = std::min<double>(x0 + wd, screenBounds.getXMax());
+ double yMax = std::min<double>(y0 + hi, screenBounds.getYMax());
+ if (xMin > xMax || yMin > yMax) {
+ return;
+ }
+ g_move(xMin, yMin);
+ GLEColorMapBitmap bitmap(toView, this, GLEPoint(xMin, yMin), GLEPoint(xMax - xMin, yMax - yMin), zdata);
+ g_bitmap(&bitmap, xMax - xMin, yMax - yMin, BITMAP_TYPE_USER);
+ } else {
+ g_move(x0, y0);
+ GLEColorMapBitmap bitmap(toView, this, GLEPoint(x0, y0), GLEPoint(wd, hi));
+ g_bitmap(&bitmap, wd, hi, BITMAP_TYPE_USER);
+ }
+}
+
+GLEDataSet::GLEDataSet(int identifier) {
+ id = identifier;
+ nomiss = 0;
+ np = 0; /* NUMBER OF POINTS */
+ autoscale = 0;
+ axisscale = false;
+ inverted = false;
+ lstyle[0] = 0;
+ key_name = "";
+ bigfile = NULL;
+ key_fill = 0;
+ color = g_get_color_hex(GLE_COLOR_BLACK);
+ errup[0] = 0;
+ errdown[0] = 0;
+ errwidth = 0.0;
+ herrup[0] = 0;
+ herrdown[0] = 0;
+ herrwidth = 0.0;
+ msize = 0.0;
+ mdist = 0.0;
+ lwidth = -1.0;
+ yv_str = NULL;
+ marker = 0;
+ smooth = 0;
+ smoothm = 0;
+ svg_smooth = 0; /* Savitski Golay filtering true=on */
+ svg_poly = 0; /* the type of polynomial 2,3,4,5...*/
+ svg_points = 0; /* the number of points 5,7,9,11.... */
+ svg_iter = 0; /* numb or time to do svg smoothing */
+ deresolve = 0; /* Only plot every N points: true = on */
+ deresolve_avg = false; /* dresolve + average points */
+ line_mode = GLE_GRAPH_LM_PLAIN;
+ mdata = 0;
+ mscale = 0;
+ line = 0;
+ layer_line = GLE_GRAPH_LAYER_LINE;
+ layer_marker = GLE_GRAPH_LAYER_MARKER;
+ layer_error = GLE_GRAPH_LAYER_ERROR_BAR;
+ rx1 = ry1 = rx2 = ry2 = 0;
+ initBackup();
+ getDim(0)->setAxis(GLE_AXIS_X);
+ getDim(1)->setAxis(GLE_AXIS_Y);
+ getDim(0)->setIndex(0);
+ getDim(1)->setIndex(1);
+ getDim(0)->setDataSet(this);
+ getDim(1)->setDataSet(this);
+}
+
+GLEDataSet::~GLEDataSet() {
+ clearAll();
+}
+
+void GLEDataSet::initBackup() {
+ m_dataBackup.clear();
+}
+
+void GLEDataSet::clearAll() {
+ np = 0;
+ m_dataBackup.clear();
+ m_data.clear();
+}
+
+bool GLEDataSet::undefined() {
+ return m_data.size() == 0;
+}
+
+void GLEDataSet::copy(GLEDataSet* other) {
+ clearAll();
+ axisscale = false;
+ nomiss = other->nomiss;
+ autoscale = other->autoscale;
+ inverted = other->inverted;
+ strcpy(lstyle, other->lstyle);
+ key_fill = other->key_fill;
+ errup = other->errup;
+ errdown = other->errdown;
+ errwidth = other->errwidth;
+ herrup = other->herrup;
+ herrdown = other->herrdown;
+ herrwidth = other->herrwidth;
+ msize = other->msize;
+ mdist = other->mdist;
+ lwidth = other->lwidth;
+ marker = other->marker;
+ smooth = other->smooth;
+ smoothm = other->smoothm;
+ svg_smooth = other->svg_smooth;
+ svg_poly = other->svg_poly;
+ svg_points = other->svg_points;
+ svg_iter = other->svg_iter;
+ deresolve = other->deresolve;
+ deresolve_avg = other->deresolve_avg;
+ line_mode = other->line_mode;
+ mdata = other->mdata;
+ color = other->color;
+ mscale = other->mscale;
+ line = other->line;
+ rx1 = other->rx1;
+ ry1 = other->ry1;
+ rx2 = other->rx2;
+ ry2 = other->ry2;
+ layer_line = other->layer_line;
+ layer_marker = other->layer_marker;
+ layer_error = other->layer_error;
+ initBackup();
+ getDim(0)->copy(other->getDim(0));
+ getDim(1)->copy(other->getDim(1));
+}
+
+void GLEDataSet::backup() {
+ m_dataBackup.ensure(m_data.size());
+ for (unsigned int i = 0; i < m_data.size(); i++) {
+ m_dataBackup.set(i, m_data.get(i));
+ }
+}
+
+void GLEDataSet::restore() {
+ if (m_dataBackup.size() != 0) {
+ for (unsigned int i = 0; i < m_dataBackup.size(); i++) {
+ m_data.set(i, m_dataBackup.get(i));
+ GLEDataObject* dimI = m_dataBackup.getObject(i);
+ if (dimI != 0 && dimI->getType() == GLEObjectTypeArray) {
+ np = static_cast<GLEArrayImpl*>(dimI)->size();
+ }
+ }
+ }
+ initBackup();
+}
+
+GLEDataSetDimension* GLEDataSet::getDimXInv() {
+ return inverted ? getDim(1) : getDim(0);
+}
+
+GLEDataSetDimension* GLEDataSet::getDimYInv() {
+ return inverted ? getDim(0) : getDim(1);
+}
+
+GLEAxis* GLEDataSet::getAxis(int i)
+{
+ return &xx[getDim(i)->getAxis()];
+}
+
+void GLEDataSet::clip(double *x, double *y) {
+ getDim(GLE_DIM_X)->getRange()->clip(x);
+ getDim(GLE_DIM_Y)->getRange()->clip(y);
+}
+
+bool GLEDataSet::contains(double x, double y) {
+ return getDim(GLE_DIM_X)->getRange()->contains(x)
+ && getDim(GLE_DIM_Y)->getRange()->contains(y);
+}
+
+bool GLEDataSet::contains(const GLEPoint& p) {
+ return contains(p.getX(), p.getY());
+}
+
+void GLEDataSet::copyRangeIfRequired(int dimension) {
+ if (!getDim(dimension)->getRange()->valid()) {
+ getDim(dimension)->getRange()->copyIfNotSet(getAxis(dimension)->getRange());
+ }
+}
+
+void GLEDataSet::validateDimensions() {
+ GLEArrayImpl* data = getData();
+ for (unsigned int i = 0; i < data->size(); i++) {
+ GLEDataObject* dim = data->getObject(i);
+ if (dim == 0 || dim->getType() != GLEObjectTypeArray) {
+ ostringstream err;
+ err << "dataset d" << id << " dimension " << dimension2String(i) << " not a double array";
+ g_throw_parser_error(err.str());
+ }
+ GLEArrayImpl* array = static_cast<GLEArrayImpl*>(dim);
+ if (array->size() != np) {
+ ostringstream err;
+ err << "dataset d" << id << " dimension " << dimension2String(i)
+ << " has an incorrect number of data points (" << array->size() << " <> " << np << ")";
+ g_throw_parser_error(err.str());
+ }
+ }
+}
+
+void GLEDataSet::validateNbPoints(unsigned int expectedNb, const char* descr) {
+ if (np != expectedNb) {
+ ostringstream err;
+ if (descr != 0) {
+ err << descr << " ";
+ }
+ err << "dataset d" << id << " contains " << np;
+ err << " data points, but " << expectedNb << " are required";
+ g_throw_parser_error(err.str());
+ }
+}
+
+GLEArrayImpl* GLEDataSet::getDimData(unsigned int dim) {
+ if (dim >= getData()->size()) {
+ return 0;
+ }
+ GLEDataObject* data = getData()->getObject(dim);
+ if (data != 0 && data->getType() == GLEObjectTypeArray) {
+ return static_cast<GLEArrayImpl*>(data);
+ } else {
+ return 0;
+ }
+}
+
+void GLEDataSet::fromData(const vector<double>& xp, const vector<double>& yp, const vector<int>& miss) {
+ np = xp.size();
+ GLEArrayImpl* dimensions = getData();
+ unsigned int dims = 2;
+ dimensions->ensure(dims);
+ for (unsigned int dim = 0; dim < dims; dim++) {
+ GLEArrayImpl* newArray = new GLEArrayImpl();
+ newArray->ensure(np);
+ dimensions->setObject(dim, newArray);
+ for (unsigned int i = 0; i < np; i++) {
+ if (miss[i]) {
+ newArray->setUnknown(i);
+ } else {
+ newArray->setDouble(i, dim == 0 ? xp[i] : yp[i]);
+ }
+ }
+ }
+
+}
+
+vector<int> GLEDataSet::getMissingValues() {
+ vector<int> result;
+ result.assign(np, false);
+ GLEArrayImpl* dimensions = getData();
+ for (unsigned int dim = 0; dim < dimensions->size(); dim++) {
+ GLEDataObject* data = dimensions->getObject(dim);
+ if (data != 0 && data->getType() == GLEObjectTypeArray) {
+ GLEArrayImpl* array = static_cast<GLEArrayImpl*>(data);
+ unsigned int count = min(np, array->size());
+ for (unsigned int i = 0; i < count; i++) {
+ if (array->isUnknown(i)) {
+ result[i] = true;
+ }
+ }
+ }
+ }
+ return result;
+}
+
+void GLEDataSet::checkRanges() throw(ParserError) {
+ // when parsing "let" -> already create dataset with ensureCreate...
+ // so that dn command applies to it
+ copyRangeIfRequired(GLE_DIM_X);
+ copyRangeIfRequired(GLE_DIM_Y);
+ if (!getDim(GLE_DIM_X)->getRange()->valid()) {
+ g_throw_parser_error("invalid range for dimension X");
+ }
+ if (!getDim(GLE_DIM_Y)->getRange()->valid()) {
+ g_throw_parser_error("invalid range for dimension Y");
+ }
+}
+
+GLEDataSetDimension::GLEDataSetDimension() {
+ m_Axis = GLE_AXIS_NONE;
+}
+
+GLEDataSetDimension::~GLEDataSetDimension() {
+}
+
+void GLEDataSetDimension::copy(GLEDataSetDimension* other) {
+ setAxis(other->getAxis());
+ getRange()->copySet(other->getRange());
+}
+
+int GLEDataSetDimension::getDataDimensionIndex() {
+ if (getDataSet()->inverted) {
+ return getIndex() == 0 ? 1 : 0;
+ } else {
+ return getIndex();
+ }
+}
+
+GLEDataPairs::GLEDataPairs() {
+}
+
+GLEDataPairs::GLEDataPairs(double* x, double* y, int* m, int np) {
+ set(x, y, m, np);
+}
+
+GLEDataPairs::GLEDataPairs(GLEDataSet* dataSet) {
+ copy(dataSet);
+}
+
+GLEDataPairs::~GLEDataPairs() {
+}
+
+void GLEDataPairs::validate(GLEDataSet* data, unsigned int minDim) {
+ if (data->getData()->size() < minDim) {
+ ostringstream err;
+ err << "dataset d" << data->id << " has " << data->getData()->size() << " dimensions, but " << minDim << " dimensions are required";
+ g_throw_parser_error(err.str());
+ }
+ data->validateDimensions();
+}
+
+double GLEDataPairs::getDataPoint(GLEMemoryCell* element, int datasetID, unsigned int dimension, unsigned int arrayIdx) {
+ double result = 0.0;
+ if (!gle_memory_cell_to_double(element, &result)) {
+ ostringstream err;
+ err << "dataset d" << datasetID << " dimension " << dimension2String(dimension)
+ << " point " << (arrayIdx + 1) << ": expected double but found '";
+ gle_memory_cell_print(element, err);
+ err << "'";
+ g_throw_parser_error(err.str());
+ }
+ return result;
+}
+
+void GLEDataPairs::copyDimensionImpl(GLEArrayImpl* data, unsigned int np, int datasetID, unsigned int dim) {
+ GLEArrayImpl* array = static_cast<GLEArrayImpl*>(data->getObject(dim));
+ vector<double>* dimDataPoints = getDimension(dim);
+ dimDataPoints->resize(np);
+ for (unsigned int i = 0; i < np; i++) {
+ GLEMemoryCell* element = array->get(i);
+ if (element->Type == GLE_MC_UNKNOWN) {
+ m_M[i] = true;
+ dimDataPoints->at(i) = 0.0;
+ } else {
+ dimDataPoints->at(i) = getDataPoint(element, datasetID, dim, i);
+ }
+ }
+}
+
+void GLEDataPairs::copyDimension(GLEDataSet* dataSet, unsigned int dim) {
+ validate(dataSet, dim + 1);
+ m_M.assign(dataSet->np, false);
+ copyDimensionImpl(dataSet->getData(), dataSet->np, dataSet->id, dim);
+}
+
+void GLEDataPairs::copy(GLEDataSet* dataSet) {
+ validate(dataSet, 2);
+ m_M.assign(dataSet->np, false);
+ GLEArrayImpl* data = dataSet->getData();
+ for (unsigned int dim = 0; dim < data->size(); dim++) {
+ copyDimensionImpl(data, dataSet->np, dataSet->id, dim);
+ }
+}
+
+void GLEDataPairs::resize(int np) {
+ m_X.resize(np);
+ m_Y.resize(np);
+ m_M.resize(np);
+}
+
+void GLEDataPairs::set(double* x, double* y, int* m, int np) {
+ resize(np);
+ for (int i = 0; i < np; i++) {
+ m_X[i] = x[i]; m_Y[i] = y[i]; m_M[i] = m[i];
+ }
+}
+
+void GLEDataPairs::set(unsigned int i, double x, double y, int m) {
+ if (i < size()) {
+ m_X[i] = x; m_Y[i] = y; m_M[i] = m;
+ }
+}
+
+void GLEDataPairs::add(double x, double y, int m) {
+ m_X.push_back(x);
+ m_Y.push_back(y);
+ m_M.push_back(m);
+}
+
+void GLEDataPairs::noMissing() {
+ int pos = 0;
+ int npnts = size();
+ for (int j = 0; j < npnts; j++) {
+ if (!m_M[j]) {
+ m_X[pos] = m_X[j]; m_Y[pos] = m_Y[j]; m_M[pos] = m_M[j];
+ pos++;
+ }
+ }
+ resize(pos);
+}
+
+void GLEDataPairs::noNaN() {
+ int pos = 0;
+ int npnts = size();
+ for (int j = 0; j < npnts; j++) {
+ if (m_M[j] || (!gle_isnan(m_X[j]) && !gle_isnan(m_Y[j]))) {
+ m_X[pos] = m_X[j]; m_Y[pos] = m_Y[j]; m_M[pos] = m_M[j];
+ pos++;
+ }
+ }
+ resize(pos);
+}
+
+void GLEDataPairs::noLogZero(bool xlog, bool ylog) {
+ int pos = 0;
+ int npnts = size();
+ for (int j = 0; j < npnts; j++) {
+ if (!(xlog && m_X[j] < 0) && !(ylog && m_Y[j] < 0)) {
+ m_X[pos] = m_X[j]; m_Y[pos] = m_Y[j]; m_M[pos] = m_M[j];
+ pos++;
+ }
+ }
+ resize(pos);
+}
+
+void GLEDataPairs::transformLog(bool xlog, bool ylog) {
+ if (xlog) {
+ for (unsigned int i = 0; i < size(); i++) {
+ m_X[i] = log10(m_X[i]);
+ }
+ }
+ if (ylog) {
+ for (unsigned int i = 0; i < size(); i++) {
+ m_Y[i] = log10(m_Y[i]);
+ }
+ }
+}
+
+void GLEDataPairs::untransformLog(bool xlog, bool ylog) {
+ if (xlog) {
+ for (unsigned int i = 0; i < size(); i++) {
+ m_X[i] = pow(10.0, m_X[i]);
+ }
+ }
+ if (ylog) {
+ for (unsigned int i = 0; i < size(); i++) {
+ m_Y[i] = pow(10.0, m_Y[i]);
+ }
+ }
+}
+
+vector<double>* GLEDataPairs::getDimension(unsigned int i) {
+ switch (i) {
+ case 0:
+ return &m_X;
+ case 1:
+ return &m_Y;
+ default:
+ return NULL;
+ }
+}
+
+double GLEDataPairs::getMinXInterval() {
+ double min = GLE_INF;
+ for (unsigned int i = 1; i < m_X.size(); i++) {
+ double w = m_X[i] - m_X[i-1];
+ if (w > 0.0 && w < min) {
+ min = w;
+ }
+ }
+ return min;
+}
diff --git a/src/gle/justify.h b/src/gle/justify.h
new file mode 100644
index 0000000..6ae4c89
--- /dev/null
+++ b/src/gle/justify.h
@@ -0,0 +1,78 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#define JUST_LEFT 0x100
+#define JUST_CENTER 0x110
+#define JUST_CENTRE 0x110
+#define JUST_RIGHT 0x120
+#define JUST_LT 0x02
+#define JUST_TL 0x02
+#define JUST_CL 0x01
+#define JUST_LC 0x01
+#define JUST_BL 0x00
+#define JUST_LB 0x00
+#define JUST_CB 0x10
+#define JUST_BC 0x10
+#define JUST_RB 0x20
+#define JUST_BR 0x20
+#define JUST_CR 0x21
+#define JUST_RC 0x21
+#define JUST_TR 0x22
+#define JUST_RT 0x22
+#define JUST_TC 0x12
+#define JUST_CT 0x12
+#define JUST_CC 0x11
+#define JUST_C 0x11
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/gle/key.cpp b/src/gle/key.cpp
new file mode 100644
index 0000000..abe6351
--- /dev/null
+++ b/src/gle/key.cpp
@@ -0,0 +1,867 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#include "all.h"
+#include "mem_limits.h"
+#include "token.h"
+#include "cutils.h"
+#include "core.h"
+#include "glearray.h"
+#include "polish.h"
+#include "pass.h"
+#include "gle-block.h"
+#include "key.h"
+#include "justify.h"
+#include "color.h"
+#include "gprint.h"
+#include "op_def.h"
+#include "var.h"
+#include "sub.h"
+
+/* for key command and gx(), gy() */
+extern double graph_x1,graph_y1,graph_x2,graph_y2; /* in cm */
+extern double graph_xmin,graph_ymin,graph_xmax,graph_ymax; /* graph units */
+
+#define BEGINDEF extern
+#include "begin.h"
+#include <math.h>
+#define dbg if ((gle_debug & 64)>0)
+#define LARGE_NUM 1E30
+
+char *un_quote(char *ct);
+extern int gle_debug;
+void doskip(char *s,int *ct);
+double get_next_exp(TOKENS tk,int ntk,int *curtok);
+
+#define kw(ss) if (str_i_equals(tk[ct],ss))
+#define true (!false)
+#define false 0
+#define skipspace doskip(tk[ct],&ct)
+#define tok(n) (*tk)[n]
+#define next_exp (get_next_exp(tk,ntk,&ct))
+#define next_font ((ct+=1),pass_font(tk[ct]))
+#define next_marker ((ct+=1),pass_marker(tk[ct]))
+#define next_color ((ct+=1),pass_color_var(tk[ct]))
+#define next_fill ((ct+=1),pass_color_var(tk[ct]))
+#define next_str(s) (ct+=1,strcpy(s,tk[ct]))
+#define next_vstr(s) (ct+=1,mystrcpy(&s,tk[ct]))
+#define next_quote(s) (ct+=1,strcpy(&s,un_quote(tk[ct])))
+#define next_vquote_cpp(s) (ct+=1,skipspace,pass_file_name(tk[ct],s))
+
+#define KEY_FILL_HEI_FY 0.66
+#define KEY_FILL_HEI_FX 0.7
+
+class ParseGeneralKeyInfo {
+public:
+ ParseGeneralKeyInfo() {
+ GLESubDefinitionHelper passKeyInfo("key");
+ offset = passKeyInfo.addPointArgument("offset", new GLEPointDataObject(0.0, 0.0), false);
+ margins = passKeyInfo.addPointArgument("margins", new GLEPointDataObject(0.0, 0.0), false);
+ absolute = passKeyInfo.addPointArgument("absolute", 0, false);
+ // background = passKeyInfo.addPointArgument("background", GLE_FILL_CLEAR, false);
+ base = passKeyInfo.addDoubleArgumentNoDefault("base", false);
+ passKeyInfo.addArgumentAlias(base, "row");
+ linepos = passKeyInfo.addDoubleArgumentNoDefault("lpos", false);
+ linelen = passKeyInfo.addDoubleArgumentNoDefault("llen", false);
+/*
+ else kw("NOBOX") info.setNoBox(true);
+ else kw("NOLINE") info.setNoLines(true);
+ else kw("COMPACT") info.setCompact(true);
+ else kw("OFF") info.setDisabled(true);
+ else kw("HEI") khei = next_exp;
+ else kw("POSITION") next_str(info.getJustify());
+ else kw("POS") next_str(info.getJustify());
+ else kw("BOXCOLOR") info.setBoxColor(next_color);
+ else kw("SEPARATOR") {
+*/
+ }
+
+public:
+ unsigned int offset;
+ unsigned int margins;
+ unsigned int absolute;
+ unsigned int background;
+ unsigned int base;
+ unsigned int linepos;
+ unsigned int linelen;
+};
+
+class GLEKeyBlockInstance : public GLEBlockInstance {
+public:
+ GLEKeyBlockInstance(GLEKeyBlockBase* parent);
+ virtual ~GLEKeyBlockInstance();
+ virtual void executeLine(GLESourceLine& sline);
+ virtual void endExecuteBlock();
+
+private:
+ KeyInfo m_info;
+ bool m_hasPattern;
+};
+
+GLEKeyBlockInstance::GLEKeyBlockInstance(GLEKeyBlockBase* parent):
+ GLEBlockInstance(parent),
+ m_hasPattern(false)
+{
+}
+
+GLEKeyBlockInstance::~GLEKeyBlockInstance() {
+}
+
+void GLEKeyBlockInstance::executeLine(GLESourceLine& sline) {
+ double zzhei;
+ g_get_hei(&zzhei);
+ begin_init();
+ int st = begin_token(sline, srclin, tk, &ntk, outbuff, true);
+ if (!st) {
+ /* exit loop */
+ return;
+ }
+ /* line count variable*/
+ int ct = 1;
+ KeyEntry* entry = m_info.lastEntry();
+ while (ct <= ntk) {
+ skipspace;
+ kw("OFFSET") {
+ m_info.setOffsetX(next_exp);
+ m_info.setOffsetY(next_exp);
+ }
+ else kw("MARGINS") {
+ double mx = next_exp;
+ double my = next_exp;
+ m_info.setMarginXY(mx, my);
+ }
+ else kw("ABSOLUTE") {
+ if (ct <= ntk-1) {
+ m_info.setOffsetX(next_exp);
+ m_info.setOffsetY(next_exp);
+ }
+ m_info.setAbsolute(true);
+ }
+ else if (!m_hasPattern && str_i_equals(tk[ct],"BACKGROUND")) m_info.setBackgroundColor(next_color);
+ else kw("ROW") m_info.setBase(next_exp);
+ else kw("BASE") m_info.setBase(next_exp);
+ else kw("LPOS") m_info.setLinePos(next_exp);
+ else kw("LLEN") m_info.setLineLen(next_exp);
+ else kw("NOBOX") m_info.setNoBox(true);
+ else kw("NOLINE") m_info.setNoLines(true);
+ else kw("COMPACT") m_info.setCompact(true);
+ else kw("OFF") m_info.setDisabled(true);
+ else kw("HEI") m_info.setHei(next_exp);
+ else kw("POSITION") next_str(m_info.getJustify());
+ else kw("POS") next_str(m_info.getJustify());
+ else kw("BOXCOLOR") m_info.setBoxColor(next_color);
+ else kw("SEPARATOR") {
+ if (entry == 0) {
+ g_throw_parser_error("key: 'separator' should come after a valid key entry");
+ } else {
+ ct++;
+ kw("LSTYLE") {
+ entry->sepstyle = (int)floor(next_exp + 0.5);
+ } else {
+ ct--;
+ }
+ m_info.addColumn();
+ }
+ }
+ else kw("JUSTIFY") {
+ next_str(m_info.getJustify());
+ m_info.setPosOrJust(false);
+ }
+ else kw("JUST") {
+ next_str(m_info.getJustify());
+ m_info.setPosOrJust(false);
+ }
+ else kw("DIST") m_info.setDist(next_exp);
+ else kw("COLDIST") m_info.setColDist(next_exp);
+ else {
+ if (ct == 1) {
+ entry = m_info.createEntry();
+ }
+ if (entry == 0) {
+ return;
+ }
+ kw("TEXT") {
+ next_vquote_cpp(entry->descrip);
+ if (g_get_tex_labels()) {
+ entry->descrip.insert(0, "\\tex{");
+ entry->descrip.append("}");
+ }
+ }
+ else kw("MARKER") {
+ entry->marker = next_marker;
+ }
+ else kw("MSIZE") entry->msize = next_exp;
+ else kw("MSCALE") entry->msize = (next_exp) * zzhei;
+ else kw("COLOR") entry->color = next_color;
+ else kw("TEXTCOLOR") entry->textcolor = next_color;
+ else kw("FILL") {
+ GLERC<GLEColor> fillColor(next_fill);
+ update_color_foreground_and_pattern(entry->fill.get(), fillColor.get());
+ } else kw("PATTERN") {
+ GLERC<GLEColor> fillPattern(next_fill);
+ if (fillPattern->isFill() && fillPattern->getFill()->getFillType() == GLE_FILL_TYPE_PATTERN) {
+ update_color_fill_pattern(entry->fill.get(), static_cast<GLEPatternFill*>(fillPattern->getFill()));
+ } else {
+ g_throw_parser_error("expected fill pattern");
+ }
+ } else kw("BACKGROUND") {
+ GLERC<GLEColor> backColor(next_fill);
+ update_color_fill_background(entry->fill.get(), backColor.get());
+ }
+ else kw("LSTYLE") next_str(entry->lstyle);
+ else kw("LINE") strcpy(entry->lstyle, "1");
+ else kw("LWIDTH") entry->lwidth = next_exp;
+ else g_throw_parser_error("unrecognised KEY sub command: '", tk[ct], "'");
+ }
+ ct++;
+ }
+}
+
+void GLEKeyBlockInstance::endExecuteBlock() {
+ draw_key(&m_info);
+}
+
+GLEKeyBlockBase::GLEKeyBlockBase():
+ GLEBlockWithSimpleKeywords("key", false)
+{
+ const char* commands[] = {
+ "OFFSET", "MARGINS", "ABSOLUTE", "BACKGROUND", "ROW",
+ "BASE", "LPOS", "LLEN", "NOBOX", "NOLINE", "COMPACT",
+ "OFF", "HEI", "POSITION", "POS", "BOXCOLOR", "SEPARATOR",
+ "LSTYLE", "JUSTIFY", "JUST", "DIST", "COLDIST", "TEXT",
+ "MARKER", "MSIZE", "MSCALE", "COLOR", "TEXTCOLOR", "FILL",
+ "PATTERN", "LINE", "LWIDTH", ""};
+ for (int i = 0; commands[i][0] != 0; ++i) {
+ addKeyWord(commands[i]);
+ }
+}
+
+GLEKeyBlockBase::~GLEKeyBlockBase()
+{
+}
+
+GLEBlockInstance* GLEKeyBlockBase::beginExecuteBlockImpl(GLESourceLine& /* sline */, int* /* pcode */, int* /* cp */) {
+ return new GLEKeyBlockInstance(this);
+}
+
+KeyRCInfo::KeyRCInfo() {
+ size = 0.0;
+ offs = 0.0;
+ descent = 0.0;
+ elems = 0;
+ mleft = 0.0;
+ mright = 0.0;
+ m_Line = false;
+ m_Marker = false;
+ m_Fill = false;
+}
+
+KeyRCInfo::KeyRCInfo(const KeyRCInfo& other) {
+ size = other.size;
+ offs = other.offs;
+ descent = other.descent;
+ elems = other.elems;
+ mleft = other.mleft;
+ mright = other.mright;
+ m_Line = other.m_Line;
+ m_Marker = other.m_Marker;
+ m_Fill = other.m_Fill;
+}
+
+KeyInfo::KeyInfo() {
+ m_MaxRow = 0;
+ m_NoBox = false;
+ m_Fill = false;
+ m_MarginX = -1e30;
+ m_MarginY = -1e30;
+ m_Hei = 0.0;
+ m_Base = 0.0;
+ m_TotHei = 0.0;
+ m_ColDist = -1e30;
+ m_Dist = -1e30;
+ m_LinePos = -1e30;
+ m_LineLen = -1e30;
+ m_OffsX = 0.0;
+ m_OffsY = 0.0;
+ m_PosOrJust = true;
+ m_Absolute = false;
+ m_HasOffset = false;
+ m_HasBoxColor = false;
+ m_Compact = false;
+ m_NoLines = false;
+ m_Disabled = false;
+ m_BoxColor = 0;
+ m_ExtraY = 0.0;
+ m_BackgroundColor = g_get_fill_clear();
+ m_col = 0;
+ strcpy(m_Justify, "");
+}
+
+KeyInfo::~KeyInfo() {
+ for (size_t i = 0; i < m_entries.size(); ++i) {
+ delete m_entries[i];
+ }
+}
+
+void KeyInfo::setOffsetX(double x) {
+ m_OffsX = x;
+ m_HasOffset = true;
+}
+
+void KeyInfo::setOffsetY(double y) {
+ m_OffsY = y;
+ m_HasOffset = true;
+}
+
+void KeyInfo::setBoxColor(const GLERC<GLEColor>& col) {
+ m_BoxColor = col;
+ m_HasBoxColor = true;
+}
+
+void KeyInfo::initPosition() {
+ if (m_Justify[0] == 0) {
+ // no justify or position given
+ if (hasOffset()) {
+ strcpy(m_Justify, "BL");
+ setPosOrJust(false);
+ } else {
+ strcpy(m_Justify, "TR");
+ setPosOrJust(true);
+ }
+ }
+}
+
+KeyRCInfo* KeyInfo::expandToCol(int col) {
+ while ((int)m_ColInfo.size() <= col) {
+ m_ColInfo.push_back(KeyRCInfo());
+ }
+ return &m_ColInfo[col];
+}
+
+void KeyInfo::expandToRow(int row) {
+ while ((int)m_RowInfo.size() <= row) {
+ m_RowInfo.push_back(KeyRCInfo());
+ }
+}
+
+KeyEntry* KeyInfo::createEntry() {
+ KeyEntry* entry = new KeyEntry(m_col);
+ m_entries.push_back(entry);
+ return entry;
+}
+
+KeyEntry* KeyInfo::lastEntry() {
+ if (m_entries.empty()) {
+ return 0;
+ } else {
+ return m_entries.back();
+ }
+}
+
+void draw_key(KeyInfo* info) {
+ if (info->getNbEntries() == 0) {
+ return;
+ }
+ GLEPoint savept;
+ g_get_xy(&savept);
+ if (info->getBackgroundColor()->isTransparent()) {
+ info->setBackgroundColor(g_get_color_hex(GLE_COLOR_WHITE));
+ }
+ measure_key(info);
+ draw_key_after_measure(info);
+ g_move(savept);
+}
+
+void measure_key_v_recent(KeyInfo* info, GLEPoint* orig) {
+ /* Add separator dist */
+ for (int i = 0; i < info->getNbEntries(); i++) {
+ info->getCol(info->getEntry(i)->column)->size += info->getEntry(i)->sepdist;
+ }
+ /* Compute sum of column widths and max number of rows */
+ int maxrow = 0;
+ double sumwid = 0.0;
+ for (int i = 0; i < info->getNbCols(); i++) {
+ sumwid += info->getCol(i)->size;
+ if (info->getCol(i)->elems > maxrow) maxrow = info->getCol(i)->elems;
+ }
+ info->setMaxRow(maxrow);
+ /* Initialize offsets for each column */
+ double rowhi = info->getBase();
+ info->getCol(0)->offs = 0.0;
+ for (int i = 1; i < info->getNbCols(); i++) {
+ double entry_wd = 0.0;
+ KeyRCInfo* prev_col = info->getCol(i-1);
+ if (prev_col->hasLine() && !info->isCompact() && !info->isNoLines()) {
+ entry_wd += info->getLineLen() + info->getDist();
+ }
+ if (prev_col->hasMarker()) entry_wd += info->getDist();
+ if (prev_col->hasFill()) entry_wd += KEY_FILL_HEI_FX*rowhi + info->getDist();
+ info->getCol(i)->offs = prev_col->offs + prev_col->size + entry_wd + info->getColDist() +
+ prev_col->mleft + prev_col->mright;
+ }
+ /* Initialize offsets for each row */
+ double rowoffs = 0.0;
+ for (int i = info->getNbRows()-2; i >= 0; i--) {
+ double prev_rowhi = info->getRow(i)->descent * 1.3 + info->getRow(i+1)->size * 1.1;
+ if (rowhi > prev_rowhi) prev_rowhi = rowhi;
+ rowoffs += prev_rowhi;
+ info->getRow(i)->offs = rowoffs;
+ }
+ /* Measure entire key */
+ GLEMeasureBox measure;
+ measure.measureStart();
+ do_draw_key(0.0, 0.0, true, info);
+ measure.measureEnd();
+ double sx = measure.getWidth()+2*info->getMarginX();
+ double sy = measure.getHeight()+2*info->getMarginY();
+ info->setTotalHei(sy);
+ info->setExtraY(0.0);
+ // Make sure text does not go out of box
+ double b_descent = info->getRow(info->getNbRows()-1)->descent;
+ if (b_descent * 1.3 > info->getMarginY()) {
+ info->setExtraY(b_descent * 1.3 - info->getMarginY());
+ sy += info->getExtraY();
+ }
+ double ox, oy;
+ double dx = info->getOffsetX();
+ double dy = info->getOffsetY();
+ if (info->isPosOrJust()) {
+ /* Relative to graph */
+ double midx = graph_x1 + (graph_x2-graph_x1)/2;
+ double midy = graph_y1 + (graph_y2-graph_y1)/2;
+ if (dx < 0.0) dx = dx-sx;
+ if (dy < 0.0) dy = dy-sy;
+ if (str_i_equals(info->getJustify(),"TL")) { ox = graph_x1+dx; oy = graph_y2-sy-dy; }
+ else if (str_i_equals(info->getJustify(),"BL")) { ox = graph_x1+dx; oy = graph_y1+dy; }
+ else if (str_i_equals(info->getJustify(),"BR")) { ox = graph_x2-sx-dx; oy = graph_y1+dy; }
+ else if (str_i_equals(info->getJustify(),"TR")) { ox = graph_x2-sx-dx; oy = graph_y2-sy-dy; }
+ else if (str_i_equals(info->getJustify(),"TC")) { ox = midx-sx/2+dx; oy = graph_y2-sy-dy; }
+ else if (str_i_equals(info->getJustify(),"BC")) { ox = midx-sx/2+dx; oy = graph_y1+dy; }
+ else if (str_i_equals(info->getJustify(),"RC")) { ox = graph_x2-sx-dx; oy = midy-sy/2+dy; }
+ else if (str_i_equals(info->getJustify(),"LC")) { ox = graph_x1+dx; oy = midy-sy/2+dy; }
+ else if (str_i_equals(info->getJustify(),"CC")) { ox = midx-sx/2+dx; oy = midy-sy/2+dy; }
+ else {
+ if (strlen(info->getJustify())>0) gprint("Expecting POS BL,BR,TR or TL\n");
+ ox = graph_x2-sx; oy = graph_y2-sy;
+ }
+ } else {
+ ox = dx; oy = dy;
+ if (!info->isAbsolute()) {
+ ox += orig->getX();
+ oy += orig->getY();
+ }
+ /* Support different relative positions for offset command */
+ if (str_i_equals(info->getJustify(),"TL")) { oy -= sy; }
+ else if (str_i_equals(info->getJustify(),"BR")) { ox -= sx; }
+ else if (str_i_equals(info->getJustify(),"TR")) { ox -= sx; oy -= sy; }
+ else if (str_i_equals(info->getJustify(),"TC")) { ox -= sx/2; oy -= sy; }
+ else if (str_i_equals(info->getJustify(),"BC")) { ox -= sx/2; }
+ else if (str_i_equals(info->getJustify(),"RC")) { ox -= sx; oy -= sy/2; }
+ else if (str_i_equals(info->getJustify(),"LC")) { oy -= sy/2; }
+ else if (str_i_equals(info->getJustify(),"CC")) { ox -= sx/2; oy -= sy/2; }
+ }
+ info->getRect()->setDimensions(ox, oy, ox+sx, oy+sy);
+ info->getComputedMargins()->setXY(info->getMarginX()-measure.getXMin(), info->getMarginY()-measure.getYMin());
+}
+
+void measure_key_v35(KeyInfo* info, GLEPoint* orig) {
+ double sx = 0;
+ double cr = info->getBase();
+ KeyRCInfo* col_info = info->getCol(0);
+ if (col_info->hasLine()) sx = sx + 2*cr;
+ if (col_info->hasMarker()) sx = sx + 1.5*cr;
+ if (col_info->hasFill()) sx = sx + 1.3*cr;
+ sx = sx + col_info->size;
+ sx = sx + 1.2*cr;
+ double sy = info->getNbEntries()*cr + 1.2*cr-0.3*info->getHei();
+ double ox, oy;
+ if (!info->hasOffset()) {
+ double midx = graph_x1 + (graph_x2-graph_x1)/2;
+ double midy = graph_y1 + (graph_y2-graph_y1)/2;
+ if (str_i_equals(info->getJustify(),"TL")) {ox = graph_x1;oy = graph_y2-sy;}
+ else if (str_i_equals(info->getJustify(),"BL")) {ox = graph_x1; oy = graph_y1;}
+ else if (str_i_equals(info->getJustify(),"BR")) {ox = graph_x2-sx;oy = graph_y1;}
+ else if (str_i_equals(info->getJustify(),"TR")) {ox = graph_x2-sx; oy = graph_y2-sy;}
+ else if (str_i_equals(info->getJustify(),"TC")) {ox = midx-sx/2; oy = graph_y2-sy;}
+ else if (str_i_equals(info->getJustify(),"BC")) {ox = midx-sx/2; oy = graph_y1;}
+ else if (str_i_equals(info->getJustify(),"RC")) {ox = graph_x2-sx; oy = midy-sy/2;}
+ else if (str_i_equals(info->getJustify(),"LC")) {ox = graph_x1; oy = midy-sy/2;}
+ else if (str_i_equals(info->getJustify(),"CC")) {ox = midx-sx/2; oy = midy-sy/2;}
+ else {
+ if (strlen(info->getJustify())>0) gprint("Expecting POS BL,BR,TR or TL\n");
+ ox = graph_x2-sx; oy = graph_y2-sy;
+ }
+ } else {
+ ox = orig->getX() + info->getOffsetX();
+ oy = orig->getY() + info->getOffsetY();
+ }
+ info->getRect()->setDimensions(ox, oy, ox+sx, oy+sy);
+}
+
+void do_draw_key_v35(double ox, double oy, KeyInfo* info){
+ double cr = info->getBase();
+ KeyRCInfo* col_info = info->getCol(0);
+ g_set_hei(info->getHei());
+ for (int i = info->getNbEntries() - 1; i >= 0; i--) {
+ KeyEntry* entry = info->getEntry(i);
+ g_move(ox+0.6*cr, oy+0.6*cr+cr*(info->getNbEntries()-i-1));
+ if (!entry->color.isNull()) {
+ g_set_color(entry->color);
+ }
+ if (col_info->hasMarker()) {
+ g_rmove(cr/2, info->getHei()*.35);
+ double z = entry->msize;
+ if (z==0) z = info->getHei();
+ if (entry->marker!=0) g_marker(entry->marker, z);
+ g_rmove(cr, -info->getHei()*.35);
+ }
+ if (col_info->hasLine()) {
+ double savelw;
+ g_set_line_style(entry->lstyle);
+ g_get_line_width(&savelw);
+ g_set_line_width(entry->lwidth);
+ g_rmove(0.0, cr*.3);
+ if (entry->lstyle[0] == 0) g_rmove(1.5*cr, 0.0);
+ else g_rline(1.5*cr, 0.0);
+ g_rmove(cr/2, -cr*.3);
+ g_set_line_style("1");
+ g_set_line_width(savelw);
+ }
+ if (col_info->hasFill()) {
+ if (entry->hasFill()) {
+ g_set_fill(entry->fill);
+ double cx, cy;
+ g_get_xy(&cx,&cy);
+ g_box_fill(cx,cy,cx+cr*.7, cy+cr*.66);
+ g_box_stroke(cx,cy,cx+cr*.7, cy+cr*.66);
+ }
+ g_rmove(1.3*cr, 0.0);
+ }
+ if (!entry->color.isNull()) {
+ g_set_color(info->getDefaultColor());
+ }
+ g_set_just(JUST_LEFT);
+ if (entry->descrip != "") g_text((char*)entry->descrip.c_str());
+ }
+}
+
+void measure_key(KeyInfo* info) {
+ GLEPoint orig;
+ double save_hei;
+ GLERectangle save_bounds;
+ /* Initialize */
+ info->initPosition();
+ g_get_xy(&orig);
+ GLERC<GLEColor> old_color(g_get_color());
+ GLERC<GLEColor> old_fill(g_get_fill());
+ g_get_hei(&save_hei);
+ g_get_bounds(&save_bounds);
+ if (!info->hasHei()) {
+ info->setHei(save_hei);
+ }
+ double khei = info->getHei();
+ if (!info->hasBase()) {
+ info->setBase(1.2*khei);
+ }
+ double rowhi = info->getBase();
+ info->setDefaultColor(old_color);
+ /* Init margins */
+ double margin_x = 0.45*rowhi;
+ double margin_y = 0.45*rowhi;
+ if (info->hasMargins()) {
+ margin_x = info->getMarginX();
+ margin_y = info->getMarginY();
+ } else {
+ info->setMarginXY(margin_x, margin_y);
+ }
+ if (!info->hasColDist()) {
+ info->setColDist(margin_x);
+ }
+ if (!info->hasDist()) {
+ info->setDist(margin_x * 0.85);
+ }
+ if (!info->hasLineLen()) {
+ info->setLineLen(1.5*rowhi);
+ }
+ /* Use fill somewhere? */
+ for (int i = 0; i < info->getNbEntries(); i++) {
+ if (info->getEntry(i)->hasFill()) {
+ info->setHasFill(true);
+ }
+ }
+ /* Empty key? */
+ if (info->getNbEntries() == 0) {
+ return;
+ }
+ /* Use dummy device for measurements */
+ GLEDevice* old_device = g_set_dummy_device();
+ /* Measure all labels and count rows in each column */
+ g_set_hei(khei);
+ // cout << "key height: " << khei << endl;
+ double linePos = GLE_INF;
+ for (int i = 0; i < info->getNbEntries(); i++) {
+ KeyEntry* entry = info->getEntry(i);
+ int col = entry->column;
+ KeyRCInfo* colinfo = info->expandToCol(col);
+ int row = colinfo->elems;
+ info->expandToRow(row);
+ if (!str_only_space(entry->descrip)) {
+ double bl, br, bu, bd;
+ g_measure(entry->descrip,&bl,&br,&bu,&bd);
+ if (colinfo->size < br) colinfo->size = br;
+ if (-bd > info->getRow(row)->descent) info->getRow(row)->descent = -bd;
+ // size should not include descent, only ascent of the text
+ if (bu > info->getRow(row)->size) info->getRow(row)->size = bu;
+ // cout << "key = " << entry->descrip << " bl = " << bl << " br = " << br << " bu = " << bu << " bd = " << bd << endl;
+ if (bu/2 < linePos) linePos = bu/2;
+ }
+ /* Set booleans: kl = lstyle, km = marker, kf = fill */
+ if (entry->lstyle[0] == 0 && entry->lwidth > 0) {
+ strcpy(entry->lstyle, "1");
+ }
+ if (entry->lstyle[0] != 0) colinfo->setHasLine(true);
+ if (entry->lwidth > 0) colinfo->setHasLine(true);
+ if (entry->marker != 0) colinfo->setHasMarker(true);
+ if (entry->hasFill()) {
+ colinfo->setHasFill(true);
+ }
+ /* Adjust row height in case of fill */
+ if (info->hasFill()) {
+ if (rowhi*KEY_FILL_HEI_FY > info->getRow(row)->size) {
+ // Row should have at least the height of the fill box
+ info->getRow(row)->size = rowhi*KEY_FILL_HEI_FY;
+ }
+ }
+ if (entry->marker != 0) {
+ double z = entry->msize;
+ if (z == 0) z = khei;
+ GLEMeasureBox marksize;
+ marksize.measureStart();
+ g_move(0.0, 0.0);
+ g_marker(entry->marker,z);
+ marksize.measureEnd();
+ if (info->isCompact() && !info->isNoLines()) {
+ double yval = marksize.getYMin();
+ double llen = info->getLineLen();
+ marksize.updateRange(-llen/2, yval);
+ marksize.updateRange(+llen/2, yval);
+ }
+ if (info->getCol(col)->mleft < -marksize.getXMin()) info->getCol(col)->mleft = -marksize.getXMin();
+ if (info->getCol(col)->mright < marksize.getXMax()) info->getCol(col)->mright = marksize.getXMax();
+ } else if (info->isCompact() && colinfo->hasLine() && !info->isNoLines()) {
+ // compact mode, but no marker in this column!
+ double llen = info->getLineLen();
+ if (info->getCol(col)->mleft < llen/2) info->getCol(col)->mleft = llen/2;
+ if (info->getCol(col)->mright < llen/2) info->getCol(col)->mright = llen/2;
+ colinfo->setHasMarker(true);
+ }
+ info->getCol(col)->elems++;
+ }
+ /* Set linePos based to half of the fill block */
+ if (info->hasFill()) {
+ linePos = rowhi*KEY_FILL_HEI_FY/2;
+ }
+ if (!info->hasLinePos()) {
+ // Baseline for text
+ info->setLinePos(linePos);
+ }
+ if (g_get_compatibility() <= GLE_COMPAT_35) {
+ g_restore_device(old_device);
+ measure_key_v35(info, &orig);
+ } else {
+ measure_key_v_recent(info, &orig);
+ g_restore_device(old_device);
+ }
+ g_set_bounds(&save_bounds);
+ g_set_color(old_color);
+ g_set_fill(old_fill);
+ g_set_hei(save_hei);
+}
+
+void draw_key_after_measure(KeyInfo* info) {
+ if (info->getNbEntries() == 0 || info->isDisabled()) {
+ return;
+ }
+ double save_hei;
+ g_get_hei(&save_hei);
+ GLERC<GLEColor> old_color(g_get_color());
+ GLERC<GLEColor> old_fill(g_get_fill());
+ double ox = info->getRect()->getXMin();
+ double oy = info->getRect()->getYMin();
+ if (!info->getNoBox() && !info->getBackgroundColor()->isTransparent()) {
+ g_set_fill(info->getBackgroundColor());
+ g_box_fill(info->getRect());
+ }
+ if (g_get_compatibility() <= GLE_COMPAT_35) {
+ do_draw_key_v35(ox, oy, info);
+ } else {
+ do_draw_key(ox+info->getComputedMargins()->getX(), oy+info->getComputedMargins()->getY()+info->getExtraY(), false, info);
+ int prev_col = 0;
+ for (int i = 0; i < info->getNbEntries(); i++) {
+ if (prev_col != info->getEntry(i)->column) {
+ prev_col = info->getEntry(i)->column;
+ if (i >= 1 && info->getEntry(i - 1)->sepstyle != -1) {
+ char msep[9];
+ // should implement g_set_line_style that takes int
+ sprintf(msep, "%d", info->getEntry(i - 1)->sepstyle);
+ g_set_line_style(msep);
+ double xsep = ox+info->getComputedMargins()->getX()+info->getCol(prev_col)->offs-info->getColDist()/2;
+ g_move(xsep, oy);
+ g_line(xsep, info->getRect()->getYMax());
+ g_set_line_style("1");
+ }
+ }
+ }
+ }
+ if (!info->getNoBox()) g_box_stroke(info->getRect());
+ g_set_fill(old_fill);
+ g_set_color(old_color);
+ g_set_hei(save_hei);
+}
+
+void do_draw_key(double ox, double oy, bool notxt, KeyInfo* info) {
+ double savelw;
+ double cx, cy;
+ /* Draw all labels */
+ int row = 0;
+ int prev_col = 0;
+ double khei = info->getHei();
+ double rowhi = info->getBase();
+ g_set_hei(khei);
+ for (int i = 0; i < info->getNbEntries(); i++) {
+ KeyEntry* entry = info->getEntry(i);
+ if (prev_col != entry->column) {
+ row = 0;
+ prev_col = entry->column;
+ }
+ KeyRCInfo* col_info = info->getCol(prev_col);
+ cx = ox+col_info->offs;
+ cy = oy+info->getRow(row)->offs;
+ g_move(cx, cy);
+ g_update_bounds(cx, cy);
+ if (!entry->color.isNull()) {
+ g_set_color(entry->color);
+ }
+ if (col_info->hasMarker()) {
+ g_rmove(col_info->mleft, info->getLinePos());
+ g_get_line_width(&savelw);
+ g_set_line_width(entry->lwidth);
+ if (col_info->hasLine() && info->isCompact() && !info->isNoLines() && entry->lstyle[0] != 0) {
+ g_set_line_style(entry->lstyle);
+ g_rmove(-info->getLineLen()/2, 0.0);
+ g_rline(info->getLineLen(), 0.0);
+ g_rmove(-info->getLineLen()/2, 0.0);
+ g_set_line_style("1");
+ }
+ if (entry->marker != 0) {
+ double z = entry->msize;
+ if (z == 0) z = khei;
+ g_marker(entry->marker, z);
+ }
+ g_set_line_width(savelw);
+ g_rmove(col_info->mright+info->getDist(),-info->getLinePos());
+ }
+ if (col_info->hasLine() && !info->isCompact() && !info->isNoLines()) {
+ g_set_line_style(entry->lstyle);
+ g_get_line_width(&savelw);
+ g_set_line_width(entry->lwidth);
+ g_rmove(0.0,info->getLinePos());
+ if (entry->lstyle[0]==0) g_rmove(info->getLineLen(),0.0);
+ else g_rline(info->getLineLen(),0.0);
+ g_rmove(info->getDist(),-info->getLinePos());
+ g_set_line_style("1");
+ g_set_line_width(savelw);
+ }
+ if (!entry->color.isNull()) {
+ g_set_color(info->getDefaultColor());
+ }
+ if (col_info->hasFill()) {
+ if (entry->hasFill()) {
+ g_set_fill(entry->fill);
+ g_get_xy(&cx,&cy);
+ g_box_fill(cx,cy,cx+rowhi*KEY_FILL_HEI_FX, cy+rowhi*KEY_FILL_HEI_FY);
+ GLERC<GLEColor> save_color(g_get_color());
+ if (info->hasBoxColor()) {
+ GLERC<GLEColor> boxcolor = info->getBoxColor();
+ if (!boxcolor->isTransparent()) {
+ g_set_color(boxcolor);
+ g_box_stroke(cx,cy,cx+rowhi*KEY_FILL_HEI_FX, cy+rowhi*KEY_FILL_HEI_FY);
+ g_set_color(save_color);
+ }
+ } else {
+ g_box_stroke(cx,cy,cx+rowhi*KEY_FILL_HEI_FX, cy+rowhi*KEY_FILL_HEI_FY);
+ }
+ }
+ g_rmove(KEY_FILL_HEI_FX*rowhi + info->getDist(), 0.0);
+ }
+ g_get_xy(&cx,&cy);
+ if (!notxt) {
+ g_set_just(JUST_LEFT);
+ if (entry->descrip != "") {
+ g_set_color(entry->textcolor);
+ g_text((char*)entry->descrip.c_str());
+ if (!entry->textcolor.isNull()) {
+ g_set_color(info->getDefaultColor());
+ }
+ }
+ } else {
+ g_update_bounds(cx+col_info->size, cy+info->getRow(row)->size);
+ }
+ row++;
+ }
+}
+
+KeyEntry::KeyEntry(int col) {
+ column = col;
+ sepstyle = -1;
+ sepdist = 0.0;
+ lstyle[0] = 0;
+ lwidth = 0.0;
+ color = 0;
+ marker = 0;
+ msize = 0.0;
+ fill = new GLEColor();
+ fill->setTransparent(true);
+}
+
+KeyEntry::~KeyEntry() {
+}
+
+bool KeyEntry::hasFill() const {
+ return !fill.isNull() && !fill->isTransparent();
+}
diff --git a/src/gle/key.h b/src/gle/key.h
new file mode 100644
index 0000000..ba75cbf
--- /dev/null
+++ b/src/gle/key.h
@@ -0,0 +1,188 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#ifndef INC_KEY_H
+#define INC_KEY_H
+
+class GLEKeyBlockBase : public GLEBlockWithSimpleKeywords {
+public:
+ GLEKeyBlockBase();
+ virtual ~GLEKeyBlockBase();
+
+ virtual GLEBlockInstance* beginExecuteBlockImpl(GLESourceLine& sline, int *pcode, int *cp);
+};
+
+class KeyEntry {
+public:
+ char lstyle[9];
+ GLERC<GLEColor> color;
+ GLERC<GLEColor> textcolor;
+ GLERC<GLEColor> fill;
+ int marker;
+ int column;
+ double msize,lwidth;
+ string descrip;
+ int sepstyle;
+ double sepdist;
+public:
+ KeyEntry(int col);
+ ~KeyEntry();
+ bool hasFill() const;
+};
+
+class KeyRCInfo {
+public:
+ double size;
+ double offs;
+ double descent;
+ double mleft;
+ double mright;
+ int elems;
+ bool m_Line, m_Marker, m_Fill;
+public:
+ KeyRCInfo();
+ KeyRCInfo(const KeyRCInfo& other);
+ inline bool hasLine() { return m_Line; }
+ inline bool hasMarker() { return m_Marker; }
+ inline bool hasFill() { return m_Fill; }
+ inline void setHasLine(bool val) { m_Line = val; }
+ inline void setHasMarker(bool val) { m_Marker = val; }
+ inline void setHasFill(bool val) { m_Fill = val; }
+};
+
+class KeyInfo {
+protected:
+ int m_MaxRow;
+ GLERC<GLEColor> m_Color;
+ GLERC<GLEColor> m_BoxColor;
+ GLERC<GLEColor> m_BackgroundColor;
+ vector<KeyRCInfo> m_ColInfo;
+ vector<KeyRCInfo> m_RowInfo;
+ vector<KeyEntry*> m_entries;
+ double m_Hei, m_Base, m_LinePos, m_LineLen, m_ExtraY;
+ double m_MarginX, m_MarginY, m_TotHei, m_ColDist, m_Dist;
+ double m_OffsX, m_OffsY;
+ bool m_PosOrJust, m_Absolute, m_HasOffset, m_HasBoxColor, m_NoBox, m_Fill;
+ bool m_Compact, m_NoLines, m_Disabled;
+ char m_Justify[34];
+ GLEPoint m_ComputedMargins;
+ GLERectangle m_Rect;
+ int m_col;
+
+public:
+ KeyInfo();
+ ~KeyInfo();
+ KeyRCInfo* expandToCol(int col);
+ void expandToRow(int row);
+ void setOffsetX(double x);
+ void setOffsetY(double y);
+ void setBoxColor(const GLERC<GLEColor>& col);
+ void initPosition();
+ KeyEntry* createEntry();
+ KeyEntry* lastEntry();
+ inline void addColumn() { m_col++; }
+ inline GLERC<GLEColor> getBackgroundColor() { return m_BackgroundColor; }
+ inline void setBackgroundColor(const GLERC<GLEColor>& col) { m_BackgroundColor = col; }
+ inline bool hasFill() { return m_Fill; }
+ inline void setHasFill(bool val) { m_Fill = val; }
+ inline double getOffsetX() { return m_OffsX; }
+ inline double getOffsetY() { return m_OffsY; }
+ inline bool isPosOrJust() { return m_PosOrJust; }
+ inline void setPosOrJust(bool pj) { m_PosOrJust = pj; }
+ inline bool isAbsolute() { return m_Absolute; }
+ inline void setAbsolute(bool abs) { m_Absolute = abs; }
+ inline bool hasOffset() { return m_HasOffset; }
+ inline char* getJustify() { return m_Justify; }
+ inline int getMaxRow() { return m_MaxRow; }
+ inline void setMaxRow(int row) { m_MaxRow = row; }
+ inline KeyRCInfo* getCol(int i) { return &m_ColInfo[i]; }
+ inline int getNbCols() { return m_ColInfo.size(); }
+ inline KeyRCInfo* getRow(int i) { return &m_RowInfo[i]; }
+ inline int getNbRows() { return m_RowInfo.size(); }
+ inline GLERC<GLEColor> getDefaultColor() { return m_Color; }
+ inline void setDefaultColor(const GLERC<GLEColor>& col) { m_Color = col; }
+ inline double getHei() { return m_Hei; }
+ inline bool hasHei() { return m_Hei != 0.0; }
+ inline void setHei(double hei) { m_Hei = hei; }
+ inline double getBase() { return m_Base; }
+ inline bool hasBase() { return m_Base != 0.0; }
+ inline void setBase(double base) { m_Base = base; }
+ inline bool getNoBox() { return m_NoBox; }
+ inline void setNoBox(bool nb) { m_NoBox = nb; }
+ inline double getMarginX() { return m_MarginX; }
+ inline double getMarginY() { return m_MarginY; }
+ inline void setMarginXY(double mx, double my) { m_MarginX = mx; m_MarginY = my; }
+ inline bool hasMargins() { return m_MarginX > -1e20; }
+ inline double getTotalHei() { return m_TotHei; }
+ inline void setTotalHei(double hei) { m_TotHei = hei; }
+ inline double getColDist() { return m_ColDist; }
+ inline void setColDist(double dist) { m_ColDist = dist; }
+ inline bool hasColDist() { return m_ColDist > -1e20; }
+ inline double getDist() { return m_Dist; }
+ inline void setDist(double dist) { m_Dist = dist; }
+ inline bool hasDist() { return m_Dist >= 0; }
+ inline bool hasLinePos() { return m_LinePos >= 0; }
+ inline double getLinePos() { return m_LinePos; }
+ inline void setLinePos(double pos) { m_LinePos = pos; }
+ inline bool hasLineLen() { return m_LineLen >= 0; }
+ inline double getLineLen() { return m_LineLen; }
+ inline void setLineLen(double Len) { m_LineLen = Len; }
+ inline GLERC<GLEColor> getBoxColor() { return m_BoxColor; }
+ inline bool hasBoxColor() { return m_HasBoxColor; }
+ inline bool isCompact() { return m_Compact; }
+ inline bool isNoLines() { return m_NoLines; }
+ inline void setCompact(bool val) { m_Compact = val; }
+ inline void setNoLines(bool val) { m_NoLines = val; }
+ inline GLERectangle* getRect() { return &m_Rect; }
+ inline GLEPoint* getComputedMargins() { return &m_ComputedMargins; }
+ inline int getNbEntries() { return m_entries.size(); }
+ inline double getExtraY() { return m_ExtraY; }
+ inline void setExtraY(double v) { m_ExtraY = v; }
+ inline void setDisabled(bool dis) { m_Disabled = dis; }
+ inline bool isDisabled() { return m_Disabled; }
+ inline KeyEntry* getEntry(int i) { return m_entries[i]; }
+};
+
+void draw_key(KeyInfo* info);
+void measure_key(KeyInfo* info);
+void draw_key_after_measure(KeyInfo* info);
+
+void do_draw_key(double ox, double oy, bool notxt, KeyInfo* info);
+
+
+#endif
diff --git a/src/gle/keyword.cpp b/src/gle/keyword.cpp
new file mode 100644
index 0000000..7bbd775
--- /dev/null
+++ b/src/gle/keyword.cpp
@@ -0,0 +1,250 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#include "all.h"
+#include "cutils.h"
+#include "keyword.h"
+
+/*------------------------------------------------------------------*/
+/* Find the KEY WORD *cp, and return it's number */
+/*------------------------------------------------------------------*/
+/* */
+/* You can add a function, you MUST place it in alphabetical order */
+/* and give it the next unused index number */
+/* *** 50 is RESERVED for assignment *** */
+/* when adding you need to edit pass.cpp and run.cpp */
+/* CURRENT MAX IS 89 next command number is 90 */
+/*------------------------------------------------------------------*/
+
+#define NKEYS (sizeof mkeywfn / sizeof(struct mkeyw))
+struct mkeyw { const char *word; int index; } mkeywfn[] = {
+ { "!", GLE_KW_COMMENT },
+ { "ABOUND", GLE_KW_ABOUND },
+ { "ALINE", GLE_KW_ALINE },
+ { "AMOVE", GLE_KW_AMOVE },
+ { "ARC", GLE_KW_ARC },
+ { "ARCTO", GLE_KW_ARCTO },
+ { "ASETPOS", GLE_KW_ASETPOS },
+ { "Assignment", GLE_KW_ASSIGNMENT },
+ { "BEGIN", GLE_KW_BEGIN },
+ { "BEZIER", GLE_KW_BEZIER },
+ { "BIGFILE", GLE_KW_BIGFILE },
+ { "BITMAP", GLE_KW_BITMAP },
+ { "BITMAP_INFO", GLE_KW_BITMAP_INFO },
+ { "BOX", GLE_KW_BOX },
+ { "CALL", GLE_KW_CALL },
+ { "CIRCLE", GLE_KW_CIRCLE },
+ { "CLOSEPATH", GLE_KW_CLOSEPATH },
+ { "COLORMAP", GLE_KW_COLORMAP },
+ { "COMPATIBILITY", GLE_KW_COMPATIBILITY },
+ { "CURVE", GLE_KW_CURVE },
+ { "DECLARE", GLE_KW_DECLARESUB },
+ { "DEFAULT", GLE_KW_DEFAULT },
+ { "DEFCOLOR", GLE_KW_DEFCOLOR },
+ { "DEFINE", GLE_KW_DEFINE },
+ { "DEFMARKER", GLE_KW_DEFMARKER },
+ { "DFONT", GLE_KW_DFONT },
+ { "DRAW", GLE_KW_DRAW },
+ { "ELLIPSE", GLE_KW_ELLIPSE },
+ { "ELLIPTICAL_ARC", GLE_KW_ELLIPTICAL_ARC },
+ { "ELLIPTICAL_NARC", GLE_KW_ELLIPTICAL_NARC },
+ { "ELSE", GLE_KW_ELSE },
+ { "END", GLE_KW_END },
+ { "FCLOSE", GLE_KW_FCLOSE },
+ { "FGETLINE", GLE_KW_FGETLINE },
+ { "FILL", GLE_KW_FILL },
+ { "FOPEN", GLE_KW_FOPEN },
+ { "FOR", GLE_KW_FOR },
+ { "FREAD", GLE_KW_FREAD },
+ { "FREADLN", GLE_KW_FREADLN },
+ { "FTOKENIZER", GLE_KW_FTOKENIZER },
+ { "FWRITE", GLE_KW_FWRITE },
+ { "FWRITELN", GLE_KW_FWRITELN },
+ { "GOTO", GLE_KW_GOTO },
+ { "GRESTORE", GLE_KW_GRESTORE },
+ { "GSAVE", GLE_KW_GSAVE },
+ { "ICON", GLE_KW_ICON },
+ { "IF", GLE_KW_IF },
+ { "INCLUDE", GLE_KW_INCLUDE },
+ { "INPUT", GLE_KW_INPUT },
+ { "JOIN", GLE_KW_JOIN },
+ { "MARGINS", GLE_KW_MARGINS },
+ { "MARKER", GLE_KW_MARKER },
+ { "MOVE", GLE_KW_MOVE },
+ { "NAME", GLE_KW_NAME },
+ { "NARC", GLE_KW_NARC },
+ { "NEWPATH", GLE_KW_NEWPATH },
+ { "NEXT", GLE_KW_NEXT },
+ { "ORIENTATION", GLE_KW_ORIENTATION },
+ { "PAPERSIZE", GLE_KW_PAPERSIZE },
+ { "PIE", GLE_KW_PIE },
+ { "POSTSCRIPT", GLE_KW_POSTSCRIPT },
+ { "PRINT", GLE_KW_PRINT },
+ { "PSBBTWEAK", GLE_KW_PSBBTWEAK },
+ { "PSCOMMENT", GLE_KW_PSCOMMENT },
+ { "RBEZIER", GLE_KW_RBEZIER },
+ { "REGION", GLE_KW_REGION },
+ { "RESTOREDEFAULTS", GLE_KW_RESTOREDEFAULTS },
+ { "RETURN", GLE_KW_RETURN },
+ { "REVERSE", GLE_KW_REVERSE },
+ { "RLINE", GLE_KW_RLINE },
+ { "RMOVE", GLE_KW_RMOVE },
+ { "ROT", GLE_KW_ROT },
+ { "ROTATE", GLE_KW_ROTATE },
+ { "RSETPOS", GLE_KW_RSETPOS },
+ { "SAVE", GLE_KW_SAVE },
+ { "SCALE", GLE_KW_SCALE },
+ { "SET", GLE_KW_SET },
+ { "SIZE", GLE_KW_SIZE },
+ { "SLEEP", GLE_KW_SLEEP },
+ { "STROKE", GLE_KW_STROKE },
+ { "SUB", GLE_KW_SUB },
+ { "TEX", GLE_KW_TEX },
+ { "TEXT", GLE_KW_TEXT },
+ { "TEXTDEF", GLE_KW_TEXTDEF },
+ { "TIFF", GLE_KW_TIFF },
+ { "TRAN", GLE_KW_TRAN },
+ { "TRANSLATE", GLE_KW_TRANSLATE },
+ { "UNTIL", GLE_KW_UNTIL },
+ { "WHILE", GLE_KW_WHILE },
+ { "WRITE", GLE_KW_WRITE }
+};
+
+int binsearchk(const char *word, struct mkeyw tab[], int n);
+
+void cmd_name(int idx, char **cp) {
+ static char *kp;
+ static char fail[]="Keyword not found";
+ if (kp==NULL) kp = (char*) myallocz(80);
+ for (unsigned int i=0;i<NKEYS;i++) {
+ if (mkeywfn[i].index==idx) {
+ strcpy(kp,mkeywfn[i].word);
+ *cp = kp;
+ return;
+ }
+ }
+ *cp = &fail[0];
+}
+
+void find_mkey(string cp, int *idx) {
+ if (cp.length() == 0 ) { *idx = 0; return;}
+ int i;
+ i = binsearchk(cp.c_str(),mkeywfn,NKEYS);
+ /* printf("I %d, cmd {%s} \n",i,cp); */
+ if (i==-1) { *idx = 0; return;}
+ *idx = mkeywfn[i].index;
+}
+
+/*------------------------------------------------------------------*/
+/* Simple binary search */
+/*------------------------------------------------------------------*/
+
+int binsearchk(const char *word, struct mkeyw tab[], int n) {
+ int cond,low,high,mid;
+ low = 0;
+ high = n-1;
+ while (low <= high) {
+ mid = (low+high) / 2;
+ if ((cond = strcmp(word,tab[mid].word)) < 0)
+ high = mid - 1;
+ else if (cond > 0)
+ low = mid + 1;
+ else
+ return mid;
+ }
+ return -1;
+}
+
+
+/*-------------------------------------------------------------------------*/
+/* This is for the tex primitives */
+
+#include "tex.h"
+struct mkeyw tkeywfn[] = {
+ { "^", tp_sup },
+ { "_", tp_sub },
+ { "acccmb", tp_acccmb },
+ { "accent", tp_accent },
+ { "accentxy", tp_accentxy },
+ { "char", tp_char },
+ { "chardef", tp_chardef },
+ { "def", tp_def },
+ { "defbegin", tp_defbegin },
+ { "delcode", tp_delcode },
+ { "delimiter", tp_delimiter },
+ { "fontenc", tp_fontenc },
+ { "frac", tp_frac },
+ { "hfill", tp_hfill },
+ { "left", tp_left },
+ { "linegap", tp_linegap },
+ { "lineskip", tp_lineskip },
+ { "mathchar", tp_mathchar },
+ { "mathchardef", tp_mathchardef },
+ { "mathcode", tp_mathcode },
+ { "movexy", tp_movexy },
+ { "newline", tp_newline },
+ { "nolimits", tp_nolimits },
+ { "overbrace", tp_overbrace },
+ { "overline", tp_overline },
+ { "parskip", tp_parskip },
+ { "presave", tp_presave },
+ { "right", tp_right },
+ { "rule", tp_rule },
+ { "setfont", tp_setfont },
+ { "sethei", tp_sethei },
+ { "setstretch", tp_setstretch },
+ { "sfont", tp_sfont },
+ { "ssfont", tp_ssfont },
+ { "sub", tp_sub },
+ { "sup", tp_sup },
+ { "tex", tp_tex },
+ { "tfont", tp_tfont },
+ { "uchr", tp_uchr },
+ { "underbrace", tp_underbrace },
+ { "underline", tp_underline },
+ { "unicode", tp_unicode }
+};
+
+#define NTKEYS (sizeof tkeywfn / sizeof(struct mkeyw))
+int find_primcmd(char *cp) {
+ int i;
+ i = binsearchk(cp,tkeywfn,NTKEYS);
+ if (i==-1) return 0;
+ return tkeywfn[i].index;
+}
+
diff --git a/src/gle/keyword.h b/src/gle/keyword.h
new file mode 100644
index 0000000..1d0c279
--- /dev/null
+++ b/src/gle/keyword.h
@@ -0,0 +1,134 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#define GLE_KW_NB 90
+
+#define GLE_KW_BLANK 0
+#define GLE_KW_ABOUND 87
+#define GLE_KW_ALINE 1
+#define GLE_KW_AMOVE 2
+#define GLE_KW_ARC 3
+#define GLE_KW_ARCTO 4
+#define GLE_KW_ASETPOS 73
+#define GLE_KW_ASSIGNMENT 51
+#define GLE_KW_BEGIN 5
+#define GLE_KW_BEZIER 6
+#define GLE_KW_BIGFILE 58
+#define GLE_KW_BITMAP 68
+#define GLE_KW_BITMAP_INFO 69
+#define GLE_KW_BOX 7
+#define GLE_KW_CALL 52
+#define GLE_KW_CIRCLE 8
+#define GLE_KW_CLOSEPATH 9
+#define GLE_KW_COLORMAP 80
+#define GLE_KW_COMMENT 53
+#define GLE_KW_COMPATIBILITY 86
+#define GLE_KW_CURVE 10
+#define GLE_KW_DECLARESUB 83
+#define GLE_KW_DEFAULT 84
+#define GLE_KW_DEFCOLOR 85
+#define GLE_KW_DEFINE 11
+#define GLE_KW_DEFMARKER 60
+#define GLE_KW_DFONT 12
+#define GLE_KW_DRAW 56
+#define GLE_KW_ELLIPSE 70
+#define GLE_KW_ELLIPTICAL_ARC 71
+#define GLE_KW_ELLIPTICAL_NARC 72
+#define GLE_KW_ELSE 13
+#define GLE_KW_END 14
+#define GLE_KW_FCLOSE 15
+#define GLE_KW_FGETLINE 75
+#define GLE_KW_FILL 16
+#define GLE_KW_FOPEN 17
+#define GLE_KW_FOR 18
+#define GLE_KW_FREAD 61
+#define GLE_KW_FREADLN 62
+#define GLE_KW_FTOKENIZER 76
+#define GLE_KW_FWRITE 63
+#define GLE_KW_FWRITELN 64
+#define GLE_KW_COMMENT 53
+#define GLE_KW_GOTO 19
+#define GLE_KW_GRESTORE 54
+#define GLE_KW_GSAVE 20
+#define GLE_KW_ICON 21
+#define GLE_KW_IF 22
+#define GLE_KW_INCLUDE 23
+#define GLE_KW_INPUT 24
+#define GLE_KW_JOIN 25
+#define GLE_KW_MARGINS 78
+#define GLE_KW_MARKER 26
+#define GLE_KW_MOVE 27
+#define GLE_KW_NAME 39
+#define GLE_KW_NARC 28
+#define GLE_KW_NEWPATH 29
+#define GLE_KW_NEXT 30
+#define GLE_KW_ORIENTATION 79
+#define GLE_KW_PAPERSIZE 77
+#define GLE_KW_PIE 31
+#define GLE_KW_POSTSCRIPT 55
+#define GLE_KW_PRINT 32
+#define GLE_KW_PSBBTWEAK 66
+#define GLE_KW_PSCOMMENT 65
+#define GLE_KW_RBEZIER 33
+#define GLE_KW_REGION 34
+#define GLE_KW_RESTOREDEFAULTS 82
+#define GLE_KW_RETURN 50
+#define GLE_KW_REVERSE 35
+#define GLE_KW_RLINE 36
+#define GLE_KW_RMOVE 37
+#define GLE_KW_ROT 38
+#define GLE_KW_ROTATE 38
+#define GLE_KW_RSETPOS 81
+#define GLE_KW_SAVE 39
+#define GLE_KW_SCALE 40
+#define GLE_KW_SET 41
+#define GLE_KW_SET 41
+#define GLE_KW_SIZE 42
+#define GLE_KW_SLEEP 88
+#define GLE_KW_STROKE 43
+#define GLE_KW_SUB 44
+#define GLE_KW_TEX 74
+#define GLE_KW_TEXT 45
+#define GLE_KW_TEXTDEF 59
+#define GLE_KW_TIFF 67
+#define GLE_KW_TRAN 46
+#define GLE_KW_TRANSLATE 46
+#define GLE_KW_UNTIL 47
+#define GLE_KW_WHILE 48
+#define GLE_KW_WRITE 49
+#define GLE_KW_BLOCK_COMMAND 89
diff --git a/src/gle/leastsq.cpp b/src/gle/leastsq.cpp
new file mode 100644
index 0000000..e69f492
--- /dev/null
+++ b/src/gle/leastsq.cpp
@@ -0,0 +1,360 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#include <math.h>
+#include <vector>
+
+using namespace std;
+
+#include "all.h"
+#include "gprint.h"
+#include "leastsq.h"
+
+GLEPowellFunc::GLEPowellFunc() {
+}
+
+GLEPowellFunc::~GLEPowellFunc() {
+}
+
+void least_square(vector<double>* x,vector<double>* y,double* slope, double* offset, double* rsquared) {
+ //
+ // does a linear least squares fit to the data x and y which have n elements
+ // x,y.... the values
+ // n the size of the x and y arrays
+ // slope... the tresulting slope
+ // offset.. the resulting offset
+ // rsquared.. the goodness of fit 1=ideal 0 = poor
+ //
+ double sum_x=0, sum_y=0, sum_xy=0, sum_xx=0, delta=0, y_avg = 0, n = static_cast<double>(x->size());
+ for (size_t i = 0; i < x->size(); i++) {
+ // printf("x[%d]=%0.6f y[%d]=%0.6f\n",i,(*x)[i],i,(*y)[i]);
+ sum_x += (*x)[i];
+ sum_y += (*y)[i];
+ sum_xy += (*x)[i]*(*y)[i];
+ sum_xx += (*x)[i]*(*x)[i];
+ }
+ delta = n*sum_xx - sum_x*sum_x;
+ *slope = (n*sum_xy - sum_x*sum_y)/delta;
+ *offset = (sum_xx*sum_y - sum_x*sum_xy)/delta;
+ y_avg = sum_y / n;
+ //
+ // compute rsquared
+ //
+ *rsquared = 0;
+ double residue = 0.0,syy=0.0;
+
+ for (int i = 0; i < n; i++) {
+ residue += pow((*y)[i] - (*slope) * (*x)[i] - *offset,2.0);
+ syy += pow((*y)[i] - y_avg,2.0);
+ }
+
+ *rsquared = 1 - residue/syy;
+}
+
+double *mk_vector(int nl, int nh);
+void free_vector(double* v, int nl, int nh);
+void mnbrak(double* ax, double* bx, double* cx, double *fa, double* fb, double* fc, double (*func)(double));
+
+#define ITMAX 100
+#define CGOLD 0.3819660
+#define ZEPS 1.0e-10
+#define SIGN(a,b) ((b) > 0.0 ? fabs(a) : -fabs(a))
+#define SHFT(a,b,c,d) (a)=(b);(b)=(c);(c)=(d);
+
+double brent(double ax, double bx, double cx, double (*f)(double), double tol, double *xmin) {
+ int iter;
+ double a,b,d = 0.0,etemp,fu,fv,fw,fx,p,q,r,tol1,tol2,u,v,w,x,xm;
+ double e=0.0;
+
+ a=((ax < cx) ? ax : cx);
+ b=((ax > cx) ? ax : cx);
+ x = w = v = bx;
+ fw = fv = fx = f(x);
+ for (iter=1;iter<=ITMAX;iter++) {
+ xm=0.5*(a+b);
+ tol2=2.0*(tol1=tol*fabs(x)+ZEPS);
+ if (fabs(x-xm) <= (tol2-0.5*(b-a))) {
+ *xmin=x;
+ return fx;
+ }
+ if (fabs(e) > tol1) {
+ r=(x-w)*(fx-fv);
+ q=(x-v)*(fx-fw);
+ p=(x-v)*q-(x-w)*r;
+ q=2.0*(q-r);
+ if (q > 0.0) p = -p;
+ q=fabs(q);
+ etemp=e;
+ e=d;
+ if (fabs(p) >= fabs(0.5*q*etemp) ||
+ p <= q*(a-x) || p >= q*(b-x)) {
+ d=CGOLD*(e=(x >= xm ? a-x : b-x));
+ } else {
+ d=p/q;
+ u=x+d;
+ if (u-a < tol2 || b-u < tol2)
+ d=SIGN(tol1,xm-x);
+ }
+ } else {
+ d=CGOLD*(e=(x >= xm ? a-x : b-x));
+ }
+ u=(fabs(d) >= tol1 ? x+d : x+SIGN(tol1,d));
+ fu=f(u);
+ if (fu <= fx) {
+ if (u >= x) a=x; else b=x;
+ SHFT(v,w,x,u)
+ SHFT(fv,fw,fx,fu)
+ } else {
+ if (u < x) a=u; else b=u;
+ if (fu <= fw || w == x) {
+ v=w;
+ w=u;
+ fv=fw;
+ fw=fu;
+ } else if (fu <= fv || v == x || v == w) {
+ v=u;
+ fv=fu;
+ }
+ }
+ }
+ gprint("Too many iterations in BRENT\n");
+ *xmin=x;
+ return fx;
+}
+
+#undef ITMAX
+#undef CGOLD
+#undef ZEPS
+#undef SIGN
+
+int ncom=0;
+double *pcom=0,*xicom=0;
+GLEPowellFunc* nrfunc;
+
+double f1dim(double x) {
+ int j;
+ double f,*xt;
+
+ xt=mk_vector(1,ncom);
+ for (j=1;j<=ncom;j++) xt[j]=pcom[j]+x*xicom[j];
+ f=nrfunc->fitMSE(xt);
+ free_vector(xt,1,ncom);
+ return f;
+}
+
+#define TOL 2.0e-4
+
+void linmin(double* p, double* xi, int n, double* fret, GLEPowellFunc* func) {
+ int j;
+ double xx,xmin,fx,fb,fa,bx,ax;
+
+ ncom=n;
+ pcom=mk_vector(1,n);
+ xicom=mk_vector(1,n);
+ nrfunc=func;
+ for (j=1;j<=n;j++) {
+ pcom[j]=p[j];
+ xicom[j]=xi[j];
+ }
+ ax=0.0;
+ xx=1.0;
+ bx=2.0;
+ mnbrak(&ax,&xx,&bx,&fa,&fx,&fb,f1dim);
+ *fret=brent(ax,xx,bx,f1dim,TOL,&xmin);
+ for (j=1;j<=n;j++) {
+ xi[j] *= xmin;
+ p[j] += xi[j];
+ }
+ free_vector(xicom,1,n);
+ free_vector(pcom,1,n);
+}
+
+#undef TOL
+#include <math.h>
+
+#define GOLD 1.618034
+#define GLIMIT 100.0
+#define TINY 1.0e-20
+#define MAX(a,b) ((a) > (b) ? (a) : (b))
+#define SIGN(a,b) ((b) > 0.0 ? fabs(a) : -fabs(a))
+#define SHFT(a,b,c,d) (a)=(b);(b)=(c);(c)=(d);
+
+void mnbrak(double* ax, double* bx, double* cx, double *fa, double* fb, double* fc, double (*func)(double)) {
+ double ulim,u,r,q,fu,dum;
+
+ *fa=(*func)(*ax);
+ *fb=(*func)(*bx);
+ if (*fb > *fa) {
+ SHFT(dum,*ax,*bx,dum)
+ SHFT(dum,*fb,*fa,dum)
+ }
+ *cx=(*bx)+GOLD*(*bx-*ax);
+ *fc=(*func)(*cx);
+ while (*fb > *fc) {
+ r=(*bx-*ax)*(*fb-*fc);
+ q=(*bx-*cx)*(*fb-*fa);
+ u=(*bx)-((*bx-*cx)*q-(*bx-*ax)*r)/
+ (2.0*SIGN(MAX(fabs(q-r),TINY),q-r));
+ ulim=(*bx)+GLIMIT*(*cx-*bx);
+ if ((*bx-u)*(u-*cx) > 0.0) {
+ fu=(*func)(u);
+ if (fu < *fc) {
+ *ax=(*bx);
+ *bx=u;
+ *fa=(*fb);
+ *fb=fu;
+ return;
+ } else if (fu > *fb) {
+ *cx=u;
+ *fc=fu;
+ return;
+ }
+ u=(*cx)+GOLD*(*cx-*bx);
+ fu=(*func)(u);
+ } else if ((*cx-u)*(u-ulim) > 0.0) {
+ fu=(*func)(u);
+ if (fu < *fc) {
+ SHFT(*bx,*cx,u,*cx+GOLD*(*cx-*bx))
+ SHFT(*fb,*fc,fu,(*func)(u))
+ }
+ } else if ((u-ulim)*(ulim-*cx) >= 0.0) {
+ u=ulim;
+ fu=(*func)(u);
+ } else {
+ u=(*cx)+GOLD*(*cx-*bx);
+ fu=(*func)(u);
+ }
+ SHFT(*ax,*bx,*cx,u)
+ SHFT(*fa,*fb,*fc,fu)
+ }
+}
+
+#undef GOLD
+#undef GLIMIT
+#undef TINY
+#undef MAX
+#undef SIGN
+#undef SHFT
+#include <math.h>
+
+#define ITMAX 200
+static double sqrarg;
+#define SQR(a) (sqrarg=(a),sqrarg*sqrarg)
+
+void powell(double p[],double **xi, int n, double ftol, int *iter, double *fret, GLEPowellFunc* func) {
+ int i,ibig,j;
+ double t,fptt,fp,del;
+ double *pt,*ptt,*xit;
+
+ pt=mk_vector(1,n);
+ ptt=mk_vector(1,n);
+ xit=mk_vector(1,n);
+ *fret = func->fitMSE(p);
+ for (j=1;j<=n;j++) pt[j]=p[j];
+ for (*iter=1;;(*iter)++) {
+ fp=(*fret);
+ ibig=0;
+ del=0.0;
+ for (i=1;i<=n;i++) {
+ for (j=1;j<=n;j++) xit[j]=xi[j][i];
+ fptt=(*fret);
+ linmin(p,xit,n,fret,func);
+ if (fabs(fptt-(*fret)) > del) {
+ del=fabs(fptt-(*fret));
+ ibig=i;
+ }
+ }
+ if (2.0*fabs(fp-(*fret)) <= ftol*(fabs(fp)+fabs(*fret))) {
+ free_vector(xit,1,n);
+ free_vector(ptt,1,n);
+ free_vector(pt,1,n);
+ return;
+ }
+ if (*iter == ITMAX) {
+ gprint("Too many iterations in routine POWELL\n");
+ }
+ for (j=1;j<=n;j++) {
+ ptt[j]=2.0*p[j]-pt[j];
+ xit[j]=p[j]-pt[j];
+ pt[j]=p[j];
+ }
+ fptt=func->fitMSE(ptt);
+ if (fptt < fp) {
+ t=2.0*(fp-2.0*(*fret)+fptt)*SQR(fp-(*fret)-del)-del*SQR(fp-fptt);
+ if (t < 0.0) {
+ linmin(p,xit,n,fret,func);
+ for (j=1;j<=n;j++) xi[j][ibig]=xit[j];
+ }
+ }
+ }
+}
+
+#undef ITMAX
+#undef SQR
+
+#include <stdio.h>
+
+double *mk_vector(int nl, int nh) {
+ double *v;
+ v=(double *)malloc((unsigned) (nh-nl+1)*sizeof(double));
+ if (!v) gle_abort("allocation failure in vector()");
+ return v-nl;
+}
+
+double **matrix(int nrl, int nrh, int ncl, int nch) {
+ int i;
+ double **m;
+ m=(double **) malloc((unsigned) (nrh-nrl+1)*sizeof(double*));
+ if (!m) gle_abort("allocation failure 1 in matrix()");
+ m -= nrl;
+ for(i=nrl;i<=nrh;i++) {
+ m[i]=(double *) malloc((unsigned) (nch-ncl+1)*sizeof(double));
+ if (!m[i]) gle_abort("allocation failure 2 in matrix()");
+ m[i] -= ncl;
+ }
+ return m;
+}
+
+void free_vector(double* v, int nl, int nh) {
+ free((char*) (v+nl));
+}
+
+void free_matrix(double** m, int nrl, int nrh, int ncl, int nch) {
+ for(int i=nrh;i>=nrl;i--) free((char*) (m[i]+ncl));
+ free((char*) (m+nrl));
+}
diff --git a/src/gle/leastsq.h b/src/gle/leastsq.h
new file mode 100644
index 0000000..137bff8
--- /dev/null
+++ b/src/gle/leastsq.h
@@ -0,0 +1,58 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+//
+// leastsq.h
+//
+#ifndef INCLUDE_LEAST_SQUARES
+#define INCLUDE_LEAST_SQUARES
+
+class GLEPowellFunc {
+public:
+ GLEPowellFunc();
+ virtual ~GLEPowellFunc();
+ virtual double fitMSE(double* vals) = 0;
+};
+
+double **matrix(int a, int b, int c, int d);
+void free_matrix(double** m, int nrl, int nrh, int ncl, int nch);
+
+void powell(double *p, double **xi, int n, double ftol, int *iter, double *fret, GLEPowellFunc* func);
+void least_square(vector<double>* x,vector<double>* y,double* slope, double* offset, double* rsquared);
+
+#endif
diff --git a/src/gle/letzfitz/Makefile.gcc b/src/gle/letzfitz/Makefile.gcc
new file mode 100644
index 0000000..986cdba
--- /dev/null
+++ b/src/gle/letzfitz/Makefile.gcc
@@ -0,0 +1,56 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+#
+# makefile.gcc for GLE v4.0
+# for compilation with gcc
+#
+#
+include ../../../config.i
+include ../../../config.gcc
+-include ../../../extraconfig.gcc
+#
+include files.txt
+
+all: $(OBJECTS)
+
+$(OBJECTS): $(INCLUDES)
+
+clean:
+ -$(RM) $(OBJECTS)
+
diff --git a/src/gle/letzfitz/Makefile.in b/src/gle/letzfitz/Makefile.in
new file mode 100644
index 0000000..9d38c05
--- /dev/null
+++ b/src/gle/letzfitz/Makefile.in
@@ -0,0 +1,63 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+#
+# makefile.gcc for GLE v4.0
+# for compilation with gcc
+#
+
+include ../../../config.i
+include ../../../config.aconf
+
+include files.txt
+
+CXX=@CXX@
+CPPFLAGS=@LIBGLE_CPPFLAGS@@CPPFLAGS@
+
+CPPFLAGS := $(strip $(CPPFLAGS))
+
+LDFLAGS=@LDFLAGS@
+LIBS=@LIBS@
+
+all: $(OBJECTS)
+
+$(OBJECTS): %.o: %.cpp $(INCLUDES)
+ $(CXX) $(CPPFLAGS) -c $< -o $@
+
+clean:
+ -$(RM) $(OBJECTS)
diff --git a/src/gle/letzfitz/Makefile.os2 b/src/gle/letzfitz/Makefile.os2
new file mode 100644
index 0000000..01782fd
--- /dev/null
+++ b/src/gle/letzfitz/Makefile.os2
@@ -0,0 +1,55 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+#
+# makefile.gcc for GLE v4.0
+# for compilation with gcc
+#
+#
+include ../../../config.i
+include ../../../config.os2
+#
+include files.txt
+
+all: $(OBJECTS)
+
+$(OBJECTS): $(INCLUDES)
+
+clean:
+ -$(RM) $(OBJECTS)
+
diff --git a/src/gle/letzfitz/Makefile.vc b/src/gle/letzfitz/Makefile.vc
new file mode 100644
index 0000000..58dd502
--- /dev/null
+++ b/src/gle/letzfitz/Makefile.vc
@@ -0,0 +1,53 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+#
+# makefile.vc for GLE v4.0
+# for compilation with MS vc++ .net
+#
+#
+!include ..\..\..\config.vc
+#
+!include files.txt
+
+all: $(OBJECTS)
+
+$(OBJECTS): $(INCLUDES)
+
+clean:
+ -erase $(OBJECTS)
diff --git a/src/gle/letzfitz/f2c.h b/src/gle/letzfitz/f2c.h
new file mode 100644
index 0000000..2b88ae8
--- /dev/null
+++ b/src/gle/letzfitz/f2c.h
@@ -0,0 +1,244 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+/* f2c.h -- Standard Fortran to C header file */
+
+/** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed."
+
+ - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */
+
+#ifndef F2C_INCLUDE
+#define F2C_INCLUDE
+
+typedef int integer;
+typedef char *address;
+typedef short int shortint;
+typedef double real;
+typedef double doublereal;
+typedef struct { real r, i; } complex;
+typedef struct { doublereal r, i; } doublecomplex;
+typedef int logical;
+typedef short int shortlogical;
+
+#define TRUE_ (1)
+#define FALSE_ (0)
+
+/* Extern is for use with -E */
+#ifndef Extern
+#define Extern extern
+#endif
+
+/* I/O stuff */
+
+#ifdef f2c_i2
+/* for -i2 */
+typedef short flag;
+typedef short ftnlen;
+typedef short ftnint;
+#else
+typedef int flag;
+typedef int ftnlen;
+typedef int ftnint;
+#endif
+
+/*external read, write*/
+typedef struct
+{ flag cierr;
+ ftnint ciunit;
+ flag ciend;
+ char *cifmt;
+ ftnint cirec;
+} cilist;
+
+/*internal read, write*/
+typedef struct
+{ flag icierr;
+ char *iciunit;
+ flag iciend;
+ char *icifmt;
+ ftnint icirlen;
+ ftnint icirnum;
+} icilist;
+
+/*open*/
+typedef struct
+{ flag oerr;
+ ftnint ounit;
+ char *ofnm;
+ ftnlen ofnmlen;
+ char *osta;
+ char *oacc;
+ char *ofm;
+ ftnint orl;
+ char *oblnk;
+} olist;
+
+/*close*/
+typedef struct
+{ flag cerr;
+ ftnint cunit;
+ char *csta;
+} cllist;
+
+/*rewind, backspace, endfile*/
+typedef struct
+{ flag aerr;
+ ftnint aunit;
+} alist;
+
+/* inquire */
+typedef struct
+{ flag inerr;
+ ftnint inunit;
+ char *infile;
+ ftnlen infilen;
+ ftnint *inex; /*parameters in standard's order*/
+ ftnint *inopen;
+ ftnint *innum;
+ ftnint *innamed;
+ char *inname;
+ ftnlen innamlen;
+ char *inacc;
+ ftnlen inacclen;
+ char *inseq;
+ ftnlen inseqlen;
+ char *indir;
+ ftnlen indirlen;
+ char *infmt;
+ ftnlen infmtlen;
+ char *inform;
+ ftnint informlen;
+ char *inunf;
+ ftnlen inunflen;
+ ftnint *inrecl;
+ ftnint *innrec;
+ char *inblank;
+ ftnlen inblanklen;
+} inlist;
+
+#define VOID void
+
+union Multitype { /* for multiple entry points */
+ shortint h;
+ integer i;
+ real r;
+ doublereal d;
+ complex c;
+ doublecomplex z;
+ };
+
+typedef union Multitype Multitype;
+
+typedef int Long;
+
+struct Vardesc { /* for Namelist */
+ char *name;
+ char *addr;
+ Long *dims;
+ int type;
+ };
+typedef struct Vardesc Vardesc;
+
+struct Namelist {
+ char *name;
+ Vardesc **vars;
+ int nvars;
+ };
+typedef struct Namelist Namelist;
+
+#define abs(x) ((x) >= 0 ? (x) : -(x))
+#define dabs(x) (doublereal)abs(x)
+#define min(a,b) ((a) <= (b) ? (a) : (b))
+#define max(a,b) ((a) >= (b) ? (a) : (b))
+#define dmin(a,b) (doublereal)min(a,b)
+#define dmax(a,b) (doublereal)max(a,b)
+
+/* procedure parameter types for -A and -C++ */
+
+#define F2C_proc_par_types 1
+#ifdef __cplusplus
+typedef int /* Unknown procedure type */ (*U_fp)(...);
+typedef shortint (*J_fp)(...);
+typedef integer (*I_fp)(...);
+typedef real (*R_fp)(...);
+typedef doublereal (*D_fp)(...), (*E_fp)(...);
+typedef /* Complex */ VOID (*C_fp)(...);
+typedef /* Double Complex */ VOID (*Z_fp)(...);
+typedef logical (*L_fp)(...);
+typedef shortlogical (*K_fp)(...);
+typedef /* Character */ VOID (*H_fp)(...);
+typedef /* Subroutine */ int (*S_fp)(...);
+#else
+typedef int /* Unknown procedure type */ (*U_fp)();
+typedef shortint (*J_fp)();
+typedef integer (*I_fp)();
+typedef real (*R_fp)();
+typedef doublereal (*D_fp)(), (*E_fp)();
+typedef /* Complex */ VOID (*C_fp)();
+typedef /* Double Complex */ VOID (*Z_fp)();
+typedef logical (*L_fp)();
+typedef shortlogical (*K_fp)();
+typedef /* Character */ VOID (*H_fp)();
+typedef /* Subroutine */ int (*S_fp)();
+#endif
+/* E_fp is for real functions when -R is not specified */
+typedef doublereal E_f; /* real function with -R not specified */
+
+/* undef any lower-case symbols that your C compiler predefines, e.g.: */
+
+#ifndef Skip_f2c_Undefs
+#undef cray
+#undef gcos
+#undef mc68010
+#undef mc68020
+#undef mips
+#undef pdp11
+#undef sgi
+#undef sparc
+#undef sun
+#undef sun2
+#undef sun3
+#undef sun4
+#undef u370
+#undef u3b
+#undef u3b2
+#undef u3b5
+#undef unix
+#undef vax
+#endif
+#endif
diff --git a/src/gle/letzfitz/ffit.cpp b/src/gle/letzfitz/ffit.cpp
new file mode 100644
index 0000000..73a5fe9
--- /dev/null
+++ b/src/gle/letzfitz/ffit.cpp
@@ -0,0 +1,2737 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+/* fit.f -- translated by f2c (version of 26 February 1990 17:38:00).
+ You must link the resulting object file with the libraries:
+ -lF77 -lI77 -lm -lc (in that order)
+*/
+
+#include "math.h"
+#include "stdio.h"
+#include "f2c.h"
+
+/* Common Block Declarations */
+
+typedef struct {
+ integer nit;
+} idlc_;
+
+idlc_ idlc_1;
+
+typedef struct {
+ integer itpv;
+} idpi_;
+
+idpi_ idpi_1;
+
+void do_fio();
+void e_wsfe();
+void s_stop();
+void s_wsfe();
+void err2090_();
+void err2091_();
+void err2091b_();
+void err2092_();
+void err2093_();
+void err2094_();
+
+int idcldp_(integer *ndp, real* xd, real* yd, integer* ncp, integer* ipc);
+int idgrid_(real* xd, real* yd, integer* nt, integer* ipt, integer* nl, integer* ipl, integer* nxi, integer* nyi, real* xi, real* yi, integer* ngp, integer* igp);
+int idlctn_(integer* ndp, real* xd, real* yd, integer* nt, integer* ipt, integer* nl, integer* ipl, real* xii, real* yii, integer* iti, integer* iwk, real* wk);
+int idpdrv_(integer* ndp, real* xd, real* yd, real* zd, integer* ncp, integer* ipc, real* pd);
+int idptip_(real* xd, real* yd, real* zd, integer* nt, integer* ipt, integer* nl, integer* ipl, real* pdd, integer* iti, real* xii, real* yii, real* zii);
+int idsfft_(integer *md, integer *ncp, integer *ndp, real *xd, real *yd, real *zd, integer *nxi, integer *nyi, real *xi, real *yi, real *zi, integer *iwk, real *wk);
+int idtang_(integer *ndp, real *xd, real *yd, integer *nt, integer *ipt, integer *nl, integer *ipl, integer *iwl, integer *iwp, real *wk);
+integer idxchg_(real *x, real *y, integer *i1, integer *i2, integer *i3, integer *i4);
+
+int idbvip_(int *md, int *ncp, int *ndp, double *xd, double *yd, double *zd, int *nip, double *xi, double *yi, double *zi, int *iwk, double *wk) {
+
+ /* System generated locals */
+ integer i_1, i_2;
+
+ /* Local variables */
+ static integer jwit, jwit0;
+ static integer jwipc, jwipl, ncppv, ndppv, jwiwk, nippv, jwipt, jwiwl, jwiwp, nl;
+ static integer nt;
+ static integer md0, iip, ncp0, ndp0, nip0;
+
+/* this subroutine performs bivariate interpolation when the pro- */
+/* jections of the data points in the x-y plane are irregularly */
+/* distributed in the plane. */
+/* the input parameters are */
+/* md = mode of computation (must be 1, 2, or 3), */
+/* = 1 for new ncp and/or new xd-yd, */
+/* = 2 for old ncp, old xd-yd, new xi-yi, */
+/* = 3 for old ncp, old xd-yd, old xi-yi, */
+/* ncp = number of additional data points used for esti- */
+/* mating partial derivatives at each data point */
+/* (must be 2 or greater, but smaller than ndp), */
+/* ndp = number of data points (must be 4 or greater), */
+/* xd = array of dimension ndp containing the x */
+/* coordinates of the data points, */
+/* yd = array of dimension ndp containing the y */
+/* coordinates of the data points, */
+/* zd = array of dimension ndp containing the z */
+/* coordinates of the data points, */
+/* nip = number of output points at which interpolation */
+/* is to be performed (must be 1 or greater), */
+/* xi = array of dimension nip containing the x */
+/* coordinates of the output points, */
+/* yi = array of dimension nip containing the y */
+/* coordinates of the output points. */
+/* the output parameter is */
+/* zi = array of dimension nip where interpolated z */
+/* values are to be stored. */
+/* the other parameters are */
+/* iwk = integer array of dimension */
+/* max0(31,27+ncp)*ndp+nip */
+/* used internally as a work area, */
+/* wk = array of dimension 8*ndp used internally as a */
+/* work area. */
+/* the very first call to this subroutine and the call with a new */
+/* ncp value, a new ndp value, and/or new contents of the xd and */
+/* yd arrays must be made with md=1. the call with md=2 must be */
+/* preceded by another call with the same ncp and ndp values and */
+/* with the same contents of the xd and yd arrays. the call with */
+/* md=3 must be preceded by another call with the same ncp, ndp, */
+/* and nip values and with the same contents of the xd, yd, xi, */
+/* and yi arrays. between the call with md=2 or md=3 and its */
+/* preceding call, the iwk and wk arrays must not be disturbed. */
+/* use of a value between 3 and 5 (inclusive) for ncp is recom- */
+/* mended unless there are evidences that dictate otherwise. */
+/* the lun constant in the data initialization statement is the */
+/* logical unit number of the standard output unit and is, */
+/* therefore, system dependent. */
+/* this subroutine calls the idcldp, idlctn, idpdrv, idptip, and */
+/* idtang subroutines. */
+/* declaration statements */
+ /* Parameter adjustments */
+ --wk;
+ --iwk;
+ --zi;
+ --yi;
+ --xi;
+ --zd;
+ --yd;
+ --xd;
+
+ /* Function Body */
+/* setting of some input parameters to local variables. */
+/* (for md=1,2,3) */
+/* L10: */
+ md0 = *md;
+ ncp0 = *ncp;
+ ndp0 = *ndp;
+ nip0 = *nip;
+/* error check. (for md=1,2,3) */
+/* L20: */
+ if (md0 < 1 || md0 > 3) {
+ goto L90;
+ }
+ if (ncp0 < 2 || ncp0 >= ndp0) {
+ goto L90;
+ }
+ if (ndp0 < 4) {
+ goto L90;
+ }
+ if (nip0 < 1) {
+ goto L90;
+ }
+ if (md0 >= 2) {
+ goto L21;
+ }
+ iwk[1] = ncp0;
+ iwk[2] = ndp0;
+ goto L22;
+L21:
+ ncppv = iwk[1];
+ ndppv = iwk[2];
+ if (ncp0 != ncppv) {
+ goto L90;
+ }
+ if (ndp0 != ndppv) {
+ goto L90;
+ }
+L22:
+ if (md0 >= 3) {
+ goto L23;
+ }
+ iwk[3] = *nip;
+ goto L30;
+L23:
+ nippv = iwk[3];
+ if (nip0 != nippv) {
+ goto L90;
+ }
+/* allocation of storage areas in the iwk array. (for md=1,2,3) */
+L30:
+ jwipt = 16;
+ jwiwl = ndp0 * 6 + 1;
+ jwiwk = jwiwl;
+ jwipl = ndp0 * 24 + 1;
+ jwiwp = ndp0 * 30 + 1;
+ jwipc = ndp0 * 27 + 1;
+/* Computing MAX */
+ i_1 = 31, i_2 = ncp0 + 27;
+ jwit0 = max(i_1,i_2) * ndp0;
+/* triangulates the x-y plane. (for md=1) */
+/* L40: */
+ if (md0 > 1) {
+ goto L50;
+ }
+ idtang_(&ndp0, &xd[1], &yd[1], &nt, &iwk[jwipt], &nl, &iwk[jwipl], &iwk[
+ jwiwl], &iwk[jwiwp], &wk[1]);
+ iwk[5] = nt;
+ iwk[6] = nl;
+ if (nt == 0) {
+ return 0;
+ }
+/* determines ncp points closest to each data point. (for md=1) */
+L50:
+ if (md0 > 1) {
+ goto L60;
+ }
+ idcldp_(&ndp0, &xd[1], &yd[1], &ncp0, &iwk[jwipc]);
+ if (iwk[jwipc] == 0) {
+ return 0;
+ }
+/* locates all points at which interpolation is to be performed. */
+/* (for md=1,2) */
+L60:
+ if (md0 == 3) {
+ goto L70;
+ }
+ idlc_1.nit = 0;
+ jwit = jwit0;
+ i_1 = nip0;
+ for (iip = 1; iip <= i_1; ++iip) {
+ ++jwit;
+ idlctn_(&ndp0, &xd[1], &yd[1], &nt, &iwk[jwipt], &nl, &iwk[jwipl], &
+ xi[iip], &yi[iip], &iwk[jwit], &iwk[jwiwk], &wk[1]);
+/* L61: */
+ }
+/* estimates partial derivatives at all data points. */
+/* (for md=1,2,3) */
+L70:
+ idpdrv_(&ndp0, &xd[1], &yd[1], &zd[1], &ncp0, &iwk[jwipc], &wk[1]);
+/* interpolates the zi values. (for md=1,2,3) */
+/* L80: */
+ idpi_1.itpv = 0;
+ jwit = jwit0;
+ i_1 = nip0;
+ for (iip = 1; iip <= i_1; ++iip) {
+ ++jwit;
+ idptip_(&xd[1], &yd[1], &zd[1], &nt, &iwk[jwipt], &nl, &iwk[jwipl], &
+ wk[1], &iwk[jwit], &xi[iip], &yi[iip], &zi[iip]);
+/* L81: */
+ }
+ return 0;
+/* error exit */
+L90:
+ err2090_();
+ return 0;
+/* format statement for error message */
+/* L2090: */
+} /* idbvip_ */
+
+int idcldp_(integer *ndp, real* xd, real* yd, integer* ncp, integer* ipc) {
+ /* Initialized data */
+
+ static integer ncpmx = 25;
+
+ /* System generated locals */
+ integer i_1, i_2, i_3;
+ real r_1, r_2;
+
+ /* Local variables */
+ static real dsqi;
+ static integer ip2mn, ip3mn;
+ static integer nclpt;
+ static real dsqmn;
+ static integer j1;
+ static real dsqmx;
+ static integer j3, j4, j2;
+ static real x1, y1;
+ static integer ip1, ip2, ip3;
+ static real dx12, dy12, dx13, dy13;
+ static integer jmx, ipc0[25], ncp0, ndp0;
+ static real dsq0[25];
+
+/* this subroutine selects several data points that are closest */
+/* to each of the data point. */
+/* the input parameters are */
+/* ndp = number of data points, */
+/* xd,yd = arrays of dimension ndp containing the x and y */
+/* coordinates of the data points, */
+/* ncp = number of data points closest to each data */
+/* points. */
+/* the output parameter is */
+/* ipc = integer array of dimension ncp*ndp, where the */
+/* point numbers of ncp data points closest to */
+/* each of the ndp data points are to be stored. */
+/* this subroutine arbitrarily sets a restriction that ncp must */
+/* not exceed 25. */
+/* the lun constant in the data initialization statement is the */
+/* logical unit number of the standard output unit and is, */
+/* therefore, system dependent. */
+/* declaration statements */
+ /* Parameter adjustments */
+ --ipc;
+ --yd;
+ --xd;
+
+ /* Function Body */
+/* statement function */
+/* preliminary processing */
+/* L10: */
+ ndp0 = *ndp;
+ ncp0 = *ncp;
+ if (ndp0 < 2) {
+ goto L90;
+ }
+ if (ncp0 < 1 || ncp0 > ncpmx || ncp0 >= ndp0) {
+ goto L90;
+ }
+/* calculation */
+/* L20: */
+ i_1 = ndp0;
+ for (ip1 = 1; ip1 <= i_1; ++ip1) {
+/* - selects ncp points. */
+ x1 = xd[ip1];
+ y1 = yd[ip1];
+ j1 = 0;
+ dsqmx = (float)0.;
+ i_2 = ndp0;
+ for (ip2 = 1; ip2 <= i_2; ++ip2) {
+ if (ip2 == ip1) {
+ goto L22;
+ }
+/* Computing 2nd power */
+ r_1 = xd[ip2] - x1;
+/* Computing 2nd power */
+ r_2 = yd[ip2] - y1;
+ dsqi = r_1 * r_1 + r_2 * r_2;
+ ++j1;
+ dsq0[j1 - 1] = dsqi;
+ ipc0[j1 - 1] = ip2;
+ if (dsqi <= dsqmx) {
+ goto L21;
+ }
+ dsqmx = dsqi;
+ jmx = j1;
+L21:
+ if (j1 >= ncp0) {
+ goto L23;
+ }
+L22:
+ ;}
+L23:
+ ip2mn = ip2 + 1;
+ if (ip2mn > ndp0) {
+ goto L30;
+ }
+ i_2 = ndp0;
+ for (ip2 = ip2mn; ip2 <= i_2; ++ip2) {
+ if (ip2 == ip1) {
+ goto L25;
+ }
+/* Computing 2nd power */
+ r_1 = xd[ip2] - x1;
+/* Computing 2nd power */
+ r_2 = yd[ip2] - y1;
+ dsqi = r_1 * r_1 + r_2 * r_2;
+ if (dsqi >= dsqmx) {
+ goto L25;
+ }
+ dsq0[jmx - 1] = dsqi;
+ ipc0[jmx - 1] = ip2;
+ dsqmx = (float)0.;
+ i_3 = ncp0;
+ for (j1 = 1; j1 <= i_3; ++j1) {
+ if (dsq0[j1 - 1] <= dsqmx) {
+ goto L24;
+ }
+ dsqmx = dsq0[j1 - 1];
+ jmx = j1;
+L24:
+ ;}
+L25:
+ ;}
+/* - checks if all the ncp+1 points are collinear. */
+L30:
+ ip2 = ipc0[0];
+ dx12 = xd[ip2] - x1;
+ dy12 = yd[ip2] - y1;
+ i_2 = ncp0;
+ for (j3 = 2; j3 <= i_2; ++j3) {
+ ip3 = ipc0[j3 - 1];
+ dx13 = xd[ip3] - x1;
+ dy13 = yd[ip3] - y1;
+ if (dy13 * dx12 - dx13 * dy12 != (float)0.) {
+ goto L50;
+ }
+/* L31: */
+ }
+/* - searches for the closest noncollinear point. */
+/* L40: */
+ nclpt = 0;
+ i_2 = ndp0;
+ for (ip3 = 1; ip3 <= i_2; ++ip3) {
+ if (ip3 == ip1) {
+ goto L43;
+ }
+ i_3 = ncp0;
+ for (j4 = 1; j4 <= i_3; ++j4) {
+ if (ip3 == ipc0[j4 - 1]) {
+ goto L43;
+ }
+/* L41: */
+ }
+ dx13 = xd[ip3] - x1;
+ dy13 = yd[ip3] - y1;
+ if (dy13 * dx12 - dx13 * dy12 == (float)0.) {
+ goto L43;
+ }
+/* Computing 2nd power */
+ r_1 = xd[ip3] - x1;
+/* Computing 2nd power */
+ r_2 = yd[ip3] - y1;
+ dsqi = r_1 * r_1 + r_2 * r_2;
+ if (nclpt == 0) {
+ goto L42;
+ }
+ if (dsqi >= dsqmn) {
+ goto L43;
+ }
+L42:
+ nclpt = 1;
+ dsqmn = dsqi;
+ ip3mn = ip3;
+L43:
+ ;}
+ if (nclpt == 0) {
+ goto L91;
+ }
+ dsqmx = dsqmn;
+ ipc0[jmx - 1] = ip3mn;
+/* - replaces the local array for the output array. */
+L50:
+ j1 = (ip1 - 1) * ncp0;
+ i_2 = ncp0;
+ for (j2 = 1; j2 <= i_2; ++j2) {
+ ++j1;
+ ipc[j1] = ipc0[j2 - 1];
+/* L51: */
+ }
+/* L59: */
+ }
+ return 0;
+/* error exit */
+L90:
+ err2090_();
+ goto L92;
+L91:
+ err2091_();
+L92:
+ err2092_();
+ ipc[1] = 0;
+ return 0;
+/* format statements for error messages */
+/* L2090: */
+/* L2091: */
+/* L2092: */
+} /* idcldp_ */
+
+int idgrid_(real* xd, real* yd, integer* nt, integer* ipt, integer* nl, integer* ipl, integer* nxi, integer* nyi, real* xi, real* yi, integer* ngp, integer* igp) {
+ /* System generated locals */
+ integer i_1, i_2, i_3, i_4;
+ real r_1, r_2;
+
+ /* Local variables */
+ static integer il0t3, insd, it0t3;
+ static real ximn, yimn, ximx, yimx;
+ static integer jigp0, jigp1, jngp0, jngp1, l, ilp1t3, iximn, iximx;
+ static real x1, y1, x2, y2, x3, y3;
+ static integer jigp1i, il0, nl0, ip1, ip2, it0, nxinyi, ip3, nt0, ixi,
+ iyi;
+ static real yii, xii;
+ static integer izi;
+ static real xmn, ymn, xmx, ymx;
+ static integer ngp0, ngp1, ilp1, nxi0, nyi0;
+
+/* this subroutine organizes grid points for surface fitting by */
+/* sorting them in ascending order of triangle numbers and of the */
+/* border line segment number. */
+/* the input parameters are */
+/* xd,yd = arrays of dimension ndp containing the x and y */
+/* coordinates of the data points, where ndp is the */
+/* number of the data points, */
+/* nt = number of triangles, */
+/* ipt = integer array of dimension 3*nt containing the */
+/* point numbers of the vertexes of the triangles, */
+/* nl = number of border line segments, */
+/* ipl = integer array of dimension 3*nl containing the */
+/* point numbers of the end points of the border */
+/* line segments and their respective triangle */
+/* numbers, */
+/* nxi = number of grid points in the x coordinate, */
+/* nyi = number of grid points in the y coordinate, */
+/* xi,yi = arrays of dimension nxi and nyi containing */
+/* the x and y coordinates of the grid points, */
+/* respectively. */
+/* the output parameters are */
+/* ngp = integer array of dimension 2*(nt+2*nl) where the */
+/* number of grid points that belong to each of the */
+/* triangles or of the border line segments are to */
+/* be stored, */
+/* igp = integer array of dimension nxi*nyi where the */
+/* grid point numbers are to be stored in ascending */
+/* order of the triangle number and the border line */
+/* segment number. */
+/* declaration statements */
+/* statement functions */
+/* preliminary processing */
+ /* Parameter adjustments */
+ --igp;
+ --ngp;
+ --yi;
+ --xi;
+ --ipl;
+ --ipt;
+ --yd;
+ --xd;
+
+ /* Function Body */
+ nt0 = *nt;
+ nl0 = *nl;
+ nxi0 = *nxi;
+ nyi0 = *nyi;
+ nxinyi = nxi0 * nyi0;
+/* Computing MIN */
+ r_1 = xi[1], r_2 = xi[nxi0];
+ ximn = dmin(r_1,r_2);
+/* Computing MAX */
+ r_1 = xi[1], r_2 = xi[nxi0];
+ ximx = dmax(r_1,r_2);
+/* Computing MIN */
+ r_1 = yi[1], r_2 = yi[nyi0];
+ yimn = dmin(r_1,r_2);
+/* Computing MAX */
+ r_1 = yi[1], r_2 = yi[nyi0];
+ yimx = dmax(r_1,r_2);
+/* determines grid points inside the data area. */
+ jngp0 = 0;
+ jngp1 = ((nt0 + (nl0 << 1)) << 1) + 1;
+ jigp0 = 0;
+ jigp1 = nxinyi + 1;
+ i_1 = nt0;
+ for (it0 = 1; it0 <= i_1; ++it0) {
+ ngp0 = 0;
+ ngp1 = 0;
+ it0t3 = it0 * 3;
+ ip1 = ipt[it0t3 - 2];
+ ip2 = ipt[it0t3 - 1];
+ ip3 = ipt[it0t3];
+ x1 = xd[ip1];
+ y1 = yd[ip1];
+ x2 = xd[ip2];
+ y2 = yd[ip2];
+ x3 = xd[ip3];
+ y3 = yd[ip3];
+/* Computing MIN */
+ r_1 = min(x1,x2);
+ xmn = dmin(r_1,x3);
+/* Computing MAX */
+ r_1 = max(x1,x2);
+ xmx = dmax(r_1,x3);
+/* Computing MIN */
+ r_1 = min(y1,y2);
+ ymn = dmin(r_1,y3);
+/* Computing MAX */
+ r_1 = max(y1,y2);
+ ymx = dmax(r_1,y3);
+ insd = 0;
+ i_2 = nxi0;
+ for (ixi = 1; ixi <= i_2; ++ixi) {
+ if (xi[ixi] >= xmn && xi[ixi] <= xmx) {
+ goto L10;
+ }
+ if (insd == 0) {
+ goto L20;
+ }
+ iximx = ixi - 1;
+ goto L30;
+L10:
+ if (insd == 1) {
+ goto L20;
+ }
+ insd = 1;
+ iximn = ixi;
+L20:
+ ;}
+ if (insd == 0) {
+ goto L150;
+ }
+ iximx = nxi0;
+L30:
+ i_2 = nyi0;
+ for (iyi = 1; iyi <= i_2; ++iyi) {
+ yii = yi[iyi];
+ if (yii < ymn || yii > ymx) {
+ goto L140;
+ }
+ i_3 = iximx;
+ for (ixi = iximn; ixi <= i_3; ++ixi) {
+ xii = xi[ixi];
+ l = 0;
+ if ((r_1 = (x1 - xii) * (y2 - yii) - (y1 - yii) * (x2 - xii))
+ < (float)0.) {
+ goto L130;
+ } else if (r_1 == 0) {
+ goto L40;
+ } else {
+ goto L50;
+ }
+L40:
+ l = 1;
+L50:
+ if ((r_1 = (x2 - xii) * (y3 - yii) - (y2 - yii) * (x3 - xii))
+ < (float)0.) {
+ goto L130;
+ } else if (r_1 == 0) {
+ goto L60;
+ } else {
+ goto L70;
+ }
+L60:
+ l = 1;
+L70:
+ if ((r_1 = (x3 - xii) * (y1 - yii) - (y3 - yii) * (x1 - xii))
+ < (float)0.) {
+ goto L130;
+ } else if (r_1 == 0) {
+ goto L80;
+ } else {
+ goto L90;
+ }
+L80:
+ l = 1;
+L90:
+ izi = nxi0 * (iyi - 1) + ixi;
+ if (l == 1) {
+ goto L100;
+ }
+ ++ngp0;
+ ++jigp0;
+ igp[jigp0] = izi;
+ goto L130;
+L100:
+ if (jigp1 > nxinyi) {
+ goto L120;
+ }
+ i_4 = nxinyi;
+ for (jigp1i = jigp1; jigp1i <= i_4; ++jigp1i) {
+ if (izi == igp[jigp1i]) {
+ goto L130;
+ }
+/* L110: */
+ }
+L120:
+ ++ngp1;
+ --jigp1;
+ igp[jigp1] = izi;
+L130:
+ ;}
+L140:
+ ;}
+L150:
+ ++jngp0;
+ ngp[jngp0] = ngp0;
+ --jngp1;
+ ngp[jngp1] = ngp1;
+/* L160: */
+ }
+/* determines grid points outside the data area. */
+/* - in semi-infinite rectangular area. */
+ i_1 = nl0;
+ for (il0 = 1; il0 <= i_1; ++il0) {
+ ngp0 = 0;
+ ngp1 = 0;
+ il0t3 = il0 * 3;
+ ip1 = ipl[il0t3 - 2];
+ ip2 = ipl[il0t3 - 1];
+ x1 = xd[ip1];
+ y1 = yd[ip1];
+ x2 = xd[ip2];
+ y2 = yd[ip2];
+ xmn = ximn;
+ xmx = ximx;
+ ymn = yimn;
+ ymx = yimx;
+ if (y2 >= y1) {
+ xmn = dmin(x1,x2);
+ }
+ if (y2 <= y1) {
+ xmx = dmax(x1,x2);
+ }
+ if (x2 <= x1) {
+ ymn = dmin(y1,y2);
+ }
+ if (x2 >= x1) {
+ ymx = dmax(y1,y2);
+ }
+ insd = 0;
+ i_2 = nxi0;
+ for (ixi = 1; ixi <= i_2; ++ixi) {
+ if (xi[ixi] >= xmn && xi[ixi] <= xmx) {
+ goto L170;
+ }
+ if (insd == 0) {
+ goto L180;
+ }
+ iximx = ixi - 1;
+ goto L190;
+L170:
+ if (insd == 1) {
+ goto L180;
+ }
+ insd = 1;
+ iximn = ixi;
+L180:
+ ;}
+ if (insd == 0) {
+ goto L310;
+ }
+ iximx = nxi0;
+L190:
+ i_2 = nyi0;
+ for (iyi = 1; iyi <= i_2; ++iyi) {
+ yii = yi[iyi];
+ if (yii < ymn || yii > ymx) {
+ goto L300;
+ }
+ i_3 = iximx;
+ for (ixi = iximn; ixi <= i_3; ++ixi) {
+ xii = xi[ixi];
+ l = 0;
+ if ((r_1 = (x1 - xii) * (y2 - yii) - (y1 - yii) * (x2 - xii))
+ < (float)0.) {
+ goto L210;
+ } else if (r_1 == 0) {
+ goto L200;
+ } else {
+ goto L290;
+ }
+L200:
+ l = 1;
+L210:
+ if ((r_1 = (x2 - x1) * (xii - x1) + (y2 - y1) * (yii - y1)) <
+ (float)0.) {
+ goto L290;
+ } else if (r_1 == 0) {
+ goto L220;
+ } else {
+ goto L230;
+ }
+L220:
+ l = 1;
+L230:
+ if ((r_1 = (x1 - x2) * (xii - x2) + (y1 - y2) * (yii - y2)) <
+ (float)0.) {
+ goto L290;
+ } else if (r_1 == 0) {
+ goto L240;
+ } else {
+ goto L250;
+ }
+L240:
+ l = 1;
+L250:
+ izi = nxi0 * (iyi - 1) + ixi;
+ if (l == 1) {
+ goto L260;
+ }
+ ++ngp0;
+ ++jigp0;
+ igp[jigp0] = izi;
+ goto L290;
+L260:
+ if (jigp1 > nxinyi) {
+ goto L280;
+ }
+ i_4 = nxinyi;
+ for (jigp1i = jigp1; jigp1i <= i_4; ++jigp1i) {
+ if (izi == igp[jigp1i]) {
+ goto L290;
+ }
+/* L270: */
+ }
+L280:
+ ++ngp1;
+ --jigp1;
+ igp[jigp1] = izi;
+L290:
+ ;}
+L300:
+ ;}
+L310:
+ ++jngp0;
+ ngp[jngp0] = ngp0;
+ --jngp1;
+ ngp[jngp1] = ngp1;
+/* - in semi-infinite triangular area. */
+ ngp0 = 0;
+ ngp1 = 0;
+ ilp1 = il0 % nl0 + 1;
+ ilp1t3 = ilp1 * 3;
+ ip3 = ipl[ilp1t3 - 1];
+ x3 = xd[ip3];
+ y3 = yd[ip3];
+ xmn = ximn;
+ xmx = ximx;
+ ymn = yimn;
+ ymx = yimx;
+ if (y3 >= y2 && y2 >= y1) {
+ xmn = x2;
+ }
+ if (y3 <= y2 && y2 <= y1) {
+ xmx = x2;
+ }
+ if (x3 <= x2 && x2 <= x1) {
+ ymn = y2;
+ }
+ if (x3 >= x2 && x2 >= x1) {
+ ymx = y2;
+ }
+ insd = 0;
+ i_2 = nxi0;
+ for (ixi = 1; ixi <= i_2; ++ixi) {
+ if (xi[ixi] >= xmn && xi[ixi] <= xmx) {
+ goto L320;
+ }
+ if (insd == 0) {
+ goto L330;
+ }
+ iximx = ixi - 1;
+ goto L340;
+L320:
+ if (insd == 1) {
+ goto L330;
+ }
+ insd = 1;
+ iximn = ixi;
+L330:
+ ;}
+ if (insd == 0) {
+ goto L440;
+ }
+ iximx = nxi0;
+L340:
+ i_2 = nyi0;
+ for (iyi = 1; iyi <= i_2; ++iyi) {
+ yii = yi[iyi];
+ if (yii < ymn || yii > ymx) {
+ goto L430;
+ }
+ i_3 = iximx;
+ for (ixi = iximn; ixi <= i_3; ++ixi) {
+ xii = xi[ixi];
+ l = 0;
+ if ((r_1 = (x1 - x2) * (xii - x2) + (y1 - y2) * (yii - y2)) <
+ (float)0.) {
+ goto L360;
+ } else if (r_1 == 0) {
+ goto L350;
+ } else {
+ goto L420;
+ }
+L350:
+ l = 1;
+L360:
+ if ((r_1 = (x3 - x2) * (xii - x2) + (y3 - y2) * (yii - y2)) <
+ (float)0.) {
+ goto L380;
+ } else if (r_1 == 0) {
+ goto L370;
+ } else {
+ goto L420;
+ }
+L370:
+ l = 1;
+L380:
+ izi = nxi0 * (iyi - 1) + ixi;
+ if (l == 1) {
+ goto L390;
+ }
+ ++ngp0;
+ ++jigp0;
+ igp[jigp0] = izi;
+ goto L420;
+L390:
+ if (jigp1 > nxinyi) {
+ goto L410;
+ }
+ i_4 = nxinyi;
+ for (jigp1i = jigp1; jigp1i <= i_4; ++jigp1i) {
+ if (izi == igp[jigp1i]) {
+ goto L420;
+ }
+/* L400: */
+ }
+L410:
+ ++ngp1;
+ --jigp1;
+ igp[jigp1] = izi;
+L420:
+ ;}
+L430:
+ ;}
+L440:
+ ++jngp0;
+ ngp[jngp0] = ngp0;
+ --jngp1;
+ ngp[jngp1] = ngp1;
+/* L450: */
+ }
+ return 0;
+} /* idgrid_ */
+
+int idlctn_(integer* ndp, real* xd, real* yd, integer* nt, integer* ipt, integer* nl, integer* ipl, real* xii, real* yii, integer* iti, integer* iwk, real* wk) {
+ /* System generated locals */
+ integer i_1;
+ real r_1, r_2;
+
+ /* Local variables */
+ static integer idsc[9], il1t3, itsc, it0t3, jiwk, ntsc[9], ntsci, i1, i2,
+ i3, itipv;
+ static real x0, y0, x1, y1, x2, y2, x3, y3, xi, yi;
+ static integer il1, il2, nl0, ip1, ip2, it0, ip3, nt0;
+ static real xs1, xs2, ys1, ys2;
+ static integer idp, isc, ntl, jwk;
+ static real xmn, ymn, xmx, ymx;
+ static integer ndp0;
+
+/* this subroutine locates a point, i.e., determines to what tri- */
+/* angle a given point (xii,yii) belongs. when the given point */
+/* does not lie inside the data area, this subroutine determines */
+/* the border line segment when the point lies in an outside */
+/* rectangular area, and two border line segments when the point */
+/* lies in an outside triangular area. */
+/* the input parameters are */
+/* ndp = number of data points, */
+/* xd,yd = arrays of dimension ndp containing the x and y */
+/* coordinates of the data points, */
+/* nt = number of triangles, */
+/* ipt = integer array of dimension 3*nt containing the */
+/* point numbers of the vertexes of the triangles, */
+/* nl = number of border line segments, */
+/* ipl = integer array of dimension 3*nl containing the */
+/* point numbers of the end points of the border */
+/* line segments and their respective triangle */
+/* numbers, */
+/* xii,yii = x and y coordinates of the point to be */
+/* located. */
+/* the output parameter is */
+/* iti = triangle number, when the point is inside the */
+/* data area, or */
+/* two border line segment numbers, il1 and il2, */
+/* coded to il1*(nt+nl)+il2, when the point is */
+/* outside the data area. */
+/* the other parameters are */
+/* iwk = integer array of dimension 18*ndp used inter- */
+/* nally as a work area, */
+/* wk = array of dimension 8*ndp used internally as a */
+/* work area. */
+/* declaration statements */
+/* statement functions */
+/* preliminary processing */
+ /* Parameter adjustments */
+ --wk;
+ --iwk;
+ --ipl;
+ --ipt;
+ --yd;
+ --xd;
+
+ /* Function Body */
+ ndp0 = *ndp;
+ nt0 = *nt;
+ nl0 = *nl;
+ ntl = nt0 + nl0;
+ x0 = *xii;
+ y0 = *yii;
+/* processing for a new set of data points */
+ if (idlc_1.nit != 0) {
+ goto L80;
+ }
+ idlc_1.nit = 1;
+/* - divides the x-y plane into nine rectangular sections. */
+ xmn = xd[1];
+ xmx = xmn;
+ ymn = yd[1];
+ ymx = ymn;
+ i_1 = ndp0;
+ for (idp = 2; idp <= i_1; ++idp) {
+ xi = xd[idp];
+ yi = yd[idp];
+ xmn = dmin(xi,xmn);
+ xmx = dmax(xi,xmx);
+ ymn = dmin(yi,ymn);
+ ymx = dmax(yi,ymx);
+/* L10: */
+ }
+ xs1 = (xmn + xmn + xmx) / (float)3.;
+ xs2 = (xmn + xmx + xmx) / (float)3.;
+ ys1 = (ymn + ymn + ymx) / (float)3.;
+ ys2 = (ymn + ymx + ymx) / (float)3.;
+/* - determines and stores in the iwk array triangle numbers of */
+/* - the triangles associated with each of the nine sections. */
+ for (isc = 1; isc <= 9; ++isc) {
+ ntsc[isc - 1] = 0;
+ idsc[isc - 1] = 0;
+/* L20: */
+ }
+ it0t3 = 0;
+ jwk = 0;
+ i_1 = nt0;
+ for (it0 = 1; it0 <= i_1; ++it0) {
+ it0t3 += 3;
+ i1 = ipt[it0t3 - 2];
+ i2 = ipt[it0t3 - 1];
+ i3 = ipt[it0t3];
+/* Computing MIN */
+ r_1 = xd[i1], r_2 = xd[i2], r_1 = min(r_1,r_2), r_2 = xd[i3];
+ xmn = dmin(r_1,r_2);
+/* Computing MAX */
+ r_1 = xd[i1], r_2 = xd[i2], r_1 = max(r_1,r_2), r_2 = xd[i3];
+ xmx = dmax(r_1,r_2);
+/* Computing MIN */
+ r_1 = yd[i1], r_2 = yd[i2], r_1 = min(r_1,r_2), r_2 = yd[i3];
+ ymn = dmin(r_1,r_2);
+/* Computing MAX */
+ r_1 = yd[i1], r_2 = yd[i2], r_1 = max(r_1,r_2), r_2 = yd[i3];
+ ymx = dmax(r_1,r_2);
+ if (ymn > ys1) {
+ goto L30;
+ }
+ if (xmn <= xs1) {
+ idsc[0] = 1;
+ }
+ if (xmx >= xs1 && xmn <= xs2) {
+ idsc[1] = 1;
+ }
+ if (xmx >= xs2) {
+ idsc[2] = 1;
+ }
+L30:
+ if (ymx < ys1 || ymn > ys2) {
+ goto L40;
+ }
+ if (xmn <= xs1) {
+ idsc[3] = 1;
+ }
+ if (xmx >= xs1 && xmn <= xs2) {
+ idsc[4] = 1;
+ }
+ if (xmx >= xs2) {
+ idsc[5] = 1;
+ }
+L40:
+ if (ymx < ys2) {
+ goto L50;
+ }
+ if (xmn <= xs1) {
+ idsc[6] = 1;
+ }
+ if (xmx >= xs1 && xmn <= xs2) {
+ idsc[7] = 1;
+ }
+ if (xmx >= xs2) {
+ idsc[8] = 1;
+ }
+L50:
+ for (isc = 1; isc <= 9; ++isc) {
+ if (idsc[isc - 1] == 0) {
+ goto L60;
+ }
+ jiwk = ntsc[isc - 1] * 9 + isc;
+ iwk[jiwk] = it0;
+ ++ntsc[isc - 1];
+ idsc[isc - 1] = 0;
+L60:
+ ;}
+/* - stores in the wk array the minimum and maximum of the x and */
+/* - y coordinate values for each of the triangle. */
+ jwk += 4;
+ wk[jwk - 3] = xmn;
+ wk[jwk - 2] = xmx;
+ wk[jwk - 1] = ymn;
+ wk[jwk] = ymx;
+/* L70: */
+ }
+ goto L110;
+/* checks if in the same triangle as previous. */
+L80:
+ it0 = itipv;
+ if (it0 > nt0) {
+ goto L90;
+ }
+ it0t3 = it0 * 3;
+ ip1 = ipt[it0t3 - 2];
+ x1 = xd[ip1];
+ y1 = yd[ip1];
+ ip2 = ipt[it0t3 - 1];
+ x2 = xd[ip2];
+ y2 = yd[ip2];
+ if ((x1 - x0) * (y2 - y0) - (y1 - y0) * (x2 - x0) < (float)0.) {
+ goto L110;
+ }
+ ip3 = ipt[it0t3];
+ x3 = xd[ip3];
+ y3 = yd[ip3];
+ if ((x2 - x0) * (y3 - y0) - (y2 - y0) * (x3 - x0) < (float)0.) {
+ goto L110;
+ }
+ if ((x3 - x0) * (y1 - y0) - (y3 - y0) * (x1 - x0) < (float)0.) {
+ goto L110;
+ }
+ goto L170;
+/* checks if on the same border line segment. */
+L90:
+ il1 = it0 / ntl;
+ il2 = it0 - il1 * ntl;
+ il1t3 = il1 * 3;
+ ip1 = ipl[il1t3 - 2];
+ x1 = xd[ip1];
+ y1 = yd[ip1];
+ ip2 = ipl[il1t3 - 1];
+ x2 = xd[ip2];
+ y2 = yd[ip2];
+ if (il2 != il1) {
+ goto L100;
+ }
+ if ((x1 - x2) * (x0 - x2) + (y1 - y2) * (y0 - y2) < (float)0.) {
+ goto L110;
+ }
+ if ((x2 - x1) * (x0 - x1) + (y2 - y1) * (y0 - y1) < (float)0.) {
+ goto L110;
+ }
+ if ((x1 - x0) * (y2 - y0) - (y1 - y0) * (x2 - x0) > (float)0.) {
+ goto L110;
+ }
+ goto L170;
+/* checks if between the same two border line segments. */
+L100:
+ if ((x1 - x2) * (x0 - x2) + (y1 - y2) * (y0 - y2) > (float)0.) {
+ goto L110;
+ }
+ ip3 = ipl[il2 * 3 - 1];
+ x3 = xd[ip3];
+ y3 = yd[ip3];
+ if ((x3 - x2) * (x0 - x2) + (y3 - y2) * (y0 - y2) <= (float)0.) {
+ goto L170;
+ }
+/* locates inside the data area. */
+/* - determines the section in which the point in question lies. */
+L110:
+ isc = 1;
+ if (x0 >= xs1) {
+ ++isc;
+ }
+ if (x0 >= xs2) {
+ ++isc;
+ }
+ if (y0 >= ys1) {
+ isc += 3;
+ }
+ if (y0 >= ys2) {
+ isc += 3;
+ }
+/* - searches through the triangles associated with the section. */
+ ntsci = ntsc[isc - 1];
+ if (ntsci <= 0) {
+ goto L130;
+ }
+ jiwk = isc - 9;
+ i_1 = ntsci;
+ for (itsc = 1; itsc <= i_1; ++itsc) {
+ jiwk += 9;
+ it0 = iwk[jiwk];
+ jwk = it0 << 2;
+ if (x0 < wk[jwk - 3]) {
+ goto L120;
+ }
+ if (x0 > wk[jwk - 2]) {
+ goto L120;
+ }
+ if (y0 < wk[jwk - 1]) {
+ goto L120;
+ }
+ if (y0 > wk[jwk]) {
+ goto L120;
+ }
+ it0t3 = it0 * 3;
+ ip1 = ipt[it0t3 - 2];
+ x1 = xd[ip1];
+ y1 = yd[ip1];
+ ip2 = ipt[it0t3 - 1];
+ x2 = xd[ip2];
+ y2 = yd[ip2];
+ if ((x1 - x0) * (y2 - y0) - (y1 - y0) * (x2 - x0) < (float)0.) {
+ goto L120;
+ }
+ ip3 = ipt[it0t3];
+ x3 = xd[ip3];
+ y3 = yd[ip3];
+ if ((x2 - x0) * (y3 - y0) - (y2 - y0) * (x3 - x0) < (float)0.) {
+ goto L120;
+ }
+ if ((x3 - x0) * (y1 - y0) - (y3 - y0) * (x1 - x0) < (float)0.) {
+ goto L120;
+ }
+ goto L170;
+L120:
+ ;}
+/* locates outside the data area. */
+L130:
+ i_1 = nl0;
+ for (il1 = 1; il1 <= i_1; ++il1) {
+ il1t3 = il1 * 3;
+ ip1 = ipl[il1t3 - 2];
+ x1 = xd[ip1];
+ y1 = yd[ip1];
+ ip2 = ipl[il1t3 - 1];
+ x2 = xd[ip2];
+ y2 = yd[ip2];
+ if ((x2 - x1) * (x0 - x1) + (y2 - y1) * (y0 - y1) < (float)0.) {
+ goto L150;
+ }
+ if ((x1 - x2) * (x0 - x2) + (y1 - y2) * (y0 - y2) < (float)0.) {
+ goto L140;
+ }
+ if ((x1 - x0) * (y2 - y0) - (y1 - y0) * (x2 - x0) > (float)0.) {
+ goto L150;
+ }
+ il2 = il1;
+ goto L160;
+L140:
+ il2 = il1 % nl0 + 1;
+ ip3 = ipl[il2 * 3 - 1];
+ x3 = xd[ip3];
+ y3 = yd[ip3];
+ if ((x3 - x2) * (x0 - x2) + (y3 - y2) * (y0 - y2) <= (float)0.) {
+ goto L160;
+ }
+L150:
+ ;}
+ it0 = 1;
+ goto L170;
+L160:
+ it0 = il1 * ntl + il2;
+/* normal exit */
+L170:
+ *iti = it0;
+ itipv = it0;
+ return 0;
+} /* idlctn_ */
+
+int idpdrv_(integer* ndp, real* xd, real* yd, real* zd, integer* ncp, integer* ipc, real* pd) {
+ /* System generated locals */
+ integer i_1, i_2, i_3;
+
+ /* Local variables */
+ static integer jipc;
+ static real dnmx, dnmy, dnmz, nmxx, nmxy, nmyx, nmyy;
+ static integer jipc0, ic2mn, ncpm1;
+ static real dnmxx, dnmxy, dnmyx, dnmyy, x0, y0, z0;
+ static integer ic1, ic2, ip0;
+ static real dx1, dy1, dz1, dx2, dy2, dz2, zx0, zy0;
+ static integer jpd, ipi;
+ static real nmx, nmy, nmz;
+ static integer jpd0, ncp0, ndp0;
+ static real dzx1, dzy1, dzx2, dzy2;
+
+/* this subroutine estimates partial derivatives of the first and */
+/* second order at the data points. */
+/* the input parameters are */
+/* ndp = number of data points, */
+/* xd,yd,zd = arrays of dimension ndp containing the x, */
+/* y, and z coordinates of the data points, */
+/* ncp = number of additional data points used for esti- */
+/* mating partial derivatives at each data point, */
+/* ipc = integer array of dimension ncp*ndp containing */
+/* the point numbers of ncp data points closest to */
+/* each of the ndp data points. */
+/* the output parameter is */
+/* pd = array of dimension 5*ndp, where the estimated */
+/* zx, zy, zxx, zxy, and zyy values at the data */
+/* points are to be stored. */
+/* declaration statements */
+/* preliminary processing */
+ /* Parameter adjustments */
+ --pd;
+ --ipc;
+ --zd;
+ --yd;
+ --xd;
+
+ /* Function Body */
+/* L10: */
+ ndp0 = *ndp;
+ ncp0 = *ncp;
+ ncpm1 = ncp0 - 1;
+/* estimation of zx and zy */
+/* L20: */
+ i_1 = ndp0;
+ for (ip0 = 1; ip0 <= i_1; ++ip0) {
+ x0 = xd[ip0];
+ y0 = yd[ip0];
+ z0 = zd[ip0];
+ nmx = (float)0.;
+ nmy = (float)0.;
+ nmz = (float)0.;
+ jipc0 = ncp0 * (ip0 - 1);
+ i_2 = ncpm1;
+ for (ic1 = 1; ic1 <= i_2; ++ic1) {
+ jipc = jipc0 + ic1;
+ ipi = ipc[jipc];
+ dx1 = xd[ipi] - x0;
+ dy1 = yd[ipi] - y0;
+ dz1 = zd[ipi] - z0;
+ ic2mn = ic1 + 1;
+ i_3 = ncp0;
+ for (ic2 = ic2mn; ic2 <= i_3; ++ic2) {
+ jipc = jipc0 + ic2;
+ ipi = ipc[jipc];
+ dx2 = xd[ipi] - x0;
+ dy2 = yd[ipi] - y0;
+ dnmz = dx1 * dy2 - dy1 * dx2;
+ if (dnmz == (float)0.) {
+ goto L22;
+ }
+ dz2 = zd[ipi] - z0;
+ dnmx = dy1 * dz2 - dz1 * dy2;
+ dnmy = dz1 * dx2 - dx1 * dz2;
+ if (dnmz >= (float)0.) {
+ goto L21;
+ }
+ dnmx = -(doublereal)dnmx;
+ dnmy = -(doublereal)dnmy;
+ dnmz = -(doublereal)dnmz;
+L21:
+ nmx += dnmx;
+ nmy += dnmy;
+ nmz += dnmz;
+L22:
+ ;}
+/* L23: */
+ }
+ jpd0 = ip0 * 5;
+ pd[jpd0 - 4] = -(doublereal)nmx / nmz;
+ pd[jpd0 - 3] = -(doublereal)nmy / nmz;
+/* L24: */
+ }
+/* estimation of zxx, zxy, and zyy */
+/* L30: */
+ i_1 = ndp0;
+ for (ip0 = 1; ip0 <= i_1; ++ip0) {
+ jpd0 += 5;
+ x0 = xd[ip0];
+ jpd0 = ip0 * 5;
+ y0 = yd[ip0];
+ zx0 = pd[jpd0 - 4];
+ zy0 = pd[jpd0 - 3];
+ nmxx = (float)0.;
+ nmxy = (float)0.;
+ nmyx = (float)0.;
+ nmyy = (float)0.;
+ nmz = (float)0.;
+ jipc0 = ncp0 * (ip0 - 1);
+ i_2 = ncpm1;
+ for (ic1 = 1; ic1 <= i_2; ++ic1) {
+ jipc = jipc0 + ic1;
+ ipi = ipc[jipc];
+ dx1 = xd[ipi] - x0;
+ dy1 = yd[ipi] - y0;
+ jpd = ipi * 5;
+ dzx1 = pd[jpd - 4] - zx0;
+ dzy1 = pd[jpd - 3] - zy0;
+ ic2mn = ic1 + 1;
+ i_3 = ncp0;
+ for (ic2 = ic2mn; ic2 <= i_3; ++ic2) {
+ jipc = jipc0 + ic2;
+ ipi = ipc[jipc];
+ dx2 = xd[ipi] - x0;
+ dy2 = yd[ipi] - y0;
+ dnmz = dx1 * dy2 - dy1 * dx2;
+ if (dnmz == (float)0.) {
+ goto L32;
+ }
+ jpd = ipi * 5;
+ dzx2 = pd[jpd - 4] - zx0;
+ dzy2 = pd[jpd - 3] - zy0;
+ dnmxx = dy1 * dzx2 - dzx1 * dy2;
+ dnmxy = dzx1 * dx2 - dx1 * dzx2;
+ dnmyx = dy1 * dzy2 - dzy1 * dy2;
+ dnmyy = dzy1 * dx2 - dx1 * dzy2;
+ if (dnmz >= (float)0.) {
+ goto L31;
+ }
+ dnmxx = -(doublereal)dnmxx;
+ dnmxy = -(doublereal)dnmxy;
+ dnmyx = -(doublereal)dnmyx;
+ dnmyy = -(doublereal)dnmyy;
+ dnmz = -(doublereal)dnmz;
+L31:
+ nmxx += dnmxx;
+ nmxy += dnmxy;
+ nmyx += dnmyx;
+ nmyy += dnmyy;
+ nmz += dnmz;
+L32:
+ ;}
+/* L33: */
+ }
+ pd[jpd0 - 2] = -(doublereal)nmxx / nmz;
+ pd[jpd0 - 1] = -(doublereal)(nmxy + nmyx) / (nmz * (float)2.);
+ pd[jpd0] = -(doublereal)nmyy / nmz;
+/* L34: */
+ }
+ return 0;
+} /* idpdrv_ */
+
+int idptip_(real* xd, real* yd, real* zd, integer* nt, integer* ipt, integer* nl, integer* ipl, real* pdd, integer* iti, real* xii, real* yii, real* zii) {
+ /* System generated locals */
+ static real equiv_0[1];
+
+ /* Local variables */
+ static integer jpdd, jipl, jipt;
+ static real csuv, thus, thsv, thuv, thxu, a, b, c, d;
+ static integer i;
+ static real u, v, x[3], y[3], z[3], g1, h1, h2, h3, g2, p0, p1, p2, p3,
+ p4;
+#define p5 (equiv_0)
+ static real x0, y0, aa, ab, bb, ad, bc, cc, cd, dd, ac, p00, ap, bp, cp,
+ pd[15];
+#define p50 (equiv_0)
+ static real dp, p10, p01, p20, p11, p02, p30, lu, lv, p40, p03, p04, p05,
+ p41, p14, p21, p31, p12, p13, p22, zu[3], zv[3], p32, p23, dx, dy;
+
+ static integer il1, il2, it0, idp, jpd, kpd;
+ static real dlt;
+ static integer ntl;
+ static real zuu[3], zuv[3], zvv[3], act2, bdt2, adbc;
+
+/* this subroutine performs punctual interpolation or extrapola- */
+/* tion, i.e., determines the z value at a point. */
+/* the input parameters are */
+/* xd,yd,zd = arrays of dimension ndp containing the x, */
+/* y, and z coordinates of the data points, where */
+/* ndp is the number of the data points, */
+/* nt = number of triangles, */
+/* ipt = integer array of dimension 3*nt containing the */
+/* point numbers of the vertexes of the triangles, */
+/* nl = number of border line segments, */
+/* ipl = integer array of dimension 3*nl containing the */
+/* point numbers of the end points of the border */
+/* line segments and their respective triangle */
+/* numbers, */
+/* pdd = array of dimension 5*ndp containing the partial */
+/* derivatives at the data points, */
+/* iti = triangle number of the triangle in which lies */
+/* the point for which interpolation is to be */
+/* performed, */
+/* xii,yii = x and y coordinates of the point for which */
+/* interpolation is to be performed. */
+/* the output parameter is */
+/* zii = interpolated z value. */
+/* declaration statements */
+/* preliminary processing */
+ /* Parameter adjustments */
+ --pdd;
+ --ipl;
+ --ipt;
+ --zd;
+ --yd;
+ --xd;
+
+ /* Function Body */
+/* L10: */
+ it0 = *iti;
+ ntl = *nt + *nl;
+ if (it0 <= ntl) {
+ goto L20;
+ }
+ il1 = it0 / ntl;
+ il2 = it0 - il1 * ntl;
+ if (il1 == il2) {
+ goto L40;
+ }
+ goto L60;
+/* calculation of zii by interpolation. */
+/* checks if the necessary coefficients have been calculated. */
+L20:
+ if (it0 == idpi_1.itpv) {
+ goto L30;
+ }
+/* loads coordinate and partial derivative values at the */
+/* vertexes. */
+/* L21: */
+ jipt = (it0 - 1) * 3;
+ jpd = 0;
+ for (i = 1; i <= 3; ++i) {
+ ++jipt;
+ idp = ipt[jipt];
+ x[i - 1] = xd[idp];
+ y[i - 1] = yd[idp];
+ z[i - 1] = zd[idp];
+ jpdd = (idp - 1) * 5;
+ for (kpd = 1; kpd <= 5; ++kpd) {
+ ++jpd;
+ ++jpdd;
+ pd[jpd - 1] = pdd[jpdd];
+/* L22: */
+ }
+/* L23: */
+ }
+/* determines the coefficients for the coordinate system */
+/* transformation from the x-y system to the u-v system */
+/* and vice versa. */
+/* L24: */
+ x0 = x[0];
+ y0 = y[0];
+ a = x[1] - x0;
+ b = x[2] - x0;
+ c = y[1] - y0;
+ d = y[2] - y0;
+ ad = a * d;
+ bc = b * c;
+ dlt = ad - bc;
+ ap = d / dlt;
+ bp = -(doublereal)b / dlt;
+ cp = -(doublereal)c / dlt;
+ dp = a / dlt;
+/* converts the partial derivatives at the vertexes of the */
+/* triangle for the u-v coordinate system. */
+/* L25: */
+ aa = a * a;
+ act2 = a * (float)2. * c;
+ cc = c * c;
+ ab = a * b;
+ adbc = ad + bc;
+ cd = c * d;
+ bb = b * b;
+ bdt2 = b * (float)2. * d;
+ dd = d * d;
+ for (i = 1; i <= 3; ++i) {
+ jpd = i * 5;
+ zu[i - 1] = a * pd[jpd - 5] + c * pd[jpd - 4];
+ zv[i - 1] = b * pd[jpd - 5] + d * pd[jpd - 4];
+ zuu[i - 1] = aa * pd[jpd - 3] + act2 * pd[jpd - 2] + cc * pd[jpd - 1];
+
+ zuv[i - 1] = ab * pd[jpd - 3] + adbc * pd[jpd - 2] + cd * pd[jpd - 1];
+
+ zvv[i - 1] = bb * pd[jpd - 3] + bdt2 * pd[jpd - 2] + dd * pd[jpd - 1];
+
+/* L26: */
+ }
+/* calculates the coefficients of the polynomial. */
+/* L27: */
+ p00 = z[0];
+ p10 = zu[0];
+ p01 = zv[0];
+ p20 = zuu[0] * (float).5;
+ p11 = zuv[0];
+ p02 = zvv[0] * (float).5;
+ h1 = z[1] - p00 - p10 - p20;
+ h2 = zu[1] - p10 - zuu[0];
+ h3 = zuu[1] - zuu[0];
+ p30 = h1 * (float)10. - h2 * (float)4. + h3 * (float).5;
+ p40 = h1 * (float)-15. + h2 * (float)7. - h3;
+ *p50 = h1 * (float)6. - h2 * (float)3. + h3 * (float).5;
+ h1 = z[2] - p00 - p01 - p02;
+ h2 = zv[2] - p01 - zvv[0];
+ h3 = zvv[2] - zvv[0];
+ p03 = h1 * (float)10. - h2 * (float)4. + h3 * (float).5;
+ p04 = h1 * (float)-15. + h2 * (float)7. - h3;
+ p05 = h1 * (float)6. - h2 * (float)3. + h3 * (float).5;
+ lu = sqrt(aa + cc);
+ lv = sqrt(bb + dd);
+ thxu = atan2(c, a);
+ thuv = atan2(d, b) - thxu;
+ csuv = cos(thuv);
+ p41 = lv * (float)5. * csuv / lu * *p50;
+ p14 = lu * (float)5. * csuv / lv * p05;
+ h1 = zv[1] - p01 - p11 - p41;
+ h2 = zuv[1] - p11 - p41 * (float)4.;
+ p21 = h1 * (float)3. - h2;
+ p31 = h1 * (float)-2. + h2;
+ h1 = zu[2] - p10 - p11 - p14;
+ h2 = zuv[2] - p11 - p14 * (float)4.;
+ p12 = h1 * (float)3. - h2;
+ p13 = h1 * (float)-2. + h2;
+ thus = atan2(d - c, b - a) - thxu;
+ thsv = thuv - thus;
+ aa = sin(thsv) / lu;
+ bb = -(doublereal)cos(thsv) / lu;
+ cc = sin(thus) / lv;
+ dd = cos(thus) / lv;
+ ac = aa * cc;
+ ad = aa * dd;
+ bc = bb * cc;
+ g1 = aa * ac * (bc * (float)3. + ad * (float)2.);
+ g2 = cc * ac * (ad * (float)3. + bc * (float)2.);
+ h1 = -(doublereal)aa * aa * aa * (aa * (float)5. * bb * *p50 + (bc * (
+ float)4. + ad) * p41) - cc * cc * cc * (cc * (float)5. * dd * p05
+ + (ad * (float)4. + bc) * p14);
+ h2 = zvv[1] * (float).5 - p02 - p12;
+ h3 = zuu[2] * (float).5 - p20 - p21;
+ p22 = (g1 * h2 + g2 * h3 - h1) / (g1 + g2);
+ p32 = h2 - p22;
+ p23 = h3 - p22;
+ idpi_1.itpv = it0;
+/* converts xii and yii to u-v system. */
+L30:
+ dx = *xii - x0;
+ dy = *yii - y0;
+ u = ap * dx + bp * dy;
+ v = cp * dx + dp * dy;
+/* evaluates the polynomial. */
+/* L31: */
+ p0 = p00 + v * (p01 + v * (p02 + v * (p03 + v * (p04 + v * p05))));
+ p1 = p10 + v * (p11 + v * (p12 + v * (p13 + v * p14)));
+ p2 = p20 + v * (p21 + v * (p22 + v * p23));
+ p3 = p30 + v * (p31 + v * p32);
+ p4 = p40 + v * p41;
+ *zii = p0 + u * (p1 + u * (p2 + u * (p3 + u * (p4 + u * *p5))));
+ return 0;
+/* calculation of zii by extrapolation in the rectangle. */
+/* checks if the necessary coefficients have been calculated. */
+L40:
+ if (it0 == idpi_1.itpv) {
+ goto L50;
+ }
+/* loads coordinate and partial derivative values at the end */
+/* points of the border line segment. */
+/* L41: */
+ jipl = (il1 - 1) * 3;
+ jpd = 0;
+ for (i = 1; i <= 2; ++i) {
+ ++jipl;
+ idp = ipl[jipl];
+ x[i - 1] = xd[idp];
+ y[i - 1] = yd[idp];
+ z[i - 1] = zd[idp];
+ jpdd = (idp - 1) * 5;
+ for (kpd = 1; kpd <= 5; ++kpd) {
+ ++jpd;
+ ++jpdd;
+ pd[jpd - 1] = pdd[jpdd];
+/* L42: */
+ }
+/* L43: */
+ }
+/* determines the coefficients for the coordinate system */
+/* transformation from the x-y system to the u-v system */
+/* and vice versa. */
+/* L44: */
+ x0 = x[0];
+ y0 = y[0];
+ a = y[1] - y[0];
+ b = x[1] - x[0];
+ c = -(doublereal)b;
+ d = a;
+ ad = a * d;
+ bc = b * c;
+ dlt = ad - bc;
+ ap = d / dlt;
+ bp = -(doublereal)b / dlt;
+ cp = -(doublereal)bp;
+ dp = ap;
+/* converts the partial derivatives at the end points of the */
+/* border line segment for the u-v coordinate system. */
+/* L45: */
+ aa = a * a;
+ act2 = a * (float)2. * c;
+ cc = c * c;
+ ab = a * b;
+ adbc = ad + bc;
+ cd = c * d;
+ bb = b * b;
+ bdt2 = b * (float)2. * d;
+ dd = d * d;
+ for (i = 1; i <= 2; ++i) {
+ jpd = i * 5;
+ zu[i - 1] = a * pd[jpd - 5] + c * pd[jpd - 4];
+ zv[i - 1] = b * pd[jpd - 5] + d * pd[jpd - 4];
+ zuu[i - 1] = aa * pd[jpd - 3] + act2 * pd[jpd - 2] + cc * pd[jpd - 1];
+
+ zuv[i - 1] = ab * pd[jpd - 3] + adbc * pd[jpd - 2] + cd * pd[jpd - 1];
+
+ zvv[i - 1] = bb * pd[jpd - 3] + bdt2 * pd[jpd - 2] + dd * pd[jpd - 1];
+
+/* L46: */
+ }
+/* calculates the coefficients of the polynomial. */
+/* L47: */
+ p00 = z[0];
+ p10 = zu[0];
+ p01 = zv[0];
+ p20 = zuu[0] * (float).5;
+ p11 = zuv[0];
+ p02 = zvv[0] * (float).5;
+ h1 = z[1] - p00 - p01 - p02;
+ h2 = zv[1] - p01 - zvv[0];
+ h3 = zvv[1] - zvv[0];
+ p03 = h1 * (float)10. - h2 * (float)4. + h3 * (float).5;
+ p04 = h1 * (float)-15. + h2 * (float)7. - h3;
+ p05 = h1 * (float)6. - h2 * (float)3. + h3 * (float).5;
+ h1 = zu[1] - p10 - p11;
+ h2 = zuv[1] - p11;
+ p12 = h1 * (float)3. - h2;
+ p13 = h1 * (float)-2. + h2;
+ p21 = (float)0.;
+ p23 = -(doublereal)zuu[1] + zuu[0];
+ p22 = p23 * (float)-1.5;
+ idpi_1.itpv = it0;
+/* converts xii and yii to u-v system. */
+L50:
+ dx = *xii - x0;
+ dy = *yii - y0;
+ u = ap * dx + bp * dy;
+ v = cp * dx + dp * dy;
+/* evaluates the polynomial. */
+/* L51: */
+ p0 = p00 + v * (p01 + v * (p02 + v * (p03 + v * (p04 + v * p05))));
+ p1 = p10 + v * (p11 + v * (p12 + v * p13));
+ p2 = p20 + v * (p21 + v * (p22 + v * p23));
+ *zii = p0 + u * (p1 + u * p2);
+ return 0;
+/* calculation of zii by extrapolation in the triangle. */
+/* checks if the necessary coefficients have been calculated. */
+L60:
+ if (it0 == idpi_1.itpv) {
+ goto L70;
+ }
+/* loads coordinate and partial derivative values at the vertex */
+/* of the triangle. */
+/* L61: */
+ jipl = il2 * 3 - 2;
+ idp = ipl[jipl];
+ x[0] = xd[idp];
+ y[0] = yd[idp];
+ z[0] = zd[idp];
+ jpdd = (idp - 1) * 5;
+ for (kpd = 1; kpd <= 5; ++kpd) {
+ ++jpdd;
+ pd[kpd - 1] = pdd[jpdd];
+/* L62: */
+ }
+/* calculates the coefficients of the polynomial. */
+/* L67: */
+ p00 = z[0];
+ p10 = pd[0];
+ p01 = pd[1];
+ p20 = pd[2] * (float).5;
+ p11 = pd[3];
+ p02 = pd[4] * (float).5;
+ idpi_1.itpv = it0;
+/* converts xii and yii to u-v system. */
+L70:
+ u = *xii - x[0];
+ v = *yii - y[0];
+/* evaluates the polynomial. */
+/* L71: */
+ p0 = p00 + v * (p01 + v * p02);
+ p1 = p10 + v * p11;
+ *zii = p0 + u * (p1 + u * p20);
+ return 0;
+} /* idptip_ */
+
+#undef p50
+#undef p5
+
+int idsfft_(integer *md, integer *ncp, integer *ndp, real *xd, real *yd, real *zd, integer *nxi, integer *nyi, real *xi, real *yi, real *zi, integer *iwk, real *wk) {
+ /* System generated locals */
+ integer i_1, i_2;
+
+ /* Local variables */
+ static integer jigp, jngp, nngp;
+ static integer jwipc, jwigp, jwipl, ncppv, ndppv, jwngp, jwiwl, jwipt,
+ jwiwp, nxipv, nyipv, jig0mn, jig1mn, jig0mx, jig1mx, jwigp0,
+ jwngp0, nl;
+ static integer nt;
+ static integer md0, il1, il2, iti, ixi, izi, iyi, ncp0, ndp0, ngp0, ngp1,
+ nxi0, nyi0;
+
+/* this subroutine performs smooth surface fitting when the pro- */
+/* jections of the data points in the x-y plane are irregularly */
+/* distributed in the plane. */
+/* the input parameters are */
+/* md = mode of computation (must be 1, 2, or 3), */
+/* = 1 for new ncp and/or new xd-yd, */
+/* = 2 for old ncp, old xd-yd, new xi-yi, */
+/* = 3 for old ncp, old xd-yd, old xi-yi, */
+/* ncp = number of additional data points used for esti- */
+/* mating partial derivatives at each data point */
+/* (must be 2 or greater, but smaller than ndp), */
+/* ndp = number of data points (must be 4 or greater), */
+/* xd = array of dimension ndp containing the x */
+/* coordinates of the data points, */
+/* yd = array of dimension ndp containing the y */
+/* coordinates of the data points, */
+/* zd = array of dimension ndp containing the z */
+/* coordinates of the data points, */
+/* nxi = number of output grid points in the x coordinate */
+/* (must be 1 or greater), */
+/* nyi = number of output grid points in the y coordinate */
+/* (must be 1 or greater), */
+/* xi = array of dimension nxi containing the x */
+/* coordinates of the output grid points, */
+/* yi = array of dimension nyi containing the y */
+/* coordinates of the output grid points. */
+/* the output parameter is */
+/* zi = doubly-dimensioned array of dimension (nxi,nyi), */
+/* where the interpolated z values at the output */
+/* grid points are to be stored. */
+/* the other parameters are */
+/* iwk = integer array of dimension */
+/* max0(31,27+ncp)*ndp+nxi*nyi */
+/* used internally as a work area, */
+/* wk = array of dimension 5*ndp used internally as a */
+/* work area. */
+/* the very first call to this subroutine and the call with a new */
+/* ncp value, a new ndp value, and/or new contents of the xd and */
+/* yd arrays must be made with md=1. the call with md=2 must be */
+/* preceded by another call with the same ncp and ndp values and */
+/* with the same contents of the xd and yd arrays. the call with */
+/* md=3 must be preceded by another call with the same ncp, ndp, */
+/* nxi, and nyi values and with the same contents of the xd, yd, */
+/* xi, and yi arrays. between the call with md=2 or md=3 and its */
+/* preceding call, the iwk and wk arrays must not be disturbed. */
+/* use of a value between 3 and 5 (inclusive) for ncp is recom- */
+/* mended unless there are evidences that dictate otherwise. */
+/* the lun constant in the data initialization statement is the */
+/* logical unit number of the standard output unit and is, */
+/* therefore, system dependent. */
+/* this subroutine calls the idcldp, idgrid, idpdrv, idptip, and */
+/* idtang subroutines. */
+/* declaration statements */
+ /* Parameter adjustments */
+ --wk;
+ --iwk;
+ --zi;
+ --yi;
+ --xi;
+ --zd;
+ --yd;
+ --xd;
+
+ /* Function Body */
+/* setting of some input parameters to local variables. */
+/* (for md=1,2,3) */
+/* L10: */
+ md0 = *md;
+ ncp0 = *ncp;
+ ndp0 = *ndp;
+ nxi0 = *nxi;
+ nyi0 = *nyi;
+/* error check. (for md=1,2,3) */
+/* L20: */
+ if (md0 < 1 || md0 > 3) {
+ goto L90;
+ }
+ if (ncp0 < 2 || ncp0 >= ndp0) {
+ goto L90;
+ }
+ if (ndp0 < 4) {
+ goto L90;
+ }
+ if (nxi0 < 1 || nyi0 < 1) {
+ goto L90;
+ }
+ if (md0 >= 2) {
+ goto L21;
+ }
+ iwk[1] = ncp0;
+ iwk[2] = ndp0;
+ goto L22;
+L21:
+ ncppv = iwk[1];
+ ndppv = iwk[2];
+ if (ncp0 != ncppv) {
+ goto L90;
+ }
+ if (ndp0 != ndppv) {
+ goto L90;
+ }
+L22:
+ if (md0 >= 3) {
+ goto L23;
+ }
+ iwk[3] = nxi0;
+ iwk[4] = nyi0;
+ goto L30;
+L23:
+ nxipv = iwk[3];
+ nyipv = iwk[4];
+ if (nxi0 != nxipv) {
+ goto L90;
+ }
+ if (nyi0 != nyipv) {
+ goto L90;
+ }
+/* allocation of storage areas in the iwk array. (for md=1,2,3) */
+L30:
+ jwipt = 16;
+ jwiwl = ndp0 * 6 + 1;
+ jwngp0 = jwiwl - 1;
+ jwipl = ndp0 * 24 + 1;
+ jwiwp = ndp0 * 30 + 1;
+ jwipc = ndp0 * 27 + 1;
+/* Computing MAX */
+ i_1 = 31, i_2 = ncp0 + 27;
+ jwigp0 = max(i_1,i_2) * ndp0;
+/* triangulates the x-y plane. (for md=1) */
+/* L40: */
+ if (md0 > 1) {
+ goto L50;
+ }
+ idtang_(&ndp0, &xd[1], &yd[1], &nt, &iwk[jwipt], &nl, &iwk[jwipl], &iwk[
+ jwiwl], &iwk[jwiwp], &wk[1]);
+ iwk[5] = nt;
+ iwk[6] = nl;
+ if (nt == 0) {
+ return 0;
+ }
+/* determines ncp points closest to each data point. (for md=1) */
+L50:
+ if (md0 > 1) {
+ goto L60;
+ }
+ idcldp_(&ndp0, &xd[1], &yd[1], &ncp0, &iwk[jwipc]);
+ if (iwk[jwipc] == 0) {
+ return 0;
+ }
+/* sorts output grid points in ascending order of the triangle */
+/* number and the border line segment number. (for md=1,2) */
+L60:
+ if (md0 == 3) {
+ goto L70;
+ }
+ idgrid_(&xd[1], &yd[1], &nt, &iwk[jwipt], &nl, &iwk[jwipl], &nxi0, &nyi0,
+ &xi[1], &yi[1], &iwk[jwngp0 + 1], &iwk[jwigp0 + 1]);
+/* estimates partial derivatives at all data points. */
+/* (for md=1,2,3) */
+L70:
+ idpdrv_(&ndp0, &xd[1], &yd[1], &zd[1], &ncp0, &iwk[jwipc], &wk[1]);
+/* interpolates the zi values. (for md=1,2,3) */
+/* L80: */
+ idpi_1.itpv = 0;
+ jig0mx = 0;
+ jig1mn = nxi0 * nyi0 + 1;
+ nngp = nt + (nl << 1);
+ i_1 = nngp;
+ for (jngp = 1; jngp <= i_1; ++jngp) {
+ iti = jngp;
+ if (jngp <= nt) {
+ goto L81;
+ }
+ il1 = (jngp - nt + 1) / 2;
+ il2 = (jngp - nt + 2) / 2;
+ if (il2 > nl) {
+ il2 = 1;
+ }
+ iti = il1 * (nt + nl) + il2;
+L81:
+ jwngp = jwngp0 + jngp;
+ ngp0 = iwk[jwngp];
+ if (ngp0 == 0) {
+ goto L86;
+ }
+ jig0mn = jig0mx + 1;
+ jig0mx += ngp0;
+ i_2 = jig0mx;
+ for (jigp = jig0mn; jigp <= i_2; ++jigp) {
+ jwigp = jwigp0 + jigp;
+ izi = iwk[jwigp];
+ iyi = (izi - 1) / nxi0 + 1;
+ ixi = izi - nxi0 * (iyi - 1);
+ idptip_(&xd[1], &yd[1], &zd[1], &nt, &iwk[jwipt], &nl, &iwk[jwipl]
+ , &wk[1], &iti, &xi[ixi], &yi[iyi], &zi[izi]);
+/* L82: */
+ }
+L86:
+ jwngp = jwngp0 + (nngp << 1) + 1 - jngp;
+ ngp1 = iwk[jwngp];
+ if (ngp1 == 0) {
+ goto L89;
+ }
+ jig1mx = jig1mn - 1;
+ jig1mn -= ngp1;
+ i_2 = jig1mx;
+ for (jigp = jig1mn; jigp <= i_2; ++jigp) {
+ jwigp = jwigp0 + jigp;
+ izi = iwk[jwigp];
+ iyi = (izi - 1) / nxi0 + 1;
+ ixi = izi - nxi0 * (iyi - 1);
+ idptip_(&xd[1], &yd[1], &zd[1], &nt, &iwk[jwipt], &nl, &iwk[jwipl]
+ , &wk[1], &iti, &xi[ixi], &yi[iyi], &zi[izi]);
+/* L87: */
+ }
+L89:
+ ;}
+ return 0;
+/* error exit */
+L90:
+ err2090_();
+ return 0;
+/* format statement for error message */
+/* L2090: */
+} /* idsfft_ */
+
+int idtang_(integer *ndp, real *xd, real *yd, integer *nt, integer *ipt, integer *nl, integer *ipl, integer *iwl, integer *iwp, real *wk) {
+ /* Initialized data */
+
+ static real ratio = (float)1e-6;
+ static integer nrep = 100;
+
+ /* System generated locals */
+ integer i_1, i_2, i_3, i_4;
+ real r_1, r_2;
+
+ /* Local variables */
+ static integer nlfc, ip1p1;
+ static real dsq12, armn;
+ static integer irep;
+ static real dsqi;
+ static integer jp2t3, jp3t3, jpmn;
+ static real dxmn, dymn, xdmp, ydmp, armx;
+ static integer ipti, it1t3, it2t3, jpmx;
+ static real dxmx, dymx;
+ static integer ndpm1, ilft2, iplj1, iplj2, ipmn1, ipmn2, ipti1, ipti2,
+ nlft2, nlnt3, nsht3, itt3r;
+ static real dsqmn;
+ static integer ntt3p3;
+ static real dsqmx, x1, y1;
+ static integer jwl1mn;
+ static real ar;
+ static integer ip, jp;
+ static real dx, dy;
+ static integer it;
+ static integer ip1, ip2, jp1, jp2, ip3, nl0, nt0, ilf, jpc;
+ static real dx21, dy21;
+ static integer nlf, itf[2], nln, nsh, ntf, jwl, its, ndp0, ipl1, ipl2,
+ jlt3, ipt1, ipt2, ipt3, nlt3, jwl1, itt3, ntt3;
+
+/* this subroutine performs triangulation. it divides the x-y */
+/* plane into a number of triangles according to given data */
+/* points in the plane, determines line segments that form the */
+/* border of data area, and determines the triangle numbers */
+/* corresponding to the border line segments. */
+/* at completion, point numbers of the vertexes of each triangle */
+/* are listed counter-clockwise. point numbers of the end points */
+/* of each border line segment are listed counter-clockwise, */
+/* listing order of the line segments being counter-clockwise. */
+/* the lun constant in the data initialization statement is the */
+/* logical unit number of the standard output unit and is, */
+/* therefore, system dependent. */
+/* this subroutine calls the idxchg function. */
+/* the input parameters are */
+/* ndp = number of data points, */
+/* xd = array of dimension ndp containing the */
+/* x coordinates of the data points, */
+/* yd = array of dimension ndp containing the */
+/* y coordinates of the data points. */
+/* the output parameters are */
+/* nt = number of triangles, */
+/* ipt = integer array of dimension 6*ndp-15, where the */
+/* point numbers of the vertexes of the (it)th */
+/* triangle are to be stored as the (3*it-2)nd, */
+/* (3*it-1)st, and (3*it)th elements, */
+/* it=1,2,...,nt, */
+/* nl = number of border line segments, */
+/* ipl = integer array of dimension 6*ndp, where the */
+/* point numbers of the end points of the (il)th */
+/* border line segment and its respective triangle */
+/* number are to be stored as the (3*il-2)nd, */
+/* (3*il-1)st, and (3*il)th elements, */
+/* il=1,2,..., nl. */
+/* the other parameters are */
+/* iwl = integer array of dimension 18*ndp used */
+/* internally as a work area, */
+/* iwp = integer array of dimension ndp used */
+/* internally as a work area, */
+/* wk = array of dimension ndp used internally as a */
+/* work area. */
+/* declaration statements */
+ /* Parameter adjustments */
+ --wk;
+ --iwp;
+ --iwl;
+ --ipl;
+ --ipt;
+ --yd;
+ --xd;
+
+ /* Function Body */
+/* statement functions */
+/* preliminary processing */
+/* L10: */
+ ndp0 = *ndp;
+ ndpm1 = ndp0 - 1;
+ if (ndp0 < 4) {
+ goto L90;
+ }
+/* determines the closest pair of data points and their midpoint. */
+/* L20: */
+/* Computing 2nd power */
+ r_1 = xd[2] - xd[1];
+/* Computing 2nd power */
+ r_2 = yd[2] - yd[1];
+ dsqmn = r_1 * r_1 + r_2 * r_2;
+ ipmn1 = 1;
+ ipmn2 = 2;
+ i_1 = ndpm1;
+ for (ip1 = 1; ip1 <= i_1; ++ip1) {
+ x1 = xd[ip1];
+ y1 = yd[ip1];
+ ip1p1 = ip1 + 1;
+ i_2 = ndp0;
+ for (ip2 = ip1p1; ip2 <= i_2; ++ip2) {
+/* Computing 2nd power */
+ r_1 = xd[ip2] - x1;
+/* Computing 2nd power */
+ r_2 = yd[ip2] - y1;
+ dsqi = r_1 * r_1 + r_2 * r_2;
+ if (dsqi == (float)0.) {
+ goto L91;
+ }
+ if (dsqi >= dsqmn) {
+ goto L21;
+ }
+ dsqmn = dsqi;
+ ipmn1 = ip1;
+ ipmn2 = ip2;
+L21:
+ ;}
+/* L22: */
+ }
+ dsq12 = dsqmn;
+ xdmp = (xd[ipmn1] + xd[ipmn2]) / (float)2.;
+ ydmp = (yd[ipmn1] + yd[ipmn2]) / (float)2.;
+/* sorts the other (ndp-2) data points in ascending order of */
+/* distance from the midpoint and stores the sorted data point */
+/* numbers in the iwp array. */
+/* L30: */
+ jp1 = 2;
+ i_1 = ndp0;
+ for (ip1 = 1; ip1 <= i_1; ++ip1) {
+ if (ip1 == ipmn1 || ip1 == ipmn2) {
+ goto L31;
+ }
+ ++jp1;
+ iwp[jp1] = ip1;
+/* Computing 2nd power */
+ r_1 = xd[ip1] - xdmp;
+/* Computing 2nd power */
+ r_2 = yd[ip1] - ydmp;
+ wk[jp1] = r_1 * r_1 + r_2 * r_2;
+L31:
+ ;}
+ i_1 = ndpm1;
+ for (jp1 = 3; jp1 <= i_1; ++jp1) {
+ dsqmn = wk[jp1];
+ jpmn = jp1;
+ i_2 = ndp0;
+ for (jp2 = jp1; jp2 <= i_2; ++jp2) {
+ if (wk[jp2] >= dsqmn) {
+ goto L32;
+ }
+ dsqmn = wk[jp2];
+ jpmn = jp2;
+L32:
+ ;}
+ its = iwp[jp1];
+ iwp[jp1] = iwp[jpmn];
+ iwp[jpmn] = its;
+ wk[jpmn] = wk[jp1];
+/* L33: */
+ }
+/* if necessary, modifies the ordering in such a way that the */
+/* first three data points are not collinear. */
+/* L35: */
+ ar = dsq12 * ratio;
+ x1 = xd[ipmn1];
+ y1 = yd[ipmn1];
+ dx21 = xd[ipmn2] - x1;
+ dy21 = yd[ipmn2] - y1;
+ i_1 = ndp0;
+ for (jp = 3; jp <= i_1; ++jp) {
+ ip = iwp[jp];
+ if ((r_1 = (yd[ip] - y1) * dx21 - (xd[ip] - x1) * dy21, dabs(r_1)) >
+ ar) {
+ goto L37;
+ }
+/* L36: */
+ }
+ goto L92;
+L37:
+ if (jp == 3) {
+ goto L40;
+ }
+ jpmx = jp;
+ jp = jpmx + 1;
+ i_1 = jpmx;
+ for (jpc = 4; jpc <= i_1; ++jpc) {
+ --jp;
+ iwp[jp] = iwp[jp - 1];
+/* L38: */
+ }
+ iwp[3] = ip;
+/* forms the first triangle. stores point numbers of the ver- */
+/* texes of the triangle in the ipt array, and stores point num- */
+/* bers of the border line segments and the triangle number in */
+/* the ipl array. */
+L40:
+ ip1 = ipmn1;
+ ip2 = ipmn2;
+ ip3 = iwp[3];
+ if ((yd[ip3] - yd[ip1]) * (xd[ip2] - xd[ip1]) - (xd[ip3] - xd[ip1]) * (yd[
+ ip2] - yd[ip1]) >= (float)0.) {
+ goto L41;
+ }
+ ip1 = ipmn2;
+ ip2 = ipmn1;
+L41:
+ nt0 = 1;
+ ntt3 = 3;
+ ipt[1] = ip1;
+ ipt[2] = ip2;
+ ipt[3] = ip3;
+ nl0 = 3;
+ nlt3 = 9;
+ ipl[1] = ip1;
+ ipl[2] = ip2;
+ ipl[3] = 1;
+ ipl[4] = ip2;
+ ipl[5] = ip3;
+ ipl[6] = 1;
+ ipl[7] = ip3;
+ ipl[8] = ip1;
+ ipl[9] = 1;
+/* adds the remaining (ndp-3) data points, one by one. */
+/* L50: */
+ i_1 = ndp0;
+ for (jp1 = 4; jp1 <= i_1; ++jp1) {
+ ip1 = iwp[jp1];
+ x1 = xd[ip1];
+ y1 = yd[ip1];
+/* - determines the visible border line segments. */
+ ip2 = ipl[1];
+ jpmn = 1;
+ dxmn = xd[ip2] - x1;
+ dymn = yd[ip2] - y1;
+/* Computing 2nd power */
+ r_1 = dxmn;
+/* Computing 2nd power */
+ r_2 = dymn;
+ dsqmn = r_1 * r_1 + r_2 * r_2;
+ armn = dsqmn * ratio;
+ jpmx = 1;
+ dxmx = dxmn;
+ dymx = dymn;
+ dsqmx = dsqmn;
+ armx = armn;
+ i_2 = nl0;
+ for (jp2 = 2; jp2 <= i_2; ++jp2) {
+ ip2 = ipl[jp2 * 3 - 2];
+ dx = xd[ip2] - x1;
+ dy = yd[ip2] - y1;
+ ar = dy * dxmn - dx * dymn;
+ if (ar > armn) {
+ goto L51;
+ }
+/* Computing 2nd power */
+ r_1 = dx;
+/* Computing 2nd power */
+ r_2 = dy;
+ dsqi = r_1 * r_1 + r_2 * r_2;
+ if (ar >= -(doublereal)armn && dsqi >= dsqmn) {
+ goto L51;
+ }
+ jpmn = jp2;
+ dxmn = dx;
+ dymn = dy;
+ dsqmn = dsqi;
+ armn = dsqmn * ratio;
+L51:
+ ar = dy * dxmx - dx * dymx;
+ if (ar < -(doublereal)armx) {
+ goto L52;
+ }
+/* Computing 2nd power */
+ r_1 = dx;
+/* Computing 2nd power */
+ r_2 = dy;
+ dsqi = r_1 * r_1 + r_2 * r_2;
+ if (ar <= armx && dsqi >= dsqmx) {
+ goto L52;
+ }
+ jpmx = jp2;
+ dxmx = dx;
+ dymx = dy;
+ dsqmx = dsqi;
+ armx = dsqmx * ratio;
+L52:
+ ;}
+ if (jpmx < jpmn) {
+ jpmx += nl0;
+ }
+ nsh = jpmn - 1;
+ if (nsh <= 0) {
+ goto L60;
+ }
+/* - shifts (rotates) the ipl array to have the invisible border */
+/* - line segments contained in the first part of the ipl array. */
+ nsht3 = nsh * 3;
+ i_2 = nsht3;
+ for (jp2t3 = 3; jp2t3 <= i_2; jp2t3 += 3) {
+ jp3t3 = jp2t3 + nlt3;
+ ipl[jp3t3 - 2] = ipl[jp2t3 - 2];
+ ipl[jp3t3 - 1] = ipl[jp2t3 - 1];
+ ipl[jp3t3] = ipl[jp2t3];
+/* L53: */
+ }
+ i_2 = nlt3;
+ for (jp2t3 = 3; jp2t3 <= i_2; jp2t3 += 3) {
+ jp3t3 = jp2t3 + nsht3;
+ ipl[jp2t3 - 2] = ipl[jp3t3 - 2];
+ ipl[jp2t3 - 1] = ipl[jp3t3 - 1];
+ ipl[jp2t3] = ipl[jp3t3];
+/* L54: */
+ }
+ jpmx -= nsh;
+/* - adds triangles to the ipt array, updates border line */
+/* - segments in the ipl array, and sets flags for the border */
+/* - line segments to be reexamined in the iwl array. */
+L60:
+ jwl = 0;
+ i_2 = nl0;
+ for (jp2 = jpmx; jp2 <= i_2; ++jp2) {
+ jp2t3 = jp2 * 3;
+ ipl1 = ipl[jp2t3 - 2];
+ ipl2 = ipl[jp2t3 - 1];
+ it = ipl[jp2t3];
+/* - - adds a triangle to the ipt array. */
+ ++nt0;
+ ntt3 += 3;
+ ipt[ntt3 - 2] = ipl2;
+ ipt[ntt3 - 1] = ipl1;
+ ipt[ntt3] = ip1;
+/* - - updates border line segments in the ipl array. */
+ if (jp2 != jpmx) {
+ goto L61;
+ }
+ ipl[jp2t3 - 1] = ip1;
+ ipl[jp2t3] = nt0;
+L61:
+ if (jp2 != nl0) {
+ goto L62;
+ }
+ nln = jpmx + 1;
+ nlnt3 = nln * 3;
+ ipl[nlnt3 - 2] = ip1;
+ ipl[nlnt3 - 1] = ipl[1];
+ ipl[nlnt3] = nt0;
+/* - - determines the vertex that does not lie on the border */
+/* - - line segments. */
+L62:
+ itt3 = it * 3;
+ ipti = ipt[itt3 - 2];
+ if (ipti != ipl1 && ipti != ipl2) {
+ goto L63;
+ }
+ ipti = ipt[itt3 - 1];
+ if (ipti != ipl1 && ipti != ipl2) {
+ goto L63;
+ }
+ ipti = ipt[itt3];
+/* - - checks if the exchange is necessary. */
+L63:
+ if (idxchg_(&xd[1], &yd[1], &ip1, &ipti, &ipl1, &ipl2) == 0) {
+ goto L64;
+ }
+/* - - modifies the ipt array when necessary. */
+ ipt[itt3 - 2] = ipti;
+ ipt[itt3 - 1] = ipl1;
+ ipt[itt3] = ip1;
+ ipt[ntt3 - 1] = ipti;
+ if (jp2 == jpmx) {
+ ipl[jp2t3] = it;
+ }
+ if (jp2 == nl0 && ipl[3] == it) {
+ ipl[3] = nt0;
+ }
+/* - - sets flags in the iwl array. */
+ jwl += 4;
+ iwl[jwl - 3] = ipl1;
+ iwl[jwl - 2] = ipti;
+ iwl[jwl - 1] = ipti;
+ iwl[jwl] = ipl2;
+L64:
+ ;}
+ nl0 = nln;
+ nlt3 = nlnt3;
+ nlf = jwl / 2;
+ if (nlf == 0) {
+ goto L79;
+ }
+/* - improves triangulation. */
+/* L70: */
+ ntt3p3 = ntt3 + 3;
+ i_2 = nrep;
+ for (irep = 1; irep <= i_2; ++irep) {
+ i_3 = nlf;
+ for (ilf = 1; ilf <= i_3; ++ilf) {
+ ilft2 = ilf << 1;
+ ipl1 = iwl[ilft2 - 1];
+ ipl2 = iwl[ilft2];
+/* - - locates in the ipt array two triangles on both sides
+of */
+/* - - the flagged line segment. */
+ ntf = 0;
+ i_4 = ntt3;
+ for (itt3r = 3; itt3r <= i_4; itt3r += 3) {
+ itt3 = ntt3p3 - itt3r;
+ ipt1 = ipt[itt3 - 2];
+ ipt2 = ipt[itt3 - 1];
+ ipt3 = ipt[itt3];
+ if (ipl1 != ipt1 && ipl1 != ipt2 && ipl1 != ipt3) {
+ goto L71;
+ }
+ if (ipl2 != ipt1 && ipl2 != ipt2 && ipl2 != ipt3) {
+ goto L71;
+ }
+ ++ntf;
+ itf[ntf - 1] = itt3 / 3;
+ if (ntf == 2) {
+ goto L72;
+ }
+L71:
+ ;}
+ if (ntf < 2) {
+ goto L76;
+ }
+/* - - determines the vertexes of the triangles that do not
+lie */
+/* - - on the line segment. */
+L72:
+ it1t3 = itf[0] * 3;
+ ipti1 = ipt[it1t3 - 2];
+ if (ipti1 != ipl1 && ipti1 != ipl2) {
+ goto L73;
+ }
+ ipti1 = ipt[it1t3 - 1];
+ if (ipti1 != ipl1 && ipti1 != ipl2) {
+ goto L73;
+ }
+ ipti1 = ipt[it1t3];
+L73:
+ it2t3 = itf[1] * 3;
+ ipti2 = ipt[it2t3 - 2];
+ if (ipti2 != ipl1 && ipti2 != ipl2) {
+ goto L74;
+ }
+ ipti2 = ipt[it2t3 - 1];
+ if (ipti2 != ipl1 && ipti2 != ipl2) {
+ goto L74;
+ }
+ ipti2 = ipt[it2t3];
+/* - - checks if the exchange is necessary. */
+L74:
+ if (idxchg_(&xd[1], &yd[1], &ipti1, &ipti2, &ipl1, &ipl2) ==
+ 0) {
+ goto L76;
+ }
+/* - - modifies the ipt array when necessary. */
+ ipt[it1t3 - 2] = ipti1;
+ ipt[it1t3 - 1] = ipti2;
+ ipt[it1t3] = ipl1;
+ ipt[it2t3 - 2] = ipti2;
+ ipt[it2t3 - 1] = ipti1;
+ ipt[it2t3] = ipl2;
+/* - - sets new flags. */
+ jwl += 8;
+ iwl[jwl - 7] = ipl1;
+ iwl[jwl - 6] = ipti1;
+ iwl[jwl - 5] = ipti1;
+ iwl[jwl - 4] = ipl2;
+ iwl[jwl - 3] = ipl2;
+ iwl[jwl - 2] = ipti2;
+ iwl[jwl - 1] = ipti2;
+ iwl[jwl] = ipl1;
+ i_4 = nlt3;
+ for (jlt3 = 3; jlt3 <= i_4; jlt3 += 3) {
+ iplj1 = ipl[jlt3 - 2];
+ iplj2 = ipl[jlt3 - 1];
+ if ((iplj1 == ipl1 && iplj2 == ipti2) || (iplj2 == ipl1 && iplj1 == ipti2)) {
+ ipl[jlt3] = itf[0];
+ }
+ if ((iplj1 == ipl2 && iplj2 == ipti1) || (iplj2 == ipl2 && iplj1 == ipti1)) {
+ ipl[jlt3] = itf[1];
+ }
+/* L75: */
+ }
+L76:
+ ;}
+ nlfc = nlf;
+ nlf = jwl / 2;
+ if (nlf == nlfc) {
+ goto L79;
+ }
+/* - - resets the iwl array for the next round. */
+ jwl = 0;
+ jwl1mn = (nlfc + 1) << 1;
+ nlft2 = nlf << 1;
+ i_3 = nlft2;
+ for (jwl1 = jwl1mn; jwl1 <= i_3; jwl1 += 2) {
+ jwl += 2;
+ iwl[jwl - 1] = iwl[jwl1 - 1];
+ iwl[jwl] = iwl[jwl1];
+/* L77: */
+ }
+ nlf = jwl / 2;
+/* L78: */
+ }
+L79:
+ ;}
+/* rearranges the ipt array so that the vertexes of each triangle */
+/* are listed counter-clockwise. */
+/* L80: */
+ i_1 = ntt3;
+ for (itt3 = 3; itt3 <= i_1; itt3 += 3) {
+ ip1 = ipt[itt3 - 2];
+ ip2 = ipt[itt3 - 1];
+ ip3 = ipt[itt3];
+ if ((yd[ip3] - yd[ip1]) * (xd[ip2] - xd[ip1]) - (xd[ip3] - xd[ip1]) *
+ (yd[ip2] - yd[ip1]) >= (float)0.) {
+ goto L81;
+ }
+ ipt[itt3 - 2] = ip2;
+ ipt[itt3 - 1] = ip1;
+L81:
+ ;}
+ *nt = nt0;
+ *nl = nl0;
+ return 0;
+/* error exit */
+L90:
+ err2090_();
+ goto L93;
+L91:
+ err2091b_();
+ goto L93;
+L92:
+ err2092_();
+L93:
+ err2093_();
+ *nt = 0;
+ return 0;
+/* format statements */
+/* L2090: */
+/* L2091: */
+/* L2092: */
+/* L2093: */
+} /* idtang_ */
+
+integer idxchg_(real *x, real *y, integer *i1, integer *i2, integer *i3, integer *i4) {
+ /* System generated locals */
+ integer ret_val;
+ real r_1, r_2;
+ static real equiv_0[1], equiv_1[1], equiv_2[1], equiv_3[1], equiv_4[1],
+ equiv_5[1];
+
+ /* Local variables */
+ static real u1, u2, u3, x1, y1, x2, y2, x3, y3, x4, y4, u4;
+ static integer idx;
+#define a1sq (equiv_2)
+#define b1sq (equiv_3)
+#define c1sq (equiv_0)
+#define c2sq (equiv_0)
+#define a3sq (equiv_1)
+#define b2sq (equiv_1)
+#define b3sq (equiv_2)
+#define a4sq (equiv_3)
+#define b4sq (equiv_4)
+#define a2sq (equiv_4)
+#define c4sq (equiv_5)
+#define c3sq (equiv_5)
+ static real s1sq, s2sq, s3sq, s4sq;
+
+/* this function determines whether or not the exchange of two */
+/* triangles is necessary on the basis of max-min-angle criterion */
+/* by c. l. lawson. */
+/* the input parameters are */
+/* x,y = arrays containing the coordinates of the data */
+/* points, */
+/* i1,i2,i3,i4 = point numbers of four points p1, p2, */
+/* p3, and p4 that form a quadrilateral with p3 */
+/* and p4 connected diagonally. */
+/* this function returns an integer value 1 (one) when an ex- */
+/* change is necessary, and 0 (zero) otherwise. */
+/* declaration statements */
+/* preliminary processing */
+ /* Parameter adjustments */
+ --y;
+ --x;
+
+ /* Function Body */
+/* L10: */
+ x1 = x[*i1];
+ y1 = y[*i1];
+ x2 = x[*i2];
+ y2 = y[*i2];
+ x3 = x[*i3];
+ y3 = y[*i3];
+ x4 = x[*i4];
+ y4 = y[*i4];
+/* calculation */
+/* L20: */
+ idx = 0;
+ u3 = (y2 - y3) * (x1 - x3) - (x2 - x3) * (y1 - y3);
+ u4 = (y1 - y4) * (x2 - x4) - (x1 - x4) * (y2 - y4);
+ if (u3 * u4 <= (float)0.) {
+ goto L30;
+ }
+ u1 = (y3 - y1) * (x4 - x1) - (x3 - x1) * (y4 - y1);
+ u2 = (y4 - y2) * (x3 - x2) - (x4 - x2) * (y3 - y2);
+/* Computing 2nd power */
+ r_1 = x1 - x3;
+/* Computing 2nd power */
+ r_2 = y1 - y3;
+ *a1sq = r_1 * r_1 + r_2 * r_2;
+/* Computing 2nd power */
+ r_1 = x4 - x1;
+/* Computing 2nd power */
+ r_2 = y4 - y1;
+ *b1sq = r_1 * r_1 + r_2 * r_2;
+/* Computing 2nd power */
+ r_1 = x3 - x4;
+/* Computing 2nd power */
+ r_2 = y3 - y4;
+ *c1sq = r_1 * r_1 + r_2 * r_2;
+/* Computing 2nd power */
+ r_1 = x2 - x4;
+/* Computing 2nd power */
+ r_2 = y2 - y4;
+ *a2sq = r_1 * r_1 + r_2 * r_2;
+/* Computing 2nd power */
+ r_1 = x3 - x2;
+/* Computing 2nd power */
+ r_2 = y3 - y2;
+ *b2sq = r_1 * r_1 + r_2 * r_2;
+/* Computing 2nd power */
+ r_1 = x2 - x1;
+/* Computing 2nd power */
+ r_2 = y2 - y1;
+ *c3sq = r_1 * r_1 + r_2 * r_2;
+ s1sq = u1 * u1 / (*c1sq * dmax(*a1sq,*b1sq));
+ s2sq = u2 * u2 / (*c2sq * dmax(*a2sq,*b2sq));
+ s3sq = u3 * u3 / (*c3sq * dmax(*a3sq,*b3sq));
+ s4sq = u4 * u4 / (*c4sq * dmax(*a4sq,*b4sq));
+ if (dmin(s1sq,s2sq) < dmin(s3sq,s4sq)) {
+ idx = 1;
+ }
+L30:
+ ret_val = idx;
+ return ret_val;
+} /* idxchg_ */
+
+void do_fio() {
+ printf("do_fio\n");
+}
+
+void e_wsfe() {
+ printf("e_wsfe\n");
+}
+
+void s_stop() {
+ printf("s_stop\n");
+}
+
+void s_wsfe() {
+ printf("s_wsfe\n");
+}
+
+void err2090_() {
+ printf("err2090 Improper input parameter values\n");
+}
+
+void err2091_() {
+ printf("err2091 All colinear data points, or identical points\n");
+}
+
+void err2091b_() {
+ printf("err2091b All colinear data points, or identical points\n");
+}
+
+void err2092_(){
+ printf("err2092 error detected in routine idcldp \n");
+}
+
+void err2093_(){
+ printf("err2093 error detected in routine idtang \n");
+}
+
+void err2094_(){
+ printf("err2094 This error is never called.\n");
+}
+
+#undef c3sq
+#undef c4sq
+#undef a2sq
+#undef b4sq
+#undef a4sq
+#undef b3sq
+#undef b2sq
+#undef a3sq
+#undef c2sq
+#undef c1sq
+#undef b1sq
+#undef a1sq
diff --git a/src/gle/letzfitz/files.txt b/src/gle/letzfitz/files.txt
new file mode 100644
index 0000000..a8168a7
--- /dev/null
+++ b/src/gle/letzfitz/files.txt
@@ -0,0 +1,48 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+#
+# files list for GLE to be included by the makefiles
+#
+
+INCLUDES =
+
+OBJECTS = \
+let.$(OBJ_SUFF) \
+fit.$(OBJ_SUFF) \
+ffit.$(OBJ_SUFF)
diff --git a/src/gle/letzfitz/fit.cpp b/src/gle/letzfitz/fit.cpp
new file mode 100644
index 0000000..65d7ece
--- /dev/null
+++ b/src/gle/letzfitz/fit.cpp
@@ -0,0 +1,360 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+/*
+ * Surface fitting program, creates .z file from data points
+ */
+
+#include "../all.h"
+#include "../tokens/Tokenizer.h"
+#include "../core.h"
+#include "../file_io.h"
+#include "../texinterface.h"
+#include "../cutils.h"
+#include "../gprint.h"
+#include "../cmdline.h"
+#include "../config.h"
+#include "../mem_limits.h"
+#include "../token.h"
+#include "../glearray.h"
+#include "../polish.h"
+#include "../var.h"
+#include "../gprint.h"
+#include "../keyword.h"
+#include "../run.h"
+
+#define BEGINDEF extern
+#include "../begin.h"
+
+double get_next_exp(TOKENS tk, int ntk, int *curtok);
+void get_next_exp_file(TOKENS tk, int ntok, int *curtok, string* res);
+
+#define kw(ss) if (ct <= ntk && str_i_equals(tk[ct],ss))
+#define next_file_eval(s) get_next_exp_file(tk,ntk,&ct,&s)
+#define next_str(s) ct+=1;s=tk[ct]
+
+void sort_data(int npnts, double *xd, double *yd, double *zd);
+
+int idbvip_(int *md, int *ncp, int *ndp, double *xd, double *yd, double *zd, int *nip, double *xi, double *yi, double *zi, int *iwk, double *wk);
+
+class GLEFitZData {
+public:
+ int ncp;
+ double ymin, xmin, xstep;
+ double xmax, ymax, ystep;
+ vector<double> pntxyz;
+ vector<double> dx, dy, dz;
+ string data_file;
+public:
+ GLEFitZData();
+ void loadData() throw(ParserError);
+ void sortData() throw(ParserError);
+};
+
+GLEFitZData::GLEFitZData() {
+ xmin = ymin = +10e10;
+ xmax = ymax = -10e10;
+ ncp = 3;
+}
+
+// different from the one in let.cpp because fields are optional here
+void get_from_to_step_fitz(TOKENS tk, int ntok, int *curtok, double* from, double* to, double* step) throw(ParserError) {
+ (*curtok) = (*curtok) + 1;
+ if ((*curtok) >= ntok) {
+ return;
+ }
+ if (str_i_equals(tk[(*curtok)], "FROM")) {
+ *from = get_next_exp(tk, ntok, curtok);
+ (*curtok) = (*curtok) + 1;
+ }
+ if ((*curtok) >= ntok) {
+ return;
+ }
+ if (str_i_equals(tk[(*curtok)], "TO")) {
+ *to = get_next_exp(tk, ntok, curtok);
+ (*curtok) = (*curtok) + 1;
+ }
+ if ((*curtok) >= ntok) {
+ return;
+ }
+ if (str_i_equals(tk[(*curtok)], "STEP")) {
+ *step = get_next_exp(tk, ntok, curtok);
+ (*curtok) = (*curtok) + 1;
+ }
+ if ((*curtok) < ntok) {
+ stringstream err;
+ err << "illegal keyword in range expression '" << tk[(*curtok)] << "'";
+ g_throw_parser_error(err.str());
+ }
+ if (*from >= *to) {
+ ostringstream err;
+ err << "from value (" << *from << ") should be strictly smaller than to value (" << *to << ") in letz block";
+ g_throw_parser_error(err.str());
+ }
+ if (*step <= 0.0) {
+ ostringstream err;
+ err << "step value (" << *from << ") should be strictly positive in letz block";
+ g_throw_parser_error(err.str());
+ }
+}
+
+void begin_fitz(int *pln, int *pcode, int *cp) throw(ParserError) {
+ GLEFitZData data;
+ // Start with pcode from the next line
+ (*pln)++;
+ begin_init();
+ while (true) {
+ int st = begin_token(&pcode,cp,pln,srclin,tk,&ntk,outbuff);
+ if (!st) {
+ /* exit loop */
+ break;
+ }
+ int ct = 1;
+ // cout << "ct = " << ct << " tk = " << ntk << " tk = " << tk[ct] << endl;
+ kw("DATA") {
+ next_file_eval(data.data_file);
+ data.loadData();
+ data.sortData();
+ } else kw("X") {
+ get_from_to_step_fitz(tk, ntk, &ct, &data.xmin, &data.xmax, &data.xstep);
+ } else kw("Y") {
+ get_from_to_step_fitz(tk, ntk, &ct, &data.ymin, &data.ymax, &data.ystep);
+ } else kw("NCONTOUR") {
+ data.ncp = atoi(tk[++ct]);
+ } else if (ct <= ntk) {
+ stringstream err;
+ err << "illegal keyword in fitz block: '" << tk[ct] << "'";
+ g_throw_parser_error(err.str());
+ }
+ }
+/*
+ char bfile[80],dfile[80],xrange[80];
+ real *xd, *yd, *zd;
+ real *rx, *ry, *rz;
+ int32 nx,ny;
+ int32 nrp;
+ int32 *iwk;
+ real *wk;
+ int32 i,j,k;
+*/
+/*
+ printf("Number of points to use for contouring each point ? [3] "); ncp = getf();
+ if (ncp==0) ncp = 3;
+ printf("Range of output x values [%g,%g,%g] ? ",xmin,xmax,xstep); getstr(xrange);
+ getrange(xrange,&xmin,&xmax,&xstep);
+ printf("Range of output y values [%g,%g,%g] ? ",ymin,ymax,ystep); getstr(xrange);
+ getrange(xrange,&ymin,&ymax,&ystep);
+*/
+ double xmax = data.xmax;
+ double xmin = data.xmin;
+ double ymax = data.ymax;
+ double ymin = data.ymin;
+ double xstep = data.xstep;
+ double ystep = data.ystep;
+ int nx = (int)floor((xmax-xmin)/xstep + 1);
+ int ny = (int)floor((ymax-ymin)/ystep + 1);
+ vector<double> rx0, ry0, rz0;
+ double y = ymin;
+ for (int j = 0; j < ny; j++) {
+ double x = xmin;
+ for (int i = 0; i < nx; i++) {
+ rx0.push_back(x);
+ ry0.push_back(y);
+ rz0.push_back(0);
+ x += xstep;
+ }
+ y += ystep;
+ }
+ int ncp = data.ncp;
+ int ndp = data.dx.size();
+ int md = 1;
+ int nrp = nx*ny;
+ int i = 27+ncp;
+ if (i<31) i = 31;
+ i = (i * ndp + nrp) * sizeof(int);
+ int _j = 8*ndp*sizeof(double); // VL: _j to silence msvc warning about conflicting scope with j in for loop
+ int* iwk = (int*)malloc(i);
+ double* wk = (double*)malloc(_j);
+ if (iwk == NULL || wk == NULL) {
+ stringstream err;
+ err << "unable to allocate enough workspace iwk = " << i << " wk = " << _j;
+ g_throw_parser_error(err.str());
+ }
+ double* xd = (double*)&data.dx[0];
+ double* yd = (double*)&data.dy[0];
+ double* zd = (double*)&data.dz[0];
+ double* rx = (double*)&rx0[0];
+ double* ry = (double*)&ry0[0];
+ double* rz = (double*)&rz0[0];
+ idbvip_(&md,&ncp,&ndp,xd,yd,zd,&nrp,rx,ry,rz,iwk,wk);
+ string out_file;
+ GetMainName(data.data_file, out_file);
+ out_file += ".z";
+ /* Save output to file */
+ FILE* fp = validate_fopen(out_file, "wb", false);
+ if (fp == NULL) {
+ stringstream err;
+ err << "unable to create .z file '" << out_file << "'";
+ g_throw_parser_error(err.str());
+ }
+ fprintf(fp,"! nx %d ny %d xmin %g xmax %g ymin %g ymax %g\n",nx,ny,xmin,xmax,ymin,ymax);
+ /* Write data matrix to file */
+ int k = 0;
+ y = ymin;
+ for (int j = 0; j < ny; j++) {
+ double x = xmin;
+ for (int i = 0; i < nx; i++) {
+ fprintf(fp,"%g ",rz[k++]);
+ x += xstep;
+ }
+ fprintf(fp,"\n");
+ y += ystep;
+ }
+ fclose(fp);
+}
+
+void setminmax(double v, double *min, double *max) {
+ if (v< *min) *min = v;
+ if (v> *max) *max = v;
+}
+
+void GLEFitZData::loadData() throw(ParserError) {
+ TokenizerLanguage lang;
+ StreamTokenizer tokens(&lang);
+ string expanded(GLEExpandEnvironmentVariables(data_file));
+ validate_file_name(expanded, false);
+ tokens.open_tokens(expanded.c_str());
+ lang.setLineCommentTokens("!");
+ lang.setSpaceTokens(" \t\r,");
+ lang.setSingleCharTokens("\n");
+ while (tokens.has_more_tokens()) {
+ if (!tokens.is_next_token("\n")) {
+ for (int i = 0; i < 3; i++) {
+ string& token = tokens.next_token();
+ if (is_float(token)) {
+ pntxyz.push_back(atof(token.c_str()));
+ } else {
+ stringstream err;
+ err << "not a valid number: '" << token << "'";
+ throw tokens.error(err.str());
+ }
+ }
+ string& token = tokens.next_token();
+ if (token != "\n") {
+ throw tokens.error("more than 3 columns in data file");
+ }
+ }
+ }
+}
+
+void GLEFitZData::sortData() throw(ParserError) {
+ /* Copy data */
+ for (vector<double>::size_type i = 0; i < pntxyz.size(); i+=3) {
+ double xp = pntxyz[i];
+ double yp = pntxyz[i+1];
+ double zp = pntxyz[i+2];
+ dx.push_back(xp);
+ dy.push_back(yp);
+ dz.push_back(zp);
+ setminmax(xp,&xmin,&xmax);
+ setminmax(yp,&ymin,&ymax);
+ }
+ pntxyz.clear();
+ if (dx.empty()) {
+ g_throw_parser_error("empty data file in fitz block");
+ }
+ sort_data(dx.size(), (double*)&dx[0], (double*)&dy[0], (double*)&dz[0]);
+ for (vector<double>::size_type i = 0; i < dx.size()-1; i++) {
+ if (dx[i] == dx[i+1] && dy[i] == dy[i+1]) {
+ stringstream err;
+ err << "duplicate data point: (" << dx[i] << "," << dy[i] << "," << dz[i] << ")";
+ g_throw_parser_error(err.str());
+ }
+ }
+ xstep = (xmax-xmin)/15.0;
+ ystep = (ymax-ymin)/15.0;
+}
+
+double *xxx,*yyy,*zzz;
+
+void myswap(int i, int j) {
+ static double a;
+ a = xxx[i]; xxx[i] = xxx[j]; xxx[j] = a;
+ a = yyy[i]; yyy[i] = yyy[j]; yyy[j] = a;
+ a = zzz[i]; zzz[i] = zzz[j]; zzz[j] = a;
+}
+
+int mycmp(int i, double x1, double y1) {
+ if (xxx[i]<x1) return -1;
+ if (xxx[i]>x1) return 1;
+ if (yyy[i]<y1) return -1;
+ if (yyy[i]>y1) return 1;
+ return 0;
+}
+
+void (*ffswap) (int i, int j);
+int (*ffcmp) (int i, double x1, double x2);
+
+void qquick_sort(int left, int right) {
+ int i,j,xx;
+ double x1,x2;
+ i = left; j = right;
+ xx = (left+right)/2;
+ x1 = xxx[xx]; x2 = yyy[xx];
+ do {
+ while((*ffcmp)(i,x1,x2)<0 && i<right) i++;
+ while((*ffcmp)(j,x1,x2)>0 && j>left) j--;
+ if (i<=j) { (*ffswap)(i,j); i++; j--; }
+ } while (i<=j);
+ if (left<j) qquick_sort(left,j);
+ if (i<right) qquick_sort(i,right);
+}
+
+void quick_sort(int nitems, void (*fswap) (int i, int j), int (*fcmp) (int i, double x1, double x2)) {
+ if (nitems <= 0) {
+ return;
+ }
+ ffswap = fswap;
+ ffcmp = fcmp;
+ qquick_sort(0,nitems-1);
+}
+
+void sort_data(int npnts, double *xd, double *yd, double *zd) {
+ xxx = xd; yyy = yd; zzz = zd;
+ quick_sort(npnts,myswap,mycmp);
+}
diff --git a/src/gle/letzfitz/let.cpp b/src/gle/letzfitz/let.cpp
new file mode 100644
index 0000000..a50c7da
--- /dev/null
+++ b/src/gle/letzfitz/let.cpp
@@ -0,0 +1,174 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+/*
+ * Trying to add surface support back into GLE
+ * Jan Struyf 2005
+ */
+
+#include "../all.h"
+#include "../tokens/Tokenizer.h"
+#include "../core.h"
+#include "../file_io.h"
+#include "../texinterface.h"
+#include "../cutils.h"
+#include "../gprint.h"
+#include "../cmdline.h"
+#include "../config.h"
+#include "../mem_limits.h"
+#include "../token.h"
+#include "../glearray.h"
+#include "../polish.h"
+#include "../var.h"
+#include "../gprint.h"
+#include "../keyword.h"
+#include "../run.h"
+
+#define BEGINDEF extern
+#include "../begin.h"
+
+double get_next_exp(TOKENS tk, int ntk, int *curtok);
+void get_next_exp_file(TOKENS tk, int ntok, int *curtok, string* res);
+
+#define kw(ss) if (ct <= ntk && str_i_equals(tk[ct],ss))
+#define next_file_eval(s) get_next_exp_file(tk,ntk,&ct,&s)
+#define next_str(s) ct+=1;s=tk[ct]
+
+void get_from_to_step(TOKENS tk, int ntok, int *curtok, double* from, double* to, double* step) throw(ParserError) {
+ (*curtok) = (*curtok) + 1;
+ if ((*curtok) >= ntok) {
+ return;
+ }
+ if (!str_i_equals(tk[(*curtok)], "FROM")) {
+ g_throw_parser_error("expecting 'from' in letz block");
+ }
+ *from = get_next_exp(tk, ntok, curtok);
+ (*curtok) = (*curtok) + 1;
+ if ((*curtok) >= ntok) {
+ return;
+ }
+ if (!str_i_equals(tk[(*curtok)], "TO")) {
+ g_throw_parser_error("expecting 'to' in letz block");
+ }
+ *to = get_next_exp(tk, ntok, curtok);
+ (*curtok) = (*curtok) + 1;
+ if ((*curtok) >= ntok) {
+ return;
+ }
+ if (!str_i_equals(tk[(*curtok)], "STEP")) {
+ g_throw_parser_error("expecting 'step' in letz block");
+ }
+ if (*from >= *to) {
+ ostringstream err;
+ err << "from value (" << *from << ") should be strictly smaller than to value (" << *to << ") in letz block";
+ g_throw_parser_error(err.str());
+ }
+ *step = get_next_exp(tk, ntok, curtok);
+ if (*step <= 0.0) {
+ ostringstream err;
+ err << "step value (" << *from << ") should be strictly positive in letz block";
+ g_throw_parser_error(err.str());
+ }
+}
+
+void begin_letz(int *pln, GLEPcodeList* pclist, int *pcode, int *cp) throw(ParserError) {
+ // Variables
+ double xmin = 10, xmax = 10, xstep = 1;
+ double ymin = 10, ymax = 10, ystep = 1;
+ string equation, data_file;
+ // Start with pcode from the next line
+ (*pln)++;
+ begin_init();
+ while (true) {
+ int st = begin_token(&pcode,cp,pln,srclin,tk,&ntk,outbuff);
+ if (!st) {
+ /* exit loop */
+ break;
+ }
+ int ct = 1;
+ kw("DATA") {
+ next_file_eval(data_file);
+ } else kw("Z") {
+ ct++;
+ next_str(equation);
+ } else kw("X") {
+ get_from_to_step(tk, ntk, &ct, &xmin, &xmax, &xstep);
+ } else kw("Y") {
+ get_from_to_step(tk, ntk, &ct, &ymin, &ymax, &ystep);
+ } else if (ct <= ntk) {
+ stringstream err;
+ err << "illegal keyword in letz block: '" << tk[ct] << "'";
+ g_throw_parser_error(err.str());
+ }
+ }
+ // Create data file (if modified)
+/*
+ cout << "Wriging to: " << data_file << endl;
+ cout << "Equation: " << equation << endl;
+ cout << "X from " << xmin << " to " << xmax << " step " << xstep << endl;
+ cout << "Y from " << ymin << " to " << ymax << " step " << ystep << endl;
+*/
+ int xvar, yvar, vtype = 1;
+ var_findadd("X", &xvar, &vtype);
+ var_findadd("Y", &yvar, &vtype);
+ token_space();
+ /* Polish our equation */
+ int rtype = 1;
+ GLEPcodeList pc_list;
+ GLEPcode evalPcode(&pc_list);
+ get_global_polish()->polish(equation.c_str(), evalPcode, &rtype);
+ if (get_nb_errors()!=0) {
+ return;
+ }
+ FILE* fp = validate_fopen(data_file, "wb", false);
+ int nx = (int)((xmax-xmin)/xstep + 1);
+ int ny = (int)((ymax-ymin)/ystep + 1);
+ fprintf(fp,"! nx %d ny %d xmin %g xmax %g ymin %g ymax %g \n",nx,ny,xmin,xmax,ymin,ymax);
+ GLERC<GLEArrayImpl> stk(new GLEArrayImpl());
+ for (double y=ymin, yi=0; yi<ny ; yi++, y+=ystep) {
+ for (double x=xmin, xi=0; xi<nx; xi++, x+=xstep) {
+ var_set(xvar, x);
+ var_set(yvar, y);
+ int cp = 0;
+ double value = evalDouble(stk.get(), pclist, (int*)&evalPcode[0], &cp);
+ fprintf(fp,"%g ",value);
+ }
+ fprintf(fp,"\n");
+ }
+ fclose(fp);
+}
diff --git a/src/gle/mem_limits.h b/src/gle/mem_limits.h
new file mode 100644
index 0000000..52e9753
--- /dev/null
+++ b/src/gle/mem_limits.h
@@ -0,0 +1,98 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#ifndef INCLUDE_MEM_LIMTS
+#define INCLUDE_MEM_LIMTS
+//
+// mem_limts.h
+//
+/*
+ memory limits for GLE.
+ I pulled these out of the code, most were hard-coded into the source
+ these are all statically defined arrays, soon they will be replaced with STL
+ containers
+
+These is gleaned from the file var.c
+
+also I had to modify the files sub.c polish.c eval.c to
+include LOCAL_START_INDEX
+
+it seems that all the commands,functions and variables are indexed by one variable
+
+if the index is > LOCAL_START_INDEX then it is treated as a local variable
+and stored in the lvar_name and lvar_val
+
+else the variable is a global variable
+*/
+#define NUM_GLOBAL 1000 //number of global variables
+#define NUM_LOCAL 500 //number of local variables each subroutine can have
+#define MAX_GLOBAL NUM_GLOBAL-1 //GLE will warn the user
+#define MAX_LOCAL NUM_LOCAL-1 //GLE will warn the user
+//
+// all the variables are kept on the same stack except that the
+// local variables start at a higher index (don't change these)
+//
+#define MAX_INDEX NUM_GLOBAL+NUM_LOCAL
+#define LOCAL_START_INDEX NUM_GLOBAL
+
+//
+// for the token arrays
+//
+#define TOKEN_WIDTH 1000
+#define TOKEN_LENGTH 500
+
+//
+// these are for graphing routines
+//
+// maximum number of items in each line of the data file
+#define MAX_NUMBER_OF_ITEMS 1000
+
+//
+// maximum element in the postscript line. This affects speed of
+// PS rendereing. any line that has more than
+// MAXIMUM_PS_VECTOR points in it will be broken up
+// into lines of MAXIMUM_PS_VECTOR
+// not this is assinged to MAX_VECTOR in gle.cpp
+// no warning is printed if this is exceeded as was done in 3.3h
+//
+#define MAXIMUM_PS_VECTOR 500
+
+// Maximum number of datasets
+#define MAX_NB_DATA 1001
+
+#endif
diff --git a/src/gle/memory.cpp b/src/gle/memory.cpp
new file mode 100644
index 0000000..cdd828e
--- /dev/null
+++ b/src/gle/memory.cpp
@@ -0,0 +1,111 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#include "all.h"
+#include "file_io.h"
+#include "gprint.h"
+
+extern char errgle[];
+
+char *sdup(const char *s) {
+ char *v;
+ v = (char*) malloc((strlen(s)+1) * sizeof(char));
+ strcpy(v,s);
+ return v;
+}
+
+void myfree(void *p) {
+ myfrees(p,"UNKNOWN");
+}
+
+void myfrees(void *p, const char *s) {
+ free(p);
+}
+
+void *myallocn(int nitems,int size) {
+ return myallocz(nitems*size);
+}
+
+void *myalloc(int size) {
+ if (size == 0) {
+ sprintf(errgle,"\nError, attempt to allocate ZERO memory \n");
+ gle_abort(errgle);
+ }
+ void* p = malloc(size+sizeof(int)*2);
+ if (p == NULL) {
+ p = malloc(size+sizeof(int)*2);
+ if (p == NULL) {
+ sprintf(errgle,"\nMemory allocation failure (size %d)\n", size);
+ gle_abort(errgle);
+ }
+ }
+ return p;
+}
+
+void *myallocz(int size) {
+ static void *p;
+ if (size==0) {
+ sprintf(errgle,"\nError, attempt to allocate ZERO memory \n");
+ gle_abort(errgle);
+ }
+ p = calloc(1,size+sizeof(int)*2);
+ if (p == NULL) {
+ p = calloc(1,size+sizeof(int)*2);
+ if (p == NULL) {
+ sprintf(errgle,"\nMemory allocation failure (size %d)\n", size);
+ gle_abort(errgle);
+ }
+ }
+ return p;
+}
+
+int mem_total() {
+ return 0;
+}
+
+int mem_worst() {
+ return 0;
+}
+
+char errgle[90];
+int dont_clear;
+
+void gle_abort(const char *s) {
+ printf("%s",s);
+ exit(1);
+}
diff --git a/src/gle/mychar.cpp b/src/gle/mychar.cpp
new file mode 100644
index 0000000..d8e05d8
--- /dev/null
+++ b/src/gle/mychar.cpp
@@ -0,0 +1,311 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+/*----------------------------------------------------------------------*/
+/* This routine prints a char from one of my fonts, it has cacheing */
+/* for the char data, which could be extended to bitmap cacheing */
+/*----------------------------------------------------------------------*/
+
+#include "all.h"
+#include "core.h"
+#include "color.h"
+extern struct gmodel g;
+#include "gprint.h"
+#include "file_io.h"
+
+#ifdef BIGINDIAN
+#define BYTE0 1
+#define BYTE1 0
+#else
+#define BYTE0 0
+#define BYTE1 1
+#endif
+
+void font_file_vector(int ff,char *filename);
+int draw_char_pcode(char *s);
+void my_load_font(int ff);
+int char_plen(char *s);
+void get_char_pcode(int ff, int cc, char **pp);
+double frx(char **s);
+
+
+unsigned char my_name[80];
+char *my_code[80];
+int my_ref[80];
+char *my_buff;
+int my_font[80];
+int my_pnt[257];
+int my_curfont;
+extern double font_lwidth;
+
+void my_char(int ff, int cc)
+{
+ char *pp;
+ GLEWithoutUpdates noUpdates;
+ get_char_pcode(ff, cc, &pp);
+ draw_char_pcode(pp);
+}
+
+void get_char_pcode(int ff, int cc, char **pp)
+{
+ int i,plen,mi,minref;
+
+/* y: Is char in font cache, if so draw it, inc ref */
+ /* should use *memchr(s,c,n) */
+ for (i=1;i<80;i++) {
+ if (my_name[i]==cc) {
+ if (my_font[i]==ff) {
+ my_ref[i]++;
+ *pp = my_code[i];
+ return;
+ }
+ }
+ }
+
+/* x: Is that font currently loaded, if so put in cache at least used, goto y */
+ minref = 30000;
+ mi = 0;
+ if (my_curfont!=ff) my_load_font(ff);
+ /* Find least used cache character */
+ for (i=1;i<80;i++) {
+ if (my_ref[i]<minref) {minref=my_ref[i]; mi = i;}
+ }
+ if (mi==0) mi=1;
+ plen = char_plen(my_buff+my_pnt[cc]);
+ if (my_code[mi]==0) my_code[mi] = (char*) myallocz(plen+1);
+ else {
+ /* my_code[mi] = realloc(my_code[mi],plen+1); */
+ myfree(my_code[mi]);
+ my_code[mi] = (char*) myalloc((plen+1));
+ }
+ if (my_code[mi]==0) gprint("Memory allocation failure, in myfont.c \n");
+ memcpy(my_code[mi],my_buff+my_pnt[cc],plen+1);
+ *pp = my_code[mi];
+ my_name[mi] = cc;
+ my_ref[mi] = 1;
+ my_font[mi] = ff;
+}
+
+void my_load_font(int ff)
+{
+ char vector_file[60];
+ font_file_vector(ff,vector_file);
+ string fontfname = fontdir(vector_file);
+ GLEFileIO fin;
+ fin.open(fontfname.c_str(), READ_BIN);
+ if (!fin.isOpen()) {
+ ostringstream err;
+ err << "font vector file not found: '" << fontfname << "'; using texcmr instead";
+ g_message(err.str().c_str());
+ /* Replace font by texcmr instead */
+ font_replace_vector(ff);
+ font_file_vector(ff, vector_file);
+ fontfname = fontdir(vector_file);
+ fin.open(fontfname.c_str(), READ_BIN);
+ if (!fin.isOpen()) {
+ gle_abort("Font vector texcmr.fve not found\n");
+ }
+ }
+ fin.fread(my_pnt, sizeof(int), 256);
+ /* gprint("Size of rest of font %d \n",my_pnt[0]); */
+ if (my_buff==0) my_buff = (char*) myallocz(10 + my_pnt[0]);
+ else {
+ myfree(my_buff);
+ my_buff = (char*) myallocz(10 + my_pnt[0]);
+ }
+ if (my_buff==0) gprint("Memory allocation failure MY_BUFF , in myfont.c \n");
+ fin.fread(my_buff, 1, my_pnt[0]);
+ fin.close();
+ my_curfont = ff;
+}
+
+int frxi(char **s);
+
+int char_plen(char *s) {
+ char *savelen;
+ savelen = s;
+ while (*s!=15) {
+ switch (*s++) {
+ case 1:
+ case 2:
+ case 9:
+ frxi(&s); frxi(&s);
+ break;
+ case 3:
+ frxi(&s); frxi(&s);
+ frxi(&s); frxi(&s);
+ frxi(&s); frxi(&s);
+ break;
+ case 4:
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ break;
+ case 10:
+ frxi(&s);
+ break;
+ case 0: /* char does not exist */
+ goto abort;
+ default:
+ gprint("Error in mychar pcode %d \n",*s++);
+ goto abort;
+ }
+ }
+abort:
+ return s-savelen;
+}
+
+int draw_char_pcode(char *s)
+{
+ static double cx,cy,ox,oy,x1,y1,x2,y2;
+ char *savelen;
+ double old_lwidth;
+ int old_path, old_join;
+
+ g_get_path(&old_path);
+ GLERC<GLEColor> old_color(g_get_color());
+ GLERC<GLEColor> old_fill(g_get_fill());
+ g_set_fill(old_color);
+ g_get_line_width(&old_lwidth);
+ g_set_line_width(font_lwidth);
+ g_get_line_join(&old_join);
+ g_set_line_join(1); /* use rounded lines to avoid ucky peeks */
+
+ g_get_xy(&ox,&oy);
+ savelen = s;
+ if (!old_path) {
+ g_set_path(true);
+ g_newpath();
+ }
+ while (*s!=15) {
+ switch (*s++) {
+ case 1:
+ cx = ox + frx(&s); cy = oy + frx(&s);
+ g_move(cx,cy);
+ break;
+ case 2:
+ cx = cx + frx(&s); cy = cy + frx(&s);
+ g_line(cx,cy);
+ break;
+ case 3:
+ cx = cx + frx(&s); cy = cy + frx(&s);
+ x1 = cx; y1 = cy;
+ cx = cx + frx(&s); cy = cy + frx(&s);
+ x2 = cx; y2 = cy;
+ cx = cx + frx(&s); cy = cy + frx(&s);
+ g_bezier(x1,y1,x2,y2,cx,cy);
+ break;
+ case 4:
+ g_closepath();
+ break;
+ case 5:
+ if (!old_path) g_fill();
+ break;
+ case 6:
+ g_stroke();
+ break;
+ case 7:
+ g_gsave();
+ g_set_fill(GLE_COLOR_WHITE);
+ g_fill();
+ g_grestore();
+ break;
+ case 8:
+ g_set_line_width(frx(&s));
+ break;
+ case 9:
+ cx = ox + frx(&s); cy = oy + frx(&s);
+ g_set_pos(cx,cy);
+ break;
+ case 10:
+ g_circle_stroke(frx(&s));
+ break;
+ case 0: /* no such char in this font */
+ goto abort;
+ default:
+ gprint("Error in mychar pcode %d \n",*s++);
+ goto abort;
+ }
+ }
+abort: if (!old_path) g_set_path(old_path);
+ g_set_line_join(old_join);
+ g_set_line_width(old_lwidth);
+ g_set_color(old_color);
+ g_set_fill(old_fill);
+ return s-savelen;
+}
+
+double frx(char **s)
+{
+ static union {char a[2];short b;} both;
+ static int i;
+
+ if (g.fontsz==0) {
+ gprint("Font size is zero ***\n");
+ g.fontsz = 1;
+ }
+ i = *(*s)++;
+ if (i==127) {
+ both.a[0] = (*(*s)++);
+ both.a[1] = (*(*s)++);
+ if (1==2) printf("bothb %d \n",both.b);
+ return (g.fontsz*both.b)/1000.0;
+ } else {
+ if (i>127) i = -(256-i);
+ if (1==2) printf("ii %d \n",i);
+ return (g.fontsz*i)/1000.0;
+ }
+}
+int frxi(char **s)
+{
+ static union {char a[2];short b;} both;
+ static int i;
+
+ i = *(*s)++;
+ if (i==127) {
+ both.a[0] = (*(*s)++);
+ both.a[1] = (*(*s)++);
+ if (1==2) printf("both %d \n",both.b);
+ return (both.b);
+ } else {
+ if (i>127) i = -(256-i);
+ if (1==2) printf("i %d \n",i);
+ return i;
+ }
+}
diff --git a/src/gle/numberformat.cpp b/src/gle/numberformat.cpp
new file mode 100644
index 0000000..d829fec
--- /dev/null
+++ b/src/gle/numberformat.cpp
@@ -0,0 +1,824 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#include "all.h"
+#include "tokens/stokenizer.h"
+#include "cutils.h"
+#include "core.h"
+#include "gprint.h"
+#include "numberformat.h"
+
+/*
+ dec, hex [upper|lower], bin
+ 01
+
+ fix 3 + effect van nozeros
+ 12.000
+
+ sig 2 [e,E,10,10+] expdigits 2 expsign
+
+ round 3
+ round number to 3 significant digits
+ pad with zeros if number too large (don't use exponential represenations)
+
+ nozeros
+
+ sign
+ always include sign in output (also for positive numbers)
+
+ pad 7 [left|right]
+ numbers less than 7 chars are padded from left with spaces
+
+ prefix 3 (add zeros from left)
+
+ append '%'
+ prepend 'EUR '
+*/
+
+class GLENumberFormatterFix : public GLENumberFormatter {
+protected:
+ int m_NbDecPlaces;
+public:
+ virtual ~GLENumberFormatterFix();
+ virtual void parseOptions(GLENumberFormat* format);
+ virtual void format(double number, string* output);
+};
+
+class GLENumberFormatterPercent : public GLENumberFormatter {
+protected:
+ int m_NbDecPlaces;
+public:
+ virtual ~GLENumberFormatterPercent();
+ virtual void parseOptions(GLENumberFormat* format);
+ virtual void format(double number, string* output);
+};
+
+class GLENumberFormatterRound : public GLENumberFormatter {
+protected:
+ int m_Sig;
+public:
+ virtual ~GLENumberFormatterRound();
+ virtual void parseOptions(GLENumberFormat* format);
+ virtual void format(double number, string* output);
+};
+
+class GLENumberFormatterSci : public GLENumberFormatter {
+protected:
+ int m_Sig;
+ int m_Mode;
+ int m_ExpDigits;
+ bool m_HasExpDigits;
+ bool m_ExpSign;
+public:
+ GLENumberFormatterSci();
+ virtual ~GLENumberFormatterSci();
+ void doAllSci(string* output);
+ virtual void parseOptions(GLENumberFormat* format);
+ void formatExpPart(int exp, string* output);
+ virtual void format(double number, string* output);
+ inline bool hasExpDigits() { return m_HasExpDigits; }
+ inline int getExpDigits() { return m_ExpDigits; }
+ void setExpDigits(int digits);
+ inline bool hasExpSign() { return m_ExpSign; }
+ inline void setExpSign(bool ExpSign) { m_ExpSign = ExpSign; }
+};
+
+class GLENumberFormatterEng : public GLENumberFormatterSci {
+protected:
+ int m_Digits;
+ bool m_Numeric;
+public:
+ GLENumberFormatterEng();
+ virtual ~GLENumberFormatterEng();
+ virtual void parseOptions(GLENumberFormat* format);
+ virtual void format(double number, string* output);
+ void myDoAll(string* output);
+};
+
+class GLENumberFormatterInt : public GLENumberFormatter {
+protected:
+ int m_Mode;
+ bool m_Upper;
+public:
+ GLENumberFormatterInt(int mode);
+ virtual ~GLENumberFormatterInt();
+ virtual void format(double number, string* output);
+ virtual void parseOptions(GLENumberFormat* format);
+ inline bool hasUpper() { return m_Upper; }
+ inline void setUpper(bool Upper) { m_Upper = Upper; }
+};
+
+class GLENumberFormatterFrac: public GLENumberFormatter {
+protected:
+ int m_Mode;
+public:
+ GLENumberFormatterFrac(int mode);
+ virtual ~GLENumberFormatterFrac();
+ virtual void format(double number, string* output);
+ virtual void parseOptions(GLENumberFormat* format);
+};
+
+#define GLE_NF_INT_DEC 0
+#define GLE_NF_INT_HEX 1
+#define GLE_NF_INT_BIN 2
+
+#define GLE_NF_SCI_SMALL_E 0
+#define GLE_NF_SCI_BIG_E 1
+#define GLE_NF_SCI_10 2
+
+#define GLE_NF_FRAC_ONE 0
+#define GLE_NF_FRAC_PI 1
+
+GLENumberFormatter::GLENumberFormatter() {
+ m_Prefix = -1;
+ m_NoZeroes = false;
+ m_Sign = false;
+ m_PadLeft = -1;
+ m_PadRight = -1;
+ m_HasMin = false;
+ m_HasMax = false;
+}
+
+GLENumberFormatter::~GLENumberFormatter() {
+}
+
+void GLENumberFormatter::parseOptions(GLENumberFormat* format) {
+}
+
+void GLENumberFormatter::format(double number, string* output) {
+}
+
+bool GLENumberFormatter::appliesTo(double number) {
+ if (hasMin() && number < getMin()) return false;
+ if (hasMax() && number > getMax()) return false;
+ return true;
+}
+
+void GLENumberFormatter::doAll(string* output) {
+ doNoZeroes(output);
+ doPrefix(output);
+ doSign(output);
+ doPadLeft(output);
+ doPadRight(output);
+}
+
+void GLENumberFormatter::doPrefix(string* output) {
+ if (hasPrefix()) {
+ bool has_sign = false;
+ int prefix = getPrefix();
+ int length = output->length();
+ string::size_type pos = output->rfind('.');
+ if (pos == string::npos) pos = length;
+ if (length > 0 && output->at(0) == '-') {
+ prefix++;
+ has_sign = true;
+ }
+ if (pos < (unsigned int)prefix) {
+ string zeros = has_sign ? "-" : "";
+ for (unsigned int i = 0; i < prefix-pos; i++) {
+ zeros += "0";
+ }
+ if (has_sign) {
+ zeros += output->substr(1, length-1);
+ } else {
+ zeros += *output;
+ }
+ *output = zeros;
+ }
+ }
+}
+
+void GLENumberFormatter::doNoZeroes(string* output) {
+ if (hasNoZeroes() && output->rfind('.') != string::npos) {
+ int nbzero = 0;
+ int length = output->length();
+ int pos = length-1;
+ while (pos >= 0 && output->at(pos) == '0') {
+ pos--; nbzero++;
+ }
+ // also eat '.', e.g., if number was 3.0 (not for 3.10)
+ if (pos >= 0 && output->at(pos) == '.') {
+ pos--; nbzero++;
+ }
+ *output = output->substr(0, length-nbzero);
+ }
+}
+
+void GLENumberFormatter::doSign(string* output) {
+ if (hasSign()) {
+ if (output->length() > 0 && output->at(0) != '-') {
+ output->insert(0, "+");
+ }
+ }
+}
+
+void GLENumberFormatter::doPadLeft(string* output) {
+ if (getPrepend() != "") {
+ output->insert(0, getPrepend());
+ }
+ if (hasPadLeft()) {
+ int count = getPadLeft() - output->length();
+ str_prefix(count, ' ', output);
+ }
+}
+
+void GLENumberFormatter::doPadRight(string* output) {
+ if (getAppend() != "") {
+ output->append(getAppend());
+ }
+ if (hasPadRight()) {
+ int count = getPadRight() - output->length();
+ if (count > 0) {
+ for (int i = 0; i < count; i++) {
+ *output += " ";
+ }
+ }
+ }
+}
+
+void GLENumberFormatter::setMin(double min) {
+ m_Min = min;
+ m_HasMin = true;
+}
+
+void GLENumberFormatter::setMax(double max) {
+ m_Max = max;
+ m_HasMax = true;
+}
+
+void GLENumberFormatter::setDefaults(GLENumberFormatter* def) {
+ if (def->hasPrefix()) setPrefix(def->getPrefix());
+ if (def->hasNoZeroes()) setNoZeroes(true);
+ if (def->hasSign()) setSign(true);
+ if (def->hasPadLeft()) setPadLeft(def->getPadLeft());
+ if (def->hasPadRight()) setPadRight(def->getPadRight());
+}
+
+void GLENumberFormatter::formatSimple(double value, string* output, int prec, int* exp) {
+ char format[20], result[100];
+ double pos_num = fabs(value);
+ *exp = gle_double_digits(pos_num, prec);
+ if (prec > 0) {
+ sprintf(format, "%%.%df", prec-1);
+ sprintf(result, format, pos_num / pow(10.0, *exp));
+ } else {
+ result[0] = 0;
+ }
+ *output = result;
+}
+
+GLENumberFormatterFix::~GLENumberFormatterFix() {
+}
+
+void GLENumberFormatterFix::parseOptions(GLENumberFormat* format) {
+ m_NbDecPlaces = format->nextInt();
+}
+
+void GLENumberFormatterFix::format(double number, string* output) {
+ char format[20], result[100];
+ sprintf(format, "%%.%df", m_NbDecPlaces);
+ sprintf(result, format, number);
+ *output = result;
+ doAll(output);
+}
+
+GLENumberFormatterPercent::~GLENumberFormatterPercent() {
+}
+
+void GLENumberFormatterPercent::parseOptions(GLENumberFormat* format) {
+ m_NbDecPlaces = format->nextInt();
+}
+
+void GLENumberFormatterPercent::format(double number, string* output) {
+ char format[20], result[100];
+ sprintf(format, "%%.%df", m_NbDecPlaces);
+ sprintf(result, format, 100*number);
+ *output = result;
+ *output += "%";
+ doAll(output);
+}
+
+GLENumberFormatterSci::GLENumberFormatterSci() {
+ m_Mode = GLE_NF_SCI_SMALL_E;
+ m_HasExpDigits = false;
+ m_ExpSign = false;
+}
+
+GLENumberFormatterSci::~GLENumberFormatterSci() {
+}
+
+void GLENumberFormatterSci::setExpDigits(int digits) {
+ m_ExpDigits = digits;
+ m_HasExpDigits = true;
+}
+
+void GLENumberFormatterSci::parseOptions(GLENumberFormat* format) {
+ m_Sig = format->nextInt();
+ while (format->hasMoreTokens()) {
+ const string& tpe = format->nextToken();
+ if (tpe == "e") {
+ m_Mode = GLE_NF_SCI_SMALL_E;
+ format->incTokens();
+ } else if (tpe == "E") {
+ m_Mode = GLE_NF_SCI_BIG_E;
+ format->incTokens();
+ } else if (tpe == "10") {
+ m_Mode = GLE_NF_SCI_10;
+ format->incTokens();
+ } else if (tpe == "expdigits") {
+ format->incTokens();
+ setExpDigits(format->nextInt());
+ } else if (tpe == "expsign") {
+ format->incTokens();
+ setExpSign(true);
+ } else {
+ break;
+ }
+ }
+}
+
+void GLENumberFormatterSci::formatExpPart(int exp, string* output) {
+ string exp_str;
+ int abs_exp = exp > 0 ? exp : -exp;
+ gle_int_to_string(abs_exp, &exp_str);
+ if (hasExpDigits()) {
+ int nb_digits = exp_str.length();
+ str_prefix(getExpDigits()-nb_digits, '0', &exp_str);
+ }
+ if (exp < 0) exp_str.insert(0, "-");
+ else if (hasExpSign()) exp_str.insert(0, "+");
+ doNoZeroes(output);
+ switch (m_Mode) {
+ case GLE_NF_SCI_SMALL_E:
+ *output += "e";
+ *output += exp_str;
+ break;
+ case GLE_NF_SCI_BIG_E:
+ *output += "E";
+ *output += exp_str;
+ break;
+ case GLE_NF_SCI_10:
+ {
+ ostringstream toAdd;
+ if (g_get_tex_labels()) toAdd << "$";
+ if (output->length() != 0) toAdd << "\\cdot ";
+ toAdd << "10^{" << exp_str << "}";
+ if (g_get_tex_labels()) toAdd << "$";
+ *output += toAdd.str();
+ }
+ break;
+ }
+}
+
+void GLENumberFormatterSci::format(double number, string* output) {
+ int exp;
+ formatSimple(number, output, m_Sig, &exp);
+ formatExpPart(exp, output);
+ if (number < 0.0) output->insert(0, "-");
+ doAllSci(output);
+}
+
+void GLENumberFormatterSci::doAllSci(string* output) {
+ // no doNoZeroes() here! -> this is done before adding the "Exp" part
+ doPrefix(output);
+ doSign(output);
+ doPadLeft(output);
+ doPadRight(output);
+}
+
+GLENumberFormatterEng::GLENumberFormatterEng() : GLENumberFormatterSci() {
+ m_Numeric = false;
+ m_Digits = 0;
+}
+
+GLENumberFormatterEng::~GLENumberFormatterEng() {
+}
+
+void GLENumberFormatterEng::parseOptions(GLENumberFormat* format) {
+ m_Numeric = false;
+ m_Digits = format->nextInt();
+ if (m_Digits < 0) m_Digits = 0;
+ while (format->hasMoreTokens()) {
+ const string& tpe = format->nextToken();
+ if (tpe == "e") {
+ m_Mode = GLE_NF_SCI_SMALL_E;
+ format->incTokens();
+ } else if (tpe == "E") {
+ m_Mode = GLE_NF_SCI_BIG_E;
+ format->incTokens();
+ } else if (tpe == "10") {
+ m_Mode = GLE_NF_SCI_10;
+ format->incTokens();
+ } else if (tpe == "expdigits") {
+ format->incTokens();
+ setExpDigits(format->nextInt());
+ } else if (tpe == "expsign") {
+ format->incTokens();
+ setExpSign(true);
+ } else if (tpe == "num") {
+ m_Numeric = true;
+ format->incTokens();
+ } else {
+ break;
+ }
+ }
+}
+
+#define GLE_FMT_ENG_PREFIX_START (-24)
+#define GLE_FMT_ENG_PREFIX_END (GLE_FMT_ENG_PREFIX_START+(int)((sizeof(prefix)/sizeof(char *)-1)*3))
+
+void GLENumberFormatterEng::format(double number, string* output) {
+ static const char *prefix[] = {
+ "y", "z", "a", "f", "p", "n", "\\mu{}", "m", "",
+ "k", "M", "G", "T", "P", "E", "Z", "Y"
+ };
+ int expof10;
+ char result[100];
+ char *res = result;
+ int digits = m_Digits;
+ result[0] = 0;
+ if (number == 0.0) {
+ // take special care of the number zero
+ if (digits != 0) {
+ sprintf(res, "%.*f", digits-1, number);
+ *output = result;
+ doNoZeroes(output);
+ if (!m_Numeric) {
+ *output += " ";
+ }
+ }
+ myDoAll(output);
+ return;
+ }
+ if (number < 0.0) {
+ *res++ = '-';
+ number = -number;
+ }
+ expof10 = (int) log10(number);
+ if (expof10 > 0) expof10 = (expof10/3)*3;
+ else expof10 = (-expof10+3)/3*(-3);
+ number *= pow(10.0, -expof10);
+ if (number >= 1000.) {
+ number /= 1000.0; expof10 += 3;
+ } else if (number >= 100.0) {
+ digits -= 2;
+ } else if (number >= 10.0) {
+ digits -= 1;
+ }
+ if (m_Digits == 0) {
+ // no significant digits?
+ if (m_Numeric || (expof10 < GLE_FMT_ENG_PREFIX_START) ||
+ (expof10 > GLE_FMT_ENG_PREFIX_END)) {
+ res[0] = 0;
+ *output = result;
+ formatExpPart(expof10, output);
+ } else {
+ const char* fmt = g_get_tex_labels() ? "$\\mathrm{%s}$" : "%s";
+ sprintf(res, fmt, prefix[(expof10-GLE_FMT_ENG_PREFIX_START)/3]);
+ *output = result;
+ }
+ myDoAll(output);
+ return;
+ }
+ while (digits <= 0) {
+ // too few significant digits (happens with eng 2)
+ number /= 1000.0;
+ expof10 += 3;
+ digits = m_Digits;
+ if (number >= 100.0) {
+ digits -= 2;
+ } else if (number >= 10.0) {
+ digits -= 1;
+ }
+ }
+ if (m_Numeric || (expof10 < GLE_FMT_ENG_PREFIX_START) ||
+ (expof10 > GLE_FMT_ENG_PREFIX_END)) {
+ sprintf(res, "%.*f", digits-1, number);
+ *output = result;
+ formatExpPart(expof10, output);
+ } else {
+ sprintf(res, "%.*f", digits-1, number);
+ *output = result;
+ doNoZeroes(output);
+ *output += " ";
+ if (g_get_tex_labels()) *output += "$\\mathrm{";
+ *output += prefix[(expof10-GLE_FMT_ENG_PREFIX_START)/3];
+ if (g_get_tex_labels()) *output += "}$";
+ }
+ myDoAll(output);
+}
+
+void GLENumberFormatterEng::myDoAll(string* output) {
+ if (getAppend() == "") {
+ // no append, then remove trailing space intruduced if "eng" prefix is empty
+ str_trim_right(*output);
+ }
+ doAllSci(output);
+}
+
+GLENumberFormatterRound::~GLENumberFormatterRound() {
+}
+
+void GLENumberFormatterRound::parseOptions(GLENumberFormat* format) {
+ m_Sig = format->nextInt();
+}
+
+
+void GLENumberFormatterRound::format(double number, string* output) {
+ int exp;
+ formatSimple(number, output, m_Sig, &exp);
+ string::size_type pos = output->find('.');
+ if (exp < 0) {
+ if (pos != string::npos) output->erase(pos, 1);
+ string prefix = "0.";
+ for (int i = 0; i < -exp-1; i++) {
+ prefix += "0";
+ }
+ *output = prefix + (*output);
+ } else {
+ if (pos != string::npos) {
+ exp -= output->length() - pos - 1;
+ output->erase(pos, 1);
+ if (exp < 0) output->insert(output->length()+exp, ".");
+ }
+ for (int i = 0; i < exp; i++) {
+ (*output) += "0";
+ }
+ }
+ if (number < 0.0) output->insert(0, "-");
+ doAll(output);
+}
+
+GLENumberFormatterInt::GLENumberFormatterInt(int mode) : GLENumberFormatter() {
+ m_Mode = mode;
+ m_Upper = true;
+}
+
+GLENumberFormatterInt::~GLENumberFormatterInt() {
+}
+
+void GLENumberFormatterInt::parseOptions(GLENumberFormat* format) {
+ if (m_Mode == GLE_NF_INT_HEX) {
+ const string& up = format->nextToken();
+ if (up == "upper") {
+ format->incTokens();
+ } else if (up == "lower") {
+ setUpper(false);
+ format->incTokens();
+ }
+ }
+}
+
+void GLENumberFormatterInt::format(double number, string* output) {
+ char result[100];
+ int number_int = (int)floor(number + 0.5);
+ switch (m_Mode) {
+ case GLE_NF_INT_DEC:
+ sprintf(result, "%d", number_int);
+ *output = result;
+ break;
+ case GLE_NF_INT_HEX:
+ if (hasUpper()) sprintf(result, "%X", number_int);
+ else sprintf(result, "%x", number_int);
+ *output = result;
+ break;
+ case GLE_NF_INT_BIN:
+ gle_int_to_string_bin(number_int, output);
+ break;
+ }
+ doAll(output);
+}
+
+GLENumberFormatterFrac::GLENumberFormatterFrac(int mode) {
+ m_Mode = mode;
+}
+
+GLENumberFormatterFrac::~GLENumberFormatterFrac() {
+}
+
+void GLENumberFormatterFrac::format(double number, string* output) {
+ bool sign = false;
+ double num = number;
+ if (num < 0.0) {
+ sign = true;
+ num = fabs(num);
+ }
+ if (m_Mode == GLE_NF_FRAC_PI) num /= GLE_PI;
+ double int_part = floor(num);
+ num = num - int_part;
+ bool found = false;
+ float denom = 0.0;
+ while (!found && denom <= 100.0) {
+ denom = denom + 1.0;
+ if (fabs(floor(num*denom+1e-7) - num*denom) < 1e-6) {
+ found = true;
+ }
+ }
+ if (found) {
+ string str;
+ num *= denom;
+ num += int_part * denom;
+ if (sign) *output += "-";
+ if (m_Mode == GLE_NF_FRAC_PI) {
+ if (floor(num+1e-7) != 1.0) {
+ gle_int_to_string((int)floor(num+1e-7), &str);
+ *output += str;
+ }
+ if (number != 0.0) {
+ *output += g_get_tex_labels() ? "$\\pi$" : "\\pi";
+ }
+ } else {
+ gle_int_to_string((int)floor(num+1e-7), &str);
+ *output += str;
+ }
+ if (denom != 1.0) {
+ *output += "/";
+ gle_int_to_string((int)floor(denom+1e-7), &str);
+ *output += str;
+ }
+ } else {
+ char result[100];
+ sprintf(result, "%f", number);
+ *output = result;
+ }
+ doAll(output);
+}
+
+void GLENumberFormatterFrac::parseOptions(GLENumberFormat* format) {
+}
+
+GLENumberFormat::GLENumberFormat(const string& formats) :
+ m_Separator(" \"", "", "\'", "\'"), m_Tokens(formats, m_Separator) {
+ GLENumberFormatter* previous = &m_Default;
+ while (hasMoreTokens()) {
+ const string& name = nextToken();
+ GLENumberFormatter* format = NULL;
+ if (name == "fix") {
+ incTokens();
+ format = new GLENumberFormatterFix();
+ } else if (name == "percent") {
+ incTokens();
+ format = new GLENumberFormatterPercent();
+ } else if (name == "dec") {
+ incTokens();
+ format = new GLENumberFormatterInt(GLE_NF_INT_DEC);
+ } else if (name == "hex") {
+ incTokens();
+ format = new GLENumberFormatterInt(GLE_NF_INT_HEX);
+ } else if (name == "bin") {
+ incTokens();
+ format = new GLENumberFormatterInt(GLE_NF_INT_BIN);
+ } else if (name == "round") {
+ incTokens();
+ format = new GLENumberFormatterRound();
+ } else if (name == "sci") {
+ incTokens();
+ format = new GLENumberFormatterSci();
+ } else if (name == "eng") {
+ incTokens();
+ format = new GLENumberFormatterEng();
+ } else if (name == "frac") {
+ incTokens();
+ format = new GLENumberFormatterFrac(GLE_NF_FRAC_ONE);
+ } else if (name == "pi") {
+ incTokens();
+ format = new GLENumberFormatterFrac(GLE_NF_FRAC_PI);
+ } else if (name == "prefix") {
+ incTokens();
+ previous->setPrefix(nextInt());
+ } else if (name == "nozeroes") {
+ incTokens();
+ previous->setNoZeroes(true);
+ } else if (name == "nozero") {
+ incTokens();
+ previous->setNoZeroes(true);
+ } else if (name == "sign") {
+ incTokens();
+ previous->setSign(true);
+ } else if (name == "pad") {
+ incTokens();
+ int padvalue = nextInt();
+ const string& lr = nextToken();
+ if (lr == "left") {
+ previous->setPadLeft(padvalue);
+ incTokens();
+ } else if (lr == "right") {
+ previous->setPadRight(padvalue);
+ incTokens();
+ }
+ } else if (name == "min") {
+ incTokens();
+ previous->setMin(nextDouble());
+ } else if (name == "max") {
+ incTokens();
+ previous->setMax(nextDouble());
+ } else if (name == "append") {
+ incTokens();
+ nextString(previous->getAppend());
+ } else if (name == "add") {
+ incTokens();
+ nextString(previous->getAppend());
+ } else if (name == "prepend") {
+ incTokens();
+ nextString(previous->getPrepend());
+ } else if (name == "otherwise") {
+ incTokens();
+ } else {
+ gprint("Unknown specifier in number format string: '%s'", name.c_str());
+ incTokens();
+ }
+ if (format != NULL) {
+ format->setDefaults(&m_Default);
+ format->parseOptions(this);
+ addFormat(format);
+ previous = format;
+ }
+ }
+}
+
+GLENumberFormat::~GLENumberFormat() {
+ for (vector<GLENumberFormatter*>::size_type i = 0; i < m_Format.size(); i++) {
+ delete m_Format[i];
+ }
+}
+
+void GLENumberFormat::format(double number, string* output) {
+ for (vector<GLENumberFormatter*>::size_type i = 0; i < m_Format.size(); i++) {
+ if (m_Format[i]->appliesTo(number)) {
+ m_Format[i]->format(number, output);
+ return;
+ }
+ }
+ *output = "ERR";
+}
+
+void GLENumberFormat::incTokens() {
+ if (hasMoreTokens()) m_Tokens.next_token();
+}
+
+int GLENumberFormat::nextInt() {
+ if (hasMoreTokens()) {
+ const string& token = nextToken();
+ int result = atoi(token.c_str());
+ incTokens();
+ return result;
+ } else {
+ return 0;
+ }
+}
+
+double GLENumberFormat::nextDouble() {
+ char* err = NULL;
+ const string& token = nextToken();
+ double result = strtod(token.c_str(), &err);
+ incTokens();
+ return result;
+}
+
+void GLENumberFormat::nextString(string& value) {
+ value = nextToken();
+ str_remove_quote(value);
+ incTokens();
+}
+
+std::string format_number_to_string(const std::string& format, double value) {
+ string result;
+ GLENumberFormat fmt(format);
+ fmt.format(value, &result);
+ return result;
+}
diff --git a/src/gle/numberformat.h b/src/gle/numberformat.h
new file mode 100644
index 0000000..0209dcf
--- /dev/null
+++ b/src/gle/numberformat.h
@@ -0,0 +1,113 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#ifndef NUMBER_FORMAT_H
+#define NUMBER_FORMAT_H
+
+class GLENumberFormat;
+
+class GLENumberFormatter {
+protected:
+ int m_Prefix;
+ bool m_NoZeroes;
+ bool m_Sign;
+ int m_PadLeft;
+ int m_PadRight;
+ double m_Min;
+ double m_Max;
+ bool m_HasMin;
+ bool m_HasMax;
+ string m_Prepend;
+ string m_Append;
+public:
+ GLENumberFormatter();
+ virtual ~GLENumberFormatter();
+ virtual void parseOptions(GLENumberFormat* format);
+ virtual void format(double number, string* output);
+ virtual bool appliesTo(double number);
+ inline bool hasPrefix() { return m_Prefix != -1; }
+ inline int getPrefix() { return m_Prefix; }
+ inline void setPrefix(int prefix) { m_Prefix = prefix; }
+ inline bool hasNoZeroes() { return m_NoZeroes; }
+ inline void setNoZeroes(bool noz) { m_NoZeroes = noz; }
+ inline bool hasSign() { return m_Sign; }
+ inline void setSign(bool sign) { m_Sign = sign; }
+ void doPrefix(string* output);
+ void doNoZeroes(string* output);
+ void doSign(string* output);
+ void doPadLeft(string* output);
+ void doPadRight(string* output);
+ void doAll(string* output);
+ inline bool hasPadRight() { return m_PadRight != -1; }
+ inline int getPadRight() { return m_PadRight; }
+ inline void setPadRight(int PadRight) { m_PadRight = PadRight; }
+ inline bool hasPadLeft() { return m_PadLeft != -1; }
+ inline int getPadLeft() { return m_PadLeft; }
+ inline void setPadLeft(int PadLeft) { m_PadLeft = PadLeft; }
+ inline string& getPrepend() { return m_Prepend; }
+ inline string& getAppend() { return m_Append; }
+ void setMin(double min);
+ void setMax(double max);
+ inline bool hasMax() { return m_HasMax; }
+ inline bool hasMin() { return m_HasMin; }
+ inline double getMax() { return m_Max; }
+ inline double getMin() { return m_Min; }
+ void setDefaults(GLENumberFormatter* def);
+ void formatSimple(double value, string* output, int prec, int* exp);
+};
+
+class GLENumberFormat {
+protected:
+ level_char_separator m_Separator;
+ tokenizer<level_char_separator> m_Tokens;
+ vector<GLENumberFormatter*> m_Format;
+ GLENumberFormatter m_Default;
+public:
+ GLENumberFormat(const string& format);
+ ~GLENumberFormat();
+ inline bool hasMoreTokens() { return m_Tokens.has_more(); }
+ inline const string& nextToken() { return m_Tokens.cr_token(); }
+ inline void addFormat(GLENumberFormatter* format) { m_Format.push_back(format); }
+ void format(double number, string* output);
+ void incTokens();
+ int nextInt();
+ double nextDouble();
+ void nextString(string& value);
+};
+
+#endif
diff --git a/src/gle/op_def.cpp b/src/gle/op_def.cpp
new file mode 100644
index 0000000..2515061
--- /dev/null
+++ b/src/gle/op_def.cpp
@@ -0,0 +1,364 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#include "op_def.h"
+#include "color.h"
+
+/*--------------------------------------------------------------------------------------*/
+/* Pos = Offset to find the data */
+/* Idx = For switches, which can only have one value */
+/* The pos is the order the items will be placed in the pcode */
+/* */
+/* indexes (idx) for types */
+/* =================================================================================== */
+/* typ_switch Switches LONG Placed in directly, 1 present, 0 not present */
+/* expressions LONG* Pointed to, 0 if not present */
+/* type_fill color/fill LONG* Pointer to exp 0 if not present */
+/* marker LONG* Pointer to exp 0 if not present */
+/* lstyle LONG* Pointer to exp 0 if not present */
+/* typ_str font int* Pointer to string expression */
+/* */
+/*--------------------------------------------------------------------------------------*/
+
+struct op_key op_box[] = {
+ { "JUSTIFY", typ_justify, 1, 0 },
+ { "JUST", typ_justify, 1, 0 },
+ { "FILL", typ_fill, 2, 0 },
+ { "NOSTROKE", typ_switch, 3, 1 },
+ { "NOBORDER", typ_switch, 3, 1 },
+ { "NOBOX", typ_switch, 3, 1 },
+ { "REVERSE", typ_switch, 4, 1 },
+ { "ROUND", typ_val, 5, 0 },
+ { "NAME", typ_str, 6, 0 },
+ { "END", typ_end, 0, 0 } };
+
+struct op_key op_circle[] = {
+ { "JUSTIFY", typ_justify, 1, 0 },
+ { "JUST", typ_justify, 1, 0 },
+ { "NOSTROKE", typ_switch, 2, 1 },
+ { "FILL", typ_fill, 3, 0 },
+ { "NAME", typ_str, 4, 0 },
+ { "END", typ_end, 0, 0 } };
+
+struct op_key op_defmarker[] = {
+ { "FONT", typ_str, 1, 0 },
+ { "CHAR", typ_str, 2, 0 },
+ { "DX", typ_val, 3, 0 },
+ { "DY", typ_val, 4, 0 },
+ { "END", typ_end, 0, 0 } };
+
+struct op_key op_fill[] = {
+ { "FILL", typ_fill, 1, 0 },
+ { "END", typ_end, 0, 0 } };
+
+struct op_key op_for_step[] = {
+ { "STEP", typ_val, 1, 0 },
+ { "END", typ_end, 0, 0 } };
+
+struct op_key op_begin_text[] = {
+ { "WIDTH", typ_val, 1, 0 },
+ { "DEPTH", typ_val, 2, 0 },
+ { "JUSTIFY", typ_justify, 3, 0 },
+ { "JUST", typ_justify, 3, 0 },
+ { "END", typ_end, 0, 0 } };
+
+struct op_key op_justify[] = {
+ { "LEFT", typ_switch, 1, 0x100 },
+ { "CENT", typ_switch, 1, 0x110 },
+ { "CENTER", typ_switch, 1, 0x110 },
+ { "CENTRE", typ_switch, 1, 0x110 },
+ { "RIGHT", typ_switch, 1, 0x120 },
+ { "LT", typ_switch, 1, 0x02 },
+ { "TL", typ_switch, 1, 0x02 },
+ { "CL", typ_switch, 1, 0x01 },
+ { "LC", typ_switch, 1, 0x01 },
+ { "BL", typ_switch, 1, 0x00 },
+ { "LB", typ_switch, 1, 0x00 },
+ { "CB", typ_switch, 1, 0x10 },
+ { "BC", typ_switch, 1, 0x10 },
+ { "RB", typ_switch, 1, 0x20 },
+ { "BR", typ_switch, 1, 0x20 },
+ { "CR", typ_switch, 1, 0x21 },
+ { "RC", typ_switch, 1, 0x21 },
+ { "TR", typ_switch, 1, 0x22 },
+ { "RT", typ_switch, 1, 0x22 },
+ { "TC", typ_switch, 1, 0x12 },
+ { "CT", typ_switch, 1, 0x12 },
+ { "CC", typ_switch, 1, 0x11 },
+ { "CI", typ_switch, 1, 0x1011 },
+ { "C", typ_switch, 1, 0x1011 },
+ { "VI", typ_switch, 1, 0x2000 },
+ { "V", typ_switch, 1, 0x2000 },
+ { "HO", typ_switch, 1, 0x3000 },
+ { "H", typ_switch, 1, 0x3000 },
+ { "BOX", typ_switch, 1, 0x5011 },
+ { "BO", typ_switch, 1, 0x5011 },
+ { "END", typ_end, 1, 1} };
+
+struct op_key op_begin[] = {
+ { "path", typ_switch, 1, 1 },
+ { "box", typ_switch, 1, 2 },
+ { "scale", typ_switch, 1, 3 },
+ { "rotate", typ_switch, 1, 4 },
+ { "translate", typ_switch, 1, 5 },
+ { "rot", typ_switch, 1, 4 },
+ { "tran", typ_switch, 1, 5 },
+ { "if", typ_switch, 1, 6 },
+ { "sub", typ_switch, 1, 7 },
+ { "name", typ_switch, 1, 8 },
+ { "text", typ_switch, 1, 9 },
+ { "graph", typ_switch, 1, 10 },
+ { "xaxis", typ_switch, 1, 11 },
+ { "yaxis", typ_switch, 1, 12 },
+ { "x2axis", typ_switch, 1, 13 },
+ { "y2axis", typ_switch, 1, 14 },
+ { "curve", typ_switch, 1, 15 },
+ { "key", typ_switch, 1, 16 },
+ { "origin", typ_switch, 1, 17 },
+ { "table", typ_switch, 1, 18 },
+ { "clip", typ_switch, 1, 19 },
+ { "until", typ_switch, 1, 20 },
+ { "shear", typ_switch, 1, 21 },
+ { "config", typ_switch, 1, 22 },
+ { "texpreamble", typ_switch, 1, 23 },
+ { "surface", typ_switch, 1, 24 },
+ { "letz", typ_switch, 1, 25 },
+ { "fitz", typ_switch, 1, 26 },
+ { "fit", typ_switch, 1, 27 }, /* what previously fitls used to be */
+ { "contour", typ_switch, 1, 28 },
+ { "tex", typ_switch, 1, 29 },
+ { "object", typ_switch, 1, OP_BEGIN_OBJECT },
+ { "length", typ_switch, 1, OP_BEGIN_LENGTH },
+ { "END", typ_end, 1, 1} };
+
+struct op_key op_set[] = {
+ { "HEI", typ_switch, 1, 1 },
+ { "FONT", typ_switch, 1, 2 },
+ { "JUSTIFY", typ_switch, 1, 3 },
+ { "JUST", typ_switch, 1, 3 },
+ { "COLOR", typ_switch, 1, 4 },
+ { "BACKGROUND", typ_switch, 1, OP_SET_BACKGROUND },
+ { "DASHLEN", typ_switch, 1, 5 },
+ { "DASH", typ_switch, 1, 6 },
+ { "FILL", typ_switch, 1, OP_SET_FILL },
+ { "PATTERN", typ_switch, 1, OP_SET_FILL_PATTERN },
+ { "FILLMETHOD", typ_switch, 1, OP_SET_FILL_METHOD },
+ { "LDIST", typ_switch, 1, 5 },
+ { "LSTYLE", typ_switch, 1, 6 },
+ { "LWIDTH", typ_switch, 1, 7 },
+ { "JOIN", typ_switch, 1, 8 },
+ { "CAP", typ_switch, 1, 9 },
+ { "FONTLWIDTH", typ_switch, 1, 10 },
+ { "TEXSCALE", typ_switch, 1, OP_SET_TEX_SCALE },
+ { "TEXLABELS", typ_switch, 1, OP_SET_TEX_LABELS },
+ { "ARROWSTYLE", typ_switch, 1, OP_SET_ARROW_STYLE },
+ { "ARROWTIP", typ_switch, 1, OP_SET_ARROW_TIP },
+ { "ARROWSIZE", typ_switch, 1, OP_SET_ARROW_SIZE },
+ { "ARROWANGLE", typ_switch, 1, OP_SET_ARROW_ANGLE },
+ { "IMAGEFORMAT", typ_switch, 1, OP_SET_IMAGE_FORMAT },
+ { "TITLESCALE", typ_switch, 1, OP_SET_TITLE_SCALE },
+ { "ATITLESCALE", typ_switch, 1, OP_SET_ATITLE_SCALE },
+ { "ALABELSCALE", typ_switch, 1, OP_SET_ALABEL_SCALE },
+ { "TICKSSCALE", typ_switch, 1, OP_SET_TICKS_SCALE },
+ { "ATITLEDIST", typ_switch, 1, OP_SET_ATITLE_DIST },
+ { "ALABELDIST", typ_switch, 1, OP_SET_ALABEL_DIST },
+ { "END", typ_end, 1, 1} };
+
+/* colors, fills, First byte is pattern, then red,green,blue intensities*/
+/* currently defined patterns are, ff=clear, 1=black, */
+struct op_key op_fill_typ[] = {
+ { "CLEAR", typ_switch, 1, GLE_FILL_CLEAR },
+ { "GRID", typ_switch, 1, 0X02012020 },
+ { "GRID1", typ_switch, 1, 0X02040f0f },
+ { "GRID2", typ_switch, 1, 0X02011010 },
+ { "GRID3", typ_switch, 1, 0X02052020 },
+ { "GRID4", typ_switch, 1, 0X02104040 },
+ { "GRID5", typ_switch, 1, 0X02206060 },
+ { "SHADE", typ_switch, 1, 0X02010020 },
+ { "SHADE1", typ_switch, 1, 0X0204000C },
+ { "SHADE2", typ_switch, 1, 0X02010010 },
+ { "SHADE3", typ_switch, 1, 0X02050020 },
+ { "SHADE4", typ_switch, 1, 0X02100040 },
+ { "SHADE5", typ_switch, 1, 0X02200060 },
+ { "RSHADE", typ_switch, 1, 0X02012000 },
+ { "RSHADE1", typ_switch, 1, 0X02040C00 },
+ { "RSHADE2", typ_switch, 1, 0X02011000 },
+ { "RSHADE3", typ_switch, 1, 0X02052000 },
+ { "RSHADE4", typ_switch, 1, 0X02104000 },
+ { "RSHADE5", typ_switch, 1, 0X02206000 },
+ { "END", typ_end, 1, 1} };
+
+struct op_key op_marker[] = {
+ { "DOT", typ_switch, 1, 1 },
+ { "CROSS", typ_switch, 1, 2 },
+ { "FCIRCLE", typ_switch, 1, 3 },
+ { "FSQUARE", typ_switch, 1, 4 },
+ { "FTRIANGLE", typ_switch, 1, 5 },
+ { "FDIAMOND", typ_switch, 1, 6 },
+ { "CIRCLE", typ_switch, 1, 7 },
+ { "SQUARE", typ_switch, 1, 8 },
+ { "TRIANGLE", typ_switch, 1, 9 },
+ { "DIAMOND", typ_switch, 1, 10 },
+ { "PLUS", typ_switch, 1, 11 },
+ { "CLUB", typ_switch, 1, 12 },
+ { "HEART", typ_switch, 1, 13 },
+ { "DIAMOND", typ_switch, 1, 14 },
+ { "SPADE", typ_switch, 1, 15 },
+ { "STAR", typ_switch, 1, 16 },
+ { "SNAKE", typ_switch, 1, 17 },
+ { "DAG", typ_switch, 1, 18 },
+ { "DDAG", typ_switch, 1, 19 },
+ { "ASTERIX", typ_switch, 1, 20 },
+ { "ASTERISK", typ_switch, 1, 20 },
+ { "OPLUS", typ_switch, 1, 21 },
+ { "OMINUS", typ_switch, 1, 22 },
+ { "OTIMES", typ_switch, 1, 23 },
+ { "ODOT", typ_switch, 1, 24 },
+ { "TRIANGLEZ", typ_switch, 1, 25 },
+ { "DIAMONDZ", typ_switch, 1, 26 },
+ { "WCIRCLE", typ_switch, 1, 27 },
+ { "WTRIANGLE", typ_switch, 1, 28 },
+ { "WSQUARE", typ_switch, 1, 29 },
+ { "WDIAMOND", typ_switch, 1, 30 },
+ { "END", typ_end, 1, 1 } };
+
+struct op_key op_begin_path[] = {
+ { "STROKE", typ_switch, 1, 1 },
+ { "FILL", typ_fill, 2, 0 },
+ { "CLIP", typ_switch, 3, 1 },
+ { "END", typ_end, 0, 0 } };
+
+struct op_key op_begin_box[] = {
+ { "ADD", typ_val, 1, 0 },
+ { "FILL", typ_fill, 2, 0 },
+ { "NOSTROKE", typ_switch, 3, 1 },
+ { "NOBORDER", typ_switch, 3, 1 },
+ { "NOBOX", typ_switch, 3, 1 },
+ { "ROUND", typ_val, 4, 0 },
+ { "NAME", typ_str, 5, 0 },
+ { "END", typ_end, 0, 0 } };
+
+struct op_key op_begin_name[] = {
+ { "ADD", typ_val, 1, 0 },
+ { "END", typ_end, 0, 0 } };
+
+struct op_key op_begin_scale[] = {
+ { "TRANSLATE", typ_val2, 1, 0 },
+ { "TRAN", typ_val2, 1, 0 },
+ { "SCALE", typ_val2, 3, 0 },
+ { "ROTATE", typ_val, 5, 0 },
+ { "ROT", typ_val, 5, 0 },
+ { "END", typ_end, 0, 0 } };
+
+struct op_key op_arc[] = {
+ { "ARROW", typ_arrow, 1, 1 },
+ { "CENTER", typ_val2, 2, 0 },
+ { "CENTRE", typ_val2, 2, 0 },
+ { "CENT", typ_val2, 2, 0 },
+ { "END", typ_end, 0, 0 } };
+
+struct op_key op_arrow[] = {
+ { "START", typ_switch, 1, 1 },
+ { "END", typ_switch, 1, 2 },
+ { "BOTH", typ_switch, 1, 3 },
+ { "END", typ_end, 0, 0 } };
+
+struct op_key op_joinname[] = {
+ { "->", typ_switch, 1, 1 },
+ { "<-", typ_switch, 1, 2 },
+ { "<->", typ_switch, 1, 3 },
+ { "-", typ_switch, 1, 4 },
+ { "END", typ_end, 0, 0 } };
+
+struct op_key op_line[] = {
+ { "ARROW", typ_arrow, 1, 1 },
+ { "CURVE", typ_val4, 2, 0 },
+ { "END", typ_end, 0, 0 } };
+
+struct op_key op_curve[] = {
+ { "CURVE", typ_val4, 1, 0 },
+ { "END", typ_end, 0, 0 } };
+
+struct op_key op_size[] = {
+ { "BOX", typ_switch, 1, 1 },
+ { "END", typ_end, 0, 0 } };
+
+struct op_key op_join[] = {
+ { "MITRE", typ_switch, 1, 0 },
+ { "ROUND", typ_switch, 1, 1 },
+ { "BEVEL", typ_switch, 1, 2 },
+ { "END", typ_end, 0, 0 } };
+
+struct op_key op_cap[] = {
+ { "BUTT", typ_switch, 1, 0 },
+ { "ROUND", typ_switch, 1, 1 },
+ { "SQUARE", typ_switch, 1, 2 },
+ { "END", typ_end, 0, 0 } };
+
+struct op_key op_bitmap[] = {
+ { "COLORS", typ_val, 1, 0 },
+ { "COMPRESS", typ_str, 2, 0 },
+ { "DPI", typ_val, 3, 0 },
+ { "GRAYSCALE", typ_switch, 4, 1 },
+ { "RESIZE", typ_switch, 5, 1 },
+ { "TYPE", typ_str, 6, 0 },
+ { "END", typ_end, 0, 0 } };
+
+struct op_key op_bitmap_info[] = {
+ { "TYPE", typ_str, 1, 0 },
+ { "END", typ_end, 0, 0 } };
+
+struct op_key op_tex[] = {
+ { "ADD", typ_val, 1, 0 },
+ { "NAME", typ_str, 2, 0 },
+ { "END", typ_end, 0, 0 } };
+
+struct op_key op_draw[] = {
+ { "NAME", typ_str, 2, 0 },
+ { "END", typ_end, 0, 0 } };
+
+struct op_key op_orientation[] = {
+ { "PORTRAIT", typ_switch, 1, 0 },
+ { "LANDSCAPE", typ_switch, 1, 1 },
+ { "END", typ_end, 0, 0} };
+
+struct op_key op_colormap[] = {
+ { "COLOR", typ_switch, 1, 1 },
+ { "PALETTE", typ_str, 2, 0 },
+ { "END", typ_end, 0, 0 } };
+
diff --git a/src/gle/op_def.h b/src/gle/op_def.h
new file mode 100644
index 0000000..dd85a4b
--- /dev/null
+++ b/src/gle/op_def.h
@@ -0,0 +1,109 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+struct op_key {
+ char name[256];
+ int typ;
+ int pos;
+ unsigned int idx;
+};
+
+#define typ_end 0
+#define typ_val 1
+#define typ_val2 2
+#define typ_val4 3
+#define typ_str 4
+#define typ_switch 5
+#define typ_color 6
+#define typ_fill 7
+#define typ_marker 8
+#define typ_lstyle 9
+#define typ_justify 10
+#define typ_arrow 11
+
+#define OP_SET_ARROW_SIZE 11
+#define OP_SET_ARROW_ANGLE 12
+#define OP_SET_ARROW_STYLE 13
+#define OP_SET_ARROW_TIP 14
+#define OP_SET_IMAGE_FORMAT 15
+#define OP_SET_TITLE_SCALE 16
+#define OP_SET_ATITLE_SCALE 17
+#define OP_SET_ALABEL_SCALE 18
+#define OP_SET_TICKS_SCALE 19
+#define OP_SET_ATITLE_DIST 20
+#define OP_SET_ALABEL_DIST 21
+#define OP_SET_TEX_SCALE 22
+#define OP_SET_TEX_LABELS 23
+#define OP_SET_FILL 24
+#define OP_SET_FILL_PATTERN 25
+#define OP_SET_BACKGROUND 26
+#define OP_SET_FILL_METHOD 27
+
+#define OP_BEGIN_OBJECT 30
+#define OP_BEGIN_LENGTH 31
+
+extern struct op_key op_box[];
+extern struct op_key op_circle[];
+extern struct op_key op_defmarker[];
+extern struct op_key op_fill[];
+extern struct op_key op_for_step[];
+extern struct op_key op_begin_text[];
+extern struct op_key op_justify[];
+extern struct op_key op_begin[];
+extern struct op_key op_set[];
+extern struct op_key op_fill_typ[];
+extern struct op_key op_marker[];
+extern struct op_key op_begin_path[];
+extern struct op_key op_begin_box[];
+extern struct op_key op_begin_name[];
+extern struct op_key op_begin_scale[];
+extern struct op_key op_arc[];
+extern struct op_key op_arrow[];
+extern struct op_key op_joinname[];
+extern struct op_key op_line[];
+extern struct op_key op_curve[];
+extern struct op_key op_size[];
+extern struct op_key op_join[];
+extern struct op_key op_cap[];
+extern struct op_key op_bitmap[];
+extern struct op_key op_bitmap_info[];
+extern struct op_key op_tex[];
+extern struct op_key op_orientation[];
+extern struct op_key op_colormap[];
+extern struct op_key op_draw[];
+
diff --git a/src/gle/pass.cpp b/src/gle/pass.cpp
new file mode 100644
index 0000000..bbd2f81
--- /dev/null
+++ b/src/gle/pass.cpp
@@ -0,0 +1,2438 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#define GRAPHDEF extern
+
+#include "all.h"
+#include "cutils.h"
+#include "mem_limits.h"
+#include "token.h"
+#include "core.h"
+#include "glearray.h"
+#include "graph.h"
+#include "polish.h"
+#include "pass.h"
+#include "var.h"
+#include "sub.h"
+#include "op_def.h"
+#include "gprint.h"
+#include "keyword.h"
+#include "gle-block.h"
+#include "key.h"
+#include "surface/gsurface.h"
+#include "run.h"
+
+GLEParser* g_parser;
+
+extern GLESubMap g_Subroutines;
+
+void get_cap(TOKENS tk,int *ntok,int *curtok,int *pcode,int *plen);
+void get_join(TOKENS tk,int *ntok,int *curtok,int *pcode,int *plen);
+void g_marker_def(char *s1, char *s2);
+void font_load(void) throw(ParserError);
+bool execute_graph(GLESourceLine& sline, bool isCommandCheck);
+
+extern int this_line;
+extern int gle_debug;
+
+#define tok(n) tk[n]
+
+struct sub_st{
+ char name[40];
+ int typ;
+ int np;
+ int ptyp[20];
+ char *pname[20];
+};
+struct sub_st *psub;
+
+#define skip_space
+
+char *mark_name[30];
+char *mrk_fname[61];
+char *mrk_name[61];
+char *mark_sub[30];
+int mark_subp[30];
+int nmark = 0;
+int nmrk = 0;
+
+/* pos= Offset to find the data */
+/* idx= For switches, which can only have one value. */
+/* The pos is the order the items will be placed in the pcode */
+/*---------------------------------------------------------------------------*/
+/* Input is gle command (tokenized) , output is pcode */
+static int cur_mode = 0; /* 0 --> normal, 1 or greater ---> external begin...end */
+
+void get_key_info(OPKEY lkey, int* count, int* width) {
+ *width = 0; *count = 0;
+ for (int i = 0; lkey[i].typ != typ_end; i++) {
+ int p = lkey[i].pos;
+ if (p > *width) *width = p;
+ (*count)++;
+ }
+}
+
+void GLEParserInitTokenizer(Tokenizer* tokens) {
+ TokenizerLanguage* lang = tokens->get_language();
+ lang->setLineCommentTokens("!");
+ lang->setSpaceTokens(" \t\r\n");
+ lang->enableCComment();
+ lang->setSingleCharTokens(",;=@()[]{}");
+}
+
+GLESubCallAdditParam::GLESubCallAdditParam() {
+}
+
+GLESubCallAdditParam::~GLESubCallAdditParam() {
+}
+
+int GLESubCallAdditParam::isAdditionalParam(const string& str) {
+ return str == "NAME" ? 1 : -1;
+}
+
+void GLESubCallAdditParam::setAdditionalParam(int idx, const string& val, int pos) {
+ m_Val = val;
+ m_Pos = pos;
+}
+
+GLESubCallInfo::GLESubCallInfo(GLESub* sub) : m_ParamVal(sub->getNbParam()), m_ParamPos(sub->getNbParam(), -1) {
+ m_Sub = sub;
+ m_Addit = NULL;
+}
+
+GLESubCallInfo::~GLESubCallInfo() {
+}
+
+void GLESubCallInfo::setParam(int i, const string& val, int pos) {
+ m_ParamVal[i] = val;
+ m_ParamPos[i] = pos;
+}
+
+GLEParser::GLEParser(GLEScript* script, GLEPolish* polish) : m_lang(), m_tokens(&m_lang, false) {
+ m_Script = script;
+ m_polish = polish;
+ m_auto_endif = false;
+ m_CrSub = NULL;
+ m_insub = false;
+ // difference between m_CrSub and m_insub:
+ // m_CrSub still points to last sub also after "end sub"
+
+ m_blockTypes = new GLEBlocks();
+ m_blockTypes->addBlock(GLE_OPBEGIN_GRAPH, new GLEGraphBlockBase());
+ m_blockTypes->addBlock(GLE_OPBEGIN_KEY, new GLEKeyBlockBase());
+ m_blockTypes->addBlock(GLE_OPBEGIN_SURF, new GLESurfaceBlockBase());
+}
+
+GLEParser::~GLEParser() {
+ delete m_blockTypes;
+}
+
+GLEBlocks* GLEParser::getBlockTypes() {
+ return m_blockTypes;
+}
+
+void GLEParser::get_block_type(int type, string& result) {
+ char block_type_str[20];
+ sprintf(block_type_str, "%d", type);
+ const char* block_type = block_type_str;
+ switch (type) {
+ case 1: /* path */
+ block_type = "path"; break;
+ case 2: /* box */
+ block_type = "box"; break;
+ case 3: /* scale */
+ block_type = "scale"; break;
+ case 4: /* rotate */
+ block_type = "rotate"; break;
+ case 5: /* translate */
+ block_type = "translate"; break;
+ case 6: /* if */
+ block_type = "if"; break;
+ case 7: /* sub */
+ block_type = "sub"; break;
+ case 8: /* name */
+ block_type = "name"; break;
+ case 9: /* text */
+ block_type = "text"; break;
+ case 10: /* graph */
+ block_type = "graph"; break;
+ case 11: /* xaxis */
+ block_type = "xaxis"; break;
+ case 12: /* yaxis */
+ block_type = "yaxis"; break;
+ case 13: /* x2axis */
+ block_type = "x2axis"; break;
+ case 14: /* y2axis */
+ block_type = "y2axis"; break;
+ case 15: /* curve */
+ block_type = "curve"; break;
+ case 16: /* KEY */
+ block_type = "key"; break;
+ case 17: /* origin */
+ block_type = "origin"; break;
+ case 18: /* table */
+ block_type = "table"; break;
+ case 19: /* clip */
+ block_type = "clip"; break;
+ case 20: /* until */
+ block_type = "until"; break;
+ case 21: /* shear */
+ block_type = "shear"; break;
+ case 22: /* config */
+ block_type = "config"; break;
+ case 23: /* tex preamble */
+ block_type = "tex_preamble"; break;
+ case 24: /* surface */
+ block_type = "surface"; break;
+ case 25: /* letz */
+ block_type = "letz"; break;
+ case 26: /* fitz */
+ block_type = "fitz"; break;
+ case 27: /* fit */
+ block_type = "fit"; break;
+ case 28: /* contour */
+ block_type = "contour"; break;
+ case 29: /* tex */
+ block_type = "tex"; break;
+ case OP_BEGIN_OBJECT:
+ block_type = "object"; break;
+ }
+ result = block_type;
+}
+
+void GLEParser::checkmode() throw(ParserError) {
+ /* Check for text mode block */
+ if (cur_mode != 0) {
+ string block_type;
+ get_block_type(cur_mode, block_type);
+ g_throw_parser_error("end of file while in block type '", block_type.c_str(), "'");
+ }
+ cur_mode = 0;
+ /* Check for other type of block */
+ GLESourceBlock* block = last_block();
+ if (block != NULL) {
+ stringstream err;
+ err << "end of file while in block type '" << block->getName() << "'";
+ err << " starting on line " << block->getFirstLine();
+ g_throw_parser_error(err.str());
+ }
+}
+
+void GLEParser::initTokenizer() {
+ TokenizerLanguage* lang = getTokens()->get_language();
+ GLEParserInitTokenizer(getTokens());
+ // ; -> allows more commands on single line
+ // = -> for variable assignments
+ // @ -> for user defined subroutine calls
+ // (,) -> for calls of the form proc(arg1,...,argn)
+ // never add "." to this - e.g., required for "compatibility" command
+ TokenizerLanguageMultiLevel* multi = new TokenizerLanguageMultiLevel();
+ multi->setOpenClose('(',')');
+ multi->setOpenClose('[',']');
+ multi->setOpenClose('{','}');
+ multi->setEndToken(' ');
+ multi->setEndToken(';');
+ multi->setEndToken(',');
+ multi->setEndToken(')');
+ multi->setEndToken(']');
+ lang->setMulti(multi);
+}
+
+void GLEParser::setAllowSpace(bool allow) {
+ TokenizerLanguageMultiLevel* multi = getTokens()->get_language()->getMulti();
+ if (allow) multi->resetEndToken(' ');
+ else multi->setEndToken(' ');
+}
+
+void GLEParser::checkValidName(const string& name, const char* type, int pos) throw(ParserError) {
+ if (name.length() <= 0) {
+ throw getTokens()->error(pos, string("zero length ")+type+" name");
+ }
+ if (name[0] >= '0' && name[0] <= '9') {
+ throw getTokens()->error(pos, string(type)+" name should not start with a digit");
+ }
+ for (string::size_type i = 0; i < name.length(); i++) {
+ char ch = name[i];
+ if (!((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') ||
+ (ch >= '0' && ch <= '9') || (ch == '$') || (ch == '_'))) {
+ throw getTokens()->error(pos+i, string("invalid character '")+ch+"' in "+type+" name");
+ }
+ }
+}
+
+double GLEParser::evalTokenToDouble() throw(ParserError) {
+ double x = 0.0;
+ Tokenizer* tokens = getTokens();
+ string& expr = tokens->next_multilevel_token();
+ int pos = tokens->token_pos_col();
+ try {
+ m_polish->internalEval(expr.c_str(), &x);
+ } catch (ParserError& err) {
+ err.incColumn(pos-1);
+ throw err;
+ }
+ return x;
+}
+
+void GLEParser::evalTokenToString(string* str) throw(ParserError) {
+ Tokenizer* tokens = getTokens();
+ string& expr = tokens->next_multilevel_token();
+ int pos = tokens->token_pos_col();
+ try {
+ m_polish->internalEvalString(expr.c_str(), str);
+ } catch (ParserError& err) {
+ err.incColumn(pos-1);
+ throw err;
+ }
+}
+
+void GLEParser::evalTokenToFileName(string* str) throw(ParserError) {
+ Tokenizer* tokens = getTokens();
+ const string& token = tokens->next_continuous_string_excluding("\"$+");
+ if (token != "") {
+ *str = token;
+ } else {
+ evalTokenToString(str);
+ }
+}
+
+void GLEParser::polish(GLEPcode& pcode, int *rtype) throw(ParserError) {
+ Tokenizer* tokens = getTokens();
+ string& expr = tokens->next_multilevel_token();
+ int pos = tokens->token_pos_col();
+ // cout << "pos = " << pos << endl;
+ try {
+ // cout << "Polish: '" << expr << "'" << endl;
+ m_polish->internalPolish(expr.c_str(), pcode, rtype);
+ } catch (ParserError& err) {
+ err.incColumn(pos-1);
+ throw err;
+ }
+}
+
+void GLEParser::polish_eol(GLEPcode& pcode, int *rtype) throw(ParserError) {
+ setAllowSpace(true);
+ polish(pcode, rtype);
+ setAllowSpace(false);
+}
+
+void GLEParser::polish(const char* str, GLEPcode& pcode, int *rtype) throw(ParserError) {
+ m_polish->polish(str, pcode, rtype);
+}
+
+void GLEParser::polish_pos(const string& arg, int pos, GLEPcode& pcode, int* rtype) throw(ParserError) {
+ try {
+ m_polish->internalPolish(arg.c_str(), pcode, rtype);
+ } catch (ParserError& err) {
+ err.incColumn(pos-1);
+ throw err;
+ }
+}
+
+void GLEParser::get_xy(GLEPcode& pcode) throw(ParserError) {
+ int vtype = 1;
+ polish(pcode, &vtype);
+ vtype = 1;
+ polish(pcode, &vtype);
+}
+
+void GLEParser::get_exp(GLEPcode& pcode) throw(ParserError) {
+ int vtype = 1;
+ polish(pcode, &vtype);
+}
+
+void GLEParser::get_exp_eol(GLEPcode& pcode) throw(ParserError) {
+ int vtype = 1;
+ polish_eol(pcode, &vtype);
+}
+
+void GLEParser::get_strexp(GLEPcode& pcode) throw(ParserError) {
+ int vtype = 2;
+ polish(pcode, &vtype);
+}
+
+int GLEParser::get_anyexp(GLEPcode& pcode) throw(ParserError) {
+ int vtype = 0;
+ polish(pcode, &vtype);
+ return vtype;
+}
+
+void GLEParser::get_if(GLEPcode& pcode) throw(ParserError) {
+ Tokenizer* tokens = getTokens();
+ string expr = tokens->next_multilevel_token();
+ int pos = tokens->token_pos_col();
+ /* Support spaces between in if expression */
+ while (true) {
+ string& token = tokens->next_multilevel_token();
+ if (str_i_equals(token.c_str(), "THEN")) {
+ break;
+ } else if (token == "") {
+ throw error("'THEN' expected after if condition");
+ }
+ expr += " ";
+ expr += token;
+ }
+ try {
+ int rtype = 1;
+ // cout << "Polish: '" << expr << "'" << endl;
+ m_polish->internalPolish(expr.c_str(), pcode, &rtype);
+ } catch (ParserError& err) {
+ err.incColumn(pos-1);
+ throw err;
+ }
+}
+
+void GLEParser::parse_if(int srclin, GLEPcode& pcode) throw(ParserError) {
+ get_if(pcode);
+ GLESourceBlock* block = add_block(GLE_SRCBLK_MAGIC+GLE_OPBEGIN_IF, srclin);
+ block->setOffset2(pcode.size());
+ pcode.addInt(0);
+ pcode.addInt(0);
+}
+
+void GLEParser::get_subroutine_call(GLEPcode& pcode, string* name, int poscol) throw(ParserError) {
+ string fct_name;
+ if (name != NULL) {
+ fct_name = *name;
+ } else {
+ fct_name = m_tokens.next_token();
+ str_to_uppercase(fct_name);
+ poscol = m_tokens.token_pos_col();
+ }
+ GLESub* sub = sub_find((char*)fct_name.c_str());
+ if (sub == NULL) {
+ throw error(poscol, "function '"+fct_name+"' not defined");
+ }
+ GLESubCallInfo info(sub);
+ pass_subroutine_call(&info, poscol);
+ gen_subroutine_call_code(&info, pcode);
+}
+
+void GLEParser::pass_subroutine_call(GLESubCallInfo* info, int poscol) throw(ParserError) {
+ GLESub* sub = info->getSub();
+ int np = sub->getNbParam();
+ string uc_token;
+ bool mustname = false;
+ int argcnt = 0, maxargpos = -1;
+ // cout << "reading args for: '" << fct_name << "'" << endl;
+ bool has_parenthesis = false;
+ if (m_tokens.is_next_token("(")) {
+ if (m_tokens.has_space_before()) {
+ // in this case, "(" is part of expression in first argument
+ m_tokens.pushback_token();
+ } else {
+ has_parenthesis = true;
+ }
+ }
+ while (has_parenthesis || not_at_end_command()) {
+ /* check if argument name is given */
+ int argno = -1;
+ int addidx = -1;
+ string& token = m_tokens.next_multilevel_token();
+ if (token == "") {
+ /* empty - can happen if, e.g., "," is given instead of token */
+ break;
+ }
+ str_to_uppercase(token, uc_token);
+ argno = sub->findParameter(uc_token);
+ if (info->getAdditParam() != NULL) {
+ addidx = info->getAdditParam()->isAdditionalParam(uc_token);
+ }
+ if (argno != -1 || addidx != -1) {
+ /* don't assume it is a name if it is also a local variable */
+ int var_idx, var_type;
+ var_find((char*)uc_token.c_str(), &var_idx, &var_type);
+ if (var_idx != -1) {
+ argno = -1;
+ addidx = -1;
+ }
+ }
+ if (argno == -1 && addidx == -1) {
+ if (mustname) {
+ /* all arguments after the first optional one must be named */
+ stringstream err;
+ err << "name expected before optional argument, such as: ";
+ sub->listArgNames(err);
+ throw error(err.str());
+ }
+ /* no argument name given, just assume subsequent argument */
+ argno = argcnt;
+ argcnt++;
+ } else {
+ /* first named argument found */
+ /* from now on, all must be named */
+ mustname = true;
+ /* previous token was just the name, get value */
+ token = m_tokens.next_multilevel_token();
+ }
+ if (argno > maxargpos) {
+ /* compute maximum for 'too many arguments error' */
+ maxargpos = argno;
+ }
+ if (addidx != -1) {
+ info->getAdditParam()->setAdditionalParam(addidx, token, m_tokens.token_pos_col());
+ }
+ if (argno != -1 && argno < np) {
+ if (info->getParamPos(argno) != -1) {
+ /* make sure not to give the same argument twice */
+ stringstream err;
+ err << "two values given for argument '" << sub->getParamNameShort(argno);
+ err << "' of '" << sub->getName() << "'";
+ throw error(err.str());
+ }
+ info->setParam(argno, token, m_tokens.token_pos_col());
+ }
+ if (has_parenthesis) {
+ int token = m_tokens.ensure_next_token_in(",)");
+ if (token == ')') break;
+ }
+ }
+ /* error if too many arguments are given */
+ if (maxargpos >= np) {
+ stringstream err;
+ err << "too many arguments in call to '" << sub->getName() << "': ";
+ err << (maxargpos+1) << " > " << np;
+ throw error(poscol, err.str());
+ }
+ /* fill in default values */
+ bool has_all = true;
+ for (int i = 0; i < np; i++) {
+ if (info->getParamPos(i) == -1) {
+ const string& value = sub->getDefault(i);
+ if (value != "") {
+ info->setParam(i, value, -2); /* 2 indicates default */
+ } else {
+ has_all = false;
+ }
+ }
+ }
+ /* error if some not given */
+ if (!has_all) {
+ int count = 0;
+ stringstream err;
+ err << "insufficient arguments in call to '" << sub->getName() << "': no value for: ";
+ for (int i = 0; i < np; i++) {
+ if (info->getParamPos(i) == -1) {
+ if (count != 0) err << ", ";
+ err << sub->getParamNameShort(i);
+ count++;
+ }
+ }
+ throw error(poscol, err.str());
+ }
+}
+
+void GLEParser::gen_subroutine_call_polish_arg(GLESubCallInfo* info, int i, GLEPcode& pcode) throw(ParserError) {
+ GLESub* sub = info->getSub();
+ try {
+ int vtype = sub->getParamType(i);
+ m_polish->internalPolish(info->getParamVal(i).c_str(), pcode, &vtype);
+ } catch (ParserError& err) {
+ if (info->getParamPos(i) != -2) {
+ /* in place given argument */
+ err.incColumn(info->getParamPos(i)-1);
+ } else {
+ /* default argument */
+ err.setParserString(info->getParamVal(i));
+ }
+ throw err;
+ }
+}
+
+void GLEParser::evaluate_subroutine_arguments(GLESubCallInfo* info, GLEArrayImpl* arguments) {
+ GLESub* sub = info->getSub();
+ int np = sub->getNbParam();
+ arguments->resize(np);
+ GLEPcodeList pcodeList;
+ GLERC<GLEArrayImpl> stk(new GLEArrayImpl());
+ for (int i = 0; i < np; i++) {
+ GLEPcode pcode(&pcodeList);
+ gen_subroutine_call_polish_arg(info, i, pcode);
+ int cp = 0;
+ arguments->set(i, evalGeneric(stk.get(), &pcodeList, (int*)&pcode[0], &cp));
+ }
+}
+
+void GLEParser::gen_subroutine_call_code(GLESubCallInfo* info, GLEPcode& pcode) throw(ParserError) {
+ /* pass all arguments */
+ GLESub* sub = info->getSub();
+ int np = sub->getNbParam();
+ pcode.addInt(PCODE_EXPR); /* Expression follows */
+ int savelen = pcode.size(); /* Used to set acutal length at end */
+ pcode.addInt(0); /* Length of expression */
+ for (int i = 0; i < np; i++) {
+ gen_subroutine_call_polish_arg(info, i, pcode);
+ }
+ pcode.addFunction(sub->getIndex()+LOCAL_START_INDEX);
+ pcode.setInt(savelen, pcode.size() - savelen - 1);
+}
+
+GLESub* GLEParser::get_subroutine_declaration(GLEPcode& pcode) throw(ParserError) {
+ string uc_token;
+ string& token = m_tokens.next_token();
+ str_to_uppercase(token, uc_token);
+ GLESub* sub = sub_find(uc_token);
+ if (sub != NULL) {
+ // Re-declaration: check if number of arguments and argument names are ok
+ vector<int> poss;
+ vector<string> args;
+ while (not_at_end_command()) {
+ token = m_tokens.next_token();
+ str_to_uppercase(token);
+ args.push_back(token);
+ poss.push_back(m_tokens.token_column());
+ }
+ if ((int)args.size() != sub->getNbParam()) {
+ stringstream err;
+ err << "subroutine '" << uc_token << "' number of arguments: ";
+ err << args.size() << " <> " << sub->getNbParam();
+ if (sub->getStart() != -1) {
+ // May be declared from previous run - if QGLE commits changes back to GLE script
+ err << " as declared at: ";
+ getSource()->sourceLineFileAndNumber(sub->getStart()-1, err);
+ }
+ throw error(err.str());
+ }
+ for (int i = 0; i < sub->getNbParam(); i++) {
+ if (!str_i_equals(args[i], sub->getParamName(i))) {
+ stringstream err;
+ err << "subroutine '" << uc_token << "' argument " << (i+1) << ": '";
+ err << args[i] << "' <> '" << sub->getParamName(i) << "'";
+ if (sub->getStart() != -1) {
+ // May be declared from previous run - if QGLE commits changes back to GLE script
+ err << " as declared at: ";
+ getSource()->sourceLineFileAndNumber(sub->getStart()-1, err);
+ }
+ throw error(poss[i], err.str());
+ }
+ }
+ var_set_local_map(sub->getLocalVars());
+ } else {
+ sub = getSubroutines()->add(uc_token);
+ var_set_local_map(sub->getLocalVars());
+ for (int np = 0; not_at_end_command(); np++) {
+ token = m_tokens.next_token();
+ str_to_uppercase(token, uc_token);
+ sub_param(sub, uc_token);
+ if (!valid_var((char*)uc_token.c_str())) {
+ throw error("invalid subroutine parameter");
+ }
+ }
+ }
+ return sub;
+}
+
+void GLEParser::get_subroutine_default_param(GLESub* sub) throw(ParserError) {
+ if (sub == NULL) {
+ return;
+ }
+ /* Find parameter */
+ string uc_token;
+ string& token = m_tokens.next_token();
+ str_to_uppercase(token, uc_token);
+ int idx = sub->findParameter(uc_token);
+ if (idx == -1) {
+ stringstream err;
+ err << "subroutine '" << sub->getName() << "' has no parameter named '" << token << "'";
+ throw m_tokens.error(err.str());
+ }
+ token = m_tokens.next_multilevel_token();
+ sub->setDefault(idx, token);
+}
+
+int GLEParser::get_optional(OPKEY lkey, GLEPcode& pcode) throw(ParserError) {
+ // find the largest width
+ int count, width;
+ get_key_info(lkey, &count, &width);
+ // the location in the pcode tells what option it is, must remember
+ // zero all the optional parameters.
+ // puts zero in for each option wheather it is there or not
+ int plen = pcode.size();
+ for (int i = 0; i < width+1; i++) {
+ pcode.addInt(0);
+ }
+ int ret = -1;
+ while (m_tokens.has_more_tokens()) {
+ string& token = m_tokens.next_token();
+ if (token == ";") {
+ m_tokens.pushback_token();
+ return ret;
+ }
+ bool found = false;
+ for (int i = 0; i < count && !found; i++) {
+ if (str_i_equals(token.c_str(), lkey[i].name)) {
+ ret = get_one_option(&lkey[i], pcode, plen);
+ found = true;
+ }
+ }
+ if (!found) {
+ throw create_option_error(lkey, count, token);
+ }
+ }
+ return ret;
+}
+
+ParserError GLEParser::create_option_error(OPKEY lkey, int count, const string& token) {
+ stringstream strm;
+ if (count == 1) {
+ strm << "found '" << token << "', but expecting '" << lkey[0].name << "'";
+ } else {
+ strm << "found '" << token << "', but expecting one of:";
+ for (int i = 0; i < count; i++) {
+ if (i % 5 == 0) {
+ strm << endl << " ";
+ } else {
+ strm << " ";
+ }
+ strm << lkey[i].name;
+ if (i < count-1) strm << ",";
+ }
+ }
+ return m_tokens.error(strm.str());
+}
+
+void GLEParser::duplicate_error(GLEPcode& pcode, int pos) throw(ParserError) {
+ if (pcode.getInt(pos) != 0) throw error("duplicate or illegal combination of qualifiers");
+}
+
+int GLEParser::get_one_option(op_key* lkey, GLEPcode& pcode, int plen) throw(ParserError) {
+// switches int placed in directly, 1 present, 0 not present
+// expressions LONG* pointed to, 0 if not present.
+// color/fill LONG* Pointer to exp 0 if not present.
+// marker LONG* Pointer to exp 0 if not present.
+// lstyle LONG* Pointer to exp 0 if not present.
+// font int* Pointer to string expression.
+// justify int
+ int pos = plen + lkey->pos - 1;
+ duplicate_error(pcode, pos);
+ switch (lkey->typ) {
+ case typ_val:
+ pcode.setInt(pos, pcode.size() - pos);
+ get_exp(pcode);
+ break;
+ case typ_val2:
+ pcode.setInt(pos, pcode.size() - pos);
+ get_exp(pcode);
+ pos++;
+ duplicate_error(pcode, pos);
+ pcode.setInt(pos, pcode.size() - pos);
+ get_exp(pcode);
+ break;
+ case typ_val4:
+ pcode.setInt(pos, pcode.size() - pos);
+ get_exp(pcode);
+ get_exp(pcode);
+ get_exp(pcode);
+ get_exp(pcode);
+ break;
+ case typ_str:
+ pcode.setInt(pos, pcode.size() - pos);
+ get_strexp(pcode);
+ break;
+ case typ_switch:
+ pcode.setInt(pos, lkey->idx);
+ return lkey->idx;
+ break;
+ case typ_color:
+ case typ_fill:
+ pcode.setInt(pos, pcode.size() - pos);
+ get_fill(pcode);
+ break;
+ case typ_marker:
+ pcode.setInt(pos, pcode.size() - pos);
+ get_marker(pcode);
+ break;
+ case typ_lstyle:
+ pcode.setInt(pos, pcode.size() - pos);
+ get_exp(pcode);
+ break;
+ case typ_justify:
+ pcode.setInt(pos, get_first(op_justify));
+ break;
+ case typ_arrow:
+ pcode.setInt(pos, get_first(op_arrow));
+ break;
+ default :
+ gprint("*** error non existent type ***");
+ break;
+ }
+ return -1;
+}
+
+int GLEParser::get_first(OPKEY lkey) throw(ParserError) {
+ return get_first(m_tokens.next_token(), lkey);
+}
+
+int GLEParser::get_first(const string& token, OPKEY lkey) throw(ParserError) {
+ int count, width;
+ get_key_info(lkey, &count, &width);
+ for (int i = 0; i < count; i++) {
+ if (str_i_equals(token.c_str(), lkey[i].name)) {
+ return lkey[i].idx;
+ }
+ }
+ throw create_option_error(lkey, count, token);
+}
+
+bool GLEParser::try_get_token(const char* token) throw(ParserError) {
+ string& my_token = m_tokens.try_next_token();
+ if (str_i_equals(token, my_token.c_str())) {
+ return true;
+ } else if (my_token != "") {
+ m_tokens.pushback_token();
+ }
+ return false;
+}
+
+void GLEParser::get_token(const char* token) throw(ParserError) {
+ string& my_token = m_tokens.next_token();
+ if (!str_i_equals(token, my_token.c_str())) {
+ throw error(string("expected '")+token+"', but found '"+my_token+"' instead");
+ }
+}
+
+void GLEParser::get_fill(GLEPcode& pcode) throw (ParserError) {
+ get_color(pcode);
+}
+
+bool pass_color_hash_value(const string& color, int* result, IThrowsError* error) {
+ if (color.length() > 1 && color[0] == '#') {
+ if (color.length() != 7) {
+ throw error->throwError("illegal color specification '", color.c_str(), "'");
+ }
+ colortyp c;
+ int err = g_hash_string_to_color(color, &c);
+ if (err != 0) {
+ int pos = error->getErrorPosition() + err;
+ throw error->throwError(pos, string("illegal color specification '") + color + "'");
+ }
+ *result = c.l;
+ return true;
+ } else {
+ return false;
+ }
+}
+
+GLERC<GLEColor> pass_color_list_or_fill(const string& color, IThrowsError* error) {
+ GLERC<GLEColor> result;
+ string uc_color;
+ str_to_uppercase(color, uc_color);
+ GLEColor* gleColor = GLEGetColorList()->get(uc_color);
+ if (gleColor != NULL) {
+ result = gleColor->clone();
+ } else {
+ int fillDescr = 0;
+ if (gt_firstval_err(op_fill_typ, uc_color.c_str(), &fillDescr)) {
+ result = new GLEColor();
+ if (unsigned(fillDescr) == GLE_FILL_CLEAR) {
+ result->setTransparent(true);
+ } else {
+ result->setFill(new GLEPatternFill(fillDescr));
+ }
+ } else {
+ char *endp;
+ const char* colorCStr = color.c_str();
+ double dvalue = strtod(colorCStr, &endp);
+ if (colorCStr != endp && *endp == 0) {
+ result = new GLEColor(dvalue);
+ } else if (error != 0) {
+ throw error->throwError("found '", color.c_str(), "', but expecting color or fill specification");
+ }
+ }
+ }
+ return result;
+}
+
+GLERC<GLEColor> memory_cell_to_color(GLEPolish* polish, GLEArrayImpl* stk, GLEMemoryCell* cell, IThrowsError* throwsError, int depth) {
+ if (depth >= 5) {
+ throwsError->throwError("maximum depth exceeded while parsing color expression");
+ }
+ GLERC<GLEColor> color(new GLEColor());
+ switch (gle_memory_cell_type(cell)) {
+ case GLEObjectTypeDouble:
+ color->setGray(cell->Entry.DoubleVal);
+ break;
+ case GLEObjectTypeString:
+ {
+ int result = 0;
+ std::string token(((GLEString*)cell->Entry.ObjectVal)->toUTF8());
+ if (token.empty()) {
+ throwsError->throwError("expecting color name, but found empty string");
+ } else if (pass_color_hash_value(token, &result, throwsError)) {
+ color->setHexValue(result);
+ } else if (((GLEString*)cell->Entry.ObjectVal)->containsI('(')) {
+ color = memory_cell_to_color(polish, stk, polish->evalGeneric(stk, token.c_str()), throwsError, depth + 1);
+ } else {
+ color = pass_color_list_or_fill(token, throwsError);
+ }
+ break;
+ }
+ default:
+ gle_memory_cell_check(cell, GLEObjectTypeColor);
+ color = (GLEColor*)cell->Entry.ObjectVal;
+ break;
+ }
+ return color;
+}
+
+GLERC<GLEColor> pass_color_var(const std::string& token) throw(ParserError) {
+ GLERC<GLEColor> color(new GLEColor());
+ int result = 0;
+ if (token.empty()) {
+ g_throw_parser_error("expecting color name, but found empty string");
+ } else if (pass_color_hash_value(token, &result, g_get_throws_error())) {
+ color->setHexValue(result);
+ } else {
+ GLEPolish* polish = get_global_polish();
+ GLERC<GLEArrayImpl> stk(new GLEArrayImpl());
+ color = memory_cell_to_color(polish, stk.get(), polish->evalGeneric(stk.get(), token.c_str()), g_get_throws_error(), 0);
+ }
+ return color;
+}
+
+void GLEParser::get_color(GLEPcode& pcode) throw (ParserError) {
+ int result = 0;
+ GLERC<GLEColor> color;
+ string& token = m_tokens.next_token();
+ if (pass_color_hash_value(token, &result, &m_tokens)) {
+ color = new GLEColor();
+ color->setHexValue(result);
+ } else {
+ color = pass_color_list_or_fill(token, 0);
+ }
+ if (color.isNull()) {
+ m_tokens.pushback_token();
+ get_exp(pcode);
+ } else {
+ pcode.addColor(color.get());
+ }
+}
+
+int get_marker_string(const string& marker, IThrowsError* error) {
+ /* if 0, maybe its a user defined marker, ie a subroutine */
+ /* Use -ve to signify subroutine instead of normal marker */
+ int mark_idx = 0;
+ for (int i = 0; i < nmark; i++) {
+ if (str_i_equals(mark_name[i], marker.c_str())) {
+ mark_idx = -(++i);
+ break;
+ }
+ }
+ if (mark_idx == 0) {
+ for (int i = nmrk-1; i >= 0; i--) {
+ if (str_i_equals(mrk_name[i], marker.c_str())) {
+ mark_idx = ++i;
+ break;
+ }
+ }
+ }
+ if (mark_idx == 0) {
+ throw error->throwError("invalid marker name '", marker.c_str(), "'");
+ }
+ return mark_idx;
+}
+
+void GLEParser::get_marker(GLEPcode& pcode) throw (ParserError) {
+ int vtype = 1;
+ string& token = m_tokens.next_token();
+ if (token == "(" || is_float(token)) {
+ string expr = string("CVTINT(")+token+")";
+ polish(expr.c_str(), pcode, &vtype);
+ } else if (str_starts_with(token, "\"") || str_var_valid_name(token)) {
+ string expr = string("CVTMARKER(")+token+")";
+ polish(expr.c_str(), pcode, &vtype);
+ } else {
+ pcode.addInt(8);
+ pcode.addInt(get_marker_string(token, &m_tokens));
+ }
+}
+
+int pass_marker(char *name) throw(ParserError) {
+ string marker;
+ polish_eval_string(name, &marker);
+ return get_marker_string(marker, g_get_throws_error());
+}
+
+void GLEParser::define_marker_1(GLEPcode& pcode) throw (ParserError) {
+ string name;
+ Tokenizer* tokens = getTokens();
+ str_to_uppercase(tokens->next_token(), name);
+ string font = tokens->next_token();
+ int ccc = tokens->next_integer();
+ double sz = tokens->next_double();
+ double dx = tokens->next_double();
+ double dy = tokens->next_double();
+ g_defmarker((char*)name.c_str(), (char*)font.c_str(), ccc, dx, dy, sz, true);
+}
+
+void GLEParser::define_marker_2(GLEPcode& pcode) throw (ParserError) {
+ string name, sub;
+ Tokenizer* tokens = getTokens();
+ tokens->ensure_next_token_i("marker");
+ str_to_uppercase(tokens->next_token(), name);
+ str_to_uppercase(tokens->next_token(), sub);
+ g_marker_def((char*)name.c_str(), (char*)sub.c_str());
+}
+
+
+/*
+
+ Data types:
+
+ - fill
+ - color
+ - marker
+ - font
+ - justify
+ - join
+ - cap
+
+*/
+
+int get_font_index(const string& token, IThrowsError* error) {
+ if (get_nb_fonts() == 0) font_load();
+ int count = get_nb_fonts();
+ // font zero is a dummy!
+ for (int i = 1; i < count; i++) {
+ const char* name = get_font_name(i);
+ if (str_i_equals(name, token.c_str())) {
+ return i;
+ }
+ }
+ stringstream strm;
+ strm << "invalid font name {" << token << "}, expecting one of:";
+ int idx = 0;
+ for (int i = 1; i < count; i++) {
+ if (idx % 5 == 0) {
+ strm << endl << " ";
+ } else {
+ strm << " ";
+ }
+ if (get_font_name(i) != NULL) {
+ strm << get_font_name(i);
+ bool has_more = false;
+ for (int j = i+1; j < count; j++) {
+ if (get_font_name(j) != NULL) {
+ has_more = true;
+ break;
+ }
+ }
+ if (has_more) strm << ",";
+ idx++;
+ }
+ }
+ throw error->throwError(strm.str());
+}
+
+void GLEParser::get_font(GLEPcode& pcode) throw (ParserError) {
+ string& token = m_tokens.next_token();
+ if (str_starts_with(token, "\"") || str_var_valid_name(token)) {
+ int etype = 1;
+ string parse("CVTFONT(" + token + ")");
+ polish(parse.c_str(), pcode, &etype);
+ return;
+ }
+ pcode.addInt(8);
+ pcode.addInt(get_font_index(token, &m_tokens));
+}
+
+int pass_font(const std::string& token) {
+ if (str_starts_with(token, "\"") || str_var_valid_name(token)) {
+ int result = 0;
+ double xx = 0.0;
+ string parse("CVTFONT(" + token + ")");
+ polish_eval((char*)parse.c_str(), &xx);
+ memcpy(&result, &xx, sizeof(int));
+ return result;
+ } else {
+ return get_font_index(token, g_get_throws_error());
+ }
+}
+
+void GLEParser::get_papersize(GLEPcode& pcode) throw (ParserError) {
+ const string& token = m_tokens.next_token();
+ int type = g_papersize_type(token);
+ if (type == GLE_PAPER_UNKNOWN) {
+ m_tokens.pushback_token();
+ pcode.addInt(0);
+ get_xy(pcode);
+ } else {
+ pcode.addInt(1);
+ pcode.addInt(type);
+ }
+}
+
+void GLEParser::get_justify(GLEPcode& pcode) throw (ParserError) {
+ const string& token = m_tokens.next_token();
+ if (str_starts_with(token, "\"") || str_var_valid_name(token)) {
+ int etype = 1;
+ string parse("JUSTIFY(" + token + ")");
+ polish(parse.c_str(), pcode, &etype);
+ return;
+ }
+ pcode.addInt(8);
+ pcode.addInt(get_first(token, op_justify));
+}
+
+int pass_justify(const std::string& token) {
+ if (str_starts_with(token, "\"") || str_var_valid_name(token)) {
+ int result = 0;
+ double xx = 0.0;
+ string parse("JUSTIFY(" + token + ")");
+ polish_eval((char*)parse.c_str(), &xx);
+ memcpy(&result, &xx, sizeof(int));
+ return result;
+ }
+ return gt_firstval(op_justify, token.c_str());
+}
+
+void GLEParser::get_join(GLEPcode& pcode) throw (ParserError) {
+ pcode.addInt(get_first(op_join));
+}
+
+void GLEParser::get_cap(GLEPcode& pcode) throw (ParserError) {
+ pcode.addInt(get_first(op_cap));
+}
+
+void GLEParser::get_var_add(int *var, int *vtype) throw (ParserError) {
+ string uc_token;
+ string& token = m_tokens.next_token();
+ str_to_uppercase(token, uc_token);
+ var_findadd((char*)uc_token.c_str(), var, vtype);
+}
+
+void GLEParser::get_var(GLEPcode& pcode) throw (ParserError) {
+ int var;
+ int vtype = 0;
+ get_var_add(&var, &vtype);
+ pcode.addInt(var);
+}
+
+bool GLEParser::not_at_end_command() {
+ string& token = m_tokens.try_next_token();
+ if (token == "") return false;
+ if (token == ";") {
+ m_tokens.pushback_token();
+ return false;
+ }
+ m_tokens.pushback_token();
+ return true;
+}
+
+bool GLEParser::test_not_at_end_command() {
+ string& token = m_tokens.try_next_token();
+ if (token == "") return false;
+ if (token == ";") return false;
+ m_tokens.pushback_token();
+ return true;
+}
+
+GLESub* GLEParser::is_draw_sub(const string& str) {
+ string subname;
+ string::size_type i = str.find('.');
+ if (i != string::npos) {
+ subname = str.substr(0, i);
+ } else {
+ subname = str;
+ }
+ str_to_uppercase(subname);
+ return sub_find((char*)subname.c_str());
+}
+
+bool GLEParser::pass_block_specific(GLESourceLine& sourceLine, GLEPcode& pcode) {
+ for (int i = m_blocks.size() - 1; i >= 0; i--) {
+ GLESourceBlock* block = &m_blocks[i];
+ GLEBlockBase* blockType = getBlockTypes()->getBlockIfExists(block->getType() - GLE_SRCBLK_MAGIC);
+ if (blockType != 0) {
+ if (blockType->checkLine(sourceLine)) {
+ int pos_start = pcode.size();
+ pcode.addInt(0);
+ pcode.addInt(GLE_KW_BLOCK_COMMAND);
+ pcode.addInt(block->getType() - GLE_SRCBLK_MAGIC);
+ pcode.setInt(pos_start, pcode.size()-pos_start);
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+void GLEParser::passt(GLESourceLine &SLine, GLEPcode& pcode) throw(ParserError) {
+ resetSpecial();
+ static int i,f,vtyp,v,vidx;
+ int srclin = SLine.getGlobalLineNo();
+ this_line = srclin;
+ int fctkey;
+ int nbcmd = 0;
+ int position;
+ GLESourceBlock* block = last_block();
+ string first, temp_str;
+ if (cur_mode != 0) {
+ do_text_mode(SLine, getTokens(), pcode);
+ return;
+ }
+ setAllowSpace(false);
+ bool single_cmd = false;
+ Tokenizer* tokens = getTokens();
+ if (block != 0) {
+ if (m_auto_endif) {
+ // Allow for "IF test THEN code" blocks without "END IF"
+ if (block->getType() == GLE_SRCBLK_MAGIC+GLE_OPBEGIN_IF) {
+ string& token = tokens->try_next_token();
+ if (str_i_equals(token, "ELSE")) m_auto_endif = false;
+ if (token != "") tokens->pushback_token();
+ } else if (block->getType() != GLE_SRCBLK_ELSE) {
+ m_auto_endif = false;
+ }
+ if (m_auto_endif) {
+ m_auto_endif = false;
+ do_endif(srclin, pcode);
+ }
+ }
+ if (pass_block_specific(SLine, pcode)) {
+ return;
+ }
+ }
+ int pos_start = pcode.size();
+ while (tokens->has_more_tokens()) {
+ int vtype = 0;
+ int etype = 1;
+ bool allow_extra_tokens = false;
+ int pos_endoffs = pcode.size();
+ pcode.addInt(0); // save space for end offset
+ str_to_uppercase(tokens->next_token(), first);
+ int pos_first = tokens->token_pos_col();
+ find_mkey((char*)first.c_str(), &fctkey);
+ // cout << "first = " << first << " idx = " << fctkey << endl;
+ if (fctkey == 0) {
+ if (first == "@") {
+ pcode.addInt(52);
+ get_subroutine_call(pcode);
+ } else if (first == "LOCAL") {
+ // Declaration of local variable
+ if (!has_local_var_map()) {
+ throw error("can't define a local variable outside of sub");
+ }
+ // Get variable name
+ str_to_uppercase(tokens->next_token(), temp_str);
+ checkValidName(temp_str, "variable", tokens->token_pos_col());
+ pcode.addInt(51);
+ var_add_local((char*)temp_str.c_str(),&vidx,&vtype);
+ pcode.addInt(vidx);
+ // Immediately assign a value to it
+ if (tokens->is_next_token("=")) {
+ polish_eol(pcode, &vtype);
+ } else {
+ // Or assign the value of zero to it
+ if (vtype == 1) pcode.addDoubleExpression(0);
+ else pcode.addStringExpression("");
+ // And possibly define more local variables in one go
+ while (tokens->is_next_token(",")) {
+ str_to_uppercase(tokens->next_token(), temp_str);
+ checkValidName(temp_str, "variable", tokens->token_pos_col());
+ pcode.addInt(51);
+ var_add_local((char*)temp_str.c_str(),&vidx,&vtype);
+ pcode.addInt(vidx);
+ if (vtype == 1) pcode.addDoubleExpression(0);
+ else pcode.addStringExpression("");
+ }
+ }
+ } else if (tokens->is_next_token("=")) {
+ // Variable assignment
+ checkValidName(first, "variable", pos_first);
+ pcode.addInt(51);
+ var_findadd((char*)first.c_str(),&vidx,&vtype);
+ pcode.addInt(vidx);
+ polish_eol(pcode, &vtype);
+ } else {
+ /* call subroutine without @ sign */
+ pcode.addInt(52);
+ get_subroutine_call(pcode, &first, pos_first);
+ }
+ } else {
+ pcode.addInt(fctkey);
+ switch (fctkey) {
+ case 65: /* PSCOMMENT */
+ temp_str = m_tokens.read_line();
+ str_remove_quote(temp_str);
+ pcode.addStringNoID(temp_str);
+ break;
+ case 66: /* BB_TWEAK */
+ break;
+ case 1: /* ALINE */
+ get_xy(pcode);
+ get_optional(op_line, pcode);
+ break;
+ case 2: /* AMOVE */
+ get_xy(pcode);
+ break;
+ case GLE_KW_ABOUND:
+ get_xy(pcode);
+ break;
+ case 73: /* ASETPOS */
+ case 81: /* RSETPOS */
+ get_xy(pcode);
+ break;
+ case 3: /* ARC r a1 a2 */
+ get_exp(pcode);
+ get_xy(pcode);
+ get_optional(op_arc, pcode);
+ break;
+ case 4: /* ARCTO x1 y1 x2 y2 r */
+ get_xy(pcode);
+ get_xy(pcode);
+ get_exp(pcode);
+ break;
+ case 5: /* BEGIN "PATH" "BOX" "SCALE" "ROTATE" "TRANSLATE" "SHEAR" "GRAPH" ... */
+ single_cmd = true;
+ f = get_first(op_begin);
+ pcode.addInt(f);
+ /*------------------------------------------*/
+ /* Check if begin variable matches */
+ /*------------------------------------------*/
+ switch (f) {
+ case 1: /* path */
+ get_optional(op_begin_path, pcode);
+ break;
+ case 2: /* box */
+ get_optional(op_begin_box, pcode);
+ break;
+ case 3: /* scale */
+ get_xy(pcode);
+ get_optional(op_begin_scale, pcode);
+ break;
+ case 21: /* shear */
+ get_xy(pcode);
+ get_optional(op_begin_scale, pcode);
+ break;
+ case 4: /* rotate */
+ get_exp(pcode);
+ get_optional(op_begin_scale, pcode);
+ break;
+ case 5: /* translate */
+ get_xy(pcode);
+ get_optional(op_begin_scale, pcode);
+ break;
+ case 19: /* clip */
+ case 17: /* origin */
+ break;
+ case 6: /* if */
+ case 7: /* sub */
+ throw error("not a valid begin option");
+ break;
+ case 8: /* name joe */
+ get_strexp(pcode);
+ get_optional(op_begin_name, pcode);
+ break;
+ case 9: /* text */
+ cur_mode = 9;
+ get_optional(op_begin_text, pcode);
+ break;
+ case 10: /* graph */
+ break;
+ case 11: /* xaxis */
+ cur_mode = 11;
+ break;
+ case 12: /* yaxis */
+ cur_mode = 12;
+ break;
+ case 13: /* x2axis */
+ cur_mode = 13;
+ break;
+ case 14: /* y2axis */
+ cur_mode = 14;
+ break;
+ case 15: /* curve */
+ break;
+ case 18: /* table */
+ cur_mode = 18;
+ break;
+ case 22: /* config */
+ cur_mode = 22;
+ get_strexp(pcode);
+ break;
+ case 23: /* tex preamble */
+ cur_mode = 23;
+ break;
+ case 25: /* letz */
+ cur_mode = 25;
+ break;
+ case 26: /* fitz */
+ cur_mode = 26;
+ break;
+ case 27: /* fit */
+ cur_mode = 27;
+ break;
+ case 28: /* contour */
+ cur_mode = 28;
+ break;
+ case 29: /* tex */
+ cur_mode = 29;
+ get_optional(op_tex, pcode);
+ break;
+ case OP_BEGIN_OBJECT:
+ if (isInSub()) {
+ m_CrSub = getSubroutines()->add(m_CrSub);
+ pcode.addInt(0);
+ pcode.addInt(m_CrSub->getIndex());
+ get_strexp(pcode); /* name for object */
+ } else {
+ setInSub(true);
+ m_CrSub = get_subroutine_declaration(pcode);
+ m_CrSub->setIsObject(true);
+ pcode.addInt(1);
+ pcode.addInt(m_CrSub->getIndex());
+ }
+ break;
+ case OP_BEGIN_LENGTH:
+ get_var(pcode);
+ break;
+ }
+ /* here should copy source line across for "begin width 3 */
+ if (cur_mode>0) pcode.addInt(0);
+ else add_block(GLE_SRCBLK_MAGIC+f, srclin);
+ break;
+ case 6: /* BEZIER x1 y1 x2 y2 x3 y3 */
+ get_xy(pcode);
+ get_xy(pcode);
+ get_xy(pcode);
+ break;
+ case 7 : /* box x y [left | center | right] [fill xxx] name*/
+ get_xy(pcode);
+ get_optional(op_box, pcode);
+ break;
+ case 52: /* call subroutine */
+ get_subroutine_call(pcode);
+ break;
+ case 8 : /* circle rad fill */
+ get_exp(pcode);
+ get_optional(op_circle, pcode);
+ break;
+ case 70 : /* ellipse major minor fill */
+ get_xy(pcode);
+ get_optional(op_circle, pcode);
+ break;
+ case 71 : /* elliptical_arc major minor a1 a2 fill */
+ get_xy(pcode);
+ get_xy(pcode);
+ get_optional(op_arc, pcode);
+ break;
+ case 72 : /* elliptical_narc major minor a1 a2 fill */
+ get_xy(pcode);
+ get_xy(pcode);
+ get_optional(op_arc, pcode);
+ break;
+ case 9 : /* closepath */
+ break;
+ case GLE_KW_COMMENT: /* comment ! or blank line */
+ break;
+ case 10 : /* curve sx sy x y x y x y ... ex ey */
+ while (not_at_end_command()) {
+ pcode.addInt(111);
+ get_xy(pcode);
+ }
+ pcode.addInt(999);
+ break;
+ case 60 : /* defmarker xyz rm 33 1 -.4 -.2 */
+ define_marker_1(pcode);
+ break;
+ case GLE_KW_DEFCOLOR:
+ pcode.setLast(GLE_KW_COMMENT);
+ temp_str = m_tokens.next_token();
+ str_remove_quote(temp_str);
+ {
+ GLERC<GLEColor> color(pass_color_var(m_tokens.next_token().c_str()));
+ GLEGetColorList()->defineColor(temp_str, color.get());
+ }
+ break;
+ case GLE_KW_COMPATIBILITY:
+ pcode.setLast(GLE_KW_COMMENT);
+ temp_str = m_tokens.next_token();
+ g_set_compatibility(temp_str);
+ if (g_get_compatibility() < GLE_COMPAT_MOST_RECENT) {
+ setSpecial(GLE_PARSER_INCLUDE);
+ setInclude(string("compatibility.gle"));
+ }
+ break;
+ case 11 : /* define marker jj subname */
+ define_marker_2(pcode);
+ break;
+ case 12 :
+ pcode.addStringNoID(SLine.getCode());
+ break;
+ case 13 :/* ELSE ... */
+ if (nbcmd > 0) {
+ throw error(pos_first, "command must be the first command on the line");
+ }
+ block = check_block_type(pos_first, GLE_SRCBLK_ELSE, GLE_SRCBLK_MAGIC+GLE_OPBEGIN_IF, -1);
+ if (try_get_token("IF")) {
+ add_else_block_update(srclin, pcode, pos_start, true);
+ pcode.setInt(pos_endoffs, pcode.size()-pos_start);
+ pos_endoffs = pcode.size();
+ pcode.addInt(0);
+ pcode.addInt(22);
+ parse_if(srclin, pcode);
+ allow_extra_tokens = true;
+ } else if (tokens->has_more_tokens()) {
+ add_else_block_update(srclin, pcode, pos_start, false);
+ m_auto_endif = true;
+ allow_extra_tokens = true;
+ } else {
+ pcode.setInt(block->getOffset2(), srclin+1);
+ add_else_block(srclin, pcode, false);
+ }
+ break;
+ case 14 : /* END if, sub, path, box, scale, translate, rotate */
+ single_cmd = true;
+ i = get_optional(op_begin, pcode);
+ if (i == 0) throw error("type of 'end' missing, e.g. end if, end sub");
+ if (i == GLE_OPBEGIN_IF) {
+ check_block_type(pos_first, GLE_SRCBLK_MAGIC+i, GLE_SRCBLK_MAGIC+i, GLE_SRCBLK_ELSE);
+ do_endif(srclin+1, pcode);
+ } else {
+ block = check_block_type(pos_first, GLE_SRCBLK_MAGIC+i, GLE_SRCBLK_MAGIC+i, -1);
+ if (i == GLE_OPBEGIN_SUB || i == OP_BEGIN_OBJECT) {
+ if (!isInSub() || m_CrSub == NULL) {
+ throw error("'end sub' without corresponding 'sub [name]'");
+ }
+ m_CrSub->setStartEnd(block->getFirstLine(), srclin);
+ do_endsub(srclin, pcode);
+ if (m_CrSub->getParentSub() == NULL) {
+ /* subroutine or static object */
+ var_clear_local();
+ setInSub(false);
+ }
+ m_CrSub = m_CrSub->getParentSub();
+ } else if (i == GLE_OPBEGIN_BOX) {
+ pcode.addInt(block->getFirstLine());
+ }
+ remove_last_block();
+ }
+ break;
+ case 16 : /* FILL (fillpath) */
+ break;
+ case 15 : /* FCLOSE inchan */
+ get_exp(pcode);
+ break;
+ case 17: /* fopen "a.a" inchan read|write */
+ get_strexp(pcode);
+ get_var_add(&v,&vtyp);
+ pcode.addInt(v);
+ if (try_get_token("WRITE")) {
+ pcode.addInt(1);
+ } else {
+ get_token("READ");
+ pcode.addInt(0);
+ }
+ break;
+ case 61 : /* fread CHAN a$ x */
+ case 62 : /* freadln */
+ while (not_at_end_command()) {
+ get_var_add(&v, &vtyp);
+ pcode.addInt(49);
+ pcode.addInt(v);
+ pcode.addInt(vtyp);
+ }
+ break;
+ case 63 : /* fwrite */
+ case 64 : /* fwriteln */
+ while (not_at_end_command()) {
+ pcode.addInt(49);
+ position = pcode.size();
+ pcode.addInt(0);
+ pcode.setInt(position, get_anyexp(pcode));
+ }
+ break;
+ case 75 : /* fgetline */
+ get_exp(pcode);
+ get_var_add(&v, &vtyp);
+ pcode.addInt(v);
+ break;
+ case 76 : /* ftokenizer chan commenttoks spacetoks singlechartoks */
+ get_exp(pcode);
+ get_strexp(pcode);
+ get_strexp(pcode);
+ get_strexp(pcode);
+ break;
+ case 77: /* papersize */
+ get_papersize(pcode);
+ break;
+ case 78: /* margins */
+ get_xy(pcode);
+ get_xy(pcode);
+ break;
+ case 79: /* orientation */
+ pcode.addInt(get_first(op_orientation));
+ break;
+ case 18 : /* for var = exp1 to exp2 [step exp3] */
+ /* create new for block */
+ block = add_block(GLE_SRCBLK_FOR, srclin);
+ get_var_add(&v, &vtyp);
+ block->setVariable(v);
+ /* translate first part of FOR into variable assignment */
+ pcode.setInt(pcode.size()-1, 51);
+ pcode.addInt(v);
+ get_token("=");
+ get_exp(pcode);
+ pcode.setInt(pos_endoffs, pcode.size()-pos_start);
+ /* now add real FOR, jump by next should go to this location */
+ pos_endoffs = pcode.size();
+ block->setOffset1(pos_endoffs-pos_start);
+ pcode.addInt(0);
+ pcode.addInt(18); /* opcode FOR */
+ pcode.addInt(v);
+ block->setOffset2(pcode.size());
+ pcode.addInt(0);
+ get_token("TO");
+ get_exp(pcode);
+ get_optional(op_for_step, pcode);
+ break;
+ case 19 :/* goto */
+ throw error("GOTO is considered bad programming practice :-)");
+ break;
+ case 20 : /* gsave */
+ break;
+ case 54 : /* grestore */
+ break;
+ case 21 : /* icon x y */
+ get_xy(pcode);
+ break;
+ case 22 : /* IF exp THEN ... */
+ if (nbcmd > 0) {
+ // Do not move to parse_if (the latter is also used for "else if")
+ throw error(pos_first, "command must be the first command on the line");
+ }
+ parse_if(srclin, pcode);
+ if (tokens->has_more_tokens()) {
+ m_auto_endif = true;
+ allow_extra_tokens = true;
+ }
+ break;
+ case 55 : /* POSTCRIPT file$ width height */
+ get_strexp(pcode);
+ get_xy(pcode);
+ break;
+ //
+ // -- no need to ifdef these as
+ //
+ case 67 : /* TIFF file$ width height */
+ printf("\nWarning: TIFF is deprecated: use BITMAP instead\n");
+ get_strexp(pcode);
+ get_xy(pcode);
+ get_optional(op_bitmap, pcode);
+ break;
+ case 68 : /* BITMAP file width height [type colors compress dpi greyscale resize] */
+ get_strexp(pcode);
+ get_xy(pcode);
+ get_optional(op_bitmap, pcode);
+ break;
+ case 69 : /* BITMAP_INFO file width, height [type] */
+ get_strexp(pcode);
+ get_var(pcode);
+ get_var(pcode);
+ get_optional(op_bitmap_info, pcode);
+ break;
+ case GLE_KW_COLORMAP:
+ get_strexp(pcode); // function
+ get_xy(pcode); // xrange
+ get_xy(pcode); // yrange
+ get_xy(pcode); // bitmap size
+ get_xy(pcode); // screen size
+ get_optional(op_colormap, pcode);
+ break;
+ case 56 : /* draw a previously defined object */
+ {
+ temp_str = tokens->next_token();
+ GLESub* sub = is_draw_sub(temp_str);
+ tokens->pushback_token();
+ if (sub != NULL) {
+ /* name of object = subroutine -> static call */
+ pcode.addInt(0);
+ get_strexp(pcode);
+ GLESubCallInfo info(sub);
+ GLESubCallAdditParam addit;
+ info.setAdditParam(&addit);
+ pass_subroutine_call(&info, tokens->token_pos_col());
+ vtyp = 2;
+ if (addit.getVal() == "") polish_pos("\"\"", 0, pcode, &vtyp);
+ else polish_pos(addit.getVal(), addit.getPos(), pcode, &vtyp);
+ gen_subroutine_call_code(&info, pcode);
+ } else {
+ /* call to object defined by variable */
+ pcode.addInt(1);
+ get_strexp(pcode);
+ get_optional(op_draw, pcode);
+ }
+ }
+ break;
+ case 23 : /* include "string" */
+ pcode.setLast(GLE_KW_COMMENT);
+ if (m_tokens.is_next_token("[")) {
+ /* include [0-4.0.12] "somefile.gle" */
+ /* support for compatibility mode */
+ temp_str = tokens->next_token();
+ int from = g_parse_compatibility(temp_str);
+ m_tokens.ensure_next_token("-");
+ temp_str = tokens->next_token();
+ int to = g_parse_compatibility(temp_str);
+ m_tokens.ensure_next_token("]");
+ temp_str = tokens->next_token();
+ if (g_get_compatibility() >= from && g_get_compatibility() <= to) {
+ setSpecial(GLE_PARSER_INCLUDE);
+ str_remove_quote(temp_str);
+ setInclude(temp_str);
+ }
+ } else {
+ setSpecial(GLE_PARSER_INCLUDE);
+ temp_str = tokens->next_token();
+ str_remove_quote(temp_str);
+ setInclude(temp_str);
+ }
+ break;
+ case 58 : /* bigfile "string" This waits until 'run' to read the file*/
+ get_strexp(pcode);
+ break;
+ case 24 : /* input 1 a$=20,fill$=10,j=6 prompt "Age and name " */
+ /* input 1 a$,yval prompt "Age and name " */
+ case 25 : /* join a.tl->b.br , string, arrows&line, string */
+ get_strexp(pcode);
+ pcode.addInt(get_first(op_joinname));
+ get_strexp(pcode);
+ get_optional(op_curve, pcode);
+ break;
+ case 26 : /* marker square [2.2] */
+ get_marker(pcode);
+ if (not_at_end_command()) {
+ get_exp(pcode);
+ } else {
+ pcode.addInt(0);
+ }
+ break;
+ case 27 : /* MOVE name */
+ get_strexp(pcode);
+ break;
+ case 28 : /* narc, Arc in clockwise direction */
+ get_exp(pcode);
+ get_xy(pcode);
+ get_optional(op_arc, pcode);
+ break;
+ case 29 : /* newpath */
+ break;
+ case 30 : /* next */
+ single_cmd = true;
+ if (not_at_end_command()) {
+ block = check_block_type(pos_first, GLE_SRCBLK_NEXT, GLE_SRCBLK_FOR, -1);
+ get_var_add(&v, &vtyp);
+ check_loop_variable(v);
+ } else {
+ block = check_block_type(pos_first, GLE_SRCBLK_NEXT, GLE_SRCBLK_WHILE, GLE_SRCBLK_UNTIL);
+ }
+ /* Set jump address */
+ pcode.addInt(block->getFirstLine());
+ pcode.addInt(block->getOffset1());
+ /* Update address in first line @ getOffset2() */
+ pcode.setInt(block->getOffset2(), srclin);
+ /* And remove block from stack */
+ remove_last_block();
+ break;
+ case 31 : /* pie r a1 a2 fill pattern */
+ get_exp(pcode);
+ get_xy(pcode);
+ get_optional(op_fill, pcode);
+ break;
+ case 33 :
+ get_xy(pcode);
+ get_xy(pcode);
+ get_xy(pcode);
+ break;
+ case 34 : /* region */
+ throw error("REGION is not yet implemented");
+ break;
+ case 50 : /* Return EXP */
+ if (not_at_end_command()) {
+ get_exp_eol(pcode);
+ } else {
+ etype=1;
+ polish("0", pcode, &etype);
+ }
+ if (tokens->has_more_tokens()) {
+ throw error(pos_first, "return should be the last command on a line");
+ }
+ block = find_block(GLE_SRCBLK_MAGIC+GLE_OPBEGIN_SUB);
+ if (block == NULL) {
+ throw error(pos_first, "return outside of subroutine");
+ }
+ block = block->addDependendBlock(GLE_SRCBLK_RETURN, srclin);
+ block->setOffset2(pcode.size());
+ pcode.addInt(0);
+ break;
+ case 35 : /* Reverse the current path */
+ break;
+ case 36 : /* rline */
+ get_xy(pcode);
+ get_optional(op_line, pcode);
+ break;
+ case 37 : /* rmove */
+ get_xy(pcode);
+ break;
+ case 38 : /* rotate */
+ get_exp(pcode);
+ break;
+ case 39 : /* save joe */
+ get_strexp(pcode);
+ break;
+ case 40: /* scale x y */
+ get_xy(pcode);
+ break;
+ case 41: /* SET color font hei just lwidth lstyle ldist */
+ while (not_at_end_command()) {
+ f = get_first(op_set);
+ pcode.addInt(500+f);
+ switch (f) {
+ case 1: /* height */
+ get_exp(pcode);
+ break;
+ case 2: /* font */
+ get_font(pcode);
+ break;
+ case 3: /* justify */
+ get_justify(pcode);
+ break;
+ case 4: /* color */
+ case OP_SET_BACKGROUND:
+ case OP_SET_FILL:
+ case OP_SET_FILL_PATTERN:
+ get_color(pcode);
+ break;
+ case 5: /* dashlen */
+ get_exp(pcode);
+ break;
+ case 6: /* dash */
+ get_exp(pcode);
+ break;
+ case 7: /* lwidth */
+ get_exp(pcode);
+ break;
+ case 8: /* join */
+ /* get_join(); */
+ get_join(pcode);
+ break;
+ case 9: /* cap */
+ /* get_cap(); */
+ get_cap(pcode);
+ break;
+ case 10: /* fontlwidth */
+ get_exp(pcode);
+ break;
+ case OP_SET_FILL_METHOD:
+ case OP_SET_ARROW_STYLE:
+ case OP_SET_ARROW_TIP:
+ case OP_SET_IMAGE_FORMAT:
+ case OP_SET_TEX_SCALE:
+ get_strexp(pcode);
+ break;
+ case OP_SET_TEX_LABELS:
+ get_exp(pcode);
+ break;
+ case OP_SET_ARROW_SIZE:
+ case OP_SET_ARROW_ANGLE:
+ case OP_SET_TITLE_SCALE:
+ case OP_SET_ATITLE_SCALE:
+ case OP_SET_ALABEL_SCALE:
+ case OP_SET_TICKS_SCALE:
+ case OP_SET_ATITLE_DIST:
+ case OP_SET_ALABEL_DIST:
+ get_exp(pcode);
+ break;
+ }
+ }
+ break;
+ case 42 : /* size */
+ get_xy(pcode);
+ get_optional(op_size, pcode);
+ break;
+ case 43 : /* STROKE */
+ break;
+ case 44 : /* SUB JOE X Y$ Z ... END SUB */
+ single_cmd = true;
+ if (isInSub()) {
+ throw error("can't define a subroutine within a sub ");
+ }
+ setInSub(true);
+ m_CrSub = get_subroutine_declaration(pcode);
+ pcode.addInt(m_CrSub->getIndex());
+ add_block(GLE_SRCBLK_MAGIC+GLE_OPBEGIN_SUB, srclin);
+ break;
+ case GLE_KW_DECLARESUB:
+ pcode.setLast(GLE_KW_COMMENT);
+ m_tokens.ensure_next_token_i("SUB");
+ m_CrSub = get_subroutine_declaration(pcode);
+ m_CrSub->setStart(srclin);
+ var_clear_local();
+ break;
+ case GLE_KW_DEFAULT:
+ pcode.setLast(GLE_KW_COMMENT);
+ get_subroutine_default_param(m_CrSub);
+ break;
+ case 45 : /* text */
+ temp_str = m_tokens.read_line();
+ pcode.addStringNoID(temp_str);
+ break;
+ case 59 : /* textdef */
+ temp_str = m_tokens.read_line();
+ pcode.addStringNoID(temp_str);
+ break;
+ case 46 : /* translate x y */
+ get_xy(pcode);
+ break;
+ case 47 : /* until */
+ single_cmd = true;
+ get_exp_eol(pcode);
+ block = add_block(GLE_SRCBLK_UNTIL, srclin);
+ block->setOffset2(pcode.size());
+ pcode.addInt(0);
+ break;
+ case 48 : /* while */
+ single_cmd = true;
+ get_exp_eol(pcode);
+ block = add_block(GLE_SRCBLK_WHILE, srclin);
+ block->setOffset2(pcode.size());
+ pcode.addInt(0);
+ break;
+ case 32 : /* print numexp,strexp,strexp */
+ case 49 : /* write numexp,strexp,strexp */
+ while (not_at_end_command()) {
+ pcode.addInt(fctkey);
+ position = pcode.size();
+ pcode.addInt(0);
+ pcode.setInt(position, get_anyexp(pcode));
+ }
+ break;
+ case 74 : /* tex */
+ get_strexp(pcode);
+ get_optional(op_tex, pcode);
+ break;
+ case GLE_KW_RESTOREDEFAULTS:
+ break;
+ case GLE_KW_SLEEP:
+ get_exp(pcode);
+ break;
+ default:
+ throw error("unrecognised command {"+first+"}");
+ }
+ }
+ if (!allow_extra_tokens && test_not_at_end_command()) {
+ temp_str = tokens->read_line();
+ throw error(string("extra tokens after command '")+first+"': '"+temp_str+"'");
+ }
+ pcode.setInt(pos_endoffs, pcode.size()-pos_start);
+ nbcmd++;
+ if (nbcmd > 1 && single_cmd) {
+ throw error(pos_first, "command must occur on a separate line");
+ }
+ }
+}
+
+void GLEParser::do_text_mode(GLESourceLine &SLine, Tokenizer* tokens, GLEPcode& pcode) throw (ParserError) {
+ int pos_endoffs = pcode.size();
+ // Save space for end offset
+ pcode.addInt(0);
+ pcode.addInt(5);
+ string str = tokens->read_line();
+ // Handle comment symbol '!' at start of line
+ if (str.length() > 0 && str[0] == '!') {
+ str = "";
+ }
+ str_replace_start(str, "\\!", "!");
+ // Check for end of block
+ int pos = str_starts_with_trim(str, "END");
+ if (pos != -1) {
+ int len = str.length();
+ string second_token = str.substr(pos, len-pos);
+ str_trim_both(second_token);
+ int idx = gt_index(op_begin, (char*)second_token.c_str());
+ if (idx == cur_mode) {
+ pcode.addInt(0);
+ cur_mode = 0;
+ return;
+ }
+ }
+ // Add string to the block
+ pcode.addInt(cur_mode);
+ pcode.addStringNoID(str);
+ pcode.setInt(pos_endoffs, pcode.size()-pos_endoffs);
+}
+
+GLESourceBlock* GLEParser::add_else_block(int srclin, GLEPcode& pcode, bool dangling) {
+ remove_last_block();
+ GLESourceBlock* block = add_block(GLE_SRCBLK_ELSE, srclin);
+ block->setOffset2(pcode.size());
+ block->setDangling(dangling);
+ pcode.addInt(0);
+ pcode.addInt(0);
+ return block;
+}
+
+GLESourceBlock* GLEParser::add_else_block_update(int srclin, GLEPcode& pcode, int start_offs, bool dangling) {
+ GLESourceBlock* if_block = last_block();
+ int offs = if_block->getOffset2();
+ GLESourceBlock* else_block = add_else_block(srclin, pcode, dangling);
+ pcode.setInt(offs, srclin);
+ pcode.setInt(offs+1, pcode.size()-start_offs);
+ return else_block;
+}
+
+void GLEParser::do_endif(int srclin, GLEPcode& pcode) {
+ GLESourceBlock* block = last_block();
+ pcode.setInt(block->getOffset2(), srclin);
+ remove_last_block();
+ block = last_block();
+ while (block != NULL && block->isDanglingElse()) {
+ pcode.setInt(block->getOffset2(), srclin);
+ remove_last_block();
+ block = last_block();
+ }
+}
+
+void GLEParser::do_endsub(int srclin, GLEPcode& pcode) {
+ GLESourceBlock* block = last_block();
+ int nb = block->getNbDependendingBlocks();
+ for (int i = 0; i < nb; i++) {
+ GLESourceBlock* dep = block->getDependingBlock(i);
+ pcode.setInt(dep->getOffset2(), srclin);
+ }
+}
+
+GLESourceBlock* GLEParser::find_block(int type) {
+ int last = m_blocks.size()-1;
+ while (last >= 0 && m_blocks[last].getType() != type) {
+ last--;
+ }
+ return last >= 0 ? &m_blocks[last] : NULL;
+}
+
+GLESourceBlock* GLEParser::add_block(int type, int first_line) {
+ m_blocks.push_back(GLESourceBlock(type, first_line));
+ return &m_blocks.back();
+}
+
+GLESourceBlock* GLEParser::last_block() {
+ return m_blocks.size() > 0 ? &m_blocks.back() : NULL;
+}
+
+void GLEParser::remove_last_block() {
+ m_blocks.pop_back();
+}
+
+void GLEParser::check_loop_variable(int var) throw (ParserError) {
+ GLESourceBlock* block = last_block();
+ if (block == NULL || var != block->getVariable()) {
+ stringstream err;
+ err << "illegal variable '" << var_get_name(var);
+ err << "': loop variable is '" << var_get_name(block->getVariable()) << "'";
+ throw error(err.str());
+ }
+}
+
+GLESourceBlock* GLEParser::check_block_type(int pos, int t0, int t1, int t2) throw (ParserError) {
+ GLESourceBlock* block = last_block();
+ if (block == NULL) {
+ stringstream err;
+ const char* end_t0 = GLESourceBlockEndName(t0);
+ if (end_t0 != NULL) err << end_t0 << " ";
+ err << "'" << GLESourceBlockName(t0) << "' without corresponding ";
+ const char* begin_t1 = GLESourceBlockBeginName(t1);
+ if (begin_t1 != NULL) err << begin_t1 << " ";
+ err << "'" << GLESourceBlockName(t1) << "'";
+ if (t2 != -1) {
+ err << " or ";
+ const char* begin_t2 = GLESourceBlockBeginName(t2);
+ if (begin_t2 != NULL) err << begin_t2 << " ";
+ err << "'" << GLESourceBlockName(t2) << "'";
+ }
+ throw error(pos, err.str());
+ }
+ if (block->getType() != t1 && block->getType() != t2) {
+ stringstream err;
+ err << "unterminated '" << block->getName() << "'";
+ err << " " << block->getKindName();
+ err << " (starting on line " << block->getFirstLine() << ") before ";
+ const char* end_name = GLESourceBlockEndName(t0);
+ if (end_name != NULL) err << end_name << " ";
+ err << "'" << GLESourceBlockName(t0) << "'";
+ throw error(pos, err.str());
+ }
+ return block;
+}
+
+GLESubMap* GLEParser::getSubroutines() {
+ return &g_Subroutines;
+}
+
+GLESourceBlock::GLESourceBlock(int type, int first_line) {
+ m_block_type = type;
+ m_first_line = first_line;
+ m_variable = -1;
+ m_pcode_offs1 = 0;
+ m_pcode_offs2 = 0;
+ m_dangling = false;
+ m_deps = NULL;
+}
+
+GLESourceBlock::GLESourceBlock(const GLESourceBlock& block) {
+ m_block_type = block.m_block_type;
+ m_first_line = block.m_first_line;
+ m_variable = block.m_variable;
+ m_pcode_offs1 = block.m_pcode_offs1;
+ m_pcode_offs2 = block.m_pcode_offs2;
+ m_dangling = block.m_dangling;
+ m_deps = NULL;
+ if (block.m_deps != NULL) {
+ int size = block.m_deps->size();
+ m_deps = new vector<GLESourceBlock>();
+ for (int i = 0; i < size; i++) {
+ m_deps->push_back((*block.m_deps)[i]);
+ }
+ }
+}
+
+GLESourceBlock::~GLESourceBlock() {
+ if (m_deps != NULL) delete m_deps;
+}
+
+GLESourceBlock* GLESourceBlock::addDependendBlock(int type, int first_line) {
+ if (m_deps == NULL) m_deps = new vector<GLESourceBlock>();
+ m_deps->push_back(GLESourceBlock(type, first_line));
+ return &m_deps->back();
+}
+
+int GLESourceBlock::getNbDependendingBlocks() {
+ return m_deps != NULL ? m_deps->size() : 0;
+}
+
+const char* GLESourceBlock::getName() {
+ return GLESourceBlockName(m_block_type);
+}
+
+const char* GLESourceBlock::getKindName() {
+ switch (m_block_type) {
+ case GLE_SRCBLK_UNTIL:
+ case GLE_SRCBLK_WHILE:
+ case GLE_SRCBLK_FOR:
+ return "loop";
+ default:
+ return "block";
+ }
+}
+
+const char* GLESourceBlockEndName(int type) {
+ switch (type) {
+ case GLE_SRCBLK_NEXT:
+ case GLE_SRCBLK_ELSE:
+ return NULL;
+ default:
+ return "end";
+ }
+}
+
+const char* GLESourceBlockBeginName(int type) {
+ switch (type) {
+ case GLE_SRCBLK_FOR:
+ case GLE_SRCBLK_UNTIL:
+ case GLE_SRCBLK_WHILE:
+ case GLE_SRCBLK_ELSE:
+ case GLE_SRCBLK_MAGIC+GLE_OPBEGIN_IF:
+ return NULL;
+ default:
+ return "begin";
+ }
+}
+
+const char* GLESourceBlockName(int type) {
+ if (type > GLE_SRCBLK_MAGIC) {
+ int count, width;
+ get_key_info(op_begin, &count, &width);
+ for (int i = 0; i < count; i++) {
+ if (int(op_begin[i].idx) == type - GLE_SRCBLK_MAGIC) return op_begin[i].name;
+ }
+ }
+ switch (type) {
+ case GLE_SRCBLK_UNTIL: return "until";
+ case GLE_SRCBLK_WHILE: return "while";
+ case GLE_SRCBLK_FOR: return "for";
+ case GLE_SRCBLK_NEXT: return "next";
+ case GLE_SRCBLK_ELSE: return "else";
+ default: return "unknown";
+ }
+}
+
+void gt_find_error(const char* found, OPKEY lkey, int nk) {
+ stringstream ss;
+ ss << "found '" << found << "', but expecting one of:" << endl;
+ ss << "\t";
+ for (int i=0; i<nk; i++) {
+ ss << lkey[i].name;
+ if (i != nk-1) ss << ", ";
+ if ((i+1) % 3 == 0) ss << endl << "\t";
+ }
+ if (nk % 3 != 0) ss << endl;
+ g_throw_parser_error(ss.str());
+}
+
+int gt_first(OPKEY lkey, int *curtok, TOKENS tk, int *ntok, int *pcode, int *plen) {
+ int nk,i,width=0,p;
+ for (i=0; lkey[i].typ!=typ_end; i++) {
+ p = lkey[i].pos;
+ if (p>width) width = p ;
+ }
+ nk = i;
+ for (i=0; i<nk; i++) {
+ if (str_i_equals(lkey[i].name,tok(*curtok))) {
+ (*curtok)++;
+ return lkey[i].idx;
+ }
+ }
+ gt_find_error(tok(*curtok), lkey, nk);
+ (*curtok)++;
+ return 0;
+}
+
+bool gt_firstval_err(OPKEY lkey, const char *s, int* result) {
+ for (int i=0; lkey[i].typ!=typ_end; i++) {
+ if (str_i_equals(lkey[i].name,s)) {
+ *result = lkey[i].idx;
+ return true;
+ }
+ }
+ return false;
+}
+
+int gt_firstval(OPKEY lkey, const char *s) {
+ int nk = 0;
+ for (int i=0; lkey[i].typ!=typ_end; i++) {
+ if (str_i_equals(lkey[i].name,s)) {
+ return lkey[i].idx;
+ }
+ nk++;
+ }
+ gt_find_error(s, lkey, nk);
+ return 0;
+}
+
+int gt_index(OPKEY lkey,char *s) {
+ for (int i = 0; lkey[i].typ!=typ_end; i++) {
+ if (str_i_equals(lkey[i].name,s)) {
+ return lkey[i].idx;
+ }
+ }
+ return 0;
+}
+
+#undef get_first
+#define get_first(key) gt_first(key,curtok,tk,ntok,pcode,plen)
+
+void mystrcpy(char **d, const char *s) {
+ if (*d!=0) myfree(*d);
+ *d = 0;
+ *d = (char*) myallocz(strlen(s)+1);
+ strcpy(*d,s);
+}
+
+#undef get_exp
+#define get_exp() polish(tok((*curtok)++),(char *) pcode,plen,&etype)
+
+/* pos= Offset to find the data */
+/* idx= For switches, which can only have one value. */
+
+struct mark_struct { const char *name; const char *font; int cc; double rx; double ry; double scl; bool center;};
+
+struct mark_struct stdmark_v35[] = {
+ { "DOT", "RM", 46,-.125,-.0435,3.0,false }, /* dot */
+ { "CROSS", "TEXSY", 2,-.375,-.24,1.0, false }, /* cross */
+ { "FCIRCLE", "GLEMARK", 8,-.5,-.5,0.7, false }, /* fcircle */
+ { "FSQUARE", "GLEMARK", 5,-.5,-.5,0.7, false }, /* fsquare */
+ { "FTRIANGLE","GLEMARK", 2,-.5,-.433,0.7, false }, /* ftriangle */
+ { "FDIAMOND", "GLEMARK", 11,-.5,-.5,0.7, false }, /* fdiamond */
+ { "CIRCLE", "GLEMARK", 7,-.5,-.5,0.7, false }, /* circle */
+ { "SQUARE", "GLEMARK", 4,-.5,-.5,0.7, false }, /* square */
+ { "TRIANGLE", "GLEMARK", 1,-.5,-.433,0.7, false }, /* triangle */
+ { "DIAMOND", "GLEMARK", 10,-.5,-.5,0.7, false }, /* diamond */
+ { "PLUS", "TEXCMR", 43,-.375,-.24,1.0, false }, /* plus, fixed */
+ { "CLUB", "TEXSY", 124,-.38,-.3,1.0, false }, /* club */
+ { "HEART", "TEXSY", 126,-.38,-.34,1.0, false }, /* heart */
+ { "DIAMONDZ", "TEXSY", 125,-.38,-.26,1.0, false }, /* diamondz */
+ { "SPADE", "TEXSY", 127,-.375,-.24,1.0, false }, /* spade (needs fixing) */
+ { "STAR", "TEXMI", 63,-.25,-.21,1.0, false }, /* star */
+ { "SNAKE", "TEXSY", 120,-.21,-.22,1.0, false }, /* snake */
+ { "DAG", "TEXSY", 121,-.21,-.22,1.0, false }, /* dag */
+ { "DDAG", "TEXSY", 122,-.21,-.22,1.0, false }, /* dagg */
+ { "ASTERIX", "TEXSY", 3,-.25,-.24,1.0, false }, /* asterix */
+ { "ASTERISK", "TEXSY", 3,-.25,-.24,1.0, false }, /* asterix */
+ { "OPLUS", "TEXSY", 8,-.40,-.24,1.0, false }, /* oplus */
+ { "OMINUS", "TEXSY", 9,-.40,-.24,1.0, false }, /* ominus */
+ { "OTIMES", "TEXSY", 10,-.40,-.24,1.0, false }, /* otimes */
+ { "ODOT", "TEXSY", 12,-.40,-.24,1.0, false }, /* odot */
+ { "TRIANGLEZ","TEXSY", 52,-.44,-.26,1.0, false }, /* trianglez */
+ { "DIAMONDZ", "TEXSY", 125,-.38,-.26,1.0, false }, /* diamondz */
+ { "WCIRCLE", "GLEMARK", 9,-.5,-.5,0.7, false }, /* wcircle */
+ { "WTRIANGLE","GLEMARK", 3,-.5,-.433,0.7, false }, /* wtriangle */
+ { "WSQUARE", "GLEMARK", 6,-.5,-.5,0.7, false }, /* wsquare */
+ { "WDIAMOND", "GLEMARK", 12,-.5,-.5,0.7, false }, /* wdiamond */
+ { "PLANE", "PSZD", 40,0.0,0.0,1.0, false }, /* ZapDingbats */
+ { "HANDPEN", "PSZD", 45,0.0,0.0,1.0, false }, /* ZapDingbats */
+ { "SCIRCLE", "PSZD", 109,0.0,0.0,1.0, false }, /* ZapDingbats */
+ { "SSQUARE", "PSZD", 111,0.0,0.0,1.0, false }, /* ZapDingbats */
+ { "PHONE", "PSZD", 37,0.0,0.0,1.0, false }, /* ZapDingbats */
+ { "LETTER", "PSZD", 41,0.0,0.0,1.0, false }, /* ZapDingbats */
+ { "STAR2", "PSZD", 69,0.0,0.0,1.0, false }, /* ZapDingbats */
+ { "STAR3", "PSZD", 79,0.0,0.0,1.0, false }, /* ZapDingbats */
+ { "STAR4", "PSZD", 98,0.0,0.0,1.0, false }, /* ZapDingbats */
+ { "FLOWER", "PSZD", 96,0.0,0.0,1.0, false }, /* ZapDingbats */
+ { NULL, NULL, 0,0,0,0, false }
+};
+
+struct mark_struct stdmark[] = {
+ { "ASTERISK", "TEXSY", 3,0,0.0,1.67, true }, /* asterisk */
+ { "ASTERIX", "TEXSY", 3,0,0.0,1.67, true }, /* asterisk (for compatibility) */
+ { "CIRCLE", "GLEMARK", 7,-0.5,-0.5,0.7, false }, /* circle */
+ { "CLUB", "PSZD", 168,0,0,1.0, true }, /* club */
+ { "CROSS", "GLEMARK", 13,-0.5,-0.5,0.7, false }, /* cross */
+ { "DAG", "TEXSY", 121,0,0.005,0.78, true }, /* dag */
+ { "DDAG", "TEXSY", 122,0,0,0.79, true }, /* dagg */
+ { "DIAMOND", "GLEMARK", 10,-0.5,-0.5,0.7, false }, /* diamond */
+ { "DIAMONDZ", "TEXSY", 125,0,0,0.81, true }, /* diamondz */
+ { "DOT", "GLEMARK", 8,-0.5,-0.5,0.3325, false }, /* dot */
+ { "FCIRCLE", "GLEMARK", 8,-0.5,-0.5,0.7, false }, /* fcircle */
+ { "FDIAMOND", "GLEMARK", 11,-0.5,-0.5,0.7, false }, /* fdiamond */
+ { "FLOWER", "PSZD", 96,0,0.03,0.97, true }, /* ZapDingbats */
+ { "FSQUARE", "GLEMARK", 5,-0.5,-0.5,0.7, false }, /* fsquare */
+ { "FTRIANGLE","GLEMARK", 2,-0.5,-0.35,0.7, false }, /* ftriangle */
+ { "HANDPEN", "PSZD", 45,0,0,0.91, true }, /* ZapDingbats */
+ { "HEART", "TEXSY", 126,0,-0.06,0.96, true }, /* heart */
+ { "LETTER", "PSZD", 41,0,0,1.15, true }, /* ZapDingbats */
+ { "MINUS", "GLEMARK", 15,-0.5,-0.5,0.7, false }, /* minus */
+ { "ODOT", "TEXSY", 12,0,0,1.07, true }, /* odot */
+ { "OMINUS", "TEXSY", 9,0,0,1.07, true }, /* ominus */
+ { "OPLUS", "TEXSY", 8,0,0,1.07, true }, /* oplus */
+ { "OTIMES", "TEXSY", 10,0,0,1.07, true }, /* otimes */
+ { "PHONE", "PSZD", 37,0,0,1.11, true }, /* ZapDingbats */
+ { "PLANE", "PSZD", 40,0,0,1.0, true }, /* ZapDingbats */
+ { "PLUS", "GLEMARK", 14,-0.5,-0.5,0.7, false }, /* plus */
+ { "SCIRCLE", "PSZD", 109,0,0,0.90, true }, /* ZapDingbats */
+ { "SNAKE", "TEXSY", 120,0,0,0.785, true }, /* snake */
+ { "SPADE", "PSZD", 171,0,0,1.0, true }, /* spade */
+ { "SQUARE", "GLEMARK", 4,-0.5,-0.5,0.7, false }, /* square */
+ { "SSQUARE", "PSZD", 111,0,0,1.0, true }, /* ZapDingbats */
+ { "STAR", "TEXMI", 63,0,0.03,1.5, true }, /* star */
+ { "STAR2", "PSZD", 69,0,0,1.0, true }, /* ZapDingbats */
+ { "STAR3", "PSZD", 79,0,0.04,1.0, true }, /* ZapDingbats */
+ { "STAR4", "PSZD", 98,0,0,1.0, true }, /* ZapDingbats */
+ { "TRIANGLE", "GLEMARK", 1,-0.5,-0.35,0.7, false }, /* triangle */
+ { "TRIANGLEZ","TEXSY", 52,0,0,1.0, true }, /* trianglez */
+ { "WCIRCLE", "GLEMARK", 9,-0.5,-0.5,0.7, false }, /* wcircle */
+ { "WTRIANGLE","GLEMARK", 3,-0.5,-0.35,0.7, false }, /* wtriangle */
+ { "WSQUARE", "GLEMARK", 6,-0.5,-0.5,0.7, false }, /* wsquare */
+ { "WDIAMOND", "GLEMARK", 12,-0.5,-0.5,0.7, false }, /* wdiamond */
+ { NULL, NULL, 0,0,0,0, false }
+}; /* change range check below when adding markers */
+
+/*
+GLEMARK
+1 Triangle
+2 Filled Triangle
+3 White Triangle
+4 Square
+5 Filled Square
+6 White Square
+7 Circle
+8 Filled Circle
+9 White Circle
+10 Diamond
+11 Filled Diamond
+12 White Diamond
+13 Cross
+14 Plus
+15 Minus
+*/
+
+void mark_clear(void) {
+ for (int i = 0; i < nmark; i++) {
+ if (mark_sub[i] != NULL) { myfree(mark_sub[i]); mark_sub[i] = NULL; }
+ if (mark_name[i] != NULL) { myfree(mark_name[i]); mark_name[i] = NULL; }
+ }
+ for (int i = 0; i < nmrk; i++) {
+ if (mrk_name[i] != NULL) { myfree(mrk_name[i]); mrk_name[i] = NULL; }
+ if (mrk_fname[i] != NULL) { myfree(mrk_fname[i]); mrk_fname[i] = NULL; }
+ }
+ nmrk = 0;
+ nmark = 0;
+ struct mark_struct *p;
+ if (g_get_compatibility() <= GLE_COMPAT_35) {
+ for (int i = 0; stdmark_v35[i].name != NULL; i++) {
+ p = &stdmark_v35[i];
+ bool fg = (p->rx == 0);
+ g_defmarker(p->name,p->font,p->cc,p->rx,p->ry,p->scl,fg);
+ }
+ } else {
+ for (int i = 0; stdmark[i].name !=NULL; i++) {
+ p = &stdmark[i];
+ g_defmarker(p->name,p->font,p->cc,p->rx,p->ry,p->scl,stdmark[i].center);
+ }
+ }
+}
+
+void pass_file_name(const char* name, string& file) {
+ // Support operations on strings, but make sure it also works with unquoted strings containing "/" chars
+ if (str_contains(name, '"') || str_contains(name, '$') || str_contains(name, '+')) {
+ polish_eval_string(name, &file);
+ } else {
+ file = name;
+ }
+}
+
+void set_global_parser(GLEParser* parser) {
+ g_parser = parser;
+}
+
+GLEParser* get_global_parser() {
+ return g_parser;
+}
+
+GLEPolish* get_global_polish() {
+ return g_parser != NULL ? g_parser->getPolish() : NULL;
+}
diff --git a/src/gle/pass.h b/src/gle/pass.h
new file mode 100644
index 0000000..0445aae
--- /dev/null
+++ b/src/gle/pass.h
@@ -0,0 +1,254 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#ifndef INCLUDE_PASS
+#define INCLUDE_PASS
+
+//typedef struct op_key* OPKEY;
+typedef struct op_key OPKEY[];
+
+#define GLE_PARSER_NONE 0
+#define GLE_PARSER_INCLUDE 1
+
+#define GLE_SRCBLK_UNTIL 0
+#define GLE_SRCBLK_WHILE 1
+#define GLE_SRCBLK_FOR 2
+#define GLE_SRCBLK_NEXT 3
+#define GLE_SRCBLK_ELSE 4
+#define GLE_SRCBLK_RETURN 5
+#define GLE_SRCBLK_MAGIC 100
+
+#define GLE_OPBEGIN_IF 6
+#define GLE_OPBEGIN_SUB 7
+#define GLE_OPBEGIN_BOX 2
+#define GLE_OPBEGIN_GRAPH 10
+#define GLE_OPBEGIN_KEY 16
+#define GLE_OPBEGIN_SURF 24
+
+class GLESubMap;
+
+void GLEParserInitTokenizer(Tokenizer* tokens);
+
+class GLESourceBlock {
+protected:
+ int m_block_type;
+ int m_variable;
+ int m_first_line;
+ int m_pcode_offs1; /* jump address */
+ int m_pcode_offs2; /* fill in address */
+ bool m_dangling;
+ vector<GLESourceBlock>* m_deps;
+public:
+ GLESourceBlock(int type, int first_line);
+ GLESourceBlock(const GLESourceBlock& block);
+ ~GLESourceBlock();
+ const char* getName();
+ const char* getKindName();
+ GLESourceBlock* addDependendBlock(int type, int first_line);
+ int getNbDependendingBlocks();
+ inline int getFirstLine() { return m_first_line; }
+ inline int getType() { return m_block_type; }
+ inline void setVariable(int var) { m_variable = var; }
+ inline int getVariable() { return m_variable; }
+ inline int getOffset1() { return m_pcode_offs1; }
+ inline int getOffset2() { return m_pcode_offs2; }
+ inline void setOffset1(int offs) { m_pcode_offs1 = offs; }
+ inline void setOffset2(int offs) { m_pcode_offs2 = offs; }
+ inline bool isDangling() { return m_dangling; }
+ inline void setDangling(int yes) { m_dangling = yes; }
+ inline bool isDanglingElse() { return m_dangling && m_block_type == GLE_SRCBLK_ELSE; }
+ inline GLESourceBlock* getDependingBlock(int i) { return &(*m_deps)[i]; }
+};
+
+const char* GLESourceBlockName(int type);
+const char* GLESourceBlockEndName(int type);
+const char* GLESourceBlockBeginName(int type);
+
+class GLESubCallAdditParam {
+/* current implementation just for "name" option of draw command */
+/* later: implement for all common options, such as color, lwidth, ... */
+protected:
+ string m_Val;
+ int m_Pos;
+public:
+ GLESubCallAdditParam();
+ ~GLESubCallAdditParam();
+ int isAdditionalParam(const string& str);
+ void setAdditionalParam(int idx, const string& val, int pos);
+ inline const string& getVal() { return m_Val; }
+ inline int getPos() { return m_Pos; }
+};
+
+class GLESubCallInfo {
+protected:
+ vector<string> m_ParamVal;
+ vector<int> m_ParamPos;
+ GLESubCallAdditParam* m_Addit;
+ GLESub* m_Sub;
+public:
+ GLESubCallInfo(GLESub* sub);
+ ~GLESubCallInfo();
+ void setParam(int i, const string& val, int pos);
+ inline int getParamPos(int i) { return m_ParamPos[i]; }
+ inline const string& getParamVal(int i) { return m_ParamVal[i]; }
+ inline void setAdditParam(GLESubCallAdditParam* addit) { m_Addit = addit; }
+ inline GLESubCallAdditParam* getAdditParam() { return m_Addit; }
+ inline GLESub* getSub() { return m_Sub; }
+};
+
+class GLEBlocks;
+
+class GLEParser {
+protected:
+ GLEScript* m_Script;
+ TokenizerLanguage m_lang;
+ StringTokenizer m_tokens;
+ GLEPolish* m_polish;
+ GLESub* m_CrSub;
+ GLEBlocks* m_blockTypes;
+ string m_include;
+ int m_special;
+ bool m_auto_endif;
+ bool m_insub;
+ vector<GLESourceBlock> m_blocks;
+public:
+ GLEParser(GLEScript* script, GLEPolish* polish);
+ ~GLEParser();
+ GLEBlocks* getBlockTypes();
+ void initTokenizer();
+ double evalTokenToDouble() throw(ParserError);
+ void evalTokenToString(string* str) throw(ParserError);
+ void evalTokenToFileName(string* str) throw(ParserError);
+ bool pass_block_specific(GLESourceLine& sourceLine, GLEPcode& pcode);
+ void passt(GLESourceLine &SLine, GLEPcode& pcode) throw(ParserError);
+ void polish_eol(GLEPcode& pcode, int *rtype) throw(ParserError);
+ void polish(GLEPcode& pcode, int *rtype) throw(ParserError);
+ void polish(const char* str, GLEPcode& pcode, int *rtype) throw(ParserError);
+ void polish_pos(const string& arg, int pos, GLEPcode& pcode, int* rtype) throw(ParserError);
+ void get_var(GLEPcode& pcode) throw (ParserError);
+ void get_xy(GLEPcode& pcode) throw(ParserError);
+ void get_exp(GLEPcode& pcode) throw(ParserError);
+ void get_exp_eol(GLEPcode& pcode) throw(ParserError);
+ void get_strexp(GLEPcode& pcode) throw(ParserError);
+ int get_anyexp(GLEPcode& pcode) throw(ParserError);
+ void pass_subroutine_call(GLESubCallInfo* info, int poscol) throw(ParserError);
+ void gen_subroutine_call_code(GLESubCallInfo* info, GLEPcode& pcode) throw(ParserError);
+ void gen_subroutine_call_polish_arg(GLESubCallInfo* info, int i, GLEPcode& pcode) throw(ParserError);
+ void evaluate_subroutine_arguments(GLESubCallInfo* info, GLEArrayImpl* arguments);
+ void get_subroutine_call(GLEPcode& pcode, string* name = NULL, int poscol = 0) throw(ParserError);
+ GLESub* get_subroutine_declaration(GLEPcode& pcode) throw(ParserError);
+ void get_subroutine_default_param(GLESub* sub) throw(ParserError);
+ void get_if(GLEPcode& pcode) throw(ParserError);
+ void parse_if(int srclin, GLEPcode& pcode) throw(ParserError);
+ GLESourceBlock* add_else_block(int srclin, GLEPcode& pcode, bool dangling);
+ GLESourceBlock* add_else_block_update(int srclin, GLEPcode& pcode, int start_offs, bool dangling);
+ void do_endif(int srclin, GLEPcode& pcode);
+ void do_endsub(int srclin, GLEPcode& pcode);
+ int get_optional(OPKEY lkey, GLEPcode& pcode) throw(ParserError);
+ int get_first(OPKEY lkey) throw(ParserError);
+ int get_first(const string& token, OPKEY lkey) throw(ParserError);
+ void get_token(const char* token) throw(ParserError);
+ bool try_get_token(const char* token) throw(ParserError);
+ void get_fill(GLEPcode& pcode) throw (ParserError);
+ void get_marker(GLEPcode& pcode) throw (ParserError);
+ void get_var_add(int *var, int *vtype) throw (ParserError);
+ int pass_marker(const string& marker) throw (ParserError);
+ void define_marker_1(GLEPcode& pcode) throw (ParserError);
+ void define_marker_2(GLEPcode& pcode) throw (ParserError);
+ void get_font(GLEPcode& pcode) throw (ParserError);
+ void get_justify(GLEPcode& pcode) throw (ParserError);
+ void get_color(GLEPcode& pcode) throw (ParserError);
+ void get_join(GLEPcode& pcode) throw (ParserError);
+ void get_cap(GLEPcode& pcode) throw (ParserError);
+ void get_papersize(GLEPcode& pcode) throw (ParserError);
+ void do_text_mode(GLESourceLine &SLine, Tokenizer* tokens, GLEPcode& pcode) throw (ParserError);
+ void checkmode() throw(ParserError);
+ void get_block_type(int type, string& result);
+ ParserError create_option_error(OPKEY lkey, int count, const string& token);
+ int get_one_option(op_key* lkey, GLEPcode& pcode, int plen) throw(ParserError);
+ void duplicate_error(GLEPcode& pcode, int pos) throw(ParserError);
+ void checkValidName(const string& name, const char* type, int pos) throw(ParserError);
+ void setAllowSpace(bool allow);
+ bool not_at_end_command();
+ bool test_not_at_end_command();
+ GLESub* is_draw_sub(const string& str);
+ GLESourceBlock* add_block(int type, int first_line);
+ GLESourceBlock* last_block();
+ GLESourceBlock* find_block(int type);
+ void remove_last_block();
+ void check_loop_variable(int var) throw (ParserError);
+ GLESourceBlock* check_block_type(int pos, int t0, int t1, int t2) throw (ParserError);
+ GLESubMap* getSubroutines();
+ inline Tokenizer* getTokens() { return &m_tokens; }
+ inline GLEPolish* getPolish() { return m_polish; }
+ inline void setString(const char* str) { m_tokens.set_string(str); }
+ inline void resetSpecial() { m_special = GLE_PARSER_NONE; }
+ inline bool hasSpecial(int special) { return (m_special & special) != 0; }
+ inline void setSpecial(int special) { m_special |= special; }
+ inline const string& getInclude() { return m_include; }
+ inline void setInclude(const string& name) { m_include = name; }
+ inline bool isInSub() { return m_insub; }
+ inline void setInSub(bool insub) { m_insub = insub; }
+ inline ParserError error(const string& src) const {
+ return m_tokens.error(src);
+ };
+ inline ParserError error(int column, const string& src) const {
+ return m_tokens.error(column, src);
+ };
+ inline GLEScript* getScript() { return m_Script; }
+ inline GLEGlobalSource* getSource() { return m_Script->getSource(); }
+};
+
+int gt_firstval(OPKEY lkey, const char *s);
+bool gt_firstval_err(OPKEY lkey, const char *s, int* result);
+int gt_index(OPKEY lkey,char *s);
+int pass_justify(const std::string& s);
+int pass_marker(char *s) throw(ParserError);
+void mark_clear(void);
+void pass_checkmode(void);
+void spop(int v);
+void spush(int v);
+void scheck(int v);
+//
+// used in utils
+//
+
+void set_global_parser(GLEParser* parser);
+GLEParser* get_global_parser();
+
+#endif
diff --git a/src/gle/polish.cpp b/src/gle/polish.cpp
new file mode 100644
index 0000000..7b95ded
--- /dev/null
+++ b/src/gle/polish.cpp
@@ -0,0 +1,674 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+char *un_quote();
+const char *ns[3] = {"nothing", "number", "string"};
+extern int gle_debug;
+
+/*---------------------------------------------------------------------------*/
+
+#include "all.h"
+#include "mem_limits.h"
+#include "token.h"
+#include "gle-interface/gle-interface.h"
+#include "glearray.h"
+#include "polish.h"
+#include "pass.h"
+#include "var.h"
+#include "sub.h"
+#include "gprint.h"
+#include "cutils.h"
+#include "keyword.h"
+#include "run.h"
+#include "fn.h"
+
+/*---------------------------------------------------------------------------*/
+/* bin = 10..29, binstr = 30..49, fn= 60...139, userfn=LOCAL_START_INDEX..nnn */
+#define stack_bin(i,p) stack_op(pcode, stk, stkp, &nstk, i + BINARY_OPERATOR_OFFSET, p + curpri)
+#define stack_fn(i) stack_op(pcode, stk, stkp, &nstk, i + FN_BUILTIN_MAGIC, 10 + curpri)
+#define dbg if ((gle_debug & 4)>0)
+
+// #define dbg
+
+/*---------------------------------------------------------------------------*/
+/* Input is token array, and pointer to current point, output is pcode */
+
+void stack_op(GLEPcode& pcode, int stk[], int stkp[], int *nstk, int i, int p);
+bool valid_unquoted_string(const string& str);
+
+GLEPolish::GLEPolish() : m_lang(), m_tokens(&m_lang, false) {
+ m_vars = NULL;
+}
+
+GLEPolish::~GLEPolish() {
+}
+
+void GLEPolish::initTokenizer() {
+ TokenizerLanguage* lang = m_tokens.get_language();
+ lang->setSpaceTokens(" \t\r\n");
+ lang->setLineCommentTokens("!");
+ lang->setSingleCharTokens(",.:;[]{}()+-*/=<>|^%\\");
+ lang->setDecimalDot('.');
+ lang->addSubLanguages(1);
+ lang->addLanguageElem(0, "<=");
+ lang->addLanguageElem(0, ">=");
+ lang->addLanguageElem(0, "<>");
+ lang->addLanguageElem(0, "**");
+ m_tokens.select_language(0);
+}
+
+void GLEPolish::get_array_index(GLEPcode& pcode) throw(ParserError) {
+ int vtype = 1;
+ internalPolish(pcode, &vtype);
+ m_tokens.ensure_next_token("]");
+}
+
+void GLEPolish::get_params(GLEPcode& pcode, int np, int* plist, const string& name) throw(ParserError) {
+ int nb_param = 0;
+ if (!m_tokens.is_next_token(")")) {
+ while (true) {
+ if (nb_param >= np) {
+ char err_str[100];
+ sprintf(err_str, "': found >= %d, expected %d", nb_param+1, np);
+ throw error(string("too many parameters in call to '")+name+err_str);
+ }
+ int vtype = *(plist + nb_param);
+ internalPolish(pcode, &vtype);
+ int next_token = m_tokens.is_next_token_in(",)");
+ if (next_token == -1) {
+ throw error(string("expecting ',' or ')' in parameter list of function '")+name+"'");
+ }
+ nb_param++;
+ if (next_token == ')') break;
+ }
+ }
+ if (nb_param != np) {
+ char err_str[100];
+ sprintf(err_str, "': found %d, expected %d", nb_param, np);
+ throw error(string("incorrect number of parameters in call to '")+name+err_str);
+ }
+}
+
+void GLEPolish::polish(const char *expr, GLEPcode& pcode, int *rtype) throw(ParserError) {
+ try {
+ internalPolish(expr, pcode, rtype);
+ } catch (ParserError& err) {
+ err.setParserString(expr);
+ throw err;
+ }
+}
+
+void GLEPolish::internalPolish(const char *expr, GLEPcode& pcode, int *rtype) throw(ParserError) {
+ #ifdef DEBUG_POLISH
+ gprint("==== Start of expression {%s} \n",expr);
+ #endif
+ m_tokens.set_string(expr);
+ internalPolish(pcode, rtype);
+}
+
+void GLEPolish::internalPolish(GLEPcode& pcode, int *rtype) throw(ParserError) {
+ GLESub* sub;
+ string uc_token;
+ int idx, ret, np, *plist, term_bracket = false;
+ int curpri = 0;
+ int nstk = 0, stk[50], stkp[50]; /* stack for operators */
+ int unary = 1; /* binary or unary operation expected */
+ bool isa_string = false;
+ bool not_string = false;
+ if (*rtype==1) not_string = true;
+ if (*rtype>0) term_bracket = true;
+ pcode.addInt(PCODE_EXPR); /* Expression follows */
+ int savelen = pcode.size(); /* Used to set acutal length at end */
+ pcode.addInt(0); /* Length of expression */
+ while (true) {
+ string token = m_tokens.try_next_token();
+ int token_col = m_tokens.token_pos_col();
+ int token_len = token.length();
+ char first_char = token_len > 0 ? token[0] : ' ';
+ // cout << "Token: '" << token << "'" << endl;
+ // end of stream, or found ',' or ')'
+ if (token_len == 0 || (token_len == 1 && (first_char == ',' || (first_char == ')' && curpri == 0) || (first_char == ']' && curpri == 0)))) {
+ if (token_len != 0) {
+ m_tokens.pushback_token();
+ }
+ *rtype = 0;
+ dbg gprint("Found END OF EXPRESSION \n");
+ if (curpri != 0) {
+ throw error("unexpected end of expression, missing closing ')' or ']'");
+ }
+ /* Pop everything off the stack */
+ for (int i = nstk; i > 0; i--) {
+ dbg gprint("Adding left over operators I = %d op=%d \n",i,stk[i]);
+ pcode.addInt(stk[i]);
+ }
+ if (unary == 1) {
+ throw error("constant, function, or unary operator expected");
+ }
+ pcode.setInt(savelen, pcode.size() - savelen - 1);
+ #ifdef DEBUG_POLISH
+ pcode.show(savelen);
+ #endif
+ return;
+ }
+ dbg gprint("First word token via (1=unary %d) cts {%s}\n ", unary, token.c_str());
+ switch (unary) {
+ case 1: /* a unary operator, or function, or number or variable */
+ if (is_float(token)) {
+ dbg gprint("Found number {%s}\n",token.c_str());
+ double value = atof(token.c_str());
+ pcode.addDouble(value);
+ unary = 2;
+ break;
+ }
+ str_to_uppercase(token, uc_token);
+ /* NOT a number, is it a built in function? */
+ find_un((char*)uc_token.c_str(), &idx, &ret, &np, &plist);
+ /* 1,2 = +,- */
+ if (idx > 3 && m_tokens.is_next_token("(")) {
+ //
+ // it is a built in function
+ //
+ dbg gprint("Found built in function \n");
+ get_params(pcode, np, plist, uc_token);
+ pcode.addFunction(idx + FN_BUILTIN_MAGIC);
+ unary = 2;
+ break;
+ } else if (idx > 0 && idx <= 3) {
+ stack_fn(idx);
+ unary = 1;
+ break;
+ }
+ /* Is it a user-defined function, identical code too above. */
+ sub = sub_find((char*)uc_token.c_str());
+ if (sub != NULL && m_tokens.is_next_token("(")) {
+ //
+ // it is a user defined function
+ //
+// printf("User cts=%s idx=%d ret=%d np=%d plist=%d\n",cts,idx,ret,np,plist);
+ dbg gprint("Found user function \n");
+ get_params(pcode, sub->getNbParam(), sub->getParamTypes(), uc_token);
+ pcode.addFunction(sub->getIndex()+LOCAL_START_INDEX);
+ unary = 2;
+ break;
+ }
+ /* Is it a 'known' variable */
+ int v;
+ var_find((char*)uc_token.c_str(), &v, &ret);
+ if (v >= 0) {
+ // cout << "found var: '" << uc_token << "' -> " << v << endl;
+ if (ret == 2) pcode.addStrVar(v);
+ else pcode.addVar(v);
+ unary = 2;
+ if (m_vars != NULL && m_vars->try_get(uc_token) == -1) {
+ /* Add it to list of vars */
+ m_vars->add_item(uc_token, v);
+ }
+ break;
+ }
+ /* Is it a string */
+ if (first_char == '"' || first_char == '\'') {
+ dbg gprint("Found string \n");
+ string str_no_quote = token;
+ str_remove_quote(str_no_quote);
+ pcode.addString(str_no_quote);
+ unary = 2;
+ break;
+ }
+ if ((first_char == 'd' || first_char == 'D') && token_len == 1 && m_tokens.is_next_token("[")) {
+ get_array_index(pcode);
+ pcode.addFunction(FN_DI + FN_BUILTIN_MAGIC);
+ unary = 2;
+ break;
+ }
+ if (first_char == '(' && token_len == 1) {
+ curpri = curpri + 100;
+ break;
+ }
+ if ((first_char == ')' || first_char == ')') && token_len == 1) {
+ throw error("constant, function, or unary operator expected");
+ }
+ if (m_tokens.is_next_token("(")) {
+ throw error(token_col, string("call to undefined function '"+token+"'"));
+ }
+ /* must be unquoted string, unless a binary operator
+ was found, in which case it is an undelcared variable */
+ if (not_string || str_var(token)) {
+ /* name that includes '$' is also assumed to be a variable */
+ dbg gprint("Found un-initialized variable {%s} /n",token.c_str());
+ if (!var_valid_name(uc_token)) {
+ throw error(token_col, "illegal variable name '"+uc_token+"'");
+ }
+ var_findadd((char*)uc_token.c_str(), &v, &ret);
+ if (ret == 2) pcode.addStrVar(v);
+ else pcode.addVar(v);
+ not_string = true;
+ unary = 2;
+ if (m_vars != NULL && m_vars->try_get(uc_token) == -1) {
+ /* Add it to list of vars */
+ m_vars->add_item(uc_token, v);
+ }
+ break;
+ }
+ // std::cout << "Unquoted string '" << token << "'" << std::endl;
+ pcode.addString(token);
+ if (!valid_unquoted_string(token)) {
+ throw error(token_col, "invalid unquoted string '"+token+"'");
+ }
+ isa_string = true;
+ unary = 2;
+ break;
+ case 2: /* a binary operator, or space, or end of line */
+ /* MIGHT (gives error with a$ = b$+c$) */
+ if (first_char != '.') {
+ if (isa_string) {
+ throw error("left hand side contains unquoted string");
+ }
+ not_string = true;
+ } else {
+ not_string = false;
+ }
+ /* Binary operators, +,-,*,/,^,<,>,<=,>=,.and.,.or. */
+ int priority = 0;
+ if (token_len == 1) {
+ switch (first_char) {
+ case '+' : v = BIN_OP_PLUS; priority = 2; break;
+ case '-' : v = BIN_OP_MINUS; priority = 2; break;
+ case '*' : v = BIN_OP_MULTIPLY; priority = 3; break;
+ case '/' : v = BIN_OP_DIVIDE; priority = 3; break;
+ case '%' : v = BIN_OP_MOD; priority = 3; break;
+ case '^' : v = BIN_OP_POW; priority = 4; break;
+ case '=' : v = BIN_OP_EQUALS; priority = 1; break;
+ case '&' : v = BIN_OP_AND; priority = 1; break;
+ case '|' : v = BIN_OP_OR; priority = 1; break;
+ case '<' : v = BIN_OP_LT; priority = 1; break;
+ case '>' : v = BIN_OP_GT; priority = 1; break;
+ case '.' : v = BIN_OP_DOT; priority = 2; break;
+ default : v = 0;
+ }
+ } else {
+ str_to_uppercase(token, uc_token);
+ if (token == "<=") {
+ v = BIN_OP_LE; priority = 1;
+ } else if (token == "<>") {
+ v = BIN_OP_NOT_EQUALS; priority = 1;
+ } else if (token == ">=") {
+ v = BIN_OP_GE; priority = 1;
+ } else if (token == "**") {
+ v = BIN_OP_POW; priority = 4;
+ } else if (uc_token == "AND") {
+ v = BIN_OP_AND; priority = 1;
+ } else if (uc_token == "OR") {
+ v = BIN_OP_OR; priority = 1;
+ } else {
+ v = 0;
+ }
+ }
+ if (v > 0) {
+ stack_bin(v, priority);
+ dbg gprint("Found binary operator \n");
+ unary = 1;
+ } else if (first_char == ')' && token_len == 1) {
+ if (curpri > 0) {
+ curpri = curpri - 100;
+ unary = 2;
+ break;
+ }
+ if (!term_bracket) {
+ throw error("too many closing ')', expecting binary operator");
+ }
+ } else {
+ throw error(string("unknown binary operator '")+token+"'");
+ }
+ } // end switch
+ } // end for
+}
+
+Tokenizer* GLEPolish::getTokens(const string& str) {
+ m_tokens.set_string(str.c_str());
+ return &m_tokens;
+}
+
+void GLEPolish::internalEval(const char *exp, double *x) throw(ParserError) {
+ // difference with eval: no try / catch
+ int rtype = 1, cp = 0;
+ GLEPcodeList pc_list;
+ GLEPcode pcode(&pc_list);
+ internalPolish(exp, pcode, &rtype);
+ GLERC<GLEArrayImpl> stk(new GLEArrayImpl());
+ *x = evalDouble(stk.get(), &pc_list, (int*)&pcode[0], &cp);
+}
+
+void GLEPolish::internalEvalString(const char* exp, string* str) throw(ParserError) {
+ // difference with eval_string: no try / catch
+ int rtype = 2, cp = 0;
+ GLEPcodeList pc_list;
+ GLEPcode pcode(&pc_list);
+ internalPolish(exp, pcode, &rtype);
+ GLERC<GLEArrayImpl> stk(new GLEArrayImpl());
+ GLERC<GLEString> result(::evalString(stk.get(), &pc_list, (int*)&pcode[0], &cp, true));
+ *str = result->toUTF8();
+}
+
+void GLEPolish::eval(GLEArrayImpl* stk, const char *exp, double *x) throw(ParserError) {
+ int rtype = 1, cp = 0;
+ GLEPcodeList pc_list;
+ GLEPcode pcode(&pc_list);
+ polish(exp, pcode, &rtype);
+ *x = evalDouble(stk, &pc_list, (int*)&pcode[0], &cp);
+}
+
+void GLEPolish::evalString(GLEArrayImpl* stk, const char *exp, string *str, bool allownum) throw(ParserError) {
+ int rtype = allownum ? 0 : 2;
+ int cp = 0;
+ GLEPcodeList pc_list;
+ GLEPcode pcode(&pc_list);
+ polish(exp, pcode, &rtype);
+ GLERC<GLEString> result(::evalString(stk, &pc_list, (int*)&pcode[0], &cp, allownum));
+ *str = result->toUTF8();
+}
+
+GLEMemoryCell* GLEPolish::evalGeneric(GLEArrayImpl* stk, const char *exp) throw(ParserError) {
+ int cp = 0;
+ int rtype = 0;
+ GLEPcodeList pc_list;
+ GLEPcode pcode(&pc_list);
+ polish(exp, pcode, &rtype);
+ return ::evalGeneric(stk, &pc_list, (int*)&pcode[0], &cp);
+}
+
+bool valid_unquoted_string(const string& str) {
+ if (str.length() == 0) {
+ return false;
+ } else {
+ int ch = str[0];
+ if (!((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z'))) {
+ return false;
+ } else {
+ return true;
+ }
+ }
+}
+
+void stack_op(GLEPcode& pcode, int stk[], int stkp[], int *nstk, int i, int p) {
+ dbg gprint("Stack oper %d priority %d \n",i,p);
+ while ((*nstk)>0 && p<=stkp[*nstk]) {
+ dbg gprint("ADDING oper stack = %d oper=%d \n",*nstk,stk[(*nstk)]);
+ pcode.addInt(stk[(*nstk)--]);
+ }
+ stk[++(*nstk)] = i;
+ stkp[*nstk] = p;
+}
+
+void polish(char *expr, GLEPcode& pcode, int *rtype) throw(ParserError) {
+ GLEPolish* polish = get_global_polish();
+ if (polish != NULL) {
+ polish->polish(expr, pcode, rtype);
+ }
+}
+
+void eval_pcode(GLEPcode& pcode, double* x) {
+ int cp = 0;
+ GLERC<GLEArrayImpl> stk(new GLEArrayImpl());
+ *x = evalDouble(stk.get(), pcode.getPcodeList(), (int*)&pcode[0], &cp);
+}
+
+void eval_pcode_str(GLEPcode& pcode, string& x) {
+ int cp = 0;
+ GLERC<GLEArrayImpl> stk(new GLEArrayImpl());
+ GLERC<GLEString> result(::evalString(stk.get(), pcode.getPcodeList(), (int*)&pcode[0], &cp, true));
+ x = result->toUTF8();
+}
+
+void polish_eval(char *exp, double *x) throw(ParserError) {
+ GLEPolish* polish = get_global_polish();
+ GLERC<GLEArrayImpl> stk(new GLEArrayImpl());
+ if (polish != NULL) polish->eval(stk.get(), exp, x);
+}
+
+void polish_eval_string(const char *exp, string *str, bool allownum) throw(ParserError) {
+ GLEPolish* polish = get_global_polish();
+ GLERC<GLEArrayImpl> stk(new GLEArrayImpl());
+ if (polish != NULL) polish->evalString(stk.get(), exp, str, allownum);
+}
+
+std::string gle_operator_to_string(int op) {
+ switch (op) {
+ case BIN_OP_PLUS:
+ return "+";
+ case BIN_OP_MINUS:
+ return "-";
+ case BIN_OP_MULTIPLY:
+ return "*";
+ case BIN_OP_DIVIDE:
+ return "/";
+ case BIN_OP_POW:
+ return "^";
+ case BIN_OP_EQUALS:
+ return "=";
+ case BIN_OP_LT:
+ return "<";
+ case BIN_OP_LE:
+ return "<=";
+ case BIN_OP_GT:
+ return ">";
+ case BIN_OP_GE:
+ return ">=";
+ case BIN_OP_NOT_EQUALS:
+ return "<>";
+ case BIN_OP_AND:
+ return "AND";
+ case BIN_OP_OR:
+ return "OR";
+ case BIN_OP_MOD:
+ return "%";
+ case BIN_OP_DOT:
+ return ".";
+ default:
+ break;
+ }
+ {
+ std::ostringstream msg;
+ msg << "OP" << op;
+ return msg.str();
+ }
+}
+
+GLEPcode::GLEPcode(GLEPcodeList* list) {
+ m_PCodeList = list;
+}
+
+void GLEPcode::addColor(GLEColor* color) {
+ addInt(PCODE_EXPR);
+ int savelen = size(); /* Used to set acutal length at end */
+ addInt(0); /* Length of expression */
+ addInt(PCODE_OBJECT);
+ int pos = getPcodeList()->size();
+ getPcodeList()->push_back(color);
+ addInt(pos);
+ setInt(savelen, size() - savelen - 1);
+}
+
+void GLEPcode::addDoubleExpression(double val) {
+ addInt(PCODE_EXPR);
+ int savelen = size();
+ addInt(0);
+ addDouble(val);
+ setInt(savelen, size() - savelen - 1);
+}
+
+void GLEPcode::addStringExpression(const char* val) {
+ addInt(PCODE_EXPR);
+ int savelen = size();
+ addInt(0);
+ addStringChar(val);
+ setInt(savelen, size() - savelen - 1);
+}
+
+void GLEPcode::addDouble(double val) {
+ union { double d ; int l[2]; short s[4]; } both;
+ both.d = val;
+ addInt(PCODE_DOUBLE);
+ addInt(both.l[0]);
+ addInt(both.l[1]);
+}
+
+void GLEPcode::addFunction(int idx) {
+ addInt(idx);
+}
+
+void GLEPcode::addVar(int var) {
+ addInt(PCODE_VAR);
+ addInt(var);
+}
+
+void GLEPcode::addStrVar(int var) {
+ addInt(PCODE_STRVAR);
+ addInt(var);
+}
+
+void GLEPcode::addString(const string& str) {
+ addInt(PCODE_STRING);
+ addStringNoID(str);
+}
+
+void GLEPcode::addStringNoID(const string& str) {
+ int slen = str.length() + 1;
+ slen = ((slen + 3) & 0xfffc) / 4;
+ int pos = size();
+ for (int i = 0; i < slen; i++) {
+ addInt(0);
+ }
+ char* str_target = (char*)&(*this)[pos];
+ strcpy(str_target, str.c_str());
+}
+
+void GLEPcode::addStringChar(const char* str) {
+ addInt(PCODE_STRING);
+ addStringNoIDChar(str);
+}
+
+void GLEPcode::addStringNoIDChar(const char* str) {
+ int slen = strlen(str) + 1;
+ slen = ((slen + 3) & 0xfffc) / 4;
+ int pos = size();
+ for (int i = 0; i < slen; i++) {
+ addInt(0);
+ }
+ char* str_target = (char*)&(*this)[pos];
+ strcpy(str_target, str);
+}
+
+void GLEPcode::show() {
+ show(0);
+}
+
+void GLEPcode::show(int start) {
+ cout << "PCode:" << endl;
+ union { double d ; int l[2]; short s[4]; } both;
+ int size = getInt(start);
+ int pos = start+1;
+ while (pos <= start+size) {
+ int varid = 0;
+ int stpos = pos;
+ int opcode = getInt(pos++);
+ switch (opcode) {
+ case PCODE_VAR:
+ varid = getInt(pos++);
+ cout << "VAR " << varid << " (" << stpos << ")" << endl;
+ break;
+ case PCODE_DOUBLE:
+ both.l[0] = getInt(pos++);
+ both.l[1] = getInt(pos++);
+ cout << "DOUBLE " << both.d << endl;
+ break;
+ default:
+ cout << "PCODE " << opcode << " (" << stpos << ")" << endl;
+
+ }
+ }
+}
+
+GLEPcodeIndexed::GLEPcodeIndexed(GLEPcodeList* list) : GLEPcode(list) {
+}
+
+GLEFunctionParserPcode::GLEFunctionParserPcode() : m_Pcode(&m_PcodeList) {
+}
+
+GLEFunctionParserPcode::~GLEFunctionParserPcode() {
+}
+
+void GLEFunctionParserPcode::polish(const char* fct, StringIntHash* vars) throw(ParserError) {
+ GLEPolish* polish = get_global_polish();
+ if (polish != NULL) {
+ int rtype = 1;
+ polish->setExprVars(vars);
+ polish->polish(fct, m_Pcode, &rtype);
+ polish->setExprVars(NULL);
+ }
+}
+
+void GLEFunctionParserPcode::polishPos(const char* fct, int pos, StringIntHash* vars) throw(ParserError) {
+ GLEPolish* polish = get_global_polish();
+ if (polish != NULL) {
+ try {
+ int rtype = 1;
+ polish->setExprVars(vars);
+ polish->internalPolish(fct, m_Pcode, &rtype);
+ polish->setExprVars(NULL);
+ } catch (ParserError& err) {
+ err.incColumn(pos-1);
+ throw err;
+ }
+ }
+}
+
+void GLEFunctionParserPcode::polishX() throw(ParserError) {
+ polish("x", NULL);
+}
+
+double GLEFunctionParserPcode::evalDouble() {
+ double value;
+ eval_pcode(m_Pcode, &value);
+ return value;
+}
+
+bool GLEFunctionParserPcode::evalBool() {
+ int cp = 0;
+ GLERC<GLEArrayImpl> stk(new GLEArrayImpl());
+ return ::evalBool(stk.get(), m_Pcode.getPcodeList(), (int*)&m_Pcode[0], &cp);
+}
diff --git a/src/gle/polish.h b/src/gle/polish.h
new file mode 100644
index 0000000..15e1ed9
--- /dev/null
+++ b/src/gle/polish.h
@@ -0,0 +1,184 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#ifndef INCLUDE_POLISH
+#define INCLUDE_POLISH
+
+#define PCODE_EXPR 1
+#define PCODE_DOUBLE 2
+#define PCODE_VAR 3
+#define PCODE_STRVAR 4
+#define PCODE_STRING 5
+#define PCODE_OBJECT 6
+#define PCODE_NEXT_CMD 7
+
+class GLESub;
+
+class GLEArrayImpl;
+
+const int BINARY_OPERATOR_OFFSET = 10;
+
+enum BinaryOperators {
+ BIN_OP_PLUS = 1,
+ BIN_OP_MINUS,
+ BIN_OP_MULTIPLY,
+ BIN_OP_DIVIDE,
+ BIN_OP_POW,
+ BIN_OP_EQUALS,
+ BIN_OP_LT,
+ BIN_OP_LE,
+ BIN_OP_GT,
+ BIN_OP_GE,
+ BIN_OP_NOT_EQUALS,
+ BIN_OP_AND,
+ BIN_OP_OR,
+ BIN_OP_MOD,
+ BIN_OP_DOT
+};
+
+std::string gle_operator_to_string(int op);
+
+void setEvalStack(GLEArrayImpl* stk, int pos, double value);
+void setEvalStack(GLEArrayImpl* stk, int pos, const char* value);
+void setEvalStack(GLEArrayImpl* stk, int pos, int value);
+double getEvalStackDouble(GLEArrayImpl* stk, int pos);
+char* getEvalStackString(GLEArrayImpl* stk, int pos);
+GLEColor* getEvalStackColor(GLEArrayImpl* stk, int pos);
+
+class GLEPcodeList : public RefCountObject {
+public:
+ inline int size() const { return m_ConstObjects.size(); }
+ inline GLEDataObject* get(int i) { return m_ConstObjects[i].get(); }
+ inline void push_back(GLEDataObject* obj) { m_ConstObjects.push_back(obj); }
+
+protected:
+ RefCountVector<GLEDataObject> m_ConstObjects;
+};
+
+class GLEPcode : public vector<int> {
+protected:
+ GLEPcodeList* m_PCodeList;
+public:
+ GLEPcode(GLEPcodeList* list);
+ inline void addInt(int val) { push_back(val); };
+ inline int getInt(int idx) { return (*this)[idx]; };
+ inline void setInt(int idx, int val) { (*this)[idx] = val; };
+ inline void setLast(int val) { (*this)[size()-1] = val; };
+ inline GLEPcodeList* getPcodeList() { return m_PCodeList; }
+ void addColor(GLEColor* color);
+ void addDoubleExpression(double val);
+ void addStringExpression(const char* val);
+ void addDouble(double val);
+ void addFunction(int idx);
+ void addVar(int var);
+ void addStrVar(int var);
+ void addString(const string& str);
+ void addStringNoID(const string& str);
+ void addStringChar(const char* str);
+ void addStringNoIDChar(const char* str);
+ void show();
+ void show(int start);
+};
+
+class GLEPcodeIndexed : public GLEPcode {
+protected:
+ vector<int> m_Index;
+public:
+ GLEPcodeIndexed(GLEPcodeList* list);
+ inline int getNbEntries() { return m_Index.size(); }
+ inline void addIndex(int idx) { m_Index.push_back(idx); }
+ inline int getIndex(int idx) { return m_Index[idx]; }
+ inline int getSize(int idx) { return m_Index[idx+1]-m_Index[idx]; }
+};
+
+class GLEFunctionParserPcode : public GLERefCountObject {
+protected:
+ GLEPcode m_Pcode;
+ GLEPcodeList m_PcodeList;
+public:
+ GLEFunctionParserPcode();
+ ~GLEFunctionParserPcode();
+ void polish(const char* fct, StringIntHash* vars = NULL) throw(ParserError);
+ void polishPos(const char* fct, int pos, StringIntHash* vars = NULL) throw(ParserError);
+ void polishX() throw(ParserError);
+ double evalDouble();
+ bool evalBool();
+ inline GLEPcode* getCode() { return &m_Pcode; }
+};
+
+class GLEPolish : public RefCountObject {
+protected:
+ TokenizerLanguage m_lang;
+ StringTokenizer m_tokens;
+ StringIntHash* m_vars;
+public:
+ GLEPolish();
+ ~GLEPolish();
+ void internalPolish(const char *expr, GLEPcode& pcode, int *rtype) throw(ParserError);
+ void internalPolish(GLEPcode& pcode, int *rtype) throw(ParserError);
+ void internalEval(const char *exp, double *x) throw(ParserError);
+ void internalEvalString(const char* exp, string* str) throw(ParserError);
+ void polish(const char *expr, GLEPcode& pcode, int *rtype) throw(ParserError);
+ void eval(GLEArrayImpl* stk, const char *exp, double *x) throw(ParserError);
+ void evalString(GLEArrayImpl* stk, const char *exp, string *str, bool allownum = false) throw(ParserError);
+ GLEMemoryCell* evalGeneric(GLEArrayImpl* stk, const char *exp) throw(ParserError);
+ void get_params(GLEPcode& pcode, int np, int* plist, const string& name) throw(ParserError);
+ void get_array_index(GLEPcode& pcode) throw(ParserError);
+ double evalTokenToDouble() throw(ParserError);
+ Tokenizer* getTokens(const string& str);
+ void initTokenizer();
+ inline void setExprVars(StringIntHash* vars) { m_vars = vars; }
+ inline ParserError error(int column, const string& src) const {
+ return m_tokens.error(column, src);
+ };
+ inline ParserError error(const string& src) const {
+ return m_tokens.error(src);
+ };
+};
+
+void polish_eval(char *exp, double *x) throw(ParserError);
+void polish_eval_string(const char *exp, string *str, bool allownum = false) throw(ParserError);
+void polish(char *expr, GLEPcode& pcode, int *rtype) throw(ParserError);
+void eval_pcode(GLEPcode& pcode, double* x);
+void eval_pcode_str(GLEPcode& pcode, string& x);
+
+GLEPolish* get_global_polish();
+
+void stack_op(char *pcode, int *plen, int stk[] , int stkp[], int *nstk, int i, int p);
+
+#endif
diff --git a/src/gle/run.cpp b/src/gle/run.cpp
new file mode 100644
index 0000000..24ea048
--- /dev/null
+++ b/src/gle/run.cpp
@@ -0,0 +1,2541 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#include "all.h"
+#include "mem_limits.h"
+#include "token.h"
+#include "core.h"
+#include "glearray.h"
+#include "polish.h"
+#include "pass.h"
+#include "op_def.h"
+#include "var.h"
+#include "cutils.h"
+#include "gprint.h"
+#include "texinterface.h"
+#include "keyword.h"
+#include "run.h"
+#include "fn.h"
+#include "file_io.h"
+#include "sub.h"
+#include "gle-interface/gle-interface.h"
+
+void name_get2(char *n,double *x1,double *y1,double *x2,double *y2) throw(ParserError);
+
+#define GRAPHDEF extern
+#include "graph.h"
+
+extern OPKEY op_begin;
+extern GLESubMap g_Subroutines;
+
+extern int **gpcode; /* gpcode is a pointer to an array of poiter to int */
+extern int *gplen; /* gpcode is a pointer to an array of int */
+
+string get_b_name(int jj) {
+ for (int i=0; op_begin[i].typ!=0; i++) {
+ if(int(op_begin[i].idx) == jj){
+ return string(op_begin[i].name);
+ }
+ }
+ return "unknown";
+}
+
+void text_def(uchar *ss);
+void run_bigfile(char *ss);
+
+void begin_config(const std::string& block, int *pln, int *pcode, int *cp);
+void begin_tex_preamble(int *pln, int *pcode, int *cp);
+void begin_tex(GLERun* run, int *pln, int *pcode, int *cp);
+void begin_surface(int *pln, int *pcode, int *cp) throw(ParserError);
+void begin_letz(int *pln, GLEPcodeList* pclist, int *pcode, int *cp) throw(ParserError);
+void begin_fitz(int *pln, int *pcode, int *cp) throw(ParserError);
+void begin_contour(int *pln, int *pcode, int *cp) throw(ParserError);
+// void begin_fitls(int *pln, int *pcode, int *cp) throw(ParserError);
+
+class GLEBox {
+public:
+ GLEBox();
+ void setFill(const GLERC<GLEColor>& fill);
+ void setRound(double round);
+ void draw(GLERun* run, double x1, double y1, double x2, double y2);
+ inline void setStroke(bool stroke) { m_HasStroke = stroke; }
+ inline bool hasStroke() const { return m_HasStroke; }
+ inline void setReverse(bool reverse) { m_HasReverse = reverse; }
+ inline bool hasReverse() const { return m_HasReverse; }
+ inline bool isFilled() const { return !m_Fill->isTransparent(); }
+ inline GLERC<GLEColor> getFill() const { return m_Fill; }
+ inline bool isRound() const { return m_IsRound; }
+ inline double getRound() const { return m_Round; }
+ inline void setName(GLEString* name) { m_name = name; }
+ inline bool hasName() const { return !m_name.isNull(); }
+ inline GLEString* getName() const { return m_name.get(); }
+ inline void setAdd(double add) { m_Add = add; }
+ inline double getAdd() const { return m_Add; }
+protected:
+ bool m_HasStroke;
+ bool m_HasReverse;
+ double m_Add;
+ bool m_IsRound;
+ double m_Round;
+ GLERC<GLEString> m_name;
+ GLERC<GLEColor> m_Fill;
+};
+
+class GLEStoredBox : public GLEBox {
+public:
+ GLEStoredBox();
+ inline bool isSecondPass() const { return m_SecondPass; }
+ inline void setSecondPass(bool second) { m_SecondPass = second; }
+ inline GLEDevice* getDevice() { return m_Device; }
+ inline void setDevice(GLEDevice* dev) { m_Device = dev; }
+ inline GLEObjectRepresention* getObjectRep() const { return m_Object.get(); }
+ inline bool hasObjectRep() { return !m_Object.isNull(); }
+ inline void setObjectRep(GLEObjectRepresention* obj) { m_Object = obj; }
+ inline GLERectangle* getSaveBounds() { return &m_SaveBounds; }
+ void setOrigin(double x0, double y0) { m_Orig.setXY(x0, y0); }
+ const GLEPoint& getOrigin() { return m_Orig; }
+private:
+ GLERectangle m_SaveBounds;
+ GLEPoint m_Orig;
+ bool m_SecondPass;
+ GLEDevice* m_Device;
+ GLERC<GLEObjectRepresention> m_Object;
+};
+
+class GLEBoxStack {
+protected:
+ static GLEBoxStack m_Instance;
+ vector<GLEStoredBox> m_Boxes;
+public:
+ static inline GLEBoxStack* getInstance() { return &m_Instance; }
+ inline int size() { return m_Boxes.size(); }
+ inline void removeBox() { m_Boxes.pop_back(); }
+ inline GLEStoredBox* lastBox() { return &m_Boxes.back(); }
+ inline GLEStoredBox* newBox() { m_Boxes.push_back(GLEStoredBox()); return lastBox(); }
+};
+
+GLEBoxStack GLEBoxStack::m_Instance;
+
+GLEStoredBox* box_start(void);
+
+extern int this_line;
+extern int trace_on;
+static int path_clip[4],path_stroke[4];
+static GLERC<GLEColor> path_fill[4];
+static GLERC<GLEColor> path_fill_backup[4];
+static double path_x[4],path_y[4];
+static int npath;
+#define true (!false)
+#define false 0
+int done_open = false;
+
+class GLEFile {
+protected:
+ bool m_ReadWrite;
+ FILE* m_Output;
+ StreamTokenizer* m_Input;
+ string m_buffer;
+ string m_FileName;
+public:
+ GLEFile();
+ ~GLEFile();
+ void close();
+ void open(const char* fname) throw(ParserError);
+ bool eof() throw(ParserError);
+ char* getToken() throw(ParserError);
+ char* readLine() throw(ParserError);
+ void gotoNewLine() throw(ParserError);
+ void resetLang();
+ void setLangChars(int type, const char* str);
+ inline void setCommentChars(const std::string& str) { setLangChars(0, str.c_str()); }
+ inline void setSpaceTokens(const std::string& str) { setLangChars(1, str.c_str()); }
+ inline void setSingleCharTokens(const std::string& str) { setLangChars(2, str.c_str()); }
+ inline bool isRead() { return m_ReadWrite; }
+ inline void setRdWr(bool rd) { m_ReadWrite = rd; }
+ inline FILE* getOutput() { return m_Output; }
+};
+
+vector<GLEFile*> g_Files;
+
+int f_getchan(void);
+void f_readahead(int chn);
+int f_testchan(int chn) throw(ParserError);
+void siffree(char **s);
+void f_getline(int chn);
+char *f_gettok(int chn);
+static int chn;
+int f_eof(int chn) throw(ParserError);
+char *f_getnext(int chn);
+
+void f_create_chan(int var, const char* fname, int rd_wr);
+void f_close_chan(int idx) throw(ParserError);
+
+
+/*---------------------------------------------------------------------------*/
+/* pos= Offset to find the data */
+/* idx= For switches, which can only have one value. */
+/* The pos is the order the items will be placed in the pcode */
+/* */
+/* Switches int placed in directly, 1 present, 0 not present */
+/* expressions LONG* pointed to, 0 if not present. */
+/* color/fill LONG* Pointer to exp 0 if not present. */
+/* marker LONG* Pointer to exp 0 if not present. */
+/* lstyle LONG* Pointer to exp 0 if not present. */
+/* font int* Pointer to string expression. */
+/*---------------------------------------------------------------------------*/
+
+extern char *mainkey[];
+extern int gle_debug;
+int can_fillpath = false;
+vector<int> g_drobj;
+
+#define readval(x) x=evalDouble(getStack(),getPcodeList(),pcode,&cp)
+#define readxy(x,y) {x=evalDouble(getStack(),getPcodeList(),pcode,&cp); y=evalDouble(getStack(),getPcodeList(),pcode,&cp);}
+#define readstr(s) {ostr=evalStringPtr(getStack(),getPcodeList(),pcode,&cp); s=ostr->toUTF8();}
+#define readlong(i) i = *(pcode+cp++)
+#define readvalp(x,p) {zzcp=0; x=evalDouble(getStack(),getPcodeList(),p,&zzcp);}
+#define readstrp(p) {zzcp=0; ostr=evalStringPtr(getStack(),getPcodeList(),p,&zzcp);}
+
+#define PCODE_UNKNOWN_COMMAND 1
+
+void byte_code_error(int err) throw(ParserError) {
+ char str[50];
+ TokenizerPos pos;
+ pos.setColumn(-1);
+ sprintf(str, "byte code error (code = %d)", err);
+ ParserError err_exp(str, pos, NULL);
+ throw err_exp;
+}
+
+void clear_run() {
+ npath = 0;
+ done_open = false;
+ std::string ss(g_get_type());
+ if (strstr(ss.c_str(), "FILLPATH")!=NULL) can_fillpath = true;
+ else can_fillpath = false;
+ g_drobj.clear();
+}
+
+int gle_is_open() {
+ return done_open;
+}
+
+void error_before_drawing_cmds(const char* name) throw(ParserError) {
+ // NOTE: this can be broken by GLEGlobalSource::performUpdates(), which puts includes at front
+ string str = name;
+ str += " command must appear before drawing commands";
+ g_throw_parser_error(str);
+}
+
+bool isSingleInstructionLine(int line, int* opcode) {
+ int cp = 0;
+ int plen = gplen[line];
+ if (plen <= 2) {
+ // cout << "line: " << line << " opcode comment" << endl;
+ *opcode = GLE_KW_COMMENT;
+ return true;
+ }
+ int cmd_plen = gpcode[line][cp++];
+ *opcode = gpcode[line][cp++];
+ // cout << "line: " << line << " opcode: " << *opcode << endl;
+ return cmd_plen >= plen;
+}
+
+bool tryHandleChangedPropertiesPrevSet(GLEGlobalSource* source, vector<GLEProperty*>& changed, int line, GLEPropertyStore* props) {
+ const string& code = source->getLineCode(line-1);
+ GLEParser* parser = get_global_parser();
+ Tokenizer* tokens = parser->getTokens();
+ parser->setString(code.c_str());
+ ostringstream ss;
+ ss << "set";
+ try {
+ tokens->ensure_next_token_i("SET");
+ while (tokens->has_more_tokens()) {
+ string set_opt = tokens->next_token();
+ bool is_changed = false;
+ for (vector<GLEProperty*>::size_type i = 0; i < changed.size(); i++) {
+ GLEProperty* prop = changed[i];
+ const char* prop_name = prop->getSetCommandName();
+ if (prop_name != NULL && str_i_equals(set_opt, prop_name)) {
+ is_changed = true;
+ prop->createSetCommandGLECode(ss, props->getPropertyValue(prop));
+ changed.erase(changed.begin()+i);
+ break;
+ }
+ }
+ const string& set_value = tokens->next_multilevel_token();
+ if (!is_changed) {
+ ss << " " << set_opt << " " << set_value;
+ }
+ }
+ } catch (ParserError& err) {
+ return false;
+ }
+ for (vector<GLEProperty*>::size_type i = 0; i < changed.size(); i++) {
+ GLEProperty* prop = changed[i];
+ prop->createSetCommandGLECode(ss, props->getPropertyValue(prop));
+ }
+ source->updateLine(line-1, ss.str());
+ return true;
+}
+
+void tryDeleteAmove(GLEGlobalSource* source, int line) {
+ // FIXME: inconsistency pcode first line = 1, source file first line = 0
+ int opcode;
+ int next_line = line + 2;
+ bool has_next_amove = false;
+ /* skip comments and set commands */
+ while (next_line < source->getNbLines() && isSingleInstructionLine(next_line, &opcode) && (opcode == GLE_KW_COMMENT || opcode == GLE_KW_SET)) {
+ next_line++;
+ }
+ if (next_line < source->getNbLines() && isSingleInstructionLine(next_line, &opcode) && opcode == GLE_KW_AMOVE) {
+ has_next_amove = true;
+ }
+ /* if has subsequent amove, then OK to delete previous one */
+ if (has_next_amove) {
+ if (line >= 1 && isSingleInstructionLine(line, &opcode) && opcode == GLE_KW_AMOVE) {
+ source->scheduleDeleteLine(line-1);
+ }
+ }
+}
+
+void handleAddAmove(GLEGlobalSource* source, GLEPoint& amove) {
+ // FIXME: inconsistency pcode first line = 1, source file first line = 0
+ int opcode = -1;
+ int line = g_get_error_line();
+ int prev_line = line - 1;
+ /* Check if not already at this point */
+ GLEPoint crpt;
+ g_get_xy(&crpt);
+ if (crpt.approx(amove)) {
+ return;
+ }
+ /* round point if close to zero */
+ if (fabs(amove.getX()) < 1e-10) {
+ amove.setX(0.0);
+ }
+ if (fabs(amove.getY()) < 1e-10) {
+ amove.setY(0.0);
+ }
+ /* create command */
+ ostringstream code;
+ code << "amove " << amove.getX() << " " << amove.getY();
+ /* skip comments and empty lines */
+ while (prev_line > 1 && isSingleInstructionLine(prev_line, &opcode) && opcode == GLE_KW_COMMENT) {
+ prev_line--;
+ }
+ /* previous command is amove command */
+ if (prev_line >= 1 && isSingleInstructionLine(prev_line, &opcode) && opcode == GLE_KW_AMOVE) {
+ source->updateLine(prev_line-1, code.str());
+ } else {
+ source->scheduleInsertLine(line-1, code.str());
+ }
+}
+
+void handleChangedProperties(GLEGlobalSource* source, GLEPropertyStore* props) {
+ // FIXME: inconsistency pcode first line = 1, source file first line = 0
+ vector<GLEProperty*> changed;
+ GLEPropertyStoreModel* model = props->getModel();
+ for (int i = 0; i < model->getNumberOfProperties(); i++) {
+ GLEProperty* prop = model->getProperty(i);
+ if (!prop->isEqualToState(props)) {
+ prop->updateState(props);
+ changed.push_back(prop);
+ }
+ }
+ if (changed.size() != 0) {
+ int opcode = -1;
+ int line = g_get_error_line();
+ int prev_line = line - 1;
+ /* skip comments and empty lines */
+ while (prev_line > 1 && isSingleInstructionLine(prev_line, &opcode) && opcode == GLE_KW_AMOVE) {
+ prev_line--;
+ }
+ /* previous command is set command */
+ bool do_insert = false;
+ if (prev_line >= 1 && isSingleInstructionLine(prev_line, &opcode) && opcode == GLE_KW_SET) {
+ if (!tryHandleChangedPropertiesPrevSet(source, changed, prev_line, props)) {
+ do_insert = true;
+ }
+ } else {
+ do_insert = true;
+ }
+ if (do_insert) {
+ ostringstream ss;
+ ss << "set";
+ for (vector<GLEProperty*>::size_type i = 0; i < changed.size(); i++) {
+ GLEProperty* prop = changed[i];
+ prop->createSetCommandGLECode(ss, props->getPropertyValue(prop));
+ }
+ source->scheduleInsertLine(prev_line, ss.str());
+ }
+ }
+}
+
+void handleNewDrawObject(GLEDrawObject* obj, bool mkdrobjs, GLEPoint* orig = NULL) {
+ if (!mkdrobjs) {
+ obj->draw();
+ } else {
+ GLEInterface* iface = GLEGetInterfacePointer();
+ GLEScript* script = iface->getScript();
+ GLEGlobalSource* source = script->getSource();
+ if (iface->isCommitMode()) {
+ GLEDrawObject* mobj = script->nextObject();
+ if (mobj != NULL && mobj->getType() == obj->getType()) {
+ GLEDrawObject* nobj = mobj->deepClone();
+ GLEPropertyStore* props = nobj->getProperties();
+ nobj->applyTransformation(false);
+ handleChangedProperties(source, props);
+ if (!obj->approx(nobj)) {
+ GLEPoint amove;
+ if (nobj->needsAMove(amove)) {
+ handleAddAmove(source, amove);
+ }
+ if (orig != NULL) {
+ orig->set(amove);
+ }
+ if (mobj->modified()) {
+ string code;
+ nobj->createGLECode(code);
+ int line = g_get_error_line()-1;
+ source->updateLine(line, code);
+ }
+ }
+ if (mobj->hasFlag(GDO_FLAG_DELETED)) {
+ string code;
+ int line = g_get_error_line()-1;
+ source->updateLine(line, code);
+ source->scheduleDeleteLine(line);
+ tryDeleteAmove(source, line);
+ } else {
+ nobj->updateBoundingBox();
+ }
+ delete nobj;
+ }
+ } else {
+ GLEDrawObject* nobj = obj->deepClone();
+ nobj->initProperties(iface);
+ nobj->applyTransformation(true);
+ script->addObject(nobj);
+ obj->updateBoundingBox();
+ }
+ }
+}
+
+GLERun::GLERun(GLEScript* script, GLEFileLocation* outfile, GLEPcodeIndexed* pcode) {
+ m_Script = script;
+ m_OutFile = outfile;
+ m_Vars = getVarsInstance();
+ m_CrObj = new GLEObjectRepresention();
+ m_stack = new GLEArrayImpl();
+ m_blockTypes = 0;
+ m_pcode = pcode;
+ for (int i = 0; i < GLE_KW_NB; i++) {
+ m_AllowBeforeSize[i] = false;
+ }
+ GLE_MC_INIT(m_returnValue);
+ allowBeforeSize(GLE_KW_ASSIGNMENT);
+ allowBeforeSize(GLE_KW_BITMAP_INFO);
+ allowBeforeSize(GLE_KW_BLANK);
+ allowBeforeSize(GLE_KW_CALL);
+ allowBeforeSize(GLE_KW_COMMENT);
+ allowBeforeSize(GLE_KW_COMPATIBILITY);
+ allowBeforeSize(GLE_KW_DECLARESUB);
+ allowBeforeSize(GLE_KW_DEFAULT);
+ allowBeforeSize(GLE_KW_DEFCOLOR);
+ allowBeforeSize(GLE_KW_DEFINE);
+ allowBeforeSize(GLE_KW_ELSE);
+ allowBeforeSize(GLE_KW_FCLOSE);
+ allowBeforeSize(GLE_KW_FGETLINE);
+ allowBeforeSize(GLE_KW_FOPEN);
+ allowBeforeSize(GLE_KW_FOR);
+ allowBeforeSize(GLE_KW_FREAD);
+ allowBeforeSize(GLE_KW_FREADLN);
+ allowBeforeSize(GLE_KW_FTOKENIZER);
+ allowBeforeSize(GLE_KW_FWRITE);
+ allowBeforeSize(GLE_KW_FWRITELN);
+ allowBeforeSize(GLE_KW_IF);
+ allowBeforeSize(GLE_KW_INCLUDE);
+ allowBeforeSize(GLE_KW_MARGINS);
+ allowBeforeSize(GLE_KW_NEXT);
+ allowBeforeSize(GLE_KW_ORIENTATION);
+ allowBeforeSize(GLE_KW_PAPERSIZE);
+ allowBeforeSize(GLE_KW_PRINT);
+ allowBeforeSize(GLE_KW_PSBBTWEAK);
+ allowBeforeSize(GLE_KW_PSCOMMENT);
+ allowBeforeSize(GLE_KW_RETURN);
+ allowBeforeSize(GLE_KW_SIZE);
+ allowBeforeSize(GLE_KW_SLEEP);
+ allowBeforeSize(GLE_KW_SUB);
+ allowBeforeSize(GLE_KW_UNTIL);
+ allowBeforeSize(GLE_KW_WHILE);
+ allowBeforeSize(GLE_KW_END);
+}
+
+GLERun::~GLERun() {
+}
+
+GLEPcodeList* GLERun::getPcodeList() {
+ return m_pcode->getPcodeList();
+}
+
+void GLERun::setDeviceIsOpen(bool open) {
+ done_open = open;
+}
+
+void GLERun::setBlockTypes(GLEBlocks* blocks) {
+ m_blockTypes = blocks;
+}
+
+GLEBlocks* GLERun::getBlockTypes() {
+ return m_blockTypes;
+}
+
+void GLERun::do_pcode(GLESourceLine &sline, int *srclin, int *pcode, int plen, int *pend, bool& mkdrobjs) throw(ParserError) {
+/* srclin = The source line number */
+/* pcode = a pointer to the pcode output buffer */
+/* plne = a pointer to the length of the pcode output */
+ union {double d; int l; int ll[2];} both;
+ int cp=*pend,i,zzcp;
+ GLEString* ostr;
+ GLERC<GLEString> gstr;
+ string temp_str;
+ double x,y,ox,oy,x1,y1,x2,y2,x3,y3,a1,a2,r,z,rx,ry;
+ int t,j,jj,jj2,ptr,ptr_fill,mask_just,mask_nostroke,marrow;
+ static char ss[255];
+ string ss1, ss2;
+ static bool jump_back = false;
+ GLEPoint orig;
+ GLERC<GLEColor> colorBackup;
+ *pend = 0;
+ this_line = *srclin;
+ while (cp < plen) {
+ int cmd_plen = pcode[cp++];
+ int p = pcode[cp++];
+ // cout << "pcode = " << p << " cp = " << cp << " cmd_plen = " << cmd_plen << " plen = " << plen << " srclin = " << *srclin << endl;
+ // cout << sline.getCode() << endl;
+ if (!done_open) {
+ //
+ // list here all the commands that can come before SIZE
+ // see keywords.cpp for more numbers
+ //
+ // NOTE: this can be broken by GLEGlobalSource::performUpdates(), which puts includes at front
+ i = *(pcode + cp);
+ if (!isAllowedBeforeSize(p) &&
+ !(p == GLE_KW_BEGIN && i == OP_BEGIN_OBJECT) &&
+ !(p == GLE_KW_BEGIN && i == 22) // begin config
+ ) {
+ g_open(getOutput(), getSource()->getLocation()->getName());
+ done_open = true;
+ }
+ }
+ switch (p) {
+ case 53: /* comment */
+ case 0: /* blank line */
+ break;
+ case 65: // PSCOMMENT
+ if (done_open) error_before_drawing_cmds("pscomment");
+ strcpy(ss,(char *) (pcode+cp));
+ /* readstr(ss); */
+ g_pscomment(ss);
+ break;
+ case 66: // BBTWEAK
+ g_psbbtweak();
+ break;
+ case 1: /* ALINE x y ARROW both | start | end */
+ readval(x);
+ readval(y);
+ dbg gprint("x=%f, y=%f \n",x,y);
+ marrow = *(pcode + (cp++));
+ ptr = *(pcode + cp); /* curve angle1 angle2 d1 d2 */
+ if (ptr) {
+ cp += ptr;
+ readxy(x2, y2);
+ readxy(x3, y3);
+ g_arrowcurve(x, y, marrow, x2, y2, x3, y3);
+ } else {
+ g_get_xy(&ox,&oy);
+ GLELineDO drawobj(ox, oy, x, y);
+ drawobj.setArrow((GLEHasArrow)marrow);
+ handleNewDrawObject(&drawobj, mkdrobjs);
+ if (!mkdrobjs) g_arrowline(x,y,marrow,can_fillpath);
+ }
+ break;
+ case 2: /* AMOVE */
+ readval(x);
+ readval(y);
+ g_move(x,y);
+ break;
+ case GLE_KW_ABOUND:
+ readval(x);
+ readval(y);
+ g_update_bounds(x,y);
+ break;
+ case 73: /* ASETPOS */
+ readval(x);
+ readval(y);
+ g_set_pos(x,y);
+ break;
+ case 81: /* RSETPOS */
+ readval(x);
+ readval(y);
+ g_rset_pos(x,y);
+ break;
+ case 3: /* ARC */
+ readval(r);
+ readxy(a1,a2);
+ g_get_xy(&ox,&oy);
+ //
+ // -- get options center takes two arguments
+ //
+ // arrow is first
+ marrow = *(pcode + (cp++));
+ // center is a type val 2
+ ptr = *(pcode + cp); /* cx,cy */
+ if (ptr) {
+ readvalp(x,pcode + cp + ptr);
+ ox+=x;
+ }
+ ptr = *(pcode + cp + 1); /* cx,cy */
+ if (ptr) {
+ readvalp(y,pcode + cp + ptr);
+ oy+=y;
+ }
+ if (mkdrobjs) {
+ GLEArcDO drawobj(ox, oy, r, a1, a2);
+ drawobj.setArrow((GLEHasArrow)marrow);
+ handleNewDrawObject(&drawobj, mkdrobjs);
+ } else {
+ g_arc(r, a1, a2, ox, oy, marrow);
+ }
+ break;
+ case 4: /* ARCTO */
+ readxy(x1,y1);
+ readxy(x2,y2);
+ readval(r);
+ g_get_xy(&ox,&oy);
+ g_arcto(x1+ox,y1+oy,x2+ox+x1,y2+oy+y1,r);
+ break;
+ case 51: /* Assignment var=exp */
+ readlong(jj);
+ getVars()->set(jj, evalGeneric(getStack(), getPcodeList(), pcode, &cp));
+ break;
+ case 5: /* BEGIN box | path | scale | rotate | EXTERNAL */
+ g_flush();
+ i = *(pcode + cp++);
+ switch (i) {
+ case 1: /* PATH stroke fill clip */
+ npath++;
+ g_get_xy(&path_x[npath],&path_y[npath]);
+ path_stroke[npath] = *(pcode + cp);
+ ptr = *(pcode + ++cp);
+ path_fill_backup[npath] = g_get_fill();
+ path_clip[npath] = *(pcode + cp + 1);
+ if (!path_clip[npath]) {
+ path_fill[npath] = g_get_fill();
+ } else {
+ path_fill[npath] = g_get_fill_clear();
+ }
+ if (ptr) {
+ path_fill[npath] = evalColor(getStack(), getPcodeList(), pcode + cp + ptr, 0);
+ }
+ cp++;
+ g_set_path(true);
+ g_newpath();
+ break;
+ case 2: /* BOX add, fill, nobox, name, round */
+ {
+ g_drobj.push_back(mkdrobjs);
+ GLEStoredBox* box = box_start();
+ ptr = *(pcode + cp);
+ if (ptr) {
+ readvalp(z, pcode+cp+ptr);
+ box->setAdd(z);
+ }
+ ptr = *(pcode + ++cp);
+ if (ptr) {
+ box->setFill(evalColor(getStack(), getPcodeList(), pcode + cp + ptr, 0));
+ }
+ if (*(pcode + ++cp)) {
+ box->setStroke(false);
+ }
+ ptr = *(pcode + ++cp);
+ if (ptr) {
+ readvalp(z,pcode+cp+ptr);
+ box->setRound(z);
+ }
+ ptr = *(pcode + ++cp);
+ if (ptr) {
+ readstrp(pcode+cp+ptr);
+ box->setName(ostr);
+ }
+ if (box->isFilled() && !g_is_dummy_device()) {
+ /* Draw over filled box, measure during first pass */
+ box->setDevice(g_set_dummy_device());
+ mkdrobjs = false;
+ }
+ }
+ break;
+ case 3: /* SCALE */
+ readxy(x,y);
+ g_gsave();
+ g_scale(x,y);
+ g_drobj.push_back(mkdrobjs);
+ if (x != y) mkdrobjs = false;
+ break;
+ case 21: /* shear */
+ readxy(x,y);
+ g_gsave();
+ g_shear(x,y);
+ g_drobj.push_back(mkdrobjs);
+ mkdrobjs = false;
+ break;
+ case 4: /* ROTATE */
+ readval(x);
+ g_gsave();
+ g_rotate(x);
+ g_drobj.push_back(mkdrobjs);
+ mkdrobjs = false;
+ break;
+ case 5: /* TRANSLATE */
+ readval(x); readval(y);
+ g_gsave();
+ g_translate(x,y);
+ g_rmove(0.0,0.0);
+ break;
+ case 8: /* name */
+ {
+ GLEStoredBox* box = box_start();
+ box->setStroke(false);
+ box->setName(evalStringPtr(getStack(), getPcodeList(), pcode, &cp));
+ ptr = *(pcode + cp);
+ if (ptr) {
+ readvalp(z, pcode+cp+ptr);
+ box->setAdd(z);
+ }
+ }
+ break;
+ case 9: /* text */
+ z = 0;
+ ptr = *(pcode + cp);
+ /* read width of text box */
+ if (ptr) readvalp(z,pcode+cp+ptr);
+ /* get justify of text box */
+ t = (int)*(pcode + cp+2);
+ begin_text(srclin,pcode,&cp,z,t);
+ break;
+ case 18: /* tab (tabbing, table) */
+ begin_tab(srclin,pcode,&cp);
+ break;
+ case GLE_OPBEGIN_KEY:
+ case GLE_OPBEGIN_GRAPH:
+ case GLE_OPBEGIN_SURF:
+ getBlockTypes()->getBlock(i)->beginExecuteBlock(sline, pcode, &cp);
+ break;
+ case 11: /* xaxis */
+ case 12: /* yaxis */
+ case 13: /* x2axis */
+ case 14: /* y2axis */
+ break;
+ case 19: /* begin clip */
+ g_beginclip();
+ break;
+ case 17: /* ORIGIN */
+ g_gsave();
+ g_get_xy(&x,&y);
+ g_translate(x,y);
+ g_move(0.0,0.0);
+ break;
+ case 22: /* config */
+ ostr = evalStringPtr(getStack(), getPcodeList(), pcode, &cp);
+ begin_config(ostr->toUTF8(), srclin, pcode, &cp);
+ break;
+ case 23: /* tex preamble */
+ begin_tex_preamble(srclin,pcode,&cp);
+ break;
+ case 25: /* letz */
+ begin_letz(srclin, getPcodeList(), pcode, &cp);
+ break;
+ case 26: /* fitz */
+ begin_fitz(srclin,pcode,&cp);
+ break;
+ case 27: /* fit */
+ // begin_fitls(srclin,pcode,&cp);
+ break;
+ case 28: /* contour */
+ begin_contour(srclin,pcode,&cp);
+ break;
+ case 29: /* tex */
+ begin_tex(this, srclin, pcode, &cp);
+ break;
+ case OP_BEGIN_OBJECT:
+ readlong(jj);
+ if (jj == 0) {
+ /* dynamic object inside sub */
+ if (!done_open) {
+ g_open(getOutput(), getSource()->getLocation()->getName());
+ done_open = true;
+ }
+ readlong(jj);
+ ostr = evalStringPtr(getStack(), getPcodeList(), pcode, &cp);
+ begin_object(ostr->toUTF8(), getSubroutines()->get(jj));
+ } else {
+ /* statical object - identical to sub */
+ readlong(jj);
+ sub_get_startend(jj,&i,&j);
+ *srclin = j; /* skip past the subroutine */
+ }
+ break;
+ case OP_BEGIN_LENGTH:
+ readlong(jj);
+ begin_length(jj);
+ break;
+ default: /* error */
+ g_throw_parser_error("illegal begin option code: ", i);
+ break;
+ }
+ break;
+ case 6: /* BEZIER */
+ readxy(x1,y1);
+ readxy(x2,y2);
+ readxy(x3,y3);
+ g_bezier(x1,y1,x2,y2,x3,y3);
+ break;
+ case 7: /* BOX x y justify FILL fexp NAME string ROUND val NOSTROKE */
+ {
+ GLEBox box;
+ readval(x); readval(y);
+ g_get_xy(&ox,&oy);
+ x += ox; y += oy;
+ mask_just = *(pcode + cp);
+ g_dojust(&ox,&oy,&x,&y,mask_just);
+ if (g_is_filled()) {
+ box.setFill(g_get_fill());
+ }
+ ptr = *(pcode + ++cp);
+ if (ptr) {
+ box.setFill(evalColor(getStack(), getPcodeList(), pcode + cp + ptr, 0));
+ }
+ if (*(pcode + ++cp)) {
+ box.setStroke(false);
+ }
+ if (*(pcode + ++cp)) {
+ box.setReverse(true);
+ }
+ ptr = *(pcode + ++cp);
+ if (ptr) {
+ readvalp(z,pcode+cp+ptr);
+ box.setRound(z);
+ }
+ ptr = *(pcode + ++cp);
+ if (ptr) {
+ readstrp(pcode+cp+ptr);
+ box.setName(ostr);
+ }
+ box.draw(this, ox, oy, x, y);
+ }
+ break;
+ case 52: /* CALL or @ */
+ evalGeneric(getStack(), getPcodeList(), pcode, &cp);
+ break;
+ case 8: /* CIRCLE */
+ readval(r);
+ g_get_xy(&orig);
+ ox = orig.getX();
+ oy = orig.getY();
+ mask_just = *(pcode + cp++);
+ x = ox + r;
+ y = oy + r;
+ g_dojust(&ox,&oy,&x,&y,mask_just);
+ g_move(ox,oy);
+ mask_nostroke = *(pcode + cp++);
+ colorBackup = g_get_fill();
+ ptr_fill = *(pcode + cp);
+ if (ptr_fill) {
+ g_set_fill(evalColor(getStack(), getPcodeList(), pcode + cp + ptr_fill, 0));
+ }
+ if (mkdrobjs) {
+ GLEEllipseDO drawobj(ox, oy, r);
+ handleNewDrawObject(&drawobj, mkdrobjs, &orig);
+ } else {
+ if (g_is_filled()) g_circle_fill(r);
+ if (!mask_nostroke) g_circle_stroke(r);
+ }
+ g_set_fill(colorBackup);
+ g_move(orig);
+ break;
+ case 70: /* ELLIPSE */
+ readval(rx); //x radius
+ readval(ry); //y radius
+ g_get_xy(&orig);
+ ox = orig.getX();
+ oy = orig.getY();
+ mask_just = *(pcode + cp++);
+ x = ox + rx;
+ y = oy + ry;
+ g_dojust(&ox,&oy,&x,&y,mask_just);
+ g_move(ox,oy);
+ colorBackup = g_get_fill();
+ mask_nostroke = *(pcode + cp++);
+ ptr_fill = *(pcode + cp);
+ if (ptr_fill) {
+ g_set_fill(evalColor(getStack(), getPcodeList(), pcode + cp + ptr_fill, 0));
+ }
+ if (mkdrobjs) {
+ GLEEllipseDO drawobj(ox, oy, rx, ry);
+ handleNewDrawObject(&drawobj, mkdrobjs, &orig);
+ } else {
+ if (g_is_filled()) g_ellipse_fill(rx,ry);
+ if (!mask_nostroke) g_ellipse_stroke(rx,ry);
+ }
+ g_set_fill(colorBackup);
+ g_move(orig);
+ break;
+ case 71: /* ELLIPTICAL_ARC */
+ readxy(rx,ry);
+ readxy(a1,a2);
+ g_get_xy(&ox,&oy);
+ //
+ // -- get options center takes two arguments
+ //
+ // arrow is first
+ marrow = *(pcode + (cp++));
+ // center is a type val 2
+ ptr = *(pcode + cp); /* cx,cy */
+ if (ptr) {
+ readvalp(x,pcode + cp + ptr);
+ ox+=x;
+ }
+ ptr = *(pcode + cp + 1); /* cx,cy */
+ if (ptr) {
+ readvalp(y,pcode + cp + ptr);
+ oy+=y;
+ }
+ g_elliptical_arc(rx, ry, a1, a2, ox, oy, marrow);
+ break;
+ case 72: /* ELLIPTICAL_NARC */
+ readxy(rx,ry);
+ readxy(a1,a2);
+ g_get_xy(&ox,&oy);
+ //
+ // -- get options center takes two arguments
+ //
+ // arrow is first
+ marrow = *(pcode + (cp++));
+ // center is a type val 2
+ ptr = *(pcode + cp); /* cx,cy */
+ if (ptr) {
+ readvalp(x,pcode + cp + ptr);
+ ox+=x;
+ }
+ ptr = *(pcode + cp + 1); /* cx,cy */
+ if (ptr) {
+ readvalp(y,pcode + cp + ptr);
+ oy+=y;
+ }
+ g_elliptical_narc(rx, ry, a1, a2, ox, oy, marrow);
+ break;
+ case 9: /* CLOSEPATH */
+ g_closepath();
+ break;
+ case 10: /* CURVE x y x y ... change to BEGIN CURVE ... END CURVE */
+ g_curve(getPcodeList(), pcode + cp);
+ break;
+ case 11: /* DEFINE MARKER name subname */
+ break;
+ case 12: /* DFONT */
+ ostr = evalStringPtr(getStack(), getPcodeList(), pcode, &cp);
+ g_dfont(ostr->toUTF8());
+ break;
+ case 14: /* END */
+ readlong(jj);
+ switch (jj) {
+ case 1: /* end path (stroke,fill,clip) */
+ if (!path_fill[npath]->isTransparent()) {
+ g_set_fill(path_fill[npath]);
+ g_fill();
+ }
+ if (path_stroke[npath] == static_cast<int>(true)) g_stroke();
+ if (path_clip[npath] == static_cast<int>(true)) g_clip();
+ if (npath==0) {
+ g_throw_parser_error("too many end path's");
+ break;
+ }
+ g_move(path_x[npath],path_y[npath]);
+ g_set_path(false);
+ g_set_fill(path_fill_backup[npath]);
+ npath--;
+ break;
+ case 2: /* end box */
+ cp++;
+ readlong(jj); /* jump to line */
+ if (!last_box()->isSecondPass() && g_drobj.size() != 0) {
+ mkdrobjs = g_drobj.back();
+ g_drobj.pop_back();
+ }
+ if (box_end()) {
+ *pend = 0;
+ *srclin = jj;
+ }
+ break;
+ case 3: /* end scale */
+ case 21: /* end shear */
+ case 4: /* end rotate */
+ if (g_drobj.size() != 0) {
+ mkdrobjs = g_drobj.back();
+ g_drobj.pop_back();
+ }
+ g_grestore();
+ break;
+ case 5: /* end translate */
+ g_grestore();
+ break;
+ case 6: /* end if */
+ /* do nothing, all done elsewhere I think?? */
+ break;
+ case 8: /* end name */
+ box_end();
+ break;
+ case 19: /* clip */
+ g_endclip();
+ break;
+ case 18: /* tab */
+ case 9: /* text */
+ break;
+ case 17: /* end origin */
+ g_grestore();
+ break;
+ case OP_BEGIN_OBJECT:
+ cp++;
+ end_object();
+ break;
+ case GLE_OPBEGIN_KEY:
+ case GLE_OPBEGIN_GRAPH:
+ case GLE_OPBEGIN_SURF:
+ getBlockTypes()->getBlock(jj)->endExecuteBlock();
+ break;
+ case OP_BEGIN_LENGTH:
+ end_length();
+ break;
+ default :
+ get_global_parser()->get_block_type(jj, temp_str);
+ g_throw_parser_error("invalid end of block type '", temp_str.c_str(), "'");
+ }
+ break;
+ case 15: /* FCLOSE */
+ readval(x);
+ f_close_chan((int) x);
+ break;
+ case 16: /* FILL */
+ g_fill();
+ break;
+ case 61 : /* fread CHAN a$ x */
+ case 62 : /* freadln */
+ {
+ readlong(t);
+ if (t!=49) gprint("FREAD, PCODE ERROR, %d cp %d plen %d\n",t,cp,plen);
+ readlong(i);
+ readlong(t);
+ var_get(i,&x);
+ chn = (int) x;
+ chn = f_testchan(chn);
+ if (chn == -1) break;
+ GLEFile* file = g_Files[chn];
+ if (p == 61 && cp >= cmd_plen) {
+ gprint("FREAD requires at least two parameters\n");
+ break;
+ }
+ while (cp < cmd_plen) {
+ readlong(t);
+ if (t!=49) gprint("FREAD2, PCODE ERROR, %d cp %d plen %d\n",t,cp,plen);
+ readlong(i); /* variable number */
+ readlong(t); /* type of variable */
+ if (t==1) {
+ x = atof(file->getToken());
+ var_set(i,x);
+ } else {
+ var_setstr(i,file->getToken());
+ }
+ }
+ if (p==62) file->gotoNewLine();
+ } break;
+ case 63 : /* fwrite */
+ case 64 : /* fwriteln */
+ {
+ readlong(t);
+ readlong(t);
+ readval(x);
+ chn = f_testchan((int) x);
+ if (chn == -1) break;
+ GLEFile* file = g_Files[chn];
+ if (file->isRead()) {
+ g_throw_parser_error("can't write to file opened in read mode");
+ }
+ temp_str = "";
+ while (cp < cmd_plen) {
+ readlong(t);
+ if (t!=49) gprint("WRITE, PCODE ERROR, %d cp %d plen %d\n",t,cp,plen);
+ readlong(t);
+ gstr = evalString(getStack(), getPcodeList(), pcode, &cp, true);
+ if (!temp_str.empty()) {
+ temp_str += " ";
+ }
+ temp_str += gstr->toUTF8();
+ }
+ if (p==64) temp_str += "\n";
+ fprintf(file->getOutput(),"%s",temp_str.c_str());
+ } break;
+ case 17: /* FOPEN "a.a" inchan read|write */
+ readstr(temp_str);
+ readlong(i); /* channel variable */
+ readlong(jj); /* 0 = read, 1 = write */
+ f_create_chan(i, temp_str.c_str(), jj);
+ break;
+ case 75 : /* fgetline */
+ {
+ readval(x);
+ chn = f_testchan((int) x);
+ if (chn == -1) break;
+ readlong(i);
+ var_setstr(i, g_Files[chn]->readLine());
+ } break;
+ case 76 : /* ftokenizer commenttoks spacetoks singlechartoks */
+ {
+ readval(x);
+ chn = f_testchan((int) x);
+ if (chn == -1) break;
+ GLEFile* file = g_Files[chn];
+ file->resetLang();
+ ostr = evalStringPtr(getStack(), getPcodeList(), pcode, &cp);
+ file->setCommentChars(ostr->toUTF8());
+ ostr = evalStringPtr(getStack(), getPcodeList(), pcode, &cp);
+ file->setSpaceTokens(ostr->toUTF8());
+ ostr = evalStringPtr(getStack(), getPcodeList(), pcode, &cp);
+ file->setSingleCharTokens(ostr->toUTF8());
+ } break;
+ case 77: /* papersize */
+ if (done_open) error_before_drawing_cmds("papersize");
+ readlong(jj);
+ if (jj == 1) {
+ readlong(jj);
+ g_set_pagesize(jj);
+ } else {
+ readxy(x2, y2);
+ g_set_pagesize(x2, y2);
+ }
+ break;
+ case 78: /* margins */
+ if (done_open) error_before_drawing_cmds("margins");
+ readxy(x2, y2);
+ readxy(x3, y3);
+ g_set_margins(x2, y2, x3, y3);
+ break;
+ case 79: /* orientation */
+ if (done_open) error_before_drawing_cmds("orientation");
+ readlong(jj);
+ g_set_landscape(jj);
+ break;
+ case 18: /* FOR v,exp,exp,op,exp */
+ readlong(jj); /* variable name */
+ readlong(jj2); /* jump address */
+ readval(x); /* to value */
+ ptr = *(pcode + cp); /* step value */
+ if (ptr) {
+ readvalp(z, pcode + cp + ptr);
+ } else {
+ z = 1;
+ }
+ var_get(jj, &y);
+ if (jump_back) {
+ jump_back = false;
+ /* increment loop variable y by step value z */
+ y += z;
+ var_set(jj, y);
+ }
+ if ((z >= 0 && y > x) || (z < 0 && y < x)) {
+ /* jump to line after next */
+ *srclin = jj2;
+ }
+ break;
+ case 19: /* GOTO */
+ case 20: /* GSAVE */
+ g_gsave();
+ break;
+ case 54: /* GRESTORE */
+ g_grestore();
+ break;
+ case 21: /* ICON */
+ break;
+ case 22: /* IF EXP */
+ {
+ bool ifValue = evalBool(getStack(), getPcodeList(), pcode, &cp);
+ readlong(jj); /* jump to line */
+ readlong(jj2); /* jump pcode offset */
+ if (!ifValue) {
+ *pend = jj2;
+ *srclin = jj-1;
+ return;
+ }
+ }
+ break;
+ case 23: /* INCLUDE (done in pass, already included) */
+ break;
+ case 24: /* INPUT */
+ break;
+ case 25: /* JOIN str1,type,str2 */
+ {
+ GLERC<GLEString> s1(evalStringPtr(getStack(), getPcodeList(), pcode, &cp));
+ readlong(jj);
+ GLERC<GLEString> s2(evalStringPtr(getStack(), getPcodeList(), pcode, &cp));
+ ptr = *(pcode + cp); /* curve angle1 angle2 d1 d2 */
+ if (ptr) {
+ cp += ptr;
+ readxy(x2, y2);
+ readxy(x3, y3);
+ name_join(s1.get(), s2.get(), (int)jj, x2, y2, x3, y3);
+ } else {
+ name_join(s1.get(), s2.get(), (int)jj, 0, 0, 0, 0);
+ }
+ }
+ break;
+ case 26: /* MARKER */
+ readval(x);
+ memcpy(&both.d,&x,sizeof(x));
+ jj = both.l;
+ g_get_hei(&z);
+ y = 1;
+ if (*(pcode+cp)!=0) readval(y);
+ y = y * z;
+ g_marker((int) both.l,y);
+ break;
+ case 27: /* MOVE name */
+ {
+ GLEPoint pt;
+ ostr = evalStringPtr(getStack(), getPcodeList(), pcode, &cp);
+ name_to_point(ostr, &pt);
+ g_move(pt);
+ break;
+ }
+ case 28: /* NARC */
+ readval(r);
+ readxy(a1,a2);
+ g_get_xy(&ox,&oy);
+ //
+ // -- get options center takes two arguments
+ //
+ // arrow is first
+ marrow = *(pcode + (cp++));
+ // center is a type val 2 shifts the center position
+ ptr = *(pcode + cp); /* cx,cy */
+ if (ptr) {
+ readvalp(x,pcode + cp + ptr);
+ ox+=x;
+ }
+ ptr = *(pcode + cp + 1); /* cx,cy */
+ if (ptr) {
+ readvalp(y,pcode + cp + ptr);
+ oy+=y;
+ }
+ g_narc(r, a1, a2, ox, oy, marrow);
+ break;
+ case 29: /* NEWPATH */
+ g_newpath();
+ break;
+ case 13: /* ELSE */
+ readlong(jj); /* jump to line */
+ readlong(jj2); /* jump pcode offset */
+ *pend = jj2;
+ *srclin = jj-1;
+ // do not execute any further commands on this line: return!
+ return;
+ case 30: /* NEXT */
+ readlong(jj); /* jump to line */
+ readlong(jj2); /* jump pcode offset */
+ *pend = jj2;
+ *srclin = jj-1;
+ jump_back = true;
+ break;
+ case 31: /* PIE ,, not implemented yet */
+ break;
+ case 58: /* bigfile "filename" */
+ printf("BIGFILE no longer supported, sorry. use include");
+ // readstr(ss);
+ // gle_strlwr(ss); /* bit of a kludge but ... */
+ // run_bigfile(ss);
+ break;
+ case 55: /* Postscript filename x y */
+ readstr(temp_str);
+ readxy(x1,y1);
+ g_postscript((char*)temp_str.c_str(), x1, y1);
+ break;
+ case 67: /* TIFF filename x y */
+ readstr(temp_str);
+ readxy(x1,y1);
+ g_bitmap(temp_str, x1, y1, BITMAP_TYPE_TIFF);
+ break;
+ case 68: /* BITMAP file width height [type colors compress dpi greyscale resize] */
+ {
+ readstr(temp_str);
+ readxy(x1,y1);
+ // The options type, compress, dpi, greyscale, ...
+ // will be implemented in the near future (Jan Struyf 01//05/05).
+ cp += 5;
+ int bm_type = 0;
+ ptr = *(pcode + cp); /* type */
+ if (ptr) {
+ readstrp(pcode + cp + ptr);
+ bm_type = g_bitmap_string_to_type(ostr->toUTF8());
+ }
+ g_bitmap(temp_str, x1, y1, bm_type);
+ }
+ break;
+ case 69: /* BITMAP_INFO file width, height [type] */
+ {
+ readstr(temp_str);
+ readlong(jj); readlong(jj2);
+ int bm_type = 0;
+ ptr = *(pcode + cp); /* type */
+ if (ptr) {
+ readstrp(pcode + cp + ptr);
+ bm_type = g_bitmap_string_to_type(ostr->toUTF8());
+ }
+ g_bitmap_info(temp_str, jj, jj2, bm_type);
+ }
+ break;
+ case GLE_KW_COLORMAP:
+ {
+ GLEColorMap map;
+ GLEToRectangularView view;
+ ostr = evalStringPtr(getStack(), getPcodeList(), pcode, &cp);
+ map.setFunction(ostr->toUTF8());
+ readxy(x1, y1);
+ view.setXRange(x1, y1);
+ readxy(x1, y1);
+ view.setYRange(x1, y1);
+ readxy(x1, y1);
+ map.setWidth((int)floor(x1+0.5));
+ map.setHeight((int)floor(y1+0.5));
+ readxy(x1, y1);
+ ptr = *(pcode + cp); /* color */
+ if (ptr) {
+ map.setColor(true);
+ }
+ ptr = *(pcode + ++cp); /* palette */
+ if (ptr) {
+ readstrp(pcode + cp + ptr);
+ temp_str = ostr->toUTF8();
+ // because palette can be subroutine name!
+ str_to_uppercase(temp_str);
+ map.setPalette(temp_str.c_str());
+ }
+ g_get_xy(&ox,&oy);
+ view.setOrigin(GLEPoint(ox, oy));
+ view.setSize(GLEPoint(x1, y1));
+ map.draw(&view, ox, oy, x1, y1);
+ }
+ break;
+ case 33: /* RBEZIER */
+ readxy(x1,y1);
+ readxy(x2,y2);
+ readxy(x3,y3);
+ g_get_xy(&ox,&oy);
+ x1 += ox; x2 += ox; x3 += ox;
+ y1 += oy; y2 += oy; y3 += oy;
+ g_bezier(x1,y1,x2,y2,x3,y3);
+ break;
+ case 34: /* REGION */
+ break;
+ case 50: /* RETURN exp */
+ GLE_MC_COPY(&m_returnValue, evalGeneric(getStack(), getPcodeList(), pcode, &cp));
+ readlong(jj); /* jump to line */
+ *srclin = jj-1;
+ break;
+ case 35: /* REVERSE */
+ g_reverse();
+ break;
+ case 36: /* RLINE */
+ readval(x);
+ readval(y);
+ g_get_xy(&ox,&oy);
+ marrow = *(pcode + (cp++));
+ ptr = *(pcode + cp); /* curve angle1 angle2 d1 d2 */
+ if (ptr) {
+ cp += ptr;
+ readxy(x2, y2);
+ readxy(x3, y3);
+ g_arrowcurve(x+ox, y+oy, marrow, x2, y2, x3, y3);
+ } else {
+ GLELineDO drawobj(ox, oy, ox+x, oy+y);
+ drawobj.setArrow((GLEHasArrow)marrow);
+ handleNewDrawObject(&drawobj, mkdrobjs);
+ if (!mkdrobjs) g_arrowline(ox+x, oy+y, marrow, can_fillpath);
+ }
+ break;
+ case 37: /* RMOVE */
+ readval(x);
+ readval(y);
+ g_get_xy(&ox,&oy);
+ g_move(x+ox,y+oy);
+ break;
+ case 38: /* ROTATE */
+ readval(x);
+ g_rotate(x);
+ break;
+ case 39: /* SAVE name */
+ g_get_xy(&x,&y);
+ ostr = evalStringPtr(getStack(), getPcodeList(), pcode, &cp);
+ name_set(ostr,x,y,x,y);
+ break;
+ case 40: /* SCALE */
+ readxy(x,y);
+ g_scale(x,y);
+ break;
+ case GLE_KW_SET: /* SET */
+ while (cp < cmd_plen) {
+ cp++;
+ int set_cmd = *(pcode+cp-1)-500;
+ dbg gprint("set sub command %d \n",set_cmd);
+ switch (set_cmd) {
+ case 1: /* height */
+ readval(x);
+ g_set_hei(x);
+ break;
+ case 2: /* font */
+ readval(x);
+ memcpy(&both.l,&x,4);
+ g_set_font(both.l);
+ break;
+ case 3: /* justify */
+ readval(x);
+ memcpy(&both.l,&x,4);
+ g_set_just(both.l);
+ break;
+ case 4: /* color */
+ g_set_color(evalColor(getStack(), getPcodeList(), pcode, &cp));
+ break;
+ case OP_SET_BACKGROUND: /* background */
+ g_set_background(evalColor(getStack(), getPcodeList(), pcode, &cp));
+ break;
+ case OP_SET_FILL: /* fill */
+ g_set_fill(evalColor(getStack(), getPcodeList(), pcode, &cp));
+ break;
+ case OP_SET_FILL_PATTERN: /* fill pattern */
+ g_set_fill_pattern(evalColor(getStack(), getPcodeList(), pcode, &cp));
+ break;
+ case 5: /* dashlen */
+ readval(x);
+ g_set_line_styled(x);
+ break;
+ case 6: /* dash */
+ readval(x);
+ i = (int) x;
+ sprintf(ss,"%d",i);
+ g_set_line_style(ss);
+ break;
+ case 7: /* lwidth */
+ readval(x);
+ g_set_line_width(x);
+ break;
+ case 10: /* fontlwidth */
+ readval(x);
+ g_set_font_width(x);
+ break;
+ case 8: /* join */
+ readlong(jj);
+ g_set_line_join(jj);
+ break;
+ case 9: /* cap */
+ readlong(jj);
+ g_set_line_cap(jj);
+ break;
+ case OP_SET_FILL_METHOD:
+ readstr(ss1);
+ g_set_fill_method(ss1.c_str());
+ break;
+ case OP_SET_ARROW_STYLE:
+ readstr(ss1);
+ g_set_arrow_style(ss1.c_str());
+ break;
+ case OP_SET_ARROW_TIP:
+ readstr(ss1);
+ g_set_arrow_tip(ss1.c_str());
+ break;
+ case OP_SET_ARROW_SIZE:
+ readval(x);
+ g_set_arrow_size(x);
+ break;
+ case OP_SET_ARROW_ANGLE:
+ readval(x);
+ g_set_arrow_angle(x);
+ break;
+ case OP_SET_IMAGE_FORMAT:
+ readstr(ss1);
+ g_set_pdf_image_format(ss1.c_str());
+ break;
+ case OP_SET_TEX_SCALE:
+ readstr(ss1);
+ g_set_tex_scale(ss1.c_str());
+ break;
+ case OP_SET_TEX_LABELS:
+ readval(x);
+ g_set_tex_labels((int)floor(x+0.5));
+ break;
+ case OP_SET_TITLE_SCALE:
+ case OP_SET_ATITLE_SCALE:
+ case OP_SET_ALABEL_SCALE:
+ case OP_SET_TICKS_SCALE:
+ case OP_SET_ATITLE_DIST:
+ case OP_SET_ALABEL_DIST:
+ readval(x);
+ g_set_fconst(set_cmd-OP_SET_TITLE_SCALE+GLEC_TITLESCALE, x);
+ break;
+ default :
+ gprint("Not a valid set sub command {%d} i=%d \n",*(pcode+i),i);
+ }
+ }
+ break;
+ case 42: /* size x y [box]*/
+ if (done_open) error_before_drawing_cmds("size");
+ readxy(x,y);
+ g_set_size(x, y, *(pcode + cp++));
+ break;
+ case 43: /* STROKE */
+ g_stroke();
+ break;
+ case 44: /* SUB */
+ readlong(jj);
+ sub_get_startend(jj,&i,&j);
+ *srclin = j; /* skip past the subroutine */
+ break;
+ case 45: /* TEXT */
+ temp_str = (char *) (pcode+cp);
+ if (mkdrobjs) {
+ g_get_xy(&orig);
+ GLETextDO drawobj(orig, temp_str);
+ handleNewDrawObject(&drawobj, mkdrobjs);
+ } else {
+ g_text(temp_str);
+ }
+ break;
+ case 60: /* DEFMARKER */
+ break;
+ case 56: /* DRAW */
+ readlong(jj);
+ if (jj == 0) {
+ // draw static object
+ string path;
+ string name;
+ readstr(path);
+ readstr(name);
+ draw_object_static(path, name, pcode, &cp, mkdrobjs);
+ } else {
+ // draw dynamic object (as before?)
+ readstr(temp_str);
+ ptr = *(pcode + ++cp); /* name */
+ if (ptr) {
+ readstrp(pcode + cp + ptr);
+ string obj_name = ostr->toUTF8();
+ draw_object(temp_str, obj_name.c_str());
+ } else {
+ draw_object(temp_str, NULL);
+ }
+ }
+ break;
+ case 59: /* TEXTDEF */
+ strcpy(ss,(char *) (pcode+cp));
+ text_def((unsigned char*) ss);
+ break;
+ case 46: /* TRANSLATE */
+ readxy(x,y);
+ g_translate(x,y);
+ break;
+ case 47: /* UNTIL */
+ readval(x);
+ readlong(jj);
+ jump_back = false;
+ if (x) *srclin = jj;
+ break;
+ case 48: /* WHILE */
+ {
+ bool ifValue = evalBool(getStack(), getPcodeList(), pcode, &cp);
+ readlong(jj);
+ jump_back = false;
+ if (!ifValue) *srclin = jj;
+ }
+ break;
+ case 32: /* PRINT */
+ case 49: /* WRITE */
+ g_get_xy(&orig);
+ temp_str = "";
+ while (cp < cmd_plen) {
+ readlong(t);
+ if (t != 49 && t != 32) {
+ g_throw_parser_error("pcode error in print/write");
+ }
+ readlong(t);
+ gstr = evalString(getStack(), getPcodeList(), pcode, &cp, true);
+ if (!temp_str.empty()) {
+ temp_str += " ";
+ }
+ temp_str += gstr->toUTF8();
+ }
+ if (p == 49) {
+ /* WRITE */
+ if (g_get_tex_labels()) {
+ TeXInterface::getInstance()->draw(temp_str.c_str());
+ } else {
+ if (mkdrobjs) {
+ GLETextDO drawobj(orig, temp_str);
+ handleNewDrawObject(&drawobj, mkdrobjs, &orig);
+ } else {
+ g_text(temp_str);
+ }
+ }
+ g_move(orig);
+ } else {
+ /* PRINT */
+ g_message(temp_str);
+ }
+ break;
+ case 74: /* TeX */
+ {
+ x = 0.0;
+ GLERectangle box;
+ ostr = evalStringPtr(getStack(), getPcodeList(), pcode, &cp);
+ TeXInterface::getInstance()->draw(ostr->toUTF8(), &box);
+ ptr = *(pcode + cp); /* add */
+ if (ptr) {
+ readvalp(x, pcode + cp + ptr);
+ }
+ ptr = *(pcode + ++cp); /* name */
+ if (ptr) {
+ readstrp(pcode + cp + ptr);
+ box.getDimensions(&x1,&y1,&x2,&y2);
+ x1 -= x; x2 += x; y1 -= x; y2 += x;
+ name_set(ostr,x1,y1,x2,y2);
+ }
+ }
+ break;
+ case GLE_KW_RESTOREDEFAULTS:
+ g_restore_defaults();
+ break;
+ case GLE_KW_SLEEP:
+ readval(x);
+ GLESleep((int)floor(x*1000+0.5));
+ break;
+ case GLE_KW_BLOCK_COMMAND:
+ readlong(jj); /* block type */
+ getBlockTypes()->getBlock(jj)->executeLine(sline);
+ break;
+ default :
+ byte_code_error(PCODE_UNKNOWN_COMMAND);
+ }
+ // begin can't be combined with other commands
+ if (p == 5) break;
+ cp = cmd_plen;
+ }
+}
+
+GLEBox::GLEBox():
+ m_HasStroke(true),
+ m_HasReverse(false),
+ m_Add(0.0),
+ m_IsRound(false),
+ m_Round(0.0),
+ m_Fill(g_get_fill_clear())
+{
+}
+
+void GLEBox::setFill(const GLERC<GLEColor>& fill) {
+ m_Fill = fill;
+}
+
+void GLEBox::setRound(double round) {
+ if (round == 0.0) {
+ m_IsRound = false;
+ } else {
+ m_IsRound = true;
+ m_Round = round;
+ }
+}
+
+void do_arcto(double x1, double y1, double x2, double y2, double r) {
+ double ox, oy;
+ g_get_xy(&ox,&oy);
+ g_arcto(x1+ox,y1+oy,x2+ox+x1,y2+oy+y1,r);
+}
+
+void GLEBox::draw(GLERun* run, double x1, double y1, double x2, double y2) {
+ double ox, oy;
+ GLERectangle rect(x1, y1, x2, y2);
+ rect.normalize();
+ rect.grow(getAdd());
+ g_get_xy(&ox, &oy);
+ GLERC<GLEColor> cur_fill(g_get_fill());
+ if (isRound()) {
+ int oldjoin;
+ g_get_line_join(&oldjoin);
+ g_set_line_join(1);
+ g_set_path(true);
+ g_newpath();
+ g_move(rect.getXMin()+getRound(), rect.getYMax());
+ g_arcto(rect.getXMin(), rect.getYMax(), rect.getXMin(), rect.getYMax()-getRound(), getRound());
+ g_line(rect.getXMin(), rect.getYMin()+getRound());
+ g_arcto(rect.getXMin(), rect.getYMin(), rect.getXMin()+getRound(), rect.getYMin(), getRound());
+ g_line(rect.getXMax()-getRound(), rect.getYMin());
+ g_arcto(rect.getXMax(), rect.getYMin(), rect.getXMax(), rect.getYMin()+getRound(), getRound());
+ g_line(rect.getXMax(), rect.getYMax()-getRound());
+ g_arcto(rect.getXMax(), rect.getYMax(), rect.getXMax()-getRound(), rect.getYMax(), getRound());
+ g_closepath();
+ if (isFilled()) {
+ g_set_fill(getFill());
+ g_fill();
+ }
+ if (hasStroke()) {
+ g_stroke();
+ }
+ g_set_path(false);
+ g_set_line_join(oldjoin);
+ } else {
+ if (isFilled()) {
+ g_set_fill(getFill());
+ g_box_fill(&rect);
+ }
+ if (hasStroke()) {
+ g_box_stroke(&rect, hasReverse());
+ }
+ }
+ g_set_fill(cur_fill);
+ if (hasName()) {
+ run->name_set(getName(), rect.getXMin(), rect.getYMin(), rect.getXMax(), rect.getYMax());
+ }
+ g_move(ox, oy);
+}
+
+GLEStoredBox::GLEStoredBox():
+ m_SecondPass(false),
+ m_Device(0)
+{
+}
+
+GLEStoredBox* box_start() {
+ double ox, oy;
+ GLEStoredBox* box = GLEBoxStack::getInstance()->newBox();
+ g_get_xy(&ox, &oy);
+ box->setOrigin(ox, oy);
+ g_get_bounds(box->getSaveBounds());
+ g_init_bounds();
+ return box;
+}
+
+GLEStoredBox* GLERun::last_box() throw (ParserError) {
+ GLEBoxStack* stack = GLEBoxStack::getInstance();
+ if (stack->size() <= 0) {
+ g_throw_parser_error("too many end boxes");
+ }
+ return stack->lastBox();
+}
+
+bool GLERun::box_end() throw (ParserError) {
+ double x1, y1, x2, y2;
+ GLEBoxStack* stack = GLEBoxStack::getInstance();
+ if (stack->size() <= 0) {
+ g_throw_parser_error("too many end boxes");
+ }
+ g_get_bounds(&x1, &y1, &x2, &y2);
+ if (x1 > (x2+100)) {
+ ostringstream err;
+ err << "empty box (bounds are " << x1 << "," << y1 << " x "<< x2 << "," << y2 << ")?" << endl;
+ g_throw_parser_error(err.str());
+ }
+ GLEStoredBox* box = stack->lastBox();
+ if (box->isSecondPass()) {
+ stack->removeBox();
+ return false;
+ }
+ if (box->getDevice() != NULL) {
+ g_restore_device(box->getDevice());
+ }
+ box->setName(box->hasName() ? box->getName() : NULL);
+ box->draw(this, x1, y1, x2, y2);
+ if (box->getSaveBounds()->isValid()) {
+ g_update_bounds(box->getSaveBounds());
+ }
+ if (box->getDevice() != NULL) {
+ box->setSecondPass(true);
+ g_move(box->getOrigin());
+ return true;
+ } else {
+ stack->removeBox();
+ return false;
+ }
+}
+
+void nm_adjust(GLEJustify jj, double *sx, double *sy, double ex, double ey, GLERectangle* r);
+
+void GLERun::name_set(GLEString* name, double x1, double y1, double x2, double y2) {
+ GLERC<GLEObjectRepresention> obj(new GLEObjectRepresention());
+ obj->getRectangle()->setDimensions(x1, y1, x2, y2);
+ g_dev(obj->getRectangle());
+ if (!getCRObjectRep()->setChildObject(name, obj.get())) {
+ char ostr[80];
+ int idx, type;
+ name->toUTF8(ostr);
+ getVars()->findAdd(ostr, &idx, &type);
+ getVars()->setObject(idx, obj.get());
+ }
+}
+
+bool GLERun::is_name(GLEObjectRepresention* obj, GLEArrayImpl* path, unsigned int offs) {
+ /* check for just object name */
+ unsigned int size = path->size();
+ if (size <= offs) {
+ return true;
+ }
+ /* traverse path */
+ for (unsigned int i = offs; i < size; i++) {
+ GLEString* elem = (GLEString*)path->getObjectUnsafe(i);
+ GLEObjectRepresention* nextobj = obj->getChildObject(elem);
+ if (nextobj != NULL) {
+ obj = nextobj;
+ } else {
+ return false;
+ }
+ }
+ return true;
+}
+
+GLEObjectRepresention* GLERun::name_to_object(GLEObjectRepresention* obj, GLEArrayImpl* path, GLEJustify* just, unsigned int offs) throw (ParserError) {
+ /* check for just object name */
+ unsigned int size = path->size();
+ if (size <= offs) {
+ *just = GLEJusitfyBox;
+ return obj;
+ }
+ /* traverse path */
+ for (unsigned int i = offs; i < size-1; i++) {
+ GLEString* elem = (GLEString*)path->getObjectUnsafe(i);
+ GLEObjectRepresention* nextobj = obj->getChildObject(elem);
+ if (nextobj != NULL) {
+ obj = nextobj;
+ } else {
+ ostringstream str;
+ GLEStringHash* childs = obj->getChilds();
+ if (childs == NULL) {
+ str << "object does not contain name '" << *elem << "'";
+ } else {
+ GLEArrayImpl keys;
+ childs->getKeys(&keys);
+ str << "object does not contain name '" << *elem << "'; ";
+ if (keys.size() == 0) {
+ str << "no available names";
+ } else {
+ str << "available names:" << endl;
+ keys.enumStrings(str);
+ }
+ }
+ g_throw_parser_error(str.str());
+ }
+ }
+ /* should now be justify specification? */
+ GLEString* last_elem = (GLEString*)path->getObjectUnsafe(size-1);
+ GLEObjectRepresention* last_obj = obj->getChildObject(last_elem);
+ if (last_obj == NULL) {
+ char str[80];
+ last_elem->toUTF8(str);
+ if (!gt_firstval_err(op_justify, str, (int*)just)) {
+ ostringstream str;
+ GLEStringHash* childs = obj->getChilds();
+ if (childs == NULL) {
+ str << "'" << *last_elem << "' is not a valid justify option (e.g., 'left', 'center', ...)";
+ } else {
+ GLEArrayImpl keys;
+ childs->getKeys(&keys);
+ str << "'" << *last_elem << "' is not a child object name or justify option" << endl;
+ str << "Available names:" << endl;
+ keys.enumStrings(str);
+ }
+ g_throw_parser_error(str.str());
+ }
+ } else {
+ obj = last_obj;
+ *just = GLEJusitfyBox;
+ }
+ return obj;
+}
+
+bool GLERun::is_name(GLEString* name) {
+ int idx, type;
+ GLERC<GLEArrayImpl> path(name->split('.'));
+ GLEString* objname = (GLEString*)path->getObjectUnsafe(0);
+ std::string str(objname->toUTF8());
+ getVars()->find(str, &idx, &type);
+ if (idx != -1) {
+ GLEDataObject* obj = getVars()->getObject(idx);
+ if (obj != NULL && obj->getType() == GLEObjectTypeObjectRep) {
+ return is_name((GLEObjectRepresention*)obj, path.get(), 1);
+ }
+ }
+ GLEObjectRepresention* obj = getCRObjectRep();
+ if (obj->isChildObjectsEnabled()) {
+ return is_name(obj, path.get(), 0);
+ }
+ return false;
+}
+
+GLEObjectRepresention* GLERun::name_to_object(GLEString* name, GLEJustify* just) throw(ParserError) {
+ int idx, type;
+ GLERC<GLEArrayImpl> path(name->split('.'));
+ GLEString* objname = (GLEString*)path->getObjectUnsafe(0);
+ std::string str(objname->toUTF8());
+ getVars()->find(str, &idx, &type);
+ if (idx != -1) {
+ GLEDataObject* obj = getVars()->getObject(idx);
+ if (obj != NULL && obj->getType() == GLEObjectTypeObjectRep) {
+ return name_to_object((GLEObjectRepresention*)obj, path.get(), just, 1);
+ } else {
+ string err = getVars()->typeError(idx, GLEObjectTypeObjectRep);
+ g_throw_parser_error(err);
+ }
+ } else {
+ GLEObjectRepresention* obj = getCRObjectRep();
+ if (obj->isChildObjectsEnabled()) {
+ return name_to_object(obj, path.get(), just, 0);
+ } else {
+ ostringstream str;
+ str << "name '" << *objname << "' not defined";
+ g_throw_parser_error(str.str());
+ }
+ }
+ return NULL;
+}
+
+void GLERun::name_to_point(GLEString* name, GLEPoint* point) throw(ParserError) {
+ GLEJustify just;
+ GLEObjectRepresention* obj = name_to_object(name, &just);
+ if (obj != NULL) {
+ GLERectangle rect;
+ rect.copy(obj->getRectangle());
+ g_undev(&rect);
+ rect.toPoint(just, point);
+ } else {
+ point->setXY(0, 0);
+ }
+}
+
+void GLERun::name_to_size(GLEString* name, double *wd, double *hi) throw(ParserError) {
+ GLEJustify just;
+ GLEObjectRepresention* obj = name_to_object(name, &just);
+ if (obj != NULL) {
+ GLERectangle rect;
+ rect.copy(obj->getRectangle());
+ g_undev(&rect);
+ *wd = rect.getWidth();
+ *hi = rect.getHeight();
+ } else {
+ *wd = 0.0; *hi = 0.0;
+ }
+}
+
+void GLERun::name_join(GLEString *n1, GLEString *n2, int marrow, double a1, double a2, double d1, double d2) throw(ParserError) {
+ GLEJustify j1, j2;
+ GLEObjectRepresention* obj1 = name_to_object(n1, &j1);
+ GLEObjectRepresention* obj2 = name_to_object(n2, &j2);
+ if (j1 == GLEJustifyHorz || j1 == GLEJustifyVert) {
+ GLEObjectRepresention* tmpo = obj1; obj1 = obj2; obj2 = tmpo;
+ GLEJustify tmpj = j1; j1 = j2; j2 = tmpj;
+ if (marrow==2) marrow = 1;
+ else if (marrow==1) marrow = 2;
+ }
+ GLERectangle rect1, rect2;
+ rect1.copy(obj1->getRectangle());
+ rect2.copy(obj2->getRectangle());
+ g_undev(&rect1);
+ g_undev(&rect2);
+ GLEPoint p1, p2;
+ rect1.toPoint(j1, &p1);
+ p2.set(p1); /* start with location of p1 for .h and .v joining */
+ rect2.toPoint(j2, &p2);
+ double sx = p1.getX();
+ double sy = p1.getY();
+ double ex = p2.getX();
+ double ey = p2.getY();
+ nm_adjust(j1, &sx, &sy, p2.getX(), p2.getY(), &rect1);
+ nm_adjust(j2, &ex, &ey, p1.getX(), p1.getY(), &rect2);
+ g_move(sx,sy);
+ if (marrow==2) marrow = 1;
+ else if (marrow==1) marrow = 2;
+ g_arrowcurve(ex, ey, marrow, a1, a2, d1, d2);
+}
+
+void GLERun::draw_object_static(const string& path, const string& name, int* pcode, int* cp, bool mkdrobjs) throw (ParserError) {
+ int cp_backup = *cp;
+ GLEPoint orig;
+ g_get_xy(&orig);
+ GLEString s_path(path.c_str());
+ GLERC<GLEArrayImpl> a_path(s_path.split('.'));
+ bool hasoffs = (a_path->size() > 1);
+ GLEDevice* olddev = NULL;
+ if (hasoffs && !g_is_dummy_device()) {
+ /* Do not actually draw */
+ olddev = g_set_dummy_device();
+ }
+ /* backup old object and create new one */
+ GLERC<GLEObjectRepresention> crobj(getCRObjectRep());
+ GLEObjectRepresention* newobj = new GLEObjectRepresention();
+ newobj->enableChildObjects();
+ setCRObjectRep(newobj);
+ /* draw to measure */
+ GLEMeasureBox measure;
+ measure.measureStart();
+ g_move(0.0, 0.0);
+ GLERC<GLEArrayImpl> stk(new GLEArrayImpl());
+ if (mkdrobjs) {
+ GLESub* sub = eval_subroutine_call(stk.get(), getPcodeList(), pcode, cp);
+ sub->setScript(getScript());
+ GLEObjectDOConstructor* cons = sub->getObjectDOConstructor();
+ GLEObjectDO objdo(cons);
+ objdo.setPosition(orig);
+ GLEString* refpt = new GLEString();
+ refpt->join('.', a_path.get(), 1);
+ objdo.setRefPointString(refpt);
+ eval_do_object_block_call(stk.get(), sub, &objdo);
+ handleNewDrawObject(&objdo, mkdrobjs, &orig);
+ } else {
+ evalGeneric(getStack(), getPcodeList(), pcode, cp);
+ }
+ if (hasoffs) measure.measureEndIgnore();
+ else measure.measureEnd();
+ newobj->getRectangle()->copy(&measure);
+ /* restore device */
+ g_restore_device(olddev);
+ /* draw for real */
+ if (hasoffs) {
+ /* find offset */
+ GLEJustify just;
+ GLEPoint transl;
+ GLEObjectRepresention* obj = name_to_object(newobj, a_path.get(), &just, 1);
+ GLERectangle rect(obj->getRectangle());
+ if (obj != newobj) g_undev(&rect);
+ rect.toPoint(just, &transl);
+ transl.subtractFrom(&orig);
+ newobj->getRectangle()->translate(&transl);
+ if (olddev != NULL && !mkdrobjs) {
+ /* draw for real */
+ g_gsave();
+ g_translate(transl.getX(), transl.getY());
+ *cp = cp_backup;
+ g_move(0.0, 0.0);
+ evalGeneric(getStack(), getPcodeList(), pcode, cp);
+ g_grestore();
+ } else {
+ /* dummy device, just update bounds */
+ g_update_bounds(newobj->getRectangle());
+ /* move child objects */
+ g_dev_rel(&transl);
+ newobj->translateChildrenRecursive(&transl);
+ }
+ }
+ /* convert rectangle to device coordinates */
+ g_dev(newobj->getRectangle());
+ /* store object representation to variable */
+ GLERC<GLEString> objname = (GLEString*)a_path->getObjectUnsafe(0);
+ if (name != "") {
+ objname = new GLEString(name);
+ }
+ if (!crobj->setChildObject(objname.get(), newobj)) {
+ char ostr[500];
+ int idx, type;
+ objname->toUTF8(ostr);
+ getVars()->findAdd(ostr, &idx, &type);
+ getVars()->setObject(idx, newobj);
+ }
+ /* restore old object */
+ setCRObjectRep(crobj.get());
+ g_move(orig);
+}
+
+void GLERun::draw_object_subbyname(GLESub* sub, GLEObjectRepresention* newobj, GLEArrayImpl* path, GLEPoint* orig) throw (ParserError) {
+ bool hasoffs = (path->size() > 1);
+ GLEDevice* olddev = NULL;
+ if (hasoffs && !g_is_dummy_device()) {
+ /* Do not actually draw */
+ olddev = g_set_dummy_device();
+ }
+ /* draw to measure */
+ GLEMeasureBox measure;
+ measure.measureStart();
+ g_move(0.0, 0.0);
+ /* call subroutine */
+ sub_call(sub);
+ if (hasoffs) measure.measureEndIgnore();
+ else measure.measureEnd();
+ newobj->getRectangle()->copy(&measure);
+ /* draw for real */
+ if (hasoffs) {
+ /* find offset */
+ GLEJustify just;
+ GLEPoint transl;
+ GLEObjectRepresention* obj = name_to_object(newobj, path, &just, 1);
+ GLERectangle rect(obj->getRectangle());
+ if (obj != newobj) g_undev(&rect);
+ rect.toPoint(just, &transl);
+ transl.subtractFrom(orig);
+ newobj->getRectangle()->translate(&transl);
+ if (olddev != NULL) {
+ /* draw for real */
+ g_restore_device(olddev);
+ g_gsave();
+ g_translate(transl.getX(), transl.getY());
+ g_move(0.0, 0.0);
+ /* call subroutine */
+ sub_call(sub);
+ g_grestore();
+ } else {
+ /* dummy device, just update bounds */
+ g_update_bounds(newobj->getRectangle());
+ /* move child objects */
+ g_dev_rel(&transl);
+ GLEObjectRepresention* newobj = getCRObjectRep();
+ newobj->translateChildrenRecursive(&transl);
+ }
+ }
+}
+
+void GLERun::draw_object_dynamic(int idx, GLEObjectRepresention* newobj, GLEArrayImpl* path, GLEPoint* orig) throw (ParserError) {
+ GLEDataObject* obj = getVars()->getObject(idx);
+ if (obj == NULL || obj->getType() != GLEObjectTypeObjectRep) {
+ string err = getVars()->typeError(idx, GLEObjectTypeObjectRep);
+ g_throw_parser_error(err);
+ }
+ GLEObjectRepresention* drawobj = (GLEObjectRepresention*)obj;
+ GLEDynamicSub* dynsub = drawobj->getSub();
+ if (dynsub == NULL) {
+ string err = getVars()->typeError(idx, GLEObjectTypeDynamicSub);
+ g_throw_parser_error(err);
+ }
+ /* backup old object and create new one */
+ gmodel* oldstate = dynsub->getState();
+ newobj->getRectangle()->copy(drawobj->getRectangle());
+ g_undev(newobj->getRectangle(), oldstate);
+ /* find out translation offset */
+ GLEPoint transl;
+ if (path->size() > 1) {
+ /* find offset */
+ GLEJustify just;
+ GLEObjectRepresention* obj = name_to_object(drawobj, path, &just, 1);
+ GLERectangle rect(obj->getRectangle());
+ g_undev(&rect, oldstate);
+ rect.toPoint(just, &transl);
+ transl.subtractFrom(orig);
+ newobj->getRectangle()->translate(&transl);
+ }
+ /* draw object */
+ if (!g_is_dummy_device()) {
+ g_gsave();
+ g_translate(transl.getX(), transl.getY());
+ GLESub* sub = dynsub->getSub();
+ GLEVarMap* save_var_map = NULL;
+ GLELocalVars* local_vars = dynsub->getLocalVars();
+ if (local_vars != NULL) {
+ var_alloc_local(local_vars->size());
+ GLELocalVars* new_local_vars = get_local_vars();
+ new_local_vars->copyFrom(local_vars);
+ GLEVarMap* local_var_map = sub->getParentSub()->getLocalVars();
+ save_var_map = var_swap_local_map(local_var_map);
+ }
+ g_move(0.0, 0.0);
+ g_set_partial_state(oldstate);
+ int endp = 0;
+ bool mkdrobjs = false;
+ for (int i = sub->getStart() + 1; i < sub->getEnd(); i++) {
+ GLESourceLine* line = getSource()->getLine(i - 1);
+ do_pcode(*line, &i, gpcode[i], gplen[i], &endp, mkdrobjs);
+ }
+ if (local_vars != NULL) {
+ var_free_local();
+ var_set_local_map(save_var_map);
+ }
+ g_grestore();
+ } else {
+ /* dummy device, just update bounds */
+ g_update_bounds(newobj->getRectangle());
+ /* copy names */
+ drawobj->copyChildrenRecursive(newobj, oldstate);
+ /* move child objects */
+ g_dev_rel(&transl);
+ newobj->translateChildrenRecursive(&transl);
+ }
+}
+
+void GLERun::draw_object(const string& path, const char* newname) throw (ParserError) {
+ int idx, type;
+ char ostr[255];
+ GLEPoint orig;
+ g_get_xy(&orig);
+ GLESub* sub = NULL;
+ GLEString s_path(path.c_str());
+ GLERC<GLEArrayImpl> a_path(s_path.split('.'));
+ GLERC<GLEString> objname = (GLEString*)a_path->getObjectUnsafe(0);
+ objname->toUTF8(ostr);
+ getVars()->find(ostr, &idx, &type);
+ if (idx == -1) {
+ gle_strupr(ostr);
+ string myname = ostr;
+ sub = getSubroutines()->get(myname);
+ if (sub != NULL && sub->getNbParam() != 0) sub = NULL;
+ }
+ if (idx == -1 && sub == NULL) {
+ ostringstream err;
+ err << "no object named '" << *objname << "'";
+ g_throw_parser_error(err.str());
+ }
+ GLERC<GLEObjectRepresention> crobj(getCRObjectRep());
+ GLEObjectRepresention* newobj = new GLEObjectRepresention();
+ newobj->enableChildObjects();
+ setCRObjectRep(newobj);
+ if (sub != NULL) draw_object_subbyname(sub, newobj, a_path.get(), &orig);
+ else draw_object_dynamic(idx, newobj, a_path.get(), &orig);
+ /* convert rectangle to device coordinates */
+ g_dev(newobj->getRectangle());
+ if (newname != NULL) {
+ objname = new GLEString(newname);
+ }
+ if (!crobj->setChildObject(objname.get(), newobj)) {
+ int idx, type;
+ objname->toUTF8(ostr);
+ getVars()->findAdd(ostr, &idx, &type);
+ getVars()->setObject(idx, newobj);
+ }
+ /* restore old object */
+ setCRObjectRep(crobj.get());
+ g_move(orig);
+}
+
+void GLERun::begin_object(const std::string& name, GLESub* sub) throw (ParserError) {
+ GLEStoredBox* box = box_start();
+ box->setStroke(false);
+ box->setObjectRep(getCRObjectRep());
+ /* create new object */
+ GLEObjectRepresention* newobj = new GLEObjectRepresention();
+ newobj->enableChildObjects();
+ setCRObjectRep(newobj);
+ /* set name */
+ int idx, type;
+ getVars()->findAdd(name.c_str(), &idx, &type);
+ getVars()->setObject(idx, newobj);
+ /* create corresponding dynamic subroutine */
+ GLEDynamicSub* dynsub = new GLEDynamicSub(sub);
+ newobj->setSub(dynsub);
+ /* store local variables */
+ GLESub* parent = sub->getParentSub();
+ if (parent != NULL) {
+ GLEVarMap* local_var_map = parent->getLocalVars();
+ GLELocalVars* local_vars = get_local_vars();
+ if (local_vars != NULL && local_var_map != NULL) {
+ dynsub->setLocalVars(local_vars->clone(local_var_map->size()));
+ }
+ }
+ /* store graphics state */
+ g_move(0.0, 0.0);
+ gmodel* state = new gmodel();
+ g_get_state(state);
+ dynsub->setState(state);
+ /* Do not actually draw */
+ if (!g_is_dummy_device()) {
+ box->setDevice(g_set_dummy_device());
+ }
+}
+
+void GLERun::end_object() throw (ParserError) {
+ GLEBoxStack* stack = GLEBoxStack::getInstance();
+ if (stack->size() <= 0) {
+ g_throw_parser_error("too many end boxes");
+ }
+ GLEStoredBox* box = stack->lastBox();
+ /* Get coords of box */
+ GLERectangle measure;
+ g_get_bounds(&measure);
+ if (!measure.isValid()) {
+ ostringstream err;
+ err << "empty box: " << measure << endl;
+ g_throw_parser_error(err.str());
+ }
+ /* Store coordinates of object */
+ GLEObjectRepresention* newobj = getCRObjectRep();
+ if (newobj != NULL) {
+ newobj->getRectangle()->copy(&measure);
+ /* convert rectangle to device coordinates */
+ g_dev(newobj->getRectangle());
+ }
+ /* restore old object */
+ setCRObjectRep(box->getObjectRep());
+ /* Restore out device */
+ if (box->getDevice() != NULL) {
+ g_restore_device(box->getDevice());
+ }
+ /* Reset bounds as if nothing happened */
+ g_set_bounds(box->getSaveBounds());
+ g_move(box->getOrigin());
+ /* Remove box from stack */
+ stack->removeBox();
+}
+
+void GLERun::begin_length(int var)
+{
+ GLELengthBlock previous;
+ GLECore* core = g_get_core();
+ previous.varIndex = var;
+ previous.wasEnabled = core->isComputingLength();
+ previous.previousValue = core->getTotalLength();
+ m_lengthBlocks.push_back(previous);
+ core->setComputingLength(true);
+ core->setTotalLength(0.0);
+}
+
+void GLERun::end_length()
+{
+ GLECore* core = g_get_core();
+ CUtilsAssert(m_lengthBlocks.size() > 0);
+ CUtilsAssert(core->isComputingLength());
+ GLELengthBlock block(m_lengthBlocks.back());
+ m_lengthBlocks.pop_back();
+ double length = core->getTotalLength();
+ core->setComputingLength(block.wasEnabled);
+ core->setTotalLength(block.previousValue + length);
+ getVars()->setDouble(block.varIndex, length);
+}
+
+GLESubMap* GLERun::getSubroutines() {
+ return &g_Subroutines;
+}
+
+// What does this accomplish?
+// What is justify.box? Not in manual?
+void nm_adjust(GLEJustify jj, double *sx, double *sy, double ex, double ey, GLERectangle* r) {
+ double dr, da, rz, dx, dy;
+ if ((jj & 0xf000) == 0x5000) {
+ double r1 = r->getWidth()/2;
+ double r2 = r->getHeight()/2;
+ xy_polar(*sx - ex, *sy - ey, &dr, &da);
+ double xa = da - 180;
+ while ((xa<0) || (xa> 180)) {
+ if (xa > 180) xa = xa - 180;
+ if (xa < 0) xa = xa + 180;
+ }
+ if (r1==0) return;
+ double ca = atan(r2/r1)*180/GLE_PI;
+ if (xa < 90) {
+ rz = r1/cos(GLE_PI*xa/180);
+ if (xa>ca) rz = r2/sin(GLE_PI*xa/180);
+ } else {
+ xa = xa - 90;
+ rz = r2/cos(GLE_PI*xa/180);
+ if (xa>(90-ca)) rz = r1/sin(GLE_PI*xa/180);
+ }
+ dr = dr - rz ;
+ polar_xy(dr, da, &dx, &dy);
+ *sx = ex + dx;
+ *sy = ey + dy;
+ }
+ if ((jj & 0xff00) == 0x1000) {
+ // .ci -> for circle or ellipse
+ double rx = r->getWidth()/2;
+ double ry = r->getHeight()/2;
+ xy_polar(ex-(*sx), ey-(*sy), &dr, &da);
+ if (fabs(rx-ry) > 1e-18) {
+ double rad_alpha = GLE_PI*da/180;
+ da = atan2(rx*sin(rad_alpha), ry*cos(rad_alpha))/GLE_PI*180;
+ }
+ polar_xy(rx, ry, da, &dx, &dy);
+ *sx += dx;
+ *sy += dy;
+ }
+}
+
+int f_eof(int chn) throw(ParserError) {
+ if (f_testchan(chn) == -1) return 1;
+ else return (int)g_Files[chn]->eof();
+}
+
+void f_init() {
+}
+
+void siffree(char **s) {
+ if (*s != NULL) myfree(*s);
+ *s = NULL;
+}
+
+int f_testchan(int chn) throw(ParserError) {
+ if (chn < 0 || chn >= (int)g_Files.size() || g_Files[chn] == NULL) {
+ char chn_s[10];
+ sprintf(chn_s, "%d", chn);
+ g_throw_parser_error("file not open (file id = ",chn_s,")");
+ return -1;
+ }
+ return chn;
+}
+
+void f_create_chan(int var, const char* fname, int rd_wr) {
+ GLEFile* file = new GLEFile();
+ int freechn = -1;
+ for (vector<GLEFile*>::size_type i = 0; i < g_Files.size() && freechn == -1; i++) {
+ if (g_Files[i] == NULL) {
+ freechn = i;
+ }
+ }
+ if (freechn == -1) {
+ freechn = g_Files.size();
+ g_Files.push_back(file);
+ } else {
+ g_Files[freechn] = file;
+ }
+ file->setRdWr(rd_wr == 0 ? true : false);
+ var_set(var, freechn);
+ file->open(fname);
+}
+
+void f_close_chan(int idx) throw(ParserError) {
+ if (f_testchan(idx) != -1) {
+ GLEFile* file = g_Files[idx];
+ file->close();
+ delete file;
+ g_Files[idx] = NULL;
+ }
+}
+
+GLEFile::GLEFile() {
+ m_ReadWrite = true;
+ m_Output = NULL;
+ m_Input = NULL;
+}
+
+GLEFile::~GLEFile() {
+ close();
+}
+
+void GLEFile::close() {
+ if (m_Output != NULL) {
+ fclose(m_Output);
+ m_Output = NULL;
+ }
+ if (m_Input != NULL) {
+ m_Input->close_tokens();
+ m_Input->delete_language();
+ delete m_Input;
+ m_Input = NULL;
+ }
+}
+
+void GLEFile::open(const char* fname) throw(ParserError) {
+ m_FileName = fname;
+ if (isRead()) {
+ validate_file_name(m_FileName, true);
+ m_Input = new StreamTokenizer();
+ m_Input->open_tokens(m_FileName.c_str());
+ TokenizerLanguage* lang = m_Input->get_language();
+ lang->setSpaceTokens(" ,\t\r\n");
+ lang->setLineCommentTokens("!");
+ } else {
+ validate_file_name(m_FileName, false);
+ m_Output = fopen(m_FileName.c_str(), "w");
+ if (m_Output == NULL) {
+ ostringstream err_str;
+ err_str << "can't create: '" << m_FileName << "': ";
+ str_get_system_error(err_str);
+ g_throw_parser_error(err_str.str());
+ }
+ }
+}
+
+char* GLEFile::readLine() throw(ParserError) {
+ m_buffer = m_Input->read_line();
+ return (char*)m_buffer.c_str();
+}
+
+char* GLEFile::getToken() throw(ParserError) {
+ m_buffer = m_Input->next_token();
+ str_remove_quote(m_buffer);
+ return (char*)m_buffer.c_str();
+}
+
+void GLEFile::gotoNewLine() throw(ParserError) {
+ m_Input->token_skip_to_end();
+}
+
+bool GLEFile::eof() throw(ParserError) {
+ return m_Input->has_more_tokens() == 0 ? true : false;
+}
+
+void GLEFile::resetLang() {
+ if (m_Input != NULL) {
+ TokenizerLanguage* lang = m_Input->get_language();
+ lang->resetCharMaps();
+ }
+}
+
+void GLEFile::setLangChars(int type, const char* str) {
+ if (m_Input != NULL) {
+ char set[2];
+ set[1] = 0;
+ char prev_ch = -1;
+ TokenizerLanguage* lang = m_Input->get_language();
+ while ((*str) != 0) {
+ char ch = str[0];
+ bool ok = true;
+ // Convert escape sequences in the string !
+ if (prev_ch == '\\') {
+ if (ch == 'n') ch = '\n';
+ else if (ch == 't') ch = '\t';
+ else if (ch == 'r') ch = '\r';
+ } else if (ch == '\\') {
+ ok = false;
+ }
+ if (ok) {
+ set[0] = ch;
+ switch (type) {
+ case 0: lang->setLineCommentTokens(set); break;
+ case 1: lang->setSpaceTokens(set); break;
+ case 2: lang->setSingleCharTokens(set); break;
+ }
+ }
+ prev_ch = ch;
+ str++;
+ }
+ }
+}
diff --git a/src/gle/run.h b/src/gle/run.h
new file mode 100644
index 0000000..0c30fa3
--- /dev/null
+++ b/src/gle/run.h
@@ -0,0 +1,129 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#ifndef __GLE_RUN__
+#define __GLE_RUN__
+
+class GLEPcodeList;
+
+void sub_call(int idx,double *pval,char **pstr,int *npm, int *otyp) throw(ParserError);
+
+GLEString* evalStringPtr(GLEArrayImpl* stk, GLEPcodeList* pclist, int *pcode, int *cp) throw(ParserError);
+GLERC<GLEString> evalString(GLEArrayImpl* stk, GLEPcodeList* pclist, int *pcode, int *cp, bool allowOther) throw(ParserError);
+GLEMemoryCell* evalGeneric(GLEArrayImpl* stk, GLEPcodeList* pclist, int *pcode, int *cp) throw(ParserError);
+double evalDouble(GLEArrayImpl* stk, GLEPcodeList* pclist, int *pcode, int *cp) throw(ParserError);
+bool evalBool(GLEArrayImpl* stk, GLEPcodeList* pclist, int *pcode, int *cp) throw(ParserError);
+GLERC<GLEColor> evalColor(GLEArrayImpl* stk, GLEPcodeList* pclist, int *pcode, int *cp) throw(ParserError);
+GLESub* eval_subroutine_call(GLEArrayImpl* stk, GLEPcodeList* pclist, int *pcode, int *cp) throw(ParserError);
+void eval_do_object_block_call(GLEArrayImpl* stk, GLESub* sub, GLEObjectDO* obj) throw(ParserError);
+
+void clear_run();
+
+void g_set_pagesize(const string& papersize) throw (ParserError);
+void g_set_margins(const string& margins) throw (ParserError);
+
+GLEFileLocation* get_output_file();
+const string& get_input_file();
+
+class GLESub;
+class GLESubMap;
+class GLEBlocks;
+class GLEStoredBox;
+
+// or replace by GLEObject sub class on global stack?
+struct GLELengthBlock {
+ int varIndex;
+ bool wasEnabled;
+ double previousValue;
+};
+
+class GLERun {
+protected:
+ GLEScript* m_Script;
+ GLEFileLocation* m_OutFile;
+ GLEVars* m_Vars;
+ GLEBlocks* m_blockTypes;
+ GLERC<GLEObjectRepresention> m_CrObj;
+ GLERC<GLEArrayImpl> m_stack;
+ vector<GLELengthBlock> m_lengthBlocks;
+ bool m_AllowBeforeSize[GLE_KW_NB];
+ GLEMemoryCell m_returnValue;
+ GLEPcodeIndexed* m_pcode;
+public:
+ GLERun(GLEScript* script, GLEFileLocation* outfile, GLEPcodeIndexed* pcode);
+ ~GLERun();
+ void setBlockTypes(GLEBlocks* blocks);
+ GLEBlocks* getBlockTypes();
+ void setDeviceIsOpen(bool open);
+ void do_pcode(GLESourceLine &SLine,int *srclin, int *pcode, int plen, int *pend, bool& mkdrobjs) throw(ParserError);
+ void begin_object(const std::string& name, GLESub* sub) throw (ParserError);
+ void end_object() throw (ParserError);
+ void draw_object_static(const string& path, const string& name, int* pcode, int* cp, bool mkdrobjs) throw (ParserError);
+ void draw_object_subbyname(GLESub* sub, GLEObjectRepresention* newobj, GLEArrayImpl* path, GLEPoint* orig) throw (ParserError);
+ void draw_object_dynamic(int idx, GLEObjectRepresention* newobj, GLEArrayImpl* path, GLEPoint* orig) throw (ParserError);
+ void draw_object(const string& name, const char* newname) throw (ParserError);
+ void sub_call(GLESub* sub, GLEArrayImpl* arguments = 0) throw(ParserError);
+ void sub_call_stack(GLESub* sub, GLEArrayImpl* stk) throw(ParserError);
+ void name_set(GLEString* name, double x1, double y1, double x2, double y2);
+ static GLEObjectRepresention* name_to_object(GLEObjectRepresention* obj, GLEArrayImpl* path, GLEJustify* just, unsigned int offs) throw (ParserError);
+ GLEObjectRepresention* name_to_object(GLEString* name, GLEJustify* just) throw(ParserError);
+ bool is_name(GLEObjectRepresention* obj, GLEArrayImpl* path, unsigned int offs);
+ bool is_name(GLEString* name);
+ void name_to_point(GLEString* name, GLEPoint* point) throw(ParserError);
+ void name_to_size(GLEString* name, double *wd, double *hi) throw(ParserError);
+ void name_join(GLEString* n1, GLEString* n2, int marrow, double a1, double a2, double d1, double d2) throw(ParserError);
+ GLEStoredBox* last_box() throw (ParserError);
+ bool box_end() throw (ParserError);
+ void begin_length(int var);
+ void end_length();
+ GLESubMap* getSubroutines();
+ inline GLEArrayImpl* getStack() { return m_stack.get(); }
+ inline GLEObjectRepresention* getCRObjectRep() { return m_CrObj.get(); };
+ inline void setCRObjectRep(GLEObjectRepresention* obj) { m_CrObj.set(obj); }
+ inline GLEVars* getVars() { return m_Vars; }
+ inline GLEScript* getScript() { return m_Script; }
+ inline GLEGlobalSource* getSource() { return m_Script->getSource(); }
+ inline GLEFileLocation* getOutput() { return m_OutFile; }
+ inline void allowBeforeSize(int which) { m_AllowBeforeSize[which] = true; }
+ inline bool isAllowedBeforeSize(int which) { return m_AllowBeforeSize[which]; }
+ GLEPcodeList* getPcodeList();
+};
+
+GLERun* getGLERunInstance();
+
+#endif
diff --git a/src/gle/savgol.cpp b/src/gle/savgol.cpp
new file mode 100644
index 0000000..b94b686
--- /dev/null
+++ b/src/gle/savgol.cpp
@@ -0,0 +1,161 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#include <string>
+#include <stdlib.h>
+#include <string.h>
+
+using namespace std;
+
+/*
+Savitski Golay Smoothing routine
+*/
+int do_svg_smooth(double* xold, double* xnew, int size, int poly, int points, int num)
+{
+/*
+xold....the old data
+xnew....the new data
+size....the size of the array
+poly....the type of polynomial to fit to 3,4,5,6,...
+points...the number of points for smoothing 3,5,7,9,.....
+num.....the number of times to do the smoothing
+*/
+
+ /* test for bad input */
+ if(
+ xold == NULL ||
+ xnew == NULL ||
+ size == 0 ||
+ size <= points ||
+ num <= 0
+ )
+ {
+ return 0;
+ }
+
+ /* for now this is a quadratic or cubic and 7 point smoothing only */
+ int i;
+ xnew = (double*)calloc(size,sizeof(double));
+
+ for (i =0 ;i <= size ;i++ )
+ {
+ if(i == 0 || i == 1 || i == size-2 || i == size-1)
+ {
+ /* can't do it*/
+ xnew[i]=xold[i];
+ }
+ else if(i == 2 || i == size-3)
+ {
+ /* do five point */
+ xnew[i] = (-3*xold[i-2]+12*xold[i-1]+17*xold[i]+12*xold[i+1]-3*xold[i+2])/35;
+ }
+ else if (i == 3 || i == size - 4)
+ {
+ /* do seven point */
+ xnew[i] = (-2*xold[i-3]+3*xold[i-2]+6*xold[i-1]+7*xold[i]+6*xold[i+1]+3*xold[i+2]-2*xold[i+3])/21;
+ }
+ else if (i >= 4 && i <= size - 5)
+ {
+ /* do nine point */
+ xnew[i] = (-21*xold[i-4]+14*xold[i-3]+39*xold[i-2]+54*xold[i-1]+59*xold[i]+54*xold[i+1]+39*xold[i+2]+14*xold[i+3]-21*xold[i+4])/231;
+ }
+
+ }
+ memcpy(xold,xnew,size*sizeof(double));
+ free(xnew);
+ return 0;
+}
+/*
+#include <math.h>
+#define NRANSI
+#include "nrutil.h"
+#define TINY 1.0e-20;
+
+void ludcmp(float **a, int n, int *indx, float *d)
+{
+ int i,imax,j,k;
+ float big,dum,sum,temp;
+ float *vv;
+
+ vv=vector(1,n);
+ *d=1.0;
+ for (i=1;i<=n;i++) {
+ big=0.0;
+ for (j=1;j<=n;j++)
+ if ((temp=fabs(a[i][j])) > big) big=temp;
+ if (big == 0.0) nrerror("Singular matrix in routine ludcmp");
+ vv[i]=1.0/big;
+ }
+ for (j=1;j<=n;j++) {
+ for (i=1;i<j;i++) {
+ sum=a[i][j];
+ for (k=1;k<i;k++) sum -= a[i][k]*a[k][j];
+ a[i][j]=sum;
+ }
+ big=0.0;
+ for (i=j;i<=n;i++) {
+ sum=a[i][j];
+ for (k=1;k<j;k++)
+ sum -= a[i][k]*a[k][j];
+ a[i][j]=sum;
+ if ( (dum=vv[i]*fabs(sum)) >= big) {
+ big=dum;
+ imax=i;
+ }
+ }
+ if (j != imax) {
+ for (k=1;k<=n;k++) {
+ dum=a[imax][k];
+ a[imax][k]=a[j][k];
+ a[j][k]=dum;
+ }
+ *d = -(*d);
+ vv[imax]=vv[j];
+ }
+ indx[j]=imax;
+ if (a[j][j] == 0.0) a[j][j]=TINY;
+ if (j != n) {
+ dum=1.0/(a[j][j]);
+ for (i=j+1;i<=n;i++) a[i][j] *= dum;
+ }
+ }
+ free_vector(vv,1,n);
+}
+#undef TINY
+#undef NRANSI
+*/
diff --git a/src/gle/sub.cpp b/src/gle/sub.cpp
new file mode 100644
index 0000000..29e9278
--- /dev/null
+++ b/src/gle/sub.cpp
@@ -0,0 +1,466 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#include "all.h"
+#include "mem_limits.h"
+#include "gle-interface/gle-interface.h"
+#include "var.h"
+#include "sub.h"
+#include "gprint.h"
+#include "keyword.h"
+#include "run.h"
+#include "cutils.h"
+#include "glearray.h"
+#include "polish.h"
+
+extern int **gpcode; /* gpcode is a pointer to an array of poiter to int */
+extern int *gplen; /* gpcode is a pointer to an array of int */
+extern int ngpcode;
+extern int gle_debug;
+#define dbg if ((gle_debug & 128)>0)
+
+GLESubMap g_Subroutines;
+
+GLESubArgNames::GLESubArgNames() {
+}
+
+void GLESubArgNames::addArgName(const char* argName) {
+ addArgName(m_ArgNames.size(), argName);
+}
+
+void GLESubArgNames::addArgName(unsigned int argIndex, const char* argName) {
+ GLERC<GLEString> argNameStr(new GLEString(argName));
+ GLEStringHashData::iterator found(m_ArgNameHash.find(argNameStr));
+ if (found == m_ArgNameHash.end()) {
+ m_ArgNameHash.insert(make_pair(argNameStr, argIndex));
+ }
+ m_ArgNames.resize(argIndex + 1);
+ m_ArgNames.setObject(argIndex, argNameStr.get());
+}
+
+void GLESubArgNames::addArgNameAlias(unsigned int argIndex, const char* argName) {
+ GLERC<GLEString> argNameStr(new GLEString(argName));
+ GLEStringHashData::iterator found(m_ArgNameHash.find(argNameStr));
+ if (found == m_ArgNameHash.end()) {
+ m_ArgNameHash.insert(make_pair(argNameStr, argIndex));
+ }
+}
+
+GLESubRoot::GLESubRoot(GLEString* name, GLESubArgNames* argNames) :
+ m_Name(name),
+ m_ArgNames(argNames),
+ m_IgnoredArgNames(new GLEStringHash()),
+ m_Signatures(new GLEArrayImpl())
+{
+}
+
+void GLESubRoot::updateArgNames(GLESubArgNames* argNames) {
+}
+
+GLESubDefinitionHelper::GLESubDefinitionHelper(const std::string& name) {
+ m_Defaults = new GLEArrayImpl();
+ m_ArgNames = new GLESubArgNames();
+ m_Name = new GLEString(name);
+}
+
+void GLESubDefinitionHelper::addArgumentAlias(unsigned int argIndex, const std::string& name) {
+ m_ArgNames->addArgNameAlias(argIndex, name.c_str());
+}
+
+unsigned int GLESubDefinitionHelper::addArgument(const std::string& name, unsigned int type, bool mandatory) {
+ unsigned int nbArguments = m_ArgTypes.size();
+ m_ArgTypes.push_back(type);
+ m_isMandatory.push_back(mandatory);
+ m_Defaults->resize(nbArguments + 1);
+ m_ArgNames->addArgName(nbArguments, name.c_str());
+ return nbArguments;
+}
+
+unsigned int GLESubDefinitionHelper::addDoubleArgument(const std::string& name, double defaultValue, bool mandatory) {
+ unsigned int result = addArgument(name, GLEObjectTypeDouble, mandatory);
+ m_Defaults->setDouble(result, defaultValue);
+ return result;
+}
+
+unsigned int GLESubDefinitionHelper::addDoubleArgumentNoDefault(const std::string& name, bool mandatory) {
+ return addArgument(name, GLEObjectTypeDouble, mandatory);
+}
+
+unsigned int GLESubDefinitionHelper::addPointArgument(const std::string& name, GLEPointDataObject* defaultValue, bool mandatory) {
+ unsigned int result = addArgument(name, GLEObjectTypePoint, mandatory);
+ if (defaultValue != 0) {
+ m_Defaults->setObject(result, defaultValue);
+ }
+ return result;
+}
+
+GLESubSignature::GLESubSignature(GLESubRoot* root) :
+ m_Root(root),
+ m_Subroutines(new GLEArrayWithFreeList()),
+ m_Callables(new GLEArrayWithFreeList())
+{
+}
+
+void GLECallable::execute(GLEArrayImpl* stack, unsigned int top) {
+}
+
+GLEArgTypeDefaults::GLEArgTypeDefaults(unsigned int arity) :
+ m_Arity(arity),
+ m_ArgTypes(new unsigned int[arity]),
+ m_Defaults(new GLEArrayImpl())
+{
+}
+
+GLEArgTypeDefaults::~GLEArgTypeDefaults() {
+ delete m_ArgTypes;
+}
+
+GLEAbstractSub::GLEAbstractSub() :
+ m_Root(0)
+{
+}
+
+void GLEAbstractSub::setArgTypeDefaults(GLEArgTypeDefaults* defaults) {
+ m_ArgTypeDefaults = defaults;
+ m_ArgTypes = m_ArgTypeDefaults->getArgTypes();
+}
+
+GLEBuiltInFactory::GLEBuiltInFactory(GLESubMap* map) :
+ m_Map(map)
+{
+ // default binary argument names (x, y)
+ m_BinaryArgNamesXY = new GLESubArgNames();
+ m_BinaryArgNamesXY->addArgName("x");
+ m_BinaryArgNamesXY->addArgName("y");
+ // binary function with two double arguments
+ m_BinaryDoubleDoubleArgTypeDefaults = new GLEArgTypeDefaults(2);
+ m_BinaryDoubleDoubleArgTypeDefaults->setArgType(0, GLEObjectTypeDouble);
+ m_BinaryDoubleDoubleArgTypeDefaults->setArgType(1, GLEObjectTypeDouble);
+}
+
+GLESubArgNames* GLEBuiltInFactory::getBinaryArgNamesXY() {
+ return m_BinaryArgNamesXY.get();
+}
+
+GLEArgTypeDefaults* GLEBuiltInFactory::getBinaryDoubleDoubleArgTypeDefaults() {
+ return m_BinaryDoubleDoubleArgTypeDefaults.get();
+}
+
+GLESubRoot* GLEBuiltInFactory::createRoot(const char* name, GLESubArgNames* argNames)
+{
+ return m_Map->createRoot(name, argNames);
+}
+
+GLESub::GLESub() {
+ m_ParentSub = NULL;
+ m_Typ = m_Idx = 0;
+ m_Start = m_End = -1;
+ m_IsObject = false;
+ m_Script = NULL;
+ m_Cons = NULL;
+}
+
+GLESub::~GLESub() {
+}
+
+void GLESub::addParam(const string& name, int type) {
+ int len = name.length();
+ if (len > 1 && name[len-1] == '$') {
+ string shortname = name;
+ shortname.erase(len-1);
+ m_PNameS.push_back(shortname);
+ } else {
+ m_PNameS.push_back(name);
+ }
+ m_PName.push_back(name);
+ m_PType.push_back(type);
+ m_PDefault.push_back("");
+}
+
+void GLESub::setStartEnd(int start, int end) {
+ m_Start = start;
+ m_End = end;
+}
+
+void GLESub::clear() {
+ m_Start = -1; m_End = -1;
+ m_PName.clear();
+ m_PType.clear();
+ m_LocalVars.clear();
+}
+
+int GLESub::findParameter(const string& name) {
+ for (int i = 0; i < getNbParam(); i++) {
+ if (str_i_equals(name, getParamNameShort(i))) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+void GLESub::listArgNames(ostream& out) {
+ for (int i = 0; i < getNbParam(); i++) {
+ if (i != 0) out << ",";
+ out << getParamNameShort(i);
+ }
+}
+
+GLEObjectDOConstructor* GLESub::getObjectDOConstructor() {
+ if (m_Cons == NULL) m_Cons = new GLEObjectDOConstructor(this);
+ return m_Cons;
+}
+
+GLESubMap::GLESubMap() :
+ m_SubRoots(new GLEStringHash())
+{
+}
+
+GLESubMap::~GLESubMap() {
+ clear();
+}
+
+GLESubRoot* GLESubMap::getRoot(const char* name) {
+ GLERC<GLEString> strName(new GLEString(name));
+ return (GLESubRoot*)m_SubRoots->getObjectByKey(strName);
+}
+
+GLESubRoot* GLESubMap::createRoot(const char* name, GLESubArgNames* argNames) {
+ GLERC<GLEString> strName(new GLEString(name));
+ GLESubRoot* root = (GLESubRoot*)m_SubRoots->getObjectByKey(strName);
+ if (root != NULL) {
+ root->updateArgNames(argNames);
+ return root;
+ } else {
+ GLESubRoot* newRoot = new GLESubRoot(strName.get(), argNames);
+ m_SubRoots->setObjectByKey(strName, newRoot);
+ return newRoot;
+ }
+}
+
+void GLESubMap::add(GLEAbstractSub* sub) {
+}
+
+void GLESubMap::clear(int i) {
+ delete m_Subs[i];
+ m_Subs[i] = NULL;
+}
+
+void GLESubMap::clear() {
+ for (vector<GLESub*>::size_type i = 0; i < m_Subs.size(); i++) {
+ clear(i);
+ }
+ m_Subs.clear();
+ m_Map.clear();
+}
+
+GLESub* GLESubMap::add() {
+ GLESub* sub = new GLESub();
+ int idx = size();
+ sub->setIndex(idx);
+ m_Subs.push_back(sub);
+ sub->clear();
+ return sub;
+}
+
+GLESub* GLESubMap::add(GLESub* parent) {
+ GLESub* sub = add();
+ sub->setParentSub(parent);
+ return sub;
+}
+
+GLESub* GLESubMap::add(const string& name) {
+ GLESub* sub = add();
+ m_Map.add_item(name, sub->getIndex());
+ sub->setName(name);
+ return sub;
+}
+
+GLESub* GLESubMap::get(const string& name) {
+ int idx = getIndex(name);
+ if (idx < 0) return NULL;
+ else return m_Subs[idx];
+}
+
+void GLESubMap::list() {
+ cout << "List:" << endl;
+ for (vector<GLESub*>::size_type i = 0; i < m_Subs.size(); i++) {
+ GLESub* sub = m_Subs[i];
+ cout << " NAME = " << sub->getName() << "/" << sub->getNbParam() << endl;
+ }
+}
+
+void sub_param(GLESub* sub, const string& name) {
+ int vi, vt;
+ /* should be set ptype according to num/string variable */
+ var_add_local(name, &vi, &vt);
+ sub->addParam(name, vt);
+}
+
+GLESub* sub_find(const string& s) {
+ return g_Subroutines.get(s);
+}
+
+void sub_clear(bool undef) {
+ if (undef) {
+ for (int i = 0; i < g_Subroutines.size(); i++) {
+ g_Subroutines.get(i)->setStartEnd(-1, -1);
+ }
+ } else {
+ g_Subroutines.clear();
+ }
+}
+
+bool sub_is_valid(int idx) {
+ return idx >= 0 && idx < g_Subroutines.size();
+}
+
+void sub_get_startend(int idx, int *ss, int *ee) {
+ GLESub* sub = g_Subroutines.get(idx);
+ *ss = sub->getStart();
+ *ee = sub->getEnd();
+}
+
+GLESub* sub_get(int idx) throw(ParserError) {
+ if (!sub_is_valid(idx)) {
+ g_throw_parser_error("illegal subroutine identifier: ", idx);
+ }
+ return g_Subroutines.get(idx);
+}
+
+extern int this_line;
+
+/*
+int pos = --npm;
+std::cerr << "param: " << i << " from stack pos: " << pos << " = ";
+gle_memory_cell_print(stk->get(pos), std::cerr);
+std::cerr << std::endl;
+*/
+
+/* Run a user defined function */
+void GLERun::sub_call_stack(GLESub* sub, GLEArrayImpl* stk) throw(ParserError) {
+ // Save current return value
+ GLEMemoryCell save_return_value;
+ GLE_MC_INIT(save_return_value);
+ GLE_MC_COPY(&save_return_value, &m_returnValue);
+ // Set local variable map
+ GLEVarMap* sub_map = sub->getLocalVars();
+ GLEVarMap* save_var_map = var_swap_local_map(sub_map);
+ var_alloc_local(sub_map);
+ // Copy parameters to local variables
+ int npm = stk->size();
+ for (int i = sub->getNbParam()-1; i >= 0; i--) {
+ getVars()->set(i | GLE_VAR_LOCAL_BIT, stk->get(--npm));
+ }
+ // Run subroutine
+ int endp = 0;
+ bool mkdrobjs = false;
+ int oldline = this_line;
+ for (int i = sub->getStart() + 1; i < sub->getEnd(); i++) {
+ GLESourceLine* line = getSource()->getLine(i - 1);
+ do_pcode(*line, &i, gpcode[i], gplen[i], &endp, mkdrobjs);
+ }
+ // FIXME: Find more elegant way to back up current line
+ this_line = oldline;
+ stk->decrementSize(sub->getNbParam() - 1);
+ stk->ensure(npm + 1);
+ stk->set(npm, &m_returnValue);
+ var_set_local_map(save_var_map);
+ GLE_MC_COPY(&m_returnValue, &save_return_value);
+ var_free_local();
+}
+
+/* Run a user defined function */
+void GLERun::sub_call(GLESub* sub, GLEArrayImpl* arguments) throw(ParserError) {
+ GLEMemoryCell save_return_value;
+ GLE_MC_INIT(save_return_value);
+ GLE_MC_COPY(&save_return_value, &m_returnValue);
+ // Set local variable map
+ GLEVarMap* sub_map = sub->getLocalVars();
+ GLEVarMap* save_var_map = var_swap_local_map(sub_map);
+ var_alloc_local(sub_map);
+ // Copy parameters to local variables
+ if (arguments != 0) {
+ CUtilsAssert(sub->getNbParam() == (int)arguments->size());
+ for (int i = 0; i < sub->getNbParam(); ++i) {
+ getVars()->set(i | GLE_VAR_LOCAL_BIT, arguments->get(i));
+ }
+ }
+ // Run subroutine
+ int endp = 0;
+ bool mkdrobjs = false;
+ int oldline = this_line;
+ for (int i = sub->getStart() + 1; i < sub->getEnd(); i++) {
+ GLESourceLine* line = getSource()->getLine(i - 1);
+ do_pcode(*line, &i, gpcode[i], gplen[i], &endp, mkdrobjs);
+ }
+ // FIXME: Find more elegant way to back up current line
+ this_line = oldline;
+ var_set_local_map(save_var_map);
+ GLE_MC_COPY(&m_returnValue, &save_return_value);
+ var_free_local();
+}
+
+void call_sub_byname(const string& name, double* args, int nb, const char* err_inf) throw(ParserError) {
+ GLESub* sub = sub_find(name);
+ if (sub == NULL) {
+ stringstream err;
+ err << "subroutine '" << name << "' not found";
+ if (err_inf != NULL) err << " " << err_inf;
+ g_throw_parser_error(err.str());
+ } else if (sub->getNbParam() != nb) {
+ stringstream err;
+ err << "subroutine '" << name << "' should take " << nb << " parameter(s), not " << sub->getNbParam();
+ if (err_inf != NULL) err << " " << err_inf;
+ g_throw_parser_error(err.str());
+ }
+ GLERC<GLEArrayImpl> stk(doublesToArray(args, nb));
+ getGLERunInstance()->sub_call(sub, stk.get());
+}
+
+void call_sub_byid(int idx, double* args, int nb, const char* err_inf) throw(ParserError) {
+ GLESub* sub = sub_get(idx);
+ if (sub == NULL) return;
+ if (sub->getNbParam() != nb) {
+ stringstream err;
+ err << "subroutine '" << sub->getName() << "' should take " << nb << " parameter(s), not " << sub->getNbParam();
+ if (err_inf != NULL) err << " " << err_inf;
+ g_throw_parser_error(err.str());
+ }
+ GLERC<GLEArrayImpl> stk(doublesToArray(args, nb));
+ getGLERunInstance()->sub_call(sub, stk.get());
+}
diff --git a/src/gle/sub.h b/src/gle/sub.h
new file mode 100644
index 0000000..dc2b7b1
--- /dev/null
+++ b/src/gle/sub.h
@@ -0,0 +1,219 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#ifndef INCLUDE_SUB
+#define INCLUDE_SUB
+
+class GLEObjectDOConstructor;
+
+class GLESubArgNames : public GLERefCountObject {
+public:
+ GLESubArgNames();
+ void addArgName(const char* argName);
+ void addArgName(unsigned int argIndex, const char* argName);
+ void addArgNameAlias(unsigned int argIndex, const char* argName);
+private:
+ GLEArrayImpl m_ArgNames;
+ GLEStringHashData m_ArgNameHash;
+};
+
+class GLESubRoot : public GLEDataObject {
+public:
+ GLESubRoot(GLEString* name, GLESubArgNames* argNames);
+ void updateArgNames(GLESubArgNames* argNames);
+private:
+ GLERC<GLEString> m_Name;
+ GLERC<GLESubArgNames> m_ArgNames;
+ GLERC<GLEStringHash> m_IgnoredArgNames;
+ GLERC<GLEArrayImpl> m_Signatures;
+};
+
+class GLESubDefinitionHelper : public GLERefCountObject {
+public:
+ GLESubDefinitionHelper(const std::string& name);
+ void addArgumentAlias(unsigned int argIndex, const std::string& name);
+ unsigned int addArgument(const std::string& name, unsigned int type, bool mandatory);
+ unsigned int addDoubleArgument(const std::string& name, double defaultValue, bool mandatory);
+ unsigned int addDoubleArgumentNoDefault(const std::string& name, bool mandatory);
+ unsigned int addPointArgument(const std::string& name, GLEPointDataObject* defaultValue, bool mandatory);
+
+public:
+ std::vector<bool> m_isMandatory;
+ std::vector<unsigned int> m_ArgTypes;
+ GLERC<GLEArrayImpl> m_Defaults;
+ GLERC<GLESubArgNames> m_ArgNames;
+ GLERC<GLEString> m_Name;
+};
+
+class GLESubSignature : public GLEDataObject {
+public:
+ GLESubSignature(GLESubRoot* root);
+private:
+ GLESubRoot* m_Root;
+ GLERC<GLEArrayWithFreeList> m_Subroutines;
+ GLERC<GLEArrayWithFreeList> m_Callables;
+};
+
+class GLECallable : public GLEDataObject {
+public:
+ virtual void execute(GLEArrayImpl* stack, unsigned int top);
+protected:
+ unsigned int* m_ArgTypes;
+};
+
+class GLEArgTypeDefaults : public GLERefCountObject {
+public:
+ GLEArgTypeDefaults(unsigned int arity);
+ ~GLEArgTypeDefaults();
+ inline unsigned int* getArgTypes() { return m_ArgTypes; }
+ inline void setArgType(unsigned int i, unsigned int type) { m_ArgTypes[i] = type; }
+private:
+ unsigned int m_Arity;
+ unsigned int* m_ArgTypes;
+ GLERC<GLEArrayImpl> m_Defaults;
+};
+
+class GLEAbstractSub : public GLECallable {
+public:
+ GLEAbstractSub();
+ inline void setRoot(GLESubRoot* root) { m_Root = root; }
+ void setArgTypeDefaults(GLEArgTypeDefaults* defaults);
+private:
+ GLESubRoot* m_Root;
+ GLERC<GLEArgTypeDefaults> m_ArgTypeDefaults;
+};
+
+class GLESubMap;
+
+class GLEBuiltInFactory {
+public:
+ GLEBuiltInFactory(GLESubMap* map);
+ GLESubArgNames* getBinaryArgNamesXY();
+ GLEArgTypeDefaults* getBinaryDoubleDoubleArgTypeDefaults();
+ GLESubRoot* createRoot(const char* name, GLESubArgNames* argNames);
+private:
+ GLESubMap* m_Map;
+ GLERC<GLESubArgNames> m_BinaryArgNamesXY;
+ GLERC<GLEArgTypeDefaults> m_BinaryDoubleDoubleArgTypeDefaults;
+};
+
+class GLEBuiltIn : public GLEAbstractSub {
+public:
+
+private:
+
+};
+
+class GLESub {
+protected:
+ string m_Name;
+ int m_Typ, m_Idx;
+ vector<int> m_PType;
+ vector<string> m_PName;
+ vector<string> m_PNameS;
+ vector<string> m_PDefault;
+ int m_Start, m_End;
+ GLEVarMap m_LocalVars;
+ GLESub* m_ParentSub;
+ GLEScript* m_Script;
+ GLEObjectDOConstructor* m_Cons;
+ bool m_IsObject;
+public:
+ GLESub();
+ ~GLESub();
+ void addParam(const string& name, int type);
+ void setStartEnd(int start, int end);
+ int findParameter(const string& name);
+ void listArgNames(ostream& out);
+ void clear();
+ GLEObjectDOConstructor* getObjectDOConstructor();
+ inline const string& getName() const { return m_Name; }
+ inline void setName(const string& name) { m_Name = name; }
+ inline int getStart() const { return m_Start; }
+ inline void setStart(int line) { m_Start = line; }
+ inline int getEnd() const { return m_End; }
+ inline void setIndex(int idx) { m_Idx = idx; }
+ inline int getIndex() const { return m_Idx; }
+ inline GLEVarMap* getLocalVars() { return &m_LocalVars; }
+ inline int getParamType(int idx) { return m_PType[idx]; }
+ inline const string& getParamName(int idx) { return m_PName[idx]; }
+ inline const string& getParamNameShort(int idx) { return m_PNameS[idx]; }
+ inline const string& getDefault(int idx) const { return m_PDefault[idx]; }
+ inline void setDefault(int idx, const string& value) { m_PDefault[idx] = value; }
+ inline int getNbParam() { return m_PType.size(); }
+ inline int* getParamTypes() { return &m_PType[0]; }
+ inline GLESub* getParentSub() { return m_ParentSub; }
+ inline void setParentSub(GLESub* par) { m_ParentSub = par; }
+ inline bool isObject() { return m_IsObject; }
+ inline void setIsObject(bool isobj) { m_IsObject = isobj; }
+ inline void setScript(GLEScript* script) { m_Script = script; }
+ inline GLEScript* getScript() { return m_Script; }
+};
+
+class GLESubMap {
+protected:
+ StringIntHash m_Map;
+ vector<GLESub*> m_Subs;
+ GLERC<GLEStringHash> m_SubRoots;
+public:
+ GLESubMap();
+ ~GLESubMap();
+ GLESubRoot* getRoot(const char* name);
+ GLESubRoot* createRoot(const char* name, GLESubArgNames* argNames);
+ void clear();
+ void clear(int i);
+ GLESub* add();
+ GLESub* add(GLESub* parent);
+ void add(GLEAbstractSub* sub);
+ /* FIXME: lookup should be based on GLEString */
+ GLESub* add(const string& name);
+ GLESub* get(const string& name);
+ void list();
+ inline GLESub* get(int i) { return m_Subs[i]; }
+ inline int getIndex(const string& name) { return m_Map.try_get(name); }
+ inline int size() { return m_Subs.size(); }
+};
+
+GLESub* sub_get(int idx) throw(ParserError);
+GLESub* sub_find(const string& s);
+void sub_param(GLESub* sub, const string& name);
+
+void call_sub_byname(const string& name, double* args, int nb, const char* err_inf) throw(ParserError);
+void call_sub_byid(int idx, double* args, int nb, const char* err_inf) throw(ParserError);
+
+#endif
diff --git a/src/gle/surface/Makefile.gcc b/src/gle/surface/Makefile.gcc
new file mode 100644
index 0000000..819e559
--- /dev/null
+++ b/src/gle/surface/Makefile.gcc
@@ -0,0 +1,55 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+#
+# makefile.gcc for GLE v4.0
+# for compilation with gcc
+#
+#
+include ../../../config.i
+include ../../../config.gcc
+#
+include files.txt
+
+all: $(OBJECTS)
+
+$(OBJECTS): $(INCLUDES)
+
+clean:
+ -$(RM) $(OBJECTS)
+
diff --git a/src/gle/surface/Makefile.in b/src/gle/surface/Makefile.in
new file mode 100644
index 0000000..9d38c05
--- /dev/null
+++ b/src/gle/surface/Makefile.in
@@ -0,0 +1,63 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+#
+# makefile.gcc for GLE v4.0
+# for compilation with gcc
+#
+
+include ../../../config.i
+include ../../../config.aconf
+
+include files.txt
+
+CXX=@CXX@
+CPPFLAGS=@LIBGLE_CPPFLAGS@@CPPFLAGS@
+
+CPPFLAGS := $(strip $(CPPFLAGS))
+
+LDFLAGS=@LDFLAGS@
+LIBS=@LIBS@
+
+all: $(OBJECTS)
+
+$(OBJECTS): %.o: %.cpp $(INCLUDES)
+ $(CXX) $(CPPFLAGS) -c $< -o $@
+
+clean:
+ -$(RM) $(OBJECTS)
diff --git a/src/gle/surface/Makefile.os2 b/src/gle/surface/Makefile.os2
new file mode 100644
index 0000000..01782fd
--- /dev/null
+++ b/src/gle/surface/Makefile.os2
@@ -0,0 +1,55 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+#
+# makefile.gcc for GLE v4.0
+# for compilation with gcc
+#
+#
+include ../../../config.i
+include ../../../config.os2
+#
+include files.txt
+
+all: $(OBJECTS)
+
+$(OBJECTS): $(INCLUDES)
+
+clean:
+ -$(RM) $(OBJECTS)
+
diff --git a/src/gle/surface/Makefile.vc b/src/gle/surface/Makefile.vc
new file mode 100644
index 0000000..58dd502
--- /dev/null
+++ b/src/gle/surface/Makefile.vc
@@ -0,0 +1,53 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+#
+# makefile.vc for GLE v4.0
+# for compilation with MS vc++ .net
+#
+#
+!include ..\..\..\config.vc
+#
+!include files.txt
+
+all: $(OBJECTS)
+
+$(OBJECTS): $(INCLUDES)
+
+clean:
+ -erase $(OBJECTS)
diff --git a/src/gle/surface/f2c.h b/src/gle/surface/f2c.h
new file mode 100644
index 0000000..2b88ae8
--- /dev/null
+++ b/src/gle/surface/f2c.h
@@ -0,0 +1,244 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+/* f2c.h -- Standard Fortran to C header file */
+
+/** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed."
+
+ - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */
+
+#ifndef F2C_INCLUDE
+#define F2C_INCLUDE
+
+typedef int integer;
+typedef char *address;
+typedef short int shortint;
+typedef double real;
+typedef double doublereal;
+typedef struct { real r, i; } complex;
+typedef struct { doublereal r, i; } doublecomplex;
+typedef int logical;
+typedef short int shortlogical;
+
+#define TRUE_ (1)
+#define FALSE_ (0)
+
+/* Extern is for use with -E */
+#ifndef Extern
+#define Extern extern
+#endif
+
+/* I/O stuff */
+
+#ifdef f2c_i2
+/* for -i2 */
+typedef short flag;
+typedef short ftnlen;
+typedef short ftnint;
+#else
+typedef int flag;
+typedef int ftnlen;
+typedef int ftnint;
+#endif
+
+/*external read, write*/
+typedef struct
+{ flag cierr;
+ ftnint ciunit;
+ flag ciend;
+ char *cifmt;
+ ftnint cirec;
+} cilist;
+
+/*internal read, write*/
+typedef struct
+{ flag icierr;
+ char *iciunit;
+ flag iciend;
+ char *icifmt;
+ ftnint icirlen;
+ ftnint icirnum;
+} icilist;
+
+/*open*/
+typedef struct
+{ flag oerr;
+ ftnint ounit;
+ char *ofnm;
+ ftnlen ofnmlen;
+ char *osta;
+ char *oacc;
+ char *ofm;
+ ftnint orl;
+ char *oblnk;
+} olist;
+
+/*close*/
+typedef struct
+{ flag cerr;
+ ftnint cunit;
+ char *csta;
+} cllist;
+
+/*rewind, backspace, endfile*/
+typedef struct
+{ flag aerr;
+ ftnint aunit;
+} alist;
+
+/* inquire */
+typedef struct
+{ flag inerr;
+ ftnint inunit;
+ char *infile;
+ ftnlen infilen;
+ ftnint *inex; /*parameters in standard's order*/
+ ftnint *inopen;
+ ftnint *innum;
+ ftnint *innamed;
+ char *inname;
+ ftnlen innamlen;
+ char *inacc;
+ ftnlen inacclen;
+ char *inseq;
+ ftnlen inseqlen;
+ char *indir;
+ ftnlen indirlen;
+ char *infmt;
+ ftnlen infmtlen;
+ char *inform;
+ ftnint informlen;
+ char *inunf;
+ ftnlen inunflen;
+ ftnint *inrecl;
+ ftnint *innrec;
+ char *inblank;
+ ftnlen inblanklen;
+} inlist;
+
+#define VOID void
+
+union Multitype { /* for multiple entry points */
+ shortint h;
+ integer i;
+ real r;
+ doublereal d;
+ complex c;
+ doublecomplex z;
+ };
+
+typedef union Multitype Multitype;
+
+typedef int Long;
+
+struct Vardesc { /* for Namelist */
+ char *name;
+ char *addr;
+ Long *dims;
+ int type;
+ };
+typedef struct Vardesc Vardesc;
+
+struct Namelist {
+ char *name;
+ Vardesc **vars;
+ int nvars;
+ };
+typedef struct Namelist Namelist;
+
+#define abs(x) ((x) >= 0 ? (x) : -(x))
+#define dabs(x) (doublereal)abs(x)
+#define min(a,b) ((a) <= (b) ? (a) : (b))
+#define max(a,b) ((a) >= (b) ? (a) : (b))
+#define dmin(a,b) (doublereal)min(a,b)
+#define dmax(a,b) (doublereal)max(a,b)
+
+/* procedure parameter types for -A and -C++ */
+
+#define F2C_proc_par_types 1
+#ifdef __cplusplus
+typedef int /* Unknown procedure type */ (*U_fp)(...);
+typedef shortint (*J_fp)(...);
+typedef integer (*I_fp)(...);
+typedef real (*R_fp)(...);
+typedef doublereal (*D_fp)(...), (*E_fp)(...);
+typedef /* Complex */ VOID (*C_fp)(...);
+typedef /* Double Complex */ VOID (*Z_fp)(...);
+typedef logical (*L_fp)(...);
+typedef shortlogical (*K_fp)(...);
+typedef /* Character */ VOID (*H_fp)(...);
+typedef /* Subroutine */ int (*S_fp)(...);
+#else
+typedef int /* Unknown procedure type */ (*U_fp)();
+typedef shortint (*J_fp)();
+typedef integer (*I_fp)();
+typedef real (*R_fp)();
+typedef doublereal (*D_fp)(), (*E_fp)();
+typedef /* Complex */ VOID (*C_fp)();
+typedef /* Double Complex */ VOID (*Z_fp)();
+typedef logical (*L_fp)();
+typedef shortlogical (*K_fp)();
+typedef /* Character */ VOID (*H_fp)();
+typedef /* Subroutine */ int (*S_fp)();
+#endif
+/* E_fp is for real functions when -R is not specified */
+typedef doublereal E_f; /* real function with -R not specified */
+
+/* undef any lower-case symbols that your C compiler predefines, e.g.: */
+
+#ifndef Skip_f2c_Undefs
+#undef cray
+#undef gcos
+#undef mc68010
+#undef mc68020
+#undef mips
+#undef pdp11
+#undef sgi
+#undef sparc
+#undef sun
+#undef sun2
+#undef sun3
+#undef sun4
+#undef u370
+#undef u3b
+#undef u3b2
+#undef u3b5
+#undef unix
+#undef vax
+#endif
+#endif
diff --git a/src/gle/surface/fcontour.cpp b/src/gle/surface/fcontour.cpp
new file mode 100644
index 0000000..b4b6647
--- /dev/null
+++ b/src/gle/surface/fcontour.cpp
@@ -0,0 +1,970 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+/* contour.f -- translated by f2c (version of 26 February 1990 17:38:00).
+ You must link the resulting object file with the libraries:
+ -lF77 -lI77 -lm -lc (in that order)
+*/
+#ifndef __TURBOC__
+#define huge
+#endif
+
+#include "f2c.h"
+
+/* Common Block Declarations */
+
+typedef struct {
+ real xcur, ycur, xl, yl, cval[10];
+ integer clab[10], nch;
+} gctcom_;
+
+#define gctcom_1 gctcom_
+
+/* Table of constant values */
+
+static integer c__2 = 2;
+static integer c__6 = 6;
+static real c_b43 = 0.f;
+static integer c__3 = 3;
+static real c_b104 = .125f;
+
+/* Subroutine */ int fill0_(integer *bitmap, integer *n)
+{
+ /* Initialized data */
+
+ static integer nbpw = 31;
+
+ /* System generated locals */
+ integer i_1;
+
+ /* Builtin functions */
+ integer f_pow_ii(integer *, integer *);
+
+ /* Local variables */
+ static integer nblw, loop, i;
+
+
+/* fill the first n bits of bitmap with zeroes. */
+
+
+ /* Parameter adjustments */
+ --bitmap;
+
+ /* Function Body */
+/* nbpw is the minimum number of significant bits per word used */
+/* by integer arithmetic. this is usually one less than the */
+/* actual number of bits per word, but an important exception is */
+/* the cdc-6000 series of machines, where nbpw should be 48. */
+
+ loop = *n / nbpw;
+ nblw = *n % nbpw;
+ if (loop == 0) {
+ goto L20;
+ }
+ i_1 = loop;
+ for (i = 1; i <= i_1; ++i) {
+ bitmap[i] = 0;
+/* L10: */
+ }
+L20:
+ if (nblw != 0) {
+ i_1 = nbpw - nblw;
+ bitmap[loop + 1] %= f_pow_ii(&c__2, &i_1);
+ }
+ return 0;
+} /* fill0_ */
+
+/* Subroutine */ int mark1_(integer *bitmap, integer *n)
+{
+ /* Initialized data */
+
+ static integer nbpw = 31;
+
+ /* System generated locals */
+ integer i_1;
+
+ /* Builtin functions */
+ integer f_pow_ii(integer *, integer *);
+
+ /* Local variables */
+ static integer nbit, i, nword;
+
+
+/* put a one in the nth bit of bitmap. */
+
+
+ /* Parameter adjustments */
+ --bitmap;
+
+ /* Function Body */
+/* nbpw is the minimum number of significant bits per word used */
+/* by integer arithmetic. this is usually one less than the */
+/* actual number of bits per word, but an important exception is */
+/* the cdc-6000 series of machines, where nbpw should be 48. */
+
+ nword = (*n - 1) / nbpw;
+ nbit = (*n - 1) % nbpw;
+ i_1 = nbpw - nbit - 1;
+ i = f_pow_ii(&c__2, &i_1);
+ bitmap[nword + 1] += i * (1 - bitmap[nword + 1] / i % 2);
+ return 0;
+} /* mark1_ */
+
+integer iget_(huge integer *bitmap, integer *n)
+{
+ /* Initialized data */
+
+ static integer nbpw = 31;
+
+ /* System generated locals */
+ integer ret_val, i_1;
+
+ /* Builtin functions */
+ integer f_pow_ii(integer *, integer *);
+
+ /* Local variables */
+ static integer nbit, nword;
+
+
+/* iget=0 if the nth bit of bitmap is zero, else iget is one. */
+
+
+ /* Parameter adjustments */
+ --bitmap;
+
+ /* Function Body */
+/* nbpw is the minimum number of significant bits per word used */
+/* by integer arithmetic. this is usually one less than the */
+/* actual number of bits per word, but an important exception is */
+/* the cdc-6000 series of machines, where nbpw should be 48. */
+
+ nword = (*n - 1) / nbpw;
+ nbit = (*n - 1) % nbpw;
+ i_1 = nbpw - nbit - 1;
+ ret_val = bitmap[nword + 1] / f_pow_ii(&c__2, &i_1) % 2;
+ return ret_val;
+} /* iget_ */
+
+/* Subroutine */ int gcontr_(real *z, integer *nrz, integer *nx, integer *ny,
+ real *cv, integer *ncv, real *zmax, huge integer *bitmap, S_fp draw)
+{
+ /* Initialized data */
+
+ static integer l1[4] = { 0,0,-1,-1 };
+ static integer i1[2] = { 1,0 };
+ static integer i2[2] = { 1,-1 };
+ static integer i3[6] = { 1,0,0,1,1,0 };
+
+ /* System generated locals */
+ integer z_dim1, z_offset, i_1, i_2, i_3;
+ static integer equiv_3[4], equiv_5[2];
+ static real equiv_7[2];
+
+ /* Builtin functions */
+ integer f_i_sign(integer *, integer *);
+
+ /* Local variables */
+ static real cval;
+ static integer idir;
+ extern integer iget_(integer *, integer *);
+ static real dmax_;
+#define imin (equiv_3 + 2)
+#define imax (equiv_3)
+#define jmax (equiv_3 + 1)
+#define jmin (equiv_3 + 3)
+ static integer icur, jcur, jump;
+ static real xint[4];
+ extern /* Subroutine */ int fill0_(integer *, integer *), mark1_(integer *
+ , integer *);
+#define i (equiv_5)
+#define j (equiv_5 + 1)
+ static integer k, l, iedge, iflag;
+#define x (equiv_7)
+#define y (equiv_7 + 1)
+ static integer ibkey;
+#define l2 (equiv_3)
+ static real z1, z2;
+ static integer ii;
+#define ij (equiv_5)
+ static integer jj, ni, ks, ix;
+#define xy (equiv_7)
+ static real zz;
+ static integer nxidir, icv;
+
+/* this subroutine draws a contour through equal values of an array.
+*/
+
+/* ***** formal arguments ***********************************
+*/
+
+/* z is the array for which contours are to be drawn. the elements */
+
+/* of z are assumed to lie upon the nodes of a topologically */
+/* rectangular coordinate system - e.g. cartesian, polar (except */
+/* the origin), etc. */
+
+/* nrz is the number of rows declared for z in the calling program. */
+
+
+/* nx is the limit for the first subscript of z. */
+
+/* ny is the limit for the second subscript of z. */
+
+/* cv are the values of the contours to be drawn. */
+
+/* ncv is the number of contour values in cv. */
+
+/* zmax is the maximum value of z for consideration. a value of */
+/* z(i,j) greater than zmax is a signal that that point and the */
+/* grid line segments radiating from that point to it's neighbors */
+/* are to be excluded from contouring. */
+
+/* bitmap is a work area large enough to hold 2*nx*ny*ncv bits. it */
+
+/* is accessed by low-level routines, which are described below. */
+/* let j be the number of useful bits in each word of bitmap, */
+/* as determined by the user machine and implementation of */
+/* the bitmap manipulation subprograms described below. then */
+/* the number of words required for the bitmap is the floor of */
+/* (2*nx*ny*ncv+j-1)/j. */
+
+/* draw is a user-provided subroutine used to draw contours. */
+/* the calling sequence for draw is: */
+
+/* call draw (x,y,iflag) */
+/* let nx = integer part of x, fx = fractional part of x. */
+/* then x should be interpreted such that increases in nx */
+/* correspond to increases in the first subscript of z, and */
+/* fx is the fractional distance from the abscissa corresponding
+*/
+/* to nx to the abscissa corresponding to nx+1, */
+/* and y should be interpreted similarly for the second */
+/* subscript of z. */
+/* the low-order digit of iflag will have one of the values: */
+/* 1 - continue a contour, */
+/* 2 - start a contour at a boundary, */
+/* 3 - start a contour not at a boundary, */
+/* 4 - finish a contour at a boundary, */
+/* 5 - finish a closed contour (not at a boundary). */
+/* note that requests 1, 4 and 5 are for pen-down */
+/* moves, and that requests 2 and 3 are for pen-up */
+/* moves. */
+/* 6 - set x and y to the approximate 'pen' position, using */
+
+/* the notation discussed above. this call may be */
+/* ignored, the result being that the 'pen' position */
+/* is taken to correspond to z(1,1). */
+/* iflag/10 is the contour number. */
+
+/* ***** external subprograms *******************************
+*/
+
+/* draw is the user-supplied line drawing subprogram described above.
+*/
+/* draw may be sensitive to the host computer and to the plot device.
+*/
+/* fill0 is used to fill a bitmap with zeroes. call fill0 (bitmap,n)
+*/
+/* fills the first n bits of bitmap with zeroes. */
+/* mark1 is used to place a 1 in a specific bit of the bitmap. */
+/* call mark1 (bitmap,n) puts a 1 in the nth bit of the bitmap. */
+/* iget is used to determine the setting of a particular bit in the */
+
+/* bitmap. i=iget(bitmap,n) sets i to zero if the nth bit of the */
+/* bitmap is zero, and sets i to one if the nth bit is one. */
+/* fill0, mark1 and iget are machine sensitive. */
+
+/* ******************************************************************
+*/
+
+
+/* l1 and l2 contain limits used during the spiral search for the */
+/* beginning of a contour. */
+/* ij stores subcripts used during the spiral search. */
+
+
+/* i1, i2 and i3 are used for subscript computations during the */
+/* examination of lines from z(i,j) to it's neighbors. */
+
+
+/* xint is used to mark intersections of the contour under */
+/* consideration with the edges of the cell being examined. */
+
+
+/* xy is used to compute coordinates for the draw subroutine. */
+
+
+ /* Parameter adjustments */
+ --bitmap;
+ --cv;
+ z_dim1 = *nrz;
+ z_offset = z_dim1 + 1;
+ z -= z_offset;
+
+ /* Function Body */
+
+ l1[0] = *nx;
+ l1[1] = *ny;
+ dmax_ = *zmax;
+
+/* set the current pen position. the default position corresponds */
+/* to z(1,1). */
+
+ *x = 1.f;
+ *y = 1.f;
+ (*draw)(x, y, &c__6);
+/* Computing MAX */
+/* Computing MIN */
+ i_3 = (integer) (*x);
+ i_1 = 1, i_2 = min(i_3,*nx);
+ icur = max(i_1,i_2);
+/* Computing MAX */
+/* Computing MIN */
+ i_3 = (integer) (*y);
+ i_1 = 1, i_2 = min(i_3,*ny);
+ jcur = max(i_1,i_2);
+
+/* clear the bitmap */
+
+ i_1 = (*nx << 1) * *ny * *ncv;
+ fill0_(&bitmap[1], &i_1);
+
+/* search along a rectangular spiral path for a line segment having */
+
+/* the following properties: */
+/* 1. the end points are not excluded, */
+/* 2. no mark has been recorded for the segment, */
+/* 3. the values of z at the ends of the segment are such that
+*/
+/* one z is less than the current contour value, and the */
+/* other is greater than or equal to the current contour */
+/* value. */
+
+/* search all boundaries first, then search interior line segments. */
+
+/* note that the interior line segments near excluded points may be */
+
+/* boundaries. */
+
+ ibkey = 0;
+L10:
+ *i = icur;
+ *j = jcur;
+L20:
+ *imax = *i;
+ *imin = -(*i);
+ *jmax = *j;
+ *jmin = -(*j);
+ idir = 0;
+/* direction zero is +i, 1 is +j, 2 is -i, 3 is -j. */
+L30:
+ nxidir = idir + 1;
+ k = nxidir;
+ if (nxidir > 3) {
+ nxidir = 0;
+ }
+L40:
+ *i = abs(*i);
+ *j = abs(*j);
+ if (z[*i + *j * z_dim1] > dmax_) {
+ goto L140;
+ }
+ l = 1;
+/* l=1 means horizontal line, l=2 means vertical line. */
+L50:
+ if (ij[l - 1] >= l1[l - 1]) {
+ goto L130;
+ }
+ ii = *i + i1[l - 1];
+ jj = *j + i1[3 - l - 1];
+ if (z[ii + jj * z_dim1] > dmax_) {
+ goto L130;
+ }
+ jump = 0;
+/* the next 15 statements (or so) detect boundaries. */
+L60:
+ ix = 1;
+ if (ij[3 - l - 1] == 1) {
+ goto L80;
+ }
+ ii = *i - i1[3 - l - 1];
+ jj = *j - i1[l - 1];
+ if (z[ii + jj * z_dim1] > dmax_) {
+ goto L70;
+ }
+ ii = *i + i2[l - 1];
+ jj = *j + i2[3 - l - 1];
+ if (z[ii + jj * z_dim1] < dmax_) {
+ ix = 0;
+ }
+L70:
+ if (ij[3 - l - 1] >= l1[3 - l - 1]) {
+ goto L90;
+ }
+L80:
+ ii = *i + i1[3 - l - 1];
+ jj = *j + i1[l - 1];
+ if (z[ii + jj * z_dim1] > dmax_) {
+ goto L90;
+ }
+ if (z[*i + 1 + (*j + 1) * z_dim1] < dmax_) {
+ switch (jump) {
+ case 0: goto L100;
+ case 1: goto L280;
+ }
+ }
+L90:
+ ix += 2;
+ switch (jump) {
+ case 0: goto L100;
+ case 1: goto L280;
+ }
+L100:
+ if (ix == 3) {
+ goto L130;
+ }
+ if (ix + ibkey == 0) {
+ goto L130;
+ }
+/* now determine whether the line segment is crossed by the contour.
+*/
+ ii = *i + i1[l - 1];
+ jj = *j + i1[3 - l - 1];
+ z1 = z[*i + *j * z_dim1];
+ z2 = z[ii + jj * z_dim1];
+ i_1 = *ncv;
+ for (icv = 1; icv <= i_1; ++icv) {
+ i_2 = ((*nx * (*ny * (icv - 1) + *j - 1) + *i - 1) << 1) + l;
+ if (iget_(&bitmap[1], &i_2) != 0) {
+ goto L120;
+ }
+ if (cv[icv] <= dmin(z1,z2)) {
+ goto L110;
+ }
+ if (cv[icv] <= dmax(z1,z2)) {
+ goto L190;
+ }
+L110:
+ i_2 = ((*nx * (*ny * (icv - 1) + *j - 1) + *i - 1) << 1) + l;
+ mark1_(&bitmap[1], &i_2);
+L120:
+ ;}
+L130:
+ ++l;
+ if (l <= 2) {
+ goto L50;
+ }
+L140:
+ l = idir % 2 + 1;
+ ij[l - 1] = f_i_sign(&ij[l - 1], &l1[k - 1]);
+
+/* lines from z(i,j) to z(i+1,j) and z(i,j+1) are not satisfactory. */
+
+/* continue the spiral. */
+
+L150:
+ if (ij[l - 1] >= l1[k - 1]) {
+ goto L170;
+ }
+ ++ij[l - 1];
+ if (ij[l - 1] > l2[k - 1]) {
+ goto L160;
+ }
+ goto L40;
+L160:
+ l2[k - 1] = ij[l - 1];
+ idir = nxidir;
+ goto L30;
+L170:
+ if (idir == nxidir) {
+ goto L180;
+ }
+ ++nxidir;
+ ij[l - 1] = l1[k - 1];
+ k = nxidir;
+ l = 3 - l;
+ ij[l - 1] = l2[k - 1];
+ if (nxidir > 3) {
+ nxidir = 0;
+ }
+ goto L150;
+L180:
+ if (ibkey != 0) {
+ return 0;
+ }
+ ibkey = 1;
+ goto L10;
+
+/* an acceptable line segment has been found. */
+/* follow the contour until it either hits a boundary or closes. */
+
+L190:
+ iedge = l;
+ cval = cv[icv];
+ if (ix != 1) {
+ iedge += 2;
+ }
+ iflag = ibkey + 2;
+ xint[iedge - 1] = (cval - z1) / (z2 - z1);
+L200:
+ xy[l - 1] = (real) ij[l - 1] + xint[iedge - 1];
+ xy[3 - l - 1] = (real) ij[3 - l - 1];
+ i_1 = ((*nx * (*ny * (icv - 1) + *j - 1) + *i - 1) << 1) + l;
+ mark1_(&bitmap[1], &i_1);
+ i_1 = iflag + icv * 10;
+ (*draw)(x, y, &i_1);
+ if (iflag < 4) {
+ goto L210;
+ }
+ icur = *i;
+ jcur = *j;
+ goto L20;
+
+/* continue a contour. the edges are numbered clockwise with */
+/* the bottom edge being edge number one. */
+
+L210:
+ ni = 1;
+ if (iedge < 3) {
+ goto L220;
+ }
+ *i -= i3[iedge - 1];
+ *j -= i3[iedge + 1];
+L220:
+ for (k = 1; k <= 4; ++k) {
+ if (k == iedge) {
+ goto L250;
+ }
+ ii = *i + i3[k - 1];
+ jj = *j + i3[k];
+ z1 = z[ii + jj * z_dim1];
+ ii = *i + i3[k];
+ jj = *j + i3[k + 1];
+ z2 = z[ii + jj * z_dim1];
+ if (cval <= dmin(z1,z2)) {
+ goto L250;
+ }
+ if (cval > dmax(z1,z2)) {
+ goto L250;
+ }
+ if (k == 1) {
+ goto L230;
+ }
+ if (k != 4) {
+ goto L240;
+ }
+L230:
+ zz = z1;
+ z1 = z2;
+ z2 = zz;
+L240:
+ xint[k - 1] = (cval - z1) / (z2 - z1);
+ ++ni;
+ ks = k;
+L250:
+ ;}
+ if (ni == 2) {
+ goto L260;
+ }
+
+/* the contour crosses all four edges of the cell being examined. */
+/* choose the lines top-to-left and bottom-to-right if the */
+/* interpolation point on the top edge is less than the interpolation
+*/
+/* point on the bottom edge. otherwise, choose the other pair. this
+*/
+/* method produces the same results if the axes are reversed. the */
+/* contour may close at any edge, but must not cross itself inside */
+/* any cell. */
+
+ ks = 5 - iedge;
+ if (xint[2] < xint[0]) {
+ goto L260;
+ }
+ ks = 3 - iedge;
+ if (ks <= 0) {
+ ks += 4;
+ }
+
+/* determine whether the contour will close or run into a boundary */
+/* at edge ks of the current cell. */
+
+L260:
+ l = ks;
+ iflag = 1;
+ jump = 1;
+ if (ks < 3) {
+ goto L270;
+ }
+ *i += i3[ks - 1];
+ *j += i3[ks + 1];
+ l = ks - 2;
+L270:
+ i_1 = ((*nx * (*ny * (icv - 1) + *j - 1) + *i - 1) << 1) + l;
+ if (iget_(&bitmap[1], &i_1) == 0) {
+ goto L60;
+ }
+ iflag = 5;
+ goto L290;
+L280:
+ if (ix != 0) {
+ iflag = 4;
+ }
+L290:
+ iedge = ks + 2;
+ if (iedge > 4) {
+ iedge += -4;
+ }
+ xint[iedge - 1] = xint[ks - 1];
+ goto L200;
+
+} /* gcontr_ */
+
+#undef xy
+#undef ij
+#undef l2
+#undef y
+#undef x
+#undef j
+#undef i
+#undef jmin
+#undef jmax
+#undef imax
+#undef imin
+
+
+/* dimension z(51,51), c(10), work(1680) */
+/* dimension of work is large enough to contain */
+/* 2*(dimension of c)*(total dimension of z) useful bits. see the */
+/* bitmap routines accessed by gcontr. */
+/* real mu */
+/* external draw */
+/* common /cur/ xcur, ycur */
+/* data c(1), c(2), c(3), c(4), c(5) /3.05,3.2,3.5,3.50135,3.6/ */
+/* data c(6), c(7), c(8), c(9), c(10) /3.766413,4.0,4.130149,5.0, */
+/* * 10.0/ */
+/* data nx /51/, ny /51/, nf /10/ */
+/* data xmin /-2.0/, xmax /2.0/, ymin /-2.0/, ymax /2.0/, mu /0.3/ */
+/* dx = (xmax-xmin)/float(nx-1) */
+/* dy = (ymax-ymin)/float(ny-1) */
+/* xcur = 1.0 */
+/* ycur = 1.0 */
+/* if (mod(nx,2).ne.0) ycur = float(ny) */
+/* if (mod(ny,2).ne.0) xcur = float(nx) */
+/* x = xmin - dx */
+/* do 20 i=1,nx */
+/* y = ymin - dy */
+/* x = x + dx */
+/* do 10 j=1,ny */
+/* y = y + dy */
+/* z(i,j) = (1.0-mu)*(2.0/sqrt((x-mu)**2+y**2)+(x-mu)**2+y**2) */
+/* * + mu*(2.0/sqrt((x+1.0-mu)**2+y**2)+(x+1.0-mu)**2+y**2) */
+/* 10 continue */
+/* 20 continue */
+/* call gcontr(z, 51, nx, ny, c, nf, 1.e6, work, draw) */
+/* stop */
+/* end */
+
+/* subroutine draw(x, y, iflag) */
+
+/* do output for gcontr. */
+
+/* integer print */
+/* common /cur/ xcur, ycur */
+/* data print /6/ */
+/* print is the system printer fortran i/o unit number. */
+/* icont = iflag/10 */
+/* jump = mod(iflag,10) */
+/* go to (10, 20, 30, 40, 50, 60), jump */
+/* 10 write (print,99999) icont, x, y */
+/* go to 70 */
+/* 20 write (print,99998) icont, x, y */
+/* go to 70 */
+/* 30 write (print,99997) icont, x, y */
+/* go to 70 */
+/* 40 write (print,99996) icont, x, y */
+/* go to 70 */
+/* 50 write (print,99995) icont, x, y */
+/* go to 70 */
+/* 60 write (print,99994) */
+/* x = xcur */
+/* y = ycur */
+/* 70 return */
+/* 99999 format (17h continue contour, i3, 3h to, 1p2e14.7) */
+/* 99998 format (14h start contour, i3, 19h on the boundary at, 1p2e14.7) */
+/* 99997 format (14h start contour, i3, 19h in the interior at, 1p2e14.7) */
+/* 99996 format (15h finish contour, i3, 19h on the boundary at, 1p2e14.7) */
+/* 99995 format (15h finish contour, i3, 19h in the interior at, 1p2e14.7) */
+/* 99994 format (33h request for current pen position) */
+/* end */
+/* Subroutine */ int cgrid_(integer *nopt, integer *nx, real *sx, real *xs,
+ real *xf, integer *ny, real *sy, real *ys, real *yf)
+{
+ /* System generated locals */
+ integer i_1;
+ real r_1, r_2;
+
+ /* Builtin functions */
+ double f_r_sign(real *, real *);
+
+ /* Local variables */
+ static real xinc, yinc, xmin, ymin, xmax, ymax;
+ extern /* Subroutine */ void plot_(real *, real *, integer *);
+ static integer i, j, n;
+ static real xlgth, ylgth, x1, x2, y2, y1, xx;
+
+
+/* subroutine which draws a frame around the plot and draws */
+/* either tick marks or grid lines. */
+
+/* parameters: nopt -- =0, draw ticks only */
+/* =1, draw grid lines */
+/* =2, draw grid lines to edge of frame. */
+/* nx -- number of intervals in x direction */
+/* sx -- spacing in inches between tick marks or grid lines
+*/
+/* along the x axis */
+/* xs -- location of first tick or grid line on x axis */
+/* xf -- location of right edge of frame */
+/* ny -- number of intervals in y direction */
+/* sy -- spacing in inches between tick marks or grid lines
+*/
+/* along the y axis */
+/* ys -- location of first tick or grid line on y axis */
+/* yf -- location of top edge of frame */
+/* assumptions: nx, sx, ny, sy all positive. */
+/* the lower left-hand corner of the frame is drawn at (0,0)
+*/
+/* if xs<0, use 0; if ys<0, use 0 */
+/* if xf<=0, use nx*sx; if yf<=0, use ny*sy. */
+
+ xinc = *sx;
+ yinc = *sy;
+ xlgth = (real) (*nx) * *sx;
+ ylgth = (real) (*ny) * *sy;
+ xmin = dmax(*xs,0.f);
+ ymin = dmax(*ys,0.f);
+/* Computing MAX */
+ r_1 = *xf, r_2 = xlgth + xmin;
+ xmax = dmax(r_1,r_2);
+/* Computing MAX */
+ r_1 = *yf, r_2 = ylgth + ymin;
+ ymax = dmax(r_1,r_2);
+
+/* draw frame. */
+
+ plot_(&c_b43, &c_b43, &c__3);
+ plot_(&xmax, &c_b43, &c__2);
+ plot_(&xmax, &ymax, &c__2);
+ plot_(&c_b43, &ymax, &c__2);
+ plot_(&c_b43, &c_b43, &c__2);
+ if (*nopt != 0) {
+ goto L130;
+ }
+
+/* draw tick marks. */
+
+ for (j = 1; j <= 4; ++j) {
+ switch (j) {
+ case 1: goto L10;
+ case 2: goto L50;
+ case 3: goto L20;
+ case 4: goto L40;
+ }
+L10:
+ x2 = 0.f;
+ if (xmin != 0.f) {
+ x2 = xmin - *sx;
+ }
+ y2 = 0.f;
+ goto L30;
+L20:
+ xinc = -(doublereal)(*sx);
+ x2 = xmin + xlgth + *sx;
+ if (xmax == xmin + xlgth) {
+ x2 = xmax;
+ }
+ y2 = ymax;
+L30:
+ y1 = y2;
+ y2 += f_r_sign(&c_b104, &xinc);
+ n = *nx;
+ if ((r_1 = xmax - xmin - xlgth, dabs(r_1)) + dabs(xmin) != 0.f) {
+ goto L70;
+ } else {
+ goto L80;
+ }
+L40:
+ yinc = -(doublereal)(*sy);
+ y2 = ymin + ylgth + *sy;
+ if (ymax == ymin + ylgth) {
+ y2 = ymax;
+ }
+ x2 = 0.f;
+ goto L60;
+L50:
+ y2 = 0.f;
+ if (ymin != 0.f) {
+ y2 = ymin - *sy;
+ }
+ x2 = xmax;
+L60:
+ x1 = x2;
+ n = *ny;
+ x2 -= f_r_sign(&c_b104, &yinc);
+ if ((r_1 = ymax - ymin - ylgth, dabs(r_1)) + dabs(ymin) != 0.f) {
+ goto L70;
+ } else {
+ goto L80;
+ }
+L70:
+ ++n;
+L80:
+ i_1 = n;
+ for (i = 1; i <= i_1; ++i) {
+ if (j % 2 == 0) {
+ goto L90;
+ }
+ x2 += xinc;
+ x1 = x2;
+ goto L100;
+L90:
+ y2 += yinc;
+ y1 = y2;
+L100:
+ plot_(&x1, &y1, &c__3);
+ plot_(&x2, &y2, &c__2);
+/* L110: */
+ }
+/* L120: */
+ }
+ goto L240;
+
+/* draw grid lines */
+
+L130:
+ x1 = xmin;
+ x2 = xmin + xlgth;
+ if (*nopt != 2) {
+ goto L140;
+ }
+ x1 = 0.f;
+ x2 = xmax;
+L140:
+ y1 = ymin - *sy;
+ n = *ny + 1;
+ if (ymax == ymin + ylgth) {
+ --n;
+ }
+ if (ymin != 0.f) {
+ goto L150;
+ }
+ y1 = 0.f;
+ --n;
+L150:
+ if (n <= 0) {
+ goto L170;
+ }
+ j = 1;
+ i_1 = n;
+ for (i = 1; i <= i_1; ++i) {
+ j = -j;
+ y1 += *sy;
+ plot_(&x1, &y1, &c__3);
+ plot_(&x2, &y1, &c__2);
+ xx = x1;
+ x1 = x2;
+ x2 = xx;
+/* L160: */
+ }
+L170:
+ y1 = ymin + ylgth;
+ y2 = ymin;
+ if (*nopt != 2) {
+ goto L180;
+ }
+ y1 = ymax;
+ y2 = 0.f;
+L180:
+ n = *nx + 1;
+ if (j < 0) {
+ goto L200;
+ }
+ x1 = xmin - *sx;
+ if (xmax == xmin + xlgth) {
+ --n;
+ }
+ if (xmin != 0.f) {
+ goto L190;
+ }
+ x1 = 0.f;
+ --n;
+L190:
+ if (n <= 0) {
+ goto L240;
+ }
+ xinc = *sx;
+ goto L220;
+L200:
+ x1 = xmin + xlgth + *sx;
+ if (xmin == 0.f) {
+ --n;
+ }
+ if (xmax != xlgth + xmin) {
+ goto L210;
+ }
+ --n;
+ x1 = xmax;
+L210:
+ xinc = -(doublereal)(*sx);
+L220:
+ i_1 = n;
+ for (i = 1; i <= i_1; ++i) {
+ x1 += xinc;
+ plot_(&x1, &y1, &c__3);
+ plot_(&x1, &y2, &c__2);
+ xx = y1;
+ y1 = y2;
+ y2 = xx;
+/* L230: */
+ }
+L240:
+ return 0;
+
+} /* cgrid_ */
+
diff --git a/src/gle/surface/ffitcontour.cpp b/src/gle/surface/ffitcontour.cpp
new file mode 100644
index 0000000..6a971ae
--- /dev/null
+++ b/src/gle/surface/ffitcontour.cpp
@@ -0,0 +1,556 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+/* fitcf.f -- translated by f2c (version of 26 February 1990 17:38:00).
+ You must link the resulting object file with the libraries:
+ -lF77 -lI77 -lm -lc (in that order)
+*/
+
+/* "f2c.h" defines abs() -- conflict with the definition in <math.h> */
+/* changing the order solves the problem */
+#if ( defined(__OS2__) && defined(__EMX__) ) || defined(__WIN32__)
+#include <stdio.h>
+#include <math.h>
+#include "f2c.h"
+#else
+#include "f2c.h"
+#include <stdio.h>
+#include <math.h>
+#endif
+
+doublereal gutre2_(real* a, real* b);
+void gd_message__(const char *s, int l);
+
+#define gprint printf
+/* -- FITCF */
+int glefitcf_(integer* mode, real *x, real *y, integer* l, integer* m, real *u, real *v, integer* n) {
+ /* System generated locals */
+ integer i_1, i_2;
+ real r_1;
+ static real equiv_1[1], equiv_2[1], equiv_3[1], equiv_4[1], equiv_5[1],
+ equiv_6[1], equiv_7[1], equiv_8[1], equiv_9[1], equiv_10[1],
+ equiv_11[1], equiv_12[1];
+
+ /* Local variables */
+ static integer mode0, i, j, k;
+#define r (equiv_10)
+#define z (equiv_10)
+#define a1 (equiv_7)
+#define a2 (equiv_8)
+ static real a3, a4;
+#define b1 (equiv_9)
+#define b2 (equiv_1)
+#define b3 (equiv_2)
+#define b4 (equiv_3)
+ static integer l0, m0, n0;
+#define m1 (equiv_9)
+ static integer k5;
+#define m2 (equiv_1)
+#define m3 (equiv_2)
+#define m4 (equiv_3)
+#define p0 (equiv_5)
+ static real p1;
+#define p2 (equiv_7)
+#define p3 (equiv_9)
+#define q0 (equiv_6)
+#define q1 (equiv_4)
+#define q2 (equiv_11)
+#define q3 (equiv_12)
+#define t2 (equiv_4)
+ static real t3;
+#define w2 (equiv_11)
+#define w3 (equiv_12)
+#define x2 (equiv_5)
+ static real x3;
+ static integer modem1;
+ static real x4, x5;
+#define y2 (equiv_6)
+ static real y3, y4, y5;
+#define dz (equiv_8)
+ static real rm;
+#define sw (equiv_10)
+ static integer lm1, mm1;
+ static real cos2, cos3, sin2, sin3;
+
+/* (Smooth Curve Fitting) */
+/* This subroutine fits a smooth curve to a given set of input */
+/* data points in an X-Y plane. It interpolates points in */
+/* each interval between a pair of data points and generates a */
+/* set of output points consisting of the input data points */
+/* and the interpolated points. It can process either a */
+/* single-valued function or a multiple-valued function. */
+
+/* The input arguments are: */
+
+/* MODE = mode of the curve (must be 1 or 2) */
+/* = 1 for a single-valued function */
+/* = 2 for multiple-valued function */
+/* X = Array of dimension L storing the abscissas of input */
+/* data points (in ascending or descending order for mode */
+/* = 1) */
+/* Y = Array of dimension L storing the ordinates of input */
+/* data points */
+/* L = Number of input data points (must be 2 or greater) */
+/* M = Number of subintervals between each pair of input data */
+/* points (must be 2 or greater). */
+/* N = Number of output points */
+/* = (L-1)*M+1 */
+
+/* The output arguments are: */
+
+/* U = Array of dimension N where the abscissas of output */
+/* points are to be displayed */
+/* V = Array of dimension N where the ordinates of output */
+/* points are to be displayed */
+
+/* Author: Hiroshi Akima, "Interpolation and Smooth Curve */
+/* Fitting Based on Local Procedures", COMM. ACM 15, */
+/* 914-918 (1972), and "A New Method of Interpolation */
+/* and Smooth Curve Fitting Based on Local */
+/* Procedures", J. ACM 17, 589-602 (1970). */
+
+/* Corrections: M.R. Andersen, "Remark on Algorithm 433", ACM */
+/* Trans. on Math. Software, 2, 208 (1976). */
+/* (30-JAN-82) */
+
+/* Preliminary processing */
+
+ /* Parameter adjustments */
+ --v;
+ --u;
+ --y;
+ --x;
+
+ /* Function Body */
+ mode0 = *mode;
+ modem1 = mode0 - 1;
+ l0 = *l;
+ lm1 = l0 - 1;
+ m0 = *m;
+ mm1 = m0 - 1;
+ n0 = *n;
+ if (mode0 <= 0) {
+ goto L320;
+ }
+ if (mode0 >= 3) {
+ goto L320;
+ }
+ if (lm1 <= 0) {
+ goto L330;
+ }
+ if (mm1 <= 0) {
+ goto L340;
+ }
+ if (n0 != lm1 * m0 + 1) {
+ gprint("Improper n value %d, wanted %d \n",n0,lm1 * m0 + 1);
+ gprint("n0 %d, lm1 %d, m0 %d l0 %d \n",n0,lm1,m0,l0);
+ goto L350;
+ }
+
+ switch (mode0) {
+ case 1: goto L10;
+ case 2: goto L60;
+ }
+L10:
+ i = 2;
+ if ((r_1 = x[1] - x[2]) < (float)0.) {
+ goto L20;
+ } else if (r_1 == 0) {
+ gprint("Identical x values 1, %g %g \n",(double) x[1], (double) x[2]);
+ goto L360;
+ } else {
+ goto L40;
+ }
+L20:
+ if (l0 <= 2) {
+ goto L80;
+ }
+ i_1 = l0;
+ for (i = 3; i <= i_1; ++i) {
+ if ((r_1 = x[i - 1] - x[i]) < (float)0.) {
+ goto L30;
+ } else if (r_1 == 0) {
+ gprint("Identical x values i, %g %g \n",(double) x[i-1], (double) x[i]);
+ goto L360;
+ } else {
+ goto L370;
+ }
+L30:
+ ;}
+ goto L80;
+L40:
+ if (l0 <= 2) {
+ goto L80;
+ }
+ i_1 = l0;
+ for (i = 3; i <= i_1; ++i) {
+ if ((r_1 = x[i - 1] - x[i]) < (float)0.) {
+ goto L370;
+ } else if (r_1 == 0) {
+ gprint("Identical x aavalues i, %g %g \n",(double) x[i-1], (double) x[i]);
+ goto L360;
+ } else {
+ goto L50;
+ }
+L50:
+ ;}
+ goto L80;
+L60:
+ i_1 = l0;
+ for (i = 2; i <= i_1; ++i) {
+ if (x[i - 1] != x[i]) {
+ goto L70;
+ }
+ if (y[i - 1] == y[i]) {
+ goto L380;
+ }
+L70:
+ ;}
+
+L80:
+ k = n0 + m0;
+ i = l0 + 1;
+ i_1 = l0;
+ for (j = 1; j <= i_1; ++j) {
+ k -= m0;
+ --i;
+ u[k] = x[i];
+/* L90: */
+ v[k] = y[i];
+ }
+ rm = (real) m0;
+ rm = (float)1. / rm;
+
+/* Main DO-loop */
+
+ k5 = m0 + 1;
+ i_1 = l0;
+ for (i = 1; i <= i_1; ++i) {
+
+/* Routines to pick up necessary X and Y values and to */
+/* estimate them if necessary */
+
+ if (i > 1) {
+ goto L130;
+ }
+ x3 = u[1];
+ y3 = v[1];
+ x4 = u[m0 + 1];
+ y4 = v[m0 + 1];
+ a3 = x4 - x3;
+ *b3 = y4 - y3;
+ if (modem1 == 0) {
+ *m3 = *b3 / a3;
+ }
+ if (l0 != 2) {
+ goto L140;
+ }
+ a4 = a3;
+ *b4 = *b3;
+L100:
+ switch (mode0) {
+ case 1: goto L120;
+ case 2: goto L110;
+ }
+L110:
+ *a2 = a3 + a3 - a4;
+ *a1 = *a2 + *a2 - a3;
+L120:
+ *b2 = *b3 + *b3 - *b4;
+ *b1 = *b2 + *b2 - *b3;
+ switch (mode0) {
+ case 1: goto L180;
+ case 2: goto L210;
+ }
+L130:
+ *x2 = x3;
+ *y2 = y3;
+ x3 = x4;
+ y3 = y4;
+ x4 = x5;
+ y4 = y5;
+ *a1 = *a2;
+ *b1 = *b2;
+ *a2 = a3;
+ *b2 = *b3;
+ a3 = a4;
+ *b3 = *b4;
+ if (i >= lm1) {
+ goto L150;
+ }
+L140:
+ k5 += m0;
+ x5 = u[k5];
+ y5 = v[k5];
+ a4 = x5 - x4;
+ *b4 = y5 - y4;
+ if (modem1 == 0) {
+ *m4 = *b4 / a4;
+ }
+ goto L160;
+L150:
+ if (modem1 != 0) {
+ a4 = a3 + a3 - *a2;
+ }
+ *b4 = *b3 + *b3 - *b2;
+L160:
+ if (i == 1) {
+ goto L100;
+ }
+ switch (mode0) {
+ case 1: goto L170;
+ case 2: goto L200;
+ }
+
+/* Numerical differentiation */
+
+L170:
+ *t2 = t3;
+L180:
+ *w2 = (r_1 = *m4 - *m3, dabs(r_1));
+ *w3 = (r_1 = *m2 - *m1, dabs(r_1));
+ *sw = *w2 + *w3;
+ if (*sw != (float)0.) {
+ goto L190;
+ }
+ *w2 = (float).5;
+ *w3 = (float).5;
+ *sw = (float)1.;
+L190:
+ t3 = (*w2 * *m2 + *w3 * *m3) / *sw;
+ if (i - 1 <= 0) {
+ goto L310;
+ } else {
+ goto L240;
+ }
+
+L200:
+ cos2 = cos3;
+ sin2 = sin3;
+L210:
+ *w2 = (r_1 = a3 * *b4 - a4 * *b3, dabs(r_1));
+ *w3 = (r_1 = *a1 * *b2 - *a2 * *b1, dabs(r_1));
+ if (*w2 + *w3 != (float)0.) {
+ goto L220;
+ }
+ *w2 = gutre2_(&a3, b3);
+ *w3 = gutre2_(a2, b2);
+L220:
+ cos3 = *w2 * *a2 + *w3 * a3;
+ sin3 = *w2 * *b2 + *w3 * *b3;
+ *r = cos3 * cos3 + sin3 * sin3;
+ if (*r == (float)0.) {
+ goto L230;
+ }
+ *r = sqrt(*r);
+ cos3 /= *r;
+ sin3 /= *r;
+L230:
+ if (i - 1 <= 0) {
+ goto L310;
+ } else {
+ goto L250;
+ }
+
+/* Determination of the coefficients */
+
+L240:
+ *q2 = ((*m2 - *t2) * (float)2. + *m2 - t3) / *a2;
+ *q3 = (-(doublereal)(*m2) - *m2 + *t2 + t3) / (*a2 * *a2);
+ goto L260;
+
+L250:
+ *r = gutre2_(a2, b2);
+ p1 = *r * cos2;
+ *p2 = *a2 * (float)3. - *r * (cos2 + cos2 + cos3);
+ *p3 = *a2 - p1 - *p2;
+ *q1 = *r * sin2;
+ *q2 = *b2 * (float)3. - *r * (sin2 + sin2 + sin3);
+ *q3 = *b2 - *q1 - *q2;
+ goto L280;
+
+/* Computation of the polynomials */
+
+L260:
+ *dz = *a2 * rm;
+ *z = (float)0.;
+ i_2 = mm1;
+ for (j = 1; j <= i_2; ++j) {
+ ++k;
+ *z += *dz;
+ u[k] = *p0 + *z;
+/* L270: */
+ v[k] = *q0 + *z * (*q1 + *z * (*q2 + *z * *q3));
+ }
+ goto L300;
+
+L280:
+ *z = (float)0.;
+ i_2 = mm1;
+ for (j = 1; j <= i_2; ++j) {
+ ++k;
+ *z += rm;
+ u[k] = *p0 + *z * (p1 + *z * (*p2 + *z * *p3));
+/* L290: */
+ v[k] = *q0 + *z * (*q1 + *z * (*q2 + *z * *q3));
+ }
+
+L300:
+ ++k;
+L310:
+ ;}
+ goto L410;
+
+/* Error exit */
+
+L320:
+ gd_message__("Cannot SMOOTH: Mode out of proper range 1..2", 29L);
+ goto L400;
+L330:
+ gd_message__("Cannot SMOOTH: L = 1 or less", 13L);
+ goto L400;
+L340:
+ gd_message__("Cannot SMOOTH: M = 1 or less", 13L);
+ goto L400;
+L350:
+ gd_message__("Cannot SMOOTH: Improper N value", 16L);
+ goto L400;
+L360:
+ gd_message__("Cannot SMOOTH: Identical X values", 18L);
+ goto L390;
+L370:
+ gd_message__("Cannot SMOOTH: X values out of sequence", 24L);
+ goto L390;
+L380:
+ gd_message__("Cannot SMOOTH: Identical X and Y values", 24L);
+L390:
+L400:
+
+L410:
+ return 0;
+} /* glefitcf_ */
+
+#undef sw
+#undef dz
+#undef y2
+#undef x2
+#undef w3
+#undef w2
+#undef t2
+#undef q3
+#undef q2
+#undef q1
+#undef q0
+#undef p3
+#undef p2
+#undef p0
+#undef m4
+#undef m3
+#undef m2
+#undef m1
+#undef b4
+#undef b3
+#undef b2
+#undef b1
+#undef a2
+#undef a1
+#undef z
+#undef r
+
+
+/* -- GUTRE2 */
+doublereal gutre2_(real* a, real* b) {
+ /* Initialized data */
+
+ static real zero = (float)0.;
+ static real two = (float)2.;
+ static real four = (float)4.;
+
+ /* System generated locals */
+ real ret_val, r_1;
+
+ /* Local variables */
+ static real aabs, babs, r, s;
+
+/* (Euclidean Norm of 2-Vector) */
+/* Return SQRT(A**2+B**2) without doing a square root, and */
+/* without destructive underflow or overflow. */
+/* (Cleve Moler, University of New Mexico) */
+/* (09-APR-82) */
+
+
+ aabs = dabs(*a);
+ babs = dabs(*b);
+/* --- IF (BABS .GT. AABS) THEN -- SWAP A AND B */
+ if (babs <= aabs) {
+ goto L10;
+ }
+ r = babs;
+ babs = aabs;
+ aabs = r;
+/* --- END IF */
+/* --- IF (BABS .EQ. ZERO) THEN -- Special case sudden exit */
+L10:
+ if (babs != zero) {
+ goto L20;
+ }
+ ret_val = aabs;
+ goto L40;
+/* --- END IF */
+/* --- DO FOREVER */
+L20:
+/* Computing 2nd power */
+ r_1 = babs / aabs;
+ r = r_1 * r_1;
+/* --- IF ((TWO+R) .EQ. TWO) THEN -- Converged */
+ if (two + r != two) {
+ goto L30;
+ }
+ ret_val = aabs;
+ goto L40;
+/* --- END IF */
+L30:
+ s = r / (four + r);
+ aabs += two * s * aabs;
+ babs = s * babs;
+/* --- END FOREVER */
+ goto L20;
+
+L40:
+ return ret_val;
+} /* gutre2_ */
diff --git a/src/gle/surface/files.txt b/src/gle/surface/files.txt
new file mode 100644
index 0000000..6f8085d
--- /dev/null
+++ b/src/gle/surface/files.txt
@@ -0,0 +1,52 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+#
+# files list for GLE to be included by the makefiles
+#
+
+INCLUDES = \
+gsurface.h \
+f2c.h
+
+OBJECTS = \
+gsurface.$(OBJ_SUFF) \
+hide.$(OBJ_SUFF) \
+fcontour.$(OBJ_SUFF) \
+ffitcontour.$(OBJ_SUFF) \
+gcontour.$(OBJ_SUFF)
diff --git a/src/gle/surface/gcontour.cpp b/src/gle/surface/gcontour.cpp
new file mode 100644
index 0000000..471f069
--- /dev/null
+++ b/src/gle/surface/gcontour.cpp
@@ -0,0 +1,427 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+/*
+ Contouring program, creates gle files.
+*/
+
+#include "../all.h"
+#include "../tokens/Tokenizer.h"
+#include "../core.h"
+#include "../glearray.h"
+#include "../file_io.h"
+#include "../texinterface.h"
+#include "../cutils.h"
+#include "../cmdline.h"
+#include "../config.h"
+#include "../mem_limits.h"
+#include "../token.h"
+#include "../gprint.h"
+#include "../cutils.h"
+
+#define BEGINDEF extern
+#include "../begin.h"
+
+#include "f2c.h"
+
+double get_next_exp(TOKENS tk, int ntk, int *curtok);
+void get_next_exp_file(TOKENS tk, int ntok, int *curtok, string* res);
+
+#define kw(ss) if (ct <= ntk && str_i_equals(tk[ct],ss))
+#define next_file_eval(s) get_next_exp_file(tk,ntk,&ct,&s)
+#define next_str(s) ct+=1;s=tk[ct]
+
+bool smooth = false;
+int smoothsub = 5;
+
+void draw_(double *x, double *y, int *iflag);
+int gcontr_(double *, int *, int *, int *, double *, int *, double *, int *, S_fp draw);
+int glefitcf_(int* mode, double *x, double *y, int* l, int* m, double *u, double *v, int* n);
+
+class GLEContourInfo {
+private:
+ FILE* m_DatFile;
+ FILE* m_LabFile;
+ vector <double> m_CVal;
+ vector <string> m_CLab;
+ vector <double> m_XPt;
+ vector <double> m_YPt;
+ double m_XCur, m_YCur;
+ GLEZData m_Data;
+public:
+ GLEContourInfo();
+ ~GLEContourInfo();
+ inline int getNbLines() { return m_CVal.size(); }
+ inline double getCValue(int i) { return m_CVal[i]; }
+ inline void addValue(double v) { m_CVal.push_back(v); }
+ inline double* getCValueArray() { return (double*)&m_CVal[0]; }
+ inline double getXCur() { return m_XCur; }
+ inline double getYCur() { return m_YCur; }
+ inline void setXCur(double v) { m_XCur = v; }
+ inline void setYCur(double v) { m_YCur = v; }
+ inline int getNbDataPoints() { return m_XPt.size(); }
+ inline double getDataX(int i) { return m_XPt[i]; }
+ inline double getDataY(int i) { return m_YPt[i]; }
+ inline double* getDataXArray() { return &m_XPt[0]; }
+ inline double* getDataYArray() { return &m_YPt[0]; }
+ inline void read(const string& fname) throw(ParserError) { m_Data.read(fname); }
+ inline GLERectangle* getBounds() { return m_Data.getBounds(); }
+ inline int getNX() { return m_Data.getNX(); }
+ inline int getNY() { return m_Data.getNY(); }
+ inline double getZMin() { return m_Data.getZMin(); }
+ inline double getZMax() { return m_Data.getZMax(); }
+ inline double* getData() { return m_Data.getData(); }
+ void addDataPoint(double x, double y);
+ void setDataPoint(int i, double x, double y);
+ void addAllDataPoints();
+ void clearDataPoints();
+ double sx(double v);
+ double sy(double v);
+ void addUnknown();
+ void addPoint(double x, double y);
+ void addPointScale(double x, double y);
+ void addLabel(double x, double y, int i, double v);
+ void addVect(int m, double x, double y);
+ void fillDefault(double zmin, double zmax, double zdel);
+ void createLabels(bool alpha);
+ void openData(const string& name, const string& lab) throw(ParserError);
+ void closeData();
+ void doContour(double zz[], int nrz, int nx, int ny, double zmax);
+ void draw(double* x, double* y, int iflag);
+};
+
+GLEContourInfo* g_ContourInfo = NULL;
+
+GLEContourInfo::GLEContourInfo() {
+ m_DatFile = NULL;
+ m_LabFile = NULL;
+ m_XCur = 0.0;
+ m_YCur = 0.0;
+}
+
+GLEContourInfo::~GLEContourInfo() {
+}
+
+void GLEContourInfo::addDataPoint(double x, double y) {
+ m_XPt.push_back(x);
+ m_YPt.push_back(y);
+}
+
+void GLEContourInfo::setDataPoint(int i, double x, double y) {
+ m_XPt[i] = x;
+ m_YPt[i] = y;
+}
+
+void GLEContourInfo::clearDataPoints() {
+ m_XPt.clear();
+ m_YPt.clear();
+}
+
+void GLEContourInfo::addAllDataPoints() {
+ for (int i = 0; i < getNbDataPoints(); i++) {
+ addPoint(getDataX(i), getDataY(i));
+ }
+}
+
+void GLEContourInfo::fillDefault(double zmin, double zmax, double zdel) {
+ double zval = zmin;
+ do {
+ m_CVal.push_back(zval);
+ zval += zdel;
+ } while (zval <= zmax);
+}
+
+void GLEContourInfo::createLabels(bool alpha) {
+ for (int i = 0; i < getNbLines(); i++) {
+ if (alpha) {
+ char buff[20];
+ sprintf(buff,"%c",i+'A');
+ m_CLab.push_back(buff);
+ } else {
+ // use numberformat instead later on
+ char buff[50];
+ sprintf(buff,"%g",m_CVal[i]);
+ m_CLab.push_back(buff);
+ }
+ }
+}
+
+void GLEContourInfo::openData(const string& name, const string& lab) throw(ParserError) {
+ m_DatFile = validate_fopen(name, "w", false);
+ m_LabFile = validate_fopen(lab, "w", false);
+}
+
+void GLEContourInfo::closeData() {
+ fclose(m_DatFile);
+ fclose(m_LabFile);
+ m_DatFile = NULL;
+ m_LabFile = NULL;
+}
+
+void GLEContourInfo::doContour(double zz[], int nrz, int nx, int ny, double zmax) {
+ int ncv = getNbLines();
+ // dimension of work is large enough to contain
+ // 2*(dimension of c)*(total dimension of z) useful bits
+ int bytes = ((int)sizeof(int) * 2 * ncv * nx * ny)/31 + 10;
+ int* work = (int*)malloc(bytes);
+ if (work == NULL) {
+ printf("Unable to allocate storage for work array\n");
+ exit(1);
+ }
+ memset(work, 0, bytes);
+ zmax = zmax + 100; /* no clipping */
+ double* cvalp = getCValueArray();
+ gcontr_(zz, &nrz, &nx, &ny, cvalp, &ncv, &zmax, work, (S_fp)draw_);
+}
+
+double GLEContourInfo::sx(double v) {
+ GLERectangle* bounds = getBounds();
+ return bounds->getXMin() + (bounds->getXMax()-bounds->getXMin())*(v-1)/(getNX()-1);
+}
+
+double GLEContourInfo::sy(double v) {
+ GLERectangle* bounds = getBounds();
+ return bounds->getYMin() + (bounds->getYMax()-bounds->getYMin())*(v-1)/(getNY()-1);
+}
+
+void GLEContourInfo::addUnknown() {
+ fprintf(m_DatFile, "* *\n");
+}
+
+void GLEContourInfo::addPoint(double x, double y) {
+ fprintf(m_DatFile,"%g %g\n", x, y);
+}
+
+void GLEContourInfo::addPointScale(double x, double y) {
+ fprintf(m_DatFile,"%g %g\n", sx(x), sy(y));
+}
+
+void GLEContourInfo::addLabel(double x, double y, int i, double v) {
+ fprintf(m_LabFile,"%g %g %d %g\n", x, y, i, v);
+}
+
+void GLEContourInfo::draw(double* x, double* y, int iflag) {
+ int ih = iflag / 10;
+ /* printf("level %d \n",ih); */
+ int il = iflag - ih * 10;
+ switch (il) {
+ case 6: /* Get current point */
+ *x = getXCur();
+ *y = getYCur();
+ break;
+ case 2: /* start contour at bondary */
+ case 3: /* start contour not at bondary */
+ if (smooth) addVect(1, sx(*x), sy(*y));
+ else {
+ addUnknown();
+ addPointScale(*x, *y);
+ }
+ addLabel(sx(*x),sy(*y), ih-1, getCValue(ih-1));
+ break;
+ case 1: /* continue a contour */
+ if (smooth) addVect(2, sx(*x), sy(*y));
+ else addPointScale(*x, *y);
+ break;
+ case 4: /* finish contour at a boundary */
+ if (smooth) addVect(4, sx(*x), sy(*y));
+ else addPointScale(*x, *y);
+ break;
+ case 5: /* finish close contour */
+ if (smooth) addVect(3, sx(*x), sy(*y));
+ else addPointScale(*x, *y);
+ break;
+ }
+ setXCur(*x);
+ setYCur(*y);
+}
+
+void GLEContourInfo::addVect(int m, double x, double y) {
+ if (m == 1) {
+ if (getNbDataPoints() != 0) printf("Error, some points not drawn \n");
+ clearDataPoints();
+ }
+ int nbpts = getNbDataPoints();
+ if (nbpts > 0 && getDataX(nbpts-1) == x && getDataY(nbpts-1) == y) {
+ if (m <= 2) addDataPoint(x, y);
+ } else {
+ addDataPoint(x, y);
+ }
+ // Connect the ends by adding some points if contour is right sort
+ // 4 = boundary, 3 = closed shape
+ if (m == 3 || m == 4) {
+ if (nbpts < 2) {
+ addAllDataPoints();
+ clearDataPoints();
+ return;
+ }
+ bool snipends = false;
+ if (m == 3) {
+ snipends = true;
+ int nbpts = getNbDataPoints();
+ addDataPoint(getDataX(nbpts-1), getDataY(nbpts-1));
+ for (int i = nbpts-1; i > 0; i--) {
+ setDataPoint(i, getDataX(i-1), getDataY(i-1));
+ }
+ setDataPoint(0, getDataX(nbpts-1), getDataY(nbpts-1));
+ addDataPoint(getDataX(2), getDataY(2));
+ }
+ int ninp = getNbDataPoints();
+ int mode = 2; // multi valued
+ // int nsub = smoothsub; // user parameter
+ // if (nsub < 3) nsub = 3;
+
+ int nsub = 10;
+ int nout = (ninp-1)*nsub+1;
+ cout << "nsub = " << nsub << endl;
+ double* xout = (double*)malloc(nout*sizeof(double));
+ double* yout = (double*)malloc(nout*sizeof(double));
+ glefitcf_(&mode,getDataXArray(),getDataYArray(),&ninp,&nsub,xout,yout,&nout);
+ clearDataPoints();
+ addUnknown();
+ if (snipends) {
+ for (int i = nsub; i < nout-nsub; i++) {
+ addPoint(xout[i], yout[i]);
+ }
+ } else {
+ cout << "nin = " << ninp << " nout = " << nout << endl;
+ for (int i = 0; i < nout; i++) {
+ addPoint(xout[i], yout[i]);
+ }
+ }
+ free(xout); free(yout);
+ }
+}
+
+void get_contour_values(GLEContourInfo* info, int ct) throw(ParserError) {
+ double from, to, step;
+ bool has_from = false;
+ bool has_to = false;
+ bool has_step = false;
+ while (ct < ntk) {
+ if (str_i_equals(tk[ct+1], "FROM")) {
+ ct++;
+ from = get_next_exp(tk, ntk, &ct);
+ has_from = true;
+ } else if (str_i_equals(tk[ct+1], "TO")) {
+ ct++;
+ to = get_next_exp(tk, ntk, &ct);
+ has_to = true;
+ } else if (str_i_equals(tk[ct+1], "STEP")) {
+ ct++;
+ step = get_next_exp(tk, ntk, &ct);
+ has_step = true;
+ } else {
+ double v = get_next_exp(tk, ntk, &ct);
+ info->addValue(v);
+ }
+ }
+ if (has_from && has_to && has_step) {
+ info->fillDefault(from, to, step);
+ }
+}
+
+void begin_contour(int *pln, int *pcode, int *cp) throw(ParserError) {
+ string data_file;
+ vector<double> cval;
+ vector<string> clab;
+ // Create new contourinfo object
+ if (g_ContourInfo != NULL) {
+ delete g_ContourInfo;
+ g_ContourInfo = NULL;
+ }
+ g_ContourInfo = new GLEContourInfo();
+ // Start with pcode from the next line
+ (*pln)++;
+ begin_init();
+ while (true) {
+ int st = begin_token(&pcode,cp,pln,srclin,tk,&ntk,outbuff);
+ if (!st) {
+ /* exit loop */
+ break;
+ }
+ int ct = 1;
+ // cout << "ct = " << ct << " tk = " << ntk << " tk = " << tk[ct] << endl;
+ kw("DATA") {
+ next_file_eval(data_file);
+ g_ContourInfo->read(data_file);
+ } else kw("VALUES") {
+ get_contour_values(g_ContourInfo, ct);
+ } else kw("LABELS") {
+ // get_contour_label_sett(&alpha);
+ } else kw("SMOOTH") {
+ smoothsub = atoi(tk[++ct]);
+ } else if (ct <= ntk) {
+ stringstream err;
+ err << "illegal keyword in contour block: '" << tk[ct] << "'";
+ g_throw_parser_error(err.str());
+ }
+ }
+ int nx = g_ContourInfo->getNX();
+ int ny = g_ContourInfo->getNY();
+ double zmin = g_ContourInfo->getZMin();
+ double zmax = g_ContourInfo->getZMax();
+ if (g_ContourInfo->getNbLines() == 0) {
+ g_ContourInfo->fillDefault(zmin, zmax, (zmax-zmin)/10.0);
+ }
+ int zdim = nx;
+ g_ContourInfo->createLabels(true);
+ string dat_file, val_file, lab_file;
+ GetMainName(data_file, dat_file);
+ GetMainName(data_file, val_file);
+ GetMainName(data_file, lab_file);
+ dat_file += "-cdata.dat";
+ val_file += "-cvalues.dat";
+ lab_file += "-clabels.dat";
+ FILE* val_f = validate_fopen(val_file, "w", false);
+ if (val_f != NULL) {
+ for (int i = 0; i < g_ContourInfo->getNbLines(); i++) {
+ fprintf(val_f, "%g\n", g_ContourInfo->getCValue(i));
+ }
+ fclose(val_f);
+ }
+ g_ContourInfo->openData(dat_file, lab_file);
+ g_ContourInfo->doContour(g_ContourInfo->getData(),zdim,nx,ny,zmax);
+ g_ContourInfo->closeData();
+}
+
+void plot_(double *a, double *b, int *c) {
+}
+
+void draw_(double *x, double *y, int *iflag) {
+ g_ContourInfo->draw(x, y, *iflag);
+}
diff --git a/src/gle/surface/gsurface.cpp b/src/gle/surface/gsurface.cpp
new file mode 100644
index 0000000..9a880f8
--- /dev/null
+++ b/src/gle/surface/gsurface.cpp
@@ -0,0 +1,683 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+/*
+ * Trying to add surface support back into GLE
+ * Jan Struyf 2005
+ */
+
+#include "../all.h"
+#include "../tokens/Tokenizer.h"
+#include "../core.h"
+#include "../file_io.h"
+#include "../texinterface.h"
+#include "../cutils.h"
+#include "../cmdline.h"
+#include "../config.h"
+#include "../mem_limits.h"
+#include "../token.h"
+#include "../gprint.h"
+#include "../cutils.h"
+#include "../gle-block.h"
+
+#define BEGINDEF extern
+#include "../begin.h"
+
+#include "gsurface.h"
+
+extern int gle_debug;
+
+FILE *df;
+
+void hide(float *z,int nx, int ny, float minz, float maxz, struct surface_struct *sff);
+void hide_enddefaults(void);
+
+void text_expand(int x);
+void hide_defaults();
+void pass_line() throw(ParserError);
+void pass_title();
+void pass_cube();
+void pass_top();
+void pass_bot();
+void pass_marker();
+void pass_droplines();
+void pass_riselines();
+void pass_back();
+void pass_right();
+void pass_base();
+void pass_axis();
+void pass_anytitle();
+void pass_zclip();
+void pass_points(string);
+
+void getstr(char *s);
+float getf(void);
+int geton(void);
+//void pass_data(int *nx, int *ny, float *zmin, float *zmax);
+void pass_data(bool force_zdata);
+void pass_zdata(string,int *nx, int *ny, double *zmin, double *zmax);
+bool alloc_zdata(int nx, int ny);
+extern int trace_on,this_line;
+char input_file[80];
+static int xsample,ysample;
+
+static struct surface_struct sf;
+static double zmin = 10e10,zmax = -10e10;
+static float *z;
+static int nx,ny;
+static double dxmin,dymin,dxmax,dymax;
+double zclipmin,zclipmax;
+int zclipminset,zclipmaxset;
+int ct;
+
+surface_struct* GLEInterface::getSurface() {
+ return &sf;
+}
+
+void clean_surface() {
+ sf.z = NULL;
+}
+
+class GLESurfaceBlockInstance : public GLEBlockInstance {
+public:
+ GLESurfaceBlockInstance(GLESurfaceBlockBase* parent);
+ virtual ~GLESurfaceBlockInstance();
+ virtual void executeLine(GLESourceLine& sline);
+ virtual void endExecuteBlock();
+
+private:
+ GLEPoint m_origin;
+};
+
+GLESurfaceBlockInstance::GLESurfaceBlockInstance(GLESurfaceBlockBase* parent):
+ GLEBlockInstance(parent)
+{
+ g_get_xy(&m_origin);
+ hide_defaults();
+}
+
+GLESurfaceBlockInstance::~GLESurfaceBlockInstance() {
+}
+
+void GLESurfaceBlockInstance::executeLine(GLESourceLine& sline) {
+ token_space();
+ begin_init();
+ int st = begin_token(sline, srclin, tk, &ntk, outbuff, true);
+ if (!st) {
+ return;
+ }
+ ct = 1;
+ pass_line();
+}
+
+void GLESurfaceBlockInstance::endExecuteBlock() {
+ if (nx==0 || ny==0) {
+ // Create fake dataset for now...
+ nx = ny = 2;
+ alloc_zdata(nx,ny);
+ z[0] = z[1] = z[2] = z[3] = -GLE_INF;
+ }
+ if (zclipminset || zclipmaxset) {
+ for (int li = 0; li< nx*ny; li++) {
+ if (zclipminset) if (z[li]<zclipmin) z[li] = zclipmin;
+ if (zclipmaxset) if (z[li]>zclipmax) z[li] = zclipmax;
+ }
+ if (zclipminset) zmin = zclipmin;
+ if (zclipmaxset) zmax = zclipmax;
+ }
+ hide_enddefaults();
+ if (sf.zaxis.min != sf.zaxis.max) {
+ zmin = sf.zaxis.min;
+ zmax = sf.zaxis.max;
+ }
+ sf.nx = nx;
+ sf.ny = ny;
+ sf.z = z;
+ sf.zmin = zmin;
+ sf.zmax = zmax;
+ hide(z,nx,ny,zmin,zmax,&sf);
+ g_move(m_origin);
+}
+
+GLESurfaceBlockBase::GLESurfaceBlockBase():
+ GLEBlockWithSimpleKeywords("surface", false)
+{
+ const char* commands[] = {
+ "SIZE", "TITLE", "CUBE", "DATA", "ZDATA", "ROTATE", "EYE",
+ "VIEW", "HARRAY", "ZCLIP", "SKIRT", "XLINES", "YLINES",
+ "TOP", "UNDERNEATH", "HIDDEN", "MARKER", "POINTS", "DROPLINES",
+ "RISELINES", "BASE", "BACK", "RIGHT", "ZCOLOUR", "ZCOLOR", "" };
+ for (int i = 0; commands[i][0] != 0; ++i) {
+ addKeyWord(commands[i]);
+ }
+ const char* axis[] = { "X", "Y", "Z", "" };
+ for (int i = 0; axis[i][0] != 0; ++i) {
+ addKeyWord(std::string(axis[i]) + "AXIS");
+ addKeyWord(std::string(axis[i]) + "TITLE");
+ }
+}
+
+GLESurfaceBlockBase::~GLESurfaceBlockBase() {
+}
+
+GLEBlockInstance* GLESurfaceBlockBase::beginExecuteBlockImpl(GLESourceLine& /* sline */, int* /* pcode */, int* /* cp */) {
+ return new GLESurfaceBlockInstance(this);
+}
+
+#define kw(k) if (str_i_equals(tk[ct],k))
+
+char* getstrv() {
+ if (ct >= ntk) {
+ gprint("Expecting string \n");
+ return NULL;
+ }
+ string result;
+ pass_file_name(tk[++ct], result);
+ return sdup((char*)result.c_str());
+}
+
+void getstr(char *s) {
+ if (ct>=ntk) { gprint("Expecting Color or Lstyle\n"); return;}
+ strncpy(s,tk[++ct],11);
+}
+
+float getf() {
+ if (ct>=ntk) gprint("Expecting Number\n");
+ return atof(tk[++ct]);
+}
+
+int geton() {
+ if (ct>=ntk) gprint("Expecting ON | OFF\n");
+ ct++;
+ if (str_i_equals(tk[ct],"ON")) return true;
+ if (str_i_equals(tk[ct],"OFF")) return false;
+ gprint("Expecting ON | OFF, assuming ON\n");
+ return true;
+}
+
+void pass_line() throw(ParserError) {
+ if (ntk<1) return;
+ kw("SIZE") {sf.screenx = getf(); sf.screeny = getf();}
+ else kw("TITLE") pass_title();
+ else kw("CUBE") pass_cube();
+// else kw("DATA") { pass_data(&nx,&ny,&zmin,&zmax); }
+ else kw("DATA") { pass_data(false); }
+ else kw("ZDATA") { pass_data(true); }
+ else kw("ROTATE") {sf.xrotate = getf(); sf.yrotate = getf(); sf.zrotate = getf();}
+ else kw("EYE") {sf.eye_x = getf(); sf.eye_y = getf(); sf.vdist = getf();}
+ else kw("VIEW") {sf.eye_x = getf(); sf.eye_y = getf(); sf.vdist = getf();}
+ else kw("HARRAY") sf.maxh = (int)getf();
+ else kw("ZCLIP") pass_zclip();
+ else kw("SKIRT") sf.skirt_on = geton();
+ else kw("XLINES") sf.xlines_on = geton();
+ else kw("YLINES") sf.ylines_on = geton();
+ else kw("TOP") pass_top();
+ else kw("UNDERNEATH") pass_bot();
+ else kw("HIDDEN") sf.hidden_on = geton();
+ else kw("MARKER") pass_marker();
+ else kw("POINTS") pass_data(false);
+ else kw("DROPLINES") pass_droplines();
+ else kw("RISELINES") pass_riselines();
+ else kw("BASE") pass_base();
+ else kw("BACK") pass_back();
+ else kw("RIGHT") pass_right();
+ else kw("ZCOLOUR") getstr(sf.zcolour);
+ else kw("ZCOLOR") getstr(sf.zcolour);
+ else if (str_i_str(tk[1],"AXIS")!=NULL) pass_axis();
+ else if (str_i_str(tk[1],"TITLE")!=NULL) pass_anytitle();
+ else {
+ stringstream err;
+ err << "illegal keyword in surface block: '" << tk[ct] << "'";
+ g_throw_parser_error(err.str());
+ }
+ if (ct<ntk) {
+ stringstream err;
+ err << "extra parameters on end of line: '" << tk[ct] << "'";
+ g_throw_parser_error(err.str());
+ }
+}
+
+void pass_title() {
+ sf.title = getstrv();
+ for (ct++;ct<=ntk;ct++) {
+ kw("HEI") sf.title_hei = getf();
+ else kw("DIST") sf.title_dist = getf();
+ else kw("COLOR") getstr(sf.title_color);
+ else gprint("Expecting one of HEI, DIST, COLOR , found {%s} \n",tk[ct]);
+ }
+}
+
+void pass_anytitle() {
+ struct GLEAxis3D *ax = NULL;
+ if (toupper(*tk[ct])=='X') ax = &sf.xaxis;
+ else if (toupper(*tk[ct])=='Y') ax = &sf.yaxis;
+ else if (toupper(*tk[ct])=='Z') ax = &sf.zaxis;
+ else return;
+
+ ax->title = getstrv();
+ for (ct++;ct<=ntk;ct++) {
+ kw("HEI") ax->title_hei = getf();
+ else kw("DIST") ax->title_dist = getf();
+ else kw("COLOR") getstr(ax->title_color);
+ else gprint("Expecting one of HEI, DIST, COLOR , found {%s} \n",tk[ct]);
+ }
+}
+
+void pass_cube() {
+ for (ct++;ct<=ntk;ct++) {
+ kw("ON") sf.cube_on = true;
+ else kw("OFF") sf.cube_on = false;
+ else kw("NOFRONT") sf.cube_front_on = false;
+ else kw("FRONT") sf.cube_front_on = geton();
+ else kw("LSTYLE") getstr(sf.cube_lstyle);
+ else kw("COLOR") getstr(sf.cube_color);
+ else kw("XLEN") sf.sizex = getf();
+ else kw("YLEN") sf.sizey = getf();
+ else kw("ZLEN") sf.sizez = getf();
+ else gprint("Expecting one of OFF, XLEN, YLEN, ZLEN, FRONT, LSTYLE, COLOR, found {%s} \n",tk[ct]);
+ }
+
+}
+
+void pass_zclip() {
+ for (ct++;ct<=ntk;ct++) {
+ kw("MIN") { zclipmin = getf(); zclipminset = true; }
+ else kw("MAX") { zclipmax = getf(); zclipmaxset = true; }
+ else gprint("Expecting one of MIN, MAX found {%s} \n",tk[ct]);
+ }
+}
+
+void pass_back() {
+ for (ct++;ct<=ntk;ct++) {
+ kw("YSTEP") sf.back_ystep = getf();
+ else kw("ZSTEP") sf.back_zstep = getf();
+ else kw("LSTYLE") getstr(sf.back_lstyle);
+ else kw("COLOR") getstr(sf.back_color);
+ else kw("NOHIDDEN") sf.back_hidden = false;
+ else gprint("Expecting one of YSTEP, ZSTEP, LSTYLE, COLOR found {%s} \n",tk[ct]);
+ }
+}
+
+void pass_right() {
+ for (ct++;ct<=ntk;ct++) {
+ kw("ZSTEP") sf.right_zstep = getf();
+ else kw("XSTEP") sf.right_xstep = getf();
+ else kw("LSTYLE") getstr(sf.right_lstyle);
+ else kw("COLOR") getstr(sf.right_color);
+ else kw("NOHIDDEN") sf.right_hidden = false;
+ else gprint("Expecting one of ZSTEP, XSTEP, LSTYLE, COLOR found {%s} \n",tk[ct]);
+ }
+}
+
+void pass_base() {
+ for (ct++;ct<=ntk;ct++) {
+ kw("XSTEP") sf.base_xstep = getf();
+ else kw("YSTEP") sf.base_ystep = getf();
+ else kw("LSTYLE") getstr(sf.base_lstyle);
+ else kw("COLOR") getstr(sf.base_color);
+ else kw("NOHIDDEN") sf.base_hidden = false;
+ else gprint("Expecting one of XSTEP, YSTEP, LSTYLE, COLOR found {%s} \n",tk[ct]);
+ }
+}
+
+/* toplines lstyle color hidden */
+void pass_droplines() {
+ sf.droplines = true;
+ for (ct++;ct<=ntk;ct++) {
+ kw("LSTYLE") getstr(sf.droplines_lstyle);
+ else kw("COLOR") getstr(sf.droplines_color);
+ else kw("HIDDEN") sf.droplines_hidden = true;
+ else gprint("Expecting one of LSTYLE, COLOR , found {%s} \n",tk[ct]);
+ }
+
+}
+
+/* toplines lstyle color hidden */
+void pass_riselines() {
+ sf.riselines = true;
+ for (ct++;ct<=ntk;ct++) {
+ kw("LSTYLE") getstr(sf.riselines_lstyle);
+ else kw("COLOR") getstr(sf.riselines_color);
+ else kw("HIDDEN") sf.riselines_hidden = true;
+ else gprint("Expecting one of LSTYLE, COLOR , found {%s} \n",tk[ct]);
+ }
+
+}
+
+/* top lstyle color off */
+void pass_top() {
+ for (ct++;ct<=ntk;ct++) {
+ kw("LSTYLE") getstr(sf.top_lstyle);
+ else kw("COLOR") getstr(sf.top_color);
+ else kw("ON") sf.top_on = true;
+ else kw("OFF") sf.top_on = false;
+ else gprint("Expecting one of OFF, LSTYLE, COLOR , found {%s} \n",tk[ct]);
+ }
+}
+
+void pass_bot() {
+ sf.bot_on = true;
+ for (ct++;ct<=ntk;ct++) {
+ kw("LSTYLE") getstr(sf.bot_lstyle);
+ else kw("COLOR") getstr(sf.bot_color);
+ else kw("ON") sf.bot_on = true;
+ else kw("OFF") sf.bot_on = false;
+ else gprint("Expecting one of ON, OFF, LSTYLE, COLOR , found {%s} \n",tk[ct]);
+ }
+}
+
+void pass_marker() {
+ getstr(sf.marker);
+ for (ct++;ct<=ntk;ct++) {
+ kw("COLOR") getstr(sf.marker_color);
+ else kw("HEI") sf.marker_hei = getf();
+ else gprint("Expecting MARKER markername COLOR c HEI h, found {%s} \n",tk[ct]);
+ }
+}
+
+void pass_axis() {
+ struct GLEAxis3D *ax=NULL;
+ if (toupper(*tk[ct])=='X') ax = &sf.xaxis;
+ if (toupper(*tk[ct])=='Y') ax = &sf.yaxis;
+ if (toupper(*tk[ct])=='Z') ax = &sf.zaxis;
+ if (ax==NULL) { gprint("Expecting xaxis,yaxis,zaxis, \n"); return;}
+
+ for (ct++;ct<=ntk;ct++) {
+ kw("MIN") {ax->min = getf(); ax->minset = true;}
+ else kw("MAX") {ax->max = getf(); ax->maxset = true;}
+ else kw("DTICKS") ax->step = getf();
+ else kw("TICKLEN") ax->ticklen = getf();
+ else kw("LEN") ax->ticklen = getf();
+ else kw("COLOR") getstr(ax->color);
+ else kw("STEP") ax->step = getf();
+ else kw("HEI") ax->hei = getf();
+ else kw("OFF") ax->on = false;
+ else kw("ON") ax->on = true;
+ else kw("NOFIRST") ax->nofirst = true;
+ else kw("NOLAST") ax->nolast = true;
+ else gprint("Expecting HEI, DIST, COLOR , TICKLEN, MIN, MAX, STEP, found {%s} \n",tk[ct]);
+ }
+}
+
+static char buff[2032];
+
+bool alloc_zdata(int nx, int ny) {
+ if (z!=NULL) free(z);
+ z = (float*)malloc(nx * (ny+1) * sizeof(float));
+ if (z==NULL) {
+ gprint("Unable to allocate enough memory for datafile\n");
+ return true;
+ }
+ return false;
+}
+
+double getkeyval(char *buff,const char *k) {
+ char *s;
+ s = str_i_str(buff,k);
+ if (s!=NULL) return atof(s+strlen(k));
+ return 0.0;
+}
+
+void pass_data(bool force_zdata) {
+ string fname = getstrv();
+ if (str_i_ends_with(fname, ".z") || force_zdata) {
+ pass_zdata(fname,&nx,&ny,&zmin,&zmax);
+ } else {
+ pass_points(fname);
+
+ }
+}
+
+/* data test.z [nx ny] */
+//void pass_data(int *nx, int *ny, float *zmin, float *zmax) {
+void pass_zdata(string fname,int *nx, int *ny, double *zmin, double *zmax) {
+ double v;
+ int x,y,xx,yy;
+ int c,b,mx = 0,my = 0,xcnt,ycnt;
+ char *s;
+
+ xx = yy = x = y = 0;
+ *nx = 0; *ny = 0;
+ for (ct++;ct<=ntk;ct++) {
+ kw("NX") *nx = (int)getf();
+ else kw("NY") *ny = (int)getf();
+ else kw("XSAMPLE") xsample = (int)getf();
+ else kw("YSAMPLE") ysample = (int)getf();
+ else kw("SAMPLE") {xsample = (int)getf(); ysample = xsample; }
+ else gprint("Wanted DATA file.Z XSAMPLE YSAMPLE SAMPLE NX NY. Found {%s} \n",tk[ct]);
+ }
+ if (*nx != 0) {
+ mx = (*nx - 1)/xsample + 1;
+ my = (*ny - 1)/ysample + 1;
+ }
+ xcnt = xsample; ycnt = ysample;
+
+ if (nx==NULL || ny==0) printf("nx or ny is zero \n");
+ if (*nx!=0 && *ny != 0) if (alloc_zdata(*nx,*ny)) return;
+
+ df = validate_fopen(fname.c_str(), "r", true);
+ if (df==NULL) {*nx = 0; *ny = 0; return;}
+ for (;!feof(df);) {
+ if (fgets(buff,2000,df)!=NULL) {
+ if (*nx==0) {
+ *nx = (int)getkeyval(buff,"NX");
+ *ny = (int)getkeyval(buff,"NY");
+ dxmin = getkeyval(buff,"XMIN");
+ dymin = getkeyval(buff,"YMIN");
+ dxmax = getkeyval(buff,"XMAX");
+ dymax = getkeyval(buff,"YMAX");
+ if (*nx==0 || *ny==0) {
+ gprint("Expecting ! NX 10 NY 10 in first line of data file \n");
+ return;
+ }
+ mx = (*nx - 1)/xsample + 1;
+ my = (*ny - 1)/ysample + 1;
+ if (alloc_zdata(mx,my)) return;
+ if (fgets(buff,2000,df) == 0) {
+ return;
+ }
+ }
+check_again:
+ b = strlen(buff);
+ c = buff[b-1];
+ if (strchr(" \n\t",c)==NULL) { /* we're halfway thru a number */
+ buff[b] = getc(df);
+ buff[b+1] = 0;
+ goto check_again;
+ }
+ s = strchr(buff,'!');
+ if (s!=NULL) *s = 0;
+ s = strtok(buff," \t\n,");
+ for (;s!=NULL;) {
+ v = atof(s);
+ if (isdigit(*s) || *s=='-' || *s=='+' || *s=='.') {
+ if (x>= *nx) {
+ if (ycnt==ysample) {ycnt = 0; yy++;}
+ x = 0; y++; ycnt++; xx = 0; xcnt = xsample;
+ }
+ if (y>= *ny) {
+ gprint("Too much data in data file %ld %d \n",y,*ny);
+ return;
+ }
+ if (v < *zmin) *zmin = v;
+ if (v > *zmax) *zmax = v;
+
+ if (xx<mx && xcnt==xsample && ycnt==ysample) {
+ z[xx + yy * mx] = v;
+ xx++;
+ xcnt = 0;
+ }
+ xcnt++;
+ x++;
+ } else gprint("Not a number {%s} \n",s);
+ s = strtok(NULL," \t\n,");
+ }
+ }
+ }
+ fclose(df);
+ *ny = my;
+ *nx = mx;
+ return;
+}
+
+float *pntxyz;
+int npnts;
+
+void pnt_alloc(int size) {
+ static int cursize;
+ void *d;
+ if (size+10<cursize) return;
+ size = size*2;
+ d = malloc(size*sizeof(float));
+ if (d==NULL) {
+ gprint("Unable to allocate storage for POINTS data\n");
+ gle_abort("memory shortage\n");
+ }
+ if (cursize>0) memcpy(d,pntxyz,cursize*sizeof(float));
+ cursize = size;
+ pntxyz = (float*)d;
+}
+
+void pass_points(string fname) {
+ double v;
+ char *s;
+ int nd,nc;
+
+ pnt_alloc(30);
+
+ if (ct>ntk) {
+ gprint("Expecting POINTS filename.xyz \n");
+ return;
+ }
+
+ df = validate_fopen(fname.c_str(), "r", true);
+ if (df==NULL) return;
+ nd = 0;
+ for (;!feof(df);) {
+ if (fgets(buff,2000,df)!=NULL) {
+ s = strchr(buff,'!');
+ if (s!=NULL) *s = 0;
+ nc = 0;
+ s = strtok(buff," \t\n,");
+ for (;s!=NULL;) {
+ v = atof(s);
+ pnt_alloc(nd);
+ if (isdigit(*s) || *s=='-' || *s=='+' || *s=='.') {
+ pntxyz[nd++] = v; nc++;
+ } else gprint("Not a number {%s} \n",s);
+ s = strtok(NULL," \t\n,");
+ }
+ if (nc>0 && nc!=3) {
+ gprint("Expecting 3 columns in data file, found %d (FATAL ERROR) \n",nc);
+ }
+ }
+ }
+ fclose(df);
+ npnts = nd;
+ sf.pntxyz = pntxyz;
+ sf.npnts = npnts;
+}
+
+/* defaults after data and commands read */
+void hide_enddefaults() {
+ if (dxmin==dxmax) dxmax = nx-1;
+ if (dymin==dymax) dymax = ny-1;
+ if (!sf.xaxis.maxset) sf.xaxis.max = dxmax;
+ if (!sf.yaxis.maxset) sf.yaxis.max = dymax;
+ if (!sf.xaxis.minset) sf.xaxis.min = dxmin;
+ if (!sf.yaxis.minset) sf.yaxis.min = dymin;
+ if (!sf.zaxis.minset) sf.zaxis.min = zmin;
+ if (!sf.zaxis.maxset) sf.zaxis.max = zmax;
+ if (sf.zrotate==0 && sf.xrotate==0 && sf.yrotate==0) {
+ sf.xrotate = 60;
+ sf.yrotate = 50;
+ sf.zrotate = 20; /* not needed as is corrected later*/
+ }
+ if (sf.eye_x== -1) {
+ sf.eye_x = sf.sizex/2.0;
+ sf.eye_y = sf.sizex/2.0;
+ }
+}
+
+void hide_defaults() {
+ /* Setup some defaults, */
+ memset(&sf,0,sizeof(sf));
+ sf.sizey = sf.sizex = 18;
+ sf.sizey = sf.sizex = sf.sizez = 18;
+ sf.screenx = 18; sf.screeny = 18;
+ sf.eye_x = -1;
+ sf.zaxis.type = 2;
+ sf.yaxis.type = 1;
+ sf.xaxis.on = sf.yaxis.on = sf.zaxis.on = true;
+ sf.xaxis.min = 0;
+ sf.xaxis.max = 10;
+ sf.yaxis.min = 0;
+ sf.yaxis.max = 10;
+ sf.zaxis.min = 0;
+ sf.zaxis.max = 10;
+ sf.cube_hidden_on = true;
+ sf.cube_on = true;
+ sf.cube_front_on = false;
+ sf.xlines_on = true;
+ sf.ylines_on = true;
+ sf.hidden_on = true;
+ sf.top_on = true;
+ sf.bot_on = false;
+ sf.base_hidden = sf.right_hidden = sf.back_hidden = true;
+ strcpy(sf.title_color, "BLACK");
+ strcpy(sf.cube_color, "BLACK");
+ strcpy(sf.droplines_color, "BLACK");
+ strcpy(sf.riselines_color, "BLACK");
+ strcpy(sf.marker_color, "BLACK");
+ strcpy(sf.xaxis.color, "BLACK");
+ strcpy(sf.xaxis.title_color, "BLACK");
+ strcpy(sf.yaxis.color, "BLACK");
+ strcpy(sf.yaxis.title_color, "BLACK");
+ strcpy(sf.zaxis.color, "BLACK");
+ strcpy(sf.zaxis.title_color, "BLACK");
+ nx = 0;
+ ny = 0;
+ xsample = 1;
+ ysample = 1;
+ zclipmin = 0;
+ zclipminset = false;
+ zclipmax = 0;
+ zclipmaxset = false;
+ zmin = GLE_INF;
+ zmax = -GLE_INF;
+}
diff --git a/src/gle/surface/gsurface.h b/src/gle/surface/gsurface.h
new file mode 100644
index 0000000..ae59dbb
--- /dev/null
+++ b/src/gle/surface/gsurface.h
@@ -0,0 +1,117 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+class GLESurfaceBlockBase : public GLEBlockWithSimpleKeywords {
+public:
+ GLESurfaceBlockBase();
+ virtual ~GLESurfaceBlockBase();
+
+ virtual GLEBlockInstance* beginExecuteBlockImpl(GLESourceLine& sline, int *pcode, int *cp);
+};
+
+typedef char MARKER[12];
+typedef char COLOR[12];
+typedef char LSTYLE[12];
+
+struct GLEAxis3D {
+ int type; /* 0=xaxis,yaxis, 1=zaxis. */
+ float min, max, step, hei, dist, ticklen;
+ int minset,maxset;
+ COLOR color;
+ int on;
+ char* title;
+ COLOR title_color;
+ float title_hei,title_dist;
+ int nofirst,nolast;
+};
+
+struct surface_struct {
+ float sizez, sizex, sizey, title_hei, title_dist;
+ float screenx, screeny;
+ char* title;
+ COLOR zcolour;
+ COLOR title_color;
+ int maxh; /* dimension for height array, about 1000 is good */
+ int npnts; /* data points for markers, droplines etc */
+ float *pntxyz;
+
+ int nx, ny;
+ float *z;
+ float zmin, zmax;
+
+ struct GLEAxis3D xaxis; /* The axes */
+ struct GLEAxis3D yaxis;
+ struct GLEAxis3D zaxis;
+
+ int back_hidden,right_hidden,base_hidden;
+ COLOR back_lstyle,back_color; /* grids on back,base,right */
+ float back_ystep,back_zstep;
+ COLOR base_color,base_lstyle;
+ float base_xstep,base_ystep;
+ COLOR right_color,right_lstyle;
+ float right_xstep,right_zstep;
+
+ int cube_hidden_on; /* Cube hidden lines not removed */
+ int cube_on,cube_front_on;
+ COLOR cube_color;
+ LSTYLE cube_lstyle;
+
+ float eye_x, eye_y, vdist;
+ float xrotate, yrotate, zrotate;
+ int skirt_on;
+ int xlines_on,ylines_on;
+ int hidden_on,top_on,bot_on;
+ COLOR top_color,bot_color;
+ LSTYLE top_lstyle,bot_lstyle;
+
+ int droplines,droplines_hidden;
+ LSTYLE droplines_lstyle;
+ COLOR droplines_color;
+ int riselines,riselines_hidden;
+ LSTYLE riselines_lstyle;
+ COLOR riselines_color;
+
+ MARKER marker;
+ COLOR marker_color;
+ float marker_hei;
+
+ int ctop_hidden; /* Contouring */
+ float ctop_from,ctop_to,ctop_step;
+ int cbase_hidden;
+ float cbase_from,cbase_to,cbase_step;
+} ;
diff --git a/src/gle/surface/hide.cpp b/src/gle/surface/hide.cpp
new file mode 100644
index 0000000..42b0296
--- /dev/null
+++ b/src/gle/surface/hide.cpp
@@ -0,0 +1,1207 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+/*
+ 3d Surface plotting with hidden line removal
+*/
+
+#include "../all.h"
+#include "../gprint.h"
+#include "../core.h"
+#include "../cutils.h"
+#include "../gle-block.h"
+#include "gsurface.h"
+
+typedef int int32;
+class GLENumberFormat;
+
+void initminmax(void);
+void init_user(void);
+void nice_ticks(float *dticks, float *gmin,float *gmax , float *t1,float *tn);
+void grid_back(int nx, int ny, float z1, float z2);
+void skirt(float *z,int ix1, int iy1, float minz);
+void find_splits(int nx, int ny, int *splitx, int *splity);
+void fxy_polar(float dx,float dy,float *radius,float *angle);
+void fpolar_xy(float r, float angle, float *dx, float *dy);
+void draw_zaxis(struct GLEAxis3D *ax, int nx, int ny, float minz, float maxz);
+void draw_axis(struct GLEAxis3D *ax, int nx, int ny, float minz, float maxz);
+void draw_maintitle();
+void hide(float *z,int nx, int ny, float minz, float maxz, struct surface_struct *sff);
+void touser3(float x, float y, float z, float *uux, float *uuy, float *uuz);
+void touser(float x, float y, float z, float *uux, float *uuy);
+void matmove(float i[4][4],float x, float y, float z);
+void seth2(int rx1, int ry1, float rz1, int rx2, int ry2, float rz2);
+void matscale(float i[4][4],float x, float y, float z);
+void matun(float m[4][4]);
+void matmul(float a[4][4],float b[4][4]);
+void matrx(float i[4][4], float angle);
+void matry(float i[4][4], float angle);
+void matrz(float i[4][4], float angle);
+void vector_line(int x1, float y1, int x2, float y2);
+void draw_riselines(int nx, int ny,float minz, float maxz);
+void move3d(float x, float y, float z);
+void line3d(float x, float y, float z);
+void cube(float x, float y, float z1, float z2);
+void horizon(float *z,int ix1,int iy1,int ix2,int iy2);
+void horizon2(float *z,int ix1,int iy1,int ix2,int iy2);
+void horizonv(float *z,int ix1,int iy1,int ix2,int iy2);
+void horizonv2(float *z,int ix1,int iy1,int ix2,int iy2);
+void hclipvec(int x1, float y1, int x2, float y2, int sethi);
+void hclipvec2(int x1, float y1, int x2, float y2, int sethi);
+void clipline(float x1, float y1, float z1, float x2, float y2, float z2);
+void draw_markers(int nx, int ny);
+void matshow(const char *s, float m[4][4]);
+void show_horizon();
+std::string g_format_label(double fi, double dticks, GLENumberFormat* format);
+
+float base;
+extern int ngerror;
+extern int batch_only;
+FILE *fp;
+float image[4][4];
+static double min_zed;
+
+void init_user() {
+ matun(image);
+}
+
+float smin_x,smax_x,smin_y,smax_y,smin_z,smax_z;
+
+void g_set_color_if_defined(const char* s) {
+ if (s != NULL && s[0] != 0) {
+ GLERC<GLEColor> color = pass_color_var(s);
+ g_set_color(color);
+ }
+}
+
+void initminmax() {
+ smin_x = 10e10; smax_x = -10e10;
+ smin_y = 10e10; smax_y = -10e10;
+ smin_z = 10e10; smax_z = -10e10;
+}
+
+void setaminmax(float x, float *x1, float *x2) {
+ if (x < *x1) *x1 = x;
+ if (x > *x2) *x2 = x;
+}
+
+void setminmax(float x,float y,float z) {
+ setaminmax(x,&smin_x,&smax_x);
+ setaminmax(y,&smin_y,&smax_y);
+ setaminmax(z,&smin_z,&smax_z);
+}
+
+#define RERR (0.0001) /* Rounding error */
+int MAXH;
+#define deg(d) ((d)*3.14159254/180)
+float *h,*h2; /* h2 is the underneath */
+float eye_x,eye_y,eye_depth;
+float vdist=0; /* 1=eye touching front of picture, infinity= cube back */
+float map_mul,map_sub;
+float maxdepth;
+float xmargin = 2;
+float ymargin = 1.5;
+int doy=true;
+int dox=true; /* false */
+int nnx;
+int vsign=1;
+static struct surface_struct sf;
+
+float get_h(int i) {
+ if (i < 0 || i >= MAXH) {
+ return 0.0;
+ } else {
+ return h[i];
+ }
+}
+
+void set_h(int i, float v) {
+ if (!(i < 0 || i >= MAXH)) {
+ h[i] = v;
+ }
+}
+
+float get_h2(int i) {
+ if (i < 0 || i >= MAXH) {
+ return GLE_INF;
+ } else {
+ return h2[i];
+ }
+}
+
+void set_h2(int i, float v) {
+ if (!(i < 0 || i >= MAXH)) {
+ h2[i] = v;
+ }
+}
+
+void hide(float *z ,int nx, int ny, float minz, float maxz, struct surface_struct *sff) {
+ int i,x,y;
+ float r,angle;
+ float width,height;
+ float ux,uy,uz,scalex,scaley,ux3,uy3,ux2;
+ int splitx, splity;
+ int x1,x2;
+ g_gsave();
+ g_set_line_cap(1); /* round */
+ sf = *sff; /* Make a local copy of all the parameters */
+
+/* unit image */
+ init_user();
+
+ /* the view command specifies three parameters: eye_x, eye_y, and vdist*/
+ eye_x = sf.eye_x;
+ eye_y = sf.eye_y;
+ vdist = sf.vdist;
+
+/* size command specifies screenx and screeny */
+ base = sf.screenx;
+ xmargin = sf.screenx*2/10.0;
+ ymargin = sf.screeny*1.5/10.0;
+ width = sf.screenx-.5;
+ height = sf.screeny-.5;
+
+ if (sf.title != NULL)
+ height = height -.7;
+
+ dox = sf.xlines_on;
+ doy = sf.ylines_on;
+
+/* MAXH is value of harray */
+ MAXH = sf.maxh;
+
+ if (MAXH==0)
+ MAXH = 5000;
+
+ h = (float*)malloc((MAXH+1)*sizeof(float));
+ h2 = (float*)malloc((MAXH+1)*sizeof(float));
+ if (h==NULL || h2==NULL) {
+ gprint("Was not able to allocate horizon arrays %d \n",MAXH);
+ return;
+ }
+
+ min_zed = minz;
+ nnx = nx; /* save dimensions for use in subroutine */
+ vsign = 1; /* doing top half */
+
+ for (i=0; i<MAXH ;i++)
+ h[i] = 0.0; /* zero horizon */
+
+ maxdepth = 0;
+
+/* make it a 10x10x10 cube */
+ matmove(image,0.0,0.0,-minz); /* so 0,0,minz = 0,0,0 */
+
+/* cube xlen ylen zlen -> sizex, sizey, sizez */
+ if (sf.sizez==0)
+ sf.sizez = (sf.sizex+sf.sizey)/2.0;
+
+ matscale(image,sf.sizex/(float) nx,sf.sizey/(float) ny,sf.sizez/(maxz-minz));
+/* positive z comes towards the viewer */
+
+ //matshow("Before rotate", image);
+ //cout << "sizex = " << sf.sizex << " sizey = " << sf.sizey << endl;
+ //cout << "screenx = " << sf.screenx << " screeny = " << sf.screeny << endl;
+
+/* 60 50 20 , 80 0 0 */
+ matrx(image,deg(sf.xrotate)); /* clockwise holding right hand side */
+ matry(image,deg(sf.yrotate)); /* clockwise holding top */
+ matrz(image,deg(sf.zrotate)); /* clockwise holding front */
+
+/* now rotate cube so line from 0,0,0 --> 0,0,1 is vertical on screen */
+ touser(0.0,0.0,0.0,&ux,&uy);
+ touser(0.0,0.0,1.0,&ux3,&uy3);
+ fxy_polar(ux3-ux,uy3-uy,&r,&angle);
+ matrz(image,deg(-90.0+angle)); /* clockwise holding front */
+
+ //matshow("After rotate", image);
+
+/* Normalize image, shift to touch x=0, y=0, z=0 */
+ initminmax();
+
+ for (x=0; x<nx; x+=nx-1) {
+ for (y=0; y<ny; y+=ny-1) {
+ touser3(x,y,minz,&ux,&uy,&uz);
+ setminmax(ux,uy,uz);
+ touser3(x,y,maxz,&ux,&uy,&uz);
+ setminmax(ux,uy,uz);
+ }
+ }
+
+ scalex = 1;
+ scaley = 1;
+
+ if (smax_x > width)
+ scalex = width/(smax_x-smin_x);
+ if (smax_y > height)
+ scaley = height/(smax_y-smin_y);
+ if (scalex < scaley)
+ scaley = scalex;
+
+ image[0][3] = image[0][3] - smin_x + xmargin/scaley;
+ image[1][3] = image[1][3] - smin_y + ymargin/scaley;
+ image[2][3] = image[2][3] - smax_z;
+
+ initminmax();
+
+ for (x=0; x<nx; x+=nx-1) {
+ for (y=0; y<ny; y+=ny-1) {
+ touser3(x,y,minz,&ux,&uy,&uz);
+ setminmax(ux,uy,uz);
+ touser3(x,y,maxz,&ux,&uy,&uz);
+ setminmax(ux,uy,uz);
+ }
+ }
+
+ scalex = 1;
+ scaley = 1;
+
+ if (smax_x > width)
+ scalex = width/smax_x;
+ if (smax_y > height)
+ scaley = height/smax_y;
+ if (scalex < scaley)
+ scaley = scalex;
+
+ matscale(image,scaley,scaley,scaley);
+
+ initminmax();
+
+ for (x=0; x<nx; x+=nx-1) {
+ for (y=0; y<ny; y+=ny-1) {
+ touser3(x,y,minz,&ux,&uy,&uz);
+ setminmax(ux,uy,uz);
+ touser3(x,y,maxz,&ux,&uy,&uz);
+ setminmax(ux,uy,uz);
+ }
+ }
+
+ //matshow("After rescale", image);
+
+/* Deepest point will be at z==-(smax_z-smin_z) */
+ maxdepth = smin_z;
+
+ g_move(eye_x,eye_y);
+ g_set_hei(.3);
+
+/* decide on mapping of ux onto h[] -------------------------- */
+#define maph(ux) (((ux)-map_sub)*map_mul)
+#define unmaph(ux) (((ux)/map_mul)+map_sub)
+
+ x1 = 10000;
+ x2 = -10000;
+ for (x=0; x<nx; x+=nx-1) {
+ for (y=0; y<ny; y+=ny-1) {
+ touser(x,y,minz,&ux,&uy);
+ if (ux < x1)
+ x1 = (int)ux;
+ if (ux > x2)
+ x2 = (int)ux;
+ touser(x,y,maxz,&ux,&uy);
+ if (ux < x1)
+ x1 = (int)ux;
+ if (ux > x2)
+ x2 = (int)ux;
+ }
+ }
+
+/* map x1 -- x2 onto 2 -- 998 */
+ x1--; x2++;
+ map_sub = x1;
+ map_mul = (MAXH-100)/((double) x2-x1);
+
+/* ---------------------------------------------------- */
+/* if the closest line of constant X is not one of the edges
+ then split object at EYE(X)
+*/
+ find_splits(nx,ny,&splitx,&splity);
+
+/* if ux of nx,0,0 is less than ux of 0,ny,0 then */
+/* eye is closer to XAXIS then*/
+/* (lines of constant x will be horizontal */
+/* process lines of constant X in usual order, front to back*/
+/* After each x line, draw lines of constant y between lastx and nextx */
+/* else, do y first and x betweens.*/
+
+ touser(nx,0,0,&ux,&uy);
+ touser(0,ny,0,&ux2,&uy);
+
+/* Now draw bottom half */
+ g_set_color_if_defined(sf.bot_color);
+ g_set_line_style(sf.bot_lstyle);
+ vsign = -1; /* reverse tests for bottom half */
+ for (i=0; i<MAXH ;i++)
+ h2[i] = 9999.0; /* zero horizon */
+
+/* bot_on = underneath */
+ if (sf.bot_on && !sf.skirt_on) {
+ touser(nx,0,0,&ux,&uy);
+ touser(0,ny,0,&ux2,&uy);
+ if (ux < ux2) {
+ for (x=nx-1; x>=0; x--) {
+ if (dox)
+ for (y=splity; y>0; y--)
+ horizonv2(z,x,y,x,y-1); /* x */
+ if (dox)
+ for (y=splity+1; y<ny; y++)
+ if (y>0)
+ horizonv2(z,x,y-1,x,y);
+ for (y=splity; y>=0; y--)
+ if (x>0)
+ if (doy)
+ horizonv2(z,x,y,x-1,y);
+ for (y=splity+1; y<ny; y++)
+ if (x>0)
+ if (doy)
+ horizonv2(z,x,y,x-1,y);
+ }
+ } else {
+ for (y=0; y<ny; y++) {
+ if (doy)
+ for (x=splitx; x>0; x--)
+ horizonv2(z,x,y,x-1,y); /* y */
+ if (doy)
+ for (x=splitx+1; x<nx; x++)
+ if (x>0)
+ horizonv2(z,x-1,y,x,y);
+ for (x=splitx; x>=0; x--)
+ if (y<ny-1)
+ if (dox)
+ horizonv2(z,x,y,x,y+1);
+ for (x=splitx+1; x<nx; x++)
+ if (y<ny-1)
+ if (dox)
+ horizonv2(z,x,y,x,y+1);
+ }
+ }
+ } /* if bot_on a&& !skirt_on */
+
+
+/* should clip object nicely at zmin,zmax, do this inside vector_line */
+ vsign = 1; /* normal tests for top half */
+ g_set_color_if_defined(sf.top_color);
+ g_set_line_style(sf.top_lstyle);
+
+ if (sf.top_on) {
+ if (ux < ux2) {
+/* Go from x = splitx to zero, then splitx+1 to nx-1 */
+ for (x=nx-1; x>=0; x--) {
+ if (dox)
+ for (y=splity; y>0; y--)
+/* X */
+ horizonv(z,x,y,x,y-1);
+ if (dox)
+ for (y=splity+1; y<ny; y++)
+ if (y>0)
+/* Constant X (this does join, should be earlier) */
+ horizonv(z,x,y-1,x,y);
+ for (y=splity; y>=0; y--)
+ if (x>0)
+ if (doy)
+ /* Constant Y */
+ horizonv(z,x,y,x-1,y);
+ for (y=splity+1; y<ny; y++)
+ if (x>0)
+ if (doy)
+/* Constant Y */
+ horizonv(z,x,y,x-1,y);
+ }
+ } else {
+/* Go from y = splity to zero, then splity+1 to ny-1 */
+ for (y=0; y<ny; y++) {
+ if (doy)
+ for (x=splitx; x>0; x--)
+/* Constant y */
+ horizonv(z,x,y,x-1,y);
+ if (doy)
+ for (x=splitx+1; x<nx; x++)
+ if (x>0)
+/* Constant y (this does join, should be first) */
+ horizonv(z,x-1,y,x,y);
+ for (x=splitx; x>=0; x--)
+ if (y<ny-1)
+ if (dox)
+/* Constant x */
+ horizonv(z,x,y,x,y+1);
+ for (x=splitx+1; x<nx; x++)
+ if (y<ny-1)
+ if (dox)
+/* Constant x */
+ horizonv(z,x,y,x,y+1);
+ }
+ }
+ } /* sf.top_on */
+
+ g_set_color_if_defined(sf.top_color);
+ g_set_line_style(sf.top_lstyle);
+
+ if (sf.skirt_on) { /* set h2 to bottom of top surface */
+ for (x=nx-1; x>0; x--)
+ seth2(x,0,z[x],x-1,0,z[x-1]);
+ for (y=0; y<ny-1; y++)
+ seth2(nx-1,y,z[nx-1+y* (int32) nx],nx-1,y+1,z[nx-1+(y+1)* (int32) nx]);
+ }
+/* show_horizon(); */
+ if (sf.skirt_on) {
+ for (y=splity; y>=0; y--)
+ skirt(z,nx-1,y,minz);
+ for (y=splity+1; y<ny; y++)
+ skirt(z,nx-1,y,minz);
+ for (x=splitx; x>=0; x--)
+ skirt(z,x,0,minz);
+ for (x=splitx+1; x<nx; x++)
+ skirt(z,x,0,minz);
+ }
+
+ if (sf.skirt_on) { /* set h2 to bottom edge of box */
+ for (x=nx-1; x>=0; x--) seth2(x,0,minz,x-1,0,minz);
+ for (y= -1; y<ny; y++) seth2(nx-1,y,minz,nx-1,y+1,minz);
+ }
+
+/* now define h2[] if bot wasn't drawn */
+ if (!sf.bot_on && !sf.skirt_on) {
+ for (x=nx-1; x>0; x--)
+ seth2(x,0,z[x],x-1,0,z[x-1]);
+ for (y=0; y<ny-1; y++)
+ seth2(nx-1,y,z[nx-1+y* (int32) nx],nx-1,y+1,z[nx-1+(y+1)* (int32) nx]);
+ }
+/* Set back original color */
+ g_grestore();
+
+/* Draw the unit cube for reference -------------------------- */
+ if (sf.cube_on) {
+ cube(nx-1,ny-1,minz,maxz);
+ }
+
+ draw_maintitle();
+
+/* now lets try and draw the axes */
+ draw_axis(&sf.xaxis,nx,ny,minz,maxz);
+ draw_axis(&sf.yaxis,nx,ny,minz,maxz);
+ draw_zaxis(&sf.zaxis,nx,ny,minz,maxz);
+
+/* The back, right and bottom grid lines */
+ grid_back(nx,ny,minz,maxz);
+
+ draw_markers(nx,ny);
+ draw_riselines(nx,ny,minz,maxz);
+
+ free(h);
+ free(h2);
+}
+#define DVAL(a,b) if ((a)==0) a = (b)
+
+void draw_maintitle() {
+ g_set_just(pass_justify("BC"));
+ if (sf.title == NULL) return;
+ g_set_color(pass_color_var(sf.title_color));
+ DVAL(sf.title_hei,base/30.0);
+ g_set_hei(sf.title_hei);
+ g_move(sf.screenx/2.0,sf.screeny-sf.title_hei+sf.title_dist);
+ g_text((char*)sf.title);
+}
+
+void draw_axis(struct GLEAxis3D *ax, int nx, int ny, float minz, float maxz) {
+ float ux,uy,ux2,uy2,ux3,uy3,r,a,ta,r2,xx,t1,tn;
+ if (ax->type>1)
+ return;
+ if (!ax->on)
+ return;
+ if (ax->type==0) {
+ touser(0,0,minz,&ux,&uy);
+ touser(nx-1,0,minz,&ux2,&uy2);
+ } else {
+ touser(nx-1,0,minz,&ux,&uy);
+ touser(nx-1,ny-1,minz,&ux2,&uy2);
+ }
+ g_set_color(pass_color_var(ax->color));
+ if (!sf.cube_on) {
+ g_move(ux,uy);
+ g_line(ux2,uy2);
+ }
+ fxy_polar(ux2-ux,uy2-uy,&r,&a);
+ ta = a ;
+ a = a - 90;
+ if (ax->ticklen == 0)
+ ax->ticklen = base*.001;
+ r = ax->ticklen;
+ r2 = ax->ticklen+base*.02+ax->dist;
+ fpolar_xy(r,a,&ux2,&uy2);
+ fpolar_xy(r2,a,&ux3,&uy3);
+
+ DVAL(ax->hei,base/60.0);
+ g_set_hei(ax->hei);
+ g_set_just(pass_justify("TC"));
+
+ nice_ticks(&ax->step, &ax->min, &ax->max, &t1, &tn);
+
+ for (double x=t1; x<=.00001+ax->max; x+=ax->step) {
+ if (ax->type==0) {
+ xx = (nx-1)*(x-ax->min)/(ax->max - ax->min);
+ touser(xx,0,minz,&ux,&uy);
+ } else {
+ xx = (ny-1)*(x-ax->min)/(ax->max - ax->min);
+ touser(nx-1,xx,minz,&ux,&uy);
+ }
+ g_move(ux,uy);
+ g_line(ux+ux2,uy+uy2);
+ g_move(ux+ux3,uy+uy3);
+ std::string label(g_format_label(x, ax->step, 0));
+ g_gsave();
+ g_rotate(ta);
+ if (ax->nolast && x> (ax->max - .5*(ax->step))) /* do nothing */ ;
+ else if (ax->nofirst && x==t1) /* do nothing */;
+ else g_text(label);
+ g_grestore();
+ }
+ g_set_just(pass_justify("TC"));
+ /* Now draw the title for this axis */
+ if (ax->title == NULL)
+ return;
+ g_set_color(pass_color_var(ax->title_color));
+ DVAL(ax->title_hei,base/40.0);
+ g_set_hei(ax->title_hei);
+ if (ax->type==0) {
+ touser((nx-1)/2.0,0,minz,&ux,&uy);
+ } else {
+ touser(nx-1,(ny-1)/2.0,minz,&ux,&uy);
+ }
+ DVAL(ax->title_dist,base/17.0);
+ r = ax->title_dist;
+ fpolar_xy(r,a,&ux2,&uy2);
+ g_gsave();
+ g_move(ux+ux2,uy+uy2);
+ g_rotate(ta);
+ g_text((char*)ax->title);
+ g_grestore();
+}
+
+void draw_zaxis(struct GLEAxis3D *ax, int nx, int ny, float minz, float maxz) {
+ float ux,uy,ux2,uy2,ux3,uy3,r,a,r2,t1,tn;
+
+ if (!ax->on)
+ return;
+ touser(0,0,minz,&ux,&uy);
+ touser(0,0,maxz,&ux2,&uy2);
+ g_set_color(pass_color_var(ax->color));
+ if (!sf.cube_on) {
+ g_move(ux,uy);
+ g_line(ux2,uy2);
+ }
+ fxy_polar(ux2-ux,uy2-uy,&r,&a);
+ a = a + 90;
+ if (ax->ticklen == 0)
+ ax->ticklen = base*.001;
+ r = ax->ticklen;
+ r2 = ax->ticklen+base*.02+ax->dist;
+ fpolar_xy(r,a,&ux2,&uy2);
+ fpolar_xy(r2,a,&ux3,&uy3);
+ DVAL(ax->hei,base/60.0);
+ g_set_hei(ax->hei);
+ g_set_just(pass_justify("RC"));
+ nice_ticks(&ax->step, &ax->min, &ax->max, &t1, &tn);
+ for (double x=t1; x<=.0001+ax->max; x+=ax->step) {
+ touser(0,0,x,&ux,&uy);
+ g_move(ux,uy);
+ g_line(ux+ux2,uy+uy2);
+ g_move(ux+ux3,uy+uy3);
+ std::string label(g_format_label(x, ax->step, 0));
+ g_text(label);
+ }
+ g_set_just(pass_justify("BC"));
+/* Now draw the title for this axis */
+ if (ax->title == NULL)
+ return;
+ g_set_color(pass_color_var(ax->title_color));
+ DVAL(ax->title_hei,base/40.0);
+ g_set_hei(ax->title_hei);
+ touser(0,0,(maxz-minz)/2.0+minz,&ux,&uy);
+ DVAL(ax->title_dist,base/17.0);
+ r = ax->title_dist;
+ fpolar_xy(r,a,&ux2,&uy2);
+ g_gsave();
+ g_move(ux+ux2,uy+uy2);
+ g_rotate(a-90);
+ g_text((char*)ax->title);
+ g_grestore();
+}
+
+void move3d(float x, float y, float z) {
+ float ux,uy;
+ touser(x,y,z,&ux,&uy);
+ g_move(ux,uy);
+ #if (defined DJ || defined EMXOS2) /* a.r. for surface markers */
+ d_move_really(ux,uy);
+ #endif
+}
+
+void line3d(float x, float y, float z) {
+ float ux,uy;
+ touser(x,y,z,&ux,&uy);
+ g_line(ux,uy);
+}
+
+double xg3d(double x, double y, double z) {
+ float ux, uy;
+ touser((float)x, (float)y, (float)z, &ux, &uy);
+ return ux;
+}
+
+double yg3d(double x, double y, double z) {
+ float ux, uy;
+ touser((float)x, (float)y, (float)z, &ux, &uy);
+ return uy;
+}
+
+void show_horizon() {
+ int i;
+ g_set_color(pass_color_var("RED"));
+ g_move(unmaph(0), get_h(0));
+ for (i=0;i<900;i++) {
+ g_line(unmaph(i), get_h(i));
+ }
+ g_set_color(pass_color_var("BLUE"));
+ g_move(unmaph(0), get_h2(0));
+ for (i=0;i<900;i++) {
+ g_line(unmaph(i), get_h2(i));
+ }
+}
+
+void skirt(float *z,int ix1, int iy1, float minz) {
+ /*
+ touser(ix1,iy1,z[ix1+iy1* (int32) nnx],&ux,&y1);
+ x1 = maph(ux);
+ touser(ix1,iy1,minz,&ux,&y2);
+ x2 = maph(ux);
+ vector_line(x1,y1,x2,y2);
+ */
+
+ clipline(ix1,iy1,z[ix1+iy1* (int32) nnx],ix1,iy1,minz);
+}
+
+void horizonv(float *z,int ix1,int iy1,int ix2,int iy2) {
+ float ux;
+ int x1,x2,putback=false;
+ float y1,y2;
+
+ if (sf.zcolour[0]!=0 &&
+ (z[ix1 + iy1 * (int32)nnx] <= min_zed || z[ix2 + iy2 * (int32)nnx] <= min_zed)) {
+ putback = true;
+ g_set_color_if_defined(sf.zcolour);
+ }
+
+ touser(ix1,iy1,z[ix1 + iy1 * (int32)nnx],&ux,&y1);
+ x1 = (int)maph(ux);
+ touser(ix2,iy2,z[ix2 + iy2 * (int32)nnx],&ux,&y2);
+ x2 = (int)maph(ux);
+ hclipvec(x1,y1,x2,y2,true);
+
+ if (putback) {
+ putback = true;
+ g_set_color_if_defined(sf.top_color);
+ }
+
+}
+
+int doclipping=true;
+
+void clipline(float x1, float y1, float z1, float x2, float y2, float z2) {
+ float ux,uy,ux2,uy2;
+ int ix1,ix2;
+
+ touser(x1,y1,z1,&ux,&uy);
+ touser(x2,y2,z2,&ux2,&uy2);
+ if (!doclipping) { g_move(ux,uy); g_line(ux2,uy2); return;}
+ ix1 = (int)maph(ux); ix2 = (int)maph(ux2);
+
+/* printf("hclipvec %d %g %d %g \n",ix1,uy,ix2,uy2); scr_getch(); */
+ if (abs(ix1-ix2)==1) if (fabs(uy2-uy)>.3) ix1 = ix2;
+ hclipvec(ix1,uy,ix2,uy2,false);
+ hclipvec2(ix1,uy,ix2,uy2,false);
+}
+
+void horizonv2(float *z,int ix1,int iy1,int ix2,int iy2) {
+ float ux;
+ int x1,x2;
+ float y1,y2;
+
+ touser(ix1,iy1,z[ix1+iy1* (int32) nnx],&ux,&y1);
+ x1 = (int)maph(ux);
+ touser(ix2,iy2,z[ix2+iy2* (int32) nnx],&ux,&y2);
+ x2 = (int)maph(ux);
+ hclipvec2(x1,y1,x2,y2,true);
+}
+
+void hclipvec(int x1, float y1, int x2, float y2, int sethi) {
+ float v,sy = 0,step;
+ int i,sd,sx = 0;
+ if (x1==x2) {
+ /* printf("VEC %d %g %d %g h=%g\n",x1,y1,x2,y2,h[x1]); scr_getch(); */
+ if (y2<y1) {v = y1; y1 = y2; y2 = v;}
+ if (get_h(x1) < y2) {
+ if (get_h(x1) > y1) y1 = get_h(x1);
+ vector_line(x1,y1,x2,y2);
+ if (sethi) set_h(x1, y2);
+ }
+ return;
+ }
+ step = (y2-y1)/(x2-x1);
+ sd = -1;
+ if (x1<x2) sd = 1;
+ step = step*sd;
+ bool visible = false;
+ for (i=x1, v=y1; sd*i <= sd*x2; i+=sd, v+=step) {
+ if (visible) {
+ // FIXME: add range check for h-array?
+ if (get_h(i) > v) {
+ if (sethi) vector_line(sx,sy,i-sd,v-step);
+ else vector_line(sx,sy,i-sd,v-step);
+ visible = false;
+ } else if (sethi) set_h(i, v);
+ } else {
+ if (get_h(i) <= v+.0001) {
+ sx = i; sy = v; visible = true;
+ if (sethi) set_h(i, v);
+ }
+ }
+ }
+ /* draw end part of line */
+ if (visible) vector_line(sx,sy,x2,y2);
+}
+
+void seth2(int rx1, int ry1, float rz1, int rx2, int ry2, float rz2) {
+ float vx1,vx2,y1,y2;
+ int x1,x2;
+ float v,step;
+ int i,sd;
+
+ /* printf("seth2 %d %d %g, %d %d %g \n",rx1,ry1,rz1,rx2,ry2,rz2);
+ scr_getch(); */
+ touser(rx1,ry1,rz1,&vx1,&y1);
+ touser(rx2,ry2,rz2,&vx2,&y2);
+ x1 = (int)maph(vx1); x2 = (int)maph(vx2);
+ if (x1<0) x1 = 0;
+ if (x2<0) x2 = 0;
+ if (x1>MAXH) x1 = MAXH-1;
+ if (x2>MAXH) x2 = MAXH-1;
+
+ if (x1==x2) {
+ if (y2>y1) {v = y1; y1 = y2; y2 = v;}
+ if (get_h2(x1) > y2) set_h2(x1, y2);
+ return;
+ }
+ step = (y2-y1)/(x2-x1);
+ sd = -1;
+ if (x1<x2) sd = 1;
+ step = step*sd;
+ for (i=x1, v=y1; sd*i <= sd*x2; i+=sd, v+=step) {
+ if (get_h2(i) > v) set_h2(i, v);
+ }
+}
+
+void vector_line_d(double x1, double y1, double x2, double y2) {
+ g_move(unmaph(x1),y1);
+ g_line(unmaph(x2),y2);
+}
+
+void hclipvec2(int x1, float y1, int x2, float y2, int sethi) {
+ if (x1 == x2) {
+ if (y2 > y1) {
+ double v = y1;
+ y1 = y2;
+ y2 = v;
+ }
+ if (get_h2(x1) > y2) {
+ if (get_h2(x1) < y1) y1 = get_h2(x1);
+ vector_line(x1,y1,x2,y2);
+ if (sethi) set_h2(x1, y2);
+ }
+ return;
+ }
+ GLELinearEquation vec, horiz;
+ vec.fit(x1, y1, x2, y2);
+ int sx = 0;
+ int sd = (x1 < x2) ? 1 : -1;
+ bool visible = false;
+ for (int i = x1; sd*i <= sd*x2; i+=sd) {
+ double v = vec.apply(i);
+ if (visible) {
+ if (get_h2(i) < v) {
+ // drops below horizon -> invisible
+ visible = false;
+ // find exact point from where on invisible
+ horiz.fit(i-sd, get_h2(i-sd), i, get_h2(i));
+ double xp = vec.intersect(&horiz);
+ vector_line_d(sx, vec.apply(sx), xp, vec.apply(xp));
+ } else if (sethi) set_h2(i, v);
+ } else {
+ if (get_h2(i) >= v-.0001) {
+ // back above horizon -> again visible
+ visible = true;
+ if (i == x1) {
+ sx = i;
+ } else {
+ horiz.fit(i-sd, get_h2(i-sd), i, get_h2(i));
+ sx = vec.intersect(&horiz);
+ }
+ if (sethi) set_h2(i, v);
+ }
+ }
+ }
+ /* draw end part of line */
+ if (visible) vector_line(sx, vec.apply(sx), x2, y2);
+}
+
+void vector_line(int x1, float y1, int x2, float y2) {
+ if (x2<0 || x1<0) {
+ gprint("Less than zero \n");
+ }
+ g_move(unmaph(x1),y1);
+ g_line(unmaph(x2),y2);
+}
+
+void touser(float x, float y, float z, float *uux, float *uuy) {
+ float uz,ux,uy,p,q;
+ ux = image[0][0]*x + image[0][1]*y + image[0][2]*z + image[0][3];
+ uy = image[1][0]*x + image[1][1]*y + image[1][2]*z + image[1][3];
+ uz = image[2][0]*x + image[2][1]*y + image[2][2]*z + image[2][3];
+
+ ux -= eye_x;
+ uy -= eye_y;
+ if (maxdepth!=0) {
+ p = vdist; /* almost touching infinity */
+ q = uz/maxdepth; /* z is negative at deep end , zero at top */
+ ux = ux - ux*p*q/(1-p+p*q);
+ uy = uy - uy*p*q/(1-p+p*q);
+/* (my old transformation)
+ ux = uz*(-ux/eye_depth)+ux;
+ uy = uz*(-uy/eye_depth)+uy;
+*/
+ }
+ *uux = ux + eye_x;
+ *uuy = uy + eye_y;
+}
+
+void touser3(float x, float y, float z, float *uux, float *uuy, float *uuz) {
+ float uz,ux,uy;
+ ux = image[0][0]*x + image[0][1]*y + image[0][2]*z + image[0][3];
+ uy = image[1][0]*x + image[1][1]*y + image[1][2]*z + image[1][3];
+ uz = image[2][0]*x + image[2][1]*y + image[2][2]*z + image[2][3];
+
+ ux -= eye_x;
+ uy -= eye_y;
+ *uux = ux + eye_x;
+ *uuy = uy + eye_y;
+ *uuz = uz;
+}
+
+void matscale(float i[4][4],float x, float y, float z) {
+
+ static float c[4][4];
+ c[0][0] = x;
+ c[1][1] = y;
+ c[2][2] = z;
+ c[3][3] = 1;
+ matmul(i,c);
+}
+
+void matmove(float i[4][4],float x, float y, float z) {
+ static float c[4][4];
+ c[0][0] = 1;
+ c[1][1] = 1;
+ c[2][2] = 1;
+ c[3][3] = 1;
+ c[0][3] = x;
+ c[1][3] = y;
+ c[2][3] = z;
+ matmul(i,c);
+}
+
+void matmul(float a[4][4],float b[4][4]) /* a = a * b */ {
+ static float c[4][4],tot;
+ int y,xb,x;
+ for (y=0;y<4;y++) {
+ for (xb=0;xb<4;xb++) {
+ tot = 0;
+ for (x=0;x<4;x++) tot += a[x][y] * b[xb][x];
+ c[xb][y] = tot;
+ }
+ }
+ memcpy(a,c,4*4*sizeof(float));
+}
+
+void matun(float m[4][4]) {
+ int i,j;
+ for (i=0;i<4;i++) for (j=0;j<4;j++) m[i][j] = 0;
+ for (i=0;i<4;i++) m[i][i] = 1;
+}
+
+void matrz(float i[4][4], float angle) {
+ /* Rotate around the Z axis */
+
+ float m[4][4];
+ matun(m);
+ m[0][0] = cos(angle);
+ m[1][1] = m[0][0];
+ m[0][1] = sin(angle);
+ m[1][0] = -m[0][1];
+ matmul(i,m);
+}
+
+void matry(float i[4][4], float angle) {
+ /* Rotate around the y axis */
+
+ float m[4][4];
+ matun(m);
+ m[0][0] = cos(angle);
+ m[2][2] = m[0][0];
+ m[2][0] = sin(angle);
+ m[0][2] = -m[2][0];
+ matmul(i,m);
+}
+
+void matrx(float i[4][4], float angle) {
+ /* Rotate around the x axis */
+
+ float m[4][4];
+ matun(m);
+ m[1][1] = cos(angle);
+ m[2][2] = m[1][1];
+ m[1][2] = sin(angle);
+ m[2][1] = -m[1][2];
+ matmul(i,m);
+}
+#define SX(x) ((nx-1)*(x-sf.xaxis.min)/(sf.xaxis.max-sf.xaxis.min))
+#define SY(y) ((ny-1)*(y-sf.yaxis.min)/(sf.yaxis.max-sf.yaxis.min))
+
+void grid_back(int nx, int ny, float z1, float z2) {
+ float x,y,z;
+ g_set_color_if_defined(sf.back_color);
+ g_set_line_style(sf.back_lstyle);
+ doclipping = sf.back_hidden;
+ if (sf.back_ystep>0) for (y=sf.yaxis.min; y<=sf.yaxis.max+.00001; y+=sf.back_ystep) {
+ clipline(0,SY(y),z1,0,SY(y),z2);
+ }
+ if (sf.back_zstep>0) for (z=z1; z<=z2; z+=sf.back_zstep) {
+ clipline(0,0,z,0,ny-1,z);
+ }
+
+ g_set_color_if_defined(sf.right_color);
+ g_set_line_style(sf.right_lstyle);
+ doclipping = sf.right_hidden;
+ if (sf.right_xstep>0) for (x=sf.xaxis.min; x<=sf.xaxis.max+.00001; x+=sf.right_xstep) {
+ clipline(SX(x),ny-1,z1,SX(x),ny-1,z2);
+ }
+ if (sf.right_zstep>0) for (z=z1; z<=z2; z+=sf.right_zstep) {
+ clipline(0,ny-1,z,nx-1,ny-1,z);
+ }
+
+
+ g_set_color_if_defined(sf.base_color);
+ g_set_line_style(sf.base_lstyle);
+ doclipping = sf.base_hidden;
+ if (sf.base_xstep>0) for (x=sf.xaxis.min; x<=sf.xaxis.max+.00001; x+=sf.base_xstep) {
+ clipline(SX(x),0,z1,SX(x),ny-1,z1);
+ }
+ if (sf.base_ystep>0) for (y=sf.yaxis.min; y<=sf.yaxis.max+.00001; y+=sf.base_ystep) {
+ clipline(0,SY(y),z1,nx-1,SY(y),z1);
+ }
+}
+
+void draw_markers(int nx, int ny) {
+ float *pnt;
+ int i;
+ pnt = sf.pntxyz;
+ if (*sf.marker == 0) return;
+ g_set_color(pass_color_var(sf.marker_color));
+ DVAL(sf.marker_hei,base/60.0);
+ g_set_hei(sf.marker_hei);
+ for (i=0; i<sf.npnts; i+=3) {
+ move3d(SX(pnt[i]),SY(pnt[i+1]),pnt[i+2]);
+ g_marker(pass_marker(sf.marker), sf.marker_hei);
+ }
+}
+
+void draw_riselines(int nx, int ny,float minz, float maxz) {
+ float *pnt=sf.pntxyz;
+ int i;
+
+ if (sf.riselines!=0) {
+ g_set_color(pass_color_var(sf.riselines_color));
+ g_set_line_style(sf.riselines_lstyle);
+ for (i=0; i<sf.npnts; i+=3) {
+ move3d(SX(pnt[i]),SY(pnt[i+1]),pnt[i+2]);
+ line3d(SX(pnt[i]),SY(pnt[i+1]),maxz);
+ }
+ }
+
+ if (sf.droplines==0) return;
+ g_set_color(pass_color_var(sf.droplines_color));
+ g_set_line_style(sf.droplines_lstyle);
+ for (i=0; i<sf.npnts; i+=3) {
+ move3d(SX(pnt[i]),SY(pnt[i+1]),pnt[i+2]);
+ line3d(SX(pnt[i]),SY(pnt[i+1]),minz);
+ }
+}
+
+void cube(float x, float y, float z1, float z2) {
+ if (sf.cube_hidden_on) doclipping = true;
+ else doclipping = false;
+ g_set_color(pass_color_var(sf.cube_color));
+ g_set_line_style(sf.cube_lstyle);
+
+ /* draw axis behind peaks: don't overwrite peaks with round or square cap! */
+ g_set_line_cap(0);
+
+ clipline(x,y,z1,0,y,z1);
+ clipline(0,y,z1,0,0,z1);
+
+ clipline(0,0,z1,0,0,z2);
+ clipline(0,0,z2,0,y,z2);
+ clipline(0,y,z2,0,y,z1);
+ clipline(0,y,z2,x,y,z2);
+ clipline(x,y,z2,x,y,z1);
+
+ doclipping = false;
+ clipline(0,0,z1,x,0,z1);
+ clipline(x,0,z1,x,y,z1);
+
+ g_set_line_cap(1);
+
+ if (sf.cube_front_on) {
+ clipline(0,0,z2,x,0,z2);
+ clipline(x,0,z2,x,0,z1);
+ clipline(x,0,z2,x,y,z2);
+ }
+/*
+
+ move3d(0,0,z1);
+ g_set_color(pass_color_var(sf.cube_color));
+ g_set_line_style(sf.cube_lstyle);
+ line3d(x,0,z1);
+ line3d(x,y,z1);
+ line3d(0,y,z1);
+ line3d(0,0,z1);
+
+ line3d(0,0,z2);
+ line3d(0,y,z2);
+ line3d(0,y,z1);
+ move3d(0,y,z2);
+ line3d(x,y,z2);
+ line3d(x,y,z1);
+ if (sf.cube_front_on) {
+ move3d(0,0,z2);
+ line3d(x,0,z2);
+ line3d(x,0,z1);
+ move3d(x,0,z2);
+ line3d(x,y,z2);
+ }
+ */
+}
+
+void matshow(const char *s, float m[4][4]) {
+ printf("\n! Matrix {%s} \n",s);
+ for (int i=0;i<4;i++)
+ printf("! %f %f %f %f\n",m[0][i],m[1][i],m[2][i],m[3][i]);
+
+}
+
+void find_splits(int nx, int ny, int *splitx, int *splity) {
+ int lasta,i,isleft = false;
+ float ux,uy,ux2,uy2,angle,r;
+
+ lasta = 999;
+ *splity = -1;
+ *splitx = nx-1;
+ for (i = 0; i<ny; i++) {
+ touser(nx-1,i,0,&ux,&uy);
+ touser(0,i,0,&ux2,&uy2);
+ fxy_polar(ux2-ux,uy2-uy,&r,&angle);
+ if (angle<90) isleft = true;
+ if (angle>=90) isleft = false;
+ if (lasta==999) lasta = isleft;
+ if (lasta!=isleft) {
+ *splity = i-1;
+ }
+ lasta = isleft;
+ }
+ lasta=999;
+ for (i = 0; i<nx; i++) {
+ touser(i,0,0,&ux,&uy);
+ touser(i,ny-1,0,&ux2,&uy2);
+ fxy_polar(ux2-ux,uy2-uy,&r,&angle);
+ if (angle<90) isleft = true;
+ if (angle>=90) isleft = false;
+ if (lasta==999) lasta = isleft;
+ if (lasta!=isleft) {
+ *splitx = i-1;
+ }
+ lasta = isleft;
+ }
+}
+
+void nice_ticks(float *dticks, float *gmin,float *gmax , float *t1,float *tn) {
+ float delta,st,expnt,n;
+ int ni;
+
+ delta = *gmax-*gmin;
+ if (delta==0) {gprint("Axis range error min=%g max=%g \n",*gmin,*gmax);
+ *gmax = *gmin+10;
+ delta = 10;
+ }
+ st = delta/10;
+ expnt = floor(log10(st));
+ n = st/pow((float)10.0,expnt);
+ if (n>5)
+ ni = 10;
+ else if (n>2)
+ ni = 5;
+ else if (n>1)
+ ni = 2;
+ else
+ ni = 1;
+ if (*dticks==0) *dticks = ni * pow((float)10,expnt);
+ if (*gmin - (delta/1000) <= floor( *gmin/ *dticks) * *dticks)
+ *t1 = *gmin;
+ else
+ *t1 = (floor(*gmin/ *dticks) * *dticks ) + *dticks;
+
+ *tn = *gmax;
+ if (( floor( *gmax/ *dticks) * *dticks) < (*gmax - (delta/1000) ))
+ *tn = floor(*gmax/ *dticks ) * *dticks;
+}
diff --git a/src/gle/tex.cpp b/src/gle/tex.cpp
new file mode 100644
index 0000000..85f903f
--- /dev/null
+++ b/src/gle/tex.cpp
@@ -0,0 +1,2134 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#include "all.h"
+#include "mem_limits.h"
+#include "token.h"
+#include "tokens/StringKeyHash.h"
+#include "core.h"
+#include "glearray.h"
+#include "polish.h"
+#include "pass.h"
+#include "cutils.h"
+#include "gprint.h"
+#include "justify.h"
+#include "file_io.h"
+#include "texinterface.h"
+#include "cmdline.h"
+#include "config.h"
+
+// uncomment this if you want to store the
+// tex font information to the decode.tex file.
+// this will create the file decode.tex in your directory
+//#define DO_TEX_DECODE
+// there is no reason to read decode.tex except for
+// debug purposes (I think). At least GLE doesn't read
+// decode.tex anywhere
+
+/************************************************************************************
+ * Explanation of the code:
+ *
+ * Main procedure for drawing text:
+ * void text_block(const string& s, double width, int justify, int innerjust)
+ *
+ * This calls:
+ * fftext_block
+ * text_tomacro
+ * text_topcode
+ * uses: do_prim
+ * text_wrapcode
+ * uses: set_glue
+ * text_draw
+ *
+ * text_tomacro
+ * -> expands macro's (starting with "\")
+ * -> expands special characters (such as '^' and '_') unless they are escaped
+ *
+ * text_topcode
+ * -> convert result to op-codes
+ * -> does characters, ligatures, and kerning
+ * -> calls do_prim to handle primitive commands
+ *
+ * text_wrapcode
+ * -> introduce additional space (justify)
+ * -> handle newlines
+ *
+ * text_draw
+ * -> draw op-codes
+ *
+ * \accent{texcmr}{95}
+ * -> texcmr = font in which accent is defined
+ *
+ ************************************************************************************/
+
+class TexArgStrs {
+public:
+ string str1;
+ string str2;
+ string str3;
+ string str4;
+public:
+ void cmdParam1(uchar **in);
+ void cmdParam2(uchar **in);
+ void cmdParam3(uchar **in);
+ void cmdParam4(uchar **in);
+ void cmdParam12(uchar **in);
+ void cmdParam4_swap34(uchar **in);
+ inline const char* getCStr1() { return str1.c_str(); }
+ inline const char* getCStr2() { return str2.c_str(); }
+ inline const char* getCStr3() { return str3.c_str(); }
+ inline const char* getCStr4() { return str4.c_str(); }
+};
+
+#define NORET (int) 0
+double emtof(char *s);
+double emtof(const string& s);
+void font_reset_parskip(void);
+void set_parskip(double v);
+void set_lineskip(double v);
+int ncat(char *a,char *b,int n);
+void pp_fntchar(int f, int c,int *out, int *lout);
+void cmd_token(uchar **in, uchar *cmdstr);
+void set_base_size(void);
+int find_primcmd(char *cmd);
+void text_box(const string& s,double width,int *tbuff, int *rplen);
+uchar* cmdParam(uchar **inp, uchar **pm, int* pmlen, int npm);
+void text_tomacro(const string& in, uchar *out);
+void texint(char *s, int *i);
+void texint(const string& s, int *i);
+void tex_presave(void);
+void tex_preload(void);
+void fsendstr(char *s, FILE *fout);
+void text_gprint(int *in,int ilen);
+void fftext_block(const string& s,double width,int justify);
+void font_load(void);
+void tex_init(void);
+int g_font_fallback(int font);
+void decode_utf8_basic(string& sc);
+
+void do_prim(uchar **in, int *out, int *lout, TexArgStrs* params);
+
+#define dbg if ((gle_debug & 1024)>0)
+extern int gle_debug;
+double text_endx,text_endy;
+
+/*----------------------------------------------------------------------*/
+/* TeX Emulation routines */
+/*----------------------------------------------------------------------*/
+
+#define FONTDEF extern
+#include "font.h"
+#include "tex.h"
+
+double linegap;
+
+/*----------------------------------------------------------------------*/
+
+struct def_table_struct {
+ struct def_table_struct *next;
+ char *name;
+ char *defn;
+ int npm;
+};
+typedef struct def_table_struct deftable;
+
+/*----------------------------------------------------------------------*/
+
+bool tex_def(const char *name, const char *defn,int npm);
+int tex_mathdef(const char *name, int defn);
+int* tex_findmathdef(const char *s);
+void tex_chardef(int c, const char *defn);
+char *tex_findchardef(int c);
+deftable *tex_finddef(const char *s) ;
+
+/*----------------------------------------------------------------------*/
+/* Global variables for TEX emulation */
+
+int fontfam[16][4];
+double fontfamsz[16][4]; /* 1=text, 2=script, 3=scriptscript */
+int famdef = -1; /* dont use unless/until it is defined */
+char *cdeftable[256]; /* Character macro's */
+uchar chr_code[256]; /* Character codes 1..9 */
+int chr_mathcode[256]; /* Character codes 1..9 */
+int chr_init; /* Flag to initialize chr variables */
+
+#define dp if (dont_print==false)
+
+int dont_print=0;
+int gt_plen;
+double gt_l,gt_r,gt_u,gt_d;
+
+#define TEX_MAX_CHARS 100000
+
+int gt_pbuff[TEX_MAX_CHARS];
+uchar tbuff[TEX_MAX_CHARS];
+
+int tofont[9] = {0,2,2,1,1,0,0,0,0};
+
+int p_fnt;
+double p_hei;
+double grphei[10];
+int grpfnt[10];
+int p_ngrp;
+
+double base_size;
+int curstyle=6;
+
+double stretch_factor=1;
+
+double accent_x = 0.0;
+double accent_y = 0.0;
+
+IntStringHash m_Unicode;
+
+union both {float f;int l;} bth;
+#define outlong(v) *(out+((*lout)++)) = v
+#define outfloat(v) bth.f = v; *(out+((*lout)++)) = bth.l
+#define tolong(fff) ((bth.f = fff),bth.l )
+
+float tofloat(int input) {
+ union both {
+ float f;
+ int l;
+ } bth;
+ bth.l = input;
+ return bth.f;
+}
+
+extern bool IS_INSTALL;
+extern CmdLineObj g_CmdLine;
+
+void set_stretch(double v) {
+ stretch_factor = v;
+}
+
+void set_base_size() {
+ g_get_hei(&base_size);
+}
+
+GLECoreFont* set_tex_font(int fnt) {
+ p_fnt = g_font_fallback(fnt);
+ return get_core_font_ensure_loaded(p_fnt);
+}
+
+void try_get_next_char(uchar **in, int *c1) {
+ *c1 = 0;
+ if (**in != 0) {
+ /* char code */
+ uchar code = chr_code[**in];
+ if (code == 1 || code == 10) {
+ *c1 = **in;
+ (*in)++;
+ }
+ }
+}
+
+uchar try_get_next_two_chars(uchar **in, int *c1, int *c2) {
+ if (**in == 0) {
+ /* end of stream */
+ return 0;
+ }
+ /* possibility that there is no second character */
+ *c2 = 0;
+ /* char code */
+ *c1 = **in;
+ uchar code = chr_code[**in];
+ (*in)++;
+ if (code == 6) {
+ /* check for unicode character */
+ if (str_ni_equals((const char*)*in, "UCHR{", 5)) {
+ char *ptr;
+ unsigned int unicode = strtol((const char*)(*in)+5, &ptr, 16);
+ GLECoreFont* cfont = set_tex_font(p_fnt);
+ int font_code = cfont->unicode_map(unicode);
+ if (font_code != -1) {
+ code = 1;
+ *c1 = font_code;
+ (*in) += 10;
+ }
+ }
+ }
+ if (code == 1 || code == 10) {
+ /* normal character, also check second one */
+ *c2 = **in;
+ if (chr_code[**in] == 6) {
+ /* check for unicode character */
+ if (str_ni_equals((const char*)(*in)+1, "UCHR{", 5)) {
+ char *ptr;
+ unsigned int unicode = strtol((const char*)(*in)+6, &ptr, 16);
+ GLECoreFont* cfont = set_tex_font(p_fnt);
+ int font_code = cfont->unicode_map(unicode);
+ if (font_code != -1) {
+ *c2 = font_code;
+ }
+ }
+ }
+ }
+ return code;
+}
+
+void text_topcode(uchar *in, int *out, int *lout) {
+ int skip_space = false;
+ float w;
+ uchar c;
+ int c1, c2;
+ GLECoreFont* cfont;
+ outlong(8); /* set font size */
+ outfloat(p_hei);
+ TexArgStrs params;
+ while ((c = try_get_next_two_chars(&in, &c1, &c2)) != 0) {
+ switch (c) {
+ case 10:
+ case 1: /* Normal character */
+ /* if next char is normal, then check for ligature and kern */
+norm_again:
+ w = 0;
+ cfont = set_tex_font(p_fnt);
+ if (c2 != 0) {
+ if (!g_CmdLine.hasOption(GLE_OPT_NO_LIGATURES)) {
+ if (cfont->char_lig(&c1, c2)) {
+ try_get_next_char(&in, &c2);
+ goto norm_again;
+ }
+ }
+ cfont->char_kern(c1, c2, &w);
+ // cout << "kern(" << c1 << "," << c2 << ") = " << w << endl;
+ }
+ outlong(1);
+ outlong(c1 | p_fnt*1024);
+ dbg gprint("==char width %d %f %f \n", c1, cfont->getCharDataThrow(c1)->wx, w);
+ outfloat((cfont->getCharDataThrow(c1)->wx + w)*p_hei);
+ skip_space = false;
+ break;
+ case 2: /* Single space */
+ if (skip_space) break;
+ skip_space = true;
+ outlong(2);
+ cfont = set_tex_font(p_fnt);
+ outfloat(cfont->info.space*p_hei);
+ outfloat(cfont->info.space_stretch*p_hei*10*stretch_factor);
+ outfloat(cfont->info.space_shrink*p_hei*10);
+ break;
+ case 3: /* Tab (for tabular) */
+ break;
+ case 4: /* 8Tab (verbatim) */
+ break;
+ case 5: /* \\ End of line */
+ skip_space = false;
+ outlong(5);
+ outlong(0); /* space for x,y to be put */
+ outlong(0);
+ break;
+ case 6: /* \ Primitive Command (macro's already done) */
+ skip_space = false;
+ do_prim(&in,out,lout,¶ms);
+ break;
+ case 7: /* { begin group */
+ skip_space = false;
+ grphei[++p_ngrp] = p_hei;
+ grpfnt[p_ngrp] = p_fnt;
+ break;
+ case 8: /* } end group */
+ skip_space = false;
+ if (p_ngrp<1) {
+ gprint("%s\n",in);
+ gprint("Too many end group brackets \n");
+ return;
+ }
+ p_hei = grphei[p_ngrp];
+ p_fnt = grpfnt[p_ngrp--];
+ font_load_metric(p_fnt);
+
+ outlong(8); outfloat(p_hei);
+ break;
+ case 9: /* $^_ Macro (Done in macro expansion) */
+ skip_space = false;
+ break;
+ case 11: /* flag for end of paragraph */
+ skip_space = false;
+ outlong(10);
+ outlong(0); /* space for x,y to be put */
+ outlong(0);
+ break;
+ default:
+ gprint("error, not valid character \n");
+ }
+ }
+}
+
+uchar* cmdParam(uchar **inp, uchar **pm, int* pmlen, int npm) {
+ int gcnt=0,i;
+ uchar* save_inp = *inp; /* need this to look ahead but not move ahaead */
+ uchar* in = *inp;
+ gcnt = 0;
+ for (i=0;i<npm;i++) {
+ pm[i] = in;
+ pmlen[i] = 0;
+ if (chr_code[*in]==7) { /* begin group */
+ pm[i] = ++in;
+ for (;*in!=0;in++) {
+ if (chr_code[*in]==7) gcnt++;
+ if (chr_code[*in]==8) {
+ if (gcnt==0) break;
+ gcnt--;
+ }
+ }
+ pmlen[i] = in - pm[i];
+ in++;
+ } else {
+ if (chr_code[*in]==6) { /* backslash look for non-alpha */
+ pm[i] = ++in;
+ if (isalpha(*pm[i])) {
+ for (;*in!=0;in++) {
+ if (!isalpha(*in)) {
+ break;
+ }
+ }
+ pmlen[i] = in - pm[i];
+ } else {
+ pm[i] = in;
+ pmlen[i] = 1;
+ in++;
+ }
+ } else {
+ pm[i] = in;
+ pmlen[i] = 1;
+ in++;
+ }
+ }
+ }
+ *inp = (uchar*)in;
+ return save_inp;
+}
+
+// used by topcode()
+void text_box(const string& s,double width,int *tbuff, int *rplen) {
+ int plen=0;
+ char *workbuff;
+
+ workbuff = (char*) myalloc(1000);
+ if (s.length() == 0) return;
+ if (chr_init == false) tex_init();
+ text_tomacro(s,UC workbuff);
+ plen = 0;
+ if (width==0) width = 400;
+ text_topcode(UC workbuff,tbuff,&plen);
+ text_wrapcode(tbuff,plen,width);
+ *rplen = plen;
+ myfree(workbuff);
+}
+
+void topcode(const string& s, int slen, double width, int **pbuff, int *plen, double *l,double *r,double *u,double *d) {
+ *pbuff = (int*) myalloc(1000);
+ g_init_bounds();
+ string sc = s.substr(0, slen);
+ text_box(sc,width,*pbuff,plen);
+ g_get_bounds(l,d,r,u);
+ if (*l > *r) {*l=0; *r=0; *u=0; *d=0;}
+}
+
+#define p_sethei(hh) pp_sethei(hh,out,lout)
+#define p_hfill(hh) pp_hfill(hh,out,lout)
+#define p_move(x,y) pp_move(x,y,out,lout)
+#define p_fntchar(ff,cc) pp_fntchar(ff,cc,out,lout)
+#define p_mathchar(m) pp_mathchar(m,out,lout)
+#define p_pcode(pbuff,plen) pp_pcode(pbuff,plen,out,lout)
+
+void pp_move(double x, double y, int *out,int *lout) {
+ outlong(4);
+ outfloat(x);
+ outfloat(y);
+}
+
+void pp_sethei(double h, int *out,int *lout) {
+ outlong(8);
+ outfloat(h);
+ p_hei = h;
+}
+
+void pp_hfill(double h, int *out,int *lout) {
+ outlong(2);
+ outfloat(0.0);
+ outfloat(h*p_hei);
+ outfloat(h*p_hei);
+}
+
+void char_bbox_user(int p_fnt,int ix, double *x1,double *y1,double *x2,double *y2) {
+ char_bbox(p_fnt,ix,x1,y1,x2,y2);
+ *x1 *= p_hei;
+ *x2 *= p_hei;
+ *y1 *= p_hei;
+ *y2 *= p_hei;
+}
+
+void pp_mathchar(int m, int *out, int *lout) {
+ int mchar,mfam,mtyp;
+ int ix;
+ double x1,y1,x2,y2,reqhi,yc;
+ double oldhei;
+ oldhei = p_hei;
+ mchar = m & 0xff;
+ mfam = (m & 0xf00) / 0x100;
+ mtyp = (m & 0xf000) / 0x1000;
+ if (mtyp == 7 && famdef>=0) mfam = famdef;
+ if (mtyp == 7) mtyp = 0;
+ ix = 'b'; /* center on letter b */
+ char_bbox_user(p_fnt,ix,&x1,&y1,&x2,&y2);
+ reqhi = y2/2;
+ p_sethei(fontfamsz[mfam][tofont[curstyle]] * p_hei);
+ char_bbox_user(fontfam[mfam][tofont[curstyle]],mchar,&x1,&y1,&x2,&y2);
+ yc = (y2-y1)/2;
+ if (mtyp==1) pp_move(0,reqhi+yc-y2,out,lout);
+ p_fntchar(fontfam[mfam][tofont[curstyle]],mchar);
+ if (mtyp==1) pp_move(0,-(reqhi+yc-y2),out,lout);
+ p_sethei(oldhei);
+}
+
+void mathchar_bbox(int m, double* x1, double* y1, double* x2, double* y2, double *cw) {
+ int mchar,mfam,mtyp;
+ mchar = m & 0xff;
+ mfam = (m & 0xf00) / 0x100;
+ mtyp = (m & 0xf000) / 0x1000;
+ if (mtyp == 7 && famdef >= 0) mfam = famdef;
+ if (mtyp == 7) mtyp = 0;
+ int font = fontfam[mfam][tofont[curstyle]];
+ char_bbox(font, mchar, x1, y1, x2, y2);
+ *cw = fnt[font]->getCharDataThrow(mchar)->wx;
+}
+
+void pp_fntchar(int ff, int ch, int *out,int *lout) {
+ ff = g_font_fallback(ff);
+ outlong(1);
+ if (ch == 0) ch = 254;
+ outlong(ch | ff*1024);
+ GLECoreFont* cfont = get_core_font_ensure_loaded(ff);
+ outfloat(cfont->getCharDataThrow(ch)->wx * p_hei);
+}
+
+void pp_pcode(int *pbuff, int plen, int *out,int *lout) {
+ int i;
+ out += *lout;
+ for (i=0;i<plen;i++) *out++ = *pbuff++;
+ *lout = *lout + plen;
+}
+
+void p_unichar(const string& str, int *out, int *lout) {
+ // cout << "unichar(" << str << ")" << endl;
+ char *ptr;
+ string code;
+ unsigned int unicode = strtol(str.c_str(), &ptr, 16);
+ int res = m_Unicode.try_get(unicode, &code);
+ if (res != 0) {
+ char* workbuff = (char*)myalloc(1000);
+ text_tomacro(code, UC workbuff);
+ text_topcode(UC workbuff, out, lout);
+ myfree(workbuff);
+ } else {
+ int i = 0;
+ int myfnt = g_font_fallback(31);
+ double savehei = p_hei;
+ p_sethei(0.4*savehei);
+ pp_move(0.0, 0.4*savehei, out, lout);
+ GLECoreFont* cfont = get_core_font_ensure_loaded(myfnt);
+ double crxpos = 0.0;
+ while (str[i] != 0) {
+ int ch = str[i];
+ double wid = cfont->getCharDataThrow(ch)->wx * p_hei;
+ switch (i) {
+ case 0:
+ case 1:
+ case 3:
+ break;
+ case 2:
+ pp_move(-crxpos, -0.4*savehei, out, lout);
+ break;
+ }
+ pp_fntchar(myfnt, ch, out, lout);
+ crxpos += wid;
+ i++;
+ }
+ p_sethei(savehei);
+ }
+}
+
+void TexArgStrs::cmdParam1(uchar **in) {
+ uchar *s[2];
+ int pmlen[2];
+ cmdParam(in, s, pmlen, 1);
+ str1.assign((char*)s[0], pmlen[0]);
+}
+
+void TexArgStrs::cmdParam12(uchar **in) {
+ uchar *s[2];
+ int pmlen[2];
+ cmdParam(in, s, pmlen, 1);
+ str2.assign((char*)s[0],pmlen[0]);
+}
+
+void TexArgStrs::cmdParam2(uchar **in) {
+ uchar *s[3];
+ int pmlen[3];
+ cmdParam(in, s, pmlen, 2);
+ str1.assign((char*)s[0],pmlen[0]);
+ str2.assign((char*)s[1],pmlen[1]);
+}
+
+void TexArgStrs::cmdParam3(uchar **in) {
+ uchar *s[4];
+ int pmlen[4];
+ cmdParam(in, s, pmlen, 3);
+ str1.assign((char*)s[0],pmlen[0]);
+ str2.assign((char*)s[1],pmlen[1]);
+ str3.assign((char*)s[2],pmlen[2]);
+}
+
+void TexArgStrs::cmdParam4(uchar **in) {
+ uchar *s[5];
+ int pmlen[5];
+ cmdParam(in, s, pmlen, 4);
+ str1.assign((char*)s[0],pmlen[0]);
+ str2.assign((char*)s[1],pmlen[1]);
+ str3.assign((char*)s[2],pmlen[2]);
+ str4.assign((char*)s[3],pmlen[3]);
+}
+
+void TexArgStrs::cmdParam4_swap34(uchar **in) {
+ uchar *s[5];
+ int pmlen[5];
+ cmdParam(in, s, pmlen, 4);
+ str1.assign((char*)s[0],pmlen[0]);
+ str2.assign((char*)s[1],pmlen[1]);
+ str4.assign((char*)s[2],pmlen[2]);
+ str3.assign((char*)s[3],pmlen[3]);
+}
+
+void tex_get_char_code(uchar** in, int* code) {
+ // parse the string "{number}"
+ // and make in point to after the "}"
+ string res;
+ while (*(*in) != '}' && *(*in) != 0) {
+ res += *(*in);
+ (*in)++;
+ }
+ if (*(*in) == '}') {
+ (*in)++;
+ }
+ texint((char*)(res.c_str()+1), code);
+}
+
+void tex_draw_accent(uchar **in, TexArgStrs* params, int *out, int *lout) {
+ double lef,dep,wid,hei;
+ double wid2,hei2,lef2,dep2,h=0,cwid,cwid2;
+ int ix,ix2;
+ int savefnt = p_fnt;
+ int newfnt = pass_font(params->getCStr1());
+ texint(params->str2,&ix);
+ int *m = NULL;
+ if (params->str3[0] != 0 && params->str3[1] != 0) {
+ if (str_i_equals(params->str3, "CHAR")) {
+ tex_get_char_code(in, &ix2);
+ } else {
+ m = tex_findmathdef(params->getCStr3());
+ if (m == NULL) {
+ gprint("Can't put accent on '%s'", params->getCStr3());
+ } else {
+ if (*(*in) == ' ') (*in)++;
+ }
+ }
+ } else {
+ ix2 = params->str3[0];
+ }
+ // cout << "'" << params->str1 << "' '" << params->str2 << "' '" << params->str3 << "'" << endl;
+ // cout << *in << endl;
+ char_bbox(newfnt, ix, &lef, &dep, &wid, &hei);
+ cwid = p_hei * fnt[newfnt]->getCharDataThrow(ix)->wx;
+ if (m == NULL) {
+ char_bbox(p_fnt, ix2, &lef2, &dep2, &wid2, &hei2);
+ cwid2 = p_hei * fnt[p_fnt]->getCharDataThrow(ix2)->wx;
+ } else {
+ mathchar_bbox(*m, &lef2, &dep2, &wid2, &hei2, &cwid2);
+ cwid2 *= p_hei;
+ }
+ // Print regular character
+ wid *= p_hei; wid2 *= p_hei; hei *= p_hei; hei2 *= p_hei;
+ lef *= p_hei; dep *= p_hei;
+ lef2 *= p_hei; dep2 *= p_hei;
+ if (hei2>p_hei*(3.6/8.0)) h = hei2-p_hei*(3.6/8.0);
+ if (m == NULL) {
+ p_fntchar(p_fnt,ix2);
+ } else {
+ p_mathchar(*m);
+ }
+ // Print accent on top of it
+ p_move(-cwid2+lef2+wid2/2-wid/2+accent_x,h+accent_y); /* cwid2/2 - cwid/2 */
+ p_fntchar(newfnt,ix); /* cwid2/2 + cwid/2 */
+ p_move(-cwid+cwid2-lef2-wid2/2+wid/2-accent_x,-h-accent_y);
+ set_tex_font(savefnt);
+}
+
+void tex_draw_accent_cmb(uchar **in, TexArgStrs* params, int *out, int *lout) {
+ if (params->str4.length() != 0 && params->str3.length() != 0) {
+ if (params->str3.length() == 1) {
+ int accent;
+ int ch = params->str3[0];
+ texint(params->str4, &accent);
+ GLECoreFont* cfont = set_tex_font(p_fnt);
+ FontCompositeInfo* info = cfont->get_composite_char(ch, accent);
+ if (info != NULL) {
+ double w1 = cfont->getCharDataThrow(info->c1)->wx * p_hei;
+ double w2 = cfont->getCharDataThrow(info->c2)->wx * p_hei;
+ double dx1 = info->dx1 * p_hei;
+ double dx2 = info->dx2 * p_hei;
+ double dy1 = info->dy1 * p_hei;
+ double dy2 = info->dy2 * p_hei;
+ p_move(dx1, dy1);
+ p_fntchar(p_fnt, info->c1);
+ p_move(dx2-dx1-w1, dy2-dy1);
+ p_fntchar(p_fnt, info->c2);
+ p_move(w1-w2-dx2, -dy2);
+ } else {
+ if (ch == 'i') params->str3[0] = 0x10;
+ if (ch == 'j') params->str3[0] = 0x11;
+ tex_draw_accent(in, params, out, lout);
+ }
+ } else {
+ tex_draw_accent(in, params, out, lout);
+ }
+ }
+}
+
+int select_font_encoding(int font, int encoding, const char* defaultFont) {
+ GLECoreFont* crfont = get_core_font_ensure_loaded(font);
+ if (crfont->info.encoding == encoding) {
+ return font;
+ } else {
+ return pass_font(defaultFont);
+ }
+}
+
+void do_prim(uchar **in, int *out, int *lout, TexArgStrs* params) {
+ int ci;
+ int ix;
+ uchar cmdstr[20];
+ double lef,wid,hei,dep,savehei;
+ int *pbuff=0;
+ int plen;
+ uchar *pmu[10];
+ int pmlen[10];
+ int *m,i,k,n,npm;
+
+ k = 0;
+
+ cmd_token(in,cmdstr); /* finds command name and parameters */
+ ci = find_primcmd((char*)cmdstr);
+
+ if (ci==0) { /* then maybe its a mathchar */
+ m = tex_findmathdef((char*)cmdstr);
+ if (m!=0) {
+ p_mathchar(*m);
+ } else {
+ gprint("Unrecognised control sequence {%s} \n",cmdstr);
+ }
+ return;
+ }
+
+ switch (ci) {
+ case tp_sup: /* \superscript{exp} */
+ /*printf("l=%g r=%g u=%g d=%g\n",gt_l,gt_r,gt_u,gt_d);*/
+ cmdParam(in,pmu,pmlen,1);
+ savehei = p_hei;
+ p_hei = p_hei * .7;
+ topcode((char*)pmu[0],pmlen[0],0.0,&pbuff,&plen,&lef,&wid,&hei,&dep);
+ /*g_measure(pm.s[0],&lef,&wid,&hei,&dep);
+ fftext_block(UC pm.s[0],0.0,0);
+ g_get_bounds(&lef,&wid,&hei,&dep);*/
+
+ p_move(0,0.8*p_hei);
+ p_pcode(pbuff,plen);
+ /*printf("this P=[%s]\n",pm.s[0]);*/
+ p_move(0,-0.8*p_hei);
+ find_primcmd((char*)cmdstr);
+
+ /* do a look ahead to see if there is a superscript */
+ /* but keep in pointing to current spot */
+ *in = cmdParam(in,pmu,pmlen,1);
+ /* check to see if subscript is next */
+ if(strncmp((char*)pmu[0],"sub ",4)==0) {
+ /* move back to starting point */
+ /*p_move(-wid,0);
+ printf("subscript next P=[%s]\n",pm.s[0]);
+ */
+ }
+ myfree(pbuff);
+ p_sethei(savehei);
+ break;
+ case tp_sub: /* \subscript{exp} */
+ /*printf("l=%g r=%g u=%g d=%g\n",gt_l,gt_r,gt_u,gt_d);*/
+ cmdParam(in,pmu,pmlen,1);
+ savehei = p_hei;
+ p_hei = p_hei * .7;
+ topcode((char*)pmu[0],pmlen[0],0.0,&pbuff,&plen,&lef,&wid,&hei,&dep);
+ /*printf("lef=%g wid=%g hei=%g dep=%g\n",lef,wid,hei,dep);*/
+ p_move(0.0,-0.3*p_hei);
+ p_pcode(pbuff,plen);
+ /*printf("this B=[%s]\n",pm.s[0]);*/
+
+ p_move(0,0.3*p_hei);
+ /* do a look ahead to see if there is a superscript */
+ /* but keep in pointing to current spot */
+ *in = cmdParam(in,pmu,pmlen,1);
+ /* check to see if superscript is next */
+ if(strncmp((char*)pmu[0],"sup ",4)==0) {
+ /* move back to starting point */
+ /*p_move(-wid,0);*/
+ /*printf("supescript next B=[%s]\n",pm.s[0]);*/
+ }
+
+ myfree(pbuff);
+ p_sethei(savehei);
+ break;
+ case tp_sethei: /* \sethei{exp} */
+ params->cmdParam1(in);
+ p_sethei(emtof(params->str1));
+ break;
+ case tp_hfill: /* \sethei{exp} */
+ p_hfill(10.0);
+ break;
+ case tp_char:
+ params->cmdParam1(in);
+ texint(params->str1,&ix);
+ p_fntchar(p_fnt,ix);
+ break;
+ case tp_chardef: /* \chardef{a}{xxxxx} */
+ params->cmdParam2(in);
+ tex_chardef(params->str1[0],params->getCStr2());
+ break;
+ case tp_ssfont:
+ k++;
+ case tp_sfont:
+ k++;
+ case tp_tfont: /* \tfont{0}{cmr10}{.5} */
+ params->cmdParam3(in);
+ i = atoi(params->getCStr1()); if (i>15) i = 1;
+ fontfam[i][k] = pass_font(params->getCStr2());
+ fontfamsz[i][k] = emtof(params->str3);
+ break;
+ case tp_fontenc:
+ params->cmdParam2(in);
+ set_tex_font(select_font_encoding(p_fnt, atoi(params->getCStr1()), params->getCStr2()));
+ break;
+ case tp_acccmb:
+ params->cmdParam4_swap34(in);
+ tex_draw_accent_cmb(in, params, out, lout);
+ break;
+ case tp_accent: /* accent{texcmr}{123}{a} */
+ params->cmdParam3(in);
+ tex_draw_accent(in, params, out, lout);
+ break;
+ case tp_accentxy:
+ params->cmdParam2(in);
+ accent_x = emtof(params->str1);
+ accent_y = emtof(params->str2);
+ break;
+ case tp_unicode:
+ params->cmdParam2(in);
+ texint(params->str1,&ix);
+ m_Unicode.add_item(ix, params->str2);
+ break;
+ case tp_uchr:
+ params->cmdParam1(in);
+ p_unichar(params->str1, out, lout);
+ break;
+ case tp_def:
+ params->cmdParam1(in); /* finds everything up to the #1#2 */
+ npm = 0;
+ while (**in == '#') {
+ (*in)++;
+ n = (*(*in)++) - '0';
+ if (n>0 && n<9) if (npm<n) npm=n;
+ }
+ params->cmdParam12(in);
+ // cout << "def: '" << params->getCStr1() << "' -> '" << params->getCStr2() << "'" << endl;
+ tex_def(params->getCStr1(),params->getCStr2(),npm);
+ break;
+ case tp_mathchardef: /* /mathchardef */
+ params->cmdParam2(in);
+ texint(params->str2,&ix);
+ tex_mathdef(params->getCStr1()+1,ix);
+ break;
+ case tp_movexy:
+ params->cmdParam2(in);
+ p_move(emtof(params->str1),emtof(params->str2));
+ break;
+ case tp_rule:
+ params->cmdParam2(in);
+ outlong(6);
+ outfloat(emtof(params->str1));
+ outfloat(emtof(params->str2));
+ break;
+ case tp_mathchar:
+ params->cmdParam1(in);
+ texint(params->str1,&ix);
+ p_mathchar(ix);
+ break;
+ case tp_mathcode:
+ params->cmdParam2(in);
+ texint(params->str2,&ix);
+ chr_mathcode[(unsigned char)params->str1[0]] = ix;
+ break;
+ case tp_delcode:
+ params->cmdParam2(in);
+ texint(params->str2,&ix);
+ chr_mathcode[(unsigned char)params->str1[0]] = ix;
+ break;
+ case tp_setfont:
+ params->cmdParam1(in);
+ set_tex_font(pass_font(params->getCStr1()));
+ break;
+ case tp_presave:
+ gprint("Saving definitions\n");
+ tex_presave();
+ break;
+ case tp_newline:
+ outlong(5);
+ outlong(0); /* space for x,y to be put */
+ outlong(0);
+ break;
+ case tp_parskip:
+ params->cmdParam1(in);
+ set_parskip(emtof(params->str1));
+ break;
+ case tp_setstretch:
+ params->cmdParam1(in);
+ set_stretch(emtof(params->str1));
+ break;
+ case tp_lineskip:
+ params->cmdParam1(in);
+ set_lineskip(emtof(params->str1));
+ break;
+ case tp_linegap:
+ params->cmdParam1(in);
+ linegap = emtof(params->str1);
+ break;
+ case tp_tex:
+ params->cmdParam1(in);
+ outlong(11);
+ outlong(TeXInterface::getInstance()->createObj(params->getCStr1(), p_hei));
+ break;
+ case tp_frac:
+ case tp_delimiter:
+ case tp_left:
+ case tp_right:
+ case tp_defbegin:
+ case tp_nolimits:
+ case tp_overbrace:
+ case tp_overline:
+ case tp_underbrace:
+ case tp_underline:
+ gprint("A valid GLE-TEX primitive which isn't implemented yet %d \n",ci);
+ break;
+ default:
+ gprint("An invalid GLE-TEX primitive %d \n",ci);
+ break;
+ }
+}
+
+double emtof(char *s) { /* same as ATOF but if it sees EM then it multiplies by FONT HEI */
+ if (strstr(s,"sp")!=NULL) {
+ GLECoreFont* cfont = set_tex_font(p_fnt);
+ return atof(s) * cfont->info.space*p_hei;
+ }
+ if (strstr(s,"em")!=NULL) {
+ return atof(s)*p_hei*0.75;
+ }
+ return atof(s);
+}
+
+double emtof(const string& s) {
+ if (str_i_str(s, "sp") != -1) {
+ GLECoreFont* cfont = set_tex_font(p_fnt);
+ return atof(s.c_str()) * cfont->info.space*p_hei;
+ }
+ if (str_i_str(s, "em") != -1) {
+ return atof(s.c_str())*p_hei*0.75;
+ }
+ return atof(s.c_str());
+}
+
+void texint(char *s, int *i) {
+ int j;
+ if (*s=='$') {
+ sscanf(s+1,"%x",&j);
+ *i = j;
+ } else {
+ *i = atoi(s);
+ }
+}
+
+void texint(const string& s, int *i) {
+ if (s[0] == '$') {
+ sscanf(s.c_str()+1, "%x", i);
+ } else {
+ *i = atoi(s.c_str());
+ }
+}
+
+/*
+ Character Codes
+
+ a..z 1 normal character
+ space 2 single space
+ <TAB>,& 3 Tab (as in tabular)
+ <8TAB> 4 TAB (as in verbatim)
+ <LF>,\\ 5 End of line
+ \ 6 Macro or command
+ { 7 Begin group
+ } 8 end group
+ $_^ 9 Macro call
+ 10 null
+ 255 11 end of paragraph (crcr)
+ end of command, = first non alpha character
+*/
+
+/* Bounding Box ??
+
+ 1=char font+char,x
+ 2=move x,stret,shrink throw away after cr
+ 3=MOVE x,0,0 glue which has been set
+ 4=MOVE x,y solid move
+ 5=newline,x,y
+ 6=rule x,y
+ 10=color color
+ 8=fontsz fontsz
+ 9=font i
+ 15=null
+*/
+
+#define infloat(fff) ((bth.l = fff),bth.f)
+
+void text_wrapcode(int *in,int ilen,double width) {
+ double cx=0,cy=0,p_hei,ax=0,y,cdep=0,chei=0;
+ int i,c,crFont,si,skline,saveii;
+ double totstretch=0,totshrink=0,ls=0,gap=0,last_y,last_x,lastdep,last_stret,last_shrink;
+ int *pcr=0,last_space=0;
+ double setlen;
+ bool eat_glue = false;
+ dbg text_gprint(in,ilen);
+ ls = 0;
+ last_x = 0;
+ gap = 0;
+ last_y = 0;
+ lastdep = 0;
+ last_stret = 0;
+ last_shrink = 0;
+ GLECoreFont* cfont;
+ dbg gprint("==wrap pcode, ilen = %d \n",ilen);
+ dbg gprint("wrap pcode ilen=%d \n",ilen);
+ p_hei = 1;
+ si = 0;
+ for (i=0;i<ilen;i++) {
+ switch (*(in+i)) {
+ case 1: /* char font+char,wx */
+ eat_glue = false;
+ crFont = g_font_fallback((*(in+ ++i)) / 1024);
+ cfont = get_core_font_ensure_loaded(crFont);
+ c = *(in+i) & 0x3ff;
+ {
+ GLEFontCharData* charData = cfont->getCharDataThrow(c);
+ if (cdep > cy + p_hei * charData->y1)
+ cdep = cy + p_hei * charData->y1;
+ if (chei < cy + p_hei * charData->y2)
+ chei = cy + p_hei * charData->y2;
+ }
+ /* gprint("chei=%f, cdep=%f \n",chei,cdep); */
+ cx += tofloat(*(in+ ++i));
+ ax = cx;
+ if (cx>width) {
+ if (last_space>si) {
+ dbg gprint("Call SET_GLUE from %d, to %d \n",si,last_space);
+ set_glue(in+si,last_space-si,last_x,width,last_stret,last_shrink,&setlen);
+ i = last_space;
+ *(in+i++) = 4;
+ *(in+i++) = tolong(-setlen);
+ if (pcr!=NULL) { /* put in last line feed now */
+ y = last_y-ls;
+ if ((y+chei+gap)>lastdep)
+ y = lastdep-chei-gap;
+ cy = y;
+ *pcr = tolong(y);
+ }
+ font_get_lineskip(&ls,&gap);
+ pcr = (in+i++); /* place to put line feed */
+ *(in+i) = 20; /* null */
+ last_stret = 0;
+ last_shrink = 0;
+ totstretch = 0;
+ totshrink = 0;
+ lastdep = cdep;
+ last_y = cy;
+ cx = 0;
+ cy = 0;
+ si = i;
+ eat_glue = true;
+ }
+ }
+ break;
+ case 2: /* move x,stretch,shrink */
+ last_space = i;
+ last_x = ax;
+ last_y = cy;
+ last_stret = totstretch;
+ last_shrink = totshrink;
+ if (eat_glue) {*(in+i)=3; *(in+ ++i)=tolong(0);i+=2;break;}
+ cx += tofloat(*(in+ ++i));
+ totstretch += tofloat(*(in+ ++i));
+ totshrink += tofloat(*(in+ ++i));
+ dbg gprint("total stretch %f, shrink %f \n",totstretch,totshrink);
+ break;
+ case 3: /* move x,0,0 SOLID */
+ cx += tofloat(*(in+ ++i));
+ i += 2;
+ ax = cx;
+ eat_glue = false;
+ break;
+ case 4: /* move x,y SOLID */
+ eat_glue = false;
+ cx += tofloat(*(in+ ++i));
+ cy += tofloat(*(in+ ++i));
+ ax = cx;
+ break;
+ case 5: /* Newline x,y (0,0 at moment) */
+ case 10:
+ if (*(in+i)==5) skline = true; else skline = false;
+ *(in+i) = 0;
+/* last_space = i;
+ last_x = ax;
+ last_y = cy;
+ last_stret = totstretch;
+ last_shrink = totshrink;
+*/
+ if (last_space<=si || ax==cx) {
+ last_x = ax;
+ last_y = cy;
+ last_stret = totstretch;
+ last_shrink = totshrink;
+ last_space = i;
+ }
+ dbg gprint("Call SET_GLUE from %d, to %d \n",si,last_space);
+ set_glue(in+si,last_space-si,last_x,width,last_stret,last_shrink,&setlen);
+ saveii = i;
+ i = last_space;
+ while (i < saveii) *(in+i++) = 20; /* nop */
+ *(in+i++) = 4;
+ *(in+i++) = tolong(-setlen);
+ if (pcr!=NULL) { /* put in last line feed now */
+ y = last_y-ls;
+ if ((y+chei+gap)>lastdep)
+ y = lastdep-chei-gap;
+ cy = y;
+ *pcr = tolong(y);
+ }
+ if (skline)
+ font_get_lineskip(&ls,&gap);
+ else font_get_parskip(&ls,&gap);
+ pcr = (in+i); /* place to put line feed */
+ last_stret = 0;
+ last_shrink = 0;
+ totstretch = 0;
+ totshrink = 0;
+ lastdep = cdep;
+ last_y = cy;
+ cx = 0;
+ cy = 0;
+ si = i+1;
+ eat_glue = true;
+ break;
+/* eat_glue = true;
+ i += 2;
+ break; */
+ case 11: /* TeX */
+ {
+ TeXInterface* iface = TeXInterface::getInstance();
+ TeXHashObject* hobj = iface->getHashObject(*(in+ ++i));
+ cx += hobj->getWidth();
+ }
+ break;
+ case 6: /* rule x,y */
+ i += 2;
+ eat_glue = false;
+ break;
+ case 7: /* color color */
+ g_set_color((int) tofloat(*(in+ ++i)));
+ break;
+ case 8: /* fontsz sz */
+ p_hei = tofloat(*(in+ ++i));
+ g_set_hei(p_hei);
+ break;
+ case 9: /* font p_fnt */
+ crFont = g_font_fallback(*(in+ ++i));
+ font_load_metric(crFont);
+ break;
+ case 20: /* nop */
+ break;
+ default:
+ gprint("dud pcode in wrap pcode %d i=%d \n",*(in+i),i);
+ break;
+ }
+ }
+
+ if (last_space==0) last_space = ilen;
+ dbg gprint("Exiting call to SET_GLUE from %d, to %d \n",si,last_space);
+ set_glue(in+si,last_space-si,last_x,width,last_stret,last_shrink,&setlen);
+ if (pcr!=NULL) { /* put in last line feed now */
+ y = last_y-ls;
+ if ((y+chei+gap)>lastdep)
+ y = lastdep-chei-gap;
+ cy = y;
+ *pcr = tolong(y);
+ }
+ dbg text_gprint(in,ilen);
+}
+
+void set_glue(int *in,int ilen,double actual,double width,double stretch,double shrink,double *setlen) {
+ double mst=0,msh=0;
+ float s1,s2,x;
+ int i=0;
+
+ dbg gprint("===set glue \n");
+ dbg text_gprint(in,ilen);
+ dbg gprint("set glue ilen=%d actual=%f, width=%f, stretch=%f shrink=%f \n"
+ ,ilen,actual,width,stretch,shrink);
+/* if (actual<0) get_natural(in,ilen,&actual); */
+ if (actual<width) {
+ if (stretch>0.0000001) mst = (width-actual)/stretch;
+ msh = 0;
+ if (mst>1) mst=0;
+ } else {
+ mst = 0;
+ if (shrink>0) msh = (actual-width)/shrink;
+ if (msh>1) msh=0;
+ }
+ *setlen = actual+stretch*mst+shrink*msh;
+ dbg gprint("SETTing glue to %f %f actual %f, setto %f\n",mst,msh,actual,*setlen);
+
+ for (i=0;i<ilen;i++) {
+ switch (*(in+i)) {
+ case 1: /* char font+char,wx */
+ i += 2;
+ break;
+ case 2: /* move x,stretch,shrink */
+ x = tofloat(*(in+i+1));
+ s1 = tofloat(*(in+i+2));
+ s2 = tofloat(*(in+i+3));
+ *(in+i) = 3;
+ *(in+i+1) = tolong(x + s1*mst+s2*msh);
+ i += 3;
+ break;
+ case 3: /* move x,0,0 SOLID */
+ i += 3;
+ break;
+ case 4: /* move x,y SOLID */
+ i += 2;
+ break;
+ case 5: /* Newline x,y (0,0 at moment) */
+ i += 2;
+ break;
+ case 6: /* rule x,y */
+ i += 2;
+ break;
+ case 7: /* color color */
+ i += 1;
+ break;
+ case 8: /* fontsz sz */
+ i += 1;
+ break;
+ case 9: /* font p_fnt */
+ i += 1;
+ break;
+ case 10: /* Newparagraph x,y (0,0 at moment) */
+ i += 2;
+ break;
+ case 11: /* TeX */
+ i += 1;
+ break;
+ case 20: /* nop */
+ break;
+ default:
+ gprint("dud (in set glue) pcode in text pcode %d i=%d\n",*(in+i),i);
+ break;
+ }
+ }
+ dbg printf("=== Result after setting \n");
+ dbg text_gprint(in,ilen);
+ dbg printf("===+++++ END OF SET GLUE =============== \n");
+}
+
+void text_draw(int *in,int ilen) {
+ double cx,cy,p_hei,x,y;
+ int i,c,crFont;
+ GLECoreFont* cfont;
+
+ dbg gprint("---TEXT DRAW, ilen = %d \n",ilen);
+ dbg text_gprint(in,ilen);
+ cx = 0;
+ cy = 0;
+ dp g_get_xy(&cx,&cy);
+ dbg printf("Current x y, %g %g \n",cx,cy);
+ p_hei = 1;
+
+ for (i=0;i<ilen;i++) {
+ switch (*(in+i)) {
+ case 1: /* char font+char,wx */
+ crFont = g_font_fallback((*(in+ ++i)) / 1024);
+ cfont = get_core_font_ensure_loaded(crFont);
+ c = *(in+i) & 0x3ff;
+ {
+ GLEFontCharData* cdata = cfont->getCharDataThrow(c);
+ g_update_bounds(cx+p_hei*(cdata->x1), cy+p_hei*(cdata->y1));
+ g_update_bounds(cx+p_hei*(cdata->x2), cy+p_hei*(cdata->y2));
+ }
+ dp {
+ g_move(cx,cy);
+ g_char(crFont,c);
+ }
+ cx += tofloat(*(in+ ++i));
+ break;
+ case 2: /* move x,stretch,shrink */
+ cx += tofloat(*(in+ ++i));
+ i += 2; /* glue is already set */
+ break;
+ case 3: /* move x,0,0 SOLID */
+ cx += tofloat(*(in+ ++i));
+ i += 2;
+ break;
+ case 4: /* move x,y SOLID */
+ cx += tofloat(*(in+ ++i));
+ cy += tofloat(*(in+ ++i));
+ break;
+ case 5: /* Newline x,y (turned into a move) */
+ i += 2;
+ break;
+ case 6: /* rule x,y */
+ x = tofloat(*(in+ ++i));
+ y = tofloat(*(in+ ++i));
+ g_update_bounds(cx,cy);
+ g_update_bounds(cx+x,cy+y);
+ if (x>0) g_box_fill(cx,cy,cx+x,cy+y);
+ break;
+ case 7: /* color color */
+/* dp g_set_color(tofloat(*(in+ ++i)));*/
+ break;
+ case 8: /* fontsz sz */
+ p_hei = tofloat(*(in+ ++i));
+ g_set_hei(p_hei);
+ break;
+ case 9: /* font p_fnt */
+ crFont = g_font_fallback(*(in+ ++i));
+ font_load_metric(crFont);
+ break;
+ case 10: /* Newline x,y (turned into a move) */
+ i += 2;
+ break;
+ case 11: /* TeX */
+ {
+ TeXObjectInfo info;
+ info.setPosition(cx, cy);
+ info.setJustify(JUST_LEFT);
+ if (dont_print) info.setFlag(TEX_OBJ_INF_DONT_PRINT);
+ TeXInterface* iface = TeXInterface::getInstance();
+ TeXHashObject* hobj = iface->getHashObject(*(in+ ++i));
+ iface->drawObj(hobj, info);
+ cx += hobj->getWidth();
+ }
+ case 20: /* nop */
+ break;
+ case 0:
+ dbg gprint("zero");
+ break;
+ default:
+ gprint("dud3 pcode in text pcode %d %d \n",*(in+i),i);
+ break;
+ }
+ }
+ text_endx = cx;
+ text_endy = cy;
+ dbg gprint("---TEXT DRAW, DONE. %g %g \n",cx,cy);
+}
+
+double tex_xend(void) {
+ return text_endx;
+}
+
+double tex_yend(void) {
+ return text_endy;
+}
+
+void text_gprint(int *in,int ilen) {
+ int i,c,crFont;
+ for (i=0;i<ilen;i++) printf("%x ",*(in+i));
+ printf("\n");
+ printf("# ");
+ double x = 0.0;
+ for (i=0;i<ilen;i++) {
+ switch (*(in+i)) {
+ case 1: /* char font+char,wx */
+ crFont = g_font_fallback((*(in+ ++i)) / 1024);
+ font_load_metric(crFont);
+ c = *(in+i) & 0x3ff;
+ x = tofloat(*(in+ ++i));
+ printf("%c[%3.3f]",c,x);
+ /* printf("%c{%d %3.3f} ",c,p_fnt,tofloat(*(in+ ++i))); */
+ break;
+ case 2: /* move x,stretch,shrink */
+ printf("[sp %3.3f %3.3f %3.3f] \n# ",tofloat(*(in+1+i))
+ ,tofloat(*(in+2+i)),tofloat(*(in+3+i)));
+ i += 3;
+ break;
+ case 3: /* move x,0,0 SOLID */
+ printf("(3 %3.3f %3.3f %3.3f) \n# ",tofloat(*(in+1+i))
+ ,tofloat(*(in+2+i)),tofloat(*(in+3+i)));
+ i += 3;
+ break;
+ case 4: /* move x,y SOLID */
+ printf("(4 %3.3f %3.3f) \n# ",tofloat(*(in+1+i))
+ ,tofloat(*(in+2+i)));
+ i += 2;
+ break;
+ case 5: /* Newline x,y (turned into a move) */
+ i += 2;
+ printf("5 \n# ");
+ break;
+ case 6: /* rule x,y */
+ printf("(rule %3.3f %3.3f) \n# ",tofloat(*(in+1+i))
+ ,tofloat(*(in+2+i)));
+ i += 2;
+ break;
+ case 7: /* color color */
+ printf("(color %x) \n# ",(*(in+ ++i)));
+ break;
+ case 8: /* fontsz sz */
+ printf("(p_hei %3.3f) \n# ",tofloat(*(in+ ++i)));
+ break;
+ case 9: /* font p_fnt */
+ printf("(font %d) \n",(*(in+ ++i)));
+ break;
+ case 10: /* Newline x,y (turned into a move) */
+ i += 2;
+ printf("\n10(paragraph)\n# ");
+ break;
+ case 20: /* nop */
+ printf("NOP ");
+ break;
+ default:
+ printf("(err=%4x pos=%d)\n ",*(in+i),i);
+ break;
+ }
+ }
+ printf("\n");
+}
+
+double lineskip1,parskip1;
+
+void font_reset_parskip() {
+ lineskip1 = 1.0;
+ parskip1 = 2.5;
+}
+
+void set_parskip(double v) {
+ parskip1 = v;
+}
+
+void set_lineskip(double v) {
+ lineskip1 = v;
+}
+
+void font_get_lineskip(double *ls,double *gap) {
+ *ls = p_hei * lineskip1;
+ *gap = *ls * .1 + linegap;
+}
+
+void font_get_parskip(double *ls,double *gap) {
+ *ls = p_hei * parskip1;
+ *gap = *ls * .1;
+}
+
+#define get_exps(ss) polish(ss,(char *) pcode,plen,&etype)
+#define tok(n) tk[n]
+
+const char* get_font_name(int idx) {
+ GLECoreFont* cfont = get_core_font(idx);
+ return cfont->name;
+}
+
+int get_nb_fonts() {
+ return fnt.size();
+}
+
+void text_block(const string& s,double width,int justify) {
+ text_block(s, width, justify, 0);
+}
+
+void text_block(const string& s, double width, int justify, int innerjust) {
+ double ox,oy,x,y,ll,rr,uu,dd;
+ double a,b,c,d;
+ set_base_size();
+ g_get_bounds(&a,&b,&c,&d);
+ g_init_bounds();
+ dont_print = true;
+ fftext_block(s,width,justify);
+ dont_print = false;
+ g_get_bounds(&ll,&dd,&rr,&uu);
+ if (ll > rr) {ll=0; rr=0; uu=0; dd=0;}
+ g_get_xy(&ox,&oy);
+ x = ox; y = oy;
+ g_dotjust(&x,&y,ll,rr,uu,dd,justify);
+ g_move(x,y);
+ g_init_bounds();
+ if (a<=c) {
+ g_update_bounds(a,b);
+ g_update_bounds(c,d);
+ }
+ g_get_bounds(&a,&b,&c,&d);
+ text_draw(gt_pbuff,gt_plen);
+ g_get_bounds(&a,&b,&c,&d);
+ g_move(ox,oy);
+}
+
+/* Searches CMD and replaces #n's with parameters */
+char *tex_replace(char *cmd,char *pm[],int pmlen[],int npm) {
+ char *r,*s,*o;
+ int n;
+
+/* printf("replace {%s} \n",cmd);
+ for (i=0;i<npm;i++) {
+ printf("pm[%d] = {%s} %d \n",i,pm[i],pmlen[i]);
+ }
+*/
+ if (strchr(cmd,'#')==0) return sdup(cmd);
+ r = (char*) myalloc(1000);
+ o = r;
+ for (s=cmd; *s!=0; s++) {
+ if (*s=='#') {
+ n = *(++s) - '0';
+ if (n>0 && n<=npm) {
+ strncpy(o,pm[n-1],pmlen[n-1]);
+ o += pmlen[n-1];
+ }
+ } else *o++ = *s;
+ }
+ *o++ = 0;
+ return r;
+}
+
+/*----------------------------------------------------------------------*/
+/* tex_chardef */
+/*----------------------------------------------------------------------*/
+
+void tex_chardef(int c, const char *defn) {
+ if (c < 0 || c > 255) return;
+ if (cdeftable[c] != NULL) myfree(cdeftable[c]);
+ cdeftable[c] = sdup(defn);
+}
+
+char* tex_findchardef(int c) {
+ if (c < 0 || c > 255) return "";
+ else return cdeftable[c];
+}
+
+/*----------------------------------------------------------------------*/
+/* Hashing table code for \def */
+/*----------------------------------------------------------------------*/
+
+#define HASHSIZE 101
+
+static deftable *def_hashtab[HASHSIZE];
+
+unsigned hash_str(const char *s) {
+ unsigned hashval;
+
+ for (hashval=0; *s != 0; s++)
+ hashval = *s + 31*hashval;
+ return hashval % HASHSIZE ;
+}
+
+deftable *tex_finddef(const char *s) {
+ deftable *np;
+
+ for (np = def_hashtab[hash_str(s)]; np != NULL; np = np->next)
+ if (strcmp(s, np->name)==0) {
+ return np;
+ }
+ return NULL;
+}
+
+bool tex_def(const char *name, const char *defn, int npm) {
+ deftable *np;
+ unsigned hashval;
+ // cout << "define '" << name << "' -> '" << defn << "'" << endl;
+ if ((np = tex_finddef(name)) == NULL) { /* not found */
+ np = (deftable *) myalloc(sizeof(*np));
+ if ((np == NULL) || (np->name = sdup(name)) == NULL)
+ return false;
+ hashval = hash_str(name);
+ np->next = def_hashtab[hashval];
+ def_hashtab[hashval] = np;
+ np->npm = npm;
+ if ((np->defn = sdup(defn)) == NULL) return false;
+ } else {
+ myfree(np->defn);
+ if ((np->defn = sdup(defn)) == NULL) return false;
+ }
+ return true;
+}
+
+/*----------------------------------------------------------------------*/
+/* Hashing table code for \mathchardef */
+/*----------------------------------------------------------------------*/
+
+struct mdef_table_struct {
+ struct mdef_table_struct *next;
+ char *name;
+ int defn;
+};
+typedef struct mdef_table_struct mdeftable;
+
+static mdeftable *mdef_hashtab[HASHSIZE];
+
+int* tex_findmathdef(const char *s) {
+ mdeftable* np;
+ for (np = mdef_hashtab[hash_str(s)]; np != NULL; np = np->next)
+ if (strcmp(s, np->name)==0) {
+ return &np->defn;
+ }
+ return NULL;
+}
+
+int tex_mathdef(const char *name, int defn) {
+ mdeftable *np;
+ int *d;
+ unsigned hashval;
+
+ if ((d = tex_findmathdef(name)) == NULL ) { /* not found */
+ np = (mdeftable *) myalloc(sizeof(*np));
+ if ((np == NULL) || (np->name = sdup(name)) == NULL)
+ return 0;
+ hashval = hash_str(name);
+ np->next = mdef_hashtab[hashval];
+ mdef_hashtab[hashval] = np;
+ np->defn = defn;
+ } else {
+ *d = defn;
+ }
+ return true;
+}
+
+void tex_init() {
+ for (int i = 0; i<256; i++) chr_code[i]=10; /* other */
+ for (int i = 65; i<91; i++) chr_code[i]=1; /* alpha */
+ for (int i = 97; i<123; i++) chr_code[i]=1;
+ for (int i = 0; i < HASHSIZE; i++) mdef_hashtab[i] = NULL;
+ chr_code[0] = 2; /* maybe should be 0, this is only tested in lig*/
+ chr_code[(unsigned int)' '] = 2;
+ chr_code[9] = 2;
+ chr_code[(unsigned int)'\n'] = 2;
+ chr_code[(unsigned int)'\\'] = 6;
+ chr_code[(unsigned int)'{'] = 7;
+ chr_code[(unsigned int)'}'] = 8;
+ chr_code[255] = 11; /* flag for end of paragraph, unless verbatim */
+ chr_init = true;
+ tex_preload();
+ tex_def(" ","\\movexy{1sp}{}",0);
+ tex_def("\\","\\newline{}",0);
+ tex_def("{","\\char{123}",0);
+ tex_def("}","\\char{125}",0);
+ tex_def("_","\\char{95}",0);
+ tex_def("^","\\acccmb{texcmr}{94}{4}",0);
+ tex_def("$","\\char{36}",0);
+}
+
+void tex_clear() {
+ /* clear CHARDEF table before each redraw */
+ tex_term();
+ tex_chardef('^',"\\sup ");
+ tex_chardef('_',"\\sub ");
+}
+
+void tex_term() {
+ for (int c = 0; c < 256; c++) {
+ if (cdeftable[c] != NULL) {
+ myfree(cdeftable[c]);
+ cdeftable[c] = NULL;
+ }
+ }
+}
+
+void g_measure(const string& s, double *l, double *r, double *u, double *d) {
+ double sa,sb,sc,sd;
+ g_get_bounds(&sa,&sb,&sc,&sd);
+ set_base_size();
+ g_init_bounds();
+ dont_print = true;
+ fftext_block(s,0.0,0);
+ dont_print = false;
+ g_get_bounds(l,d,r,u);
+ if (*l > *r) {*l=0; *r=0; *u=0; *d=0;}
+ gt_l = *l;
+ gt_r = *r;
+ gt_u = *u;
+ gt_d = *d;
+ g_init_bounds();
+ if (sa>sc) return;
+ g_update_bounds(sa,sb);
+ g_update_bounds(sc,sd);
+}
+
+void g_textfindend(const string& s, double *cx, double *cy) {
+ double sa,sb,sc,sd;
+ set_base_size();
+ g_get_bounds(&sa,&sb,&sc,&sd);
+ dont_print = true;
+ fftext_block(s,0.0,0);
+ *cx = text_endx;
+ *cy = text_endy;
+ dont_print = false;
+ g_init_bounds();
+ if (sa>sc) return;
+ g_update_bounds(sa,sb);
+ g_update_bounds(sc,sd);
+}
+
+void g_jtext(int just) {
+ double ox,oy,x,y;
+ g_get_xy(&ox,&oy);
+ x = ox; y = oy;
+ g_dotjust(&x,&y,gt_l,gt_r,gt_u,gt_d,just);
+ g_move(x,y);
+ text_draw(gt_pbuff,gt_plen);
+ g_move(ox,oy);
+}
+
+void text_def(uchar *s) {
+ gt_plen = 0;
+ if (chr_init==false) tex_init();
+ text_topcode(s,gt_pbuff,>_plen);
+}
+
+void fftext_block(const string& s,double width,int justify) {
+ g_get_font(&p_fnt);
+ font_load_metric(p_fnt);
+ g_get_hei(&p_hei);
+
+ font_reset_parskip();
+
+ gt_plen = 0;
+ if (s.length() == 0) {
+ /* gprint("TEXT_BLOCK, Passed empty string \n"); */
+ return;
+ }
+ if (chr_init == false) {
+ tex_init();
+ }
+ string sc = s;
+ // flag end of paragraph with 255 (octal 377)
+ decode_utf8_notex(sc);
+ str_replace_all(sc, "\n\n", "\n\377");
+ text_tomacro(sc, tbuff);
+ gt_plen = 0;
+ if (width == 0.0) {
+ width = 400;
+ chr_code[(unsigned int)'\n'] = 5;
+ } else {
+ chr_code[(unsigned int)'\n'] = 2;
+ }
+ text_topcode(tbuff,gt_pbuff,>_plen);
+ text_wrapcode(gt_pbuff,gt_plen,width);
+ text_draw(gt_pbuff,gt_plen);
+
+ g_set_font(p_fnt);
+ g_set_hei(p_hei);
+}
+
+void cmd_token(uchar **in, uchar *cmdstr) {
+ int i = 0;
+ if ( (!isalpha(**in)) && (**in != 0)) {
+ if ((*in)[0] == '\'' && (*in)[1] == '\'') {
+ // special case for two subsequent single quotes
+ *cmdstr++ = *(*in)++;
+ *cmdstr++ = *(*in)++;
+ } else {
+ *cmdstr++ = *(*in)++;
+ }
+ } else {
+ for (; chr_code[**in]==1 && **in != 0 && i<20;(*in)++,i++) {
+ *cmdstr++ = **in;
+ }
+ }
+ *cmdstr = 0;
+ cmdstr -= 1;
+ if (chr_code[*cmdstr]==1) {
+ // if last character is alpha, then eat all subsequent space
+ // (chr_code alpha = 1, space = 2)
+ for (;(**in != 0) && (chr_code[**in]==2);) (*in)++;
+ }
+}
+
+void text_tomacro(const string& in, uchar *out) {
+ /* find /cmdname or defined characters */
+ uchar macroname[30];
+ uchar *s,*dfn,*r,*saves;
+ int dlen;
+ int nrep;
+ deftable *np;
+ uchar* pmu[10];
+ int pmlen[10];
+ nrep = 0;
+ strcpy(SC out,SC in.c_str());
+ // Replace macros
+ for (s=out; *s != 0;s++) {
+ // cout << "current: '" << s << "'" << endl;
+ if (nrep>300) gle_abort("Loop in text macros\n");
+ if (chr_code[*s]==6) { /* backslash, begining of macro? */
+ saves = s;
+ s++;
+ cmd_token(&s,macroname);
+ // cout << "macro: " << macroname << endl;
+ np = tex_finddef((char*)macroname);
+ if (np != NULL) {
+ // cout << "found!" << endl;
+ nrep++;
+ dfn = UC np->defn;
+ dbg printf("Found macro {%s} = {%s} \n",macroname,dfn);
+ cmdParam(&s,pmu,pmlen,np->npm);
+ dlen = s-saves;
+ r = UC tex_replace(SC dfn,(char**)pmu,pmlen,np->npm);
+ s = saves;
+ memmove(SC s+strlen(SC r),SC s+dlen,strlen(SC s)+1);
+ strncpy(SC s,SC r,strlen(SC r));
+ myfree(r);
+ s--;
+ }
+ s = saves;
+ if (strcmp((char*)macroname, "tex")==0) {
+ // do not expand macros inside \tex{} expression
+ s = UC str_skip_brackets((char*)s, '{', '}');
+ }
+ if (strcmp((char*)macroname, "unicode")==0) {
+ // do not expand macros inside \unicode{}{} expression
+ s = UC str_skip_brackets((char*)s, '{', '}');
+ if (s[0] == '}') s++;
+ s = UC str_skip_brackets((char*)s, '{', '}');
+ }
+ if (strcmp((char*)macroname, "def")==0) {
+ // make sure not to expand macro's in macro name
+ // otherwise, during a second pass, the name will be replaced by the value
+ // e.g., \def\a{b} will trun into: \defb{b{}
+ s = UC str_find_char((const char*)s, '{');
+ }
+ }
+ if (cdeftable[*s]!=0) {
+ dbg printf("Found char definition %d {%s} \n",*s,s);
+ nrep++;
+ dfn = UC tex_findchardef(*s);
+ memmove(s+strlen(SC dfn)-1,s,strlen(SC s)+1);
+ strncpy(SC s,SC dfn,strlen(SC dfn));
+ s--;
+ }
+ }
+ // cout << "result of macros: '" << out << "'" << endl;
+}
+
+void tex_presave() {
+ int i;
+ deftable *dt;
+ GLEFileIO fout;
+ mdeftable *mdt;
+ /* Save all defined features possible */
+ string fname = gledir("inittex.ini");
+
+ fout.open(fname.c_str(), "wb");
+ if (!fout.isOpen()) gprint("Could not create inittex.ini file \n");
+ fout.fwrite(fontfam, sizeof(int), 16*4);
+ fout.fwrite(fontfamsz, sizeof(double), 16*4);
+ fout.fwrite(chr_mathcode, sizeof(char), 256);
+ for (i=0;i<HASHSIZE;i++) {
+ for (dt = def_hashtab[i]; dt != NULL; dt = dt->next) {
+ fout.fwrite(&i, sizeof(i), 1);
+ fout.fwrite(&dt->npm, sizeof(i), 1);
+ fout.fsendstr(dt->name);
+ fout.fsendstr(dt->defn);
+ }
+ }
+ i = 0x0fff; fout.fwrite(&i, sizeof(i), 1);
+ for (i=0;i<HASHSIZE;i++) {
+ for (mdt = mdef_hashtab[i]; mdt != NULL; mdt = mdt->next) {
+ fout.fwrite(&i, sizeof(i), 1);
+ fout.fwrite(&mdt->defn, sizeof(i), 1);
+ fout.fsendstr(mdt->name);
+ }
+ }
+ i = 0x0fff; fout.fwrite(&i, sizeof(i), 1);
+ for (i=0;i<256;i++) fout.fsendstr(cdeftable[i]);
+ /* write unicode definitions */
+ for (IntStringHash::const_iterator it = m_Unicode.begin(); it != m_Unicode.end(); it++ ) {
+ int key = it->first;
+ const string& data = it->second;
+ int len = data.size();
+ fout.fwrite(&key, sizeof(int), 1);
+ fout.fwrite(&len, sizeof(int), 1);
+ fout.fwrite(data.c_str(), sizeof(char),len);
+ }
+ i = 0;
+ fout.fwrite(&i, sizeof(int), 1);
+ fout.close();
+}
+
+void fgetvstr(char** s, GLEFileIO* fmt) {
+ int i = fmt->fgetc();
+ if (i == 0) return;
+ if (*s != NULL) myfree(*s);
+ *s = (char*) myalloc(i+1);
+ fmt->fread(*s, 1, i);
+ *(*s+i) = 0;
+}
+
+void tex_preload() {
+ int i,j;
+ GLEFileIO fout;
+ char str1[80],str2[80];
+ /* reload all defined features */
+#ifdef DO_TEX_DECODE
+ FILE* fhv;
+ fhv = fopen("decode.tex","w");
+#endif
+ string fname = gledir("inittex.ini");
+ fout.open(fname.c_str(), "rb");
+ if (!fout.isOpen()) {
+ if (!IS_INSTALL) gprint("Could not open inittex.ini file \n");
+ return;
+ }
+ fout.fread(fontfam, sizeof(int), 16*4);
+ fout.fread(fontfamsz, sizeof(double), 16*4);
+ fout.fread(chr_mathcode, sizeof(char), 256);
+#ifdef DO_TEX_DECODE
+ for(k=0;k<=16;k++){
+ fprintf(fhv,"*fontfam[%d]=%s fontfamsz[%d]=%s\n",k,fontfam[k],k,fontfamsz[k]);
+ }
+ fprintf(fhv,"chr_mathcode=%s\n",chr_mathcode);
+#endif
+ for (; fout.fread(&i, sizeof(i), 1), i != 0x0fff;) {
+ fout.fread(&j, sizeof(j), 1);
+ fout.fgetcstr(str1);
+ fout.fgetcstr(str2);
+ tex_def(str1,str2,j);
+#ifdef DO_TEX_DECODE
+ fprintf(fhv,"str1=%s str2=%s j=%d\n",str1,str2,j);
+#endif
+ }
+ i=0;
+ for (; fout.fread(&i, sizeof(i), 1), i != 0x0fff;) {
+ fout.fread(&j, sizeof(j), 1);
+ fout.fgetcstr(str1);
+ tex_mathdef(str1,j);
+#ifdef DO_TEX_DECODE
+ fprintf(fhv,"str1=%s i=%d\n",str1,i);
+#endif
+ }
+ i=0;
+ for (i=0;i<256;i++){
+ fgetvstr(&cdeftable[i], &fout);
+#ifdef DO_TEX_DECODE
+ fprintf(fhv,"cdeftable[%d]=%s\n",i,cdeftable[i]);
+#endif
+ }
+ /* load unicode definitions */
+ m_Unicode.clear();
+ int key;
+ fout.fread(&key, sizeof(int), 1);
+ char* read_ptr = NULL;
+ int read_ptr_len = 0;
+ while (key != 0) {
+ int len;
+ fout.fread(&len, sizeof(int), 1);
+ if (len >= read_ptr_len) {
+ read_ptr_len = 2*read_ptr_len + len + 1;
+ read_ptr = (char*)realloc(read_ptr, read_ptr_len);
+ }
+ fout.fread(read_ptr, sizeof(char), len);
+ read_ptr[len] = 0;
+ m_Unicode.add_item(key, read_ptr);
+ fout.fread(&key, sizeof(int), 1);
+ }
+ if (read_ptr != NULL) free(read_ptr);
+ fout.close();
+#ifdef DO_TEX_DECODE
+ fclose(fhv);
+#endif
+}
+
+/*
+ 0 0000 1 0001 2 0010 3 0011 4 0100 5 0101 6 0110
+ 7 0111 8 1000 9 1001 a 1010 b 1011 c 1100 d 1101
+ e 1110 f 1111
+
+ Char. number range | UTF-8 octet sequence
+ (hexadecimal) | (binary)
+ --------------------+---------------------------------------------
+ 0000 0000-0000 007F | 0xxxxxxx
+ 0000 0080-0000 07FF | 110xxxxx 10xxxxxx
+ 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
+ 0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
+*/
+
+int decode_utf8_byte(const string& sc, int len, int pos) {
+ if (pos >= len) return -1;
+ unsigned char ch = sc[pos];
+ if ((ch & 0xC0) != 0x80) return -1;
+ ch &= 0x3F;
+ return ch;
+}
+
+void decode_utf8_remove(string& sc, int* len, int pos, int nb) {
+ if (pos+nb <= *len) {
+ sc.erase(pos, nb);
+ (*len) = (*len) - nb;
+ }
+}
+
+void decode_utf8_add_unicode(int unicode, string& sc, int* len, int pos, int nb) {
+ string code;
+ char hexcode[10];
+ sprintf(hexcode, "%.4X", unicode);
+ code = "\\uchr{";
+ code += hexcode;
+ code += "}";
+ decode_utf8_remove(sc, len, pos, nb+1);
+ sc.insert(pos, code);
+ (*len) += code.length();
+}
+
+void decode_utf8_notex(string& sc) {
+ int prev = 0;
+ int ps = str_i_str(sc, 0, "\\TEX{");
+ if (ps != -1) {
+ string buffer;
+ while (ps != -1) {
+ int end_ps = str_skip_brackets(sc, ps, '{', '}') + 1;
+ string first_part(sc, prev, ps - prev);
+ decode_utf8_basic(first_part);
+ buffer += first_part;
+ buffer += string(sc, ps, end_ps - ps);
+ ps = str_i_str(sc, end_ps, "\\TEX{");
+ prev = end_ps;
+ }
+ if (prev+1 <= (int)sc.length()) {
+ string first_part(sc, prev);
+ decode_utf8_basic(first_part);
+ buffer += first_part;
+ }
+ sc = buffer;
+ } else {
+ decode_utf8_basic(sc);
+ }
+}
+
+void decode_utf8_basic(string& sc) {
+ int i = 0;
+ int len = sc.length();
+ while (i < len) {
+ unsigned char ch = sc[i];
+ if ((ch & 0x80) != 0) {
+ /* highest bit is one - 3 possibilities */
+ if ((ch & 0xE0) == 0xC0) {
+ /* 110x -> two byte unicode */
+ ch &= 0x1F;
+ int val = decode_utf8_byte(sc, len, i+1);
+ if (val == -1) {
+ sc[i] = '?';
+ } else {
+ int unicode = ch;
+ unicode = unicode << 6;
+ unicode += val;
+ decode_utf8_add_unicode(unicode, sc, &len, i, 1);
+ }
+ i++;
+ } else if ((ch & 0xF0) == 0xE0) {
+ /* 1110x -> three byte unicode */
+ ch &= 0x0F;
+ int val1 = decode_utf8_byte(sc, len, i+1);
+ int val2 = decode_utf8_byte(sc, len, i+2);
+ if (val1 == -1 || val2 == -1) {
+ sc[i] = '?';
+ } else {
+ int unicode = ch;
+ unicode = unicode << 6;
+ unicode += val1;
+ unicode = unicode << 6;
+ unicode += val2;
+ decode_utf8_add_unicode(unicode, sc, &len, i, 2);
+ }
+ i += 2;
+ } else if ((ch & 0xF8) == 0xF0) {
+ /* 1111x -> four byte unicode */
+ ch &= 0x07;
+ int val1 = decode_utf8_byte(sc, len, i+1);
+ int val2 = decode_utf8_byte(sc, len, i+2);
+ int val3 = decode_utf8_byte(sc, len, i+3);
+ if (val1 == -1 || val2 == -1 || val3 == -1) {
+ sc[i] = '?';
+ } else {
+ int unicode = ch;
+ unicode = unicode << 6;
+ unicode += val1;
+ unicode = unicode << 6;
+ unicode += val2;
+ unicode = unicode << 6;
+ unicode += val3;
+ decode_utf8_add_unicode(unicode, sc, &len, i, 3);
+ }
+ i += 3;
+ } else {
+ sc[i] = '?';
+ i++;
+ }
+ } else {
+ /* regular ascii 7 bit character */
+ i++;
+ }
+ }
+}
+
diff --git a/src/gle/tex.h b/src/gle/tex.h
new file mode 100644
index 0000000..16a44ec
--- /dev/null
+++ b/src/gle/tex.h
@@ -0,0 +1,51 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+enum { tp_parskip=1, tp_char, tp_def, tp_defbegin,
+ tp_delcode, tp_delimiter, tp_frac, tp_left,
+ tp_lineskip, tp_mathchar, tp_mathchardef, tp_mathcode,
+ tp_movexy, tp_nolimits, tp_overbrace, tp_overline,
+ tp_right, tp_setfont, tp_sethei, tp_sfont,
+ tp_ssfont, tp_sub, tp_sup, tp_tfont,
+ tp_underbrace, tp_underline, tp_presave, tp_chardef,
+ tp_newline, tp_hfill, tp_setstretch, tp_linegap,
+ tp_rule, tp_accent, tp_tex, tp_accentxy,
+ tp_unicode, tp_uchr, tp_acccmb, tp_fontenc };
+
+void tex_term();
+void decode_utf8_notex(string& sc);
diff --git a/src/gle/texinterface.cpp b/src/gle/texinterface.cpp
new file mode 100644
index 0000000..0cd901d
--- /dev/null
+++ b/src/gle/texinterface.cpp
@@ -0,0 +1,1569 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+/*
+ * (c) 2004 Jan Struyf
+ *
+ */
+
+#include "all.h"
+#include "tokens/stokenizer.h"
+#include "core.h"
+#include "file_io.h"
+#include "texinterface.h"
+#include "cutils.h"
+#include "gprint.h"
+#include "cmdline.h"
+#include "config.h"
+#include "mem_limits.h"
+#include "token.h"
+#include "var.h"
+#include "keyword.h"
+#include "run.h"
+#include "gle-poppler.h"
+
+#define BEGINDEF extern
+#include "begin.h"
+
+#include <time.h>
+
+void decode_utf8_basic(string& sc);
+
+extern ConfigCollection g_Config;
+extern CmdLineObj g_CmdLine;
+
+class FourDoubleList {
+protected:
+ double m_List[4];
+ int m_Pos;
+public:
+ FourDoubleList();
+ double get(int idx);
+ void add(double value);
+};
+
+FourDoubleList::FourDoubleList() {
+ m_Pos = 0;
+}
+
+double FourDoubleList::get(int idx) {
+ return m_List[(m_Pos + idx) % 4];
+}
+
+void FourDoubleList::add(double value) {
+ m_List[m_Pos] = value;
+ m_Pos = (m_Pos + 1) % 4;
+}
+
+TeXInterface TeXInterface::m_Instance;
+
+TeXInterface::TeXInterface() {
+ m_Enabled = true;
+}
+
+TeXInterface::~TeXInterface() {
+ cleanUpObjects();
+ cleanUpHash();
+ for (int i = 0; i < getNbFontSizes(); i++) {
+ delete getFontSize(i);
+ }
+}
+
+TeXObject* TeXInterface::draw(const char* str) throw(ParserError) {
+ TeXObjectInfo info;
+ return draw(str, info, 1);
+}
+
+TeXObject* TeXInterface::draw(const std::string& str, GLERectangle* box) throw(ParserError) {
+ TeXObjectInfo info;
+ return draw(str.c_str(), info, 1, box);
+}
+TeXObject* TeXInterface::drawUTF8(const char* str, GLERectangle* box) throw(ParserError) {
+ TeXObjectInfo info;
+ string utf8 = str;
+ decode_utf8_basic(utf8);
+ return draw(utf8.c_str(), info, 1, box);
+}
+
+TeXObject* TeXInterface::draw(const char* str, int nblines, GLERectangle* box) throw(ParserError) {
+ TeXObjectInfo info;
+ return draw(str, info, nblines, box);
+}
+
+TeXObject* TeXInterface::draw(const char* str, TeXObjectInfo& info, int nblines, GLERectangle* box) throw(ParserError) {
+ /* Load hash */
+ tryLoadHash();
+ /* Get object from hash */
+ string obj_str = str;
+ /* replace \'' by \" so that umlauts work in LaTeX expressions */
+ str_replace_all(obj_str, "\\''", "\\\"");
+ scaleObject(obj_str, 0.0);
+ TeXHashObject* hobj = getHashObject(obj_str);
+ hobj->setNbLines(nblines);
+ hobj->setUsed(true);
+ /* Construct object and add to list */
+ return drawObj(hobj, info, box);
+}
+
+void TeXInterface::scaleObject(string& obj_str, double hei) {
+ int scaleMode = getScaleMode();
+ if (scaleMode != TEX_SCALE_MODE_NONE) {
+ TeXPreambleInfo* preamble = getCurrentPreamble();
+ if (!preamble->hasFontSizes()) checkTeXFontSizes();
+ if (hei == 0) g_get_hei(&hei);
+ if (scaleMode == TEX_SCALE_MODE_FIXED) {
+ int best_size = preamble->getBestSizeFixed(hei);
+ if (best_size != -1) {
+ string prefix = "{\\" + getFontSize(best_size)->getName() + " ";
+ obj_str = prefix + obj_str + "}";
+ }
+ } else {
+ int best_size = preamble->getBestSizeScaled(hei);
+ if (best_size != -1) {
+ double scale = hei / preamble->getFontSize(best_size);
+ stringstream sstr;
+ sstr << "\\scalebox{" << scale << "}{{\\";
+ sstr << getFontSize(best_size)->getName();
+ sstr << " " << obj_str << "}}";
+ obj_str = sstr.str();
+ }
+ }
+ }
+}
+
+TeXObject* TeXInterface::drawObj(TeXHashObject* hobj, TeXObjectInfo& info, GLERectangle* box) throw(ParserError) {
+ /* Throw exception if disabled*/
+ if (!isEnabled()) {
+ g_throw_parser_error("safe mode - TeX subsystem has been disabled");
+ }
+ /* Update unknown fields of info structure */
+ info.initializeAll();
+ /* Check if dimensions available */
+ double width = 1.0, height = 0.5, baseline = 0.1;
+ if (hobj->hasDimensions()) {
+ width = hobj->getWidth();
+ height = hobj->getHeight();
+ baseline = hobj->getBaseline();
+ // cout << "OBJ: " << width << "x" << height << " + " << baseline << endl;
+ }
+ /* Handle justify */
+ double xp = info.getXp();
+ double yp = info.getYp();
+ int just = info.getJustify();
+ g_dotjust(&xp, &yp, 0.0, width, height, 0.0, just);
+ if ((just & 0x100) != 0) {
+ yp -= baseline;
+ }
+ /* Update bounding box */
+ g_update_bounds(xp, yp+height);
+ g_update_bounds(xp+width, yp);
+ if (box != NULL) {
+ box->setXMin(xp); box->setXMax(xp+width);
+ box->setYMin(yp); box->setYMax(yp+height);
+ }
+ /* Create object */
+ if ((info.getFlags() & TEX_OBJ_INF_DONT_PRINT) == 0 && !g_is_dummy_device()) {
+ TeXObject* obj = new TeXObject();
+ obj->setObject(hobj);
+ obj->setXY(xp, yp);
+ m_TeXObjects.push_back(obj);
+ obj->setColor(info.getColor());
+ /* Apply input transformation */
+ double devx, devy;
+ g_dev(xp, yp, &devx, &devy);
+ obj->setDeviceXY(devx/PS_POINTS_PER_INCH*CM_PER_INCH, devy/PS_POINTS_PER_INCH*CM_PER_INCH);
+ /* Find out if text should be rotated */
+ double angle = g_get_angle_deg();
+ if (fabs(angle) > 1e-6) {
+ obj->setAngle(angle);
+ }
+ /* Return object */
+ return obj;
+ } else {
+ return NULL;
+ }
+}
+
+void TeXInterface::checkObjectDimensions() {
+ GLEDevice* psdev = g_get_device_ptr();
+ double x0 = 0.0;
+ double y0 = 0.0;
+ double x1 = (double)psdev->getBoundingBox()->getX()/PS_POINTS_PER_INCH*CM_PER_INCH;
+ double y1 = (double)psdev->getBoundingBox()->getY()/PS_POINTS_PER_INCH*CM_PER_INCH;
+ for (vector<TeXObject*>::size_type i = 0; i < m_TeXObjects.size(); i++) {
+ TeXObject* obj = m_TeXObjects[i];
+ TeXHashObject* hobj = obj->getObject();
+ if (hobj != NULL && hobj->hasDimensions()) {
+ double cos_alpha = cos(obj->getAngle()*GLE_PI/180.0);
+ double sin_alpha = sin(obj->getAngle()*GLE_PI/180.0);
+ double ox0 = obj->getDXp();
+ double oy0 = obj->getDYp();
+ double ox1 = ox0 + hobj->getWidth()*cos_alpha;
+ double oy1 = oy0 + hobj->getWidth()*sin_alpha;
+ double ox2 = ox1 - hobj->getHeight()*sin_alpha;
+ double oy2 = oy1 + hobj->getHeight()*cos_alpha;
+ double ox3 = ox0 - hobj->getHeight()*sin_alpha;
+ double oy3 = oy0 + hobj->getHeight()*cos_alpha;
+ if (ox0 < x0 || ox0 > x1 || oy0 < y0 || oy0 > y1 ||
+ ox1 < x0 || ox1 > x1 || oy1 < y0 || oy1 > y1 ||
+ ox2 < x0 || ox2 > x1 || oy2 < y0 || oy2 > y1 ||
+ ox3 < x0 || ox3 > x1 || oy3 < y0 || oy3 > y1) {
+ string error = "TeX object '";
+ hobj->addFirstLine(&error);
+ error += "' outside bounding box";
+ g_message(error);
+ }
+ }
+ }
+}
+
+int TeXInterface::createObj(const char* str, double hei) {
+ /* Load hash */
+ tryLoadHash();
+ /* Create object given string */
+ string obj_str = str;
+ /* replace \'' by \" so that umlauts work in LaTeX expressions */
+ str_replace_all(obj_str, "\\''", "\\\"");
+ scaleObject(obj_str, hei);
+ int result = getHashObjectIndex(obj_str);
+ m_TeXHash[result]->setUsed(true);
+ return result;
+}
+
+void TeXInterface::addHashObject(TeXHashObject* obj) {
+ m_TeXHash.push_back(obj);
+}
+
+int TeXInterface::getHashObjectIndex(const string& line) {
+ for (vector<TeXHashObject*>::size_type i = 0; i < m_TeXHash.size(); i++) {
+ if (m_TeXHash[i]->getLine() == line) {
+ return i;
+ }
+ }
+ TeXHashObject* hobj = new TeXHashObject(line);
+ addHashObject(hobj);
+ m_HashModified = 1;
+ return m_TeXHash.size()-1;
+}
+
+TeXHashObject* TeXInterface::getHashObject(const string& line) {
+ return m_TeXHash[getHashObjectIndex(line)];
+}
+
+TeXHashObject* TeXInterface::getHashObject(int idx) {
+ return m_TeXHash.getHashObject(idx);
+}
+
+void TeXInterface::initialize(GLEFileLocation* dotfile, GLEFileLocation* oname) {
+ //cout << "TeXInterface::initialize('" << dotfile << "', '" << oname << "')" << endl;
+ /* cleanUp */
+ cleanUpObjects();
+ cleanUpHash();
+ /* Initialize flags */
+ m_HashLoaded = TEX_INTERFACE_HASH_LOADED_NONE;
+ m_HashModified = 0;
+ updateNames(dotfile, oname);
+ /* Get font sizes */
+ initTeXFontScales();
+}
+
+void TeXInterface::updateNames(GLEFileLocation* dotfile, GLEFileLocation* oname) {
+ m_MainOutputName.copy(oname);
+ /* File name without extension */
+ if (dotfile->getFullPath() == "") {
+ m_HashName = "";
+ m_DotDir = GLETempDirName();
+ m_DotDir += ".gle";
+ } else {
+ string infile, file;
+ GetMainNameExt(dotfile->getFullPath(), ".gle", infile);
+ SplitFileName(infile, m_DotDir, file);
+ m_DotDir += ".gle";
+ m_HashName = m_DotDir;
+ m_HashName += DIR_SEP;
+ m_HashName += file;
+ m_HashName += DIR_SEP;
+ m_HashName += file;
+ m_HashName += "_tex";
+ }
+}
+
+void TeXInterface::updateOutName(GLEFileLocation* oname) {
+ m_MainOutputName.copy(oname);
+}
+
+void TeXInterface::reset() {
+ resetPreamble();
+ cleanUpObjects();
+ setScaleMode(TEX_SCALE_MODE_FIXED);
+ m_HashModified = 0;
+ /* Remove unused objects */
+ for (int i = m_TeXHash.size()-1; i >= 0; i--) {
+ TeXHashObject* hobj = m_TeXHash[i];
+ if (!hobj->isUsed()) {
+ delete hobj;
+ m_TeXHash.erase(m_TeXHash.begin() + i);
+ }
+ }
+}
+
+void TeXInterface::resetPreamble() {
+ m_Preambles.selectDefault();
+}
+
+void TeXInterface::cleanUpObjects() {
+ for (vector<TeXObject*>::size_type i = 0; i < m_TeXObjects.size(); i++) {
+ delete m_TeXObjects[i];
+ }
+ m_TeXObjects.clear();
+}
+
+void TeXInterface::cleanUpHash() {
+ m_TeXHash.cleanUp();
+}
+
+void TeXInterface::tryLoadHash() {
+ if (m_HashLoaded != TEX_INTERFACE_HASH_LOADED_FULL && m_HashName != "") {
+ if (m_HashLoaded != TEX_INTERFACE_HASH_LOADED_PARTIAL) {
+ loadTeXLines();
+ }
+ m_TeXHash.loadTeXPS(m_HashName);
+ m_HashModified = 0;
+ m_HashLoaded = TEX_INTERFACE_HASH_LOADED_FULL;
+ }
+}
+
+void TeXInterface::loadTeXLines() {
+ string strfile = m_HashName;
+ strfile += ".texlines";
+ ifstream str_file(strfile.c_str());
+ if (str_file.is_open()) {
+ string line;
+ while (!str_file.eof()) {
+ int len = ReadFileLine(str_file, line);
+ if (len != 0) {
+ if (strncmp("tex", line.c_str(), 3) == 0) {
+ line.erase(0, 4);
+ TeXHashObject* hobj = new TeXHashObject(line);
+ addHashObject(hobj);
+ } else {
+ line.erase(0, 9);
+ string object_string;
+ int nblines = atoi(line.c_str());
+ for (int i = 0; i < nblines; i++) {
+ ReadFileLine(str_file, line);
+ if (object_string.length() == 0) {
+ object_string = line;
+ } else {
+ object_string += "\7";
+ object_string += line;
+ }
+ }
+ TeXHashObject* hobj = new TeXHashObject(object_string);
+ addHashObject(hobj);
+ }
+ }
+ }
+ str_file.close();
+ }
+}
+
+void TeXInterface::writeInc(ostream& out, const char* prefix) {
+ /* First output include for GLE .eps/.pdf file */
+ out << "\\setlength{\\unitlength}{1cm}%" << endl;
+ // out << "\\begingroup\\makeatletter\\ifx\\SetFigFont\\undefined%" << endl;
+ // out << "\\gdef\\SetFigFont#1#2#3#4#5{%" << endl;
+ // out << " \\reset at font\\fontsize{#1}{#2pt}%" << endl;
+ // out << " \\fontfamily{#3}\\fontseries{#4}\\fontshape{#5}%" << endl;
+ // out << " \\selectfont}%" << endl;
+ // out << "\\fi\\endgroup%" << endl;
+ /* Get page size */
+ double width, height, pic_a, pic_b;
+ if (g_is_fullpage()) {
+ g_get_pagesize(&width, &height);
+ pic_a = width;
+ pic_b = height;
+ } else {
+ g_get_usersize(&width, &height);
+ pic_a = width + 0.075;
+ pic_b = height + 0.075;
+ }
+ double pic_c = 0;
+ double pic_d = 0;
+ /* Output picture commands */
+ out << "\\noindent{}\\begin{picture}(" << pic_a << "," << pic_b << ")";
+ out << "(" << pic_c << "," << pic_d << ")%" << endl;
+ out << "\\put(0,0)";
+ // double offs = -CM_PER_INCH/72;
+ // out << "\\put(" << offs << "," << offs << ")";
+ string incname;
+ SplitFileNameNoDir(m_MainOutputName.getFullPath(), incname);
+ FileNameDotToUnderscore(incname); /* includegraphics does not handle "." in filenames */
+ out << "{\\includegraphics{" << prefix << incname << "_inc}}" << endl;
+ for (vector<TeXObject*>::size_type i = 0; i < m_TeXObjects.size(); i++) {
+ TeXObject* obj = m_TeXObjects[i];
+ obj->output(out);
+ }
+ out << "\\end{picture}%" << endl;
+}
+
+void TeXInterface::createInc(const string& prefix) {
+ // .inc files can also be created if there are no TeX objects
+ // this is for (a.o. Makefile) consistency - see bug #2165591
+ string inc_name = m_MainOutputName.getFullPath();
+ inc_name += ".inc";
+ ofstream inc_file(inc_name.c_str());
+ writeInc(inc_file, prefix.c_str());
+ inc_file.close();
+}
+
+void TeXInterface::createPreamble(ostream& tex_file) {
+ ConfigSection* tex = g_Config.getSection(GLE_CONFIG_TEX);
+ CmdLineArgSet* texsys = (CmdLineArgSet*)tex->getOptionValue(GLE_TEX_SYSTEM);
+ tex_file << getDocumentClass() << endl;
+ if (texsys->hasValue(GLE_TEX_SYSTEM_VTEX)) {
+ tex_file << "\\usepackage{graphics}" << endl;
+ } else {
+ tex_file << "\\usepackage[dvips]{graphics}" << endl;
+ }
+ for (int i = 0; i < getNbPreamble(); i++) {
+ tex_file << getPreamble(i) << endl;
+ }
+}
+
+void TeXInterface::createTeX(bool usegeom) {
+ if (m_TeXObjects.size() != 0) {
+ int m_type;
+ double m_width, m_height, pic_a, pic_b;
+ if (g_is_fullpage()) {
+ g_get_pagesize(&m_width, &m_height, &m_type);
+ pic_a = m_width;
+ pic_b = m_height;
+ } else {
+ g_get_usersize(&m_width, &m_height);
+ pic_a = m_width + 0.075;
+ pic_b = m_height + 0.075;
+ m_type = GLE_PAPER_UNKNOWN;
+ }
+ string tex_name = m_MainOutputName.getFullPath();
+ tex_name += ".tex";
+ if (GLEFileExists(tex_name)) {
+ g_throw_parser_error("GLE needs to create a temporary file '", tex_name.c_str(), "', but this file already exists");
+ }
+ ofstream tex_file(tex_name.c_str());
+ createPreamble(tex_file);
+ tex_file << "\\usepackage{color}" << endl;
+ if (usegeom) {
+ tex_file << "\\usepackage{geometry}" << endl;
+ tex_file << "\\geometry{%" << endl;
+ tex_file << " paperwidth=" << pic_a << "cm," << endl;
+ tex_file << " paperheight=" << pic_b << "cm," << endl;
+ tex_file << " left=0in," << endl;
+ tex_file << " right=0in," << endl;
+ tex_file << " top=0in," << endl;
+ tex_file << " bottom=0in" << endl;
+ tex_file << "}" << endl;
+ }
+ tex_file << "\\pagestyle{empty}" << endl;
+ tex_file << "\\begin{document}" << endl;
+ writeInc(tex_file, "");
+ tex_file << "\\end{document}" << endl;
+ tex_file.close();
+ }
+}
+
+int TeXInterface::tryCreateHash() {
+ if (m_HashModified != 0 && m_TeXObjects.size() != 0) {
+ createHiddenDir();
+ saveTeXLines();
+ m_TeXHash.saveTeXPS(m_HashName, this);
+ if (!createTeXPS()) {
+ /* error! */
+ return 2;
+ }
+ m_HashLoaded = TEX_INTERFACE_HASH_LOADED_PARTIAL;
+ return 1;
+ } else {
+ return 0;
+ }
+}
+
+void TeXInterface::removeDotFiles() {
+ string dir;
+ GetDirName(m_HashName, dir);
+ DeleteFileWithExt(m_HashName, ".aux");
+ DeleteFileWithExt(m_HashName, ".log");
+ DeleteFileWithExt(m_HashName, ".tex");
+ DeleteFileWithExt(m_HashName, ".dvi");
+ DeleteFileWithExt(m_HashName, ".ps");
+ DeleteFileWithExt(m_HashName, ".texlines");
+ TryDeleteDir(dir);
+}
+
+void TeXInterface::createHiddenDir() {
+ string dir;
+ GetDirName(m_HashName, dir);
+ EnsureMkDir(dir);
+}
+
+void TeXInterface::saveTeXLines() {
+ string strfile = m_HashName;
+ strfile += ".texlines";
+ ofstream str_file(strfile.c_str());
+ for (vector<TeXHashObject*>::size_type i = 0; i < m_TeXHash.size(); i++) {
+ TeXHashObject* obj = m_TeXHash[i];
+ if (obj->isUsed()) obj->outputLog(str_file);
+ }
+ str_file.close();
+}
+
+bool TeXInterface::createTeXPS() {
+ return createTeXPS(m_HashName);
+}
+
+bool TeXInterface::createTeXPS(const string& filestem) {
+ string dir, file;
+ SplitFileName(filestem, dir, file);
+ if (!run_latex(dir, file)) return false;
+ return run_dvips(filestem, false);
+}
+
+void TeXInterface::initTeXFontScales() {
+ addSize(new TeXSize("tiny"));
+ addSize(new TeXSize("scriptsize"));
+ addSize(new TeXSize("footnotesize"));
+ addSize(new TeXSize("small"));
+ addSize(new TeXSize("normalsize"));
+ addSize(new TeXSize("large"));
+ addSize(new TeXSize("Large"));
+ addSize(new TeXSize("LARGE"));
+ addSize(new TeXSize("huge"));
+ addSize(new TeXSize("Huge"));
+}
+
+void TeXInterface::checkTeXFontSizes() {
+ TeXPreambleInfo* preamble = getCurrentPreamble();
+ if (preamble->hasFontSizes()) return;
+ /* Create .gle subdirectory */
+ string dir = m_DotDir;
+ EnsureMkDir(dir);
+ dir += DIR_SEP;
+ dir += "texpreamble";
+ /* Try to load from file */
+ m_Preambles.load(dir, this);
+ if (preamble->hasFontSizes()) return;
+ /* Font sizes not found, recompute */
+ TeXHash tex_hash;
+ for (int i = 0; i < getNbFontSizes(); i++) {
+ string obj_name;
+ TeXSize* size = getFontSize(i);
+ size->createObject(&obj_name);
+ TeXHashObject* obj = new TeXHashObject(obj_name);
+ tex_hash.push_back(obj);
+ obj->setUsed(true);
+ }
+ /* Get sizes of these fonts */
+ tex_hash.saveTeXPS(dir, this);
+ createTeXPS(dir);
+ tex_hash.loadTeXPS(dir);
+ /* Save this info in the current preamble */
+ retrieveTeXFontSizes(tex_hash, preamble);
+ /* Save font sizes */
+ m_Preambles.save(dir);
+}
+
+void TeXInterface::retrieveTeXFontSizes(TeXHash& tex_hash, TeXPreambleInfo* preamble) {
+ for (int i = 0; i < getNbFontSizes(); i++) {
+ string obj_name;
+ TeXSize* size = getFontSize(i);
+ size->createObject(&obj_name);
+ TeXHashObject* obj = tex_hash.getHashObjectOrNULL(obj_name);
+ if (obj == NULL || !obj->hasDimensions()) {
+ cout << ">>> error: did not get size for TeX font!" << endl;
+ } else {
+ // Round values by converting them to a string
+ // -> Results in same rounding as if values are read from .pinfo file!
+ stringstream str_value;
+ double size_value = obj->getHeight() * FONT_HEI_FACTOR;
+ str_value << size_value;
+ str_value >> size_value;
+ preamble->setFontSize(i, size_value);
+ // cout << "font: " << size->getName() << " size: " << size_value << endl;
+ }
+ }
+ preamble->setHasFontSizes(true);
+}
+
+bool TeXPreambleKey::equals(const TeXPreambleKey* key) const {
+ if (getDocumentClass() != key->getDocumentClass()) return false;
+ int nb = getNbPreamble();
+ if (nb != key->getNbPreamble()) return false;
+ for (int i = 0; i < nb; i++) {
+ if (getPreamble(i) != key->getPreamble(i)) return false;
+ }
+ return true;
+}
+
+void TeXPreambleKey::copyFrom(const TeXPreambleKey* other) {
+ setDocumentClass(other->getDocumentClass());
+ int nb = other->getNbPreamble();
+ for (int i = 0; i < nb; i++) {
+ addPreamble(other->getPreamble(i));
+ }
+}
+
+TeXPreambleInfo::TeXPreambleInfo() {
+ m_HasFontSizes = false;
+}
+
+void TeXPreambleInfo::setFontSize(int font, double size) {
+ while ((int)m_FontSizes.size() <= font) {
+ m_FontSizes.push_back(0.0);
+ }
+ m_FontSizes[font] = size;
+}
+
+double TeXPreambleInfo::getFontSize(int font) {
+ return font >= (int)m_FontSizes.size() ? 1.0 : m_FontSizes[font];
+}
+
+void TeXPreambleInfo::save(ostream& os) {
+ int nb = getNbPreamble();
+ os << "preamble: " << nb << endl;
+ os << getDocumentClass() << endl;
+ for (int i = 0; i < nb; i++) {
+ os << getPreamble(i) << endl;
+ }
+ for (int i = 0; i < getNbFonts(); i++) {
+ if (i != 0) os << " ";
+ os << getFontSize(i);
+ }
+ os << endl;
+}
+
+void TeXPreambleInfo::load(istream& is, TeXInterface* iface) {
+ for (int i = 0; i < iface->getNbFontSizes(); i++) {
+ double size = 0.0;
+ is >> size;
+ setFontSize(i, size);
+ }
+ setHasFontSizes(true);
+}
+
+int TeXPreambleInfo::getBestSizeFixed(double hei) {
+ int best_size = -1;
+ double best_dist = GLE_INF;
+ for (int i = 0; i < getNbFonts(); i++) {
+ double dist = fabs(hei - getFontSize(i));
+ if (dist < best_dist) {
+ best_dist = dist;
+ best_size = i;
+ }
+ }
+ return best_size;
+}
+
+int TeXPreambleInfo::getBestSizeScaled(double hei) {
+ for (int i = 0; i < getNbFonts(); i++) {
+ double size_i = getFontSize(i);
+ if (size_i >= hei) {
+ return i;
+ }
+ }
+ return getNbFonts()-1;
+}
+
+TeXPreambleInfoList::TeXPreambleInfoList() {
+ m_Current = new TeXPreambleInfo();
+ m_Current->setDocumentClass("\\documentclass{article}");
+ addPreamble(m_Current);
+}
+
+TeXPreambleInfoList::~TeXPreambleInfoList() {
+ for (int i = 0; i < getNbPreambles(); i++) {
+ delete getPreamble(i);
+ }
+}
+
+TeXPreambleInfo* TeXPreambleInfoList::findOrAddPreamble(const TeXPreambleKey* pre_key) {
+ for (int i = 0; i < getNbPreambles(); i++) {
+ TeXPreambleInfo* info = getPreamble(i);
+ if (pre_key->equals(info)) return info;
+ }
+ TeXPreambleInfo* info = new TeXPreambleInfo();
+ info->copyFrom(pre_key);
+ addPreamble(info);
+ return info;
+}
+
+void TeXPreambleInfoList::save(const string& filestem) {
+ string file = filestem + ".pinfo";
+ ofstream pream_file(file.c_str());
+ for (int i = 0; i < getNbPreambles(); i++) {
+ if (getPreamble(i)->hasFontSizes()) {
+ getPreamble(i)->save(pream_file);
+ }
+ }
+ pream_file.close();
+}
+
+void TeXPreambleInfoList::load(const string& filestem, TeXInterface* iface) {
+ string file = filestem + ".pinfo";
+ ifstream pream_file(file.c_str());
+ if (pream_file.is_open()) {
+ string line;
+ TeXPreambleKey pre_key;
+ while (pream_file.good()) {
+ int len = ReadFileLine(pream_file, line);
+ if (len != 0) {
+ if (strncmp("preamble:", line.c_str(), 9) == 0) {
+ line.erase(0, 10);
+ int nblines = atoi(line.c_str());
+ ReadFileLine(pream_file, line);
+ pre_key.clear();
+ pre_key.setDocumentClass(line);
+ for (int i = 0; i < nblines; i++) {
+ ReadFileLine(pream_file, line);
+ pre_key.addPreamble(line);
+ }
+ TeXPreambleInfo* info = findOrAddPreamble(&pre_key);
+ info->load(pream_file, iface);
+ } else {
+ /* error in file format? */
+ return;
+ }
+ }
+ }
+ }
+ pream_file.close();
+}
+
+TeXHash::TeXHash() {
+}
+
+TeXHash::~TeXHash() {
+ cleanUp();
+}
+
+void TeXHash::cleanUp() {
+ for (unsigned int i = 0; i < size(); i++) {
+ delete get(i);
+ }
+ clear();
+}
+
+TeXHashObject* TeXHash::getHashObject(int idx) {
+ if (idx >= (int)size()) return NULL;
+ return get(idx);
+}
+
+TeXHashObject* TeXHash::getHashObjectOrNULL(const string& line) {
+ for (vector<TeXHashObject*>::size_type i = 0; i < size(); i++) {
+ if (get(i)->getLine() == line) {
+ return get(i);
+ }
+ }
+ return NULL;
+}
+
+void TeXHash::saveTeXPS(const string& filestem, TeXInterface* iface) {
+ string tex = filestem;
+ tex += ".tex";
+ ofstream hash_file(tex.c_str());
+ /* Output preamble */
+ iface->createPreamble(hash_file);
+ hash_file << "\\pagestyle{empty}" << endl;
+ hash_file << "\\begin{document}" << endl;
+ /* First object is for calibrating */
+ hash_file << "\\newpage" << endl;
+ hash_file << "\\noindent{}\\rule{1cm}{0.025cm}\\framebox{\\rule{1cm}{1cm}}" << endl << endl;
+ /* Output other objects */
+ for (vector<TeXHashObject*>::size_type i = 0; i < size(); i++) {
+ TeXHashObject* obj = get(i);
+ if (obj->isUsed()) obj->outputMeasure(hash_file);
+ }
+ hash_file << "\\end{document}" << endl;
+ hash_file.close();
+}
+
+void TeXHash::loadTeXPS(const string& filestem) {
+ int objindex = -1;
+ double adjWidth = 0.0, adjHeight = 0.0, adjBaseline = 0.0;
+ string ps_name = filestem;
+ ps_name += ".ps";
+ StreamTokenizerMax tokens(ps_name,' ', 50);
+ while (tokens.hasMoreTokens()) {
+ const char* token = tokens.nextToken();
+ if (str_i_equals(token, "%%PAGE:")) {
+ int found = 0;
+ FourDoubleList list;
+ double unitsPerCm = 0.0, width = 0.0, height = 0.0, baseline = 0.0, adjustY = 0.0;
+ while (found < 3 && tokens.hasMoreTokens()) {
+ token = tokens.nextToken();
+ if (str_i_equals(token, "v")) {
+ double d2 = list.get(1);
+ double d3 = list.get(2);
+ double d4 = list.get(3);
+ switch (found) {
+ case 0: /* Units/cm and baseline */
+ unitsPerCm = d3;
+ adjustY = d2;
+ break;
+ case 1: /* Width */
+ width = d3;
+ break;
+ case 2: /* Height and baseline */
+ height = d4;
+ baseline = d2-adjustY;
+ break;
+
+ }
+ // cout << "v = " << d1 << " " << d2 << " " << d3 << " " << d4 << endl;
+ found++;
+ } else {
+ char* pos;
+ double value = strtod(token, &pos);
+ list.add(value);
+ }
+ }
+ if (found == 3 && unitsPerCm != 0.0) {
+ width /= unitsPerCm; height /= unitsPerCm; baseline /= unitsPerCm;
+ if (objindex == -1) {
+ /* Reference object is 1cm x 1cm square, no baseline */
+ adjWidth = width-1.0;
+ adjHeight = height-1.0;
+ adjBaseline = baseline;
+ } else {
+ width -= adjWidth; height -= adjHeight; baseline -= adjBaseline;
+ TeXHashObject* hobj = getHashObject(objindex);
+ if (hobj != NULL) {
+ // cout << width << "x" << height << " + " << baseline << " " << hobj->getLine() << endl;
+ hobj->setDimension(width, height, baseline);
+ }
+ }
+ // cout << "width = " << width << " height = " << height << endl;
+ }
+ objindex++;
+ }
+ }
+
+ tokens.close();
+}
+
+TeXSize::TeXSize(const char* name) {
+ m_Name = name;
+}
+
+void TeXSize::createObject(string* name) {
+ *name = "{\\";
+ *name += getName();
+ *name += " H}";
+}
+
+TeXObject::TeXObject() {
+ m_Xp = 0.0;
+ m_Yp = 0.0;
+ m_DXp = 0.0;
+ m_DYp = 0.0;
+ m_Angle = 0.0;
+ m_Object = NULL;
+}
+
+void TeXObject::output(ostream& os) {
+ if (!hasObject()) {
+ return;
+ }
+ int closeb = 1;
+ double angle = m_Angle;
+ double pic_x = m_DXp;
+ double pic_y = m_DYp;
+ os << "\\put(" << pic_x << "," << pic_y << "){";
+ if (angle != 0.0) {
+ os << "\\rotatebox{" << angle << "}{";
+ closeb++;
+ }
+ os << "\\makebox(0,0)[lb]{";
+ if (!isBlack()) {
+ GLERC<GLEColor> color(getColor());
+ os << "\\color[rgb]{" << color->getRed() << "," << color->getGreen() << "," << color->getBlue() << "}";
+ }
+ getObject()->outputLines(os);
+ for (int i = 0; i < closeb; i++) {
+ os << "}";
+ }
+ os << "}" << endl;
+}
+
+void TeXObject::getDimensions(double* x1, double *y1, double *x2, double *y2) {
+ *x1 = m_Xp;
+ *y1 = m_Yp;
+ *x2 = m_Xp + getWidth();
+ *y2 = m_Yp + getHeight();
+}
+
+int TeXObject::isBlack() {
+ GLEColor* color = getColor();
+ return color == 0 || color->getHexValueGLE() == GLE_COLOR_BLACK;
+}
+
+TeXHashObject::TeXHashObject(const string& line) : m_Line(line) {
+ m_Width = 10.0;
+ m_Height = 10.0;
+ m_Baseline = 0.0;
+ m_HasDimensions = 0;
+ m_Used = 0;
+ m_NbLines = 0;
+}
+
+void TeXHashObject::outputLines(ostream& os) {
+ if (getNbLines() <= 1) {
+ os << getLine();
+ } else {
+ char_separator sep("\7");
+ tokenizer<char_separator> tok(getLine(), sep);
+ os << "%" << endl;
+ int cnt = 0;
+ while (tok.has_more()) {
+ if (cnt != 0) os << endl;
+ os << tok.next_token();
+ cnt++;
+ }
+ }
+}
+
+void TeXHashObject::addFirstLine(string* str) {
+ if (getNbLines() <= 1) {
+ (*str) += getLine();
+ } else {
+ char_separator sep("\7");
+ tokenizer<char_separator> tok(getLine(), sep);
+ if (tok.has_more()) (*str) += tok.next_token();
+ }
+}
+
+void TeXHashObject::outputMeasure(ostream& os) {
+ os << "\\newpage" << endl;
+ os << "\\noindent{}\\rule{1cm}{0.025cm}\\framebox{";
+ outputLines(os);
+ os << "}" << endl << endl;
+}
+
+void TeXHashObject::outputLog(ostream& os) {
+ if (getNbLines() <= 1) {
+ os << "tex " << getLine() << endl;
+ } else {
+ char_separator sep("\7");
+ tokenizer<char_separator> tok(getLine(), sep);
+ os << "multitex " << getNbLines() << endl;
+ while (tok.has_more()) {
+ os << tok.next_token() << endl;
+ }
+ }
+}
+
+void TeXHashObject::setDimension(double width, double height, double baseline) {
+ m_Width = width;
+ m_Height = height;
+ m_Baseline = baseline;
+ m_HasDimensions = 1;
+}
+
+TeXObjectInfo::TeXObjectInfo() {
+ m_Status = 0;
+}
+
+void TeXObjectInfo::setJustify(int just) {
+ m_Just = just;
+ m_Status |= TEX_OBJ_INF_HAS_JUSTIFY;
+}
+
+void TeXObjectInfo::setColor(const GLERC<GLEColor>& color) {
+ m_Color = color;
+ m_Status |= TEX_OBJ_INF_HAS_COLOR;
+}
+
+void TeXObjectInfo::setPosition(double xp, double yp) {
+ m_Xp = xp; m_Yp = yp;
+ m_Status |= TEX_OBJ_INF_HAS_POSITION;
+}
+
+void TeXObjectInfo::initializeAll() {
+ if ((m_Status & TEX_OBJ_INF_HAS_POSITION) == 0) {
+ g_get_xy(&m_Xp, &m_Yp);
+ }
+ if ((m_Status & TEX_OBJ_INF_HAS_JUSTIFY) == 0) {
+ g_get_just(&m_Just);
+ }
+ if ((m_Status & TEX_OBJ_INF_HAS_COLOR) == 0) {
+ m_Color = g_get_color();
+ }
+}
+
+bool read_eps_and_adjust_bounding_box(const string& name, GLEScript* script) {
+ int b1 = 0, b2 = 0, b3 = 0, b4 = 0;
+ string fileName(name + ".eps");
+ vector<string> lines;
+ if (!GLEReadFile(fileName, &lines)) {
+ return false;
+ }
+ unsigned int pos = 0;
+ ostringstream out;
+ while (pos < lines.size()) {
+ string line(lines[pos++]);
+ if (g_parse_ps_boundingbox(line, &b1, &b2, &b3, &b4))
+ {
+ time_t t;
+ t = time(0);
+ GLEPoint bb(script->getBoundingBox());
+ // Make sure to use proper Adobe DSC comments
+ // Windows Explorer can show these in the document properties of a PDF created by GLE
+ string vers_nosnap = g_get_version_nosnapshot();
+ out << "%%Creator: GLE " << vers_nosnap << " <www.gle-graphics.org>" << endl;
+ out << "%%CreationDate: " << ctime(&t);
+ out << "%%Title: " << script->getLocation()->getName() << endl;
+ int b3New = (int)ceil(b1 + bb.getX() + 1e-6);
+ int b4New = (int)ceil(b2 + bb.getY() + 1e-6);
+ out << "%%BoundingBox: " << b1 << " " << b2 << " " << b3New << " " << b4New << endl;
+ script->setBoundingBoxOrigin(b1, b2);
+ script->setBoundingBox(b3New - b1 + 1, b4New - b2 + 1);
+ }
+ else if (str_starts_with_trim(line, "%%HiResBoundingBox") != -1 ||
+ str_starts_with_trim(line, "%%Creator") != -1 ||
+ str_starts_with_trim(line, "%%CreationDate") != -1 ||
+ str_starts_with_trim(line, "%%Title") != -1)
+ {
+ // Forget about these
+ }
+ else if (str_starts_with_trim(line, "%%EndComments") != -1)
+ {
+ out << line << endl;
+ break;
+ }
+ else
+ {
+ out << line << endl;
+ }
+ }
+ while (pos < lines.size()) {
+ string line(lines[pos++]);
+ out << line << endl;
+ }
+ string* buffer = script->getRecordedBytesBuffer(GLE_DEVICE_EPS);
+ *buffer = out.str();
+ return true;
+}
+
+bool create_bitmap_file_ghostscript(GLEFileLocation* fname, int device, int dpi, int options, GLEScript* script) {
+ ostringstream gsargs;
+ gsargs << "-q -DNOPLATFONTS -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -dBATCH -dNOPAUSE -r";
+ gsargs << dpi;
+ string* bytesPDF = script->getRecordedBytesBuffer(GLE_DEVICE_PDF);
+ if (bytesPDF->empty()) {
+ GLEPoint bb(script->getBoundingBox());
+ int img_wd = GLEBBoxToPixels(dpi, bb.getX());
+ int img_hi = GLEBBoxToPixels(dpi, bb.getY());
+ gsargs << " -g" << img_wd << "x" << img_hi;
+ }
+ string gs_opts = g_CmdLine.getOptionString(GLE_OPT_GSOPTIONS);
+ if (gs_opts != "") {
+ str_replace_all(gs_opts, "\\", "");
+ gsargs << " " << gs_opts;
+ }
+ bool bw = (options & GLE_OUTPUT_OPTION_GRAYSCALE) != 0;
+ bool transp = (options & GLE_OUTPUT_OPTION_TRANSPARENT) != 0;
+ gsargs << " -sDEVICE=";
+ switch (device) {
+ case GLE_DEVICE_PNG:
+ if (bw) {
+ gsargs << "pnggray";
+ } else {
+ gsargs << (transp ? "pngalpha" : "png16m");
+ }
+ break;
+ case GLE_DEVICE_JPEG:
+ gsargs << (bw ? "jpeggray" : "jpeg");
+ break;
+ }
+ string outputfile;
+ if (fname->isStdout()) {
+ gsargs << " -sOutputFile=-";
+ } else {
+ outputfile = fname->getFullPath();
+ switch (device) {
+ case GLE_DEVICE_PNG: outputfile += ".png"; break;
+ case GLE_DEVICE_JPEG: outputfile += ".jpg"; break;
+ }
+ gsargs << " -sOutputFile=\"" << outputfile << "\"";
+ }
+ gsargs << " -";
+ string* bytesEPS = script->getRecordedBytesBuffer(GLE_DEVICE_EPS);
+ if (!bytesPDF->empty()) {
+ stringstream pdfCode;
+ pdfCode.write(bytesPDF->data(), bytesPDF->size());
+ return run_ghostscript(gsargs.str(), outputfile, !fname->isStdout(), &pdfCode);
+ } else {
+ stringstream postscript;
+ GLEPoint origin(script->getBoundingBoxOrigin());
+ postscript << (-origin.getX()) << " " << (-origin.getY()) << " translate" << endl;
+ postscript.write(bytesEPS->data(), bytesEPS->size());
+ return run_ghostscript(gsargs.str(), outputfile, !fname->isStdout(), &postscript);
+ }
+}
+
+bool create_bitmap_file(GLEFileLocation* fname, int device, int dpi, int options, GLEScript* script) {
+#ifdef HAVE_POPPLER
+ bool supportsBitmapType = g_bitmap_supports_type(g_device_to_bitmap_type(device));
+ string* bytesPDF = script->getRecordedBytesBuffer(GLE_DEVICE_PDF);
+ if (supportsBitmapType && !bytesPDF->empty()) {
+ std::string myFName = fname->getFullPath();
+ myFName += g_device_to_ext(device);
+ if (g_verbosity() >= 5) {
+ g_message(std::string("[Poppler PDF conversion: ") + myFName + "]");
+ }
+ gle_convert_pdf_to_image_file((char*)bytesPDF->c_str(), (int)bytesPDF->size(), dpi, device, options, myFName.c_str());
+ return true;
+ }
+#endif // HAVE_POPPLER
+ return create_bitmap_file_ghostscript(fname, device, dpi, options, script);
+}
+
+bool create_pdf_file_ghostscript(GLEFileLocation* fname, int dpi, GLEScript* script) {
+ ostringstream gsargs;
+ gsargs << "-q";
+ int compr_mode = g_get_pdf_image_format();
+ switch (compr_mode) {
+ case PDF_IMG_COMPR_AUTO:
+ gsargs << " -dAutoFilterColorImages=true";
+ gsargs << " -dAutoFilterGrayImages=true";
+ gsargs << " -dEncodeColorImages=true";
+ gsargs << " -dEncodeGrayImages=true";
+ gsargs << " -dEncodeMonoImages=false"; break;
+ case PDF_IMG_COMPR_ZIP:
+ gsargs << " -dAutoFilterColorImages=false";
+ gsargs << " -dAutoFilterGrayImages=false";
+ gsargs << " -dEncodeColorImages=true";
+ gsargs << " -dEncodeGrayImages=true";
+ gsargs << " -dEncodeMonoImages=true";
+ gsargs << " -dColorImageFilter=/FlateEncode";
+ gsargs << " -dGrayImageFilter=/FlateEncode";
+ gsargs << " -dMonoImageFilter=/FlateEncode"; break;
+ case PDF_IMG_COMPR_JPEG:
+ gsargs << " -dAutoFilterColorImages=false";
+ gsargs << " -dAutoFilterGrayImages=false";
+ gsargs << " -dEncodeColorImages=true";
+ gsargs << " -dEncodeGrayImages=true";
+ gsargs << " -dEncodeMonoImages=true";
+ gsargs << " -dColorImageFilter=/DCTEncode";
+ gsargs << " -dGrayImageFilter=/DCTEncode";
+ gsargs << " -dMonoImageFilter=/FlateEncode"; break;
+ case PDF_IMG_COMPR_PS:
+ gsargs << " -dAutoFilterColorImages=false";
+ gsargs << " -dAutoFilterGrayImages=false";
+ gsargs << " -dEncodeColorImages=false";
+ gsargs << " -dEncodeGrayImages=false";
+ gsargs << " -dEncodeMonoImages=false"; break;
+ }
+ gsargs << " -dBATCH -dNOPAUSE -r" << dpi;
+ GLEPoint bb(script->getBoundingBox());
+ GLEPoint origin(script->getBoundingBoxOrigin());
+ int img_wd = GLEBBoxToPixels(dpi, bb.getX());
+ int img_hi = GLEBBoxToPixels(dpi, bb.getY());
+ gsargs << " -g" << img_wd << "x" << img_hi;
+ gsargs << " -sDEVICE=pdfwrite";
+ gsargs << " -dPDFSETTINGS=/prepress -dMaxSubsetPct=100 -dSubsetFonts=true";
+ gsargs << " -dEmbedAllFonts=true -dAutoRotatePages=/None";
+ string outputfile;
+ if (fname->isStdout()) {
+ gsargs << " -sOutputFile=-";
+ } else {
+ outputfile = fname->getFullPath() + ".pdf";
+ gsargs << " -sOutputFile=\"" << outputfile << "\"";
+ }
+ gsargs << " -";
+ stringstream postscript;
+ string* bytes = script->getRecordedBytesBuffer(GLE_DEVICE_EPS);
+ postscript << (-origin.getX()) << " " << (-origin.getY()) << " translate" << endl;
+ postscript.write(bytes->data(), bytes->size());
+ return run_ghostscript(gsargs.str(), outputfile, !fname->isStdout(), &postscript);
+}
+
+void report_latex_errors_parse_error(istream& strm, string* result) {
+ string line;
+ stringstream err;
+ int state = 0;
+ while (state != 2 && !strm.eof()) {
+ getline(strm, line);
+ str_trim_right(line);
+ if (state == 1 && line == "") {
+ state = 2;
+ } else if (state == 0 && line.length() > 2 && line[0] == 'l' && line[1] == '.') {
+ state = 1;
+ err << line << endl;
+ } else if (line != "") {
+ err << line << endl;
+ }
+ }
+ *result = err.str();
+}
+
+bool report_latex_errors(istream& strm, const string& cmdline) {
+ bool has_error = false;
+ bool has_cmdline = false;
+ if (g_verbosity() >= 5) {
+ has_cmdline = true;
+ }
+ string line, next, prev;
+ while (!strm.eof()) {
+ getline(strm, line);
+ if (line.length() > 1 && line[0] == '!') {
+ if (!has_cmdline) {
+ ostringstream msg;
+ msg << "Error running: " << cmdline;
+ g_message(msg.str());
+ has_cmdline = true;
+ }
+ stringstream err;
+ err << ">> LaTeX error:" << endl;
+ err << line << endl;
+ report_latex_errors_parse_error(strm, &next);
+ if (!(str_i_equals(line, "! Emergency stop.") && str_i_equals(next, prev))) {
+ err << next;
+ g_message(err.str());
+ inc_nb_errors();
+ }
+ prev = next;
+ has_error = true;
+ }
+ }
+ return has_error;
+}
+
+bool post_run_latex(bool result_ok, stringstream& output, const string& cmdline) {
+ if (g_verbosity() >= 10) {
+ g_message(output.str());
+ return result_ok;
+ } else {
+ if (result_ok) {
+ return !report_latex_errors(output, cmdline);
+ } else {
+ bool has_err = report_latex_errors(output, cmdline);
+ if (!has_err) {
+ ostringstream msg;
+ msg << "Error running: " << cmdline << endl;
+ msg << output.str();
+ g_message(msg.str());
+ }
+ return false;
+ }
+ }
+}
+
+bool create_pdf_file_pdflatex(const string& fname, GLEScript* script) {
+ string file, dir;
+ SplitFileName(fname, dir, file);
+ ConfigSection* tools = g_Config.getSection(GLE_CONFIG_TOOLS);
+ string cmdline(get_tool_path(GLE_TOOL_PDFTEX_CMD, tools));
+ str_try_add_quote(cmdline);
+ const string pdftex_opts(tools->getOptionString(GLE_TOOL_PDFTEX_OPTIONS));
+ if (!pdftex_opts.empty()) {
+ cmdline += " ";
+ cmdline += pdftex_opts;
+ }
+ cmdline += string(" \"") + file + ".tex\"";
+ string outfile = file + ".pdf";
+ if (g_verbosity() >= 5) {
+ ostringstream msg;
+ msg << "[Running: " << cmdline << "]";
+ g_message(msg.str());
+ }
+ stringstream output;
+ TryDeleteFile(outfile);
+ int result = GLESystem(cmdline, true, true, NULL, &output);
+ bool result_ok = (result == GLE_SYSTEM_OK) && GLEFileExists(outfile);
+ post_run_latex(result_ok, output, cmdline);
+ DeleteFileWithExt(fname, ".aux");
+ DeleteFileWithExt(fname, ".log");
+ if (result_ok) {
+ std::vector<char> pdfData;
+ if (GLEReadFileBinary(outfile, &pdfData) && !pdfData.empty()) {
+ string* buffer = script->getRecordedBytesBuffer(GLE_DEVICE_PDF);
+ *buffer = std::string(&pdfData[0], pdfData.size());
+ }
+ }
+ return result_ok;
+}
+
+bool run_latex(const string& dir, const string& file) {
+ string crdir;
+ if (dir != "") {
+ GLEGetCrDir(&crdir);
+ if (!GLEChDir(dir)) {
+ gprint("Can't find directory: {%s}", dir.c_str());
+ return false;
+ }
+ }
+ ConfigSection* tools = g_Config.getSection(GLE_CONFIG_TOOLS);
+ string cmdline(get_tool_path(GLE_TOOL_LATEX_CMD, tools));
+ str_try_add_quote(cmdline);
+ const string latex_opts(tools->getOptionString(GLE_TOOL_LATEX_OPTIONS));
+ if (!latex_opts.empty()) {
+ cmdline += " ";
+ cmdline += latex_opts;
+ }
+ cmdline += string(" \"") + file + ".tex\"";
+ string outfile = file + ".dvi";
+ if (g_verbosity() >= 5) {
+ ostringstream msg;
+ msg << "[Running: " << cmdline << "]";
+ g_message(msg.str());
+ }
+ stringstream output;
+ TryDeleteFile(outfile);
+ int result = GLESystem(cmdline, true, true, NULL, &output);
+ bool result_ok = (result == GLE_SYSTEM_OK) && GLEFileExists(outfile);
+ result_ok = post_run_latex(result_ok, output, cmdline);
+ if (crdir.length() != 0) GLEChDir(crdir);
+ return result_ok;
+}
+
+bool create_eps_file_latex_dvips(const string& fname, GLEScript* script) {
+ string file, dir;
+ ConfigSection* tex = g_Config.getSection(GLE_CONFIG_TEX);
+ CmdLineArgSet* texsys = (CmdLineArgSet*)tex->getOptionValue(GLE_TEX_SYSTEM);
+ SplitFileName(fname, dir, file);
+ if (!run_latex(dir, file)) return false;
+ if (!run_dvips(fname, true)) return false;
+ bool result = read_eps_and_adjust_bounding_box(fname, script);
+ DeleteFileWithExt(fname, ".aux");
+ if (texsys->hasValue(GLE_TEX_SYSTEM_VTEX)) {
+ DeleteFileWithExt(fname, ".ps");
+ } else {
+ DeleteFileWithExt(fname, ".dvi");
+ }
+ DeleteFileWithExt(fname, ".log");
+ return result;
+}
+
+bool create_ps_file_latex_dvips(const string& fname) {
+ string file, dir;
+ ConfigSection* tex = g_Config.getSection(GLE_CONFIG_TEX);
+ CmdLineArgSet* texsys = (CmdLineArgSet*)tex->getOptionValue(GLE_TEX_SYSTEM);
+ SplitFileName(fname, dir, file);
+ if (!run_latex(dir, file)) return false;
+ if (!run_dvips(fname, false)) return false;
+ DeleteFileWithExt(fname, ".aux");
+ if (!texsys->hasValue(GLE_TEX_SYSTEM_VTEX)) {
+ DeleteFileWithExt(fname, ".dvi");
+ }
+ DeleteFileWithExt(fname, ".log");
+ return true;
+}
+
+void post_run_process(bool result_ok, const char* procname, const string& cmdline, const string& output) {
+ if (!result_ok || g_verbosity() >= 5) {
+ ostringstream msg;
+ if (!result_ok) {
+ if (procname != NULL) {
+ msg << "Error running " << procname << ":" << endl;
+ if (g_verbosity() < 5) {
+ // If verbosity higher, then we already printed this
+ msg << "Running: " << cmdline << endl;
+ }
+ } else {
+ msg << "Error running: " << cmdline << endl;
+ }
+ }
+ msg << output;
+ g_message(msg.str());
+ }
+}
+
+bool run_ghostscript(const string& args, const string& outfile, bool redirout, istream* is) {
+ ConfigSection* tools = g_Config.getSection(GLE_CONFIG_TOOLS);
+ string cmdline(get_tool_path(GLE_TOOL_GHOSTSCRIPT_CMD, tools));
+ str_try_add_quote(cmdline);
+ const string gs_opts(tools->getOptionString(GLE_TOOL_GHOSTSCRIPT_OPTIONS));
+ if (!gs_opts.empty()) {
+ cmdline += " ";
+ cmdline += gs_opts;
+ }
+ cmdline += " ";
+ cmdline += args;
+ if (g_verbosity() >= 5) {
+ ostringstream msg;
+ msg << "[Running: " << cmdline << "]";
+ g_message(msg.str());
+ }
+ ostringstream output;
+ bool outfile_ok = true;
+ int result = GLE_SYSTEM_OK;
+ if (outfile != "" && IsAbsPath(outfile)) {
+ // Checking if the output file is present is the best way to double check that Ghostscript worked
+ TryDeleteFile(outfile);
+ result = GLESystem(cmdline, true, redirout, is, &output);
+ if (!GLEFileExists(outfile)) {
+ outfile_ok = false;
+ }
+ } else {
+ result = GLESystem(cmdline, true, redirout, is, &output);
+ }
+ string output_s = output.str();
+ bool result_ok = (outfile_ok && result == GLE_SYSTEM_OK && str_i_str(output_s, "error:") == -1);
+ post_run_process(result_ok, "Ghostscript", cmdline, output_s);
+ return (result == GLE_SYSTEM_OK) && outfile_ok;
+}
+
+bool run_dvips(const string& file, bool eps) {
+ ConfigSection* tex = g_Config.getSection(GLE_CONFIG_TEX);
+ CmdLineArgSet* texsys = (CmdLineArgSet*)tex->getOptionValue(GLE_TEX_SYSTEM);
+ if (texsys->hasValue(GLE_TEX_SYSTEM_VTEX)) {
+ // VTeX creates directly PS or PDF, no DVI!
+ // use ghostscript to convert PS to EPS
+ if (eps) {
+ string gsargs;
+ string outputfile(file + ".eps");
+ gsargs += "-dNOPAUSE -sDEVICE=epswrite -sOutputFile=";
+ gsargs += outputfile;
+ gsargs += " -q -sBATCH \"";
+ gsargs += file;
+ gsargs += ".ps\"";
+ return run_ghostscript(gsargs, outputfile);
+ } else {
+ return true;
+ }
+ } else {
+ // get dvips command
+ ConfigSection* tools = g_Config.getSection(GLE_CONFIG_TOOLS);
+ string dvips_cmd(get_tool_path(GLE_TOOL_DVIPS_CMD, tools));
+ str_try_add_quote(dvips_cmd);
+ // construct dvips arguments
+ ostringstream dvipsargs;
+ dvipsargs << dvips_cmd;
+ const string dvips_opts(tools->getOptionString(GLE_TOOL_DVIPS_OPTIONS));
+ if (!dvips_opts.empty()) dvipsargs << " " << dvips_opts;
+ if (eps) dvipsargs << " -E";
+ const string outfile(file + (eps ? ".eps" : ".ps"));
+ dvipsargs << " -o \"" << outfile << "\" \"" << file << ".dvi\"";
+ string cmdline = dvipsargs.str();
+ if (g_verbosity() >= 5) {
+ ostringstream msg;
+ msg << "[Running: " << cmdline << "]";
+ g_message(msg.str());
+ }
+ ostringstream output;
+ TryDeleteFile(outfile);
+ int result = GLESystem(cmdline, true, true, NULL, &output);
+ bool result_ok = (result == GLE_SYSTEM_OK) && GLEFileExists(outfile);
+ post_run_process(result_ok, NULL, cmdline, output.str());
+ return result_ok;
+ }
+}
+
+void begin_tex_preamble(int *pln, int *pcode, int *cp) {
+ TeXInterface* iface = TeXInterface::getInstance();
+ iface->resetPreamble();
+ // Start with pcode from the next line
+ (*pln)++;
+ begin_init();
+ TeXPreambleKey pre_key;
+ pre_key.setDocumentClass(iface->getDocumentClass());
+ while (true) {
+ int st = begin_token(&pcode,cp,pln,srclin,tk,&ntk,outbuff);
+ if (!st) {
+ /* exit loop */
+ break;
+ }
+ string mline = srclin;
+ str_trim_both(mline);
+ if (str_i_str(mline.c_str(), "\\documentclass") != NULL) {
+ pre_key.setDocumentClass(mline);
+ } else {
+ pre_key.addPreamble(mline);
+ }
+ }
+ TeXPreambleInfo* info = iface->getPreambles()->findOrAddPreamble(&pre_key);
+ iface->getPreambles()->select(info);
+}
+
+void begin_tex(GLERun* run, int *pln, int *pcode, int *cp) {
+ // Get optional params
+ GLERC<GLEString> name;
+ double add = 0.0;
+ int ptr = *(pcode + (*cp)); /* add */
+ if (ptr) {
+ int zzcp = 0;
+ add = evalDouble(run->getStack(), run->getPcodeList(), pcode + (*cp) + ptr, &zzcp);
+ }
+ (*cp) = (*cp) + 1;
+ ptr = *(pcode + (*cp)); /* name */
+ if (ptr) {
+ int zzcp = 0;
+ name = evalString(run->getStack(), run->getPcodeList(), pcode + (*cp) + ptr, &zzcp, true);
+ }
+ // Start with pcode from the next line
+ (*pln)++;
+ begin_init();
+ string text_block;
+ int nblines = 0;
+ while (true) {
+ int st = begin_token(&pcode,cp,pln,srclin,tk,&ntk,outbuff);
+ if (!st) {
+ /* exit loop */
+ break;
+ }
+ string mline = srclin;
+ str_trim_left(mline);
+ if (text_block.length() == 0) {
+ text_block = mline;
+ } else {
+ text_block += "\7";
+ text_block += mline;
+ }
+ nblines++;
+ }
+ GLERectangle box;
+ decode_utf8_basic(text_block);
+ TeXInterface::getInstance()->draw(text_block.c_str(), nblines, &box);
+ // Name object
+ if (!name.isNull() && name->length() != 0) {
+ double x1, x2, y1, y2;
+ box.getDimensions(&x1,&y1,&x2,&y2);
+ x1 -= add; x2 += add; y1 -= add; y2 += add;
+ run->name_set(name.get(),x1,y1,x2,y2);
+ }
+}
diff --git a/src/gle/texinterface.h b/src/gle/texinterface.h
new file mode 100644
index 0000000..bc46c2c
--- /dev/null
+++ b/src/gle/texinterface.h
@@ -0,0 +1,287 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+/*
+ * (c) 2004 Jan Struyf
+ *
+ */
+
+#ifndef INCLUDE_TEXINTERFACE
+#define INCLUDE_TEXINTERFACE
+
+#define FONT_HEI_FACTOR 1.46199
+
+#define TEX_SCALE_MODE_NONE 0
+#define TEX_SCALE_MODE_FIXED 1
+#define TEX_SCALE_MODE_SCALE 2
+
+class GLERectangle;
+class TeXInterface;
+
+class TeXHashObject {
+protected:
+ string m_Line;
+ bool m_Used;
+ int m_HasDimensions, m_NbLines;
+ double m_Width, m_Height, m_Baseline;
+public:
+ TeXHashObject(const string& line);
+ void outputMeasure(ostream& os);
+ void outputLog(ostream& os);
+ void outputLines(ostream& os);
+ void addFirstLine(string* str);
+ void setDimension(double width, double height, double baseline);
+ inline const string& getLine() { return m_Line; }
+ inline int hasDimensions() { return m_HasDimensions; }
+ inline bool isUsed() { return m_Used; }
+ inline void setUsed(bool used) { m_Used = used; }
+ inline double getWidth() { return m_Width; }
+ inline double getHeight() { return m_Height; }
+ inline double getBaseline() { return m_Baseline; }
+ inline int getNbLines() { return m_NbLines; }
+ inline void setNbLines(int nb) { m_NbLines = nb; }
+};
+
+#define TEX_OBJ_INF_HAS_COLOR 1
+#define TEX_OBJ_INF_HAS_JUSTIFY 2
+#define TEX_OBJ_INF_HAS_POSITION 4
+#define TEX_OBJ_INF_DONT_PRINT 8
+
+class TeXObjectInfo {
+protected:
+ int m_Status;
+ GLERC<GLEColor> m_Color;
+ int m_Just;
+ double m_Xp, m_Yp;
+public:
+ TeXObjectInfo();
+ void setJustify(int just);
+ void setPosition(double xp, double yp);
+ void setColor(const GLERC<GLEColor>& color);
+ void initializeAll();
+ inline void setFlag(int flag) { m_Status |= flag; }
+ inline int getFlags() { return m_Status; }
+ inline int getJustify() { return m_Just; }
+ inline double getXp() { return m_Xp; }
+ inline double getYp() { return m_Yp; }
+ inline GLEColor* getColor() { return m_Color.get(); }
+};
+
+class TeXObject {
+protected:
+ double m_Xp, m_Yp, m_DXp, m_DYp, m_Angle;
+ TeXHashObject* m_Object;
+ GLERC<GLEColor> m_Color;
+public:
+ TeXObject();
+ void output(ostream& os);
+ int isBlack();
+ void getDimensions(double* x1, double *y1, double *x2, double *y2);
+ inline void setAngle(double angle) { m_Angle = angle; }
+ inline double getAngle() { return m_Angle; }
+ inline void setXY(double x, double y) { m_Xp = x; m_Yp = y; }
+ inline void setDeviceXY(double x, double y) { m_DXp = x; m_DYp = y; }
+ inline void setObject(TeXHashObject* obj) { m_Object = obj; }
+ inline TeXHashObject* getObject() { return m_Object; }
+ inline double getWidth() { return m_Object->getWidth(); }
+ inline double getHeight() { return m_Object->getHeight(); }
+ inline double getDXp() { return m_DXp; }
+ inline double getDYp() { return m_DYp; }
+ inline const string& getLine() { return m_Object->getLine(); }
+ inline int hasObject() { return m_Object != NULL; }
+ inline void setColor(const GLERC<GLEColor>& color) { m_Color = color; }
+ inline GLEColor* getColor() { return m_Color.get(); }
+};
+
+class TeXSize {
+protected:
+ string m_Name;
+public:
+ TeXSize(const char* name);
+ void createObject(string* name);
+ inline const string& getName() { return m_Name; }
+};
+
+class TeXPreambleKey {
+protected:
+ string m_DocumentClass;
+ vector<string> m_Preamble;
+public:
+ bool equals(const TeXPreambleKey* key) const;
+ void copyFrom(const TeXPreambleKey* other);
+ inline void clear() { m_Preamble.clear(); }
+ inline void setDocumentClass(const string& line) { m_DocumentClass = line; }
+ inline const string& getDocumentClass() const { return m_DocumentClass; }
+ inline int getNbPreamble() const { return m_Preamble.size(); }
+ inline const string& getPreamble(int i) const { return m_Preamble[i]; }
+ inline void addPreamble(const string& str) { m_Preamble.push_back(str); }
+};
+
+class TeXPreambleInfo : public TeXPreambleKey {
+ bool m_HasFontSizes;
+ vector<double> m_FontSizes;
+public:
+ TeXPreambleInfo();
+ void setFontSize(int font, double size);
+ double getFontSize(int font);
+ void save(ostream& os);
+ void load(istream& is, TeXInterface* iface);
+ int getBestSizeScaled(double hei);
+ int getBestSizeFixed(double hei);
+ inline int getNbFonts() { return m_FontSizes.size(); }
+ inline bool hasFontSizes() { return m_HasFontSizes; }
+ inline void setHasFontSizes(bool hasf) { m_HasFontSizes = hasf; }
+};
+
+class TeXPreambleInfoList {
+protected:
+ TeXPreambleInfo* m_Current;
+ vector<TeXPreambleInfo*> m_Infos;
+public:
+ TeXPreambleInfoList();
+ ~TeXPreambleInfoList();
+ void save(const string& filestem);
+ void load(const string& filestem, TeXInterface* iface);
+ TeXPreambleInfo* findOrAddPreamble(const TeXPreambleKey* pre_key);
+ inline int getNbPreambles() { return m_Infos.size(); }
+ inline TeXPreambleInfo* getPreamble(int i) { return m_Infos[i]; }
+ inline void addPreamble(TeXPreambleInfo* preamble) { m_Infos.push_back(preamble); }
+ inline TeXPreambleInfo* getCurrent() { return m_Current; }
+ inline void selectDefault() { m_Current = m_Infos[0]; }
+ inline void select(TeXPreambleInfo* value) { m_Current = value; }
+};
+
+class TeXHash : public vector<TeXHashObject*> {
+public:
+ TeXHash();
+ ~TeXHash();
+ void cleanUp();
+ void loadTeXPS(const string& filestem);
+ void saveTeXPS(const string& filestem, TeXInterface* iface);
+ TeXHashObject* getHashObject(int idx);
+ TeXHashObject* getHashObjectOrNULL(const string& line);
+ inline TeXHashObject* get(int i) { return (*this)[i]; }
+};
+
+#define TEX_INTERFACE_HASH_LOADED_NONE 0
+#define TEX_INTERFACE_HASH_LOADED_PARTIAL 1
+#define TEX_INTERFACE_HASH_LOADED_FULL 2
+
+class TeXInterface {
+protected:
+ static TeXInterface m_Instance;
+ vector<TeXObject*> m_TeXObjects;
+ TeXHash m_TeXHash;
+ vector<TeXSize*> m_FontSizes;
+ TeXPreambleInfoList m_Preambles;
+ string m_HashName;
+ string m_DotDir;
+ GLEFileLocation m_MainOutputName;
+ int m_ScaleMode;
+ int m_HashLoaded, m_HashModified;
+ bool m_HasFontSizes;
+ bool m_Enabled;
+public:
+ TeXInterface();
+ ~TeXInterface();
+ TeXObject* draw(const char* str) throw(ParserError);
+ TeXObject* drawUTF8(const char* str, GLERectangle* box = NULL) throw(ParserError);
+ TeXObject* draw(const std::string& str, GLERectangle* box) throw(ParserError);
+ TeXObject* draw(const char* str, int nblines, GLERectangle* box = NULL) throw(ParserError);
+ TeXObject* draw(const char* str, TeXObjectInfo& info, int nblines, GLERectangle* box = NULL) throw(ParserError);
+ TeXObject* drawObj(TeXHashObject* hobj, TeXObjectInfo& info, GLERectangle* box = NULL) throw(ParserError);
+ void scaleObject(string& obj_str, double hei);
+ void checkObjectDimensions();
+ int createObj(const char* str, double hei);
+ void initialize(GLEFileLocation* dotfile, GLEFileLocation* oname);
+ void updateNames(GLEFileLocation* dotfile, GLEFileLocation* oname);
+ void updateOutName(GLEFileLocation* oname);
+ void reset();
+ int tryCreateHash();
+ void removeDotFiles();
+ void createInc(const string& prefix);
+ void createTeX(bool usegeom);
+ int getHashObjectIndex(const string& line);
+ TeXHashObject* getHashObject(const string& line);
+ TeXHashObject* getHashObject(int idx);
+ void resetPreamble();
+ void createPreamble(ostream& tex_file);
+ inline void setHasFontSizes(bool has) { m_HasFontSizes = has; }
+ inline bool hasFontSizes() { return m_HasFontSizes; }
+ inline bool hasObjects() { return m_TeXObjects.size() != 0; }
+ inline int getNbPreamble() { return m_Preambles.getCurrent()->getNbPreamble(); }
+ inline const string& getPreamble(int i) { return m_Preambles.getCurrent()->getPreamble(i); }
+ inline const string& getDocumentClass() { return m_Preambles.getCurrent()->getDocumentClass(); }
+ inline TeXPreambleInfoList* getPreambles() { return &m_Preambles; }
+ inline void addSize(TeXSize* size) { m_FontSizes.push_back(size); }
+ inline int getNbFontSizes() { return m_FontSizes.size(); }
+ inline TeXSize* getFontSize(int i) { return m_FontSizes[i]; }
+ inline TeXPreambleInfo* getCurrentPreamble() { return m_Preambles.getCurrent(); }
+ inline int getScaleMode() { return m_ScaleMode; }
+ inline void setScaleMode(int mode) { m_ScaleMode = mode; }
+ static inline TeXInterface* getInstance() { return &m_Instance; }
+ inline bool isEnabled() { return m_Enabled; }
+ inline void setEnabled(bool ena) { m_Enabled = ena; }
+protected:
+ void writeInc(ostream& out, const char* prefix);
+ void tryLoadHash();
+ void loadTeXLines();
+ void createHiddenDir();
+ void saveTeXLines();
+ bool createTeXPS();
+ bool createTeXPS(const string& filestem);
+ void addHashObject(TeXHashObject* obj);
+ void cleanUpObjects();
+ void cleanUpHash();
+ void initTeXFontScales();
+ void checkTeXFontSizes();
+ void retrieveTeXFontSizes(TeXHash& tex_hash, TeXPreambleInfo* preamble);
+};
+
+bool create_eps_file_latex_dvips(const string& fname, GLEScript* script);
+bool create_ps_file_latex_dvips(const string& fname);
+bool create_pdf_file_pdflatex(const string& fname, GLEScript* script);
+
+bool create_bitmap_file(GLEFileLocation* fname, int device, int dpi, int options, GLEScript* script);
+bool create_pdf_file_ghostscript(GLEFileLocation* fname, int dpi, GLEScript* script);
+
+bool run_ghostscript(const string& args, const string& outfile, bool redirout = true, istream* is = NULL);
+bool run_latex(const string& dir, const string& file);
+bool run_dvips(const string& file, bool eps);
+
+#endif
diff --git a/src/gle/token.cpp b/src/gle/token.cpp
new file mode 100644
index 0000000..b8d6769
--- /dev/null
+++ b/src/gle/token.cpp
@@ -0,0 +1,236 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#include "all.h"
+#include "mem_limits.h"
+#include "token.h"
+#include "cutils.h"
+
+void add_tokf(char* pp1,int n,TOKENS tok, int* ntok, char* outbuff, int tj)
+{
+ char* token_start;
+// for(vi=1;vi<=*ntok;vi++) printf("(add_tokf) tok[%d]=%s\n",vi,tok[vi]);
+ (*ntok)++;
+// tok[*ntok] = outbuff;
+ //
+ // save the starting position
+ //
+ token_start = outbuff;
+// printf("tok=%u outbuf=%u\n",tok,outbuff);
+// for(vi=1;vi<=*ntok-1;vi++) printf("(add_tokf) tok[%d]=%s\n",vi,tok[vi]);
+// printf("outbuff=%s pp1=%s\n",outbuff,pp1);
+ for (tj=0;tj<n;tj++){
+ *(outbuff+tj) = *(pp1+tj);
+ }
+ outbuff = outbuff + (n);
+ *(outbuff++) = '\0';
+// printf("a ntok=%d tok[%d]=%s token_start=%s",*ntok,*ntok,tok[*ntok],token_start);
+ //fflush(stdout);
+ strcpy(tok[*ntok],token_start);
+// printf("(add_tokf) token added tok[%d]=%s\n",*ntok,tok[*ntok]);
+// for(vi=1;vi<=*ntok;vi++) printf("(add_tokf) tok[%d]=%s\n",vi,tok[vi]);
+}
+
+static char term_table1[256];
+static char term_table2[256];
+static char term_table3[256];
+static char *term_table;
+static int table_loaded;
+char *find_non_term();
+char *find_non_space();
+char *find_term();
+int spmode;
+/* typedef char (*(*TOKENS)[500]); */
+
+/*--------------------------------------------------------------------------*/
+
+void token_norm()
+{
+ if (table_loaded==false) token_init();
+ term_table = &term_table1[0];
+ spmode = false;
+}
+void token_space()
+{
+ if (table_loaded==false) token_init();
+ term_table = &term_table2[0];
+ spmode = true;
+}
+void token_equal()
+{
+ if (table_loaded==false) token_init();
+ term_table = &term_table3[0];
+ spmode = false;
+}
+void token_init()
+{
+ int i;
+ term_table = &term_table1[0];
+ table_loaded = true;
+ {const char *termset=" ,-+*)(<>=/!^@";
+ for (i=0;i<=255;i++) {
+ if (strchr(termset,i)!=NULL) {
+ term_table1[i]=true;
+ }
+ }}
+ {const char *termset=" \t!";
+ for (i=0;i<=255;i++) {
+ if (strchr(termset,i)!=NULL) {
+ term_table2[i]=true;
+ }
+ }
+ }
+ {const char *termset=" ,+*)(<>=/!^@";
+ for (i=0;i<=255;i++) {
+ if (strchr(termset,i)!=NULL) {
+ term_table3[i]=true;
+ }
+ }
+ }
+}
+
+void token(char *lin,TOKENS tok,int *ntok,char *outbuff)
+{
+ int jj;
+ int tj = 0;
+ char *cp;
+ char *p2 = NULL;
+ *ntok = 0;
+ if (table_loaded==false) token_init();
+ cp = lin;
+ cp = find_non_space(cp);
+ while (*cp!=0) {
+ if (*cp==' ' || *cp==' '){
+ *cp = ' ';
+ cp = find_non_space(cp);
+ }
+ if (*cp == '!') goto endofline;
+ p2 = find_term(cp);
+ jj = p2-cp+1;
+ if (jj==0) goto endofline;
+ add_tokf(cp,jj,tok,ntok,outbuff,tj);
+ cp = p2 + 1 ;
+ if (*ntok>280) subscript();
+ }
+endofline:;
+ if (*ntok>0)
+ {
+ if (str_i_equals(tok[*ntok],"\n")) (*ntok)--;
+ if (str_i_equals(tok[*ntok]," ")) (*ntok)--;
+ if (*ntok > 0) p2 = tok[*ntok] + strlen(tok[*ntok]) - 1;
+ if (*p2 == 10) *p2 = 0;
+ }
+ // for(int i=1;i<=*ntok;i++) printf("(token)=%d tok[%d]=%s\n",*ntok,i,tok[i]);
+}
+
+/*--------------------------------------------------------------------------*/
+char *find_non_space(char *cp)
+{
+ for ( ; *cp!=0 ; cp++ ) {
+ if (*cp!=' ' && *cp!=' ') break;
+ }
+ return cp;
+}
+/*--------------------------------------------------------------------------*/
+char *find_term(char *cp)
+{
+char *start;
+ start = cp;
+/* if (*cp=='"') {
+ cp++;
+ for (; *cp!=0 ; cp++ ) {
+ if (*cp=='"') break;
+ }
+ return cp;
+ } */
+ for (; *cp!=0 ; cp++ ) {
+ if (*cp == '"') {
+ cp++;
+ for (; *cp!=0 ; cp++ ) {
+ if (*cp=='"') if (*(cp-1)!='\\') break;
+ }
+ }
+ if (term_table[(int)*cp]==static_cast<char>(true)) break;
+ }
+ if (cp>start) return cp-1;
+ if (*cp==' ' || *cp==' ') return cp-1;
+ if (*cp==0) return cp-1;
+ return cp;
+}
+/*--------------------------------------------------------------------------*/
+void subscript(void)
+{
+// gprint("Subscript out of range in tokenizer (use shorter lines)\n");
+ printf("Subscript out of range in tokenizer (use shorter lines)\n");
+}
+
+void token_data(char *lin,TOKENS tk,int *ntok,char *outbuff)
+{
+ char *s;
+
+ s = strtok(lin," ,=\t\n\x0a\x0c\x0d");
+ *ntok = 0;
+
+ for (;s!=NULL;) {
+ if (*s == '"' || *s == '!' || *s == ';') goto endofline;
+ *ntok += 1;
+
+ strcpy(outbuff,s);
+ strcpy(tk[*ntok],outbuff);
+ outbuff = outbuff + strlen(outbuff) + 1;
+ s = strtok(NULL," ,=\t\n\x0a\x0c\x0d");
+
+ }
+/* printf("%d",*ntok);*/
+endofline:;
+
+}
+
+bool get_on_off(TOKENS tk, int* ct) {
+ if (str_i_equals(tk[(*ct)+1],"ON")) {
+ (*ct)++;
+ return true;
+ } else if (str_i_equals(tk[(*ct)+1],"OFF")) {
+ (*ct)++;
+ return false;
+ } else {
+ return true;
+ }
+}
+
+
diff --git a/src/gle/token.h b/src/gle/token.h
new file mode 100644
index 0000000..f5157e1
--- /dev/null
+++ b/src/gle/token.h
@@ -0,0 +1,61 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#ifndef INCLUDE_TOKEN
+#define INCLUDE_TOKEN
+
+//typedef struct op_key (*OPKEY)[];
+//typedef char (*(*TOKENS)[]);
+//typedef char** TOKENS;
+typedef char TOKENS[][TOKEN_WIDTH];
+
+
+char *find_non_space(char *cp);
+char *find_term(char *cp);
+void add_tokf(char* pp1,int n,TOKENS tok, int* ntok, char* outbuff, int tj);
+void subscript(void);
+void token(char *lin,TOKENS tok,int *ntok,char *outbuff);
+void token_data(char *lin,TOKENS tk,int *ntok,char *outbuff);
+void token_equal(void);
+void token_init(void);
+void token_norm(void);
+void token_space(void);
+bool get_on_off(TOKENS tk, int* ct);
+
+#endif
+
diff --git a/src/gle/tokens/BinIO.cpp b/src/gle/tokens/BinIO.cpp
new file mode 100644
index 0000000..8d8d507
--- /dev/null
+++ b/src/gle/tokens/BinIO.cpp
@@ -0,0 +1,269 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#include <string>
+#include <vector>
+#include <iostream>
+#include <fstream>
+#include <stdio.h>
+#include "BinIO.h"
+
+using namespace std;
+
+void write_3byte(ostream* f, int val) {
+ unsigned char ch[3];
+ for (int i = 0; i < 3; i++) {
+ int res = (val % 256);
+ ch[i] = (unsigned char)res;
+ val /= 256;
+ }
+ f->write((char*)ch, 3);
+}
+
+int read_3byte(istream* f) {
+ int val = 0;
+ unsigned char ch[3];
+ if (!f->good()) return -1;
+ f->read((char*)ch, 3);
+ for (int i = 2; i >= 0; i--) {
+ val *= 256;
+ val += ch[i];
+ }
+ return val;
+}
+
+BinIOError::BinIOError(const string& txt, BinIO& io) {
+ m_txt = txt;
+ m_pos = io.getPosition();
+}
+
+ostream& BinIOError::write(ostream& os) const {
+ char buf[20];
+ sprintf(buf, "0x%x", m_pos);
+ os << "Binary file corrupt: " << m_txt << " at pos: " << buf << endl;
+ return os;
+}
+
+BinIO::BinIO(filebuf& fb, int rdwr) : m_fb(fb) {
+ m_os = NULL;
+ m_is = NULL;
+ m_rdwr = rdwr;
+ if (rdwr == BINIO_READ) m_is = new istream(&fb);
+ else m_os = new ostream(&fb);
+}
+
+BinIO::~BinIO() {
+ if (m_is != NULL) delete m_is;
+ if (m_os != NULL) delete m_os;
+}
+
+long BinIO::getPosition() {
+ return m_is->tellg();
+}
+
+void BinIO::ensure(char val, const char* errmsg) {
+ char valr;
+ m_is->read(&valr, sizeof(valr));
+ if (valr != val) throw BinIOError(errmsg, *this);
+}
+
+int BinIO::check_version(int version, int exOnError) {
+ int fver = read_int();
+ if (fver != version) {
+ if (exOnError == 1) {
+ char buf[32];
+ sprintf(buf, "%d <> %d", fver, version);
+ throw BinIOError(string("Incorrect binary file version ") + buf, *this);
+ }
+ return 0;
+ } else {
+ return 1;
+ }
+}
+
+int BinIO::check(char yes, char no, const char* errmsg) {
+ char valr;
+ m_is->read(&valr, sizeof(valr));
+ if (valr == yes) return 1;
+ if (valr == no) return 0;
+ throw BinIOError(errmsg, *this);
+}
+
+int BinIO::read_int() {
+ return read_3byte(m_is);
+}
+
+char BinIO::read_char() {
+ char valr;
+ m_is->read(&valr, sizeof(valr));
+ return valr;
+}
+
+void BinIO::read_str(string& str) {
+ int len = read_3byte(m_is);
+ char *buf = new char[len+1];
+ m_is->read(buf,len);
+ char *buff_end = buf + len;
+ *buff_end = 0;
+ str = *buf;
+ delete []buf;
+}
+
+void BinIO::read(void* bytes, int size) {
+ m_is->read((char*)bytes, size);
+}
+
+void BinIO::write(size_t val) {
+ write_3byte(m_os, val);
+}
+
+#ifdef __APPLE__
+void BinIO::write(unsigned int val) {
+ write_3byte(m_os, val);
+}
+#endif
+
+
+void BinIO::write(int val) {
+ write_3byte(m_os, val);
+}
+
+void BinIO::write(char val) {
+ m_os->write((char*)&val, sizeof(val));
+}
+
+void BinIO::write_char(char val) {
+ m_os->write((char*)&val, sizeof(val));
+}
+
+void BinIO::write(const string& val) {
+ int len = val.length();
+ write_3byte(m_os, len);
+ m_os->write(val.c_str(), len);
+}
+
+void BinIO::write(const void* bytes, int size) {
+ m_os->write((char*)bytes, size);
+}
+
+void BinIO::write(BinIOSerializable* ser) {
+ if (ser == NULL) {
+ write('N');
+ } else {
+ write('P');
+ ser->bin_write(*this);
+ }
+}
+
+int BinIO::hasSerializable() {
+ return check('P', 'N', "Serializable expected");
+}
+
+int BinIO::addSerializable(BinIOSerializable* ser) {
+ int res = m_ser.size();
+ m_ser.push_back(ser);
+ return res;
+}
+
+void BinIO::cleanSIndices() {
+ for (unsigned int i = 0; i < m_ser.size(); i++) {
+ m_ser[i]->setSIndex(-1);
+ }
+}
+
+void BinIO::close() {
+ if (m_os != NULL) m_os->flush();
+ m_fb.close();
+ cleanSIndices();
+}
+
+BinIOSerializable::BinIOSerializable() {
+ m_sindex = -1;
+}
+
+BinIOSerializable::~BinIOSerializable() {
+}
+
+void BinIOSerializable::bin_write(BinIO& io) {
+ if (m_sindex == -1) {
+ m_sindex = io.addSerializable(this);
+ io.write('W');
+ bin_write_impl(io);
+ } else {
+ io.write('S');
+ io.write(m_sindex);
+ }
+}
+
+BinIOSerializable* bin_read_serializable(BinIO& io) {
+ return NULL;
+}
+
+BinIOSerializable* bin_read_serializable(BinIO& io, const string& key) {
+ if (io.check('W', 'S', "Serializable expected")) {
+ /*
+ specific read here?
+ */
+ return NULL;
+ } else {
+ int idx = io.read_int();
+ return io.getSerializable(idx);
+ }
+}
+
+BinIOSerializable* try_bin_read_serializable(BinIO& io) {
+ if (io.check('W', 'S', "Serializable expected")) {
+ return NULL;
+ } else {
+ int idx = io.read_int();
+ return io.getSerializable(idx);
+ }
+}
+
+BinIOSerializable* ptr_bin_read_serializable(BinIO& io) {
+ if (io.hasSerializable()) {
+ if (io.check('W', 'S', "Serializable expected")) {
+ throw BinIOError("Serializable is no pointer", io);
+ } else {
+ int idx = io.read_int();
+ return io.getSerializable(idx);
+ }
+ } else {
+ return NULL;
+ }
+}
diff --git a/src/gle/tokens/BinIO.h b/src/gle/tokens/BinIO.h
new file mode 100644
index 0000000..5c5b910
--- /dev/null
+++ b/src/gle/tokens/BinIO.h
@@ -0,0 +1,144 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#ifndef BINIO_H
+#define BINIO_H
+
+#include <string>
+
+// This class contains stuff for serializing graphs
+
+#define BINIO_READ 0
+#define BINIO_WRITE 1
+
+using namespace std;
+
+class BinIO;
+class BinIOSerializable;
+
+class BinIOError {
+private:
+ string m_txt;
+ int m_pos;
+public:
+ BinIOError(const string& txt, BinIO& io);
+ ostream& write(ostream& os) const;
+};
+
+inline ostream& operator<<(ostream& os, const BinIOError& err) {
+ return err.write(os);
+}
+
+class BinIO {
+protected:
+ int m_rdwr;
+ ostream* m_os;
+ istream* m_is;
+ filebuf& m_fb;
+ vector<BinIOSerializable*> m_ser;
+public:
+ BinIO(filebuf& fb, int rdwr);
+ ~BinIO();
+ inline ostream& os() { return *m_os; }
+ long getPosition();
+ void write(size_t val);
+#ifdef __APPLE__
+ void write(unsigned int val);
+#endif
+ void write(int val);
+ void write(char val);
+ void write_char(char val);
+ void write(const string& val);
+ void write(const void* bytes, int size);
+ void write(BinIOSerializable* ser);
+ void ensure(char val, const char* errmsg);
+ int check_version(int version, int exOnError);
+ int check(char yes, char no, const char* errmsg);
+ int read_int();
+ char read_char();
+ void read_str(string& str);
+ void read(void* bytes, int size);
+ int hasSerializable();
+ int addSerializable(BinIOSerializable* ser);
+ inline BinIOSerializable* getSerializable(int idx) { return m_ser[idx]; }
+ void cleanSIndices();
+ void close();
+};
+
+
+template <class ElemType>
+class BinIOVector : public vector<ElemType> {
+public:
+ void bin_write(BinIO& io) const {
+ io.write('V');
+ io.write(this->size());
+ for (typename BinIOVector<ElemType>::const_iterator iter = this->begin(); iter != this->end(); iter++) {
+ iter->bin_write(io);
+ }
+ }
+
+ void bin_read(BinIO& io) {
+ io.ensure('V', "Expected vector");
+ int size = io.read_int();
+ for (int i = 0; i < size; i++) {
+ push_back(bin_read_elem(io));
+ }
+ }
+
+ ElemType bin_read_elem(BinIO& io);
+};
+
+class BinIOSerializable {
+protected:
+ int m_sindex;
+public:
+ BinIOSerializable();
+ virtual ~BinIOSerializable();
+ inline int getSIndex() { return m_sindex; }
+ inline void setSIndex(int idx) { m_sindex = idx; }
+ void bin_write(BinIO& io);
+ virtual void bin_write_impl(BinIO& io) = 0;
+};
+
+BinIOSerializable* bin_read_serializable(BinIO& io, const string& key);
+BinIOSerializable* bin_read_serializable(BinIO& io);
+BinIOSerializable* try_bin_read_serializable(BinIO& io);
+BinIOSerializable* ptr_bin_read_serializable(BinIO& io);
+
+#endif
+
diff --git a/src/gle/tokens/CharBitMap.h b/src/gle/tokens/CharBitMap.h
new file mode 100644
index 0000000..16d7c11
--- /dev/null
+++ b/src/gle/tokens/CharBitMap.h
@@ -0,0 +1,100 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#ifndef CHARBITMAP
+#define CHARBITMAP
+
+#define CharBitMapSize 8
+#define CharBitMapIntIndexSize 5
+#define CharBitMapIntIndexMask 31
+
+class CharBitMap {
+ private:
+ typedef unsigned char uchar;
+ int map[CharBitMapSize];
+ inline int thebit(char c) const;
+ inline int index(char c) const;
+ public:
+ inline void reset(char c);
+ inline void set(char c);
+ inline int get(char c) const;
+ inline void set(const char *cset);
+ inline void reset(const char *cset);
+ inline void clear();
+ inline void setall();
+ inline CharBitMap();
+ inline CharBitMap(const char *cset);
+ };
+
+
+inline int CharBitMap::index(char c) const {
+ return ((uchar)c)>>CharBitMapIntIndexSize;
+}
+inline int CharBitMap::thebit(char c) const {
+ return 1<<(c&CharBitMapIntIndexMask);
+}
+inline void CharBitMap::set(char c) {
+ map[index(c)]|=thebit(c);
+}
+inline void CharBitMap::reset(char c) {
+ map[index(c)]&=~thebit(c);
+}
+inline int CharBitMap::get(char c) const {
+ return (map[index(c)]&thebit(c))!=0;
+}
+inline void CharBitMap::set(const char *cset) {
+ while(*cset!=0)
+ set(*(cset++));
+}
+inline void CharBitMap::reset(const char *cset) {
+ while(*cset!=0)
+ reset(*(cset++));
+}
+inline void CharBitMap::clear() {
+ for(int i=0;i<CharBitMapSize;i++) map[i]=0;
+}
+inline void CharBitMap::setall() {
+ for(int i=0;i<CharBitMapSize;i++) map[i]=~0;
+}
+inline CharBitMap::CharBitMap() {
+ clear();
+}
+inline CharBitMap::CharBitMap(const char *cset) {
+ clear();set(cset);
+}
+#endif
diff --git a/src/gle/tokens/Makefile.gcc b/src/gle/tokens/Makefile.gcc
new file mode 100644
index 0000000..986cdba
--- /dev/null
+++ b/src/gle/tokens/Makefile.gcc
@@ -0,0 +1,56 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+#
+# makefile.gcc for GLE v4.0
+# for compilation with gcc
+#
+#
+include ../../../config.i
+include ../../../config.gcc
+-include ../../../extraconfig.gcc
+#
+include files.txt
+
+all: $(OBJECTS)
+
+$(OBJECTS): $(INCLUDES)
+
+clean:
+ -$(RM) $(OBJECTS)
+
diff --git a/src/gle/tokens/Makefile.in b/src/gle/tokens/Makefile.in
new file mode 100644
index 0000000..9d38c05
--- /dev/null
+++ b/src/gle/tokens/Makefile.in
@@ -0,0 +1,63 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+#
+# makefile.gcc for GLE v4.0
+# for compilation with gcc
+#
+
+include ../../../config.i
+include ../../../config.aconf
+
+include files.txt
+
+CXX=@CXX@
+CPPFLAGS=@LIBGLE_CPPFLAGS@@CPPFLAGS@
+
+CPPFLAGS := $(strip $(CPPFLAGS))
+
+LDFLAGS=@LDFLAGS@
+LIBS=@LIBS@
+
+all: $(OBJECTS)
+
+$(OBJECTS): %.o: %.cpp $(INCLUDES)
+ $(CXX) $(CPPFLAGS) -c $< -o $@
+
+clean:
+ -$(RM) $(OBJECTS)
diff --git a/src/gle/tokens/Makefile.os2 b/src/gle/tokens/Makefile.os2
new file mode 100644
index 0000000..01782fd
--- /dev/null
+++ b/src/gle/tokens/Makefile.os2
@@ -0,0 +1,55 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+#
+# makefile.gcc for GLE v4.0
+# for compilation with gcc
+#
+#
+include ../../../config.i
+include ../../../config.os2
+#
+include files.txt
+
+all: $(OBJECTS)
+
+$(OBJECTS): $(INCLUDES)
+
+clean:
+ -$(RM) $(OBJECTS)
+
diff --git a/src/gle/tokens/Makefile.vc b/src/gle/tokens/Makefile.vc
new file mode 100644
index 0000000..58dd502
--- /dev/null
+++ b/src/gle/tokens/Makefile.vc
@@ -0,0 +1,53 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+#
+# makefile.vc for GLE v4.0
+# for compilation with MS vc++ .net
+#
+#
+!include ..\..\..\config.vc
+#
+!include files.txt
+
+all: $(OBJECTS)
+
+$(OBJECTS): $(INCLUDES)
+
+clean:
+ -erase $(OBJECTS)
diff --git a/src/gle/tokens/RefCount.h b/src/gle/tokens/RefCount.h
new file mode 100644
index 0000000..b9664cc
--- /dev/null
+++ b/src/gle/tokens/RefCount.h
@@ -0,0 +1,133 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#ifndef __REFCOUNT_H__
+#define __REFCOUNT_H__
+
+class RefCountObject {
+private:
+ int owner_count;
+public:
+ RefCountObject();
+ ~RefCountObject();
+ inline int getOwnerCount() const { return owner_count; }
+ inline void use() { owner_count++; }
+ inline int release() { return (--owner_count) == 0; }
+ inline int unused() const { return owner_count == 0; }
+};
+
+// a safe RefCount object is a pointer to a RefCount object
+// that implements safe behaviour for use by classes that
+// only see the public section
+template <class T> class RefCountPtr {
+protected:
+ T* unsafe_ptr;
+ void setUnsafePtr(T* ptr) {
+ unsafe_ptr = ptr;
+ if (unsafe_ptr != NULL) unsafe_ptr->use();
+ }
+ void initPtr() {
+ unsafe_ptr=NULL;
+ }
+public:
+ inline bool isNull() const {
+ return unsafe_ptr == NULL;
+ }
+ inline bool notNull() const {
+ return unsafe_ptr != NULL;
+ }
+ void clearPtr() {
+ if (unsafe_ptr == NULL) return;
+ unsafe_ptr->release();
+ if (unsafe_ptr->unused()) { delete unsafe_ptr; };
+ unsafe_ptr = NULL;
+ }
+ inline RefCountPtr<T>& operator =(RefCountPtr<T> src) {
+ setPtr(src.unsafe_ptr);
+ return *this;
+ }
+ inline RefCountPtr<T>& operator =(T *src) {
+ setPtr(src);
+ return *this;
+ }
+ void setPtr(T *ptr) {
+ // first use() the new pointer, then delete unsafe_ptr if necessary
+ // order is important if ptr and unsafe_ptr point to the same object
+ if (ptr != NULL) ptr->use();
+ if (unsafe_ptr != NULL && unsafe_ptr->release()) {
+ delete unsafe_ptr;
+ }
+ unsafe_ptr = ptr;
+ }
+ inline void SetPtr(T *ptr) { setPtr(ptr); }
+ inline T& operator*() const { return *unsafe_ptr; }
+ inline T* operator->() const { return unsafe_ptr; }
+ inline T* get() const {return unsafe_ptr;}
+ inline T* GetPtr() const {return unsafe_ptr;}
+ inline RefCountPtr() {
+ initPtr();
+ };
+ inline RefCountPtr(const RefCountPtr<T>& src) {
+ setUnsafePtr(src.unsafe_ptr);
+ };
+ inline RefCountPtr(T* src) {
+ setUnsafePtr(src);
+ };
+ inline ~RefCountPtr() {
+ clearPtr();
+ };
+};
+
+template <class T> class RefCountVector : public vector< RefCountPtr<T> > {
+public:
+ inline void add(T* elem) { push_back(RefCountPtr<T>(elem)); }
+ inline T* get(int i) { return (*this)[i].get(); }
+ void createNew(int n) {
+ for (int i = 0; i < n; i++) push_back(RefCountPtr<T>(new T()));
+ }
+};
+
+template <class T> class MutableRefCountPtr : public RefCountPtr<T> {
+public:
+ inline RefCountPtr<T>& operator =(RefCountPtr<T> src) {
+ this->setPtr(src.get());
+ return *this;
+ };
+};
+
+#endif
diff --git a/src/gle/tokens/StringKeyHash.cpp b/src/gle/tokens/StringKeyHash.cpp
new file mode 100644
index 0000000..e5e7775
--- /dev/null
+++ b/src/gle/tokens/StringKeyHash.cpp
@@ -0,0 +1,108 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#include "StringKeyHash.h"
+
+//#ifdef GLE_USE_HASHTABLE
+
+int StringIntHash::try_get(const name_hash_key& key) const {
+ StringBasicHash<int>::const_iterator i = find(key);
+ if (i != end()) {
+ return i->second;
+ } else {
+ return -1;
+ }
+}
+
+void StringIntHash::add_item(const name_hash_key& key, int elem) {
+ insert(StringKeyPair<int>(key, elem));
+}
+
+void* StringVoidPtrHash::try_get(const name_hash_key& key) const {
+ StringBasicHash<void*>::const_iterator i = find(key);
+ if (i != end()) {
+ return i->second;
+ } else {
+ return NULL;
+ }
+}
+
+void StringVoidPtrHash::add_item(const name_hash_key& key, void* elem) {
+ insert(StringKeyPair<void*>(key, elem));
+}
+
+void StringVoidPtrHash::deleteRecursive(int depth) {
+ if (depth <= 0) return;
+ for (StringVoidPtrHash::iterator iter = begin(); iter != end(); iter++) {
+ void* elem = iter->second;
+ if (elem != NULL) {
+ StringVoidPtrHash* hash = (StringVoidPtrHash*)elem;
+ hash->deleteRecursive(depth - 1);
+ delete hash;
+ }
+ }
+}
+
+//#endif
+
+int IntIntHash::try_get(int key) const {
+ IntBasicHash<int>::const_iterator i = find(key);
+ if (i != end()) {
+ return i->second;
+ } else {
+ return -1;
+ }
+}
+
+void IntIntHash::add_item(int key, int elem) {
+ insert(IntKeyPair<int>(key, elem));
+}
+
+int IntStringHash::try_get(int key, string* res) const {
+ IntBasicHash<string>::const_iterator i = find(key);
+ if (i != end()) {
+ *res = i->second;
+ return 1;
+ } else {
+ return 0;
+ }
+}
+
+void IntStringHash::add_item(int key, const string& elem) {
+ insert(IntKeyPair<string>(key, elem));
+}
diff --git a/src/gle/tokens/StringKeyHash.h b/src/gle/tokens/StringKeyHash.h
new file mode 100644
index 0000000..0966676
--- /dev/null
+++ b/src/gle/tokens/StringKeyHash.h
@@ -0,0 +1,316 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#ifndef STRINGKEYHASH_H
+#define STRINGKEYHASH_H
+
+#ifndef _MSC_VER
+ // Use hash table except when compiling with MSVC
+ //#define GLE_USE_HASHTABLE
+#else
+ #pragma warning( disable : 4996 )
+#endif
+
+#define EXT_HASH
+#ifdef _MSC_VER
+ #undef EXT_HASH
+#endif
+#ifdef GCC2
+ #undef EXT_HASH
+#endif
+#ifdef EXT_HASH
+// #include <ext/hash_map>
+#else
+ #ifdef _MSC_VER
+ #include <hash_map>
+ using namespace stdext;
+// typedef hash _Hash;
+ #else
+ #include <hash_map.h>
+ #endif
+#endif
+#include <algorithm>
+#include <string>
+#include <string.h>
+#include <map>
+#include <utility>
+#include <iostream>
+#include <vector>
+
+using namespace std;
+
+#ifndef GCC2
+#ifndef _MSC_VER
+ using namespace __gnu_cxx; // using gnu extensions such as "hash"
+#endif
+#endif
+
+#include "RefCount.h"
+#include "BinIO.h"
+
+/**************************************************************************************************
+ * Hash functions on strings *
+ **************************************************************************************************/
+
+#define SKEYHASH_DELETE 1
+#define SKEYHASH_KEEP 0
+
+typedef string name_hash_key;
+
+template <class ElemType> class StringKeyPair : public pair<const name_hash_key, ElemType> {
+public:
+ StringKeyPair(const name_hash_key key, ElemType value) : pair<const name_hash_key, ElemType>(key, value) {
+ }
+};
+
+template <class ElemType> class IntKeyPair : public pair<int, ElemType> {
+public:
+ IntKeyPair(int key, ElemType value) : pair<int, ElemType>(key, value) {
+ }
+};
+
+#ifdef GLE_USE_HASHTABLE
+
+struct eq_name_hash_key {
+ inline bool operator() (const name_hash_key& s1, const name_hash_key& s2) const {
+ return s1 == s2;
+ }
+};
+
+struct hash_name_hash_key {
+ inline size_t operator() (const name_hash_key& s) const {
+ #ifdef _MSC_VER
+ return stdext::hash_value<const char *>(s.c_str());
+ #else
+ return hash<const char *>()(s.c_str());
+ #endif
+ }
+};
+
+template <class ElemType> class StringKeyIterator : public hash_map<name_hash_key, ElemType>::iterator {
+};
+
+struct eq_int_key {
+ inline bool operator() (int s1, int s2) const {
+ return s1 == s2;
+ }
+};
+
+struct hash_int_key {
+ inline size_t operator() (int s) const {
+ #ifdef _MSC_VER
+ return stdext::hash_value<int>(s);
+ #else
+ return hash<int>()(s);
+ #endif
+ }
+};
+
+template <class ElemType> class IntKeyIterator : public hash_map<int, ElemType>::iterator {
+};
+
+#else
+
+struct lt_name_hash_key {
+ bool operator()(const name_hash_key& s1, const name_hash_key& s2) const {
+ return s1 < s2;
+ }
+};
+
+struct lt_int_key {
+ bool operator()(int s1, int s2) const {
+ return s1 < s2;
+ }
+};
+
+#endif
+
+/**************************************************************************************************
+ * Hashtable string -> ElemType *
+ **************************************************************************************************/
+
+template <class ElemType> class StringBasicHash :
+#ifdef GLE_USE_HASHTABLE
+ public hash_map<name_hash_key, ElemType, hash_name_hash_key, eq_name_hash_key> {
+#else
+ public map<name_hash_key, ElemType, lt_name_hash_key> {
+#endif
+};
+
+/**************************************************************************************************
+ * Hashtable int -> ElemType *
+ **************************************************************************************************/
+
+template <class ElemType> class IntBasicHash :
+#ifdef GLE_USE_HASHTABLE
+ public hash_map<int, ElemType, hash_int_key, eq_int_key> {
+#else
+ public map<int, ElemType, lt_int_key> {
+#endif
+};
+
+/**************************************************************************************************
+ * Hashtable string -> int (currently not used, might be used for variables?) *
+ **************************************************************************************************/
+
+//#ifdef GLE_USE_HASHTABLE
+
+class StringIntHash : public StringBasicHash<int> {
+public:
+ int try_get(const name_hash_key& key) const;
+ void add_item(const name_hash_key& key, int elem);
+};
+
+//#endif
+
+/**************************************************************************************************
+ * Hashtable string -> void* *
+ **************************************************************************************************/
+
+//#ifdef GLE_USE_HASHTABLE
+
+class StringVoidPtrHash : public StringBasicHash<void*> {
+public:
+ void* try_get(const name_hash_key& key) const;
+ void add_item(const name_hash_key& key, void* elem);
+ void deleteRecursive(int depth);
+};
+
+//#endif
+
+/**************************************************************************************************
+ * Hashtable int -> int *
+ **************************************************************************************************/
+
+class IntIntHash : public IntBasicHash<int> {
+public:
+ int try_get(int key) const;
+ void add_item(int key, int elem);
+};
+
+/**************************************************************************************************
+ * Hashtable int -> string *
+ **************************************************************************************************/
+
+class IntStringHash : public IntBasicHash<string> {
+public:
+ int try_get(int key, string* res) const;
+ void add_item(int key, const string& elem);
+};
+
+/**************************************************************************************************
+ * Hashtable string -> ElemType (used by the GLE parser) *
+ **************************************************************************************************/
+
+template <class ElemType> class StringKeyHash :
+#ifdef GLE_USE_HASHTABLE
+ #ifdef _MSC_VER
+ public hash_map<name_hash_key, ElemType , stdext::hash_compare<name_hash_key,eq_name_hash_key> > {
+ #else
+ public hash_map<name_hash_key, ElemType , hash_name_hash_key, eq_name_hash_key> {
+ #endif
+#else
+ public map<name_hash_key, ElemType, lt_name_hash_key> {
+#endif
+public:
+ ElemType try_add(const name_hash_key& key) {
+ typename StringKeyHash<ElemType>::iterator i = this->find(key);
+ if (i != this->end()) {
+ return i->second;
+ } else {
+ ElemType nelem(key);
+ this->insert(StringKeyPair<ElemType>(key, nelem));
+ return nelem;
+ }
+ }
+
+ ElemType try_get(const name_hash_key& key) {
+ typename StringKeyHash<ElemType>::const_iterator i = this->find(key);
+ if (i != this->end()) {
+ return i->second;
+ } else {
+ return NULL;
+ }
+ }
+
+ void add_item(const name_hash_key& key, const ElemType& elem) {
+ insert(StringKeyPair<ElemType>(key, elem));
+ }
+
+ ostream& write(ostream &os, int tab) const {
+ for (typename StringKeyHash<ElemType>::const_iterator i = this->begin(); i != this->end(); i++ ) {
+ cerr << i->first << endl;
+ i->second.write(os, tab);
+ }
+ return os;
+ }
+
+ ostream& writeKeys(ostream &os) const {
+ for (typename StringKeyHash<ElemType>::const_iterator i = this->begin(); i != this->end(); i++ ) {
+ cerr << i->first << endl;
+ }
+ return os;
+ }
+};
+
+/**************************************************************************************************
+ * Hashtable int -> ElemType *
+ **************************************************************************************************/
+
+template <class ElemType> class IntKeyHash :
+#ifdef GLE_USE_HASHTABLE
+ public hash_map<int, ElemType, hash_int_key, eq_int_key> {
+#else
+ public map<int, ElemType, lt_int_key> {
+#endif
+public:
+ ElemType try_get(int key) {
+ typename IntKeyHash<ElemType>::const_iterator i = this->find(key);
+ if (i != this->end()) {
+ return i->second;
+ } else {
+ return NULL;
+ }
+ }
+
+ void add_item(int key, ElemType elem) {
+ this->insert(IntKeyPair<ElemType>(key, elem));
+ }
+};
+
+#endif // of #ifndef STRINGKEYHASH_H
diff --git a/src/gle/tokens/Tokenizer.cpp b/src/gle/tokens/Tokenizer.cpp
new file mode 100644
index 0000000..e6a6a96
--- /dev/null
+++ b/src/gle/tokens/Tokenizer.cpp
@@ -0,0 +1,1533 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#include <vector>
+#include <fstream>
+#include <sstream>
+
+using namespace std;
+
+#include "../basicconf.h"
+#include "../cutils.h"
+#include "Tokenizer.h"
+#include <string.h>
+#include <stdio.h>
+
+#define SPACE_CHAR ' '
+
+// #define debug_tok_lang(x) cerr << x << endl
+#define debug_tok_lang(x)
+
+// GNU version of index not defined in MingW, ...
+// Replaces by calls to strcontains
+int strcontains(const char* str, char ch) {
+ char cr = *str;
+ while (cr != 0) {
+ if (cr == ch) return 1;
+ cr = *(++str);
+ }
+ return 0;
+}
+
+int strposition(const char* str, char ch) {
+ int pos = 0;
+ char cr = *str;
+ while (cr != 0) {
+ if (cr == ch) return pos;
+ cr = str[++pos];
+ }
+ return -1;
+}
+
+bool is_integer(const string& strg) {
+ int len = strg.length();
+ if (len == 0) return false;
+ for (int i = 0; i < len; i++) {
+ char ch = strg[i];
+ if (ch < '0' || ch > '9') {
+ if (i != 0) return false;
+ if (ch != '+' && ch != '-') return false;
+ }
+ }
+ return true;
+}
+
+bool is_integer_e(const string& strg) {
+ int len = strg.length();
+ if (len <= 1) return false;
+ char ch = strg[len-1];
+ if (ch != 'e' && ch != 'E') return false;
+ for (int i = 0; i < len-1; i++) {
+ char ch = strg[i];
+ if (ch < '0' || ch > '9') {
+ if (i != 0) return false;
+ if (ch != '+' && ch != '-') return false;
+ }
+ }
+ return true;
+}
+
+bool is_float(const string& strg) {
+ int len = strg.length();
+ if (len == 0) return 0;
+ int pos = 0;
+ char ch = strg[pos];
+ // cout << "is_float(" << strg << ")" << endl;
+ if (ch == '+' || ch == '-') {
+ pos++;
+ ch = pos < len ? strg[pos] : 0;
+ }
+ bool has_dot = false;
+ if (ch == '.') {
+ pos++; has_dot = true;
+ ch = pos < len ? strg[pos] : 0;
+ }
+ int count1 = 0, count2 = 0;
+ while (ch >= '0' && ch <= '9') {
+ pos++; count1++;
+ ch = pos < len ? strg[pos] : 0;
+ }
+ if (!has_dot) {
+ if (ch == '.') {
+ pos++; has_dot = true;
+ ch = pos < len ? strg[pos] : 0;
+ while (ch >= '0' && ch <= '9') {
+ pos++; count2++;
+ ch = pos < len ? strg[pos] : 0;
+ }
+ }
+ } else {
+ count2 = count1;
+ count1 = 0;
+ }
+ if (count1 > 0 || count2 > 0) {
+ if (ch == 'e' || ch == 'E') {
+ pos++;
+ ch = pos < len ? strg[pos] : 0;
+ if (ch == '+' || ch == '-') {
+ pos++;
+ ch = pos < len ? strg[pos] : 0;
+ }
+ int counte = 0;
+ while (ch >= '0' && ch <= '9') {
+ pos++; counte++;
+ ch = pos < len ? strg[pos] : 0;
+ }
+ return counte > 0;
+ } else {
+ return pos == len;
+ }
+ } else {
+ return false;
+ }
+}
+
+void strip_string_markers(string& strg) {
+ int len = strg.length();
+ if (len >= 2) {
+ char ch0 = strg[0];
+ if (ch0 == '"' || ch0 == '\'') {
+ strg.erase(strg.begin());
+ strg.resize(len-2);
+ }
+ }
+}
+
+ostream& mtab(ostream &os, int nb) {
+ for (int i = 0; i < nb; i++) os << '\t';
+ return os;
+}
+
+double tokenizer_string_to_double(const char* value) throw(ParserError) {
+ char *endp;
+ double dvalue = strtod(value, &endp);
+ if (value != endp && *endp == 0) {
+ return dvalue;
+ } else {
+ ostringstream err;
+ err << "illegal double value '" << value << "'" << endl;
+ g_throw_parser_error(err.str());
+ return 0.0;
+ }
+}
+
+TokenizerPos::TokenizerPos() {
+ m_col = -10; m_line = -10;
+}
+
+TokenizerPos::TokenizerPos(const TokenizerPos& pos) {
+ m_col = pos.m_col;
+ m_line = pos.m_line;
+}
+
+void TokenizerPos::set(int line, int column) {
+ m_line = line;
+ m_col = column;
+}
+
+void TokenizerPos::set_line(int line) {
+ m_line = line;
+}
+
+void TokenizerPos::set_col(int column) {
+ m_col = column;
+}
+
+void TokenizerPos::incRow() {
+ m_line++;
+ m_col = 0;
+}
+
+bool TokenizerPos::isValid() const {
+ return m_col >= 0 || m_line > 0;
+}
+
+ostream& TokenizerPos::write(ostream &os) const {
+ if (m_col >= 0 && m_line > 0) {
+ os << m_line << ":" << (m_col-1);
+ } else if (m_line > 0) {
+ os << "line " << m_line;
+ } else if (m_col >= 0) {
+ os << "column " << (m_col-1);
+ }
+ return os;
+}
+
+int TokenizerPos::equals(TokenizerPos& pos) const {
+ return (m_col == pos.m_col && m_line == pos.m_line);
+}
+
+string TokenizerPos::getString(int tab1, int tab2) const {
+ int i, pos = 0;
+ char lines[15], cols[15], res[50];
+ if (m_line < 0) strcpy(lines, "?");
+ else sprintf(lines, "%d", m_line);
+ if (m_col < 0) strcpy(cols, "?");
+ else sprintf(cols, "%d", m_col-1);
+ for (i = tab1-strlen(lines); i > 0; i--) {
+ res[pos++] = ' ';
+ }
+ i = 0;
+ while (lines[i] != 0) {
+ res[pos++] = lines[i++];
+ }
+ i = 0;
+ res[pos++] = ':';
+ while (cols[i] != 0) {
+ res[pos++] = cols[i++];
+ }
+ for (i = tab2-strlen(cols); i > 0; i--) {
+ res[pos++] = ' ';
+ }
+ res[pos] = 0;
+ return string(res);
+}
+
+#if defined(__UNIX__)
+ ParserError g_format_parser_error(const char* format, ...) {
+#else
+ ParserError g_format_parser_error(va_list format, ...) {
+#endif
+ string str;
+ va_list ap;
+ va_start(ap, format);
+ str_format(&str, (const char*)format, ap);
+ va_end(ap);
+ TokenizerPos pos;
+ pos.setColumn(-1);
+ return ParserError(str, pos, NULL);
+}
+
+
+void g_throw_parser_error(const string& err) throw(ParserError) {
+ TokenizerPos pos;
+ pos.setColumn(-1);
+ ParserError err_exp(err, pos, NULL);
+ throw err_exp;
+}
+
+void g_throw_parser_error(const char* str1, const char* str2, const char* str3) throw(ParserError) {
+ TokenizerPos pos;
+ pos.setColumn(-1);
+ string err = str1;
+ if (str2 != NULL) err += str2;
+ if (str3 != NULL) err += str3;
+ ParserError err_exp(err, pos, NULL);
+ throw err_exp;
+}
+
+void g_throw_parser_error_sys(const char* str1, const char* str2, const char* str3) throw(ParserError) {
+ TokenizerPos pos;
+ pos.setColumn(-1);
+ ostringstream err_str;
+ err_str << str1;
+ if (str2 != NULL) err_str << str2;
+ if (str3 != NULL) err_str << str3;
+ err_str << ": ";
+ str_get_system_error(err_str);
+ ParserError err_exp(err_str.str(), pos, NULL);
+ throw err_exp;
+}
+
+void g_throw_parser_error(const char* err, int idx) throw(ParserError) {
+ char str[30];
+ sprintf(str, "%d", idx);
+ TokenizerPos pos;
+ pos.setColumn(-1);
+ ParserError err_exp(string(err)+str, pos, NULL);
+ throw err_exp;
+}
+
+IThrowsError::IThrowsError() {
+}
+
+IThrowsError::~IThrowsError() {
+}
+
+ParserError IThrowsError::throwError(const char* s1, const char* s2, const char* s3) {
+ TokenizerPos pos;
+ pos.setColumn(-1);
+ string err(s1);
+ if (s2 != NULL) err += s2;
+ if (s3 != NULL) err += s3;
+ return ParserError(err, pos, NULL);
+}
+
+ParserError IThrowsError::throwError(int /* pos */, const string& error) {
+ return throwError(error);
+}
+
+ParserError IThrowsError::throwError(const string& error) {
+ TokenizerPos pos;
+ pos.setColumn(-1);
+ return ParserError(error, pos, NULL);
+}
+
+int IThrowsError::getErrorPosition() const {
+ return 0;
+}
+
+IThrowsError* g_get_throws_error() {
+ static IThrowsError instance;
+ return &instance;
+}
+
+ParserError::ParserError(const string& txt, const TokenizerPos& pos, const char* fname) {
+ m_txt = txt;
+ str_replace_all(m_txt, "\n", "\n>> ");
+ m_pos = pos;
+ m_flag = 0;
+ if (fname == NULL) m_fname = "";
+ else m_fname = fname;
+}
+
+ParserError::ParserError(const ParserError& err) {
+ m_flag = err.m_flag;
+ m_txt = err.m_txt;
+ m_fname = err.m_fname;
+ m_parsestr = err.m_parsestr;
+ m_pos = err.m_pos;
+}
+
+void ParserError::setParserString(const string& str) {
+ m_parsestr = str;
+ m_flag |= TOK_PARSER_ERROR_PSTRING;
+}
+
+void ParserError::setParserString(const char* str) {
+ m_parsestr = str;
+ m_flag |= TOK_PARSER_ERROR_PSTRING;
+}
+
+ostream& ParserError::write(ostream& os) const {
+ os << m_txt;
+ if (m_fname != "") {
+ if (m_pos.isValid()) {
+ os << " at " << m_pos;
+ }
+ os << ", while processing '" << m_fname << "'";
+ }
+ return os;
+}
+
+void ParserError::toString(string& str) const {
+ if (m_fname == "") {
+ str = m_txt;
+ } else {
+ ostringstream err_str;
+ write(err_str);
+ str = err_str.str();
+ }
+}
+
+int ParserError::equals(ParserError* err) const {
+ return (m_txt == err->m_txt &&
+ m_fname == err->m_fname &&
+ m_pos.equals(err->m_pos));
+}
+
+TokenizerLangHash::TokenizerLangHash() {
+}
+
+TokenizerLangHash::TokenizerLangHash(const string& name) {
+}
+
+TokenizerLangHash::~TokenizerLangHash() {
+}
+
+ostream& TokenizerLangHash::write(ostream &os, int depth) const {
+ if (!m_default.isNull()) {
+ mtab(os, depth);
+ os << m_default->getName() << endl;
+ }
+ for (const_iterator i = begin(); i != end(); i++ ) {
+ const name_hash_key& key = i->first;
+ const TokenizerLangHash* hash = i->second.get();
+ mtab(os, depth);
+ os << key << endl;
+ hash->write(os, depth + 1);
+ }
+ return os;
+}
+
+TokenAndPos::TokenAndPos() {
+};
+
+TokenAndPos::~TokenAndPos() {
+};
+
+TokenAndPos::TokenAndPos(const TokenAndPos& copy) {
+ m_token = copy.m_token;
+ m_pos = copy.m_pos;
+ m_space = copy.m_space;
+}
+
+TokenAndPos::TokenAndPos(const string& token, const TokenizerPos& pos, char space) {
+ m_token = token; m_pos = pos; m_space = space;
+};
+
+TokenizerLangElem* Tokenizer::findLangElem(const TokenizerLangHash* hash) {
+ string backup_token = m_token;
+ TokenizerPos backup_pos = m_token_start;
+ get_token_2();
+ if (m_token.length() != 0) {
+ debug_tok_lang("Tokenizer::first part of token '" << m_token << "'");
+ if (m_space_before) {
+ pushback_token();
+ } else {
+ TokenizerLangElem* result = findLangElem2(hash);
+ if (result != NULL) {
+ debug_tok_lang("Tokenizer::recursive call returns NULL");
+ m_token_start = backup_pos;
+ return result;
+ }
+ }
+ }
+ TokenizerLangElem* elem = hash->getDefault();
+ debug_tok_lang("Tokenizer::default elem " << elem);
+ if (elem != NULL) {
+ return elem;
+ } else {
+ m_token = backup_token;
+ m_token_start = backup_pos;
+ return NULL;
+ }
+}
+
+TokenizerLangElem* Tokenizer::findLangElem2(const TokenizerLangHash* hash) {
+ TokenAndPos my_tkpos(m_token, m_token_start, m_space_before);
+ TokenizerLangHash::const_iterator i = hash->find(my_tkpos.getToken());
+ if (i != hash->end()) {
+ get_token_2();
+ const TokenizerLangHash* child = i->second.get();
+ if (m_token.length() != 0) {
+ if (m_space_before) {
+ pushback_token();
+ } else {
+ TokenizerLangElem* result = findLangElem2(child);
+ if (result != NULL) return result;
+ }
+ }
+ TokenizerLangElem* elem = child->getDefault();
+ if (elem != NULL) return elem;
+ pushback_token(my_tkpos);
+ return NULL;
+ } else {
+ pushback_token(my_tkpos);
+ return NULL;
+ }
+}
+
+void TokenizerLangHash::addLangElem(Tokenizer* tokens, TokenizerLangElem* elem) {
+ string& token = tokens->try_next_token();
+ if (token.length() == 0) {
+ m_default = elem;
+ } else {
+ elem->addName(token);
+ TokenizerLangHashPtr hash = try_add(token);
+ hash.addLangElem(tokens, elem);
+ }
+}
+
+void TokenizerLangHash::addLangElem(const vector<string>& toks, TokenizerLangElem* elem, unsigned int pos) {
+ if (pos >= toks.size()) {
+ m_default = elem;
+ } else {
+ TokenizerLangHashPtr hash = try_add(toks[pos]);
+ hash.addLangElem(toks, elem, pos+1);
+ }
+}
+
+TokenizerLanguage::TokenizerLanguage() {
+ m_index = NULL;
+ m_enable_c_comm = 0;
+ m_enable_cpp_comm = 0;
+ m_parse_strings = 1;
+ m_decimal_dot = 0;
+}
+
+TokenizerLanguage::~TokenizerLanguage() {
+ if (m_index != NULL) delete[] m_index;
+}
+
+void TokenizerLanguage::addElementIndex(int size) {
+ if (m_index != NULL) delete[] m_index;
+ m_index = new TokLangElemPtr[size];
+}
+
+void TokenizerLanguage::setElement(int i, TokenizerLangElem* elem) {
+ m_index[i] = elem;
+}
+
+void TokenizerLanguage::addSubLanguages(int nb) {
+ for (int i = 0; i < nb; i++) {
+ m_sublanguage.push_back(new TokenizerLangHash());
+ }
+}
+
+void TokenizerLanguage::addLanguageElem(int sublang, const char* elem) {
+ StringTokenizer parser(elem, this);
+ TokenizerLangElem* le = new TokenizerLangElem();
+ m_sublanguage[sublang].addLangElem(&parser, le);
+}
+
+void TokenizerLanguage::addLanguageElem(int sublang, const vector<string>& toks, TokenizerLangElem* elem) {
+ m_sublanguage[sublang].addLangElem(toks, elem, 0);
+}
+
+void TokenizerLanguage::resetCharMaps() {
+ m_one_char_tokens.clear();
+ m_space_tokens.clear();
+ m_line_comment_tokens.clear();
+}
+
+void TokenizerLanguage::initDefault() {
+ initDefaultSingleCharTokens();
+ initDefaultSpaceTokens();
+}
+
+void TokenizerLanguage::initDefaultSingleCharTokens() {
+ setSingleCharTokens(",.:;[]{}()+-*/=#<>|^@");
+}
+
+void TokenizerLanguage::initDefaultSpaceTokens() {
+ setSpaceTokens(" \t\n\r");
+}
+
+TokenizerLanguageMultiLevel::TokenizerLanguageMultiLevel() {
+ for (int i = 0; i < 255; i++) {
+ m_open_tokens[i] = 0;
+ }
+}
+
+void TokenizerLanguageMultiLevel::setOpenClose(char open, char close) {
+ m_open_tokens[(int)open] = close;
+ m_close_tokens.set(close);
+}
+
+Tokenizer::Tokenizer() {
+ m_language = new TokenizerLanguage();
+ init();
+}
+
+Tokenizer::Tokenizer(TokenizerLanguage* language) {
+ m_language = language;
+ init();
+}
+
+Tokenizer::~Tokenizer() {
+}
+
+void Tokenizer::select_language(int i) {
+ if (i == TOKENIZER_LANG_NONE) m_langhash = NULL;
+ else m_langhash = m_language->getLanguage(i);
+}
+
+void Tokenizer::init() {
+ m_fname = NULL;
+ m_langhash = NULL;
+ reset_all();
+}
+
+void Tokenizer::reset_nopos() {
+ m_token_at_end = 0;
+ m_token_has_pushback = 0;
+ m_token_has_pushback_ch = 0;
+ m_token_start.set(0, 0);
+ m_space_before = false;
+ m_space_after = false;
+ m_pushback_tokens.clear();
+}
+
+void Tokenizer::reset_all() {
+ reset_nopos();
+ m_token_count.set(1, 0);
+}
+
+TokenizerLanguage* Tokenizer::get_language() {
+ return m_language;
+}
+
+void Tokenizer::delete_language() {
+ if (m_language != NULL) {
+ delete m_language;
+ m_language = NULL;
+ }
+}
+
+void Tokenizer::reset_position() {
+ m_token_count.set(1, 0);
+ m_token_start.set(0, 0);
+}
+
+int Tokenizer::has_more_tokens() throw(ParserError) {
+ if (m_token_has_pushback > 0) {
+ return 1;
+ }
+ if (m_token_at_end == 1) {
+ return 0;
+ }
+ char token_ch = token_read_sig_char();
+ if (m_token_at_end == 1) {
+ return 0;
+ } else {
+ token_pushback_ch(token_ch);
+ return 1;
+ }
+}
+
+string& Tokenizer::next_token() throw(ParserError) {
+ get_check_token();
+// cerr << m_token_start << "\t" << m_token << endl;
+ return m_token;
+}
+
+string& Tokenizer::try_next_token() throw(ParserError) {
+ get_token();
+ return m_token;
+}
+
+double Tokenizer::next_double() throw(ParserError) {
+ char *ptr;
+ get_check_token();
+ double result = strtod(m_token.c_str(), &ptr);
+ if (*ptr != 0) throw error("expected floating point number, not '" + m_token + "'");
+ return result;
+}
+
+int Tokenizer::next_integer() throw(ParserError) {
+ char* ptr;
+ get_check_token();
+ int result = strtol(m_token.c_str(), &ptr, 10);
+ if (*ptr != 0) throw error("expected integer, not '" + m_token + "'");
+ return result;
+}
+
+int Tokenizer::try_next_integer(int *i) {
+ char* ptr;
+ get_check_token();
+ *i = strtol(m_token.c_str(), &ptr, 10);
+ return *ptr != 0 ? 0 : 1;
+}
+
+void Tokenizer::get_token() throw(ParserError) {
+ get_token_2();
+ if ((!m_langhash.isNull()) && m_token.length() > 0) {
+ TokenizerLangHash::const_iterator i = m_langhash->find(m_token);
+ if (i != m_langhash->end()) {
+ const TokenizerLangElem* elem = findLangElem(i->second.get());
+ if (elem != NULL) m_token = elem->getName();
+ }
+ }
+}
+
+TokenizerLangElem* Tokenizer::try_find_lang_elem(int i) {
+ get_token_2();
+ if (m_token.length() > 0) {
+ const TokenizerLangHash* hash = m_language->getLanguage(i).get();
+ TokenizerLangHash::const_iterator i = hash->find(m_token);
+ if (i != hash->end()) {
+ debug_tok_lang("Tokenizer::find first part " << m_token);
+ TokenizerLangElem* elem = findLangElem(i->second.get());
+ if (elem != NULL) {
+ debug_tok_lang("Tokenizer::found elem " << elem->getName());
+ return elem;
+ } else {
+ debug_tok_lang("Tokenizer::call returns NULL, pushback " << m_token);
+ pushback_token();
+ }
+ } else {
+ pushback_token();
+ }
+ }
+ return NULL;
+}
+
+void Tokenizer::get_token_2() throw(ParserError) {
+ if (m_token_has_pushback > 0) {
+ const TokenAndPos& tkpos = m_pushback_tokens.back();
+ m_token = tkpos.getToken();
+ m_token_start = tkpos.getPos();
+ m_space_before = tkpos.getSpace();
+ m_pushback_tokens.pop_back();
+ m_token_has_pushback--;
+ return;
+ }
+ m_space_before = m_space_after;
+ m_space_after = false;
+ char token_ch = token_read_sig_char();
+ m_token_start = m_token_count;
+ if (m_token_at_end == 1) {
+ m_token = "";
+ return;
+ }
+ // String with \" or \' marks
+ if ((token_ch == '\"' || token_ch == '\'') && m_language->getParseStrings()) {
+ char string_delim = token_ch;
+ m_token = token_ch;
+ do {
+ token_ch = token_read_char_no_comment();
+ m_token += token_ch;
+ if (token_ch == string_delim) {
+ token_ch = token_read_char_no_comment();
+ if (token_ch != string_delim) {
+ token_pushback_ch(token_ch);
+ return;
+ }
+ }
+ } while (m_token_at_end == 0);
+ throw error("unterminated string constant");
+ }
+ // No string found
+ if (m_language->isSingleCharToken(token_ch)) {
+ if (m_language->isDecimalDot(token_ch)) {
+ // Number starting with decimal dot
+ m_token = "";
+ read_number_term(token_ch, false, false);
+ } else {
+ m_token = token_ch;
+ }
+ } else {
+ // Support the possibility not to token on space
+ bool token_on_space = m_language->isSpaceToken(SPACE_CHAR);
+ m_token = token_ch;
+ do {
+ token_ch = token_read_char();
+ if (m_language->isDecimalDot(token_ch)) {
+ if (is_integer(m_token)) {
+ // Number starting with "123."
+ read_number_term(token_ch, false, true);
+ return;
+ } else {
+ token_pushback_ch(token_ch);
+ return;
+ }
+ } else {
+ if (m_language->isSingleCharToken(token_ch)) {
+ // Support numbers of the form 1e-9
+ if ((token_ch == '+' || token_ch == '-') && is_integer_e(m_token)) {
+ read_number_term(token_ch, true, true);
+ return;
+ }
+ token_pushback_ch(token_ch);
+ return;
+ }
+ }
+ if (token_ch == SPACE_CHAR && token_on_space) {
+ m_space_after = true;
+ on_trailing_space();
+ return;
+ }
+ m_token += token_ch;
+ } while (m_token_at_end == 0);
+ }
+}
+
+void Tokenizer::copy_string(char string_delim) throw(ParserError) {
+ TokenizerPos pos = token_stream_pos();
+ while (m_token_at_end == 0) {
+ char token_ch = token_read_char_no_comment();
+ m_token += token_ch;
+ if (token_ch == string_delim) {
+ token_ch = token_read_char_no_comment();
+ if (token_ch != string_delim) {
+ token_pushback_ch(token_ch);
+ return;
+ }
+ }
+ }
+ throw error(pos, "unterminated string constant");
+}
+
+void Tokenizer::multi_level_do_multi(char open) throw(ParserError) {
+ vector<char> m_open_token;
+ m_open_token.push_back(open);
+ TokenizerLanguageMultiLevel* multi = m_language->getMulti();
+ char token_ch = token_read_char();
+ while (m_token_at_end == 0) {
+ if (m_open_token.size() == 0 && multi->isEndToken(token_ch)) {
+ if (token_ch != SPACE_CHAR) {
+ token_pushback_ch(token_ch);
+ }
+ return;
+ } else {
+ m_token += token_ch;
+ if ((token_ch == '\"' || token_ch == '\'') && m_language->getParseStrings()) {
+ copy_string(token_ch);
+ } else if (multi->isOpenToken(token_ch)) {
+ m_open_token.push_back(token_ch);
+ } else if (multi->isCloseToken(token_ch)) {
+ if (m_open_token.size() == 0) {
+ throw error(token_stream_pos(), string("illegal closing '")+token_ch+"'");
+ } else {
+ char expected = multi->getCloseToken(m_open_token.back());
+ if (expected == token_ch) {
+ m_open_token.pop_back();
+ } else {
+ throw error(token_stream_pos(), string("illegal closing '")+token_ch+"', expected a closing '"+expected+"' first");
+ }
+ }
+ }
+ token_ch = token_read_char();
+ }
+ }
+ if (m_open_token.size() != 0) {
+ char expected = multi->getCloseToken(m_open_token.back());
+ throw error(token_stream_pos(), string("expected closing '")+expected+"'");
+ }
+}
+
+string& Tokenizer::next_continuous_string_excluding(const char* forbidden) throw(ParserError) {
+ undo_pushback_token();
+ m_token = "";
+ char token_ch = token_read_sig_char();
+ m_token_start = m_token_count;
+ if (m_token_at_end == 1) {
+ return m_token;
+ }
+ do {
+ if (token_ch == SPACE_CHAR) {
+ break;
+ } else {
+ if (str_contains(forbidden, token_ch)) {
+ m_token = "";
+ goto_position(m_token_start);
+ break;
+ } else {
+ m_token += token_ch;
+ token_ch = token_read_char();
+ }
+ }
+ } while (m_token_at_end == 0);
+ return m_token;
+}
+
+void Tokenizer::undo_pushback_token()
+{
+ if (m_token_has_pushback > 0) {
+ TokenAndPos& tkpos = m_pushback_tokens.back();
+ // cout << "goto position = " << tkpos.getPos() << endl;
+ goto_position(tkpos.getPos());
+ m_pushback_tokens.clear();
+ m_token_has_pushback = 0;
+ }
+}
+
+string& Tokenizer::next_multilevel_token() throw(ParserError) {
+ undo_pushback_token();
+ m_token = "";
+ char token_ch = token_read_sig_char();
+ m_token_start = m_token_count;
+ if (m_token_at_end == 1) {
+ return m_token;
+ }
+ TokenizerLanguageMultiLevel* multi = m_language->getMulti();
+ do {
+ if (multi->isEndToken(token_ch)) {
+ if (token_ch != SPACE_CHAR) {
+ token_pushback_ch(token_ch);
+ }
+ break;
+ } else {
+ m_token += token_ch;
+ if ((token_ch == '\"' || token_ch == '\'') && m_language->getParseStrings()) {
+ copy_string(token_ch);
+ // cout << "token: '" << m_token << "'" << endl;
+ } else if (multi->isOpenToken(token_ch)) {
+ /* Use subroutine for efficiency: */
+ /* no vector constructed if not multi-level */
+ multi_level_do_multi(token_ch);
+ break;
+ } else if (multi->isCloseToken(token_ch)) {
+ throw error(token_stream_pos(), string("illegal closing '")+token_ch+"'");
+ }
+ token_ch = token_read_char();
+ }
+ } while (m_token_at_end == 0);
+ return m_token;
+}
+
+void Tokenizer::on_trailing_space() {
+}
+
+void Tokenizer::goto_position(const TokenizerPos& pos) {
+ m_token_count = pos;
+ m_token_count.incCol(-1);
+ m_token_has_pushback_ch = 0;
+}
+
+string& Tokenizer::read_line() throw(ParserError) {
+ m_token = "";
+ while (m_token_has_pushback > 0) {
+ TokenAndPos& tkpos = m_pushback_tokens.back();
+ m_token += tkpos.getToken();
+ m_pushback_tokens.pop_back();
+ m_token_has_pushback--;
+ }
+ while (m_token_has_pushback_ch > 0) {
+ m_token += m_token_pushback_ch[--m_token_has_pushback_ch];
+ }
+ while (1) {
+ char ch = stream_get();
+ if (!stream_ok()) break;
+ if (ch == '\n') break;
+ m_token += ch;
+ }
+ return m_token;
+}
+
+void Tokenizer::read_number_term(char token_ch, bool has_e, bool sure_num) {
+ // token_ch is "decimal dot" or integer+e+"+/-", always add!
+ m_token += token_ch;
+ int count_exp = 0;
+ int count_num = 0;
+ if (!has_e) {
+ // token_ch is "decimal dot"
+ bool busy_main = true;
+ while (busy_main) {
+ token_ch = token_read_char();
+ // keep on reading numbers or "e/E"
+ if (token_ch == 'e' || token_ch == 'E') {
+ // should be number or "+/-"
+ char next_ch = token_read_char();
+ if ((next_ch < '0' || next_ch > '9') && next_ch != '+' && next_ch != '-') {
+ if (sure_num) {
+ throw error(token_stream_pos(), string("illegal character '")+next_ch+"' while reading exponent of floating point number");
+ } else {
+ token_pushback_ch(next_ch);
+ token_pushback_ch(token_ch);
+ return;
+ }
+ } else {
+ m_token += token_ch;
+ busy_main = false;
+ m_token += next_ch;
+ if (next_ch >= '0' && next_ch <= '9') {
+ count_exp = 1;
+ }
+ }
+ } else {
+ if (token_ch < '0' || token_ch > '9') {
+ if (token_ch == SPACE_CHAR) {
+ on_trailing_space();
+ return;
+ }
+ if (m_language->isSingleCharToken(token_ch)) {
+ token_pushback_ch(token_ch);
+ return;
+ }
+ if (count_num > 0) {
+ throw error(token_stream_pos(), string("illegal character '")+token_ch+"' while reading floating point number");
+ } else {
+ token_pushback_ch(token_ch);
+ return;
+ }
+ }
+ m_token += token_ch;
+ count_num++;
+ }
+ }
+ }
+ // read regular number, after the e+"+/-"
+ while (1) {
+ token_ch = token_read_char();
+ if (token_ch < '0' || token_ch > '9') {
+ if (count_exp == 0) {
+ throw error(token_stream_pos(), string("illegal character '")+token_ch+"' while reading exponent of floating point number");
+ }
+ if (token_ch == SPACE_CHAR) {
+ on_trailing_space();
+ return;
+ }
+ if (m_language->isSingleCharToken(token_ch)) {
+ token_pushback_ch(token_ch);
+ return;
+ }
+ throw error(token_stream_pos(), string("illegal character '")+token_ch+"' while in exponent of floating point number");
+ }
+ count_exp++;
+ m_token += token_ch;
+ }
+}
+
+void Tokenizer::next_token_and_pos(TokenAndPos& tkpos) throw(ParserError) {
+ get_check_token();
+ tkpos.setToken(m_token);
+ tkpos.setPos(m_token_start);
+ tkpos.setSpace(m_space_before);
+}
+
+void Tokenizer::pushback_token() {
+ m_pushback_tokens.push_back(TokenAndPos(m_token, m_token_start, m_space_before));
+ m_token_has_pushback++;
+}
+
+void Tokenizer::pushback_token(const TokenAndPos& tkpos) {
+ m_pushback_tokens.push_back(tkpos);
+ m_token_has_pushback++;
+}
+
+void Tokenizer::pushback_token(const string& token, const TokenizerPos& pos) {
+ m_pushback_tokens.push_back(TokenAndPos(token, pos, 0));
+ m_token_has_pushback++;
+}
+
+void Tokenizer::pushback_token(const string& token) {
+ pushback_token(token, m_token_start);
+}
+
+void Tokenizer::pushback_token(const char* token) {
+ pushback_token(string(token), m_token_start);
+}
+
+void Tokenizer::get_check_token() throw(ParserError) {
+ get_token();
+ if (m_token.length() == 0) {
+ throw eof_error();
+ }
+}
+
+void Tokenizer::peek_token(string* token) throw(ParserError) {
+ get_check_token();
+ pushback_token();
+ *token = m_token;
+}
+
+int Tokenizer::token_line() const {
+ return m_token_start.getLine();
+}
+
+int Tokenizer::token_column() const {
+ return m_token_start.getColumn();
+}
+
+void Tokenizer::set_line(int line) {
+ m_token_count.set_line(line);
+}
+
+void Tokenizer::inc_line() {
+ m_token_count.set_line(m_token_count.getLine()+1);
+}
+
+int Tokenizer::is_next_token(const char* token) throw(ParserError) {
+ get_token();
+ if (m_token.length() == 0) {
+ return m_token == token;
+ } else {
+ if (m_token == token) {
+ return 1;
+ }
+ pushback_token();
+ return 0;
+ }
+}
+
+int Tokenizer::is_next_token_i(const char* token) throw(ParserError) {
+ get_token();
+ if (m_token.length() == 0) {
+ return m_token == token;
+ } else {
+ if (str_i_equals(m_token.c_str(), token)) {
+ return 1;
+ }
+ pushback_token();
+ return 0;
+ }
+}
+
+int Tokenizer::is_next_token_in(const char* charlist) throw(ParserError) {
+ get_check_token();
+ if (m_token.length() == 1) {
+ char ch = m_token[0];
+ if (strcontains(charlist, ch)) return ch;
+ }
+ pushback_token();
+ return -1;
+}
+
+int Tokenizer::ensure_next_token_in(const char* charlist) throw(ParserError) {
+ get_check_token();
+ if (m_token.length() == 1) {
+ char ch = m_token[0];
+ if (strcontains(charlist, ch)) return ch;
+ }
+ throw error(string("expected one of '") + charlist + "', found '" + m_token + "'");
+}
+
+void Tokenizer::ensure_next_token(const char* token) throw(ParserError) {
+ get_check_token();
+ if (m_token != token) {
+ throw error(string("expected '") + token + "', found '" + m_token + "'");
+ }
+}
+
+void Tokenizer::ensure_next_token_i(const char* token) throw(ParserError) {
+ get_check_token();
+ if (!str_i_equals(m_token.c_str(), token)) {
+ throw error(string("expected '") + token + "', found '" + m_token + "'");
+ }
+}
+
+void Tokenizer::ensure_next_token_list(const char* charlist) throw(ParserError) {
+ char err = 0;
+ int len = strlen(charlist);
+ TokenizerPos start = m_token_start;
+ for (int i = 0; i < len; i++) {
+ get_check_token();
+ if (m_token.length() != 1) {
+ err = 1;
+ break;
+ } else {
+ char ch = m_token[0];
+ if (ch != charlist[i]) {
+ err = 1;
+ break;
+ }
+ }
+ }
+ if (err == 1) {
+ throw error(start, string("expected ") + charlist);
+ }
+}
+
+char Tokenizer::token_read_sig_char() throw(ParserError) {
+ char token_ch;
+ while (1) {
+ do {
+ token_ch = token_read_char();
+ if (m_token_at_end == true) {
+ return SPACE_CHAR;
+ }
+ if (token_ch == SPACE_CHAR) {
+ m_space_before = true;
+ }
+ } while (token_ch == SPACE_CHAR);
+ if (m_language->isLineCommentToken(token_ch)) {
+ m_space_before = true;
+ token_skip_to_end();
+ } else if (token_ch == '/') {
+ char next_token_ch = token_read_char();
+ if (next_token_ch == '/' && m_language->isEnableCPPComment()) {
+ m_space_before = true;
+ token_skip_to_end();
+ } else if (next_token_ch == '*' && m_language->isEnableCComment()) {
+ m_space_before = true;
+ read_till_close_comment();
+ } else {
+ token_pushback_ch(next_token_ch);
+ return token_ch;
+ }
+ } else {
+ return token_ch;
+ }
+ }
+}
+
+char Tokenizer::token_read_char() {
+ if (m_token_has_pushback_ch > 0) {
+ return m_token_pushback_ch[--m_token_has_pushback_ch];
+ }
+ while (1) {
+ char ch = stream_get();
+ if (stream_ok()) {
+ if (ch == '\t') m_token_count.incTab();
+ else m_token_count.incCol();
+ if (ch == '\n') m_token_count.incRow();
+ if (m_language->isLineCommentToken(ch)) {
+ token_skip_to_end();
+ return SPACE_CHAR;
+ }
+ if (m_language->isSpaceToken(ch)) {
+ return SPACE_CHAR;
+ } else {
+ return ch;
+ }
+ } else {
+ if (m_token_at_end == 0) {
+ m_token_count.incCol();
+ }
+ m_token_at_end = 1;
+ return SPACE_CHAR;
+ }
+ }
+}
+
+char Tokenizer::token_read_char_no_comment() {
+ if (m_token_has_pushback_ch > 0) {
+ return m_token_pushback_ch[--m_token_has_pushback_ch];
+ }
+ while (1) {
+ char ch = stream_get();
+ if (stream_ok()) {
+ if (ch == '\t') m_token_count.incTab();
+ else m_token_count.incCol();
+ if (ch == '\n') m_token_count.incRow();
+ if (m_language->isSpaceToken(ch)) {
+ return SPACE_CHAR;
+ } else {
+ return ch;
+ }
+ } else {
+ if (m_token_at_end == 0) {
+ m_token_count.incCol();
+ }
+ m_token_at_end = 1;
+ return SPACE_CHAR;
+ }
+ }
+}
+
+void Tokenizer::token_skip_to_end() {
+ while (1) {
+ char ch = stream_get();
+ if (stream_ok()) {
+ m_token_count.incCol();
+ if (ch == '\n') {
+ m_token_count.incRow();
+ if (!m_language->isSpaceToken('\n')) token_pushback_ch('\n');
+ return;
+ }
+ } else {
+ m_token_at_end = 1;
+ return;
+ }
+ }
+}
+
+void Tokenizer::read_till_close_comment() throw(ParserError) {
+ TokenizerPos start = m_token_count;
+ int prev_ch = 0;
+ while (1) {
+ int token_ch = token_read_char();
+ if (prev_ch == '*' && token_ch == '/') {
+ return;
+ }
+ if (m_token_at_end == 1) {
+ start.incCol(-1);
+ throw error(start, "comment block '/*' not terminated");
+ }
+ prev_ch = token_ch;
+ }
+}
+
+ParserError Tokenizer::throwError(const char* s1, const char* s2, const char* s3) {
+ return error(s1, s2, s3);
+}
+
+ParserError Tokenizer::throwError(int pos, const string& msg) {
+ return error(pos, msg);
+}
+
+ParserError Tokenizer::throwError(const string& msg) {
+ return error(msg);
+}
+
+int Tokenizer::getErrorPosition() const {
+ return token_pos_col();
+}
+
+ParserError Tokenizer::error(const char* s1, const char* s2, const char* s3) const {
+ ostringstream err;
+ err << s1 << s2 << s3;
+ return error(err.str());
+}
+
+ParserError Tokenizer::error(const string& src) const {
+ ParserError err(src, token_pos(), m_fname);
+ const char* parse_str = parse_string_in_error();
+ if (parse_str != NULL) err.setParserString(parse_str);
+ return err;
+}
+
+ParserError Tokenizer::error(const TokenizerPos& pos, const string& src) const {
+ ParserError err(src, pos, m_fname);
+ const char* parse_str = parse_string_in_error();
+ if (parse_str != NULL) err.setParserString(parse_str);
+ return err;
+}
+
+ParserError Tokenizer::eof_error() const {
+ ParserError err("unexpected end of file", token_pos(), m_fname);
+ err.setFlag(TOK_PARSER_ERROR_ATEND);
+ const char* parse_str = parse_string_in_error();
+ if (parse_str != NULL) err.setParserString(parse_str);
+ return err;
+}
+
+const char* Tokenizer::parse_string_in_error() const {
+ return NULL;
+}
+
+ParserError Tokenizer::error(int column, const string& src) const {
+ TokenizerPos pos;
+ pos.set(-1, column);
+ return ParserError(src, pos, m_fname);
+}
+
+StreamTokenizer::StreamTokenizer() : Tokenizer() {
+ m_fb = NULL;
+ m_is = NULL;
+}
+
+StreamTokenizer::StreamTokenizer(TokenizerLanguage* lang) : Tokenizer(lang) {
+ m_fb = NULL;
+ m_is = NULL;
+}
+
+StreamTokenizer::StreamTokenizer(istream* _is) : Tokenizer(), m_is(_is) {
+ m_fb = NULL;
+}
+
+StreamTokenizer::StreamTokenizer(istream* _is, TokenizerLanguage* lang) : Tokenizer(lang), m_is(_is) {
+ m_fb = NULL;
+}
+
+StreamTokenizer::~StreamTokenizer() {
+ close_tokens();
+}
+
+void StreamTokenizer::open_tokens(const char* fname) throw(ParserError) {
+ m_fb = new filebuf();
+ m_fb->open(fname, ios::in);
+ if (!m_fb->is_open()) {
+ ostringstream err_str;
+ err_str << "can't open: '" << fname << "': ";
+ str_get_system_error(err_str);
+ throw error(err_str.str());
+ }
+ m_fname = fname;
+ m_is = new istream(m_fb);
+}
+
+void StreamTokenizer::open_tokens(const string& fname) throw(ParserError) {
+ open_tokens(fname.c_str());
+}
+
+void StreamTokenizer::open_tokens(istream* strm, const char* fname) {
+ m_fb = NULL;
+ m_is = strm;
+ m_fname = fname;
+}
+
+void StreamTokenizer::close_tokens() {
+ if (m_fb != NULL) {
+ m_fb->close();
+ delete m_fb;
+ m_fb = NULL;
+ delete m_is;
+ m_is = NULL;
+ }
+}
+
+int StreamTokenizer::stream_ok() {
+ return m_is->good();
+}
+
+int StreamTokenizer::stream_get() {
+ return m_is->get();
+}
+
+StringTokenizer::StringTokenizer(bool show_str_err) : Tokenizer() {
+ init_st();
+ m_token_count.set_line(0);
+ m_show_str_err = show_str_err;
+}
+
+StringTokenizer::StringTokenizer(TokenizerLanguage* lang, bool show_str_err) : Tokenizer(lang) {
+ init_st();
+ m_token_count.set_line(0);
+ m_show_str_err = show_str_err;
+}
+
+StringTokenizer::StringTokenizer(const char* tokens) {
+ init_st(tokens);
+ m_token_count.set_line(0);
+ m_show_str_err = true;
+}
+
+StringTokenizer::StringTokenizer(const char* tokens, TokenizerLanguage* lang) : Tokenizer(lang) {
+ init_st(tokens);
+ m_token_count.set_line(0);
+ m_show_str_err = true;
+}
+
+StringTokenizer::~StringTokenizer() {
+}
+
+void StringTokenizer::init_st() {
+ m_tokens = NULL;
+ m_len = 0;
+ m_pos = -1;
+}
+
+void StringTokenizer::init_st(const char* tokens) {
+ m_tokens = tokens;
+ m_len = strlen(tokens);
+ m_pos = -1;
+}
+
+void StringTokenizer::set_string(const char* tokens) {
+ init_st(tokens);
+ reset_nopos();
+ m_token_count.set_col(0);
+}
+
+void StringTokenizer::set_string(const string& tokens) {
+ init_st(tokens.c_str());
+ reset_nopos();
+ m_token_count.set_col(0);
+}
+
+int StringTokenizer::stream_ok() {
+ return (int)(m_pos < m_len);
+}
+
+int StringTokenizer::stream_get() {
+ m_pos++;
+ return m_pos < m_len ? m_tokens[m_pos] : ' ';
+}
+
+const char* StringTokenizer::parse_string_in_error() const {
+ if (m_show_str_err) return m_tokens;
+ else return NULL;
+}
+
+void StringTokenizer::goto_position(const TokenizerPos& pos) {
+ Tokenizer::goto_position(pos);
+ int offs = 0;
+ for (int idx = 0; idx < m_len; idx++) {
+ char ch = m_tokens[idx];
+ if (ch == '\t') {
+ offs = (offs/8 + 1)*8;
+ } else {
+ offs++;
+ }
+ if (offs == pos.getColumn() - 1) {
+ m_pos = idx;
+ if (m_pos < m_len) {
+ m_token_at_end = 0;
+ }
+ break;
+ }
+ }
+}
+
+TokenizerLanguagePtr g_SpaceLang;
+
+TokenizerLanguage* createSpaceLanguage() {
+ if (g_SpaceLang.isNull()) {
+ g_SpaceLang = new TokenizerLanguage();
+ g_SpaceLang->setSpaceTokens(" ,\t\r\n");
+ }
+ return g_SpaceLang.get();
+}
+
+SpaceStringTokenizer::SpaceStringTokenizer(const char* tokens) : StringTokenizer(tokens, createSpaceLanguage()) {
+}
+
+SpaceStringTokenizer::~SpaceStringTokenizer() {
+}
+
+MyOutputFile::MyOutputFile() {
+ m_OS = NULL;
+}
+
+MyOutputFile::~MyOutputFile() {
+ close();
+}
+
+void MyOutputFile::open(const char* fname) {
+ close();
+ m_FB.open(fname, ios::out);
+ m_OS = new ostream(&m_FB);
+}
+
+void MyOutputFile::open(const string& fname) {
+ close();
+ m_FB.open(fname.c_str(), ios::out);
+ m_OS = new ostream(&m_FB);
+}
+
+void MyOutputFile::close() {
+ if (m_OS != NULL) {
+ m_FB.close();
+ delete m_OS;
+ m_OS = NULL;
+ }
+}
+
diff --git a/src/gle/tokens/Tokenizer.h b/src/gle/tokens/Tokenizer.h
new file mode 100644
index 0000000..6354df3
--- /dev/null
+++ b/src/gle/tokens/Tokenizer.h
@@ -0,0 +1,527 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#ifndef TOKENIZER_H
+#define TOKENIZER_H
+
+#include <string>
+#include <vector>
+#include <iostream>
+#include <fstream>
+
+#include <stdarg.h>
+
+#include "RefCount.h"
+#include "CharBitMap.h"
+#include "StringKeyHash.h"
+
+#define TOKENIZER_LANG_NONE -1
+
+int strcontains(const char* str, char ch);
+
+int strposition(const char* str, char ch);
+
+bool is_float(const string& strg);
+
+void strip_string_markers(string& strg);
+
+ostream& mtab(ostream &os, int nb);
+
+class TokenizerPos {
+private:
+ int m_col;
+ int m_line;
+public:
+ TokenizerPos();
+ TokenizerPos(const TokenizerPos& pos);
+ void set(int line, int column);
+ void set_line(int line);
+ void set_col(int column);
+ bool isValid() const;
+ inline int getColumn() const { return m_col; };
+ inline void setColumn(int col) { m_col = col; };
+ inline int getLine() const { return m_line; };
+ inline void incCol(int nb) { m_col += nb; };
+ inline void incCol() { m_col ++; };
+ inline void incTab() { m_col = (m_col/8 + 1)*8; };
+ void incRow();
+ string getString(int tab1, int tab2) const;
+ ostream& write(ostream &os) const;
+ int equals(TokenizerPos& pos) const;
+};
+
+inline ostream& operator<<(ostream& os, const TokenizerPos& pos) {
+ return pos.write(os);
+}
+
+#define TOK_PARSER_ERROR_PSTRING 1
+#define TOK_PARSER_ERROR_ATEND 2
+
+class ParserError {
+private:
+ int m_flag;
+ string m_txt;
+ string m_fname;
+ string m_parsestr;
+ TokenizerPos m_pos;
+public:
+ ParserError(const string& txt, const TokenizerPos& pos, const char* fname);
+ ParserError(const ParserError& err);
+ ostream& write(ostream& os) const;
+ void toString(string& str) const;
+ void setParserString(const char* str);
+ void setParserString(const string& str);
+ int equals(ParserError* err) const;
+ inline const string& msg() const { return m_txt; }
+ inline const string& file() const { return m_fname; }
+ inline int getColumn() { return m_pos.getColumn(); };
+ inline void setColumn(int col) { m_pos.setColumn(col); };
+ inline void incColumn(int nb) { m_pos.incCol(nb); };
+ inline void setMessage(const string& msg) { m_txt = msg; };
+ inline bool hasFlag(int flag) { return (m_flag & flag) != 0; };
+ inline void setFlag(int flag) { m_flag |= flag; }
+ inline const string& getParserString() { return m_parsestr; }
+};
+
+inline ostream& operator<<(ostream& os,const ParserError& err) {
+ return err.write(os);
+}
+
+class IThrowsError {
+public:
+ IThrowsError();
+ virtual ~IThrowsError();
+
+ virtual ParserError throwError(int pos, const string& error);
+ virtual ParserError throwError(const char* s1, const char* s2, const char* s3);
+ virtual ParserError throwError(const string& error);
+ virtual int getErrorPosition() const;
+};
+
+IThrowsError* g_get_throws_error();
+
+double tokenizer_string_to_double(const char* value) throw(ParserError);
+
+#if defined(__UNIX__)
+ ParserError g_format_parser_error(const char* format, ...);
+#else
+ ParserError g_format_parser_error(va_list format, ...);
+#endif
+
+void g_throw_parser_error(const string& err) throw(ParserError);
+
+void g_throw_parser_error(const char* err, int idx) throw(ParserError);
+
+void g_throw_parser_error(const char* str1, const char* str2, const char* str3) throw(ParserError);
+
+void g_throw_parser_error_sys(const char* str1, const char* str2 = NULL, const char* str3 = NULL) throw(ParserError);
+
+#define MAX_PUSHBACK_CH 2
+
+class Tokenizer;
+
+class TokenizerLangElem : public RefCountObject {
+protected:
+ string m_name;
+public:
+ inline void addName(string& add) { m_name += add; };
+ inline const string& getName() const { return m_name; };
+ inline int length() const { return m_name.length(); };
+};
+
+class TokenizerLangHash;
+
+class TokenizerLangHashPtr : public RefCountPtr<TokenizerLangHash> {
+ public:
+ inline ostream& write(ostream &os, int tab) const;
+ inline void addLangElem(Tokenizer* tokens, TokenizerLangElem* elem);
+ inline void addLangElem(const vector<string>& toks,
+ TokenizerLangElem* elem,
+ unsigned int pos);
+ inline TokenizerLangHashPtr(const string& name);
+ inline TokenizerLangHashPtr(TokenizerLangHash* src);
+ inline TokenizerLangHashPtr();
+};
+
+class TokenizerLangHash : public StringKeyHash<TokenizerLangHashPtr>, public RefCountObject {
+private:
+ MutableRefCountPtr<TokenizerLangElem> m_default;
+public:
+ TokenizerLangHash();
+ TokenizerLangHash(const string& name);
+ ~TokenizerLangHash();
+ ostream& write(ostream &os, int depth) const;
+ void addLangElem(Tokenizer* tokens, TokenizerLangElem* elem);
+ void addLangElem(const vector<string>& toks,
+ TokenizerLangElem* elem,
+ unsigned int pos);
+ inline int hasDefault() const { return !m_default.isNull(); };
+ inline TokenizerLangElem* getDefault() const { return m_default.get(); };
+};
+
+typedef TokenizerLangElem* TokLangElemPtr;
+
+typedef TokenizerLangHash* TokLangHashPtr;
+
+class TokenizerLanguageMultiLevel : public RefCountObject {
+private:
+ char m_open_tokens[255];
+ CharBitMap m_close_tokens;
+ CharBitMap m_end_tokens;
+public:
+ TokenizerLanguageMultiLevel();
+ void setOpenClose(char open, char close);
+ inline void setEndToken(char end) { m_end_tokens.set(end); };
+ inline void resetEndToken(char end) { m_end_tokens.reset(end); };
+ inline bool isOpenToken(char tok) { return m_open_tokens[(int)tok] != 0; }
+ inline char getCloseToken(char tok) { return m_open_tokens[(int)tok]; }
+ inline bool isCloseToken(char tok) { return m_close_tokens.get(tok); }
+ inline bool isEndToken(char tok) { return m_end_tokens.get(tok); }
+
+};
+
+class TokenizerLanguage : public RefCountObject {
+private:
+ char m_decimal_dot;
+ int m_enable_c_comm;
+ int m_enable_cpp_comm;
+ int m_parse_strings;
+ CharBitMap m_one_char_tokens;
+ CharBitMap m_space_tokens;
+ CharBitMap m_line_comment_tokens;
+ vector<TokenizerLangHashPtr> m_sublanguage;
+ TokLangElemPtr* m_index;
+ RefCountPtr<TokenizerLanguageMultiLevel> m_multi;
+public:
+ TokenizerLanguage();
+ ~TokenizerLanguage();
+ void addSubLanguages(int nb);
+ void addLanguageElem(int sublang, const char* elem);
+ void addLanguageElem(int sublang, const vector<string>& toks, TokenizerLangElem* elem);
+ void addElementIndex(int size);
+ void setElement(int i, TokenizerLangElem* elem);
+ void resetCharMaps();
+ inline int getParseStrings() const {return m_parse_strings;}
+ inline void setParseStrings(int ps) {m_parse_strings=ps;}
+ inline TokenizerLangElem* getElement(int i) { return m_index[i]; };
+ inline int isDecimalDot(char ch) const {return m_decimal_dot && (ch==m_decimal_dot);}
+ inline char getDecimalDot() const {return m_decimal_dot;}
+ inline void setDecimalDot(char ch) {m_decimal_dot=ch;}
+ inline int isSingleCharToken(char ch) const { return m_one_char_tokens.get(ch); };
+ inline void setSingleCharTokens(const char* sct) { m_one_char_tokens.set(sct); };
+ inline int isSpaceToken(char ch) const { return m_space_tokens.get(ch); };
+ inline void setSpaceTokens(const char* sct) { m_space_tokens.set(sct); };
+ inline int isLineCommentToken(char ch) const { return m_line_comment_tokens.get(ch); };
+ inline void setLineCommentTokens(const char* sct) { m_line_comment_tokens.set(sct); };
+ inline int isEnableCComment() const { return m_enable_c_comm; };
+ inline int isEnableCPPComment() const { return m_enable_cpp_comm; };
+ inline void enableCComment() { m_enable_c_comm = 1; };
+ inline void enableCPPComment() { m_enable_cpp_comm = 1; };
+ inline TokenizerLangHashPtr getLanguage(int i) const { return m_sublanguage[i];};
+ inline void setMulti(TokenizerLanguageMultiLevel* multi) { m_multi = multi; };
+ inline TokenizerLanguageMultiLevel* getMulti() { return m_multi.get(); }
+ void initDefault();
+ void initDefaultSingleCharTokens();
+ void initDefaultSpaceTokens();
+};
+
+typedef MutableRefCountPtr<TokenizerLanguage> TokenizerLanguagePtr;
+
+class TokenAndPos {
+protected:
+ bool m_space;
+ string m_token;
+ TokenizerPos m_pos;
+public:
+ TokenAndPos();
+ TokenAndPos(const TokenAndPos& copy);
+ TokenAndPos(const string& token, const TokenizerPos& pos, char space);
+ ~TokenAndPos();
+ inline const string& getToken() const { return m_token; };
+ inline const TokenizerPos& getPos() const { return m_pos; };
+ inline bool getSpace() const { return m_space; };
+ inline void setSpace(bool space) { m_space = space; };
+ inline void setToken(const string& token) { m_token = token; };
+ inline void setPos(const TokenizerPos& pos) { m_pos = pos; };
+};
+
+class Tokenizer : public IThrowsError {
+protected:
+ const char* m_fname;
+ string m_token;
+ int m_token_at_end;
+ int m_token_has_pushback;
+ int m_token_has_pushback_ch;
+ bool m_space_before;
+ bool m_space_after;
+ TokenizerPos m_token_start;
+ TokenizerPos m_token_count;
+ TokenizerLangHashPtr m_langhash;
+ TokenizerLanguage* m_language;
+ vector<TokenAndPos> m_pushback_tokens;
+ char m_token_pushback_ch[MAX_PUSHBACK_CH];
+public:
+ Tokenizer();
+ Tokenizer(TokenizerLanguage* lang);
+ virtual ~Tokenizer();
+
+ int has_more_tokens() throw(ParserError);
+ // end of stream not reached
+
+ string& next_token() throw(ParserError);
+ // returns next token. throws exception if no more tokens.
+
+ string& next_continuous_string_excluding(const char* forbidden) throw(ParserError);
+
+ string& try_next_token() throw(ParserError);
+
+ string& read_line() throw(ParserError);
+
+ double next_double() throw(ParserError);
+
+ int next_integer() throw(ParserError);
+ // reads an integer token. throws exception if token is not
+ // an integer
+
+ int try_next_integer(int *i);
+ // gets an integer token in [*i] and returns 1 or returns 0 if
+ // next token is not an integer
+
+ TokenizerLanguage* get_language();
+
+ void delete_language();
+
+ void select_language(int i);
+
+ TokenizerLangElem* try_find_lang_elem(int i);
+
+ void next_token_and_pos(TokenAndPos& tkpos) throw(ParserError);
+
+ void pushback_token();
+
+ void pushback_token(const TokenAndPos& tkpos);
+
+ void pushback_token(const string& token, const TokenizerPos& pos);
+
+ void pushback_token(const string& token);
+
+ void pushback_token(const char* token);
+
+ void peek_token(string* token) throw(ParserError);
+ // look at next token without moving the current token pointer
+
+ bool has_space_before() const { return m_space_before; };
+
+ int token_line() const;
+ // current line number
+
+ int token_column() const;
+ // current column number
+
+ void set_line(int line);
+
+ void inc_line();
+
+ inline const TokenizerPos& token_pos() const { return m_token_start; };
+
+ inline int token_pos_col() const { return m_token_start.getColumn(); };
+
+ inline const TokenizerPos& token_stream_pos() const { return m_token_count; };
+
+ int is_next_token(const char* token) throw(ParserError);
+
+ int is_next_token_i(const char* token) throw(ParserError);
+
+ int is_next_token(const string& token) throw(ParserError) {
+ return is_next_token(token.c_str());
+ }
+ // checks wether next token is [token]. if so, the token is
+ // consumed (current token pointer moved). Otherwise,
+ // the next token is not consumed.
+
+ int is_next_token_in(const char* charlist) throw(ParserError);
+
+ void ensure_next_token(const char* token) throw(ParserError);
+ // ensures the next token is [token] and moves current token pointer
+ // raises exception if next token is not [token]
+
+ void ensure_next_token_i(const char* token) throw(ParserError);
+
+ int ensure_next_token_in(const char* charlist) throw(ParserError);
+ // reads a one-character token occurring in charlist.
+ // raises exception when the next token is not as expected.
+
+ void ensure_next_token_list(const char* charlist) throw(ParserError);
+ // reads a list of one-character tokens
+
+ void token_skip_to_end();
+ // skips to end of line
+
+ void read_till_close_comment() throw(ParserError);
+
+ string& next_multilevel_token() throw(ParserError);
+
+ virtual char token_read_sig_char() throw(ParserError);
+
+ virtual void on_trailing_space();
+
+ char token_read_char();
+
+ char token_read_char_no_comment();
+
+ void read_number_term(char token_ch, bool has_e, bool sure_num);
+
+ virtual int stream_ok() = 0;
+
+ virtual int stream_get() = 0;
+
+ virtual void goto_position(const TokenizerPos& pos);
+
+ inline void set_fname(const char* fname) { m_fname = fname; };
+
+ inline void set_fname(const string& fname) { m_fname = fname.c_str(); };
+
+ inline const char* get_fname() { return m_fname; };
+
+ inline void token_pushback_ch(char ch) {
+ m_token_pushback_ch[m_token_has_pushback_ch++] = ch;
+ }
+
+ virtual ParserError throwError(const char* s1, const char* s2, const char* s3);
+
+ virtual ParserError throwError(int pos, const string& error);
+
+ virtual ParserError throwError(const string& error);
+
+ virtual int getErrorPosition() const;
+
+ ParserError error(const string& src) const;
+
+ ParserError error(const char* s1, const char* s2, const char* s3) const;
+
+ ParserError error(const TokenizerPos& pos, const string& src) const;
+
+ ParserError error(int column, const string& src) const;
+
+ ParserError eof_error() const;
+
+ virtual const char* parse_string_in_error() const;
+
+protected:
+ void init();
+ void reset_position();
+ void reset_nopos();
+ void reset_all();
+ void undo_pushback_token();
+ void copy_string(char endch) throw(ParserError);
+ void multi_level_do_multi(char open) throw(ParserError);
+ void get_token() throw(ParserError);
+ // consumes one token (and forgets it?)
+ // raises exception when e.g. a string constant is not terminated.
+ void get_token_2() throw(ParserError);
+ void get_check_token() throw(ParserError);
+ TokenizerLangElem* findLangElem(const TokenizerLangHash* hash);
+ TokenizerLangElem* findLangElem2(const TokenizerLangHash* hash);
+};
+
+class StreamTokenizer : public Tokenizer {
+protected:
+ filebuf* m_fb;
+ istream* m_is;
+public:
+ StreamTokenizer();
+ StreamTokenizer(TokenizerLanguage* lang);
+ StreamTokenizer(istream* _is);
+ StreamTokenizer(istream* _is, TokenizerLanguage* lang);
+ virtual ~StreamTokenizer();
+ void open_tokens(const char* fname) throw(ParserError);
+ void open_tokens(const string& fname) throw(ParserError);
+ void open_tokens(istream* strm, const char* fname);
+ void close_tokens();
+ virtual int stream_ok();
+ virtual int stream_get();
+ inline istream* getStream() { return m_is; };
+};
+
+class StringTokenizer : public Tokenizer {
+protected:
+ const char* m_tokens;
+ int m_len;
+ int m_pos;
+ bool m_show_str_err;
+protected:
+ void init_st();
+ void init_st(const char* tokens);
+public:
+ StringTokenizer(bool show_str_err = true);
+ StringTokenizer(TokenizerLanguage* lang, bool show_str_err = true);
+ StringTokenizer(const char* tokens);
+ StringTokenizer(const char* tokens, TokenizerLanguage* lang);
+ virtual ~StringTokenizer();
+ void set_string(const char* tokens);
+ void set_string(const string& tokens);
+ virtual int stream_ok();
+ virtual int stream_get();
+ virtual void goto_position(const TokenizerPos& pos);
+ virtual const char* parse_string_in_error() const;
+ inline void setShowStringInError(bool show) { m_show_str_err = show; }
+};
+
+class SpaceStringTokenizer : public StringTokenizer {
+public:
+ SpaceStringTokenizer(const char* tokens);
+ virtual ~SpaceStringTokenizer();
+};
+
+class MyOutputFile {
+protected:
+ filebuf m_FB;
+ ostream* m_OS;
+public:
+ MyOutputFile();
+ ~MyOutputFile();
+ void open(const char* fname);
+ void open(const string& fname);
+ void close();
+ inline ostream& get() { return *m_OS; }
+ inline int isOpen() { return m_OS != NULL; }
+};
+
+#include "Tokenizer.i"
+
+#endif
diff --git a/src/gle/tokens/Tokenizer.i b/src/gle/tokens/Tokenizer.i
new file mode 100644
index 0000000..f2f108b
--- /dev/null
+++ b/src/gle/tokens/Tokenizer.i
@@ -0,0 +1,58 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+inline ostream& TokenizerLangHashPtr::write(ostream &os, int tab) const {
+ return get()->write(os,tab);
+}
+inline void TokenizerLangHashPtr::addLangElem(Tokenizer* tokens, TokenizerLangElem* elem) {
+ GetPtr()->addLangElem(tokens,elem);
+}
+
+inline void TokenizerLangHashPtr::addLangElem(const vector<string>& toks, TokenizerLangElem* elem, unsigned int pos) {
+ GetPtr()->addLangElem(toks,elem,pos);
+}
+
+inline TokenizerLangHashPtr::TokenizerLangHashPtr(TokenizerLangHash* src)
+ : RefCountPtr<TokenizerLangHash>(src) {}
+
+inline TokenizerLangHashPtr::TokenizerLangHashPtr() {}
+
+inline TokenizerLangHashPtr::TokenizerLangHashPtr(const string& name) {
+ SetPtr(new TokenizerLangHash(name));
+}
+
diff --git a/src/gle/tokens/files.txt b/src/gle/tokens/files.txt
new file mode 100644
index 0000000..d62ba03
--- /dev/null
+++ b/src/gle/tokens/files.txt
@@ -0,0 +1,53 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+#
+# files list for GLE to be included by the makefiles
+#
+
+INCLUDES = \
+RefCount.h \
+StringKeyHash.h \
+CharBitMap.h \
+Tokenizer.h \
+Tokenizer.i
+
+OBJECTS = \
+Tokenizer.$(OBJ_SUFF) \
+StringKeyHash.$(OBJ_SUFF) \
+BinIO.$(OBJ_SUFF)
diff --git a/src/gle/tokens/stokenizer.h b/src/gle/tokens/stokenizer.h
new file mode 100644
index 0000000..dc94803
--- /dev/null
+++ b/src/gle/tokens/stokenizer.h
@@ -0,0 +1,259 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#include <ctype.h>
+
+/*
+ * A simple tokenizer
+ */
+
+enum empty_token_policy { drop_empty_tokens, keep_empty_tokens };
+
+class char_separator {
+public:
+ explicit char_separator(const char* dropped_delims,
+ const char* kept_delims = 0,
+ empty_token_policy empty_tokens = drop_empty_tokens)
+ : m_dropped_delims(dropped_delims),
+ m_use_ispunct(false),
+ m_use_isspace(false),
+ m_empty_tokens(empty_tokens),
+ m_output_done(false) {
+ if (kept_delims) m_kept_delims = kept_delims;
+ }
+
+ explicit char_separator()
+ : m_use_ispunct(true),
+ m_use_isspace(true),
+ m_empty_tokens(drop_empty_tokens) {
+ }
+
+ bool next(string::const_iterator& next, string::const_iterator& end, string& tok) {
+ tok = "";
+ // skip past all dropped_delims
+ if (m_empty_tokens == drop_empty_tokens) {
+ for (; next != end && is_dropped(*next); ++next) {
+ }
+ }
+ if (m_empty_tokens == drop_empty_tokens) {
+ if (next == end) return false;
+ // if we are on a kept_delims move past it and stop
+ if (is_kept(*next)) {
+ tok += *next;
+ ++next;
+ } else {
+ // append all the non delim characters
+ for (; next != end && !is_dropped(*next) && !is_kept(*next); ++next)
+ tok += *next;
+ }
+ } else { // m_empty_tokens == keep_empty_tokens
+ // Handle empty token at the end
+ if (next == end) {
+ if (m_output_done == false) {
+ m_output_done = true;
+ return true;
+ } else {
+ return false;
+ }
+ }
+ if (is_kept(*next)) {
+ if (m_output_done == false) {
+ m_output_done = true;
+ } else {
+ tok += *next;
+ ++next;
+ m_output_done = false;
+ }
+ } else if (m_output_done == false && is_dropped(*next)) {
+ m_output_done = true;
+ } else {
+ if (is_dropped(*next)) ++next;
+ for (; next != end && !is_dropped(*next) && !is_kept(*next); ++next)
+ tok += *next;
+ m_output_done = true;
+ }
+ }
+ return true;
+ }
+
+private:
+ string m_kept_delims;
+ string m_dropped_delims;
+ bool m_use_ispunct;
+ bool m_use_isspace;
+ empty_token_policy m_empty_tokens;
+ bool m_output_done;
+
+ bool is_kept(char E) const {
+ if (m_kept_delims.length()) {
+ return m_kept_delims.find(E) != string::npos;
+ } else if (m_use_ispunct) {
+ return ispunct(E) != 0;
+ } else {
+ return false;
+ }
+ }
+
+ bool is_dropped(char E) const {
+ if (m_dropped_delims.length()) {
+ return m_dropped_delims.find(E) != string::npos;
+ } else if (m_use_isspace) {
+ return isspace(E) != 0;
+ } else {
+ return false;
+ }
+ }
+};
+
+class level_char_separator {
+public:
+ explicit level_char_separator(const char* dropped_delims,
+ const char* kept_delims,
+ const char* level_up,
+ const char* level_down)
+ : m_dropped_delims(dropped_delims),
+ m_kept_delims(kept_delims),
+ m_level_up_delims(level_up),
+ m_level_down_delims(level_down) {
+ }
+
+ bool next(string::const_iterator& next, string::const_iterator& end, string& tok) {
+ tok = "";
+ while (next != end && is_dropped(*next)) {
+ ++next;
+ }
+ if (next == end) return false;
+ if (is_kept(*next)) {
+ tok += *next;
+ ++next;
+ } else {
+ // append all the non delim characters
+ int level = 0;
+ while (next != end) {
+ if (level == 0) {
+ if (is_dropped(*next) || is_kept(*next)) break;
+ if (is_level_up(*next)) level++;
+ tok += *next;
+ } else {
+ if (is_level_down(*next)) level--;
+ else if (is_level_up(*next)) level++;
+ tok += *next;
+ }
+ ++next;
+ }
+ }
+ return true;
+ }
+
+private:
+ string m_dropped_delims;
+ string m_kept_delims;
+ string m_level_up_delims;
+ string m_level_down_delims;
+
+ bool is_level_up(char E) const {
+ return m_level_up_delims.find(E) != string::npos;
+ }
+
+ bool is_level_down(char E) const {
+ return m_level_down_delims.find(E) != string::npos;
+ }
+
+ bool is_kept(char E) const {
+ if (m_kept_delims.length()) {
+ return m_kept_delims.find(E) != string::npos;
+ } else {
+ return false;
+ }
+ }
+
+ bool is_dropped(char E) const {
+ if (m_dropped_delims.length()) {
+ return m_dropped_delims.find(E) != string::npos;
+ } else {
+ return false;
+ }
+ }
+};
+
+// A view of a tokenized "sequence"
+template < typename TokenizerFunc = char_separator > class tokenizer {
+public:
+ tokenizer(const string& input, TokenizerFunc& token_func) : m_token_func(token_func) {
+ m_input = input;
+ m_current = m_input.begin();
+ m_end = m_input.end();
+ m_more = m_token_func.next(m_current, m_end, m_next_token);
+ }
+
+ tokenizer(TokenizerFunc& token_func) : m_token_func(token_func) {
+ }
+
+ void set_input(const char* input) {
+ m_input = input;
+ m_current = m_input.begin();
+ m_end = m_input.end();
+ m_more = m_token_func.next(m_current, m_end, m_next_token);
+ }
+
+ void set_input(const string& input) {
+ m_input = input;
+ m_current = m_input.begin();
+ m_end = m_input.end();
+ m_more = m_token_func.next(m_current, m_end, m_next_token);
+ }
+
+ bool has_more() {
+ return m_more;
+ }
+
+ const string& next_token() {
+ m_cr_token = m_next_token;
+ m_more = m_token_func.next(m_current, m_end, m_next_token);
+ return m_cr_token;
+ }
+
+ const string& cr_token() {
+ return m_next_token;
+ }
+private:
+ bool m_more;
+ string m_cr_token, m_next_token, m_input;
+ string::const_iterator m_current, m_end;
+ TokenizerFunc& m_token_func;
+};
diff --git a/src/gle/unit-tests/part1.cpp b/src/gle/unit-tests/part1.cpp
new file mode 100644
index 0000000..1ae2c97
--- /dev/null
+++ b/src/gle/unit-tests/part1.cpp
@@ -0,0 +1,234 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+/*
+ * 2004 Jan Struyf
+ *
+ */
+
+#include "../all.h"
+#include "../core.h"
+#include "../file_io.h"
+#include "../texinterface.h"
+#include "../cutils.h"
+#include "../gprint.h"
+#include "../tokens/RefCount.h"
+#include "../glearray.h"
+#include "../polish.h"
+#include "../var.h"
+#include "../keyword.h"
+#include "../run.h"
+
+#include <memory>
+
+#define unit_test(a) unit_test_impl(a, #a, __FILE__, __LINE__)
+#define unit_test_msg(a, b) unit_test_impl(a, b, __FILE__, __LINE__)
+
+void unit_test_impl(bool expr, const char* exprStr, const char* file, int line) {
+ if (!expr) {
+ cout << "unit test failed (" << file << ":" << line << "): " << exprStr << std::endl;
+ exit(1);
+ }
+}
+
+void unit_test_impl(bool expr, const std::string& exprStr, const char* file, int line) {
+ unit_test_impl(expr, exprStr.c_str(), file, line);
+}
+
+void test_csv_reader1() {
+ const unsigned int columns[] = { 3, 2, 3, 3, 3, 3, 3, 3, 3 };
+ const char* tokens[] = {
+ "\"0.123\"", "5.5", "23",
+ "België", "25",
+ "\"Tussen \"dubbele quotes\"\"", "36", "40",
+ "Tussen 'enkele quotes'", "20", "10",
+ "\\textbf{hello}", "1", "23.5",
+ "\"Comma: ,\"", "你好", "10",
+ "\"Drie dubbele quotes \"\"\"\"", "1", "23",
+ "\"\"\"", "", "32",
+ "A", "B", ""
+ };
+ const char* input1 = "REM Line with comments\n"
+ " REM Line with comments\n"
+ "\"0.123\",5.5 ,23\n"
+ "België,25 REM Hello\n"
+ "\"Tussen \"\"dubbele quotes\"\"\",36,40\r\n"
+ "Tussen 'enkele quotes',20,10\n"
+ "\\textbf{hello},1,23.5\n"
+ "\"Comma: ,\",你好, 10\n\r"
+ "\"Drie dubbele quotes \"\"\"\"\"\"\",1,23\n"
+ "\"\"\"\",,32\n"
+ "A,B,";
+ GLECSVData reader;
+ reader.setDelims(",;\t");
+ reader.setCommentIndicator("REM");
+ reader.readBuffer(input1);
+ GLECSVError* error = reader.getError();
+ unit_test(error->errorCode == GLECSVErrorNone);
+ unit_test(reader.getNbLines() == 9);
+ for (unsigned int i = 0; i < reader.getNbLines(); i++) {
+ unit_test(reader.getNbColumns(i) == columns[i]);
+ }
+ unsigned int pos = 0;
+ for (unsigned int i = 0; i < reader.getNbLines(); i++) {
+ for (unsigned int j = 0; j < reader.getNbColumns(i); j++) {
+ string cellValue = reader.getCellString(i, j);
+ unit_test(cellValue == tokens[pos++]);
+ }
+ }
+}
+
+void test_csv_reader2() {
+ unsigned int columns = 12;
+ const char* tokens[] = {
+ "17", "16", "2", "16", "16", "1", "17", "161947.9820", "161947.9381", "0.0439", "*", "*",
+ "100", "16", "85", "99", "16", "84", "100", "946121.8397", "946046.8191", "75.0206", "*", "23",
+ "101", "16", "86", "100", "16", "85", "101", "955521.9934", "955371.2682", "150.7252", "*", "*",
+ "119", "16", "104", "118", "16", "103", "119", "1122496.4662", "1122497.7256", "-1.2594", "*", "*" };
+ const char* input1 =
+ "!\n"
+ "! Some comments\n"
+ "!\n"
+ " 17 16 2 16 16 1 17 161947.9820 161947.9381 0.0439 * * \n"
+ "100 16 85 99 16 84 100 946121.8397 946046.8191 75.0206 * 23\n"
+ "101 16 86 100 16 85 101 955521.9934 955371.2682 150.7252 * * !\n"
+ "119 16 104 118 16 103 119 1122496.4662 1122497.7256 -1.2594 * * !\n"
+ "!120 16 105 119 16 104 120 1131738.8987 1131740.7524 -1.8537 * * \n";
+ GLECSVData reader;
+ reader.readBuffer(input1);
+ GLECSVError* error = reader.getError();
+ unit_test(error->errorCode == GLECSVErrorNone);
+ unit_test(reader.getNbLines() == 4);
+ for (unsigned int i = 0; i < reader.getNbLines(); i++) {
+ unit_test(reader.getNbColumns(i) == columns);
+ }
+ unsigned int pos = 0;
+ for (unsigned int i = 0; i < reader.getNbLines(); i++) {
+ for (unsigned int j = 0; j < columns; j++) {
+ string cellValue = reader.getCellString(i, j);
+ unit_test(cellValue == tokens[pos++]);
+ }
+ }
+}
+
+void test_csv_reader3() {
+ unsigned int columns = 7;
+ const char* tokens[] = {
+ "Sample_Number", "V_Ne", "V_Ar", "V_Kr", "V_Xe", "NGT", "err_NGT",
+ "MI-1", "3.68", "4.72", "10.7", "1.59", "6.78", "0.89",
+ "MI-2a", "3.76", "5.07", "*", "1.71", "*", "0.82" };
+ const char* input1 =
+ " Sample_Number , V_Ne , V_Ar , V_Kr , V_Xe , NGT , err_NGT \n"
+ " MI-1 ,3.68,4.72,10.7,1.59,6.78,0.89\n"
+ " MI-2a ,3.76,5.07, * ,1.71, *,0.82 \n"
+ " \n";
+ GLECSVData reader;
+ reader.readBuffer(input1);
+ GLECSVError* error = reader.getError();
+ unit_test(error->errorCode == GLECSVErrorNone);
+ unit_test(reader.getNbLines() == 3);
+ for (unsigned int i = 0; i < reader.getNbLines(); i++) {
+ unit_test(reader.getNbColumns(i) == columns);
+ }
+ unsigned int pos = 0;
+ for (unsigned int i = 0; i < reader.getNbLines(); i++) {
+ for (unsigned int j = 0; j < columns; j++) {
+ string cellValue = reader.getCellString(i, j);
+ unit_test(cellValue == tokens[pos++]);
+ }
+ }
+}
+
+void test_expression_evaluator_each(GLEPolish* polish, const std::string& expression, const std::string& expectedValue) {
+ int cp = 0;
+ int rtype = 0;
+ GLEPcodeList pc_list;
+ GLEPcode pcode(&pc_list);
+ polish->polish(expression.c_str(), pcode, &rtype);
+ GLERC<GLEArrayImpl> stk(new GLEArrayImpl());
+ std::ostringstream msg;
+ msg << expression << ": ";
+ if (is_float(expectedValue)) {
+ GLEMemoryCell* mc = evalGeneric(stk.get(), &pc_list, (int*)&pcode[0], &cp);
+ gle_memory_cell_check(mc, GLEObjectTypeDouble);
+ double expectedDouble = tokenizer_string_to_double(expectedValue.c_str());
+ msg << mc->Entry.DoubleVal << " == " << expectedValue;
+ if (expectedDouble == 0.0) {
+ unit_test_msg(fabs(mc->Entry.DoubleVal) < CUTILS_REL_PREC_FINE, msg.str());
+ } else {
+ unit_test_msg(equals_rel_fine(mc->Entry.DoubleVal, expectedDouble), msg.str());
+ }
+ } else {
+ GLERC<GLEString> result(evalString(stk.get(), &pc_list, (int*)&pcode[0], &cp, true));
+ std::string computedString(result->toUTF8());
+ msg << computedString << " == " << expectedValue;
+ unit_test_msg(expectedValue == computedString, msg.str());
+ }
+}
+
+void test_expression_evaluator() {
+ GLECSVData reader;
+ reader.setDelims(",");
+ reader.read("unit-tests/expressions.txt");
+ GLECSVError* error = reader.getError();
+ unit_test(error->errorCode == GLECSVErrorNone);
+ std::auto_ptr<GLEPolish> polish(new GLEPolish());
+ polish->initTokenizer();
+ for (unsigned int i = 0; i < reader.getNbLines(); i++) {
+ unit_test(reader.getNbColumns(i) == 2);
+ string expression(reader.getCellString(i, 0));
+ string expectedValue(reader.getCellString(i, 1));
+ str_remove_quote(expression);
+ str_remove_quote(expectedValue);
+ test_expression_evaluator_each(polish.get(), expression, expectedValue);
+ }
+}
+
+int main(void) {
+ try {
+ test_csv_reader1();
+ test_csv_reader2();
+ test_csv_reader3();
+ test_expression_evaluator();
+ } catch (ParserError& err) {
+ std::string errMsg;
+ err.toString(errMsg);
+ unit_test_msg(false, errMsg.c_str());
+ }
+ return 0;
+}
diff --git a/src/gle/var.cpp b/src/gle/var.cpp
new file mode 100644
index 0000000..35b6ea1
--- /dev/null
+++ b/src/gle/var.cpp
@@ -0,0 +1,769 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#include "all.h"
+#include "mem_limits.h"
+#include "token.h"
+#include "tokens/StringKeyHash.h"
+#include "gle-interface/gle-interface.h"
+#include "glearray.h"
+#include "polish.h"
+#include "pass.h"
+#include "var.h"
+#include "gprint.h"
+#include "cutils.h"
+
+#include <set>
+
+#define true (!false)
+#define false 0
+
+GLEVars* g_VarsInstance = NULL;
+
+GLEVars* getVarsInstance() {
+ if (g_VarsInstance == NULL) g_VarsInstance = new GLEVars();
+ return g_VarsInstance;
+}
+
+GLELocalVars::GLELocalVars(int num) {
+ values.resize(num);
+}
+
+GLELocalVars::~GLELocalVars() {
+}
+
+void GLELocalVars::expand(int num) {
+ values.ensure(num + 1);
+}
+
+void GLELocalVars::copyFrom(GLELocalVars* other, int nb) {
+ expand(nb);
+ for (int i = 0; i < nb; i++) {
+ values.set(i, other->values.get(i));
+ }
+}
+
+GLELocalVars* GLELocalVars::clone(int nb) {
+ GLELocalVars* res = new GLELocalVars(nb);
+ res->copyFrom(this, nb);
+ return res;
+}
+
+void GLELocalVars::copyFrom(GLELocalVars* other) {
+ copyFrom(other, other->size());
+}
+
+GLEVarSubMap::GLEVarSubMap(GLEVarMap* parent) {
+ m_Parent = parent;
+}
+
+GLEVarSubMap::~GLEVarSubMap() {
+}
+
+void GLEVarSubMap::list() {
+ for (StringIntHash::const_iterator i(m_Map.begin()); i != m_Map.end(); ++i) {
+ std::cout << i->first << std::endl;
+ }
+}
+
+void GLEVarSubMap::clear() {
+ m_Map.clear();
+ m_Idxs.clear();
+}
+
+void GLEVarSubMap::var_add(const string& name, int idx) {
+ m_Map.add_item(name, idx);
+ m_Idxs.push_back(idx);
+}
+
+void GLEVarSubMap::removeFromParent() {
+ // remove indices and names from varlist (indicate them as empty)
+ for (vector<int>::size_type i = 0; i < m_Idxs.size(); i++) {
+ m_Parent->removeVar(m_Idxs[i]);
+ }
+}
+
+void GLEVarSubMap::addToParent(GLEVarMap* parent) {
+ m_Parent = parent;
+ m_Parent->addVars(m_Map);
+}
+
+GLEVarBackup::GLEVarBackup() {
+}
+
+void GLEVarBackup::backup(GLEVars* vars, const vector<int>& ids) {
+ GLEMemoryCell data;
+ GLE_MC_INIT(data);
+ m_ids.assign(ids.begin(), ids.end());
+ m_values.resize(ids.size());
+ for (size_t i = 0; i < ids.size(); ++i) {
+ vars->get(ids[i], &data);
+ m_values.set(i, &data);
+ }
+}
+
+void GLEVarBackup::restore(GLEVars* vars) {
+ for (size_t i = 0; i < m_ids.size(); ++i) {
+ vars->set(m_ids[i], m_values.get(i));
+ }
+}
+
+GLEVarMap::GLEVarMap() {
+ m_IsTemp = false;
+}
+
+GLEVarMap::~GLEVarMap() {
+ clear();
+}
+
+int GLEVarMap::getFreeID() {
+ if (m_Free.size() > 0) {
+ int id = m_Free.back();
+ m_Free.pop_back();
+ return id;
+ } else {
+ return -1;
+ }
+}
+
+int GLEVarMap::addVarIdx(const string& name) {
+ int idx = getFreeID();
+ int type = str_var(name) ? 2 : 1;
+ if (idx != -1) {
+ m_Names[idx] = name;
+ m_Types[idx] = type;
+ } else {
+ idx = m_Names.size();
+ m_Names.push_back(name);
+ m_Types.push_back(type);
+ }
+ return idx;
+}
+
+void GLEVarMap::addVars(const StringIntHash& submap) {
+ set<int> free(m_Free.begin(), m_Free.end());
+ for (StringIntHash::const_iterator i(submap.begin()); i != submap.end(); ++i) {
+ int idx = i->second;
+ set<int>::const_iterator found(free.find(idx));
+ if (found == free.end()) {
+ unsigned int origSize = m_Names.size();
+ if (idx >= (int)origSize) {
+ unsigned int newSize = idx + 1;
+ m_Names.resize(newSize, "?");
+ m_Types.resize(newSize, 0);
+ for (unsigned int j = origSize; j < newSize - 1; j++) {
+ free.insert(j);
+ }
+ string name(i->first);
+ int type = str_var(name) ? 2 : 1;
+ m_Names[idx] = name;
+ m_Types[idx] = type;
+ } else {
+ ostringstream err;
+ err << "GLE internal error: variable not free when adding submap (name = " << i->first << ", id = " << idx << ")";
+ g_throw_parser_error(err.str());
+ }
+ } else {
+ free.erase(found);
+ string name(i->first);
+ int type = str_var(name) ? 2 : 1;
+ m_Names[idx] = name;
+ m_Types[idx] = type;
+ }
+ }
+ m_Free.assign(free.begin(), free.end());
+}
+
+int GLEVarMap::var_find_add(const string& name, bool* isnew) {
+ *isnew = false;
+ int idx = m_Map.try_get(name);
+ if (idx == -1) {
+ idx = addVarIdx(name);
+ m_Map.add_item(name, idx);
+ *isnew = true;
+ }
+ return idx;
+}
+
+int GLEVarMap::var_find_add_submap(const string& name, bool* isnew) {
+ *isnew = false;
+ GLEVarSubMap* sub = m_SubMap.back();
+ int idx = sub->var_get(name);
+ if (idx == -1) {
+ idx = addVarIdx(name);
+ sub->var_add(name, idx);
+ *isnew = true;
+ }
+ return idx;
+}
+
+int GLEVarMap::var_get(const string& name) {
+ int idx = -1;
+ int submap = m_SubMap.size()-1;
+ while (submap >= 0 && (idx = m_SubMap[submap]->var_get(name)) == -1) {
+ submap--;
+ }
+ if (idx != -1) return idx;
+ else return m_Map.try_get(name);
+}
+
+const string& GLEVarMap::var_name(int idx) {
+ return m_Names[idx];
+}
+
+void GLEVarMap::list() {
+ for (vector<string>::size_type i = 0; i < m_Names.size(); i++) {
+ if (m_Types[i] != -1) {
+ cout << m_Names[i] << " (" << i << ")" << endl;
+ }
+ }
+}
+
+void GLEVarMap::removeVar(int idx) {
+ m_Free.push_back(idx);
+ m_Names[idx] = "?";
+ m_Types[idx] = -1;
+}
+
+GLEVarSubMap* GLEVarMap::pushSubMap() {
+ GLEVarSubMap* sub = new GLEVarSubMap(this);
+ m_SubMap.push_back(sub);
+ return sub;
+}
+
+void GLEVarMap::pushSubMap(GLEVarSubMap* submap) {
+ submap->addToParent(this);
+ m_SubMap.push_back(submap);
+}
+
+void GLEVarMap::popSubMap() {
+ GLEVarSubMap* sub = m_SubMap.back();
+ sub->removeFromParent();
+ m_SubMap.pop_back();
+}
+
+void GLEVarMap::clearSubMaps() {
+ m_SubMap.clear();
+}
+
+void GLEVarMap::clear() {
+ m_Names.clear();
+ m_Types.clear();
+ m_Map.clear();
+ m_Free.clear();
+ clearSubMaps();
+}
+
+GLEVars::GLEVars() {
+ m_LocalMap = NULL;
+ local_var = NULL;
+ local_var_stack_level = 0;
+ m_nameMode = nameMode::NAME;
+}
+
+GLEVars::~GLEVars() {
+}
+
+bool GLEVars::check(int *j) {
+ int var = *j;
+ /* convert var index and return true if var is local */
+ if (GLE_VAR_IS_LOCAL(var)) {
+ var &= ~GLE_VAR_LOCAL_BIT;
+ if (m_LocalMap == NULL) {
+ gprint("No local variables assigned");
+ *j = 0;
+ } else if (var < 0 || var >= m_LocalMap->size() || var >= NUM_LOCAL) {
+ gprint("Local variable index out of range: %d is not in 0-%d", var, m_LocalMap->size());
+ *j = 0;
+ } else {
+ *j = var;
+ return true;
+ }
+ } else {
+ if (var < 0 || var >= m_GlobalMap.size()) {
+ gprint("Global variable index out of range: %d is not in 0-%d", var, m_GlobalMap.size());
+ *j = 0;
+ }
+ }
+ return false;
+}
+
+char* GLEVars::getName(int var) {
+ if (check(&var)) {
+ return (char*)m_LocalMap->var_name(var).c_str();
+ } else {
+ return (char*)m_GlobalMap.var_name(var).c_str();
+ }
+}
+
+double GLEVars::getDouble(int var) {
+ if (check(&var)) {
+ return local_var->values.getDouble(var);
+ } else {
+ return m_Global.getDouble(var);
+ }
+}
+
+void GLEVars::setDouble(int var, double v) {
+ if (check(&var)) {
+ local_var->values.setDouble(var, v);
+ } else {
+ m_Global.setDouble(var, v);
+ }
+}
+
+void GLEVars::set(int var, GLEMemoryCell* value) {
+ if (check(&var)) {
+ local_var->values.set(var, value);
+ } else {
+ m_Global.set(var, value);
+ }
+}
+
+void GLEVars::get(int var, GLEMemoryCell* value) {
+ if (check(&var)) {
+ GLE_MC_COPY(value, local_var->values.get(var));
+ } else {
+ GLE_MC_COPY(value, m_Global.get(var));
+ }
+}
+
+GLEString* GLEVars::getString(int var) {
+ GLEDataObject* object = 0;
+ if (check(&var)) {
+ object = local_var->values.getObject(var);
+ } else {
+ object = m_Global.getObject(var);
+ }
+ if (object != 0 && object->getType() == GLEObjectTypeString) {
+ return (GLEString*)object;
+ } else {
+ return new GLEString();
+ }
+}
+
+GLEDataObject* GLEVars::getObject(int var) {
+ if (check(&var)) {
+ return NULL;
+ } else {
+ return (GLEDataObject*)m_Global.getObject(var);
+ }
+}
+
+void GLEVars::setString(int var, GLEString* s) {
+ if (check(&var)) {
+ local_var->values.setObject(var, s);
+ } else {
+ m_Global.setObject(var, s);
+ }
+}
+
+void GLEVars::setObject(int var, GLEDataObject* obj) {
+ if (check(&var)) {
+ // FIXME: no support for objects in local vars
+ } else {
+ m_Global.setObject(var, obj);
+ }
+}
+
+void GLEVars::init(int var, int type) {
+ if (check(&var)) {
+ if (type == 2) local_var->values.setObject(var, new GLEString());
+ else local_var->values.setDouble(var, 0.0);
+ } else {
+ if (type == 2) m_Global.setObject(var, new GLEString());
+ else m_Global.setDouble(var, 0.0);
+ }
+}
+
+// First search in local vars, then in global vars
+void GLEVars::find(const std::string& name, int *idx, int *type) {
+ *idx = -1;
+ if (m_LocalMap != NULL) {
+ int l_idx = m_LocalMap->var_get(name);
+ if (l_idx != -1) {
+ *type = m_LocalMap->getType(l_idx);
+ *idx = l_idx | GLE_VAR_LOCAL_BIT;
+ return;
+ }
+ }
+ int g_idx = m_GlobalMap.var_get(name);
+ if (g_idx != -1) {
+ *type = m_GlobalMap.getType(g_idx);
+ *idx = g_idx;
+ }
+}
+
+void GLEVars::findAdd(const char *name, int *idx, int *type) {
+ bool isnew;
+ if (m_LocalMap != NULL && m_LocalMap->hasSubMap()) {
+ // cout << "adding to submap: " << name << endl;
+ int l_idx = m_LocalMap->var_find_add_submap(name, &isnew);
+ *type = m_LocalMap->getType(l_idx);
+ *idx = l_idx | GLE_VAR_LOCAL_BIT;
+ local_var->expand(l_idx);
+ if (isnew) init(*idx, *type);
+ } else {
+ if (m_LocalMap != NULL) {
+ // cout << "adding to local: " << name << endl;
+ int l_idx = m_LocalMap->var_get(name);
+ if (l_idx != -1) {
+ *type = m_LocalMap->getType(l_idx);
+ *idx = l_idx | GLE_VAR_LOCAL_BIT;
+ return;
+ }
+ }
+ string name_s = name;
+ *idx = m_GlobalMap.var_find_add(name_s, &isnew);
+ *type = m_GlobalMap.getType(*idx);
+ // cout << "adding to global: " << name << " idx = " << *idx << " type = " << *type << " new = " << isnew << endl;
+ if (isnew) {
+ expandGlobalVars(*idx);
+ init(*idx, *type);
+ }
+ }
+}
+
+void GLEVars::clear() {
+ clearGlobal();
+ clearLocal();
+}
+
+void GLEVars::clearGlobal() {
+ m_GlobalMap.clear();
+}
+
+void GLEVars::clearLocal() {
+ m_LocalMap = NULL;
+}
+
+int GLEVars::getNbLocal() {
+ return m_LocalMap == NULL ? 0 : m_LocalMap->size();
+}
+
+void GLEVars::allocLocal(int num) {
+ local_var_stack_level++;
+ if (local_var_stack_level >= (int)local_var_stack.size()) {
+ if (local_var_stack_level == 1) {
+ // Initialize first level
+ local_var_stack.push_back(NULL);
+ }
+ local_var = new GLELocalVars(num);
+ local_var_stack.push_back(local_var);
+ } else {
+ local_var = local_var_stack[local_var_stack_level];
+ local_var->expand(num);
+ }
+}
+
+void GLEVars::freeLocal() {
+ if (local_var_stack_level == 0) {
+ cerr << "GLE internal error: too many pops of local variable stack" << endl;
+ exit(1);
+ }
+ local_var_stack_level--;
+ local_var = local_var_stack[local_var_stack_level];
+}
+
+GLEVarMap* GLEVars::swapLocalMap(GLEVarMap* map) {
+ GLEVarMap* old = m_LocalMap;
+ m_LocalMap = map;
+ return old;
+}
+
+void GLEVars::addLocal(const string& name, int *idx, int *type) {
+ bool isnew;
+ int l_idx = m_LocalMap->var_find_add(name, &isnew);
+ *type = m_LocalMap->getType(l_idx);
+ *idx = l_idx | GLE_VAR_LOCAL_BIT;
+}
+
+GLEVarSubMap* GLEVars::addLocalSubMap() {
+ if (m_LocalMap == NULL) {
+ m_LocalMap = new GLEVarMap();
+ m_LocalMap->setTemp(true);
+ var_alloc_local(0);
+ }
+ return m_LocalMap->pushSubMap();
+}
+
+void GLEVars::addLocalSubMap(GLEVarSubMap* submap) {
+ if (m_LocalMap == NULL) {
+ m_LocalMap = new GLEVarMap();
+ m_LocalMap->setTemp(true);
+ var_alloc_local(0);
+ }
+ m_LocalMap->pushSubMap(submap);
+}
+
+void GLEVars::removeLocalSubMap() {
+ if (m_LocalMap != NULL) {
+ if (m_LocalMap->isTemp()) {
+ delete m_LocalMap;
+ m_LocalMap = NULL;
+ var_free_local();
+ } else {
+ m_LocalMap->popSubMap();
+ }
+ }
+}
+
+void GLEVars::findDN(GLEVarSubMap* map, int *idx, int *var, int *nd) {
+ *nd = 0;
+ for (int i = 0; i < map->size(); i++) {
+ int lidx = map->get(i);
+ const string& name = m_LocalMap->var_name(lidx);
+ if (str_ni_equals(name.c_str(), "D", 1)) {
+ int d = atoi(name.c_str()+1);
+ // cout << "name = " << name << " idx = " << d << endl;
+ // FIXME: calling code supports at most 10 data sets
+ if (d > 0 && d < MAX_NB_DATA && (*nd) < 10) {
+ *idx = lidx | GLE_VAR_LOCAL_BIT;
+ *var = d;
+ (*nd)++; idx++; var++;
+ }
+ }
+ }
+ // cout << "res = " << *nd << endl;
+}
+
+const char* GLEVars::getObjectTypeName(int type) {
+ switch (type) {
+ case GLEObjectTypeBool:
+ return "boolean";
+ case GLEObjectTypeInt:
+ return "int";
+ case GLEObjectTypeDouble:
+ return "double";
+ case GLEObjectTypeString:
+ return "string";
+ case GLEObjectTypeArray:
+ return "array";
+ case GLEObjectTypeObjectRep:
+ return "object";
+ case GLEObjectTypeDynamicSub:
+ return "subroutine";
+ }
+ return "unknown";
+}
+
+string GLEVars::typeError(int var, int type) {
+ stringstream str;
+ if (check(&var)) {
+ str << "local variable '" << m_LocalMap->var_name(var) << "' has unknown type";
+ } else {
+ str << "global variable '" << m_GlobalMap.var_name(var);
+ str << "' of incorrect type: " << getObjectTypeName(m_Global.getType(var));
+ str << " <> " << getObjectTypeName(type);
+ }
+ return str.str();
+}
+
+int var_type(const string& name) {
+ return str_var(name) ? 2 : 1;
+}
+
+bool str_var(const char* s) {
+ int i = strlen(s);
+ if (*(s+i-1)=='$') return true;
+ else return false;
+}
+
+bool str_var(const string& s) {
+ if (s[s.length()-1] == '$') return true;
+ else return false;
+}
+
+int valid_var(const char* s) {
+ return true;
+}
+
+bool str_var_valid_name(const string& name) {
+ return str_var(name) && var_valid_name(name);
+}
+
+bool var_valid_name(const string& name) {
+ if (name.length() <= 0) {
+ return false;
+ }
+ if (name[0] >= '0' && name[0] <= '9') {
+ return false;
+ }
+ for (string::size_type i = 0; i < name.length(); i++) {
+ char ch = name[i];
+ if (!((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') ||
+ (ch >= '0' && ch <= '9') || (ch == '$') || (ch == '_'))) {
+ return false;
+ }
+ }
+ return true;
+}
+
+void ensure_valid_var_name(const string& name) throw(ParserError) {
+ if (!var_valid_name(name)) {
+ g_throw_parser_error("illegal variable name '", name.c_str(), "'");
+ }
+}
+
+void ensure_valid_var_name(Tokenizer* tokens, const string& name) throw(ParserError) {
+ if (!var_valid_name(name)) {
+ throw tokens->error(string("illegal variable name '")+name+"'");
+ }
+}
+
+/*
+ * DEPRECATED CODE
+ */
+
+bool var_check(int *j) {
+ return getVarsInstance()->check(j);
+}
+
+GLELocalVars* get_local_vars() {
+ return getVarsInstance()->getLocalVars();
+}
+
+void var_alloc_local(int num) {
+ getVarsInstance()->allocLocal(num);
+}
+
+void var_alloc_local(GLEVarMap* map) {
+ getVarsInstance()->allocLocal(map);
+}
+
+void var_free_local() {
+ getVarsInstance()->freeLocal();
+}
+
+void var_set(int var, GLEMemoryCell* value) {
+ getVarsInstance()->set(var, value);
+}
+
+void var_set(int var, double v) {
+ getVarsInstance()->setDouble(var, v);
+}
+
+void var_get(int var, double *v) {
+ *v = getVarsInstance()->getDouble(var);
+}
+
+void var_setstr(int var, char *s) {
+ GLERC<GLEString> str = new GLEString(s);
+ getVarsInstance()->setString(var, str.get());
+}
+
+void var_getstr(int var, char *s) {
+ GLERC<GLEString> str = getVarsInstance()->getString(var);
+ str->toUTF8(s);
+}
+
+void var_getstr(int var, string& s) {
+ GLERC<GLEString> str = getVarsInstance()->getString(var);
+ str->toUTF8(s);
+}
+
+char* var_get_name(int var) {
+ return getVarsInstance()->getName(var);
+}
+
+void var_nlocal(int *l) {
+ *l = getVarsInstance()->getNbLocal();
+}
+
+void var_clear_global() {
+ getVarsInstance()->clearGlobal();
+}
+
+void var_clear() {
+ getVarsInstance()->clear();
+}
+
+GLEVarMap* var_swap_local_map(GLEVarMap* map) {
+ return getVarsInstance()->swapLocalMap(map);
+}
+
+void var_set_local_map(GLEVarMap* map) {
+ getVarsInstance()->setLocalMap(map);
+}
+
+void var_clear_local() {
+ getVarsInstance()->clearLocal();
+}
+
+bool has_local_var_map() {
+ return getVarsInstance()->hasLocalMap();
+}
+
+GLEVarMap* get_local_var_map() {
+ return getVarsInstance()->getLocalMap();
+}
+
+void var_findadd_set(const char* name, double value) {
+ int idx, type = 1;
+ var_findadd(name, &idx, &type);
+ var_set(idx, value);
+}
+
+void var_findadd_set(const char* name, const string& value) {
+ int idx, type = 2;
+ var_findadd((char*)name, &idx, &type);
+ var_setstr(idx, (char*)value.c_str());
+}
+
+void var_findadd_set(const char *s, GLEMemoryCell* value) {
+ int idx, type=1;
+ var_findadd(s, &idx, &type);
+ getVarsInstance()->set(idx, value);
+}
+
+void var_add_local(const string& name, int *idx, int *type) {
+ getVarsInstance()->addLocal(name, idx, type);
+}
+
+void var_findadd(const char *name, int *idx, int *type) {
+ getVarsInstance()->findAdd(name, idx, type);
+}
+
+// First search in local vars, then in global vars
+void var_find(const char *name, int *idx, int *type) {
+ getVarsInstance()->find(name, idx, type);
+}
+
+void var_find_dn(GLEVarSubMap* map, int *idx, int *var, int *nd) {
+ return getVarsInstance()->findDN(map, idx, var, nd);
+}
diff --git a/src/gle/var.h b/src/gle/var.h
new file mode 100644
index 0000000..5240682
--- /dev/null
+++ b/src/gle/var.h
@@ -0,0 +1,229 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#ifndef INCLUDE_VAR
+#define INCLUDE_VAR
+
+#include "gle-interface/gle-datatype.h"
+
+#define GLE_VAR_LOCAL_BIT 0x10000000
+
+#define GLE_VAR_IS_LOCAL(a) (a & GLE_VAR_LOCAL_BIT) != 0
+
+class GLEVars;
+class GLEVarMap;
+
+class GLEVarSubMap : public GLERefCountObject {
+protected:
+ StringIntHash m_Map;
+ vector<int> m_Idxs;
+ GLEVarMap* m_Parent;
+public:
+ GLEVarSubMap(GLEVarMap* parent);
+ ~GLEVarSubMap();
+ void list();
+ void clear();
+ void removeFromParent();
+ void addToParent(GLEVarMap* parent);
+ void var_add(const string& name, int idx);
+ inline int var_get(const string& name) { return m_Map.try_get(name); }
+ inline int size() { return m_Idxs.size(); }
+ inline int get(int i) { return m_Idxs[i]; }
+};
+
+class GLEVarBackup : public GLERefCountObject {
+public:
+ GLEVarBackup();
+ void backup(GLEVars* vars, const vector<int>& ids);
+ void restore(GLEVars* vars);
+private:
+ vector<int> m_ids;
+ GLEArrayImpl m_values;
+};
+
+class GLEVarMap {
+protected:
+ vector<string> m_Names;
+ vector<int> m_Types;
+ StringIntHash m_Map;
+ vector<int> m_Free;
+ vector<GLEVarSubMap*> m_SubMap;
+ bool m_IsTemp;
+public:
+ GLEVarMap();
+ ~GLEVarMap();
+ /* FIXME: lookup should be based on GLEString */
+ int var_find_add(const string& name, bool* isnew);
+ int var_find_add_submap(const string& name, bool* isnew);
+ int var_get(const string& name);
+ const string& var_name(int idx);
+ void clear();
+ void list();
+ int getFreeID();
+ int addVarIdx(const string& name);
+ void addVars(const StringIntHash& submap);
+ void addVar(int idx, const string& name);
+ void removeVar(int idx);
+ void clearSubMaps();
+ GLEVarSubMap* pushSubMap();
+ void pushSubMap(GLEVarSubMap* submap);
+ void popSubMap();
+ inline int size() { return m_Names.size(); }
+ inline int getType(int idx) { return m_Types[idx]; }
+ inline void setType(int idx, int type) { m_Types[idx] = type; }
+ inline bool hasSubMap() { return m_SubMap.size() > 0; }
+ inline bool isTemp() { return m_IsTemp; }
+ inline void setTemp(bool temp) { m_IsTemp = temp; }
+};
+
+class GLELocalVars {
+public:
+ GLEArrayImpl values;
+public:
+ GLELocalVars(int num);
+ ~GLELocalVars();
+ void expand(int num);
+ void copyFrom(GLELocalVars* other);
+ void copyFrom(GLELocalVars* other, int nb);
+ GLELocalVars* clone(int nb);
+ inline int size() { return values.size(); }
+};
+
+namespace nameMode
+{
+ enum Enum {
+ DETECT,
+ RETRIEVE,
+ NAME
+ };
+};
+
+class GLEVars {
+protected:
+ GLEVarMap m_GlobalMap;
+ GLEVarMap* m_LocalMap;
+ GLEArrayImpl m_Global;
+ GLEArrayImpl m_Stack;
+ GLELocalVars* local_var;
+ vector<GLELocalVars*> local_var_stack;
+ int local_var_stack_level;
+ nameMode::Enum m_nameMode;
+public:
+ GLEVars();
+ ~GLEVars();
+ bool check(int *var);
+ char* getName(int var);
+ double getDouble(int var);
+ void setDouble(int var, double v);
+ GLEString* getString(int var);
+ void setString(int var, GLEString* s);
+ GLEDataObject* getObject(int var);
+ void setObject(int var, GLEDataObject* obj);
+ void set(int var, GLEMemoryCell* value);
+ void get(int var, GLEMemoryCell* value);
+ void init(int var, int type);
+ void find(const std::string& name, int *idx, int *type);
+ void findAdd(const char *name, int *idx, int *type);
+ void clear();
+ void clearGlobal();
+ void clearLocal();
+ int getNbLocal();
+ void allocLocal(int num);
+ void freeLocal();
+ void addLocal(const string& name, int *idx, int *type);
+ GLEVarMap* swapLocalMap(GLEVarMap* map);
+ GLEVarSubMap* addLocalSubMap();
+ void addLocalSubMap(GLEVarSubMap* submap);
+ void removeLocalSubMap();
+ void findDN(GLEVarSubMap* map, int *idx, int *var, int *nd);
+ int getGlobalType(int var);
+ const char* getObjectTypeName(int type);
+ string typeError(int var, int type);
+ inline void allocLocal(GLEVarMap* map) { allocLocal(map->size()); }
+ inline GLELocalVars* getLocalVars() { return local_var; }
+ inline bool hasLocalMap() { return m_LocalMap != NULL; }
+ inline GLEVarMap* getLocalMap() { return m_LocalMap; }
+ inline GLEVarMap* getGlobalMap() { return &m_GlobalMap; }
+ inline void setLocalMap(GLEVarMap* map) { m_LocalMap = map; }
+ inline void expandGlobalVars(int max) { m_Global.ensure(max+1); }
+ inline void setNameMode(nameMode::Enum mode) { m_nameMode = mode; }
+ inline nameMode::Enum getNameMode() const { return m_nameMode; }
+};
+
+GLEVars* getVarsInstance();
+
+void var_init(int idx, int type);
+int var_type(const string& name);
+bool str_var(const string& s);
+bool str_var(const char* s);
+int valid_var(const char *s);
+bool has_local_var_map();
+GLEVarMap* get_local_var_map();
+void var_add_local(const string& name, int *idx, int *type);
+GLELocalVars* get_local_vars();
+void var_alloc_local(int num);
+void var_alloc_local(GLEVarMap* map);
+bool var_check(int *j);
+void var_clear_global(void);
+void var_clear_local(void);
+void var_clear();
+void var_find(const char *name,int *idx,int *type); /* Find a variable in the list */
+void var_find_dn(GLEVarSubMap* map, int *idx, int *var, int *nd);
+void var_findadd(const char *name,int *idx,int *type); /* Add a variable to the list */
+void var_free_local(void);
+void var_get(int jj, double *v);
+void var_getstr(int v, char *s);
+void var_getstr(int jj, string& s);
+void var_nlocal(int *l);
+void var_set(int jj, double v);
+void var_set(int jj, GLEMemoryCell* value);
+GLEVarMap* var_swap_local_map(GLEVarMap* map);
+void var_set_local_map(GLEVarMap* map);
+void var_setstr(int jj, char *s);
+char* var_get_name(int jj);
+bool var_valid_name(const string& name);
+void var_findadd_set(const char* name, double value);
+void var_findadd_set(const char* name, const string& value);
+void var_findadd_set(const char *s, GLEMemoryCell* value);
+GLEVarSubMap* var_add_local_submap();
+void var_remove_local_submap();
+bool str_var_valid_name(const string& name);
+void ensure_valid_var_name(const string& name) throw(ParserError);
+void ensure_valid_var_name(Tokenizer* tokens, const string& name) throw(ParserError);
+
+#endif
diff --git a/src/gui/3dviewer.cpp b/src/gui/3dviewer.cpp
new file mode 100644
index 0000000..7a016bb
--- /dev/null
+++ b/src/gui/3dviewer.cpp
@@ -0,0 +1,330 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+#include <QtGui>
+#include <QtOpenGL>
+#include "3dviewer.h"
+#include "../config.h"
+#include "../gle/cutils.h"
+#include "../gle/gle-block.h"
+#include "../gle/surface/gsurface.h"
+
+#ifdef HAVE_LIBGLU_H
+ #include <GL/glu.h>
+#endif
+
+#include <math.h>
+
+QGLE3DWidget::QGLE3DWidget(QWidget *parent, GLEInterface* iface)
+ : QGLWidget(parent)
+{
+ gleInterface = iface;
+ object = 0;
+ perspAngle = 60.0;
+ GLEPoint3D* eye = proj.getEye();
+ GLEPoint3D* ref = proj.getReference();
+ GLEPoint3D* vvec = proj.getV();
+ surface_struct* sf = gleInterface->getSurface();
+ if (sf->z != NULL) {
+ eye->set(3,0,0);
+ ref->set(0,0,0);
+ vvec->set(0,0,1);
+ }
+}
+
+QGLE3DWidget::~QGLE3DWidget()
+{
+ makeCurrent();
+ glDeleteLists(object, 1);
+}
+
+QSize QGLE3DWidget::minimumSizeHint() const
+{
+ return QSize(50, 50);
+}
+
+QSize QGLE3DWidget::sizeHint() const
+{
+ return QSize(400, 400);
+}
+
+void QGLE3DWidget::zoom(double zoom) {
+ proj.zoom(zoom);
+ updateGL();
+}
+
+void QGLE3DWidget::rotate(double angle, bool horiz) {
+ proj.rotate(angle, horiz);
+ updateGL();
+}
+
+void QGLE3DWidget::reference(const GLEPoint3D& p) {
+ proj.reference(p);
+ updateGL();
+}
+
+void QGLE3DWidget::adjustV(double angle) {
+ proj.adjustV(angle);
+ updateGL();
+}
+
+void QGLE3DWidget::perspectiveAngle(double delta) {
+ perspAngle += delta;
+ if (perspAngle < 5) perspAngle = 5;
+ if (perspAngle > 85) perspAngle = 85;
+ updateGL();
+}
+
+void QGLE3DWidget::initializeGL()
+{
+ qglClearColor(Qt::white);
+ object = makeObject();
+ glShadeModel(GL_FLAT);
+ glEnable(GL_DEPTH_TEST);
+ // glEnable(GL_CULL_FACE);
+ glDisable(GL_CULL_FACE);
+}
+
+#include <iostream>
+using namespace std;
+
+void QGLE3DWidget::paintGL()
+{
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ // glOrtho(-0.5, +0.5, +0.5, -0.5, 4.0, 15.0);
+ gluPerspective(perspAngle, 1, 1, 100);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ GLEPoint3D* eye = proj.getEye();
+ GLEPoint3D* ref = proj.getReference();
+ GLEPoint3D* vvec = proj.getV();
+ gluLookAt(eye->get(0),eye->get(1),eye->get(2),
+ ref->get(0),ref->get(1),ref->get(2),
+ vvec->get(0),vvec->get(1),vvec->get(2));
+ surface_struct* sf = gleInterface->getSurface();
+ if (sf->z != NULL) {
+ glScaled(2.0/sf->nx, 2.0/sf->ny, 2.0/(sf->zmax-sf->zmin));
+ glTranslated(-0.5*sf->nx, -0.5*sf->ny, -0.5*(sf->zmax-sf->zmin)-sf->zmin);
+ }
+ glCallList(object);
+}
+
+void QGLE3DWidget::resizeGL(int width, int height)
+{
+ int side = qMin(width, height);
+ glViewport((width - side) / 2, (height - side) / 2, side, side);
+}
+
+void QGLE3DWidget::mousePressEvent(QMouseEvent *event)
+{
+ lastPos = event->pos();
+}
+
+void QGLE3DWidget::mouseMoveEvent(QMouseEvent *event)
+{
+ int dx = event->x() - lastPos.x();
+ int dy = event->y() - lastPos.y();
+ if (event->buttons() & Qt::LeftButton) {
+ proj.rotate(-dx*0.1, true);
+ proj.rotate(dy*0.1, false);
+ updateGL();
+ }
+ lastPos = event->pos();
+}
+
+GLuint QGLE3DWidget::makeObject()
+{
+ GLuint list = glGenLists(1);
+ glNewList(list, GL_COMPILE);
+
+ surface_struct* sf = gleInterface->getSurface();
+ float* z = sf->z;
+ if (z != NULL) {
+ GLEColorList* colors = GLEGetColorList();
+ QString gle_color = QString::fromUtf8(sf->top_color).toUpper();
+ GLEColor* color = colors->getSafeDefaultBlack(gle_color.toAscii().constData());
+ glEnable(GL_POLYGON_OFFSET_FILL); // Avoid Stitching!
+ glPolygonOffset(1.0, 1.0);
+ double l = 0.8;
+ double lRed = min(color->getRed()+l, 1.0);
+ double lGreen = min(color->getGreen()+l, 1.0);
+ double lBlue = min(color->getBlue()+l, 1.0);
+ for (int x = 0; x < sf->nx-1; x++) {
+ for (int y = 0; y < sf->ny-1; y++) {
+ glBegin(GL_POLYGON);
+ //glColor3f(1.0f, 1.0f, 1.0f);
+ glColor3f(lRed, lGreen, lBlue);
+ glVertex3f(x, y, z[x + y * sf->nx]);
+ glVertex3f(x+1, y, z[(x+1) + y * sf->nx]);
+ glVertex3f(x+1, y+1, z[(x+1) + (y+1) * sf->nx]);
+ glVertex3f(x, y+1, z[x + (y+1) * sf->nx]);
+ glEnd();
+ glBegin(GL_LINE_LOOP);
+ glColor3f(color->getRed(), color->getGreen(), color->getBlue());
+ glVertex3f(x, y, z[x + y * sf->nx]);
+ glVertex3f(x+1, y, z[(x+1) + y * sf->nx]);
+ glVertex3f(x+1, y+1, z[(x+1) + (y+1) * sf->nx]);
+ glVertex3f(x, y+1, z[x + (y+1) * sf->nx]);
+ glEnd();
+ }
+ }
+ }
+ glColor3f(0, 0, 0);
+ glBegin(GL_LINE_LOOP);
+ glVertex3f(0, 0, sf->zmin);
+ glVertex3f(sf->nx, 0, sf->zmin);
+ glVertex3f(sf->nx, sf->ny, sf->zmin);
+ glVertex3f(0, sf->ny, sf->zmin);
+ glEnd();
+ glBegin(GL_LINE_LOOP);
+ glVertex3f(0, 0, sf->zmax);
+ glVertex3f(sf->nx, 0, sf->zmax);
+ glVertex3f(sf->nx, sf->ny, sf->zmax);
+ glVertex3f(0, sf->ny, sf->zmax);
+ glEnd();
+ glBegin(GL_LINES);
+ glVertex3f(0, 0, sf->zmin);
+ glVertex3f(0, 0, sf->zmax);
+ glEnd();
+ glBegin(GL_LINES);
+ glVertex3f(sf->nx, 0, sf->zmin);
+ glVertex3f(sf->nx, 0, sf->zmax);
+ glEnd();
+ glBegin(GL_LINES);
+ glVertex3f(0, sf->ny, sf->zmin);
+ glVertex3f(0, sf->ny, sf->zmax);
+ glEnd();
+ glBegin(GL_LINES);
+ glVertex3f(sf->nx, sf->ny, sf->zmin);
+ glVertex3f(sf->nx, sf->ny, sf->zmax);
+ glEnd();
+ glEndList();
+ return list;
+}
+
+void QGLE3DWidget::normalizeAngle(int *angle)
+{
+ while (*angle < 0)
+ *angle += 360 * 16;
+ while (*angle > 360 * 16)
+ *angle -= 360 * 16;
+}
+
+QGLE3DViewer::QGLE3DViewer(QWidget* parent, GLEInterface* iface) : QDialog(parent)
+{
+ glWidget = new QGLE3DWidget(this, iface);
+
+ QHBoxLayout *mainLayout = new QHBoxLayout;
+ mainLayout->addWidget(glWidget, 1);
+
+ QVBoxLayout *rightLayout = new QVBoxLayout;
+ rightLayout->addWidget(new QLabel(tr("Control (Space toggles):")));
+ crCtrl = new QComboBox();
+ crCtrl->addItem(tr("Eye"));
+ crCtrl->addItem(tr("Reference"));
+ crCtrl->addItem(tr("V-Vector"));
+ crCtrl->addItem(tr("Perspective Angle"));
+ crCtrl->setCurrentIndex(0);
+ connect(crCtrl, SIGNAL(activated(int)), this, SLOT(ctrlSelectionChanged(int)));
+ rightLayout->addWidget(crCtrl);
+ rightLayout->addStretch(1);
+ mainLayout->addLayout(rightLayout, 0);
+ setLayout(mainLayout);
+
+ setWindowTitle(tr("QGLE 3D Viewer"));
+
+ // Accept keyboard events
+ setFocusPolicy(Qt::StrongFocus);
+ setFocus(Qt::OtherFocusReason);
+
+ zoomStep = 5.0;
+ rotateStep = 1.0;
+ distanceStep = 0.1;
+ ctrl = CTRL_EYE;
+}
+
+void QGLE3DViewer::ctrlSelectionChanged(int value) {
+ ctrl = (CTRL_CMD)value;
+}
+
+//! Called when the user presses a key
+void QGLE3DViewer::keyPressEvent(QKeyEvent *event)
+{
+ if (event->modifiers() != Qt::NoModifier) {
+ event->ignore();
+ }
+ GLEPoint3D vec;
+ switch (event->key())
+ {
+ case Qt::Key_Space:
+ if (ctrl == CTRL_EYE) ctrl = CTRL_REF;
+ else if (ctrl == CTRL_REF) ctrl = CTRL_VVEC;
+ else if (ctrl == CTRL_VVEC) ctrl = CTRL_PERSP_ANG;
+ else ctrl = CTRL_EYE;
+ crCtrl->setCurrentIndex((int)ctrl);
+ break;
+ case Qt::Key_PageUp:
+ vec.set(0,0,1);
+ vec.dotScalar(distanceStep);
+ if (ctrl != CTRL_REF) glWidget->zoom(-1.0*zoomStep/100.0);
+ else glWidget->reference(vec);
+ break;
+ case Qt::Key_PageDown:
+ vec.set(0,0,-1);
+ vec.dotScalar(distanceStep);
+ if (ctrl != CTRL_REF) glWidget->zoom(+1.0*zoomStep/100.0);
+ else glWidget->reference(vec);
+ break;
+ case Qt::Key_Down:
+ vec.set(0,1,0);
+ vec.dotScalar(distanceStep);
+ if (ctrl == CTRL_PERSP_ANG) glWidget->perspectiveAngle(-5.0);
+ else if (ctrl != CTRL_REF) glWidget->rotate(-1.0f*rotateStep, false);
+ else glWidget->reference(vec);
+ break;
+ case Qt::Key_Up:
+ vec.set(0,-1,0);
+ vec.dotScalar(distanceStep);
+ if (ctrl == CTRL_PERSP_ANG) glWidget->perspectiveAngle(+5.0);
+ else if (ctrl != CTRL_REF) glWidget->rotate(+1.0f*rotateStep, false);
+ else glWidget->reference(vec);
+ break;
+ case Qt::Key_Left:
+ vec.set(1,0,0);
+ vec.dotScalar(distanceStep);
+ if (ctrl == CTRL_EYE) glWidget->rotate(-1.0f*rotateStep, true);
+ else if (ctrl == CTRL_REF) glWidget->reference(vec);
+ else if (ctrl == CTRL_VVEC) glWidget->adjustV(+1.0f*rotateStep);
+ break;
+ case Qt::Key_Right:
+ vec.set(-1,0,0);
+ vec.dotScalar(distanceStep);
+ if (ctrl == CTRL_EYE) glWidget->rotate(+1.0f*rotateStep, true);
+ else if (ctrl == CTRL_REF) glWidget->reference(vec);
+ else if (ctrl == CTRL_VVEC) glWidget->adjustV(-1.0f*rotateStep);
+ break;
+ default:
+ event->ignore();
+ }
+}
+
diff --git a/src/gui/3dviewer.h b/src/gui/3dviewer.h
new file mode 100644
index 0000000..07f0c0f
--- /dev/null
+++ b/src/gui/3dviewer.h
@@ -0,0 +1,91 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+#ifndef _3DVIEWER_H
+#define _3DVIEWER_H
+
+#include <QDialog>
+#include <QGLWidget>
+#include "mainwindow.h"
+
+ class QGLE3DWidget : public QGLWidget
+ {
+ Q_OBJECT
+
+ public:
+ QGLE3DWidget(QWidget *parent = 0, GLEInterface* iface = NULL);
+ ~QGLE3DWidget();
+
+ QSize minimumSizeHint() const;
+ QSize sizeHint() const;
+ void zoom(double zoom);
+ void rotate(double angle, bool horiz);
+ void reference(const GLEPoint3D& p);
+ void adjustV(double angle);
+ void perspectiveAngle(double delta);
+
+ protected:
+ void initializeGL();
+ void paintGL();
+ void resizeGL(int width, int height);
+ void mousePressEvent(QMouseEvent *event);
+ void mouseMoveEvent(QMouseEvent *event);
+
+ private:
+ GLuint makeObject();
+ void normalizeAngle(int *angle);
+
+ double perspAngle;
+ GLuint object;
+ QPoint lastPos;
+ GLEInterface* gleInterface;
+ GLEProjection proj;
+};
+
+typedef enum {CTRL_EYE, CTRL_REF, CTRL_VVEC, CTRL_PERSP_ANG} CTRL_CMD;
+
+class QGLE3DViewer : public QDialog
+{
+ Q_OBJECT
+
+public:
+ QGLE3DViewer(QWidget* parent, GLEInterface* iface);
+
+protected:
+ //! Called when the user presses a key
+ void keyPressEvent(QKeyEvent *event);
+
+private slots:
+ void ctrlSelectionChanged(int value);
+
+private:
+ QSlider *createSlider();
+
+ QGLE3DWidget *glWidget;
+ QComboBox *crCtrl;
+
+ CTRL_CMD ctrl;
+ double zoomStep;
+ double rotateStep;
+ double distanceStep;
+};
+
+#endif
diff --git a/src/gui/MakefileAC.in b/src/gui/MakefileAC.in
new file mode 100644
index 0000000..2032af0
--- /dev/null
+++ b/src/gui/MakefileAC.in
@@ -0,0 +1,118 @@
+###################################################################################
+# QGLE - A Graphical Interface to GLE #
+# Copyright (C) 2006 A. S. Budden & J. Struyf #
+# #
+# This program is free software; you can redistribute it and/or #
+# modify it under the terms of the GNU General Public License #
+# as published by the Free Software Foundation; either version 2 #
+# of the License, or (at your option) any later version. #
+# #
+# This program is distributed in the hope that it will be useful, #
+# but WITHOUT ANY WARRANTY; without even the implied warranty of #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
+# GNU General Public License for more details. #
+# #
+# You should have received a copy of the GNU General Public License #
+# along with this program; if not, write to the Free Software #
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #
+# #
+# Also add information on how to contact you by electronic and paper mail. #
+###################################################################################
+
+include ../../config.i
+include ../../config.aconf
+
+QMAKE_PROG=@QMAKE_PROG@
+MAKE_PROG=$(MAKE)
+
+.PHONY : all
+.PHONY : clean
+.PHONY : qmake
+.PHONY : domake
+.PHONY : repmake
+.PHONY : doclean
+.PHONY : dosed
+
+ifeq (@HAVE_MINGW@,1)
+ MAKE_PROG=mingw32-make
+endif
+
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+
+INSTALL_LIB=@libdir@
+INSTALL_BIN=@GLE_INSTALL_BIN@
+INSTALL_DIR=@GLE_INSTALL_DATA@
+
+CXX=@CXX@
+CPPFLAGS=@CPPFLAGS@
+SIMPLE_LDFLAGS=@SIMPLE_LDFLAGS@
+SIMPLE_LIBS=@SIMPLE_LIBS@
+CPPFLAGS := $(strip $(CPPFLAGS))
+
+TOMAKE=
+TOCLEAN=
+QMAKE_OPTS=
+ifeq (@HAVE_QT@,1)
+ TOMAKE=Makefile
+ ifeq (@HAVE_AUTOPACKAGE@,1)
+ TOMAKE:=$(TOMAKE) repmake
+ endif
+ TOMAKE:=$(TOMAKE) domake
+ TOCLEAN=doclean
+ ifeq (@HAVE_MAC@,1)
+ QMAKE_OPTS:=-spec macx-g++
+ TOMAKE:=$(TOMAKE) install_qgle_name_mac
+ endif
+ ifeq (@HAVE_FREEBSD@,1)
+ QMAKE_OPTS:=-spec freebsd-g++
+ endif
+endif
+ifeq (@HAVE_MAC@,1)
+ TOMAKE:=$(TOMAKE) $(PROJECT_BINDIR)/bin/glegs
+endif
+
+all: $(TOMAKE)
+
+clean: $(TOCLEAN)
+
+Makefile: qgle.pro
+ $(QMAKE_PROG) $(QMAKE_OPTS)
+
+qmake:
+ $(QMAKE_PROG) $(QMAKE_OPTS)
+
+domake:
+ $(MAKE_PROG)
+
+repmake:
+ perl ../../platform/autopackage/qt-replace.pl Makefile
+
+doclean:
+ -$(MAKE_PROG) clean
+ -@$(RM) qgle install_qgle_name_mac Makefile
+ -@$(RMDIR) moc
+ -@$(RMDIR) objects
+
+SEDCMD = sed -i -e \
+ 's@\\([^-]\\)g\\(cc\\|++\\)@\\1/mnt/c/mingw/bin/g\\2@' -e \
+ 's@\\([A-Za-z0-9:]\\)\\\\\\([A-Za-z0-9:]\\)@\\1/\\2 at g' -e \
+ 's@^DEL_FILE.*@DEL_FILE = rm -f@' -e 's@^MOVE.*@MOVE = mv -f@' -e \
+ 's@^COPY[ =].*@COPY = cp -f@' -e 's@^COPY_DIR.*@COPY_DIR = \$(COPY) \
+ -r@' -e 's@^CHK_DIR_EXISTS.*@CHK_DIR_EXISTS = test -d@' -e \
+ 's@^MKDIR.*@MKDIR = mkdir -p@' -e 's at debug[\\\\]@debug/@' Makefile*
+
+dosed:
+ $(SEDCMD)
+
+EXTRA_OBJS := ../gle/cutils.$(OBJ_SUFF) ../gle/file_io.$(OBJ_SUFF)
+ifeq (@HAVE_LIBGLE_CPPFLAGS@,1)
+ EXTRA_OBJS := ../gle/cutils.static.$(OBJ_SUFF) ../gle/file_io.static.$(OBJ_SUFF)
+endif
+
+$(PROJECT_BINDIR)/bin/glegs: glegs.cpp $(EXTRA_OBJS)
+ $(CXX) glegs.cpp $(CPPFLAGS) $(SIMPLE_LDFLAGS) -o $(PROJECT_BINDIR)/bin/glegs $(EXTRA_OBJS) $(SIMPLE_LIBS) -ldl
+
+install_qgle_name_mac: $(PROJECT_BINDIR)/bin/QGLE.app/Contents/MacOS/QGLE
+ install_name_tool -change libgle-graphics- at GLE_VERSION@.dylib $(DESTDIR)$(INSTALL_LIB)/libgle-graphics- at GLE_VERSION@.dylib $(PROJECT_BINDIR)/bin/QGLE.app/Contents/MacOS/QGLE
+ touch install_qgle_name_mac
diff --git a/src/gui/about.cpp b/src/gui/about.cpp
new file mode 100644
index 0000000..d21b090
--- /dev/null
+++ b/src/gui/about.cpp
@@ -0,0 +1,170 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+/***************************************************************
+ * about.cpp: The class implementation for the about box. *
+ ***************************************************************/
+
+#include <QtGui>
+#include "about.h"
+#include "qgle_statics.h"
+#include "qgle_definitions.h"
+#include "../gle/gle-interface/gle-interface.h"
+
+class MyQTextBrowser : public QTextBrowser {
+public:
+ MyQTextBrowser();
+ virtual ~MyQTextBrowser();
+ virtual QSize sizeHint () const;
+};
+
+MyQTextBrowser::MyQTextBrowser() {
+}
+
+MyQTextBrowser::~MyQTextBrowser() {
+}
+
+QSize MyQTextBrowser::sizeHint() const {
+ QSizeF size = document()->size();
+ return QSize((int)size.width()+5, (int)size.height()+10);
+}
+
+AboutBox::AboutBox(QWidget* par, GLEInterface* gleInterface) : QDialog(par) {
+ m_gleInterface = gleInterface;
+
+ // Set the window title and size
+ setWindowTitle(tr("About %1").arg(APP_NAME));
+
+ QHBoxLayout *top = new QHBoxLayout();
+ QVBoxLayout *left = new QVBoxLayout();
+ QLabel* icon = new QLabel(this);
+ icon->setPixmap(QPixmap(":/images/gle_shadow.png").scaled(QSize(64, 64)));
+ left->addWidget(icon);
+ left->addStretch(1);
+ top->addLayout(left);
+
+ QWidget* license = createLicensePanel();
+ QTabWidget* tabWidget = new QTabWidget();
+ tabWidget->addTab(createAboutPanel(), tr("About"));
+ tabWidget->addTab(createContributorsPanel(), tr("Contributors"));
+ tabWidget->addTab(license, tr("License"));
+ top->addWidget(tabWidget);
+
+ QPushButton *okButton = new QPushButton(tr("Close"));
+ connect(okButton, SIGNAL(clicked()), this, SLOT(close()));
+ QHBoxLayout *buttonLayout = new QHBoxLayout();
+ buttonLayout->addStretch(1);
+ buttonLayout->addWidget(okButton);
+
+ QVBoxLayout *layout = new QVBoxLayout();
+ layout->addLayout(top);
+ layout->addLayout(buttonLayout);
+ setLayout(layout);
+}
+
+// SLOT: show a given URL
+void AboutBox::showURL(const QUrl& url) {
+ QDesktopServices::openUrl(url);
+}
+
+QTextBrowser* AboutBox::createAboutPanel()
+{
+ // Create a label to display readme.txt
+ MyQTextBrowser* label = new MyQTextBrowser();
+ label->setOpenLinks(false);
+ connect(label, SIGNAL(anchorClicked(const QUrl&)), this, SLOT(showURL(const QUrl&)));
+ QFile file(":/about.html");
+ // Open the file as a read only text file
+ if (file.open(QIODevice::ReadOnly | QIODevice::Text))
+ {
+ QString html(file.readAll().constData());
+ html.replace(tr("*VERSION*"), QString::fromUtf8(m_gleInterface->getGLEVersion().c_str()));
+ html.replace(tr("*DATE*"), QString::fromUtf8(m_gleInterface->getGLEBuildDate().c_str()));
+ label->setHtml(html);
+ }
+ label->document()->setTextWidth(m_minWidth);
+ return label;
+}
+
+QWidget* AboutBox::createContributorsPanel()
+{
+ QString html(tr(""
+ "<h2>Contributors</h2>"
+ "<p>"
+ "The following people have given their time and talent to help support the GLE/QGLE effort (in alphabetical order)."
+ "</p>"
+ ""
+ "<ul>"
+ "<li>A. S. Budden: programming (QGLE), packager for Arch Linux</li>"
+ "<li>Andrey G. Grozin: packager for Gentoo Linux</li>"
+ "<li>Axel Rohde: 3.3f-h versions (these were 32 bit DOS and OS/2 ports)</li>"
+ "<li>Bryn Jeffries: programming (Linux)</li>"
+ "<li>Chris Pugmire: original program creation and design</li>"
+ "<li>Christoph Brendes: programming</li>"
+ "<li>David Parfitt: documentation (GLE users guide)</li>"
+ "<li>Edd Edmondson: packager for Mac OS/X"
+ "<li>Jan Struyf: programming (and current 4.x series maintainer)</li>"
+ "<li>Laurence Abbott: programming</li>"
+ "<li>Michal Vyskocil: packager for openSUSE</li>"
+ "<li>Stephen Blundell: documentation (GLE users guide)</li>"
+ "<li>Steve Wilkinson: programming (user interface)</li>"
+ "<li>Terje Røsten: packager for Fedora Core</li>"
+ "<li>Vincent LaBella: resurrected 3.3h to GLE 4.0 C++ code base</li>"
+ "<li>Zbigniew Kisiel: testing</li>"
+ "</ul>"
+ "<p> </p>"
+ ""));
+ QTextBrowser* label = new QTextBrowser();
+ label->setOpenLinks(false);
+ label->setHtml(html);
+ return label;
+}
+
+QWidget* AboutBox::createLicensePanel()
+{
+ // Create a label to display readme.txt
+ QTextEdit* label = new QTextEdit();
+ label->setReadOnly(true);
+ QString fileName(QString::fromUtf8(m_gleInterface->getManualLocation().c_str()));
+ fileName.resize(fileName.lastIndexOf(QDir::separator()));
+ fileName += QDir::separator();
+ fileName += tr("LICENSE.txt");
+ GLEInterface* iface = GLEGetInterfacePointer();
+ std::string licenseFileTxt;
+ bool res = iface->readFileOrGZIPTxt(fileName.toUtf8().constData(), &licenseFileTxt);
+ if (res) {
+ QFont font;
+ // Set the font to be fixed pitch
+ font.setFixedPitch(true);
+ font.setFamily("Courier");
+ font.setStretch(QFont::Condensed);
+ label->setLineWrapMode(QTextEdit::NoWrap);
+ label->setFont(font);
+ label->setTextColor(Qt::black);
+ // Get the text and put it in the label
+ label->setPlainText(licenseFileTxt.c_str());
+ QFontMetrics fm(font);
+ m_minWidth = fm.width("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
+ } else {
+ label->setPlainText(tr("File not found: '%1'").arg(fileName));
+ }
+ return label;
+}
diff --git a/src/gui/about.h b/src/gui/about.h
new file mode 100644
index 0000000..09b41f0
--- /dev/null
+++ b/src/gui/about.h
@@ -0,0 +1,55 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+/***************************************************************
+ * about.h: The class definition for the about box. *
+ ***************************************************************/
+#ifndef __ABOUTBOX_H
+#define __ABOUTBOX_H
+
+#include <QtGui>
+
+class GLEInterface;
+
+//! Class describing an about box to give information about QGLE
+class AboutBox : public QDialog
+{
+ Q_OBJECT
+
+public:
+ //! The class constructor
+ AboutBox(QWidget* par,GLEInterface* gleInterface);
+
+private:
+ QTextBrowser* createAboutPanel();
+ QWidget* createContributorsPanel();
+ QWidget* createLicensePanel();
+
+private slots:
+ //! Open a given URL
+ void showURL(const QUrl&);
+
+private:
+ GLEInterface* m_gleInterface;
+ int m_minWidth;
+};
+
+#endif
diff --git a/src/gui/about.html b/src/gui/about.html
new file mode 100644
index 0000000..4e6975d
--- /dev/null
+++ b/src/gui/about.html
@@ -0,0 +1,24 @@
+<div align="center">
+
+</div>
+<div align="center">
+<h1>About QGLE</h1>
+</div>
+<div align="center">
+Version: *VERSION*<br>
+Build date: *DATE*<br>
+ <br>
+<a href="http://www.gle-graphics.org">www.gle-graphics.org</a><br>
+</div>
+<div align="center">
+
+</div>
+<div align="left">
+QGLE is the graphical user interface of GLE.
+</div>
+<div align="left">
+
+</div>
+<div align="left">
+GLE (Graphics Layout Engine) is a graphics scripting language designed for creating publication quality figures (e.g., a chart, plot, graph, or diagram). GLE supports various chart types (including function plot, histogram, bar chart, scatter plot, contour plot, color map, and surface plot) through a simple but flexible set of graphing commands. More complex output can be created by relying on GLE's scripting language, which is full featured with subroutines, variables, and logic control [...]
+</div>
diff --git a/src/gui/amove.cpp b/src/gui/amove.cpp
new file mode 100644
index 0000000..f82888a
--- /dev/null
+++ b/src/gui/amove.cpp
@@ -0,0 +1,178 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+#include "amove.h"
+
+// The constructor for the line object
+GLEAmove::GLEAmove(double resolution, QSize imageSize, GLEDrawingArea *area) :
+ GLEDrawingObject(resolution, imageSize, area)
+{
+ // Make sure the line is updated if a point changes or
+ // the image size changes
+ connect(this, SIGNAL(pointChanged()),
+ this, SLOT(updateAmove()));
+ connect(this, SIGNAL(imageChanged()),
+ this, SLOT(updateAmove()));
+
+ amove = true;
+}
+
+void GLEAmove::createOTracks()
+{
+}
+
+// Update the painter path
+void GLEAmove::updateAmove()
+{
+ // Only do this if both the start and end have been set
+ if (isSet(CentrePoint))
+ {
+ // This is guaranteed to have been created in the constructor
+ // of GLEDrawingObject
+ delete(paintPath);
+ // Create a new path starting at lineStart
+ paintPath = new QPainterPath();
+ QPointF qtAmove = getQtPoint(CentrePoint);
+
+ paintPath->addRect(QRectF(qtAmove.x()-AMOVE_LENGTH,
+ qtAmove.y()-AMOVE_LENGTH,
+ 2*AMOVE_LENGTH,
+ 2*AMOVE_LENGTH));
+
+ osnapHandles.clear();
+ osnapHandles.append(QPair<QPointF,int>(qtAmove,QGLE::CentreSnap));
+ }
+}
+
+void GLEAmove::addRelativeOSnaps(QPointF p)
+{
+ UNUSED_ARG(p);
+}
+
+void GLEAmove::draw(QPainter *p)
+{
+ QGLE::drawCross(p, getQtPoint(CentrePoint), AMOVE_LENGTH, pen());
+}
+
+QList<QPointF> GLEAmove::getTangents(QPointF p)
+{
+ QList<QPointF> empty;
+ UNUSED_ARG(p);
+ return(empty);
+}
+
+bool GLEAmove::hasTangents()
+{
+ return(false);
+}
+
+QList<QPointF> GLEAmove::getPerpendiculars(QPointF p)
+{
+ QList<QPointF> empty;
+ UNUSED_ARG(p);
+ return(empty);
+}
+
+bool GLEAmove::hasPerpendiculars()
+{
+ return(false);
+}
+
+
+
+
+double GLEAmove::distanceToPoint(const QPointF& p, QPointF *nearestPoint)
+{
+ QPointF amovePoint = getQtPoint(CentrePoint);
+ if (nearestPoint)
+ *nearestPoint = amovePoint;
+ return(QGLE::distance(amovePoint, p));
+}
+
+// Set a point (start or end in the case of a line)
+void GLEAmove::setPoint(int pointChoice, const QPointF& p, bool)
+{
+ switch(pointChoice)
+ {
+ case CentrePoint:
+ pointHash[pointChoice] = QGLE::absQtToGLE(p, dpi, pixmap.height());
+ break;
+ }
+ updateAmove();
+}
+
+QList<QPointF> GLEAmove::intersections(double qtm, double qtc, bool vertical)
+{
+ UNUSED_ARG(qtm);
+ UNUSED_ARG(qtc);
+ UNUSED_ARG(vertical);
+ return QList<QPointF>();
+}
+
+QList<QPointF> GLEAmove::intersections(QPointF qtp1, QPointF qtp2)
+{
+ UNUSED_ARG(qtp1);
+ UNUSED_ARG(qtp2);
+ return QList<QPointF>();
+}
+
+QList<QPointF> GLEAmove::intersections(QPointF qtp1, double angle)
+{
+ UNUSED_ARG(qtp1);
+ UNUSED_ARG(angle);
+ return QList<QPointF>();
+
+}
+
+bool GLEAmove::isInside(QPointF p)
+{
+ UNUSED_ARG(p);
+ return(false);
+}
+
+
+void GLEAmove::scaleBy(double xratio, double yratio)
+{
+ pointHash.clear();
+
+ QPointF oldOffset = getQtPoint(CentrePoint, true) - basePoint;
+ QPointF newOffset;
+ newOffset.setX(oldOffset.x() * xratio);
+ newOffset.setY(oldOffset.y() * yratio);
+
+ setPoint(CentrePoint, basePoint + newOffset);
+}
+
+void GLEAmove::moveBy(QPointF offset)
+{
+ pointHash.clear();
+ // Moves relative to storedPointHash
+ QPointF start = getQtPoint(CentrePoint, true);
+ setPoint(CentrePoint, start + offset);
+}
+
+void GLEAmove::rotateBy(double radians)
+{
+ pointHash.clear();
+ // Moves relative to storedPointHash
+ QPointF start = getQtPoint(CentrePoint, true);
+ setPoint(CentrePoint, QGLE::rotateAboutPoint(start, radians, basePoint));
+}
diff --git a/src/gui/amove.h b/src/gui/amove.h
new file mode 100644
index 0000000..08110b5
--- /dev/null
+++ b/src/gui/amove.h
@@ -0,0 +1,74 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+#ifndef _GLEAMOVE_H
+#define _GLEAMOVE_H
+
+#include "drawingobject.h"
+
+//! Class describing a line drawing object
+class GLEAmove : public GLEDrawingObject
+{
+ Q_OBJECT
+
+public:
+
+ //! Enumeration of the points needed to draw a line
+ enum Points
+ {
+ CentrePoint
+ };
+
+ //! Constructor used for initialising variables and connections
+ GLEAmove(double resolution, QSize imageSize, GLEDrawingArea *area);
+
+ //! Draw the line on the provided painter
+ void draw(QPainter *p);
+ //! Return the shortest distance between a given point and the line
+ double distanceToPoint(const QPointF& p, QPointF *nearestPoint);
+ //! Set one of the enumerated points
+ void setPoint(int pointChoice, const QPointF& p, bool update = true);
+ void addRelativeOSnaps(QPointF p);
+
+ //! Find points where a line intersects the line
+ // If vertical = true, m contains 'x'
+ QList<QPointF> intersections(double qtm, double qtc, bool vertical = false);
+ QList<QPointF> intersections(QPointF qtp1, double angle);
+ QList<QPointF> intersections(QPointF qtp1, QPointF qtp2);
+ QList<QPointF> getTangents(QPointF p);
+ bool hasTangents();
+ QList<QPointF> getPerpendiculars(QPointF p);
+ bool hasPerpendiculars();
+
+ //! Is the point inside the object (for a line, always false)
+ bool isInside(QPointF p);
+
+ void scaleBy(double xratio, double yratio);
+ void moveBy(QPointF offset);
+ void rotateBy(double radians);
+ void createOTracks();
+
+private slots:
+ //! Update the painter path when the resolution or start/end points change
+ void updateAmove();
+};
+
+#endif
diff --git a/src/gui/arc.cpp b/src/gui/arc.cpp
new file mode 100644
index 0000000..a7e8c1a
--- /dev/null
+++ b/src/gui/arc.cpp
@@ -0,0 +1,865 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+#include "arc.h"
+
+// The constructor for the line object
+GLEArc::GLEArc(double resolution, QSize imageSize, GLEDrawingArea *area) :
+ GLEDrawingObject(resolution, imageSize, area)
+{
+ directionReversed = false;
+ // Make sure the line is updated if a point changes or
+ // the image size changes
+ connect(this, SIGNAL(pointChanged()),
+ this, SLOT(updateArc()));
+ connect(this, SIGNAL(imageChanged()),
+ this, SLOT(updateArc()));
+ connect(this, SIGNAL(propertyChanged(int)),
+ this, SLOT(updateFromProperty(int)));
+
+ validProperties
+ << LineColour
+ << LineWidth
+ << LineStyle
+ << ArrowHeadPresence;
+ properties[LineColour] = propertyDescriptions[LineColour].defaultValue;
+ properties[LineWidth] = propertyDescriptions[LineWidth].defaultValue;
+ properties[LineStyle] = propertyDescriptions[LineStyle].defaultValue;
+ properties[ArrowHeadPresence] = propertyDescriptions[ArrowHeadPresence].defaultValue;
+
+ amove = false;
+}
+
+void GLEArc::createOTracks()
+{
+ if (isSet(CentrePoint) && isSet(StartPoint) && isSet(EndPoint))
+ {
+ // We need to know the page size to be able to do this!
+ }
+}
+
+void GLEArc::updateFromProperty(int)
+{
+ GLEArcDO* obj = (GLEArcDO*)getGLEObject();
+ GLEPropertyStore* obj_prop = obj->getProperties();
+
+ obj_prop->setRealProperty(GLEDOPropertyLineWidth, getProperty(LineWidth).toDouble());
+ QColor color = getProperty(LineColour).value<QColor>();
+ GLEColor* gle_color = obj->getProperties()->getColorProperty(GLEDOPropertyColor);
+ gle_color->setRGB255(color.red(), color.green(), color.blue());
+ QGLE::qtToGLEString(getProperty(LineStyle).toString(), obj_prop->getStringProperty(GLEDOPropertyLineStyle));
+ obj->setArrow((GLEHasArrow)getProperty(ArrowHeadPresence).toInt());
+
+ ((GLEDrawingArea*)parent())->setDirtyAndSave();
+}
+
+void GLEArc::getGLEArcT0T1(double* t0, double* t1)
+{
+ if (directionReversed) {
+ *t0 = endAngleDeg();
+ *t1 = startAngleDeg();
+ } else {
+ *t0 = startAngleDeg();
+ *t1 = endAngleDeg();
+ }
+ *t1 = GLEArcNormalizedAngle2(*t0, *t1);
+}
+
+// Update the painter path
+void GLEArc::updateArc()
+{
+ QPointF p;
+ QPair<QPointF,int> snap;
+ // Only do this if both the centre and radius have been set
+ if (isSet(CentrePoint) && isSet(StartPoint) && isSet(EndPoint))
+ {
+ // This is guaranteed to have been created in the constructor
+ // of GLEDrawingObject
+ delete(paintPath);
+ // Create a new path starting at one end of the arc
+ if (!directionReversed)
+ {
+ paintPath = new QPainterPath(getQtPoint(StartPoint));
+ // Add the circle based on the qrect
+ paintPath->arcTo(arcRect(), startAngleDeg(), QGLE::radiansToDegrees(endAngleRadConstrained()-startAngleRad()));
+ }
+ else
+ {
+ paintPath = new QPainterPath(getQtPoint(EndPoint));
+ paintPath->arcTo(arcRect(), endAngleDeg(), 360-QGLE::radiansToDegrees(endAngleRadConstrained()-startAngleRad()));
+ }
+
+ // Update the GLE Code
+/* gleCode->clear();
+ if (directionReversed)
+ gleCode->append(QString("! %1")
+ .arg(tr("Clockwise arc added using QGLE", "Comment added to source file")));
+ else
+ gleCode->append(QString("! %1")
+ .arg(tr("Anti-clockwise arc added using QGLE", "Comment added to source file")));
+
+ gleCode->append(QString("asetpos %1")
+ .arg(QGLE::GLEToStr(getGLEPoint(CentrePoint))));
+
+ if (directionReversed)
+ gleCode->append(QString("narc %1 %2 %3")
+ .arg(QGLE::GLEToStr(getGLELength(Radius)))
+ .arg(QGLE::GLEToStr(startAngleDeg()))
+ .arg(QGLE::GLEToStr(endAngleDeg())));
+ else
+ gleCode->append(QString("arc %1 %2 %3")
+ .arg(QGLE::GLEToStr(getGLELength(Radius)))
+ .arg(QGLE::GLEToStr(startAngleDeg()))
+ .arg(QGLE::GLEToStr(endAngleDeg())));
+
+ gleCode->append(QString(""));*/
+
+ // Update GLE object
+ GLEArcDO* arc = (GLEArcDO*)getGLEObject();
+ if (arc != NULL) {
+ arc->setCenter(QGLE::QPointFToGLEPoint(getGLEPoint(CentrePoint)));
+ arc->setRadius(getGLELength(Radius));
+ double t0, t1;
+ getGLEArcT0T1(&t0, &t1);
+ arc->setAngle1(t0);
+ arc->setAngle2(t1);
+ }
+
+ // Now we add the osnap handles
+ osnapHandles.clear();
+ for(int i=0;i<360;i+=90)
+ {
+ if (isOnArc(QGLE::degreesToRadians(i)))
+ {
+ p.setX(getGLELength(Radius)*cos(QGLE::degreesToRadians(i)));
+ p.setY(getGLELength(Radius)*sin(QGLE::degreesToRadians(i)));
+ p += getGLEPoint(CentrePoint);
+ snap.first = QGLE::absGLEToQt(p,dpi,pixmap.height());
+ snap.second = QGLE::QuadrantSnap;
+ osnapHandles.append(snap);
+ }
+ }
+ snap.first = getQtPoint(CentrePoint);
+ snap.second = QGLE::CentreSnap;
+ osnapHandles.append(snap);
+
+ snap.first = getQtPoint(StartPoint);
+ snap.second = QGLE::EndPointSnap;
+ osnapHandles.append(snap);
+
+ snap.first = getQtPoint(EndPoint);
+ snap.second = QGLE::EndPointSnap;
+ osnapHandles.append(snap);
+ }
+}
+
+void GLEArc::addRelativeOSnaps(QPointF p)
+{
+ if (isSet(CentrePoint) && isSet(Radius) && isSet(StartPoint) && isSet(EndPoint))
+ {
+ relativeOSnaps.clear();
+
+ QList<QPointF> perpendiculars = getPerpendiculars(p);
+ QPointF ppt;
+ foreach(ppt, perpendiculars)
+ {
+ relativeOSnaps.append(QPair<QPointF,int>(ppt, QGLE::PerpendicularSnap));
+ }
+
+ QList<QPointF> tangents = getTangents(p);
+
+ QPointF tpt;
+ foreach(tpt, tangents)
+ {
+ relativeOSnaps.append(QPair<QPointF,int>(tpt, QGLE::TangentSnap));
+ }
+
+// double angle;
+// // The above is identical to the circle code, now check they're on the arc
+// for(int i=relativeOSnaps.size()-1;i>=0;i--)
+// {
+// angle = QGLE::angleBetweenTwoPoints(getGLEPoint(CentrePoint),
+// QGLE::absQtToGLE(relativeOSnaps[i].first,dpi,pixmap.height()));
+// if (!isOnArc(angle))
+// relativeOSnaps.removeAt(i);
+// }
+ }
+}
+
+QList<QPointF> GLEArc::getTangents(QPointF p)
+{
+ QList<QPointF> tangents;
+ QPointF np;
+ if (!isInside(p))
+ {
+ double angleToCentre = QGLE::angleBetweenTwoPoints(p,getQtPoint(CentrePoint));
+ double radius = getQtLength(Radius);
+ // Now we need the tangential ones
+ double distanceToCentre = QGLE::distance(p, getQtPoint(CentrePoint));
+ double angleOffset = asin(radius/distanceToCentre);
+ double distanceToTangent = sqrt(pow(distanceToCentre,2)-pow(radius,2));
+
+ double angle = angleToCentre + angleOffset;
+ np = p + QPointF(distanceToTangent*cos(angle),distanceToTangent*sin(angle));
+ if (isOnArc(QGLE::angleBetweenTwoPoints(
+ getGLEPoint(CentrePoint),
+ QGLE::absQtToGLE(np,dpi,pixmap.height()))))
+ tangents.append(np);
+
+ angle = angleToCentre - angleOffset;
+ np = p + QPointF(distanceToTangent*cos(angle),distanceToTangent*sin(angle));
+ if (isOnArc(QGLE::angleBetweenTwoPoints(
+ getGLEPoint(CentrePoint),
+ QGLE::absQtToGLE(np,dpi,pixmap.height()))))
+ tangents.append(np);
+
+ }
+ return(tangents);
+}
+
+bool GLEArc::hasTangents()
+{
+ return(true);
+}
+
+QList<QPointF> GLEArc::getPerpendiculars(QPointF p)
+{
+ QList<QPointF> perpendiculars;
+
+ // The first perpendicular osnap is defined as the nearest point
+ QPointF np;
+ distanceToPointOnCircle(p,&np);
+ perpendiculars.append(np);
+
+ // The second perpendicular osnap is diametrically opposite the first one
+ double angleToCentre = QGLE::angleBetweenTwoPoints(np,getQtPoint(CentrePoint));
+ double radius = getQtLength(Radius);
+ double diameter = 2*radius;
+
+ np = np + QPointF(diameter*cos(angleToCentre),diameter*sin(angleToCentre));
+ perpendiculars.append(np);
+
+ // Are the points on the arc?
+ double angle;
+ for(int i=perpendiculars.size()-1;i>=0;i--)
+ {
+ angle = QGLE::angleBetweenTwoPoints(getGLEPoint(CentrePoint),
+ QGLE::absQtToGLE(perpendiculars[i],dpi,pixmap.height()));
+ if (!isOnArc(angle))
+ perpendiculars.removeAt(i);
+ }
+
+ return(perpendiculars);
+}
+
+bool GLEArc::hasPerpendiculars()
+{
+ return(true);
+}
+
+void GLEArc::drawArc(QPainter *p, double t1, double t2)
+{
+ p->drawArc(arcRect(), (int)(t1 * 16), (int)((t2 - t1) * 16));
+}
+
+void GLEArc::addBezier(QPainterPath *p, GLEBezier* bezier) {
+ QPointF p1(QGLE::absGLEToQt(bezier->getP1(), dpi, pixmap.height()));
+ QPointF p2(QGLE::absGLEToQt(bezier->getP2(), dpi, pixmap.height()));
+ QPointF p3(QGLE::absGLEToQt(bezier->getP3(), dpi, pixmap.height()));
+ p->cubicTo(p1, p2, p3);
+}
+
+void GLEArc::computeAndDraw(QPainter *p, GLEArcDO* obj, GLECurvedArrowHead* head) {
+ if (!head->isEnabled()) {
+ return;
+ }
+ head->computeArrowHead();
+ QPainterPath path;
+ path.moveTo(QGLE::absGLEToQt(head->getSide1()->getP0(), dpi, pixmap.height()));
+ addBezier(&path, head->getSide1());
+ addBezier(&path, head->getSide2());
+ if (head->getStyle() != GLEArrowStyleSimple) {
+ path.closeSubpath();
+ if (head->getStyle() == GLEArrowStyleEmpty) {
+ p->fillPath(path, QBrush(Qt::white));
+ } else {
+ QColor col;
+ GLEColor* color = obj->getProperties()->getColorProperty(GLEDOPropertyColor);
+ col.setRgbF(color->getRed(), color->getGreen(), color->getBlue());
+ p->fillPath(path, QBrush(col));
+ }
+ }
+ if (!head->isSharp()) {
+ p->drawPath(path);
+ }
+}
+
+void GLEArc::draw(QPainter *p)
+{
+ QPen cpen;
+ setPenProperties(cpen);
+ p->setPen(cpen);
+ if (!(isSet(StartPoint) && isSet(EndPoint))) {
+ return;
+ }
+ if (isSet(CentrePoint)) {
+ double t1, t2;
+ getGLEArcT0T1(&t1, &t2);
+ GLEArcDO* obj = (GLEArcDO*)getGLEObject();
+ if (obj != NULL && obj->getArrow() != 0) {
+ double r = getGLELength(Radius);
+ GLEPoint orig(getGLEPoint(CentrePoint).x(), getGLEPoint(CentrePoint).y());
+ GLECircleArc circle(orig, r, QGLE::degreesToRadians(t1), QGLE::degreesToRadians(t2));
+ GLECurvedArrowHead head_start(&circle);
+ GLECurvedArrowHead head_end(&circle);
+ GLEArcUpdateCurvedArrowHeads(&head_start, &head_end, &t1, &t2, obj->getProperties(), 1.0, obj->getArrow());
+ drawArc(p, t1, t2);
+ QPen new_pen = cpen;
+ new_pen.setJoinStyle(Qt::RoundJoin);
+ new_pen.setMiterLimit(20);
+ new_pen.setStyle(Qt::SolidLine);
+ p->setPen(new_pen);
+ computeAndDraw(p, obj, &head_start);
+ computeAndDraw(p, obj, &head_end);
+ } else {
+ drawArc(p, t1, t2);
+ }
+ } else {
+ // If we don't have a centre point, just draw a line
+ p->drawLine(getQtPoint(StartPoint),getQtPoint(EndPoint));
+ }
+}
+
+double GLEArc::distanceToPointOnCircle(QPointF p, QPointF *nearestPoint)
+{
+ QPointF c = getQtPoint(CentrePoint);
+ if (nearestPoint)
+ {
+ double r = getQtLength(Radius);
+ double theta = QGLE::angleBetweenTwoPoints(c,p);
+ nearestPoint->setX(r*cos(theta)+c.x());
+ nearestPoint->setY(r*sin(theta)+c.y());
+ }
+ // Calculations in QT coordinates
+ return(fabs(QGLE::distance(c,p)-getQtLength(Radius)));
+}
+
+double GLEArc::distanceToPoint(const QPointF& p, QPointF *nearestPoint)
+{
+ // Calculations in GLE and Qt coordinates (to make the angles work!)
+ double s, e, angle;
+ QPointF cp, sp, ep;
+ QPointF gleP = QGLE::absQtToGLE(p, dpi, pixmap.height());
+ QPointF np;
+
+ // We need all the points, so if any are missing, return a very large number!
+ if (!(isSet(CentrePoint) && isSet(Radius) && isSet(StartPoint) && isSet(EndPoint)))
+ return(1e6);
+
+ sp = getQtPoint(StartPoint);
+ ep = getQtPoint(EndPoint);
+
+ // Get the centre point and calculate the angle between the current point and it
+ cp = getGLEPoint(CentrePoint);
+ angle = QGLE::angleBetweenTwoPoints(cp,gleP);
+
+ // If the point is on the arc (in terms of angle), the calculation is simple
+ if (isOnArc(angle))
+ {
+ if (nearestPoint)
+ {
+ double r = getGLELength(Radius);
+ np.setX(r*cos(angle)+cp.x());
+ np.setY(r*sin(angle)+cp.y());
+ *nearestPoint = QGLE::absGLEToQt(np, dpi, pixmap.height());
+ }
+
+ cp = getQtPoint(CentrePoint);
+ return(fabs(QGLE::distance(cp,p)-getQtLength(Radius)));
+ }
+
+
+ // Otherwise, the distance will be the shortest distance to one of the end points
+ s = QGLE::distance(p,sp);
+ e = QGLE::distance(p,ep);
+
+ if (s < e)
+ {
+ if (nearestPoint)
+ *nearestPoint = sp;
+ return(s);
+ }
+ else
+ {
+ if (nearestPoint)
+ *nearestPoint = ep;
+ return(e);
+ }
+}
+
+bool GLEArc::isOnArc(double angle)
+{
+ // Decide whether an angle is on the drawn part of an arc
+ double s, e;
+
+ if (!(isSet(CentrePoint) && isSet(Radius) && isSet(StartPoint) && isSet(EndPoint)))
+ return(false);
+
+
+ // Choose the start and end angles according to the direction of drawing
+ if (!directionReversed)
+ {
+ s = startAngleRad();
+ e = endAngleRad();
+ }
+ else
+ {
+ s = endAngleRad();
+ e = startAngleRad();
+ }
+
+ // Ensure that the end point is greater than the start point
+ while (e < s)
+ e += 2*M_PI;
+
+ int i;
+
+ // Decide whether the angle is in between the two points
+ for (i=0;i<2;i++)
+ {
+ angle += i*2*M_PI;
+ if ((angle >= s) && (angle <= e))
+ return(true);
+ }
+
+ return(false);
+
+}
+
+// Set a point (start or end in the case of a line)
+void GLEArc::setPoint(int pointChoice, const QPointF& p, bool update)
+{
+ QPointF s,e,m,c,mid1,mid2;
+ double mg1,mg2,x,y;
+ bool ok = false;
+ switch(pointChoice)
+ {
+
+ // Set the radius based on a centre point
+ case CentrePoint:
+ s = getGLEPoint(StartPoint);
+ pointHash[CentrePoint] = QGLE::absQtToGLE(p, dpi, pixmap.height());
+ x = QGLE::distance(getGLEPoint(CentrePoint),s);
+ if (x > 0.0)
+ pointHash[Radius] = QPointF(x,0);
+ break;
+
+ case MidPoint:
+ // Find the centre point and radius based on a random
+ // point on the arc
+ if (!(isSet(StartPoint) && isSet(EndPoint)))
+ return;
+
+ // Get the basic points in GLE coordinates
+ s = getGLEPoint(StartPoint);
+ e = getGLEPoint(EndPoint);
+ m = QGLE::absQtToGLE(p, dpi,pixmap.height());
+
+ // Find the halfway points
+ mid1 = QPointF((s.x()+m.x())/2.0,
+ (s.y()+m.y())/2.0);
+ mid2 = QPointF((e.x()+m.x())/2.0,
+ (e.y()+m.y())/2.0);
+
+ if ((m.y() == s.y()) && (m.x() != s.x()) && (m.y() != e.y()))
+ {
+ // start and mid point are on a horizontal line, but
+ // points are not coincident or on the same line as
+ // s - e
+ //qDebug() << "1: " << s << m << e;
+
+ mg2 = (e.x()-m.x())/(m.y()-e.y());
+ x = mid1.x();
+ y = mg2*x + mid2.y() - mg2*mid2.x();
+
+ c = QPointF(x,y);
+
+ pointHash[CentrePoint] = c;
+ pointHash[Radius] = QPointF(QGLE::distance(c,m),0);
+
+ if (!isOnArc(QGLE::angleBetweenTwoPoints(c,m)))
+ directionReversed = !directionReversed;
+
+ ok = true;
+
+ }
+ else if ((m.y() == e.y()) && (m.x() != e.x()) && (m.y() != s.y()))
+ {
+ //qDebug() << "2: " << s << m << e;
+ // end and mid point are on a horizontal line, but
+ // points are not coincident or on the same line as
+ // s - e
+ mg1 = (s.x()-m.x())/(m.y()-s.y());
+ x = mid2.x();
+ y = mg1*x + mid1.y() - mg1*mid1.x();
+
+ c = QPointF(x,y);
+
+ pointHash[CentrePoint] = c;
+ pointHash[Radius] = QPointF(QGLE::distance(c,m),0);
+
+ if (!isOnArc(QGLE::angleBetweenTwoPoints(c,m)))
+ directionReversed = !directionReversed;
+
+ ok = true;
+ }
+ else if ((m.y() != e.y()) && (m.y() != s.y()))
+ {
+ //qDebug() << "3";
+ // The most common case: points are nicely spaced
+
+ // Find the gradients of the normals to the intersecting lines
+ mg1 = (s.x()-m.x())/(m.y()-s.y());
+ mg2 = (e.x()-m.x())/(m.y()-e.y());
+
+ if (!(mg1 == mg2))
+ {
+ x = (mid2.y() - mg2*mid2.x() - mid1.y() + mg1*mid1.x())/
+ (mg1 - mg2);
+ y = mg1*x + mid1.y() - mg1*mid1.x();
+
+ c = QPointF(x,y);
+
+ pointHash[CentrePoint] = c;
+ pointHash[Radius] = QPointF(QGLE::distance(c,m),0);
+
+ if (!isOnArc(QGLE::angleBetweenTwoPoints(c,m)))
+ directionReversed = !directionReversed;
+
+ ok = true;
+ }
+ }
+
+ if (!ok)
+ {
+ pointHash.remove(CentrePoint);
+ pointHash.remove(Radius);
+ }
+
+
+
+ // The simple cases:
+ case StartPoint:
+ case EndPoint:
+ pointHash[pointChoice] = QGLE::absQtToGLE(p, dpi, pixmap.height());
+ break;
+ }
+
+ // Update the arc
+ if (update) updateArc();
+}
+
+double GLEArc::startAngleDeg()
+{
+ // Return the angle between the centre and the start point
+ // in degrees
+ return(QGLE::radiansToDegrees(startAngleRad()));
+
+}
+
+double GLEArc::endAngleDeg()
+{
+ // Return the angle between the centre and the end point
+ // in degrees
+ return(QGLE::radiansToDegrees(endAngleRad()));
+
+}
+
+double GLEArc::endAngleDegConstrained()
+{
+ // Return the angle between the centre and the end point
+ // in degrees and constrained to be greater than the
+ // start point (by adding 2*pi)
+ double e = endAngleDeg();
+ double s = startAngleDeg();
+ while (e < s)
+ e += 360.0;
+ return(e);
+}
+
+double GLEArc::startAngleRad()
+{
+ // Return the angle between the centre and the start point
+ // in radians
+ QPointF s = getGLEPoint(StartPoint);
+ QPointF c = getGLEPoint(CentrePoint);
+ return(QGLE::angleBetweenTwoPoints(c,s));
+}
+
+double GLEArc::endAngleRad()
+{
+ // Return the angle between the centre and the end point
+ // in radians
+ QPointF e = getGLEPoint(EndPoint);
+ QPointF c = getGLEPoint(CentrePoint);
+ return(QGLE::angleBetweenTwoPoints(c,e));
+}
+
+double GLEArc::endAngleRadConstrained()
+{
+ // Return the angle between the centre and the end point
+ // in radians and constrained to be greater than the start
+ // start point (by adding 2*pi)
+ double e = endAngleRad();
+ double s = startAngleRad();
+ while (e < s)
+ e += 2*M_PI;
+ return(e);
+}
+
+
+QRectF GLEArc::arcRect()
+{
+ // Return the rectangle surrounding the circle upon which the arc is based
+
+ // Work in Qt coordinates
+ QPointF cp = getQtPoint(CentrePoint);
+ double r = getQtLength(Radius);
+
+ if ((isSet(Radius) && isSet(CentrePoint)))
+ return(QRectF(cp.x()-r, cp.y() - r, 2*r, 2*r));
+ else
+ return(QRectF(0,0,0,0));
+
+}
+
+
+QList<QPointF> GLEArc::intersections(double qtm, double qtc, bool vertical)
+{
+ QPointF one, two;
+ // For circles and arcs, we'll deal with points individually:
+ if (vertical)
+ {
+ one.setX(qtm);
+ two.setX(qtm);
+ one.setY(0.0);
+ two.setY(1.0);
+ }
+ else
+ {
+ one.setX(0.0);
+ one.setY(qtc);
+ two.setX(1.0);
+ two.setY(qtm + qtc);
+ }
+
+ return(intersections(one,two));
+}
+
+
+QList<QPointF> GLEArc::intersections(QPointF qtp1, QPointF qtp2)
+{
+ // Based on http://tinyurl.com/qtgum
+ QList<QPointF> pointArray;
+
+ QPointF cp = getQtPoint(CentrePoint);
+ double r = getQtLength(Radius);
+ double a,b,c;
+ double bac;
+ double u;
+ double angle;
+ QPointF p;
+
+ a = pow((qtp2.x() - qtp1.x()),2) + pow((qtp2.y() - qtp1.y()),2);
+ b = 2 * ( (qtp2.x() - qtp1.x())*(qtp1.x()-cp.x()) + (qtp2.y()-qtp1.y())*(qtp1.y()-cp.y()));
+ c = pow(cp.x(),2)+pow(cp.y(),2)+pow(qtp1.x(),2)+pow(qtp1.y(),2)
+ - 2*(cp.x()*qtp1.x()+cp.y()*qtp1.y()) - pow(r,2);
+
+ bac = pow(b,2)-4*a*c;
+ if (bac == 0.0)
+ {
+ u = - b / (2*a);
+ p.setX(qtp1.x()+u*(qtp2.x()-qtp1.x()));
+ p.setY(qtp1.y()+u*(qtp2.y()-qtp1.y()));
+
+ angle = QGLE::angleBetweenTwoPoints(getGLEPoint(CentrePoint),
+ QGLE::absQtToGLE(p,dpi,pixmap.height()));
+ if (isOnArc(angle))
+ pointArray.append(p);
+ }
+ else if (bac > 0.0)
+ {
+ u = (-b + sqrt(bac))/(2*a);
+ p.setX(qtp1.x() + u*(qtp2.x()-qtp1.x()));
+ p.setY(qtp1.y() + u*(qtp2.y()-qtp1.y()));
+ angle = QGLE::angleBetweenTwoPoints(getGLEPoint(CentrePoint),
+ QGLE::absQtToGLE(p,dpi,pixmap.height()));
+ if (isOnArc(angle))
+ pointArray.append(p);
+ u = (-b - sqrt(bac))/(2*a);
+ p.setX(qtp1.x() + u*(qtp2.x()-qtp1.x()));
+ p.setY(qtp1.y() + u*(qtp2.y()-qtp1.y()));
+ angle = QGLE::angleBetweenTwoPoints(getGLEPoint(CentrePoint),
+ QGLE::absQtToGLE(p,dpi,pixmap.height()));
+ if (isOnArc(angle))
+ pointArray.append(p);
+ }
+
+ return(pointArray);
+}
+
+QList<QPointF> GLEArc::intersections(QPointF qtp1, double angle)
+{
+ // This intersection code must determine the intersections in
+ // a particular direction from a start point
+
+ // First get a list based on an infinite line:
+ QPointF qtp2 = qtp1 + QPointF(1.0*cos(angle),1.0*sin(angle));
+ QList<QPointF> allIntersections = intersections(qtp1,qtp2);
+
+ // Now go through the list and determine which are in the right
+ // direction
+ QList<QPointF> correctIntersections;
+ QPointF pt;
+ double ptAngle;
+
+ foreach(pt, allIntersections)
+ {
+ ptAngle = QGLE::angleBetweenTwoPoints(qtp1, pt);
+ if (QGLE::quadrant(ptAngle) == QGLE::quadrant(angle))
+ correctIntersections.append(pt);
+ }
+
+ return(correctIntersections);
+
+}
+
+bool GLEArc::isInside(QPointF p)
+{
+ QPointF cp = getGLEPoint(CentrePoint);
+ QPointF gp = QGLE::absQtToGLE(p,dpi,pixmap.height());
+ double angle;
+ if (QGLE::distance(cp,gp) < getGLELength(Radius))
+ {
+ angle = QGLE::angleBetweenTwoPoints(cp,gp);
+ if (isOnArc(angle))
+ return(true);
+ }
+
+ return(false);
+}
+
+bool GLEArc::isInsideCircle(QPointF p)
+{
+ QPointF cp = getQtPoint(CentrePoint);
+ if (QGLE::distance(cp,p) < getQtLength(Radius))
+ return(true);
+ else
+ return(false);
+}
+
+double GLEArc::nearestPriorityOSnap(const QPointF& pt, QPointF *osnap)
+{
+ QPointF startPt = getQtPoint(StartPoint, true);
+ QPointF endPt = getQtPoint(EndPoint, true);
+ double d1 = QGLE::distance(pt, startPt);
+ double d2 = QGLE::distance(pt, endPt);
+ if (d1 < d2) {
+ *osnap = startPt;
+ return d1;
+ } else {
+ *osnap = endPt;
+ return d2;
+ }
+}
+
+bool GLEArc::findScaleOrigin(const QPointF& pt, QPointF* origin, int)
+{
+ QPointF startPt = getQtPoint(StartPoint, true);
+ QPointF endPt = getQtPoint(EndPoint, true);
+ if (QGLE::distance(pt, startPt) < QGLE::distance(pt, endPt))
+ *origin = endPt;
+ else
+ *origin = startPt;
+ return true;
+}
+
+int GLEArc::supportedTransformMode()
+{
+ return TransformModeFree;
+}
+
+void GLEArc::linearTransform(const GLELinearEquation& ex, const GLELinearEquation& ey)
+{
+ // The arc will need to support becoming an
+ // elliptical_n?arc before this can be properly
+ // supported.
+ pointHash.clear();
+ linearTransformPt(StartPoint, ex, ey, false);
+ linearTransformPt(EndPoint, ex, ey, false);
+ linearTransformPt(CentrePoint, ex, ey, false);
+ if (storedPointHash.contains(MidPoint))
+ {
+ linearTransformPt(MidPoint, ex, ey, false);
+ }
+ updateArc();
+}
+
+void GLEArc::moveBy(QPointF offset)
+{
+ pointHash.clear();
+ // Moves relative to storedPointHash
+ QPointF pt = getQtPoint(StartPoint, true);
+ setPoint(StartPoint, pt + offset, false);
+
+ pt = getQtPoint(EndPoint, true);
+ setPoint(EndPoint, pt + offset, false);
+
+ pt = getQtPoint(CentrePoint, true);
+ setPoint(CentrePoint, pt + offset, false);
+
+ if (storedPointHash.contains(MidPoint))
+ {
+ pt = getQtPoint(MidPoint, true);
+ setPoint(MidPoint, pt + offset, false);
+ }
+ updateArc();
+}
+
+void GLEArc::rotateBy(double radians)
+{
+ pointHash.clear();
+ // Moves relative to storedPointHash
+ QPointF pt = getQtPoint(CentrePoint, true);
+ setPoint(CentrePoint, QGLE::rotateAboutPoint(pt, radians, basePoint));
+
+ pt = getQtPoint(StartPoint, true);
+ setPoint(StartPoint, QGLE::rotateAboutPoint(pt, radians, basePoint));
+
+ pt = getQtPoint(EndPoint, true);
+ setPoint(EndPoint, QGLE::rotateAboutPoint(pt, radians, basePoint));
+
+ if (storedPointHash.contains(MidPoint))
+ {
+ pt = getQtPoint(MidPoint, true);
+ setPoint(MidPoint, QGLE::rotateAboutPoint(pt, radians, basePoint));
+ }
+}
diff --git a/src/gui/arc.h b/src/gui/arc.h
new file mode 100644
index 0000000..80ff912
--- /dev/null
+++ b/src/gui/arc.h
@@ -0,0 +1,109 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+#ifndef _GLEARC_H
+#define _GLEARC_H
+
+#include "drawingobject.h"
+
+//! A class describing an arc drawing object, daughter of the generic GLEDrawingObject class
+class GLEArc : public GLEDrawingObject
+{
+ Q_OBJECT
+
+public:
+
+ //! An enumeration describing the points that are used to describe an arc
+ enum Points
+ {
+ CentrePoint,
+ StartPoint,
+ EndPoint,
+ Radius,
+ MidPoint
+ };
+
+ //! Constructor used for initialising variables and connections
+ GLEArc(double resolution, QSize imageSize, GLEDrawingArea *area);
+
+ //! Draw the arc on the provided painter
+ void draw(QPainter *p);
+ //! Return the shortest distance between a given point and the arc
+ double distanceToPoint(const QPointF& p, QPointF *nearestPoint);
+ //! Set one of the enumerated points
+ void setPoint(int pointChoice, const QPointF& p, bool update = true);
+ //! Find points where a line intersects the arc
+ // If vertical = true, m contains 'x'
+ QList<QPointF> intersections(double qtm, double qtc, bool vertical = false);
+ QList<QPointF> intersections(QPointF qtp1, QPointF qtp2);
+ QList<QPointF> intersections(QPointF qtp1, double angle);
+ //! Is the point inside the object?
+ bool isInside(QPointF p);
+ void addRelativeOSnaps(QPointF p);
+ QList<QPointF> getTangents(QPointF p);
+ bool hasTangents();
+ QList<QPointF> getPerpendiculars(QPointF p);
+ bool hasPerpendiculars();
+ void createOTracks();
+
+ //! Return the arc's bounding rectangle in Qt coordinates
+ QRectF arcRect();
+ //! Return the starting angle
+ double startAngleDeg();
+ //! Return the ending angle
+ double endAngleDeg();
+ //! As above, but guaranteed to be > start_angle
+ double endAngleDegConstrained();
+ //! Return the starting angle
+ double startAngleRad();
+ //! Return the ending angle
+ double endAngleRad();
+ //! As above, but guaranteed to be > start_angle
+ double endAngleRadConstrained();
+
+ bool findScaleOrigin(const QPointF& pt, QPointF* origin, int handle);
+ double nearestPriorityOSnap(const QPointF& pt, QPointF *osnap);
+ int supportedTransformMode();
+ void linearTransform(const GLELinearEquation& ex, const GLELinearEquation& ey);
+ void moveBy(QPointF offset);
+ void rotateBy(double radians);
+
+private slots:
+ //! Update the painter path when the resolution or start/end points change
+ void updateArc();
+ void updateFromProperty(int property);
+
+private:
+ //! Member variable describing whether the arc runs clockwise or anticlockwise
+ bool directionReversed;
+ //! If you take the line between the pseudo-circle centre and a given point, does it cross the arc
+ bool isOnArc(double angle);
+ //! Is the point inside the full circle area (i.e. no tangent)
+ bool isInsideCircle(QPointF p);
+ //! What's the closest point to the full circle?
+ double distanceToPointOnCircle(QPointF p, QPointF *nearestPoint);
+ void drawArc(QPainter *p, double t1, double t2);
+ void addBezier(QPainterPath *p, GLEBezier* bezier);
+ void computeAndDraw(QPainter *p, GLEArcDO* obj, GLECurvedArrowHead* head);
+ void getGLEArcT0T1(double* t0, double* t1);
+};
+
+#endif
diff --git a/src/gui/circle.cpp b/src/gui/circle.cpp
new file mode 100644
index 0000000..bd144e5
--- /dev/null
+++ b/src/gui/circle.cpp
@@ -0,0 +1,441 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+#include "circle.h"
+
+// The constructor for the circle object
+GLECircle::GLECircle(double resolution, QSize imageSize, GLEDrawingArea *area) :
+ GLEDrawingObject(resolution, imageSize, area)
+{
+ // Make sure the circle is updated if a point changes or
+ // the image size changes
+ connect(this, SIGNAL(pointChanged()),
+ this, SLOT(updateCircle()));
+ connect(this, SIGNAL(imageChanged()),
+ this, SLOT(updateCircle()));
+ connect(this, SIGNAL(propertyChanged(int)),
+ this, SLOT(updateFromProperty(int)));
+
+ amove = false;
+
+ // More to be added
+ validProperties
+ << FillColour
+ << LineColour
+ << LineWidth
+ << LineStyle;
+ properties[FillColour] = propertyDescriptions[FillColour].defaultValue;
+ properties[LineColour] = propertyDescriptions[LineColour].defaultValue;
+ properties[LineWidth] = propertyDescriptions[LineWidth].defaultValue;
+ properties[LineStyle] = propertyDescriptions[LineStyle].defaultValue;
+}
+
+void GLECircle::createOTracks()
+{
+ if (isSet(CentrePoint) && isSet(Radius))
+ {
+ // We need to know the page size to be able to do this!
+ }
+}
+
+void GLECircle::updateFromProperty(int)
+{
+ GLEEllipseDO* obj = (GLEEllipseDO*)getGLEObject();
+ GLEPropertyStore* obj_prop = obj->getProperties();
+
+ obj_prop->setRealProperty(GLEDOPropertyLineWidth, getProperty(LineWidth).toDouble());
+ QColor color = getProperty(LineColour).value<QColor>();
+ GLEColor* gle_color = obj->getProperties()->getColorProperty(GLEDOPropertyColor);
+ gle_color->setRGB255(color.red(), color.green(), color.blue());
+ QGLE::qtToGLEString(getProperty(LineStyle).toString(), obj_prop->getStringProperty(GLEDOPropertyLineStyle));
+
+ GLEColor* gle_fill = obj->getProperties()->getColorProperty(GLEDOPropertyFillColor);
+ if (properties[FillColour].value<QColor>().isValid()) {
+ QColor fill = getProperty(FillColour).value<QColor>();
+ gle_fill->setRGB255(fill.red(), fill.green(), fill.blue());
+ } else {
+ gle_fill->setTransparent(true);
+ }
+
+ ((GLEDrawingArea*)parent())->setDirtyAndSave();
+}
+
+// Update the painter path
+void GLECircle::updateCircle()
+{
+ QPointF p;
+ QPair<QPointF,int> snap;
+
+ // Only do this if both the centre and radius have been set
+ if (isSet(CentrePoint) && isSet(Radius))
+ {
+ // This is guaranteed to have been created in the constructor
+ // of GLEDrawingObject
+ delete(paintPath);
+ // Create a new path starting at circleCentre
+ paintPath = new QPainterPath(getQtPoint(CentrePoint));
+ // Add the circle based on the qrect
+ paintPath->addEllipse(circleRect());
+
+ // Update GLE object
+ GLEEllipseDO* circle = (GLEEllipseDO*)getGLEObject();
+ if (circle != NULL) {
+ circle->setCenter(QGLE::QPointFToGLEPoint(getGLEPoint(CentrePoint)));
+ circle->setRadius(getGLELength(Radius));
+ }
+
+ // Now we add the osnap handles
+ osnapHandles.clear();
+ for(int i=0;i<360;i+=90)
+ {
+ p.setX(getQtLength(Radius)*cos(QGLE::degreesToRadians(i)));
+ p.setY(getQtLength(Radius)*sin(QGLE::degreesToRadians(i)));
+ p += getQtPoint(CentrePoint);
+ snap.first = p;
+ snap.second = QGLE::QuadrantSnap;
+ osnapHandles.append(snap);
+ }
+ snap.first = getQtPoint(CentrePoint);
+ snap.second = QGLE::CentreSnap;
+ osnapHandles.append(snap);
+ }
+}
+
+void GLECircle::addRelativeOSnaps(QPointF p)
+{
+ if (isSet(CentrePoint) && isSet(Radius))
+ {
+ relativeOSnaps.clear();
+
+ QList<QPointF> perpendiculars = getPerpendiculars(p);
+ QPointF ppt;
+ foreach(ppt, perpendiculars)
+ {
+ relativeOSnaps.append(QPair<QPointF,int>(ppt, QGLE::PerpendicularSnap));
+ }
+
+ QList<QPointF> tangents = getTangents(p);
+
+ QPointF tpt;
+ foreach(tpt, tangents)
+ {
+ relativeOSnaps.append(QPair<QPointF,int>(tpt, QGLE::TangentSnap));
+ }
+
+ }
+}
+
+QList<QPointF> GLECircle::getTangents(QPointF p)
+{
+ QList<QPointF> tangents;
+ QPointF np;
+ if (!isInside(p))
+ {
+ double angleToCentre = QGLE::angleBetweenTwoPoints(p,getQtPoint(CentrePoint));
+ double radius = getQtLength(Radius);
+ // Now we need the tangential ones
+ double distanceToCentre = QGLE::distance(p, getQtPoint(CentrePoint));
+ double angleOffset = asin(radius/distanceToCentre);
+ double distanceToTangent = sqrt(pow(distanceToCentre,2)-pow(radius,2));
+ angleToCentre = QGLE::angleBetweenTwoPoints(p,getQtPoint(CentrePoint));
+
+ double angle = angleToCentre + angleOffset;
+ np = p + QPointF(distanceToTangent*cos(angle),distanceToTangent*sin(angle));
+ tangents.append(np);
+
+ angle = angleToCentre - angleOffset;
+ np = p + QPointF(distanceToTangent*cos(angle),distanceToTangent*sin(angle));
+ tangents.append(np);
+
+ }
+ return(tangents);
+}
+
+bool GLECircle::hasTangents()
+{
+ return(true);
+}
+
+QList<QPointF> GLECircle::getPerpendiculars(QPointF p)
+{
+ QList<QPointF> perpendiculars;
+
+ // The first perpendicular osnap is defined as the nearest point
+ QPointF np;
+ distanceToPoint(p,&np);
+ perpendiculars.append(np);
+
+ // The second perpendicular osnap is diametrically opposite the first one
+ double angleToCentre = QGLE::angleBetweenTwoPoints(np,getQtPoint(CentrePoint));
+ double radius = getQtLength(Radius);
+ double diameter = 2*radius;
+
+ np = np + QPointF(diameter*cos(angleToCentre),diameter*sin(angleToCentre));
+ perpendiculars.append(np);
+
+ return(perpendiculars);
+}
+
+bool GLECircle::hasPerpendiculars()
+{
+ return(true);
+}
+
+void GLECircle::draw(QPainter *p)
+{
+ if (isSet(CentrePoint) && isSet(Radius))
+ {
+ p->save();
+ QPen cpen;
+ setSimplePenProperties(cpen);
+ p->setPen(cpen);
+ if (properties[FillColour].value<QColor>().isValid())
+ p->setBrush(QBrush(properties[FillColour].value<QColor>()));
+ else
+ p->setBrush(Qt::NoBrush);
+ p->drawEllipse(circleRect());
+ p->restore();
+ }
+}
+
+double GLECircle::distanceToPoint(const QPointF& p, QPointF *nearestPoint)
+{
+ QPointF c = getQtPoint(CentrePoint);
+ if (nearestPoint)
+ {
+ double r = getQtLength(Radius);
+ double theta = QGLE::angleBetweenTwoPoints(c,p);
+ nearestPoint->setX(r*cos(theta)+c.x());
+ nearestPoint->setY(r*sin(theta)+c.y());
+ }
+ // Calculations in QT coordinates
+ return(fabs(QGLE::distance(c,p)-getQtLength(Radius)));
+}
+
+// Set a point (start or end in the case of a line)
+void GLECircle::setPoint(int pointChoice, const QPointF& p, bool update)
+{
+ double radius;
+ switch(pointChoice)
+ {
+ // Note that circumference point also runs
+ // the centre point code: this is intentional
+ case CircumferencePoint:
+ if (!isSet(CentrePoint))
+ return;
+ radius = QGLE::distance(QGLE::absQtToGLE(p,dpi,pixmap.height()),getGLEPoint(CentrePoint));
+ if (QGLE::relGLEToQt(radius,dpi) > MINIMUM_CIRCLE_RADIUS)
+ pointHash[Radius] = QPointF(radius, 0);
+ else
+ pointHash.remove(Radius);
+ case CentrePoint:
+ pointHash[pointChoice] = QGLE::absQtToGLE(p, dpi, pixmap.height());
+ break;
+ case Radius:
+ pointHash[pointChoice] = QGLE::relQtToGLE(p, dpi);
+ }
+
+ if (update) updateCircle();
+}
+
+QRectF GLECircle::circleRect()
+{
+ // Work in Qt coordinates
+ QPointF c = getQtPoint(CentrePoint);
+ double r = getQtLength(Radius);
+
+ return(QRectF(c.x() - r,
+ c.y() - r,
+ 2*r, 2*r));
+}
+
+QList<QPointF> GLECircle::intersections(double qtm, double qtc, bool vertical)
+{
+ QPointF one, two;
+ // For circles, we'll deal with points individually:
+ if (vertical)
+ {
+ one.setX(qtm);
+ two.setX(qtm);
+ one.setY(0.0);
+ two.setY(1.0);
+ }
+ else
+ {
+ one.setX(0.0);
+ one.setY(qtc);
+ two.setX(1.0);
+ two.setY(qtm + qtc);
+ }
+
+ return(intersections(one,two));
+}
+
+
+QList<QPointF> GLECircle::intersections(QPointF qtp1, QPointF qtp2)
+{
+ QList<QPointF> pointArray;
+
+ if (!(isSet(CentrePoint) && isSet(Radius)))
+ return(pointArray);
+
+ QPointF cp = getQtPoint(CentrePoint);
+ double r = getQtLength(Radius);
+ double a,b,c;
+ double bac;
+ double u;
+ QPointF p;
+
+ a = pow((qtp2.x() - qtp1.x()),2) + pow((qtp2.y() - qtp1.y()),2);
+ b = 2 * ( (qtp2.x() - qtp1.x())*(qtp1.x()-cp.x()) + (qtp2.y()-qtp1.y())*(qtp1.y()-cp.y()));
+ c = pow(cp.x(),2)+pow(cp.y(),2)+pow(qtp1.x(),2)+pow(qtp1.y(),2)
+ - 2*(cp.x()*qtp1.x()+cp.y()*qtp1.y()) - pow(r,2);
+
+ bac = pow(b,2)-4*a*c;
+ if (bac == 0.0)
+ {
+ u = - b / (2*a);
+ p.setX(qtp1.x()+u*(qtp2.x()-qtp1.x()));
+ p.setY(qtp1.y()+u*(qtp2.y()-qtp1.y()));
+ pointArray.append(p);
+ }
+ else if (bac > 0.0)
+ {
+ u = (-b + sqrt(bac))/(2*a);
+ p.setX(qtp1.x() + u*(qtp2.x()-qtp1.x()));
+ p.setY(qtp1.y() + u*(qtp2.y()-qtp1.y()));
+ pointArray.append(p);
+ u = (-b - sqrt(bac))/(2*a);
+ p.setX(qtp1.x() + u*(qtp2.x()-qtp1.x()));
+ p.setY(qtp1.y() + u*(qtp2.y()-qtp1.y()));
+ pointArray.append(p);
+ }
+
+ return(pointArray);
+}
+
+QList<QPointF> GLECircle::intersections(QPointF qtp1, double angle)
+{
+ // This intersection code must determine the intersections in
+ // a particular direction from a start point
+
+ // First get a list based on an infinite line:
+ QPointF qtp2 = qtp1 + QPointF(1.0*cos(angle),1.0*sin(angle));
+ QList<QPointF> allIntersections = intersections(qtp1,qtp2);
+
+ // Now go through the list and determine which are in the right
+ // direction
+ QList<QPointF> correctIntersections;
+ QPointF pt;
+ double ptAngle;
+
+ foreach(pt, allIntersections)
+ {
+ ptAngle = QGLE::angleBetweenTwoPoints(qtp1, pt);
+ if (QGLE::quadrant(ptAngle) == QGLE::quadrant(angle))
+ correctIntersections.append(pt);
+ }
+
+ return(correctIntersections);
+
+}
+
+bool GLECircle::isInside(QPointF p)
+{
+ QPointF cp = getQtPoint(CentrePoint);
+ if (QGLE::distance(cp,p) < getQtLength(Radius))
+ return(true);
+ else
+ return(false);
+}
+
+bool GLECircle::findScaleOrigin(const QPointF&, QPointF* origin, int handle)
+{
+ if (handle == GLEDrawingArea::TopLeft || handle == GLEDrawingArea::TopRight || handle == GLEDrawingArea::BottomLeft || handle == GLEDrawingArea::BottomRight)
+ {
+ *origin = getQtPoint(CentrePoint, true);
+ return true;
+ }
+ return false;
+}
+
+int GLECircle::supportedTransformMode()
+{
+ return TransformModeConstrained;
+}
+
+void GLECircle::linearTransform(const GLELinearEquation& ex, const GLELinearEquation& ey)
+{
+ // Make sure we have a circumference point at 45 degrees
+// QPointF cp = getQtPoint(CentrePoint, true);
+// double radius = getQtLength(Radius, true);
+// QPointF edgePoint = cp + QPointF(
+// radius*cos(QGLE::degreesToRadians(45)),
+// radius*sin(QGLE::degreesToRadians(45)));
+
+ // It would probably be much more sensible to do this after
+ // converting it to an ellipse.
+ pointHash.clear();
+ double radius = getQtLength(Radius, true);
+ double fac = ex.getA();
+ if (fac == 1.0) fac = ey.getA();
+ setLength(Radius, radius * fac, false);
+ linearTransformPt(CentrePoint, ex, ey, false);
+ if (storedPointHash.contains(CircumferencePoint))
+ {
+ linearTransformPt(CircumferencePoint, ex, ey, false);
+ }
+ updateCircle();
+}
+
+void GLECircle::moveBy(QPointF offset)
+{
+ pointHash.clear();
+ double radius = getQtLength(Radius);
+ setLength(Radius, radius, false);
+ // Moves relative to storedPointHash
+ QPointF pt = getQtPoint(CentrePoint, true);
+ setPoint(CentrePoint, pt + offset, false);
+ if (storedPointHash.contains(CircumferencePoint))
+ {
+ QPointF pt = getQtPoint(CircumferencePoint, true);
+ setPoint(CircumferencePoint, pt + offset, false);
+ }
+ updateCircle();
+}
+
+void GLECircle::rotateBy(double radians)
+{
+ double radius = getQtLength(Radius);
+ pointHash.clear();
+ setPoint(Radius, QPointF(radius,0.0));
+
+ QPointF c = getQtPoint(CentrePoint, true);
+ c = QGLE::rotateAboutPoint(c, radians, basePoint);
+ setPoint(CentrePoint, c);
+
+ if (storedPointHash.contains(CircumferencePoint))
+ {
+ QPointF pt = getQtPoint(CircumferencePoint, true);
+ setPoint(CircumferencePoint, QGLE::rotateAboutPoint(pt, radians, basePoint));
+ }
+}
+
diff --git a/src/gui/circle.h b/src/gui/circle.h
new file mode 100644
index 0000000..f6f5b8b
--- /dev/null
+++ b/src/gui/circle.h
@@ -0,0 +1,82 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+#ifndef _GLECIRCLE_H
+#define _GLECIRCLE_H
+
+#include "drawingobject.h"
+
+//! Class describing a circle drawing object
+class GLECircle : public GLEDrawingObject
+{
+ Q_OBJECT
+
+public:
+
+ //! Enumeration of points used to describe a circle
+ enum Points
+ {
+ CentrePoint,
+ CircumferencePoint,
+ Radius
+ };
+
+ //! Constructor used for initialising variables and connections
+ GLECircle(double resolution, QSize imageSize, GLEDrawingArea *area);
+
+ //! Draw the circle on the provided painter
+ void draw(QPainter *p);
+ //! Return the shortest distance between a given point and the circle
+ double distanceToPoint(const QPointF& p, QPointF *nearestPoint);
+ //! Set one of the enumerated points
+ void setPoint(int pointChoice, const QPointF& p, bool update = true);
+ //! Find points where a line intersects the circle
+ // If vertical = true, m contains 'x'
+ QList<QPointF> intersections(double qtm, double qtc, bool vertical = false);
+ QList<QPointF> intersections(QPointF qtp1, QPointF qtp2);
+ QList<QPointF> intersections(QPointF qtp1, double angle);
+ //! Is the point inside the object?
+ bool isInside(QPointF p);
+ void addRelativeOSnaps(QPointF p);
+
+ QList<QPointF> getTangents(QPointF p);
+ bool hasTangents();
+ QList<QPointF> getPerpendiculars(QPointF p);
+ bool hasPerpendiculars();
+ void createOTracks();
+
+ //! Return the circle's bounding rectangle in Qt coordinates
+ QRectF circleRect();
+
+ bool findScaleOrigin(const QPointF& pt, QPointF* origin, int handle);
+ int supportedTransformMode();
+ void linearTransform(const GLELinearEquation& ex, const GLELinearEquation& ey);
+ void moveBy(QPointF offset);
+ void rotateBy(double radians);
+
+private slots:
+ //! Update the painter path when the resolution or start/end points change
+ void updateCircle();
+ void updateFromProperty(int property);
+
+};
+
+#endif
diff --git a/src/gui/colourbutton.cpp b/src/gui/colourbutton.cpp
new file mode 100644
index 0000000..375c7c4
--- /dev/null
+++ b/src/gui/colourbutton.cpp
@@ -0,0 +1,89 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+#include "colourbutton.h"
+#include "qgle_statics.h"
+
+ColourButton::ColourButton(QColor col, QWidget *parent)
+ : QAbstractButton(parent)
+{
+ resize(10,10);
+ connect(this, SIGNAL(clicked()),
+ this, SLOT(onClick()));
+ setColour(col);
+ hasPixmap = false;
+}
+
+ColourButton::ColourButton(QPixmap px, QWidget *parent)
+ : QAbstractButton(parent)
+{
+ resize(10,10);
+ connect(this, SIGNAL(clicked()),
+ this, SLOT(onClick()));
+ pixmap = px;
+ hasPixmap = true;
+}
+
+QSize ColourButton::sizeHint() const
+{
+ return QSize(10,10);
+}
+
+
+void ColourButton::paintEvent(QPaintEvent *)
+{
+ QPainter painter(this);
+ painter.fillRect(rect(), Qt::white);
+ if (hasPixmap)
+ {
+ painter.drawPixmap(rect().center()-QPoint(5,5), pixmap);
+ }
+ else
+ {
+ QPixmap colourSwatch(10,10);
+ if (colour.isValid())
+ {
+ colourSwatch.fill(colour);
+ painter.drawPixmap(rect().center()-QPoint(5,5), colourSwatch);
+ }
+ else
+ {
+ QPen pen;
+ pen.setColor(Qt::black);
+ pen.setWidth(1);
+ QGLE::drawBox(&painter, rect().center(), 5.0, pen);
+ QGLE::drawCross(&painter, rect().center(), 5.0, pen);
+ }
+ }
+
+}
+
+void ColourButton::setColour(QColor col)
+{
+ colour = col;
+ update();
+}
+
+void ColourButton::onClick()
+{
+ if (!hasPixmap)
+ emit colourChosen(colour);
+}
diff --git a/src/gui/colourbutton.h b/src/gui/colourbutton.h
new file mode 100644
index 0000000..bab6ed7
--- /dev/null
+++ b/src/gui/colourbutton.h
@@ -0,0 +1,55 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+#ifndef __COLOURBUTTON_H
+#define __COLOURBUTTON_H
+
+#include <QtGui>
+
+
+class ColourButton : public QAbstractButton
+{
+ Q_OBJECT
+
+public:
+ ColourButton(QColor col = QColor(), QWidget *parent = 0);
+ ColourButton(QPixmap px, QWidget *parent = 0);
+
+ void setColour(QColor col);
+
+public slots:
+ void onClick();
+
+signals:
+ void colourChosen(QColor col);
+
+protected:
+ void paintEvent(QPaintEvent *event);
+ QSize sizeHint() const;
+
+private:
+ QColor colour;
+ QPixmap pixmap;
+ bool hasPixmap;
+
+};
+
+#endif
diff --git a/src/gui/colourpicker.cpp b/src/gui/colourpicker.cpp
new file mode 100644
index 0000000..8685070
--- /dev/null
+++ b/src/gui/colourpicker.cpp
@@ -0,0 +1,151 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+#include "colourpicker.h"
+#include "variantdelegate.h"
+#include "qgle_statics.h"
+
+ColourPicker::ColourPicker(QWidget *parent, VariantDelegate *delegate)
+ : QAbstractButton(parent)
+{
+
+ changed = false;
+ hasColour = false;
+ parentDelegate = delegate;
+ // At some point, this will be changed to
+ // show a little frame with a standard
+ // choice of colours including "no fill"
+
+ chooserFrame = new QDialog(parent);
+ QGridLayout *chooserLayout = new QGridLayout();
+
+ buttons.append(new ColourButton(QColor()));
+ buttons.append(new ColourButton(Qt::white));
+ buttons.append(new ColourButton(Qt::blue));
+ buttons.append(new ColourButton(Qt::green));
+ buttons.append(new ColourButton(Qt::red));
+ buttons.append(new ColourButton(Qt::yellow));
+
+ ColourButton *button;
+ int i = 0;
+ foreach(button, buttons)
+ {
+ chooserLayout->addWidget(button, 1, i);
+ connect(button, SIGNAL(colourChosen(QColor)),
+ this, SLOT(colourChosen(QColor)));
+ i++;
+ }
+ QPixmap ellipsis(":images/ellipsis.png");
+ ColourButton *moreButton = new ColourButton(ellipsis);
+ chooserLayout->addWidget(moreButton, 1, i);
+ connect(moreButton, SIGNAL(clicked()), this, SLOT(moreColours()));
+
+ chooserFrame->setLayout(chooserLayout);
+ chooserFrame->setBackgroundRole(QPalette::Button);
+ chooserFrame->move(mapToGlobal(rect().bottomLeft()));
+ chooserFrame->setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint);
+}
+
+void ColourPicker::doShowPopup() {
+ myTimer->stop();
+ chooserFrame->exec();
+}
+
+void ColourPicker::showPopup() {
+ myTimer = new QTimer(this);
+ connect(myTimer, SIGNAL(timeout()), this, SLOT(doShowPopup()));
+ myTimer->start(10);
+}
+
+void ColourPicker::paintEvent(QPaintEvent *)
+{
+ QPainter painter(this);
+ painter.fillRect(rect(), Qt::white);
+ QPixmap colourSwatch(10,10);
+ if (hasColour)
+ {
+ if (colour.isValid())
+ {
+ colourSwatch.fill(colour);
+ painter.drawPixmap(rect().center()-QPoint(5,5), colourSwatch);
+ }
+ else
+ {
+ QPen pen;
+ pen.setColor(Qt::black);
+ pen.setWidth(1);
+ QGLE::drawBox(&painter, rect().center(), 4.0, pen);
+ QGLE::drawCross(&painter, rect().center(), 4.0, pen);
+ }
+ }
+ else
+ {
+ colourSwatch = QPixmap(":images/varyingcolours.png");
+ painter.drawPixmap(rect().center()-QPoint(5,5), colourSwatch);
+ }
+}
+
+void ColourPicker::mouseDoubleClickEvent(QMouseEvent *)
+{
+ chooserFrame->exec();
+}
+
+void ColourPicker::moreColours()
+{
+ chooserFrame->done(0);
+ QColor newColour = QColorDialog::getColor(colour, this);
+ if (newColour.isValid())
+ {
+ setColour(newColour);
+ changed = true;
+ }
+ parentDelegate->doneEditingColor(this);
+}
+
+QColor ColourPicker::getColour()
+{
+ return(colour);
+}
+
+void ColourPicker::colourChosen(QColor col)
+{
+ chooserFrame->done(0);
+ setColour(col);
+ changed = true;
+ parentDelegate->doneEditingColor(this);
+}
+
+void ColourPicker::setColour(QColor col)
+{
+ colour = col;
+ hasColour = true;
+ update();
+}
+
+void ColourPicker::setColour()
+{
+ hasColour = false;
+}
+
+bool ColourPicker::hasChanged()
+{
+ return(changed);
+}
diff --git a/src/gui/colourpicker.h b/src/gui/colourpicker.h
new file mode 100644
index 0000000..ce6a4b2
--- /dev/null
+++ b/src/gui/colourpicker.h
@@ -0,0 +1,65 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+#ifndef __COLOURPICKER_H
+#define __COLOURPICKER_H
+
+#include <QtGui>
+#include "colourbutton.h"
+
+class VariantDelegate;
+
+class ColourPicker : public QAbstractButton
+{
+ Q_OBJECT
+
+public:
+ ColourPicker(QWidget *parent, VariantDelegate* delegate);
+
+ QColor getColour();
+ bool hasChanged();
+ void setColour();
+
+public slots:
+ void setColour(QColor col);
+ void colourChosen(QColor col);
+ void moreColours();
+ void doShowPopup();
+
+protected:
+ void paintEvent(QPaintEvent *event);
+ void mouseDoubleClickEvent(QMouseEvent *event);
+public:
+ void showPopup();
+
+private:
+ QColor colour;
+
+ bool changed;
+ bool hasColour;
+
+ QDialog *chooserFrame;
+ QList<ColourButton *> buttons;
+ VariantDelegate* parentDelegate;
+ QTimer* myTimer;
+};
+
+#endif
diff --git a/src/gui/component.cpp b/src/gui/component.cpp
new file mode 100644
index 0000000..3b4cdb0
--- /dev/null
+++ b/src/gui/component.cpp
@@ -0,0 +1,148 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+#include "component.h"
+
+// Constructor: store the resolution and image height; set up defaults
+GLEComponent::GLEComponent(double resolution, QSize imageSize, QObject *parent) : QObject(parent)
+{
+ // Defaults:
+ dpi = resolution;
+ lineWidth = 0.02;
+ pixmap = imageSize;
+ // We don't actually use this at present, but it's kept
+ // for possible future use
+ paintPath = new QPainterPath();
+ // Default pen
+ paintPen = QPen(Qt::black,
+ QGLE::relGLEToQt(lineWidth, 0, dpi).x(),
+ Qt::SolidLine,
+ Qt::SquareCap,
+ Qt::BevelJoin);
+}
+
+//! Virtual function to update the component after, e.g., points have changed
+void GLEComponent::updateAll()
+{
+}
+
+//! Virtual function to set a point
+void GLEComponent::setPoint(int pointChoice, const QPointF& p, bool)
+{
+ pointHash[pointChoice] = QGLE::absQtToGLE(p, dpi, pixmap.height());
+}
+
+// Determine whether a parameter has been set
+bool GLEComponent::isSet(int pointChoice)
+{
+ return(pointHash.contains(pointChoice));
+}
+
+// Get the value of a parameter (as a point in GLE coordinates)
+QPointF GLEComponent::getGLEPoint(int pointChoice, bool stored)
+{
+ if (stored)
+ return(storedPointHash.value(pointChoice, QPointF(0,0)));
+ else
+ return(pointHash.value(pointChoice, QPointF(0,0)));
+}
+
+void GLEComponent::setBasePoint(const QPointF& qtp)
+{
+ basePoint = qtp;
+ // Save the point hash
+ storedPointHash = pointHash;
+ // Only used in some objects (e.g. ellipse)
+ storedEquationParameters = equationParameters;
+}
+
+// Convert GLE to Qt coordinates
+QPointF GLEComponent::getQtPoint(const QPointF& glePoint)
+{
+ return(QGLE::absGLEToQt(glePoint, dpi, pixmap.height()));
+}
+
+// Get the value of a parameter (as a point in QT coordinates)
+QPointF GLEComponent::getQtPoint(int pointChoice, bool stored)
+{
+ QPointF gle = getGLEPoint(pointChoice, stored);
+ return(QGLE::absGLEToQt(gle, dpi, pixmap.height()));
+}
+
+// Get the value of a parameter (as a double in GLE coordinates)
+double GLEComponent::getGLELength(int pointChoice, bool stored)
+{
+ if (stored)
+ return(storedPointHash.value(pointChoice, QPointF(0,0)).x());
+ else
+ return(pointHash.value(pointChoice, QPointF(0,0)).x());
+}
+
+// Get the value of a parameter (as a double in QT coordinates)
+double GLEComponent::getQtLength(int pointChoice, bool stored)
+{
+ double gleX = getGLELength(pointChoice, stored);
+ return(QGLE::relGLEToQt(gleX, dpi));
+}
+
+// Get the value of a parameter (as a double in GLE coordinates)
+double GLEComponent::getGLEAngle(int pointChoice, bool stored)
+{
+ if (stored)
+ return(storedPointHash.value(pointChoice, QPointF(0,0)).x());
+ else
+ return(pointHash.value(pointChoice, QPointF(0,0)).x());
+}
+
+// Get the value of a parameter (as a double in QT coordinates)
+double GLEComponent::getQtAngle(int pointChoice, bool stored)
+{
+ // Qt Angles go the other way round to GLE ones as
+ // the Y axis is inverted
+ double gleX = -getGLELength(pointChoice, stored);
+ return(gleX);
+}
+
+// This returns a QPainterPath object that can be used to draw
+// the requested object (although we should just use draw())
+QPainterPath GLEComponent::path()
+{
+ return(*paintPath);
+}
+
+// A slot that is called whenever the resolution changes
+void GLEComponent::setDPI(double newDPI)
+{
+ if (dpi != newDPI)
+ {
+ dpi = newDPI;
+ paintPen.setWidthF(QGLE::relGLEToQt(lineWidth, 0, dpi).x());
+ }
+}
+
+// A slot that is called whenever the image size changes
+void GLEComponent::setPixmapSize(QSize newPixmapSize, double newDPI)
+{
+ setDPI(newDPI);
+ pixmap = newPixmapSize;
+ emit imageChanged();
+}
+
diff --git a/src/gui/component.h b/src/gui/component.h
new file mode 100644
index 0000000..0b3ff2f
--- /dev/null
+++ b/src/gui/component.h
@@ -0,0 +1,136 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+#ifndef _GLECOMPONENT_H
+#define _GLECOMPONENT_H
+
+#include <QtGui>
+#include "qgle_definitions.h"
+#include "qgle_statics.h"
+
+// The intention is that this is the parent of GLEDrawingObject
+// and of SnapLine etc
+//
+// A lot of the functionality of GLEDrawingObject will derive from
+// here. It might be simpler to change GLEDrawingObject into
+// GLEComponent and reimplement GLEDrawingObject by extracting
+// the bits that aren't needed by SnapLine.
+
+class GLEComponent : public QObject
+{
+ Q_OBJECT
+
+ friend class GLEDrawingObject;
+ friend class SnapLine;
+ friend class GLELine;
+ friend class GLECircle;
+ friend class GLEEllipse;
+ friend class GLEArc;
+ friend class GLEAmove;
+ friend class GLEText;
+ friend class GLEPolarArray;
+
+public:
+ GLEComponent(double resolution, QSize imageSize, QObject *parent);
+
+ void setBasePoint(const QPointF& qtp);
+
+ //! A function that returns a painter path that can be used to draw the object
+ QPainterPath path();
+
+ //! Set the pen for drawing
+ void setPen(QPen newPen) { paintPen = newPen; };
+ //! Return the pen used for drawing
+ QPen pen() { return(paintPen); };
+ //! Virtual function to update the component after, e.g., points have changed
+ virtual void updateAll();
+ //! Virtual function to draw the object on a provided painter
+ virtual void draw(QPainter *p) = 0;
+ //! Virtual function to return the shortest distance between a given point and the object
+ virtual double distanceToPoint(const QPointF& p, QPointF *nearestPoint = 0) = 0;
+ //! Virtual function to set a point
+ virtual void setPoint(int pointChoice, const QPointF& p, bool update = true);
+ //! Function to set a length
+ inline void setLength(int pointChoice, double len, bool update = true) { setPoint(pointChoice, QPointF(len,0), update); }
+ //! Virtual function to find points where a line intersects an object
+ virtual QList<QPointF> intersections(QPointF qtp1, QPointF qtp2) = 0;
+ virtual QList<QPointF> intersections(QPointF qtp1, double angle) = 0;
+ virtual QList<QPointF> intersections(double qtm, double qtc, bool vertical) = 0;
+
+ //! Get a point in GLE coordinates
+ QPointF getGLEPoint(int pointChoice, bool stored = false);
+ //! Get a point in Qt coordinates
+ QPointF getQtPoint(int pointChoice, bool stored = false);
+ //! Get a value in GLE coordinates
+ double getGLELength(int pointChoice, bool stored = false);
+ //! Get a value in Qt coordinates
+ double getQtLength(int pointChoice, bool stored = false);
+ //! Get an angle in GLE coordinates
+ double getGLEAngle(int pointChoice, bool stored = false);
+ //! Get an angle in Qt coordinates
+ double getQtAngle(int pointChoice, bool stored = false);
+ //! Check whether a point or value has been set
+ bool isSet(int pointChoice);
+
+ // Convert GLE to Qt coordinates
+ QPointF getQtPoint(const QPointF& glePoint);
+
+public slots:
+ //! Update the resolution of drawing objects
+ void setDPI(double newDPI);
+ //! Update the image height used for coordinate transforms
+ void setPixmapSize(QSize newPixmapSize, double newDPI);
+
+signals:
+ //! Notify the world that a point has changed
+ void pointChanged();
+ //! Notify subclasses that the dpi or image height had changed
+ void imageChanged();
+
+protected:
+ //! Contains the painter path
+ QPainterPath *paintPath;
+ //! Contains the pen used to draw the path
+ QPen paintPen;
+
+ //! The list of points
+ QHash <int, QPointF> pointHash;
+
+ //! Image resolution
+ double dpi;
+ //! Image height
+ QSize pixmap;
+
+ //! Line Width
+ double lineWidth;
+
+ QHash <int, QPointF> storedPointHash;
+ QPointF basePoint;
+ QHash<char, double> equationParameters;
+ QHash<char, double> storedEquationParameters;
+
+
+};
+
+
+
+
+#endif
diff --git a/src/gui/consolewindow.cpp b/src/gui/consolewindow.cpp
new file mode 100644
index 0000000..547b3ae
--- /dev/null
+++ b/src/gui/consolewindow.cpp
@@ -0,0 +1,115 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+#include "consolewindow.h"
+
+#include <iostream>
+
+using namespace std;
+
+ConsoleWindow::ConsoleWindow(QWidget* parent, QSplitter* splitter) : QTextEdit(parent), output() {
+ QFont font;
+ font.setFamily("Courier");
+ font.setFixedPitch(true);
+ font.setPointSize(10);
+ setFont(font);
+ setReadOnly(true);
+ splitWindow = splitter;
+ connect(&output, SIGNAL(print(const QString)), this, SLOT(print(const QString)));
+}
+
+ConsoleWindow::~ConsoleWindow() {
+}
+
+void ConsoleWindow::hideTriggered() {
+ autoShowSize = height();
+ QWidget* first = splitWindow->widget(0);
+ QList<int> splitSizes;
+ splitSizes.append(first->height());
+ splitSizes.append(0);
+ splitWindow->setSizes(splitSizes);
+}
+
+void ConsoleWindow::shouldAutoShow() {
+ if (output.getExitCode() != 0) {
+ QWidget* first = splitWindow->widget(0);
+ QList<int> splitSizes;
+ splitSizes.append(first->height());
+ if (autoShowSize != 0) {
+ splitSizes.append(autoShowSize);
+ } else {
+ splitSizes.append(75);
+ }
+ splitWindow->setSizes(splitSizes);
+ }
+}
+
+void ConsoleWindow::println(const QString& str) {
+ append(str);
+}
+
+void ConsoleWindow::print(QString msg) {
+ append(msg);
+}
+
+void ConsoleWindow::contextMenuEvent(QContextMenuEvent * e) {
+ QMenu *menu = createStandardContextMenu();
+ menu->addAction(getHideAction());
+ menu->exec(e->globalPos());
+ delete menu;
+}
+
+ConsoleWindowOutput::ConsoleWindowOutput() {
+}
+
+ConsoleWindowOutput::~ConsoleWindowOutput() {
+}
+
+void ConsoleWindowOutput::println() {
+ // emit print(QString::fromLatin1("\n"));
+}
+
+void ConsoleWindowOutput::println(const char* str) {
+ emit print(QString::fromUtf8(str));
+}
+
+void ConsoleWindowOutput::error(GLEErrorMessage* msg) {
+ QString file = QString::fromUtf8(msg->getFile());
+ QString abbrev = QString::fromUtf8(msg->getLineAbbrev());
+ abbrev.replace('<', "<");
+ abbrev.replace('>', ">");
+ QString line = QString("%1").arg(msg->getLine());
+ QString fline = QString(">> <b>%1</b> (%2)").arg(file).arg(msg->getLine());
+ if (abbrev.length() > 0) {
+ abbrev = QString(" <font color=\"#0000FF\">|</font>%1<font color=\"#0000FF\">|</font>").arg(abbrev);
+ }
+ QString outstr = fline+abbrev;
+ if (msg->getColumn() != -1) {
+ QString point = ">> ";
+ int nbspc = file.length() + line.length() + 4 + msg->getColumn() - msg->getDelta();
+ for (int i = 0; i < nbspc; i++) {
+ point += " ";
+ }
+ point += "<font color=\"#FF0000\">^</font>";
+ outstr += "<br>" + point;
+ }
+ emit print(outstr);
+}
diff --git a/src/gui/consolewindow.h b/src/gui/consolewindow.h
new file mode 100644
index 0000000..b58a77b
--- /dev/null
+++ b/src/gui/consolewindow.h
@@ -0,0 +1,72 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+#ifndef _CONSOLE_WINDOW_H
+#define _CONSOLE_WINDOW_H
+
+#include "../gle/gle-interface/gle-interface.h"
+#include <QtGui>
+
+class ConsoleWindow;
+
+class ConsoleWindowOutput : public QObject, public GLEOutputStream
+{
+ Q_OBJECT
+
+public:
+ ConsoleWindowOutput();
+ virtual ~ConsoleWindowOutput();
+ virtual void println();
+ virtual void println(const char* str);
+ virtual void error(GLEErrorMessage* msg);
+signals:
+ void print(const QString str);
+};
+
+class ConsoleWindow : public QTextEdit
+{
+ Q_OBJECT
+
+protected:
+ ConsoleWindowOutput output;
+ QSplitter* splitWindow;
+ QAction* hideAction;
+ int autoShowSize;
+
+public slots:
+ //! Slot used to toggle the auto-show functionality of the console window
+ void hideTriggered();
+ void print(QString msg);
+
+public:
+ ConsoleWindow(QWidget* parent, QSplitter* splitter);
+ virtual ~ConsoleWindow();
+ virtual void contextMenuEvent(QContextMenuEvent * e);
+ void shouldAutoShow();
+ void println(const QString& str);
+ inline GLEOutputStream* getOutput() { return &output; }
+ inline void setHideAction(QAction* act) { hideAction = act; }
+ inline QAction* getHideAction() { return hideAction; }
+ inline int getAutoShowSize() { return autoShowSize; }
+ inline void setAutoShowSize(int s) { autoShowSize = s; }
+};
+
+#endif
diff --git a/src/gui/dialogues.cpp b/src/gui/dialogues.cpp
new file mode 100644
index 0000000..37f5307
--- /dev/null
+++ b/src/gui/dialogues.cpp
@@ -0,0 +1,717 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+#include <QtGui>
+
+#include "qgle_statics.h"
+#include "dialogues.h"
+#include "settings.h"
+#include "consolewindow.h"
+
+EvaluatorDialog::EvaluatorDialog(GLEMainWindow *parent) : QDialog(parent)
+{
+ mainWin = parent;
+ setModal(false);
+ setWindowTitle(tr("Expression Evaluator"));
+ results = new ConsoleWindow(this, NULL);
+ QVBoxLayout *layout = new QVBoxLayout();
+ layout->addWidget(new QLabel(tr("Results:")));
+ layout->addWidget(results);
+ layout->addWidget(new QLabel(tr("Expression:")));
+ field = new QLineEdit();
+ layout->addWidget(field);
+ QHBoxLayout *btnlayo = new QHBoxLayout();
+ btnlayo->addStretch(1);
+ QPushButton* closeBt = new QPushButton(tr("Close"));
+ connect(closeBt, SIGNAL(clicked()), this, SLOT(hide()));
+ btnlayo->addWidget(closeBt);
+ QPushButton* clearBt = new QPushButton(tr("Clear"));
+ connect(clearBt, SIGNAL(clicked()), this, SLOT(clearResults()));
+ btnlayo->addWidget(clearBt);
+ QPushButton* evalBt = new QPushButton(tr("Eval"));
+ connect(evalBt, SIGNAL(clicked()), this, SLOT(eval()));
+ btnlayo->addWidget(evalBt);
+ evalBt->setDefault(true);
+ layout->addLayout(btnlayo);
+ setLayout(layout);
+ QWidget::setTabOrder(field, evalBt);
+ QWidget::setTabOrder(evalBt, clearBt);
+ QWidget::setTabOrder(clearBt, closeBt);
+ QWidget::setTabOrder(closeBt, results);
+}
+
+void EvaluatorDialog::eval()
+{
+ QString txt = field->text().trimmed();
+ if (txt == "") return;
+ GLEInterface* iface = mainWin->getGLEInterface();
+ GLEScript* script = mainWin->getGLEScript();
+ iface->setOutputStream(results->getOutput());
+ results->append(QString("<font color=\"#FF0000\">></font> %1").arg(txt));
+ iface->evalString(txt.toUtf8().constData(), script);
+ results->append(tr(""));
+ mainWin->restoreConsoleOutput();
+}
+
+void EvaluatorDialog::clearResults()
+{
+ results->clear();
+}
+
+ExportDialogue::ExportDialogue(GLEMainWindow *parent) {
+ device = -1;
+ mainWin = parent;
+ setWindowTitle(tr("Export File"));
+ QVBoxLayout *layout = new QVBoxLayout();
+ layout->addWidget(new QLabel(tr("Export to:")));
+ list = new QListWidget();
+ GLEInterface* iface = mainWin->getGLEInterface();
+ addFormat(tr("Portable Document Format (PDF)"), GLE_DEVICE_PDF);
+ addFormat(tr("Encapsulated PostScript (EPS)"), GLE_DEVICE_EPS);
+ addFormat(tr("PostScript Document (PS)"), GLE_DEVICE_PS);
+ if (iface->isDeviceSupported(GLE_DEVICE_SVG)) {
+ addFormat(tr("Scalable Vector Graphics (SVG)"), GLE_DEVICE_SVG);
+ }
+ if (iface->isDeviceSupported(GLE_DEVICE_EMF)) {
+ addFormat(tr("Enhanced Metafile (EMF)"), GLE_DEVICE_EMF);
+ }
+ addFormat(tr("Portable Network Graphics (PNG)"), GLE_DEVICE_PNG);
+ addFormat(tr("JPEG Interchange Format (JPEG)"), GLE_DEVICE_JPEG);
+ list->setCurrentRow(mainWin->settings->getExportFormat());
+ list->adjustSize();
+ connect(list, SIGNAL(currentRowChanged(int)), this, SLOT(exportFormatChanged(int)));
+ layout->addWidget(list);
+ QHBoxLayout *p1 = new QHBoxLayout();
+ p1->addWidget(new QLabel(tr("Page format:")));
+ format = new QComboBox();
+ format->addItem(tr("Figure"));
+ format->addItem(tr("Portrait"));
+ format->addItem(tr("Landscape"));
+ if (mainWin->isFullPage()) {
+ if (mainWin->isLandscape()) format->setCurrentIndex(2);
+ else format->setCurrentIndex(1);
+ } else {
+ format->setCurrentIndex(mainWin->settings->getExportPageSize());
+ }
+ p1->addWidget(format);
+ p1->addStretch(1);
+ layout->addLayout(p1);
+ QHBoxLayout *p2 = new QHBoxLayout();
+ resolutionLabel = new QLabel(tr("Resolution (dpi):"));
+ p2->addWidget(resolutionLabel);
+ resolution = new QSpinBox();
+ resolution->setMinimum(1);
+ resolution->setMaximum(2000);
+ connect(resolution, SIGNAL(valueChanged(int)), this, SLOT(resolutionChanged(int)));
+ p2->addWidget(resolution);
+ sizeLabel = new QLabel();
+ p2->addWidget(sizeLabel);
+ p2->addStretch(1);
+ layout->addLayout(p2);
+ layout->addWidget(new QLabel(tr("(For vector formats, 'resolution' specifies the bitmap fallback resolution.)")));
+ transp = new QCheckBox(tr("Transparent"));
+ transp->setChecked(mainWin->settings->isExportTransparent());
+ layout->addWidget(transp);
+ grayScale = new QCheckBox(tr("Grayscale"));
+ grayScale->setChecked(mainWin->settings->isExportGrayScale());
+ layout->addWidget(grayScale);
+ openResult = new QCheckBox(tr("View resulting file"));
+ openResult->setChecked(mainWin->settings->isOpenExportedFigure());
+ layout->addWidget(openResult);
+ layout->addWidget(new QLabel(tr("File:")));
+ fname = new QLineEdit();
+ fname->setText(QString::fromUtf8(parent->getGLEScript()->getLocation()->getFullPath().c_str()));
+ layout->addWidget(fname);
+ QPushButton *cancel = new QPushButton(tr("Cancel"));
+ connect(cancel, SIGNAL(clicked()), this, SLOT(close()));
+ QPushButton *expnow = new QPushButton(tr("Export"));
+ connect(expnow, SIGNAL(clicked()), this, SLOT(exportClicked()));
+ expnow->setDefault(true);
+ QPushButton *expas = new QPushButton(tr("Export As"));
+ connect(expas, SIGNAL(clicked()), this, SLOT(exportAsClicked()));
+ QHBoxLayout *p3 = new QHBoxLayout();
+ p3->addStretch(1);
+ p3->addWidget(cancel);
+ p3->addWidget(expnow);
+ p3->addWidget(expas);
+ layout->addLayout(p3);
+ setLayout(layout);
+ resize(mainWin->width()/2, mainWin->height()/2);
+ exportFormatChangedImpl(mainWin->settings->getExportFormat(), true);
+}
+
+void ExportDialogue::addFormat(const QString& name, int gleFormatID) {
+ list->addItem(name);
+ fmtToDevice.append(gleFormatID);
+}
+
+int ExportDialogue::entryIDtoDevice(int id) {
+ if (id < fmtToDevice.size()) {
+ return fmtToDevice[id];
+ }
+ return GLE_DEVICE_EPS;
+}
+
+bool ExportDialogue::isBitmap()
+{
+ return device == GLE_DEVICE_PNG || device == GLE_DEVICE_JPEG;
+}
+
+void ExportDialogue::resolutionChanged(int) {
+ if (isBitmap()) {
+ updateResolution();
+ }
+}
+
+void ExportDialogue::exportAsClicked() {
+ const char* ext = mainWin->getGLEInterface()->getDeviceFilenameExtension(device);
+ QString ftype = QString("Exported file (*.%1)").arg(ext);
+ QString fileName = QFileDialog::getSaveFileName(this,
+ tr("Choose a file name to save under"),
+ mainWin->settings->pwd(),
+ ftype);
+ if (fileName.isEmpty()) return;
+ performExport(fileName);
+}
+
+void ExportDialogue::exportClicked() {
+ performExport(fname->text());
+}
+
+void ExportDialogue::performExport(const QString& file) {
+ GLEInterface* iface = mainWin->getGLEInterface();
+ mainWin->clearConsoleWindow();
+ iface->clearAllCmdLine();
+ iface->setMakeDrawObjects(false);
+ QString dpi = QString("%1").arg(resolution->value());
+ iface->setCmdLineOptionString("resolution", dpi.toLatin1().constData());
+ if (device == GLE_DEVICE_PNG && transp->isChecked()) {
+ iface->setCmdLineOption("transparent");
+ }
+ if (grayScale->isChecked()) {
+ iface->setCmdLineOption("nocolor");
+ }
+ if (format->currentIndex() != 0) {
+ iface->setCmdLineOption("fullpage");
+ }
+ if (format->currentIndex() == 2) {
+ iface->setCmdLineOption("landscape");
+ }
+ if (mainWin->settings->isRenderUsingCairo()) {
+ iface->setCmdLineOption("cairo");
+ }
+ iface->setCompatibilityMode(mainWin->getCompatibility().toLatin1().constData());
+ mainWin->settings->setExportPageSize(format->currentIndex());
+ iface->renderGLE(mainWin->getGLEScript(), file.toLatin1().constData(), device);
+ iface->clearAllCmdLine();
+ mainWin->settings->setOpenExportedFigure(openResult->isChecked());
+ if (isBitmap()) {
+ mainWin->settings->setExportBitmapResolution(resolution->value());
+ } else {
+ mainWin->settings->setExportVectorResolution(resolution->value());
+ }
+ mainWin->settings->setExportGrayScale(grayScale->isChecked());
+ mainWin->settings->setExportTransparent(transp->isChecked());
+ if (openResult->isChecked()) {
+ mainWin->showLocalFile(file);
+ }
+ close();
+}
+
+void ExportDialogue::updateResolution() {
+ double dpi = (double)resolution->value();
+ const GLEPoint& bb = mainWin->getGLEScript()->getBoundingBox();
+ int img_wd = (int)floor((double)dpi/PS_POINTS_PER_INCH*bb.getX()+1);
+ int img_hi = (int)floor((double)dpi/PS_POINTS_PER_INCH*bb.getY()+1);
+ sizeLabel->setText(QString("(%1 x %2 pixels)").arg(img_wd).arg(img_hi));
+}
+
+void ExportDialogue::exportFormatChanged(int idx) {
+ exportFormatChangedImpl(idx, false);
+}
+
+void ExportDialogue::exportFormatChangedImpl(int idx, bool updateAll) {
+ device = entryIDtoDevice(idx);
+ transp->setEnabled(device == GLE_DEVICE_PNG);
+ if (device == GLE_DEVICE_PS && format->currentIndex() == 0) {
+ // "Figure" output not compatible with PS
+ format->setCurrentIndex(1);
+ }
+ const char* ext = mainWin->getGLEInterface()->getDeviceFilenameExtension(device);
+ fname->setText(QGLE::addFileNameExtension(fname->text(), ext));
+ if (isBitmap()) {
+ updateResolution();
+ } else {
+ const GLEPoint& size = mainWin->getGLEScript()->getSize();
+ sizeLabel->setText(QString("(%1 x %2 cm)").arg(size.getX()).arg(size.getY()));
+ }
+ mainWin->settings->setExportFormat(idx);
+ if (previousWasBitmap != isBitmap() || updateAll) {
+ if (isBitmap()) {
+ resolution->setValue(mainWin->settings->getExportBitmapResolution());
+ } else {
+ resolution->setValue(mainWin->settings->getExportVectorResolution());
+ }
+ }
+ previousWasBitmap = isBitmap();
+}
+
+SoftwareLocateThread::SoftwareLocateThread(SoftwareLocateDialogue* parent, const QString& root) {
+ parentWindow = parent;
+ rootDir = root;
+}
+
+SoftwareLocateThread::~SoftwareLocateThread() {
+}
+
+void SoftwareLocateThread::run() {
+ parentWindow->getGLEInterface()->findDependencies(rootDir.toUtf8().constData());
+ emit threadDone();
+}
+
+SoftwareLocateOutput::SoftwareLocateOutput() {
+}
+
+SoftwareLocateOutput::~SoftwareLocateOutput() {
+}
+
+void SoftwareLocateOutput::printflush(const char* str) {
+ emit print(QString::fromUtf8(str));
+}
+
+void SoftwareLocateOutput::println(const char* str) {
+ emit print(QString::fromUtf8(str) + QString::fromUtf8("\n"));
+}
+
+SoftwareLocateDialogue::SoftwareLocateDialogue(GLEMainWindow *parent, GLEInterface* iface, int buttons) : QDialog(parent) {
+ found = false;
+ modified = false;
+ mainWin = parent;
+ cancel = false;
+ gleInterface = iface;
+ searchButton = NULL;
+ locButton = NULL;
+ abortButton = NULL;
+ rootButton = NULL;
+ QVBoxLayout *layout = new QVBoxLayout();
+ QHBoxLayout *top = new QHBoxLayout();
+ QVBoxLayout *left = new QVBoxLayout();
+ QLabel* icon = new QLabel(this);
+ icon->setPixmap(QPixmap(":/images/gle_shadow.png").scaled(QSize(64, 64)));
+ left->addWidget(icon);
+ left->addStretch(1);
+ top->addLayout(left);
+ browser = new QTextBrowser();
+ browser->setOpenLinks(false);
+ top->addWidget(browser);
+ QHBoxLayout *buttonLayout = new QHBoxLayout();
+ rootButton = new QPushButton(tr("Set Search Root"));
+ connect(rootButton, SIGNAL(clicked()), this, SLOT(setRootClicked()));
+ buttonLayout->addWidget(rootButton);
+ searchButton = new QPushButton(tr("Search Automatically"));
+ connect(searchButton, SIGNAL(clicked()), this, SLOT(searchAuto()));
+ buttonLayout->addWidget(searchButton);
+ if ((buttons & QGLE_SOFT_DIALOG_SEARCH_MANUAL) != 0) {
+ locButton = new QPushButton(tr("Manually Locate GhostScript"));
+ connect(locButton, SIGNAL(clicked()), this, SLOT(locateManual()));
+ buttonLayout->addWidget(locButton);
+ }
+ buttonLayout->addStretch(1);
+ if ((buttons & QGLE_SOFT_DIALOG_SEARCH_ABORT) != 0) {
+ abortButton = new QPushButton(tr("Abort"));
+ connect(abortButton, SIGNAL(clicked()), mainWin, SLOT(abort()));
+ buttonLayout->addWidget(abortButton);
+ } else if ((buttons & QGLE_SOFT_DIALOG_SEARCH_CANCEL) != 0) {
+ abortButton = new QPushButton(tr("Cancel"));
+ connect(abortButton, SIGNAL(clicked()), this, SLOT(cancelClicked()));
+ buttonLayout->addWidget(abortButton);
+ }
+ if (mainWin != NULL) {
+ connect(browser, SIGNAL(anchorClicked(const QUrl&)), mainWin, SLOT(showURL(const QUrl&)));
+ }
+ okButton = new QPushButton(tr("Ok"));
+ connect(okButton, SIGNAL(clicked()), this, SLOT(close()));
+ okButton->setEnabled(false);
+ okButton->setDefault(true);
+ buttonLayout->addWidget(okButton);
+ layout->addLayout(top);
+ layout->addLayout(buttonLayout);
+ setLayout(layout);
+ QDesktopWidget* desk = QApplication::desktop();
+ QRect size = desk->screenGeometry(this);
+ resize(size.width()/2, size.height()/2);
+ connect(&output, SIGNAL(print(const QString)), this, SLOT(print(const QString)));
+ getGLEInterface()->setOutputStream(&output);
+}
+
+SoftwareLocateDialogue::~SoftwareLocateDialogue() {
+}
+
+void SoftwareLocateDialogue::showGhostScriptError(QString error, QString loc) {
+ QString gswww = tr("http://www.cs.wisc.edu/~ghost/");
+ QString guidewww = tr("http://www.gle-graphics.org/");
+ #ifdef Q_WS_X11
+ guidewww += tr("tut/linux.html");
+ #endif
+ #ifdef Q_WS_WIN
+ guidewww += tr("tut/windows.html");
+ #endif
+ #ifdef Q_WS_MAC
+ guidewww += tr("downloads/mac.html");
+ #endif
+ QString err = tr("QGLE was unable to load the GhostScript software library, "
+ "which it requires to render GLE's PostScript output.<br><br>"
+ "Current location: '%1'.<br><br>"
+ "Error: '%2'.<br><br>"
+ "Make sure that GhostScript is correctly installed.<br><br>"
+ "GhostScript is freely available"
+ #ifdef Q_WS_X11
+ " from your Linux distribution's software repository, or"
+ #endif
+ " from <a href=\"%3\">%3</a>.<br><br>"
+ "More information is available in the <a href=\"%4\">GLE Installation Guide</a>.<br><br>"
+ "Click 'Manually Locate' to manually locate the GhostScript library (%5), "
+ "or 'Search Automatically' to make GLE search common locations for GhostScript.<br>"
+ ).arg(loc).arg(error).arg(gswww).arg(guidewww).arg(QGLE::gsLibFileName());
+ browser->setHtml(err);
+}
+
+void SoftwareLocateDialogue::disableAll() {
+ QGLE::setEnabled(rootButton, false);
+ QGLE::setEnabled(searchButton, false);
+ QGLE::setEnabled(locButton, false);
+ QGLE::setEnabled(abortButton, false);
+}
+
+void SoftwareLocateDialogue::enableOK(bool enable) {
+ QGLE::setEnabled(okButton, enable);
+}
+
+void SoftwareLocateDialogue::searchAuto() {
+ disableAll();
+ okButton->setEnabled(false);
+ QTextCursor cursor = browser->textCursor();
+ cursor.movePosition(QTextCursor::End);
+ browser->setTextCursor(cursor);
+ browser->insertPlainText(tr("\n"));
+ SoftwareLocateThread* thread = new SoftwareLocateThread(this, rootDir);
+ connect(thread, SIGNAL(threadDone()), this, SLOT(threadDone()));
+ thread->start();
+}
+
+void SoftwareLocateDialogue::tryGhostScriptLocation(QString loc) {
+ QString error;
+ if (mainWin->tryGhostScriptLocation(loc, error)) {
+ found = true;
+ browser->insertPlainText(tr("Found GhostScript: '%1', version: %2.\n").arg(loc).arg(mainWin->getGsLibVersion()));
+ okButton->setEnabled(true);
+ } else {
+ browser->insertPlainText(tr("Location: '%1'.\n").arg(loc));
+ browser->insertPlainText(tr("GhostScript not found: '%1'.\n").arg(error));
+ }
+}
+
+void SoftwareLocateDialogue::locateManual() {
+ okButton->setEnabled(false);
+ QTextCursor cursor = browser->textCursor();
+ cursor.movePosition(QTextCursor::End);
+ browser->setTextCursor(cursor);
+ browser->insertPlainText(tr("\n"));
+ // don't use stock dialog; otherwise it's impossible to select a framework on MacOS/X
+ QFileDialog dialog(this, tr("Locate the GhostScript library"), "/", QGLE::libraryFilter());
+ dialog.setFileMode(QFileDialog::AnyFile);
+ if (dialog.exec()) {
+ QStringList locs = dialog.selectedFiles();
+ if (locs.size() > 0 && locs[0] != "") {
+ tryGhostScriptLocation(locs[0]);
+ }
+ }
+}
+
+void SoftwareLocateDialogue::threadDone() {
+ modified = true;
+ QGLE::setEnabled(rootButton, true);
+ QGLE::setEnabled(searchButton, true);
+ QGLE::setEnabled(locButton, true);
+ QGLE::setEnabled(abortButton, true);
+ if (mainWin != NULL) {
+ string gsloc = getGLEInterface()->getGhostScriptLocation();
+ QString loc = QString::fromUtf8(gsloc.c_str());
+ tryGhostScriptLocation(loc);
+ } else {
+ okButton->setEnabled(true);
+ }
+}
+
+void SoftwareLocateDialogue::cancelClicked() {
+ cancel = true;
+ close();
+}
+
+void SoftwareLocateDialogue::setRootClicked() {
+ rootDir = QFileDialog::getExistingDirectory(this, tr("Select Search Root Directory"), "/", QFileDialog::ShowDirsOnly);
+ QTextCursor cursor = browser->textCursor();
+ cursor.movePosition(QTextCursor::End);
+ browser->setTextCursor(cursor);
+ QString msg = tr("\nClick 'Search Automatically' to search root: %1.\n").arg(rootDir);
+ print(msg);
+}
+
+void SoftwareLocateDialogue::print(const QString str) {
+ browser->insertPlainText(str);
+}
+
+CrashRecoverDialogue::CrashRecoverDialogue(const QString& file) : QDialog(NULL)
+{
+ http = NULL;
+ crashLog = file;
+ requestID = -1;
+ setWindowIcon(QIcon(":images/gle_shadow.png"));
+ setWindowTitle(tr("GLE Internal Error"));
+ crashLogLines.append(QString("The following is the error code and memory location of the error."));
+ crashLogLines.append(QString("We use this to find the line in GLE's source code where the error occured."));
+ crashLogLines.append(QString());
+ QFile myfile(file);
+ if (myfile.open(QIODevice::ReadOnly | QIODevice::Text)) {
+ QRegExp glefile("GLE file:\\s*'(.*)'");
+ QTextStream in(&myfile);
+ while (!in.atEnd()) {
+ QString line = in.readLine();
+ if (glefile.exactMatch(line)) gleFileName.setFile(glefile.capturedTexts()[1]);
+ else crashLogLines.append(line);
+ }
+ myfile.close();
+ }
+ GLEInterface* gleInterface = GLEGetInterfacePointer();
+ QString version = QString::fromUtf8(gleInterface->getGLEVersion().c_str());
+ crashLogLines.append(QString("GLE version: %1.").arg(version));
+ QDateTime time = QDateTime::currentDateTime();
+ crashLogLines.append(QString("Time: %1.").arg(time.toString("MM/dd/yyyy hh:mm:ss")));
+ QHBoxLayout *top = new QHBoxLayout();
+ QVBoxLayout *left = new QVBoxLayout();
+ QLabel* icon = new QLabel(this);
+ icon->setPixmap(QPixmap(":/images/gle_shadow.png").scaled(QSize(64, 64)));
+ left->addWidget(icon);
+ left->addStretch(1);
+ top->addLayout(left);
+ QVBoxLayout *right = new QVBoxLayout();
+ right->addWidget(new QLabel("GLE has encountered an internal error and needed to close.\n\n"
+ "GLE has created a report of this error.\n\n"
+ "Please send this report to the developers by clicking the send button below.\n"
+ "This will help improve the robustness and quality of future GLE versions."));
+ right->addWidget(new QLabel("Please provide a brief description of what you where doing (optional)."));
+ right->addWidget(description = new QTextEdit());
+ right->addWidget(new QLabel("Please enter your e-mail address (optional).\n"
+ "We may contact you if we have a solution or further questions."));
+ right->addWidget(email = new QLineEdit());
+ QSettings settings("gle", "qgle");
+ email->setText(settings.value("application/email").toString());
+ right->addWidget(new QLabel("The crash may be due to a specific construct in your GLE script."));
+ right->addWidget(includeScript = new QCheckBox("Include GLE script ("+gleFileName.fileName()+")"));
+ includeScript->setChecked(true);
+ right->addWidget(new QLabel("Thank you for your cooperation."));
+ top->addLayout(right);
+ cancelButton = new QPushButton(tr("Cancel"));
+ connect(cancelButton, SIGNAL(clicked()), this, SLOT(cancelReport()));
+ QHBoxLayout *buttonLayout = new QHBoxLayout();
+ buttonLayout->addWidget(cancelButton);
+ buttonLayout->addStretch(1);
+ QPushButton *viewButton = new QPushButton(tr("View Report"));
+ buttonLayout->addWidget(viewButton);
+ connect(viewButton, SIGNAL(clicked()), this, SLOT(viewReport()));
+ sendButton = new QPushButton(tr("Send Report"));
+ sendButton->setDefault(true);
+ buttonLayout->addWidget(sendButton);
+ connect(sendButton, SIGNAL(clicked()), this, SLOT(sendReport()));
+ QVBoxLayout *layout = new QVBoxLayout();
+ layout->addLayout(top);
+ layout->addLayout(buttonLayout);
+ setLayout(layout);
+}
+
+void CrashRecoverDialogue::saveEmail()
+{
+ QSettings settings("gle", "qgle");
+ settings.setValue("application/email", email->text());
+}
+
+void CrashRecoverDialogue::cancelReport() {
+ saveEmail();
+ close();
+}
+
+void CrashRecoverDialogue::foundFile(QStringList* list, const QDir& dir, const QString& file) {
+ QFileInfo info(dir, file);
+ if (info.exists()) {
+ list->append(info.absoluteFilePath());
+ }
+}
+
+QString CrashRecoverDialogue::createReport()
+{
+ QString report = crashLogLines.join("\n");
+ report += QString("\n\n%% Description:\n%1\n").arg(description->toPlainText());
+ report += QString("\n%% EMail:\n%1\n").arg(email->text());
+ if (includeScript->isChecked()) {
+ QStringList lines;
+ QStringList files;
+ if (gleFileName.fileName() != "")
+ {
+ QDir mydir = gleFileName.absoluteDir();
+ QFile myfile(gleFileName.absoluteFilePath());
+ if (myfile.open(QIODevice::ReadOnly | QIODevice::Text)) {
+ lines.append(QString());
+ lines.append(tr("%% File: '%1'").arg(gleFileName.fileName()));
+ QRegExp glefile("^\\s*include\\s+\\\"([^\\\"]+)\\\"");
+ QRegExp csvfile("^\\s*data\\s+\\\"([^\\\"]+)\\\"");
+ QTextStream in(&myfile);
+ while (!in.atEnd()) {
+ QString line = in.readLine();
+ if (glefile.indexIn(line) != -1) {
+ foundFile(&files, mydir, glefile.capturedTexts()[1]);
+ }
+ if (csvfile.indexIn(line) != -1) {
+ foundFile(&files, mydir, csvfile.capturedTexts()[1]);
+ }
+ lines.append(line);
+ }
+ myfile.close();
+ }
+ for (int i = 0; i < files.size(); i++) {
+ QFileInfo info(files.at(i));
+ QFile subfile(info.absoluteFilePath());
+ if (subfile.open(QIODevice::ReadOnly | QIODevice::Text)) {
+ lines.append(QString());
+ lines.append(tr("%% File: '%1'").arg(info.fileName()));
+ QTextStream in(&subfile);
+ while (!in.atEnd()) {
+ lines.append(in.readLine());
+ }
+ subfile.close();
+ }
+ }
+ }
+ lines.append(QString());
+ lines.append(tr("%% End"));
+ report += lines.join("\n");
+ }
+ if (report.length() > 50000) {
+ report = report.left(50000);
+ }
+ return report;
+}
+
+void CrashRecoverDialogue::viewReport()
+{
+ QString report = createReport();
+ QDialog viewReportDial(this);
+ viewReportDial.setWindowTitle("View Report");
+ QVBoxLayout *layout = new QVBoxLayout();
+ layout->addWidget(new QLabel(tr("Report:")));
+ QTextEdit* txt = new QTextEdit();
+ txt->setReadOnly(TRUE);
+ txt->insertPlainText(report);
+ QTextCursor cursor = txt->textCursor();
+ cursor.movePosition(QTextCursor::Start);
+ txt->setTextCursor(cursor);
+ layout->addWidget(txt);
+ QPushButton *okButton = new QPushButton(tr("OK"));
+ connect(okButton, SIGNAL(clicked()), &viewReportDial, SLOT(close()));
+ QHBoxLayout *buttonLayout = new QHBoxLayout();
+ buttonLayout->addStretch(1);
+ buttonLayout->addWidget(okButton);
+ layout->addLayout(buttonLayout);
+ viewReportDial.setLayout(layout);
+ QRect size = QApplication::desktop()->screenGeometry(&viewReportDial);
+ viewReportDial.resize(size.width()/2, size.height()/2);
+ viewReportDial.exec();
+}
+
+void CrashRecoverDialogue::requestFinished(int id, bool error)
+{
+ if (id == requestID)
+ {
+ requestID = -1;
+ buffer->seek(0);
+ QString result_txt = buffer->readAll();
+ delete buffer;
+ QRegExp redir("%%\\s+GLE-Redirect:\\s+(\\S+)\\s+(\\S+)");
+ if (!error && redir.indexIn(result_txt) != -1)
+ {
+ QString url = redir.capturedTexts()[1];
+ QString script = redir.capturedTexts()[2];
+ performRequest(url, script);
+ }
+ else
+ {
+ QString err_s = http->errorString();
+ QDialog mydial(this);
+ mydial.setWindowTitle("GLE Internal Error");
+ QVBoxLayout *layout = new QVBoxLayout();
+ layout->addWidget(new QLabel(tr("Result of sending report:")));
+ QTextBrowser* txt = new QTextBrowser();
+ txt->setOpenLinks(false);
+ txt->setReadOnly(TRUE);
+ if (error) txt->insertPlainText(err_s);
+ else txt->setPlainText(result_txt);
+ layout->addWidget(txt);
+ QPushButton *okButton = new QPushButton(tr("Close"));
+ connect(okButton, SIGNAL(clicked()), &mydial, SLOT(close()));
+ QHBoxLayout *buttonLayout = new QHBoxLayout();
+ buttonLayout->addStretch(1);
+ buttonLayout->addWidget(okButton);
+ layout->addLayout(buttonLayout);
+ mydial.setLayout(layout);
+ QRect size = QApplication::desktop()->screenGeometry(&mydial);
+ mydial.resize(size.width()/3, size.height()/3);
+ mydial.exec();
+ close();
+ }
+ }
+}
+
+void CrashRecoverDialogue::performRequest(QString url, QString script)
+{
+ http->setHost(url, 80);
+ QHttpRequestHeader header("POST", script);
+ header.setValue("Host", url);
+ header.setContentType("application/x-www-form-urlencoded");
+ QString report = createReport();
+ GLEInterface* gleInterface = GLEGetInterfacePointer();
+ QByteArray version = QUrl::toPercentEncoding(QString::fromUtf8(gleInterface->getGLEVersion().c_str()));
+ QString tosend_s = tr("code=5568&version=%1&report=").arg(QString::fromUtf8(version));
+ tosend_s += QString::fromUtf8(QUrl::toPercentEncoding(report));
+ tosend_s += "\n";
+ QByteArray tosend = tosend_s.toUtf8().constData();
+ buffer = new QBuffer();
+ buffer->open(QBuffer::ReadWrite);
+ requestID = http->request(header, tosend, buffer);
+}
+
+void CrashRecoverDialogue::sendReport()
+{
+ cancelButton->setEnabled(false);
+ sendButton->setEnabled(false);
+ saveEmail();
+ http = new QHttp(this);
+ connect(http, SIGNAL(requestFinished(int,bool)), this, SLOT(requestFinished(int,bool)));
+ performRequest("www.gle-graphics.org", "/gle-crash-report.php");
+}
diff --git a/src/gui/dialogues.h b/src/gui/dialogues.h
new file mode 100644
index 0000000..829b8c8
--- /dev/null
+++ b/src/gui/dialogues.h
@@ -0,0 +1,177 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+#ifndef _DIALOGUES_H
+#define _DIALOGUES_H
+
+#include <QDialog>
+#include <QTabWidget>
+#include "mainwindow.h"
+#include "consolewindow.h"
+
+class EvaluatorDialog : public QDialog
+{
+ Q_OBJECT
+public:
+ EvaluatorDialog(GLEMainWindow *parent);
+private slots:
+ void eval();
+ void clearResults();
+private:
+ GLEMainWindow *mainWin;
+ ConsoleWindow* results;
+ QLineEdit* field;
+};
+
+//! Dialogue box used to export to different formats
+class ExportDialogue : public QDialog
+{
+ Q_OBJECT
+public:
+ ExportDialogue(GLEMainWindow *parent);
+
+private slots:
+ void exportFormatChanged(int idx);
+ void exportFormatChangedImpl(int idx, bool updateAll);
+ int entryIDtoDevice(int id);
+ void resolutionChanged(int value);
+ void exportClicked();
+ void exportAsClicked();
+
+private:
+ void updateResolution();
+ void performExport(const QString& file);
+ void addFormat(const QString& name, int gleFormatID);
+ bool isBitmap();
+ int device;
+ QList<int> fmtToDevice;
+ GLEMainWindow *mainWin;
+ QListWidget* list;
+ QCheckBox* transp;
+ QCheckBox* grayScale;
+ QCheckBox* openResult;
+ QLineEdit* fname;
+ QSpinBox* resolution;
+ QLabel* resolutionLabel;
+ QLabel* sizeLabel;
+ QComboBox* format;
+ bool previousWasBitmap;
+};
+
+class SoftwareLocateDialogue;
+
+class SoftwareLocateThread : public QThread {
+ Q_OBJECT
+protected:
+ SoftwareLocateDialogue* parentWindow;
+ QString rootDir;
+public:
+ SoftwareLocateThread(SoftwareLocateDialogue* parent, const QString& root);
+ ~SoftwareLocateThread();
+ void run();
+signals:
+ void threadDone();
+};
+
+class SoftwareLocateOutput : public QObject, public GLEOutputStream {
+ Q_OBJECT
+public:
+ SoftwareLocateOutput();
+ virtual ~SoftwareLocateOutput();
+ virtual void println(const char* str);
+ virtual void printflush(const char* str);
+signals:
+ void print(const QString str);
+};
+
+#define QGLE_SOFT_DIALOG_SEARCH_MANUAL 1
+#define QGLE_SOFT_DIALOG_SEARCH_ABORT 2
+#define QGLE_SOFT_DIALOG_SEARCH_CANCEL 4
+
+//! Dialogue box used to locate the GhostScript library
+class SoftwareLocateDialogue : public QDialog
+{
+ Q_OBJECT
+public:
+ SoftwareLocateDialogue(GLEMainWindow *parent, GLEInterface* iface, int buttons);
+ ~SoftwareLocateDialogue();
+ void showGhostScriptError(QString error, QString loc);
+ void disableAll();
+ void enableOK(bool enable);
+ inline GLEMainWindow* getMainWindow() { return mainWin; }
+ inline bool isCancel() { return cancel; }
+ inline bool hasFound() { return found; }
+ inline bool isConfigModified() { return modified; }
+ inline GLEInterface* getGLEInterface() { return gleInterface; }
+ inline void setRootDir(const QString& dir) { rootDir = dir; }
+private slots:
+ void locateManual();
+public slots:
+ void searchAuto();
+ void cancelClicked();
+ void setRootClicked();
+ void print(const QString str);
+ void threadDone();
+private:
+ void tryGhostScriptLocation(QString loc);
+ bool found, modified;
+ GLEInterface* gleInterface;
+ QPushButton* rootButton;
+ QPushButton* searchButton;
+ QPushButton* locButton;
+ QPushButton* abortButton;
+ QPushButton* okButton;
+ QTextBrowser* browser;
+ SoftwareLocateOutput output;
+ GLEMainWindow *mainWin;
+ QString rootDir;
+ bool cancel;
+};
+
+class CrashRecoverDialogue : public QDialog
+{
+ Q_OBJECT
+public:
+ CrashRecoverDialogue(const QString& file);
+ QString createReport();
+ void saveEmail();
+ void foundFile(QStringList* list, const QDir& dir, const QString& file);
+ void performRequest(QString url, QString script);
+public slots:
+ void viewReport();
+ void sendReport();
+ void cancelReport();
+ void requestFinished(int id, bool error);
+protected:
+ int requestID, closeID;
+ QHttp* http;
+ QBuffer *buffer;
+ QFileInfo gleFileName;
+ QString crashLog;
+ QStringList crashLogLines;
+ QTextEdit* description;
+ QLineEdit* email;
+ QCheckBox* includeScript;
+ QPushButton* sendButton;
+ QPushButton* cancelButton;
+};
+
+#endif
diff --git a/src/gui/downloader.cpp b/src/gui/downloader.cpp
new file mode 100644
index 0000000..aa01856
--- /dev/null
+++ b/src/gui/downloader.cpp
@@ -0,0 +1,384 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+#include <QtGui>
+#include <QtNetwork>
+
+#include "downloader.h"
+
+SimpleWizard::SimpleWizard(QWidget *parent)
+ : QDialog(parent)
+{
+ cancelButton = new QPushButton(tr("Cancel"));
+ backButton = new QPushButton(tr("< &Back"));
+ nextButton = new QPushButton(tr("Next >"));
+ finishButton = new QPushButton(tr("&Finish"));
+
+ connect(cancelButton, SIGNAL(clicked()), this, SLOT(reject()));
+ connect(backButton, SIGNAL(clicked()), this, SLOT(backButtonClicked()));
+ connect(nextButton, SIGNAL(clicked()), this, SLOT(nextButtonClicked()));
+// connect(finishButton, SIGNAL(clicked()), this, SLOT(accept()));
+
+ buttonLayout = new QHBoxLayout;
+ buttonLayout->addStretch(1);
+ buttonLayout->addWidget(cancelButton);
+ buttonLayout->addWidget(backButton);
+ buttonLayout->addWidget(nextButton);
+ buttonLayout->addWidget(finishButton);
+
+ mainLayout = new QVBoxLayout;
+ mainLayout->addLayout(buttonLayout);
+ setLayout(mainLayout);
+}
+
+void SimpleWizard::setButtonEnabled(bool enable)
+{
+ if (history.size() == numPages)
+ finishButton->setEnabled(enable);
+ else
+ nextButton->setEnabled(enable);
+}
+
+void SimpleWizard::setNumPages(int n)
+{
+ numPages = n;
+ history.append(createPage(0));
+ switchPage(0);
+}
+
+void SimpleWizard::backButtonClicked()
+{
+ nextButton->setEnabled(true);
+ finishButton->setEnabled(true);
+
+ QWidget *oldPage = history.takeLast();
+ switchPage(oldPage);
+ delete oldPage;
+}
+
+void SimpleWizard::nextButtonClicked()
+{
+ nextButton->setEnabled(true);
+ finishButton->setEnabled(history.size() == numPages - 1);
+
+ QWidget *oldPage = history.last();
+ history.append(createPage(history.size()));
+ switchPage(oldPage);
+}
+
+void SimpleWizard::switchPage(QWidget *oldPage)
+{
+ if (oldPage) {
+ oldPage->hide();
+ mainLayout->removeWidget(oldPage);
+ }
+
+ QWidget *newPage = history.last();
+ mainLayout->insertWidget(0, newPage);
+ newPage->show();
+ newPage->setFocus();
+
+ backButton->setEnabled(history.size() != 1);
+ if (history.size() == numPages) {
+ nextButton->setEnabled(false);
+ finishButton->setDefault(true);
+ } else {
+ nextButton->setDefault(true);
+ finishButton->setEnabled(false);
+ }
+
+ setWindowTitle(tr("Simple Wizard - Step %1 of %2")
+ .arg(history.size())
+ .arg(numPages));
+}
+
+QGLEDownloader::QGLEDownloader(QWidget *parent)
+ : SimpleWizard(parent)
+{
+ setNumPages(3);
+/*
+ urlLineEdit = new QLineEdit("http://www.ietf.org/iesg/1rfc_index.txt");
+
+ urlLabel = new QLabel(tr("&URL:"));
+ urlLabel->setBuddy(urlLineEdit);
+ statusLabel = new QLabel(tr("Please enter the URL of a file you want to "
+ "download."));
+
+ quitButton = new QPushButton(tr("Quit"));
+ downloadButton = new QPushButton(tr("Download"));
+ downloadButton->setDefault(true);
+
+ progressDialog = new QProgressDialog(this);
+
+ http = new QHttp(this);
+
+ connect(urlLineEdit, SIGNAL(textChanged(const QString &)),
+ this, SLOT(enableDownloadButton()));
+ connect(http, SIGNAL(requestFinished(int, bool)),
+ this, SLOT(httpRequestFinished(int, bool)));
+ connect(http, SIGNAL(dataReadProgress(int, int)),
+ this, SLOT(updateDataReadProgress(int, int)));
+ connect(http, SIGNAL(responseHeaderReceived(const QHttpResponseHeader &)),
+ this, SLOT(readResponseHeader(const QHttpResponseHeader &)));
+ connect(progressDialog, SIGNAL(canceled()), this, SLOT(cancelDownload()));
+ connect(downloadButton, SIGNAL(clicked()), this, SLOT(downloadFile()));
+ connect(quitButton, SIGNAL(clicked()), this, SLOT(close()));
+
+ QHBoxLayout *topLayout = new QHBoxLayout;
+ topLayout->addWidget(urlLabel);
+ topLayout->addWidget(urlLineEdit);
+
+ QHBoxLayout *buttonLayout = new QHBoxLayout;
+ buttonLayout->addStretch(1);
+ buttonLayout->addWidget(downloadButton);
+ buttonLayout->addWidget(quitButton);
+
+ QVBoxLayout *mainLayout = new QVBoxLayout;
+ mainLayout->addLayout(topLayout);
+ mainLayout->addWidget(statusLabel);
+ mainLayout->addLayout(buttonLayout);
+ setLayout(mainLayout);
+
+ setWindowTitle(tr("HTTP"));
+ urlLineEdit->setFocus();
+*/
+}
+
+QWidget *QGLEDownloader::createPage(int index)
+{
+ switch (index) {
+ case 0:
+ firstPage = new QGLEDownloaderMirror(this);
+ return firstPage;
+ case 1:
+ secondPage = new QGLEDownloaderDownload(this);
+ return secondPage;
+ case 2:
+ thirdPage = new QGLEDownloaderInstall(this);
+ return thirdPage;
+ }
+ return 0;
+}
+
+ void QGLEDownloader::downloadFile()
+{
+ QUrl url(urlLineEdit->text());
+ QFileInfo fileInfo(url.path());
+ QString fileName = fileInfo.fileName();
+
+ if (QFile::exists(fileName)) {
+ QMessageBox::information(this, tr("HTTP"),
+ tr("There already exists a file called %1 in "
+ "the current directory.")
+ .arg(fileName));
+ return;
+ }
+
+ file = new QFile(fileName);
+ if (!file->open(QIODevice::WriteOnly)) {
+ QMessageBox::information(this, tr("HTTP"),
+ tr("Unable to save the file %1: %2.")
+ .arg(fileName).arg(file->errorString()));
+ delete file;
+ file = 0;
+ return;
+ }
+
+ http->setHost(url.host(), url.port() != -1 ? url.port() : 80);
+ if (!url.userName().isEmpty())
+ http->setUser(url.userName(), url.password());
+
+ httpRequestAborted = false;
+ httpGetId = http->get(url.path(), file);
+
+ progressDialog->setWindowTitle(tr("HTTP"));
+ progressDialog->setLabelText(tr("Downloading %1.").arg(fileName));
+ downloadButton->setEnabled(false);
+}
+
+void QGLEDownloader::cancelDownload()
+{
+ statusLabel->setText(tr("Download canceled."));
+ httpRequestAborted = true;
+ http->abort();
+ downloadButton->setEnabled(true);
+}
+
+void QGLEDownloader::httpRequestFinished(int requestId, bool error)
+{
+ if (httpRequestAborted) {
+ if (file) {
+ file->close();
+ file->remove();
+ delete file;
+ file = 0;
+ }
+
+ progressDialog->hide();
+ return;
+ }
+
+ if (requestId != httpGetId)
+ return;
+
+ progressDialog->hide();
+ file->close();
+
+ if (error) {
+ file->remove();
+ QMessageBox::information(this, tr("HTTP"),
+ tr("Download failed: %1.")
+ .arg(http->errorString()));
+ } else {
+ QString fileName = QFileInfo(QUrl(urlLineEdit->text()).path()).fileName();
+ statusLabel->setText(tr("Downloaded %1 to current directory.").arg(fileName));
+ }
+
+ downloadButton->setEnabled(true);
+ delete file;
+ file = 0;
+}
+
+void QGLEDownloader::readResponseHeader(const QHttpResponseHeader &responseHeader)
+{
+ if (responseHeader.statusCode() != 200) {
+ QMessageBox::information(this, tr("HTTP"),
+ tr("Download failed: %1.")
+ .arg(responseHeader.reasonPhrase()));
+ httpRequestAborted = true;
+ progressDialog->hide();
+ http->abort();
+ return;
+ }
+}
+
+void QGLEDownloader::updateDataReadProgress(int bytesRead, int totalBytes)
+{
+ if (httpRequestAborted)
+ return;
+
+ progressDialog->setMaximum(totalBytes);
+ progressDialog->setValue(bytesRead);
+}
+
+void QGLEDownloader::accept() {
+}
+
+QGLEDownloaderMirror::QGLEDownloaderMirror(QGLEDownloader *wizard) : QWidget(wizard) {
+ QVBoxLayout *layout = new QVBoxLayout();
+ layout->addWidget(new QLabel(tr("Download")));
+ layout->addWidget(downloadName = new QLineEdit());
+ downloadName->setReadOnly(true);
+ layout->addWidget(new QLabel(tr("Select Mirror")));
+ layout->addWidget(mirrorList = new QListWidget());
+ setLayout(layout);
+
+ http = new QHttp(this);
+ file = new QBuffer(this);
+ file->open(QBuffer::ReadWrite);
+
+ connect(http, SIGNAL(requestFinished(int, bool)), this, SLOT(httpRequestFinished(int, bool)));
+ connect(http, SIGNAL(responseHeaderReceived(const QHttpResponseHeader &)), this, SLOT(readResponseHeader(const QHttpResponseHeader &)));
+
+ mirrorList->addItem(tr("Downloading mirror list"));
+ mirrorList->setEnabled(false);
+
+ QUrl url(tr("http://prdownloads.sourceforge.net/glx/gle_4.0.11_src.zip?download"));
+ http->setHost(url.host(), url.port() != -1 ? url.port() : 80);
+ if (!url.userName().isEmpty()) {
+ http->setUser(url.userName(), url.password());
+ }
+
+ httpGetId = http->get(url.path(), file);
+}
+
+
+void QGLEDownloaderMirror::httpRequestFinished(int requestId, bool error)
+{
+ if (requestId != httpGetId) {
+ return;
+ }
+ if (error) {
+ QMessageBox::information(this, tr("Mirror List"),
+ tr("Failed to download mirror list: %1.").arg(http->errorString()));
+ } else {
+ mirrorList->clear();
+ QRegExp rxurl(".*\\<a href\\=\"http\\:\\/\\/([^\"\\/]+).*");
+ QRegExp rxname(".*\\<td\\>([^\\<]+)\\<\\/td\\>.*");
+ QRegExp rxmirr(".*\\?use_mirror\\=([^\"]+)\".*");
+/*
+ <td><a href="http://www.heanet.ie"><img alt="heanet logo" border="0" src="http://images.sourceforge.net/images/prdownloads/heanet_100x34.gif" /></a></td>
+ <td>Dublin, Ireland</td>
+ <td>Europe</td>
+ <td><a href="/glx/gle_4.0.11_src.zip?use_mirror=heanet"><b>Download</b></a></td>
+ </tr> <tr >
+*/
+ QString line, item, url, toadd;
+ file->reset();
+ while(!file->atEnd())
+ {
+ QByteArray data = file->readLine();
+ QString line = QString::fromUtf8(data.constData());
+ if (rxmirr.exactMatch(line)) {
+ toadd = url;
+ if (item != "") {
+ toadd += " ("; toadd += item; toadd += ")";
+ }
+ mirrorList->addItem(toadd);
+ } else if (rxurl.exactMatch(line)) {
+ url = rxurl.capturedTexts()[1];
+ item = "";
+ } else if (rxname.exactMatch(line)) {
+ if (item != "") item += ", ";
+ item += rxname.capturedTexts()[1];
+ }
+ }
+ file->close();
+ mirrorList->setEnabled(true);
+ }
+}
+
+void QGLEDownloaderMirror::readResponseHeader(const QHttpResponseHeader &responseHeader)
+{
+ if (responseHeader.statusCode() != 200) {
+ QMessageBox::information(this, tr("Mirror List"),
+ tr("Failed to download mirror list: %1.").arg(responseHeader.reasonPhrase()));
+ http->abort();
+ }
+}
+
+QGLEDownloaderDownload::QGLEDownloaderDownload(QGLEDownloader *wizard) : QWidget(wizard) {
+ QVBoxLayout *layout = new QVBoxLayout();
+ layout->addWidget(new QLabel(tr("Downloading")));
+ layout->addWidget(new QProgressBar());
+ layout->addWidget(new QLabel(tr("Select Installation Directory")));
+ layout->addStretch(1);
+ setLayout(layout);
+}
+
+QGLEDownloaderInstall::QGLEDownloaderInstall(QGLEDownloader *wizard) : QWidget(wizard) {
+ QVBoxLayout *layout = new QVBoxLayout();
+ layout->addWidget(new QLabel(tr("Installing")));
+ layout->addWidget(new QProgressBar());
+ layout->addWidget(new QListWidget());
+ setLayout(layout);
+}
+
diff --git a/src/gui/downloader.h b/src/gui/downloader.h
new file mode 100644
index 0000000..ac5aab8
--- /dev/null
+++ b/src/gui/downloader.h
@@ -0,0 +1,154 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+#ifndef QGLEDOWNLOADER_H
+#define QGLEDOWNLOADER_H
+
+#include <QDialog>
+#include <QList>
+
+class QFile;
+class QHttp;
+class QHttpResponseHeader;
+class QLabel;
+class QLineEdit;
+class QProgressDialog;
+class QPushButton;
+class QHBoxLayout;
+class QVBoxLayout;
+class QListWidget;
+class QBuffer;
+
+class SimpleWizard : public QDialog
+{
+ Q_OBJECT
+
+public:
+ SimpleWizard(QWidget *parent = 0);
+
+ void setButtonEnabled(bool enable);
+
+protected:
+ virtual QWidget *createPage(int index) = 0;
+ void setNumPages(int n);
+
+private slots:
+ void backButtonClicked();
+ void nextButtonClicked();
+
+private:
+ void switchPage(QWidget *oldPage);
+
+ QList<QWidget *> history;
+ int numPages;
+ QPushButton *cancelButton;
+ QPushButton *backButton;
+ QPushButton *nextButton;
+ QPushButton *finishButton;
+ QHBoxLayout *buttonLayout;
+ QVBoxLayout *mainLayout;
+};
+
+class QGLEDownloader;
+
+class QGLEDownloaderMirror : public QWidget
+{
+ Q_OBJECT
+
+public:
+ QGLEDownloaderMirror(QGLEDownloader *wizard);
+
+private slots:
+ void httpRequestFinished(int requestId, bool error);
+ void readResponseHeader(const QHttpResponseHeader &responseHeader);
+
+private:
+ QLineEdit* downloadName;
+ QListWidget* mirrorList;
+ QHttp *http;
+ QBuffer *file;
+ int httpGetId;
+
+ friend class QGLEDownloader;
+};
+
+class QGLEDownloaderDownload : public QWidget
+{
+ Q_OBJECT
+
+public:
+ QGLEDownloaderDownload(QGLEDownloader *wizard);
+
+ friend class QGLEDownloader;
+};
+
+class QGLEDownloaderInstall : public QWidget
+{
+ Q_OBJECT
+
+public:
+ QGLEDownloaderInstall(QGLEDownloader *wizard);
+
+ friend class QGLEDownloader;
+};
+
+class QGLEDownloader : public SimpleWizard
+{
+ Q_OBJECT
+
+public:
+ QGLEDownloader(QWidget *parent = 0);
+
+public:
+ QWidget *createPage(int index);
+
+private slots:
+ void accept();
+ void downloadFile();
+ void cancelDownload();
+ void httpRequestFinished(int requestId, bool error);
+ void readResponseHeader(const QHttpResponseHeader &responseHeader);
+ void updateDataReadProgress(int bytesRead, int totalBytes);
+// void enableDownloadButton();
+
+private:
+ QLabel *statusLabel;
+ QLabel *urlLabel;
+ QLineEdit *urlLineEdit;
+ QProgressDialog *progressDialog;
+ QPushButton *quitButton;
+ QPushButton *downloadButton;
+
+ QHttp *http;
+ QFile *file;
+ int httpGetId;
+ bool httpRequestAborted;
+
+ QGLEDownloaderMirror *firstPage;
+ QGLEDownloaderDownload *secondPage;
+ QGLEDownloaderInstall *thirdPage;
+
+ friend class QGLEDownloaderMirror;
+ friend class QGLEDownloaderDownload;
+ friend class QGLEDownloaderInstall;
+};
+
+#endif
diff --git a/src/gui/doxyfile b/src/gui/doxyfile
new file mode 100644
index 0000000..1cd0ed7
--- /dev/null
+++ b/src/gui/doxyfile
@@ -0,0 +1,1258 @@
+# Doxyfile 1.4.6
+
+###################################################################################
+# QGLE - A Graphical Interface to GLE #
+# Copyright (C) 2006 A. S. Budden & J. Struyf #
+# #
+# This program is free software; you can redistribute it and/or #
+# modify it under the terms of the GNU General Public License #
+# as published by the Free Software Foundation; either version 2 #
+# of the License, or (at your option) any later version. #
+# #
+# This program is distributed in the hope that it will be useful, #
+# but WITHOUT ANY WARRANTY; without even the implied warranty of #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
+# GNU General Public License for more details. #
+# #
+# You should have received a copy of the GNU General Public License #
+# along with this program; if not, write to the Free Software #
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #
+# #
+# Also add information on how to contact you by electronic and paper mail. #
+###################################################################################/
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+# TAG = value [value, ...]
+# For lists items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
+# by quotes) that should identify the project.
+
+PROJECT_NAME = QGLE
+
+# The 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.
+
+PROJECT_NUMBER =
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
+# base path where the generated documentation will be put.
+# 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.
+
+OUTPUT_DIRECTORY = doc
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
+# 4096 sub-directories (in 2 levels) under the output directory of each output
+# format and will distribute the generated files over these directories.
+# Enabling this option can be useful when feeding doxygen a huge amount of
+# source files, where putting all generated files in the same directory would
+# otherwise cause performance problems for the file system.
+
+CREATE_SUBDIRS = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# The default language is English, other supported languages are:
+# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish,
+# Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese,
+# Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian,
+# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish,
+# Swedish, and Ukrainian.
+
+OUTPUT_LANGUAGE = English
+
+# This tag can be used to specify the encoding used in the generated output.
+# The encoding is not always determined by the language that is chosen,
+# but also whether or not the output is meant for Windows or non-Windows users.
+# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES
+# forces the Windows encoding (this is the default for the Windows binary),
+# whereas setting the tag to NO uses a Unix-style encoding (the default for
+# all platforms other than Windows).
+
+USE_WINDOWS_ENCODING = NO
+
+# If the BRIEF_MEMBER_DESC tag is set to 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.
+
+BRIEF_MEMBER_DESC = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
+# the brief description of a member or function before the detailed description.
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator
+# that is used to form the text in various listings. Each string
+# in this list, if found as the leading text of the brief description, will be
+# stripped from the text and the result after processing the whole list, is
+# used as the annotated text. Otherwise, the brief description is used as-is.
+# If left blank, the following values are used ("$name" is automatically
+# replaced with the name of the entity): "The $name class" "The $name widget"
+# "The $name file" "is" "provides" "specifies" "contains"
+# "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF =
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# Doxygen will generate a detailed section even if there is only a brief
+# description.
+
+ALWAYS_DETAILED_SEC = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+
+INLINE_INHERITED_MEMB = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then 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.
+
+FULL_PATH_NAMES = YES
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
+# can be used to strip a user-defined part of the path. Stripping is
+# only done if one of the specified strings matches the left-hand part of
+# the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the
+# path to strip.
+
+STRIP_FROM_PATH =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
+# the path mentioned in the documentation of a class, which tells
+# the reader which header file to include in order to use a class.
+# If left blank only the name of the header file containing the class
+# definition is used. Otherwise one should specify the include paths that
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
+# (but less readable) file names. This can be useful is your file systems
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
+# will interpret the first line (until the first dot) of a JavaDoc-style
+# comment as the brief description. If set to NO, the JavaDoc
+# comments will behave just like the Qt-style comments (thus requiring an
+# explicit @brief command for a brief description.
+
+JAVADOC_AUTOBRIEF = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
+# treat a multi-line C++ special comment block (i.e. a block of //! or ///
+# comments) as a brief description. This used to be the default behaviour.
+# The new default is to treat a multi-line C++ comment block as a detailed
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the DETAILS_AT_TOP tag is set to YES then Doxygen
+# will output the detailed description near the top, like JavaDoc.
+# If set to NO, the detailed description appears after the member
+# documentation.
+
+DETAILS_AT_TOP = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
+# member inherits the documentation from any documented member that it
+# re-implements.
+
+INHERIT_DOCS = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce
+# a new page for each member. If set to NO, the documentation of a member will
+# be part of the file/class/namespace that contains it.
+
+SEPARATE_MEMBER_PAGES = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab.
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE = 8
+
+# This tag can be used to specify a number of aliases that acts
+# as commands in the documentation. An alias has the form "name=value".
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to
+# put the command \sideeffect (or @sideeffect) in the documentation, which
+# will result in a user-defined paragraph with heading "Side Effects:".
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
+# sources only. Doxygen will then generate output that is more tailored for C.
+# For instance, some of the names that are used will be different. The list
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
+# sources only. Doxygen will then generate output that is more tailored for Java.
+# For instance, namespaces will be presented as packages, qualified scopes
+# will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA = NO
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to
+# include (a tag file for) the STL sources as input, then you should
+# set this tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.
+# func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT = NO
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC = NO
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
+# the same type (for instance a group of public functions) to be put as a
+# subgroup of that type (e.g. under the Public Functions section). Set it to
+# NO to prevent subgrouping. Alternatively, this can be done per class using
+# the \nosubgrouping command.
+
+SUBGROUPING = YES
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available.
+# Private class members and static file members will be hidden unless
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL = NO
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
+# will be included in the documentation.
+
+EXTRACT_PRIVATE = YES
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file
+# will be included in the documentation.
+
+EXTRACT_STATIC = YES
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
+# defined locally in source files will be included in the documentation.
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES = YES
+
+# This flag is only useful for Objective-C code. When set to YES local
+# methods, which are defined in the implementation section but not in
+# the interface are included in the documentation.
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
+# undocumented members of documented classes, files or namespaces.
+# If set to NO (the default) these members will be included in the
+# various overviews, but no documentation section is generated.
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy.
+# If set to NO (the default) these classes will be included in the various
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
+# friend (class|struct|union) declarations.
+# If set to NO (the default) these declarations will be included in the
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
+# documentation blocks found inside the body of a function.
+# If set to NO (the default) these blocks will be appended to the
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS = NO
+
+# The INTERNAL_DOCS tag determines if documentation
+# that is typed after a \internal command is included. If the tag is set
+# to NO (the default) then the documentation will be excluded.
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
+# file names in lower-case letters. If set to 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. Windows
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
+# will show members with their full class and namespace scopes in the
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
+# will put a list of the files that are included by a file in the documentation
+# of that file.
+
+SHOW_INCLUDE_FILES = YES
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
+# is inserted in the documentation for inline members.
+
+INLINE_INFO = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
+# will sort the (detailed) documentation of file and class members
+# alphabetically by member name. If set to NO the members will appear in
+# declaration order.
+
+SORT_MEMBER_DOCS = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
+# brief documentation of file, namespace and class members alphabetically
+# by member name. If set to NO (the default) the members will appear in
+# declaration order.
+
+SORT_BRIEF_DOCS = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
+# sorted by fully-qualified names, including namespaces. If set to
+# NO (the default), the class list will be sorted only by class name,
+# not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or
+# disable (NO) the todo list. This list is created by putting \todo
+# commands in the documentation.
+
+GENERATE_TODOLIST = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or
+# disable (NO) the test list. This list is created by putting \test
+# commands in the documentation.
+
+GENERATE_TESTLIST = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or
+# disable (NO) the bug list. This list is created by putting \bug
+# commands in the documentation.
+
+GENERATE_BUGLIST = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
+# disable (NO) the deprecated list. This list is created by putting
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
+# the initial value of a variable or define consists of for it to appear in
+# the documentation. If the initializer consists of more lines than specified
+# here it will be hidden. Use a value of 0 to hide initializers completely.
+# The appearance of the initializer of individual variables and defines in the
+# documentation can be controlled using \showinitializer or \hideinitializer
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
+# at the bottom of the documentation of classes and structs. If set to YES the
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES = YES
+
+# If the sources in your project are distributed over multiple directories
+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
+# in the documentation. The default is NO.
+
+SHOW_DIRECTORIES = NO
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from the
+# version control system). Doxygen will invoke the program by executing (via
+# popen()) the command <command> <input-file>, where <command> is the value of
+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file
+# provided by doxygen. Whatever the program writes to standard output
+# is used as the file version. See the manual for examples.
+
+FILE_VERSION_FILTER =
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated by doxygen. Possible values are YES and NO. If left blank
+# NO is used.
+
+WARNINGS = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED = YES
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some
+# parameters in a documented function, or documenting parameters that
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR = YES
+
+# This WARN_NO_PARAMDOC option can be abled to get warnings for
+# functions that are documented, but have no documentation for their parameters
+# or return value. If set to NO (the default) doxygen will only warn about
+# wrong or incomplete parameter documentation, but not about the absence of
+# documentation.
+
+WARN_NO_PARAMDOC = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that
+# doxygen can produce. The string should contain the $file, $line, and $text
+# tags, which will be replaced by the file and line number from which the
+# warning originated and the warning text. Optionally the format may contain
+# $version, which will be replaced by the version of the file (if it could
+# be obtained via FILE_VERSION_FILTER)
+
+WARN_FORMAT = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning
+# and error messages should be written. If left blank the output is written
+# to stderr.
+
+WARN_LOGFILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain
+# documented source files. You may enter file names like "myfile.cpp" or
+# directories like "/usr/src/myproject". Separate the files or directories
+# with spaces.
+
+INPUT =
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank the following patterns are tested:
+# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx
+# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py
+
+FILE_PATTERNS =
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories
+# should be searched for input files as well. Possible values are YES and NO.
+# If left blank NO is used.
+
+RECURSIVE = NO
+
+# The EXCLUDE tag can be used to specify files and/or directories that should
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE =
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or
+# directories that are symbolic links (a Unix filesystem feature) are excluded
+# from the input.
+
+EXCLUDE_SYMLINKS = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories. Note that the wildcards are matched
+# against the file with absolute path, so to exclude all test directories
+# for example use the pattern */test/*
+
+EXCLUDE_PATTERNS =
+
+# The 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).
+
+EXAMPLE_PATH =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank all files are included.
+
+EXAMPLE_PATTERNS =
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude
+# commands irrespective of the value of the RECURSIVE tag.
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or
+# directories that contain image that are included in the documentation (see
+# the \image command).
+
+IMAGE_PATH =
+
+# The 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 <filter> <input-file>, where <filter>
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
+# input file. Doxygen will then use the output that the filter program writes
+# to standard output. If FILTER_PATTERNS is specified, this tag will be
+# ignored.
+
+INPUT_FILTER =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form:
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
+# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER
+# is applied to all files.
+
+FILTER_PATTERNS =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will be used to filter the input files when producing source
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will
+# be generated. Documented entities will be cross-referenced with these sources.
+# Note: To get rid of all source code in the generated output, make sure also
+# VERBATIM_HEADERS is set to NO.
+
+SOURCE_BROWSER = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
+# doxygen to hide any special comment blocks from generated source code
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES (the default)
+# then for each documented function all documented
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = YES
+
+# If the REFERENCES_RELATION tag is set to YES (the default)
+# then for each documented function all documented entities
+# called/used by that function will be listed.
+
+REFERENCES_RELATION = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code
+# will point to the HTML generated by the htags(1) tool instead of doxygen
+# built-in source browser. The htags tool is part of GNU's global source
+# tagging system (see http://www.gnu.org/software/global/global.html). You
+# will need version 4.8.6 or higher.
+
+USE_HTAGS = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
+# will generate a verbatim copy of the header file for each class for
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
+# of all compounds will be generated. Enable this if the project
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX = NO
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX = 5
+
+# In case all classes in a project start with a common prefix, all
+# classes will be put under the same header in the alphabetical index.
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX =
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
+# generate HTML output.
+
+GENERATE_HTML = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard header.
+
+HTML_HEADER =
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard footer.
+
+HTML_FOOTER =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
+# style sheet that is used by each HTML page. It can be used to
+# fine-tune the look of the HTML output. If the tag is left blank doxygen
+# will generate a default style sheet. Note that doxygen will try to copy
+# the style sheet file to the HTML output directory, so don't put your own
+# stylesheet in the HTML output directory as well, or it will be erased!
+
+HTML_STYLESHEET =
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
+# files or namespaces will be aligned in HTML using tables. If set to
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS = YES
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files
+# will be generated that can be used as input for tools like the
+# Microsoft HTML help workshop to generate a compressed HTML help file (.chm)
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
+# be used to specify the file name of the resulting .chm file. You
+# can add a path in front of the file if the result should not be
+# written to the html output directory.
+
+CHM_FILE =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
+# be used to specify the location (absolute path including file name) of
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
+# controls if a separate .chi index file is generated (YES) or that
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
+# controls whether a binary table of contents is generated (YES) or a
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND = NO
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
+# top of each HTML page. The value NO (the default) enables the index and
+# the value YES disables it.
+
+DISABLE_INDEX = NO
+
+# This tag can be used to set the number of enum values (range [1..20])
+# that doxygen will group on one line in the generated HTML documentation.
+
+ENUM_VALUES_PER_LINE = 4
+
+# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
+# generated containing a tree-like index structure (just like the one that
+# is generated for HTML Help). For this to work a browser that supports
+# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+,
+# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are
+# probably better off using the HTML help feature.
+
+GENERATE_TREEVIEW = NO
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
+# used to set the initial width (in pixels) of the frame in which the tree
+# is shown.
+
+TREEVIEW_WIDTH = 250
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
+# generate Latex output.
+
+GENERATE_LATEX = YES
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked. If left blank `latex' will be used as the default command name.
+
+LATEX_CMD_NAME = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
+# generate index for LaTeX. If left blank `makeindex' will be used as the
+# default command name.
+
+MAKEINDEX_CMD_NAME = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
+# LaTeX documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_LATEX = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used
+# by the printer. Possible values are: a4, a4wide, letter, legal and
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE = a4wide
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
+# the generated latex document. The header should contain everything until
+# the first chapter. If it is left blank doxygen will generate a
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will
+# contain links (just like the HTML output) instead of page references
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS = NO
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
+# plain latex in the generated Makefile. Set this option to YES to get a
+# higher quality PDF documentation.
+
+USE_PDFLATEX = NO
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
+# command to the generated LaTeX files. This will instruct LaTeX to keep
+# running if errors occur, instead of asking the user for help.
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE = NO
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not
+# include the index chapters (such as File Index, Compound Index, etc.)
+# in the output.
+
+LATEX_HIDE_INDICES = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
+# The RTF output is optimized for Word 97 and may not look very pretty with
+# other RTF readers or editors.
+
+GENERATE_RTF = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
+# RTF documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_RTF = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
+# will contain hyperlink fields. The RTF file will
+# contain links (just like the HTML output) instead of page references.
+# This makes the output suitable for online browsing using WORD or other
+# programs which support those fields.
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's
+# config file, i.e. a series of assignments. You only have to provide
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE =
+
+# Set optional variables used in the generation of an rtf document.
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
+# generate man pages
+
+GENERATE_MAN = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT = man
+
+# The MAN_EXTENSION tag determines the extension that is added to
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
+# then it will generate one additional man file for each entity
+# documented in the real man page(s). These additional files
+# only source the real man page, but without them the man command
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will
+# generate an XML file that captures the structure of
+# the code including all documentation.
+
+GENERATE_XML = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_SCHEMA =
+
+# The XML_DTD tag can be used to specify an XML DTD,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_DTD =
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
+# dump the program listings (including syntax highlighting
+# and cross-referencing information) to the XML output. Note that
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
+# generate an AutoGen Definitions (see autogen.sf.net) file
+# that captures the structure of the code including all
+# documentation. Note that this feature is still experimental
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will
+# generate a Perl module file that captures the structure of
+# the code including all documentation. Note that this
+# feature is still experimental and incomplete at the
+# moment.
+
+GENERATE_PERLMOD = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
+# nicely formatted so it can be parsed by a human reader. This is useful
+# if you want to understand what is going on. On the other hand, if this
+# tag is set to NO the size of the Perl module output will be much smaller
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY = YES
+
+# The names of the make variables in the generated doxyrules.make file
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
+# This is useful so different doxyrules.make files included by the same
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
+# evaluate all C-preprocessor directives found in the sources and include
+# files.
+
+ENABLE_PREPROCESSING = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
+# names in the source code. If set to NO (the default) only conditional
+# compilation will be performed. Macro expansion can be done in a controlled
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
+# then the macro expansion is limited to the macros specified with the
+# PREDEFINED and EXPAND_AS_DEFINED tags.
+
+EXPAND_ONLY_PREDEF = NO
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
+# in the INCLUDE_PATH (see below) will be search if a #include is found.
+
+SEARCH_INCLUDES = YES
+
+# 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.
+
+INCLUDE_PATH =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will
+# be used.
+
+INCLUDE_FILE_PATTERNS =
+
+# The 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. To prevent a macro definition from being
+# undefined via #undef or recursively expanded use the := operator
+# instead of the = operator.
+
+PREDEFINED =
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
+# this tag can be used to specify a list of macro names that should be expanded.
+# The macro definition that is found in the sources will be used.
+# Use the PREDEFINED tag if you want to use a different macro definition.
+
+EXPAND_AS_DEFINED =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
+# doxygen's preprocessor will remove all function-like macros that are alone
+# on a line, have an all uppercase name, and do not end with a semicolon. Such
+# function macros are typically used for boiler-plate code, and will confuse
+# the parser if not removed.
+
+SKIP_FUNCTION_MACROS = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles.
+# Optionally an initial location of the external documentation
+# can be added for each tagfile. The format of a tag file without
+# this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where "loc1" and "loc2" can be relative or absolute paths or
+# URLs. If a location is present for each tag, the installdox tool
+# does not have to be run to correct the links.
+# Note that each tag file must have a unique name
+# (where the name does NOT include the path)
+# 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.
+
+TAGFILES =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE =
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed
+# in the class index. If set to NO only the inherited external classes
+# will be listed.
+
+ALLEXTERNALS = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will
+# be listed.
+
+EXTERNAL_GROUPS = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base
+# or super classes. Setting the tag to NO turns the diagrams off. Note that
+# this option is superseded by the HAVE_DOT option below. This is only a
+# fallback. It is recommended to install and use dot, since it yields more
+# powerful graphs.
+
+CLASS_DIAGRAMS = YES
+
+# If set to YES, the inheritance and collaboration graphs will hide
+# inheritance and usage relations if the target is undocumented
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz, a graph visualization
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT = NO
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect inheritance relations. Setting this tag to YES will force the
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH = YES
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect implementation dependencies (inheritance, containment, and
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH = YES
+
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for groups, showing the direct groups dependencies
+
+GROUP_GRAPHS = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+
+UML_LOOK = NO
+
+# If set to YES, the inheritance and collaboration graphs will show the
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS = NO
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
+# tags are set to YES then doxygen will generate a graph for each documented
+# file showing the direct and indirect include dependencies of the file with
+# other documented files.
+
+INCLUDE_GRAPH = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
+# documented header file showing the documented files that directly or
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH = YES
+
+# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will
+# generate a call dependency graph for every global function or class method.
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command.
+
+CALL_GRAPH = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
+# will graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY = YES
+
+# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES
+# then doxygen will show the dependencies a directory has on other directories
+# in a graphical way. The dependency relations are determined by the #include
+# relations between the files in the directories.
+
+DIRECTORY_GRAPH = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. Possible values are png, jpg, or gif
+# If left blank png will be used.
+
+DOT_IMAGE_FORMAT = png
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+
+DOT_PATH =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the
+# \dotfile command).
+
+DOTFILE_DIRS =
+
+# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than
+# this value, doxygen will try to truncate the graph, so that it fits within
+# the specified constraint. Beware that most browsers cannot cope with very
+# large images.
+
+MAX_DOT_GRAPH_WIDTH = 1024
+
+# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than
+# this value, doxygen will try to truncate the graph, so that it fits within
+# the specified constraint. Beware that most browsers cannot cope with very
+# large images.
+
+MAX_DOT_GRAPH_HEIGHT = 1024
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
+# graphs generated by dot. A depth value of 3 means that only nodes reachable
+# from the root by following a path via at most 3 edges will be shown. Nodes
+# that lay further from the root node will be omitted. Note that setting this
+# option to 1 or 2 may greatly reduce the computation time needed for large
+# code bases. Also note that a graph may be further truncated if the graph's
+# image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH
+# and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default),
+# the graph is not depth-constrained.
+
+MAX_DOT_GRAPH_DEPTH = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, which results in a white background.
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
+# read).
+
+DOT_TRANSPARENT = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10)
+# support this, this feature is disabled by default.
+
+DOT_MULTI_TARGETS = NO
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
+# generate a legend page explaining the meaning of the various boxes and
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
+# remove the intermediate dot files that are used to generate
+# the various graphs.
+
+DOT_CLEANUP = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine
+#---------------------------------------------------------------------------
+
+# The SEARCHENGINE tag specifies whether or not a search engine should be
+# used. If set to NO the values of all tags below this one will be ignored.
+
+SEARCHENGINE = NO
diff --git a/src/gui/drawingobject.cpp b/src/gui/drawingobject.cpp
new file mode 100644
index 0000000..085fb98
--- /dev/null
+++ b/src/gui/drawingobject.cpp
@@ -0,0 +1,529 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+// Implementation of GLEDrawingObject, the base class
+// for all drawing objects in QGLE
+#include "drawingobject.h"
+
+GLEDrawingObject::GLEDrawingObject(double resolution, QSize imageSize, GLEDrawingArea *area)
+ : GLEComponent(resolution, imageSize, area)
+{
+ drawingArea = area;
+ otrackList.clear();
+ selected = false;
+ gleObject = NULL;
+ initialiseProperties();
+}
+
+PropertyDescriptor GLEDrawingObject::getPropertyDescription(int property)
+{
+ if (propertyDescriptions.contains(property))
+ return(propertyDescriptions[property]);
+ else
+ {
+ PropertyDescriptor x;
+ return(x);
+ }
+}
+
+void GLEDrawingObject::initialiseProperties()
+{
+ QVariantMap validList;
+
+ // This property describes the fill colour for a solid object
+ // or for text
+ propertyDescriptions[FillColour].description = tr("Fill Colour");
+ propertyDescriptions[FillColour].type = QVariant::Color;
+ propertyDescriptions[FillColour].defaultValue = QColor();
+ propertyDescriptions[FillColour].validValues = QList<QVariant>();
+
+ // The line colour
+ propertyDescriptions[LineColour].description = tr("Line Colour");
+ propertyDescriptions[LineColour].type = QVariant::Color;
+ propertyDescriptions[LineColour].defaultValue = QColor();
+ propertyDescriptions[LineColour].validValues = QList<QVariant>();
+
+ // The line width
+ propertyDescriptions[LineWidth].description = tr("Line Width");
+ propertyDescriptions[LineWidth].type = QVariant::Double;
+ propertyDescriptions[LineWidth].defaultValue = 0.05;
+ propertyDescriptions[LineWidth].validValues = QList<QVariant>();
+
+ // The line style
+ propertyDescriptions[LineStyle].description = tr("Line Style");
+ propertyDescriptions[LineStyle].type = QVariant::String;
+ propertyDescriptions[LineStyle].defaultValue = QString("0");
+ propertyDescriptions[LineStyle].validValues = QList<QVariant>();
+
+ // The string contained in a text object (and possible some other
+ // objects as well such as boxes in a flow chart)
+ propertyDescriptions[Text].description = tr("Text");
+ propertyDescriptions[Text].type = QVariant::String;
+ propertyDescriptions[Text].defaultValue = QString("");
+ propertyDescriptions[Text].validValues = QList<QVariant>();
+
+ // The font used for a given text string
+ propertyDescriptions[FontName].description = tr("Font Name");
+ propertyDescriptions[FontName].type = QVariant::Int;
+ propertyDescriptions[FontName].defaultValue = 0;
+ propertyDescriptions[FontName].validValues = getFontList();
+
+ // The font used for a given text string
+ propertyDescriptions[FontStyle].description = tr("Font Style");
+ propertyDescriptions[FontStyle].type = QVariant::Int;
+ propertyDescriptions[FontStyle].defaultValue = 0;
+ propertyDescriptions[FontStyle].validValues = getFontStyles();
+
+ // The font size
+ propertyDescriptions[FontSize].description = tr("Font Size");
+ propertyDescriptions[FontSize].type = QVariant::Double;
+ propertyDescriptions[FontSize].defaultValue = 0.3633;
+ propertyDescriptions[FontSize].validValues = QList<QVariant>();
+
+ // The text alignment (e.g. CC)
+ propertyDescriptions[Alignment].description = tr("Text Alignment");
+ propertyDescriptions[Alignment].type = QVariant::Int;
+ propertyDescriptions[Alignment].defaultValue = 0;
+ validList.clear();
+ validList[tr("Object Centre")] = GLEJustifyCC;
+ validList[tr("Top Right")] = GLEJustifyTR;
+ validList[tr("Top Left")] = GLEJustifyTL;
+ validList[tr("Bottom Right")] = GLEJustifyBR;
+ validList[tr("Bottom Left")] = GLEJustifyBL;
+ validList[tr("Left Centre")] = GLEJustifyLC;
+ validList[tr("Right Centre")] = GLEJustifyRC;
+ validList[tr("Top Centre")] = GLEJustifyTC;
+ validList[tr("Bottom Centre")] = GLEJustifyBC;
+ validList[tr("Left Baseline")] = GLEJustifyLeft;
+ validList[tr("Right Baseline")] = GLEJustifyRight;
+ validList[tr("Centre Baseline")] = GLEJustifyCenter;
+ propertyDescriptions[Alignment].validValues = validList;
+
+ // The reference point name
+ propertyDescriptions[RefPointName].description = tr("Reference");
+ propertyDescriptions[RefPointName].type = QVariant::String;
+ propertyDescriptions[RefPointName].defaultValue = QString("bl");
+ propertyDescriptions[RefPointName].validValues = QList<QVariant>();
+
+ // The centre of any object (by bounding box)
+ propertyDescriptions[ObjectCentre].description = tr("Object Centre Point");
+ propertyDescriptions[ObjectCentre].type = QVariant::PointF;
+ propertyDescriptions[ObjectCentre].defaultValue = QPointF(0.0,0.0);
+ propertyDescriptions[ObjectCentre].validValues = QList<QVariant>();
+
+ // The centre of a circle or arc
+ propertyDescriptions[CircleCentre].description = tr("Circle Centre Point");
+ propertyDescriptions[CircleCentre].type = QVariant::PointF;
+ propertyDescriptions[CircleCentre].defaultValue = QPointF(0.0,0.0);
+ propertyDescriptions[CircleCentre].validValues = QList<QVariant>();
+
+ // The radius for a circle or arc
+ propertyDescriptions[Radius].description = tr("Radius");
+ propertyDescriptions[Radius].type = QVariant::Double;
+ propertyDescriptions[Radius].defaultValue = 0.0;
+ propertyDescriptions[Radius].validValues = QList<QVariant>();
+
+ // The major axis radius for an ellipse
+ propertyDescriptions[MajorAxisRadius].description = tr("Major Axis Radius");
+ propertyDescriptions[MajorAxisRadius].type = QVariant::Double;
+ propertyDescriptions[MajorAxisRadius].defaultValue = 0.0;
+ propertyDescriptions[MajorAxisRadius].validValues = QList<QVariant>();
+
+ // The minor axis radius for an ellipse
+ propertyDescriptions[MinorAxisRadius].description = tr("Minor Axis Radius");
+ propertyDescriptions[MinorAxisRadius].type = QVariant::Double;
+ propertyDescriptions[MinorAxisRadius].defaultValue = 0.0;
+ propertyDescriptions[MinorAxisRadius].validValues = QList<QVariant>();
+
+ // The major axis angle for an ellipse
+ propertyDescriptions[MajorAxisAngle].description = tr("Major Axis Angle");
+ propertyDescriptions[MajorAxisAngle].type = QVariant::Double;
+ propertyDescriptions[MajorAxisAngle].defaultValue = 0.0;
+ propertyDescriptions[MajorAxisAngle].validValues = QList<QVariant>();
+
+ // This hasn't been decided on yet, but will probably be an int
+ // (enumerated) from a list of PNGs.
+ propertyDescriptions[ArrowHeadPresence].description = tr("Arrow Heads");
+ propertyDescriptions[ArrowHeadPresence].type = QVariant::Int;
+ propertyDescriptions[ArrowHeadPresence].defaultValue = 0;
+ validList.clear();
+ validList[tr("None")] = 0;
+ validList[tr("Start")] = GLEHasArrowStart;
+ validList[tr("End")] = GLEHasArrowEnd;
+ validList[tr("Both")] = GLEHasArrowStart | GLEHasArrowEnd;
+ propertyDescriptions[ArrowHeadPresence].validValues = validList;
+
+ propertyDescriptions[ArrowHeadSize].description = tr("Arrow Head Size");
+ propertyDescriptions[ArrowHeadSize].type = QVariant::Double;
+ // Check the default size
+ propertyDescriptions[ArrowHeadSize].defaultValue = 1.0;
+ propertyDescriptions[ArrowHeadSize].validValues = QList<QVariant>();
+
+ // This hasn't been decided on yet, but will probably be an int
+ // (enumerated) from a list of PNGs.
+ propertyDescriptions[ArrowHeadStyle].description = tr("Arrow Head Style");
+ propertyDescriptions[ArrowHeadStyle].type = QVariant::Invalid;
+ propertyDescriptions[ArrowHeadStyle].defaultValue = QVariant();
+ propertyDescriptions[ArrowHeadStyle].validValues = QList<QVariant>();
+
+ // The start point for a line
+ propertyDescriptions[StartPoint].description = tr("Start Point");
+ propertyDescriptions[StartPoint].type = QVariant::PointF;
+ propertyDescriptions[StartPoint].defaultValue = QPointF(0.0,0.0);
+ propertyDescriptions[StartPoint].validValues = QList<QVariant>();
+
+ // The end point for a line
+ propertyDescriptions[EndPoint].description = tr("End Point");
+ propertyDescriptions[EndPoint].type = QVariant::PointF;
+ propertyDescriptions[EndPoint].defaultValue = QPointF(0.0,0.0);
+ propertyDescriptions[EndPoint].validValues = QList<QVariant>();
+
+ // Object width
+ propertyDescriptions[Width].description = tr("Width");
+ propertyDescriptions[Width].type = QVariant::Double;
+ propertyDescriptions[Width].defaultValue = 0.0;
+ propertyDescriptions[Width].validValues = QList<QVariant>();
+
+ // Object height
+ propertyDescriptions[Height].description = tr("Height");
+ propertyDescriptions[Height].type = QVariant::Double;
+ propertyDescriptions[Height].defaultValue = 0.0;
+ propertyDescriptions[Height].validValues = QList<QVariant>();
+
+}
+
+// Set text properties
+void GLEDrawingObject::setTextProperties() {
+ GLEDrawObject* obj = getGLEObject();
+ double fontsize = obj->getProperties()->getRealProperty(GLEDOPropertyFontSize);
+ setPropertyNoUpdate(FontSize, fontsize);
+ GLEFont* font = obj->getProperties()->getFontProperty(GLEDOPropertyFont);
+ GLEFont* base = font->getBaseFont();
+ setPropertyNoUpdate(FontName, base->getNumber());
+ setPropertyNoUpdate(FontStyle, base->checkStyle(font));
+}
+
+void GLEDrawingObject::setColorProperty() {
+ QColor col;
+ GLEDrawObject* obj = getGLEObject();
+ GLEColor* color = obj->getProperties()->getColorProperty(GLEDOPropertyColor);
+ col.setRgbF(color->getRed(), color->getGreen(), color->getBlue());
+ setPropertyNoUpdate(LineColour, col);
+}
+
+void GLEDrawingObject::setLineProperties() {
+ QColor col;
+ GLEDrawObject* obj = getGLEObject();
+ GLEColor* color = obj->getProperties()->getColorProperty(GLEDOPropertyColor);
+ col.setRgbF(color->getRed(), color->getGreen(), color->getBlue());
+ setPropertyNoUpdate(LineColour, col);
+ setPropertyNoUpdate(LineWidth, obj->getProperties()->getRealProperty(GLEDOPropertyLineWidth));
+ setPropertyNoUpdate(LineStyle, QGLE::gleToQString(obj->getProperties()->getStringProperty(GLEDOPropertyLineStyle)));
+}
+
+void GLEDrawingObject::setShapeProperties() {
+ QColor col;
+ GLEDrawObject* obj = getGLEObject();
+ GLEColor* color = obj->getProperties()->getColorProperty(GLEDOPropertyFillColor);
+ if (color->isTransparent()) {
+ setPropertyNoUpdate(FillColour, QColor());
+ } else {
+ col.setRgbF(color->getRed(), color->getGreen(), color->getBlue());
+ setPropertyNoUpdate(FillColour, col);
+ }
+}
+
+void GLEDrawingObject::setSimplePenProperties(QPen& pen) {
+ QColor col;
+ GLEDrawObject* obj = getGLEObject();
+ GLEColor* color = obj->getProperties()->getColorProperty(GLEDOPropertyColor);
+ col.setRgbF(color->getRed(), color->getGreen(), color->getBlue());
+ pen.setColor(col);
+ double lwidth = obj->getProperties()->getRealProperty(GLEDOPropertyLineWidth);
+ pen.setWidthF(QGLE::relGLEToQt(lwidth, dpi));
+ GLEString* lstyle = obj->getProperties()->getStringProperty(GLEDOPropertyLineStyle);
+ if (lstyle->length() == 1 && lstyle->get(0) > (unsigned int)'1') {
+ QVector<qreal> dashes;
+ const char *defline[] = {"","","12","41","14","92","1282","9229","4114","54","73","7337","6261","2514"};
+ const char *myline = defline[lstyle->get(0)-'0'];
+ int len = strlen(myline);
+ for (int i = 0; i < len; i++) {
+ double value = (myline[i]-'0');
+ dashes.append((qreal)QGLE::relGLEToQt(value*0.04, dpi));
+ }
+ pen.setDashPattern(dashes);
+ } else if (lstyle->length() > 1) {
+ QVector<qreal> dashes;
+ for (unsigned int i = 0; i < lstyle->length(); i++) {
+ double value = (lstyle->get(i)-'0');
+ dashes.append((qreal)QGLE::relGLEToQt(value*0.04, dpi));
+ }
+ pen.setDashPattern(dashes);
+ }
+}
+
+void GLEDrawingObject::setPenProperties(QPen& pen) {
+ setSimplePenProperties(pen);
+ GLEDrawObject* obj = getGLEObject();
+ int cap = obj->getIntProperty(GLEDOPropertyLineCap);
+ switch (cap) {
+ case GLELineCapButt:
+ pen.setCapStyle(Qt::FlatCap);
+ break;
+ case GLELineCapRound:
+ pen.setCapStyle(Qt::RoundCap);
+ break;
+ case GLELineCapSquare:
+ pen.setCapStyle(Qt::SquareCap);
+ break;
+ }
+}
+
+QList<QVariant> GLEDrawingObject::getFontList()
+{
+ QList<QVariant> flv;
+ GLEInterface* iface = getGLEInterface();
+ int nbfonts = iface->getNumberOfFonts();
+ for (int i = 0; i < nbfonts; i++) {
+ GLEFont* font = iface->getFont(i);
+ flv.push_back(QString::fromUtf8(font->getFullNameC()));
+ // cout << "FONT: " << font->getFullNameC() << " -> " << i << endl;
+ }
+ return(flv);
+}
+
+QList<QVariant> GLEDrawingObject::getFontStyles()
+{
+ QList<QVariant> flv;
+ flv.push_back(tr("Roman"));
+ flv.push_back(tr("Bold"));
+ flv.push_back(tr("Italic"));
+ flv.push_back(tr("Bold Italic"));
+ return flv;
+}
+
+void GLEDrawingObject::imageRendered(QImage)
+{
+ // This should be overridden by any children that use
+ // rendered objects
+}
+
+//! Function to set a given property to a given value
+void GLEDrawingObject::setProperty(int propertyIndex, QVariant value)
+{
+ setPropertyNoUpdate(propertyIndex, value);
+ emit propertyChanged(propertyIndex);
+}
+
+//! Function to set a given property to a given value
+void GLEDrawingObject::setPropertyNoUpdate(int propertyIndex, QVariant value) {
+ if (propertyIndex >= GLEDrawingObject::PropertyUser && getGLEObject() != NULL)
+ {
+ // This case is for arguments of user defined objects
+ int propid = propertyIndex - GLEDrawingObject::PropertyUser;
+ GLEDrawObject* gleobj = getGLEObject();
+ GLEPropertyStoreModel* model = gleobj->getProperties()->getModel();
+ GLEProperty* gleprop = model->getProperty(propid);
+ if (gleprop->getType() == GLEPropertyTypeString)
+ {
+ GLEString* str = gleobj->getProperties()->getStringProperty(gleprop);
+ QGLE::qtToGLEString(value.toString(), str);
+ }
+ else if (gleprop->getType() == GLEPropertyTypeReal)
+ {
+ gleobj->getProperties()->setRealProperty(gleprop, value.toDouble());
+ }
+ }
+ else
+ {
+ if (properties.contains(propertyIndex))
+ properties[propertyIndex] = value;
+ }
+}
+
+//! Function to get the value of a property
+QVariant GLEDrawingObject::getProperty(int propertyIndex)
+{
+ if (properties.contains(propertyIndex))
+ return(properties[propertyIndex]);
+ else
+ return QVariant();
+}
+
+// The selected property tells the object whether it has been
+// selected by the pointer tool
+void GLEDrawingObject::setSelected(bool sel)
+{
+ selected = sel;
+}
+
+bool GLEDrawingObject::isAmove()
+{
+ return(amove);
+}
+
+QList<SnapLine *> GLEDrawingObject::getOTracks()
+{
+ return(otrackList);
+}
+
+void GLEDrawingObject::clearOTracks()
+{
+ SnapLine *snap;
+ foreach(snap, otrackList)
+ {
+ delete snap;
+ }
+ otrackList.clear();
+}
+
+QPair<double, QPointF> GLEDrawingObject::updateOTracks(QPointF cursorPosition)
+{
+ QPair<double, QPointF> nearestPoint;
+ nearestPoint.first = 1e6;
+ nearestPoint.second = QPointF(0.0,0.0);
+ for (int i=otrackList.size()-1;i>=0;i--)
+ {
+ double dist = otrackList[i]->distanceToPoint(cursorPosition, &nearestPoint.second);
+ double objectDistance = distanceToPoint(cursorPosition);
+ if ((dist > MAX_SNAP_LINE_DISTANCE) && (objectDistance > MAX_SNAP_LINE_DISTANCE))
+ {
+ if (QGLE::distance(cursorPosition,
+ otrackList[i]->getQtPoint(SnapLine::StartPoint)) > 3*MAX_SNAP_LINE_DISTANCE)
+ otrackList[i]->deactivate();
+ else
+ {
+ delete otrackList[i];
+ otrackList.removeAt(i);
+ }
+ }
+ else
+ {
+ otrackList[i]->activate();
+ nearestPoint.first = dist;
+ }
+ }
+ return(nearestPoint);
+}
+
+void GLEDrawingObject::distanceToPointUpdate(double x, double y, const QPointF& p, double* minDist, QPointF *nearestPoint)
+{
+ double crDist = QGLE::distance(x, y, p);
+ if (crDist < *minDist) {
+ *minDist = crDist;
+ if (nearestPoint != NULL) {
+ *nearestPoint = QPointF(x, y);
+ }
+ }
+}
+
+//! Set the reference point of, e.g., text objects or GLE object blocks (tl,bl,tc,bc,tr,br,...)
+bool GLEDrawingObject::setReferencePoint(const QPointF&)
+{
+ return false;
+}
+
+bool GLEDrawingObject::findScaleOrigin(const QPointF&, QPointF*, int)
+{
+ return false;
+}
+
+int GLEDrawingObject::supportedTransformMode() {
+ return TransformModeNone;
+}
+
+void GLEDrawingObject::linearTransformPt(int pt, const GLELinearEquation& ex, const GLELinearEquation& ey, bool update)
+{
+ QPointF p = getQtPoint(pt, true);
+ p.setX(ex.apply(p.x()));
+ p.setY(ey.apply(p.y()));
+ setPoint(pt, p, update);
+}
+
+void GLEDrawingObject::linearTransform(const GLELinearEquation&, const GLELinearEquation&)
+{
+}
+
+void GLEDrawingObject::linearTransformDone()
+{
+}
+
+bool GLEDrawingObject::isSelected()
+{
+ return(selected);
+}
+
+void GLEDrawingObject::drawOSnaps(QPainter *p)
+{
+ QPair<QPointF,int> osnap;
+ foreach(osnap, osnapHandles)
+ {
+ //QGLE::drawBox(p,osnap.first,OSNAP_BOX_SIZE, pen);
+ QGLE::drawOSnap(p,osnap);
+ }
+ foreach(osnap, relativeOSnaps)
+ {
+ //QGLE::drawBox(p,osnap.first,OSNAP_BOX_SIZE, pen);
+ QGLE::drawOSnap(p,osnap);
+ }
+}
+
+double GLEDrawingObject::nearestPriorityOSnap(const QPointF&, QPointF *)
+{
+ return 1e6;
+}
+
+double GLEDrawingObject::nearestOSnap(const QPointF& p, QPointF *osnap)
+{
+ QPair<QPointF,int> o;
+ double dist;
+ double shortest_distance = 1e6;
+ *osnap = QPointF(0.0,0.0);
+ foreach(o, osnapHandles)
+ {
+ dist = QGLE::distance(o.first,p);
+ if (dist < shortest_distance)
+ {
+ shortest_distance = dist;
+ *osnap = o.first;
+ }
+ }
+ foreach(o, relativeOSnaps)
+ {
+ dist = QGLE::distance(o.first,p);
+ if (dist < shortest_distance)
+ {
+ shortest_distance = dist;
+ *osnap = o.first;
+ }
+ }
+ return(shortest_distance);
+}
+
+void GLEDrawingObject::clearRelativeOSnaps()
+{
+ relativeOSnaps.clear();
+}
+
+QList< QPair<QPointF,int> > GLEDrawingObject::getRelativeOSnaps()
+{
+ return(relativeOSnaps);
+}
diff --git a/src/gui/drawingobject.h b/src/gui/drawingobject.h
new file mode 100644
index 0000000..e6b1c84
--- /dev/null
+++ b/src/gui/drawingobject.h
@@ -0,0 +1,246 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+#ifndef _GLEDRAWINGOBJECT_H
+#define _GLEDRAWINGOBJECT_H
+
+#include <math.h>
+#include "component.h"
+#include "snapline.h"
+#include "qgle_definitions.h"
+#include "qgle_statics.h"
+#include "gledrawing.h"
+
+struct PropertyDescriptor
+{
+ QString description;
+ QVariant::Type type;
+ QVariant defaultValue;
+ QVariant validValues;
+};
+
+//! GLEDrawingObject class: base class for all drawing objects
+class GLEDrawingObject : public GLEComponent
+{
+ Q_OBJECT
+
+ //! Allow daughters access to private parts (so to speak)
+ friend class GLELine;
+ friend class GLECircle;
+ friend class GLEEllipse;
+ friend class GLEArc;
+ friend class GLEAmove;
+ friend class GLEPolarArray;
+ friend class GLEText;
+public:
+ //! The class constructor
+ GLEDrawingObject(double resolution, QSize imageSize, GLEDrawingArea* area);
+
+ enum TransformModes
+ {
+ TransformModeNone,
+ TransformModeConstrained,
+ TransformModeFree
+ };
+
+ //! The list of all valid properties that any object can have
+ enum Properties
+ {
+ // Common to most objects
+ FillColour,
+ LineColour,
+
+ LineWidth,
+ LineStyle,
+
+ // For text objects
+ Text,
+ FontName,
+ FontStyle,
+ FontSize,
+ Alignment,
+ RefPointName,
+
+ // Centres for arcs and circles?
+ CircleCentre,
+
+ // Centre of the bounding box
+ ObjectCentre,
+
+ // Lines
+ ArrowHeadPresence,
+ ArrowHeadStyle,
+ ArrowHeadSize,
+ StartPoint,
+ EndPoint,
+
+ // Arcs
+ ArcStartAngle,
+ ArcEndAngle,
+
+ // Arcs & Circles
+ Radius,
+
+ // Ellipses
+ MajorAxisRadius,
+ MinorAxisRadius,
+ MajorAxisAngle,
+
+ // May change this to be "size"
+ Width,
+ Height,
+
+ NumberOfProperties // This will hold the number of valid properties
+ // e.g. for(i=0;i<NumberOfProperties;i++)
+ // {
+ // // Process Property i
+ // }
+ };
+
+ static const int PropertyUser = 100;
+
+ enum TextAlignment
+ {
+ CC, TR, TL, BR, BL, LC, RC, TC, BC, LEFTTEXT, RIGHTTEXT, CENTRETEXT
+ };
+
+
+ //! Virtual function to determine whether we're inside an object
+ virtual bool isInside(QPointF p) = 0;
+ virtual QList<QPointF> getTangents(QPointF p) = 0;
+ virtual bool hasTangents() = 0;
+
+ virtual QList<QPointF> getPerpendiculars(QPointF p) = 0;
+ virtual bool hasPerpendiculars() = 0;
+
+ //! Scaling
+ void linearTransformPt(int pt, const GLELinearEquation& ex, const GLELinearEquation& ey, bool update = true);
+ virtual int supportedTransformMode();
+ virtual bool findScaleOrigin(const QPointF& pt, QPointF* origin, int handle);
+ virtual void linearTransform(const GLELinearEquation& ex, const GLELinearEquation& ey);
+ virtual void linearTransformDone();
+
+ //! Moving and rotating
+ virtual void moveBy(QPointF offset) = 0;
+ virtual void rotateBy(double radians) = 0;
+
+ //! Set the reference point of, e.g., text objects or GLE object blocks (tl,bl,tc,bc,tr,br,...)
+ virtual bool setReferencePoint(const QPointF& pt);
+
+ //! Update distance to point given a new point of the object
+ static void distanceToPointUpdate(double x, double y, const QPointF& p, double* minDist, QPointF *nearestPoint);
+
+ QList<SnapLine *> getOTracks();
+
+ //! Check whether the object is an amove
+ bool isAmove();
+
+ //! Function to draw the standard osnap handles
+ void drawOSnaps(QPainter *p);
+
+ //! Function to determine the distance to the nearest priority osnap handle (e.g., scale handles for arc)
+ virtual double nearestPriorityOSnap(const QPointF& pt, QPointF *osnap);
+
+ //! Function to determine the distance to the nearest standard osnap handle
+ virtual double nearestOSnap(const QPointF& p, QPointF *osnap);
+
+ //! Function to set a given property to a given value
+ void setProperty(int propertyIndex, QVariant value);
+ void setPropertyNoUpdate(int propertyIndex, QVariant value);
+ //! Function to get the value of a property
+ QVariant getProperty(int propertyIndex);
+
+ //! Make this object selected
+ void setSelected(bool sel);
+
+ //! Is this object selected?
+ bool isSelected();
+
+ void clearOTracks();
+ virtual void createOTracks() = 0;
+
+ QPair<double, QPointF> updateOTracks(QPointF cursorPosition);
+
+ //! Function to add osnaps relative to a given point
+ virtual void addRelativeOSnaps(QPointF p) = 0;
+ void clearRelativeOSnaps();
+ QList< QPair<QPointF,int> > getRelativeOSnaps();
+
+ inline GLEDrawObject* getGLEObject() { return gleObject.get(); }
+ inline void setGLEObject(GLEDrawObject* obj) { gleObject = obj; }
+
+ inline QSet<int> getValidProperties() { return validProperties; }
+ PropertyDescriptor getPropertyDescription(int property);
+
+ //! Set text properties
+ void setTextProperties();
+ //! Set color property
+ void setColorProperty();
+ //! Set line properties
+ void setLineProperties();
+ //! Set shape properties
+ void setShapeProperties();
+ //! Set pen properties for given GLE object
+ void setSimplePenProperties(QPen& pen);
+ //! Set pen properties for given GLE object
+ void setPenProperties(QPen& pen);
+ //! Return GLEInterface
+ inline GLEInterface* getGLEInterface() { return drawingArea->getGLEInterface(); }
+public slots:
+ virtual void imageRendered(QImage newImage);
+
+signals:
+ void propertyChanged(int propertyIndex);
+
+protected:
+ //! Contains the standard osnap handles
+ QList< QPair<QPointF,int> > osnapHandles;
+
+ //! Contains the relative osnap points
+ QList< QPair<QPointF,int> > relativeOSnaps;
+
+ //! The list of properties for the object
+ QHash<int, QVariant> properties;
+ QHash<int, PropertyDescriptor> propertyDescriptions;
+ void initialiseProperties();
+ //! The set of properties that have a meaning for this object
+ QSet<int> validProperties;
+
+ //! Is the object selected?
+ bool selected;
+
+ //! Is this an amove?
+ bool amove;
+
+ QList<SnapLine *> otrackList;
+
+ QPointF scaleOrigin;
+
+ GLERC<GLEDrawObject> gleObject;
+
+ QHash<QString, QString> fontList;
+ QList<QVariant> getFontList();
+ QList<QVariant> getFontStyles();
+
+ GLEDrawingArea* drawingArea;
+};
+
+#endif
diff --git a/src/gui/ellipse.cpp b/src/gui/ellipse.cpp
new file mode 100644
index 0000000..bd79af0
--- /dev/null
+++ b/src/gui/ellipse.cpp
@@ -0,0 +1,768 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden, S. Wilkinson & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+#include "ellipse.h"
+
+// The constructor for the ellipse object
+GLEEllipse::GLEEllipse(double resolution, QSize imageSize, GLEDrawingArea *area) :
+ GLEDrawingObject(resolution, imageSize, area)
+{
+ // Make sure the ellipse is updated if a point changes or
+ // the image size changes
+ connect(this, SIGNAL(pointChanged()),
+ this, SLOT(updateEllipse()));
+ connect(this, SIGNAL(imageChanged()),
+ this, SLOT(updateEllipse()));
+ connect(this, SIGNAL(propertyChanged(int)),
+ this, SLOT(updateFromProperty(int)));
+
+ amove = false;
+
+ pointHash[Angle] = QPointF(0.0, 0.0);
+
+ // More to be added
+ validProperties
+ << FillColour
+ << LineColour
+ << LineWidth
+ << LineStyle;
+ properties[FillColour] = propertyDescriptions[FillColour].defaultValue;
+ properties[LineColour] = propertyDescriptions[LineColour].defaultValue;
+ properties[LineWidth] = propertyDescriptions[LineWidth].defaultValue;
+ properties[LineStyle] = propertyDescriptions[LineStyle].defaultValue;
+}
+
+void GLEEllipse::createOTracks()
+{
+}
+
+void GLEEllipse::updateFromProperty(int)
+{
+ GLEEllipseDO* obj = (GLEEllipseDO*)getGLEObject();
+ GLEPropertyStore* obj_prop = obj->getProperties();
+
+ obj_prop->setRealProperty(GLEDOPropertyLineWidth, getProperty(LineWidth).toDouble());
+ QColor color = getProperty(LineColour).value<QColor>();
+ GLEColor* gle_color = obj->getProperties()->getColorProperty(GLEDOPropertyColor);
+ gle_color->setRGB255(color.red(), color.green(), color.blue());
+ QGLE::qtToGLEString(getProperty(LineStyle).toString(), obj_prop->getStringProperty(GLEDOPropertyLineStyle));
+
+ GLEColor* gle_fill = obj->getProperties()->getColorProperty(GLEDOPropertyFillColor);
+ if (properties[FillColour].value<QColor>().isValid()) {
+ QColor fill = getProperty(FillColour).value<QColor>();
+ gle_fill->setRGB255(fill.red(), fill.green(), fill.blue());
+ } else {
+ gle_fill->setTransparent(true);
+ }
+
+ ((GLEDrawingArea*)parent())->setDirtyAndSave();
+}
+
+// Update the painter path
+void GLEEllipse::updateEllipse()
+{
+ QPointF p;
+ QPair<QPointF,int> snap;
+ double angle;
+
+ // Only do this if both the centre and radius have been set
+ if (isSet(CentrePoint) && isSet(RadiusX) && isSet(RadiusY) && isSet(Angle))
+ {
+ // This is guaranteed to have been created in the constructor
+ // of GLEDrawingObject
+ delete(paintPath);
+ // Create a new path starting at ellipseCentre
+ paintPath = new QPainterPath(getQtPoint(CentrePoint));
+ // Add the ellipse based on the qrect
+ // This needs to be modified to suit the angle!
+ // CHECK: I think we only use this for bounding boxes,
+ // so just make a rectangle of the bounding box
+
+ angle = getGLEAngle(Angle);
+
+ // Get the bounding box of the ellipse
+ QRectF rect;
+ rect.setTopLeft(getQtPoint(BBoxCornerA));
+ rect.setBottomRight(getQtPoint(BBoxCornerB));
+ paintPath->addRect(rect);
+
+ // Update GLE object
+ GLEEllipseDO* ellipse = (GLEEllipseDO*)getGLEObject();
+ if (ellipse != NULL) {
+ ellipse->setCenter(QGLE::QPointFToGLEPoint(getGLEPoint(CentrePoint)));
+ ellipse->setRadiusX(getGLELength(RadiusX));
+ ellipse->setRadiusY(getGLELength(RadiusY));
+ }
+
+ // Update the calculated equation parameters
+ updateEquationParameters();
+
+ // Now we add the osnap handles
+ osnapHandles.clear();
+
+ p.setX(getQtLength(RadiusX)*cos(M_PI-angle));
+ p.setY(getQtLength(RadiusX)*sin(M_PI-angle));
+ p += getQtPoint(CentrePoint);
+ snap.first = p;
+ snap.second = QGLE::QuadrantSnap;
+ osnapHandles.append(snap);
+
+ p.setX(-getQtLength(RadiusX)*cos(M_PI-angle));
+ p.setY(-getQtLength(RadiusX)*sin(M_PI-angle));
+ p += getQtPoint(CentrePoint);
+ snap.first = p;
+ snap.second = QGLE::QuadrantSnap;
+ osnapHandles.append(snap);
+
+ p.setX(-getQtLength(RadiusY)*sin(angle));
+ p.setY(-getQtLength(RadiusY)*cos(angle));
+ p += getQtPoint(CentrePoint);
+ snap.first = p;
+ snap.second = QGLE::QuadrantSnap;
+ osnapHandles.append(snap);
+
+ p.setX(getQtLength(RadiusY)*sin(angle));
+ p.setY(getQtLength(RadiusY)*cos(angle));
+ p += getQtPoint(CentrePoint);
+ snap.first = p;
+ snap.second = QGLE::QuadrantSnap;
+ osnapHandles.append(snap);
+
+ snap.first = getQtPoint(CentrePoint);
+ snap.second = QGLE::CentreSnap;
+ osnapHandles.append(snap);
+ }
+}
+
+void GLEEllipse::addRelativeOSnaps(QPointF p)
+{
+ // This should be very similar to the circle one
+ if (isSet(CentrePoint) && isSet(RadiusX) && isSet(RadiusY) && isSet(Angle))
+ {
+ relativeOSnaps.clear();
+
+ QList<QPointF> perpendiculars = getPerpendiculars(p);
+ QPointF ppt;
+ foreach(ppt, perpendiculars)
+ {
+ relativeOSnaps.append(QPair<QPointF,int>(ppt, QGLE::PerpendicularSnap));
+ }
+
+ QList<QPointF> tangents = getTangents(p);
+
+ QPointF tpt;
+ foreach(tpt, tangents)
+ {
+ relativeOSnaps.append(QPair<QPointF,int>(tpt, QGLE::TangentSnap));
+ }
+
+ }
+}
+
+QList<QPointF> GLEEllipse::getTangents(QPointF p)
+{
+ QList<QPointF> tangents;
+ QPointF tangentPoint;
+ int i;
+ double A,B,C,delta,x,y;
+ double m[2], c[2]; // slope and y-intercept
+
+ if (!isInside(p))
+ {
+ QHash<char, double> coeffs = equationParameters;
+ // coeffs['A'], coeffs['B'] etc
+ // Ax^2 + By^2 + Cxy + Dx + Ey + F = 0
+
+ // Tangent line equation y = mx + c is satisfied by p.x() and p.y()
+ // Slope of a tangents, m, satisfies a quadratic: A*m^2 + B*m + C = 0
+ // where A, B and C are:
+ A = + pow(coeffs['E'],2)
+ - 4*coeffs['B']*coeffs['F']
+ + ( 2*coeffs['C']*coeffs['E'] - 4*coeffs['B']*coeffs['D'] ) *p.x()
+ + ( pow(coeffs['C'],2) - 4*coeffs['A']*coeffs['B'] )*pow(p.x(),2);
+ B = - 4*coeffs['C']*coeffs['F']
+ + 2*coeffs['D']*coeffs['E']
+ + ( 4*coeffs['B']*coeffs['D'] - 2*coeffs['C']*coeffs['E'] ) * p.y()
+ + ( 4*coeffs['A']*coeffs['E'] - 2*coeffs['C']*coeffs['D'] ) * p.x()
+ + ( 8*coeffs['A']*coeffs['B'] - 2*pow((coeffs['C']),2) ) * p.y() * p.x();
+ C = + pow(coeffs['D'],2)
+ - 4*coeffs['A']*coeffs['F']
+ + ( pow(coeffs['C'],2) - 4*coeffs['A']*coeffs['B'] ) * pow(p.y(),2)
+ + ( 2*coeffs['C']*coeffs['D'] - 4*coeffs['A']*coeffs['E'] ) * p.y();
+
+ if (A != 0)
+ {
+ // Solving the quadratic in m gives 2 tangents:
+ delta = pow(B,2) - 4*A*C;
+ m[0] = 1/(2*A) * (-B + sqrt(delta));
+ m[1] = 1/(2*A) * (-B - sqrt(delta));
+ // Knowing the slope and a point on the tangent we find the y-intercept
+ c[0] = p.y() - m[0] * p.x();
+ c[1] = p.y() - m[1] * p.x();
+
+ // Solve the quadratic which gives the intersection between ellipse and line
+ // Either call GLEEllipse::lineIntersection, or do it here
+ // In this case the intersection quadratic equation has one repeated real root
+ // Single real root of A*x^2 + B*x + C = 0 is x=-B/(2*A)
+ for (i=0;i<2;i++)
+ {
+ // Coefficients of the quadratic in x
+ A = + coeffs['A']
+ + coeffs['C'] * m[i]
+ + coeffs['B'] * pow(m[i],2);
+ B = + coeffs['D']
+ + coeffs['C'] * c[i]
+ + coeffs['E'] * m[i]
+ + 2*coeffs['B'] * m[i] * c[i];
+
+ x = -B/(2*A);
+ y = m[i] * x + c[i];
+
+ // Work in Qt Coordinates: p is the 'point'
+ tangentPoint = QPointF(x,y);
+
+ // For each tangentPoint
+ tangents.append(tangentPoint);
+ }
+ }
+ else
+ {
+ // The quadratic in m reduces to a linear equation in m, giving one tangent
+ // The other tangent is a vertical line x = p.x();
+ m[0] = -C/B;
+ c[0] = p.y() - m[0] * p.x();
+ // Coefficients of the quadratic in x
+ A = + coeffs['A']
+ + coeffs['C'] * m[0]
+ + coeffs['B'] * pow(m[0],2);
+ B = + coeffs['D']
+ + coeffs['C'] * c[0]
+ + coeffs['E'] * m[0]
+ + 2*coeffs['B'] * m[0] * c[0];
+ x = -B/(2*A);
+ y = m[0] * x + c[0];
+ tangentPoint = QPointF(x,y);
+ tangents.append(tangentPoint);
+ x = p.x();
+ // can't use y=m*x+c here to work out the value of y!
+ // instead plut x into the ellipse equation
+ // solve yet another quadratic, this time in y
+ // A*y^2 + B*y + C = 0
+ // The desired value of y is a repeated real root, so need only A and B
+ A = coeffs['B'];
+ B = coeffs['E']
+ + coeffs['C'] * x;
+ y = -B/(2*A);
+ tangentPoint = QPointF(x,y);
+ tangents.append(tangentPoint);
+ }
+ }
+ return(tangents);
+}
+
+bool GLEEllipse::hasTangents()
+{
+ return(true);
+}
+
+QList<QPointF> GLEEllipse::getPerpendiculars(QPointF p)
+{
+ QList<QPointF> perpendiculars;
+
+ QPointF c = getQtPoint(CentrePoint);
+ double rx = getQtLength(RadiusX);
+ double ry = getQtLength(RadiusY);
+ double angle = getQtAngle(Angle);
+
+ // Change coordinate system to be centred on origin
+ QPointF translated = p - c;
+
+ // Rotate about the origin to align the ellipse with the axis
+ QPointF rotated = QGLE::parkTransform(translated, angle);
+
+ QPointF perpPoint;
+
+ double delta = M_PI;
+ double t = -M_PI;
+ int iterations = 0;
+ double s, ds, tn;
+ int i,j;
+
+ // Search for the perpendicular points
+ for (i=0; i<4; i++)
+ {
+ while ((fabs(delta) > ELLIPSE_PERP_ACCURACY) &&
+ (iterations < MAX_ELLIPSE_PERP_ITERATIONS))
+ {
+ ds = -rx*rotated.x()*cos(t)
+ - ry*rotated.y()*sin(t)
+ + (pow(rx,2)-pow(ry,2))*(pow(cos(t),2) - pow(sin(t),2));
+
+ if (ds != 0.0)
+ {
+ s = -rx*rotated.x()*sin(t)
+ + ry*rotated.y()*cos(t)
+ + (pow(rx,2)-pow(ry,2))*sin(t)*cos(t);
+ tn = t - (s/ds);
+ delta = tn - t;
+ t = tn;
+ }
+ else
+ {
+ t = t + M_PI/2.0;
+ }
+ iterations++;
+ }
+
+ perpPoint = QPointF(rx*cos(t),ry*sin(t));
+ t = -M_PI + (i+1)*M_PI/2.0;
+ iterations = 0;
+ delta = M_PI;
+
+ // Now unrotate
+ QPointF unrotated = QGLE::parkTransform(perpPoint, -angle);
+
+ // Now Untranslate
+ QPointF perpendicularPoint = unrotated + c;
+
+ // Add to the list
+ perpendiculars.append(perpendicularPoint);
+ }
+
+ // Now check for coincident points
+ for(i=perpendiculars.size()-1;i>0;i--)
+ {
+ for(j=i-1;j>=0;j--)
+ {
+ if (perpendiculars[i] == perpendiculars[j])
+ {
+ perpendiculars.removeAt(i);
+ break;
+ }
+ }
+ }
+
+ return(perpendiculars);
+}
+
+bool GLEEllipse::hasPerpendiculars()
+{
+ return(true);
+}
+
+void GLEEllipse::draw(QPainter *p)
+{
+ QPen cpen;
+ double angle;
+ if (isSet(RadiusX) && isSet(RadiusY) && isSet(Angle))
+ {
+ angle = getQtAngle(Angle);
+
+ p->save();
+ p->translate(getQtPoint(CentrePoint));
+ if (angle != 0.0)
+ p->rotate(QGLE::radiansToDegrees(angle));
+ setSimplePenProperties(cpen);
+ p->setPen(cpen);
+ if (properties[FillColour].value<QColor>().isValid())
+ p->setBrush(QBrush(properties[FillColour].value<QColor>()));
+ else
+ p->setBrush(Qt::NoBrush);
+ p->drawEllipse(ellipseRect());
+ p->restore();
+
+ }
+}
+
+double GLEEllipse::distanceToPoint(const QPointF& p, QPointF *nearestPoint)
+{
+ QList<QPointF> perpPoints = getPerpendiculars(p);
+ QPointF pp;
+
+ double shortestDistance = 1e6;
+ double dist;
+
+ foreach(pp,perpPoints)
+ {
+ dist = QGLE::distance(pp,p);
+ if (dist < shortestDistance)
+ {
+ shortestDistance = dist;
+ if (nearestPoint)
+ {
+ nearestPoint->setX(pp.x());
+ nearestPoint->setY(pp.y());
+ }
+ }
+ }
+
+ return(shortestDistance);
+}
+
+// Set a point (start or end in the case of a line)
+void GLEEllipse::setPoint(int pointChoice, const QPointF& p, bool update)
+{
+ switch(pointChoice)
+ {
+ case BBoxCorner:
+ if (isSet(BBoxCornerA))
+ setPoint(BBoxCornerB, p);
+ else
+ setPoint(BBoxCornerA, p);
+ break;
+
+ case CentrePoint:
+ pointHash[pointChoice] = QGLE::absQtToGLE(p, dpi, pixmap.height());
+ updateBBox();
+ break;
+
+ case BBoxCornerA:
+ case BBoxCornerB:
+ pointHash[pointChoice] = QGLE::absQtToGLE(p, dpi, pixmap.height());
+ updateFromBBox();
+ break;
+
+ case RadiusX:
+ pointHash[pointChoice] = QGLE::relQtToGLE(p, dpi);
+ updateBBox();
+ break;
+
+ case RadiusY:
+ pointHash[pointChoice] = QGLE::relQtToGLE(p, dpi);
+ updateBBox();
+ break;
+
+ case Angle:
+ pointHash[pointChoice] = -p;
+ break;
+ }
+
+ if (update) updateEllipse();
+}
+
+void GLEEllipse::updateBBox()
+{
+ QPointF ba,bb;
+
+ QPointF c;
+ double rx, ry;
+ double theta;
+
+ if (isSet(RadiusX) && isSet(RadiusY) && isSet(CentrePoint) && isSet(Angle))
+ {
+ c = getQtPoint(CentrePoint);
+ rx = getQtLength(RadiusX);
+ ry = getQtLength(RadiusY);
+ theta = getQtAngle(Angle);
+
+ // Convert to max lengths
+ double x = sqrt(pow(rx*cos(theta),2)+pow(ry*sin(theta),2));
+ double y = sqrt(pow(rx*sin(theta),2)+pow(ry*cos(theta),2));
+
+ ba.setX(c.x() + x);
+ ba.setY(c.y() - y);
+ bb.setX(c.x() - x);
+ bb.setY(c.y() + y);
+
+ pointHash[BBoxCornerA] = QGLE::absQtToGLE(ba, dpi, pixmap.height());
+ pointHash[BBoxCornerB] = QGLE::absQtToGLE(bb, dpi, pixmap.height());
+ }
+}
+
+void GLEEllipse::updateFromBBox()
+{
+ QPointF c;
+ double rx,ry;
+ QPointF ba, bb;
+
+ if (isSet(BBoxCornerA) && isSet(BBoxCornerB) && isSet(Angle))
+ {
+ // Get the parameters
+ ba = getQtPoint(BBoxCornerA);
+ bb = getQtPoint(BBoxCornerB);
+
+ // Locate the centre point
+ c.setX((ba.x() + bb.x())/2.0);
+ c.setY((ba.y() + bb.y())/2.0);
+
+ // Find the difference between the centre and the BBox
+ rx = fabs(bb.x() - c.x());
+ ry = fabs(bb.y() - c.y());
+
+ pointHash[CentrePoint] = QGLE::absQtToGLE(c, dpi, pixmap.height());
+ pointHash[RadiusX] = QPointF(QGLE::relQtToGLE(rx, dpi),0.0);
+ pointHash[RadiusY] = QPointF(QGLE::relQtToGLE(ry, dpi),0.0);
+ }
+}
+
+QRectF GLEEllipse::ellipseRect()
+{
+
+ // This returns the ellipse rectangle, but centred on the origin
+ // and not rotated. The rotation and translation are done with
+ // painter->translate() and painter->rotate().
+
+ QRectF rect;
+ QPointF c;
+ double rx, ry;
+ if (isSet(RadiusX) && isSet(RadiusY))
+ {
+ rx = getQtLength(RadiusX);
+ ry = getQtLength(RadiusY);
+
+ rect.setBottomLeft(QPointF(-rx, ry));
+ rect.setTopRight(QPointF(rx, -ry));
+ }
+ return(rect);
+}
+
+void GLEEllipse::updateEquationParameters()
+{
+ // Qt Coordinates!
+
+ // Returns the parameters of:
+ // Ax^2 + By^2 + Cxy + Dx + Ey + F = 0
+
+ QPointF c = getQtPoint(CentrePoint);
+ double angle = getQtAngle(Angle);
+ double rx = getQtLength(RadiusX);
+ double ry = getQtLength(RadiusY);
+
+ // Ellipse equation with angle = 0.0 is
+ //
+ // x^2 y^2
+ // ---- + ---- = 1
+ // rx^2 ry^2
+ //
+ // Translation and rotation with:
+ // ( cos(a) sin(a) -c.x*cos(a)-c.y*sin(a) ) ( x )
+ // ( -sin(a) cos(a) c.x*sin(a)-c.y*cos(a) ) ( y )
+ // ( 0 0 1 ) ( 1 )
+ //
+ // Solving this gives the result
+
+ double cosine = cos(angle);
+ double sine = sin(angle);
+
+ equationParameters['A'] = pow(cosine/rx,2) + pow(sine/ry,2);
+ equationParameters['B'] = pow(sine/rx,2) + pow(cosine/ry,2);
+ equationParameters['C'] = 2*cosine*sine/pow(rx,2) - 2*cosine*sine/pow(ry,2);
+ equationParameters['D'] = (-2*pow(cosine,2)*c.x() - 2*cosine*sine*c.y())/pow(rx,2) +
+ (-2*pow(sine,2)*c.x() + 2*sine*cosine*c.y())/pow(ry,2);
+ equationParameters['E'] = (-2*pow(sine,2)*c.y() - 2*sine*cosine*c.x())/pow(rx,2) +
+ (-2*pow(cosine,2)*c.y() + 2*sine*cosine*c.x())/pow(ry,2);
+ equationParameters['F'] = (pow(cosine,2)*pow(c.x(),2) + 2*sine*cosine*c.x()*c.y() + pow(sine,2)*pow(c.y(),2))/pow(rx,2) +
+ (pow(cosine,2)*pow(c.y(),2) - 2*sine*cosine*c.x()*c.y() + pow(sine,2)*pow(c.x(),2))/pow(ry,2) - 1;
+
+// qDebug() << "Calculated equation parameters as: \n"
+// << "A: " << equationParameters['A'] << "\n"
+// << "B: " << equationParameters['B'] << "\n"
+// << "C: " << equationParameters['C'] << "\n"
+// << "D: " << equationParameters['D'] << "\n"
+// << "E: " << equationParameters['E'] << "\n"
+// << "F: " << equationParameters['F'] << "\n"
+// << "For centre: " << c << "; angle: " << angle << "; radii: " << QSizeF(rx,ry);
+
+ // For debugging
+ double A, B, C, D, E;
+ A = equationParameters['A'];
+ B = equationParameters['B'];
+ C = equationParameters['C'];
+ D = equationParameters['D'];
+ E = equationParameters['E'];
+
+ QPointF p1,p2,p3,p4;
+ // Now work out the points where the ellipse touches
+ // the old bounding box
+ QPointF bba = getQtPoint(BBoxCornerA);
+ QPointF bbb = getQtPoint(BBoxCornerB);
+ p1.setX(bba.x());
+ p1.setY(-(C*p1.x()+E)/(2*B));
+ p2.setY(bba.y());
+ p2.setX(-(C*p2.y()+D)/(2*A));
+ p3.setX(bbb.x());
+ p3.setY(-(C*p3.x()+E)/(2*B));
+ p4.setY(bbb.y());
+ p4.setX(-(C*p4.y()+D)/(2*A));
+}
+
+
+QList<QPointF> GLEEllipse::intersections(double qtm, double qtc, bool vertical)
+{
+ QPointF one, two;
+ // For ellipses, we'll deal with points individually:
+ if (vertical)
+ {
+ one.setX(qtm);
+ two.setX(qtm);
+ one.setY(0.0);
+ two.setY(1.0);
+ }
+ else
+ {
+ one.setX(0.0);
+ one.setY(qtc);
+ two.setX(1.0);
+ two.setY(qtm + qtc);
+ }
+
+ return(intersections(one,two));
+}
+
+
+QList<QPointF> GLEEllipse::intersections(QPointF, QPointF)
+{
+ QList<QPointF> pointArray;
+
+ return(pointArray);
+}
+
+QList<QPointF> GLEEllipse::intersections(QPointF, double)
+{
+ QList<QPointF> correctIntersections;
+ return(correctIntersections);
+
+}
+
+bool GLEEllipse::isInside(QPointF p)
+{
+ double value =
+ equationParameters['A']*p.x()*p.x() +
+ equationParameters['B']*p.y()*p.y() +
+ equationParameters['C']*p.x()*p.y() +
+ equationParameters['D']*p.x() +
+ equationParameters['E']*p.y() +
+ equationParameters['F'];
+
+ // If on or in, return true
+ if (value > 0.0)
+ return(false);
+ else
+ return(true);
+}
+
+int GLEEllipse::supportedTransformMode()
+{
+ return TransformModeFree;
+}
+
+void GLEEllipse::linearTransform(const GLELinearEquation& ex, const GLELinearEquation& ey)
+{
+ if (isSet(BBoxCornerA) && isSet(BBoxCornerB))
+ {
+ pointHash.clear();
+
+ // Adjust the centre
+ QPointF c = getQtPoint(CentrePoint, true);
+ double angle = getQtAngle(Angle, true);
+ double rx = getQtLength(RadiusX, true);
+ double ry = getQtLength(RadiusY, true);
+
+ QPointF p1,p2,p3,p4;
+ // Now work out the points corresponding to the extremes
+ // of the unrotated ellipse
+ p1.setX(c.x() + rx*cos(angle));
+ p1.setY(c.y() + rx*sin(angle));
+ p2.setX(c.x() - rx*cos(angle));
+ p2.setY(c.y() - rx*sin(angle));
+ p3.setX(c.x() - ry*sin(angle));
+ p3.setY(c.y() + ry*cos(angle));
+ p4.setX(c.x() + ry*sin(angle));
+ p4.setY(c.y() - ry*cos(angle));
+
+ // Now scale them to their new positions
+ p1.setX(ex.apply(p1.x()));
+ p1.setY(ey.apply(p1.y()));
+ p2.setX(ex.apply(p2.x()));
+ p2.setY(ey.apply(p2.y()));
+ p3.setX(ex.apply(p3.x()));
+ p3.setY(ey.apply(p3.y()));
+ p4.setX(ex.apply(p4.x()));
+ p4.setY(ey.apply(p4.y()));
+ c.setX(ex.apply(c.x()));
+ c.setY(ey.apply(c.y()));
+
+ // Now derive the parameters
+ rx = QGLE::distance(c, p1);
+ ry = QGLE::distance(c, p3);
+ angle = QGLE::angleBetweenTwoPoints(c, p1);
+
+ setLength(Angle, angle, false);
+ setLength(RadiusX, rx, false);
+ setLength(RadiusY, ry, false);
+ setPoint(CentrePoint, c, false);
+ updateEllipse();
+ }
+}
+
+void GLEEllipse::moveBy(QPointF offset)
+{
+ double radiusx = getQtLength(RadiusX);
+ double radiusy = getQtLength(RadiusY);
+ double angle = getQtAngle(Angle);
+ pointHash.clear();
+ setLength(RadiusX, radiusx, false);
+ setLength(RadiusY, radiusy, false);
+ setLength(Angle, angle, false);
+
+ // Moves relative to storedPointHash
+ QPointF c = getQtPoint(CentrePoint, true);
+ setPoint(CentrePoint, c + offset, false);
+
+ updateBBox();
+ updateEllipse();
+
+}
+
+void GLEEllipse::rotateBy(double radians)
+{
+ double radiusx = getQtLength(RadiusX);
+ double radiusy = getQtLength(RadiusY);
+ pointHash.clear();
+ setPoint(RadiusX, QPointF(radiusx,0.0));
+ setPoint(RadiusY, QPointF(radiusy,0.0));
+
+ QPointF oldCentre = getQtPoint(CentrePoint, true);
+
+ // TODO: There's a definite glitch somewhere with the rotation...
+ QPointF c = QGLE::rotateAboutPoint(oldCentre, radians, basePoint);
+ setPoint(CentrePoint, c);
+
+ // Now update the angle, what's the angle change?
+ // If the base point is at the centre, we just need to update
+ // the angle, but if not it's less easy
+ double oldAngle = getQtAngle(Angle, true);
+
+ // Now work out where a point on the old ellipse is
+ QPointF edgePoint;
+ edgePoint.setX(oldCentre.x() + getQtLength(RadiusX)*cos(oldAngle));
+ edgePoint.setY(oldCentre.y() + getQtLength(RadiusX)*sin(oldAngle));
+
+ // Now rotate it and work out the new angle from there
+ edgePoint = QGLE::rotateAboutPoint(edgePoint, radians, basePoint);
+ double newAngle = QGLE::angleBetweenTwoPoints(c, edgePoint);
+
+ setPoint(Angle, QPointF(newAngle, 0.0));
+
+ updateBBox();
+ updateEllipse();
+
+}
diff --git a/src/gui/ellipse.h b/src/gui/ellipse.h
new file mode 100644
index 0000000..d8c78e3
--- /dev/null
+++ b/src/gui/ellipse.h
@@ -0,0 +1,90 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+#ifndef _GLEELLIPSE_H
+#define _GLEELLIPSE_H
+
+#include "drawingobject.h"
+
+//! Class describing a ellipse drawing object
+class GLEEllipse : public GLEDrawingObject
+{
+ Q_OBJECT
+
+public:
+
+ //! Enumeration of points used to describe a ellipse
+ enum Points
+ {
+
+ CentrePoint,
+ RadiusX,
+ RadiusY,
+ Angle, // RADIANS!
+ BBoxCorner, // Used to automatically choose the corner
+ BBoxCornerA, // These ignore the angle!
+ BBoxCornerB
+ };
+
+ //! Constructor used for initialising variables and connections
+ GLEEllipse(double resolution, QSize imageSize, GLEDrawingArea *area);
+
+ //! Draw the ellipse on the provided painter
+ void draw(QPainter *p);
+ //! Return the shortest distance between a given point and the ellipse
+ double distanceToPoint(const QPointF& p, QPointF *nearestPoint);
+ //! Set one of the enumerated points
+ void setPoint(int pointChoice, const QPointF& p, bool update = true);
+ //! Find points where a line intersects the ellipse
+ // If vertical = true, m contains 'x'
+ QList<QPointF> intersections(double qtm, double qtc, bool vertical = false);
+ QList<QPointF> intersections(QPointF qtp1, QPointF qtp2);
+ QList<QPointF> intersections(QPointF qtp1, double angle);
+ //! Is the point inside the object?
+ bool isInside(QPointF p);
+ void addRelativeOSnaps(QPointF p);
+
+ QList<QPointF> getTangents(QPointF p);
+ bool hasTangents();
+ QList<QPointF> getPerpendiculars(QPointF p);
+ bool hasPerpendiculars();
+ void createOTracks();
+
+ //! Return the ellipse's bounding rectangle in Qt coordinates
+ QRectF ellipseRect();
+
+ int supportedTransformMode();
+ void linearTransform(const GLELinearEquation& ex, const GLELinearEquation& ey);
+ void moveBy(QPointF offset);
+ void rotateBy(double radians);
+
+private:
+ void updateBBox();
+ void updateFromBBox();
+ void updateEquationParameters();
+
+private slots:
+ //! Update the painter path when the resolution or start/end points change
+ void updateEllipse();
+ void updateFromProperty(int property);
+};
+
+#endif
diff --git a/src/gui/fileinfo.cpp b/src/gui/fileinfo.cpp
new file mode 100644
index 0000000..a1a567c
--- /dev/null
+++ b/src/gui/fileinfo.cpp
@@ -0,0 +1,143 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+#include "fileinfo.h"
+#include "qgle_statics.h"
+
+/**********************************************************************
+ * A class that holds various bits of information about the open file *
+ **********************************************************************/
+
+// Clear the file info object on creation
+GLEFileInfo::GLEFileInfo()
+{
+ clear();
+}
+
+void GLEFileInfo::setImage(const QImage& newImage)
+{
+ image = newImage;
+}
+
+// Clear the fileinfo object by setting everything to null
+void GLEFileInfo::clear()
+{
+ gleFileName = "";
+ epsFileName = "";
+ image = QImage();
+ lastDPI = -1;
+ hasFileNameFlag = false;
+}
+
+// Copy relevant information from other GLEFileInfo object
+void GLEFileInfo::copyFrom(GLEFileInfo* other)
+{
+ // *DO NOT* copy image and .eps file name!
+ gleFileName = other->gleFileName;
+ hasFileNameFlag = other->hasFileNameFlag;
+ lastModified = other->lastModified;
+}
+
+// Read the time stamp from the file and save it.
+void GLEFileInfo::updateTimeStamp()
+{
+ QFileInfo fi;
+ QString mainFile = primaryFile();
+ if (mainFile.isEmpty())
+ {
+ lastModified = QDateTime();
+ return;
+ }
+
+ fi.setFile(mainFile);
+
+ lastModified = fi.lastModified();
+}
+
+// Return the filename of the main file (i.e. the GLE
+// file if we have one and the EPS file otherwise)
+QString GLEFileInfo::primaryFile()
+{
+ if (isGLE())
+ return(gleFileName);
+ else if (isEPS())
+ return(epsFileName);
+ else
+ return QString();
+}
+
+// Is it a GLE file?
+bool GLEFileInfo::isGLE()
+{
+ return(!gleFileName.isEmpty());
+}
+
+// Is it an EPS file?
+bool GLEFileInfo::isEPS()
+{
+ if(isGLE())
+ return false;
+
+ return(!epsFileName.isEmpty());
+}
+
+// Check whether the file has changed on disk
+// by looking at the time stamp
+bool GLEFileInfo::hasChanged()
+{
+ QFileInfo fi;
+ QString mainFile(primaryFile());
+ if (mainFile.isEmpty()) {
+ return false;
+ }
+ fi.setFile(mainFile);
+ if (!fi.isReadable()) {
+ return false;
+ }
+ QDateTime modifiedTime(fi.lastModified());
+ if (modifiedTime > lastModified) {
+ return true;
+ } else {
+ for (int i = 0; i < filesToMonitor.size(); ++i) {
+ GLEFileData data(filesToMonitor.at(i));
+ fi.setFile(data.fname);
+ if (fi.isReadable() && fi.lastModified() > data.lastModified) {
+ return true;
+ }
+ }
+ return false;
+ }
+}
+
+void GLEFileInfo::clearFilesToMonitor()
+{
+ filesToMonitor.clear();
+}
+
+void GLEFileInfo::addFileToMonitor(const QString& str)
+{
+ QFileInfo fi;
+ GLEFileData data;
+ fi.setFile(str);
+ data.fname = str;
+ data.lastModified = fi.lastModified();
+ filesToMonitor.append(data);
+}
diff --git a/src/gui/fileinfo.h b/src/gui/fileinfo.h
new file mode 100644
index 0000000..baab0fc
--- /dev/null
+++ b/src/gui/fileinfo.h
@@ -0,0 +1,97 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+#ifndef _GLE_FILE_INFO_H
+#define _GLE_FILE_INFO_H
+
+#include <QtGui>
+
+class GLEFileData
+{
+public:
+ QString fname;
+ QDateTime lastModified;
+};
+
+//! Class used to describe the open file
+class GLEFileInfo
+{
+private:
+ //! The GLE file name
+ QString gleFileName;
+ //! The EPS file name
+ QString epsFileName;
+ //! The rendered image
+ QImage image;
+ //! The previous DPI value
+ double lastDPI;
+ //! The time stamp
+ QDateTime lastModified;
+ //! Flag noting whether we have a file name
+ bool hasFileNameFlag;
+ //! Additional files to monitor
+ QList<GLEFileData> filesToMonitor;
+
+public:
+ //! Constructor: initialise variables
+ GLEFileInfo();
+
+ //! Return the GLE file name
+ inline const QString& gleFile() { return gleFileName; }
+ //! Set the GLE file name
+ inline void setGleFile(const QString& newGLEFile) { gleFileName = newGLEFile; setHasFileName(true);}
+ //! Clear the GLE file name
+ inline void clearGleFile() { gleFileName = ""; }
+ //! Return the EPS file name
+ inline const QString& epsFile() { return epsFileName; }
+ //! Set the EPS file name
+ inline void setEpsFile(const QString& newEPSFile) { epsFileName = newEPSFile; }
+ //! Get the rendered base image
+ inline const QImage& getImage() { return image; }
+ //! Set the rendered base image
+ void setImage(const QImage& newImage);
+ //! What was the previous DPI value
+ inline double getLastDPI() { return lastDPI; }
+ //! Set whether this is a temporary file
+ inline void setLastDPI(double dpi) { lastDPI = dpi; }
+ //! Set whether we have a file name
+ inline void setHasFileName(const bool& newFlag) { hasFileNameFlag = newFlag; }
+ //! Do we have a file name?
+ inline const bool& hasFileName() { return hasFileNameFlag; }
+ //! Update the time stamp
+ void updateTimeStamp();
+ //! Has the file changed externally?
+ bool hasChanged();
+ //! Is the primary file a GLE file?
+ bool isGLE();
+ //! Is the primary file an EPS file?
+ bool isEPS();
+ //! What's the file name of the primary file?
+ QString primaryFile();
+ //! Clear the object
+ void clear();
+ //! Copy relevant information from other GLEFileInfo object
+ void copyFrom(GLEFileInfo* other);
+ void clearFilesToMonitor();
+ void addFileToMonitor(const QString& str);
+};
+
+#endif
diff --git a/src/gui/gledrawing.cpp b/src/gui/gledrawing.cpp
new file mode 100644
index 0000000..53d46bf
--- /dev/null
+++ b/src/gui/gledrawing.cpp
@@ -0,0 +1,2869 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+#include <QtGui>
+
+#include "mainwindow.h"
+#include "drawingobject.h"
+#include "line.h"
+#include "circle.h"
+#include "ellipse.h"
+#include "arc.h"
+#include "text.h"
+#include "snapline.h"
+#include "grid.h"
+#include "amove.h"
+
+// The constructor for the drawing area
+GLEDrawingArea::GLEDrawingArea(GLEInterface *iface, GLEMainWindow* main) : QWidget(main)
+{
+ mainWin = main;
+ gleInterface = iface;
+
+ // Clear dirty flag (that indicates script should be saved)
+ clearDirty();
+ // Initialize all instance variables
+ initAll();
+
+ // Grid uses QT units, but grid spacing is set in GLE units
+ grid = new GLEGrid(this);
+ grid->setGrid(gridSpacing);
+ grid->setDPI(dpi);
+
+ // This ensures that Mouse Move events happen
+ // even when the mouse buttons aren't pressed, which
+ // is essential for updating the status bar and using
+ // snap.
+ setMouseTracking(true);
+
+ // Make some handy messages to let the user know what to do
+ statusMessages[NoTool][StartPoint] = tr("");
+ statusMessages[PointerTool][StartPoint] = tr("Select an object, or hold shift to select multiple objects");
+ statusMessages[LineTool][StartPoint] = tr("Select start point");
+ statusMessages[TextTool][StartPoint] = tr("Select location for text");
+ statusMessages[TanLineTool][StartPoint] = tr("Select start object");
+ statusMessages[PerpLineTool][StartPoint] = tr("Select start object");
+ statusMessages[CircleTool][StartPoint] = tr("Select centre point");
+ statusMessages[EllipseTool][StartPoint] = tr("Select bounding box corner point");
+ statusMessages[ArcTool][StartPoint] = tr("Select start point");
+ statusMessages[AMoveTool][StartPoint] = tr("Select final point for GLE script");
+
+ statusMessages[LineTool][EndPoint] = tr("Select end point");
+ statusMessages[TanLineTool][EndPoint] = tr("Select end point");
+ statusMessages[PerpLineTool][EndPoint] = tr("Select end point");
+ statusMessages[ArcTool][EndPoint] = tr("Select end point");
+ statusMessages[ArcTool][MidPoint] = tr("Select a point somewhere on the arc");
+ statusMessages[CircleTool][CircumferencePoint] = tr("Select a point somewhere on the circle");
+ statusMessages[EllipseTool][EndPoint] = tr("Select opposite corner point");
+
+ CornerHandles.append(TopLeft);
+ CornerHandles.append(TopRight);
+ CornerHandles.append(BottomLeft);
+ CornerHandles.append(BottomRight);
+ SideHandles.append(MiddleLeft);
+ SideHandles.append(MiddleRight);
+ SideHandles.append(TopMiddle);
+ SideHandles.append(BottomMiddle);
+}
+
+//! Initialize all instance variables
+void GLEDrawingArea::initAll()
+{
+ dpi = 0.0;
+ gridVisible = false;
+ gridSpacing = QPointF(1.0,1.0);
+ hasAMove = false;
+ amoveIndex = 0;
+ newObjects = false;
+ isEditMode = false;
+ // Snap types
+ snaps[ObjectSnap] = false;
+ snaps[OrthoSnap] = false;
+ snaps[PolarSnap] = false;
+ snaps[PolarTrack] = false;
+ snaps[GridSnap] = false;
+ // Polar snap settings
+ polarStartAngle = 0.0;
+ polarAngleIncrement = 30.0;
+ // Assume that keys aren't pressed at start up
+ modifier[ShiftKey] = false;
+ modifier[AltKey] = false;
+ modifier[CtrlKey] = false;
+ // Default to no tool
+ currentTool = NoTool;
+ objectSelected = false;
+ // Initialize orther variables
+ initVars();
+ // Remove all polar snaps
+ clearPolarSnaps();
+}
+
+//! Initialize instance variables related to selection
+void GLEDrawingArea::initSelectionVars()
+{
+ // Drawing modes
+ isScaling = false;
+ isMoving = false;
+ isRotating = false;
+ // Selection
+ selectionMode = SelectionMove;
+ objectMoved = false;
+ // Which handle of the selection was grabbed?
+ grabbedHandle = -1;
+ // Selected object snap indicates snapping to points in selected object before move/scale
+ isSelectedObjectSnap = false;
+ // Selection handles
+ handleList.clear();
+ // Used for rotating objectss
+ baseAngle = 0.0;
+ lastAngle = 0.0;
+ // Reference point for scale / move
+ basePoint.setX(0.0); basePoint.setX(0.0);
+ // Origin for scale operation (this is the point that does not move during scaling)
+ scaleOrigin.setX(-1.0); scaleOrigin.setY(-1.0);
+}
+
+void GLEDrawingArea::initVars()
+{
+ // Busy drawing new object?
+ isDrawing = false;
+ // Index of object that is being created (in object list)
+ currentIndex = 0;
+ // Index of reference object when creating, e.g., a line orthogonal to an object
+ baseObject = 0;
+ // Cursor position and a copy that is snapped to the current snaps
+ cursorPosition.setX(0.0); cursorPosition.setY(0.0);
+ snappedPosition.setX(0.0); snappedPosition.setY(0.0);
+ lastPoint.setX(0.0); lastPoint.setY(0.0);
+ // Initialize instance variables related to selection
+ initSelectionVars();
+}
+
+void GLEDrawingArea::setPolarSnapStartAngle(double newAngle)
+{
+ polarStartAngle = newAngle;
+}
+
+void GLEDrawingArea::setPolarSnapIncAngle(double newAngle)
+{
+ polarAngleIncrement = newAngle;
+}
+
+void GLEDrawingArea::modifierToggle(int mod, bool state)
+{
+ modifier[mod] = state;
+}
+
+// To allow us to notice whether changes have occurred
+bool GLEDrawingArea::isDirty()
+{
+ return(dirty);
+}
+
+// To allow us to notice whether changes have occurred
+void GLEDrawingArea::clearDirty()
+{
+ dirty = false;
+ // The following sets the '*' on the title bar
+ mainWin->setWindowModified(false);
+ emit dirtyFlagChanged(dirty);
+}
+
+// To allow us to notice whether changes have occurred
+void GLEDrawingArea::setDirtyAndSave()
+{
+ setDirty();
+ newObjects = true;
+}
+
+// To allow us to notice whether changes have occurred
+void GLEDrawingArea::setDirty()
+{
+ if (dirty) return;
+ dirty = true;
+ mainWin->setWindowModified(true);
+ emit dirtyFlagChanged(dirty);
+}
+
+// Convert GLE point to Qt point
+QPointF GLEDrawingArea::gleToQt(GLEPoint& pt)
+{
+ return QGLE::absGLEToQt(pt.getX(), pt.getY(), dpi, pixmap.height());
+}
+
+// Create new line object based on GLE object
+void GLEDrawingArea::createNewLineFromScript(GLELineDO* line) {
+ objectList.append(new GLELine(dpi, pixmap.size(), this));
+ currentIndex = objectList.size() - 1;
+ connect(this, SIGNAL(sizeChanged(QSize,double)), objectList[currentIndex], SLOT(setPixmapSize(QSize,double)));
+ objectList[currentIndex]->setPoint(GLELine::StartPoint, gleToQt(line->getP1()));
+ objectList[currentIndex]->setPoint(GLELine::EndPoint, gleToQt(line->getP2()));
+ objectList[currentIndex]->setGLEObject(line);
+ objectList[currentIndex]->setLineProperties();
+ objectList[currentIndex]->setPropertyNoUpdate(GLELine::ArrowHeadPresence, line->getArrow());
+}
+
+// Create new ellipse object based on GLE object
+void GLEDrawingArea::createNewEllipseFromScript(GLEEllipseDO* ellipse) {
+ if (ellipse->isCircle()) objectList.append(new GLECircle(dpi, pixmap.size(), this));
+ else objectList.append(new GLEEllipse(dpi, pixmap.size(), this));
+ currentIndex = objectList.size() - 1;
+ connect(this, SIGNAL(sizeChanged(QSize,double)), objectList[currentIndex], SLOT(setPixmapSize(QSize,double)));
+ if (ellipse->isCircle()) {
+ GLEPoint edge = ellipse->getPoint(GLEJustifyRC);
+ objectList[currentIndex]->setPoint(GLECircle::CentrePoint, gleToQt(ellipse->getCenter()));
+ objectList[currentIndex]->setPoint(GLECircle::CircumferencePoint, gleToQt(edge));
+ } else {
+ GLEPoint c1 = ellipse->getPoint(GLEJustifyTL);
+ GLEPoint c2 = ellipse->getPoint(GLEJustifyBR);
+ objectList[currentIndex]->setPoint(GLEEllipse::BBoxCornerA, gleToQt(c1));
+ objectList[currentIndex]->setPoint(GLEEllipse::BBoxCornerB, gleToQt(c2));
+ }
+ objectList[currentIndex]->setGLEObject(ellipse);
+ objectList[currentIndex]->setLineProperties();
+ objectList[currentIndex]->setShapeProperties();
+}
+
+// Create new ellipse object based on GLE object
+void GLEDrawingArea::createNewArcFromScript(GLEArcDO* arc) {
+ GLEPoint dummy;
+ objectList.append(new GLEArc(dpi, pixmap.size(), this));
+ currentIndex = objectList.size() - 1;
+ connect(this, SIGNAL(sizeChanged(QSize,double)), objectList[currentIndex], SLOT(setPixmapSize(QSize,double)));
+ objectList[currentIndex]->setPoint(GLEArc::CentrePoint, gleToQt(arc->getCenter()));
+ objectList[currentIndex]->setPoint(GLEArc::StartPoint, gleToQt(arc->getPoint1(dummy)));
+ objectList[currentIndex]->setPoint(GLEArc::EndPoint, gleToQt(arc->getPoint2(dummy)));
+ objectList[currentIndex]->setPoint(GLEArc::MidPoint, gleToQt(arc->getPointMid(dummy)));
+ objectList[currentIndex]->setGLEObject(arc);
+ objectList[currentIndex]->setLineProperties();
+ objectList[currentIndex]->setPropertyNoUpdate(GLELine::ArrowHeadPresence, arc->getArrow());
+}
+
+// Create new text object based on GLE object
+void GLEDrawingArea::createNewTextFromScript(GLETextDO* text) {
+ QColor color;
+ GLEPoint dummy;
+ GLEText* textobj = new GLEText(dpi, pixmap.size(), this);
+ textobj->setGLEObject(text);
+ objectList.append(textobj);
+ connect(this, SIGNAL(sizeChanged(QSize,double)), textobj, SLOT(setPixmapSize(QSize,double)));
+ textobj->setPoint(GLEText::ReferencePoint, gleToQt(text->getPosition()), false);
+ textobj->setPropertyNoUpdate(GLEText::Alignment, text->getProperties()->getIntProperty(GLEDOPropertyJustify));
+ textobj->setPropertyNoUpdate(GLEText::Text, QString::fromUtf8(text->getTextC()));
+ textobj->setColorProperty();
+ textobj->setTextProperties();
+ textobj->updateFromPropertyNoDirty(GLEText::Text);
+}
+
+// Create new object block based on GLE object
+void GLEDrawingArea::createNewObjectFromScript(GLEObjectDO* obj) {
+ GLEObjectBlock *newObj = new GLEObjectBlock(dpi, pixmap.size(), this);
+ connect(this, SIGNAL(sizeChanged(QSize,double)), newObj, SLOT(setPixmapSize(QSize,double)));
+ objectList.append(newObj);
+ newObj->setGLEObject(obj);
+ newObj->setPropertyNoUpdate(GLEDrawingObject::RefPointName, QGLE::gleToQString(obj->getRefPointString()));
+ // FIXME: render object in GLE thread instead of GUI thread
+ obj->render();
+ newObj->computeInitialPosition();
+ GLEPropertyStore* props = obj->getProperties();
+ double fontsize = props->getRealProperty(GLEDOPropertyFontSize);
+ newObj->setPropertyNoUpdate(GLEObjectBlock::FontSize, fontsize);
+ GLEFont* font = props->getFontProperty(GLEDOPropertyFont);
+ GLEFont* base = font->getBaseFont();
+ newObj->setPropertyNoUpdate(GLEObjectBlock::FontName, base->getNumber());
+ newObj->setPropertyNoUpdate(GLEObjectBlock::FontStyle, base->checkStyle(font));
+ if (props->getModel()->isSupportScale()) {
+ GLEArrayImpl* arr = props->getArray();
+ newObj->setLength(GLEObjectBlock::ObjectWidth, arr->getDouble(0), false);
+ newObj->setLength(GLEObjectBlock::ObjectHeight, arr->getDouble(1), false);
+ }
+ newObj->setTextProperties();
+ newObj->setLineProperties();
+ newObj->setShapeProperties();
+ newObj->renderPostscript();
+}
+
+// Create objects from given GLE script
+void GLEDrawingArea::updateFromScript(GLEScript* script) {
+ clearObjects();
+ gleScript = script;
+ for (int i = 0; i < script->getNumberObjects(); i++) {
+ GLEDrawObject* obj = script->getObject(i);
+ GLEDrawObjectType type = obj->getType();
+ switch (type) {
+ case GDOLine:
+ createNewLineFromScript((GLELineDO*)obj);
+ break;
+ case GDOEllipse:
+ createNewEllipseFromScript((GLEEllipseDO*)obj);
+ break;
+ case GDOArc:
+ createNewArcFromScript((GLEArcDO*)obj);
+ break;
+ case GDOText:
+ createNewTextFromScript((GLETextDO*)obj);
+ break;
+ case GDOObject:
+ createNewObjectFromScript((GLEObjectDO*)obj);
+ break;
+ default:
+ break;
+ }
+ }
+ isDrawing = false;
+ update();
+}
+
+void GLEDrawingArea::paintEvent(QPaintEvent *event)
+{
+ // Create a QPainter to draw on the widget
+ QPainter painter(this);
+ // Fill the widget with white.
+ painter.setRenderHint(QPainter::Antialiasing);
+
+ QPointF nearestPoint;
+ createSelectionHandles();
+
+ // If there is a pixmap available to draw,
+ if (pixmap.isNull())
+ {
+ painter.fillRect(event->rect(), Qt::white);
+ return;
+ }
+ // Always draw the pixmap first as it'll cover anything else
+ // Just update the part from event->rect() for efficiency
+ painter.drawPixmap(event->rect(), pixmap, event->rect());
+
+ if (isEditMode)
+ {
+ QPen cursorPen = grid->pen();
+ cursorPen.setColor(Qt::black);
+ cursorPen.setWidth(1);
+
+ // Always draw the grid next, so that objects are over
+ // the top of the grid.
+ painter.save();
+ if ((snaps[GridSnap] || snaps[ObjectSnap] || polarSnapFound || isSelectedObjectSnap) &&
+ ((currentTool != PointerTool) || objectSelected)
+ && (currentTool != NoTool))
+ {
+ // Draw the cursor unless we're using the selection tool
+ painter.setPen(cursorPen);
+ int crossLength = 4;
+ // Draw a cross at the nearest grid point
+ QGLE::drawCross(&painter, snappedPosition, crossLength, cursorPen);
+ }
+ painter.restore();
+
+ QPen osnapPen;
+ osnapPen.setColor(Qt::darkYellow);
+ osnapPen.setWidth(1);
+
+ if (snaps[PolarSnap] &&
+ !snaps[GridSnap] &&
+ (!snaps[OrthoSnap] || snaps[PolarTrack] || !isDrawing))
+ {
+ SnapLine *snap;
+ foreach(snap,snapLineList)
+ {
+ snap->draw(&painter);
+ }
+ QPointF snapPoint;
+ foreach(snapPoint, snapLinePoints)
+ {
+ QGLE::drawBox(&painter, snapPoint, OSNAP_BOX_SIZE, osnapPen);
+ }
+ }
+
+ // If we have any objects, draw them. At this level, we have
+ // no information as to whether the object is a line, circle,
+ // arc or whatever: we just use the common functionality.
+ for(int i=0;i<objectList.size();i++)
+ {
+ if (!objectList[i]->isAmove())
+ objectList[i]->draw(&painter);
+
+ if (snaps[ObjectSnap] && ((currentTool != PointerTool) || isScaling || isMoving))
+ {
+ if ((snaps[OrthoSnap] || polarSnapFound) && (osnapIntersectPoints.size() > 0))
+ {
+ QPointF p;
+ foreach(p,osnapIntersectPoints)
+ {
+ QGLE::drawOSnap(&painter, p, QGLE::IntersectSnap);
+ }
+ }
+ else
+ {
+ if ((i != currentIndex) || !isDrawing)
+ {
+ if (objectList[i]->isSelected())
+ continue;
+ if (objectList[i]->distanceToPoint(cursorPosition, &nearestPoint) < MAX_OSNAP_DRAW_DISTANCE)
+ {
+ objectList[i]->drawOSnaps(&painter);
+ QGLE::drawBox(&painter, nearestPoint, OSNAP_BOX_SIZE, osnapPen);
+ }
+ else if (objectList[i]->isInside(cursorPosition))
+ objectList[i]->drawOSnaps(&painter);
+ }
+ }
+ }
+ else if (currentTool == PointerTool && objectList[i]->isSelected())
+ {
+ if (objectList[i]->distanceToPoint(cursorPosition, &nearestPoint) < MAX_OSNAP_DRAW_DISTANCE)
+ {
+ objectList[i]->drawOSnaps(&painter);
+ QGLE::drawBox(&painter, nearestPoint, OSNAP_BOX_SIZE, osnapPen);
+ } else if (objectList[i]->isInside(cursorPosition))
+ {
+ objectList[i]->drawOSnaps(&painter);
+ }
+ }
+ }
+
+ // Draw a cross to show where the final point is
+ if (hasAMove)
+ {
+ objectList[amoveIndex]->draw(&painter);
+ }
+
+ if (objectSelected)
+ {
+ if (selectionMode == SelectionMove)
+ drawSelectionHandles(&painter);
+ else if (selectionMode == SelectionScale)
+ drawScaleHandles(&painter);
+ else
+ drawRotationHandles(&painter);
+ }
+
+ if (objectSelected && selectionMode == SelectionScale && scaleOrigin.x() != -1.0)
+ {
+ QBrush blackBrush(Qt::red);
+ QGLE::fillBox(&painter, scaleOrigin, OSNAP_BOX_SIZE, blackBrush);
+ QGLE::drawBox(&painter, scaleOrigin, OSNAP_BOX_SIZE, cursorPen);
+ }
+
+ // FOR DEBUGGING
+ QPen extraPen;
+ extraPen.setColor(Qt::red);
+ extraPen.setWidth(2);
+ QPointF pt;
+ foreach(pt, extraPoints)
+ {
+ QGLE::drawCross(&painter, pt, AMOVE_LENGTH, extraPen);
+ }
+
+ }
+
+}
+
+// Are there any objects to draw?
+bool GLEDrawingArea::thereAreObjects()
+{
+ return(!objectList.isEmpty());
+}
+
+
+// Get rid of any objects that have been drawn
+void GLEDrawingArea::clearObjects()
+{
+ objectSelected = false;
+ hasAMove = false;
+ amoveIndex = -1;
+ GLEDrawingObject *obj;
+ foreach (obj, objectList)
+ {
+ delete obj;
+ }
+ objectList.clear();
+ updateSelection();
+}
+
+// Update the resolution and notify children
+void GLEDrawingArea::setDPI(double new_dpi)
+{
+ if (dpi != new_dpi)
+ {
+ dpi = new_dpi;
+ // Emit a signal to all daughters
+ emit dpiChanged(dpi);
+ }
+}
+
+// Update the grid spacing
+void GLEDrawingArea::setGrid(QPointF newGrid)
+{
+ if (gridSpacing != newGrid)
+ {
+ gridSpacing = newGrid;
+ grid->setGrid(gridSpacing);
+ if (gridVisible)
+ {
+ mainWin->refreshDisplay();
+ }
+ }
+}
+
+// This slot receives an image from the server thread
+// and updates the display accordingly.
+void GLEDrawingArea::updateDisplay(QImage image)
+{
+ if (!image.isNull()) pixmap = QPixmap::fromImage(image);
+ else pixmap = QPixmap();
+
+ grid->setDPI(dpi);
+ grid->setArea(pixmap.size());
+
+ if (!pixmap.isNull() && isEditMode && gridVisible)
+ {
+ // Draw grid on backing pixmap
+ // This is more efficient then redrawing it on each paint event
+ // Future: create separate backing pixmap for grid and objects
+ QPainter painter(&pixmap);
+ painter.setPen(grid->pen());
+ grid->drawGrid(&painter);
+ }
+
+ // Notify children if the height has changed:
+ // used for coordinate transforms
+ emit sizeChanged(pixmap.size(), dpi);
+
+ // Resize the drawing area to the size of the pixmap
+ resize(pixmap.width(),pixmap.height());
+
+ // Update the display
+ update();
+}
+
+// Toggle the visibility of the grid
+void GLEDrawingArea::gridToggle(bool state)
+{
+ gridVisible = state;
+ mainWin->refreshDisplay();
+}
+
+void GLEDrawingArea::osnapToggle(bool state)
+{
+ snaps[ObjectSnap] = state;
+ update();
+}
+
+void GLEDrawingArea::polarSnapToggle(bool state)
+{
+ snaps[PolarSnap] = state;
+ if (state == false)
+ snaps[PolarTrack] = false;
+ update();
+}
+
+void GLEDrawingArea::polarTrackToggle(bool state)
+{
+ snaps[PolarTrack] = state;
+ if (state == true)
+ snaps[PolarSnap] = true;
+ update();
+}
+
+void GLEDrawingArea::orthoSnapToggle(bool state)
+{
+ snaps[OrthoSnap] = state;
+ // Will probably have to edit the current line here too!
+ update();
+}
+
+double GLEDrawingArea::getDPI()
+{
+ return(dpi);
+}
+
+// Toggle grid snap
+void GLEDrawingArea::gridSnapToggle(bool state)
+{
+ snaps[GridSnap] = state;
+ update();
+}
+
+void GLEDrawingArea::createPolarSnaps(QPointF qtPoint)
+{
+ SnapLine *snap;
+ SnapLine *sn;
+ bool duplicate;
+ for(double i = polarStartAngle; i < 360.0 ; i += polarAngleIncrement)
+ {
+ snap = new SnapLine(dpi, pixmap.size(), this);
+ snap->setPoint(SnapLine::StartPoint, qtPoint);
+ snap->setPoint(SnapLine::Angle, QPointF(QGLE::degreesToRadians(i),0.0));
+
+ duplicate = false;
+ foreach(sn, snapLineList)
+ {
+ if (snap->isEqual(sn))
+ {
+ duplicate = true;
+ break;
+ }
+ }
+
+ if (!duplicate)
+ snapLineList.append(snap);
+ }
+}
+
+void GLEDrawingArea::clearPolarSnaps()
+{
+ SnapLine *snap;
+ foreach(snap, snapLineList)
+ {
+ delete snap;
+ }
+ snapLineList.clear();
+ snapLinePoints.clear();
+ polarSnapFound = false;
+}
+
+// Event called when a mouse button is pressed;
+void GLEDrawingArea::mousePressEvent(QMouseEvent *event)
+{
+ // Move more of the functionality into the command
+ // processor, for example setDirty() etc
+ if (currentTool == NoTool)
+ return;
+
+ QPointF qtPoint;
+ if (event->button() == Qt::LeftButton)
+ {
+ clearPolarSnaps();
+ switch (currentTool)
+ {
+ case LineTool:
+ // Click to start; click to end.
+ // The end point is continuously updated
+ // in the mouseMoveEvent function
+ if (isDrawing == true)
+ {
+ // Drawing finished
+ isDrawing = false;
+ clearRelativeOsnaps();
+ processCommand(QGLE::EndNewLine);
+ changeLastPoint(QPointF(0.0,0.0));
+ emit updateStatusBar(statusMessages[LineTool][StartPoint]);
+
+ setDirtyAndSave();
+ }
+ else
+ {
+ // Register the start point
+ qtPoint = snappedPoint(event->pos(), true);
+
+ processCommand(QGLE::StartNewLineWithPoint, qtPoint);
+ // Create snap lines from this point
+ if(snaps[PolarSnap])
+ createPolarSnaps(qtPoint);
+
+ changeLastPoint(QGLE::absQtToGLE(qtPoint, dpi, pixmap.height()));
+ emit updateStatusBar(statusMessages[LineTool][EndPoint]);
+
+ }
+
+ break;
+
+ case TextTool:
+ // Register the start point
+ qtPoint = snappedPoint(event->pos(), true);
+ processCommand(QGLE::CreateTextObject, qtPoint);
+ setDirtyAndSave();
+ // Not sure how necessary these two lines are...
+ clearRelativeOsnaps();
+ changeLastPoint(QPointF(0.0,0.0));
+ break;
+
+ case TanLineTool:
+ // Click to start; click to end.
+ // The end point is continuously updated
+ // in the mouseMoveEvent function, AS IS THE START POINT
+ if (isDrawing == true)
+ {
+ // Drawing finished
+ isDrawing = false;
+ clearRelativeOsnaps();
+ processCommand(QGLE::EndNewTanLine);
+ changeLastPoint(QPointF(0.0,0.0));
+ emit updateStatusBar(statusMessages[TanLineTool][StartPoint]);
+
+ setDirtyAndSave();
+ }
+ else
+ {
+ // Register the start point
+ qtPoint = snappedPoint(event->pos(), true);
+
+ processCommand(QGLE::StartNewTanLineWithPoint, qtPoint);
+ // NO SNAP lines from start point?
+ // Create snap lines from this point
+ //if(snaps[PolarSnap])
+ // createPolarSnaps(qtPoint);
+
+
+ }
+
+ break;
+
+ case PerpLineTool:
+ // Click to start; click to end.
+ // The end point is continuously updated
+ // in the mouseMoveEvent function, AS IS THE START POINT
+ if (isDrawing == true)
+ {
+ // Drawing finished
+ isDrawing = false;
+ clearRelativeOsnaps();
+ processCommand(QGLE::EndNewPerpLine);
+ changeLastPoint(QPointF(0.0,0.0));
+ emit updateStatusBar(statusMessages[TanLineTool][StartPoint]);
+
+ setDirtyAndSave();
+ }
+ else
+ {
+ // Register the start point
+ qtPoint = snappedPoint(event->pos(), true);
+
+ processCommand(QGLE::StartNewPerpLineWithPoint, qtPoint);
+ // NO SNAP lines from start point?
+ // Create snap lines from this point
+ //if(snaps[PolarSnap])
+ // createPolarSnaps(qtPoint);
+
+
+ }
+
+ break;
+
+ case ArcTool:
+ // Click for start, click for end, click for mid point
+ if (isDrawing == true)
+ {
+ if (objectList[currentIndex]->isSet(GLEArc::CentrePoint))
+ {
+ // Then we're finished, so stop drawing
+ isDrawing = false;
+ processCommand(QGLE::EndNewArc);
+ clearRelativeOsnaps();
+ changeLastPoint(QPointF(0,0));
+ emit updateStatusBar(statusMessages[ArcTool][StartPoint]);
+ setDirtyAndSave();
+ }
+ else
+ {
+ qtPoint = snappedPoint(event->pos());
+
+ processCommand(QGLE::SetArcMidPoint, qtPoint);
+
+ if(snaps[PolarSnap])
+ createPolarSnaps(qtPoint);
+
+ changeLastPoint(QGLE::absQtToGLE(qtPoint, dpi, pixmap.height()));
+ emit updateStatusBar(statusMessages[ArcTool][MidPoint]);
+ // Create snap lines from this point
+ }
+
+ }
+ else
+ {
+ // Register the start point
+ qtPoint = snappedPoint(event->pos(), true);
+ processCommand(QGLE::StartNewArcWithPoint, qtPoint);
+ // Create snap lines from this point
+ if (snaps[PolarSnap])
+ createPolarSnaps(qtPoint);
+
+ changeLastPoint(QGLE::absQtToGLE(qtPoint, dpi, pixmap.height()));
+ emit updateStatusBar(statusMessages[ArcTool][EndPoint]);
+
+ }
+
+ break;
+
+
+ case CircleTool:
+ // Click for centre, click for point on circumference
+ if (isDrawing == true)
+ {
+ // Drawing finished
+ isDrawing = false;
+ clearRelativeOsnaps();
+ processCommand(QGLE::EndNewCircle);
+ changeLastPoint(QPointF(0,0));
+ emit updateStatusBar(statusMessages[CircleTool][StartPoint]);
+ setDirtyAndSave();
+ }
+ else
+ {
+ // Register the start point
+ qtPoint = snappedPoint(event->pos(), true);
+ processCommand(QGLE::StartNewCircleWithCentre, qtPoint);
+ // Create snap lines from this point
+ if (snaps[PolarSnap])
+ createPolarSnaps(qtPoint);
+
+ changeLastPoint(QGLE::absQtToGLE(qtPoint, dpi, pixmap.height()));
+ emit updateStatusBar(statusMessages[CircleTool][CircumferencePoint]);
+
+ }
+
+ break;
+
+ case EllipseTool:
+ // Click for corner 1, click for corner 2
+ if (isDrawing == true)
+ {
+ // Drawing finished
+ isDrawing = false;
+ clearRelativeOsnaps();
+ processCommand(QGLE::EndNewEllipse);
+ changeLastPoint(QPointF(0,0));
+ emit updateStatusBar(statusMessages[EllipseTool][StartPoint]);
+ setDirtyAndSave();
+ }
+ else
+ {
+ // Register the start point
+ qtPoint = snappedPoint(event->pos(), true);
+ processCommand(QGLE::StartNewEllipseWithCorner, qtPoint);
+ // Create snap lines from this point
+ if (snaps[PolarSnap])
+ createPolarSnaps(qtPoint);
+
+ changeLastPoint(QGLE::absQtToGLE(qtPoint, dpi, pixmap.height()));
+ emit updateStatusBar(statusMessages[EllipseTool][EndPoint]);
+
+ }
+
+ break;
+
+
+ case AMoveTool:
+ // Add an 'amove' at the end of the file
+ snappedPosition = snappedPoint(event->pos(), true);
+
+ processCommand(QGLE::SetAMove, snappedPosition);
+
+ setDirtyAndSave();
+ emit updateStatusBar(statusMessages[AMoveTool][StartPoint]);
+
+ break;
+
+ case PointerTool:
+ clearRelativeOsnaps();
+ QPointF* dontFind = NULL;
+ if (scaleOrigin.x() != -1.0) dontFind = &scaleOrigin;
+ snappedPosition = snappedPointFromObject(event->pos(), dontFind);
+ // Note: This is the only call to selectObjects
+ selectObjects(snappedPosition, modifier[ShiftKey]);
+
+ if (isMoving || isScaling || isRotating)
+ {
+ if(snaps[PolarSnap])
+ createPolarSnaps(snappedPosition);
+ changeLastPoint(QGLE::absQtToGLE(snappedPosition, dpi, pixmap.height()));
+ }
+
+ // Redraw the screen
+ }
+ }
+
+#ifndef QT_NO_DEBUG
+ else if (event->button() == Qt::RightButton)
+ {
+ if (objectSelected)
+ {
+ GLEDrawingObject *obj;
+ bool first = true;
+ QSet<int> propertySet;
+ foreach(obj, objectList)
+ {
+ if (obj->isSelected())
+ {
+ if (first)
+ {
+ propertySet = obj->getValidProperties();
+ }
+ else
+ {
+ first = false;
+ propertySet.intersect(obj->getValidProperties());
+ }
+ }
+ }
+
+ // We now have a list of the properties that are common to each object
+ if (propertySet.contains(GLEDrawingObject::FillColour))
+ {
+ QList<QColor> colourList;
+ colourList
+ << QColor()
+ << QColor(Qt::red)
+ << QColor(Qt::blue)
+ << QColor(Qt::green)
+ << QColor(Qt::yellow);
+
+ QColor objectColour;
+ foreach(obj, objectList)
+ {
+ if (obj->isSelected())
+ {
+ // Get the current colour
+ objectColour = obj->getProperty(GLEDrawingObject::FillColour).value<QColor>();
+ if (colourList.contains(objectColour))
+ {
+ obj->setProperty(GLEDrawingObject::FillColour,
+ colourList[(colourList.indexOf(objectColour) + 1) %
+ colourList.size()]);
+ }
+ else
+ {
+ obj->setProperty(GLEDrawingObject::FillColour,
+ colourList[0]);
+ }
+ }
+ }
+ }
+ }
+ }
+#endif // QT_NO_DEBUG not defined
+ update();
+}
+
+//! Set the reference point of, e.g., text objects or GLE object blocks (tl,bl,tc,bc,tr,br,...)
+void GLEDrawingArea::setReferencePoint(const QPointF& pt)
+{
+ // qDebug() << "Setting reference point: " << pt;
+ bool modified = false;
+ GLEDrawingObject* obj;
+ foreach(obj, objectList)
+ {
+ if (obj->isSelected())
+ {
+ modified |= obj->setReferencePoint(pt);
+ }
+ }
+ if (modified) updateSelection();
+}
+
+//! Get maximum supported transform mode
+int GLEDrawingArea::minimumSupportedTransformMode()
+{
+ GLEDrawingObject* obj;
+ int minimum = GLEDrawingObject::TransformModeFree;
+ foreach(obj, objectList)
+ {
+ if (obj->isSelected()) {
+ int mode = obj->supportedTransformMode();
+ if (mode < minimum) minimum = mode;
+ }
+ }
+ return minimum;
+}
+
+//! Inform objects that we are done with the transformation (they can re-render themselves now)
+void GLEDrawingArea::linearTransformDone()
+{
+ GLEDrawingObject* obj;
+ foreach(obj,objectList)
+ {
+ if (obj->isSelected()) {
+ obj->linearTransformDone();
+ }
+ }
+}
+
+void GLEDrawingArea::performScale(const QPointF& snappedPosition)
+{
+ int minMode = minimumSupportedTransformMode();
+ if (minMode == GLEDrawingObject::TransformModeNone)
+ return;
+
+ /*
+ qDebug() << "-- Perform scale: " << snappedPosition;
+ qDebug() << " Origin: " << scaleOrigin;
+ qDebug() << " Base: " << basePoint;
+ qDebug() << " Handle: " << grabbedHandle;
+ */
+
+ if (fabs(scaleOrigin.x()-basePoint.x()) < 1e-6 && fabs(scaleOrigin.y()-basePoint.y()) < 1e-6) {
+ // Illegal scale: scaleOrigin and basePoint equal
+ scaleOrigin = QPointF(-1.0, 0);
+ return;
+ }
+
+ // Should do scale along one dimension?
+ bool onlyX = (grabbedHandle == MiddleLeft || grabbedHandle == MiddleRight);
+ bool onlyY = (grabbedHandle == TopMiddle || grabbedHandle == BottomMiddle);
+ if (fabs(scaleOrigin.x()-basePoint.x()) < 1e-6)
+ {
+ // Can't scale in x-dimension: scaleOrigin and basePoint equal
+ onlyX = false; onlyY = true;
+ }
+ else if (fabs(scaleOrigin.y()-basePoint.y()) < 1e-6)
+ {
+ // Can't scale in t-dimension: scaleOrigin and basePoint equal
+ onlyX = true; onlyY = false;
+ }
+
+ GLELinearEquation transX, transY;
+ if (minMode == GLEDrawingObject::TransformModeConstrained || modifier[CtrlKey])
+ {
+ // Scale factor in x- and y-dimension should be equal
+ if (onlyX)
+ {
+ // only scale in x-direction possible
+ transX.fit(scaleOrigin.x(), scaleOrigin.x(), basePoint.x(), snappedPosition.x());
+ transY.setA(transX.getA());
+ transY.fitB(scaleOrigin.y(), scaleOrigin.y());
+ }
+ else if (onlyY)
+ {
+ // only scale in y-direction possible
+ transY.fit(scaleOrigin.y(), scaleOrigin.y(), basePoint.y(), snappedPosition.y());
+ transX.setA(transY.getA());
+ transX.fitB(scaleOrigin.x(), scaleOrigin.x());
+ }
+ else
+ {
+ double det = (scaleOrigin.x()-basePoint.x())*(scaleOrigin.x()-basePoint.x()) +
+ (scaleOrigin.y()-basePoint.y())*(scaleOrigin.y()-basePoint.y());
+ if (det != 0.0) {
+ double a = ((snappedPosition.x()-scaleOrigin.x())*(basePoint.x()-scaleOrigin.x()) +
+ (snappedPosition.y()-scaleOrigin.y())*(basePoint.y()-scaleOrigin.y())) / det;
+ transX.setA(a);
+ transY.setA(a);
+ transX.fitB(scaleOrigin.x(), scaleOrigin.x());
+ transY.fitB(scaleOrigin.y(), scaleOrigin.y());
+ }
+ }
+ }
+ else
+ {
+ // Scale factor in x- and y-dimension can be different (and is determined independently)
+ if (onlyX)
+ {
+ transX.fit(scaleOrigin.x(), scaleOrigin.x(), basePoint.x(), snappedPosition.x());
+ }
+ else if (onlyY)
+ {
+ transY.fit(scaleOrigin.y(), scaleOrigin.y(), basePoint.y(), snappedPosition.y());
+ }
+ else
+ {
+ transX.fit(scaleOrigin.x(), scaleOrigin.x(), basePoint.x(), snappedPosition.x());
+ transY.fit(scaleOrigin.y(), scaleOrigin.y(), basePoint.y(), snappedPosition.y());
+ }
+ }
+
+ // Division close to zero
+ if (fabs(transX.getA()) > 1e10) return;
+ if (fabs(transY.getA()) > 1e10) return;
+
+ GLEDrawingObject *obj;
+ objectMoved = true;
+ foreach(obj,objectList)
+ {
+ if (obj->isSelected()) {
+ obj->linearTransform(transX, transY);
+ setDirtyAndSave();
+ }
+ }
+ createSelectionHandles();
+}
+
+// Event called when the mouse moves over the drawing area
+void GLEDrawingArea::mouseMoveEvent(QMouseEvent *event)
+{
+ // Get the mouse position in GLE coordinates
+ QPointF glePosition;
+
+ cursorPosition = event->pos();
+
+// if (isDrawing || isScaling || isMoving)
+ updateSnapLines(cursorPosition);
+
+/*(event->buttons() & Qt::LeftButton) == 0*/
+
+ if (currentTool == PointerTool && objectSelected && (event->buttons() & Qt::LeftButton) == 0) {
+ // snap to point of selected objects -> used to easily select basePoint
+ isSelectedObjectSnap = true;
+ QPointF* dontFind = NULL;
+ if (scaleOrigin.x() != -1.0) dontFind = &scaleOrigin;
+ snappedPosition = snappedPointFromObject(cursorPosition, dontFind);
+ } else {
+ isSelectedObjectSnap = false;
+ snappedPosition = snappedPoint(cursorPosition);
+ }
+
+ glePosition = QGLE::absQtToGLE(snappedPosition, dpi, pixmap.height());
+
+ // Notify the world (currently just used to update the status bar)
+ emit mouseMoved(glePosition);
+
+ if (currentTool == NoTool)
+ {
+ return;
+ }
+
+ if(isDrawing)
+ {
+ switch (currentTool)
+ {
+ case LineTool:
+ // If we're drawing, set the end point of the line to the
+ // current mouse position so that the line is drawn in the
+ // paintEvent.
+ processCommand(QGLE::SetLineEndPoint, snappedPosition);
+ update();
+ break;
+
+ case TanLineTool:
+ // If we're drawing, set the end point of the line to the
+ // current mouse position so that the line is drawn in the
+ // paintEvent.
+ processCommand(QGLE::SetTanLineEndPoint, snappedPosition);
+ update();
+ break;
+
+ case PerpLineTool:
+ // If we're drawing, set the end point of the line to the
+ // current mouse position so that the line is drawn in the
+ // paintEvent.
+ processCommand(QGLE::SetPerpLineEndPoint, snappedPosition);
+ update();
+ break;
+
+ case CircleTool:
+ // Set a point on the circumference of the circle
+ processCommand(QGLE::SetCircleEdgePoint, snappedPosition);
+ update();
+ break;
+
+ case EllipseTool:
+ // Set a point on the circumference of the circle
+ processCommand(QGLE::SetEllipseSecondCorner, snappedPosition);
+ update();
+ break;
+
+ case ArcTool:
+ // Either set the end point of the line or the midpoint
+ if (objectList[currentIndex]->isSet(GLEArc::MidPoint))
+ processCommand(QGLE::SetArcMidPoint, snappedPosition);
+ else
+ processCommand(QGLE::SetArcEndPoint, snappedPosition);
+ update();
+ break;
+
+ }
+
+ }
+ else if (isScaling)
+ {
+ switch(currentTool)
+ {
+ case PointerTool:
+ performScale(snappedPosition);
+ update();
+ break;
+ }
+ }
+ else if (isMoving)
+ {
+ GLEDrawingObject *obj;
+ objectMoved = true;
+ foreach(obj, objectList)
+ {
+ if (obj->isSelected()) {
+ obj->moveBy(snappedPosition - basePoint);
+ setDirtyAndSave();
+ }
+ }
+ createSelectionHandles();
+ update();
+ }
+ else if (isRotating)
+ {
+ // TODO: rotate each selected object and rotate the handles
+ double newAngle = QGLE::angleBetweenTwoPoints(basePoint, cursorPosition);
+ double angleChange = newAngle - baseAngle;
+
+ // Now rotate all objects by angle 'angleChange'
+ GLEDrawingObject *obj;
+ foreach(obj, objectList)
+ {
+ if (obj->isSelected()) {
+ obj->rotateBy(-angleChange);
+ setDirtyAndSave();
+ }
+ }
+
+ angleChange = -(newAngle - lastAngle);
+
+ // Update the handles
+ handleList[TopLeft] = QGLE::rotateAboutPoint(handleList[TopLeft],
+ angleChange,
+ basePoint);
+ handleList[BottomLeft] = QGLE::rotateAboutPoint(handleList[BottomLeft],
+ angleChange,
+ basePoint);
+ handleList[BottomRight] = QGLE::rotateAboutPoint(handleList[BottomRight],
+ angleChange,
+ basePoint);
+ handleList[TopRight] = QGLE::rotateAboutPoint(handleList[TopRight],
+ angleChange,
+ basePoint);
+
+ lastAngle = newAngle;
+ update();
+ }
+ else
+ {
+ if ((snaps[GridSnap] || snaps[ObjectSnap] || isSelectedObjectSnap) && ((currentTool != PointerTool) || objectSelected))
+ update();
+
+ if (currentTool == PointerTool && selectionMode == SelectionScale)
+ emit updateStatusBar("Drag to scale object (ctrl locks aspect ratio) or click to select scale origin (red box)");
+ else if (currentTool == PointerTool && selectionMode == SelectionMove && objectSelected)
+ {
+ int minMode = minimumSupportedTransformMode();
+ if (minMode != GLEDrawingObject::TransformModeNone)
+ emit updateStatusBar("Drag snap point from object to move; shift+click to multi-select; click to scale");
+ else
+ emit updateStatusBar("Drag snap point from object to move; shift+click to multi-select");
+ }
+ else
+ emit updateStatusBar(statusMessages[currentTool][StartPoint]);
+ }
+}
+
+// Event called when the mouse button is released.
+void GLEDrawingArea::mouseReleaseEvent(QMouseEvent *)
+{
+ QStringList code;
+ switch (currentTool)
+ {
+ case CircleTool:
+ case EllipseTool:
+ case ArcTool:
+ case LineTool:
+ case TextTool:
+ case TanLineTool:
+ case PerpLineTool:
+ break;
+
+ case PointerTool:
+ if (selectionMode == SelectionScale)
+ {
+ if (objectMoved)
+ {
+ linearTransformDone();
+ }
+ else
+ {
+ // Select a different scale origin (marked with a red filled square)
+ scaleOrigin = basePoint;
+ }
+ }
+
+ if (selectionMode == SelectionMove && objectSelected) {
+ int minMode = minimumSupportedTransformMode();
+ if (minMode != GLEDrawingObject::TransformModeNone)
+ emit updateStatusBar("Drag snap point from object to move; shift+click to multi-select; click to scale");
+ else
+ emit updateStatusBar("Drag snap point from object to move; shift+click to multi-select");
+ }
+
+ if (isMoving && !objectMoved)
+ {
+ int minMode = minimumSupportedTransformMode();
+
+ // We haven't moved the object, so switch mode
+ if (selectionMode == SelectionMove && minMode != GLEDrawingObject::TransformModeNone)
+ {
+ selectionMode = SelectionScale;
+ emit updateStatusBar("Drag to scale object (ctrl locks aspect ratio) or click to select scale origin (red box)");
+ }
+ // NOTE: Currently disabled because generating GLE script code
+ // from rotated objects is not yet implemented
+ //else if (selectionMode == SelectionScale)
+ // selectionMode = SelectionRotate;
+ else
+ selectionMode = SelectionMove;
+ }
+
+ if (isMoving && objectMoved)
+ {
+ setReferencePoint(snappedPosition);
+ }
+
+ isScaling = false;
+ isMoving = false;
+ isRotating = false;
+ objectMoved = false;
+ clearRelativeOsnaps();
+ clearPolarSnaps();
+ changeLastPoint(QPointF(0.0,0.0));
+ if (objectSelected)
+ {
+ createSelectionHandles();
+ if (selectionMode == SelectionScale)
+ {
+ // Make sure that object properties are updated
+ updateSelection();
+ }
+ }
+ update();
+ break;
+ }
+}
+
+void GLEDrawingArea::unselectObjects()
+{
+ if (objectSelected == true)
+ {
+ GLEDrawingObject *obj;
+ foreach(obj, objectList)
+ {
+ if (obj->isSelected())
+ obj->setSelected(false);
+ }
+ }
+ objectSelected = false;
+ initSelectionVars();
+ updateSelection();
+}
+
+void GLEDrawingArea::changeLastPoint(QPointF p)
+{
+ lastPoint = QGLE::absGLEToQt(p,dpi,pixmap.height());
+ emit basePointChanged(p);
+
+ if (isDrawing || isMoving)
+ {
+ for(int i=0;i<objectList.size();i++)
+ {
+ if (i != currentIndex && !objectList[i]->isSelected())
+ objectList[i]->addRelativeOSnaps(lastPoint);
+ }
+ }
+ else
+ {
+ clearRelativeOsnaps();
+ }
+}
+
+
+// Clear the New Objects flag
+void GLEDrawingArea::clearNewObjectsFlag()
+{
+ newObjects = false;
+}
+
+void GLEDrawingArea::setNewObjectsFlag()
+{
+ newObjects = true;
+}
+
+// Identify whether there are new objects
+bool GLEDrawingArea::thereAreNewObjects()
+{
+ return(newObjects);
+}
+
+void GLEDrawingArea::updateSnapLines(QPointF qtPoint)
+{
+ QPointF nearestPoint;
+ snapLinePoints.clear();
+ for(int i=snapLineList.size()-1;i>=0;i--)
+ {
+ // Are we too far away to keep it?
+ if (snapLineList[i]->distanceToPoint(qtPoint, &nearestPoint) > MAX_SNAP_LINE_DISTANCE)
+ {
+ if (QGLE::distance(qtPoint,
+ snapLineList[i]->getQtPoint(SnapLine::StartPoint)) > 3*MAX_SNAP_LINE_DISTANCE)
+ snapLineList[i]->deactivate();
+ else
+ {
+ delete snapLineList[i];
+ snapLineList.removeAt(i);
+ }
+ }
+ else
+ {
+ snapLineList[i]->activate();
+ snapLinePoints.append(nearestPoint);
+
+ }
+ }
+
+}
+
+// Change the tool
+void GLEDrawingArea::setTool(int newTool)
+{
+ currentTool = newTool;
+
+ // If we're not using a pointer tool, nothing should be selected
+ if (currentTool != PointerTool)
+ {
+ unselectObjects();
+ }
+
+ // Start with a clean slate
+ initVars();
+
+ update();
+ emit updateStatusBar(statusMessages[currentTool][StartPoint]);
+}
+
+// Are we in edit mode?
+void GLEDrawingArea::setEditMode(bool state)
+{
+ isEditMode = state;
+}
+
+// Handle key presses
+void GLEDrawingArea::hitKey(int key, int modifiers)
+{
+ if (modifiers != Qt::NoModifier)
+ return;
+
+ switch(key)
+ {
+ // If we get an escape key, stop drawing
+ case Qt::Key_Escape:
+ if (objectSelected)
+ {
+ if (selectionMode == SelectionScale)
+ {
+ selectionMode = SelectionMove;
+ emit updateStatusBar(statusMessages[PointerTool][StartPoint]);
+ isScaling = false;
+ isMoving = false;
+ isRotating = false;
+ objectMoved = false;
+ clearRelativeOsnaps();
+ clearPolarSnaps();
+ changeLastPoint(QPointF(0.0,0.0));
+ createSelectionHandles();
+ }
+ else {
+ unselectObjects();
+ }
+ update();
+ }
+ else if (isDrawing == true)
+ {
+ isDrawing = false;
+ processCommand(QGLE::Cancel);
+ clearPolarSnaps();
+ changeLastPoint(QPointF(0.0,0.0));
+ update();
+ }
+ else
+ {
+ clearPolarSnaps();
+ mainWin->selectPointerTool();
+ update();
+ }
+ break;
+
+ // If we get a delete key and something is selected,
+ // delete it.
+ case Qt::Key_Delete:
+ processCommand(QGLE::DeleteSelected);
+ update();
+ break;
+
+ }
+}
+
+QPointF GLEDrawingArea::snappedPoint(QPointF p, bool ignoreOrtho)
+{
+ // This function is intended to find the appropriate snapping
+ // point (if there is one).
+
+ QPointF orthoPoint;
+ bool horiz; // Horizontal ortho?
+ polarSnapFound = false;
+
+ osnapIntersectPoints.clear();
+ if (snaps[GridSnap])
+ snappedPosition = grid->nearestPoint(p);
+ else
+ snappedPosition = p;
+
+ bool orthoSnap;
+ if (ignoreOrtho)
+ orthoSnap = false;
+ else
+ orthoSnap = snaps[OrthoSnap];
+
+ // Find the point where the orthoSnap meets the grid
+ // ORTHO SNAP overrides everything else!
+ if (orthoSnap && (isDrawing || isMoving || isScaling))
+ {
+ double upDist = QGLE::distance(p,lastPoint)*sin(QGLE::angleBetweenTwoPoints(p,lastPoint));
+ double acrossDist = QGLE::distance(p,lastPoint)*cos(QGLE::angleBetweenTwoPoints(p,lastPoint));
+ if (fabs(upDist) > fabs(acrossDist))
+ {
+ horiz = false;
+ orthoPoint = lastPoint - QPointF(0.0,upDist);
+ }
+ else
+ {
+ horiz = true;
+ orthoPoint = lastPoint - QPointF(acrossDist,0.0);
+ }
+
+ if (snaps[GridSnap])
+ {
+ if (horiz)
+ orthoPoint.setX(snappedPosition.x());
+ else
+ orthoPoint.setY(snappedPosition.y());
+ }
+ else if (snaps[ObjectSnap])
+ {
+ // Where does the ortho line cross any objects - save regardless
+ // of whether we're close enough
+
+ if (thereAreObjects())
+ {
+ for(int i=0;i<objectList.size();i++)
+ {
+ if (objectList[i]->isSelected())
+ continue;
+
+ if ((i != currentIndex) || (!isDrawing))
+ {
+ if (horiz)
+ {
+ if (p.x() > lastPoint.x())
+ osnapIntersectPoints += objectList[i]->intersections(lastPoint,
+ QGLE::degreesToRadians(0.0));
+ else
+ osnapIntersectPoints += objectList[i]->intersections(lastPoint,
+ QGLE::degreesToRadians(180.0));
+ }
+ else
+ {
+ if (p.y() > lastPoint.y())
+ osnapIntersectPoints += objectList[i]->intersections(lastPoint,
+ QGLE::degreesToRadians(90.0));
+ else
+ osnapIntersectPoints += objectList[i]->intersections(lastPoint,
+ QGLE::degreesToRadians(270.0));
+ }
+ }
+ }
+
+ QPointF osnapPoint;
+ QPointF closestPoint;
+ double dist;
+ double shortest_distance = 1e6;
+ foreach(osnapPoint, osnapIntersectPoints)
+ {
+ dist = QGLE::distance(osnapPoint, orthoPoint);
+ if (dist < shortest_distance)
+ {
+ shortest_distance = dist;
+ closestPoint = osnapPoint;
+ }
+ }
+ if (shortest_distance < MAX_OSNAP_DISTANCE)
+ {
+ if (snaps[PolarTrack] &&
+ (currentTool != NoTool) &&
+ ((currentTool != PointerTool) || isScaling || isMoving) &&
+ (currentTool != TanLineTool) &&
+ (currentTool != PerpLineTool))
+ createPolarSnaps(closestPoint);
+ return(closestPoint);
+ }
+ }
+
+ }
+
+ return(orthoPoint);
+ }
+ else
+ {
+ // Either orthosnap is off or we're not yet drawing, grid comes first!
+ if (snaps[GridSnap])
+ return(snappedPosition);
+
+ // Now we'll try polar snap
+ if (snaps[PolarSnap])
+ {
+ SnapLine *snap;
+ if (snaps[ObjectSnap])
+ {
+ if (thereAreObjects())
+ {
+ int i;
+ for(i=0;i<objectList.size();i++)
+ {
+ if (objectList[i]->isSelected())
+ continue;
+
+ if ((i != currentIndex) || (!isDrawing))
+ {
+ foreach(snap,snapLineList)
+ {
+ if (snap->isActive())
+ {
+ osnapIntersectPoints += objectList[i]->intersections(
+ snap->getQtPoint(SnapLine::StartPoint),
+ snap->getQtAngle(SnapLine::Angle));
+ }
+ }
+ }
+ }
+
+ // Look for intersections between multiple snap lines:
+ for(i=0;i<snapLineList.size()-1;i++)
+ {
+ for(int j=i+1;j<snapLineList.size();j++)
+ {
+ if (snapLineList[i]->isActive() || snapLineList[j]->isActive())
+ {
+ osnapIntersectPoints += snapLineList[i]->intersections(
+ snapLineList[j]->getQtPoint(SnapLine::StartPoint),
+ snapLineList[j]->getQtAngle(SnapLine::Angle));
+ }
+ }
+ }
+
+ QPointF osnapPoint;
+ QPointF closestPoint;
+ double dist;
+ double shortest_distance = 1e6;
+ foreach(osnapPoint, osnapIntersectPoints)
+ {
+ dist = QGLE::distance(osnapPoint, p);
+ if (dist < shortest_distance)
+ {
+ shortest_distance = dist;
+ closestPoint = osnapPoint;
+ }
+ }
+ if (shortest_distance < MAX_OSNAP_DISTANCE)
+ {
+ polarSnapFound = true;
+// if (isDrawing)
+// createPolarSnaps(closestPoint);
+ return(closestPoint);
+ }
+ }
+ }
+ // One can now assume that we're not close to the osnapIntersectPoints
+ // Therefore, see how close we are to the snapLines
+ double dist;
+ double shortest_distance = 1e6;
+ QPointF closestPoint;
+ QPointF pt;
+ foreach(snap, snapLineList)
+ {
+ dist = snap->distanceToPoint(p,&pt);
+ if (dist < shortest_distance)
+ {
+ shortest_distance = dist;
+ closestPoint = pt;
+ }
+ }
+ if (shortest_distance < MAX_OSNAP_DISTANCE)
+ {
+ polarSnapFound = true;
+ return(closestPoint);
+ }
+
+ }
+
+ if (snaps[ObjectSnap])
+ {
+ // If the grid snap is off, we move onto OSNAP. This is where it gets interesting!
+ // Let the paintEvent cope with drawing the handles, just work out which
+ // is closest
+ double dist;
+ double shortest_distance = 1e6;
+ QPointF closestPoint;
+ QPointF point;
+ if (thereAreObjects())
+ {
+ for(int i=0;i<objectList.size();i++)
+ {
+ if (objectList[i]->isSelected())
+ continue;
+
+ if ((i != currentIndex) || (!isDrawing))
+ {
+ dist = objectList[i]->nearestOSnap(p,&point);
+ if (dist < shortest_distance)
+ {
+ shortest_distance = dist;
+ closestPoint = point;
+ }
+ }
+ }
+
+ if (shortest_distance < MAX_OSNAP_DISTANCE)
+ {
+ if (snaps[PolarTrack] &&
+ (currentTool != NoTool) &&
+ ((currentTool != PointerTool) || isScaling || isMoving) &&
+ (currentTool != TanLineTool) &&
+ (currentTool != PerpLineTool))
+ createPolarSnaps(closestPoint);
+ return(closestPoint);
+ }
+
+ // If the standard handle tests fail, try the nearest point on the object
+ for(int i=0;i<objectList.size();i++)
+ {
+ if (objectList[i]->isSelected())
+ continue;
+
+ if ((i != currentIndex) || (!isDrawing))
+ {
+ dist = objectList[i]->distanceToPoint(p,&point);
+ if (dist < shortest_distance)
+ {
+ shortest_distance = dist;
+ closestPoint = point;
+ }
+ }
+ }
+
+ if (shortest_distance < MAX_OSNAP_DISTANCE)
+ return(closestPoint);
+
+ }
+ }
+
+
+ }
+
+ // If nothing else has come up with a better option, return the point unchanged
+ return(p);
+}
+
+bool GLEDrawingArea::checkDontFind(const QPointF& p, QPointF* dontFind)
+{
+ if (dontFind == NULL) return true;
+ else return p != *dontFind;
+}
+
+QPointF GLEDrawingArea::snappedPointFromObject(QPointF p, QPointF* dontFind)
+{
+ double dist;
+ double shortest_distance = 1e6;
+ QPointF closestPoint;
+ QPointF point;
+ if (objectSelected)
+ {
+ for(int i = 0;i < objectList.size(); i++)
+ {
+ if (objectList[i]->isSelected())
+ {
+ dist = objectList[i]->nearestOSnap(p,&point);
+ if (dist < shortest_distance && checkDontFind(point, dontFind))
+ {
+ shortest_distance = dist;
+ closestPoint = point;
+ }
+ }
+ }
+
+ if (shortest_distance < MAX_OSNAP_DISTANCE) return closestPoint;
+
+ for(int i = 0; i < handleList.size(); i++)
+ {
+ dist = QGLE::distance(p, handleList[i]);
+ if (dist < shortest_distance && checkDontFind(handleList[i], dontFind))
+ {
+ shortest_distance = dist;
+ closestPoint = handleList[i];
+ }
+ }
+
+ if (shortest_distance < MAX_OSNAP_DISTANCE) return closestPoint;
+
+ // If the standard handle tests fail, try the nearest point on the object
+ for(int i = 0; i < objectList.size(); i++)
+ {
+ if (objectList[i]->isSelected())
+ {
+ dist = objectList[i]->distanceToPoint(p,&point);
+ if (dist < shortest_distance && checkDontFind(point, dontFind))
+ {
+ shortest_distance = dist;
+ closestPoint = point;
+ }
+ }
+ }
+
+ if (shortest_distance < MAX_OSNAP_DISTANCE) return closestPoint;
+ }
+ return p;
+}
+
+void GLEDrawingArea::processCommand(int command, QPointF pt)
+{
+ // pt is in Qt coordinates and is unsnapped
+ switch(command)
+ {
+ case QGLE::StartNewLineWithPoint:
+ createNewLine(pt);
+ break;
+
+ case QGLE::SetLineEndPoint:
+ setLineEndPoint(pt);
+ break;
+
+ case QGLE::EndNewLine:
+ completeNewLine();
+ break;
+
+ case QGLE::StartNewTanLineWithPoint:
+ createNewTanLine(pt);
+ break;
+
+ case QGLE::EndNewTanLine:
+ completeNewTanLine();
+ break;
+
+ case QGLE::SetTanLineEndPoint:
+ setTanLineEndPoint(pt);
+ break;
+
+ case QGLE::StartNewPerpLineWithPoint:
+ createNewPerpLine(pt);
+ break;
+
+ case QGLE::EndNewPerpLine:
+ completeNewPerpLine();
+ break;
+
+ case QGLE::SetPerpLineEndPoint:
+ setPerpLineEndPoint(pt);
+ break;
+
+ case QGLE::StartNewCircleWithCentre:
+ createNewCircle(pt);
+ break;
+
+ case QGLE::SetCircleEdgePoint:
+ setCircleEdgePoint(pt);
+ break;
+
+ case QGLE::EndNewCircle:
+ completeNewCircle();
+ break;
+
+ case QGLE::StartNewEllipseWithCorner:
+ createNewEllipse(pt);
+ break;
+
+ case QGLE::SetEllipseSecondCorner:
+ setEllipseSecondCorner(pt);
+ break;
+
+ case QGLE::EndNewEllipse:
+ completeNewEllipse();
+ break;
+
+
+ case QGLE::StartNewArcWithPoint:
+ createNewArc(pt);
+ break;
+
+ case QGLE::SetArcEndPoint:
+ setArcEndPoint(pt);
+ break;
+
+ case QGLE::SetArcMidPoint:
+ setArcMidPoint(pt);
+ break;
+
+ case QGLE::EndNewArc:
+ completeNewArc();
+ break;
+
+ case QGLE::SetAMove:
+ setAmove(pt);
+ break;
+
+ case QGLE::Cancel:
+ cancelCommand();
+ break;
+
+ case QGLE::CreateTextObject:
+ createNewTextObject(pt);
+ break;
+
+ case QGLE::DeleteSelected:
+ deleteSelectedObjects();
+ break;
+
+ // default:
+ // Do Nothing for now: create an error in future
+ }
+}
+
+void GLEDrawingArea::setLineEndPoint(QPointF endPoint)
+{
+ // Double check currentIndex - if something went wrong this avoids a crash
+ if (currentIndex < 0 || currentIndex >= objectList.size()) return;
+ objectList[currentIndex]->setPoint(GLELine::EndPoint, endPoint);
+}
+
+void GLEDrawingArea::setTanLineEndPoint(QPointF endPoint)
+{
+ QList<QPointF> tanList;
+ // Double check currentIndex - if something went wrong this avoids a crash
+ if (currentIndex < 0 || currentIndex >= objectList.size()) return;
+ objectList[currentIndex]->setPoint(GLELine::EndPoint, endPoint);
+
+ QPointF oldStart = objectList[currentIndex]->getQtPoint(GLELine::StartPoint);
+
+ tanList = objectList[baseObject]->getTangents(endPoint);
+
+ if (tanList.size() > 0)
+ {
+ QPointF np = oldStart;
+ QPointF tp;
+ double shortest_distance = 1e6;
+ double distance;
+
+ foreach(tp, tanList)
+ {
+ distance = QGLE::distance(oldStart, tp);
+ if (distance < shortest_distance)
+ {
+ shortest_distance = distance;
+ np = tp;
+ }
+ }
+
+ objectList[currentIndex]->setPoint(GLELine::StartPoint, np);
+
+ for(int i=0;i<objectList.size();i++)
+ {
+ if (i != currentIndex)
+ objectList[i]->addRelativeOSnaps(np);
+ }
+ }
+}
+
+void GLEDrawingArea::completeNewTanLine()
+{
+ // Here we log what we've done so that it can be undone later
+}
+
+void GLEDrawingArea::setPerpLineEndPoint(QPointF endPoint)
+{
+ QList<QPointF> perpList;
+ // Double check currentIndex - if something went wrong this avoids a crash
+ if (currentIndex < 0 || currentIndex >= objectList.size()) return;
+ objectList[currentIndex]->setPoint(GLELine::EndPoint, endPoint);
+
+ QPointF oldStart = objectList[currentIndex]->getQtPoint(GLELine::StartPoint);
+
+ perpList = objectList[baseObject]->getPerpendiculars(endPoint);
+
+ if (perpList.size() > 0)
+ {
+ QPointF np = oldStart;
+ QPointF tp;
+ double shortest_distance = 1e6;
+ double distance;
+
+ foreach(tp, perpList)
+ {
+ distance = QGLE::distance(oldStart, tp);
+ if (distance < shortest_distance)
+ {
+ shortest_distance = distance;
+ np = tp;
+ }
+ }
+
+ objectList[currentIndex]->setPoint(GLELine::StartPoint, np);
+
+ for(int i=0;i<objectList.size();i++)
+ {
+ if (i != currentIndex)
+ objectList[i]->addRelativeOSnaps(np);
+ }
+ }
+}
+
+void GLEDrawingArea::completeNewPerpLine()
+{
+ // Here we log what we've done so that it can be undone later
+}
+
+void GLEDrawingArea::completeNewLine()
+{
+ // Here we log what we've done so that it can be undone later
+}
+
+void GLEDrawingArea::clearRelativeOsnaps()
+{
+ GLEDrawingObject *obj;
+ foreach(obj,objectList)
+ {
+ obj->clearRelativeOSnaps();
+ }
+}
+
+GLEObjectBlock* GLEDrawingArea::createNewObjectBlock(GLEObjectDOConstructor* cons)
+{
+ GLERC<GLEObjectDO> obj = cons->constructObject();
+ if (obj->getObjectRepresentation()->getRectangle()->getXMin() != -1.0)
+ {
+ gleScript->addNewObject(obj.get());
+ GLEObjectBlock *newObj = new GLEObjectBlock(dpi, pixmap.size(), this);
+ objectList.append(newObj);
+ currentIndex = objectList.size() - 1;
+ // Make sure the line is updated when the image size changes
+ newObj->setGLEObject(obj.get());
+ connect(this, SIGNAL(sizeChanged(QSize,double)), newObj, SLOT(setPixmapSize(QSize,double)));
+ newObj->setTextProperties();
+ newObj->setLineProperties();
+ newObj->setShapeProperties();
+ return newObj;
+ }
+ return NULL;
+}
+
+void GLEDrawingArea::createNewTextObject(QPointF referencePoint)
+{
+ GLEText *thisTextObject = new GLEText(dpi, pixmap.size(), this);
+ thisTextObject->setGLEObject(gleScript->newGLEObject(GDOText));
+ objectList.append(thisTextObject);
+ currentIndex = objectList.size() - 1;
+ // Make sure the line is updated when the image size changes
+ connect(this, SIGNAL(sizeChanged(QSize,double)), objectList[currentIndex], SLOT(setPixmapSize(QSize,double)));
+ objectList[currentIndex]->setTextProperties();
+ objectList[currentIndex]->setColorProperty();
+ objectList[currentIndex]->setPoint(GLEText::ReferencePoint, referencePoint);
+ objectList[currentIndex]->setProperty(GLEDrawingObject::Text, tr("X"));
+}
+
+void GLEDrawingArea::createNewLine(QPointF startPoint)
+{
+ QPointF qtPoint;
+
+ // Create a line
+ GLELine *currentLine = new GLELine(dpi, pixmap.size(), this);
+ // Add it to the array of lines
+ objectList.append(currentLine);
+ // Get the index
+ currentIndex = objectList.size() - 1;
+
+ // Make sure the line is updated when the image size changes
+ connect(this, SIGNAL(sizeChanged(QSize,double)),
+ objectList[currentIndex], SLOT(setPixmapSize(QSize,double)));
+
+ objectList[currentIndex]->setPoint(GLELine::StartPoint,
+ startPoint);
+ objectList[currentIndex]->setPoint(GLELine::EndPoint,
+ startPoint);
+
+ objectList[currentIndex]->setGLEObject(gleScript->newGLEObject(GDOLine));
+ objectList[currentIndex]->setLineProperties();
+
+ // Start drawing
+ isDrawing = true;
+
+}
+
+void GLEDrawingArea::createNewTanLine(QPointF startPoint)
+{
+ // TODO Get the nearest object to the point, see how near it is to
+ // the snapped point and whether it has a tangent. If so, use the
+ // nearest point on that object!
+
+ double distance;
+ double shortest_distance = 1e6;
+ int shortest_index = -1;
+ int i;
+ // Find the nearest object and the distance to it
+ for(i=0;i<objectList.size();i++)
+ {
+ distance = objectList[i]->distanceToPoint(startPoint);
+ //qDebug() << "Distance to line " << i << ": " << distance;
+ if (distance < shortest_distance)
+ {
+ shortest_distance = distance;
+ shortest_index = i;
+ }
+ }
+
+ if (shortest_distance < MAX_SELECT_DISTANCE)
+ {
+ if (objectList[shortest_index]->hasTangents())
+ {
+ // Create a line
+ GLELine *currentLine = new GLELine(dpi, pixmap.size(), this);
+ // Add it to the array of lines
+ objectList.append(currentLine);
+ // Get the index
+ currentIndex = objectList.size() - 1;
+ // Remember the object to which we are drawing
+ baseObject = shortest_index;
+
+ // Make sure the line is updated when the image size changes
+ connect(this, SIGNAL(sizeChanged(QSize,double)),
+ objectList[currentIndex], SLOT(setPixmapSize(QSize,double)));
+
+ QPointF qtPoint;
+
+ // Find the nearest point on the object
+ objectList[baseObject]->distanceToPoint(startPoint, &qtPoint);
+
+ objectList[currentIndex]->setPoint(GLELine::StartPoint,
+ qtPoint);
+ objectList[currentIndex]->setPoint(GLELine::EndPoint,
+ qtPoint);
+
+ objectList[currentIndex]->setGLEObject(gleScript->newGLEObject(GDOLine));
+ objectList[currentIndex]->setLineProperties();
+
+ changeLastPoint(QGLE::absQtToGLE(qtPoint, dpi, pixmap.height()));
+ emit updateStatusBar(statusMessages[TanLineTool][EndPoint]);
+
+ // Start drawing
+ isDrawing = true;
+
+ }
+ }
+}
+
+void GLEDrawingArea::createNewPerpLine(QPointF startPoint)
+{
+ // TODO Get the nearest object to the point, see how near it is to
+ // the snapped point and whether it has a perpendicular point. If so, use the
+ // nearest point on that object!
+
+ double distance;
+ double shortest_distance = 1e6;
+ int shortest_index = -1;
+ int i;
+ // Find the nearest object and the distance to it
+ for(i=0;i<objectList.size();i++)
+ {
+ distance = objectList[i]->distanceToPoint(startPoint);
+ //qDebug() << "Distance to line " << i << ": " << distance;
+ if (distance < shortest_distance)
+ {
+ shortest_distance = distance;
+ shortest_index = i;
+ }
+ }
+
+ if (shortest_distance < MAX_SELECT_DISTANCE)
+ {
+ if (objectList[shortest_index]->hasPerpendiculars())
+ {
+ // Create a line
+ GLELine *currentLine = new GLELine(dpi, pixmap.size(), this);
+ // Add it to the array of lines
+ objectList.append(currentLine);
+ // Get the index
+ currentIndex = objectList.size() - 1;
+ // Remember the object to which we are drawing
+ baseObject = shortest_index;
+
+ // Make sure the line is updated when the image size changes
+ connect(this, SIGNAL(sizeChanged(QSize,double)),
+ objectList[currentIndex], SLOT(setPixmapSize(QSize,double)));
+
+ QPointF qtPoint;
+
+ // Find the nearest point on the object
+ objectList[baseObject]->distanceToPoint(startPoint, &qtPoint);
+
+ objectList[currentIndex]->setPoint(GLELine::StartPoint,
+ qtPoint);
+ objectList[currentIndex]->setPoint(GLELine::EndPoint,
+ qtPoint);
+
+ objectList[currentIndex]->setGLEObject(gleScript->newGLEObject(GDOLine));
+ objectList[currentIndex]->setLineProperties();
+
+ changeLastPoint(QGLE::absQtToGLE(qtPoint, dpi, pixmap.height()));
+ emit updateStatusBar(statusMessages[PerpLineTool][EndPoint]);
+
+ // Start drawing
+ isDrawing = true;
+
+ }
+ }
+}
+
+void GLEDrawingArea::createNewArc(QPointF startPoint)
+{
+ // Create an arc
+ GLEArc *currentArc = new GLEArc(dpi, pixmap.size(), this);
+ // Add it to the array of objects
+ objectList.append(currentArc);
+ // Get the index
+ currentIndex = objectList.size() - 1;
+
+ // Make sure the line is updated when the image size changes
+ connect(this, SIGNAL(sizeChanged(QSize,double)),
+ objectList[currentIndex], SLOT(setPixmapSize(QSize,double)));
+
+ objectList[currentIndex]->setPoint(GLEArc::StartPoint,
+ startPoint);
+ objectList[currentIndex]->setPoint(GLEArc::EndPoint,
+ startPoint);
+ objectList[currentIndex]->setGLEObject(gleScript->newGLEObject(GDOArc));
+ objectList[currentIndex]->setLineProperties();
+
+ // Start drawing
+ isDrawing = true;
+
+}
+
+void GLEDrawingArea::setArcEndPoint(QPointF endPoint)
+{
+ objectList[currentIndex]->setPoint(GLEArc::EndPoint, endPoint);
+}
+
+void GLEDrawingArea::setArcMidPoint(QPointF midPoint)
+{
+ objectList[currentIndex]->setPoint(GLEArc::MidPoint,
+ midPoint);
+}
+
+void GLEDrawingArea::setAmove(QPointF pt)
+{
+ if (hasAMove)
+ {
+ // Delete the object
+ delete(objectList[amoveIndex]);
+
+ // Remove the pointer
+ objectList.removeAt(amoveIndex);
+ }
+
+ GLEAmove *amove = new GLEAmove(dpi, pixmap.size(), this);
+ objectList.append(amove);
+ amoveIndex = objectList.size() - 1;
+
+ connect(this, SIGNAL(sizeChanged(QSize,double)),
+ objectList[amoveIndex], SLOT(setPixmapSize(QSize,double)));
+
+ objectList[amoveIndex]->setPoint(GLEAmove::CentrePoint, pt);
+
+ currentIndex = amoveIndex;
+
+ hasAMove = true;
+}
+
+void GLEDrawingArea::completeNewArc()
+{
+ // Log creation of arc
+}
+
+void GLEDrawingArea::createNewCircle(QPointF centrePoint)
+{
+ // Create a circle
+ GLECircle *currentCircle = new GLECircle(dpi, pixmap.size(), this);
+ // Add it to the array of objects
+ objectList.append(currentCircle);
+ // Get the index
+ currentIndex = objectList.size() - 1;
+
+ // Make sure the line is updated when the image size changes
+ connect(this, SIGNAL(sizeChanged(QSize,double)),
+ objectList[currentIndex], SLOT(setPixmapSize(QSize,double)));
+ objectList[currentIndex]->setPoint(GLECircle::CentrePoint, centrePoint);
+ objectList[currentIndex]->setGLEObject(gleScript->newGLEObject(GDOEllipse));
+ objectList[currentIndex]->setLineProperties();
+ objectList[currentIndex]->setShapeProperties();
+
+ // Start drawing
+ isDrawing = true;
+}
+
+void GLEDrawingArea::setCircleEdgePoint(QPointF edgePoint)
+{
+ objectList[currentIndex]->setPoint(GLECircle::CircumferencePoint, edgePoint);
+}
+
+void GLEDrawingArea::completeNewCircle()
+{
+ // Log creation of circle
+}
+
+void GLEDrawingArea::createNewEllipse(QPointF cornerPoint)
+{
+ // Create a ellipse
+ GLEEllipse *currentEllipse = new GLEEllipse(dpi, pixmap.size(), this);
+ // Add it to the array of objects
+ objectList.append(currentEllipse);
+ // Get the index
+ currentIndex = objectList.size() - 1;
+
+ // Make sure the line is updated when the image size changes
+ connect(this, SIGNAL(sizeChanged(QSize,double)),
+ objectList[currentIndex], SLOT(setPixmapSize(QSize,double)));
+ objectList[currentIndex]->setPoint(GLEEllipse::BBoxCorner, cornerPoint);
+ objectList[currentIndex]->setGLEObject(gleScript->newGLEObject(GDOEllipse));
+ objectList[currentIndex]->setLineProperties();
+ objectList[currentIndex]->setShapeProperties();
+
+ // Start drawing
+ isDrawing = true;
+
+
+}
+
+void GLEDrawingArea::setEllipseSecondCorner(QPointF cornerPoint)
+{
+ objectList[currentIndex]->setPoint(GLEEllipse::BBoxCorner, cornerPoint);
+}
+
+void GLEDrawingArea::completeNewEllipse()
+{
+ // Log creation of ellipse
+}
+
+void GLEDrawingArea::startMoving(const QPointF& pt)
+{
+ objectMoved = false;
+ isMoving = true;
+ basePoint = pt;
+ for(int i = 0; i < objectList.size(); i++)
+ {
+ objectList[i]->setBasePoint(basePoint);
+ }
+}
+
+void GLEDrawingArea::findScaleOrigin(const QPointF& pt, int handle)
+{
+
+ if (scaleOrigin.x() == -1.0)
+ {
+ GLEDrawingObject* singleSelected = getSingleSelectedObject();
+ if (singleSelected != NULL)
+ {
+ singleSelected->findScaleOrigin(pt, &scaleOrigin, handle);
+ }
+ }
+}
+
+void GLEDrawingArea::selectObjectsSub(const QPointF& pt, GLEDrawingObject* object, bool multiSelect)
+{
+ if (object->isSelected())
+ {
+ if (multiSelect)
+ {
+ object->setSelected(false);
+ objectSelected = false;
+ for(int i = 0; i < objectList.size(); i++)
+ {
+ if (objectList[i]->isSelected())
+ {
+ objectSelected = true;
+ selectionMode = SelectionMove;
+ emit updateStatusBar(statusMessages[PointerTool][StartPoint]);
+ createSelectionHandles();
+ break;
+ }
+ }
+ }
+ else
+ {
+ if (selectionMode == SelectionMove)
+ {
+ startMoving(pt);
+ }
+ else if (selectionMode == SelectionScale)
+ {
+ isScaling = true;
+ objectMoved = false;
+ findScaleOrigin(pt, -1);
+ // No origin found or origin is equal to given point (which is illegal)
+ if (scaleOrigin.x() == -1.0 || scaleOrigin == pt)
+ {
+ // origin not yet selected -> use furthest handle
+ int max_index = -1;
+ double max_distance = 0.0;
+ for(int i = 0; i < handleList.size() ;i++)
+ {
+ double distance = QGLE::distance(pt, handleList[i]);
+ if (distance > max_distance)
+ {
+ max_distance = distance;
+ max_index = i;
+ }
+ }
+ if (max_index != -1)
+ scaleOrigin = handleList[max_index];
+ }
+ basePoint = pt;
+ grabbedHandle = -1;
+
+ // setBasePoint() copies pointHash to storedPointHash
+ for(int i = 0; i < objectList.size(); i++)
+ objectList[i]->setBasePoint(scaleOrigin);
+ }
+ }
+ }
+ else
+ {
+ if (!multiSelect)
+ unselectObjects();
+ objectSelected = true;
+ selectionMode = SelectionMove;
+ emit updateStatusBar(statusMessages[PointerTool][StartPoint]);
+ object->setSelected(true);
+ createSelectionHandles();
+ }
+}
+
+GLEDrawingObject* GLEDrawingArea::getSingleSelectedObject()
+{
+ int cnt = 0;
+ GLEDrawingObject* result = NULL;
+ for(int i = 0; i < objectList.size(); i++)
+ {
+ if (objectList[i]->isSelected())
+ {
+ cnt++;
+ result = objectList[i];
+ }
+ }
+ return cnt == 1 ? result : NULL;
+}
+
+void GLEDrawingArea::selectObjects(QPointF pt, bool multiSelect)
+{
+ // Select the nearest object (unless it's a long way away)
+ double shortest_distance = 1e6;
+ int shortest_index = -1;
+ double distance;
+ QPointF point, nearest_point;
+ bool has_object = false;
+
+ GLEDrawingObject* singleSelected = getSingleSelectedObject();
+ if (singleSelected != NULL && singleSelected->nearestPriorityOSnap(pt, &point) < MAX_SELECT_DISTANCE)
+ {
+ selectObjectsSub(point, singleSelected, multiSelect);
+ has_object = true;
+ }
+
+ // Next consider resize handles
+ if (!has_object && objectSelected && (selectionMode == SelectionScale || selectionMode == SelectionRotate))
+ {
+ // Find the distance to the nearest handle
+ for(int i = 0; i < handleList.size() ;i++)
+ {
+ distance = QGLE::distance(pt, handleList[i]);
+ if (distance < shortest_distance)
+ {
+ shortest_distance = distance;
+ shortest_index = i;
+ }
+ }
+ if (shortest_distance < MAX_SELECT_DISTANCE)
+ {
+ grabbedHandle = shortest_index;
+ if (selectionMode == SelectionScale)
+ {
+ isScaling = true;
+ basePoint = handleList[grabbedHandle];
+ findScaleOrigin(basePoint, grabbedHandle);
+ if (scaleOrigin.x() == -1.0 || scaleOrigin == basePoint)
+ {
+ // origin not yet selected -> use opposite handle
+ bool scale;
+ scaleOrigin = handleList[oppositeHandleTo(grabbedHandle, &scale)];
+ }
+
+ // setBasePoint() copies pointHash to storedPointHash
+ for(int i = 0; i < objectList.size(); i++)
+ objectList[i]->setBasePoint(scaleOrigin);
+
+ return;
+ }
+ else if (selectionMode == SelectionRotate)
+ {
+ // TODO: Set basePoint to centre of selection
+ // NOTE: Currently disabled because generating GLE script code
+ // from rotated objects is not yet implemented
+ isRotating = true;
+ basePoint.setX((handleList[TopLeft].x() + handleList[BottomRight].x())/2);
+ basePoint.setY((handleList[TopLeft].y() + handleList[BottomRight].y())/2);
+ baseAngle = QGLE::angleBetweenTwoPoints(basePoint, pt);
+ lastAngle = baseAngle;
+
+ for(int i=0;i<objectList.size();i++)
+ objectList[i]->setBasePoint(basePoint);
+
+ return;
+ }
+ }
+ }
+
+ // Find the nearest object and the distance to it
+ shortest_distance = 1e6;
+ shortest_index = -1;
+
+ // First consider snap points of already selected objects
+ for(int i = 0; i < objectList.size(); i++)
+ {
+ if (objectList[i]->isSelected())
+ {
+ distance = objectList[i]->nearestOSnap(pt, &point);
+ if (distance <= shortest_distance)
+ {
+ nearest_point = point;
+ shortest_distance = distance;
+ shortest_index = i;
+ }
+ }
+ }
+
+ if (shortest_distance < MAX_SELECT_DISTANCE)
+ {
+ selectObjectsSub(nearest_point, objectList[shortest_index], multiSelect);
+ has_object = true;
+ }
+
+ // Then consider snap points of objects that are not yet selected
+ if (!has_object)
+ {
+ for(int i = 0; i < objectList.size(); i++)
+ {
+ if (!objectList[i]->isSelected())
+ {
+ distance = objectList[i]->nearestOSnap(pt, &point);
+ if (distance <= shortest_distance)
+ {
+ nearest_point = point;
+ shortest_distance = distance;
+ shortest_index = i;
+ }
+ }
+ }
+
+ if (shortest_distance < MAX_SELECT_DISTANCE)
+ {
+ selectObjectsSub(nearest_point, objectList[shortest_index], multiSelect);
+ has_object = true;
+ }
+ }
+
+ // Now consider selection handles in case of move mode (in other modes they take precedence)
+ if (!has_object && selectionMode == SelectionMove && objectSelected)
+ {
+ for(int i = 0; i < handleList.size(); i++)
+ {
+ distance = QGLE::distance(pt, handleList[i]);
+ if (distance < shortest_distance)
+ {
+ shortest_distance = distance;
+ shortest_index = i;
+ }
+ }
+
+ if (shortest_distance < MAX_SELECT_DISTANCE)
+ {
+ startMoving(handleList[shortest_index]);
+ has_object = true;
+ }
+ }
+
+ // Then consider all points on any object
+ if (!has_object)
+ {
+ for(int i = 0; i < objectList.size(); i++)
+ {
+ distance = objectList[i]->distanceToPoint(pt, &point);
+ if (distance < shortest_distance)
+ {
+ nearest_point = point;
+ shortest_distance = distance;
+ shortest_index = i;
+ }
+ }
+
+ if (shortest_distance < MAX_SELECT_DISTANCE)
+ {
+ selectObjectsSub(nearest_point, objectList[shortest_index], multiSelect);
+ has_object = true;
+ }
+ }
+
+ if (!has_object && !multiSelect)
+ {
+ unselectObjects();
+ }
+
+ if (objectSelected)
+ createSelectionHandles();
+
+ updateSelection();
+}
+
+void GLEDrawingArea::updateSelection()
+{
+ QList<GLEDrawingObject *> selectedObjects;
+ GLEDrawingObject *obj;
+
+ foreach(obj, objectList)
+ {
+ if (obj->isSelected())
+ selectedObjects.append(obj);
+ }
+ emit selectionChanged(selectedObjects);
+}
+
+int GLEDrawingArea::oppositeHandleTo(int handle, bool *scale)
+{
+ int baseHandle = handle;
+ int scaling = false;
+ switch(handle)
+ {
+ case TopLeft:
+ baseHandle = BottomRight;
+ scaling = true;
+ break;
+ case TopMiddle:
+ baseHandle = BottomMiddle;
+ scaling = false;
+ break;
+ case TopRight:
+ baseHandle = BottomLeft;
+ scaling = true;
+ break;
+ case BottomLeft:
+ baseHandle = TopRight;
+ scaling = true;
+ break;
+ case BottomMiddle:
+ baseHandle = TopMiddle;
+ scaling = false;
+ break;
+ case BottomRight:
+ baseHandle = TopLeft;
+ scaling = true;
+ break;
+ case MiddleLeft:
+ baseHandle = MiddleRight;
+ scaling = false;
+ break;
+ case MiddleRight:
+ baseHandle = MiddleLeft;
+ scaling = false;
+ break;
+
+ }
+ if (scale)
+ *scale = scaling;
+
+ return(baseHandle);
+}
+
+void GLEDrawingArea::cancelCommand()
+{
+ GLEDrawObject* obj = objectList[currentIndex]->getGLEObject();
+ if (obj != NULL) gleScript->cancelObject(obj);
+ delete objectList[currentIndex];
+ objectList.removeAt(currentIndex);
+}
+
+void GLEDrawingArea::deleteSelectedObjects()
+{
+ if (objectSelected)
+ {
+ for(int i=objectList.size()-1;i>=0;i--)
+ {
+ if (objectList[i]->isSelected())
+ {
+ if (objectList[i]->isAmove())
+ {
+ hasAMove = false;
+ amoveIndex = -1;
+ }
+
+ GLEDrawObject* gleobj = objectList[i]->getGLEObject();
+ if (gleobj != NULL) gleobj->setFlag(GDO_FLAG_DELETED);
+
+ delete objectList[i];
+ objectList.removeAt(i);
+ }
+ }
+ objectSelected = false;
+ setDirtyAndSave();
+ }
+ updateSelection();
+}
+
+//! Select given object
+void GLEDrawingArea::selectObject(GLEDrawingObject* obj)
+{
+ unselectObjects();
+ obj->setSelected(true);
+ objectSelected = true;
+ selectionMode = SelectionMove;
+ createSelectionHandles();
+ updateSelection();
+}
+
+void GLEDrawingArea::createSelectionHandles()
+{
+ int ch, sh, sh2;
+ if (!objectSelected)
+ return;
+
+ QPainterPath paintPath;
+
+ if (objectSelected)
+ {
+ GLEDrawingObject *obj;
+ foreach(obj, objectList)
+ {
+ if (obj->isSelected())
+ paintPath.addPath(obj->path());
+ }
+ }
+
+ QRectF bbox = paintPath.boundingRect();
+
+ handleList[TopLeft] = bbox.topLeft();
+ handleList[TopRight] = bbox.topRight();
+ handleList[BottomLeft] = bbox.bottomLeft();
+ handleList[BottomRight] = bbox.bottomRight();
+
+ foreach(ch,CornerHandles)
+ {
+ handleList[TopMiddle] = (handleList[TopLeft] + handleList[TopRight])/2;
+ handleList[BottomMiddle] = (handleList[BottomLeft] + handleList[BottomRight])/2;
+ handleList[MiddleLeft] = (handleList[TopLeft] + handleList[BottomLeft])/2;
+ handleList[MiddleRight] = (handleList[TopRight] + handleList[BottomRight])/2;
+
+ // Now go through the list of CornerHandles and if they are coincident
+ // with the SideHandles, then delete them.
+
+ foreach(ch,CornerHandles)
+ {
+ foreach(sh, SideHandles)
+ {
+ // Check whether ch is valid
+ if (handleList.contains(ch))
+ {
+ if (handleList[ch] == handleList[sh])
+ {
+ // delete cause bug when selecting horiz/vertical lines
+ // handleList.remove(ch);
+ // qDebug() << "Removed a corner handle";
+ }
+ }
+ }
+
+ }
+
+ }
+
+ // Now check whether any side handles are coincident and
+ // if they are, delete them both
+ //
+ // I'm sure there's a simpler algorithm to achieve this,
+ // especially since we're only likely to have coincident
+ // TopMiddle & BottomMiddle or MiddleLeft & MiddleRight
+ foreach(sh, SideHandles)
+ {
+ foreach(sh2, SideHandles)
+ {
+ if (sh == sh2)
+ continue;
+ else
+ {
+ if (handleList.contains(sh) && handleList.contains(sh2))
+ {
+ if (handleList[sh] == handleList[sh2])
+ {
+ // handleList.remove(sh);
+ // handleList.remove(sh2);
+ // qDebug() << "Removed a side handle";
+ }
+ }
+ }
+ }
+ }
+}
+
+void GLEDrawingArea::drawSelectionHandles(QPainter *p)
+{
+ QPointF pt;
+ QPen pen = QGLE::handlePen();
+ foreach(pt, handleList)
+ {
+ QGLE::drawBox(p, pt, HANDLE_SIZE, pen);
+ }
+}
+
+void GLEDrawingArea::drawScaleHandles(QPainter *p)
+{
+ QPen pen = QGLE::handlePen();
+ QGLE::drawScaleHandle(p, handleList[TopLeft], -1, -1, HANDLE_SIZE, pen);
+ QGLE::drawScaleHandle(p, handleList[TopRight], +1, -1, HANDLE_SIZE, pen);
+ QGLE::drawScaleHandle(p, handleList[BottomLeft], -1, +1, HANDLE_SIZE, pen);
+ QGLE::drawScaleHandle(p, handleList[BottomRight], +1, +1, HANDLE_SIZE, pen);
+ QGLE::drawBox(p, handleList[TopMiddle], HANDLE_SIZE, pen);
+ QGLE::drawBox(p, handleList[BottomMiddle], HANDLE_SIZE, pen);
+ QGLE::drawBox(p, handleList[MiddleLeft], HANDLE_SIZE, pen);
+ QGLE::drawBox(p, handleList[MiddleRight], HANDLE_SIZE, pen);
+}
+
+void GLEDrawingArea::drawRotationHandles(QPainter *p)
+{
+ QPen pen = QGLE::handlePen();
+ QGLE::drawRotator(p, handleList[TopLeft], TopLeft, HANDLE_SIZE, pen);
+ QGLE::drawRotator(p, handleList[TopRight], TopRight, HANDLE_SIZE, pen);
+ QGLE::drawRotator(p, handleList[BottomLeft], BottomLeft, HANDLE_SIZE, pen);
+ QGLE::drawRotator(p, handleList[BottomRight], BottomRight, HANDLE_SIZE, pen);
+}
+
+void GLEDrawingArea::deleteSelectionHandles()
+{
+ handleList.clear();
+}
+
+void GLEDrawingArea::renderPostscript(const char* ps, const GLERectangle& rect, double dpi, QImage* result)
+{
+ mainWin->renderPostscript(ps, rect, dpi, result);
+}
diff --git a/src/gui/gledrawing.h b/src/gui/gledrawing.h
new file mode 100644
index 0000000..dd45787
--- /dev/null
+++ b/src/gui/gledrawing.h
@@ -0,0 +1,393 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+#ifndef __GLEDRAWING_H
+#define __GLEDRAWING_H
+
+#include <QtGui>
+#include "grid.h"
+#include "snapline.h"
+#include "../gle/gle-interface/gle-interface.h"
+
+class GLEMainWindow;
+class GLEDrawingObject;
+class GLEObjectBlock;
+
+//! Class implementing the drawing area for displaying GLE drawings
+/*!
+ * This class controls the paintable area of the window. For the purposes of
+ * the initial previewer, it is largely unnecessary, as all that is required
+ * is for the picture to be drawn. However, for future versions, there will
+ * be additional usage, including user interaction and this will be cleaner
+ * if implemented in a separate class.
+ */
+class GLEDrawingArea : public QWidget
+{
+ Q_OBJECT
+
+public:
+ //! Constructor
+ GLEDrawingArea(GLEInterface *iface, GLEMainWindow* main);
+
+ //! Enumerator describing the drawing tools
+ enum DrawingTools
+ {
+ NoTool,
+ PointerTool,
+ LineTool,
+ TanLineTool,
+ PerpLineTool,
+ CircleTool,
+ EllipseTool,
+ ArcTool,
+ TextTool,
+ AMoveTool
+ };
+
+ enum Handles
+ {
+ TopLeft,
+ TopMiddle,
+ TopRight,
+ MiddleLeft,
+ MiddleRight,
+ BottomLeft,
+ BottomMiddle,
+ BottomRight
+ };
+
+
+ //! Enumerator used to list the modifiers that we use
+ enum
+ {
+ ShiftKey,
+ AltKey,
+ CtrlKey
+ };
+
+ enum Snaps
+ {
+ ObjectSnap,
+ PolarSnap,
+ PolarTrack,
+ OrthoSnap,
+ GridSnap
+ };
+
+ //! Return the current resolution
+ double getDPI();
+
+ //! Has the image been changed
+ bool isDirty();
+ //! We've saved, so clear the dirty flag
+ void clearDirty();
+ //! Set the dirty flag
+ void setDirty();
+ // To allow us to notice whether changes have occurred
+ void setDirtyAndSave();
+ //! Objects have been rendered
+ void clearNewObjectsFlag();
+ void setNewObjectsFlag();
+ //! Are there new objects since the last render?
+ bool thereAreNewObjects();
+ //! Are there any objects at all?
+ bool thereAreObjects();
+
+ //! We've opened a new file, so clear the objects
+ void clearObjects();
+
+ //! Handle key events
+ void hitKey(int key, int modifiers);
+
+ //! Convert GLE point to Qt point
+ QPointF gleToQt(GLEPoint& pt);
+
+ //! Set line properties
+ void setLineProperties(int currentIndex, GLEDrawObject* obj);
+ //! Create new line object based on GLE object
+ void createNewLineFromScript(GLELineDO* line);
+ //! Create new ellipse object based on GLE object
+ void createNewEllipseFromScript(GLEEllipseDO* ellipse);
+ //! Create new arc object based on GLE object
+ void createNewArcFromScript(GLEArcDO* arc);
+ //! Create new text object based on GLE object
+ void createNewTextFromScript(GLETextDO* text);
+ //! Create new object block based on GLE object
+ void createNewObjectFromScript(GLEObjectDO* obj);
+ //! Create new object block
+ GLEObjectBlock* createNewObjectBlock(GLEObjectDOConstructor* cons);
+ //! Select given object
+ void selectObject(GLEDrawingObject* obj);
+ //! Create objects from given GLE script
+ void updateFromScript(GLEScript* script);
+ //! Render Postscript code to QImage
+ void renderPostscript(const char* ps, const GLERectangle& rect, double dpi, QImage* result);
+ //! Initialize all instance variables
+ void initAll();
+ //! Initialize transient instance variables
+ void initVars();
+ //! Initialize instance variables related to selection
+ void initSelectionVars();
+ //! Return GLEInterface
+ inline GLEInterface* getGLEInterface() { return gleInterface; }
+protected:
+ //! Automatically called when repainting is needed
+ void paintEvent(QPaintEvent *event);
+ //! Automatically called when a mouse button is pressed
+ void mousePressEvent(QMouseEvent *event);
+ //! Automatically called when the mouse is moved
+ void mouseMoveEvent(QMouseEvent *event);
+ //! Automatically called when a mouse button is released
+ void mouseReleaseEvent(QMouseEvent *event);
+
+public slots:
+ //! Slot used to update the display when GS is finished
+ void updateDisplay(QImage image);
+ //! Slot used to toggle the visibility of the grid
+ void gridToggle(bool state);
+ //! Slot used to toggle the grid snap
+ void gridSnapToggle(bool state);
+ //! Slot used to update the resolution of the drawing
+ void setDPI(double new_dpi);
+ //! Slot used to change the grid X spacing
+ void setGrid(QPointF newGrid);
+ //! Slot used to select a new drawing tool
+ void setTool(int newTool);
+ //! Slot used to select a mode
+ void setEditMode(bool state);
+ //! Slot used to toggle orthosnap
+ void orthoSnapToggle(bool state);
+ //! Slot used to toggle osnap
+ void osnapToggle(bool state);
+ //! Slot used to toggle polar snap
+ void polarSnapToggle(bool state);
+ //! Slot used to toggle polar tracking
+ void polarTrackToggle(bool state);
+ //! Slot used to handle keyboard modifiers
+ void modifierToggle(int mod, bool state);
+ //! Slot used to update the polar start angle
+ void setPolarSnapStartAngle(double newAngle);
+ //! Slot used to update the polar increment angle
+ void setPolarSnapIncAngle(double newAngle);
+
+signals:
+ //! Notify children of change of resolution
+ void dpiChanged(double new_dpi);
+ //! Notify children of change of image size
+ void sizeChanged(QSize new_size, double new_dpi);
+ //! Notify parent's status bar of mouse move events
+ void mouseMoved(QPointF gle);
+ //! Notify parent of base point
+ void basePointChanged(QPointF qt);
+ //! Update status bar as things are done
+ void updateStatusBar(QString msg);
+ //! Notify of changes to the dirty flag
+ void dirtyFlagChanged(bool state);
+ //! Disable tools
+ void disableTools();
+ //! The selection has changed: tell the property editor
+ void selectionChanged(QList<GLEDrawingObject *> newSelection);
+ //! Render an image please!
+ void renderPostscript(QString psCode, double dpi, GLEDrawingObject *obj);
+
+private:
+ //! The rendered pixmap
+ QPixmap pixmap;
+ //! The visibility of the grid
+ bool gridVisible;
+ //! The grid spacing
+ QPointF gridSpacing;
+ //! The resolution
+ double dpi;
+
+ //! Hash holding modifier states
+ QHash<int,bool> modifier;
+
+ //! The Grid
+ GLEGrid *grid;
+
+ //! Choose a point based on all the snaps
+ QPointF snappedPoint(QPointF p, bool ignoreOrtho = false);
+
+ QPointF snappedPointFromObject(QPointF p, QPointF* dontFind = NULL);
+
+ //! Check that "p" is not equal to "dontFind"
+ bool checkDontFind(const QPointF& p, QPointF* dontFind);
+
+ //! Change the base point
+ void changeLastPoint(QPointF p);
+
+ //! Unselect all objects
+ void unselectObjects();
+
+ //! Get maximum supported transform mode
+ int minimumSupportedTransformMode();
+
+ //! Perform scaling of objects
+ void performScale(const QPointF& snappedPosition);
+
+ //! Inform objects that we are done with the transformation (they can re-render themselves now)
+ void linearTransformDone();
+
+ QPointF lastPoint;
+ QList<QPointF> osnapIntersectPoints;
+
+ //! Are any objects selected?
+ bool objectSelected;
+
+ //! The current cursor position
+ QPointF cursorPosition;
+
+ //! The nearest grid point (equal to the above if no grid snap)
+ QPointF snappedPosition;
+
+ //! What snaps are activated?
+ QHash<int, bool> snaps;
+
+ //! The index of the current line in the line list
+ int currentIndex;
+
+ bool polarSnapFound;
+
+ //! The current tool being used
+ int currentTool;
+
+ //! The list of lines
+ QList<GLEDrawingObject *> objectList;
+
+ //! The list of snap lines
+ QList<SnapLine *> snapLineList;
+ //! The list of points for the snap line list
+ QList<QPointF> snapLinePoints;
+
+ void createPolarSnaps(QPointF qtPoint);
+ void clearPolarSnaps();
+ void updateSnapLines(QPointF qtPoint);
+
+ //! A list of status bar messages
+ QHash<int, QHash<int, QString> > statusMessages;
+ //! Is it present?
+ bool hasAMove;
+ //! What is the index in the list of objects
+ int amoveIndex;
+
+ //! Are we drawing?
+ bool isDrawing;
+
+ //! Are we in an editing mode
+ bool isEditMode;
+
+ //! Has the drawing been changed
+ bool dirty;
+ //! Has it been changed since the last render
+ bool newObjects;
+
+ //! A record of the parent
+ GLEMainWindow* mainWin;
+
+ //! Enumerator used to describe what we're drawing (for status bar messages)
+ enum
+ {
+ StartPoint,
+ MidPoint,
+ EndPoint,
+ CircumferencePoint
+ };
+
+ double polarStartAngle;
+ double polarAngleIncrement;
+
+ void processCommand(int command, QPointF pt = QPointF(0.0,0.0));
+ void clearRelativeOsnaps();
+ void completeNewLine();
+ void setLineEndPoint(QPointF endPoint);
+ void createNewLine(QPointF startPoint);
+ void completeNewTanLine();
+ void setTanLineEndPoint(QPointF endPoint);
+ void createNewTanLine(QPointF startPoint);
+ void completeNewPerpLine();
+ void setPerpLineEndPoint(QPointF endPoint);
+ void createNewPerpLine(QPointF startPoint);
+ void createNewCircle(QPointF centrePoint);
+ void setCircleEdgePoint(QPointF edgePoint);
+ void completeNewCircle();
+ void createNewEllipse(QPointF cornerPoint);
+ void createNewTextObject(QPointF referencePoint);
+ void setEllipseSecondCorner(QPointF cornerPoint);
+ void completeNewEllipse();
+ void createNewArc(QPointF startPoint);
+ void setArcEndPoint(QPointF endPoint);
+ void setArcMidPoint(QPointF midPoint);
+ void completeNewArc();
+ void setAmove(QPointF pt);
+ void cancelCommand();
+ void deleteSelectedObjects();
+ GLEDrawingObject* getSingleSelectedObject();
+ void selectObjects(QPointF pt, bool multiSelect);
+ void startMoving(const QPointF& pt);
+ void findScaleOrigin(const QPointF& pt, int handle);
+ //! Set the reference point of, e.g., text objects or GLE object blocks (tl,bl,tc,bc,tr,br,...)
+ void setReferencePoint(const QPointF& pt);
+ void selectObjectsSub(const QPointF& pt, GLEDrawingObject* object, bool multiSelect);
+ void updateSelection();
+
+ void createSelectionHandles();
+ void deleteSelectionHandles();
+ void drawSelectionHandles(QPainter *p);
+ void drawScaleHandles(QPainter *p);
+ void drawRotationHandles(QPainter *p);
+ bool isSelectedObjectSnap;
+ bool isScaling;
+ bool isMoving;
+ bool isRotating;
+ bool objectMoved;
+ int selectionMode;
+ double baseAngle;
+ double lastAngle;
+ //! The list of handles
+ QHash<int, QPointF> handleList;
+ QList<int> CornerHandles;
+ QList<int> SideHandles;
+ QPointF basePoint;
+ QPointF scaleOrigin;
+
+ QList<QPointF> extraPoints;
+ GLEScript* gleScript;
+
+ int baseObject;
+
+ enum SelectionModes
+ {
+ SelectionMove,
+ SelectionScale,
+ SelectionRotate
+ };
+
+ int oppositeHandleTo(int handle, bool *scale = 0);
+
+ int grabbedHandle;
+
+ // Pointer to the GLE interface
+ GLEInterface *gleInterface;
+};
+
+
+#endif
diff --git a/src/gui/glegs.cpp b/src/gui/glegs.cpp
new file mode 100644
index 0000000..2abb8bd
--- /dev/null
+++ b/src/gui/glegs.cpp
@@ -0,0 +1,242 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+ #include "../config.h"
+#else
+ #include "../config_noauto.h"
+#endif
+
+#include "gsinc/ierrors.h"
+#include "gsinc/iapi.h"
+
+#if STDC_HEADERS
+ #include <stdlib.h>
+#else
+ #if HAVE_STDLIB_H
+ #include <stdlib.h>
+ #endif
+#endif
+#if HAVE_STRING_H
+ #if !STDC_HEADERS && HAVE_MEMORY_H
+ #include <memory.h>
+ #endif
+ #include <string.h>
+#endif
+#if HAVE_STRINGS_H
+ #include <strings.h>
+#endif
+#ifdef __UNIX__
+ #include <dlfcn.h>
+#endif
+
+#include <iostream>
+#include <fstream>
+#include <string>
+#include <vector>
+
+using namespace std;
+
+#include "../gle/file_io.h"
+#include "../gle/cutils.h"
+
+// ./build/bin/glegs -I/Users/dtai/Library/Frameworks/Ghostscript.framework/Resources/lib -I/Users/dtai/Library/Frameworks/Ghostscript.framework/Resources/fonts -q -dAutoFilterColorImages=false -dAutoFilterGrayImages=false -dEncodeColorImages=true -dEncodeGrayImages=true -dEncodeMonoImages=true -dColorImageFilter=/FlateEncode -dGrayImageFilter=/FlateEncode -dMonoImageFilter=/FlateEncode -dBATCH -dNOPAUSE -r72 -g286x286 -sDEVICE=pdfwrite -sOutputFile="src/samples/sample.pdf" src/samples/s [...]
+// ./build/bin/glegs -q -dAutoFilterColorImages=false -dAutoFilterGrayImages=false -dEncodeColorImages=true -dEncodeGrayImages=true -dEncodeMonoImages=true -dColorImageFilter=/FlateEncode -dGrayImageFilter=/FlateEncode -dMonoImageFilter=/FlateEncode -dBATCH -dNOPAUSE -r72 -g286x286 -sDEVICE=pdfwrite -sOutputFile="src/samples/sample.pdf" src/samples/sample.eps
+
+bool try_load_config(const string& confname, string* gsname) {
+ ifstream file;
+ file.open(confname.c_str());
+ if (!file.is_open()) {
+ return false;
+ }
+ string line;
+ while (file.good()) {
+ getline(file, line);
+ string::size_type pos = line.find("libgs =");
+ if (pos != string::npos) {
+ line = line.substr(pos+7);
+ str_trim_both(line);
+ str_remove_quote(line);
+ if (str_i_ends_with(line, ".framework")) {
+ AddDirSep(line);
+ line += "Ghostscript";
+ }
+ *gsname = line;
+ }
+ }
+ file.close();
+ return true;
+}
+
+bool try_load_config_sub(const string& topdir, vector<string>& tries, string* gsname) {
+ string confname = topdir;
+ AddDirSep(confname);
+ confname += "glerc";
+ tries.push_back(confname);
+ return try_load_config(confname, gsname);
+}
+
+char* my_sdup(const char* str) {
+ char* res = (char*)malloc(strlen(str)+1);
+ strcpy(res, str);
+ return res;
+}
+
+void clean_up(char** argv, char** margv) {
+ if (argv != margv) {
+ free(margv[1]);
+ free(margv[2]);
+ free(margv);
+ }
+}
+
+int main(int argc, char** argv) {
+ string exe_name;
+ bool has_exe_name = GetExeName("glegs", argv, exe_name);
+ if (!has_exe_name) {
+ cout << "GLE-gs error: Can't locate executable" << endl;
+ return 1;
+ }
+ string gsname;
+ vector<string> tries;
+ bool has_help = false;
+ #ifdef GLETOP_CD
+ // Try relative path
+ string GLE_TOP_DIR = exe_name;
+ StripPathComponents(&GLE_TOP_DIR, GLETOP_CD+1);
+ AddDirSep(GLE_TOP_DIR);
+ GLE_TOP_DIR += GLETOP_REL;
+ bool has_config = try_load_config_sub(GLE_TOP_DIR, tries, &gsname);
+ // Try one level higher as executable
+ if (!has_config) {
+ GLE_TOP_DIR = exe_name;
+ StripPathComponents(&GLE_TOP_DIR, 2);
+ has_config = try_load_config_sub(GLE_TOP_DIR, tries, &gsname);
+ }
+ // Try with absolute path
+ if (!has_config) {
+ GLE_TOP_DIR = GLETOP_ABS;
+ has_config = try_load_config_sub(GLE_TOP_DIR, tries, &gsname);
+ }
+ #else
+ string GLE_TOP_DIR = exe_name;
+ StripPathComponents(&GLE_TOP_DIR, 2);
+ bool has_config = try_load_config_sub(GLE_TOP_DIR, tries, &gsname);
+ #endif
+ if (!has_config) {
+ cout << "GLE-gs error: Can't locate configuration file (glerc)" << endl;
+ for (unsigned int i = 0; i < tries.size(); i++) {
+ cout << "Try: " << tries[i] << endl;
+ }
+ return 1;
+ }
+ string userconf = GetHomeDir();
+ AddDirSep(userconf);
+ userconf += ".glerc";
+ try_load_config(userconf, &gsname);
+ if (gsname == "") {
+ cout << "GLE-gs error: No 'libgs' in configuration file (run 'gle -finddeps' to locate it)" << endl;
+ return 1;
+ }
+ char** margv = argv;
+ string::size_type fwpos = gsname.rfind(".framework");
+ if (fwpos != string::npos) {
+ // If the Ghostscript framework is not installed in a default location it won't find its resources and fonts
+ string loc = gsname.substr(0, fwpos+10);
+ string libpath = string("-I") + loc + string("/Resources/lib");
+ string fontpath = string("-I") + loc + string("/Resources/fonts");
+ margv = (char**)malloc((argc+2)*sizeof(char*));
+ margv[0] = argv[0];
+ margv[1] = my_sdup(libpath.c_str());
+ margv[2] = my_sdup(fontpath.c_str());
+ for (int i = 1; i < argc; i++) {
+ margv[i+2] = argv[i];
+ }
+ argc += 2;
+ }
+ for (int i = 0; i < argc; i++) {
+ // cout << "arg: " << margv[i] << endl;
+ if (str_i_equals(margv[i], "-h")) has_help = true;
+ }
+ void* hmodule = dlopen(gsname.c_str(), RTLD_NOW);
+ if (hmodule == NULL) {
+ cout << "GLE-gs error: Can't load '" << gsname << "'" << endl;
+ cout << dlerror() << endl;
+ clean_up(argv, margv);
+ return 1;
+ }
+ PFN_gsapi_new_instance gsapi_new_instance = (PFN_gsapi_new_instance) dlsym(hmodule,"gsapi_new_instance");
+ if (gsapi_new_instance == NULL) {
+ dlclose(hmodule);
+ clean_up(argv, margv);
+ return 1;
+ }
+ PFN_gsapi_delete_instance gsapi_delete_instance = (PFN_gsapi_delete_instance) dlsym(hmodule, "gsapi_delete_instance");
+ if (gsapi_delete_instance == NULL) {
+ dlclose(hmodule);
+ clean_up(argv, margv);
+ return 1;
+ }
+ PFN_gsapi_init_with_args gsapi_init_with_args = (PFN_gsapi_init_with_args) dlsym(hmodule, "gsapi_init_with_args");
+ if (gsapi_init_with_args == NULL) {
+ dlclose(hmodule);
+ clean_up(argv, margv);
+ return 1;
+ }
+ PFN_gsapi_run_string gsapi_run_string = (PFN_gsapi_run_string) dlsym(hmodule, "gsapi_run_string");
+ if (gsapi_run_string == NULL) {
+ dlclose(hmodule);
+ clean_up(argv, margv);
+ return 1;
+ }
+ PFN_gsapi_exit gsapi_exit = (PFN_gsapi_exit) dlsym(hmodule, "gsapi_exit");
+ if (gsapi_exit == NULL) {
+ dlclose(hmodule);
+ clean_up(argv, margv);
+ return 1;
+ }
+ void *minst = NULL;
+ int code = gsapi_new_instance(&minst, NULL);
+ if (code < 0) {
+ dlclose(hmodule);
+ clean_up(argv, margv);
+ return 1;
+ }
+ code = gsapi_init_with_args(minst, argc, margv);
+ if (code == 0) {
+ int exit_code;
+ const char start_string[] = "systemdict /start get exec\n";
+ code = gsapi_run_string(minst, start_string, 0, &exit_code);
+ }
+ int code1 = gsapi_exit(minst);
+ if (code == 0 || code == e_Quit) {
+ code = code1;
+ }
+ gsapi_delete_instance(minst);
+ dlclose(hmodule);
+ clean_up(argv, margv);
+ if (code == 0 || code == e_Quit) {
+ return 0;
+ } else {
+ return 1;
+ }
+}
+
diff --git a/src/gui/gpl.txt b/src/gui/gpl.txt
new file mode 100644
index 0000000..f90922e
--- /dev/null
+++ b/src/gui/gpl.txt
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/src/gui/grid.cpp b/src/gui/grid.cpp
new file mode 100644
index 0000000..aa961d6
--- /dev/null
+++ b/src/gui/grid.cpp
@@ -0,0 +1,145 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+#include "qgle_definitions.h"
+#include "qgle_statics.h"
+#include "grid.h"
+#include <math.h>
+
+// The constructor, initialise variables and clear the grid
+GLEGrid::GLEGrid(QObject *parent) : QObject(parent)
+{
+ gridSpacing = QPointF(0.0,0.0);
+ dpi = 0;
+
+ // don't compute all points: this is too slow for small grid sizes
+ // because the number of points quadratically increases as grid size decreases
+
+ paintPen.setStyle(Qt::SolidLine);
+ paintPen.setCapStyle(Qt::RoundCap);
+ paintPen.setColor(Qt::black);
+ //paintPen.setWidth(0);
+ paintPen.setWidth(1);
+
+ areaSize = QSizeF(0.0,0.0);
+}
+
+// SLOT: Set the grid spacing
+void GLEGrid::setGrid(QPointF newGrid)
+{
+ if (gridSpacing != newGrid)
+ {
+ gridSpacing = newGrid;
+ }
+}
+
+// SLOT: Set the pixmap area
+void GLEGrid::setArea(QSize area)
+{
+ if (area != areaSize)
+ {
+ areaSize = area;
+ }
+}
+
+// SLOT: set the resolution
+void GLEGrid::setDPI(double new_dpi)
+{
+ if (dpi != new_dpi)
+ {
+ dpi = new_dpi;
+ updatePen();
+ }
+}
+
+// Update the pen width according to the resolution
+void GLEGrid::updatePen()
+{
+ //paintPen.setWidth((int) floor(dpi/100.0));
+ paintPen.setWidth(1);
+}
+
+QPen GLEGrid::pen()
+{
+ return(paintPen);
+}
+
+//! Draw the grid
+void GLEGrid::drawGrid(QPainter* paint)
+{
+ // Only set up the grid if we have the spacings and dpi
+ if ((gridSpacing.x() == 0.0) || (gridSpacing.y() == 0.0) || (dpi == 0.0) || (areaSize.height() == 0))
+ {
+ return;
+ }
+
+ // Get the grid spacing in QT units
+ QPointF qtGrid = QGLE::relGLEToQt(gridSpacing, dpi);
+
+ // Create the grid
+ int nbX = (int)floor(areaSize.width()/qtGrid.x()+1.0);
+ int nbY = (int)floor(areaSize.height()/qtGrid.y()+1.0);
+ for (int x = 0; x < nbX; x ++)
+ {
+ double xp = GS_OFFSET*dpi + x*qtGrid.x();
+ for (int y = 0; y < nbY; y++)
+ {
+ double yp = GS_OFFSET*dpi + y*qtGrid.y();
+ paint->drawPoint(QPointF(xp, areaSize.height() - yp));
+ }
+ }
+}
+
+// Find the nearest point to a given (QT) point: used for snap to grid
+QPointF GLEGrid::nearestPoint(QPointF qt, double *distance)
+{
+ // Only set up the grid if we have the spacings and dpi
+ if ((gridSpacing.x() == 0.0) || (gridSpacing.y() == 0.0) || (dpi == 0.0) || (areaSize.height() == 0))
+ {
+ if (distance)
+ *distance = 1e6;
+ return QPointF();
+ }
+
+ // Get the grid spacing in QT units
+ QPointF qtGrid = QGLE::relGLEToQt(gridSpacing,dpi);
+
+ // Find the nearest point
+ double xp = qt.x() - GS_OFFSET*dpi;
+ double yp = areaSize.height() - qt.y() - GS_OFFSET*dpi;
+
+ int x = max((int)floor(xp / qtGrid.x() + 0.5), 0);
+ int y = max((int)floor(yp / qtGrid.y() + 0.5), 0);
+
+ double nearX = GS_OFFSET*dpi + x*qtGrid.x();
+ double nearY = areaSize.height() - (GS_OFFSET*dpi + y*qtGrid.y());
+
+ if (distance)
+ {
+ double dx = qt.x()-nearX;
+ double dy = qt.y()-nearY;
+ *distance = sqrt(dx*dx + dy*dy);
+ }
+
+ return QPointF(nearX, nearY);
+}
+
+
diff --git a/src/gui/grid.h b/src/gui/grid.h
new file mode 100644
index 0000000..830dd87
--- /dev/null
+++ b/src/gui/grid.h
@@ -0,0 +1,68 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+#ifndef _GRID_H
+#define _GRID_H
+
+#include <QtGui>
+#include "qgle_definitions.h"
+
+//! Class implementing a grid for drawing
+class GLEGrid : public QObject
+{
+ Q_OBJECT
+
+public:
+ //! Constructor: initialise the grid
+ GLEGrid(QObject *parent = 0);
+ //! Find the nearest grid point to a given point (QT coordinates)
+ QPointF nearestPoint(QPointF qt, double *distance = 0);
+ //! Return all (QT) grid points
+ QList<QPointF> allPoints();
+ //! Return the pen with which to draw the grid
+ QPen pen();
+ //! Draw the grid
+ void drawGrid(QPainter* paint);
+
+public slots:
+ //! Set the grid spacing
+ void setGrid(QPointF newGrid);
+ //! Set the drawing area
+ void setArea(QSize area);
+ //! Set the resolution
+ void setDPI(double new_dpi);
+
+private:
+ //! Update the pen with a new resolution
+ void updatePen();
+
+ //! The grid X & Y spacing
+ QPointF gridSpacing;
+ //! The drawing area size
+ QSizeF areaSize;
+ //! The resolution
+ double dpi;
+
+ //! The pen with which to draw the grid
+ QPen paintPen;
+};
+
+#endif
diff --git a/src/gui/gsinc/LICENSE b/src/gui/gsinc/LICENSE
new file mode 100644
index 0000000..c8ae11a
--- /dev/null
+++ b/src/gui/gsinc/LICENSE
@@ -0,0 +1,28 @@
+
+ The files in this directory were taken from GPL GhostScript 8.54
+ This is the relevant license information:
+
+ The files in the src, lib, toolbin, examples, doc and man
+ directories (folders) and any subdirectories (sub-folders)
+ thereof are part of GPL Ghostscript.
+
+ The files in the Resource directory and any subdirectories thereof
+ are also part of GPL Ghostscript, with the explicit exception of
+ the files in the CMap subdirectory. The CMap files are copyright
+ Adobe Systems Incorporated and covered by a separate license
+ which permits only verbatim distribution.
+
+ GPL Ghostscript is free software; you can redistribute it and/or
+ modify it under the terms of version 2 of the GNU General Public
+ License as published by the Free Software Foundation.
+
+ GPL Ghostscript is distributed in the hope that it will be
+ useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program so you can know your rights and responsibilities.
+ It should be in a file named doc/COPYING. If not, write to the
+ Free Software Foundation, Inc., 59 Temple Place Suite 330, Boston, MA
+ 02111-1307, USA.
diff --git a/src/gui/gsinc/gdevdsp.h b/src/gui/gsinc/gdevdsp.h
new file mode 100644
index 0000000..11b99a8
--- /dev/null
+++ b/src/gui/gsinc/gdevdsp.h
@@ -0,0 +1,266 @@
+/* Copyright (C) 2001-2006 artofcode LLC.
+ All Rights Reserved.
+
+ This software is provided AS-IS with no warranty, either express or
+ implied.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/
+ or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
+ San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information.
+*/
+/* $Id: gdevdsp.h,v 1.3 2007/08/21 21:39:46 jeans Exp $ */
+/* gdevdsp.h - callback structure for DLL based display device */
+
+#ifndef gdevdsp_INCLUDED
+# define gdevdsp_INCLUDED
+
+/*
+ * The callback structure must be provided by calling the
+ * Ghostscript APIs in the following order:
+ * gsapi_new_instance(&minst);
+ * gsapi_set_display_callback(minst, callback);
+ * gsapi_init_with_args(minst, argc, argv);
+ *
+ * Supported parameters and default values are:
+ * -sDisplayHandle=16#04d2 or 1234 string
+ * Caller supplied handle as a decimal or hexadecimal number
+ * in a string. On 32-bit platforms, it may be set
+ * using -dDisplayHandle=1234 for backward compatibility.
+ * Included as first parameter of all callback functions.
+ *
+ * -dDisplayFormat=0 long
+ * Color format specified using bitfields below.
+ * Included as argument of display_size() and display_presize()
+ * These can only be changed when the device is closed.
+ *
+ * The second parameter of all callback functions "void *device"
+ * is the address of the Ghostscript display device instance.
+ * The arguments "void *handle" and "void *device" together
+ * uniquely identify an instance of the display device.
+ *
+ * A typical sequence of callbacks would be
+ * open, presize, memalloc, size, sync, page
+ * presize, memfree, memalloc, size, sync, page
+ * preclose, memfree, close
+ * The caller should not access the image buffer:
+ * - before the first sync
+ * - between presize and size
+ * - after preclose
+ * If opening the device fails, you might see the following:
+ * open, presize, memalloc, memfree, close
+ *
+ */
+
+#define DISPLAY_VERSION_MAJOR 2
+#define DISPLAY_VERSION_MINOR 0
+
+#define DISPLAY_VERSION_MAJOR_V1 1 /* before separation format was added */
+#define DISPLAY_VERSION_MINOR_V1 0
+
+/* The display format is set by a combination of the following bitfields */
+
+/* Define the color space alternatives */
+typedef enum {
+ DISPLAY_COLORS_NATIVE = (1<<0),
+ DISPLAY_COLORS_GRAY = (1<<1),
+ DISPLAY_COLORS_RGB = (1<<2),
+ DISPLAY_COLORS_CMYK = (1<<3),
+ DISPLAY_COLORS_SEPARATION = (1<<19)
+} DISPLAY_FORMAT_COLOR;
+#define DISPLAY_COLORS_MASK 0x8000fL
+
+/* Define whether alpha information, or an extra unused bytes is included */
+/* DISPLAY_ALPHA_FIRST and DISPLAY_ALPHA_LAST are not implemented */
+typedef enum {
+ DISPLAY_ALPHA_NONE = (0<<4),
+ DISPLAY_ALPHA_FIRST = (1<<4),
+ DISPLAY_ALPHA_LAST = (1<<5),
+ DISPLAY_UNUSED_FIRST = (1<<6), /* e.g. Mac xRGB */
+ DISPLAY_UNUSED_LAST = (1<<7) /* e.g. Windows BGRx */
+} DISPLAY_FORMAT_ALPHA;
+#define DISPLAY_ALPHA_MASK 0x00f0L
+
+/* Define the depth per component for DISPLAY_COLORS_GRAY,
+ * DISPLAY_COLORS_RGB and DISPLAY_COLORS_CMYK,
+ * or the depth per pixel for DISPLAY_COLORS_NATIVE
+ * DISPLAY_DEPTH_2 and DISPLAY_DEPTH_12 have not been tested.
+ */
+typedef enum {
+ DISPLAY_DEPTH_1 = (1<<8),
+ DISPLAY_DEPTH_2 = (1<<9),
+ DISPLAY_DEPTH_4 = (1<<10),
+ DISPLAY_DEPTH_8 = (1<<11),
+ DISPLAY_DEPTH_12 = (1<<12),
+ DISPLAY_DEPTH_16 = (1<<13)
+ /* unused (1<<14) */
+ /* unused (1<<15) */
+} DISPLAY_FORMAT_DEPTH;
+#define DISPLAY_DEPTH_MASK 0xff00L
+
+
+/* Define whether Red/Cyan should come first,
+ * or whether Blue/Black should come first
+ */
+typedef enum {
+ DISPLAY_BIGENDIAN = (0<<16), /* Red/Cyan first */
+ DISPLAY_LITTLEENDIAN = (1<<16) /* Blue/Black first */
+} DISPLAY_FORMAT_ENDIAN;
+#define DISPLAY_ENDIAN_MASK 0x00010000L
+
+/* Define whether the raster starts at the top or bottom of the bitmap */
+typedef enum {
+ DISPLAY_TOPFIRST = (0<<17), /* Unix, Mac */
+ DISPLAY_BOTTOMFIRST = (1<<17) /* Windows */
+} DISPLAY_FORMAT_FIRSTROW;
+#define DISPLAY_FIRSTROW_MASK 0x00020000L
+
+
+/* Define whether packing RGB in 16-bits should use 555
+ * or 565 (extra bit for green)
+ */
+typedef enum {
+ DISPLAY_NATIVE_555 = (0<<18),
+ DISPLAY_NATIVE_565 = (1<<18)
+} DISPLAY_FORMAT_555;
+#define DISPLAY_555_MASK 0x00040000L
+
+/* Define the row alignment, which must be equal to or greater than
+ * the size of a pointer.
+ * The default (DISPLAY_ROW_ALIGN_DEFAULT) is the size of a pointer,
+ * 4 bytes (DISPLAY_ROW_ALIGN_4) on 32-bit systems or 8 bytes
+ * (DISPLAY_ROW_ALIGN_8) on 64-bit systems.
+ */
+typedef enum {
+ DISPLAY_ROW_ALIGN_DEFAULT = (0<<20),
+ /* DISPLAY_ROW_ALIGN_1 = (1<<20), */ /* not currently possible */
+ /* DISPLAY_ROW_ALIGN_2 = (2<<20), */ /* not currently possible */
+ DISPLAY_ROW_ALIGN_4 = (3<<20),
+ DISPLAY_ROW_ALIGN_8 = (4<<20),
+ DISPLAY_ROW_ALIGN_16 = (5<<20),
+ DISPLAY_ROW_ALIGN_32 = (6<<20),
+ DISPLAY_ROW_ALIGN_64 = (7<<20)
+} DISPLAY_FORMAT_ROW_ALIGN;
+#define DISPLAY_ROW_ALIGN_MASK 0x00700000L
+
+
+#ifndef display_callback_DEFINED
+#define display_callback_DEFINED
+typedef struct display_callback_s display_callback;
+#endif
+
+/*
+ * Note that for Windows, the display callback functions are
+ * cdecl, not stdcall. This differs from those in iapi.h.
+ */
+
+struct display_callback_s {
+ /* Size of this structure */
+ /* Used for checking if we have been handed a valid structure */
+ int size;
+
+ /* Major version of this structure */
+ /* The major version number will change if this structure changes. */
+ int version_major;
+
+ /* Minor version of this structure */
+ /* The minor version number will change if new features are added
+ * without changes to this structure. For example, a new color
+ * format.
+ */
+ int version_minor;
+
+ /* New device has been opened */
+ /* This is the first event from this device. */
+ int (*display_open)(void *handle, void *device);
+
+ /* Device is about to be closed. */
+ /* Device will not be closed until this function returns. */
+ int (*display_preclose)(void *handle, void *device);
+
+ /* Device has been closed. */
+ /* This is the last event from this device. */
+ int (*display_close)(void *handle, void *device);
+
+ /* Device is about to be resized. */
+ /* Resize will only occur if this function returns 0. */
+ /* raster is byte count of a row. */
+ int (*display_presize)(void *handle, void *device,
+ int width, int height, int raster, unsigned int format);
+
+ /* Device has been resized. */
+ /* New pointer to raster returned in pimage */
+ int (*display_size)(void *handle, void *device, int width, int height,
+ int raster, unsigned int format, unsigned char *pimage);
+
+ /* flushpage */
+ int (*display_sync)(void *handle, void *device);
+
+ /* showpage */
+ /* If you want to pause on showpage, then don't return immediately */
+ int (*display_page)(void *handle, void *device, int copies, int flush);
+
+ /* Notify the caller whenever a portion of the raster is updated. */
+ /* This can be used for cooperative multitasking or for
+ * progressive update of the display.
+ * This function pointer may be set to NULL if not required.
+ */
+ int (*display_update)(void *handle, void *device, int x, int y,
+ int w, int h);
+
+ /* Allocate memory for bitmap */
+ /* This is provided in case you need to create memory in a special
+ * way, e.g. shared. If this is NULL, the Ghostscript memory device
+ * allocates the bitmap. This will only called to allocate the
+ * image buffer. The first row will be placed at the address
+ * returned by display_memalloc.
+ */
+ void *(*display_memalloc)(void *handle, void *device, unsigned long size);
+
+ /* Free memory for bitmap */
+ /* If this is NULL, the Ghostscript memory device will free the bitmap */
+ int (*display_memfree)(void *handle, void *device, void *mem);
+
+ /* Added in V2 */
+ /* When using separation color space (DISPLAY_COLORS_SEPARATION),
+ * give a mapping for one separation component.
+ * This is called for each new component found.
+ * It may be called multiple times for each component.
+ * It may be called at any time between display_size
+ * and display_close.
+ * The client uses this to map from the separations to CMYK
+ * and hence to RGB for display.
+ * GS must only use this callback if version_major >= 2.
+ * The unsigned short c,m,y,k values are 65535 = 1.0.
+ * This function pointer may be set to NULL if not required.
+ */
+ int (*display_separation)(void *handle, void *device,
+ int component, const char *component_name,
+ unsigned short c, unsigned short m,
+ unsigned short y, unsigned short k);
+};
+
+/* This is the V1 structure, before separation format was added */
+struct display_callback_v1_s {
+ int size;
+ int version_major;
+ int version_minor;
+ int (*display_open)(void *handle, void *device);
+ int (*display_preclose)(void *handle, void *device);
+ int (*display_close)(void *handle, void *device);
+ int (*display_presize)(void *handle, void *device,
+ int width, int height, int raster, unsigned int format);
+ int (*display_size)(void *handle, void *device, int width, int height,
+ int raster, unsigned int format, unsigned char *pimage);
+ int (*display_sync)(void *handle, void *device);
+ int (*display_page)(void *handle, void *device, int copies, int flush);
+ int (*display_update)(void *handle, void *device, int x, int y,
+ int w, int h);
+ void *(*display_memalloc)(void *handle, void *device, unsigned long size);
+ int (*display_memfree)(void *handle, void *device, void *mem);
+};
+
+#define DISPLAY_CALLBACK_V1_SIZEOF sizeof(struct display_callback_v1_s)
+
+#endif /* gdevdsp_INCLUDED */
diff --git a/src/gui/gsinc/gscdefs.h b/src/gui/gsinc/gscdefs.h
new file mode 100644
index 0000000..7a3938c
--- /dev/null
+++ b/src/gui/gsinc/gscdefs.h
@@ -0,0 +1,86 @@
+/* Copyright (C) 2001-2006 artofcode LLC.
+ All Rights Reserved.
+
+ This software is provided AS-IS with no warranty, either express or
+ implied.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/
+ or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
+ San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information.
+*/
+
+/*$Id: gscdefs.h,v 1.3 2007/08/21 21:39:46 jeans Exp $ */
+/* Prototypes for configuration definitions in gconfig.c. */
+
+#ifndef gscdefs_INCLUDED
+# define gscdefs_INCLUDED
+
+#include "gconfigv.h"
+
+/*
+ * This file may be #included in places that don't even have stdpre.h,
+ * so it mustn't use any Ghostscript definitions in any code that is
+ * actually processed here (as opposed to being part of a macro
+ * definition).
+ */
+
+/* Miscellaneous system constants (read-only systemparams). */
+/* They should all be const, but one application needs some of them */
+/* to be writable.... */
+
+#if SYSTEM_CONSTANTS_ARE_WRITABLE
+# define CONFIG_CONST /* */
+#else
+# define CONFIG_CONST const
+#endif
+
+extern CONFIG_CONST long gs_buildtime;
+extern const char *CONFIG_CONST gs_copyright;
+extern const char *CONFIG_CONST gs_product;
+extern const char *CONFIG_CONST gs_productfamily;
+extern CONFIG_CONST long gs_revision;
+extern CONFIG_CONST long gs_revisiondate;
+extern CONFIG_CONST long gs_serialnumber;
+
+/* Installation directories and files */
+extern const char *const gs_doc_directory;
+extern const char *const gs_lib_default_path;
+extern const char *const gs_init_file;
+
+/* Resource tables. In order to avoid importing a large number of types, */
+/* we only provide macros for some externs, not the externs themselves. */
+
+#define extern_gx_device_halftone_list()\
+ typedef DEVICE_HALFTONE_RESOURCE_PROC((*gx_dht_proc));\
+ extern const gx_dht_proc gx_device_halftone_list[]
+
+#define extern_gx_image_class_table()\
+ extern const gx_image_class_t gx_image_class_table[]
+extern const unsigned gx_image_class_table_count;
+
+#define extern_gx_image_type_table()\
+ extern const gx_image_type_t * const gx_image_type_table[]
+extern const unsigned gx_image_type_table_count;
+
+/* We need the extra typedef so that the const will apply to the table. */
+#define extern_gx_init_table()\
+ typedef init_proc((*gx_init_proc));\
+ extern const gx_init_proc gx_init_table[]
+
+#define extern_gx_io_device_table()\
+ extern const gx_io_device * const gx_io_device_table[]
+extern const unsigned gx_io_device_table_count;
+
+/* Return the list of device prototypes, a NULL list of their structure */
+/* descriptors (no longer used), and (as the value) the length of the lists. */
+#define extern_gs_lib_device_list()\
+ int gs_lib_device_list(const gx_device * const **plist,\
+ gs_memory_struct_type_t **pst)
+
+/* find a compositor by name */
+#define extern_gs_find_compositor() \
+ const gs_composite_type_t * gs_find_compositor(int comp_id)
+
+#endif /* gscdefs_INCLUDED */
diff --git a/src/gui/gsinc/iapi.h b/src/gui/gsinc/iapi.h
new file mode 100644
index 0000000..938e600
--- /dev/null
+++ b/src/gui/gsinc/iapi.h
@@ -0,0 +1,300 @@
+/* Copyright (C) 2001-2006 artofcode LLC.
+ All Rights Reserved.
+
+ This software is provided AS-IS with no warranty, either express or
+ implied.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/
+ or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
+ San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information.
+*/
+
+/* $Id: iapi.h,v 1.3 2007/08/21 21:39:46 jeans Exp $ */
+
+/*
+ * Public API for Ghostscript interpreter
+ * for use both as DLL and for static linking.
+ *
+ * Should work for Windows, OS/2, Linux, Mac.
+ *
+ * DLL exported functions should be as similar as possible to imain.c
+ * You will need to include "ierrors.h".
+ *
+ * Current problems:
+ * 1. Ghostscript does not support multiple instances.
+ * 2. Global variables in gs_main_instance_default()
+ * and gsapi_instance_counter
+ */
+
+/* Exported functions may need different prefix
+ * GSDLLEXPORT marks functions as exported
+ * GSDLLAPI is the calling convention used on functions exported
+ * by Ghostscript
+ * GSDLLCALL is used on callback functions called by Ghostscript
+ * When you include this header file in the caller, you may
+ * need to change the definitions by defining these
+ * before including this header file.
+ * Make sure you get the calling convention correct, otherwise your
+ * program will crash either during callbacks or soon after returning
+ * due to stack corruption.
+ */
+
+#ifndef iapi_INCLUDED
+# define iapi_INCLUDED
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if defined(_WINDOWS_) || defined(__WINDOWS__)
+# ifndef _Windows
+# define _Windows
+# endif
+#endif
+
+#ifdef _Windows
+# ifndef GSDLLEXPORT
+# define GSDLLEXPORT __declspec(dllexport)
+# endif
+# ifndef GSDLLAPI
+# define GSDLLAPI __stdcall
+# endif
+# ifndef GSDLLCALL
+# define GSDLLCALL __stdcall
+# endif
+#endif /* _Windows */
+
+#if defined(OS2) && defined(__IBMC__)
+# ifndef GSDLLAPI
+# define GSDLLAPI _System
+# endif
+# ifndef GSDLLCALL
+# define GSDLLCALL _System
+# endif
+#endif /* OS2 && __IBMC */
+
+#ifdef __MACOS__
+# pragma export on
+#endif
+
+#ifndef GSDLLEXPORT
+# define GSDLLEXPORT
+#endif
+#ifndef GSDLLAPI
+# define GSDLLAPI
+#endif
+#ifndef GSDLLCALL
+# define GSDLLCALL
+#endif
+
+#if defined(__IBMC__)
+# define GSDLLAPIPTR * GSDLLAPI
+# define GSDLLCALLPTR * GSDLLCALL
+#else
+# define GSDLLAPIPTR GSDLLAPI *
+# define GSDLLCALLPTR GSDLLCALL *
+#endif
+
+#ifndef display_callback_DEFINED
+# define display_callback_DEFINED
+typedef struct display_callback_s display_callback;
+#endif
+
+typedef struct gsapi_revision_s {
+ const char *product;
+ const char *copyright;
+ long revision;
+ long revisiondate;
+} gsapi_revision_t;
+
+
+/* Get version numbers and strings.
+ * This is safe to call at any time.
+ * You should call this first to make sure that the correct version
+ * of the Ghostscript is being used.
+ * pr is a pointer to a revision structure.
+ * len is the size of this structure in bytes.
+ * Returns 0 if OK, or if len too small (additional parameters
+ * have been added to the structure) it will return the required
+ * size of the structure.
+ */
+GSDLLEXPORT int GSDLLAPI
+gsapi_revision(gsapi_revision_t *pr, int len);
+
+/*
+ * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
+ * Ghostscript supports only one instance.
+ * The current implementation uses a global static instance
+ * counter to make sure that only a single instance is used.
+ * If you try to create two instances, the second attempt
+ * will return < 0 and set pinstance to NULL.
+ * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
+ */
+/* Create a new instance of Ghostscript.
+ * This instance is passed to most other API functions.
+ * The caller_handle will be provided to callback functions.
+ */
+
+GSDLLEXPORT int GSDLLAPI
+gsapi_new_instance(void **pinstance, void *caller_handle);
+
+/*
+ * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
+ * Ghostscript supports only one instance.
+ * The current implementation uses a global static instance
+ * counter to make sure that only a single instance is used.
+ * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
+ */
+/* Destroy an instance of Ghostscript
+ * Before you call this, Ghostscript must have finished.
+ * If Ghostscript has been initialised, you must call gsapi_exit()
+ * before gsapi_delete_instance.
+ */
+GSDLLEXPORT void GSDLLAPI
+gsapi_delete_instance(void *instance);
+
+/* Set the callback functions for stdio
+ * The stdin callback function should return the number of
+ * characters read, 0 for EOF, or -1 for error.
+ * The stdout and stderr callback functions should return
+ * the number of characters written.
+ * If a callback address is NULL, the real stdio will be used.
+ */
+GSDLLEXPORT int GSDLLAPI
+gsapi_set_stdio(void *instance,
+ int (GSDLLCALLPTR stdin_fn)(void *caller_handle, char *buf, int len),
+ int (GSDLLCALLPTR stdout_fn)(void *caller_handle, const char *str, int len),
+ int (GSDLLCALLPTR stderr_fn)(void *caller_handle, const char *str, int len));
+
+/* Set the callback function for polling.
+ * This is used for handling window events or cooperative
+ * multitasking. This function will only be called if
+ * Ghostscript was compiled with CHECK_INTERRUPTS
+ * as described in gpcheck.h.
+ * The polling function should return 0 if all is well,
+ * and negative if it wants ghostscript to abort.
+ * The polling function must be fast.
+ */
+GSDLLEXPORT int GSDLLAPI gsapi_set_poll(void *instance,
+ int (GSDLLCALLPTR poll_fn)(void *caller_handle));
+
+/* Set the display device callback structure.
+ * If the display device is used, this must be called
+ * after gsapi_new_instance() and before gsapi_init_with_args().
+ * See gdevdisp.h for more details.
+ */
+GSDLLEXPORT int GSDLLAPI gsapi_set_display_callback(
+ void *instance, display_callback *callback);
+
+
+/* Initialise the interpreter.
+ * This calls gs_main_init_with_args() in imainarg.c
+ * 1. If quit or EOF occur during gsapi_init_with_args(),
+ * the return value will be e_Quit. This is not an error.
+ * You must call gsapi_exit() and must not call any other
+ * gsapi_XXX functions.
+ * 2. If usage info should be displayed, the return value will be e_Info
+ * which is not an error. Do not call gsapi_exit().
+ * 3. Under normal conditions this returns 0. You would then
+ * call one or more gsapi_run_*() functions and then finish
+ * with gsapi_exit().
+ */
+GSDLLEXPORT int GSDLLAPI gsapi_init_with_args(void *instance,
+ int argc, char **argv);
+
+/*
+ * The gsapi_run_* functions are like gs_main_run_* except
+ * that the error_object is omitted.
+ * If these functions return <= -100, either quit or a fatal
+ * error has occured. You then call gsapi_exit() next.
+ * The only exception is gsapi_run_string_continue()
+ * which will return e_NeedInput if all is well.
+ */
+
+GSDLLEXPORT int GSDLLAPI
+gsapi_run_string_begin(void *instance,
+ int user_errors, int *pexit_code);
+
+GSDLLEXPORT int GSDLLAPI
+gsapi_run_string_continue(void *instance,
+ const char *str, unsigned int length, int user_errors, int *pexit_code);
+
+GSDLLEXPORT int GSDLLAPI
+gsapi_run_string_end(void *instance,
+ int user_errors, int *pexit_code);
+
+GSDLLEXPORT int GSDLLAPI
+gsapi_run_string_with_length(void *instance,
+ const char *str, unsigned int length, int user_errors, int *pexit_code);
+
+GSDLLEXPORT int GSDLLAPI
+gsapi_run_string(void *instance,
+ const char *str, int user_errors, int *pexit_code);
+
+GSDLLEXPORT int GSDLLAPI
+gsapi_run_file(void *instance,
+ const char *file_name, int user_errors, int *pexit_code);
+
+
+/* Exit the interpreter.
+ * This must be called on shutdown if gsapi_init_with_args()
+ * has been called, and just before gsapi_delete_instance().
+ */
+GSDLLEXPORT int GSDLLAPI
+gsapi_exit(void *instance);
+
+/* Visual Tracer */
+/* This function is only for debug purpose clients */
+struct vd_trace_interface_s;
+GSDLLEXPORT void GSDLLAPI
+gsapi_set_visual_tracer(struct vd_trace_interface_s *I);
+
+
+/* function prototypes */
+typedef int (GSDLLAPIPTR PFN_gsapi_revision)(
+ gsapi_revision_t *pr, int len);
+typedef int (GSDLLAPIPTR PFN_gsapi_new_instance)(
+ void **pinstance, void *caller_handle);
+typedef void (GSDLLAPIPTR PFN_gsapi_delete_instance)(
+ void *instance);
+typedef int (GSDLLAPIPTR PFN_gsapi_set_stdio)(void *instance,
+ int (GSDLLCALLPTR stdin_fn)(void *caller_handle, char *buf, int len),
+ int (GSDLLCALLPTR stdout_fn)(void *caller_handle, const char *str, int len),
+ int (GSDLLCALLPTR stderr_fn)(void *caller_handle, const char *str, int len));
+typedef int (GSDLLAPIPTR PFN_gsapi_set_poll)(void *instance,
+ int(GSDLLCALLPTR poll_fn)(void *caller_handle));
+typedef int (GSDLLAPIPTR PFN_gsapi_set_display_callback)(
+ void *instance, display_callback *callback);
+typedef int (GSDLLAPIPTR PFN_gsapi_init_with_args)(
+ void *instance, int argc, char **argv);
+typedef int (GSDLLAPIPTR PFN_gsapi_run_string_begin)(
+ void *instance, int user_errors, int *pexit_code);
+typedef int (GSDLLAPIPTR PFN_gsapi_run_string_continue)(
+ void *instance, const char *str, unsigned int length,
+ int user_errors, int *pexit_code);
+typedef int (GSDLLAPIPTR PFN_gsapi_run_string_end)(
+ void *instance, int user_errors, int *pexit_code);
+typedef int (GSDLLAPIPTR PFN_gsapi_run_string_with_length)(
+ void *instance, const char *str, unsigned int length,
+ int user_errors, int *pexit_code);
+typedef int (GSDLLAPIPTR PFN_gsapi_run_string)(
+ void *instance, const char *str,
+ int user_errors, int *pexit_code);
+typedef int (GSDLLAPIPTR PFN_gsapi_run_file)(void *instance,
+ const char *file_name, int user_errors, int *pexit_code);
+typedef int (GSDLLAPIPTR PFN_gsapi_exit)(void *instance);
+typedef void (GSDLLAPIPTR PFN_gsapi_set_visual_tracer)
+ (struct vd_trace_interface_s *I);
+
+
+#ifdef __MACOS__
+#pragma export off
+#endif
+
+#ifdef __cplusplus
+} /* extern 'C' protection */
+#endif
+
+#endif /* iapi_INCLUDED */
diff --git a/src/gui/gsinc/ierrors.h b/src/gui/gsinc/ierrors.h
new file mode 100644
index 0000000..70f3278
--- /dev/null
+++ b/src/gui/gsinc/ierrors.h
@@ -0,0 +1,165 @@
+/* Copyright (C) 2001-2006 artofcode LLC.
+ All Rights Reserved.
+
+ This software is provided AS-IS with no warranty, either express or
+ implied.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/
+ or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
+ San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information.
+*/
+
+/* $Id: ierrors.h,v 1.3 2008/06/14 19:41:57 jeans Exp $ */
+/* Definition of error codes */
+
+#ifndef ierrors_INCLUDED
+# define ierrors_INCLUDED
+
+/*
+ * DO NOT USE THIS FILE IN THE GRAPHICS LIBRARY.
+ * THIS FILE IS PART OF THE POSTSCRIPT INTERPRETER.
+ * USE gserrors.h IN THE LIBRARY.
+ */
+
+/*
+ * A procedure that may return an error always returns
+ * a non-negative value (zero, unless otherwise noted) for success,
+ * or negative for failure.
+ * We use ints rather than an enum to avoid a lot of casting.
+ */
+
+/* Define the error name table */
+extern const char *const gs_error_names[];
+
+ /* ------ PostScript Level 1 errors ------ */
+
+#define e_unknownerror (-1) /* unknown error */
+#define e_dictfull (-2)
+#define e_dictstackoverflow (-3)
+#define e_dictstackunderflow (-4)
+#define e_execstackoverflow (-5)
+#define e_interrupt (-6)
+/* We also need to define gs_error_interrupt, for gpcheck.h. */
+#undef gs_error_interrupt
+#define gs_error_interrupt e_interrupt
+#define e_invalidaccess (-7)
+#define e_invalidexit (-8)
+#define e_invalidfileaccess (-9)
+#define e_invalidfont (-10)
+#define e_invalidrestore (-11)
+#define e_ioerror (-12)
+#define e_limitcheck (-13)
+#define e_nocurrentpoint (-14)
+#define e_rangecheck (-15)
+#define e_stackoverflow (-16)
+#define e_stackunderflow (-17)
+#define e_syntaxerror (-18)
+#define e_timeout (-19)
+#define e_typecheck (-20)
+#define e_undefined (-21)
+#define e_undefinedfilename (-22)
+#define e_undefinedresult (-23)
+#define e_unmatchedmark (-24)
+#define e_VMerror (-25)
+
+#define LEVEL1_ERROR_NAMES\
+ "unknownerror", "dictfull", "dictstackoverflow", "dictstackunderflow",\
+ "execstackoverflow", "interrupt", "invalidaccess", "invalidexit",\
+ "invalidfileaccess", "invalidfont", "invalidrestore", "ioerror",\
+ "limitcheck", "nocurrentpoint", "rangecheck", "stackoverflow",\
+ "stackunderflow", "syntaxerror", "timeout", "typecheck", "undefined",\
+ "undefinedfilename", "undefinedresult", "unmatchedmark", "VMerror"
+
+ /* ------ Additional Level 2 and DPS errors ------ */
+
+#define e_configurationerror (-26)
+#define e_invalidcontext (-27)
+#define e_undefinedresource (-28)
+#define e_unregistered (-29)
+/* invalidid is for the NeXT DPS extension. */
+#define e_invalidid (-30)
+
+#define LEVEL2_ERROR_NAMES\
+ "configurationerror", "invalidcontext", "undefinedresource",\
+ "unregistered", "invalidid"
+
+#define ERROR_NAMES LEVEL1_ERROR_NAMES, LEVEL2_ERROR_NAMES
+
+ /* ------ Pseudo-errors used internally ------ */
+
+/*
+ * Internal code for a fatal error.
+ * gs_interpret also returns this for a .quit with a positive exit code.
+ */
+#define e_Fatal (-100)
+
+/*
+ * Internal code for the .quit operator.
+ * The real quit code is an integer on the operand stack.
+ * gs_interpret returns this only for a .quit with a zero exit code.
+ */
+#define e_Quit (-101)
+
+/*
+ * Internal code for a normal exit from the interpreter.
+ * Do not use outside of interp.c.
+ */
+#define e_InterpreterExit (-102)
+
+/*
+ * Internal code that indicates that a procedure has been stored in the
+ * remap_proc of the graphics state, and should be called before retrying
+ * the current token. This is used for color remapping involving a call
+ * back into the interpreter -- inelegant, but effective.
+ */
+#define e_RemapColor (-103)
+
+/*
+ * Internal code to indicate we have underflowed the top block
+ * of the e-stack.
+ */
+#define e_ExecStackUnderflow (-104)
+
+/*
+ * Internal code for the vmreclaim operator with a positive operand.
+ * We need to handle this as an error because otherwise the interpreter
+ * won't reload enough of its state when the operator returns.
+ */
+#define e_VMreclaim (-105)
+
+/*
+ * Internal code for requesting more input from run_string.
+ */
+#define e_NeedInput (-106)
+
+/*
+ * Internal code for stdin callout.
+ */
+#define e_NeedStdin (-107)
+
+/*
+ * Internal code for stdout callout.
+ */
+#define e_NeedStdout (-108)
+
+/*
+ * Internal code for stderr callout.
+ */
+#define e_NeedStderr (-109)
+
+/*
+ * Internal code for a normal exit when usage info is displayed.
+ * This allows Window versions of Ghostscript to pause until
+ * the message can be read.
+ */
+#define e_Info (-110)
+
+/*
+ * Define which error codes require re-executing the current object.
+ */
+#define ERROR_IS_INTERRUPT(ecode)\
+ ((ecode) == e_interrupt || (ecode) == e_timeout)
+
+#endif /* ierrors_INCLUDED */
diff --git a/src/gui/images/amove.png b/src/gui/images/amove.png
new file mode 100644
index 0000000..2d16432
Binary files /dev/null and b/src/gui/images/amove.png differ
diff --git a/src/gui/images/arc_3p.png b/src/gui/images/arc_3p.png
new file mode 100644
index 0000000..1e142db
Binary files /dev/null and b/src/gui/images/arc_3p.png differ
diff --git a/src/gui/images/circle.png b/src/gui/images/circle.png
new file mode 100644
index 0000000..a9ec1b6
Binary files /dev/null and b/src/gui/images/circle.png differ
diff --git a/src/gui/images/edit_mode.png b/src/gui/images/edit_mode.png
new file mode 100644
index 0000000..477c2eb
Binary files /dev/null and b/src/gui/images/edit_mode.png differ
diff --git a/src/gui/images/editor.png b/src/gui/images/editor.png
new file mode 100644
index 0000000..ba00b34
Binary files /dev/null and b/src/gui/images/editor.png differ
diff --git a/src/gui/images/ellipse.png b/src/gui/images/ellipse.png
new file mode 100644
index 0000000..edf5a0b
Binary files /dev/null and b/src/gui/images/ellipse.png differ
diff --git a/src/gui/images/ellipsis.png b/src/gui/images/ellipsis.png
new file mode 100644
index 0000000..0dff13e
Binary files /dev/null and b/src/gui/images/ellipsis.png differ
diff --git a/src/gui/images/gle.icns b/src/gui/images/gle.icns
new file mode 100644
index 0000000..4c6b9dd
Binary files /dev/null and b/src/gui/images/gle.icns differ
diff --git a/src/gui/images/gle.ico b/src/gui/images/gle.ico
new file mode 100644
index 0000000..3432843
Binary files /dev/null and b/src/gui/images/gle.ico differ
diff --git a/src/gui/images/gle.png b/src/gui/images/gle.png
new file mode 100644
index 0000000..5c1d532
Binary files /dev/null and b/src/gui/images/gle.png differ
diff --git a/src/gui/images/gle_icon.png b/src/gui/images/gle_icon.png
new file mode 100644
index 0000000..2c2d5e0
Binary files /dev/null and b/src/gui/images/gle_icon.png differ
diff --git a/src/gui/images/gle_shadow.png b/src/gui/images/gle_shadow.png
new file mode 100644
index 0000000..7e4c45d
Binary files /dev/null and b/src/gui/images/gle_shadow.png differ
diff --git a/src/gui/images/grid.png b/src/gui/images/grid.png
new file mode 100644
index 0000000..474e81d
Binary files /dev/null and b/src/gui/images/grid.png differ
diff --git a/src/gui/images/grid_snap.png b/src/gui/images/grid_snap.png
new file mode 100644
index 0000000..9757c13
Binary files /dev/null and b/src/gui/images/grid_snap.png differ
diff --git a/src/gui/images/line.png b/src/gui/images/line.png
new file mode 100644
index 0000000..143e4c6
Binary files /dev/null and b/src/gui/images/line.png differ
diff --git a/src/gui/images/new.png b/src/gui/images/new.png
new file mode 100644
index 0000000..4c56d58
Binary files /dev/null and b/src/gui/images/new.png differ
diff --git a/src/gui/images/open.png b/src/gui/images/open.png
new file mode 100644
index 0000000..0bd22e7
Binary files /dev/null and b/src/gui/images/open.png differ
diff --git a/src/gui/images/orthosnap.png b/src/gui/images/orthosnap.png
new file mode 100644
index 0000000..f1e5bd4
Binary files /dev/null and b/src/gui/images/orthosnap.png differ
diff --git a/src/gui/images/osnap.png b/src/gui/images/osnap.png
new file mode 100644
index 0000000..bc7bf22
Binary files /dev/null and b/src/gui/images/osnap.png differ
diff --git a/src/gui/images/perp_line.png b/src/gui/images/perp_line.png
new file mode 100644
index 0000000..2b84afa
Binary files /dev/null and b/src/gui/images/perp_line.png differ
diff --git a/src/gui/images/pointer.png b/src/gui/images/pointer.png
new file mode 100644
index 0000000..3565af3
Binary files /dev/null and b/src/gui/images/pointer.png differ
diff --git a/src/gui/images/polarsnap.png b/src/gui/images/polarsnap.png
new file mode 100644
index 0000000..669118a
Binary files /dev/null and b/src/gui/images/polarsnap.png differ
diff --git a/src/gui/images/polartrack.png b/src/gui/images/polartrack.png
new file mode 100644
index 0000000..28372c8
Binary files /dev/null and b/src/gui/images/polartrack.png differ
diff --git a/src/gui/images/preview_mode.png b/src/gui/images/preview_mode.png
new file mode 100644
index 0000000..0bfd639
Binary files /dev/null and b/src/gui/images/preview_mode.png differ
diff --git a/src/gui/images/reload.png b/src/gui/images/reload.png
new file mode 100644
index 0000000..f26cf37
Binary files /dev/null and b/src/gui/images/reload.png differ
diff --git a/src/gui/images/reload_red.png b/src/gui/images/reload_red.png
new file mode 100644
index 0000000..85a20a7
Binary files /dev/null and b/src/gui/images/reload_red.png differ
diff --git a/src/gui/images/save.png b/src/gui/images/save.png
new file mode 100644
index 0000000..22fbda1
Binary files /dev/null and b/src/gui/images/save.png differ
diff --git a/src/gui/images/tan_line.png b/src/gui/images/tan_line.png
new file mode 100644
index 0000000..5d8394d
Binary files /dev/null and b/src/gui/images/tan_line.png differ
diff --git a/src/gui/images/text.png b/src/gui/images/text.png
new file mode 100644
index 0000000..42f2f08
Binary files /dev/null and b/src/gui/images/text.png differ
diff --git a/src/gui/images/varyingcolours.png b/src/gui/images/varyingcolours.png
new file mode 100644
index 0000000..1ab4754
Binary files /dev/null and b/src/gui/images/varyingcolours.png differ
diff --git a/src/gui/images/zoom_in.png b/src/gui/images/zoom_in.png
new file mode 100644
index 0000000..ecd0972
Binary files /dev/null and b/src/gui/images/zoom_in.png differ
diff --git a/src/gui/images/zoom_out.png b/src/gui/images/zoom_out.png
new file mode 100644
index 0000000..e199452
Binary files /dev/null and b/src/gui/images/zoom_out.png differ
diff --git a/src/gui/line.cpp b/src/gui/line.cpp
new file mode 100644
index 0000000..6964dbb
--- /dev/null
+++ b/src/gui/line.cpp
@@ -0,0 +1,449 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+#include "line.h"
+
+// The constructor for the line object
+GLELine::GLELine(double resolution, QSize imageSize, GLEDrawingArea *area) :
+ GLEDrawingObject(resolution, imageSize, area)
+{
+ // Make sure the line is updated if a point changes or
+ // the image size changes
+ connect(this, SIGNAL(pointChanged()),
+ this, SLOT(updateLine()));
+ connect(this, SIGNAL(imageChanged()),
+ this, SLOT(updateLine()));
+ connect(this, SIGNAL(propertyChanged(int)),
+ this, SLOT(updateFromProperty(int)));
+
+ validProperties
+ << LineColour
+ << LineWidth
+ << LineStyle
+ << ArrowHeadPresence;
+ properties[LineColour] = propertyDescriptions[LineColour].defaultValue;
+ properties[LineWidth] = propertyDescriptions[LineWidth].defaultValue;
+ properties[LineStyle] = propertyDescriptions[LineStyle].defaultValue;
+ properties[ArrowHeadPresence] = propertyDescriptions[ArrowHeadPresence].defaultValue;
+
+ amove = false;
+}
+
+// Update the painter path
+void GLELine::updateLine()
+{
+ // Only do this if both the start and end have been set
+ if (isSet(StartPoint) && isSet(EndPoint))
+ {
+ // This is guaranteed to have been created in the constructor
+ // of GLEDrawingObject
+ delete(paintPath);
+ // Create a new path starting at lineStart
+ paintPath = new QPainterPath(getQtPoint(StartPoint));
+ // Make it a line ending at lineEnd
+ paintPath->lineTo(getQtPoint(EndPoint));
+
+ // Update GLE object
+ GLELineDO* line = (GLELineDO*)getGLEObject();
+ if (line != NULL) {
+ line->setP1(QGLE::QPointFToGLEPoint(getGLEPoint(StartPoint)));
+ line->setP2(QGLE::QPointFToGLEPoint(getGLEPoint(EndPoint)));
+ }
+
+ osnapHandles.clear();
+ QPointF s = getQtPoint(StartPoint);
+ QPointF e = getQtPoint(EndPoint);
+ osnapHandles.append(QPair<QPointF,int>(s,QGLE::EndPointSnap));
+ osnapHandles.append(QPair<QPointF,int>(e,QGLE::EndPointSnap));
+ osnapHandles.append(QPair<QPointF,int>((s+e)/2,QGLE::MidPointSnap));
+ }
+}
+
+void GLELine::updateFromProperty(int prop)
+{
+ GLELineDO* obj = (GLELineDO*)getGLEObject();
+ GLEPropertyStore* obj_prop = obj->getProperties();
+
+ double lwd = getProperty(LineWidth).toDouble();
+ obj_prop->setRealProperty(GLEDOPropertyLineWidth, lwd);
+ QColor color = getProperty(LineColour).value<QColor>();
+ GLEColor* gle_color = obj_prop->getColorProperty(GLEDOPropertyColor);
+ gle_color->setRGB255(color.red(), color.green(), color.blue());
+ QGLE::qtToGLEString(getProperty(LineStyle).toString(), obj_prop->getStringProperty(GLEDOPropertyLineStyle));
+ obj->setArrow((GLEHasArrow)getProperty(ArrowHeadPresence).toInt());
+ if (prop == LineWidth) {
+ GLESetDefaultArrowProperties(lwd, obj_prop);
+ }
+ ((GLEDrawingArea*)parent())->setDirtyAndSave();
+}
+
+void GLELine::createOTracks()
+{
+ if (isSet(StartPoint) && isSet(EndPoint))
+ {
+ // TODO: create some snap lines!
+ // Also need to implement the necessary functionality
+ // in gledrawing.cpp
+ }
+}
+
+void GLELine::addRelativeOSnaps(QPointF p)
+{
+ if (isSet(StartPoint) && isSet(EndPoint))
+ {
+ // qDebug() << "Adding osnap relative to " << QGLE::absQtToGLE(p,dpi,pixmap.height());
+ relativeOSnaps.clear();
+ QPointF np;
+ distanceToPoint(p,&np);
+ // qDebug() << "Nearest point: " << QGLE::absQtToGLE(np,dpi,pixmap.height());
+ if ((np == getQtPoint(StartPoint)) || (np == getQtPoint(EndPoint)))
+ return;
+ relativeOSnaps.append(QPair<QPointF,int>(np,QGLE::PerpendicularSnap));
+ }
+ // qDebug() << "Added relative OSNAP";
+}
+
+QList<QPointF> GLELine::getTangents(QPointF)
+{
+ QList<QPointF> empty;
+ return(empty);
+}
+
+bool GLELine::hasTangents()
+{
+ return(false);
+}
+
+QList<QPointF> GLELine::getPerpendiculars(QPointF p)
+{
+ QList<QPointF> perpendiculars;
+ QPointF np;
+ distanceToPoint(p,&np);
+ if ((np == getQtPoint(StartPoint)) || (np == getQtPoint(EndPoint)))
+ return(perpendiculars);
+
+ perpendiculars.append(np);
+ return(perpendiculars);
+}
+
+bool GLELine::hasPerpendiculars()
+{
+ return(true);
+}
+
+
+void GLELine::draw(QPainter *p)
+{
+ QPen cpen;
+ setPenProperties(cpen);
+ GLELineDO* obj = (GLELineDO*)getGLEObject();
+ if (obj != NULL && obj->getArrow() != 0) {
+ GLEArrowPoints pts1, pts2;
+ GLEPoint start_pt(getQtPoint(StartPoint).x(), getQtPoint(StartPoint).y());
+ GLEPoint end_pt(getQtPoint(EndPoint).x(), getQtPoint(EndPoint).y());
+ double dx = end_pt.getX()-start_pt.getX();
+ double dy = end_pt.getY()-start_pt.getY();
+ GLEGetArrowPoints(start_pt, dx, dy, obj->getProperties(), dpi/CM_PER_INCH, &pts1);
+ GLEGetArrowPoints(end_pt, -dx, -dy, obj->getProperties(), dpi/CM_PER_INCH, &pts2);
+ QPen new_pen = cpen;
+ int tip = obj->getProperties()->getIntProperty(GLEDOPropertyArrowTip);
+ int style = obj->getProperties()->getIntProperty(GLEDOPropertyArrowStyle);
+ if (tip == GLEArrowTipRound) new_pen.setJoinStyle(Qt::RoundJoin);
+ else new_pen.setJoinStyle(Qt::MiterJoin);
+ new_pen.setMiterLimit(20);
+ new_pen.setStyle(Qt::SolidLine);
+ GLEHasArrow arrow = obj->getArrow();
+ if ((arrow & GLEHasArrowStart) != 0) start_pt.setXY(pts1.xl, pts1.yl);
+ if ((arrow & GLEHasArrowEnd) != 0) end_pt.setXY(pts2.xl, pts2.yl);
+ p->setPen(cpen);
+ p->drawLine(QPointF(start_pt.getX(), start_pt.getY()), QPointF(end_pt.getX(), end_pt.getY()));
+ p->setPen(new_pen);
+ if ((arrow & GLEHasArrowStart) != 0) {
+ QPointF poly[3];
+ poly[0] = QPointF(pts1.xa, pts1.ya);
+ poly[1] = QPointF(pts1.xt, pts1.yt);
+ poly[2] = QPointF(pts1.xb, pts1.yb);
+ if (style == GLEArrowStyleFilled) {
+ QColor col;
+ GLEColor* color = obj->getProperties()->getColorProperty(GLEDOPropertyColor);
+ col.setRgbF(color->getRed(), color->getGreen(), color->getBlue());
+ p->setBrush(QBrush(col));
+ } else {
+ p->setBrush(QBrush(Qt::white));
+ }
+ if (style == GLEArrowStyleSimple) p->drawPolyline(poly, 3);
+ else p->drawConvexPolygon(poly, 3);
+ }
+ if ((arrow & GLEHasArrowEnd) != 0) {
+ QPointF poly[3];
+ poly[0] = QPointF(pts2.xa, pts2.ya);
+ poly[1] = QPointF(pts2.xt, pts2.yt);
+ poly[2] = QPointF(pts2.xb, pts2.yb);
+ if (style == GLEArrowStyleFilled) {
+ QColor col;
+ GLEColor* color = obj->getProperties()->getColorProperty(GLEDOPropertyColor);
+ col.setRgbF(color->getRed(), color->getGreen(), color->getBlue());
+ p->setBrush(QBrush(col));
+ } else {
+ p->setBrush(QBrush(Qt::white));
+ }
+ if (style == GLEArrowStyleSimple) p->drawPolyline(poly, 3);
+ else p->drawConvexPolygon(poly, 3);
+ }
+ } else {
+ p->setPen(cpen);
+ p->drawLine(getQtPoint(StartPoint),getQtPoint(EndPoint));
+ }
+}
+
+
+double GLELine::distanceToPoint(const QPointF& p, QPointF *nearestPoint)
+{
+ // All calculations in QT coordinates
+ // Distances between start, end and the point
+ double se, sp, ep;
+ QPointF s, e;
+ // Angle between se and sp
+ double pse;
+ // Angle between se and ep
+ double pes;
+
+
+ /****************************************************************************
+ * This calculation is based on the triangle: *
+ * p *
+ * /\ *
+ * / \ *
+ * s<____>e *
+ * *
+ * where s and e are the end points of the line and p is the point that has *
+ * been clicked. If the angle pse (calculated using the cosine rule: a^2 = *
+ * b^2 + c^2 -2.b.c.cosA) is greater than 90�, the distance to the point is *
+ * the same as the line length s-p. Likewise for the angle pes and the *
+ * line length e-p. If both angles are less than 90�, the distance can be *
+ * calculated simply. The shortest distance will be the length of the line *
+ * from p to the line se that meets the line at 90�, thus: *
+ * p *
+ * /| *
+ * / | *
+ * s<__|__e *
+ * The distance is therefore sp*sin(pse). *
+ ****************************************************************************/
+
+ s = getQtPoint(StartPoint);
+ e = getQtPoint(EndPoint);
+
+ se = QGLE::distance(s,e);
+ sp = QGLE::distance(s,p);
+ ep = QGLE::distance(e,p);
+
+ //qDebug() << "Distances: " << se << " " << sp << " " << ep;
+
+ if ((sp == 0.0) || (ep == 0.0))
+ return(0.0);
+
+ if (se == 0.0)
+ return(sp);
+
+ double ac;
+
+ // Calculated the bit inside the 'acos'
+ ac = (se*se + sp*sp - ep*ep)/(2*se*sp);
+ // Make sure it isn't greater than 1
+ if (ac > 1.0)
+ ac = 1.0;
+ else if (ac < -1.0)
+ ac = -1.0;
+ pse = acos(ac);
+
+ // Calculated the bit inside the 'acos'
+ ac = (se*se + ep*ep - sp*sp)/(2*se*ep);
+ // Make sure it isn't greater than 1
+ if (ac > 1.0)
+ ac = 1.0;
+ else if (ac < -1.0)
+ ac = -1.0;
+ pes = acos(ac);
+
+ //qDebug() << "Angles: " << pse << " " << pes;
+
+ if ( pse >= M_PI/2.0 )
+ {
+ if (nearestPoint)
+ *nearestPoint = s;
+ return(sp);
+ }
+ else if ( pes >= M_PI/2.0 )
+ {
+ if (nearestPoint)
+ *nearestPoint = e;
+ return(ep);
+ }
+ else
+ {
+ if (nearestPoint)
+ *nearestPoint = (sp*cos(pse)/se)*(e-s) + s;
+ return(sp*sin(pse));
+ }
+}
+
+// Set a point (start or end in the case of a line)
+void GLELine::setPoint(int pointChoice, const QPointF& p, bool update)
+{
+ switch(pointChoice)
+ {
+ case EndPoint:
+ case StartPoint:
+ pointHash[pointChoice] = QGLE::absQtToGLE(p, dpi, pixmap.height());
+ break;
+ }
+ if (update) updateLine();
+}
+
+QList<QPointF> GLELine::intersections(double qtm, double qtc, bool vertical)
+{
+ QList<QPointF> pointArray;
+ QPointF sp, ep;
+ QPointF intersect;
+ sp = getQtPoint(StartPoint);
+ ep = getQtPoint(EndPoint);
+ double mym, myc;
+ if (vertical)
+ {
+ // If both lines are vertical, no intersection (or an infinite number)
+ if ((!(sp.x() == ep.x())) && (QGLE::inOrder(sp.x(), qtm, ep.x())))
+ {
+ // Lines intersect
+ intersect = QPointF(qtm, ((qtm-sp.x())/(ep.x()-sp.x()))*(ep.y()-sp.y())+sp.y());
+ pointArray.append(intersect);
+ }
+ }
+ else
+ {
+
+ // Not vertical
+ if (sp.x() == ep.x())
+ {
+ // But this line is!
+ intersect.setX(sp.x());
+ intersect.setY(qtm*sp.x()+qtc);
+ if (QGLE::inOrder(sp.y(),intersect.y(),ep.y()))
+ pointArray.append(intersect);
+ }
+ else
+ {
+ // Neither line is vertical
+ mym = (ep.y()-sp.y())/(ep.x()-sp.x());
+ myc = ep.y() - mym*ep.x();
+
+ intersect.setX((myc-qtc)/(qtm-mym));
+ intersect.setY(mym*intersect.x()+myc);
+
+ if ((QGLE::inOrder(sp.y(),intersect.y(),ep.y())) &&
+ (QGLE::inOrder(sp.x(), intersect.x(), ep.x())))
+ pointArray.append(intersect);
+ }
+ }
+
+ return(pointArray);
+}
+
+
+
+
+
+QList<QPointF> GLELine::intersections(QPointF qtp1, QPointF qtp2)
+{
+ double m, c;
+ if (qtp2.x() == qtp1.x())
+ return(intersections(qtp2.x(), 0, true));
+
+ m = (qtp2.y() - qtp1.y())/(qtp2.x()-qtp1.x());
+ c = qtp2.y() - m*qtp2.x();
+
+ return(intersections(m,c,false));
+}
+
+QList<QPointF> GLELine::intersections(QPointF qtp1, double angle)
+{
+ // This intersection code must determine the intersections in
+ // a particular direction from a start point
+
+ // First get a list based on an infinite line:
+ QPointF qtp2 = qtp1 + QPointF(1.0*cos(angle),1.0*sin(angle));
+ QList<QPointF> allIntersections = intersections(qtp1,qtp2);
+
+ // Now go through the list and determine which are in the right
+ // direction
+ QList<QPointF> correctIntersections;
+ QPointF pt;
+ double ptAngle;
+
+ foreach(pt, allIntersections)
+ {
+ ptAngle = QGLE::angleBetweenTwoPoints(qtp1, pt);
+ if (QGLE::quadrant(ptAngle) == QGLE::quadrant(angle))
+ correctIntersections.append(pt);
+ }
+
+ return(correctIntersections);
+
+}
+
+bool GLELine::isInside(QPointF p)
+{
+ UNUSED_ARG(p);
+ return(false);
+}
+
+int GLELine::supportedTransformMode()
+{
+ return TransformModeFree;
+}
+
+void GLELine::linearTransform(const GLELinearEquation& ex, const GLELinearEquation& ey)
+{
+ pointHash.clear();
+ linearTransformPt(StartPoint, ex, ey, false);
+ linearTransformPt(EndPoint, ex, ey, false);
+ updateLine();
+}
+
+void GLELine::moveBy(QPointF offset)
+{
+ pointHash.clear();
+ // Moves relative to storedPointHash
+ QPointF start = getQtPoint(StartPoint, true);
+ setPoint(StartPoint, start + offset, false);
+ QPointF end = getQtPoint(EndPoint, true);
+ setPoint(EndPoint, end + offset, false);
+ updateLine();
+}
+
+void GLELine::rotateBy(double radians)
+{
+ pointHash.clear();
+ // Moves relative to storedPointHash
+ QPointF start = getQtPoint(StartPoint, true);
+ setPoint(StartPoint, QGLE::rotateAboutPoint(start, radians, basePoint));
+ QPointF end = getQtPoint(EndPoint, true);
+ setPoint(EndPoint, QGLE::rotateAboutPoint(end, radians, basePoint));
+}
diff --git a/src/gui/line.h b/src/gui/line.h
new file mode 100644
index 0000000..814bec0
--- /dev/null
+++ b/src/gui/line.h
@@ -0,0 +1,78 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+#ifndef _GLELINE_H
+#define _GLELINE_H
+
+#include "drawingobject.h"
+
+//! Class describing a line drawing object
+class GLELine : public GLEDrawingObject
+{
+ Q_OBJECT
+
+public:
+
+ //! Enumeration of the points needed to draw a line
+ enum Points
+ {
+ StartPoint,
+ EndPoint
+ };
+
+ //! Constructor used for initialising variables and connections
+ GLELine(double resolution, QSize imageSize, GLEDrawingArea *area);
+
+ //! Draw the line on the provided painter
+ void draw(QPainter *p);
+ //! Return the shortest distance between a given point and the line
+ double distanceToPoint(const QPointF& p, QPointF *nearestPoint);
+ //! Set one of the enumerated points
+ void setPoint(int pointChoice, const QPointF& p, bool update = true);
+ void addRelativeOSnaps(QPointF p);
+
+ void createOTracks();
+
+ //! Find points where a line intersects the line
+ // If vertical = true, m contains 'x'
+ QList<QPointF> intersections(double qtm, double qtc, bool vertical = false);
+ QList<QPointF> intersections(QPointF qtp1, double angle);
+ QList<QPointF> intersections(QPointF qtp1, QPointF qtp2);
+ QList<QPointF> getTangents(QPointF p);
+ bool hasTangents();
+ QList<QPointF> getPerpendiculars(QPointF p);
+ bool hasPerpendiculars();
+
+ //! Is the point inside the object (for a line, always false)
+ bool isInside(QPointF p);
+
+ int supportedTransformMode();
+ void linearTransform(const GLELinearEquation& ex, const GLELinearEquation& ey);
+ void moveBy(QPointF offset);
+ void rotateBy(double radians);
+
+private slots:
+ //! Update the painter path when the resolution or start/end points change
+ void updateLine();
+ void updateFromProperty(int property);
+};
+
+#endif
diff --git a/src/gui/macspecific.cpp b/src/gui/macspecific.cpp
new file mode 100644
index 0000000..0ec0024
--- /dev/null
+++ b/src/gui/macspecific.cpp
@@ -0,0 +1,52 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+#include <Carbon/Carbon.h>
+
+#include <string>
+#include <fstream>
+
+using namespace std;
+
+bool copyPDFMac(const string& fname) {
+ CFMutableDataRef data = CFDataCreateMutable(kCFAllocatorDefault, 0);
+ if (data != NULL) {
+ char buffer[10000];
+ ifstream file;
+ file.open(fname.c_str());
+ if (file.is_open()) {
+ while (file.good()) {
+ file.read(buffer, 9000);
+ CFDataAppendBytes(data, (const UInt8*)buffer, file.gcount());
+ }
+ file.close();
+ // copy PDF to clipboard
+ PasteboardRef clipboard = NULL;
+ PasteboardCreate(kPasteboardClipboard, &clipboard);
+ PasteboardClear(clipboard);
+ PasteboardPutItemFlavor(clipboard, (PasteboardItemID) 1, kUTTypePDF, data, kPasteboardFlavorNoFlags);
+ CFRelease(clipboard);
+ CFRelease(data);
+ return true;
+ }
+ }
+ return false;
+}
diff --git a/src/gui/main.cpp b/src/gui/main.cpp
new file mode 100644
index 0000000..2a41219
--- /dev/null
+++ b/src/gui/main.cpp
@@ -0,0 +1,285 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+/******************************************************************************
+ * main.cpp: Contains the main function. As with all QT main functions, this *
+ * is very sparse: create the application object and show the main window. *
+ ******************************************************************************/
+
+#include <QApplication>
+#include "mainwindow.h"
+#include "dialogues.h"
+
+#ifdef Q_WS_WIN
+ #include <windows.h>
+#endif
+
+#include <locale.h>
+
+void findDependencies(int argc, char** argv, int argi) {
+ GLEInterface* gleInterface = GLEGetInterfacePointer();
+ SoftwareLocateDialogue dial(NULL, gleInterface, 0);
+ dial.setWindowTitle("GLE - Finding Dependencies");
+ if (gleInterface->initializeGLE("qgle", argc, argv)) {
+ if (argi+1 < argc) {
+ QString file = QString::fromUtf8(argv[argi+1]);
+ QFileInfo fileinfo(file);
+ if (fileinfo.exists()) {
+ if (fileinfo.isDir()) {
+ dial.setRootDir(file);
+ } else {
+ int ret = QMessageBox::question(&dial, dial.tr("QGLE"),
+ dial.tr("Import settings from previous GLE installation?"),
+ QMessageBox::Yes | QMessageBox::No);
+ if (ret == QMessageBox::Yes) {
+ dial.setRootDir(file);
+ }
+ }
+ }
+ }
+ dial.searchAuto();
+ dial.exec();
+ gleInterface->saveRCFile();
+ } else {
+ dial.disableAll();
+ dial.enableOK(true);
+ dial.exec();
+ }
+}
+
+void doQGLECrashRecover(QString file) {
+ CrashRecoverDialogue dial(file);
+ dial.exec();
+ QDir dir;
+ dir.remove(file);
+}
+
+#define QGLE_SCRIPT_NAME_BACKUP_SIZE 1000
+char QGLEScriptNameBackup[QGLE_SCRIPT_NAME_BACKUP_SIZE+1];
+
+void SetQGLEScriptNameBackup(QString name) {
+ QByteArray arr = name.toUtf8();
+ strncpy(QGLEScriptNameBackup, arr.constData(), QGLE_SCRIPT_NAME_BACKUP_SIZE);
+ QGLEScriptNameBackup[QGLE_SCRIPT_NAME_BACKUP_SIZE] = 0;
+}
+
+#ifdef Q_WS_WIN
+
+#include <dbghelp.h>
+
+typedef BOOL (__stdcall *pStackWalk)(DWORD MachineType, HANDLE hProcess, HANDLE hThread, LPSTACKFRAME StackFrame,
+ PVOID ContextRecord, PREAD_PROCESS_MEMORY_ROUTINE ReadMemoryRoutine,
+ PFUNCTION_TABLE_ACCESS_ROUTINE FunctionTableAccessRoutine,
+ PGET_MODULE_BASE_ROUTINE GetModuleBaseRoutine,
+ PTRANSLATE_ADDRESS_ROUTINE TranslateAddress);
+
+void PrintStackTrace(CONTEXT* context, HANDLE hLogFile, char* szOutBuffer) {
+ DWORD NumBytes;
+ char szModuleName[MAX_PATH+1];
+ DWORD dwRes = GetModuleFileNameA(NULL, szModuleName, MAX_PATH);
+ if (dwRes == 0) {
+ sprintf(szOutBuffer, " Error: GetModuleFileName fails.\n");
+ WriteFile(hLogFile, szOutBuffer, strlen(szOutBuffer), &NumBytes, 0);
+ return;
+ }
+ char* backSlash = strrchr(szModuleName, '\\');
+ if (backSlash != 0) {
+ backSlash[1] = 0;
+ }
+ strcat(szModuleName, "dbghelp.dll");
+ HMODULE dbgHelp = LoadLibraryA(szModuleName);
+ if (dbgHelp == NULL) {
+ sprintf(szOutBuffer, " Error: %s not found.\n", szModuleName);
+ WriteFile(hLogFile, szOutBuffer, strlen(szOutBuffer), &NumBytes, 0);
+ // try without path
+ dbgHelp = LoadLibraryA("dbghelp.dll");
+ if (dbgHelp == NULL) {
+ sprintf(szOutBuffer, " Error: dbghelp.dll not found.\n");
+ WriteFile(hLogFile, szOutBuffer, strlen(szOutBuffer), &NumBytes, 0);
+ return;
+ }
+ }
+ pStackWalk stackWalk = (pStackWalk)GetProcAddress(dbgHelp, "StackWalk");
+ if (stackWalk == NULL) {
+ sprintf(szOutBuffer, " Error: dbghelp.dll does not include StackWalk.\n");
+ WriteFile(hLogFile, szOutBuffer, strlen(szOutBuffer), &NumBytes, 0);
+ return;
+ }
+ PFUNCTION_TABLE_ACCESS_ROUTINE funcTable = (PFUNCTION_TABLE_ACCESS_ROUTINE)GetProcAddress(dbgHelp, "SymFunctionTableAccess");
+ PGET_MODULE_BASE_ROUTINE moduleBase = (PGET_MODULE_BASE_ROUTINE)GetProcAddress(dbgHelp, "SymGetModuleBase");
+ if (funcTable == NULL || moduleBase == NULL) {
+ sprintf(szOutBuffer, " Error: dbghelp.dll does not include the required functions.\n");
+ WriteFile(hLogFile, szOutBuffer, strlen(szOutBuffer), &NumBytes, 0);
+ return;
+ }
+ STACKFRAME frame;
+ memset(&frame, 0, sizeof(frame));
+ frame.AddrPC.Offset = context->Eip;
+ frame.AddrPC.Mode = AddrModeFlat;
+ frame.AddrFrame.Offset = context->Ebp;
+ frame.AddrFrame.Mode = AddrModeFlat;
+ frame.AddrStack.Offset = context->Esp;
+ frame.AddrStack.Mode = AddrModeFlat;
+ HANDLE hProcess = GetCurrentProcess();
+ HANDLE hThread = GetCurrentThread();
+ char szBuf[MAX_PATH*2];
+ MEMORY_BASIC_INFORMATION MemInfo;
+ while (true) {
+ DWORD imageType = IMAGE_FILE_MACHINE_I386;
+ if (!stackWalk(imageType, hProcess, hThread, &frame, context, NULL, funcTable, moduleBase, NULL)) {
+ sprintf(szOutBuffer, " StackWalk end offset: %08lx - error code = %ld\n", frame.AddrPC.Offset, GetLastError());
+ WriteFile(hLogFile, szOutBuffer, strlen(szOutBuffer), &NumBytes, 0);
+ break;
+ }
+ if (frame.AddrPC.Offset == frame.AddrReturn.Offset) {
+ sprintf(szOutBuffer, " Infinite call stack - offset: %08lx\n", frame.AddrPC.Offset);
+ WriteFile(hLogFile, szOutBuffer, strlen(szOutBuffer), &NumBytes, 0);
+ break;
+ }
+ if (frame.AddrPC.Offset == 0) {
+ break;
+ }
+ sprintf(szOutBuffer, " Call: 0x%08lx", frame.AddrPC.Offset);
+ WriteFile(hLogFile, szOutBuffer, strlen(szOutBuffer), &NumBytes, 0);
+ if (VirtualQuery((void*)frame.AddrPC.Offset, &MemInfo, sizeof(MemInfo)) != 0) {
+ GetModuleFileNameA((HINSTANCE)MemInfo.AllocationBase, szBuf, sizeof(szBuf)-2);
+ char* fName = strrchr(szBuf, '\\');
+ if (fName != NULL) fName++;
+ else fName = szBuf;
+ sprintf(szOutBuffer, " (module %s)", fName);
+ WriteFile(hLogFile, szOutBuffer, strlen(szOutBuffer), &NumBytes, 0);
+ }
+ sprintf(szOutBuffer, "\n");
+ WriteFile(hLogFile, szOutBuffer, strlen(szOutBuffer), &NumBytes, 0);
+ }
+}
+
+LONG WINAPI MyUnhandledExceptionFilter(EXCEPTION_POINTERS *info) {
+ // Crash report code (intentionally does not use Qt)
+ static bool bFirstTime = true;
+ if (!bFirstTime) {
+ // Recursive call means this routine crashed
+ return EXCEPTION_CONTINUE_SEARCH;
+ }
+ bFirstTime = false;
+ // Get temporary path name
+ TCHAR lpPathBuffer[MAX_PATH+1];
+ DWORD dwRetVal = GetTempPath(MAX_PATH, lpPathBuffer);
+ if (dwRetVal > MAX_PATH || dwRetVal == 0) {
+ return EXCEPTION_CONTINUE_SEARCH;
+ }
+ // Get temporary file name
+ TCHAR szTempName[MAX_PATH+1];
+ UINT uRetVal = GetTempFileName(lpPathBuffer, TEXT("gle"), 0, szTempName);
+ if (uRetVal == 0) {
+ return EXCEPTION_CONTINUE_SEARCH;
+ }
+ // Create crash log file
+ HANDLE hLogFile = CreateFile(szTempName, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
+ if (hLogFile == INVALID_HANDLE_VALUE) {
+ return EXCEPTION_CONTINUE_SEARCH;
+ }
+ // Find out module in which crash occured
+ CONTEXT* Context = info->ContextRecord;
+ char szCrashModulePathName[MAX_PATH*2];
+ strcpy(szCrashModulePathName, "Unknown");
+ MEMORY_BASIC_INFORMATION MemInfo;
+ if (VirtualQuery((void*)Context->Eip, &MemInfo, sizeof(MemInfo)) != 0) {
+ GetModuleFileNameA((HINSTANCE)MemInfo.AllocationBase, szCrashModulePathName, sizeof(szCrashModulePathName)-2);
+ }
+ // Print error code to log file
+ DWORD NumBytes;
+ char szOutBuffer[5000];
+ char* szCrashModuleName = strrchr(szCrashModulePathName, '\\');
+ if (szCrashModuleName != NULL) szCrashModuleName++;
+ else szCrashModuleName = szCrashModulePathName;
+ sprintf(szOutBuffer, "Error code 0x%08x in module %s at %04x:%08x.\n", (unsigned int)info->ExceptionRecord->ExceptionCode, szCrashModuleName, (unsigned int)Context->SegCs, (unsigned int)Context->Eip);
+ WriteFile(hLogFile, szOutBuffer, strlen(szOutBuffer), &NumBytes, 0);
+ if (info->ExceptionRecord->ExceptionCode == STATUS_ACCESS_VIOLATION && info->ExceptionRecord->NumberParameters >= 2) {
+ if (info->ExceptionRecord->ExceptionInformation[0]) {
+ sprintf(szOutBuffer, "Write to location %08x caused an access violation.\n", (unsigned int)info-> ExceptionRecord->ExceptionInformation[1]);
+ } else {
+ sprintf(szOutBuffer, "Read from location %08x caused an access violation.\n", (unsigned int)info-> ExceptionRecord->ExceptionInformation[1]);
+ }
+ }
+ WriteFile(hLogFile, szOutBuffer, strlen(szOutBuffer), &NumBytes, 0);
+ sprintf(szOutBuffer, "\nStack trace:\n");
+ WriteFile(hLogFile, szOutBuffer, strlen(szOutBuffer), &NumBytes, 0);
+ PrintStackTrace(Context, hLogFile, szOutBuffer);
+ sprintf(szOutBuffer, "\nGLE file: '%s'\n", QGLEScriptNameBackup);
+ WriteFile(hLogFile, szOutBuffer, strlen(szOutBuffer), &NumBytes, 0);
+ CloseHandle(hLogFile);
+ // Restart in crash recover mode
+ TCHAR szModuleName[MAX_PATH+1];
+ DWORD dwRes = GetModuleFileName(NULL, szModuleName, MAX_PATH);
+ if (dwRes == 0) {
+ return EXCEPTION_CONTINUE_SEARCH;
+ }
+ TCHAR szCommandLine[2*MAX_PATH];
+ lstrcpy(szCommandLine, szModuleName);
+ lstrcat(szCommandLine, L" -crashrecover \"");
+ lstrcat(szCommandLine, szTempName);
+ lstrcat(szCommandLine, L"\"");
+ STARTUPINFO si;
+ ZeroMemory(&si, sizeof(si));
+ si.cb = sizeof(si);
+ si.dwFlags = STARTF_USESHOWWINDOW;
+ si.wShowWindow = SW_SHOW;
+ PROCESS_INFORMATION pi;
+ ZeroMemory(&pi, sizeof(pi));
+ if (CreateProcess(NULL, szCommandLine, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) {
+ // suppress the standard crash dialog
+ exit(-1);
+ } else {
+ // the standard crash dialog appear
+ return EXCEPTION_CONTINUE_SEARCH;
+ }
+}
+#endif
+
+int main(int argc, char *argv[]) {
+ QLocale curLocale("C");
+ QLocale::setDefault(curLocale);
+ QApplication app(argc,argv);
+ Q_INIT_RESOURCE(qgle);
+ // setlocale is required to make sure that GLE uses decimal a point instead of a comma
+ // this is very important, otherwise its PostScript output may contain commas in floating point numbers
+ // the call to setlocale should come after the initialization of QApplication
+ setlocale(LC_NUMERIC, "C");
+ for(int i = 0; i < argc; i++) {
+ if (QString(argv[i]) == "-finddeps") {
+ findDependencies(argc, argv, i);
+ return 0;
+ }
+ if (QString(argv[i]) == "-crashrecover" && i+1 < argc) {
+ doQGLECrashRecover(QString(argv[i+1]));
+ return 0;
+ }
+ }
+ SetQGLEScriptNameBackup(QString("?"));
+ #ifdef Q_WS_WIN
+ SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);
+ #endif
+ GLEMainWindow mainWin(argc,argv);
+ mainWin.show();
+ setlocale(LC_NUMERIC, "C");
+ return app.exec();
+}
diff --git a/src/gui/mainwindow.cpp b/src/gui/mainwindow.cpp
new file mode 100644
index 0000000..697f081
--- /dev/null
+++ b/src/gui/mainwindow.cpp
@@ -0,0 +1,2658 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+/***************************************************************
+ * mainwindow.cpp: The class implementation for GLEMainWindow. *
+ ***************************************************************/
+
+#include <QtGui>
+#include <QtDebug>
+#include <QMimeData>
+#include <math.h>
+
+#include "mainwindow.h"
+#include "qgle_statics.h"
+#include "settings.h"
+#include "settings_dialogue.h"
+#include "qgs.h"
+#include "about.h"
+#include "newfile.h"
+#include "consolewindow.h"
+#include "dialogues.h"
+#include "3dviewer.h"
+#include "../gle/cutils.h"
+#include "../gle/gle-block.h"
+#include "../gle/surface/gsurface.h"
+// #include "downloader.h"
+
+#include <iostream>
+using namespace std;
+
+void SetQGLEScriptNameBackup(QString name);
+
+//! Class Constructor
+GLEMainWindow::GLEMainWindow(int argc, char *argv[])
+{
+ // Initially enabled state is false
+ enabledState = false;
+
+ // Resize to an initial default size
+ resize(500,300);
+
+ // Set the Window Icon
+ setWindowIcon(QIcon(":images/gle.png"));
+
+ // Coordinate display default
+ coordView = CoordinateCart;
+ lastPoint = QPointF(0,0);
+ evaluatorDialog = NULL;
+
+ // GhostScript version number
+ GsLibVersionNumber = "?";
+
+ // Create the gle interface
+ gleInterface = GLEGetInterfacePointer();
+ gleScript = NULL;
+
+ // Initialise temp file names
+ // Should be unique names - otherwise can't run multiple QGLE instances
+ tempFiles[PreviewModeOutput] = createTempFile(tr(".out"));
+ tempFiles[EditModeOutput] = createTempFile(tr(".out"));
+ tempFiles[NewGLE] = createTempFile(tr(".gle"));
+
+ // Create the drawing area in a scroll widget. For high resolutions,
+ // this may be undesirable as the whole image must be rendered by GS
+ drawingArea = new GLEDrawingArea(gleInterface, this);
+ scrollArea = new QScrollArea(this);
+ scrollArea->setWidget(drawingArea);
+
+ splitWindow = new QSplitter(Qt::Vertical, this);
+ splitWindow->addWidget(scrollArea);
+ consoleWindow = new ConsoleWindow(this, splitWindow);
+ splitWindow->addWidget(consoleWindow);
+ splitWindow->setStretchFactor(0, 1);
+ splitWindow->setStretchFactor(1, 0);
+ gleInterface->setOutputStream(consoleWindow->getOutput());
+ gleInterface->initializeGLE("qgle", argc, argv);
+
+ QList<int> splitSizes;
+ splitSizes.append(50);
+ splitSizes.append(50);
+ splitWindow->setSizes(splitSizes);
+
+ setCentralWidget(splitWindow);
+
+ // Create the component parts
+ createActions();
+ createMenus();
+ createStatusBar();
+ createToolBars();
+ createEditModeToolBars();
+
+ qRegisterMetaType<QList<GLEDrawingObject *> >("QList<GLEDrawingObject *>");
+
+ // Read the application settings
+ settings = new GLESettings(this);
+ settings->readAll();
+ // We always resize, we just only save the size if requested
+ resize(settings->size());
+ move(settings->position());
+ splitWindow->restoreState(settings->splitterPosition());
+ consoleWindow->setAutoShowSize(settings->getConsoleWindowAutoShowSize());
+ createDockWindows();
+ enableEditModeToolBars(false);
+
+ // Connect signals
+ connect(settings, SIGNAL(polarSnapStartAngleChanged(double)),
+ drawingArea, SLOT(setPolarSnapStartAngle(double)));
+ connect(settings, SIGNAL(polarSnapIncAngleChanged(double)),
+ drawingArea, SLOT(setPolarSnapIncAngle(double)));
+ connect(drawingArea, SIGNAL(selectionChanged(QList<GLEDrawingObject *>)),
+ propertyEditor, SLOT(objectsSelected(QList<GLEDrawingObject *>)));
+ connect(propertyEditor, SIGNAL(propertiesHaveChanged()),
+ drawingArea, SLOT(update()));
+
+ // Initialise snapping
+ if (settings->polarSnapOnStart())
+ polarSnapAct->setChecked(true);
+ if (settings->polarTrackOnStart())
+ polarTrackAct->setChecked(true);
+ if (settings->gridSnapOnStart())
+ gridSnapAct->setChecked(true);
+ if (settings->osnapOnStart())
+ osnapAct->setChecked(true);
+ if (settings->orthoSnapOnStart())
+ orthoSnapAct->setChecked(true);
+
+ // As necessary, start the file monitor
+ fileMonitorCount = 0;
+ fileMonitorTimer = new QTimer(this);
+ connect(fileMonitorTimer, SIGNAL(timeout()), this, SLOT(checkForFileUpdates()));
+ updateFileMonitor(settings->monitorOpenFile());
+
+ // The following line is important as it allows
+ // QImage objects to be passed by the signal-slot
+ // mechanism.
+ qRegisterMetaType<QImage>("QImage");
+ qRegisterMetaType<GLEFileInfo>("GLEFileInfo");
+
+ // Initialise the serverRunning variable
+ serverRunning = false;
+
+ // Start in preview mode
+ currentMode = GLESettings::PreviewMode;
+ oldMode = currentMode;
+
+ serverInPreviewMode = true;
+ serverAct->setChecked(true);
+ initRenderThread();
+
+ // Setting connections
+
+ // If the grid is changed, update the drawing
+ connect(settings, SIGNAL(gridChanged(QPointF)),
+ drawingArea, SLOT(setGrid(QPointF)));
+ // If the file monitor is switched on or off,
+ // sort this out
+ connect(settings, SIGNAL(monitorFileChanged(bool)),
+ this, SLOT(updateFileMonitor(bool)));
+
+ // If a tool is selected, notify the drawing
+ connect(this, SIGNAL(toolSelected(int)),
+ drawingArea, SLOT(setTool(int)));
+ // If a new image is rendered, update the drawing
+ connect(this, SIGNAL(imageChanged(QImage)),
+ drawingArea, SLOT(updateDisplay(QImage)));
+ // If a point is drawn, set the base point used for
+ // relative coordinates
+ connect(drawingArea, SIGNAL(basePointChanged(QPointF)),
+ this, SLOT(setRelativeBasePoint(QPointF)));
+ // If the drawing area requests a status bar message,
+ // display it
+ connect(drawingArea, SIGNAL(updateStatusBar(QString)),
+ this, SLOT(statusBarMessage(QString)));
+ // If the dirty flag is set or unset, enable or disable
+ // the 'save' button accordingly
+ connect(drawingArea, SIGNAL(dirtyFlagChanged(bool)),
+ this, SLOT(setSaveEnable(bool)));
+ // If the dpi changes, update the status bar display
+ connect(drawingArea, SIGNAL(dpiChanged(double)),
+ this, SLOT(updateDPIDisplay(double)));
+ // Allow the drawing area to disable all tools
+ connect(drawingArea, SIGNAL(disableTools()),
+ this, SLOT(noToolEnable()));
+
+ // Get the default resolution
+ drawingArea->setDPI((double) settings->dpi());
+
+ // Update the grid spacing
+ drawingArea->setGrid(settings->grid());
+
+ // Accept keyboard events
+ setFocusPolicy(Qt::StrongFocus);
+ setFocus(Qt::OtherFocusReason);
+
+ // Drag and drop
+ setAcceptDrops(true);
+
+ // Make sure are tools are enabled correctly
+ updateEnableActions(true);
+
+ // Display a title on the title bar
+ updateWindowTitle();
+
+ // Check for arguments
+ QRegExp rx = QGLE::fileRegExp();
+
+ for(int i=0;i<argc;i++)
+ {
+ if (rx.exactMatch(QString(argv[i])))
+ {
+ QFileInfo filename(rx.capturedTexts()[2]);
+ openFile(filename.absoluteFilePath(), true);
+ break;
+ }
+ }
+}
+
+QString GLEMainWindow::createTempFile(QString ext)
+{
+ // Rely on same mechanism GLE also uses internally
+ string temp = gleInterface->getTempFile();
+ return QString::fromUtf8(temp.c_str()) + ext;
+}
+
+// Switch on or off the file monitor
+void GLEMainWindow::updateFileMonitor(bool state)
+{
+ if (state)
+ {
+ if (!fileMonitorTimer->isActive())
+ {
+ // One second timer
+ fileMonitorTimer->start(500);
+ }
+ }
+ else
+ {
+ if (fileMonitorTimer->isActive())
+ {
+ fileMonitorTimer->stop();
+ }
+ }
+ // used to wait another "tick" before auto-reloading
+ fileMonitorCount = 0;
+}
+
+bool GLEMainWindow::askAnywayBeforeReload()
+{
+ return false;
+}
+
+// Check whether the file has changed
+void GLEMainWindow::checkForFileUpdates()
+{
+ int answer = 1;
+ GLEFileInfo* currFile = getCurrentFile();
+ if (enabledState && currFile->hasChanged())
+ {
+ if (settings->monitorAutoReloadFile() && !askAnywayBeforeReload())
+ {
+ if (fileMonitorCount < 1)
+ {
+ // wait another "tick" to make sure file saved correctly
+ // don't want to load partially saved files
+ fileMonitorCount++;
+ return;
+ }
+ }
+ // reset counter for next iteration
+ fileMonitorCount = 0;
+
+ // If the file has changed, update the stored time stamp and
+ // stop the timer while we ask the user what to do.
+ fileMonitorTimer->stop();
+
+ // Ask the user whether to reload and, if we have any objects, should
+ // we keep them?
+ QString msg = QString(tr("File %1 has changed on disk.")).arg(currFile->primaryFile());
+
+ if (drawingArea->isDirty())
+ {
+ QString msg2 = QString(tr("%1\n\nWarning: you have also modified this file in QGLE. If you reload then these changes will be lost.")).arg(msg);
+ answer = QMessageBox::question(this, tr("%1 File Monitor").arg(APP_NAME),
+ msg2, tr("Reload file"),
+ tr("Ignore"),
+ QString(),
+ 0,1);
+ }
+ else if (settings->monitorAutoReloadFile() && !askAnywayBeforeReload())
+ {
+ answer = 0;
+ }
+ else if (currFile->isEPS() || currFile->isGLE())
+ {
+ answer = QMessageBox::question(this, tr("%1 File Monitor").arg(APP_NAME),
+ msg, tr("Reload file"),
+ tr("Ignore"),
+ QString(),
+ 0,1);
+ }
+ bool isOpen = false;
+ switch(answer)
+ {
+ case 0:
+ openFile(currFile->primaryFile());
+ isOpen = true;
+ break;
+ default:
+ break;
+ }
+
+ // Restart the timer
+ currFile->updateTimeStamp();
+ if (!isOpen) fileMonitorTimer->start();
+ }
+
+}
+
+// Accept URI lists that have been dragged over the application
+void GLEMainWindow::dragEnterEvent(QDragEnterEvent *event)
+{
+ if (event->mimeData()->hasFormat("text/uri-list"))
+ event->acceptProposedAction();
+}
+
+// Handle dropped URIs
+void GLEMainWindow::dropEvent(QDropEvent *event)
+{
+ // This will need to check that the file is a GLE or EPS
+ // file and then try to open it, by stripping off the file:// part
+ // and calling openFile(fileName). Worth checking that the file
+ // exists and is readable while we're at it.
+
+ // We're only interested in the first URI as this isn't a
+ // multi-document interface
+ QString uri = event->mimeData()->urls().at(0).toString();
+
+ QRegExp rx = QGLE::fileRegExp();
+
+ if (rx.exactMatch(uri))
+ {
+ openFile(rx.capturedTexts()[2]);
+ }
+ else
+ QMessageBox::information(this,
+ "Drop Event",
+ "Dropped file cannot be opened",
+ QMessageBox::Ok);
+
+
+ event->acceptProposedAction();
+}
+
+// User pressed a key
+// Keyboard shortcuts are based on those used in AutoCAD
+void GLEMainWindow::keyPressEvent(QKeyEvent *event)
+{
+ // Since we haven't any keyboard shortcuts that
+ // use modifiers, if there are any modifiers,
+ // ignore the key press
+ if (event->modifiers() != Qt::NoModifier)
+ event->ignore();
+
+ switch (event->key())
+ {
+ // Delete or escape keys are handled by the drawing itself
+ case Qt::Key_Delete:
+ case Qt::Key_Escape:
+ drawingArea->hitKey(event->key(), event->modifiers());
+ event->accept();
+ break;
+
+ case Qt::Key_F9:
+ // F9 is used to toggle grid snap
+ gridSnapAct->toggle();
+ event->accept();
+ break;
+
+ case Qt::Key_F3:
+ // F3 is used to toggle OSNAP: snapping to objects
+ osnapAct->toggle();
+ event->accept();
+ break;
+
+ case Qt::Key_F10:
+ // F10 is used to toggle polar snap: customisable snapping
+ polarSnapAct->toggle();
+ event->accept();
+ break;
+
+ case Qt::Key_F12:
+ // F12 is used to toggle polar track: multiple polar snaps
+ polarTrackAct->toggle();
+ event->accept();
+ break;
+
+ case Qt::Key_F8:
+ // F8 is used to toggle ortho snap: 0 or 90 degree lines
+ orthoSnapAct->toggle();
+ event->accept();
+ break;
+
+ case Qt::Key_F7:
+ // F7 is used to toggle grid visibility
+ gridAct->toggle();
+ event->accept();
+ break;
+
+ case Qt::Key_F1:
+ // F1 shows the about box
+ aboutAct->trigger();
+ event->accept();
+ break;
+
+ case Qt::Key_Equal:
+ case Qt::Key_Plus:
+ // The equals key is used to zoom in
+ // as is plus.
+ zoomInAct->trigger();
+ event->accept();
+ break;
+
+ case Qt::Key_Minus:
+ // The minus key is used to zoom out
+ zoomOutAct->trigger();
+ event->accept();
+ break;
+
+ case Qt::Key_F6:
+ // F6 cycles through the various coordinate views
+ switch (coordView)
+ {
+ case CoordinateOff:
+ coordView = CoordinateCart;
+ mousePosition->setVisible(true);
+ break;
+ case CoordinateCart:
+ coordView = CoordinatePolar;
+ mousePosition->setVisible(true);
+ break;
+ case CoordinatePolar:
+ mousePosition->setVisible(true);
+ coordView = CoordinateRelCart;
+ break;
+ case CoordinateRelCart:
+ mousePosition->setVisible(true);
+ coordView = CoordinateRelPolar;
+ break;
+ case CoordinateRelPolar:
+ mousePosition->setVisible(false);
+ coordView = CoordinateOff;
+ break;
+ }
+ updateMousePosition();
+ event->accept();
+ break;
+
+ case Qt::Key_Shift:
+ drawingArea->modifierToggle(GLEDrawingArea::ShiftKey, true);
+ break;
+
+ case Qt::Key_Control:
+ drawingArea->modifierToggle(GLEDrawingArea::CtrlKey, true);
+ break;
+
+ case Qt::Key_Alt:
+ drawingArea->modifierToggle(GLEDrawingArea::AltKey, true);
+ break;
+
+ default:
+ event->ignore();
+ }
+
+}
+
+void GLEMainWindow::keyReleaseEvent(QKeyEvent *event)
+{
+ // Since we haven't any keyboard shortcuts that
+ // use modifiers, if there are any modifiers,
+ // ignore the key press
+ if (event->modifiers() != Qt::NoModifier)
+ event->ignore();
+
+ switch (event->key())
+ {
+ case Qt::Key_Shift:
+ drawingArea->modifierToggle(GLEDrawingArea::ShiftKey, false);
+ break;
+
+ case Qt::Key_Control:
+ drawingArea->modifierToggle(GLEDrawingArea::CtrlKey, false);
+ break;
+
+ case Qt::Key_Alt:
+ drawingArea->modifierToggle(GLEDrawingArea::AltKey, false);
+ break;
+
+ default:
+ event->ignore();
+ }
+}
+
+
+// Toggle the status of the server
+void GLEMainWindow::serverToggle(bool switchOn)
+{
+ if (switchOn && (!serverRunning))
+ startServer();
+ else if ((!switchOn) && serverRunning)
+ stopServer();
+}
+
+// Initialize render thread
+void GLEMainWindow::initRenderThread()
+{
+ // Remember to update the server as well if it's changed anywhere else
+ renderThread = new GLERenderThread(this);
+
+ // Connect server signals
+ connect(renderThread, SIGNAL(serverMessage(QString)),
+ this, SLOT(updateServerStatus(QString)));
+
+ connect(renderThread, SIGNAL(serverError(QString)),
+ this, SLOT(showConsoleError(QString)));
+
+ // Notify the rendering code that an image is ready
+ connect(renderThread, SIGNAL(renderComplete(QImage)),
+ this, SLOT(renderComplete(QImage)));
+
+ // Notify drawing area of resolution changes from the server
+ connect(renderThread, SIGNAL(dpiChanged(double)),
+ drawingArea, SLOT(setDPI(double)));
+}
+
+// Start the server
+void GLEMainWindow::startServer()
+{
+ // Initialise the GS library
+ initLibGS();
+
+ // Remember to update the server as well if it's changed anywhere else
+ serverThread = new GLEServerThread(this, settings->port());
+
+ // Connect server signals
+ connect(serverThread, SIGNAL(serverMessage(QString)),
+ this, SLOT(updateServerStatus(QString)));
+
+ // Notify QGLE that a new file has been opended using "gle -p"
+ connect(serverThread, SIGNAL(gleMinusPRunned(QString)),
+ this, SLOT(openFile(QString)));
+
+ // Initialise the server
+ serverThread->initialise();
+
+ serverRunning = true;
+}
+
+// Stop the server
+void GLEMainWindow::stopServer()
+{
+ // This should clean it all up in theory
+ delete(serverThread);
+ serverRunning = false;
+}
+
+bool GLEMainWindow::tryGhostScriptLocation(const QString location, QString& error) {
+ GSLibFunctions* fct = GSLibFunctions::getInstance();
+ if (fct->loadLibrary(location, error) == 0) {
+ GsLibVersionNumber = fct->getVersion();
+ return true;
+ } else {
+ return false;
+ }
+}
+
+// Initialise GS
+void GLEMainWindow::initLibGS()
+{
+ QString error;
+ bool found = false;
+ GSLibFunctions* fct = GSLibFunctions::getInstance();
+ // First try the location given in the current settings
+ QString location = settings->getLibGSLocation();
+ if (fct->loadLibrary(location, error) != 0) {
+ // Next try the location proposed by GLE
+ string gsloc = gleInterface->getGhostScriptLocation();
+ location = QString::fromUtf8(gsloc.c_str());
+ if (fct->loadLibrary(location, error) == 0) {
+ found = true;
+ }
+ } else {
+ found = true;
+ }
+ // If this does not work, consult the user
+ if (!found) {
+ SoftwareLocateDialogue dial(this, gleInterface, QGLE_SOFT_DIALOG_SEARCH_MANUAL | QGLE_SOFT_DIALOG_SEARCH_ABORT);
+ dial.setWindowTitle("QGLE Error");
+ dial.showGhostScriptError(error, location);
+ dial.exec();
+ // Don't forget to restore the console output
+ restoreConsoleOutput();
+ if (dial.isConfigModified()) {
+ gleInterface->saveRCFile();
+ }
+ }
+ // GSLibFunctions might discover the real location
+ settings->setLibGSLocation(fct->libGSLocation());
+ GsLibVersionNumber = fct->getVersion();
+}
+
+// Called when QGLE is closed
+void GLEMainWindow::closeEvent(QCloseEvent *event)
+{
+
+ // Check whether to save changes
+ if (drawingArea->isDirty())
+ {
+ int reply = QMessageBox::question(this, tr("Quit QGLE"),
+ tr("Save changes to drawing?"),
+ QMessageBox::Yes,
+ QMessageBox::No,
+ QMessageBox::Cancel);
+
+ if (reply == QMessageBox::Yes)
+ save();
+ else if (reply == QMessageBox::No)
+ {
+ drawingArea->clearDirty();
+ }
+ else
+ {
+ event->ignore();
+ return;
+ }
+ }
+
+ // If the window size and position should be saved, update them
+ if (settings->storeSize())
+ {
+ settings->setPosition(pos());
+ settings->setSize(size());
+ settings->setDrawingAreaSize(getScrollAreaSize());
+ settings->setConsoleWindowAutoShowSize(consoleWindow->getAutoShowSize());
+ if (currentMode == GLESettings::EditMode) {
+ int sizes[2];
+ sizes[0] = propertyEditor->height();
+ sizes[1] = objectBlocksList->height();
+ QByteArray winState((const char*)sizes, sizeof(int)*2);
+ settings->setMainWindowState(winState);
+ }
+ QByteArray state = splitWindow->saveState();
+ settings->setSplitterPosition(state);
+ }
+ // Store the settings
+ settings->writeAll();
+
+ // Delete all temporary files
+ for (QHash<int,QString>::iterator it = tempFiles.begin(); it != tempFiles.end(); ++it)
+ {
+ QDir dir;
+ QString file = it.value();
+ dir.remove(file);
+ QString fileNoExt = file.left(file.length()-4);
+ #ifdef Q_WS_WIN
+ dir.remove(fileNoExt+tr(".tmp"));
+ #else
+ dir.remove(fileNoExt);
+ #endif
+ }
+
+ event->accept();
+}
+
+void GLEMainWindow::updateWindowTitle()
+{
+ GLEFileInfo* currFile = getCurrentFile();
+ bool isGLE = currFile->isGLE();
+ bool has = isGLE || currFile->isEPS();
+ QString title(APP_NAME);
+ if (has) {
+ title += tr(" - ") + currFile->primaryFile();
+ }
+ // Always include "[*]", it is treated special by Qt and only filled in when actually modified
+ title += tr(" [*]");
+ setWindowTitle(title);
+}
+
+void GLEMainWindow::updateEnableActions(bool enable)
+{
+ bool isGLE = getCurrentFile()->isGLE();
+ bool has = isGLE || getCurrentFile()->isEPS();
+ bool prevMode = (currentMode == GLESettings::PreviewMode);
+ bool figure = (previewPageSize->currentIndex() == 0);
+ enabledState = enable && has;
+ editorAct->setEnabled(has);
+ copyBitmapAct->setEnabled(has);
+ if (copyPDFAct != NULL) copyPDFAct->setEnabled(has);
+ if (copyEMFAct != NULL) copyEMFAct->setEnabled(has);
+ saveAsAct->setEnabled(has && enable);
+ saveAct->setEnabled(has && drawingArea->isDirty() && enable);
+ exportAct->setEnabled(isGLE && enable);
+ emulateVersion->setEnabled(isGLE && prevMode && enable);
+ previewPageSize->setEnabled(isGLE && prevMode && enable);
+ previewModeAct->setEnabled(has && enable);
+ editModeAct->setEnabled(isGLE && figure && enable);
+ zoomInAct->setEnabled(has && enable);
+ zoomOutAct->setEnabled(has && enable);
+ zoomAutoAct->setEnabled(has && enable);
+ openAct->setEnabled(enable);
+ newAct->setEnabled(enable);
+ evaluatorAct->setEnabled(enable);
+ ghostScriptLogWindowAct->setEnabled(enable);
+ view3DAct->setEnabled(enable && gleInterface->getSurface()->z != NULL);
+ pointerToolAct->setEnabled(enable);
+ moveToolAct->setEnabled(enable);
+ lineToolAct->setEnabled(enable);
+ tanLineToolAct->setEnabled(enable);
+ perpLineToolAct->setEnabled(enable);
+ circleToolAct->setEnabled(enable);
+ ellipseToolAct->setEnabled(enable);
+ arcToolAct->setEnabled(enable);
+ textToolAct->setEnabled(enable);
+ bool reloadActEnable = has && enable && prevMode;
+ if (!reloadActEnable) {
+ if (has && prevMode) {
+ reloadAct->setIcon(reloadIconRed);
+ } else {
+ reloadAct->setIcon(reloadIconBlack);
+ }
+ }
+ reloadAct->setEnabled(reloadActEnable);
+}
+
+void GLEMainWindow::clearConsoleWindow()
+{
+ consoleWindow->clear();
+}
+
+void GLEMainWindow::restoreConsoleOutput()
+{
+ gleInterface->setOutputStream(consoleWindow->getOutput());
+}
+
+void GLEMainWindow::createActions()
+{
+ // Create the actions for each menu entry and connect them
+ // to an appropriate slot
+
+ // Action causing the current bitmap to be copied to the clipboard
+ copyBitmapAct = new QAction(tr("&Copy as Bitmap"), this);
+ copyBitmapAct->setStatusTip(tr("Copy current diagram as bitmap to clipboard"));
+ connect(copyBitmapAct, SIGNAL(triggered()), this, SLOT(copyBitmap()));
+
+ //! Action causing the figure to be copied to the clipboard as PDF
+ copyPDFAct = NULL;
+ #ifdef Q_WS_MAC
+ copyPDFAct = new QAction(tr("&Copy as PDF"), this);
+ copyPDFAct->setStatusTip(tr("Copy current diagram as PDF to clipboard"));
+ connect(copyPDFAct, SIGNAL(triggered()), this, SLOT(copyPDF()));
+ #endif
+
+ //! Action causing the figure to be copied to the clipboard as EMF
+ copyEMFAct = NULL;
+ #ifdef Q_WS_WIN
+ copyEMFAct = new QAction(tr("&Copy as EMF"), this);
+ copyEMFAct->setStatusTip(tr("Copy current diagram as EMF to clipboard"));
+ connect(copyEMFAct, SIGNAL(triggered()), this, SLOT(copyEMF()));
+ #endif
+
+ // Quit the application
+ quitAct = new QAction(tr("&Quit"), this);
+ quitAct->setShortcut(Qt::Key_Q | Qt::ControlModifier);
+ quitAct->setStatusTip(tr("Exit QGLE"));
+ connect(quitAct, SIGNAL(triggered()),
+ this, SLOT(close()));
+
+ // Create a new file
+ newAct = new QAction(QIcon(":images/new.png"), tr("&New"), this);
+ newAct->setShortcut(Qt::Key_N | Qt::ControlModifier);
+ newAct->setStatusTip(tr("Create a new file"));
+ connect(newAct, SIGNAL(triggered()),
+ this, SLOT(newFile()));
+
+ // Open a specified file
+ openAct = new QAction(QIcon(":images/open.png"), tr("&Open"), this);
+ openAct->setShortcut(Qt::Key_O | Qt::ControlModifier);
+ openAct->setStatusTip(tr("Open an existing file"));
+ connect(openAct, SIGNAL(triggered()),
+ this, SLOT(openFile()));
+
+ // Open a specified file in a new window
+ openInNewWindowAct = new QAction(QIcon(":images/open.png"), tr("Open in New &Window"), this);
+ openInNewWindowAct->setStatusTip(tr("Open an existing file in a new window"));
+ connect(openInNewWindowAct, SIGNAL(triggered()),
+ this, SLOT(openFileInNewWindow()));
+
+ browseAct = new QAction(tr("&Browse Script Folder"), this);
+ browseAct->setStatusTip(tr("Browse the folder that contains the GLE script"));
+ connect(browseAct, SIGNAL(triggered()),
+ this, SLOT(browseScriptFolder()));
+
+ // Save the file
+ saveAct = new QAction(QIcon(":images/save.png"), tr("&Save"), this);
+ saveAct->setShortcut(Qt::Key_S | Qt::ControlModifier);
+ saveAct->setStatusTip(tr("Save changes"));
+ saveAct->setEnabled(false);
+ connect(saveAct, SIGNAL(triggered()),
+ this, SLOT(save()));
+
+ // Save the file under a new name
+ saveAsAct = new QAction(tr("Save &As"), this);
+ saveAsAct->setStatusTip(tr("Save under a new name"));
+ saveAsAct->setEnabled(false);
+ connect(saveAsAct, SIGNAL(triggered()),
+ this, SLOT(saveAs()));
+
+ exportAct = new QAction(tr("&Export"), this);
+ exportAct->setShortcut(Qt::Key_E | Qt::ControlModifier);
+ exportAct->setStatusTip(tr("Export file"));
+ exportAct->setEnabled(false);
+ connect(exportAct, SIGNAL(triggered()),
+ this, SLOT(openExportDialogue()));
+
+ printAct = new QAction(tr("&Print"), this);
+ printAct->setStatusTip(tr("Print file"));
+ printAct->setEnabled(false);
+ connect(printAct, SIGNAL(triggered()),
+ this, SLOT(openPrintDialogue()));
+
+ // Show an about box
+ aboutAct = new QAction(tr("&About"), this);
+ aboutAct->setStatusTip(tr("Show information about QGLE"));
+ connect(aboutAct, SIGNAL(triggered()),
+ this, SLOT(about()));
+
+ gleSiteAct = new QAction(tr("&Website"), this);
+ gleSiteAct->setStatusTip(tr("Open GLE website"));
+ connect(gleSiteAct, SIGNAL(triggered()), this, SLOT(showGLEWebsite()));
+
+ gleManualAct = new QAction(tr("&Manual"), this);
+ gleManualAct->setShortcut(Qt::Key_F1);
+ gleManualAct->setStatusTip(tr("Open GLE manual"));
+ connect(gleManualAct, SIGNAL(triggered()), this, SLOT(showGLEManual()));
+
+ // Toggle the grid visibility
+ gridAct = new QAction(QIcon(":images/grid.png"), tr("Grid"), this);
+ gridAct->setStatusTip(tr("Toggle the grid on and off"));
+ gridAct->setCheckable(true);
+ gridAct->setChecked(false);
+ connect(gridAct, SIGNAL(toggled(bool)),
+ drawingArea, SLOT(gridToggle(bool)));
+
+ // Toggle grid snap
+ gridSnapAct = new QAction(QIcon(":images/grid_snap.png"), tr("Snap Grid"), this);
+ gridSnapAct->setStatusTip(tr("Toggle grid snap on and off"));
+ gridSnapAct->setCheckable(true);
+ gridSnapAct->setChecked(false);
+ connect(gridSnapAct, SIGNAL(toggled(bool)),
+ drawingArea, SLOT(gridSnapToggle(bool)));
+
+ // Toggle osnap
+ osnapAct = new QAction(QIcon(":images/osnap.png"), tr("Snap to Objects"), this);
+ osnapAct->setStatusTip(tr("Toggle OSNAP on and off"));
+ osnapAct->setCheckable(true);
+ osnapAct->setChecked(false);
+ connect(osnapAct, SIGNAL(toggled(bool)),
+ drawingArea, SLOT(osnapToggle(bool)));
+
+ // Toggle orthoSnap
+ orthoSnapAct = new QAction(QIcon(":images/orthosnap.png"), tr("Snap to axes"), this);
+ orthoSnapAct->setStatusTip(tr("Toggle ORTHO on and off"));
+ orthoSnapAct->setCheckable(true);
+ orthoSnapAct->setChecked(false);
+ connect(orthoSnapAct, SIGNAL(toggled(bool)),
+ drawingArea, SLOT(orthoSnapToggle(bool)));
+
+ // Toggle polar snap
+ polarSnapAct = new QAction(QIcon(":images/polarsnap.png"), tr("Polar snap"), this);
+ polarSnapAct->setStatusTip(tr("Toggle customisable snaps on and off"));
+ polarSnapAct->setCheckable(true);
+ polarSnapAct->setChecked(false);
+ connect(polarSnapAct, SIGNAL(toggled(bool)),
+ this, SLOT(polarSnapToggle(bool)));
+
+ // Toggle polar track
+ polarTrackAct = new QAction(QIcon(":images/polartrack.png"), tr("Polar tracking"), this);
+ polarTrackAct->setStatusTip(tr("Toggle multiple customisable snaps on and off"));
+ polarTrackAct->setCheckable(true);
+ polarTrackAct->setChecked(false);
+ connect(polarTrackAct, SIGNAL(toggled(bool)),
+ this, SLOT(polarTrackToggle(bool)));
+
+ // Toggle whether the server is running
+ serverAct = new QAction(QIcon(":images/server.png"), tr("Server"), this);
+ serverAct->setStatusTip(tr("Start or stop the server"));
+ serverAct->setCheckable(true);
+ serverAct->setChecked(false);
+ connect(serverAct, SIGNAL(toggled(bool)),
+ this, SLOT(serverToggle(bool)));
+
+ // Switch to preview mode
+ editPreviewGroup = new QActionGroup(this);
+ previewModeAct = new QAction(QIcon(":images/preview_mode.png"), tr("Preview Mode"), this);
+ previewModeAct->setStatusTip(tr("Switch to preview mode"));
+ previewModeAct->setCheckable(true);
+ previewModeAct->setChecked(true);
+ editPreviewGroup->addAction(previewModeAct);
+ previewModeAct->setEnabled(false);
+ connect(previewModeAct, SIGNAL(toggled(bool)),
+ this, SLOT(previewModeToggle(bool)));
+
+ // Switch to edit mode
+ editModeAct = new QAction(QIcon(":images/edit_mode.png"), tr("Edit Mode"), this);
+ editModeAct->setStatusTip(tr("Switch to edit mode"));
+ editModeAct->setCheckable(true);
+ editPreviewGroup->addAction(editModeAct);
+ editModeAct->setEnabled(false);
+ connect(editModeAct, SIGNAL(toggled(bool)),
+ this, SLOT(editModeToggle(bool)));
+
+ // Open file in editor
+ editorAct = new QAction(QIcon(":images/editor.png"), tr("Open in Editor"), this);
+ editorAct->setStatusTip(tr("Open file in text editor"));
+ editorAct->setCheckable(false);
+ editorAct->setEnabled(false);
+ connect(editorAct, SIGNAL(triggered()), this, SLOT(openInTextEditor()));
+
+ // Prepare icons for reload action
+ reloadIconBlack.addPixmap(QPixmap(":images/reload.png"), QIcon::Normal, QIcon::Off);
+ reloadIconRed.addPixmap(QPixmap(":images/reload.png"), QIcon::Normal, QIcon::Off);
+ reloadIconRed.addPixmap(QPixmap(":images/reload_red.png"), QIcon::Disabled, QIcon::Off);
+
+ // Reload
+ reloadAct = new QAction(reloadIconBlack, tr("Reload File"), this);
+ reloadAct->setStatusTip(tr("Reload file"));
+ reloadAct->setCheckable(false);
+ reloadAct->setEnabled(false);
+ connect(reloadAct, SIGNAL(triggered()), this, SLOT(reloadFile()));
+
+ // Zoom In
+ zoomInAct = new QAction(QIcon(":images/zoom_in.png"), tr("Zoom In (+)"), this);
+ zoomInAct->setStatusTip(tr("Zoom in"));
+ zoomInAct->setCheckable(false);
+ zoomInAct->setEnabled(false);
+ connect(zoomInAct, SIGNAL(triggered()),
+ this, SLOT(zoomIn()));
+
+ // Zoom Out
+ zoomOutAct = new QAction(QIcon(":images/zoom_out.png"), tr("Zoom Out (-)"), this);
+ zoomOutAct->setStatusTip(tr("Zoom out"));
+ zoomOutAct->setCheckable(false);
+ zoomOutAct->setEnabled(false);
+ connect(zoomOutAct, SIGNAL(triggered()),
+ this, SLOT(zoomOut()));
+
+ // Zoom Out
+ zoomAutoAct = new QAction(tr("Zoom Auto"), this);
+ zoomAutoAct->setStatusTip(tr("Zoom automatically to fit window"));
+ zoomAutoAct->setCheckable(false);
+ zoomAutoAct->setEnabled(false);
+ connect(zoomAutoAct, SIGNAL(triggered()), this, SLOT(zoomAuto()));
+
+ // Tools
+
+ // Pointer tool
+ toolGroup = new QActionGroup(this);
+ pointerToolAct = new QAction(QIcon(":images/pointer.png"), tr("Pointer Tool"), this);
+ pointerToolAct->setStatusTip(tr("Selection Tool"));
+ pointerToolAct->setCheckable(true);
+ pointerToolAct->setChecked(true);
+ toolGroup->addAction(pointerToolAct);
+ connect(pointerToolAct, SIGNAL(toggled(bool)),
+ this, SLOT(pointerToolToggle(bool)));
+
+ // Line tool
+ lineToolAct = new QAction(QIcon(":images/line.png"), tr("Line Tool"), this);
+ lineToolAct->setStatusTip(tr("Line Tool"));
+ lineToolAct->setCheckable(true);
+ toolGroup->addAction(lineToolAct);
+ connect(lineToolAct, SIGNAL(toggled(bool)),
+ this, SLOT(lineToolToggle(bool)));
+
+ // Tan Line tool
+ tanLineToolAct = new QAction(QIcon(":images/tan_line.png"), tr("Tangent Tool"), this);
+ tanLineToolAct->setStatusTip(tr("Tangent Tool"));
+ tanLineToolAct->setCheckable(true);
+ toolGroup->addAction(tanLineToolAct);
+ connect(tanLineToolAct, SIGNAL(toggled(bool)),
+ this, SLOT(tanLineToolToggle(bool)));
+
+ // Perpendicular Line tool
+ perpLineToolAct = new QAction(QIcon(":images/perp_line.png"), tr("Perpendicular Tool"), this);
+ perpLineToolAct->setStatusTip(tr("Perpendicular Tool"));
+ perpLineToolAct->setCheckable(true);
+ toolGroup->addAction(perpLineToolAct);
+ connect(perpLineToolAct, SIGNAL(toggled(bool)),
+ this, SLOT(perpLineToolToggle(bool)));
+
+ // Circle tool
+ circleToolAct = new QAction(QIcon(":images/circle.png"), tr("Circle Tool"), this);
+ circleToolAct->setStatusTip(tr("Circle Tool"));
+ circleToolAct->setCheckable(true);
+ toolGroup->addAction(circleToolAct);
+ connect(circleToolAct, SIGNAL(toggled(bool)),
+ this, SLOT(circleToolToggle(bool)));
+
+ // Ellipse tool
+ ellipseToolAct = new QAction(QIcon(":images/ellipse.png"), tr("Ellipse Tool"), this);
+ ellipseToolAct->setStatusTip(tr("Ellipse Tool"));
+ ellipseToolAct->setCheckable(true);
+ toolGroup->addAction(ellipseToolAct);
+ connect(ellipseToolAct, SIGNAL(toggled(bool)),
+ this, SLOT(ellipseToolToggle(bool)));
+
+ // Arc tool
+ arcToolAct = new QAction(QIcon(":images/arc_3p.png"), tr("Arc Tool"), this);
+ arcToolAct->setStatusTip(tr("Circular Arc Tool"));
+ arcToolAct->setCheckable(true);
+ toolGroup->addAction(arcToolAct);
+ connect(arcToolAct, SIGNAL(toggled(bool)),
+ this, SLOT(arcToolToggle(bool)));
+
+ // Text tool
+ textToolAct = new QAction(QIcon(":images/text.png"), tr("Text Tool"), this);
+ textToolAct->setStatusTip(tr("Text Tool"));
+ textToolAct->setCheckable(true);
+ toolGroup->addAction(textToolAct);
+ connect(textToolAct, SIGNAL(toggled(bool)),
+ this, SLOT(textToolToggle(bool)));
+
+ // move tool
+ moveToolAct = new QAction(QIcon(":images/amove.png"), tr("Move Tool"), this);
+ moveToolAct->setStatusTip(tr("Final Point Tool"));
+ moveToolAct->setCheckable(true);
+ toolGroup->addAction(moveToolAct);
+ connect(moveToolAct, SIGNAL(toggled(bool)),
+ this, SLOT(moveToolToggle(bool)));
+
+ // Display the settings dialogue box
+ settingsAct = new QAction(tr("&Options"), this);
+ settingsAct->setStatusTip(tr("Configure QGLE"));
+ connect(settingsAct, SIGNAL(triggered()),
+ this, SLOT(openSettingsDialogue()));
+
+ evaluatorAct = new QAction(tr("&Evaluator"), this);
+ evaluatorAct->setStatusTip(tr("Open expression evaluator window"));
+ connect(evaluatorAct, SIGNAL(triggered()),
+ this, SLOT(openEvaluator()));
+
+ // Open 3D view dialogue
+ view3DAct = new QAction(tr("&3D Surface Plot"), this);
+ view3DAct->setStatusTip(tr("Manipulate 3D surface plot"));
+ connect(view3DAct, SIGNAL(triggered()), this, SLOT(openView3DDialogue()));
+
+ // Open the dialog displaying GhostScript's logs
+ ghostScriptLogWindowAct = new QAction(tr("&GhostScript's Log"), this);
+ ghostScriptLogWindowAct->setStatusTip(tr("Display GhostScript's Error Log"));
+ connect(ghostScriptLogWindowAct, SIGNAL(triggered()), this, SLOT(openGhostScriptLogDialogue()));
+
+ // Test the download function
+ downloadAct = new QAction(tr("&Download"), this);
+ downloadAct->setStatusTip(tr("Download GhostScript libgs.so"));
+ connect(downloadAct, SIGNAL(triggered()),
+ this, SLOT(openDownloadDialogue()));
+
+ // Console window auto-show functionality
+ consoleWindowHide = new QAction(tr("&Hide"), this);
+ connect(consoleWindowHide, SIGNAL(triggered()),
+ consoleWindow, SLOT(hideTriggered()));
+ consoleWindow->setHideAction(consoleWindowHide);
+
+ for (int i = 0; i < MaxRecentFiles; ++i) {
+ recentFileActs[i] = new QAction(this);
+ recentFileActs[i]->setVisible(false);
+ connect(recentFileActs[i], SIGNAL(triggered()),
+ this, SLOT(openRecentFile()));
+ }
+}
+
+void GLEMainWindow::createDockWindows()
+{
+ int size1 = 0;
+ int size2 = 0;
+ const QByteArray& state = settings->mainWindowState();
+ if (!state.isEmpty()) {
+ const int* sizes = (const int*)state.constData();
+ size1 = sizes[0];
+ size2 = sizes[1];
+ }
+
+ propertyDock = new QDockWidget(tr("Properties"), this);
+ propertyDock->setObjectName("GLEPropertyEditor");
+ propertyDock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
+ addDockWidget(Qt::RightDockWidgetArea, propertyDock);
+ propertyEditor = new GLEPropertyEditor(propertyDock, size1);
+ propertyDock->setWidget(propertyEditor);
+
+ objectBlocksDock = new QDockWidget(tr("Objects"), this);
+ objectBlocksDock->setObjectName("GLEObjectBlocksList");
+ objectBlocksDock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
+ addDockWidget(Qt::RightDockWidgetArea, objectBlocksDock);
+ objectBlocksList = new GLEObjectBlocksList(objectBlocksDock, this, drawingArea, size2);
+ objectBlocksDock->setWidget(objectBlocksList);
+}
+
+// Create the toolbars
+void GLEMainWindow::createToolBars()
+{
+
+ fileToolBar = addToolBar(tr("File"));
+ fileToolBar->setObjectName("fileToolBar");
+ fileToolBar->addAction(newAct);
+ fileToolBar->addAction(openAct);
+ fileToolBar->addAction(saveAct);
+
+ modeToolBar = addToolBar(tr("Mode"));
+ modeToolBar->setObjectName("modeToolBar");
+// modeToolBar->addAction(serverAct);
+ modeToolBar->addAction(previewModeAct);
+ modeToolBar->addAction(editModeAct);
+
+ viewToolBar = addToolBar(tr("View"));
+ viewToolBar->setObjectName("viewToolBar");
+ viewToolBar->addAction(reloadAct);
+ viewToolBar->addAction(zoomInAct);
+ viewToolBar->addAction(zoomOutAct);
+
+ previewPageSize = new QComboBox(viewToolBar);
+ previewPageSize->addItem(tr("Figure"));
+ previewPageSize->addItem(tr("Portrait"));
+ previewPageSize->addItem(tr("Landscape"));
+ previewPageSize->setToolTip("Preview Page Size");
+ viewToolBar->addWidget(previewPageSize);
+ connect(previewPageSize, SIGNAL(activated(int)), this, SLOT(previewPageSizeChanged(int)));
+
+ editorBut = new QToolButton(viewToolBar);
+ editorBut->setDefaultAction(editorAct);
+ editorBut->setContextMenuPolicy(Qt::CustomContextMenu);
+ connect(editorBut, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(createEditFilePopup(const QPoint&)));
+ viewToolBar->addWidget(editorBut);
+
+ compatToolBar = addToolBar(tr("Compatibility"));
+ compatToolBar->setObjectName("compatToolBar");
+ emulateVersion = new QComboBox(compatToolBar);
+ emulateVersion->addItem(tr("4.2"));
+ emulateVersion->addItem(tr("3.5"));
+ emulateVersion->setToolTip("Emulate GLE Version");
+ compatToolBar->addWidget(emulateVersion);
+ connect(emulateVersion, SIGNAL(activated(int)), this, SLOT(emulateGLEVersionChanged(int)));
+
+ // Initialise toolsToolBar and controlToolBar to 0
+ toolsToolBar = 0;
+ controlToolBar = 0;
+}
+
+void GLEMainWindow::emulateGLEVersionChanged(int)
+{
+ GLEFileInfo* currFile = getCurrentFile();
+ settings->setEmulateGLEVersion(emulateVersion->currentIndex());
+ if (currentMode == GLESettings::PreviewMode && !currFile->primaryFile().isEmpty()) {
+ openFile(currFile->primaryFile());
+ }
+}
+
+void GLEMainWindow::previewPageSizeChanged(int)
+{
+ GLEFileInfo* currFile = getCurrentFile();
+ settings->setPreviewPageSize(previewPageSize->currentIndex());
+ if (currentMode == GLESettings::PreviewMode && !currFile->primaryFile().isEmpty() && currFile->isGLE()) {
+ editModeAct->setEnabled(previewPageSize->currentIndex() == 0);
+ renderGLE(0.0, getScrollAreaSize());
+ }
+}
+
+void GLEMainWindow::polarSnapToggle(bool state)
+{
+ drawingArea->polarSnapToggle(state);
+ if (state == false)
+ polarTrackAct->setChecked(false);
+}
+
+void GLEMainWindow::polarTrackToggle(bool state)
+{
+ drawingArea->polarTrackToggle(state);
+ if (state == true)
+ polarSnapAct->setChecked(true);
+}
+
+void GLEMainWindow::selectPointerTool()
+{
+ pointerToolAct->setChecked(true);
+}
+
+void GLEMainWindow::createEditModeToolBars()
+{
+ toolsToolBar = new QToolBar(tr("Tools"));
+ toolsToolBar->setObjectName("toolsToolBar");
+ toolsToolBar->setOrientation(Qt::Vertical);
+ toolsToolBar->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea);
+ toolsToolBar->addAction(pointerToolAct);
+ toolsToolBar->addAction(moveToolAct);
+ toolsToolBar->addAction(lineToolAct);
+ toolsToolBar->addAction(tanLineToolAct);
+ toolsToolBar->addAction(perpLineToolAct);
+ toolsToolBar->addAction(circleToolAct);
+ toolsToolBar->addAction(ellipseToolAct);
+ toolsToolBar->addAction(arcToolAct);
+ toolsToolBar->addAction(textToolAct);
+ addToolBar(Qt::LeftToolBarArea, toolsToolBar);
+
+ controlToolBar = new QToolBar(tr("Drawing Control"));
+ controlToolBar->setObjectName("controlToolBar");
+ controlToolBar->setOrientation(Qt::Vertical);
+ controlToolBar->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea);
+ controlToolBar->addAction(gridAct);
+ controlToolBar->addAction(gridSnapAct);
+ controlToolBar->addAction(osnapAct);
+ controlToolBar->addAction(orthoSnapAct);
+ controlToolBar->addAction(polarSnapAct);
+ controlToolBar->addAction(polarTrackAct);
+ addToolBar(Qt::LeftToolBarArea, controlToolBar);
+
+}
+
+void GLEMainWindow::enableEditModeToolBars(bool enable)
+{
+ if (!enable)
+ {
+ // Hide first, next gray out
+ toolsToolBar->hide();
+ controlToolBar->hide();
+ propertyEditor->hide();
+ propertyDock->hide();
+ objectBlocksList->hide();
+ objectBlocksDock->hide();
+ emulateVersion->setCurrentIndex(min(emulateVersion->count()-1, settings->getEmulateGLEVersion()));
+ previewPageSize->setCurrentIndex(settings->getPreviewPageSize());
+ }
+ toolsToolBar->setEnabled(enable);
+ controlToolBar->setEnabled(enable);
+ propertyEditor->setEnabled(enable);
+ propertyDock->setEnabled(enable);
+ objectBlocksList->setEnabled(enable);
+ objectBlocksDock->setEnabled(enable);
+ compatToolBar->setEnabled(!enable);
+ emulateVersion->setEnabled(!enable);
+ previewPageSize->setEnabled(!enable);
+ reloadAct->setEnabled(!enable);
+ if (enable)
+ {
+ // Enable first, then show
+ toolsToolBar->show();
+ controlToolBar->show();
+ propertyEditor->show();
+ propertyDock->show();
+ objectBlocksList->show();
+ objectBlocksDock->show();
+ emulateVersion->setCurrentIndex(0);
+ previewPageSize->setCurrentIndex(0);
+ }
+}
+
+void GLEMainWindow::destroyEditModeToolBars()
+{
+ if (toolsToolBar)
+ {
+ removeToolBar(toolsToolBar);
+ delete toolsToolBar;
+ toolsToolBar = 0;
+ }
+ if (controlToolBar)
+ {
+ removeToolBar(controlToolBar);
+ delete controlToolBar;
+ controlToolBar = 0;
+ }
+}
+
+//! Get non-current mode GLEFileInfo object
+GLEFileInfo* GLEMainWindow::getNonCurrentModeFileInfo()
+{
+ int otherMode = (currentMode == GLESettings::PreviewMode ? GLESettings::EditMode : GLESettings::PreviewMode);
+ return ¤tFile[otherMode];
+}
+
+//! Set temp files correctly for GLE file
+void GLEMainWindow::initTempFilesGLE()
+{
+ currentFile[GLESettings::PreviewMode].setEpsFile(tempFiles[PreviewModeOutput]);
+ currentFile[GLESettings::EditMode].setEpsFile(tempFiles[EditModeOutput]);
+}
+
+//! Update currentFile on change PreviewMode <-> EditMode
+int GLEMainWindow::updateFileInfoOnChangeMode(int mode)
+{
+ int oldMode = (mode == GLESettings::PreviewMode ? GLESettings::EditMode : GLESettings::PreviewMode);
+ GLEFileInfo* oldFile = ¤tFile[oldMode];
+ GLEFileInfo* newFile = ¤tFile[mode];
+ int diff = 0;
+ if (newFile->getLastDPI() != drawingArea->getDPI()) diff = 1; /* re-render EPS */
+ if (newFile->gleFile() != oldFile->gleFile()) diff = 2; /* re-render GLE */
+ newFile->copyFrom(oldFile);
+ // Save DPI for next switch
+ oldFile->setLastDPI(drawingArea->getDPI());
+ currentMode = mode;
+ return diff;
+}
+
+// SLOT: user clicked the preview mode button
+void GLEMainWindow::previewModeToggle(bool state)
+{
+ // User switched mode on
+ if (state)
+ {
+ // Switch to preview mode
+ int diff = updateFileInfoOnChangeMode(GLESettings::PreviewMode);
+ drawingArea->setEditMode(false);
+
+ // Hide the tools toolbar
+ enableEditModeToolBars(false);
+
+ // Select no tool
+ emit toolSelected(GLEDrawingArea::NoTool);
+
+ // call renderGLEandObjects and then
+ // Only process if new objects have been created
+ // or if objects have been moved
+ if (drawingArea->thereAreNewObjects())
+ {
+ updateGLE();
+ if (settings->saveOnPreview())
+ {
+ save();
+ }
+ drawingArea->clearNewObjectsFlag();
+ renderGLE();
+ }
+ else
+ {
+ if (diff == 0) refreshDisplay();
+ else if (diff == 1) renderEPS();
+ else renderGLE();
+ }
+ }
+}
+
+
+// SLOT: user clicked the edit mode button
+void GLEMainWindow::editModeToggle(bool state)
+{
+ // User switched mode on
+ if (state)
+ {
+ if (getCurrentFile()->gleFile().isEmpty())
+ {
+ previewModeAct->setChecked(true);
+ return;
+ }
+
+ int diff = updateFileInfoOnChangeMode(GLESettings::EditMode);
+ drawingArea->setEditMode(true);
+
+ enableEditModeToolBars(true);
+ pointerToolAct->setChecked(true);
+
+ if (pointerToolAct->isChecked())
+ emit toolSelected(GLEDrawingArea::PointerTool);
+ else if (lineToolAct->isChecked())
+ emit toolSelected(GLEDrawingArea::LineTool);
+ else if (tanLineToolAct->isChecked())
+ emit toolSelected(GLEDrawingArea::TanLineTool);
+ else if (perpLineToolAct->isChecked())
+ emit toolSelected(GLEDrawingArea::PerpLineTool);
+ else if (circleToolAct->isChecked())
+ emit toolSelected(GLEDrawingArea::CircleTool);
+ else if (ellipseToolAct->isChecked())
+ emit toolSelected(GLEDrawingArea::EllipseTool);
+ else if (arcToolAct->isChecked())
+ emit toolSelected(GLEDrawingArea::ArcTool);
+ else if (textToolAct->isChecked())
+ emit toolSelected(GLEDrawingArea::TextTool);
+ else if (moveToolAct->isChecked())
+ emit toolSelected(GLEDrawingArea::AMoveTool);
+
+ // We should probably only emit this when there is
+ // definitely an image, but edit mode shouldn't be
+ // available if there isn't one
+ if (diff == 0) refreshDisplay();
+ else if (diff == 1) renderEPS();
+ else renderGLE();
+ }
+}
+
+// SLOT: user requested all the tools be disabled
+void GLEMainWindow::noToolEnable()
+{
+ lineToolAct->setChecked(false);
+ tanLineToolAct->setChecked(false);
+ perpLineToolAct->setChecked(false);
+ circleToolAct->setChecked(false);
+ ellipseToolAct->setChecked(false);
+ arcToolAct->setChecked(false);
+ moveToolAct->setChecked(false);
+ pointerToolAct->setChecked(false);
+ textToolAct->setChecked(false);
+
+ emit toolSelected(GLEDrawingArea::NoTool);
+}
+
+
+// SLOT: user clicked the pointer tool button
+void GLEMainWindow::pointerToolToggle(bool state)
+{
+ // User switched mode on
+ if (state)
+ {
+ // Notify drawing area
+ emit toolSelected(GLEDrawingArea::PointerTool);
+ }
+}
+
+// SLOT: user clicked the line tool button
+void GLEMainWindow::lineToolToggle(bool state)
+{
+ // User switched mode on
+ if (state)
+ {
+ // Notify drawing area
+ emit toolSelected(GLEDrawingArea::LineTool);
+ }
+}
+
+// SLOT: user clicked the tan line tool button
+void GLEMainWindow::tanLineToolToggle(bool state)
+{
+ // User switched mode on
+ if (state)
+ {
+ // Notify drawing area
+ emit toolSelected(GLEDrawingArea::TanLineTool);
+ }
+}
+
+// SLOT: user clicked the perp line tool button
+void GLEMainWindow::perpLineToolToggle(bool state)
+{
+ // User switched mode on
+ if (state)
+ {
+ // Notify drawing area
+ emit toolSelected(GLEDrawingArea::PerpLineTool);
+ }
+}
+
+// SLOT: user clicked the circle tool button
+void GLEMainWindow::circleToolToggle(bool state)
+{
+ // User switched mode on
+ if (state)
+ {
+ // Notify drawing area
+ emit toolSelected(GLEDrawingArea::CircleTool);
+ }
+}
+
+// SLOT: user clicked the ellipse tool button
+void GLEMainWindow::ellipseToolToggle(bool state)
+{
+ // User switched mode on
+ if (state)
+ {
+ // Notify drawing area
+ emit toolSelected(GLEDrawingArea::EllipseTool);
+ }
+}
+
+// SLOT: user clicked the arc tool button
+void GLEMainWindow::arcToolToggle(bool state)
+{
+ // User switched mode on
+ if (state)
+ {
+ // Notify drawing area
+ emit toolSelected(GLEDrawingArea::ArcTool);
+ }
+}
+
+// SLOT: user clicked the text tool button
+void GLEMainWindow::textToolToggle(bool state)
+{
+ // User switched mode on
+ if (state)
+ {
+ // Notify drawing area
+ emit toolSelected(GLEDrawingArea::TextTool);
+ }
+}
+
+// SLOT: user clicked the pointer tool button
+void GLEMainWindow::moveToolToggle(bool state)
+{
+ // User switched mode on
+ if (state)
+ {
+ // Notify drawing area
+ emit toolSelected(GLEDrawingArea::AMoveTool);
+ }
+}
+
+void GLEMainWindow::renderEPS()
+{
+ renderEPS(drawingArea->getDPI());
+}
+
+void GLEMainWindow::renderEPS(double dpi)
+{
+ renderEPS(getCurrentFile()->epsFile(), dpi, getScrollAreaSize());
+}
+
+// Render an EPS file from a given QString
+void GLEMainWindow::renderEPS(QString outputFile, double dpi, const QSize& area)
+{
+ if (getCurrentFile()->isGLE())
+ {
+ GLEScript* script = getGLEScript();
+ if (!script->getRecordedBytesBuffer(GLE_DEVICE_EPS)->empty()
+ || !script->getRecordedBytesBuffer(GLE_DEVICE_PDF)->empty())
+ {
+ updateEnableActions(false);
+ renderThread->renderOutputFromMemoryToImage(script, outputFile, dpi, area);
+ return;
+ }
+ }
+ else
+ {
+ QFileInfo fi(outputFile);
+ // If the file is readable, re-render it in the new scale
+ if (fi.isReadable())
+ {
+ updateEnableActions(false);
+ renderThread->renderEPSFromFileToImage(outputFile, dpi, area);
+ return;
+ }
+ }
+ renderComplete(QImage());
+}
+
+// Refresh GLEDrawing's display
+void GLEMainWindow::refreshDisplay()
+{
+ emit imageChanged(getCurrentFile()->getImage());
+}
+
+// A signal from the server to indicate that rendering is complete
+void GLEMainWindow::renderComplete(QImage image)
+{
+ statusBarMessage("");
+ updateEnableActions(true);
+
+ GLEFileInfo* currFile = getCurrentFile();
+ // Save the image
+ currFile->setImage(image);
+ // Update the display
+ emit imageChanged(image);
+
+ updateWindowTitle();
+
+ addFilesToMonitor();
+ executeToDos();
+}
+
+void GLEMainWindow::addFilesToMonitor()
+{
+ GLEFileInfo* currFile = getCurrentFile();
+ currFile->clearFilesToMonitor();
+ GLEInterface* iface = getGLEInterface();
+ vector<GLEFileLocation> infos = iface->getFileInfos();
+ for (unsigned int i = 0; i < infos.size(); i++) {
+ GLEFileLocation& info = infos[i];
+ QString fullpath = QString::fromUtf8(info.getFullPath().c_str());
+ currFile->addFileToMonitor(fullpath);
+ }
+}
+
+//! Execute this after opening a file
+void GLEMainWindow::executeToDoAfterFileOpen()
+{
+ // Restart the timer if appropriate
+ updateFileMonitor(settings->monitorOpenFile());
+ serverThread->sendMessageToGLEMinusP(consoleWindow->toPlainText(), true);
+}
+
+//! Execute this after rendering a GLE script
+void GLEMainWindow::executeToDoAfterRenderGLE()
+{
+ consoleWindow->shouldAutoShow();
+ // Now we should really check to see if it worked or not!
+ if (consoleWindow->getOutput()->getExitCode() == 0)
+ {
+ if (currentMode != GLESettings::PreviewMode) {
+ drawingArea->clearObjects();
+ drawingArea->updateFromScript(getGLEScript());
+ objectBlocksList->updateList();
+ }
+ }
+ else
+ {
+ if (currentMode != GLESettings::PreviewMode) {
+ drawingArea->clearObjects();
+ objectBlocksList->updateList();
+ }
+ }
+}
+
+void GLEMainWindow::executeToDos()
+{
+ for (int i = todoList.size()-1; i >= 0; i--)
+ {
+ int todo = todoList.at(i);
+ switch (todo)
+ {
+ case ToDoAfterRenderGLE:
+ executeToDoAfterRenderGLE();
+ break;
+ case ToDoAfterFileOpen:
+ executeToDoAfterFileOpen();
+ break;
+ }
+ }
+ todoList.clear();
+}
+
+QString GLEMainWindow::getGLEVersion() {
+ return QString::fromUtf8(gleInterface->getGLEVersion().c_str());
+}
+
+QString GLEMainWindow::getGLEBuildDate() {
+ return QString::fromUtf8(gleInterface->getGLEBuildDate().c_str());
+}
+
+const char* GLEMainWindow::getGLETop() {
+ return gleInterface->getGLETop();
+}
+
+QString GLEMainWindow::getCompatibility() {
+ return emulateVersion->currentText();
+}
+
+//! Return true if in full page mode
+bool GLEMainWindow::isFullPage() {
+ return previewPageSize->currentIndex() == 1 || previewPageSize->currentIndex() == 2;
+}
+
+//! Return true if in landscape mode
+bool GLEMainWindow::isLandscape() {
+ return previewPageSize->currentIndex() == 2;
+}
+
+void GLEMainWindow::renderGLE()
+{
+ renderGLE(drawingArea->getDPI(), getScrollAreaSize());
+}
+
+void GLEMainWindow::renderGLE(double dpi, const QSize& area)
+{
+ // Render a GLE file into a temporary eps and return the resulting image
+ consoleWindow->clear();
+ gleInterface->clearAllCmdLine();
+ gleInterface->setMakeDrawObjects(currentMode != GLESettings::PreviewMode);
+ if (currentMode == GLESettings::PreviewMode) {
+ gleInterface->setCompatibilityMode(emulateVersion->currentText().toLatin1().constData());
+ if (previewPageSize->currentIndex() != 0) {
+ gleInterface->setCmdLineOption("fullpage");
+ }
+ if (previewPageSize->currentIndex() == 2) {
+ gleInterface->setCmdLineOption("landscape");
+ }
+ // Make sure to re-render when switching to edit mode
+ // Otherwise object blocks will be corrupt
+ currentFile[GLESettings::EditMode].clearGleFile();
+ } else {
+ gleInterface->setCompatibilityMode("4.2");
+ }
+ if (settings->isRenderUsingCairo()) {
+ gleInterface->setCmdLineOption("cairo");
+ }
+ updateEnableActions(false);
+ todoList.append(ToDoAfterRenderGLE);
+ renderThread->renderGLEToImage(getGLEScript(), getCurrentFile()->epsFile(), dpi, area);
+}
+
+// Commit changes to drawing to GLE
+void GLEMainWindow::updateGLE()
+{
+ gleInterface->clearAllCmdLine();
+ gleInterface->commitChangesGLE(getGLEScript());
+ consoleWindow->shouldAutoShow();
+}
+
+//! Show console window if there is output
+void GLEMainWindow::shouldAutoShowConsole()
+{
+ consoleWindow->shouldAutoShow();
+}
+
+// SLOT: display the about box
+void GLEMainWindow::about()
+{
+ box = new AboutBox(this, getGLEInterface());
+ box->setModal(true);
+ box->show();
+}
+
+// SLOT: open the GLE website
+void GLEMainWindow::showGLEWebsite() {
+ QUrl url("http://www.gle-graphics.org/");
+ QDesktopServices::openUrl(url);
+}
+
+// SLOT: show a given URL
+void GLEMainWindow::showURL(const QUrl& url) {
+ QDesktopServices::openUrl(url);
+}
+
+// Open a local file using the mime type application registered for it
+void GLEMainWindow::showLocalFile(const QString& name) {
+ QFileInfo file(name);
+ if (!file.exists()) {
+ QString msg = tr("File not found: '%1'").arg(name);
+ QMessageBox::critical(this, APP_NAME, msg, QMessageBox::Ok, QMessageBox::NoButton, QMessageBox::NoButton);
+ return;
+ }
+ if (QGLE::getFileNameExtension(name) == "pdf") {
+ // Preview a PDF with the application set in .glerc as "pdfviewer"
+ string pdfview = getGLEInterface()->getToolLocation("pdfviewer");
+ if (pdfview != "") {
+ QProcess pdfReader;
+ pdfReader.startDetached(pdfview.c_str(), QStringList() << name);
+ return;
+ }
+ }
+ #ifdef Q_WS_WIN
+ // Why does Windows require three slashes for a file Url?
+ QUrl url(tr("file:///") + name);
+ QDesktopServices::openUrl(url);
+ #else
+ QUrl url(tr("file://") + name);
+ QDesktopServices::openUrl(url);
+ #endif
+}
+
+// SLOT: open the GLE manual
+void GLEMainWindow::showGLEManual() {
+ string name = getGLEInterface()->getManualLocation();
+ showLocalFile(QString::fromUtf8(name.c_str()));
+}
+
+// SLOT: abort QGLE
+void GLEMainWindow::abort() {
+ exit(0);
+}
+
+// Create the menus and add the actions
+void GLEMainWindow::createMenus()
+{
+ // File menu
+ fileMenu = menuBar()->addMenu(tr("&File"));
+ fileMenu->addAction(newAct);
+ fileMenu->addAction(openAct);
+ fileMenu->addAction(openInNewWindowAct);
+ editFileMenu = fileMenu->addMenu(tr("&Edit"));
+ editFileMenu->setIcon(QIcon(":images/editor.png"));
+ fileMenu->addAction(saveAct);
+ fileMenu->addAction(saveAsAct);
+ fileMenu->addAction(exportAct);
+ fileMenu->addAction(browseAct);
+ // fileMenu->addAction(printAct);
+
+ separatorAct = fileMenu->addSeparator();
+ for (int i = 0; i < MaxRecentFiles; i++)
+ fileMenu->addAction(recentFileActs[i]);
+ updateRecentFileActions();
+
+ fileMenu->addSeparator();
+ fileMenu->addAction(quitAct);
+
+ connect(editFileMenu, SIGNAL(aboutToShow()),
+ this, SLOT(createEditFileMenu()));
+
+ // Edit menu
+ QMenu *editMenu = menuBar()->addMenu(tr("&Edit"));
+ editMenu->addAction(copyBitmapAct);
+ if (copyPDFAct != NULL) editMenu->addAction(copyPDFAct);
+ if (copyEMFAct != NULL) editMenu->addAction(copyEMFAct);
+
+ QMenu *viewMenu = menuBar()->addMenu(tr("&View"));
+ viewMenu->addAction(reloadAct);
+ viewMenu->addAction(zoomInAct);
+ viewMenu->addAction(zoomOutAct);
+ viewMenu->addAction(zoomAutoAct);
+ viewMenu->addAction(previewModeAct);
+ viewMenu->addAction(editModeAct);
+
+ // Tools menu
+ toolsMenu = menuBar()->addMenu(tr("&Tools"));
+ toolsMenu->addAction(settingsAct);
+ toolsMenu->addAction(evaluatorAct);
+ toolsMenu->addAction(view3DAct);
+ toolsMenu->addAction(ghostScriptLogWindowAct);
+ // toolsMenu->addAction(downloadAct);
+
+ // Help menu
+ helpMenu = menuBar()->addMenu(tr("&Help"));
+ helpMenu->addAction(gleManualAct);
+ helpMenu->addAction(gleSiteAct);
+ helpMenu->addAction(aboutAct);
+}
+
+#define STATUS_BAR_LABEL_STYLE QFrame::NoFrame | QFrame::Plain
+
+void GLEMainWindow::createStatusBar()
+{
+ // Create a status bar with an initial message
+ statusBar()->showMessage(tr("Ready"));
+
+ // Create a coordinate display (using GLE coordinates)
+ mousePosition = new QLabel();
+ mousePosition->setFrameStyle(STATUS_BAR_LABEL_STYLE);
+ mousePosition->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
+
+ dpiDisplay = new QLabel();
+ dpiDisplay->setFrameStyle(STATUS_BAR_LABEL_STYLE);
+ dpiDisplay->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
+
+ // Create the snap button
+/* gridSnapButton = new QPushButton(tr("SNAP"));
+ gridSnapButton->resize(0.4*gridSnapButton->size());
+ gridSnapButton->setFlat(true);
+ gridSnapButton->setCheckable(true);
+ connect(gridSnapButton, SIGNAL(toggled(bool)),
+ gridSnapAct, SLOT(setChecked(bool)));
+ statusBar()->addPermanentWidget(gridSnapButton);*/
+
+ // Set size and disable auto resize?
+ statusBar()->addPermanentWidget(dpiDisplay);
+ statusBar()->addPermanentWidget(mousePosition);
+ updateMousePosition(QPointF(0.0,0.0));
+ // Display the default resolution
+ updateDPIDisplay(-1.0);
+ connect(drawingArea, SIGNAL(mouseMoved(QPointF)),
+ this, SLOT(updateMousePosition(QPointF)));
+}
+
+void GLEMainWindow::updateDPIDisplay(double newDPI)
+{
+ // Display the current resolution on the status bar
+ if (newDPI < 0.0)
+ {
+ dpiDisplay->setVisible(false);
+ }
+ else
+ {
+ dpiDisplay->setVisible(true);
+ dpiDisplay->setText(QString(tr("R:%1", "Resolution Indicator"))
+ .arg(newDPI,8,'f',2));
+ dpiDisplay->setFixedSize(100,24);
+ }
+}
+
+
+// Update the coordinate display
+void GLEMainWindow::updateMousePosition(QPointF gle)
+{
+
+ if (gle == QPointF(-1.0,-1.0))
+ gle = lastMousePosition;
+ else
+ lastMousePosition = gle;
+
+ double r, theta;
+ switch (coordView)
+ {
+ case CoordinateOff:
+ // Don't display anything
+ mousePosition->setText("");
+ break;
+ case CoordinateCart:
+ // Cartesian coordinates
+ mousePosition->setText(QString("%1,%2").arg(gle.x(),5,'f',2).arg(gle.y(),5,'f',2));
+ break;
+ case CoordinatePolar:
+ // Polar coordinates
+ r = sqrt(pow(gle.x(),2)+pow(gle.y(),2));
+ theta = QGLE::radiansToDegrees(atan2(gle.y(),gle.x()));
+ mousePosition->setText(QString("%1<%2").arg(r,5,'f',2).arg(theta,5,'f',2));
+ break;
+ case CoordinateRelCart:
+ // Cartesian coordinates relative to the last point used in drawing
+ mousePosition->setText(QString("@%1,%2")
+ .arg(gle.x()-lastPoint.x(),5,'f',2)
+ .arg(gle.y()-lastPoint.y(),5,'f',2));
+ break;
+ case CoordinateRelPolar:
+ // Polar coordinates relative to the last point used in drawing
+ r = sqrt(pow(gle.x()-lastPoint.x(),2)+pow(gle.y()-lastPoint.y(),2));
+ theta = QGLE::radiansToDegrees(atan2(gle.y()-lastPoint.y(),gle.x()-lastPoint.x()));
+ mousePosition->setText(QString("@%1<%2").arg(r,5,'f',2).arg(theta,5,'f',2));
+ break;
+ }
+ // Fix the size of the display
+ mousePosition->setFixedSize(100,24);
+
+}
+
+// SLOT: Display a requested message on the status bar
+void GLEMainWindow::updateServerStatus(QString message)
+{
+ statusBar()->showMessage(message);
+}
+
+// SLOT: Display a requested message on the status bar
+void GLEMainWindow::statusBarMessage(QString msg)
+{
+ statusBar()->showMessage(msg);
+}
+
+//! Display an error message in the console
+void GLEMainWindow::showConsoleError(QString message)
+{
+ consoleWindow->println(renderThread->getGhostScriptOutput());
+ consoleWindow->println(message);
+ consoleWindow->shouldAutoShow();
+}
+
+// SLOT: Open the Settings Dialogue
+void GLEMainWindow::openSettingsDialogue()
+{
+ SettingsDialogue settingsDialogue(this);
+ settingsDialogue.exec();
+}
+
+// SLOT: Display 3D viewer
+void GLEMainWindow::openView3DDialogue()
+{
+ QGLE3DViewer* viewer = new QGLE3DViewer(this, gleInterface);
+ viewer->show();
+}
+
+// SLOT: Display GhostScript's log dialogue box
+void GLEMainWindow::openGhostScriptLogDialogue()
+{
+ QDialog gsLogDialog(this);
+ gsLogDialog.setWindowTitle("GhostScript's Log");
+ QVBoxLayout *layout = new QVBoxLayout();
+ QLabel *stdoutlab = new QLabel(tr("Output:"));
+ layout->addWidget(stdoutlab);
+ QTextEdit* stdouttxt = new QTextEdit();
+ stdouttxt->setReadOnly(TRUE);
+ stdouttxt->insertPlainText(renderThread->getGhostScriptOutput());
+ layout->addWidget(stdouttxt);
+ QPushButton *okButton = new QPushButton(tr("OK"));
+ connect(okButton, SIGNAL(clicked()), &gsLogDialog, SLOT(close()));
+ QHBoxLayout *buttonLayout = new QHBoxLayout();
+ buttonLayout->addStretch(1);
+ buttonLayout->addWidget(okButton);
+ layout->addLayout(buttonLayout);
+ gsLogDialog.setLayout(layout);
+ QRect size = QApplication::desktop()->screenGeometry(&gsLogDialog);
+ gsLogDialog.resize(size.width()/2, size.height()/2);
+ gsLogDialog.exec();
+}
+
+void GLEMainWindow::openEvaluator()
+{
+ if (evaluatorDialog == NULL)
+ {
+ evaluatorDialog = new EvaluatorDialog(this);
+ QRect size = QApplication::desktop()->screenGeometry(evaluatorDialog);
+ evaluatorDialog->resize(size.width()/3, size.height()/2);
+ }
+ evaluatorDialog->show();
+}
+
+//! Display export dialogue box
+void GLEMainWindow::openExportDialogue()
+{
+ if (getGLEScript() != NULL) {
+ ExportDialogue exp(this);
+ exp.exec();
+ }
+}
+
+// SLOT: Display print dialogue box
+void GLEMainWindow::openPrintDialogue()
+{
+
+}
+
+void GLEMainWindow::openDownloadDialogue()
+{
+/* QGLEDownloader* down = new QGLEDownloader(this);
+ down->setModal(true);
+ down->show();
+ down->exec();*/
+}
+
+void GLEMainWindow::save()
+{
+ if (drawingArea->isDirty())
+ {
+ GLEFileInfo* currFile = getCurrentFile();
+ if (currFile->hasFileName())
+ {
+ QFileInfo file;
+ file.setFile(currFile->gleFile());
+ if (file.isReadable() && file.isWritable())
+ {
+ save(currFile->gleFile());
+ return;
+ }
+ }
+ // If we don't have a file name and/or the file
+ // isn't readable and writable, ask for a new file name.
+ saveAs();
+ }
+}
+
+void GLEMainWindow::saveAs()
+{
+ QString fileType;
+ const char* fileExt;
+ if (getCurrentFile()->isGLE()) {
+ fileType = tr("GLE Files (*.gle)");
+ fileExt = "gle";
+ } else {
+ fileType = tr("EPS Files (*.eps)");
+ fileExt = "eps";
+ }
+
+ // Ask for a filename and save accordingly
+ QString fileName = QFileDialog::getSaveFileName(this,
+ tr("Choose a file name to save under"),
+ settings->pwd(), fileType);
+
+ if (fileName.isEmpty())
+ return;
+
+ // Add .gle or .eps if here isn't one already
+ QGLE::ensureFileNameExtension(&fileName, fileExt);
+
+ QFileInfo fname(fileName);
+ settings->setPwd(fname.dir().path());
+
+ save(fileName);
+}
+
+void GLEMainWindow::save(QString fileName)
+{
+ // Save to a given filename
+ bool wasActive = false;
+
+ // Stop the timer as it'll get confused by us writing out own file
+ if (fileMonitorTimer->isActive())
+ {
+ wasActive = true;
+ fileMonitorTimer->stop();
+ }
+
+ // Check if we are saving a GLE or EPS file
+ GLEFileInfo* currFile = getCurrentFile();
+ if (currFile->isGLE()) {
+ if (currentMode == GLESettings::EditMode && drawingArea->thereAreNewObjects())
+ {
+ updateGLE();
+ }
+ gleInterface->saveGLEFile(getGLEScript(), fileName.toLatin1().constData());
+ } else {
+ // Copy EPS file to new name
+ string error;
+ string from = getCurrentFile()->primaryFile().toUtf8().constData();
+ string to = fileName.toUtf8().constData();
+ if (gleInterface->copyFile(from, to, &error) != 0) {
+ QMessageBox::critical(this, APP_NAME, tr("Error: ")+QString::fromUtf8(error.c_str()),
+ QMessageBox::Ok,
+ QMessageBox::NoButton,
+ QMessageBox::NoButton);
+ }
+ }
+
+ // Clear the dirty flag
+ drawingArea->clearDirty();
+ // Check that currentFile points to the correct file
+ if (currFile->isGLE()) {
+ currFile->setGleFile(fileName);
+ } else {
+ currFile->setEpsFile(fileName);
+ }
+ updateWindowTitle();
+
+ // Close the output and update the time stamp
+ currFile->updateTimeStamp();
+
+ // Add file to recent file list
+ setCurrentFile(fileName);
+
+ // Restart the timer if appropriate
+ if (wasActive)
+ {
+ fileMonitorTimer->start();
+ }
+}
+
+// SLOT: Open file in new window
+void GLEMainWindow::openFileInNewWindow()
+{
+ QString fileName = QFileDialog::getOpenFileName(this, tr("Select a file to open"),
+ settings->pwd(), tr("GLE Files (*.gle);;EPS Files (*.eps)"));
+
+ // If we now have a filename, open it
+ if (!fileName.isEmpty())
+ {
+ QProcess qgle;
+ qgle.startDetached(QGLE::GetExeName(), QStringList() << fileName);
+ }
+}
+
+// SLOT: Browse the script folder
+void GLEMainWindow::browseScriptFolder()
+{
+ QFileInfo fname(getCurrentFile()->primaryFile());
+ showLocalFile(fname.dir().path());
+}
+
+// SLOT: Open an existing file
+void GLEMainWindow::openFile(QString fileName, bool isOnStartup)
+{
+ bool isReload = (getCurrentGleFile() == fileName);
+
+ // If changes have been made, ask what to do
+ if (!isReload && drawingArea->isDirty())
+ {
+ int reply = QMessageBox::question(this, tr("Open New File"),
+ tr("Save changes to drawing?"),
+ QMessageBox::Yes,
+ QMessageBox::No,
+ QMessageBox::Cancel);
+
+ if (reply == QMessageBox::Yes)
+ {
+ save();
+ }
+ else if (reply == QMessageBox::Cancel)
+ {
+ updateFileMonitor(settings->monitorOpenFile());
+ return;
+ }
+ }
+
+ // If we don't have a filename (i.e. if called as a slot rather than
+ // as a function), ask what file to open
+ if (fileName.isEmpty())
+ fileName = QFileDialog::getOpenFileName(this,
+ tr("Select a file to open"),
+ settings->pwd(),
+ tr("GLE Files (*.gle);;EPS Files (*.eps)"));
+
+ // If we now have a filename, open it
+ if (!fileName.isEmpty())
+ {
+ // In case we crash
+ SetQGLEScriptNameBackup(fileName);
+ // Check whether to autoscale and get the resolution
+ bool autoScale = settings->autoScaleOnOpen() && !isReload;
+ QSize scaleSize = isOnStartup ? settings->drawingAreaSize() : getScrollAreaSize();
+ if (!isReload && !autoScale) {
+ drawingArea->setDPI((double)settings->dpi());
+ }
+ double dpi = autoScale ? 0.0 : drawingArea->getDPI();
+
+ // Get the file information
+ QFileInfo fname(fileName);
+ settings->setPwd(fname.dir().path());
+ // Regular expressions to check whether it's an EPS file or a GLE file
+ QRegExp rxeps(".*\\.eps$", Qt::CaseInsensitive);
+ QRegExp rxgle(".*\\.gle$", Qt::CaseInsensitive);
+
+ // Clear other mode file info
+ getNonCurrentModeFileInfo()->clear();
+
+ // Add file to recent file list
+ setCurrentFile(fileName);
+
+ // Restart file monitor and notify "GLE -p" process
+ todoList.append(ToDoAfterFileOpen);
+
+ // Stop the timer
+ updateFileMonitor(false);
+
+ // An EPS file, so open it.
+ GLEFileInfo* currFile = getCurrentFile();
+ if(rxeps.exactMatch(fileName))
+ {
+ currFile->clear();
+ currFile->setEpsFile(fileName);
+ getNonCurrentModeFileInfo()->setEpsFile(fileName);
+ currFile->updateTimeStamp();
+ resetDrawing();
+ clearConsoleWindow();
+ if (currentMode == GLESettings::PreviewMode) renderEPS(fileName, dpi, scaleSize);
+ else previewModeAct->setChecked(true);
+ }
+ // A GLE file, so render it and open the resulting EPS file
+ else if (rxgle.exactMatch(fileName))
+ {
+ currFile->clear();
+ resetDrawing();
+ clearConsoleWindow();
+ gleScript = gleInterface->loadGLEFile(fileName.toLatin1().constData());
+ if (!gleScript.isNull()) {
+ currFile->setGleFile(fileName);
+ currFile->updateTimeStamp();
+ initTempFilesGLE();
+ renderGLE(dpi, scaleSize);
+ } else {
+ renderComplete(QImage());
+ }
+ }
+ }
+}
+
+// SLOT: Create a blank page
+void GLEMainWindow::newFile()
+{
+ // Should we save changes?
+ if (drawingArea->isDirty())
+ {
+ int reply = QMessageBox::question(this, tr("Create New File"),
+ tr("Save changes to drawing?"),
+ QMessageBox::Yes, QMessageBox::No, QMessageBox::Cancel);
+
+ if (reply == QMessageBox::Yes)
+ save();
+ else if (reply == QMessageBox::Cancel)
+ return;
+ }
+
+ // Ask the user what size drawing to create
+ NewFileBox nfb;
+
+ int dialogue_result = nfb.exec();
+
+ if (dialogue_result == QDialog::Rejected)
+ return;
+
+ QString fileName;
+ if (nfb.shouldSave())
+ {
+ fileName = QFileDialog::getSaveFileName(this, tr("Choose a file name to save under"), settings->pwd(), tr("GLE Files (*.gle)"));
+ if (fileName.isEmpty()) return;
+
+ // Add a .gle if there isn't one already
+ QRegExp rxGLE(".*\\.[gG][lL][eE]");
+ if(!rxGLE.exactMatch(fileName)) fileName += ".gle";
+ }
+
+ // Stop the timer
+ updateFileMonitor(false);
+
+ resetDrawing();
+ newDiagramSize = nfb.size();
+
+ // Clear the current drawing
+ getNonCurrentModeFileInfo()->clear();
+ GLEFileInfo* currFile = getCurrentFile();
+ currFile->clear();
+ currFile->setGleFile(tr("No Name"));
+ currFile->setHasFileName(false);
+ initTempFilesGLE();
+
+ // Check whether to autoscale and get the resolution
+ bool autoScale = settings->autoScaleOnOpen();
+ if (!autoScale) drawingArea->setDPI((double) settings->dpi());
+ double dpi = autoScale ? 0.0 : drawingArea->getDPI();
+
+ emulateVersion->setCurrentIndex(0);
+ previewPageSize->setCurrentIndex(0);
+ settings->setEmulateGLEVersion(0);
+ settings->setPreviewPageSize(0);
+
+ // The file is very simple: just one line "size x y"
+ // The "amove" works around a bug in GLE
+ QString code = QString("size %1 %2\n").arg(QGLE::GLEToStr(newDiagramSize.width())).arg(QGLE::GLEToStr(newDiagramSize.height()));
+
+ if (fileName == "")
+ {
+ gleScript = gleInterface->newGLEFile(code.toLatin1().constData(), tempFiles[NewGLE].toLatin1().constData());
+ // Since we've added a "size" line, the file has (arguably) changed
+ updateWindowTitle();
+ drawingArea->setDirty();
+ }
+ else
+ {
+ gleScript = gleInterface->newGLEFile(code.toLatin1().constData(), fileName.toLatin1().constData());
+ save(fileName);
+ }
+
+ // Restart file monitor and notify "GLE -p" process
+ todoList.append(ToDoAfterFileOpen);
+
+ // Render GLE script
+ gleInterface->showGLEFile(getGLEScript());
+ renderGLE(dpi, getScrollAreaSize());
+}
+
+void GLEMainWindow::openRecentFile()
+{
+ QAction *action = qobject_cast<QAction *>(sender());
+ if (action)
+ openFile(action->data().toString());
+}
+
+void GLEMainWindow::openRelatedFile()
+{
+ QAction *action = qobject_cast<QAction *>(sender());
+ if (action)
+ {
+ openInTextEditor(action->data().toString());
+ }
+}
+
+void GLEMainWindow::updateRecentFileActions()
+{
+ QSettings settings("gle", "qgle");
+ QStringList files = settings.value("application/recentfiles").toStringList();
+
+ int numRecentFiles = qMin(files.size(), (int)MaxRecentFiles);
+
+ for (int i = 0; i < numRecentFiles; ++i) {
+ QString text = tr("&%1 %2").arg(i + 1).arg(QFileInfo(files[i]).fileName());
+ recentFileActs[i]->setText(text);
+ recentFileActs[i]->setData(files[i]);
+ recentFileActs[i]->setVisible(true);
+ }
+ for (int j = numRecentFiles; j < MaxRecentFiles; ++j)
+ recentFileActs[j]->setVisible(false);
+
+ separatorAct->setVisible(numRecentFiles > 0);
+}
+
+void GLEMainWindow::createEditFileMenu()
+{
+ GLEInterface* iface = getGLEInterface();
+ vector<GLEFileLocation> infos = iface->getFileInfos();
+ editFileMenu->clear();
+ GLEFileInfo* currFile = getCurrentFile();
+ if (currFile->primaryFile() == "") {
+ QAction* noRel = editFileMenu->addAction(tr("No files to edit"));
+ noRel->setEnabled(false);
+ } else {
+ QFileInfo fh(currFile->primaryFile());
+ QAction* mAct = editFileMenu->addAction(fh.fileName());
+ QString status = tr("Open file '%1'").arg(fh.fileName());
+ mAct->setStatusTip(status);
+ connect(mAct, SIGNAL(triggered()), this, SLOT(openInTextEditor()));
+ for (unsigned int i = 0; i < infos.size(); i++) {
+ GLEFileLocation& info = infos[i];
+ QString name = QString::fromUtf8(info.getName().c_str());
+ QAction* fAct = editFileMenu->addAction(name);
+ QString fullpath = QString::fromUtf8(info.getFullPath().c_str());
+ fAct->setToolTip(fullpath);
+ fAct->setData(fullpath);
+ QString status = tr("Open related file '%1'").arg(name);
+ fAct->setStatusTip(status);
+ connect(fAct, SIGNAL(triggered()), this, SLOT(openRelatedFile()));
+ }
+ }
+}
+
+void GLEMainWindow::createEditFilePopup(const QPoint& pos) {
+ GLEInterface* iface = getGLEInterface();
+ vector<GLEFileLocation> infos = iface->getFileInfos();
+ QMenu editFilePopup(this);
+ if (infos.size() == 0) {
+ QAction* noRel = editFilePopup.addAction(tr("No additional files to edit"));
+ noRel->setStatusTip(tr("Open related files such as data files, include files, ..."));
+ noRel->setEnabled(false);
+ } else {
+ for (unsigned int i = 0; i < infos.size(); i++) {
+ GLEFileLocation& info = infos[i];
+ QString name = QString::fromUtf8(info.getName().c_str());
+ QAction* fAct = editFilePopup.addAction(name);
+ QString fullpath = QString::fromUtf8(info.getFullPath().c_str());
+ fAct->setToolTip(fullpath);
+ fAct->setData(fullpath);
+ QString status = tr("Open related file '%1'").arg(name);
+ fAct->setStatusTip(status);
+ connect(fAct, SIGNAL(triggered()), this, SLOT(openRelatedFile()));
+ }
+ }
+ editFilePopup.exec(editorBut->mapToGlobal(pos));
+}
+
+void GLEMainWindow::setCurrentFile(const QString &fileName)
+{
+ QSettings settings("gle", "qgle");
+ QStringList files = settings.value("application/recentfiles").toStringList();
+ files.removeAll(fileName);
+ files.prepend(fileName);
+ while (files.size() > MaxRecentFiles) {
+ files.removeLast();
+ }
+ settings.setValue("application/recentfiles", files);
+ foreach (QWidget *widget, QApplication::topLevelWidgets()) {
+ GLEMainWindow *mainWin = qobject_cast<GLEMainWindow *>(widget);
+ if (mainWin)
+ mainWin->updateRecentFileActions();
+ }
+}
+
+void GLEMainWindow::copyBitmap() {
+ QClipboard *clipboard = QApplication::clipboard();
+ clipboard->setImage(getCurrentFile()->getImage());
+}
+
+#ifdef Q_WS_MAC
+bool copyPDFMac(const string& fname);
+#endif
+
+//! Action causing the current figure to be copied to the clipboard as PDF
+void GLEMainWindow::copyPDF() {
+ QString tempDir = QDir::tempPath();
+ QRegExp rxEndSlash(".*[\\\\/]$");
+ if (!rxEndSlash.exactMatch(tempDir))
+ tempDir += QDir::separator();
+ QString pdfname = tempDir + tr("qgle_copy.pdf");
+ GLEInterface* iface = getGLEInterface();
+ clearConsoleWindow();
+ iface->clearAllCmdLine();
+ iface->setMakeDrawObjects(false);
+ iface->renderGLE(getGLEScript(), pdfname.toLatin1().constData(), GLE_DEVICE_PDF);
+ iface->clearAllCmdLine();
+ #ifndef Q_WS_MAC
+ QFile file(pdfname);
+ if (!file.open(QIODevice::ReadOnly)) {
+ consoleWindow->println(tr("Can't open PDF: ")+pdfname);
+ return;
+ }
+ QByteArray pdfData = file.readAll();
+ file.close();
+ QMimeData *mimeData = new QMimeData();
+ mimeData->setData("x-pdf", pdfData);
+ QClipboard *clipboard = QApplication::clipboard();
+ clipboard->setMimeData(mimeData);
+ #else
+ copyPDFMac(string(pdfname.toUtf8().constData()));
+ #endif
+}
+
+//! Action causing the current figure to be copied to the clipboard as EMF
+void GLEMainWindow::copyEMF() {
+ GLEInterface* iface = getGLEInterface();
+ clearConsoleWindow();
+ iface->clearAllCmdLine();
+ iface->setMakeDrawObjects(false);
+ iface->setCmdLineOption("copy");
+ iface->renderGLE(getGLEScript(), "", GLE_DEVICE_EMF);
+ iface->clearAllCmdLine();
+}
+
+void GLEMainWindow::resetDrawing()
+{
+ // Reset the drawing.
+ drawingArea->clearDirty();
+ drawingArea->clearObjects();
+ drawingArea->clearNewObjectsFlag();
+}
+
+// SLOT: Reload File
+void GLEMainWindow::reloadFile()
+{
+ openFile(getCurrentFile()->primaryFile());
+}
+
+// SLOT: Zoom In
+void GLEMainWindow::zoomIn()
+{
+ double dpi = drawingArea->getDPI();
+ dpi *= ZOOM_STEP;
+ drawingArea->setDPI(dpi);
+ zoom(dpi);
+}
+
+// SLOT: Zoom Out
+void GLEMainWindow::zoomOut()
+{
+ double dpi = drawingArea->getDPI();
+ dpi /= ZOOM_STEP;
+ drawingArea->setDPI(dpi);
+ zoom(dpi);
+}
+
+// SLOT: Zoom Automatically
+void GLEMainWindow::zoomAuto()
+{
+ // dpi = 0.0 means auto-scale
+ renderEPS(0.0);
+}
+
+// Zoom worker
+void GLEMainWindow::zoom(double dpi)
+{
+ renderEPS(dpi);
+}
+
+void GLEMainWindow::openInTextEditor()
+{
+
+ QString file = getCurrentFile()->primaryFile();
+ QFileInfo fh(file);
+ if (!fh.isReadable())
+ {
+ int answer = QMessageBox::question(this, APP_NAME,
+ tr("File does not exist, do you wish to save the current document?"),
+ tr("Yes"),
+ tr("Cancel"), 0, 1);
+ if (answer == 0)
+ save();
+ else
+ return;
+ }
+ file = getCurrentFile()->primaryFile();
+ fh.setFile(file);
+ if (!fh.isReadable())
+ {
+ QMessageBox::critical(this, APP_NAME, tr("Problem saving!"),
+ QMessageBox::Ok,
+ QMessageBox::NoButton,
+ QMessageBox::NoButton);
+ return;
+ }
+ openInTextEditor(file);
+}
+
+void GLEMainWindow::openInTextEditor(const QString& file)
+{
+ bool res;
+ if (QGLE::isGraphicsExtension(file))
+ {
+ // GLE script may include bitmap graphics - don't open these with text editor
+ showLocalFile(file);
+ return;
+ }
+ QString editor = settings->editorLocation();
+ if (editor.isEmpty())
+ {
+ QMessageBox::critical(this, APP_NAME, tr("Please select text editor in Options | Tools"),
+ QMessageBox::Ok,
+ QMessageBox::NoButton,
+ QMessageBox::NoButton);
+ }
+ else
+ {
+ QProcess edit;
+ QString filename = file;
+#ifdef Q_WS_WIN
+ filename.replace('/', '\\');
+#endif
+
+#ifdef Q_WS_MAC
+ // This checks whether we're on a Mac and if so, handles .app files appropriately
+ QRegExp rxApp(".*\\.app");
+ if (rxApp.exactMatch(editor))
+ {
+ res = edit.startDetached("open", QStringList() << "-a" << editor << filename);
+ }
+ else
+#endif
+ {
+ res = edit.startDetached(editor, QStringList() << filename);
+ }
+// TEMPORARY FIX for problem with startDetached always failing
+#ifndef Q_WS_MAC
+ if (!res)
+ {
+ QMessageBox::critical(this, APP_NAME, tr("Failed to start text editor (configure it in Options | Tools)"),
+ QMessageBox::Ok,
+ QMessageBox::NoButton,
+ QMessageBox::NoButton);
+ }
+#endif
+ }
+}
+
+// Set a point upon which to base the relative coordinate system
+void GLEMainWindow::setRelativeBasePoint(QPointF gle)
+{
+ lastPoint = gle;
+}
+
+// Get the size of the scoll area
+QSize GLEMainWindow::getScrollAreaSize()
+{
+ return scrollArea->size();
+}
+
+// Get the current file name
+QString GLEMainWindow::getCurrentGleFile()
+{
+ return getCurrentFile()->gleFile();
+}
+
+GLEInterface* GLEMainWindow::getGLEInterface()
+{
+ return gleInterface;
+}
+
+GLEScript* GLEMainWindow::getGLEScript()
+{
+ return gleScript.get();
+}
+
+// Enable or disable the save button
+void GLEMainWindow::setSaveEnable(bool state)
+{
+ saveAct->setEnabled(state);
+}
+
+// Render Postscript code to QImage
+void GLEMainWindow::renderPostscript(const char* ps, const GLERectangle& rect, double dpi, QImage* result)
+{
+ // qDebug() << "Rendering: " << rect.getWidth() << " x " << rect.getHeight();
+ renderThread->startRender(rect, dpi);
+ QString translate = QString("%1 %2 translate\n").arg(-rect.getXMin()*PS_POINTS_PER_INCH/CM_PER_INCH).arg(-rect.getYMin()*PS_POINTS_PER_INCH/CM_PER_INCH);
+ renderThread->nextRender(translate.toLatin1().constData());
+ renderThread->nextRender(gleInterface->getInitialPostScript());
+ renderThread->nextRender(ps);
+ renderThread->nextRender(gleInterface->getTerminatePostScript());
+ renderThread->endRender(result);
+}
+
diff --git a/src/gui/mainwindow.h b/src/gui/mainwindow.h
new file mode 100644
index 0000000..7664361
--- /dev/null
+++ b/src/gui/mainwindow.h
@@ -0,0 +1,550 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+#ifndef __GLEMAINWINDOW_H
+#define __GLEMAINWINDOW_H
+
+#include <QtGui>
+#include "qgs.h"
+#include "serverthread.h"
+#include "drawingobject.h"
+#include "qgle_definitions.h"
+#include "fileinfo.h"
+#include "about.h"
+#include "propertyeditor.h"
+#include "objectblocks.h"
+
+#include "../gle/gle-interface/gle-interface.h"
+
+class GLESettings;
+class ConsoleWindow;
+class EvaluatorDialog;
+class QDockWidget;
+
+//! Class implementing Main QGLE Window
+/*!
+ * This class is responsible for controlling the graphical user
+ * interface, setting up signals & slots, providing menu bars and so
+ * on. Like most of the classes in this project, it is a descendant of
+ * QObject, so has access to internationalisation functions etc.
+ */
+class GLEMainWindow : public QMainWindow
+{
+ // The QT moc macro
+ Q_OBJECT
+
+public:
+ //! Constructor
+ /*!
+ * Responsible for generation of the Window and initialisation
+ * of children, signals & slots.
+ */
+ GLEMainWindow(int argc, char *argv[]);
+
+ //! Return the GLE version
+ QString getGLEVersion();
+ QString getGLEBuildDate();
+ //! Return the GLE version
+ const char* getGLETop();
+ //! Return the current compatibility mode
+ QString getCompatibility();
+ //! Return true if in full page mode
+ bool isFullPage();
+ //! Return true if in landscape mode
+ bool isLandscape();
+ //! Return the GS version
+ inline const QString& getGsLibVersion() { return GsLibVersionNumber; }
+ //! Render Postscript code to QImage
+ void renderPostscript(const char* ps, const GLERectangle& rect, double dpi, QImage* result);
+ //! Render an EPS file from currentFile.epsFile()
+ void renderEPS();
+ //! Render an EPS file from currentFile.epsFile()
+ void renderEPS(double dpi);
+ //! Render an EPS file
+ void renderEPS(QString epsFile, double dpi, const QSize& area);
+ // Refresh GLEDrawing's display
+ void refreshDisplay();
+ //! Select the pointer tool from the edit mode toolbar
+ void selectPointerTool();
+
+protected:
+ //! Called when QGLE is closing
+ void closeEvent(QCloseEvent *event);
+ //! Called when a MIME object is dragged onto window
+ void dragEnterEvent(QDragEnterEvent *event);
+ //! Called when a MIME object is dropped on the window
+ void dropEvent(QDropEvent *event);
+ //! Called when the user presses a key
+ void keyPressEvent(QKeyEvent *event);
+ //! Called when the user releases a key
+ void keyReleaseEvent(QKeyEvent *event);
+
+private slots:
+ //! Display an About Box
+ void about();
+ //! Open the GLE website
+ void showGLEWebsite();
+ //! Open a given URL
+ void showURL(const QUrl&);
+ //! Open the GLE manual
+ void showGLEManual();
+ //! Abort QGLE
+ void abort();
+ //! Display a server status message
+ void updateServerStatus(QString message);
+ //! Display an error message in the console
+ void showConsoleError(QString message);
+ //! Start or stop the server
+ void serverToggle(bool switchOn);
+ //! Start the server
+ void startServer();
+ //! Stop the server
+ void stopServer();
+ //! Initialize render thread
+ void initRenderThread();
+ //! Display the settings dialogue box
+ void openSettingsDialogue();
+ //! Display GhostScript's log dialogue box
+ void openGhostScriptLogDialogue();
+ //! Display 3D viewer
+ void openView3DDialogue();
+ //! Display the expression evaluator dialogue box
+ void openEvaluator();
+ //! Display export dialogue box
+ void openExportDialogue();
+ //! Display print dialogue box
+ void openPrintDialogue();
+ //! Open download dialog box
+ void openDownloadDialogue();
+ //! Open file in new window
+ void openFileInNewWindow();
+ //! Browse the folder containing the current script
+ void browseScriptFolder();
+ //! Open an existing file
+ void openFile(QString fileName = QString(), bool isOnStartup = false);
+ //! Open a recently opened file
+ void openRecentFile();
+ //! Open a related file
+ void openRelatedFile();
+ //! Create "open related file" submenu
+ void createEditFileMenu();
+ //! Create "open in editor" popup submenu
+ void createEditFilePopup(const QPoint& pos);
+ //! Create a new file
+ void newFile();
+ //! Save the file
+ void save();
+ //! Save the file under a new name
+ void saveAs();
+ //! Save the file under the given name
+ void save(QString fileName);
+ //! Action causing the current bitmap to be copied to the clipboard
+ void copyBitmap();
+ //! Action causing the current figure to be copied to the clipboard as PDF
+ void copyPDF();
+ //! Action causing the current figure to be copied to the clipboard as EMF
+ void copyEMF();
+ //! Switch to preview mode
+ void previewModeToggle(bool state);
+ //! Switch to edit mode
+ void editModeToggle(bool state);
+
+ //! Switch to pointer tool
+ void pointerToolToggle(bool state);
+ //! Switch to line tool
+ void lineToolToggle(bool state);
+ void textToolToggle(bool state);
+ void tanLineToolToggle(bool state);
+ void perpLineToolToggle(bool state);
+ //! Switch to circle tool
+ void circleToolToggle(bool state);
+ //! Switch to ellipse tool
+ void ellipseToolToggle(bool state);
+ //! Switch to move tool
+ void moveToolToggle(bool state);
+ //! Switch to arc tool
+ void arcToolToggle(bool state);
+ //! Switch off all tools
+ void noToolEnable();
+ //! Reload file
+ void reloadFile();
+ //! Zoom in
+ void zoomIn();
+ //! Zoom out
+ void zoomOut();
+ //! Zoom automatically
+ void zoomAuto();
+ //! Zoom worker function (called by zoomIn() and zoomOut())
+ void zoom(double dpi);
+ //! Open current file in text editor
+ void openInTextEditor();
+ //! Get the current file's data (name, .eps, modification time, ...)
+ inline GLEFileInfo* getCurrentFile() { return ¤tFile[currentMode]; }
+ //! Get non-current mode GLEFileInfo object
+ GLEFileInfo* getNonCurrentModeFileInfo();
+ //! Set temp files correctly for GLE file
+ void initTempFilesGLE();
+ //! Update currentFile on change PreviewMode <-> EditMode
+ int updateFileInfoOnChangeMode(int mode);
+public slots:
+ //! Update the coordinate display
+ void updateMousePosition(QPointF gle = QPointF(-1.0,-1.0));
+ //! Process newly rendered image (from QGLE)
+ void renderComplete(QImage image);
+ //! Set the base point for relative coordinates
+ void setRelativeBasePoint(QPointF gle);
+ //! Display a status bar message
+ void statusBarMessage(QString msg);
+ //! Start or stop the file monitor
+ void updateFileMonitor(bool state);
+ //! Check whether the file has changed
+ void checkForFileUpdates();
+ //! Enable or disable the save menu option
+ void setSaveEnable(bool state);
+ //! Update the status bar display of resolution
+ void updateDPIDisplay(double newDPI);
+ //! Polar snap toggle
+ void polarSnapToggle(bool state);
+ //! Polar track toggle
+ void polarTrackToggle(bool state);
+ //! Emulate GLE version changed
+ void emulateGLEVersionChanged(int);
+ //! Preview page size changed
+ void previewPageSizeChanged(int);
+signals:
+ //! A new tool has been selected
+ void toolSelected(int newTool);
+ //! The image has changed, so update the drawing
+ void imageChanged(QImage newImage);
+ //! There's a new EPS file to be rendered
+ void newEPS(QString file, double dpi, bool autoscale);
+private:
+ //! Create the actions for use in menus and toolbars.
+ void createActions();
+ //! Create the menus.
+ void createMenus();
+ //! Create a simple status bar at the bottom of the screen.
+ void createStatusBar();
+ //! Create the tool bars
+ void createToolBars();
+ //! Create the dock windows
+ void createDockWindows();
+ //! Add the edit mode toolbars
+ void createEditModeToolBars();
+ //! Destroy the edit mode toolbars
+ void destroyEditModeToolBars();
+ //! Show/hide and enable/disable edit mode toolbars
+ void enableEditModeToolBars(bool enable);
+ //! Create a temporary file
+ QString createTempFile(QString ext);
+
+ //! A box to show the about message
+ AboutBox *box;
+
+ //! Remember the last mouse position
+ QPointF lastMousePosition;
+
+ //! Check whether GLE works
+ bool checkGLE();
+
+ //! Render an GLE file from currentFile.gleFile()
+ void renderGLE();
+ //! Render an GLE file
+ void renderGLE(double dpi, const QSize& area);
+ //! Commit changes to drawing to GLE
+ void updateGLE();
+
+ //! Initialise GS
+ void initLibGS();
+ //! Sometimes one has to ask anyway before reload (auto reload not possible)
+ bool askAnywayBeforeReload();
+
+ void setCurrentFile(const QString &fileName);
+ void updateRecentFileActions();
+
+ //! Execute this after rendering a GLE script
+ void executeToDoAfterRenderGLE();
+ //! Execute this after opening a file
+ void executeToDoAfterFileOpen();
+
+ //! Menu/toolbar member variables: file menu
+ QMenu *fileMenu;
+ //! Menu/toolbar member variables: tools menu
+ QMenu *toolsMenu;
+ //! Menu/toolbar member variables: help menu
+ QMenu *helpMenu;
+
+ //! Open related files menu (submenu of fileMenu)
+ QMenu *editFileMenu;
+
+ //! What form should the coordinate display take?
+ int coordView;
+
+ //! Should we restore the mode after rendering
+ bool saveMode;
+
+ //! Reload icons
+ QIcon reloadIconBlack;
+ QIcon reloadIconRed;
+
+ //! Action causing the application to quit
+ QAction *quitAct;
+ //! Action causing the current bitmap to be copied to the clipboard
+ QAction *copyBitmapAct;
+ //! Action causing the figure to be copied to the clipboard as PDF
+ QAction *copyPDFAct;
+ //! Action causing the figure to be copied to the clipboard as EMF
+ QAction *copyEMFAct;
+ //! Linked to the slot: about()
+ QAction *aboutAct;
+ //! Open GLE website
+ QAction* gleSiteAct;
+ //! Open GLE manual
+ QAction* gleManualAct;
+ //! Toggle the grid on and off
+ QAction *gridAct;
+ //! Toggle grid snap on and off
+ QAction *gridSnapAct;
+ //! Toggle the status of the server on and off
+ QAction *serverAct;
+ //! Toggle orthosnap
+ QAction *orthoSnapAct;
+ //! Toggle osnap
+ QAction *osnapAct;
+ //! Toggle polar snap
+ QAction *polarSnapAct;
+ //! Toggle polar track
+ QAction *polarTrackAct;
+ //! Display the settings dialogue box
+ QAction *settingsAct;
+ //! Display expression evaluator
+ QAction *evaluatorAct;
+ //! View 3D part of script
+ QAction *view3DAct;
+ //! Display GhostScript's log window
+ QAction *ghostScriptLogWindowAct;
+ //! Open an existing file
+ QAction *openInNewWindowAct;
+ //! Open an existing file
+ QAction *openAct;
+ //! Browse the script folder
+ QAction *browseAct;
+ //! Save the file under a new name
+ QAction *saveAsAct;
+ //! Save the file
+ QAction *saveAct;
+ //! Create a new file
+ QAction *newAct;
+ //! Export the file
+ QAction *exportAct;
+ //! Print the file
+ QAction *printAct;
+ //! Open file in text editor
+ QAction *editorAct;
+ //! Go to preview mode
+ QAction *previewModeAct;
+ //! Go to edit mode
+ QAction *editModeAct;
+ //! Reload Action
+ QAction *reloadAct;
+ //! Zoom In Action
+ QAction *zoomInAct;
+ //! Zoom Out Action
+ QAction *zoomOutAct;
+ //! Zoom Automatically Action
+ QAction *zoomAutoAct;
+ //! Download action
+ QAction *downloadAct;
+ //! Console window auto-show action
+ QAction *consoleWindowHide;
+ //! The GLE version to emulate
+ QComboBox *emulateVersion;
+ //! The page size to use during preview
+ QComboBox *previewPageSize;
+ //! Used by the recent file list
+ QAction *separatorAct;
+
+ //! Group for edit / preview mode buttongs
+ QActionGroup* editPreviewGroup;
+ //! Group editing tools
+ QActionGroup* toolGroup;
+
+ //! Pointer tool
+ QAction *pointerToolAct;
+ QAction *lineToolAct;
+ QAction *textToolAct;
+ QAction *tanLineToolAct;
+ QAction *perpLineToolAct;
+ QAction *circleToolAct;
+ QAction *ellipseToolAct;
+ QAction *arcToolAct;
+ QAction *moveToolAct;
+
+ //! Coordinate Display
+ QLabel *mousePosition;
+ //! Resolution Display
+ QLabel *dpiDisplay;
+ //! Grid snap button
+ QPushButton *gridSnapButton;
+ //! Open file in text editor
+ QToolButton *editorBut;
+
+ //! Server thread
+ GLEServerThread *serverThread;
+ //! Render thread
+ GLERenderThread *renderThread;
+
+ //! Current file information
+ GLEFileInfo currentFile[2];
+
+ //! Scroll Area containing the drawing widget
+ QScrollArea *scrollArea;
+
+ //! Size of (new) diagram
+ QSizeF newDiagramSize;
+
+
+ //! Is the server running?
+ bool serverRunning;
+ //! Was it running in preview mode?
+ bool serverInPreviewMode;
+
+ //! What mode are we currently in?
+ int currentMode;
+
+ //! What was the last mode
+ int oldMode;
+
+ //! Are we mid-render?
+ bool renderInProgress;
+
+ //! ToDo list options
+ enum
+ {
+ ToDoAfterRenderGLE,
+ ToDoAfterFileOpen
+ };
+
+ //! Enumeration of the various coordinate display options
+ enum
+ {
+ CoordinateOff,
+ CoordinateCart,
+ CoordinatePolar,
+ CoordinateRelCart,
+ CoordinateRelPolar
+ };
+
+ //! Enumeration for a hash of temporary files
+ enum
+ {
+ EditModeOutput,
+ PreviewModeOutput,
+ NewGLE
+ };
+ //! Hash of temporary files
+ QHash<int,QString> tempFiles;
+
+ //! The last point clicked (for relative coordinates)
+ QPointF lastPoint;
+
+ //! File toolbar
+ QToolBar *fileToolBar;
+ //! Control toolbar
+ QToolBar *controlToolBar;
+ //! Mode toolbar
+ QToolBar *modeToolBar;
+ //! Tools toolbar
+ QToolBar *toolsToolBar;
+ //! View toolbar
+ QToolBar *viewToolBar;
+ //! Compatibility toolbar
+ QToolBar *compatToolBar;
+
+ //! Property editor
+ GLEPropertyEditor *propertyEditor;
+ QDockWidget *propertyDock;
+
+ //! Object blocks list
+ GLEObjectBlocksList *objectBlocksList;
+ QDockWidget *objectBlocksDock;
+
+ QSplitter *splitWindow;
+ ConsoleWindow* consoleWindow;
+ EvaluatorDialog* evaluatorDialog;
+
+ QString GsLibVersionNumber;
+
+ //! Timer for checking for file changes
+ QTimer *fileMonitorTimer;
+ int fileMonitorCount;
+
+ // Pointer to our GLE interface
+ GLEInterface *gleInterface;
+
+ QList<int> todoList;
+
+ GLERC<GLEScript> gleScript;
+
+ enum { MaxRecentFiles = 5 };
+ QAction *recentFileActs[MaxRecentFiles];
+
+ bool enabledState;
+public:
+ //! The drawing area
+ GLEDrawingArea *drawingArea;
+
+ //! Settings for application
+ GLESettings *settings;
+
+ //! Remove all drawn objects
+ void resetDrawing();
+ //! Return the size of the drawing area
+ QSize getScrollAreaSize();
+ //! Return the name of the current file
+ QString getCurrentGleFile();
+
+ GLEInterface* getGLEInterface();
+
+ GLEScript* getGLEScript();
+
+ //! Open given file in text editor
+ void openInTextEditor(const QString& file);
+
+ //! Open a local file using the mime type application registered for it
+ void showLocalFile(const QString& name);
+
+ bool tryGhostScriptLocation(const QString location, QString& error);
+
+ void updateWindowTitle();
+
+ void updateEnableActions(bool enable);
+
+ void executeToDos();
+ void addFilesToMonitor();
+
+ //! Show console window if there is output
+ void shouldAutoShowConsole();
+ void clearConsoleWindow();
+ void restoreConsoleOutput();
+};
+
+#endif
diff --git a/src/gui/newfile.cpp b/src/gui/newfile.cpp
new file mode 100644
index 0000000..117fbdf
--- /dev/null
+++ b/src/gui/newfile.cpp
@@ -0,0 +1,84 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+/********************************************************************
+ * newfile.cpp: The class implementation for the new file dialogue. *
+ ********************************************************************/
+
+#include <QtGui>
+#include "newfile.h"
+#include "qgle_definitions.h"
+
+NewFileBox::NewFileBox(QWidget *parent)
+ : QDialog(parent)
+{
+ // Set the window title and size
+ setWindowTitle(tr("New Diagram"));
+ resize(150,150);
+ save = false;
+
+ // A Spin box to set the width of the new drawing
+ width = new QDoubleSpinBox;
+ width->setRange(0.0,21.0);
+ width->setValue(DEFAULT_NEW_SIZE);
+ // A spin box to set the height of the new drawing
+ height = new QDoubleSpinBox;
+ height->setRange(0.0,29.7);
+ height->setValue(DEFAULT_NEW_SIZE);
+
+ // Create a layout and some push buttons
+ cancelCmd = new QPushButton(tr("Cancel"));
+ saveCmd = new QPushButton(tr("Save As"));
+ okCmd = new QPushButton(tr("OK"));
+ okCmd->setDefault(true);
+ connect(cancelCmd, SIGNAL(clicked()), this, SLOT(reject()));
+ connect(saveCmd, SIGNAL(clicked()), this, SLOT(saveClicked()));
+ connect(okCmd, SIGNAL(clicked()), this, SLOT(accept()));
+
+ // Layout the dialogue
+ QVBoxLayout* main = new QVBoxLayout();
+ layout = new QGridLayout();
+ layout->addWidget(new QLabel("Width (cm):"),0,0,1,1);
+ layout->addWidget(width,0,1,1,2);
+ layout->addWidget(new QLabel("Height (cm):"),1,0,1,1);
+ layout->addWidget(height,1,1,1,2);
+ main->addLayout(layout);
+ QHBoxLayout* butt = new QHBoxLayout();
+ butt->addStretch(1);
+ butt->addWidget(cancelCmd);
+ butt->addWidget(saveCmd);
+ butt->addWidget(okCmd);
+ main->addLayout(butt);
+ setLayout(main);
+
+}
+
+// Return the selected sizes
+QSizeF NewFileBox::size()
+{
+ return(QSizeF(width->value(), height->value()));
+}
+
+void NewFileBox::saveClicked()
+{
+ save = true;
+ accept();
+}
diff --git a/src/gui/newfile.h b/src/gui/newfile.h
new file mode 100644
index 0000000..242045d
--- /dev/null
+++ b/src/gui/newfile.h
@@ -0,0 +1,63 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+/***************************************************************
+ * newfile.h: The class definition for the new file dialogue. *
+ ***************************************************************/
+#ifndef __NEWFILE_H
+#define __NEWFILE_H
+
+#include <QtGui>
+
+//! Class used to display a dialogue box asking the user for the size of the drawing
+class NewFileBox : public QDialog
+{
+ Q_OBJECT
+
+public:
+ //! Class constructor
+ NewFileBox(QWidget *parent = 0);
+ //! Size of the drawing
+ QSizeF size();
+ //! Should save the new imdage?
+ inline bool shouldSave() { return save; }
+
+public slots:
+ void saveClicked();
+
+private:
+ //! The layout of the dialogue box
+ QGridLayout *layout;
+ //! Spinbox for the width
+ QDoubleSpinBox *width;
+ //! Spinbox for the height
+ QDoubleSpinBox *height;
+ //! Create the drawing
+ QPushButton *okCmd;
+ //! Create the drawing and save it
+ QPushButton *saveCmd;
+ //! Give up.
+ QPushButton *cancelCmd;
+ //! Should save the new image?
+ bool save;
+};
+
+#endif
diff --git a/src/gui/objectblocks.cpp b/src/gui/objectblocks.cpp
new file mode 100644
index 0000000..c6c33bd
--- /dev/null
+++ b/src/gui/objectblocks.cpp
@@ -0,0 +1,551 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+#include "mainwindow.h"
+#include "objectblocks.h"
+
+GLEObjectBlocksList::GLEObjectBlocksList(QWidget *parent, GLEMainWindow* main, GLEDrawingArea* area, int size) : QTreeView(parent) {
+ defaultSize = size;
+ mainWin = main;
+ drawingArea = area;
+ model = new QStandardItemModel();
+ setModel(model);
+ header()->hide(); // = setHeaderHidden(true) in Qt 4.4
+ connect(this, SIGNAL(clicked(const QModelIndex&)), this, SLOT(selectEntry(const QModelIndex&)));
+ //setSizeIncrement(1, 1);
+ //setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
+}
+
+void GLEObjectBlocksList::updateList() {
+ model->clear();
+ consList.clear();
+ QStandardItem *parentItem = model->invisibleRootItem();
+ GLEScript* script = mainWin->getGLEScript();
+ script->updateObjectDOConstructors();
+ GLEGlobalSource* source = script->getSource();
+ updateFile(parentItem, source->getMainFile());
+ for (int i = 0; i < source->getNbFiles(); i++) {
+ updateFile(parentItem, source->getFile(i));
+ }
+}
+
+void GLEObjectBlocksList::updateFile(QStandardItem *parent, GLESourceFile* file) {
+ QStandardItem* item = new QStandardItem(QString::fromUtf8(file->getLocation()->getName().c_str()));
+ parent->appendRow(item);
+ for (int i = 0; i < file->getNbObjectDOConstructors(); i++) {
+ GLEObjectDOConstructor* cons = file->getObjectDOConstructor(i);
+ QStandardItem* child = new QStandardItem(QString::fromUtf8(cons->getName().c_str()).toLower());
+ child->setData(qVariantFromValue((void*)cons));
+ item->appendRow(child);
+ consList.add(cons);
+ }
+}
+
+void GLEObjectBlocksList::selectEntry(const QModelIndex& mi) {
+ QStandardItem* item = model->itemFromIndex(mi);
+ GLEObjectDOConstructor* cons = (GLEObjectDOConstructor*)qVariantValue<void*>(item->data());
+ if (cons == NULL) return;
+ mainWin->clearConsoleWindow();
+ GLEObjectBlock* block = drawingArea->createNewObjectBlock(cons);
+ if (block == NULL) return;
+ block->renderPostscriptNoUpdate();
+ mainWin->shouldAutoShowConsole();
+ // Center object on screen
+ QSize scrollSize = mainWin->getScrollAreaSize();
+ QSize drawSize = drawingArea->size();
+ QPoint drawPos = drawingArea->pos();
+ scrollSize.setWidth(min(scrollSize.width(), drawSize.width()));
+ scrollSize.setHeight(min(scrollSize.height(), drawSize.height()));
+ QPoint pos = QPoint(scrollSize.width()/2-drawPos.x(), scrollSize.height()/2-drawPos.y());
+ block->setPoint(GLEObjectBlock::ReferencePoint, pos, false);
+ GLEObjectDO* obj = (GLEObjectDO*)block->getGLEObject();
+ GLEPropertyStore* props = obj->getProperties();
+ if (props->getModel()->isSupportScale()) {
+ GLEArrayImpl* arr = props->getArray();
+ block->setLength(GLEObjectBlock::ObjectWidth, arr->getDouble(0), false);
+ block->setLength(GLEObjectBlock::ObjectHeight, arr->getDouble(1), false);
+ }
+ block->updateFromPropertyNoDirty(GLEObjectBlock::RefPointName);
+ // Select object
+ mainWin->selectPointerTool();
+ drawingArea->selectObject(block);
+ drawingArea->update();
+}
+
+// The constructor for the line object
+GLEObjectBlock::GLEObjectBlock(double resolution, QSize imageSize, GLEDrawingArea* area)
+ : GLEDrawingObject(resolution, imageSize, area)
+{
+ lastdpi = -1;
+ amove = false;
+ connect(this, SIGNAL(pointChanged()), this, SLOT(updateObject()));
+ connect(this, SIGNAL(imageChanged()), this, SLOT(resChanged()));
+ connect(this, SIGNAL(propertyChanged(int)), this, SLOT(updateFromProperty(int)));
+ validProperties
+ << FillColour
+ << LineColour
+ << LineWidth
+ << RefPointName
+ << FontName
+ << FontStyle
+ << FontSize;
+ properties[FillColour] = propertyDescriptions[FillColour].defaultValue;
+ properties[LineColour] = propertyDescriptions[LineColour].defaultValue;
+ properties[LineWidth] = propertyDescriptions[LineWidth].defaultValue;
+ properties[RefPointName] = propertyDescriptions[RefPointName].defaultValue;
+ properties[FontName] = propertyDescriptions[FontName].defaultValue;
+ properties[FontStyle] = propertyDescriptions[FontStyle].defaultValue;
+ properties[FontSize] = propertyDescriptions[FontSize].defaultValue;
+ scaleOffs = QPointF(1.0, 1.0);
+}
+
+void GLEObjectBlock::resChanged()
+{
+ if (dpi != lastdpi)
+ {
+ renderPostscript();
+ lastdpi = dpi;
+ }
+ else
+ {
+ updateObject();
+ }
+}
+
+void GLEObjectBlock::renderPostscript()
+{
+ renderPostscriptNoUpdate();
+ scaleOffs = QPointF(1.0, 1.0);
+ updateObject();
+}
+
+void GLEObjectBlock::renderPostscriptNoUpdate()
+{
+ QImage img;
+ GLERectangle rect;
+ GLEObjectDO* obj = (GLEObjectDO*)getGLEObject();
+ obj->getPSBoundingBox(&rect);
+ drawingArea->renderPostscript(obj->getPostScriptCode(), rect, dpi, &img);
+ image = QPixmap::fromImage(img);
+ origImage = image;
+}
+
+void GLEObjectBlock::createOTracks()
+{
+}
+
+void GLEObjectBlock::computeInitialPosition()
+{
+ GLEObjectDO* obj = (GLEObjectDO*)getGLEObject();
+ obj->computeReferencePoint(&referenceOffset);
+ GLEPoint& pos = obj->getPosition();
+ QPointF refPt(pos.getX()-referenceOffset.getX(), pos.getY()-referenceOffset.getY());
+ pointHash[ReferencePoint] = refPt;
+}
+
+void GLEObjectBlock::updateFromPropertyNoDirty(int property)
+{
+ GLEObjectDO* obj = (GLEObjectDO*)getGLEObject();
+ GLEPropertyStore* obj_prop = obj->getProperties();
+
+ if (property == RefPointName)
+ {
+ GLERC<GLEString> refPtStrGLE(new GLEString());
+ QString refPtStr = getProperty(RefPointName).toString();
+ QGLE::qtToGLEString(refPtStr, refPtStrGLE.get());
+ obj->setRefPointString(refPtStrGLE.get());
+ obj->computeReferencePoint(&referenceOffset);
+ }
+
+ if (property == LineWidth || property == LineColour || property == FillColour || property == FontName ||
+ property == FontStyle || property == FontSize || property >= PropertyUser)
+ {
+ obj_prop->setRealProperty(GLEDOPropertyLineWidth, getProperty(LineWidth).toDouble());
+ QColor color = getProperty(LineColour).value<QColor>();
+ GLEColor* gle_color = obj->getProperties()->getColorProperty(GLEDOPropertyColor);
+ gle_color->setRGB255(color.red(), color.green(), color.blue());
+ GLEColor* gle_fill = obj->getProperties()->getColorProperty(GLEDOPropertyFillColor);
+ if (properties[FillColour].value<QColor>().isValid()) {
+ QColor fill = getProperty(FillColour).value<QColor>();
+ gle_fill->setRGB255(fill.red(), fill.green(), fill.blue());
+ } else {
+ gle_fill->setTransparent(true);
+ }
+ // Font is
+ // fontList[properties[FontName].value<QString>]
+ // (default "rm")
+ GLEInterface* iface = obj->getConstructor()->getScript()->getGLEInterface();
+ GLEFont* font = iface->getFont(getProperty(FontName).toInt());
+ font = font->getStyle((GLEFontStyle)getProperty(FontStyle).toInt());
+ obj_prop->setFontProperty(GLEDOPropertyFont, font);
+ obj_prop->setRealProperty(GLEDOPropertyFontSize, getProperty(FontSize).toDouble());
+ // Copy properties to lengths
+ if (obj_prop->getModel()->isSupportScale()) {
+ GLEArrayImpl* arr = obj_prop->getArray();
+ setLength(GLEObjectBlock::ObjectWidth, arr->getDouble(0), false);
+ setLength(GLEObjectBlock::ObjectHeight, arr->getDouble(1), false);
+ }
+ // Render the object
+ obj->render();
+ renderPostscript();
+ // updateObject() is called after rendering is complete.
+ }
+ else
+ {
+ updateObject();
+ }
+}
+
+void GLEObjectBlock::updateFromProperty(int property)
+{
+ updateFromPropertyNoDirty(property);
+ ((GLEDrawingArea*)parent())->setDirtyAndSave();
+}
+
+// Update the painter path
+void GLEObjectBlock::updateObject()
+{
+ updateObjectScale(1.0, 1.0);
+}
+
+/**
+ * referenceOffset: offset of reference point (justify setting) in cm measured from bottom-left corner
+ * referencePoint: reference point on screen
+ * scriptPosition: referencePoint + referenceOffset
+ * drawpoint: where to draw pixmap on screen
+ *
+ * screen:
+ *
+ * (0,0).............(maxx,0)
+ * . .
+ * . .
+ * (0,maxy)..........(maxx,maxy)
+ */
+
+// Update the painter path
+void GLEObjectBlock::updateObjectScale(double sx, double sy)
+{
+ delete(paintPath);
+ paintPath = new QPainterPath();
+ QPointF gleRefPt = getGLEPoint(ReferencePoint);
+ GLEObjectDO* obj = (GLEObjectDO*)getGLEObject();
+ obj->getPosition().setXY(gleRefPt.x()+referenceOffset.getX(), gleRefPt.y()+referenceOffset.getY());
+ QPointF qtRefPt = QGLE::absGLEToQt(gleRefPt, dpi, pixmap.height());
+ QPointF offset(-GS_OFFSET*dpi*sx, GS_OFFSET*dpi*sy-origImage.height()*sy);
+ drawPoint = qtRefPt + offset;
+ QSizeF qtSize;
+ GLERectangle rect;
+ getGLEObject()->getPSBoundingBox(&rect);
+ qtSize.setWidth(QGLE::relGLEToQt(rect.getWidth()*sx, dpi));
+ qtSize.setHeight(QGLE::relGLEToQt(rect.getHeight()*sy, dpi));
+ // The space from the top of the image is the following:
+ double yoffs = origImage.height()*sy-rect.getHeight()*sy*dpi/CM_PER_INCH-GS_OFFSET*dpi*sy;
+ paintPath->addRect(QRectF(drawPoint.x()+GS_OFFSET*dpi*sx,
+ drawPoint.y()+yoffs,
+ qtSize.width(),
+ qtSize.height()));
+ osnapHandles.clear();
+}
+
+void GLEObjectBlock::addRelativeOSnaps(QPointF p)
+{
+ UNUSED_ARG(p);
+}
+
+void GLEObjectBlock::draw(QPainter *p)
+{
+ // This needs to be changed to plot an image object
+ p->drawPixmap(drawPoint, image);
+ // QGLE::drawCross(p, getQtPoint(ReferencePoint), AMOVE_LENGTH, pen());
+}
+
+QList<QPointF> GLEObjectBlock::getTangents(QPointF p)
+{
+ QList<QPointF> empty;
+ UNUSED_ARG(p);
+ return(empty);
+}
+
+bool GLEObjectBlock::hasTangents()
+{
+ return(false);
+}
+
+QList<QPointF> GLEObjectBlock::getPerpendiculars(QPointF p)
+{
+ QList<QPointF> empty;
+ UNUSED_ARG(p);
+ return(empty);
+}
+
+bool GLEObjectBlock::hasPerpendiculars()
+{
+ return(false);
+}
+
+double GLEObjectBlock::nearestOSnap(const QPointF& p, QPointF *osnap)
+{
+ return distanceToPoint(p, osnap);
+}
+
+double GLEObjectBlock::distanceToPoint(const QPointF& p, QPointF *nearestPoint)
+{
+ GLERectangle box;
+ double minDist = 1e300;
+ if (nearestPoint != NULL) *nearestPoint = p;
+ GLEObjectDO* obj = (GLEObjectDO*)getGLEObject();
+ GLEObjectRepresention* objrep = obj->getObjectRepresentation();
+ box.copy(objrep->getRectangle());
+ GLEPoint orig(box.getXMin(), box.getYMin());
+ box.translate(1.0-orig.getX(), 1.0-orig.getY());
+ box.scale(dpi/PS_POINTS_PER_INCH);
+ box.subtractYFrom(image.height());
+ box.translate(drawPoint.x(), drawPoint.y());
+ box.normalize();
+ box.grow(MAX_SELECT_DISTANCE);
+ if (box.contains(p.x(), p.y())) {
+ distanceToPointRec(objrep, orig, p, &minDist, nearestPoint);
+ return 0.0;
+ }
+ return minDist;
+}
+
+void GLEObjectBlock::distanceToPointRec(GLEObjectRepresention* obj, const GLEPoint& orig, const QPointF& p, double* minDist, QPointF *nearestPoint)
+{
+ GLERectangle box;
+ box.copy(obj->getRectangle());
+ box.translate(1.0-orig.getX(), 1.0-orig.getY());
+ box.scale(dpi/PS_POINTS_PER_INCH);
+ box.subtractYFrom(image.height());
+ box.translate(drawPoint.x(), drawPoint.y());
+ distanceToPointUpdate(box.getXMin(), box.getYMin(), p, minDist, nearestPoint);
+ distanceToPointUpdate(box.getXMin(), box.getYMid(), p, minDist, nearestPoint);
+ distanceToPointUpdate(box.getXMin(), box.getYMax(), p, minDist, nearestPoint);
+ distanceToPointUpdate(box.getXMid(), box.getYMin(), p, minDist, nearestPoint);
+ distanceToPointUpdate(box.getXMid(), box.getYMid(), p, minDist, nearestPoint);
+ distanceToPointUpdate(box.getXMid(), box.getYMax(), p, minDist, nearestPoint);
+ distanceToPointUpdate(box.getXMax(), box.getYMin(), p, minDist, nearestPoint);
+ distanceToPointUpdate(box.getXMax(), box.getYMid(), p, minDist, nearestPoint);
+ distanceToPointUpdate(box.getXMax(), box.getYMax(), p, minDist, nearestPoint);
+ GLEStringHash* children = obj->getChilds();
+ if (children != NULL) {
+ GLEStringHashData* hash = children->getHash();
+ for (GLEStringHashData::const_iterator i = hash->begin(); i != hash->end(); i++) {
+ GLEObjectRepresention* child = (GLEObjectRepresention*)children->getObject(i->second);
+ distanceToPointRec(child, orig, p, minDist, nearestPoint);
+ }
+ }
+}
+
+//! Set the reference point (tl,bl,tc,bc,tr,br,...)
+bool GLEObjectBlock::setReferencePoint(const QPointF& pt)
+{
+ GLERectangle box;
+ double minDist = 1e300;
+ GLEObjectDO* obj = (GLEObjectDO*)getGLEObject();
+ GLEObjectRepresention* objrep = obj->getObjectRepresentation();
+ box.copy(objrep->getRectangle());
+ GLEPoint orig(box.getXMin(), box.getYMin());
+ box.translate(1.0-orig.getX(), 1.0-orig.getY());
+ box.scale(dpi/PS_POINTS_PER_INCH);
+ box.subtractYFrom(image.height());
+ box.translate(drawPoint.x(), drawPoint.y());
+ box.normalize();
+ box.grow(MAX_SELECT_DISTANCE);
+ if (box.contains(pt.x(), pt.y())) {
+ QString ref;
+ return setReferencePointRec(ref, objrep, orig, pt, &minDist);
+ }
+ return true;
+}
+
+bool GLEObjectBlock::setReferencePointUpdate(double x, double y, const char* suff, const QString& ref, const QPointF& p, double* minDist)
+{
+ double crDist = QGLE::distance(x, y, p);
+ if (crDist < MAX_SELECT_DISTANCE && crDist < *minDist) {
+ *minDist = crDist;
+ QString prop = ref;
+ if (suff != NULL)
+ {
+ if (prop != "") prop += ".";
+ prop += QString::fromUtf8(suff);
+ }
+ setProperty(RefPointName, prop);
+ return true;
+ }
+ return false;
+}
+
+bool GLEObjectBlock::setReferencePointRec(const QString& ref, GLEObjectRepresention* obj, const GLEPoint& orig, const QPointF& p, double* minDist)
+{
+ GLERectangle box;
+ box.copy(obj->getRectangle());
+ box.translate(1.0-orig.getX(), 1.0-orig.getY());
+ box.scale(dpi/PS_POINTS_PER_INCH);
+ box.subtractYFrom(image.height());
+ box.translate(drawPoint.x(), drawPoint.y());
+ bool mod = false;
+ if (box.isPoint())
+ {
+ mod |= setReferencePointUpdate(box.getXMin(), box.getYMin(), NULL, ref, p, minDist);
+ }
+ else
+ {
+ mod |= setReferencePointUpdate(box.getXMin(), box.getYMin(), "bl", ref, p, minDist);
+ mod |= setReferencePointUpdate(box.getXMin(), box.getYMid(), "lc", ref, p, minDist);
+ mod |= setReferencePointUpdate(box.getXMin(), box.getYMax(), "tl", ref, p, minDist);
+ mod |= setReferencePointUpdate(box.getXMid(), box.getYMin(), "bc", ref, p, minDist);
+ mod |= setReferencePointUpdate(box.getXMid(), box.getYMid(), "cc", ref, p, minDist);
+ mod |= setReferencePointUpdate(box.getXMid(), box.getYMax(), "tc", ref, p, minDist);
+ mod |= setReferencePointUpdate(box.getXMax(), box.getYMin(), "br", ref, p, minDist);
+ mod |= setReferencePointUpdate(box.getXMax(), box.getYMid(), "rc", ref, p, minDist);
+ mod |= setReferencePointUpdate(box.getXMax(), box.getYMax(), "tr", ref, p, minDist);
+ }
+ GLEStringHash* children = obj->getChilds();
+ if (children != NULL) {
+ GLEStringHashData* hash = children->getHash();
+ for (GLEStringHashData::const_iterator i = hash->begin(); i != hash->end(); i++) {
+ QString newRef = ref;
+ if (ref != "") newRef += ".";
+ newRef += QGLE::gleToQString(i->first.get());
+ GLEObjectRepresention* child = (GLEObjectRepresention*)children->getObject(i->second);
+ mod |= setReferencePointRec(newRef, child, orig, p, minDist);
+ }
+ }
+ return mod;
+}
+
+// Set a point (start or end in the case of a line)
+void GLEObjectBlock::setPoint(int pointChoice, const QPointF& p, bool update)
+{
+ switch(pointChoice)
+ {
+ case ReferencePoint:
+ pointHash[pointChoice] = QGLE::absQtToGLE(p, dpi, pixmap.height());
+ break;
+
+ case ObjectWidth:
+ case ObjectHeight:
+ pointHash[pointChoice] = p;
+ break;
+ }
+ if (update) updateObject();
+}
+
+QList<QPointF> GLEObjectBlock::intersections(double qtm, double qtc, bool vertical)
+{
+ UNUSED_ARG(qtm);
+ UNUSED_ARG(qtc);
+ UNUSED_ARG(vertical);
+ return QList<QPointF>();
+}
+
+QList<QPointF> GLEObjectBlock::intersections(QPointF qtp1, QPointF qtp2)
+{
+ UNUSED_ARG(qtp1);
+ UNUSED_ARG(qtp2);
+ return QList<QPointF>();
+}
+
+QList<QPointF> GLEObjectBlock::intersections(QPointF qtp1, double angle)
+{
+ UNUSED_ARG(qtp1);
+ UNUSED_ARG(angle);
+ return QList<QPointF>();
+}
+
+bool GLEObjectBlock::isInside(QPointF p)
+{
+ return(paintPath->contains(p));
+}
+
+int GLEObjectBlock::supportedTransformMode()
+{
+ if (getGLEObject() != NULL && getGLEObject()->getProperties()->getModel()->isSupportScale())
+ {
+ return TransformModeFree;
+ }
+ return TransformModeNone;
+}
+
+void GLEObjectBlock::linearTransform(const GLELinearEquation& ex, const GLELinearEquation& ey)
+{
+ pointHash.clear();
+ double wd = getGLELength(ObjectWidth, true)*ex.getA();
+ double hi = getGLELength(ObjectHeight, true)*ey.getA();
+ if (wd < 0 || hi < 0)
+ {
+ /* Something's wrong */
+ return;
+ }
+ double sx = ex.getA()/scaleOffs.x();
+ double sy = ey.getA()/scaleOffs.y();
+ GLEObjectDO* obj = (GLEObjectDO*)getGLEObject();
+ if (wd != getGLELength(ObjectWidth, false) || hi != getGLELength(ObjectHeight, false))
+ {
+ setLength(ObjectWidth, wd, false);
+ setLength(ObjectHeight, hi, false);
+ obj->getProperties()->getModel()->scale(obj, wd, hi);
+ int int_wd = (int)floor(origImage.width()*sx+0.5);
+ int int_hi = (int)floor(origImage.height()*sy+0.5);
+ if (sx < 0.5 || sx > 2.0 || sy < 0.5 || sy > 2.0) {
+ /* deviation too big -> rerender */
+ obj->render();
+ renderPostscriptNoUpdate();
+ scaleOffs = QPointF(ex.getA(), ey.getA());
+ sx = sy = 1.0;
+ } else {
+ image = origImage.scaled(int_wd, int_hi, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
+ }
+ }
+ linearTransformPt(ReferencePoint, ex, ey, false);
+ updateObjectScale(sx, sy);
+}
+
+void GLEObjectBlock::linearTransformDone()
+{
+ GLEObjectDO* obj = (GLEObjectDO*)getGLEObject();
+ obj->render();
+ obj->computeReferencePoint(&referenceOffset);
+ renderPostscript();
+}
+
+void GLEObjectBlock::moveBy(QPointF offset)
+{
+ pointHash.clear();
+ GLEObjectDO* obj = (GLEObjectDO*)getGLEObject();
+ if (obj->getProperties()->getModel()->isSupportScale())
+ {
+ setLength(ObjectWidth, getGLELength(ObjectWidth, true), false);
+ setLength(ObjectHeight, getGLELength(ObjectHeight, true), false);
+ }
+ QPointF start = getQtPoint(ReferencePoint, true);
+ setPoint(ReferencePoint, start + offset);
+}
+
+void GLEObjectBlock::rotateBy(double radians)
+{
+ // TODO: Also rotate the text.
+ pointHash.clear();
+ // Moves relative to storedPointHash
+ QPointF start = getQtPoint(ReferencePoint, true);
+ setPoint(ReferencePoint, QGLE::rotateAboutPoint(start, radians, basePoint));
+}
diff --git a/src/gui/objectblocks.h b/src/gui/objectblocks.h
new file mode 100644
index 0000000..4fb3a9c
--- /dev/null
+++ b/src/gui/objectblocks.h
@@ -0,0 +1,126 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+#ifndef __OBJECTBLOCKS_H
+#define __OBJECTBLOCKS_H
+
+#include "drawingobject.h"
+
+class GLEMainWindow;
+
+class GLEObjectBlocksList : public QTreeView
+{
+ Q_OBJECT
+
+public:
+ //! Constructor
+ GLEObjectBlocksList(QWidget *parent, GLEMainWindow* main, GLEDrawingArea* area, int size);
+ void updateList();
+ void updateFile(QStandardItem *parent, GLESourceFile* file);
+ // virtual QSize sizeHint() const;
+ // virtual int heightForWidth(int w) const;
+public slots:
+ void selectEntry(const QModelIndex&);
+protected:
+ int defaultSize;
+ GLEMainWindow* mainWin;
+ GLEDrawingArea* drawingArea;
+ QStandardItemModel* model;
+ GLERCVector<GLEObjectDOConstructor> consList;
+};
+
+//! Class describing a text drawing object
+class GLEObjectBlock : public GLEDrawingObject
+{
+ Q_OBJECT
+
+public:
+
+ //! Enumeration of the points needed to draw a text object
+ enum Points
+ {
+ ReferencePoint,
+ ObjectWidth,
+ ObjectHeight
+ };
+
+ //! Constructor used for initialising variables and connections
+ GLEObjectBlock(double resolution, QSize imageSize, GLEDrawingArea* area);
+ //! Create the list with supported properties
+ void createProperties();
+ //! Draw the text on the provided painter
+ void draw(QPainter *p);
+ //! Return the shortest distance between a given point and the text object
+ double nearestOSnap(const QPointF& p, QPointF *osnap);
+ double distanceToPoint(const QPointF& p, QPointF *nearestPoint);
+ void distanceToPointRec(GLEObjectRepresention* obj, const GLEPoint& orig, const QPointF& p, double* minDist, QPointF *nearestPoint);
+ //! Set the reference point (tl,bl,tc,bc,tr,br,...)
+ bool setReferencePoint(const QPointF& pt);
+ bool setReferencePointRec(const QString& ref, GLEObjectRepresention* obj, const GLEPoint& orig, const QPointF& p, double* minDist);
+ bool setReferencePointUpdate(double x, double y, const char* suff, const QString& ref, const QPointF& p, double* minDist);
+ //! Set one of the enumerated points
+ void setPoint(int pointChoice, const QPointF& p, bool update = true);
+ void addRelativeOSnaps(QPointF p);
+ void renderPostscript();
+ void renderPostscriptNoUpdate();
+
+ //! Find points where a line intersects the text string (there are none)
+ // If vertical = true, m contains 'x'
+ QList<QPointF> intersections(double qtm, double qtc, bool vertical = false);
+ QList<QPointF> intersections(QPointF qtp1, double angle);
+ QList<QPointF> intersections(QPointF qtp1, QPointF qtp2);
+ QList<QPointF> getTangents(QPointF p);
+ bool hasTangents();
+ QList<QPointF> getPerpendiculars(QPointF p);
+ bool hasPerpendiculars();
+
+ //! Is the point inside the object (for a text string, always false)
+ bool isInside(QPointF p);
+ int supportedTransformMode();
+ void linearTransform(const GLELinearEquation& ex, const GLELinearEquation& ey);
+ void linearTransformDone();
+ void moveBy(QPointF offset);
+ void rotateBy(double radians);
+ void createOTracks();
+ void computeInitialPosition();
+ void updateFromPropertyNoDirty(int property);
+ //! Update the painter path
+ void updateObjectScale(double sx, double sy);
+
+public slots:
+ void resChanged();
+ //! Update the painter path when the resolution or start/end points change
+ void updateObject();
+
+private slots:
+ void updateFromProperty(int property);
+
+private:
+ QPointF scaleOffs;
+ QPixmap origImage;
+ QPixmap image;
+ QPointF drawPoint;
+ GLEPoint referenceOffset;
+ double lastdpi;
+};
+
+
+#endif
diff --git a/src/gui/polararray.cpp b/src/gui/polararray.cpp
new file mode 100644
index 0000000..22c6b4b
--- /dev/null
+++ b/src/gui/polararray.cpp
@@ -0,0 +1,186 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+#include "polararray.h"
+
+// We need to make sure that we can pass all the parameters on to the
+// children (e.g. base points of displacement etc)
+
+// The constructor for the line object
+GLEPolarArray::GLEPolarArray(double resolution, QSize imageSize, GLEDrawingArea* area) :
+ GLEDrawingObject(resolution, imageSize, area)
+{
+ amove = false;
+}
+
+void GLEPolarArray::createOTracks()
+{
+// if (isSet(StartPoint) && isSet(EndPoint))
+// {
+// // TODO: create some snap lines!
+// // Also need to implement the necessary functionality
+// // in gledrawing.cpp
+// }
+}
+
+void GLEPolarArray::addRelativeOSnaps(QPointF)
+{
+// if (isSet(StartPoint) && isSet(EndPoint))
+// {
+// qDebug() << "Adding osnap relative to " << QGLE::absQtToGLE(p,dpi,pixmap.height());
+// QGLE::flushIO();
+//
+// relativeOSnaps.clear();
+// QPointF np;
+// distanceToPoint(p,&np);
+// qDebug() << "Nearest point: " << QGLE::absQtToGLE(np,dpi,pixmap.height());
+// if ((np == getQtPoint(StartPoint)) || (np == getQtPoint(EndPoint)))
+// return;
+// relativeOSnaps.append(QPair<QPointF,int>(np,QGLE::PerpendicularSnap));
+// }
+// qDebug() << "Added relative OSNAP";
+// QGLE::flushIO();
+}
+
+QList<QPointF> GLEPolarArray::getTangents(QPointF)
+{
+ // This depends on what the base object is
+ QList<QPointF> empty;
+ return(empty);
+}
+
+bool GLEPolarArray::hasTangents()
+{
+ // This depends on what the base object is
+ return(false);
+}
+
+QList<QPointF> GLEPolarArray::getPerpendiculars(QPointF)
+{
+ // This depends on what the base object is
+ QList<QPointF> empty;
+ return(empty);
+// QList<QPointF> perpendiculars;
+// QPointF np;
+// distanceToPoint(p,&np);
+// if ((np == getQtPoint(StartPoint)) || (np == getQtPoint(EndPoint)))
+// return(perpendiculars);
+//
+// perpendiculars.append(np);
+// return(perpendiculars);
+}
+
+bool GLEPolarArray::hasPerpendiculars()
+{
+ // This depends on what the base object is
+ return(false);
+}
+
+
+void GLEPolarArray::draw(QPainter *)
+{
+ // Call the draw function of the base object and
+ // repeat for rotated versions
+}
+
+void GLEPolarArray::updateObjects()
+{
+}
+
+
+double GLEPolarArray::distanceToPoint(const QPointF&, QPointF*)
+{
+ // Call base object functions
+ return(1e6);
+}
+
+void GLEPolarArray::setBaseObject(GLEDrawingObject *obj)
+{
+ baseObject.clear();
+ baseObject.append(obj);
+ // Now connect all the signals and slots
+ // and/or call 'update object' just in case
+}
+
+// Set a point (start or end in the case of a line)
+void GLEPolarArray::setPoint(int pointChoice, const QPointF&, bool)
+{
+ if (baseObject.size() < 1)
+ return;
+
+ switch(pointChoice)
+ {
+ case SpanAngle:
+ case NumberOfObjects:
+// pointHash[pointChoice] = QGLE::absQtToGLE(p, dpi, pixmap.height());
+// Once both have been set, update the objects: regenerate
+// all but the first one based on the parameters
+ break;
+ }
+ updateObjects();
+}
+
+QList<QPointF> GLEPolarArray::intersections(double, double, bool)
+{
+ // Call base object functionality
+ QList<QPointF> pointArray;
+ return(pointArray);
+}
+
+
+
+
+
+QList<QPointF> GLEPolarArray::intersections(QPointF, QPointF)
+{
+ // Call base object functionality
+ QList<QPointF> pointArray;
+ return(pointArray);
+}
+
+QList<QPointF> GLEPolarArray::intersections(QPointF, double)
+{
+ // Call base object functionality
+ QList<QPointF> pointArray;
+ return(pointArray);
+}
+
+bool GLEPolarArray::isInside(QPointF p)
+{
+ // Call base objection functionality
+ UNUSED_ARG(p);
+ return(false);
+}
+
+void GLEPolarArray::scaleBy(double, double)
+{
+ // Call base object functionality
+}
+
+void GLEPolarArray::moveBy(QPointF)
+{
+ // Call base object functionality
+}
+
+void GLEPolarArray::rotateBy(double)
+{
+ // Call base object functionality
+}
diff --git a/src/gui/polararray.h b/src/gui/polararray.h
new file mode 100644
index 0000000..416e833
--- /dev/null
+++ b/src/gui/polararray.h
@@ -0,0 +1,78 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+#ifndef _GLEPOLARARRAY_H
+#define _GLEPOLARARRAY_H
+
+#include "drawingobject.h"
+
+//! Class describing a line drawing object
+class GLEPolarArray : public GLEDrawingObject
+{
+ Q_OBJECT
+
+public:
+
+ enum Points
+ {
+ SpanAngle,
+ NumberOfObjects
+ };
+ //! Constructor used for initialising variables and connections
+ GLEPolarArray(double resolution, QSize imageSize, GLEDrawingArea* area);
+
+ //! Draw the line on the provided painter
+ void draw(QPainter *p);
+ //! Return the shortest distance between a given point and the line
+ double distanceToPoint(const QPointF& p, QPointF *nearestPoint);
+
+ //! Set one of the enumerated points
+ void setPoint(int pointChoice, const QPointF& p, bool update = true);
+ void addRelativeOSnaps(QPointF p);
+
+ void setBaseObject(GLEDrawingObject *obj);
+
+ void createOTracks();
+
+ //! Find points where a line intersects the line
+ // If vertical = true, m contains 'x'
+ QList<QPointF> intersections(double qtm, double qtc, bool vertical = false);
+ QList<QPointF> intersections(QPointF qtp1, double angle);
+ QList<QPointF> intersections(QPointF qtp1, QPointF qtp2);
+ QList<QPointF> getTangents(QPointF p);
+ bool hasTangents();
+ QList<QPointF> getPerpendiculars(QPointF p);
+ bool hasPerpendiculars();
+
+ //! Is the point inside the object (for a line, always false)
+ bool isInside(QPointF p);
+
+ void scaleBy(double xratio, double yratio);
+ void moveBy(QPointF offset);
+ void rotateBy(double radians);
+
+ void updateObjects();
+
+private:
+ QList<GLEDrawingObject *> baseObject;
+};
+
+#endif
diff --git a/src/gui/propertyeditor.cpp b/src/gui/propertyeditor.cpp
new file mode 100644
index 0000000..2e09441
--- /dev/null
+++ b/src/gui/propertyeditor.cpp
@@ -0,0 +1,179 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+#include "propertyeditor.h"
+#include "variantdelegate.h"
+#include <QtDebug>
+#include "qgle_statics.h"
+#include "drawingobject.h"
+#include "circle.h"
+
+
+GLEPropertyEditor::GLEPropertyEditor(QWidget *parent, int size)
+ : QTableView(parent)
+{
+ defaultSize = size;
+ hasModel = false;
+ // setSizeIncrement(1, 1);
+ // setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
+}
+
+void GLEPropertyEditor::propertyChanged(const QModelIndex &index, const QModelIndex&)
+{
+ if (hasModel)
+ {
+ GLEDrawingObjectProperty prop;
+ prop = model->getFullProperty(index);
+ GLEDrawingObject *obj;
+ foreach(obj, objects)
+ {
+ obj->setProperty(prop.index, prop.value);
+ }
+
+ emit propertiesHaveChanged();
+
+ }
+}
+
+void GLEPropertyEditor::objectsSelected(QList<GLEDrawingObject *> objs)
+{
+ objects = objs;
+
+ bool first = true;
+ GLEDrawingObject *obj;
+
+ QSet<int> propertySet;
+ foreach(obj, objs)
+ {
+ if (first)
+ {
+ propertySet = obj->getValidProperties();
+ }
+ else
+ {
+ first = false;
+ // Better to use union?
+ propertySet.intersect(obj->getValidProperties());
+ }
+ }
+
+ // propertySet now contains a list of properties that are
+ // common to each object
+ QList<GLEDrawingObjectProperty> properties;
+
+ PropertyDescriptor thisProperty;
+ GLEDrawingObjectProperty prop;
+
+ if (objs.size() == 1 && objects[0]->getGLEObject() != NULL)
+ {
+ // No union supported on extra arguments yet - how to best implement this?
+ GLEDrawObject* gleobj = objects[0]->getGLEObject();
+ GLEPropertyStore *store = gleobj->getProperties();
+ GLEPropertyStoreModel* model = store->getModel();
+ for (int i = 0; i < model->getNumberOfExtraProperties(); i++)
+ {
+ prop.index = GLEDrawingObject::PropertyUser+i;
+ GLEProperty* gleprop = model->getProperty(i);
+ prop.description = QGLE::stlToQString(gleprop->getName());
+ if (prop.description.size() > 1)
+ {
+ // Adjust case
+ prop.description = prop.description.left(1).toUpper() + prop.description.mid(1).toLower();
+ prop.description.replace('_', ' ');
+ }
+ if (gleprop->getType() == GLEPropertyTypeString)
+ {
+ GLEString* strvalue = store->getStringProperty(gleprop);
+ prop.value = QGLE::gleToQString(strvalue);
+ }
+ else if (gleprop->getType() == GLEPropertyTypeReal)
+ {
+ prop.value = store->getRealProperty(gleprop);
+ }
+ prop.validValues = QList<QVariant>();
+ properties.append(prop);
+ }
+ }
+
+ int index;
+ foreach(index, propertySet)
+ {
+ thisProperty = objects[0]->getPropertyDescription(index);
+ prop.index = index;
+ prop.description = thisProperty.description;
+ prop.value = getPropertyValue(index, objs);
+ prop.validValues = thisProperty.validValues;
+ properties.append(prop);
+ }
+
+ if (hasModel)
+ delete(model);
+
+ model = new GLEPropertyModel(properties, this);
+ connect(model, SIGNAL(dataChanged(QModelIndex, QModelIndex)),
+ this, SLOT(propertyChanged(QModelIndex, QModelIndex)));
+ hasModel = true;
+ setModel(model);
+ setItemDelegate(new VariantDelegate(this));
+ setSelectionBehavior(QAbstractItemView::SelectRows);
+ setSelectionMode(QAbstractItemView::NoSelection);
+
+}
+
+QVariant GLEPropertyEditor::getPropertyValue(int index, QList<GLEDrawingObject *> objs)
+{
+ // Find the value. This involves iterating through all the
+ // objects and identifying whether they all have the same value.
+ // If not, return a QVariant::List containing a single entry of the
+ // appropriate type.
+
+ QVariant value, compare;
+ value = objs[0]->getProperty(index);
+ int i;
+
+ for(i=1;i<objs.size();i++)
+ {
+ compare = objs[i]->getProperty(index);
+ if (compare != value)
+ {
+ QList<QVariant> blank;
+ blank.append(QVariant(value.type()));
+ value = QVariant(blank);
+ break;
+ }
+ }
+
+ return(value);
+}
+
+/*
+QSize GLEPropertyEditor::sizeHint() const
+{
+ qDebug() << "Default size property editor: " << defaultSize;
+ if (defaultSize == 0) return QTableView::sizeHint();
+ return QSize(250, defaultSize);
+}
+
+int GLEPropertyEditor::heightForWidth(int) const
+{
+ return -1;
+}
+*/
diff --git a/src/gui/propertyeditor.h b/src/gui/propertyeditor.h
new file mode 100644
index 0000000..4c96b3e
--- /dev/null
+++ b/src/gui/propertyeditor.h
@@ -0,0 +1,54 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+#ifndef __PROPERTYEDITOR_H
+#define __PROPERTYEDITOR_H
+
+#include <QtGui>
+#include "drawingobject.h"
+#include "propertymodel.h"
+
+class GLEPropertyEditor : public QTableView
+{
+ Q_OBJECT
+
+public:
+ //! Constructor
+ GLEPropertyEditor(QWidget *parent, int size);
+ // virtual QSize sizeHint() const;
+ // virtual int heightForWidth(int w) const;
+public slots:
+ void objectsSelected(QList<GLEDrawingObject *> objs);
+ void propertyChanged(const QModelIndex &index, const QModelIndex &index2);
+
+signals:
+ void propertiesHaveChanged();
+
+
+private:
+ QVariant getPropertyValue(int index, QList<GLEDrawingObject *> objs);
+ QList<GLEDrawingObject *> objects;
+ bool hasModel;
+ GLEPropertyModel *model;
+ int defaultSize;
+};
+
+#endif
diff --git a/src/gui/propertymodel.cpp b/src/gui/propertymodel.cpp
new file mode 100644
index 0000000..0355c96
--- /dev/null
+++ b/src/gui/propertymodel.cpp
@@ -0,0 +1,107 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+#include "propertymodel.h"
+#include "qgle_statics.h"
+
+GLEPropertyModel::GLEPropertyModel(const QList<GLEDrawingObjectProperty> &props, QObject *parent)
+ : QAbstractTableModel(parent)
+{
+ propertyList = props;
+}
+
+
+int GLEPropertyModel::rowCount(const QModelIndex&) const
+{
+ return(propertyList.size());
+}
+
+int GLEPropertyModel::columnCount(const QModelIndex&) const
+{
+ return(2);
+}
+
+GLEDrawingObjectProperty GLEPropertyModel::getFullProperty(const QModelIndex &index)
+{
+ return(propertyList.at(index.row()));
+}
+
+QVariant GLEPropertyModel::data(const QModelIndex &index, int role) const
+{
+ if (!index.isValid())
+ return QVariant();
+
+ if (index.row() >= propertyList.size())
+ return QVariant();
+
+ if (index.column() >= 2)
+ return QVariant();
+
+ if (role == Qt::DisplayRole)
+ {
+ if (index.column() == 0)
+ return(QVariant(propertyList.at(index.row()).description));
+ else
+ return(propertyList.at(index.row()).value);
+ }
+
+ return QVariant();
+}
+
+QVariant GLEPropertyModel::headerData(int section, Qt::Orientation orientation, int role) const
+{
+ if (role != Qt::DisplayRole)
+ return QVariant();
+
+ if (orientation == Qt::Horizontal)
+ {
+ if (section == 1)
+ return QString("Value");
+ else
+ return QString("Property");
+ }
+ else
+ return QVariant();
+}
+
+
+Qt::ItemFlags GLEPropertyModel::flags(const QModelIndex &index) const
+{
+ if (!index.isValid())
+ return Qt::ItemIsEnabled;
+
+ if (index.column() == 0)
+ return QAbstractItemModel::flags(index);
+ else
+ return QAbstractItemModel::flags(index) | Qt::ItemIsEditable;
+}
+
+bool GLEPropertyModel::setData(const QModelIndex &index, const QVariant &value, int role)
+{
+ if (index.isValid() && role == Qt::EditRole)
+ {
+ propertyList[index.row()].value = value;
+ emit dataChanged(index, index);
+ return(true);
+
+ }
+ return(false);
+}
diff --git a/src/gui/propertymodel.h b/src/gui/propertymodel.h
new file mode 100644
index 0000000..dce8989
--- /dev/null
+++ b/src/gui/propertymodel.h
@@ -0,0 +1,59 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+#ifndef __PROPERTYMODEL_H
+#define __PROPERTYMODEL_H
+
+#include <QtGui>
+
+struct GLEDrawingObjectProperty
+{
+ int index;
+ QString description;
+ QVariant value;
+ QVariant validValues;
+};
+
+class GLEPropertyModel : public QAbstractTableModel
+{
+ Q_OBJECT
+
+public:
+ GLEPropertyModel(const QList<GLEDrawingObjectProperty> &props, QObject *parent = 0);
+
+ int rowCount(const QModelIndex &parent = QModelIndex()) const;
+ int columnCount(const QModelIndex &parent = QModelIndex()) const;
+ QVariant data(const QModelIndex &index, int role) const;
+ QVariant headerData(int section, Qt::Orientation orientation,
+ int role = Qt::DisplayRole) const;
+
+ GLEDrawingObjectProperty getFullProperty(const QModelIndex &index);
+
+ Qt::ItemFlags flags(const QModelIndex &index) const;
+ bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole);
+
+private:
+ QList<GLEDrawingObjectProperty> propertyList;
+
+};
+
+
+#endif
diff --git a/src/gui/qgle.pro.in b/src/gui/qgle.pro.in
new file mode 100644
index 0000000..82d274f
--- /dev/null
+++ b/src/gui/qgle.pro.in
@@ -0,0 +1,187 @@
+#
+# QGLE - A Graphical Interface to GLE
+# Copyright (C) 2006 A. S. Budden & J. Struyf
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# Also add information on how to contact you by electronic and paper mail.
+#
+
+TEMPLATE = app
+TARGET +=
+DEPENDPATH += .
+INCLUDEPATH += .
+CONFIG += qt
+unix:MOC_DIR = ./moc
+unix:OBJECTS_DIR = ./objects
+QT += network
+QT += opengl
+
+macx {
+ TARGET = "QGLE"
+}
+
+ at QT_CONFIG@
+
+# If in debug mode, show the console in Windows
+# Otherwise, stop qDebug from outputting anything.
+CONFIG(debug, debug|release) {
+# win32 {
+# The following is automatically set to
+# "windows" in release mode, we override it here
+# in debug mode so that we can see the debugging output.
+# for a release build, change "CONFIG += debug" above
+# to "CONFIG += release".
+# CONFIG += console
+# }
+ win32 {
+ DEFINES += QT_NO_DEBUG_OUTPUT
+ }
+} else {
+ # No debug mode -> no debug output!
+ DEFINES += QT_NO_DEBUG_OUTPUT
+}
+
+# Input
+HEADERS += about.h \
+ amove.h \
+ arc.h \
+ circle.h \
+ colourbutton.h \
+ colourpicker.h \
+ component.h \
+ consolewindow.h \
+ drawingobject.h \
+ ellipse.h \
+ fileinfo.h \
+ gledrawing.h \
+ grid.h \
+ gsinc/*.h \
+ line.h \
+ mainwindow.h \
+ newfile.h \
+ polararray.h \
+ propertyeditor.h \
+ propertymodel.h \
+ qgle_definitions.h \
+ qgle_statics.h \
+ qgs.h \
+ serverthread.h \
+ settings.h \
+ settings_dialogue.h \
+ snapline.h \
+ text.h \
+ variantdelegate.h \
+ objectblocks.h \
+ dialogues.h \
+ 3dviewer.h
+SOURCES += about.cpp \
+ amove.cpp \
+ arc.cpp \
+ circle.cpp \
+ colourbutton.cpp \
+ colourpicker.cpp \
+ component.cpp \
+ consolewindow.cpp \
+ drawingobject.cpp \
+ ellipse.cpp \
+ fileinfo.cpp \
+ gledrawing.cpp \
+ grid.cpp \
+ line.cpp \
+ main.cpp \
+ mainwindow.cpp \
+ newfile.cpp \
+ polararray.cpp \
+ propertyeditor.cpp \
+ propertymodel.cpp \
+ qgle_statics.cpp \
+ qgs.cpp \
+ qgslibloader.cpp \
+ serverthread.cpp \
+ settings.cpp \
+ settings_dialogue.cpp \
+ snapline.cpp \
+ text.cpp \
+ variantdelegate.cpp \
+ objectblocks.cpp \
+ dialogues.cpp \
+ 3dviewer.cpp
+RESOURCES += qgle.qrc
+
+win32 {
+ RC_FILE += qgle.rc
+}
+
+macx {
+ ICON += images/gle.icns
+ SOURCES += macspecific.cpp
+# LIBS += -framework Cocoa
+}
+
+DISTFILES += readme.txt \
+ gpl.txt \
+ gsinc/LICENSE \
+ images/amove.png \
+ images/arc_3p.png \
+ images/circle.png \
+ images/edit_mode.png \
+ images/editor.png \
+ images/gle.ico \
+ images/gle.png \
+ images/grid.png \
+ images/gle.icns \
+ images/grid_snap.png \
+ images/line.png \
+ images/new.png \
+ images/open.png \
+ images/orthosnap.png \
+ images/osnap.png \
+ images/perp_line.png \
+ images/pointer.png \
+ images/polarsnap.png \
+ images/polartrack.png \
+ images/preview_mode.png \
+ images/save.png \
+ images/tan_line.png \
+ images/zoom_in.png \
+ images/zoom_out.png \
+ images/reload.png \
+ images/reload_red.png
+
+LIBS += $$QMAKE_LIBS_DYNLOAD
+
+# link against the GLE library (unix -> Linux and Mac OS/X)
+unix {
+ LIBS += -lgle-graphics- at GLE_VERSION@ -L../../build/lib/
+}
+win32 {
+ LIBS += -lglu32
+ LIBS += -lgle-graphics- at GLE_VERSION@ -L../../build/bin/
+}
+
+# place the resulting QGLE executable in the "bin" subdirectory of "build"
+DESTDIR = ../../build/bin
+
+# add the "lib" directory to the search path of the linker
+unix {
+ LIBS += @QT_RPATH@ @QT_LIBGLU_LIB@
+}
+
+QMAKE_CXXFLAGS += @QT_CPPFLAGS@
+QMAKE_CFLAGS += @QT_CPPFLAGS@
+QMAKE_LDFLAGS += @QT_LDFLAGS@
+
+# vim:et
diff --git a/src/gui/qgle.qrc b/src/gui/qgle.qrc
new file mode 100644
index 0000000..69eb714
--- /dev/null
+++ b/src/gui/qgle.qrc
@@ -0,0 +1,57 @@
+<!DOCTYPE RCC><RCC version="1.0">
+<!--
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+-->
+<qresource>
+ <file>images/amove.png</file>
+ <file>images/arc_3p.png</file>
+ <file>images/circle.png</file>
+ <file>images/edit_mode.png</file>
+ <file>images/editor.png</file>
+ <file>images/ellipse.png</file>
+ <file>images/ellipsis.png</file>
+ <file>images/gle.png</file>
+ <file>images/gle_shadow.png</file>
+ <file>images/grid.png</file>
+ <file>images/grid_snap.png</file>
+ <file>images/line.png</file>
+ <file>images/new.png</file>
+ <file>images/open.png</file>
+ <file>images/orthosnap.png</file>
+ <file>images/osnap.png</file>
+ <file>images/perp_line.png</file>
+ <file>images/pointer.png</file>
+ <file>images/polarsnap.png</file>
+ <file>images/polartrack.png</file>
+ <file>images/preview_mode.png</file>
+ <file>images/save.png</file>
+ <file>images/tan_line.png</file>
+ <file>images/text.png</file>
+ <file>images/varyingcolours.png</file>
+ <file>images/zoom_in.png</file>
+ <file>images/zoom_out.png</file>
+ <file>images/reload.png</file>
+ <file>images/reload_red.png</file>
+ <file>readme.txt</file>
+ <file>about.html</file>
+</qresource>
+</RCC>
diff --git a/src/gui/qgle.rc b/src/gui/qgle.rc
new file mode 100644
index 0000000..80a1e3c
--- /dev/null
+++ b/src/gui/qgle.rc
@@ -0,0 +1 @@
+IDI_ICON1 ICON DISCARDABLE "images/gle.ico"
diff --git a/src/gui/qgle_definitions.h b/src/gui/qgle_definitions.h
new file mode 100644
index 0000000..c8738cf
--- /dev/null
+++ b/src/gui/qgle_definitions.h
@@ -0,0 +1,86 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+#ifndef _QGLE_DEF_H
+#define _QGLE_DEF_H
+
+// The version number and application name
+#define APP_NAME tr("QGLE")
+
+// Some application defaults/defines
+#define DEFAULT_PORT 6667
+#define CM_PER_INCH 2.54
+//
+// This is the offset (in inches) that is added around the border
+// of the drawing by GLE
+#define GS_OFFSET (1.0/72.0)
+
+// The maximum allowable distance between a click point and an object
+// to be selected
+#define MAX_SELECT_DISTANCE 8.0
+
+// The length of the AMove cross
+#define AMOVE_LENGTH 8
+
+// The step to zoom in by
+#define ZOOM_STEP 1.5
+
+// The maximum number of decimal places in GLE coordinates
+#define GLE_NUMBER_MAX_DP 6
+
+// The default size for new diagrams
+#define DEFAULT_NEW_SIZE 12.0
+
+// The maximum distance at which to draw OSNAP handles
+#define MAX_OSNAP_DRAW_DISTANCE 20.0
+
+// The maximum distance at which to set the current position to be
+// the osnap
+#define MAX_OSNAP_DISTANCE 5.0
+
+// The maximum distance at which to keep snap lines
+#define MAX_SNAP_LINE_DISTANCE 10.0
+
+// Half the size of the OSNAP box
+#define OSNAP_BOX_SIZE 3
+
+// Prevents unused argument warnings
+#define UNUSED_ARG(x) (void) x
+
+// The size of the handles used to resize objects
+#define HANDLE_SIZE 3.0
+
+// The minimum on-screen circle radius
+#define MINIMUM_CIRCLE_RADIUS 1e-6
+
+// The maximum number of iterations to use when finding
+// elliptical perpendicular points
+#define MAX_ELLIPSE_PERP_ITERATIONS 15
+
+// The target accuracy (in radians) for elliptical perpendicular
+// points
+#define ELLIPSE_PERP_ACCURACY 1e-3
+
+#ifndef M_PI
+#define M_PI 3.14159265358979323846
+#endif
+
+#endif
diff --git a/src/gui/qgle_statics.cpp b/src/gui/qgle_statics.cpp
new file mode 100644
index 0000000..cb287d9
--- /dev/null
+++ b/src/gui/qgle_statics.cpp
@@ -0,0 +1,862 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+#include <QtGui>
+#include "qgle_statics.h"
+#include "qgle_definitions.h"
+#include "drawingobject.h"
+
+#include <math.h>
+#ifdef Q_WS_WIN
+ #include <windows.h>
+#endif
+
+/*******************************************
+ * Static members used in a lot of classes *
+ *******************************************/
+
+void QGLE::flushIO()
+{
+ // Flush the IO to make debug messages appear quickly
+ QTextStream out(stdout);
+ out.flush();
+ QTextStream err(stderr);
+ err.flush();
+}
+
+QString QGLE::prettyDate(QString datestr)
+{
+ // Create a QDate object based on the
+ // provided date
+ QDate dt = QDate::fromString(datestr, "dd/MM/yyyy");
+ QString prettyString = dt.toString("d MMMM yyyy");
+ QRegExp rx("^(\\d?)(\\d)(?= )");
+ QString suffix;
+ if(rx.indexIn(prettyString) > -1)
+ {
+ if (rx.capturedTexts()[1].toInt() == 1)
+ suffix = "th";
+ else
+ switch(rx.capturedTexts()[2].toInt())
+ {
+ case 1:
+ suffix = "st";
+ break;
+ case 2:
+ suffix = "nd";
+ break;
+ case 3:
+ suffix = "rd";
+ break;
+ default:
+ suffix = "th";
+ }
+ prettyString.replace(rx, rx.capturedTexts()[0] + suffix);
+ }
+ return(prettyString);
+
+}
+
+int QGLE::sign(double n)
+{
+ if (n > 0.0)
+ return(1);
+ else if (n < 0.0)
+ return(-1);
+ else
+ return(0);
+}
+
+int QGLE::sign(int n)
+{
+ if (n > 0)
+ return(1);
+ else if (n < 0)
+ return(-1);
+ else
+ return(0);
+}
+
+int QGLE::quadrant(double angle)
+{
+ double degrees = radiansToDegrees(angle);
+ int quadrant;
+
+ // Make the number positive
+ while(degrees < 0.0)
+ degrees += 360.0;
+
+ // Make the number less than 360
+ while(degrees > 360.0)
+ degrees -= 360.0;
+
+ if (degrees > 270.0)
+ quadrant = 4;
+ else if (degrees > 180.0)
+ quadrant = 3;
+ else if (degrees > 90.0)
+ quadrant = 2;
+ else
+ quadrant = 1;
+
+ return(quadrant);
+}
+
+QString QGLE::gleToQString(GLEString* str) {
+ QString res;
+ int len = (int)str->length();
+ res.resize(len);
+ for (int i = 0; i < len; i++) {
+ res[i] = QChar(str->get(i));
+ }
+ return res;
+}
+
+void QGLE::qtToGLEString(const QString& str1, GLEString* str2) {
+ unsigned int size = str1.size();
+ str2->setSize(size);
+ for (unsigned int i = 0; i < size; i++) {
+ str2->set(i, str1[i].unicode());
+ }
+}
+
+// Static member used to convert betweeen coordinate systems
+QPointF QGLE::absGLEToQt(double gleX, double gleY, double dpi, int areaHeight)
+{
+ double qtX, qtY;
+
+ QPointF relative = relGLEToQt(gleX,gleY,dpi);
+ qtX = relative.x() + (GS_OFFSET*dpi);
+ qtY = areaHeight - (relative.y() + (GS_OFFSET*dpi));
+
+ return(QPointF(qtX, qtY));
+}
+
+// Static member used to convert betweeen coordinate systems
+QPointF QGLE::absGLEToQt(QPointF gle, double dpi, int areaHeight)
+{
+ return(absGLEToQt(gle.x(), gle.y(), dpi, areaHeight));
+}
+
+QPointF QGLE::absGLEToQt(const GLEPoint& gle, double dpi, int areaHeight)
+{
+ return(absGLEToQt(gle.getX(), gle.getY(), dpi, areaHeight));
+}
+
+QSizeF QGLE::qtSizeToGLE(QSizeF qt, double dpi)
+{
+ // DO NOT RELY ON THIS FOR ACCURACY!
+ double gleX, gleY;
+ qt.setWidth(qt.width() - 2*GS_OFFSET*dpi);
+ qt.setHeight(qt.height() - 2*GS_OFFSET*dpi);
+ QPointF rel = relQtToGLE(qt.width(), qt.height(), dpi);
+ gleX = rel.x();
+ gleY = rel.y();
+
+ return(QSizeF(gleX,gleY));
+}
+
+// Static member used to convert betweeen coordinate systems
+QPointF QGLE::relGLEToQt(double gleX, double gleY, double dpi)
+{
+ double qtX, qtY;
+
+ qtX = gleX*dpi/CM_PER_INCH;
+ qtY = gleY*dpi/CM_PER_INCH;
+
+ return(QPointF(qtX, qtY));
+}
+
+// Static member used to convert betweeen coordinate systems
+QPointF QGLE::relGLEToQt(QPointF gle, double dpi)
+{
+ return(relGLEToQt(gle.x(), gle.y(), dpi));
+}
+
+// Static member used to convert betweeen coordinate systems
+QSizeF QGLE::relGLEToQt(QSizeF gle, double dpi)
+{
+ QPointF qt;
+ qt = relGLEToQt(gle.width(), gle.height(), dpi);
+ return(QSizeF(qt.x(),qt.y()));
+}
+
+double QGLE::relGLEToQt(double gle, double dpi)
+{
+ return(gle*dpi/CM_PER_INCH);
+}
+
+// Static member used to convert betweeen coordinate systems
+QPointF QGLE::relQtToGLE(double qtX, double qtY, double dpi)
+{
+ double gleX, gleY;
+
+ gleX = qtX*CM_PER_INCH/dpi;
+ gleY = qtY*CM_PER_INCH/dpi;
+
+ return(QPointF(gleX, gleY));
+}
+
+// Static member used to convert betweeen coordinate systems
+QPointF QGLE::relQtToGLE(QPointF qt, double dpi)
+{
+ return(relQtToGLE(qt.x(), qt.y(), dpi));
+}
+
+// Static member used to convert betweeen coordinate systems
+QSizeF QGLE::relQtToGLE(QSizeF qt, double dpi)
+{
+ QPointF gle;
+ gle = relQtToGLE(qt.width(), qt.height(), dpi);
+ return(QSizeF(gle.x(),gle.y()));
+}
+
+double QGLE::relQtToGLE(double qt, double dpi)
+{
+ return(qt*CM_PER_INCH/dpi);
+}
+
+// Static member used to convert betweeen coordinate systems
+QPointF QGLE::absQtToGLE(double qtX, double qtY, double dpi, int areaHeight)
+{
+ double gleX, gleY;
+
+ gleX = ((qtX/dpi)-GS_OFFSET)*CM_PER_INCH;
+ gleY = (((areaHeight - qtY)/dpi)-GS_OFFSET)*CM_PER_INCH;
+
+ return(QPointF(gleX, gleY));
+}
+
+// Static member used to convert betweeen coordinate systems
+QPointF QGLE::absQtToGLE(QPointF qt, double dpi, int areaHeight)
+{
+ return(absQtToGLE(qt.x(), qt.y(), dpi, areaHeight));
+}
+
+// Static member used for type converting Qt points to GLEPoints
+GLEPoint QGLE::QPointFToGLEPoint(const QPointF& pt) {
+ return GLEPoint(pt.x(), pt.y());
+}
+
+// Static member used for type converting GLEPoints to Qt points
+QPointF QGLE::GLEPointToQPointF(const GLEPoint& pt) {
+ return QPointF(pt.getX(), pt.getY());
+}
+
+//! Static member used for converting from GLE coordinates to a GLE coordinate string
+QString QGLE::GLEToStr(QPointF gle)
+{
+ return(GLEToStr(gle.x(), gle.y()));
+}
+//! Static member used for converting from GLE coordinates to a GLE coordinate string
+QString QGLE::GLEToStr(double gleX, double gleY)
+{
+ QString x, y;
+
+ x.setNum(gleX, 'f', GLE_NUMBER_MAX_DP);
+ y.setNum(gleY, 'f', GLE_NUMBER_MAX_DP);
+
+ x = ZeroCrop(x);
+ y = ZeroCrop(y);
+
+ return(QString("%1 %2").arg(x).arg(y));
+}
+
+//! Static member used for converting from GLE distance to a GLE string
+QString QGLE::GLEToStr(double gle)
+{
+ QString x;
+
+ x.setNum(gle, 'f', GLE_NUMBER_MAX_DP);
+
+ x = ZeroCrop(x);
+
+ return(QString("%1").arg(x));
+}
+
+//! Static member used to crop unnecessary zeros from the end of a number string
+QString QGLE::ZeroCrop(QString str)
+{
+ int last0;
+ int i;
+
+ last0 = str.size();
+ for(i=str.size()-1;i>0;i--)
+ {
+ if (str.at(i) == '0')
+ {
+ last0 = i;
+ }
+ else if (str.at(i) == '.')
+ {
+ last0++;
+ break;
+ }
+ else
+ {
+ break;
+ }
+ }
+ if (last0 != str.size())
+ str.chop(str.size()-last0);
+
+ return(str);
+}
+
+//! Static member used for finding the distance between two points
+double QGLE::distance(QPointF one, QPointF two)
+{
+ return(sqrt(pow(one.x()-two.x(),2) + pow(one.y()-two.y(),2)));
+}
+
+//! Static member used for finding the distance between two points
+double QGLE::distance(double x, double y, QPointF two)
+{
+ double dx = x-two.x();
+ double dy = y-two.y();
+ return(sqrt(dx*dx + dy*dy));
+}
+
+double QGLE::angleBetweenTwoPoints(QPointF one, QPointF two)
+{
+ return(atan2(two.y()-one.y(),two.x()-one.x()));
+}
+
+double QGLE::radiansToDegrees(double rads)
+{
+ return(rads*180.0/M_PI);
+}
+
+double QGLE::degreesToRadians(double degrees)
+{
+ return(degrees*M_PI/180.0);
+}
+
+//! Static member used to compute the minimum of two double values
+double QGLE::min(double a, double b) {
+ return a < b ? a : b;
+}
+
+//! Static member comverting from centimeters to PostScript points
+double QGLE::cmToPt(double cm) {
+ return cm*PS_POINTS_PER_INCH/CM_PER_INCH;
+}
+
+//! Static member used to compute the DPI value based on the display and image size (in cm)
+int QGLE::computeAutoScaleDPIFromCm(const QSize& bitmapSize, int inset, double imgWd, double imgHi) {
+ // GLE always adds two points to the size of a drawing
+ return computeAutoScaleDPIFromPts(bitmapSize, inset, cmToPt(imgWd)+2.0, cmToPt(imgHi)+2.0);
+}
+
+//! Static member used to compute the DPI value based on the display and image size (in pt)
+int QGLE::computeAutoScaleDPIFromPts(const QSize& bitmapSize, int inset, double bbWd, double bbHi) {
+ // GLE: BitmapWd = (int)floor((double)dpi/PS_POINTS_PER_INCH*BoundingBoxWD+1)
+ // BitmapWd + 0.1 = dpi/PS_POINTS_PER_INCH*BoundingBoxWD+1
+ // -> Solve for dpi
+ double dpi_wd = PS_POINTS_PER_INCH * ((double)bitmapSize.width()-inset-0.9) / bbWd;
+ double dpi_hi = PS_POINTS_PER_INCH * ((double)bitmapSize.height()-inset-0.9) / bbHi;
+ return (int)floor(min(dpi_wd, dpi_hi));
+}
+
+QString QGLE::GetExeName()
+{
+ QString result = QString::null;
+#ifdef Q_WS_WIN
+ char name[1024];
+ DWORD res = GetModuleFileNameA(NULL, name, 1023);
+ if (res > 0)
+ {
+ name[res] = 0;
+ result = name;
+ }
+#elif defined Q_WS_X11
+ return(QFileInfo("/proc/self/exe").readLink());
+#else
+ return(QApplication::applicationFilePath());
+#endif
+ return result;
+}
+
+QString QGLE::GetDirName(QString fname)
+{
+ QString result = fname;
+ result.replace('\\', '/');
+ int i = result.lastIndexOf('/');
+ if (i != -1)
+ {
+ result.truncate(i+1);
+ }
+ else
+ {
+ result = "";
+ }
+ return result;
+ // // Could alternatively be achieved with
+ // // something like:
+ // QFileInfo fi(fname);
+ // return(fi.absolutePath());
+}
+
+QRegExp QGLE::fileRegExp()
+{
+#ifdef Q_WS_WIN
+ QRegExp rx("(file:///)?(.*\\.(?:gle|eps))", Qt::CaseInsensitive);
+#else
+//#elif defined(Q_WS_X11)
+ QRegExp rx("(file://)?(.*\\.(?:gle|eps))", Qt::CaseInsensitive);
+#endif
+ return(rx);
+}
+
+QString QGLE::gsLibFileName()
+{
+#ifdef Q_WS_WIN
+ return(QObject::tr("gsdll32.dll"));
+#elif defined(Q_WS_X11)
+ return(QObject::tr("libgs.so"));
+#elif defined(Q_WS_MAC)
+ return(QObject::tr("libgs.dylib"));
+#else
+#error "What operating system are you using?"
+#endif
+}
+
+QString QGLE::libraryFilter()
+{
+#ifdef Q_WS_WIN
+ return(QObject::tr("DLLs (*.dll)"));
+#elif defined(Q_WS_X11)
+ return(QObject::tr("Shared objects (*.so*)"));
+#elif defined(Q_WS_MAC)
+ return(QObject::tr("Dynamic libraries (*.dylib);; Ghostscript framework (*)"));
+#else
+#error What operating system are you using?
+#endif
+}
+
+QString QGLE::gleExecutableName()
+{
+#ifdef Q_WS_WIN
+ return(QString("gle.exe"));
+#else
+//#elif defined(Q_WS_X11)
+ return(QString("gle"));
+#endif
+}
+
+QString QGLE::executableFilter()
+{
+#ifdef Q_WS_WIN
+ return(QObject::tr("Executables (*.exe)"));
+#else
+//#elif defined(Q_WS_X11)
+ return(QObject::tr("All files (*)"));
+#endif
+}
+
+//! Static member to enable a button if it is not null
+void QGLE::setEnabled(QPushButton* button, bool enable) {
+ if (button != NULL) {
+ button->setEnabled(enable);
+ }
+}
+
+//! Static member to draw a box around a point
+void QGLE::drawBox(QPainter *p, QPointF origin, double half_size, QPen pen)
+{
+ p->setPen(pen);
+ p->drawLine(QLineF(origin.x() - half_size,
+ origin.y() - half_size,
+ origin.x() - half_size,
+ origin.y() + half_size));
+ p->drawLine(QLineF(origin.x() - half_size,
+ origin.y() + half_size,
+ origin.x() + half_size,
+ origin.y() + half_size));
+ p->drawLine(QLineF(origin.x() + half_size,
+ origin.y() + half_size,
+ origin.x() + half_size,
+ origin.y() - half_size));
+ p->drawLine(QLineF(origin.x() + half_size,
+ origin.y() - half_size,
+ origin.x() - half_size,
+ origin.y() - half_size));
+}
+
+//! Static member to fill a box
+void QGLE::fillBox(QPainter *p, QPointF origin, int half_size, const QBrush& brush)
+{
+ int x0 = (int)floor(origin.x()-half_size+0.5);
+ int y0 = (int)floor(origin.y()-half_size+0.5);
+ p->fillRect(x0, y0, 2*half_size, 2*half_size, brush);
+}
+
+//! Static member to draw a rotating handle around a point
+void QGLE::drawRotator(QPainter *p, QPointF origin, int corner, double half_size, QPen pen)
+{
+ //double arrSize = 2.0;
+// pen.setWidthF(pen.widthF()*4.0);
+ p->setPen(pen);
+ p->save();
+ p->translate(origin);
+
+ // Work on the top right corner, but rotate according to which corner
+ // it actually is:
+ if (corner == GLEDrawingArea::TopLeft)
+ p->rotate(-90.0);
+ else if (corner == GLEDrawingArea::BottomLeft)
+ p->rotate(180.0);
+ else if (corner == GLEDrawingArea::BottomRight)
+ p->rotate(90.0);
+
+// p->drawArc(QRectF(-half_size, half_size, 2*half_size, 2*half_size), 0, 16*90);
+// p->drawLine(QLineF(half_size, 0.0, half_size - arrSize, -arrSize));
+// p->drawLine(QLineF(half_size, 0.0, half_size + arrSize, -arrSize));
+// p->drawLine(QLineF(0.0, half_size, arrSize, half_size - arrSize));
+// p->drawLine(QLineF(0.0, half_size, arrSize, half_size + arrSize));
+ p->drawEllipse(QRectF(-half_size, -half_size, 2*half_size, 2*half_size));
+
+ p->restore();
+}
+
+//! Static member to draw a line with arrows at the ends
+void QGLE::drawArrowLine(QPainter *p, qreal x0, qreal y0, qreal x1, qreal y1, qreal size, qreal angle, bool a0, bool a1, const QPen& pen) {
+ double dx = x1 - x0;
+ double dy = y1 - y0;
+ GLEPoint start_pt((double)x0, (double)y0);
+ GLEPoint end_pt((double)x1, (double)y1);
+ GLEArrowPoints pts1, pts2;
+ GLEGetArrowPointsNoProps(start_pt, dx, dy, 1, size, angle, &pts1);
+ GLEGetArrowPointsNoProps(end_pt, -dx, -dy, 1, size, angle, &pts2);
+ QPen new_pen = pen;
+ new_pen.setJoinStyle(Qt::MiterJoin);
+ new_pen.setMiterLimit(20);
+ if (a0) start_pt.setXY(pts1.xl, pts1.yl);
+ if (a1) end_pt.setXY(pts2.xl, pts2.yl);
+ p->setPen(pen);
+ p->drawLine(QPointF(start_pt.getX(), start_pt.getY()), QPointF(end_pt.getX(), end_pt.getY()));
+ p->setPen(new_pen);
+ if (a0) {
+ QPointF poly[3];
+ poly[0] = QPointF(pts1.xa, pts1.ya);
+ poly[1] = QPointF(pts1.xt, pts1.yt);
+ poly[2] = QPointF(pts1.xb, pts1.yb);
+ p->setBrush(QBrush(Qt::black));
+ p->drawConvexPolygon(poly, 3);
+ }
+ if (a1) {
+ QPointF poly[3];
+ poly[0] = QPointF(pts2.xa, pts2.ya);
+ poly[1] = QPointF(pts2.xt, pts2.yt);
+ poly[2] = QPointF(pts2.xb, pts2.yb);
+ p->setBrush(QBrush(Qt::black));
+ p->drawConvexPolygon(poly, 3);
+ }
+}
+
+//! Static member to draw a scale handle around a point
+void QGLE::drawScaleHandle(QPainter *p, QPointF origin, int dx, int dy, double half_size, QPen pen) {
+ QGLE::drawBox(p, origin, half_size, pen);
+ QGLE::drawArrowLine(p, origin.x()+dx*half_size, origin.y()+dy*half_size,
+ origin.x()+4*dx*half_size, origin.y()+4*dy*half_size, 1.5*half_size, 40, true, true, pen);
+}
+
+//! Static member to draw a cross at a point
+void QGLE::drawCross(QPainter *p, QPointF origin, double half_size, QPen pen)
+{
+ p->setPen(pen);
+ p->drawLine(QLineF(origin.x()-half_size,
+ origin.y()-half_size,
+ origin.x()+half_size,
+ origin.y()+half_size));
+ p->drawLine(QLineF(origin.x()-half_size,
+ origin.y()+half_size,
+ origin.x()+half_size,
+ origin.y()-half_size));
+}
+
+void QGLE::drawPerpMark(QPainter *p, QPointF origin, QPen pen)
+{
+ p->setPen(pen);
+ double half_size = OSNAP_BOX_SIZE;
+ p->drawLine(QLineF(origin.x()-2*half_size,
+ origin.y(),
+ origin.x()+2*half_size,
+ origin.y()));
+ p->drawLine(QLineF(origin.x(),origin.y(),
+ origin.x(),origin.y()-4*half_size));
+ p->drawLine(QLineF(origin.x()-half_size,
+ origin.y(),
+ origin.x()-half_size,
+ origin.y()-half_size));
+ p->drawLine(QLineF(origin.x()-half_size,
+ origin.y()-half_size,
+ origin.x(),
+ origin.y()-half_size));
+}
+
+void QGLE::drawTangentMark(QPainter *p, QPointF origin, QPen pen)
+{
+ p->setPen(pen);
+ double half_size = OSNAP_BOX_SIZE;
+ p->drawLine(QLineF(origin.x()-2*half_size,
+ origin.y(),
+ origin.x()+2*half_size,
+ origin.y()));
+ p->drawArc(QRectF(origin.x()-2*half_size,
+ origin.y(),
+ 4*half_size,
+ 4*half_size), 0,180*16);
+
+}
+
+void QGLE::drawIntersectMark(QPainter *p, QPointF origin, QPen pen)
+{
+ p->setPen(pen);
+ double half_size = OSNAP_BOX_SIZE;
+ p->drawLine(QLineF(origin.x()-2*half_size,
+ origin.y()-2*half_size,
+ origin.x()+2*half_size,
+ origin.y()+2*half_size));
+ p->drawLine(QLineF(origin.x(),
+ origin.y()-2*half_size,
+ origin.x(),
+ origin.y()+2*half_size));
+
+}
+
+void QGLE::drawOSnap(QPainter *p, QPointF snap, int type)
+{
+ QPair<QPointF, int> combined;
+ combined.first = snap;
+ combined.second = type;
+ drawOSnap(p, combined);
+}
+
+void QGLE::drawOSnap(QPainter *p, QPair<QPointF, int> snap)
+{
+ p->setPen(osnapPen());
+ // Switch on snap.second
+ switch(snap.second)
+ {
+ case PerpendicularSnap:
+ drawPerpMark(p,snap.first,osnapPen());
+ break;
+
+ case TangentSnap:
+ drawTangentMark(p,snap.first,osnapPen());
+ break;
+
+ case IntersectSnap:
+ drawIntersectMark(p, snap.first, osnapPen());
+ break;
+
+ default:
+ drawBox(p,snap.first,OSNAP_BOX_SIZE,osnapPen());
+ }
+}
+
+bool QGLE::inOrder(double x, double y, double z)
+{
+ if ((y >= x) && (z >= y))
+ return(true);
+ else if ((y < x) && (z < y))
+ return(true);
+ else
+ return(false);
+}
+QPen QGLE::osnapPen()
+{
+ QPen pen;
+ pen.setColor(Qt::darkYellow);
+ pen.setWidth(1);
+ return(pen);
+}
+
+QPen QGLE::osnapLinePen()
+{
+ QPen pen = osnapPen();
+ pen.setStyle(Qt::DashLine);
+ return(pen);
+}
+
+QPen QGLE::otrackLinePen()
+{
+ QPen pen = osnapPen();
+ pen.setStyle(Qt::DashLine);
+ return(pen);
+}
+
+QPen QGLE::handlePen()
+{
+ QPen pen;
+ pen.setColor(Qt::black);
+ pen.setWidth(1);
+ return(pen);
+}
+
+QPointF QGLE::calculateScaleRatios(QPointF basePoint, QPointF startPoint, QPointF endPoint, int method)
+{
+ QPointF oldSize = startPoint - basePoint;
+ QPointF newSize = endPoint - basePoint;
+ double yscale, xscale;
+
+ switch (method)
+ {
+ case ProportionalScale:
+ if (oldSize.x() == 0.0)
+ xscale = 1e6;
+ else
+ xscale = newSize.x() / oldSize.x();
+
+ if (oldSize.y() == 0.0)
+ yscale = 1e6;
+ else
+ yscale = newSize.y() / oldSize.y();
+
+ if (xscale > yscale)
+ yscale = xscale;
+ else
+ xscale = yscale;
+ break;
+
+
+
+ case HorizontalScale:
+ yscale = 1.0;
+ if (oldSize.x() == 0.0)
+ xscale = 1.0;
+ else
+ xscale = newSize.x() / oldSize.x();
+ break;
+
+ case VerticalScale:
+ xscale = 1.0;
+ if (oldSize.y() == 0.0)
+ yscale = 1.0;
+ else
+ yscale = newSize.y() / oldSize.y();
+ break;
+
+
+ default:
+ xscale = yscale = 1.0;
+ }
+
+ return(QPointF(xscale, yscale));
+}
+
+QPointF QGLE::parkTransform(QPointF original, double angle)
+{
+ QPointF newPoint;
+
+ newPoint.setX(cos(angle)*original.x() + sin(angle)*original.y());
+ newPoint.setY(cos(angle)*original.y() - sin(angle)*original.x());
+ return(newPoint);
+}
+
+QPointF QGLE::rotateAboutPoint(QPointF original, double angle, QPointF basePoint)
+{
+ // Get the point relative to new origin
+ QPointF newPoint = original - basePoint;
+
+ // Rotate
+ newPoint = parkTransform(newPoint, angle);
+
+ // Move back to the old origin
+ newPoint = newPoint + basePoint;
+
+ return(newPoint);
+}
+
+QString QGLE::colourQtToGLE(QColor colour)
+{
+
+ if (!colour.isValid())
+ return("");
+
+ // TODO:
+ // It would be better to detect predefined GLE colours
+ // and use their names where possible and only resort
+ // to CVTRGB if a standard colour cannot be matched.
+ return(QString("CVTRGB(%1/255,%2/255,%3/255)")
+ .arg(colour.red())
+ .arg(colour.green())
+ .arg(colour.blue()));
+}
+
+QString QGLE::getFileNameExtension(const QString& name)
+{
+ int pos = name.length();
+ // Never search to before "/" or "\\": file may not have extension
+ // And don't find "." in path before file name
+ while (pos >= 1 && name[pos-1] != '/' && name[pos-1] != '\\' && name[pos-1] != '.' ) {
+ pos--;
+ }
+ if (pos >= 1 && name[pos-1] == '.') {
+ return name.mid(pos).toLower();
+ } else {
+ return QString();
+ }
+}
+
+bool QGLE::isGraphicsExtension(const QString& name)
+{
+ QString ext = QGLE::getFileNameExtension(name);
+ if (ext == "pdf") return true;
+ if (ext == "eps") return true;
+ if (ext == "ps") return true;
+ if (ext == "png") return true;
+ if (ext == "jpg") return true;
+ if (ext == "jpeg") return true;
+ if (ext == "gif") return true;
+ if (ext == "tif") return true;
+ if (ext == "tiff") return true;
+ return false;
+}
+
+QString QGLE::addFileNameExtension(const QString& name, const char* ext)
+{
+ int i = name.lastIndexOf('.');
+ if (i != -1)
+ {
+ QString result = name.left(i);
+ result.append(".");
+ result.append(QString::fromUtf8(ext));
+ return result;
+ }
+ else
+ {
+ QString result = name;
+ result.append(".");
+ result.append(QString::fromUtf8(ext));
+ return result;
+ }
+}
+
+void QGLE::ensureFileNameExtension(QString* str, const char* ext) {
+ QRegExp rxExt(QString(".*\\.") + ext);
+ rxExt.setCaseSensitivity(Qt::CaseInsensitive);
+ if (!rxExt.exactMatch(*str)) {
+ *str += ".";
+ *str += ext;
+ }
+}
diff --git a/src/gui/qgle_statics.h b/src/gui/qgle_statics.h
new file mode 100644
index 0000000..51e0610
--- /dev/null
+++ b/src/gui/qgle_statics.h
@@ -0,0 +1,278 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+#ifndef __QGLE_STATICS_H
+#define __QGLE_STATICS_H
+
+#include <QtGui>
+#include "../gle/gle-interface/gle-interface.h"
+
+//! Class providing static helper functions for the main code
+class QGLE
+{
+public:
+ //! Flush the IO so that debug messages appear immediately
+ static void flushIO();
+
+ //! The list of commands that can be used
+ enum Commands
+ {
+ // For drawing a new line:
+ StartNewLineWithPoint,
+ SetLineEndPoint,
+ EndNewLine,
+
+ // For drawing a new Tangential Line:
+ StartNewTanLineWithPoint,
+ SetTanLineEndPoint,
+ EndNewTanLine,
+
+ // For drawing a new Perpendicular Line:
+ StartNewPerpLineWithPoint,
+ SetPerpLineEndPoint,
+ EndNewPerpLine,
+
+ // For drawing a new circle
+ StartNewCircleWithCentre,
+ SetCircleEdgePoint,
+ EndNewCircle,
+
+ // For drawing a new ellipse
+ StartNewEllipseWithCorner,
+ SetEllipseSecondCorner,
+ EndNewEllipse,
+
+ // For drawing a new arc
+ StartNewArcWithPoint,
+ SetArcEndPoint,
+ SetArcMidPoint,
+ EndNewArc,
+
+ // Create a new text object
+ CreateTextObject,
+
+ // User hit the escape key
+ Cancel,
+
+ // User pressed delete
+ DeleteSelected,
+
+ // For setting the amove
+ SetAMove
+
+ };
+
+
+ //! Print a date in a pretty format
+ /*!
+ * This only supports English dates at present: this is because
+ * the readme.txt file is only likely to be written in English
+ * at the moment. Once internationalisation is done and the
+ * readme.txt about box is replaced with a help system based on
+ * QAssistant, this function can be replaced with one that uses the
+ * current locale. This uses the long name for the month so as to
+ * avoid ambiguity between dd/mm/yyyy and mm/dd/yyyy. Its argument
+ * is the date in dd/mm/yyyy format (with leading zeros).
+ */
+ static QString prettyDate(QString datestr);
+
+ //! Return the sign of a number
+ static int sign(double n);
+ //! Return the sign of a number
+ static int sign(int n);
+
+ //! Return the quadrant that an angle is in
+ static int quadrant(double angle);
+
+ //! Get the filename of an executable
+ static QString GetExeName();
+ //! Get the directory of a file
+ static QString GetDirName(QString fname);
+
+ //! Convert GLE to Qt String
+ static QString gleToQString(GLEString* str);
+ //! Convert STL to Qt String
+ static inline QString stlToQString(const string& str) { return QString::fromUtf8(str.c_str(), str.length()); };
+ //! Convert Qt to GLE String
+ static void qtToGLEString(const QString& str1, GLEString* str2);
+
+ //! Static member used for converting between coordinate system
+ static QPointF absGLEToQt(double gleX, double gleY, double dpi, int areaHeight);
+ //! Static member used for converting between coordinate systems
+ static QSizeF qtSizeToGLE(QSizeF qt, double dpi);
+ //! Static member used for converting between coordinate system
+ static QPointF absGLEToQt(QPointF gle, double dpi, int areaHeight);
+ static QPointF absGLEToQt(const GLEPoint& gle, double dpi, int areaHeight);
+ //! Static member used for converting between coordinate system
+ static QPointF relGLEToQt(double gleX, double gleY, double dpi);
+ //! Static member used for converting between coordinate system
+ static QPointF relGLEToQt(QPointF gle, double dpi);
+ //! Static member used for converting between coordinate system
+ static QSizeF relGLEToQt(QSizeF gle, double dpi);
+ //! Static member used for converting individual relative numbers
+ static double relGLEToQt(double gle, double dpi);
+ //! Static member used for converting between coordinate system
+ static QPointF absQtToGLE(QPointF qt, double dpi, int areaHeight);
+ //! Static member used for converting between coordinate system
+ static QPointF absQtToGLE(double qtX, double qtY, double dpi, int areaHeight);
+ //! Static member used for converting between coordinate system
+ static QPointF relQtToGLE(double qtX, double qtY, double dpi);
+ //! Static member used for converting between coordinate system
+ static QPointF relQtToGLE(QPointF qt, double dpi);
+ //! Static member used for converting between coordinate system
+ static QSizeF relQtToGLE(QSizeF qt, double dpi);
+ //! Static member used for converting individual relative numbers
+ static double relQtToGLE(double qt, double dpi);
+ //! Static member used for type converting Qt points to GLEPoints
+ static GLEPoint QPointFToGLEPoint(const QPointF& pt);
+ //! Static member used for type converting GLEPoints to Qt points
+ static QPointF GLEPointToQPointF(const GLEPoint& pt);
+ //! Static member used for converting from GLE coordinates to a GLE coordinate string
+ static QString GLEToStr(QPointF gle);
+ //! Static member used for converting from GLE coordinates to a GLE coordinate string
+ static QString GLEToStr(double gleX, double gleY);
+ //! Static member used for converting from GLE distance to a GLE string
+ static QString GLEToStr(double gle);
+ //! Static member used for cropping extra zeros from a QString
+ static QString ZeroCrop(QString str);
+
+ //! Static member used for rotating coordinates
+ static QPointF parkTransform(QPointF original, double angle);
+
+ //! Static member used for rotating coordinates about a point
+ static QPointF rotateAboutPoint(QPointF original, double angle, QPointF basePoint);
+
+ //! Static member used for conversion between radians and degrees
+ static double radiansToDegrees(double rads);
+ //! Static member used for conversion between radians and degrees
+ static double degreesToRadians(double degrees);
+
+ //! Static member used to compute the minimum of two double values
+ static double min(double a, double b);
+ //! Static member comverting from centimeters to PostScript points
+ static double cmToPt(double cm);
+ //! Static member used to compute the DPI value based on the display and image size (in cm)
+ static int computeAutoScaleDPIFromCm(const QSize& bitmapSize, int inset, double imgWd, double imgHi);
+ //! Static member used to compute the DPI value based on the display and image size (in pt)
+ static int computeAutoScaleDPIFromPts(const QSize& bitmapSize, int inset, double bbWd, double bbHi);
+
+ //! Static member used for finding the distance between two points
+ static double distance(QPointF one, QPointF two);
+ //! Static member used for finding the distance between two points
+ static double distance(double x, double y, QPointF two);
+
+ //! Static member used for finding the angle between two points
+ static double angleBetweenTwoPoints(QPointF one, QPointF two);
+
+ //! Static member used to give OS dependent file regular expression
+ static QRegExp fileRegExp();
+
+ //! Static member providing the GS lib file name
+ static QString gsLibFileName();
+
+ //! Static member providing the GS lib filter
+ static QString libraryFilter();
+
+ //! Static member providing the GLE file name
+ static QString gleExecutableName();
+
+ //! Static member providing a filter for executables
+ static QString executableFilter();
+
+ //! Static member to enable a button if it is not null
+ static void setEnabled(QPushButton* button, bool enable);
+
+ //! Static member to draw a box around a point
+ static void drawBox(QPainter *p, QPointF origin, double half_size, QPen pen);
+
+ //! Static member to fill a box
+ static void fillBox(QPainter *p, QPointF origin, int half_size, const QBrush& brush);
+
+ //! Static member to draw a rotating handle around a point
+ static void drawRotator(QPainter *p, QPointF origin, int corner, double half_size, QPen pen);
+
+ //! Static member to draw a line with arrows at the ends
+ static void drawArrowLine(QPainter *p, qreal x0, qreal y0, qreal x1, qreal y1, qreal size, qreal angle, bool a0, bool a1, const QPen& pen);
+
+ //! Static member to draw a scale handle around a point
+ static void drawScaleHandle(QPainter *p, QPointF origin, int dx, int dy, double half_size, QPen pen);
+
+ //! Static member to draw a cross at a point
+ static void drawCross(QPainter *p, QPointF origin, double half_size, QPen pen);
+
+ //! Static member to draw the perpendicular snap mark
+ static void drawPerpMark(QPainter *p, QPointF origin, QPen pen);
+
+ //! Static member to draw the tangent snap mark
+ static void drawTangentMark(QPainter *p, QPointF origin, QPen pen);
+
+ //! Static member to draw an intersection mark
+ static void drawIntersectMark(QPainter *p, QPointF origin, QPen pen);
+
+ //! Static member to draw OSnaps
+ static void drawOSnap(QPainter *p, QPair<QPointF, int> snap);
+
+ //! Static member to draw OSnaps
+ static void drawOSnap(QPainter *p, QPointF snap, int type);
+
+ //! Static member to decide whether numbers are in order (either way round)
+ static bool inOrder(double x, double y, double z);
+
+ //! Static member to convert from Qt Colours to GLE Colours
+ static QString colourQtToGLE(QColor colour);
+
+ static QString getFileNameExtension(const QString& name);
+
+ static bool isGraphicsExtension(const QString& name);
+
+ static QString addFileNameExtension(const QString& name, const char* ext);
+
+ static void ensureFileNameExtension(QString* str, const char* ext);
+
+ static QPen osnapLinePen();
+ static QPen otrackLinePen();
+ static QPen osnapPen();
+ static QPen handlePen();
+
+ enum SnapTypes
+ {
+ EndPointSnap,
+ MidPointSnap,
+ QuadrantSnap,
+ CentreSnap,
+ TangentSnap,
+ IntersectSnap,
+ PerpendicularSnap,
+ NearestPointSnap
+ };
+
+ enum ScaleMethods
+ {
+ ProportionalScale,
+ HorizontalScale,
+ VerticalScale
+ };
+
+ static QPointF calculateScaleRatios(QPointF basePoint, QPointF startPoint, QPointF endPoint, int method);
+
+};
+
+#endif
diff --git a/src/gui/qgs.cpp b/src/gui/qgs.cpp
new file mode 100644
index 0000000..4fb1f90
--- /dev/null
+++ b/src/gui/qgs.cpp
@@ -0,0 +1,676 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Piotr Szymanski <niedakh at gmail.com> *
+ * *
+ * This library is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU Lesser General Public *
+ * License as published by the Free Software Foundation; either *
+ * version 2.1 of the License, or (at your option) any later version. *
+ * *
+ * This library is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this library; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, *
+ * MA 02110-1301 USA *
+ ***************************************************************************/
+
+#include "qgs.h"
+#include <math.h>
+
+#define MINIMUM(a, b) ((a) < (b) ? (a) : (b))
+
+GSInterpreterLib* g_GSInterpreterLib = NULL;
+
+namespace GSApiWrapper
+{
+
+int GSDLLCALL handleStdin(void *, char *, int)
+{
+ return 0;
+}
+
+int GSDLLCALL handleStdout(void *, const char *str, int len)
+{
+ if (g_GSInterpreterLib != NULL) {
+ return g_GSInterpreterLib->gs_output(str,len);
+ }
+ return 0;
+}
+
+int GSDLLCALL handleStderr(void *, const char *str, int len)
+{
+ if (g_GSInterpreterLib != NULL) {
+ return g_GSInterpreterLib->gs_error(str,len);
+ }
+ return 0;
+}
+
+int open(void*, void*)
+{
+ return 0;
+}
+
+int preclose(void *, void *)
+{
+ return 0;
+}
+
+int close(void *, void *)
+{
+ return 0;
+}
+
+
+int presize(void *, void * device, int width, int height,
+ int raster, unsigned int format)
+{
+ if (g_GSInterpreterLib != NULL) {
+ return g_GSInterpreterLib->presize(device, width, height, raster, format);
+ }
+ return 0;
+}
+
+int size(void *, void *device, int width, int height, int raster, unsigned int format, unsigned char *pimage)
+{
+ if (g_GSInterpreterLib != NULL) {
+ return g_GSInterpreterLib->size(device, width, height, raster, format, pimage);
+ }
+ return 0;
+}
+
+int sync(void*, void*)
+{
+ return 0;
+}
+
+int page(void *, void * device, int copies, int flush)
+{
+ if (g_GSInterpreterLib != NULL) {
+ return g_GSInterpreterLib->page(device, copies, flush);
+ }
+ return 0;
+}
+
+int update(void*, void *, int, int, int, int)
+{
+ return 0;
+}
+
+int separation(void*, void*, int, const char*, unsigned short, unsigned short, unsigned short, unsigned short)
+{
+ return 0;
+}
+
+#ifdef QGS_USE_MAJOR_V2
+
+// Newer versions of GhostScript support "separation", but we don't need this
+
+typedef display_callback display_callback_qgs;
+display_callback_qgs device = {
+ sizeof ( display_callback_qgs ),
+ DISPLAY_VERSION_MAJOR,
+ DISPLAY_VERSION_MINOR,
+ &open,
+ &preclose,
+ &close,
+ &presize,
+ &size,
+ &sync,
+ &page,
+ &update,
+ NULL,
+ NULL,
+ &separation
+};
+
+#else
+
+// For now use older version of structure, which is compatible with GhostScript 8.15
+// This version is shipped with Fedora Core 5
+
+typedef struct display_callback_v1_s display_callback_qgs;
+
+display_callback_qgs device = {
+ sizeof ( display_callback_qgs ),
+ DISPLAY_VERSION_MAJOR_V1,
+ DISPLAY_VERSION_MINOR_V1,
+ &open,
+ &preclose,
+ &close,
+ &presize,
+ &size,
+ &sync,
+ &page,
+ &update,
+ NULL,
+ NULL
+};
+#endif
+
+}
+
+/********* GSInterpreterLib ************/
+
+GSInterpreterLib::GSInterpreterLib() :
+ m_running(false),
+ m_cnvmode(QGS_DISPLAY_32),
+ m_alpha(false),
+ m_conv(NULL),
+ m_orientation(0),
+ m_magnify(1.0),
+ m_width(0),
+ m_height(0),
+ m_dpi(100.0),
+ m_media(QString::null),
+ m_Gwidth(0),
+ m_Gheight(0),
+ m_imageChar(0),
+ m_format(0),
+ m_raster(0),
+ m_textaa(1),
+ m_graphaa(1),
+ m_pfonts(true),
+ m_display(true),
+ m_wasSize(false),
+ m_wasPage(false),
+ m_argsCCount(0),
+ m_argsChar(0)
+{
+ m_gs = GSLibFunctions::getInstance();
+ if (!m_gs->isLoaded()) return;
+ int exit = m_gs->gsapi_new_instance(&ghostScriptInstance, this);
+ if (exit && !handleExit(exit)) return;
+ if (m_gs->getVersionMajor() < 8) {
+ /* 32 bit does not work with GhostView 7.04 */
+ m_cnvmode = QGS_DISPLAY_24;
+ }
+ g_GSInterpreterLib = this;
+}
+
+GSInterpreterLib::~GSInterpreterLib()
+{
+ if (running()) m_gs->gsapi_exit(ghostScriptInstance);
+ if (m_argsChar)
+ {
+ for (int i=0;i<m_argsCCount;i++) delete [] *(m_argsChar+i);
+ delete [] m_argsChar;
+ }
+ if (m_gs->isLoaded()) m_gs->gsapi_delete_instance(ghostScriptInstance);
+ if (m_conv != NULL) delete[] m_conv;
+}
+
+// interpreter state functions
+
+bool GSInterpreterLib::start(bool setStdio)
+{
+ if ( setStdio )
+ {
+ m_gs->gsapi_set_stdio(ghostScriptInstance, &(GSApiWrapper::handleStdin),
+ &(GSApiWrapper::handleStdout),
+ &(GSApiWrapper::handleStderr));
+ }
+ int call = m_gs->gsapi_set_display_callback(ghostScriptInstance, (display_callback*)(&(GSApiWrapper::device)));
+ if (call && !handleExit(call)) return false;
+ argsToChar();
+ call = m_gs->gsapi_init_with_args(ghostScriptInstance, m_argsCCount, m_argsChar);
+ if (call && !handleExit(call)) return false;
+ QString set;
+ set.sprintf("<< /Orientation %d >> setpagedevice .locksafe",m_orientation);
+ QByteArray strdata = set.toLatin1();
+ m_gs->gsapi_run_string_with_length(ghostScriptInstance, strdata.constData(), set.length(), 0, &call);
+ m_running = handleExit (call);
+ return m_running;
+}
+
+bool GSInterpreterLib::stop()
+{
+ if (m_running)
+ {
+ int exit = m_gs->gsapi_exit(ghostScriptInstance);
+ if (exit) handleExit(exit);
+ m_running = false;
+ }
+ return m_running;
+}
+
+// set options
+void GSInterpreterLib::setGhostscriptArguments(const QStringList &list)
+{
+ if ( m_args != list )
+ {
+ m_args=list;
+ stop();
+ }
+}
+
+void GSInterpreterLib::setOrientation( int orientation )
+{
+ if( m_orientation != orientation )
+ {
+ m_orientation = orientation;
+ stop();
+ }
+}
+
+void GSInterpreterLib::setMagnify( double magnify )
+{
+ if( m_magnify != magnify )
+ {
+ m_magnify = magnify;
+ stop();
+ }
+}
+
+void GSInterpreterLib::setMedia( const QString &media )
+{
+ if( m_media != media )
+ {
+ m_media = media;
+ stop();
+ }
+}
+
+void GSInterpreterLib::setSize( int w, int h )
+{
+ if ( m_width != w )
+ {
+ m_width=w;
+ stop();
+ }
+ if ( m_height != h )
+ {
+ m_height=h;
+ stop();
+ }
+}
+
+void GSInterpreterLib::setDPI( double dpi )
+{
+ if ( m_dpi != dpi )
+ {
+ m_dpi=dpi;
+ stop();
+ }
+}
+
+void GSInterpreterLib::setDisplay( bool display )
+{
+ if( m_display != display )
+ {
+ m_display = display;
+ stop();
+ }
+}
+
+void GSInterpreterLib::setAlpha( bool alpha )
+{
+ m_alpha = alpha;
+}
+
+void GSInterpreterLib::setPlatformFonts( bool pfonts )
+{
+ if( m_pfonts != pfonts )
+ {
+ m_pfonts = pfonts;
+ stop();
+ }
+}
+
+void GSInterpreterLib::setAABits(int text, int graphics )
+{
+ if( m_textaa != text )
+ {
+ m_textaa = text;
+ stop();
+ }
+ if( m_graphaa != graphics )
+ {
+ m_graphaa = graphics;
+ stop();
+ }
+}
+
+
+void GSInterpreterLib::setBuffered( bool buffered )
+{
+ if( m_buffered != buffered ) m_buffered = buffered;
+}
+
+void GSInterpreterLib::setOrigin(double ox, double oy)
+{
+ m_OriginX = ox;
+ m_OriginY = oy;
+}
+
+QString GSInterpreterLib::getOutpuStreamText()
+{
+ return m_Output;
+}
+
+bool GSInterpreterLib::sendOriginTranslate()
+{
+ if (m_OriginX != 0.0 || m_OriginY != 0.0) {
+ // Add a translate if bounding box not at origin zero (to support LaTeX processed output)
+ int exit_code;
+ QString str = QString("%1 %2 translate\n").arg(-m_OriginX).arg(-m_OriginY);
+ QByteArray strdata = str.toLatin1();
+ m_gs->gsapi_run_string_continue(ghostScriptInstance, strdata.constData(), str.length(), 0, &exit_code);
+ if (exit_code && !handleExit(exit_code)) return false;
+ }
+ return true;
+}
+
+bool GSInterpreterLib::run(QFile& file)
+{
+ int exit_code;
+ char buf[4096];
+ if (!m_gs->isLoaded()) return false;
+ if (!running()) start();
+ m_wasPage = false;
+ m_gs->gsapi_run_string_begin(ghostScriptInstance, 0, &exit_code);
+ if (exit_code && !handleExit(exit_code)) return false;
+ if (!sendOriginTranslate()) return false;
+ while (true) {
+ qint64 nbRead = file.read(buf, sizeof(buf)-1);
+ if (nbRead <= 0) {
+ // Make sure to exit if nothing more in file
+ break;
+ }
+ buf[nbRead] = 0;
+ m_gs->gsapi_run_string_continue(ghostScriptInstance, buf, nbRead, 0, &exit_code);
+ if (exit_code && !handleExit(exit_code)) return false;
+ }
+ m_gs->gsapi_run_string_end(ghostScriptInstance, 0, &exit_code);
+ if (exit_code && !handleExit(exit_code)) return false;
+ return true;
+}
+
+bool GSInterpreterLib::run(const string* data)
+{
+ int exit_code;
+ if (!m_gs->isLoaded()) return false;
+ if (!running()) start();
+ m_wasPage = false;
+ m_gs->gsapi_run_string_begin(ghostScriptInstance, 0, &exit_code);
+ if (exit_code && !handleExit(exit_code)) return false;
+ if (!sendOriginTranslate()) return false;
+ unsigned int toRead = data->size();
+ unsigned int offset = 0;
+ while (toRead > 0)
+ {
+ unsigned int maxSize = 64000;
+ unsigned int readNow = std::min(toRead, maxSize);
+ m_gs->gsapi_run_string_continue(ghostScriptInstance, data->data() + offset, readNow, 0, &exit_code);
+ if (exit_code && !handleExit(exit_code)) return false;
+ offset += readNow;
+ toRead -= readNow;
+ }
+ m_gs->gsapi_run_string_end(ghostScriptInstance, 0, &exit_code);
+ if (exit_code && !handleExit(exit_code)) return false;
+ return true;
+}
+
+bool GSInterpreterLib::startRender()
+{
+ int exit_code = 0;
+ if (!m_gs->isLoaded()) return false;
+ if (!running()) start();
+ m_wasPage = false;
+ m_gs->gsapi_run_string_begin(ghostScriptInstance, 0, &exit_code);
+ if (exit_code && !handleExit(exit_code)) return false;
+ else return true;
+}
+
+bool GSInterpreterLib::nextRender(const char* str)
+{
+ int exit_code = 0;
+ m_gs->gsapi_run_string_continue(ghostScriptInstance, str, strlen(str), 0, &exit_code);
+ if (exit_code && !handleExit(exit_code)) return false;
+ else return true;
+}
+
+bool GSInterpreterLib::endRender()
+{
+ int exit_code = 0;
+ m_gs->gsapi_run_string_end(ghostScriptInstance, 0, &exit_code);
+ if (exit_code && !handleExit(exit_code)) return false;
+ else return true;
+}
+
+int GSInterpreterLib::gs_output(const char* buffer, int len)
+{
+ m_Output.append(QString::fromLocal8Bit(buffer, len));
+ return len;
+}
+
+int GSInterpreterLib::gs_error(const char* buffer, int len)
+{
+ m_Output.append(QString::fromLocal8Bit(buffer, len));
+ return len;
+}
+
+int GSInterpreterLib::presize(void * /* device*/, int width, int height, int raster, unsigned int format)
+{
+ m_Gwidth=width;
+ m_Gheight=height;
+ m_raster=raster;
+ m_format=format;
+ return 0;
+}
+
+int GSInterpreterLib::size(void * /* device*/, int /* wd */, int /* hi*/, int /*raster*/, unsigned int /*format*/, unsigned char *pimage)
+{
+ m_wasSize = true;
+ m_imageChar = pimage;
+ return 0;
+}
+
+int GSInterpreterLib::page(void * /* device*/, int /* copies*/, int /* flush*/)
+{
+ m_wasPage=true;
+ // assume the image given by the gs is of the requested widthxheight
+ if (m_cnvmode == QGS_DISPLAY_24) {
+ int dest = 0;
+ if (m_conv != NULL) delete[] m_conv;
+ m_conv = new unsigned char[m_Gwidth*m_Gheight*4];
+ for (int j = 0; j < m_Gheight; j++) {
+ int src = j * m_raster;
+ if (m_alpha) {
+ for (int i = 0; i < m_Gwidth; i++) {
+ unsigned char red = m_conv[dest++] = m_imageChar[src++];
+ unsigned char green = m_conv[dest++] = m_imageChar[src++];
+ unsigned char blue = m_conv[dest++] = m_imageChar[src++];
+ if (red == 0xFF && green == 0xFF && blue == 0xFF) {
+ m_conv[dest++] = 0;
+ } else {
+ m_conv[dest++] = 0xFF;
+ }
+ }
+ } else {
+ for (int i = 0; i < m_Gwidth; i++) {
+ m_conv[dest++] = m_imageChar[src++];
+ m_conv[dest++] = m_imageChar[src++];
+ m_conv[dest++] = m_imageChar[src++];
+ m_conv[dest++] = 0;
+ }
+ }
+ }
+ if (m_alpha) {
+ QImage image(m_conv, m_Gwidth, m_Gheight, QImage::Format_ARGB32);
+ m_img = image.copy();
+ } else {
+ QImage image(m_conv, m_Gwidth, m_Gheight, QImage::Format_RGB32);
+ m_img = image.copy();
+ }
+ } else {
+ if (m_alpha) {
+ int dest = 0;
+ for (int j = 0; j < m_Gheight; j++) {
+ int src = j * m_raster;
+ for (int i = 0; i < m_Gwidth; i++) {
+ unsigned char red = m_imageChar[dest++] = m_imageChar[src++];
+ unsigned char green = m_imageChar[dest++] = m_imageChar[src++];
+ unsigned char blue = m_imageChar[dest++] = m_imageChar[src++];
+ if (red == 0xFF && green == 0xFF && blue == 0xFF) {
+ m_imageChar[dest++] = 0x0;
+ } else {
+ m_imageChar[dest++] = 0xFF;
+ }
+ src++;
+ }
+ }
+ QImage image(m_imageChar, m_Gwidth, m_Gheight, QImage::Format_ARGB32);
+ m_img = image.copy();
+ } else {
+ if (m_raster != 4*m_Gwidth) {
+ int dest = 0;
+ for (int j = 0; j < m_Gheight; j++) {
+ int src = j * m_raster;
+ for (int i = 0; i < m_Gwidth; i++) {
+ m_imageChar[dest++] = m_imageChar[src++];
+ m_imageChar[dest++] = m_imageChar[src++];
+ m_imageChar[dest++] = m_imageChar[src++];
+ m_imageChar[dest++] = 0;
+ src++;
+ }
+ }
+ }
+ QImage image(m_imageChar, m_Gwidth, m_Gheight, QImage::Format_RGB32);
+ m_img = image.copy();
+ }
+ }
+ return 0;
+}
+
+const QImage& GSInterpreterLib::getImage() {
+ return m_img;
+}
+
+bool GSInterpreterLib::handleExit(int code)
+{
+ // qWarning("Got code %d",code);
+ if ( code>=0 )
+ return true;
+ else if ( code <= -100 )
+ {
+ switch (code)
+ {
+ case e_Fatal:
+ m_error.setError(e_Fatal, "fatal internal error");
+ return false;
+ case e_ExecStackUnderflow:
+ m_error.setError(e_ExecStackUnderflow, "stack overflow");
+ return false;
+ // no error or not important
+ case e_Quit:
+ case e_Info:
+ case e_InterpreterExit:
+ case e_RemapColor:
+ case e_NeedInput:
+ case e_NeedStdin:
+ case e_NeedStdout:
+ case e_NeedStderr:
+ case e_VMreclaim:
+ default:
+ return true;
+ }
+ }
+ else
+ {
+ const char* errors[]= { "", ERROR_NAMES };
+ m_error.setError(code, errors[-code]);
+ return false;
+ }
+}
+
+void GSInterpreterLib::argsToChar()
+{
+ if (m_argsChar)
+ {
+ for (int i=0;i<m_argsCCount;i++) delete [] *(m_argsChar+i);
+ delete [] m_argsChar;
+ }
+ QStringList internalArgs;
+ if (m_args.isEmpty())
+ {
+ internalArgs << "-dMaxBitmap=10000000";
+ #ifdef Q_WS_MAC
+ int fwpos = m_gs->libGSLocation().lastIndexOf(QString(".framework"));
+ // If the Ghostscript framework is not installed in a default location it won't find its resources and fonts
+ if (fwpos != -1) {
+ QString path = m_gs->libGSLocation().left(fwpos+10);
+ internalArgs << QString("-I%1/Resources/lib").arg(path);
+ internalArgs << QString("-I%1/Resources/fonts").arg(path);
+ }
+ #endif
+ internalArgs << "-dDELAYSAFER";
+ internalArgs << "-dNOPAUSE";
+ internalArgs << "-dNOPAGEPROMPT";
+ internalArgs << QString("-r%1").arg(m_dpi);
+ internalArgs << QString("-g%1x%2").arg(m_width).arg(m_height);
+ internalArgs << QString("-dDisplayResolution=%1").arg(m_dpi);
+ internalArgs << QString("-dTextAlphaBits=%1").arg(m_textaa);
+ internalArgs << QString("-dGraphicsAlphaBits=%1").arg(m_graphaa);
+ if ( !m_pfonts ) internalArgs << "-dNOPLATFONTS";
+ }
+ else
+ {
+ internalArgs = m_args;
+ }
+
+ if (m_display)
+ {
+ int format = DISPLAY_COLORS_RGB | DISPLAY_DEPTH_8 | DISPLAY_LITTLEENDIAN | DISPLAY_TOPFIRST;
+ if (m_cnvmode == QGS_DISPLAY_32) {
+ if (m_alpha) {
+ // GhostScript does not support ALPHA channel
+ // format |= DISPLAY_ALPHA_LAST;
+ format |= DISPLAY_UNUSED_LAST;
+ } else {
+ format |= DISPLAY_UNUSED_LAST;
+ }
+ }
+ internalArgs << "-sDEVICE=display";
+ internalArgs << QString().sprintf("-dDisplayFormat=%d", format);
+ }
+
+ int t=internalArgs.count();
+ char ** args=static_cast <char**> (new char* [t]);
+ for (int i=0;i<t;i++)
+ {
+ *(args+i)=new char [internalArgs[i].length()+1];
+ qstrcpy (*(args+i),internalArgs[i].toLocal8Bit());
+ }
+ m_argsChar=args;
+ m_argsCCount=t;
+}
+
+bool GSInterpreterLib::hasError()
+{
+ return m_error.hasError();
+}
+
+const GSError& GSInterpreterLib::getError()
+{
+ return m_error;
+}
+
+GSError::GSError()
+{
+ m_code = 0;
+ m_haserr = false;
+}
+
+GSError::~GSError()
+{
+}
+
+void GSError::setError(int code, QString msg)
+{
+ m_code = code;
+ m_name = msg;
+ m_haserr = true;
+}
diff --git a/src/gui/qgs.h b/src/gui/qgs.h
new file mode 100644
index 0000000..883743c
--- /dev/null
+++ b/src/gui/qgs.h
@@ -0,0 +1,367 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Piotr Szymanski <niedakh at gmail.com> *
+ * *
+ * This library is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU Lesser General Public *
+ * License as published by the Free Software Foundation; either *
+ * version 2.1 of the License, or (at your option) any later version. *
+ * *
+ * This library is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this library; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, *
+ * MA 02110-1301 USA *
+ ***************************************************************************/
+
+#ifndef _GSINTERPETERLIB_H_
+#define _GSINTERPETERLIB_H_
+
+#include <QtGui>
+#include <QtDebug>
+
+#define GSDLLEXPORT
+#ifdef Q_WS_WIN
+ #define _Windows
+#else
+ #define GSDLLAPI
+ #define GSDLLCALL
+#endif
+
+#include "gsinc/iapi.h"
+#include "gsinc/gdevdsp.h"
+#include "gsinc/ierrors.h"
+
+#include <iostream>
+
+#define QGS_DISPLAY_32 0
+#define QGS_DISPLAY_24 1
+
+using namespace std;
+
+/** @namespace GSApiWrapper Namespace containing the callback functions for communication with
+ the ghostscript library.
+*/
+namespace GSApiWrapper
+{
+ int open(void* /*handle*/, void* /*device */ );
+ int preclose(void* /*handle*/, void * /* device */ );
+ int close(void* /*handle*/, void * /* device */ );
+ int presize(void* /*handle*/, void * /* device*/, int /* width*/, int /* height*/, int /* raster*/, unsigned int /* format */);
+ int sync(void* /*handle*/, void * /* device */ );
+ int separation(void* /*handle*/, void * /* device*/, int /* comp_num*/,
+ const char * /* name*/, unsigned short /* c*/, unsigned short /* m*/,
+ unsigned short /* y*/, unsigned short /* k*/);
+ int GSDLLCALL handleStdin (void* /*handle*/, char* buffer, int len );
+ int GSDLLCALL handleStdout(void* /*handle*/, const char* buffer, int len );
+ int GSDLLCALL handleStderr (void* /*handle*/, const char* buffer, int len );
+ int update(void* /*handle*/, void * /* device*/, int /* x*/, int /* y*/, int /* w*/, int /* h*/);
+ int size(void* /*handle*/, void * /* device*/, int width, int height, int raster, unsigned int format, unsigned char *pimage);
+ int page(void* /*handle*/, void * /* device*/, int /* copies*/, int /* flush*/);
+};
+
+class GSError {
+public:
+ QString m_name; //! the description of an error
+ int m_code; //! the error code
+ bool m_haserr;
+public:
+ GSError();
+ ~GSError();
+ void setError(int code, QString msg);
+ inline const QString& getName() const { return m_name; }
+ inline int getCode() const { return m_code; }
+ inline bool hasError() const { return m_haserr; }
+ inline void clear() { m_haserr = false; }
+};
+
+class GSLibFunctions {
+protected:
+ QString m_LibGSLocation;
+#ifdef Q_WS_WIN
+ HINSTANCE hmodule;
+#else
+ void* hmodule;
+#endif
+public:
+ PFN_gsapi_revision gsapi_revision;
+ PFN_gsapi_new_instance gsapi_new_instance;
+ PFN_gsapi_delete_instance gsapi_delete_instance;
+ PFN_gsapi_set_stdio gsapi_set_stdio;
+ PFN_gsapi_set_poll gsapi_set_poll;
+ PFN_gsapi_set_display_callback gsapi_set_display_callback;
+ PFN_gsapi_init_with_args gsapi_init_with_args;
+ PFN_gsapi_run_string gsapi_run_string;
+ PFN_gsapi_run_string_with_length gsapi_run_string_with_length;
+ PFN_gsapi_run_string_begin gsapi_run_string_begin;
+ PFN_gsapi_run_string_continue gsapi_run_string_continue;
+ PFN_gsapi_run_string_end gsapi_run_string_end;
+ PFN_gsapi_exit gsapi_exit;
+public:
+ GSLibFunctions();
+ ~GSLibFunctions();
+ static GSLibFunctions* getInstance();
+ int loadLibrary(const QString& location, QString& last_error);
+ void freeLibrary();
+ void resetFunctions();
+ bool isLoaded();
+ void tryLocation(const char* str);
+ void tryLocationLoop(const char* prefix);
+ QString getVersion();
+ int getVersionMajor();
+ static void StripWhiteSpace(QString& str);
+ inline const QString& libGSLocation() { return m_LibGSLocation; }
+};
+
+/** \class GSInterpreterLib
+ @brief The Qt Ghostscript library wrapper
+ The idea of this library is to provide a comfortable way of using
+ the Ghostscript library without the need of going through its C API.
+
+ Please check the examples to see how to use the Ghostscript library to render graphics
+ and how to use it like you would use Ghostscript for converting between formats.
+*/
+
+class GSInterpreterLib : public QObject
+{
+ Q_OBJECT
+protected:
+ GSLibFunctions* m_gs;
+ double m_OriginX;
+ double m_OriginY;
+public:
+ //! @enum MessageType information about the type of stdio communication in the io signal
+ enum MessageType{
+ Input /*!< stdin information, ghostscript wants to read sth from stdin.
+ Should not happen in this class, but if you subclass it, make sure to handle possible
+ stdin requests. Ghostscript library reads from stdin rarely. */,
+ Output /*!< stdout message, Ghostscript library wrote to stdout */ ,
+ Error /*!< stderr message, Ghostscript library wrote to stderr*/};
+
+ //! @typedef a QPair which first element is the beginning of a block in the file while the second is the end
+ typedef QPair<unsigned long , unsigned long > Position;
+
+ //! @exception GSerror this exception gets thrown when Ghostscript library reports a critical error
+
+ //! Creates an instance of Ghostscript library
+ GSInterpreterLib();
+ //! Destroys the instance of Ghostscript library, nothing to cleanup afterwards
+ ~GSInterpreterLib();
+ /** @brief Starts the Ghostscript library interpreter
+ Starts the Ghostscript instance, sets the arguments, which default
+ consist of papersize, antialiasing options, orientation, resolution,
+ and platform fonts usage. The default options are not set directly by
+ the developer, but are prepared from the data the developer set using
+ relevant methods.
+
+ In case the user used setGhostscriptArguments, those arguments are used
+ instead of the default ones, useful when you need to use Ghostscript for
+ noninteractive (no pixmaps generated) work, like converting from ps to pdf.
+
+ The default values should be used when you need to normally display a file
+ and you need images of the pages.
+
+ Also this functions takes care of catching stdio communication if selected.
+ As a result the stdio communication with Ghostscript takes place via the IO
+ signal. Please note that stdio is different then communication with Ghostscript
+ interpreter. In short, you will never need stdin and you can read stdout and
+ stderror using the IO signal.
+ @param setStdio enable catching the stdio communication
+ */
+ bool start(bool setStdio=true);
+ /** @brief Stops the Ghostscript instance if running (but does not delete it) */
+ bool stop();
+ //! @return Returns true if it library is already working on a page request
+ //! @return Returns true if it library is ready to receive a new page request using the run function
+ //! @return Returns true if Ghostscript interpreter is running
+ bool running () { return m_running; } ;
+
+ /** @brief Sends file data to Ghostscript library
+ This functions takes care of putting the file's contents in the Ghostscript library.
+ Parsing a file
+ @param file a pointer to the FILE structure used by fread to send information to Ghostscript
+ @param pos the beginning and ending of the data block in the file (usually the position of the page in file)
+ @param sync whether to expect an image generated from the content specified by pos
+ */
+ bool run(QFile& file);
+ bool run(const string* data);
+
+ bool startRender();
+ bool nextRender(const char* str);
+ bool endRender();
+
+ bool hasError();
+
+ const GSError& getError();
+
+ /** @brief Enables progressive updating of the image
+ Enabling progressive updating means, that before Finished() is emitted, Updated() signals
+ are emmitted with the area that was updated. If disabled (by default disabled),
+ @param progr enable/disable progressive updating
+ */
+ void setGhostscriptArguments( const QStringList &list );
+
+ /** @brief Enable display setting
+ This should be set to true if you are using the intepreter to render pages or in any way
+ need a display device in your use of the Ghostscript library. If you do not need it
+ (ex. you are just converting ps to pdf) set it to false.
+ @param display enable/disable the display device
+ */
+ void setDisplay( bool display = true);
+
+ void setAlpha( bool alpha );
+
+ /** @brief Sets orientation of the document
+ @param orientation the orientation of the page - 0 for 0 degrees, 1 for 90 etc.
+ */
+ void setOrientation( int orientation );
+
+ /** @brief Sets size of the page in pixels
+ @param w width
+ @param h height
+ */
+ void setSize( int w, int h );
+
+ /** @brief Sets the resolution of the image
+ */
+ void setDPI(double dpi);
+
+ /** @brief Enables buffering of stdout/stderr
+ If buffered, all the output will be stored in a QString buffer and will be accessible by
+ IObuffer() function. The io() signal will be emitted nevertheless.
+ @param buffered Buffering enabled if true
+ */
+ void setBuffered( bool buffered );
+
+ /** @brief Sets the magnification of the page (
+ @param magnify a magnification value (floating point, 0.35 means 35% of the real size)
+ */
+ void setMagnify( double magnify );
+
+ /** @brief Sets the paper size/format of the document
+ @param media string containing a valid Ghostscript papersize
+ */
+ void setMedia (const QString &media) ;
+
+ /** @brief Sets the number of bits used for antialiasing
+ The number of bits for antialiasing, 1 disables.
+ @param text number of text antialiasing bits (4 is recommended for good quality and still fast antialiasing)
+ @param graphics number of graphics antialiasing bits (2 is recommended for good quality and still fast antialiasing)
+ */
+ void setAABits(int text=1, int graphics=1);
+
+ /** @brief Enables or disables platform fonts
+ @param pfonts decides whether Ghostscript library should use the fonts available in the system (true) or only the ones embedded in the document (false), by default true
+ */
+ void setPlatformFonts(bool pfonts=true);
+
+ const QImage& getImage();
+
+ void setOrigin(double ox, double oy);
+
+ //! @brief Returns the IO buffer
+ const QString& IOBuffer() { return m_buffer;};
+
+ QString getOutpuStreamText();
+
+private:
+ bool sendOriginTranslate();
+
+protected:
+ /**
+ @brief Describing how stuff works
+ Ghostscript will do callbacks after it is started and as also as it receives content to render.
+ First open will be called upon opening the device.
+ Second there will be a presize with information about the size, here we allocate the QImage;
+ Third there will be an update called with the whole page, we must ignore it, as it was called
+ before size was.
+ Fourth the size will be called with the pointer to our image.
+ Fifth a series of update will be called with coordinates to update, not width is the width
+ and not x+width, you need to add the x manually.
+ Sixth there will a page called which tells you that rendering is done.
+ Seventh a sync after the page tells you everything is finished.
+ If closing, preclose will appear before close.
+ */
+ // handling communication with libgs
+ int presize(void * /* device*/, int /* width*/, int /* height*/,
+ int /* raster*/, unsigned int /* format */);
+ int gs_output ( const char* buffer, int len );
+ int gs_error ( const char* buffer, int len );
+ int size(void * /* device*/, int width, int height, int raster, unsigned int format, unsigned char *pimage);
+ int page(void * /* device*/, int /* copies*/, int /* flush*/);
+ //! Checks if code is an error code
+ //! @return returns true if no error, if non-critical error returns false, if critical error, throws GSerror
+ //! @throw GSerror throws GSerror if code is critical error
+ bool handleExit(int code);
+ // state bools
+ bool m_running; //! True if an instance is running
+ bool m_ready; //! True if not processing any data request in run()
+ int m_cnvmode;
+ bool m_alpha;
+ unsigned char* m_conv;
+
+ // Parameter holders
+ // Orientation of the page (a multiplicant of 90 degrees)
+ // additional info
+ int m_orientation; //! Holds the orientation of the page @sa setOrientation()
+ double m_magnify; //! Magnification @sa setMagnify()
+ // Size of the image we want to get
+ int m_width; //! Expected width of the image
+ int m_height; //! Expected height of the image
+ double m_dpi; //! Resolution
+ QString m_media; //! Papersize
+ int m_Gwidth; //! Width of the image buffer we received from Ghostscript library
+ int m_Gheight; //! Height of the image buffer we received from Ghostscript library
+ unsigned char * m_imageChar; //! Image buffer we received from Ghostscript library
+ unsigned int m_format; //! Format of the image stored in the buffer, if not changed in a subclass, it is 32bit RGBx
+ int m_raster; //! Size of a horizontal row (y-line) in the image buffer
+ int m_textaa; //! Number of bits used for text antialiasing @sa setAABits()
+ int m_graphaa; //! Number of bits used for graphics antialiasing @sa setAABits()
+ bool m_pfonts; //! True if platform fonts enabled @sa setPlatformFonts()
+ // toggle display setting
+ bool m_display; //! True if display usage enabled @sa setDisplay()
+ bool m_buffered; //! True if buffering stdout/stderr @sa setBuffered()
+ /** The following tell us if we are in a position to update in progressive rendering, from GS:
+ * The caller should not access the image buffer:
+ * - before the first sync
+ * - between presize and size
+ * - after preclose
+ */
+ bool m_wasSize; //! True if size() was called by the Ghostscript library and the image buffer was set
+ bool m_wasPage; //! True if page() was called by the Ghostscript library and the page rendering is finished
+
+ QImage m_img; //! Image on which we do the rendering
+ void *ghostScriptInstance; //! Pointer to the Ghostscript library instance
+
+ QString m_buffer; //! The IO buffer
+
+private:
+ void argsToChar();
+ int m_argsCCount;
+ char** m_argsChar;
+ QStringList m_args;
+ QStringList m_internalArgs;
+ GSError m_error;
+ QString m_Output;
+
+ friend int GSApiWrapper::open(void* /*handle*/,void* /*device */ );
+ friend int GSApiWrapper::preclose(void* /*handle*/, void * /* device */ );
+ friend int GSApiWrapper::close(void* /*handle*/, void * /* device */ );
+ friend int GSApiWrapper::presize(void* /*handle*/, void * /* device*/, int /* width*/, int /* height*/,
+ int /* raster*/, unsigned int /* format */);
+ friend int GSApiWrapper::sync(void* /*handle*/, void * /* device */ );
+ friend int GSApiWrapper::separation(void* /*handle*/, void * /* device*/, int /* comp_num*/,
+ const char * /* name*/, unsigned short /* c*/, unsigned short /* m*/,
+ unsigned short /* y*/, unsigned short /* k*/);
+ friend int GSApiWrapper::handleStdin(void* /*handle*/, char* buffer, int len );
+ friend int GSApiWrapper::handleStdout(void* /*handle*/, const char* buffer, int len );
+ friend int GSApiWrapper::handleStderr(void* /*handle*/, const char* buffer, int len );
+ friend int GSApiWrapper::update(void* /*handle*/, void * /* device*/, int /* x*/, int /* y*/, int /* w*/, int /* h*/);
+ friend int GSApiWrapper::size(void* /*handle*/, void * /* device*/, int width, int height, int raster, unsigned int format, unsigned char *pimage);
+ friend int GSApiWrapper::page(void* /*handle*/,void * /* device*/, int /* copies*/, int /* flush*/);
+};
+
+#endif
diff --git a/src/gui/qgslibloader.cpp b/src/gui/qgslibloader.cpp
new file mode 100644
index 0000000..65bc823
--- /dev/null
+++ b/src/gui/qgslibloader.cpp
@@ -0,0 +1,393 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+
+#include <QtGui>
+#include <QTextOStream>
+
+#include "qgs.h"
+#include "qgle_statics.h"
+
+#ifdef Q_WS_WIN
+ #include <windows.h>
+#endif
+
+#include <string>
+#include <sstream>
+
+GSLibFunctions* g_GSLibInstance = NULL;
+
+GSLibFunctions* GSLibFunctions::getInstance() {
+ if (g_GSLibInstance == NULL) {
+ g_GSLibInstance = new GSLibFunctions();
+ }
+ return g_GSLibInstance;
+}
+
+GSLibFunctions::GSLibFunctions() {
+ hmodule = NULL;
+ resetFunctions();
+}
+
+GSLibFunctions::~GSLibFunctions() {
+ freeLibrary();
+}
+
+QString GSLibFunctions::getVersion() {
+ gsapi_revision_t rv;
+ /* check DLL version */
+ if (gsapi_revision(&rv, sizeof(rv)) != 0) {
+ return "ERR";
+ } else {
+ int major = rv.revision / 100;
+ int minor = rv.revision % 100;
+ if (minor < 10) return QString("%1.0%2").arg(major).arg(minor);
+ else return QString("%1.%2").arg(major).arg(minor);
+ }
+}
+
+int GSLibFunctions::getVersionMajor() {
+ gsapi_revision_t rv;
+ /* check DLL version */
+ if (gsapi_revision(&rv, sizeof(rv)) != 0) {
+ return -1;
+ } else {
+ return rv.revision / 100;
+ }
+}
+
+void GSLibFunctions::resetFunctions() {
+ gsapi_revision = NULL;
+ gsapi_new_instance = NULL;
+ gsapi_delete_instance = NULL;
+ gsapi_init_with_args = NULL;
+ gsapi_run_string = NULL;
+ gsapi_run_string_with_length = NULL;
+ gsapi_run_string_begin = NULL;
+ gsapi_run_string_continue = NULL;
+ gsapi_run_string_end = NULL;
+ gsapi_exit = NULL;
+ gsapi_set_stdio = NULL;
+ gsapi_set_poll = NULL;
+ gsapi_set_display_callback = NULL;
+}
+
+bool GSLibFunctions::isLoaded() {
+ return gsapi_revision != NULL;
+}
+
+void GSLibFunctions::StripWhiteSpace(QString& str) {
+ while (str.size() > 0 && (str[str.size()-1] == ' ' ||
+ str[str.size()-1] == '\n' ||
+ str[str.size()-1] == '\r')) {
+ str.truncate(str.size()-1);
+ }
+}
+
+#ifdef Q_WS_WIN
+
+void GSLibFunctions::tryLocation(const char* str) {
+}
+
+int GSLibFunctions::loadLibrary(const QString& location, QString& last_error) {
+ gsapi_revision_t rv;
+ /* Try to open the library */
+ if (location == "") {
+ m_LibGSLocation = "gsdll32.dll";
+ hmodule = LoadLibrary((const WCHAR*)m_LibGSLocation.unicode());
+ } else {
+ m_LibGSLocation = location;
+ hmodule = LoadLibrary((const WCHAR*)m_LibGSLocation.unicode());
+ }
+ if (hmodule < (HINSTANCE)HINSTANCE_ERROR) {
+ /* Failed */
+ LPWSTR lpMsgBuf = NULL;
+ DWORD dwError = GetLastError();
+ if (FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, dwError,
+ 0, (LPWSTR) &lpMsgBuf, 0, NULL ) != 0) {
+ /* Error code known */
+ last_error.setUtf16((const ushort *)lpMsgBuf, wcslen(lpMsgBuf));
+ StripWhiteSpace(last_error);
+ if (last_error.endsWith(".")) last_error.truncate(last_error.size()-1);
+ LocalFree(lpMsgBuf);
+ } else {
+ /* Unknown error code */
+ last_error = QString("Code #%1").arg(dwError);
+ }
+ hmodule = (HINSTANCE)0;
+ if (dwError == ERROR_FILE_NOT_FOUND || dwError == ERROR_PATH_NOT_FOUND || dwError == ERROR_MOD_NOT_FOUND) return 2;
+ else return 1;
+ }
+ /* Get pointers to functions */
+ gsapi_revision = (PFN_gsapi_revision) GetProcAddress(hmodule, "gsapi_revision");
+ if (gsapi_revision == NULL) {
+ last_error = "Can't find gsapi_revision";
+ freeLibrary();
+ return 1;
+ }
+ /* check DLL version */
+ if (gsapi_revision(&rv, sizeof(rv)) != 0) {
+ last_error = "Unable to identify Ghostscript DLL revision";
+ freeLibrary();
+ return 1;
+ }
+ gsapi_new_instance = (PFN_gsapi_new_instance) GetProcAddress(hmodule,"gsapi_new_instance");
+ if (gsapi_new_instance == NULL) {
+ last_error = "Can't find gsapi_new_instance";
+ freeLibrary();
+ return 1;
+ }
+ gsapi_delete_instance = (PFN_gsapi_delete_instance) GetProcAddress(hmodule, "gsapi_delete_instance");
+ if (gsapi_delete_instance == NULL) {
+ last_error = "Can't find gsapi_delete_instance";
+ freeLibrary();
+ return 1;
+ }
+ gsapi_set_stdio = (PFN_gsapi_set_stdio) GetProcAddress(hmodule, "gsapi_set_stdio");
+ if (gsapi_set_stdio == NULL) {
+ last_error = "Can't find gsapi_set_stdio";
+ freeLibrary();
+ return 1;
+ }
+ gsapi_set_poll = (PFN_gsapi_set_poll) GetProcAddress(hmodule, "gsapi_set_poll");
+ if (gsapi_set_poll == NULL) {
+ last_error = "Can't find gsapi_set_poll";
+ freeLibrary();
+ return 1;
+ }
+ gsapi_set_display_callback = (PFN_gsapi_set_display_callback) GetProcAddress(hmodule, "gsapi_set_display_callback");
+ if (gsapi_set_display_callback == NULL) {
+ last_error = "Can't find gsapi_set_display_callback";
+ freeLibrary();
+ return 1;
+ }
+ gsapi_init_with_args = (PFN_gsapi_init_with_args) GetProcAddress(hmodule, "gsapi_init_with_args");
+ if (gsapi_init_with_args == NULL) {
+ last_error = "Can't find gsapi_init_with_args";
+ freeLibrary();
+ return 1;
+ }
+ gsapi_run_string = (PFN_gsapi_run_string) GetProcAddress(hmodule, "gsapi_run_string");
+ if (gsapi_run_string == NULL) {
+ last_error = "Can't find gsapi_run_string";
+ freeLibrary();
+ return 1;
+ }
+ gsapi_run_string_with_length = (PFN_gsapi_run_string_with_length) GetProcAddress(hmodule, "gsapi_run_string_with_length");
+ if (gsapi_run_string_with_length == NULL) {
+ last_error = "Can't find gsapi_run_string_with_length";
+ freeLibrary();
+ return 1;
+ }
+ gsapi_run_string_begin = (PFN_gsapi_run_string_begin) GetProcAddress(hmodule, "gsapi_run_string_begin");
+ if (gsapi_run_string_begin == NULL) {
+ last_error = "Can't find gsapi_run_string_begin";
+ freeLibrary();
+ return 1;
+ }
+ gsapi_run_string_continue = (PFN_gsapi_run_string_continue) GetProcAddress(hmodule, "gsapi_run_string_continue");
+ if (gsapi_run_string_continue == NULL) {
+ last_error = "Can't find gsapi_run_string_continue";
+ freeLibrary();
+ return 1;
+ }
+ gsapi_run_string_end = (PFN_gsapi_run_string_end) GetProcAddress(hmodule, "gsapi_run_string_end");
+ if (gsapi_run_string_end == NULL) {
+ last_error = "Can't find gsapi_run_string_end";
+ freeLibrary();
+ return 1;
+ }
+ gsapi_exit = (PFN_gsapi_exit) GetProcAddress(hmodule, "gsapi_exit");
+ if (gsapi_exit == NULL) {
+ last_error = "Can't find gsapi_exit";
+ freeLibrary();
+ return 1;
+ }
+ return 0;
+}
+
+void GSLibFunctions::freeLibrary() {
+ resetFunctions();
+ if (hmodule != (HINSTANCE)NULL) FreeLibrary(hmodule);
+ hmodule = NULL;
+}
+
+#endif
+
+#if defined(Q_WS_X11) || defined(Q_WS_MAC)
+
+#include <dlfcn.h>
+
+void* dlopenImpl(const char* fname) {
+ #ifdef RTLD_DEEPBIND
+ return dlopen(fname, RTLD_NOW | RTLD_DEEPBIND);
+ #else
+ #warning "dlopen - not using RTLD_DEEPBIND"
+ return dlopen(fname, RTLD_NOW);
+ #endif
+}
+
+void GSLibFunctions::tryLocation(const char* str) {
+ if (hmodule == NULL) {
+ m_LibGSLocation = str;
+ QByteArray strdata = m_LibGSLocation.toLatin1();
+ hmodule = dlopenImpl(strdata.constData());
+ }
+}
+
+void GSLibFunctions::tryLocationLoop(const char* prefix) {
+ std::string soName(prefix);
+ soName += "/libgs.so";
+ for (int version = 12; version >= 6; version--) {
+ std::ostringstream toTry;
+ toTry << soName << "." << version;
+ tryLocation(toTry.str().c_str());
+ }
+ tryLocation(soName.c_str());
+}
+
+int GSLibFunctions::loadLibrary(const QString& location, QString& last_error) {
+ gsapi_revision_t rv;
+ /* Try to load the library */
+ if (location == "") {
+ #ifdef Q_WS_X11
+ #if defined(__x86_64__) || defined(__ppc64__) || defined (__s390x__) || defined (__sparc64__)
+ // try 64 bit libraries on 64 bit system
+ tryLocationLoop("/usr/lib64");
+ tryLocationLoop("/usr/local/lib64");
+ #endif // 64 bit
+ tryLocationLoop("/usr/lib");
+ tryLocationLoop("/usr/local/lib");
+ #endif // Q_WS_X11
+ #ifdef Q_WS_MAC
+ tryLocation("/usr/lib/libgs.dylib");
+ tryLocation("/usr/local/lib/libgs.dylib");
+ #endif
+ } else {
+ m_LibGSLocation = location;
+ QString libloc = location;
+ if (libloc.endsWith(".framework")) {
+ libloc.append("/Ghostscript");
+ }
+ QByteArray strdata = libloc.toLatin1();
+ hmodule = dlopenImpl(strdata.constData());
+ }
+ /* Error message if loading fails */
+ if (hmodule == NULL) {
+ /* Failed */
+ last_error = QString::fromAscii(dlerror());
+ return 2;
+ }
+ /* Get pointers to functions */
+ gsapi_revision = (PFN_gsapi_revision) dlsym(hmodule, "gsapi_revision");
+ if (gsapi_revision == NULL) {
+ last_error = "Can't find gsapi_revision";
+ freeLibrary();
+ return 1;
+ }
+ /* check DLL version */
+ if (gsapi_revision(&rv, sizeof(rv)) != 0) {
+ last_error = "Unable to identify Ghostscript DLL revision - it must be newer than needed";
+ freeLibrary();
+ return 1;
+ }
+ gsapi_new_instance = (PFN_gsapi_new_instance) dlsym(hmodule,"gsapi_new_instance");
+ if (gsapi_new_instance == NULL) {
+ last_error = "Can't find gsapi_new_instance";
+ freeLibrary();
+ return 1;
+ }
+ gsapi_delete_instance = (PFN_gsapi_delete_instance) dlsym(hmodule, "gsapi_delete_instance");
+ if (gsapi_delete_instance == NULL) {
+ last_error = "Can't find gsapi_delete_instance";
+ freeLibrary();
+ return 1;
+ }
+ gsapi_set_stdio = (PFN_gsapi_set_stdio) dlsym(hmodule, "gsapi_set_stdio");
+ if (gsapi_set_stdio == NULL) {
+ last_error = "Can't find gsapi_set_stdio";
+ freeLibrary();
+ return 1;
+ }
+ gsapi_set_poll = (PFN_gsapi_set_poll) dlsym(hmodule, "gsapi_set_poll");
+ if (gsapi_set_poll == NULL) {
+ last_error = "Can't find gsapi_set_poll";
+ freeLibrary();
+ return 1;
+ }
+ gsapi_set_display_callback = (PFN_gsapi_set_display_callback) dlsym(hmodule, "gsapi_set_display_callback");
+ if (gsapi_set_display_callback == NULL) {
+ last_error = "Can't find gsapi_set_display_callback";
+ freeLibrary();
+ return 1;
+ }
+ gsapi_init_with_args = (PFN_gsapi_init_with_args) dlsym(hmodule, "gsapi_init_with_args");
+ if (gsapi_init_with_args == NULL) {
+ last_error = "Can't find gsapi_init_with_args";
+ freeLibrary();
+ return 1;
+ }
+ gsapi_run_string = (PFN_gsapi_run_string) dlsym(hmodule, "gsapi_run_string");
+ if (gsapi_run_string == NULL) {
+ last_error = "Can't find gsapi_run_string";
+ freeLibrary();
+ return 1;
+ }
+ gsapi_run_string_with_length = (PFN_gsapi_run_string_with_length) dlsym(hmodule, "gsapi_run_string_with_length");
+ if (gsapi_run_string_with_length == NULL) {
+ last_error = "Can't find gsapi_run_string_with_length";
+ freeLibrary();
+ return 1;
+ }
+ gsapi_run_string_begin = (PFN_gsapi_run_string_begin) dlsym(hmodule, "gsapi_run_string_begin");
+ if (gsapi_run_string_begin == NULL) {
+ last_error = "Can't find gsapi_run_string_begin";
+ freeLibrary();
+ return 1;
+ }
+ gsapi_run_string_continue = (PFN_gsapi_run_string_continue) dlsym(hmodule, "gsapi_run_string_continue");
+ if (gsapi_run_string_continue == NULL) {
+ last_error = "Can't find gsapi_run_string_continue";
+ freeLibrary();
+ return 1;
+ }
+ gsapi_run_string_end = (PFN_gsapi_run_string_end) dlsym(hmodule, "gsapi_run_string_end");
+ if (gsapi_run_string_end == NULL) {
+ last_error = "Can't find gsapi_run_string_end";
+ freeLibrary();
+ return 1;
+ }
+ gsapi_exit = (PFN_gsapi_exit) dlsym(hmodule, "gsapi_exit");
+ if (gsapi_exit == NULL) {
+ last_error = "Can't find gsapi_exit";
+ freeLibrary();
+ return 1;
+ }
+ return 0;
+}
+
+void GSLibFunctions::freeLibrary() {
+ resetFunctions();
+ if (hmodule != NULL) dlclose(hmodule);
+ hmodule = NULL;
+}
+
+#endif
diff --git a/src/gui/readme.txt b/src/gui/readme.txt
new file mode 100644
index 0000000..372c323
--- /dev/null
+++ b/src/gui/readme.txt
@@ -0,0 +1,118 @@
+#
+# QGLE - A Graphical Interface to GLE
+# Copyright (C) 2006 A. S. Budden & J. Struyf
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# Also add information on how to contact you by electronic and paper mail.
+#
+
+Introduction
+------------
+
+The current GUI contains a preview window that can receive messages from
+GLE and display the resulting EPS file. In addition, it can open GLE
+and EPS files directly (using Ghostscript and GLE). It now has the
+capability to add and edit simple objects, such as, lines, circles and
+arcs (snapping to a grid if required). It can also change various properties
+of the objects, such as, line width, and color. The perpendicular
+line and tangential line commands can be used to produce a line starting
+perpendicular or tangential to an existing object. OSnap can be used
+for the end point of a line.
+
+When drawing objects, hit the escape key to cancel. The pointer tool
+can be used to select objects and they can then be deleted using the 'del'
+key or moved/scaled. Other keyboard shortcuts include:
+
+F1 : Show this message
+F3 : Toggle Object Snap
+F6 : Toggle coordinate display (Cartesian, Polar,
+ Relative Cartesian, Relative Polar,
+ Off)
+F7 : Toggle grid visibility
+F8 : Toggle Orthographic snap
+F9 : Toggle grid snap
+F10: Toggle polar snap
+
+'-': Zoom in
+'=': Zoom out
+
+Shift: Hold this down to select multiple objects for deletion
+
+At present, there is very little error checking, so crashes are possible.
+Also, if compiled in debug mode, there's a fair amount of debugging output
+sent to the console, but I'm gradually cutting this down as it gets more
+stable.
+
+Once compiled, run "qgle" to start. This will bring up the main window
+with a status bar message saying "Server Listening".
+
+Once "gle -p" has been run, the eps should appear in the window and the
+full file name in the status bar.
+
+BUGS:
+
+* Temporary files (used for rendering GLE code) are never deleted;
+* Icons on the toolbar are horrible;
+* Very little error checking in the code, therefore very likely to crash
+ or just do something very strange;
+* I'm sure there are a lot more bugs, but I haven't found them all yet
+ and haven't written down those that I have found: answers on a
+ postcard to the usual address.
+
+TODO:
+
+* Fix all the bugs!
+* Line trimming and extension;
+* Allow drawing of boxes etc;
+* Change circles and arcs to be specific cases of ellipses and
+ elliptical arcs;
+* Add object ordering;
+* Extend polar snap to work from other snap points;
+* Add "object tracking";
+* Add exporters: PDF etc;
+* Add printing;
+* Make lines into polylines and allow object conversion;
+* Add custom objects built from subroutines;
+* Allow addition of arbitrary gle code at a given position?
+
+Compiling the GUI
+-----------------
+
+The program is designed for QT4 (which is fairly different to QT3), so
+make sure you have the right version operable (they can coexist).
+
+Then configure and build GLE as follows:
+
+./configure --with-qt=/path/to/your/qt4/directory
+make
+make install
+qgle
+
+Note that more information on comiling GLE can be found here:
+<http://www.gle-graphics.org/tut/linux.html>
+
+On Arch Linux, the QT4 package lives in /opt/qt4 whereas QT3 lives in
+/opt/qt. There is a script called qt-config (not to be confused with
+qtconfig), which switches the development environment between the two.
+
+To compile in debug mode in Windows (selectable using the config option
+in qgle.pro), you MUST have compiled the debug libraries (using the
+option on the "Start" menu). If you haven't done this, you'll probably
+get some random unexplained crashes.
+
+Al <abudden at NOSPAMgataki.co.uk>
+
+# vim:tw=72:fo+=w2:et
diff --git a/src/gui/serverthread.cpp b/src/gui/serverthread.cpp
new file mode 100644
index 0000000..8945bdd
--- /dev/null
+++ b/src/gui/serverthread.cpp
@@ -0,0 +1,564 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+#include <QtCore>
+#include <QtNetwork>
+#include <QtDebug>
+
+#include "qgs.h"
+#include "serverthread.h"
+#include "drawingobject.h"
+#include "math.h"
+#define DIR_SEP "/"
+#include "mainwindow.h"
+#include "qgle_statics.h"
+#include "../config.h"
+
+#include <sstream>
+
+GLEServerThread::GLEServerThread(QObject *parent, quint16 port) : QThread(parent)
+{
+ // Just save the requested port
+ this->port = port;
+}
+
+GLEServerThread::~GLEServerThread()
+{
+ // Use a locker to get access to shared variables,
+ // set abort=true and wait for the server to die
+ mutex.lock();
+ abort = true;
+ mutex.unlock();
+ messageWaitCondition.wakeAll();
+ wait();
+}
+
+void GLEServerThread::initialise()
+{
+ // Make sure abort is safe
+ abort = false;
+ // Start the processing
+ start(LowPriority);
+}
+
+void GLEServerThread::run()
+{
+ // This is the bit that runs in a different thread
+
+ // Set up some handy regexps
+ QRegExp glefile(".*glefile: *\"([^\"]*)\".*");
+ QRegExp rxdpi(".*dpi: *\"([^\"]*)\".*");
+ QString rxdone = tr("*DONE*");
+
+ // Create a new server and listen on the requested port
+ QTcpServer server;
+ if (!server.listen(QHostAddress::LocalHost, port))
+ {
+ emit serverMessage(tr("Unable to start the server"));
+ return;
+ }
+
+ emit serverMessage(tr("Server listening"));
+
+ // Loop forever
+ forever
+ {
+ // Check whether we should quit
+ mutex.lock();
+ if (abort)
+ {
+ mutex.unlock();
+ return;
+ }
+ mutex.unlock();
+
+
+ // Wait for a new connection for 500ms
+ if (server.waitForNewConnection(500))
+ {
+ // Get the connection
+ QTcpSocket *clientConnection = server.nextPendingConnection();
+
+ qint64 bytesread;
+ char buffer[2000];
+ QString gleCommand;
+
+ // While we are connected
+ bool done = false;
+ while(!done && clientConnection->state() == QAbstractSocket::ConnectedState)
+ {
+ // Check whether we should quit
+ mutex.lock();
+ if (abort)
+ {
+ mutex.unlock();
+ delete clientConnection;
+ return;
+ }
+ mutex.unlock();
+
+ // See whether there's anything to read
+ if(clientConnection->waitForReadyRead(500))
+ {
+ // There is, so find out how much
+ bytesread = clientConnection->bytesAvailable();
+ // and read it
+ clientConnection->read(buffer, bytesread);
+ buffer[bytesread] = 0;
+ // append it to our gleCommand buffer
+ gleCommand += buffer;
+ }
+
+ if(gleCommand.indexOf(rxdone) != -1)
+ {
+ done = true;
+ }
+ }
+
+ // Break it up into separate lines
+ QStringList parts = gleCommand.split(QRegExp("[\\r\\n]+"));
+ QString part, glefname;
+
+ // Find the bits we're interested in
+ foreach(part, parts)
+ {
+ if(rxdpi.exactMatch(part))
+ {
+ // do something with dpi?
+ }
+ if(glefile.exactMatch(part))
+ {
+ glefname = glefile.capturedTexts()[1];
+ }
+ }
+
+ // Now make QGLE render this file
+ emit gleMinusPRunned(glefname);
+
+ // Send console output back to gle
+ mutex.lock();
+ done = false;
+ while (!done)
+ {
+ if (abort)
+ {
+ mutex.unlock();
+ delete clientConnection;
+ return;
+ }
+ if (message.length() != 0)
+ {
+ done = true;
+ clientConnection->write(message.toUtf8());
+ clientConnection->waitForBytesWritten(-1);
+ message = "";
+ }
+ else
+ {
+ messageWaitCondition.wait(&mutex);
+ }
+ }
+ mutex.unlock();
+
+ // Delete the connection and loop round to wait for a new one
+ delete(clientConnection);
+ }
+ }
+}
+
+//! Send a message back to GLE
+void GLEServerThread::sendMessageToGLEMinusP(const QString& msg, bool)
+{
+ mutex.lock();
+ // Added space because empty message means no message yet in above code
+ message = msg + " ";
+ mutex.unlock();
+ messageWaitCondition.wakeAll();
+}
+
+GLERenderThread::GLERenderThread(QObject *parent) : QThread(parent)
+{
+ abort = false;
+ restart = false;
+ interpreter = NULL;
+}
+
+GLERenderThread::~GLERenderThread()
+{
+ mutex.lock();
+ abort = true;
+ condition.wakeOne();
+ mutex.unlock();
+ wait();
+}
+
+//! Render GLE script
+void GLERenderThread::renderGLEToImage(GLEScript* script, const QString& outFile, double dpi, const QSize& area)
+{
+ QMutexLocker locker(&mutex);
+ todo = ToDoRenderGLE;
+ gleScript = script;
+ outFileName = outFile;
+ outFileDPI = dpi;
+ outFileArea = area;
+ if (!isRunning()) {
+ start();
+ } else {
+ restart = true;
+ condition.wakeOne();
+ }
+}
+
+void GLERenderThread::renderOutputFromMemoryToImage(GLEScript* script, const QString& epsFile, double dpi, const QSize& area)
+{
+ QMutexLocker locker(&mutex);
+#ifdef HAVE_POPPLER
+ string* bytesPDF = script->getRecordedBytesBuffer(GLE_DEVICE_PDF);
+ string* bytesEPS = script->getRecordedBytesBuffer(GLE_DEVICE_EPS);
+ if (!bytesPDF->empty()) {
+ todo = ToDoRenderPDFFromMemory;
+ } else if (!bytesEPS->empty()) {
+ todo = ToDoRenderEPSFromMemory;
+ } else {
+ QImage emptyImage;
+ emit renderComplete(emptyImage);
+ return;
+ }
+#else
+ todo = ToDoRenderEPSFromMemory;
+#endif
+ gleScript = script;
+ outFileName = epsFile;
+ outFileDPI = dpi;
+ outFileArea = area;
+ if (!isRunning()) {
+ start();
+ } else {
+ restart = true;
+ condition.wakeOne();
+ }
+}
+
+//! Convert an EPS file to an image (dpi == 0 -> autoscale)
+void GLERenderThread::renderEPSFromFileToImage(const QString& fname, double dpi, const QSize& area)
+{
+ QMutexLocker locker(&mutex);
+ todo = ToDoRenderEPSFromFile;
+ outFileName = fname;
+ outFileDPI = dpi;
+ outFileArea = area;
+ if (!isRunning()) {
+ start();
+ } else {
+ restart = true;
+ condition.wakeOne();
+ }
+}
+
+void GLERenderThread::run()
+{
+ qRegisterMetaType<QImage>("QImage");
+ forever
+ {
+ mutex.lock();
+ if (abort)
+ {
+ mutex.unlock();
+ return;
+ }
+ int myToDo = todo;
+ QString myOutFileName = outFileName;
+ double myOutFileDPI = outFileDPI;
+ QSize myOutFileArea = outFileArea;
+ GLERC<GLEScript> myGLEScript;
+ if (myToDo == ToDoRenderGLE || myToDo == ToDoRenderEPSFromMemory || myToDo == ToDoRenderPDFFromMemory) {
+ // script is NULL if render EPS
+ myGLEScript = gleScript;
+ }
+ mutex.unlock();
+
+ // do processing
+ if (myToDo == ToDoRenderGLE) {
+ emit serverMessage(tr("Rendering GLE file"));
+ GLEInterface* iface = myGLEScript->getGLEInterface();
+ if (myOutFileDPI != 0.0) {
+ std::ostringstream resolutionString;
+ resolutionString << (int)floor(myOutFileDPI + 0.5);
+ iface->setCmdLineOptionString("resolution", resolutionString.str().c_str());
+ }
+ bool renderPoppler = false;
+ int device = GLE_DEVICE_EPS;
+ #ifdef HAVE_POPPLER
+ if (iface->hasCmdLineOptionString("cairo")) {
+ renderPoppler = true;
+ device = GLE_DEVICE_PDF;
+ }
+ #endif
+ iface->renderGLE(myGLEScript.get(), myOutFileName.toLatin1().constData(), device, true);
+ if (iface->getOutput()->getExitCode() == 0) {
+ if (renderPoppler) {
+ myToDo = ToDoRenderPDFFromMemory;
+ } else {
+ myToDo = ToDoRenderEPSFromMemory;
+ }
+ } else {
+ QImage emptyImage;
+ emit renderComplete(emptyImage);
+ }
+ }
+ if (myToDo == ToDoRenderEPSFromMemory) {
+ renderEPSToImageInternalFromMemory(myGLEScript.get(), myOutFileDPI, myOutFileArea);
+ }
+ if (myToDo == ToDoRenderPDFFromMemory) {
+ renderPDFToImageInternalFromMemory(myGLEScript.get(), myOutFileDPI, myOutFileArea);
+ }
+ if (myToDo == ToDoRenderEPSFromFile) {
+ renderEPSToImageInternalFromFile(myOutFileName, myOutFileDPI, myOutFileArea);
+ }
+ mutex.lock();
+ if (!restart)
+ {
+ condition.wait(&mutex);
+ }
+ restart = false;
+ mutex.unlock();
+ }
+}
+
+QString& GLERenderThread::getGhostScriptOutput()
+{
+ return GhostScriptOutput;
+}
+
+GSInterpreterLib* GLERenderThread::setupInterpreter(const QSize& area, double b1, double b2, double width, double height, double& dpi, bool& newDPI) {
+ // QString gsError = QString("%1 %2 wd %3 %4 dpi %5").arg(b1).arg(b2).arg(width).arg(height).arg(dpi);
+ // qDebug() << "*** Origin: " << gsError;
+
+ // Auto scale new files to size of drawing area
+ if (dpi == 0.0) {
+ dpi = QGLE::computeAutoScaleDPIFromPts(area, 5, width, height);
+ newDPI = true;
+ }
+ // Create the interpreter object and set a few parameters
+ GSInterpreterLib *interpreter = new GSInterpreterLib();
+ interpreter->setOrigin(b1, b2);
+ interpreter->setMedia("a4");
+ interpreter->setMagnify(1);
+ interpreter->setOrientation(0);
+ interpreter->setDPI(dpi);
+ int img_wd = GLEBBoxToPixels(dpi, width);
+ int img_hi = GLEBBoxToPixels(dpi, height);
+ interpreter->setSize(img_wd, img_hi);
+ interpreter->setAABits(4,4);
+ return interpreter;
+}
+
+void GLERenderThread::renderEPSDone(GSInterpreterLib* interpreter, double dpi, bool newDPI) {
+ QString gsError;
+ GhostScriptOutput = interpreter->getOutpuStreamText();
+ if (interpreter->hasError()) {
+ const GSError& e = interpreter->getError();
+ gsError = QString("Ghostscript error: %1 %2").arg(e.getCode()).arg(e.getName());
+ qDebug() << "Error: " << gsError;
+ }
+
+ QImage image(interpreter->getImage());
+ delete interpreter;
+
+ // Delete interpreter should go before different signals
+ // otherwise recursive calls to this function may cause multiple instantiations of
+ // libgs, which is not allowed and results in crashes
+ if (gsError != "") {
+ emit serverError(gsError);
+ }
+ if (newDPI) {
+ emit dpiChanged(dpi);
+ }
+ emit renderComplete(image);
+}
+
+//! Convert an EPS file to an image (dpi == 0 -> autoscale)
+void GLERenderThread::renderEPSToImageInternalFromFile(const QString& fname, double dpi, const QSize& area)
+{
+ // Check that the file can be opened
+ QFile file(fname);
+ if (!file.open( QIODevice::ReadOnly ))
+ {
+ QImage emptyImage;
+ emit renderComplete(emptyImage);
+ return;
+ }
+
+ // Rendering EPS has started
+ emit serverMessage(tr("Rendering PostScript"));
+
+ // Scan through file for BoundingBox and set width and height
+ double b1 = 0.0;
+ double b2 = 0.0;
+ double b3 = 0.0;
+ double b4 = 0.0;
+ double width = 0.0;
+ double height = 0.0;
+
+ QRegExp rxbb("^%%BoundingBox:\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s*$");
+ QRegExp rxbbh("^%%HiResBoundingBox:\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s*$");
+
+ QTextStream in(&file);
+ while (!in.atEnd())
+ {
+ QString line = in.readLine();
+ if (rxbb.exactMatch(line))
+ {
+ b1 = (double)rxbb.capturedTexts()[1].toInt();
+ b2 = (double)rxbb.capturedTexts()[2].toInt();
+ b3 = (double)rxbb.capturedTexts()[3].toInt();
+ b4 = (double)rxbb.capturedTexts()[4].toInt();
+ width = b3-b1+1;
+ height = b4-b2+1;
+ if (!in.atEnd())
+ {
+ // GLE writes a HiResBoundingBox right after the BoundingBox
+ line = in.readLine();
+ if (rxbbh.exactMatch(line))
+ {
+ b1 = rxbb.capturedTexts()[1].toDouble();
+ b2 = rxbb.capturedTexts()[2].toDouble();
+ b3 = rxbb.capturedTexts()[3].toDouble();
+ b4 = rxbb.capturedTexts()[4].toDouble();
+ width = b3-b1;
+ height = b4-b2;
+ }
+ }
+ break;
+ }
+ }
+
+ bool newDPI = false;
+ GSInterpreterLib* interpreter = setupInterpreter(area, b1, b2, width, height, dpi, newDPI);
+
+ // Run the interpreter
+ file.reset();
+ interpreter->run(file);
+ file.close();
+
+ renderEPSDone(interpreter, dpi, newDPI);
+}
+
+void GLERenderThread::renderEPSToImageInternalFromMemory(GLEScript* script, double dpi, const QSize& area) {
+ // Rendering EPS has started
+ emit serverMessage(tr("Rendering PostScript"));
+
+ // Render EPS from memory
+ GLEPoint bb(script->getBoundingBox());
+ GLEPoint origin(script->getBoundingBoxOrigin());
+ bool newDPI = false;
+ GSInterpreterLib* interpreter = setupInterpreter(area, origin.getX(), origin.getY(), bb.getX(), bb.getY(), dpi, newDPI);
+ string* bytes = script->getRecordedBytesBuffer(GLE_DEVICE_EPS);
+ interpreter->run(bytes);
+ renderEPSDone(interpreter, dpi, newDPI);
+}
+
+void gle_write_data_vector(void* closure, char* data, int length) {
+ std::vector<unsigned char>* vec = (std::vector<unsigned char>*)closure;
+ vec->reserve(vec->size() + length);
+ for (int i = 0; i < length; ++i) {
+ vec->push_back((unsigned char)data[i]);
+ }
+}
+
+#ifdef HAVE_POPPLER
+void GLERenderThread::renderPDFToImageInternalFromMemory(GLEScript* script, double dpi, const QSize& area) {
+ // Auto scale new files to size of drawing area
+ bool newDPI = false;
+ if (dpi == 0.0) {
+ GLEPoint bb(script->getBoundingBox());
+ dpi = QGLE::computeAutoScaleDPIFromPts(area, 5, bb.getX(), bb.getY());
+ newDPI = true;
+ }
+ string* bytes = script->getRecordedBytesBuffer(GLE_DEVICE_PDF);
+ std::vector<unsigned char> imageData;
+ GLEInterface* iface = script->getGLEInterface();
+ iface->convertPDFToImage((char*)bytes->c_str(),
+ bytes->size(),
+ dpi,
+ GLE_DEVICE_PNG,
+ 0,
+ gle_write_data_vector,
+ &imageData);
+ QImage image;
+ image.loadFromData(&imageData[0], imageData.size(), "PNG");
+ if (newDPI) {
+ emit dpiChanged(dpi);
+ }
+ emit renderComplete(image);
+}
+#else
+void GLERenderThread::renderPDFToImageInternalFromMemory(GLEScript* /* script */, double /* dpi */, const QSize& /* area */) {
+}
+#endif
+
+void GLERenderThread::startRender(const GLERectangle& rect, double dpi)
+{
+ // Create the interpreter object and set a few parameters
+ interpreter = new GSInterpreterLib();
+ interpreter->setOrigin(0, 0);
+ interpreter->setMedia("a4");
+ interpreter->setMagnify(1);
+ interpreter->setOrientation(0);
+ interpreter->setDPI(dpi);
+ interpreter->setAlpha(true);
+ double width = 72*rect.getWidth()/CM_PER_INCH+2;
+ double height = 72*rect.getHeight()/CM_PER_INCH+2;
+ int img_wd = GLEBBoxToPixels(dpi, width);
+ int img_hi = GLEBBoxToPixels(dpi, height);
+ interpreter->setSize(img_wd, img_hi);
+ interpreter->setAABits(4,4);
+ // Run the interpreter
+ interpreter->startRender();
+}
+
+void GLERenderThread::nextRender(const char* postscriptCode)
+{
+ interpreter->nextRender(postscriptCode);
+}
+
+void GLERenderThread::endRender(QImage* result)
+{
+ // End render and copy image
+ interpreter->endRender();
+ *result = interpreter->getImage();
+ // Copy Ghostscript's output stream
+ QString gsError;
+ GhostScriptOutput = interpreter->getOutpuStreamText();
+ if (interpreter->hasError()) {
+ const GSError& e = interpreter->getError();
+ gsError = QString("Ghostscript error: %1 %2").arg(e.getCode()).arg(e.getName());
+ qDebug() << "Error: " << gsError;
+ }
+ // Clean up
+ delete interpreter;
+ interpreter = NULL;
+ // Emit signals
+ if (gsError != "")
+ {
+ emit serverError(gsError);
+ }
+}
diff --git a/src/gui/serverthread.h b/src/gui/serverthread.h
new file mode 100644
index 0000000..39ee7e4
--- /dev/null
+++ b/src/gui/serverthread.h
@@ -0,0 +1,159 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+#ifndef __GLESERVERTHREAD_H
+#define __GLESERVERTHREAD_H
+
+#include <QtGui>
+#include <QtNetwork>
+#include "qgle_definitions.h"
+#include "../gle/gle-interface/gle-interface.h"
+#include "fileinfo.h"
+#include "qgs.h"
+//#include "psfunctions.h"
+
+class GLERectangle;
+class GLEDrawingObject;
+
+//! TCP Server Thread definition
+/*!
+ * This class contains the code to run a TCP server
+ * and process the result of connections to that server.
+ * It also performs the calls to GS and should send a QImage
+ * to the drawingArea (via a queued signal) to make the on-screen
+ * image update
+ */
+class GLEServerThread : public QThread
+{
+ Q_OBJECT
+
+public:
+ //! Constructor
+ /*! As a thread, it should have a parent. The calling function
+ * can specify a port to listen on
+ */
+ GLEServerThread(QObject *parent, quint16 port = DEFAULT_PORT);
+ ~GLEServerThread();
+
+ //! This starts the thread: run()
+ void initialise();
+
+ //! Send a message back to GLE
+ void sendMessageToGLEMinusP(const QString& msg, bool last);
+
+signals:
+ //! This signal keeps the user notified of what's going on.
+ void serverMessage(QString msg);
+ //! This signal notifies QGLE that a new file has been opended using "gle -p"
+ void gleMinusPRunned(QString file);
+
+protected:
+ //! This is the main processing part of the thread.
+ /*!
+ * Starts a TCPServer and when the server receives a new connection it
+ * gets the data from GLE
+ */
+ void run();
+
+private:
+ //! Set true to quit
+ bool abort;
+ //! A mutex for variable protection
+ QMutex mutex;
+ //! The port to listen on
+ quint16 port;
+ QString message;
+ QWaitCondition messageWaitCondition;
+};
+
+class GLERenderThread : public QThread
+{
+ Q_OBJECT
+public:
+ GLERenderThread(QObject *parent);
+ ~GLERenderThread();
+
+ enum {
+ ToDoRenderEPSFromFile,
+ ToDoRenderEPSFromMemory,
+ ToDoRenderPDFFromMemory,
+ ToDoRenderGLE
+ };
+
+ //! Render GLE script
+ void renderGLEToImage(GLEScript* script, const QString& outFile, double dpi, const QSize& area);
+
+ //! Convert an EPS file to an image (dpi == 0 -> autoscale)
+ void renderOutputFromMemoryToImage(GLEScript* script, const QString& epsFile, double dpi, const QSize& area);
+ void renderEPSFromFileToImage(const QString& fname, double dpi, const QSize& area);
+
+ //! Return GhostScript's output stream
+ QString& getGhostScriptOutput();
+
+ //! Render arbitrary Postscript data
+ void startRender(const GLERectangle& rect, double dpi);
+ void nextRender(const char* postscriptCode);
+ void endRender(QImage* result);
+
+signals:
+ //! This signal keeps the user notified of what's going on.
+ void serverMessage(QString msg);
+ //! This signal notifies the user when an error occurs.
+ void serverError(QString msg);
+ //! This signal notifies the world that the dpi has changed
+ void dpiChanged(double new_dpi);
+ //! This signal notifies QGLE that internal image processing is complete
+ void renderComplete(QImage image);
+
+protected:
+ //! This is the main processing part of the thread.
+ void run();
+
+ //! Convert an EPS file to an image (dpi == 0 -> autoscale)
+ void renderEPSToImageInternalFromFile(const QString& fname, double dpi, const QSize& area);
+
+ void renderEPSToImageInternalFromMemory(GLEScript* script, double dpi, const QSize& area);
+
+ void renderPDFToImageInternalFromMemory(GLEScript* script, double dpi, const QSize& area);
+
+ GSInterpreterLib* setupInterpreter(const QSize& area, double b1, double b2, double width, double height, double& dpi, bool& newDPI);
+ void renderEPSDone(GSInterpreterLib* interpreter, double dpi, bool newDPI);
+
+protected:
+ //! Set true to quit
+ bool abort, restart;
+ //! A mutex for variable protection
+ QMutex mutex;
+ QWaitCondition condition;
+ //! What should I do?
+ int todo;
+ //! Render EPS arguments
+ QString outFileName;
+ double outFileDPI;
+ QSize outFileArea;
+ //! Render GLE arguments
+ GLEScript* gleScript;
+ //! Streams from GhostScript
+ QString GhostScriptOutput;
+ GSInterpreterLib *interpreter;
+};
+
+#endif
diff --git a/src/gui/settings.cpp b/src/gui/settings.cpp
new file mode 100644
index 0000000..8f9ce52
--- /dev/null
+++ b/src/gui/settings.cpp
@@ -0,0 +1,131 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+#include "settings.h"
+#include <QSettings>
+
+// Constructor: create the settings object
+GLESettings::GLESettings(QObject *parent) : QObject(parent)
+{
+ settingStore = new QSettings("gle", "qgle", this);
+}
+
+void GLESettings::readAll()
+{
+ // Read the application settings
+ setPosition(settingStore->value("application/position", QPoint(200,200)).toPoint());
+ setSize(settingStore->value("application/size", QSize(400,400)).toSize());
+ setMainWindowState(settingStore->value("application/mainstate").toByteArray());
+ setDrawingAreaSize(settingStore->value("application/drawingsize", QSize(400,400)).toSize());
+ setStoreSize(settingStore->value("application/storeSize", true).toBool());
+ setStoreDirectory(settingStore->value("application/storeDirectory", true).toBool());
+ setSaveOnPreview(settingStore->value("application/saveOnPreview", false).toBool());
+ setAskAboutObjects(settingStore->value("application/askAboutKeepingObjects", true).toBool());
+ setAutoScaleOnOpen(settingStore->value("application/autoScaleOnOpen", true).toBool());
+ setLibGSLocation(settingStore->value("application/libGSLocation", QString()).toString());
+ setEditorLocation(settingStore->value("application/editorLocation", QString("")).toString());
+ setDPI(settingStore->value("application/resolution", 100).toInt());
+ setMonitorOpenFile(settingStore->value("application/monitorOpenFile", true).toBool());
+ setMonitorAutoReloadFile(settingStore->value("application/monitorAutoReload", true).toBool());
+ setSplitterPosition(settingStore->value("application/splitterSizes").toByteArray());
+ setConsoleWindowAutoShowSize(settingStore->value("application/consoleAutoShowSize", 0).toInt());
+ setEmulateGLEVersion(settingStore->value("application/emulateGLEVersion", 0).toInt());
+ setExportFormat(settingStore->value("application/exportFormat", 0).toInt());
+ setExportPageSize(settingStore->value("application/exportPageSize", 0).toInt());
+ setPreviewPageSize(settingStore->value("application/previewPageSize", 0).toInt());
+ setOpenExportedFigure(settingStore->value("application/openExportedFigure", true).toBool());
+ setExportGrayScale(settingStore->value("application/exportGrayScale", false).toBool());
+ setExportTransparent(settingStore->value("application/exportTransparent", false).toBool());
+ setExportBitmapResolution(settingStore->value("application/exportBitmapResolution", 150).toInt());
+ setExportVectorResolution(settingStore->value("application/exportVectorResolution", 600).toInt());
+ setRenderUsingCairo(settingStore->value("application/renderUsingCairo", false).toBool());
+
+ if (storeDirectory())
+ setPwd(settingStore->value("application/workingDirectory", "").toString());
+
+ // Read the server settings
+ setPort(settingStore->value("server/portNumber", DEFAULT_PORT).toInt());
+ setAutoStartServer(settingStore->value("server/autoStart", true).toBool());
+
+ // Read the drawing settings
+ setGrid(QPointF(settingStore->value("drawing/gridX", 1.0).toDouble(),
+ settingStore->value("drawing/gridY", 1.0).toDouble()));
+ setEqualGrid(settingStore->value("drawing/equalGrid", false).toBool());
+ setPolarSnapStartAngle(settingStore->value("drawing/polarSnapStartAngle", 0.0).toDouble());
+ setPolarSnapIncAngle(settingStore->value("drawing/polarSnapIncAngle", 30.0).toDouble());
+ setOsnapOnStart(settingStore->value("drawing/osnapOnStart", false).toBool());
+ setOrthoSnapOnStart(settingStore->value("drawing/orthoSnapOnStart", false).toBool());
+ setPolarSnapOnStart(settingStore->value("drawing/polarSnapOnStart", false).toBool());
+ setPolarTrackOnStart(settingStore->value("drawing/polarTrackOnStart", false).toBool());
+ setGridSnapOnStart(settingStore->value("drawing/gridSnapOnStart", false).toBool());
+}
+
+void GLESettings::writeAll()
+{
+ // Store the application settings
+ settingStore->setValue("application/position", position());
+ settingStore->setValue("application/size", size());
+ settingStore->setValue("application/mainstate", mainWindowState());
+ settingStore->setValue("application/drawingsize", drawingAreaSize());
+ settingStore->setValue("application/storeSize", storeSize());
+ settingStore->setValue("application/storeDirectory", storeDirectory());
+ settingStore->setValue("application/saveOnPreview", saveOnPreview());
+ settingStore->setValue("application/autoScaleOnOpen", autoScaleOnOpen());
+ settingStore->setValue("application/libGSLocation", getLibGSLocation());
+ settingStore->setValue("application/editorLocation", editorLocation());
+ settingStore->setValue("application/resolution", dpi());
+ settingStore->setValue("application/monitorOpenFile", monitorOpenFile());
+ settingStore->setValue("application/monitorAutoReload", monitorAutoReloadFile());
+ settingStore->setValue("application/askAboutKeepingObjects", askAboutObjects());
+ settingStore->setValue("application/splitterSizes", splitterPosition());
+ settingStore->setValue("application/consoleAutoShowSize", getConsoleWindowAutoShowSize());
+ settingStore->setValue("application/emulateGLEVersion", getEmulateGLEVersion());
+ settingStore->setValue("application/exportFormat", getExportFormat());
+ settingStore->setValue("application/exportPageSize", getExportPageSize());
+ settingStore->setValue("application/previewPageSize", getPreviewPageSize());
+ settingStore->setValue("application/openExportedFigure", isOpenExportedFigure());
+ settingStore->setValue("application/exportGrayScale", isExportGrayScale());
+ settingStore->setValue("application/exportTransparent", isExportTransparent());
+ settingStore->setValue("application/exportBitmapResolution", getExportBitmapResolution());
+ settingStore->setValue("application/exportVectorResolution", getExportVectorResolution());
+ settingStore->setValue("application/renderUsingCairo", isRenderUsingCairo());
+
+ if (storeDirectory())
+ settingStore->setValue("application/workingDirectory", pwd());
+
+ // Store the server settings
+ settingStore->setValue("server/portNumber", port());
+ settingStore->setValue("server/autoStart", autoStartServer());
+
+ // Store the drawing settings
+ settingStore->setValue("drawing/gridX", grid().x());
+ settingStore->setValue("drawing/gridY", grid().y());
+ settingStore->setValue("drawing/equalGrid", equalGrid());
+
+ settingStore->setValue("drawing/polarSnapStartAngle", polarSnapStartAngle());
+ settingStore->setValue("drawing/polarSnapIncAngle", polarSnapIncAngle());
+ settingStore->setValue("drawing/osnapOnStart", osnapOnStart());
+ settingStore->setValue("drawing/orthoSnapOnStart", orthoSnapOnStart());
+ settingStore->setValue("drawing/polarSnapOnStart", polarSnapOnStart());
+ settingStore->setValue("drawing/polarTrackOnStart", polarSnapOnStart());
+ settingStore->setValue("drawing/gridSnapOnStart", gridSnapOnStart());
+}
+
diff --git a/src/gui/settings.h b/src/gui/settings.h
new file mode 100644
index 0000000..2ce215c
--- /dev/null
+++ b/src/gui/settings.h
@@ -0,0 +1,250 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+#ifndef _GLESETTINGS_H
+#define _GLESETTINGS_H
+
+#include <QtGui>
+#include "qgle_definitions.h"
+
+class QSettings;
+
+//! Class definition for settings object
+class GLESettings : public QObject
+{
+ Q_OBJECT
+public:
+
+ enum Modes
+ {
+ PreviewMode,
+ EditMode
+ };
+ //! Constructor
+ GLESettings(QObject *parent);
+
+ //! Read all the settings from the OS
+ void readAll();
+ //! Write all the settings to the OS
+ void writeAll();
+
+ // Application configuration
+ //! Should we store the application size on exit?
+ inline const bool& storeSize() { return storeAppSize; }
+ inline void setStoreSize(const bool& new_storeSize) { storeAppSize = new_storeSize; }
+
+ //! Should we store the last used directory on exit?
+ inline const bool& storeDirectory() { return storeDirectoryOnExit; }
+ inline void setStoreDirectory(const bool& new_storeDir) { storeDirectoryOnExit = new_storeDir; }
+
+ //! Should we autosave when switching to preview mode?
+ inline const bool& saveOnPreview() { return autoSaveOnPreview; }
+ inline void setSaveOnPreview(const bool& new_save) { autoSaveOnPreview = new_save; }
+
+ //! Should we monitor the open file for changes?
+ inline const bool& monitorOpenFile() { return monitorFile; }
+ inline void setMonitorOpenFile(const bool& new_monitorFile) { monitorFile = new_monitorFile; emit monitorFileChanged(monitorFile); }
+
+ //! Should we auto reload if file changed?
+ inline const bool& monitorAutoReloadFile() { return monitorAutoReload; }
+ inline void setMonitorAutoReloadFile(const bool& new_monitorAutoReload) { monitorAutoReload = new_monitorAutoReload; }
+
+ //! Should we autoscale when opening new diagrams
+ inline const bool& autoScaleOnOpen() { return autoScaleWhenOpening; }
+ inline void setAutoScaleOnOpen(const bool& new_scale) { autoScaleWhenOpening = new_scale; }
+
+ //! Should we store the last used directory on exit?
+ inline const QString& pwd() { return currentWorkingDirectory; }
+ inline void setPwd(const QString& new_wd) { currentWorkingDirectory = new_wd; }
+
+ //! Where is ghostscript's library?
+ inline const QString& getLibGSLocation() { return libGSLocation; }
+ inline void setLibGSLocation(const QString& str) { libGSLocation = str; }
+
+ //! Where is my favorite editor
+ inline const QString& editorLocation() { return editorExecutable; }
+ inline void setEditorLocation(const QString& str) { editorExecutable = str; }
+
+ //! What was the window position last time it was saved?
+ inline const QPoint& position() { return windowPosition; }
+ inline void setPosition(const QPoint& pos) { windowPosition = pos; }
+
+ //! What was the window's size last time it was saved?
+ inline const QSize& size() { return windowSize; }
+ inline void setSize(const QSize& new_size) { windowSize = new_size; }
+
+ //! What was the window's size last time it was saved?
+ inline const QSize& drawingAreaSize() { return m_DrawingAreaSize; }
+ inline void setDrawingAreaSize(const QSize& new_size) { m_DrawingAreaSize = new_size; }
+
+ //! What is the DEFAULT (not LAST) image resolution?
+ inline const int& dpi() { return defaultResolution; }
+ inline void setDPI(const int& new_dpi) { defaultResolution = new_dpi; }
+
+ // Server Configuration
+ //! What port number should we listen on?
+ inline const int& port() { return serverPort; }
+ inline void setPort(const int& new_port) { serverPort = new_port; emit portChanged(serverPort); }
+
+ //! Should we start the server when the application starts?
+ inline const bool& autoStartServer() { return serverAutoStart; }
+ inline void setAutoStartServer(const bool& new_autoStart) { serverAutoStart = new_autoStart; }
+
+ // Drawing Configuration
+ //! Grid Spacings
+ inline const QPointF& grid() { return gridSpacing; }
+ inline void setGrid(const QPointF& newGrid) { gridSpacing = newGrid ; emit gridChanged(gridSpacing); }
+
+ inline const double& polarSnapStartAngle() { return polarSnapStartingAngle; }
+ inline void setPolarSnapStartAngle(double newAngle) { polarSnapStartingAngle = newAngle ; emit polarSnapStartAngleChanged(polarSnapStartingAngle); }
+
+ inline const double& polarSnapIncAngle() { return polarSnapIncrementAngle; }
+ inline void setPolarSnapIncAngle(double newAngle) { polarSnapIncrementAngle = newAngle ; emit polarSnapIncAngleChanged(polarSnapIncrementAngle); }
+
+ //! Should we start in OSNAP mode?
+ inline const bool& osnapOnStart() { return startOSNAP; }
+ inline void setOsnapOnStart(const bool& new_startosnap) { startOSNAP = new_startosnap; }
+
+ //! Should we start in orthosnap mode?
+ inline const bool& orthoSnapOnStart() { return startORTHOSNAP; }
+ inline void setOrthoSnapOnStart(const bool& new_startorthosnap) { startORTHOSNAP = new_startorthosnap; }
+
+ //! Should we start in grid snap mode?
+ inline const bool& gridSnapOnStart() { return startGRIDSNAP; }
+ inline void setGridSnapOnStart(const bool& new_startgridsnap) { startGRIDSNAP = new_startgridsnap; }
+
+ //! Should we start in polar snap mode?
+ inline const bool& polarSnapOnStart() { return startPOLARSNAP; }
+ inline void setPolarSnapOnStart(const bool& new_startpolar) { startPOLARSNAP = new_startpolar; }
+
+ //! Should we start in polar track mode?
+ inline const bool& polarTrackOnStart() { return startPOLARTRACK; }
+ inline void setPolarTrackOnStart(const bool& new_startpolartrack) { startPOLARTRACK = new_startpolartrack; }
+
+ //! Should the grid spacing be equal
+ inline const bool& equalGrid() { return equalGridSpacing; }
+ inline void setEqualGrid(const bool& newEqualGrid) { equalGridSpacing = newEqualGrid; }
+
+ //! Should the user be asked whether to keep objects on reload
+ inline const bool& askAboutObjects() { return askWhetherToKeepObjects; }
+ inline void setAskAboutObjects(const bool& newAsk) { askWhetherToKeepObjects = newAsk; }
+
+ inline const QByteArray& splitterPosition() { return currentSplitterPos; }
+ inline void setSplitterPosition(const QByteArray& pos) { currentSplitterPos = pos; }
+
+ inline void setConsoleWindowAutoShowSize(int height) { consoleWindowAutoShowSize = height; }
+ inline int getConsoleWindowAutoShowSize() { return consoleWindowAutoShowSize; }
+
+ inline const QByteArray& mainWindowState() { return currentMainWindowState; }
+ inline void setMainWindowState(const QByteArray& state) { currentMainWindowState = state; }
+
+ //! Should emulate a particular GLE version
+ inline int getEmulateGLEVersion() { return emulateGLEVersion; }
+ inline void setEmulateGLEVersion(int emul) { emulateGLEVersion = emul; }
+
+ //! Should export to a particular format
+ inline int getExportFormat() { return exportFormat; }
+ inline void setExportFormat(int expf) { exportFormat = expf; }
+
+ //! Should export to a particular page size
+ inline int getExportPageSize() { return exportPageSize; }
+ inline void setExportPageSize(int exps) { exportPageSize = exps; }
+
+ //! Should preview in a particular page size
+ inline int getPreviewPageSize() { return previewPageSize; }
+ inline void setPreviewPageSize(int prevs) { previewPageSize = prevs; }
+
+ //! Should open exported figure in previewer
+ inline bool isOpenExportedFigure() { return openExportedFigure; }
+ inline void setOpenExportedFigure(bool value) { openExportedFigure = value; }
+
+ inline bool isExportGrayScale() { return exportGrayScale; }
+ inline void setExportGrayScale(bool value) { exportGrayScale = value; }
+
+ inline bool isExportTransparent() { return exportTransparent; }
+ inline void setExportTransparent(bool value) { exportTransparent = value; }
+
+ inline int getExportBitmapResolution() { return exportBitmapResolution; }
+ inline void setExportBitmapResolution(int value) { exportBitmapResolution = value; }
+
+ inline int getExportVectorResolution() { return exportVectorResolution; }
+ inline void setExportVectorResolution(int value) { exportVectorResolution = value; }
+
+ //! Should render using Cairo backend
+ inline bool isRenderUsingCairo() { return renderUsingCairo; }
+ inline void setRenderUsingCairo(bool value) { renderUsingCairo = value; }
+
+signals:
+ void gridChanged(QPointF grid);
+ void portChanged(int newPort);
+ void monitorFileChanged(bool mf);
+ void polarSnapStartAngleChanged(double newAngle);
+ void polarSnapIncAngleChanged(double newAngle);
+
+private:
+ QSettings *settingStore;
+ QString libGSLocation;
+ QString gleExecutable;
+ QString editorExecutable;
+ int imageDPI;
+ QPoint windowPosition;
+ QSize windowSize;
+ QSize m_DrawingAreaSize;
+ bool storeAppSize;
+ int serverPort;
+ bool serverAutoStart;
+ QPointF gridSpacing;
+ int defaultResolution;
+ bool equalGridSpacing;
+ bool autoSaveOnPreview;
+ bool autoScaleWhenOpening;
+ bool monitorFile;
+ bool monitorAutoReload;
+ bool askWhetherToKeepObjects;
+ int exportFormat;
+ int exportPageSize;
+ int previewPageSize;
+ bool openExportedFigure;
+ bool exportGrayScale;
+ bool exportTransparent;
+ int exportBitmapResolution;
+ int exportVectorResolution;
+ bool renderUsingCairo;
+
+ bool startOSNAP;
+ bool startORTHOSNAP;
+ bool startPOLARSNAP;
+ bool startPOLARTRACK;
+ bool startGRIDSNAP;
+ double polarSnapStartingAngle;
+ double polarSnapIncrementAngle;
+
+ bool storeDirectoryOnExit;
+ int consoleWindowAutoShowSize;
+ int emulateGLEVersion;
+
+ QString currentWorkingDirectory;
+ QByteArray currentSplitterPos;
+ QByteArray currentMainWindowState;
+};
+
+
+#endif
diff --git a/src/gui/settings_dialogue.cpp b/src/gui/settings_dialogue.cpp
new file mode 100644
index 0000000..5275510
--- /dev/null
+++ b/src/gui/settings_dialogue.cpp
@@ -0,0 +1,746 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+#include <QtGui>
+
+#include "qgle_statics.h"
+#include "settings.h"
+#include "settings_dialogue.h"
+#include "dialogues.h"
+#include "qgs.h"
+
+// Constructor for the settings dialogue box
+SettingsDialogue::SettingsDialogue(GLEMainWindow *parent)
+ : QDialog(parent)
+{
+ mainWin = parent;
+ // Create a new tab widget and add tabs for the various
+ // categories of setting
+ appTab = new ApplicationTab(this);
+ servTab = new ServerTab(this);
+ drawTab = new DrawingTab(this);
+ toolTab = new ToolTab(this, parent);
+
+ tabWidget = new QTabWidget;
+ tabWidget->addTab(toolTab, tr("Tools"));
+ tabWidget->addTab(appTab, tr("Application"));
+ tabWidget->addTab(drawTab, tr("Drawing"));
+ tabWidget->addTab(servTab, tr("Server"));
+
+ // Add ok and cancel button
+ QPushButton *okButton = new QPushButton(tr("OK"));
+ QPushButton *cancelButton = new QPushButton(tr("Cancel"));
+ okButton->setDefault(true);
+
+ // Connect to slots: we need to handle what happens on accept
+ // and reject
+ connect(okButton, SIGNAL(clicked()), this, SLOT(okClicked()));
+ connect(cancelButton, SIGNAL(clicked()), this, SLOT(reject()));
+
+ // Layout the buttons
+ QHBoxLayout *buttonLayout = new QHBoxLayout;
+ buttonLayout->addStretch(1);
+ buttonLayout->addWidget(okButton);
+ buttonLayout->addWidget(cancelButton);
+
+ // Layout the dialogue box as a whole
+ QVBoxLayout *mainLayout = new QVBoxLayout;
+ mainLayout->addWidget(tabWidget);
+ mainLayout->addLayout(buttonLayout);
+ setLayout(mainLayout);
+
+ initApplicationTab();
+ initServerTab();
+ initDrawingTab();
+ initToolTab();
+
+ resize(mainWin->width()/2, mainWin->height()/2);
+
+ // Set the window title
+ setWindowTitle(tr("%1 Settings").arg(APP_NAME));
+}
+
+void SettingsDialogue::initApplicationTab()
+{
+ // Set up the tab based on the application's current settings
+ appTab->setDPI(mainWin->settings->dpi());
+ appTab->setStoreSize(mainWin->settings->storeSize());
+ appTab->setStoreDir(mainWin->settings->storeDirectory());
+ appTab->setSaveOnPreview(mainWin->settings->saveOnPreview());
+ appTab->setMonitorOpenFile(mainWin->settings->monitorOpenFile());
+ appTab->setMonitorAutoReload(mainWin->settings->monitorAutoReloadFile());
+ appTab->setAutoScaleOnOpen(mainWin->settings->autoScaleOnOpen());
+ appTab->setAskAboutObjects(mainWin->settings->askAboutObjects());
+}
+
+void SettingsDialogue::initServerTab()
+{
+ // Set up the tab based on the application's current settings
+ servTab->setPort(mainWin->settings->port());
+// servTab->setAutoStart(mainWin->settings->autoStartServer());
+}
+
+void SettingsDialogue::initDrawingTab()
+{
+ // Set up the tab based on the application's current settings
+ drawTab->setGrid(mainWin->settings->grid());
+ drawTab->setEqualGrid(mainWin->settings->equalGrid());
+ drawTab->setGridSnapOnStart(mainWin->settings->gridSnapOnStart());
+ drawTab->setOrthoSnapOnStart(mainWin->settings->orthoSnapOnStart());
+ drawTab->setOsnapOnStart(mainWin->settings->osnapOnStart());
+ drawTab->setPolarSnapOnStart(mainWin->settings->polarSnapOnStart());
+ drawTab->setPolarTrackOnStart(mainWin->settings->polarTrackOnStart());
+ drawTab->setPolarSnapStartAngle(mainWin->settings->polarSnapStartAngle());
+ drawTab->setPolarSnapIncAngle(mainWin->settings->polarSnapIncAngle());
+}
+
+void SettingsDialogue::initToolTab()
+{
+ // Set up the tab based on the application's current settings
+ toolTab->setToolGLE(mainWin->getGLEVersion(), mainWin->getGLEBuildDate(), mainWin->getGLETop());
+ toolTab->setToolGsLib(mainWin->settings->getLibGSLocation(), mainWin->getGsLibVersion());
+ toolTab->setToolEditor(mainWin->settings->editorLocation());
+ toolTab->setRenderUsingCairo(mainWin->settings->isRenderUsingCairo());
+}
+
+void SettingsDialogue::okClicked()
+{
+ // Copy the settings from all the tabs to the application's settings
+ mainWin->settings->setStoreSize(appTab->storeSize());
+ mainWin->settings->setStoreDirectory(appTab->storeDir());
+ mainWin->settings->setSaveOnPreview(appTab->saveOnPreview());
+ mainWin->settings->setMonitorOpenFile(appTab->monitorOpenFile());
+ mainWin->settings->setMonitorAutoReloadFile(appTab->monitorAutoReload());
+ mainWin->settings->setAskAboutObjects(appTab->askAboutObjects());
+
+ if (mainWin->settings->autoScaleOnOpen() != appTab->autoScaleOnOpen())
+ {
+ mainWin->settings->setAutoScaleOnOpen(appTab->autoScaleOnOpen());
+ // not required (?):
+ // emit autoScaleChanged(appTab->autoScaleOnOpen());
+ }
+ if (mainWin->settings->dpi() != appTab->dpi())
+ {
+ mainWin->settings->setDPI(appTab->dpi());
+ emit defaultResolutionChanged((double) appTab->dpi());
+ }
+
+ mainWin->settings->setPort(servTab->port());
+// mainWin->settings->setAutoStartServer(servTab->autoStart());
+
+ mainWin->settings->setGrid(drawTab->grid());
+ mainWin->settings->setEqualGrid(drawTab->equalGrid());
+ mainWin->settings->setGridSnapOnStart(drawTab->gridSnapOnStart());
+ mainWin->settings->setOrthoSnapOnStart(drawTab->orthoSnapOnStart());
+ mainWin->settings->setOsnapOnStart(drawTab->osnapOnStart());
+ mainWin->settings->setPolarSnapOnStart(drawTab->polarSnapOnStart());
+ mainWin->settings->setPolarTrackOnStart(drawTab->polarTrackOnStart());
+ mainWin->settings->setPolarSnapStartAngle(drawTab->polarSnapStartAngle());
+ mainWin->settings->setPolarSnapIncAngle(drawTab->polarSnapIncAngle());
+
+ mainWin->settings->setLibGSLocation(toolTab->getToolGsLib());
+ mainWin->settings->setEditorLocation(toolTab->getToolEditor());
+ mainWin->settings->setRenderUsingCairo(toolTab->isRenderUsingCairo());
+
+ // Close
+ accept();
+}
+
+
+// Constructor for the application settings tab
+ApplicationTab::ApplicationTab(QWidget *parent)
+ : QWidget(parent)
+{
+ QGroupBox *settingsGroup = new QGroupBox(tr("Settings"));
+
+ saveSizeBox = new QCheckBox(tr("Save window size and position on exit"));
+ saveDirBox = new QCheckBox(tr("Remember working directory"));
+ saveOnPreviewBox = new QCheckBox(tr("Auto save on preview"));
+ monitorOpenFileBox = new QCheckBox(tr("Monitor file for changes"));
+ monitorAutoReloadBox = new QCheckBox(tr("Reload without asking"));
+ autoScaleOnOpenBox = new QCheckBox(tr("Auto scale when opening diagrams"));
+ askAboutObjectsBox = new QCheckBox(tr("Automatically keep objects when reloading"));
+
+ QLabel *resolutionLabel = new QLabel(tr("Default display resolution (dpi):"));
+ resolutionBox = new QSpinBox();
+ resolutionBox->setMinimum(0);
+ resolutionBox->setMaximum(500);
+ resolutionBox->setSingleStep(10);
+
+ QVBoxLayout *settingsLayout = new QVBoxLayout;
+ settingsLayout->addWidget(saveSizeBox);
+ settingsLayout->addWidget(saveDirBox);
+ settingsLayout->addWidget(saveOnPreviewBox);
+ settingsLayout->addWidget(autoScaleOnOpenBox);
+ settingsLayout->addWidget(monitorOpenFileBox);
+ settingsLayout->addWidget(monitorAutoReloadBox);
+ // has become obsolete:
+ // settingsLayout->addWidget(askAboutObjectsBox);
+ settingsLayout->addWidget(resolutionLabel);
+ settingsLayout->addWidget(resolutionBox);
+ settingsGroup->setLayout(settingsLayout);
+
+ QVBoxLayout *mainLayout = new QVBoxLayout;
+ mainLayout->addWidget(settingsGroup);
+ mainLayout->addStretch(1);
+ setLayout(mainLayout);
+
+ connect(monitorOpenFileBox, SIGNAL(stateChanged(int)),
+ this, SLOT(fileMonitorUpdated(int)));
+}
+
+void ApplicationTab::setDPI(int new_dpi)
+{
+ resolutionBox->setValue(new_dpi);
+}
+
+int ApplicationTab::dpi()
+{
+ return(resolutionBox->value());
+}
+
+void ApplicationTab::setAutoScaleOnOpen(bool new_autoscale)
+{
+ autoScaleOnOpenBox->setChecked(new_autoscale);
+}
+
+bool ApplicationTab::autoScaleOnOpen()
+{
+ if (autoScaleOnOpenBox->checkState() == Qt::Checked)
+ return(true);
+ else
+ return(false);
+}
+
+void ApplicationTab::setStoreSize(bool new_storeSize)
+{
+ if (new_storeSize)
+ saveSizeBox->setCheckState(Qt::Checked);
+ else
+ saveSizeBox->setCheckState(Qt::Unchecked);
+
+}
+
+bool ApplicationTab::storeSize()
+{
+ if (saveSizeBox->checkState() == Qt::Checked)
+ return(true);
+ else
+ return(false);
+}
+
+void ApplicationTab::setStoreDir(bool new_storeDir)
+{
+ if (new_storeDir)
+ saveDirBox->setCheckState(Qt::Checked);
+ else
+ saveDirBox->setCheckState(Qt::Unchecked);
+
+}
+
+bool ApplicationTab::storeDir()
+{
+ if (saveDirBox->checkState() == Qt::Checked)
+ return(true);
+ else
+ return(false);
+}
+
+void ApplicationTab::setSaveOnPreview(bool new_save)
+{
+ if (new_save)
+ saveOnPreviewBox->setCheckState(Qt::Checked);
+ else
+ saveOnPreviewBox->setCheckState(Qt::Unchecked);
+
+}
+
+bool ApplicationTab::saveOnPreview()
+{
+ if (saveOnPreviewBox->checkState() == Qt::Checked)
+ return(true);
+ else
+ return(false);
+}
+
+void ApplicationTab::setMonitorOpenFile(bool new_save)
+{
+ if (new_save)
+ monitorOpenFileBox->setCheckState(Qt::Checked);
+ else
+ monitorOpenFileBox->setCheckState(Qt::Unchecked);
+
+}
+
+bool ApplicationTab::monitorOpenFile()
+{
+ if (monitorOpenFileBox->checkState() == Qt::Checked)
+ return(true);
+ else
+ return(false);
+}
+
+void ApplicationTab::setMonitorAutoReload(bool new_save)
+{
+ if (new_save)
+ monitorAutoReloadBox->setCheckState(Qt::Checked);
+ else
+ monitorAutoReloadBox->setCheckState(Qt::Unchecked);
+}
+
+void ApplicationTab::fileMonitorUpdated(int state)
+{
+ monitorAutoReloadBox->setEnabled(state == Qt::Checked);
+}
+
+bool ApplicationTab::monitorAutoReload()
+{
+ if (monitorAutoReloadBox->checkState() == Qt::Checked)
+ return(true);
+ else
+ return(false);
+}
+
+void ApplicationTab::setAskAboutObjects(bool newAsk)
+{
+ if (newAsk)
+ askAboutObjectsBox->setCheckState(Qt::Unchecked);
+ else
+ askAboutObjectsBox->setCheckState(Qt::Checked);
+}
+
+bool ApplicationTab::askAboutObjects()
+{
+ if (askAboutObjectsBox->checkState() == Qt::Unchecked)
+ return(true);
+ else
+ return(false);
+}
+
+// Constructor for the server settings tab
+ServerTab::ServerTab(QWidget *parent)
+ : QWidget(parent)
+{
+ QLabel *portNumLabel = new QLabel(tr("Server port number:"));
+ portNumBox = new QSpinBox();
+ portNumBox->setMaximum(65535);
+ portNumBox->setMinimum(1);
+ portNumBox->setSingleStep(1);
+ // This needs to change to read from the settings!
+ portNumBox->setValue(6667);
+
+ QVBoxLayout *all = new QVBoxLayout();
+ QGridLayout *mainLayout = new QGridLayout();
+ mainLayout->addWidget(portNumLabel,0,0,1,1,Qt::AlignLeft);
+ mainLayout->addWidget(portNumBox,0,1,1,1,Qt::AlignLeft);
+ all->addLayout(mainLayout);
+ all->addStretch(1);
+ setLayout(all);
+}
+
+void ServerTab::setPort(int new_port)
+{
+ portNumBox->setValue(new_port);
+}
+
+int ServerTab::port()
+{
+ return(portNumBox->value());
+}
+
+void ServerTab::setAutoStart(bool new_autoStart)
+{
+ if (new_autoStart)
+ autoStartBox->setCheckState(Qt::Checked);
+ else
+ autoStartBox->setCheckState(Qt::Unchecked);
+}
+
+bool ServerTab::autoStart()
+{
+ if (autoStartBox->checkState() == Qt::Checked)
+ return(true);
+ else
+ return(false);
+}
+
+
+// Constructor for the drawing settings tab
+DrawingTab::DrawingTab(QWidget *parent)
+ : QWidget(parent)
+{
+ QGroupBox *gridSpacingGroup = new QGroupBox(tr("Grid Spacing"));
+ QGroupBox *snapControlGroup = new QGroupBox(tr("Snap Control"));
+
+ QLabel *xLabel = new QLabel(tr("X:"));
+ xBox = new QDoubleSpinBox();
+ xBox->setMaximum(100.0);
+ xBox->setMinimum(0.005);
+ xBox->setDecimals(3);
+ xBox->setSingleStep(0.1);
+
+ QLabel *yLabel = new QLabel(tr("Y:"));
+ yBox = new QDoubleSpinBox();
+ yBox->setMaximum(100.0);
+ yBox->setMinimum(0.005);
+ yBox->setDecimals(3);
+ yBox->setSingleStep(0.1);
+
+
+ equalSpacing = new QCheckBox("Equal spacing");
+ connect(equalSpacing, SIGNAL(toggled(bool)),
+ this, SLOT(equalSpacingToggled(bool)));
+
+
+ QGridLayout *gridSpacingLayout = new QGridLayout;
+ gridSpacingLayout->addWidget(xLabel,0,0,1,1,Qt::AlignLeft);
+ gridSpacingLayout->addWidget(xBox,0,1,1,1,Qt::AlignLeft);
+ gridSpacingLayout->addWidget(yLabel,1,0,1,1,Qt::AlignLeft);
+ gridSpacingLayout->addWidget(yBox,1,1,1,1,Qt::AlignLeft);
+ gridSpacingLayout->addWidget(equalSpacing,2,0,1,5,Qt::AlignLeft);
+ gridSpacingGroup->setLayout(gridSpacingLayout);
+
+ QGridLayout *snapLayout = new QGridLayout;
+
+ gridSnapOnStartBox = new QCheckBox(tr("Start with grid snap enabled"));
+ osnapOnStartBox = new QCheckBox(tr("Start with object snap enabled"));
+ orthoSnapOnStartBox = new QCheckBox(tr("Start with orthogonal snap enabled"));
+ polarSnapOnStartBox = new QCheckBox(tr("Start with polar snap enabled"));
+ polarTrackOnStartBox = new QCheckBox(tr("Start with polar tracking enabled"));
+ QLabel *startLabel = new QLabel(tr("Polar snap start angle:"));
+ QLabel *incLabel = new QLabel(tr("Polar snap increment angle:"));
+ polarSnapStartAngleBox = new QDoubleSpinBox();
+ polarSnapStartAngleBox->setMaximum(360.0);
+ polarSnapStartAngleBox->setMinimum(0.0);
+ polarSnapStartAngleBox->setSingleStep(5.0);
+ polarSnapIncAngleBox = new QDoubleSpinBox();
+ polarSnapIncAngleBox->setMaximum(360.0);
+ polarSnapIncAngleBox->setMinimum(0.0);
+ polarSnapIncAngleBox->setSingleStep(5.0);
+
+ snapLayout->addWidget(osnapOnStartBox,0,0,1,5,Qt::AlignLeft);
+ snapLayout->addWidget(polarSnapOnStartBox,1,0,1,5,Qt::AlignLeft);
+ snapLayout->addWidget(polarTrackOnStartBox,2,0,1,5,Qt::AlignLeft);
+ snapLayout->addWidget(orthoSnapOnStartBox,3,0,1,5,Qt::AlignLeft);
+ snapLayout->addWidget(gridSnapOnStartBox,4,0,1,5,Qt::AlignLeft);
+ snapLayout->addWidget(startLabel,5,0,1,1,Qt::AlignLeft);
+ snapLayout->addWidget(polarSnapStartAngleBox,5,1,1,1,Qt::AlignLeft);
+ snapLayout->addWidget(incLabel,6,0,1,1,Qt::AlignLeft);
+ snapLayout->addWidget(polarSnapIncAngleBox,6,1,1,1,Qt::AlignLeft);
+ snapControlGroup->setLayout(snapLayout);
+
+ QVBoxLayout *layout = new QVBoxLayout;
+ layout->addWidget(gridSpacingGroup);
+ layout->addWidget(snapControlGroup);
+ setLayout(layout);
+}
+
+void DrawingTab::equalSpacingToggled(bool state)
+{
+ yBox->setValue(xBox->value());
+ yBox->setEnabled(!state);
+}
+
+void DrawingTab::setGrid(QPointF newGrid)
+{
+ xBox->setValue(newGrid.x());
+ yBox->setValue(newGrid.y());
+}
+
+void DrawingTab::setEqualGrid(bool state)
+{
+ equalSpacing->setChecked(state);
+}
+
+bool DrawingTab::equalGrid()
+{
+ return(equalSpacing->isChecked());
+}
+
+QPointF DrawingTab::grid()
+{
+ if (equalSpacing->checkState() == Qt::Checked)
+ return(QPointF(xBox->value(),xBox->value()));
+ else
+ return(QPointF(xBox->value(),yBox->value()));
+}
+
+
+//! Set polar snap on start
+void DrawingTab::setPolarSnapOnStart(bool state)
+{
+ if (state)
+ polarSnapOnStartBox->setChecked(Qt::Checked);
+ else
+ polarSnapOnStartBox->setChecked(Qt::Unchecked);
+}
+//! Get polar snap on start
+bool DrawingTab::polarSnapOnStart()
+{
+ if (polarSnapOnStartBox->isChecked())
+ return(true);
+ else
+ return(false);
+}
+
+//! Set polar snap on start
+void DrawingTab::setPolarTrackOnStart(bool state)
+{
+ if (state)
+ polarTrackOnStartBox->setChecked(Qt::Checked);
+ else
+ polarTrackOnStartBox->setChecked(Qt::Unchecked);
+}
+//! Get polar snap on start
+bool DrawingTab::polarTrackOnStart()
+{
+ if (polarTrackOnStartBox->isChecked())
+ return(true);
+ else
+ return(false);
+}
+
+//! Set osnap on start
+void DrawingTab::setOsnapOnStart(bool state)
+{
+ if (state)
+ osnapOnStartBox->setChecked(Qt::Checked);
+ else
+ osnapOnStartBox->setChecked(Qt::Unchecked);
+}
+//! Get osnap on start
+bool DrawingTab::osnapOnStart()
+{
+ if (osnapOnStartBox->isChecked())
+ return(true);
+ else
+ return(false);
+}
+
+//! Set ortho snap on start
+void DrawingTab::setOrthoSnapOnStart(bool state)
+{
+ if (state)
+ orthoSnapOnStartBox->setChecked(Qt::Checked);
+ else
+ orthoSnapOnStartBox->setChecked(Qt::Unchecked);
+}
+//! Get ortho snap on start
+bool DrawingTab::orthoSnapOnStart()
+{
+ if (orthoSnapOnStartBox->isChecked())
+ return(true);
+ else
+ return(false);
+}
+
+//! Set grid snap on start
+void DrawingTab::setGridSnapOnStart(bool state)
+{
+ if (state)
+ gridSnapOnStartBox->setChecked(Qt::Checked);
+ else
+ gridSnapOnStartBox->setChecked(Qt::Unchecked);
+}
+//! Get grid snap on start
+bool DrawingTab::gridSnapOnStart()
+{
+ if (gridSnapOnStartBox->isChecked())
+ return(true);
+ else
+ return(false);
+}
+
+//! Set polar snap start angle
+void DrawingTab::setPolarSnapStartAngle(double angle)
+{
+ polarSnapStartAngleBox->setValue(angle);
+}
+//! Get polar snap start angle
+double DrawingTab::polarSnapStartAngle()
+{
+ return(polarSnapStartAngleBox->value());
+}
+
+//! Set polar snap Inc angle
+void DrawingTab::setPolarSnapIncAngle(double angle)
+{
+ polarSnapIncAngleBox->setValue(angle);
+}
+//! Get polar snap Inc angle
+double DrawingTab::polarSnapIncAngle()
+{
+ return(polarSnapIncAngleBox->value());
+}
+
+ToolTab::ToolTab(QWidget *parent, GLEMainWindow *main) : QWidget(parent)
+{
+ mainWin = main;
+ ToolGsLib = new QLineEdit();
+ ToolEditor = new QLineEdit();
+ GLEVersion = new QLabel();
+ GLEBuildDate = new QLabel();
+ GLETop = new QLineEdit();
+ GsLibVersion = new QLabel();
+ renderUsingCairo = new QCheckBox(tr("Render with the Cairo graphics library"));
+#ifndef HAVE_CAIRO
+ renderUsingCairo->setEnabled(false);
+#endif
+
+ QGridLayout *gle = new QGridLayout();
+ gle->addWidget(GLETop,0,0);
+ GLETop->setReadOnly(true);
+ QPushButton *top_expl = new QPushButton(tr("Explore"));
+ gle->addWidget(top_expl,0,1);
+ connect(top_expl, SIGNAL(clicked()), this, SLOT(exploreGLETop()));
+ gle->setColumnStretch(0, 100);
+
+ QGridLayout *gs = new QGridLayout();
+ gs->addWidget(ToolGsLib,0,0);
+ QPushButton *gs_browse = new QPushButton(tr("Browse"));
+ gs->addWidget(gs_browse,0,1);
+ connect(gs_browse, SIGNAL(clicked()), this, SLOT(browseToolGsLib()));
+ gs->setColumnStretch(0, 100);
+
+ QGridLayout *editor = new QGridLayout();
+ editor->addWidget(ToolEditor,0,0);
+ QPushButton *edit_browse = new QPushButton(tr("Browse"));
+ editor->addWidget(edit_browse,0,1);
+ connect(edit_browse, SIGNAL(clicked()), this, SLOT(browseToolEditor()));
+ editor->setColumnStretch(0, 100);
+
+ QVBoxLayout *layout = new QVBoxLayout();
+ layout->addWidget(GLEVersion);
+ layout->addWidget(GLEBuildDate);
+ layout->addWidget(new QLabel(tr("GLE_TOP:")));
+ layout->addLayout(gle);
+ layout->addWidget(GsLibVersion);
+ layout->addLayout(gs);
+ layout->addWidget(new QLabel(tr("Text editor")));
+ layout->addLayout(editor);
+ layout->addWidget(renderUsingCairo);
+ layout->addStretch(1);
+
+ QHBoxLayout *configLayo = new QHBoxLayout();
+ configLayo->addWidget(new QLabel(tr("Edit GLE's configuration:")));
+ QPushButton *globalConf = new QPushButton(tr("Global"));
+ connect(globalConf, SIGNAL(clicked()), this, SLOT(editGlobalConfig()));
+ configLayo->addWidget(globalConf);
+ QPushButton *userConf = new QPushButton(tr("User"));
+ if (mainWin->getGLEInterface()->getUserConfigLocation() == "") {
+ userConf->setEnabled(false);
+ } else {
+ connect(userConf, SIGNAL(clicked()), this, SLOT(editUserConfig()));
+ }
+ configLayo->addWidget(userConf);
+ configLayo->addStretch(1);
+ QPushButton *findDeps = new QPushButton(tr("Auto Find Software"));
+ connect(findDeps, SIGNAL(clicked()), this, SLOT(findSoftwareDependencies()));
+ configLayo->addWidget(findDeps);
+ layout->addLayout(configLayo);
+
+ setLayout(layout);
+}
+
+void ToolTab::exploreGLETop() {
+ mainWin->showLocalFile(mainWin->getGLETop());
+}
+
+void ToolTab::browseToolGsLib() {
+ QString dir = QGLE::GetDirName(ToolGsLib->text());
+ if (dir.isEmpty()) dir = "/";
+ // don't use stock dialog; otherwise it's impossible to select a framework on MacOS/X
+ QFileDialog dialog(this, tr("Locate the GhostScript library"), dir, QGLE::libraryFilter());
+ dialog.setFileMode(QFileDialog::AnyFile);
+ if (dialog.exec()) {
+ QStringList locs = dialog.selectedFiles();
+ if (locs.size() > 0 && locs[0] != "") {
+ ToolGsLib->setText(locs[0]);
+ }
+ }
+}
+
+void ToolTab::browseToolEditor() {
+ QString dir = QGLE::GetDirName(ToolEditor->text());
+ if (dir.isEmpty()) dir = "/";
+ QString location = QFileDialog::getOpenFileName(this, tr("Locate the executable of your text editor"), dir,
+ QGLE::executableFilter());
+ if (!location.isEmpty()) ToolEditor->setText(location);
+}
+
+void ToolTab::setToolGLE(const QString& vers, const QString& date, const QString& top)
+{
+ GLEVersion->setText(QString("GLE version: ") + vers);
+ GLEBuildDate->setText(QString("GLE build date: ") + date);
+ GLETop->setText(top);
+}
+
+void ToolTab::setToolGsLib(const QString& value, const QString& vers)
+{
+ ToolGsLib->setText(value);
+ GsLibVersion->setText(QString("GhostScript DLL (v") + vers + QString(")"));
+}
+
+void ToolTab::setToolEditor(const QString& value)
+{
+ ToolEditor->setText(value);
+}
+
+void ToolTab::findSoftwareDependencies()
+{
+ SoftwareLocateDialogue dial(mainWin, mainWin->getGLEInterface(), QGLE_SOFT_DIALOG_SEARCH_CANCEL | QGLE_SOFT_DIALOG_SEARCH_MANUAL);
+ dial.setWindowTitle("GLE - Finding Dependencies");
+ dial.print(tr("\nClick 'Search Automatically' to make GLE search common locations for software tools, such as LaTeX and GhostScript.\n"));
+ dial.exec();
+ // Don't forget to restore the console output
+ mainWin->restoreConsoleOutput();
+ if (!dial.isCancel()) {
+ GSLibFunctions* fct = GSLibFunctions::getInstance();
+ setToolGsLib(fct->libGSLocation(), mainWin->getGsLibVersion());
+ if (dial.isConfigModified()) {
+ mainWin->getGLEInterface()->saveRCFile();
+ }
+ }
+}
+
+void ToolTab::editGlobalConfig()
+{
+ QString name = QString::fromUtf8(mainWin->getGLEInterface()->getGLETop());
+ name += QDir::separator();
+ name += tr("glerc");
+ mainWin->openInTextEditor(name);
+}
+
+void ToolTab::editUserConfig()
+{
+ QString name = QString::fromUtf8(mainWin->getGLEInterface()->getUserConfigLocation().c_str());
+ mainWin->openInTextEditor(name);
+}
+
+bool ToolTab::isRenderUsingCairo()
+{
+ return renderUsingCairo->checkState() == Qt::Checked;
+}
+
+void ToolTab::setRenderUsingCairo(bool value)
+{
+ renderUsingCairo->setCheckState(value ? Qt::Checked : Qt::Unchecked);
+}
diff --git a/src/gui/settings_dialogue.h b/src/gui/settings_dialogue.h
new file mode 100644
index 0000000..3b015e2
--- /dev/null
+++ b/src/gui/settings_dialogue.h
@@ -0,0 +1,257 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+#ifndef _SETTINGS_DIALOGUE_H
+#define _SETTINGS_DIALOGUE_H
+
+#include <QDialog>
+#include <QTabWidget>
+#include "mainwindow.h"
+#include "../config.h"
+
+//! Tab used to configure application settings
+class ApplicationTab : public QWidget
+{
+ Q_OBJECT
+
+public:
+ ApplicationTab(QWidget *parent = 0);
+
+ //! Set the DEFAULT resolution
+ void setDPI(int new_dpi);
+ //! Get the DEFAULT resolution
+ int dpi();
+ //! Should we store the application size/position?
+ void setStoreSize(bool new_storeSize);
+ //! Should we store the application size/position?
+ bool storeSize();
+
+ //! Should we store the application working directory?
+ bool storeDir();
+ //! Should we store the application working directory?
+ void setStoreDir(bool new_storeDir);
+
+ //! Should we auto save on preview
+ bool saveOnPreview();
+ //! Should we auto save on preview
+ void setSaveOnPreview(bool new_save);
+
+ //! Should we monitor the open file for changes
+ bool monitorOpenFile();
+ //! Should we monitor the open file for changes
+ void setMonitorOpenFile(bool new_mof);
+
+ //! Should we auto-reload if file changed
+ bool monitorAutoReload();
+ //! Should we auto-reload if file changed
+ void setMonitorAutoReload(bool new_mar);
+
+ //! Should we ask about keeping objects?
+ bool askAboutObjects();
+ //! Should we ask about keeping objects?
+ void setAskAboutObjects(bool newAsk);
+
+ //! Should we auto scale the diagram when opening
+ bool autoScaleOnOpen();
+ //! Should we auto scale the diagram when opening
+ void setAutoScaleOnOpen(bool new_autoscale);
+
+public slots:
+ void fileMonitorUpdated(int state);
+
+private:
+ QSpinBox *resolutionBox;
+ QCheckBox *saveSizeBox;
+ QCheckBox *saveDirBox;
+ QCheckBox *saveOnPreviewBox;
+ QCheckBox *autoScaleOnOpenBox;
+ QCheckBox *monitorOpenFileBox;
+ QCheckBox *monitorAutoReloadBox;
+ QCheckBox *askAboutObjectsBox;
+};
+
+
+//! Tab used to configure server settings
+class ServerTab : public QWidget
+{
+ Q_OBJECT
+
+public:
+ ServerTab(QWidget *parent = 0);
+ //! Set the port number on which to listen
+ void setPort(int new_port);
+ //! Get the port number on which to listen
+ int port();
+ //! Set whether to start the server in preview mode
+ void setAutoStart(bool new_autoStart);
+ //! Get whether to start the server in preview mode
+ bool autoStart();
+
+private:
+ QSpinBox *portNumBox;
+ QCheckBox *autoStartBox;
+};
+
+
+//! Tab used to configure drawing settings
+class DrawingTab : public QWidget
+{
+ Q_OBJECT
+
+public:
+ DrawingTab(QWidget *parent = 0);
+ //! Set the grid spacing
+ void setGrid(QPointF newGrid);
+ //! Get the grid spacing
+ QPointF grid();
+ //! Set whether grid spacing is equal
+ void setEqualGrid(bool state);
+ //! Set whether grid spacing is equal
+ bool equalGrid();
+
+ //! Set polar snap on start
+ void setPolarSnapOnStart(bool state);
+ //! Get polar snap on start
+ bool polarSnapOnStart();
+
+ //! Set polar track on start
+ void setPolarTrackOnStart(bool state);
+ //! Get polar track on start
+ bool polarTrackOnStart();
+
+ //! Set osnap on start
+ void setOsnapOnStart(bool state);
+ //! Get osnap on start
+ bool osnapOnStart();
+
+ //! Set ortho snap on start
+ void setOrthoSnapOnStart(bool state);
+ //! Get ortho snap on start
+ bool orthoSnapOnStart();
+
+ //! Set grid snap on start
+ void setGridSnapOnStart(bool state);
+ //! Get grid snap on start
+ bool gridSnapOnStart();
+
+ //! Set polar snap start angle
+ void setPolarSnapStartAngle(double angle);
+ //! Get polar snap start angle
+ double polarSnapStartAngle();
+
+ //! Set polar snap Inc angle
+ void setPolarSnapIncAngle(double angle);
+ //! Get polar snap Inc angle
+ double polarSnapIncAngle();
+
+private slots:
+ //! Toggle whether the X & Y spacing should be equal
+ void equalSpacingToggled(bool state);
+
+private:
+ QDoubleSpinBox *xBox;
+ QDoubleSpinBox *yBox;
+ QCheckBox *equalSpacing;
+ QCheckBox *osnapOnStartBox;
+ QCheckBox *polarSnapOnStartBox;
+ QCheckBox *polarTrackOnStartBox;
+ QCheckBox *orthoSnapOnStartBox;
+ QCheckBox *gridSnapOnStartBox;
+ QDoubleSpinBox *polarSnapStartAngleBox;
+ QDoubleSpinBox *polarSnapIncAngleBox;
+};
+
+//! Tab used to configure drawing settings
+class ToolTab : public QWidget
+{
+ Q_OBJECT
+
+public:
+ ToolTab(QWidget *parent, GLEMainWindow* main);
+
+ void setToolGLE(const QString& vers, const QString& date, const QString& top);
+ void setToolGsLib(const QString& value, const QString& vers);
+ void setToolEditor(const QString& value);
+
+ inline QString getToolGsLib() { return ToolGsLib->text(); }
+ inline QString getToolEditor() { return ToolEditor->text(); }
+
+ //! Render using Cairo library
+ bool isRenderUsingCairo();
+ void setRenderUsingCairo(bool value);
+
+private slots:
+ void exploreGLETop();
+ void browseToolGsLib();
+ void browseToolEditor();
+ void findSoftwareDependencies();
+ void editGlobalConfig();
+ void editUserConfig();
+
+ private:
+ QLineEdit* GLETop;
+ QLineEdit* ToolGsLib;
+ QLineEdit* ToolEditor;
+
+ QLabel* GLEVersion;
+ QLabel* GLEBuildDate;
+ QLabel* GsLibVersion;
+ GLEMainWindow *mainWin;
+ QCheckBox *renderUsingCairo;
+};
+
+//! Dialogue box used to configure settings
+class SettingsDialogue : public QDialog
+{
+ Q_OBJECT
+
+public:
+ SettingsDialogue(GLEMainWindow *parent);
+
+signals:
+ void defaultResolutionChanged(double newdpi);
+
+private slots:
+ void okClicked();
+
+private:
+ QTabWidget *tabWidget;
+
+ //! Initialise the Application Tab
+ void initApplicationTab();
+ //! Initialise the Server Tab
+ void initServerTab();
+ //! Initialise the Drawing Tab
+ void initDrawingTab();
+ //! Initialise the Tool Tab
+ void initToolTab();
+
+ // The tabs
+ ApplicationTab *appTab;
+ ServerTab *servTab;
+ DrawingTab *drawTab;
+ ToolTab *toolTab;
+
+ // The parent
+ GLEMainWindow *mainWin;
+};
+
+#endif
diff --git a/src/gui/snapline.cpp b/src/gui/snapline.cpp
new file mode 100644
index 0000000..a91d394
--- /dev/null
+++ b/src/gui/snapline.cpp
@@ -0,0 +1,495 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+#include <math.h>
+#include "snapline.h"
+
+
+// The constructor for snap the line object
+SnapLine::SnapLine(double resolution, QSize imageSize, QObject *parent) :
+ GLEComponent(resolution, imageSize, parent)
+{
+ // Make sure the line is updated if a point changes or
+ // the image size changes
+ connect(this, SIGNAL(pointChanged()),
+ this, SLOT(updateLine()));
+ connect(this, SIGNAL(imageChanged()),
+ this, SLOT(updateLine()));
+
+ active = false;
+}
+
+// Update the snap line
+void SnapLine::updateLine()
+{
+ key = QString("%1 %2 %3 %4 %5")
+ .arg(getGLEPoint(StartPoint).x())
+ .arg(getGLEPoint(StartPoint).y())
+ .arg(getGLEPoint(EndPoint).x())
+ .arg(getGLEPoint(EndPoint).y())
+ .arg(getGLEAngle(Angle));
+
+ if (isSet(StartPoint) && isSet(EndPoint) && isSet(Angle))
+ {
+ ready = true;
+ active = true;
+ }
+ else
+ {
+ ready = false;
+ active = false;
+ }
+}
+
+QString SnapLine::getKey()
+{
+ return(key);
+}
+
+bool SnapLine::isEqual(SnapLine sn)
+{
+ if (key == sn.getKey())
+ return(true);
+ else
+ return(false);
+}
+
+bool SnapLine::isEqual(SnapLine *sn)
+{
+ if (key == sn->getKey())
+ return(true);
+ else
+ return(false);
+}
+
+void SnapLine::draw(QPainter *p)
+{
+ if (!isActive())
+ return;
+ p->setPen(QGLE::osnapLinePen());
+ p->drawLine(getQtPoint(StartPoint), getQtPoint(EndPoint));
+}
+
+double SnapLine::distanceToPoint(const QPointF& p, QPointF *nearestPoint)
+{
+ // All calculations in QT coordinates
+ // Distances between start, end and the point
+ double se, sp, ep;
+ QPointF s, e;
+ // Angle between se and sp
+ double pse;
+ // Angle between se and ep
+ double pes;
+
+
+ /****************************************************************************
+ * This calculation is based on the triangle: *
+ * p *
+ * /\ *
+ * / \ *
+ * s<____>e *
+ * *
+ * where s and e are the end points of the line and p is the point that has *
+ * been clicked. If the angle pse (calculated using the cosine rule: a^2 = *
+ * b^2 + c^2 -2.b.c.cosA) is greater than 90º, the distance to the point is *
+ * the same as the line length s-p. Likewise for the angle pes and the *
+ * line length e-p. If both angles are less than 90º, the distance can be *
+ * calculated simply. The shortest distance will be the length of the line *
+ * from p to the line se that meets the line at 90º, thus: *
+ * p *
+ * /| *
+ * / | *
+ * s<__|__e *
+ * The distance is therefore sp*sin(pse). *
+ ****************************************************************************/
+
+ s = getQtPoint(StartPoint);
+ e = getQtPoint(EndPoint);
+
+ se = QGLE::distance(s,e);
+ sp = QGLE::distance(s,p);
+ ep = QGLE::distance(e,p);
+
+ //qDebug() << "Distances: " << se << " " << sp << " " << ep;
+
+ if ((sp == 0.0) || (ep == 0.0))
+ return(0.0);
+
+ if (se == 0.0)
+ return(sp);
+
+ double ac;
+
+ // Calculated the bit inside the 'acos'
+ ac = (se*se + sp*sp - ep*ep)/(2*se*sp);
+ // Make sure it isn't greater than 1
+ if (ac > 1.0)
+ ac = 1.0;
+ else if (ac < -1.0)
+ ac = -1.0;
+ pse = acos(ac);
+
+ // Calculated the bit inside the 'acos'
+ ac = (se*se + ep*ep - sp*sp)/(2*se*ep);
+ // Make sure it isn't greater than 1
+ if (ac > 1.0)
+ ac = 1.0;
+ else if (ac < -1.0)
+ ac = -1.0;
+ pes = acos(ac);
+
+ //qDebug() << "Angles: " << pse << " " << pes;
+
+ if ( pse >= M_PI/2.0 )
+ {
+ if (nearestPoint)
+ *nearestPoint = s;
+ return(sp);
+ }
+ else if ( pes >= M_PI/2.0 )
+ {
+ if (nearestPoint)
+ *nearestPoint = e;
+ return(ep);
+ }
+ else
+ {
+ if (nearestPoint)
+ *nearestPoint = (sp*cos(pse)/se)*(e-s) + s;
+ return(sp*sin(pse));
+ }
+}
+
+// Set a point (start or end in the case of a line)
+void SnapLine::setPoint(int pointChoice, const QPointF& p, bool)
+{
+ QPointF pt;
+ double angle = p.x();
+ switch(pointChoice)
+ {
+ case Angle:
+ if (!isSet(StartPoint))
+ return;
+ pointHash[Angle] = p;
+ // Now we need to know the point at which the line meets
+ // the page border
+
+ switch(QGLE::quadrant(angle))
+ {
+ case 1: // Either top or right border
+ if (hitsTopBorder(&pt))
+ pointHash[EndPoint] = pt;
+ else if (hitsRightBorder(&pt))
+ pointHash[EndPoint] = pt;
+ break;
+
+ case 2: // Either hits top or left border
+ if (hitsTopBorder(&pt))
+ pointHash[EndPoint] = pt;
+ else if (hitsLeftBorder(&pt))
+ pointHash[EndPoint] = pt;
+ break;
+
+ case 3: // Either hits left or bottom border
+ if (hitsBottomBorder(&pt))
+ pointHash[EndPoint] = pt;
+ else if (hitsLeftBorder(&pt))
+ pointHash[EndPoint] = pt;
+ break;
+
+ case 4: // Either hits right or bottom border
+ if (hitsBottomBorder(&pt))
+ pointHash[EndPoint] = pt;
+ else if (hitsRightBorder(&pt))
+ pointHash[EndPoint] = pt;
+ break;
+ }
+ break;
+
+ case EndPoint:
+ case StartPoint:
+ if (isSet(StartPoint) && isSet(EndPoint))
+ {
+ QPointF ang;
+ ang.setX(QGLE::angleBetweenTwoPoints(getGLEPoint(StartPoint), getGLEPoint(EndPoint)));
+ pointHash[Angle] = ang;
+ }
+ pointHash[pointChoice] = QGLE::absQtToGLE(p, dpi, pixmap.height());
+ break;
+
+ }
+ updateLine();
+}
+
+bool SnapLine::hitsRightBorder(QPointF *pt)
+{
+ QPointF p;
+ QPointF sp = getQtPoint(StartPoint);
+ // CHECK THIS!!!!
+ double angle = getGLEAngle(Angle);
+
+ // If the line is vertical, it'll never hit the right border
+ if (fmod(QGLE::radiansToDegrees(angle)-90.0,180.0) == 0.0)
+ return(false);
+
+ // If in quadrant 2 or 3, it'll never hit the right border
+ int q = QGLE::quadrant(angle);
+ if (q == 2)
+ return(false);
+ if (q == 3)
+ return(false);
+
+ p.setX(pixmap.width());
+ p.setY(sp.y()-(pixmap.width()-sp.x())*tan(angle));
+
+ if (QGLE::inOrder(0.0,p.y(),pixmap.height()))
+ {
+ *pt = QGLE::absQtToGLE(p,dpi,pixmap.height());
+ return(true);
+ }
+ return(false);
+
+
+}
+
+bool SnapLine::hitsLeftBorder(QPointF *pt)
+{
+ QPointF p;
+ QPointF sp = getQtPoint(StartPoint);
+ double angle = getGLEAngle(Angle);
+
+ // If the line is vertical, it'll never hit the left border
+ if (fmod(QGLE::radiansToDegrees(angle)-90.0,180.0) == 0.0)
+ return(false);
+
+ int q = QGLE::quadrant(angle);
+ if (q == 1)
+ return(false);
+ if (q == 4)
+ return(false);
+
+ // Since we're looking at the left hand side, lets have
+ // the angle down to the -x axis
+ angle = M_PI - angle;
+
+ p.setX(0.0);
+ p.setY(sp.y() - sp.x()*tan(angle));
+
+ if (QGLE::inOrder(0.0,p.y(),pixmap.height()))
+ {
+ *pt = QGLE::absQtToGLE(p,dpi,pixmap.height());
+ return(true);
+ }
+ return(false);
+}
+
+bool SnapLine::hitsTopBorder(QPointF *pt)
+{
+ QPointF p;
+ QPointF sp = getQtPoint(StartPoint);
+ double angle = getGLEAngle(Angle);
+
+ p.setY(0.0); // This is the top border in Qt coordinates
+
+ // If the line is horizontal, it'll never hit the top border
+ if (fmod(QGLE::radiansToDegrees(angle),180.0) == 0.0)
+ {
+ return(false);
+ }
+
+ // If vertical, it's easy
+ if (QGLE::radiansToDegrees(angle) == 90.0)
+ {
+ p.setX(sp.x());
+ *pt = QGLE::absQtToGLE(p,dpi,pixmap.height());
+ return(true);
+ }
+
+ // If in quadrant 3 or 4, it'll never hit the top border
+ int q = QGLE::quadrant(angle);
+ if (q >= 3)
+ return(false);
+
+ // If in quadrant 2, we want the angle to the -x axis
+ if (q == 2)
+ angle = M_PI - angle;
+
+ if (q == 1)
+ p.setX(sp.x() + sp.y()*tan((M_PI/2.0)-angle));
+ if (q == 2)
+ p.setX(sp.x() - sp.y()*tan((M_PI/2.0)-angle));
+
+ if (QGLE::inOrder(0.0,p.x(),pixmap.width()))
+ {
+ *pt = QGLE::absQtToGLE(p,dpi,pixmap.height());
+ return(true);
+ }
+ return(false);
+}
+
+bool SnapLine::hitsBottomBorder(QPointF *pt)
+{
+ QPointF p;
+ QPointF sp = getQtPoint(StartPoint);
+ double angle = getGLEAngle(Angle);
+
+ p.setY(pixmap.height()); // This is the bottom border in Qt coordinates
+
+ // If the line is horizontal, it'll never hit the bottom border
+ if (fmod(QGLE::radiansToDegrees(angle),180.0) == 0.0)
+ return(false);
+
+ // If vertical, it's easy
+ if (QGLE::radiansToDegrees(angle) == 270.0)
+ {
+ p.setX(sp.x());
+ *pt = QGLE::absQtToGLE(p,dpi,pixmap.height());
+ return(true);
+ }
+
+ // If in quadrant 1 or 2, it'll never hit the top border
+ int q = QGLE::quadrant(angle);
+ if (q <= 2)
+ return(false);
+
+ // If in quadrant 3, we want the angle to the -x axis
+ if (q == 3)
+ angle = angle - M_PI;
+
+ // If in quadrant 4, we want the angle to the +x axis
+ if (q == 4)
+ angle = 2*M_PI - angle;
+
+ if (q == 4)
+ p.setX(sp.x() + (pixmap.height()-sp.y())*tan((M_PI/2)-angle));
+ if (q == 3)
+ p.setX(sp.x() - (pixmap.height()-sp.y())*tan((M_PI/2)-angle));
+
+ if (QGLE::inOrder(0.0,p.x(),pixmap.width()))
+ {
+ *pt = QGLE::absQtToGLE(p,dpi,pixmap.height());
+ return(true);
+ }
+ return(false);
+}
+
+
+QList<QPointF> SnapLine::intersections(double qtm, double qtc, bool vertical)
+{
+ QList<QPointF> pointArray;
+ QPointF sp, ep;
+ QPointF intersect;
+ sp = getQtPoint(StartPoint);
+ ep = getQtPoint(EndPoint);
+ double mym, myc;
+ if (vertical)
+ {
+ // If both lines are vertical, no intersection (or an infinite number)
+ if ((!(sp.x() == ep.x())) && (QGLE::inOrder(sp.x(), qtm, ep.x())))
+ {
+ // Lines intersect
+ intersect = QPointF(qtm, ((qtm-sp.x())/(ep.x()-sp.x()))*(ep.y()-sp.y())+sp.y());
+ pointArray.append(intersect);
+ }
+ }
+ else
+ {
+
+ // Not vertical
+ if (sp.x() == ep.x())
+ {
+ // But this line is!
+ intersect.setX(sp.x());
+ intersect.setY(qtm*sp.x()+qtc);
+ if (QGLE::inOrder(sp.y(),intersect.y(),ep.y()))
+ pointArray.append(intersect);
+ }
+ else
+ {
+ // Neither line is vertical
+ mym = (ep.y()-sp.y())/(ep.x()-sp.x());
+ myc = ep.y() - mym*ep.x();
+
+ intersect.setX((myc-qtc)/(qtm-mym));
+ intersect.setY(mym*intersect.x()+myc);
+
+ if ((QGLE::inOrder(sp.y(),intersect.y(),ep.y())) &&
+ (QGLE::inOrder(sp.x(), intersect.x(), ep.x())))
+ pointArray.append(intersect);
+ }
+ }
+
+ return(pointArray);
+}
+
+QList<QPointF> SnapLine::intersections(QPointF qtp1, QPointF qtp2)
+{
+ double m, c;
+ if (qtp2.x() == qtp1.x())
+ return(intersections(qtp2.x(), 0, true));
+
+ m = (qtp2.y() - qtp1.y())/(qtp2.x()-qtp1.x());
+ c = qtp2.y() - m*qtp2.x();
+
+ return(intersections(m,c,false));
+}
+
+QList<QPointF> SnapLine::intersections(QPointF qtp1, double angle)
+{
+ // This intersection code must determine the intersections in
+ // a particular direction from a start point
+
+ // First get a list based on an infinite line:
+ QPointF qtp2 = qtp1 + QPointF(1.0*cos(angle),1.0*sin(angle));
+ QList<QPointF> allIntersections = intersections(qtp1,qtp2);
+
+ // Now go through the list and determine which are in the right
+ // direction
+ QList<QPointF> correctIntersections;
+ QPointF pt;
+ double ptAngle;
+
+ foreach(pt, allIntersections)
+ {
+ ptAngle = QGLE::angleBetweenTwoPoints(qtp1, pt);
+ if (QGLE::quadrant(ptAngle) == QGLE::quadrant(angle))
+ correctIntersections.append(pt);
+ }
+
+ return(correctIntersections);
+
+}
+
+void SnapLine::deactivate()
+{
+ active = false;
+}
+
+void SnapLine::activate()
+{
+ active = true;
+}
+
+bool SnapLine::isActive()
+{
+ return(active);
+}
+
diff --git a/src/gui/snapline.h b/src/gui/snapline.h
new file mode 100644
index 0000000..38c8e0c
--- /dev/null
+++ b/src/gui/snapline.h
@@ -0,0 +1,83 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+#ifndef _SNAPLINE_H
+#define _SNAPLINE_H
+
+#include "component.h"
+
+class SnapLine : public GLEComponent
+{
+ Q_OBJECT
+
+
+public:
+ enum Points
+ {
+ StartPoint,
+ EndPoint,
+ Angle
+ };
+
+ SnapLine(double resolution, QSize imageSize, QObject *parent = 0);
+
+ bool isEqual(SnapLine sn);
+ bool isEqual(SnapLine *sn);
+
+ QString getKey();
+
+ //! Draw the line on the provided painter
+ void draw(QPainter *p);
+ //! Return the shortest distance between a given point and the line
+ double distanceToPoint(const QPointF& p, QPointF *nearestPoint);
+ //! Set one of the enumerated points
+ void setPoint(int pointChoice, const QPointF& p, bool update = true);
+
+
+ //! Find points where a line intersects the line
+ // If vertical = true, m contains 'x'
+ QList<QPointF> intersections(double qtm, double qtc, bool vertical = false);
+ QList<QPointF> intersections(QPointF qtp1, double angle);
+ QList<QPointF> intersections(QPointF qtp1, QPointF qtp2);
+
+ void deactivate();
+ bool isActive();
+ void activate();
+
+private slots:
+ //! Update the painter path when the resolution or start/end points change
+ void updateLine();
+
+private:
+ bool active;
+ bool ready;
+
+ QString key;
+
+ bool hitsRightBorder(QPointF *pt);
+ bool hitsLeftBorder(QPointF *pt);
+ bool hitsTopBorder(QPointF *pt);
+ bool hitsBottomBorder(QPointF *pt);
+
+};
+
+
+#endif
diff --git a/src/gui/start-qgle.sh b/src/gui/start-qgle.sh
new file mode 100755
index 0000000..c9f0ffa
--- /dev/null
+++ b/src/gui/start-qgle.sh
@@ -0,0 +1,28 @@
+# ***********************************************************************************
+# * QGLE - A Graphical Interface to GLE *
+# * Copyright (C) 2006 A. S. Budden & J. Struyf *
+# * *
+# * This program is free software; you can redistribute it and/or *
+# * modify it under the terms of the GNU General Public License *
+# * as published by the Free Software Foundation; either version 2 *
+# * of the License, or (at your option) any later version. *
+# * *
+# * This program is distributed in the hope that it will be useful, *
+# * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+# * GNU General Public License for more details. *
+# * *
+# * You should have received a copy of the GNU General Public License *
+# * along with this program; if not, write to the Free Software *
+# * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+# * *
+# * Also add information on how to contact you by electronic and paper mail. *
+# ***********************************************************************************
+
+#!/bin/sh
+LD_LIBRARY_PATH=../../build/lib/:$LD_LIBRARY_PATH
+#GLE_TOP=/usr/share/gle/4.0.13-cvs/
+export LD_LIBRARY_PATH
+#export GLE_TOP
+#./qgle
+../../build/bin/qgle
diff --git a/src/gui/text.cpp b/src/gui/text.cpp
new file mode 100644
index 0000000..db00fd0
--- /dev/null
+++ b/src/gui/text.cpp
@@ -0,0 +1,407 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+#include <QtDebug>
+#include "text.h"
+
+// The constructor for the line object
+GLEText::GLEText(double resolution, QSize imageSize, GLEDrawingArea *area) :
+ GLEDrawingObject(resolution, imageSize, area)
+{
+ lastdpi = -1;
+ // Make sure the line is updated if a point changes or
+ // the image size changes
+ connect(this, SIGNAL(pointChanged()),
+ this, SLOT(updateText()));
+ connect(this, SIGNAL(imageChanged()),
+ this, SLOT(resChanged()));
+ connect(this, SIGNAL(propertyChanged(int)),
+ this, SLOT(updateFromProperty(int)));
+
+ amove = false;
+ drawPoint = QPointF(0.0,0.0);
+
+ // More to be added
+ validProperties
+ << Text
+ << FontName
+ << FontStyle
+ << FontSize
+ << Alignment
+ << LineColour;
+ properties[Text] = propertyDescriptions[Text].defaultValue;
+ properties[FontName] = propertyDescriptions[FontName].defaultValue;
+ properties[FontStyle] = propertyDescriptions[FontStyle].defaultValue;
+ properties[FontSize] = propertyDescriptions[FontSize].defaultValue;
+ properties[Alignment] = propertyDescriptions[Alignment].defaultValue;
+ properties[LineColour] = propertyDescriptions[LineColour].defaultValue;
+}
+
+void GLEText::resChanged()
+{
+ if (dpi != lastdpi)
+ {
+ renderPostscript();
+ lastdpi = dpi;
+ }
+ else
+ {
+ updateText();
+ }
+}
+
+void GLEText::createOTracks()
+{
+}
+
+void GLEText::updateFromPropertyNoDirty(int property)
+{
+ GLETextDO* text = (GLETextDO*)getGLEObject();
+ GLEPropertyStore* text_settings = text->getProperties();
+ switch(property)
+ {
+ case Text:
+ case LineColour:
+ case FontName:
+ case FontStyle:
+ case FontSize: {
+ // Font is
+ // fontList[properties[FontName].value<QString>]
+ // (default "rm")
+ GLEInterface* iface = getGLEInterface();
+ QColor color = getProperty(LineColour).value<QColor>();
+ GLEColor* gle_color = text_settings->getColorProperty(GLEDOPropertyColor);
+ gle_color->setRGB255(color.red(), color.green(), color.blue());
+ GLEFont* font = iface->getFont(getProperty(FontName).toInt());
+ font = font->getStyle((GLEFontStyle)getProperty(FontStyle).toInt());
+ text_settings->setFontProperty(GLEDOPropertyFont, font);
+ text_settings->setRealProperty(GLEDOPropertyFontSize, getProperty(FontSize).toDouble());
+ text->setText(getProperty(Text).toString().toUtf8());
+ text->render(iface);
+ // Get the bounding box (important!)
+ text->getPSBoundingBox(&rect);
+ // Now we need to pass this to the ghostscript renderer...
+ renderPostscript();
+ break;
+ }
+ case Alignment: {
+ text_settings->setIntProperty(GLEDOPropertyJustify, getProperty(GLEText::Alignment).toInt());
+ updateText();
+ break;
+ }
+ default:
+ updateText();
+ }
+}
+
+void GLEText::renderPostscript()
+{
+ QImage img;
+ GLETextDO* text = (GLETextDO*)getGLEObject();
+ drawingArea->renderPostscript(text->getPostScriptCode(), rect, dpi, &img);
+ renderedText = QPixmap::fromImage(img);
+ updateText();
+}
+
+void GLEText::updateFromProperty(int property)
+{
+ if (property == Text) {
+ GLETextDO* text = (GLETextDO*)getGLEObject();
+ text->setModified(true);
+ }
+ updateFromPropertyNoDirty(property);
+ ((GLEDrawingArea*)parent())->setDirtyAndSave();
+}
+
+// Update the painter path
+void GLEText::updateText()
+{
+ // Only do this if both the start and end have been set
+ GLETextDO* text = (GLETextDO*)getGLEObject();
+ if (isSet(ReferencePoint) && text != NULL)
+ {
+ // This is guaranteed to have been created in the constructor
+ // of GLEDrawingObject
+ delete(paintPath);
+ // Create a new path starting at lineStart
+ paintPath = new QPainterPath();
+ QPointF qtText = getQtPoint(ReferencePoint);
+ QPointF qtRelative;
+ QPointF refPt;
+
+ // Update GLE object
+ text->setPosition(QGLE::QPointFToGLEPoint(getGLEPoint(ReferencePoint)));
+ text->setText(getProperty(Text).toString().toUtf8());
+
+ int alignProp = getProperty(Alignment).toInt();
+
+ // Now work out the point at which the object is drawn:
+ switch(alignProp)
+ {
+ case GLEJustifyTL:
+ refPt = QPointF(0.0, -rect.getYMax());
+ break;
+
+ case GLEJustifyTR:
+ refPt = QPointF(rect.getXMax(), -rect.getYMax());
+ break;
+
+ case GLEJustifyBL:
+ refPt = QPointF(0.0, 0.0);
+ break;
+
+ case GLEJustifyBR:
+ refPt = QPointF(rect.getXMax(), 0.0);
+ break;
+
+ case GLEJustifyLC:
+ refPt = QPointF(0.0, -rect.getYMax()/2.0);
+ break;
+
+ case GLEJustifyRC:
+ refPt = QPointF(rect.getXMax(), -rect.getYMax()/2.0);
+ break;
+
+ case GLEJustifyTC:
+ refPt = QPointF(rect.getXMax()/2.0, -rect.getYMax());
+ break;
+
+ case GLEJustifyBC:
+ refPt = QPointF(rect.getXMax()/2.0, 0.0);
+ break;
+
+ case GLEJustifyLeft:
+ refPt = QPointF(0.0, -text->getBaseLine());
+ break;
+
+ case GLEJustifyRight:
+ refPt = QPointF(rect.getXMax(), -text->getBaseLine());
+ break;
+
+ case GLEJustifyCenter:
+ refPt = QPointF(rect.getXMax()/2.0, -text->getBaseLine());
+ break;
+
+ case GLEJustifyCC:
+ default: // Case 0: CC
+ // Centre point is at rect.getXMax()/2, rect.getYMax()/2
+ // in GLE coordinates. Therefore, the point at which to
+ // draw the pixmap is the reference point minus the
+ // X & Y values in Qt coordinates...
+ refPt = QPointF(rect.getXMax()/2.0,
+ -rect.getYMax()/2.0);
+ }
+ qtRelative = QGLE::relGLEToQt(refPt, dpi);
+ QPointF offset(-GS_OFFSET*dpi,GS_OFFSET*dpi-renderedText.height());
+ drawPoint = qtText - qtRelative + offset;
+
+ // This needs to be changed to use the bounding box
+ // of the string
+ QSizeF qtSize;
+ qtSize.setWidth(QGLE::relGLEToQt(rect.getXMax(), dpi));
+ qtSize.setHeight(QGLE::relGLEToQt(rect.getYMax(), dpi));
+ // The space from the top of the image is the following:
+ double yoffs = renderedText.height()-rect.getYMax()*dpi/CM_PER_INCH-GS_OFFSET*dpi;
+ paintPath->addRect(QRectF(drawPoint.x()+GS_OFFSET*dpi,
+ drawPoint.y()+yoffs,
+ qtSize.width(),
+ qtSize.height()));
+
+ osnapHandles.clear();
+ osnapHandles.append(QPair<QPointF,int>(qtText,QGLE::CentreSnap));
+ }
+}
+
+void GLEText::addRelativeOSnaps(QPointF p)
+{
+ UNUSED_ARG(p);
+}
+
+void GLEText::draw(QPainter *p)
+{
+ // This needs to be changed to plot an image object
+ p->drawPixmap(drawPoint, renderedText);
+ // QGLE::drawCross(p, getQtPoint(ReferencePoint), AMOVE_LENGTH, pen());
+}
+
+QList<QPointF> GLEText::getTangents(QPointF p)
+{
+ QList<QPointF> empty;
+ UNUSED_ARG(p);
+ return(empty);
+}
+
+bool GLEText::hasTangents()
+{
+ return(false);
+}
+
+QList<QPointF> GLEText::getPerpendiculars(QPointF p)
+{
+ QList<QPointF> empty;
+ UNUSED_ARG(p);
+ return(empty);
+}
+
+bool GLEText::hasPerpendiculars()
+{
+ return(false);
+}
+
+// Set a point (start or end in the case of a line)
+void GLEText::setPoint(int pointChoice, const QPointF& p, bool update)
+{
+ switch(pointChoice)
+ {
+ case ReferencePoint:
+ pointHash[pointChoice] = QGLE::absQtToGLE(p, dpi, pixmap.height());
+ break;
+ }
+ if (update) updateText();
+}
+
+QList<QPointF> GLEText::intersections(double qtm, double qtc, bool vertical)
+{
+ UNUSED_ARG(qtm);
+ UNUSED_ARG(qtc);
+ UNUSED_ARG(vertical);
+ return QList<QPointF>();
+}
+
+QList<QPointF> GLEText::intersections(QPointF qtp1, QPointF qtp2)
+{
+ UNUSED_ARG(qtp1);
+ UNUSED_ARG(qtp2);
+ return QList<QPointF>();
+}
+
+QList<QPointF> GLEText::intersections(QPointF qtp1, double angle)
+{
+ UNUSED_ARG(qtp1);
+ UNUSED_ARG(angle);
+ return QList<QPointF>();
+}
+
+bool GLEText::isInside(QPointF p)
+{
+ return(paintPath->contains(p));
+}
+
+double GLEText::nearestOSnap(const QPointF& p, QPointF *osnap)
+{
+ return distanceToPoint(p, osnap);
+}
+
+double GLEText::distanceToPoint(const QPointF& p, QPointF *nearestPoint)
+{
+ GLERectangle box, bbox;
+ double minDist = 1e300;
+ if (nearestPoint != NULL) *nearestPoint = p;
+ box.copy(&rect);
+ box.translate(CM_PER_INCH/72, CM_PER_INCH/72);
+ box.scale(dpi/CM_PER_INCH);
+ box.subtractYFrom(renderedText.height());
+ box.translate(drawPoint.x(), drawPoint.y());
+ box.normalize();
+ GLETextDO* text = (GLETextDO*)getGLEObject();
+ double baseline = text->getBaseLine()*dpi/CM_PER_INCH;
+ bbox.copy(&box);
+ bbox.grow(MAX_SELECT_DISTANCE);
+ if (bbox.contains(p.x(), p.y())) {
+ distanceToPointUpdate(box.getXMin(), box.getYMin(), p, &minDist, nearestPoint);
+ distanceToPointUpdate(box.getXMax(), box.getYMin(), p, &minDist, nearestPoint);
+ distanceToPointUpdate(box.getXMin(), box.getYMax(), p, &minDist, nearestPoint);
+ distanceToPointUpdate(box.getXMax(), box.getYMax(), p, &minDist, nearestPoint);
+ distanceToPointUpdate(box.getXMin(), box.getYMid(), p, &minDist, nearestPoint);
+ distanceToPointUpdate(box.getXMax(), box.getYMid(), p, &minDist, nearestPoint);
+ distanceToPointUpdate(box.getXMid(), box.getYMin(), p, &minDist, nearestPoint);
+ distanceToPointUpdate(box.getXMid(), box.getYMax(), p, &minDist, nearestPoint);
+ distanceToPointUpdate(box.getXMid(), box.getYMid(), p, &minDist, nearestPoint);
+ distanceToPointUpdate(box.getXMin(), box.getYMax()-baseline, p, &minDist, nearestPoint);
+ distanceToPointUpdate(box.getXMax(), box.getYMax()-baseline, p, &minDist, nearestPoint);
+ distanceToPointUpdate(box.getXMid(), box.getYMax()-baseline, p, &minDist, nearestPoint);
+ return 0.0;
+ }
+ return minDist;
+}
+
+//! Set the reference point (tl,bl,tc,bc,tr,br,...)
+bool GLEText::trySetReferencePoint(const QPointF& pt, double x, double y, GLEJustify just, double* minDist)
+{
+ double dist = QGLE::distance(x, y, pt);
+ if (dist < MAX_SELECT_DISTANCE && dist < *minDist)
+ {
+ *minDist = dist;
+ setProperty(Alignment, just);
+ GLETextDO* text = (GLETextDO*)getGLEObject();
+ text->setIntProperty(GLEDOPropertyJustify, just);
+ setPoint(ReferencePoint, pt);
+ updateText();
+ return true;
+ }
+ return false;
+}
+
+//! Set the reference point (tl,bl,tc,bc,tr,br,...)
+bool GLEText::setReferencePoint(const QPointF& pt)
+{
+ GLERectangle box;
+ bool modified = false;
+ double minDist = 1e300;
+ box.copy(&rect);
+ box.translate(CM_PER_INCH/72, CM_PER_INCH/72);
+ box.scale(dpi/CM_PER_INCH);
+ box.subtractYFrom(renderedText.height());
+ box.translate(drawPoint.x(), drawPoint.y());
+ box.normalize();
+ GLETextDO* text = (GLETextDO*)getGLEObject();
+ double baseline = text->getBaseLine()*dpi/CM_PER_INCH;
+ modified |= trySetReferencePoint(pt, box.getXMin(), box.getYMin(), GLEJustifyTL, &minDist);
+ modified |= trySetReferencePoint(pt, box.getXMax(), box.getYMin(), GLEJustifyTR, &minDist);
+ modified |= trySetReferencePoint(pt, box.getXMin(), box.getYMax(), GLEJustifyBL, &minDist);
+ modified |= trySetReferencePoint(pt, box.getXMax(), box.getYMax(), GLEJustifyBR, &minDist);
+ modified |= trySetReferencePoint(pt, box.getXMin(), box.getYMid(), GLEJustifyLC, &minDist);
+ modified |= trySetReferencePoint(pt, box.getXMax(), box.getYMid(), GLEJustifyRC, &minDist);
+ modified |= trySetReferencePoint(pt, box.getXMid(), box.getYMin(), GLEJustifyTC, &minDist);
+ modified |= trySetReferencePoint(pt, box.getXMid(), box.getYMax(), GLEJustifyBC, &minDist);
+ modified |= trySetReferencePoint(pt, box.getXMid(), box.getYMid(), GLEJustifyCC, &minDist);
+ modified |= trySetReferencePoint(pt, box.getXMin(), box.getYMax()-baseline, GLEJustifyLeft, &minDist);
+ modified |= trySetReferencePoint(pt, box.getXMax(), box.getYMax()-baseline, GLEJustifyRight, &minDist);
+ modified |= trySetReferencePoint(pt, box.getXMid(), box.getYMax()-baseline, GLEJustifyCenter, &minDist);
+ return modified;
+}
+
+void GLEText::moveBy(QPointF offset)
+{
+ pointHash.clear();
+ // Moves relative to storedPointHash
+ QPointF start = getQtPoint(ReferencePoint, true);
+ setPoint(ReferencePoint, start + offset);
+}
+
+void GLEText::rotateBy(double radians)
+{
+ // TODO: Also rotate the text.
+ pointHash.clear();
+ // Moves relative to storedPointHash
+ QPointF start = getQtPoint(ReferencePoint, true);
+ setPoint(ReferencePoint, QGLE::rotateAboutPoint(start, radians, basePoint));
+}
diff --git a/src/gui/text.h b/src/gui/text.h
new file mode 100644
index 0000000..326f04f
--- /dev/null
+++ b/src/gui/text.h
@@ -0,0 +1,89 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+#ifndef _GLETEXT_H
+#define _GLETEXT_H
+
+#include "drawingobject.h"
+
+//! Class describing a text drawing object
+class GLEText : public GLEDrawingObject
+{
+ Q_OBJECT
+
+public:
+
+ //! Enumeration of the points needed to draw a text object
+ enum Points
+ {
+ ReferencePoint
+ };
+
+ //! Constructor used for initialising variables and connections
+ GLEText(double resolution, QSize imageSize, GLEDrawingArea* area);
+
+ //! Draw the text on the provided painter
+ void draw(QPainter *p);
+ //! Return the shortest distance between a given point and the text object
+ double distanceToPoint(const QPointF& p, QPointF *nearestPoint);
+ double nearestOSnap(const QPointF& p, QPointF *osnap);
+ //! Set one of the enumerated points
+ void setPoint(int pointChoice, const QPointF& p, bool update = true);
+ void addRelativeOSnaps(QPointF p);
+
+ //! Find points where a line intersects the text string (there are none)
+ // If vertical = true, m contains 'x'
+ QList<QPointF> intersections(double qtm, double qtc, bool vertical = false);
+ QList<QPointF> intersections(QPointF qtp1, double angle);
+ QList<QPointF> intersections(QPointF qtp1, QPointF qtp2);
+ QList<QPointF> getTangents(QPointF p);
+ bool hasTangents();
+ QList<QPointF> getPerpendiculars(QPointF p);
+ bool hasPerpendiculars();
+
+ //! Is the point inside the object (for a text string, always false)
+ bool isInside(QPointF p);
+
+ //! Set the reference point (tl,bl,tc,bc,tr,br,...)
+ bool setReferencePoint(const QPointF& pt);
+ bool trySetReferencePoint(const QPointF& pt, double x, double y, GLEJustify just, double* minDist);
+
+ void moveBy(QPointF offset);
+ void rotateBy(double radians);
+ void createOTracks();
+ void updateFromPropertyNoDirty(int property);
+ void renderPostscript();
+public slots:
+ void resChanged();
+
+private slots:
+ //! Update the painter path when the resolution or start/end points change
+ void updateText();
+ void updateFromProperty(int property);
+
+private:
+ QPixmap renderedText;
+ QPointF drawPoint;
+ GLERectangle rect;
+ double lastdpi;
+};
+
+#endif
diff --git a/src/gui/variantdelegate.cpp b/src/gui/variantdelegate.cpp
new file mode 100644
index 0000000..a6b8136
--- /dev/null
+++ b/src/gui/variantdelegate.cpp
@@ -0,0 +1,413 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+#include "variantdelegate.h"
+#include "propertymodel.h"
+#include "colourpicker.h"
+#include "qgle_statics.h"
+
+VariantDelegate::VariantDelegate(QObject *parent)
+ : QItemDelegate(parent)
+{
+}
+
+QWidget *VariantDelegate::createEditor(QWidget *parent,
+ const QStyleOptionViewItem&,
+ const QModelIndex &index) const
+{
+ GLEPropertyModel *model = (GLEPropertyModel *) index.model();
+ QVariant entry = model->data(index, Qt::DisplayRole);
+ GLEDrawingObjectProperty property = model->getFullProperty(index);
+
+ // Get the requested entry details
+ if (index.column() == 0)
+ return(new QLabel(entry.toString(), parent));
+
+ QDoubleSpinBox *doubleSpinBox;
+ QLineEdit *lineEditor;
+ QComboBox *comboBox;
+ ColourPicker *colourPicker;
+ QVariant subentry;
+ QString listEntry;
+ QVariantMap entries;
+ QList<QVariant> listentries;
+
+ switch(entry.type())
+ {
+ case QVariant::Double:
+ doubleSpinBox = new QDoubleSpinBox(parent);
+ doubleSpinBox->setDecimals(3);
+ doubleSpinBox->installEventFilter(const_cast<VariantDelegate*>(this));
+ return(doubleSpinBox);
+ break;
+
+ case QVariant::Int:
+ if (property.validValues.type() == QVariant::List)
+ {
+ listentries = property.validValues.value<QList<QVariant> >();
+ comboBox = new QComboBox(parent);
+ comboBox->setEditable(false);
+ for (int i = 0; i < listentries.size(); i++) {
+ comboBox->addItem(listentries[i].toString(), QVariant(i));
+ }
+ comboBox->installEventFilter(const_cast<VariantDelegate*>(this));
+ return(comboBox);
+ }
+ else if (property.validValues.type() == QVariant::Map)
+ {
+ entries = property.validValues.value<QVariantMap>();
+ comboBox = new QComboBox(parent);
+ comboBox->setEditable(false);
+ foreach(listEntry, entries.keys())
+ {
+ comboBox->addItem(listEntry, entries[listEntry]);
+ }
+ comboBox->installEventFilter(const_cast<VariantDelegate*>(this));
+ return(comboBox);
+ }
+ break;
+
+ case QVariant::String:
+ lineEditor = new QLineEdit(parent);
+ lineEditor->installEventFilter(const_cast<VariantDelegate*>(this));
+ return(lineEditor);
+ break;
+
+ case QVariant::Color:
+ colourPicker = new ColourPicker(parent, (VariantDelegate*)this);
+ colourPicker->setColour(entry.value<QColor>());
+ colourPicker->installEventFilter(const_cast<VariantDelegate*>(this));
+ colourPicker->showPopup();
+ return(colourPicker);
+ break;
+
+ case QVariant::List:
+ subentry = entry.value<QVariantList>().at(0);
+ switch(subentry.type())
+ {
+ case QVariant::Color:
+ colourPicker = new ColourPicker(parent, (VariantDelegate*)this);
+ colourPicker->setColour();
+ colourPicker->installEventFilter(const_cast<VariantDelegate*>(this));
+ colourPicker->showPopup();
+ return(colourPicker);
+ break;
+ default:
+ break;
+ }
+ break;
+
+ default:
+ return(new QLabel(entry.toString(), parent));
+ }
+ return(new QLabel());
+}
+
+void VariantDelegate::setEditorData(QWidget *editor,
+ const QModelIndex &index) const
+{
+ GLEPropertyModel *model = (GLEPropertyModel *) index.model();
+ QVariant value = model->data(index, Qt::DisplayRole);
+ GLEDrawingObjectProperty property = model->getFullProperty(index);
+
+
+ if (index.column() == 0)
+ return;
+
+ QDoubleSpinBox *doubleSpinBox;
+ QComboBox *comboBox;
+ QLineEdit *lineEditor;
+ ColourPicker *colourPicker;
+ QVariant subentry;
+
+ switch(value.type())
+ {
+ case QVariant::Double:
+ doubleSpinBox = static_cast<QDoubleSpinBox*>(editor);
+ doubleSpinBox->setValue(value.value<double>());
+ break;
+
+ case QVariant::Int:
+ if (property.validValues.type() == QVariant::List)
+ {
+ // This is going to need to be changed for
+ // items with a list of valid values
+ comboBox = static_cast<QComboBox*>(editor);
+ comboBox->setCurrentIndex(value.value<int>());
+ }
+ else if (property.validValues.type() == QVariant::Map)
+ {
+ comboBox = static_cast<QComboBox*>(editor);
+ // TODO: The following line causes a segmentation fault (on findData())
+ comboBox->setCurrentIndex(comboBox->findData(value.value<int>()));
+ }
+ break;
+
+ case QVariant::String:
+ lineEditor = static_cast<QLineEdit*>(editor);
+ lineEditor->setText(value.value<QString>());
+ break;
+
+ case QVariant::Color:
+ colourPicker = static_cast<ColourPicker*>(editor);
+ colourPicker->setColour(value.value<QColor>());
+ break;
+
+ case QVariant::List:
+ subentry = value.value<QVariantList>().at(0);
+ switch(subentry.type())
+ {
+ case QVariant::Color:
+ colourPicker = static_cast<ColourPicker*>(editor);
+ colourPicker->setColour();
+ break;
+ default:
+ break;
+ }
+ break;
+
+ default:
+ return;
+ }
+}
+
+void VariantDelegate::setModelData(QWidget *editor,
+ QAbstractItemModel *model,
+ const QModelIndex &index) const
+{
+ GLEPropertyModel *glemodel = (GLEPropertyModel *) index.model();
+ QVariant entry = glemodel->data(index, Qt::DisplayRole);
+ GLEDrawingObjectProperty property = glemodel->getFullProperty(index);
+
+
+ if (index.column() == 0)
+ return;
+
+ QDoubleSpinBox *doubleSpinBox;
+ QComboBox *comboBox;
+ QLineEdit *lineEditor;
+ ColourPicker *colourPicker;
+ double value;
+ int integerVal;
+ QVariant subentry;
+
+ switch(entry.type())
+ {
+ case QVariant::Double:
+ doubleSpinBox = static_cast<QDoubleSpinBox*>(editor);
+ doubleSpinBox->interpretText();
+ value = doubleSpinBox->value();
+ model->setData(index, value);
+ break;
+
+ case QVariant::Int:
+ if (property.validValues.type() == QVariant::List)
+ {
+ // This is going to need to be changed for
+ // items with a list of valid values
+ comboBox = static_cast<QComboBox*>(editor);
+ integerVal = comboBox->currentIndex();
+ model->setData(index, integerVal);
+ }
+ else if (property.validValues.type() == QVariant::Map)
+ {
+ comboBox = static_cast<QComboBox*>(editor);
+ integerVal = comboBox->itemData(comboBox->currentIndex()).value<int>();
+ model->setData(index, integerVal);
+ }
+ break;
+
+ case QVariant::String:
+ lineEditor = static_cast<QLineEdit*>(editor);
+ model->setData(index, lineEditor->text());
+ break;
+
+ case QVariant::Color:
+ colourPicker = static_cast<ColourPicker*>(editor);
+ // if (colourPicker->hasChanged())
+ model->setData(index, colourPicker->getColour());
+ break;
+
+
+ case QVariant::List:
+ subentry = entry.value<QVariantList>().at(0);
+ switch(subentry.type())
+ {
+ case QVariant::Color:
+ colourPicker = static_cast<ColourPicker*>(editor);
+ //if (colourPicker->hasChanged())
+ model->setData(index, colourPicker->getColour());
+ break;
+ default:
+ break;
+ }
+ break;
+
+
+
+
+ default:
+ return;
+ }
+}
+
+void VariantDelegate::updateEditorGeometry(QWidget *editor,
+ const QStyleOptionViewItem &option,
+ const QModelIndex&) const
+{
+ editor->setGeometry(option.rect);
+}
+
+void VariantDelegate::paint(QPainter *painter,
+ const QStyleOptionViewItem &option,
+ const QModelIndex &index) const
+{
+ double x,y,width,height;
+ int intVal;
+ QColor colour;
+ QPixmap colourSample;
+ QString text;
+ QString str;
+
+ GLEPropertyModel *glemodel = (GLEPropertyModel *) index.model();
+ QVariant entry = glemodel->data(index, Qt::DisplayRole);
+ GLEDrawingObjectProperty property = glemodel->getFullProperty(index);
+ QVariant subentry;
+ QVariantMap entries;
+ QList<QVariant> listentries;
+
+ if (index.column() == 1)
+ {
+ QStyleOptionViewItem myOption = option;
+ switch(entry.type())
+ {
+ case QVariant::Double:
+ text = QString("%1").arg(entry.value<double>());
+ myOption.displayAlignment = Qt::AlignLeft | Qt::AlignVCenter;
+ drawDisplay(painter, myOption, myOption.rect, text);
+ drawFocus(painter, myOption, myOption.rect);
+ break;
+
+ case QVariant::PointF:
+ x = entry.value<QPointF>().x();
+ y = entry.value<QPointF>().y();
+ text = QString("(%1,%2)").arg(x).arg(y);
+ myOption.displayAlignment = Qt::AlignLeft | Qt::AlignVCenter;
+ drawDisplay(painter, myOption, myOption.rect, text);
+ drawFocus(painter, myOption, myOption.rect);
+ break;
+
+ case QVariant::SizeF:
+ width = entry.value<QSizeF>().width();
+ height = entry.value<QSizeF>().height();
+ text = QString("(%1x%2)")
+ .arg(width).arg(height);
+ myOption.displayAlignment = Qt::AlignLeft | Qt::AlignVCenter;
+ drawDisplay(painter, myOption, myOption.rect, text);
+ drawFocus(painter, myOption, myOption.rect);
+ break;
+
+ case QVariant::Color:
+ colour = entry.value<QColor>();
+ colourSample = QPixmap(10,10);
+ if (colour.isValid())
+ {
+ colourSample.fill(colour);
+ }
+ else
+ {
+ QPen pen;
+ pen.setColor(Qt::black);
+ pen.setWidth(1);
+ QPainter p(&colourSample);
+ colourSample.fill(Qt::white);
+ QGLE::drawBox(&p, colourSample.rect().center(), 4.0, pen);
+ QGLE::drawCross(&p, colourSample.rect().center(), 4.0, pen);
+ }
+ myOption.displayAlignment = Qt::AlignLeft | Qt::AlignVCenter;
+ drawDecoration(painter, myOption, myOption.rect, colourSample);
+ drawFocus(painter, myOption, myOption.rect);
+ break;
+
+ case QVariant::List:
+ subentry = entry.value<QVariantList>().at(0);
+ switch(subentry.type())
+ {
+ case QVariant::Color:
+ colourSample = QPixmap(":images/varyingcolours.png");
+ myOption.displayAlignment = Qt::AlignLeft | Qt::AlignVCenter;
+ drawDecoration(painter, myOption, myOption.rect, colourSample);
+ drawFocus(painter, myOption, myOption.rect);
+ break;
+ default:
+ break;
+ }
+ break;
+
+ case QVariant::Int:
+ if (property.validValues.type() == QVariant::List)
+ {
+ intVal = entry.value<int>();
+ listentries = property.validValues.value<QList<QVariant> >();
+ text = listentries[intVal].toString();
+ myOption.displayAlignment = Qt::AlignLeft | Qt::AlignVCenter;
+ drawDisplay(painter, myOption, myOption.rect, text);
+ drawFocus(painter, myOption, myOption.rect);
+
+ }
+ else if (property.validValues.type() == QVariant::Map)
+ {
+ intVal = entry.value<int>();
+ entries = property.validValues.value<QVariantMap>();
+ text = "Unknown";
+ foreach(str, entries.keys())
+ {
+ if (entries[str] == intVal)
+ {
+ text = str;
+ break;
+ }
+ }
+ myOption.displayAlignment = Qt::AlignLeft | Qt::AlignVCenter;
+ drawDisplay(painter, myOption, myOption.rect, text);
+ drawFocus(painter, myOption, myOption.rect);
+ }
+ else
+ {
+ QItemDelegate::paint(painter, option, index);
+ }
+ break;
+
+ default:
+ QItemDelegate::paint(painter, option, index);
+ }
+
+ }
+ else
+ {
+ QItemDelegate::paint(painter, option, index);
+ }
+}
+
+void VariantDelegate::doneEditingColor(ColourPicker* picker) {
+ commitData(picker);
+ closeEditor(picker);
+}
diff --git a/src/gui/variantdelegate.h b/src/gui/variantdelegate.h
new file mode 100644
index 0000000..d32d0d6
--- /dev/null
+++ b/src/gui/variantdelegate.h
@@ -0,0 +1,50 @@
+/***********************************************************************************
+ * QGLE - A Graphical Interface to GLE *
+ * Copyright (C) 2006 A. S. Budden & J. Struyf *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ * *
+ * Also add information on how to contact you by electronic and paper mail. *
+ ***********************************************************************************/
+
+#ifndef __VARIANTDELEGATE_H
+#define __VARIANTDELEGATE_H
+
+#include <QtGui>
+
+class ColourPicker;
+
+class VariantDelegate : public QItemDelegate
+{
+ Q_OBJECT
+
+public:
+ VariantDelegate(QObject *parent = 0);
+
+ QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option,
+ const QModelIndex &index) const;
+ void setEditorData(QWidget *editor, const QModelIndex &index) const;
+ void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
+
+ void updateEditorGeometry(QWidget *editor,
+ const QStyleOptionViewItem &option, const QModelIndex &index) const;
+ void paint(QPainter *painter,
+ const QStyleOptionViewItem &option,
+ const QModelIndex &index) const;
+
+ void doneEditingColor(ColourPicker* picker);
+};
+
+#endif
diff --git a/src/lib/Makefile.gcc b/src/lib/Makefile.gcc
new file mode 100644
index 0000000..2e584f1
--- /dev/null
+++ b/src/lib/Makefile.gcc
@@ -0,0 +1,50 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+include ../../config.gcc
+
+ALL = contour.gle ellipse.gle graphutil.gle polarplot.gle simpletree.gle color.gle electronics.gle \
+ feyn.gle piesub.gle stm.gle ziptext.gle barstyles.gle shape.gle
+
+all: $(PROJECT_BINDIR)/gleinc/color.gle
+
+$(PROJECT_BINDIR)/gleinc/color.gle: $(ALL)
+ -mkdir -p $(PROJECT_BINDIR)/gleinc
+ -mkdir -p $(PROJECT_BINDIR)/gleinc/compat
+ -cp -p *.gle $(PROJECT_BINDIR)/gleinc/
+ -cp -p compat/*.gle $(PROJECT_BINDIR)/gleinc/compat/
diff --git a/src/lib/Makefile.os2 b/src/lib/Makefile.os2
new file mode 100644
index 0000000..22c2b11
--- /dev/null
+++ b/src/lib/Makefile.os2
@@ -0,0 +1,48 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+include ../../config.os2
+
+ALL = contour.gle ellipse.gle graphutil.gle polarplot.gle tree1.gle color.gle electronics.gle \
+ feyn.gle piesub.gle stm.gle ziptext.gle barstyles.gle shape.gle
+
+all: $(PROJECT_BINDIR)/lib/color.gle
+
+$(PROJECT_BINDIR)/lib/color.gle: $(ALL)
+ -mkdir -p $(PROJECT_BINDIR)/lib
+ -cp *.gle $(PROJECT_BINDIR)/lib/
diff --git a/src/lib/barcode.gle b/src/lib/barcode.gle
new file mode 100644
index 0000000..0c32a5a
--- /dev/null
+++ b/src/lib/barcode.gle
@@ -0,0 +1,173 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+! Subroutines to draw EAN-13 barcodes
+! Author: Jan Soubusta
+
+x=.04 ! ... narrow line/space width ! tloustka tenke cary/mezery
+y=1.4 ! ... short line length ! vyska cary nad cisly
+y2=y+.2 ! ... long line length ! vyska delsich carek
+bok=10*x ! ... side space ! bocni okraj v ramecku
+dole=1. ! ... bottom space with text ! spodni okraj s textem (popisek)
+dolet=.6 ! ... bottom text distance ! vzdalenost dolniho textu
+hore=.4 ! ... top space ! horni okraj
+sx=2*bok+95*x ! ... total box size ! velikost boxu
+sy=y+dole+hore ! ... -"-
+cypos = .17 ! ... numbers distance from lines ! posun cisel
+text_hei = .4 ! ... test size
+col_bc$="black" ! ... bar color
+
+sub l p a b c d
+ if p>2 then
+ p=p-2
+ z=a
+ a=d
+ d=z
+ z=b
+ b=c
+ c=z
+ end if
+ if p=1 then
+ rmove a*x 0
+ box b*x y nobox fill col_bc$
+ rmove (b+c)*x 0
+ box d*x y nobox fill col_bc$
+ rmove d*x 0
+ else if p=2 then
+ box a*x y nobox fill col_bc$
+ rmove (a+b)*x 0
+ box c*x y nobox fill col_bc$
+ rmove (c+d)*x 0
+ end if
+end sub
+
+sub levy
+ rmove 0 -.2
+ box x y2 nobox fill col_bc$
+ rmove 2*x 0
+ box x y2 nobox fill col_bc$
+ rmove x .2
+end sub
+
+sub centr
+ rmove x -.2
+ box x y2 nobox fill col_bc$
+ rmove 2*x 0
+ box x y2 nobox fill col_bc$
+ rmove 2*x .2
+end sub
+
+sub pravy
+ rmove 0 -.2
+ box x y2 nobox fill col_bc$
+ rmove 2*x 0
+ box x y2 nobox fill col_bc$
+end sub
+
+sub carky p t
+ rmove 3.5*x -cypos
+ write t
+ rmove -3.5*x cypos
+ if t=0 then
+ @l p 1 1 2 3
+ else if t=1 then
+ @l p 1 2 2 2
+ else if t=2 then
+ @l p 2 2 1 2
+ else if t=3 then
+ @l p 1 1 4 1
+ else if t=4 then
+ @l p 2 3 1 1
+ else if t=5 then
+ @l p 1 3 2 1
+ else if t=6 then
+ @l p 4 1 1 1
+ else if t=7 then
+ @l p 2 1 3 1
+ else if t=8 then
+ @l p 3 1 2 1
+ else if t=9 then
+ @l p 2 1 1 3
+ end if
+end sub
+
+begin object bar_code prv lft$ rgt$ tx$
+ set just cc hei .3
+ local schema$
+ if prv=0 then
+ schema$="333333"
+ else if prv=1 then
+ schema$="331311"
+ else if prv=2 then
+ schema$="331131"
+ else if prv=3 then
+ schema$="331113"
+ else if prv=4 then
+ schema$="313311"
+ else if prv=5 then
+ schema$="311331"
+ else if prv=6 then
+ schema$="311133"
+ else if prv=7 then
+ schema$="313131"
+ else if prv=8 then
+ schema$="313113"
+ else
+ schema$="311313"
+ end if
+ box sx sy fill white nostroke
+ rmove bok dole
+ begin origin
+ @levy
+ for i=1 to 6
+ @carky val(seg$(schema$,i,i)) val(seg$(lft$,i,i))
+ next i
+ @centr
+ for i=1 to 6
+ @carky 4 val(seg$(rgt$,i,i))
+ next i
+ @pravy
+ amove -3.5*x -cypos
+ write prv
+ amove 98.5*x -cypos
+ text >
+ amove 47.5*x -dolet
+ set hei text_hei
+ write tx$
+ end origin
+end object
diff --git a/src/lib/barstyles.gle b/src/lib/barstyles.gle
new file mode 100644
index 0000000..9d1479c
--- /dev/null
+++ b/src/lib/barstyles.gle
@@ -0,0 +1,73 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+! Subroutines to draw customized bar plots
+
+bar_colormap_pixels = 200
+bar_gridline_width = 0.01
+
+sub bar_colormap x1 y1 x2 y2 b g
+ amove x1 y1
+ begin clip
+ begin path clip
+ box x2-x1 y2-y1
+ end path
+ colormap y 0 1 0 1 1 bar_colormap_pixels x2-x1 yg(ygmax)-yg(ygmin) color
+ end clip
+ box x2-x1 y2-y1 fill clear
+end sub
+
+sub bar_colormap_palette_labels x1 y1 x2 y2 value palette$ fmt$ hei
+ default hei 0.23
+ if value >= 0 then
+ y1 = y1 + bar_gridline_width
+ y2 = y2 + bar_gridline_width
+ else
+ y1 = y1 - bar_gridline_width
+ y2 = y2 - bar_gridline_width
+ end if
+ amove x1 y1
+ colormap y 0 1 0 1 1 bar_colormap_pixels x2-x1 y2-y1 palette palette$
+ ! draw data labels
+ gsave
+ set just bc hei hei
+ if value < 0 then y2 = yg(0)
+ amove (x1+x2)/2 y2+0.1
+ write format$(value, fmt$)
+ grestore
+end sub
diff --git a/src/lib/color.gle b/src/lib/color.gle
new file mode 100644
index 0000000..ce6e053
--- /dev/null
+++ b/src/lib/color.gle
@@ -0,0 +1,145 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+! Color subroutines
+
+palette_shade_gray_fade = 0.4
+
+sub color_range_horizontal zmin zmax zstep palette$ width height format$ pixels
+! draws a horizontal color range
+ default zstep 1
+ default palette "color"
+ default width abs(xg(xgmax)-xg(xgmin))
+ default height 0.25
+ default format "fix 0"
+ default pixels -1
+ if pixels = -1 then
+ pixels = (zmax-zmin)/zstep
+ end if
+ begin box name cmap
+ if palette$ = "gray" then
+ colormap "x" 0 1 0 1 pixels 1 width height
+ else if palette$ = "color" then
+ colormap "x" 0 1 0 1 pixels 1 width height color
+ else
+ colormap "x" 0 1 0 1 pixels 1 width height palette palette$
+ end if
+ end box
+ set just tc
+ local xp = zmin
+ while xp <= zmax
+ amove pointx(cmap.lc)+(xp-zmin)/(zmax-zmin)*width pointy(cmap.bc)
+ rline 0 -height/3; rmove 0 -height/3; write format$(xp, format$)
+ xp = xp + zstep
+ next
+end sub
+
+sub color_range_vertical zmin zmax zstep palette$ width height format$ pixels
+! draws a vertical color range
+ default zstep 1
+ default palette "color"
+ default width 0.25
+ default height abs(yg(ygmax)-yg(ygmin))
+ default format "fix 0"
+ default pixels -1
+ if pixels = -1 then
+ pixels = (zmax-zmin)/zstep
+ end if
+ begin box name cmap
+ if palette$ = "gray" then
+ colormap "y" 0 1 0 1 1 pixels width height
+ else if palette$ = "color" then
+ colormap "y" 0 1 0 1 1 pixels width height color
+ else
+ colormap "y" 0 1 0 1 1 pixels width height palette palette$
+ end if
+ end box
+ set just lc
+ local xp = zmin
+ while xp <= zmax
+ amove pointx(cmap.rc) pointy(cmap.bc)+(xp-zmin)/(zmax-zmin)*height
+ rline width/3 0; rmove width/3 0; write format$(xp, format$)
+ xp = xp + zstep
+ next
+end sub
+
+sub palette_blue_white_red z
+ ! a custom palette ranging from blue over white to red
+ local r = 0
+ local g = 0
+ local b = 0
+ ! RED
+ if (z > 0.25) and (z <= 0.50) then r = (z-0.25)*4
+ if (z > 0.50) and (z <= 0.75) then r = 1
+ if (z > 0.75) then r = 1-(123/255)*4*(z-0.75)
+ ! GREEN
+ if (z > 0.25) and (z <= 0.50) then g = (z-0.25)*4
+ if (z > 0.50) and (z <= 0.75) then g = 1-4*(z-0.5)
+ if (z > 0.75) then g = 0
+ ! BLUE
+ if (z <= 0.25) then b = 132/255+(123/255)*4*z
+ if (z > 0.25) and (z <= 0.50) then b = 1
+ if (z > 0.50) and (z <= 0.75) then b = 1-4*(z-0.5)
+ if (z > 0.75) then b = 0
+ return rgb(r,g,b)
+end sub
+
+sub palette_blue_purple_red z
+ ! a custom palette ranging from blue over purple to red
+ return rgb(z,0,1-z)
+end sub
+
+sub set_palette_shade_gray_fade fade
+ palette_shade_gray_fade = fade
+end sub
+
+sub set_palette_shade_gray_color red green blue
+ palette_shade_gray_red = red
+ palette_shade_gray_green = green
+ palette_shade_gray_blue = blue
+end sub
+
+sub sgp_color z x
+ local y = palette_shade_gray_fade ! set to 0 to fade completely white, 1 no fade at all
+ return (z*(1-y)+y)*(x/255-1)+1 ! the final +1 hard codes this to fade to white
+end sub
+
+sub palette_shade_gray z
+ ! r, g, b is the color of the gradient which will fade towards white
+ return rgb(sgp_color(z,palette_shade_gray_red), sgp_color(z,palette_shade_gray_green), sgp_color(z,palette_shade_gray_blue))
+end sub
diff --git a/src/lib/compat/colors-gle-4.0.12.gle b/src/lib/compat/colors-gle-4.0.12.gle
new file mode 100644
index 0000000..1e87606
--- /dev/null
+++ b/src/lib/compat/colors-gle-4.0.12.gle
@@ -0,0 +1,164 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+! Colors from GLE 4.0.12 and before
+defcolor "AQUA" #70DB93
+defcolor "AQUAMARINE" #70DB93
+defcolor "BAKERS_CHOCOLATE" #5C3317
+defcolor "BLUE_VIOLET" #9F5F9F
+defcolor "BRASS" #B5A642
+defcolor "BRIGHT_GOLD" #D9D919
+defcolor "BRONZE" #8C7853
+defcolor "BRONZE_II" #A67D3D
+defcolor "BROWN_WEB" #A62A2A
+defcolor "CADET_BLUE" #5F9F9F
+defcolor "COOL_COPPER" #D98719
+defcolor "COPPER" #B87333
+defcolor "CORAL" #FF7F00
+defcolor "CORN_FLOWER_BLUE" #42426F
+defcolor "DARK_BROWN" #5C4033
+defcolor "DARK_GREEN" #2F4F2F
+defcolor "DARK_GREEN_COPPER" #4A766E
+defcolor "DARK_OLIVE_GREEN" #4F4F2F
+defcolor "DARK_ORCHID" #9932CD
+defcolor "DARK_PURPLE" #871F78
+defcolor "DARK_SLATE_BLUE" #6B238E
+defcolor "DARK_SLATE_GRAY" #2F4F4F
+defcolor "DARK_SLATE_GREY" #2F4F4F
+defcolor "DARK_TAN" #97694F
+defcolor "DARK_TURQUOISE" #7093DB
+defcolor "DARK_WOOD" #855E42
+defcolor "DIM_GRAY" #545454
+defcolor "DIM_GREY" #545454
+defcolor "DUSTY_ROSE" #856363
+defcolor "FELDSPAR" #D19275
+defcolor "FIREBRICK" #8E2323
+defcolor "FOREST_GREEN" #228B22
+defcolor "FOREST_GREEN_WEB" #238E23
+defcolor "GOLD" #CD7F32
+defcolor "GOLDENROD" #DBDB70
+defcolor "GRAY" #7F7F7F
+defcolor "GRAY1" #FDFDFD
+defcolor "GRAY10" #C8C8C8
+defcolor "GRAY20" #AFAFAF
+defcolor "GRAY30" #969696
+defcolor "GRAY40" #7D7D7D
+defcolor "GRAY5" #F0F0F0
+defcolor "GRAY50" #646464
+defcolor "GRAY60" #4B4B4B
+defcolor "GRAY70" #323232
+defcolor "GRAY80" #191919
+defcolor "GRAY90" #060606
+defcolor "GRAY_WEB" #C0C0C0
+defcolor "GREEN" #00FF00
+defcolor "GREEN_COPPER" #527F76
+defcolor "GREEN_YELLOW" #93DB70
+defcolor "GREY" #7F7F7F
+defcolor "GREY1" #FDFDFD
+defcolor "GREY10" #C8C8C8
+defcolor "GREY20" #AFAFAF
+defcolor "GREY30" #969696
+defcolor "GREY40" #7D7D7D
+defcolor "GREY5" #F0F0F0
+defcolor "GREY50" #646464
+defcolor "GREY60" #4B4B4B
+defcolor "GREY70" #323232
+defcolor "GREY80" #191919
+defcolor "GREY90" #060606
+defcolor "GREY_WEB" #C0C0C0
+defcolor "HUNTER_GREEN" #215E21
+defcolor "INDIAN_RED" #4E2F2F
+defcolor "KHAKI" #9F9F5F
+defcolor "LAWN_GREEN" #7CFC00
+defcolor "LIGHT_BLUE" #C0D9D9
+defcolor "LIGHT_GRAY" #A8A8A8
+defcolor "LIGHT_GREY" #A8A8A8
+defcolor "LIGHT_STEEL_BLUE" #8F8FBD
+defcolor "LIGHT_WOOD" #E9C2A6
+defcolor "LIME" #00FF01
+defcolor "LIME_GREEN" #32CD32
+defcolor "MANDARIAN_ORANGE" #E47833
+defcolor "MAROON_WEB" #8E236B
+defcolor "MEDIUM_AQUAMARINE" #32CD99
+defcolor "MEDIUM_BLUE" #3232CD
+defcolor "MEDIUM_FOREST_GREEN" #6B8E23
+defcolor "MEDIUM_GOLDENROD" #EAEAAE
+defcolor "MEDIUM_ORCHID" #9370DB
+defcolor "MEDIUM_SEA_GREEN" #426F42
+defcolor "MEDIUM_SLATE_BLUE" #7F00FF
+defcolor "MEDIUM_SPRING_GREEN" #7FFF00
+defcolor "MEDIUM_TURQUOISE" #70DBDB
+defcolor "MEDIUM_VIOLET_RED" #DB7093
+defcolor "MEDIUM_WOOD" #A68064
+defcolor "MIDNIGHT_BLUE" #2F2F4F
+defcolor "NAVY_BLUE" #23238E
+defcolor "NEON_BLUE" #4D4DFF
+defcolor "NEON_PINK" #FF6EC7
+defcolor "NEW_MIDNIGHT_BLUE" #00009C
+defcolor "NEW_TAN" #EBC79E
+defcolor "OLD_GOLD" #CFB53B
+defcolor "ORANGE" #FF7F10
+defcolor "ORANGE_RED" #FF2400
+defcolor "ORANGE_WEB" #FF7F00
+defcolor "ORCHID" #DB70DB
+defcolor "PALE_GREEN" #8FBC8F
+defcolor "PINK_WEB" #BC8F8F
+defcolor "PLUM" #EAADEA
+defcolor "QUARTZ" #D9D9F3
+defcolor "RICH_BLUE" #5959AB
+defcolor "SALMON" #6F4242
+defcolor "SCARLET" #8C1717
+defcolor "SEA_GREEN" #238E68
+defcolor "SEMI_SWEET_CHOCOLATE" #6B4226
+defcolor "SIENNA" #8E6B23
+defcolor "SILVER_WEB" #E6E8FA
+defcolor "SKY_BLUE" #3299CC
+defcolor "SLATE_BLUE" #007FFF
+defcolor "SPICY_PINK" #FF1CAE
+defcolor "SPRING_GREEN" #00FF7F
+defcolor "STEEL_BLUE" #236B8E
+defcolor "SUMMER_SKY" #38B0DE
+defcolor "TAN_COLOR" #008080
+defcolor "TURQUOISE" #ADEAEA
+defcolor "VERY_DARK_BROWN" #5C4033
+defcolor "VERY_LIGHT_GRAY" #CDCDCD
+defcolor "VERY_LIGHT_GREY" #CDCDCD
+defcolor "VIOLET_RED" #CC3299
+defcolor "VIOLET_WEB" #4F2F4F
+defcolor "WHEAT" #D8D8BF
+defcolor "YELLOW_GREEN" #99CC32
diff --git a/src/lib/compatibility.gle b/src/lib/compatibility.gle
new file mode 100644
index 0000000..9503db3
--- /dev/null
+++ b/src/lib/compatibility.gle
@@ -0,0 +1,39 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+include ["0" - "4.0.12"] "compat/colors-gle-4.0.12.gle"
diff --git a/src/lib/contour.gle b/src/lib/contour.gle
new file mode 100644
index 0000000..803970d
--- /dev/null
+++ b/src/lib/contour.gle
@@ -0,0 +1,59 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+! Subroutines to draw contour plots
+
+sub contour_labels file$ format$
+! draws the labels on a contour plot
+!
+! file$ = filename of file with label data
+! fmt$ = format string used to format labels
+
+ set just cc hei 0.25 color blue
+ fopen file$ f1 read
+ until feof(f1)
+ fread f1 x y i v
+ amove xg(x) yg(y)
+ s$ = format$(v, format$)
+ begin box add 0.05 fill white
+ write s$
+ end box
+ write s$
+ next
+ fclose f1
+end sub
diff --git a/src/lib/electronics.gle b/src/lib/electronics.gle
new file mode 100644
index 0000000..81ebb5b
--- /dev/null
+++ b/src/lib/electronics.gle
@@ -0,0 +1,1340 @@
+! Electronic Circuit diagrams with GLE
+! Author: A. S. Budden <abudden at NOSPAMgataki.co.uk>
+
+! Date: 17th August 2007
+! Version: 1.3
+
+! Copyright: Copyright (C) 2005 A. S. Budden
+! Permission is hereby granted to use and distribute this code,
+! with or without modifications, provided that this copyright
+! notice is copied with it. Like anything else that's free,
+! electronics.gle is provided *as is* and comes with no warranty
+! of any kind, either expressed or implied. By using this
+! plugin, you agree that in no event will the copyright
+! holder be liable for any damages resulting from the use
+! of this software.
+
+! Documentation ** gle_electronics.pdf **
+
+! A simple function to draw a grid for reference
+sub drawgrid gridscale
+ default gridscale 1
+ gsave
+ set lwidth 0.005
+ set lstyle 2
+ for i = 0 to pageheight()/gridscale
+ amove 0 i
+ rline pagewidth()/gridscale 0
+ next i
+
+ for i = 0 to pagewidth()/gridscale
+ amove i 0
+ rline 0 pageheight()/gridscale
+ next i
+
+ grestore
+end sub
+
+! Connection point
+sub connection
+ circle 0.1 fill black
+end sub
+
+!===================================
+! Resistors
+!===================================
+
+! Resistor base device
+sub resistor
+ gsave
+ rline 1 0
+ rline 0 0.5
+ rline 2 0
+ rline 0 -1
+ rline -2 0
+ rline 0 0.5
+ rmove 2 0
+ rline 1 0
+ grestore
+end sub
+
+! Resistor base device
+sub rresistor
+ gsave
+ rline 1 0
+ rline 0.125 0.5
+ rline 0.25 -1.0
+ rline 0.25 1.0
+ rline 0.25 -1.0
+ rline 0.25 1.0
+ rline 0.25 -1.0
+ rline 0.25 1.0
+ rline 0.25 -1.0
+ rline 0.125 0.5
+ rline 1 0
+ grestore
+end sub
+
+
+! Horizontal resistor
+sub rresistor_h rlabel$
+ gsave
+ @rresistor
+ rmove 2 0.75
+ set just BC
+ set hei 0.8
+ write rlabel$
+ grestore
+ rmove 4 0
+end sub
+
+! Vertical resistor
+sub rresistor_v rlabel$
+ gsave
+ begin rotate -90
+ @rresistor
+ end rotate
+ rmove 0.75 -2
+ set just LC
+ set hei 0.8
+ write rlabel$
+ grestore
+ rmove 0 -4
+end sub
+
+
+! Horizontal resistor
+sub resistor_h rlabel$
+ gsave
+ @resistor
+ rmove 2 0.75
+ set just BC
+ set hei 0.8
+ write rlabel$
+ grestore
+ rmove 4 0
+end sub
+
+! Vertical resistor
+sub resistor_v rlabel$
+ gsave
+ begin rotate -90
+ @resistor
+ end rotate
+ rmove 0.75 -2
+ set just LC
+ set hei 0.8
+ write rlabel$
+ grestore
+ rmove 0 -4
+end sub
+
+! Horizontal potentiometer
+sub potentiometer_hb rlabel$
+ gsave
+ @resistor
+ rmove 2 -2
+ rline 0 1.5 arrow end
+ rmove 0 1.5
+ set just BC
+ set hei 0.8
+ write rlabel$
+ grestore
+ rmove 4 0
+end sub
+
+! Vertical potentiometer
+sub potentiometer_vr rlabel$
+ gsave
+ begin rotate -90
+ @resistor
+ end rotate
+ rmove 2 -2
+ rline -1.5 0 arrow end
+ rmove -1.5 0
+ set just RC
+ set hei 0.8
+ write rlabel$
+ grestore
+ rmove 0 -4
+end sub
+
+! Horizontal variable resistor
+sub vresistor_h rlabel$
+ gsave
+ @resistor
+ rmove 1 -1
+ rline 2 2 arrow end
+ rmove -1 0
+ set just BC
+ set hei 0.8
+ write rlabel$
+ grestore
+ rmove 4 0
+end sub
+
+! Vertical Variable resistor
+sub vresistor_v rlabel$
+ gsave
+ begin rotate -90
+ @resistor
+ end rotate
+ rmove -1 -3
+ rline 2 2 arrow end
+ rmove 0 -1
+ set just LC
+ set hei 0.8
+ write rlabel$
+ grestore
+ rmove 0 -4
+end sub
+
+!===================================
+! Transistors
+!===================================
+
+! BJT Base
+sub bjt leg direction
+ gsave
+ rline 1 0
+ rmove 0 1
+ rline 0 -2
+ rmove 0 0.5
+ if leg = 1 then
+ if direction = 1 then
+ rline 1 -0.5 arrow end
+ else
+ rline 1 -0.5 arrow start
+ end if
+ rmove -1 1.5
+ rline 1 0.5
+ else
+ rline 1 -0.5
+ rmove -1 1.5
+ if direction = 1 then
+ rline 1 0.5 arrow end
+ else
+ rline 1 0.5 arrow start
+ end if
+ end if
+ grestore
+end sub
+
+! NPN BJT
+sub npn_bjt bjtlabel$
+ gsave
+ bjt 1 1
+ rmove 2 0
+ set just LC
+ set hei 0.8
+ write bjtlabel$
+ grestore
+end sub
+
+! PNP BJT
+sub pnp_bjt bjtlabel$
+ gsave
+ bjt 0 0
+ rmove 2 0
+ set just LC
+ set hei 0.8
+ write bjtlabel$
+ grestore
+end sub
+
+! Base MOSFET
+sub mosfet channel
+ ! 0 is N channel, 1 is P channel
+ gsave
+ rline 1 0
+ rmove 0 1
+ rline 0 -2
+ rmove 0.25 0
+ rline 0 2/4
+ rmove 0 1/4
+ rline 0 2/4
+ rmove 0 1/4
+ rline 0 2/4
+ rmove 0 -1/4
+ rline 0.75 0
+ rline 0 1/4
+ rmove 0 -2
+ rline 0 1/4
+ rline -0.75 0
+ rmove 0.75 0
+ @connection
+ rline 0 3/4
+ if channel = 0 then
+ rline -0.75 0 arrow end
+ else
+ rline -0.75 0 arrow start
+ end if
+ grestore
+end sub
+
+! N-Channel MOSFET
+sub n_mosfet mlabel$
+ gsave
+ mosfet 0
+ rmove 2.5 0
+ set hei 0.8
+ set just LC
+ write mlabel$
+ grestore
+end sub
+
+! P-Channel MOSFET
+sub p_mosfet mlabel$
+ gsave
+ mosfet 1
+ rmove 2.5 0
+ set hei 0.8
+ set just LC
+ write mlabel$
+ grestore
+end sub
+
+! IGBT
+sub igbt igbtlabel$
+ gsave
+ rline 0.75 0
+ rline 0 0.75
+ rmove 0 -0.75
+ rline 0 -0.75
+ rmove 0.25 0.75
+ rline 0 1
+ rmove 0 -1
+ rline 0 -1
+ rmove 0 0.5
+ rline 1 -0.5 arrow end
+ rmove -1 1.5
+ rline 1 0.5
+ rmove 0 -1
+ set hei 0.8
+ set just LC
+ write igbtlabel$
+ grestore
+end sub
+
+!===================================
+! Inductors
+!===================================
+
+! Single coil
+sub coil
+ gsave
+ rmove 0.25 0
+ arc 0.25 0 180
+ grestore
+ rmove 0.5 0
+end sub
+
+! Single double size coil
+sub large_coil dot
+ gsave
+ rmove 0.5 0
+ arc 0.5 0 180
+ if dot = 1 then
+ circle 0.1 fill black
+ end if
+ grestore
+ rmove 1 0
+end sub
+
+! Base inductor
+sub inductor core
+ gsave
+ rline 1 0
+ for i = 1 to 4
+ @coil
+ next i
+ rline 1 0
+ if core = 1 then
+ rmove -1 0.5
+ rline -2 0
+ rmove 0 0.2
+ rline 2 0
+ end if
+ grestore
+end sub
+
+sub large_inductor dot_position
+ gsave
+ if dot_position = 1 then ! Dot at start
+ @large_coil 1
+ else
+ @large_coil 0
+ end if
+ @large_coil 0
+ @large_coil 0
+ if dot_position = 2 then ! Dot at end
+ @large_coil 1
+ else
+ @large_coil 0
+ end if
+ grestore
+end sub
+
+! Horizontal Inductor
+sub inductor_h core ilabel$
+ gsave
+ @inductor core
+ if core = 1 then
+ rmove 2 1
+ else
+ rmove 2 0.5
+ end if
+ set hei 0.8
+ set just BC
+ write ilabel$
+ grestore
+ rmove 4 0
+end sub
+
+! Vertical Inductor
+sub inductor_v core ilabel$
+ gsave
+ begin rotate -90
+ @inductor core
+ end rotate
+ if core = 1 then
+ rmove 1 -2
+ else
+ rmove 0.5 -2
+ end if
+ set hei 0.8
+ set just LC
+ write ilabel$
+ grestore
+ rmove 0 -4
+end sub
+
+! Transformer Base
+sub xformer core type n1$ n2$
+ gsave
+ ! Select type
+ ! 0: no dots
+ ! 1: no invert
+ ! 2: invert
+ if type = 0 then
+ leftdot = 0
+ rightdot = 0
+ end if
+ if type = 1 then
+ leftdot = 1
+ rightdot = 2
+ end if
+ if type = 2 then
+ leftdot = 1
+ rightdot = 1
+ end if
+ begin rotate -90
+ @large_inductor leftdot
+ end rotate
+ rmove 2 -4
+ begin rotate 90
+ @large_inductor rightdot
+ end rotate
+ if core = 1 then
+ rmove -1.2 0
+ rline 0 4
+ rmove 0.4 0
+ rline 0 -4
+ end if
+ grestore
+
+ ! Number of turns
+ gsave
+ rmove 0.25 0.25
+! rmove 0.5 0.5
+ set just BC
+ set hei 0.5
+ write n1$
+ rmove 1.5 0
+ write n2$
+ grestore
+end sub
+
+! Transformer with a double secondary
+sub xformer_dblsecondary type location
+ gsave
+ ! Select type (as xformer)
+ if type = 0 then
+ leftdot = 0
+ rightdot = 0
+ end if
+ if type = 1 then
+ leftdot = 1
+ rightdot = 2
+ end if
+ if type = 2 then
+ leftdot = 1
+ rightdot = 1
+ end if
+ begin rotate -90
+ @large_inductor leftdot
+ end rotate
+
+ ! If location = 0, then balance
+ ! If location = 1, then draw above
+ ! If location = 2, then draw below
+ if location = 0 then
+ rmove 2 -1
+ end if
+ if location = 1 then
+ rmove 2 2
+ end if
+ if location = 2 then
+ rmove 2 -4
+ end if
+
+ ! We are now at the bottom of the top coil
+ begin rotate 90
+ @large_inductor rightdot
+ end rotate
+ rmove 0 -6
+ begin rotate 90
+ @large_inductor rightdot
+ end rotate
+ rmove -1.2 0
+ rline 0 10
+ rmove 0.4 0
+ rline 0 -10
+ grestore
+end sub
+
+
+
+
+!===================================
+! Capacitors
+!===================================
+
+! Base capacitor
+sub capacitor
+ gsave
+ rline 1.75 0
+ rline 0 1
+ rmove 0 -2
+ rline 0 1
+ rmove 0.5 0
+ rline 0 1
+ rmove 0 -2
+ rline 0 1
+ rline 1.75 0
+ grestore
+end sub
+
+! Base polarised capacitor
+sub p_capacitor polarity
+ ! Polarity gives location of + side
+ ! polarity = 0: on left (and therefore top)
+ ! polarity = 1: on right
+ gsave
+ rline 1.5+1/8 0
+ rmove 0 -1
+ if polarity = 1 then
+ box 0.25 2 fill black
+ else
+ box 0.25 2
+ end if
+ rmove 0.5 0
+ if polarity = 1 then
+ box 0.25 2
+ else
+ box 0.25 2 fill black
+ end if
+ rmove 0.25 1
+ rline 1.5+1/8 0
+ grestore
+end sub
+
+! Horizontal L Polarised Capacitor
+sub p_capacitor_hl clabel$
+ gsave
+ @p_capacitor 0
+ rmove 1 0.75
+ rline 0.5 0
+ rmove -0.25 -0.25
+ rline 0 0.5
+ rmove -1.25 -1
+
+ rmove 2 1.25
+ set hei 0.8
+ set just BC
+ write clabel$
+ grestore
+ rmove 4 0
+end sub
+
+! Horizontal R Polarised Capacitor
+sub p_capacitor_hr clabel$
+ gsave
+ @p_capacitor 1
+ rmove 2.75 0.75
+ rline 0.5 0
+ rmove -0.25 -0.25
+ rline 0 0.5
+ rmove -3 -1
+
+ rmove 2 1.25
+ set hei 0.8
+ set just BC
+ write clabel$
+ grestore
+ rmove 4 0
+end sub
+
+! Vertical Top Polarised Capacitor
+sub p_capacitor_vt clabel$
+ gsave
+ begin rotate -90
+ @p_capacitor 0
+ end rotate
+ rmove -1 -1.25
+ rline 0.5 0
+ rmove -0.25 -0.25
+ rline 0 0.5
+ rmove 0.75 1
+
+ rmove 1.25 -2
+ set hei 0.8
+ set just LC
+ write clabel$
+ grestore
+ rmove 0 -4
+end sub
+
+
+! Vertical Bottom Polarised Capacitor
+sub p_capacitor_vb clabel$
+ gsave
+ begin rotate -90
+ @p_capacitor 1
+ end rotate
+ rmove -1 -3
+ rline 0.5 0
+ rmove -0.25 -0.25
+ rline 0 0.5
+ rmove 0.75 2.75
+
+ rmove 1.25 -2
+ set hei 0.8
+ set just LC
+ write clabel$
+ grestore
+ rmove 0 -4
+end sub
+
+
+
+! Horizontal capacitor
+sub capacitor_h clabel$
+ gsave
+ @capacitor
+ rmove 2 1.25
+ set hei 0.8
+ set just BC
+ write clabel$
+ grestore
+ rmove 4 0
+end sub
+
+! Vertical capacitor
+sub capacitor_v clabel$
+ gsave
+ begin rotate -90
+ @capacitor
+ end rotate
+ rmove 1.25 -2
+ set hei 0.8
+ set just LC
+ write clabel$
+ grestore
+ rmove 0 -4
+end sub
+
+! Horizontal varicap
+sub vcapacitor_h clabel$
+ gsave
+ @capacitor
+ rmove 1 -1
+ rline 2 2 arrow end
+ rmove -3 -1
+ rmove 2 1.25
+ set hei 0.8
+ set just BC
+ write clabel$
+ grestore
+ rmove 4 0
+end sub
+
+! Vertical varicap
+sub vcapacitor_v clabel$
+ gsave
+ begin rotate -90
+ @capacitor
+ end rotate
+ rmove -1 -3
+ rline 2 2 arrow end
+ rmove -1 1
+ rmove 1.25 -2
+ set hei 0.8
+ set just LC
+ write clabel$
+ grestore
+ rmove 0 -4
+end sub
+
+!===================================
+! Crystals
+!===================================
+sub crystal
+ crystalgap = 0.25
+ crystalboxw = 0.5
+ crystalleglength = (4-(crystalgap*2 + crystalboxw))/2
+ rline crystalleglength 0
+ rmove 0 1
+ rline 0 -2
+ rmove crystalgap 0
+ box crystalboxw 2
+ rmove crystalboxw+crystalgap 0
+ rline 0 2
+ rmove 0 -1
+ rline crystalleglength 0
+end sub
+
+sub crystal_h label$
+ @crystal
+ gsave
+ rmove -2 1.2
+ set just BC
+ set hei 0.8
+ write label$
+ grestore
+end sub
+
+sub crystal_v label$
+ gsave
+ gsave
+ begin rotate -90
+ @crystal
+ end rotate
+ grestore
+ rmove 1.2 -2
+ set just LC
+ set hei 0.8
+ write label$
+ grestore
+ rmove 0 -4
+end sub
+
+
+!===================================
+! Diodes
+!===================================
+
+DIODE_NORMAL = 0
+DIODE_SCHOTTKY = 1
+DIODE_ZENER = 2
+DIODE_THYRISTOR = 3
+
+! Base diode
+sub diode type
+ default type DIODE_NORMAL
+ gsave
+ rline 1.5 0
+ rline 0 0.5
+ rline 1 -0.5
+ rline -1 -0.5
+ rline 0 0.5
+ rmove 1 -0.5
+ rline 0 1
+ rmove 0 -0.5
+ gsave
+ if type = DIODE_SCHOTTKY then
+ schottky_depth = 0.15
+ schottky_width = 0.25
+ gsave
+ rmove 0 0.5
+ rline schottky_depth 0
+ rline 0 -schottky_width
+ grestore
+ rmove 0 -0.5
+ rline -schottky_depth 0
+ rline 0 schottky_width
+ else if type = DIODE_ZENER then
+ zener_depth = 0.15
+ gsave
+ rmove 0 0.5
+ rline zener_depth 0
+ grestore
+ rmove 0 -0.5
+ rline -zener_depth 0
+ else if type = DIODE_THYRISTOR then
+ rline 0.5 -0.5
+ rline 0 -0.5
+ end if
+ grestore
+ rline 1.5 0
+ grestore
+end sub
+
+! Horizontal right-facing Diode
+sub diode_hr dlabel$ type
+ default type DIODE_NORMAL
+ gsave
+ @diode type
+ rmove 2 1
+ set hei 0.8
+ set just BC
+ write dlabel$
+ grestore
+ rmove 4 0
+end sub
+
+! Horizontal left-facing Diode
+sub diode_hl dlabel$ type
+ default type DIODE_NORMAL
+ gsave
+ rmove 4 0
+ begin rotate 180
+ @diode type
+ end rotate
+ rmove -2 1
+ set hei 0.8
+ set just BC
+ write dlabel$
+ grestore
+ rmove 4 0
+end sub
+
+! Vertical downward Diode
+sub diode_vd dlabel$ type
+ default type DIODE_NORMAL
+ gsave
+ begin rotate -90
+ @diode type
+ end rotate
+ rmove 1 -2
+ set hei 0.8
+ set just LC
+ write dlabel$
+ grestore
+ rmove 0 -4
+end sub
+
+! Vertical upward Diode
+sub diode_vu dlabel$ type
+ default type DIODE_NORMAL
+ gsave
+ rmove 0 -4
+ begin rotate 90
+ @diode type
+ end rotate
+ rmove 1 2
+ set hei 0.8
+ set just LC
+ write dlabel$
+ grestore
+ rmove 0 -4
+end sub
+
+! Vertical downward LED
+sub led_vd label$
+ @diode_vd label$ DIODE_NORMAL
+ gsave
+ arroffset = 0.15
+ set arrowsize 0.3
+ set arrowangle 20
+ ! rmove 0.65 1.85
+ rmove 0.6 1.75
+ rmove 0 arroffset
+ rline 0.5 -0.5 arrow end
+
+ rmove 0 -2*arroffset
+ rline -0.5 0.5 arrow start
+ grestore
+end sub
+
+
+sub bridge_rectifier blabel$
+ gsave
+ d_offset = (3 - sqrt(8)) / 2
+ d_length = sqrt(8)
+ @connection
+ rline d_offset d_offset
+ begin rotate 45
+ @diode DIODE_NORMAL
+ end rotate
+ rmove d_length d_length
+ rline d_offset d_offset
+ @connection
+ rline d_offset -d_offset
+ begin rotate -45
+ @diode DIODE_NORMAL
+ end rotate
+ rmove d_length -d_length
+ rline d_offset -d_offset
+ @connection
+ rmove -6 0
+ rline d_offset -d_offset
+ begin rotate -45
+ @diode DIODE_NORMAL
+ end rotate
+ rmove d_length -d_length
+ rline d_offset -d_offset
+ @connection
+ rline d_offset d_offset
+ begin rotate 45
+ @diode DIODE_NORMAL
+ end rotate
+ rmove d_length d_length
+ rline d_offset d_offset
+ rmove -3 0
+ set hei 0.8
+ set just CC
+ write blabel$
+ grestore
+end sub
+
+! Opto Isolator
+sub optocoupler optolabel$
+ @diode_vd "" DIODE_NORMAL
+ gsave
+ rmove 3 0
+ rline 0 1
+ rline -1 0.5 arrow start
+ rmove 0 -0.5
+ rline 0 2
+ rmove 0 -0.5
+ rline 1 0.5
+ rline 0 1
+ set just LC
+ rmove 0 -2
+ set hei 0.8
+ write optolabel$
+ optoarrowoffset = 0.25
+ optoarrowlength = 1
+ set arrowsize 0.4
+ set arrowangle 20
+ rmove -1.2 optoarrowoffset
+ rline -optoarrowlength 0 arrow start
+ rmove 0 -optoarrowoffset*2
+ rline optoarrowlength 0 arrow end
+ grestore
+end sub
+
+
+! Need to add triacs, thyristors etc
+
+!===================================
+! Op-amps
+!===================================
+sub opamp supply ulabel$
+ gsave
+ rline 1 0
+ rline 0 1
+ rline 3 -2
+ rline -3 -2
+ rline 0 1
+ rline -1 0
+ rmove 1 0
+ rline 0 2
+ ! Draw the "-"
+ rmove 0.2 0
+ rline 0.5 0
+
+ ! Draw the "+"
+ rmove -0.5 -2
+ rline 0.5 0
+ rmove -0.25 -0.25
+ rline 0 0.5
+ rmove -0.25 -0.25
+ rmove 2.8 1
+ rline 1 0
+ rmove -3 0
+ set just CC
+ set hei 0.8
+ write ulabel$
+ if supply = 1 then
+ rmove 2 0
+ rmove -2 4/3
+ rline 0 2/3
+ rmove 0 -4
+ rline 0 2/3
+ end if
+ grestore
+end sub
+
+!===================================
+! Power supplies etc
+!===================================
+
+! Ground
+sub ground
+ gsave
+ rline 0 -1
+ rmove -0.75 0
+ rline 1.5 0
+ rmove -0.25 -0.25
+ rline -1 0
+ rmove 0.25 -0.25
+ rline 0.5 0
+ grestore
+end sub
+
+! Power connection
+sub power label$
+ gsave
+ rline 0 1
+ rline -0.25 -0.25
+ rmove 0.5 0
+ rline -0.25 0.25
+ rmove 0.1 0.1
+ set just BL
+ write label$
+ grestore
+end sub
+
+sub supply_centre type
+ if type = 1 then
+ ! Supply with voltage
+ rmove 0 -0.6
+ rline 0 1.2 arrow end
+ rmove 0 -0.6
+ end if
+ if type = 2 then
+ ! +/- Supply
+ rmove 0 0.5
+ rline 0.25 0
+ rmove -0.25 0
+ rline -0.25 0
+ rmove 0.25 0
+ rline 0 0.25
+ rmove 0 -0.25
+ rline 0 -0.25
+ rmove 0 0.25
+
+ rmove 0 -1
+ rmove -0.25 0
+ rline 0.5 0
+ rmove -0.25 0.5
+ end if
+ if type = 3 then
+ ! Sine source
+ rmove -0.5 0
+ rbezier 0.25 0.5 0.25 0.5 0.5 0
+ rbezier 0.25 -0.5 0.25 -0.5 0.5 0
+ rmove -0.5 0
+ end if
+end sub
+
+! Horizontal Power supply
+sub supply_h type
+ ! Type gives central drawing
+ ! 0: Nothing
+ ! 1: Voltage Arrow
+ ! 2: +/-
+ ! 3: Crude Sinusoid
+ gsave
+ rline 1 0
+ rmove 1 0
+ circle 1
+ begin rotate -90
+ @supply_centre type
+ end rotate
+ rmove 1 0
+ rline 1 0
+ grestore
+ rmove 4 0
+end sub
+
+! Vertical Power supply (probably more usual)
+sub supply_v type
+ ! Type gives central drawing
+ ! 0: Nothing
+ ! 1: Voltage Arrow
+ ! 2: +/-
+ ! 3: Crude Sinusoid
+ gsave
+ rline 0 -1
+ rmove 0 -1
+ circle 1
+ @supply_centre type
+ rmove 0 -1
+ rline 0 -1
+ grestore
+ rmove 0 -4
+end sub
+
+!===================================
+! Cells
+!===================================
+
+! Base cell
+sub cell
+ gsave
+ rline 1.8 0
+ rmove 0 -1
+ rline 0 2
+ rmove 0.4 -1
+ gsave
+ set lwidth 0.2
+ rmove 0 -0.5
+ rline 0 1
+ rmove 0 -0.5
+ grestore
+! set lwidth 0.02
+ rline 1.8 0
+ grestore
+end sub
+
+! Horizontal cell (perhaps should have hr & hl?)
+sub cell_h elabel$
+ gsave
+ @cell
+ rmove 2 1.25
+ set just BC
+ set hei 0.8
+ write elabel$
+ grestore
+ rmove 4 0
+end sub
+
+! Vertical cell
+sub cell_v elabel$
+ gsave
+ begin rotate -90
+ @cell
+ end rotate
+ rmove 1.25 -2
+ set just LC
+ set hei 0.8
+ write elabel$
+ grestore
+ rmove 0 -4
+end sub
+
+!===================================
+! Logic Gates
+!===================================
+
+! Left side of gate (for and/nand)
+sub and_left_gate
+ gsave
+ rmove 0 1
+ rline 1 0
+ rmove 0 1
+ rline 0 -4
+ rmove 0 1
+ rline -1 0
+ grestore
+end sub
+
+! Left side of gate (for not/buffer)
+sub not_left_gate
+ gsave
+ rline 1 0
+ rmove 0 -2
+ rline 0 4
+ grestore
+end sub
+
+! Curved left gate (for OR)
+sub or_left_gate
+ gsave
+ ! Draw the connection lines
+ linelength = 1.59
+ rmove 0 -1
+ rline linelength 0
+ rmove 0 2
+ rline -linelength 0
+ rmove 1 1
+
+ ! Draw the curve
+ cx = xpos()
+ cy = ypos()
+ bezier cx+1 cy-1 cx+1 cy-3 cx cy-4
+ grestore
+end sub
+
+! Double Curved left gate (for XOR)
+sub xor_left_gate
+ gsave
+ ! Draw the connection lines
+ linelength = 1.09
+ rmove 0 -1
+ rline linelength 0
+ rmove 0 2
+ rline -linelength 0
+ rmove 1 1
+
+ ! Draw the curves
+ for i = 0 to 0.5 step 0.5
+ rmove -i 0
+ cx = xpos()
+ cy = ypos()
+ bezier cx+1 cy-1 cx+1 cy-3 cx cy-4
+ amove cx cy
+ next i
+ grestore
+end sub
+
+! Non-inverted output
+sub non_inverted_output
+ gsave
+ rmove 5 0
+ rline 1 0
+ grestore
+end sub
+
+! Inverted output
+sub inverted_output
+ gsave
+ rmove 5 0
+ invrad = 0.25
+ rmove invrad 0
+ circle invrad
+ rmove invrad 0
+ rline 1-2*invrad 0
+ grestore
+end sub
+
+! Curved edges for AND/OR
+sub curved_edges
+ gsave
+ rmove 1 2
+ cx = xpos()
+ cy = ypos()
+ ! Draw the top curve
+ bezier cx+3 cy cx+4 cy-1 cx+4 cy-2
+ ! Draw the bottom curve
+ cx = xpos()
+ cy = ypos()
+ bezier cx cy-1 cx-1 cy-2 cx-4 cy-2
+ grestore
+end sub
+
+! Straight edges for Buffer/Not
+sub straight_edges
+ gsave
+ rmove 1 2
+ rline 4 -2
+ rline -4 -2
+ grestore
+end sub
+
+! XOR Gate
+sub xor
+ gsave
+ rmove 0 -1
+ @xor_left_gate
+ @curved_edges
+ @non_inverted_output
+ grestore
+end sub
+
+! XNOR Gate
+sub xnor
+ gsave
+ rmove 0 -1
+ @xor_left_gate
+ @curved_edges
+ @inverted_output
+ grestore
+end sub
+
+! OR Gate
+sub or
+ gsave
+ rmove 0 -1
+ @or_left_gate
+ @curved_edges
+ @non_inverted_output
+ grestore
+end sub
+
+! NOR Gate
+sub nor
+ gsave
+ rmove 0 -1
+ @or_left_gate
+ @curved_edges
+ @inverted_output
+ grestore
+end sub
+
+! AND Gate
+sub and
+ gsave
+ rmove 0 -1
+ @and_left_gate
+ @curved_edges
+ @non_inverted_output
+ grestore
+end sub
+
+! NAND Gate
+sub nand
+ gsave
+ rmove 0 -1
+ @and_left_gate
+ @curved_edges
+ @inverted_output
+ grestore
+end sub
+
+! NOT Gate
+sub not
+ gsave
+ @not_left_gate
+ @straight_edges
+ @inverted_output
+ grestore
+ rmove 6 0
+end sub
+
+! BUFFER
+sub buffer
+ gsave
+ @not_left_gate
+ @straight_edges
+ @non_inverted_output
+ grestore
+ rmove 6 0
+end sub
+
+! Schmitt Trigger symbol
+sub schmitt
+ gsave
+ sw = 0.5
+ sh = 1
+ h = 0.5
+ rmove -(sw/2+h) sh/2
+ rline h+sw 0
+ rline 0 -sh
+ rmove h 0
+ rline -(h+sw) 0
+ rline 0 sh
+ grestore
+end sub
+
+! NAND Schmitt Trigger
+sub nand_schmitt
+ gsave
+ rmove 2.5 -1
+ @schmitt
+ grestore
+ @nand
+end sub
+
+! Inverter Schmitt Trigger
+sub not_schmitt
+ gsave
+ rmove 2.25 0
+ @schmitt
+ grestore
+ @not
+end sub
+
diff --git a/src/lib/ellipse.gle b/src/lib/ellipse.gle
new file mode 100644
index 0000000..4575a81
--- /dev/null
+++ b/src/lib/ellipse.gle
@@ -0,0 +1,117 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+! Subroutines for drawing ellipses around text and other objects
+
+include "shape.gle"
+
+ellipse_c = 0.25
+ellipse_wd = -1
+ellipse_hi = -1
+
+sub set_ellipse_c c
+ ellipse_c = c
+end sub
+
+sub set_ellipse_size wd hi
+ ellipse_wd = wd
+ ellipse_hi = hi
+end sub
+
+sub set_ellipse_size_str txt$
+ ellipse_wd = twidth(txt$)+2*shape_dx
+ ellipse_hi = theight(txt$)+2*shape_dy
+end sub
+
+sub ellipsebox x y w h name$
+ local a = 0
+ local a1 = h/(2*ellipse_c)
+ if a < a1 then a = a1
+ local a2 = w/2
+ if a < a2 then a = a2
+ local a3 = sqrt(w^2+h^2/ellipse_c^2)/2
+ if a < a3 then a = a3
+ local a4 = sqrt(h^2+w^2*ellipse_c^2)/(4*ellipse_c)
+ if a < a4 then a=a4
+ amove x+w/2-a y+h/2-ellipse_c*a
+ box 2*a 2*ellipse_c*a name name$ nobox fill clear
+ amove x+w/2 y+h/2
+ ellipse a ellipse_c*a
+end sub
+
+sub ellipse_obj obj$ name$
+ local xp = pointx(obj$+".bl")-shape_dx
+ local yp = pointy(obj$+".bl")-shape_dy
+ local w = width(obj$)+2*shape_dx
+ local h = height(obj$)+2*shape_dy
+ ellipsebox xp yp w h name$
+end sub
+
+sub ellipse_text x y txt$ name$
+ local tw = twidth(txt$)+2*shape_dx
+ local th = theight(txt$)+2*shape_dy
+ if ellipse_wd <> -1 then tw = ellipse_wd
+ if ellipse_hi <> -1 then th = ellipse_hi
+ ellipsebox x-tw/2 y-th/2 tw th name$
+ amove x y
+ set just cc
+ write txt$
+end sub
+
+sub ellipse_tex x y txt$ name$
+ local txt2$ = "\tex{"+txt$+"}"
+ ellipse_text x y txt2$ name$
+end sub
+
+sub def_ellipse_text txt$ name$
+ local tw = twidth(txt$)+2*shape_dx
+ local th = theight(txt$)+2*shape_dy
+ if ellipse_wd <> -1 then tw = ellipse_wd
+ if ellipse_hi <> -1 then th = ellipse_hi
+ begin object name$
+ ellipsebox -tw/2 -th/2 tw th "x"
+ set just cc
+ write txt$
+ end object
+end sub
+
+sub def_ellipse_tex txt$ name$
+ local txt2$ = "\tex{"+txt$+"}"
+ def_ellipse_text txt2$ name$
+end sub
+
diff --git a/src/lib/feyn.gle b/src/lib/feyn.gle
new file mode 100644
index 0000000..eeb6c15
--- /dev/null
+++ b/src/lib/feyn.gle
@@ -0,0 +1,1774 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) Andrey Grozin, 1993-1995. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+! Drawing Feynman diagrams, version 1.0
+! Copyright (c) Andrey Grozin, 1993-1995
+
+! variable names beginning with F are reserved for internal use
+
+! straight line | arc
+! ----------------------------
+! fr - -1 | radius
+! fx,fy - initial point | center
+! fa - slope | slope: center->initial
+! fl - length | angle length
+! fc - | +1 - counterclockwise
+! fsx,fsy - | starting point for feyn2 functions
+! fxx,fyy - | intermediate points for feyn2 functions
+! ffx,ffy - final point
+! fx1,fy1,... - temporary coordinates
+! f1,f2,... - temporary variables
+! fi,fm,fd - for loops
+! flastl$ - type of last drawn line
+
+pi = 3.14159265358979323846264338328
+! sin table
+fs1 = 0.156434465040230869010105319467
+fs2 = 0.309016994374947424102293417183
+fs3 = 0.453990499739546791560408366358
+fs4 = 0.587785252292473129168705954639
+fs5 = 0.707106781186547524400844362105
+fs6 = 0.809016994374947424102293417183
+fs7 = 0.891006524188367862359709571414
+fs8 = 0.951056516295153572116439333379
+fs9 = 0.987688340595137726190040247693
+
+fe = 0.01 ! lines shorter than FE cm are not drawn
+
+set lwidth 0.03 ! line width
+set cap round ! end of line
+set join round ! join lines
+set hei 0.5 ! character height
+set font texcmr ! TeX roman
+set just cc ! centered
+text \chardef{-}{\char{$7b}}\def\mi{\setfont{texmi}}
+
+! simple debugging tool
+DebugX = 1
+DebugY = 1
+DebugD = 1
+Debug = 0
+sub fdebug l t$ v
+ if Debug>l-0.5 then
+ gsave
+ amove DebugX DebugY
+ write t$+num$(v)
+ grestore
+ DebugY = DebugY+DebugD
+ end if
+end sub
+
+! internal - setup for straight line
+sub feyn x y
+ ffx = x
+ ffy = y
+ fr = -1
+ fx = xpos()
+ fy = ypos()
+ x = x-fx
+ y = y-fy
+ fl = sqrt(sqr(x)+sqr(y))
+ if fl<fe then
+ fl = -1
+ else ! finding slope
+ if abs(y)<abs(x) then
+ if x>0 then
+ fa = 180*atn(y/x)/pi
+ else
+ fa = 180*(1+atn(y/x)/pi)
+ end if
+ else
+ if y>0 then
+ fa = 180*(0.5-atn(x/y)/pi)
+ else
+ fa = 180*(1.5-atn(x/y)/pi)
+ end if
+ end if
+ end if
+end sub
+
+! internal - setup for arc
+sub feyn2 xx yy x y
+ ffx = x
+ ffy = y
+ fx1 = xpos()-xx
+ fy1 = ypos()-yy
+ fx2 = x-xx
+ fy2 = y-yy
+ fr = fx1*fy2-fx2*fy1
+ fxx = xx
+ fyy = yy
+ fsx = xpos()
+ fsy = ypos()
+ if abs(fr)<sqr(fe) then
+ fr = -1
+ else ! finding center
+ fc = -sgn(fr)
+ fx = xx+0.5/fr*(sqr(fy1)*fy2-sqr(fy2)*fy1+sqr(fx1)*fy2-sqr(fx2)*fy1)
+ fy = yy+0.5/fr*(sqr(fx2)*fx1-sqr(fx1)*fx2+sqr(fy2)*fx1-sqr(fy1)*fx2)
+ fx1 = xpos()-fx
+ fy1 = ypos()-fy
+ fr = sqrt(sqr(fx1)+sqr(fy1))
+ ! finding slope center - initial
+ if abs(fy1)<abs(fx1) then
+ if fx1>0 then
+ fa = 180*atn(fy1/fx1)/pi
+ else
+ fa = 180*(1+atn(fy1/fx1)/pi)
+ end if
+ else
+ if fy1>0 then
+ fa = 180*(0.5-atn(fx1/fy1)/pi)
+ else
+ fa = 180*(1.5-atn(fx1/fy1)/pi)
+ end if
+ end if
+ ! finding angular length
+ fx2 = x-fx
+ fy2 = y-fy
+ f1 = (fx1*fy2-fx2*fy1)/sqr(fr)*fc ! sin
+ f2 = (fx1*fx2+fy1*fy2)/sqr(fr) ! cos
+ if f1<0 then ! pi .. 2*pi
+ if abs(f1)>abs(f2) then ! 5*pi/4 .. 7*pi/4
+ if f2<0 then ! 5*pi/4 .. 3*pi/2
+ fl = 180*(1.5-atn(f2/f1)/pi)
+ else ! 3*pi/2 .. 7*pi/4
+ fl = 180*(1.5+atn(-f2/f1)/pi)
+ end if
+ else ! pi .. 5*pi/4 or 7*pi/4 .. 2*pi
+ if f2<0 then ! pi .. 5*pi/4
+ fl = 180*(1+atn(f1/f2)/pi)
+ else ! 7*pi/4 .. 2*pi
+ fl = 180*(2-atn(-f1/f2)/pi)
+ end if
+ end if
+ else ! 0 .. pi
+ if abs(f1)>abs(f2) then ! pi/4 .. 3*pi/4
+ if f2<0 then ! pi/2 .. 3*pi/4
+ fl = 180*(0.5+atn(-f2/f1)/pi)
+ else ! pi/4 .. pi/2
+ fl = 180*(0.5-atn(f2/f1)/pi)
+ end if
+ else ! 0 .. pi/4 or 3*pi/4 .. pi
+ if f2<0 then ! 3*pi/4 .. pi
+ fl = 180*(1-atn(-f1/f2)/pi)
+ else ! 0 .. pi/4
+ fl = 180*atn(f1/f2)/pi
+ end if
+ end if
+ end if
+ end if
+end sub
+
+! Fermion line from the current point to x,y
+sub Fermion x y
+ flastl$ = "Fermion"
+ @feyn x y
+ if fl>0 then
+ begin origin
+ begin rotate fa
+ aline fl 0
+ end rotate
+ end origin
+ amove ffx ffy
+ end if
+end sub
+
+! Fermion line from the current point via xx,yy to x,y
+sub Fermion2 xx yy x y
+ flastl$ = "Fermion2"
+ @feyn2 xx yy x y
+ if fr<0 then
+ @Fermion x y
+ else
+ amove fx fy
+ begin origin
+ if fc>0 then
+ arc fr fa fa+fl
+ else
+ arc fr fa-fl fa
+ end if
+ end origin
+ amove ffx ffy
+ end if
+end sub
+
+DoubleA = 0.05 ! half distance between lines
+DoubleI = 0 ! correction due to initial slant
+DoubleF = 0 ! correction due to final slant
+
+! Double line from the current point to x,y
+sub Double x y
+ flastl$ = "Double"
+ @feyn x y
+ if fl>0 then
+ begin origin
+ begin rotate fa
+ DoubleI = DoubleI*DoubleA
+ DoubleF = DoubleF*DoubleA
+ amove DoubleI DoubleA
+ aline fl+DoubleF DoubleA
+ amove -DoubleI -DoubleA
+ aline fl-DoubleF -DoubleA
+ end rotate
+ end origin
+ amove ffx ffy
+ end if
+ DoubleI = 0
+ DoubleF = 0
+end sub
+
+! Double line from the current point via xx,yy to x,y
+sub Double2 xx yy x y
+ flastl$ = "Double2"
+ @feyn2 xx yy x y
+ if fr<DoubleA+fe then
+ @Double x y
+ else
+ amove fx fy
+ begin origin
+ if fc>0 then
+ arc fr+DoubleA fa fa+fl
+ arc fr-DoubleA fa fa+fl
+ else
+ arc fr+DoubleA fa-fl fa
+ arc fr-DoubleA fa-fl fa
+ end if
+ end origin
+ amove ffx ffy
+ end if
+end sub
+
+DashL = 0.3 ! period
+DashF = 0.5 ! fraction of the period that is filled
+
+! Higgs (dashed) line from the current point to x,y
+sub Dash x y
+ flastl$ = "Dash"
+ @feyn x y
+ if fl>0 then
+ fn = fix(fl/DashL+1.5-DashF)
+ if fn<1 then
+ fn = 1
+ end if
+ fd = fl/(fn-1+DashF)
+ fm = fl-0.5*DashF*fd
+ f1 = fd*DashF
+ begin origin
+ begin rotate fa
+ for fi = 0 to fm step fd
+ begin translate fi 0
+ amove 0 0
+ aline f1 0
+ end translate
+ next fi
+ end rotate
+ end origin
+ amove ffx ffy
+ end if
+end sub
+
+! Higgs (dashed) line from the current point via xx,yy to x,y
+sub Dash2 xx yy x y
+ flastl$ = "Dash2"
+ @feyn2 xx yy x y
+ if fr<0 then
+ @Dash x y
+ else
+ fn = fix(fr*fl*pi/180/DashL+1.5-DashF)
+ if fn<1 then
+ fn = 1
+ end if
+ fd = fl/(fn-1+DashF)
+ fm = fl-0.5*DashF*fd
+ f1 = fd*DashF
+ amove fx fy
+ begin origin
+ if fc>0 then
+ for fi = 0 to fm step fd
+ arc fr fa+fi fa+fi+f1
+ next fi
+ else
+ for fi = 0 to fm step fd
+ narc fr fa-fi fa-fi-f1
+ next fi
+ end if
+ end origin
+ amove ffx ffy
+ end if
+end sub
+
+PhotonL = 0.1 ! half-wavelength
+PhotonA = 0.05 ! amplitude
+PhotonN = 0 ! correction to the number of half-waves
+
+! Vector boson (zigzag) line from the current point to x,y
+sub Zigzag x y
+ flastl$ = "Zigzag"
+ @feyn x y
+ if fl>0 then
+ fn = fix(fl/PhotonL+0.5+PhotonN)
+ if fn<1 then
+ fn = 1
+ end if
+ PhotonN = 0
+ fd = fl/fn
+ fm = fl-0.5*fd
+ f1 = PhotonA
+ begin origin
+ begin rotate fa
+ for fi = 0 to fm step fd
+ begin translate fi 0
+ amove 0 0
+ aline 0.5*fd f1
+ aline fd 0
+ end translate
+ f1 = -f1
+ next fi
+ end rotate
+ end origin
+ amove ffx ffy
+ end if
+end sub
+
+! Vector boson (zigzag) line from the current point via xx,yy to x,y
+sub Zigzag2 xx yy x y
+ flastl$ = "ZigZag2"
+ @feyn2 xx yy x y
+ if fr<PhotonA+fe then
+ @Zigzag x y
+ else
+ fn = fix(fr*fl*pi/180/PhotonL+0.5+PhotonN)
+ if fn<1 then
+ fn = 1
+ end if
+ PhotonN = 0
+ fd = fl/fn
+ f1 = fc*PhotonA/fr
+ f2 = sin(pi*fd/360)
+ f3 = cos(pi*fd/360)
+ f4 = sqrt(f2^4+f1^2*f3^2*(1+2*f2^2)-f1^4*f2^2*f3^2)
+ if f1>0 then
+ f2 = (1+f1)*f2*f3*(1-(f1-f4)/(f2^2+f1^2*f3^2))
+ else
+ f2 = (1+f1)*f2*f3*(1-(f1+f4)/(f2^2+f1^2*f3^2))
+ end if
+ f2 = 180/pi*atn(f2/sqrt(1-f2^2))
+ if abs(fn-2*fix(0.5*fn))>0.1 then
+ if abs(fn-1)<0.1 then
+ fd = fl
+ f2 = 0.5*fl
+ else
+ for fi=1 to 10
+ fd = (fl-2*f2)/(fn-1)
+ f2 = sin(pi*fd/360)
+ f3 = cos(pi*fd/360)
+ f4 = sqrt(f2^4+f1^2*f3^2*(1+2*f2^2)-f1^4*f2^2*f3^2)
+ if f1>0 then
+ f2 = (1+f1)*f2*f3*(1-(f1-f4)/(f2^2+f1^2*f3^2))
+ else
+ f2 = (1+f1)*f2*f3*(1-(f1+f4)/(f2^2+f1^2*f3^2))
+ end if
+ f2 = 180/pi*atn(f2/sqrt(1-f2^2))
+ next fi
+ end if
+ end if
+ fm = f2+(2*fix(0.5*(fn+1)+0.1)-3)*fd
+ fx1 = fr*(1+f1)*cos(pi*fd/180)
+ fy1 = fr*(1+f1)*sin(pi*fd/180)
+ fx2 = fr*(1-f1)*cos(pi*fd/90)
+ fy2 = fr*(1-f1)*sin(pi*fd/90)
+ fx3 = fr*(1-f1)*cos(pi*f2/180)
+ fy3 = fr*(1-f1)*sin(pi*f2/180)
+ amove fx fy
+ begin origin
+ if fc>0 then
+ begin rotate fa
+ amove fr 0
+ aline fx3 fy3
+ end rotate
+ if fn>2.5 then
+ for fi = f2 to fm step 2*fd
+ begin rotate fa+fi
+ amove fr*(1-f1) 0
+ aline fx1 fy1
+ aline fx2 fy2
+ end rotate
+ next fi
+ end if
+ f2 = fl-fm-fd
+ if abs(fn-2*fix(0.5*fn))<0.1 then
+ begin rotate fa+fm+fd
+ amove fr*(1-f1) 0
+ aline fx1 fy1
+ end rotate
+ f2 = f2-fd
+ f1 = -f1
+ end if
+ fx3 = fr*(1-f1)*cos(pi*f2/180)
+ fy3 = fr*(1-f1)*sin(pi*f2/180)
+ begin rotate fa+fl
+ amove fx3 -fy3
+ aline fr 0
+ end rotate
+ else
+ begin rotate fa
+ amove fr 0
+ aline fx3 -fy3
+ end rotate
+ if fn>2.5 then
+ for fi = f2 to fm step 2*fd
+ begin rotate fa-fi
+ amove fr*(1-f1) 0
+ aline fx1 -fy1
+ aline fx2 -fy2
+ end rotate
+ next fi
+ end if
+ f2 = fl-fm-fd
+ if abs(fn-2*fix(0.5*fn))<0.1 then
+ begin rotate fa-fm-fd
+ amove fr*(1-f1) 0
+ aline fx1 -fy1
+ end rotate
+ f2 = f2-fd
+ f1 = -f1
+ end if
+ fx3 = fr*(1-f1)*cos(pi*f2/180)
+ fy3 = fr*(1-f1)*sin(pi*f2/180)
+ begin rotate fa-fl
+ amove fx3 fy3
+ aline fr 0
+ end rotate
+ end if
+ end origin
+ amove ffx ffy
+ end if
+end sub
+
+! Photon line from the current point to x,y
+sub Photon x y
+ flastl$ = "Photon"
+ @feyn x y
+ if fl>0 then
+ fn = fix(fl/PhotonL+0.5+PhotonN)
+ if fn<1 then
+ fn = 1
+ end if
+ PhotonN = 0
+ fd = fl/fn
+ fm = fl-0.5*fd
+ f1 = PhotonA
+ begin origin
+ begin rotate fa
+ for fi = 0 to fm step fd
+ begin translate fi 0
+ amove 0 0
+ aline 0.05*fd fs1*f1
+ aline 0.1*fd fs2*f1
+ aline 0.15*fd fs3*f1
+ aline 0.2*fd fs4*f1
+ aline 0.25*fd fs5*f1
+ aline 0.3*fd fs6*f1
+ aline 0.35*fd fs7*f1
+ aline 0.4*fd fs8*f1
+ aline 0.45*fd fs9*f1
+ aline 0.5*fd f1
+ aline 0.55*fd fs9*f1
+ aline 0.6*fd fs8*f1
+ aline 0.65*fd fs7*f1
+ aline 0.7*fd fs6*f1
+ aline 0.75*fd fs5*f1
+ aline 0.8*fd fs4*f1
+ aline 0.85*fd fs3*f1
+ aline 0.9*fd fs2*f1
+ aline 0.95*fd fs1*f1
+ aline fd 0
+ end translate
+ f1 = -f1
+ next fi
+ end rotate
+ end origin
+ amove ffx ffy
+ end if
+end sub
+
+! Photon line from the current point via xx,yy to x,y
+sub Photon2 xx yy x y
+ flastl$ = "Photon2"
+ @feyn2 xx yy x y
+ if fr<PhotonA+fe then
+ @Photon x y
+ else
+ fn = fix(fr*fl*pi/180/PhotonL+0.5+PhotonN)
+ if fn<1 then
+ fn = 1
+ end if
+ PhotonN = 0
+ fd = fl/fn
+ f1 = fc*PhotonA/fr
+ f2 = sin(pi*fd/360)
+ f3 = cos(pi*fd/360)
+ f4 = sqrt(f2^4+f1^2*f3^2*(1+2*f2^2)-f1^4*f2^2*f3^2)
+ if f1>0 then
+ f2 = (1+f1)*f2*f3*(1-(f1-f4)/(f2^2+f1^2*f3^2))
+ else
+ f2 = (1+f1)*f2*f3*(1-(f1+f4)/(f2^2+f1^2*f3^2))
+ end if
+ f2 = 180/pi*atn(f2/sqrt(1-f2^2))
+ if abs(fn-2*fix(0.5*fn))>0.1 then
+ if abs(fn-1)<0.1 then
+ fd = fl
+ f2 = 0.5*fl
+ else
+ for fi=1 to 10
+ fd = (fl-2*f2)/(fn-1)
+ f2 = sin(pi*fd/360)
+ f3 = cos(pi*fd/360)
+ f4 = sqrt(f2^4+f1^2*f3^2*(1+2*f2^2)-f1^4*f2^2*f3^2)
+ if f1>0 then
+ f2 = (1+f1)*f2*f3*(1-(f1-f4)/(f2^2+f1^2*f3^2))
+ else
+ f2 = (1+f1)*f2*f3*(1-(f1+f4)/(f2^2+f1^2*f3^2))
+ end if
+ f2 = 180/pi*atn(f2/sqrt(1-f2^2))
+ next fi
+ end if
+ end if
+ fm = f2+(2*fix(0.5*(fn+1)+0.1)-3)*fd
+ amove fx fy
+ begin origin
+ if fc>0 then
+ begin rotate fa
+ amove fr 0
+ fx1 = fr*(1-f1*fs1)*cos(1*pi*f2/1800)
+ fy1 = fr*(1-f1*fs1)*sin(1*pi*f2/1800)
+ aline fx1 fy1
+ fx1 = fr*(1-f1*fs2)*cos(2*pi*f2/1800)
+ fy1 = fr*(1-f1*fs2)*sin(2*pi*f2/1800)
+ aline fx1 fy1
+ fx1 = fr*(1-f1*fs3)*cos(3*pi*f2/1800)
+ fy1 = fr*(1-f1*fs3)*sin(3*pi*f2/1800)
+ aline fx1 fy1
+ fx1 = fr*(1-f1*fs4)*cos(4*pi*f2/1800)
+ fy1 = fr*(1-f1*fs4)*sin(4*pi*f2/1800)
+ aline fx1 fy1
+ fx1 = fr*(1-f1*fs5)*cos(5*pi*f2/1800)
+ fy1 = fr*(1-f1*fs5)*sin(5*pi*f2/1800)
+ aline fx1 fy1
+ fx1 = fr*(1-f1*fs6)*cos(6*pi*f2/1800)
+ fy1 = fr*(1-f1*fs6)*sin(6*pi*f2/1800)
+ aline fx1 fy1
+ fx1 = fr*(1-f1*fs7)*cos(7*pi*f2/1800)
+ fy1 = fr*(1-f1*fs7)*sin(7*pi*f2/1800)
+ aline fx1 fy1
+ fx1 = fr*(1-f1*fs8)*cos(8*pi*f2/1800)
+ fy1 = fr*(1-f1*fs8)*sin(8*pi*f2/1800)
+ aline fx1 fy1
+ fx1 = fr*(1-f1*fs9)*cos(9*pi*f2/1800)
+ fy1 = fr*(1-f1*fs9)*sin(9*pi*f2/1800)
+ aline fx1 fy1
+ fx1 = fr*(1-f1)*cos(pi*f2/180)
+ fy1 = fr*(1-f1)*sin(pi*f2/180)
+ aline fx1 fy1
+ end rotate
+ if fn>2.5 then
+ for fi = f2 to fm step 2*fd
+ begin rotate fa+fi
+ amove fr*(1-f1) 0
+ fx1 = fr*(1-f1*fs9)*cos(1*pi*fd/3600)
+ fy1 = fr*(1-f1*fs9)*sin(1*pi*fd/3600)
+ aline fx1 fy1
+ fx1 = fr*(1-f1*fs8)*cos(2*pi*fd/3600)
+ fy1 = fr*(1-f1*fs8)*sin(2*pi*fd/3600)
+ aline fx1 fy1
+ fx1 = fr*(1-f1*fs7)*cos(3*pi*fd/3600)
+ fy1 = fr*(1-f1*fs7)*sin(3*pi*fd/3600)
+ aline fx1 fy1
+ fx1 = fr*(1-f1*fs6)*cos(4*pi*fd/3600)
+ fy1 = fr*(1-f1*fs6)*sin(4*pi*fd/3600)
+ aline fx1 fy1
+ fx1 = fr*(1-f1*fs5)*cos(5*pi*fd/3600)
+ fy1 = fr*(1-f1*fs5)*sin(5*pi*fd/3600)
+ aline fx1 fy1
+ fx1 = fr*(1-f1*fs4)*cos(6*pi*fd/3600)
+ fy1 = fr*(1-f1*fs4)*sin(6*pi*fd/3600)
+ aline fx1 fy1
+ fx1 = fr*(1-f1*fs3)*cos(7*pi*fd/3600)
+ fy1 = fr*(1-f1*fs3)*sin(7*pi*fd/3600)
+ aline fx1 fy1
+ fx1 = fr*(1-f1*fs2)*cos(8*pi*fd/3600)
+ fy1 = fr*(1-f1*fs2)*sin(8*pi*fd/3600)
+ aline fx1 fy1
+ fx1 = fr*(1-f1*fs1)*cos(9*pi*fd/3600)
+ fy1 = fr*(1-f1*fs1)*sin(9*pi*fd/3600)
+ aline fx1 fy1
+ fx1 = fr*cos(pi*fd/360)
+ fy1 = fr*sin(pi*fd/360)
+ aline fx1 fy1
+ fx1 = fr*(1+f1*fs1)*cos(11*pi*fd/3600)
+ fy1 = fr*(1+f1*fs1)*sin(11*pi*fd/3600)
+ aline fx1 fy1
+ fx1 = fr*(1+f1*fs2)*cos(12*pi*fd/3600)
+ fy1 = fr*(1+f1*fs2)*sin(12*pi*fd/3600)
+ aline fx1 fy1
+ fx1 = fr*(1+f1*fs3)*cos(13*pi*fd/3600)
+ fy1 = fr*(1+f1*fs3)*sin(13*pi*fd/3600)
+ aline fx1 fy1
+ fx1 = fr*(1+f1*fs4)*cos(14*pi*fd/3600)
+ fy1 = fr*(1+f1*fs4)*sin(14*pi*fd/3600)
+ aline fx1 fy1
+ fx1 = fr*(1+f1*fs5)*cos(15*pi*fd/3600)
+ fy1 = fr*(1+f1*fs5)*sin(15*pi*fd/3600)
+ aline fx1 fy1
+ fx1 = fr*(1+f1*fs6)*cos(16*pi*fd/3600)
+ fy1 = fr*(1+f1*fs6)*sin(16*pi*fd/3600)
+ aline fx1 fy1
+ fx1 = fr*(1+f1*fs7)*cos(17*pi*fd/3600)
+ fy1 = fr*(1+f1*fs7)*sin(17*pi*fd/3600)
+ aline fx1 fy1
+ fx1 = fr*(1+f1*fs8)*cos(18*pi*fd/3600)
+ fy1 = fr*(1+f1*fs8)*sin(18*pi*fd/3600)
+ aline fx1 fy1
+ fx1 = fr*(1+f1*fs9)*cos(19*pi*fd/3600)
+ fy1 = fr*(1+f1*fs9)*sin(19*pi*fd/3600)
+ aline fx1 fy1
+ fx1 = fr*(1+f1)*cos(pi*fd/180)
+ fy1 = fr*(1+f1)*sin(pi*fd/180)
+ aline fx1 fy1
+ fx1 = fr*(1+f1*fs9)*cos(21*pi*fd/3600)
+ fy1 = fr*(1+f1*fs9)*sin(21*pi*fd/3600)
+ aline fx1 fy1
+ fx1 = fr*(1+f1*fs8)*cos(22*pi*fd/3600)
+ fy1 = fr*(1+f1*fs8)*sin(22*pi*fd/3600)
+ aline fx1 fy1
+ fx1 = fr*(1+f1*fs7)*cos(23*pi*fd/3600)
+ fy1 = fr*(1+f1*fs7)*sin(23*pi*fd/3600)
+ aline fx1 fy1
+ fx1 = fr*(1+f1*fs6)*cos(24*pi*fd/3600)
+ fy1 = fr*(1+f1*fs6)*sin(24*pi*fd/3600)
+ aline fx1 fy1
+ fx1 = fr*(1+f1*fs5)*cos(25*pi*fd/3600)
+ fy1 = fr*(1+f1*fs5)*sin(25*pi*fd/3600)
+ aline fx1 fy1
+ fx1 = fr*(1+f1*fs4)*cos(26*pi*fd/3600)
+ fy1 = fr*(1+f1*fs4)*sin(26*pi*fd/3600)
+ aline fx1 fy1
+ fx1 = fr*(1+f1*fs3)*cos(27*pi*fd/3600)
+ fy1 = fr*(1+f1*fs3)*sin(27*pi*fd/3600)
+ aline fx1 fy1
+ fx1 = fr*(1+f1*fs2)*cos(28*pi*fd/3600)
+ fy1 = fr*(1+f1*fs2)*sin(28*pi*fd/3600)
+ aline fx1 fy1
+ fx1 = fr*(1+f1*fs1)*cos(29*pi*fd/3600)
+ fy1 = fr*(1+f1*fs1)*sin(29*pi*fd/3600)
+ aline fx1 fy1
+ fx1 = fr*cos(pi*fd/120)
+ fy1 = fr*sin(pi*fd/120)
+ aline fx1 fy1
+ fx1 = fr*(1-f1*fs1)*cos(31*pi*fd/3600)
+ fy1 = fr*(1-f1*fs1)*sin(31*pi*fd/3600)
+ aline fx1 fy1
+ fx1 = fr*(1-f1*fs2)*cos(32*pi*fd/3600)
+ fy1 = fr*(1-f1*fs2)*sin(32*pi*fd/3600)
+ aline fx1 fy1
+ fx1 = fr*(1-f1*fs3)*cos(33*pi*fd/3600)
+ fy1 = fr*(1-f1*fs3)*sin(33*pi*fd/3600)
+ aline fx1 fy1
+ fx1 = fr*(1-f1*fs4)*cos(34*pi*fd/3600)
+ fy1 = fr*(1-f1*fs4)*sin(34*pi*fd/3600)
+ aline fx1 fy1
+ fx1 = fr*(1-f1*fs5)*cos(35*pi*fd/3600)
+ fy1 = fr*(1-f1*fs5)*sin(35*pi*fd/3600)
+ aline fx1 fy1
+ fx1 = fr*(1-f1*fs6)*cos(36*pi*fd/3600)
+ fy1 = fr*(1-f1*fs6)*sin(36*pi*fd/3600)
+ aline fx1 fy1
+ fx1 = fr*(1-f1*fs7)*cos(37*pi*fd/3600)
+ fy1 = fr*(1-f1*fs7)*sin(37*pi*fd/3600)
+ aline fx1 fy1
+ fx1 = fr*(1-f1*fs8)*cos(38*pi*fd/3600)
+ fy1 = fr*(1-f1*fs8)*sin(38*pi*fd/3600)
+ aline fx1 fy1
+ fx1 = fr*(1-f1*fs9)*cos(39*pi*fd/3600)
+ fy1 = fr*(1-f1*fs9)*sin(39*pi*fd/3600)
+ aline fx1 fy1
+ fx1 = fr*(1-f1)*cos(pi*fd/90)
+ fy1 = fr*(1-f1)*sin(pi*fd/90)
+ aline fx1 fy1
+ end rotate
+ next fi
+ end if
+ f2 = fl-fm-fd
+ if abs(fn-2*fix(0.5*fn))<0.1 then
+ begin rotate fa+fm+fd
+ amove fr*(1-f1) 0
+ fx1 = fr*(1-f1*fs9)*cos(1*pi*fd/3600)
+ fy1 = fr*(1-f1*fs9)*sin(1*pi*fd/3600)
+ aline fx1 fy1
+ fx1 = fr*(1-f1*fs8)*cos(2*pi*fd/3600)
+ fy1 = fr*(1-f1*fs8)*sin(2*pi*fd/3600)
+ aline fx1 fy1
+ fx1 = fr*(1-f1*fs7)*cos(3*pi*fd/3600)
+ fy1 = fr*(1-f1*fs7)*sin(3*pi*fd/3600)
+ aline fx1 fy1
+ fx1 = fr*(1-f1*fs6)*cos(4*pi*fd/3600)
+ fy1 = fr*(1-f1*fs6)*sin(4*pi*fd/3600)
+ aline fx1 fy1
+ fx1 = fr*(1-f1*fs5)*cos(5*pi*fd/3600)
+ fy1 = fr*(1-f1*fs5)*sin(5*pi*fd/3600)
+ aline fx1 fy1
+ fx1 = fr*(1-f1*fs4)*cos(6*pi*fd/3600)
+ fy1 = fr*(1-f1*fs4)*sin(6*pi*fd/3600)
+ aline fx1 fy1
+ fx1 = fr*(1-f1*fs3)*cos(7*pi*fd/3600)
+ fy1 = fr*(1-f1*fs3)*sin(7*pi*fd/3600)
+ aline fx1 fy1
+ fx1 = fr*(1-f1*fs2)*cos(8*pi*fd/3600)
+ fy1 = fr*(1-f1*fs2)*sin(8*pi*fd/3600)
+ aline fx1 fy1
+ fx1 = fr*(1-f1*fs1)*cos(9*pi*fd/3600)
+ fy1 = fr*(1-f1*fs1)*sin(9*pi*fd/3600)
+ aline fx1 fy1
+ fx1 = fr*cos(pi*fd/360)
+ fy1 = fr*sin(pi*fd/360)
+ aline fx1 fy1
+ fx1 = fr*(1+f1*fs1)*cos(11*pi*fd/3600)
+ fy1 = fr*(1+f1*fs1)*sin(11*pi*fd/3600)
+ aline fx1 fy1
+ fx1 = fr*(1+f1*fs2)*cos(12*pi*fd/3600)
+ fy1 = fr*(1+f1*fs2)*sin(12*pi*fd/3600)
+ aline fx1 fy1
+ fx1 = fr*(1+f1*fs3)*cos(13*pi*fd/3600)
+ fy1 = fr*(1+f1*fs3)*sin(13*pi*fd/3600)
+ aline fx1 fy1
+ fx1 = fr*(1+f1*fs4)*cos(14*pi*fd/3600)
+ fy1 = fr*(1+f1*fs4)*sin(14*pi*fd/3600)
+ aline fx1 fy1
+ fx1 = fr*(1+f1*fs5)*cos(15*pi*fd/3600)
+ fy1 = fr*(1+f1*fs5)*sin(15*pi*fd/3600)
+ aline fx1 fy1
+ fx1 = fr*(1+f1*fs6)*cos(16*pi*fd/3600)
+ fy1 = fr*(1+f1*fs6)*sin(16*pi*fd/3600)
+ aline fx1 fy1
+ fx1 = fr*(1+f1*fs7)*cos(17*pi*fd/3600)
+ fy1 = fr*(1+f1*fs7)*sin(17*pi*fd/3600)
+ aline fx1 fy1
+ fx1 = fr*(1+f1*fs8)*cos(18*pi*fd/3600)
+ fy1 = fr*(1+f1*fs8)*sin(18*pi*fd/3600)
+ aline fx1 fy1
+ fx1 = fr*(1+f1*fs9)*cos(19*pi*fd/3600)
+ fy1 = fr*(1+f1*fs9)*sin(19*pi*fd/3600)
+ aline fx1 fy1
+ fx1 = fr*(1+f1)*cos(pi*fd/180)
+ fy1 = fr*(1+f1)*sin(pi*fd/180)
+ aline fx1 fy1
+ end rotate
+ f2 = f2-fd
+ f1 = -f1
+ end if
+ begin rotate fa+fl
+ fx1 = fr*(1-f1)*cos(pi*f2/180)
+ fy1 = fr*(1-f1)*sin(pi*f2/180)
+ amove fx1 -fy1
+ fx1 = fr*(1-f1*fs9)*cos(9*pi*f2/1800)
+ fy1 = fr*(1-f1*fs9)*sin(9*pi*f2/1800)
+ aline fx1 -fy1
+ fx1 = fr*(1-f1*fs8)*cos(8*pi*f2/1800)
+ fy1 = fr*(1-f1*fs8)*sin(8*pi*f2/1800)
+ aline fx1 -fy1
+ fx1 = fr*(1-f1*fs7)*cos(7*pi*f2/1800)
+ fy1 = fr*(1-f1*fs7)*sin(7*pi*f2/1800)
+ aline fx1 -fy1
+ fx1 = fr*(1-f1*fs6)*cos(6*pi*f2/1800)
+ fy1 = fr*(1-f1*fs6)*sin(6*pi*f2/1800)
+ aline fx1 -fy1
+ fx1 = fr*(1-f1*fs5)*cos(5*pi*f2/1800)
+ fy1 = fr*(1-f1*fs5)*sin(5*pi*f2/1800)
+ aline fx1 -fy1
+ fx1 = fr*(1-f1*fs4)*cos(4*pi*f2/1800)
+ fy1 = fr*(1-f1*fs4)*sin(4*pi*f2/1800)
+ aline fx1 -fy1
+ fx1 = fr*(1-f1*fs3)*cos(3*pi*f2/1800)
+ fy1 = fr*(1-f1*fs3)*sin(3*pi*f2/1800)
+ aline fx1 -fy1
+ fx1 = fr*(1-f1*fs2)*cos(2*pi*f2/1800)
+ fy1 = fr*(1-f1*fs2)*sin(2*pi*f2/1800)
+ aline fx1 -fy1
+ fx1 = fr*(1-f1*fs1)*cos(1*pi*f2/1800)
+ fy1 = fr*(1-f1*fs1)*sin(1*pi*f2/1800)
+ aline fx1 -fy1
+ aline fr 0
+ end rotate
+ else
+ begin rotate fa
+ amove fr 0
+ fx1 = fr*(1-f1*fs1)*cos(1*pi*f2/1800)
+ fy1 = fr*(1-f1*fs1)*sin(1*pi*f2/1800)
+ aline fx1 -fy1
+ fx1 = fr*(1-f1*fs2)*cos(2*pi*f2/1800)
+ fy1 = fr*(1-f1*fs2)*sin(2*pi*f2/1800)
+ aline fx1 -fy1
+ fx1 = fr*(1-f1*fs3)*cos(3*pi*f2/1800)
+ fy1 = fr*(1-f1*fs3)*sin(3*pi*f2/1800)
+ aline fx1 -fy1
+ fx1 = fr*(1-f1*fs4)*cos(4*pi*f2/1800)
+ fy1 = fr*(1-f1*fs4)*sin(4*pi*f2/1800)
+ aline fx1 -fy1
+ fx1 = fr*(1-f1*fs5)*cos(5*pi*f2/1800)
+ fy1 = fr*(1-f1*fs5)*sin(5*pi*f2/1800)
+ aline fx1 -fy1
+ fx1 = fr*(1-f1*fs6)*cos(6*pi*f2/1800)
+ fy1 = fr*(1-f1*fs6)*sin(6*pi*f2/1800)
+ aline fx1 -fy1
+ fx1 = fr*(1-f1*fs7)*cos(7*pi*f2/1800)
+ fy1 = fr*(1-f1*fs7)*sin(7*pi*f2/1800)
+ aline fx1 -fy1
+ fx1 = fr*(1-f1*fs8)*cos(8*pi*f2/1800)
+ fy1 = fr*(1-f1*fs8)*sin(8*pi*f2/1800)
+ aline fx1 -fy1
+ fx1 = fr*(1-f1*fs9)*cos(9*pi*f2/1800)
+ fy1 = fr*(1-f1*fs9)*sin(9*pi*f2/1800)
+ aline fx1 -fy1
+ fx1 = fr*(1-f1)*cos(pi*f2/180)
+ fy1 = fr*(1-f1)*sin(pi*f2/180)
+ aline fx1 -fy1
+ end rotate
+ if fn>2.5 then
+ for fi = f2 to fm step 2*fd
+ begin rotate fa-fi
+ amove fr*(1-f1) 0
+ fx1 = fr*(1-f1*fs9)*cos(1*pi*fd/3600)
+ fy1 = fr*(1-f1*fs9)*sin(1*pi*fd/3600)
+ aline fx1 -fy1
+ fx1 = fr*(1-f1*fs8)*cos(2*pi*fd/3600)
+ fy1 = fr*(1-f1*fs8)*sin(2*pi*fd/3600)
+ aline fx1 -fy1
+ fx1 = fr*(1-f1*fs7)*cos(3*pi*fd/3600)
+ fy1 = fr*(1-f1*fs7)*sin(3*pi*fd/3600)
+ aline fx1 -fy1
+ fx1 = fr*(1-f1*fs6)*cos(4*pi*fd/3600)
+ fy1 = fr*(1-f1*fs6)*sin(4*pi*fd/3600)
+ aline fx1 -fy1
+ fx1 = fr*(1-f1*fs5)*cos(5*pi*fd/3600)
+ fy1 = fr*(1-f1*fs5)*sin(5*pi*fd/3600)
+ aline fx1 -fy1
+ fx1 = fr*(1-f1*fs4)*cos(6*pi*fd/3600)
+ fy1 = fr*(1-f1*fs4)*sin(6*pi*fd/3600)
+ aline fx1 -fy1
+ fx1 = fr*(1-f1*fs3)*cos(7*pi*fd/3600)
+ fy1 = fr*(1-f1*fs3)*sin(7*pi*fd/3600)
+ aline fx1 -fy1
+ fx1 = fr*(1-f1*fs2)*cos(8*pi*fd/3600)
+ fy1 = fr*(1-f1*fs2)*sin(8*pi*fd/3600)
+ aline fx1 -fy1
+ fx1 = fr*(1-f1*fs1)*cos(9*pi*fd/3600)
+ fy1 = fr*(1-f1*fs1)*sin(9*pi*fd/3600)
+ aline fx1 -fy1
+ fx1 = fr*cos(pi*fd/360)
+ fy1 = fr*sin(pi*fd/360)
+ aline fx1 -fy1
+ fx1 = fr*(1+f1*fs1)*cos(11*pi*fd/3600)
+ fy1 = fr*(1+f1*fs1)*sin(11*pi*fd/3600)
+ aline fx1 -fy1
+ fx1 = fr*(1+f1*fs2)*cos(12*pi*fd/3600)
+ fy1 = fr*(1+f1*fs2)*sin(12*pi*fd/3600)
+ aline fx1 -fy1
+ fx1 = fr*(1+f1*fs3)*cos(13*pi*fd/3600)
+ fy1 = fr*(1+f1*fs3)*sin(13*pi*fd/3600)
+ aline fx1 -fy1
+ fx1 = fr*(1+f1*fs4)*cos(14*pi*fd/3600)
+ fy1 = fr*(1+f1*fs4)*sin(14*pi*fd/3600)
+ aline fx1 -fy1
+ fx1 = fr*(1+f1*fs5)*cos(15*pi*fd/3600)
+ fy1 = fr*(1+f1*fs5)*sin(15*pi*fd/3600)
+ aline fx1 -fy1
+ fx1 = fr*(1+f1*fs6)*cos(16*pi*fd/3600)
+ fy1 = fr*(1+f1*fs6)*sin(16*pi*fd/3600)
+ aline fx1 -fy1
+ fx1 = fr*(1+f1*fs7)*cos(17*pi*fd/3600)
+ fy1 = fr*(1+f1*fs7)*sin(17*pi*fd/3600)
+ aline fx1 -fy1
+ fx1 = fr*(1+f1*fs8)*cos(18*pi*fd/3600)
+ fy1 = fr*(1+f1*fs8)*sin(18*pi*fd/3600)
+ aline fx1 -fy1
+ fx1 = fr*(1+f1*fs9)*cos(19*pi*fd/3600)
+ fy1 = fr*(1+f1*fs9)*sin(19*pi*fd/3600)
+ aline fx1 -fy1
+ fx1 = fr*(1+f1)*cos(pi*fd/180)
+ fy1 = fr*(1+f1)*sin(pi*fd/180)
+ aline fx1 -fy1
+ fx1 = fr*(1+f1*fs9)*cos(21*pi*fd/3600)
+ fy1 = fr*(1+f1*fs9)*sin(21*pi*fd/3600)
+ aline fx1 -fy1
+ fx1 = fr*(1+f1*fs8)*cos(22*pi*fd/3600)
+ fy1 = fr*(1+f1*fs8)*sin(22*pi*fd/3600)
+ aline fx1 -fy1
+ fx1 = fr*(1+f1*fs7)*cos(23*pi*fd/3600)
+ fy1 = fr*(1+f1*fs7)*sin(23*pi*fd/3600)
+ aline fx1 -fy1
+ fx1 = fr*(1+f1*fs6)*cos(24*pi*fd/3600)
+ fy1 = fr*(1+f1*fs6)*sin(24*pi*fd/3600)
+ aline fx1 -fy1
+ fx1 = fr*(1+f1*fs5)*cos(25*pi*fd/3600)
+ fy1 = fr*(1+f1*fs5)*sin(25*pi*fd/3600)
+ aline fx1 -fy1
+ fx1 = fr*(1+f1*fs4)*cos(26*pi*fd/3600)
+ fy1 = fr*(1+f1*fs4)*sin(26*pi*fd/3600)
+ aline fx1 -fy1
+ fx1 = fr*(1+f1*fs3)*cos(27*pi*fd/3600)
+ fy1 = fr*(1+f1*fs3)*sin(27*pi*fd/3600)
+ aline fx1 -fy1
+ fx1 = fr*(1+f1*fs2)*cos(28*pi*fd/3600)
+ fy1 = fr*(1+f1*fs2)*sin(28*pi*fd/3600)
+ aline fx1 -fy1
+ fx1 = fr*(1+f1*fs1)*cos(29*pi*fd/3600)
+ fy1 = fr*(1+f1*fs1)*sin(29*pi*fd/3600)
+ aline fx1 -fy1
+ fx1 = fr*cos(pi*fd/120)
+ fy1 = fr*sin(pi*fd/120)
+ aline fx1 -fy1
+ fx1 = fr*(1-f1*fs1)*cos(31*pi*fd/3600)
+ fy1 = fr*(1-f1*fs1)*sin(31*pi*fd/3600)
+ aline fx1 -fy1
+ fx1 = fr*(1-f1*fs2)*cos(32*pi*fd/3600)
+ fy1 = fr*(1-f1*fs2)*sin(32*pi*fd/3600)
+ aline fx1 -fy1
+ fx1 = fr*(1-f1*fs3)*cos(33*pi*fd/3600)
+ fy1 = fr*(1-f1*fs3)*sin(33*pi*fd/3600)
+ aline fx1 -fy1
+ fx1 = fr*(1-f1*fs4)*cos(34*pi*fd/3600)
+ fy1 = fr*(1-f1*fs4)*sin(34*pi*fd/3600)
+ aline fx1 -fy1
+ fx1 = fr*(1-f1*fs5)*cos(35*pi*fd/3600)
+ fy1 = fr*(1-f1*fs5)*sin(35*pi*fd/3600)
+ aline fx1 -fy1
+ fx1 = fr*(1-f1*fs6)*cos(36*pi*fd/3600)
+ fy1 = fr*(1-f1*fs6)*sin(36*pi*fd/3600)
+ aline fx1 -fy1
+ fx1 = fr*(1-f1*fs7)*cos(37*pi*fd/3600)
+ fy1 = fr*(1-f1*fs7)*sin(37*pi*fd/3600)
+ aline fx1 -fy1
+ fx1 = fr*(1-f1*fs8)*cos(38*pi*fd/3600)
+ fy1 = fr*(1-f1*fs8)*sin(38*pi*fd/3600)
+ aline fx1 -fy1
+ fx1 = fr*(1-f1*fs9)*cos(39*pi*fd/3600)
+ fy1 = fr*(1-f1*fs9)*sin(39*pi*fd/3600)
+ aline fx1 -fy1
+ fx1 = fr*(1-f1)*cos(pi*fd/90)
+ fy1 = fr*(1-f1)*sin(pi*fd/90)
+ aline fx1 -fy1
+ end rotate
+ next fi
+ end if
+ f2 = fl-fm-fd
+ if abs(fn-2*fix(0.5*fn))<0.1 then
+ begin rotate fa-fm-fd
+ amove fr*(1-f1) 0
+ fx1 = fr*(1-f1*fs9)*cos(1*pi*fd/3600)
+ fy1 = fr*(1-f1*fs9)*sin(1*pi*fd/3600)
+ aline fx1 -fy1
+ fx1 = fr*(1-f1*fs8)*cos(2*pi*fd/3600)
+ fy1 = fr*(1-f1*fs8)*sin(2*pi*fd/3600)
+ aline fx1 -fy1
+ fx1 = fr*(1-f1*fs7)*cos(3*pi*fd/3600)
+ fy1 = fr*(1-f1*fs7)*sin(3*pi*fd/3600)
+ aline fx1 -fy1
+ fx1 = fr*(1-f1*fs6)*cos(4*pi*fd/3600)
+ fy1 = fr*(1-f1*fs6)*sin(4*pi*fd/3600)
+ aline fx1 -fy1
+ fx1 = fr*(1-f1*fs5)*cos(5*pi*fd/3600)
+ fy1 = fr*(1-f1*fs5)*sin(5*pi*fd/3600)
+ aline fx1 -fy1
+ fx1 = fr*(1-f1*fs4)*cos(6*pi*fd/3600)
+ fy1 = fr*(1-f1*fs4)*sin(6*pi*fd/3600)
+ aline fx1 -fy1
+ fx1 = fr*(1-f1*fs3)*cos(7*pi*fd/3600)
+ fy1 = fr*(1-f1*fs3)*sin(7*pi*fd/3600)
+ aline fx1 -fy1
+ fx1 = fr*(1-f1*fs2)*cos(8*pi*fd/3600)
+ fy1 = fr*(1-f1*fs2)*sin(8*pi*fd/3600)
+ aline fx1 -fy1
+ fx1 = fr*(1-f1*fs1)*cos(9*pi*fd/3600)
+ fy1 = fr*(1-f1*fs1)*sin(9*pi*fd/3600)
+ aline fx1 -fy1
+ fx1 = fr*cos(pi*fd/360)
+ fy1 = fr*sin(pi*fd/360)
+ aline fx1 -fy1
+ fx1 = fr*(1+f1*fs1)*cos(11*pi*fd/3600)
+ fy1 = fr*(1+f1*fs1)*sin(11*pi*fd/3600)
+ aline fx1 -fy1
+ fx1 = fr*(1+f1*fs2)*cos(12*pi*fd/3600)
+ fy1 = fr*(1+f1*fs2)*sin(12*pi*fd/3600)
+ aline fx1 -fy1
+ fx1 = fr*(1+f1*fs3)*cos(13*pi*fd/3600)
+ fy1 = fr*(1+f1*fs3)*sin(13*pi*fd/3600)
+ aline fx1 -fy1
+ fx1 = fr*(1+f1*fs4)*cos(14*pi*fd/3600)
+ fy1 = fr*(1+f1*fs4)*sin(14*pi*fd/3600)
+ aline fx1 -fy1
+ fx1 = fr*(1+f1*fs5)*cos(15*pi*fd/3600)
+ fy1 = fr*(1+f1*fs5)*sin(15*pi*fd/3600)
+ aline fx1 -fy1
+ fx1 = fr*(1+f1*fs6)*cos(16*pi*fd/3600)
+ fy1 = fr*(1+f1*fs6)*sin(16*pi*fd/3600)
+ aline fx1 -fy1
+ fx1 = fr*(1+f1*fs7)*cos(17*pi*fd/3600)
+ fy1 = fr*(1+f1*fs7)*sin(17*pi*fd/3600)
+ aline fx1 -fy1
+ fx1 = fr*(1+f1*fs8)*cos(18*pi*fd/3600)
+ fy1 = fr*(1+f1*fs8)*sin(18*pi*fd/3600)
+ aline fx1 -fy1
+ fx1 = fr*(1+f1*fs9)*cos(19*pi*fd/3600)
+ fy1 = fr*(1+f1*fs9)*sin(19*pi*fd/3600)
+ aline fx1 -fy1
+ fx1 = fr*(1+f1)*cos(pi*fd/180)
+ fy1 = fr*(1+f1)*sin(pi*fd/180)
+ aline fx1 -fy1
+ end rotate
+ f2 = f2-fd
+ f1 = -f1
+ end if
+ begin rotate fa-fl
+ fx1 = fr*(1-f1)*cos(pi*f2/180)
+ fy1 = fr*(1-f1)*sin(pi*f2/180)
+ amove fx1 fy1
+ fx1 = fr*(1-f1*fs9)*cos(9*pi*f2/1800)
+ fy1 = fr*(1-f1*fs9)*sin(9*pi*f2/1800)
+ aline fx1 fy1
+ fx1 = fr*(1-f1*fs8)*cos(8*pi*f2/1800)
+ fy1 = fr*(1-f1*fs8)*sin(8*pi*f2/1800)
+ aline fx1 fy1
+ fx1 = fr*(1-f1*fs7)*cos(7*pi*f2/1800)
+ fy1 = fr*(1-f1*fs7)*sin(7*pi*f2/1800)
+ aline fx1 fy1
+ fx1 = fr*(1-f1*fs6)*cos(6*pi*f2/1800)
+ fy1 = fr*(1-f1*fs6)*sin(6*pi*f2/1800)
+ aline fx1 fy1
+ fx1 = fr*(1-f1*fs5)*cos(5*pi*f2/1800)
+ fy1 = fr*(1-f1*fs5)*sin(5*pi*f2/1800)
+ aline fx1 fy1
+ fx1 = fr*(1-f1*fs4)*cos(4*pi*f2/1800)
+ fy1 = fr*(1-f1*fs4)*sin(4*pi*f2/1800)
+ aline fx1 fy1
+ fx1 = fr*(1-f1*fs3)*cos(3*pi*f2/1800)
+ fy1 = fr*(1-f1*fs3)*sin(3*pi*f2/1800)
+ aline fx1 fy1
+ fx1 = fr*(1-f1*fs2)*cos(2*pi*f2/1800)
+ fy1 = fr*(1-f1*fs2)*sin(2*pi*f2/1800)
+ aline fx1 fy1
+ fx1 = fr*(1-f1*fs1)*cos(1*pi*f2/1800)
+ fy1 = fr*(1-f1*fs1)*sin(1*pi*f2/1800)
+ aline fx1 fy1
+ aline fr 0
+ end rotate
+ end if
+ end origin
+ amove ffx ffy
+ end if
+end sub
+
+GluonW = 1 ! Winding coefficient, should be >1/pi
+
+! Gluon line from the current point to x,y
+sub Gluon x y
+ flastl$ = "Gluon"
+ @feyn x y
+ if fl>0 then
+ fn = fix(0.5*fl/PhotonL-GluonW)
+ if fn<1 then
+ fn = 1
+ end if
+ fd = fl/(2*fn+1+2*GluonW)
+ fm = fd*(2*fn-1)
+ begin origin
+ begin rotate fa
+ for fi = 0 to fm step 2*fd
+ begin translate fi 0
+ amove 0 0
+ aline (0.05+GluonW*(1-fs9))*fd fs1*PhotonA
+ aline (0.1+GluonW*(1-fs8))*fd fs2*PhotonA
+ aline (0.15+GluonW*(1-fs7))*fd fs3*PhotonA
+ aline (0.2+GluonW*(1-fs6))*fd fs4*PhotonA
+ aline (0.25+GluonW*(1-fs5))*fd fs5*PhotonA
+ aline (0.3+GluonW*(1-fs4))*fd fs6*PhotonA
+ aline (0.35+GluonW*(1-fs3))*fd fs7*PhotonA
+ aline (0.4+GluonW*(1-fs2))*fd fs8*PhotonA
+ aline (0.45+GluonW*(1-fs1))*fd fs9*PhotonA
+ aline (0.5+GluonW)*fd PhotonA
+ aline (0.55+GluonW*(1+fs1))*fd fs9*PhotonA
+ aline (0.6+GluonW*(1+fs2))*fd fs8*PhotonA
+ aline (0.65+GluonW*(1+fs3))*fd fs7*PhotonA
+ aline (0.7+GluonW*(1+fs4))*fd fs6*PhotonA
+ aline (0.75+GluonW*(1+fs5))*fd fs5*PhotonA
+ aline (0.8+GluonW*(1+fs6))*fd fs4*PhotonA
+ aline (0.85+GluonW*(1+fs7))*fd fs3*PhotonA
+ aline (0.9+GluonW*(1+fs8))*fd fs2*PhotonA
+ aline (0.95+GluonW*(1+fs9))*fd fs1*PhotonA
+ aline (1+2*GluonW)*fd 0
+ aline (1.05+GluonW*(1+fs9))*fd -fs1*PhotonA
+ aline (1.1+GluonW*(1+fs8))*fd -fs2*PhotonA
+ aline (1.15+GluonW*(1+fs7))*fd -fs3*PhotonA
+ aline (1.2+GluonW*(1+fs6))*fd -fs4*PhotonA
+ aline (1.25+GluonW*(1+fs5))*fd -fs5*PhotonA
+ aline (1.3+GluonW*(1+fs4))*fd -fs6*PhotonA
+ aline (1.35+GluonW*(1+fs3))*fd -fs7*PhotonA
+ aline (1.4+GluonW*(1+fs2))*fd -fs8*PhotonA
+ aline (1.45+GluonW*(1+fs1))*fd -fs9*PhotonA
+ aline (1.5+GluonW)*fd -PhotonA
+ aline (1.55+GluonW*(1-fs1))*fd -fs9*PhotonA
+ aline (1.6+GluonW*(1-fs2))*fd -fs8*PhotonA
+ aline (1.65+GluonW*(1-fs3))*fd -fs7*PhotonA
+ aline (1.7+GluonW*(1-fs4))*fd -fs6*PhotonA
+ aline (1.75+GluonW*(1-fs5))*fd -fs5*PhotonA
+ aline (1.8+GluonW*(1-fs6))*fd -fs4*PhotonA
+ aline (1.85+GluonW*(1-fs7))*fd -fs3*PhotonA
+ aline (1.9+GluonW*(1-fs8))*fd -fs2*PhotonA
+ aline (1.95+GluonW*(1-fs9))*fd -fs1*PhotonA
+ aline 2*fd 0
+ end translate
+ next fi
+ begin translate 2*fn*fd 0
+ amove 0 0
+ aline (0.05+GluonW*(1-fs9))*fd fs1*PhotonA
+ aline (0.1+GluonW*(1-fs8))*fd fs2*PhotonA
+ aline (0.15+GluonW*(1-fs7))*fd fs3*PhotonA
+ aline (0.2+GluonW*(1-fs6))*fd fs4*PhotonA
+ aline (0.25+GluonW*(1-fs5))*fd fs5*PhotonA
+ aline (0.3+GluonW*(1-fs4))*fd fs6*PhotonA
+ aline (0.35+GluonW*(1-fs3))*fd fs7*PhotonA
+ aline (0.4+GluonW*(1-fs2))*fd fs8*PhotonA
+ aline (0.45+GluonW*(1-fs1))*fd fs9*PhotonA
+ aline (0.5+GluonW)*fd PhotonA
+ aline (0.55+GluonW*(1+fs1))*fd fs9*PhotonA
+ aline (0.6+GluonW*(1+fs2))*fd fs8*PhotonA
+ aline (0.65+GluonW*(1+fs3))*fd fs7*PhotonA
+ aline (0.7+GluonW*(1+fs4))*fd fs6*PhotonA
+ aline (0.75+GluonW*(1+fs5))*fd fs5*PhotonA
+ aline (0.8+GluonW*(1+fs6))*fd fs4*PhotonA
+ aline (0.85+GluonW*(1+fs7))*fd fs3*PhotonA
+ aline (0.9+GluonW*(1+fs8))*fd fs2*PhotonA
+ aline (0.95+GluonW*(1+fs9))*fd fs1*PhotonA
+ aline (1+2*GluonW)*fd 0
+ end translate
+ end rotate
+ end origin
+ amove ffx ffy
+ end if
+end sub
+
+! Gluon line from the current point via xx,yy to x,y
+sub Gluon2 xx yy x y
+ flastl$ = "Gluon2"
+ @feyn2 xx yy x y
+ if fr<PhotonA+fe then
+ @Gluon x y
+ else
+ fn = fix(fr*fl*pi/360/PhotonL-GluonW)
+ if fn<1 then
+ fn = 1
+ end if
+ fd = fl/(2*fn+1+2*GluonW)
+ fm = fd*(2*fn-1)
+ amove fx fy
+ begin origin
+ if fc>0 then
+ for fi = 0 to fm step 2*fd
+ begin rotate fa+fi
+ amove fr 0
+ f1 = fr-PhotonA*fs1
+ f2 = (0.05+GluonW*(1-fs9))*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ f1 = fr-PhotonA*fs2
+ f2 = (0.1+GluonW*(1-fs8))*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ f1 = fr-PhotonA*fs3
+ f2 = (0.15+GluonW*(1-fs7))*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ f1 = fr-PhotonA*fs4
+ f2 = (0.2+GluonW*(1-fs6))*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ f1 = fr-PhotonA*fs5
+ f2 = (0.25+GluonW*(1-fs5))*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ f1 = fr-PhotonA*fs6
+ f2 = (0.3+GluonW*(1-fs4))*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ f1 = fr-PhotonA*fs7
+ f2 = (0.35+GluonW*(1-fs3))*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ f1 = fr-PhotonA*fs8
+ f2 = (0.4+GluonW*(1-fs2))*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ f1 = fr-PhotonA*fs9
+ f2 = (0.45+GluonW*(1-fs1))*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ f1 = fr-PhotonA
+ f2 = (0.5+GluonW)*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ f1 = fr-PhotonA*fs9
+ f2 = (0.55+GluonW*(1+fs1))*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ f1 = fr-PhotonA*fs8
+ f2 = (0.6+GluonW*(1+fs2))*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ f1 = fr-PhotonA*fs7
+ f2 = (0.65+GluonW*(1+fs3))*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ f1 = fr-PhotonA*fs6
+ f2 = (0.7+GluonW*(1+fs4))*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ f1 = fr-PhotonA*fs5
+ f2 = (0.75+GluonW*(1+fs5))*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ f1 = fr-PhotonA*fs4
+ f2 = (0.8+GluonW*(1+fs6))*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ f1 = fr-PhotonA*fs3
+ f2 = (0.85+GluonW*(1+fs7))*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ f1 = fr-PhotonA*fs2
+ f2 = (0.9+GluonW*(1+fs8))*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ f1 = fr-PhotonA*fs1
+ f2 = (0.95+GluonW*(1+fs9))*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ f1 = fr
+ f2 = (1+2*GluonW)*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ f1 = fr+PhotonA*fs1
+ f2 = (1.05+GluonW*(1+fs9))*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ f1 = fr+PhotonA*fs2
+ f2 = (1.1+GluonW*(1+fs8))*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ f1 = fr+PhotonA*fs3
+ f2 = (1.15+GluonW*(1+fs7))*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ f1 = fr+PhotonA*fs4
+ f2 = (1.2+GluonW*(1+fs6))*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ f1 = fr+PhotonA*fs5
+ f2 = (1.25+GluonW*(1+fs5))*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ f1 = fr+PhotonA*fs6
+ f2 = (1.3+GluonW*(1+fs4))*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ f1 = fr+PhotonA*fs7
+ f2 = (1.35+GluonW*(1+fs3))*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ f1 = fr+PhotonA*fs8
+ f2 = (1.4+GluonW*(1+fs2))*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ f1 = fr+PhotonA*fs9
+ f2 = (1.45+GluonW*(1+fs1))*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ f1 = fr+PhotonA
+ f2 = (1.5+GluonW)*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ f1 = fr+PhotonA*fs9
+ f2 = (1.55+GluonW*(1-fs1))*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ f1 = fr+PhotonA*fs8
+ f2 = (1.6+GluonW*(1-fs2))*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ f1 = fr+PhotonA*fs7
+ f2 = (1.65+GluonW*(1-fs3))*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ f1 = fr+PhotonA*fs6
+ f2 = (1.7+GluonW*(1-fs4))*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ f1 = fr+PhotonA*fs5
+ f2 = (1.75+GluonW*(1-fs5))*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ f1 = fr+PhotonA*fs4
+ f2 = (1.8+GluonW*(1-fs6))*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ f1 = fr+PhotonA*fs3
+ f2 = (1.85+GluonW*(1-fs7))*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ f1 = fr+PhotonA*fs2
+ f2 = (1.9+GluonW*(1-fs8))*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ f1 = fr+PhotonA*fs1
+ f2 = (1.95+GluonW*(1-fs9))*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ f1 = fr
+ f2 = 2*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ end rotate
+ next fi
+ begin rotate fa+2*fn*fd
+ amove fr 0
+ f1 = fr-PhotonA*fs1
+ f2 = (0.05+GluonW*(1-fs9))*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ f1 = fr-PhotonA*fs2
+ f2 = (0.1+GluonW*(1-fs8))*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ f1 = fr-PhotonA*fs3
+ f2 = (0.15+GluonW*(1-fs7))*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ f1 = fr-PhotonA*fs4
+ f2 = (0.2+GluonW*(1-fs6))*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ f1 = fr-PhotonA*fs5
+ f2 = (0.25+GluonW*(1-fs5))*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ f1 = fr-PhotonA*fs6
+ f2 = (0.3+GluonW*(1-fs4))*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ f1 = fr-PhotonA*fs7
+ f2 = (0.35+GluonW*(1-fs3))*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ f1 = fr-PhotonA*fs8
+ f2 = (0.4+GluonW*(1-fs2))*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ f1 = fr-PhotonA*fs9
+ f2 = (0.45+GluonW*(1-fs1))*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ f1 = fr-PhotonA
+ f2 = (0.5+GluonW)*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ f1 = fr-PhotonA*fs9
+ f2 = (0.55+GluonW*(1+fs1))*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ f1 = fr-PhotonA*fs8
+ f2 = (0.6+GluonW*(1+fs2))*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ f1 = fr-PhotonA*fs7
+ f2 = (0.65+GluonW*(1+fs3))*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ f1 = fr-PhotonA*fs6
+ f2 = (0.7+GluonW*(1+fs4))*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ f1 = fr-PhotonA*fs5
+ f2 = (0.75+GluonW*(1+fs5))*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ f1 = fr-PhotonA*fs4
+ f2 = (0.8+GluonW*(1+fs6))*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ f1 = fr-PhotonA*fs3
+ f2 = (0.85+GluonW*(1+fs7))*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ f1 = fr-PhotonA*fs2
+ f2 = (0.9+GluonW*(1+fs8))*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ f1 = fr-PhotonA*fs1
+ f2 = (0.95+GluonW*(1+fs9))*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ f1 = fr
+ f2 = (1+2*GluonW)*fd/180*pi
+ aline f1*cos(f2) f1*sin(f2)
+ end rotate
+ else
+ for fi = 0 to fm step 2*fd
+ begin rotate fa-fi
+ amove fr 0
+ f1 = fr+PhotonA*fs1
+ f2 = (0.05+GluonW*(1-fs9))*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ f1 = fr+PhotonA*fs2
+ f2 = (0.1+GluonW*(1-fs8))*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ f1 = fr+PhotonA*fs3
+ f2 = (0.15+GluonW*(1-fs7))*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ f1 = fr+PhotonA*fs4
+ f2 = (0.2+GluonW*(1-fs6))*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ f1 = fr+PhotonA*fs5
+ f2 = (0.25+GluonW*(1-fs5))*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ f1 = fr+PhotonA*fs6
+ f2 = (0.3+GluonW*(1-fs4))*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ f1 = fr+PhotonA*fs7
+ f2 = (0.35+GluonW*(1-fs3))*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ f1 = fr+PhotonA*fs8
+ f2 = (0.4+GluonW*(1-fs2))*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ f1 = fr+PhotonA*fs9
+ f2 = (0.45+GluonW*(1-fs1))*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ f1 = fr+PhotonA
+ f2 = (0.5+GluonW)*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ f1 = fr+PhotonA*fs9
+ f2 = (0.55+GluonW*(1+fs1))*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ f1 = fr+PhotonA*fs8
+ f2 = (0.6+GluonW*(1+fs2))*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ f1 = fr+PhotonA*fs7
+ f2 = (0.65+GluonW*(1+fs3))*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ f1 = fr+PhotonA*fs6
+ f2 = (0.7+GluonW*(1+fs4))*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ f1 = fr+PhotonA*fs5
+ f2 = (0.75+GluonW*(1+fs5))*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ f1 = fr+PhotonA*fs4
+ f2 = (0.8+GluonW*(1+fs6))*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ f1 = fr+PhotonA*fs3
+ f2 = (0.85+GluonW*(1+fs7))*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ f1 = fr+PhotonA*fs2
+ f2 = (0.9+GluonW*(1+fs8))*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ f1 = fr+PhotonA*fs1
+ f2 = (0.95+GluonW*(1+fs9))*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ f1 = fr
+ f2 = (1+2*GluonW)*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ f1 = fr-PhotonA*fs1
+ f2 = (1.05+GluonW*(1+fs9))*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ f1 = fr-PhotonA*fs2
+ f2 = (1.1+GluonW*(1+fs8))*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ f1 = fr-PhotonA*fs3
+ f2 = (1.15+GluonW*(1+fs7))*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ f1 = fr-PhotonA*fs4
+ f2 = (1.2+GluonW*(1+fs6))*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ f1 = fr-PhotonA*fs5
+ f2 = (1.25+GluonW*(1+fs5))*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ f1 = fr-PhotonA*fs6
+ f2 = (1.3+GluonW*(1+fs4))*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ f1 = fr-PhotonA*fs7
+ f2 = (1.35+GluonW*(1+fs3))*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ f1 = fr-PhotonA*fs8
+ f2 = (1.4+GluonW*(1+fs2))*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ f1 = fr-PhotonA*fs9
+ f2 = (1.45+GluonW*(1+fs1))*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ f1 = fr-PhotonA
+ f2 = (1.5+GluonW)*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ f1 = fr-PhotonA*fs9
+ f2 = (1.55+GluonW*(1-fs1))*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ f1 = fr-PhotonA*fs8
+ f2 = (1.6+GluonW*(1-fs2))*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ f1 = fr-PhotonA*fs7
+ f2 = (1.65+GluonW*(1-fs3))*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ f1 = fr-PhotonA*fs6
+ f2 = (1.7+GluonW*(1-fs4))*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ f1 = fr-PhotonA*fs5
+ f2 = (1.75+GluonW*(1-fs5))*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ f1 = fr-PhotonA*fs4
+ f2 = (1.8+GluonW*(1-fs6))*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ f1 = fr-PhotonA*fs3
+ f2 = (1.85+GluonW*(1-fs7))*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ f1 = fr-PhotonA*fs2
+ f2 = (1.9+GluonW*(1-fs8))*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ f1 = fr-PhotonA*fs1
+ f2 = (1.95+GluonW*(1-fs9))*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ f1 = fr
+ f2 = 2*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ end rotate
+ next fi
+ begin rotate fa-2*fn*fd
+ amove fr 0
+ f1 = fr+PhotonA*fs1
+ f2 = (0.05+GluonW*(1-fs9))*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ f1 = fr+PhotonA*fs2
+ f2 = (0.1+GluonW*(1-fs8))*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ f1 = fr+PhotonA*fs3
+ f2 = (0.15+GluonW*(1-fs7))*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ f1 = fr+PhotonA*fs4
+ f2 = (0.2+GluonW*(1-fs6))*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ f1 = fr+PhotonA*fs5
+ f2 = (0.25+GluonW*(1-fs5))*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ f1 = fr+PhotonA*fs6
+ f2 = (0.3+GluonW*(1-fs4))*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ f1 = fr+PhotonA*fs7
+ f2 = (0.35+GluonW*(1-fs3))*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ f1 = fr+PhotonA*fs8
+ f2 = (0.4+GluonW*(1-fs2))*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ f1 = fr+PhotonA*fs9
+ f2 = (0.45+GluonW*(1-fs1))*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ f1 = fr+PhotonA
+ f2 = (0.5+GluonW)*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ f1 = fr+PhotonA*fs9
+ f2 = (0.55+GluonW*(1+fs1))*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ f1 = fr+PhotonA*fs8
+ f2 = (0.6+GluonW*(1+fs2))*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ f1 = fr+PhotonA*fs7
+ f2 = (0.65+GluonW*(1+fs3))*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ f1 = fr+PhotonA*fs6
+ f2 = (0.7+GluonW*(1+fs4))*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ f1 = fr+PhotonA*fs5
+ f2 = (0.75+GluonW*(1+fs5))*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ f1 = fr+PhotonA*fs4
+ f2 = (0.8+GluonW*(1+fs6))*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ f1 = fr+PhotonA*fs3
+ f2 = (0.85+GluonW*(1+fs7))*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ f1 = fr+PhotonA*fs2
+ f2 = (0.9+GluonW*(1+fs8))*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ f1 = fr+PhotonA*fs1
+ f2 = (0.95+GluonW*(1+fs9))*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ f1 = fr
+ f2 = (1+2*GluonW)*fd/180*pi
+ aline f1*cos(f2) -f1*sin(f2)
+ end rotate
+ end if
+ end origin
+ amove ffx ffy
+ end if
+end sub
+
+ArrowL = 0.2 ! length
+ArrowA = 0.1 ! amplitude
+ArrowD = 0 ! displacement
+
+! Arrow on the last line, fraction F from the beginning
+sub Arrow f
+ if fl>0 then
+ gsave
+ amove fx fy
+ begin origin
+ if fr>0 then
+ f1 = fa+fc*(f*fl+90)
+ fx1 = 0
+ fy1 = ArrowD-fc*fr
+ else
+ f1 = fa
+ fx1 = f*fl
+ fy1 = ArrowD
+ end if
+ begin rotate f1
+ amove fx1 fy1
+ begin origin
+ aline -ArrowL ArrowA
+ amove 0 0
+ aline -ArrowL -ArrowA
+ end origin
+ end rotate
+ end origin
+ grestore
+ end if
+end sub
+
+ShadowL = 0.2 ! length
+ShadowA = 0.1 ! amplitude
+ShadowC$ = "white"
+
+! Shadows lines below the last line, fraction F from the beginning
+sub Shadow f
+ if fl>0 then
+ gsave
+ amove fx fy
+ begin origin
+ if fr>0 then
+ f1 = fa+fc*(f*fl+90)
+ fx1 = 0
+ fy1 = -fc*fr
+ else
+ f1 = fa
+ fx1 = f*fl
+ fy1 = 0
+ end if
+ begin rotate f1
+ amove fx1 fy1
+ begin origin
+ amove -.5*ShadowL -ShadowA
+ box ShadowL 2*ShadowA fill ShadowC$ nobox
+ end origin
+ end rotate
+ end origin
+ grestore
+ end if
+ !redraw line
+
+ if flastl$="Fermion" then
+ amove fx fy
+ @Fermion ffx ffy
+ end if
+ if flastl$="Fermion2" then
+ amove fsx fsy
+ @Fermion2 fxx fyy ffx ffy
+ end if
+ if flastl$="Double" then
+ amove fx fy
+ @Double ffx ffy
+ end if
+ if flastl$="Double2" then
+ amove fsx fsy
+ @Double2 fxx fyy ffx ffy
+ end if
+ if flastl$="Dash" then
+ amove fx fy
+ @Dash ffx ffy
+ end if
+ if flastl$="Dash2" then
+ amove fsx fsy
+ @Dash2 fxx fyy ffx ffy
+ end if
+ if flastl$="Zigzag" then
+ amove fx fy
+ @Zigzag ffx ffy
+ end if
+ if flastl$="Zigzag2" then
+ amove fsx fsy
+ @Zigzag2 fxx fyy ffx ffy
+ end if
+ if flastl$="Photon" then
+ amove fx fy
+ @Photon ffx ffy
+ end if
+ if flastl$="Photon2" then
+ amove fsx fsy
+ @Photon2 fxx fyy ffx ffy
+ end if
+ if flastl$="Gluon" then
+ amove fx fy
+ @Gluon ffx ffy
+ end if
+ if flastl$="Gluon2" then
+ amove fsx fsy
+ @Gluon2 fxx fyy ffx ffy
+ end if
+
+
+end sub
+
+MomL = 0.35 ! half-length
+MomD = 0.25 ! displacement
+
+! Arrow for indication of momentum near the last line
+sub Mom f
+ if fl>0 then
+ gsave
+ amove fx fy
+ begin origin
+ if fr>0 then
+ f1 = fa+fc*(f*fl+90)
+ fx1 = 0
+ fy1 = MomD-fc*fr
+ else
+ f1 = fa
+ fx1 = f*fl
+ fy1 = MomD
+ end if
+ begin rotate f1
+ amove fx1 fy1
+ begin origin
+ amove MomL 0
+ aline -MomL 0
+ amove MomL 0
+ aline MomL-ArrowL ArrowA
+ amove MomL 0
+ aline MomL-ArrowL -ArrowA
+ end origin
+ end rotate
+ end origin
+ grestore
+ end if
+end sub
+
+! Double arrow near the last line
+sub DMom f
+ if fl>0 then
+ gsave
+ amove fx fy
+ begin origin
+ if fr>0 then
+ f1 = fa+fc*(f*fl+90)
+ fx1 = 0
+ fy1 = MomD-fc*fr
+ else
+ f1 = fa
+ fx1 = f*fl
+ fy1 = MomD
+ end if
+ begin rotate f1
+ amove fx1 fy1
+ begin origin
+ amove MomL*(1-(DoubleA/ArrowA)) DoubleA
+ aline -MomL DoubleA
+ amove MomL*(1-(DoubleA/ArrowA)) -DoubleA
+ aline -MomL -DoubleA
+ amove MomL 0
+ aline MomL-ArrowL ArrowA
+ amove MomL 0
+ aline MomL-ArrowL -ArrowA
+ end origin
+ end rotate
+ end origin
+ grestore
+ end if
+end sub
diff --git a/src/lib/graphutil.gle b/src/lib/graphutil.gle
new file mode 100644
index 0000000..a8f5495
--- /dev/null
+++ b/src/lib/graphutil.gle
@@ -0,0 +1,421 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+! Subroutines for drawing graphs
+
+sub graph_line x1 y1 x2 y2
+ ! Function to draw a line on a graph
+ ! x1, y2 = start point
+ ! x2, y2 = end point
+ default x1 xgmin
+ default y1 ygmin
+ default x2 xgmax
+ default y2 ygmax
+ amove xg(x1) yg(y1)
+ aline xg(x2) yg(y2)
+end sub
+
+sub graph_hline y x1 x2
+ ! Function to draw a horizontal line on a graph
+ ! y = y-point of line
+ ! x1, x2 = range of line
+ default x1 xgmin
+ default x2 xgmax
+ amove xg(x1) yg(y)
+ aline xg(x2) yg(y)
+end sub
+
+sub graph_vline x y1 y2
+ ! Function to draw a vertical line on a graph
+ ! x = x-point of line
+ ! y1, y2 = range of line
+ default y1 ygmin
+ default y2 ygmax
+ amove xg(x) yg(y1)
+ aline xg(x) yg(y2)
+end sub
+
+sub invxg x
+ local s = (xg(xgmax)-xg(xgmin))/(xgmax - xgmin)
+ return (x - xg(xgmin) + s*xgmin)/s
+end sub
+
+sub invyg y
+ local s = (yg(ygmax)-yg(ygmin))/(ygmax - ygmin)
+ return (y - yg(ygmin) + s*ygmin)/s
+end sub
+
+sub graph_textbox xp yp label$ dx dy add
+ default dx 0
+ default dy 0
+ default xp xgmin
+ default yp ygmin
+ default add 0.1
+ amove xg(xp)+dx+add yg(yp)+dy+add
+ begin box add add fill white
+ write label$
+ end box
+end sub
+
+sub graph_text xp yp label$ dx dy
+ default dx 0
+ default dy 0
+ default xp xgmin
+ default yp ygmin
+ amove xg(xp)+dx yg(yp)+dy
+ write label$
+end sub
+
+sub graph_del wd sca
+ ! Function returning the offset of the drawing area of a graph
+ ! wd = width of the graph
+ ! sca = hscale parameter of the graph
+ return (wd-wd*sca)/2
+end sub
+
+sub graph_select wd hi hsc vsc xmn xmx ymn ymx
+ ! Initialize graph variables and functions such as xg() and yg()
+ ! wd = width of graph
+ ! hi = height of graph
+ ! hsc = hscale parameter of graph
+ ! vsc = vscale parameter of graph
+ ! xmn, xmx = minimum and maximum xaxis value
+ ! ymn, ymx = minimum and maximum yaxis value
+ begin graph
+ size wd hi
+ nobox
+ hscale hsc
+ vscale vsc
+ xaxis min xmn max xmx off
+ yaxis min ymn max ymx off
+ end graph
+ graphx = xpos()
+ graphy = ypos()
+end sub
+
+sub graph_hgrid nb color$
+ ! Function to draw an horizontal equidistant grid on a graph
+ ! (use 'under graph_hgrid 5 "red"' in your graph block)
+ ! nb = number of lines in grid
+ ! color$ = color for grid lines
+ gsave
+ local i
+ set color color$
+ for i = 1 to nb
+ local yp = yg(ygmin+(ygmax-ygmin)/(nb+1)*i)
+ amove xg(xgmin) yp
+ aline xg(xgmax) yp
+ next i
+ grestore
+end sub
+
+sub graph_vgrid nb color$
+ ! Function to draw a vertical equidistant grid on a graph
+ ! (use 'under graph_vgrid 5 "red"' in your graph block)
+ ! nb = number of lines in grid
+ ! color$ = color for grid lines
+ gsave
+ local i
+ set color color$
+ for i = 1 to nb
+ local xp = xg(xgmin+(xgmax-xgmin)/(nb+1)*i)
+ amove xp yg(ygmin)
+ aline xp yg(ygmax)
+ next i
+ grestore
+end sub
+
+sub graph_grid nbh nbv color$
+ ! Function to draw an equidistant grid on a graph
+ ! (use 'under graph_grid 5 "red"' in your graph block)
+ ! nb = number of lines in grid
+ ! color$ = color for grid lines
+ graph_hgrid nbh color$
+ graph_vgrid nbv color$
+end sub
+
+sub graph_origin
+ ! Go to the origin of a graph selected with selectgraph
+ amove graphx graphy
+end sub
+
+sub graph_zeroaxis style color$
+ gsave
+ tickw = 0.3*0.3+0.1
+ set lstyle style color color$
+ amove xg(xgmin)+tickw yg(0)
+ aline xg(xgmax)-tickw yg(0)
+ amove xg(0) yg(ygmin)+tickw
+ aline xg(0) yg(ygmax)-tickw
+ grestore
+end sub
+
+sub graph_print_inv x y
+ print "xg("+format$(invxg(x),"fix 2")+") yg("+format$(invyg(y),"fix 2")+")"
+end sub
+
+sub dmaxx ds$
+ ! Function to compute the maximum x-value of a dataset
+ local i
+ local crmax = dataxvalue(ds$,1)
+ for i = 2 to ndata(ds$)
+ crmax = max(crmax, dataxvalue(ds$,i))
+ next i
+ return crmax
+end sub
+
+sub dmaxy ds$
+ ! Function to compute the maximum y-value of a dataset
+ local i
+ local crmax = datayvalue(ds$,1)
+ for i = 2 to ndata(ds$)
+ crmax = max(crmax, datayvalue(ds$,i))
+ next i
+ return crmax
+end sub
+
+sub dminx ds$
+ ! Function to compute the minimum x-value of a dataset
+ local i
+ local crmin = dataxvalue(ds$,1)
+ for i = 2 to ndata(ds$)
+ crmin = min(crmin, dataxvalue(ds$,i))
+ next i
+ return crmin
+end sub
+
+sub dminy ds$
+ ! Function to compute the minimum y-value of a dataset
+ local i
+ local crmin = datayvalue(ds$,1)
+ for i = 2 to ndata(ds$)
+ crmin = min(crmin, datayvalue(ds$,i))
+ next i
+ return crmin
+end sub
+
+sub dmeany ds$
+ ! Function to compute the mean y-value of a dataset
+ local i
+ local sum = 0
+ for i = 1 to ndata(ds$)
+ sum = sum + datayvalue(ds$,i)
+ next i
+ return sum/ndata(ds$)
+end sub
+
+sub darea ds$
+ ! Function to compute the area between a dataset and the x-axis
+ local i
+ local area = 0
+ local prev_x = dataxvalue(ds$,1)
+ local prev_y = datayvalue(ds$,1)
+ for i = 2 to ndata(ds$)
+ local x = dataxvalue(ds$,i)
+ local y = datayvalue(ds$,i)
+ area = area + (x-prev_x)*(prev_y+y)/2
+ prev_x = x; prev_y = y
+ next i
+ return area
+end sub
+
+sub dmeany_x d$ x
+ ! compute average y-value for given x-value x for dataset d$
+ local i
+ local nb_y = 0
+ local sum_y = 0
+ for i = 1 to ndata(d$)
+ if dataxvalue(d$,i) = x then
+ nb_y = nb_y + 1
+ sum_y = sum_y + datayvalue(d$,i)
+ end if
+ next i
+ return sum_y / nb_y
+end sub
+
+sub derry_up_x d$ x
+ ! compute maximum upward deviation from the mean y-value
+ local i
+ local max_err = -1e300
+ local mean = dmeany_x(d$, x)
+ for i = 1 to ndata(d$)
+ if dataxvalue(d$,i) = x then
+ max_err = max(max_err, datayvalue(d$,i)-mean)
+ end if
+ next i
+ return max_err
+end sub
+
+sub derry_down_x d$ x
+ ! compute maximum downward deviation from the mean y-value
+ local i
+ local max_err = -1e300
+ local mean = dmeany_x(d$, x)
+ for i = 1 to ndata(d$)
+ if dataxvalue(d$,i) = x then
+ max_err = max(max_err, mean-datayvalue(d$,i))
+ end if
+ next i
+ return max_err
+end sub
+
+sub bar_draw_error_interval bar xval yval error
+ ! Function to draw an error interval on a bar dataset with multiple bars
+ amove xbar(xval,bar)-0.1 yg(yval+error)
+ aline xbar(xval,bar)+0.1 yg(yval+error)
+ amove xbar(xval,bar) yg(yval+error)
+ aline xbar(xval,bar) yg(yval-error)
+ amove xbar(xval,bar)-0.1 yg(yval-error)
+ aline xbar(xval,bar)+0.1 yg(yval-error)
+end sub
+
+sub bar_draw_error_intervals data$ err$ bar
+ ! Function to draw error intervals on a bar dataset with multiple bars
+ ! E.g.,
+ !
+ ! begin graph
+ ! data "mydata.csv"
+ ! bar d1,d3 fill grey50,grey20
+ ! end graph
+ !
+ ! bar_draw_error_intervals "d1" "d2" 1
+ ! bar_draw_error_intervals "d3" "d4" 2
+ local nb = ndata(data$)
+ for i = 1 to nb
+ local xval = dataxvalue(data$,i)
+ local yval = datayvalue(data$,i)
+ local error = datayvalue(err$,i)
+ bar_draw_error_interval bar xval yval error
+ next i
+end sub
+
+sub boxplot ds0 bwidth msize
+ default ds0 1
+ default bwidth 0.4
+ default msize 1.5
+ set cap round
+ for i = 1 to ndata("d"+num$(ds0))
+ local x = dataxvalue("d"+num$(ds0), i)
+ ! avg min Q.25 Q.5 Q.75 max
+ ! 0 1 2 3 4 5
+ local meanv = datayvalue("d"+num$(ds0), i)
+ local minv = datayvalue("d"+num$(ds0+1), i)
+ local q25 = datayvalue("d"+num$(ds0+2), i)
+ local q50 = datayvalue("d"+num$(ds0+3), i)
+ local q75 = datayvalue("d"+num$(ds0+4), i)
+ local maxv = datayvalue("d"+num$(ds0+5), i)
+ amove xg(x)-bwidth/2 yg(minv)
+ aline xg(x)+bwidth/2 yg(minv)
+ amove xg(x) yg(minv)
+ aline xg(x) yg(q25)
+ amove xg(x)-bwidth/2 yg(q25)
+ box bwidth yg(q75)-yg(q25)
+ amove xg(x)-bwidth/2 yg(q50)
+ aline xg(x)+bwidth/2 yg(q50)
+ amove xg(x) yg(q75)
+ aline xg(x) yg(maxv)
+ amove xg(x)-bwidth/2 yg(maxv)
+ aline xg(x)+bwidth/2 yg(maxv)
+ amove xg(x) yg(meanv)
+ marker fdiamond msize*bwidth
+ next i
+end sub
+
+sub draw_box_plot ds0
+ !compatibility
+ boxplot ds0 0.4 1.5
+end sub
+
+sub energylevel ds$ factor color$
+ default ds "d1"
+ default factor 1.0
+ default color "black"
+ local hist_prev_x = 0
+ local hist_x1, hist_x2
+ local hist_has_prev = 0
+ set color color$
+ for i = 1 to ndata(ds$)
+ local hist_valid = 1
+ if (i < ndata(ds$)) then
+ hist_x2 = (dataxvalue(ds$, i+1) + dataxvalue(ds$, i))/2
+ if (hist_has_prev = 1) then
+ hist_x1 = (hist_prev_x + dataxvalue(ds$, i))/2
+ else
+ hist_x1 = 2*dataxvalue(ds$, i) - hist_x2
+ end if
+ else
+ if (hist_has_prev = 1) then
+ hist_x1 = (hist_prev_x + dataxvalue(ds$, i))/2
+ hist_x2 = 2*dataxvalue(ds$, i) - hist_x1;
+ else
+ hist_valid = 0
+ end if
+ end if
+ if (hist_valid = 1) then
+ local xmid = (hist_x1 + hist_x2) / 2
+ local len = (hist_x2 - hist_x1) / 2
+ amove xg(xmid - len*factor) yg(datayvalue(ds$, i))
+ aline xg(xmid + len*factor) yg(datayvalue(ds$, i))
+ end if
+ hist_has_prev = 1
+ hist_prev_x = dataxvalue(ds$, i)
+ next i
+end sub
+
+sub graph_shaded_background from to pixels
+ default from 0.7
+ default to 1.0
+ default pixels 200
+ amove xg(xgmin) yg(ygmin)
+ local wd = xg(xgmax)-xg(xgmin)
+ local hi = yg(ygmax)-yg(ygmin)
+ colormap y 0 0 from to 1 pixels wd hi
+end sub
+
+sub autocolor dn
+ if dn = 1 then return "red"
+ else if dn = 2 then return "blue"
+ else if dn = 3 then return "green"
+ else if dn = 4 then return "purple"
+ else if dn = 5 then return "black"
+ else if dn = 6 then return "darkorange"
+ else if dn = 7 then return "teal"
+ else if dn = 8 then return "brown"
+ else if dn = 9 then return "lawngreen"
+ else return "gold"
+end sub
diff --git a/src/lib/include_en.gle b/src/lib/include_en.gle
new file mode 100644
index 0000000..b18b7f7
--- /dev/null
+++ b/src/lib/include_en.gle
@@ -0,0 +1,121 @@
+! Subroutines and definitions to draw figures in "arbitrary" units
+! Definitions of colors distinguishable by color blinds
+! Subroutines for positioning labels left/right/centered to a given point
+
+! USAGE
+! =====
+! 1. Start the first line of your gle file with
+! include "include_en.gle"
+! 2. Modify the value of the variable finalsize (see line 31)
+! according to your needs; this variable gives the size of
+! your figure _after_ inclusion into your text document
+! 3. Replace dimensions (and colors) in your main gle file; f.e.
+! set hei tinyhei
+! set lwidth lnwidth
+! set color blue$
+! xtitle "ABC" hei charhei
+! xaxis hei charhei
+! xside lwidth lnwidth
+! xticks lwidth lnwidth length ldwidth
+! d1 line lwidth lswidth color red$
+! 4. Enjoy ``correct'' line widths and font sizes in your figure
+! after inclusion into your text document
+!
+
+! Default paper format: DIN A4 landscape
+!*********************
+size 29.7 21.0
+! but final figure should have a width of <finalsize> cm
+! ************ *****
+! (without compensation for the default "scale 0.7 0.7")
+finalsize = 8.5 ! cm
+factor = pagewidth()/finalsize
+
+
+sub val2cm val unit$
+!*** Conversion from arbitrary units to cm
+! In: val Value in units
+! unit$ unit
+! Returns: val*factor
+ if unit$ = "inch" then
+ return val*2.54*factor
+ else if unit$ = "bp" then
+ return val/72*2.54*factor
+ else if unit$ = "pt" then
+ return val/72.27*2.54*factor
+ else if unit$ = "pica" then
+ return val/6.0225*2.54*factor
+ else if unit$ = "didot" then
+ return val/67.553*2.54*factor
+ else if unit$ = "cicero" then
+ return val/5.6294*2.54*factor
+ end if
+end sub
+!******
+
+! Font sizes
+!************
+! as recommended by most publishers
+! smallest font: 6 point; largest font: 12 point
+titlehei = val2cm(12,"bp")
+charhei = val2cm(10,"bp")
+smallhei = val2cm( 8,"bp")
+foothei = val2cm( 7,"bp")
+tinyhei = val2cm( 6,"bp")
+set hei charhei
+
+! Thickness of lines
+!*******************
+lswidth = val2cm(1,"bp") ! small
+lnwidth = val2cm(2,"bp") ! normal
+ldwidth = val2cm(4,"bp") ! double
+
+! Colors for color blinds
+!************************
+black$ = "rgb255(0,0,0)"
+orange$ = "rgb255(230,159,0)"
+skyeblue$ = "rgb255(86,180,233)"
+green$ = "rgb255(0,158,115)" ! "bluish green"
+yellow$ = "rgb255(240,228,66)"
+blue$ = "rgb255(0,114,178)"
+red$ = "rgb255(213,94,0)" ! vermillon
+purple$ = "rgb255(204,121,167)" ! "reddish purple"
+
+! Font
+!******
+! PostScript AvantGarde Demi
+set font psagd
+
+sub labelC x y height var$
+! labeling centered to x,y
+ set hei height
+ amove xg(x) yg(y)
+ rmove -.5*twidth(var$) -.5*theight(var$)
+ write var$
+end sub
+
+sub labelR x y height var$
+! labeling ends at x,y
+ set hei height
+ amove xg(x) yg(y)
+ rmove -1.*twidth(var$) -.5*theight(var$)
+ write var$
+end sub
+
+sub labelL x y height var$
+! labeling starts at x,y
+ set hei height
+ amove xg(x) yg(y)
+ rmove 0 -.5*theight(var$)
+ write var$
+end sub
+
+! LaTeX
+!******
+begin texpreamble
+ \usepackage{mathptmx}\renewcommand{\familydefault}{phv}
+ \usepackage{amsmath}
+ \boldmath
+end texpreamble
+set texscale scale
+! set texlabels 1 ! see manual, chapter 7.2
diff --git a/src/lib/matrix_3D.gle b/src/lib/matrix_3D.gle
new file mode 100644
index 0000000..a7cb746
--- /dev/null
+++ b/src/lib/matrix_3D.gle
@@ -0,0 +1,454 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 Jan Soubusta !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+! This library is designed to plot 3D BAR graphs of square matrices
+
+! ----------------------------------------------------------------------
+! Global constants with typical values:
+! ----------------------------------------------------------------------
+! mmax (4 or 16) size of the matrix
+! r (6 cm) the matrix is drawn to a 3D cube r.r.r
+! alfa (25 deg) rotation of the cube in horizontal direction
+! beta (30 deg) rotation of the cube in vertical direction
+! ----------------------------------------------------------------------
+! x0,y0 position of the left bottom corner of the cube
+! xgrp, ygrp position of the perspective point of infinity
+! persp_scale (3) perspective scale
+! ----------------------------------------------------------------------
+! z_axis_min z_axis_bottom_value
+! z_axis_max z_axis_top_value
+! z0 baseline for drawing 3D bars up or down
+! ----------------------------------------------------------------------
+!
+! Used colors:
+! ----------------------------------------------------------------------
+! color_frame$, col_T$, col_L$, col_R$, col_BR$, col_BL$
+! ----------------------------------------------------------------------
+!
+! Important subroutines
+!
+! sub project_3D2D s1 s2 s3
+! Takes one point of 3D box [s1,s2,s3] and calculates its position in
+! the picture [xgr,ygr]
+!
+! sub draw_back_frame
+! Draws three back lines of the cube.
+!
+! sub draw_middle_frame
+! Draws six additional lines of the cube.
+!
+! sub draw_front_frame
+! Draws three front lines of the cube.
+!
+! sub normalize_z zvalue
+! Calculates normalized z coordinate in a range (0,1)
+! (zvalue - bottom_z_value)/(top_z_value - bottom_z_value)
+!
+! sub draw_bar_z i j zvalue
+! Draws one bar, (i,j) element of the matrix with a given value (zvalue).
+!
+! sub draw_matrix_row k l
+! Draws one row of the matrix. The subroutine reads one row of the matrix
+! and displays the elements in reverse order (the last one the first).
+! This condition ensures correct resulting visualization.
+!
+! sub draw_z_ticks h1 h2 h3
+! Draws ticks with labels to z_axis: from h1, to h2, with a step h3.
+! The format of z_axis labels can be set, e.g.
+! formatz$ = "fix 2"
+!
+! sub draw_xy_ticks
+! Draws ticks to x_axis and y_axis
+!
+! sub label_x i txt$
+! Draws label txt$ to i-th x_axis tick.
+!
+! sub label_y i txt$
+! Draws label txt$ to i-th y_axis tick.
+
+r = 6
+color_frame$ = "black"
+col_T$ = "rgb(1,.8,.8)"
+col_L$ = "rgb(.8,.8,1)"
+col_R$ = "rgb(.8,1,.8)"
+col_BR$ = "rgb(.6,.6,1)"
+col_BL$ = "rgb(.6,1,.6)"
+
+dmin = z_axis_min
+dmax = z_axis_max
+
+sa = sin(torad(alfa))
+ca = cos(torad(alfa))
+sb = sin(torad(beta))
+cb = cos(torad(beta))
+ux = todeg(atan((ca/sa)*sb))
+uy = -todeg(atan((sa/ca)*sb))
+
+x0 = 0; y0 = 0
+
+set join round just cc
+
+!-----------------------------------------------------------
+
+sub project_3D2D s1 s2 s3
+ xgr = x0+r*(s1*ca+s2*sa)
+ local zp = s1*sa-s2*ca
+ ygr = y0+r*(s3*cb-zp*sb)
+ zp = s3*sb+zp*cb
+ ! perspektiva
+ if (zp<persp_scale) then
+ local zper = persp_scale/(persp_scale-zp)
+ xgr = zper*xgr+(1-zper)*xgrp
+ ygr = zper*ygr+(1-zper)*ygrp
+ else
+ ! IT IS OUT, predmety nejsou prede mnou, ale za mnou
+ xgr = 0
+ ygr = 0
+ end if
+end sub
+
+!-----------------------------------------------------------
+
+sub od_do a1 a2 a3 b1 b2 b3
+ project_3D2D a1 a2 a3
+ amove xgr ygr
+ project_3D2D b1 b2 b3
+ aline xgr ygr
+end sub
+
+!-----------------------------------------------------------
+
+sub _do b1 b2 b3
+ amove xgr ygr
+ project_3D2D b1 b2 b3
+ aline xgr ygr
+end sub
+
+!-----------------------------------------------------------
+
+sub draw_back_frame
+ gsave
+ set color color_frame$
+ od_do 0 1 0 0 0 0
+ od_do 0 1 0 1 1 0
+ od_do 0 1 0 0 1 1
+ grestore
+end sub
+
+!-----------------------------------------------------------
+
+sub draw_middle_frame
+ gsave
+ set color color_frame$
+ od_do 0 0 0 0 0 1
+ _do 0 1 1
+ _do 1 1 1
+ _do 1 1 0
+ _do 1 0 0
+ _do 0 0 0
+ grestore
+end sub
+
+!-----------------------------------------------------------
+
+sub draw_front_frame
+ gsave
+ set color color_frame$
+ od_do 1 0 1 0 0 1
+ od_do 1 0 1 1 1 1
+ od_do 1 0 1 1 0 0
+ grestore
+end sub
+
+!-----------------------------------------------------------
+
+sub draw_bar_z_zero i j
+ project_3D2D (i-1)/mmax (j-1)/mmax z0
+ x_1=xgr; y_1=ygr
+ project_3D2D (i)/mmax (j-1)/mmax z0
+ x_2=xgr; y_2=ygr
+ project_3D2D (i)/mmax (j)/mmax z0
+ x_3=xgr; y_3=ygr
+ project_3D2D (i-1)/mmax (j)/mmax z0
+ x_4=xgr; y_4=ygr
+ begin path fill col_T$ stroke
+ amove x_1 y_1
+ aline x_2 y_2
+ aline x_3 y_3
+ aline x_4 y_4
+ closepath
+ end path
+end sub
+
+!-----------------------------------------------------------
+
+sub draw_bar_z_up i j z
+ project_3D2D (i-1)/mmax (j-1)/mmax z
+ x_1=xgr; y_1=ygr
+ project_3D2D (i)/mmax (j-1)/mmax z
+ x_2=xgr; y_2=ygr
+ project_3D2D (i)/mmax (j)/mmax z
+ x_3=xgr; y_3=ygr
+ project_3D2D (i-1)/mmax (j)/mmax z
+ x_4=xgr; y_4=ygr
+ project_3D2D (i-1)/mmax (j-1)/mmax z0
+ x_01=xgr; y_01=ygr
+ project_3D2D (i)/mmax (j-1)/mmax z0
+ x_02=xgr; y_02=ygr
+ project_3D2D (i)/mmax (j)/mmax z0
+ x_03=xgr; y_03=ygr
+ begin path fill col_T$ stroke
+ amove x_1 y_1
+ aline x_2 y_2
+ aline x_3 y_3
+ aline x_4 y_4
+ closepath
+ end path
+ begin path fill col_L$ stroke
+ amove x_1 y_1
+ aline x_01 y_01
+ aline x_02 y_02
+ aline x_2 y_2
+ closepath
+ end path
+ begin path fill col_R$ stroke
+ amove x_2 y_2
+ aline x_02 y_02
+ aline x_03 y_03
+ aline x_3 y_3
+ closepath
+ end path
+end sub
+
+!-----------------------------------------------------------
+
+sub draw_bar_z_down i j z
+ project_3D2D (i-1)/mmax (j-1)/mmax z
+ x_1=xgr; y_1=ygr
+ project_3D2D (i)/mmax (j-1)/mmax z
+ x_2=xgr; y_2=ygr
+ project_3D2D (i)/mmax (j)/mmax z
+ x_3=xgr; y_3=ygr
+ project_3D2D (i-1)/mmax (j)/mmax z
+ x_4=xgr; y_4=ygr
+
+ project_3D2D (i-1)/mmax (j-1)/mmax z0
+ x_01=xgr; y_01=ygr
+ project_3D2D (i)/mmax (j-1)/mmax z0
+ x_02=xgr; y_02=ygr
+ project_3D2D (i)/mmax (j)/mmax z0
+ x_03=xgr; y_03=ygr
+ project_3D2D (i-1)/mmax (j)/mmax z0
+ x_04=xgr; y_04=ygr
+
+ begin clip
+ begin path clip
+ amove x_01 y_01
+ aline x_02 y_02
+ aline x_03 y_03
+ aline x_04 y_04
+ closepath
+ end path
+ begin path fill col_T$ stroke
+ amove x_1 y_1
+ aline x_2 y_2
+ aline x_3 y_3
+ aline x_4 y_4
+ closepath
+ end path
+ begin path fill col_BL$ stroke
+ amove x_1 y_1
+ aline x_01 y_01
+ aline x_04 y_04
+ aline x_4 y_4
+ closepath
+ end path
+ begin path fill col_BR$ stroke
+ amove x_4 y_4
+ aline x_04 y_04
+ aline x_03 y_03
+ aline x_3 y_3
+ closepath
+ end path
+ end clip
+ begin path fill col_L$ stroke
+ amove x_1 y_1
+ aline x_01 y_01
+ aline x_02 y_02
+ aline x_2 y_2
+ closepath
+ end path
+ begin path fill col_R$ stroke
+ amove x_2 y_2
+ aline x_02 y_02
+ aline x_03 y_03
+ aline x_3 y_3
+ closepath
+ end path
+end sub
+
+!-----------------------------------------------------------
+
+sub normalize_z zvalue !zvalue (0 , 1)
+ local vys
+ if (zvalue<dmin) then
+ dmin=zvalue
+ else if (zvalue>dmax) then
+ dmax=zvalue
+ end if
+ vys=(zvalue-z_axis_min)/(z_axis_max-z_axis_min)
+ return vys
+end sub
+
+!-----------------------------------------------------------
+
+sub normalize_z0 zvalue !zvalue (0 , 1)
+ local vys
+ vys=(zvalue-z_axis_min)/(z_axis_max-z_axis_min)
+ return vys
+end sub
+
+!-----------------------------------------------------------
+
+sub draw_bar_z i j zvalue
+ z=normalize_z(zvalue)
+ if (z>z0) then
+ draw_bar_z_up i j z
+ else if (z<z0) then
+ draw_bar_z_down i j z
+ else
+ draw_bar_z_zero i j
+ end if
+end sub
+
+!-----------------------------------------------------------
+
+sub draw_matrix_row k l
+ local h
+ fread vstup h
+ if (l<mmax) then
+ draw_matrix_row k l+1
+ end if
+ draw_bar_z k l h
+end sub
+
+!-----------------------------------------------------------
+
+sub draw_z_ticks h1 h2 h3
+ kk=(h2-h1)/h3
+ for k=0 to kk
+ zvalue=h1+k*h3
+ z=normalize_z0(zvalue)
+ !@od_do 0 0 z -.03 -.03 z
+ !@project_3D2D -.07 -.07 z
+ ! amove xgr ygr+.05
+ project_3D2D 0 0 z
+ amove xgr ygr
+ rline -.2 0
+ rmove -.35 0
+ if (formatz$="") then
+ if (abs(zvalue)<1e-5) then
+ write 0
+ else
+ write zvalue
+ end if
+ else
+ write format$(zvalue,formatz$)
+ end if
+ next k
+end sub
+
+!-----------------------------------------------------------
+
+sub draw_xy_ticks
+ for k=0 to mmax-1
+ pom=(k+.5)/mmax
+ od_do pom 0 0 pom -.05 0
+ od_do 1 pom 0 1.05 pom 0
+ next k
+end sub
+
+!-----------------------------------------------------------
+
+sub draw_xy_ticks2 po
+ for k=0 to mmax-1
+ local pom=(k+.5)/mmax
+ if ((k%po)=0) then
+ od_do pom 0 0 pom -.05 0
+ od_do 1 pom 0 1.05 pom 0
+ else
+ od_do pom 0 0 pom -.03 0
+ od_do 1 pom 0 1.03 pom 0
+ end if
+ next k
+end sub
+
+!-----------------------------------------------------------
+
+sub label_x i txt$
+ project_3D2D (i-.5)/mmax -.2 0
+ amove xgr ygr
+ begin rotate ux
+ write txt$
+ end rotate
+end sub
+
+!-----------------------------------------------------------
+
+sub label_y i txt$
+ project_3D2D 1.15 (i-.5)/mmax 0
+ amove xgr ygr
+ begin rotate uy
+ write txt$
+ end rotate
+end sub
+
+!-----------------------------------------------------------
+
+sub draw_bar_graph_3d f$
+ draw_back_frame
+ fopen f$ vstup read
+ for k = 1 to mmax
+ draw_matrix_row k 1
+ next k
+ fclose vstup
+ draw_middle_frame
+ draw_front_frame
+end sub
+
+
diff --git a/src/lib/piesub.gle b/src/lib/piesub.gle
new file mode 100644
index 0000000..a2f5fad
--- /dev/null
+++ b/src/lib/piesub.gle
@@ -0,0 +1,82 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+! Subroutines to draw a pie wedge between two supplied angles
+
+sub pie ang1 ang2 radius colour$
+ !
+ ! draw pie wedge between ang1 and ang2
+ ! radius.... the radius
+ ! colour$... the fill color of the wedge
+ !
+ begin path fill colour$ stroke
+ rmove 0 0 !The rmove command is neccesary to set
+ arc radius ang1 ang2 !the beginning of the path
+ closepath
+ end path
+end sub
+
+sub pie_text ang1 ang2 radius colour$ label$
+ !sub pie - Subroutine to draw a coloured pie wedge
+ ! between two supplied angles
+ ! with a key and a label
+ ! draw pie wedge between ang1 and ang2
+ ! radius.... the radius
+ ! colour$... the fill color of the wedge
+ ! label$ ... te text you want to display
+ !
+ gsave
+ begin path fill colour$ stroke
+ rmove 0 0 !The rmove command is neccesary to set
+ arc radius ang1 ang2 !the beginning of the path
+ closepath
+ end path
+
+ !
+ ! put text in center of pie
+ !
+ set just cc
+ ang = ang1+(ang2-ang1)/2
+ rmove (radius/2)*cos(torad(ang)) (radius/2)*sin(torad(ang))
+ write label$
+ grestore
+
+end sub
+
+
+
diff --git a/src/lib/polarplot.gle b/src/lib/polarplot.gle
new file mode 100644
index 0000000..f71f516
--- /dev/null
+++ b/src/lib/polarplot.gle
@@ -0,0 +1,124 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+! Subroutines to create polar plots (r = f(theta))
+
+sub polar fct$ from to tstep color$ fill$ lwidth
+ default tstep 0.025
+ default color black
+ default fill clear
+ default lwidth 0.02
+ t = from
+ r = eval(fct$)
+ gsave
+ set color color$ lwidth lwidth
+ begin path stroke fill fill$
+ amove xg(r*cos(t)) yg(r*sin(t))
+ for t = from+tstep to to step tstep
+ r = eval(fct$)
+ aline xg(r*cos(t)) yg(r*sin(t))
+ next t
+ closepath
+ end path
+ grestore
+end sub
+
+sub polar_segment fct$ from to tstep color$ lwidth
+ default tstep 0.025
+ default color black
+ default lwidth 0.02
+ t = from
+ r = eval(fct$)
+ gsave
+ set color color$ lwidth lwidth
+ amove xg(r*cos(t)) yg(r*sin(t))
+ for t = from+tstep to to step tstep
+ r = eval(fct$)
+ aline xg(r*cos(t)) yg(r*sin(t))
+ next t
+ grestore
+end sub
+
+sub polar_data ds$ color$ fill$ lwidth type$
+ default color black
+ default fill clear
+ default lwidth 0.02
+ default type line
+ gsave
+ set color color$ lwidth lwidth
+ if type$="line" then
+ for i = 1 to ndata(ds$)
+ amove xg(0) yg(0)
+ local r = datayvalue(ds$,i)
+ local t = torad(dataxvalue(ds$,i))
+ aline xg(r*cos(t)) yg(r*sin(t))
+ next i
+ else
+ begin path stroke fill fill$
+ local r = datayvalue(ds$,1)
+ local t = torad(dataxvalue(ds$,1))
+ amove xg(r*cos(t)) yg(r*sin(t))
+ for i = 2 to ndata(ds$)
+ r = datayvalue(ds$,i)
+ t = torad(dataxvalue(ds$,i))
+ aline xg(r*cos(t)) yg(r*sin(t))
+ next i
+ closepath
+ end path
+ end if
+ grestore
+end sub
+
+sub polar_grid radius rings sectors color$
+ default radius 1.0
+ default rings 4
+ default sectors 8
+ default color gray10
+ gsave
+ set color color$
+ for ring = 1 to rings
+ amove xg(0) yg(0)
+ circle xg(radius/rings*ring)-xg(0)
+ next ring
+ for sector = 1 to sectors
+ local theta = 2*pi/sectors*(sector-1)
+ amove xg(0) yg(0)
+ aline xg(radius*cos(theta)) yg(radius*sin(theta))
+ next sector
+ grestore
+end sub
diff --git a/src/lib/shape.gle b/src/lib/shape.gle
new file mode 100644
index 0000000..e41d034
--- /dev/null
+++ b/src/lib/shape.gle
@@ -0,0 +1,707 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+! Subroutines to draw various shapes
+
+shape_use_tex = 0
+shape_color_2$ = clear
+shadow_color$ = "gray10"
+
+shape_dx = 0.1
+shape_dy = 0.1
+
+sub set_shape_use_tex use
+ shape_use_tex = use
+end sub
+
+sub set_shape_color_2 color$
+ ! Set the secondary filling color for the shapes
+ shape_color_2$ = color$
+end sub
+
+sub set_shadow_color color$
+ ! Set the color of the shadow
+ shadow_color$ = color$
+end sub
+
+sub set_shape_dxdy dx dy
+ ! Set the internal gap of a shape (for shapes containing text)
+ shape_dx = dx
+ shape_dy = dy
+end sub
+
+begin object rectangle width height round
+ ! Draw a rectangle
+ ! width, height: the width and height of the rectangle
+ default width 1
+ default height 1
+ default round 0
+ box width height round round
+end object
+
+begin object rectangle_text width height text$ round
+ ! Draw a rectangle
+ ! width, height: the width and height of the rectangle
+ default width 1
+ default height 1
+ default round 0
+ default text "X"
+ box width height round round
+ set just cc
+ amove width/2 height/2
+ write text$
+end object
+
+begin object rectangle_text_fit text$ round margin_x margin_y
+ ! Draw a rectangle
+ default text "X"
+ default round 0
+ default margin_x 0.1
+ default margin_y 0.1
+ local tw = twidth(text$)+2*margin_x
+ local th = theight(text$)+2*margin_y
+ amove -tw/2 -th/2
+ box tw th round round
+ set just cc
+ amove 0 0
+ write text$
+end object
+
+begin object triangle width height angle
+ ! Draw a rectangle
+ ! w, h: the width and height of the rectangle
+ default width 1
+ default height 1
+ default angle 0
+ begin rotate angle
+ amove width/2 height
+ begin path stroke
+ aline width 0
+ aline 0 0
+ closepath
+ end path
+ end rotate
+end object
+
+begin object hexagon width height
+ ! Draw a named hexagon
+ ! w, h: the width and height of the hexagon
+ default width 1
+ default height 1
+ dx=width/2*cos(torad(30))
+ dy=height/2*sin(torad(30))
+ amove x y+height/4+dy; name "p1"
+ begin path stroke
+ aline x+dx y+height/4; name "p2"
+ aline x+dx y-height/4; name "p3"
+ aline x y-height/4-dy; name "p4"
+ aline x-dx y-height/4; name "p5"
+ aline x-dx y+height/4; name "p6"
+ closepath
+ end path
+end object
+
+begin object rhomb width height
+ ! Draw a rhomb
+ ! width: width of the rhomb
+ ! height: height of the rhomb
+ default width 1
+ default height 1
+ amove 0 +height/2
+ begin path stroke
+ aline -width/2 0
+ aline 0 -height/2
+ aline +width/2 0
+ closepath
+ end path
+end object
+
+begin object plus width height
+ ! Draw a plus "+" at current position
+ ! d: the size of the plus
+ ! width: width of the plus
+ ! height: height of the plus
+ default width 1
+ default height 1
+ amove -width/2 0
+ aline width/2 0
+ amove 0 -height/2
+ aline 0 height/2
+end object
+
+begin object cross width height
+ ! Draw a cross "x" at current position
+ ! width: width of the cross
+ ! height: height of the cross
+ default width 1
+ default height 1
+ amove -width/2 -height/2
+ aline width/2 height/2
+ amove -width/2 height/2
+ aline width/2 -height/2
+end object
+
+begin object disk width height ellipse
+ ! Draw a disk
+ ! width: disk width
+ ! height: disk height
+ ! ellipse: height of top ellipse
+ default width 1
+ default height 1
+ default ellipse 0.15
+ set join round
+ amove 0 height/2-ellipse*height
+ begin path stroke
+ elliptical_narc width/2 ellipse*height 0 180
+ aline -width/2 -height/2+ellipse*height
+ asetpos 0 -height/2+ellipse*height
+ elliptical_arc width/2 ellipse*height 180 0
+ closepath
+ end path
+ amove 0 height/2-ellipse*height
+ begin path stroke fill shape_color_2$
+ elliptical_arc width/2 ellipse*height 0 180
+ asetpos 0 height/2-ellipse*height
+ elliptical_arc width/2 ellipse*height 180 0
+ closepath
+ end path
+ abound -width/2 height/2; abound +width/2 height/2
+ abound -width/2 -height/2; abound +width/2 -height/2
+end object
+
+begin object disk_text width height ellipse text$ text_distance
+ ! Draw a disk
+ ! width: disk width
+ ! height: disk height
+ ! ellipse: height of top ellipse
+ ! text$: text to write
+ ! text_distance: offset for text (normally 0)
+ default width 1
+ default height 1
+ default ellipse 0.15
+ default text "X"
+ default text_distance 0
+ draw disk width height ellipse
+ gsave
+ set just cc
+ rmove 0 text_distance-ellipse*height
+ write text$
+ grestore
+end object
+
+sub rootnode xp yp width height name$
+ amove xp-width/2 yp-height
+ box width height name name$
+end sub
+
+sub drawnode width height name$ type
+ if type = 0 then
+ amove xpos()-width/2 ypos()-height
+ box width height name name$
+ else
+ amove xpos()-width/2 ypos()-height
+ box width height name name$ nobox fill clear
+ rmove width/2 height/2
+ if shape_color_2$ = "clear" then
+ ellipse width/2 height/2
+ else
+ ellipse width/2 height/2 fill shape_color_2$
+ end if
+ end if
+end sub
+
+sub binchilds par$ c1$ c2$ width height ydel xdel l1 l2
+ amove pointx(par$+".bc")-xdel pointy(par$+".bc")-ydel
+ drawnode width height c1$ l1
+ amove pointx(par$+".bc")+xdel pointy(par$+".bc")-ydel
+ drawnode width height c2$ l2
+ join par$+".bc" - c1$+".tc"
+ join par$+".bc" - c2$+".tc"
+end sub
+
+begin object l_tree width height width_factor height_factor
+ ! Draw a small tree (with left subtree)
+ ! width: width of the tree
+ ! height: height of the tree
+ ! width_factor: proportion of width = width of node
+ ! height_factor: proportion of height = height of node
+ default width 1
+ default height 1
+ default width_factor 0.3
+ default height_factor 0.2
+ local nodewd = width*width_factor
+ local nodehi = height*height_factor
+ local yoffs = (height-3*nodehi)/2
+ local xoffs = (width-nodewd)/3
+ rootnode -width/2+nodewd/2+2*xoffs height/2 nodewd nodehi "n1"
+ binchilds "n1" "n2" "l3" nodewd nodehi yoffs xoffs 0 1
+ binchilds "n2" "l1" "l2" nodewd nodehi yoffs xoffs 1 1
+end object
+
+begin object r_tree width height width_factor height_factor
+ ! Draw a small tree (with right subtree)
+ ! width: width of the tree
+ ! height: height of the tree
+ ! width_factor: proportion of width = width of node
+ ! height_factor: proportion of height = height of node
+ default width 1
+ default height 1
+ default width_factor 0.3
+ default height_factor 0.2
+ local nodewd = width*width_factor
+ local nodehi = height*height_factor
+ local yoffs = (height-3*nodehi)/2
+ local xoffs = (width-nodewd)/3
+ rootnode xpos()-width/2+nodewd/2+xoffs ypos()+height/2 nodewd nodehi "n1"
+ binchilds "n1" "l1" "n2" nodewd nodehi yoffs xoffs 1 0
+ binchilds "n2" "l2" "l3" nodewd nodehi yoffs xoffs 1 1
+end object
+
+begin object human_stick width height
+ default width 0.5
+ default height 1
+ local sx = width/0.4
+ local sy = height/0.7
+ amove 0 0.6*sy; circle 0.1*sy
+ amove 0 0.5*sy; aline 0.0 0.2*sy
+ amove 0 0.2*sy; aline -0.2*sx 0
+ amove 0 0.2*sy; aline +0.2*sx 0
+ amove 0 0.5*sy; aline -0.2*sx 0.3*sy
+ amove 0 0.5*sy; aline +0.2*sx 0.3*sy
+end object
+
+begin object shadow_box obj$ margin shadow
+ begin box fill white add margin nobox name obj$+"-box"
+ draw obj$+".tl"
+ end box
+ local xp = ptx(obj$+"-box.tl")
+ local yp = pty(obj$+"-box.tl")
+ local width = width(obj$+"-box")
+ local height = height(obj$+"-box")
+ begin path fill shadow_color$
+ amove xp+shadow yp-height
+ aline xp+width yp-height
+ aline xp+width yp-shadow
+ aline xp+width+shadow yp-shadow
+ aline xp+width+shadow yp-height-shadow
+ aline xp+shadow yp-height-shadow
+ closepath
+ end path
+ amove xp yp-height
+ box width height
+end object
+
+begin object big_arrow_both_angle width height angle
+ ! Draw an up/down arrow
+ ! width: width of the arrow
+ ! height: height of the arrow
+ ! angle: rotation angle
+ default width 1
+ default height 1
+ default angle 0
+ begin rotate angle
+ amove 0 -height/2
+ begin path stroke
+ aline width/2 -height/6
+ aline width/4 -height/6
+ aline width/4 +height/6
+ aline width/2 +height/6
+ aline 0 +height/2
+ aline -width/2 +height/6
+ aline -width/4 +height/6
+ aline -width/4 -height/6
+ aline -width/2 -height/6
+ closepath
+ end path
+ end rotate
+end object
+
+begin object big_arrow_angle width height angle
+ ! Draw a left facing arrow
+ ! width: width of the arrow
+ ! height: height of the arrow
+ ! angle: rotation angle
+ default width 1
+ default height 1
+ default angle 0
+ begin rotate angle
+ amove -width/2 0
+ begin path stroke
+ aline 0 -height/2
+ aline 0 -height/4
+ aline width/2 -height/4
+ aline width/2 +height/4
+ aline 0 +height/4
+ aline 0 +height/2
+ closepath
+ end path
+ end rotate
+end object
+
+begin object big_arrow_ud width height
+ ! Draw an up/down arrow
+ ! width: width of the arrow
+ ! height: height of the arrow
+ default width 1
+ default height 1
+ big_arrow_both_angle width height 0
+end object
+
+begin object big_arrow_lr width height
+ ! Draw an left/right arrow
+ ! width: width of the arrow
+ ! height: height of the arrow
+ default width 1
+ default height 1
+ big_arrow_both_angle height width 90
+end object
+
+begin object big_arrow_left width height
+ ! Draw a left facing arrow
+ ! width: width of the arrow
+ ! height: height of the arrow
+ default width 1
+ default height 1
+ big_arrow_angle width height 0
+end object
+
+begin object big_arrow_right width height
+ ! Draw a right facing arrow
+ ! width: width of the arrow
+ ! height: height of the arrow
+ default width 1
+ default height 1
+ big_arrow_angle width height 180
+end object
+
+begin object big_arrow_up width height
+ ! Draw a up facing arrow
+ ! width: width of the arrow
+ ! height: height of the arrow
+ default width 1
+ default height 1
+ big_arrow_angle height width -90
+end object
+
+begin object big_arrow_down width height
+ ! Draw a down facing arrow
+ ! width: width of the arrow
+ ! height: height of the arrow
+ default width 1
+ default height 1
+ big_arrow_angle height width 90
+end object
+
+sub pmove d a
+ amove xpos()+d*cos(torad(a)) ypos()+d*sin(torad(a))
+end sub
+
+sub jointo n$
+ aline ptx(n$) pty(n$)
+end sub
+
+sub set_angle_just angle
+ if angle = 0 then
+ set just lc
+ else if angle = 90 then
+ set just bc
+ else if angle = 180 then
+ set just rc
+ else if angle = -90 then
+ set just tc
+ else if (angle > 0) and (angle < 90) then
+ set just bl
+ else if (angle > 90) and (angle < 180) then
+ set just br
+ else if (angle > -90) and (angle < 0) then
+ set just tl
+ else
+ set just tr
+ end if
+end sub
+
+sub virtual_box x1 y1 x2 y2 name$
+ begin name name$
+ abound x1 y1
+ abound x2 y2
+ end name
+end sub
+
+sub line_label x1 y1 x2 y2 str$ dist offset
+ ! Draw a label at the center of an imaginary line from (x1,y1) to (x2,y2)
+ ! (x1,y1): starting point of the line
+ ! (x2,y2): ending point of the line
+ ! str$: label to draw
+ ! dist: distance between label and line
+ default offset 0
+ if dist > 0 then set just bc
+ else set just tc
+ local xm = (x1+x2)/2
+ local ym = (y1+y2)/2
+ local a = y2^2-2*y1*y2+y1^2+x2^2-2*x1*x2+x1^2
+ local b = 2*(y2*ym-y1*ym-y2^2+y1*y2+x2*xm-x1*xm-x2^2+x1*x2)
+ local c = ym^2-2*y2*ym+y2^2+xm^2-2*x2*xm+x2^2-offset^2
+ local t = (-b-sgn(offset)*sqrt(abs(b^2 - 4*a*c)))/(2*a)
+ amove t*x1+(1-t)*x2 t*y1+(1-t)*y2
+ begin rotate xy2angle(x2-x1,y2-y1)
+ rmove 0 dist
+ write str$
+ end rotate
+end sub
+
+sub join_label a$ dir$ b$ label$ deltax deltay ldist loffset offsetx offsety
+ ! Similar to the join command, but also labels the arrow
+ default label ""
+ default deltax 0
+ default deltay 0
+ default ldist 0.1
+ default loffset 0
+ default offsetx 0
+ default offsety 0
+ local x1 = ptx(a$) + offsetx
+ local x2 = ptx(b$) + offsetx
+ local y1 = pty(a$) + offsety
+ local y2 = pty(b$) + offsety
+ amove x1+deltax y1+deltay
+ if dir$ = "->" then aline x2-deltax y2-deltay arrow end
+ else if dir$ = "<-" then aline x2-deltax y2-deltay arrow start
+ else if dir$ = "<->" then aline x2-deltax y2-deltay arrow both
+ else aline x2-deltax y2-deltay
+ if label$ <> "" then
+ line_label x1+deltax y1+deltay x2-deltax y2-deltay label$ ldist loffset
+ end if
+end sub
+
+sub join_label_rel a$ dir$ relx rely label$ deltax deltay ldist loffset offsetx offsety name$ reverse
+ default label ""
+ default deltax 0
+ default deltay 0
+ default ldist 0.1
+ default loffset 0
+ default offsetx 0
+ default offsety 0
+ default name "temp"
+ default reverse 0
+ amove ptx(a$)+relx pty(a$)+rely
+ save name$
+ if reverse = 0 then
+ join_label a$ dir$ name$ label$ deltax deltay ldist loffset offsetx offsety
+ else
+ join_label name$ dir$ a$ label$ deltax deltay ldist loffset offsetx offsety
+ end if
+end sub
+
+sub measure_line a$ dir$ b$ label$ ldist loffset offsetx offsety linelen linepos side showa showb
+ default label ""
+ default ldist 0.1
+ default loffset 0
+ default offsetx 0
+ default offsety 0
+ default linelen 1
+ default linepos 0.75
+ default side 1
+ default showa 1
+ default showb 1
+ local x1 = ptx(a$) + offsetx
+ local x2 = ptx(b$) + offsetx
+ local y1 = pty(a$) + offsety
+ local y2 = pty(b$) + offsety
+ local a = torad(90+side*180+xy2angle(x2-x1,y2-y1))
+ set lstyle 2
+ if showa = 1 then
+ amove x1 y1
+ aline x1+linelen*cos(a) y1+linelen*sin(a)
+ end if
+ if showb = 1 then
+ amove x2 y2
+ aline x2+linelen*cos(a) y2+linelen*sin(a)
+ end if
+ set lstyle 1
+ amove x1+linepos*cos(a) y1+linepos*sin(a)
+ save "p1"
+ amove x2+linepos*cos(a) y2+linepos*sin(a)
+ save "p2"
+ join_label "p1" dir$ "p2" label$ 0 0 ldist loffset offsetx offsety
+end sub
+
+sub measure_line_rel a$ dir$ relx rely label$ ldist loffset offsetx offsety linelen linepos side showa showb reverse
+ default label ""
+ default ldist 0.1
+ default loffset 0
+ default offsetx 0
+ default offsety 0
+ default linelen 1
+ default linepos 0.75
+ default side 1
+ default showa 1
+ default showb 1
+ default reverse 0
+ amove ptx(a$)+relx pty(a$)+rely
+ save "p"
+ if reverse = 0 then
+ measure_line a$ dir$ "p" label$ ldist loffset offsetx offsety linelen linepos side showa showb
+ else
+ measure_line "p" dir$ a$ label$ ldist loffset offsetx offsety linelen linepos side showa showb
+ end if
+end sub
+
+sub arrow_label xp yp label$ dist angle
+ default dist 0.75
+ default angle 90
+ amove xp yp; pmove dist angle
+ set just bc; write label$
+ amove xp yp; pmove dist-0.1 angle
+ aline xp yp arrow end
+end sub
+
+sub curly_bracket x1 y1 x2 y2 r
+ ! Draw a curly bracket from (x1,y1) to (x2,y2) with radius r
+ ! To draw the curly bracket on the "other side" of the line, swap (x1,y1) and (x2,y2)
+ local xm = (x1+x2)/2
+ local ym = (y1+y2)/2
+ width = sqrt((xm-x1)^2+(ym-y1)^2)
+ amove xm ym
+ set fill clear
+ begin rotate xy2angle(x2-x1,y2-y1)
+ rmove -width+r 0
+ begin path stroke
+ arc r 90 180
+ rmove 0 r
+ rline width-2*r 0
+ rsetpos 0 r
+ arc r 270 0
+ rsetpos 2*r 0
+ arc r 180 270
+ rmove 0 -r
+ rline width-2*r 0
+ rsetpos 0 -r
+ narc r 90 0
+ end path
+ end rotate
+ abound x1 y1
+ abound x2 y2
+end sub
+
+begin object curly_bracket_left width height
+ default width 0.2
+ default height 1
+ curly_bracket 0 0 0 height width/2
+end object
+
+begin object curly_bracket_right width height
+ default width 0.2
+ default height 1
+ curly_bracket 0 height 0 0 width/2
+end object
+
+begin object curly_bracket_up width height
+ default width 1
+ default height 0.2
+ curly_bracket 0 0 width 0 height/2
+end object
+
+begin object curly_bracket_down width height
+ default width 1
+ default height 0.2
+ curly_bracket width 0 0 0 height/2
+end object
+
+sub labeled_circle label$ radius lradius langle name$ lcolor$
+ default lradius 0.1
+ default langle 90
+ default name "n"
+ default lcolor black
+ gsave
+ begin name name$
+ circle radius
+ end name
+ set color lcolor$
+ pmove radius+lradius langle
+ set_angle_just langle
+ tex label$
+ grestore
+end sub
+
+begin object house width height wallcolor$ doorcolor$ windowcolor$ roofcolor$
+ ! draw a house with a named door and window
+ default width 1
+ default height 1
+ default wallcolor "cornsilk"
+ default doorcolor "burlywood"
+ default windowcolor "skyblue"
+ default roofcolor "lightsalmon"
+ set join round
+ local hs = height/2.5
+ local ws = width/2.5
+ ! draw the roof
+ begin path stroke fill roofcolor$
+ amove 0 1.625*hs
+ aline 1.25*ws 2.5*hs
+ aline 2.5*ws 1.625*hs
+ closepath
+ end path
+ ! draw the brick wall
+ amove 0 0
+ box 2.5*ws 1.625*hs fill wallcolor$
+ ! draw the door
+ amove 1.5*ws 0
+ box 0.75*ws 1.375*hs fill doorcolor$ name door
+ ! draw the window
+ amove 0.25*ws 0.625*hs
+ box ws 0.75*hs fill windowcolor$ name window
+end object
+
+begin object system_boundary width height
+ default width 3
+ default height 2
+ local std_wd = 6.25284
+ local std_hi = 4.96995
+ local sx = width*0.1/std_wd
+ local sy = height*0.1/std_hi
+ begin path stroke
+ amove 17.677669*sx 20.887802*sy
+ bezier 20.809142*sx 17.756330*sy 24.023730*sx 20.471938*sy 27.678180*sx 20.180695*sy
+ bezier 37.516189*sx 19.396651*sy 36.877716*sx 16.806370*sy 46.972093*sx 16.342115*sy
+ bezier 61.516299*sx 15.666444*sy 69.616165*sx 24.396245*sy 77.781746*sx 34.625876*sy
+ bezier 98.262589*sx 60.283750*sy 80.357611*sx 65.580420*sy 63.437580*sx 66.041620*sy
+ bezier 50.360923*sx 66.400199*sy 29.565525*sx 65.378386*sy 24.243661*sx 59.879690*sy
+ bezier 18.014374*sx 53.443419*sy 16.729828*sx 43.311986*sy 15.253303*sx 33.514708*sy
+ bezier 14.161275*sx 26.268706*sy 14.443603*sx 24.121868*sy 17.677669*sx 20.887802*sy
+ closepath
+ end path
+end object
diff --git a/src/lib/simpletree.gle b/src/lib/simpletree.gle
new file mode 100644
index 0000000..7ca2125
--- /dev/null
+++ b/src/lib/simpletree.gle
@@ -0,0 +1,185 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+! Subroutines for drawing trees
+
+! For an example, see e.g., 2dplots/rt-y-is-x.gle
+
+include "ellipse.gle"
+
+sizemid$ = "\footnotesize"; sizemid = 0.25
+sizenode$ = "\small"; sizenode = 0.3
+vlabeladd = 0.05; nodexfill = 0.05; nodeyfill = 0.05; nodedx = 0.9; nodedy = 0.5
+tree_node_min_sx = 0; tree_node_min_sx = 0
+
+sub tree_set_node_fill dx dy
+ nodexfill = dx
+ nodeyfill = dy
+end sub
+
+sub set_tree_node_min_size sx sy
+! methods should start with set_
+ tree_node_min_sx = sx
+ tree_node_min_sy = sy
+end sub
+
+sub tree_set_node_dxdy dx dy
+ nodedx = dx
+ nodedy = dy
+end sub
+
+sub tree_set_hei nodehei leafhei labelhei
+ sizemid = labelhei
+ sizenode = nodehei
+ tree_leaf_hei = leafhei
+end sub
+
+sub texortext str$ name$ delta hi texsize$
+ set hei hi
+ if name$ = "" then
+ if shape_use_tex = 0 then
+ write str$
+ else
+ tex str$
+ end if
+ else
+ if shape_use_tex = 0 then
+ begin box name name$ add delta nobox
+ write str$
+ end box
+ else
+ tex str$ name name$ add delta
+ end if
+ end if
+end sub
+
+sub drawcliparc lx1 ly1 dx lr n$ cn$
+ begin clip
+ begin path clip
+ amove lx1 ly1+0.1
+ box nodedx*dx*2+0.2 nodedy+0.2 justify tc
+ amove pointx(ch.tc) pointy(ch.tc)
+ box width(ch) height(ch) justify tc reverse
+ end path
+ amove lx1 ly1
+ aline lx1+lr*nodedx*dx ly1-nodedy
+ save n$+cn$
+ end clip
+end sub
+
+sub drawbinnode xp yp str$ l$ r$ dx n$
+ begin object lab
+ set just tl
+ texortext str$ "" 0 sizenode sizenode$
+ end object
+ local wd = width(lab)
+ local xleft = xp-wd/2-nodexfill
+ local xright = xp+wd/2+nodexfill
+ local ybot = yp-height(lab)-2*nodeyfill
+ local addx = tree_node_min_sx-(xright-xleft)
+ if addx > 0 then
+ xleft = xleft - addx/2
+ xright = xright + addx/2
+ end if
+ amove xleft ybot
+ box xright-xleft yp-ybot name n$
+ amove xp yp-nodeyfill
+ draw lab.tc
+ lx1 = pointx(n$+".bc")
+ ly1 = pointy(n$+".bc")
+ set just center
+ amove lx1-nodedx/2*dx ly1-nodedy/2-0.05
+ texortext l$ "ch" vlabeladd sizemid sizemid$
+ @drawcliparc lx1 ly1 dx -1 n$ "1"
+ amove lx1+nodedx/2*dx ly1-nodedy/2-0.05
+ texortext r$ "ch" vlabeladd sizemid sizemid$
+ @drawcliparc lx1 ly1 dx 1 n$ "2"
+end sub
+
+sub binrootnode xp yp str$ l$ r$ dx
+ @drawbinnode xp yp str$ l$ r$ dx "r"
+end sub
+
+sub binnode par$ str$ l$ r$ dx
+ @drawbinnode pointx(par$) pointy(par$) str$ l$ r$ dx par$
+end sub
+
+sub drawtrinode xp yp str$ l$ m$ r$ dx n$
+ set just tc
+ amove xp yp-nodeyfill
+ texortext str$ "lab" 0 sizenode sizenode$
+ xleft = pointx(lab.lc)-nodexfill
+ xright = pointx(lab.rc)+nodexfill
+ ybot = pointy(lab.bc)-nodeyfill
+ amove xleft ybot
+ box xright-xleft yp-ybot name n$
+ lx1 = pointx(n$+".bc")
+ ly1 = pointy(n$+".bc")
+ set just center
+ amove lx1-nodedx/2*dx ly1-nodedy/2-0.05
+ texortext l$ "ch" vlabeladd sizemid sizemid$
+ @drawcliparc lx1 ly1 dx -1 n$ "1"
+ amove lx1 ly1-nodedy/2-0.05
+ texortext m$ "ch" vlabeladd sizemid sizemid$
+ @drawcliparc lx1 ly1 dx 0 n$ "2"
+ amove lx1+nodedx/2*dx ly1-nodedy/2-0.05
+ texortext r$ "ch" vlabeladd sizemid sizemid$
+ @drawcliparc lx1 ly1 dx 1 n$ "3"
+end sub
+
+sub trinode par$ str$ l$ m$ r$ dx
+ @drawtrinode pointx(par$) pointy(par$) str$ l$ m$ r$ dx par$
+end sub
+
+sub leaf par$ str$
+ set just tc
+ amove pointx(par$) pointy(par$)-0.1
+ texortext str$ "" 0 sizenode sizenode$
+end sub
+
+sub leaf_ellipse par$ str$
+ set hei tree_leaf_hei
+ def_ellipse_text str$ "n"
+ amove pointx(par$) pointy(par$)
+ draw n.tc
+end sub
+
+sub leaf_ellipse_empty par$ wd
+ amove pointx(par$) pointy(par$)-ellipse_c*wd/2
+ ellipse wd/2 ellipse_c*wd/2
+end sub
diff --git a/src/lib/stm.gle b/src/lib/stm.gle
new file mode 100644
index 0000000..e19794d
--- /dev/null
+++ b/src/lib/stm.gle
@@ -0,0 +1,303 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+! Common subroutines for laying-out STM images
+! By: Vincent P. LaBella
+
+sub scale_bar llength texth a$ lx ly ap$ line_width text_offset fillpattern$ boxit x_buffer y_buffer
+!
+! draws a scale bar with text over it
+!
+! llenght ........ line length
+! a$.............. text
+! texth........... texht height
+! lx.............. x coordinate of box
+! ly.............. y coordinate of box
+! ap$............. anchor point (tl,tc,tr,lc,cc,rc,bl,bc,br)
+! line_width ..... width of line
+! text_offset .... offset of text from line
+! fillpattern$.... background
+! boxit........... =1 draws a black box=0 no box is drawn
+! x_buffer........ distance on both ends from line to box
+! y_buffer........ distance on top and bottom
+ !
+ ! -- calculate box height and width
+ !
+ boxw=llength+x_buffer*2
+ boxh=texth-0.1+line_width+text_offset+2*y_buffer
+
+ gsave
+ set hei texth
+ set color BLACK
+ set just bc
+ !
+ ! translate starting coordinates to lower left hand side
+ !
+ if ap$="tr" then
+ lx=lx-boxw
+ ly=ly-boxh
+ end if
+ if ap$="tc" then
+ lx=lx-boxw/2
+ ly=ly-boxh
+ end if
+ if ap$="tl" then
+ lx=lx
+ ly=ly-boxh
+ end if
+ if ap$="rc" then
+ lx=lx-boxw
+ ly=ly-boxh/2
+ end if
+ if ap$="cc" then
+ lx=lx-boxw/2
+ ly=ly-boxh/2
+ end if
+ if ap$="lc" then
+ lx=lx
+ ly=ly-boxh/2
+ end if
+ if ap$="br" then
+ lx=lx-boxw
+ ly=ly
+ end if
+ if ap$="bc" then
+ lx=lx-boxw/2
+ ly=ly
+ end if
+ if ap$="bl" then
+ lx=lx
+ ly=ly
+ end if
+ lstartx=lx+x_buffer
+ lstarty=ly+y_buffer
+ amove lx ly
+ if boxit=1 then
+ box boxw boxh fill fillpattern$
+ else
+ box boxw boxh fill fillpattern$ nobox
+ end if
+ set lwidth line_width
+ amove lstartx lstarty
+ rline llength 0.0
+ amove lstartx+llength/2.0 lstarty+text_offset+line_width/2
+ write a$
+ grestore
+end sub
+
+
+sub textbox x1 y1 ap$ text_size string$ txbuffer tybuffer boxit bgcolor$ fgcolor$ lncolor$ lnwidth
+ !
+ ! draws a box around a piece of text and fills it with a color
+ !
+ ! (x1,y1) ........ x and y coordinates of box
+ ! ap$............. anchor point (tl,tc,tr,lc,cc,rc,bl,bc,br)
+ ! string$......... the string to put in the box
+ ! text_size....... the size of the text
+ ! t(x,y)buffer.... extra padding around text
+ ! boxit........... 1 draws box 0 no box is drawn
+ ! fg color........ text color
+ ! bgcolor ........ background color
+ ! lnwidth......... line width of surrounding box
+ ! lncolor......... line color of surrounding box
+ !
+ !
+ gsave
+ !
+ ! translate starting coordinates to lower left hand side
+ !
+ set hei text_size
+ textbox_boxw=2*txbuffer+TWIDTH(string$)
+ textbox_boxh=2*tybuffer+THEIGHT(string$)
+ if ap$="tr" then
+ x1=x1-textbox_boxw
+ y1=y1-textbox_boxh
+ end if
+ if ap$="tc" then
+ x1=x1-textbox_boxw/2
+ y1=y1-textbox_boxh
+ end if
+ if ap$="tl" then
+ x1=x1
+ y1=y1-textbox_boxh
+ end if
+ if ap$="rc" then
+ x1=x1-textbox_boxw
+ y1=y1-textbox_boxh/2
+ end if
+ if ap$="cc" then
+ x1=x1-textbox_boxw/2
+ y1=y1-textbox_boxh/2
+ end if
+ if ap$="lc" then
+ x1=x1
+ y1=y1-textbox_boxh/2
+ end if
+ if ap$="br" then
+ x1=x1-textbox_boxw
+ y1=y1
+ end if
+ if ap$="bc" then
+ x1=x1-textbox_boxw/2
+ y1=y1
+ end if
+ if ap$="bl" then
+ x1=x1
+ y1=y1
+ end if
+ amove x1 y1
+ set color lncolor$
+ set lwidth lnwidth
+ if boxit=1 then
+ box textbox_boxw textbox_boxh fill bgcolor$
+ else
+ box textbox_boxw textbox_boxh fill bgcolor$ nobox
+ end if
+ set color fgcolor$
+ set just cc
+
+ amove x1+textbox_boxw/2 y1+textbox_boxh/2
+ write string$
+ grestore
+end sub
+
+sub axis_dir x1 y1 dx dy x_text$ y_text$ text_height angle text_offset text_ap$
+!
+! draws and axis x and y and lables it called by axis_box
+!
+ gsave
+ amove x1 y1
+ set hei text_height
+
+ begin rotate angle
+ rline dx 0.0 arrow end
+ if angle>90 then
+ set just tl
+ begin rotate 180
+ rmove 0.0 -text_offset
+ write x_text$
+ end rotate
+ else
+ set just br
+ rmove 0.0 text_offset
+ write x_text$
+ end if
+
+ amove x1 y1
+ rline 0.0 dy arrow end
+ !
+ ! for y text roate if necessary
+ !
+ if angle<0 then
+ set just bc
+ begin rotate 90
+ rmove 0.0 -text_offset
+ write y_text$
+ end rotate
+ else
+ set just bl
+ rmove text_offset 0.0
+ begin rotate -90
+ write y_text$
+ end rotate
+ end if
+ end rotate
+ grestore
+end sub
+
+sub axis_box lx ly textx$ texty$ angle xoffset yoffset axis_length ap$ boxit fgcolor$ bgcolor$ txtcolor$ text_height text_offset
+!
+! draws a box and puts two axis 90 deg apart and lables them as you want
+!
+! lx,ly........location of box
+! textx$.......text to put on x axis
+! texty$.......text to put on y axis
+! angle........axis is rotated
+! xoffset......location of origin relative to corner of box
+! yoffset......""""""" """ """ """
+! axis_length..lenght of axis
+! ap$..........anchor point (does not work yet puts it at lower left
+! boxit........1 draws box 0 no box
+! text_offset....offset of text from axis
+!
+ gsave
+ amove lx ly
+ begin rotate angle
+ if boxit=1 then
+ set color fgcolor$
+ box axis_length+2*xoffset axis_length+2*yoffset fill bgcolor$
+ else
+ set color bgcolor$
+ box axis_length+2*xoffset axis_length+2*yoffset fill bgcolor$
+ end if
+ set color fgcolor$
+ end rotate
+ @axis_dir lx+xoffset ly+yoffset axis_length axis_length textx$ texty$ text_height angle text_offset "br"
+ grestore
+end sub
+
+sub axis_boxr lx ly textx$ texty$ angle xoffset yoffset axis_length ap$ boxit fgcolor$ bgcolor$ txtcolor$ text_height text_offset
+!
+! draws a box and puts two axis 90 deg apart and lables them as you want
+!
+! lx,ly........location of box
+! textx$.......text to put on x axis
+! texty$.......text to put on y axis
+! angle........axis is rotated
+! xoffset......location of origin relative to corner of box
+! yoffset......""""""" """ """ """
+! axis_length..lenght of axis
+! ap$..........anchor point (does not work yet puts it at lower left
+! boxit........1 draws box 0 no box
+! text_offset....offset of text from axis
+!
+ gsave
+ amove lx ly
+ begin rotate angle
+ if boxit=1 then
+ set color fgcolor$
+ box axis_length+2*xoffset axis_length+2*yoffset fill bgcolor$
+ else
+ set color bgcolor$
+ box axis_length+2*xoffset axis_length+2*yoffset fill bgcolor$
+ end if
+ set color fgcolor$
+ @axis_dir lx+xoffset ly+yoffset axis_length axis_length textx$ texty$ text_height 0 text_offset "br"
+ end rotate
+ grestore
+end sub
diff --git a/src/lib/tree.gle b/src/lib/tree.gle
new file mode 100644
index 0000000..aaaed47
--- /dev/null
+++ b/src/lib/tree.gle
@@ -0,0 +1,263 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+! Subroutines for drawing trees
+
+include "shape.gle"
+include "ellipse.gle"
+
+! these constants are final (don't change these)
+! the defaults can be modified with the functions below
+tree_edge_label_hei = 0.25
+tree_node_hei = 0.3; tree_leaf_hei = 0.25
+tree_node_dx = 0.6; tree_node_dy = 0.9
+tree_node_x_fill = 0.2; tree_node_y_fill = 0.12
+tree_node_min_sx = 0; tree_node_min_sx = 0
+tree_edge_label_add = 0.05; tree_edge_label_dy = 0.1
+tree_edge_arrow = 0; tree_node_ellipse = 0
+
+sub set_tree_node_dxdy dx dy
+ tree_node_dx = dx
+ tree_node_dy = dy
+end sub
+
+sub set_tree_node_fill dx dy
+ tree_node_x_fill = dx
+ tree_node_y_fill = dy
+end sub
+
+sub set_tree_node_min_size sx sy
+ tree_node_min_sx = sx
+ tree_node_min_sy = sy
+end sub
+
+sub set_tree_hei nodehei leafhei labelhei
+ tree_edge_label_hei = labelhei
+ tree_node_hei = nodehei
+ tree_leaf_hei = leafhei
+end sub
+
+sub set_tree_edge_label_add_dy add dy
+ tree_edge_label_add = add
+ tree_edge_label_dy = dy
+end sub
+
+sub set_tree_edge_arrow arr
+ tree_edge_arrow = arr
+end sub
+
+sub set_tree_node_ellipse ell
+ tree_node_ellipse = ell
+end sub
+
+sub set_leaf_ellipse_size_str str$
+ set hei tree_leaf_hei
+ set_ellipse_size_str str$
+end sub
+
+sub texortext str$ name$ delta hi
+ set hei hi
+ if name$ = "" then
+ if shape_use_tex = 0 then
+ write str$
+ else
+ tex str$
+ end if
+ else
+ if shape_use_tex = 0 then
+ begin box name name$ add delta nobox
+ write str$
+ end box
+ else
+ tex str$ name name$ add delta
+ end if
+ end if
+end sub
+
+sub drawcliparc x0l x1l y0l x0b x1b label$
+ if label$ <> "" then
+ begin clip
+ begin path clip
+ amove x0b y0l-tree_node_dy
+ box x1b-x0b tree_node_dy fill clear
+ amove pointx(ch.bl) pointy(ch.bl)
+ box width(ch) height(ch) fill clear reverse
+ end path
+ amove x0l y0l
+ if tree_edge_arrow = 1 then aline x1l y0l-tree_node_dy arrow end
+ aline x1l y0l-tree_node_dy
+ end clip
+ else
+ amove x0l y0l
+ if tree_edge_arrow = 1 then aline x1l y0l-tree_node_dy arrow end
+ aline x1l y0l-tree_node_dy
+ end if
+end sub
+
+sub draw_edge_label x1 y1 x2 y2 label$
+ if label$ <> "" then
+ amove (x1+x2)/2-tree_edge_label_dy*(x2-x1)/(y2-y1) (y1+y2)/2-tree_edge_label_dy
+ texortext label$ "ch" tree_edge_label_add tree_edge_label_hei
+ end if
+end sub
+
+sub def_binary_node label$ llab$ rlab$ ltree$ rtree$ name$
+ default llab ""
+ default rlab ""
+ local e_c = ellipse_c
+ begin object name$
+ set just tc hei tree_node_hei
+ local nodehi = theight(label$)+2*tree_node_y_fill
+ if nodehi < tree_node_min_sy then
+ nodehi = tree_node_min_sy
+ end if
+ amove 0 -tree_node_y_fill
+ local xleft = -twidth(label$)/2-tree_node_x_fill
+ local xright = twidth(label$)/2+tree_node_x_fill
+ local addx = tree_node_min_sx-(xright-xleft)
+ if addx > 0 then
+ xleft = xleft - addx/2
+ xright = xright + addx/2
+ end if
+ if tree_node_ellipse = 0 then
+ amove xleft 0
+ box xright-xleft nodehi
+ set just cc
+ amove 0 nodehi/2
+ texortext label$ "lab" 0 tree_node_hei
+ else
+ set_ellipse_c e_c
+ ellipse_text 0 nodehi/2 label$ "lab"
+ end if
+ local wd1 = width(ltree$)
+ local wd2 = width(rtree$)
+ local totwd = wd1/2+wd2/2+tree_node_dx
+ set just center
+ if isname(ltree$+".lab") then
+ amove -totwd/2 -tree_node_dy
+ draw ltree$+".tc" name "l"
+ if tree_node_ellipse = 0 then
+ local to_xl = ptx("l.lab.tc")
+ draw_edge_label to_xl -tree_node_dy 0 0 llab$
+ drawcliparc 0 to_xl 0 to_xl 0 llab$
+ else
+ if tree_edge_arrow = 1 then join lab.ci -> l.lab.ci
+ else join lab.ci - l.lab.ci
+ end if
+ else
+ draw_edge_label -totwd/2 -tree_node_dy 0 0 llab$
+ drawcliparc 0 -totwd/2 0 -totwd/2 0 llab$
+ amove -totwd/2 -tree_node_dy
+ draw ltree$+".tc" name "l"
+ end if
+ if isname(rtree$+".lab") then
+ amove +totwd/2 -tree_node_dy
+ draw rtree$+".tc" name "r"
+ if tree_node_ellipse = 0 then
+ local to_xr = ptx("r.lab.tc")
+ draw_edge_label to_xr -tree_node_dy 0 0 rlab$
+ drawcliparc 0 to_xr 0 0 to_xr rlab$
+ else
+ if tree_edge_arrow = 1 then join lab.ci -> r.lab.ci
+ else join lab.ci - r.lab.ci
+ end if
+ else
+ draw_edge_label totwd/2 -tree_node_dy 0 0 rlab$
+ drawcliparc 0 totwd/2 0 0 totwd/2 rlab$
+ amove +totwd/2 -tree_node_dy
+ draw rtree$+".tc" name "r"
+ end if
+ end object
+end sub
+
+sub def_tertiary_node label$ llab$ mlab$ rlab$ ltree$ mtree$ rtree$ name$
+ default llab ""
+ default mlab ""
+ default rlab ""
+ local e_c = ellipse_c
+ begin object name$
+ set just tc hei tree_node_hei
+ local nodehi = theight(label$)+2*tree_node_y_fill
+ if nodehi < tree_node_min_sy then
+ nodehi = tree_node_min_sy
+ end if
+ amove 0 -tree_node_y_fill
+ local xleft = -twidth(label$)/2-tree_node_x_fill
+ local xright = twidth(label$)/2+tree_node_x_fill
+ local addx = tree_node_min_sx-(xright-xleft)
+ if addx > 0 then
+ xleft = xleft - addx/2
+ xright = xright + addx/2
+ end if
+ if tree_node_ellipse = 0 then
+ amove xleft 0
+ box xright-xleft nodehi
+ set just cc
+ amove 0 nodehi/2
+ texortext label$ "lab" 0 tree_node_hei
+ else
+ set_ellipse_c e_c
+ ellipse_text 0 nodehi/2 label$ "lab"
+ end if
+ local wd1 = width(ltree$)
+ local wdm = width(mtree$)
+ local wd2 = width(rtree$)
+ set just center
+ draw_edge_label -(wd1+wdm)/2-tree_node_dx -tree_node_dy 0 0 llab$
+ drawcliparc 0 -(wd1+wdm)/2-tree_node_dx ybot -(wd1+wdm)/2-tree_node_dx 0 llab$
+ draw_edge_label 0 -tree_node_dy 0 0 mlab$
+ drawcliparc 0 0 ybot -tree_node_dx/2 tree_node_dx/2 mlab$
+ draw_edge_label (wd2+wdm)/2+tree_node_dx -tree_node_dy 0 0 rlab$
+ drawcliparc 0 (wd2+wdm)/2+tree_node_dx ybot 0 (wd2+wdm)/2+tree_node_dx rlab$
+ amove -(wd1+wdm)/2-tree_node_dx ybot-tree_node_dy
+ draw ltree$+".tc"
+ amove (wd1+wdm)/2+tree_node_dx ybot-tree_node_dy
+ draw rtree$+".tc"
+ amove 0 ybot-tree_node_dy
+ draw mtree$+".tc"
+ end object
+end sub
+
+sub def_leaf_ellipse str$ name$
+ local c = ellipse_c
+ begin object name$
+ set_ellipse_c c
+ set hei tree_leaf_hei
+ ellipse_text 0 0 str$ "lab"
+ end object
+end sub
diff --git a/src/lib/ziptext.gle b/src/lib/ziptext.gle
new file mode 100644
index 0000000..538b930
--- /dev/null
+++ b/src/lib/ziptext.gle
@@ -0,0 +1,51 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+! Subroutines to draw moving (zipped) text...
+
+sub ziptext tt$
+gsave
+for i = 1 to 0 step -.05
+ set color (i)
+ write tt$
+ rmove -.05 .025
+next i
+set color white
+write tt$
+grestore
+end sub
diff --git a/src/makefmt/Makefile.gcc b/src/makefmt/Makefile.gcc
new file mode 100644
index 0000000..46ed270
--- /dev/null
+++ b/src/makefmt/Makefile.gcc
@@ -0,0 +1,56 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+#
+# makefile.vc for makefmt
+# for compilation with MS vc++ .net
+#
+#
+include ../../config.gcc
+#
+include files.txt
+
+all: $(OBJECTS) $(PROJECT_BINDIR)/bin/$(PROGRAM)$(EXE_SUFF)
+
+$(OBJECTS): $(INCLUDES)
+
+$(PROJECT_BINDIR)/bin/$(PROGRAM)$(EXE_SUFF): $(OBJECTS) $(INCLUDES) $(PROGRAM).cpp
+ $(CC) $(CXXFLAGS) $(PROGRAM).cpp -o $(PROJECT_BINDIR)/bin/$(PROGRAM)$(EXE_SUFF) $(OBJECTS)
+
+clean:
+ -$(RM) $(OBJECTS) $(PROJECT_BINDIR)/bin/$(PROGRAM)$(EXE_SUFF) $(PROGRAM).$(OBJ_SUFF)
diff --git a/src/makefmt/Makefile.in b/src/makefmt/Makefile.in
new file mode 100644
index 0000000..b465414
--- /dev/null
+++ b/src/makefmt/Makefile.in
@@ -0,0 +1,75 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+#
+# makefile.vc for makefmt
+# for compilation with MS vc++ .net
+#
+
+include ../../config.i
+include ../../config.aconf
+
+include files.txt
+
+CXX=@CXX@
+CPPFLAGS=@CPPFLAGS@
+
+LDFLAGS=@LDFLAGS@
+LIBS=@LIBS@
+ELIBS=
+
+ifeq (@HAVE_LIBGLE_CPPFLAGS@,1)
+ EXTRA_OBJS := ../gle/cutils.static.$(OBJ_SUFF) ../gle/file_io.static.$(OBJ_SUFF)
+endif
+
+ifeq (@HAVE_WIN32@,1)
+ ELIBS := -lwsock32
+endif
+
+CPPFLAGS := $(strip $(CPPFLAGS))
+
+all: $(OBJECTS) $(PROJECT_BINDIR)/bin/$(PROGRAM)$(EXE_SUFF)
+
+$(OBJECTS): %.o: %.cpp $(INCLUDES)
+ $(CXX) $(CPPFLAGS) -c $< -o $@
+
+$(PROJECT_BINDIR)/bin/$(PROGRAM)$(EXE_SUFF): $(OBJECTS) $(EXTRA_OBJS) $(INCLUDES) $(PROGRAM).cpp
+ $(CXX) $(CPPFLAGS) $(PROGRAM).cpp $(OBJECTS) $(EXTRA_OBJS) $(ELIBS) -o $(PROJECT_BINDIR)/bin/$(PROGRAM)$(EXE_SUFF)
+
+clean:
+ -$(RM) $(OBJECTS) $(PROJECT_BINDIR)/bin/$(PROGRAM)$(EXE_SUFF) $(PROGRAM).$(OBJ_SUFF)
diff --git a/src/makefmt/Makefile.os2 b/src/makefmt/Makefile.os2
new file mode 100644
index 0000000..da6c281
--- /dev/null
+++ b/src/makefmt/Makefile.os2
@@ -0,0 +1,54 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+#
+# Makefile.os2 for makefmt
+#
+include ../../config.os2
+#
+include files.txt
+
+all: $(OBJECTS) $(PROJECT_BINDIR)/bin/$(PROGRAM)$(EXE_SUFF)
+
+$(OBJECTS): $(INCLUDES)
+
+$(PROJECT_BINDIR)/bin/$(PROGRAM)$(EXE_SUFF): $(OBJECTS) $(INCLUDES) $(PROGRAM).cpp
+ $(CC) $(CXXFLAGS) $(PROGRAM).cpp -o $(PROJECT_BINDIR)/bin/$(PROGRAM)$(EXE_SUFF) $(OBJECTS)
+
+clean:
+ -$(RM) $(OBJECTS) $(PROJECT_BINDIR)/bin/$(PROGRAM)$(EXE_SUFF) $(PROGRAM).$(OBJ_SUFF)
diff --git a/src/makefmt/Makefile.vc b/src/makefmt/Makefile.vc
new file mode 100644
index 0000000..1f1caef
--- /dev/null
+++ b/src/makefmt/Makefile.vc
@@ -0,0 +1,56 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+#
+# makefile.vc for makefmt
+# for compilation with MS vc++ .net
+#
+#
+!include ..\..\config.vc
+#
+!include files.txt
+
+all: $(OBJECTS) $(PROJECT_BINDIR)\bin\$(PROGRAM)$(EXE_SUFF)
+
+$(OBJECTS): $(INCLUDES)
+
+$(PROJECT_BINDIR)\bin\$(PROGRAM)$(EXE_SUFF): $(OBJECTS) $(INCLUDES) $(PROGRAM).cpp
+ $(CC) $(CPPFLAGS) $(PROGRAM).cpp -o $(PROJECT_BINDIR)\bin\$(PROGRAM)$(EXE_SUFF) $(OBJECTS)
+
+clean:
+ -$(RM) $(OBJECTS) $(PROJECT_BINDIR)\bin\$(PROGRAM)$(EXE_SUFF) $(PROGRAM).$(OBJ_SUFF)
diff --git a/src/makefmt/basicconf.h b/src/makefmt/basicconf.h
new file mode 100644
index 0000000..6b74f97
--- /dev/null
+++ b/src/makefmt/basicconf.h
@@ -0,0 +1,99 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#ifndef INCLUDE_BASICCONF_H
+#define INCLUDE_BASICCONF_H
+
+#ifdef HAVE_CONFIG_H
+ #include "../config.h"
+#else
+ #include "../config_noauto.h"
+#endif
+
+#ifdef __UNIX__
+ #define READ_BIN "r"
+ #define WRITE_BIN "w"
+#endif
+
+#ifdef __WIN32__
+ #define READ_BIN "rb"
+ #define WRITE_BIN "wb"
+#endif
+
+#if defined(__OS2__) && defined(__EMX__)
+ #define READ_BIN "rb"
+ #define WRITE_BIN "wb"
+#endif
+
+#include <stdio.h>
+#if HAVE_SYS_TYPES_H
+ #include <sys/types.h>
+#endif
+#if HAVE_SYS_STAT_H
+ #include <sys/stat.h>
+#endif
+#if STDC_HEADERS
+ #include <stdlib.h>
+ #include <stddef.h>
+#else
+ #if HAVE_STDLIB_H
+ #include <stdlib.h>
+ #endif
+#endif
+#if HAVE_STRING_H
+ #if !STDC_HEADERS && HAVE_MEMORY_H
+ #include <memory.h>
+ #endif
+ #include <string.h>
+#endif
+#if HAVE_STRINGS_H
+ #include <strings.h>
+#endif
+#if HAVE_UNISTD_H
+ #include <unistd.h>
+#endif
+#include <math.h>
+#include <errno.h>
+
+#include <string>
+#include <vector>
+#include <iostream>
+
+using namespace std;
+
+#endif
diff --git a/src/makefmt/files.txt b/src/makefmt/files.txt
new file mode 100644
index 0000000..9764478
--- /dev/null
+++ b/src/makefmt/files.txt
@@ -0,0 +1,53 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+#
+# files list for GLE to be included by the makefiles
+#
+
+PROGRAM = makefmt
+
+INCLUDES = \
+parseAFM.h
+
+OBJECTS = \
+parseAFM.$(OBJ_SUFF)
+
+EXTRA_OBJS = \
+../gle/cutils.$(OBJ_SUFF) \
+../gle/file_io.$(OBJ_SUFF)
diff --git a/src/makefmt/makefmt.cpp b/src/makefmt/makefmt.cpp
new file mode 100644
index 0000000..0abcb26
--- /dev/null
+++ b/src/makefmt/makefmt.cpp
@@ -0,0 +1,411 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#include <fstream>
+#include <map>
+
+#include "basicconf.h"
+#include "../gle/tokens/stokenizer.h"
+#include "../gle/file_io.h"
+
+#include "parseAFM.h"
+
+int debugit = 0;
+#define dbg if (debugit)
+void writefmt(const char* fmtname, const char* encname, FontInfo *fi);
+
+typedef struct {
+ unsigned int CharCode;
+ float X;
+ float Y;
+} GLEFontKernInfo;
+
+typedef struct {
+ unsigned int NextChar;
+ unsigned int RepChar;
+} GLEFontLigatureInfo;
+
+typedef struct {
+ int encoding; /* 1 = postscript text, 2 = postscrip symbol, 3 = TEX text, 4 = TEX symbol, 5 = GLE markers */
+ float space, space_stretch, space_shrink;
+ float scale, slant, uposition, uthickness;
+ float fx1, fy1, fx2, fy2, caphei, xhei, descender, ascender;
+} GLEFontTable;
+
+class GLEFontCharData {
+public:
+ vector<GLEFontKernInfo> Kern;
+ vector<GLEFontLigatureInfo> Lig;
+ float wx, wy, x1, y1, x2, y2;
+ bool used;
+public:
+ GLEFontCharData();
+ ~GLEFontCharData();
+};
+
+GLEFontCharData::GLEFontCharData() {
+ used = false;
+ wx = 0.0;
+ wy = 0.0;
+ x1 = 0.0;
+ y1 = 0.0;
+ x2 = 0.0;
+ y2 = 0.0;
+}
+
+GLEFontCharData::~GLEFontCharData() {
+}
+
+vector<string> accents;
+
+void init_accents() {
+ accents.push_back("caron");
+ accents.push_back("cedilla");
+ accents.push_back("acute");
+ accents.push_back("dieresis");
+ accents.push_back("circumflex");
+ accents.push_back("grave");
+ accents.push_back("ring");
+ accents.push_back("tilde");
+}
+
+int find_accent(const string& accent) {
+ for (vector<string>::size_type i = 0; i < accents.size(); i++) {
+ if (accent == accents[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+int main(int argc, char *argv[]) {
+ char filename[80];
+ char fmtname[80];
+ init_accents();
+ /* encoding file given? */
+ int argpos = 1;
+ const char* encname = NULL;
+ if (strcmp(argv[argpos], "-e") == 0) {
+ encname = argv[argpos+1];
+ argpos += 2;
+ }
+ /* output file given? */
+ if (strcmp(argv[argpos], "-o") == 0) {
+ strcpy(filename, argv[argpos+2]);
+ strcpy(fmtname, argv[argpos+1]);
+ } else {
+ strcpy(filename, argv[argpos]);
+ char* s = strchr(filename,'.');
+ if (s!=NULL) *s=0;
+ strcpy(fmtname,filename);
+ if (strchr(filename,':')!=NULL) strcpy(fmtname,strchr(filename,':')+1);
+ strcat(fmtname,".fmt");
+ strcat(filename,".afm");
+ }
+ printf("[%s]==>[%s]\n",filename,fmtname);
+ if (!filename[0]) {
+ printf ("*** ERROR: can't open. filename is missing.\n");
+ return 0;
+ }
+ FILE* fp = fopen(filename, READ_BIN);
+ if (fp == NULL) {
+ printf ("*** ERROR: can't find: %s\n", filename );
+ perror("");
+ exit(1);
+ }
+ FontInfo *fi;
+ switch (parseFile(fp, &fi, P_ALL)) {
+ case parseError:
+ printf("*** ERROR: problem in parsing the AFM File.\n");
+ exit(1);
+ case ok:
+ fclose(fp);
+ writefmt(fmtname, encname, fi);
+ break;
+ case earlyEOF:
+ printf("The AFM File ended prematurely.\n");
+ exit(1);
+ break;
+ default:
+ break;
+ }
+ return 0;
+}
+
+unsigned int font_str_to_code(map<string, unsigned int>& charcodes, const char* name) {
+ string my_name = name;
+ map<string, unsigned int>::iterator it = charcodes.find(my_name);
+ if (it == charcodes.end()) {
+ printf("error: can't find code point for '%s'\n", name);
+ exit(-1);
+ }
+ return it->second;
+}
+
+void writefmt(const char* fmtname, const char* encname, FontInfo *fi) {
+ /* create output file */
+ GLEFileIO fmt;
+ fmt.open(fmtname, WRITE_BIN);
+ if (!fmt.isOpen()) {
+ perror ("Cant open output file");
+ exit(1);
+ }
+ GLEFontTable fnt;
+ fnt.encoding = 1;
+ if (strcmp(fi->gfi->encodingScheme,"TEXENCODING") == 0) {
+ fnt.encoding = 3;
+ }
+ if (strcmp(fi->gfi->encodingScheme,"AdobeStandardEncoding") == 0) {
+ fnt.encoding = 1;
+ }
+ if (strcmp(fi->gfi->encodingScheme,"GLEMARK") == 0) {
+ fnt.encoding = 5;
+ }
+ fnt.scale = 1000;
+ float scl = 0.001;
+ fnt.slant = fi->gfi->italicAngle;
+ fnt.uposition = fi->gfi->underlinePosition*scl;
+ fnt.uthickness = fi->gfi->underlineThickness*scl;
+ fnt.fx1 = fi->gfi->fontBBox.llx*scl;
+ fnt.fy1 = fi->gfi->fontBBox.lly*scl;
+ fnt.fx2 = fi->gfi->fontBBox.urx*scl;
+ fnt.fy2 = fi->gfi->fontBBox.ury*scl;
+ fnt.caphei = fi->gfi->capHeight*scl;
+ fnt.xhei = fi->gfi->xHeight*scl;
+ fnt.descender = fi->gfi->descender*scl;
+ fnt.ascender = fi->gfi->ascender*scl;
+ /* look for space character */
+ for (int i = 0; i < fi->numOfChars; i++) {
+ if (fi->cmi[i].code == 32) {
+ fnt.space = fi->cmi[i].wx*scl;
+ fnt.space_stretch = fnt.space*0.5;
+ fnt.space_shrink = fnt.space*0.3;
+ break;
+ }
+ }
+ /* write out global font information */
+ fmt.fwrite(&fnt, sizeof(GLEFontTable), 1);
+ /* read encoding table */
+ map<string, unsigned int> charcodes;
+ vector<unsigned int> encoding_unicode;
+ vector<unsigned int> encoding_code;
+ int nb_chars = 256;
+ if (encname != NULL) {
+ ifstream strm;
+ strm.open(encname);
+ if (!strm.is_open()) {
+ printf("error: can't open '%s'\n", encname);
+ exit(-1);
+ }
+ char_separator sep(" ,;");
+ tokenizer<char_separator> tokens(sep);
+ while (strm.good()) {
+ string line;
+ getline(strm, line);
+ /* remove comments */
+ string::size_type pos = line.find('!');
+ if (pos != string::npos) {
+ line = line.substr(0, pos);
+ }
+ /* tokenize line */
+ tokens.set_input(line);
+ if (tokens.has_more()) {
+ string unicode = tokens.next_token();
+ if (unicode.length() < 1 || unicode[0] != '$') {
+ printf("error: illegal unicode at line '%s'\n", line.c_str());
+ }
+ char *ptr = NULL;
+ unsigned int unicode_pt = (unsigned int)strtol(unicode.c_str()+1, &ptr, 16);
+ if (*ptr != 0) {
+ printf("error: illegal unicode at line '%s'\n", line.c_str());
+ }
+ if (!tokens.has_more()) {
+ printf("error: too few tokens at line '%s'\n", line.c_str());
+ }
+ string code = tokens.next_token();
+ unsigned int code_pt = (unsigned int)strtol(code.c_str(), &ptr, 10);
+ if (*ptr != 0) {
+ printf("error: illegal code at line '%s'\n", line.c_str());
+ }
+ if (!tokens.has_more()) {
+ printf("error: too few tokens at line '%s'\n", line.c_str());
+ }
+ string name = tokens.next_token();
+ // cout << "unicode: '" << unicode_pt << "'" << endl;
+ // cout << "code: '" << code_pt << "'" << endl;
+ // cout << "name: '" << name << "'" << endl;
+ charcodes[name] = code_pt;
+ encoding_unicode.push_back(unicode_pt);
+ encoding_code.push_back(code_pt);
+ if (code_pt+1 > (unsigned int)nb_chars) {
+ /* update number of characters in font */
+ nb_chars = code_pt + 1;
+ }
+ }
+ }
+ strm.close();
+ }
+ /* create character metrics data */
+ vector<GLEFontCharData*> chardata;
+ for (int i = 0; i < nb_chars; i++) {
+ chardata.push_back(new GLEFontCharData());
+ }
+ /* make code points for all characters */
+ for (int i = 0; i < fi->numOfChars; i++) {
+ CharMetricInfo *ci = &fi->cmi[i];
+ if (ci->code != -1) {
+ unsigned int code_pt = (unsigned int)ci->code;
+ charcodes[ci->name] = code_pt;
+ }
+ }
+ /* read in all characters */
+ for (int i = 0; i < fi->numOfChars; i++) {
+ CharMetricInfo *ci = &fi->cmi[i];
+ unsigned int code_pt = 0;
+ if (ci->code != -1) {
+ code_pt = (unsigned int)ci->code;
+ } else {
+ string my_name = ci->name;
+ map<string, unsigned int>::iterator it = charcodes.find(my_name);
+ if (it == charcodes.end()) {
+ /* no code point for this character in encoding */
+ continue;
+ } else {
+ code_pt = it->second;
+ }
+ }
+ /* set character metrics */
+ GLEFontCharData* cdata = chardata[code_pt];
+ cdata->used = true;
+ cdata->wx = ci->wx*scl;
+ cdata->wy = ci->wy*scl;
+ cdata->x1 = ci->charBBox.llx*scl;
+ cdata->x2 = ci->charBBox.urx*scl;
+ cdata->y1 = ci->charBBox.lly*scl;
+ cdata->y2 = ci->charBBox.ury*scl;
+ /* store ligatures */
+ for (Ligature *node = ci->ligs; node != NULL; node = node->next) {
+ GLEFontLigatureInfo ldata;
+ ldata.NextChar = font_str_to_code(charcodes, node->succ);
+ ldata.RepChar = font_str_to_code(charcodes, node->lig);
+ cdata->Lig.push_back(ldata);
+ chardata[ldata.NextChar]->used = true;
+ chardata[ldata.RepChar]->used = true;
+ }
+ }
+ /* read kerning data */
+ for (int i = 0; i < fi->numOfPairs; i++) {
+ PairKernData *pkd = fi->pkd;
+ unsigned int c1 = font_str_to_code(charcodes, pkd[i].name1);
+ unsigned int c2 = font_str_to_code(charcodes, pkd[i].name2);
+ GLEFontKernInfo kinfo;
+ kinfo.CharCode = c2;
+ kinfo.X = pkd[i].xamt*scl;
+ kinfo.Y = pkd[i].yamt*scl;
+ chardata[c1]->used = true;
+ chardata[c2]->used = true;
+ chardata[c1]->Kern.push_back(kinfo);
+ }
+ /* write out number of characters */
+ fmt.fwrite(&nb_chars, sizeof(int), 1);
+ /* write unicode table */
+ int size = encoding_code.size();
+ fmt.fwrite(&size, sizeof(int), 1);
+ if (size > 0) {
+ fmt.fwrite(&encoding_unicode[0], sizeof(unsigned int), size);
+ fmt.fwrite(&encoding_code[0], sizeof(unsigned int), size);
+ }
+ /* write out character data */
+ for (int i = 0; i < nb_chars; i++) {
+ GLEFontCharData* cdata = chardata[i];
+ if (cdata->used) {
+ fmt.fputc(1);
+ fmt.fwrite(&cdata->wx, sizeof(float), 1);
+ fmt.fwrite(&cdata->wy, sizeof(float), 1);
+ fmt.fwrite(&cdata->x1, sizeof(float), 1);
+ fmt.fwrite(&cdata->y1, sizeof(float), 1);
+ fmt.fwrite(&cdata->x2, sizeof(float), 1);
+ fmt.fwrite(&cdata->y2, sizeof(float), 1);
+ unsigned int ksize = cdata->Kern.size();
+ fmt.fwrite(&ksize, sizeof(unsigned int), 1);
+ if (ksize > 0) fmt.fwrite(&cdata->Kern[0], sizeof(GLEFontKernInfo), ksize);
+ unsigned int lsize = cdata->Lig.size();
+ fmt.fwrite(&lsize, sizeof(unsigned int), 1);
+ if (lsize > 0) fmt.fwrite(&cdata->Lig[0], sizeof(GLEFontLigatureInfo), lsize);
+ } else {
+ fmt.fputc(0);
+ }
+ }
+ /* Also do the composites to support accents in GLE (new 070506) */
+ for (int i = 0; i < fi->numOfComps; i++) {
+ CompCharData *ccd = &(fi->ccd[i]);
+ string name = ccd->ccName;
+ if (name.length() > 1) {
+ int char_code = name[0];
+ string accent_code = name.substr(1);
+ int accent_idx = find_accent(accent_code);
+ if (accent_idx != -1) {
+ if (ccd->numOfPieces != 2) {
+ cout << ">>> incorrect number of pieces: '" << name << "': " << ccd->numOfPieces << endl;
+ } else {
+ fmt.fwrite(&char_code, sizeof(int), 1);
+ fmt.fwrite(&accent_idx, sizeof(int), 1);
+ for (int j = 0; j < ccd->numOfPieces; j++) {
+ Pcc* piece = &ccd->pieces[j];
+ int piece_code = font_str_to_code(charcodes, piece->pccName);
+ if (piece_code == 0) {
+ cout << ">>> can't find piece: '" << piece->pccName << "'" << endl;
+ }
+ fmt.fwrite(&piece_code, sizeof(int), 1);
+ float dx = piece->deltax * scl;
+ float dy = piece->deltay * scl;
+ fmt.fwrite(&dx, sizeof(float), 1);
+ fmt.fwrite(&dy, sizeof(float), 1);
+ }
+ }
+ } else {
+ cout << ">>> unknown accent: '" << accent_code << "'" << endl;
+ }
+ } else {
+ cout << ">>> composite too short: '" << name << "'" << endl;
+ }
+ }
+ int term = 0;
+ fmt.fwrite(&term, sizeof(int), 1);
+ fmt.close();
+}
diff --git a/src/makefmt/parseAFM.cpp b/src/makefmt/parseAFM.cpp
new file mode 100644
index 0000000..5451de6
--- /dev/null
+++ b/src/makefmt/parseAFM.cpp
@@ -0,0 +1,1268 @@
+/*
+ * (C) 1988, 1989, 1990 by Adobe Systems Incorporated. All rights reserved.
+ *
+ * This file may be freely copied and redistributed as long as:
+ * 1) This entire notice continues to be included in the file,
+ * 2) If the file has been modified in any way, a notice of such
+ * modification is conspicuously indicated.
+ *
+ * PostScript, Display PostScript, and Adobe are registered trademarks of
+ * Adobe Systems Incorporated.
+ *
+ * ************************************************************************
+ * THE INFORMATION BELOW IS FURNISHED AS IS, IS SUBJECT TO CHANGE WITHOUT
+ * NOTICE, AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY ADOBE SYSTEMS
+ * INCORPORATED. ADOBE SYSTEMS INCORPORATED ASSUMES NO RESPONSIBILITY OR
+ * LIABILITY FOR ANY ERRORS OR INACCURACIES, MAKES NO WARRANTY OF ANY
+ * KIND (EXPRESS, IMPLIED OR STATUTORY) WITH RESPECT TO THIS INFORMATION,
+ * AND EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR PARTICULAR PURPOSES AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
+ * ************************************************************************
+ */
+
+ /*
+ * Changes made by GLE developers are indicated with "** GLE **"
+ * These changes are required to make parseAFM compile as "C++" code (the original code is "C")
+ */
+
+/* parseAFM.c
+ *
+ * This file is used in conjuction with the parseAFM.h header file.
+ * This file contains several procedures that are used to parse AFM
+ * files. It is intended to work with an application program that needs
+ * font metric information. The program can be used as is by making a
+ * procedure call to "parseFile" (passing in the expected parameters)
+ * and having it fill in a data structure with the data from the
+ * AFM file, or an application developer may wish to customize this
+ * code.
+ *
+ * There is also a file, parseAFMclient.c, that is a sample application
+ * showing how to call the "parseFile" procedure and how to use the data
+ * after "parseFile" has returned.
+ *
+ * Please read the comments in parseAFM.h and parseAFMclient.c.
+ *
+ * History:
+ * original: DSM Thu Oct 20 17:39:59 PDT 1988
+ * modified: DSM Mon Jul 3 14:17:50 PDT 1989
+ * - added 'storageProblem' return code
+ * - fixed bug of not allocating extra byte for string duplication
+ * - fixed typos
+ * modified: DSM Tue Apr 3 11:18:34 PDT 1990
+ * - added free(ident) at end of parseFile routine
+ * modified: DSM Tue Jun 19 10:16:29 PDT 1990
+ * - changed (width == 250) to (width = 250) in initializeArray
+ */
+
+// #include <stdio.h>
+// #include <errno.h>
+// #include <sys/file.h>
+// #include <math.h>
+// ** GLE ** replaced above four lines by the following one
+#include "basicconf.h"
+#include "parseAFM.h"
+
+#define lineterm EOL /* line terminating character */
+#define normalEOF 1 /* return code from parsing routines used only */
+ /* in this module */
+#define Space "space" /* used in string comparison to look for the width */
+ /* of the space character to init the widths array */
+#define False "false" /* used in string comparison to check the value of */
+ /* boolean keys (e.g. IsFixedPitch) */
+
+#define MATCH(A,B) (strncmp((A),(B), MAX_NAME) == 0)
+
+
+
+/*************************** GLOBALS ***********************/
+
+static char *ident = NULL; /* storage buffer for keywords */
+
+
+/* "shorts" for fast case statement
+ * The values of each of these enumerated items correspond to an entry in the
+ * table of strings defined below. Therefore, if you add a new string as
+ * new keyword into the keyStrings table, you must also add a corresponding
+ * parseKey AND it MUST be in the same position!
+ *
+ * IMPORTANT: since the sorting algorithm is a binary search, the strings of
+ * keywords must be placed in lexicographical order, below. [Therefore, the
+ * enumerated items are not necessarily in lexicographical order, depending
+ * on the name chosen. BUT, they must be placed in the same position as the
+ * corresponding key string.] The NOPE shall remain in the last position,
+ * since it does not correspond to any key string, and it is used in the
+ * "recognize" procedure to calculate how many possible keys there are.
+ */
+
+// static enum parseKey {
+// ** GLE ** removed keyword "static" from previous line
+// ** GLE ** added constants STDHW and STDVW to be able to parse Adobe-Core35_AFMs-314 AFMs
+enum parseKey {
+ ASCENDER, CHARBBOX, CODE, COMPCHAR, CAPHEIGHT, COMMENT,
+ DESCENDER, ENCODINGSCHEME, ENDCHARMETRICS, ENDCOMPOSITES,
+ ENDFONTMETRICS, ENDKERNDATA, ENDKERNPAIRS, ENDTRACKKERN,
+ FAMILYNAME, FONTBBOX, FONTNAME, FULLNAME, ISFIXEDPITCH,
+ ITALICANGLE, KERNPAIR, KERNPAIRXAMT, LIGATURE, CHARNAME,
+ NOTICE, COMPCHARPIECE, STARTCHARMETRICS, STARTCOMPOSITES,
+ STARTFONTMETRICS, STARTKERNDATA, STARTKERNPAIRS,
+ STARTTRACKKERN, STDHW, STDVW, TRACKKERN, UNDERLINEPOSITION,
+ UNDERLINETHICKNESS, VERSION, XYWIDTH, XWIDTH, WEIGHT, XHEIGHT,
+ NOPE };
+
+/* keywords for the system:
+ * This a table of all of the current strings that are vaild AFM keys.
+ * Each entry can be referenced by the appropriate parseKey value (an
+ * enumerated data type defined above). If you add a new keyword here,
+ * a corresponding parseKey MUST be added to the enumerated data type
+ * defined above, AND it MUST be added in the same position as the
+ * string is in this table.
+ *
+ * IMPORTANT: since the sorting algorithm is a binary search, the keywords
+ * must be placed in lexicographical order. And, NULL should remain at the
+ * end.
+ */
+
+// static char *keyStrings[] = {
+// ** GLE ** added keyword "const" to previous line
+// ** GLE ** added keywords "StdHW" and "StdVW" to be able to parse Adobe-Core35_AFMs-314 AFMs
+static const char *keyStrings[] = {
+ "Ascender", "B", "C", "CC", "CapHeight", "Comment",
+ "Descender", "EncodingScheme", "EndCharMetrics", "EndComposites",
+ "EndFontMetrics", "EndKernData", "EndKernPairs", "EndTrackKern",
+ "FamilyName", "FontBBox", "FontName", "FullName", "IsFixedPitch",
+ "ItalicAngle", "KP", "KPX", "L", "N",
+ "Notice", "PCC", "StartCharMetrics", "StartComposites",
+ "StartFontMetrics", "StartKernData", "StartKernPairs",
+ "StartTrackKern", "StdHW", "StdVW", "TrackKern", "UnderlinePosition",
+ "UnderlineThickness", "Version", "W", "WX", "Weight", "XHeight",
+ NULL };
+
+/*************************** PARSING ROUTINES **************/
+
+/*************************** token *************************/
+
+/* A "AFM File Conventions" tokenizer. That means that it will
+ * return the next token delimited by white space. See also
+ * the `linetoken' routine, which does a similar thing but
+ * reads all tokens until the next end-of-line.
+ */
+
+// static char *token(stream)
+// FILE *stream;
+// ** GLE ** replaced above two lines by the following one
+static char *token(FILE *stream)
+{
+ int ch, idx;
+
+ /* skip over white space */
+ while ((ch = fgetc(stream)) == ' ' || ch == lineterm ||
+ ch == ',' || ch == '\t' || ch == ';');
+
+ idx = 0;
+ while (ch != EOF && ch != ' ' && ch != lineterm
+ && ch != '\t' && ch != ':' && ch != ';')
+ {
+ ident[idx++] = ch;
+ ch = fgetc(stream);
+ } /* while */
+
+ if (ch == EOF && idx < 1) return ((char *)NULL);
+ if (idx >= 1 && ch != ':' ) ungetc(ch, stream);
+ if (idx < 1 ) ident[idx++] = ch; /* single-character token */
+ ident[idx] = 0;
+
+ return(ident); /* returns pointer to the token */
+
+} /* token */
+
+
+/*************************** linetoken *************************/
+
+/* "linetoken" will get read all tokens until the EOL character from
+ * the given stream. This is used to get any arguments that can be
+ * more than one word (like Comment lines and FullName).
+ */
+
+// static char *linetoken(stream)
+// FILE *stream;
+// ** GLE ** replaced above two lines by the following one
+static char *linetoken(FILE *stream)
+{
+ int ch, idx;
+
+ while ((ch = fgetc(stream)) == ' ' || ch == '\t' );
+
+ idx = 0;
+ while (ch != EOF && ch != lineterm)
+ {
+ ident[idx++] = ch;
+ ch = fgetc(stream);
+ } /* while */
+
+ ungetc(ch, stream);
+ ident[idx] = 0;
+
+ return(ident); /* returns pointer to the token */
+
+} /* linetoken */
+
+
+/*************************** recognize *************************/
+
+/* This function tries to match a string to a known list of
+ * valid AFM entries (check the keyStrings array above).
+ * "ident" contains everything from white space through the
+ * next space, tab, or ":" character.
+ *
+ * The algorithm is a standard Knuth binary search.
+ */
+
+//static enum parseKey recognize(ident)
+// register char *ident;
+// ** GLE ** replaced above two lines by the following one
+static enum parseKey recognize(char* ident)
+{
+ int lower = 0, upper = (int) NOPE, midpoint, cmpvalue;
+ BOOL found = FALSE;
+
+ while ((upper >= lower) && !found)
+ {
+ midpoint = (lower + upper)/2;
+ if (keyStrings[midpoint] == NULL) break;
+ cmpvalue = strncmp(ident, keyStrings[midpoint], MAX_NAME);
+ if (cmpvalue == 0) found = TRUE;
+ else if (cmpvalue < 0) upper = midpoint - 1;
+ else lower = midpoint + 1;
+ } /* while */
+
+ if (found) return (enum parseKey) midpoint;
+ else return NOPE;
+
+} /* recognize */
+
+
+/************************* parseGlobals *****************************/
+
+/* This function is called by "parseFile". It will parse the AFM File
+ * up to the "StartCharMetrics" keyword, which essentially marks the
+ * end of the Global Font Information and the beginning of the character
+ * metrics information.
+ *
+ * If the caller of "parseFile" specified that it wanted the Global
+ * Font Information (as defined by the "AFM File Specification"
+ * document), then that information will be stored in the returned
+ * data structure.
+ *
+ * Any Global Font Information entries that are not found in a
+ * given file, will have the usual default initialization value
+ * for its type (i.e. entries of type int will be 0, etc).
+ *
+ * This function returns an error code specifying whether there was
+ * a premature EOF or a parsing error. This return value is used by
+ * parseFile to determine if there is more file to parse.
+ */
+
+//static BOOL parseGlobals(fp, gfi)
+// FILE *fp;
+// register GlobalFontInfo *gfi;
+// ** GLE ** replaced above three lines by the following one
+static BOOL parseGlobals(FILE *fp, GlobalFontInfo *gfi)
+{
+ BOOL cont = TRUE, save = (gfi != NULL);
+ int error = ok;
+ register char *keyword;
+
+ while (cont)
+ {
+ keyword = token(fp);
+
+ if (keyword == NULL)
+ /* Have reached an early and unexpected EOF. */
+ /* Set flag and stop parsing */
+ {
+ error = earlyEOF;
+ break; /* get out of loop */
+ }
+ if (!save)
+ /* get tokens until the end of the Global Font info section */
+ /* without saving any of the data */
+ switch (recognize(keyword))
+ {
+ case STARTCHARMETRICS:
+ cont = FALSE;
+ break;
+ case ENDFONTMETRICS:
+ cont = FALSE;
+ error = normalEOF;
+ break;
+ default:
+ break;
+ } /* switch */
+ else
+ /* otherwise parse entire global font info section, */
+ /* saving the data */
+ switch(recognize(keyword))
+ {
+ case STARTFONTMETRICS:
+ keyword = token(fp);
+ gfi->afmVersion = (char *) malloc(strlen(keyword) + 1);
+ strcpy(gfi->afmVersion, keyword);
+ break;
+ case COMMENT:
+ keyword = linetoken(fp);
+ break;
+ case FONTNAME:
+ keyword = token(fp);
+ gfi->fontName = (char *) malloc(strlen(keyword) + 1);
+ strcpy(gfi->fontName, keyword);
+ break;
+ case ENCODINGSCHEME:
+ keyword = token(fp);
+ gfi->encodingScheme = (char *)
+ malloc(strlen(keyword) + 1);
+ strcpy(gfi->encodingScheme, keyword);
+ break;
+ case FULLNAME:
+ keyword = linetoken(fp);
+ gfi->fullName = (char *) malloc(strlen(keyword) + 1);
+ strcpy(gfi->fullName, keyword);
+ break;
+ case FAMILYNAME:
+ keyword = linetoken(fp);
+ gfi->familyName = (char *) malloc(strlen(keyword) + 1);
+ strcpy(gfi->familyName, keyword);
+ break;
+ case WEIGHT:
+ keyword = token(fp);
+ gfi->weight = (char *) malloc(strlen(keyword) + 1);
+ strcpy(gfi->weight, keyword);
+ break;
+ case ITALICANGLE:
+ keyword = token(fp);
+ gfi->italicAngle = atof(keyword);
+ if (errno == ERANGE) error = parseError;
+ break;
+ case ISFIXEDPITCH:
+ keyword = token(fp);
+ if (MATCH(keyword, False))
+ gfi->isFixedPitch = 0;
+ else
+ gfi->isFixedPitch = 1;
+ break;
+ case UNDERLINEPOSITION:
+ keyword = token(fp);
+ gfi->underlinePosition = atoi(keyword);
+ break;
+ case UNDERLINETHICKNESS:
+ keyword = token(fp);
+ gfi->underlineThickness = atoi(keyword);
+ break;
+ case VERSION:
+ keyword = token(fp);
+ gfi->version = (char *) malloc(strlen(keyword) + 1);
+ strcpy(gfi->version, keyword);
+ break;
+ case NOTICE:
+ keyword = linetoken(fp);
+ gfi->notice = (char *) malloc(strlen(keyword) + 1);
+ strcpy(gfi->notice, keyword);
+ break;
+ case FONTBBOX:
+ keyword = token(fp);
+ gfi->fontBBox.llx = atoi(keyword);
+ keyword = token(fp);
+ gfi->fontBBox.lly = atoi(keyword);
+ keyword = token(fp);
+ gfi->fontBBox.urx = atoi(keyword);
+ keyword = token(fp);
+ gfi->fontBBox.ury = atoi(keyword);
+ break;
+ case CAPHEIGHT:
+ keyword = token(fp);
+ gfi->capHeight = atoi(keyword);
+ break;
+ case XHEIGHT:
+ keyword = token(fp);
+ gfi->xHeight = atoi(keyword);
+ break;
+ case DESCENDER:
+ keyword = token(fp);
+ gfi->descender = atoi(keyword);
+ break;
+ case ASCENDER:
+ keyword = token(fp);
+ gfi->ascender = atoi(keyword);
+ break;
+ case STARTCHARMETRICS:
+ cont = FALSE;
+ break;
+ case ENDFONTMETRICS:
+ cont = FALSE;
+ error = normalEOF;
+ break;
+// ** GLE ** added cases STDHW and STDVW to be able to parse Adobe-Core35_AFMs-314 AFMs
+ case STDHW:
+ token(fp);
+ break;
+ case STDVW:
+ token(fp);
+ break;
+ case NOPE:
+ default:
+ error = parseError;
+ break;
+ } /* switch */
+ } /* while */
+
+ return(error);
+
+} /* parseGlobals */
+
+
+
+/************************* initializeArray ************************/
+
+/* Unmapped character codes are (at Adobe Systems) assigned the
+ * width of the space character (if one exists) else they get the
+ * value of 250 ems. This function initializes all entries in the
+ * char widths array to have this value. Then any mapped character
+ * codes will be replaced with the width of the appropriate character
+ * when parsing the character metric section.
+
+ * This function parses the Character Metrics Section looking
+ * for a space character (by comparing character names). If found,
+ * the width of the space character will be used to initialize the
+ * values in the array of character widths.
+ *
+ * Before returning, the position of the read/write pointer of the
+ * file is reset to be where it was upon entering this function.
+ */
+
+//static int initializeArray(fp, cwi)
+// FILE *fp;
+// register int *cwi;
+// ** GLE ** replaced above three lines by the following one
+int initializeArray(FILE *fp, int *cwi)
+{
+ BOOL cont = TRUE, found = FALSE;
+ long opos = ftell(fp);
+ int width = 0, i = 0, error = 0;
+ register char *keyword;
+
+ while (cont)
+ {
+ keyword = token(fp);
+ if (keyword == NULL)
+ {
+ error = earlyEOF;
+ break; /* get out of loop */
+ }
+ switch(recognize(keyword))
+ {
+ case COMMENT:
+ keyword = linetoken(fp);
+ break;
+ case CODE:
+ token(fp);
+ break;
+ case XWIDTH:
+ width = atoi(token(fp));
+ break;
+ case CHARNAME:
+ keyword = token(fp);
+ if (MATCH(keyword, Space))
+ {
+ cont = FALSE;
+ found = TRUE;
+ }
+ break;
+ case ENDCHARMETRICS:
+ cont = FALSE;
+ break;
+ case ENDFONTMETRICS:
+ cont = FALSE;
+ error = normalEOF;
+ break;
+ case NOPE:
+ default:
+ error = parseError;
+ break;
+ } /* switch */
+ } /* while */
+
+ if (!found)
+ width = 250;
+
+ for (i = 0; i < 256; ++i)
+ cwi[i] = width;
+
+ fseek(fp, opos, 0);
+
+ return(error);
+
+} /* initializeArray */
+
+
+/************************* parseCharWidths **************************/
+
+/* This function is called by "parseFile". It will parse the AFM File
+ * up to the "EndCharMetrics" keyword. It will save the character
+ * width info (as opposed to all of the character metric information)
+ * if requested by the caller of parseFile. Otherwise, it will just
+ * parse through the section without saving any information.
+ *
+ * If data is to be saved, parseCharWidths is passed in a pointer
+ * to an array of widths that has already been initialized by the
+ * standard value for unmapped character codes. This function parses
+ * the Character Metrics section only storing the width information
+ * for the encoded characters into the array using the character code
+ * as the index into that array.
+ *
+ * This function returns an error code specifying whether there was
+ * a premature EOF or a parsing error. This return value is used by
+ * parseFile to determine if there is more file to parse.
+ */
+
+//static parseCharWidths(fp, cwi)
+// FILE *fp;
+// register int *cwi;
+// ** GLE ** replaced above three lines by the following one
+static int parseCharWidths(FILE *fp, int *cwi)
+{
+ BOOL cont = TRUE, save = (cwi != NULL);
+ int pos = 0, error = ok;
+ register char *keyword;
+
+ while (cont)
+ {
+ keyword = token(fp);
+ /* Have reached an early and unexpected EOF. */
+ /* Set flag and stop parsing */
+ if (keyword == NULL)
+ {
+ error = earlyEOF;
+ break; /* get out of loop */
+ }
+ if (!save)
+ /* get tokens until the end of the Char Metrics section without */
+ /* saving any of the data*/
+ switch (recognize(keyword))
+ {
+ case ENDCHARMETRICS:
+ cont = FALSE;
+ break;
+ case ENDFONTMETRICS:
+ cont = FALSE;
+ error = normalEOF;
+ break;
+ default:
+ break;
+ } /* switch */
+ else
+ /* otherwise parse entire char metrics section, saving */
+ /* only the char x-width info */
+ switch(recognize(keyword))
+ {
+ case COMMENT:
+ keyword = linetoken(fp);
+ break;
+ case CODE:
+ keyword = token(fp);
+ pos = atoi(keyword);
+ break;
+ case XYWIDTH:
+ /* PROBLEM: Should be no Y-WIDTH when doing "quick & dirty" */
+ keyword = token(fp); keyword = token(fp); /* eat values */
+ error = parseError;
+ break;
+ case XWIDTH:
+ keyword = token(fp);
+ if (pos >= 0) /* ignore unmapped chars */
+ cwi[pos] = atoi(keyword);
+ break;
+ case ENDCHARMETRICS:
+ cont = FALSE;
+ break;
+ case ENDFONTMETRICS:
+ cont = FALSE;
+ error = normalEOF;
+ break;
+ case CHARNAME: /* eat values (so doesn't cause parseError) */
+ keyword = token(fp);
+ break;
+ case CHARBBOX:
+ keyword = token(fp); keyword = token(fp);
+ keyword = token(fp); keyword = token(fp);
+ break;
+ case LIGATURE:
+ keyword = token(fp); keyword = token(fp);
+ break;
+ case NOPE:
+ default:
+ error = parseError;
+ break;
+ } /* switch */
+ } /* while */
+
+ return(error);
+
+} /* parseCharWidths */
+
+
+/************************* parseCharMetrics ************************/
+
+/* This function is called by parseFile if the caller of parseFile
+ * requested that all character metric information be saved
+ * (as opposed to only the character width information).
+ *
+ * parseCharMetrics is passed in a pointer to an array of records
+ * to hold information on a per character basis. This function
+ * parses the Character Metrics section storing all character
+ * metric information for the ALL characters (mapped and unmapped)
+ * into the array.
+ *
+ * This function returns an error code specifying whether there was
+ * a premature EOF or a parsing error. This return value is used by
+ * parseFile to determine if there is more file to parse.
+ */
+
+//static parseCharMetrics(fp, fi)
+// FILE *fp;
+// register FontInfo *fi;
+// ** GLE ** replaced above three lines by the following one
+static int parseCharMetrics(FILE *fp, FontInfo *fi)
+{
+ BOOL cont = TRUE, firstTime = TRUE;
+ int error = ok, count = 0;
+ register CharMetricInfo *temp = fi->cmi;
+ register char *keyword;
+
+ while (cont)
+ {
+ keyword = token(fp);
+ if (keyword == NULL)
+ {
+ error = earlyEOF;
+ break; /* get out of loop */
+ }
+ switch(recognize(keyword))
+ {
+ case COMMENT:
+ keyword = linetoken(fp);
+ break;
+ case CODE:
+ if (count < fi->numOfChars)
+ {
+ if (firstTime) firstTime = FALSE;
+ else temp++;
+ temp->code = atoi(token(fp));
+ count++;
+ }
+ else
+ {
+ error = parseError;
+ cont = FALSE;
+ }
+ break;
+ case XYWIDTH:
+ temp->wx = atoi(token(fp));
+ temp->wy = atoi(token(fp));
+ break;
+ case XWIDTH:
+ temp->wx = atoi(token(fp));
+ break;
+ case CHARNAME:
+ keyword = token(fp);
+ temp->name = (char *) malloc(strlen(keyword) + 1);
+ strcpy(temp->name, keyword);
+ break;
+ case CHARBBOX:
+ temp->charBBox.llx = atoi(token(fp));
+ temp->charBBox.lly = atoi(token(fp));
+ temp->charBBox.urx = atoi(token(fp));
+ temp->charBBox.ury = atoi(token(fp));
+ break;
+ case LIGATURE: {
+ Ligature **tail = &(temp->ligs);
+ Ligature *node = *tail;
+
+ if (*tail != NULL)
+ {
+ while (node->next != NULL)
+ node = node->next;
+ tail = &(node->next);
+ }
+
+ *tail = (Ligature *) calloc(1, sizeof(Ligature));
+ keyword = token(fp);
+ (*tail)->succ = (char *) malloc(strlen(keyword) + 1);
+ strcpy((*tail)->succ, keyword);
+ keyword = token(fp);
+ (*tail)->lig = (char *) malloc(strlen(keyword) + 1);
+ strcpy((*tail)->lig, keyword);
+ break; }
+ case ENDCHARMETRICS:
+ cont = FALSE;;
+ break;
+ case ENDFONTMETRICS:
+ cont = FALSE;
+ error = normalEOF;
+ break;
+ case NOPE:
+ default:
+ error = parseError;
+ break;
+ } /* switch */
+ } /* while */
+
+ if ((error == ok) && (count != fi->numOfChars))
+ error = parseError;
+
+ return(error);
+
+} /* parseCharMetrics */
+
+
+
+/************************* parseTrackKernData ***********************/
+
+/* This function is called by "parseFile". It will parse the AFM File
+ * up to the "EndTrackKern" or "EndKernData" keywords. It will save the
+ * track kerning data if requested by the caller of parseFile.
+ *
+ * parseTrackKernData is passed in a pointer to the FontInfo record.
+ * If data is to be saved, the FontInfo record will already contain
+ * a valid pointer to storage for the track kerning data.
+ *
+ * This function returns an error code specifying whether there was
+ * a premature EOF or a parsing error. This return value is used by
+ * parseFile to determine if there is more file to parse.
+ */
+
+//static parseTrackKernData(fp, fi)
+// FILE *fp;
+// register FontInfo *fi;
+// ** GLE ** replaced above three lines by the following one
+static int parseTrackKernData(FILE *fp, FontInfo *fi)
+{
+ BOOL cont = TRUE, save = (fi->tkd != NULL);
+ int pos = 0, error = ok, tcount = 0;
+ register char *keyword;
+
+ while (cont)
+ {
+ keyword = token(fp);
+
+ if (keyword == NULL)
+ {
+ error = earlyEOF;
+ break; /* get out of loop */
+ }
+ if (!save)
+ /* get tokens until the end of the Track Kerning Data */
+ /* section without saving any of the data */
+ switch(recognize(keyword))
+ {
+ case ENDTRACKKERN:
+ case ENDKERNDATA:
+ cont = FALSE;
+ break;
+ case ENDFONTMETRICS:
+ cont = FALSE;
+ error = normalEOF;
+ break;
+ default:
+ break;
+ } /* switch */
+ else
+ /* otherwise parse entire Track Kerning Data section, */
+ /* saving the data */
+ switch(recognize(keyword))
+ {
+ case COMMENT:
+ keyword = linetoken(fp);
+ break;
+ case TRACKKERN:
+ if (tcount < fi->numOfTracks)
+ {
+ keyword = token(fp);
+ fi->tkd[pos].degree = atoi(keyword);
+ keyword = token(fp);
+ fi->tkd[pos].minPtSize = atof(keyword);
+ if (errno == ERANGE) error = parseError;
+ keyword = token(fp);
+ fi->tkd[pos].minKernAmt = atof(keyword);
+ if (errno == ERANGE) error = parseError;
+ keyword = token(fp);
+ fi->tkd[pos].maxPtSize = atof(keyword);
+ if (errno == ERANGE) error = parseError;
+ keyword = token(fp);
+ fi->tkd[pos++].maxKernAmt = atof(keyword);
+ if (errno == ERANGE) error = parseError;
+ tcount++;
+ }
+ else
+ {
+ error = parseError;
+ cont = FALSE;
+ }
+ break;
+ case ENDTRACKKERN:
+ case ENDKERNDATA:
+ cont = FALSE;
+ break;
+ case ENDFONTMETRICS:
+ cont = FALSE;
+ error = normalEOF;
+ break;
+ case NOPE:
+ default:
+ error = parseError;
+ break;
+ } /* switch */
+ } /* while */
+
+ if (error == ok && tcount != fi->numOfTracks)
+ error = parseError;
+
+ return(error);
+
+} /* parseTrackKernData */
+
+
+/************************* parsePairKernData ************************/
+
+/* This function is called by "parseFile". It will parse the AFM File
+ * up to the "EndKernPairs" or "EndKernData" keywords. It will save
+ * the pair kerning data if requested by the caller of parseFile.
+ *
+ * parsePairKernData is passed in a pointer to the FontInfo record.
+ * If data is to be saved, the FontInfo record will already contain
+ * a valid pointer to storage for the pair kerning data.
+ *
+ * This function returns an error code specifying whether there was
+ * a premature EOF or a parsing error. This return value is used by
+ * parseFile to determine if there is more file to parse.
+ */
+
+//static parsePairKernData(fp, fi)
+// FILE *fp;
+// register FontInfo *fi;
+// ** GLE ** replaced above three lines by the following one
+static int parsePairKernData(FILE* fp, FontInfo *fi)
+{
+ BOOL cont = TRUE, save = (fi->pkd != NULL);
+ int pos = 0, error = ok, pcount = 0;
+ register char *keyword;
+
+ while (cont)
+ {
+ keyword = token(fp);
+
+ if (keyword == NULL)
+ {
+ error = earlyEOF;
+ break; /* get out of loop */
+ }
+ if (!save)
+ /* get tokens until the end of the Pair Kerning Data */
+ /* section without saving any of the data */
+ switch(recognize(keyword))
+ {
+ case ENDKERNPAIRS:
+ case ENDKERNDATA:
+ cont = FALSE;
+ break;
+ case ENDFONTMETRICS:
+ cont = FALSE;
+ error = normalEOF;
+ break;
+ default:
+ break;
+ } /* switch */
+ else
+ /* otherwise parse entire Pair Kerning Data section, */
+ /* saving the data */
+ switch(recognize(keyword))
+ {
+ case COMMENT:
+ keyword = linetoken(fp);
+ break;
+ case KERNPAIR:
+ if (pcount < fi->numOfPairs)
+ {
+ keyword = token(fp);
+ fi->pkd[pos].name1 = (char *)
+ malloc(strlen(keyword) + 1);
+ strcpy(fi->pkd[pos].name1, keyword);
+ keyword = token(fp);
+ fi->pkd[pos].name2 = (char *)
+ malloc(strlen(keyword) + 1);
+ strcpy(fi->pkd[pos].name2, keyword);
+ keyword = token(fp);
+ fi->pkd[pos].xamt = atoi(keyword);
+ keyword = token(fp);
+ fi->pkd[pos++].yamt = atoi(keyword);
+ pcount++;
+ }
+ else
+ {
+ error = parseError;
+ cont = FALSE;
+ }
+ break;
+ case KERNPAIRXAMT:
+ if (pcount < fi->numOfPairs)
+ {
+ keyword = token(fp);
+ fi->pkd[pos].name1 = (char *)
+ malloc(strlen(keyword) + 1);
+ strcpy(fi->pkd[pos].name1, keyword);
+ keyword = token(fp);
+ fi->pkd[pos].name2 = (char *)
+ malloc(strlen(keyword) + 1);
+ strcpy(fi->pkd[pos].name2, keyword);
+ keyword = token(fp);
+ fi->pkd[pos++].xamt = atoi(keyword);
+ pcount++;
+ }
+ else
+ {
+ error = parseError;
+ cont = FALSE;
+ }
+ break;
+ case ENDKERNPAIRS:
+ case ENDKERNDATA:
+ cont = FALSE;
+ break;
+ case ENDFONTMETRICS:
+ cont = FALSE;
+ error = normalEOF;
+ break;
+ case NOPE:
+ default:
+ error = parseError;
+ break;
+ } /* switch */
+ } /* while */
+
+ if (error == ok && pcount != fi->numOfPairs)
+ error = parseError;
+
+ return(error);
+
+} /* parsePairKernData */
+
+
+/************************* parseCompCharData **************************/
+
+/* This function is called by "parseFile". It will parse the AFM File
+ * up to the "EndComposites" keyword. It will save the composite
+ * character data if requested by the caller of parseFile.
+ *
+ * parseCompCharData is passed in a pointer to the FontInfo record, and
+ * a boolean representing if the data should be saved.
+ *
+ * This function will create the appropriate amount of storage for
+ * the composite character data and store a pointer to the storage
+ * in the FontInfo record.
+ *
+ * This function returns an error code specifying whether there was
+ * a premature EOF or a parsing error. This return value is used by
+ * parseFile to determine if there is more file to parse.
+ */
+
+//static parseCompCharData(fp, fi)
+// FILE *fp;
+// register FontInfo *fi;
+// ** GLE ** replaced above three lines by the following one
+static int parseCompCharData(FILE *fp, FontInfo *fi)
+{
+ BOOL cont = TRUE, firstTime = TRUE, save = (fi->ccd != NULL);
+ int pos = 0, j = 0, error = ok, ccount = 0, pcount = 0;
+ register char *keyword;
+
+ while (cont)
+ {
+ keyword = token(fp);
+ if (keyword == NULL)
+ /* Have reached an early and unexpected EOF. */
+ /* Set flag and stop parsing */
+ {
+ error = earlyEOF;
+ break; /* get out of loop */
+ }
+ if (ccount > fi->numOfComps)
+ {
+ error = parseError;
+ break; /* get out of loop */
+ }
+ if (!save)
+ /* get tokens until the end of the Composite Character info */
+ /* section without saving any of the data */
+ switch(recognize(keyword))
+ {
+ case ENDCOMPOSITES:
+ cont = FALSE;
+ break;
+ case ENDFONTMETRICS:
+ cont = FALSE;
+ error = normalEOF;
+ break;
+ default:
+ break;
+ } /* switch */
+ else
+ /* otherwise parse entire Composite Character info section, */
+ /* saving the data */
+ switch(recognize(keyword))
+ {
+ case COMMENT:
+ keyword = linetoken(fp);
+ break;
+ case COMPCHAR:
+ if (ccount < fi->numOfComps)
+ {
+ keyword = token(fp);
+ if (pcount != fi->ccd[pos].numOfPieces)
+ error = parseError;
+ pcount = 0;
+ if (firstTime) firstTime = FALSE;
+ else pos++;
+ fi->ccd[pos].ccName = (char *)
+ malloc(strlen(keyword) + 1);
+ strcpy(fi->ccd[pos].ccName, keyword);
+ keyword = token(fp);
+ fi->ccd[pos].numOfPieces = atoi(keyword);
+ fi->ccd[pos].pieces = (Pcc *)
+ calloc(fi->ccd[pos].numOfPieces, sizeof(Pcc));
+ j = 0;
+ ccount++;
+ }
+ else
+ {
+ error = parseError;
+ cont = FALSE;
+ }
+ break;
+ case COMPCHARPIECE:
+ if (pcount < fi->ccd[pos].numOfPieces)
+ {
+ keyword = token(fp);
+ fi->ccd[pos].pieces[j].pccName = (char *)
+ malloc(strlen(keyword) + 1);
+ strcpy(fi->ccd[pos].pieces[j].pccName, keyword);
+ keyword = token(fp);
+ fi->ccd[pos].pieces[j].deltax = atoi(keyword);
+ keyword = token(fp);
+ fi->ccd[pos].pieces[j++].deltay = atoi(keyword);
+ pcount++;
+ }
+ else
+ error = parseError;
+ break;
+ case ENDCOMPOSITES:
+ cont = FALSE;
+ break;
+ case ENDFONTMETRICS:
+ cont = FALSE;
+ error = normalEOF;
+ break;
+ case NOPE:
+ default:
+ error = parseError;
+ break;
+ } /* switch */
+ } /* while */
+
+ if (error == ok && ccount != fi->numOfComps)
+ error = parseError;
+
+ return(error);
+
+} /* parseCompCharData */
+
+
+
+
+/*************************** 'PUBLIC' FUNCTION ********************/
+
+
+/*************************** parseFile *****************************/
+
+/* parseFile is the only 'public' procedure available. It is called
+ * from an application wishing to get information from an AFM file.
+ * The caller of this function is responsible for locating and opening
+ * an AFM file and handling all errors associated with that task.
+ *
+ * parseFile expects 3 parameters: a vaild file pointer, a pointer
+ * to a (FontInfo *) variable (for which storage will be allocated and
+ * the data requested filled in), and a mask specifying which
+ * data from the AFM File should be saved in the FontInfo structure.
+ *
+ * The file will be parsed and the requested data will be stored in
+ * a record of type FontInfo (refer to ParseAFM.h).
+ *
+ * parseFile returns an error code as defined in parseAFM.h.
+ *
+ * The position of the read/write pointer associated with the file
+ * pointer upon return of this function is undefined.
+ */
+
+//extern int parseFile (fp, fi, flags)
+// FILE *fp;
+// FontInfo **fi;
+// FLAGS flags;
+// ** GLE ** replaced above four lines by the following one
+extern int parseFile (FILE *fp, FontInfo **fi, FLAGS flags)
+{
+
+ int code = ok; /* return code from each of the parsing routines */
+ int error = ok; /* used as the return code from this function */
+
+ register char *keyword; /* used to store a token */
+
+
+ /* storage data for the global variable ident */
+ ident = (char *) calloc(MAX_NAME, sizeof(char));
+ if (ident == NULL) {error = storageProblem; return(error);}
+
+ (*fi) = (FontInfo *) calloc(1, sizeof(FontInfo));
+ if ((*fi) == NULL) {error = storageProblem; return(error);}
+
+ if (flags & P_G)
+ {
+ (*fi)->gfi = (GlobalFontInfo *) calloc(1, sizeof(GlobalFontInfo));
+ if ((*fi)->gfi == NULL) {error = storageProblem; return(error);}
+ }
+
+ /* The AFM File begins with Global Font Information. This section */
+ /* will be parsed whether or not information should be saved. */
+ code = parseGlobals(fp, (*fi)->gfi);
+
+ if (code < 0) error = code;
+
+ /* The Global Font Information is followed by the Character Metrics */
+ /* section. Which procedure is used to parse this section depends on */
+ /* how much information should be saved. If all of the metrics info */
+ /* is wanted, parseCharMetrics is called. If only the character widths */
+ /* is wanted, parseCharWidths is called. parseCharWidths will also */
+ /* be called in the case that no character data is to be saved, just */
+ /* to parse through the section. */
+
+ if ((code != normalEOF) && (code != earlyEOF))
+ {
+ (*fi)->numOfChars = atoi(token(fp));
+ if (flags & (P_M ^ P_W))
+ {
+ (*fi)->cmi = (CharMetricInfo *)
+ calloc((*fi)->numOfChars, sizeof(CharMetricInfo));
+ if ((*fi)->cmi == NULL) {error = storageProblem; return(error);}
+ code = parseCharMetrics(fp, *fi);
+ }
+ else
+ {
+ if (flags & P_W)
+ {
+ (*fi)->cwi = (int *) calloc(256, sizeof(int));
+ if ((*fi)->cwi == NULL)
+ {
+ error = storageProblem;
+ return(error);
+ }
+ }
+ /* parse section regardless */
+ code = parseCharWidths(fp, (*fi)->cwi);
+ } /* else */
+ } /* if */
+
+ if ((error != earlyEOF) && (code < 0)) error = code;
+
+ /* The remaining sections of the AFM are optional. This code will */
+ /* look at the next keyword in the file to determine what section */
+ /* is next, and then allocate the appropriate amount of storage */
+ /* for the data (if the data is to be saved) and call the */
+ /* appropriate parsing routine to parse the section. */
+
+ while ((code != normalEOF) && (code != earlyEOF))
+ {
+ keyword = token(fp);
+ if (keyword == NULL)
+ /* Have reached an early and unexpected EOF. */
+ /* Set flag and stop parsing */
+ {
+ code = earlyEOF;
+ break; /* get out of loop */
+ }
+ switch(recognize(keyword))
+ {
+ case STARTKERNDATA:
+ break;
+ case ENDKERNDATA:
+ break;
+ case STARTTRACKKERN:
+ keyword = token(fp);
+ if (flags & P_T)
+ {
+ (*fi)->numOfTracks = atoi(keyword);
+ (*fi)->tkd = (TrackKernData *)
+ calloc((*fi)->numOfTracks, sizeof(TrackKernData));
+ if ((*fi)->tkd == NULL)
+ {
+ error = storageProblem;
+ return(error);
+ }
+ } /* if */
+ code = parseTrackKernData(fp, *fi);
+ break;
+ case STARTKERNPAIRS:
+ keyword = token(fp);
+ if (flags & P_P)
+ {
+ (*fi)->numOfPairs = atoi(keyword);
+ (*fi)->pkd = (PairKernData *)
+ calloc((*fi)->numOfPairs, sizeof(PairKernData));
+ if ((*fi)->pkd == NULL)
+ {
+ error = storageProblem;
+ return(error);
+ }
+ } /* if */
+ code = parsePairKernData(fp, *fi);
+ break;
+ case STARTCOMPOSITES:
+ keyword = token(fp);
+ if (flags & P_C)
+ {
+ (*fi)->numOfComps = atoi(keyword);
+ (*fi)->ccd = (CompCharData *)
+ calloc((*fi)->numOfComps, sizeof(CompCharData));
+ if ((*fi)->ccd == NULL)
+ {
+ error = storageProblem;
+ return(error);
+ }
+ } /* if */
+ code = parseCompCharData(fp, *fi);
+ break;
+ case ENDFONTMETRICS:
+ code = normalEOF;
+ break;
+ case NOPE:
+ default:
+ code = parseError;
+ break;
+ } /* switch */
+
+ if ((error != earlyEOF) && (code < 0)) error = code;
+
+ } /* while */
+
+ if ((error != earlyEOF) && (code < 0)) error = code;
+
+ if (ident != NULL) { free(ident); ident = NULL; }
+
+ return(error);
+
+} /* parseFile */
diff --git a/src/makefmt/parseAFM.h b/src/makefmt/parseAFM.h
new file mode 100644
index 0000000..af39fcb
--- /dev/null
+++ b/src/makefmt/parseAFM.h
@@ -0,0 +1,328 @@
+/*
+ * (C) 1988, 1989 by Adobe Systems Incorporated. All rights reserved.
+ *
+ * This file may be freely copied and redistributed as long as:
+ * 1) This entire notice continues to be included in the file,
+ * 2) If the file has been modified in any way, a notice of such
+ * modification is conspicuously indicated.
+ *
+ * PostScript, Display PostScript, and Adobe are registered trademarks of
+ * Adobe Systems Incorporated.
+ *
+ * ************************************************************************
+ * THE INFORMATION BELOW IS FURNISHED AS IS, IS SUBJECT TO CHANGE WITHOUT
+ * NOTICE, AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY ADOBE SYSTEMS
+ * INCORPORATED. ADOBE SYSTEMS INCORPORATED ASSUMES NO RESPONSIBILITY OR
+ * LIABILITY FOR ANY ERRORS OR INACCURACIES, MAKES NO WARRANTY OF ANY
+ * KIND (EXPRESS, IMPLIED OR STATUTORY) WITH RESPECT TO THIS INFORMATION,
+ * AND EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR PARTICULAR PURPOSES AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
+ * ************************************************************************
+ */
+
+/*
+ * Changes made by GLE developers are indicated with "** GLE **"
+ * These changes are required to make parseAFM compile as "C++" code (the original code is "C")
+ */
+
+/* ParseAFM.h
+ *
+ * This header file is used in conjuction with the parseAFM.c file.
+ * Together these files provide the functionality to parse Adobe Font
+ * Metrics files and store the information in predefined data structures.
+ * It is intended to work with an application program that needs font metric
+ * information. The program can be used as is by making a procedure call to
+ * parse an AFM file and have the data stored, or an application developer
+ * may wish to customize the code.
+ *
+ * This header file defines the data structures used as well as the key
+ * strings that are currently recognized by this version of the AFM parser.
+ * This program is based on the document "Adobe Font Metrics Files,
+ * Specification Version 2.0".
+ *
+ * AFM files are separated into distinct sections of different data. Because
+ * of this, the parseAFM program can parse a specified file to only save
+ * certain sections of information based on the application's needs. A record
+ * containing the requested information will be returned to the application.
+ *
+ * AFM files are divided into five sections of data:
+ * 1) The Global Font Information
+ * 2) The Character Metrics Information
+ * 3) The Track Kerning Data
+ * 4) The Pair-Wise Kerning Data
+ * 5) The Composite Character Data
+ *
+ * Basically, the application can request any of these sections independent
+ * of what other sections are requested. In addition, in recognizing that
+ * many applications will want ONLY the x-width of characters and not all
+ * of the other character metrics information, there is a way to receive
+ * only the width information so as not to pay the storage cost for the
+ * unwanted data. An application should never request both the
+ * "quick and dirty" char metrics (widths only) and the Character Metrics
+ * Information since the Character Metrics Information will contain all
+ * of the character widths as well.
+ *
+ * There is a procedure in parseAFM.c, called parseFile, that can be
+ * called from any application wishing to get information from the AFM File.
+ * This procedure expects 3 parameters: a vaild file descriptor, a pointer
+ * to a (FontInfo *) variable (for which space will be allocated and then
+ * will be filled in with the data requested), and a mask specifying
+ * which data from the AFM File should be saved in the FontInfo structure.
+ *
+ * The flags that can be used to set the appropriate mask are defined below.
+ * In addition, several commonly used masks have already been defined.
+ *
+ * History:
+ * original: DSM Thu Oct 20 17:39:59 PDT 1988
+ * modified: DSM Mon Jul 3 14:17:50 PDT 1989
+ * - added 'storageProblem' return code
+ * - fixed typos
+ */
+
+#include <stdio.h>
+
+
+
+/* your basic constants */
+#define TRUE 1
+#define FALSE 0
+#define EOL '\n' /* end-of-line indicator */
+#define MAX_NAME 4096 /* max length for identifiers */
+#define BOOL int
+#define FLAGS int
+
+
+
+/* Flags that can be AND'ed together to specify exactly what
+ * information from the AFM file should be saved.
+ */
+#define P_G 0x01 /* 0000 0001 */ /* Global Font Info */
+#define P_W 0x02 /* 0000 0010 */ /* Character Widths ONLY */
+#define P_M 0x06 /* 0000 0110 */ /* All Char Metric Info */
+#define P_P 0x08 /* 0000 1000 */ /* Pair Kerning Info */
+#define P_T 0x10 /* 0001 0000 */ /* Track Kerning Info */
+#define P_C 0x20 /* 0010 0000 */ /* Composite Char Info */
+
+
+/* Commonly used flags
+ */
+#define P_GW (P_G | P_W)
+#define P_GM (P_G | P_M)
+#define P_GMP (P_G | P_M | P_P)
+#define P_GMK (P_G | P_M | P_P | P_T)
+#define P_ALL (P_G | P_M | P_P | P_T | P_C)
+
+
+
+/* Possible return codes from the parseFile procedure.
+ *
+ * ok means there were no problems parsing the file.
+ *
+ * parseError means that there was some kind of parsing error, but the
+ * parser went on. This could include problems like the count for any given
+ * section does not add up to how many entries there actually were, or
+ * there was a key that was not recognized. The return record may contain
+ * vaild data or it may not.
+ *
+ * earlyEOF means that an End of File was encountered before expected. This
+ * may mean that the AFM file had been truncated, or improperly formed.
+ *
+ * storageProblem means that there were problems allocating storage for
+ * the data structures that would have contained the AFM data.
+ */
+#define ok 0
+#define parseError -1
+#define earlyEOF -2
+#define storageProblem -3
+
+
+
+/************************* TYPES *********************************/
+/* Below are all of the data structure definitions. These structures
+ * try to map as closely as possible to grouping and naming of data
+ * in the AFM Files.
+ */
+
+
+/* Bounding box definition. Used for the Font BBox as well as the
+ * Character BBox.
+ */
+typedef struct
+{
+ int llx; /* lower left x-position */
+ int lly; /* lower left y-position */
+ int urx; /* upper right x-position */
+ int ury; /* upper right y-position */
+} BBox;
+
+
+/* Global Font information.
+ * The key that each field is associated with is in comments. For an
+ * explanation about each key and its value please refer to the AFM
+ * documentation (full title & version given above).
+ */
+typedef struct
+{
+ char *afmVersion; /* key: StartFontMetrics */
+ char *fontName; /* key: FontName */
+ char *fullName; /* key: FullName */
+ char *familyName; /* key: FamilyName */
+ char *weight; /* key: Weight */
+ float italicAngle; /* key: ItalicAngle */
+ BOOL isFixedPitch; /* key: IsFixedPitch */
+ BBox fontBBox; /* key: FontBBox */
+ int underlinePosition; /* key: UnderlinePosition */
+ int underlineThickness; /* key: UnderlineThickness */
+ char *version; /* key: Version */
+ char *notice; /* key: Notice */
+ char *encodingScheme; /* key: EncodingScheme */
+ int capHeight; /* key: CapHeight */
+ int xHeight; /* key: XHeight */
+ int ascender; /* key: Ascender */
+ int descender; /* key: Descender */
+} GlobalFontInfo;
+
+
+/* Ligature definition is a linked list since any character can have
+ * any number of ligatures.
+ */
+typedef struct _t_ligature
+{
+ char *succ, *lig;
+ struct _t_ligature *next;
+} Ligature;
+
+
+/* Character Metric Information. This structure is used only if ALL
+ * character metric information is requested. If only the character
+ * widths is requested, then only an array of the character x-widths
+ * is returned.
+ *
+ * The key that each field is associated with is in comments. For an
+ * explanation about each key and its value please refer to the
+ * Character Metrics section of the AFM documentation (full title
+ * & version given above).
+ */
+typedef struct
+{
+ int code, /* key: C */
+ wx, /* key: WX */
+ wy; /* together wx and wy are associated with key: W */
+ char *name; /* key: N */
+ BBox charBBox; /* key: B */
+ Ligature *ligs; /* key: L (linked list; not a fixed number of Ls */
+} CharMetricInfo;
+
+
+/* Track kerning data structure.
+ * The fields of this record are the five values associated with every
+ * TrackKern entry.
+ *
+ * For an explanation about each value please refer to the
+ * Track Kerning section of the AFM documentation (full title
+ * & version given above).
+ */
+typedef struct
+{
+ int degree;
+ float minPtSize,
+ minKernAmt,
+ maxPtSize,
+ maxKernAmt;
+} TrackKernData;
+
+
+/* Pair Kerning data structure.
+ * The fields of this record are the four values associated with every
+ * KP entry. For KPX entries, the yamt will be zero.
+ *
+ * For an explanation about each value please refer to the
+ * Pair Kerning section of the AFM documentation (full title
+ * & version given above).
+ */
+typedef struct
+{
+ char *name1;
+ char *name2;
+ int xamt,
+ yamt;
+} PairKernData;
+
+
+/* PCC is a piece of a composite character. This is a sub structure of a
+ * compCharData described below.
+ * These fields will be filled in with the values from the key PCC.
+ *
+ * For an explanation about each key and its value please refer to the
+ * Composite Character section of the AFM documentation (full title
+ * & version given above).
+ */
+typedef struct
+{
+ char *pccName;
+ int deltax,
+ deltay;
+} Pcc;
+
+
+/* Composite Character Information data structure.
+ * The fields ccName and numOfPieces are filled with the values associated
+ * with the key CC. The field pieces points to an array (size = numOfPieces)
+ * of information about each of the parts of the composite character. That
+ * array is filled in with the values from the key PCC.
+ *
+ * For an explanation about each key and its value please refer to the
+ * Composite Character section of the AFM documentation (full title
+ * & version given above).
+ */
+typedef struct
+{
+ char *ccName;
+ int numOfPieces;
+ Pcc *pieces;
+} CompCharData;
+
+
+/* FontInfo
+ * Record type containing pointers to all of the other data
+ * structures containing information about a font.
+ * A a record of this type is filled with data by the
+ * parseFile function.
+ */
+typedef struct
+{
+ GlobalFontInfo *gfi; /* ptr to a GlobalFontInfo record */
+ int *cwi; /* ptr to 256 element array of just char widths */
+ int numOfChars; /* number of entries in char metrics array */
+ CharMetricInfo *cmi; /* ptr to char metrics array */
+ int numOfTracks; /* number to entries in track kerning array */
+ TrackKernData *tkd; /* ptr to track kerning array */
+ int numOfPairs; /* number to entries in pair kerning array */
+ PairKernData *pkd; /* ptr to pair kerning array */
+ int numOfComps; /* number to entries in comp char array */
+ CompCharData *ccd; /* ptr to comp char array */
+} FontInfo;
+
+
+
+/************************* PROCEDURES ****************************/
+
+/* Call this procedure to do the grunt work of parsing an AFM file.
+ *
+ * "fp" should be a valid file pointer to an AFM file.
+ *
+ * "fi" is a pointer to a pointer to a FontInfo record sturcture
+ * (defined above). Storage for the FontInfo structure will be
+ * allocated in parseFile and the structure will be filled in
+ * with the requested data from the AFM File.
+ *
+ * "flags" is a mask with bits set representing what data should
+ * be saved. Defined above are valid flags that can be used to set
+ * the mask, as well as a few commonly used masks.
+ *
+ * The possible return codes from parseFile are defined above.
+ */
+
+// extern int parseFile ( /* FILE *fp; FontInfo **fi; FLAGS flags; */ );
+// ** GLE ** replaced previous line by the following one
+extern int parseFile (FILE *fp, FontInfo **fi, FLAGS flags);
diff --git a/src/manip/Makefile.dj b/src/manip/Makefile.dj
new file mode 100644
index 0000000..122f884
--- /dev/null
+++ b/src/manip/Makefile.dj
@@ -0,0 +1,75 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+# manip Makefile for MS-DOS and DJGPP by Axel Rohde
+include ../../config.i
+
+# object files
+OBJS = cell.o cmd.o eval.o filemenu.o \
+ fn.o general.o keyword.o \
+ manip.o polish.o sub.o token.o \
+ var.o turbo.o turboscr.o inkey.o
+
+# varargs.o
+
+# mjl.o
+
+HEADS = all.h color.h edt.h eval.h keyword.h mygraph.h vaxconio.h
+
+# rules to build manip
+manip: $(OBJS) $(HEADS)
+ $(CC) -o manip $(CFLAGS) $(OBJS) $(LIBS)
+
+manip.o: manip.c $(HEADS)
+ $(CC) -c -DGLEPATH=\"$(GLE_PATH)/\" $(CFLAGS) manip.c
+
+$(OBJS): $(HEADS)
+
+# On DEC 5400 GCC wouldn't create working varargs so CC is used.
+varargs.o: varargs.c
+ gcc -g -c varargs.c
+
+
+turbo.o: ../../turbo.c ../../all.h
+ $(CC) -c -DMANIP $(CFLAGS) ../../turbo.c -o turbo.o
+
+turboscr.o: ../../turboscr.c ../../all.h
+ $(CC) -c -DMANIP $(CFLAGS) ../../turboscr.c -o turboscr.o
+
+inkey.o: ../../inkey.c ../../all.h
+ $(CC) -c -DMANIP $(CFLAGS) ../../inkey.c -o inkey.o
diff --git a/src/manip/Makefile.gcc b/src/manip/Makefile.gcc
new file mode 100644
index 0000000..6ea25e2
--- /dev/null
+++ b/src/manip/Makefile.gcc
@@ -0,0 +1,59 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+#
+# makefile.vc for makefmt
+# for compilation with MS vc++ .net
+#
+#
+include ../../config.gcc
+#
+include files.txt
+
+all: $(OBJECTS) $(PROJECT_BINDIR)/bin/$(PROGRAM)$(EXE_SUFF) $(PROJECT_BINDIR)/manip.hlp
+
+$(OBJECTS): $(INCLUDES)
+
+$(PROJECT_BINDIR)/bin/$(PROGRAM)$(EXE_SUFF): $(OBJECTS) $(EXTRA_OBJS) $(INCLUDES)
+ $(CXX) $(CXXFLAGS) $(OBJECTS) $(EXTRA_OBJS) -o $(PROJECT_BINDIR)/bin/$(PROGRAM)$(EXE_SUFF) -lncurses -lm
+
+$(PROJECT_BINDIR)/manip.hlp: manip.hlp
+ cp -p manip.hlp $(PROJECT_BINDIR)/manip.hlp
+
+clean:
+ -$(RM) $(OBJECTS) $(PROJECT_BINDIR)/bin/$(PROGRAM)$(EXE_SUFF)
diff --git a/src/manip/Makefile.in b/src/manip/Makefile.in
new file mode 100644
index 0000000..6ed4e2c
--- /dev/null
+++ b/src/manip/Makefile.in
@@ -0,0 +1,76 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+#
+# makefile.vc for makefmt
+# for compilation with MS vc++ .net
+#
+
+include ../../config.i
+include ../../config.aconf
+
+include files.txt
+
+CXX=@CXX@
+CPPFLAGS=@CPPFLAGS@
+MANIP_LIBS=@MANIP_LIBS@
+MANIP_LDFLAGS=@MANIP_LDFLAGS@
+
+CPPFLAGS := $(strip $(CPPFLAGS))
+
+ifeq (@HAVE_LIBGLE_CPPFLAGS@,1)
+ EXTRA_OBJS := ../gle/cutils.static.$(OBJ_SUFF) ../gle/file_io.static.$(OBJ_SUFF)
+endif
+
+ifeq (@MAKE_MANIP@,1)
+ TOBUILD := $(OBJECTS) $(PROJECT_BINDIR)/bin/$(PROGRAM)$(EXE_SUFF) $(PROJECT_BINDIR)/manip.hlp
+endif
+
+all: $(TOBUILD)
+
+$(OBJECTS): %.o: %.cpp $(INCLUDES)
+ $(CXX) $(CPPFLAGS) -c $< -o $@
+
+$(PROJECT_BINDIR)/bin/$(PROGRAM)$(EXE_SUFF): $(OBJECTS) $(EXTRA_OBJS) $(INCLUDES)
+ $(CXX) $(CPPFLAGS) $(MANIP_LDFLAGS) $(OBJECTS) $(EXTRA_OBJS) -o $(PROJECT_BINDIR)/bin/$(PROGRAM)$(EXE_SUFF) $(MANIP_LIBS)
+
+$(PROJECT_BINDIR)/manip.hlp: manip.hlp
+ cp -p manip.hlp $(PROJECT_BINDIR)/manip.hlp
+
+clean:
+ -$(RM) $(OBJECTS) $(PROJECT_BINDIR)/bin/$(PROGRAM)$(EXE_SUFF)
diff --git a/src/manip/Makefile.os2 b/src/manip/Makefile.os2
new file mode 100644
index 0000000..11f4bf5
--- /dev/null
+++ b/src/manip/Makefile.os2
@@ -0,0 +1,60 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+#
+# makefile.vc for makefmt
+# for compilation with MS vc++ .net
+#
+#
+include ../../config.i
+include ../../config.os2
+#
+include files.txt
+
+all: $(OBJECTS) $(PROJECT_BINDIR)/bin/$(PROGRAM)$(EXE_SUFF) $(PROJECT_BINDIR)/manip.hlp
+
+$(OBJECTS): $(INCLUDES)
+
+$(PROJECT_BINDIR)/bin/$(PROGRAM)$(EXE_SUFF): $(OBJECTS) $(EXTRA_OBJS) $(INCLUDES)
+ $(CC) $(LINK_OPTS) -o $(PROJECT_BINDIR)/bin/manip.exe $(OBJECTS) $(EXTRA_OBJS) -lncurses -lm $(EXTRA_LIBS)
+
+$(PROJECT_BINDIR)/manip.hlp: manip.hlp
+ cp manip.hlp $(PROJECT_BINDIR)/manip.hlp
+
+clean:
+ -$(RM) $(OBJECTS) $(PROJECT_BINDIR)/bin/$(PROGRAM)$(EXE_SUFF)
diff --git a/src/manip/all.h b/src/manip/all.h
new file mode 100644
index 0000000..23e53bf
--- /dev/null
+++ b/src/manip/all.h
@@ -0,0 +1,218 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+ #include "../config.h"
+#else
+ #include "../config_noauto.h"
+#endif
+
+#ifdef INT32
+typedef int int32;
+typedef unsigned int uint32;
+#else
+typedef long int32;
+typedef unsigned long uint32;
+#endif
+
+#include <stdio.h>
+#if HAVE_SYS_TYPES_H
+ #include <sys/types.h>
+#endif
+#if HAVE_SYS_STAT_H
+ #include <sys/stat.h>
+#endif
+#if STDC_HEADERS
+ #include <stdlib.h>
+ #include <stddef.h>
+#else
+ #if HAVE_STDLIB_H
+ #include <stdlib.h>
+ #endif
+#endif
+#if HAVE_STRING_H
+ #if !STDC_HEADERS && HAVE_MEMORY_H
+ #include <memory.h>
+ #endif
+ #include <string.h>
+#endif
+#if HAVE_STRINGS_H
+ #include <strings.h>
+#endif
+#if HAVE_UNISTD_H
+ #include <unistd.h>
+#endif
+
+#include <ctype.h>
+#include <math.h>
+#include <sys/wait.h>
+
+#ifdef __UNIX__
+ #include <stdarg.h>
+#endif
+
+#if defined(__OS2__) && defined(__EMX__)
+ #include <stdarg.h>
+ #undef wprintf
+ #define wprintf printf
+#endif
+
+struct s_range {int col,row,c1,r1,c2,r2,colfirst; };
+typedef struct s_range RANGE;
+
+#include <string>
+#include <string>
+#include <vector>
+#include <fstream>
+
+using namespace std;
+
+#ifdef HAVE_NCURSES_H
+ #include <ncurses.h>
+#endif
+#ifdef HAVE_CURSES_H
+ #include <curses.h>
+#endif
+
+#include "manip.h"
+#include "cell.h"
+#include "cmd.h"
+#include "filemenu.h"
+#include "mjl.h"
+#include "eval.h"
+#include "mscreen.h"
+#include "../gle/cutils.h"
+
+/*
+#if defined(__OS2__) && defined(__EMX__)
+#define delline v_delline
+#define clreol v_clreol
+#define putch v_putc
+#define cputs v_puts
+#endif
+*/
+
+#define far
+#define farcalloc calloc
+#define DASHCHAR '.'
+
+#define gprint printf
+#define myfree free
+
+struct GLEMemoryCell;
+
+char *range_int(char *s, int *v);
+void find_mkey(char *cp, int *idx);
+extern int gle_debug;
+typedef char (*(*TOKENS)[500]);
+typedef unsigned char uchar;
+typedef double dbl;
+char *unquote(char *s);
+string gledir(const char *s);
+int set_missing(int x, int y);
+double vcell(int x, int y);
+void var_find_rc(int *idx, int *var, int *nd, int c);
+void var_getstr(int v, char *s);
+int alloc_temp(int n);
+void gle_abort(const char *s);
+void d_tidyup(void);
+int text_inkey(void);
+void ncpy(char *d, const char *s, int n);
+void token_space(void);
+char *sdup(const char *s);
+/* void myfree(void *p); */
+void myfrees(void *p, char *s);
+void *myallocn(int32 nitems,int32 size);
+void *myalloc(int32 size);
+void *myallocz(int32 size);
+int showpcode(int32 *p);
+void add_fn(char *pcode, int *plen, int i);
+void add_i(char *pcode,int *plen,int32 i);
+void add_f(char *pcode,int *plen,double f);
+void add_pcode(char *pcode,int *plen,char *fcode,int *flen);
+void add_string(char *pcode, int *plen, char *s);
+void add_strvar(char *pcode,int *plen,int i);
+void add_var(char *pcode,int *plen,int i);
+char *eval_str(int32 *pcode,int *plen);
+char *find_non_space(char *cp);
+char *find_term(char *cp);
+char *un_quote(char *ct);
+void find_un(char *cp, int *idx,int *ret,int *np,int **plist);
+bool gle_isnumber(char *s);
+char manip_lastchar(const char *s, char c);
+void mystrcpy(char **d, const char *s);
+void polish(char *expr,char *pcode,int *plen,int *rtype);
+int scheck(int v);
+int spop(int v);
+int spush(int v);
+void stack_op(char *pcode, int *plen, int stk[] ,int stkp[], int *nstk, int i, int p);
+void token(char *lin,char *tok[],int *ntok,char *outbuff);
+void var_add(const char *name, int *idx, int *type); /* Add a variable to the list */
+void var_find(const char *name, int *idx, int *type); /* Find a variable in the list */
+void var_findadd(const char *name, int *idx, int *type); /* Add a variable to the list */
+void var_get(int jj, double *v);
+void var_nlocal(int *l);
+void var_set(int jj, double v);
+void var_set(int jj, GLEMemoryCell* value);
+void var_setstr(int jj, char *s);
+void xy_polar(double dx,double dy,double *radius,double *angle);
+
+void sub_clear(void);
+int sub_def(char *s);
+void sub_call(int idx,double *pval,char **pstr,int *npm);
+int sub_find(char *s,int *idx,int *zret, int *np, int **plist);
+void sub_get_startend(int idx, int *ss, int *ee);
+void sub_param(int idx,char *s);
+void sub_set_return(double d);
+void sub_set_startend(int idx, int ss, int ee);
+
+void show_cell(int x, int y);
+void show_ifcell(int x, int y);
+char *scell(int x, int y);
+void fner_clear(void);
+void show_cellwide(int x, int y);
+int read_command(int *cmd,char *ans,const char *ques);
+void do_arrow(int k);
+void hi_cell(int x,int y);
+void fix_cur(void);
+void gotocell(int x, int y);
+int read_str(int *cmd, char *s);
+int32 coreleft(void);
+void manip_refresh();
+const char *function_bar();
+void scr_refresh();
diff --git a/src/manip/cell.cpp b/src/manip/cell.cpp
new file mode 100644
index 0000000..7f38b65
--- /dev/null
+++ b/src/manip/cell.cpp
@@ -0,0 +1,357 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#include "all.h"
+#include "edt.h"
+
+#define far
+#define huge
+#define farcalloc calloc
+#define DASHCHAR '.'
+#include "vaxconio.h"
+
+extern int changed;
+extern int data_x;
+extern int data_y;
+extern int max_x,max_y;
+int usefloat;
+
+#ifdef __TURBOC__
+double MISS=1.7e300;
+#else
+double MISS=1e10;
+#endif
+char huge **d_strings;
+double huge *d_numbers;
+float huge *f_numbers;
+#define cellindex(x,y) (((x)-1)+((y)-1)* ((int32) data_x))
+#define oldindex(x,y) (((x)-1)+((y)-1)* ((int32) odx))
+extern char strmiss[];
+
+void set_usefloat() {
+ usefloat = true;
+#ifdef __TURBOC__
+ MISS = 3e38;
+#else
+ MISS = 3.3e10;
+#endif
+}
+
+void data_expand(int x, int y) {
+ int datx,daty,mx,my;
+ /*fner("Expand %d %d, max %d %d, data %d %d ",x,y,max_x,max_y
+ ,data_x,data_y); scr_getch();*/
+ mx = max_x; my = max_y;
+ datx = data_x; daty = data_y;
+ if (x>mx) mx = x;
+ if (y>my) my = y;
+ if (mx>my) {
+ datx = mx * 2;
+ daty = my;
+ } else {
+ datx = mx;
+ daty = my * 2;
+ }
+ xdata_setsize(datx,daty,mx,my);
+}
+
+void clear_data() {
+ int32 i,j,k;
+ if (usefloat) {
+ if (f_numbers!=NULL) free(f_numbers);
+ f_numbers = NULL;
+ } else {
+ for (i=1;i<=max_x;i++) for (j=1;j<=max_y;j++) {
+ k = cellindex(i,j);
+ if (d_strings[k]!=NULL) free(d_strings[k]);
+ }
+ if (d_numbers!=NULL) free(d_numbers);
+ if (d_strings!=NULL) free(d_strings);
+ d_numbers = NULL; d_strings = NULL;
+ }
+ max_x = 0;
+ max_y = 0;
+ data_x = 0;
+ data_y = 0;
+ manip_refresh();
+}
+
+void set_size(int x, int y) {
+ int32 i,j,k;
+ for (i=1;i<=max_x;i++) for (j=1;j<=max_y;j++) {
+ if (i>x || j>y) {
+ k = cellindex(i,j);
+ if (usefloat) f_numbers[k] = MISS;
+ else {
+ d_numbers[k] = MISS;
+ if (d_strings[k]!=NULL) {free(d_strings[k]); d_strings[k]=NULL;}
+ }
+ }
+ }
+ data_setsize(x,y);
+ max_x = x;
+ max_y = y;
+ manip_refresh();
+}
+
+void data_setsize(int x, int y) {
+ xdata_setsize(x,y,max_x,max_y);
+}
+
+void xdata_setsize(int x, int y,int mx,int my) {
+ /* x,y = new size of array, mx, my = new used part of array */
+ char huge **ds;
+ int ox,oy,odx;
+ int32 k;
+ int32 i,j;
+ double huge *dn;
+ float huge *fn;
+ if (x<=data_x && y<=data_y) return;
+ ox = max_x; oy = max_y; odx = data_x;
+ max_x = mx;
+ max_y = my;
+ data_x = x;
+ data_y = y;
+ if (usefloat) {
+ fn = (float*)farcalloc(((int32) data_x)*data_y, sizeof(float));
+ if (fn==NULL) {fner("memory %d %d %ld\n",data_x,data_y,((int32) data_x)*data_y);}
+ if (fn==NULL) gle_abort("Unable to allocate more storage\n");
+ for (k=0;k<data_x*data_y;k++) fn[k] = MISS;
+ if (f_numbers!=NULL) {
+ for (i=1;i<=ox;i++) for (j=1;j<=oy;j++) {
+ fn[cellindex(i,j)] = f_numbers[oldindex(i,j)];
+ }
+ free(f_numbers);
+ }
+ f_numbers = fn;
+ top_line();
+ return;
+ }
+ /*fner("expand old %d %d, odx=(%d) new %d %d \n"
+ ,ox,oy,odx,data_x,data_y); scr_getch();*/
+ dn = (double*)farcalloc(((int32) data_x)*data_y, sizeof(double));
+ ds = (char**)farcalloc(((int32) data_x)*data_y, sizeof(char *));
+/* printf("New dimensions %d %d %d %d \n",data_x,data_y,max_x,max_y);*/
+ if (dn==NULL || ds==NULL) gle_abort("Unable to allocate more storage\n");
+ for (k=0;k<data_x*data_y;k++) dn[k] = MISS;
+ if (d_numbers!=NULL) {
+ for (i=1;i<=ox;i++) for (j=1;j<=oy;j++) {
+ /*fner("copy i=%ld j=%ld (%ld) <-- (%ld) \n"
+ ,i,j,cellindex(i,j),oldindex(i,j)); scr_getch();*/
+ dn[cellindex(i,j)] = d_numbers[oldindex(i,j)];
+ ds[cellindex(i,j)] = d_strings[oldindex(i,j)];
+ }
+ free(d_numbers); free(d_strings);
+ }
+ d_numbers = dn;
+ d_strings = ds;
+ top_line();
+}
+
+void set_scell(int x, int y, char *s) {
+ int32 j;
+ if (x>data_x || y>data_y) data_expand(x,y);
+ if (x>max_x) max_x = x;
+ if (y>max_y) max_y = y;
+ j = cellindex(x,y);
+ /* fner("scell %d %d %ld \n",x,y,j); scr_getch(); */
+ if (usefloat) {f_numbers[j] = 0; return;}
+ if (d_strings[j]!=NULL) free(d_strings[j]);
+ d_strings[j] = (char *) strdup(s);
+ d_numbers[j] = 0;
+ changed = true;
+}
+
+void set_cell(int x, int y, double d) {
+ char *s;
+ if (x>data_x || y>data_y) data_expand(x,y);
+ if (x>max_x) max_x = x;
+ if (y>max_y) max_y = y;
+ if (usefloat) {f_numbers[cellindex(x,y)] = d; return;}
+ d_numbers[cellindex(x,y)] = d;
+ s = d_strings[cellindex(x,y)];
+ if (s!=NULL) {free(s); d_strings[cellindex(x,y)] = NULL;}
+ changed = true;
+}
+
+bool cell_greater(int x1,int y1, int x2, int y2) {
+ int32 j1,j2;
+ if (x1>max_x || y1>max_y) return false;
+ if (x2>max_x || y2>max_y) return true;
+ j1 = cellindex(x1,y1);
+ j2 = cellindex(x2,y2);
+ if (!usefloat) {
+ if (d_strings[j1]!=NULL && d_strings[j2]!=NULL) {
+ if (strcmp(d_strings[j1],d_strings[j2])>0)
+ return true;
+ else
+ return false;
+ }
+ }
+ if (vcell(x1,y1)>vcell(x2,y2)) return true;
+ return false;
+}
+
+char *scell(int x, int y) {
+ int32 j;
+ static char buff[80];
+ if (x>max_x || y>max_y) return strmiss;
+ j = cellindex(x,y);
+ if (usefloat) {
+ if (f_numbers[j]>=MISS) return strmiss;
+ sprintf(buff,"%g",f_numbers[j]);
+ return buff;
+ }
+ if (d_strings[j]!=NULL) {
+ return d_strings[j];
+ }
+ if (d_numbers[j]>=MISS) return strmiss;
+ sprintf(buff,"%g",d_numbers[j]);
+ return buff;
+}
+
+double vcell(int x, int y) {
+ int32 j;
+ if (x>max_x || y>max_y) return 0;
+ j = cellindex(x,y);
+ if (usefloat) {
+ if (f_numbers[j]>=MISS) return 0;
+ return f_numbers[j];
+ }
+ if (d_strings[j]!=NULL) return 0;
+ if (d_numbers[j]>=MISS) return 0;
+ return d_numbers[j];
+}
+
+void get_cell(int x, int y, double *v) {
+ int32 j;
+ *v = 0;
+ if (x>max_x || y>max_y) return;
+ j = cellindex(x,y);
+ if (usefloat) {
+ if (f_numbers[j]>=MISS) return ;
+ *v = f_numbers[j];
+ return;
+ }
+ if (d_strings[j]!=NULL) return;
+ if (d_numbers[j]>=MISS) return;
+ *v = d_numbers[j];
+}
+
+void copy_cell(int x, int y, int x2, int y2) {
+ int32 j;
+ if (x>max_x || y>max_y) {set_cell(x2,y2,MISS); return;}
+ j = cellindex(x,y);
+ if (usefloat) {set_cell(x2,y2,f_numbers[j]); return;}
+ if (d_strings[j]!=NULL) {set_scell(x2,y2,d_strings[j]); return;}
+ set_cell(x2,y2,d_numbers[j]);
+}
+
+void swap_cell(int x, int y, int x2, int y2) {
+ char *s;
+ double v;
+ int32 j,j2;
+ if (x>data_x || y>data_y) data_expand(x,y);
+ if (x2>data_x || y2>data_y) data_expand(x2,y2);
+ if (x>max_x) max_x = x;
+ if (y>max_y) max_y = y;
+ if (x2>max_x) max_x = x2;
+ if (y2>max_y) max_y = y2;
+
+ j = cellindex(x,y);
+ j2 = cellindex(x2,y2);
+ if (usefloat) {
+ v = f_numbers[j];
+ f_numbers[j] = f_numbers[j2];
+ f_numbers[j2] = v;
+ return;
+ }
+ v = d_numbers[j];
+ s = d_strings[j];
+ d_numbers[j] = d_numbers[j2];
+ d_strings[j] = d_strings[j2];
+ d_numbers[j2] = v;
+ d_strings[j2] = s;
+}
+
+void clear_cell(int x, int y) {
+ int32 j;
+ if (x>max_x || y>max_y) {return;}
+ j = cellindex(x,y);
+ if (usefloat) {f_numbers[j] = MISS; return;}
+ if (d_strings[j]!=NULL) {free(d_strings[j]); d_strings[j] = NULL;}
+ d_numbers[j] = MISS;
+}
+
+void get_cellboth(int x, int y, double *v, char **s) {
+ int32 j;
+ *s = NULL;
+ *v = 0;
+ if (x>max_x || y>max_y) {*s = strmiss; return;}
+ j = cellindex(x,y);
+ if (usefloat) {
+ if (f_numbers[j]>=MISS) {*s = strmiss; return;}
+ *v = f_numbers[j];
+ *s = NULL;
+ return;
+ }
+ if (d_strings[j]!=NULL) {*s = d_strings[j]; return;}
+ if (d_numbers[j]>=MISS) {*s = strmiss; return;}
+ *v = d_numbers[j];
+}
+
+void trim_data() {
+ int32 i,j,k,mx,my;
+ mx = my = 0;
+ for (i=1;i<=max_x;i++) for (j=1;j<=max_y;j++) {
+ k = cellindex(i,j);
+ if (usefloat) {
+ if (f_numbers[k]!=MISS) {
+ if (i>mx) mx = i;
+ if (j>my) my = j;
+ }
+ } else {
+ if (d_numbers[k]!=MISS) {
+ if (i>mx) mx = i;
+ if (j>my) my = j;
+ }
+ }
+ }
+ max_x = mx;
+ max_y = my;
+}
diff --git a/src/manip/cell.h b/src/manip/cell.h
new file mode 100644
index 0000000..911b637
--- /dev/null
+++ b/src/manip/cell.h
@@ -0,0 +1,58 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#ifndef INC_CELL_H
+#define INC_CELL_H
+
+void data_setsize(int x, int y);
+void xdata_setsize(int x, int y,int mx,int my);
+void set_cell(int x, int y, double d);
+void set_scell(int x, int y, char *s);
+void get_cell(int x, int y, double *v);
+void get_cellboth(int x, int y, double *v, char **s);
+bool cell_greater(int x1,int y1, int x2, int y2);
+void copy_cell(int x, int y, int x2, int y2);
+void swap_cell(int x, int y, int x2, int y2);
+void clear_cell(int x, int y);
+void set_size(int x, int y);
+void clear_data();
+void trim_data();
+void data_expand(int x, int y);
+void set_usefloat();
+
+#endif
diff --git a/src/manip/cmd.cpp b/src/manip/cmd.cpp
new file mode 100644
index 0000000..6500220
--- /dev/null
+++ b/src/manip/cmd.cpp
@@ -0,0 +1,1277 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+/* number - put it in current cell and move in current dir
+ 'string - put string in cell and move in current direction
+ range = expression - evaluate exp for each cell in range
+ cell(exp,exp) = expression - evaluate exp and put in cell
+ cmd - exectue command, if then else next for save load generate
+ print, input
+ & = continued on next line.
+
+ load b.dat range c3r3 width 10.3 between ", "
+ save b.c c3c4
+ set outwidth 0
+ set outwidth 10.3
+ set between ", "
+ copy c1 c2
+*/
+
+#include "all.h"
+#include "edt.h"
+#include "keyword.h"
+
+extern int in_recover;
+extern int curx;
+extern int cury;
+extern int max_x,max_y;
+#define tok(j) (tk[j])
+#define dbg if (gle_debug>0)
+extern char file_name[];
+extern int iserr;
+extern int gle_debug,changed;
+extern int trace_on;
+extern int exit_manip;
+int isating;
+int islogging;
+int load_list;
+int dpoints[200];
+int coltype[200];
+int outwidth1=8,outwidth2=8;
+const char *between=" ";
+char strmiss[40];
+
+void do_command(char *cmd) {
+ static char inbuff[200];
+ static char *tk[500];
+ static char tkbuff[500];
+ int i,al,ntok;
+ static char space_str[] = " ";
+
+ if (islogging) log_write(cmd);
+
+ token_space();
+ strcat(inbuff,cmd);
+ al = strlen(inbuff);
+ if (inbuff[al-1]=='&') {
+ inbuff[al-1] = 0;
+ return;
+ }
+ token(inbuff,tk,&ntok,tkbuff);
+ for (i=ntok+1;i< ntok+5;i++) tk[i] = space_str;
+/* for (i=1;i<=ntok;i++) printf("token{%s} ",tk[i]);
+ printf("\n"); */
+ passcmd(inbuff,tk,&ntok);
+ inbuff[0] = 0;
+
+}
+
+extern int moving_x, moving_y;
+
+void passcmd(char *source,char *tk[],int *ntok) {
+ int j,i,ix,vidx,vtype=1;
+ double v;
+ char *sp;
+ find_mkey(tok(1),&ix);
+ if (strcmp(tok(2),"=")==0) {
+ do_assign(tok(1),tok(3));
+ return;
+ }
+ sp = strchr(tok(1),'=');
+ if (sp!=NULL) {
+ *sp = 0;
+ do_assign(tok(1),sp+1);
+ return;
+ }
+ if (gle_isnumber(tok(1)) || *tok(1)=='-') {
+ set_cell(curx,cury,atof(tok(1)));
+ set_newxy(curx+moving_x,cury+moving_y);
+ return;
+ }
+ if ((*tok(1))=='"') {
+ *(tok(1)+strlen(tok(1))-1) = 0;
+ set_scell(curx,cury,tok(1)+1);
+ set_newxy(curx+moving_x,cury+moving_y);
+ return;
+ }
+ if ((*tok(1))=='@') {
+ at_open(tok(1)+1);
+ return;
+ }
+ switch (ix) {
+ case k_data: /* data <range> */
+ cmd_data(tok(2));
+ break;
+ case k_help:/* help load */
+ if (*ntok==1) do_help("MANIP","");
+ else do_help(tok(2),tok(3));
+ manip_refresh();
+ break;
+ case k_list: /* list a.a [range] , reads a list of numbers */
+ load_list = true;
+ cmd_load(tok(2),tok(3),*ntok);
+ load_list = false;
+ break;
+ case k_load: /* LOAD A.A [range] -LIST */
+ if (*ntok>3) if (strcmp(tok(4),"-LIST")==0) load_list = true;
+ cmd_load(tok(2),tok(3),*ntok);
+ load_list = false;
+ break;
+ case k_save: /* SAVE [a.a] [range] [format-string] */
+ changed = false;
+ cmd_save(tok(2),tok(3),tok(4),*ntok);
+ break;
+ case k_set: /* set outwidth, set width, set between, */
+ if (strcmp(tok(2),"OUTWIDTH")==0) set_outwidth(tok(3));
+ else if (strcmp(tok(2),"WIDTH")==0) set_outwidth(tok(3));
+ else if (strcmp(tok(2),"BETWEEN")==0) between = unquote(tok(3));
+ else if (strcmp(tok(2),"MISSING")==0) strcpy(strmiss,unquote(tok(3)));
+ else if (strcmp(tok(2),"DIGITS")==0) outwidth2 = atoi(tok(3));
+ else if (strcmp(tok(2),"DPOINTS")==0) {
+ i = atoi(tok(3));
+ if (*ntok>3) dpoints[atoi(tok(4))] = i;
+ else for (j=0;j<200;j++) dpoints[j] = i;
+ }
+ else if (strcmp(tok(2),"COLTYPE")==0) {
+ i = atoi(tok(3));
+ if (*tok(3)=='C') i = atoi(tok(3)+1);
+ if (strcmp(tok(4),"BOTH")==0) j = 0;
+ if (strcmp(tok(4),"DECIMAL")==0) j = 1;
+ if (strcmp(tok(4),"EXP")==0) j = 2;
+ if (strcmp(tok(4),"DPOINTS")==0) {
+ j = atoi(tok(5));
+ if (i==0) for (i=0;i<200;i++) dpoints[i] = j;
+ else dpoints[i] = j;
+ } else {
+ if (i==0) for (i=0;i<200;i++) coltype[i] = j;
+ else coltype[i] = j;
+ }
+ }
+ else if (strcmp(tok(2),"COLUMNS")==0) set_ncol(atoi(tok(3)));
+ else if (strcmp(tok(2),"NCOL")==0) set_ncol(atoi(tok(3)));
+ else if (strcmp(tok(2),"COLWIDTH")==0) set_colwidth(atoi(tok(3)));
+ else if (strcmp(tok(2),"PRECISION")==0) outwidth2 = atoi(tok(3));
+ else if (strcmp(tok(2),"SIZE")==0) {
+ set_size(atoi(tok(3)),atoi(tok(4)));
+ }
+ else fner("Invalid SET command, Use (width,between,digits,dpoints,ncol,colwidth)\n");
+ break;
+ case k_new: /* clears the spreadsheet and free's memory */
+ clear_data();
+ break;
+ case k_clear: /* clear part of the spread sheet */
+ cmd_clear(tok(2));
+ break;
+ case k_delete: /* delete <range> [if <exp>] */
+ cmd_delete(tok(2),tok(4),*ntok);
+ trim_data();
+ break;
+ case k_insert: /* insert <range> */
+ cmd_insert(tok(2));
+ break;
+ case k_exit:
+ cmd_save(tok(2),tok(3),tok(4),*ntok);
+ changed = false;
+ exit_manip = true;
+ break;
+ case k_quit:
+ exit_manip = true;
+ break;
+ case k_logging: /* log filename */
+ if (islogging) log_close();
+ log_open(tk[2]);
+ break;
+ case k_close:
+ log_close();
+ break;
+ case k_at: /* execute file of manip commands */
+ at_open(tk[2]);
+ break;
+ case k_call:
+ manip_refresh();
+ break;
+ case k_sort: /* sort <range> on <exp> */
+ cmd_sort(tk[2],tk[4],*ntok);
+ break;
+ case k_swap: /* swap CaCb || swap RaRb */
+ cmd_swap(tk[2]);
+ break;
+ case k_shell:
+ window(1,1,80,25); scr_norm(); clrscr();
+ printf("Type in EXIT to return to MANIP\n\n");
+ #ifndef DJ /* a.r. */
+ if (system("") == -1) {
+ printf("Can't show shell prompt\n\n");
+ }
+ #else
+ system(getenv("COMSPEC"));
+ #endif
+ manip_refresh();
+ break;
+ case k_sum:
+ cmd_sum(tk[2]);
+ break;
+ case k_fit:
+ cmd_fit(tk[2]);
+ break;
+ case k_parsum:
+ cmd_parsum(tk[2],tk[3]);
+ break;
+ case k_if:
+ case k_else:
+ case k_end:
+ case k_for:
+ case k_next:
+ case k_print:
+ case k_input: /* input "prompt" variable */
+ case k_copy: /* copy range1 range2 [if exp] (doesn't) */
+ cmd_copy(tk[2],tk[3],tk[5],*ntok,true);
+ break;
+ case k_move: /* move range1 range2 [if exp] (leaves gaps) */
+ cmd_copy(tk[2],tk[3],tk[5],*ntok,false);
+ break;
+ case k_prop: /* prop range1 range2 (cycle thru range1) */
+ cmd_copy(tk[2],tk[3],tk[5],*ntok,2);
+ break;
+ case k_generate: /* gen 2(1,2:4)3 c1 (1 1 2 2 3 3 4 4) 3 times*/
+ cmd_generate(tk[2],tk[3],*ntok);
+ break;
+ case k_let:
+ /* let variable = expression */
+ var_findadd(tk[2],&vidx,&vtype);
+ evaluate(tk[4],&v);
+ var_set(vidx,v);
+ break;
+ case k_goto: /* should really use eval, not atoi so var's work */
+ set_newxy(atoi(tk[2]),atoi(tk[3]));
+ break;
+ default:
+ fner("No such command {%s} {%s}\n",tk[1],tk[2]);
+ }
+}
+
+struct op_key { char *name; int typ; int pos; unsigned int idx; } ;
+typedef struct op_key (*OPKEY)[100];
+
+void do_assign(char *t1, char *t2) {
+ RANGE rr;
+ int cp,vtype;
+ double v;
+ static int32 pcode[200];
+ static char outstr[80];
+ int plen;
+ vtype = 1;
+
+ /* ------------------ */
+ /* variable = expression */
+ /* cell(exp,exp) = exp */
+ /* range = exp */
+ /* ------------------ */
+
+ if (strncmp(t1,"CELL(",5)==0) { /* cell(exp,exp) = exp */
+ { char s1[80],s2[80],*s;
+ int x,y;
+ s = strchr(t1,',');
+ if (s==NULL) {
+ fner("Expecting CELL(EXP,EXP) = EXP \n");
+ return;
+ }
+ strcpy(s1,t1+5); strcpy(s2,s+1);
+ *strchr(s1,',') = 0;
+ if (strchr(s2,')')!=NULL) *strchr(s2,')') = 0;
+ evaluate(s1,&v); x = (int)v;
+ evaluate(s2,&v); y = (int)v;
+ evaluate(t2,&v);
+ set_cell(x,y,v);
+ show_ifcell(x,y);
+ }
+ return;
+ }
+ if (range_def(t1,&rr)) { /* range = exp */
+ {
+ int c_idx[20], c_val[20], nc, j;
+ int r_idx[20], r_val[20], nr;
+
+ polish(t2,(char *) pcode,&plen,&vtype);
+ var_find_rc(c_idx,c_val,&nc,'C');
+ var_find_rc(r_idx,r_val,&nr,'R');
+ for (;range_next(&rr);) {
+ cp = 0;
+ eval_setxy(rr.col,rr.row);
+ for (j=0;j<nc;j++) {
+ var_set(c_idx[j],vcell(c_val[j],rr.row));
+ }
+ for (j=0;j<nr;j++) {
+ var_set(r_idx[j],vcell(rr.col,r_val[j]));
+ }
+ eval(pcode,&cp,&v,outstr,&vtype);
+ set_cell(rr.col,rr.row,v);
+ show_ifcell(rr.col,rr.row);
+ }
+ return;
+ }
+ }
+ fner("error, expecting cell(exp,exp) = exp, or range = exp \n");
+}
+
+void evaluate(char *exp, double *v) {
+ static int32 pcode[200];
+ int plen,vtype,cp;
+ static char outstr[100];
+
+ vtype = 1;
+ polish(exp,(char *) pcode,&plen,&vtype);
+ if (plen>150) fner("pcode too int32, report bug to Chris\n");
+ cp = 0;
+ eval(pcode,&cp,v,outstr,&vtype);
+}
+
+int new_line;
+
+bool range_next(RANGE *r) {
+ new_line = false;
+ if (r->row==0) {
+ r->row = r->r1; r->col = r->c1;
+ return true;
+ }
+ if (r->colfirst) {
+ r->col++;
+ if (r->col > r->c2) {
+ new_line = true;
+ r->col = r->c1;
+ r->row++;
+ if (r->row > r->r2) return false;
+ }
+ } else {
+ r->row++;
+ if (r->row > r->r2) {
+ new_line = true;
+ r->row = r->r1;
+ r->col++;
+ if (r->col > r->c2) return false;
+ }
+ }
+ return true;
+}
+
+bool range_def(const char *sxx, RANGE *r) {
+ char s[80];
+ char *s1;
+ char rr,cc;
+ strcpy(s,sxx);
+ strip_colon(s);
+ r->c1 = r->c2 = r->r1 = r->r2 = r->row = r->col = 0;
+
+ if (*s=='C') {cc='C'; rr='R'; r->colfirst = true;}
+ else if (*s=='R') {cc='R'; rr='C'; r->colfirst = false;}
+ else return false;
+/* c1 c1r1r10 c3c4r7 c3r7 c3c4r1r2 | r1r2c1c3 c3r7 r2*/
+
+ s1 = range_int(s,&(r->c1));
+ if (*s1==cc) {
+ s1 = range_int(s1,&r->c2);
+ }
+ if (*s1==rr) {
+ s1 = range_int(s1,&r->r1);
+ if (*s1==cc) {
+ s1 = range_int(s1,&r->c2);
+ }
+ if (*s1==rr) {
+ s1 = range_int(s1,&r->r2);
+ }
+ if (*s1==cc) {
+ s1 = range_int(s1,&r->c2);
+ }
+ }
+ if (!r->colfirst) {
+ swapint(&r->c1,&r->r1);
+ swapint(&r->c2,&r->r2);
+ }
+ if (r->c1 == 0) r->c1 = 1;
+ if (r->c2 == 0) {
+ if (!r->colfirst) {
+ if (r->c1 > max_x) r->c2 = r->c1; else r->c2 = max_x;
+ } else {
+ r->c2 = r->c1;
+ }
+ }
+ if (r->r1 == 0) r->r1 = 1;
+ if (r->r2 == 0) {if (r->colfirst)
+ { if (r->r1>max_y) r->r2 = r->r1; else r->r2 = max_y;}
+ else r->r2 = r->r1;}
+
+/* printf("range def %d %d %d %d | \n",r->c1,r->r1,r->c2,r->r2); getch();*/
+ data_expand(r->c2,r->r2);
+ if (*s1!=0) return false;
+ return true;
+}
+
+char *range_int(char *s, int *v) {
+ static char buff[40],*b;
+ b = buff;
+ for (s++;*s!=0 && isdigit(*s);)
+ *b++ = *s++;
+ *b++ = 0;
+ *v = atoi(buff);
+ return s;
+}
+
+void swapint(int *a, int *b) {
+ int c;
+ c = *a;
+ *a = *b;
+ *b = c;
+}
+
+const char *sep_chars=", \t\n";
+
+void cmd_load(char *fname, const char *range, int ntok) {
+ RANGE rr;
+ static char inbuff[8001];
+ FILE *fptr;
+
+ m_tokinit(sep_chars);
+
+ if (ntok<2) fname = file_name;
+ strcpy(file_name,fname);
+
+ if (ntok>2) {
+ if (range_def(range,&rr)) range_next(&rr);
+ else { /* range = exp */
+ fner("Invalid load range given (%s) \n",range);
+ return;
+ }
+ } else {
+ rr.col = 1; rr.row = 1;
+ }
+ gle_strlwr(fname);
+ fptr = fopen(fname,"r");
+ if (fptr==NULL) {
+ fner("Could not open (%s) \n",fname);
+ return;
+ }
+ for (;!feof(fptr);) {
+ if (fgets(inbuff,7000,fptr)!=NULL) {
+ if (load_list) cmd_load_list(&rr,inbuff);
+ else cmd_load_line(rr.col,rr.row++,inbuff);
+ }
+ }
+ fclose(fptr);
+}
+
+static char term_table[256];
+
+void m_tokinit(const char *termset) {
+ int i;
+ for (i=0;i<=255;i++) {
+ if (strchr(termset,i)!=NULL)
+ term_table[i]=true;
+ else term_table[i]=false;
+ }
+}
+
+char *m_tokend(char *s) {
+ static char *p1,*p2,*p,savechar;
+ if (s!=NULL) {
+ p1 = s;
+ } else {
+ *p2 = savechar;
+ if (*p2 == 0) return NULL;
+ p1 = p2+1;
+ }
+ for (p=p1; *p != 0; p++) { /* find a non space */
+ if (term_table[(unsigned int)*p]==false) break;
+ }
+ if (*p==0) return NULL;
+ p1 = p;
+ if (*p=='"') {
+ p2 = strchr(p+1,'"');
+ if (p2==NULL) p2 = p;
+ p = ++p2;
+ } else {
+ for (; *p != 0; p++) { /* find next space */
+ if (term_table[(unsigned int)*p]==true) break;
+ }
+ }
+ p2 = p;
+ savechar = *p2;
+ *p2 = 0;
+ return p1;
+}
+
+void cmd_load_list(RANGE *r, char *inbuff) {
+ char *s;
+ s = m_tokend(inbuff);
+ for (;s!=NULL;) {
+ load_str(r->col,r->row,s);
+ s = m_tokend(NULL);
+ range_next(r);
+ }
+
+}
+
+void cmd_load_line(int x, int y, char *inbuff) {
+ char *s;
+ s = m_tokend(inbuff);
+ for (;s!=NULL;) {
+ load_str(x,y,s);
+ s = m_tokend(NULL);
+ x++;
+ }
+
+}
+
+void load_str(int x, int y, char *s) {
+ static char bb[88];
+ if (strcmp(s,".")==0 || strcmp(s,"-")==0 || strcmp(s,"*")==0) clear_cell(x,y);
+ else if (isdigit(*s) || *s=='-' || *s=='+' || *s=='.') set_cell(x,y,atof(s));
+ else {
+ if (strlen(s)>80) {
+ strncpy(bb,s,80);
+ bb[80] = 0;
+ set_scell(x,y,bb);
+ } else set_scell(x,y,s);
+ }
+ show_ifcell(x,y);
+}
+
+void cmd_save(char *fname, const char *range, const char *format, int ntok) {
+ RANGE rr;
+ static char inbuff[2001];
+ static char fmtg[80],buff1[80],savefmtg[80];
+ FILE *fptr;
+ int lcount=0;
+ int i,inlen=0,thelot,k;
+ double v;
+ char *s;
+
+ gle_strlwr(fname);
+ trim_data();
+ thelot = false;
+ if (*range=='-') {
+ const char* tmp = range;
+ range = format;
+ format = tmp;
+ }
+ if (strcmp(format,"-COMMA")==0) {
+ set_outwidth(0);
+ between = strdup(", ");
+ }
+ if (strcmp(format,"-TAB")==0) {
+ set_outwidth(0);
+ between = strdup("\t");
+ }
+ if (strcmp(format,"-SPACE")==0) {
+ set_outwidth(0);
+ between = strdup(" ");
+ }
+
+ sprintf(fmtg,"%%.%dg",outwidth2);
+ if (outwidth1==0 && outwidth2==0) strcpy(fmtg,"%g");
+ strcpy(savefmtg,fmtg);
+
+ if (ntok<2) fname = file_name;
+ if (strcmp(fname,"*")==0) fname = file_name;
+ strcpy(file_name,fname);
+
+ /* format strings "%2.3f, " */
+ if (ntok<4) format = (char*)"%g ";
+ if (ntok<3 || strcmp(range," ")==0) thelot = true;
+ if (thelot) range = (char*)"C1R1";
+ if (range_def(range,&rr)) ;
+ else { /* range = exp */
+ fner("Invalid range given (%s)%d \n",range,strlen(range));
+ return;
+ }
+ if (thelot) rr.c2 = max_x;
+ unlink("manip_.bak");
+ unlink("manip_.tmp");
+ fptr = fopen("manip_.tmp","w");
+ if (fptr==NULL) {
+ fner("Could not open (%s) \n",fname);
+ return;
+ }
+ for (;range_next(&rr);) {
+ if (new_line==true) {
+ if (fprintf(fptr,"%s\n",inbuff) <0) printf("Error writing output file\n");
+ inbuff[50] = 0;
+ if (++lcount==1) fner("{%s} W=%d D=%d {%s}",fname,outwidth1,outwidth2,inbuff);
+ inlen = 0;
+ }
+ if (inlen>0) { strcpy(inbuff+inlen,between); inlen +=strlen(between);}
+ get_cellboth(rr.col,rr.row,&v,&s);
+ k = rr.col;
+ if (k>199) k = 199;
+ if (coltype[k]==0) strcpy(fmtg,savefmtg);
+ if (coltype[k]==1) strcpy(fmtg,"%f");
+ if (coltype[k]==2) strcpy(fmtg,"%e");
+ if (s==NULL) {
+ i = sprintf(buff1,fmtg,vcell(rr.col,rr.row));
+ if (dpoints[k]>0) i = strcpydecimal(inbuff+inlen,buff1,outwidth1,dpoints[k]);
+ else i = strcpywidth(inbuff+inlen,buff1,outwidth1);
+ } else {
+ i = strcpywidth(inbuff+inlen,s,outwidth1);
+ }
+ inlen += i;
+ }
+ if (new_line==true) {
+ if (fprintf(fptr,"%s\n",inbuff)<0) {
+ fner("Error writing output file");
+ return;
+ }
+ inbuff[50] = 0;
+ if (++lcount==1) fner("Width=%d Precision=%d {%s}",outwidth1,outwidth2,inbuff);
+ inlen = 0;
+ }
+ fclose(fptr);
+ if (rename(fname,"manip_.bak")!=0);
+ if (rename("manip_.tmp",fname)!=0) fner("Unable to rename manip_.tmp");
+}
+
+int strcpydecimal(char *dest, char *src, int wid, int dpoints) {
+ /* 123 , 12.031, 0.0003321 */
+ /* dpoints 2 goes too */
+ /* 123.00 12.03 0.00 */
+ static char buff[80];
+
+ strcpy(buff,src);
+ if (strchr(buff,'.')==NULL) strcat(buff,".");
+ strcat(buff,"0000000000000000000000000000000000");
+ *(strchr(buff,'.')+dpoints+1) = 0;
+ strcpywidth(dest,buff,wid);
+ return strlen(dest);
+}
+
+int strcpywidth(char *dest, char *src, int wid) {
+ static char buff[80];
+ int i = wid-strlen(src);
+ if (i < 0) {
+ buff[0] = 0;
+ } else {
+ memset(buff, (int)' ',i);
+ buff[i] = 0;
+ }
+ strcpy(dest,buff);
+ strcat(dest,src);
+ return strlen(dest);
+}
+
+void set_outwidth(char *s) {
+ char *ss;
+ ss = strchr(s,'.');
+ if (ss==NULL) {
+ outwidth1 = atoi(s);
+ outwidth2 = 8;
+ } else {
+ *ss++ = 0;
+ outwidth1 = atoi(s);
+ outwidth2 = atoi(ss);
+ }
+}
+
+char *unquote(char *s) {
+ char ss[80];
+ strcpy(ss,s);
+ if (*s=='"') {
+ ss[strlen(ss)-1] = 0;
+ return strdup(ss+1);
+ } else return strdup(ss);
+}
+
+void cmd_copy(char *src, char *dest, char *ifexp, int ntok, int always) {
+ RANGE ss,dd,savess;
+ int c_idx[20], c_val[20], nc, j, isif=false;
+ int r_idx[20], r_val[20], nr;
+ int cp,vtype,ddok,ssok;
+ double v;
+ char outstr[30];
+ int32 pcode[200];
+ int plen;
+ vtype = 1;
+
+ if (ntok>4) isif = true;
+ if (!range_def(src,&ss)) { fner("Error in source range {%s} \n",src); return;}
+ if (!range_def(dest,&dd)) { fner("Error in destination range {%s} \n",dest); return;}
+
+ if (isif) {
+ polish(ifexp,(char *) pcode,&plen,&vtype);
+ var_find_rc(c_idx,c_val,&nc,'C');
+ var_find_rc(r_idx,r_val,&nr,'R');
+ }
+ ddok = range_next(&dd);
+ ssok = range_next(&ss);
+ savess = ss;
+ for (;ssok && ddok;) {
+ if (isif) {
+ cp = 0;
+ eval_setxy(ss.col,ss.row);
+ eval_setxyd(dd.col,dd.row);
+ for (j=0;j<nc;j++) {
+ var_set(c_idx[j],vcell(c_val[j],ss.row));
+ }
+ for (j=0;j<nr;j++) {
+ var_set(r_idx[j],vcell(ss.col,r_val[j]));
+ }
+ eval(pcode,&cp,&v,outstr,&vtype);
+ }
+ if (v==true || !isif) {
+ copy_cell(ss.col,ss.row,dd.col,dd.row);
+ show_ifcell(dd.col,dd.row);
+ ddok = range_next(&dd);
+ } else if (always) ddok = range_next(&dd);
+ if (always!=2) ddok = true;
+ ssok = range_next(&ss);
+ if (!ssok && always==2) {
+ ss = savess; ssok = true;
+ }
+ }
+}
+
+void cmd_generate(char *patx, char *dest, int ntok) {
+ int left,right;
+ RANGE rr;
+ static char pat[188];
+ static char middle[80];
+ double v;
+ int i,j;
+
+ strcpy(pat,patx);
+ if (strchr(pat,'(')==NULL) {fner("Expecting left bracket"); return;}
+ if (strchr(pat,')')==NULL) {fner("Expecting left bracket"); return;}
+ if (ntok!=3) {fner("Expecting (GEN pattern range)"); return;}
+
+ if (pat[0]=='(') {strcpy(pat,"1"); strcat(pat,patx);}
+ if (pat[strlen(pat)-1] == ')') strcat(pat,"1");
+ left = atoi(strtok(pat,"()"));
+ strcpy(middle,strtok(NULL,"()"));
+ right = atoi(strtok(NULL,"()"));
+ if (left==0) left = 1;
+ if (right==0) right = 1;
+ if (!range_def(dest,&rr)) {fner("Invalid range given (%s) \n",dest); return;}
+ for (i=0;i<right;i++) {
+ gen_next(middle,&v);
+ for (;gen_next(NULL,&v);) {
+ for (j=0;j<left;j++) {
+ range_next(&rr);
+ set_cell(rr.col,rr.row,v);
+ show_ifcell(rr.col,rr.row);
+ }
+ }
+ }
+}
+
+bool gen_next(char *pat, double *v) {
+ static char *s,p[200];
+ static double v1,v2,v3;
+ static int instep;
+ char *c1,*c2;
+ if (pat!=NULL) {
+ strcpy(p,pat);
+ s = strtok(p,",");
+ return true;
+ }
+ if (instep) {
+ v1 += v3;
+ *v = v1;
+ if (v1<=v2) return true;
+ else instep = false;
+ }
+ if (s==NULL) return false;
+ c2 = c1 = strchr(s,':');
+ if (c1!=NULL) c2 = strchr(c1+1,':');
+
+ if (c1==NULL) {
+ *v = atof(s);
+ s = strtok(NULL,",");
+ return true;
+ }
+ v1 = atof(s);
+ v2 = atof(c1+1);
+ if (c2==NULL) v3 = 1; else v3 = atof(c2+1);
+ *v = v1;
+ instep = true;
+ s = strtok(NULL,",");
+ if (v1>v2) return false;
+ return true;
+}
+
+int c_idx[20], c_val[20], ncc;
+int r_idx[20], r_val[20], nrr;
+int32 cpcode[200];
+
+void cmd_polish(char *exp) {
+ int vtype;
+ int plen;
+ vtype = 1;
+ polish(exp,(char *) cpcode,&plen,&vtype);
+ var_find_rc(c_idx,c_val,&ncc,'C');
+ var_find_rc(r_idx,r_val,&nrr,'R');
+}
+
+void cmd_eval(int x1, int y1, double *v) {
+ int cp,vtype,j;
+ char outstr[30];
+ vtype = 1;
+
+ cp = 0;
+ eval_setxy(x1,y1);
+ eval_setxyd(x1,y1);
+ for (j=0;j<ncc;j++) {
+ var_set(c_idx[j],vcell(c_val[j],y1));
+ }
+ for (j=0;j<nrr;j++) {
+ var_set(r_idx[j],vcell(x1,r_val[j]));
+ }
+ eval(cpcode,&cp,v,outstr,&vtype);
+}
+
+void cmd_delete(char *range, char *ifexp, int ntok) {
+ RANGE rr;
+ double v = 0.0;
+ int isif = false,j,wid,w;
+ if (ntok>2) isif = true; else isif = false;
+ if (!range_def(range,&rr)) { fner("Error in range {%s} \n",range); return;}
+
+ if (isif) cmd_polish(ifexp);
+ range_next(&rr);
+ if (rr.colfirst) {
+ w = rr.c2-rr.c1+1;
+ wid = max_x-rr.c1;
+ } else {
+ w = rr.r2-rr.r1+1;
+ wid = max_y-rr.r1;
+ }
+ for (;;) {
+ if (rr.colfirst) {
+ if (isif) cmd_eval(rr.col,rr.row,&v);
+ if (v==true || !isif) {
+ for (j=0;j<wid; j++) {
+ copy_cell(rr.col+j+w,rr.row,rr.col+j,rr.row);
+ show_ifcell(rr.col+j,rr.row);
+ }
+ for (j=0;j<w;j++) {
+ clear_cell(rr.c2+wid-j,rr.row);
+ show_ifcell(rr.c2+wid-j,rr.row);
+ }
+ }
+ rr.row++;
+ if (rr.row>rr.r2) break;
+ } else {
+ if (isif) cmd_eval(rr.col,rr.row,&v);
+ if (v==true || !isif) {
+ for (j=0;j<wid; j++) {
+ copy_cell(rr.col,rr.row+j+w,rr.col,rr.row+j);
+ show_ifcell(rr.col,rr.row+j);
+ }
+ for (j=0;j<w;j++) {
+ clear_cell(rr.col,rr.r2+wid-j);
+ show_ifcell(rr.col,rr.r2+wid-j);
+ }
+ }
+ rr.col++;
+ if (rr.col>rr.c2) break;
+ }
+ }
+}
+
+int oncol;
+
+void cmd_sort(char *range, char *ifexp, int ntok) {
+ RANGE rr;
+ double v;
+ int *pnt;
+ int i,j,c,savemax;
+ if (ntok<3) {fner("Expecting SORT c1c2 ON <exp> "); return; }
+ if (!range_def(range,&rr)) { fner("Error in range {%s} \n",range); return;}
+
+ savemax = max_x;
+ oncol = max_x + 1;
+ cmd_polish(ifexp);
+ range_next(&rr);
+ if (ntok==5) {
+ for (i=rr.r1;i<=rr.r2;i++) {
+ copy_cell(rr.c1,i,oncol,i);
+ }
+ } else {
+ for (i=rr.r1;i<=rr.r2;i++) {
+ cmd_eval(rr.c1,i,&v);
+ set_cell(oncol,i,v);
+ }
+ }
+ pnt = (int*)calloc(max_y+2,sizeof(int));
+ if (pnt==NULL) {fner("Not enough memory to sort"); return;}
+ for (i=0;i<=max_y+1;i++) pnt[i] = i;
+ for (i=rr.r1+1;i<=rr.r2;i++) {
+ if (cell_greater(oncol,pnt[i-1],oncol,pnt[i])) {
+ sort_shuffle(i,rr.r1,pnt);
+ }
+ }
+ for (c=rr.c1; c<=rr.c2; c++) {
+ for (j=rr.r1;j<=rr.r2;j++) {
+ copy_cell(c,pnt[j],oncol,j);
+ }
+ for (j=rr.r1;j<=rr.r2;j++) {
+ copy_cell(oncol,j,c,j);
+ show_ifcell(c,j);
+ }
+ }
+ for (j=1;j<=max_y;j++) clear_cell(oncol,j);
+ max_x = savemax;
+}
+
+void sort_shuffle(int i, int r1, int *pnt) {
+ int ins,j,x;
+ ins = r1;
+ for (j=i-1;j>=r1;j--) {
+ if (cell_greater(oncol,pnt[i],oncol,pnt[j])) {
+ ins = j + 1;
+ break;
+ }
+ }
+ x = pnt[i];
+ for (j=i;j>=ins;j--) pnt[j] = pnt[j-1];
+ pnt[ins] = x;
+}
+
+void cmd_insert(char *range) {
+ RANGE rr;
+ int j,cwid,cw,rwid,rw;
+ if (!range_def(range,&rr)) { fner("Error in range {%s} \n",range); return;}
+
+ range_next(&rr);
+ cw = rr.c2-rr.c1+1;
+ cwid = max_x-rr.c1+1;
+ rw = rr.r2-rr.r1+1;
+ rwid = max_y-rr.r1+1;
+ for (;;) {
+ if (rr.colfirst) {
+ for (j=cwid-1;j>=0; j--) {
+ copy_cell(rr.col+j,rr.row,rr.col+j+cw,rr.row);
+ show_ifcell(rr.col+j+cw,rr.row);
+ }
+ for (j=0;j<cw;j++) {
+ clear_cell(rr.c1+j,rr.row);
+ show_ifcell(rr.c1+j,rr.row);
+ }
+ rr.row++;
+ if (rr.row>rr.r2) break;
+ } else {
+ for (j=rwid-1;j>=0; j--) {
+ copy_cell(rr.col,rr.row+j,rr.col,rr.row+j+rw);
+ show_ifcell(rr.col,rr.row+j+rw);
+ }
+ for (j=0;j<rw;j++) {
+ clear_cell(rr.col,rr.r1+j);
+ show_ifcell(rr.col,rr.r1+j);
+ }
+ rr.col++;
+ if (rr.col>rr.c2) break;
+ }
+ }
+}
+
+void cmd_data(char *range) {
+ RANGE rr;
+ static char ans[155];
+ int cmd;
+ if (!range_def(range,&rr)) {
+ fner("Invalid range given (%s)%d \n",range,strlen(range));
+ return;
+ }
+ for (;;) {
+ range_next(&rr);
+ mjl_flush();
+xxx: set_newxy(rr.col,rr.row);
+ if (!iserr) fner("Press ^Z or ESC when data entry finished\n");
+ read_command(&cmd,ans,"DATA% ");
+ if (cmd==eescape || cmd==equit) break;
+ if (cmd!=0) {
+ do_arrow(cmd);
+ rr.col = curx; rr.row = cury;
+ goto xxx;
+ } else {
+ if (gle_isnumber(ans)) {
+ set_cell(curx,cury,atof(ans));
+ } else {
+ set_scell(curx,cury,ans);
+ }
+ show_cellwide(curx,cury);
+ }
+ }
+}
+
+bool swap_def(char *s, RANGE *r) {
+ char *s1;
+ char rr,cc;
+
+ strip_colon(s);
+
+ r->c1 = r->c2 = r->r1 = r->r2 = r->row = r->col = 0;
+
+ if (*s=='C') {cc='C'; rr='R'; r->colfirst = true;}
+ else if (*s=='R') {cc='R'; rr='C'; r->colfirst = false;}
+ else return false;
+/* c1 c1r1r10 c3c4r7 c3r7 c3c4r1r2 | r1r2c1c3 c3r7 r2*/
+
+ s1 = range_int(s,&(r->c1));
+ if (*s1==cc) {
+ s1 = range_int(s1,&r->c2);
+ }
+ if (*s1==rr) {
+ s1 = range_int(s1,&r->r1);
+ if (*s1==cc) {
+ s1 = range_int(s1,&r->c2);
+ }
+ if (*s1==rr) {
+ s1 = range_int(s1,&r->r2);
+ }
+ if (*s1==cc) {
+ s1 = range_int(s1,&r->c2);
+ }
+ }
+ if (!r->colfirst) {
+ swapint(&r->c1,&r->r1);
+ swapint(&r->c2,&r->r2);
+ }
+ if (*s1!=0) return false;
+ return true;
+}
+
+void cmd_swap(char *range) {
+ RANGE rr;
+ int i;
+ if (!swap_def(range,&rr)) {
+ fner("Invalid range given (%s) expecting c1c2 or r1r2 \n",range);
+ return;
+ }
+ if (rr.colfirst) {
+ if (rr.c1==0 || rr.c2==0) {fner("Invalid range, expected c1c2\n"); return;}
+ for (i=1;i<=max_y;i++) {
+ swap_cell(rr.c1,i,rr.c2,i);
+ show_ifcell(rr.c1,i); show_ifcell(rr.c2,i);
+ }
+ } else {
+ if (rr.r1==0 || rr.r2==0) {fner("Invalid range, expected r1r2\n"); return;}
+ for (i=1;i<=max_x;i++) {
+ swap_cell(i,rr.r1,i,rr.r2);
+ show_ifcell(i,rr.r1); show_ifcell(i,rr.r2);
+ }
+ }
+}
+
+FILE *logfile;
+
+void log_open(char *fname) {
+ add_dotman(fname);
+ gle_strlwr(fname);
+ logfile = fopen(fname,"w");
+ if (logfile==NULL) {
+ fner("Could not open (%s) \n",fname);
+ return;
+ }
+ islogging = true;
+}
+
+void log_write(char *s) {
+ fprintf(logfile,"%s\n",s);
+}
+
+void log_close() {
+ if (islogging) fclose(logfile);
+ islogging = false;
+}
+
+void add_dotman(char *s) {
+ if (strstr(s,".")==0) strcat(s,".man");
+}
+
+FILE *atfile;
+
+void at_open(char *fname) {
+ add_dotman(fname);
+ gle_strlwr(fname);
+ atfile = fopen(fname,"r");
+ if (atfile==NULL) {
+ fner("Could not open (%s) \n",fname);
+ return;
+ }
+ isating = true;
+}
+
+bool at_read(char *s) {
+ s[0] = 0;
+ if (feof(atfile)) {
+ fclose(atfile); atfile = NULL; isating = false; return false;
+ }
+ s[0] = 0;
+ if (fgets(s,200,atfile)==NULL) return false;
+ return true;
+}
+
+void strip_colon(char *s) {
+ char *ss;
+ ss = s;
+ for (;*s!=0;s++) {
+ if (*s!=':') *ss++ = *s;
+ }
+ *ss++ = 0;
+}
+
+void cmd_parsum(char *range, char *dest) {
+ RANGE rr,dd;
+ double total=0;
+ if (!range_def(range,&rr)) { fner("Invalid range given (%s) \n",range); return;}
+ if (!range_def(dest,&dd)) { fner("Invalid destination given (%s) \n",range); return;}
+ for (;range_next(&rr);) {
+ range_next(&dd);
+ total = total + vcell(rr.col,rr.row);
+ set_cell(dd.col,dd.row,total);
+ show_ifcell(dd.col,dd.row);
+ }
+}
+
+void cmd_sum(char *range) {
+ RANGE rr,rrsave;
+ double v,var,stddev;
+ char *s;
+ double total=0;
+ int32 ntot=0;
+ if (!range_def(range,&rr)) { fner("Invalid range given (%s) \n",range); return;}
+ rrsave = rr;
+ for (;range_next(&rr);) {
+ get_cellboth(rr.col,rr.row,&v,&s);
+ if (s==NULL) {
+ total = total + v;
+ ntot++;
+ }
+ }
+ if (ntot>0) {
+ rangestd(&rrsave,total/ntot,ntot,&var,&stddev);
+ printmess("Total %g, Avg %g, sd %g, var %g, Cells %ld \n",total,total/ntot,stddev,var,ntot);
+ } else fner("No values in range\n");
+}
+
+void rangestd(RANGE *rr, double mean, int32 numrow, double *variance, double *stddev) {
+ char *s;
+ double xsqr,v;
+
+ xsqr = 0.0;
+ if (numrow<2) return;
+ for (;range_next(rr);) {
+ get_cellboth(rr->col,rr->row,&v,&s);
+ if (s==NULL) {
+ xsqr = xsqr + v*v;
+ }
+ }
+ (*variance) = (xsqr - numrow * mean*mean) / (numrow - 1);
+ (*stddev) = sqrt(fabs((*variance)));
+}
+
+void cmd_clear(char *range) {
+ RANGE rr;
+ if (!range_def(range,&rr)) { fner("Invalid range given (%s) \n",range); return;}
+ for (;range_next(&rr);) {
+ clear_cell(rr.col,rr.row);
+ show_ifcell(rr.col,rr.row);
+ }
+}
+
+void cmd_fit(char *range) {
+ RANGE rr,rrsave;
+ char *s;
+ double v,a,b,siga,sigb,chi2,q;
+ if (!range_def(range,&rr)) { fner("Invalid range given (%s) \n",range); return;}
+ rr.c2 = rr.c1;
+ rrsave = rr;
+ int ntot = 0;
+ for (;range_next(&rr);) {
+ get_cellboth(rr.col,rr.row,&v,&s);
+ if (s==NULL) {
+ ntot++;
+ }
+ }
+ if (ntot>0) {
+ fitlsq(&rrsave,ntot,&a,&b,&siga,&sigb,&chi2,&q);
+ printmess("y = %g + b*%g siga=%g sigb=%g chi2=%g\n",a,b,siga,sigb,chi2);
+ } else fner("No values in range\n");
+}
+
+static double sqrarg;
+#define SQR(a) (sqrarg=(a),sqrarg*sqrarg)
+
+void fitlsq(RANGE *rrr,int ndata, double *a, double *b, double *siga, double *sigb, double *chi2, double *q) {
+ RANGE rr;
+ double x,y,sx=0,sy=0,st2=0,t,ss,sigdat,sxoss;
+ char *s;
+ *b = 0.0;
+ for (rr = *rrr;range_next(&rr);) {
+ get_cellboth(rr.col,rr.row,&x,&s);
+ get_cellboth(rr.col+1,rr.row,&y,&s);
+ if (s==NULL) {
+ sx += x;
+ sy += y;
+ }
+ }
+ ss = ndata;
+ sxoss = sx/ss;
+ for (rr = *rrr;range_next(&rr);) {
+ get_cellboth(rr.col,rr.row,&x,&s);
+ get_cellboth(rr.col+1,rr.row,&y,&s);
+ if (s==NULL) {
+ t=x-sxoss;
+ st2 += t*t;
+ *b += t*y;
+ }
+ }
+ *b /= st2;
+ *a = (sy-sx*(*b))/ss;
+ *siga = sqrt((1.0+sx*sx/(ss*st2))/ss);
+ *sigb = sqrt(1.0/st2);
+ *chi2=0.0;
+ for (rr = *rrr;range_next(&rr);) {
+ get_cellboth(rr.col,rr.row,&x,&s);
+ get_cellboth(rr.col+1,rr.row,&y,&s);
+ if (s==NULL) {
+ *chi2 += SQR(y-(*a)-(*b)*x);
+ }
+ }
+ *q = 1.0;
+ sigdat = sqrt((*chi2)/(ndata-2));
+ *siga *= sigdat;
+ *sigb *= sigdat;
+}
diff --git a/src/manip/cmd.h b/src/manip/cmd.h
new file mode 100644
index 0000000..776c359
--- /dev/null
+++ b/src/manip/cmd.h
@@ -0,0 +1,87 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#ifndef INC_CMD_H
+#define INC_CMD_H
+
+void do_command(char *cmd);
+void passcmd(char *source,char *tk[],int *ntok);
+void do_assign(char *t1, char *t2);
+void evaluate(char *exp, double *v);
+bool range_next(RANGE *r);
+bool range_def(const char *sxx, RANGE *r);
+char *range_int(char *s, int *v);
+void swapint(int *a, int *b);
+void cmd_load(char *fname, const char *range, int ntok);
+void m_tokinit(const char *termset);
+char *m_tokend(char *s);
+void cmd_load_list(RANGE *r, char *inbuff);
+void cmd_load_line(int x, int y, char *inbuff);
+void load_str(int x, int y, char *s);
+void cmd_save(char *fname, const char *range, const char *format, int ntok);
+int strcpydecimal(char *dest, char *src, int wid, int dpoints);
+int strcpywidth(char *dest, char *src, int wid);
+void set_outwidth(char *s);
+char *unquote(char *s);
+void cmd_copy(char *src, char *dest, char *ifexp, int ntok, int always);
+void cmd_generate(char *patx, char *dest, int ntok);
+bool gen_next(char *pat, double *v);
+void cmd_polish(char *exp);
+void cmd_eval(int x1, int y1, double *v);
+void cmd_delete(char *range, char *ifexp, int ntok);
+void cmd_sort(char *range, char *ifexp, int ntok);
+void sort_shuffle(int i, int r1, int *pnt);
+void cmd_insert(char *range);
+void cmd_data(char *range);
+bool swap_def(char *s, RANGE *r);
+void cmd_swap(char *range);
+void log_open(char *fname);
+void log_write(char *s);
+void log_close();
+void add_dotman(char *s);
+void at_open(char *fname);
+bool at_read(char *s);
+void strip_colon(char *s);
+void cmd_parsum(char *range, char *dest);
+void cmd_sum(char *range);
+void rangestd(RANGE *rr, double mean, int32 numrow, double *variance, double *stddev);
+void cmd_clear(char *range);
+void cmd_fit(char *range);
+void fitlsq(RANGE *rrr,int ndata, double *a, double *b, double *siga, double *sigb, double *chi2, double *q);
+
+#endif
diff --git a/src/manip/color.h b/src/manip/color.h
new file mode 100644
index 0000000..e80cef1
--- /dev/null
+++ b/src/manip/color.h
@@ -0,0 +1,51 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+/* colors are defined by ncurses library */
+/* #ifndef HAVE_NCURSES_H */
+#if !defined(__UNIX__) && !( defined(__OS2__) && defined(__EMX__) )
+
+#define COLOR_CLEAR 0XFF000000
+#define COLOR_BLACK 0X01000000
+#define COLOR_WHITE 0X01FFFFFF
+#define COLOR_RED 0X01FF0000
+#define COLOR_GREEN 0X0100FF00
+#define COLOR_BLUE 0X010000FF
+#define COLOR_GREY 0X017F7F7F
+
+#endif
diff --git a/src/manip/cursesscr.cpp b/src/manip/cursesscr.cpp
new file mode 100644
index 0000000..6dd8ac8
--- /dev/null
+++ b/src/manip/cursesscr.cpp
@@ -0,0 +1,239 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#include "all.h"
+
+delay(int i)
+{}
+int vx_top=1,vx_bot=24;
+textattr()
+{}
+kbhit()
+{}
+scr_gets(char *x)
+{
+ getstr(x);
+}
+clreol()
+{
+ clrtoeol();
+}
+cputs(const char *line)
+{
+ int x;
+ int y;
+ getyx(stdscr,y,x);
+ mvaddstr(y,x,line);
+}
+delline()
+{
+ int x;
+ int y;
+ getyx(stdscr,y,x);
+ move(22,1);
+ clrtobot();
+ move(y,1);
+ deleteln();
+ move(y,x);
+}
+gotoxy(int x, int y)
+{
+ if (y==25) y=24;
+ move(y+vx_top-2,x);
+}
+insline()
+{
+ int x;
+ int y;
+ getyx(stdscr,y,x);
+ move(y,x);
+ insertln();
+ move(y,x);
+ move(22,1);
+ clrtobot();
+ move(y,x);
+
+}
+putch(int char_val)
+{
+ int x;
+ int y;
+ getyx(stdscr,y,x);
+ mvaddch(y,x,char_val);
+}
+int scr_manip_refresh()
+{
+ manip_refresh();
+}
+int scr_getch()
+{
+ return getch();
+}
+manip_scr_init()
+{
+ initscr();
+ scrollok(stdscr,true);
+}
+scr_end()
+{
+ endwin();
+}
+textbackground(int color_num)
+{}
+textcolor(int colornum)
+{}
+gettextinfo(struct text_info *r)
+{
+ int x;
+ int y;
+ getyx(stdscr,y,x);
+ r->curx = x;
+ r->cury = y;
+ r->wintop = vx_top;
+}
+screen_save()
+{}
+screen_restore()
+{
+ scr_norm();
+ clrscr();
+ gotoxy(1,1);
+ cputs("\n");
+}
+int wyerr;
+w_message(char *s)
+{
+ wyerr++;
+ scr_savexy();
+ gotoxy(1,wyerr);
+ clreol();
+ cputs(s);
+ scr_restorexy();
+}
+window(int left,int top, int right, int bottom)
+{
+ if (left==1 && top==1 && bottom==25) {
+ printf("\x1b[%d;%dr",1,24);
+ }
+ vx_top = top;
+ vx_bot = bottom;
+ wyerr = 0;
+}
+clrscr()
+{
+ if (vx_top==1 && vx_bot==25) {
+ clearok(stdscr,TRUE);
+ clear();
+ manip_refresh();
+ clearok(stdscr,FALSE);
+ return;
+ }
+ clear();
+}
+scr_dots(int i)
+{
+}
+scr_left(int i)
+{
+ int y,x;
+ if (i<=0) return;
+ getyx(stdscr,y,x);
+ move(y,x-i);
+}
+scr_right(int i)
+{
+ int y,x;
+ if (i<=0) return;
+ getyx(stdscr,y,x);
+ move(y,x+i);
+}
+int vx_topsave,vx_botsave;
+int savex,savey;
+scr_savexy()
+{
+ getyx(stdscr,savey,savex);
+ vx_topsave = vx_top;
+ vx_botsave = vx_bot;
+
+}
+scr_restorexy()
+{
+ move(savey,savex);
+ vx_top = vx_topsave;
+ vx_bot = vx_botsave;
+}
+
+scr_norm() /* yellow on blue */
+{
+ clrattr(_BOLD | _REVERSE);
+}
+scr_inv() /* black on white */
+{
+ clrattr(_REVERSE);
+ setattr(_BOLD);
+}
+scr_grey() /* black on grey */
+{
+ clrattr(_BOLD);
+ setattr(_REVERSE);
+}
+scr_isblackwhite()
+{
+ return true;
+}
+scr_menubg()
+{
+ scr_norm();
+}
+scr_menuval()
+{
+ scr_inv();
+}
+scr_menuhi()
+{
+ scr_grey();
+}
+
+#include <descrip.h>
+vax_edt(char *s) /* call the vax EDT editor */
+{
+ $DESCRIPTOR(sdesc,"");
+ sdesc.dsc$a_pointer = s;
+ sdesc.dsc$w_length = strlen(s);
+ edt$edit(&sdesc,&sdesc);
+}
diff --git a/src/manip/edt.h b/src/manip/edt.h
new file mode 100644
index 0000000..7eb6456
--- /dev/null
+++ b/src/manip/edt.h
@@ -0,0 +1,48 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+enum {eup=129,edown,eleft,eright,epagedown,epageup,edelline
+ ,edeleol,eescape,eendoffile,etopoffile,edelright
+ ,eselect,ecut,ecopy,emark,epaste,emove
+ ,eeol,ebol,eword,ebword,ereturn,etrace
+ ,eblockread,eblockwrite
+ ,ehelp,edelete,eundelline,esearch,esearchreplace,efindnext
+ ,esaveas,esave,eload,equit,edrawit,egraphmenu,eshowerror,egold
+ ,eundeleol,eexitnow,eshell,eedt,efast,ebackline,ebigleft,ebigright};
+
+
diff --git a/src/manip/eval.cpp b/src/manip/eval.cpp
new file mode 100644
index 0000000..1691ae8
--- /dev/null
+++ b/src/manip/eval.cpp
@@ -0,0 +1,445 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+/*---------------------------------------------------------------------------*/
+
+#include "all.h"
+#include "mygraph.h"
+#include "eval.h"
+
+typedef union {
+ struct {unsigned char r,g,b,f;} rgb ;
+ int32 l;
+} colortyp;
+colortyp colvar;
+
+char *eval_str();
+int pass_marker(char *s);
+
+/*---------------------------------------------------------------------------*/
+/* bin = 10..29, binstr = 30..49, fn= 60...139, userfn=200..nnn */
+/* pcode:, 1=exp,len 2=double,val 3=var,int32 4,string_var, 5=string,.../0 */
+/*---------------------------------------------------------------------------*/
+/* Input is exp-pcode, output is number or string */
+
+const char *binop[] = { "", "+", "-", "*", "/", "^", "=", "<", "<=", ">", ">=", "<>", ".AND.", ".OR." };
+
+struct keyw { char *word; int index; int ret,np,p[5]; } ;
+extern struct keyw keywfn[] ;
+
+double stk[60];
+int stk_var[100];
+char *stk_str[100];
+int stk_strlen[100];
+char sbuf[512];
+char sbuf2[112];
+int nstk=0;
+extern int gle_debug;
+#define dbg if ((gle_debug & 2)>0)
+
+void eval(int32 *pcode,int *cp,double *oval,char *ostr,int *otyp) {
+ /* a pointer to the pcode to execute */
+ /* Current point in this line of pcode */
+ /* place to put result number */
+ /* place to put result string */
+ /* place to put result type, 1=num, 2=str */
+ union {double d; int32 l[2];} both;
+ int plen,i,c;
+ time_t today;
+ double xx;
+
+ dbg gprint("%%EXP-START, Current point in eval %d %d \n",*cp,(int) *(pcode+(*cp)));
+ dbg for (i=0;i<10;i++) gprint("%ld ",*(pcode+i));
+ dbg gprint("\n");
+ dbg debug_polish(pcode,cp);
+ if (*(pcode+(*cp))==8) { /* Single constant */
+ both.l[0] = *(pcode+ ++(*cp));
+ both.l[1] = 0;
+ dbg gprint("Constant %ld \n",both.l[0]);
+ memcpy(oval,&both.d,sizeof(both.d));
+ memcpy(&both.d,oval,sizeof(both.d));
+ ++(*cp);
+ return;
+ }
+
+ if (*(pcode+(*cp)++)!=1) {
+ gprint("PCODE, Expecting expression, v=%ld cp=%d \n",*(pcode+((*cp)-1)),*cp);
+ return;
+ }
+ plen = *(pcode+*(cp));
+ dbg gprint(" plen = %d ",plen);
+ if (plen>1000) gprint("Expession is suspiciously int32 %d \n",plen);
+ for (c=(*cp)+1;c<=(plen+ *cp);c++) {
+ switch (*(pcode+c)) {
+ /* Special commands 1..9 ------------------------------- */
+ case 1: /* Start of another expression (function param) */
+ c++; /* skip over exp length */
+ break;
+ case 2: /* doubleing point number follows */
+ *otyp = 1;
+ both.l[0] = *(pcode+(++c));
+ both.l[1] = *(pcode+(++c));
+ stk[++nstk] = both.d;
+ dbg gprint("Got double %f %d %f \n",stk[nstk],nstk,(double)*(pcode+(c)));
+ break;
+ case 3: /* doubleing_point variable number follows */
+ *otyp = 1;
+ var_get(*(pcode+(++c)),&xx);
+ dbg gprint("Got variable value %ld %f \n",*(pcode+(c)),xx);
+ stk[++nstk] = xx;
+ break;
+ case 4: /* string variable number follows */
+ *otyp = 2;
+ var_getstr(*(pcode+(++c)),sbuf); nstk++;
+ if (stk_str[nstk]!=NULL) myfree(stk_str[nstk]);
+ stk_str[nstk] = sdup(sbuf);
+ break;
+ case 5: /* Null terminated string follows (int32 alligned) */
+ *otyp = 2;
+ c++;nstk++;
+ strcpy(sbuf,eval_str(pcode,&c));
+ if (stk_str[nstk]!=NULL) myfree(stk_str[nstk]);
+ stk_str[nstk] = sdup(sbuf);
+ break;
+ /* Numeric Binary operators 10..29 ----------------------- */
+ case 11: /* + */
+ nstk--;
+ stk[nstk] = stk[nstk+1] + stk[nstk];
+ break;
+ case 12: /* - */
+ stk[nstk-1] = stk[nstk-1] - stk[nstk];
+ nstk--;
+ break;
+ case 13: /* * */
+ stk[nstk-1] = stk[nstk-1] * stk[nstk];
+ nstk--;
+ break;
+ case 14: /* / */
+ if (stk[nstk]==0) {
+ gprint("Divide by zero %g %g \n",
+ stk[nstk-1],stk[nstk]);
+ } else {
+ stk[nstk-1] = stk[nstk-1] / stk[nstk];
+ }
+ nstk--;
+ break;
+ case 15: /* ^ */
+ stk[nstk-1] = pow(stk[nstk-1],stk[nstk]);
+ nstk--;
+ break;
+ case 16: /* = */
+ nstk--;
+ if (stk[nstk] == stk[nstk+1]) stk[nstk]=true;
+ else stk[nstk]=false;
+ break;
+ case 17: /* < */
+ nstk--;
+ if (stk[nstk] < stk[nstk+1]) stk[nstk]=true;
+ else stk[nstk]=false;
+ break;
+ case 18: /* <= */
+ nstk--;
+ if (stk[nstk] <= stk[nstk+1]) stk[nstk]=true;
+ else stk[nstk]=false;
+ break;
+ case 19: /* > */
+ nstk--;
+ if (stk[nstk] > stk[nstk+1]) stk[nstk]=true;
+ else stk[nstk]=false;
+ break;
+ case 20: /* >= */
+ nstk--;
+ if (stk[nstk] >= stk[nstk+1]) stk[nstk]=true;
+ else stk[nstk]=false;
+ break;
+ case 21: /* <> */
+ nstk--;
+ if (stk[nstk] != stk[nstk+1]) stk[nstk]=true;
+ else stk[nstk]=false;
+ break;
+ case 22: /* .AND. */
+ nstk--;
+ if (stk[nstk] && stk[nstk+1]) stk[nstk]=true;
+ else stk[nstk]=false;
+ break;
+ case 23: /* .OR. */
+ nstk--;
+ if (stk[nstk] || stk[nstk+1]) stk[nstk]=true;
+ else stk[nstk]=false;
+ break;
+ /* String Binary operators 30..49 ----------------------- */
+ case 31: /* + */
+ *otyp = 2;
+ nstk--;
+ if (stk_str[nstk]!=NULL) strcpy(sbuf,stk_str[nstk]);
+ if (stk_str[nstk+1]!=NULL) strcat(sbuf,stk_str[nstk+1]);
+ if (stk_str[nstk] != NULL) myfree(stk_str[nstk]);
+ stk_str[nstk] = sdup(sbuf);
+ break;
+ case 32: /* - */
+ break;
+ case 33: /* * */
+ break;
+ case 34: /* / */
+ break;
+ case 35: /* ^ */
+ break;
+ case 36: /* = */
+ break;
+ case 37: /* < */
+ break;
+ case 38: /* <= */
+ break;
+ case 39: /* > */
+ break;
+ case 40: /* >= */
+ break;
+ case 41: /* .AND. */
+ break;
+ case 42: /* .OR. */
+ break;
+
+ /* Built in functions 60..199 ----------------------------- */
+ case f_plus: /* unary plus */
+ break;
+ case f_minus: /* unary minus */
+ stk[nstk] = -stk[nstk];
+ break;
+ case f_abs: /* abs */
+ stk[nstk] = fabs(stk[nstk]);
+ break;
+ case f_atn: /* atn */
+ if (stk[nstk]<0) stk[nstk] = -atan(-stk[nstk]);
+ else stk[nstk] = atan(stk[nstk]);
+ break;
+ case f_cell: /* cell(x,y) */
+ get_cell((int)stk[nstk-1],(int)stk[nstk],&stk[nstk-1]);
+ nstk--;
+ break;
+ case f_miss: /* miss(x,y) */
+ nstk--;
+ if (strcmp(scell((int)stk[nstk],(int)stk[nstk+1]),"-")==0) {
+ stk[nstk]=true;
+ } else {
+ stk[nstk]=false;
+ }
+ break;
+ case f_cos: /* cos */
+ stk[nstk] = cos(stk[nstk]);
+ break;
+ case f_date: /* date$ */
+ *otyp = 2;
+ time(&today);
+ strcpy(sbuf2,ctime(&today));
+ strcpy(sbuf,sbuf2);
+ strcpy(sbuf+11,sbuf2+20);
+ sbuf[strlen(sbuf)-1] = 0;
+ setdstr(&stk_str[++nstk],sbuf);
+ break;
+ case f_exp: /* exp */
+ stk[nstk] = exp(stk[nstk]);
+ break;
+ case f_fix: /* fix*/
+ stk[nstk] = floor(stk[nstk]);
+ break;
+ case f_left: /* left$ */
+ *otyp = 2;
+ ncpy(sbuf,stk_str[nstk-1],(int) stk[nstk]);
+ setdstr(&stk_str[--nstk],sbuf);
+ break;
+ case f_len: /* len */
+ *otyp = 1;
+ stk[nstk] = strlen(stk_str[nstk]);
+ break;
+ case f_log: /* log */
+ stk[nstk] = log(stk[nstk]);
+ break;
+ case f_log10: /* log10 */
+ stk[nstk] = log10(stk[nstk]);
+ break;
+ case f_not: /* not */
+ break;
+ case f_num: /* num$ */
+ *otyp = 2;
+ sprintf(sbuf,"%g ",stk[nstk]);
+ if (stk_str[nstk] != NULL) myfree(stk_str[nstk]);
+ stk_str[nstk] = sdup(sbuf);
+ break;
+ case f_num1: /* num1$ */
+ *otyp = 2;
+ sprintf(sbuf,"%g",stk[nstk]);
+ if (stk_str[nstk] != NULL) myfree(stk_str[nstk]);
+ stk_str[nstk] = sdup(sbuf);
+ break;
+ case f_pos: /* pos */
+ break;
+ case f_right: /* right$ */
+ *otyp = 2;
+ strcpy(sbuf,stk_str[nstk-1] + (int) stk[nstk] - 1);
+ setdstr(&stk_str[--nstk],sbuf);
+ break;
+ case f_rnd: /* rnd */
+ break;
+ case f_seg: /* seg$ */
+ *otyp = 2;
+ strcpy(sbuf,stk_str[nstk-2] + (int) stk[nstk-1] - 1);
+ ncpy(sbuf2,sbuf,(int)(stk[nstk] - stk[nstk-1] + 1));
+ nstk-=2;
+ setdstr(&stk_str[nstk],sbuf2);
+ break;
+ case f_sgn: /* sgn */
+ break;
+ case f_sin: /* sin */
+ stk[nstk] = sin(stk[nstk]);
+ break;
+ case f_sqr: /* sqr */
+ stk[nstk] = pow(stk[nstk],2.0);
+ break;
+ case f_sqrt: /* sqrt */
+ stk[nstk] = sqrt(stk[nstk]);
+ break;
+ case f_tan: /* tan */
+ stk[nstk] = tan(stk[nstk]);
+ break;
+ case f_time: /* time$ */
+ *otyp = 2;
+ time(&today);
+ ncpy(sbuf,ctime(&today)+11,9);
+ setdstr(&stk_str[++nstk],sbuf);
+ break;
+ case f_val: /* val */
+ break;
+ /* User function 200..nnn , or error */
+ default:
+ /* Is it a user defined function */
+ if (*(pcode+c)>200) {
+ /* pass the address of some numbers */
+ /* pass address of variables if possible*/
+ sub_call(*(pcode+c)-200,stk,stk_str,&nstk);
+ }
+ else gprint("Unrecognezed pcode exp prim %d at position=%d \n",(int)*(pcode+c),c);
+ break;
+ }
+ }
+ dbg printf("RESULT ISa ==== %d [1] %f [nstk] %f \n",nstk,stk[1],stk[nstk]);
+ dbg scr_getch();
+ memcpy( oval,&(stk[nstk]),sizeof(double));
+ *ostr = '\0';
+ if (*otyp==2) if (stk_str[nstk]!=NULL) strcpy(ostr,stk_str[nstk]);
+ if (*otyp==2) dbg gprint("Evaluated string = {%s} \n",ostr);
+ nstk--;
+ if (nstk<0) {
+ gprint("Stack stuffed up in EVAL %d \n",nstk);
+ nstk = 0;
+ }
+ *cp = *cp + plen + 1;
+}
+
+void debug_polish(int32 *pcode,int *zcp) {
+ int32 *cp,cpval;
+ int plen,c,cde;
+ cpval = *zcp;
+ cp = &cpval;
+ if (*(pcode+(*cp)++)!=1) {
+ gprint("Expecting expression, v=%d \n",(int) *(pcode+--(*cp)) );
+ return;
+ }
+ plen = *(pcode+*(cp));
+ gprint("Expression length %d current point %d \n",plen,(int) *cp);
+ if (plen>1000) gprint("Expession is suspiciously int %d \n",plen);
+ for (c=(*cp)+1;(c-*cp)<=plen;c++) {
+ cde = *(pcode+c);
+ gprint("Code=%d ",cde);
+ if (cde==0) {
+ gprint("# ZERO \n");
+ } else if (cde==1) {
+ gprint("# Expression, length ??? \n");
+ c++;
+ } else if (cde==2) {
+ gprint("# doubleing point number %8x \n",(int)*(pcode+(++c)));
+ c++; /* because it's a DOUBLE which is a quad word */
+ } else if (cde==3) {
+ gprint("# Variable \n"); c++;
+ } else if (cde==4) {
+ gprint("# String Variable \n"); c++;
+ } else if (cde==5) {
+ c++;
+ gprint("# String constant {%s} \n",eval_str(pcode,&c));
+ } else if (cde<29) {
+ gprint("# Binary operator {%s} \n",binop[cde-10]);
+ } else if (cde<49) {
+ gprint("# Binary string op {%s} \n",binop[cde-30]);
+ } else if (cde<200) {
+ gprint("# Built in function (with salt) {%s} \n",keywfn[cde-60].word);
+ } else {
+ gprint("# User defined function %d \n",cde);
+ }
+
+ }
+}
+
+char *eval_str(int32 *pcode,int *plen) {
+ char *s;
+ int sl;
+ s = (char *) (pcode+*plen);
+ sl = strlen(s)+1;
+ sl = ((sl + 3) & 0xfffc);
+ *plen = *plen + sl/4 - 1;
+ return s;
+}
+
+void setdstr(char **s,char *in) {
+ if (*s != NULL) myfree(*s);
+ *s = sdup(in);
+}
+
+void eval_setxy(int x, int y) {
+ static int xx= -1,yy= -1,type;
+ if (xx== -1) var_findadd("C",&xx,&type);
+ if (yy== -1) var_findadd("R",&yy,&type);
+ var_set(xx,(double) x);
+ var_set(yy,(double) y);
+}
+
+void eval_setxyd(int x, int y) {
+ static int xx= -1,yy= -1,type;
+ if (xx== -1) var_findadd("DC",&xx,&type);
+ if (yy== -1) var_findadd("DR",&yy,&type);
+ var_set(xx,(double) x);
+ var_set(yy,(double) y);
+}
diff --git a/src/manip/eval.h b/src/manip/eval.h
new file mode 100644
index 0000000..6731058
--- /dev/null
+++ b/src/manip/eval.h
@@ -0,0 +1,55 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#ifndef INC_EVAL_H
+#define INC_EVAL_H
+
+void eval_setxyd(int x, int y);
+void eval_setxy(int x, int y);
+void eval(int32 *pcode,int *cp,double *oval,char *ostr,int *otyp);
+void debug_polish(int32 *pcode,int *zcp);
+char *eval_str(int32 *pcode,int *plen);
+void setdstr(char **s,char *in);
+
+enum {f_plus=61 ,f_minus ,f_abs ,f_atn ,f_cos , f_date ,f_exp ,f_fix
+ ,f_int ,f_left ,f_len ,f_log ,f_log10 ,f_not
+ ,f_num ,f_num1 ,f_pos ,f_right ,f_rnd ,f_seg
+ ,f_sgn ,f_sin ,f_sqr ,f_sqrt ,f_tan ,f_time
+ ,f_val ,f_cell,f_miss };
+
+#endif
diff --git a/src/manip/ffblk_def.h b/src/manip/ffblk_def.h
new file mode 100644
index 0000000..2ed2a5f
--- /dev/null
+++ b/src/manip/ffblk_def.h
@@ -0,0 +1,51 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+//
+//
+// ffblk_def.h
+//
+#ifndef INCLUDE_FFBLCK
+#define INCLUDE_FFBLCK
+
+struct ffblk{
+ char *ff_name;
+};
+
+#endif
+
diff --git a/src/manip/filemenu.cpp b/src/manip/filemenu.cpp
new file mode 100644
index 0000000..ea05401
--- /dev/null
+++ b/src/manip/filemenu.cpp
@@ -0,0 +1,690 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#include "all.h"
+#include "color.h"
+#include "edt.h"
+
+#define WHITE 15
+#define BLACK 0
+#define BEGINDEF extern
+#define BCOLOR BLUE
+#define FCOLOR MAGENTA
+#define HBCOLOR h_bcolor
+#define HVCOLOR h_fcolor
+#define VCOLOR WHITE
+
+int h_bcolor;
+int h_fcolor;
+int getsize(void);
+char *tabtospace(char *s);
+void printdash(int i);
+int gle_redraw(void);
+int text_showerror(void);
+char *strfile(char *s);
+
+int vdelete(int i);
+int vinsert(int y, char *s);
+void m_ifsend(char *s);
+void m_sendline(void);
+int minit_extras(void);
+int minit_extras(void);
+void initmenu(void);
+int mystrlen(const char *s);
+int pick_file(char *d, const char *w);
+void setvstr(char **d, const char *s);
+int text_inkey(void);
+
+struct menu_struct { int x; int y; char *title; int width; int typ; int typ2;
+ char *val; char *help; };
+typedef struct menu_struct menutype;
+struct pmenu_struct {int ci; menutype *menu; };
+typedef struct pmenu_struct pmenutype;
+pmenutype pmenu[17];
+void setmenu(menutype *m,int x, int y, int typ, int typ2, int width, const char *title, const char *val, const char *help);
+bool do_menu(pmenutype *p);
+int extractmenu(void);
+void add_unrecognized(char *s);
+int fillinmenu(int nbegin);
+int nunrec;
+
+#define PTXT 0
+enum {MEND,MTEXT,MFILE,MTOGON,MTOGOFF,MSUB,MRETURN,MNULL};
+enum {SNORM,SROL,SNEXTS,SNEXT,SSTR,STOG,SS,SSIZE,SNOBOX,SAMOVE,SSOFF,SSNULL};
+
+void manip_refresh_menu(struct menu_struct *m);
+void menu_hilight(struct menu_struct *m);
+void menu_norm(struct menu_struct *m);
+
+/* menu's
+ topmenu
+ title,xtitle,ytitle min max dist on off, ticks dticks
+ (2) let d = exp
+ Data files
+ Dn marker ,color, lwidth, lstyle, err,
+ xnamesmenu
+ ynamesmenu
+ fillmenu
+ barmenu
+ axismenu's
+*/
+int read_default(char *result, char *ques, char *dflt) {
+ char s[200];
+ int r = 0;
+ strcpy(s,ques); strcat(s," ["); strcat(s,dflt); strcat(s,"] ");
+/* r = read_input(result,s);*/
+ if (strlen(result)==0) strcpy(result,dflt);
+ return r;
+}
+extern int changed;
+
+void addline(char *s) {
+ changed = true;
+}
+
+const char *mark_names[] = {
+ "dot", "square", "fcircle", "club", "diamond", "triangle", "snake", "otimes", "odot", ""};
+
+int m_gstart,m_gend;
+/*
+
+ Getkey/command
+ arrowkeys normal
+ left and right arrow if editing
+ delete
+ insert normal character
+ enter, change to new menu
+ escape exit.
+ F1, help key
+*/
+char mbuff[255];
+
+extern int iserr;
+int hcx,cx,hcy; /* HIlighted current x,y */
+
+bool do_menu(pmenutype *ppmenu) {
+ menutype *cm,*cmi,*si=NULL,*mi;
+ int citem,emode=false;
+ int c;
+ cm = ppmenu->menu;
+ citem = ppmenu->ci;
+ cmi = cm+citem;
+ manip_refresh_menu(cm);
+ menu_hilight(cmi);
+ for (;;) {
+ c = text_inkey();
+ if (iserr) {fner_clear(); window(1,1,80,24);}
+ switch (c) {
+ case eescape: /* ESCAPE */
+ case equit: /* control c */
+ return true;
+ case eleft: /* left */
+ if (emode) {
+ if (cx>0) cx--;
+ gotoxy(hcx+cx,hcy);
+ } else {
+ for (si=NULL,mi=cm;mi->typ!=0;mi++) {
+ if (mi->y==cmi->y && mi->x < cmi->x) {
+ if (si!=NULL) {
+ if (mi->x > si->x) si = mi;
+ } else {
+ si = mi;
+ }
+ }
+ }
+ }
+ break;
+ case eright: /* right */
+ if (emode) {
+ if (cx < (int)strlen(cmi->val)) cx++;
+ gotoxy(hcx+cx,hcy);
+ } else {
+ for (si=NULL,mi=cm;mi->typ!=0;mi++) {
+ if (mi->y==cmi->y && mi->x > cmi->x) {
+ if (si!=NULL) {
+ if (mi->x < si->x)
+ si = mi;
+ } else {
+ si = mi;
+ }
+ }
+ }
+ }
+ break;
+ case eup: /* arrow up */
+ emode = false;
+ for (si=NULL,mi=cm;mi->typ!=0;mi++) {
+ if (mi->typ<MNULL) {
+ if (si!=NULL) if (mi->y==si->y)
+ if (abs(mi->x - cmi->x) < abs(si->x - cmi->x))
+ si = mi;
+ if (mi->y < cmi->y) {
+ if (si!=NULL) {
+ if (mi->y > si->y) si = mi;
+ } else {
+ si = mi;
+ }
+ }
+ }
+ }
+ break;
+ case edown: /* arrow down */
+ emode = false;
+ for (si=NULL,mi=cm;mi->typ!=0;mi++) {
+ if (mi->typ<MNULL) {
+ if (si!=NULL) if (mi->y==si->y)
+ if (abs(mi->x - cmi->x) < abs(si->x - cmi->x))
+ si = mi;
+ if (mi->y > cmi->y) {
+ if (si!=NULL) {
+ if (mi->y < si->y) si = mi;
+ } else {
+ si = mi;
+ }
+ }
+ }
+ }
+ break;
+ case ehelp: /* f1 help */
+ do_help(cmi->help);
+ manip_refresh_menu(cm);
+ menu_hilight(cmi);
+ break;
+ case ereturn: /* carriage return */
+ if (emode==true && cmi->typ==MFILE) {
+ emode = false;
+ break;
+ }
+ emode = false;
+ switch (cmi->typ) {
+ case MTEXT:
+/* if (emode) emode = false; else emode = true; */
+ break;
+ case MTOGON:
+ cmi->typ = MTOGOFF;
+ menu_hilight(cmi);
+ break;
+ case MTOGOFF:
+ cmi->typ = MTOGON;
+ menu_hilight(cmi);
+ break;
+ case MRETURN:
+ goto exit_menu;
+ case MFILE:
+ if (mystrlen(cmi->val)==0) cmi->val = (char*)calloc(20,1);
+ pick_file(cmi->val,"*.dat");
+ manip_refresh_menu(cm);
+ menu_hilight(cmi);
+ break;
+ case MSUB: /* SUB MENU */
+ if (cmi->typ2>99) do_menu(&pmenu[cmi->typ2 - 100]);
+ manip_refresh_menu(cm);
+ menu_hilight(cmi);
+ }
+
+ for (si=NULL,mi=cm;mi->typ!=0;mi++) {
+ if (mi->y==cmi->y && mi->x > cmi->x) {
+ if (si!=NULL) {
+ if (mi->x < si->x) si = mi;
+ } else {
+ si = mi;
+ }
+ }
+ }
+
+ break;
+ case edelete: /* delete */
+ emode = true;
+ if (cmi->val==NULL) break;
+ if (strlen(cmi->val)==0) break;
+ if (cx<1) break;
+ ncpy(mbuff,cmi->val,cx-1);
+ strcat(mbuff,cmi->val + cx);
+ setvstr(&cmi->val,mbuff);
+ cx--;
+ gotoxy(hcx+cx,hcy);
+ cputs(cmi->val + cx);
+ putch(DASHCHAR);
+ gotoxy(hcx+cx,hcy);
+ break;
+ case edrawit:
+ break;
+ case eshowerror:
+ break;
+ case esave: /* save file */
+ break;
+ default: /* normal key */
+ if (c<26 && c!=9) {fner("Key has no affect"); break;}
+ if (c>200) fner("Unimplemented command");
+ else {
+/* if (cmi->typ!=MTEXT && cmi->typ!=MFILE) goto doreturn; */
+ emode = true;
+ if (cmi->val==NULL) setvstr(&cmi->val,"");
+ ncpy(mbuff,cmi->val,cx);
+ mbuff[cx] = c; mbuff[cx+1] = 0;
+ strcat(mbuff,cmi->val + cx);
+ setvstr(&cmi->val,mbuff);
+ gotoxy(hcx+cx,hcy);
+ cputs(cmi->val + cx);
+ cx++;
+ gotoxy(hcx+cx,hcy);
+ }
+ break;
+ }
+ if (si!=NULL) {
+ menu_norm(cmi);
+ cmi = si;
+ menu_hilight(cmi);
+ si = NULL;
+ }
+ }
+exit_menu:;
+ /* save current point */
+ { int i;
+ for (i=0,mi=cm;mi->typ!=0;mi++,i++) {
+ if (mi==cmi) ppmenu->ci = i;
+ }
+ }
+ return false; /* normal exit */
+}
+
+void setvstr(char **d, const char *s) {
+ if ((*d) != 0) myfree(*d);
+ *d = sdup(s);
+}
+
+int mystrlen(const char *s) {
+ if (s==NULL) return 0;
+ else return strlen(s);
+}
+
+void menu_hilight(struct menu_struct *mm) {
+ int j;
+ struct menu_struct *m=mm;
+ scr_menuhi();
+ hcx = m->x + mystrlen(m->title);
+ hcy = m->y;
+ gotoxy(hcx,hcy);
+ if (m->typ==MTOGON || m->typ==MTOGOFF) {
+ if (m->val==NULL) m->val = (char*)malloc(4);
+ if (m->typ==MTOGON) strcpy(m->val,"ON ");
+ if (m->typ==MTOGOFF) strcpy(m->val,"OFF");
+ }
+ if (m->val==NULL) setvstr(&m->val,"");
+ cputs(m->val);
+ j = m->width - mystrlen(m->val);
+ printdash(j);
+ cx = mystrlen(m->val);
+ gotoxy(hcx+cx,hcy);
+}
+
+void printdash(int j) {
+ int i;
+ for (i=0;i<j;i++) mbuff[i] = DASHCHAR;
+ mbuff[j] = 0;
+ if (j>0) cputs(mbuff);
+}
+
+void menu_norm(struct menu_struct *mm) {
+ int j;
+ struct menu_struct *m=mm;
+ gotoxy(m->x + mystrlen(m->title),m->y);
+ if (m->typ==MTOGON || m->typ==MTOGOFF) {
+ if (m->val==NULL) m->val = (char*)malloc(4);
+ if (m->typ==MTOGON) strcpy(m->val,"ON ");
+ if (m->typ==MTOGOFF) strcpy(m->val,"OFF");
+ }
+ if (m->val != NULL) {
+ scr_menuval();
+ if (m->width>0) cputs(m->val);
+ scr_menubg();
+ }
+ j = m->width - mystrlen(m->val);
+ printdash(j);
+}
+
+void manip_refresh_menu(struct menu_struct *mm) {
+ struct menu_struct *m=mm;
+ window(1,1,80,24);
+ scr_menubg();
+ clrscr();
+ for (;m->typ!=0;m++) {
+ if (m->title != NULL) if (strlen(m->title)>0) {
+ gotoxy(m->x,m->y);
+ cputs(m->title);
+ }
+ menu_norm(m);
+ }
+}
+
+void do_help(const char *k1, const char *k2) {
+ FILE *hfile;
+ int yy;
+ char hbuff[90];
+ const char *hfilename="manip.hlp";
+ char fk1[20],fk2[20];
+ scr_menuval();
+ clrscr();
+ if (strcmp(k2," ")==0) k2 = "";
+ gotoxy(1,1);
+ wprintf("Manip help on topic {%s}, sub topic {%s}",k1,k2);
+ scr_menubg();
+ hfile = fopen(gledir(hfilename).c_str(),"r");
+ if (hfile==NULL) {
+ gotoxy(1,3);
+ wprintf("Unable to open {%s} \n",gledir(hfilename).c_str());
+ text_inkey();
+ return;
+ }
+ for (;!feof(hfile);) {
+ if (fgets(hbuff,90,hfile)!=NULL) {
+ if (hbuff[0]=='3') {
+ strtok(hbuff," \n");
+ strcpy(fk1,strtok(NULL," \n"));
+ if (strcmp(fk1,k1)==0 && strlen(k2)==0)
+ goto help_type;
+ }
+ if (hbuff[0]=='4') {
+ strtok(hbuff," \n");
+ strcpy(fk2,strtok(NULL," \n"));
+ if (strlen(k2)>0)
+ if (strcmp(fk1,k1)==0 &&
+ strcmp(fk2,k2)==0) goto help_type;
+ }
+ }
+ }
+ fclose(hfile);
+ scr_menuval();
+ gotoxy(1,9);
+ wprintf("help text not found sorry ??? \n");
+ text_inkey();
+ return;
+help_type:;
+ yy = 3;
+ for (;!feof(hfile);) {
+ if (fgets(hbuff,90,hfile)!=NULL) {
+ if (isdigit(hbuff[0])) {
+ goto end_help;
+ }
+ gotoxy(1,yy++); cputs(tabtospace(hbuff));
+ }
+ if (yy==22) {
+ scr_menuval();
+ gotoxy(2,24); wprintf("Press any key for next screen of help");
+ text_inkey(); clrscr();
+ gotoxy(1,1); wprintf("Graph help on topic {%s}, sub topic {%s}",k1,k2);
+ scr_menubg(); yy = 3;
+ }
+ }
+end_help:;
+ scr_menuval();
+ gotoxy(1,yy+1); wprintf("Press any key to continue");
+ text_inkey();
+ fclose(hfile);
+}
+
+void add_unrecognized(char *s) {
+ if (nunrec>6) return;
+}
+
+void vunquote(char **ss) {
+ char *s = *ss;
+ if (*s=='\"') {
+ s[strlen(s)-1] = 0;
+ *ss = sdup(s+1);
+ myfree(s);
+ }
+}
+
+int initmenudone;
+menutype *m_pnt[20];
+menutype *m_end[20];
+char *m_val[20];
+char m_tog[50];
+
+void initmenu() {
+ menutype *mi;
+ int nt=0,z;
+ static int nv;
+
+ if (!initmenudone) {
+ initmenudone = true;
+ for (z=0;z<=10;z++) {
+ for (mi=pmenu[z].menu; mi->typ!=0; mi++) {
+ if (mi->typ==MTOGON || mi->typ==MTOGOFF) {
+ m_tog[nt++] = mi->typ;
+ }
+ if (mi->val!=NULL) {
+ m_val[nv] = sdup(mi->val);
+ mi->val = sdup(mi->val);
+ m_pnt[nv++] = mi;
+ }
+ }
+ }
+ } else {
+ for (z=0;z<=10;z++) {
+ for (mi=pmenu[z].menu; mi->typ!=0; mi++) {
+ if (mi->typ==MTOGON || mi->typ==MTOGOFF) {
+ mi->typ = m_tog[nt++];
+ } else {
+ if (mi->val!=0) {
+ myfree(mi->val);
+ }
+ mi->val = 0;
+ }
+ }
+ }
+ for (z=0;z<nv;z++) {
+ mi = m_pnt[z];
+ mi->val = sdup(m_val[z]);
+ }
+ }
+}
+
+char msend[200];
+#define mss msend+strlen(msend)
+char cs[80]="xyz";
+int gstartend;
+
+void m_sendline() {
+ msend[0] = 0;
+ strcpy(cs,"xyz");
+}
+
+void m_ifsend(char *s) {
+ if (strcmp(s,cs)!=0) {
+ m_sendline();
+ sprintf(msend,"\t%s ",s);
+ strcpy(cs,s);
+ }
+}
+
+void setmenu(menutype *m,int x, int y, int typ, int typ2, int width, const char *title, const char *val, const char *help) {
+ m->x = x; m->y = y; m->typ = typ; m->typ2 = typ2; m->width = width;
+ m->title = sdup(title);
+ if (val!=0) m->val = sdup(val);
+ m->help = sdup(help);
+}
+
+void init_menucolor() {
+ h_bcolor = WHITE; h_fcolor = BLACK;
+}
+
+int pick_file(char *result, const char *wld) {
+ pmenutype ask;
+ char wild[80];
+ char *f[80];
+ char *swap;
+ menutype *m,*mi,*mwild;
+#ifdef SOMEOS /* a.r. */
+ struct ffblk ffblk;
+#endif
+#ifdef DOS
+ HDIR hdir = HDIR_SYSTEM;
+ FILEFINDBUF3 FFbufr;
+ unsigned long SearchCnt = 1;
+#endif
+ int i,x,y,nf,rval,adddir=false;
+
+ strcpy(wild,wld);
+ ask.ci = 0;
+pick_again:;
+ x=0; y=0; nf=0;
+ init_menucolor();
+#ifdef SOMEOS /* a.r. */
+ done = findfirst(wild,&ffblk,0);
+ for (nf=0;nf<70 && !done;nf++) {
+ f[nf] = sdup(ffblk.ff_name);
+ done = findnext(&ffblk);
+ }
+#endif
+#ifdef DOS
+ done = DosFindFirst( wild,
+ &hdir,
+ 0,
+ &FFbufr,
+ sizeof(FFbufr),
+ &SearchCnt,
+ FIL_STANDARD);
+ for (nf=0;nf<70 && !done;nf++) {
+ f[nf] = sdup(FFbufr.achName);
+ done = DosFindNext( hdir,
+ &FFbufr,
+ sizeof(FFbufr),
+ &SearchCnt);
+ }
+#endif
+
+sortagain:;
+ swap = NULL;
+ for (i=0;i<(nf-1);i++) {
+ if (strcmp(f[i],f[i+1])>0) {
+ swap = f[i]; f[i] = f[i+1]; f[i+1] = swap;
+ }
+ }
+ if (swap != NULL) goto sortagain;
+
+ m = (menutype*)calloc(3+nf,sizeof(*m));
+ ask.menu = m;
+ ask.ci = 0;
+ if (nf==0) ask.ci = 1;
+ if (m==0) wprintf("memory allocation error");
+ for (mi=m,i=0;i<nf;i++,mi++) {
+ setmenu(mi,x*20+1,y+5,MRETURN,0,18,"",f[i],"");
+ x++;
+ if (x==4) {x=0; y++; }
+ }
+ setmenu(mi,5,1,MNULL,0,0,"Use arrow keys to select file then press return","","");
+ mi++;
+ setmenu(mi,5,3,MRETURN,0,30,"Disk/Dir Specification ",wild,"");
+ mwild = mi;
+ mi++; mi->typ = 0;
+ rval = do_menu(&ask);
+ strcpy(result,((ask.menu)[ask.ci]).val);
+
+ if (strcmp(wild,mwild->val)!=0) {
+ strcpy(wild,mwild->val);
+ if (strstr(wild,"*")==NULL) {
+ if (wild[strlen(wild)-1] == '\\')
+ strcat(wild,"*.dat");
+ else
+ strcat(wild,"\\*.dat");
+ }
+ adddir = true;
+ goto pick_again;
+ }
+
+ for (i=0;i<nf;i++) myfree(f[i]);
+ myfree(m);
+
+ if (adddir) {
+ *(strfile(wild)) = 0;
+#if (defined __TURBOC__ || defined DJ)
+ if (strstr(wild,":")!=NULL) {
+ setdisk(toupper(*wild)-'A');
+ }
+ strcpy(buff2,wild+2); strcpy(wild,buff2);
+#endif
+#ifdef EMXOS2 /* a.r. */
+ if (strstr(wild,":")!=NULL) {
+ DosSetDefaultDisk(toupper(*wild)-'A' + 1);
+ }
+ strcpy(buff2,wild+2); strcpy(wild,buff2);
+ if (_chdir2(wild)!=0) ; /* {perror("Cannot change dir"); delay(3000);} */
+#else
+ if (chdir(wild)!=0) ; /* {perror("Cannot change dir"); delay(3000);} */
+#endif
+ }
+
+/* if (adddir) {
+ *(strfile(wild)+1) = 0;
+ strcpy(result,wild);
+ strcat(result,((ask.menu)[ask.ci]).val);
+ }
+*/
+ return rval;
+}
+
+char *strfile(char *s) {
+ char *e;
+ e = s;
+ for (;*s!=0;s++) {
+ if (*s==']' || *s=='\\' || *s=='/' || *s==':') e = s;
+ }
+ return e;
+}
+
+char *tabtospace(char *s) {
+ static char buf[255];
+ char *o = &buf[0];
+ int p=0,k,df;
+ for (;*s!=0;s++) {
+ if (*s==9) {
+ df = (p/8)*8+8-p;
+ for (k=1;k<=df;k++) {
+ *o++ = ' ';
+ p++;
+ }
+ } else {
+ *o++ = *s;
+ p++;
+ }
+ }
+ *o = 0;
+ return &buf[0];
+}
diff --git a/src/manip/filemenu.h b/src/manip/filemenu.h
new file mode 100644
index 0000000..a8b89be
--- /dev/null
+++ b/src/manip/filemenu.h
@@ -0,0 +1,47 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#ifndef INC_FILEMENU_H
+#define INC_FILEMENU_H
+
+void do_help(const char *k1, const char *k2 = NULL);
+void init_menucolor(void);
+int pick_file(char *result, const char *wld);
+
+#endif
+
diff --git a/src/manip/files.txt b/src/manip/files.txt
new file mode 100644
index 0000000..f9c72bb
--- /dev/null
+++ b/src/manip/files.txt
@@ -0,0 +1,72 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+#
+# files list for GLE to be included by the makefiles
+#
+
+PROGRAM = \
+manip
+
+INCLUDES = \
+all.h \
+cell.h \
+cmd.h \
+color.h \
+edt.h \
+eval.h \
+ffblk_def.h \
+filemenu.h \
+keyword.h \
+manip.h \
+mjl.h \
+mscreen.h \
+mygraph.h \
+nofnkeys.h \
+unix_extra.h \
+vaxconio.h
+
+OBJECTS = \
+cell.$(OBJ_SUFF) cmd.$(OBJ_SUFF) eval.$(OBJ_SUFF) filemenu.$(OBJ_SUFF) \
+fn.$(OBJ_SUFF) general.$(OBJ_SUFF) keyword.$(OBJ_SUFF) \
+manip.$(OBJ_SUFF) mjl.$(OBJ_SUFF) polish.$(OBJ_SUFF) sub.$(OBJ_SUFF) token.$(OBJ_SUFF) \
+var.$(OBJ_SUFF) unix_extra.$(OBJ_SUFF) unixinkey.$(OBJ_SUFF) varargs.$(OBJ_SUFF) unixscr.$(OBJ_SUFF)
+
+EXTRA_OBJS = \
+../gle/cutils.$(OBJ_SUFF) \
+../gle/file_io.$(OBJ_SUFF)
diff --git a/src/manip/fn.cpp b/src/manip/fn.cpp
new file mode 100644
index 0000000..6621dbd
--- /dev/null
+++ b/src/manip/fn.cpp
@@ -0,0 +1,117 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#include "all.h"
+#include "eval.h"
+
+/*------------------------------------------------------------------*/
+/* Find the function callped *cp, and return it's number */
+/*------------------------------------------------------------------*/
+
+/* You can add a function, you MUST place it in alphabetical order */
+/* and give it the next unused index number */
+
+/* ret = Type of returned value, 1=number, 2=string */
+/* np = number of parameters expected */
+/* Parameters p0...p4 == 1=number, 2=string, 0=none (e.g. height()) . */
+
+#define NKEYS (sizeof keywfn / sizeof(struct keyw))
+struct keyw { const char *word; int index; int ret,np,p[5]; } keywfn[] = {
+ /* r np p1p2p3p4p5 */
+ { " ",0 ,1 ,0 ,{ 0,0,0,0,0 } }
+ ,{ "+",f_plus ,1 ,0 ,{ 0,0,0,0,0 } }
+ ,{ "-",f_minus ,1 ,0 ,{ 0,0,0,0,0 } }
+ ,{ "ABS",f_abs ,1 ,1 ,{ 1,0,0,0,0 } }
+ ,{ "ATN",f_atn ,1 ,1 ,{ 1,0,0,0,0 } }
+ ,{ "CELL",f_cell ,1 ,2 ,{ 1,1,0,0,0 } }
+ ,{ "COS",f_cos ,1 ,1 ,{ 1,0,0,0,0 } }
+ ,{ "DATE$",f_date ,2 ,0 ,{ 0,0,0,0,0 } }
+ ,{ "EXP",f_exp ,1 ,1 ,{ 1,0,0,0,0 } }
+ ,{ "FIX",f_fix ,1 ,1 ,{ 1,0,0,0,0 } }
+ ,{ "INT",f_int ,1 ,1 ,{ 1,0,0,0,0 } }
+ ,{ "LEFT$",f_left ,2 ,2 ,{ 2,1,0,0,0 } }
+ ,{ "LEN",f_len ,1 ,1 ,{ 2,0,0,0,0 } }
+ ,{ "LOG",f_log ,1 ,1 ,{ 1,0,0,0,0 } }
+ ,{ "LOG10",f_log10 ,1 ,1 ,{ 1,0,0,0,0 } }
+ ,{ "MISS",f_miss ,1 ,2 ,{ 1,1,0,0,0 } }
+ ,{ "NOT",f_not ,1 ,1 ,{ 1,0,0,0,0 } }
+ ,{ "NUM$",f_num ,2 ,1 ,{ 1,0,0,0,0 } }
+ ,{ "NUM1$",f_num1 ,2 ,1 ,{ 1,0,0,0,0 } }
+ ,{ "POS",f_pos ,1 ,2 ,{ 2,1,0,0,0 } }
+ ,{ "RIGHT$",f_right,2 ,2 ,{ 2,1,0,0,0 } }
+ ,{ "RND",f_rnd ,1 ,1 ,{ 1,0,0,0,0 } }
+ ,{ "SEG$",f_seg ,2 ,3 ,{ 2,1,1,0,0 } }
+ ,{ "SGN",f_sgn ,1 ,1 ,{ 1,0,0,0,0 } }
+ ,{ "SIN",f_sin ,1 ,1 ,{ 1,0,0,0,0 } }
+ ,{ "SQR",f_sqr ,1 ,1 ,{ 1,0,0,0,0 } }
+ ,{ "SQRT",f_sqrt ,1 ,1 ,{ 1,0,0,0,0 } }
+ ,{ "TAN",f_tan ,1 ,1 ,{ 1,0,0,0,0 } }
+ ,{ "TIME$",f_time ,2 ,0 ,{ 0,0,0,0,0 } }
+ ,{ "VAL",f_val ,1 ,1 ,{ 2,0,0,0,0 } }
+} ;
+
+int binsearch(char *word, struct keyw tab[], int n);
+
+void find_un(char *cp, int *idx,int *ret,int *np,int **plist) {
+ int i;
+ i = binsearch(cp,keywfn,NKEYS);
+ *idx = keywfn[i].index;
+ *ret = keywfn[i].ret;
+ *np = keywfn[i].np;
+ *plist = &keywfn[i].p[0];
+}
+
+/*------------------------------------------------------------------*/
+/* Simple binary search */
+/*------------------------------------------------------------------*/
+
+int binsearch(char *word, struct keyw tab[], int n) {
+ int cond,low,high,mid;
+ low = 0;
+ high = n-1;
+ while (low <= high) {
+ mid = (low+high) / 2;
+ if ((cond = strcmp(word,tab[mid].word)) < 0)
+ high = mid - 1;
+ else if (cond > 0)
+ low = mid + 1;
+ else
+ return mid;
+ }
+ return 0;
+}
diff --git a/src/manip/general.cpp b/src/manip/general.cpp
new file mode 100644
index 0000000..4fc658c
--- /dev/null
+++ b/src/manip/general.cpp
@@ -0,0 +1,119 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#define pi 3.14159265
+#define farcalloc calloc
+
+#include "all.h"
+
+void polar_xy(double r, double angle, double *dx, double *dy) {
+ *dx = r*cos(angle*3.14159265/180);
+ *dy = r*sin(angle*3.14159265/180);
+}
+
+void xy_polar(double dx,double dy,double *radius,double *angle) {
+ if (dx==0 && dy==0) {
+ printf("Cannot work out angle of zero length vector\n");
+ return;
+ }
+ if (dx==0) {
+ *angle = 90;
+ if (dy<0) *angle = -90;
+ } else {
+ *angle = atan2(dy,dx)*180/pi;
+ }
+ *radius = sqrt(pow(dx,2)+pow(dy,2));
+}
+
+void ncpy(char *d, const char *s, int n) {
+ strncpy(d,s,n);
+ *(d+n) = 0;
+}
+
+void ncat(char *d, char *s, int n) {
+ int i;
+ i = strlen(d);
+ strncat(d,s,n);
+ *(d+i+n) = 0;
+}
+
+char *sdup(const char *s) {
+ char *v;
+ v = (char*)malloc(strlen(s)+1);
+ strcpy(v,s);
+ return v;
+}
+
+/*
+var_getstr(int varnum,char *s){}
+sub_clear(void){}
+int sub_def(char *s){}
+sub_call(int idx,double *pval,char **pstr,int *npm){}
+sub_find(char *s,int *idx,int *zret, int *np, int **plist){*idx = 0;}
+sub_get_startend(int idx, int *ss, int *ee){}
+sub_param(int idx,char *s){}
+sub_set_return(double d){}
+sub_set_startend(int idx, int ss, int ee){}
+var_add(char *name,int *idx,int *type){}
+var_find(char *name,int *idx,int *type){*idx = 0;}
+var_findadd(char *name,int *idx,int *type){}
+var_get(int jj, double *v){}
+var_nlocal(int *l){}
+var_set(int jj, double v){}
+var_setstr(int jj, char *s){}
+*/
+
+void *myallocz(int32 size) {
+ static void *p;
+ p = farcalloc(1,size);
+ return p;
+}
+
+void mystrcpy(char **d, const char *s) {
+ if (*d!=0) free(*d);
+ *d = 0;
+ *d = (char*)malloc(strlen(s)+1);
+ if (d==NULL) gle_abort("Memory gone\n");
+ strcpy(*d,s);
+}
+
+void do_pcode() {
+}
+
+int gpcode;
+int gplen;
diff --git a/src/manip/keyword.cpp b/src/manip/keyword.cpp
new file mode 100644
index 0000000..4af9568
--- /dev/null
+++ b/src/manip/keyword.cpp
@@ -0,0 +1,148 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#include "all.h"
+#include "keyword.h"
+
+/*------------------------------------------------------------------*/
+/* Find the KEY WORD *cp, and return it's number */
+/*------------------------------------------------------------------*/
+
+/* You can add a function, you MUST place it in alphabetical order */
+
+
+#define NKEYS (sizeof mkeywfn / sizeof(struct mkeyw))
+struct mkeyw { const char *word; int index; } mkeywfn[] = {
+ { "!", k_comment }
+ , { "AT", k_at }
+ , { "BLANK", k_clear }
+ , { "CALL", k_call }
+ , { "CLEAR", k_clear }
+ , { "CLOSE", k_close }
+ , { "COPY", k_copy }
+ , { "DATA", k_data }
+ , { "DEL", k_delete }
+ , { "DELETE", k_delete }
+ , { "ELSE", k_else }
+ , { "EXIT", k_exit }
+ , { "FIT", k_fit }
+ , { "GEN", k_generate }
+ , { "GENERATE", k_generate }
+ , { "GOTO", k_goto }
+ , { "HELP", k_help }
+ , { "IF", k_if }
+ , { "INPUT", k_input }
+ , { "INSERT", k_insert }
+ , { "LET", k_let }
+ , { "LIST", k_list }
+ , { "LOAD", k_load }
+ , { "LOG", k_logging }
+ , { "LOGG", k_logging }
+ , { "LOGGING", k_logging }
+ , { "MOVE", k_move }
+ , { "NEW", k_new }
+ , { "NEXT", k_next }
+ , { "PARSUM", k_parsum }
+ , { "PRINT", k_print }
+ , { "PROP", k_prop }
+ , { "PROPAGATE",k_prop }
+ , { "QUIT", k_quit }
+ , { "SAVE", k_save }
+ , { "SET", k_set }
+ , { "SHELL", k_shell }
+ , { "SORT", k_sort }
+ , { "SUM", k_sum }
+ , { "SWAP", k_swap }
+};
+
+int binsearchk(char *word, struct mkeyw tab[], int n);
+
+void cmd_name(int idx, char **cp) {
+ static char *kp;
+ static char fail[]="Keyword not found";
+ if (kp==NULL) kp = (char*)myallocz(80);
+ for (unsigned int i=0;i<NKEYS;i++) {
+ if (mkeywfn[i].index==idx) {
+ strcpy(kp,mkeywfn[i].word);
+ *cp = kp;
+ return;
+ }
+ }
+ *cp = &fail[0];
+}
+
+void find_mkey(char *cp, int *idx) {
+ int i;
+ i = binsearchk(cp,mkeywfn,NKEYS);
+ if (i==-1) { *idx = 0; return;}
+ *idx = mkeywfn[i].index;
+}
+
+/*------------------------------------------------------------------*/
+/* Simple binary search */
+/*------------------------------------------------------------------*/
+
+int binsearchk(char *word, struct mkeyw tab[], int n) {
+ int cond,low,high,mid;
+ low = 0;
+ high = n-1;
+ while (low <= high) {
+ mid = (low+high) / 2;
+ if ((cond = strcmp(word,tab[mid].word)) < 0)
+ high = mid - 1;
+ else if (cond > 0)
+ low = mid + 1;
+ else
+ return mid;
+ }
+ return -1;
+}
+
+/*-------------------------------------------------------------------------*/
+/* This is for the tex primitives */
+
+struct mkeyw tkeywfn[] = {
+{ 0,0} };
+
+#define NTKEYS (sizeof tkeywfn / sizeof(struct mkeyw))
+int find_primcmd(char *cp) {
+ int i;
+ i = binsearchk(cp,tkeywfn,NTKEYS);
+ if (i==-1) return 0;
+ return tkeywfn[i].index;
+}
diff --git a/src/manip/keyword.h b/src/manip/keyword.h
new file mode 100644
index 0000000..e3ceb5d
--- /dev/null
+++ b/src/manip/keyword.h
@@ -0,0 +1,43 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+enum { k_save=1, k_load, k_quit, k_exit, k_if, k_for, k_next, k_end
+ , k_call, k_else, k_print, k_input, k_generate, k_at, k_comment
+ , k_let, k_copy, k_move, k_set ,k_delete ,k_data ,k_insert
+ ,k_goto ,k_logging ,k_prop ,k_sort ,k_swap, k_close, k_clear
+ ,k_help, k_list, k_sum, k_parsum, k_shell, k_new, k_fit};
diff --git a/src/manip/manip.cpp b/src/manip/manip.cpp
new file mode 100644
index 0000000..49b5eeb
--- /dev/null
+++ b/src/manip/manip.cpp
@@ -0,0 +1,620 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#include "all.h"
+#include "edt.h"
+
+#define WLEN 4
+#define WEND 24
+#define BCOLOR BLUE
+#define FCOLOR MAGENTA
+
+#include "../gle/file_io.h"
+
+/* function prototypes */
+
+/*
+manip /com=a.a
+
+ manip_refresh screen.
+ edit cell mode,
+ command mode.
+ arrow keys scroll screen.
+
+ data cell:range
+ cell:range = expression
+ expressions, c,r,x,y,c1..cn,r1..rn,sum(range),
+ c(x-1,y) = c(x,y)
+
+*/
+/* global stuff */
+int noscreenio;
+int gle_debug;
+int moving_x,moving_y;
+int data_x;
+int data_y;
+int changed;
+extern int islogging;
+extern int isating;
+/* local stuff */
+int iserr,dont_clear;
+int scr_frow=1,scr_fcol=1;
+int scr_width=76,scr_colwidth=8;
+int scr_ncol;
+int scr_nrow=18;
+int curx,cury;
+int max_x=0,max_y=0; /* change to 1,1 */
+
+int scr_blackwhite;
+int exit_manip;
+char file_name[80];
+int in_recover,single_step;
+extern char strmiss[];
+
+void init_gle_top(char **argv);
+
+int main(int argc, char **argv) {
+ int i;
+ char ans[90];
+ int cmd;
+ static char atfile[80];
+
+ init_gle_top(argv);
+ manip_scr_init(NULL);
+
+ if (strmiss[0]==0) strcpy(strmiss,"-");
+
+ for (i=1;i<argc;i++) {
+ gle_strupr( argv[i] );
+ if (strncmp( argv[i] , "-RECOVER",2)==0) in_recover = true;
+ else if (strncmp( argv[i] , "-STEP",3)==0) single_step = true ;
+ else if (strncmp( argv[i] , "-SIZE",4)==0) {
+ data_setsize(atoi(argv[i+1]),atoi(argv[i+2]));
+ i+=2;
+ }
+ else if (strncmp( argv[i] , "-COMMANDS",2)==0) strcpy(atfile,argv[++i]);
+ else if (strncmp( argv[i] , "-DEBUG",2)==0) ;
+ else if (strncmp( argv[i] , "-FLOAT",2)==0) set_usefloat();
+ else if (strncmp( argv[i] , "-SINGLE",4)==0) set_usefloat();
+ else if (isalnum(*argv[i])) strcpy(file_name, argv[i]);
+ else {
+ printf("Unrecognized parameter {%s} \n",argv[i]);
+ printf("Usage: MANIP infile.dat -recover -step -commands c.log -single -size x y\n");
+ exit(0);
+ }
+ }
+ init_logging(file_name);
+
+
+ if (atfile[0]!=0) at_open(atfile);
+ gle_strlwr(file_name);
+ if (strlen(file_name)>0) cmd_load(file_name,"",2);
+xx1:
+ if (strlen(file_name)==0) strcpy(file_name,"mtest.dat");
+ set_colwidth(10);
+ changed = false;
+ for (;exit_manip==false;) {
+ top_line();
+ hi_cell(curx,cury);
+ mjl_flush();
+ read_command(&cmd,ans,"% ");
+ if (cmd==eescape || cmd==equit) break;
+ if (cmd==0) do_command(ans);
+ else if (cmd==eload) {
+ pick_file(ans,"*.dat");
+ manip_refresh();
+ clear_data();
+ cmd_load(ans,"",2);
+ } else if (cmd==ehelp) {
+ do_help("MANIP","");
+ manip_refresh();
+ } else if (cmd==esave) {
+ text_save();
+ manip_refresh();
+ } else if (cmd==eload) {
+ manip_refresh();
+ } else do_arrow(cmd);
+ }
+ if (cmd==eescape) if (text_changed()) { exit_manip = false; goto xx1;}
+ window_exit();
+ if (islogging) log_close();
+ scr_end();
+ return 0;
+}
+
+bool text_changed() {
+ int c;
+ if (!changed) return false;
+ for (;;) {
+ fner("Save in {%s} ? (Y,N)",file_name);
+ c = text_inkey();
+ fner_clear();
+ if (c==eescape) return true;
+ if (tolower(c)=='n') return false;
+ if (tolower(c)=='y') {text_save(); return false;}
+ }
+}
+
+void text_save() {
+ cmd_save(file_name,"","",2);
+ changed = false;
+}
+
+void fix_cur() {
+ if (curx<1) curx = 1;
+ if (cury<1) cury = 1;
+}
+
+void shift_window() {
+ int doit=false;
+ fix_cur();
+ if (curx<scr_fcol || curx >= scr_fcol + scr_ncol) {
+ scr_fcol = curx - scr_ncol/2;
+ if (scr_fcol<1) scr_fcol = 1;
+ doit = true;
+ }
+ if (cury<scr_frow || cury >= scr_frow + scr_nrow) {
+ scr_frow = cury - scr_nrow/2;
+ if (scr_frow<1) scr_frow = 1;
+ doit = true;
+ }
+ if (doit) manip_refresh();
+}
+
+void do_arrow(int k) {
+ char buff[280];
+ show_cellwide(curx,cury);
+ moving_x = moving_y = 0;
+ switch (k) {
+ case eup: cury--; moving_y = -1; break;
+ case edown: cury++; moving_y = 1; break;
+ case eright: curx++; moving_x = 1; break;
+ case eleft: curx--; moving_x = -1; break;
+ case edelline: cury+=12; break;
+ case esearch: cury-=12; break;
+ case ebigright: curx+=6; break;
+ case ebigleft: curx-=6; break;
+ }
+ fix_cur();
+ sprintf(buff,"goto %d %d ",curx,cury);
+ if (islogging) log_write(buff);
+ shift_window();
+ hi_cell(curx,cury);
+}
+
+void set_newxy(int x, int y) {
+ show_cellwide(curx,cury);
+ curx = x;
+ cury = y;
+ shift_window();
+ hi_cell(curx,cury);
+}
+
+void window_norm() {
+ window(1,1,80,25);
+}
+
+void window_exit() {
+ window(1,1,80,25);
+ gotoxy(1,25);
+ scr_norm();
+ printf("\n");clreol();
+}
+
+void set_colwidth(int n) {
+ scr_colwidth = n;
+ scr_ncol = scr_width/scr_colwidth;
+ shift_window();
+ manip_refresh();
+}
+
+void set_ncol(int n) {
+ scr_ncol = n;
+ scr_colwidth = scr_width/scr_ncol;
+ shift_window();
+ manip_refresh();
+}
+
+void top_line() {
+ gotoxy(1,1); clreol();
+ #ifdef MANIPCURPOS /* a.r.: to see, which cell is edited, if -DNOATTRIB */
+ wprintf("Free=%ld Current Cell( c = %d, r = %d ) MANIP 3.3 File={%s}"
+ ,coreleft(),curx,cury,file_name);
+ #else
+ wprintf("Free=%ld Used(%d,%d) MANIP 3.3 Current file={%s}"
+ ,coreleft(),max_x,max_y,file_name);
+ #endif
+}
+
+void manip_refresh() {
+ int i,j;
+
+ fix_cur();
+ window_norm();
+ scr_norm();
+ clrscr();
+ top_line();
+ fner_clear();
+
+ scr_menuhi();
+ for (i=1;i<=scr_ncol;i++) {
+ gotocell(i+scr_fcol-1,scr_frow-1);
+ wprintf("c%d",i+scr_fcol-1);
+ }
+ for (i=1;i<=scr_nrow;i++) {
+ gotocell(scr_fcol-1,i+scr_frow-1);
+ wprintf("r%d",i+scr_frow-1);
+ }
+ scr_norm();
+
+ for (j=0;j<scr_nrow;j++) {
+ for (i=0;i<scr_ncol;i++) {
+ show_cell(i+scr_fcol,j+scr_frow);
+ }
+ }
+ iserr = true;
+ fner_clear();
+ hi_cell(curx,cury);
+}
+
+void hi_cell(int x,int y) {
+ scr_menuhi();
+ show_cellwide(x,y);
+ scr_norm();
+}
+
+void gotocell(int x,int y) {
+ if (x==scr_fcol-1) gotoxy( (x-scr_fcol+1)*scr_colwidth+1,(y-scr_frow)+3);
+ else gotoxy( (x-scr_fcol)*scr_colwidth+6,(y-scr_frow)+3);
+}
+
+void show_ifcell(int x, int y) {
+ if (x>=scr_fcol && x<(scr_fcol+scr_ncol)) {
+ if (y>=scr_frow && y<(scr_frow+scr_nrow)) {
+ show_cellwide(x,y);
+ }
+ }
+}
+
+void show_cell(int x, int y) {
+ gotocell(x,y);
+ cputs(scell(x,y));
+}
+
+void show_cellwide(int x, int y) {
+ char buff[280];
+ gotocell(x,y);
+ strcpy(buff,scell(x,y));
+ if ((int)strlen(buff)<(scr_colwidth-1))
+ ncpy(buff+strlen(buff)," ",
+ scr_colwidth-strlen(buff)-1);
+ cputs(buff);
+}
+
+#ifdef __UNIX__
+void wprintf_do(char *s) {
+ printw("%s",s);
+}
+
+void fner_do(char *output) {
+ if (strchr(output,'\n')!=NULL) *strchr(output,'\n') = 0;
+ fnerx(output);
+}
+
+void printmess_do(char *output) {
+ if (strchr(output,'\n')!=NULL) *strchr(output,'\n') = 0;
+ fnerxx(output);
+}
+#endif
+
+/* Prints to the window */
+#ifdef __UNIX__
+void wprintf(const char* arg_list, ...) {
+#else
+void wprintf(va_list arg_list, ...) {
+#endif
+ va_list arg_ptr;
+ char *format;
+ char output[200];
+
+ va_start(arg_ptr, arg_list);
+ format = (char*)arg_list;
+ vsprintf(output, format, arg_ptr);
+#ifdef __TURBOC__
+ printf(output);
+#else
+ cputs(output);
+#endif
+}
+
+void d_tidyup() {
+}
+
+void gle_abort(const char *s) {
+ fner("ABORT {%s}\n",s);
+ exit(1);
+}
+
+void fner_clear(void) {
+ if (iserr==false) return;
+ if (dont_clear) return;
+ scr_savexy();
+ window_norm();
+ gotoxy(1,25);
+ scr_grey();
+ clreol();
+ gotoxy(2,25);
+ cputs(function_bar());
+ scr_norm();
+ iserr = false;
+ window_norm();
+ scr_restorexy();
+}
+
+void fnerx(char *s) {
+ if (dont_clear) return;
+ scr_savexy();
+ iserr = true;
+ window_norm();
+ gotoxy(1,25);
+ scr_inv();
+ clreol();
+ gotoxy(2,25);
+ cputs(s);
+ scr_norm();
+ scr_restorexy();
+ scr_refresh();
+}
+
+void fnerxx(char *s) {
+ scr_savexy();
+ command_scroll_up();
+ iserr = true;
+ window_norm();
+ gotoxy(1,23);
+ scr_inv();
+ clreol();
+ gotoxy(2,23);
+ cputs(s);
+ scr_norm();
+ scr_restorexy();
+ scr_refresh();
+}
+
+int read_command(int *cmd,char *ans,const char *ques) {
+ static char *lastline[22];
+ int cl=0;
+ int rr,i;
+ int direc=0;
+
+ if (isating) {
+ if (!at_read(ans)) goto contxx;
+ window(1,21,80,WEND);
+ gotoxy(1,WLEN);
+ scr_inv();
+ clreol();
+ gotoxy(2,WLEN);
+ clreol(); *cmd = 0;
+ cputs(ques); cputs(ans); rr = false;
+ goto xxend;
+ }
+contxx:;
+ *ans = 0;
+ iserr = true;
+ window(1,21,80,WEND);
+ gotoxy(1,WLEN);
+ scr_inv();
+ clreol();
+xxxx:
+ #ifndef EMXOS2 /* cause EMX has not really a function window() a.r. */
+ gotoxy(2,WLEN);
+ #else
+ gotoxy(1,24);
+ #endif
+ clreol();
+ cputs(ques);
+ rr = read_str(cmd,ans);
+ if (*cmd == epageup) {
+ if (direc==-1) cl++;
+ if (lastline[cl]!=NULL) {
+ strcpy(ans,lastline[cl]);
+ cl++;
+ }
+ if (cl>18) cl = 0;
+ direc = 1;
+ goto xxxx;
+ }
+ if (*cmd == epagedown) {
+ if (direc==1) cl--;
+ cl--;
+ direc = -1;
+ if (cl<0) {cl = -1; *ans = 0; goto xxxx;}
+ if (lastline[cl]!=NULL) strcpy(ans,lastline[cl]);
+ goto xxxx;
+ }
+xxend:
+ gotoxy(1,WLEN);
+ if (strlen(ans)>0) {
+ if (lastline[20]!=NULL) free(lastline[20]);
+ for (i=20;i>0;i--) lastline[i] = lastline[i-1];
+ lastline[0] = sdup(ans);
+ command_scroll_up();
+ }
+ scr_norm();
+#ifndef EMXOS2 /* a.r. */
+ clreol();
+#endif
+ window_norm();
+ return rr;
+}
+
+int read_str(int *cmd, char *s) {
+ int c,cx=0;
+ char mbuff[280];
+ *cmd = 0;
+ cputs(s); cx = strlen(s);
+ for (;;) {
+ c = text_inkey();
+ if (iserr) fner_clear();
+ if (strlen(s)==0) {
+ switch (c) {
+ case edelline:
+ case esearch:
+ case ebigright:
+ case ebigleft:
+ case eup:
+ case edown:
+ case eleft:
+ case eright:
+ case equit:
+ case eescape:
+ case eload:
+ case esave:
+ case ehelp:
+ *cmd = c;
+ return false;
+ }
+ }
+ switch (c) {
+ case ebackline:
+ c = epageup;
+ case eload:
+ case esave:
+ case ehelp:
+ case epagedown:
+ case epageup:
+ *cmd = c;
+ return false;
+ case eescape: /* ESCAPE */
+ *cmd = c;
+ case equit: /* control c */
+ return true;
+ case eleft: /* left */
+ if (cx <= 0) break;
+ cx--;
+ scr_left(1);
+ break;
+ case eright: /* right */
+ if (cx >= (int)strlen(s)) break;
+ cx++;
+ scr_right(1);
+ break;
+ case edelline:
+ case esearch:
+ case ebigright:
+ case ebigleft:
+ case eup: /* arrow up */
+ case edown: /* arrow down */
+ break;
+ case ereturn: /* carriage return */
+ return false;
+ case edelete: /* delete */
+ if (strlen(s)==0) break;
+ if (cx<1) break;
+ ncpy(mbuff,s,cx-1);
+ strcat(mbuff,s + cx);
+ strcpy(s,mbuff);
+ cx--;
+ scr_left(1);
+ cputs(s + cx);
+ putch(' ');
+ scr_left(strlen(s+cx)+1);
+ break;
+ case eshowerror:
+ case edrawit:
+ break;
+ default: /* normal key */
+ if (c<26 && c!=9) {fner("Key has no affect"); break;}
+ if (c>200) fner("Unimplemented command");
+ else {
+ ncpy(mbuff,s,cx);
+ mbuff[cx] = c; mbuff[cx+1] = 0;
+ strcat(mbuff,s + cx);
+ strcpy(s,mbuff);
+ cputs(s + cx);
+ cx++;
+ scr_left(strlen(s+cx));
+ }
+ break;
+ }
+ }
+}
+
+void command_scroll_up() {
+ window(1,21,80,WEND);
+ gotoxy(1,1);
+ delline();
+}
+
+extern string GLE_TOP_DIR;
+
+void init_gle_top(char** argv) {
+ const char* top = getenv("GLE_TOP");
+ if (top == NULL || top[0] == 0) {
+ string exe_name;
+ bool has_exe_name = GetExeName("manip", argv, exe_name);
+ if (has_exe_name) {
+ #ifdef GLETOP_CD
+ GLE_TOP_DIR = exe_name;
+ StripPathComponents(&GLE_TOP_DIR, GLETOP_CD+1);
+ AddDirSep(GLE_TOP_DIR);
+ GLE_TOP_DIR += GLETOP_REL;
+ StripDirSep(GLE_TOP_DIR);
+ string hlp_name = GLE_TOP_DIR + DIR_SEP + "manip.hlp";
+ if (!GLEFileExists(hlp_name)) {
+ GLE_TOP_DIR = exe_name;
+ StripPathComponents(&GLE_TOP_DIR, 2);
+ }
+ #else
+ GLE_TOP_DIR = exe_name;
+ StripPathComponents(&GLE_TOP_DIR, 2);
+ #endif
+ } else {
+ // The user will see as error messege: "$GLE_TOP/some_file" not found.
+ GLE_TOP_DIR = "$GLE_TOP";
+ }
+ } else {
+ GLE_TOP_DIR = top;
+ }
+ StripDirSep(GLE_TOP_DIR);
+}
+
+char *gle_top() {
+ return (char*)GLE_TOP_DIR.c_str();
+}
+
diff --git a/src/manip/manip.h b/src/manip/manip.h
new file mode 100644
index 0000000..caae3a2
--- /dev/null
+++ b/src/manip/manip.h
@@ -0,0 +1,71 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#ifndef INC_MANIP_H
+#define INC_MANIP_H
+
+void top_line();
+void set_newxy(int x, int y);
+void window_norm();
+void window_exit();
+void set_colwidth(int n);
+void set_ncol(int n);
+void gle_abort(char *s);
+bool text_changed();
+void text_save(void);
+void command_scroll_up();
+int read_command(int *cmd,char *ans,char *ques);
+void fner_clear(void);
+void fnerx(char *s);
+void fnerxx(char *s);
+
+#if defined(__NOCYGWIN__)
+ #include <stdarg.h>
+#endif
+
+#if defined(__UNIX__) || ( defined(__OS2__) && defined(__EMX__) )
+ void fner(const char* arg_list, ...);
+ void printmess(const char* arg_list, ...);
+ void wprintf(const char* arg_list, ...);
+#else
+ void fner(va_list arg_list, ...);
+ void printmess(va_list arg_list, ...);
+ void wprintf(va_list arg_list, ...);
+#endif
+
+#endif
diff --git a/src/manip/manip.hlp b/src/manip/manip.hlp
new file mode 100644
index 0000000..f9f5b9f
--- /dev/null
+++ b/src/manip/manip.hlp
@@ -0,0 +1,383 @@
+
+3 MANIP
+ Manip is a data manipulation package. It reads in a text
+ file of numbers and displays them like a spreadsheet.
+ You can then do simple operations on the columns and write
+ them out in any format you like.
+ Further help is available on the following toppics via
+ the HELP command e.g. "HELP COPY"
+
+ @mycmds
+ Arrows
+ BLANK
+ CLEAR
+ CLOSE
+ COPY <range> <range> IF <exp>
+ DATA <range>
+ DELETE <range> IF <exp>
+ EXIT file_name <range> -TAB -SPACE -COMMA
+ FIT c3
+ Functions
+ GENERATE <pattern> <destination>
+ GOTO x y
+ INSERT <Cn> or <Rn>
+ LOAD filename <range> -0
+ LOAD filename <range>
+ LOGGING mycmds.man
+ MOVE <range> <range> IF <exp>
+ NEW
+ PARSUM <range1> <range2>
+ PROP <range> <range>
+ QUIT
+ Range (discussion on how to specify ranges)
+ Recover (recovering from power failure or crash)
+ SAVE file_name <range> -TAB -SPACE -COMMA
+ SET SIZE ncols nrows
+ SET BETWEEN " "
+ SET COLTYPE
+ SET COLWIDTH
+ SET NCOL n
+ SET DPOINTS n
+ SET DIGITS n
+ SET WIDTH n
+ SHELL
+ SORT <range> on <exp>
+ SUM <range>
+ SWAP CnCn | RnRn
+ Usage (command line usage)
+
+3 USAGE
+ MANIP infile.dat -recover -step -commands c.log -single -size x y
+
+ -recover Reads keys from the file MANIP_.J1 as if they were
+ typed by the user. This will restore you to the
+ point just before your pc crashed.
+ The last three journal files are stored (.j1 .j2 .j3)
+ simply copy the one you want to (.j1) to use it.
+
+ -step Used with recover, press a space for each key you
+ want to read from the journal file, press any other
+ key to stop reading the journal.
+
+ -commands filename.man
+ This reads the commands in filename.man as if they
+ were typed at the keyboard.
+
+ -single This makes MANIP use single precision arithmetic
+ and doesn't store strings at all, this enables
+ three times as much data in the same amount of memory
+
+ -size x y Sets the initial size of the spreadsheet. Use this
+ with large datasets as it prevents the heap from
+ becoming fragmented and thus lets you use much
+ larger datasets.
+
+3 RECOVER
+ Manip logs everything you type to a file called MANIP_.J1
+ When you use the -RECOVER option on the manip command it then
+ reads keys from that file as if they were typed at the keyboard.
+
+ -recover Reads keys from the file MANIP_.J1 as if they were
+ typed by the user. This will restore you to the
+ point just before your pc crashed.
+ The last three journal files are stored (.j1 .j2 .j3)
+ simply copy the one you want to (.j1) to use it.
+
+ -step Used with recover, press a space for each key you
+ want to read from the journal file, press any other
+ key to stop reading the journal.
+
+
+3 RANGE
+ Most manip commands accept a range as one or more of there
+ parameters. A range is a rectangular section of your
+ spreadsheet. A range can ether start with a 'c' or an
+ 'r' and this will affect how the command operates.
+
+ If your spreadsheet has 5 columns and 10 rows then.
+ c1 == c1c1r1r10 == 1,1 1,2 1,3 1,4 1,5 1,6 ...
+ r1 == r1r1c1c5 == 1,1 2,1 3,1 4,1 5,1
+ c1c2 ==c1c2r1r10 == 1,1 2,1 1,2 2,2 3,1 3,2 ...
+ r1r2c3=r1r2c3c5 == 3,1 3,2 4,1 4,2 5,1 5,2
+
+
+3 ARROWS
+ The arrow keys normally move the data cursor, however if you are half
+ way thru typing a command then, the left and right arrow keys allow you
+ to edit the command. Use the PAGE-UP and PAGE-DOWN keys to recall
+ your last command.
+
+ SHIFT arrow keys will jump 7 cells at a time for fast movement.
+
+3 COPY
+ For copying a section to another section. "% COPY <range1> <range2> if <exp>"
+ They do not have to be the same shape. The pointers to both rangers
+ are increased even if the number is not coppied e.g.
+ "% COPY r4r2 r1r2"
+ "% COPY c1c3r6r100 c6c8 if c1<c2"
+
+ "% COPY C1 C2 IF C1<4"
+ c1 c2
+ 1 1
+ 2 2
+ 5 -
+ 3 3
+ 9 -
+
+
+3 DELETE
+ For deleteing entire rows or columns. "% DELETE <range> [IF <exp>]"
+ e.g. "% DELETE c1c3 IF r1>3.and.r2=0
+ "% DELETE r1"
+ Numbers are shuffled in from the right to take the place of the
+ deleted range.
+
+3 DATA
+ Data entry mode is usefull for entering data. After typing in
+ "% DATA c1c3" or "% DATA C2" you can then enter data and pressing
+ <cr> will move you to the next valid data position.
+ In this mode text or numbers can be entered.
+ Press ESC to get back to command mode.
+
+3 FIT
+ "FIT C3" will fit a least squares regression line to the data
+ in columns c3 and c4 (x values taken from c3) and print
+ out the results.
+
+3 EXIT
+ EXIT saves the data in your input file spec and exits to DOS. You
+ can optionally specify an output file as well. eg. "% EXIT myfile.dat
+
+ The command "EXIT myfile.dat c3c5r1r3" will write out that range of
+ numbers to the file.
+
+ By default manip will write columns seperated by spaces.
+
+ The command "EXIT myfile.dat -TAB" will put a single tab between
+ each column of numbers and "EXIT myfile.dat -COMMA" will put a
+ comma and a space between each number. (these two options are
+ usefull if your data file is very big and you don't want to waste
+ diskspace with the space characters.) NOTE: The settings stay
+ in effect for future saves and exits.
+
+ You can make it line up the columns on the decimal point by typing in the
+ command. "SET DPOINTS 3"
+
+ You change the width of each column or completely remove the spaces
+ between columns with the command. "SET WIDTH 10" (or set width 0)
+
+ You can change the number of significant digits displayed with
+ the command "SET DIGITS 4"
+
+
+3 SAVE
+ Saves all or part of your data.
+ "SAVE myfile.dat"
+
+ The command "SAVE myfile.dat c3c5r1r3" will write out that range of
+ numbers to the file.
+
+ By default manip will write columns seperated by spaces.
+
+ The command "SAVE myfile.dat -TAB" will put a single tab between
+ each column of numbers and "SAVE myfile.dat -COMMA" will put a
+ comma and a space between each number. (these two options are
+ usefull if your data file is very big and you don't want to waste
+ diskspace with the space characters) NOTE: The settings stay
+ in effect for future saves and exits.
+
+ You can make it line up the columns on the decimal point by typing in the
+ command. "SET DPOINTS 3"
+
+ You change the width of each column or completely remove the spaces
+ between columns with the command. "SET WIDTH 10" (or set width 0)
+
+ You can change the number of significant digits displayed with
+ the command "SET DIGITS 4"
+
+3 GOTO
+ For moving the cursor directly to a point in your array.
+ e.g. "% GOTO x y"
+
+3 CLEAR
+ "% CLEAR C2C3" Clears the given range of all values
+
+3 BLANK
+ "% BLANK C2C3" Clears the given range of all values
+
+3 NEW
+ Clears the spread sheet of all data and frees memory.
+
+3 INSERT
+ Inserts a new column or row and shifts all others over.
+ e.g. "% INSERT c5" or "% INSERT r2".
+
+3 LOAD
+ Load data into columns. eg. "% LOAD filename" loads all data into corresponding
+ columns. "% LOAD filename c3" load first column of data into c3 etc.
+
+ "LOAD myfile.dat c3 -LIST"
+ This commmand will load the the data into a single column or range
+ (even if it is several columns wide in the data file)
+
+3 MOVE
+ For copying a section to another section. "% MOVE <range1> <range2> if <exp>"
+ They do not have to be the same shape. The pointer to the destination
+ is only increased if the line or column is coppied e.g.
+ "% MOVE c1 c2c3"
+ "% MOVE r4r2 r1r2"
+ "% MOVE c1c3r6r100 c6c8 if c1<c2"
+
+ "% MOVE C1 C2 IF C1<4"
+ c1 c2
+ 1 1
+ 2 2
+ 5 3
+ 3 -
+ 9 -
+
+ (See COPY command)
+
+3 SORT
+ Sort entire rows of the data based on the data in a particular column.
+ FORMAT: SORT <range> ON <exp>
+ e.g. "% SORT c8 on c9"
+ "% SORT c1c8 on -c8"
+ "% SORT c1c3 on c2 " !for sorting strings
+
+ This command works out how to sort the column (or exp) specified
+ in the ON part of the command. It then does that operation to
+ the range specified. e.g. "SORT C1 ON C1" will sort column one.
+
+ Use the additional qualifier -STRINGS if you want to sort a
+ column with strings in it. e.g. "sort c1 on c2 -strings"
+
+3 SWAP
+ Swap over two columns or rows.
+ e.g. "% SWAP c1c2"
+ "% SWAP r3r1"
+
+3 SET
+ SET SIZE ncols nrows
+ SET BETWEEN " "
+ SET COLWIDTH
+ SET COLTYPE [n] DECIMAL | EXP | BOTH | DPOINTS n
+ SET NCOL n
+ SET DPOINTS n
+ SET DIGITS n
+ SET WIDTH n
+
+4 WIDTH
+ Sets the width of padding to use for the columns when they
+ are written to a file.
+ The columns usually one space wider than this setting as
+ the BETWEEN string is usually set to one space by default.
+
+4 COLTYPE
+ This commands allows all or individual columns to be set to
+ different output types. If colnumber is missing then that
+ setting is applied to all columns.
+
+ SET COLTYPE Ccolnumber TYPE
+
+ Where TYPE is one of:
+
+ DECIMAL produces 123.456
+ EXP produces 1.23456e02
+ BOTH produces whichever is more suitable
+ DPOINTS n produces a fixed number of decimal places.
+
+ e.g.
+ SET COLTYPE c2 DECIMAL
+ SET COLTYPE c1 EXP
+ SET COLTYPE c3 DPOINTS 4
+
+ Would print out:
+ 1.2e02 1.2 1.2000
+
+ SET COLTYPE EXP (column number missed out)
+ Would print out:
+ 1.2e02 1.2e02 1.2e02
+
+4 COLWIDTH
+ Set the width of each column when displayed.
+ e.g. "% SET COLWIDTH 12"
+
+4 NCOL
+ Set the number of columns to display.
+ e.g. "% SET NCOL 3"
+
+4 SIZE
+ "SIZE 3 4" Truncates the spreadsheet to 3 columns and 4 rows. This
+ also sets the values to use for default ranges.
+
+4 BETWEEN
+ "SET BETWEEN "##"
+ Defines the string to be printed between each column of numbers
+ when written to a file. This is normally set to a single space.
+
+4 DPOINTS
+ Sets the number of decimal places to print. This is used for
+ producing columns which line up on the decimal point.
+ e.g. with DPOINTS 3.
+ 2.2 -> 2.200
+ 234 -> 234.000
+
+ (See also SET COLTYPE)
+
+4 DIGITS
+ Sets the number of significat digits to be displayed, e.g.
+ with DIGITS 3.
+ 123456 becomes 123000
+ 0.12345 becomes 0.123
+
+3 LOGGING
+ For creating command files. e.g.
+ "% LOG sin.man"
+ "% c2=sin(c1)
+ "% c3=c2+2
+ "% close"
+ Then type in "@sin" to execute these commands.
+
+3 PROPAGATE
+ This command has the same format as move. e.g
+ "% PROPAGATE <source> <destination>" The difference is that the
+ source is coppied as many times as possible to fill up the destination.
+ e.g. "% PROP c1r1r7 c2"
+
+3 SUM
+ Adds up all the numbers in a range and displays the total and average.
+ "% SUM C1C3"
+
+3 PARSUM
+ Adds up one coloumn, putting the partial sum's into another coloumn.e.g.
+ 1,2,3,4 becomes 1,3,6,10.
+ "% PARSUM C1 C4"
+
+3 GENERATE
+ For generating a patter of data e.g. 1 1 2 2 5 5 1 1 2 2 5 5 etc.
+ "% GEN 2(1,2,5)30 c4" !1 1 2 2 5 5 repeated 30 times
+ "% GEN (1:100:5)5 c1" !1 to 100 step 5, 5 times
+ "% GEN (1,2,*,3:5)5 c1" !missing values included
+
+3 FUNCTIONS
+ Calculations can be performed on rows or columns. eg "% C1=C2*3+R"
+ where "R" stands for row-number and C1 and C2 are columns.
+ They can also be performed on ROWS. eg "% r1=sin(r2)+log10(c)"
+
+ c1 = cell(c+1,r)+cell(c+2,r)
+ cell(1,3) = 33.3
+
+ Valid operators and functions: , + - ^
+ * / <= >= <> < > = )AND(
+ )OR( + - ABS( ATN( COS( EXP( FIX( INT(
+ LOG( LOG10( SGN( SIN( SQR( TAN( NOT( RND( SQRT(
+ .NE. .EQ. .LT. .GT. .LE. .GE. .NOT. .AND. .OR.
+ e.g. 3+4*COS(PI/180)^(3+1/30)+C1+R"
+
+3 QUIT
+ Abandon file.
+
+3 SHELL
+ Gives access to DOS.
+
diff --git a/src/manip/mjl.cpp b/src/manip/mjl.cpp
new file mode 100644
index 0000000..941ea5a
--- /dev/null
+++ b/src/manip/mjl.cpp
@@ -0,0 +1,91 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#include "all.h"
+#include "edt.h"
+#include "../gle/file_io.h"
+
+FILE *jouptr;
+extern int in_recover,single_step;
+
+void init_logging(char *infile) {
+ GLEFileIO jptr;
+ int nbRead = 0;
+ unsigned char ccc;
+ static char buff[80];
+ if (in_recover) {
+ jouptr = fopen("manip_.j1","rb");
+ if (jouptr==NULL) fner("Unable to open/read journal file manip_.j1");
+ nbRead += fread(&ccc,1,1,jouptr);
+ nbRead += fread(buff,1,ccc,jouptr);
+ if (strlen(infile)==0) strcpy(infile,buff);
+ return;
+ }
+ unlink("manip_.j3");
+ rename("manip_.j2","manip_.j3");
+ rename("manip_.j1","manip_.j2");
+ jptr.open("manip_.j1","wb");
+ jptr.fputc(strlen(infile));
+ jptr.fwrite(infile, 1, strlen(infile));
+ if (!jptr.isOpen()) fner("Unable to open journal file manip_.j1");
+ jptr.close();
+}
+
+unsigned char mjl_buff[80];
+
+void mjl_key(int c) {
+ int s;
+ if (in_recover) return;
+ if (c==0) return;
+ s = strlen((char*)mjl_buff);
+ mjl_buff[s] = c;
+ mjl_buff[s+1] = 0;
+ if (s>40) mjl_flush();
+}
+
+void mjl_flush() {
+ if (in_recover) return;
+ if (strlen((char*)mjl_buff)<7) return;
+ GLEFileIO fptr;
+ fptr.open("manip_.j1","ab");
+ if (!fptr.isOpen()) fner("Unable to append to journal file manip_.j1");
+ fptr.fwrite(mjl_buff, 1, strlen((char*)mjl_buff));
+ fptr.close();
+ mjl_buff[0] = 0;
+}
+
diff --git a/src/manip/mjl.h b/src/manip/mjl.h
new file mode 100644
index 0000000..b1cb75e
--- /dev/null
+++ b/src/manip/mjl.h
@@ -0,0 +1,45 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#ifndef INC_MJL_H
+#define INC_MJL_H
+
+void mjl_flush();
+void init_logging(char *infile);
+
+#endif
diff --git a/src/manip/mscreen.h b/src/manip/mscreen.h
new file mode 100644
index 0000000..25642cc
--- /dev/null
+++ b/src/manip/mscreen.h
@@ -0,0 +1,79 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#ifndef INC_MSCREEN_H
+#define INC_MSCREEN_H
+
+void delay(int i);
+void textattr();
+bool abort_key();
+bool kbhit();
+void scr_gets(char *x);
+int clreol();
+int cputs(const char *line);
+void delline();
+int gotoxy(int x, int y);
+void insline();
+void putch(int char_val);
+int scr_manip_refresh();
+int scr_getch();
+int scr_end();
+void textbackground(int color_num);
+void textcolor(int colornum);
+int gettextinfo(struct text_info *r);
+void screen_save();
+int screen_restore();
+int w_message(char *s);
+int window(int left,int top, int right, int bottom);
+int clrscr();
+void scr_dots(int i);
+int scr_left(int i);
+int scr_right(int i);
+int scr_savexy();
+int scr_restorexy();
+int scr_norm();
+int scr_inv();
+int scr_grey();
+int scr_isblackwhite();
+void scr_menubg();
+void scr_menuval();
+void scr_menuhi();
+int vax_edt(char *s);
+void manip_scr_init(char * dummy);
+
+#endif
diff --git a/src/manip/mygraph.h b/src/manip/mygraph.h
new file mode 100644
index 0000000..b64edfd
--- /dev/null
+++ b/src/manip/mygraph.h
@@ -0,0 +1,130 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+int g_get_path(int *pathonoff);
+int g_set_font_width(double v);
+int draw_key(int nkd, double koffsetx, double koffsety, char *kpos, double khei, int knobox);
+int font_get_encoding(int ff);
+int my_char(int ff, int cc);
+int g_get_just(int *j);
+int g_set_just(int j);
+int g_curve(int32 *pcode);
+int g_devcmd(char *s);
+int d_devcmd(char *s);
+int g_get_line_join(int *jj);
+int g_get_line_cap(int *jj);
+int g_postscript(char *ss,double w,double h);
+int g_set_font(int j);
+int g_marker_def(char *name, char *subname);
+int begin_tab(int *pln, int32 *pcode, int *cp);
+int begin_graph(int *pln, int32 *pcode, int *cp);
+int begin_key(int *pln, int32 *pcode, int *cp);
+int begin_text(int *pln, int32 *pcode, int *cp, double w);
+int g_set_line_styled(double x);
+int g_text(char *s);
+int g_jtext(int just);
+int g_measure(const std::string& s, dbl *l, dbl *r, dbl *u, dbl *d);
+int g_arc(dbl r,dbl t1,dbl t2,dbl cx,dbl cy);
+int g_narc(dbl r,dbl t1,dbl t2,dbl cx,dbl cy);
+int g_arcto(dbl x1,dbl y1,dbl x2,dbl y2,dbl rrr);
+int g_beginclip(void);
+int g_bezier(dbl x1,dbl y1,dbl x2,dbl y2,dbl x3,dbl y3);
+int g_bitmap(char *bmap);
+int g_box_fill(dbl x1, dbl y1, dbl x2, dbl y2);
+int g_box_stroke(dbl x1, dbl y1, dbl x2, dbl y2);
+int g_char(int font, int cc);
+int g_circle_fill(double zr);
+int g_circle_stroke(double zr);
+int g_clear(void);
+int g_clip(void);
+int g_close(void);
+int g_closepath(void);
+int g_dbezier(dbl x1,dbl y1,dbl x2,dbl y2,dbl x3,dbl y3);
+int g_dev(double x, double y,double *xd,double *yd);
+int g_dfont(char *s);
+int g_dline(double x, double y);
+int g_dmove(double x, double y);
+int g_dojust(dbl *x1, dbl *y1, dbl *x2, dbl *y2, int jj);
+int g_dotjust(dbl *x1, dbl *y1, dbl l, dbl r, dbl u, dbl d, int jj);
+int g_endclip(void);
+int g_fill(void);
+int g_fill_ary(int nwk,double **wkx,double **wky);
+int g_flush(void);
+int g_get_bounds(dbl *x1,dbl *y1,dbl *x2,dbl *y2);
+int g_get_devsize(dbl *x,dbl *y);
+int g_get_end(dbl *x,dbl *y);
+int g_get_fill(int32 *f);
+int g_get_line_style(char *s);
+int g_get_line_styled(double *w);
+int g_get_line_width(double *w);
+int g_get_state(char *s);
+int g_get_type(char *t);
+int g_get_usersize(dbl *x,dbl *y);
+int g_get_xy(double *x,double *y);
+int g_grestore(void);
+int g_gsave(void);
+int g_init_bounds(void);
+int g_line(double zx,double zy);
+int g_line_ary(int nwk,double **wkx,double **wky);
+int g_message(char *s);
+int g_move(double zx,double zy);
+int g_rmove(double zx,double zy);
+int g_rline(double zx,double zy);
+int g_newpath(void);
+int g_open(dbl width,dbl height);
+int g_rdev(double x, double y,double *xd,double *yd);
+int g_reverse(void);
+int g_rotate(double ar);
+int g_rundev(double x, double y,double *xd,double *yd);
+int g_scale(double sx,double sy);
+int g_update_bounds(double x,double y);
+int g_set_color(int32 l);
+int g_set_end(dbl x,dbl y);
+int g_set_line_cap(int i);
+int g_set_line_join(int i);
+int g_set_line_miterlimit(double d);
+int g_set_line_style(const char *s);
+int g_set_line_width(double w);
+int g_set_matrix(double (*newmat)[3][3]);
+int g_set_path(int onoff);
+int g_set_state(char *s);
+int g_set_xy(double x, double y);
+int g_source(char *s);
+int g_stroke(void);
+int g_translate(double ztx,double zty);
+int g_undev(double ux,double uy, double *x,double *y);
diff --git a/src/manip/nofnkeys.h b/src/manip/nofnkeys.h
new file mode 100644
index 0000000..644285e
--- /dev/null
+++ b/src/manip/nofnkeys.h
@@ -0,0 +1,47 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#define KEY_UP 999
+#define KEY_DOWN 999
+#define KEY_LEFT 999
+#define KEY_RIGHT 999
+#define KEY_F0 999
+#define KEY_PPAGE 999
+#define KEY_NPAGE 999
+#define KEY_BREAK 999
+#define KEY_F(n) 999
diff --git a/src/manip/polish.cpp b/src/manip/polish.cpp
new file mode 100644
index 0000000..2d1698b
--- /dev/null
+++ b/src/manip/polish.cpp
@@ -0,0 +1,414 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+char *un_quote();
+const char *ns[3] = {"Nothing","Number","String"};
+extern int gle_debug;
+
+#include "all.h"
+
+void token_norm(void);
+
+#define tok(n) tk[n]
+#define abort goto fatal_err
+
+/*---------------------------------------------------------------------------*/
+/* bin = 10..29, binstr = 30..49, fn= 60...139, userfn=200..nnn */
+
+#define stack_bin(i,p) stack_op(pcode,plen,stk,stkp,&nstk,i-10+(last_typ*20),p+curpri)
+#define stack_fn(i) stack_op(pcode,plen,stk,stkp,&nstk,i,10+curpri)
+#define dbg if ((gle_debug & 4)>0)
+
+/*---------------------------------------------------------------------------*/
+/* Input is token array, and pointer to current point, output is pcode */
+
+/* typedef struct op_key (*OPKEY)[100]; */
+/* typedef char (*(*TOKENS)[500]); */
+
+int zpolish(TOKENS tk,int *ntok,int *curtok,char *pcode,int *plen,int *rtype);
+
+void polish(char *expr,char *pcode,int *plen,int *rtype) {
+static char *tk[500];
+static char tkbuff[500];
+static int ntk,ct;
+const char *space_str=" ";
+ static char buff[50];
+ static int start_token;
+ double xxx;
+ int idx,ret,np,*plist,saveplen,term_bracket;
+ int curpri=0;
+ int i,v,p,savelen,isa_string,not_string,last_typ;
+ int nstk=0,stk[50],stkp[50]; /* stack for operators */
+ int unary=1; /* binary or unary operation expected */
+ int ln; /* length of current token */
+ char *cts; /* current token */
+ /* last_typ, 1=number,2=string */
+
+ *plen = 0;
+ if (tk[400]==NULL) for (i=0;i<500;i++) tk[i] = (char*)space_str;
+ isa_string = false;
+ not_string = false;
+ if (*rtype==1) not_string = true;
+ /* if (*rtype==2) isa_string = true; */
+ *plen = *plen*4; /* change into byte count */
+ if (*rtype>0) term_bracket = true;
+ last_typ = *rtype;
+ saveplen = *plen;
+
+ add_i(pcode,plen,1); /* expression follows */
+ savelen = *plen; /* Used to set acutal length at end */
+ add_i(pcode,plen,0); /* Length of expression */
+ dbg gprint("====Start of expression {%s} \n",expr);
+ if (strlen(expr)==0) {gprint("Zero length expression\n"); return;}
+ if (!start_token) {
+ ntk = 0; ct=1;
+ token_norm();
+ token(expr,tk,&ntk,tkbuff);
+ token_space();
+ }
+ for (;;) {
+ cts = tok(ct);
+ dbg gprint("First word token=%d via (1=unary %d) cts {%s} %d \n "
+ ,ct,unary,cts,(int)strlen(cts));
+ ln = strlen(cts);
+ switch (unary) {
+ case 1: /* a unary operator, or function, or number or variable */
+ if (ln==1 && (*cts=='E')) goto notnumber;
+ if (ln==1 && (*cts=='-')) goto notnumber;
+ if (gle_isnumber(cts)) {
+evalagain: dbg gprint("Found number {%s}\n",cts);
+ if (manip_lastchar(cts,'E')) {
+ strcpy(buff,cts);
+ strcat(buff,tok(++ct));
+ if (*tok(ct)=='-' || *tok(ct)=='+') {
+ strcat(buff,tok(++ct));
+ }
+ tok(ct) = buff;
+ cts = tok(ct);
+ goto evalagain;
+ }
+ xxx = atof(cts);
+ add_f(pcode,plen,xxx);
+ if (last_typ==2) gprint("Expecting string {%s} \n",cts);
+ last_typ = 1;
+ unary=2; break;
+ }
+notnumber: /* NOT a number, Is it a built in function */
+ /* int idx,ret,np,*plist; */
+ find_un(cts,&idx,&ret,&np,&plist); /* 1,2 = +,- */
+ if (idx>63) {
+ dbg gprint("Found built in function \n");
+ if (*tok(++ct)!='(') {
+ gprint("Expecting left bracket after functsion name");
+ abort;
+ }
+ {
+ char fcode[400];
+ int flen,vtype,nparam=0;
+ if (*tok(ct+1)!=')') {
+ while (*tok(ct)!=')') {
+ nparam++;
+ vtype = *(plist+nparam-1);
+ flen = 0;
+ (ct)++;
+ start_token = true;
+ polish((char*)"xx",fcode,&flen,&vtype);
+ start_token = false;
+ flen = flen * 4;
+ if (nparam>np) {gprint("Too many parameters got=%d want=%d \n",nparam,np);abort;}
+ if (vtype==0) abort;
+ add_pcode(pcode,plen,fcode,&flen);
+ }
+ } else {
+ ct++;
+ }
+ }
+ if (last_typ==(3-ret)) {
+ gprint("Function of wrong type Expecting {%s} \n",ns[ret]);
+ abort;
+ }
+ last_typ = ret;
+ add_fn(pcode,plen,idx);
+ unary = 2; break;
+ } else if (idx>0) {
+ stack_fn(idx);
+ unary=1; break;
+ }
+
+ /* Is it a user-defined function, identical code too above. */
+ sub_find(cts,&idx,&ret,&np,&plist); /* 1,2 = +,- */
+ if (idx>0) {
+ dbg gprint("Found user function \n");
+ if (*tok(++ct)!='(') {
+ gprint("Expecting left bracket after function name");
+ abort;
+ }
+ {
+ char fcode[400];
+ int flen,vtype,nparam=0;
+ if (*tok(ct+1)!=')') {
+ while (*tok(ct)!=')') {
+ ct++;
+ nparam++;
+ vtype = *(plist+nparam-1);
+ flen = 0;
+ start_token = true;
+ polish((char*)"xx",fcode,&flen,&vtype);
+ start_token = false;
+ flen = flen * 4;
+ if (nparam>np) {gprint("Too many U parameters got=%d want=%d \n",nparam,np);abort;}
+ if (vtype==0) abort;
+ add_pcode(pcode,plen,fcode,&flen);
+ }
+ } else {
+ ct++;
+ }
+ }
+ if (last_typ==(3-ret)) {
+ gprint("Function of wrong type Expecting {%s} \n",ns[ret]);
+ abort;
+ }
+ if (ret>0 && ret<3) last_typ = ret;
+ add_fn(pcode,plen,idx+200);
+ unary = 2; break;
+ } else if (idx>0) {
+ stack_fn(idx);
+ unary=1; break;
+ }
+
+
+ /* Is it a 'known' variable */
+ var_find(cts,&v,&ret);
+ if (v>=0) {
+ dbg gprint("Found variable %d \n",v);
+ if (last_typ==(3-ret)) {
+ gprint("Expecting {%s} \n",ns[last_typ]);
+ abort;
+ }
+ last_typ=ret;
+ if (ret==2) add_strvar(pcode,plen,v);
+ else add_var(pcode,plen,v);
+ unary=2; break;
+ }
+ /* Is it a atring */
+ if (*cts=='"') {
+ dbg gprint("Found string \n");
+ if (last_typ==1) {
+ gprint("Expecting number {%s} \n",cts);
+ abort;
+ }
+ last_typ = 2;
+ add_string(pcode,plen,un_quote(cts)); /* remove quotes */
+ unary = 2; break;
+ }
+ if (*cts=='(') { curpri = curpri + 100; break; }
+ if (*cts==')') {
+ if (curpri>0) {
+ curpri = curpri - 100;
+ unary = 2; break;
+ }
+ gprint("Too many right brackets found in exp \n");
+
+ }
+ /* must be unquoted string, unless a binary operator
+ was found, in which case it is an undelcared variable */
+ if (not_string) {
+ dbg gprint("Found un-initialized variable {%s} /n",cts);
+ var_add(cts,&v,&ret);
+ last_typ=ret;
+ add_var(pcode,plen,v) ;
+ unary=2;
+ break;
+ }
+ last_typ = 2;
+ dbg printf("Unquoted string (%s) \n",cts);
+ add_string(pcode,plen,un_quote(cts)); /* remove quotes */
+ isa_string = true;
+ unary = 2; break;
+ isa_string = true;
+ add_string(pcode,plen,cts);
+ unary = 2; /* Expecting end of expression next !! */
+ break;
+ case 2: /* a binary operator, or space, or end of line */
+ if (ct>ntk || *cts==' ' || *cts==',' ) {
+ goto end_expression;
+ }
+ if (*cts==')' && curpri==0) {
+ goto end_expression;
+ }
+/* MIGHT (gives error with a$ = b$+c$) */
+ if (isa_string) {
+ gprint("Expression contained unquoted string\n");
+ abort;
+ }
+
+ not_string = true;
+ /* Binary operators, +,-,*,/,^,<,>,<=,>=,.and.,.or. */
+ switch (*cts) {
+ case '+' : v = 1; p=2; break;
+ case '-' : v = 2; p=2; break;
+ case '*' : v = 3; p=3; break;
+ case '/' : v = 4; p=3; break;
+ case '^' : v = 5; p=4; break;
+ case '=' : v = 6; p=1; break;
+ case '<' : v = 7; p=1;
+ if (*tok(ct+1)=='=') {v=8;++ct;} break;
+ case '>' : v = 9;p=1;
+ if (*tok(ct+1)=='=') {v=10;++ct;} break;
+ case '.' : p=1;
+ if (strcmp(cts,".AND.")) {v=11;} break;
+ if (strcmp(cts,".OR.")) {v=12;} break;
+ default : v = 0 ; break;
+ }
+ if (v>0) {
+ if (last_typ<1 || last_typ > 3) last_typ = 1;
+ stack_bin(v,p);
+ dbg gprint("Found binary operator \n");
+ unary=1; break;
+ }
+ if (*cts==')') {
+ if (curpri>0) {
+ curpri = curpri - 100;
+ unary = 2; break;
+ }
+ if (term_bracket!=true) {
+ gprint("Too many right brackets, expecting binary operator \n");
+ abort;
+ }
+ goto end_expression;
+ }
+ }
+ if (++ct>ntk) { goto end_expression; }
+/* gprint("Next token is {%s} \n",tok(ct)); */
+ }
+end_expression:
+ if (*tok(ct)==' ') (ct)++;
+ dbg gprint("Got expression , curtok=%d {%s} \n",ct,tok(ct));
+ *rtype = last_typ;
+ dbg gprint("Found END OF EXPRESSION \n");
+ if (!start_token) if (curpri!=0) {gprint((char*)"Missing right brackets");}
+ /* Pop everything off the stack */
+ for (i=nstk;i>0;i--) {
+ dbg gprint("Adding left over operators I = %d op=%d \n",i,stk[i]);
+ add_i(pcode,plen,stk[i]);
+ }
+ * ((int32 *) (pcode+savelen)) = (*plen - savelen)/4-1; /* Set length of expression */
+ *plen = *plen/4; /* change back to int count */
+return;
+fatal_err:
+ gprint("Aborting expression parsing. \n");
+ *plen = saveplen;
+ *rtype = 0;
+}
+
+/*------------------------------------------------------------------*/
+/* append fcode to pcode */
+
+void add_pcode(char *pcode,int *plen,char *fcode,int *flen) {
+ char *p;
+ p = pcode + *plen;
+ memcpy(p,fcode,*flen);
+ *plen = *plen + *flen;
+}
+
+void add_i(char *pcode,int *plen,int32 i) {
+ int32 *p;
+ p = (int32 *) (pcode + *plen);
+ *p = i;
+ *plen += 4;
+}
+
+void add_f(char *pcode,int *plen,double f) {
+ union { double d ; int32 l[2]; short s[4]; } both;
+ both.d = f;
+ add_i(pcode,plen,2);
+ add_i(pcode,plen,both.l[0]);
+ add_i(pcode,plen,both.l[1]);
+}
+
+void add_var(char *pcode,int *plen,int i) {
+ add_i(pcode,plen,3);
+ add_i(pcode,plen,i);
+}
+
+void add_strvar(char *pcode,int *plen,int i) {
+ add_i(pcode,plen,4);
+ add_i(pcode,plen,i);
+}
+
+void add_fn(char *pcode, int *plen, int i) {
+ add_i(pcode,plen,i);
+ dbg gprint(" add Function %d \n",i);
+}
+
+void add_string(char *pcode, int *plen, char *s) {
+ char *p;
+ int sl;
+ dbg gprint("adding string {%s} \n",s);
+ add_i(pcode,plen,5);
+ sl = strlen(s)+1;
+ p = pcode + *plen;
+ sl = ((sl + 3) & 0xfffc);
+ strncpy(p,s,sl);
+ *plen = *plen + sl;
+}
+
+void stack_op(char *pcode, int *plen, int stk[], int stkp[], int *nstk, int i, int p) {
+ dbg gprint("Stack oper %d priority %d \n",i,p);
+ while (p<=stkp[*nstk] &&(*nstk)>0) {
+ dbg gprint("ADDING oper stack = %d oper=%d \n",*nstk,stk[(*nstk)]);
+ add_i(pcode,plen,stk[(*nstk)--]);
+ }
+ stk[++(*nstk)] = i;
+ stkp[*nstk] = p;
+}
+
+bool gle_isnumber(char *s) {
+ while (*s!='\0') {
+ if (isdigit(*s) || *s=='.' || *s=='E' ) s++;
+ else return false;
+ }
+ return true;
+}
+
+char manip_lastchar(const char *s, char c) {
+ while ((*s)!='\0') {s++;}
+ return *(--s)==c;
+}
+
+
diff --git a/src/manip/sub.cpp b/src/manip/sub.cpp
new file mode 100644
index 0000000..fcc541e
--- /dev/null
+++ b/src/manip/sub.cpp
@@ -0,0 +1,159 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#include "all.h"
+
+int var_alloc_local(void);
+int var_free_local(void);
+extern int32 *(*gpcode)[]; /* gpcode is a pointer to an array of poiter to int32 */
+extern int32 (*gplen)[]; /* gpcode is a pointer to an array of int32 */
+extern int ngpcode;
+extern int gle_debug;
+#define dbg if ((gle_debug & 128)>0)
+
+struct sub_st {char name[40];int typ; int np
+ ; int ptyp[20]; char *pname[20]; int start; int end ; } ;
+struct sub_st *sb[100];
+int nsb;
+double return_value=0;
+char return_string[80];
+int return_type;
+
+
+void sub_param(int idx,char *s) {
+ int vi,vt;
+ mystrcpy(&( sb[idx]->pname[ ++(sb[idx]->np) ] ) ,s);
+ /* should be set ptype according to num/string variable */
+ var_add(s,&vi,&vt);
+ sb[idx]->ptyp[ (sb[idx]->np) ] = vt;
+}
+
+int sub_find(char *s,int *idx,int *zret, int *np, int **plist) {
+ int i;
+ for (i=1;i<=nsb;i++) {
+ if (strcmp(sb[i]->name,s)==0) {
+ *idx = i;
+ *zret = sb[i]->typ;
+ *np = sb[i]->np;
+ *plist = &(sb[i]->ptyp[1]);
+ return i;
+ }
+ }
+ return 0;
+}
+
+void sub_clear() {
+ int i,j;
+ for (i=1;i<=nsb;i++) {
+ if (sb[i] != NULL) {
+ for (j=1; j<= sb[i]->np; j++) {
+ if (sb[i]->pname[j] != NULL) myfree(sb[i]->pname[j]);
+ }
+ }
+ myfree(sb[i]);
+ sb[i] = NULL;
+ }
+ nsb = 0;
+}
+
+int sub_def(char *s) {
+ int i;
+ for (i=1;i<=nsb;i++) {
+ if (strcmp(sb[i]->name,s)==0) {
+ strcpy(sb[i]->name,"^");
+ }
+ }
+ if (i>nsb) {
+ nsb = i;
+ sb[i] = (sub_st*)myallocz(sizeof(*sb[0]));
+ strcpy(sb[i]->name,s);
+ }
+ sb[i]->np = 0;
+ return i;
+}
+
+void sub_set_startend(int idx, int ss, int ee) {
+ if (idx<0 || idx>1000) {
+ gprint("idx is out of range \n");
+ return;
+ }
+ sb[idx]->start = ss;
+ sb[idx]->end = ee;
+}
+
+void sub_get_startend(int idx, int *ss, int *ee) {
+ *ss = sb[idx]->start;
+ *ee = sb[idx]->end;
+}
+
+/* Run a user defined function */
+void sub_call(int idx,double *pval,char **pstr,int *npm) {
+ int i;
+ double save_return_value;
+
+ save_return_value = return_value;
+ var_alloc_local();
+ dbg for (i=0;i<4;i++) gprint("STACK IN SUBCALL, (%d) = %f \n",i,*(pval+i));
+ if (*npm<sb[idx]->np) gprint("parameters in sub_call, not enough **\n");
+ for (i = sb[idx]->np;i>=1;i--) {
+ if (sb[idx]->ptyp[i] == 1) {
+ var_set(200 + i-1,*(pval+(*npm)--));
+ } else {
+ var_setstr(200 + i-1,*(pstr+(*npm)--));
+ }
+ }
+
+ dbg gprint("SUB CALL ----- startline %d end %d \n",
+ sb[idx]->start,sb[idx]->end);
+
+ for (i = sb[idx]->start + 1;i< (sb[idx]->end);i++) {
+ dbg gprint("=Call do pcode, line %d ",i);
+ // do_pcode(&i,(*gpcode)[i],(*gplen)[i],&endp);
+ dbg gprint("AFTER DO_PCODE I = %d \n",i);
+ }
+ dbg gprint("FINISHED CALL ------\n");
+ *(pval + ++(*npm)) = return_value;
+ return_value = save_return_value;
+ var_free_local();
+ dbg for (i=0;i<=*npm;i++) gprint("STACK IN SUBCALL, (%d) = %f \n",i,*(pval+i));
+}
+
+void sub_set_return(double d) {
+ return_value = d;
+}
+
diff --git a/src/manip/test.dat b/src/manip/test.dat
new file mode 100644
index 0000000..c78a495
--- /dev/null
+++ b/src/manip/test.dat
@@ -0,0 +1,43 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+0 2 6
+1 10 16
+2 3 6
+3 6 3
+4 5 4
+5 3 7
diff --git a/src/manip/token.cpp b/src/manip/token.cpp
new file mode 100644
index 0000000..dd4be2f
--- /dev/null
+++ b/src/manip/token.cpp
@@ -0,0 +1,184 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#include "all.h"
+
+void token_init(void);
+void subscript(void);
+
+#define true (!false)
+#define false 0
+#define add_tok(pp1,n) \
+ (*ntok)++; \
+ tok[*ntok] = outbuff; \
+ for (tj=0;tj<n;tj++) { \
+ if (in_quote) *(outbuff+tj) = *(pp1+tj);\
+ else *(outbuff+tj) = toupper(*(pp1+tj)); \
+ if (*(outbuff+tj) == '"') { \
+ if (in_quote==true) in_quote = false; \
+ else in_quote = true; \
+ } \
+ } \
+ in_quote = false; \
+ outbuff = outbuff + (n); \
+ *(outbuff++) = '\0';
+static char term_table1[256];
+static char term_table2[256];
+static char term_table3[256];
+static char *term_table;
+static int table_loaded;
+char *find_non_term();
+char *find_non_space();
+char *find_term();
+int in_quote;
+int spmode;
+/* typedef char (*(*TOKENS)[500]); */
+
+/*--------------------------------------------------------------------------*/
+
+void token_norm() {
+ if (table_loaded==false) token_init();
+ term_table = &term_table1[0];
+ spmode = false;
+}
+
+void token_space() {
+ if (table_loaded==false) token_init();
+ term_table = &term_table2[0];
+ spmode = true;
+}
+
+void token_equal() {
+ if (table_loaded==false) token_init();
+ term_table = &term_table3[0];
+ spmode = false;
+}
+
+void token_init() {
+ int i;
+ term_table = &term_table1[0];
+ table_loaded = true;
+ {const char *termset=" ,-+*)(<>=/!^@";
+ for (i=0;i<=255;i++) {
+ if (strchr(termset,i)!=NULL) {
+ term_table1[i]=true;
+ }
+ }}
+ {const char *termset=" !";
+ for (i=0;i<=255;i++) {
+ if (strchr(termset,i)!=NULL) {
+ term_table2[i]=true;
+ }
+ }
+ }
+ {const char *termset=" ,+*)(<>=/!^@";
+ for (i=0;i<=255;i++) {
+ if (strchr(termset,i)!=NULL) {
+ term_table3[i]=true;
+ }
+ }
+ }
+}
+
+void token(char *lin,char *tok[],int *ntok,char *outbuff) {
+int jj;
+int tj;
+char *cp;
+char *p2 = NULL;
+ *ntok = 0;
+ in_quote = false;
+ if (table_loaded==false) token_init();
+ cp = lin;
+ cp = find_non_space(cp);
+ while (*cp!=0) {
+ if (*cp==' ' || *cp==' ') {
+ *cp = ' ';
+ cp = find_non_space(cp);
+ }
+ if (*cp == '!') goto endofline;
+ p2 = find_term(cp);
+ jj = p2-cp+1;
+ if (jj==0) goto endofline;
+ add_tok(cp,jj);
+ cp = p2 + 1 ;
+ if (*ntok>280) subscript();
+ }
+endofline:;
+ if (*ntok>0) {
+ if ( (*tok[*ntok])=='\n' ) (*ntok)--;
+ if (strcmp(tok[*ntok]," ")==0) (*ntok)--;
+ if (*ntok>0) p2 = tok[*ntok] + strlen(tok[*ntok]) - 1;
+ if (*p2==10) *p2 = 0;
+ }
+}
+
+char *find_non_space(char *cp) {
+ for ( ; *cp!=0 ; cp++ ) {
+ if (*cp!=' ' && *cp!=' ') break;
+ }
+ return cp;
+}
+
+char *find_term(char *cp) {
+ char *start;
+ start = cp;
+/* if (*cp=='"') {
+ cp++;
+ for (; *cp!=0 ; cp++ ) {
+ if (*cp=='"') break;
+ }
+ return cp;
+ } */
+ for (; *cp!=0 ; cp++ ) {
+ if (*cp == '"') {
+ cp++;
+ for (; *cp!=0 ; cp++ ) {
+ if (*cp=='"') break;
+ }
+ }
+ if (term_table[(int)*cp]==true) break;
+ }
+ if (cp>start) return cp-1;
+ if (*cp==' ' || *cp==' ') return cp-1;
+ if (*cp==0) return cp-1;
+ return cp;
+}
+
+void subscript() {
+ gprint("Subscript out of range in tokenizer (use shorter lines) \n");
+}
diff --git a/src/manip/unix_extra.cpp b/src/manip/unix_extra.cpp
new file mode 100644
index 0000000..4a19cce
--- /dev/null
+++ b/src/manip/unix_extra.cpp
@@ -0,0 +1,123 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#include "all.h"
+#include "unix_extra.h"
+
+int trimcr(char *s);
+
+int32 coreleft(void) {
+ return 4000000l;
+}
+
+int trim_file(char *s) {
+ char *t;
+ t = strchr(s,']');
+ if (t!=NULL) memcpy(s,t+1,strlen(t));
+ t = strchr(s,';');
+ if (s!=NULL) *t = 0;
+ return 0;
+}
+
+char *getsymbol(char *sym) {
+ static char mystr[200];
+ const char *s;
+ s = getenv(sym);
+ if (s==NULL) s = "";
+ strcpy(mystr,s);
+ return mystr;
+}
+
+FILE *wilddir;
+
+/*struct ffblk {char *ff_name;};*/
+
+int findfirst(char *wild, struct ffblk *ffblk, int zz) {
+ static char buff[200];
+ int op=0;
+ #ifdef aix /* AIX with xlc != POSIX */
+ union wait *status;
+ int p;
+ #else
+ int status;
+ pid_t p;
+ #endif
+
+
+ unlink("gledir.tmp");
+ p = fork();
+ if (p==-1) {perror("Unable to fork ls command \n"); return true;}
+ if (p==0) {
+ strcpy(buff,"ls ");
+ strcat(buff,wild);
+ strcat(buff,">gledir.tmp");
+ execlp("sh","sh","-c", buff, NULL);
+ exit(1);
+ }
+ #ifdef aix
+ waitpid(p,status,op);
+ #else
+ waitpid(p,&status,op);
+ #endif
+ wilddir = fopen("gledir.tmp","r");
+ if (wilddir==NULL) {printf("Fork ls failed \n"); return true;}
+ if (feof(wilddir)) { fclose(wilddir); return true;}
+ if (fgets(buff,100,wilddir) != 0) {
+ trimcr(buff);
+ ffblk->ff_name = buff;
+ }
+ return false;
+}
+
+int findnext(struct ffblk *ffblk) {
+ static char buff[200];
+ if (feof(wilddir)) { fclose(wilddir); return true;}
+ if (fgets(buff,100,wilddir) != 0) {
+ trimcr(buff);
+ ffblk->ff_name = buff;
+ }
+ return false;
+}
+
+int trimcr(char *s)
+{
+ s = strchr(s,'\n');
+ if (s!=NULL) *s = 0;
+ return 0;
+}
+
diff --git a/src/manip/unix_extra.h b/src/manip/unix_extra.h
new file mode 100644
index 0000000..99d8e90
--- /dev/null
+++ b/src/manip/unix_extra.h
@@ -0,0 +1,47 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+//
+// unix_extra.h
+//
+#ifndef INCLUDE_UNIX_EXTRA
+#define INCLUDE_UNIX_EXTRA
+#include "ffblk_def.h"
+int findfirst(char *wild, struct ffblk *ffblk, int zz);
+int findnext(struct ffblk *ffblk);
+#endif
diff --git a/src/manip/unixinkey.cpp b/src/manip/unixinkey.cpp
new file mode 100644
index 0000000..d81f3af
--- /dev/null
+++ b/src/manip/unixinkey.cpp
@@ -0,0 +1,366 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#include "all.h"
+#include "edt.h"
+
+#ifdef NOKEYPAD
+#include "nofnkeys.h"
+#endif
+
+int do_fnkey(void);
+int do_gold(void);
+int escape_seq(void);
+int fner(char *s);
+int scr_getch(void);
+const char *function_bar()
+{
+ static int ab;
+ if (ab==0) ab=1;
+ ab = 3-ab;
+ if (ab==1) {
+ #ifndef LINUXFKEY /* a.r.: only F1-F10 on AT keyboards */
+ return "F11-Help F12-Save F13-Load F14-Saveas F9-Graphmenu F10-Drawit ^x=Exit";
+ #else
+ return "F1-Help F2-Save F3-Load F4-Saveas F9-Graphmenu F10-Drawit ^x=Exit";
+ #endif
+ } else {
+ return "^F 1 =Help, ^F 2 = Save, ^F 3 = Load, ^F 9 Graphmenu ^F 0 Drawit";
+ }
+}
+
+struct escape_struct {const char *str; int val;};
+
+struct escape_struct gold[] = {
+ { "v", epaste },
+ { "R", esearch },
+ { "S", eundeleol },
+ { NULL, 0 } };
+
+#ifndef LINUXFKEY
+struct escape_struct eseq[] = {
+ { "4~", eselect },
+ { "1~", esearch },
+ { "2~", epaste },
+ { "3~", ecut },
+ { "4~", eselect },
+ { "5~", epageup },
+ { "6~", epagedown },
+ { "A", eup },
+ { "B", edown },
+ { "C", eright },
+ { "D", eleft },
+ { "20~", egraphmenu },
+ { "21~", edrawit },
+ { "23~", ehelp },
+ { "24~", esave },
+ { "25~", eload },
+ { "26~", esaveas },
+ { "P", egold },
+ { "Q", ehelp },
+ { "R", efindnext },
+ { "S", edeleol },
+ { "n", eselect },
+ { "v", ecut },
+ { "l", edelright },
+ { NULL, 0} };
+#else /* a.r.: X11 escape sequences for F-keys were added */
+struct escape_struct eseq[] = {
+ { "2~", epaste },
+ { "5~", epageup },
+ { "6~", epagedown },
+ { "A", eup },
+ { "B", edown },
+ { "C", eright },
+ { "D", eleft },
+ { "20~", egraphmenu },
+ { "21~", edrawit },
+ { "23~", ehelp },
+ { "11~", ehelp },
+ { "24~", esave },
+ { "12~", esave },
+ { "25~", eload },
+ { "13~", eload },
+ { "26~", esaveas },
+ { "14~", esaveas },
+#ifndef MANIP
+ { "15~", eshowerror },
+#endif
+ { "P", egold },
+ { "Q", ehelp },
+ { "R", efindnext },
+ { "S", edeleol },
+ { "n", eselect },
+ { "v", ecut },
+ { "l", edelright },
+ { "3~", edelright },
+ { "1~", ebol },
+ { "4~", eeol },
+ { NULL, 0 } };
+#endif
+int gold_fn[] = {
+ edrawit,ehelp,esave,eload,esaveas,eshowerror,0,0,0,egraphmenu,edrawit
+};
+struct keymatch {int m; int val;};
+/* Normal key and ^ commands commands */
+#ifndef LINUXFKEY /* a.r. */
+struct keymatch kmatch2[] = {
+ { 13, ereturn },
+ { 3, equit },
+ { 4, eword },
+ { 5, eedt },
+ { 6, efast },
+ { 7, edrawit },
+ { 8, edelete },
+ { 18, eshowerror },
+ { 8, ehelp },
+ { 20, etrace },
+ { 12, efindnext },
+ { 21, eundelline },
+ { 24, eescape },
+ { 25, edelline },
+ { 26, eescape },
+ { 27, eescape },
+ { 127, edelete },
+ { 0,0 }
+};
+#else
+struct keymatch kmatch2[] = {
+ { 13, ereturn },
+ { 3, equit },
+/* 23, eword, eword does not exist! */
+ { 1, ebol }, /* a.r. bol and eol like EMACS and Joe */
+ { 5, eeol },
+ { 4, edelright, /* delete the char at the cursor-position */
+ { 6, efast },
+ { 7, edrawit },
+ { 8, edelete },
+ { 18, eshowerror },
+ { 8, ehelp },
+ { 20, etrace },
+ { 12, efindnext },
+ { 21, eundelline },
+ { 24, eescape },
+ { 25, edelline },
+ { 26, eescape },
+ { 27, eescape },
+ { 127, edelete },
+ { 0,0 }
+};
+#endif
+struct keymatch kmatchx[] = {
+ { KEY_DOWN, edown },
+ { KEY_UP, eup },
+ { KEY_F0+4, edeleol },
+ { KEY_LEFT, eleft },
+ { KEY_RIGHT, eright },
+ { KEY_NPAGE, epagedown },
+ { KEY_PPAGE, epageup },
+ { 0,0 }
+};
+/* Control K commands */
+#ifndef LINUXFKEY /* a.r. */
+struct keymatch kmatch3[] = {
+ { 'b', eselect },
+ { 'v', emove },
+ { 'k', emark },
+ { 'c', ecopy },
+ { 'y', ecut },
+ { 'u', epaste },
+ { 'p', epaste },
+ { 'r', eblockread },
+ { 'w', eblockwrite },
+ { 'm', egraphmenu },
+ { 'l', eload },
+ { 'd', edrawit },
+ { 's', esave },
+ { 'x', equit },
+ { 0,0 }
+};
+#else
+struct keymatch kmatch3[] = {
+ 'b', eselect,
+ 'v', emove,
+ 'k', emark,
+ 'c', ecopy,
+ 'y', ecut,
+ 'u', epaste,
+ 'p', epaste,
+ 'r', eblockread,
+ 'w', eblockwrite,
+ 'm', egraphmenu,
+ 'l', eload,
+ 'd', edrawit,
+ 's', esave,
+ 'x', equit,
+ 'f', esearch, /* like Joe's Own Editor */
+ 0,0
+};
+#endif
+
+/* Control Q commands */
+struct keymatch kmatch4[] = {
+ { 'f', esearch },
+ { 'c', eendoffile },
+ { 'r', etopoffile },
+ { 0,0 }
+};
+extern int noscreenio;
+int tt_inkey()
+{
+ int i;
+ if (noscreenio) return getc(stdin);
+ else {
+ i = getch();
+ /* printw("{%d} ",i); */
+ return i;
+ }
+}
+
+int text_inkey()
+{
+ int cc,i,c2;
+
+ scr_refresh();
+
+loop1: cc = tt_inkey();
+ c2 = cc;
+ if (c2==6) return do_fnkey();
+ if (c2==KEY_F(1)) return do_gold();
+ if (cc>KEY_BREAK) {
+ for (i=0;kmatchx[i].m!=0;i++)
+ if (kmatchx[i].m==c2) return kmatchx[i].val;
+ }
+ switch(c2) {
+ default:
+ for (i=0;kmatch2[i].m!=0;i++)
+ if (kmatch2[i].m==c2) return kmatch2[i].val;
+ break;
+ case 27:
+ c2 = tt_inkey(); /* throw away next char (unless escape) */
+ if (c2==27) return eescape;
+ case -101:
+ case -113:
+ c2 = escape_seq();
+ if (c2==egold) return do_gold();
+ return c2;
+ break;
+ case 17:
+ fner("^Q F=Find string, R=Top of file");
+ cc = tt_inkey();
+ c2 = (cc & 0xff);
+ if (c2<32) c2 = c2 + 'a' - 1;
+ c2 = tolower(c2);
+ for (i=0;kmatch4[i].m!=0;i++)
+ if (kmatch4[i].m==c2) return kmatch4[i].val;
+ fner("Unrecognized Quick movement command");
+ goto loop1;
+ case 11:
+ fner("^K B=begin block, P=Paste, (use KP6 for Cut), K=End block");
+ cc = tt_inkey();
+ c2 = (cc & 0xff);
+ if (c2<32) c2 = c2 + 'a' - 1;
+ c2 = tolower(c2);
+ for (i=0;kmatch3[i].m!=0;i++)
+ if (kmatch3[i].m==c2) return kmatch3[i].val;
+ fner("Unrecognized block command");
+ goto loop1;
+ }
+ return c2;
+}
+int escape_seq(void)
+{
+ int cc,i;
+ unsigned char esq[10];
+ unsigned char *s;
+
+ s = &esq[0];
+ *s++ = cc = tt_inkey();
+ while (cc<65) *s++ = cc = tt_inkey();
+ *s++ = 0;
+ for (i=0;eseq[i].str!=NULL;i++)
+ if (strcmp(eseq[i].str,(char*)esq)==0) break;
+ if (eseq[i].str!=NULL)
+ return eseq[i].val;
+ else
+ return 0;
+
+}
+int escape_seq_gold()
+{
+ int cc,i;
+ unsigned char esq[10];
+ unsigned char *s;
+
+ s = &esq[0];
+ *s++ = cc = tt_inkey();
+ while (cc<65) *s++ = cc = tt_inkey();
+ *s++ = 0;
+ for (i=0;gold[i].str!=NULL;i++)
+ if (strcmp(gold[i].str,(char*)esq)==0) break;
+ if (gold[i].str!=NULL)
+ return gold[i].val;
+ else
+ return 0;
+
+}
+int do_fnkey(void)
+{
+ int c2;
+ fner("1=Help 2=Save 3=Load 4=Saveas 9=Graph_menu 0=Drawit");
+ c2 = tt_inkey();
+ if (isdigit(c2)) {
+ return gold_fn[c2-'0'];
+ }
+ return -1;
+}
+int do_gold(void)
+{
+ int c2;
+ c2 = tt_inkey();
+ if (c2==KEY_F(4)) return eundeleol;
+ if (c2==27) {
+ tt_inkey();
+ return escape_seq_gold();
+ } else if (isdigit(c2)) {
+ return gold_fn[c2-'0'];
+ }
+ return -1;
+}
+
+
diff --git a/src/manip/unixscr.cpp b/src/manip/unixscr.cpp
new file mode 100644
index 0000000..b169763
--- /dev/null
+++ b/src/manip/unixscr.cpp
@@ -0,0 +1,325 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#include "all.h"
+
+#include <signal.h>
+
+#include "vaxconio.h"
+#define dbg if (1==1)
+
+#define NORET (int) 0
+extern int noscreenio;
+
+void delay(int i) {
+ sleep(i);
+}
+
+int vx_top=1,vx_bot=24;
+
+void textattr() {
+}
+
+bool abort_key() {
+ return false;
+}
+
+bool kbhit() {
+ return false;
+}
+
+void scr_gets(char *x) {
+ getstr(x);
+}
+
+int clreol() {
+ if (noscreenio) return NORET;
+ clrtoeol();
+ return 0;
+}
+
+int cputs(const char *line) {
+ int x;
+ int y;
+ if (noscreenio) return NORET;
+ getyx(stdscr,y,x);
+ mvaddstr(y,x,line);
+ return 0;
+}
+
+void delline() {
+ int x;
+ int y;
+ getyx(stdscr,y,x);
+ move(22,1);
+ clrtobot();
+ move(y,1);
+ deleteln();
+ move(y,x);
+}
+
+int gotoxy(int x, int y) {
+ if (noscreenio) return NORET;
+ if (y==25) y=24;
+ if (y<1) y=1;
+ move(y+vx_top-2,x);
+ return 0;
+}
+
+void insline() {
+ int x;
+ int y;
+ getyx(stdscr,y,x);
+ move(y,x);
+ insertln();
+ move(y,x);
+ move(22,1);
+ clrtobot();
+ move(y,x);
+
+}
+
+void putch(int char_val) {
+ int x;
+ int y;
+ getyx(stdscr,y,x);
+ mvaddch(y,x,char_val);
+}
+
+void scr_refresh() {
+ if (!noscreenio) refresh();
+}
+
+int scr_getch() {
+ if (noscreenio)
+ return getc(stdin);
+ else
+ return getch();
+}
+
+void ctrlhandler() {
+ fprintf(stderr,"ctrlhandler!\n");
+ exit(1);
+}
+
+void trap() {
+ echo();
+ nl();
+ nocbreak();
+ endwin();
+ exit(1);
+}
+
+void manip_scr_init(char * dummy) {
+ static int doneinit = false;
+#if (defined ultrix || defined aix)
+ signal(SIGINT,trap);
+#endif
+ if (doneinit) { printf("init called twice \n"); exit(0);}
+ doneinit = true;
+ initscr();
+ scrollok(stdscr,true);
+#ifdef __UNIX__
+ if (signal(SIGINT, SIG_IGN) == SIG_ERR) {
+ fprintf(stderr,"Unable to disable ctrl-c\n");
+ }
+ noecho();
+ nonl();
+ cbreak();
+ clear();
+// The AIX R6000 goes looney if you set keypad to be true
+#ifndef NOKEYPAD
+ keypad(stdscr,TRUE);
+#endif
+#endif
+}
+
+int scr_end(void) {
+ if (noscreenio) return NORET;
+ echo();
+ nl();
+ nocbreak();
+ endwin();
+ return 0;
+}
+
+void textbackground(int color_num) {
+}
+
+void textcolor(int colornum) {
+}
+
+int gettextinfo(struct text_info *r) {
+ int x;
+ int y;
+ if (noscreenio) return NORET;
+ getyx(stdscr,y,x);
+ r->curx = x;
+ r->cury = y;
+ r->wintop = vx_top;
+ return 0;
+}
+
+void screen_save() {
+}
+
+int screen_restore() {
+ if (noscreenio) return NORET;
+ scr_norm();
+ clrscr();
+ gotoxy(1,1);
+ cputs("\n");
+ return 0;
+}
+
+int wyerr;
+
+int w_message(char *s) {
+ wyerr++;
+ if (noscreenio) return NORET;
+ scr_savexy();
+ gotoxy(1,wyerr);
+ clreol();
+ cputs(s);
+ scr_restorexy();
+ return 0;
+}
+
+int window(int left,int top, int right, int bottom) {
+ if (left==1 && top==1 && bottom==25) {
+ if (noscreenio) return NORET;
+ }
+ vx_top = top;
+ vx_bot = bottom;
+ wyerr = 0;
+ return 0;
+}
+
+int clrscr() {
+ if (noscreenio) return NORET;
+ if (vx_top==1 && vx_bot==25) {
+ clearok(stdscr,TRUE);
+ clear();
+ refresh();
+ clearok(stdscr,FALSE);
+ return NORET;
+ }
+ clear();
+ return 0;
+}
+
+void scr_dots(int i) {
+}
+
+int scr_left(int i) {
+ int y,x;
+ if (i<=0) return NORET;
+ getyx(stdscr,y,x);
+ move(y,x-i);
+ return 0;
+}
+
+int scr_right(int i) {
+ int y,x;
+ if (i<=0) return NORET;
+ getyx(stdscr,y,x);
+ move(y,x+i);
+ return 0;
+}
+
+int vx_topsave,vx_botsave;
+int savex,savey;
+
+int scr_savexy() {
+ if (noscreenio) return NORET;
+ getyx(stdscr,savey,savex);
+ vx_topsave = vx_top;
+ vx_botsave = vx_bot;
+ return 0;
+}
+
+int scr_restorexy() {
+ if (noscreenio) return NORET;
+ move(savey,savex);
+ vx_top = vx_topsave;
+ vx_bot = vx_botsave;
+ return 0;
+}
+
+int scr_norm() {
+#ifndef NOATTRIB
+ attrset(A_NORMAL);
+#endif
+ return 0;
+}
+
+int scr_inv() {
+#ifndef NOATTRIB
+ attrset(A_BOLD);
+#endif
+ return 0;
+}
+
+int scr_grey() {
+#ifndef NOATTRIB
+ attrset(A_REVERSE);
+#endif
+ return 0;
+}
+
+int scr_isblackwhite() {
+ return true;
+}
+
+void scr_menubg() {
+ scr_norm();
+}
+
+void scr_menuval() {
+ scr_inv();
+}
+
+void scr_menuhi() {
+ scr_grey();
+}
+
+int vax_edt(char *s) {
+ return -1;
+}
+
+
diff --git a/src/manip/var.cpp b/src/manip/var.cpp
new file mode 100644
index 0000000..5733a31
--- /dev/null
+++ b/src/manip/var.cpp
@@ -0,0 +1,235 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#include "all.h"
+
+int var_local; /* 0 = global, 1 = local */
+char *var_names[100]; /* Global variables */
+int var_type[100];
+int nvar;
+char *lvar_names[100]; /* Local variables */
+int lvar_type[100];
+int nlvar;
+
+static int ndp;
+static double (*lvar_val)[100];
+static char *(*lvar_str)[100];
+static double var_val[100];
+static char *var_str[100];
+
+void var_check(int *j) {
+ if (*j<0 || *j>400) {
+ gprint("Variable index is wrong %d \n",*j);
+ *j = 1;
+ }
+ if (lvar_val == NULL && *j>=200) {
+ *j = 0;
+ gprint("No local variables assigned \n");
+ }
+}
+
+void var_alloc_local() {
+/* dp_stack[++ndp] = lvar_val;
+ dp_stackstr[ndp] = lvar_str;
+ lvar_val = (double* (*)[100])myallocz(sizeof(*lvar_val));
+ lvar_str = (char* (*)[100])myallocz(sizeof(*lvar_str)); */
+}
+
+void var_free_local() {
+ if (ndp==0) {gprint("Cannot free local as none saved \n"); return;}
+/* myfree(lvar_val);
+ myfree(lvar_str);
+ lvar_val = dp_stack[ndp];
+ lvar_str = dp_stackstr[ndp--];*/
+}
+
+void var_set(int jj, double v) {
+ var_check(&jj);
+ if (jj<200)
+ var_val[jj] = v;
+ else
+ (*lvar_val)[jj-200] = v;
+}
+
+void var_setstr(int jj, char *s) {
+ var_check(&jj);
+ if (jj<200)
+ mystrcpy(&var_str[jj],s);
+ else
+ mystrcpy(&(*lvar_str)[jj-200],s);
+}
+
+void var_getstr(int jj, char *s) {
+ var_check(&jj);
+ if (jj<200) {
+ if (var_str[jj]!=NULL) strcpy(s,var_str[jj]);
+ else {
+ strcpy(s,"");
+ gprint("String Variable not defined %d \n",jj);
+ }
+ } else {
+ if ((*lvar_str)[jj-200]!=NULL) strcpy(s,(*lvar_str)[jj-200]);
+ if ((*lvar_str)[jj-200]==NULL) gprint("ERROR, variable not defined\n");
+ }
+
+}
+
+void var_get(int jj, double *v) {
+ var_check(&jj);
+ if (jj<200)
+ *v = var_val[jj];
+ else
+ *v = (*lvar_val)[jj-200];
+}
+
+void var_nlocal(int *l) {
+ *l = nlvar;
+}
+
+void var_clear_global() {
+ nvar = 0;
+}
+
+void var_set_local() {
+ var_local = true;
+ nlvar = 0;
+}
+
+void var_set_global() {
+ var_local = false;
+}
+
+void var_clear_local() {
+ nlvar = 0;
+}
+
+/* Add a variable to the list */
+void var_findadd(const char *name,int *idx,int *type) {
+ var_find(name,idx,type);
+ if (*idx==-1) var_add(name,idx,type);
+}
+
+/* Add a variable to the list */
+void var_add(const char *name,int *idx,int *type) {
+ if (var_local==0) {
+ if (nvar>90) gprint("Too many global variables \n");
+ mystrcpy(&var_names[nvar],name);
+ *idx = nvar;
+ if (manip_lastchar(name,'$')) *type=2;
+ else *type=1;
+ var_type[nvar++] = *type;
+ } else {
+ if (nlvar>90) gprint("Too many local variables \n");
+ mystrcpy(&lvar_names[nlvar],name);
+ *idx = nlvar+200;
+ if (manip_lastchar(name,'$')) *type=2;
+ else *type=1;
+ lvar_type[nlvar++] = *type;
+ }
+}
+
+/* Find a variable in the list */
+void var_find(const char *name,int *idx,int *type) {
+ int i;
+ for (i=0;i<nlvar;i++) {
+ if (strcmp(lvar_names[i],name)==0) {
+ *idx = i+200;
+ *type = lvar_type[i];
+ return;
+ }
+ }
+ for (i=0;i<nvar;i++) {
+ if (strcmp(var_names[i],name)==0) {
+ *idx = i;
+ *type = var_type[i];
+ return;
+ }
+ }
+ *idx = -1;
+}
+
+void var_find_dn(int *idx, int *var, int *nd) {
+ int i,d;
+ *nd = 0;
+ for (i=0;i<nlvar;i++) {
+ if (strncmp(lvar_names[i],"D",1)==0) {
+ d = atoi(lvar_names[i]+1);
+ if (d>0 && d<100) {
+ ++*nd;
+ *idx++ = i+200;
+ *var++ = d;
+ }
+ }
+ }
+}
+
+void var_find_rc(int *idx, int *var, int *nd, int c) {
+ int i,d;
+ *nd = 0;
+ for (i=0;i<nlvar;i++) {
+ if (*lvar_names[i]==c) {
+ d = atoi(lvar_names[i]+1);
+ if (d>0) {
+ ++*nd;
+ *idx++ = i+200;
+ *var++ = d;
+ }
+ }
+ }
+ for (i=0;i<nvar;i++) {
+ if (*var_names[i]==c) {
+ d = atoi(var_names[i]+1);
+ if (d>0) {
+ ++*nd;
+ *idx++ = i;
+ *var++ = d;
+ }
+ }
+ }
+}
+
+bool str_var(char* s) {
+ int i;
+ i = strlen(s);
+ if (*(s+i-1)=='$') return true;
+ else return false;
+}
+
+bool valid_var(const char *s) {
+ return true;
+}
diff --git a/src/manip/varargs.cpp b/src/manip/varargs.cpp
new file mode 100644
index 0000000..312d621
--- /dev/null
+++ b/src/manip/varargs.cpp
@@ -0,0 +1,72 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+/*
+
+As varargs are so difficult to make work, I've put them
+in this module by themselvs, on a DEC5400 it was necessary
+to compile this module using the native C compiler instead of
+GCC
+
+*/
+
+void fner_do(char *output);
+void printmess_do(char *output);
+
+#include "all.h"
+
+void fner(const char* fmt,...) {
+ va_list args;
+ char string[1024];
+
+ va_start(args,fmt);
+ vsprintf(string, fmt, args);
+ va_end(args);
+ fner_do(string);
+}
+
+void printmess(const char* fmt,...) {
+ va_list args;
+ char string[1024];
+
+ va_start(args,fmt);
+ vsprintf(string, fmt, args);
+ va_end(args);
+ printmess_do(string);
+}
+
diff --git a/src/manip/vaxconio.h b/src/manip/vaxconio.h
new file mode 100644
index 0000000..1aed08f
--- /dev/null
+++ b/src/manip/vaxconio.h
@@ -0,0 +1,63 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#define YELLOW 1
+#define BLACK 0
+#define BLUE 0
+#define LIGHTGRAY 0
+#define WHITE 1
+#define MAGENTA 1
+
+
+struct text_info {
+ int normattr,winleft,wintop,winright,winbottom,curx,cury;};
+struct ffblk {char *ff_name;};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/manip/vaxinkey.cpp b/src/manip/vaxinkey.cpp
new file mode 100644
index 0000000..8838e2a
--- /dev/null
+++ b/src/manip/vaxinkey.cpp
@@ -0,0 +1,248 @@
+/************************************************************************
+ * *
+ * GLE - Graphics Layout Engine <http://www.gle-graphics.org/> *
+ * *
+ * Modified BSD License *
+ * *
+ * Copyright (C) 2009 GLE. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * *
+ * 2. Redistributions in binary form must reproduce the above *
+ * copyright notice, this list of conditions and the following *
+ * disclaimer in the documentation and/or other materials provided with *
+ * the distribution. *
+ * *
+ * 3. The name of the author may not be used to endorse or promote *
+ * products derived from this software without specific prior written *
+ * permission. *
+ * *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR *
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY *
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER *
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR *
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
+ * *
+ ************************************************************************/
+
+#include "all.h"
+#include "edt.h"
+
+int fner(char *s);
+int scr_manip_refresh(void);
+int scr_getch(void);
+
+char *function_bar() {
+ return "F11-Help F12-Save F13-Load F14-Save as F9-Graph Form F10-Drawit";
+}
+
+struct escape_struct {char *str; int val;};
+
+struct escape_struct gold[] = {
+ "v", epaste,
+ "R", esearch,
+ "S", eundeleol,
+ NULL, };
+
+struct escape_struct eseq[] = {
+ "4~", eselect,
+ "1~", esearch,
+ "2~", epaste,
+ "3~", ecut,
+ "4~", eselect,
+ "5~", epageup,
+ "6~", epagedown,
+ "A", eup,
+ "B", edown,
+ "C", eright,
+ "D", eleft,
+ "20~", egraphmenu,
+ "21~", edrawit,
+ "23~", ehelp,
+ "24~", esave,
+ "25~", eload,
+ "26~", esaveas,
+ "P", egold,
+ "Q", ehelp,
+ "R", efindnext,
+ "S", edeleol,
+ "n", eselect,
+ "v", ecut,
+ "l", edelright,
+ NULL, };
+
+int gold_fn[] = {
+ edrawit,ehelp,esave,eload,esaveas,eshowerror,0,0,0,egraphmenu,edrawit
+};
+struct keymatch {int m; int val;};
+/* Normal key and ^ commands commands */
+struct keymatch kmatch2[] = {
+ 13, ereturn,
+ 3, equit,
+ 4, eword,
+ 5, eedt,
+ 6, efast,
+ 7, edrawit,
+ 18, eshowerror,
+ 8, ehelp,
+ 20, etrace,
+ 12, efindnext,
+ 21, eundelline,
+ 25, edelline,
+ 26, eescape,
+ 27, eescape,
+ 127, edelete,
+ 0,0
+};
+/* Control K commands */
+struct keymatch kmatch3[] = {
+ 'b', eselect,
+ 'v', emove,
+ 'k', emark,
+ 'c', ecopy,
+ 'y', ecut,
+ 'u', epaste,
+ 'p', epaste,
+ 'r', eblockread,
+ 'w', eblockwrite,
+ 'm', egraphmenu,
+ 'l', eload,
+ 'd', edrawit,
+ 's', esave,
+ 'x', equit,
+ 0,0
+};
+/* Control Q commands */
+struct keymatch kmatch4[] = {
+ 'f', esearch,
+ 'c', eendoffile,
+ 'r', etopoffile,
+ 0,0
+};
+
+text_inkey()
+{
+ int cc,i,c1,c2;
+
+ scr_manip_refresh();
+
+loop1: cc = tt_inkey();
+ c2 = (cc & 0xff);
+ switch(c2) {
+ default:
+ for (i=0;kmatch2[i].m!=0;i++)
+ if (kmatch2[i].m==c2) return kmatch2[i].val;
+ break;
+ case 27:
+ c2 = tt_inkey(); /* throw away next char (unless escape) */
+ if (c2==27) return eescape;
+ case -101:
+ case -113:
+ c2 = escape_seq();
+ if (c2==egold) {
+ c2 = tt_inkey();
+ if (c2==27) {
+ tt_inkey();
+ return escape_seq_gold();
+ } else if (isdigit(c2)) {
+ return gold_fn[c2-'0'];
+ }
+ }
+ return c2;
+ break;
+ case 17:
+ fner("^Q F=Find string, R=Top of file");
+ cc = tt_inkey();
+ c2 = (cc & 0xff);
+ if (c2<32) c2 = c2 + 'a' - 1;
+ c2 = tolower(c2);
+ for (i=0;kmatch4[i].m!=0;i++)
+ if (kmatch4[i].m==c2) return kmatch4[i].val;
+ fner("Unrecognized Quick movement command");
+ goto loop1;
+ case 11:
+ fner("^K B=begin block, P=Paste, (use KP6 for Cut), K=End block");
+ cc = tt_inkey();
+ c2 = (cc & 0xff);
+ if (c2<32) c2 = c2 + 'a' - 1;
+ c2 = tolower(c2);
+ for (i=0;kmatch3[i].m!=0;i++)
+ if (kmatch3[i].m==c2) return kmatch3[i].val;
+ fner("Unrecognized block command");
+ goto loop1;
+ }
+ return c2;
+}
+escape_seq()
+{
+ int cc,i;
+ unsigned char esq[10];
+ char *s;
+
+ s = &esq[0];
+ *s++ = cc = tt_inkey();
+ while (cc<65) *s++ = cc = tt_inkey();
+ *s++ = 0;
+ for (i=0;eseq[i].str!=NULL;i++)
+ if (strcmp(eseq[i].str,esq)==0) break;
+ if (eseq[i].str!=NULL)
+ return eseq[i].val;
+ else
+ return 0;
+
+}
+escape_seq_gold()
+{
+ int cc,i;
+ unsigned char esq[10];
+ char *s;
+
+ s = &esq[0];
+ *s++ = cc = tt_inkey();
+ while (cc<65) *s++ = cc = tt_inkey();
+ *s++ = 0;
+ for (i=0;gold[i].str!=NULL;i++)
+ if (strcmp(gold[i].str,esq)==0) break;
+ if (gold[i].str!=NULL)
+ return gold[i].val;
+ else
+ return 0;
+
+}
+
+
+#include <descrip.h>
+#include <iodef.h>
+int tt_chan;
+short tt_iosb[4];
+int tt_inkey();
+key_open()
+{
+ int st;
+ static $DESCRIPTOR(tt_desc,"tt");
+ st = SYS$ASSIGN(&tt_desc,&tt_chan,0,0);
+}
+int tt_inkey()
+{
+ int read_mask,st;
+ unsigned char inbuff[9];
+ static int key_isopen;
+
+ if (!key_isopen) {key_open(); key_isopen=true;}
+ read_mask = IO$_READLBLK | IO$M_NOFILTR | IO$M_NOECHO;
+ st = SYS$QIOW(0,tt_chan,read_mask,tt_iosb,0,0,inbuff,1,0,0,0,0);
+ if ((st & 1) != 1) LIB$SIGNAL(st);
+ if ((tt_iosb[0] & 1) != 1) LIB$SIGNAL(tt_iosb[0]);
+ return inbuff[0];
+}
diff --git a/src/samples/Makefile.gcc b/src/samples/Makefile.gcc
new file mode 100644
index 0000000..3c6a509
--- /dev/null
+++ b/src/samples/Makefile.gcc
@@ -0,0 +1,53 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+#makefile for building sample.eps
+
+include ../../config.gcc
+
+all:
+ -$(PROJECT_BINDIR)/gle -d eps sample.gle
+ -$(PROJECT_BINDIR)/gle -d eps IncludeTest.gle
+ -$(PROJECT_BINDIR)/gle -d eps MathTest.gle
+ -$(PROJECT_BINDIR)/gle -d eps Graph.gle
+ -$(PROJECT_BINDIR)/gle -d eps sine.gle
+ -$(PROJECT_BINDIR)/gle -d eps hubble.gle
+ -$(PROJECT_BINDIR)/gle -d eps CommentTest.gle
+
+clean:
+ rm sample.eps IncludeTest.eps MathTest.eps Graph.eps sine.eps hubble.eps CommentTest.eps
diff --git a/src/samples/Makefile.os2 b/src/samples/Makefile.os2
new file mode 100644
index 0000000..3b7afa4
--- /dev/null
+++ b/src/samples/Makefile.os2
@@ -0,0 +1,53 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+#makefile for building sample.eps
+
+include ../../config.os2
+
+all:
+ -$(PROJECT_BINDIR)/gle.exe sample.gle
+ -$(PROJECT_BINDIR)/gle.exe IncludeTest.gle
+ -$(PROJECT_BINDIR)/gle.exe MathTest.gle
+ -$(PROJECT_BINDIR)/gle.exe Graph.gle
+ -$(PROJECT_BINDIR)/gle.exe sine.gle
+ -$(PROJECT_BINDIR)/gle.exe hubble.gle
+ -$(PROJECT_BINDIR)/gle.exe CommentTest.gle
+
+clean:
+ -rm.exe sample.eps IncludeTest.eps MathTest.eps Graph.eps sine.eps hubble.eps CommentTest.eps
diff --git a/src/samples/Makefile.vc b/src/samples/Makefile.vc
new file mode 100644
index 0000000..e78901b
--- /dev/null
+++ b/src/samples/Makefile.vc
@@ -0,0 +1,57 @@
+########################################################################
+# #
+# GLE - Graphics Layout Engine <http://www.gle-graphics.org/> #
+# #
+# Modified BSD License #
+# #
+# Copyright (C) 2009 GLE. #
+# #
+# Redistribution and use in source and binary forms, with or without #
+# modification, are permitted provided that the following conditions #
+# are met: #
+# #
+# 1. Redistributions of source code must retain the above copyright #
+# notice, this list of conditions and the following disclaimer. #
+# #
+# 2. Redistributions in binary form must reproduce the above #
+# copyright notice, this list of conditions and the following #
+# disclaimer in the documentation and/or other materials provided with #
+# the distribution. #
+# #
+# 3. The name of the author may not be used to endorse or promote #
+# products derived from this software without specific prior written #
+# permission. #
+# #
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR #
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY #
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS #
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER #
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR #
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN #
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #
+# #
+########################################################################
+
+#makefile for building sample.eps
+#
+
+RUN_GLE = $(PROJECT_BINDIR)\bin\gle
+!include ..\..\config.vc
+
+all:
+ set GLE_TOP=$(PROJECT_BINDIR)
+ -$(RUN_GLE) sample.gle
+ -$(RUN_GLE) IncludeTest.gle
+ -$(RUN_GLE) MathTest.gle
+ -$(RUN_GLE) Graph.gle
+ -$(RUN_GLE) sine.gle
+ -$(RUN_GLE) hubble.gle
+ -$(RUN_GLE) CommentTest.gle
+ -$(RUN_GLE) logo.gle
+
+clean:
+ -del sample.eps IncludeTest.eps MathTest.eps Graph.eps sine.eps hubble.eps CommentTest.eps logo.eps
diff --git a/src/samples/qgle_keyboard.gle b/src/samples/qgle_keyboard.gle
new file mode 100644
index 0000000..f1d2bef
--- /dev/null
+++ b/src/samples/qgle_keyboard.gle
@@ -0,0 +1,131 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+! QGLE/AutoCAD Keyboard layout
+
+! CONFIGURATION:
+keys$ = "QGLE" ! AutoCAD or QGLE
+tbh = 2 ! The height of the text box in centimetres
+boxsize = 1.9 ! The width of a single function key
+boxheight = 2 ! The height of a single function key
+lb = 1 ! The left border
+rb = 0.5 ! The right border
+bb = 0.5 ! The bottom border
+tb = 0 ! The top border
+mb = 1.025 ! The border between f4 & f5
+
+! Everything else is automatic, so nothing
+! needs to be changed from here on (unless you want
+! to define keys for a different program.
+
+! Set up the QGLE keys
+f1$ = "ABOUT"
+f2$ = ""
+f3$ = "OSNAP"
+f4$ = ""
+f5$ = ""
+f6$ = "COORD"
+f7$ = "GRID"
+f8$ = "ORTHO"
+f9$ = "SNAP"
+f10$ = "POLAR"
+f11$ = ""
+f12$ = ""
+
+! Page size (4.5 by 26.35):
+size bb+boxheight+tbh+tb lb+3*4*boxsize+2*mb+rb
+
+! If we're doing an AutoCAD layout, then
+! change the keys that differ
+if keys$ = "AutoCAD" then
+ f1$ = "HELP"
+ f2$ = "TEXTSCR"
+ f4$ = "TABLET"
+ f5$ = "ISOPLANE"
+ f11$ = "OTRACK"
+end if
+
+! Create a box for the key text
+sub fblock f$
+ box boxsize tbh
+ rmove boxsize/2 boxheight/2
+ write f$
+ rmove boxsize/2 -boxheight/2
+end sub
+
+! Rotate the page so that it fits
+! on a portrait A4 sheet
+amove pagewidth()/2 pagewidth()/2
+begin rotate 90
+ ! Draw the outside box
+ amove 0 0
+ rline pageheight() 0
+ rline 0 pagewidth()
+ rline -pageheight() 0
+ rline 0 -pagewidth()
+ ! Now back at 0 0
+
+ set just cc
+
+ ! Draw the F1-F4 boxes
+ amove lb bb
+ box boxsize*4 boxheight
+ rmove 0 boxheight
+ fblock f1$
+ fblock f2$
+ fblock f3$
+ fblock f4$
+
+ ! Draw the F5-F8 boxes
+ rmove mb -boxheight
+ box boxsize*4 boxheight
+ rmove 0 boxheight
+ fblock f5$
+ fblock f6$
+ fblock f7$
+ fblock f8$
+
+ ! Draw the F9-F12 boxes
+ rmove mb -boxheight
+ box boxsize*4 boxheight
+ rmove 0 boxheight
+ fblock f9$
+ fblock f10$
+ fblock f11$
+ fblock f12$
+end rotate
diff --git a/src/samples/sample.gle b/src/samples/sample.gle
new file mode 100644
index 0000000..f3bbafd
--- /dev/null
+++ b/src/samples/sample.gle
@@ -0,0 +1,60 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! !
+! GLE - Graphics Layout Engine <http://www.gle-graphics.org/> !
+! !
+! Modified BSD License !
+! !
+! Copyright (C) 2009 GLE. !
+! !
+! Redistribution and use in source and binary forms, with or without !
+! modification, are permitted provided that the following conditions !
+! are met: !
+! !
+! 1. Redistributions of source code must retain the above copyright !
+! notice, this list of conditions and the following disclaimer. !
+! !
+! 2. Redistributions in binary form must reproduce the above !
+! copyright notice, this list of conditions and the following !
+! disclaimer in the documentation and/or other materials provided with !
+! the distribution. !
+! !
+! 3. The name of the author may not be used to endorse or promote !
+! products derived from this software without specific prior written !
+! permission. !
+! !
+! THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR !
+! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED !
+! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE !
+! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY !
+! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL !
+! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE !
+! GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS !
+! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER !
+! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR !
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN !
+! IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. !
+! !
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+size 10 10 ! size of drawing area is 10 cm x 10 cm
+
+amove 0 0
+aline 10 10
+
+amove 1 1 ! move to position 1,1 in cm
+box 3 2 fill red ! draw a box that is 3cm by 2cm and fill it red
+ ! note: the outline of the box is the current
+ ! drawing color which is black by default
+set color blue ! sets drawing color to blue
+amove 4 4 ! moves to 4,4 in cm
+box 2 2 fill blue ! draws a box that is 2x2 cm filled in blue
+ ! and outlined in blue
+set color black ! set color back to black
+set just cc ! set text justification to center center
+amove 5 7 ! move to (5,7)cm and draw some text
+set hei 1
+
+set font texcmr
+
+text Hello World.
+
diff --git a/src/samples/sample_compare.eps b/src/samples/sample_compare.eps
new file mode 100644
index 0000000..6ea1e82
--- /dev/null
+++ b/src/samples/sample_compare.eps
@@ -0,0 +1,106 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% %
+%% GLE - Graphics Layout Engine <http://www.gle-graphics.org/> %
+%% %
+%% Modified BSD License %
+%% %
+%% Copyright (C) 2009 GLE. %
+%% %
+%% Redistribution and use in source and binary forms, with or without %
+%% modification, are permitted provided that the following conditions %
+%% are met: %
+%% %
+%% 1. Redistributions of source code must retain the above copyright %
+%% notice, this list of conditions and the following disclaimer. %
+%% %
+%% 2. Redistributions in binary form must reproduce the above %
+%% copyright notice, this list of conditions and the following %
+%% disclaimer in the documentation and/or other materials provided with %
+%% the distribution. %
+%% %
+%% 3. The name of the author may not be used to endorse or promote %
+%% products derived from this software without specific prior written %
+%% permission. %
+%% %
+%% THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR %
+%% IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED %
+%% WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE %
+%% ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY %
+%% DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL %
+%% DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE %
+%% GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS %
+%% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER %
+%% IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR %
+%% OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN %
+%% IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. %
+%% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% %%
+%% Created By: GLE v4.0.11 %%
+%% www.gle-graphics.org %%
+%% %%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%CreationDate: Sat Dec 31 11:58:40 2005
+%%SourceFile: sample.gle
+%%BoundingBox: 0 0 285 285
+%%EndComments
+%%EndProlog
+gsave
+
+/f {findfont exch scalefont setfont} bind def
+/s {show} bind def
+/ps {true charpath} bind def
+/l {lineto} bind def
+/m {newpath moveto} bind def
+matrix currentmatrix /originmat exch def
+/umatrix {originmat matrix concatmatrix setmatrix} def
+
+ [28.3465 0 0 28.3465 0 0] umatrix
+ [28.3465 0 0 28.3465 1 1] umatrix
+ [] 0 setdash
+0.02 setlinewidth
+0 0 0 setrgbcolor
+0 0 m
+1 1 m
+ newpath 1 1 moveto 4 1 l 4 3 l 1 3 l closepath
+1 0 0 setrgbcolor
+fill
+0 0 0 setrgbcolor
+newpath
+1 1 m
+ newpath 1 1 moveto 4 1 l 4 3 l 1 3 l closepath
+stroke
+1 1 m
+1 1 m
+0 0 1 setrgbcolor
+4 4 m
+ newpath 4 4 moveto 6 4 l 6 6 l 4 6 l closepath
+0 0 1 setrgbcolor
+fill
+0 0 1 setrgbcolor
+newpath
+4 4 m
+ newpath 4 4 moveto 6 4 l 6 6 l 4 6 l closepath
+stroke
+4 4 m
+4 4 m
+0 0 0 setrgbcolor
+5 7 m
+2.425 6.666 m
+2.425 6.666 m
+ 1.000000 /Times-Roman f (H) s 3.147 6.666 m
+(e) s 3.591 6.666 m
+(l) s 3.869 6.666 m
+(l) s 4.147 6.666 m
+(o) s 4.897 6.666 m
+(W) s 5.761 6.666 m
+(o) s 6.261 6.666 m
+(r) s 6.594 6.666 m
+(l) s 6.872 6.666 m
+(d) s 7.372 6.666 m
+(\56) s 5 7 m
+showpage
+grestore
+%%Trailer
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/gle-graphics.git
More information about the debian-science-commits
mailing list